ZGlmZiAtLWdpdCBhL0JSQU5DSEVTIGIvQlJBTkNIRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwZTM5ZAotLS0gL2Rldi9udWxsCisrKyBiL0JSQU5DSEVTCkBAIC0wLDAgKzEsNjEgQEAKKworR2l2ZW4gdGhhdCBsb2c0aiAxLjMgaXMgbm90IGxpa2VseSB0byBiZSByZWxlYXNlZCBiZWZvcmUgYSBmZXcgbW9udGhzLAorSSBoYXZlIGNyZWF0ZWQgYSBicmFuY2ggY2FsbGVkIHYxXzItYnJhbmNoIGluIG91ciBDVlMgcmVwb3NpdG9yeS4gVGhlCiticmFuY2ggd2FzIGNyZWF0ZWQgYnkgaXNzdWluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKK2N2cyAtZCA6ZXh0OmNla2lAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzIHJ0YWcgLWIgLXIgdjFfMmZpbmFsIHYxXzItYnJhbmNoIGpha2FydGEtbG9nNGoKKworVXNpbmcgdGhlIDEuMiBicmFuY2gsIHdlIGNhbiBpbmNvcnBvcmF0ZSBwYXRjaGVzIHRvIGxvZzRqIHZlcnNpb24gMS4yCit3aGlsZSB2ZXJzaW9uIDEuMyBjb250aW51ZXMgdG8gYmUgZGV2ZWxvcGVkIG9uIHRoZSBtYWluIHRydW5rLiBGb3IKK2V4YW1wbGUsIHdlIGNhbiBvZmZpY2lhbGx5IHJlbGVhc2UgTG9nRmFjdG9yNSAoaW5jbHVkaW5nCitkb2N1bWVudGF0aW9uKSBhbHJlYWR5IGluIGxvZzRqIDEuMi4xLgorCitUaGUgY29tbWFuZCB0byBhY2Nlc3MgdGhlIHYxXzItYnJhbmNoIGlzOgorCitjdnMgLWQgWFlaIGNoZWNrb3V0IC1yIHYxXzItYnJhbmNoIGpha2FydGEtbG9nNGoKKword2hlcmUgWFlaIGlzIHRoZSByZW1vdGUgcmVwb3NpdG9yeSBuYW1lLCB0aGF0IGlzCisiOmV4dDpjZWtpQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2cyIgZm9yIG1lLgorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGlzc3VlIGZvbGxvd2luZyB1cGRhdGUgY29tbWFuZCBmcm9tIHdpdGhpbiBhbnkKK2V4aXN0aW5nIHdvcmsgY29weS4KKworICBjdnMgdXBkYXRlIC1yIHYxXzItYnJhbmNoCisKK1dvcmtpbmcgd2l0aCBicmFuY2hlcyBpcyBub3QgY29tcGxldGVseSB0cml2aWFsIGFuZCByZXF1aXJlcyBhIGxpdHRsZQorY29vcmRpbmF0aW9uIGJldHdlZW4gY29tbWl0dGVycywgaW4gcGFydGljdWxhciBpbiByZWxhdGlvbiB3aXRoIGJyYW5jaAorbWVyZ2Ugb3BlcmF0aW9ucy4gSW4gb3JkZXIgdG8gYXZvaWQgbXVsdGlwbGUgbWVyZ2UgY29uZmxpY3RzLCBlYWNoCit0aW1lIHdlIG1lcmdlIGZyb20gdGhlIDEuMiBicmFuY2ggdG8gdGhlIG1haW4gdHJ1bmssIHdlIHNob3VsZCB0YWcgdGhlCittZXJnZWQgdmVyc2lvbiBvbiB0aGUgMS4yIGJyYW5jaC4gU3Vic2VxdWVudCBtZXJnZXMgc2hvdWxkIHVzZSB0aGUgdGFnCityZWZlcnJpbmcgdG8gdGhlIGxhdGVzdCBtZXJnZWQgdmVyc2lvbiBvZiB0aGUgYnJhbmNoLiBBbHNvIGRvIG5vdAorZm9yZ2V0IHRvIHB1YmxpY2x5IGFubm91bmNlIGEgbWVyZ2Ugb3BlcmF0aW9uLgorCitJIGFtIHN1Z2dlc3RpbmcgdGhhdCAoMS4yIC0+IHRydW5rKSBtZXJnZSBvcGVyYXRpb25zIGJlIGRvbmUgaW4gYQorY29uY2VydGVkIG1hbm5lci4gQmVmb3JlIGRvaW5nIGEgbWVyZ2UgeW91IHRlbGwgZXZlcnlvbmUgdGhhdCB5b3UgYXJlCitnb2luZyB0byBkbyBhIG1lcmdlLCB5b3UgZXhlY3V0ZSB0aGUgbWVyZ2Ugb3BlcmF0aW9uLCBhbmQgdGhlbiB0YWcgdGhlCittZXJnZWQgdmVyc2lvbiBvbiB0aGUgMS4yIGJyYW5jaCwgZm9yIGV4YW1wbGUgdl8xXzJfLW1lcmdlZC1idWc2NjYKKworVGhlICpuZXh0KiBtZXJnZSBvcGVyYXRpb24gd291bGQgYmUgcGVyZm9ybWVkIGFzCisKKyAgY3ZzIHVwZGF0ZSAtaiB2XzFfMl8tbWVyZ2VkLWJ1ZzY2NiAtaiB2MV8yLWJyYW5jaAorCitmcm9tIHdpdGhpbiBhIHdvcmtpbmcgY29weSBvZiB0aGUgKnRydW5rKi4gVGhpcyBtZXJnZSBvcGVyYXRpb24gd291bGQKK29idmlvdXNseSBhbHNvIG5lZWQgdG8gYmUgdGFnZ2VkLiBBY2NvcmRpbmcgdG8gdGhlIENWUyBtYW51YWwsIHRoaXMKK3Byb2NlZHVyZSBlbGltaW5hdGVzIHRoZSBzaWRlIGVmZmVjdHMgb2YgbWVyZ2luZyBhbHJlYWR5IG1lcmdlZAorY2hhbmdlcy4KKworQnVnIGZpeGVzIHNob3VsZCBhbmQgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMsIHNob3VsZCBiZSBtYWRlIHRvIHRoZQorMS4yIGJyYW5jaCwgbm90IHRoZSB0cnVuay4gSSdsbCB0YWtlIGNhcmUgb2YgbWVyZ2luZyB0aGUgY2hhbmdlcyB0bwordGhlIG1haW4gdHJ1bmsuCisKK0lmIHRoaXMgc291bmRzIGxpa2UgbWFtYm8ganVtYm8sIEkgdXJnZSB5b3UgdG8gY29uc3VsdCB0aGUgQ1ZTCitkb2N1bWVudGF0aW9uIGFuZCBleHBlcmltZW50IHdpdGggYnJhbmNoZXMgYmVmb3JlIGhpdHRpbmcgdGhlIGxvZzRqCityZXBvc2l0b3J5LiBCcmFuY2hlcyBhcmUgbm90IHRoYXQgY29tcGxpY2F0ZWQgcmVhbGx5IGFsdGhvdWdoIHRoZXkKK3JlcXVpcmUgc2xpZ2h0bHkgbW9yZSBkaXNjaXBsaW5lIG9uIHRoZSBwYXJ0IG9mIGNvbW1pdHRlcnMuIERvIG5vdAoraGVzaXRhdGUgdG8gc2hvdXQgaWYgeW91IG5lZWQgaGVscC4KKworSWYgeW91IGhhdmUgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUgZm9yIHdvcmtpbmcgd2l0aCBicmFuY2hlcyBwbGVhc2UgbGV0Cit1cyBrbm93LgorCistLQorQ2VraQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCmluZGV4IGNmNGZkMjAuLjY0NjNkZjIgMTAwNjQ0Ci0tLSBhL0lOU1RBTEwKKysrIGIvSU5TVEFMTApAQCAtMTEsNyArMTEsOCBAQAogICAgdmVyc2lvbiBudW1iZXIsIHVuZGVyIFBBVEhfT0ZfWU9VUl9DSE9JQ0UuIFdlIHdpbGwgcmVmZXIgdG8gdGhlCiAgICBkaXJlY3RvcnkgUEFUSF9PRl9ZT1VSX0NIT0lDRS9qYWthcnRhLWxvZzRqLVZFUlNJT04vIGFzICRMT0c0Sl9IT01FLy4KIAotMykgQWRkICRMT0c0Sl9IT01FL2Rpc3QvbGliL2xvZzRqLTEuMi5qYXIgdG8geW91ciBDTEFTU1BBVEguCiszKSBBc3N1bWluZyB5b3UgYXJlIHVzaW5nIGxvZzRqIHZlcnNpb24gMS4yLCBhZGQKKyAgICRMT0c0Sl9IT01FL2Rpc3QvbGliL2xvZzRqLTEuMi5qYXIgdG8geW91ciBDTEFTU1BBVEgsCiAgICAKIDQpIFlvdSBjYW4gbm93IHRlc3QgeW91ciBpbnN0YWxsYXRpb24gYnkgZmlyc3QgY29tcGlsaW5nIHRoZSBmb2xsb3dpbmcKICAgIHNpbXBsZSBwcm9ncmFtLgpAQCAtNDcsNyArNDgsNyBAQAogPT09PT09PT09CiAKIFRoZSBsb2c0aiBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBvbmUgamFyIGZpbGU6IGxvZzRqLVZFUlNJT04uamFyCi11bmRlciB0aGUgJExPRzRKX0hPTUUvZGlzdC9saWIvIGRpcmVjdG9yeS4KK3VuZGVyIHRoZSBMT0c0Sl9IT01FL2Rpc3QvbGliLyBkaXJlY3RvcnkuCiAKIFRoaXMgamFyIGZpbGUgY29udGFpbnMgYWxsIHRoZSBjbGFzcyBmaWxlcyBvZiB0aGUgbG9nNGogcHJvamVjdCwKIGV4Y2VwdCB0ZXN0IGNhc2VzIGFuZCBjbGFzc2VzIGZyb20gdGhlICJleGFtcGxlcyIgYW5kCkBAIC01Nyw4ICs1OCw3IEBACiBsb2c0aiBkZXBlbmRlbmNpZXMKID09PT09PT09PT09PT09PT09PQogICAgCi1UaGUgbG9nNGogZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggcHJlLWNvbXBpbGVkIGNsYXNzZXMuIExvZzRqIGlzIGJhc2VkCi1vbiBKREsgMS4xIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHJlcXVpcmVtZW50czoKK0xvZzRqIGlzIGJhc2VkIG9uIEpESyAxLjEgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzOgogCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIFBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai54bWwgCkBAIC04Miw3ICs4Miw4IEBACiAKICAgICBUaGUgU01UUEFwcGVuZGVyIHJlbGllcyBvbiB0aGUgSmF2YU1haWwgQVBJLiBJdCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aAogICAgIEphdmFNYWlsIEFQSSB2ZXJzaW9uIDEuMi4gVGhlIEphdmFNYWlsIEFQSSByZXF1aXJlcyB0aGUKLSAgICBKYXZhQmVhbnMgQWN0aXZhdGlvbiBGcmFtZXdvcmsgcGFja2FnZS4gWW91IGNhbiBkb3dubG9hZCB0aGUgSmF2YU1haWwgQVBJIGF0OgorICAgIEphdmFCZWFucyBBY3RpdmF0aW9uIEZyYW1ld29yayBwYWNrYWdlLiBZb3UgY2FuIGRvd25sb2FkIHRoZQorICAgIEphdmFNYWlsIEFQSSBhdDoKIAogCWh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwvCiAKQEAgLTEwNCw4ICsxMDUsOCBAQAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBMb2c0aiB1c2VzIHRoZSBKVW5pdCBmcmFtZXdvcmsgdmVyc2lvbiAzLjcgZm9yIGludGVybmFsIHVuaXQKLSAgICB0ZXN0aW5nLiAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBhbGwgbG9nNGogc291cmNlIGNvZGUsIHRoZW4geW91Ci0gICAgd2lsbCBuZWVkIEpVbml0LiBKVW5pdCBpcyBhdmFpbGFibGUgZnJvbToKKyAgICB0ZXN0aW5nLiAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgaW4gdGhlIHRlc3RzLworICAgIGRpcmVjdG9yeSwgdGhlbiB5b3Ugd2lsbCBuZWVkIEpVbml0LiBKVW5pdCBpcyBhdmFpbGFibGUgZnJvbToKIAogICAgICAgICAgIGh0dHA6Ly93d3cuanVuaXQub3JnCiAKQEAgLTEyMSw3ICsxMjIsNyBAQAogYnVpbGQucHJvcGVydGllcy5zYW1wbGUgZmlsZS4KIAogSW4gY2FzZSBvZiBwcm9ibGVtcyBzZW5kIGFuIGUtbWFpbCBub3RlIHRvCi1sb2c0ai11c2VyQGpha2FydGEuYXBhY2hlLm9yZy4gIFBsZWFzZSBkbyBub3QgZGlyZWN0bHkgZS1tYWlsIGFueSBvZgotdGhlIGxvZzRqIGRldmVsb3BlcnMuIFRoZSBhbnN3ZXIgdG8geW91ciBxdWVzdGlvbiBtaWdodCBiZSB1c2VmdWwgdG8KLW90aGVyIHVzZXJzLiBNb3Jlb3ZlciwgdGhlcmUgYXJlIG1hbnkga25vd2xlZGdlYWJsZSB1c2VycyBvbiB0aGUKLWxvZzRqLXVzZXIgbWFpbGluZyBsaXN0cyB3aG8gY2FuIHF1aWNrbHkgYW5zd2VyIHlvdXIgcXVlc3Rpb25zLgorbG9nNGotdXNlckBqYWthcnRhLmFwYWNoZS5vcmcuICBQbGVhc2UgZG8gbm90IGRpcmVjdGx5IGUtbWFpbCBhbnkKK2xvZzRqIGRldmVsb3BlcnMuIFRoZSBhbnN3ZXIgdG8geW91ciBxdWVzdGlvbiBtaWdodCBiZSB1c2VmdWwgdG8gb3RoZXIKK3VzZXJzLiBNb3Jlb3ZlciwgdGhlcmUgYXJlIG1hbnkga25vd2xlZGdlYWJsZSB1c2VycyBvbiB0aGUgbG9nNGotdXNlcgorbWFpbGluZyBsaXN0cyB3aG8gY2FuIHF1aWNrbHkgYW5zd2VyIHlvdXIgcXVlc3Rpb25zLgpkaWZmIC0tZ2l0IGEvYmluL1N0YXJ0TG9nRmFjdG9yNS5zaCBiL2Jpbi9TdGFydExvZ0ZhY3RvcjUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlMjk2YwotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9TdGFydExvZ0ZhY3RvcjUuc2gKQEAgLTAsMCArMSwyMCBAQAorIyEgL2Jpbi9zaAorCitpZiBbIC16ICIkTE9HNEpfSE9NRSIgXSA7IHRoZW4KKyAgICBMT0c0Sl9IT01FPS4uCitmaQorCitKQVZBQ01EPSRKQVZBX0hPTUUvYmluL2phdmEKKworIyBhZGQgaW4gdGhlIGRlcGVuZGVuY3kgLmphciBmaWxlcworRElSTElCUz0ke0xPRzRKX0hPTUV9L2Rpc3QvbGliLyouamFyCitmb3IgaSBpbiAke0RJUkxJQlN9CitkbworCisgICAgaWYgWyAiJGkiICE9ICIke0RJUkxJQlN9IiBdIDsgdGhlbgorICAgICAgICBMT0NBTENMQVNTUEFUSD0kTE9DQUxDTEFTU1BBVEg6IiRpIgorICAgIGZpCisKK2RvbmUKKworJEpBVkFDTUQgLWNsYXNzcGF0aCAiJExPQ0FMQ0xBU1NQQVRIIiBvcmcuYXBhY2hlLmxvZzRqLmxmNS5TdGFydExvZ0ZhY3RvcjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW4vU3RhcnRMb2dGYWN0b3I1Q29uc29sZS5iYXQgYi9iaW4vU3RhcnRMb2dGYWN0b3I1Q29uc29sZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjYjFlYQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9TdGFydExvZ0ZhY3RvcjVDb25zb2xlLmJhdApAQCAtMCwwICsxLDI0IEBACitAZWNobyBvZmYKKworaWYgbm90ICIlTE9HNEpfSE9NRSUiID09ICIiIGdvdG8gc3RhcnQKKworU0VUIExPRzRKX0hPTUU9Li4KKworOnN0YXJ0CisKK2phdmEgLWZ1bGx2ZXJzaW9uCitzZXQgTE9DQUxDTEFTU1BBVEg9Citmb3IgJSVpIGluICgiJUxPRzRKX0hPTUUlXGRpc3RcbGliXCouamFyIikgZG8gY2FsbCAiJUxPRzRKX0hPTUUlXGJpblxsY3AuYmF0IiAiJSVpIgorCitlY2hvIHVzaW5nIGNsYXNzcGF0aCAlTE9DQUxDTEFTU1BBVEglCisKK2phdmEgLWNsYXNzcGF0aCAlTE9DQUxDTEFTU1BBVEglIG9yZy5hcGFjaGUubG9nNGoubGY1LlN0YXJ0TG9nRmFjdG9yNQorCitleGl0CisKKzp1c2FnZQorZWNobyB1c2FnZTogbGY1ICh0YXJnZXQpCisKKzplb2YKK3BhdXNlCisKZGlmZiAtLWdpdCBhL2Jpbi9sY3AuYmF0IGIvYmluL2xjcC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYyNjcxMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9sY3AuYmF0CkBAIC0wLDAgKzEsMiBAQAorc2V0IExPQ0FMQ0xBU1NQQVRIPSUxOyVMT0NBTENMQVNTUEFUSCUKKwpkaWZmIC0tZ2l0IGEvYnVpbGQucHJvcGVydGllcy5zYW1wbGUgYi9idWlsZC5wcm9wZXJ0aWVzLnNhbXBsZQppbmRleCAzMDBmMDIxLi5jNTU1NWY2IDEwMDY0NAotLS0gYS9idWlsZC5wcm9wZXJ0aWVzLnNhbXBsZQorKysgYi9idWlsZC5wcm9wZXJ0aWVzLnNhbXBsZQpAQCAtMTksNCArMTksMTYgQEAKIGpteC1leHRyYS5qYXI9L2phdmEvam14L2xpYi9qbXh0b29scy5qYXIKIAogCisjIGpha2FydGEtc2l0ZTIgbW9kdWxlIGlzIHVzZWQgdG8gdHJhbnNmb3JtIHhtbCBmaWxlcyB0byBodG1sIHVzaW5nCisjIEFuYWtpYS4gWW91IGRvIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgcHJvcGVydHkgdW5sZXNzIHlvdQorIyBpbnRlbmQgdG8gYnVpbGQgdGhlIGxvZzRqIHdlYiBzaXRlIHlvdXJzZWxmLgoramFrYXJ0YS1zaXRlMj0uLi9qYWthcnRhLXNpdGUyCiAKKyMgUmVxdWlyZWQgdG8gcnVuIENoZWNrc3R5bGUuIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldAorY2hlY2tzdHlsZS5qYXI9L2phdmEvY2hlY2tzdHlsZS0yLjIvY2hlY2tzdHlsZS1hbGwtMi4yLmphcgorCisKKworIyBUaGUgdGVtcGxhdGVzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHdlYi1wYWdlcyBhcmUgaW5oZXJpdGVkIAorIyBmcm9tIHRoZSBwYXJlbnQgcHJvamVjdC4KK2xvZ2dpbmctc2l0ZT0uLi9sb2dnaW5nLXNpdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZC54bWwgYi9idWlsZC54bWwKaW5kZXggOWJjYjc0MC4uZjAwZWEzYyAxMDA2NDQKLS0tIGEvYnVpbGQueG1sCisrKyBiL2J1aWxkLnhtbApAQCAtNCw3ICs0LDcgQEAKIAogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBOT1RFOiBhbGwgZGlyZWN0b3JpZXMgYXJlIHJlbGF0aXZlIHRvIGpha2FydGEtbG9nNGovICAgICAgICAgICAgICAtLT4KKzwhLS0gTk9URTogYWxsIGRpcmVjdG9yaWVzIGFyZSByZWxhdGl2ZSB0byBsb2dnaW5nLWxvZzRqLyAgICAgICAgICAgICAgLS0+CiA8IS0tIHRoZSBwYXJlbnQgb2YgYnVpbGQvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIDxwcm9qZWN0IG5hbWU9ImxvZzRqIiBkZWZhdWx0PSJ1c2FnZSIgYmFzZWRpcj0iLiIgPgpAQCAtMTcsMTEgKzE3LDE0IEBACiAgIDwhLS0gcHJlZml4ZWQgd2l0aCAiZW52Ii4gLS0+CiAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CiAKLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIxLjIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIxLjIuMTFyYzEiLz4KIAogICA8IS0tIFRoZSBiYXNlIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB3aGljaCBtb3N0IHRhcmdldHMgYXJlIGJ1aWx0IC0tPgogICA8cHJvcGVydHkgbmFtZT0iYmFzZSIgdmFsdWU9Ii4iLz4KIAorCisgIDxwcm9wZXJ0eSBuYW1lPSJkZXByZWNhdGlvbiIgdmFsdWU9Im9uIi8+CisKICAgPCEtLSBUaGUgZGlyZWN0b3J5IHdoZXJlIHNvdXJjZSBmaWxlcyBhcmUgc3RvcmVkLiAtLT4KICAgPHByb3BlcnR5IG5hbWU9ImphdmEuc291cmNlLmRpciIgdmFsdWU9InNyYy9qYXZhLyIvPgogCkBAIC0yOSwxNyArMzIsMjMgQEAKICAgPCEtLSBidWlsZC8gLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdpbmcuZGlyIiB2YWx1ZT0iYnVpbGQiLz4KIAorICA8IS0tIGRpc3RyaWJ1dGlvbiBkaXJlY3RvcnkgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpciIgdmFsdWU9ImRpc3QiLz4KKyAgCiAgIDwhLS0gRGVzdGluYXRpb24gZm9yIGNvbXBpbGVkIGZpbGVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWMuZGVzdCIgdmFsdWU9ImRpc3QvY2xhc3NlcyIvPgorICA8cHJvcGVydHkgbmFtZT0iamF2YWMuZGVzdCIgdmFsdWU9IiR7ZGlzdC5kaXJ9L2NsYXNzZXMiLz4KIAogICA8IS0tIERlc3RpbmF0aW9uIGZvciBnZW5lcmF0ZWQgamFyIGZpbGVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0iamFyLmRlc3QiIHZhbHVlPSJkaXN0L2xpYiIvPgorICA8cHJvcGVydHkgbmFtZT0iamFyLmRlc3QiIHZhbHVlPSIke2Rpc3QuZGlyfS9saWIiLz4KIAorICA8IS0tIFRoZSBqYXIgZmlsZSB0aGF0IHRoZSBqYXIgdGFzayB3aWxsIGdlbmVyYXRlIC0tPgogICA8cHJvcGVydHkgbmFtZT0iamFyLmZpbGVuYW1lIiB2YWx1ZT0ibG9nNGotJHt2ZXJzaW9ufS5qYXIiLz4KIAorICA8IS0tIERlc3RpbmF0aW9uIGZvciBkb2N1bWVudGF0aW9uIGZpbGVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iZG9jcy5kZXN0IiB2YWx1ZT0iLi9kb2NzIi8+CisgIDwhLS0gU291cmNlIGRpcmVjdG9yeSBmb3IgeG1sIGRvY3MgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJ4ZG9jcy5zcmMiIHZhbHVlPSIuL3NyYy94ZG9jcyIvPgogCi0gIDwhLS0gRGVzdGluYXRpb24gZm9yIGRvY3VtZW50YXRpb24gZmlsZXMgZ2VuZXJhdGVkIG9yIG5vdCAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImRvY3MiIHZhbHVlPSJkb2NzIi8+CiAKICAgPCEtLSBEZXN0aW5hdGlvbiBmb3IgamF2YWRvYyBnZW5lcmF0ZWQgZmlsZXMgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmRlc3QiIHZhbHVlPSJkb2NzL2FwaSIvPgpAQCAtNTcsMTAgKzY2LDEwIEBACiAgIDxwcm9wZXJ0eSBuYW1lPSJtYW5pZmVzdC5zcmMiIHZhbHVlPSJidWlsZC9tYW5pZmVzdC5tZiIvPgogCiAgIDwhLS0gRGlyZWN0b3J5IHdoZXJlIHJlbGVhc2UgaW1hZ2VzIGdvLiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QuaW1hZ2VzIiAgdmFsdWU9ImRpc3QvaW1hZ2VzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmltYWdlcyIgIHZhbHVlPSIke2Rpc3QuZGlyfS9pbWFnZXMiLz4KIAogICA8IS0tIERpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IGZpbGVzLiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QudG1wIiB2YWx1ZT0iZGlzdC90bXAiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRpc3QudG1wIiB2YWx1ZT0iJHtkaXN0LmRpcn0vdG1wIi8+CiAKIAogICA8IS0tIENvbnN0cnVjdCBjb21waWxlIGNsYXNzcGF0aCAtLT4KQEAgLTc1LDYgKzg0LDEyIEBACiAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pteC1leHRyYS5qYXJ9Ii8+CiAgIDwvcGF0aD4KIAorICA8IS0tIENvbnN0cnVjdCBjbGFzc3BhdGggZm9yIGJ1aWxkaW5nIHRoZSBodG1sIHBhZ2VzLS0+CisgIDxwYXRoIGlkPSJzaXRlLmNsYXNzcGF0aCI+CisgICAgPGZpbGVzZXQgZGlyPSIke2xvZ2dpbmctc2l0ZX0vbGliIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgPC9maWxlc2V0PgorICA8L3BhdGg+CiAKICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KQEAgLTE2NCw3ICsxNzksOCBAQAogICAgIDxta2RpciBkaXI9IiR7amF2YWMuZGVzdH0iIC8+CiAgICAgPGphdmFjIHNyY2Rpcj0iJHtqYXZhLnNvdXJjZS5kaXJ9IgogCSAgIGRlc3RkaXI9IiR7amF2YWMuZGVzdH0iCi0JICAgaW5jbHVkZXM9IiR7c3RlbX0vKiovKi5qYXZhLCAke3N0ZW19L3htbC9YTUxMYXlvdXQuamF2YSwiCisJICAgaW5jbHVkZXM9IiR7c3RlbX0vKiovKi5qYXZhLCAKKyAgICAgICAgICAgICAgICAgICAgICR7c3RlbX0veG1sL1hNTExheW91dC5qYXZhIgogCSAgIGV4Y2x1ZGVzPSJtaXNjLyosICoqL1VuaXRUZXN0Ki5qYXZhLAogICAgICAgICAgICAgICAgICAgICAqKi9TdHJlc3NDYXRlZ29yeS5qYXZhLAogICAgICAgICAgICAgICAgICAgICAqKi9kb2MtZmlsZXMvKiwKQEAgLTE3OSw2ICsxOTUsMTMgQEAKICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8+CiAgICAgPC9qYXZhYz4KICAgICAKKyAgICA8Y29weSB0b2Rpcj0iJHtqYXZhYy5kZXN0fSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS5zb3VyY2UuZGlyfSIKKwlpbmNsdWRlcz0iJHtzdGVtfS9sZjUvKiovKi5wcm9wZXJ0aWVzIi8+ICAgIAorICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEuc291cmNlLmRpcn0iCisJaW5jbHVkZXM9IiR7c3RlbX0vbGY1L3ZpZXdlci9pbWFnZXMvKiIvPgorICAgPC9jb3B5PgorCiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iYnVpbGQuZXhhbXBsZXMiIGRlcGVuZHM9ImJ1aWxkLmNvcmUiPgpAQCAtMTkzLDYgKzIxNiwxMiBAQAogICAgIDxybWljIGJhc2U9IiR7amF2YWMuZGVzdH0iCiAgICAgICBjbGFzc25hbWU9ImV4YW1wbGVzLk51bWJlckNydW5jaGVyU2VydmVyIgogICAgICAgLz4KKworICAgIDxjb3B5IHRvZGlyPSIke2phdmFjLmRlc3R9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9ImV4YW1wbGVzL2xmNS8qKi8qLnByb3BlcnRpZXMiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9ImV4YW1wbGVzL2xmNS8qKi8qLnhtbCIvPgorICAgPC9jb3B5PgorCiAgIDwvdGFyZ2V0PgogCiAgPHRhcmdldCBuYW1lPSJidWlsZC54bWwiIGRlcGVuZHM9ImluaXQsIGpheHAiIGlmPSJqYXhwLXByZXNlbnQiPgpAQCAtMjIzLDcgKzI1Miw3IEBACiAgICAgPGphdmFjIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKICAgICAgICAgICAgc3JjZGlyPSIke2phdmEuc291cmNlLmRpcn0iCiAJICAgZGVzdGRpcj0iJHtqYXZhYy5kZXN0fSIKLQkgICBpbmNsdWRlcz0iJHtzdGVtfS9uZXQvSk1TKi5qYXZhIj4KKyAgICAgICAgICAgaW5jbHVkZXM9IiR7c3RlbX0vbmV0L0pNUyouamF2YSwgJHtzdGVtfS9vci9qbXMvKi5qYXZhIj4KICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8+CiAgICAgPC9qYXZhYz4KICAgPC90YXJnZXQ+CkBAIC0yNDMsNyArMjcyLDcgQEAKICAgPCEtLSBSZW1vdmUgYWxsIGdlbmVyYXRlZCAoY29tcGlsZWQpIGNsYXNzIGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAtLT4KICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amF2YWMuZGVzdH0vIiAvPgorICAgIDxkZWxldGUgZGlyPSIke2Rpc3QuZGlyfS8iIC8+CiAgIDwvdGFyZ2V0PgogCiAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0yNTEsNyArMjgwLDcgQEAKICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgPHRhcmdldCBuYW1lPSJjaGVja3N0eWxlIiBkZXBlbmRzPSJpbml0Ij4KICAgICA8dGFza2RlZiByZXNvdXJjZT0iY2hlY2tzdHlsZXRhc2sucHJvcGVydGllcyIKLSAgICAgICAgICAgICBjbGFzc3BhdGg9ImJ1aWxkL2xpYi9jaGVja3N0eWxlLWFsbC0yLjEuamFyIi8+CisgICAgICAgICAgICAgY2xhc3NwYXRoPSIke2NoZWNrc3R5bGUuamFyfSIvPgogCiAgICAgPCEtLSBieSBkZWZhdWx0IGNoZWNrc3R5bGUgc3VwcG9ydHMgdGhlIFN1biBjb2Rpbmcgc3RhbmRhcmQuIC0tPgogICAgIDxjaGVja3N0eWxlIGxjdXJseU1ldGhvZD0ibmxvdyIKQEAgLTI3MCw3ICsyOTksNyBAQAogICA8dGFyZ2V0IG5hbWU9ImNoYWluc2F3IiBkZXBlbmRzPSJidWlsZCI+CiAgICAgPCEtLSBOZWVkIHRvIGZvcmsgdG8gYXZvaWQgcHJvYmxlbXMgLS0+CiAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmxvZzRqLmNoYWluc2F3Lk1haW4iIGZvcms9InllcyIKLSAgICAgICAgICBjbGFzc3BhdGg9IiR7amF2YWMuZGVzdH0iPgorICAgICAgICAgIGNsYXNzcGF0aD0iJHtqYXZhYy5kZXN0fTske2FudC5ob21lfS9saWIvY3JpbXNvbi5qYXIiPgogICAgIDwvamF2YT4KICAgPC90YXJnZXQ+CiAKQEAgLTMwMCw3ICszMjksOCBAQAogICAgIDwvZGVsZXRlPgogCiAgICAgPGphciBqYXJmaWxlPSIke2phci5kZXN0fS8ke2phci5maWxlbmFtZX0iIGJhc2VkaXI9IiR7amF2YWMuZGVzdH0iCi0gICAgICBpbmNsdWRlcz0iJHtzdGVtfS8qLmNsYXNzLCAke3N0ZW19L3htbC9sb2c0ai5kdGQsCisgICAgICBpbmNsdWRlcz0iJHtzdGVtfS8qLmNsYXNzLCAKKyAgICAgICAgICAgICAgICAke3N0ZW19L3htbC9sb2c0ai5kdGQsCiAgICAgICAgICAgICAgICAgJHtzdGVtfS9jb25maWcvKi5jbGFzcywKIAkgICAgICAgICR7c3RlbX0vaGVscGVycy8qLmNsYXNzLAogCQkke3N0ZW19L3NwaS8qLmNsYXNzLApAQCAtMzA4LDYgKzMzOCw5IEBACiAJCSR7c3RlbX0vamRiYy8qLmNsYXNzLAogCQkke3N0ZW19L3ZhcmlhLyouY2xhc3MsCiAJCSR7c3RlbX0vY2hhaW5zYXcvKi5jbGFzcywKKwkJJHtzdGVtfS9sZjUvKiovKi5jbGFzcywKKwkJJHtzdGVtfS9sZjUvKiovKi5wcm9wZXJ0aWVzLAorCQkke3N0ZW19L2xmNS8qKi8qLmdpZiwKIAkJJHtzdGVtfS9udC8qLmNsYXNzLAogCQkke3N0ZW19L3htbC8qLmNsYXNzLAogCQkke3N0ZW19L2pteC8qLmNsYXNzLApAQCAtMzM0LDYgKzM2Nyw3IEBACiAJCQkgb3JnLmFwYWNoZS5sb2c0ai5jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLAogCQkgICAgICAgICBvcmcuYXBhY2hlLmxvZzRqLmpteCwKKwkJICAgICAgICAgb3JnLmFwYWNoZS5sb2c0ai5sZjUsCiAJCSAgICAgICAgIG9yZy5hcGFjaGUubG9nNGoubmV0LAogCQkJIG9yZy5hcGFjaGUubG9nNGoubnQsCiAJCSAgICAgICAgIG9yZy5hcGFjaGUubG9nNGoub3IsCkBAIC0zNTAsMjkgKzM4NCw2OCBAQAogCSAgIHByb3RlY3RlZD0idHJ1ZSIKIAkgICBhdXRob3I9InRydWUiCiAJICAgdXNlPSJ0cnVlIgotCSAgIG92ZXJ2aWV3PSIke2RvY3N9L292ZXJ2aWV3Lmh0bWwiCisJICAgb3ZlcnZpZXc9IiR7ZG9jcy5kZXN0fS9vdmVydmlldy5odG1sIgogCSAgIGRvY3RpdGxlPSJsb2c0aiB2ZXJzaW9uICR7dmVyc2lvbn0mbHQ7YnImZ3Q7QVBJIFNwZWNpZmljYXRpb24iCiAJICAgd2luZG93dGl0bGU9IkxvZzRqIFZlcnNpb24gJHt2ZXJzaW9ufSIKICAgICAgICAgICAgaGVhZGVyPSImbHQ7YiZndDtMb2c0aiAke3ZlcnNpb259Jmx0Oy9iJmd0OyIKLQkgICBib3R0b209IkNvcHlyaWdodCAyMDAwLTIwMDIgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIj4KKwkgICBib3R0b209IkNvcHlyaWdodCAyMDAwLTIwMDUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIj4KIAotICAgICAgPGxpbmsgb2ZmbGluZT0idHJ1ZSIKLQkgICAgIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2FwaSIKLQkgICAgIHBhY2thZ2VMaXN0TG9jPSIke3BhY2thZ2luZy5kaXJ9Ii8+CisgICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjMvZG9jcy9hcGkvIi8+CisgICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvc2RrXzEuMy90ZWNoZG9jcy9hcGkvIi8+CiAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjb21waWxlLmNsYXNzcGF0aCIvPgogICAgIDwvamF2YWRvYz4KICAgPC90YXJnZXQ+CiAKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIEJ1aWxkIHRoZSBzaXRlIGZpbGVzIHVzaW5nIEFuYWtpYSAgICAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4gIAorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gQnVpbGQgdGhlIHNpdGUgZmlsZXMgdXNpbmcgQW5ha2lhICAgICAgICAgICAgICAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9InByZXBhcmVTaXRlIj4KKyAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS52ZWxvY2l0eS5hbmFraWEuQW5ha2lhVGFzayIKKyAgICAgIHByb3BlcnR5PSJBbmFraWFUYXNrLnByZXNlbnQiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0ic2l0ZS5jbGFzc3BhdGgiLz4KKyAgICA8L2F2YWlsYWJsZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjaGVja1NpdGUiIGRlcGVuZHM9InByZXBhcmVTaXRlIiB1bmxlc3M9IkFuYWtpYVRhc2sucHJlc2VudCI+CisgICAgPGVjaG8+CisgICAgICBBbmFraWFUYXNrIGlzIG5vdCBwcmVzZW50ISBQbGVhc2UgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgIHZlbG9jaXR5LmphciBpcyBpbiB5b3VyIGNsYXNzcGF0aC4KKyAgICA8L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2l0ZSIgZGVwZW5kcz0iY2hlY2tTaXRlIiBpZj0iQW5ha2lhVGFzay5wcmVzZW50Ij4KKyAgICA8dGFza2RlZiBuYW1lPSJhbmFraWEiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS52ZWxvY2l0eS5hbmFraWEuQW5ha2lhVGFzayI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJzaXRlLmNsYXNzcGF0aCIvPgorICAgIDwvdGFza2RlZj4KKyAKKyAgICA8bWtkaXIgZGlyPSIke2RvY3MuZGVzdH0vY3NzIi8+ICAKKyAgICA8Y29weSBmaWxlPSIke2xvZ2dpbmctc2l0ZX0vZG9jcy9jc3Mvc2l0ZS5jc3MiIHRvZmlsZT0iJHtkb2NzLmRlc3R9L2Nzcy9zaXRlLmNzcyIvPgorICAgIAorICAgIDxhbmFraWEgYmFzZWRpcj0iJHt4ZG9jcy5zcmN9IiBkZXN0ZGlyPSIke2RvY3MuZGVzdH0vIgorICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIKKyAgICAgIHN0eWxlPSJzaXRlLnZzbCIKKyAgICAgIHByb2plY3RGaWxlPSJzdHlsZXNoZWV0cy9wcm9qZWN0LnhtbCIKKyAgICAgIGV4Y2x1ZGVzPSIqKi9zdHlsZXNoZWV0cy8qKiwgZW1wdHkueG1sLCBsZjUvKioiCisgICAgICBpbmNsdWRlcz0iKiovKi54bWwiCisgICAgICBsYXN0TW9kaWZpZWRDaGVjaz0idHJ1ZSIKKyAgICAgIHRlbXBsYXRlUGF0aD0iJHtsb2dnaW5nLXNpdGV9L3NyYy94ZG9jcy9zdHlsZXNoZWV0cyI+CisgICAgPC9hbmFraWE+CisKKyAgPC90YXJnZXQ+CisKICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogIDwhLS0gQnVpbGQgYSBjb21wbGV0ZSBkaXN0cmlidXRpb24uIFJlc3VsdHMgZ28gdG8gJHtkaXN0LmltYWdlc30gICAgICAgLS0+CiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJpbml0LCBjbGVhbiwgamF2YWRvYywgamFyIj4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJpbml0LCBjbGVhbiwgamF2YWRvYywgamFyLCBzaXRlIj4KIAogICAgIDxkZWxldGUgdmVyYm9zZT0idHJ1ZSI+CiAgICAgICA8ZmlsZXNldCBkaXI9Ii4iPgogICAgICAgICA8cGF0dGVybnNldD4KIAkgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmJhayIvPgotCSAgIDxpbmNsdWRlIG5hbWU9ImRpc3QvdmVsb2NpdHkubG9nIi8+CisJICAgPGluY2x1ZGUgbmFtZT0iJHtkaXN0LmRpcn0vdmVsb2NpdHkubG9nIi8+CiAJICAgPGluY2x1ZGUgbmFtZT0iJHtCU1RFTX0vKiovdGVtcCoiLz4KIAkgICA8aW5jbHVkZSBuYW1lPSIke0JTVEVNfS9wZXJmb3JtYW5jZS90ZXN0Ii8+CiAJICAgPGluY2x1ZGUgbmFtZT0iJHtCU1RFTX0vdGVzdC9jdXJyZW50LioiLz4KQEAgLTQwMyw0OCArNDc2LDUwIEBACiAgICAgPC9kZWxldGU+CiAKICAgICA8bWtkaXIgIGRpcj0iJHtkaXN0LmltYWdlc30iIC8+CisgICAgCisgICAgPG1rZGlyICBkaXI9IiR7ZGlzdC50bXB9L2xvZ2dpbmctbG9nNGotJHt2ZXJzaW9ufSIgLz4KIAotICAgIDxta2RpciAgZGlyPSIke2Rpc3QudG1wfS9qYWthcnRhLWxvZzRqLSR7dmVyc2lvbn0iIC8+Ci0KLSAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LnRtcH0vamFrYXJ0YS1sb2c0ai0ke3ZlcnNpb259Ij4KKyAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LnRtcH0vbG9nZ2luZy1sb2c0ai0ke3ZlcnNpb259Ij4KICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZX0iCiAgICAgICAgICAgICAgICAgaW5jbHVkZXM9InNyYy9qYXZhLyoqLAogCQkJICBkb2NzLyoqLAogCSAgICAgICAgICAgICAgICAgIGV4YW1wbGVzLyoqLAogCQkJICBidWlsZC8qLAogCSAgICAgICAgICAgICAgICAgIGJ1aWxkLnhtbCwKKwkgICAgICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3QubWYsCiAJCQkgIElOU1RBTEwsCiAJCQkgIExJQ0VOU0UudHh0LAotCQkJICBkaXN0L2xpYi9sb2c0aiouamFyLAotCQkJICBkaXN0L2NsYXNzZXMvKiosCisJCQkgICR7ZGlzdC5kaXJ9L2xpYi9sb2c0aiouamFyLAorCQkJICAke2Rpc3QuZGlyfS9jbGFzc2VzLyoqLAogCQkJICBjb250cmlicy8qKiIKICAgICAgICAgICAgICAgICBleGNsdWRlcz0ibWFrZS9tYWtlLmxvYywKIAkJICAgICAgICAgICoqLyouYmFrLCAqKi9nb0Vudi5iYXQsCiAJCSAgICAgICAgICAqKi9NYWtlZmlsZSwgKiovZ29FbnYuYmF0LAogCSAgICAgICAgICAgICAgICAgIGRvY3MvcHViLXN1cHBvcnQvKiwKKwkgICAgICAgICAgICAgICAgICAke2Rpc3QuZGlyfS9jbGFzc2VzL29yZy8qKiwKIAkgICAgICAgICAgICAgICAgICBzcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvKiovKiwJCiAJCQkgICoqLy4jKiIvPgogICAgIDwvY29weT4KIAogCi0gICAgPGZpeGNybGYgc3JjZGlyPSIke2Rpc3QudG1wfS9qYWthcnRhLWxvZzRqLSR7dmVyc2lvbn0iCisgICAgPGZpeGNybGYgc3JjZGlyPSIke2Rpc3QudG1wfS9sb2dnaW5nLWxvZzRqLSR7dmVyc2lvbn0iCiAgICAgICAgICAgICAgaW5jbHVkZXM9ImJ1aWxkLnNoIiBjcj0icmVtb3ZlIi8+Ci0gICAgPGZpeGNybGYgc3JjZGlyPSIke2Rpc3QudG1wfS9qYWthcnRhLWxvZzRqLSR7dmVyc2lvbn0iCisgICAgPGZpeGNybGYgc3JjZGlyPSIke2Rpc3QudG1wfS9sb2dnaW5nLWxvZzRqLSR7dmVyc2lvbn0iCiAgICAgICAgICAgICAgaW5jbHVkZXM9ImJ1aWxkLmJhdCIgY3I9ImFkZCIvPgotICAgIDxjaG1vZCAgIGRpcj0iJHtkaXN0LnRtcH0vamFrYXJ0YS1sb2c0ai0ke3ZlcnNpb259IgorICAgIDxjaG1vZCAgIGRpcj0iJHtkaXN0LnRtcH0vbG9nZ2luZy1sb2c0ai0ke3ZlcnNpb259IgogICAgICAgICAgICAgIGluY2x1ZGVzPSJidWlsZC5zaCIgcGVybT0iK3giLz4KIAotICAgIDx0YXIgdGFyZmlsZT0iJHtkaXN0LmltYWdlc30vamFrYXJ0YS1sb2c0ai0ke3ZlcnNpb259LnRhciIKKyAgICA8dGFyIHRhcmZpbGU9IiR7ZGlzdC5pbWFnZXN9L2xvZ2dpbmctbG9nNGotJHt2ZXJzaW9ufS50YXIiCiAgICAgICAgICBiYXNlZGlyPSIke2Rpc3QudG1wfSIKLSAgICAgICAgIGluY2x1ZGVzPSJqYWthcnRhLWxvZzRqLSR7dmVyc2lvbn0vKioiIC8+CisgICAgICAgICBpbmNsdWRlcz0ibG9nZ2luZy1sb2c0ai0ke3ZlcnNpb259LyoqIiAvPgogCi0gICAgPGd6aXAgc3JjPSIke2Rpc3QuaW1hZ2VzfS9qYWthcnRhLWxvZzRqLSR7dmVyc2lvbn0udGFyIgotICAgICAgICAgIHppcGZpbGU9IiR7ZGlzdC5pbWFnZXN9L2pha2FydGEtbG9nNGotJHt2ZXJzaW9ufS50YXIuZ3oiIC8+CisgICAgPGd6aXAgc3JjPSIke2Rpc3QuaW1hZ2VzfS9sb2dnaW5nLWxvZzRqLSR7dmVyc2lvbn0udGFyIgorICAgICAgICAgIHppcGZpbGU9IiR7ZGlzdC5pbWFnZXN9L2xvZ2dpbmctbG9nNGotJHt2ZXJzaW9ufS50YXIuZ3oiIC8+CiAKLSAgICA8emlwIHppcGZpbGU9IiR7ZGlzdC5pbWFnZXN9L2pha2FydGEtbG9nNGotJHt2ZXJzaW9ufS56aXAiCisgICAgPHppcCB6aXBmaWxlPSIke2Rpc3QuaW1hZ2VzfS9sb2dnaW5nLWxvZzRqLSR7dmVyc2lvbn0uemlwIgogICAgICAgICAgYmFzZWRpcj0iJHtkaXN0LnRtcH0iCi0gICAgICAgICBpbmNsdWRlcz0iamFrYXJ0YS1sb2c0ai0ke3ZlcnNpb259LyoqIiAvPgorICAgICAgICAgaW5jbHVkZXM9ImxvZ2dpbmctbG9nNGotJHt2ZXJzaW9ufS8qKiIgLz4KIAogCiAgICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdC50bXB9IiAvPgpkaWZmIC0tZ2l0IGEvYnVpbGQvc2l0ZUJ1aWxkLnNoIGIvYnVpbGQvc2l0ZUJ1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjcwN2U3Li4wMDAwMDAwCi0tLSBhL2J1aWxkL3NpdGVCdWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMhL2Jpbi9zaAotIAotaWYgWyAiJEpBVkFfSE9NRSIgPSAiIiBdIDsgdGhlbgotICBlY2hvIFlvdSBtdXN0IHNldCBKQVZBX0hPTUUgdG8gcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBkaXJlY3RvcnkKLSAgZXhpdCAxCi1maQotCi0jIGNvbnZlcnQgdGhlIGV4aXN0aW5nIHBhdGggdG8gdW5peAotaWYgWyAiJE9TVFlQRSIgPSAiY3lnd2luMzIiIF0gfHwgWyAiJE9TVFlQRSIgPSAiY3lnd2luIiBdIDsgdGhlbgotICAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRDTEFTU1BBVEgiYAotZmkKLQotIyBBZGQgaW4gdGhlIGpha2FydGEtc2l0ZTIgbGlicmFyeSBmaWxlcwotZm9yIGkgaW4gLi4vLi4vamFrYXJ0YS1zaXRlMi9saWIvKi5qYXIKLWRvCi0gICAgQ0xBU1NQQVRIPSRDTEFTU1BBVEg6IiRpIgotZG9uZQotCi0KLSMgY29udmVydCB0aGUgdW5peCBwYXRoIHRvIHdpbmRvd3MKLWlmIFsgIiRPU1RZUEUiID0gImN5Z3dpbjMyIiBdIHx8IFsgIiRPU1RZUEUiID0gImN5Z3dpbiIgXSA7IHRoZW4KLSAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkQ0xBU1NQQVRIImAKLWZpCi0KLWVjaG8gIkNMQVNTUEFUSD0kQ0xBU1NQQVRIIgotCi1CVUlMREZJTEU9c2l0ZUJ1aWxkLnhtbAotCi0jZWNobyAkQ0xBU1NQQVRICi0KLWphdmEgJEFOVF9PUFRTIC1jbGFzc3BhdGggIiRDTEFTU1BBVEgiIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4gXAotICAgICAgICAgICAgICAgIC1EYW50LmhvbWU9JEFOVF9IT01FIFwKLSAgICAgICAgICAgICAgICAtYnVpbGRmaWxlICR7QlVJTERGSUxFfSBcCi0gICAgICAgICAgICAgICAgICIkQCIKZGlmZiAtLWdpdCBhL2J1aWxkL3NpdGVCdWlsZC54bWwgYi9idWlsZC9zaXRlQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjlmODQ0Li4wMDAwMDAwCi0tLSBhL2J1aWxkL3NpdGVCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJidWlsZC1zaXRlIiBkZWZhdWx0PSJkb2NzIiBiYXNlZGlyPSIuLiI+Ci0KLSAgICA8IS0tIEluaXRpYWxpemF0aW9uIHByb3BlcnRpZXMgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9InByb2plY3QubmFtZSIgICB2YWx1ZT0ibG9nNGouc2l0ZSIvPgotICAgIAotICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLnNyYyIgdmFsdWU9Ii4vc3JjL3hkb2NzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImRvY3MuZGVzdCIgdmFsdWU9Ii4vZG9jcyIvPgotCi0gICAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4gICAgCi0gICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnZlbG9jaXR5LmFuYWtpYS5BbmFraWFUYXNrIiAKLSAgICAgICAgICAgIHByb3BlcnR5PSJBbmFraWFUYXNrLnByZXNlbnQiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgZGVwZW5kcz0icHJlcGFyZSIgbmFtZT0icHJlcGFyZS1lcnJvciIgdW5sZXNzPSJBbmFraWFUYXNrLnByZXNlbnQiPgotICAgICAgICA8ZWNobz4KLSAgICAgICAgICAgIEFuYWtpYVRhc2sgaXMgbm90IHByZXNlbnQhIFBsZWFzZSBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCAKLSAgICAgICAgICAgIHZlbG9jaXR5LmphciBpcyBpbiB5b3VyIGNsYXNzcGF0aC4KLSAgICAgICAgPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJkb2NzIiBkZXBlbmRzPSJwcmVwYXJlLWVycm9yIiBpZj0iQW5ha2lhVGFzay5wcmVzZW50Ij4KLSAgICAgICAgPHRhc2tkZWYgbmFtZT0iYW5ha2lhIiAKLSAgICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnZlbG9jaXR5LmFuYWtpYS5BbmFraWFUYXNrIi8+Ci0gICAgICAgIDxhbmFraWEgYmFzZWRpcj0iJHtkb2NzLnNyY30iIGRlc3RkaXI9IiR7ZG9jcy5kZXN0fS8iCi0gICAgICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIgCi0JICAgICBzdHlsZT0ic2l0ZS52c2wiCi0gICAgICAgICAgICAgcHJvamVjdEZpbGU9InN0eWxlc2hlZXRzL3Byb2plY3QueG1sIgotICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9zdHlsZXNoZWV0cy8qKiwgZW1wdHkueG1sIgotICAgICAgICAgICAgIGluY2x1ZGVzPSIqKi8qLnhtbCIKLSAgICAgICAgICAgICBsYXN0TW9kaWZpZWRDaGVjaz0idHJ1ZSIKLQkgICAgIHRlbXBsYXRlUGF0aD0iLi4vamFrYXJ0YS1zaXRlMi94ZG9jcy9zdHlsZXNoZWV0cyI+Ci0gICAgICAgIDwvYW5ha2lhPgotICAgICAgICA8IS0tCi0gICAgICAgIDxjb3B5IHRvZGlyPSIke2RvY3MuZGVzdH0vaW1hZ2VzIiBmaWx0ZXJpbmc9Im5vIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2NzLnNyY30vaW1hZ2VzIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmdpZiIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouanBlZyIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouanBnIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgIEluIGNhc2Ugd2UgaGF2ZSBDU1Mgc29tZWRheQotICAgICAgICA8Y29weSB0b2Rpcj0iJHtkb2NzLmRlc3R9IiBmaWx0ZXJpbmc9Im5vIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2NzLnNyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY3NzIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgLS0+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9kb2NzL0ZBUS5odG1sIGIvZG9jcy9GQVEuaHRtbAppbmRleCAzYjBiMGRiLi42ZjM5NTdkIDEwMDY0NAotLS0gYS9kb2NzL0ZBUS5odG1sCisrKyBiL2RvY3MvRkFRLmh0bWwKQEAgLTEsMjEyICsxLDQwOCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgotPGh0bWw+IDxoZWFkPgotPHRpdGxlPmxvZzRqIEZBUTwvdGl0bGU+Ci08L2hlYWQ+IAotPGJvZHkgYmdjb2xvcj0jRkZGRkZGPgotIAotPGNlbnRlcj4KLTxoMT5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCBsb2c0ajwvaDE+Cis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KIAotPGI+Q2VraSBHJnV1bWw7bGMmdXVtbDs8L2I+IGFuZCA8Yj5DaHJpcyBUYXlsb3I8L2I+IAotPGgyPk1heSAyMDAyPC9oMj4KLTwvY2VudGVyPgotPHVsPgorPCEtLSBDb250ZW50IFN0eWxlc2hlZXQgZm9yIFNpdGUgLS0+CiAKLTxsaT48cD48YSBocmVmPSN3aGF0SXM+V2hhdCBpcyBsb2c0aj88L2E+PC9wPgorICAgIAorICAgIAorICAgIAorICAgICAgICAKKzwhLS0gc3RhcnQgdGhlIHByb2Nlc3NpbmcgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8IS0tIE1haW4gUGFnZSBTZWN0aW9uIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIi8+CiAKLTxsaT48cD48YSBocmVmPSNyZWxpYWJsZT5JcyBsb2c0aiBhIHJlbGlhYmxlIGxvZ2dpbmcgc3lzdGVtPzwvYT48L3A+Ci08bGk+PHA+PGEgaHJlZj0jcHJlcmVxdWlzaXRlcz5XaGF0IGFyZSB0aGUgcHJlcmVxdWlzaXRlcyBmb3IgbG9nNGo/PC9hPjwvcD4KLTxsaT48cD48YSBocmVmPSNqYXZhZG9jPklzIHRoZXJlIGphdmFkb2MgZG9jdW1lbnRhdGlvbiBmb3IgbG9nNGo/PC9hPjwvcD4KLTxsaT48cD48YSBocmVmPSNhbHRlcm5hdGl2ZXM+V2hhdCBvdGhlciBsb2dnaW5nIHBhY2thZ2VzIGFyZSB0aGVyZT88L2E+PC9wPgotPGxpPjxwPjxhIEhSRUY9I3VzYWdlRXhhbXBsZT5JcyB0aGVyZSBleGFtcGxlIGNvZGUgZm9yIHVzaW5nIGxvZzRqPzwvYT48L3A+Ci08bGk+PHA+PGEgaHJlZj0jZmVhdHVyZXM+V2hhdCBhcmUgdGhlIGZlYXR1cmVzIG9mIGxvZzRqPzwvYT48L3A+IAotPGxpPjxwPjxhIGhyZWY9I3RocmVhZC1zYWZldHk+SXMgbG9nNGogdGhyZWFkLXNhZmU/PC9hPjwvcD4gCi08bGk+PHA+PGEgaHJlZj0jc2FtcGxlPldoYXQgZG9lcyBsb2cgb3V0cHV0IGxvb2sgbGlrZT88L2E+PC9wPgotPGxpPjxwPjxhIGhyZWY9I2xvZ2dlcj5XaGF0IGFyZSA8ZW0+TG9nZ2VyczwvZW0+PzwvYT48L3A+Ci08bGk+PHA+PGEgaHJlZj0jYmVoYXZpb3I+SG93IGNhbiBJIGNoYW5nZSBsb2cgYmVoYXZpb3IgYXQgcnVudGltZT88L2E+PC9wPgotPGxpPjxwPjxhIEhSRUY9I2Zhc3RMb2dnaW5nPldoYXQgaXMgdGhlIGZhc3Rlc3Qgd2F5IG9mIChub3QpIGxvZ2dpbmc/PC9hPjwvcD4KLTxsaT48cD48YSBIUkVGPSNhcnJheURlYnVnPldoYXQgaXMgdGhlIHVzZSBvZiB0aGUgPGNvZGU+ZGVidWc8L2NvZGU+IG1ldGhvZAotZXhwZWN0aW5nIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBhcnJheSBhcyBvbmUgb2YgaXRzIHBhcmFtZXRlcnM/PC9hPjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIHZhbHVlPSJDZWtpIEd1bGN1Ij4KKyAgICAgICAgICAgIDxtZXRhIG5hbWU9ImVtYWlsIiB2YWx1ZT0iY2d1QGFwYWNoZS5vcmciPgorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgPGxpbmsgaHJlZj0iLi9jc3Mvc2l0ZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKLTxsaT48cD48YSBocmVmPSNpbnRyb0NhdD5XaHkgd2FzIHRoZSBMb2dnZXIgY2xhc3MgaW50cm9kdWNlZCBhbmQgaG93Ci1kbyBJIG1pZ3JhdGUgZnJvbSB0aGUgcHJldmlvdXMgU3RyaW5nIGJhc2VkIGltcGxlbWVudGF0aW9uPzwvYT48L3A+CisgICAgICAgICAgICA8dGl0bGU+TG9nNGogcHJvamVjdCAtIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IGxvZzRqPC90aXRsZT4KKyAgICAgICAgPC9oZWFkPgogCi08bGk+PHA+PGEgaHJlZj0jbmFtaW5nTG9nZ2Vycz5BcmUgdGhlcmUgYW55IHN1Z2dlc3RlZCB3YXlzIGZvciBuYW1pbmcKLWxvZ2dlcnM/PC9hPjwvcD4KKyAgICAgICAgPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzUyNUQ3NiI+ICAgICAgICAKKyAgICAgICAgICAgPCEtLSBTVEFSVCBIZWFkZXIgdGFibGUgLS0+IAorICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJiYW5uZXIiIGJvcmRlcj0iMCI+CisgICAgIDx0cj4KKyAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy8iPgorICAgICAgICAgICA8aW1nIHNyYz0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9pbWFnZXMvbHMtbG9nby5qcGciIGJvcmRlcj0iMCIvPgorICAgICAgICAgPC9hPgorICAgICAgIDwvdGQ+CisgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovZG9jcy8iPgorICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iLi9pbWFnZXMvbG9nby5qcGciIGFsdD0iVGhlIGxvZzRqIHByb2plY3QiIGJvcmRlcj0iMCIvPgorICAgICAgCSAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgPC90cj4KKyAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwhLS0gRU5EIEhlYWRlciB0YWJsZSAtLT4gCiAKLTxsaT48cD48YSBocmVmPSNjbGFzc05hbWU+SG93IGRvIEkgZ2V0IHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIGluCi1hIHN0YXRpYyBibG9jaz88L2E+PC9wPgotCi08bGk+PHA+PGEgaHJlZj0jY3VzdG9tTGF5b3V0cz5DYW4gdGhlIGxvZyBvdXRwdXQgZm9ybWF0IGJlCi1jdXN0b21pemVkPzwvYT48L3A+Ci0KLTxsaT48cD48YSBocmVmPSIjb3B0aW9ucyI+V2hhdCBhcmUgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zIGZvcgotPGNvZGU+Rm9yQmFyQXBwZW5kZXI8L2NvZGU+PzwvYT48L3A+Ci0KLQotPGxpPjxwPjxhIGhyZWY9I05EQz5DYW4gdGhlIG91dHB1dHMgb2YgbXVsdGlwbGUgY2xpZW50IHJlcXVlc3QgZ28gdG8KLWRpZmZlcmVudCBsb2cgZmlsZXM/PC9hPjwvcD4KLQotPGxpPjxwPjxhIGhyZWY9I3JtPkxvZ2dlciBpbnN0YW5jZXMgc2VlbSB0byBiZSBjcmVhdGUgb25seS4gV2h5IGlzbid0Ci10aGVyZSBhIG1ldGhvZCB0byByZW1vdmUgbG9nZ2VyIGluc3RhbmNlcz88L2E+PC9wPgotCi08bGk+PHA+PGEgaHJlZj0jZmlsdGVyQnlMZXZlbD5JcyBpdCBwb3NzaWJsZSB0byBkaXJlY3QgbG9nIG91dHB1dAotdG8gZGlmZmVyZW50IGFwcGVuZGVycyBieSBsZXZlbD88L2E+PC9wPgotCi08bGk+PHA+PGEgaHJlZj0jbWFueTIxPkhvdyBkbyBJIGdldCBtdWx0aXBsZSBwcm9jZXNzZXMgdG8gbG9nIHRvIHRoZSAKLXNhbWUgZmlsZT88L2E+PC9wPgotCi08bGk+PHA+PGEgaHJlZj0jdGltZXN0YW1wPklmIEkgaGF2ZSBtYW55IHByb2Nlc3MgYWNyb3NzIG11bHRpcGxlIGhvc3RzCi0ocG9zc2libHkgYWNyb3NzIG11bHRpcGxlIHRpbWV6b25lcykgbG9nZ2luZyB0byB0aGUgc2FtZSBmaWxlIHVzaW5nIHRoZQotbWV0aG9kIGFib3ZlLCB3aGF0IGhhcHBlbnMgdG8gdGltZXN0YW1wcz88L1A+Ci0KLTxMST48UD48QSBIUkVGPSIjajJlZSI+V2h5IGNhbid0IExvZzRKIGZpbmQgbXkgcHJvcGVydGllcyBmaWxlIGluIGEgSjJFRSBvciBXQVIgYXBwbGljYXRpb24/PC9QPgotPExJPjxQPjxBIEhSRUY9IiNjb25maWd1cmVhbmR3YXRjaCI+SXMgdGhlcmUgYSB3YXkgdG8gZ2V0IExvZzRKIHRvIGF1dG9tYXRpY2FsbHkgcmVsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIGlmIGl0IGNoYW5nZXM/PC9QPgotPExJPjxQPjxBIEhSRUY9IiNudGV2ZW50bG9ncHJvYmxlbXMiPldoYXQgZG9lcyB0aGUgV2luZG93cyBOVCBFdmVudCBWaWV3ZXIgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBkZXNjcmlwdGlvbnMgZm9yIG15IGV2ZW50IG1lc3NhZ2VzCi13aGVuIEkgdXNlIHRoZSBOVEV2ZW50TG9nQXBwZW5kZXI/PC9QPgotPExJPjxQPjxBIEhSRUY9IiNtb3JlbnRldmVudGxvZ3Byb2JsZW1zIj5XaHkgY2FuJ3QgSSBtYXAgbXkgbG9nZ2VyIG5hbWVzIHRvIHRoZSBsb2dnZXJzIHRoYXQgYXBwZWFyIGluIHRoZSAKLU5UIEV2ZW50IExvZyB3aGVuIEkgdXNlIHRoZSBOVEV2ZW50TG9nQXBwZW5kZXI/PC9wPgkJCQkJCSAgIAotPGxpPjxwPjxhIGhyZWY9I3RheD5XaHkgc2hvdWxkIEkgZG9uYXRlIG15IGxvZzRqIGV4dGVuc2lvbnMgYmFjayB0byB0aGUKLXByb2plY3Q/PC9hPjwvcD4KLTxsaT48cD48YSBocmVmPSNoZWxwPldoYXQgc2hvdWxkIEkga2VlcCBpbiBtaW5kIHdoZW4gY29udHJpYnV0aW5nIGNvZGU/PC9hPjwvcD4KLQotCi08bGk+PHA+PGEgaHJlZj0jZG93bmxvYWQ+V2hlcmUgY2FuIEkgZmluZCB0aGUgbGF0ZXN0IGRpc3RyaWJ1dGlvbiBvZiBsb2c0aj88L2E+PC9wPgotCi08L3VsPgotCi08aHI+Ci08cD48YSBuYW1lPXdoYXRJcz48aDQgaWQ9IndoYXRJcyI+V2hhdCBpcyBsb2c0aj88L2g0PgotCi1sb2c0aiBpcyBhIHRvb2wgdG8gaGVscCB0aGUgcHJvZ3JhbW1lciBvdXRwdXQgbG9nIHN0YXRlbWVudHMgdG8gYQotdmFyaWV0eSBvZiBvdXRwdXQgdGFyZ2V0cy4KLQotPHA+SW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIGFuIGFwcGxpY2F0aW9uLCBpdCBpcyBoZWxwZnVsIHRvIGVuYWJsZQotbG9nZ2luZyBzbyB0aGF0IHRoZSBwcm9ibGVtIGNhbiBiZSBsb2NhdGVkLiBXaXRoIGxvZzRqIGl0IGlzIHBvc3NpYmxlCi10byBlbmFibGUgbG9nZ2luZyBhdCBydW50aW1lIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBhcHBsaWNhdGlvbiBiaW5hcnkuCi1UaGUgbG9nNGogcGFja2FnZSBpcyBkZXNpZ25lZCBzbyB0aGF0IGxvZyBzdGF0ZW1lbnRzIGNhbiByZW1haW4gaW4KLTxpPnNoaXBwZWQ8L2k+IGNvZGUgd2l0aG91dCBpbmN1cnJpbmcgYSBoaWdoIHBlcmZvcm1hbmNlIGNvc3QuIEl0Ci1mb2xsb3dzIHRoYXQgdGhlIHNwZWVkIG9mIGxvZ2dpbmcgKG9yIHJhdGhlciBub3QgbG9nZ2luZykgaXMgY2FwaXRhbC4KLQotPHA+QXQgdGhlIHNhbWUgdGltZSwgbG9nIG91dHB1dCBjYW4gYmUgc28gdm9sdW1pbm91cyB0aGF0IGl0IHF1aWNrbHkKLWJlY29tZXMgb3ZlcndoZWxtaW5nLiBPbmUgb2YgdGhlIGRpc3RpbmN0aXZlIGZlYXR1cmVzIG9mIGxvZzRqIGlzIHRoZQotbm90aW9uIG9mIDxpPmhpZXJhcmNoaWNhbCBsb2dnZXJzPC9pPi4gVXNpbmcgbG9nZ2VycyBpdCBpcwotcG9zc2libGUgdG8gc2VsZWN0aXZlbHkgY29udHJvbCB3aGljaCBsb2cgc3RhdGVtZW50cyBhcmUgb3V0cHV0IGF0Ci1hcmJpdHJhcnkgIGdyYW51bGFyaXR5LgotCi08cD5sb2c0aiBpcyBkZXNpZ25lZCB3aXRoIHR3byBkaXN0aW5jdCBnb2FscyBpbiBtaW5kOiBzcGVlZCBhbmQKLWZsZXhpYmlsaXR5LiBUaGVyZSBpcyBhIHRpZ2h0IGJhbGFuY2UgYmV0d2VlbiB0aGVzZSB0d28KLXJlcXVpcmVtZW50cy4gSSBiZWxpZXZlIHRoYXQgbG9nNGogc3RyaWtlcyB0aGUgcmlnaHQgYmFsYW5jZS4KLQotPGEgbmFtZT1yZWxpYWJsZT48aDQ+SXMgbG9nNGogYSByZWxpYWJsZSBsb2dnaW5nIHN5c3RlbT88L2g0PgotCi1Oby4gbG9nNGogaXMgbm90IHJlbGlhYmxlLiBJdCBpcyBhIGJlc3QtZWZmb3J0IGFuZCA8ZW0+ZmFpbC1zdG9wPC9lbT4KLWxvZ2dpbmcgc3lzdGVtLgotCi08cD5CeSBmYWlsLXN0b3AsIHdlIG1lYW4gdGhhdCBsb2c0aiB3aWxsIG5vdCB0aHJvdyB1bmV4cGVjdGVkCi1leGNlcHRpb25zIGF0IHJ1bi10aW1lIHBvdGVudGlhbGx5IGNhdXNpbmcgeW91ciBhcHBsaWNhdGlvbiB0bwotY3Jhc2guIDxiPklmIGZvciBhbnkgcmVhc29uLCBsb2c0aiB0aHJvd3MgYW4gdW5jYXVnaHQgZXhjZXB0aW9uLAotcGxlYXNlIHNlbmQgYW4gZW1haWwgdG8gdGhlIDxhCi1ocmVmPSJtYWlsdG86bG9nNGotdXNlckBqYWthcnRhLmFwYWNoZS5vcmciPmxvZzRqLXVzZXJAamFrYXJ0YS5hcGFjaGUub3JnPC9hPgotbWFpbGluZyBsaXN0PC9iPi4gVW5jYXVnaHQgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhcyBzZXJpb3VzIGJ1Z3MKLXJlcXVpcmluZyBpbW1lZGlhdGUgYXR0ZW50aW9uLgotCi0KLTxwPk1vcmVvdmVyLCBsb2c0aiB3aWxsIG5vdCByZXZlcnQgdG8gU3lzdGVtLm91dCBvciBTeXN0ZW0uZXJyCi13aGVuIGl0cyBkZXNpZ25hdGVkIG91dHB1dCBzdHJlYW0gaXMgbm90IG9wZW5lZCwgaXMgbm90IHdyaXRhYmxlIG9yCi1iZWNvbWVzIGZ1bGwuIFRoaXMgYXZvaWRzIGNvcnJ1cHRpbmcgYW4gb3RoZXJ3aXNlIHdvcmtpbmcgcHJvZ3JhbSBieQotZmxvb2RpbmcgdGhlIHVzZXIncyB0ZXJtaW5hbCBiZWNhdXNlIGxvZ2dpbmcgZmFpbHMuIEhvd2V2ZXIsIGxvZzRqCi13aWxsIG91dHB1dCBhIHNpbmdsZSBtZXNzYWdlIHRvIFN5c3RlbS5lcnIgaW5kaWNhdGluZyB0aGF0IGxvZ2dpbmcgY2FuCi1ub3QgYmUgcGVyZm9ybWVkLgotCi08YSBuYW1lPXByZXJlcXVpc2l0ZXM+PGg0PldoYXQgYXJlIHRoZSBwcmVyZXF1aXNpdGVzIGZvciBsb2c0aj88L2g0PgotCi08dWw+Ci0KLSAgPHA+PGxpPkxvZzRqIGlzIEpESyAxLjEueCBjb21wYXRpYmxlLgorCSAgIDxkaXYgY2xhc3M9ImNlbnRlcmNvbCI+CisgICAgICAgICAgICAgPGhyIG5vc2hhZGU9IiIgc2l6ZT0iMSIvPgorCQkgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2VudGVyPgorICAgIDxoMj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCBsb2c0ajwvaDI+CisgICAgPGgzPkNla2kgIEf8bGP8LCBQYXVsIFNtaXRoLCBDaHJpcyBUYXlsb3I8YnIgLz4KKyAgICBNYXkgMjAwMiwgbGFzdCB1cGRhdGVkIG9uIFNlcHRlbWJlciAxNXRoLCAyMDA0PC9oMz4KKyAgPC9jZW50ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAKICAgCi0gIDxwPjxsaT5UaGUgRE9NQ29uZmlndXJhdG9yIGlzIGJhc2VkIG9uIHRoZSBET00gTGV2ZWwgMSBBUEkuIFRoZQotICAgIERPTUNvbmZpZ3VyYXRvci5jb25maWd1cmUoRWxlbWVudCkgbWV0aG9kIHdpbGwgd29yayB3aXRoIGFueSBYTUwKLSAgICBwYXJzZXIgdGhhdCB3aWxsIHBhc3MgaXQgYSBET00gdHJlZS4KKyAgICAgICAgICAgICAgICAgIDxici8+CisgICAgICA8ZGl2IGNsYXNzPSJpbmRleC1mYXFTZWN0aW9uIj4KKyAgICAgICAgU2VjdGlvbiAxLiA8YSBocmVmPSIjMSI+IEdlbmVyYWxpdGllczwvYT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMS4xPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMS4xIj5XaGF0IGlzIGxvZzRqPzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMS4yPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMS4yIj5JcyBsb2c0aiBhIHJlbGlhYmxlIGxvZ2dpbmcgc3lzdGVtPzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMS4zPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMS4zIj5XaGF0IGFyZSB0aGUgcHJlcmVxdWlzaXRlcyBmb3IgbG9nNGo/PC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAxLjQ8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMxLjQiPldoYXQgYXJlIHRoZSBmZWF0dXJlcyBvZiBsb2c0aj88L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDEuNTwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzEuNSI+SXMgdGhlcmUgZXhhbXBsZSBjb2RlIGZvciB1c2luZyBsb2c0aj88L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDEuNjwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzEuNiI+V2hhdCBkb2N1bWVudGF0aW9uIHNob3VsZCBJIHJlYWQgdG8gbGVhcm4gbW9yZSBhYm91dAorICAgICAgbG9nNGo/PC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAxLjc8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMxLjciPklzIGxvZzRqIHRocmVhZC1zYWZlPzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMS44PC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMS44Ij5XaGF0IGRvZXMgbG9nIG91dHB1dCBsb29rIGxpa2U/PC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAxLjk8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMxLjkiPldoeSBzaG91bGQgSSB1c2UgbG9nNGogd2hlbiBKREsgMS40IGFscmVhZHkgc2hpcHMgd2l0aCBhCisgICAgICBsb2dnaW5nIEFQST88L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgorICAgICAgPGRpdiBjbGFzcz0iaW5kZXgtZmFxU2VjdGlvbiI+CisgICAgICAgIFNlY3Rpb24gMi4gPGEgaHJlZj0iIzIiPiBVc2luZyBsb2c0ajwvYT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMi4xPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMi4xIj5XaGF0IGFyZSA8ZW0+TG9nZ2VyczwvZW0+PzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMi4yPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMi4yIj5Ib3cgY2FuIEkgY2hhbmdlIGxvZyBiZWhhdmlvciBhdCBydW50aW1lPzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMi4zPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMi4zIj5XaGF0IGlzIHRoZSBmYXN0ZXN0IHdheSBvZiAobm90KSBsb2dnaW5nPzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMi40PC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMi40Ij4gQXJlIHRoZXJlIGFueSBzdWdnZXN0ZWQgd2F5cyBmb3IgbmFtaW5nIGxvZ2dlcnM/PC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAyLjU8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMyLjUiPkhvdyBkbyBJIGdldCB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBpbiBhIHN0YXRpYyBibG9jaz88L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDIuNjwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzIuNiI+Q2FuIHRoZSBsb2cgb3V0cHV0IGZvcm1hdCBiZSBjdXN0b21pemVkPyA8L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDIuNzwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzIuNyI+V2hhdCBhcmUgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zIGZvciA8Y29kZT5Gb29CYXJBcHBlbmRlcjwvY29kZT4/PC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAyLjg8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMyLjgiPldoYXQgaXMgdGhlIHJlY29tbWVuZGVkIHdheSBvZiBtaWdyYXRpbmcgZnJvbQorICAgICAgamF2YS51dGlsLmxvZ2dpbmcgdG8gbG9nNGo/PC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAyLjk8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMyLjkiPklzIGl0IHBvc3NpYmxlIHRvIGRpcmVjdCBsb2cgb3V0cHV0IHRvCisgICAgICBkaWZmZXJlbnQgYXBwZW5kZXJzIGJ5IGxldmVsPyA8L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDIuMTA8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMyLjEwIj5XaGF0IGRvZXMgdGhlIFdpbmRvd3MgTlQgRXZlbnQgVmlld2VyIGNvbXBsYWluIGFib3V0CisgICAgICBtaXNzaW5nIGRlc2NyaXB0aW9ucyBmb3IgbXkgZXZlbnQgbWVzc2FnZXMgd2hlbiBJIHVzZSB0aGUKKyAgICAgIDxjb2RlPk5URXZlbnRMb2dBcHBlbmRlcjwvY29kZT4/PC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAyLjExPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMi4xMSI+V2h5IGNhbid0IEkgbWFwIG15IGxvZ2dlciBuYW1lcyB0byB0aGUgbG9nZ2VycyB0aGF0CisgICAgICBhcHBlYXIgaW4gdGhlIE5UIEV2ZW50IExvZyB3aGVuIEkgdXNlIHRoZQorICAgICAgTlRFdmVudExvZ0FwcGVuZGVyPzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMi4xMjwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzIuMTIiPkFyZSB0aGVyZSBzdWdnZXN0ZWQgYXBwcm9hY2hlcyBmb3IgbG9nZ2luZyBpbiBKU1AgcGFnZXM/PC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KKyAgICAgIDxkaXYgY2xhc3M9ImluZGV4LWZhcVNlY3Rpb24iPgorICAgICAgICBTZWN0aW9uIDMuIDxhIGhyZWY9IiMzIj4gQWR2YW5jZWQgcXVlc3Rpb25zPC9hPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAzLjE8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMzLjEiPkNhbiB0aGUgb3V0cHV0cyBvZiBtdWx0aXBsZSBjbGllbnQgcmVxdWVzdCBnbyB0bworICAgICAgZGlmZmVyZW50IGxvZyBmaWxlcz88L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDMuMjwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzMuMiI+TG9nZ2VyIGluc3RhbmNlcyBzZWVtIHRvIGJlIGNyZWF0ZSBvbmx5LiBXaHkgaXNuJ3QKKyAgICAgIHRoZXJlIGEgbWV0aG9kIHRvIHJlbW92ZSBsb2dnZXIgaW5zdGFuY2VzPzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gMy4zPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjMy4zIj5Ib3cgZG8gSSBnZXQgbXVsdGlwbGUgcHJvY2VzcyB0byBsb2cgdG8gdGhlIHNhbWUgZmlsZT88L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDMuNDwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzMuNCI+SG93IGFib3V0IHRoZSB0aW1lc2FtcHMgb2YgZXZlbnRzIGdlbmVyYXRlZCBieSBtdWx0aXBsZQorICAgICAgcHJvY2Vzc2VzIGFjcm9zcyBtdWx0aXBsZSBob3N0cyAocG9zc2libHkgYWNyb3NzIG11bHRpcGxlCisgICAgICB0aW1lem9uZXMpPworICAgICAgPC9hPjwvdGQ+ICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJpbmRleC1xdWVzdGlvbiI+CisgICAgICAgICAgICAgIDx0ZCBub3dyYXA9InRydWUiIHZhbGlnbj0idG9wIj5RdWVzdGlvbiAzLjU8L3RkPgkgICAgICAKKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiMzLjUiPldoeSBjYW4ndCBsb2c0aiBmaW5kIG15IHByb3BlcnRpZXMgZmlsZSBpbiBhIEoyRUUgb3IgV0FSCisgICAgICBhcHBsaWNhdGlvbj88L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDMuNjwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzMuNiI+SXMgdGhlcmUgYSB3YXkgdG8gZ2V0IGxvZzRqIHRvIGF1dG9tYXRpY2FsbHkgcmVsb2FkIGEKKyAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBpZiBpdCBjaGFuZ2VzPzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CisgICAgICA8ZGl2IGNsYXNzPSJpbmRleC1mYXFTZWN0aW9uIj4KKyAgICAgICAgU2VjdGlvbiA0LiA8YSBocmVmPSIjNCI+IENvbnRyaWJ1dGluZyB0byB0aGUgcHJvamVjdDwvYT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iaW5kZXgtcXVlc3Rpb24iPgorICAgICAgICAgICAgICA8dGQgbm93cmFwPSJ0cnVlIiB2YWxpZ249InRvcCI+UXVlc3Rpb24gNC4xPC90ZD4JICAgICAgCisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjNC4xIj5XaHkgc2hvdWxkIEkgZG9uYXRlIG15IGV4dGVuc2lvbnMgdG8gbG9nNGogYmFjayB0byB0aGUKKyAgICAgIHByb2plY3Q/CisgICAgICA8L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDQuMjwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzQuMiI+V2hhdCBzaG91bGQgSSBrZWVwIGluIG1pbmQgd2hlbiBjb250cmlidXRpbmcgY29kZT88L2E+PC90ZD4gICAgICAgICAgIAorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImluZGV4LXF1ZXN0aW9uIj4KKyAgICAgICAgICAgICAgPHRkIG5vd3JhcD0idHJ1ZSIgdmFsaWduPSJ0b3AiPlF1ZXN0aW9uIDQuMzwvdGQ+CSAgICAgIAorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iIzQuMyI+SG93IGNhbiBJIGNvbnRyaWJ1dGUgYSBuZXcgcXVlc3Rpb24vYW5zd2VyIHRvIHRoaXMKKyAgICAgIGRvY3VtZW50PzwvYT48L3RkPiAgICAgICAgICAgCisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHIvPgorCisgIAorICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmFxU2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IjEiPlNlY3Rpb24gMS48L2E+IEdlbmVyYWxpdGllcworICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIDxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBnZW5lcmFsIHF1ZXN0aW9ucyBhYm91dCBsb2c0ai48L3A+CiAgICAgCi0gICAgPHA+VGhlIERPTUNvbmZpZ3VyYXRvci5jb25maWd1cmUoU3RyaW5nIGZpbGVuYW1lKSBtZXRob2QgYW5kIGl0cwotICAgIHZhcmlhbnRzIHJlcXVpcmUgYSBKQVhQIGNvbXBhdGlibGUgWE1MIHBhcnNlciwgZm9yIGV4YW1wbGUgPGEKLSAgICBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvIj5YZXJjZXM8L2E+IG9yIFN1bidzCi0gICAgcGFyc2VyLiBDb21waWxpbmcgdGhlIERPTUNvbmZpZ3VyYXRvciByZXF1aXJlcyB0aGUgcHJlc2VuY2Ugb2YgYQotICAgIEpBWFAgcGFyc2VyIGluIHRoZSBjbGFzc3BhdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMS4xIj4xLjEgV2hhdCBpcyBsb2c0aj88L2E+CisgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgIAorCTxwPmxvZzRqIGlzIGEgdG9vbCB0byBoZWxwIHRoZSBwcm9ncmFtbWVyIG91dHB1dCBsb2cgc3RhdGVtZW50cyB0byBhCisJdmFyaWV0eSBvZiBvdXRwdXQgdGFyZ2V0cy4KKwk8L3A+CiAKLSAgICA8cD48bGk+VGhlIDxjb2RlPm9yZy5hcGFjaGUubG9nNGoubmV0LlNNVFBBcHBlbmRlcjwvY29kZT4gcmVsaWVzCi0gICAgb24gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwvIj5KYXZhTWFpbAotICAgIEFQSTwvYT4uIEl0IGhhcyBiZWVuIHRlc3RlZCB3aXRoIEphdmFNYWlsIEFQSSB2ZXJzaW9uIDEuMi4gVGhlCi0gICAgSmF2YU1haWwgQVBJIHJlcXVpcmVzIHRoZSA8YQotICAgIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vYmVhbnMvZ2xhc2dvdy9qYWYuaHRtbCI+SmF2YUJlYW5zCi0gICAgQWN0aXZhdGlvbiBGcmFtZXdvcms8L2E+IHBhY2thZ2UuCi0gICAgCi0gICAgPHA+PGxpPlRoZSA8Y29kZT5vcmcuYXBhY2hlLmxvZzRqLm5ldC5KTVNBcHBlbmRlcjwvY29kZT4gcmVxdWlyZXMKLSAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIEpNUyBBUEkgYXMgd2VsbCBhcyBKTkRJLgorCTxwPkluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCBhbiBhcHBsaWNhdGlvbiwgaXQgaXMgaGVscGZ1bCB0bworCWVuYWJsZSBsb2dnaW5nIHNvIHRoYXQgdGhlIHByb2JsZW0gY2FuIGJlIGxvY2F0ZWQuIFdpdGggbG9nNGoKKwlpdCBpcyBwb3NzaWJsZSB0byBlbmFibGUgbG9nZ2luZyBhdCBydW50aW1lIHdpdGhvdXQgbW9kaWZ5aW5nCisJdGhlIGFwcGxpY2F0aW9uIGJpbmFyeS4gIFRoZSBsb2c0aiBwYWNrYWdlIGlzIGRlc2lnbmVkIHNvIHRoYXQKKwlsb2cgc3RhdGVtZW50cyBjYW4gcmVtYWluIGluIDxpPnNoaXBwZWQ8L2k+IGNvZGUgd2l0aG91dAorCWluY3VycmluZyBhIGhpZ2ggcGVyZm9ybWFuY2UgY29zdC4gSXQgZm9sbG93cyB0aGF0IHRoZSBzcGVlZAorCW9mIGxvZ2dpbmcgKG9yIHJhdGhlciBub3QgbG9nZ2luZykgaXMgY2FwaXRhbC4KKwk8L3A+CiAKKwk8cD5BdCB0aGUgc2FtZSB0aW1lLCBsb2cgb3V0cHV0IGNhbiBiZSBzbyB2b2x1bWlub3VzIHRoYXQgaXQgcXVpY2tseQorCWJlY29tZXMgb3ZlcndoZWxtaW5nLiBPbmUgb2YgdGhlIGRpc3RpbmN0aXZlIGZlYXR1cmVzIG9mIGxvZzRqIGlzIHRoZQorCW5vdGlvbiBvZiA8aT5oaWVyYXJjaGljYWwgbG9nZ2VyczwvaT4uIFVzaW5nIGxvZ2dlcnMgaXQgaXMKKwlwb3NzaWJsZSB0byBzZWxlY3RpdmVseSBjb250cm9sIHdoaWNoIGxvZyBzdGF0ZW1lbnRzIGFyZSBvdXRwdXQgYXQKKwlhcmJpdHJhcnkgIGdyYW51bGFyaXR5LgorCTwvcD4KIAotICAgIDxwPjxsaT5sb2c0aiB0ZXN0IGNvZGUgcmVsaWVzIG9uIHRoZSA8YQotICAgIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnIj5KVW5pdDwvYT4gdGVzdGluZyBmcmFtZXdvcmsuCi0KLTwvdWw+ICAgIAotCi08YSBuYW1lPXVzYWdlRXhhbXBsZT48aDQ+SXMgdGhlcmUgZXhhbXBsZSBjb2RlIGZvciB1c2luZyBsb2c0aj88L2g0PgotCi08cD5TZWUgdGhlIDxjb2RlPmV4YW1wbGVzLzwvY29kZT4gZGlyZWN0b3J5LgotCi08YSBuYW1lPWZlYXR1cmVzPjxoNCBpZD0iIj5XaGF0IGFyZSB0aGUgZmVhdHVyZXMgb2YgbG9nNGo/PC9oND4KLQotPHVsPgotCi0gIDxwPjxsaT5sb2c0aiBpcyBvcHRpbWl6ZWQgZm9yIHNwZWVkLgotCi0gIDxwPjxsaT5sb2c0aiBpcyBiYXNlZCBvbiBhIG5hbWVkIGxvZ2dlciBoaWVyYXJjaHkuCisJPHA+bG9nNGogaXMgZGVzaWduZWQgd2l0aCB0d28gdGhyZWUgZ29hbHMgaW4gbWluZDoKKwlyZWxpYWJpbGl0eSwgc3BlZWQgYW5kIGZsZXhpYmlsaXR5LiBUaGVyZSBpcyBhIHRpZ2h0IGJhbGFuY2UKKwliZXR3ZWVuIHRoZXNlIHJlcXVpcmVtZW50cy4gV2UgYmVsaWV2ZSB0aGF0IGxvZzRqIHN0cmlrZXMgdGhlCisJcmlnaHQgYmFsYW5jZS4KKwk8L3A+CiAgICAgICAKLSAgPHA+PGxpPmxvZzRqIGlzIGZhaWwtc3RvcCBidXQgbm90IHJlbGlhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjEuMiI+MS4yIElzIGxvZzRqIGEgcmVsaWFibGUgbG9nZ2luZyBzeXN0ZW0/PC9hPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAKKwk8cD5Oby4gbG9nNGogaXMgbm90IHJlbGlhYmxlLiBJdCBpcyBhIGJlc3QtZWZmb3J0IAorCTxlbT5mYWlsLXN0b3A8L2VtPiBsb2dnaW5nIHN5c3RlbS4KKwk8L3A+CiAKLSAgPHA+PGxpPmxvZzRqIGlzIHRocmVhZC1zYWZlLgorCTxwPkJ5IGZhaWwtc3RvcCwgd2UgbWVhbiB0aGF0IGxvZzRqIHdpbGwgbm90IHRocm93IHVuZXhwZWN0ZWQKKwlleGNlcHRpb25zIGF0IHJ1bi10aW1lIHBvdGVudGlhbGx5IGNhdXNpbmcgeW91ciBhcHBsaWNhdGlvbiB0bworCWNyYXNoLiA8Yj5JZiBmb3IgYW55IHJlYXNvbiwgbG9nNGogdGhyb3dzIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiwKKwlwbGVhc2Ugc2VuZCBhbiBlbWFpbCB0byB0aGUgPGEgaHJlZj0ibWFpbHRvOmxvZzRqLXVzZXJAbG9nZ2luZy5hcGFjaGUub3JnIj5sb2c0ai11c2VyQGxvZ2dpbmcuYXBhY2hlLm9yZzwvYT4KKwltYWlsaW5nIGxpc3Q8L2I+LiBVbmNhdWdodCBleGNlcHRpb25zIGFyZSBoYW5kbGVkIGFzIHNlcmlvdXMgYnVncworCXJlcXVpcmluZyBpbW1lZGlhdGUgYXR0ZW50aW9uLgorCTwvcD4KIAotICA8cD48bGk+bG9nNGogaXMgbm90IHJlc3RyaWN0ZWQgdG8gYSBwcmVkZWZpbmVkIHNldCBvZiBmYWNpbGl0aWVzLgotCi0gIDxwPjxsaT5Mb2dnaW5nIGJlaGF2aW9yIGNhbiBiZSBzZXQgYXQgcnVudGltZSB1c2luZyBhIGNvbmZpZ3VyYXRpb24KLSAgICAgIGZpbGUuIENvbmZpZ3VyYXRpb24gZmlsZXMgY2FuIGJlIHByb3BlcnR5IGZpbGVzIG9yIGluIFhNTCBmb3JtYXQuCisJPHA+TW9yZW92ZXIsIGxvZzRqIHdpbGwgbm90IHJldmVydCB0byBTeXN0ZW0ub3V0IG9yIFN5c3RlbS5lcnIKKwl3aGVuIGl0cyBkZXNpZ25hdGVkIG91dHB1dCBzdHJlYW0gaXMgbm90IG9wZW5lZCwgaXMgbm90IHdyaXRhYmxlIG9yCisJYmVjb21lcyBmdWxsLiBUaGlzIGF2b2lkcyBjb3JydXB0aW5nIGFuIG90aGVyd2lzZSB3b3JraW5nIHByb2dyYW0gYnkKKwlmbG9vZGluZyB0aGUgdXNlcidzIHRlcm1pbmFsIGJlY2F1c2UgbG9nZ2luZyBmYWlscy4gSG93ZXZlciwgbG9nNGoKKwl3aWxsIG91dHB1dCBhIHNpbmdsZSBtZXNzYWdlIHRvIFN5c3RlbS5lcnIgaW5kaWNhdGluZyB0aGF0IGxvZ2dpbmcgY2FuCisJbm90IGJlIHBlcmZvcm1lZC4KKwk8L3A+CiAgICAgICAKLSAgPHA+PGxpPmxvZzRqIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSBKYXZhIEV4Y2VwdGlvbnMgZnJvbSB0aGUgc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMS4zIj4xLjMgV2hhdCBhcmUgdGhlIHByZXJlcXVpc2l0ZXMgZm9yIGxvZzRqPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJPHVsPgorCSAgPGxpPjxwPkxvZzRqIHZlcnNpb25zIHVwdG8gYW5kIGluY2x1ZGluZyAxLjIuOCBhcmUKKwkgIGNvbXBhdGlibGUgd2l0aCBKREsgMS4xLnggYW5kIGxhdGVyLiAgTG9nNGogdmVyc2lvbiAxLjMgd2lsbAorCSAgYmUgY29tcGF0aWxibGUgd2l0aCBKREsgMS4yIGFuZCBsYXRlci4KKwkgIDwvcD48L2xpPgorCisJICA8bGk+PHA+VGhlIERPTUNvbmZpZ3VyYXRvciBpcyBiYXNlZCBvbiB0aGUgRE9NIExldmVsIDEKKwkgIEFQSS4gVGhlIERPTUNvbmZpZ3VyYXRvci5jb25maWd1cmUoRWxlbWVudCkgbWV0aG9kIHdpbGwgd29yaworCSAgd2l0aCBhbnkgWE1MIHBhcnNlciB0aGF0IHdpbGwgcGFzcyBpdCBhIERPTSB0cmVlLgorCSAgPC9wPgorCSAgPHA+VGhlIERPTUNvbmZpZ3VyYXRvci5jb25maWd1cmUoU3RyaW5nIGZpbGVuYW1lKSBtZXRob2QgYW5kIGl0cworCSAgdmFyaWFudHMgcmVxdWlyZSBhIEpBWFAgY29tcGF0aWJsZSBYTUwgcGFyc2VyLCBmb3IgZXhhbXBsZSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvIj5YZXJjZXM8L2E+IG9yIFN1bidzCisJICBwYXJzZXIuIENvbXBpbGluZyB0aGUgRE9NQ29uZmlndXJhdG9yIHJlcXVpcmVzIHRoZSBwcmVzZW5jZSBvZiBhCisJICBKQVhQIHBhcnNlciBpbiB0aGUgY2xhc3NwYXRoLgorCSAgPC9wPgorCSAgPC9saT4KKworCSAgPGxpPjxwPlRoZSA8Y29kZT5vcmcuYXBhY2hlLmxvZzRqLm5ldC5TTVRQQXBwZW5kZXI8L2NvZGU+CisJICByZWxpZXMgb24gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwvIj5KYXZhTWFpbAorCSAgQVBJPC9hPi4gSXQgaGFzIGJlZW4gdGVzdGVkIHdpdGggSmF2YU1haWwgQVBJIHZlcnNpb24KKwkgIDEuMi4gVGhlIEphdmFNYWlsIEFQSSByZXF1aXJlcyB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9iZWFucy9nbGFzZ293L2phZi5odG1sIj5KYXZhQmVhbnMKKwkgIEFjdGl2YXRpb24gRnJhbWV3b3JrPC9hPiBwYWNrYWdlLgorCSAgPC9wPjwvbGk+CisKKwkgIDxsaT48cD5UaGUgPGNvZGU+b3JnLmFwYWNoZS5sb2c0ai5uZXQuSk1TQXBwZW5kZXI8L2NvZGU+CisJICByZXF1aXJlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlIEpNUyBBUEkgYXMgd2VsbCBhcyBKTkRJLgorCSAgPC9wPjwvbGk+CisKKwkgIDxsaT48cD5sb2c0aiB0ZXN0IGNvZGUgcmVsaWVzIG9uIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZyI+SlVuaXQ8L2E+IHRlc3RpbmcgZnJhbWV3b3JrLgorCSAgPC9wPjwvbGk+CisJPC91bD4gICAgCQogICAgICAgCi0gIDxwPjxsaT5sb2c0aiBjYW4gZGlyZWN0IGl0cyBvdXRwdXQgdG8gYSBmaWxlLCB0aGUgY29uc29sZSwgYW4KLSAgICAgIDxjb2RlPmphdmEuaW8uT3V0cHV0U3RyZWFtPC9jb2RlPiwgPGNvZGU+amF2YS5pby5Xcml0ZXI8L2NvZGU+LAotICAgICAgYSByZW1vdGUgc2VydmVyIHVzaW5nIFRDUCwgYSByZW1vdGUgVW5peCBTeXNsb2cgZGFlbW9uLCB0byBhCi0gICAgICByZW1vdGUgbGlzdGVuZXIgdXNpbmcgSk1TLCB0byB0aGUgTlQgRXZlbnRMb2cgb3IgZXZlbiBzZW5kIGUtbWFpbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InF1ZXN0aW9uIj4KKyAgICAgICAgICAgICA8YSBuYW1lPSIxLjQiPjEuNCBXaGF0IGFyZSB0aGUgZmVhdHVyZXMgb2YgbG9nNGo/PC9hPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAKKwk8dWw+CiAKLSAgPHA+PGxpPmxvZzRqIHVzZXMgNSBsZXZlbHMsIG5hbWVseSBERUJVRywgSU5GTywgV0FSTiwgRVJST1IgYW5kCi0gIEZBVEFMLgorCSAgPGxpPjxwPmxvZzRqIGlzIG9wdGltaXplZCBmb3Igc3BlZWQuPC9wPjwvbGk+CiAKLSAgPHA+PGxpPlRoZSBmb3JtYXQgb2YgdGhlIGxvZyBvdXRwdXQgY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGJ5Ci0gICAgICBleHRlbmRpbmcgdGhlIExheW91dCBjbGFzcy4KKwkgIDxsaT48cD5sb2c0aiBpcyBiYXNlZCBvbiBhIG5hbWVkIGxvZ2dlciBoaWVyYXJjaHkuPC9wPjwvbGk+CisJICAKKwkgIDxsaT48cD5sb2c0aiBpcyBmYWlsLXN0b3AuIEhvd2V2ZXIsIGFsdG91Z2ggaXQgY2VydGFpbmx5CisJICBzdHJpdmVzIHRvIGVuc3VyZSBkZWxpdmVyeSwgbG9nNGogZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQKKwkgIGVhY2ggbG9nIHN0YXRlbWVudCB3aWxsIGJlIGRlbGl2ZXJlZCB0byBpdHMgZGVzdGluYXRpb24uCisJICA8L3A+PC9saT4KIAotICA8cD48bGk+VGhlIHRhcmdldCBvZiB0aGUgbG9nIG91dHB1dCBhcyB3ZWxsIGFzIHRoZSB3cml0aW5nIHN0cmF0ZWd5Ci0gICAgICBjYW4gYmUgYWx0ZXJlZCBieSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIEFwcGVuZGVyIGludGVyZmFjZS4KKwkgIDxsaT48cD5sb2c0aiBpcyB0aHJlYWQtc2FmZS48L3A+PC9saT4KIAotICAgPHA+PGxpPmxvZzRqIHN1cHBvcnRzIG11bHRpcGxlIG91dHB1dCBhcHBlbmRlcnMgcGVyIGxvZ2dlci4KKwkgIDxsaT48cD5sb2c0aiBpcyBub3QgcmVzdHJpY3RlZCB0byBhIHByZWRlZmluZWQgc2V0IG9mCisJICBmYWNpbGl0aWVzLjwvcD48L2xpPgogCi0gICA8cD48bGk+bG9nNGogc3VwcG9ydHMgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gICAgICAgCi08L3VsPgorCSAgPGxpPjxwPkxvZ2dpbmcgYmVoYXZpb3IgY2FuIGJlIHNldCBhdCBydW50aW1lIHVzaW5nIGEKKwkgIGNvbmZpZ3VyYXRpb24gZmlsZS4gQ29uZmlndXJhdGlvbiBmaWxlcyBjYW4gYmUgcHJvcGVydHkKKwkgIGZpbGVzIG9yIGluIFhNTCBmb3JtYXQuICA8L3A+PC9saT4KIAotPGEgbmFtZT10aHJlYWQtc2FmZXR5PjxoNCBpZD0iIj5JcyBsb2c0aiB0aHJlYWQtc2FmZT88L2g0PgorCSAgPGxpPjxwPmxvZzRqIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSBKYXZhIEV4Y2VwdGlvbnMgZnJvbSB0aGUKKwkgIHN0YXJ0LjwvcD48L2xpPgorCSAgCisJICA8bGk+PHA+bG9nNGogY2FuIGRpcmVjdCBpdHMgb3V0cHV0IHRvIGEgZmlsZSwgdGhlIGNvbnNvbGUsCisJICBhbiA8Y29kZT5qYXZhLmlvLk91dHB1dFN0cmVhbTwvY29kZT4sCisJICA8Y29kZT5qYXZhLmlvLldyaXRlcjwvY29kZT4sIGEgcmVtb3RlIHNlcnZlciB1c2luZyBUQ1AsIGEKKwkgIHJlbW90ZSBVbml4IFN5c2xvZyBkYWVtb24sIHRvIGEgcmVtb3RlIGxpc3RlbmVyIHVzaW5nIEpNUywKKwkgIHRvIHRoZSBOVCBFdmVudExvZyBvciBldmVuIHNlbmQgZS1tYWlsLiAgPC9wPjwvbGk+CiAKLVllcywgbG9nNGogaXMgdGhyZWFkLXNhZmUuIAorCSAgPGxpPjxwPmxvZzRqIHVzZXMgNSBsZXZlbHMsIG5hbWVseSBERUJVRywgSU5GTywgV0FSTiwgRVJST1IgYW5kCisJICBGQVRBTC4KKwkgIDwvcD48L2xpPgogCi08YSBuYW1lPXNhbXBsZT48aDQgaWQ9IiI+V2hhdCBkb2VzIGxvZyBvdXRwdXQgbG9vayBsaWtlPzwvaDQ+CisJICA8bGk+PHA+VGhlIGZvcm1hdCBvZiB0aGUgbG9nIG91dHB1dCBjYW4gYmUgZWFzaWx5IGNoYW5nZWQgYnkKKwkgIGV4dGVuZGluZyB0aGUgPGNvZGU+TGF5b3V0PC9jb2RlPgorICAgICAgICAgIGNsYXNzLiAgPC9wPjwvbGk+CiAKLVRoZSBsb2cgb3V0cHV0IGNhbiBiZSBjdXN0b21pemVkIGluIG1hbnkgd2F5cy4gTW9yZW92ZXIsIG9uZSBjYW4gY29tcGxldGVseQotb3ZlcnJpZGUgdGhlIG91dHB1dCBmb3JtYXQgYnkgaW1wbGVtZW50aW5nIG9uZSdzIG93biBMYXlvdXQuIAorCSAgPGxpPjxwPlRoZSB0YXJnZXQgb2YgdGhlIGxvZyBvdXRwdXQgYXMgd2VsbCBhcyB0aGUgd3JpdGluZworCSAgc3RyYXRlZ3kgY2FuIGJlIGFsdGVyZWQgYnkgaW1wbGVtZW50YXRpb25zIG9mIHRoZQorCSAgPGNvZGU+QXBwZW5kZXI8L2NvZGU+IGludGVyZmFjZS4gIDwvcD48L2xpPgogCi08cD5IZXJlIGlzIGFuIGV4YW1wbGUgb3V0cHV0IHVzaW5nIDxlbT5QYXR0ZXJuTGF5b3V0PC9lbT4gd2l0aAotdGhlIGNvbnZlcnNpb24gcGF0dGVybiA8Yj4iJXIgWyV0XSAlLTVwICVjezJ9ICV4IC0gJW0lbiI8L2I+CisJICA8bGk+PHA+bG9nNGogc3VwcG9ydHMgbXVsdGlwbGUgb3V0cHV0IGFwcGVuZGVycyBwZXIgbG9nZ2VyLgorCSAgPC9wPjwvbGk+CiAKLTxwcmU+CisJICA8bGk+PHA+bG9nNGogc3VwcG9ydHMgaW50ZXJuYXRpb25hbGl6YXRpb24uPC9wPjwvbGk+CisJPC91bD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjEuNSI+MS41IElzIHRoZXJlIGV4YW1wbGUgY29kZSBmb3IgdXNpbmcgbG9nNGo/PC9hPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAKKwk8cD5TZWUgdGhlIDxjb2RlPmV4YW1wbGVzLzwvY29kZT4gZGlyZWN0b3J5LjwvcD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjEuNiI+MS42IFdoYXQgZG9jdW1lbnRhdGlvbiBzaG91bGQgSSByZWFkIHRvIGxlYXJuIG1vcmUgYWJvdXQKKyAgICAgIGxvZzRqPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJPHA+TWFrZSBzdXJlIHRvIHJlYWQgdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sIj5zaG9ydAorCW1hbnVhbDwvYT4uIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdG8geW91IHJlYWQgPGEgaHJlZj0iaHR0cHM6Ly93d3cucW9zLmNoL3Nob3AvcHJvZHVjdHMvbG9nNGovbG9nNGotTWFudWFsLmpzcCI+VGhlIGNvbXBsZXRlCisJbG9nNGogbWFudWFsPC9hPiB3aGljaCBpcyBtdWNoIG1vcmUgZGV0YWlsZWQgYW5kIHVwIHRvCisJZGF0ZS4gQm90aCBkb2N1bWVudHMgd2VyZSB3cml0dGVuIGJ5IENla2kgR/xsY/wuCisJPC9wPgorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMS43Ij4xLjcgSXMgbG9nNGogdGhyZWFkLXNhZmU/PC9hPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAKKwk8cD5ZZXMsIGxvZzRqIGlzIHRocmVhZC1zYWZlLiBMb2c0aiBjb21wb25lbnRzIGFyZSBkZXNpZ25lZCB0bworCWJlIHVzZWQgaW4gaGVhdmlseSBtdWx0aXRocmVhZGVkIHN5c3RlbXMuPC9wPgorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMS44Ij4xLjggV2hhdCBkb2VzIGxvZyBvdXRwdXQgbG9vayBsaWtlPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisKKwk8cD5UaGUgbG9nIG91dHB1dCBjYW4gYmUgY3VzdG9taXplZCBpbiBtYW55IHdheXMuIE1vcmVvdmVyLAorCW9uZSBjYW4gY29tcGxldGVseSBvdmVycmlkZSB0aGUgb3V0cHV0IGZvcm1hdCBieSBpbXBsZW1lbnRpbmcKKwlvbmUncyBvd24gTGF5b3V0LgorCTwvcD4KKworCTxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvdXRwdXQgdXNpbmcgPGVtPlBhdHRlcm5MYXlvdXQ8L2VtPiB3aXRoCisJdGhlIGNvbnZlcnNpb24gcGF0dGVybiA8Yj4iJXIgWyV0XSAlLTVwICVjezJ9ICV4IC0gJW0lbiI8L2I+CisJPC9wPgorCisJPHByZSBjbGFzcz0ic2NyZWVuX291dHB1dCI+CiAxNzYgW21haW5dIElORk8gIGV4YW1wbGVzLlNvcnQgLSBQb3B1bGF0aW5nIGFuIGFycmF5IG9mIDIgZWxlbWVudHMgaW4gcmV2ZXJzZSBvcmRlci4KIDIyNSBbbWFpbl0gSU5GTyAgZXhhbXBsZXMuU29ydEFsZ28gLSBFbnRlcmVkIHRoZSBzb3J0IG1ldGhvZC4KIDI2MiBbbWFpbl0gREVCVUcgU29ydEFsZ28uT1VURVIgaT0xIC0gT3V0ZXIgbG9vcC4KQEAgLTIyMCwzOTQgKzQxNiw3MDEgQEAKICAgICAgICAgYXQgb3JnLmxvZzRqLmV4YW1wbGVzLlNvcnRBbGdvLmR1bXAoU29ydEFsZ28uamF2YTo1OCkKICAgICAgICAgYXQgb3JnLmxvZzRqLmV4YW1wbGVzLlNvcnQubWFpbihTb3J0LmphdmE6NjQpCiA0NjcgW21haW5dIElORk8gIGV4YW1wbGVzLlNvcnQgLSBFeGl0aW5nIG1haW4gbWV0aG9kLgotPC9wcmU+CisJPC9wcmU+CiAKLTxwPlRoZSBmaXJzdCBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHRoZQotc3RhcnQgb2YgdGhlIHByb2dyYW0uIFRoZSBzZWNvbmQgZmllbGQgaXMgdGhlIHRocmVhZCBvdXRwdXR0aW5nIHRoZQotbG9nIHN0YXRlbWVudC4gVGhlIHRoaXJkIGZpZWxkIGlzIHRoZSBsZXZlbCBvZiB0aGUgbG9nCi1zdGF0ZW1lbnQuIFRoZSBmb3VydGggZmllbGQgaXMgdGhlIHJpZ2h0bW9zdCB0d28gY29tcG9uZW50cyBvZiB0aGUKLWxvZ2dlciBtYWtpbmcgdGhlIGxvZyByZXF1ZXN0LiBUaGUgZmlmdGggZmllbGQgKGp1c3QgYmVmb3JlIHRoZSAnLScpCi1pcyB0aGUgPGVtPm5lc3RlZCBkaWFnbm9zdGljIGNvbnRleHQ8L2VtPiAoTkRDKS4gTm90ZSB0aGUgbmVzdGVkIGRpYWdub3N0aWMKLWNvbnRleHQgbWF5IGJlIGVtcHR5IGFzIGluIHRoZSBmaXJzdCB0d28gc3RhdGVtZW50cy4gVGhlIHRleHQgYWZ0ZXIKLXRoZSAnLScgaXMgdGhlIG1lc3NhZ2Ugb2YgdGhlIHN0YXRlbWVudC4KKwk8cD5UaGUgZmlyc3QgZmllbGQgaXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZWxhcHNlZCBzaW5jZQorCXRoZSBzdGFydCBvZiB0aGUgcHJvZ3JhbS4gVGhlIHNlY29uZCBmaWVsZCBpcyB0aGUgdGhyZWFkCisJb3V0cHV0dGluZyB0aGUgbG9nIHN0YXRlbWVudC4gVGhlIHRoaXJkIGZpZWxkIGlzIHRoZSBsZXZlbCBvZgorCXRoZSBsb2cgc3RhdGVtZW50LiBUaGUgZm91cnRoIGZpZWxkIGlzIHRoZSByaWdodG1vc3QgdHdvCisJY29tcG9uZW50cyBvZiB0aGUgbG9nZ2VyIG1ha2luZyB0aGUgbG9nIHJlcXVlc3QuIFRoZSBmaWZ0aAorCWZpZWxkIChqdXN0IGJlZm9yZSB0aGUgJy0nKSBpcyB0aGUgPGVtPm5lc3RlZCBkaWFnbm9zdGljCisJY29udGV4dDwvZW0+IChOREMpLiBOb3RlIHRoZSBuZXN0ZWQgZGlhZ25vc3RpYyBjb250ZXh0IG1heSBiZQorCWVtcHR5IGFzIGluIHRoZSBmaXJzdCB0d28gc3RhdGVtZW50cy4gVGhlIHRleHQgYWZ0ZXIgdGhlICctJworCWlzIHRoZSBtZXNzYWdlIG9mIHRoZSBzdGF0ZW1lbnQuCisJPC9wPgorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMS45Ij4xLjkgV2h5IHNob3VsZCBJIHVzZSBsb2c0aiB3aGVuIEpESyAxLjQgYWxyZWFkeSBzaGlwcyB3aXRoIGEKKyAgICAgIGxvZ2dpbmcgQVBJPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDxwPgorICAgICAgICBBbHRob3VnaCBib3RoIEFQSXMgYXJlIGNvbmNlcHR1YWxseSBzaW1pbGFyLCB0aGUgbG9nNGogQVBJIGlzCisgICAgICAgIHNpZ25pZmljYW50bHkgbW9yZSBmbGV4aWJsZSBhbmQgb2ZmZXJzIG1hbnkgbW9yZSBmZWF0dXJlcywgdG9vCisgICAgICAgIG51bWVyb3VzIHRvIGJlIGxpc3RlZCBoZXJlLiBZb3Ugd2lsbCBkaXNjb3ZlciB0aGF0IHRoZQorICAgICAgICBhZGRpdGlvbmFsIGZlYXR1cmVzIGFuZCBmbGV4aWJpbGl0eSB0dXJuIG91dCB0byBiZQorICAgICAgICBpbmRpc3BlbnNhYmxlIGluIHRoZSBjb250ZXh0IG9mIGEgbWlzc2lvbi1jcml0aWNhbAorICAgICAgICBhcHBsaWNhdGlvbi4KKyAgICAgICAgPC9wPgogCi08YSBuYW1lPWxvZ2dlcj48aDQgaWQ9IiI+V2hhdCBhcmUgPGVtPkxvZ2dlcnM8L2VtPj88L2g0PgorICAgICAgICA8cD5UaGUgb3BlbiBhbmQgY29sbGFib3JhdGl2ZSB3YXkgaW4gd2hpY2ggbG9nNGogaXMgZGV2ZWxvcHBlZAorICAgICAgICBlbnN1cmVzIHRoYXQgaXQgY29udGludWVzIHRvIHByZXNlcnZlIGFuZCBldmVuIHdpZGVuIGl0cworICAgICAgICBjb21wZXRpdGl2ZSBlZGdlLiBBdCBzb21lIHBvaW50LCBpbnB1dCBmcm9tIGJyaWdodCBkZXZlbG9wZXJzCisgICAgICAgIGZyb20gYWxsIG92ZXIgdGhlIHdvcmxkIGlzIGJvdW5kIHRvIG1ha2UgYSBkaWZmZXJlbmNlLgorICAgICAgICA8L3A+CisgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZhcVNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSIyIj5TZWN0aW9uIDIuPC9hPiBVc2luZyBsb2c0agorICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIDxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBhbnN3ZXJzIHRvIHF1ZXN0aW9ucyBlbmNvdW50ZXJlZCB3aGlsZQorICAgICAgdXNpbmcgbG9nNGouPC9wPgorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjIuMSI+Mi4xIFdoYXQgYXJlIDxlbT5Mb2dnZXJzPC9lbT4/PC9hPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAKKwk8cD5MZ2dlcnMgbGllIGF0IHRoZSBoZWFydCBvZiBsb2c0ai4gTG9nZ2VycyBkZWZpbmUgYSBoaWVyYXJjaHkgYW5kIGdpdmUKKwl0aGUgcHJvZ3JhbW1lciA8ZW0+cnVuLXRpbWU8L2VtPiBjb250cm9sIG9uIHdoaWNoIHN0YXRlbWVudHMgYXJlCisJcHJpbnRlZCBvciBub3QuCisJPC9wPgorCQorCTxwPkxvZ2dlcnMgYXJlIGFzc2lnbmVkIGxldmVscy4gQSBsb2cgc3RhdGVtZW50IGlzIHByaW50ZWQKKwlkZXBlbmRpbmcgb24gaXRzIGxldmVsIDxlbT5hbmQ8L2VtPiBpdHMgbG9nZ2VyLgorCTwvcD4KKwkKKwk8cD5NYWtlIHN1cmUgdG8gcmVhZCB0aGUgPGEgaHJlZj0ibWFudWFsLmh0bWwiPmxvZzRqIG1hbnVhbDwvYT4KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwk8L3A+CQorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMi4yIj4yLjIgSG93IGNhbiBJIGNoYW5nZSBsb2cgYmVoYXZpb3IgYXQgcnVudGltZT88L2E+CisgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgIAorCTxwPkxvZyBiZWhhdmlvciBjYW4gYmUgc2V0IHVzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2hpY2ggYXJlIHBhcnNlZAorCWF0IHJ1bnRpbWUuIFVzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhlIHByb2dyYW1tZXIgY2FuIGRlZmluZQorCWxvZ2dlcnMgYW5kIHNldCB0aGVpciBsZXZlbHMuCisJPC9wPgorCQorCTxwPlRoZSA8Y29kZT5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjwvY29kZT4gZGVmaW5lcyBhIHBhcnRpY3VsYXIgZm9ybWF0CisJb2YgYSBjb25maWd1cmF0aW9uIGZpbGUuIFNlZSBhbHNvIHRoZSA8Y29kZT5leGFtcGxlcy9Tb3J0LmphdmE8L2NvZGU+CisJZXhhbXBsZSBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCTwvcD4KKwkKKwk8cD5Db25maWd1cmF0aW9uIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQgaW4gWE1MLiBTZWUKKwk8Y29kZT5sb2c0ai5kdGQ8L2NvZGU+IGFuZAorCTxjb2RlPm9yZy5sb2c0ai54bWwuRE9NQ29uZmlndXJhdG9yPC9jb2RlPiBmb3IgbW9yZSBkZXRhaWxzLgorCTwvcD4KKwkKKwk8cD5TZWUgdGhlIHZhcmlvdXMgTGF5b3V0IGFuZCBBcHBlbmRlciBjb21wb25lbnRzIGZvciBzcGVjaWZpYworCWNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKwk8L3A+CisJCisJPHA+SW4gYWRkaXRpb24gdG8gY29uZmlndXJhdGlvbiBmaWxlcywgdGhlIHVzZXIgbWF5IGRpc2FibGUgYWxsCisJbWVzc2FnZXMgYmVsb25naW5nIHRvIGEgc2V0IG9mIGxldmVscy4gU2VlIG5leHQgaXRlbS4KKwk8L3A+CisgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InF1ZXN0aW9uIj4KKyAgICAgICAgICAgICA8YSBuYW1lPSIyLjMiPjIuMyBXaGF0IGlzIHRoZSBmYXN0ZXN0IHdheSBvZiAobm90KSBsb2dnaW5nPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCiAKLUxnZ2VycyBsaWUgYXQgdGhlIGhlYXJ0IG9mIGxvZzRqLiBMb2dnZXJzIGRlZmluZSBhIGhpZXJhcmNoeSBhbmQgZ2l2ZQotdGhlIHByb2dyYW1tZXIgPGVtPnJ1bi10aW1lPC9lbT4gY29udHJvbCBvbiB3aGljaCBzdGF0ZW1lbnRzIGFyZQotcHJpbnRlZCBvciBub3QuCisJPHA+IEZvciBzb21lIGxvZ2dlciA8Y29kZT5sPC9jb2RlPiwgd3JpdGluZywgCisJPC9wPgorCQorCTxwcmUgY2xhc3M9InNvdXJjZSI+CisgbC5kZWJ1ZygiRW50cnkgbnVtYmVyOiAiICsgaSArICIgaXMgIiArIFN0cmluZy52YWx1ZU9mKGVudHJ5W2ldKSk7CisJPC9wcmU+CisJCisJPHA+aW5jdXJzIHRoZSBjb3N0IG9mIGNvbnN0cnVjdGluZyB0aGUgbWVzc2FnZSBwYXJhbWV0ZXIsIHRoYXQgaXMKKwljb252ZXJ0aW5nIGJvdGggaW50ZWdlciA8Y29kZT5pPC9jb2RlPiBhbmQgPGNvZGU+ZW50cnlbaV08L2NvZGU+IHRvIGEKKwlTdHJpbmcsIGFuZCBjb25jYXRlbmF0aW5nIGludGVybWVkaWF0ZSBzdHJpbmdzLiBUaGlzLCByZWdhcmRsZXNzIG9mCisJd2hldGhlciB0aGUgbWVzc2FnZSB3aWxsIGJlIGxvZ2dlZCBvciBub3QuCisJPC9wPgogCi08cD5Mb2dnZXJzIGFyZSBhc3NpZ25lZCBsZXZlbHMuIEEgbG9nIHN0YXRlbWVudCBpcyBwcmludGVkCi1kZXBlbmRpbmcgb24gaXRzIGxldmVsIDxlbT5hbmQ8L2VtPiBpdHMgbG9nZ2VyLgotCi08cD5NYWtlIHN1cmUgdG8gcmVhZCB0aGUgPGEgaHJlZj1tYW51YWwuaHRtbD5sb2c0aiBtYW51YWw8L2E+Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotPGEgbmFtZT1iZWhhdmlvcj48aDQgaWQ9IiI+SG93IGNhbiBJIGNoYW5nZSBsb2cgYmVoYXZpb3IgYXQgcnVudGltZT88L2g0PgotCi08cD5Mb2cgYmVoYXZpb3IgY2FuIGJlIHNldCB1c2luZyBjb25maWd1cmF0aW9uIGZpbGVzIHdoaWNoIGFyZSBwYXJzZWQKLWF0IHJ1bnRpbWUuIFVzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhlIHByb2dyYW1tZXIgY2FuIGRlZmluZQotbG9nZ2VycyBhbmQgc2V0IHRoZWlyIGxldmVscy4KLQotPHA+VGhlIDxjb2RlPlByb3BlcnR5Q29uZmlndXJhdG9yPC9jb2RlPiBkZWZpbmVzIGEgcGFydGljdWxhciBmb3JtYXQKLW9mIGEgY29uZmlndXJhdGlvbiBmaWxlLiBTZWUgYWxzbyB0aGUgPGNvZGU+ZXhhbXBsZXMvU29ydC5qYXZhPC9jb2RlPgotZXhhbXBsZSBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi08cD5Db25maWd1cmF0aW9uIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQgaW4gWE1MLiBTZWUKLTxjb2RlPmxvZzRqLmR0ZDwvY29kZT4gYW5kCi08Y29kZT5vcmcubG9nNGoueG1sLkRPTUNvbmZpZ3VyYXRvcjwvY29kZT4gZm9yIG1vcmUgZGV0YWlscy4KLQotPHA+U2VlIHRoZSB2YXJpb3VzIExheW91dCBhbmQgQXBwZW5kZXIgY29tcG9uZW50cyBmb3Igc3BlY2lmaWMKLWNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KLQotPHA+SW4gYWRkaXRpb24gdG8gY29uZmlndXJhdGlvbiBmaWxlcywgdGhlIHVzZXIgbWF5IGRpc2FibGUgYWxsCi1tZXNzYWdlcyBiZWxvbmdpbmcgdG8gYSBzZXQgb2YgbGV2ZWxzLiBTZWUgbmV4dCBpdGVtLgotCi08YSBuYW1lPWZhc3RMb2dnaW5nPjxoND5XaGF0IGlzIHRoZSBmYXN0ZXN0IHdheSBvZiAobm90KSBsb2dnaW5nPzwvaDQ+Ci0KLTxwPiBGb3Igc29tZSBsb2dnZXIgPGNvZGU+bDwvY29kZT4sIHdyaXRpbmcsIDxwcmU+Ci0gIGwuZGVidWcoIkVudHJ5IG51bWJlcjogIiArIGkgKyAiIGlzICIgKyBTdHJpbmcudmFsdWVPZihlbnRyeVtpXSkpOwotPC9wcmU+Ci0KLTxwPmluY3VycyB0aGUgY29zdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIG1lc3NhZ2UgcGFyYW1ldGVyLCB0aGF0IGlzCi1jb252ZXJ0aW5nIGJvdGggaW50ZWdlciA8Y29kZT5pPC9jb2RlPiBhbmQgPGNvZGU+ZW50cnlbaV08L2NvZGU+IHRvIGEKLVN0cmluZywgYW5kIGNvbmNhdGVuYXRpbmcgaW50ZXJtZWRpYXRlIHN0cmluZ3MuIFRoaXMsIHJlZ2FyZGxlc3Mgb2YKLXdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBsb2dnZWQgb3Igbm90LgotCi08cD5JZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgc3BlZWQsIHRoZW4gd3JpdGUKLTxwcmU+CisJPHA+SWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHNwZWVkLCB0aGVuIHdyaXRlPC9wPgorCTxwcmUgY2xhc3M9InNvdXJjZSI+CiAgICBpZihsLmlzRGVidWdFbmFibGVkKCkpIHsKICAgICAgbC5kZWJ1ZygiRW50cnkgbnVtYmVyOiAiICsgaSArICIgaXMgIiArIFN0cmluZy52YWx1ZU9mKGVudHJ5W2ldKSk7CiAgICB9Ci08L3ByZT4KKwk8L3ByZT4KIAotPHA+VGhpcyB3YXkgeW91IHdpbGwgbm90IGluY3VyIHRoZSBjb3N0IG9mIHBhcmFtZXRlciBjb25zdHJ1Y3Rpb24gaWYKLWRlYnVnZ2luZyBpcyBkaXNhYmxlZCBmb3IgbG9nZ2VyIDxjb2RlPmw8L2NvZGU+LiBPbiB0aGUgb3RoZXIKLWhhbmQsIGlmIHRoZSBsb2dnZXIgaXMgZGVidWcgZW5hYmxlZCwgeW91IHdpbGwgaW5jdXIgdGhlIGNvc3Qgb2YKLWV2YWx1YXRpbmcgd2hldGhlciB0aGUgbG9nZ2VyIGlzIGVuYWJsZWQgb3Igbm90LCB0d2ljZTogb25jZSBpbgotPGNvZGU+ZGVidWdFbmFibGVkPC9jb2RlPiBhbmQgb25jZSBpbiA8Y29kZT5kZWJ1ZzwvY29kZT4uICBUaGlzIGlzIGFuCi1pbnNpZ25pZmljYW50IG92ZXJoZWFkIHNpbmNlIGV2YWx1YXRpbmcgYSBsb2dnZXIgdGFrZXMgbGVzcyB0aGFuIDElCi1vZiB0aGUgdGltZSBpdCB0YWtlcyB0byBhY3R1YWxseSBsb2cgYSBzdGF0ZW1lbnQuCisJPHA+VGhpcyB3YXkgeW91IHdpbGwgbm90IGluY3VyIHRoZSBjb3N0IG9mIHBhcmFtZXRlcgorCWNvbnN0cnVjdGlvbiBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQgZm9yIGxvZ2dlcgorCTxjb2RlPmw8L2NvZGU+LiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGxvZ2dlciBpcyBkZWJ1ZworCWVuYWJsZWQsIHlvdSB3aWxsIGluY3VyIHRoZSBjb3N0IG9mIGV2YWx1YXRpbmcgd2hldGhlciB0aGUKKwlsb2dnZXIgaXMgZW5hYmxlZCBvciBub3QsIHR3aWNlOiBvbmNlIGluCisJPGNvZGU+ZGVidWdFbmFibGVkPC9jb2RlPiBhbmQgb25jZSBpbiA8Y29kZT5kZWJ1ZzwvY29kZT4uCisJVGhpcyBpcyBhbiBpbnNpZ25pZmljYW50IG92ZXJoZWFkIHNpbmNlIGV2YWx1YXRpbmcgYSBsb2dnZXIKKwl0YWtlcyBsZXNzIHRoYW4gMSUgb2YgdGhlIHRpbWUgaXQgdGFrZXMgdG8gYWN0dWFsbHkgbG9nIGEKKwlzdGF0ZW1lbnQuCisJPC9wPgorCQorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMi40Ij4yLjQgIEFyZSB0aGVyZSBhbnkgc3VnZ2VzdGVkIHdheXMgZm9yIG5hbWluZyBsb2dnZXJzPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJCiAKLTxhIG5hbWU9bmFtaW5nTG9nZ2Vycz48aDQ+QXJlIHRoZXJlIGFueSBzdWdnZXN0ZWQgd2F5cyBmb3IgbmFtaW5nCi1sb2dnZXJzPzwvYT48L2g0PgorCTxwPlllcywgdGhlcmUgYXJlLjwvcD4KIAotPHA+WWVzLCB0aGVyZSBhcmUuCisJPHA+WW91IGNhbiBuYW1lIGxvZ2dlcnMgYnkgPHN0cm9uZz5sb2NhbGl0eTwvc3Ryb25nPi4gSXQgdHVybnMgb3V0CisJdGhhdCBpbnN0YW50aWF0aW5nIGEgbG9nZ2VyIGluIGVhY2ggY2xhc3MsIHdpdGggdGhlIGxvZ2dlciBuYW1lCisJZXF1YWwgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcywgaXMgYSB1c2VmdWwgYW5kCisJc3RyYWlnaHRmb3J3YXJkIGFwcHJvYWNoIG9mIGRlZmluaW5nIGxvZ2dlcnMuIFRoaXMgYXBwcm9hY2ggaGFzCisJbWFueSBiZW5lZml0czoKKwk8L3A+CisJCisJPHVsPgorCSAgPGxpPkl0IGlzIHZlcnkgc2ltcGxlIHRvIGltcGxlbWVudC48L2xpPgorCSAgCisJICA8bGk+SXQgaXMgdmVyeSBzaW1wbGUgdG8gZXhwbGFpbiB0byBuZXcgZGV2ZWxvcGVycy48L2xpPgorCSAgCisJICA8bGk+SXQgYXV0b21hdGljYWxseSBtaXJyb3JzIHlvdXIgYXBwbGljYXRpb24ncyBvd24gbW9kdWxhciBkZXNpZ24uCisJICA8L2xpPgorCSAgPGxpPkl0IGNhbiBiZSBmdXJ0aGVyIHJlZmluZWQgYXQgd2lsbC48L2xpPgorCSAgCisJICA8bGk+UHJpbnRpbmcgdGhlIGxvZ2dlciBhdXRvbWF0aWNhbGx5IGdpdmVzIGluZm9ybWF0aW9uIG9uIHRoZSBsb2NhbGl0eQorCSAgb2YgdGhlIGxvZyBzdGF0ZW1lbnQuCSAgPC9saT4KKwk8L3VsPgogCi08cD5Zb3UgY2FuIG5hbWUgbG9nZ2VycyBieSA8c3Ryb25nPmxvY2FsaXR5PC9zdHJvbmc+LiBJdCB0dXJucyBvdXQKLXRoYXQgaW5zdGFudGlhdGluZyBhIGxvZ2dlciBpbiBlYWNoIGNsYXNzLCB3aXRoIHRoZSBsb2dnZXIgbmFtZQotZXF1YWwgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcywgaXMgYSB1c2VmdWwgYW5kCi1zdHJhaWdodGZvcndhcmQgYXBwcm9hY2ggb2YgZGVmaW5pbmcgbG9nZ2Vycy4gVGhpcyBhcHByb2FjaCBoYXMKLW1hbnkgYmVuZWZpdHM6CisJPHA+SG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIG9ubHkgd2F5IGZvciBuYW1pbmcgbG9nZ2Vycy4gQQorCWNvbW1vbiBhbHRlcm5hdGl2ZSBpcyB0byBuYW1lIGxvZ2dlcnMgYnkgPHN0cm9uZz5mdW5jdGlvbmFsCisJYXJlYXM8L3N0cm9uZz4uIEZvciBleGFtcGxlLCB0aGUgImRhdGFiYXNlIiBsb2dnZXIsICJSTUkiCisJbG9nZ2VyLCAic2VjdXJpdHkiIGxvZ2dlciwgb3IgdGhlICJYTUwiIGxvZ2dlci4KKwk8L3A+CiAKLTx1bD4KLSAgPGxpPkl0IGlzIHZlcnkgc2ltcGxlIHRvIGltcGxlbWVudC4KKwk8cD5Zb3UgbWF5IGNob29zZSB0byBuYW1lIGxvZ2dlcnMgYnkgZnVuY3Rpb25hbGl0eSBhbmQKKwlzdWJjYXRlZ29yaXplIGJ5IGxvY2FsaXR5LCBhcyBpbiAiREFUQUJBU0UuY29tLmZvby5zb21lLnBhY2thZ2Uuc29tZUNsYXNzIiBvcgorCSJEQVRBQkFTRS5jb20uZm9vLnNvbWUub3RoZXIucGFja2FnZS5zb21lT3RoZXJDbGFzcyIuCisJPC9wPgorCQorCTxwPjxlbT5Zb3UgYXJlIHRvdGFsbHkgZnJlZSBpbiBjaG9vc2luZyB0aGUgbmFtZXMgb2YgeW91cgorCWxvZ2dlcnMuPC9lbT4gVGhlIGxvZzRqIHBhY2thZ2UgbWVyZWx5IGFsbG93cyB5b3UgdG8gbWFuYWdlIHlvdXIKKwluYW1lcyBpbiBhIGhpZXJhcmNoeS4gIEhvd2V2ZXIsIGl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZGVmaW5lCisJdGhpcyBoaWVyYXJjaHkuCisJPC9wPgorCQorCTxwPk5vdGUgYnkgbmFtaW5nIGxvZ2dlcnMgYnkgbG9jYWxpdHkgb25lIHRlbmRzIHRvIG5hbWUgdGhpbmdzIGJ5CisJZnVuY3Rpb25hbGl0eSwgc2luY2UgaW4gbW9zdCBjYXNlcyB0aGUgbG9jYWxpdHkgcmVsYXRlcyBjbG9zZWx5IHRvCisJZnVuY3Rpb25hbGl0eS4gCisJPC9wPgogCi0gIDxsaT5JdCBpcyB2ZXJ5IHNpbXBsZSB0byBleHBsYWluIHRvIG5ldyBkZXZlbG9wZXJzLgorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMi41Ij4yLjUgSG93IGRvIEkgZ2V0IHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIGluIGEgc3RhdGljIGJsb2NrPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJPHA+WW91IGNhbiBlYXNpbHkgcmV0cmlldmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgaW4gYQorCXN0YXRpYyBibG9jayBmb3IgY2xhc3MgWCwgd2l0aCB0aGUgc3RhdGVtZW50CisJPGNvZGU+WC5jbGFzcy5nZXROYW1lKCk8L2NvZGU+LiBOb3RlIHRoYXQgPGNvZGU+WDwvY29kZT4gaXMgdGhlIGNsYXNzCisJbmFtZSBhbmQgbm90IGFuIGluc3RhbmNlLiAgVGhlIDxjb2RlPlguY2xhc3M8L2NvZGU+IHN0YXRlbWVudCBkb2VzCisJPGk+bm90PC9pPiBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgPGNvZGU+WDwvY29kZT4uCisJPC9wPgorCQorCTxwPkhlcmUgaXMgdGhlIHN1Z2dlc3RlZCB1c2FnZSB0ZW1wbGF0ZTo8L3A+CiAKLSAgPGxpPkl0IGF1dG9tYXRpY2FsbHkgbWlycm9ycyB5b3VyIGFwcGxpY2F0aW9uJ3Mgb3duIG1vZHVsYXIgZGVzaWduLgotCi0gIDxsaT5JdCBjYW4gYmUgZnVydGhlciByZWZpbmVkIGF0IHdpbGwuCi0KLSAgPGxpPlByaW50aW5nIHRoZSBsb2dnZXIgYXV0b21hdGljYWxseSBnaXZlcyBpbmZvcm1hdGlvbiBvbiB0aGUgbG9jYWxpdHkKLSAgb2YgdGhlIGxvZyBzdGF0ZW1lbnQuCi0KLTwvdWw+Ci0KLQotPHA+SG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIG9ubHkgd2F5IGZvciBuYW1pbmcgbG9nZ2Vycy4gQSBjb21tb24KLWFsdGVybmF0aXZlIGlzIHRvIG5hbWUgbG9nZ2VycyBieSA8c3Ryb25nPmZ1bmN0aW9uYWwKLWFyZWFzPC9zdHJvbmc+LiBGb3IgZXhhbXBsZSwgdGhlICJkYXRhYmFzZSIgbG9nZ2VyLCAiUk1JIiBsb2dnZXIsCi0ic2VjdXJpdHkiIGxvZ2dlciwgb3IgdGhlICJYTUwiIGxvZ2dlci4KLQotPHA+WW91IG1heSBjaG9vc2UgdG8gbmFtZSBsb2dnZXJzIGJ5IGZ1bmN0aW9uYWxpdHkgYW5kCi1zdWJjYXRlZ29yaXplIGJ5IGxvY2FsaXR5LCBhcyBpbiAiREFUQUJBU0UuY29tLmZvby5zb21lLnBhY2thZ2Uuc29tZUNsYXNzIiBvcgotIkRBVEFCQVNFLmNvbS5mb28uc29tZS5vdGhlci5wYWNrYWdlLnNvbWVPdGhlckNsYXNzIi4KLQotPHA+PGVtPllvdSBhcmUgdG90YWxseSBmcmVlIGluIGNob29zaW5nIHRoZSBuYW1lcyBvZiB5b3VyCi1sb2dnZXJzLjwvZW0+IFRoZSBsb2c0aiBwYWNrYWdlIG1lcmVseSBhbGxvd3MgeW91IHRvIG1hbmFnZSB5b3VyCi1uYW1lcyBpbiBhIGhpZXJhcmNoeS4gIEhvd2V2ZXIsIGl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZGVmaW5lCi10aGlzIGhpZXJhcmNoeS4KLQotPHA+Tm90ZSBieSBuYW1pbmcgbG9nZ2VycyBieSBsb2NhbGl0eSBvbmUgdGVuZHMgdG8gbmFtZSB0aGluZ3MgYnkKLWZ1bmN0aW9uYWxpdHksIHNpbmNlIGluIG1vc3QgY2FzZXMgdGhlIGxvY2FsaXR5IHJlbGF0ZXMgY2xvc2VseSB0bwotZnVuY3Rpb25hbGl0eS4gCi0KLTxhIG5hbWU9Y2xhc3NOYW1lPjxoND5Ib3cgZG8gSSBnZXQgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MKLWluIGEgc3RhdGljIGJsb2NrPzwvYT48L2g0PgotCi08cD5Zb3UgY2FuIGVhc2lseSByZXRyaWV2ZSB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBpbiBhCi1zdGF0aWMgYmxvY2sgZm9yIGNsYXNzIFgsIHdpdGggdGhlIHN0YXRlbWVudAotPGNvZGU+WC5jbGFzcy5nZXROYW1lKCk8L2NvZGU+LiBOb3RlIHRoYXQgPGNvZGU+WDwvY29kZT4gaXMgdGhlIGNsYXNzCi1uYW1lIGFuZCBub3QgYW4gaW5zdGFuY2UuICBUaGUgPGNvZGU+WC5jbGFzczwvY29kZT4gc3RhdGVtZW50IGRvZXMKLTxpPm5vdDwvaT4gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzIDxjb2RlPlg8L2NvZGU+LgotCi08cD5IZXJlIGlzIHRoZSBzdWdnZXN0ZWQgdXNhZ2UgdGVtcGxhdGU6Ci0KLTxmb250IGNvbG9yPUJMVUU+PHByZT4KKwk8cHJlIGNsYXNzPSJzb3VyY2UiPgogcGFja2FnZSBhLmIuYzsKIAogcHVibGljIGNsYXNzIEZvbyB7Ci0gIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihGb28uY2xhc3MpOworICBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoRm9vLmNsYXNzKTsKICAgLi4uIG90aGVyIGNvZGUKIAogfQotPC9wcmU+PC9mb250PgotCi08YSBuYW1lPWN1c3RvbUxheW91dHM+PGg0PkNhbiB0aGUgbG9nIG91dHB1dCBmb3JtYXQgYmUgY3VzdG9taXplZD88L2g0PgotCi08cD5ZZXMuIFNpbmNlIHJlbGVhc2UgMC43LjAsIHlvdSBjYW4gZXh0ZW5kIHRoZSA8Y29kZT5MYXlvdXQ8L2NvZGU+Ci1jbGFzcyB0byBjcmVhdGUgeW91IG93biBjdXN0b21pemVkIGxvZyBmb3JtYXQuIEFwcGVuZGVycyBjYW4gYmUKLXBhcmFtZXRlcml6ZWQgdG8gdXNlIHRoZSBsYXlvdXQgb2YgeW91ciBjaG9pY2UuCi0KLTxhIG5hbWU9TkRDPjxoND5DYW4gdGhlIG91dHB1dHMgb2YgbXVsdGlwbGUgY2xpZW50IHJlcXVlc3QgZ28gdG8KLWRpZmZlcmVudCBsb2cgZmlsZXM/PC9oND4KLQotTWFueSBkZXZlbG9wZXJzIGFyZSBjb25mcm9udGVkIHdpdGggdGhlIHByb2JsZW0gb2YgZGlzdGluZ3Vpc2hpbmcgdGhlCi1sb2cgb3V0cHV0IG9yaWdpbmF0aW5nIGZyb20gdGhlIHNhbWUgY2xhc3MgYnV0IGRpZmZlcmVudCBjbGllbnQKLXJlcXVlc3RzLiBUaGV5IGNvbWUgdXAgd2l0aCBpbmdlbmlvdXMgbWVjaGFuaXNtcyB0byBmYW4gb3V0IHRoZSBsb2cKLW91dHB1dCB0byBkaWZmZXJlbnQgZmlsZXMuIEluIG1vc3QgY2FzZXMsIHRoaXMgaXMgbm90IHRoZSByaWdodAotYXBwcm9hY2guCi0KLTxwPkl0IGlzIHNpbXBsZXIgdG8gdXNlIGEgbmVzdGVkIGRpYWdub3N0aWMgY29udGV4dCAoTkRDKS4gVHlwaWNhbGx5LAotb25lIHdvdWxkIDxlbT5OREMucHVzaCgpPC9lbT4gY2xpZW50IHNwZWNpZmljIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZQotY2xpZW50J3MgaG9zdG5hbWUsIElEIG9yIGFueSBvdGhlciBkaXN0aW5ndWlzaGluZyBpbmZvcm1hdGlvbiB3aGVuCi1zdGFydGluZyB0byBoYW5kbGUgdGhlIGNsaWVudCdzIHJlcXVlc3QuIFRoZXJlYWZ0ZXIsIGxvZyBvdXRwdXQgd2lsbAotYXV0b21hdGljYWxseSBpbmNsdWRlIHRoZSBuZXN0ZWQgZGlhZ25vc3RpYyBjb250ZXh0IHNvIHRoYXQgeW91IGNhbgotZGlzdGluZ3Vpc2ggbG9ncyBmcm9tIGRpZmZlcmVudCBjbGllbnQgcmVxdWVzdHMgZXZlbiBpZiB0aGV5IGFyZQotb3V0cHV0IHRvIHRoZSBzYW1lIGZpbGUuCi0KLTxwPlNlZSB0aGUgPGNvZGU+TkRDPC9jb2RlPiBhbmQgdGhlIDxjb2RlPlBhdHRlcm5MYXlvdXQ8L2NvZGU+IGNsYXNzZXMKLWZvciBtb3JlIGluZm9ybWF0aW9uLiBUaGUgPGNvZGU+TnVtYmVyQ3J1bmNoZXI8L2NvZGU+IGV4YW1wbGUgc2hvd3MKLWhvdyB0aGUgTkRDIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSBsb2cgb3V0cHV0IGZyb20gbXVsdGlwbGUKLWNsaWVudHMgZXZlbiBpZiB0aGV5IHNoYXJlIHRoZSBzYW1lIGxvZyBmaWxlLgotCi08cD5Gb3Igc2VsZWN0IGFwcGxpY2F0aW9ucywgc3VjaCBhcyB2aXJ0dWFsIGhvc3Rpbmcgd2ViLXNlcnZlcnMsIHRoZQotTkRDIHNvbHV0aW9uIGlzIG5vdCBzdWZmaWNpZW50LiBBcyBvZiB2ZXJzaW9uIDAuOS4wLCBsb2c0aiBzdXBwb3J0cwotbXVsdGlwbGUgaGllcmFyY2h5IHRyZWVzLiBUaHVzLCBpdCBpcyBwb3NzaWJsZSB0byBsb2cgdG8gZGlmZmVyZW50Ci10YXJnZXRzIGZyb20gdGhlIHNhbWUgbG9nZ2VyIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb250ZXh0LgotCi08cD48YSBuYW1lPSIjb3B0aW9ucyI+PGg0PldoYXQgYXJlIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucyBmb3IKLUZvb0JhckFwcGVuZGVyPzwvaDQ+Ci0KLUxvZzRqIHVzZXMgSmF2YUJlYW5zIHN0eWxlIGNvbmZpZ3VyYXRpb24uIAotCi08cD5UaHVzLCBhbnkgc2V0dGVyIG1ldGhvZCBpbiA8Y29kZT5Gb29CYXJBcHBlbmRlcjwvY29kZT4gY29ycmVzcG9uZHMKLXRvIGEgY29uZmlndXJhYmxlIG9wdGlvbi4gRm9yIGV4YW1wbGUsIGluIDxhCi1ocmVmPSJhcGlcb3JnXGFwYWNoZVxsb2c0alxSb2xsaW5nRmlsZUFwcGVuZGVyLmh0bWwiPlJvbGxpbmdGaWxlQXBwZW5kZXI8L2E+Ci10aGUgPGEKLWhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL1JvbGxpbmdGaWxlQXBwZW5kZXIuaHRtbCNzZXRNYXhCYWNrdXBJbmRleChpbnQpIj5zZXRNYXhCYWNrdXBJbmRleChpbnQKLW1heEJhY2t1cHMpPC9hPiBtZXRob2QgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPm1heEJhY2t1cEluZGV4PC9jb2RlPgotb3B0aW9uLiBUaGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBvcHRpb24gY2FuIGJlIHVwcGVyIGNhc2UsIGkuZS4KLTxjb2RlPk1heEJhY2t1cEluZGV4PC9jb2RlPiBhbmQgPGNvZGU+bWF4QmFja3VwSW5kZXg8L2NvZGU+IGFyZQotZXF1aXZhbGVudCBidXQgbm90IDxjb2RlPk1BWEJBQ0tVUEluZGV4PC9jb2RlPiBub3IKLTxjb2RlPm1BWEJhY2t1cEluZGV4PC9jb2RlPi4KLQotPHA+TGF5b3V0cyBvcHRpb25zIGFyZSBhbHNvIGRlZmluZWQgYnkgdGhlaXIgc2V0dGVyIG1ldGhvZHMuIFNhbWUgZ29lcwotZm9yIG1vc3Qgb3RoZXIgbG9nNGogY29tcG9uZW50cy4KLQotPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+Ci0KLTxwPjxhIG5hbWU9cm0+PGg0PkxvZ2dlciBpbnN0YW5jZXMgc2VlbSB0byBiZSBjcmVhdGUgb25seS4gV2h5IGlzbid0Ci10aGVyZSBhIG1ldGhvZCB0byByZW1vdmUgbG9nZ2VyIGluc3RhbmNlcz88L2g0PgotCi1JdCBpcyBxdWl0ZSBub250cml2aWFsIHRvIGRlZmluZSB0aGUgc2VtYW50aWNzIG9mIGEgInJlbW92ZWQiIGxvZ2dlcgotd2hpY2ggaXMgc3RpbGwgcmVmZXJlbmNlZCBieSB0aGUgdXNlci4gRnV0dXJlIHJlbGVhc2VzIDxlbT5tYXk8L2VtPgotaW5jbHVkZSBhIHJlbW92ZSBtZXRob2QgaW4gdGhlIExvZ2dlciBjbGFzcy4KLQotPGEgbmFtZT1maWx0ZXJCeUxldmVsPjxoND5JcyBpdCBwb3NzaWJsZSB0byBkaXJlY3QgbG9nIG91dHB1dCB0bwotZGlmZmVyZW50IGFwcGVuZGVycyBieSBsZXZlbD88L2g0PgotCi08cD5ZZXMgaXQgaXMuIFNldHRpbmcgdGhlIDxiPlRocmVzaG9sZDwvYj4gb3B0aW9uIG9mIGFueSBhcHBlbmRlcgotZXh0ZW5kaW5nIDxhCi1ocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9BcHBlbmRlclNrZWxldG9uLmh0bWwiPkFwcGVuZGVyU2tlbGV0b248L2E+LAotKG1vc3QgbG9nNGogYXBwZW5kZXJzIGV4dGVuZCBBcHBlbmRlclNrZWxldG9uKSB0byBmaWx0ZXIgb3V0IGFsbCBsb2cKLWV2ZW50cyB3aXRoIDxlbT5sb3dlcjwvZW0+IGxldmVsIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSB0aHJlc2hvbGQKLW9wdGlvbi4gCi0KLTxwPkZvciBleGFtcGxlLCBzZXR0aW5nIHRoZSB0aHJlc2hvbGQgb2YgYW4gYXBwZW5kZXIgdG8gREVCVUcgYWxzbwotYWxsb3cgSU5GTywgV0FSTiwgRVJST1IgYW5kIEZBVEFMIG1lc3NhZ2VzIHRvIGxvZyBhbG9uZyB3aXRoIERFQlVHCi1tZXNzYWdlcy4gVGhpcyBpcyB1c3VhbGx5IGFjY2VwdGFibGUgYXMgdGhlcmUgaXMgbGl0dGxlIHVzZSBmb3IgREVCVUcKLW1lc3NhZ2VzIHdpdGhvdXQgdGhlIHN1cnJvdW5kaW5nIElORk8sIFdBUk4sIEVSUk9SIGFuZCBGQVRBTAotbWVzc2FnZXMuIFNpbWlsYXJseSwgc2V0dGluZyB0aGUgdGhyZXNob2xkIG9mIGFuIGFwcGVuZGVyIHRvIEVSUk9SCi13aWxsIGZpbHRlciBvdXQgREVCVUcsIElORk8gYW5kIFdBUk4gbWVzc2FnZXMgYnV0IG5vdCBFUlJPUiBvciBGQVRBTAotbWVzc2FnZXMuCi0KLTxwPlRoaXMgcG9saWN5IHVzdWFsbHkgYmVzdCBlbmNhcHN1bGF0ZXMgd2hhdCB0aGUgdXNlciBhY3R1YWxseSB3YW50cwotdG8gZG8sIGFzIG9wcG9zZWQgdG8gaGVyIG1pbmQtcHJvamVjdGVkIHNvbHV0aW9uLgotCi08cD5TZWUgPGEKLWhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL2V4YW1wbGVzL2RvYy1maWxlcy9zb3J0NC5sY2YiPnNvcnQ0LmxjZjwvYT4KLWZvciBhbiBleGFtcGxlIHRocmVzaG9sZCBjb25maWd1cmF0aW9uLgotCi08cD5JZiB5b3UgbXVzdCBmaWx0ZXIgZXZlbnRzIGJ5IGV4YWN0IGxldmVsIG1hdGNoLCB0aGVuIHlvdSBjYW4KLWF0dGFjaCBhIDxhCi1ocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9MZXZlbE1hdGNoRmlsdGVyLmh0bWwiPkxldmVsTWF0Y2hGaWx0ZXI8L2E+Ci10byBhbnkgYXBwZW5kZXIgdG8gZmlsdGVyIG91dCBsb2dnaW5nIGV2ZW50cyBieSBleGFjdCBsZXZlbCBtYXRjaC4KLQotCi08cD48YSBuYW1lPW1hbnkyMT48aDQ+SG93IGRvIEkgZ2V0IG11bHRpcGxlIHByb2Nlc3MgdG8gbG9nIHRvIHRoZSBzYW1lIGZpbGU/PC9oND48L2E+Ci0KLTxwPllvdSBtYXkgaGF2ZSBlYWNoIHByb2Nlc3MgbG9nIHRvIGEgCi08YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0QXBwZW5kZXIuaHRtbCI+PGNvZGU+U29ja2V0QXBwZW5kZXI8L2NvZGU+PC9hPi4gIAotVGhlIHJlY2VpdmluZyAKLTxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL25ldC9Tb2NrZXRTZXJ2ZXIuaHRtbCI+PGNvZGU+U29ja2V0U2VydmVyPC9jb2RlPjwvYT4gIAotKG9yIAotPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovbmV0L1NpbXBsZVNvY2tldFNlcnZlci5odG1sIj48Y29kZT5TaW1wbGVTb2NrZXRTZXJ2ZXI8L2NvZGU+PC9hPikKLWNhbiByZWNlaXZlIGFsbCB0aGUgZXZlbnRzIGFuZCBzZW5kIHRoZW0gdG8gYSBzaW5nbGUKLWxvZyBmaWxlLgotCi08cD48YSBuYW1lPXRpbWVzdGFtcD48aDQ+SWYgSSBoYXZlIG1hbnkgcHJvY2Vzc2VzIGFjcm9zcyBtdWx0aXBsZSBob3N0cwotKHBvc3NpYmx5IGFjcm9zcyBtdWx0aXBsZSB0aW1lem9uZXMpIGxvZ2dpbmcgdG8gdGhlIHNhbWUgZmlsZSB1c2luZyB0aGUKLW1ldGhvZCBhYm92ZSwgd2hhdCBoYXBwZW5zIHRvIHRpbWVzdGFtcHM/PC9oND4KLQotPHA+VGhlIHRpbWVzdGFtcCBpcyBjcmVhdGVkIHdoZW4gdGhlIGxvZ2dpbmcgZXZlbnQgaXMgY3JlYXRlZC4gIFRoYXQgaXMKLXNvIHNheSwgd2hlbiB0aGUgPGNvZGU+ZGVidWc8L2NvZGU+LCA8Y29kZT5pbmZvPC9jb2RlPiwgPGNvZGU+d2FybjwvY29kZT4sIAotPGNvZGU+ZXJyb3I8L2NvZGU+IG9yIDxjb2RlPmZhdGFsPC9jb2RlPiBtZXRob2QgaXMgaW52b2tlZC4KLVRoaXMgaXMgdW5hZmZlY3RlZCBieSB0aGUgdGltZSBhdCB3aGljaCB0aGV5IG1heSBhcnJpdmUgYXQgYSByZW1vdGUKLXNvY2tldCBzZXJ2ZXIuICBTaW5jZSB0aGUgdGltZXN0YW1wcyBhcmUgc3RvcmVkIGluIFVUQyBmb3JtYXQgaW5zaWRlCi10aGUgZXZlbnQsIHRoZXkgYWxsIGFwcGVhciBpbiB0aGUgc2FtZSB0aW1lem9uZSBhcyB0aGUgaG9zdCBjcmVhdGluZyB0aGUKLWxvZ2ZpbGUuICBTaW5jZSB0aGUgY2xvY2tzIG9mIHZhcmlvdXMgbWFjaGluZXMgbWF5IG5vdCBiZSBzeW5jaHJvbml6ZWQsCi10aGlzIG1heSBhY2NvdW50IGZvciB0aW1lIGludGVydmFsIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIGV2ZW50cyBnZW5lcmF0ZWQgCi1vbiBkaWZmZXJlbnQgaG9zdHMuCi0KLTxwPldoaWxlIHRoaXMgaXMgdGhlIGludGVuZGVkIGJlaGF2aW9yLCBpdCBvbmx5IHJlY2VudGx5IGJlY2FtZSBzbyBkdWUgdG8KLWEgYnVnIGRpc2NvdmVyeSBiZXR3ZWVuIHZlcnNpb24gMS4wLjQgYW5kIDEuMWIxLiAgVmVyc2lvbnMgMS4wLjQgYW5kIGJlZm9yZQotaGFkIHRoZWlyIHRpbWVzdGFtcCByZWdlbmVyYXRlZCBpbiB0aGUgY29udmVydGVyLiAgSW4gdGhpcyBjYXNlIHRoZSB0aW1lc3RhbXBzCi1zZWVuIGluIHRoZSBsb2cgZmlsZSB3b3VsZCBhbGwgYXBwZWFyIGluIG9yZGVyLCBnZW5lcmF0ZWQgYXQgdGhlIHRpbWUgdGhleQotYXJyaXZlZCBhdCB0aGUgbG9nIHNlcnZlciBob3N0IGFjY29yZGluZyB0byBpdHMgbG9jYWwgY2xvY2suCi0KLTxwPjxhIG5hbWU9ajJlZT48aDQ+V2h5IGNhbid0IExvZzRKIGZpbmQgbXkgcHJvcGVydGllcyBmaWxlIGluIGEgSjJFRQotb3IgV0FSIGFwcGxpY2F0aW9uPzwvaDQ+Ci0KLVRoZSBzaG9ydCBhbnN3ZXI6IHRoZSBMb2c0SiBjbGFzc2VzIGFuZCB0aGUgcHJvcGVydGllcyBmaWxlIGFyZSBub3QKLXdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHNhbWUgY2xhc3Nsb2FkZXIuPFA+Ci0KLVRoZSBsb25nIGFuc3dlciAoYW5kIHdoYXQgdG8gZG8gYWJvdXQgaXQpOiBKMkVFIG9yIFNlcnZsZXQgY29udGFpbmVycwotdXRpbGl6ZSBKYXZhJ3MgY2xhc3MgbG9hZGluZyBzeXN0ZW0uICBTdW4gY2hhbmdlZCB0aGUgd2F5IGNsYXNzbG9hZGluZwotd29ya3Mgd2l0aCB0aGUgcmVsZWFzZSBvZiBKYXZhIDIuICBJbiBKYXZhIDIsIGNsYXNzbG9hZGVycyBhcmUKLWFycmFuZ2VkIGluIGEgaGllcmFyY2hpYWwgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcC4gIFdoZW4gYSBjaGlsZAotY2xhc3Nsb2FkZXIgbmVlZHMgdG8gZmluZCBhIGNsYXNzIG9yIGEgcmVzb3VyY2UsIGl0IGZpcnN0IGRlbGVnYXRlcwotdGhlIHJlcXVlc3QgdG8gdGhlIHBhcmVudC4gCi0KLTxQPkxvZzRKIG9ubHkgdXNlcyB0aGUgZGVmYXVsdCA8Q09ERT5DbGFzcy5mb3JOYW1lKCk8L2NvZGU+IG1lY2hhbmlzbQotZm9yIGxvYWRpbmcgY2xhc3Nlcy4gIFJlc291cmNlcyBhcmUgaGFuZGxlZCBzaW1pbGFybHkuICBTZWUgdGhlCi1kb2N1bWVudGF0aW9uIGZvciA8Q09ERT5qYXZhLmxhbmcuQ2xhc3NMb2FkZXI8L0NPREU+IGZvciBtb3JlIGRldGFpbHMuCi0KLTxQPlNvLCBpZiB5b3UncmUgaGF2aW5nIHByb2JsZW1zLCB0cnkgbG9hZGluZyB0aGUgY2xhc3Mgb3IgcmVzb3VyY2UKLXlvdXJzZWxmLiAgSWYgeW91IGNhbid0IGZpbmQgaXQsIG5laXRoZXIgd2lsbCBMb2c0Si4gOykKLQotPFA+PEEgTkFNRT1jb25maWd1cmVhbmR3YXRjaD48SDQ+SXMgdGhlcmUgYSB3YXkgdG8gZ2V0IExvZzRKIHRvCi1hdXRvbWF0aWNhbGx5IHJlbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSBpZiBpdCBjaGFuZ2VzPzwvSDQ+Ci0KLTxQPlllcy4gIEJvdGggdGhlIERPTUNvbmZpZ3VyYXRvciBhbmQgdGhlIFByb3BlcnR5Q29uZmlndXJhdG9yIHN1cHBvcnQKLWF1dG9tYXRpYyByZWxvYWRpbmcgdGhyb3VnaCB0aGUgPENPREU+Y29uZmlndXJlQW5kV2F0Y2g8L0NPREU+IEFQSXMuCi1TZWUgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCi0KLTxQPjxBIE5BTUU9bnRldmVudGxvZ3Byb2JsZW1zPjxIND5XaGF0IGRvZXMgdGhlIFdpbmRvd3MgTlQgRXZlbnQKLVZpZXdlciBjb21wbGFpbiBhYm91dCBtaXNzaW5nIGRlc2NyaXB0aW9ucyBmb3IgbXkgZXZlbnQgbWVzc2FnZXMgd2hlbgotSSB1c2UgdGhlIE5URXZlbnRMb2dBcHBlbmRlcj88L0g0PgotCi08UD5UaGUgTlQgRXZlbnQgVmlld2VyIHJlbGllcyBvbiA8ST5tZXNzYWdlIHJlc291cmNlPC9JPiBETExzIHRvCi1wcm9wZXJseSB2aWV3IGFuIGV2ZW50IG1lc3NhZ2UuICBUaGUgTlRFdmVudExvZ0FwcGVuZGVyLmRsbCBjb250YWlucwotdGhlc2UgbWVzc2FnZSByZXNvdXJjZXMsIGJ1dCB0aGF0IERMTCBtdXN0IGJlIGNvcGllZCB0bwotJVNZU1RFTVJPT1QlXFNZU1RFTTMyIGZvciBpdCB0byB3b3JrIHByb3Blcmx5LgotCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi08UD48QSBOQU1FPW1vcmVudGV2ZW50bG9ncHJvYmxlbXM+PEg0PldoeSBjYW4ndCBJIG1hcCBteSBsb2dnZXIgbmFtZXMKLXRvIHRoZSBsb2dnZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBOVCBFdmVudCBMb2cgd2hlbiBJIHVzZSB0aGUKLU5URXZlbnRMb2dBcHBlbmRlcj88L0g0PgotCi08UD5VbmZvdHVuYXRlbHksIHRoZSBsb2dnZXIgbmFtZXMgYXJlIGhhcmRjb2RlZCB3aXRoaW4gdGhlIG1lc3NhZ2UKLXJlc291cmNlIERMTCAoc2VlIHByZXZpb3VzIHF1ZXN0aW9uIGFib3V0IE5URXZlbnRMb2dBcHBlbmRlciksIHNvCi10aGVyZSBpc24ndCBhbnkgZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhvc2UgZHluYW1pY2FsbHkuLi4gaW4gZmFjdCwgSQotZG9uJ3QgdGhpbmsgaXQncyBwb3NzaWJsZSB0byBkbyBpdCwgYXMgeW91J2QgaGF2ZSB0byBtb2RpZnkgdGhlIERMTAotcmVzb3VyY2VzIGZvciBldmVyeSBhcHBsaWNhdGlvbi4gU2luY2UgbW9zdCBuYXRpdmUgYXBwbGljYXRpb25zIGRvbid0Ci11c2UgdGhlIExvZ2dlciBjb2x1bW4gYW55d2F5Li4uCi0KLTxwPjxhIG5hbWU9dGF4PjxoND5XaHkgc2hvdWxkIEkgZG9uYXRlIG15IGV4dGVuc2lvbnMgdG8gbG9nNGogYmFjayB0byB0aGUKLXByb2plY3Q/PC9oND4KLQotQ29udHJhcnkgdG8gdGhlIEdOVSBQdWJsaWMgTGljZW5zZSAoR1BMKSB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLWRvZXMgbm90IG1ha2UgYW55IGNsYWltcyBvdmVyIHlvdXIgZXh0ZW5zaW9ucy4gQnkgZXh0ZW5zaW9ucywgd2UgbWVhbgotdG90YWxseSBuZXcgY29kZSB0aGF0IGludm9rZXMgZXhpc3RpbmcgbG9nNGogY2xhc3Nlcy4gPGVtPllvdSBhcmUgZnJlZQotdG8gZG8gd2hhdGV2ZXIgeW91IHdpc2ggd2l0aCB5b3VyIHByb3ByaWV0YXJ5IGxvZzRqIGV4dGVuc2lvbnMuPC9lbT4KLUluIHBhcnRpY3VsYXIsIHlvdSBtYXkgY2hvb3NlIHRvIG5ldmVyIHJlbGVhc2UgeW91ciBleHRlbnNpb25zIHRvIHRoZQotd2lkZXIgcHVibGljLgotCi08cD5XZSBhcmUgdmVyeSBjYXJlZnVsIG5vdCB0byBjaGFuZ2UgdGhlIGxvZzRqIGNsaWVudCBBUEkgc28gdGhhdAotbmV3ZXIgbG9nNGogcmVsZWFzZXMgYXJlIGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cwotdmVyc2lvbnMuIFdlIGFyZSBhIGxvdCBsZXNzIHNjcnVwdWxvdXMgd2l0aCB0aGUgaW50ZXJuYWwgbG9nNGoKLUFQSS4gVGh1cywgaWYgeW91ciBleHRlbnNpb24gaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGxvZzRqIHZlcnNpb24KLTxjb2RlPm48L2NvZGU+LCB0aGVuIHdoZW4gbG9nNGogcmVsZWFzZSB2ZXJzaW9uIDxjb2RlPm4rMTwvY29kZT4gY29tZXMKLW91dCwgeW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBhZGFwdCB5b3VyIHByb3ByaWV0YXJ5IGV4dGVuc2lvbnMgdG8KLXRoZSBuZXcgcmVsZWFzZS4KLQotVGh1cywgeW91IHdpbGwgYmUgZm9yY2VkIHRvIHNwZW5kIHByZWNpb3VzIHJlc291cmNlcyBpbiBvcmRlciB0byBrZWVwCi11cCB3aXRoIGxvZzRqIGNoYW5nZXMuIFRoaXMgaXMgY29tbW9ubHkgcmVmZXJyZWQgdG8gYXMgdGhlCi0ic3R1cGlkLXRheC4iICBCeSBkb25hdGluZyB0aGUgY29kZSBhbmQgbWFraW5nIGl0IHBhcnQgb2YgdGhlIHN0YW5kYXJkCi1kaXN0cmlidXRpb24sIHlvdSBzYXZlIHlvdXJzZWxmIHRoZSB1bm5lY2Vzc2FyeSBtYWludGVuYW5jZSB3b3JrLgotCi08cD5JZiB5b3VyIGV4dGVuc2lvbnMgYXJlIHVzZWZ1bCB0aGVuIHNvbWVvbmUgd2lsbCBldmVudHVhbGx5IHdyaXRlIGFuCi1leHRlbnNpb24gcHJvdmlkaW5nIHRoZSBzYW1lIG9yIHZlcnkgc2ltaWxhciBmdW5jdGlvbmFsaXR5LiAgWW91cgotZGV2ZWxvcG1lbnQgZWZmb3J0IHdpbGwgYmUgd2FzdGVkLiBVbmxlc3MgdGhlIHByb3ByaWV0YXJ5IGxvZzRqCi1leHRlbnNpb24gaXMgYnVzaW5lc3MgY3JpdGljYWwsIHRoZXJlIGlzIGxpdHRsZSByZWFzb24gZm9yIG5vdAotZG9uYXRpbmcgeW91ciBleHRlbnNpb25zIGJhY2sgdG8gdGhlIHByb2plY3QuCi0KLTxhIG5hbWU9aGVscD48aDQ+V2hhdCBzaG91bGQgSSBrZWVwIGluIG1pbmQgd2hlbiBjb250cmlidXRpbmcKLWNvZGU/PC9oND4KLQotPG9sPgotCi0gIDxsaT48Yj5Xcml0ZSBhIHRlc3QgY2FzZSBmb3IgeW91ciBjb250cmlidXRpb24uPC9iPgotICAgCi0gICAgPHA+VGhlcmUgaXMgbm90aGluZyBtb3JlIGlycml0YXRpbmcgdGhhbiBmaW5kaW5nIHRoZSBidWdzIGluCi0gICAgZGVidWdnaW5nIChpLmUuIGxvZ2dpbmcpIGNvZGUuIFdyaXRpbmcgYSB0ZXN0IGNhc2UgdGFrZXMgc29tZQotICAgIGVmZm9ydCBidXQgaXMgY3J1Y2lhbCBmb3IgYSB3aWRlbHkgdXNlZCBsaWJyYXJ5IHN1Y2ggYXMKLSAgICBsb2c0ai4gV3JpdGluZyBhIHRlc3QgY2FzZSB3aWxsIGdvIGEgbG9uZyB3YXkgaW4gZWFybmluZyB5b3UgdGhlCi0gICAgcmVzcGVjdCBvZiBmZWxsb3cgZGV2ZWxvcGVycy4gU2VlIHRoZSB0ZXN0cy8gZGlyZWN0b3J5IGZvciBleGl0aW5nCi0gICAgdGVzdCBjYXNlcy4KLQotICA8L2xpPgotCi0KLSAgPHA+PGxpPlN0aWNrIHRvIHRoZSBleGlzdGluZyBpbmRlbnRhdGlvbiBzdHlsZSBldmVuIGlmIHlvdSBoYXRlIGl0LgotCi0gICAgICA8cD5BbHRlcm5hdGluZyBiZXR3ZWVuIGluZGVudGF0aW9uIHN0eWxlcyBtYWtlcyBpdCBoYXJkIHRvCi0gICAgICB1bmRlcnN0YW5kIHRoZSBzb3VyY2UgY29kZS4gTWFrZSBpdCBoYXJkIG9uIHlvdXJzZWxmIGJ1dCBlYXNpZXIKLSAgICAgIG9uIG90aGVycy4gTG9nNGogZm9sbG93cyB0aGUgPGEKLSAgICAgIGhyZWY9aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252Lz5Db2RlIENvbnZlbnRpb25zIGZvcgotICAgICAgdGhlIEphdmFUTSBQcm9ncmFtbWluZyBMYW5ndWFnZTwvYT4uCi0KLSAgPHA+PGxpPk1ha2UgZXZlcnkgZWZmb3J0IHRvIHN0aWNrIHRvIHRoZSBKREsgMS4xIEFQSS4KLQotICAgICA8cD5PbmUgb2YgdGhlIGltcG9ydGFudCBhZHZhbnRhZ2VzIG9mIGxvZzRqIGlzIGl0cyBjb21wYXRpYmlsaXR5IHdpdGggCi0gICAgIEpESyAxLjEueC4gCisJPC9wcmU+CiAgICAgICAKLSAgIDxwPjxsaT5LZWVwIGl0IHNpbXBsZSwgc21hbGwgYW5kIGZhc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMi42Ij4yLjYgQ2FuIHRoZSBsb2cgb3V0cHV0IGZvcm1hdCBiZSBjdXN0b21pemVkPyA8L2E+CisgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgIAorCTxwPlllcywgeW91IGNhbiBleHRlbmQgdGhlIDxjb2RlPkxheW91dDwvY29kZT4gY2xhc3MgdG8gY3JlYXRlCisJeW91IG93biBjdXN0b21pemVkIGxvZyBmb3JtYXQuIEFwcGVuZGVycyBjYW4gYmUgcGFyYW1ldGVyaXplZAorCXRvIHVzZSB0aGUgbGF5b3V0IG9mIHlvdXIgY2hvaWNlLgorCTwvcD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjIuNyI+Mi43IFdoYXQgYXJlIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucyBmb3IgPGNvZGU+Rm9vQmFyQXBwZW5kZXI8L2NvZGU+PzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJPHA+TG9nNGogdXNlcyBKYXZhQmVhbnMgc3R5bGUgY29uZmlndXJhdGlvbi48L3A+CiAKLSAgICAgICA8cD5JdCdzIGFsbCBhYm91dCB0aGUgYXBwbGljYXRpb24gbm90IGFib3V0IGxvZ2dpbmcuCisJPHA+VGh1cywgYW55IHNldHRlciBtZXRob2QgaW4gPGNvZGU+Rm9vQmFyQXBwZW5kZXI8L2NvZGU+CisJY29ycmVzcG9uZHMgdG8gYSBjb25maWd1cmFibGUgb3B0aW9uLiBGb3IgZXhhbXBsZSwgaW4gPGEgaHJlZj0iYXBpXG9yZ1xhcGFjaGVcbG9nNGpcUm9sbGluZ0ZpbGVBcHBlbmRlci5odG1sIj48Y29kZT5Sb2xsaW5nRmlsZUFwcGVuZGVyPC9jb2RlPjwvYT4KKwl0aGUgPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovUm9sbGluZ0ZpbGVBcHBlbmRlci5odG1sI3NldE1heEJhY2t1cEluZGV4KGludCkiPjxjb2RlPnNldE1heEJhY2t1cEluZGV4KGludAorCW1heEJhY2t1cHMpPC9jb2RlPjwvYT4gbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZQorCTxjb2RlPm1heEJhY2t1cEluZGV4PC9jb2RlPiBvcHRpb24uIFRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlCisJb3B0aW9uIGNhbiBiZSB1cHBlciBjYXNlLCBpLmUuICA8Y29kZT5NYXhCYWNrdXBJbmRleDwvY29kZT4KKwlhbmQgPGNvZGU+bWF4QmFja3VwSW5kZXg8L2NvZGU+IGFyZSBlcXVpdmFsZW50IGJ1dCBub3QKKwk8Y29kZT5NQVhCQUNLVVBJbmRleDwvY29kZT4gbm9yIDxjb2RlPm1BWEJhY2t1cEluZGV4PC9jb2RlPi4KKwk8L3A+CiAKLSAgICA8cD48bGk+SWRlbnRpZnkgeW91cnNlbGYgYXMgdGhlIGNvbnRyaWJ1dG9yIGF0IHRoZSB0b3Agb2YgdGhlCi0JcmVsZXZhbnQgZmlsZS4gCi0KLSAgICA8cD48bGk+VGFrZSByZXNwb25zaWJpbGl0eSBmb3IgeW91ciBjb2RlLgorCTxwPkxheW91dHMgb3B0aW9ucyBhcmUgYWxzbyBkZWZpbmVkIGJ5IHRoZWlyIHNldHRlciBtZXRob2RzLiBUaGUgc2FtZSBnb2VzCisJZm9yIG1vc3Qgb3RoZXIgbG9nNGogY29tcG9uZW50cy4KKwk8L3A+CisgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InF1ZXN0aW9uIj4KKyAgICAgICAgICAgICA8YSBuYW1lPSIyLjgiPjIuOCBXaGF0IGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgb2YgbWlncmF0aW5nIGZyb20KKyAgICAgIGphdmEudXRpbC5sb2dnaW5nIHRvIGxvZzRqPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCiAJCi0JPHA+QXV0aG9yaW5nIHNvZnR3YXJlIGlzIGxpa2UgcGFyZW50aW5nLiBJdCB0YWtlcyBtYW55Ci0JeWVhcnMgdG8gcmFpc2UgYSBjaGlsZC4gCi0KLSAgICA8cD48bGk+RGlkIEkgbWVudGlvbiBzdGlja2luZyB3aXRoIHRoZSBpbmRlbnRhdGlvbiBzdHlsZT8gCi0KLSAgICA8cD48bGk+RGlkIEkgbWVudGlvbiB3cml0aW5nIHRlc3QgY2FzZXM/IAorCTxwPldlIHN1Z2dlc3QgdG8ganVzdCB1c2UgZ2xvYmFsIGZpbGUgc2VhcmNoL3JlcGxhY2UuICBZb3Ugc2hvdWxkIGJlIGFibGUKKwl0byByZXBsYWNlIGFsbCB0aGUgImphdmEudXRpbC5Mb2dnZXIiIHJlZmVyZW5jZXMgd2l0aAorCSJvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlciIsIGFuZCB5b3Ugc2hvdWxkIGJlIG9uIHlvdXIgd2F5LgorCTwvcD4KIAkKLTwvb2w+CisJPHA+SWYgeW91J3JlIG9uIGEgV2luMzIgcGxhdGZvcm0sIHdlIHJlY29tbWVuZCA8YSBocmVmPSJodHRwOi8vd3d3LnRleHRwYWQuY29tLyI+VGV4dHBhZDwvYT4uIFlvdSBjYW4gdXNlIHRoZQorCUNUUkwrU0hJRlQrTyB0byBvcGVuIGFsbCAqLmphdmEgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeSBpbmNsdWRpbmcgYWxsCisJaXRzIHN1Yi1kaXJlY3RvcmllcywgYW5kIHRoZW4gdXNlIHRoZSBzZWFyY2gvcmVwbGFjZSBmdW5jdGlvbiB0bworCXJlcGxhY2UgaW4gYWxsIGZpbGVzLCBhbmQgdGhlbiBDVFJMK1NISUZUK1MgdG8gc2F2ZSBhbGwuICBTaG91bGQgdGFrZQorCWFib3V0IDYwIHNlY29uZHMhICA6KQorCTwvcD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjIuOSI+Mi45IElzIGl0IHBvc3NpYmxlIHRvIGRpcmVjdCBsb2cgb3V0cHV0IHRvCisgICAgICBkaWZmZXJlbnQgYXBwZW5kZXJzIGJ5IGxldmVsPyA8L2E+CisgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgIAorCTxwPlllcyBpdCBpcy4gU2V0dGluZyB0aGUgPGI+VGhyZXNob2xkPC9iPiBvcHRpb24gb2YgYW55IGFwcGVuZGVyCisJZXh0ZW5kaW5nIDxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0FwcGVuZGVyU2tlbGV0b24uaHRtbCI+QXBwZW5kZXJTa2VsZXRvbjwvYT4sCisJKG1vc3QgbG9nNGogYXBwZW5kZXJzIGV4dGVuZCBBcHBlbmRlclNrZWxldG9uKSB0byBmaWx0ZXIgb3V0IGFsbCBsb2cKKwlldmVudHMgd2l0aCA8ZW0+bG93ZXI8L2VtPiBsZXZlbCB0aGFuIHRoZSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkCisJb3B0aW9uLiAKKwk8L3A+CiAKLTxhIG5hbWU9ZG93bmxvYWQ+PGg0PldoZXJlIGNhbiBJIGZpbmQgdGhlIGxhdGVzdCBkaXN0cmlidXRpb24gb2YgbG9nNGo/PC9oND4KKwk8cD5Gb3IgZXhhbXBsZSwgc2V0dGluZyB0aGUgdGhyZXNob2xkIG9mIGFuIGFwcGVuZGVyIHRvIERFQlVHCisJYWxzbyBhbGxvdyBJTkZPLCBXQVJOLCBFUlJPUiBhbmQgRkFUQUwgbWVzc2FnZXMgdG8gbG9nIGFsb25nCisJd2l0aCBERUJVRyBtZXNzYWdlcy4gVGhpcyBpcyB1c3VhbGx5IGFjY2VwdGFibGUgYXMgdGhlcmUgaXMKKwlsaXR0bGUgdXNlIGZvciBERUJVRyBtZXNzYWdlcyB3aXRob3V0IHRoZSBzdXJyb3VuZGluZyBJTkZPLAorCVdBUk4sIEVSUk9SIGFuZCBGQVRBTCBtZXNzYWdlcy4gU2ltaWxhcmx5LCBzZXR0aW5nIHRoZQorCXRocmVzaG9sZCBvZiBhbiBhcHBlbmRlciB0byBFUlJPUiB3aWxsIGZpbHRlciBvdXQgREVCVUcsIElORk8KKwlhbmQgV0FSTiBtZXNzYWdlcyBidXQgbm90IEVSUk9SIG9yIEZBVEFMIG1lc3NhZ2VzLgorCTwvcD4KIAotPHA+VGhlIGxvZzRqIHByb2plY3QgaXMgaG9zdGVkIGF0IDxhCi1ocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai88L2E+LgotPHA+Ci08aHI+CisJPHA+VGhpcyBwb2xpY3kgdXN1YWxseSBiZXN0IGVuY2Fwc3VsYXRlcyB3aGF0IHRoZSB1c2VyCisJYWN0dWFsbHkgd2FudHMgdG8gZG8sIGFzIG9wcG9zZWQgdG8gaGVyIG1pbmQtcHJvamVjdGVkCisJc29sdXRpb24uCisJPC9wPgorCTxwPlNlZSA8aT5leGFtcGxlcy9zb3J0NC5sY2Y8L2k+IGZvciBhbiBleGFtcGxlIHRocmVzaG9sZAorCWNvbmZpZ3VyYXRpb24uPC9wPgorCisJPHA+SWYgeW91IG11c3QgZmlsdGVyIGV2ZW50cyBieSBleGFjdCBsZXZlbCBtYXRjaCwgdGhlbiB5b3UgY2FuCisJYXR0YWNoIGEgPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvTGV2ZWxNYXRjaEZpbHRlci5odG1sIj5MZXZlbE1hdGNoRmlsdGVyPC9hPgorCXRvIGFueSBhcHBlbmRlciB0byBmaWx0ZXIgb3V0IGxvZ2dpbmcgZXZlbnRzIGJ5IGV4YWN0IGxldmVsIG1hdGNoLgorCTwvcD4KKworICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMi4xMCI+Mi4xMCBXaGF0IGRvZXMgdGhlIFdpbmRvd3MgTlQgRXZlbnQgVmlld2VyIGNvbXBsYWluIGFib3V0CisgICAgICBtaXNzaW5nIGRlc2NyaXB0aW9ucyBmb3IgbXkgZXZlbnQgbWVzc2FnZXMgd2hlbiBJIHVzZSB0aGUKKyAgICAgIDxjb2RlPk5URXZlbnRMb2dBcHBlbmRlcjwvY29kZT4/PC9hPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAKKwk8cD5UaGUgTlQgRXZlbnQgVmlld2VyIHJlbGllcyBvbiA8aT5tZXNzYWdlIHJlc291cmNlPC9pPiBETExzCisJdG8gcHJvcGVybHkgdmlldyBhbiBldmVudCBtZXNzYWdlLiAgVGhlIE5URXZlbnRMb2dBcHBlbmRlci5kbGwKKwljb250YWlucyB0aGVzZSBtZXNzYWdlIHJlc291cmNlcywgYnV0IHRoYXQgRExMIG11c3QgYmUgY29waWVkCisJdG8gJVNZU1RFTVJPT1QlXFNZU1RFTTMyIGZvciBpdCB0byB3b3JrIHByb3Blcmx5LgorCTwvcD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjIuMTEiPjIuMTEgV2h5IGNhbid0IEkgbWFwIG15IGxvZ2dlciBuYW1lcyB0byB0aGUgbG9nZ2VycyB0aGF0CisgICAgICBhcHBlYXIgaW4gdGhlIE5UIEV2ZW50IExvZyB3aGVuIEkgdXNlIHRoZQorICAgICAgTlRFdmVudExvZ0FwcGVuZGVyPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkJCQkJCQkJCQkJCQkJCQorCTxwPlVuZm90dW5hdGVseSwgdGhlIGxvZ2dlciBuYW1lcyBhcmUgaGFyZGNvZGVkIHdpdGhpbiB0aGUKKwltZXNzYWdlIHJlc291cmNlIERMTCAoc2VlIHByZXZpb3VzIHF1ZXN0aW9uIGFib3V0CisJTlRFdmVudExvZ0FwcGVuZGVyKSwgc28gdGhlcmUgaXNuJ3QgYW55IGVhc3kgd2F5IHRvIG92ZXJyaWRlCisJdGhvc2UgZHluYW1pY2FsbHkuLi4gaW4gZmFjdCwgSSBkb24ndCB0aGluayBpdCdzIHBvc3NpYmxlIHRvCisJZG8gaXQsIGFzIHlvdSdkIGhhdmUgdG8gbW9kaWZ5IHRoZSBETEwgcmVzb3VyY2VzIGZvciBldmVyeQorCWFwcGxpY2F0aW9uLiBTaW5jZSBtb3N0IG5hdGl2ZSBhcHBsaWNhdGlvbnMgZG9uJ3QgdXNlIHRoZQorCUxvZ2dlciBjb2x1bW4gYW55d2F5Li4uCisJPC9wPgorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMi4xMiI+Mi4xMiBBcmUgdGhlcmUgc3VnZ2VzdGVkIGFwcHJvYWNoZXMgZm9yIGxvZ2dpbmcgaW4gSlNQIHBhZ2VzPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDxwPgorICAgICAgICBUaGUgc3VnZ2VzdGVkIGFwcHJvYWNoIGRlcGVuZHMgb24geW91ciBkZXNpZ24gcmVxdWlyZW1lbnRzLiAgSWYgeW91IG9yCisgICAgICAgIHlvdXIgb3JnYW5pemF0aW9uIGhhcyBubyBjb25zdHJhaW50cyBvbiB0aGUgdXNlIG9mIEphdmEgaW4gSlNQIHBhZ2VzLAorICAgICAgICBzaW1wbHkgdXNlIGxvZzRqIG5vcm1hbGx5IGluIDxjb2RlPiZsdDslIC4uLiAlJmd0OzwvY29kZT4gc3RhdGVtZW50cworICAgICAgICBhcyBpbmRpY2F0ZWQgaW4gdGhlIFNob3J0IE1hbnVhbCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGRvY3VtZW50YXRpb24uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgIEhvd2V2ZXIsIGlmIHlvdXIgZGVzaWduIGNhbGxzIGZvciBhIG1pbmltdW0gYW1vdW50IG9mIEphdmEgaW4geW91ciBKU1AKKyAgICAgICAgcGFnZXMsIGNvbnNpZGVyIHVzaW5nIHRoZQorICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhZ2xpYnMvZG9jL2xvZy1kb2MvaW50cm8uaHRtbCI+TG9nIFRhZ2xpYjwvYT4KKyAgICAgICAgZnJvbSB0aGUgSmFrYXJ0YSBUYWdsaWJzIHByb2plY3QuICBJdCBwcm92aWRlcyBsb2dnaW5nIEpTUCB0YWdzIHRoYXQgaW52b2tlCisgICAgICAgIGxvZzRqLgorICAgICAgICA8L3A+CisgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZhcVNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSIzIj5TZWN0aW9uIDMuPC9hPiBBZHZhbmNlZCBxdWVzdGlvbnMKKyAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICA8cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgYW5zd2VycyB0byBtb3JlIGFkdmFuY2VkIHF1ZXN0aW9ucyBhYm91dCBsb2c0ai48L3A+CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMy4xIj4zLjEgQ2FuIHRoZSBvdXRwdXRzIG9mIG11bHRpcGxlIGNsaWVudCByZXF1ZXN0IGdvIHRvCisgICAgICBkaWZmZXJlbnQgbG9nIGZpbGVzPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJCisJPHA+TWFueSBkZXZlbG9wZXJzIGFyZSBjb25mcm9udGVkIHdpdGggdGhlIHByb2JsZW0gb2YKKwlkaXN0aW5ndWlzaGluZyB0aGUgbG9nIG91dHB1dCBvcmlnaW5hdGluZyBmcm9tIHRoZSBzYW1lIGNsYXNzCisJYnV0IGRpZmZlcmVudCBjbGllbnQgcmVxdWVzdHMuIFRoZXkgY29tZSB1cCB3aXRoIGluZ2VuaW91cworCW1lY2hhbmlzbXMgdG8gZmFuIG91dCB0aGUgbG9nIG91dHB1dCB0byBkaWZmZXJlbnQgZmlsZXMuIEluCisJbW9zdCBjYXNlcywgdGhpcyBpcyBub3QgdGhlIHJpZ2h0IGFwcHJvYWNoLgorCTwvcD4KKworCTxwPkl0IGlzIHNpbXBsZXIgdG8gdXNlIGEgbmVzdGVkIGRpYWdub3N0aWMgY29udGV4dAorCShOREMpLiBUeXBpY2FsbHksIG9uZSB3b3VsZCA8ZW0+TkRDLnB1c2goKTwvZW0+IGNsaWVudAorCXNwZWNpZmljIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBjbGllbnQncyBob3N0bmFtZSwgSUQgb3IgYW55CisJb3RoZXIgZGlzdGluZ3Vpc2hpbmcgaW5mb3JtYXRpb24gd2hlbiBzdGFydGluZyB0byBoYW5kbGUgdGhlCisJY2xpZW50J3MgcmVxdWVzdC4gVGhlcmVhZnRlciwgbG9nIG91dHB1dCB3aWxsIGF1dG9tYXRpY2FsbHkKKwlpbmNsdWRlIHRoZSBuZXN0ZWQgZGlhZ25vc3RpYyBjb250ZXh0IHNvIHRoYXQgeW91IGNhbgorCWRpc3Rpbmd1aXNoIGxvZ3MgZnJvbSBkaWZmZXJlbnQgY2xpZW50IHJlcXVlc3RzIGV2ZW4gaWYgdGhleQorCWFyZSBvdXRwdXQgdG8gdGhlIHNhbWUgZmlsZS4KKwk8L3A+CisKKwk8cD5TZWUgdGhlIDxjb2RlPk5EQzwvY29kZT4gYW5kIHRoZSA8Y29kZT5QYXR0ZXJuTGF5b3V0PC9jb2RlPgorCWNsYXNzZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uIFRoZSA8Y29kZT5OdW1iZXJDcnVuY2hlcjwvY29kZT4KKwlleGFtcGxlIHNob3dzIGhvdyB0aGUgTkRDIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSBsb2cKKwlvdXRwdXQgZnJvbSBtdWx0aXBsZSBjbGllbnRzIGV2ZW4gaWYgdGhleSBzaGFyZSB0aGUgc2FtZSBsb2cKKwlmaWxlLgorCTwvcD4KKworCTxwPkZvciBzZWxlY3QgYXBwbGljYXRpb25zLCBzdWNoIGFzIHZpcnR1YWwgaG9zdGluZworCXdlYi1zZXJ2ZXJzLCB0aGUgTkRDIHNvbHV0aW9uIGlzIG5vdCBzdWZmaWNpZW50LiBBcyBvZiB2ZXJzaW9uCisJMC45LjAsIGxvZzRqIHN1cHBvcnRzIG11bHRpcGxlIGhpZXJhcmNoeSB0cmVlcy4gVGh1cywgaXQgaXMKKwlwb3NzaWJsZSB0byBsb2cgdG8gZGlmZmVyZW50IHRhcmdldHMgZnJvbSB0aGUgc2FtZSBsb2dnZXIKKwlkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29udGV4dC4KKwk8L3A+CisKKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjMuMiI+My4yIExvZ2dlciBpbnN0YW5jZXMgc2VlbSB0byBiZSBjcmVhdGUgb25seS4gV2h5IGlzbid0CisgICAgICB0aGVyZSBhIG1ldGhvZCB0byByZW1vdmUgbG9nZ2VyIGluc3RhbmNlcz88L2E+CisgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgIAorCTxwPkl0IGlzIHF1aXRlIG5vbnRyaXZpYWwgdG8gZGVmaW5lIHRoZSBzZW1hbnRpY3Mgb2YgYQorCSJyZW1vdmVkIiBsb2dnZXIgZXNjZWNpYWxseSBpZiBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoZQorCXVzZXIuIEZ1dHVyZSByZWxlYXNlcyA8ZW0+bWF5PC9lbT4gaW5jbHVkZSBhIHJlbW92ZSBtZXRob2QgaW4KKwl0aGUgTG9nZ2VyIGNsYXNzLjwvcD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjMuMyI+My4zIEhvdyBkbyBJIGdldCBtdWx0aXBsZSBwcm9jZXNzIHRvIGxvZyB0byB0aGUgc2FtZSBmaWxlPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJPHA+WW91IG1heSBoYXZlIGVhY2ggcHJvY2VzcyBsb2cgdG8gYSAKKwk8YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0QXBwZW5kZXIuaHRtbCI+PGNvZGU+U29ja2V0QXBwZW5kZXI8L2NvZGU+PC9hPi4gIAorCVRoZSByZWNlaXZpbmcgCisJPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovbmV0L1NvY2tldFNlcnZlci5odG1sIj48Y29kZT5Tb2NrZXRTZXJ2ZXI8L2NvZGU+PC9hPiAgCisJKG9yIAorCTxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL25ldC9TaW1wbGVTb2NrZXRTZXJ2ZXIuaHRtbCI+PGNvZGU+U2ltcGxlU29ja2V0U2VydmVyPC9jb2RlPjwvYT4pCisJY2FuIHJlY2VpdmUgYWxsIHRoZSBldmVudHMgYW5kIHNlbmQgdGhlbSB0byBhIHNpbmdsZQorCWxvZyBmaWxlLgorCTwvcD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjMuNCI+My40IEhvdyBhYm91dCB0aGUgdGltZXNhbXBzIG9mIGV2ZW50cyBnZW5lcmF0ZWQgYnkgbXVsdGlwbGUKKyAgICAgIHByb2Nlc3NlcyBhY3Jvc3MgbXVsdGlwbGUgaG9zdHMgKHBvc3NpYmx5IGFjcm9zcyBtdWx0aXBsZQorICAgICAgdGltZXpvbmVzKT8KKyAgICAgIDwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJCisJPHA+VGhlIHRpbWVzdGFtcCBpcyBjcmVhdGVkIHdoZW4gdGhlIGxvZ2dpbmcgZXZlbnQgaXMgY3JlYXRlZC4KKwlUaGF0IGlzIHNvIHNheSwgd2hlbiB0aGUgPGNvZGU+ZGVidWc8L2NvZGU+LAorCTxjb2RlPmluZm88L2NvZGU+LCA8Y29kZT53YXJuPC9jb2RlPiwgPGNvZGU+ZXJyb3I8L2NvZGU+IG9yCisJPGNvZGU+ZmF0YWw8L2NvZGU+IG1ldGhvZCBpcyBpbnZva2VkLiAgVGh1cywgdGhlIHRpbWVzdGFtcCBpcworCXVuYWZmZWN0ZWQgYnkgdGhlIHRpbWUgYXQgd2hpY2ggZXZlbnQgYXJyaXZlIGF0IGEgcmVtb3RlCisJc29ja2V0IHNlcnZlci4gIAorCTwvcD4KKwkKKwk8cD5UaW1lc3RhbXBzIGFyZSBzdG9yZWQgaW4gVVRDIGZvcm1hdCBpbnNpZGUgdGhlCisJZXZlbnQuIENvbnNlcXVlbnRseSwgd2hlbiBkaXNwbGF5ZWQgb3Igd3JpdHRlbiB0byBhIGxvZyBmaWxlLAorCXRpbWVzdGFtcHMgYXBwZWFyIGluIHRoZSBzYW1lIHRpbWV6b25lIGFzIHRoZSBob3N0IGRpc3BsYXlpbmcKKwlvciBjcmVhdGluZyB0aGUgbG9nZmlsZS4gIE5vdGUgdGhhdCBiZWNhdXNlIHRoZSBjbG9ja3Mgb2YKKwl2YXJpb3VzIG1hY2hpbmVzIG1heSBub3QgYmUgc3luY2hyb25pemVkLCB0aGVyZSBtYXkgYmUKKwl0aW1lc3RhbXAgaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gZXZlbnRzIGdlbmVyYXRlZCBvbgorCWRpZmZlcmVudCBob3N0cy4KKwk8L3A+CisgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InF1ZXN0aW9uIj4KKyAgICAgICAgICAgICA8YSBuYW1lPSIzLjUiPjMuNSBXaHkgY2FuJ3QgbG9nNGogZmluZCBteSBwcm9wZXJ0aWVzIGZpbGUgaW4gYSBKMkVFIG9yIFdBUgorICAgICAgYXBwbGljYXRpb24/PC9hPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAKKworCTxwPlRoZSBzaG9ydCBhbnN3ZXI6IHRoZSBsb2c0aiBjbGFzc2VzIGFuZCB0aGUgcHJvcGVydGllcyBmaWxlCisJYXJlIG5vdCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBzYW1lIGNsYXNzbG9hZGVyLgorCTwvcD4KKworCTxwPlRoZSBsb25nIGFuc3dlciAoYW5kIHdoYXQgdG8gZG8gYWJvdXQgaXQpOiBKMkVFIG9yIFNlcnZsZXQKKwljb250YWluZXJzIHV0aWxpemUgSmF2YSdzIGNsYXNzIGxvYWRpbmcgc3lzdGVtLiAgU3VuIGNoYW5nZWQKKwl0aGUgd2F5IGNsYXNzbG9hZGluZyB3b3JrcyB3aXRoIHRoZSByZWxlYXNlIG9mIEphdmEgMi4gIEluCisJSmF2YSAyLCBjbGFzc2xvYWRlcnMgYXJlIGFycmFuZ2VkIGluIGEgaGllcmFyY2hpYWwKKwlwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwLiAgV2hlbiBhIGNoaWxkIGNsYXNzbG9hZGVyIG5lZWRzIHRvCisJZmluZCBhIGNsYXNzIG9yIGEgcmVzb3VyY2UsIGl0IGZpcnN0IGRlbGVnYXRlcyB0aGUgcmVxdWVzdCB0bworCXRoZSBwYXJlbnQuCisJPC9wPgorCisJPHA+TG9nNGogb25seSB1c2VzIHRoZSBkZWZhdWx0IDxjb2RlPkNsYXNzLmZvck5hbWUoKTwvY29kZT4KKwltZWNoYW5pc20gZm9yIGxvYWRpbmcgY2xhc3Nlcy4gIFJlc291cmNlcyBhcmUgaGFuZGxlZAorCXNpbWlsYXJseS4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKwk8Y29kZT5qYXZhLmxhbmcuQ2xhc3NMb2FkZXI8L2NvZGU+IGZvciBtb3JlIGRldGFpbHMuCisJPC9wPgorCisJPHA+U28sIGlmIHlvdSdyZSBoYXZpbmcgcHJvYmxlbXMsIHRyeSBsb2FkaW5nIHRoZSBjbGFzcyBvcgorCXJlc291cmNlIHlvdXJzZWxmLiAgSWYgeW91IGNhbid0IGZpbmQgaXQsIG5laXRoZXIgd2lsbAorCWxvZzRqLiA7KQorCTwvcD4KKworICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iMy42Ij4zLjYgSXMgdGhlcmUgYSB3YXkgdG8gZ2V0IGxvZzRqIHRvIGF1dG9tYXRpY2FsbHkgcmVsb2FkIGEKKyAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBpZiBpdCBjaGFuZ2VzPzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJPHA+WWVzLiAgQm90aCB0aGUgRE9NQ29uZmlndXJhdG9yIGFuZCB0aGUgUHJvcGVydHlDb25maWd1cmF0b3Igc3VwcG9ydAorCWF1dG9tYXRpYyByZWxvYWRpbmcgdGhyb3VnaCB0aGUgPGNvZGU+Y29uZmlndXJlQW5kV2F0Y2g8L2NvZGU+IG1ldGhvZC4KKwlTZWUgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCisJPC9wPgogCiAKLTwvYm9keT4gPC9odG1sPgorCTxwPkJlY2F1c2UgdGhlIDxjb2RlPmNvbmZpZ3VyZUFuZFdhdGNoPC9jb2RlPiBsYXVuY2hlcyBhCisJc2VwYXJhdGUgd2F0aGRvZyB0aHJlYWQsIGFuZCBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0byBzdG9wCisJdGhpcyB0aHJlYWQgaW4gbG9nNGogMS4yLCB0aGUgPGNvZGU+Y29uZmlndXJlQW5kV2F0Y2g8L2NvZGU+CisJbWV0aG9kIGlzIHVuc2FmZSBmb3IgdXNlIGluIEoyRUUgZW52cmlyb25tZW50cyB3aGVyZQorCWFwcGxpY2F0aW9ucyBhcmUgcmVjeWNsZWQuCisJPC9wPgorCQorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmYXFTZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iNCI+U2VjdGlvbiA0LjwvYT4gQ29udHJpYnV0aW5nIHRvIHRoZSBwcm9qZWN0CisgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIHF1ZXN0aW9ucyBhYm91dCBjb250cmlidXRpbmcgdG8gdGhlCisgICAgICBwcm9qZWN0PC9wPgorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjQuMSI+NC4xIFdoeSBzaG91bGQgSSBkb25hdGUgbXkgZXh0ZW5zaW9ucyB0byBsb2c0aiBiYWNrIHRvIHRoZQorICAgICAgcHJvamVjdD8KKyAgICAgIDwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJPHA+Q29udHJhcnkgdG8gdGhlIEdOVSBQdWJsaWMgTGljZW5zZSAoR1BMKSB0aGUgQXBhY2hlCisJU29mdHdhcmUgTGljZW5zZSBkb2VzIG5vdCBtYWtlIGFueSBjbGFpbXMgb3ZlciB5b3VyCisJZXh0ZW5zaW9ucy4gQnkgZXh0ZW5zaW9ucywgd2UgbWVhbiB0b3RhbGx5IG5ldyBjb2RlIHRoYXQKKwlpbnZva2VzIGV4aXN0aW5nIGxvZzRqIGNsYXNzZXMuIDxlbT5Zb3UgYXJlIGZyZWUgdG8gZG8KKwl3aGF0ZXZlciB5b3Ugd2lzaCB3aXRoIHlvdXIgcHJvcHJpZXRhcnkgbG9nNGogZXh0ZW5zaW9ucy48L2VtPgorCUluIHBhcnRpY3VsYXIsIHlvdSBtYXkgY2hvb3NlIHRvIG5ldmVyIHJlbGVhc2UgeW91ciBleHRlbnNpb25zCisJdG8gdGhlIHdpZGVyIHB1YmxpYy4KKwk8L3A+CisJCisJPHA+V2UgYXJlIHZlcnkgY2FyZWZ1bCBub3QgdG8gY2hhbmdlIHRoZSBsb2c0aiBjbGllbnQgQVBJIHNvCisJdGhhdCBuZXdlciBsb2c0aiByZWxlYXNlcyBhcmUgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoCisJcHJldmlvdXMgdmVyc2lvbnMuIFdlIGFyZSBhIGxvdCBsZXNzIHNjcnVwdWxvdXMgd2l0aCB0aGUKKwlpbnRlcm5hbCBsb2c0aiBBUEkuIFRodXMsIGlmIHlvdXIgZXh0ZW5zaW9uIGlzIGRlc2lnbmVkIHRvCisJd29yayB3aXRoIGxvZzRqIHZlcnNpb24gPGNvZGU+bjwvY29kZT4sIHRoZW4gd2hlbiBsb2c0agorCXJlbGVhc2UgdmVyc2lvbiA8Y29kZT5uKzE8L2NvZGU+IGNvbWVzIG91dCwgeW91IHdpbGwgcHJvYmFibHkKKwluZWVkIHRvIGFkYXB0IHlvdXIgcHJvcHJpZXRhcnkgZXh0ZW5zaW9ucyB0byB0aGUgbmV3IHJlbGVhc2UuCisJPC9wPgorCisJPHA+VGh1cywgeW91IHdpbGwgYmUgZm9yY2VkIHRvIHNwZW5kIHByZWNpb3VzIHJlc291cmNlcyBpbgorCW9yZGVyIHRvIGtlZXAgdXAgd2l0aCBsb2c0aiBjaGFuZ2VzLiBUaGlzIGlzIGNvbW1vbmx5IHJlZmVycmVkCisJdG8gYXMgdGhlICJzdHVwaWQtdGF4LiIgIEJ5IGRvbmF0aW5nIHRoZSBjb2RlIGFuZCBtYWtpbmcgaXQKKwlwYXJ0IG9mIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24sIHlvdSBzYXZlIHlvdXJzZWxmIHRoZQorCXVubmVjZXNzYXJ5IG1haW50ZW5hbmNlIHdvcmsuCisJPC9wPgorCisJPHA+SWYgeW91ciBleHRlbnNpb25zIGFyZSB1c2VmdWwgdGhlbiBzb21lb25lIHdpbGwgZXZlbnR1YWxseQorCXdyaXRlIGFuIGV4dGVuc2lvbiBwcm92aWRpbmcgdGhlIHNhbWUgb3IgdmVyeSBzaW1pbGFyCisJZnVuY3Rpb25hbGl0eS4gIFlvdXIgZGV2ZWxvcG1lbnQgZWZmb3J0IHdpbGwgYmUgd2FzdGVkLiBVbmxlc3MKKwl0aGUgcHJvcHJpZXRhcnkgbG9nNGogZXh0ZW5zaW9uIGlzIGJ1c2luZXNzIGNyaXRpY2FsLCB0aGVyZSBpcworCWxpdHRsZSByZWFzb24gZm9yIG5vdCBkb25hdGluZyB5b3VyIGV4dGVuc2lvbnMgYmFjayB0byB0aGUKKwlwcm9qZWN0LgorCTwvcD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icXVlc3Rpb24iPgorICAgICAgICAgICAgIDxhIG5hbWU9IjQuMiI+NC4yIFdoYXQgc2hvdWxkIEkga2VlcCBpbiBtaW5kIHdoZW4gY29udHJpYnV0aW5nIGNvZGU/PC9hPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAKKwk8b2w+CisKKwkgIDxsaT4KKwkgICAgPHA+V3JpdGUgYSB0ZXN0IGNhc2UgZm9yIHlvdXIgY29udHJpYnV0aW9uLjwvcD4KKworCSAgICA8cD5UaGVyZSBpcyBub3RoaW5nIG1vcmUgaXJyaXRhdGluZyB0aGFuIGZpbmRpbmcgdGhlIGJ1Z3MKKwkgICAgaW4gZGVidWdnaW5nIChpLmUuIGxvZ2dpbmcpIGNvZGUuIFdyaXRpbmcgYSB0ZXN0IGNhc2UKKwkgICAgdGFrZXMgc29tZSBlZmZvcnQgYnV0IGlzIGNydWNpYWwgZm9yIGEgd2lkZWx5IHVzZWQgbGlicmFyeQorCSAgICBzdWNoIGFzIGxvZzRqLiBXcml0aW5nIGEgdGVzdCBjYXNlIHdpbGwgZ28gYSBsb25nIHdheSBpbgorCSAgICBlYXJuaW5nIHlvdSB0aGUgcmVzcGVjdCBvZiBmZWxsb3cgZGV2ZWxvcGVycy4gU2VlIHRoZQorCSAgICB0ZXN0cy8gZGlyZWN0b3J5IGZvciBleGl0aW5nIHRlc3QgY2FzZXMuCisJICAgIDwvcD4KKwkgIDwvbGk+CisKKwkgIAorCSAgPGxpPgorCSAgICA8cD5TdGljayB0byB0aGUgZXhpc3RpbmcgaW5kZW50YXRpb24gc3R5bGUgZXZlbiBpZiB5b3UgaGF0ZSBpdC48L3A+CisJICAgIAorCSAgICA8cD5BbHRlcm5hdGluZyBiZXR3ZWVuIGluZGVudGF0aW9uIHN0eWxlcyBtYWtlcyBpdCBoYXJkIHRvCisJICAgIHVuZGVyc3RhbmQgdGhlIHNvdXJjZSBjb2RlLiBNYWtlIGl0IGEgbGl0dGxlIGhhcmRlciBvbgorCSAgICB5b3Vyc2VsZiBidXQgZWFzaWVyIG9uIG90aGVycy4KKwkgICAgPC9wPgorCisJICAgIDxwPkxvZzRqIGhhcyBhZG9wdGVkIGEgcmF0aGVyIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCBieQorCSAgICBmb2xsb3dpbmcgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9jb2RlY29udi8iPkNvZGUgQ29udmVudGlvbnMKKwkgICAgZm9yIHRoZSBKYXZhVE0gUHJvZ3JhbW1pbmcgTGFuZ3VhZ2U8L2E+LiA8Yj5XZSB1c2UgMiAodHdvKQorCSAgICBzcGFjZXMgZm9yIGluZGVudGF0aW9uIGFuZCBubyB0YWJzLjwvYj4KKwkgICAgPC9wPgorCSAgPC9saT4KKworCSAgPGxpPgorCSAgICA8cD5QbGVhc2UgZG8gbm90IGJvdGggbW9kaWZ5IHRoZSBjb2RlIGFuZCBjaGFuZ2UgdGhlCisJICAgIGluZGVudGF0aW9uIGluIGEgc2luZ2xlIGNvbW1pdC48L3A+CisJICAgIAorCSAgICA8cD5JZiB5b3UgY2hhbmdlIHRoZSBjb2RlIGFuZCByZWZvcm1hdCBpdCBhdCB0aGUgc2FtZSB0aW1lCisJICAgIGFuZCB0aGVuIGNvbW1pdCwgdGhlIGNvbW1pdCBub3RpZmljYXRpb24gbWVzc2FnZSB3aWxsIGJlCisJICAgIGhhcmQgdG8gcmVhZC4gSXQgd2lsbCBjb250YWluIG1hbnkgZGlmZnMgYXNzb2NpYXRlZCB3aXRoCisJICAgIHRoZSByZWZvcm1hdHRpbmcgaW4gYWRkaXRpb24gdG8gbG9naWNhbCBjaGFuZ2VzLgorCSAgICA8L3A+CisKKwkgICAgPHA+SWYgeW91IG11c3QgcmVmb3JtYXQgYW5kIGNoYW5nZSB0aGUgY29kZSwgdGhlbiBwZXJmb3JtCisJICAgIGVhY2ggc3RlcCBzZXBhcmF0ZWx5LiBGb3IgZXhhbXBsZSwgcmVmb3JtYXQgdGhlIGNvZGUgYW5kCisJICAgIGNvbW1pdC4gRm9sbG93aW5nIHRoYXQsIHlvdSBjYW4gY2hhbmdlIHRoZSBsb2dpYyBhbmQKKwkgICAgY29tbWl0LiBUaGUgdHdvIHN0ZXBzIGNhbiBiZSBwZXJmb3JtZWQgaW4gdGhlIHJldmVyc2UKKwkgICAgb3JkZXIganVzdCBhcyB3ZWxsLiBZb3UgY2FuIGZpcnN0IGNoYW5nZSB0aGUgbG9naWMgYW5kCisJICAgIGNvbW1pdCBhbmQgb25seSBsYXRlciByZWZvcm1hdCBhbmQgY29tbWl0LgorCSAgICA8L3A+CisKKwkgIDwvbGk+CisJICA8bGk+CisJICAgIDxwPk1ha2UgZXZlcnkgZWZmb3J0IHRvIHN0aWNrIHRvIHRoZSBKREsgMS4xIEFQSS48L3A+CisJICAgIAorCSAgICA8cD5PbmUgb2YgdGhlIGltcG9ydGFudCBhZHZhbnRhZ2VzIG9mIGxvZzRqIGlzIGl0cworCSAgICBjb21wYXRpYmlsaXR5IHdpdGggSkRLIDEuMS54LgorCSAgICA8L3A+CisJICA8L2xpPgorCisJICA8bGk+CisJICAgIDxwPkFsd2F5cyBrZWVwIGl0IHNpbXBsZSwgc21hbGwgYW5kIGZhc3Qgd2hlbgorCSAgICBwb3NzaWJsZS48L3A+CisKKwkgICAgPHA+SXQncyBhbGwgYWJvdXQgdGhlIGFwcGxpY2F0aW9uIG5vdCBhYm91dCBsb2dnaW5nLjwvcD4KKwkgIDwvbGk+CisJICAKKwkgIDxsaT4KKwkgICAgPHA+SWRlbnRpZnkgeW91cnNlbGYgYXMgYSBjb250cmlidXRvciBhdCB0aGUgdG9wIG9mIHRoZQorCSAgICByZWxldmFudCBmaWxlLgorCSAgICA8L3A+CisJICA8L2xpPgorCSAgPGxpPgorCSAgICA8cD5UYWtlIHJlc3BvbnNpYmlsaXR5IGZvciB5b3VyIGNvZGUuPC9wPgorCSAgICAKKwkgICAgPHA+QXV0aG9yaW5nIHNvZnR3YXJlIGlzIHZlcnkgbXVjaCBsaWtlIHJ1bm5pbmcgYSBtYXJhdGhvbi4gSXQKKwkgICAgdGFrZXMgdGltZSBhbmQgZW5kdXJhbmNlLgorCSAgICA8L3A+CisJICA8L2xpPgorCSAgPGxpPgorCSAgICA8cD5EaWQgd2UgbWVudGlvbiBzdGlja2luZyB3aXRoIHRoZSBpbmRlbnRhdGlvbiBzdHlsZT8gPC9wPgorCSAgPC9saT4KKwkgIDxsaT48cD5EaWQgd2UgbWVudGlvbiB3cml0aW5nIHRlc3QgY2FzZXM/IDwvcD4KKwkgIDwvbGk+CisJICAKKwk8L29sPgorICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+CisgICAgICAgICAgICAgPGEgbmFtZT0iNC4zIj40LjMgSG93IGNhbiBJIGNvbnRyaWJ1dGUgYSBuZXcgcXVlc3Rpb24vYW5zd2VyIHRvIHRoaXMKKyAgICAgIGRvY3VtZW50PzwvYT4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgCisJPHA+TG9nNGogdXNlcyA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5L2FuYWtpYS5odG1sIj52ZWxvY2l0eS1hbmFraWE8L2E+CisJdG8gZ2VuZXJhdGUgaXRzIHdlYi1zaXRlLCBpbmNsdWRpbmcgdGhpcyBGQVEuIFdlIGhhdmUgZGV2aXNlZAorCXNwZWNpYWwgbWFjcm9zIHRvIGhlbHAgdXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBsYWJlbGVkCisJcXVlc3Rpb24vYW5zd2VyIHBhaXJzLgorCTwvcD4KKworCTxwPklmIHlvdSBhcmUgbm90IGEgY29tbWl0ZXIsIHlvdSBjYW4gc2ltcGx5IHN1Ym1pdCB5b3VyIG5ldworCXF1ZXN0aW9uL2Fuc3dlciBwYWlyIHRvIHRoZSBsb2c0ai1kZXZAbG9nZ2luZy5hcGFjaGUub3JnCisJbWFpbGluZyBsaXN0LiBUaGUgY29tbWl0dGVycyB3aWxsIHRha2UgaXQgZnJvbSB0aGVyZS4KKwk8L3A+CisKKwk8cD5JZiB5b3UgYXJlIGEgY29tbWl0dGVyLCB0aGVuIHlvdSBtdXN0IGVkaXQgdGhlCisJPGVtPi9zcmMveGRvY3MvZmFxLnhtbDwvZW0+IGZpbGUuIFRoZSBmb3JtYXQgb2YgdGhlIGZpbGUKKwlzaG91bGQgYmUgc2VsZi1ldmlkZW50LiBBZnRlciB5b3UgaGF2ZSBtYWRlIHlvdXIgY2hhbmdlcywgcnVuCisJdGhlIGNvbW1hbmQKKwk8L3A+CisJPHByZSBjbGFzcz0ic291cmNlIj5hbnQgc2l0ZTwvcHJlPgorCisJPHA+QWZ0ZXIgdGhlIGFwcHJvcHJpYXRlIHRyYW5zZm9ybWF0aW9uLCB5b3VyIGNoYW5nZXMgc2hvdWxkCisJYXBwZWFyIGluIHRoZSBmaWxlIDxlbT4vZG9jcy9mYXEuaHRtbDwvZW0+LgorCTwvcD4KKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDwhLS0gRk9PVEVSIC0tPgorICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJjZW50ZXIiPjxmb250IGNvbG9yPSIjNTI1RDc2IiBzaXplPSItMSI+PGVtPgorICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwNSwgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgICAgICAgICAgICAgIDwvZW0+PC9mb250PjwvZGl2PgorCisgICAgICAgICAgIDwhLS0gRU5EIG1haW4gdGFibGUgLS0+IAorCisgICAgICAgICAgIDwhLS0gTEVGVCBTSURFIE5BVklHQVRJT04gLS0+CisgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxkaXYgY2xhc3M9ImxlZnRjb2wiPgorICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVudV9oZWFkZXIiPkxvZzRqIFByb2plY3Q8L2Rpdj4KKyAgICAgICAgICAgICAgCSA8ZGl2IGNsYXNzPSJtZW51X2l0ZW0iPiAgICAgICAgPGEgaHJlZj0iLi9pbmRleC5odG1sIj5JbnRyb2R1Y3Rpb248L2E+CisgIDwvZGl2PgorICAgICAgICAgICAgICAJIDxkaXYgY2xhc3M9Im1lbnVfaXRlbSI+ICAgICAgICA8YSBocmVmPSIuL2Rvd25sb2FkLmh0bWwiPkRvd25sb2FkPC9hPgorICA8L2Rpdj4KKyAgICAgICAgICAgICAgCSA8ZGl2IGNsYXNzPSJtZW51X2l0ZW0iPiAgICAgICAgPGEgaHJlZj0iLi9kb2N1bWVudGF0aW9uLmh0bWwiPkRvY3VtZW50YXRpb248L2E+CisgIDwvZGl2PgorICAgICAgICAgICAgICAJIDxkaXYgY2xhc3M9Im1lbnVfaXRlbSI+ICAgICAgICA8YSBocmVmPSIuL2NvbnRhY3RVcy5odG1sIj5Db250YWN0IHVzPC9hPgorICA8L2Rpdj4KKyAgICAgICAgICAgICAgCSA8ZGl2IGNsYXNzPSJtZW51X2l0ZW0iPiAgICAgICAgPGEgaHJlZj0iLi9jb250cmlidXRvcnMuaHRtbCI+Q29udHJpYnV0b3JzPC9hPgorICA8L2Rpdj4KKyAgICAgICAgICAgICAgCSA8ZGl2IGNsYXNzPSJtZW51X2l0ZW0iPiAgICAgICAgPGEgaHJlZj0iLi9jaGFpbnNhdy5odG1sIj5DaGFpbnNhdzwvYT4KKyAgPC9kaXY+CisgICAgICAgICAgICAgIAkgPGRpdiBjbGFzcz0ibWVudV9pdGVtIj4gICAgICAgIDxhIGhyZWY9Ii4vaGlzdG9yeS5odG1sIj5IaXN0b3J5PC9hPgorICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbnVfaGVhZGVyIj5TdXBwb3J0PC9kaXY+CisgICAgICAgICAgICAgIAkgPGRpdiBjbGFzcz0ibWVudV9pdGVtIj4gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvc2l0ZS9iaW5pbmRleC5jZ2kiPkJpbmFyeSBkaXN0cmlidXRpb25zPC9hPgorICA8L2Rpdj4KKyAgICAgICAgICAgICAgCSA8ZGl2IGNsYXNzPSJtZW51X2l0ZW0iPiAgICAgICAgPGEgaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9zaXRlL2N2cy1yZXBvc2l0b3JpZXMuaHRtbCI+Q1ZTIFJlcG9zaXRvcmllczwvYT4KKyAgPC9kaXY+CisgICAgICAgICAgICAgIAkgPGRpdiBjbGFzcz0ibWVudV9pdGVtIj4gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvc2l0ZS9tYWlsaW5nLWxpc3RzLmh0bWwiPk1haWxpbmcgTGlzdHM8L2E+CisgIDwvZGl2PgorICAgICAgICAgICAgICAJIDxkaXYgY2xhc3M9Im1lbnVfaXRlbSI+ICAgICAgICA8YSBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL3NpdGUvYnVncmVwb3J0Lmh0bWwiPkJ1ZyBSZXBvcnRpbmc8L2E+CisgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVudV9oZWFkZXIiPlJlbGF0ZWQgUHJvamVjdHM8L2Rpdj4KKyAgICAgICAgICAgICAgCSA8ZGl2IGNsYXNzPSJtZW51X2l0ZW0iPiAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbGY0ai5vcmciPlNMRjRKPC9hPgorICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbnVfaGVhZGVyIj5UcmFuc2xhdGlvbnM8L2Rpdj4KKyAgICAgICAgICAgICAgCSA8ZGl2IGNsYXNzPSJtZW51X2l0ZW0iPiAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLWtvcmVhLm9yZy9sb2c0ai9pbmRleC5odG1sIj5Lb3JlYW48L2E+CisgIDwvZGl2PgorICAgICAgICAgICAgICAJIDxkaXYgY2xhc3M9Im1lbnVfaXRlbSI+ICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmluZ3JpZC5vcmcvamFqYWthcnRhL2xvZzRqLyI+SmFwYW5lc2U8L2E+CisgIDwvZGl2PgorICAgICAgICAgICAgIDwvZGl2PiAKKyAgIAorCisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8IS0tIGVuZCB0aGUgcHJvY2Vzc2luZyAtLT4KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2RvY3MvSElTVE9SWSBiL2RvY3MvSElTVE9SWS50eHQKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gZG9jcy9ISVNUT1JZCnJlbmFtZSB0byBkb2NzL0hJU1RPUlkudHh0CmluZGV4IGQyMGZiYTEuLmZjYzliYjMgMTAwNjQ0Ci0tLSBhL2RvY3MvSElTVE9SWQorKysgYi9kb2NzL0hJU1RPUlkudHh0CkBAIC01LDcgKzUsMTY2IEBACiAgICAgICAgY2xpZW50IGNvZGUuIAogIFsqKipdIENoYW5nZXMgcmVxdWlyaW5nIGltcG9ydGFudCBtb2RpZmljYXRpb25zIHRvIGV4aXN0aW5nIGNsaWVudCBjb2RlLgogCi0gQXByaWwsIDIwMDIKKyBDdXJyZW50IGN2cyB2MV8yLWJyYW5jaCAoMS4yLjExIHByZXJlbGVhc2UpCisKKyAtIEZpeGVkIGJ1ZyAjMzQ0OTEgd2hlcmVieSB0aGUgY2xhc3Mgby5hLmxvZzRqLm9yLmptcy5NZXNzYWdlUmVuZGVyZXIKKyAgIHdvdWxkIG5vdCBiZSBjb21waWxlZCBpbiB0aGUgYnVpbGQuam1zIHRhcmdldC4gQnVnIHJlcG9ydGVkIGJ5IEFuZHkKKyAgIE1jQnJpZGUuIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzQ0OTEKKyAKKyBBcHJpbCAyOHRoLCAyMDA1CisKKyAtIFJlbGVhc2Ugb2YgdmVyc2lvbiAxLjIuMTAKKworIC0gVmVyc2lvbiAxLjIuMTAgd2FzIG5vdCByZWxlYXNlZCBmb2xsb3dpbmcgdGhlIGFjY2VwdGVkIHJ1bGVzIGFuZCBwcm9jZXNzIG9mCisgICB0aGUgbG9nNGogcHJvamVjdCBhbmQgTG9nZ2luZyBTZXJ2aWNlcyBQcm9qZWN0IGFuZCB3YXMgcmVjYWxsZWQgYW5kIHJlbW92ZWQuCisgICBQbGVhc2UgZG8gbm90IHVzZSB2ZXJzaW9uIDEuMi4xMCwgaXQgaXMgbm90IGFuIG9mZmljaWFsIGxvZzRqIHJlbGVhc2UuCisKKyBOb3ZlbWJlciAxc3QsIDIwMDQKKworIC0gUmVsZWFzZSBvZiB2ZXJzaW9uIDEuMi45CisKKyAgTG9nNGogdmVyc2lvbiAxLjIuOSwgaXMgaWRlbnRpY2FsIHRvIHZlcnNpb24gMS4yLjgsIGV4Y2VwdCB0aGF0CisgIHNldmVyYWwga2V5IG1ldGhvZHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgaW4gcHJlcGFyYXRpb24gZm9yIHZlcnNpb24KKyAgMS4zLjAsIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Ugb2YgbG9nNGouIFRoZXNlIGNoYW5nZXMgYXJlIGludGVuZGVkIHRvCisgIGVuZm9yY2UgdGhlIHJ1bGUgdGhhdCBjbGllbnQgY29kZSBzaG91bGQgbmV2ZXIgcmVmZXIgdG8gdGhlIENhdGVnb3J5CisgIGNsYXNzIGRpcmVjdGx5LCBidXQgdXNlIHRoZSBMb2dnZXIgY2xhc3MgaW5zdGVhZC4gU2ltaWxhcmx5LCBjbGllbnQKKyAgY29kZSBzaG91bGQgbm90IHJlZmVyIHRvIHRoZSBQcmlvcml0eSBjbGFzcyBidXQgdG8gdGhlIExldmVsIGNsYXNzCisgIGluc3RlYWQuCisKKyAgRm9yIGEgbW9yZSBkZXRhaWxlZCBkaXNjdXNzaW9uLCByZWZlciB0byB0aGUgZG9jdW1lbnQgZW50aXRsZWQKKyAgcHJlcGFyaW5nIGZvciBsb2c0aiAxLjMgYXQ6CisKKyAgICBodHRwOi8vd3d3LnFvcy5jaC9sb2dnaW5nL3ByZXBhcmluZ0ZvcjEzLmpzcAorCisgRmVicnVhcnkgMTl0aCwgMjAwMworIAorIC0gUmVsZWFzZSBvZiB2ZXJzaW9uIDEuMi44CisKKyAtIEZpeGVkIGJ1ZyAjMTE1NzAgd2hlcmVieSBYTUxBcHBlbmRlciB3b3VsZCB0aHJvdyBhCisgICBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgaW5wdXQgbWVzc2FnZSB3YXMgbnVsbC4gTWFueSB0aGFua3MgdG8KKyAgIERhdmlkIFZhbmRlZ3JpZnQgZm9yIHJlcG9ydGluZyB0aGUgYnVnIGFuZCB0byBIZW5kcmlrIEJydW1tZXJtYW5uIGZvcgorICAgc3VwcGx5aW5nIHRoZSBwYXRjaC4gWypdCisKKyAtIEZpeGVkIGJ1ZyAjMTIzNjYgd2hlcmVieSB2YXJpb3VzIHZlcnNpb25zIG9mIFhlcmNlcyB3b3VsZCBub3QgcGFyc2UKKyAgIGxvZzRqIGNvbmZpZ3VyYXRpb24gc2NyaXB0cyBleHByZXNzZWQgaW4gWE1MIGZvcm1hdC4gWypdCisgICAKKyAtIEZpeGVkIGJ1ZyAjMTQ4MjcuIFRoZSAicmVtb3ZlcyIgYnVmZmVyIHVzZWQgaW4gdGhlIGZsdXNoQnVmZmVyKCkgbWV0aG9kCisgICBvZiBKREJDQXBwZW5kZXIgaXMgbm93IGNsZWFyZWQsIHNvbHZpbmcgdGhlIG1lbW9yeSBsZWFrLiAgVGhhbmtzIHRvIEpvaG4KKyAgIExhbmRlcnMgZm9yIHJlcG9ydGluZyB0aGUgYnVnIGFuZCBzdWdnZXN0aW5nIHRoZSBmaXguIFsqXQorCisgLSBGaXhlZCBidWcgIzE1NTk5LiBTb2NrZXRBcHBlbmRlciBub3cgaG9ub3JzIFJlY29ubmVjdGlvbkRlbGF5IG9mIDAuCisgICBNYW55IHRoYW5rcyB0byBTY290dCBTY2hyYW0gZm9yIHJlcG9ydGluZyB0aGUgYnVnIGFuZCBwcm92aWRpbmcgdGhlIGZpeC4gWypdCisKKyBPY3RvYmVyIDl0aCwgMjAwMgorCisgLSBSZWxlYXNlIG9mIHZlcnNpb24gMS4yLjcKKworIC0gTG9nNGogbm93IHNlYXJjaGVzIGZvciB0aGUgZmlsZSBsb2c0ai54bWwgYXMgd2VsbCBhcyB0aGUgZmlsZQorICAgbG9nNGoucHJvcGVydGllcyBkdXJpbmcgbG9nNGogaW5pdGlhbGl6YXRpb24uIFsqXQorCisgSnVseSAzMXN0LCAyMDAyCisKKyAtIFJlbGVhc2Ugb2YgdmVyc2lvbiAxLjIuNgorCisgLSBBZGRpdGlvbiBvZiBuZXcgb3B0aW9ucyBpbiBKTVNBcHBlbmRlciBhbmQgbmV3IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW4gCisgICBKTVNTaW5rLiBbKl0KKworIC0gQWRkZWQgbmV3IG1ldGhvZCBnZXRMb2dnZXJOYW1lKCkgaW4gTG9nZ2luZ0V2ZW50IGNsYXNzLiBUaGUKKyAgIGdldExvZ2dlck5hbWUgaXMgdGhlIHByZWZlcnJlZCB3YXkgZm9yIGFjY2Vzc2luZyB0aGUgbG9nZ2VyCisgICBuYW1lLiBUaGUgcHVibGljIGFjY2VzcyBjYXRlZ29yeU5hbWUgZmllbGQgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZAorICAgZGlyZWN0bHkuIFNpbWlsYXJseSwgYWRkZWQgdGhlIGdldExldmVsIG1ldGhvZCB3aGljaCBpcyBub3cgdGhlCisgICBwcmVmZXJyZWQgd2F5IG9mIGFjY2Vzc2luZyB0aGUgZXZlbnQncyBsZXZlbC4gVGhlIHB1YmxpYyBhY2Nlc3MKKyAgIGxldmVsIGZpZWxkIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkuICBUaGUgamF2YWRvY3Mgbm93IG1hcmsKKyAgIHRoZSBjYXRlZ29yeU5hbWUgYW5kIGxldmVsIGZpZWxkcyBhcyBkZXByZWNhdGVkLgorCisgICBNb2RpZmllZCBleGlzdGluZyBhcHBlbmRlcnMgdG8gY29tcGx5IHdpdGggdGhlc2UgbmV3IGRpcmVjdGl2ZXMuIFsqXQorCisgLSBMb2c0aiBub3cgd2lsbCBjaGVjayBpZiBhIHN5c3RlbSBwcm9wZXJ0eSBuYW1lZCAibG9nNGouaWdub3JlVENMIgorICAgaXMgc2V0LiBJZiBpdCBpcyBzZXQsIHRoZW4gaXQgd2lsbCBpZ25vcmUgdGhlIFRocmVhZCBDb250ZXh0CisgICBDbGFzc0xvYWRlciB3aGVuIGxvYWRpbmcgY2xhc3Nlcy4gVGhpcyBzb2x2ZXMgdGhlIGlycml0YXRpbmcKKyAgICJhcHBlbmRlciBpcyBub3QgYXNzaWduYWJsZSB0byBBcHBlbmRlciIgbWVzc2FnZXMgb2JzZXJ2ZWQgd2hlbgorICAgbG9nNGouamFyIGlzIGxvYWRlZCBieSBtdWx0aXBsZSBjbGFzcyBsb2FkZXJzLiAKKworICAgVGhlIGVycm9yIHJlcG9ydGluZyBmb3IgdGhpcyBwcm9ibGVtIHdhcyBhbHNvIGltcHJvdmVkLiBbKl0KKworIC0gRml4ZWQgYnVnICMxMDUyOCB3aGVyZWJ5IGNhbGxpbmcgdGhlIE1EQy5nZXQgbWV0aG9kIHdpdGggYSBudWxsCisgICBhcmd1bWVudCB3b3VsZCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLiBbKl0KKworIEp1bHkgNXRoLCAyMDAyCisgCisgLSBSZWxlYXNlIG9mIHZlcnNpb24gMS4yLjUKKwkKKyAtIE1pbm9yIGNoYW5nZXMgYW5kIGJ1ZyBmaXhlcyBpbiBMRjUuIFsqXQorIAorIC0gQ2FsbGluZyBhbiBBc3luY0FwcGVuZGVyIGNsb3NlIG1ldGhvZCBhbHNvIGNsb3NlcyB0aGUgZW1iZWRkZWQKKyAgIGFwcGVuZGVyIGluc3RhbmNlcy4gVGhpcyByZXNvbHZlcyBidWcgIzEwMTg1IHN1Ym1pdHRlZCBieSBQYXVsCisgICBWb3V0aWVyLiBbKl0KKworIEp1bmUgMTJ0aCwgMjAwMgorCisgLSBSZWxlYXNlIG9mIHZlcnNpb24gMS4yLjQKKworIC0gVGhlIEpEQkNBcHBlbmRlciBpcyBtYXJrZWQgYXMgc2xhdGVkIGZvciByZXBsYWNlbWVudC4gRG8gbm90IGJ1aWxkCisgICBjcml0aWNhbCBzb2Z0d2FyZSB1c2luZyBpdC4gCisKKyAtIEFkZGVkIExGNSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4gRnVydGhlciB0ZXN0cyBhcmUgcmVxdWlyZWQKKyAgIGZvciBmdWxsIGludGVncmF0aW9uLiBbKl0KKworIC0gWE1MTGF5b3V0IGNhbiBub3cgb3V0cHV0IG1lc3NhZ2VzIHdoaWNoIGNvbnRhaW4gZW1iZWRkZWQgQ0RBVEEKKyAgIHNlY3Rpb25zLiBUaGlzIHJlc29sdmVzIGJ1ZyAjOTc1MC4gTWFueSB0aGFua3MgdG8gTWljaGFlbAorICAgQS4gTWNBbmd1cyBmb3Igc3VwcGx5aW5nIHRoZSByZWxldmFudCBwYXRjaC4gWypdCisKKyAtIFRoZSBkaXNwYXRjaGVyIHRocmVhZCBhc3NvY2lhdGVkIHdpdGggQXN5bmNBcHBlbmRlciBpcyBub3cgbWFya2VkCisgICBhcyBhIGRlYW1vbiB0aHJlYWQuIFRoaXMgcmVzb2x2ZXMgYnVnICM5NzUwLiBbKl0KKworIC0gQWRkZWQgbWlzc2luZyBOVEV2ZW50TG9nQXBwZW5kZXIuZGxsIGFzIHJlcG9ydGVkIGluIGJ1ZyAjOTYwNi4gWypdCisKKyAtIEluIHJlc3BvbnNlIHRvIGJ1ZyByZXBvcnQgOTQzNSwgdGhlIGxvZzRqLmR0ZCB3YXMgY2hhbmdlZCBzbyB0aGF0CisgICA8bG9nNGo6ZXZlbnQ+IGlzIG5vdyBtYWRlIG9mIGxvZ2dlciBhbmQgbGV2ZWwgYXR0cmlidXRlcyBpbnN0ZWFkIG9mCisgICBjYXRlZ29yeSBhbmQgcHJpb3JpdHkuIENoYW5nZWQgWE1MTGF5b3V0IHRvIGNvbmZvcm0gdG8gdGhlCisgICBEVEQuIENoYWluc2F3IHdhcyBjaGFuZ2VkIHRvIGFkYXB0IHRvIHRoZSBYTUxMYXlvdXQuIFsqXQorCisgLSBBZGRlZCBtaXNzaW5nIExldmVsUmFuZ2VGaWx0ZXIgZmlsZS4gWypdCisKKyBNYXkgMjR0aCwgMjAwMgorCisgLSBSZWxlYXNlIG9mIHZlcnNpb24gMS4yLjMKKworIC0gRml4ZWQgYnVnICM5Mjg1IHdoZXJlIHRoZSBTeXNsb2dBcHBlbmRlciB3b3VsZCBpbmNvcnJlY3RseSBjb21wdXRlCisgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhZ3JhbSB0byBzZW5kIHRvIHRoZSByZW1vdGUgc3lzbG9nZCBob3N0LgorICAgUmVwb3J0ZWQgYnkgTWFtb3J1IEthZG90YS4gWypdCisKKyAtIEZpeGVkIGJ1ZyAjODUwNSB3aGVyZSB0aGUgc3RhY2sgdHJhY2Ugb2YgZXhjZXB0aW9uIHdvdWxkIG5vdCBiZQorICAgcHJvcGVybHkgcHJpbnRlZCBvbiB0aGUgQ29tcGFxIHRydTY0IFVuaXggcGxhdGZvcm0uIEluaXRpYWxseQorICAgcmVwb3J0ZWQgYnkgRmFicmljZSBDbGFlcyBhbmQgbGF0ZXIgYnkgRXNwZW4gSC4gS29sc3RhZCB3aG8gYWxzbworICAgcHJvdmlkZWQgdGhlIGZpeC4gWypdCisKKyBNYXkgMjJuZCwgMjAwMgorCisgLSBSZWxlYXNlIG9mIHZlcnNpb24gMS4yLjIKKworIC0gTG9nNGogY29uZmlndXJhdG9ycyB0YWtlIHRoZSAiTlVMTCIgc3RyaW5nIHZhbHVlIGFzIGEgc3lub255bSBmb3IKKyAgICJJTkhFUklURUQiLiBCb3RoIG9mIHRoZXNlIHR3byBzdHJpbmdzIGFyZSBsZWdhbCBsZXZlbCB2YWx1ZXMgZm9yCisgICBzZXR0aW5nIHRoZSBsZXZlbCBvZiBhIGxvZ2dlci4gQm90aCB2YWx1ZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuIFsqXQorCisgLSBXaGVuIGxvYWRpbmcgY29tcG9uZW50IGNsYXNzZXMsIGxvZzRqIHdpbGwgbm93IGZpcnN0IGF0dGVtcHQgdG8gdXNlCisgICB0aGUgVGhyZWFkIENvbnRleHQgTG9hZGVyIGFuZCBpZiB0aGF0IGZhaWxzLCBpdCB3aWxsIHVzZQorICAgQ2xhc3MuZm9yTmFtZS4gSW4gbG9nNGogMS4yIGFuZCAxLjIuMSwgb25seSBDbGFzcy5mb3JOYW1lIHdhcyB1c2VkCisgICBhbmQgdGhlIFRDTCB3YXMgaWdub3JlZC4gVGhpcyBjaGFuZ2UgaXMgYSByZXNwb25zZSB0byBidWcgIzkzMDUKKyAgIG9wZW5lZCBieSBTY290dCBNLiBTdGFyay4gWypdCisKKyBNYXkgMTd0aCwgMjAwMgorCisgLSBSZWxlYXNlIG9mIHZlcnNpb24gMS4yLjEKKworIC0gVGhpcyBtaW5vciByZWxlYXNlIGZpeGVzIGJ1ZyAjOTE1NSByZXBvcnRlZCBieSBOaWNrbyBDYWRlbGwuCisgICBMb2dnaW5nRXZlbnQuZ2V0TURDQ29weSgpIG1ldGhvZCBub3cgc2V0cyBtZGNDb3B5TG9va3VwUmVxdWlyZWQKKyAgIGluc3RlYWQgb2YgbmRjTG9va3VwUmVxdWlyZWQuICBUaGlzIGJ1ZyB3b3VsZCBjYXVzZSB0aGUgd3JvbmcgTURDCisgICBpbmZvcm1hdGlvbiB0byBhcHBlYXIgb24gYSBsb2cgc2VydmVyLiBJdCBjb3VsZCBvbmx5IG9jY3VyIGlmIHRoZQorICAgY2xpZW50IHdyYXBwZWQgYW4gQXN5bmNBcHBlbmRlciBhcm91bmQgYSBTb2NrZXRBcHBlbmRlciBvciBpZiB0aGUKKyAgIHNlcnZlciB1c2VkIGFuIEFzeW5jQXBwZW5kZXIgZm9yIGl0cyBsb2dnaW5nLiBbKl0KKworIE1heSwgMjAwMgogIAogIC0gUmVsZWFzZSBvZiB2ZXJzaW9uIDEuMiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9jcml0aXF1ZS5odG1sIGIvZG9jcy9jcml0aXF1ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWMyZDcwLi4wMDAwMDAwCi0tLSBhL2RvY3MvY3JpdGlxdWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi08SFRNTD4KLTxkb2N1bWVudD4KLQotPEhFQUQ+Ci08dGl0bGU+SlNSNDcgdnMuIGxvZzRqPC90aXRsZT4KLTwvSEVBRD4KLQotPGJvZHk+Ci0KLTxDRU5URVI+Ci08SDE+SlNSNDcgdnMuIGxvZzRqPC9IMT4KLTwvQ0VOVEVSPgotIAotPGhyPgotPHA+SSBjb25zaWRlciBpdCBxdWl0ZSBkaXN0YXN0ZWZ1bCB0byBjcml0aWNpemUgb3RoZXIgcGVvcGxlJ3Mgd29yaywKLWVzcGVjaWFsbHkgaW4gcHVibGljLiBIb3dldmVyLCBzaW5jZSB0aGUgbG9nZ2luZyBBUEkgaW5jbHVkZWQgaW4gSkRLCi0xLjQgd2lsbCBiZSBjb25zaWRlcmVkIGJ5IG1hbnkgYXMgdGhlICJzdGFuZGFyZCIsIEkgZmVlbCBjb21wZWxsZWQgdG8KLXJlYWN0LiBJIGFtIG5vdCBhbG9uZSBpbiBteSBjcml0aWNpc20gb2YgSlNSNDcsIEdyZWcgRGF2aXMgaGFzIGhpcyBvd24KLXNldCBvZiA8YQotaHJlZj0iaHR0cDovL3d3dy5zd3pvby5vcmcvZG9jdW1lbnRzL21pc2NlbGxhbmVvdXMvanNyMDQ3LyI+Y29tbWVudHM8L2E+LiAKLQotPHA+VGhlIEpESyAxLjQgbG9nZ2luZyBBUEkgaXMgYSByZXN1bHQgb2YgdGhlIDxhCi1ocmVmPSJodHRwOi8vamNwLm9yZy9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9yZXZpZXcvanNyMDQ3L2luZGV4Lmh0bWwiPkpTUjQ3Ci1lZmZvcnQ8L2E+LCBsZWQgYnkgR3JhaGFtIEhhbWlsdG9uLgotCi08cD5CZWZvcmUgZGVsdmluZyBpbnRvIHRoZSBkZXRhaWxzLCBzb21lIGhpc3RvcmljYWwgcGVyc3BlY3RpdmUgaXMgaW4KLW9yZGVyLiBJIGFtIHRoZSBmb3VuZGVyIG9mIHRoZSBsb2c0aiBwcm9qZWN0LiBJIHBhcnRpY2lwYXRlZCBpbiB0aGUKLXNwZWNpZmljYXRpb24gb2YgdGhlIEpTUjQ3IEFQSSwgYWx0aG91Z2ggbm90IGFzIGFuIGV4cGVydC4gSW4gMTk5OSwgSQotd2FzIHN0aWxsIHdvcmtpbmcgZm9yIElCTSBhbmQgY291bGQgbm90IGpvaW4gdGhlIGV4cGVydHMgZ3JvdXAgYmVjYXVzZQotYmlnIGJsdWUgaGFkIGFscmVhZHkgQ2hyaXMgQmFybG9jayBhcyBhIG1lbWJlciBpbiB0aGUgSlNSNDcgZXhwZXJ0cwotZ3JvdXAuIENocmlzIGlzIHRoZSBhdXRob3Igb2YgPGEKLWhyZWY9Imh0dHA6Ly93d3cuYWxwaGF3b3Jrcy5pYm0uY29tL3RlY2gvbG9nZ2luZ3Rvb2xraXQ0aiI+SUJNJ3MKLWxvZ2dpbmcgdG9vbGtpdCBmb3IgSmF2YTwvYT4uCi0KLTxwPk9uIHRoZSBzdXJmYWNlLCBoaXMgdG9vbGtpdCBoYXMgaGVhdmlseSBpbmZsdWVuY2VkIHRoZSBKU1I0NwotQVBJLiBJbiBwYXJ0aWN1bGFyLCB0aGUgdHdvIHNoYXJlIHRoZSBzYW1lIGJhc2ljIGNvbXBvbmVudHMsIG5hbWVseQotbG9nZ2VycywgbGV2ZWxzLCBoYW5kbGVycyBhbmQgZm9ybWF0dGVycy4gSW4gbG9nNGosIHRoZXNlIGNvbXBvbmVudHMKLWFyZSBjYWxsZWQgY2F0ZWdvcmllcywgcHJpb3JpdGllcywgYXBwZW5kZXJzIGFuZCBsYXlvdXRzCi1yZXNwZWN0aXZlbHkuIFBhaXJ3aXNlLCB0aGV5IGFyZSBpZGVudGljYWwgaW4gcHVycG9zZS4gQXMgc3VjaCwgdGhlCi10ZXJtcyBsb2dnZXIgYW5kIGNhdGVnb3J5LCBsZXZlbCBhbmQgcHJpb3JpdHksIGhhbmRsZXIgYW5kIGFwcGVuZGVyLAotZm9ybWF0dGVyIGFuZCBsYXlvdXQgd2lsbCBiZSB1c2VkIGludGVyY2hhbmdlYWJseSBpbiB0aGUgcmVtYWluZGVyIG9mCi10aGlzIGRvY3VtZW50LgotCi08cD5FdmVuIGFmdGVyIGEgY2FzdWFsIHJldmlldyBpdCBzaG91bGQgYmUgYXBwYXJlbnQgdGhhdCB0aGUgbG9nNGogYW5kCi1KU1I0NyBBUElzIGFyZSA8ZW0+dmVyeTwvZW0+IHNpbWlsYXIuIEZvciBvbmUsIHRoZXkgYXJlIHRoZSBvbmx5Ci1sb2dnaW5nIEFQSXMgd2hpY2ggYXJlIGJhc2VkIG9uIGEgbmFtZWQgaGllcmFyY2h5LiBJZiB5b3UgdW5kZXJzdGFuZAotb25lIEFQSSwgdGhlbiB1bmRlcnN0YW5kaW5nIHRoZSBjb25jZXB0cyBvZiB0aGUgb3RoZXIgc2hvdWxkIGJlIGEKLWJyZWV6ZS4gVGhlcmUgYXJlIGRpZmZlcmVuY2VzIGhvd2V2ZXIuCi0KLTxoMj5PbiBQYXJlbnRzIGFuZCAgQ2hpbGRyZW48L2gyPgotCi08cD5JbiBKU1I0NywgYSBwYXJlbnQgbG9nZ2VyIGtub3dzIGFib3V0IGl0cyBjaGlsZHJlbiBidXQgbm90IHRoZQotb3RoZXIgd2F5IGFyb3VuZC4gQ2hpbGRyZW4gZG8gbm90IGhhdmUgbGlua3MgdG8gdGhlaXIgcGFyZW50LiBGb3IKLWV4YW1wbGUsIHRoZSBsb2dnZXIgbmFtZWQgPGNvZGU+ImZvbyI8L2NvZGU+IGtub3dzIGFib3V0Ci08Y29kZT4iZm9vLmJhcjEiPC9jb2RlPiBhbmQgPGNvZGU+ImZvby5iYXIyIjwvY29kZT4uIEhvd2V2ZXIsCi08Y29kZT4iZm9vLmJhcjEiPC9jb2RlPiBoYXMgbm8gbGlua3MgdG8gaXRzIHBhcmVudCA8Y29kZT4iZm9vIjwvY29kZT4uCi0KLTxwPkluIGxvZzRqLCBpdCBpcyBleGFjdGx5IHRoZSBvdGhlciB3YXkgYXJvdW5kLiBBIGxvZzRqIGNhdGVnb3J5Ci1jb250YWlucyBhIGxpbmsgdG8gaXRzIHBhcmVudCBidXQgYSBwYXJlbnQgZG9lcyBub3QgaGF2ZSBsaW5rcyB0byBpdHMKLWNoaWxkcmVuLgotCi08cD5BdCBmaXJzdCBnbGFuY2UsIHRoaXMgbWlnaHQgbG9vayBsaWtlIGEgbXVuZGFuZSBpbXBsZW1lbnRhdGlvbgotZGV0YWlsIGJ1dCBpdCBpcyBhY3R1YWxseSBxdWl0ZSBmdW5kYW1lbnRhbC4KLQotPG9sPgotPHA+PGI+PGxpPkNvbmZpZ3VyYXRpb24gb3JkZXIgbWF0dGVyczwvYj4KLQotPHA+SW4gSlNSNDcsIHdoZW4geW91IHNldCB0aGUgbGV2ZWwgb2YgYSBsb2dnZXIsIHNheQotPGNvZGU+d29tYmF0PC9jb2RlPiwgSlNSNDcgdHJhdmVyc2VzIHRoZSB0cmVlIGJlbG93Ci08Y29kZT53b21iYXQ8L2NvZGU+LiBJbiBvdGhlciB3b3JkcywgdGhlIGxldmVscyBmb3IgYWxsIHRoZSBsb2dnZXJzCi1kZXNjZW5kaW5nIGZyb20gPGNvZGU+d29tYmF0PC9jb2RlPiBhcmUgb3ZlcndyaXR0ZW4uIFRoaXMgY2FuIGJlIGEKLXZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiBmb3IgbGFyZ2UgdHJlZXMuIEluIHBhcnRpY3VsYXIsIGZvciB0aGUgbW9zdAotY29tbW9uIGNhc2Ugd2hlcmUgb25lIHNldHMgdGhlIGxldmVsIG9mIHRoZSByb290IGxvZ2dlci4gSG93ZXZlciwKLXBlcmZvcm1hbmNlIGlzIG5vdCB0aGUgcG9pbnQgSSBhbSB0cnlpbmcgdG8gbWFrZS4KLQotPHA+SW4gbG9nNGosIGNoYW5naW5nIHRoZSBwcmlvcml0eSBvZiBhIGNhdGVnb3J5IGludm9sdmVzIHRoZSBjaGFuZ2UKLW9mIGEgc2luZ2xlIGZpZWxkLiBDaGlsZHJlbiBjYXRlZ29yaWVzIGR5bmFtaWNhbGx5IGluaGVyaXQgdGhlCi1wcmlvcml0eSBvZiB0aGVpciBwYXJlbnQgYnkgdHJhdmVyc2luZyB0aGUgaGllcmFyY2h5IHRyZWUgdXB3YXJkcy4KLQotPHA+SXQgZm9sbG93cyB0aGF0IHdpdGggSlNSNDcgaWYgeW91IGNvbmZpZ3VyZSB0aGUgbGV2ZWwgZm9yIGxvZ2dlcgotImZvby5iYXIxIiBiZWZvcmUgY29uZmlndXJpbmcgdGhlIGxldmVsIGZvciAiZm9vIiwgdGhlbiB0aGUgbGF0dGVyCi1pbnN0cnVjdGlvbiB3aWxsIG92ZXJ3cml0ZSB0aGUgZmlyc3QgZXhhY3RseSBhcyBpZiB0aGUgZmlyc3QKLWluc3RydWN0aW9uIGZvciBjb25maWd1cmluZyAiZm9vLmJhcjEiIGhhZCBuZXZlcgotZXhpc3RlZC4gPGVtPkNvbmZpZ3VyYXRpb24gb3JkZXIgZGVwZW5kZW5jZSBpcyBub3QgYSBzaG93IHN0b3BwZXIgYnV0Ci1pdCBpcyBzb21ldGhpbmcgdGhhdCB3aWxsIGJpdGUgeW91IHRpbWUgYW5kIGFnYWluLjwvZW0+Ci0KLTxwPkluIGNvbnRyYXN0LCBpbiBsb2c0aiBjYXRlZ29yaWVzIGNhbiBiZSBjb25maWd1cmVkIGluIGFueQotb3JkZXIuIFlvdSBuZXZlciBoYXZlIHRvIHdvcnJ5IGFib3V0IGNvbmZpZ3VyYXRpb24gb3JkZXIuCi0KLTxwPjxiPjxsaT5MaW1pdGVkIGluaGVyaXRhbmNlPC9iPgotCi08cD5JbiBKU1I0NywgYSBsb2dnZXIgZG9lcyBub3Qgd2FsayB0aGUgaGllcmFyY2h5IHRvIGluaGVyaXQgaXRzIGxldmVsCi1idXQgcG9zc2Vzc2VzIGEgY29weSBvZiBpdC4gCi0KLTxwPlVuZm9ydHVuYXRlbHksIGluIHRoZSBKU1I0NyBBUEksIGhhbmRsZXJzIGNhbm5vdCBiZSBpbmhlcml0ZWQKLWJlY2F1c2UgaXQgd291bGQgYmUgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgdG8gbGV0IGVhY2ggbG9nZ2VyIHRvCi1jb250YWluIGEgZGlzdGluY3QgVmVjdG9yIG9mIGFsbCBpbmhlcml0ZWQgaGFuZGxlcnMsIGVzcGVjaWFsbHkgaW4KLWxhcmdlIHRyZWVzLgotCi08cD5UbyBjaXJjdW12ZW50IHRoaXMgcHJvYmxlbSBieSBKU1I0NyBkZWZpbmVzIGdsb2JhbCBoYW5kbGVycy4gQQotbG9nZ2VyIGxvZ3MgdG8gZ2xvYmFsIGhhbmRsZXJzIGFuZCB0byB0aGUgaGFuZGxlcnMgYXR0YWNoZWQgdG8gaXRzZWxmCi1kaXJlY3RseS4gPGVtPkl0IGRvZXMgbm90IGluaGVyaXQgYW55IGhhbmRsZXJzIGZyb20gdGhlCi1oaWVyYXJjaHkuPC9lbT4KLQotPHA+SW4gbG9nNGosIGFwcGVuZGVycyBhcmUgaW5oZXJpdGVkIGFkZGl0aXZlbHkgZnJvbSB0aGUgaGllcmFyY2h5LiBBCi1jYXRlZ29yeSB3aWxsIGxvZyB0byB0aGUgYXBwZW5kZXJzIGF0dGFjaGVkIHRvIGl0c2VsZiBhcyB3ZWxsIGFzIHRoZQotYXBwZW5kZXJzIGF0dGFjaGVkIHRvIGl0cyBhbmNlc3RvcnMuIFRoaXMgbWlnaHQgbm90IHNlZW0gbGlrZSBtdWNoCi11bnRpbCB0aGUgZGF5IHlvdSBuZWVkIGhhbmRsZXIgaW5oZXJpdGFuY2U7IHByb2JhYmx5IGEgd2VlayBhZnRlciB5b3UKLWRlY2lkZSB0byBhZG9wdCBhIGxvZ2dpbmcgQVBJLgotCi08cD5TaW1pbGFybHksIGluIGxvZzRqIHJlc291cmNlIGJ1bmRsZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZQotaGllcmFyY2h5LiBJbiBKU1I0NywgYSByZXNvdXJjZSBidW5kbGUgPGVtPm11c3Q8L2VtPiBiZSBhdHRhY2hlZCB0bwotZWFjaCBsb2dnZXIgaW5kaXZpZHVhbGx5LiBUaGVyZSBpcyBubyByZXNvdXJjZSBidW5kbGUgaW5oZXJpdGFuY2UgaW4KLUpTUjQ3LiBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlIHRvIGNob29zZSBiZXR3ZWVuCi1pbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgdGhlIGJlbmVmaXRzIG9mIHRoZSBuYW1lZCBsb2dnZXIKLWhpZXJhcmNoeS4gSXQncyBvbmUgb3IgdGhlIG90aGVyLiBUaGlzIGxpbWl0YXRpb24gaXMgcGFydGljdWxhcmx5Ci1zdXJwcmlzaW5nIGJlY2F1c2Ugc3VwcG9ydCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gaXMgYWR2b2NhdGVkIGFzCi1vbmUgb2YgdGhlIHByaW1hcnkgYWR2YW50YWdlcyBvZiB0aGUgSlNSNDcgQVBJLgotCi08L29sPgotCi08aDI+Qm9ndXMgTGV2ZWxzPC9oMj4KLQotPHA+SlNSIDQ3IGRlZmluZXMgdGhlIGxldmVscyA8Y29kZT5BTEw8L2NvZGU+LCA8Y29kZT5TRVZFUkU8L2NvZGU+LAotPGNvZGU+V0FSTklORzwvY29kZT4sIDxjb2RlPklORk88L2NvZGU+LCA8Y29kZT5DT05GSUc8L2NvZGU+LAotPGNvZGU+RklORTwvY29kZT4sIDxjb2RlPkZJTkVSPC9jb2RlPiwgPGNvZGU+RklORVNUPC9jb2RlPiBhbmQKLTxjb2RlPk9GRjwvY29kZT4uIEV4cGVyaWVuY2Ugc2hvd3MgdGhhdCB0aGUgbGV2ZWxzIDxjb2RlPkFMTDwvY29kZT4KLWFuZCA8Y29kZT5PRkY8L2NvZGU+IGFyZSBuZXZlciBuZWVkZWQuIFRoZSA8Y29kZT5TRVZFUkU8L2NvZGU+IGFuZAotPGNvZGU+Q09ORklHPC9jb2RlPiBsZXZlbHMgYXJlIHVuaXF1ZSB0byBKU1I0Ny4KLQotPHA+SGF2aW5nIHRocmVlIGRlYnVnZ2luZyBsZXZlbHMgPGNvZGU+RklORTwvY29kZT4sCi08Y29kZT5GSU5FUjwvY29kZT4sIDxjb2RlPkZJTkVTVDwvY29kZT4gY291bGQgc2VlbSBsaWtlIGEgZ29vZAotaWRlYS4gSG93ZXZlciwgeW91IHdpbGwgc29vbiBkaXNjb3ZlciB0aGF0IGV2ZW4gd2hlbiBieSB5b3Vyc2VsZiwgaXQKLWlzIGhhcmQgdG8gZGVjaWRlIHdoZW4gdG8gdXNlIHdoaWNoIGxldmVsLiBJdCBpcyBwbGFpbiBpbXBvc3NpYmxlIGluCi1ncm91cHMuCi0KLTxwPkxvZzRqIGluIGNvbnRyYXN0IGhhcyBhIGxpbWl0ZWQgYnV0IHNlbGYtZXZpZGVudCBzZXQgb2YgcHJpb3JpdGllczoKLTxjb2RlPkZBVEFMPC9jb2RlPiwgPGNvZGU+RVJST1I8L2NvZGU+LCA8Y29kZT5XQVJOPC9jb2RlPiwKLTxjb2RlPklORk88L2NvZGU+IGFuZCA8Y29kZT5ERUJVRzwvY29kZT4uCi0KLTxwPkJvdGggSlNSNDcgYW5kIGxvZzRqIGFsbG93IHRoZSB1c2VyIHRvIGV4dGVuZCB0aGUgc2V0IG9mCi1wcmlvcml0aWVzLiBMb2c0aiBzdXBwb3J0cyBzdWJjbGFzc2VzIG9mIHByaW9yaXRpZXMgaW4gY29uZmlndXJhdGlvbgotZmlsZXMgYXMgd2VsbCBhcyBhY3Jvc3MgdGhlIHdpcmUuIEpTUjQ3IGRvZXMgbm90LgotCi08aDI+TGltaXRlZCBmdW5jdGlvbmFsaXR5PC9oMj4KLQotPHA+TG9nNGogaGFzIGFwcGVuZGVycyBjYXBhYmxlIG9mIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUsIHRvIGZpbGVzLCB0bwotVW5peCBTeXNsb2cgZGFlbW9ucywgdG8gTWljcm9zb2Z0IE5UIEV2ZW50TG9nZ2VycywgcmVtb3RlIHNlcnZlcnMsIHRvCi1KTVMgY2hhbm5lbHMsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgZW1haWwgZXRjLiBJdCBjYW4gcm9sbCBsb2cgZmlsZXMKLWJ5IHNpemUgb3IgZGF0ZSBhbmQgbG9nIGFzeW5jaHJvbm91c2x5LgotCi08cD5KU1I0NyBjYW4gbG9nIHRvIHRoZSBjb25zb2xlLCB0byBmaWxlcywgdG8gc29ja2V0cyBhbmQgdG8gYSBtZW1vcnkKLWJ1ZmZlci4KLQotPHA+TG9nNGogaGFzIGFuIGV4dGVuc2libGUgYW5kIHBvd2VyZnVsIGxheW91dCBjYWxsZWQgdGhlCi08Y29kZT5QYXR0ZXJuTGF5b3V0PC9jb2RlPi4gIEpTUjQ3IG9mZmVycyB0aGUgbXVjaCB3ZWFrZXIKLTxjb2RlPlNpbXBsZUZvcm1hdHRlcjwvY29kZT4gYXMgYW4gYWx0ZXJuYXRpdmUuCi0KLTxwPkxvZzRqIHN1cHBvcnRzIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCBwcm9wZXJ0eSBmaWxlcyBhcyB3ZWxsIGFzIFhNTAotZG9jdW1lbnRzLiBKU1I0NyBjdXJyZW50bHkgYWRtaXRzIG9ubHkgcHJvcGVydHkgZmlsZXMuIE1vcmVvdmVyLCB0aGUKLWxhbmd1YWdlIG9mIEpTUjQ3IGNvbmZpZ3VyYXRpb24gZmlsZXMgaXMgdmVyeSB3ZWFrLiBJbiBwYXJ0aWN1bGFyLCB5b3UKLWNhbiBvbmx5IGNvbmZpZ3VyZSBvbmUgaW5zdGFuY2Ugb2YgYSBnaXZlbiBoYW5kbGVyIGNsYXNzLiA8ZW0+VGhpcwotbWVhbnMgdGhhdCB5b3UgY2FuIGxvZyB0byBqdXN0IG9uZSBmaWxlIGF0IGEgdGltZS48L2VtPgotCi08aDI+T3RoZXIgZGlmZmVyZW5jZXM8L2gyPgotCi08cD5UaGVyZSBhcmUgbWFueSBvdGhlciBkZXRhaWxzIGluIHdoaWNoIGxvZzRqIGRpZmZlcnMgZnJvbQotSlNSNDcuIEV2ZW4gaWYgdGhlIGxvZzRqIGNvcmUgaXMgc21hbGwsIHRoZSBwcm9qZWN0IGNvbnRhaW5zIGEgdG90YWwKLW9mIG92ZXIgMzAnMDAwIGxpbmVzIG9mIHdlbGwtdGVzdGVkIGNvZGUuIEpTUjQ3IGNvbnRhaW5zIGFib3V0IDUnMDAwCi1saW5lcyBvZiBjb2RlLiAKLQotPHA+TG9nNGogaGFzIGJlZW4gYXJvdW5kIGZvciBhIG51bWJlciBvZiB5ZWFycywgZW5qb3lzIHRoZSBzdXBwb3J0IG9mCi1maXZlIGFjdGl2ZSBkZXZlbG9wZXJzIChjb21taXR0ZXJzKSBhbmQgaXMgYmVpbmcgdXNlZCBpbiB0aG91c2FuZHMgb2YKLXByb2plY3RzLiBPdXIgc2l0ZSBnZXRzIG92ZXIgNTAwIGRvd25sb2FkcyBlYWNoIGFuZCBldmVyeSBkYXksIGFuZCB0aGUKLW51bWJlcnMgYXJlIG9uIHRoZSByaXNlLiAgTG9nNGogaGFzIGJlZW4gcG9ydGVkIHRvIEMrKyBhbmQKLVB5dGhvbi4gQ29tcGFuaWVzIGFyZSBhbHNvIG9mZmVyaW5nIGNvbW1lcmNpYWwgcHJvZHVjdHMgZXh0ZW5kaW5nCi1sb2c0ai4KLQotPHA+SGVyZSBpcyBhIHNob3J0IGxpc3Qgb2Ygb3BlbnNvdXJjZSBwcm9qZWN0cyBvciBzaXRlcyB0aGF0IGFyZSBrbm93bgotdG8gdXNlIGxvZzRqLgotCi08dWw+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jcnlwdGl4Lm9yZy9wcm9kdWN0cy9zYXNsLyI+Q3J5cHRpeDwvYT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lmpjb3Jwb3JhdGUuY29tL2h0bWwvcHJvZHVjdHMvZXhwcmVzc28vbG9nZ2luZy5odG1sIj5FeHByZXNzbyBGcmFtZXdvcms8L2E+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5mcmVlLXByb2plY3Qub3JnLyI+RnJlZSBFLURlbW9jcmFjeSBQcm9qZWN0PC9hPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLmZyZWVoZXAub3JnIj5GcmVlSEVQPC9hPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuamJvc3Mub3JnIj5KQm9zczwvYT4KLQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnN5bXBob255LmNvbS9ndWlkZWxpbmVzL2xvZ2dpbmcuanNwIj5PcGVuU3ltcGhvbnk8L2E+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3RoZXNlcnZlcnNpZGUuY29tIj5UaGVTZXJ2ZXJTaWRlPC9hPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdHVyYmluZS9pbmRleC5odG1sIj5UdXJiaW5lPC9hPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvaW5kZXguaHRtbCI+VmVsb2NpdHk8L2E+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3dpcmVkMi53ZWIuY2Vybi5jaC93aXJlZDIvIj5XSVJFRDwvYT4KLSAKLTwvdWw+Ci0KLQotPHA+QnkgdGhlIHdheSwgbG9nNGogcnVucyBmaW5lIHVuZGVyIEpESyAxLjEgYW5kIGFib3ZlLiBKU1IgNDcgd2lsbAotcnVuIHVuZGVyIEpESyAxLjQgYW5kIG9ubHkgdW5kZXIgSkRLIDEuNC4gSW50ZXJlc3RpbmdseSBlbm91Z2gsIG5vCi1wYWNrYWdlIHNoaXBwZWQgd2l0aCBKREsgMS40IGlzIHVzaW5nIHRoZSBKU1I0NyBBUEkuICAKLQotPHA+QnJpYW4gUi4gR2lsc3RyYXAgaGFzIDxBCi1ocmVmPSJodHRwOi8vamF2YWxvZ2dpbmcuc291cmNlZm9yZ2UubmV0LyI+cmUtd3JpdHRlbjwvYT4gSlNSNDcgQVBJIHRvCi1ydW4gdW5kZXIgSkRLIDEuMiBhbmQgMS4zLiBIZSBoYXMgYWxzbyBwdWJsaXNoZWQgYW4gPGEKLWhyZWY9Imh0dHA6Ly93d3cub2Npd2ViLmNvbS9qbmIvYXJjaGl2ZS9qbmJKdW4yMDAxLmh0bWwiPmFydGljbGU8L2E+Ci1pbiBKYXZhV29ybGQuIFRoaXMgaXMgYWxsIHZlcnkgcHJvbWlzaW5nIGJ1dCBzaW5jZQotPGNvZGU+amF2YS51dGlsLmxvZ2dpbmc8L2NvZGU+IGlzIHVuZGVyIHRoZSA8Y29kZT5qYXZhLio8L2NvZGU+Ci1uYW1lc3BhY2UsIHdoZW4gcnVubmluZyB1bmRlciBKREsgMS4zLCB5b3Ugd2lsbCBzeXN0ZW1hdGljYWxseQotZW5jb3VudGVyOgotPHByZT4KLUV4Y2VwdGlvbiBpbiB0aHJlYWQgIm1haW4iIGphdmEubGFuZy5FeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3I6IGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbjogUHJvaGliaXRlZCBwYWNrYWdlIG5hbWU6IGphdmEudXRpbC5sb2dnaW5nCi0gICAgICAgIGF0IGphdmEubGFuZy5DbGFzc0xvYWRlci5kZWZpbmVDbGFzcyhDbGFzc0xvYWRlci5qYXZhOjQ3NykKLSAgICAgICAgYXQgamF2YS5zZWN1cml0eS5TZWN1cmVDbGFzc0xvYWRlci5kZWZpbmVDbGFzcyhTZWN1cmVDbGFzc0xvYWRlci5qYXZhOjExMSkKLSAgICAgICAgYXQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIuZGVmaW5lQ2xhc3MoVVJMQ2xhc3NMb2FkZXIuamF2YToyNDgpCi0gICAgICAgIGF0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyLmFjY2VzcyQxMDAoVVJMQ2xhc3NMb2FkZXIuamF2YTo1NikKLSAgICAgICAgYXQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIkMS5ydW4oVVJMQ2xhc3NMb2FkZXIuamF2YToxOTUpCi0gICAgICAgIGF0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoTmF0aXZlIE1ldGhvZCkKLSAgICAgICAgYXQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIuZmluZENsYXNzKFVSTENsYXNzTG9hZGVyLmphdmE6MTg4KQotICAgICAgICBhdCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIubG9hZENsYXNzKENsYXNzTG9hZGVyLmphdmE6Mjk3KQotICAgICAgICBhdCBzdW4ubWlzYy5MYXVuY2hlciRBcHBDbGFzc0xvYWRlci5sb2FkQ2xhc3MoTGF1bmNoZXIuamF2YToyODYpCi0gICAgICAgIGF0IGphdmEubGFuZy5DbGFzc0xvYWRlci5sb2FkQ2xhc3MoQ2xhc3NMb2FkZXIuamF2YToyNTMpCi0gICAgICAgIGF0IGphdmEubGFuZy5DbGFzc0xvYWRlci5sb2FkQ2xhc3NJbnRlcm5hbChDbGFzc0xvYWRlci5qYXZhOjMxMykKLTwvcHJlPgotCi08cD5Kb2NoZW4gSGlsbGVyIGhhZCBvYnNlcnZlZCB0aGlzIHByb2JsZW0gaW4gZWFybHkgMjAwMSB3aGVuIGhlCi1pbXBsZW1lbnRlZCB0aGUgSlNSNDcgQVBJIGJ5IHdyYXBwaW5nIGxvZzRqLgotCi08cD5Ob3RlIHRoYXQgYW55IHRoaXJkLXBhcnR5IGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZQotPGNvZGU+amF2YS4qPC9jb2RlPiBvciA8Y29kZT5qYXZheC4qPC9jb2RlPiBuYW1lc3BhY2VzIHZpb2xhdGVzIFN1bidzCi10cmFkZW1hcmsgb24gSmF2YS4gV2l0aG91dCBleHBsaWNpdCBwZXJtaXNzaW9uIGZyb20gU3VuLCBzdWNoIHNvZnR3YXJlCi1yZW1haW5zIHVuZGVyIHRoZSB0aHJlYXQgb2YgbGl0aWdhdGlvbi4KLQotPGgyPkVycm9yIEhhbmRsaW5nPC9oMj4KLQotSW4gSlNSIDQ3IHdoZW4gYW4gZXJyb3Igb2NjdXJzIHRoZW4gZWl0aGVyIGEKLTxjb2RlPlJ1blRpbWVFeGNlcHRpb248L2NvZGU+IGlzIHRocm93biB0byB0aGUgdXNlciBvciAoaW4gaGFuZGxlcnMKLW9ubHkpIGFuIGludGVybmFsIGZpZWxkIGlzIHNldC4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZQotPGNvZGU+UnVuVGltZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBjYXVzZSB5b3VyIGFwcGxpY2F0aW9uIHRvIGNyYXNoLiBJbgotdGhlIGxhdHRlciBjYXNlLCB5b3UgY2FuIHJldHJpZXZlIHRoZSBsYXN0IGNhdWdodCBleGNlcHRpb24gaW4gdGhlCi1oYW5kbGVyIGJ5IHF1ZXJ5aW5nIHRoZSA8Y29kZT5nZXRFeGNlcHRpb248L2NvZGU+IG1ldGhvZCBvZiB0aGF0Ci1oYW5kbGVyLiA8ZW0+VGhlIGZvcm1lciBpcyB0b3RhbGx5IHVuYWNjZXB0YWJsZSB3aGlsZSB0aGUgbGF0dGVyIGlzCi1pbXByYWN0aWNhbC48L2VtPgotCi08cD5JbiBsb2c0aiwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhcmUgZXhjZXB0aW9ucyB0aHJvd24gYXQgdGhlCi11c2VyLiBIb3dldmVyLCBhbGwgYXBwZW5kZXJzIGhhdmUgYW4gYXNzb2NpYXRlZAotPGNvZGU+RXJyb3JIYW5kbGVyPC9jb2RlPi4gIFRoaXMgPGNvZGU+RXJyb3JIYW5kbGVyPC9jb2RlPiBpcyBpbnZva2VkCi1ieSB0aGUgYXBwZW5kZXIgd2hlbmV2ZXIgYSBoYW5kbGVyLXNwZWNpZmljIGVycm9yIG9jY3Vycy4gIEJ5IGRlZmF1bHQsCi1sb2c0aiBhcHBlbmRlcnMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhbgotPGNvZGU+T25seU9uY2VFcnJvckhhbmRsZXI8L2NvZGU+IHdoaWNoIGVtaXRzIGEgbWVzc2FnZSBvbiB0aGUgY29uc29sZQotZm9yIHRoZSBmaXJzdCBlcnJvciBpbiBhbiBhcHBlbmRlciBhbmQgaWdub3JpbmcgYWxsIGZvbGxvd2luZyBlcnJvcnMuCi0KLTxwPkFuIDxjb2RlPkVycm9ySGFuZGxlcjwvY29kZT4gY2FuIGltcGxlbWVudCBhbiBhcmJpdHJhcnkgZXJyb3IKLWhhbmRsaW5nIHBvbGljeS4gRm9yIGV4YW1wbGUsIGFmdGVyIGEgZmFpbHVyZSB0byB3cml0ZSB0byBhIGRhdGFiYXNlIGEKLTxjb2RlPkpEQkNBcHBlbmRlcjwvY29kZT4gY2FuIGJlIHJlZGlyZWN0ZWQgdG8gZmFsbCBiYWNrIG9uIGEKLTxjb2RlPkZpbGVBcHBlbmRlcjwvY29kZT4uIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBzdXBwb3J0ZWQgaW4gWE1MCi1jb25maWd1cmF0aW9uIGZpbGVzLiBZb3UgZG8gbm90IG5lZWQgdG8gY2hhbmdlIGEgc2luZ2xlIGxpbmUgb2YgY2xpZW50Ci1jb2RlLgotCi08cD5CdXQgYWdhaW4gd2hvIGNhcmVzIGFib3V0IGVycm9ycywgcmlnaHQ/Ci0KLTxoMj5QZXJmb3JtYW5jZTwvaDI+Ci0KLTxwPkxvZ2dpbmcgcGVyZm9ybWFuY2UgbXVzdCBiZSBzdHVkaWVkIGluIHRocmVlIGRpc3RpbmN0IGNhc2VzOiB3aGVuCi1sb2dnaW5nIGlzIHR1cm5lZCBvZmYsIHdoZW4gdHVybmVkIG9uIGJ1dCBkdWUgdG8gcHJpb3JpdHkgY29tcGFyaXNvbgotbG9naWMgbm90IGVuYWJsZWQsIGFuZCB3aGVuIGFjdHVhbGx5IGxvZ2dpbmcuICBQbGVhc2UgcmVmZXIgdG8gdGhlIDxhCi1ocmVmPSJtYW51YWwuaHRtbCNwZXJmb3JtYW5jZSI+bG9nNGogbWFudWFsPC9hPiBmb3IgYSBtb3JlIGRldGFpbGVkCi1kaXNjdXNzaW9uIG9mIGxvZ2dpbmcgcGVyZm9ybWFuY2UuCi0KLTxwPldoZW4gbG9nZ2luZyBpcyB0dXJuZWQgb24sIGxvZzRqIHdpbGwgYmUgYWJvdXQgdHdvIHRvIHRocmVlIHRpbWVzCi1zbG93ZXIgdG8gZGVjaWRlIHdoZXRoZXIgYSBsb2cgc3RhdGVtZW50IGlzIGVuYWJsZWQgb3Igbm90LiBUaGlzIGlzCi1kdWUgdG8gdGhlIGR5bmFtaWMgbmF0dXJlIG9mIGxvZzRqIHdoaWNoIHJlcXVpcmVzIGl0IHRvIHdhbGsgdGhlCi1oaWVyYXJjaHkuIFRvIGdpdmUgeW91IGFuIGlkZWEgYWJvdXQgdGhlIGZpZ3VyZXMgaW52b2x2ZWQsIHVuZGVyIEpESwotMS40IGJldGEsIHdlIGFyZSB0YWxraW5nIGFib3V0IDkwIDxlbT5uYW5vc2Vjb25kczwvZW0+IGluc3RlYWQgb2YgMzAKLTxlbT5uYW5vc2Vjb25kczwvZW0+IG9uIGEgODAwTWh6IEludGVsIHByb2Nlc3Nvci4gSW4gb3RoZXIgd29yZHMsIG9uZQotbWlsbGlvbiBkaXNhYmxlZCBsb2dnaW5nIHJlcXVlc3RzIHdpbGwgY29zdCB1bmRlciBhIHNlY29uZCBpbiBib3RoCi1lbnZpcm9ubWVudHMuCi0KLTxwPkluIGEgc2hpcHBlZCBiaW5hcnksIHlvdSBjYW4gdHVybiBvZmYgbG9nZ2luZyBlbnRpcmVseSBhbmQgYm90aAotQVBJcyB3aWxsIHBlcmZvcm0gaWRlbnRpY2FsbHkuICBOb3RlIHRoYXQgaWYgb25lIGlzIG5vdCBjYXJlZnVsLCB0aGUKLWNvc3Qgb2YgcGFyYW1ldGVyIGNvbnN0cnVjdGlvbiBiZWZvcmUgaW52b2tpbmcgYSBkaXNhYmxlZCBsb2cKLXN0YXRlbWVudCB3aWxsIG92ZXJ3aGVsbSBhbnkgb3RoZXIgcGVyZm9ybWFuY2UgY29uc2lkZXJhdGlvbi4KLVJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB5b3UgZGVjaWRlIHRvIHVzZSwgbG9nZ2luZyBzdGF0ZW1lbnRzIHNob3VsZAotbmV2ZXIgYmUgcGxhY2VkIGluIHRpZ2h0IGxvb3BzLCBmb3IgZXhhbXBsZSwgYmVmb3JlIG9yIGFmdGVyIGFuCi1lbGVtZW50IHN3YXAgaW5zdHJ1Y3Rpb24gaW4gYSBzb3J0IGFsZ29yaXRobS4KLQotPHA+SW4gbG9nNGosIGNhbGxlciBsb2NhbGl6YXRpb24gaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwgd2hlcmVhcyBpbgotSlNSNDcgaXQgaXMgYWx3YXlzIGV4dHJhY3RlZC4gU2luY2UgdGhlIGV4dHJhY3Rpb24gb2YgY2FsbGVyCi1sb2NhbGl6YXRpb24gaXMgYSB2ZXJ5IHNsb3cgb3BlcmF0aW9uLCBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgY2FsbGVyCi1pbmZvcm1hdGlvbiBpcyBub3QgbmVlZGVkLCBsb2c0aiB3aWxsIGxvZyB0aGUgc2FtZSBpbmZvcm1hdGlvbiA0IHRvCi0xMDAgdGltZXMgZmFzdGVyLiAKLQotCi08L2JvZHk+IAotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9kZWVwRXh0ZW5zaW9uLmh0bWwgYi9kb2NzL2RlZXBFeHRlbnNpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlMGViNy4uMDAwMDAwMAotLS0gYS9kb2NzL2RlZXBFeHRlbnNpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczNSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkV4dGVuZGluZyBMb2c0SjwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGJnY29sb3I9IndoaXRlIj4KLQotPGNlbnRlcj4KLTxoMT5BZGRpbmcgQ29udmVyc2lvbiBDaGFyYWN0ZXJzIHRvIFBhdHRlcm5MYXlvdXQ8L2gxPgotCi0gICJQYXVsIEdsZXplbiIgCi0KLSAgSmFudWFyeSAyMDAxIDxicj48YnI+Ci08L2NlbnRlcj4KLQotPGhyPgotPGgyPkFic3RyYWN0PC9oMj4KLQotPHA+Ci1UaGlzIGFydGljbGUgZGVzY3JpYmVzIGEgc3lzdGVtYXRpYyB3YXkgdG8gZXh0ZW5kIHRoZQotPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0aiI+bG9nNGo8L2E+IEFQSSB0byBpbmNsdWRlCi1hZGRpdGlvbmFsIGF0dHJpYnV0ZXMgZm9ybWF0dGVkIHVzaW5nIHRoZQotPGNvZGU+PGEgaHJlZj0iLi4vZG9jcy9hcGkvb3JnL2FwYWNoZS9sb2c0ai9QYXR0ZXJuTGF5b3V0Lmh0bWwiPlBhdHRlcm5MYXlvdXQ8L2E+PC9jb2RlPiAKLWNsYXNzLgotPHA+Ci08aHI+Ci08aDI+Q29udGVudHM8L2gyPgotPHVsPgotCTxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT4KLQk8dWw+Ci0JCTxsaT48YSBocmVmPSNjYXNlPlRoZSBDYXNlIFN0dWR5PC9hPgotCQk8bGk+PGEgaHJlZj0jcGVlaz5BIFBlZWsgVW5kZXIgdGhlIEhvb2Q8L2E+Ci0JPC91bD4KLQk8bGk+PGEgaHJlZj0iI3Byb2Nlc3MiPlRoZSBQcm9jZXNzPC9hPgotCTx1bD4KLQkJPGxpPjxhIGhyZWY9IiNMb2dnaW5nRXZlbnQiPkV4dGVuZGluZyA8Y29kZT5Mb2dnaW5nRXZlbnQ8L2NvZGU+PC9hPgotCQk8bGk+PGEgaHJlZj0iI1BhdHRlcm5MYXlvdXQiPkV4dGVuZGluZyA8Y29kZT5QYXR0ZXJuTGF5b3V0PC9jb2RlPjwvYT4KLQkJPGxpPjxhIGhyZWY9IiNQYXR0ZXJuUGFyc2VyIj5FeHRlbmRpbmcgPGNvZGU+UGF0dGVyblBhcnNlcjwvY29kZT4gYW5kIAotCQkJPGNvZGU+UGF0dGVybkNvbnZlcnRlcjwvY29kZT48L2E+Ci0JCTxsaT48YSBocmVmPSIjQ2F0ZWdvcnkiPkV4dGVuZGluZyA8Y29kZT5DYXRlZ29yeTwvY29kZT48L2E+Ci0JCTxsaT48YSBocmVmPSIjQ2F0ZWdvcnlGYWN0b3J5Ij5FeHRlbmRpbmcgPGNvZGU+Q2F0ZWdvcnlGYWN0b3J5PC9jb2RlPjwvYT4KLQk8L3VsPgotCTxsaT48YSBocmVmPSIjdXNhZ2UiPlVzYWdlPC9hPgotCTx1bD4KLQkJPGxpPjxhIGhyZWY9IiNjb25maWd1cmF0b3JzIj5Db25maWd1cmF0b3JzPC9hPgotCTwvdWw+Ci0JPGxpPjxhIGhyZWY9IiNlbmhhbmNlbWVudHMiPkZ1cnRoZXIgRW5oYW5jZW1lbnRzPC9hPgotPC91bD4KLTxwPgotPGhyPgotPGEgbmFtZT0iaW50cm8iPjxoMj5JbnRyb2R1Y3Rpb248L2gyPjwvYT4KLQotPHA+Ci1UaGlzIGFydGljbGUgYXNzdW1lcyBmYW1pbGlhcml0eSB3aXRoIHRoZSBsb2c0agotPGEgaHJlZj0ibWFudWFsLmh0bWwiPlVzZXIgTWFudWFsPC9hPi4gIEl0IGJ1aWxkcyBvbiBmdW5kYW1lbnRhbAotY2xhc3NlcyBkZXNjcmliZWQgaW4gYm90aCB0aGUgVXNlciBNYW51YWwgYW5kIHRoZQotPGEgaHJlZj0iYXBpL2luZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+SmF2YWRvYyBBUEk8L2E+LiAgVG8gYXNzaXN0IGluIGlsbHVzdHJhdGluZyB0aGUKLWNvbmNlcHRzLCBhIHNpbXBsZSBjYXNlIHN0dWR5IHdpbGwgYmUgZGV2ZWxvcGVkIGFsb25nIHNpZGUgdGhlCi1leHBsYW5hdGlvbnMuICBUaGUgcmVzdWx0aW5nIGNsYXNzZXMgbWF5IGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZQotZm9yIHlvdXIgb3duIGV4dGVuc2lvbnMuICBDb25kZW5zZWQgKGkuZS4gc3RhdGVtZW50cyBjb21wcmVzc2VkLAotY29tbWVudHMgcmVtb3ZlZCkgc25pcHBldHMgb2YgdGhlIGNhc2Ugc3R1ZHkgY29kZQotYXJlIGluY2x1ZGVkIGluIHRoaXMgZG9jdW1lbnQuCi0KLTxhIG5hbWU9ImNhc2UiPjxoMz5UaGUgQ2FzZSBTdHVkeTwvaDM+PC9hPgotVGhlIGNhc2Ugc3R1ZHkgd2FzIGRldmVsb3BlZCBpbiBhIENPUkJBIGVudmlyb25tZW50IGluIHdoaWNoIHRoZQotZm9sbG93aW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGxvZyBlbnRyeSB3YXMgbmVlZGVkLiBUaGUgbGV0dGVycyBpbgotcGFyZW50aGVzaXMgcmVwcmVzZW50IHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciB0byBiZSB1c2VkIGJ5IHRoZQotPGNvZGU+PGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovUGF0dGVybkxheW91dC5odG1sIj5QYXR0ZXJuTGF5b3V0PC9hPjwvY29kZT4gCi1jbGFzcyBmb3IgZm9ybWF0dGluZy4KLQotPHA+Ci08dWw+Ci08bGk+PGI+SG9zdCBOYW1lIChoKTwvYj4gLSB0aGUgSVAgYWRkcmVzcyBvciBob3N0bmFtZSBvZiB0aGUgcGh5c2ljYWwgbWFjaGluZQotCW9uIHdoaWNoIHRoZSBDYXRlZ29yeSB3YXMgcnVubmluZy4KLTxsaT48Yj5TZXJ2ZXIgTmFtZSAocyk8L2I+IC0gVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHNlcnZlciBwcm9jZXNzLiAgSW4KLQl0aGlzIGNvbnRleHQsIGEgPGk+c2VydmVyPC9pPiByZWZlcnMgdG8gYSBwcm9jZXNzIHRoYXQgYWNjZXB0cyByZXF1ZXN0cwotCXJhdGhlciB0aGFuIHJlZmVycmluZyB0byBhIG1hY2hpbmUuICBUaGUgdGVybSA8aT5ob3N0PC9pPiByZWZlcnMgdG8gYQotCXBoeXNpY2FsIG1hY2hpbmUuICBTZXZlcmFsIHNlcnZlcnMgbWF5IHJ1biBvbiB0aGUgc2FtZSBob3N0LgotPGxpPjxiPkNvbXBvbmVudCBOYW1lIChiKTwvYj4gLSBSYXRoZXIgdGhhbiBnZXR0aW5nIGJvZ2dlZCBkb3duIG9uIHdoYXQKLQljb25zdGl0dXRlcyBhIGNvbXBvbmVudCwgbGV0J3MgYXNzdW1lIGZvciB0aGUgY2FzZSBzdHVkeSB0aGF0IGEgY29tcG9uZW50Ci0JaXMgYSB1bml0IG9mIHNvZnR3YXJlIHdvcnRoIGRlbm90aW5nIGluIHRoZSBsb2dzLgotPGxpPjxiPlZlcnNpb24gKHYpPC9iPiAtIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQgZnJvbSB3aGljaCB0aGUgbG9nIGVudHJ5Ci0Jb3JpZ2luYXRlZC4KLTwvdWw+Ci08cD4KLUl0IHNlZW1zIG9kZCB0byB1c2UgImIiIGZvciB0aGUgY29tcG9uZW50IG5hbWUuICBQcmVzZW50bHkKLTxjb2RlPjxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL1BhdHRlcm5MYXlvdXQuaHRtbCI+UGF0dGVybkxheW91dDwvYT48L2NvZGU+IAotYWxyZWFkeSBkZWZpbmVzIGJvdGggIkMiIGFuZCAiYyIgZm9yIGNsYXNzIG5hbWUgYW5kIGNhdGVnb3J5IG5hbWUgcmVzcGVjdGl2ZWx5LgotCi08aDM+PGEgbmFtZT0icGVlayI+QSBQZWVrIFVuZGVyIHRoZSBIb29kPC9hPjwvaDM+Ci08cD4KLUluIHByaW5jaXBsZSwgaWYgdGhlIHN0ZXBzIGRlc2NyaWJlZCBiZWxvdyBhcmUgZm9sbG93ZWQgY2xvc2VseSwgdGhlcmUgaXMgCi1ub3QgYSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBleHRlbmRlZCBjbGFzc2VzIHdpbGwgYmUgdXNlZCBieSBsb2c0ai4KLUJ1dCBzb21ldGltZXMgc29mdHdhcmUgZGV2ZWxvcG1lbnQgY2FuIGJlIGVudGlyZWx5IHVucHJpbmNpcGxlZC4gIFlvdSBtYXkKLXdpc2ggdG8gZXh0ZW5kIGxvZzRqIGluIGEgZGlmZmVyZW50IG1hbm5lciB0aGFuIGRlc2NyaWJlIGhlcmUgb3IgeW91IG1heQotbWFrZSBhIG1pc3Rha2UgdGhhdCByZXF1aXJlcyBrbm93bGVkZ2Ugb2Ygd2hhdCBpcyByZWFsbHkgZ29pbmcgb24uICAoSGVhdmVuCi1mb3JiaWQgdGhlcmUgYmUgYSBtaXN0YWtlIGluIHRoaXMgZG9jdW1lbnQpLiAgSW4gYW55IGNhc2UsIGl0IGRvZXNuJ3QgaHVydAotdG8gZ2V0IGFuIGlkZWEgb2Ygd2hhdCdzIGdvaW5nIG9uLgotPHA+Ci1UaGUgZm9sbG93aW5nIGRlc2NyaWJlcyBhICJ0eXBpY2FsIiBsb2dnaW5nIHNjZW5hcmlvIGluIHRoZSB1bi1leHRlbmRlZCBsb2c0agotY2FzZS4KLTxwPgotPG9sPgotPGxpPkFwcGxpY2F0aW9uIGNvZGUgaW52b2tlcyBhIGxvZyByZXF1ZXN0IG9uIGEKLTxjb2RlPjxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0NhdGVnb3J5Lmh0bWwiPkNhdGVnb3J5PC9hPjwvY29kZT4gCi1vYmplY3QuICBMZXQncyBzYXkgdGhlIDxjb2RlPmluZm88L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLTxwPgotPGxpPlRoZSBmaXJzdCB0aGluZyA8Y29kZT5pbmZvPC9jb2RlPiBkb2VzIGlzIHRvIGNoZWNrIGlmIGxvZ2dpbmcgaGFzCi1iZWVuIHR1cm5lZCBvZmYgZW50aXJlbHkgZm9yIHRoZSBpbmZvIGxldmVsLiAgSWYgc28sIGl0IHJldHVybnMKLWltbWVkaWF0ZWx5LiAgV2UnbGwgYXNzdW1lIGZvciB0aGlzIHNjZW5hcmlvIHRoYXQgbG9nZ2luZyBoYXMgbm90Ci1iZWVuIHR1cm5lZCBvZmYgZm9yIHRoZSBpbmZvIGxldmVsLgotPHA+Ci08bGk+TmV4dCA8Y29kZT5pbmZvPC9jb2RlPiBjb21wYXJlcyB0aGUKLTxjb2RlPjxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL1ByaW9yaXR5Lmh0bWwiPlByaW9yaXR5PC9hPjwvY29kZT4gCi1sZXZlbCBmb3IgdGhpcyBjYXRlZ29yeSBhZ2FpbnN0IDxjb2RlPlByaW9yaXR5LklORk88L2NvZGU+LiAgQXNzdW1pbmcKLXRoZSBwcmlvcml0eSB3YXJyYW50cyBsb2dnaW5nIHRoZSBtZXNzYWdlLCB0aGUgY2F0ZWdvcnkgaW5zdGFudGlhdGVzIGEKLTxjb2RlPjxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Mb2dnaW5nRXZlbnQuaHRtbCI+TG9nZ2luZ0V2ZW50PC9hPjwvY29kZT4gCi1vYmplY3QgcG9wdWxhdGVkIHdpdGggaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZvciBsb2dnaW5nLgotPHA+Ci08bGk+VGhlIDxjb2RlPkNhdGVnb3J5PC9jb2RlPiBpbnN0YW5jZSBwYXNzZXMgdGhlIDxjb2RlPkxvZ2dpbmdFdmVudDwvY29kZT4KLWluc3RhbmNlIHRvIGFsbCBpdHMgCi08Y29kZT48YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9BcHBlbmRlci5odG1sIj5BcHBlbmRlcjwvYT48L2NvZGU+IAotaW1wbGVtZW50YXRpb25zLgotPHA+Ci08bGk+TW9zdCAoYnV0IG5vdCBhbGwpIDxjb2RlPkFwcGVuZGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGhhdmUgCi1hbiBhc3NvY2lhdGVkIHN1YmNsYXNzIG9mIAotPGNvZGU+PGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTGF5b3V0Lmh0bWwiPkxheW91dDwvYT48L2NvZGU+LgotVGhlIDxjb2RlPkxheW91dDwvY29kZT4gc3ViY2xhc3MgaXMgcGFzc2VkIHRoZSA8Y29kZT5Mb2dnaW5nRXZlbnQ8L2NvZGU+IAotaW5zdGFuY2UgYW5kIHJldHVybnMgdGhlIGV2ZW50J3MgaW5mb3JtYXRpb24gZm9ybWF0dGVkIGluIGEgCi08Y29kZT5TdHJpbmc8L2NvZGU+IGFjY29yZGluZyB0byB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgPGNvZGU+TGF5b3V0PC9jb2RlPi4KLTxwPgotV2hlbiB0aGUgPGNvZGU+TGF5b3V0PC9jb2RlPiBzdWJjbGFzcyBpcwotPGNvZGU+PGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovUGF0dGVybkxheW91dC5odG1sIj5QYXR0ZXJuTGF5b3V0PC9hPjwvY29kZT4sIAotdGhlIGZvcm1hdCBvZiB0aGUgZXZlbnQncyBpbmZvcm1hdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IGEgY2hhcmFjdGVyIHNlcXVlbmNlCi1zaW1pbGFyIHRvIHRoZSA8Yj5DPC9iPiBsYW5ndWFnZSBsaWJyYXJ5J3MgPGNvZGU+cHJpbnRmPC9jb2RlPiByb3V0aW5lLgotPGNvZGU+UGF0dGVybkxheW91dDwvY29kZT4gZGVsZWdhdGVzIHRoZSBwYXJzaW5nIG9mIHRoaXMgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIGEKLTxjb2RlPjxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvUGF0dGVyblBhcnNlci5odG1sIj5QYXR0ZXJuUGFyc2VyPC9hPjwvY29kZT4gCi1pbnN0YW5jZS4KLTxwPgotV2hlbiB0aGUgPGNvZGU+UGF0dGVybkxheW91dDwvY29kZT4gd2FzIGNvbnN0cnVjdGVkLCBpdCBjcmVhdGVkIGEgCi08Y29kZT5QYXR0ZXJuUGFyc2VyPC9jb2RlPiB0byB0b2tlbml6ZSB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLiAgVXBvbiAKLXJlY29nbml6aW5nIGEgdG9rZW4sIHRoZSA8Y29kZT5QYXR0ZXJuUGFyc2VyPC9jb2RlPiBjb25zdHJ1Y3RzIGFuIGFwcHJvcHJpYXRlCi08Y29kZT48YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL1BhdHRlcm5Db252ZXJ0ZXIuaHRtbCI+UGF0dGVybkNvbnZlcnRlcjwvYT48L2NvZGU+IAotc3ViY2xhc3MsIHBhc3NpbmcgaXQgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0b2tlbi4gIE9mdGVuIHRoZQotPGNvZGU+UGF0dGVybkNvbnZlcnRlcjwvY29kZT4gc3ViY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQgYXMgc3RhdGljIGlubmVyIAotY2xhc3NlcyBvZiA8Y29kZT5QYXR0ZXJuUGFyc2VyPC9jb2RlPi4gIFRoZSA8Y29kZT5wYXJzZTwvY29kZT4gbWV0aG9kIG9mCi10aGUgPGNvZGU+UGF0dGVyblBhcnNlcjwvY29kZT4gcmV0dXJucyBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlCi08Y29kZT5QYXR0ZXJuQ29udmVydGVyPC9jb2RlPiBzdWJjbGFzc2VzLgotPHA+Ci08bGk+PGNvZGU+UGF0dGVybkxheW91dC5mb3JtYXQoKTwvY29kZT4gcGFzc2VzIHRoZSA8Y29kZT5Mb2dnaW5nRXZlbnQ8L2NvZGU+Ci10byBlYWNoIDxjb2RlPlBhdHRlcm5Db252ZXJ0ZXI8L2NvZGU+IHN1YmNsYXNzIGluIHRoZSBsaW5rZWQgbGlzdC4gIEVhY2ggbGluawotaW4gdGhlIGxpc3Qgc2VsZWN0cyBhIHBhcnRpY3VsYXIgaXRlbSBmcm9tIHRoZSA8Y29kZT5Mb2dnaW5nRXZlbnQ8L2NvZGU+LAotY29udmVydHMgdGhpcyBpdGVtIHRvIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBpbiB0aGUgcHJvcGVyIGZvcm1hdCBhbmQgYXBwZW5kcyAKLWl0IHRvIGEgPGNvZGU+U3RyaW5nQnVmZmVyPC9jb2RlPi4KLTxwPgotPGxpPlRoZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgPGNvZGU+U3RyaW5nPC9jb2RlPgotdG8gdGhlIDxjb2RlPkFwcGVuZGVyPC9jb2RlPiBmb3Igb3V0cHV0LgotPC9vbD4KLTxwPgotVGhlIGFib3ZlIGRpc2N1c3NpbmcgaW52b2x2ZWQgbW9zdCBvZiB0aGUgY2xhc3NlcyB0aGF0IHdlIG11c3QgZXh0ZW5kIG9yCi1pbXBsZW1lbnQuCi08cD4KLTx1bD4KLTxsaT48Y29kZT48YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9QYXR0ZXJuTGF5b3V0Lmh0bWwiPm9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dDwvYT48L2NvZGU+IAotPGxpPjxjb2RlPjxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0NhdGVnb3J5Lmh0bWwiPm9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk8L2E+PC9jb2RlPiAKLTxsaT48Y29kZT48YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9zcGkvTG9nZ2VyRmFjdG9yeS5odG1sIj5vcmcuYXBhY2hlLmxvZzRqLnNwaS5DYXRlZ29yeUZhY3Rvcnk8L2E+PC9jb2RlPiAKLTxsaT48Y29kZT48YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9zcGkvTG9nZ2luZ0V2ZW50Lmh0bWwiPm9yZy5hcGFjaGUubG9nNGouc3BpLkxvZ2dpbmdFdmVudDwvYT48L2NvZGU+IAotPGxpPjxjb2RlPjxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvUGF0dGVyblBhcnNlci5odG1sIj5vcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuUGF0dGVyblBhcnNlcjwvYT48L2NvZGU+IAotPGxpPjxjb2RlPjxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvUGF0dGVybkNvbnZlcnRlci5odG1sIj5vcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuUGF0dGVybkNvbnZlcnRlcjwvYT48L2NvZGU+IAotPC91bD4KLTxwPgotPGhyPgotPGEgbmFtZT0icHJvY2VzcyI+PGgyPlRoZSBQcm9jZXNzPC9oMj48L2E+Ci1CZWxvdyBhcmUgc3RlcHMgcmVxdWlyZWQgdG8gYWRkIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhdmFpbGFibGUKLWZvciBsb2dnaW5nIGJ5IGV4dGVuZGluZyBsb2c0ai4gIFRoaXMgd2lsbCBhbGxvdyB5b3UgdG8gc3BlY2lmeQotdGhlaXIgb3V0cHV0IGZvcm1hdHMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRob3NlIHByb3ZpZGVkIGJ5IHRoZQotPGNvZGU+UGF0dGVybkxheW91dDwvY29kZT4gY2xhc3MuICBUaGUgc3RlcHMgYXJlIG51bWJlcmVkIGZvcgotcmVmZXJlbmNlIG9ubHkuICBJdCBtYWtlcyBubyBkaWZmZXJlbmNlIGluIHdoaWNoIG9yZGVyIHRoZXkgYXJlCi1mb2xsb3dlZC4KLTxwPgotSXQncyBoZWxwZnVsIGlmIHlvdSBrbm93IHRoZSBhdHRyaWJ1dGVzIHlvdSB3aXNoIHRvIGFkZCBhbmQgYSAKLTxjb2RlPlBhdHRlcm5MYXlvdXQ8L2NvZGU+IHN5bWJvbCBmb3IgZWFjaCBvbmUgYmVmb3JlIHlvdSBiZWdpbi4gIEJlCi1zdXJlIHRvIGNvbnN1bHQgdGhlIDxjb2RlPlBhdHRlcm5MYXlvdXQ8L2NvZGU+IGRvY3VtZW50YXRpb24gdG8gZW5zdXJlCi10aGUgc3ltYm9scyB5b3Ugc2VsZWN0IGFyZSBub3QgYWxyZWFkeSBpbiB1c2UuCi08cD4KLUJlZm9yZSB3ZSBkaWcgaW4sIEkgc2hvdWxkIGdpdmUgdGhlIHN0YW5kYXJkIGxlY3R1cmUgb24gY29tbWVudHMuCi1JZiB0aGUgbG9nNGogbGlicmFyeSB3ZXJlIG5vdCB3ZWxsIGRvY3VtZW50ZWQsIGl0IHdvdWxkIGJlIHVzZWxlc3MKLXRvIGV2ZXJ5b25lIGJ1dCB0aGUgbG9nNGogY3JlYXRvcnM7IGxpa2V3aXNlIHdpdGggeW91ciBleHRlbnNpb25zLgotTXVjaCBsaWtlIGVhdGluZyB2ZWdldGFibGVzIGFuZCBzYXZpbmcgdGhlIGVudmlyb25tZW50LCB3ZSBhbGwgYWdyZWUKLWNvbW1lbnRpbmcgY29kZSBwcm9wZXJseSBzaG91bGQgYmUgZG9uZS4gIFlldCBpdCBpcyBvZnRlbiBzYWNyaWZpY2VkIAotZm9yIG1vcmUgaW1tZWRpYXRlIHBsZWFzdXJlcy4gIFdlIGFsbCB3cml0ZSBjb2RlIGZhc3RlciB3aXRob3V0IAotY29tbWVudHM7IGVzcGVjaWFsbHkgdGhvc2UgcGVza3kgSmF2YWRvYyBjb21tZW50cy4gIEJ1dCB0aGUgcmVhbGl0eQotaXMgdGhhdCB0aGUgdXRpbGl0eSBvZiB1bmRvY3VtZW50ZWQgY29kZSBmYWRlcyBleHBvbmVudGlhbGx5IHdpdGggdGltZS4KLTxwPgotU2luY2UgdGhlIGxvZzRqIHByb2R1Y3QgY29tZXMgd2l0aCBKYXZhZG9jIGNvbW1lbnRzIHRvZ2V0aGVyIHdpdGgKLXRoZSBkb2N1bWVudGF0aW9uIGl0IHByb2R1Y2VzLCBpdCBtYWtlcyBzZW5zZSB0byBpbmNsdWRlIEphdmFkb2MKLWNvbW1lbnRzIGluIHlvdXIgZXh0ZW5zaW9ucy4gIEJ5IHRoZWlyIHZlcnkgbmF0dXJlLCBsb2dnaW5nIHRvb2xzCi1hcmUgc3Ryb25nIGNhbmRpZGF0ZXMgZm9yIHJldXNlLiAgVGhleSBjYW4gb25seSBiZSBpbmRlcGVuZGVudGx5Ci1yZS11c2VkIGlmIHRoZXkgYXJlIHN1cHBvcnRlZCBieSBzdHJvbmcgZG9jdW1lbnRhdGlvbiBjb21wb25lbnQuCi08cD4KLVRoaXMgYWxsIGhhdmluZyBiZWVuIHNhaWQsIEkgaGF2ZSBlbGVjdGVkIHRvIHJlbW92ZSBtb3N0IGNvbW1lbnRzIGZyb20KLWV4YW1wbGVzIGluIHRoZSBpbnRlcmVzdCBvZiBzcGFjZSByYXRoZXIgdGhhbiBpbmNsdWRpbmcgdGhlbSB0byBzZXJ2ZQotYXMgYSBuYWdnaW5nIHJlbWluZGVyLiAgVGhlIHJlYWRlciBpcyByZWZlcnJlZCB0byB0aGUgY2FzZSBzdHVkeSBzb3VyY2UgCi1jb2RlIGZpbGVzIGZvciBhIEphdmFkb2MgdmVyc2lvbiBhbmQgYQotPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZG9jIj5KYXZhZG9jIHdlYnNpdGU8L2E+Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBKYXZhZG9jIGNvbnZlbnRpb25zLgotCi08YSBuYW1lPSJMb2dnaW5nRXZlbnQiPjxoMz4xLiBFeHRlbmRpbmcgPGNvZGU+TG9nZ2luZ0V2ZW50PC9jb2RlPjwvaDM+PC9hPgotCi1FeHRlbmRpbmcgdGhlIDxjb2RlPkxvZ2dpbmdFdmVudDwvY29kZT4gY2xhc3Mgc2hvdWxkIGJlIG9uZSBvZiB0aGUKLXRyaXZpYWwgc3RlcHMuICBBbGwgdGhhdCBpcyBuZWVkZWQgaW4gdGhlIGV4dGVuc2lvbiBpcyB0aGUgYWRkaXRpb24KLW9mIHB1YmxpYyBkYXRhIG1lbWJlcnMgcmVwcmVzZW50aW5nIHRoZSBuZXcgYXR0cmlidXRlcyBhbmQgYSBuZXcKLWNvbnN0cnVjdG9yIHRvIHBvcHVsYXRlIHRoZW0uCi08cD4KLTx0YWJsZSBib3JkZXI9MT4KLTx0cj48dGQ+Ci08cHJlPgotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnNwaS5Mb2dnaW5nRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBcHBTZXJ2ZXJMb2dnaW5nRXZlbnQgZXh0ZW5kcyBMb2dnaW5nRXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSAKLXsKLSAgIHB1YmxpYyBTdHJpbmcgaG9zdG5hbWU7Ci0gICBwdWJsaWMgU3RyaW5nIGNvbXBvbmVudDsKLSAgIHB1YmxpYyBTdHJpbmcgc2VydmVyOwotICAgcHVibGljIFN0cmluZyB2ZXJzaW9uOwotICAgCi0gICBwdWJsaWMgQXBwU2VydmVyTG9nZ2luZ0V2ZW50KCBTdHJpbmcgICAgZnFuT2ZDYXRlZ29yeUNsYXNzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcFNlcnZlckNhdGVnb3J5ICBjYXRlZ29yeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgcHJpb3JpdHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0ICAgIG1lc3NhZ2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSkgCi0gICB7Ci0gICAgICBzdXBlciggZnFuT2ZDYXRlZ29yeUNsYXNzLAotICAgICAgICAgICAgIGNhdGVnb3J5LAotICAgICAgICAgICAgIHByaW9yaXR5LAotICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgdGhyb3dhYmxlICk7Ci0KLSAgICAgIGhvc3RuYW1lICA9IGNhdGVnb3J5LmdldEhvc3RuYW1lKCk7Ci0gICAgICBjb21wb25lbnQgPSBjYXRlZ29yeS5nZXRDb21wb25lbnQoKTsKLSAgICAgIHNlcnZlciAgICA9IGNhdGVnb3J5LmdldFNlcnZlcigpOwotICAgICAgdmVyc2lvbiAgID0gY2F0ZWdvcnkuZ2V0VmVyc2lvbigpOwotICAgfSAgCi19Ci08L3ByZT4KLTwvdGFibGU+Ci08cD4KLVRoZSBjb25zdHJ1Y3RvciBkZW1vbnN0cmF0ZXMgdGhhdCBpbiBtb3N0IGNhc2VzLCB0aGUgPGNvZGU+Q2F0ZWdvcnk8L2NvZGU+Ci1zdWJjbGFzcyB3aWxsIGNvbnRhaW4gbW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHBvcHVsYXRlCi10aGUgYXR0cmlidXRlcyBvZiB0aGUgPGNvZGU+TG9nZ2luZ0V2ZW50PC9jb2RlPiBzdWJjbGFzcy4gIEV4dGVuc2lvbnMKLXRvIDxjb2RlPkxvZ2dpbmdFdmVudDwvY29kZT4gc2VlbSBubyBtb3JlIHRoYW4gYSBjb2xsZWN0aW9uIG9mIHN0cmluZ3MKLXdpdGggYSBjb25zdHJ1Y3Rvci4gIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSBieSB0aGUgc3VwZXIgY2xhc3MuCi0KLTxhIG5hbWU9IlBhdHRlcm5MYXlvdXQiPjxoMz4yLiBFeHRlbmRpbmcgPGNvZGU+UGF0dGVybkxheW91dDwvY29kZT48L2gzPjwvYT4KLQotRXh0ZW5kaW5nIHRoZSA8Y29kZT5QYXR0ZXJuTGF5b3V0PC9jb2RlPiBjbGFzcyBzaG91bGQgYmUgYW5vdGhlcgotc2ltcGxlIG1hdHRlci4gIFRoZSBleHRlbnNpb24gdG8gPGNvZGU+UGF0dGVybkxheW91dDwvY29kZT4gc2hvdWxkIAotZGlmZmVyIGZyb20gaXRzIHBhcmVudCBvbmx5IGluIHRoZSBjcmVhdGlvbiBvZiBhCi08Y29kZT5QYXR0ZXJuUGFyc2VyPC9jb2RlPiBpbnN0YW5jZS4gIFRoZSBleHRlbmRlZAotPGNvZGU+UGF0dGVybkxheW91dDwvY29kZT4gc2hvdWxkIGNyZWF0ZSBhbiBleHRlbmRlZAotPGNvZGU+UGF0dGVyblBhcnNlcjwvY29kZT4gY2xhc3MuICBGb3J0dW5hdGVseSwgdGhpcyB0YXNrIGluCi08Y29kZT5QYXR0ZXJuTGF5b3V0PC9jb2RlPiBpcyBlbmNhcHN1bGF0ZWQgd2l0aGluIGEgc2luZ2xlIG1ldGhvZC4KLTxwPgotPHRhYmxlIGJvcmRlcj0xPiA8dHI+PHRkPgotPHByZT4KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgQXBwU2VydmVyUGF0dGVybkxheW91dCBleHRlbmRzIFBhdHRlcm5MYXlvdXQgCi17Ci0gICBwdWJsaWMgQXBwU2VydmVyUGF0dGVybkxheW91dCgpIAotICAgewotICAgICAgdGhpcyhERUZBVUxUX0NPTlZFUlNJT05fUEFUVEVSTik7Ci0gICB9Ci0KLSAgIHB1YmxpYyBNeVBhdHRlcm5MYXlvdXQoU3RyaW5nIHBhdHRlcm4pIAotICAgewotICAgICAgc3VwZXIocGF0dGVybik7Ci0gICB9Ci0gICAgCi0gICBwdWJsaWMgUGF0dGVyblBhcnNlciBjcmVhdGVQYXR0ZXJuUGFyc2VyKFN0cmluZyBwYXR0ZXJuKSAKLSAgIHsKLSAgICAgIFBhdHRlcm5QYXJzZXIgcmVzdWx0OwotICAgICAgaWYgKCBwYXR0ZXJuID09IG51bGwgKQotICAgICAgICAgcmVzdWx0ID0gbmV3IEFwcHNlcnZlclBhdHRlcm5QYXJzZXIoIERFRkFVTFRfQ09OVkVSU0lPTl9QQVRURVJOICk7Ci0gICAgICBlbHNlCi0gICAgICAgICByZXN1bHQgPSBuZXcgQXBwU2VydmVyUGF0dGVyblBhcnNlciAoIHBhdHRlcm4gKTsKLQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotPC9wcmU+Ci08L3RhYmxlPgotCi08YSBuYW1lPSJQYXR0ZXJuUGFyc2VyIj48aDM+My4gRXh0ZW5kIDxjb2RlPlBhdHRlcm5QYXJzZXI8L2NvZGU+IGFuZCA8Y29kZT5QYXR0ZXJuQ29udmVydGVyPC9jb2RlPjwvaDM+PC9hPgotCi1SZWNhbGwgZnJvbSBvdXIgPGEgaHJlZj0iI3BlZWsiPnBlZWsgdW5kZXIgdGhlIGhvb2Q8L2E+IHRoYXQgdGhlCi08Y29kZT5QYXR0ZXJuUGFyc2VyPC9jb2RlPiBkb2VzIG11Y2ggb2YgaXRzIHdvcmsgaW4gaXRzCi08Y29kZT5wYXJzZTwvY29kZT4gbWV0aG9kLiAgVGhlIDxjb2RlPlBhdHRlcm5MYXlvdXQ8L2NvZGU+IG9iamVjdAotaW5zdGFudGlhdGVzIGEgPGNvZGU+UGF0dGVyblBhcnNlcjwvY29kZT4gb2JqZWN0IGJ5IHBhc3NpbmcgaXQKLXRoZSBwYXR0ZXJuIHN0cmluZy4gIFRoZSBQYXR0ZXJuTGF5b3V0IHRoZW4gaW52b2tlcyB0aGUKLTxjb2RlPnBhcnNlPC9jb2RlPiBtZXRob2Qgb2YgPGNvZGU+UGF0dGVyblBhcnNlcjwvY29kZT4gdG8gcHJvZHVjZQotYSBsaW5rZWQgbGlzdCBvZiA8Y29kZT5QYXR0ZXJuQ29udmVydGVyPC9jb2RlPiBzdWJjbGFzcyBpbnN0YW5jZXMuCi1JdCBpcyB0aGlzIGxpbmtlZCBsaXN0IG9mIGNvbnZlcnRlcnMgdGhhdCBpcyB1c2VkIHRvIGNvbnZlcnQgYW4KLWV2ZW50IGluc3RhbmNlIGludG8gYSBzdHJpbmcgdXNlZCBieSBhcHBlbmRlcnMuCi08cD4KLU91ciBqb2Igd2lsbCBiZSB0byBzdWJjbGFzcyA8Y29kZT5QYXR0ZXJuUGFyc2VyPC9jb2RlPiB0byBwcm9wZXJseQotaW50ZXJwcmV0IGZvcm1hdHRpbmcgY2hhcmFjdGVycyB3ZSB3aXNoIHRvIGFkZC4gIEZvcnR1bmF0ZWx5LAotPGNvZGU+UGF0dGVyblBhcnNlcjwvY29kZT4gaGFzIGJlZW4gZGVzaWduZWQgc28gdGhhdCBvbmx5IHRoZSBvbmUKLXN0ZXAgaW4gdGhlIHBhcnNpbmcgcHJvY2VzcyBkaWZmZXJpbmcgZm9yIGVhY2ggZm9ybWF0dGluZyBjaGFyYWN0ZXIKLWhhcyB0byBiZSBvdmVycmlkZGVuLiAgVGhlIGdydW50IHdvcmsgb2YgcGFyc2luZyBpcyBzdGlsbCBwZXJmb3JtZWQKLWJ5IHRoZSA8Y29kZT5QYXR0ZXJuUGFyc2VyLnBhcnNlKCk8L2NvZGU+IG1ldGhvZC4gIE9ubHkgdGhlCi08Y29kZT5QYXR0ZXJuUGFyc2VyLmZpbmFsaXplQ29udmVydGVyPC9jb2RlPiBtZXRob2QgaGFzIHRvIGJlCi1vdmVycmlkZGVuLiAgVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZGVjaWRlcyB3aGljaAotPGNvZGU+UGF0dGVybkNvbnZlcnRlcjwvY29kZT4gdG8gY3JlYXRlIGJhc2VkIG9uIGEgZm9ybWF0dGluZwotY2hhcmFjdGVyLgotPHA+Ci1UaGUgZXh0ZW5zaW9uIHRvIDxjb2RlPlBhdHRlcm5QYXJzZXI8L2NvZGU+LCAKLTxjb2RlPkFwcFNlcnZlclBhdHRlcm5QYXJzZXI8L2NvZGU+LCBpcyBzaW1pbGFyIHRvIGl0cyBzdXBlciBjbGFzcy4KLUl0IHVzZXMKLTx1bD4KLTxsaT5jb25zdGFudHMgdG8gaWRlbnRpZnkgdGhlIHZhcmlvdXMgZm9ybWF0cwotPGxpPmEgY29udmVydGVyIGRlZmluZWQgYXMgcHJpdmF0ZSBzdGF0aWMgaW5uZXItY2xhc3NlcyBvZgotCTxjb2RlPkFwcFNlcnZlclBhdHRlcm5QYXJzZXI8L2NvZGU+LgotPGxpPmEgPGNvZGU+ZmluYWxpemVDb252ZXJ0ZXI8L2NvZGU+IG1ldGhvZCB3aGljaCBpbnN0YW50aWF0ZXMKLQl0aGUgYXBwcm9wcmlhdGUgY29udmVydGVyIGZvciBhIGdpdmVuIGZvcm1hdCBjaGFyYWN0ZXIuCi08L3VsPgotPHA+Ci08Y29kZT5BcHBTZXJ2ZXJQYXR0ZXJuUGFyc2VyPC9jb2RlPiBkaWZmZXJzIHByaW5jaXBhbGx5IGJ5IAotZGVkaWNhdGluZyBhIHNlcGFyYXRlIGNvbnZlcnRlciB0eXBlIGZvciBlYWNoIGxvZ2dpbmcKLWF0dHJpYnV0ZSB0byBiZSBmb3JtYXR0ZWQuCi1SYXRoZXIgdGhhbiBwbGFjaW5nIHN3aXRjaCBsb2dpYyBpbiB0aGUgY29udmVydGVyLCBsaWtlIGl0cwotcGFyZW50IGNsYXNzLCBlYWNoIGNvbnZlcnRlciBvbmx5IGNvbnZlcnRzIG9uZSBmb3JtYXQgY2hhcmFjdGVyLgotVGhpcyBtZWFucyB0aGUgZGVjaXNpb24gb2Ygd2hpY2ggY29udmVydGVyIHN1YmNsYXNzCi10byBpbnN0YW50aWF0ZSBpcyBtYWRlIGF0IGxheW91dCBpbnN0YW50aWF0aW9uIHRpbWUgcmF0aGVyCi10aGFuIGluIGEgc3dpdGNoIHN0YXRlbWVudCBhdCBsb2dnaW5nIHRpbWUuCi08cD4KLUl0IGFsc28gZGlmZmVycyBpbiB0aGF0IHRoZSBmb3JtYXQgY29uc3RhbnRzIGFyZSBjaGFyYWN0ZXJzIAotcmF0aGVyIHRoYW4gaW50ZWdlcnMuCi08cD4KLTx0YWJsZSBib3JkZXI9MT4KLTx0cj48dGQ+Ci08cHJlPgotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouKjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuRm9ybWF0dGluZ0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLlBhdHRlcm5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLlBhdHRlcm5QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuTG9nZ2luZ0V2ZW50OwotCi1wdWJsaWMgY2xhc3MgQXBwU2VydmVyUGF0dGVyblBhcnNlciBleHRlbmRzIFBhdHRlcm5QYXJzZXIgCi17Ci0gICBzdGF0aWMgZmluYWwgY2hhciBIT1NUTkFNRV9DSEFSICA9ICdoJzsKLSAgIHN0YXRpYyBmaW5hbCBjaGFyIFNFUlZFUl9DSEFSICAgID0gJ3MnOwotICAgc3RhdGljIGZpbmFsIGNoYXIgQ09NUE9ORU5UX0NIQVIgPSAnYic7Ci0gICBzdGF0aWMgZmluYWwgY2hhciBWRVJTSU9OX0NIQVIgICA9ICd2JzsKLQotICAgcHVibGljIEFwcFNlcnZlclBhdHRlcm5QYXJzZXIoU3RyaW5nIHBhdHRlcm4pIAotICAgewotICAgICAgc3VwZXIocGF0dGVybik7Ci0gICB9Ci0gICAgCi0gICBwdWJsaWMgdm9pZCBmaW5hbGl6ZUNvbnZlcnRlcihjaGFyIGZvcm1hdENoYXIpIAotICAgewotICAgICAgUGF0dGVybkNvbnZlcnRlciBwYyA9IG51bGw7Ci0gICAgICBzd2l0Y2goIGZvcm1hdENoYXIgKQotICAgICAgewotICAgICAgICAgY2FzZSBIT1NUTkFNRV9DSEFSOgotICAgICAgICAgICAgcGMgPSBuZXcgSG9zdG5hbWVQYXR0ZXJuQ29udmVydGVyKCBmb3JtYXR0aW5nSW5mbyApOwotICAgICAgICAgICAgY3VycmVudExpdGVyYWwuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgYWRkQ29udmVydGVyKCBwYyApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIFNFUlZFUl9DSEFSOgotICAgICAgICAgICAgcGMgPSBuZXcgU2VydmVyUGF0dGVybkNvbnZlcnRlciggZm9ybWF0dGluZ0luZm8gKTsKLSAgICAgICAgICAgIGN1cnJlbnRMaXRlcmFsLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgIGFkZENvbnZlcnRlciggcGMgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSBDT01QT05FTlRfQ0hBUjoKLSAgICAgICAgICAgIHBjID0gbmV3IENvbXBvbmVudFBhdHRlcm5Db252ZXJ0ZXIoIGZvcm1hdHRpbmdJbmZvICk7Ci0gICAgICAgICAgICBjdXJyZW50TGl0ZXJhbC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICBhZGRDb252ZXJ0ZXIoIHBjICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgVkVSU0lPTl9DSEFSOgotICAgICAgICAgICAgcGMgPSBuZXcgVmVyc2lvblBhdHRlcm5Db252ZXJ0ZXIoIGZvcm1hdHRpbmdJbmZvICk7Ci0gICAgICAgICAgICBjdXJyZW50TGl0ZXJhbC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICBhZGRDb252ZXJ0ZXIoIHBjICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZUNvbnZlcnRlciggZm9ybWF0Q2hhciApOwotICAgICAgfQotICAgfQotICAKLSAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFwcFNlcnZlclBhdHRlcm5Db252ZXJ0ZXIgZXh0ZW5kcyBQYXR0ZXJuQ29udmVydGVyIAotICAgewotICAgICAgQXBwU2VydmVyUGF0dGVybkNvbnZlcnRlcihGb3JtYXR0aW5nSW5mbyBmb3JtYXR0aW5nSW5mbykgCi0gICAgICB7Ci0gICAgICAgICBzdXBlcihmb3JtYXR0aW5nSW5mbyk7ICAgICAKLSAgICAgIH0KLQotICAgICAgcHVibGljIFN0cmluZyBjb252ZXJ0KExvZ2dpbmdFdmVudCBldmVudCkgCi0gICAgICB7Ci0gICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgIEFwcFNlcnZlckxvZ2dpbmdFdmVudCBhcHBFdmVudCA9IG51bGw7Ci0KLSAgICAgICAgIGlmICggZXZlbnQgaW5zdGFuY2VvZiBBcHBTZXJ2ZXJMb2dnaW5nRXZlbnQgKQotICAgICAgICAgewotICAgICAgICAgICAgYXBwRXZlbnQgPSAoQXBwU2VydmVyTG9nZ2luZ0V2ZW50KSBldmVudDsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNvbnZlcnQoIGFwcEV2ZW50ICk7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGNvbnZlcnQoIEFwcFNlcnZlckxvZ2dpbmdFdmVudCBldmVudCApOwotICAgfQotCi0gICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIb3N0bmFtZVBhdHRlcm5Db252ZXJ0ZXIgZXh0ZW5kcyBBcHBTZXJ2ZXJQYXR0ZXJuQ29udmVydGVyCi0gICB7Ci0gICAgICBIb3N0bmFtZVBhdHRlcm5Db252ZXJ0ZXIoIEZvcm1hdHRpbmdJbmZvIGZvcm1hdEluZm8gKQotICAgICAgeyAgc3VwZXIoIGZvcm1hdEluZm8gKTsgIH0KLQotICAgICAgcHVibGljIFN0cmluZyBjb252ZXJ0KCBBcHBTZXJ2ZXJMb2dnaW5nRXZlbnQgZXZlbnQgKQotICAgICAgeyAgcmV0dXJuIGV2ZW50Lmhvc3RuYW1lOyAgfQotICAgfQotCi0gICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2ZXJQYXR0ZXJuQ29udmVydGVyIGV4dGVuZHMgQXBwU2VydmVyUGF0dGVybkNvbnZlcnRlcgotICAgewotICAgICAgU2VydmVyUGF0dGVybkNvbnZlcnRlciggRm9ybWF0dGluZ0luZm8gZm9ybWF0SW5mbyApCi0gICAgICB7ICBzdXBlciggZm9ybWF0SW5mbyApOyAgfQotCi0gICAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnQoIEFwcFNlcnZlckxvZ2dpbmdFdmVudCBldmVudCApCi0gICAgICB7ICByZXR1cm4gZXZlbnQuc2VydmVyOyAgfQotICAgfQotCi0gICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb25lbnRQYXR0ZXJuQ29udmVydGVyIGV4dGVuZHMgQXBwU2VydmVyUGF0dGVybkNvbnZlcnRlcgotICAgewotICAgICAgQ29tcG9uZW50UGF0dGVybkNvbnZlcnRlciggRm9ybWF0dGluZ0luZm8gZm9ybWF0SW5mbyApCi0gICAgICB7ICBzdXBlciggZm9ybWF0SW5mbyApOyAgfQotCi0gICAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnQoIEFwcFNlcnZlckxvZ2dpbmdFdmVudCBldmVudCApCi0gICAgICB7ICByZXR1cm4gZXZlbnQuY29tcG9uZW50OyAgfQotICAgfQotCi0gICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWZXJzaW9uUGF0dGVybkNvbnZlcnRlciBleHRlbmRzIEFwcFNlcnZlclBhdHRlcm5Db252ZXJ0ZXIKLSAgIHsKLSAgICAgIFZlcnNpb25QYXR0ZXJuQ29udmVydGVyKCBGb3JtYXR0aW5nSW5mbyBmb3JtYXRJbmZvICkKLSAgICAgIHsgIHN1cGVyKCBmb3JtYXRJbmZvICk7ICB9Ci0KLSAgICAgIHB1YmxpYyBTdHJpbmcgY29udmVydCggQXBwU2VydmVyTG9nZ2luZ0V2ZW50IGV2ZW50ICkKLSAgICAgIHsgIHJldHVybiBldmVudC52ZXJzaW9uOyAgfQotICAgfQotfQotPC9wcmU+Ci08L3RhYmxlPgotPHA+Ci08YSBuYW1lPSJDYXRlZ29yeSI+PGgzPjQuIEV4dGVuZGluZyA8Y29kZT5DYXRlZ29yeTwvY29kZT48L2gzPjwvYT4KLUV4dGVuZGluZyA8Y29kZT5DYXRlZ29yeTwvY29kZT4gYW5kIGl0cyBmYWN0b3J5IHdpbGwgYmUgbW9yZSBzdHJhaWdodCAKLWZvcndhcmQgdGhhbiBleHRlbmRpbmcgPGNvZGU+UGF0dGVyblBhcnNlcjwvY29kZT4gYW5kIHRoZSBjb252ZXJ0ZXJzLgotVGhlIGZvbGxvd2luZyB0YXNrcyBhcmUgaW52b2x2ZWQgaW4gb3ZlcnJpZGRpbmcgCi08Y29kZT5DYXRlZ29yeTwvY29kZT4gZm9yIG91ciBwdXJwb3Nlcy4KLTxwPgotPHVsPgotPGxpPkFkZCBmaWVsZHMgY29ycmVzcG9uZGluZyB0byB0aGUgbmV3IGF0dHJpYnV0ZXMgd2l0aCB0aGVpcgotCWNvcnJlc3BvbmRpbmcgZ2V0dGVycyBhbmQgc2V0dGVycy4KLTxwPgotPGxpPk92ZXJyaWRlIHRoZSBjb25zdHJ1Y3RvciB0byBhY2NlcHQgb3IgYWNxdWlyZSBpbmZvcm1hdGlvbiAKLQlhYm91dCBuZXcgYXR0cmlidXRlcy4KLTxwPgotPGxpPk92ZXJyaWRlIHRoZSA8Y29kZT5mb3JjZWRMb2c8L2NvZGU+IG1ldGhvZCB0byBlbnN1cmUgdGhhdCBhIAotCWNvcnJlY3RseSBwb3B1bGF0ZWQgaW5zdGFuY2Ugb2YgCi0JPGNvZGU+QXBwU2VydmVyTG9nZ2luZ0V2ZW50PC9jb2RlPiBpcyBpbnN0YW50aWF0ZWQgcmF0aGVyIHRoYW4KLQl0aGUgZGVmYXVsdCA8Y29kZT5Mb2dnaW5nRXZlbnQ8L2NvZGU+LgotPHA+Ci08bGk+T3ZlcnJpZGUgdGhlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBtZXRob2QgdG8gdXNlIG91cgotCTxjb2RlPkNhdGVnb3J5RmFjdG9yeTwvY29kZT4gKGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzdGVwKS4gIFRoaXMgd2lsbAotCXJlcXVpcmUgdGhhdCB3ZSBob2xkIGEgc3RhdGljIHJlZmVyZW5jZSB0byBvdXIgZmFjdG9yeSBhbmQgcHJvdmlkZSBhCi0Jd2F5IHRvIGluaXRpYWxpemUgaXQuCi08L3VsPgotPHA+Ci1Nb3N0IG9mIHRoZSBjb2RlIGJlbG93IGlzIHN0YW5kYXJkIGdldHRlci9zZXR0ZXIgdmVyYmFnZSB3aGljaCBoYXMgYmVlbgotc29tZXdoYXQgYWJicmV2aWF0ZWQuICBUaGUgbm90YWJsZSBwYXJ0cyBhcmUgaW4gYm9sZC4gIFdlIGFkZCBmaXZlIG1vcmUKLWF0dHJpYnV0ZXMgdG8gPGNvZGU+Q2F0ZWdvcnk8L2NvZGU+OiB0aGUgZm91ciBuZXcgbG9nZ2luZyBhdHRyaWJ1dGVzCi1wbHVzIGEgc3RhdGljIDxjb2RlPkFwcFNlcnZlckNhdGVnb3J5RmFjdG9yeTwvY29kZT4gcmVmZXJlbmNlLiAgVGhpcyBpcwotcHJlLWluaXRpYWxpemVkIHRvIGFuIGluc3RhbmNlIHdpdGggYXR0cmlidXRlcyBzZXQgdG8gbnVsbCBhcyBhCi1wcmVjYXV0aW9uYXJ5IG1lYXN1cmUuICBPdGhlcndpc2UgdGhlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBtZXRob2QKLXdpbGwgcmVzdWx0IGluIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpZiBpbnZva2VkIGJlZm9yZSB0aGUKLTxjb2RlPnNldEZhY3Rvcnk8L2NvZGU+IG1ldGhvZC4KLTxwPgotVGhlIDxjb2RlPmdldEluc3RhbmNlPC9jb2RlPiBtZXRob2Qgc2ltcGx5IGludm9rZXMgaXRzIHBhcmVudCBjbGFzcwotbWV0aG9kIHRoYXQgYWNjZXB0cyBhIDxjb2RlPkNhdGVnb3J5RmFjdG9yeTwvY29kZT4gcmVmZXJlbmNlIGluCi1hZGRpdGlvbiB0byB0aGUgY2F0ZWdvcnkgbmFtZS4KLTxwPgotVGhlIDxjb2RlPmZvcmNlZExvZzwvY29kZT4gbWV0aG9kIGZvbGxvd3MgY2xvc2VseSB0aGUgY29ycmVzcG9uZGluZwotcGFyZW50IGNsYXNzIG1ldGhvZC4gIFRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlIGlzIHRoZSBpbnN0YW50aWF0aW9uCi1vZiB0aGUgPGNvZGU+QXBwU2VydmVyTG9nZ2luZ0V2ZW50PC9jb2RlPi4gIEEgbWlub3IgeWV0IG5lY2Vzc2FyeSAKLWRpZmZlcmVuY2UgaXMgdGhlIHVzZSBvZiB0aGUgPGNvZGU+Z2V0UmVuZGVyZXJNYXAoKTwvY29kZT4gbWV0aG9kIHJhdGhlcgotdGhhbiBhY2Nlc3NpbmcgdGhlIGRhdGEgbWVtYmVyIGRpcmVjdG9yeSBhcyBpbiA8Y29kZT5DYXRlZ29yeTwvY29kZT4uCi08Y29kZT5DYXRlZ29yeTwvY29kZT4gY2FuIGRvIHRoaXMgYmVjYXVzZSB0aGUgcmVuZGVyZXJNYXAgCi1pcyBwYWNrYWdlIGxldmVsIGFjY2Vzc2libGUuCi08cD4KLVRoZSA8Y29kZT5zZXRGYWN0b3J5PC9jb2RlPiBtZXRob2QgaXMgcHJvdmlkZWQgdG8gYWxsb3cgYXBwbGljYXRpb24gY29kZSAKLXRvIHNldCB0aGUgZmFjdG9yeSB1c2VkIGluIHRoZSA8Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gbWV0aG9kLgotPHA+Ci08dGFibGUgYm9yZGVyPTE+Ci08dHI+PHRkPgotPHByZT4KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuQ2F0ZWdvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLkxvZ2dpbmdFdmVudDsKLQotcHVibGljIGNsYXNzIEFwcFNlcnZlckNhdGVnb3J5IGV4dGVuZHMgQ2F0ZWdvcnkKLXsKLSAgIHByb3RlY3RlZCBTdHJpbmcgPGI+Y29tcG9uZW50PC9iPjsKLSAgIHByb3RlY3RlZCBTdHJpbmcgPGI+aG9zdG5hbWU8L2I+OwotICAgcHJvdGVjdGVkIFN0cmluZyA8Yj5zZXJ2ZXI8L2I+OwotICAgcHJvdGVjdGVkIFN0cmluZyA8Yj52ZXJzaW9uPC9iPjsKLSAgIHByaXZhdGUgc3RhdGljIENhdGVnb3J5RmFjdG9yeSA8Yj5mYWN0b3J5ID0gCi0gICAgICAgICAgICAgICAgICBuZXcgQXBwU2VydmVyQ2F0ZWdvcnlGYWN0b3J5KG51bGwsIG51bGwsIG51bGwpPC9iPjsKLQotICAgcHJvdGVjdGVkICBBcHBTZXJ2ZXJDYXRlZ29yeSggU3RyaW5nIGNhdGVnb3J5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gKQotICAgewotICAgICAgc3VwZXIoIGNhdGVnb3J5TmFtZSApOwotICAgICAgPGI+aW5zdGFuY2VGUU4gPSAib3JnLmFwYWNoZS5sb2c0ai5leGFtcGxlcy5hcHBzZXJ2ZXIuQXBwU2VydmVyQ2F0ZWdvcnkiOzwvYj4KLSAgICAgIAotICAgICAgdGhpcy5ob3N0bmFtZSAgPSBob3N0bmFtZTsKLSAgICAgIHRoaXMuc2VydmVyICAgID0gc2VydmVyOwotICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgICB0aGlzLnZlcnNpb24gICA9IHZlcnNpb247Ci0gICB9Ci0KLSAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50KCkKLSAgIHsgcmV0dXJuIChjb21wb25lbnQgPT0gbnVsbCApID8gIiIgOiByZXN1bHQ7IH0KLQotICAgcHVibGljIFN0cmluZyBnZXRIb3N0bmFtZSgpCi0gICB7ICByZXR1cm4gKCBob3N0bmFtZSA9PSBudWxsICkgPyAiIiA6IGhvc3RuYW1lOyB9Ci0KLSAgIHB1YmxpYyBzdGF0aWMgQ2F0ZWdvcnkgPGI+Z2V0SW5zdGFuY2U8L2I+KFN0cmluZyBuYW1lKQotICAgewotICAgICAgcmV0dXJuIENhdGVnb3J5LmdldEluc3RhbmNlKG5hbWUsIGZhY3RvcnkpOwotICAgfQotCi0gICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlcigpCi0gICB7ICByZXR1cm4gKCBzZXJ2ZXIgPT0gbnVsbCApID8gIiIgOiBzZXJ2ZXI7IH0KLQotICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkKLSAgIHsgIHJldHVybiAoIHZlcnNpb24gPT0gbnVsbCApID8gIiIgOiB2ZXJzaW9uOyB9Ci0KLSAgIHByb3RlY3RlZCB2b2lkIDxiPmZvcmNlZExvZzwvYj4oIFN0cmluZyAgICBmcW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgcHJpb3JpdHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgICAgbWVzc2FnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSB0KSAKLSAgIHsKLTxiPiAgICAgIExvZ2dpbmdFdmVudCBldmVudCA9IG5ldyBBcHBTZXJ2ZXJMb2dnaW5nRXZlbnQoZnFuLCB0aGlzLCBwcmlvcml0eSwgbWVzc2FnZSwgdCk7PC9iPgotICAgICAgY2FsbEFwcGVuZGVycyggZXZlbnQgKTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFN0cmluZyBjb21wb25lbnROYW1lKQotICAgeyBjb21wb25lbnQgPSBjb21wb25lbnROYW1lOyB9Ci0KLSAgIHB1YmxpYyBzdGF0aWMgdm9pZCA8Yj5zZXRGYWN0b3J5PC9iPihDYXRlZ29yeUZhY3RvcnkgZmFjdG9yeSkKLSAgIHsgQXBwU2VydmVyQ2F0ZWdvcnkuZmFjdG9yeSA9IGZhY3Rvcnk7IH0KLQotICAgcHVibGljIHZvaWQgc2V0SG9zdG5hbWUoU3RyaW5nIGhvc3RuYW1lKQotICAgeyB0aGlzLmhvc3RuYW1lID0gaG9zdG5hbWU7IH0KLQotICAgcHVibGljIHZvaWQgc2V0U2VydmVyKFN0cmluZyBzZXJ2ZXJOYW1lKQotICAgeyBzZXJ2ZXIgPSBzZXJ2ZXJOYW1lOyB9Ci0KLSAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb25OYW1lKQotICAgeyB2ZXJzaW9uID0gdmVyc2lvbk5hbWU7IH0KLX0KLTwvcHJlPgotPC90YWJsZT4KLTxwPgotCi08YSBuYW1lPSJDYXRlZ29yeUZhY3RvcnkiPjxoMz41LiBFeHRlbmRpbmcgPGNvZGU+Q2F0ZWdvcnlGYWN0b3J5PC9jb2RlPjwvaDM+PC9hPgotCi1UaGUgbGFzdCBzdGVwIGlzIHRvIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIAotPGNvZGU+Q2F0ZWdvcnlGYWN0b3J5PC9jb2RlPiBpbnRlcmZhY2UgdGhhdCB3aWxsIGNvcnJlY3RseSAKLWluc3RhbnRpYXRlIG91ciA8Y29kZT5BcHBTZXJ2ZXJDYXRlZ29yeTwvY29kZT4gb2JqZWN0cy4gIEl0Ci13aWxsIG9idGFpbiB0aGUgaG9zdG5hbWUgb2YgdGhlIG1hY2hpbmUgb24gd2hpY2ggaXQgcnVucyB1c2luZyB0aGUKLTxjb2RlPmphdmEubmV0PC9jb2RlPiBBUEkuICBBc2lkZSBmcm9tIHByb3ZpZGluZyBnZXR0ZXJzIGFuZAotc2V0dGVycyBmb3IgdGhlIGF0dHJpYnV0ZXMgaW50cm9kdWNlZCwgdGhlIG9ubHkgbWV0aG9kIHRvCi1iZSBpbXBsZW1lbnRlZCBpcyB0aGUgPGNvZGU+bWFrZU5ld0NhdGVnb3J5SW5zdGFuY2U8L2NvZGU+LgotPHA+Ci1CZWxvdyBpcyBhIHNuaXBwZXQgZnJvbSA8Y29kZT5BcHBTZXJ2ZXJDYXRlZ29yeUZhY3Rvcnk8L2NvZGU+Ci13aXRoIGdldHRlcnMsIHNldHRlcnMgYW5kIGNvbW1lbnRzIHJlbW92ZWQuCi08cD4KLTx0YWJsZSBib3JkZXI9MT4KLTx0cj48dGQ+Ci08cHJlPgotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuQ2F0ZWdvcnlGYWN0b3J5OwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXBwU2VydmVyQ2F0ZWdvcnlGYWN0b3J5IGltcGxlbWVudHMgQ2F0ZWdvcnlGYWN0b3J5Ci17Ci0gICBwcm90ZWN0ZWQgU3RyaW5nIGhvc3RuYW1lOwotICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXI7Ci0gICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvbmVudDsKLSAgIHByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKLSAgIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBtZXNzYWdlQnVuZGxlOwotCi0gICBwcm90ZWN0ZWQgIEFwcFNlcnZlckNhdGVnb3J5RmFjdG9yeSggU3RyaW5nIHNlcnZlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25OYW1lICkKLSAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAgaG9zdG5hbWUgPSBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbiB1aGUgKQotICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGxvY2FsIGhvc3RuYW1lLiIpOwotICAgICAgfQotCi0gICAgICBzZXJ2ZXIgICAgPSBzZXJ2ZXJOYW1lOwotICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50TmFtZTsKLSAgICAgIHZlcnNpb24gICA9IHZlcnNpb25OYW1lOwotICAgfQotCi0gICBwdWJsaWMgQ2F0ZWdvcnkgbWFrZU5ld0NhdGVnb3J5SW5zdGFuY2UoU3RyaW5nIG5hbWUpCi0gICB7Ci0gICAgICAgQ2F0ZWdvcnkgcmVzdWx0ID0gbmV3IEFwcFNlcnZlckNhdGVnb3J5KCBuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbik7Ci0gICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgIH0KLX0KLTwvcHJlPgotPC90YWJsZT4KLTxwPgotPGhyPgotPGEgbmFtZT0idXNhZ2UiPjxoMj5Vc2FnZTwvaDI+PC9hPgotV2Ugbm93IGFycml2ZSBhdCBob3cgdG8gdXNlIHdoYXQgd2UgaGF2ZSBjcmVhdGVkLiAgV2UgbXVzdCByZW1lbWJlciB0bwotaW5pdGlhbGl6ZSBsb2c0aiBieSBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiAKLTxjb2RlPkFwcFNlcnZlckNhdGVnb3J5RmFjdG9yeTwvY29kZT4gYW5kIHBhc3NpbmcgaXQgdG8gCi08Y29kZT5BcHBTZXJ2ZXJDYXRlZ29yeTwvY29kZT4uICBPbmNlIGRvbmUsIHdlIGNhbiBvYnRhaW4gYQotPGNvZGU+QXBwU2VydmVyQ2F0ZWdvcnlJbnN0YW5jZTwvY29kZT4gYW55dGltZSBieSB1c2luZyB0aGUgc3RhdGljCi08Y29kZT5nZXRJbnN0YW5jZTwvY29kZT4gbWV0aG9kIG9mIDxjb2RlPkFwcFNlcnZlckNhdGVnb3J5PC9jb2RlPi4KLVRoaXMgd2lsbCBlbnN1cmUgdGhhdCA8Y29kZT5BcHBTZXJ2ZXJMb2dnaW5nRXZlbnQ8L2NvZGU+IGluc3RhbmNlcwotYXJlIGdlbmVyYXRlZCBieSB0aGUgY2F0ZWdvcnkgbG9nZ2luZyBtZXRob2RzLgotPHA+Ci08dGFibGUgYm9yZGVyPTE+Ci08dHI+PHRkPgotPHByZT4KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5hcHBzZXJ2ZXIuQXBwU2VydmVyQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5hcHBzZXJ2ZXIuQXBwU2VydmVyQ2F0ZWdvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouYXBwc2VydmVyLkFwcFNlcnZlclBhdHRlcm5MYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyB0ZXN0Ci17Ci0gICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nID0gCi0gICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJW4iICsKLSAgICAgICJUaW1lOiAgICAgICVkJW4iICsKLSAgICAgICJIb3N0OiAgICAgICVoJW4iICsKLSAgICAgICJTZXJ2ZXI6ICAgICVzJW4iICsKLSAgICAgICJDb21wb25lbnQ6ICViJW4iICsKLSAgICAgICJWZXJzaW9uOiAgICV2JW4iICsKLSAgICAgICJQcmlvcml0eTogICVwJW4iICsKLSAgICAgICJUaHJlYWQgSWQ6ICV0JW4iICsKLSAgICAgICJDb250ZXh0OiAgICV4JW4iICsKLSAgICAgICJNZXNzYWdlOiAgICVtJW4iOwotCi0gICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICAgewotICAgICAgQXBwU2VydmVyQ2F0ZWdvcnlGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgICBmYWN0b3J5ID0gbmV3IEFwcFNlcnZlckNhdGVnb3J5RmFjdG9yeSgiTXlTZXJ2ZXIiLCAiTXlDb21wb25lbnQiLCAiMS4wIik7Ci0gICAgICBBcHBTZXJ2ZXJDYXRlZ29yeS5zZXRGYWN0b3J5KCBmYWN0b3J5ICk7Ci0gICAgICBDYXRlZ29yeSBjYXQgPSBBcHBTZXJ2ZXJDYXRlZ29yeS5nZXRJbnN0YW5jZSgic29tZS5jYXQiKTsKLQotICAgICAgUGF0dGVybkxheW91dCBsYXlvdXQgPSBuZXcgQXBwU2VydmVyUGF0dGVybkxheW91dCggZm9ybWF0U3RyaW5nICk7Ci0gICAgICBjYXQuYWRkQXBwZW5kZXIoIG5ldyBGaWxlQXBwZW5kZXIoIGxheW91dCwgU3lzdGVtLm91dCkgKTsKLQotICAgICAgY2F0LmRlYnVnKCJUaGlzIGlzIGEgZGVidWcgc3RhdGVtZW50LiIpOwotICAgICAgY2F0LmluZm8oIlRoaXMgaXMgYW4gaW5mbyBzdGF0ZW1lbnQuIik7Ci0gICAgICBjYXQud2FybigiVGhpcyBpcyBhIHdhcm5pbmcgc3RhdGVtZW50LiIpOwotICAgICAgY2F0LmVycm9yKCJUaGlzIGlzIGFuIGVycm9yIHN0YXRlbWVudC4iKTsKLSAgICAgIGNhdC5mYXRhbCgiVGhpcyBpcyBhIGZhdGFsIHN0YXRlbWVudC4iKTsKLSAgIH0KLX0KLTwvcHJlPgotPC90YWJsZT4KLTxhIG5hbWU9ImNvbmZpZ3VyYXRvcnMiPjxoMz5Db25maWd1cmF0b3JzPC9oMz48L2E+Ci1UaGVyZSBpcyBvbmUgYSB3b3JkIG9mIGNhdXRpb24gY29uY2VybmluZyB0aGUgdXNlIG9mIGNvbmZpZ3VyYXRvcnMgdGhhdAotbWF5IGNyZWF0ZSA8Y29kZT5DYXRlZ29yeTwvY29kZT4gaW5zdGFuY2VzIChzdWNoIGFzCi08YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9Qcm9wZXJ0eUNvbmZpZ3VyYXRvci5odG1sIj4KLTxjb2RlPlByb3BlcnR5Q29uZmlndXJhdG9yPC9jb2RlPjwvYT4gCi1hbmQgCi08YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai94bWwvRE9NQ29uZmlndXJhdG9yLmh0bWwiPgotPGNvZGU+RE9NQ29uZmlndXJhdG9yPC9jb2RlPjwvYT4pLiAgU2luY2UgdGhlc2UgY29uZmlndXJhdG9ycyBkbyBub3QKLWtub3cgYWJvdXQgb3VyIGV4dGVuc2lvbnMsIGFueSA8Y29kZT5DYXRlZ29yeTwvY29kZT4gaW5zdGFuY2VzIHRoZXkgCi1jcmVhdGUgd2lsbCBub3QgYmUgPGNvZGU+QXBwU2VydmVyQ2F0ZWdvcnk8L2NvZGU+IGluc3RhbmNlcy4gIFRvCi1wcmV2ZW50IHRoaXMgcHJvYmxlbSwgYW55IDxjb2RlPkFwcFNlcnZlckNhdGVnb3J5PC9jb2RlPiB0aGF0IG9uZQotbWlnaHQgd2FudCB0byBiZSBjb25maWd1cmVkIHRocm91Z2ggYSBjb25maWd1cmF0b3Igc2hvdWxkIGJlCi1pbnN0YW50aWF0ZWQgYmVmb3JlIHRoZSBjb25maWd1cmUgbWV0aG9kIGlzIGludm9rZWQuICBJbiB0aGlzIHdheSwKLXRoZSBjb25maWd1cmF0b3Igd2lsbCBjb25maWd1cmUgdGhlIDxjb2RlPkFwcFNlcnZlckNhdGVnb3J5PC9jb2RlPgotdGhhdCBhbHJlYWR5IGV4aXN0cyByYXRoZXIgdGhhbiBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBpdHMgc3VwZXIKLWNsYXNzLgotPHA+Ci1UaGUgY29uc2VxdWVuY2Ugb2YgYSBjb25maWd1cmF0b3IgY3JlYXRpbmcgdGhlIHN1cGVyIGNsYXNzIGJ5Ci1taXN0YWtlIGlzIG1lcmVseSB0aGF0IHRoZSBleHRyYSBhdHRyaWJ1dGVzIHdpbGwgbm90IGFwcGVhciBpbiAKLXRoZSBsb2cgb3V0cHV0LiAgQWxsIG90aGVyIGF0dHJpYnV0ZXMgYXJlIGNvbnZleWVkIHByb3Blcmx5LgotPHA+Ci08aHI+Ci08YSBuYW1lPSJlbmhhbmNlbWVudHMiPjxoMj5GdXJ0aGVyIEVuaGFuY2VtZW50czwvaDI+PC9hPgotVGhlcmUgYXJlIHNvbWUgb3RoZXIgZGlyZWN0aW9ucyBpbiB3aGljaCB0aGlzIGxvZzRqIGV4dGVuc2lvbiAKLW1heSBiZSBlbmhhbmNlZDoKLTxwPgotPG9sPgotPGxpPlRoZSBob3N0bmFtZSBhdHRyaWJ1dGUgY291bGQgaW5jb3Jwb3J0YXRlIGEgZm9ybWF0dGluZyBjb252ZW50aW9uCi0Jc2ltaWxhciB0byB0aGF0IG9mIGNsYXNzIGFuZCBjYXRlZ29yeSBuYW1lcyB3aGVyZWJ5IG9ubHkgYSBjZXJ0YWluCi0JbnVtYmVyIG9mIHRoZSBtb3JlIHNpZ25pZmljYW50IGNvbXBvbmVudHMgYXJlIGRpc3BsYXllZC4gIEJ1dAotCXdoZXJlYXMgd2l0aCBjbGFzcyBhbmQgY2F0ZWdvcnkgbmFtZXMsIHRoZSBtb3N0IHNpZ25pZmljYW50IGNvbXBvbmVudAotCWlzIG9uIHRoZSByaWdodCwgd2l0aCBob3N0IG5hbWVzLCBpdCBpcyBvbiB0aGUgbGVmdC4KLTxwPgotPGxpPlNwZWNpZnlpbmcgYSB2ZXJzaW9uIG51bWJlciBjb3VsZCBiZSBkYW5nZXJvdXMgc2luY2UgcHJvZ3JhbW1lcnMKLQlhcmUgYXB0IHRvIGNoYW5nZSB2ZXJzaW9ucyBvZiB0aGUgY29kZSB3aXRob3V0IGNoYW5naW5nIHRoZSAKLQlzdHJpbmcgY29uc3RhbnQgaW4gdGhlIGNvZGUgd2hpY2ggc3BlY2lmaWVzIHRoZSB2ZXJzaW9uLiAgU29tZQotCXNvdXJjZSBjb250cm9sIHByb2dyYW1zIHByb3ZpZGUgZm9yIGluc2VydGlvbiBvZiBhIHZlcnNpb24gbnVtYmVyCi0JaW50byBzb3VyY2UuICBGb3IgdGhvc2UgdGhhdCBkb24ndCwgaW5jbHVkaW5nIHRoZSB2ZXJzaW9uIG51bWJlciBhcwotCWEgY29uc3RhbnQgaXMgbGlrZWx5IHRvIGxlYWQgdG8gY29uZnVzaW9uIGxhdGVyIG9uLiAgSXQgd291bGQgYmUKLQluaWNlIHRvIHNlZSB0aGlzIHNob3J0LWNvbWluZyBhZGRyZXNzZWQuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2ltYWdlcy9jZWtpLTcyeDEwMS5naWYgYi9kb2NzL2ltYWdlcy9jZWtpLTcyeDEwMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZjAwMgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaW1hZ2VzL2Nla2ktNzJ4MTAxLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ltYWdlcy9jaGFpbnNhdy1mdWxsc2NyZWVuLXNtYWxsLmpwZyBiL2RvY3MvaW1hZ2VzL2NoYWluc2F3LWZ1bGxzY3JlZW4tc21hbGwuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZGU1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2ltYWdlcy9jaGFpbnNhdy1mdWxsc2NyZWVuLXNtYWxsLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ltYWdlcy9jaGFpbnNhdy1mdWxsc2NyZWVuLmpwZyBiL2RvY3MvaW1hZ2VzL2NoYWluc2F3LWZ1bGxzY3JlZW4uanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODM1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2ltYWdlcy9jaGFpbnNhdy1mdWxsc2NyZWVuLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ltYWdlcy9jb3ZlclNtYWxsLnBuZyBiL2RvY3MvaW1hZ2VzL2NvdmVyU21hbGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTlkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2ltYWdlcy9jb3ZlclNtYWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ltYWdlcy9tYXJrLTcyeDk5LmdpZiBiL2RvY3MvaW1hZ2VzL21hcmstNzJ4OTkuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNTA3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2ltYWdlcy9tYXJrLTcyeDk5LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ltYWdlcy9wc21pdGguanBnIGIvZG9jcy9pbWFnZXMvcHNtaXRoLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGRlN2FkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9pbWFnZXMvcHNtaXRoLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ltYWdlcy95c2hhcGlyYS5ibXAgYi9kb2NzL2ltYWdlcy95c2hhcGlyYS5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmMmJkZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaW1hZ2VzL3lzaGFwaXJhLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvYmx1ZV9vbl93aGl0ZS5naWYgYi9kb2NzL2xmNS9pbWFnZXMvYmx1ZV9vbl93aGl0ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlYjVmYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9ibHVlX29uX3doaXRlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvY29uc29sZV93aW5kb3cuZ2lmIGIvZG9jcy9sZjUvaW1hZ2VzL2NvbnNvbGVfd2luZG93LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTVhN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sZjUvaW1hZ2VzL2NvbnNvbGVfd2luZG93LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1LmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYzRjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2Fib3V0LmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfYWJvdXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmI1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2Fib3V0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2NhdGVnb3J5X2V4cGxvcmVyLmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfY2F0ZWdvcnlfZXhwbG9yZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZGYyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2NhdGVnb3J5X2V4cGxvcmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2NvbGxhcHNlYWxsLmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfY29sbGFwc2VhbGwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmE2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2NvbGxhcHNlYWxsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2NvbG9yY2hvb3Nlci5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2NvbG9yY2hvb3Nlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMDQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfY29sb3JjaG9vc2VyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2NvbXBhY3R2aWV3LmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfY29tcGFjdHZpZXcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODRjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2NvbXBhY3R2aWV3LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2NvbmZpZ3VyZS5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2NvbmZpZ3VyZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1NWMyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfY29uZmlndXJlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2Rlc2VsZWN0YWxsLmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfZGVzZWxlY3RhbGwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2M0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2Rlc2VsZWN0YWxsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2RldGFpbGVkdmlldy5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2RldGFpbGVkdmlldy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2MWIyNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfZGV0YWlsZWR2aWV3LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2V4cGFuZGFsbC5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2V4cGFuZGFsbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmNDUwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfZXhwYW5kYWxsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2xvZ2xldmVscy5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2xvZ2xldmVscy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0YTAyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfbG9nbGV2ZWxzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2xvZ28uZ2lmIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9sb2dvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM2MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9sb2dvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2xvZ29fc21hbGwuZ2lmIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9sb2dvX3NtYWxsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZhOTZkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9sb2dvX3NtYWxsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X2xvZ3RhYmxlLmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfbG9ndGFibGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDRkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X2xvZ3RhYmxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X25kY19maWx0ZXJpbmcuZ2lmIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9uZGNfZmlsdGVyaW5nLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDRmYzJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9uZGNfZmlsdGVyaW5nLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X29wZW5maWxlLmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfb3BlbmZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTA3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X29wZW5maWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X29wZW51cmwuZ2lmIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9vcGVudXJsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWE0NzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9vcGVudXJsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X3Byb3BlcnRpZXMuZ2lmIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9wcm9wZXJ0aWVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzU4ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV9wcm9wZXJ0aWVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X3JlY29yZGRldGFpbC5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X3JlY29yZGRldGFpbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3Yzk0MgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfcmVjb3JkZGV0YWlsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X3JlbW92ZV9jYXRlZ29yaWVzLmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfcmVtb3ZlX2NhdGVnb3JpZXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDU5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X3JlbW92ZV9jYXRlZ29yaWVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X3NlYXJjaC5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X3NlYXJjaC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyMThhYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfc2VhcmNoLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X3NlbGVjdGFsbC5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X3NlbGVjdGFsbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMjRhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfc2VsZWN0YWxsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X3NtYWxsLmdpZiBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfc21hbGwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNmZjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X3NtYWxsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X3N0YW5kYXJkdmlldy5naWYgYi9kb2NzL2xmNS9pbWFnZXMvbGY1X3N0YW5kYXJkdmlldy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmZmQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbGY1L2ltYWdlcy9sZjVfc3RhbmRhcmR2aWV3LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvbGY1X3ZpZXcuZ2lmIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV92aWV3LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNlMmViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sZjUvaW1hZ2VzL2xmNV92aWV3LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2xmNS9pbWFnZXMvc21hbGxfcmlnaHRfYXJyb3cuZ2lmIGIvZG9jcy9sZjUvaW1hZ2VzL3NtYWxsX3JpZ2h0X2Fycm93LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWNhMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sZjUvaW1hZ2VzL3NtYWxsX3JpZ2h0X2Fycm93LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC5odG1sIGIvZG9jcy9tYW51YWwuaHRtbAppbmRleCA1MGM1MzMxLi5kYjkxMGQ1IDEwMDY0NAotLS0gYS9kb2NzL21hbnVhbC5odG1sCisrKyBiL2RvY3MvbWFudWFsLmh0bWwKQEAgLTIyLDEyICsyMiwxMiBAQAogICAgICAgZGlzdHJpYnV0aW9uLiBUaGlzIGRvY3VtZW50IGlzIGJhc2VkIG9uIHRoZSBhcnRpY2xlIDxhCiAgICAgICBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vanctMTEtMjAwMC9qdy0xMTIyLWxvZzRqLmh0bWwiPiJMb2c0agogICAgICAgZGVsaXZlcnMgY29udHJvbCBvdmVyIGxvZ2dpbmciPC9hPiBwdWJsaXNoZWQgaW4gTm92ZW1iZXIgMjAwMAotICAgICAgZWRpdGlvbiBvZiA8YQotICAgICAgaHJlZj0iaHR0cDovL3d3dy5qYXZhd29ybGQuY29tIj5KYXZhV29ybGQ8L2E+LiBIb3dldmVyLCB0aGUKLSAgICAgIHByZXNlbnQgYXJ0aWNsZSBjb250YWlucyBtb3JlIGRldGFpbGVkIGFuZCB1cCB0byBkYXRlCi0gICAgICBpbmZvcm1hdGlvbi4gVGhlIHNob3J0IG1hbnVhbCBhbHNvIGJvcnJvd3Mgc29tZSB0ZXh0IGZyb20gdGhlCi0gICAgICBib29rICJsb2c0ajogdGhlIE1hbnVhbCIgYnkgdGhlIHNhbWUgYXV0aG9yICh5b3VycyB0cnVseSkuCi0KKyAgICAgIGVkaXRpb24gb2YgSmF2YVdvcmxkLiBIb3dldmVyLCB0aGUgcHJlc2VudCBhcnRpY2xlIGNvbnRhaW5zIG1vcmUKKyAgICAgIGRldGFpbGVkIGFuZCB1cCB0byBkYXRlIGluZm9ybWF0aW9uLiBUaGUgcHJlc2VudCBzaG9ydCBtYW51YWwKKyAgICAgIGFsc28gYm9ycm93cyBzb21lIHRleHQgZnJvbSA8YQorICAgICAgaHJlZj0iaHR0cHM6Ly93d3cucW9zLmNoL3Nob3AvcHJvZHVjdHMvZWNsbS8iPiI8ZW0+VGhlCisgICAgICBjb21wbGV0ZSBsb2c0aiBtYW51YWw8L2VtPiI8L2E+IGJ5IHRoZSBzYW1lIGF1dGhvciAoeW91cnMKKyAgICAgIHRydWx5KS4KIAogPGgyPkFic3RyYWN0PC9oMj4KIApAQCAtNTIsOSArNTIsOSBAQAogaHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZyI+b3BlbiBzb3VyY2U8L2E+IGluaXRpYXRpdmUuIFRoZQogbGF0ZXN0IGxvZzRqIHZlcnNpb24sIGluY2x1ZGluZyBmdWxsLXNvdXJjZSBjb2RlLCBjbGFzcyBmaWxlcyBhbmQKIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGF0IDxhCi1ocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyI+PGI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai88L2I+PC9hPi4KLUJ5IHRoZSB3YXksIGxvZzRqIGhhcyBiZWVuIHBvcnRlZCB0byB0aGUgQywgQysrLCBDIywgUHl0aG9uLCBSdWJ5LCBhbmQKLUVpZmZlbCBsYW5ndWFnZXMuCitocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqLyI+PGI+aHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0ai88L2I+PC9hPi4KK0J5IHRoZSB3YXksIGxvZzRqIGhhcyBiZWVuIHBvcnRlZCB0byB0aGUgQywgQysrLCBDIywgUGVybCwgUHl0aG9uLAorUnVieSwgYW5kIEVpZmZlbCBsYW5ndWFnZXMuCiAKIDxwPkluc2VydGluZyBsb2cgc3RhdGVtZW50cyBpbnRvIGNvZGUgaXMgYSBsb3ctdGVjaCBtZXRob2QgZm9yCiBkZWJ1Z2dpbmcgaXQuIEl0IG1heSBhbHNvIGJlIHRoZSBvbmx5IHdheSBiZWNhdXNlIGRlYnVnZ2VycyBhcmUgbm90CkBAIC03MCw3ICs3MCw3IEBACiBkZXZlbG9wbWVudCBjeWNsZSwgYSBzdWZmaWNpZW50bHkgcmljaCBsb2dnaW5nIHBhY2thZ2UgY2FuIGFsc28gYmUKIHZpZXdlZCBhcyBhbiBhdWRpdGluZyB0b29sLgogCi08cD5BcyBCcmlhbiBXLiBLZXJuaWdhbiBhbmQgUm9iIFBpa2UgcHV0IGl0IGluIHRoZWlyIHRydWx5IGV4Y2VsbGVudAorPHA+QXMgQnJpYW4gVy4gS2VybmlnaGFuIGFuZCBSb2IgUGlrZSBwdXQgaXQgaW4gdGhlaXIgdHJ1bHkgZXhjZWxsZW50CiBib29rIDxpPiJUaGUgUHJhY3RpY2Ugb2YgUHJvZ3JhbW1pbmciPC9pPgogPHByZT4KICAgQXMgcGVyc29uYWwgY2hvaWNlLCB3ZSB0ZW5kIG5vdCB0byB1c2UgZGVidWdnZXJzIGJleW9uZCBnZXR0aW5nIGEKQEAgLTkwLDcgKzkwLDcgQEAKIGFwcGxpY2F0aW9uLiBJZiB0b28gdmVyYm9zZSwgaXQgY2FuIGNhdXNlIHNjcm9sbGluZyBibGluZG5lc3MuIFRvCiBhbGxldmlhdGUgdGhlc2UgY29uY2VybnMsIGxvZzRqIGlzIGRlc2lnbmVkIHRvIGJlIHJlbGlhYmxlLCBmYXN0IGFuZAogZXh0ZW5zaWJsZS4gU2luY2UgbG9nZ2luZyBpcyByYXJlbHkgdGhlIG1haW4gZm9jdXMgb2YgYW4gYXBwbGljYXRpb24sCi1sb2c0aiBBUEkgc3RyaXZlcyB0byBiZSBzaW1wbGUgdG8gdW5kZXJzdGFuZCBhbmQgdG8gdXNlLgordGhlIGxvZzRqIEFQSSBzdHJpdmVzIHRvIGJlIHNpbXBsZSB0byB1bmRlcnN0YW5kIGFuZCB0byB1c2UuCiAKIDxoMj5Mb2dnZXJzLCBBcHBlbmRlcnMgYW5kIExheW91dHM8L2gyPgogCkBAIC0xMTQsMTMgKzExNCwxMyBAQAogZWFybGllciB2ZXJzaW9ucyBvZiBsb2c0aiwgdGhlIDxjb2RlPkxvZ2dlcjwvY29kZT4gY2xhc3MgY2FuIGJlCiBjb25zaWRlcmVkIGFzIGEgbWVyZSBhbGlhcyB0byB0aGUgPGNvZGU+Q2F0ZWdvcnk8L2NvZGU+IGNsYXNzLgogCi08cD4gTG9nZ2VycyBhcmUgbmFtZWQgZW50aXRpZXMuIExvZ2dlciBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUgYW5kCis8cD5Mb2dnZXJzIGFyZSBuYW1lZCBlbnRpdGllcy4gTG9nZ2VyIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZSBhbmQKIHRoZXkgZm9sbG93IHRoZSBoaWVyYXJjaGljYWwgbmFtaW5nIHJ1bGU6CiAKIDxwPgogPHRhYmxlIGJnY29sb3I9IiNFRUVFOTkiPgogIDx0cj4KLSAgPHRkPiAgCisgIDx0ZD4KICAgIDxkbD4KICAgICAgPGR0PjxiPk5hbWVkIEhpZXJhcmNoeTwvYj4KIApAQCAtMTQyLDExICsxNDIsMTEgQEAKIHNob3VsZCBiZSBmYW1pbGlhciB0byBtb3N0IGRldmVsb3BlcnMuCiAKIDxwPlRoZSByb290IGxvZ2dlciByZXNpZGVzIGF0IHRoZSB0b3Agb2YgdGhlIGxvZ2dlciBoaWVyYXJjaHkuIEl0Ci1pcyBleGNlcHRpb25hbCBpbiB0d28gd2F5czogCitpcyBleGNlcHRpb25hbCBpbiB0d28gd2F5czoKIAogPG9sPgogPGxpPiBpdCBhbHdheXMgZXhpc3RzLAotPGxpPiBpdCBjYW5ub3QgYmUgcmV0cmlldmVkIGJ5IG5hbWUuIAorPGxpPiBpdCBjYW5ub3QgYmUgcmV0cmlldmVkIGJ5IG5hbWUuCiA8L29sPgogPHA+SW52b2tpbmcgdGhlIGNsYXNzIHN0YXRpYyA8YQogaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyLmh0bWwjZ2V0Um9vdExvZ2dlcigpIj5Mb2dnZXIuZ2V0Um9vdExvZ2dlcjwvYT4KQEAgLTE2MiwxOCArMTYyLDE5IEBACiA8dGQ+CiA8cHJlPgogICBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGo7Ci0gIAorCiAgIHB1YmxpYyBjbGFzcyA8Yj5Mb2dnZXI8L2I+IHsKLSAgCisKICAgICAvLyBDcmVhdGlvbiAmIHJldHJpZXZhbCBtZXRob2RzOgogICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldFJvb3RMb2dnZXIoKTsKICAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRMb2dnZXIoU3RyaW5nIG5hbWUpOwotICAgIAorCiAgICAgLy8gcHJpbnRpbmcgbWV0aG9kczoKICAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhPYmplY3QgbWVzc2FnZSk7CiAgICAgcHVibGljIHZvaWQgaW5mbyhPYmplY3QgbWVzc2FnZSk7CiAgICAgcHVibGljIHZvaWQgd2FybihPYmplY3QgbWVzc2FnZSk7CiAgICAgcHVibGljIHZvaWQgZXJyb3IoT2JqZWN0IG1lc3NhZ2UpOworICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBtZXNzYWdlKTsKIAogICAgIC8vIGdlbmVyaWMgcHJpbnRpbmcgbWV0aG9kOgogICAgIHB1YmxpYyB2b2lkIGxvZyhMZXZlbCBsLCBPYmplY3QgbWVzc2FnZSk7CkBAIC0xODMsMTkgKzE4NCwxOSBAQAogPC90YWJsZT4KIAogPHA+TG9nZ2VycyA8ZW0+bWF5PC9lbT4gYmUgYXNzaWduZWQgbGV2ZWxzLiBUaGUgc2V0IG9mIHBvc3NpYmxlCi1sZXZlbHMsIHRoYXQgaXMgCitsZXZlbHMsIHRoYXQgaXMKIAotPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTGV2ZWwuaHRtbCNERUJVRyI+REVCVUc8L2E+LCAKLTxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0xldmVsLmh0bWwjSU5GTyI+SU5GTzwvYT4sIAotPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTGV2ZWwuaHRtbCNXQVJOIj5XQVJOPC9hPiwgCi08YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9MZXZlbC5odG1sI0VSUk9SIj5FUlJPUjwvYT4gYW5kIAotPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTGV2ZWwuaHRtbCNGQVRBTCI+RkFUQUw8L2E+IAorPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTGV2ZWwuaHRtbCNERUJVRyI+REVCVUc8L2E+LAorPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTGV2ZWwuaHRtbCNJTkZPIj5JTkZPPC9hPiwKKzxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0xldmVsLmh0bWwjV0FSTiI+V0FSTjwvYT4sCis8YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9MZXZlbC5odG1sI0VSUk9SIj5FUlJPUjwvYT4gYW5kCis8YSBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9MZXZlbC5odG1sI0ZBVEFMIj5GQVRBTDwvYT4KIAogYXJlIGRlZmluZWQgaW4gdGhlIDxjb2RlPjxhCiBocmVmPSJhcGkvb3JnL2FwYWNoZS9sb2c0ai9MZXZlbC5odG1sIj5vcmcuYXBhY2hlLmxvZzRqLkxldmVsPC9hPjwvY29kZT4KLWNsYXNzLiBBbHRob3VnaCB3ZSBkbyBub3QgZW5jb3VyYWdlIHlvdSBmcm9tIGRvaW5nIHNvLCB5b3UgbWF5IGRlZmluZQorY2xhc3MuIEFsdGhvdWdoIHdlIGRvIG5vdCBlbmNvdXJhZ2UgeW91IHRvIGRvIHNvLCB5b3UgbWF5IGRlZmluZQogeW91ciBvd24gbGV2ZWxzIGJ5IHN1Yi1jbGFzc2luZyB0aGUgPGNvZGU+TGV2ZWw8L2NvZGU+IGNsYXNzLiBBCi1wZXJoYXBzIGJldHRlciBhcHByb2FjaCBpcyB3aWxsIGJlIGV4cGxhaW5lZCBsYXRlciBvbi4KK3BlcmhhcHMgYmV0dGVyIGFwcHJvYWNoIHdpbGwgYmUgZXhwbGFpbmVkIGxhdGVyIG9uLgogCiA8cD5JZiBhIGdpdmVuIGxvZ2dlciBpcyBub3QgYXNzaWduZWQgYSBsZXZlbCwgdGhlbiBpdCBpbmhlcml0cwogb25lIGZyb20gaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBhbiBhc3NpZ25lZCBsZXZlbC4gTW9yZQpAQCAtMjA1LDcgKzIwNiw3IEBACiA8cD4KIDx0YWJsZSBiZ2NvbG9yPSIjRUVFRTk5Ij4KICAgPHRyPgotICA8dGQ+ICAKKyAgPHRkPgogICAgPGRsPgogICAgICA8ZHQ+PGI+TGV2ZWwgSW5oZXJpdGFuY2U8L2I+CiAKQEAgLTIzMSwxMCArMjMyLDEwIEBACiAgICAgPHRyIGFsaWduPWxlZnQ+PHRkPlggPC90ZD4gICAgICA8dGQ+bm9uZTwvdGQ+ICA8dGQ+UHJvb3Q8L3RkPjwvdHI+CiAgICAgPHRyIGFsaWduPWxlZnQ+PHRkPlguWSA8L3RkPiAgICA8dGQ+bm9uZTwvdGQ+ICA8dGQ+UHJvb3Q8L3RkPjwvdHI+CiAgICAgPHRyIGFsaWduPWxlZnQ+PHRkPlguWS5aPC90ZD4gICA8dGQ+bm9uZTwvdGQ+ICA8dGQ+UHJvb3Q8L3RkPjwvdHI+Ci0gICAgPGNhcHRpb24gYWxpZ249Ym90dG9tPkV4YW1wbGUgMTwvY2FwdGlvbj4gICAgCisgICAgPGNhcHRpb24gYWxpZ249Ym90dG9tPkV4YW1wbGUgMTwvY2FwdGlvbj4KIDwvdGFibGU+CiAKLTxwPkluIGV4YW1wbGUgMSBhYm92ZSwgb25seSB0aGUgcm9vdCBsb2dnZXIgaXMgYXNzaW5nZWQgYQorPHA+SW4gZXhhbXBsZSAxIGFib3ZlLCBvbmx5IHRoZSByb290IGxvZ2dlciBpcyBhc3NpZ25lZCBhCiBsZXZlbC4gVGhpcyBsZXZlbCB2YWx1ZSwgPGNvZGU+UHJvb3Q8L2NvZGU+LCBpcyBpbmhlcml0ZWQgYnkgdGhlCiBvdGhlciBsb2dnZXJzIDxjb2RlPlg8L2NvZGU+LCA8Y29kZT5YLlk8L2NvZGU+IGFuZAogPGNvZGU+WC5ZLlo8L2NvZGU+LgpAQCAtMjg4LDE3ICsyODksMTcgQEAKIAogCiA8cD5Mb2dnaW5nIHJlcXVlc3RzIGFyZSBtYWRlIGJ5IGludm9raW5nIG9uZSBvZiB0aGUgcHJpbnRpbmcgbWV0aG9kcwotb2YgYSBsb2dnZXIgaW5zdGFuY2UuIFRoZXNlIHByaW50aW5nIG1ldGhvZHMgYXJlIAorb2YgYSBsb2dnZXIgaW5zdGFuY2UuIFRoZXNlIHByaW50aW5nIG1ldGhvZHMgYXJlCiAKIDxjb2RlPgogPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyLmh0bWwjZGVidWcoamF2YS5sYW5nLk9iamVjdCkiPmRlYnVnPC9hPiwKIAotPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyLmh0bWwjaW5mbyhqYXZhLmxhbmcuT2JqZWN0KSI+aW5mbzwvYT4sIAorPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyLmh0bWwjaW5mbyhqYXZhLmxhbmcuT2JqZWN0KSI+aW5mbzwvYT4sCiAKLTxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0xvZ2dlci5odG1sI3dhcm4oamF2YS5sYW5nLk9iamVjdCkiPndhcm48L2E+LCAKKzxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0xvZ2dlci5odG1sI3dhcm4oamF2YS5sYW5nLk9iamVjdCkiPndhcm48L2E+LAogPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyLmh0bWwjZXJyb3IoamF2YS5sYW5nLk9iamVjdCkiPmVycm9yPC9hPiwKIDxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0xvZ2dlci5odG1sI2ZhdGFsKGphdmEubGFuZy5PYmplY3QpIj5mYXRhbDwvYT4KLSBhbmQgPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyLmh0bWwjbG9nKG9yZy5hcGFjaGUubG9nNGouTGV2ZWwsIGphdmEubGFuZy5PYmplY3QpIj5sb2c8L2E+PC9jb2RlPi4gCisgYW5kIDxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0xvZ2dlci5odG1sI2xvZyhvcmcuYXBhY2hlLmxvZzRqLkxldmVsLCBqYXZhLmxhbmcuT2JqZWN0KSI+bG9nPC9hPjwvY29kZT4uCiAKIAogPHA+QnkgZGVmaW5pdGlvbiwgdGhlIHByaW50aW5nIG1ldGhvZCBkZXRlcm1pbmVzIHRoZSBsZXZlbCBvZiBhCkBAIC0zMjEsOCArMzIyLDggQEAKIAk8ZHQ+PGI+QmFzaWMgU2VsZWN0aW9uIFJ1bGU8L2I+CiAKIAk8ZGQ+PHA+QSBsb2cgcmVxdWVzdCBvZiBsZXZlbCA8aT5wPC9pPiBpbiBhIGxvZ2dlciB3aXRoCi0JaW5oZXJpdGVkIGxldmVsIDxpPnE8L2k+LCBpcyBlbmFibGVkIGlmIDxpPiBwICZndDs9Ci0JcTwvaT4uIAkKKwkoZWl0aGVyIGFzc2lnbmVkIG9yIGluaGVyaXRlZCwgd2hpY2hldmVyIGlzIGFwcHJvcHJpYXRlKSBsZXZlbCA8aT5xPC9pPiwgaXMgZW5hYmxlZCBpZiA8aT4gcCAmZ3Q7PQorCXE8L2k+LgogICAgICAgPC9kbD4KIDwvdGFibGU+CiAKQEAgLTMzMCw3ICszMzEsNyBAQAogb3JkZXJlZC4gRm9yIHRoZSBzdGFuZGFyZCBsZXZlbHMsIHdlIGhhdmUgPGNvZGU+REVCVUcgJmx0OyBJTkZPCiAmbHQ7IFdBUk4gJmx0OyBFUlJPUiAmbHQ7IEZBVEFMPC9jb2RlPi4KIAotPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoaXMgcnVsZS4gCis8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhpcyBydWxlLgogCiA8cD48dGFibGUgYmdjb2xvcj0iQ0NDQ0NDIj4KIDx0cj48dGQ+CkBAIC0zMzksMzUgKzM0MCwzNSBAQAogICAgLy8gZ2V0IGEgbG9nZ2VyIGluc3RhbmNlIG5hbWVkICJjb20uZm9vIgogICAgTG9nZ2VyICBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKDxzdHJvbmc+ImNvbS5mb28iPC9zdHJvbmc+KTsKIAotICAgLy8gTm93IHNldCBpdHMgbGV2ZWwuIE5vcm1hbGx5IHlvdSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIAotICAgLy8gbGV2ZWwgb2YgYSBsb2dnZXIgcHJvZ2FtaXRjYWxseS4gVGhpcyBpcyB1c3VhbGx5IGRvbmUgCisgICAvLyBOb3cgc2V0IGl0cyBsZXZlbC4gTm9ybWFsbHkgeW91IGRvIG5vdCBuZWVkIHRvIHNldCB0aGUKKyAgIC8vIGxldmVsIG9mIGEgbG9nZ2VyIHByb2dyYW1tYXRpY2FsbHkuIFRoaXMgaXMgdXN1YWxseSBkb25lCiAgICAvLyBpbiBjb25maWd1cmF0aW9uIGZpbGVzLgogICAgPHN0cm9uZz5sb2dnZXI8L3N0cm9uZz4uc2V0TGV2ZWwoPGZvbnQKICAgIGNvbG9yPSIwMDAwQUEiPjxzdHJvbmc+TGV2ZWwuSU5GTzwvc3Ryb25nPjwvZm9udD4pOwogCiAgICBMb2dnZXIgYmFybG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcig8c3Ryb25nPiJjb20uZm9vLkJhciI8L3N0cm9uZz4pOwotIAorCiAgICAvLyBUaGlzIHJlcXVlc3QgaXMgZW5hYmxlZCwgYmVjYXVzZSA8Zm9udCBjb2xvcj0iMDBBQTAwIj48c3Ryb25nPldBUk48L3N0cm9uZz48L2ZvbnQ+ICZndDs9IDxmb250IGNvbG9yPSIwMDAwQUEiPjxzdHJvbmc+SU5GTzwvc3Ryb25nPjwvZm9udD4uCiAgICBsb2dnZXIuPGZvbnQgY29sb3I9IjAwQUEwMCI+PHN0cm9uZz53YXJuPC9zdHJvbmc+PC9mb250PigiTG93IGZ1ZWwgbGV2ZWwuIik7Ci0gIAotICAgLy8gVGhpcyByZXF1ZXN0IGlzIGRpc2FibGVkLCBiZWNhdXNlIDxmb250IGNvbG9yPSIwMEFBMDAiPjxzdHJvbmc+REVCVUc8L3N0cm9uZz48L2ZvbnQ+ICZsdDsgPGZvbnQgY29sb3I9IjAwMDBBQSI+PHN0cm9uZz5JTkZPPC9zdHJvbmc+PC9mb250Pi4KLSAgIGxvZ2dlci48Zm9udCBjb2xvcj0iMDBBQTAwIj48c3Ryb25nPmRlYnVnPC9zdHJvbmc+PC9mb250PigiU3RhcnRpbmcgc2VhcmNoIGZvciBuZWFyZXN0IGdhcyBzdGF0aW9uLiIpOyAKLSAKLSAgIC8vIFRoZSBsb2dnZXIgaW5zdGFuY2UgYmFybG9nZ2VyLCBuYW1lZCAiY29tLmZvby5CYXIiLAotICAgLy8gd2lsbCBpbmhlcml0IGl0cyBsZXZlbCBmcm9tIHRoZSBsb2dnZXIgbmFtZWQgCi0gICAvLyAiY29tLmZvbyIgVGh1cywgdGhlIGZvbGxvd2luZyByZXF1ZXN0IGlzIGVuYWJsZWQgCi0gICAvLyBiZWNhdXNlIDxmb250IGNvbG9yPSIwMEFBMDAiPjxzdHJvbmc+SU5GTzwvc3Ryb25nPjwvZm9udD4gJmd0Oz0gPGZvbnQgY29sb3I9IjAwMDBBQSI+PHN0cm9uZz5JTkZPPC9zdHJvbmc+PC9mb250Pi4gIAotICAgYmFybG9nZ2VyLjxmb250IGNvbG9yPSIwMEFBMDAiPjxzdHJvbmc+aW5mbzwvc3Ryb25nPjwvZm9udD4oIkxvY2F0ZWQgbmVhcmVzdCBnYXMgc3RhdGlvbi4iKTsgCiAKICAgIC8vIFRoaXMgcmVxdWVzdCBpcyBkaXNhYmxlZCwgYmVjYXVzZSA8Zm9udCBjb2xvcj0iMDBBQTAwIj48c3Ryb25nPkRFQlVHPC9zdHJvbmc+PC9mb250PiAmbHQ7IDxmb250IGNvbG9yPSIwMDAwQUEiPjxzdHJvbmc+SU5GTzwvc3Ryb25nPjwvZm9udD4uCi0gICBiYXJsb2dnZXIuPGZvbnQgY29sb3I9IjAwQUEwMCI+PHN0cm9uZz5kZWJ1Zzwvc3Ryb25nPjwvZm9udD4oIkV4aXRpbmcgZ2FzIHN0YXRpb24gc2VhcmNoIik7IAorICAgbG9nZ2VyLjxmb250IGNvbG9yPSIwMEFBMDAiPjxzdHJvbmc+ZGVidWc8L3N0cm9uZz48L2ZvbnQ+KCJTdGFydGluZyBzZWFyY2ggZm9yIG5lYXJlc3QgZ2FzIHN0YXRpb24uIik7CisKKyAgIC8vIFRoZSBsb2dnZXIgaW5zdGFuY2UgYmFybG9nZ2VyLCBuYW1lZCAiY29tLmZvby5CYXIiLAorICAgLy8gd2lsbCBpbmhlcml0IGl0cyBsZXZlbCBmcm9tIHRoZSBsb2dnZXIgbmFtZWQKKyAgIC8vICJjb20uZm9vIiBUaHVzLCB0aGUgZm9sbG93aW5nIHJlcXVlc3QgaXMgZW5hYmxlZAorICAgLy8gYmVjYXVzZSA8Zm9udCBjb2xvcj0iMDBBQTAwIj48c3Ryb25nPklORk88L3N0cm9uZz48L2ZvbnQ+ICZndDs9IDxmb250IGNvbG9yPSIwMDAwQUEiPjxzdHJvbmc+SU5GTzwvc3Ryb25nPjwvZm9udD4uCisgICBiYXJsb2dnZXIuPGZvbnQgY29sb3I9IjAwQUEwMCI+PHN0cm9uZz5pbmZvPC9zdHJvbmc+PC9mb250PigiTG9jYXRlZCBuZWFyZXN0IGdhcyBzdGF0aW9uLiIpOworCisgICAvLyBUaGlzIHJlcXVlc3QgaXMgZGlzYWJsZWQsIGJlY2F1c2UgPGZvbnQgY29sb3I9IjAwQUEwMCI+PHN0cm9uZz5ERUJVRzwvc3Ryb25nPjwvZm9udD4gJmx0OyA8Zm9udCBjb2xvcj0iMDAwMEFBIj48c3Ryb25nPklORk88L3N0cm9uZz48L2ZvbnQ+LgorICAgYmFybG9nZ2VyLjxmb250IGNvbG9yPSIwMEFBMDAiPjxzdHJvbmc+ZGVidWc8L3N0cm9uZz48L2ZvbnQ+KCJFeGl0aW5nIGdhcyBzdGF0aW9uIHNlYXJjaCIpOwogPC9wcmU+Ci08L3RhYmxlPiAgCis8L3RhYmxlPgogCiA8cD5DYWxsaW5nIHRoZSA8Y29kZT5nZXRMb2dnZXI8L2NvZGU+IG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgd2lsbAotYWx3YXlzIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZXhhY3Qgc2FtZSBsb2dnZXIgb2JqZWN0LiAKK2Fsd2F5cyByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGV4YWN0IHNhbWUgbG9nZ2VyIG9iamVjdC4KIAotPHA+Rm9yIGV4YW1wbGUsIGluIAorPHA+Rm9yIGV4YW1wbGUsIGluCiAKIDx0YWJsZSBiZ2NvbG9yPSJDQ0NDQ0MiPgogPHRyPjx0ZD4KQEAgLTQyMiw3ICs0MjMsNyBAQAogRXZlbnQgTG9nZ2VyczwvYT4sIGFuZCByZW1vdGUgVU5JWCA8YQogaHJlZj0iYXBpL29yZy9hcGFjaGUvbG9nNGovbmV0L1N5c2xvZ0FwcGVuZGVyLmh0bWwiPlN5c2xvZzwvYT4KIGRhZW1vbnMuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gbG9nIDxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL0FzeW5jQXBwZW5kZXIuaHRtbCI+YXN5bmNocm9ub3VzbHk8L2E+LgotIAorCiA8cD5Nb3JlIHRoYW4gb25lIGFwcGVuZGVyIGNhbiBiZSBhdHRhY2hlZCB0byBhIGxvZ2dlci4KIAogPHA+VGhlIDxhCkBAIC00ODYsMTQgKzQ4NywxNCBAQAogPHRyPjx0ZD54LnkgICAgIDx0ZD5ub25lICAgICAgIDx0ZD50cnVlIDx0ZD5BMSwgQS14MSwgQS14MgogICAgIDx0ZD5BcHBlbmRlcnMgb2YgIngiIGFuZCByb290LgogCi08dHI+PHRkPngueS56ICAgPHRkPkEteHl6MSAgICAgPHRkPnRydWUgPHRkPkExLCBBLXgxLCBBLXgyLCBBLXh5ejEJCis8dHI+PHRkPngueS56ICAgPHRkPkEteHl6MSAgICAgPHRkPnRydWUgPHRkPkExLCBBLXgxLCBBLXgyLCBBLXh5ejEKICAgICA8dGQ+QXBwZW5kZXJzIGluICJ4LnkueiIsICJ4IiBhbmQgcm9vdC4KIAotPHRyPjx0ZD5zZWN1cml0eSAgICAgICAgPHRkPkEtc2VjCSAgIDx0ZD48Zm9udCBjb2xvcj0iYmx1ZSI+ZmFsc2U8L2ZvbnQ+IAorPHRyPjx0ZD5zZWN1cml0eSAgICAgICAgPHRkPkEtc2VjCSAgIDx0ZD48Zm9udCBjb2xvcj0iYmx1ZSI+ZmFsc2U8L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPkEtc2VjCiAKICAgICA8dGQ+Tm8gYXBwZW5kZXIgYWNjdW11bGF0aW9uIHNpbmNlIHRoZSBhZGRpdGl2aXR5IGZsYWcgaXMgc2V0IHRvCi0gICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4gCisgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KIAogPHRyPjx0ZD5zZWN1cml0eS5hY2Nlc3MgPHRkPm5vbmUgPHRkPiB0cnVlIDx0ZD4gQS1zZWMgPHRkPk9ubHkKICAgICBhcHBlbmRlcnMgb2YgInNlY3VyaXR5IiBiZWNhdXNlIHRoZSBhZGRpdGl2aXR5IGZsYWcgaW4gInNlY3VyaXR5IiBpcwpAQCAtNTA3LDcgKzUwOCw3IEBACiBhc3NvY2lhdGluZyBhIDxlbT5sYXlvdXQ8L2VtPiB3aXRoIGFuIGFwcGVuZGVyLiBUaGUgbGF5b3V0IGlzCiByZXNwb25zaWJsZSBmb3IgZm9ybWF0dGluZyB0aGUgbG9nZ2luZyByZXF1ZXN0IGFjY29yZGluZyB0byB0aGUgdXNlcidzCiB3aXNoZXMsIHdoZXJlYXMgYW4gYXBwZW5kZXIgdGFrZXMgY2FyZSBvZiBzZW5kaW5nIHRoZSBmb3JtYXR0ZWQgb3V0cHV0Ci10byBpdHMgZGVzdGluYXRpb24uIAordG8gaXRzIGRlc3RpbmF0aW9uLgogCiBUaGUgPGEKIGhyZWY9ImFwaS9vcmcvYXBhY2hlL2xvZzRqL1BhdHRlcm5MYXlvdXQuaHRtbCI+UGF0dGVybkxheW91dDwvYT4sIHBhcnQKQEAgLTUzMyw3ICs1MzQsNyBAQAogZnJlcXVlbnRseSBuZWVkIHRvIGxvZyA8Y29kZT5PcmFuZ2VzPC9jb2RlPiwgYW4gb2JqZWN0IHR5cGUgdXNlZCBpbgogeW91ciBjdXJyZW50IHByb2plY3QsIHRoZW4geW91IGNhbiByZWdpc3RlciBhbgogPGNvZGU+T3JhbmdlUmVuZGVyZXI8L2NvZGU+IHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGFuIG9yYW5nZQotbmVlZHMgdG8gYmUgbG9nZ2VkLiAKK25lZWRzIHRvIGJlIGxvZ2dlZC4KIAogPHA+T2JqZWN0IHJlbmRlcmluZyBmb2xsb3dzIHRoZSBjbGFzcyBoaWVyYXJjaHkuIEZvciBleGFtcGxlLCBhc3N1bWluZwogb3JhbmdlcyBhcmUgZnJ1aXRzLCBpZiB5b3UgcmVnaXN0ZXIgYW4gPGNvZGU+RnJ1aXRSZW5kZXJlcjwvY29kZT4sIGFsbApAQCAtNTcwLDcgKzU3MSw3IEBACiAgLy8gSW1wb3J0IGxvZzRqIGNsYXNzZXMuCiAgPGI+aW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwogIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOzwvYj4KLSAKKwogIHB1YmxpYyBjbGFzcyBNeUFwcCB7CiAKICAgIC8vIERlZmluZSBhIHN0YXRpYyBsb2dnZXIgdmFyaWFibGUgc28gdGhhdCBpdCByZWZlcmVuY2VzIHRoZQpAQCAtNTg1LDcgKzU4Niw3IEBACiAgICAgIGxvZ2dlci5pbmZvKCJFbnRlcmluZyBhcHBsaWNhdGlvbi4iKTsKICAgICAgQmFyIGJhciA9IG5ldyBCYXIoKTsKICAgICAgYmFyLmRvSXQoKTsKLSAgICAgbG9nZ2VyLmluZm8oIkV4aXRpbmcgYXBwbGljYXRpb24uIik7ICAgIAorICAgICBsb2dnZXIuaW5mbygiRXhpdGluZyBhcHBsaWNhdGlvbi4iKTsKICAgIH0KICB9CiA8L3ByZT4KQEAgLTYwMywxMiArNjA0LDEyIEBACiA8cHJlPgogIDxiPnBhY2thZ2UgY29tLmZvbzs8L2I+CiAgaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwotIAorCiAgcHVibGljIGNsYXNzIEJhciB7CiAgICA8c3Ryb25nPnN0YXRpYzwvc3Ryb25nPiBMb2dnZXIgbG9nZ2VyID0gPHN0cm9uZz5Mb2dnZXIuZ2V0TG9nZ2VyKEJhci5jbGFzcyk7PC9zdHJvbmc+Ci0gIAorCiAgICBwdWJsaWMgdm9pZCBkb0l0KCkgewotICAgICBsb2dnZXIuZGVidWcoIkRpZCBpdCBhZ2FpbiEiKTsgICAgCisgICAgIGxvZ2dlci5kZWJ1ZygiRGlkIGl0IGFnYWluISIpOwogICAgfQogIH0KIDwvcHJlPgpAQCAtNjI0LDcgKzYyNSw3IEBACiB0byB0aGUgcGF0dGVybiAiJS00ciBbJXRdICUtNXAgJWMgJXggLSAlbSVuIi4KIAogPHA+Tm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoZSByb290IGxvZ2dlciBpcyBhc3NpZ25lZCB0bwotPGNvZGU+TGV2ZWwuREVCVUc8L2NvZGU+LiAKKzxjb2RlPkxldmVsLkRFQlVHPC9jb2RlPi4KIAogPHA+VGhlIG91dHB1dCBvZiBNeUFwcCBpczoKIDxwcmU+CkBAIC02MzUsNyArNjM2LDcgQEAKIAogPHA+VGhlIGZpZ3VyZSBiZWxvdyBkZXBpY3RzIHRoZSBvYmplY3QgZGlhZ3JhbSBvZiA8Y29kZT5NeUFwcDwvY29kZT4KIGFmdGVyIGp1c3QgaGF2aW5nIGNhbGxlZCB0aGUgPGNvZGU+QmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlPC9jb2RlPgotbWV0aG9kLiAKK21ldGhvZC4KIAogPHA+CiA8Y2VudGVyPgpAQCAtNjU4LDcgKzY1OSw3IEBACiA8cD5UaGUgcHJldmlvdXMgZXhhbXBsZSBhbHdheXMgb3V0cHV0cyB0aGUgc2FtZSBsb2cgaW5mb3JtYXRpb24uCiBGb3J0dW5hdGVseSwgaXQgaXMgZWFzeSB0byBtb2RpZnkgPGNvZGU+TXlBcHA8L2NvZGU+IHNvIHRoYXQgdGhlIGxvZwogb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIGF0IHJ1bi10aW1lLiBIZXJlIGlzIGEgc2xpZ2h0bHkgbW9kaWZpZWQKLXZlcnNpb24uICAKK3ZlcnNpb24uCiAKIDxwPjx0YWJsZSBiZ2NvbG9yPSJDQ0NDQ0MiPjx0cj48dGQ+CiA8cHJlPgpAQCAtNjY2LDIxICs2NjcsMjEgQEAKIAogIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKICA8Yj5pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjs8L2I+Ci0gCisKICBwdWJsaWMgY2xhc3MgTXlBcHAgewogCiAgICBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoTXlBcHAuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogCi0gICAgIAorCiAgICAgIC8vIEJhc2ljQ29uZmlndXJhdG9yIHJlcGxhY2VkIHdpdGggUHJvcGVydHlDb25maWd1cmF0b3IuCiAgICAgIDxzdHJvbmc+UHJvcGVydHlDb25maWd1cmF0b3IuY29uZmlndXJlKGFyZ3NbMF0pOzwvc3Ryb25nPgogCiAgICAgIGxvZ2dlci5pbmZvKCJFbnRlcmluZyBhcHBsaWNhdGlvbi4iKTsKICAgICAgQmFyIGJhciA9IG5ldyBCYXIoKTsKICAgICAgYmFyLmRvSXQoKTsKLSAgICAgbG9nZ2VyLmluZm8oIkV4aXRpbmcgYXBwbGljYXRpb24uIik7ICAgIAorICAgICBsb2dnZXIuaW5mbygiRXhpdGluZyBhcHBsaWNhdGlvbi4iKTsKICAgIH0KICB9CiA8L3ByZT4KQEAgLTY5NywxMCArNjk4LDEwIEBACiA8cHJlPgogIyBTZXQgcm9vdCBsb2dnZXIgbGV2ZWwgdG8gREVCVUcgYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIEExLgogbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgQTEKLSAgCi0jIEExIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlci4gCisKKyMgQTEgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyLgogbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLSAgCisKICMgQTEgdXNlcyBQYXR0ZXJuTGF5b3V0LgogbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAogbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSUtNHIgWyV0XSAlLTVwICVjICV4IC0gJW0lbgpAQCAtNzIxLDEwICs3MjIsMTAgQEAKIGxvZzRqLnJvb3RMb2dnZXI9REVCVUcsIEExCiBsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgogbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotICAKKwogIyA8c3Ryb25nPlByaW50IHRoZSBkYXRlIGluIElTTyA4NjAxIGZvcm1hdDwvc3Ryb25nPgogbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPTxzdHJvbmc+JWQ8L3N0cm9uZz4gWyV0XSAlLTVwICVjIC0gJW0lbgotICAKKwogIyBQcmludCBvbmx5IG1lc3NhZ2VzIG9mIGxldmVsIFdBUk4gb3IgYWJvdmUgaW4gdGhlIHBhY2thZ2UgY29tLmZvby4KIDxzdHJvbmc+bG9nNGoubG9nZ2VyLmNvbS5mb289V0FSTjwvc3Ryb25nPgogPC9wcmU+CkBAIC04MTMsMTMgKzgxNCwxMyBAQAogCiA8b2w+CiAKLSA8bGk+U2tpcCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGlmIHRoZSBzeXN0ZW0gcHJvcGVydHkKLSA8Yj5sb2c0ai5kZWZhdWx0SW5pdE92ZXJyaWRlPC9iPiBpcyBzZXQgdG8gYW55IHZhbHVlIG90aGVyIHRoYW4KLSAiZmFsc2UiLgorIDxsaT5TZXR0aW5nIHRoZSA8Yj5sb2c0ai5kZWZhdWx0SW5pdE92ZXJyaWRlPC9iPiBzeXN0ZW0gcHJvcGVydHkgdG8KKyBhbnkgb3RoZXIgdmFsdWUgdGhlbiAiZmFsc2UiIHdpbGwgY2F1c2UgbG9nNGogdG8gc2tpcCB0aGUgZGVmYXVsdAorIGluaXRpYWxpemF0aW9uIHByb2NlZHVyZSAodGhpcyBwcm9jZWR1cmUpLgogCiAgPHA+PGxpPlNldCB0aGUgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHN0cmluZyB2YXJpYWJsZSB0byB0aGUgdmFsdWUgb2YKICB0aGUgPGI+bG9nNGouY29uZmlndXJhdGlvbjwvYj4gc3lzdGVtIHByb3BlcnR5LiAgPGVtPlRoZSBwcmVmZXJyZWQKLSB3YXkgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmaWxlIGlzIHRob3Vyb3VnaCB0aGUKKyB3YXkgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmaWxlIGlzIHRocm91Z2ggdGhlCiAgPGI+bG9nNGouY29uZmlndXJhdGlvbjwvYj4gc3lzdGVtIHByb3BlcnR5LjwvZW0+IEluIGNhc2UgdGhlIHN5c3RlbQogIHByb3BlcnR5IDxiPmxvZzRqLmNvbmZpZ3VyYXRpb248L2I+IGlzIG5vdCBkZWZpbmVkLCB0aGVuIHNldCB0aGUKICBzdHJpbmcgdmFyaWFibGUgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHRvIGl0cyBkZWZhdWx0IHZhbHVlCkBAIC05MzIsNyArOTMzLDcgQEAKIHRlbGxzIGxvZzRqIHRvIHVzZSB0aGUgZmlsZSA8Y29kZT5jOlxmb29iYXIubGNmPC9jb2RlPiBhcyB0aGUgZGVmYXVsdAogY29uZmlndXJhdGlvbiBmaWxlLiBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGZ1bGx5IHNwZWNpZmllZCBieSB0aGUKIFVSTCA8Y29kZT5maWxlOi9jOi9mb29iYXIubGNmPC9jb2RlPi4gVGh1cywgdGhlIHNhbWUgY29uZmlndXJhdGlvbgotZmlsZSB3aWxsIGJlIHVzZWQgZm9yIGFsbCB3ZWItYXBwbGljYXRpb25zLiAKK2ZpbGUgd2lsbCBiZSB1c2VkIGZvciBhbGwgd2ViLWFwcGxpY2F0aW9ucy4KIAogCiA8cD5EaWZmZXJlbnQgd2ViLWFwcGxpY2F0aW9ucyB3aWxsIGxvYWQgdGhlIGxvZzRqIGNsYXNzZXMgdGhyb3VnaApAQCAtOTYzLDkgKzk2NCw5IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIExvZzRqSW5pdCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLSAgCisKICAgcHVibGljCi0gIHZvaWQgPGI+aW5pdCgpPC9iPiB7IAorICB2b2lkIDxiPmluaXQoKTwvYj4gewogICAgIFN0cmluZyBwcmVmaXggPSAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCgiLyIpOwogICAgIFN0cmluZyBmaWxlID0gZ2V0SW5pdFBhcmFtZXRlcigibG9nNGotaW5pdC1maWxlIik7CiAgICAgLy8gaWYgdGhlIGxvZzRqLWluaXQtZmlsZSBpcyBub3Qgc2V0LCB0aGVuIG5vIHBvaW50IGluIHRyeWluZwpAQCAtMTAyOSwxOSArMTAzMCwxOSBAQAogPGVtPk5lc3RlZCBEaWFnbm9zdGljIENvbnRleHQ8L2VtPi4gVGhlIE5EQyBjbGFzcyBpcyBzaG93biBiZWxvdy4KIAogPHByZT4KLSAgcHVibGljIGNsYXNzIE5EQyB7IAotICAgIC8vIFVzZWQgd2hlbiBwcmludGluZyB0aGUgZGlhZ25vc3RpYyAKLSAgICBwdWJsaWMgPHN0cm9uZz5zdGF0aWM8L3N0cm9uZz4gU3RyaW5nIGdldCgpOyAKLSAKKyAgcHVibGljIGNsYXNzIE5EQyB7CisgICAgLy8gVXNlZCB3aGVuIHByaW50aW5nIHRoZSBkaWFnbm9zdGljCisgICAgcHVibGljIDxzdHJvbmc+c3RhdGljPC9zdHJvbmc+IFN0cmluZyBnZXQoKTsKKwogICAgIC8vIFJlbW92ZSB0aGUgdG9wIG9mIHRoZSBjb250ZXh0IGZyb20gdGhlIE5EQy4KLSAgICBwdWJsaWMgPHN0cm9uZz5zdGF0aWM8L3N0cm9uZz4gU3RyaW5nIHBvcCgpOyAKLSAKKyAgICBwdWJsaWMgPHN0cm9uZz5zdGF0aWM8L3N0cm9uZz4gU3RyaW5nIHBvcCgpOworCiAgICAgLy8gQWRkIGRpYWdub3N0aWMgY29udGV4dCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotICAgIHB1YmxpYyA8c3Ryb25nPnN0YXRpYzwvc3Ryb25nPiB2b2lkIHB1c2goU3RyaW5nIG1lc3NhZ2UpOyAKLSAKLSAgICAvLyBSZW1vdmUgdGhlIGRpYWdub3N0aWMgY29udGV4dCBmb3IgdGhpcyB0aHJlYWQuICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyA8c3Ryb25nPnN0YXRpYzwvc3Ryb25nPiB2b2lkIHJlbW92ZSgpOyAKLSAgfSAgICAgICAgICAgICAgICAgIAorICAgIHB1YmxpYyA8c3Ryb25nPnN0YXRpYzwvc3Ryb25nPiB2b2lkIHB1c2goU3RyaW5nIG1lc3NhZ2UpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkaWFnbm9zdGljIGNvbnRleHQgZm9yIHRoaXMgdGhyZWFkLgorICAgIHB1YmxpYyA8c3Ryb25nPnN0YXRpYzwvc3Ryb25nPiB2b2lkIHJlbW92ZSgpOworICB9CiA8L3ByZT4KIAogPHA+VGhlIE5EQyBpcyBtYW5hZ2VkIHBlciB0aHJlYWQgYXMgYSA8ZW0+c3RhY2s8L2VtPiBvZiBjb250ZXh0dWFsCkBAIC0xMDk2LDcgKzEwOTcsNyBAQAogICAgbWFjaGluZSB0aGlzIGNvc3QgaXMgdHlwaWNhbGx5IGluIHRoZSA1IHRvIDUwIG5hbm9zZWNvbmQgcmFuZ2UuCiAKICAgIDxwPkhvd2V2ZXIsIFRoZSBtZXRob2QgaW52b2NhdGlvbiBpbnZvbHZlcyB0aGUgImhpZGRlbiIgY29zdCBvZgotICAgcGFyYW1ldGVyIGNvbnN0cnVjdGlvbi4gCisgICBwYXJhbWV0ZXIgY29uc3RydWN0aW9uLgogCiAgICA8cD5Gb3IgZXhhbXBsZSwgZm9yIHNvbWUgbG9nZ2VyIDxjb2RlPmNhdDwvY29kZT4sIHdyaXRpbmcsCiAgICAgPHByZT4KQEAgLTExMTMsMTIgKzExMTQsMTIgQEAKIAogCiAgICAgICA8cD5UbyBhdm9pZCB0aGUgcGFyYW1ldGVyIGNvbnN0cnVjdGlvbiBjb3N0IHdyaXRlOgotICAgIDxwcmU+ICAgCisgICAgPHByZT4KICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpIHsKICAgICAgICAgbG9nZ2VyLmRlYnVnKCJFbnRyeSBudW1iZXI6ICIgKyBpICsgIiBpcyAiICsgU3RyaW5nLnZhbHVlT2YoZW50cnlbaV0pKTsKICAgICAgIH0KICAgIDwvcHJlPgotICAgICAgCisKICAgICAgIDxwPlRoaXMgd2lsbCBub3QgaW5jdXIgdGhlIGNvc3Qgb2YgcGFyYW1ldGVyCiAgICAgICBjb25zdHJ1Y3Rpb24gaWYgZGVidWdnaW5nIGlzIGRpc2FibGVkLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmCiAgICAgICB0aGUgbG9nZ2VyIGlzIGRlYnVnLWVuYWJsZWQsIGl0IHdpbGwgaW5jdXIgdHdpY2UgdGhlIGNvc3Qgb2YKQEAgLTExMjcsNyArMTEyOCw3IEBACiAgICAgICA8Y29kZT5kZWJ1ZzwvY29kZT4uIFRoaXMgaXMgYW4gaW5zaWduaWZpY2FudAogICAgICAgb3ZlcmhlYWQgYmVjYXVzZSBldmFsdWF0aW5nIGEgbG9nZ2VyIHRha2VzIGFib3V0IDElCiAgICAgICBvZiB0aGUgdGltZSBpdCB0YWtlcyB0byBhY3R1YWxseSBsb2cuCi0gICAgICAKKwogICAgPHA+SW4gbG9nNGosIGxvZ2dpbmcgcmVxdWVzdHMgYXJlIG1hZGUgdG8gaW5zdGFuY2VzIG9mIHRoZSBMb2dnZXIKICAgIGNsYXNzLiBMb2dnZXIgaXMgYSBjbGFzcyBhbmQgbm90IGFuIGludGVyZmFjZS4gVGhpcyBtZWFzdXJhYmx5CiAgICByZWR1Y2VzIHRoZSBjb3N0IG9mIG1ldGhvZCBpbnZvY2F0aW9uIGF0IHRoZSBjb3N0IG9mIHNvbWUKZGlmZiAtLWdpdCBhL2RvY3Mvb3ZlcnZpZXcuaHRtbCBiL2RvY3Mvb3ZlcnZpZXcuaHRtbAppbmRleCA0MGVmY2NkLi4xZGJlM2VlIDEwMDY0NAotLS0gYS9kb2NzL292ZXJ2aWV3Lmh0bWwKKysrIGIvZG9jcy9vdmVydmlldy5odG1sCkBAIC03LDUgKzcsNiBAQAogCiA8cD5NYWtlIHN1cmUgdG8gcmVhZCB0aGUgPGEgaHJlZj0iLi4vbWFudWFsLmh0bWwiPjxiPnVzZXIgbWFudWFsPC9iPjwvYT4KIGluIGFkZGl0aW9uIHRvIHRoaXMgamF2YWRvYyBkb2N1bWVudGF0aW9uLgorPC9wPgogCiA8L2JvZHk+IDwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvcHJhaXNlLmh0bWwgYi9kb2NzL3ByYWlzZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNmQxMGQwLi4wMDAwMDAwCi0tLSBhL2RvY3MvcHJhaXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgotPGh0bWw+IDxoZWFkPgotPHRpdGxlPlByYWlzZSBmcm9tIGxvZzRqIHVzZXJzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0id2hpdGUiPgotPGgyPlByYWlzZSBmcm9tIGxvZzRqIHVzZXJzPC9oMj4KLQotPGhyPjxibG9ja3F1b3RlPgotTG9nNEogd2FzIG5hbWVkIGFzIGEgZmluYWxpc3QgaW4gdGhlICJNb3N0IFVzZWZ1bCBOZXcgb3IgUmV2aXNlZCBKYXZhIEFQSS9UZWNobm9sb2d5IiAKLWNhdGVnb3J5LCBhbmQgVG9tY2F0IDMuMiB3YXMgbmFtZWQgYXMgYSBmaW5hbGlzdCBpbiB0aGUgIk1vc3QgSW5ub3ZhdGl2ZSBKYXZhIFByb2R1Y3QiIGNhdGVnb3J5LgotPC9ibG9ja3F1b3RlPgotPHAgYWxpZ249cmlnaHQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhd29ybGQuY29tIiB0YXJnZXQ9Il9ibGFuayI+SmF2YVdvcmxkPC9hPiwgIEFwcmlsIDIwMDEKLQotPGhyPjxibG9ja3F1b3RlPgotPHA+TG9nNGogaXMgYW4gaW5jcmVkaWJseSB3ZWxsIGRlc2lnbmVkIGFuZCBmdW5jdGlvbmFsIGxvZ2dpbmcgdG9vbC4gSQotY2F1Z2h0IHRoZSByZWxpZ2lvbiBsYXN0IHN1bW1lciBhbmQgd2l0aCBldmVyeSBwcm9qZWN0IEkgd29yayBvbiwgbW9zdAotZXZlcnlvbmUgYWdyZWVzIGl0J3MgYSBtdXN0IGtub3cvaGF2ZSB0b29sLiBQcmV2aW91c2x5IEkgd2FzIHVzaW5nCi1hbm90aGVyIEphdmEgbG9nZ2luZyBsaWJyYXJ5IGRldmVsb3BlZCBpbnRlcm5hbGx5IHdpdGhpbiBteSBjb21wYW55Ci13aGljaCBJIGxpa2VkLiBJIGhhZCBubyBkZXNpcmUgdG8gbGVhcm4gYW5vdGhlciBidXQgZGlkIHNvIGZvciB0aGUKLXNha2Ugb2YgZHVlIGRpbGlnZW5jZS4gTG9nNGogaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgd2hpY2ggc2V0IGl0Ci1hcGFydCBmcm9tIG90aGVycyBJIGhhdmUgc2Vlbi4KLQotPHA+PGI+SGlnaGx5IGNvbmZpZ3VyYWJsZTwvYj4gLSB0aGUgYWJpbGl0eSB0byBjb25maWd1cmUgdGhlCi1wcm9wZXJ0aWVzIG9mIHlvdXIgbG9nZ2VycyAoY2FsbGVkIENhdGVnb3JpZXMgaW4gbG9nNGopIGZyb20gd2l0aGluIGEKLXByb3BlcnR5IGZpbGUgaXMgaW5kaXNwZW5zaWJsZS4gVGhpcyBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUKLWNoYXJhY3RlcmlzdGljcyBvZiB5b3VyIGxvZ2dpbmcgd2l0aG91dCBjaGFuZ2luZyBjb2RlLiBZb3UgY2FuIGNoYW5nZQotdGhlIGxvZ2dpbmcgbGV2ZWwsIHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBhbmQgdGhlIG91dHB1dCB0YXJnZXRzCi12ZXJ5IGVhc2lseS4gIE9uZSBjYW4gYWxzbyB1c2UgWE1MIGZpbGVzICh0aG91Z2ggSSBoYXZlbid0KS4KLQotPHA+PGI+VW5vYnRydXNpdmU8L2I+IC0gSSdtIGZpbmlzaGluZyBhIHByb2plY3Qgd2hlcmUgd2Ugc3RhcnRlZCB1c2luZyBhbm90aGVyCi1sb2dnaW5nIHRvb2wuIFRoZSBsb2cgc3RhdGVtZW50cyB3ZXJlIGNsdW1zaWx5IGxvbmcgYW5kIHJlcXVpcmVkIHVzaW5nCi1wcmVkZWZpbmVkIGNvbnN0YW50cyB0aGF0IHdlcmUgaGFyZCB0byByZW1lbWJlci4gV2hlbiB3cml0aW5nIHRoZQotaW5pdGlhbCBjb2RlLCAiU3lzdGVtLm91dC5wcmludGxuIiB3YXMgc28gbXVjaCBlYXNpZXIgdG8gdHlwZSB0aGF0Ci1wZW9wbGUgZGlkIHRoaXMgZm9yIHRyYWNpbmcgd2l0aCB0aGUgYmVzdCBvZiBpbnRlbnRpb25zIHRvIHBsYWNlCi1sZWdpdGltYXRlIGxvZ2dpbmcgaW4gbGF0ZXIuIFlvdSBrbm93IHRoZSBzdG9yeS4gSXQgbmV2ZXIKLWhhcHBlbmVkLiBMb2c0aiBzdGF0ZW1lbnRzIGFyZSBzaG9ydGVyIHRoYW4gIlN5c3RlbS5vdXQucHJpbnRsbiIKLXN0YXRlbWVudHMuIFRoaXMgZW5jb3VyYWdlcyBwZW9wbGUgdG8gYWN0dWFsbHkgdXNlIGl0IHJhdGhlciB0aGFuCi1zaW1wbHkgYWdyZWVpbmcgdG8uCi0KLTxwPjxiPkVhc3kgY29uZmlndXJhdGlvbjwvYj4gLSBXaXRoIGp1c3Qgb25lIHN0YXRlbWVudCwgbG9nNGogd2lsbAotY29uZmlndXJlIGl0c2VsZiB3aXRoIGEgc2V0IG9mIGRlZmF1bHRzIHRoYXQgYXJlIHVzZWZ1bCB1bnRpbCB5b3UgZ2V0Ci1hcm91bmQgdG8gYWN0dWFsbHkgd3JpdGluZyB5b3VyIHByb3BlcnR5IGZpbGUsIFhNTCBmaWxlIG9yCi13aGF0ZXZlci4gTGlrZSB0aGUgcG9pbnQganVzdCBtYWRlIGJlZm9yZSwgdGhpcyBhbGxvd3MgbG9nNGogdG8gYmUKLXVzZWQgYXQgdGhlIG91dHNldCBvZiBjb2RpbmcgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHdhaXQgYmVjYXVzZSB5b3UKLWhhdmVuJ3QgY29uc2lkZXJlZCBob3cgeW91IHdpc2ggbG9nZ2luZyB0byBiZSBjb25maWd1cmVkLiBUaGUKLWFwcGxpY2F0aW9uIGNvZGUgaXRzZWxmIGRvZXMgbm90IGhhdmUgdG8ga25vdyBob3cgbG9nZ2luZyB3aWxsIGJlCi1jb25maWd1cmVkLiAKLQotPHA+PGI+UGVyZm9ybWFuY2UgQ29uY2VybnM8L2I+IC0gU2luY2UgSmF2YSBkb2VzIG5vdCB1c2UgcHJlLXByb2Nlc3NvcgotbWFjcm9zLCBtb3N0IEphdmEgdHJhY2luZyBpcyBhbHdheXMgY29tcGlsZWQgaW50byB0aGUgY29kZS4gVGhhdCBtZWFucwotdGhhdCB0aGUgZGVjaXNpb24gdG8gY29tcGlsZSBpcyBtYWRlIGF0IHJ1bnRpbWUuICBUaGVyZSBhcmUgdGltZXMgd2hlbgotcGVyZm9ybWFuY2UgaXMgc28gcGFyYW1vdW50IHRoYXQgZXZlbiBjaGVja2luZyB3aGV0aGVyIHRvIGxvZyBpcyBhCi1jb25jZXJuLiBUaGVyZSBhcmUgb3RoZXIgZXh0cmVtZXMgd2hlcmUgb3RoZXIgZGVsYXlzIG1ha2UgdGhpcwotaW5zaWduaWZpY2FudCBzbyB0aGF0IHRoZSBwZXJmb3JtYW5jZSBpcyBlYXNpbHkgc2FjcmlmaWNlZCBmb3IgdGhlCi1pbmNyZWFzZWQgYW1vdW50IG9mIGluZm9ybWF0aW9uIGxvZ2dlZCAoc3VjaCBhcyBtZXRob2QgbmFtZSwgY2xhc3MKLW5hbWUgYW5kIGxpbmUgbnVtYmVyIGluIHNvdXJjZSBjb2RlKS4gVGhlIGxvZzRqIGphdmFkb2MgZG9jdW1lbnRhdGlvbgotZXhwbGFpbnMgd2hpY2ggaW5mb3JtYXRpb24gZWxlbWVudHMgYXJlIHF1aWNrbHkgbG9nZ2VkIGFuZCB3aGljaCBtYXkKLWNvbXByb21pc2UgcGVyZm9ybWFuY2UuIEl0IGFsc28gaW5jbHVkZXMgYmVuY2htYXJrcyB0aGF0IGRlbW9uc3RyYXRlCi1ob3cgZmFzdCBjZXJ0YWluIHN0YXRlbWVudHMgYXJlIGxvZ2dlZCBmb3IgYSBmZXcgc2FtcGxlIG1hY2hpbmUKLWNvbmZpZ3VyYXRpb25zLgotCi08cD48Yj5IaWVyYXJjaGljYWwgQ2F0ZWdvcmllczwvYj4gLSBUaGlzIGlzIGhpZ2hseSB1c2VmdWwgaW4gY29tcG9uZW50Ci1iYXNlZCBkZXZlbG9wbWVudC4gRWFjaCBjb21wb25lbnQgaGFzIGl0cyBvd24gc2V0IG9mIGxvZ2dpbmcKLWNhdGVnb3JpZXMuIFdoZW4gaW5kaXZpZHVhbGx5IHRlc3RlZCwgdGhlIHByb3BlcnRpZXMgb2YgdGhlc2UKLWNhdGVnb3JpZXMgbWF5IGJlIHNldCBob3dldmVyIHRoZSBkZXZlbG9wZXIgd2lzaGVzLiBXaGVuIGNvbWJpbmVkIHdpdGgKLW90aGVyIGNvbXBvbmVudHMsIHRoZSBjYXRlZ29yaWVzIGluaGVyaXQgdGhlIHByb3BlcnRpZXMgZGV0ZXJtaW5lZCBieQotdGhlIGludGVncmF0b3Igb2YgdGhlIGNvbXBvbmVudHMuIE9uZSBjYW4gc2VsZWN0aXZlbHkgZWxldmF0ZSBsb2dnaW5nCi1wcmlvcml0aWVzIG9uIG9uZSBjb21wb25lbnQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIG90aGVyCi1jb21wb25lbnRzLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIGEgZGV0YWlsZWQgdHJhY2UgZnJvbSBqdXN0IGEKLXNpbmdsZSBjb21wb25lbnQgd2l0aG91dCBjcm93ZGluZyB0aGUgdHJhY2UgZmlsZSB3aXRoIG1lc3NhZ2VzIGZyb20KLW90aGVyIGNvbXBvbmVudHMuIEFsbCB0aGlzIGNhbiBiZSBkb25lIHdpdGggcHJvcGVydHkgZmlsZXMgLSBubyBjaGFuZ2UKLWluIHRoZSBjb2RlIGlzIHJlcXVpcmVkLgotCi08cD48Yj5FYXNpbHkgc3BlY2lmaWVkIG91dHB1dCBmb3JtYXQ8L2I+IC0gU29tZSBKYXZhIGFuZCBPTyBwdXJpc3QKLWRpc2FncmVlIHdpdGggbWUgb24gdGhpcywgYnV0IGFsbG93aW5nIG9uZSB0byB1c2UgcHJpbnRmLXN0eWxlIG91dHB1dAotZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgcG93ZXJmdWwsIGNvbnZlbmllbnQgYW5kIGNvbXBhY3QuIExvZzRqCi1wcm92aWRlcyBhIExheW91dCBjbGFzcyB3aXRoIHRoaXMgY2FwYWJpbGl0eS4gT2YgY291cnNlLCBmb3IgdGhvc2Ugd2hvCi13aXNoLCB5b3UgbWF5IGltcGxlbWVudCB0aGUgTGF5b3V0IGludGVyZmFjZSB5b3Vyc2VsZiB3aXRoIHNvbWV0aGluZwotIm1vcmUgT08iLiBOYXR1cmFsbHksIHRoZSBwcmludGYtc3R5bGUgcGF0dGVybiBjYW4gYmUgc3BlY2lmaWVkIGluIGEKLXByb3BlcnR5IGZpbGUuCi0KLTxwPjxiPkN1c3RvbWl6YXRpb248L2I+IC0gTGlrZSBvdGhlciBsb2dnZXJzLCBsb2c0aiBpcyBpbnRlcmZhY2UtYmFzZWQKLW1ha2luZyBpdCBwb3NzaWJsZSB0byBleHRlbmQuIExvZzRqIHN1cHBsaWVzIHVzZWZ1bCBpbXBsZW1lbnRhdGlvbnMKLXRoYXQgYXJlIGV4dGVuZGVkIGVhc2lseSB3aXRob3V0IGhhdmluZyB0byBpbXBsZW1lbnQgdGhlIGludGVyZmFjZQotZnJvbSBzY3JhdGNoLgotPC9ibG9ja3F1b3RlPgotCi08cCBhbGlnbj1yaWdodD5QYXVsIEdsZXplbiAocGdsZXplbiBhdCBhdGRpYWwubmV0KSwgRGVjZW1iZXIgM3JkLCAyMDAwCi0KLTxocj48YmxvY2txdW90ZT4KLVRoaXMgSmF2YSBwYWNrYWdlIGlzIHByb2JhYmx5IG9uZSBvZiB0aGUgYmVzdCBhbmQgbW9zdCByZWxpYWJsZSBwYWNrYWdlcwotYXJvdW5kLCBhbmQgcmVhbGx5IGhlbHBzIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSBvZiBxdWFsaXR5IHNvZnR3YXJlLgotVGhhbmtzIHRvIGFsbCBjb250cmlidXRvcnMgd2hvIGhhdmUgbWFkZSBzdWNoIGEgZ29vZCB3b3JrLgotPC9ibG9ja3F1b3RlPgotCi08cCBhbGlnbj1yaWdodD5EZW5pcyBCYWxhenVjIChkZW5pcy5iYWxhenVjIGF0IHRyYWRlci5jb20pLCBEZWNlbWJlciA4dGgsICAyMDAwCi0KLTxocj48YmxvY2txdW90ZT4gVGhpcyBpcyBqdXN0IGEgcXVpY2sgbm90ZSBvZiB0aGFua3MgZm9yIHB1Ymxpc2hpbmcKLXlvdXIgYXJ0aWNsZSBpbiBKYXZhd29ybGQuICBMb2c0aiBpcyByZWFsbHkgZWFzeSB0byB1c2UuICBXaGlsZSBJIHdhcwotaW5pdGlhbGx5IHNrZXB0aWNhbCBvZiB0aGUgaWRlYSwgY29kZSBsaWtlIHRoaXMgbWFrZXMgbWUgYSBiZWxpZXZlciBpbgotdGhlIGNvbmNlcHQgb2YgT3BlbiBTb3VyY2UuICAKLTwvYmxvY2txdW90ZT4KLQotPHAgYWxpZ249cmlnaHQ+UGF1bCBIeW5kbWFuIChQYXVsSHluZG1hbiBhdCBteW5kLmNvbSksICBOb3ZlbWJlciAyOXRoLCAyMDAwCi0KLTxocj48YmxvY2txdW90ZT4KLUkganVzdCByZWNlbnRseSBiZWNhbWUgYXdhcmUgb2YgbG9nNGogYW5kIGFtIGp1c3Qgbm93IGJlZ2luaW5nIHRvIHVzZQotaXQuIEkgd2FudCB0byB0aGFuayB5b3UgYW5kIHRoZSByZXN0IG9mIHRoZSBsb2c0aiBkZXZlbG9wbWVudCB0ZWFtIGZvcgotbWFraW5nIHRoaXMgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUuIFlvdSBhcmUgcHJvdmlkaW5nIGFuIG91dHN0YW5kaW5nCi1zZXJ2aWNlIHRvIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkuIFBsZWFzZSBwYXNzIG15IHJlZ2FyZHMgb24gdG8gdGhlCi1vdGhlciB0ZWFtIG1lbWJlcnMuCi08L2Jsb2NrcXVvdGU+Ci0KLTxwIGFsaWduPXJpZ2h0PlJpY2ggQ29jbyAocmFjb2NvIGF0IGNlbG94bmV0d29ya3MuY29tKSwgTm92ZW1iZXIgMTZ0aCwgMjAwMAotCi0KLQotPGhyPjxibG9ja3F1b3RlPgotCi1KdXN0IHRob3VnaHQgSSdkIGxldCB5b3Uga25vdyB0aGF0IEkgYW0gdXNpbmcgeW91ciBsb2c0aiBhcyBhIHBhcnQgb2YKLWFuIGUtY29tbWVyY2UgYXBwbGljYXRpb24gKDxhCi1ocmVmPSJodHRwOi8vd3d3LmNvbnN1bWVyZC5jb20iPnd3dy5jb25zdW1lcmQuY29tPC9hPikuICBJIGFtIHVzaW5nCi10aGUgWE1MIGNvbmZpZ3VyYXRpb24gY2xhc3NlcyBhbmQgaGF2ZSB0byBzYXkgdGhhdCBJIGFtIG1vc3QKLWltcHJlc3NlZC4KLTwvYmxvY2txdW90ZT4KLQotPHAgYWxpZ249cmlnaHQ+UmljaGFyZCBLaW5nIChSaWNoYXJkLktpbmcgYXQgY2FwZ2VtaW5pLmNvLnVrKSwgT2N0b2JlciAyNXRoLCAyMDAwIAotCi08aHI+PGJsb2NrcXVvdGU+Ci0KLVlvdSBzaG91bGQgc2VlIHdoYXQgd2UndmUgdXNlZCBsb2c0aiBmb3IgYXQgd29yay4uLiBJIHB1dCB0b2dldGhlcgotdGhpcyBTZXJ2bGV0IHRoYXQgY2FuIGludGVycHJldCBTT0FQIG1lc3NhZ2VzIGFuZCBpbnZva2UgbGl0dGxlCi0iaGFuZGxlcnMiLiAgTG9nZ2luZyBpcyBwZXJ2YXNpdmUgdGhyb3VnaCBvdXQgdGhlIHN5c3RlbSwgYW5kIHRoZQotaGFuZGxlciBkZXZlbG9wZXJzIGNhbiAiY3JlYXRlIiB0aGVpciBvd24gQ2F0ZWdvcmllcyBkeW5hbWljYWxseSB1c2luZwotdGhlIGdldEluc3RhbmNlIG1ldGhvZCBvZiBDYXRlZ29yeS4gIAotCi08cD5JdCdzIGZ1bm55IHdoZW4gSSBnZXQgYW4gZW1haWwgZnJvbSBzb21lb25lIGF0IHdvcmsgd2hvJ3MgdXNpbmcgdGhlCi10b29sa2l0IHdpdGggYSAiaXQgZGlkbid0IHdvcmsiIHF1ZXN0aW9uLCBhbmQgSSBhc2sgdGhlbSB0byBjaGVjayBvdXQKLXRoZSBsb2cuLi4gZHVlIHRvIHRoZSBjb29sbmVzcyBvZiBsb2c0aiwgdGhleSBjYW4gdHJhY2sgZG93biB0aGVpcgotbWlzdGFrZSBpbW1lZGlhdGVseS4KLQotPC9ibG9ja3F1b3RlPgotPHAgYWxpZ249cmlnaHQ+Q2hyaXN0b3BoZXIgVGF5bG9yIChjc3RheWxvciBhdCBwYWNiZWxsLm5ldCksIFNlcHRlbWJlciAybmQsIDIwMDAKLQotPGhyPjxibG9ja3F1b3RlPiAKLUkgYW0gdXNpbmcgbG9nNGogZm9yIGEgcHJvamVjdCBJIGFtIGN1cnJlbnRseSB3b3JraW5nIG9uLiBUaGUKLXNpbXBsaWNpdHkgYW5kIGVhc2Ugd2l0aCB3aGljaCBuZXcgYXBwZW5kZXJzIGNhbiBiZSB3cml0dGVuIG1ha2VzIGl0Ci1vbmUgb2YgdGhlIGJlc3QgbG9nZ2luZyBzeXN0ZW1zIEkgaGF2ZSBldmVyIHVzZWQuCi08L2Jsb2NrcXVvdGU+Ci0KLTxwICBhbGlnbj1yaWdodD4gTWFuaXNoIEJhbHNhcmEgKG1hbmlzaGIgYXQgYXVtc29mdC5jb20pIEF1Z3VzdCAyOHRoLCAyMDAwCi0KLTxocj48YmxvY2txdW90ZT4KLVRoYW5rIHlvdSBmb3Igd3JpdGluZyB0aGlzIGluY3JlZGlibHkgZWZmZWN0aXZlIHBpZWNlIG9mIHNvZnR3YXJlLiBZb3UKLWhhdmUgbWFkZSBteSBhbmQgbXkgdGVhbSdzIGxpdmVzIG11Y2ggZWFzaWVyLgotPC9ibG9ja3F1b3RlPgotCi08cCBhbGlnbj1yaWdodD5HdXkgTmlycGF6LCBKYXZhIEFyY2hpdGVjdCAoZ3V5biBhdCB0YW50aWFuLmNvbSkgQXVndXN0Ci0xNHRoLCAyMDAwCi0KLTxocj48YmxvY2txdW90ZT4KLVRoYW5rIHlvdSA8ZW0+c288L2VtPiBtdWNoIGZvciBkZXZlbG9waW5nIHN1Y2ggYQotc2xlZWsgcGFja2FnZS4gIEkgdGhpbmsgaXQncyBnb2luZyB0byBiZSBhIHBhcnQgb2YgbWFueSBvZiBteSBwcm9qZWN0cyBpbgotdGhlIGZ1dHVyZSA6KQotPC9ibG9ja3F1b3RlPgotCi08cCBhbGlnbj1yaWdodD5BbGljZSBOYWthamltYSAoYWxpY2UudC5uYWthamltYSBhdCBzYWljLmNvbSkgTWF5IDEwdGgsCi0yMDAwCi0KLQotPGhyPjxibG9ja3F1b3RlPgotVGhhbmsgeW91IHZlcnkgbXVjaCBmb3IgeW91ciBncmVhdCB3b3JrIG9uIGxvZzRqLCB3aGljaCBpcyByZWFsbHkKLXBvd2VyZnVsIGFuZCBmbGV4aWJsZSBsb2dnaW5nIHN5c3RlbS4gIExvZzRqIGlzIG5vdyBwbGF5aW5nIGFuCi1pbXBvcnRhbnQgcm9sZSBpbiBvdXIgcHJvamVjdC4KLTwvYmxvY2txdW90ZT4KLQotPHAgYWxpZ249cmlnaHQ+IFplbmcgUWlhbmcgKHplbmcucWlhbmcgYXQgZXVyb3BlbG9hbi5jb20pIEFwcmlsIDI2dGgsIDIwMDAKLQotPGhyPgotPGJsb2NrcXVvdGU+IFRoYW5rIHlvdSBhbmQgeW91ciB0ZWFtIGdpdmluZyB1cyBhIGV4Y2VsbGVudCB0b29sIHRvCi1oZWxwIHVzIHRvIGRldmVsb3Agb3VyIEphdmEgYXBwbGljYXRpb25zLiAgQWZ0ZXIgZXZhbHVhdGlvbiwgb3VyIHRlYW0KLWlzIHJlYWR5IHRvIHVzZSBsb2c0aiBhcyBvdXIgZUNhcmUgcHJvZHVjdCdzIGRpYWdub3N0aWMgc3RyYXRlZ3kuCi08L2Jsb2NrcXVvdGU+IDxwIGFsaWduPXJpZ2h0PkppYW5ibyBXYW5nIChqaXdhbmcgYXQgRGFsZWVuLmNvbSkgQXByaWwKLTI1dGgsIDIwMDAKLQotPGhyPgotPGJsb2NrcXVvdGU+IDwhLS0gT0sgLS0+Ci1XYXMgdHJ5aW5nIHRvIHVzZSB0aGUgbG9nNGogdHJhY2VyIC4uLiBncmVhdCBqb2IsIGJ5IHRoZSB3YXkgIQotCi08cD5BY3R1YWxseSBJJ20gZXZhbHVhdGluZyB0aGUgbG9nNGogcGFja2FnZSBmb3IgdXNlIGluIG91ciBjb21tZXJjaWFsCi1wcm9qZWN0cy4gV2UgaGF2ZSBvdXIgb3duIHRyYWNlciBwYWNrYWdlIHdoaWNoIGlzIGJ5IGZhciBsZXNzCi1wb3dlcmZ1bGwgYW5kIGxlc3MgY29uZmlndXJhYmxlIHRoYW4geW91cnMuCi08L2Jsb2NrcXVvdGU+IAotPHAgYWxpZ249cmlnaHQ+Sm9lcmcgUGFsbWVyIChKb2VyZy5QYWxtZXIgYXQgQ29tcGFydC5uZXQpIEFwcmlsIDE0dGgsIDIwMDAKLQotCi08aHI+Ci08YmxvY2txdW90ZT48IS0tIE9LIC0tPgotSG9vcmF5LCBsb2c0aiEgSXQncyBub3cgYWxsIG92ZXIgbXkgY3VycmVudCBwcm9qZWN0LCBhbmQgbXkgY29sbGVhZ3Vlcwotd2VyZSBwbGVhc2FudGx5IHN1cnByaXNlZCBhdCB0aGUgZWFzZSBvZiBkZWJ1Z2dpbmcuIEkgZ2F2ZSB0aGVtIG15Ci1qYXJmaWxlLCBpdCBkaWRuJ3Qgd29yaywgSSBzYWlkICJvaCwganVzdCBjaGFuZ2UgdGhpcyBjb25maWd1cmF0aW9uCi1maWxlIiBhbmQgPGVtPnByZXN0bzwvZW0+LCBsb2dnaW5nIHRvIGEgZmlsZS4gVGhleSdyZSBoYXBweS4KLTwvYmxvY2txdW90ZT4KLTxwIGFsaWduPXJpZ2h0Pk5lbHNvbiBNaW5hciBDVE8sIFBvcHVsYXIgUG93ZXIsIEluYy4gKG5lbHNvbiBhdCBwb3B1bGFycG93ZXIuY29tKSBBcHJpbCAxNHRoLCAyMDAwCi0KLTxocj4KLTxibG9ja3F1b3RlPjwhLS0gT0sgLS0+Ci1JIHJlYWxseSBkaWcgeW91ciBsb2c0aiBwYWNrYWdlLi4uIGp1c3Qgc3RhcnRlZCB1c2luZyBpdCBvbiBvdXIgbGludXgKLWFuZCBvczM5MCBib3hlcyBmb3IgdGhlIGphdmEgc2VydmxldHMgd2UgcnVuIGluIHdlYnNwaGVyZS4gIFN0aWxsCi10cnlpbmcgdG8gZ2V0IHRoZSBoYW5nIG9mIGl0IHByb3Blcmx5LCBidXQgd2hhdCBJIGRvIGhhdmUgd29ya2luZyBpcwotd29ya2luZyBncmVhdC4gIChOb3QgdG8gbWVudGlvbiB5b3VyIG1ha2VmaWxlIHR1dG9yaWFsIHdoaWNoIGhhcwotaW1wcm92ZWQgbXkgbGlmZSBzaWduaWZpY2FudGx5ISAgOi0pCi08L2Jsb2NrcXVvdGU+Ci08cCBhbGlnbj1yaWdodD5BbnRob255IChhbnQgYXQgc2FubGFtLmNvLnphKSBBcHJpbCAxM3RoLCAyMDAwCi0KLQotPGhyPjwhLS0gT0sgLS0+Ci08YmxvY2txdW90ZT4KLVRoYW5rcyBmb3IgcHJvdmlkaW5nIGxvZzRqOiBpdCdzIGEgdmVyeSB1c2VmdWwgcGFja2FnZS4gCi08L2Jsb2NrcXVvdGU+Ci08cCBhbGlnbj1yaWdodD5BbmRyZXcgSGFycmlzIChBbmRyZXcuSGFycmlzIGF0IGNhcGdlbWluaS5jby51aykgQXByaWwgMTB0aCwgMjAwMAotCi08aHI+Ci08YmxvY2txdW90ZT48IS0tIE9LIC0tPgotSSBqdXN0IHN0YXJ0ZWQgdXNpbmcgbG9nNGogdi4wLjguMS4gSXQgaXMgcXVpdGUgd2hhdCBJIHdhcyBsb29raW5nIGZvci4KLTxwPlNvIGhlcmUgaXMgbXkgPGI+IlRIQU5LICBZT1UiPC9iPiB0byBhbGwgdGhlIGNvbnRyaWJ1dG9ycy4KLUkgdGhpbmsgSSdsbCBqb2luIHRoZSBjbHViLgotPC9ibG9ja3F1b3RlPgotPHAgYWxpZ249cmlnaHQ+QXZ5IFNoYXJlbGwgKGFzaGFyZWxsIGF0IGNsdWItaW50ZXJuZXQuZnIpIE1hcmNoIDh0aCwgMjAwMAotCi0KLTxocj4KLTxibG9ja3F1b3RlPjwhLS0gT0sgLS0+Ci1JIGp1c3Qgd2FudGVkIHRvIHRoYW5rIHlvdSBmb3IgbG9nNGogd2hpY2ggaXMgYSBncmVhdCBwaWVjZSBvZiBzb2Z0d2FyZSEKLQotPHA+V2UgYXJlIHVzaW5nIGl0IGluIHRoZSBGUkVFIGUtZGVtb2NyYWN5IHByb2plY3QKLTxhIGhyZWY9Imh0dHA6Ly93d3cudGhlY291Y2gub3JnL2ZyZWUvIj5odHRwOi8vd3d3LnRoZWNvdWNoLm9yZy9mcmVlLzwvYT4gdG8gcHJvdmlkZSBhbiBlZmZlY3RpdmUgc2VjdXJpdHkgYXVkaXQKLXRyYWlsIGluIG91ciBlbGVjdHJvbmljIHZvdGluZyBzb2Z0d2FyZS4KLTwvYmxvY2txdW90ZT4KLTxwIGFsaWduPXJpZ2h0PiBKYXNvbiBLaXRjYXQgKGplZXAgYXQgdGhlY291Y2gub3JnKSBNYXJjaCAyOXRoLCAyMDAwIAotCi0KLTxocj4KLTxibG9ja3F1b3RlPgotVGhhbmtzIGZvciBtYWtpbmcgbG9nNGogYXZhaWxhYmxlLgotSSBsaWtlIHRoZSBjaGFuZ2VzIGluIHYwLjggYW5kIGFtIHVzaW5nIGl0IGluIGFsbCBteSBqYXZhIHByb2plY3RzLgotPC9ibG9ja3F1b3RlPgotPHAgYWxpZ249cmlnaHQ+U3RldmVuIE1hcmN1cyAoc3JubSBhdCBhd2FyZXRlY2hub2xvZ2llcy5jb20pIEZlYnJ1YXJ5IDE5dGgsIDIwMDAKLQotPGhyPgotPGJsb2NrcXVvdGU+PCEtLSBPSyAtLT4KLUZpcnN0IGNvbmdyYXR1bGF0aW9uIGZvciB5b3VyIGdyZWF0IGpvYiBvbiB0aGUgTG9nIG1lY2hhbmlzbSBsb2c0aiwKLWl0J3MgcmVhbGx5IHZhbHVhYmxlLgotPC9ibG9ja3F1b3RlPgotPHAgYWxpZ249cmlnaHQ+U2ViYXN0aWVuIFNhaHVjIChzc2FodWMgYXQgaW1lZGlhdGlvbi5jb20pIEphbnVhcnkgNHRoLCAyMDAwCi0KLQotPGhyPiA8YmxvY2txdW90ZT4gSnVzdCBhIGZldyByZW1hcmtzIHRvIHlvdXIgbG9nNGogTG9nZ2luZy1Ub29sLiBGaXJzdAotb2YgYWxsLCBpbiBteSBvcGluaW9uLCBpdCBpcyBleGFjdGx5IHdoYXQgbWFueSBKYXZhIHByb2dyYW1tZXJzIG5lZWQ6Ci1BIHNtYWxsIGJ1dCB2ZXJ5IHVzZWZ1bCB0b29sIGNvbXBsZW1lbnRpbmcgdGhlIGRlYnVnZ2VyIDstKSBUaGUgbG9ncwotaGVscCBtZSB0byBkZWJ1ZyByZXN1bHRzIGdlbmVyYXRlZCBvbiBhIGRpc3RhbnQgY2xpZW50LiAgPHAKLWFsaWduPXJpZ2h0PkplbnMgVXdlIFBpcGthIChqZW5zLnBpcGthIGF0IGdteC5kZSkgT2N0b2JlciAyNXRoLCAxOTk5Ci0KLTxocj4KLTwvYm9keT4gPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvTXlQYXR0ZXJuTGF5b3V0LmphdmEgYi9leGFtcGxlcy9NeVBhdHRlcm5MYXlvdXQuamF2YQppbmRleCBlYmExNzg3Li45MTE2ODY0IDEwMDY0NAotLS0gYS9leGFtcGxlcy9NeVBhdHRlcm5MYXlvdXQuamF2YQorKysgYi9leGFtcGxlcy9NeVBhdHRlcm5MYXlvdXQuamF2YQpAQCAtNDYsOSArNDYsOSBAQAogICBwdWJsaWMKICAgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgTGF5b3V0IGxheW91dCA9IG5ldyBNeVBhdHRlcm5MYXlvdXQoIltjb3VudGVyPSUuMTAjXSAtICVtJW4iKTsKLSAgICBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZSgic29tZS5jYXQiKTsKLSAgICBjYXQuYWRkQXBwZW5kZXIobmV3IENvbnNvbGVBcHBlbmRlcihsYXlvdXQsIENvbnNvbGVBcHBlbmRlci5TWVNURU1fT1VUKSk7Ci0gICAgY2F0LmRlYnVnKCJIZWxsbywgbG9nIik7Ci0gICAgY2F0LmluZm8oIkhlbGxvIGFnYWluLi4uIik7ICAgIAorICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJzb21lLmNhdCIpOworICAgIGxvZ2dlci5hZGRBcHBlbmRlcihuZXcgQ29uc29sZUFwcGVuZGVyKGxheW91dCwgQ29uc29sZUFwcGVuZGVyLlNZU1RFTV9PVVQpKTsKKyAgICBsb2dnZXIuZGVidWcoIkhlbGxvLCBsb2ciKTsKKyAgICBsb2dnZXIuaW5mbygiSGVsbG8gYWdhaW4uLi4iKTsgICAgCiAgIH0KIH0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL051bWJlckNydW5jaGVyU2VydmVyLmphdmEgYi9leGFtcGxlcy9OdW1iZXJDcnVuY2hlclNlcnZlci5qYXZhCmluZGV4IGQyZWVjNzQuLmE1ZGRlMjIgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL051bWJlckNydW5jaGVyU2VydmVyLmphdmEKKysrIGIvZXhhbXBsZXMvTnVtYmVyQ3J1bmNoZXJTZXJ2ZXIuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIAotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5OREM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKIApAQCAtNTQsOCArNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgIE51bWJlckNydW5jaGVyIHsKIAogCi0gIHN0YXRpYyBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZSgKLQkJCQkJTnVtYmVyQ3J1bmNoZXJTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE51bWJlckNydW5jaGVyU2VydmVyLmNsYXNzKTsKIAogICBwdWJsaWMKICAgTnVtYmVyQ3J1bmNoZXJTZXJ2ZXIoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKQEAgLTc5LDcgKzc4LDcgQEAKICAgICAvLyBjb250YWluZWQgaW4gY29va2llcy4KICAgICBOREMucHVzaChTdHJpbmcudmFsdWVPZihudW1iZXIpKTsgICAgCiAKLSAgICBjYXQuaW5mbygiQmVnaW5uaW5nIHRvIGZhY3Rvci4iKTsKKyAgICBsb2dnZXIuaW5mbygiQmVnaW5uaW5nIHRvIGZhY3Rvci4iKTsKICAgICBpZihudW1iZXIgPD0gMCkgewogICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihudW1iZXIrIiBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOwogICAgIH0KQEAgLTkzLDEwICs5MiwxMCBAQAogICAgICAgLy8gSXQgaXMgYmFkIHByYWN0aWNlIHRvIHBsYWNlIGxvZyByZXF1ZXN0cyB3aXRoaW4gdGlnaHQgbG9vcHMuCiAgICAgICAvLyBJdCBpcyBkb25lIGhlcmUgdG8gc2hvdyBpbnRlcmxlYXZlZCBsb2cgb3V0cHV0IGZyb20KICAgICAgIC8vIGRpZmZlcmVudCByZXF1ZXN0cy4gCi0gICAgICBjYXQuZGVidWcoIlRyeWluZyB0byBzZWUgaWYgIiArIGkgKyAiIGlzIGEgZmFjdG9yLiIpOworICAgICAgbG9nZ2VyLmRlYnVnKCJUcnlpbmcgdG8gc2VlIGlmICIgKyBpICsgIiBpcyBhIGZhY3Rvci4iKTsKIAogICAgICAgaWYoKG4gJSBpKSA9PSAwKSB7Ci0JY2F0LmluZm8oIkZvdW5kIGZhY3RvciAiK2kpOworCWxvZ2dlci5pbmZvKCJGb3VuZCBmYWN0b3IgIitpKTsKIAlmYWN0b3JzLmFkZEVsZW1lbnQobmV3IEludGVnZXIoaSkpOwogCWRvIHsKIAkgIG4gLz0gaTsKQEAgLTEwOCw3ICsxMDcsNyBAQAogICAgIH0KIAogICAgIGlmKG4gIT0gMSkgewotICAgICAgY2F0LmluZm8oIkZvdW5kIGZhY3RvciAiK24pOworICAgICAgbG9nZ2VyLmluZm8oIkZvdW5kIGZhY3RvciAiK24pOwogICAgICAgZmFjdG9ycy5hZGRFbGVtZW50KG5ldyBJbnRlZ2VyKG4pKTsKICAgICB9CiAgICAgCkBAIC0xNTMsMTAgKzE1MiwxMCBAQAogICAgIHRyeSB7CiAgICAgICBuY3MgPSBuZXcgTnVtYmVyQ3J1bmNoZXJTZXJ2ZXIoKTsKICAgICAgIE5hbWluZy5yZWJpbmQoIkZhY3RvciIsIG5jcyk7Ci0gICAgICBjYXQuaW5mbygiTnVtYmVyQ3J1bmNoZXJTZXJ2ZXIgYm91bmQgYW5kIHJlYWR5IHRvIHNlcnZlLiIpOworICAgICAgbG9nZ2VyLmluZm8oIk51bWJlckNydW5jaGVyU2VydmVyIGJvdW5kIGFuZCByZWFkeSB0byBzZXJ2ZS4iKTsKICAgICB9CiAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgIGNhdC5lcnJvcigiQ291bGQgbm90IGJpbmQgTnVtYmVyQ3J1bmNoZXJTZXJ2ZXIuIiwgZSk7CisgICAgICBsb2dnZXIuZXJyb3IoIkNvdWxkIG5vdCBiaW5kIE51bWJlckNydW5jaGVyU2VydmVyLiIsIGUpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBOdW1iZXJDcnVuY2hlckNsaWVudC5sb29wKG5jcyk7ICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvU29ydEFsZ28uamF2YSBiL2V4YW1wbGVzL1NvcnRBbGdvLmphdmEKaW5kZXggYTVhM2Y1My4uOThhNGIwNCAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvU29ydEFsZ28uamF2YQorKysgYi9leGFtcGxlcy9Tb3J0QWxnby5qYXZhCkBAIC0xLDcgKzEsNyBAQAogCiBwYWNrYWdlIGV4YW1wbGVzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLk5EQzsKIAogLyoqCkBAIC0xNiwxMSArMTYsMTEgQEAKIHB1YmxpYyBjbGFzcyBTb3J0QWxnbyB7CiAKICAgZmluYWwgc3RhdGljIFN0cmluZyBjbGFzc05hbWUgPSBTb3J0QWxnby5jbGFzcy5nZXROYW1lKCk7Ci0gIGZpbmFsIHN0YXRpYyBDYXRlZ29yeSBDQVQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShjbGFzc05hbWUpOwotICBmaW5hbCBzdGF0aWMgQ2F0ZWdvcnkgT1VURVIgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShjbGFzc05hbWUgKyAiLk9VVEVSIik7Ci0gIGZpbmFsIHN0YXRpYyBDYXRlZ29yeSBJTk5FUiA9IENhdGVnb3J5LmdldEluc3RhbmNlKGNsYXNzTmFtZSArICIuSU5ORVIiKTsKLSAgZmluYWwgc3RhdGljIENhdGVnb3J5IERVTVAgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShjbGFzc05hbWUgKyAiLkRVTVAiKTsKLSAgZmluYWwgc3RhdGljIENhdGVnb3J5IFNXQVAgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShjbGFzc05hbWUgKyAiLlNXQVAiKTsKKyAgZmluYWwgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKGNsYXNzTmFtZSk7CisgIGZpbmFsIHN0YXRpYyBMb2dnZXIgT1VURVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGNsYXNzTmFtZSArICIuT1VURVIiKTsKKyAgZmluYWwgc3RhdGljIExvZ2dlciBJTk5FUiA9IExvZ2dlci5nZXRMb2dnZXIoY2xhc3NOYW1lICsgIi5JTk5FUiIpOworICBmaW5hbCBzdGF0aWMgTG9nZ2VyIERVTVAgPSBMb2dnZXIuZ2V0TG9nZ2VyKGNsYXNzTmFtZSArICIuRFVNUCIpOworICBmaW5hbCBzdGF0aWMgTG9nZ2VyIFNXQVAgPSBMb2dnZXIuZ2V0TG9nZ2VyKGNsYXNzTmFtZSArICIuU1dBUCIpOwogCiAgIGludFtdIGludEFycmF5OwogCkBAIC0yOSw3ICsyOSw3IEBACiAgIH0KICAgICAKICAgdm9pZCBidWJibGVTb3J0KCkgewotICAgIENBVC5pbmZvKCAiRW50ZXJlZCB0aGUgc29ydCBtZXRob2QuIik7CisgICAgTE9HLmluZm8oICJFbnRlcmVkIHRoZSBzb3J0IG1ldGhvZC4iKTsKIAogICAgIGZvcihpbnQgaSA9IGludEFycmF5Lmxlbmd0aCAtMTsgaSA+PSAwICA7IGktLSkgewogICAgICAgTkRDLnB1c2goImk9IiArIGkpOwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvVHJpdmlhbC5qYXZhIGIvZXhhbXBsZXMvVHJpdmlhbC5qYXZhCmluZGV4IDBmOTcwNTYuLjliZTQ1MmQgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL1RyaXZpYWwuamF2YQorKysgYi9leGFtcGxlcy9Ucml2aWFsLmphdmEKQEAgLTIsNyArMiw3IEBACiBwYWNrYWdlIGV4YW1wbGVzOwogCiAKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5OREM7CiAKQEAgLTMzLDMxICszMywzMSBAQAogICovCiBwdWJsaWMgY2xhc3MgVHJpdmlhbCB7CiAKLSAgc3RhdGljIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKFRyaXZpYWwuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRyaXZpYWwuY2xhc3MpOwogCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKICAgICBOREMucHVzaCgiQ2xpZW50ICM0NTg5MCIpOyAKIAotICAgIGNhdC5pbmZvKCJBd2FrZSBhd2FrZS4gUHV0IG9uIHRoeSBzdHJlbmd0aC4iKTsKKyAgICBsb2dnZXIuaW5mbygiQXdha2UgYXdha2UuIFB1dCBvbiB0aHkgc3RyZW5ndGguIik7CiAgICAgVHJpdmlhbC5mb28oKTsKICAgICBJbm5lclRyaXZpYWwuZm9vKCk7Ci0gICAgY2F0LmluZm8oIkV4aXRpbmcgVHJpdmlhbC4iKTsgICAgCisgICAgbG9nZ2VyLmluZm8oIkV4aXRpbmcgVHJpdmlhbC4iKTsgICAgCiAgIH0KIAogICBzdGF0aWMKICAgdm9pZCBmb28oKSB7CiAgICAgTkRDLnB1c2goIkRCIik7IAotICAgIGNhdC5kZWJ1ZygiTm93IGtpbmcgRGF2aWQgd2FzIG9sZC4iKTsgICAgCisgICAgbG9nZ2VyLmRlYnVnKCJOb3cga2luZyBEYXZpZCB3YXMgb2xkLiIpOyAgICAKICAgICBOREMucG9wKCk7IAogICB9CiAKICAgc3RhdGljIGNsYXNzIElubmVyVHJpdmlhbCB7Ci0gICAgc3RhdGljICBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShJbm5lclRyaXZpYWwuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBzdGF0aWMgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKElubmVyVHJpdmlhbC5jbGFzcyk7CiAKICAgICBzdGF0aWMgICAgCiAgICAgdm9pZCBmb28oKSB7Ci0gICAgICBjYXQuaW5mbygiRW50ZXJlZCBmb28uIik7IAorICAgICAgbG9nZ2VyLmluZm8oIkVudGVyZWQgZm9vLiIpOyAKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdEZWZhdWx0Q29uZmlndXJhdG9yL0luaXRVc2luZ0RlZmF1bHRDb25maWd1cmF0b3IuamF2YSBiL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdEZWZhdWx0Q29uZmlndXJhdG9yL0luaXRVc2luZ0RlZmF1bHRDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg5MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbGY1L0luaXRVc2luZ0RlZmF1bHRDb25maWd1cmF0b3IvSW5pdFVzaW5nRGVmYXVsdENvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4KKyAqLworcGFja2FnZSBleGFtcGxlcy5sZjUuSW5pdFVzaW5nRGVmYXVsdENvbmZpZ3VyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTkRDOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LkRlZmF1bHRMRjVDb25maWd1cmF0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gY29uZmlndXJlIHRoZSBMb2dGYWN0b3I1CisgKiBsb2dnaW5nIHdpbmRvdyB1c2luZyB0aGUgRGVmYXVsdExGNUNvbmZpZ3VyYXRvci4KKyAqCisgKiBUaGUgRGVmYXVsdExGNUNvbmZpZ3VyYXRvciB1c2VzIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZpbGUgc3RvcmVkCisgKiBpbiB0aGUgbG9nNGouamFyIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yCisgKiB0aGUgTEY1QXBwZW5kZXIuCisgKgorICogQGF1dGhvciBCcmVudCBTcHJlY2hlcgorICovCisKKy8vIENvbnRyaWJ1dGVkIGJ5IFRob3VnaHRXb3JrcyBJbmMuCisKK3B1YmxpYyBjbGFzcyBJbml0VXNpbmdEZWZhdWx0Q29uZmlndXJhdG9yIHsKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBDb25zdGFudHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJvdGVjdGVkIFZhcmlhYmxlczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQcml2YXRlIFZhcmlhYmxlczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEluaXRVc2luZ0RlZmF1bHRDb25maWd1cmF0b3IuY2xhc3MpOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgQ29uc3RydWN0b3JzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFB1YmxpYyBNZXRob2RzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgTEY1QXBwZW5kZXIgdXNpbmcgdGhlIERlZmF1bHRMRjVDb25maWd1cmF0b3IuICBUaGlzCisgICAgICAgIC8vIHdpbGwgYWRkIHRoZSBMRjVBcHBlbmRlciB0byB0aGUgcm9vdCBvZiB0aGUgQ2F0ZWdvcnkgdHJlZS4KKyAgICAgICAgRGVmYXVsdExGNUNvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKKworICAgICAgICAvLyBBZGQgYW4gTkRDIHRvIGRlbW9uc3RyYXRlIGhvdyBOREMgaW5mb3JtYXRpb24gaXMgb3V0cHV0LgorICAgICAgICBOREMucHVzaCgiIzIzODU2Iik7CisgICAgICAgIC8vIExvZyBzb21lIGluZm9ybWF0aW9uLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgSG9tZXIgU2ltcHNvbi4iKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNbW1tbW0gLi4uLiBDaG9jb2xhdGUuIik7CisgICAgICAgICAgICBsb2dnZXIud2FybigiTW1tLi4uZm9yYmlkZGVuIGRvbnV0LiIpOworICAgICAgICB9CisgICAgICAgIC8vIENsZWFuIHVwIE5EQworICAgICAgICBOREMucG9wKCk7CisgICAgICAgIE5EQy5yZW1vdmUoKTsKKworICAgICAgICBOREMucHVzaCgiQW5vdGhlciBOREMiKTsKKyAgICAgICAgLy8gTG9nIHNvbWUgaW5mb3JtYXRpb24uCisgICAgICAgIGxvZ2dlci5mYXRhbCgiSGVsbG8sIG15IG5hbWUgaXMgQmFydCBTaW1wc29uLiIpOworICAgICAgICBsb2dnZXIuZXJyb3IoIkhpIGRpZGRseSBobyBnb29kIG5laWdoYm91ci4iKTsKKyAgICAgICAgLy8gQ2xlYW4gdXAgTkRDCisgICAgICAgIE5EQy5wb3AoKTsKKyAgICAgICAgTkRDLnJlbW92ZSgpOworCisgICAgICAgIC8vIENhbGwgbWV0aG9kcyBvbiBib3RoIGNsYXNzZXMuCisgICAgICAgIEluaXRVc2luZ0RlZmF1bHRDb25maWd1cmF0b3IuZm9vKCk7CisgICAgICAgIElubmVySW5pdFVzaW5nRGVmYXVsdENvbmZpZ3VyYXRvci5mb28oKTsKKworICAgICAgICBsb2dnZXIuaW5mbygiRXhpdGluZyBJbml0VXNpbmdEZWZhdWx0Q29uZmlndXJhdG9yLiIpOworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvbygpIHsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJFbnRlcmVkIGZvbyBpbiBJbml0VXNpbmdEZWZhdWx0Q29uZmlndXJhdG9yIGNsYXNzIik7CisKKyAgICAgICAgTkRDLnB1c2goIiMxMjM0NTYiKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJIZWxsbywgbXkgbmFtZSBpcyBNYXJnZSBTaW1wc29uLiIpOworICAgICAgICBsb2dnZXIuaW5mbygiRCdvaCEhIEEgZGVlciEgQSBmZW1hbGUgZGVlci4iKTsKKyAgICAgICAgLy8gQ2xlYW4gdXAgTkRDCisgICAgICAgIE5EQy5wb3AoKTsKKyAgICAgICAgTkRDLnJlbW92ZSgpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFByb3RlY3RlZCBNZXRob2RzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFByaXZhdGUgTWV0aG9kczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBOZXN0ZWQgVG9wLUxldmVsIENsYXNzZXMgb3IgSW50ZXJmYWNlczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElubmVySW5pdFVzaW5nRGVmYXVsdENvbmZpZ3VyYXRvciB7CisgICAgICAgIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKElubmVySW5pdFVzaW5nRGVmYXVsdENvbmZpZ3VyYXRvci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIHN0YXRpYyB2b2lkIGZvbygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBDb25maWd1cmUgdGhlIExGNUFwcGVuZGVyIGFnYWluLiBZb3UgY2FuIGNhbGwKKyAgICAgICAgICAgIC8vIERlZmF1bHRMRjVDb25maWd1cmF0b3IuY29uZmlndXJlKCkgYXMgb2Z0ZW4gYXMgeW91IHdhbnQKKyAgICAgICAgICAgIC8vIHdpdGhvdXQgdW5leHBlY3RlZCBiZWhhdmlvci4KKyAgICAgICAgICAgIERlZmF1bHRMRjVDb25maWd1cmF0b3IuY29uZmlndXJlKCk7CisKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJFbnRlcmVkIGZvbyBpbiBJbm5lckluaXRVc2luZ0RlZmF1bHRDb25maWd1cmF0b3IgY2xhc3MuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGY1L0luaXRVc2luZ0xvZzRKUHJvcGVydGllcy9Jbml0VXNpbmdMb2c0SlByb3BlcnRpZXMuamF2YSBiL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdMb2c0SlByb3BlcnRpZXMvSW5pdFVzaW5nTG9nNEpQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3OWQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdMb2c0SlByb3BlcnRpZXMvSW5pdFVzaW5nTG9nNEpQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQorICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLgorICovCitwYWNrYWdlIGV4YW1wbGVzLmxmNS5Jbml0VXNpbmdMb2c0SlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIExvZ0ZhY3RvcjUgbG9nZ2luZworICogd2luZG93LgorICoKKyAqIFRoZSBMRjVBcHBlbmRlciBpcyB0aGUgcHJpbWFyeSBjbGFzcyB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byB0aGUKKyAqIExvZ0ZhY3RvcjUgbG9nZ2luZyB3aW5kb3cuIFRoZSBzaW1wbGVzdCBtZXRob2Qgb2YgdXNpbmcgdGhpcyBBcHBlbmRlcgorICogaXMgdG8gYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB5b3VyIGxvZzRqLnByb3BlcnRpZXMgZmlsZToKKyAqCisgKiAgICBsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLmxmNS5MRjVBcHBlbmRlcgorICoKKyAqIFRoZSBsb2c0ai5wcm9wZXJ0aWVzIGZpbGUgTVVTVCBiZSBpbiB5b3Ugc3lzdGVtIGNsYXNzcGF0aC4gSWYgdGhpcyBmaWxlCisgKiBpcyBpbiB5b3VyIHN5c3RlbSBjbGFzc3BhdGgsIGEgc3RhdGljIGluaXRpYWxpemVyIGluIHRoZSBDYXRlZ29yeSBjbGFzcworICogd2lsbCBsb2FkIHRoZSBmaWxlIGR1cmluZyBjbGFzcyBpbml0aWFsaXphdGlvbi4gVGhlIExGNUFwcGVuZGVyIHdpbGwgYmUKKyAqIGFkZGVkIHRvIHRoZSByb290IGNhdGVnb3J5IG9mIHRoZSBDYXRlZ29yeSB0cmVlLgorICoKKyAqIENyZWF0ZSBhIGxvZzRqLnByb3BlcnRpZXMgZmlsZSBhbmQgYWRkIHRoaXMgbGluZSB0byBpdCwgb3IgYWRkIHRoaXMgbGluZQorICogdG8geW91ciBleGlzdGluZyBsb2c0ai5wcm9wZXJ0aWVzIGZpbGUuIFJ1biB0aGUgZXhhbXBsZSBhdCB0aGUgY29tbWFuZCBsaW5lCisgKiBhbmQgZXhwbG9yZSB0aGUgcmVzdWx0cyEKKyAqCisgKiBAYXV0aG9yIEJyZW50IFNwcmVjaGVyCisgKi8KKworLy8gQ29udHJpYnV0ZWQgYnkgVGhvdWdodFdvcmtzIEluYy4KKworcHVibGljIGNsYXNzIEluaXRVc2luZ0xvZzRKUHJvcGVydGllcyB7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgQ29uc3RhbnRzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFByb3RlY3RlZCBWYXJpYWJsZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJpdmF0ZSBWYXJpYWJsZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEluaXRVc2luZ0xvZzRKUHJvcGVydGllcy5jbGFzcyk7CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBDb25zdHJ1Y3RvcnM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHVibGljIE1ldGhvZHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgeworICAgICAgICAvLyBBZGQgYSBidW5jaCBvZiBsb2dnaW5nIHN0YXRlbWVudHMgLi4uCisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgSG9tZXIgU2ltcHNvbi4iKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJIZWxsbywgbXkgbmFtZSBpcyBMaXNhIFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgTWFyZ2UgU2ltcHNvbi4iKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJIZWxsbywgbXkgbmFtZSBpcyBCYXJ0IFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgTWFnZ2llIFNpbXBzb24uIik7CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIldlIGFyZSB0aGUgU2ltcHNvbnMhIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJNbW1tbW0gLi4uLiBDaG9jb2xhdGUuIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJIb21lciBsaWtlcyBjaG9jb2xhdGUiKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRvaCEiKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIldlIGFyZSB0aGUgU2ltcHNvbnMhIik7CisKKyAgICAgICAgbG9nZ2VyLndhcm4oIkJhcnQ6IEkgYW0gdGhyb3VnaCB3aXRoIHdvcmtpbmchIFdvcmtpbmcgaXMgZm9yIGNodW1wcyEiICsKKyAgICAgICAgICAgICAgICAiSG9tZXI6IFNvbiwgSSdtIHByb3VkIG9mIHlvdS4gSSB3YXMgdHdpY2UgeW91ciBhZ2UgYmVmb3JlICIgKworICAgICAgICAgICAgICAgICJJIGZpZ3VyZWQgdGhhdCBvdXQuIik7CisgICAgICAgIGxvZ2dlci53YXJuKCJNbW0uLi5mb3JiaWRkZW4gZG9udXQuIik7CisgICAgICAgIGxvZ2dlci53YXJuKCJEJ29oISBBIGRlZXIhIEEgZmVtYWxlIGRlZXIhIik7CisgICAgICAgIGxvZ2dlci53YXJuKCJUcnVseSwgeW91cnMgaXMgYSBidXR0IHRoYXQgd29uJ3QgcXVpdC4iICsKKyAgICAgICAgICAgICAgICAiLSBCYXJ0LCB3cml0aW5nIGFzIFdvb2Ryb3cgdG8gTXMuIEtyYWJhcHBlbC4iKTsKKworICAgICAgICBsb2dnZXIuZXJyb3IoIkRlYXIgQmFieSwgV2VsY29tZSB0byBEdW1wc3ZpbGxlLiBQb3B1bGF0aW9uOiB5b3UuIik7CisgICAgICAgIGxvZ2dlci5lcnJvcigiRGVhciBCYWJ5LCBXZWxjb21lIHRvIER1bXBzdmlsbGUuIFBvcHVsYXRpb246IHlvdS4iLAorICAgICAgICAgICAgICAgIG5ldyBJT0V4Y2VwdGlvbigiRHVtcHN2aWxsZSwgVVNBIikpOworICAgICAgICBsb2dnZXIuZXJyb3IoIk1yLiBIdXR6LCBhcmUgeW91IGF3YXJlIHlvdSdyZSBub3Qgd2VhcmluZyBwYW50cz8iKTsKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJNci4gSHV0eiwgYXJlIHlvdSBhd2FyZSB5b3UncmUgbm90IHdlYXJpbmcgcGFudHM/IiwKKyAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFcnJvciAhISIpKTsKKworCisgICAgICAgIGxvZ2dlci5mYXRhbCgiRWVwLiIpOworICAgICAgICBsb2dnZXIuZmF0YWwoIk1tbS4uLmZvcmJpZGRlbiBkb251dC4iLAorICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiRmF0YWwgRXhjZXB0aW9uIikpOworICAgICAgICBsb2dnZXIuZmF0YWwoIkQnb2ghIEEgZGVlciEgQSBmZW1hbGUgZGVlciEiKTsKKyAgICAgICAgbG9nZ2VyLmZhdGFsKCJNbW1tbW0gLi4uLiBDaG9jb2xhdGUuIiwKKyAgICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkZhdGFsIEV4Y2VwdGlvbiIpKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQcm90ZWN0ZWQgTWV0aG9kczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQcml2YXRlIE1ldGhvZHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgTmVzdGVkIFRvcC1MZXZlbCBDbGFzc2VzIG9yIEludGVyZmFjZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9sZjUvSW5pdFVzaW5nTG9nNEpQcm9wZXJ0aWVzL2xvZzRqLnByb3BlcnRpZXMgYi9leGFtcGxlcy9sZjUvSW5pdFVzaW5nTG9nNEpQcm9wZXJ0aWVzL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiNTRiNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdMb2c0SlByb3BlcnRpZXMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDE3IEBACisjIEZvciB0aGUgZ2VuZXJhbCBzeW50YXggb2YgcHJvcGVydHkgYmFzZWQgY29uZmlndXJhdGlvbiBmaWxlcyBzZWUgdGhlCisjIGRvY3VtZW5hdGlvbiBvZiBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yLgorCisjIFRoZSByb290IGNhdGVnb3J5IHVzZXMgdGhlIGFwcGVuZGVyIGNhbGxlZCBBMS4gU2luY2Ugbm8gcHJpb3JpdHkgaXMKKyMgc3BlY2lmaWVkLCB0aGUgcm9vdCBjYXRlZ29yeSBhc3N1bWVzIHRoZSBkZWZhdWx0IHByaW9yaXR5IGZvciByb290CisjIHdoaWNoIGlzIERFQlVHIGluIGxvZzRqLiBUaGUgcm9vdCBjYXRlZ29yeSBpcyB0aGUgb25seSBjYXRlZ29yeSB0aGF0CisjIGhhcyBhIGRlZmF1bHQgcHJpb3JpdHkuIEFsbCBvdGhlciBjYXRlZ29yaWVzIG5lZWQgbm90IGJlIGFzc2lnbmVkIGEKKyMgcHJpb3JpdHkgaW4gd2hpY2ggY2FzZSB0aGV5IGluaGVyaXQgdGhlaXIgcHJpb3JpdHkgZnJvbSB0aGUKKyMgaGllcmFyY2h5LgorCitsb2c0ai5yb290Q2F0ZWdvcnk9LCBBMQorCisjIEExIGlzIHNldCB0byBiZSBhIExGNUFwcGVuZGVyIHdoaWNoIG91dHB1dHMgdG8gYSBzd2luZworIyBsb2dnaW5nIGNvbnNvbGUuIAorICAKK2xvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGoubGY1LkxGNUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5BMS5NYXhOdW1iZXJPZlJlY29yZHM9MTAwMApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGY1L0luaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzL0luaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmEgYi9leGFtcGxlcy9sZjUvSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMvSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q3YTMxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbGY1L0luaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzL0luaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQorICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLgorICovCitwYWNrYWdlIGV4YW1wbGVzLmxmNS5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVyczsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJvcGVydHlDb25maWd1cmF0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBMb2dGYWN0b3I1IHdpdGggb3RoZXIgTG9nNEogYXBwZW5kZXJzCisgKiAoSW4gdGhpcyBjYXNlIHRoZSBSb2xsaW5nRmlsZUFwcGVuZGVyKS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGxpbmVzIGNhbiBiZSBhZGRlZCB0byB0aGUgbG9nNGoucHJvcGVydGllcyBmaWxlIG9yIGEKKyAqIHN0YW5kYXJkIEphdmEgcHJvcGVydGllcyBmaWxlLgorICoKKyAqICAgIyBUd28gYXBwZW5kZXJzIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIHJvb3Qgb2YgdGhlIENhdGVnb3J5IHRyZWUuCisgKgorICogICBsb2c0ai5yb290Q2F0ZWdvcnk9LCBBMSwgUgorICoKKyAqICAgIyBBMSBpcyBzZXQgdG8gYmUgYSBMRjVBcHBlbmRlciB3aGljaCBvdXRwdXRzIHRvIGEgc3dpbmcKKyAqICAgIyBsb2dnaW5nIGNvbnNvbGUuCisgKgorICogICBsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLmxmNS5MRjVBcHBlbmRlcgorICoKKyAqICAgIyBSIGlzIHRoZSBSb2xsaW5nRmlsZUFwcGVuZGVyIHRoYXQgb3V0cHV0cyB0byBhIHJvbGxpbmcgbG9nCisgKiAgICMgZmlsZSBjYWxsZWQgcm9sbGluZ19sb2dfZmlsZS5sb2cuCisgKgorICogbG9nNGouYXBwZW5kZXIuUj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXIKKyAqIGxvZzRqLmFwcGVuZGVyLlIuRmlsZT1yb2xsaW5nX2xvZ19maWxlLmxvZworICoKKyAqIGxvZzRqLmFwcGVuZGVyLlIubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorICogbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49RGF0ZSAtICVke0RBVEV9JW5Qcmlvcml0eQorICogLSAlcCVuVGhyZWFkIC0gJXQlbkNhdGVnb3J5IC0gJWMlbkxvY2F0aW9uIC0gJWwlbk1lc3NhZ2UgLSAlbSVuJW4KKyAqIGxvZzRqLmFwcGVuZGVyLlIuTWF4RmlsZVNpemU9MTAwS0IKKyAqIGxvZzRqLmFwcGVuZGVyLlIuTWF4QmFja3VwSW5kZXg9MQorICoKKyAqIFRvIG1ha2UgdGhpcyBleGFtcGxlIHdvcmssIGVpdGhlciBydW4gdGhlIEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmJhdAorICogZmlsZSBsb2NhdGVkIGluIHRoZSBleGFtcGxlcyBmb2xkZXIgb3IgcnVuIGl0IGF0IHRoZSBjb21tYW5kIGxpbmUuIElmIHlvdQorICogYXJlIHJ1bm5pbmcgdGhlIGV4YW1wbGUgYXQgdGhlIGNvbW1hbmQgbGluZSwgeW91IG11c3QgZW5zdXJlIHRoYXQgdGhlCisgKiBleGFtcGxlLnByb3BlcnRpZXMgZmlsZSBpcyBpbiB5b3VyIGNsYXNzcGF0aC4KKyAqCisgKiBAYXV0aG9yIEJyZW50IFNwcmVjaGVyCisgKiBAYXV0aG9yIEJyYWQgTWFybGJvcm91Z2gKKyAqLworCisvLyBDb250cmlidXRlZCBieSBUaG91Z2h0V29ya3MgSW5jLgorCitwdWJsaWMgY2xhc3MgSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMgeworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgQ29uc3RhbnRzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFByb3RlY3RlZCBWYXJpYWJsZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJpdmF0ZSBWYXJpYWJsZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmNsYXNzKTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIENvbnN0cnVjdG9yczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQdWJsaWMgTWV0aG9kczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7CisgICAgICAgIC8vIFVzZSBhIFByb3BlcnR5Q29uZmlndXJhdG9yIHRvIGluaXRpYWxpemUgZnJvbSBhIHByb3BlcnR5IGZpbGUuCisgICAgICAgIFN0cmluZyByZXNvdXJjZSA9CisgICAgICAgICAgICAgICAgIi9leGFtcGxlcy9sZjUvSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMvZXhhbXBsZS5wcm9wZXJ0aWVzIjsKKyAgICAgICAgVVJMIGNvbmZpZ0ZpbGVSZXNvdXJjZSA9CisgICAgICAgICAgICAgICAgSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuY2xhc3MuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICBQcm9wZXJ0eUNvbmZpZ3VyYXRvci5jb25maWd1cmUoY29uZmlnRmlsZVJlc291cmNlKTsKKworICAgICAgICAvLyBBZGQgYSBidW5jaCBvZiBsb2dnaW5nIHN0YXRlbWVudHMgLi4uCisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgSG9tZXIgU2ltcHNvbi4iKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJIZWxsbywgbXkgbmFtZSBpcyBMaXNhIFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgTWFyZ2UgU2ltcHNvbi4iKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJIZWxsbywgbXkgbmFtZSBpcyBCYXJ0IFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgTWFnZ2llIFNpbXBzb24uIik7CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIldlIGFyZSB0aGUgU2ltcHNvbnMhIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJNbW1tbW0gLi4uLiBDaG9jb2xhdGUuIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJIb21lciBsaWtlcyBjaG9jb2xhdGUiKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRvaCEiKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIldlIGFyZSB0aGUgU2ltcHNvbnMhIik7CisKKyAgICAgICAgbG9nZ2VyLndhcm4oIkJhcnQ6IEkgYW0gdGhyb3VnaCB3aXRoIHdvcmtpbmchIFdvcmtpbmcgaXMgZm9yIGNodW1wcyEiICsKKyAgICAgICAgICAgICAgICAiSG9tZXI6IFNvbiwgSSdtIHByb3VkIG9mIHlvdS4gSSB3YXMgdHdpY2UgeW91ciBhZ2UgYmVmb3JlICIgKworICAgICAgICAgICAgICAgICJJIGZpZ3VyZWQgdGhhdCBvdXQuIik7CisgICAgICAgIGxvZ2dlci53YXJuKCJNbW0uLi5mb3JiaWRkZW4gZG9udXQuIik7CisgICAgICAgIGxvZ2dlci53YXJuKCJEJ29oISBBIGRlZXIhIEEgZmVtYWxlIGRlZXIhIik7CisgICAgICAgIGxvZ2dlci53YXJuKCJUcnVseSwgeW91cnMgaXMgYSBidXR0IHRoYXQgd29uJ3QgcXVpdC4iICsKKyAgICAgICAgICAgICAgICAiLSBCYXJ0LCB3cml0aW5nIGFzIFdvb2Ryb3cgdG8gTXMuIEtyYWJhcHBlbC4iKTsKKworICAgICAgICBsb2dnZXIuZXJyb3IoIkRlYXIgQmFieSwgV2VsY29tZSB0byBEdW1wc3ZpbGxlLiBQb3B1bGF0aW9uOiB5b3UuIik7CisgICAgICAgIGxvZ2dlci5lcnJvcigiRGVhciBCYWJ5LCBXZWxjb21lIHRvIER1bXBzdmlsbGUuIFBvcHVsYXRpb246IHlvdS4iLAorICAgICAgICAgICAgICAgIG5ldyBJT0V4Y2VwdGlvbigiRHVtcHN2aWxsZSwgVVNBIikpOworICAgICAgICBsb2dnZXIuZXJyb3IoIk1yLiBIdXR6LCBhcmUgeW91IGF3YXJlIHlvdSdyZSBub3Qgd2VhcmluZyBwYW50cz8iKTsKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJNci4gSHV0eiwgYXJlIHlvdSBhd2FyZSB5b3UncmUgbm90IHdlYXJpbmcgcGFudHM/IiwKKyAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFcnJvciAhISIpKTsKKworCisgICAgICAgIGxvZ2dlci5mYXRhbCgiRWVwLiIpOworICAgICAgICBsb2dnZXIuZmF0YWwoIk1tbS4uLmZvcmJpZGRlbiBkb251dC4iLAorICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiRmF0YWwgRXhjZXB0aW9uIikpOworICAgICAgICBsb2dnZXIuZmF0YWwoIkQnb2ghIEEgZGVlciEgQSBmZW1hbGUgZGVlciEiKTsKKyAgICAgICAgbG9nZ2VyLmZhdGFsKCJNbW1tbW0gLi4uLiBDaG9jb2xhdGUuIiwKKyAgICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkZhdGFsIEV4Y2VwdGlvbiIpKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQcm90ZWN0ZWQgTWV0aG9kczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQcml2YXRlIE1ldGhvZHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgTmVzdGVkIFRvcC1MZXZlbCBDbGFzc2VzIG9yIEludGVyZmFjZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9sZjUvSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMvZXhhbXBsZS5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvbGY1L0luaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzL2V4YW1wbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzFmMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbGY1L0luaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzL2V4YW1wbGUucHJvcGVydGllcwpAQCAtMCwwICsxLDM0IEBACisjIEZvciB0aGUgZ2VuZXJhbCBzeW50YXggb2YgcHJvcGVydHkgYmFzZWQgY29uZmlndXJhdGlvbiBmaWxlcyBzZWUgdGhlCisjIGRvY3VtZW5hdGlvbiBvZiBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yLgorCisjIFRoZSByb290IGNhdGVnb3J5IHVzZXMgdHdvIGFwcGVuZGVycyBjYWxsZWQgQTEgYW5kIFIuIFNpbmNlIG5vIHByaW9yaXR5IGlzCisjIHNwZWNpZmllZCwgdGhlIHJvb3QgY2F0ZWdvcnkgYXNzdW1lcyB0aGUgZGVmYXVsdCBwcmlvcml0eSBmb3Igcm9vdAorIyB3aGljaCBpcyBERUJVRyBpbiBsb2c0ai4gVGhlIHJvb3QgY2F0ZWdvcnkgaXMgdGhlIG9ubHkgY2F0ZWdvcnkgdGhhdAorIyBoYXMgYSBkZWZhdWx0IHByaW9yaXR5LiBBbGwgb3RoZXIgY2F0ZWdvcmllcyBuZWVkIG5vdCBiZSBhc3NpZ25lZCBhCisjIHByaW9yaXR5IGluIHdoaWNoIGNhc2UgdGhleSBpbmhlcml0IHRoZWlyIHByaW9yaXR5IGZyb20gdGhlCisjIGhpZXJhcmNoeS4KKworbG9nNGoucm9vdENhdGVnb3J5PSwgQTEsIFIKKworIyBBMSBpcyBzZXQgdG8gYmUgYSBMRjVBcHBlbmRlciB3aGljaCBvdXRwdXRzIHRvIGEgc3dpbmcKKyMgbG9nZ2luZyBjb25zb2xlLiAgIAorICAKK2xvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGoubGY1LkxGNUFwcGVuZGVyCisKKyMgUiBpcyB0aGUgUm9sbGluZ0ZpbGVBcHBlbmRlciB0aGF0IG91dHB1dHMgdG8gYSByb2xsaW5nIGxvZyAKKyMgZmlsZSBjYWxsZWQgcm9sbGluZ19sb2dfZmlsZS5sb2cuCisKK2xvZzRqLmFwcGVuZGVyLlI9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5SLkZpbGU9cm9sbGluZ19sb2dfZmlsZS5sb2cKKworIyBEZWZpbmUgYSBwYXR0ZXJuIGxheW91dCBmb3IgdGhlIGZpbGUuICAKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udmVyc2lvbiBjaGFyYWN0ZXJzIChpLmUuIGQscCx0LGMsbCxtLG4pCisjIHBsZWFzZSBzZWUgdGhlIFBhdHRlcm5MYXlvdXQgY2xhc3Mgb2YgdGhlIExvZzRqIEFQSS4KKworbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Citsb2c0ai5hcHBlbmRlci5SLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bc2xmNXMuc3RhcnRdJWR7REFURX1bc2xmNXMuREFURV0lbiVwW3NsZjVzLlBSSU9SSVRZXSVuJXhbc2xmNXMuTkRDXSVuJXRbc2xmNXMuVEhSRUFEXSVuJWNbc2xmNXMuQ0FURUdPUlldJW4lbFtzbGY1cy5MT0NBVElPTl0lbiVtW3NsZjVzLk1FU1NBR0VdJW4lbgorCisjIFNldCB0aGUgbWF4IHNpemUgb2YgdGhlIGZpbGUgYW5kIHRoZSBudW1iZXIgb2YgYmFja3VwIGZpbGVzCisKK2xvZzRqLmFwcGVuZGVyLlIuTWF4RmlsZVNpemU9MTAwS0IKK2xvZzRqLmFwcGVuZGVyLlIuTWF4QmFja3VwSW5kZXg9MQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdQcm9wZXJ0aWVzRmlsZS9Jbml0VXNpbmdQcm9wZXJ0aWVzRmlsZS5qYXZhIGIvZXhhbXBsZXMvbGY1L0luaXRVc2luZ1Byb3BlcnRpZXNGaWxlL0luaXRVc2luZ1Byb3BlcnRpZXNGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhYmI5NAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdQcm9wZXJ0aWVzRmlsZS9Jbml0VXNpbmdQcm9wZXJ0aWVzRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4KKyAqLworcGFja2FnZSBleGFtcGxlcy5sZjUuSW5pdFVzaW5nUHJvcGVydGllc0ZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKKy8qKgorICogVGhpcyBpcyBhbm90aGVyIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIExvZ0ZhY3RvcjUKKyAqIGxvZ2dpbmcgY29uc29sZS4KKyAqCisgKiBUaGUgTEY1QXBwZW5kZXIgaXMgdGhlIHByaW1hcnkgY2xhc3MgdGhhdCBlbmFibGVzIGxvZ2dpbmcgdG8gdGhlCisgKiBMb2dGYWN0b3I1IGxvZ2dpbmcgd2luZG93LiBJZiB0aGUgZm9sbG93aW5nIGxpbmUgaXMgYWRkZWQgdG8gYSBwcm9wZXJ0aWVzCisgKiBmaWxlLCB0aGUgTEY1QXBwZW5kZXIgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcm9vdCBjYXRlZ29yeSB3aGVuCisgKiB0aGUgcHJvcGVydGllcyBmaWxlIGlzIGxvYWRlZDoKKyAqCisgKiAgICBsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLmxmNS5MRjVBcHBlbmRlcgorICoKKyAqIFRvIG1ha2UgdGhpcyBleGFtcGxlIHdvcmssIHlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBleGFtcGxlLnByb3BlcnRpZXMgZmlsZQorICogaXMgaW4geW91ciBjbGFzc3BhdGguWW91IGNhbiB0aGVuIHJ1biB0aGUgZXhhbXBsZSBhdCB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIEBhdXRob3IgQnJlbnQgU3ByZWNoZXIKKyAqLworCisvLyBDb250cmlidXRlZCBieSBUaG91Z2h0V29ya3MgSW5jLgorCitwdWJsaWMgY2xhc3MgSW5pdFVzaW5nUHJvcGVydGllc0ZpbGUgeworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIENvbnN0YW50czoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQcm90ZWN0ZWQgVmFyaWFibGVzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFByaXZhdGUgVmFyaWFibGVzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihJbml0VXNpbmdQcm9wZXJ0aWVzRmlsZS5jbGFzcyk7CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBDb25zdHJ1Y3RvcnM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHVibGljIE1ldGhvZHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgeworICAgICAgICAvLyBVc2UgYSBQcm9wZXJ0eUNvbmZpZ3VyYXRvciB0byBpbml0aWFsaXplIGZyb20gYSBwcm9wZXJ0eSBmaWxlLgorICAgICAgICBTdHJpbmcgcmVzb3VyY2UgPQorICAgICAgICAgICAgICAgICIvZXhhbXBsZXMvbGY1L0luaXRVc2luZ1Byb3BlcnRpZXNGaWxlL2V4YW1wbGUucHJvcGVydGllcyI7CisgICAgICAgIFVSTCBjb25maWdGaWxlUmVzb3VyY2UgPQorICAgICAgICAgICAgICAgIEluaXRVc2luZ1Byb3BlcnRpZXNGaWxlLmNsYXNzLmdldFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgUHJvcGVydHlDb25maWd1cmF0b3IuY29uZmlndXJlKGNvbmZpZ0ZpbGVSZXNvdXJjZSk7CisKKyAgICAgICAgLy8gQWRkIGEgYnVuY2ggb2YgbG9nZ2luZyBzdGF0ZW1lbnRzIC4uLgorICAgICAgICBsb2dnZXIuZGVidWcoIkhlbGxvLCBteSBuYW1lIGlzIEhvbWVyIFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgTGlzYSBTaW1wc29uLiIpOworICAgICAgICBsb2dnZXIuZGVidWcoIkhlbGxvLCBteSBuYW1lIGlzIE1hcmdlIFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgQmFydCBTaW1wc29uLiIpOworICAgICAgICBsb2dnZXIuZGVidWcoIkhlbGxvLCBteSBuYW1lIGlzIE1hZ2dpZSBTaW1wc29uLiIpOworCisgICAgICAgIGxvZ2dlci5pbmZvKCJXZSBhcmUgdGhlIFNpbXBzb25zISIpOworICAgICAgICBsb2dnZXIuaW5mbygiTW1tbW1tIC4uLi4gQ2hvY29sYXRlLiIpOworICAgICAgICBsb2dnZXIuaW5mbygiSG9tZXIgbGlrZXMgY2hvY29sYXRlIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJEb2ghIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJXZSBhcmUgdGhlIFNpbXBzb25zISIpOworCisgICAgICAgIGxvZ2dlci53YXJuKCJCYXJ0OiBJIGFtIHRocm91Z2ggd2l0aCB3b3JraW5nISBXb3JraW5nIGlzIGZvciBjaHVtcHMhIiArCisgICAgICAgICAgICAgICAgIkhvbWVyOiBTb24sIEknbSBwcm91ZCBvZiB5b3UuIEkgd2FzIHR3aWNlIHlvdXIgYWdlIGJlZm9yZSAiICsKKyAgICAgICAgICAgICAgICAiSSBmaWd1cmVkIHRoYXQgb3V0LiIpOworICAgICAgICBsb2dnZXIud2FybigiTW1tLi4uZm9yYmlkZGVuIGRvbnV0LiIpOworICAgICAgICBsb2dnZXIud2FybigiRCdvaCEgQSBkZWVyISBBIGZlbWFsZSBkZWVyISIpOworICAgICAgICBsb2dnZXIud2FybigiVHJ1bHksIHlvdXJzIGlzIGEgYnV0dCB0aGF0IHdvbid0IHF1aXQuIiArCisgICAgICAgICAgICAgICAgIi0gQmFydCwgd3JpdGluZyBhcyBXb29kcm93IHRvIE1zLiBLcmFiYXBwZWwuIik7CisKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJEZWFyIEJhYnksIFdlbGNvbWUgdG8gRHVtcHN2aWxsZS4gUG9wdWxhdGlvbjogeW91LiIpOworICAgICAgICBsb2dnZXIuZXJyb3IoIkRlYXIgQmFieSwgV2VsY29tZSB0byBEdW1wc3ZpbGxlLiBQb3B1bGF0aW9uOiB5b3UuIiwKKyAgICAgICAgICAgICAgICBuZXcgSU9FeGNlcHRpb24oIkR1bXBzdmlsbGUsIFVTQSIpKTsKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJNci4gSHV0eiwgYXJlIHlvdSBhd2FyZSB5b3UncmUgbm90IHdlYXJpbmcgcGFudHM/Iik7CisgICAgICAgIGxvZ2dlci5lcnJvcigiTXIuIEh1dHosIGFyZSB5b3UgYXdhcmUgeW91J3JlIG5vdCB3ZWFyaW5nIHBhbnRzPyIsCisgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXJyb3IgISEiKSk7CisKKworICAgICAgICBsb2dnZXIuZmF0YWwoIkVlcC4iKTsKKyAgICAgICAgbG9nZ2VyLmZhdGFsKCJNbW0uLi5mb3JiaWRkZW4gZG9udXQuIiwKKyAgICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkZhdGFsIEV4Y2VwdGlvbiIpKTsKKyAgICAgICAgbG9nZ2VyLmZhdGFsKCJEJ29oISBBIGRlZXIhIEEgZmVtYWxlIGRlZXIhIik7CisgICAgICAgIGxvZ2dlci5mYXRhbCgiTW1tbW1tIC4uLi4gQ2hvY29sYXRlLiIsCisgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJGYXRhbCBFeGNlcHRpb24iKSk7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJvdGVjdGVkIE1ldGhvZHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJpdmF0ZSBNZXRob2RzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIE5lc3RlZCBUb3AtTGV2ZWwgQ2xhc3NlcyBvciBJbnRlcmZhY2VzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGY1L0luaXRVc2luZ1Byb3BlcnRpZXNGaWxlL2V4YW1wbGUucHJvcGVydGllcyBiL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdQcm9wZXJ0aWVzRmlsZS9leGFtcGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0MjFkMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdQcm9wZXJ0aWVzRmlsZS9leGFtcGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIyBGb3IgdGhlIGdlbmVyYWwgc3ludGF4IG9mIHByb3BlcnR5IGJhc2VkIGNvbmZpZ3VyYXRpb24gZmlsZXMgc2VlIHRoZQorIyBkb2N1bWVuYXRpb24gb2Ygb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvci4KKworIyBUaGUgcm9vdCBjYXRlZ29yeSB1c2VzIHRoZSBhcHBlbmRlciBjYWxsZWQgQTEuIFNpbmNlIG5vIHByaW9yaXR5IGlzCisjIHNwZWNpZmllZCwgdGhlIHJvb3QgY2F0ZWdvcnkgYXNzdW1lcyB0aGUgZGVmYXVsdCBwcmlvcml0eSBmb3Igcm9vdAorIyB3aGljaCBpcyBERUJVRyBpbiBsb2c0ai4gVGhlIHJvb3QgY2F0ZWdvcnkgaXMgdGhlIG9ubHkgY2F0ZWdvcnkgdGhhdAorIyBoYXMgYSBkZWZhdWx0IHByaW9yaXR5LiBBbGwgb3RoZXIgY2F0ZWdvcmllcyBuZWVkIG5vdCBiZSBhc3NpZ25lZCBhCisjIHByaW9yaXR5IGluIHdoaWNoIGNhc2UgdGhleSBpbmhlcml0IHRoZWlyIHByaW9yaXR5IGZyb20gdGhlCisjIGhpZXJhcmNoeS4KKworbG9nNGoucm9vdENhdGVnb3J5PSwgQTEKKworIyBBMSBpcyBzZXQgdG8gYmUgYSBMRjVBcHBlbmRlciB3aGljaCBvdXRwdXRzIHRvIGEgc3dpbmcKKyMgbG9nZ2luZyBjb25zb2xlLiAKKyAgCitsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLmxmNS5MRjVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuQTEuTWF4TnVtYmVyT2ZSZWNvcmRzPTcwMApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGY1L0luaXRVc2luZ1hNTFByb3BlcnRpZXNGaWxlL0luaXRVc2luZ1hNTFByb3BlcnRpZXNGaWxlLmphdmEgYi9leGFtcGxlcy9sZjUvSW5pdFVzaW5nWE1MUHJvcGVydGllc0ZpbGUvSW5pdFVzaW5nWE1MUHJvcGVydGllc0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIxYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbGY1L0luaXRVc2luZ1hNTFByb3BlcnRpZXNGaWxlL0luaXRVc2luZ1hNTFByb3BlcnRpZXNGaWxlLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQorICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLgorICovCitwYWNrYWdlIGV4YW1wbGVzLmxmNS5Jbml0VXNpbmdYTUxQcm9wZXJ0aWVzRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoueG1sLkRPTUNvbmZpZ3VyYXRvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIFRoaXMgaXMgYW5vdGhlciBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBMb2dGYWN0b3I1CisgKiBsb2dnaW5nIGNvbnNvbGUuCisgKgorICogVG8gbWFrZSB0aGlzIGV4YW1wbGUgd29yaywgZW5zdXJlIHRoYXQgdGhlIGxmNS5qYXIsIGxmNS1saWNlbnNlLmphcgorICogYW5kIGV4YW1wbGUueG1sIGZpbGVzIGFyZSBpbiB5b3VyIGNsYXNzcGF0aC4gT25jZSB5b3VyIGNsYXNzcGF0aCBoYXMKKyAqIGJlZW4gc2V0IHVwLCB5b3UgY2FuIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgKgorICogQGF1dGhvciBCcmVudCBTcHJlY2hlcgorICovCisKKy8vIENvbnRyaWJ1dGVkIGJ5IFRob3VnaHRXb3JrcyBJbmMuCisKK3B1YmxpYyBjbGFzcyBJbml0VXNpbmdYTUxQcm9wZXJ0aWVzRmlsZSB7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgQ29uc3RhbnRzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFByb3RlY3RlZCBWYXJpYWJsZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJpdmF0ZSBWYXJpYWJsZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEluaXRVc2luZ1hNTFByb3BlcnRpZXNGaWxlLmNsYXNzKTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIENvbnN0cnVjdG9yczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQdWJsaWMgTWV0aG9kczoKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7CisgICAgICAgIC8vIFVzZSBhIFByb3BlcnR5Q29uZmlndXJhdG9yIHRvIGluaXRpYWxpemUgZnJvbSBhIHByb3BlcnR5IGZpbGUuCisgICAgICAgIFN0cmluZyByZXNvdXJjZSA9CisgICAgICAgICAgICAgICAgIi9leGFtcGxlcy9sZjUvSW5pdFVzaW5nWE1MUHJvcGVydGllc0ZpbGUvZXhhbXBsZS54bWwiOworICAgICAgICBVUkwgY29uZmlnRmlsZVJlc291cmNlID0KKyAgICAgICAgICAgICAgICBJbml0VXNpbmdYTUxQcm9wZXJ0aWVzRmlsZS5jbGFzcy5nZXRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgIERPTUNvbmZpZ3VyYXRvci5jb25maWd1cmUoY29uZmlnRmlsZVJlc291cmNlLmdldEZpbGUoKSk7CisKKyAgICAgICAgLy8gQWRkIGEgYnVuY2ggb2YgbG9nZ2luZyBzdGF0ZW1lbnRzIC4uLgorICAgICAgICBsb2dnZXIuZGVidWcoIkhlbGxvLCBteSBuYW1lIGlzIEhvbWVyIFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgTGlzYSBTaW1wc29uLiIpOworICAgICAgICBsb2dnZXIuZGVidWcoIkhlbGxvLCBteSBuYW1lIGlzIE1hcmdlIFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgQmFydCBTaW1wc29uLiIpOworICAgICAgICBsb2dnZXIuZGVidWcoIkhlbGxvLCBteSBuYW1lIGlzIE1hZ2dpZSBTaW1wc29uLiIpOworCisgICAgICAgIGxvZ2dlci5pbmZvKCJXZSBhcmUgdGhlIFNpbXBzb25zISIpOworICAgICAgICBsb2dnZXIuaW5mbygiTW1tbW1tIC4uLi4gQ2hvY29sYXRlLiIpOworICAgICAgICBsb2dnZXIuaW5mbygiSG9tZXIgbGlrZXMgY2hvY29sYXRlIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJEb2ghIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJXZSBhcmUgdGhlIFNpbXBzb25zISIpOworCisgICAgICAgIGxvZ2dlci53YXJuKCJCYXJ0OiBJIGFtIHRocm91Z2ggd2l0aCB3b3JraW5nISBXb3JraW5nIGlzIGZvciBjaHVtcHMhIiArCisgICAgICAgICAgICAgICAgIkhvbWVyOiBTb24sIEknbSBwcm91ZCBvZiB5b3UuIEkgd2FzIHR3aWNlIHlvdXIgYWdlIGJlZm9yZSAiICsKKyAgICAgICAgICAgICAgICAiSSBmaWd1cmVkIHRoYXQgb3V0LiIpOworICAgICAgICBsb2dnZXIud2FybigiTW1tLi4uZm9yYmlkZGVuIGRvbnV0LiIpOworICAgICAgICBsb2dnZXIud2FybigiRCdvaCEgQSBkZWVyISBBIGZlbWFsZSBkZWVyISIpOworICAgICAgICBsb2dnZXIud2FybigiVHJ1bHksIHlvdXJzIGlzIGEgYnV0dCB0aGF0IHdvbid0IHF1aXQuIiArCisgICAgICAgICAgICAgICAgIi0gQmFydCwgd3JpdGluZyBhcyBXb29kcm93IHRvIE1zLiBLcmFiYXBwZWwuIik7CisKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJEZWFyIEJhYnksIFdlbGNvbWUgdG8gRHVtcHN2aWxsZS4gUG9wdWxhdGlvbjogeW91LiIpOworICAgICAgICBsb2dnZXIuZXJyb3IoIkRlYXIgQmFieSwgV2VsY29tZSB0byBEdW1wc3ZpbGxlLiBQb3B1bGF0aW9uOiB5b3UuIiwKKyAgICAgICAgICAgICAgICBuZXcgSU9FeGNlcHRpb24oIkR1bXBzdmlsbGUsIFVTQSIpKTsKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJNci4gSHV0eiwgYXJlIHlvdSBhd2FyZSB5b3UncmUgbm90IHdlYXJpbmcgcGFudHM/Iik7CisgICAgICAgIGxvZ2dlci5lcnJvcigiTXIuIEh1dHosIGFyZSB5b3UgYXdhcmUgeW91J3JlIG5vdCB3ZWFyaW5nIHBhbnRzPyIsCisgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXJyb3IgISEiKSk7CisKKworICAgICAgICBsb2dnZXIuZmF0YWwoIkVlcC4iKTsKKyAgICAgICAgbG9nZ2VyLmZhdGFsKCJNbW0uLi5mb3JiaWRkZW4gZG9udXQuIiwKKyAgICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkZhdGFsIEV4Y2VwdGlvbiIpKTsKKyAgICAgICAgbG9nZ2VyLmZhdGFsKCJEJ29oISBBIGRlZXIhIEEgZmVtYWxlIGRlZXIhIik7CisgICAgICAgIGxvZ2dlci5mYXRhbCgiTW1tbW1tIC4uLi4gQ2hvY29sYXRlLiIsCisgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJGYXRhbCBFeGNlcHRpb24iKSk7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJvdGVjdGVkIE1ldGhvZHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJpdmF0ZSBNZXRob2RzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIE5lc3RlZCBUb3AtTGV2ZWwgQ2xhc3NlcyBvciBJbnRlcmZhY2VzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGY1L0luaXRVc2luZ1hNTFByb3BlcnRpZXNGaWxlL2V4YW1wbGUueG1sIGIvZXhhbXBsZXMvbGY1L0luaXRVc2luZ1hNTFByb3BlcnRpZXNGaWxlL2V4YW1wbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjdjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9sZjUvSW5pdFVzaW5nWE1MUHJvcGVydGllc0ZpbGUvZXhhbXBsZS54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbG9nNGo6Y29uZmlndXJhdGlvbiBTWVNURU0gImxvZzRqLmR0ZCI+CisKKzxsb2c0ajpjb25maWd1cmF0aW9uPgorICAgICAgICAKKyAgPGFwcGVuZGVyIG5hbWU9IkxGNUFwcGVuZGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5sZjUuTEY1QXBwZW5kZXIiPgorICAgICA8cGFyYW0gbmFtZT0iTWF4TnVtYmVyT2ZSZWNvcmRzIiB2YWx1ZT0iMTAwMCIvPiAKKyAgPC9hcHBlbmRlcj4KKworICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTEY1QXBwZW5kZXIiLz4KKyAgPC9yb290PgorCis8L2xvZzRqOmNvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGY1L09wZW5pbmdMb2dGaWxlcy9zYW1wbGUubG9nIGIvZXhhbXBsZXMvbGY1L09wZW5pbmdMb2dGaWxlcy9zYW1wbGUubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZGJlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9sZjUvT3BlbmluZ0xvZ0ZpbGVzL3NhbXBsZS5sb2cKQEAgLTAsMCArMSwxODQgQEAKK1tzbGY1cy5zdGFydF0yNiBKdWwgMjAwMSAxNTo1NDo0NCw2NzNbc2xmNXMuREFURV0KK0RFQlVHW3NsZjVzLlBSSU9SSVRZXQorW3NsZjVzLk5EQ10KK21haW5bc2xmNXMuVEhSRUFEXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnNbc2xmNXMuQ0FURUdPUlldCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTAyKVtzbGY1cy5MT0NBVElPTl0KK0hlbGxvLCBteSBuYW1lIGlzIEhvbWVyIFNpbXBzb24uW3NsZjVzLk1FU1NBR0VdCisKK1tzbGY1cy5zdGFydF0yNiBKdWwgMjAwMSAxNTo1NDo0NCw3NDNbc2xmNXMuREFURV0KK0RFQlVHW3NsZjVzLlBSSU9SSVRZXQorW3NsZjVzLk5EQ10KK21haW5bc2xmNXMuVEhSRUFEXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnNbc2xmNXMuQ0FURUdPUlldCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTAzKVtzbGY1cy5MT0NBVElPTl0KK0hlbGxvLCBteSBuYW1lIGlzIExpc2EgU2ltcHNvbi5bc2xmNXMuTUVTU0FHRV0KKworW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ0LDc0M1tzbGY1cy5EQVRFXQorREVCVUdbc2xmNXMuUFJJT1JJVFldCitbc2xmNXMuTkRDXQorbWFpbltzbGY1cy5USFJFQURdCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVyc1tzbGY1cy5DQVRFR09SWV0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLm1haW4oSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YToxMDQpW3NsZjVzLkxPQ0FUSU9OXQorSGVsbG8sIG15IG5hbWUgaXMgTWFyZ2UgU2ltcHNvbi5bc2xmNXMuTUVTU0FHRV0KKworW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ0LDc1M1tzbGY1cy5EQVRFXQorREVCVUdbc2xmNXMuUFJJT1JJVFldCitbc2xmNXMuTkRDXQorbWFpbltzbGY1cy5USFJFQURdCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVyc1tzbGY1cy5DQVRFR09SWV0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLm1haW4oSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YToxMDUpW3NsZjVzLkxPQ0FUSU9OXQorSGVsbG8sIG15IG5hbWUgaXMgQmFydCBTaW1wc29uLltzbGY1cy5NRVNTQUdFXQorCitbc2xmNXMuc3RhcnRdMjYgSnVsIDIwMDEgMTU6NTQ6NDQsNzkzW3NsZjVzLkRBVEVdCitERUJVR1tzbGY1cy5QUklPUklUWV0KK1tzbGY1cy5ORENdCittYWluW3NsZjVzLlRIUkVBRF0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzW3NsZjVzLkNBVEVHT1JZXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjEwNilbc2xmNXMuTE9DQVRJT05dCitIZWxsbywgbXkgbmFtZSBpcyBNYWdnaWUgU2ltcHNvbi5bc2xmNXMuTUVTU0FHRV0KKworW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ0LDc5M1tzbGY1cy5EQVRFXQorSU5GT1tzbGY1cy5QUklPUklUWV0KK1tzbGY1cy5ORENdCittYWluW3NsZjVzLlRIUkVBRF0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzW3NsZjVzLkNBVEVHT1JZXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjEwOClbc2xmNXMuTE9DQVRJT05dCitXZSBhcmUgdGhlIFNpbXBzb25zIVtzbGY1cy5NRVNTQUdFXQorCitbc2xmNXMuc3RhcnRdMjYgSnVsIDIwMDEgMTU6NTQ6NDQsODAzW3NsZjVzLkRBVEVdCitJTkZPW3NsZjVzLlBSSU9SSVRZXQorW3NsZjVzLk5EQ10KK21haW5bc2xmNXMuVEhSRUFEXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnNbc2xmNXMuQ0FURUdPUlldCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTA5KVtzbGY1cy5MT0NBVElPTl0KK01tbW1tbSAuLi4uIENob2NvbGF0ZS5bc2xmNXMuTUVTU0FHRV0KKworW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ0LDgwM1tzbGY1cy5EQVRFXQorSU5GT1tzbGY1cy5QUklPUklUWV0KK1tzbGY1cy5ORENdCittYWluW3NsZjVzLlRIUkVBRF0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzW3NsZjVzLkNBVEVHT1JZXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjExMClbc2xmNXMuTE9DQVRJT05dCitIb21lciBsaWtlcyBjaG9jb2xhdGVbc2xmNXMuTUVTU0FHRV0KKworW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ0LDgwM1tzbGY1cy5EQVRFXQorSU5GT1tzbGY1cy5QUklPUklUWV0KK1tzbGY1cy5ORENdCittYWluW3NsZjVzLlRIUkVBRF0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzW3NsZjVzLkNBVEVHT1JZXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjExMSlbc2xmNXMuTE9DQVRJT05dCitEb2ghW3NsZjVzLk1FU1NBR0VdCisKK1tzbGY1cy5zdGFydF0yNiBKdWwgMjAwMSAxNTo1NDo0NCw4MDNbc2xmNXMuREFURV0KK0lORk9bc2xmNXMuUFJJT1JJVFldCitbc2xmNXMuTkRDXQorbWFpbltzbGY1cy5USFJFQURdCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVyc1tzbGY1cy5DQVRFR09SWV0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLm1haW4oSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YToxMTIpW3NsZjVzLkxPQ0FUSU9OXQorV2UgYXJlIHRoZSBTaW1wc29ucyFbc2xmNXMuTUVTU0FHRV0KKworW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ0LDgwM1tzbGY1cy5EQVRFXQorV0FSTltzbGY1cy5QUklPUklUWV0KK1tzbGY1cy5ORENdCittYWluW3NsZjVzLlRIUkVBRF0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzW3NsZjVzLkNBVEVHT1JZXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjExNClbc2xmNXMuTE9DQVRJT05dCitCYXJ0OiBJIGFtIHRocm91Z2ggd2l0aCB3b3JraW5nISBXb3JraW5nIGlzIGZvciBjaHVtcHMhSG9tZXI6IFNvbiwgSSdtIHByb3VkIG9mIHlvdS4gSSB3YXMgdHdpY2UgeW91ciBhZ2UgYmVmb3JlIEkgZmlndXJlZCB0aGF0IG91dC5bc2xmNXMuTUVTU0FHRV0KKworW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ0LDgwM1tzbGY1cy5EQVRFXQorV0FSTltzbGY1cy5QUklPUklUWV0KK1tzbGY1cy5ORENdCittYWluW3NsZjVzLlRIUkVBRF0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzW3NsZjVzLkNBVEVHT1JZXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjExNylbc2xmNXMuTE9DQVRJT05dCitNbW0uLi5mb3JiaWRkZW4gZG9udXQuW3NsZjVzLk1FU1NBR0VdCisKK1tzbGY1cy5zdGFydF0yNiBKdWwgMjAwMSAxNTo1NDo0NCw4MDNbc2xmNXMuREFURV0KK1dBUk5bc2xmNXMuUFJJT1JJVFldCitbc2xmNXMuTkRDXQorbWFpbltzbGY1cy5USFJFQURdCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVyc1tzbGY1cy5DQVRFR09SWV0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLm1haW4oSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YToxMTgpW3NsZjVzLkxPQ0FUSU9OXQorRCdvaCEgQSBkZWVyISBBIGZlbWFsZSBkZWVyIVtzbGY1cy5NRVNTQUdFXQorCitbc2xmNXMuc3RhcnRdMjYgSnVsIDIwMDEgMTU6NTQ6NDQsODAzW3NsZjVzLkRBVEVdCitXQVJOW3NsZjVzLlBSSU9SSVRZXQorW3NsZjVzLk5EQ10KK21haW5bc2xmNXMuVEhSRUFEXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnNbc2xmNXMuQ0FURUdPUlldCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTE5KVtzbGY1cy5MT0NBVElPTl0KK1RydWx5LCB5b3VycyBpcyBhIGJ1dHQgdGhhdCB3b24ndCBxdWl0Li0gQmFydCwgd3JpdGluZyBhcyBXb29kcm93IHRvIE1zLiBLcmFiYXBwZWwuW3NsZjVzLk1FU1NBR0VdCisKK1tzbGY1cy5zdGFydF0yNiBKdWwgMjAwMSAxNTo1NDo0NCw4MDNbc2xmNXMuREFURV0KK0VSUk9SW3NsZjVzLlBSSU9SSVRZXQorW3NsZjVzLk5EQ10KK21haW5bc2xmNXMuVEhSRUFEXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnNbc2xmNXMuQ0FURUdPUlldCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTIyKVtzbGY1cy5MT0NBVElPTl0KK0RlYXIgQmFieSwgV2VsY29tZSB0byBEdW1wc3ZpbGxlLiBQb3B1bGF0aW9uOiB5b3UuW3NsZjVzLk1FU1NBR0VdCisKK1tzbGY1cy5zdGFydF0yNiBKdWwgMjAwMSAxNTo1NDo0NCw5MDNbc2xmNXMuREFURV0KK0VSUk9SW3NsZjVzLlBSSU9SSVRZXQorW3NsZjVzLk5EQ10KK21haW5bc2xmNXMuVEhSRUFEXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnNbc2xmNXMuQ0FURUdPUlldCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTIzKVtzbGY1cy5MT0NBVElPTl0KK0RlYXIgQmFieSwgV2VsY29tZSB0byBEdW1wc3ZpbGxlLiBQb3B1bGF0aW9uOiB5b3UuW3NsZjVzLk1FU1NBR0VdCisKK2phdmEuaW8uSU9FeGNlcHRpb246IER1bXBzdmlsbGUsIFVTQQorCWF0IGV4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLm1haW4oSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YToxMjMpCitbc2xmNXMuc3RhcnRdMjYgSnVsIDIwMDEgMTU6NTQ6NDQsOTAzW3NsZjVzLkRBVEVdCitFUlJPUltzbGY1cy5QUklPUklUWV0KK1tzbGY1cy5ORENdCittYWluW3NsZjVzLlRIUkVBRF0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzW3NsZjVzLkNBVEVHT1JZXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjEyNSlbc2xmNXMuTE9DQVRJT05dCitNci4gSHV0eiwgYXJlIHlvdSBhd2FyZSB5b3UncmUgbm90IHdlYXJpbmcgcGFudHM/W3NsZjVzLk1FU1NBR0VdCisKK1tzbGY1cy5zdGFydF0yNiBKdWwgMjAwMSAxNTo1NDo0NCw5MDNbc2xmNXMuREFURV0KK0VSUk9SW3NsZjVzLlBSSU9SSVRZXQorW3NsZjVzLk5EQ10KK21haW5bc2xmNXMuVEhSRUFEXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnNbc2xmNXMuQ0FURUdPUlldCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTI2KVtzbGY1cy5MT0NBVElPTl0KK01yLiBIdXR6LCBhcmUgeW91IGF3YXJlIHlvdSdyZSBub3Qgd2VhcmluZyBwYW50cz9bc2xmNXMuTUVTU0FHRV0KKworamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogRXJyb3IgISEKKwlhdCBleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTI2KQorW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ0LDkwM1tzbGY1cy5EQVRFXQorRkFUQUxbc2xmNXMuUFJJT1JJVFldCitbc2xmNXMuTkRDXQorbWFpbltzbGY1cy5USFJFQURdCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVyc1tzbGY1cy5DQVRFR09SWV0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLm1haW4oSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YToxMzApW3NsZjVzLkxPQ0FUSU9OXQorRWVwLltzbGY1cy5NRVNTQUdFXQorCitbc2xmNXMuc3RhcnRdMjYgSnVsIDIwMDEgMTU6NTQ6NDUsMDYzW3NsZjVzLkRBVEVdCitGQVRBTFtzbGY1cy5QUklPUklUWV0KK1tzbGY1cy5ORENdCittYWluW3NsZjVzLlRIUkVBRF0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzW3NsZjVzLkNBVEVHT1JZXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjEzMSlbc2xmNXMuTE9DQVRJT05dCitNbW0uLi5mb3JiaWRkZW4gZG9udXQuW3NsZjVzLk1FU1NBR0VdCisKK2phdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbjogRmF0YWwgRXhjZXB0aW9uCisJYXQgZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMubWFpbihJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5qYXZhOjEzMSkKK1tzbGY1cy5zdGFydF0yNiBKdWwgMjAwMSAxNTo1NDo0NSwwNjNbc2xmNXMuREFURV0KK0ZBVEFMW3NsZjVzLlBSSU9SSVRZXQorW3NsZjVzLk5EQ10KK21haW5bc2xmNXMuVEhSRUFEXQorZXhhbXBsZXMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnNbc2xmNXMuQ0FURUdPUlldCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5tYWluKEluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLmphdmE6MTMzKVtzbGY1cy5MT0NBVElPTl0KK0Qnb2ghIEEgZGVlciEgQSBmZW1hbGUgZGVlciFbc2xmNXMuTUVTU0FHRV0KKworW3NsZjVzLnN0YXJ0XTI2IEp1bCAyMDAxIDE1OjU0OjQ1LDA2M1tzbGY1cy5EQVRFXQorRkFUQUxbc2xmNXMuUFJJT1JJVFldCitbc2xmNXMuTkRDXQorbWFpbltzbGY1cy5USFJFQURdCitleGFtcGxlcy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVyc1tzbGY1cy5DQVRFR09SWV0KK2V4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLm1haW4oSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YToxMzQpW3NsZjVzLkxPQ0FUSU9OXQorTW1tbW1tIC4uLi4gQ2hvY29sYXRlLltzbGY1cy5NRVNTQUdFXQorCitqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb246IEZhdGFsIEV4Y2VwdGlvbgorCWF0IGV4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLm1haW4oSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YToxMzQpCmRpZmYgLS1naXQgYS9leGFtcGxlcy9sZjUvVXNpbmdMb2dNb25pdG9yQWRhcHRlci9DdXN0b21pemVkTG9nTGV2ZWxzLmphdmEgYi9leGFtcGxlcy9sZjUvVXNpbmdMb2dNb25pdG9yQWRhcHRlci9DdXN0b21pemVkTG9nTGV2ZWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyZWQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2xmNS9Vc2luZ0xvZ01vbml0b3JBZGFwdGVyL0N1c3RvbWl6ZWRMb2dMZXZlbHMuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCisgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuCisgKi8KKworcGFja2FnZSBleGFtcGxlcy5sZjUuVXNpbmdMb2dNb25pdG9yQWRhcHRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LkxvZ0xldmVsOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LnV0aWwuTG9nTW9uaXRvckFkYXB0ZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB1c2UgdGhlIExvZ01vbml0b3JBZGFwdGVyIHRvCisgKiBieXBhc3MgdGhlIExvZzRKQXBwZW5kZXIgYW5kIHBvc3QgTG9nUmVjb3JkcyBkaXJlY3RseSB0byB0aGUgTG9nTW9uaXRvcgorICogdXNpbmcgY3VzdG9taXplZCBMb2dMZXZlbHMKKyAqCisgKiBUbyBtYWtlIHRoaXMgZXhhbXBsZSB3b3JrLCBlbnN1cmUgdGhhdCB0aGUgbGY1LmphciBhbmQgbGY1LWxpY2Vuc2UuamFyCisgKiBmaWxlcyBhcmUgaW4geW91ciBjbGFzc3BhdGgsIGFuZCB0aGVuIHJ1biB0aGUgZXhhbXBsZSBhdCB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIEBhdXRob3IgUmljaGFyZCBIdXJzdAorICovCisKKy8vIENvbnRyaWJ1dGVkIGJ5IFRob3VnaHRXb3JrcyBJbmMuCisKK3B1YmxpYyBjbGFzcyBDdXN0b21pemVkTG9nTGV2ZWxzIHsKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBDb25zdGFudHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9nTGV2ZWwgTEVWRUxfT05FID0gbmV3IExvZ0xldmVsKCJMRVZFTCAxIiwgMSk7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBMb2dMZXZlbCBMRVZFTF9UV08gPSBuZXcgTG9nTGV2ZWwoIkxFVkVMIDIiLCAyKTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIExvZ0xldmVsIExFVkVMX1RIUkVFID0gbmV3IExvZ0xldmVsKCJMRVZFTCAzIiwgMyk7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBMb2dMZXZlbCBMRVZFTF9GT1VSID0gbmV3IExvZ0xldmVsKCJMRVZFTCA0IiwgNCk7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBMb2dMZXZlbCBERUZBVUxUID0gbmV3IExvZ0xldmVsKCJERUZBVUxUIiwgMCk7CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBQcm90ZWN0ZWQgVmFyaWFibGVzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFByaXZhdGUgVmFyaWFibGVzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBMb2dNb25pdG9yQWRhcHRlciBfYWRhcHRlcjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIFRoZSBmaXJzdCBMb2dMZXZlbCBpbiB0aGUgQXJyYXkgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IExvZ0xldmVsLgorICAgICAgICBfYWRhcHRlciA9IExvZ01vbml0b3JBZGFwdGVyLm5ld0luc3RhbmNlKG5ldyBMb2dMZXZlbFtde0RFRkFVTFQsIExFVkVMX09ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9UV08sIExFVkVMX1RIUkVFLCBMRVZFTF9GT1VSLCBMb2dMZXZlbC5GQVRBTH0pOworICAgICAgICAvLyBpZiBhIGRpZmZlcmVudCBsb2cgbGV2ZWwgaXMgdG8gYmUgdXNlZCBpdCBjYW4gYmUgc3BlY2lmaWVkIGFzIHN1Y2gKKyAgICAgICAgLy8gX2FkYXB0ZXIuc2V0RGVmYXVsdExldmVsKExFVkVMX1RIUkVFKTsKKyAgICB9CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgQ29uc3RydWN0b3JzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFB1YmxpYyBNZXRob2RzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgQ3VzdG9taXplZExvZ0xldmVscyB0ZXN0ID0gbmV3IEN1c3RvbWl6ZWRMb2dMZXZlbHMoKTsKKyAgICAgICAgdGVzdC5kb015QmlkZGluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvTXlCaWRkaW5nKCkgeworICAgICAgICAvLyB0ZWxsIHRoZSBMb2dNb25pdG9yQWRhcHRlciB3aGljaCBMb2dMZXZlbCBpcyB0aGUgc2V2ZXJlIExldmVsIGlmIG5lY2Vzc2FyeQorICAgICAgICBfYWRhcHRlci5zZXRTZXZlcmVMZXZlbChMRVZFTF9PTkUpOworCisgICAgICAgIFN0cmluZyBsZXZlbHMgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOworCisgICAgICAgIC8vIHdpbGwgdXNlZCB0aGUgZGVmYXVsdCBMZXZlbAorICAgICAgICBfYWRhcHRlci5sb2cobGV2ZWxzLCAiVXNpbmcgdGhlIGN1c3RvbWl6ZWQgTG9nTGV2ZWxzIik7CisKKyAgICAgICAgX2FkYXB0ZXIubG9nKGxldmVscywgTEVWRUxfRk9VUiwgIlRoaXMgaXMgYSB0ZXN0Iik7CisgICAgICAgIF9hZGFwdGVyLmxvZyhsZXZlbHMsIExFVkVMX1RIUkVFLCAiSG1tbSBmb2JpZGRlbiBkb3VnaG51dCIpOworICAgICAgICBfYWRhcHRlci5sb2cobGV2ZWxzLCBMRVZFTF9PTkUsICJEYW5nZXIgRGFuZ2VyIFdpbGwgUm9iaW5zb24iLAorICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEQU5HRVIiKSwgIjMyIik7CisgICAgICAgIF9hZGFwdGVyLmxvZyhsZXZlbHMsIExFVkVMX1RXTywgIkV4aXQgc3RhZ2UgcmlnaHQtPiIpOworICAgICAgICBfYWRhcHRlci5sb2cobGV2ZWxzLCBMRVZFTF9GT1VSLCAiV2hhdCdzIHVwIERvYz8iLAorICAgICAgICAgICAgICAgIG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVW5mb3J0dW5hdGUgZXhjZXB0aW9uIikpOworCisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJvdGVjdGVkIE1ldGhvZHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJpdmF0ZSBNZXRob2RzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIE5lc3RlZCBUb3AtTGV2ZWwgQ2xhc3NlcyBvciBJbnRlcmZhY2VzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30KKworCisKKworCmRpZmYgLS1naXQgYS9leGFtcGxlcy9sZjUvVXNpbmdMb2dNb25pdG9yQWRhcHRlci9Vc2luZ0xvZ01vbml0b3JBZGFwdGVyLmphdmEgYi9leGFtcGxlcy9sZjUvVXNpbmdMb2dNb25pdG9yQWRhcHRlci9Vc2luZ0xvZ01vbml0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NDg1OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2xmNS9Vc2luZ0xvZ01vbml0b3JBZGFwdGVyL1VzaW5nTG9nTW9uaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4KKyAqLworcGFja2FnZSBleGFtcGxlcy5sZjUuVXNpbmdMb2dNb25pdG9yQWRhcHRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LkxvZ0xldmVsOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LnV0aWwuQWRhcHRlckxvZ1JlY29yZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmxmNS51dGlsLkxvZ01vbml0b3JBZGFwdGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdXNlIHRoZSBMb2dNb25pdG9yQWRhcHRlciB0bworICogYnlwYXNzIHRoZSBMb2c0SkFwcGVuZGVyIGFuZCBwb3N0IExvZ1JlY29yZHMgZGlyZWN0bHkgdG8gdGhlIExvZ01vbml0b3IKKyAqCisgKiBUbyBtYWtlIHRoaXMgZXhhbXBsZSB3b3JrLCBlbnN1cmUgdGhhdCB0aGUgbGY1LmphciBhbmQgbGY1LWxpY2Vuc2UuamFyCisgKiBmaWxlcyBhcmUgaW4geW91ciBjbGFzc3BhdGgsIGFuZCB0aGVuIHJ1biB0aGUgZXhhbXBsZSBhdCB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIEBhdXRob3IgUmljaGFyZCBIdXJzdAorICovCisKKy8vIENvbnRyaWJ1dGVkIGJ5IFRob3VnaHRXb3JrcyBJbmMuCisKK3B1YmxpYyBjbGFzcyBVc2luZ0xvZ01vbml0b3JBZGFwdGVyIHsKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyAgIENvbnN0YW50czoKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gICBQcm90ZWN0ZWQgVmFyaWFibGVzOgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyAgIFByaXZhdGUgVmFyaWFibGVzOgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHByaXZhdGUgc3RhdGljIExvZ01vbml0b3JBZGFwdGVyIF9hZGFwdGVyOworCisgIHN0YXRpYyB7CisgICAgX2FkYXB0ZXIgPSBMb2dNb25pdG9yQWRhcHRlci5uZXdJbnN0YW5jZShMb2dNb25pdG9yQWRhcHRlci5MT0c0Sl9MT0dfTEVWRUxTKTsKKyAgfQorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vICAgQ29uc3RydWN0b3JzOgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyAgIFB1YmxpYyBNZXRob2RzOgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIFVzaW5nTG9nTW9uaXRvckFkYXB0ZXIgdGVzdCA9IG5ldyBVc2luZ0xvZ01vbml0b3JBZGFwdGVyKCk7CisgICAgdGVzdC5kb015QmlkZGluZygpOworICB9CisKKyAgcHVibGljIHZvaWQgZG9NeUJpZGRpbmcoKSB7CisgICAgU3RyaW5nIGxvZ2dlciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAvLyB3aWxsIGRlZmF1bHQgdG8gZGVidWcgbG9nIGxldmVsCisgICAgX2FkYXB0ZXIubG9nKGxvZ2dlciwgIkRvaCB0aGlzIGlzIGEgZGVidWdnaW5nIik7CisKKyAgICBfYWRhcHRlci5sb2cobG9nZ2VyLCBMb2dMZXZlbC5JTkZPLCAiSG1tbSBmb2JpZGRlbiBkb3VnaG51dCIpOworICAgIF9hZGFwdGVyLmxvZyhsb2dnZXIsIExvZ0xldmVsLldBUk4sICJEYW5nZXIgRGFuZ2VyIFdpbGwgUm9iaW5zb24iLAorICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvbigiREFOR0VSIiksICIzMiIpOworICAgIF9hZGFwdGVyLmxvZyhsb2dnZXIsIExvZ0xldmVsLkVSUk9SLCAiRXhpdCBzdGFnZSByaWdodC0+Iik7CisgICAgX2FkYXB0ZXIubG9nKGxvZ2dlciwgTG9nTGV2ZWwuRkFUQUwsICJXaGF0J3MgdXAgRG9jPyIsCisgICAgICAgIG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVW5mb3J0dW5hdGUgZXhjZXB0aW9uIikpOworICB9CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyAgIFByb3RlY3RlZCBNZXRob2RzOgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyAgIFByaXZhdGUgTWV0aG9kczoKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gICBOZXN0ZWQgVG9wLUxldmVsIENsYXNzZXMgb3IgSW50ZXJmYWNlczoKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfQorCisKKworCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2xmNS9Vc2luZ1NvY2tldEFwcGVuZGVycy9Vc2luZ1NvY2tldEFwcGVuZGVycy5qYXZhIGIvZXhhbXBsZXMvbGY1L1VzaW5nU29ja2V0QXBwZW5kZXJzL1VzaW5nU29ja2V0QXBwZW5kZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3NDg5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2xmNS9Vc2luZ1NvY2tldEFwcGVuZGVycy9Vc2luZ1NvY2tldEFwcGVuZGVycy5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4KKyAqLworCitwYWNrYWdlIGV4YW1wbGVzLmxmNS5Vc2luZ1NvY2tldEFwcGVuZGVyczsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJvcGVydHlDb25maWd1cmF0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBUaGlzIGlzIGFub3RoZXIgc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgTG9nRmFjdG9yNQorICogbG9nZ2luZyBjb25zb2xlLgorICoKKyAqIFRoZSBMRjVBcHBlbmRlciBpcyB0aGUgcHJpbWFyeSBjbGFzcyB0aGF0IGVuYWJsZXMgbG9nZ2luZyB0byB0aGUKKyAqIExvZ0ZhY3RvcjUgbG9nZ2luZyB3aW5kb3cuIElmIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBhZGRlZCB0byBhIHByb3BlcnRpZXMKKyAqIGZpbGUsIHRoZSBMRjVBcHBlbmRlciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByb290IGNhdGVnb3J5IHdoZW4KKyAqIHRoZSBwcm9wZXJ0aWVzIGZpbGUgaXMgbG9hZGVkOgorICoKKyAqICAgIGxvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGoubGY1LkxGNUFwcGVuZGVyCisgKgorICogVG8gbWFrZSB0aGlzIGV4YW1wbGUgd29yaywgeW91IG11c3QgZW5zdXJlIHRoYXQgdGhlIGV4YW1wbGUucHJvcGVydGllcyBmaWxlCisgKiBpcyBpbiB5b3VyIGNsYXNzcGF0aC5Zb3UgY2FuIHRoZW4gcnVuIHRoZSBleGFtcGxlIGF0IHRoZSBjb21tYW5kIGxpbmUuCisgKgorICogQGF1dGhvciBCcmVudCBTcHJlY2hlcgorICovCisKKy8vIENvbnRyaWJ1dGVkIGJ5IFRob3VnaHRXb3JrcyBJbmMuCisKK3B1YmxpYyBjbGFzcyBVc2luZ1NvY2tldEFwcGVuZGVycyB7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgQ29uc3RhbnRzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFByb3RlY3RlZCBWYXJpYWJsZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJpdmF0ZSBWYXJpYWJsZXM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlcjEgPQorICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihVc2luZ1NvY2tldEFwcGVuZGVycy5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlcjIgPQorICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigiVGVzdENsYXNzLlN1YmNsYXNzIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlcjMgPQorICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigiVGVzdENsYXNzLlN1YmNsYXNzLlN1YmNsYXNzIik7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgQ29uc3RydWN0b3JzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIFB1YmxpYyBNZXRob2RzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKKyAgICAgICAgLy8gVXNlIGEgUHJvcGVydHlDb25maWd1cmF0b3IgdG8gaW5pdGlhbGl6ZSBmcm9tIGEgcHJvcGVydHkgZmlsZS4KKyAgICAgICAgU3RyaW5nIHJlc291cmNlID0KKyAgICAgICAgICAgICAgICAiL2V4YW1wbGVzL2xmNS9Vc2luZ1NvY2tldEFwcGVuZGVycy9zb2NrZXRjbGllbnQucHJvcGVydGllcyI7CisgICAgICAgIFVSTCBjb25maWdGaWxlUmVzb3VyY2UgPQorICAgICAgICAgICAgICAgIFVzaW5nU29ja2V0QXBwZW5kZXJzLmNsYXNzLmdldFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgUHJvcGVydHlDb25maWd1cmF0b3IuY29uZmlndXJlKGNvbmZpZ0ZpbGVSZXNvdXJjZSk7CisKKyAgICAgICAgLy8gQWRkIGEgYnVuY2ggb2YgbG9nZ2luZyBzdGF0ZW1lbnRzIC4uLgorICAgICAgICBsb2dnZXIxLmRlYnVnKCJIZWxsbywgbXkgbmFtZSBpcyBIb21lciBTaW1wc29uLiIpOworICAgICAgICBsb2dnZXIxLmRlYnVnKCJIZWxsbywgbXkgbmFtZSBpcyBMaXNhIFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlcjIuZGVidWcoIkhlbGxvLCBteSBuYW1lIGlzIE1hcmdlIFNpbXBzb24uIik7CisgICAgICAgIGxvZ2dlcjIuZGVidWcoIkhlbGxvLCBteSBuYW1lIGlzIEJhcnQgU2ltcHNvbi4iKTsKKyAgICAgICAgbG9nZ2VyMy5kZWJ1ZygiSGVsbG8sIG15IG5hbWUgaXMgTWFnZ2llIFNpbXBzb24uIik7CisKKyAgICAgICAgbG9nZ2VyMi5pbmZvKCJXZSBhcmUgdGhlIFNpbXBzb25zISIpOworICAgICAgICBsb2dnZXIyLmluZm8oIk1tbW1tbSAuLi4uIENob2NvbGF0ZS4iKTsKKyAgICAgICAgbG9nZ2VyMy5pbmZvKCJIb21lciBsaWtlcyBjaG9jb2xhdGUiKTsKKyAgICAgICAgbG9nZ2VyMy5pbmZvKCJEb2ghIik7CisgICAgICAgIGxvZ2dlcjMuaW5mbygiV2UgYXJlIHRoZSBTaW1wc29ucyEiKTsKKworICAgICAgICBsb2dnZXIxLndhcm4oIkJhcnQ6IEkgYW0gdGhyb3VnaCB3aXRoIHdvcmtpbmchIFdvcmtpbmcgaXMgZm9yIGNodW1wcyEiICsKKyAgICAgICAgICAgICAgICAiSG9tZXI6IFNvbiwgSSdtIHByb3VkIG9mIHlvdS4gSSB3YXMgdHdpY2UgeW91ciBhZ2UgYmVmb3JlICIgKworICAgICAgICAgICAgICAgICJJIGZpZ3VyZWQgdGhhdCBvdXQuIik7CisgICAgICAgIGxvZ2dlcjEud2FybigiTW1tLi4uZm9yYmlkZGVuIGRvbnV0LiIpOworICAgICAgICBsb2dnZXIxLndhcm4oIkQnb2ghIEEgZGVlciEgQSBmZW1hbGUgZGVlciEiKTsKKyAgICAgICAgbG9nZ2VyMS53YXJuKCJUcnVseSwgeW91cnMgaXMgYSBidXR0IHRoYXQgd29uJ3QgcXVpdC4iICsKKyAgICAgICAgICAgICAgICAiLSBCYXJ0LCB3cml0aW5nIGFzIFdvb2Ryb3cgdG8gTXMuIEtyYWJhcHBlbC4iKTsKKworICAgICAgICBsb2dnZXIyLmVycm9yKCJEZWFyIEJhYnksIFdlbGNvbWUgdG8gRHVtcHN2aWxsZS4gUG9wdWxhdGlvbjogeW91LiIpOworICAgICAgICBsb2dnZXIyLmVycm9yKCJEZWFyIEJhYnksIFdlbGNvbWUgdG8gRHVtcHN2aWxsZS4gUG9wdWxhdGlvbjogeW91LiIsCisgICAgICAgICAgICAgICAgbmV3IElPRXhjZXB0aW9uKCJEdW1wc3ZpbGxlLCBVU0EiKSk7CisgICAgICAgIGxvZ2dlcjMuZXJyb3IoIk1yLiBIdXR6LCBhcmUgeW91IGF3YXJlIHlvdSdyZSBub3Qgd2VhcmluZyBwYW50cz8iKTsKKyAgICAgICAgbG9nZ2VyMy5lcnJvcigiTXIuIEh1dHosIGFyZSB5b3UgYXdhcmUgeW91J3JlIG5vdCB3ZWFyaW5nIHBhbnRzPyIsCisgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXJyb3IgISEiKSk7CisKKworICAgICAgICBsb2dnZXIzLmZhdGFsKCJFZXAuIik7CisKKyAgICAgICAgbG9nZ2VyMy5mYXRhbCgiTW1tLi4uZm9yYmlkZGVuIGRvbnV0LiIsCisgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJGYXRhbCBFeGNlcHRpb24gLi4uICIpKTsKKworICAgICAgICBsb2dnZXIzLmZhdGFsKCJEJ29oISBBIGRlZXIhIEEgZmVtYWxlIGRlZXIhIik7CisgICAgICAgIGxvZ2dlcjIuZmF0YWwoIk1tbW1tbSAuLi4uIENob2NvbGF0ZS4iLAorICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiRmF0YWwgRXhjZXB0aW9uIikpOworCisgICAgICAgIC8vIFB1dCB0aGUgbWFpbiB0aHJlYWQgaXMgcHV0IHRvIHNsZWVwIGZvciA1IHNlY29uZHMgdG8gYWxsb3cgdGhlCisgICAgICAgIC8vIFNvY2tldFNlcnZlciB0byBwcm9jZXNzIGFsbCBpbmNvbWluZyBtZXNzYWdlcyBiZWZvcmUgdGhlIFNvY2tldCBpcworICAgICAgICAvLyBjbG9zZWQuIFRoaXMgaXMgZG9uZSB0byBvdmVyY29tZSBzb21lIGJhc2ljIGxpbWl0YXRpb25zIHdpdGggdGhlCisgICAgICAgIC8vIHdheSB0aGUgU29ja2V0U2VydmVyIGFuZCBTb2NrZXRBcHBlbmRlciBjbGFzc2VzIG1hbmFnZSBzb2NrZXRzLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MDAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJvdGVjdGVkIE1ldGhvZHM6CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgUHJpdmF0ZSBNZXRob2RzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIE5lc3RlZCBUb3AtTGV2ZWwgQ2xhc3NlcyBvciBJbnRlcmZhY2VzOgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGY1L1VzaW5nU29ja2V0QXBwZW5kZXJzL3NvY2tldGNsaWVudC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvbGY1L1VzaW5nU29ja2V0QXBwZW5kZXJzL3NvY2tldGNsaWVudC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTEzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9sZjUvVXNpbmdTb2NrZXRBcHBlbmRlcnMvc29ja2V0Y2xpZW50LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOCBAQAorIyBGb3IgdGhlIGdlbmVyYWwgc3ludGF4IG9mIHByb3BlcnR5IGJhc2VkIGNvbmZpZ3VyYXRpb24gZmlsZXMgc2VlIHRoZQorIyBkb2N1bWVuYXRpb24gb2Ygb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvci4KKworIyBUaGUgcm9vdCBjYXRlZ29yeSB1c2VzIHRoZSBhcHBlbmRlciBjYWxsZWQgQTEuIFNpbmNlIG5vIHByaW9yaXR5IGlzCisjIHNwZWNpZmllZCwgdGhlIHJvb3QgY2F0ZWdvcnkgYXNzdW1lcyB0aGUgZGVmYXVsdCBwcmlvcml0eSBmb3Igcm9vdAorIyB3aGljaCBpcyBERUJVRyBpbiBsb2c0ai4gVGhlIHJvb3QgY2F0ZWdvcnkgaXMgdGhlIG9ubHkgY2F0ZWdvcnkgdGhhdAorIyBoYXMgYSBkZWZhdWx0IHByaW9yaXR5LiBBbGwgb3RoZXIgY2F0ZWdvcmllcyBuZWVkIG5vdCBiZSBhc3NpZ25lZCBhCisjIHByaW9yaXR5IGluIHdoaWNoIGNhc2UgdGhleSBpbmhlcml0IHRoZWlyIHByaW9yaXR5IGZyb20gdGhlCisjIGhpZXJhcmNoeS4KKworbG9nNGoucm9vdENhdGVnb3J5PSwgQTEKKworIyBBMSBpcyBzZXQgdG8gYmUgYSBMRjVBcHBlbmRlciB3aGljaCBvdXRwdXRzIHRvIGEgc3dpbmcKKyMgbG9nZ2luZyBjb25zb2xlLiAKKyAgCitsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuQTEuUmVtb3RlSG9zdD1sb2NhbGhvc3QKK2xvZzRqLmFwcGVuZGVyLkExLlBvcnQ9ODg4NwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGY1L1VzaW5nU29ja2V0QXBwZW5kZXJzL3NvY2tldHNlcnZlci5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvbGY1L1VzaW5nU29ja2V0QXBwZW5kZXJzL3NvY2tldHNlcnZlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTRhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9sZjUvVXNpbmdTb2NrZXRBcHBlbmRlcnMvc29ja2V0c2VydmVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOSBAQAorIyBGb3IgdGhlIGdlbmVyYWwgc3ludGF4IG9mIHByb3BlcnR5IGJhc2VkIGNvbmZpZ3VyYXRpb24gZmlsZXMgc2VlIHRoZQorIyBkb2N1bWVuYXRpb24gb2Ygb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvci4KKworIyBUaGUgcm9vdCBjYXRlZ29yeSB1c2VzIHRoZSBhcHBlbmRlciBjYWxsZWQgQTEuIFNpbmNlIG5vIHByaW9yaXR5IGlzCisjIHNwZWNpZmllZCwgdGhlIHJvb3QgY2F0ZWdvcnkgYXNzdW1lcyB0aGUgZGVmYXVsdCBwcmlvcml0eSBmb3Igcm9vdAorIyB3aGljaCBpcyBERUJVRyBpbiBsb2c0ai4gVGhlIHJvb3QgY2F0ZWdvcnkgaXMgdGhlIG9ubHkgY2F0ZWdvcnkgdGhhdAorIyBoYXMgYSBkZWZhdWx0IHByaW9yaXR5LiBBbGwgb3RoZXIgY2F0ZWdvcmllcyBuZWVkIG5vdCBiZSBhc3NpZ25lZCBhCisjIHByaW9yaXR5IGluIHdoaWNoIGNhc2UgdGhleSBpbmhlcml0IHRoZWlyIHByaW9yaXR5IGZyb20gdGhlCisjIGhpZXJhcmNoeS4KKworI2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgQTEKK2xvZzRqLnJvb3RDYXRlZ29yeT0sIEExCisKKyMgQTEgaXMgc2V0IHRvIGJlIGEgTEY1QXBwZW5kZXIgd2hpY2ggb3V0cHV0cyB0byBhIHN3aW5nCisjIGxvZ2dpbmcgY29uc29sZS4gCisKKyNsb2c0ai5jYXRlZ29yeS5vcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXROb2RlPURFQlVHCitsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLmxmNS5MRjVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuQTEuTWF4TnVtYmVyT2ZSZWNvcmRzPTcwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2xmNS9pbmRleC5odG1sIGIvZXhhbXBsZXMvbGY1L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzOTc1MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2xmNS9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKyAgPGhlYWQ+CisgIDwvaGVhZD4gCisgIDxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiPgorIAorICAgIDxwPlNlZSA8YSBocmVmPSIuLi8uLi9kb2NzL2xmNS9leGFtcGxlcy5odG1sIj5FeGFtcGxlczwvYT4KKyAgICBzZWN0aW9uIGluIHRoZSBMb2dGYWN0b3I1IHVzZXIgZ3VpZGUuCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9teWNhdC5iYWQgYi9leGFtcGxlcy9teWNhdC5iYWQKaW5kZXggODZlZjk0Mi4uZmNmZGM2MSAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvbXljYXQuYmFkCisrKyBiL2V4YW1wbGVzL215Y2F0LmJhZApAQCAtMSwxNiArMSwxOCBAQAogCiAjIFRoZSB1c3VhbCBzdHVmZi4gTm90ZSB0aGF0IEExIGlzIGNvbmZpZ3VyZWQgaW4gcm9vdCBub3QgaW4gInNvbWUuY2F0IgotbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLCBBMQorbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgQTEKIGxvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCiAKIGxvZzRqLmFwcGVuZGVyLkExLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKIGxvZzRqLmFwcGVuZGVyLkExLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lNXAgWyV0XSAlYyAtICVtJW4KIAogIyBTZXQgdGhlIHByaW9yaXR5IG9mICJzb21lLmNhdCIgdG8gVFJBQ0UgKGRlZmluZWQgaW4KLSMgb3JnLmFwYWNoZS5sb2c0ai54bWwuZXhhbXBsZXMuWFByaW9yaXR5KS4gVGhpcyB3aWxsIGFjdHVhbGx5IGhhdmUKLSMgdGhlIHNpZGUgZWZmZWN0IG9mIGluc3RhbmNpYXRpbmcgYSBjYXRlZ29yeSBvYmplY3QgaGF2aW5nIHRoZSBuYW1lCi0jICJzb21lLmNhdCIgdGhpcyB3aWxsIGNhdXNlIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBjYXRlZ29yeQotIyBvYmplY3QgaXMgY2FzdCBhcyBhIE15Q2F0ZWdvcnkgb2JqZWN0LgorIyBleGFtcGxlcy5jdXN0b21MZXZlbC5YTGV2ZWwpLiBUaGlzIHdpbGwgYWN0dWFsbHkgaGF2ZSB0aGUgc2lkZQorIyBlZmZlY3Qgb2YgaW5zdGFuY2lhdGluZyBhIGxvZ2dlciBvYmplY3QgaGF2aW5nIHRoZSBuYW1lICJzb21lLmNhdCIKKyMgdGhpcyB3aWxsIGNhdXNlIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBsb2dnZXIgb2JqZWN0IGlzIGNhc3QKKyMgYXMgYSBNeUxvZ2dlciBvYmplY3QuCiAKLWxvZzRqLmNhdGVnb3J5LnNvbWUuY2F0PVRSQUNFI29yZy5hcGFjaGUubG9nNGoueG1sLmV4YW1wbGVzLlhQcmlvcml0eQorbG9nNGoubG9nZ2VyLnNvbWUuY2F0PVRSQUNFI2V4YW1wbGVzLmN1c3RvbUxldmVsLlhMZXZlbAorCisKIApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbXljYXQuZ29vZCBiL2V4YW1wbGVzL215Y2F0Lmdvb2QKaW5kZXggNmQwODEzNi4uYzJlMDJlZSAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvbXljYXQuZ29vZAorKysgYi9leGFtcGxlcy9teWNhdC5nb29kCkBAIC0xLDEzICsxLDEzIEBACi0jIFNldHRpbmcgdGhlIGNhdGVnb3J5IGZhY3RvcnkgdG8gTXlDYXRlZ29yeUZhY3Rvcnkgc29sdmVzIHRoZQorIyBTZXR0aW5nIHRoZSBsb2dnZXIgZmFjdG9yeSB0byBNeUxvZ2dlckZhY3Rvcnkgc29sdmVzIHRoZQogIyBDbGFzc0Nhc3RFeGNlcHRpb24gcHJvYmxlbSBlbmNvdW50ZXJlZCB3aXRoIHRoZSAibXljYXQuYmFkIgogIyBjb25maWd1cmF0aW9uIGZpbGUuCiAKLWxvZzRqLmNhdGVnb3J5RmFjdG9yeT1vcmcuYXBhY2hlLmxvZzRqLmV4YW1wbGVzLk15Q2F0ZWdvcnlGYWN0b3J5Citsb2c0ai5sb2dnZXJGYWN0b3J5PWV4YW1wbGVzLnN1YmNsYXNzLk15TG9nZ2VyRmFjdG9yeQogCiAKICMgVGhlIHVzdWFsIHN0dWZmLiBOb3RlIHRoYXQgQTEgaXMgY29uZmlndXJlZCBpbiByb290IG5vdCBpbiAic29tZS5jYXQiCiAKLWxvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgQTEKK2xvZzRqLnJvb3RMb2dnZXI9REVCVUcsIEExCiBsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgogCiBsb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0CkBAIC0xNSwxMCArMTUsMTAgQEAKIAogCiAjIFNldCB0aGUgcHJpb3JpdHkgb2YgInNvbWUuY2F0IiB0byBUUkFDRSAoZGVmaW5lZCBpbgotIyBvcmcuYXBhY2hlLmxvZzRqLnhtbC5leGFtcGxlcy5YUHJpb3JpdHkpLiBTaW5jZSB3ZSBzcGVjaWZpZWQKLSMgTXlDYXRlZ29yeUZhY3RvcnkgYXMgdGhlIGNhdGVnb3J5IGZhY3RvcnksIHRoZSBmb2xsb3dpbmcgbGluZSB3aWxsbAotIyBhbHNvIGhhdmUgdGhlIHNpZGUgZWZmZWN0IG9mIGluc3RhbmNpYXRpbmcgYSBNeUNhdGVnb3J5IG9iamVjdAotIyBoYXZpbmcgdGhlIG5hbWUgInNvbWUuY2F0Ii4KKyMgZXhhbXBsZXMuY3VzdG9tTGV2ZWwuWExldmVsKS4gU2luY2Ugd2Ugc3BlY2lmaWVkIE15TG9nZ2VyRmFjdG9yeSBhcworIyB0aGUgbG9nZ2VyIGZhY3RvcnksIHRoZSBmb2xsb3dpbmcgbGluZSB3aWxsbCBhbHNvIGhhdmUgdGhlIHNpZGUKKyMgZWZmZWN0IG9mIGluc3RhbmNpYXRpbmcgYSBNeUxvZ2dlciBvYmplY3QgaGF2aW5nIHRoZSBuYW1lCisjICJzb21lLmNhdCIuCiAKLWxvZzRqLmNhdGVnb3J5LnNvbWUuY2F0PVRSQUNFI29yZy5hcGFjaGUubG9nNGoueG1sLmV4YW1wbGVzLlhQcmlvcml0eQorbG9nNGoubG9nZ2VyLnNvbWUuY2F0PVRSQUNFI2V4YW1wbGVzLmN1c3RvbUxldmVsLlhMZXZlbAogCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zdWJjbGFzcy9NeUxvZ2dlci5qYXZhIGIvZXhhbXBsZXMvc3ViY2xhc3MvTXlMb2dnZXIuamF2YQppbmRleCBlOTFjNDZmLi41MjFkZWE1IDEwMDY0NAotLS0gYS9leGFtcGxlcy9zdWJjbGFzcy9NeUxvZ2dlci5qYXZhCisrKyBiL2V4YW1wbGVzL3N1YmNsYXNzL015TG9nZ2VyLmphdmEKQEAgLTUwLDE2ICs1MCw2IEBACiAgIH0KIAogICAvKioKLSAgICAgVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHtAbGluayBMb2dnZXIjZ2V0SW5zdGFuY2V9IGJ5IHN1cHBseWluZwotICAgICBpdHMgb3duIGZhY3RvcnkgdHlwZSBhcyBhIHBhcmFtZXRlci4KLSAgKi8KLSAgcHVibGljIAotICBzdGF0aWMKLSAgQ2F0ZWdvcnkgZ2V0SW5zdGFuY2UoU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gTG9nZ2VyLmdldExvZ2dlcihuYW1lLCBteUZhY3RvcnkpOyAKLSAgfQotICAKLSAgLyoqCiAgICAgIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB7QGxpbmsgTG9nZ2VyI2dldExvZ2dlcn0gYnkgc3VwcGx5aW5nCiAgICAgIGl0cyBvd24gZmFjdG9yeSB0eXBlIGFzIGEgcGFyYW1ldGVyLgogICAqLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3ViY2xhc3MvTXlMb2dnZXJUZXN0LmphdmEgYi9leGFtcGxlcy9zdWJjbGFzcy9NeUxvZ2dlclRlc3QuamF2YQppbmRleCA0ZjFmZmExLi41YzY5ZGVhIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zdWJjbGFzcy9NeUxvZ2dlclRlc3QuamF2YQorKysgYi9leGFtcGxlcy9zdWJjbGFzcy9NeUxvZ2dlclRlc3QuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogICAgICAgdXNhZ2UoIkluY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycy4iKTsKICAgICB9CiAgICAgdHJ5IHsKLSAgICAgIE15TG9nZ2VyIGMgPSAoTXlMb2dnZXIpIE15TG9nZ2VyLmdldEluc3RhbmNlKCJzb21lLmNhdCIpOyAgICAKKyAgICAgIE15TG9nZ2VyIGMgPSAoTXlMb2dnZXIpIE15TG9nZ2VyLmdldExvZ2dlcigic29tZS5jYXQiKTsgICAgCiAgICAgICBjLnRyYWNlKCJIZWxsbyIpOwogICAgICAgYy5kZWJ1ZygiSGVsbG8iKTsKICAgICB9IGNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0FwcGVuZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0FwcGVuZGVyLmphdmEKaW5kZXggMzY0MjgxMS4uYWE4YTMxMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9BcHBlbmRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovQXBwZW5kZXIuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogICAvKioKICAgICAgU2V0IHRoZSB7QGxpbmsgRXJyb3JIYW5kbGVyfSBmb3IgdGhpcyBhcHBlbmRlci4KIAotICAgICBAIHNpbmNlIDAuOS4wCisgICAgIEBzaW5jZSAwLjkuMAogICAgKi8KICAgcHVibGljCiAgIHZvaWQgc2V0RXJyb3JIYW5kbGVyKEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9BcHBlbmRlclNrZWxldG9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0FwcGVuZGVyU2tlbGV0b24uamF2YQppbmRleCBjYWY5NWJhLi5kODE1ZmNkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0FwcGVuZGVyU2tlbGV0b24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0FwcGVuZGVyU2tlbGV0b24uamF2YQpAQCAtMTcsMTMgKzE3LDE0IEBACiAKIAogLyoqIAotICAgQWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiB0aGUgb3RoZXIgYXBwZW5kZXJzIGluIHRoZSBwYWNrYWdlLgotICAgCi0gICBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBjb2RlIGZvciBjb21tb24gZnVuY3Rpb25hbGl0eSwgc3VjaCBhcwotICAgc3VwcG9ydCBmb3IgdGhyZXNob2xkIGZpbHRlcmluZyBhbmQgc3VwcG9ydCBmb3IgZ2VuZXJhbCBmaWx0ZXJzLgotCi0gICBAc2luY2UgMC44LjEKLSAgIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdXVtbDsgKi8KKyAqIEFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgdGhlIG90aGVyIGFwcGVuZGVycyBpbiB0aGUgcGFja2FnZS4KKyAqICAKKyAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBjb2RlIGZvciBjb21tb24gZnVuY3Rpb25hbGl0eSwgc3VjaCBhcworICogIHN1cHBvcnQgZm9yIHRocmVzaG9sZCBmaWx0ZXJpbmcgYW5kIHN1cHBvcnQgZm9yIGdlbmVyYWwgZmlsdGVycy4KKyAqCisgKiBAc2luY2UgMC44LjEKKyAqIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdXVtbDsgCisgKiAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFwcGVuZGVyU2tlbGV0b24gaW1wbGVtZW50cyBBcHBlbmRlciwgT3B0aW9uSGFuZGxlciB7CiAKICAgLyoqIFRoZSBsYXlvdXQgdmFyaWFibGUgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQgaWYgdGhlIGFwcGVuZGVyCkBAIC05OSwxMSArMTAwLDEwIEBACiAgIH0KIAogICAvKioKLSAgICAgRmluYWxpemUgdGhpcyBhcHBlbmRlciBieSBjYWxsaW5nIHRoZSBpbWxlbmVudGF0aW9uJ3MKKyAgICAgRmluYWxpemUgdGhpcyBhcHBlbmRlciBieSBjYWxsaW5nIHRoZSBkZXJpdmVkIGNsYXNzJwogICAgICA8Y29kZT5jbG9zZTwvY29kZT4gbWV0aG9kLgogCi0gICAgIEBzaW5jZSAwLjguNAotICAqLworICAgICBAc2luY2UgMC44LjQgKi8KICAgcHVibGljCiAgIHZvaWQgZmluYWxpemUoKSB7CiAgICAgLy8gQW4gYXBwZW5kZXIgbWlnaHQgYmUgY2xvc2VkIHRoZW4gZ2FyYmFnZSBjb2xsZWN0ZWQuIFRoZXJlIGlzIG5vCkBAIC0xOTEsMTEgKzE5MSwxMCBAQAogCiAKICAgLyoqCi0gICAgIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRocmVzaG9sZCBjaGVja3MgYW5kIGludm9rZXMgZmlsdGVycyBiZWZvcmUKLSAgICAgZGVsZWdhdGluZyBhY3R1YWwgbG9nZ2luZyB0byB0aGUgc3ViY2xhc3NlcyBzcGVjaWZpYyB7QGxpbmsKLSAgICAgQXBwZW5kZXJTa2VsZXRvbiNhcHBlbmR9IG1ldGhvZC4KLQotICAgKi8KKyAgICAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRocmVzaG9sZCBjaGVja3MgYW5kIGludm9rZXMgZmlsdGVycyBiZWZvcmUKKyAgICAqIGRlbGVnYXRpbmcgYWN0dWFsIGxvZ2dpbmcgdG8gdGhlIHN1YmNsYXNzZXMgc3BlY2lmaWMge0BsaW5rCisgICAgKiBBcHBlbmRlclNrZWxldG9uI2FwcGVuZH0gbWV0aG9kLgorICAgICogKi8KICAgcHVibGljCiAgIHN5bmNocm9uaXplZCAKICAgdm9pZCBkb0FwcGVuZChMb2dnaW5nRXZlbnQgZXZlbnQpIHsKQEAgLTIwNCw3ICsyMDMsNyBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgICAKLSAgICBpZighaXNBc1NldmVyZUFzVGhyZXNob2xkKGV2ZW50LmxldmVsKSkgeworICAgIGlmKCFpc0FzU2V2ZXJlQXNUaHJlc2hvbGQoZXZlbnQuZ2V0TGV2ZWwoKSkpIHsKICAgICAgIHJldHVybjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovQXN5bmNBcHBlbmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Bc3luY0FwcGVuZGVyLmphdmEKaW5kZXggZTlmYjdkNi4uMzNiYzA2MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Bc3luY0FwcGVuZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Bc3luY0FwcGVuZGVyLmphdmEKQEAgLTMzLDExICszMyw3IEBACiAKICAgIDxwPjxiPkltcG9ydGFudCBub3RlOjwvYj4gVGhlIDxjb2RlPkFzeW5jQXBwZW5kZXI8L2NvZGU+IGNhbiBvbmx5CiAgICBiZSBzY3JpcHQgY29uZmlndXJlZCB1c2luZyB0aGUge0BsaW5rCi0gICBvcmcuYXBhY2hlLmxvZzRqLnhtbC5ET01Db25maWd1cmF0b3J9LiBSZWZlciB0byBleGFtcGxlICBjb25maWd1cmF0aW9uCi0gICBmaWxlcyA8YSBocmVmPSJ4bWwvZXhhbXBsZXMvZG9jLWZpbGVzL3NhbXBsZTQueG1sIj5zYW1wbGU0LnhtbDwvYT4KLSAgIGFuZCA8YSBocmVmPSJ4bWwvZXhhbXBsZXMvZG9jLWZpbGVzL3NhbXBsZTUueG1sIj5zYW1wbGU1LnhtbDwvYT4uCi0KLQorICAgb3JnLmFwYWNoZS5sb2c0ai54bWwuRE9NQ29uZmlndXJhdG9yfS4KIAogICAgQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOwogICAgQHNpbmNlIDAuOS4xICovCkBAIC01Nyw4ICs1Myw3IEBACiAKICAgYm9vbGVhbiBpbnRlcnJ1cHRlZFdhcm5pbmdNZXNzYWdlID0gZmFsc2U7CiAKLSAgcHVibGljCi0gIEFzeW5jQXBwZW5kZXIoKSB7CisgIHB1YmxpYyBBc3luY0FwcGVuZGVyKCkgewogICAgIC8vIE5vdGU6IFRoZSBkaXNwYXRjaGVyIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBhYWkgaXMgc2V0IG9uY2UgYW5kCiAgICAgLy8gZm9yIGFsbC4KICAgICBhYWkgPSBuZXcgQXBwZW5kZXJBdHRhY2hhYmxlSW1wbCgpOwpAQCAtNjcsMTUgKzYyLDEzIEBACiAgIH0KIAogCi0gIHB1YmxpYwotICB2b2lkIGFkZEFwcGVuZGVyKEFwcGVuZGVyIG5ld0FwcGVuZGVyKSB7CisgIHB1YmxpYyB2b2lkIGFkZEFwcGVuZGVyKEFwcGVuZGVyIG5ld0FwcGVuZGVyKSB7CiAgICAgc3luY2hyb25pemVkKGFhaSkgewogICAgICAgYWFpLmFkZEFwcGVuZGVyKG5ld0FwcGVuZGVyKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMKLSAgdm9pZCBhcHBlbmQoTG9nZ2luZ0V2ZW50IGV2ZW50KSB7CisgIHB1YmxpYyB2b2lkIGFwcGVuZChMb2dnaW5nRXZlbnQgZXZlbnQpIHsKICAgICAvLyBTZXQgdGhlIE5EQyBhbmQgdGhyZWFkIG5hbWUgZm9yIHRoZSBjYWxsaW5nIHRocmVhZCBhcyB0aGVzZQogICAgIC8vIExvZ2dpbmdFdmVudCBmaWVsZHMgd2VyZSBub3Qgc2V0IGF0IGV2ZW50IGNyZWF0aW9uIHRpbWUuCiAgICAgZXZlbnQuZ2V0TkRDKCk7CkBAIC0xMTQsOCArMTA3LDcgQEAKICAgICAgZGlzcGF0Y2hlciB0aHJlYWQgd2hpY2ggd2lsbCBwcm9jZXNzIGFsbCBwZW5kaW5nIGV2ZW50cyBiZWZvcmUKICAgICAgZXhpdGluZy4KICAgKi8KLSAgcHVibGljCi0gIHZvaWQgY2xvc2UoKSB7CisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CiAgICAgICAvLyBhdm9pZCBtdWx0aXBsZSBjbG9zZSwgb3RoZXJ3aXNlIG9uZSBnZXRzIE51bGxQb2ludGVyRXhjZXB0aW9uCiAgICAgICBpZihjbG9zZWQpIHsgCkBAIC0xMzksMTUgKzEzMSwxMyBAQAogICAgIGJmID0gbnVsbDsKICAgfQogCi0gIHB1YmxpYwotICBFbnVtZXJhdGlvbiBnZXRBbGxBcHBlbmRlcnMoKSB7CisgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBbGxBcHBlbmRlcnMoKSB7CiAgICAgc3luY2hyb25pemVkKGFhaSkgewogICAgICAgcmV0dXJuIGFhaS5nZXRBbGxBcHBlbmRlcnMoKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMKLSAgQXBwZW5kZXIgZ2V0QXBwZW5kZXIoU3RyaW5nIG5hbWUpIHsKKyAgcHVibGljIEFwcGVuZGVyIGdldEFwcGVuZGVyKFN0cmluZyBuYW1lKSB7CiAgICAgc3luY2hyb25pemVkKGFhaSkgewogICAgICAgcmV0dXJuIGFhaS5nZXRBcHBlbmRlcihuYW1lKTsKICAgICB9CkBAIC0xNTYsODkgKzE0Niw4MCBAQAogICAvKioKICAgICAgUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgPGI+TG9jYXRpb25JbmZvPC9iPiBvcHRpb24uCiAgICovCi0gIHB1YmxpYwotICBib29sZWFuIGdldExvY2F0aW9uSW5mbygpIHsKKyAgcHVibGljIGJvb2xlYW4gZ2V0TG9jYXRpb25JbmZvKCkgewogICAgIHJldHVybiBsb2NhdGlvbkluZm87CiAgIH0KIAogICAvKioKICAgICAgSXMgdGhlIGFwcGVuZGVyIHBhc3NlZCBhcyBwYXJhbWV0ZXIgYXR0YWNoZWQgdG8gdGhpcyBjYXRlZ29yeT8KICAgICovCi0gIHB1YmxpYwotICBib29sZWFuIGlzQXR0YWNoZWQoQXBwZW5kZXIgYXBwZW5kZXIpIHsKKyAgcHVibGljIGJvb2xlYW4gaXNBdHRhY2hlZChBcHBlbmRlciBhcHBlbmRlcikgewogICAgIHJldHVybiBhYWkuaXNBdHRhY2hlZChhcHBlbmRlcik7CiAgIH0KIAogCiAgIC8qKgogICAgICBUaGUgPGNvZGU+QXN5bmNBcHBlbmRlcjwvY29kZT4gZG9lcyBub3QgcmVxdWlyZSBhIGxheW91dC4gSGVuY2UsCi0gICAgIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4gKi8KLSAgcHVibGljCi0gIGJvb2xlYW4gcmVxdWlyZXNMYXlvdXQoKSB7CisgICAgIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4gCisgICovCisgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzTGF5b3V0KCkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHB1YmxpYwotICB2b2lkIHJlbW92ZUFsbEFwcGVuZGVycygpIHsKKyAgcHVibGljIHZvaWQgcmVtb3ZlQWxsQXBwZW5kZXJzKCkgewogICAgIHN5bmNocm9uaXplZChhYWkpIHsKICAgICAgIGFhaS5yZW1vdmVBbGxBcHBlbmRlcnMoKTsKICAgICB9CiAgIH0KIAogCi0gIHB1YmxpYwotICB2b2lkIHJlbW92ZUFwcGVuZGVyKEFwcGVuZGVyIGFwcGVuZGVyKSB7CisgIHB1YmxpYyB2b2lkIHJlbW92ZUFwcGVuZGVyKEFwcGVuZGVyIGFwcGVuZGVyKSB7CiAgICAgc3luY2hyb25pemVkKGFhaSkgewogICAgICAgYWFpLnJlbW92ZUFwcGVuZGVyKGFwcGVuZGVyKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMKLSAgdm9pZCByZW1vdmVBcHBlbmRlcihTdHJpbmcgbmFtZSkgeworICBwdWJsaWMgdm9pZCByZW1vdmVBcHBlbmRlcihTdHJpbmcgbmFtZSkgewogICAgIHN5bmNocm9uaXplZChhYWkpIHsKICAgICAgIGFhaS5yZW1vdmVBcHBlbmRlcihuYW1lKTsKICAgICB9CiAgIH0KIAogICAvKioKLSAgICAgVGhlIDxiPkxvY2F0aW9uSW5mbzwvYj4gb3B0aW9uIHRha2VzIGEgYm9vbGVhbiB2YWx1ZS4gQnkKLSAgICAgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIGZhbHNlIHdoaWNoIG1lYW5zIHRoZXJlIHdpbGwgYmUgbm8gZWZmb3J0Ci0gICAgIHRvIGV4dHJhY3QgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGV2ZW50LiBBcyBhCi0gICAgIHJlc3VsdCwgdGhlIGV2ZW50IHRoYXQgd2lsbCBiZSB1bHRpbWF0ZWx5IGxvZ2dlZCB3aWxsIGxpa2VseSB0bwotICAgICBjb250YWluIHRoZSB3cm9uZyBsb2NhdGlvbiBpbmZvcm1hdGlvbiAoaWYgcHJlc2VudCBpbiB0aGUgbG9nCi0gICAgIGZvcm1hdCkuCi0KLSAgICAgPHA+TG9jYXRpb24gaW5mb3JtYXRpb24gZXh0cmFjdGlvbiBpcyBjb21wYXJhdGl2ZWx5IHZlcnkgc2xvdyBhbmQKLSAgICAgc2hvdWxkIGJlIGF2b2lkZWQgdW5sZXNzIHBlcmZvcm1hbmNlIGlzIG5vdCBhIGNvbmNlcm4uCi0gICAqLwotICBwdWJsaWMKLSAgdm9pZCBzZXRMb2NhdGlvbkluZm8oYm9vbGVhbiBmbGFnKSB7CisgICAqIFRoZSA8Yj5Mb2NhdGlvbkluZm88L2I+IG9wdGlvbiB0YWtlcyBhIGJvb2xlYW4gdmFsdWUuIEJ5IGRlZmF1bHQsCisgICAqIGl0IGlzIHNldCB0byBmYWxzZSB3aGljaCBtZWFucyB0aGVyZSB3aWxsIGJlIG5vIGVmZm9ydCB0byBleHRyYWN0CisgICAqIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBldmVudC4gQXMgYSByZXN1bHQsIHRoZQorICAgKiBldmVudCB0aGF0IHdpbGwgYmUgdWx0aW1hdGVseSBsb2dnZWQgd2lsbCBsaWtlbHkgdG8gY29udGFpbiB0aGUKKyAgICogd3JvbmcgbG9jYXRpb24gaW5mb3JtYXRpb24gKGlmIHByZXNlbnQgaW4gdGhlIGxvZyBmb3JtYXQpLgorICAgKgorICAgKiA8cD5Mb2NhdGlvbiBpbmZvcm1hdGlvbiBleHRyYWN0aW9uIGlzIGNvbXBhcmF0aXZlbHkgdmVyeSBzbG93IGFuZAorICAgKiBzaG91bGQgYmUgYXZvaWRlZCB1bmxlc3MgcGVyZm9ybWFuY2UgaXMgbm90IGEgY29uY2Vybi4KKyAgICogKi8KKyAgcHVibGljIHZvaWQgc2V0TG9jYXRpb25JbmZvKGJvb2xlYW4gZmxhZykgewogICAgIGxvY2F0aW9uSW5mbyA9IGZsYWc7CiAgIH0KIAogCiAgIC8qKgotICAgICBUaGUgPGI+QnVmZmVyU2l6ZTwvYj4gb3B0aW9uIHRha2VzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIKLSAgICAgdmFsdWUuICBUaGlzIGludGVnZXIgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZQotICAgICBib3VuZGVkIGJ1ZmZlci4gSW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlzIGFsd2F5cwotICAgICBzYWZlLiBIb3dldmVyLCBpZiBhbiBleGlzdGluZyBidWZmZXIgaG9sZHMgdW53cml0dGVuIGVsZW1lbnRzLAotICAgICB0aGVuIDxlbT5kZWNyZWFzaW5nIHRoZSBidWZmZXIgc2l6ZSB3aWxsIHJlc3VsdCBpbiBldmVudAotICAgICBsb3NzLjwvZW0+IE5ldmVydGhlbGVzcywgd2hpbGUgc2NyaXB0IGNvbmZpZ3VyaW5nIHRoZQotICAgICBBc3luY0FwcGVuZGVyLCBpdCBpcyBzYWZlIHRvIHNldCBhIGJ1ZmZlciBzaXplIHNtYWxsZXIgdGhhbiB0aGUKLSAgICAge0BsaW5rICNERUZBVUxUX0JVRkZFUl9TSVpFIGRlZmF1bHQgYnVmZmVyIHNpemV9IGJlY2F1c2UKLSAgICAgY29uZmlndXJhdG9ycyBndWFyYW50ZWUgdGhhdCBhbiBhcHBlbmRlciBjYW5ub3QgYmUgdXNlZCBiZWZvcmUKLSAgICAgYmVpbmcgY29tcGxldGVseSBjb25maWd1cmVkLgotICAgKi8KLSAgcHVibGljCi0gIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgc2l6ZSkgeworICAgKiBUaGUgPGI+QnVmZmVyU2l6ZTwvYj4gb3B0aW9uIHRha2VzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdmFsdWUuCisgICAqIFRoaXMgaW50ZWdlciB2YWx1ZSBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGJvdW5kZWQKKyAgICogYnVmZmVyLiBJbmNyZWFzaW5nIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXMgYWx3YXlzCisgICAqIHNhZmUuIEhvd2V2ZXIsIGlmIGFuIGV4aXN0aW5nIGJ1ZmZlciBob2xkcyB1bndyaXR0ZW4gZWxlbWVudHMsCisgICAqIHRoZW4gPGVtPmRlY3JlYXNpbmcgdGhlIGJ1ZmZlciBzaXplIHdpbGwgcmVzdWx0IGluIGV2ZW50CisgICAqIGxvc3MuPC9lbT4gTmV2ZXJ0aGVsZXNzLCB3aGlsZSBzY3JpcHQgY29uZmlndXJpbmcgdGhlCisgICAqIEFzeW5jQXBwZW5kZXIsIGl0IGlzIHNhZmUgdG8gc2V0IGEgYnVmZmVyIHNpemUgc21hbGxlciB0aGFuIHRoZQorICAgKiB7QGxpbmsgI0RFRkFVTFRfQlVGRkVSX1NJWkUgZGVmYXVsdCBidWZmZXIgc2l6ZX0gYmVjYXVzZQorICAgKiBjb25maWd1cmF0b3JzIGd1YXJhbnRlZSB0aGF0IGFuIGFwcGVuZGVyIGNhbm5vdCBiZSB1c2VkIGJlZm9yZQorICAgKiBiZWluZyBjb21wbGV0ZWx5IGNvbmZpZ3VyZWQuICAKKyAgICogKi8KKyAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgc2l6ZSkgewogICAgIGJmLnJlc2l6ZShzaXplKTsKICAgfQogCiAgIC8qKgogICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSA8Yj5CdWZmZXJTaXplPC9iPiBvcHRpb24uCiAgICAqLwotICBwdWJsaWMKLSAgaW50IGdldEJ1ZmZlclNpemUoKSB7CisgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyU2l6ZSgpIHsKICAgICByZXR1cm4gYmYuZ2V0TWF4U2l6ZSgpOwogICB9CiAKQEAgLTI1NiwxMCArMjM3LDE0IEBACiAgIERpc3BhdGNoZXIoQm91bmRlZEZJRk8gYmYsIEFzeW5jQXBwZW5kZXIgY29udGFpbmVyKSB7CiAgICAgdGhpcy5iZiA9IGJmOwogICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotICAgIHRoaXMuYWFpID0gY29udGFpbmVyLmFhaTsKKyAgICB0aGlzLmFhaSA9IGNvbnRhaW5lci5hYWk7ICAgIAorICAgIC8vIEl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2xvc2UgYXBwZW5kZXJzIGJlZm9yZQorICAgIC8vIGV4aXRpbmcuIAorICAgIHRoaXMuc2V0RGFlbW9uKHRydWUpOwogICAgIC8vIHNldCB0aGUgZGlzcGF0Y2hlciBwcmlvcml0eSB0byBsb3dlc3QgcG9zc2libGUgdmFsdWUKICAgICB0aGlzLnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkpOwogICAgIHRoaXMuc2V0TmFtZSgiRGlzcGF0Y2hlci0iK2dldE5hbWUoKSk7CisKICAgICAvLyBzZXQgdGhlIGRpc3BhdGNoZXIgcHJpb3JpdHkgdG8gTUlOX1BSSU9SSVRZIHBsdXMgb3IgbWludXMgMgogICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uIG9mIE1JTiB0byBNQVhfUFJJT1JJVFkuCiAgICAgLy8rIChUaHJlYWQuTUFYX1BSSU9SSVRZID4gVGhyZWFkLk1JTl9QUklPUklUWSA/IDEgOiAtMSkqMik7CkBAIC0yODksOCArMjc0LDcgQEAKICAgICA8cD5PdGhlciBhcHByb2FjaGVzIG1pZ2h0IHlpZWxkIGJldHRlciByZXN1bHRzLgogCiAgICovCi0gIHB1YmxpYwotICB2b2lkIHJ1bigpIHsKKyAgcHVibGljIHZvaWQgcnVuKCkgewogCiAgICAgLy9DYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShEaXNwYXRjaGVyLmNsYXNzLmdldE5hbWUoKSk7CiAKQEAgLTMwMiw3ICsyODYsNyBAQAogCSAgLy8gRXhpdCBsb29wIGlmIGludGVycnVwdGVkIGJ1dCBvbmx5IGlmIHRoZSB0aGUgYnVmZmVyIGlzIGVtcHR5LgogCSAgaWYoaW50ZXJydXB0ZWQpIHsKIAkgICAgLy9jYXQuaW5mbygiRXhpdGluZy4iKTsKLQkgICAgcmV0dXJuOworCSAgICBicmVhazsKIAkgIH0KIAkgIHRyeSB7CiAJICAgIC8vTG9nTG9nLmRlYnVnKCJXYWl0aW5nIGZvciBuZXcgZXZlbnQgdG8gZGlzcGF0Y2guIik7CkBAIC0zMjcsNSArMzExLDggQEAKIAl9CiAgICAgICB9CiAgICAgfSAvLyB3aGlsZQorICAgIAorICAgIC8vIGNsb3NlIGFuZCByZW1vdmUgYWxsIGFwcGVuZGVycworICAgIGFhaS5yZW1vdmVBbGxBcHBlbmRlcnMoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9DYXRlZ29yeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9DYXRlZ29yeS5qYXZhCmluZGV4IDExMGI4NmQuLmQ5ZDhmMWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovQ2F0ZWdvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0NhdGVnb3J5LmphdmEKQEAgLTMzLDQwICszMyw0NyBAQAogCiAKIC8qKgotICAgPGZvbnQgY29sb3I9IiNBQTIyMjIiPjxiPlRoaXMgY2xhc3MgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQKLSAgIHJlcGxhY2VkIGJ5IHRoZSB7QGxpbmsgTG9nZ2VyfSA8ZW0+c3ViY2xhc3M8L2VtPi48L2I+PC9mb250PiBJdAotICAgd2lsbCBiZSBrZXB0IGFyb3VuZCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHVudGlsIG1pZAotICAgMjAwMy4KLQotICAgPHA+PGNvZGU+TG9nZ2VyPC9jb2RlPiBpcyBhIHN1YmNsYXNzIG9mIENhdGVnb3J5LCBpLmUuIGl0IGV4dGVuZHMKLSAgIENhdGVnb3J5LiBJbiBvdGhlciB3b3JkcywgYSBsb2dnZXIgPGVtPmlzPC9lbT4gYSBjYXRlZ29yeS4gVGh1cywKLSAgIGFsbCBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhIGNhdGVnb3J5IGNhbiBiZSBwZXJmb3JtZWQKLSAgIG9uIGEgbG9nZ2VyLiBXaGVuZXZlciBsb2c0aiBpcyBhc2tlZCB0byBwcm9kdWNlIGEgQ2F0ZWdvcnkgb2JqZWN0LAotICAgaXQgd2lsbCBpbnN0ZWFkIHByb2R1Y2UgYSBMb2dnZXIgb2JqZWN0LiBIb3dldmVyLCBtZXRob2RzIHRoYXQKLSAgIHByZXZpb3VzbHkgYWNjZXB0ZWQgY2F0ZWdvcnkgb2JqZWN0cyBzdGlsbCBjb250aW51ZSB0byBhY2NlcHQKLSAgIGNhdGVnb3J5IG9iamVjdHMuCi0KLSAgIDxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFyZSBhbGwgbGVnYWwgYW5kIHdpbGwgd29yayBhcyBleHBlY3RlZC4KLQorICAqIDxmb250IGNvbG9yPSIjQUEyMjIyIj48Yj5UaGlzIGNsYXNzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kCisgICogcmVwbGFjZWQgYnkgdGhlIHtAbGluayBMb2dnZXJ9IDxlbT5zdWJjbGFzczwvZW0+PC9iPjwvZm9udD4uIEl0CisgICogd2lsbCBiZSBrZXB0IGFyb3VuZCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHVudGlsIG1pZAorICAqIDIwMDMuCisgICogCisgICogPHA+PGNvZGU+TG9nZ2VyPC9jb2RlPiBpcyBhIHN1YmNsYXNzIG9mIENhdGVnb3J5LCBpLmUuIGl0IGV4dGVuZHMKKyAgKiBDYXRlZ29yeS4gSW4gb3RoZXIgd29yZHMsIGEgbG9nZ2VyIDxlbT5pczwvZW0+IGEgY2F0ZWdvcnkuIFRodXMsCisgICogYWxsIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgY2F0ZWdvcnkgY2FuIGJlCisgICogcGVyZm9ybWVkIG9uIGEgbG9nZ2VyLiBJbnRlcm5hbGx5LCB3aGVuZXZlciBsb2c0aiBpcyBhc2tlZCB0bworICAqIHByb2R1Y2UgYSBDYXRlZ29yeSBvYmplY3QsIGl0IHdpbGwgaW5zdGVhZCBwcm9kdWNlIGEgTG9nZ2VyCisgICogb2JqZWN0LiBMb2c0aiAxLjIgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBwcm9kdWNlIENhdGVnb3J5IG9iamVjdHMgYnV0CisgICogb25seSA8Y29kZT5Mb2dnZXI8L2NvZGU+IGluc3RhbmNlcy4gSW4gb3JkZXIgdG8gcHJlc2VydmUgYmFja3dhcmQKKyAgKiBjb21wYXRpYmlsaXR5LCBtZXRob2RzIHRoYXQgcHJldmlvdXNseSBhY2NlcHRlZCBjYXRlZ29yeSBvYmplY3RzCisgICogc3RpbGwgY29udGludWUgdG8gYWNjZXB0IGNhdGVnb3J5IG9iamVjdHMuCisgICogCisgICogPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYXJlIGFsbCBsZWdhbCBhbmQgd2lsbCB3b3JrIGFzCisgICogZXhwZWN0ZWQuCisgICogCiAgICA8cHJlPgotICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Ly8gRGVwcmVjYXRlZCBmb3JtOgotICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Q2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoImZvby5iYXIiKQotCi0gICAmbmJzcDsmbmJzcDsmbmJzcDsvLyBQcmVmZXJyZWQgZm9ybSBmb3IgcmV0cmlldmluZyBsb2dnZXJzOgotICAgJm5ic3A7Jm5ic3A7Jm5ic3A7TG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoImZvby5iYXIiKQorICAgICZuYnNwOyZuYnNwOyZuYnNwOy8vIERlcHJlY2F0ZWQgZm9ybToKKyAgICAmbmJzcDsmbmJzcDsmbmJzcDtDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZSgiZm9vLmJhciIpCisgICAKKyAgICAmbmJzcDsmbmJzcDsmbmJzcDsvLyBQcmVmZXJyZWQgZm9ybSBmb3IgcmV0cmlldmluZyBsb2dnZXJzOgorICAgICZuYnNwOyZuYnNwOyZuYnNwO0xvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJmb28uYmFyIikKICAgIDwvcHJlPgotCi0gICA8cD5UaGUgZmlyc3QgZm9ybSBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4KLQotICAgPHA+PGI+VGhlcmUgaXMgYWJzb2x1dGVseSBubyBuZWVkIGZvciBuZXcgY2xpZW50IGNvZGUgdG8gdXNlIG9yCi0gICByZWZlciB0byB0aGUgPGNvZGU+Q2F0ZWdvcnk8L2NvZGU+IGNsYXNzLjwvYj4gV2hlbmV2ZXIgcG9zc2libGUsCi0gICBwbGVhc2UgYXZvaWQgcmVmZXJyaW5nIHRvIGl0IG9yIHVzaW5nIGl0LgotCi0gIDxwPlNlZSB0aGUgPGEgaHJlZj0iLi4vLi4vLi4vLi4vbWFudWFsLmh0bWwiPnNob3J0IG1hbnVhbDwvYT4gZm9yIGFuCi0gIGludHJvZHVjdGlvbiBvbiB0aGlzIGNsYXNzLgotCi0gIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdXVtbDsKLSAgQGF1dGhvciBBbmRlcnMgS3Jpc3RlbnNlbiAqLworICAgCisgICogIDxwPlRoZSBmaXJzdCBmb3JtIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSBhdm9pZGVkLgorICAqIAorICAqICA8cD48Yj5UaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIG5lZWQgZm9yIG5ldyBjbGllbnQgY29kZSB0byB1c2Ugb3IKKyAgKiAgcmVmZXIgdG8gdGhlIDxjb2RlPkNhdGVnb3J5PC9jb2RlPiBjbGFzcy48L2I+IFdoZW5ldmVyIHBvc3NpYmxlLAorICAqICBwbGVhc2UgYXZvaWQgcmVmZXJyaW5nIHRvIGl0IG9yIHVzaW5nIGl0LgorICAqIAorICAqIDxwPlNlZSB0aGUgPGEgaHJlZj0iLi4vLi4vLi4vLi4vbWFudWFsLmh0bWwiPnNob3J0IG1hbnVhbDwvYT4gZm9yIGFuCisgICogaW50cm9kdWN0aW9uIG9uIHRoaXMgY2xhc3MuCisgICogPHA+CisgICogU2VlIHRoZSBkb2N1bWVudCBlbnRpdGxlZCA8YSBocmVmPSJodHRwOi8vd3d3LnFvcy5jaC9sb2dnaW5nL3ByZXBhcmluZ0ZvcjEzLmh0bWwiPnByZXBhcmluZworICAqICBmb3IgbG9nNGogMS4zPC9hPiBmb3IgYSBtb3JlIGRldGFpbGVkIGRpc2N1c3Npb24uCisgICoKKyAgKiBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7CisgICogQGF1dGhvciBBbmRlcnMgS3Jpc3RlbnNlbiAKKyAgKi8KIHB1YmxpYyBjbGFzcyBDYXRlZ29yeSBpbXBsZW1lbnRzIEFwcGVuZGVyQXR0YWNoYWJsZSB7CiAKICAgLyoqCkBAIC03Nyw5ICs4NCw2IEBACiAgIC8vZmluYWwgSGllcmFyY2h5IGRlZmF1bHRIaWVyYXJjaHkgPSBuZXcgSGllcmFyY2h5KG5ldwogICAvLwkJCQkJICAgUm9vdENhdGVnb3J5KExldmVsLkRFQlVHKSk7CiAKLQotICBzdGF0aWMgaW50IG5vb3B0aW1pemU7Ci0KICAgLyoqCiAgICAgIFRoZSBuYW1lIG9mIHRoaXMgY2F0ZWdvcnkuCiAgICovCkBAIC0yMDcsMTAgKzIxMSwxMCBAQAogICAqLwogICBzeW5jaHJvbml6ZWQKICAgdm9pZCBjbG9zZU5lc3RlZEFwcGVuZGVycygpIHsKLSAgICBFbnVtZXJhdGlvbiBlbnVtID0gdGhpcy5nZXRBbGxBcHBlbmRlcnMoKTsKLSAgICBpZihlbnVtICE9IG51bGwpIHsKLSAgICAgIHdoaWxlKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQlBcHBlbmRlciBhID0gKEFwcGVuZGVyKSBlbnVtLm5leHRFbGVtZW50KCk7CisgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSB0aGlzLmdldEFsbEFwcGVuZGVycygpOworICAgIGlmKGVudW1lcmF0aW9uICE9IG51bGwpIHsKKyAgICAgIHdoaWxlKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisJQXBwZW5kZXIgYSA9IChBcHBlbmRlcikgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKIAlpZihhIGluc3RhbmNlb2YgQXBwZW5kZXJBdHRhY2hhYmxlKSB7CiAJICBhLmNsb3NlKCk7CiAJfQpAQCAtMzE1LDcgKzMxOSw3IEBACiAKICAgICAgQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgTG9nTWFuYWdlciNleGlzdHN9IGluc3RlYWQuCiAKLSAgICAgQHZlcnNpb24gMC44LjUgKi8KKyAgICAgQHNpbmNlIDAuOC41ICovCiAgIHB1YmxpYwogICBzdGF0aWMKICAgTG9nZ2VyIGV4aXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtNDMxLDkgKzQzNSwxMCBAQAogICB9CiAKICAgLyoqCi0KLSAgICAgQGRlcHJlY2F0ZWQgSGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHtAbGluayAjZ2V0RWZmZWN0aXZlTGV2ZWx9Ci0gICAgIG1ldGhvZC4gICovCisgICAgKgorICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgdGhlIHtAbGluayAjZ2V0RWZmZWN0aXZlTGV2ZWx9IG1ldGhvZAorICAgICogaW5zdGVhZC4gIAorICAgICogKi8KICAgcHVibGljCiAgIFByaW9yaXR5IGdldENoYWluZWRQcmlvcml0eSgpIHsKICAgICBmb3IoQ2F0ZWdvcnkgYyA9IHRoaXM7IGMgIT0gbnVsbDsgYz1jLnBhcmVudCkgewpAQCAtNDk3LDQwICs1MDIsMjAgQEAKIAogCiAgLyoqCi0gICAgIFJldHJpZXZlIGEgY2F0ZWdvcnkgd2l0aCBuYW1lZCBhcyB0aGUgPGNvZGU+bmFtZTwvY29kZT4KLSAgICAgcGFyYW1ldGVyLiBJZiB0aGUgbmFtZWQgY2F0ZWdvcnkgYWxyZWFkeSBleGlzdHMsIHRoZW4gdGhlCi0gICAgIGV4aXN0aW5nIGluc3RhbmNlIHdpbGwgYmUgcmV1dHJuZWQuIE90aGVyd2lzZSwgYSBuZXcgaW5zdGFuY2UgaXMKLSAgICAgY3JlYXRlZC4KLQotICAgICBCeSBkZWZhdWx0LCBjYXRlZ29yaWVzIGRvIG5vdCBoYXZlIGEgc2V0IGxldmVsIGJ1dCBpbmhlcml0Ci0gICAgIGl0IGZyb20gdGhlIGhpZXJhcmNoeS4gVGhpcyBpcyBvbmUgb2YgdGhlIGNlbnRyYWwgZmVhdHVyZXMgb2YKLSAgICAgbG9nNGouCi0KLSAgICAgPGI+RGVwcmVjYXRlZDwvYj4gUGxlYXNlIHVzZSB7QGxpbmsgTG9nZ2VyI2dldExvZ2dlcihTdHJpbmcpfQotICAgICBpbnN0ZWFkLgotCi0gICAgIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeSB0byByZXRyaWV2ZS4gICovCisgICogQGRlcHJlY2F0ZWQgTWFrZSBzdXJlIHRvIHVzZSB7QGxpbmsgTG9nZ2VyI2dldExvZ2dlcihTdHJpbmcpfSBpbnN0ZWFkLgorICAqLwogICBwdWJsaWMKICAgc3RhdGljCiAgIENhdGVnb3J5IGdldEluc3RhbmNlKFN0cmluZyBuYW1lKSB7Ci0gICAgIG5vb3B0aW1pemUrKzsKICAgICByZXR1cm4gTG9nTWFuYWdlci5nZXRMb2dnZXIobmFtZSk7CiAgIH0KIAogIC8qKgotICAgIFNob3J0aGFuZCBmb3IgPGNvZGU+Z2V0SW5zdGFuY2UoY2xhenouZ2V0TmFtZSgpKTwvY29kZT4uCi0KLSAgICBAcGFyYW0gY2xhenogVGhlIG5hbWUgb2YgPGNvZGU+Y2xheno8L2NvZGU+IHdpbGwgYmUgdXNlZCBhcyB0aGUKLSAgICBuYW1lIG9mIHRoZSBjYXRlZ29yeSB0byByZXRyaWV2ZS4gIFNlZSB7QGxpbmsKLSAgICAjZ2V0SW5zdGFuY2UoU3RyaW5nKX0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24uCi0KLSAgICA8Yj5EZXByZWNhdGVkPC9iPiBQbGVhc2UgdXNlIHtAbGluayBMb2dnZXIjZ2V0TG9nZ2VyKENsYXNzKX0gaW5zdGVhZC4KLQotICAgIEBzaW5jZSAxLjAgKi8KKyAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSB7QGxpbmsgTG9nZ2VyI2dldExvZ2dlcihDbGFzcyl9IGluc3RlYWQuCisgICovIAogICBwdWJsaWMKICAgc3RhdGljCiAgIENhdGVnb3J5IGdldEluc3RhbmNlKENsYXNzIGNsYXp6KSB7Ci0gICAgbm9vcHRpbWl6ZSsrOwogICAgIHJldHVybiBMb2dNYW5hZ2VyLmdldExvZ2dlcihjbGF6eik7CiAgIH0KIApAQCAtNTgxLDE2ICs1NjYsNyBAQAogCiAKICAgLyoqCi0gICAgIFJldHVybiB0aGUgcm9vdCBvZiB0aGUgZGVmYXVsdCBjYXRlZ29yeSBoaWVycmFjaHkuCi0KLSAgICAgPHA+VGhlIHJvb3QgY2F0ZWdvcnkgaXMgYWx3YXlzIGluc3RhbnRpYXRlZCBhbmQgYXZhaWxhYmxlLiBJdCdzCi0gICAgIG5hbWUgaXMgInJvb3QiLgotCi0gICAgIDxwPk5ldmVydGhlbGVzcywgY2FsbGluZyB7QGxpbmsgI2dldEluc3RhbmNlCi0gICAgIENhdGVnb3J5LmdldEluc3RhbmNlKCJyb290Iil9IGRvZXMgbm90IHJldHJpZXZlIHRoZSByb290IGNhdGVnb3J5Ci0gICAgIGJ1dCBhIGNhdGVnb3J5IGp1c3QgdW5kZXIgcm9vdCBuYW1lZCAicm9vdCIuCi0KLSAgICAgPGI+RGVwcmVjYXRlZDwvYj4gVXNlIHtAbGluayBMb2dnZXIjZ2V0Um9vdExvZ2dlcigpfSBpbnN0ZWFkLgorICAgKiAgQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgTG9nZ2VyI2dldFJvb3RMb2dnZXIoKX0gaW5zdGVhZC4KICAgICovCiAgIGZpbmFsCiAgIHB1YmxpYwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Db25zb2xlQXBwZW5kZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovQ29uc29sZUFwcGVuZGVyLmphdmEKaW5kZXggZmMxNDQ3NC4uYmQ0M2VkZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Db25zb2xlQXBwZW5kZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0NvbnNvbGVBcHBlbmRlci5qYXZhCkBAIC0xMSwxMiArMTEsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuTG9nTG9nOwogCiAvKioKLSAgIENvbnNvbGVBcHBlbmRlciBhcHBlbmRzIGxvZyBldmVudHMgdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gb3IKLSAgIDxjb2RlPlN5c3RlbS5lcnI8L2NvZGU+IHVzaW5nIGEgbGF5b3V0IHNwZWNpZmllZCBieSB0aGUKLSAgIHVzZXIuIFRoZSBkZWZhdWx0IHRhcmdldCBpcyA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPi4KLQotICAgQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOwotICAgQHNpbmNlIDEuMSAqLworICAqIENvbnNvbGVBcHBlbmRlciBhcHBlbmRzIGxvZyBldmVudHMgdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gb3IKKyAgKiA8Y29kZT5TeXN0ZW0uZXJyPC9jb2RlPiB1c2luZyBhIGxheW91dCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuIFRoZQorICAqIGRlZmF1bHQgdGFyZ2V0IGlzIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+LgorICAqCisgICogQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOyAKKyAgKiBAc2luY2UgMS4xICovCiBwdWJsaWMgY2xhc3MgQ29uc29sZUFwcGVuZGVyIGV4dGVuZHMgV3JpdGVyQXBwZW5kZXIgewogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9PVVQgPSAiU3lzdGVtLm91dCI7CkBAIC00Nyw5ICs0NywxMCBAQAogICB9CiAKICAgLyoqCi0gICAgIFNldHMgdGhlIHZhbHVlIG9mIHRoZSA8Yj5UYXJnZXQ8L2I+IG9wdGlvbi4gUmVjb2duaXplZCB2YWx1ZXMgYXJlCi0gICAgICJTeXN0ZW0ub3V0IiBhbmQgIlN5c3RlbS5lcnIiLiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgotICAqLworICAgKiAgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIDxiPlRhcmdldDwvYj4gb3B0aW9uLiBSZWNvZ25pemVkIHZhbHVlcworICAgKiAgYXJlICJTeXN0ZW0ub3V0IiBhbmQgIlN5c3RlbS5lcnIiLiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBiZQorICAgKiAgaWdub3JlZC4gIAorICAgKiAqLwogICBwdWJsaWMKICAgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHZhbHVlKSB7CiAgICAgU3RyaW5nIHYgPSB2YWx1ZS50cmltKCk7CkBAIC02NCwxMiArNjUsMTEgQEAKICAgfQogCiAgIC8qKgotICAgICAgUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgPGI+VGFyZ2V0PC9iPiBwcm9wZXJ0eS4gVGhlIGRlZmF1bHQKLSAgICAgIHZhbHVlIG9mIHRoZSBvcHRpb24gaXMgIlN5c3RlbS5vdXQiLgotCi0gICAgICBTZWUgYWxzbyB7QGxpbmsgI3NldFRhcmdldH0uCi0KLSAgKi8KKyAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgPGI+VGFyZ2V0PC9iPiBwcm9wZXJ0eS4gVGhlCisgICAqIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbiBpcyAiU3lzdGVtLm91dCIuCisgICAqCisgICAqIFNlZSBhbHNvIHtAbGluayAjc2V0VGFyZ2V0fS4KKyAgICogKi8KICAgcHVibGljCiAgIFN0cmluZyBnZXRUYXJnZXQoKSB7CiAgICAgcmV0dXJuIHRhcmdldDsKQEAgLTc3LDcgKzc3LDcgQEAKIAogICB2b2lkIHRhcmdldFdhcm4oU3RyaW5nIHZhbCkgewogICAgIExvZ0xvZy53YXJuKCJbIit2YWwrIl0gc2hvdWxkIGJlIFN5c3RlbS5vdXQgb3IgU3lzdGVtLmVyci4iKTsKLSAgICBMb2dMb2cud2FybigiVXNpbmcgU3lzdGVtLm91dCAoZGVmYXVsdCkuIik7CisgICAgTG9nTG9nLndhcm4oIlVzaW5nIHByZXZpb3VzbHkgc2V0IHRhcmdldCwgU3lzdGVtLm91dCBieSBkZWZhdWx0LiIpOwogICB9CiAKICAgcHVibGljCkBAIC05MCw4ICs5MCwxMCBAQAogICB9CiAKICAgLyoqCi0gICAgIE92ZXJyaWRlIHRoZSBwYXJlbnQgbWV0aG9kIHRvIGRvIG5vdGhpbmcuCi0gICAqLworICAgKiAgVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBwYXJlbnQge0BsaW5rCisgICAqICBXcml0ZXJBcHBlbmRlciNjbG9zZVdyaXRlcn0gaW1wbGVtZW50YXRpb24gdG8gZG8gbm90aGluZyBiZWNhdXNlCisgICAqICB0aGUgY29uc29sZSBzdHJlYW0gaXMgbm90IG91cnMgdG8gY2xvc2UuCisgICAqICovCiAgIHByb3RlY3RlZAogICBmaW5hbAogICB2b2lkIGNsb3NlV3JpdGVyKCkgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9EYWlseVJvbGxpbmdGaWxlQXBwZW5kZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovRGFpbHlSb2xsaW5nRmlsZUFwcGVuZGVyLmphdmEKaW5kZXggYzkwYTIwOS4uNTBkMWU5ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9EYWlseVJvbGxpbmdGaWxlQXBwZW5kZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0RhaWx5Um9sbGluZ0ZpbGVBcHBlbmRlci5qYXZhCkBAIC01MiwxMSArNTIsMTAgQEAKICAgIDx0ZD48Y29kZT4nLid5eXl5LU1NPC9jb2RlPgogICAgPHRkPlJvbGxvdmVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBtb250aDwvdGQ+CiAKLSAgIDx0ZD5Bc3N1bWluZyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGlzIFN1bmRheSwgYXQgU3VuZGF5IDAwOjAwLAotICAgTWFyY2ggMjV0aCwgMjAwMSwgPGNvZGU+L2Zvby9iYXIubG9nPC9jb2RlPiB3aWxsIGJlIGNvcGllZCB0bwotICAgPGNvZGU+L2Zvby9iYXIubG9nLjIwMDEtMDM8L2NvZGU+LiBMb2dnaW5nIGZvciB0aGUgbW9udGggb2YgQXByaWwKLSAgIHdpbGwgYmUgb3V0cHV0IHRvIDxjb2RlPi9mb28vYmFyLmxvZzwvY29kZT4gdW50aWwgaXQgcm9sbHMgb3ZlcgotICAgYXQgdGhlIGJlZ2lubmluZyBvZiBNYXkuCisgICA8dGQ+QXQgbWlkbmlnaHQgb2YgTWF5IDMxc3QsIDIwMDIgPGNvZGU+L2Zvby9iYXIubG9nPC9jb2RlPiB3aWxsIGJlCisgICBjb3BpZWQgdG8gPGNvZGU+L2Zvby9iYXIubG9nLjIwMDItMDU8L2NvZGU+LiBMb2dnaW5nIGZvciB0aGUgbW9udGgKKyAgIG9mIEp1bmUgd2lsbCBiZSBvdXRwdXQgdG8gPGNvZGU+L2Zvby9iYXIubG9nPC9jb2RlPiB1bnRpbCBpdCBpcworICAgYWxzbyByb2xsZWQgb3ZlciB0aGUgbmV4dCBtb250aC4KIAogICAgPHRyPgogICAgPHRkPjxjb2RlPicuJ3l5eXktd3c8L2NvZGU+CkBAIC02NCwxOCArNjMsMTkgQEAKICAgIDx0ZD5Sb2xsb3ZlciBhdCB0aGUgZmlyc3QgZGF5IG9mIGVhY2ggd2Vlay4gVGhlIGZpcnN0IGRheSBvZiB0aGUKICAgIHdlZWsgZGVwZW5kcyBvbiB0aGUgbG9jYWxlLjwvdGQ+CiAKLSAgIDx0ZD5BdCBtaWRuaWdodCwgb24gTWFyY2ggMzFzdCwgMjAwMSwgPGNvZGU+L2Zvby9iYXIubG9nPC9jb2RlPgotICAgd2lsbCBiZSBjb3BpZWQgdG8gPGNvZGU+L2Zvby9iYXIubG9nLjIwMDEtMDg8L2NvZGU+LiBMb2dnaW5nIGZvcgotICAgdGhlIDl0aCB3ZWVrIG9mIDIwMDEgd2lsbCBiZSBvdXRwdXQgdG8gPGNvZGU+L2Zvby9iYXIubG9nPC9jb2RlPgotICAgdW50aWwgaXQgaXMgcm9sbGVkIG92ZXIgdGhlIG5leHQgd2Vlay4KKyAgIDx0ZD5Bc3N1bWluZyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGlzIFN1bmRheSwgb24gU2F0dXJkYXkKKyAgIG1pZG5pZ2h0LCBKdW5lIDl0aCAyMDAyLCB0aGUgZmlsZSA8aT4vZm9vL2Jhci5sb2c8L2k+IHdpbGwgYmUKKyAgIGNvcGllZCB0byA8aT4vZm9vL2Jhci5sb2cuMjAwMi0yMzwvaT4uICBMb2dnaW5nIGZvciB0aGUgMjR0aCB3ZWVrCisgICBvZiAyMDAyIHdpbGwgYmUgb3V0cHV0IHRvIDxjb2RlPi9mb28vYmFyLmxvZzwvY29kZT4gdW50aWwgaXQgaXMKKyAgIHJvbGxlZCBvdmVyIHRoZSBuZXh0IHdlZWsuCiAKICAgIDx0cj4KICAgIDx0ZD48Y29kZT4nLid5eXl5LU1NLWRkPC9jb2RlPgogCiAgICA8dGQ+Um9sbG92ZXIgYXQgbWlkbmlnaHQgZWFjaCBkYXkuPC90ZD4KIAotICAgPHRkPkF0IG1pZG5pZ2h0LCBvbiBNYXJjaCA5dGgsIDIwMDEsIDxjb2RlPi9mb28vYmFyLmxvZzwvY29kZT4gd2lsbAotICAgYmUgY29waWVkIHRvIDxjb2RlPi9mb28vYmFyLmxvZy4yMDAxLTAzLTA4PC9jb2RlPi4gTG9nZ2luZyBmb3IgdGhlCisgICA8dGQ+QXQgbWlkbmlnaHQsIG9uIE1hcmNoIDh0aCwgMjAwMiwgPGNvZGU+L2Zvby9iYXIubG9nPC9jb2RlPiB3aWxsCisgICBiZSBjb3BpZWQgdG8gPGNvZGU+L2Zvby9iYXIubG9nLjIwMDItMDMtMDg8L2NvZGU+LiBMb2dnaW5nIGZvciB0aGUKICAgIDl0aCBkYXkgb2YgTWFyY2ggd2lsbCBiZSBvdXRwdXQgdG8gPGNvZGU+L2Zvby9iYXIubG9nPC9jb2RlPiB1bnRpbAogICAgaXQgaXMgcm9sbGVkIG92ZXIgdGhlIG5leHQgZGF5LgogCkBAIC04NCwxOSArODQsMTkgQEAKIAogICAgPHRkPlJvbGxvdmVyIGF0IG1pZG5pZ2h0IGFuZCBtaWRkYXkgb2YgZWFjaCBkYXkuPC90ZD4KIAotICAgPHRkPkF0IG5vb24sIG9uIE1hcmNoIDl0aCwgMjAwMSwgPGNvZGU+L2Zvby9iYXIubG9nPC9jb2RlPiB3aWxsIGJlCi0gICBjb3BpZWQgdG8gPGNvZGU+L2Zvby9iYXIubG9nLjIwMDEtMDMtMDktQU08L2NvZGU+LiBMb2dnaW5nIGZvciB0aGUKKyAgIDx0ZD5BdCBub29uLCBvbiBNYXJjaCA5dGgsIDIwMDIsIDxjb2RlPi9mb28vYmFyLmxvZzwvY29kZT4gd2lsbCBiZQorICAgY29waWVkIHRvIDxjb2RlPi9mb28vYmFyLmxvZy4yMDAyLTAzLTA5LUFNPC9jb2RlPi4gTG9nZ2luZyBmb3IgdGhlCiAgICBhZnRlcm5vb24gb2YgdGhlIDl0aCB3aWxsIGJlIG91dHB1dCB0byA8Y29kZT4vZm9vL2Jhci5sb2c8L2NvZGU+Ci0gICB1bnRpbCBpdCBpcyByb2xsZWQgb3ZlciB0aGUgbmV4dCBtb3JuaW5nLCBpLmUgYXQgbWlkbmlnaHQgMDA6MDAuCisgICB1bnRpbCBpdCBpcyByb2xsZWQgb3ZlciBhdCBtaWRuaWdodC4KIAogICAgPHRyPgogICAgPHRkPjxjb2RlPicuJ3l5eXktTU0tZGQtSEg8L2NvZGU+CiAKICAgIDx0ZD5Sb2xsb3ZlciBhdCB0aGUgdG9wIG9mIGV2ZXJ5IGhvdXIuPC90ZD4KIAotICAgPHRkPkF0IGFwcHJveGltYXRlbHkgMTE6MDAsMDAwLCBvbiBNYXJjaCA5dGgsIDIwMDEsCisgICA8dGQ+QXQgYXBwcm94aW1hdGVseSAxMTowMC4wMDAgbydjbG9jayBvbiBNYXJjaCA5dGgsIDIwMDIsCiAgICA8Y29kZT4vZm9vL2Jhci5sb2c8L2NvZGU+IHdpbGwgYmUgY29waWVkIHRvCi0gICA8Y29kZT4vZm9vL2Jhci5sb2cuMjAwMS0wMy0wOS0xMDwvY29kZT4uIExvZ2dpbmcgZm9yIHRoZSAxMXRoIGhvdXIKKyAgIDxjb2RlPi9mb28vYmFyLmxvZy4yMDAyLTAzLTA5LTEwPC9jb2RlPi4gTG9nZ2luZyBmb3IgdGhlIDExdGggaG91cgogICAgb2YgdGhlIDl0aCBvZiBNYXJjaCB3aWxsIGJlIG91dHB1dCB0byA8Y29kZT4vZm9vL2Jhci5sb2c8L2NvZGU+CiAgICB1bnRpbCBpdCBpcyByb2xsZWQgb3ZlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGhvdXIuCiAKQEAgLTE0MywxMyArMTQzLDE5IEBACiAgIHByaXZhdGUgU3RyaW5nIGRhdGVQYXR0ZXJuID0gIicuJ3l5eXktTU0tZGQiOwogCiAgIC8qKgotICAgICBUaGUgYWN0dWFsIGZvcm1hdHRlZCBmaWxlbmFtZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyB3cml0dGVuIHRvLgorICAgICBUaGUgbG9nIGZpbGUgd2lsbCBiZSByZW5hbWVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgc2NoZWR1bGVkRmlsZW5hbWUgdmFyaWFibGUgd2hlbiB0aGUgbmV4dCBpbnRlcnZhbCBpcyBlbnRlcmVkLiBGb3IKKyAgICAgZXhhbXBsZSwgaWYgdGhlIHJvbGxvdmVyIHBlcmlvZCBpcyBvbmUgaG91ciwgdGhlIGxvZyBmaWxlIHdpbGwgYmUKKyAgICAgcmVuYW1lZCB0byB0aGUgdmFsdWUgb2YgInNjaGVkdWxlZEZpbGVuYW1lIiBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgIHRoZSBuZXh0IGhvdXIuIAorCisgICAgIFRoZSBwcmVjaXNlIHRpbWUgd2hlbiBhIHJvbGxvdmVyIG9jY3VycyBkZXBlbmRzIG9uIGxvZ2dpbmcKKyAgICAgYWN0aXZpdHkuIAogICAqLwogICBwcml2YXRlIFN0cmluZyBzY2hlZHVsZWRGaWxlbmFtZTsKIAogICAvKioKLSAgICAgVGhlIHRpbWVzdGFtcCB3aGVuIHdlIHNoYWxsIG5leHQgcmVjb21wdXRlIHRoZSBmaWxlbmFtZS4KLSAgKi8KKyAgICAgVGhlIG5leHQgdGltZSB3ZSBlc3RpbWF0ZSBhIHJvbGxvdmVyIHNob3VsZCBvY2N1ci4gKi8KICAgcHJpdmF0ZSBsb25nIG5leHRDaGVjayA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKSAtIDE7CiAKICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOwpAQCAtMTYwLDE0ICsxNjYsMTMgQEAKIAogICBpbnQgY2hlY2tQZXJpb2QgPSBUT1BfT0ZfVFJPVUJMRTsKIAotCisgIC8vIFRoZSBnbXRUaW1lWm9uZSBpcyB1c2VkIG9ubHkgaW4gY29tcHV0ZUNoZWNrUGVyaW9kKCkgbWV0aG9kLgogICBzdGF0aWMgZmluYWwgVGltZVpvbmUgZ210VGltZVpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIik7CiAKIAogICAvKioKICAgICAgVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZG9lcyBub3RoaW5nLiAqLwotICBwdWJsaWMKLSAgRGFpbHlSb2xsaW5nRmlsZUFwcGVuZGVyKCkgeworICBwdWJsaWMgRGFpbHlSb2xsaW5nRmlsZUFwcGVuZGVyKCkgewogICB9CiAKICAgLyoqCkBAIC0xODgsMTkgKzE5MywxNiBAQAogICAgICBleHBlY3RlZCBieSB7QGxpbmsgU2ltcGxlRGF0ZUZvcm1hdH0uIFRoaXMgb3B0aW9ucyBkZXRlcm1pbmVzIHRoZQogICAgICByb2xsb3ZlciBzY2hlZHVsZS4KICAgICovCi0gIHB1YmxpYwotICB2b2lkIHNldERhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisgIHB1YmxpYyB2b2lkIHNldERhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CiAgICAgZGF0ZVBhdHRlcm4gPSBwYXR0ZXJuOwogICB9CiAKICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSA8Yj5EYXRlUGF0dGVybjwvYj4gb3B0aW9uLiAqLwotICBwdWJsaWMKLSAgU3RyaW5nIGdldERhdGVQYXR0ZXJuKCkgeworICBwdWJsaWMgU3RyaW5nIGdldERhdGVQYXR0ZXJuKCkgewogICAgIHJldHVybiBkYXRlUGF0dGVybjsKICAgfQogCi0gIHB1YmxpYwotICB2b2lkIGFjdGl2YXRlT3B0aW9ucygpIHsKKyAgcHVibGljIHZvaWQgYWN0aXZhdGVPcHRpb25zKCkgewogICAgIHN1cGVyLmFjdGl2YXRlT3B0aW9ucygpOwogICAgIGlmKGRhdGVQYXR0ZXJuICE9IG51bGwgJiYgZmlsZU5hbWUgIT0gbnVsbCkgewogICAgICAgbm93LnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwpAQCAtMjEyLDggKzIxNCw4IEBACiAgICAgICBzY2hlZHVsZWRGaWxlbmFtZSA9IGZpbGVOYW1lK3NkZi5mb3JtYXQobmV3IERhdGUoZmlsZS5sYXN0TW9kaWZpZWQoKSkpOwogCiAgICAgfSBlbHNlIHsKLSAgICAgIExvZ0xvZy5lcnJvcigiRWl0aGVyIEZpbGVuYW1lIG9yIERhdGVQYXR0ZXJuIG9wdGlvbnMgYXJlIG5vdCBzZXQgZm9yIFsiKwotCQkgICBuYW1lKyJdLiIpOworICAgICAgTG9nTG9nLmVycm9yKCJFaXRoZXIgRmlsZSBvciBEYXRlUGF0dGVybiBvcHRpb25zIGFyZSBub3Qgc2V0IGZvciBhcHBlbmRlciBbIgorCQkgICArbmFtZSsiXS4iKTsKICAgICB9CiAgIH0KIApAQCAtMjkwLDYgKzI5Miw5IEBACiAgICAgfQogCiAgICAgU3RyaW5nIGRhdGVkRmlsZW5hbWUgPSBmaWxlTmFtZStzZGYuZm9ybWF0KG5vdyk7CisgICAgLy8gSXQgaXMgdG9vIGVhcmx5IHRvIHJvbGwgb3ZlciBiZWNhdXNlIHdlIGFyZSBzdGlsbCB3aXRoaW4gdGhlCisgICAgLy8gYm91bmRzIG9mIHRoZSBjdXJyZW50IGludGVydmFsLiBSb2xsb3ZlciB3aWxsIG9jY3VyIG9uY2UgdGhlCisgICAgLy8gbmV4dCBpbnRlcnZhbCBpcyByZWFjaGVkLgogICAgIGlmIChzY2hlZHVsZWRGaWxlbmFtZS5lcXVhbHMoZGF0ZWRGaWxlbmFtZSkpIHsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC0zMDMsOCArMzA4LDEyIEBACiAgICAgfQogCiAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotICAgIGZpbGUucmVuYW1lVG8odGFyZ2V0KTsKLSAgICBMb2dMb2cuZGVidWcoZmlsZU5hbWUgKyIgLT4gIisgc2NoZWR1bGVkRmlsZW5hbWUpOworICAgIGJvb2xlYW4gcmVzdWx0ID0gZmlsZS5yZW5hbWVUbyh0YXJnZXQpOworICAgIGlmKHJlc3VsdCkgeworICAgICAgTG9nTG9nLmRlYnVnKGZpbGVOYW1lICsiIC0+ICIrIHNjaGVkdWxlZEZpbGVuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgTG9nTG9nLmVycm9yKCJGYWlsZWQgdG8gcmVuYW1lIFsiK2ZpbGVOYW1lKyJdIHRvIFsiK3NjaGVkdWxlZEZpbGVuYW1lKyJdLiIpOworICAgIH0KIAogICAgIHRyeSB7CiAgICAgICAvLyBUaGlzIHdpbGwgYWxzbyBjbG9zZSB0aGUgZmlsZS4gVGhpcyBpcyBPSyBzaW5jZSBtdWx0aXBsZQpAQCAtMzE4LDE3ICszMjcsMTQgQEAKICAgfQogCiAgIC8qKgotICAgICBUaGlzIG1ldGhvZCBkaWZmZXJlbnRpYXRlcyBEYWlseVJvbGxpbmdGaWxlQXBwZW5kZXIgZnJvbSBpdHMKLSAgICAgc3VwZXIgY2xhc3MuCi0KLSAgICAgPHA+QmVmb3JlIGFjdHVhbGx5IGxvZ2dpbmcsIHRoaXMgbWV0aG9kIHdpbGwgY2hlY2sgd2hldGhlciBpdCBpcwotICAgICB0aW1lIHRvIGRvIGEgcm9sbG92ZXIuIElmIGl0IGlzLCBpdCB3aWxsIHNjaGVkdWxlIHRoZSBuZXh0Ci0gICAgIHJvbGxvdmVyIHRpbWUgYW5kIHRoZW4gcm9sbG92ZXIuCi0KLQotICAqLwotICBwcm90ZWN0ZWQKLSAgdm9pZCBzdWJBcHBlbmQoTG9nZ2luZ0V2ZW50IGV2ZW50KSB7CisgICAqIFRoaXMgbWV0aG9kIGRpZmZlcmVudGlhdGVzIERhaWx5Um9sbGluZ0ZpbGVBcHBlbmRlciBmcm9tIGl0cworICAgKiBzdXBlciBjbGFzcy4KKyAgICoKKyAgICogPHA+QmVmb3JlIGFjdHVhbGx5IGxvZ2dpbmcsIHRoaXMgbWV0aG9kIHdpbGwgY2hlY2sgd2hldGhlciBpdCBpcworICAgKiB0aW1lIHRvIGRvIGEgcm9sbG92ZXIuIElmIGl0IGlzLCBpdCB3aWxsIHNjaGVkdWxlIHRoZSBuZXh0CisgICAqIHJvbGxvdmVyIHRpbWUgYW5kIHRoZW4gcm9sbG92ZXIuCisgICAqICovCisgIHByb3RlY3RlZCB2b2lkIHN1YkFwcGVuZChMb2dnaW5nRXZlbnQgZXZlbnQpIHsKICAgICBsb25nIG4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICBpZiAobiA+PSBuZXh0Q2hlY2spIHsKICAgICAgIG5vdy5zZXRUaW1lKG4pOwpAQCAtMzQ1LDE2ICszNTEsMTAgQEAKIH0KIAogLyoqCi0gICBSb2xsaW5nQ2FsZW5kYXIgaXMgYSBoZWxwZXIgY2xhc3MgdG8KLSAgIERhaWx5Um9sbGluZ0ZpbGVBcHBlbmRlci4gVXNpbmcgdGhpcyBjbGFzcywgaXQgaXMgZWFzeSB0byBjb21wdXRlCi0gICBhbmQgYWNjZXNzIHRoZSBuZXh0IE1pbGxpcygpLgotCi0gICBJdCBzdWJjbGFzc2VzIHRoZSBzdGFuZGFyZCB7QGxpbmsgR3JlZ29yaWFuQ2FsZW5kYXJ9LW9iamVjdCwgdG8KLSAgIGFsbG93IGFjY2VzcyB0byB0aGUgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFRpbWVJbk1pbGxpcygpLCB3aGljaCBpdAotICAgdGhlbiBleHBvcnRzLgotCi0gICBAYXV0aG9yIDxhIEhSRUY9Im1haWx0bzplaXJpay5seWdyZUBldml0YS5ubyI+RWlyaWsgTHlncmU8L2E+ICovCi0KKyAqICBSb2xsaW5nQ2FsZW5kYXIgaXMgYSBoZWxwZXIgY2xhc3MgdG8gRGFpbHlSb2xsaW5nRmlsZUFwcGVuZGVyLgorICogIEdpdmVuIGEgcGVyaW9kaWNpdHkgdHlwZSBhbmQgdGhlIGN1cnJlbnQgdGltZSwgaXQgY29tcHV0ZXMgdGhlCisgKiAgc3RhcnQgb2YgdGhlIG5leHQgaW50ZXJ2YWwuICAKKyAqICovCiBjbGFzcyBSb2xsaW5nQ2FsZW5kYXIgZXh0ZW5kcyBHcmVnb3JpYW5DYWxlbmRhciB7CiAKICAgaW50IHR5cGUgPSBEYWlseVJvbGxpbmdGaWxlQXBwZW5kZXIuVE9QX09GX1RST1VCTEU7CkBAIC0zNzEsMTMgKzM3MSwxMSBAQAogICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgIH0KIAotICBwdWJsaWMKLSAgbG9uZyBnZXROZXh0Q2hlY2tNaWxsaXMoRGF0ZSBub3cpIHsKKyAgcHVibGljIGxvbmcgZ2V0TmV4dENoZWNrTWlsbGlzKERhdGUgbm93KSB7CiAgICAgcmV0dXJuIGdldE5leHRDaGVja0RhdGUobm93KS5nZXRUaW1lKCk7CiAgIH0KIAotICBwdWJsaWMKLSAgRGF0ZSBnZXROZXh0Q2hlY2tEYXRlKERhdGUgbm93KSB7CisgIHB1YmxpYyBEYXRlIGdldE5leHRDaGVja0RhdGUoRGF0ZSBub3cpIHsKICAgICB0aGlzLnNldFRpbWUobm93KTsKIAogICAgIHN3aXRjaCh0eXBlKSB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0ZpbGVBcHBlbmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9GaWxlQXBwZW5kZXIuamF2YQppbmRleCBlM2IyMTJlLi5jMWRlNzk0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0ZpbGVBcHBlbmRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovRmlsZUFwcGVuZGVyLmphdmEKQEAgLTIwLDI0ICsyMCwyNCBAQAogLy8gICAgICAgICAgICAgIEJlbiBTYW5kZWUKIAogLyoqCi0gICBGaWxlQXBwZW5kZXIgYXBwZW5kcyBsb2cgZXZlbnRzIHRvIGEgZmlsZS4KLQotICAgPHA+U3VwcG9ydCBmb3IgPGNvZGU+amF2YS5pby5Xcml0ZXI8L2NvZGU+IGFuZCBjb25zb2xlIGFwcGVuZGluZwotICAgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgdGhlbiByZW1vdmVkLiBTZWUgdGhlIHJlcGxhY2VtZW50Ci0gICBzb2x1dGlvbnM6IHtAbGluayBXcml0ZXJBcHBlbmRlcn0gYW5kIHtAbGluayBDb25zb2xlQXBwZW5kZXJ9LgotCi0KLSAgIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdXVtbDsgKi8KKyAqICBGaWxlQXBwZW5kZXIgYXBwZW5kcyBsb2cgZXZlbnRzIHRvIGEgZmlsZS4KKyAqCisgKiAgPHA+U3VwcG9ydCBmb3IgPGNvZGU+amF2YS5pby5Xcml0ZXI8L2NvZGU+IGFuZCBjb25zb2xlIGFwcGVuZGluZworICogIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHRoZW4gcmVtb3ZlZC4gU2VlIHRoZSByZXBsYWNlbWVudAorICogIHNvbHV0aW9uczoge0BsaW5rIFdyaXRlckFwcGVuZGVyfSBhbmQge0BsaW5rIENvbnNvbGVBcHBlbmRlcn0uCisgKgorICogQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOyAKKyAqICovCiBwdWJsaWMgY2xhc3MgRmlsZUFwcGVuZGVyIGV4dGVuZHMgV3JpdGVyQXBwZW5kZXIgewogCi0gIC8qKiBBcHBlbmQgdG8gb3IgdHJ1bmNhdGUgdGhlIGZpbGU/IFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzCi0gICAgICB2YXJpYWJsZSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgbWVhbmluZyB0aGF0IGJ5IGRlZmF1bHQgYQotICAgICAgPGNvZGU+RmlsZUFwcGVuZGVyPC9jb2RlPiB3aWxsIGFwcGVuZCB0byBhbiBleGlzdGluZyBmaWxlIGFuZAotICAgICAgbm90IHRydW5jYXRlIGl0LgotCi0gICAgICA8cD5UaGlzIG9wdGlvbiBpcyBtZWFuaW5nZnVsIG9ubHkgaWYgdGhlIEZpbGVBcHBlbmRlciBvcGVucyB0aGUKLSAgICAgIGZpbGUuCi0gICovCisgIC8qKiBDb250cm9scyBmaWxlIHRydW5jYXRhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgdmFyaWFibGUKKyAgICogaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIG1lYW5pbmcgdGhhdCBieSBkZWZhdWx0IGEKKyAgICogPGNvZGU+RmlsZUFwcGVuZGVyPC9jb2RlPiB3aWxsIGFwcGVuZCB0byBhbiBleGlzdGluZyBmaWxlIGFuZCBub3QKKyAgICogdHJ1bmNhdGUgaXQuCisgICAqCisgICAqIDxwPlRoaXMgb3B0aW9uIGlzIG1lYW5pbmdmdWwgb25seSBpZiB0aGUgRmlsZUFwcGVuZGVyIG9wZW5zIHRoZQorICAgKiBmaWxlLgorICAgKi8KICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUFwcGVuZCA9IHRydWU7CiAKICAgLyoqCkBAIC00OSw3ICs0OSw4IEBACiAgIHByb3RlY3RlZCBib29sZWFuIGJ1ZmZlcmVkSU8gPSBmYWxzZTsKIAogICAvKioKLSAgICAgSG93IGJpZyBzaG91bGQgdGhlIElPIGJ1ZmZlciBiZT8gRGVmYXVsdCBpcyA4Sy4gKi8KKyAgICogRGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiBJTyBidWZmZXIgYmUuIERlZmF1bHQgaXMgOEsuIAorICAgKi8KICAgcHJvdGVjdGVkIGludCBidWZmZXJTaXplID0gOCoxMDI0OwogCiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovSFRNTExheW91dC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9IVE1MTGF5b3V0LmphdmEKaW5kZXggMDEzYjdjNS4uOTYxYzMwMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9IVE1MTGF5b3V0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9IVE1MTGF5b3V0LmphdmEKQEAgLTEzMCwyMiArMTMwLDIyIEBACiAgICAgc2J1Zi5hcHBlbmQoIjwvdGQ+IiArIExheW91dC5MSU5FX1NFUCk7CiAKICAgICBzYnVmLmFwcGVuZCgiPHRkIHRpdGxlPVwiTGV2ZWxcIj4iKTsKLSAgICBpZiAoZXZlbnQubGV2ZWwuZXF1YWxzKExldmVsLkRFQlVHKSkgeworICAgIGlmIChldmVudC5nZXRMZXZlbCgpLmVxdWFscyhMZXZlbC5ERUJVRykpIHsKICAgICAgIHNidWYuYXBwZW5kKCI8Zm9udCBjb2xvcj1cIiMzMzk5MzNcIj4iKTsKLSAgICAgIHNidWYuYXBwZW5kKGV2ZW50LmxldmVsKTsKKyAgICAgIHNidWYuYXBwZW5kKGV2ZW50LmdldExldmVsKCkpOwogICAgICAgc2J1Zi5hcHBlbmQoIjwvZm9udD4iKTsKICAgICB9Ci0gICAgZWxzZSBpZihldmVudC5sZXZlbC5pc0dyZWF0ZXJPckVxdWFsKExldmVsLldBUk4pKSB7CisgICAgZWxzZSBpZihldmVudC5nZXRMZXZlbCgpLmlzR3JlYXRlck9yRXF1YWwoTGV2ZWwuV0FSTikpIHsKICAgICAgIHNidWYuYXBwZW5kKCI8Zm9udCBjb2xvcj1cIiM5OTMzMDBcIj48c3Ryb25nPiIpOwotICAgICAgc2J1Zi5hcHBlbmQoZXZlbnQubGV2ZWwpOworICAgICAgc2J1Zi5hcHBlbmQoZXZlbnQuZ2V0TGV2ZWwoKSk7CiAgICAgICBzYnVmLmFwcGVuZCgiPC9zdHJvbmc+PC9mb250PiIpOwogICAgIH0gZWxzZSB7Ci0gICAgICBzYnVmLmFwcGVuZChldmVudC5sZXZlbCk7CisgICAgICBzYnVmLmFwcGVuZChldmVudC5nZXRMZXZlbCgpKTsKICAgICB9CiAgICAgc2J1Zi5hcHBlbmQoIjwvdGQ+IiArIExheW91dC5MSU5FX1NFUCk7CiAKLSAgICBzYnVmLmFwcGVuZCgiPHRkIHRpdGxlPVwiIiArIGV2ZW50LmNhdGVnb3J5TmFtZSArICIgY2F0ZWdvcnlcIj4iKTsKLSAgICBzYnVmLmFwcGVuZChUcmFuc2Zvcm0uZXNjYXBlVGFncyhldmVudC5jYXRlZ29yeU5hbWUpKTsKKyAgICBzYnVmLmFwcGVuZCgiPHRkIHRpdGxlPVwiIiArIGV2ZW50LmdldExvZ2dlck5hbWUoKSArICIgY2F0ZWdvcnlcIj4iKTsKKyAgICBzYnVmLmFwcGVuZChUcmFuc2Zvcm0uZXNjYXBlVGFncyhldmVudC5nZXRMb2dnZXJOYW1lKCkpKTsKICAgICBzYnVmLmFwcGVuZCgiPC90ZD4iICsgTGF5b3V0LkxJTkVfU0VQKTsKIAogICAgIGlmKGxvY2F0aW9uSW5mbykgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Mb2dNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0xvZ01hbmFnZXIuamF2YQppbmRleCAwMTg5YjhhLi5kMDFiOTllIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0xvZ01hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0xvZ01hbmFnZXIuamF2YQpAQCAtMTEsNyArMTEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLkxvZ2dlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuUmVwb3NpdG9yeVNlbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLkRlZmF1bHRSZXBvc2l0b3J5U2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuUm9vdENhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLlJvb3RMb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLkxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuT3B0aW9uQ29udmVydGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouaGVscGVycy5Mb2dMb2c7CkBAIC0yMyw4NCArMjMsNDAgQEAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiAKIC8qKgotICBVc2UgdGhlIDxjb2RlPkxvZ01hbmFnZXI8L2NvZGU+IHRvIHJldHJlaXZlIGluc3RhbmNlcyBvZiB7QGxpbmsgTG9nZ2VyfS4KLQotICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7Ci0qLworICogVXNlIHRoZSA8Y29kZT5Mb2dNYW5hZ2VyPC9jb2RlPiBjbGFzcyB0byByZXRyZWl2ZSB7QGxpbmsgTG9nZ2VyfQorICogaW5zdGFuY2VzIG9yIHRvIG9wZXJhdGUgb24gdGhlIGN1cnJlbnQge0BsaW5rCisgKiBMb2dnZXJSZXBvc2l0b3J5fS4gV2hlbiB0aGUgPGNvZGU+TG9nTWFuYWdlcjwvY29kZT4gY2xhc3MgaXMgbG9hZGVkCisgKiBpbnRvIG1lbW9yeSB0aGUgZGVmYXVsdCBpbml0YWx6YXRpb24gcHJvY2VkdXJlIGlzIGluaXRpdGF0ZWQuIFRoZQorICogZGVmYXVsdCBpbnRpYWxpemF0aW9uIHByb2NlZHVyZTwvYT4gaXMgZGVzY3JpYmVkIGluIHRoZSA8YQorICogaHJlZj0iLi4vLi4vLi4vLi4vbWFudWFsLmh0bWwjZGVmYXVsdEluaXQiPnNob3J0IGxvZzRqIG1hbnVhbDwvYT4uCisgKgorICogQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOyAqLwogcHVibGljIGNsYXNzIExvZ01hbmFnZXIgewogCiAgIC8qKgotICAgICBUaGlzIHN0cmluZyBjb25zdGFudCBpcyBzZXQgdG8gPGI+bG9nNGoucHJvcGVydGllczwvYj4gdGhlIG5hbWUKLSAgICAgb2YgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIGJ5IGRlZmF1bHQgaW4gY2xhc3NwYXRoLiBJZiB0aGUKLSAgICAgZmlsZSBjYW4gYmUgZm91bmQsIHRoZW4gaXQgaXMgZmVkIHRvIHRoZSB7QGxpbmsKLSAgICAgUHJvcGVydHlDb25maWd1cmF0b3J9LgotCi0gICAgIFNlZSBhbHNvIHtAbGluayAjREVGQVVMVF9DT05GSUdVUkFUSU9OX0tFWX0gZm9yIGEgbW9yZSBnZW5lcmFsCi0gICAgIGFsdGVybmF0aXZlLgotCi0gICAgIDxwPlNlZSBhbHNvIHRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIDxhCi0gICAgIGhyZWY9Ii4uLy4uLy4uLy4uL21hbnVhbC5odG1sI2RlZmF1bHRJbml0Ij5kZWZhdWx0Ci0gICAgIGludGlhbGl6YXRpb248L2E+IHByb2NlZHVyZS4KLQotICAgICBAc2luY2UgMC44LjUgKi8KLSAgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05GSUdVUkFUSU9OX0ZJTEUgPSAibG9nNGoucHJvcGVydGllcyI7Ci0gICAgIAotICAvKioKLSAgICAgVGhpcyBzdHJpbmcgY29uc3RhbnQgaXMgc2V0IHRvIDxiPmxvZzRqLmNvbmZpZ3VyYXRpb248L2I+LiAKLQotICAgICA8cD5JdCBjb3JyZXNwb25kcyB0byBuYW1lIG9mIGEgc3lzdGVtIHByb3BlcnR5IHRoYXQsIGlmIHNldCwKLSAgICAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGZpbGUKLSAgICAgb3Ige0BsaW5rIFVSTH0gd2l0aCB3aGljaCBsb2c0aiBzaG91bGQgY29uZmlndXJlIGl0c2VsZi4gU2VlCi0gICAgIHtAbGluayBPcHRpb25Db252ZXJ0ZXIjc2VsZWN0QW5kQ29uZmlndXJlfSBmb3IgbW9yZSBkZXRhaWxlZAotICAgICBpbmZvcm1hdGlvbiBvbiB0aGUgcHJvY2Vzc2luZyBvZiB0aGlzIG9wdGlvbi4KLQotICAgICA8cD5TZXR0aW5nIHRoZSA8Yj5sb2c0ai5jb25maWd1cmF0aW9uPC9iPiBzeXN0ZW0gcHJvcGVydHkKLSAgICAgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNlYXJjaCBmb3IgdGhlIGZpbGUgPGI+bG9nNGoucHJvcGVydGllczwvYj4uCi0KLSAgICAgPHA+Tm90ZSB0aGF0IGFsbCBwcm9wZXJ0eSBrZXlzIGFyZSBjYXNlIHNlbnNpdGl2ZS4gIAotCi0gICAgIDxwPlNlZSBhbHNvIHRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIDxhCi0gICAgIGhyZWY9Ii4uLy4uLy4uLy4uL21hbnVhbC5odG1sI2RlZmF1bHRJbml0Ij5kZWZhdWx0Ci0gICAgIGludGlhbGl6YXRpb248L2E+IHByb2NlZHVyZS4KLQotICAgICBAc2luY2UgMS4wICovCi0gICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIERFRkFVTFRfQ09ORklHVVJBVElPTl9LRVk9ImxvZzRqLmNvbmZpZ3VyYXRpb24iOwotCi0gLyoqCi0gICAgIFRoaXMgc3RyaW5nIGNvbnN0YW50IGlzIHNldCB0byA8Yj5sb2c0ai5jb25maWd1cmF0b3JDbGFzczwvYj4uIAotCi0gICAgIDxwPkl0IGNvcnJlc3BvbmRzIHRvIG5hbWUgb2YgYSBzeXN0ZW0gcHJvcGVydHkgdGhhdCwgaWYgc2V0LAotICAgICBzcGVjaWZpZXMgdGhlIGNsYXNzIG5hbWUgdG8gdXNlIHRvIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlCi0gICAgIGxvZzRqLiBTZWUge0BsaW5rIE9wdGlvbkNvbnZlcnRlciNzZWxlY3RBbmRDb25maWd1cmV9IGZvciBtb3JlCi0gICAgIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBwcm9jZXNzaW5nIG9mIHRoaXMgb3B0aW9uLgotCi0gICAgIDxwPlNldHRpbmcgdGhlIDxiPmxvZzRqLmNvbmZpZ3VyYXRpb248L2I+IHN5c3RlbSBwcm9wZXJ0eQotICAgICBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2VhcmNoIGZvciB0aGUgZmlsZSA8Yj5sb2c0ai5wcm9wZXJ0aWVzPC9iPi4KLQotICAgICA8cD5Ob3RlIHRoYXQgYWxsIHByb3BlcnR5IGtleXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiAgCi0KLSAgICAgPHA+U2VlIGFsc28gdGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgPGEKLSAgICAgaHJlZj0iLi4vLi4vLi4vLi4vbWFudWFsLmh0bWwjZGVmYXVsdEluaXQiPmRlZmF1bHQKLSAgICAgaW50aWFsaXphdGlvbjwvYT4gcHJvY2VkdXJlLgorICAgKiBAZGVwcmVjYXRlZCBUaGlzIHZhcmlhYmxlIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgd2lsbAorICAgKiBiZWNvbWUgcGFja2FnZSBwcm90ZWN0ZWQgaW4gZnV0dXJlIHZlcnNpb25zLgorICAgKiAqLworICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTkZJR1VSQVRJT05fRklMRSA9ICJsb2c0ai5wcm9wZXJ0aWVzIjsKKyAgCisgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9YTUxfQ09ORklHVVJBVElPTl9GSUxFID0gImxvZzRqLnhtbCI7ICAKICAgIAotICAgICBAc2luY2UgMS4yICovCi0gICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIENPTkZJR1VSQVRPUl9DTEFTU19LRVk9ImxvZzRqLmNvbmZpZ3VyYXRvckNsYXNzIjsKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIFRoaXMgdmFyaWFibGUgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsCisgICAqIGJlY29tZSBwcml2YXRlIGluIGZ1dHVyZSB2ZXJzaW9ucy4KKyAgICogKi8KKyAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgREVGQVVMVF9DT05GSUdVUkFUSU9OX0tFWT0ibG9nNGouY29uZmlndXJhdGlvbiI7CiAKICAgLyoqCi0gICAgICBTZXR0aW5nIHRoZSBzeXN0ZW0gcHJvcGVydHkgPGI+bG9nNGouZGVmYXVsdEluaXRPdmVycmlkZTwvYj4gdG8KLSAgICAgICJ0cnVlIiBvciBhbnkgb3RoZXIgdmFsdWUgdGhhbiAiZmFsc2UiIHdpbGwgc2tpcCBkZWZhdWx0Ci0gICAgICBjb25maWd1cmF0aW9uIHByb2Nlc3MuCisgICAqIEBkZXByZWNhdGVkIFRoaXMgdmFyaWFibGUgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsCisgICAqIGJlY29tZSBwcml2YXRlIGluIGZ1dHVyZSB2ZXJzaW9ucy4KKyAgICogKi8KKyAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgQ09ORklHVVJBVE9SX0NMQVNTX0tFWT0ibG9nNGouY29uZmlndXJhdG9yQ2xhc3MiOwogCi0gICAgIDxwPlRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBERUZBVUxUX0lOSVRfT1ZFUlJJREVfS0VZIHN0cmluZwotICAgICBjb25zdGFudCBpcyA8Yj5sb2c0ai5kZWZhdWx0SW5pdE92ZXJyaWRlPC9iPi4KLQotICAgICA8cD5TZWUgYWxzbyB0aGUgZnVsbCBkZXNjcmlwdGlvbiBvZiA8YQotICAgICBocmVmPSIuLi8uLi8uLi8uLi9tYW51YWwuaHRtbCNkZWZhdWx0SW5pdCI+ZGVmYXVsdAotICAgICBpbnRpYWxpemF0aW9uPC9hPiBwcm9jZWR1cmUuCi0KLSAgICAgPHA+Tm90ZSB0aGF0IGFsbCBwcm9wZXJ0eSBrZXlzIGFyZSBjYXNlIHNlbnNpdGl2ZS4gIAotCi0gICAgIEBzaW5jZSAwLjguNSAqLworICAvKioKKyAgKiBAZGVwcmVjYXRlZCBUaGlzIHZhcmlhYmxlIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gSXQgd2lsbAorICAqIGJlY29tZSBwcml2YXRlIGluIGZ1dHVyZSB2ZXJzaW9ucy4KKyAgKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTklUX09WRVJSSURFX0tFWSA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2c0ai5kZWZhdWx0SW5pdE92ZXJyaWRlIjsKIApAQCAtMTEwLDQyICs2Niw1NCBAQAogCiAgIHN0YXRpYyB7CiAgICAgLy8gQnkgZGVmYXVsdCB3ZSB1c2UgYSBEZWZhdWx0UmVwb3NpdG9yeVNlbGVjdG9yIHdoaWNoIGFsd2F5cyByZXR1cm5zICdoJy4KLSAgICBIaWVyYXJjaHkgaCA9IG5ldyBIaWVyYXJjaHkobmV3IFJvb3RDYXRlZ29yeSgoTGV2ZWwpIExldmVsLkRFQlVHKSk7CisgICAgSGllcmFyY2h5IGggPSBuZXcgSGllcmFyY2h5KG5ldyBSb290TG9nZ2VyKChMZXZlbCkgTGV2ZWwuREVCVUcpKTsKICAgICByZXBvc2l0b3J5U2VsZWN0b3IgPSBuZXcgRGVmYXVsdFJlcG9zaXRvcnlTZWxlY3RvcihoKTsKIAogICAgIC8qKiBTZWFyY2ggZm9yIHRoZSBwcm9wZXJ0aWVzIGZpbGUgbG9nNGoucHJvcGVydGllcyBpbiB0aGUgQ0xBU1NQQVRILiAgKi8KICAgICBTdHJpbmcgb3ZlcnJpZGUgPU9wdGlvbkNvbnZlcnRlci5nZXRTeXN0ZW1Qcm9wZXJ0eShERUZBVUxUX0lOSVRfT1ZFUlJJREVfS0VZLAogCQkJCQkJICAgICAgIG51bGwpOwogCi0gICAgLy8gaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBpbml0IG92ZXJyaWRlLCB0aGVtIGdldCB0aGUgcmVzb3VyY2UKKyAgICAvLyBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGluaXQgb3ZlcnJpZGUsIHRoZW4gZ2V0IHRoZSByZXNvdXJjZQogICAgIC8vIHNwZWNpZmllZCBieSB0aGUgdXNlciBvciB0aGUgZGVmYXVsdCBjb25maWcgZmlsZS4KICAgICBpZihvdmVycmlkZSA9PSBudWxsIHx8ICJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShvdmVycmlkZSkpIHsKLSAgICAgIFN0cmluZyByZXNvdXJjZSA9IE9wdGlvbkNvbnZlcnRlci5nZXRTeXN0ZW1Qcm9wZXJ0eSgKLQkJCQkJCSAgREVGQVVMVF9DT05GSUdVUkFUSU9OX0tFWSwgCi0JCQkJCQkgIERFRkFVTFRfQ09ORklHVVJBVElPTl9GSUxFKTsKKworICAgICAgU3RyaW5nIGNvbmZpZ3VyYXRpb25PcHRpb25TdHIgPSBPcHRpb25Db252ZXJ0ZXIuZ2V0U3lzdGVtUHJvcGVydHkoCisJCQkJCQkJICBERUZBVUxUX0NPTkZJR1VSQVRJT05fS0VZLCAKKwkJCQkJCQkgIG51bGwpOwogCiAgICAgICBTdHJpbmcgY29uZmlndXJhdG9yQ2xhc3NOYW1lID0gT3B0aW9uQ29udmVydGVyLmdldFN5c3RlbVByb3BlcnR5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHVVJBVE9SX0NMQVNTX0tFWSwgCiAJCQkJCQkgICBudWxsKTsKIAogICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICB0cnkgewotCS8vIHNvLCByZXNvdXJjZSBpcyBub3QgYSBVUkw6Ci0JLy8gYXR0ZW1wdCB0byBnZXQgdGhlIHJlc291cmNlIGZyb20gdGhlIGNsYXNzIHBhdGgKLQl1cmwgPSBuZXcgVVJMKHJlc291cmNlKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgewotCXVybCA9IExvYWRlci5nZXRSZXNvdXJjZShyZXNvdXJjZSk7IAotICAgICAgfQkKKworICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgdGhlIGxvZzRqLmNvbmZpZ3VyYXRpb24KKyAgICAgIC8vIHByb3BlcnR5LCB3ZSBzZWFyY2ggZmlyc3QgZm9yIHRoZSBmaWxlICJsb2c0ai54bWwiIGFuZCB0aGVuCisgICAgICAvLyAibG9nNGoucHJvcGVydGllcyIKKyAgICAgIGlmKGNvbmZpZ3VyYXRpb25PcHRpb25TdHIgPT0gbnVsbCkgewkKKwl1cmwgPSBMb2FkZXIuZ2V0UmVzb3VyY2UoREVGQVVMVF9YTUxfQ09ORklHVVJBVElPTl9GSUxFKTsKKwlpZih1cmwgPT0gbnVsbCkgeworCSAgdXJsID0gTG9hZGVyLmdldFJlc291cmNlKERFRkFVTFRfQ09ORklHVVJBVElPTl9GSUxFKTsKKwl9CisgICAgICB9IGVsc2UgeworCXRyeSB7CisJICB1cmwgPSBuZXcgVVJMKGNvbmZpZ3VyYXRpb25PcHRpb25TdHIpOworCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgeworCSAgLy8gc28sIHJlc291cmNlIGlzIG5vdCBhIFVSTDoKKwkgIC8vIGF0dGVtcHQgdG8gZ2V0IHRoZSByZXNvdXJjZSBmcm9tIHRoZSBjbGFzcyBwYXRoCisJICB1cmwgPSBMb2FkZXIuZ2V0UmVzb3VyY2UoY29uZmlndXJhdGlvbk9wdGlvblN0cik7IAorCX0JCisgICAgICB9CiAgICAgICAKICAgICAgIC8vIElmIHdlIGhhdmUgYSBub24tbnVsbCB1cmwsIHRoZW4gZGVsZWdhdGUgdGhlIHJlc3Qgb2YgdGhlCiAgICAgICAvLyBjb25maWd1cmF0aW9uIHRvIHRoZSBPcHRpb25Db252ZXJ0ZXIuc2VsZWN0QW5kQ29uZmlndXJlCiAgICAgICAvLyBtZXRob2QuCiAgICAgICBpZih1cmwgIT0gbnVsbCkgewotCUxvZ0xvZy5kZWJ1ZygiVXNpbmcgVVJMIFsiK3VybCsiXSBmb3IgYXV0b21hdGljIGxvZzRqIGNvbmZpZ3VyYXRpb24uIik7ICAgICAgICAKKwlMb2dMb2cuZGVidWcoIlVzaW5nIFVSTCBbIit1cmwrIl0gZm9yIGF1dG9tYXRpYyBsb2c0aiBjb25maWd1cmF0aW9uLiIpOyAgICAgIAogCU9wdGlvbkNvbnZlcnRlci5zZWxlY3RBbmRDb25maWd1cmUodXJsLCBjb25maWd1cmF0b3JDbGFzc05hbWUsIAogCQkJCQkgICBMb2dNYW5hZ2VyLmdldExvZ2dlclJlcG9zaXRvcnkoKSk7CiAgICAgICB9IGVsc2UgewotCUxvZ0xvZy5kZWJ1ZygiQ291bGQgbm90IGZpbmQgcmVzb3VyY2U6IFsiK3Jlc291cmNlKyJdLiIpOworCUxvZ0xvZy5kZWJ1ZygiQ291bGQgbm90IGZpbmQgcmVzb3VyY2U6IFsiK2NvbmZpZ3VyYXRpb25PcHRpb25TdHIrIl0uIik7CiAgICAgICB9CiAgICAgfSAgCiAgIH0gCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0xvZ2dlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Mb2dnZXIuamF2YQppbmRleCBhYWI3ODlkLi42MWEzNmUzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0xvZ2dlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyLmphdmEKQEAgLTc3LDcgKzc3LDE2IEBACiAgIC8vfQogCiAgIC8qKgotICAgICBSZXRyaWV2ZSBhIGxvZ2dlciBieSBuYW1lLgorICAgKiBSZXRyaWV2ZSBhIGxvZ2dlciBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZQorICAgKiA8Y29kZT5uYW1lPC9jb2RlPiBwYXJhbWV0ZXIuIElmIHRoZSBuYW1lZCBsb2dnZXIgYWxyZWFkeSBleGlzdHMsCisgICAqIHRoZW4gdGhlIGV4aXN0aW5nIGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSBuZXcKKyAgICogaW5zdGFuY2UgaXMgY3JlYXRlZC4gIAorICAgKgorICAgKiA8cD5CeSBkZWZhdWx0LCBsb2dnZXJzIGRvIG5vdCBoYXZlIGEgc2V0IGxldmVsIGJ1dCBpbmhlcml0IGl0CisgICAqIGZyb20gdGhlaXIgbmVhcmVhc3QgYW5jZXN0b3Igd2l0aCBhIHNldCBsZXZlbC4gVGhpcyBpcyBvbmUgb2YgdGhlCisgICAqIGNlbnRyYWwgZmVhdHVyZXMgb2YgbG9nNGouCisgICAqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2dnZXIgdG8gcmV0cmlldmUuICAKICAgKi8KICAgc3RhdGljCiAgIHB1YmxpYwpAQCAtODYsNyArOTUsMTEgQEAKICAgfQogCiAgIC8qKgotICAgICBTYW1lIGFzIGNhbGxpbmcgPGNvZGU+Z2V0TG9nZ2VyKGNsYXp6LmdldE5hbWUoKSk8L2NvZGU+LgorICAgKiBTaG9ydGhhbmQgZm9yIDxjb2RlPmdldExvZ2dlcihjbGF6ei5nZXROYW1lKCkpPC9jb2RlPi4KKyAgICoKKyAgICogQHBhcmFtIGNsYXp6IFRoZSBuYW1lIG9mIDxjb2RlPmNsYXp6PC9jb2RlPiB3aWxsIGJlIHVzZWQgYXMgdGhlCisgICAqIG5hbWUgb2YgdGhlIGxvZ2dlciB0byByZXRyaWV2ZS4gIFNlZSB7QGxpbmsgI2dldExvZ2dlcihTdHJpbmcpfQorICAgKiBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KICAgICovCiAgIHN0YXRpYwogICBwdWJsaWMKQEAgLTk2LDcgKzEwOSwxNSBAQAogCiAKICAgLyoqCi0gICAgIFJldHJpZXZlIHRoZSByb290IGxvZ2dlci4KKyAgICogUmV0dXJuIHRoZSByb290IGxvZ2dlciBmb3IgdGhlIGN1cnJlbnQgbG9nZ2VyIHJlcG9zaXRvcnkuCisgICAqIDxwPgorICAgKiBUaGUge0BsaW5rICNnZXROYW1lIExvZ2dlci5nZXROYW1lKCl9IG1ldGhvZCBmb3IgdGhlIHJvb3QgbG9nZ2VyIGFsd2F5cyByZXR1cm5zCisgICAqIHN0aXJuZyB2YWx1ZTogInJvb3QiLiBIb3dldmVyLCBjYWxsaW5nCisgICAqIDxjb2RlPkxvZ2dlci5nZXRMb2dnZXIoInJvb3QiKTwvY29kZT4gZG9lcyBub3QgcmV0cmlldmUgdGhlIHJvb3QKKyAgICogbG9nZ2VyIGJ1dCBhIGxvZ2dlciBqdXN0IHVuZGVyIHJvb3QgbmFtZWQgInJvb3QiLgorICAgKiA8cD4KKyAgICogSW4gb3RoZXIgd29yZHMsIGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgdGhlIG9ubHkgd2F5IHRvIHJldHJpZXZlIHRoZSAKKyAgICogcm9vdCBsb2dnZXIuCiAgICAqLwogICBwdWJsaWMKICAgc3RhdGljCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL01EQy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9NREMuamF2YQppbmRleCAwMDJiMzk5Li45ZmQ5M2ZmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL01EQy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovTURDLmphdmEKQEAgLTg4LDExICs4OCwxMCBAQAogCiAKICAgLyoqCi0gICAgIEdldCB0aGUgY3VycmVudCB0aHJlYWQncyBNREMgYXMgYSBoYXNodGFibGUuCi0gICAqLwotICBwdWJsaWMKLSAgc3RhdGljCi0gIEhhc2h0YWJsZSBnZXRDb250ZXh0KCkgeworICAgKiBHZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgTURDIGFzIGEgaGFzaHRhYmxlLiBUaGlzIG1ldGhvZCBpcworICAgKiBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkuICAKKyAgICogKi8KKyAgcHVibGljIHN0YXRpYyBIYXNodGFibGUgZ2V0Q29udGV4dCgpIHsKICAgICByZXR1cm4gbWRjLmdldENvbnRleHQwKCk7CiAgIH0KIApAQCAtMTA0LDggKzEwMyw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgIEhhc2h0YWJsZSBodCA9IChIYXNodGFibGUpICgoVGhyZWFkTG9jYWxNYXApdGxtKS5nZXQoKTsKICAgICAgIGlmKGh0ID09IG51bGwpIHsKLQlodCA9IG5ldyBIYXNodGFibGUoSFRfU0laRSk7Ci0JKChUaHJlYWRMb2NhbE1hcCl0bG0pLnNldChodCk7CisgICAgICAgIGh0ID0gbmV3IEhhc2h0YWJsZShIVF9TSVpFKTsKKyAgICAgICAgKChUaHJlYWRMb2NhbE1hcCl0bG0pLnNldChodCk7CiAgICAgICB9ICAgIAogICAgICAgaHQucHV0KGtleSwgbyk7CiAgICAgfQpAQCAtMTE3LDEwICsxMTYsMTAgQEAKICAgICAgIHJldHVybiBudWxsOwogICAgIH0gZWxzZSB7ICAgICAgIAogICAgICAgSGFzaHRhYmxlIGh0ID0gKEhhc2h0YWJsZSkgKChUaHJlYWRMb2NhbE1hcCl0bG0pLmdldCgpOwotICAgICAgaWYoaHQgIT0gbnVsbCkgewotCXJldHVybiBodC5nZXQoa2V5KTsKKyAgICAgIGlmKGh0ICE9IG51bGwgJiYga2V5ICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGh0LmdldChrZXkpOwogICAgICAgfSBlbHNlIHsKLQlyZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0xMzAsNyArMTI5LDcgQEAKICAgICBpZighamF2YTEpIHsKICAgICAgIEhhc2h0YWJsZSBodCA9IChIYXNodGFibGUpICgoVGhyZWFkTG9jYWxNYXApdGxtKS5nZXQoKTsKICAgICAgIGlmKGh0ICE9IG51bGwpIHsKLQlodC5yZW1vdmUoa2V5KTsKKyAgICAgICAgaHQucmVtb3ZlKGtleSk7CiAgICAgICB9IAogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9OREMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovTkRDLmphdmEKaW5kZXggYWE0NDYxNS4uZWUzNGIyMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9OREMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL05EQy5qYXZhCkBAIC0xOTIsNyArMTkyLDggQEAKIAogCiAgIC8qKgotICAgICBVc2VkIHdoZW4gcHJpbnRpbmcgdGhlIGRpYWdub3N0aWMgY29udGV4dC4KKyAgICAgPGZvbnQgY29sb3I9IiNGRjQwNDAiPjxiPk5ldmVyIHVzZSB0aGlzIG1ldGhvZCBkaXJlY3RseSwgdXNlIHRoZSB7QGxpbmsKKyAgICAgb3JnLmFwYWNoZS5sb2c0ai5zcGkuTG9nZ2luZ0V2ZW50I2dldE5EQ30gbWV0aG9kIGluc3RlYWQ8L2I+PC9mb250Pi4KICAgKi8KICAgc3RhdGljCiAgIHB1YmxpYwpAQCAtMjA1LDEwICsyMDYsMTAgQEAKICAgfQogICAKICAgLyoqCi0gICAgIEdldCB0aGUgY3VycmVudCBuZXN0aW5nIGRlcHRoIG9mIHRoaXMgZGlhZ25vc3RpYyBjb250ZXh0LgotCi0gICAgIEBzZWUgI3NldE1heERlcHRoCi0gICAgIEBzaW5jZSAwLjcuNQorICAgKiBHZXQgdGhlIGN1cnJlbnQgbmVzdGluZyBkZXB0aCBvZiB0aGlzIGRpYWdub3N0aWMgY29udGV4dC4KKyAgICoKKyAgICogQHNlZSAjc2V0TWF4RGVwdGgKKyAgICogQHNpbmNlIDAuNy41CiAgICAqLwogICBwdWJsaWMKICAgc3RhdGljCkBAIC0yMzksMTMgKzI0MCwxMyBAQAogCiAgICAgICBpbnQgbWlzc2VzID0gMDsKICAgICAgIHYgPSBuZXcgVmVjdG9yKCk7IAotICAgICAgRW51bWVyYXRpb24gZW51bSA9IGh0LmtleXMoKTsKKyAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gaHQua2V5cygpOwogICAgICAgLy8gV2UgZ2l2ZSB1cCBhZnRlciA0IHN0cmFpZ3QgbWlzc3Nlcy4gVGhhdCBpcyA0IGNvbnNlY3V0aXZlCiAgICAgICAvLyBpbnNwZWN0ZWQgdGhyZWFkcyBpbiAnaHQnIHRoYXQgdHVybiBvdXQgdG8gYmUgYWxpdmUuCiAgICAgICAvLyBUaGUgaGlnaGVyIHRoZSBwcm9wb3J0aW9uIG9uIGRlYWQgdGhyZWFkcyBpbiBodCwgdGhlIGhpZ2hlciB0aGUKICAgICAgIC8vIGNoYW5jZXMgb2YgcmVtb3ZhbC4KLSAgICAgIHdoaWxlKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkgJiYgKG1pc3NlcyA8PSA0KSkgewotCVRocmVhZCB0ID0gKFRocmVhZCkgZW51bS5uZXh0RWxlbWVudCgpOworICAgICAgd2hpbGUoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkgJiYgKG1pc3NlcyA8PSA0KSkgeworCVRocmVhZCB0ID0gKFRocmVhZCkgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKIAlpZih0LmlzQWxpdmUoKSkgewogCSAgbWlzc2VzKys7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovUHJpb3JpdHkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovUHJpb3JpdHkuamF2YQppbmRleCBmZDJmZTk4Li42MWU4MmE0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL1ByaW9yaXR5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Qcmlvcml0eS5qYXZhCkBAIC05LDEwICs5LDEwIEBACiAvLyBDb250cmlidXRvcnM6ICBLaXRjaGluZyBTaW1vbiA8U2ltb24uS2l0Y2hpbmdAb3JhbmdlLmNoPgogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGo7Ci0KKyAgCiAvKioKICAgIDxmb250IGNvbG9yPSIjQUE0NDQ0Ij5SZWZyYWluIGZyb20gdXNpbmcgdGhpcyBjbGFzcyBkaXJlY3RseSwgdXNlCi0gICB0aGUge0BsaW5rIExldmVsfSBjbGFzcyBpbnN0ZWFkLjwvZm9udD4KKyAgIHRoZSB7QGxpbmsgTGV2ZWx9IGNsYXNzIGluc3RlYWQ8L2ZvbnQ+LgogCiAgICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7ICovCiBwdWJsaWMgY2xhc3MgUHJpb3JpdHkgewpAQCAtMzEsMzEgKzMxLDI4IEBACiAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFMTF9JTlQgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKIAogICAvKioKLSAgICAgVGhlIDxjb2RlPkZBVEFMPC9jb2RlPiBsZXZlbCBkZXNpZ25hdGVzIHZlcnkgc2V2ZXJlIGVycm9yCi0gICAgIGV2ZW50cyB0aGF0IHdpbGwgcHJlc3VtYWJseSBsZWFkIHRoZSBhcHBsaWNhdGlvbiB0byBhYm9ydC4KKyAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBMZXZlbCNGQVRBTH0gaW5zdGVhZC4KICAgICovCiAgIGZpbmFsIHN0YXRpYyBwdWJsaWMgUHJpb3JpdHkgRkFUQUwgPSBuZXcgTGV2ZWwoRkFUQUxfSU5ULCAiRkFUQUwiLCAwKTsKIAogICAvKioKLSAgICAgVGhlIDxjb2RlPkVSUk9SPC9jb2RlPiBsZXZlbCBkZXNpZ25hdGVzIGVycm9yIGV2ZW50cyB0aGF0Ci0gICAgIG1pZ2h0IHN0aWxsIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBjb250aW51ZSBydW5uaW5nLiAgKi8KKyAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBMZXZlbCNFUlJPUn0gaW5zdGVhZC4KKyAgICovCiAgIGZpbmFsIHN0YXRpYyBwdWJsaWMgUHJpb3JpdHkgRVJST1IgPSBuZXcgTGV2ZWwoRVJST1JfSU5ULCAiRVJST1IiLCAzKTsKIAogICAvKioKLSAgICAgVGhlIDxjb2RlPldBUk48L2NvZGU+IGxldmVsIGRlc2lnbmF0ZXMgcG90ZW50aWFsbHkgaGFybWZ1bCBzaXR1YXRpb25zLgotICAqLworICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIExldmVsI1dBUk59IGluc3RlYWQuCisgICAqLwogICBmaW5hbCBzdGF0aWMgcHVibGljIFByaW9yaXR5IFdBUk4gID0gbmV3IExldmVsKFdBUk5fSU5ULCAiV0FSTiIsICA0KTsKIAogICAvKioKLSAgICAgVGhlIDxjb2RlPklORk88L2NvZGU+IGxldmVsIGRlc2lnbmF0ZXMgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgICB0aGF0IGhpZ2hsaWdodCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGFwcGxpY2F0aW9uIGF0IGNvYXJzZS1ncmFpbmVkCi0gICAgIGxldmVsLiAgKi8KKyAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBMZXZlbCNJTkZPfSBpbnN0ZWFkLgorICAgKi8KICAgZmluYWwgc3RhdGljIHB1YmxpYyBQcmlvcml0eSBJTkZPICA9IG5ldyBMZXZlbChJTkZPX0lOVCwgIklORk8iLCAgNik7CiAKICAgLyoqCi0gICAgIFRoZSA8Y29kZT5ERUJVRzwvY29kZT4gcHJpb3JpdHkgZGVzaWduYXRlcyBmaW5lLWdyYWluZWQKLSAgICAgaW5mb3JtYXRpb25hbCBldmVudHMgdGhhdCBhcmUgbW9zdCB1c2VmdWwgdG8gZGVidWcgYW4KLSAgICAgYXBwbGljYXRpb24uICAqLworICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIExldmVsI0RFQlVHfSBpbnN0ZWFkLgorICAgKi8KICAgZmluYWwgc3RhdGljIHB1YmxpYyBQcmlvcml0eSBERUJVRyA9IG5ldyBMZXZlbChERUJVR19JTlQsICJERUJVRyIsIDcpOwogCiAgIApAQCAtMTQxLDEyICsxMzgsNyBAQAogICB9CiAKICAgLyoqCi0gICAgIENvbnZlcnQgdGhlIHN0cmluZyBwYXNzZWQgYXMgYXJndW1lbnQgdG8gYSBwcmlvcml0eS4gSWYgdGhlCi0gICAgIGNvbnZlcnNpb24gZmFpbHMsIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyB7QGxpbmsgI0RFQlVHfS4gCi0KLSAgICAgQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUge0BsaW5rIExldmVsI3RvTGV2ZWwoU3RyaW5nKX0gbWV0aG9kIGluc3RlYWQufQotICAgCi0KKyAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUge0BsaW5rIExldmVsI3RvTGV2ZWwoU3RyaW5nKX0gbWV0aG9kIGluc3RlYWQuCiAgICovCiAgIHB1YmxpYwogICBzdGF0aWMKQEAgLTE1NSwxMCArMTQ3LDggQEAKICAgfQogCiAgIC8qKgotICAgIENvbnZlcnQgYW4gaW50ZWdlciBwYXNzZWQgYXMgYXJndW1lbnQgdG8gYSBwcmlvcml0eS4gSWYgdGhlCi0gICAgY29udmVyc2lvbiBmYWlscywgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHtAbGluayAjREVCVUd9LgotCi0gICovCisgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlIHtAbGluayBMZXZlbCN0b0xldmVsKGludCl9IG1ldGhvZCBpbnN0ZWFkLiAgIAorICAgKi8KICAgcHVibGljCiAgIHN0YXRpYwogICBQcmlvcml0eSB0b1ByaW9yaXR5KGludCB2YWwpIHsKQEAgLTE2Niw4ICsxNTYsNyBAQAogICB9CiAKICAgLyoqCi0gICAgQ29udmVydCBhbiBpbnRlZ2VyIHBhc3NlZCBhcyBhcmd1bWVudCB0byBhIHByaW9yaXR5LiBJZiB0aGUKLSAgICBjb252ZXJzaW9uIGZhaWxzLCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNwZWNpZmllZCBkZWZhdWx0LgorICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSB7QGxpbmsgTGV2ZWwjdG9MZXZlbChpbnQsIExldmVsKX0gbWV0aG9kIGluc3RlYWQuICAgCiAgICovCiAgIHB1YmxpYwogICBzdGF0aWMKQEAgLTE3NiwxMCArMTY1LDggQEAKICAgfQogCiAgIC8qKgotICAgICBDb252ZXJ0IHRoZSBzdHJpbmcgcGFzc2VkIGFzIGFyZ3VtZW50IHRvIGEgcHJpb3JpdHkuIElmIHRoZQotICAgICBjb252ZXJzaW9uIGZhaWxzLCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHZhbHVlIG9mCi0gICAgIDxjb2RlPmRlZmF1bHRQcmlvcml0eTwvY29kZT4uICAKLSAgKi8KKyAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUge0BsaW5rIExldmVsI3RvTGV2ZWwoU3RyaW5nLCBMZXZlbCl9IG1ldGhvZCBpbnN0ZWFkLiAgIAorICAgKi8KICAgcHVibGljCiAgIHN0YXRpYwogICBQcmlvcml0eSB0b1ByaW9yaXR5KFN0cmluZyBzQXJnLCBQcmlvcml0eSBkZWZhdWx0UHJpb3JpdHkpIHsgICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovUHJvcGVydHlDb25maWd1cmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovUHJvcGVydHlDb25maWd1cmF0b3IuamF2YQppbmRleCBjMTVkNDM4Li5iNmI5OWI2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL1Byb3BlcnR5Q29uZmlndXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Qcm9wZXJ0eUNvbmZpZ3VyYXRvci5qYXZhCkBAIC0zMyw4ICszMyw4IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIAogLyoqCi0gICBFeHRlbmRzIHtAbGluayBCYXNpY0NvbmZpZ3VyYXRvcn0gdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIGZyb20gYW4KLSAgIGV4dGVybmFsIGZpbGUuICBTZWUgPGI+e0BsaW5rICNkb0NvbmZpZ3VyZShTdHJpbmcsIExvZ2dlclJlcG9zaXRvcnkpfTwvYj4gZm9yIHRoZQorICAgQWxsb3dzIHRoZSBjb25maWd1cmF0aW9uIG9mIGxvZzRqIGZyb20gYW4gZXh0ZXJuYWwgZmlsZS4gIFNlZQorICAgPGI+e0BsaW5rICNkb0NvbmZpZ3VyZShTdHJpbmcsIExvZ2dlclJlcG9zaXRvcnkpfTwvYj4gZm9yIHRoZQogICAgZXhwZWN0ZWQgZm9ybWF0LgogCiAgICA8cD5JdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIHNlZSBob3cgbG9nNGogaXMgcmVhZGluZyBjb25maWd1cmF0aW9uCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgLyoqCiAgICAgUmVhZCBjb25maWd1cmF0aW9uIGZyb20gYSBmaWxlLiA8Yj5UaGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbiBpcwogICAgIG5vdCBjbGVhcmVkIG5vciByZXNldC48L2I+IElmIHlvdSByZXF1aXJlIGEgZGlmZmVyZW50IGJlaGF2aW9yLAotICAgIHRoZW4gY2FsbCB7QGxpbmsgQmFzaWNDb25maWd1cmF0b3IjcmVzZXRDb25maWd1cmF0aW9uCisgICAgdGhlbiBjYWxsIHtAbGluayAgTG9nTWFuYWdlciNyZXNldENvbmZpZ3VyYXRpb24KICAgICByZXNldENvbmZpZ3VyYXRpb259IG1ldGhvZCBiZWZvcmUgY2FsbGluZwogICAgIDxjb2RlPmRvQ29uZmlndXJlPC9jb2RlPi4KIApAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgPC9wcmU+CiAKICAgICA8cD5UaGUgbGV2ZWwgdmFsdWUgY2FuIGNvbnNpc3Qgb2YgdGhlIHN0cmluZyB2YWx1ZXMgT0ZGLCBGQVRBTCwKLSAgICBFUlJPUiwgV0FSTiwgSU5GTywgREVCVUcsIEFMTCBvciBhIDxlbT5jdXN0b20gbGV2ZWw8L2U+IHZhbHVlLiBBCisgICAgRVJST1IsIFdBUk4sIElORk8sIERFQlVHLCBBTEwgb3IgYSA8ZW0+Y3VzdG9tIGxldmVsPC9lbT4gdmFsdWUuIEEKICAgICBjdXN0b20gbGV2ZWwgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgZm9ybQogICAgIGxldmVsI2NsYXNzbmFtZS4gQnkgZGVmYXVsdCB0aGUgcmVwb3NpdG9yeS13aWRlIHRocmVzaG9sZCBpcyBzZXQKICAgICB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLCBuYW1lbHkgdGhlIGxldmVsIDxjb2RlPkFMTDwvY29kZT4uCkBAIC0xNzUsNyArMTc1LDcgQEAKIAogICAgIDxwPkZvciBub24tcm9vdCBjYXRlZ29yaWVzIHRoZSBzeW50YXggaXMgYWxtb3N0IHRoZSBzYW1lOgogICAgIDxwcmU+Ci0gICAgbG9nNGoubG9nZ2VyLmxvZ2dlcl9uYW1lPVtsZXZlbHxJTkhFUklURURdLCBhcHBlbmRlck5hbWUsIGFwcGVuZGVyTmFtZSwgLi4uCisgICAgbG9nNGoubG9nZ2VyLmxvZ2dlcl9uYW1lPVtsZXZlbHxJTkhFUklURUR8TlVMTF0sIGFwcGVuZGVyTmFtZSwgYXBwZW5kZXJOYW1lLCAuLi4KICAgICA8L3ByZT4KIAogICAgIDxwPlRoZSBtZWFuaW5nIG9mIHRoZSBvcHRpb25hbCBsZXZlbCB2YWx1ZSBpcyBkaXNjdXNzZWQgYWJvdmUKQEAgLTE4Nyw5ICsxODcsMTAgQEAKICAgICBuYW1lZCBsb2dnZXIgcmVtYWlucyB1bnRvdWNoZWQuCiAKICAgICA8cD5CeSBkZWZhdWx0IGNhdGVnb3JpZXMgaW5oZXJpdCB0aGVpciBsZXZlbCBmcm9tIHRoZQotICAgIGhpZXJhcmNoeS4gSG93ZXZlciwgaWYgeW91IHNldCB0aGUgbGV2ZWwgb2YgYSBsb2dnZXIgYW5kCi0gICAgbGF0ZXIgZGVjaWRlIHRoYXQgdGhhdCBsb2dnZXIgc2hvdWxkIGluaGVyaXQgaXRzIGxldmVsLCB0aGVuCi0gICAgeW91IHNob3VsZCBzcGVjaWZ5IElOSEVSSVRFRCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBsZXZlbCB2YWx1ZS4KKyAgICBoaWVyYXJjaHkuIEhvd2V2ZXIsIGlmIHlvdSBzZXQgdGhlIGxldmVsIG9mIGEgbG9nZ2VyIGFuZCBsYXRlcgorICAgIGRlY2lkZSB0aGF0IHRoYXQgbG9nZ2VyIHNob3VsZCBpbmhlcml0IGl0cyBsZXZlbCwgdGhlbiB5b3Ugc2hvdWxkCisgICAgc3BlY2lmeSBJTkhFUklURUQgYXMgdGhlIHZhbHVlIGZvciB0aGUgbGV2ZWwgdmFsdWUuIE5VTEwgaXMgYQorICAgIHN5bm9ueW0gZm9yIElOSEVSSVRFRC4KIAogICAgIDxwPlNpbWlsYXIgdG8gdGhlIHJvb3QgbG9nZ2VyIHN5bnRheCwgZWFjaCA8aT5hcHBlbmRlck5hbWU8L2k+CiAgICAgKHNlcGFyYXRlZCBieSBjb21tYXMpIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIG5hbWVkIGxvZ2dlci4KQEAgLTUwNyw5ICs1MDgsOSBAQAogICAqLwogICBwcm90ZWN0ZWQKICAgdm9pZCBwYXJzZUNhdHNBbmRSZW5kZXJlcnMoUHJvcGVydGllcyBwcm9wcywgTG9nZ2VyUmVwb3NpdG9yeSBoaWVyYXJjaHkpIHsKLSAgICBFbnVtZXJhdGlvbiBlbnVtID0gcHJvcHMucHJvcGVydHlOYW1lcygpOwotICAgIHdoaWxlKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtLm5leHRFbGVtZW50KCk7CisgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7CisgICAgd2hpbGUoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwogICAgICAgaWYoa2V5LnN0YXJ0c1dpdGgoQ0FURUdPUllfUFJFRklYKSB8fCBrZXkuc3RhcnRzV2l0aChMT0dHRVJfUFJFRklYKSkgewogCVN0cmluZyBsb2dnZXJOYW1lID0gbnVsbDsKIAlpZihrZXkuc3RhcnRzV2l0aChDQVRFR09SWV9QUkVGSVgpKSB7CkBAIC01NzYsOSArNTc3LDEzIEBACiAgICAgICAvLyBJZiB0aGUgbGV2ZWwgdmFsdWUgaXMgaW5oZXJpdGVkLCBzZXQgY2F0ZWdvcnkgbGV2ZWwgdmFsdWUgdG8KICAgICAgIC8vIG51bGwuIFdlIGFsc28gY2hlY2sgdGhhdCB0aGUgdXNlciBoYXMgbm90IHNwZWNpZmllZCBpbmhlcml0ZWQgZm9yIHRoZQogICAgICAgLy8gcm9vdCBjYXRlZ29yeS4KLSAgICAgIGlmKGxldmVsU3RyLmVxdWFsc0lnbm9yZUNhc2UoSU5IRVJJVEVEKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICFsb2dnZXJOYW1lLmVxdWFscyhJTlRFUk5BTF9ST09UX05BTUUpKSB7Ci0JbG9nZ2VyLnNldExldmVsKG51bGwpOworICAgICAgaWYoSU5IRVJJVEVELmVxdWFsc0lnbm9yZUNhc2UobGV2ZWxTdHIpIHx8IAorIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC5lcXVhbHNJZ25vcmVDYXNlKGxldmVsU3RyKSkgeworCWlmKGxvZ2dlck5hbWUuZXF1YWxzKElOVEVSTkFMX1JPT1RfTkFNRSkpIHsKKwkgIExvZ0xvZy53YXJuKCJUaGUgcm9vdCBsb2dnZXIgY2Fubm90IGJlIHNldCB0byBudWxsLiIpOworCX0gZWxzZSB7CisJICBsb2dnZXIuc2V0TGV2ZWwobnVsbCk7CisJfQogICAgICAgfSBlbHNlIHsKIAlsb2dnZXIuc2V0TGV2ZWwoT3B0aW9uQ29udmVydGVyLnRvTGV2ZWwobGV2ZWxTdHIsIChMZXZlbCkgTGV2ZWwuREVCVUcpKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovU2ltcGxlTGF5b3V0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL1NpbXBsZUxheW91dC5qYXZhCmluZGV4IDU2NWNhNTQuLjhjNThlZWIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovU2ltcGxlTGF5b3V0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9TaW1wbGVMYXlvdXQuamF2YQpAQCAtNDksNyArNDksNyBAQAogICBTdHJpbmcgZm9ybWF0KExvZ2dpbmdFdmVudCBldmVudCkgewogCiAgICAgc2J1Zi5zZXRMZW5ndGgoMCk7Ci0gICAgc2J1Zi5hcHBlbmQoZXZlbnQubGV2ZWwudG9TdHJpbmcoKSk7CisgICAgc2J1Zi5hcHBlbmQoZXZlbnQuZ2V0TGV2ZWwoKS50b1N0cmluZygpKTsKICAgICBzYnVmLmFwcGVuZCgiIC0gIik7CiAgICAgc2J1Zi5hcHBlbmQoZXZlbnQuZ2V0UmVuZGVyZWRNZXNzYWdlKCkpOwogICAgIHNidWYuYXBwZW5kKExJTkVfU0VQKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovVFRDQ0xheW91dC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9UVENDTGF5b3V0LmphdmEKaW5kZXggNWNlOTRlNi4uY2ViNTI2YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9UVENDTGF5b3V0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9UVENDTGF5b3V0LmphdmEKQEAgLTE1Nyw5ICsxNTcsNyBAQAogICAgPHA+VGltZSwgdGhyZWFkLCBjYXRlZ29yeSBhbmQgZGlhZ25vc3RpYyBjb250ZXh0IGFyZSBwcmludGVkCiAgICBkZXBlbmRpbmcgb24gb3B0aW9ucy4KIAotICAgIEBwYXJhbSBjYXRlZ29yeQotICAgIEBwYXJhbSBsZXZlbAotICAgIEBwYXJhbSBtZXNzYWdlCisgICAgQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBmb3JtYXQKIAogICAqLwogICBwdWJsaWMKQEAgLTE3NSwxMSArMTczLDExIEBACiAgICAgICBidWYuYXBwZW5kKGV2ZW50LmdldFRocmVhZE5hbWUoKSk7CiAgICAgICBidWYuYXBwZW5kKCJdICIpOwogICAgIH0KLSAgICBidWYuYXBwZW5kKGV2ZW50LmxldmVsLnRvU3RyaW5nKCkpOworICAgIGJ1Zi5hcHBlbmQoZXZlbnQuZ2V0TGV2ZWwoKS50b1N0cmluZygpKTsKICAgICBidWYuYXBwZW5kKCcgJyk7CiAKICAgICBpZih0aGlzLmNhdGVnb3J5UHJlZml4aW5nKSB7Ci0gICAgICBidWYuYXBwZW5kKGV2ZW50LmNhdGVnb3J5TmFtZSk7CisgICAgICBidWYuYXBwZW5kKGV2ZW50LmdldExvZ2dlck5hbWUoKSk7CiAgICAgICBidWYuYXBwZW5kKCcgJyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL1dyaXRlckFwcGVuZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL1dyaXRlckFwcGVuZGVyLmphdmEKaW5kZXggNTBiMzNmNC4uNDU2ZDM1YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Xcml0ZXJBcHBlbmRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovV3JpdGVyQXBwZW5kZXIuamF2YQpAQCAtMTk0LDE3ICsxOTQsMTggQEAKICAgICB3cml0ZUZvb3RlcigpOwogICAgIHJlc2V0KCk7CiAgIH0KKwogICAvKioKLSAgICAgQ2xvc2UgdGhlIHVuZGVybHlpbmcge0BsaW5rIGphdmEuaW8uV3JpdGVyfS4KLSAgKi8KLSAgcHJvdGVjdGVkCi0gIHZvaWQgY2xvc2VXcml0ZXIoKSB7CisgICAqIENsb3NlIHRoZSB1bmRlcmx5aW5nIHtAbGluayBqYXZhLmlvLldyaXRlcn0uCisgICAqICovCisgIHByb3RlY3RlZCB2b2lkIGNsb3NlV3JpdGVyKCkgewogICAgIGlmKHF3ICE9IG51bGwpIHsKICAgICAgIHRyeSB7CiAJcXcuY2xvc2UoKTsKICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCUxvZ0xvZy5lcnJvcigiQ291bGQgbm90IGNsb3NlICIgKyBxdywgZSk7IC8vIGRvIG5lZWQgdG8gaW52b2tlIGFuIGVycm9yIGhhbmRsZXIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCAgdGhpcyBsYXRlIHN0YWdlCisJLy8gVGhlcmUgaXMgZG8gbmVlZCB0byBpbnZva2UgYW4gZXJyb3IgaGFuZGxlciBhdCB0aGlzIGxhdGUKKwkvLyBzdGFnZS4KKwlMb2dMb2cuZXJyb3IoIkNvdWxkIG5vdCBjbG9zZSAiICsgcXcsIGUpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjM0LDEzICsyMzUsMTEgQEAKICAgICByZXR1cm4gcmV0dmFsOwogICB9CiAKLSAgcHVibGljCi0gIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKyAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKICAgICByZXR1cm4gZW5jb2Rpbmc7CiAgIH0KIAotICBwdWJsaWMKLSAgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgdmFsdWUpIHsKKyAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIHZhbHVlKSB7CiAgICAgZW5jb2RpbmcgPSB2YWx1ZTsKICAgfQogCkBAIC0yNTAsOSArMjQ5LDcgQEAKICAgLyoqCiAgICAgIFNldCB0aGUge0BsaW5rIEVycm9ySGFuZGxlcn0gZm9yIHRoaXMgV3JpdGVyQXBwZW5kZXIgYW5kIGFsc28gdGhlCiAgICAgIHVuZGVybHlpbmcge0BsaW5rIFF1aWV0V3JpdGVyfSBpZiBhbnkuICovCi0gIHB1YmxpYwotICBzeW5jaHJvbml6ZWQKLSAgdm9pZCBzZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyIGVoKSB7CisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyIGVoKSB7CiAgICAgaWYoZWggPT0gbnVsbCkgewogICAgICAgTG9nTG9nLndhcm4oIllvdSBoYXZlIHRyaWVkIHRvIHNldCBhIG51bGwgZXJyb3ItaGFuZGxlci4iKTsKICAgICB9IGVsc2UgewpAQCAtMjc1LDkgKzI3Miw3IEBACiAgICAgPHA+PGI+V0FSTklORzo8L2I+IExvZ2dpbmcgdG8gYW4gdW5vcGVuZWQgV3JpdGVyIHdpbGwgZmFpbC4KICAgICA8cD4KICAgICBAcGFyYW0gd3JpdGVyIEFuIGFscmVhZHkgb3BlbmVkIFdyaXRlci4gICovCi0gIHB1YmxpYwotICBzeW5jaHJvbml6ZWQKLSAgdm9pZCBzZXRXcml0ZXIoV3JpdGVyIHdyaXRlcikgeworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0V3JpdGVyKFdyaXRlciB3cml0ZXIpIHsKICAgICByZXNldCgpOwogICAgIHRoaXMucXcgPSBuZXcgUXVpZXRXcml0ZXIod3JpdGVyLCBlcnJvckhhbmRsZXIpOwogICAgIC8vdGhpcy50cCA9IG5ldyBUcmFjZXJQcmludFdyaXRlcihxdyk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0NvbnRyb2xQYW5lbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9Db250cm9sUGFuZWwuamF2YQppbmRleCA3NDFlZGVjLi5kOTE2OWU3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0NvbnRyb2xQYW5lbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvQ29udHJvbFBhbmVsLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKIGltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwogaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7CiBpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHk7CiAKIC8qKgpAQCAtMjgsOCArMjgsOCBAQAogICovCiBjbGFzcyBDb250cm9sUGFuZWwgZXh0ZW5kcyBKUGFuZWwgewogICAgIC8qKiB1c2UgdGhlIGxvZyBtZXNzYWdlcyAqKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXRlZ29yeSBMT0cgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeS5nZXRJbnN0YW5jZShDb250cm9sUGFuZWwuY2xhc3MpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKENvbnRyb2xQYW5lbC5jbGFzcyk7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xQYW5lbDwvY29kZT4gaW5zdGFuY2UuCkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgIGFkZChsYWJlbCk7CiAKICAgICAgICAgYy5ncmlkeSsrOwotICAgICAgICBsYWJlbCA9IG5ldyBKTGFiZWwoIkZpbHRlciBDYXRlZ29yeToiKTsKKyAgICAgICAgbGFiZWwgPSBuZXcgSkxhYmVsKCJGaWx0ZXIgTG9nZ2VyOiIpOwogICAgICAgICBncmlkYmFnLnNldENvbnN0cmFpbnRzKGxhYmVsLCBjKTsKICAgICAgICAgYWRkKGxhYmVsKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9EZXRhaWxQYW5lbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9EZXRhaWxQYW5lbC5qYXZhCmluZGV4IGMwNTE5ODcuLjliMjg3NDggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvRGV0YWlsUGFuZWwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0RldGFpbFBhbmVsLmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKIGltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWw7CiBpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkV2ZW50OwogaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwogCiAvKioKICAqIEEgcGFuZWwgZm9yIHNob3dpbmcgYSBzdGFjayB0cmFjZS4KQEAgLTI5LDggKzI5LDggQEAKICAgICBpbXBsZW1lbnRzIExpc3RTZWxlY3Rpb25MaXN0ZW5lcgogewogICAgIC8qKiB1c2VkIHRvIGxvZyBldmVudHMgKiovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2F0ZWdvcnkgTE9HID0KLSAgICAgICAgQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoRGV0YWlsUGFuZWwuY2xhc3MpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPQorICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKERldGFpbFBhbmVsLmNsYXNzKTsKIAogICAgIC8qKiB1c2VkIHRvIGZvcm1hdCB0aGUgbG9nZ2luZyBldmVudCAqKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlRm9ybWF0IEZPUk1BVFRFUiA9IG5ldyBNZXNzYWdlRm9ybWF0KApAQCAtMzgsNyArMzgsNyBAQAogICAgICAgICAiJm5ic3A7Jm5ic3A7PGI+UHJpb3JpdHk6PC9iPiA8Y29kZT57MX08L2NvZGU+IiArCiAgICAgICAgICImbmJzcDsmbmJzcDs8Yj5UaHJlYWQ6PC9iPiA8Y29kZT57Mn08L2NvZGU+IiArCiAgICAgICAgICImbmJzcDsmbmJzcDs8Yj5OREM6PC9iPiA8Y29kZT57M308L2NvZGU+IiArCi0gICAgICAgICI8YnI+PGI+Q2F0ZWdvcnk6PC9iPiA8Y29kZT57NH08L2NvZGU+IiArCisgICAgICAgICI8YnI+PGI+TG9nZ2VyOjwvYj4gPGNvZGU+ezR9PC9jb2RlPiIgKwogICAgICAgICAiPGJyPjxiPkxvY2F0aW9uOjwvYj4gPGNvZGU+ezV9PC9jb2RlPiIgKwogICAgICAgICAiPGJyPjxiPk1lc3NhZ2U6PC9iPiIgKwogICAgICAgICAiPHByZT57Nn08L3ByZT4iICsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvRXZlbnREZXRhaWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0V2ZW50RGV0YWlscy5qYXZhCmluZGV4IDEyZGRjNTEuLmEwNTM4ZTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvRXZlbnREZXRhaWxzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9FdmVudERldGFpbHMuamF2YQpAQCAtNzMsOCArNzMsOCBAQAogICAgIEV2ZW50RGV0YWlscyhMb2dnaW5nRXZlbnQgYUV2ZW50KSB7CiAKICAgICAgICAgdGhpcyhhRXZlbnQudGltZVN0YW1wLAotICAgICAgICAgICAgIGFFdmVudC5sZXZlbCwKLSAgICAgICAgICAgICBhRXZlbnQuY2F0ZWdvcnlOYW1lLAorICAgICAgICAgICAgIGFFdmVudC5nZXRMZXZlbCgpLAorICAgICAgICAgICAgIGFFdmVudC5nZXRMb2dnZXJOYW1lKCksCiAgICAgICAgICAgICAgYUV2ZW50LmdldE5EQygpLAogICAgICAgICAgICAgIGFFdmVudC5nZXRUaHJlYWROYW1lKCksCiAgICAgICAgICAgICAgYUV2ZW50LmdldFJlbmRlcmVkTWVzc2FnZSgpLApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9FeGl0QWN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0V4aXRBY3Rpb24uamF2YQppbmRleCA4ZmIwY2U4Li5jOGVkYTJhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0V4aXRBY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0V4aXRBY3Rpb24uamF2YQpAQCAtOCw3ICs4LDcgQEAKIAogaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwogaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiAKIC8qKgogICogRW5jYXBzdWxhdGVzIHRoZSBhY3Rpb24gdG8gZXhpdC4KQEAgLTIwLDcgKzIwLDcgQEAKICAgICBleHRlbmRzIEFic3RyYWN0QWN0aW9uCiB7CiAgICAgLyoqIHVzZSB0byBsb2cgbWVzc2FnZXMgKiovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2F0ZWdvcnkgTE9HID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoRXhpdEFjdGlvbi5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRXhpdEFjdGlvbi5jbGFzcyk7CiAgICAgLyoqIFRoZSBpbnN0YW5jZSB0byBzaGFyZSAqKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4aXRBY3Rpb24gSU5TVEFOQ0UgPSBuZXcgRXhpdEFjdGlvbigpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0xvYWRYTUxBY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvTG9hZFhNTEFjdGlvbi5qYXZhCmluZGV4IDk5MTJlN2QuLmNjOTExMzkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvTG9hZFhNTEFjdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvTG9hZFhNTEFjdGlvbi5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiBpbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwogaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKQEAgLTMxLDggKzMxLDcgQEAKICAgICBleHRlbmRzIEFic3RyYWN0QWN0aW9uCiB7CiAgICAgLyoqIHVzZSB0byBsb2cgbWVzc2FnZXMgKiovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2F0ZWdvcnkgTE9HID0KLSAgICAgICAgQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoTG9hZFhNTEFjdGlvbi5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTG9hZFhNTEFjdGlvbi5jbGFzcyk7CiAKICAgICAvKiogdGhlIHBhcmVudCBmcmFtZSAqKi8KICAgICBwcml2YXRlIGZpbmFsIEpGcmFtZSBtUGFyZW50OwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9Mb2dnaW5nUmVjZWl2ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvTG9nZ2luZ1JlY2VpdmVyLmphdmEKaW5kZXggYzY5YjNkZS4uM2NkMzQ1NSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9Mb2dnaW5nUmVjZWl2ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L0xvZ2dpbmdSZWNlaXZlci5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiAgKi8KIGNsYXNzIExvZ2dpbmdSZWNlaXZlciBleHRlbmRzIFRocmVhZCB7CiAgICAgLyoqIHVzZWQgdG8gbG9nIG1lc3NhZ2VzICoqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKExvZ2dpbmdSZWNlaXZlci5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTG9nZ2luZ1JlY2VpdmVyLmNsYXNzKTsKIAogICAgIC8qKgogICAgICAqIEhlbHBlciB0aGF0IGFjdHVhbGx5IHByb2Nlc3NlcyBhIGNsaWVudCBjb25uZWN0aW9uLiBJdCByZWNlaXZlcyBldmVudHMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogICAgICAgICAvKiogbG9vcHMgZ2V0dGluZyB0aGUgZXZlbnRzICoqLwogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoIlN0YXJ0aW5nIHRvIGdldCBkYXRhIik7CisgICAgICAgICAgICBMT0cuZGVidWcoIlN0YXJ0aW5nIHRvIGdldCBkYXRhIik7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdElucHV0U3RyZWFtIG9pcyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJbnB1dFN0cmVhbShtQ2xpZW50LmdldElucHV0U3RyZWFtKCkpOwpAQCAtNTUsMTkgKzU1LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIG1Nb2RlbC5hZGRFdmVudChuZXcgRXZlbnREZXRhaWxzKGV2ZW50KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUmVhY2hlZCBFT0YsIGNsb3NpbmcgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgIExPRy5pbmZvKCJSZWFjaGVkIEVPRiwgY2xvc2luZyBjb25uZWN0aW9uIik7CiAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDYXVnaHQgU29ja2V0RXhjZXB0aW9uLCBjbG9zaW5nIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICBMT0cuaW5mbygiQ2F1Z2h0IFNvY2tldEV4Y2VwdGlvbiwgY2xvc2luZyBjb25uZWN0aW9uIik7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkdvdCBJT0V4Y2VwdGlvbiwgY2xvc2luZyBjb25uZWN0aW9uIiwgZSk7CisgICAgICAgICAgICAgICAgTE9HLndhcm4oIkdvdCBJT0V4Y2VwdGlvbiwgY2xvc2luZyBjb25uZWN0aW9uIiwgZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiR290IENsYXNzTm90Rm91bmRFeGNlcHRpb24sIGNsb3NpbmcgY29ubmVjdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIExPRy53YXJuKCJHb3QgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgY2xvc2luZyBjb25uZWN0aW9uIiwgZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbUNsaWVudC5jbG9zZSgpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJFcnJvciBjbG9zaW5nIGNvbm5lY3Rpb24iLCBlKTsKKyAgICAgICAgICAgICAgICBMT0cud2FybigiRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC05MywxOSArOTMsMTkgQEAKIAogICAgIC8qKiBMaXN0ZW5zIGZvciBjbGllbnQgY29ubmVjdGlvbnMgKiovCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBsb2dnZXIuaW5mbygiVGhyZWFkIHN0YXJ0ZWQiKTsKKyAgICAgICAgTE9HLmluZm8oIlRocmVhZCBzdGFydGVkIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiV2FpdGluZyBmb3IgYSBjb25uZWN0aW9uIik7CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJXYWl0aW5nIGZvciBhIGNvbm5lY3Rpb24iKTsKICAgICAgICAgICAgICAgICBmaW5hbCBTb2NrZXQgY2xpZW50ID0gbVN2clNvY2suYWNjZXB0KCk7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJHb3QgYSBjb25uZWN0aW9uIGZyb20gIiArCisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJHb3QgYSBjb25uZWN0aW9uIGZyb20gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3ROYW1lKCkpOwogICAgICAgICAgICAgICAgIGZpbmFsIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgU2x1cnBlcihjbGllbnQpKTsKICAgICAgICAgICAgICAgICB0LnNldERhZW1vbih0cnVlKTsKICAgICAgICAgICAgICAgICB0LnN0YXJ0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRXJyb3IgaW4gYWNjZXB0aW5nIGNvbm5lY3Rpb25zLCBzdG9wcGluZy4iLCBlKTsKKyAgICAgICAgICAgIExPRy5lcnJvcigiRXJyb3IgaW4gYWNjZXB0aW5nIGNvbm5lY3Rpb25zLCBzdG9wcGluZy4iLCBlKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvTWFpbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9NYWluLmphdmEKaW5kZXggYjY3YTlhZS4uOWRhY2QyOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9NYWluLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9NYWluLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIGltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOwogaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKIGltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yOwogCiAvKioKQEAgLTQxLDcgKzQxLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1BST1BfTkFNRSA9ICJjaGFpbnNhdy5wb3J0IjsKIAogICAgIC8qKiB1c2UgdG8gbG9nIG1lc3NhZ2VzICoqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhdGVnb3J5IExPRyA9IENhdGVnb3J5LmdldEluc3RhbmNlKE1haW4uY2xhc3MpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1haW4uY2xhc3MpOwogCiAKICAgICAvKioKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgIC8qKiBpbml0aWFsaXNlIGxvZzRqICoqLwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdExvZzRKKCkgewogICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoImxvZzRqLnJvb3RDYXRlZ29yeSIsICJERUJVRywgQTEiKTsKKyAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoImxvZzRqLnJvb3RMb2dnZXIiLCAiREVCVUcsIEExIik7CiAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KCJsb2c0ai5hcHBlbmRlci5BMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlciIpOwogICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eSgibG9nNGouYXBwZW5kZXIuQTEubGF5b3V0IiwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvTXlUYWJsZU1vZGVsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L015VGFibGVNb2RlbC5qYXZhCmluZGV4IGQxYWYwNzYuLmIwZDg4OTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvTXlUYWJsZU1vZGVsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9NeVRhYmxlTW9kZWwuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiAKIC8qKgogICogUmVwcmVzZW50cyBhIGxpc3Qgb2YgPGNvZGU+RXZlbnREZXRhaWxzPC9jb2RlPiBvYmplY3RzIHRoYXQgYXJlIHNvcnRlZCBvbgpAQCAtMjksOCArMjksNyBAQAogewogCiAgICAgLyoqIHVzZWQgdG8gbG9nIG1lc3NhZ2VzICoqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhdGVnb3J5IExPRyA9Ci0gICAgICAgIENhdGVnb3J5LmdldEluc3RhbmNlKE15VGFibGVNb2RlbC5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTXlUYWJsZU1vZGVsLmNsYXNzKTsKIAogICAgIC8qKiB1c2UgdGhlIGNvbXBhcmUgbG9nZ2luZyBldmVudHMgKiovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBNWV9DT01QID0gbmV3IENvbXBhcmF0b3IoKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9YTUxGaWxlSGFuZGxlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jaGFpbnNhdy9YTUxGaWxlSGFuZGxlci5qYXZhCmluZGV4IDVjZTgyZDAuLjU5NDRkYTMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY2hhaW5zYXcvWE1MRmlsZUhhbmRsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NoYWluc2F3L1hNTEZpbGVIYW5kbGVyLmphdmEKQEAgLTcsNyArNyw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGouY2hhaW5zYXc7CiAKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwpAQCAtMzcsMTMgKzM3LDExIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBNeVRhYmxlTW9kZWwgbU1vZGVsOwogICAgIC8qKiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgZG9jdW1lbnQgKiovCiAgICAgcHJpdmF0ZSBpbnQgbU51bUV2ZW50czsKLSAgICAvKiogdGhlIGN1cnJlbnQgZWxlbWVudCBiZWluZyBwYXJzZWQgKiovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRFbGVtZW50OwogCiAgICAgLyoqIHRoZSB0aW1lIG9mIHRoZSBldmVudCAqKi8KICAgICBwcml2YXRlIGxvbmcgbVRpbWVTdGFtcDsKLSAgICAvKiogdGhlIHByaW9yaXR5IG9mIHRoZSBldmVudCAqKi8KLSAgICBwcml2YXRlIFByaW9yaXR5IG1Qcmlvcml0eTsKKyAgICAvKiogdGhlIHByaW9yaXR5IChsZXZlbCkgb2YgdGhlIGV2ZW50ICoqLworICAgIHByaXZhdGUgTGV2ZWwgbUxldmVsOwogICAgIC8qKiB0aGUgY2F0ZWdvcnkgb2YgdGhlIGV2ZW50ICoqLwogICAgIHByaXZhdGUgU3RyaW5nIG1DYXRlZ29yeU5hbWU7CiAgICAgLyoqIHRoZSBOREMgZm9yIHRoZSBldmVudCAqKi8KQEAgLTU2LDcgKzU0LDggQEAKICAgICBwcml2YXRlIFN0cmluZ1tdIG1UaHJvd2FibGVTdHJSZXA7CiAgICAgLyoqIHRoZSBsb2NhdGlvbiBkZXRhaWxzIGZvciB0aGUgZXZlbnQgKiovCiAgICAgcHJpdmF0ZSBTdHJpbmcgbUxvY2F0aW9uRGV0YWlsczsKLQorICAgIC8qKiBidWZmZXIgZm9yIGNvbGxlY3RpbmcgdGV4dCAqKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBtQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5YTUxGaWxlSGFuZGxlcjwvY29kZT4gaW5zdGFuY2UuCkBAIC03NiwxMyArNzUsMjQgQEAKIAogICAgIC8qKiBAc2VlIERlZmF1bHRIYW5kbGVyICoqLwogICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGFDaGFycywgaW50IGFTdGFydCwgaW50IGFMZW5ndGgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50RWxlbWVudCA9PSBUQUdfTkRDKSB7Ci0gICAgICAgICAgICBtTkRDID0gbmV3IFN0cmluZyhhQ2hhcnMsIGFTdGFydCwgYUxlbmd0aCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRFbGVtZW50ID09IFRBR19NRVNTQUdFKSB7Ci0gICAgICAgICAgICBtTWVzc2FnZSA9IG5ldyBTdHJpbmcoYUNoYXJzLCBhU3RhcnQsIGFMZW5ndGgpOwotICAgICAgICB9IGVsc2UgaWYgKG1DdXJyZW50RWxlbWVudCA9PSBUQUdfVEhST1dBQkxFKSB7CisgICAgICAgIG1CdWYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGFDaGFycywgYVN0YXJ0LCBhTGVuZ3RoKSk7CisgICAgfQorCisgICAgLyoqIEBzZWUgRGVmYXVsdEhhbmRsZXIgKiovCisgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgYU5hbWVzcGFjZVVSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhTG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFRTmFtZSkKKyAgICB7CisgICAgICAgIGlmIChUQUdfRVZFTlQuZXF1YWxzKGFRTmFtZSkpIHsKKyAgICAgICAgICAgIGFkZEV2ZW50KCk7CisgICAgICAgICAgICByZXNldERhdGEoKTsKKyAgICAgICAgfSBlbHNlIGlmIChUQUdfTkRDLmVxdWFscyhhUU5hbWUpKSB7CisgICAgICAgICAgICBtTkRDID0gbUJ1Zi50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgaWYgKFRBR19NRVNTQUdFLmVxdWFscyhhUU5hbWUpKSB7CisgICAgICAgICAgICBtTWVzc2FnZSA9IG1CdWYudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChUQUdfVEhST1dBQkxFLmVxdWFscyhhUU5hbWUpKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgc3QgPQotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3IFN0cmluZyhhQ2hhcnMsIGFTdGFydCwgYUxlbmd0aCksICJcdCIpOworICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIobUJ1Zi50b1N0cmluZygpLCAiXG5cdCIpOwogICAgICAgICAgICAgbVRocm93YWJsZVN0clJlcCA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07CiAgICAgICAgICAgICBpZiAobVRocm93YWJsZVN0clJlcC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgbVRocm93YWJsZVN0clJlcFswXSA9IHN0Lm5leHRUb2tlbigpOwpAQCAtOTQsNDAgKzEwNCwyMyBAQAogICAgIH0KIAogICAgIC8qKiBAc2VlIERlZmF1bHRIYW5kbGVyICoqLwotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIGFOYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYUxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhUU5hbWUpCi0gICAgewotICAgICAgICBpZiAoVEFHX0VWRU5ULmVxdWFscyhhUU5hbWUpKSB7Ci0gICAgICAgICAgICBhZGRFdmVudCgpOwotICAgICAgICAgICAgcmVzZXREYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRFbGVtZW50ICE9IFRBR19FVkVOVCkgewotICAgICAgICAgICAgbUN1cnJlbnRFbGVtZW50ID0gVEFHX0VWRU5UOyAvLyBoYWNrIC0gYnV0IG9ubHkgdGhpbmcgSSBjYXJlIGFib3V0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHNlZSBEZWZhdWx0SGFuZGxlciAqKi8KICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIGFOYW1lc3BhY2VVUkksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhTG9jYWxOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYVFOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGFBdHRzKQogICAgIHsKKyAgICAgICAgbUJ1Zi5zZXRMZW5ndGgoMCk7CisKICAgICAgICAgaWYgKFRBR19FVkVOVC5lcXVhbHMoYVFOYW1lKSkgewogICAgICAgICAgICAgbVRocmVhZE5hbWUgPSBhQXR0cy5nZXRWYWx1ZSgidGhyZWFkIik7CiAgICAgICAgICAgICBtVGltZVN0YW1wID0gTG9uZy5wYXJzZUxvbmcoYUF0dHMuZ2V0VmFsdWUoInRpbWVzdGFtcCIpKTsKLSAgICAgICAgICAgIG1DYXRlZ29yeU5hbWUgPSBhQXR0cy5nZXRWYWx1ZSgiY2F0ZWdvcnkiKTsKLSAgICAgICAgICAgIG1Qcmlvcml0eSA9IFByaW9yaXR5LnRvUHJpb3JpdHkoYUF0dHMuZ2V0VmFsdWUoImxldmVsIikpOworICAgICAgICAgICAgbUNhdGVnb3J5TmFtZSA9IGFBdHRzLmdldFZhbHVlKCJsb2dnZXIiKTsKKyAgICAgICAgICAgIG1MZXZlbCA9IExldmVsLnRvTGV2ZWwoYUF0dHMuZ2V0VmFsdWUoImxldmVsIikpOwogICAgICAgICB9IGVsc2UgaWYgKFRBR19MT0NBVElPTl9JTkZPLmVxdWFscyhhUU5hbWUpKSB7CiAgICAgICAgICAgICBtTG9jYXRpb25EZXRhaWxzID0gYUF0dHMuZ2V0VmFsdWUoImNsYXNzIikgKyAiLiIKICAgICAgICAgICAgICAgICArIGFBdHRzLmdldFZhbHVlKCJtZXRob2QiKQogICAgICAgICAgICAgICAgICsgIigiICsgYUF0dHMuZ2V0VmFsdWUoImZpbGUiKSArICI6IiArIGFBdHRzLmdldFZhbHVlKCJsaW5lIikKICAgICAgICAgICAgICAgICArICIpIjsKLSAgICAgICAgfSBlbHNlIGlmIChUQUdfTkRDLmVxdWFscyhhUU5hbWUpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudEVsZW1lbnQgPSBUQUdfTkRDOwotICAgICAgICB9IGVsc2UgaWYgKFRBR19NRVNTQUdFLmVxdWFscyhhUU5hbWUpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudEVsZW1lbnQgPSBUQUdfTUVTU0FHRTsKLSAgICAgICAgfSBlbHNlIGlmIChUQUdfVEhST1dBQkxFLmVxdWFscyhhUU5hbWUpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudEVsZW1lbnQgPSBUQUdfVEhST1dBQkxFOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDMsNyArMTM2LDcgQEAKICAgICAvKiogQWRkIGFuIGV2ZW50IHRvIHRoZSBtb2RlbCAqKi8KICAgICBwcml2YXRlIHZvaWQgYWRkRXZlbnQoKSB7CiAgICAgICAgIG1Nb2RlbC5hZGRFdmVudChuZXcgRXZlbnREZXRhaWxzKG1UaW1lU3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2F0ZWdvcnlOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTkRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkTmFtZSwKQEAgLTE1Niw3ICsxNDksNyBAQAogICAgIC8qKiBSZXNldCB0aGUgZGF0YSBmb3IgYW4gZXZlbnQgKiovCiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0RGF0YSgpIHsKICAgICAgICAgbVRpbWVTdGFtcCA9IDA7Ci0gICAgICAgIG1Qcmlvcml0eSA9IG51bGw7CisgICAgICAgIG1MZXZlbCA9IG51bGw7CiAgICAgICAgIG1DYXRlZ29yeU5hbWUgPSBudWxsOwogICAgICAgICBtTkRDID0gbnVsbDsKICAgICAgICAgbVRocmVhZE5hbWUgPSBudWxsOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jb25maWcvUHJvcGVydHlHZXR0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY29uZmlnL1Byb3BlcnR5R2V0dGVyLmphdmEKaW5kZXggM2M2ZjhkYi4uYmM4OGRhMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jb25maWcvUHJvcGVydHlHZXR0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NvbmZpZy9Qcm9wZXJ0eUdldHRlci5qYXZhCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuCiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLmNvbmZpZzsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY29uZmlnL1Byb3BlcnR5UHJpbnRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jb25maWcvUHJvcGVydHlQcmludGVyLmphdmEKaW5kZXggMjNjOTUwYy4uNzdjZGI1YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jb25maWcvUHJvcGVydHlQcmludGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jb25maWcvUHJvcGVydHlQcmludGVyLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKICAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS5BUEwgZmlsZS4KKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4KICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGouY29uZmlnOwpAQCAtNDYsOCArNDYsOCBAQAogICB9CiAgIAogICAvKioKLSAgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXBwZW5kZXIgbmFtZSBpcyBjb25zaWRlcmVkIHRvIGhhdmUKLSAgICAgYmVlbiBnZW5lcmF0ZWQsIGkuZS4gaWYgaXQgaXMgb2YgdGhlIGZvcm0gQVswLTldKy4KKyAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXBwZW5kZXIgbmFtZSBpcyBjb25zaWRlcmVkIHRvIGhhdmUKKyAgICogYmVlbiBnZW5lcmF0ZWQsIHRoYXQgaXMsIGlmIGl0IGlzIG9mIHRoZSBmb3JtIEFbMC05XSsuCiAgICovCiAgIHByb3RlY3RlZAogICBib29sZWFuIGlzR2VuQXBwTmFtZShTdHJpbmcgbmFtZSkgewpAQCAtNjcsMTYgKzY3LDE2IEBACiAgICAqLwogICBwdWJsaWMKICAgdm9pZCBwcmludChQcmludFdyaXRlciBvdXQpIHsKLSAgICBwcmludE9wdGlvbnMob3V0LCBDYXRlZ29yeS5nZXRSb290KCkpOworICAgIHByaW50T3B0aW9ucyhvdXQsIExvZ2dlci5nZXRSb290TG9nZ2VyKCkpOwogICAgIAotICAgIEVudW1lcmF0aW9uIGNhdHMgPSBDYXRlZ29yeS5nZXRDdXJyZW50Q2F0ZWdvcmllcygpOworICAgIEVudW1lcmF0aW9uIGNhdHMgPSBMb2dNYW5hZ2VyLmdldEN1cnJlbnRMb2dnZXJzKCk7CiAgICAgd2hpbGUgKGNhdHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIHByaW50T3B0aW9ucyhvdXQsIChDYXRlZ29yeSkgY2F0cy5uZXh0RWxlbWVudCgpKTsKKyAgICAgIHByaW50T3B0aW9ucyhvdXQsIChMb2dnZXIpIGNhdHMubmV4dEVsZW1lbnQoKSk7CiAgICAgfQogICB9CiAgIAogICBwcm90ZWN0ZWQKLSAgdm9pZCBwcmludE9wdGlvbnMoUHJpbnRXcml0ZXIgb3V0LCBDYXRlZ29yeSBjYXQpIHsKKyAgdm9pZCBwcmludE9wdGlvbnMoUHJpbnRXcml0ZXIgb3V0LCBMb2dnZXIgY2F0KSB7CiAgICAgRW51bWVyYXRpb24gYXBwZW5kZXJzID0gY2F0LmdldEFsbEFwcGVuZGVycygpOwogICAgIExldmVsIHByaW8gPSBjYXQuZ2V0TGV2ZWwoKTsKICAgICBTdHJpbmcgYXBwZW5kZXJTdHJpbmcgPSAocHJpbyA9PSBudWxsID8gIiIgOiBwcmlvLnRvU3RyaW5nKCkpOwpAQCAtMTAwLDkgKzEwMCw5IEBACiAgICAgICB9CiAgICAgICBhcHBlbmRlclN0cmluZyArPSAiLCAiICsgbmFtZTsKICAgICB9Ci0gICAgU3RyaW5nIGNhdEtleSA9IChjYXQgPT0gQ2F0ZWdvcnkuZ2V0Um9vdCgpKQotICAgICAgICA/ICJsb2c0ai5yb290Q2F0ZWdvcnkiCi0gICAgICAgIDogImxvZzRqLmNhdGVnb3J5LiIgKyBjYXQuZ2V0TmFtZSgpOworICAgIFN0cmluZyBjYXRLZXkgPSAoY2F0ID09IExvZ2dlci5nZXRSb290TG9nZ2VyKCkpCisgICAgICAgID8gImxvZzRqLnJvb3RMb2dnZXIiCisgICAgICAgIDogImxvZzRqLmxvZ2dlci4iICsgY2F0LmdldE5hbWUoKTsKICAgICBpZiAoYXBwZW5kZXJTdHJpbmcgIT0gIiIpIHsKICAgICAgIG91dC5wcmludGxuKGNhdEtleSArICI9IiArIGFwcGVuZGVyU3RyaW5nKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NvbmZpZy9Qcm9wZXJ0eVNldHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jb25maWcvUHJvcGVydHlTZXR0ZXIuamF2YQppbmRleCBjMWIyZWMxLi44ZjZhMTU1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NvbmZpZy9Qcm9wZXJ0eVNldHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY29uZmlnL1Byb3BlcnR5U2V0dGVyLmphdmEKQEAgLTEsMTAgKzEsOSBAQAogLyoKICAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFLkFQTCBmaWxlLgotICovCisgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQorICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogLy8gQ29udHJpYnV0b3JzOiAgR2VvcmcgTHVuZGVzZ2FhcmQKIApAQCAtMTU2LDcgKzE1NSw3IEBACiAgICAgICAgIHNldFByb3BlcnR5KHByb3AsIG5hbWUsIHZhbHVlKTsKICAgICAgIH0gY2F0Y2ggKFByb3BlcnR5U2V0dGVyRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgIExvZ0xvZy53YXJuKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5IFsiICsgbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICJdIHRvIHZhbHVlIFwiIiArIHZhbHVlICsgIlwiLiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgIl0gdG8gdmFsdWUgXCIiICsgdmFsdWUgKyAiXCIuICIsIGV4LnJvb3RDYXVzZSk7CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NvbmZpZy9Qcm9wZXJ0eVNldHRlckV4Y2VwdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9jb25maWcvUHJvcGVydHlTZXR0ZXJFeGNlcHRpb24uamF2YQppbmRleCBiOGNiMGUwLi4zYWNjZGYzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2NvbmZpZy9Qcm9wZXJ0eVNldHRlckV4Y2VwdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovY29uZmlnL1Byb3BlcnR5U2V0dGVyRXhjZXB0aW9uLmphdmEKQEAgLTEsMTAgKzEsOSBAQAogLyoKICAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFLkFQTCBmaWxlLgotICovCisgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQorICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLmNvbmZpZzsKIApAQCAtNDEsNCArNDAsNCBAQAogICAgIH0KICAgICByZXR1cm4gbXNnOwogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL0FwcGVuZGVyQXR0YWNoYWJsZUltcGwuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9BcHBlbmRlckF0dGFjaGFibGVJbXBsLmphdmEKaW5kZXggZWMwMWM3Ni4uZDNkMjY4MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL0FwcGVuZGVyQXR0YWNoYWJsZUltcGwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvQXBwZW5kZXJBdHRhY2hhYmxlSW1wbC5qYXZhCkBAIC0xMjEsOCArMTIxLDggQEAKIAogCiAgIC8qKgotICAgICBSZW1vdmUgYWxsIHByZXZpb3VzbHkgYXR0YWNoZWQgYXBwZW5kZXJzLgotICAqLworICAgKiBSZW1vdmUgYW5kIGNsb3NlIGFsbCBwcmV2aW91c2x5IGF0dGFjaGVkIGFwcGVuZGVycy4KKyAgICogKi8KICAgcHVibGljCiAgIHZvaWQgcmVtb3ZlQWxsQXBwZW5kZXJzKCkgewogICAgIGlmKGFwcGVuZGVyTGlzdCAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvQm91bmRlZEZJRk8uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9Cb3VuZGVkRklGTy5qYXZhCmluZGV4IDJhMTc5NjYuLjRlZjhlNGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9Cb3VuZGVkRklGTy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9Cb3VuZGVkRklGTy5qYXZhCkBAIC04Miw4ICs4Miw4IEBACiAgIH0KIAogICAvKioKLSAgICAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBidWZmZXIgaXMgZnVsbCwgaS5lLiBvZiB0aGUKLSAgICAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBidWZmZXIgZXF1YWxzIHRoZSBidWZmZXIgc2l6ZS4gKi8KKyAgICAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBidWZmZXIgaXMgZnVsbCwgdGhhdCBpcywgd2hldGhlcgorICAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBidWZmZXIgZXF1YWxzIHRoZSBidWZmZXIgc2l6ZS4gKi8KICAgcHVibGljIAogICBib29sZWFuIGlzRnVsbCgpIHsKICAgICByZXR1cm4gbnVtRWxlbWVudHMgPT0gbWF4U2l6ZTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9Mb2FkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9Mb2FkZXIuamF2YQppbmRleCAyMjJjMmNjLi40Njk4Y2E2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvTG9hZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL0xvYWRlci5qYXZhCkBAIC04LDYgKzgsMTAgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzOwogCiBpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCiAvL2ltcG9ydCBqYXZhLmF3dC5JbWFnZTsKIC8vaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7CiAKQEAgLTIzLDcgKzI3LDkgQEAKIAogICAvLyBXZSBjb25zZXJ2YXRpdmVseSBhc3N1bWUgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciBKYXZhIDEueAogICBzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGphdmExID0gdHJ1ZTsKLQorICAKKyAgc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVUQ0wgPSBmYWxzZTsKKyAgCiAgIHN0YXRpYyB7CiAgICAgU3RyaW5nIHByb3AgPSBPcHRpb25Db252ZXJ0ZXIuZ2V0U3lzdGVtUHJvcGVydHkoImphdmEudmVyc2lvbiIsIG51bGwpOwogICAgIApAQCAtMzQsNiArNDAsMTAgQEAKIAkgIGphdmExID0gZmFsc2U7CiAgICAgICB9IAogICAgIH0KKyAgICBTdHJpbmcgaWdub3JlVENMUHJvcCA9IE9wdGlvbkNvbnZlcnRlci5nZXRTeXN0ZW1Qcm9wZXJ0eSgibG9nNGouaWdub3JlVENMIiwgbnVsbCk7CisgICAgaWYoaWdub3JlVENMUHJvcCAhPSBudWxsKSB7CisgICAgICBpZ25vcmVUQ0wgPSBPcHRpb25Db252ZXJ0ZXIudG9Cb29sZWFuKGlnbm9yZVRDTFByb3AsIHRydWUpOyAgICAgIAorICAgIH0gICAKICAgfQogCiAgIC8qKgpAQCAtNTQsNDMgKzY0LDM3IEBACiAgICAgIGJ1aWx0LWluIGNsYXNzIGxvYWRlciBpbiBKREsgMS4xLgogCiAgICAgIDwvb2w+Ci0gICAgIAogICAqLwotICBzdGF0aWMKLSAgcHVibGljCi0gIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKKyAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlKSB7CiAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwogICAgIFVSTCB1cmwgPSBudWxsOwogICAgIAogICAgIHRyeSB7Ci0gICAgICBpZighamF2YTEpIHsKLQljbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CQotCWlmKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKLQkgIExvZ0xvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIrcmVzb3VyY2UrIl0gdXNpbmcgY29udGV4dCBjbGFzc2xvYWRlciAiCi0JCSAgICAgICArY2xhc3NMb2FkZXIrIi4iKTsKLQkgIHVybCA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlKHJlc291cmNlKTsgICAgICAKLQkgIGlmKHVybCAhPSBudWxsKSB7Ci0JICAgIHJldHVybiB1cmw7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgCi0gICAgICAvLyBXZSBjb3VsZCBub3QgZmluZCByZXNvdXJjZS4gTGVyIHVzIG5vdyB0cnkgd2l0aCB0aGUKLSAgICAgIC8vIGNsYXNzbG9hZGVyIHRoYXQgbG9hZGVkIHRoaXMgY2xhc3MuCi0gICAgICBjbGFzc0xvYWRlciA9IExvYWRlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOyAKLSAgICAgIGlmKGNsYXNzTG9hZGVyID09IG51bGwpIHsKLQlMb2dMb2cud2FybigiTG9hZGVyLmNsYXNzLmdldENsYXNzTG9hZGVyIHJldHVybmVkIG51bGwhIik7Ci0gICAgICB9IGVsc2UgewotCQotCUxvZ0xvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIrcmVzb3VyY2UrIl0gdXNpbmcgIitjbGFzc0xvYWRlcgotCQkgICAgICsiIGNsYXNzIGxvYWRlci4iKTsKLQl1cmwgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JaWYodXJsICE9IG51bGwpIHsKLQkgIHJldHVybiB1cmw7Ci0JfQotICAgICAgfQorICAJaWYoIWphdmExKSB7CisgIAkgIGNsYXNzTG9hZGVyID0gZ2V0VENMKCk7CisgIAkgIGlmKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgCSAgICBMb2dMb2cuZGVidWcoIlRyeWluZyB0byBmaW5kIFsiK3Jlc291cmNlKyJdIHVzaW5nIGNvbnRleHQgY2xhc3Nsb2FkZXIgIgorICAJCQkgK2NsYXNzTG9hZGVyKyIuIik7CisgIAkgICAgdXJsID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOyAgICAgIAorICAJICAgIGlmKHVybCAhPSBudWxsKSB7CisgIAkgICAgICByZXR1cm4gdXJsOworICAJICAgIH0KKyAgCSAgfQorICAJfQorICAJCisgIAkvLyBXZSBjb3VsZCBub3QgZmluZCByZXNvdXJjZS4gTGVyIHVzIG5vdyB0cnkgd2l0aCB0aGUKKyAgCS8vIGNsYXNzbG9hZGVyIHRoYXQgbG9hZGVkIHRoaXMgY2xhc3MuCisgIAljbGFzc0xvYWRlciA9IExvYWRlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOyAKKyAgCWlmKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgCSAgTG9nTG9nLmRlYnVnKCJUcnlpbmcgdG8gZmluZCBbIityZXNvdXJjZSsiXSB1c2luZyAiK2NsYXNzTG9hZGVyCisgIAkJICAgICAgICsiIGNsYXNzIGxvYWRlci4iKTsKKyAgCSAgdXJsID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOworICAJICBpZih1cmwgIT0gbnVsbCkgeworICAJICAgIHJldHVybiB1cmw7CisgIAkgIH0KKyAgCX0KICAgICB9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0gICAgICBMb2dMb2cud2FybihUU1RSLCB0KTsKKyAgCUxvZ0xvZy53YXJuKFRTVFIsIHQpOwogICAgIH0KICAgICAKICAgICAvLyBMYXN0IGRpdGNoIGF0dGVtcHQ6IGdldCB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgY2xhc3MgcGF0aC4gSXQKQEAgLTk4LDcgKzEwMiw3IEBACiAgICAgLy8gbG9hZGVyIHdoaWNoIHRoZSBwYXJlbnQgb2YgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuIEhlbmNlIHRoZQogICAgIC8vIGNvZGUgYmVsb3cuCiAgICAgTG9nTG9nLmRlYnVnKCJUcnlpbmcgdG8gZmluZCBbIityZXNvdXJjZSsKLQkJICJdIHVzaW5nIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKCkuIik7CisgIAkJICAgIl0gdXNpbmcgQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UoKS4iKTsKICAgICByZXR1cm4gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UocmVzb3VyY2UpOwogICB9IAogICAKQEAgLTExMSwyOCArMTE1LDUwIEBACiAgICAgcmV0dXJuIGphdmExOwogICB9CiAgIAorICAvKioKKyAgICAqIEdldCB0aGUgVGhyZWFkIENvbnRleHQgTG9hZGVyIHdoaWNoIGlzIGEgSkRLIDEuMiBmZWF0dXJlLiBJZiB3ZQorICAgICogYXJlIHJ1bm5pbmcgdW5kZXIgSkRLIDEuMSBvciBhbnl0aGluZyBlbHNlIGdvZXMgd3JvbmcgdGhlIG1ldGhvZAorICAgICogcmV0dXJucyA8Y29kZT5udWxsPGNvZGU+LgorICAgICoKKyAgICAqICAqLworICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRUQ0woKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgCisgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisKKyAgICAvLyBBcmUgd2UgcnVubmluZyBvbiBhIEpESyAxLjIgb3IgbGF0ZXIgc3lzdGVtPworICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOworICAgIHRyeSB7CisgICAgICBtZXRob2QgPSBUaHJlYWQuY2xhc3MuZ2V0TWV0aG9kKCJnZXRDb250ZXh0Q2xhc3NMb2FkZXIiLCBudWxsKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgYXJlIHJ1bm5pbmcgb24gSkRLIDEuMQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHJldHVybiAoQ2xhc3NMb2FkZXIpIG1ldGhvZC5pbnZva2UoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgbnVsbCk7CisgIH0KKworCiAgIAogICAvKioKLSAgICAgTG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzIHVzaW5nIHRoZSA8Y29kZT5UaHJlYWQ8L2NvZGU+Ci0gICAgIDxjb2RlPmNvbnRleHRDbGFzc0xvYWRlcjwvY29kZT4gaWYgcnVubmluZyB1bmRlciBKYXZhMiBvciBjdXJyZW50Ci0gICAgIGNsYXNzIGxvYWRlciBpZiBydW5uaW5nIHVuZGVyIEpESyAxLjEuCi0gICovCi0gIHN0YXRpYwotICBwdWJsaWMgCi0gIENsYXNzIGxvYWRDbGFzcyAoRG91YmxlIGNsYXp6KSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gICAgLy8gICAgaWYoamF2YTEpIHsKLSAgICAvLwlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGF6eik7Ci0gICAgLy8gICAgfSBlbHNlIHsKLSAgICAvLwl0cnkgewotICAgIC8vCSAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXp6KTsKLSAgICAvLwl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgLy8JICAvLyB3ZSByZWFjaGVkIGhlcmUgYmVjYXVzZQotICAgIC8vCSAgLy8gY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpIGlzIG51bGwgb3IgYmVjYXVzZQotICAgIC8vCSAgLy8gb2YgYSBzZWN1cml0eSBleGNlcHRpbywgb3IgYmVjYXVzZSBjbGF6eiBjb3VsZCBub3QgYmUKLSAgICAvLwkgIC8vIGxvYWRlZCwgaW4gYW55IGNhc2Ugd2Ugbm93IHRyeSBvbmUgbW9yZSB0aW1lCi0gICAgLy8JICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGF6eik7Ci0gICAgLy8JfQotICAgIC8vICAgIH0KKyAgICogSWYgcnVubmluZyB1bmRlciBKREsgMS4yIGxvYWQgdGhlIHNwZWNpZmllZCBjbGFzcyB1c2luZyB0aGUKKyAgICogIDxjb2RlPlRocmVhZDwvY29kZT4gPGNvZGU+Y29udGV4dENsYXNzTG9hZGVyPC9jb2RlPiBpZiB0aGF0CisgICAqICBmYWlscyB0cnkgQ2xhc3MuZm9ybmFtZS4gVW5kZXIgSkRLIDEuMSBvbmx5IENsYXNzLmZvck5hbWUgaXMKKyAgICogIHVzZWQuCisgICAqCisgICAqLworICBzdGF0aWMgcHVibGljIENsYXNzIGxvYWRDbGFzcyAoU3RyaW5nIGNsYXp6KSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgLy8gSnVzdCBjYWxsIENsYXNzLmZvck5hbWUoY2xhenopIGlmIHdlIGFyZSBydW5uaW5nIHVuZGVyIEpESyAxLjEKKyAgICAvLyBvciBpZiB3ZSBhcmUgaW5zdHJ1Y3RlZCB0byBpZ25vcmUgdGhlIFRDTC4KKyAgICBpZihqYXZhMSB8fCBpZ25vcmVUQ0wpIHsKKyAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXp6KTsKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHsKKwlyZXR1cm4gZ2V0VENMKCkubG9hZENsYXNzKGNsYXp6KTsKKyAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKKwkvLyB3ZSByZWFjaGVkIGhlcmUgYmVjYXVzZSB0Y2wgd2FzIG51bGwgb3IgYmVjYXVzZSBvZiBhCisJLy8gc2VjdXJpdHkgZXhjZXB0aW9uLCBvciBiZWNhdXNlIGNsYXp6IGNvdWxkIG5vdCBiZSBsb2FkZWQuLi4KKwkvLyBJbiBhbnkgY2FzZSB3ZSBub3cgdHJ5IG9uZSBtb3JlIHRpbWUKKwlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGF6eik7CisgICAgICB9CisgICAgfQogICB9IAogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL051bGxFbnVtZXJhdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL051bGxFbnVtZXJhdGlvbi5qYXZhCmluZGV4IGU3ZGQyOWUuLmIxZTgzMTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9OdWxsRW51bWVyYXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvTnVsbEVudW1lcmF0aW9uLmphdmEKQEAgLTI1LDkgKzI1LDcgQEAKICAgTnVsbEVudW1lcmF0aW9uKCkgewogICB9CiAgIAotICBwdWJsaWMKLSAgc3RhdGljCi0gIE51bGxFbnVtZXJhdGlvbiBnZXRJbnN0YW5jZSgpIHsKKyAgcHVibGljIHN0YXRpYyBOdWxsRW51bWVyYXRpb24gZ2V0SW5zdGFuY2UoKSB7CiAgICAgcmV0dXJuIGluc3RhbmNlOwogICB9CiAgIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL09wdGlvbkNvbnZlcnRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL09wdGlvbkNvbnZlcnRlci5qYXZhCmluZGV4IDIxMzFiNDguLjAwZTcwMTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9PcHRpb25Db252ZXJ0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvT3B0aW9uQ29udmVydGVyLmphdmEKQEAgLTE5OSw3ICsxOTksNyBAQAogCQkgKyAiOnByaT1bIiArIGxldmVsTmFtZSArICJdIik7CiAKICAgICB0cnkgewotICAgICAgQ2xhc3MgY3VzdG9tTGV2ZWwgPSBDbGFzcy5mb3JOYW1lKGNsYXp6KTsKKyAgICAgIENsYXNzIGN1c3RvbUxldmVsID0gTG9hZGVyLmxvYWRDbGFzcyhjbGF6eik7CiAKICAgICAgIC8vIGdldCBhIHJlZiB0byB0aGUgc3BlY2lmaWVkIGNsYXNzJyBzdGF0aWMgbWV0aG9kCiAgICAgICAvLyB0b0xldmVsKFN0cmluZywgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbCkKQEAgLTMwNiwxMCArMzA2LDE0IEBACiAJCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewogICAgIGlmKGNsYXNzTmFtZSAhPSBudWxsKSB7CiAgICAgICB0cnkgewotCUNsYXNzIGNsYXNzT2JqID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCUNsYXNzIGNsYXNzT2JqID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwogCWlmKCFzdXBlckNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhc3NPYmopKSB7CiAJICBMb2dMb2cuZXJyb3IoIkEgXCIiK2NsYXNzTmFtZSsiXCIgb2JqZWN0IGlzIG5vdCBhc3NpZ25hYmxlIHRvIGEgXCIiKwogCQkgICAgICAgc3VwZXJDbGFzcy5nZXROYW1lKCkgKyAiXCIgdmFyaWFibGUuIik7CisJICBMb2dMb2cuZXJyb3IoIlRoZSBjbGFzcyBcIiIrIHN1cGVyQ2xhc3MuZ2V0TmFtZSgpKyJcIiB3YXMgbG9hZGVkIGJ5ICIpOworCSAgTG9nTG9nLmVycm9yKCJbIitzdXBlckNsYXNzLmdldENsYXNzTG9hZGVyKCkrIl0gd2hlcmVhcyBvYmplY3Qgb2YgdHlwZSAiKTsKKwkgIExvZ0xvZy5lcnJvcigiXCIiICtjbGFzc09iai5nZXROYW1lKCkrIlwiIHdhcyBsb2FkZWQgYnkgWyIKKwkJICAgICAgICtjbGFzc09iai5nZXRDbGFzc0xvYWRlcigpKyJdLiIpOwogCSAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKIAl9CiAJcmV0dXJuIGNsYXNzT2JqLm5ld0luc3RhbmNlKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvUGF0dGVyblBhcnNlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL1BhdHRlcm5QYXJzZXIuamF2YQppbmRleCBmNmZlY2YzLi4xZTc4ODc2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvUGF0dGVyblBhcnNlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9QYXR0ZXJuUGFyc2VyLmphdmEKQEAgLTM4OCw3ICszODgsNyBAQAogICAgICAgY2FzZSBUSFJFQURfQ09OVkVSVEVSOgogCXJldHVybiBldmVudC5nZXRUaHJlYWROYW1lKCk7CiAgICAgICBjYXNlIExFVkVMX0NPTlZFUlRFUjoKLQlyZXR1cm4gZXZlbnQubGV2ZWwudG9TdHJpbmcoKTsKKwlyZXR1cm4gZXZlbnQuZ2V0TGV2ZWwoKS50b1N0cmluZygpOwogICAgICAgY2FzZSBORENfQ09OVkVSVEVSOgogCXJldHVybiBldmVudC5nZXROREMoKTsKICAgICAgIGNhc2UgTUVTU0FHRV9DT05WRVJURVI6IHsKQEAgLTUzOCw3ICs1MzgsNyBAQAogICAgIH0KIAogICAgIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoTG9nZ2luZ0V2ZW50IGV2ZW50KSB7Ci0gICAgICByZXR1cm4gZXZlbnQuY2F0ZWdvcnlOYW1lOworICAgICAgcmV0dXJuIGV2ZW50LmdldExvZ2dlck5hbWUoKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9TeXNsb2dXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9TeXNsb2dXcml0ZXIuamF2YQppbmRleCA4MWEwNWYxLi41MGY1MmZlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvU3lzbG9nV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL1N5c2xvZ1dyaXRlci5qYXZhCkBAIC02MSw4ICs2MSw4IEBACiAgIAogICBwdWJsaWMKICAgdm9pZCB3cml0ZShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERhdGFncmFtUGFja2V0IHBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChzdHJpbmcuZ2V0Qnl0ZXMoKSwKLQkJCQkJICAgICAgIHN0cmluZy5sZW5ndGgoKSwgCisgICAgYnl0ZVtdIGJ5dGVzID0gc3RyaW5nLmdldEJ5dGVzKCk7CisgICAgRGF0YWdyYW1QYWNrZXQgcGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KGJ5dGVzLCBieXRlcy5sZW5ndGgsCiAJCQkJCSAgICAgICBhZGRyZXNzLCBTWVNMT0dfUE9SVCk7CiAKICAgICBpZih0aGlzLmRzICE9IG51bGwpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvVHJhbnNmb3JtLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvVHJhbnNmb3JtLmphdmEKaW5kZXggNjZlNmM4MC4uZDAyYjYzZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL1RyYW5zZm9ybS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9UcmFuc2Zvcm0uamF2YQpAQCAtMTIsMjEgKzEyLDI4IEBACiAKIC8qKgogICAgVXRpbGl0eSBjbGFzcyBmb3IgdHJhbnNmb3JtaW5nIHN0cmluZ3MuCisKKyAgIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdXVtbDsKKyAgIEBhdXRob3IgTWljaGFlbCBBLiBNY0FuZ3VzIAogICovCiBwdWJsaWMgY2xhc3MgVHJhbnNmb3JtIHsKIAorICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1NUQVJUICA9ICI8IVtDREFUQVsiOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0VORCAgICA9ICJdXT4iOworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1BTRVVET19FTkQgPSAiXV0mZ3Q7IjsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9FTUJFREVEX0VORCA9IENEQVRBX0VORCArIENEQVRBX1BTRVVET19FTkQgKyBDREFUQV9TVEFSVDsKKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDREFUQV9FTkRfTEVOID0gQ0RBVEFfRU5ELmxlbmd0aCgpOworCiAgIC8qKgotICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIHN0cmluZyB3aGljaCBtYXkgY29udGFpbiBIVE1MIHRhZ3MgKGllLCA8Yj4sIDx0YWJsZT4sCi0gICAqIGV0YykgYW5kIGNvbnZlcnRzIHRoZSAnPCcgYW5kICc+JyBjaGFyYWN0ZXJzIHRvIHRoZWlyIEhUTUwgZXNjYXBlCi0gICAqIHNlcXVlbmNlcy4KKyAgICogVGhpcyBtZXRob2QgdGFrZXMgYSBzdHJpbmcgd2hpY2ggbWF5IGNvbnRhaW4gSFRNTCB0YWdzIChpZSwKKyAgICogJmx0O2ImZ3Q7LCAmbHQ7dGFibGUmZ3Q7LCBldGMpIGFuZCByZXBsYWNlcyBhbnkgJzwnIGFuZCAnPicKKyAgICogY2hhcmFjdGVycyB3aXRoIHJlc3BlY3RpdmUgcHJlZGVmaW5lZCBlbnRpdHkgcmVmZXJlbmNlcy4KICAgICoKICAgICogQHBhcmFtIGlucHV0IFRoZSB0ZXh0IHRvIGJlIGNvbnZlcnRlZC4KICAgICogQHJldHVybiBUaGUgaW5wdXQgc3RyaW5nIHdpdGggdGhlIGNoYXJhY3RlcnMgJzwnIGFuZCAnPicgcmVwbGFjZWQgd2l0aAotICAgKiAgJmx0OyBhbmQgJmd0OyByZXNwZWN0aXZlbHkuCi0gICAqLwotICBzdGF0aWMgCi0gIHB1YmxpYyAKLSAgU3RyaW5nIGVzY2FwZVRhZ3MoU3RyaW5nIGlucHV0KSB7CisgICAqICAmYW1wO2x0OyBhbmQgJmFtcDtndDsgcmVzcGVjdGl2ZWx5LiAgCisgICAqICovCisgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGVzY2FwZVRhZ3MoU3RyaW5nIGlucHV0KSB7CiAgICAgLy9DaGVjayBpZiB0aGUgc3RyaW5nIGlzIG51bGwgb3IgemVybyBsZW5ndGggLS0gaWYgc28sIHJldHVybgogICAgIC8vd2hhdCB3YXMgc2VudCBpbi4KIApAQCAtNTMsNCArNjAsNDAgQEAKICAgICB9CiAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICB9CisKKyAgLyoqCisgICogRW5zdXJlcyB0aGF0IGVtYmVkZWQgQ0RFbmQgc3RyaW5ncyAoXV0+KSBhcmUgaGFuZGxlZCBwcm9wZXJseQorICAqIHdpdGhpbiBtZXNzYWdlLCBOREMgYW5kIHRocm93YWJsZSB0YWcgdGV4dC4KKyAgKgorICAqIEBwYXJhbSBidWYgU3RyaW5nQnVmZmVyIGhvbGRpbmcgdGhlIFhNTCBkYXRhIHRvIHRoaXMgcG9pbnQuICBUaGUKKyAgKiBpbml0aWFsIENEU3RhcnQgKDwhW0NEQVRBWykgYW5kIGZpbmFsIENERW5kIChdXT4pIG9mIHRoZSBDREFUQQorICAqIHNlY3Rpb24gYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBtZXRob2QuCisgICogQHBhcmFtIHN0ciBUaGUgU3RyaW5nIHRoYXQgaXMgaW5zZXJ0ZWQgaW50byBhbiBleGlzdGluZyBDREFUQSBTZWN0aW9uIHdpdGhpbiBidWYuICAKKyAgKiAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXBwZW5kRXNjYXBpbmdDREFUQShTdHJpbmdCdWZmZXIgYnVmLCBTdHJpbmcgc3RyKSB7CisgICAgaWYoc3RyID09IG51bGwpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoIiIpOworICAgICAgcmV0dXJuOworICAgIH0gCisgICAgCisgICAgaW50IGVuZCA9IHN0ci5pbmRleE9mKENEQVRBX0VORCk7CisgICAgaWYgKGVuZCA8IDApIHsKKyAgICAgIGJ1Zi5hcHBlbmQoc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICB3aGlsZSAoZW5kID4gLTEpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCxlbmQpKTsKKyAgICAgIGJ1Zi5hcHBlbmQoQ0RBVEFfRU1CRURFRF9FTkQpOworICAgICAgc3RhcnQgPSBlbmQgKyBDREFUQV9FTkRfTEVOOworICAgICAgaWYgKHN0YXJ0IDwgc3RyLmxlbmd0aCgpKSB7CisJZW5kID0gc3RyLmluZGV4T2YoQ0RBVEFfRU5ELCBzdGFydCk7CisgICAgICB9IGVsc2UgeworCXJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgYnVmLmFwcGVuZChzdHIuc3Vic3RyaW5nKHN0YXJ0KSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovamRiYy9KREJDQXBwZW5kZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovamRiYy9KREJDQXBwZW5kZXIuamF2YQppbmRleCAzMWJmMDAwLi5jMmNjYWVkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2pkYmMvSkRCQ0FwcGVuZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qZGJjL0pEQkNBcHBlbmRlci5qYXZhCkBAIC0xNCw4ICsxNCwxMyBAQAogCiAKIC8qKgotICBUaGUgSkRCQ0FwcGVuZGVyIHByb3ZpZGVzIGZvciBzZW5kaW5nIGxvZyBldmVudHMgdG8gYSBkYXRhYmFzZS4KKyAgPHA+PGI+PGZvbnQgY29sb3I9IiNGRjIyMjIiPldBUk5JTkc6IFRoaXMgdmVyc2lvbiBvZiBKREJDQXBwZW5kZXIKKyAgaXMgdmVyeSBsaWtlbHkgdG8gYmUgY29tcGxldGVseSByZXBsYWNlZCBpbiB0aGUgZnV0dXJlLiBNb3Jlb2V2ZXIsCisgIGl0IGRvZXMgbm90IGxvZyBleGNlcHRpb25zPC9mb250PjwvYj4uCiAKKyAgVGhlIEpEQkNBcHBlbmRlciBwcm92aWRlcyBmb3Igc2VuZGluZyBsb2cgZXZlbnRzIHRvIGEgZGF0YWJhc2UuCisgIAorICAKICAgPHA+RWFjaCBhcHBlbmQgY2FsbCBhZGRzIHRvIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gYnVmZmVyLiAgV2hlbgogICB0aGUgYnVmZmVyIGlzIGZpbGxlZCBlYWNoIGxvZyBldmVudCBpcyBwbGFjZWQgaW4gYSBzcWwgc3RhdGVtZW50CiAgIChjb25maWd1cmFibGUpIGFuZCBleGVjdXRlZC4KQEAgLTUzLDcgKzU4LDcgQEAKIAogICAgIDwvdWw+CiAKLSAgICBAYXV0aG9yOiBLZXZpbiBTdGVwcGUgKDxBIEhSRUY9Im1haWx0bzprc3RlcHBlQHBhY2JlbGwubmV0Ij5rc3RlcHBlQHBhY2JlbGwubmV0PC9BPikKKyAgICBAYXV0aG9yIEtldmluIFN0ZXBwZSAoPEEgSFJFRj0ibWFpbHRvOmtzdGVwcGVAcGFjYmVsbC5uZXQiPmtzdGVwcGVAcGFjYmVsbC5uZXQ8L0E+KQogCiAqLwogcHVibGljIGNsYXNzIEpEQkNBcHBlbmRlciBleHRlbmRzIG9yZy5hcGFjaGUubG9nNGouQXBwZW5kZXJTa2VsZXRvbgpAQCAtODYsNyArOTEsNyBAQAogICAvKioKICAgICogU3RvcmVzIHRoZSBzdHJpbmcgZ2l2ZW4gdG8gdGhlIHBhdHRlcm4gbGF5b3V0IGZvciBjb252ZXJzaW9uIGludG8gYSBTUUwKICAgICogc3RhdGVtZW50LCBlZzogaW5zZXJ0IGludG8gTG9nVGFibGUgKFRocmVhZCwgQ2xhc3MsIE1lc3NhZ2UpIHZhbHVlcwotICAgKiAoIiV0IiwgIiVjIiwgIiVtIikKKyAgICogKCIldCIsICIlYyIsICIlbSIpLgogICAgKgogICAgKiBCZSBjYXJlZnVsIG9mIHF1b3RlcyBpbiB5b3VyIG1lc3NhZ2VzIQogICAgKgpAQCAtMjM1LDggKzI0MCwxMiBAQAogCQkJICAgRXJyb3JDb2RlLkZMVVNIX0ZBSUxVUkUpOwogICAgICAgfQogICAgIH0KKyAgICAKKyAgICAvLyByZW1vdmUgZnJvbSB0aGUgYnVmZmVyIGFueSBldmVudHMgdGhhdCB3ZXJlIHJlcG9ydGVkCiAgICAgYnVmZmVyLnJlbW92ZUFsbChyZW1vdmVzKTsKLSAgICAvL2J1ZmZlci5jbGVhcigpOworICAgIAorICAgIC8vIGNsZWFyIHRoZSBidWZmZXIgb2YgcmVwb3J0ZWQgZXZlbnRzCisgICAgcmVtb3Zlcy5jbGVhcigpOwogICB9CiAKIApAQCAtMjQ3LDEwICsyNTYsMTAgQEAKIAogCiAgIC8qKgotICAgKiBKREJDQXBwZW5kZXIgYnVpbGRzIGEgbGF5b3V0IGludGVybmFsbHkgaWYgb25lIGlzIG5vdCBwcm92aWRlZC4KLSAgICovCisgICAqIEpEQkNBcHBlbmRlciByZXF1aXJlcyBhIGxheW91dC4KKyAgICogKi8KICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNMYXlvdXQoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOwogICB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvQWdlbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovam14L0FnZW50LmphdmEKaW5kZXggMzA0OWE5MS4uNjhkZTMzMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvQWdlbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2pteC9BZ2VudC5qYXZhCkBAIC02LDEyICs2LDEyIEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CiBpbXBvcnQgY29tLnN1bi5qZG1rLmNvbW0uSHRtbEFkYXB0b3JTZXJ2ZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwogCiAKIHB1YmxpYyBjbGFzcyBBZ2VudCB7CiAKLSAgc3RhdGljIENhdGVnb3J5IGxvZyA9IENhdGVnb3J5LmdldEluc3RhbmNlKEFnZW50LmNsYXNzKTsKKyAgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFnZW50LmNsYXNzKTsKIAogICBwdWJsaWMgQWdlbnQoKSB7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovam14L0hpZXJhcmNoeUR5bmFtaWNNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvSGllcmFyY2h5RHluYW1pY01CZWFuLmphdmEKaW5kZXggMzYxNDA5Yi4uOTUwOTdmZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvSGllcmFyY2h5RHluYW1pY01CZWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvSGllcmFyY2h5RHluYW1pY01CZWFuLmphdmEKQEAgLTkzLDcgKzkzLDcgQEAKIAogICBwdWJsaWMKICAgT2JqZWN0TmFtZSBhZGRMb2dnZXJNQmVhbihTdHJpbmcgbmFtZSkgewotICAgIExvZ2dlciBjYXQgPSBMb2dnZXIuZXhpc3RzKG5hbWUpOworICAgIExvZ2dlciBjYXQgPSBMb2dNYW5hZ2VyLmV4aXN0cyhuYW1lKTsKIAogICAgIGlmKGNhdCAhPSBudWxsKSB7CiAgICAgICByZXR1cm4gYWRkTG9nZ2VyTUJlYW4oY2F0KTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovam14L0xvZ2dlckR5bmFtaWNNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvTG9nZ2VyRHluYW1pY01CZWFuLmphdmEKaW5kZXggMDg2Zjk5Yy4uZWEzYWZkOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvTG9nZ2VyRHluYW1pY01CZWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvTG9nZ2VyRHluYW1pY01CZWFuLmphdmEKQEAgLTIxOCw3ICsyMTgsNyBAQAogCX0gZWxzZSB7CiAJICBwID0gT3B0aW9uQ29udmVydGVyLnRvTGV2ZWwocywgcCk7CiAJfQotCWxvZ2dlci5zZXRQcmlvcml0eShwKTsKKwlsb2dnZXIuc2V0TGV2ZWwocCk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIHRocm93KG5ldyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbigiQXR0cmlidXRlICIgKyBuYW1lICsKQEAgLTIyOCw5ICsyMjgsOSBAQAogICB9CiAKICAgdm9pZCBhcHBlbmRlck1CZWFuUmVnaXN0cmF0aW9uKCkgewotICAgIEVudW1lcmF0aW9uIGVudW0gPSBsb2dnZXIuZ2V0QWxsQXBwZW5kZXJzKCk7Ci0gICAgd2hpbGUoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgQXBwZW5kZXIgYXBwZW5kZXIgPSAoQXBwZW5kZXIpIGVudW0ubmV4dEVsZW1lbnQoKTsKKyAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGxvZ2dlci5nZXRBbGxBcHBlbmRlcnMoKTsKKyAgICB3aGlsZShlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgQXBwZW5kZXIgYXBwZW5kZXIgPSAoQXBwZW5kZXIpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CiAgICAgICByZWdpc3RlckFwcGVuZGVyTUJlYW4oYXBwZW5kZXIpOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvVC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9qbXgvVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDcyNDc0Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovam14L1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5qbXguQWdlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouKjsKLQotcHVibGljIGNsYXNzIFQgewotCi0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKFQuY2xhc3MpOwotICAgIExheW91dCBsYXlvdXQgPSBuZXcgUGF0dGVybkxheW91dCgiJXIgJXAgWyV0XSAlYyAtICVtJW4iKTsKLSAgICBDb25zb2xlQXBwZW5kZXIgY29uc29sZUFwcGVuZGVyID0gbmV3IENvbnNvbGVBcHBlbmRlcihsYXlvdXQpOwotCQkJCQkJCSAgCi0gICAgY29uc29sZUFwcGVuZGVyLnNldE5hbWUoImNvbnNvbGUiKTsKLSAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoY29uc29sZUFwcGVuZGVyKTsKLSAgICBBZ2VudCBhZ2VudCA9IG5ldyBBZ2VudCgpOwotICAgIGFnZW50LnN0YXJ0KCk7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS9MRjVBcHBlbmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvTEY1QXBwZW5kZXIuamF2YQppbmRleCA0NDRiNzZlLi5lMjdkYmVlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS9MRjVBcHBlbmRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L0xGNUFwcGVuZGVyLmphdmEKQEAgLTg4LDExICs4OCwxMSBAQAogICAgKi8KICAgcHVibGljIHZvaWQgYXBwZW5kKExvZ2dpbmdFdmVudCBldmVudCkgewogICAgIC8vIFJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsb2c0aiBMb2dnaW5nRXZlbnQuCi0gICAgU3RyaW5nIGNhdGVnb3J5ID0gZXZlbnQuY2F0ZWdvcnlOYW1lOworICAgIFN0cmluZyBjYXRlZ29yeSA9IGV2ZW50LmdldExvZ2dlck5hbWUoKTsKICAgICBTdHJpbmcgbG9nTWVzc2FnZSA9IGV2ZW50LmdldFJlbmRlcmVkTWVzc2FnZSgpOwogICAgIFN0cmluZyBuZXN0ZWREaWFnbm9zdGljQ29udGV4dCA9IGV2ZW50LmdldE5EQygpOwogICAgIFN0cmluZyB0aHJlYWREZXNjcmlwdGlvbiA9IGV2ZW50LmdldFRocmVhZE5hbWUoKTsKLSAgICBTdHJpbmcgbGV2ZWwgPSBldmVudC5sZXZlbC50b1N0cmluZygpOworICAgIFN0cmluZyBsZXZlbCA9IGV2ZW50LmdldExldmVsKCkudG9TdHJpbmcoKTsKICAgICBsb25nIHRpbWUgPSBldmVudC50aW1lU3RhbXA7CiAgICAgTG9jYXRpb25JbmZvIGxvY2F0aW9uSW5mbyA9IGV2ZW50LmdldExvY2F0aW9uSW5mb3JtYXRpb24oKTsKIApAQCAtMjU1LDQgKzI1NSw0IEBACiAgIC8vIE5lc3RlZCBUb3AtTGV2ZWwgQ2xhc3NlcyBvciBJbnRlcmZhY2VzOgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS9Mb2dSZWNvcmQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L0xvZ1JlY29yZC5qYXZhCmluZGV4IDhkMWNmYTQuLmI4YWIyNWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L0xvZ1JlY29yZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L0xvZ1JlY29yZC5qYXZhCkBAIC0zNTAsNyArMzUwLDcgQEAKICAgLyoqCiAgICAqIFNldCB0aGUgbG9jYXRpb24gaW4gY29kZSB3aGVyZSB0aGlzIExvZ1JlY29yZCBvcmlnaW5hdGVkLgogICAgKgotICAgKiBAcGFyYW0gbmRjIEEgc3RyaW5nIGNvbnRhaW5pbmcgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgICAqIEBwYXJhbSBsb2NhdGlvbiBBIHN0cmluZyBjb250YWluaW5nIGxvY2F0aW9uIGluZm9ybWF0aW9uLgogICAgKi8KICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7CiAgICAgX2xvY2F0aW9uID0gbG9jYXRpb247CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS9jb25maWcvZGVmYXVsdGNvbmZpZy5wcm9wZXJ0aWVzIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvY29uZmlnL2RlZmF1bHRjb25maWcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUzMGJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvY29uZmlnL2RlZmF1bHRjb25maWcucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisjIEZvciB0aGUgZ2VuZXJhbCBzeW50YXggb2YgcHJvcGVydHkgYmFzZWQgY29uZmlndXJhdGlvbiBmaWxlcyBzZWUgdGhlCisjIGRvY3VtZW5hdGlvbiBvZiBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yLgorCisjIFRoZSByb290IGNhdGVnb3J5IHVzZXMgdGhlIGFwcGVuZGVyIGNhbGxlZCBBMS4gU2luY2Ugbm8gcHJpb3JpdHkgaXMKKyMgc3BlY2lmaWVkLCB0aGUgcm9vdCBjYXRlZ29yeSBhc3N1bWVzIHRoZSBkZWZhdWx0IHByaW9yaXR5IGZvciByb290CisjIHdoaWNoIGlzIERFQlVHIGluIGxvZzRqLiBUaGUgcm9vdCBjYXRlZ29yeSBpcyB0aGUgb25seSBjYXRlZ29yeSB0aGF0CisjIGhhcyBhIGRlZmF1bHQgcHJpb3JpdHkuIEFsbCBvdGhlciBjYXRlZ29yaWVzIG5lZWQgbm90IGJlIGFzc2lnbmVkIGEKKyMgcHJpb3JpdHkgaW4gd2hpY2ggY2FzZSB0aGV5IGluaGVyaXQgdGhlaXIgcHJpb3JpdHkgZnJvbSB0aGUKKyMgaGllcmFyY2h5LgorCitsb2c0ai5yb290Q2F0ZWdvcnk9LCBBMQorCisjIEExIGlzIHNldCB0byBiZSBhIExvZ01vbml0b3JBcHBlbmRlciB3aGljaCBvdXRwdXRzIHRvIGEgc3dpbmcKKyMgbG9nZ2luZyBjb25zb2xlLiAKKyAgCitsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLmxmNS5MRjVBcHBlbmRlcgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdXRpbC9Qcm9kdWN0UHJvcGVydGllcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdXRpbC9Qcm9kdWN0UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzllNDFiLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3V0aWwvUHJvZHVjdFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKLSAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLmxmNS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIFByb2R1Y3RQcm9wZXJ0aWVzIGhvbGRzIHRoZSBwcm9wZXJ0aWVzIGRlYWxpbmcgd2l0aAotICogdGhpcyBwcm9kdWN0LiAgVGhlcmUgaXMgbmV2ZXIgYSBuZWVkCi0gKiBmb3IgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MsIHRodXMgdGhpcyBjbGFzcwotICogaXMgYSBzaW5nbGV0b24uCi0gKgotICogVGhlIHByb3BlcnRpZXMgZmlsZSBmb3JtYXQgaXMgYXMgZm9sbG93czoKLSAqCi0gKiAgI0FueSBhcmJpdHJhcnkgY29tbWVudHMgYXJlIGRlbm90ZWQgd2l0aCBhICMKLSAqCi0gKiAgI01hbmRhdG9yeSBwcm9wZXJ0aWVzCi0gKiAgcHJvZHVjdC5uYW1lPTxQcm9kdWN0IG5hbWU+Ci0gKiAgcHJvZHVjdC52ZXJzaW9uLm51bWJlcj08UHJvZHVjdCB2ZXJzaW9uIG51bWJlcj4KLSAqICBwcm9kdWN0LnJlbGVhc2UuZGF0ZT08UHJvZHVjdCByZWxlYXNlIGRhdGU+Ci0gKiAgcHJvZHVjdC5yZWxlYXNlLnR5cGU9PFByb2R1Y3QgcmVsZWFzZSB0eXBlPgotICoKLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBpZgotICogaW5pdGlhbGl6YXRpb24gZmFpbHMsIG9yIGlmIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIGFyZSBhYnNlbnQuCi0gKgotICogQGF1dGhvciBSb2JlcnQgU2hhdwotICogQGF1dGhvciBNaWNoYWVsIEouIFNpa29yc2t5Ci0gKiBAYXV0aG9yIEJyZW50IFNwcmVjaGVyCi0gKi8KLQotLy8gQ29udHJpYnV0ZWQgYnkgVGhvdWdodFdvcmtzIEluYy4KLQotcHVibGljIGNsYXNzIFByb2R1Y3RQcm9wZXJ0aWVzIHsKLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyAgIENvbnN0YW50czoKLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gICBQcm90ZWN0ZWQgVmFyaWFibGVzOgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqIENvbGxlY3Rpb24gb2YgcHJvcGVydGllcy4gKi8KLSAgcHJvdGVjdGVkIFByb3BlcnRpZXMgX3Byb2R1Y3RQcm9wZXJ0aWVzOwotICAvL3Byb3RlY3RlZCBmaW5hbCBib29sZWFuIF92YWxpZEZsYWc7Ci0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyAgIFByaXZhdGUgVmFyaWFibGVzOgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHByaXZhdGUgc3RhdGljIFByb2R1Y3RQcm9wZXJ0aWVzIF9yZWZlcmVuY2UgPSBudWxsOwotICBwcml2YXRlIHN0YXRpYyBPYmplY3QgX3N5bmNocm9uaXppbmdPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyAgIENvbnN0cnVjdG9yczoKLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gUHJvZHVjdFByb3BlcnRpZXMgd2l0aCB0aGUgbWFuZGF0b3J5IHByb3BlcnRpZXMuCi0gICAqIFVzZSB0aGUgY29uc3RydWN0b3IgdGhhdCBjb25maWd1cmVzIGEgUHJvZHVjdFByb3BlcnRpZXMKLSAgICogb2ZmIG9mIGEgcHJvcGVydGllcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHRha2UgYWR2YW50YWdlCi0gICAqIG9mIGFkZGl0aW9uYWwgcHJvcGVydGllcy4KLSAgICoKLSAgICovCi0gIHByaXZhdGUgUHJvZHVjdFByb3BlcnRpZXMoKSB7Ci0gICAgdGhpcyhuZXcgUmVzb3VyY2UoIm9yZy9hcGFjaGUvbG9nNGovbGY1L2xmNS5wcm9wZXJ0aWVzIikpOwotICB9Ci0KLSAgcHJpdmF0ZSBQcm9kdWN0UHJvcGVydGllcyhSZXNvdXJjZSByZXNvdXJjZSkgewotICAgIHN1cGVyKCk7Ci0KLSAgICBfcHJvZHVjdFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0gICAgdHJ5IHsKLSAgICAgIElucHV0U3RyZWFtIHNvdXJjZSA9IGdldFNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICBieXRlW10gY29udGVudHMgPSBTdHJlYW1VdGlscy5nZXRCeXRlcyhzb3VyY2UpOwotICAgICAgX3Byb2R1Y3RQcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcyhjb250ZW50cyk7Ci0gICAgICBzb3VyY2UuY2xvc2UoKTsKLSAgICAgIHZhbGlkYXRlUHJvZHVjdFByb3BlcnRpZXMoKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgU3RyaW5nIGVycm9yID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yKGVycm9yKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gICBQdWJsaWMgTWV0aG9kczoKLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyBzdGF0aWMgUHJvZHVjdFByb3BlcnRpZXMgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgaWYgKF9yZWZlcmVuY2UgPT0gbnVsbCkgewotICAgICAgc3luY2hyb25pemVkIChfc3luY2hyb25pemluZ09iamVjdCkgewotICAgICAgICBpZiAoX3JlZmVyZW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgX3JlZmVyZW5jZSA9IG5ldyBQcm9kdWN0UHJvcGVydGllcygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBfcmVmZXJlbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1hbmRhdG9yeSBpbnRlcm5hbGx5IHJlY29nbml6ZWQgcHJvcGVydHkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWVPZlByb2R1Y3ROYW1lKCkgewotICAgIHJldHVybiAicHJvZHVjdC5uYW1lIjsKLSAgfQotCi0gIC8qKgotICAgKiBNYW5kYXRvcnkgaW50ZXJuYWxseSByZWNvZ25pemVkIHByb3BlcnR5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lT2ZQcm9kdWN0VmVyc2lvbk51bWJlcigpIHsKLSAgICByZXR1cm4gInByb2R1Y3QudmVyc2lvbi5udW1iZXIiOwotICB9Ci0KLSAgLyoqCi0gICAqIE1hbmRhdG9yeSBpbnRlcm5hbGx5IHJlY29nbml6ZWQgcHJvcGVydHkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWVPZlByb2R1Y3RSZWxlYXNlRGF0ZSgpIHsKLSAgICByZXR1cm4gInByb2R1Y3QucmVsZWFzZS5kYXRlIjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHByb2R1Y3QgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoKSB7Ci0gICAgcmV0dXJuIF9wcm9kdWN0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShnZXRQcm9wZXJ0eU5hbWVPZlByb2R1Y3ROYW1lKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcHJvZHVjdCBuYW1lLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvZHVjdE5hbWUoU3RyaW5nIHByb2R1Y3ROYW1lKSB7Ci0gICAgX3Byb2R1Y3RQcm9wZXJ0aWVzLnNldFByb3BlcnR5KGdldFByb3BlcnR5TmFtZU9mUHJvZHVjdE5hbWUoKSwKLSAgICAgICAgcHJvZHVjdE5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcHJvZHVjdCB2ZXJzaW9uIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFZlcnNpb25OdW1iZXIoKSB7Ci0gICAgcmV0dXJuCi0gICAgICAgIF9wcm9kdWN0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShnZXRQcm9wZXJ0eU5hbWVPZlByb2R1Y3RWZXJzaW9uTnVtYmVyKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcHJvZHVjdCB2ZXJzaW9uIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RWZXJzaW9uTnVtYmVyKFN0cmluZyBwcm9kdWN0VmVyc2lvbk51bWJlcikgewotICAgIF9wcm9kdWN0UHJvcGVydGllcy5zZXRQcm9wZXJ0eShnZXRQcm9wZXJ0eU5hbWVPZlByb2R1Y3RWZXJzaW9uTnVtYmVyKCksCi0gICAgICAgIHByb2R1Y3RWZXJzaW9uTnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHByb2R1Y3QgcmVsZWFzZSBkYXRlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0UmVsZWFzZURhdGUoKSB7Ci0gICAgcmV0dXJuCi0gICAgICAgIF9wcm9kdWN0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShnZXRQcm9wZXJ0eU5hbWVPZlByb2R1Y3RSZWxlYXNlRGF0ZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHByb2R1Y3QgcmVsZWFzZSBkYXRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvZHVjdFJlbGVhc2VEYXRlKFN0cmluZyBwcm9kdWN0UmVsZWFzZURhdGUpIHsKLSAgICBfcHJvZHVjdFByb3BlcnRpZXMuc2V0UHJvcGVydHkoZ2V0UHJvcGVydHlOYW1lT2ZQcm9kdWN0UmVsZWFzZURhdGUoKSwKLSAgICAgICAgcHJvZHVjdFJlbGVhc2VEYXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXRyaWV2ZSBhbnkgb2YgdGhlIG1hbmRhdG9yeSBwcm9wZXJ0aWVzLCBvciBhbnkgYWRkaXRpb25hbAotICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBwbGFjZWQgaW4gdGhlIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0KFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIF9wcm9kdWN0UHJvcGVydGllcy5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgYW55IHByb3BlcnR5LgotICAgKi8KLSAgcHVibGljIE9iamVjdCBzZXQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgIHJldHVybiBfcHJvZHVjdFByb3BlcnRpZXMuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRMb2dGYWN0b3I1KCkgewotICAgIHJldHVybiBnZXRTdHJpbmcoImxmNSIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihnZXQocHJvcGVydHlOYW1lKSk7Ci0gIH0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vICAgUHJvdGVjdGVkIE1ldGhvZHM6Ci0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLyoqCi0gICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcm9kdWN0UHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLSAgICB2YWx1ZSA9IGdldFByb2R1Y3RWZXJzaW9uTnVtYmVyKCk7Ci0gICAgaWYgKCh2YWx1ZSA9PSBudWxsKSB8fCB2YWx1ZS5lcXVhbHMoIiIpKSB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJQcm9kdWN0IHZlcnNpb24gbnVtYmVyIGlzIG51bGwuIik7Ci0gICAgfQotCi0gICAgdmFsdWUgPSBnZXRQcm9kdWN0UmVsZWFzZURhdGUoKTsKLSAgICBpZiAoKHZhbHVlID09IG51bGwpIHx8IHZhbHVlLmVxdWFscygiIikpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlByb2R1Y3QgcmVsZWFzZSBkYXRlIGlzIG51bGwuIik7Ci0gICAgfQotCi0gIH0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vICAgUHJpdmF0ZSBNZXRob2RzOgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRTb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0gICAgICAgIFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0aGlzLCByZXNvdXJjZSkpOwotICB9Ci0KLSAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoYnl0ZVtdIGNvbnRlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHNvdXJjZSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50cyk7Ci0gICAgUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotICAgIHJlc3VsdC5sb2FkKHNvdXJjZSk7Ci0gICAgc291cmNlLmNsb3NlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gICBOZXN0ZWQgVG9wLUxldmVsIENsYXNzZXMgb3IgSW50ZXJmYWNlcwotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvTG9nQnJva2VyTW9uaXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdmlld2VyL0xvZ0Jyb2tlck1vbml0b3IuamF2YQppbmRleCA1ZWFjYmVkLi40Mzg2MTllIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvTG9nQnJva2VyTW9uaXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9Mb2dCcm9rZXJNb25pdG9yLmphdmEKQEAgLTEyLDcgKzEyLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmxmNS5Mb2dSZWNvcmRGaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5sZjUudXRpbC5EYXRlRm9ybWF0TWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmxmNS51dGlsLkxvZ0ZpbGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5sZjUudXRpbC5Qcm9kdWN0UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmxmNS51dGlsLlN0cmVhbVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlci5jYXRlZ29yeWV4cGxvcmVyLkNhdGVnb3J5RXhwbG9yZXJUcmVlOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlci5jYXRlZ29yeWV4cGxvcmVyLkNhdGVnb3J5UGF0aDsKQEAgLTQ3NSw4ICs0NzQsNiBAQAogICAgIC8vCiAgICAgLy8gQ29uZmlndXJlIHRoZSBGcmFtZS4KICAgICAvLwotICAgIFByb2R1Y3RQcm9wZXJ0aWVzIHByb3BzID0gUHJvZHVjdFByb3BlcnRpZXMuZ2V0SW5zdGFuY2UoKTsKLQogICAgIF9sb2dNb25pdG9yRnJhbWUgPSBuZXcgSkZyYW1lKCJMb2dGYWN0b3I1Iik7CiAKICAgICBfbG9nTW9uaXRvckZyYW1lLnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRnJhbWUuRE9fTk9USElOR19PTl9DTE9TRSk7CkBAIC0xMDcwLDggKzEwNjcsNiBAQAogICAgIEpNZW51IGhlbHBNZW51ID0gbmV3IEpNZW51KCJIZWxwIik7CiAgICAgaGVscE1lbnUuc2V0TW5lbW9uaWMoJ2gnKTsKICAgICBoZWxwTWVudS5hZGQoY3JlYXRlSGVscFByb3BlcnRpZXMoKSk7Ci0gICAgaGVscE1lbnUuYWRkU2VwYXJhdG9yKCk7Ci0gICAgaGVscE1lbnUuYWRkKGNyZWF0ZUhlbHBBYm91dCgpKTsKICAgICByZXR1cm4gaGVscE1lbnU7CiAgIH0KIApAQCAtMTA5NiwyNSArMTA5MSw2IEBACiAgICAgKTsKICAgfQogCi0gIHByb3RlY3RlZCBKTWVudUl0ZW0gY3JlYXRlSGVscEFib3V0KCkgewotICAgIEpNZW51SXRlbSBhYm91dE1JID0gbmV3IEpNZW51SXRlbSgiQWJvdXQgTG9nRmFjdG9yNS4uLiIpOwotICAgIGFib3V0TUkuc2V0TW5lbW9uaWMoJ2EnKTsKLSAgICAvL2Fib3V0TUkuc2V0QWNjZWxlcmF0b3IoIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoImNvbnRyb2wgQSIpICk7Ci0KLSAgICBhYm91dE1JLmFkZEFjdGlvbkxpc3RlbmVyKAotICAgICAgICBuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgcHJvdGVjdGVkIExvZ0ZhY3RvcjVBYm91dERpYWxvZyBkaWFsb2cgPQotICAgICAgICAgICAgICBuZXcgTG9nRmFjdG9yNUFib3V0RGlhbG9nKF9sb2dNb25pdG9yRnJhbWUpOwotCi0gICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIGRpYWxvZy5zaG93KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICApOwotICAgIHJldHVybiBhYm91dE1JOwotICB9Ci0KICAgcHJvdGVjdGVkIEpNZW51IGNyZWF0ZUVkaXRNZW51KCkgewogICAgIEpNZW51IGVkaXRNZW51ID0gbmV3IEpNZW51KCJFZGl0Iik7CiAgICAgZWRpdE1lbnUuc2V0TW5lbW9uaWMoJ2UnKTsKQEAgLTEyMTYsNyArMTE5MiwxMCBAQAogICAgIF9mb250U2l6ZUNvbWJvID0gZm9udFNpemVDb21ibzsKIAogICAgIENsYXNzTG9hZGVyIGNsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgVVJMIG5ld0ljb25VUkwgPSBjbC5nZXRSZXNvdXJjZSgib3JnL2FwYWNoZS9sb2c0ai92aWV3ZXIvIiArCisgICAgaWYoY2wgPT0gbnVsbCkgeworICAgICAgICBjbCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7CisgICAgfQorICAgIFVSTCBuZXdJY29uVVJMID0gY2wuZ2V0UmVzb3VyY2UoIm9yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci8iICsKICAgICAgICAgImltYWdlcy9jaGFubmVsZXhwbG9yZXJfbmV3LmdpZiIpOwogCiAgICAgSW1hZ2VJY29uIG5ld0ljb24gPSBudWxsOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdmlld2VyL0xvZ0ZhY3RvcjVBYm91dERpYWxvZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdmlld2VyL0xvZ0ZhY3RvcjVBYm91dERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjI0YTgyLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9Mb2dGYWN0b3I1QWJvdXREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKLSAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLmxmNS52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmxmNS51dGlsLlByb2R1Y3RQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LnV0aWwuUmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIExvZ0ZhY3RvcjVBYm91dERpYWxvZwotICoKLSAqIEBhdXRob3IgTWljaGFlbCBKLiBTaWtvcnNreQotICogQGF1dGhvciBSb2JlcnQgU2hhdwotICogQGF1dGhvciBCcmVudCBTcHJlY2hlcgotICogQGF1dGhvciBCcmFkIE1hcmxib3JvdWdoCi0gKi8KLQotLy8gQ29udHJpYnV0ZWQgYnkgVGhvdWdodFdvcmtzIEluYy4KLQotcHVibGljIGNsYXNzIExvZ0ZhY3RvcjVBYm91dERpYWxvZyBleHRlbmRzIEpEaWFsb2cgewotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vICAgQ29uc3RhbnRzOgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyAgIFByb3RlY3RlZCBWYXJpYWJsZXM6Ci0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vICAgUHJpdmF0ZSBWYXJpYWJsZXM6Ci0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vICAgQ29uc3RydWN0b3JzOgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyAgIFB1YmxpYyBNZXRob2RzOgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIExvZ0ZhY3RvcjVBYm91dERpYWxvZyhGcmFtZSBvd25lcikgewotICAgIHN1cGVyKG93bmVyLCAiQWJvdXQgTG9nRmFjdG9yNSIsIHRydWUpOwotCi0gICAgUHJvZHVjdFByb3BlcnRpZXMgcHJvcHMgPSBQcm9kdWN0UHJvcGVydGllcy5nZXRJbnN0YW5jZSgpOwotCi0gICAgc2V0VGl0bGUoIkFib3V0IExvZ0ZhY3RvcjUiKTsKLQotICAgIEpQYW5lbCBpbWFnZVBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgIFJlc291cmNlIGFib3V0UmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoIm9yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9pbWFnZXMvIiArCi0gICAgICAgICJsZjVfYWJvdXQuZ2lmIik7Ci0gICAgVVJMIGFib3V0SWNvblVSTCA9IGFib3V0UmVzb3VyY2UuZ2V0VVJMKCk7Ci0gICAgSW1hZ2VJY29uIGFib3V0SWNvbiA9IG51bGw7Ci0gICAgaWYgKGFib3V0SWNvblVSTCAhPSBudWxsKSB7Ci0gICAgICBhYm91dEljb24gPSBuZXcgSW1hZ2VJY29uKGFib3V0SWNvblVSTCk7Ci0gICAgfQotCi0gICAgSkxhYmVsIGltYWdlTGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0KLSAgICBpZiAoYWJvdXRJY29uICE9IG51bGwpIHsKLSAgICAgIGltYWdlTGFiZWwuc2V0SWNvbihhYm91dEljb24pOwotICAgIH0KLSAgICBpbWFnZVBhbmVsLmFkZChpbWFnZUxhYmVsKTsKLQotICAgIEpQYW5lbCB0ZXh0UGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgdGV4dFBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCAxKSk7Ci0KLQotICAgIGludCBudW1iZXJPZlJvd3MgPSAxMzsKLSAgICBudW1iZXJPZlJvd3MgPSAxMTsgLy8gd2UgbmVlZCBsZXNzIHJvb20gZm9yIGEgcmVnaXN0ZXJlZCB1c2VyLgotICAgIEpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgbWFpblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dChudW1iZXJPZlJvd3MsIDEpKTsKLSAgICBKTGFiZWwgYWJvdXRMRjUgPSBuZXcgSkxhYmVsKCJMb2dGYWN0b3I1IHYiICsgcHJvcHMuZ2V0UHJvZHVjdFZlcnNpb25OdW1iZXIoKSwgSkxhYmVsLkNFTlRFUik7Ci0gICAgYWJvdXRMRjUuc2V0SG9yaXpvbnRhbEFsaWdubWVudChTd2luZ0NvbnN0YW50cy5DRU5URVIpOwotICAgIEpMYWJlbCBkb25hdGUgPSBuZXcgSkxhYmVsKCJDb250cmlidXRlZCBieSBUaG91Z2h0V29ya3MgSW5jLiIpOwotICAgIGRvbmF0ZS5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0gICAgbWFpblBhbmVsLmFkZChhYm91dExGNSk7Ci0gICAgbWFpblBhbmVsLmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCgxMCkpOwotICAgIG1haW5QYW5lbC5hZGQoZG9uYXRlKTsKLSAgICBtYWluUGFuZWwuYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDEwKSk7Ci0KLSAgICBKQnV0dG9uIG9rID0gbmV3IEpCdXR0b24oIk9LIik7Ci0gICAgSlBhbmVsIHNvdXRoUGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgc291dGhQYW5lbC5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoKSk7Ci0gICAgc291dGhQYW5lbC5hZGQob2spOwotICAgIG9rLmFkZEFjdGlvbkxpc3RlbmVyKAotICAgICAgICBuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIGhpZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICk7Ci0gICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoaW1hZ2VQYW5lbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLSAgICBnZXRDb250ZW50UGFuZSgpLmFkZChtYWluUGFuZWwsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKHNvdXRoUGFuZWwsIEJvcmRlckxheW91dC5TT1VUSCk7Ci0gICAgc2V0U2l6ZSg0MTQsIDQwMCk7Ci0gICAgY2VudGVyKCk7Ci0gIH0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyAgIFByb3RlY3RlZCBNZXRob2RzOgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2VudGVyKCkgewotICAgIERpbWVuc2lvbiBzY3JlZW4gPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpOwotICAgIERpbWVuc2lvbiBjb21wID0gZ2V0U2l6ZSgpOwotCi0gICAgc2V0TG9jYXRpb24oKChzY3JlZW4ud2lkdGggLSBjb21wLndpZHRoKSAvIDIpLAotICAgICAgICAoKHNjcmVlbi5oZWlnaHQgLSBjb21wLmhlaWdodCkgLyAyKSk7Ci0KLSAgfQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gICBQcml2YXRlIE1ldGhvZHM6Ci0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vICAgTmVzdGVkIFRvcC1MZXZlbCBDbGFzc2VzIG9yIEludGVyZmFjZXM6Ci0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdmlld2VyL2NhdGVnb3J5ZXhwbG9yZXIvQ2F0ZWdvcnlOb2RlRWRpdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvY2F0ZWdvcnlleHBsb3Jlci9DYXRlZ29yeU5vZGVFZGl0b3IuamF2YQppbmRleCBmYmI2YTliLi4zNjkwMzJlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvY2F0ZWdvcnlleHBsb3Jlci9DYXRlZ29yeU5vZGVFZGl0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvY2F0ZWdvcnlleHBsb3Jlci9DYXRlZ29yeU5vZGVFZGl0b3IuamF2YQpAQCAtMjQxLDkgKzI0MSw5IEBACiAgIHByb3RlY3RlZCBpbnQgcmVtb3ZlVW51c2VkTm9kZXMoKSB7CiAgICAgaW50IGNvdW50ID0gMDsKICAgICBDYXRlZ29yeU5vZGUgcm9vdCA9IF9jYXRlZ29yeU1vZGVsLmdldFJvb3RDYXRlZ29yeU5vZGUoKTsKLSAgICBFbnVtZXJhdGlvbiBlbnVtID0gcm9vdC5kZXB0aEZpcnN0RW51bWVyYXRpb24oKTsKLSAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgQ2F0ZWdvcnlOb2RlIG5vZGUgPSAoQ2F0ZWdvcnlOb2RlKSBlbnVtLm5leHRFbGVtZW50KCk7CisgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByb290LmRlcHRoRmlyc3RFbnVtZXJhdGlvbigpOworICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgQ2F0ZWdvcnlOb2RlIG5vZGUgPSAoQ2F0ZWdvcnlOb2RlKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwogICAgICAgaWYgKG5vZGUuaXNMZWFmKCkgJiYgbm9kZS5nZXROdW1iZXJPZkNvbnRhaW5lZFJlY29yZHMoKSA9PSAwCiAgICAgICAgICAgJiYgbm9kZS5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CiAgICAgICAgIF9jYXRlZ29yeU1vZGVsLnJlbW92ZU5vZGVGcm9tUGFyZW50KG5vZGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdmlld2VyL2NvbmZpZ3VyZS9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdmlld2VyL2NvbmZpZ3VyZS9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmluZGV4IDNlMzg5ZDguLjBmYjFjMjYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9jb25maWd1cmUvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvY29uZmlndXJlL0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKQEAgLTMzMCw4ICszMzAsNyBAQAogCiAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7CiAgICAgU3RyaW5nIGhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOwotICAgIFN0cmluZyBzZXAgPSAoaG9tZS5zdGFydHNXaXRoKE1SVUZpbGVNYW5hZ2VyLlVOSVhfU0VQQVJBVE9SKSkKLSAgICAgICAgPyBNUlVGaWxlTWFuYWdlci5VTklYX1NFUEFSQVRPUiA6IE1SVUZpbGVNYW5hZ2VyLkRPU19TRVBBUkFUT1I7CisgICAgU3RyaW5nIHNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKIAogICAgIHJldHVybiBob21lICsgc2VwICsgImxmNSIgKyBzZXAgKyBDT05GSUdfRklMRV9OQU1FOwogICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvY29uZmlndXJlL01SVUZpbGVNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvY29uZmlndXJlL01SVUZpbGVNYW5hZ2VyLmphdmEKaW5kZXggNTE2M2EwNy4uNWUxMjRjYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9sZjUvdmlld2VyL2NvbmZpZ3VyZS9NUlVGaWxlTWFuYWdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9jb25maWd1cmUvTVJVRmlsZU1hbmFnZXIuamF2YQpAQCAtMjksOCArMjksNiBAQAogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRV9OQU1FID0gIm1ydV9maWxlX21hbmFnZXIiOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfU0laRSA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVhfU0VQQVJBVE9SID0gIi8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1NfU0VQQVJBVE9SID0gIlxcIjsKIAogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vICAgUHJvdGVjdGVkIFZhcmlhYmxlczoKQEAgLTc0LDcgKzcyLDYgQEAKICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgfQotCiAgIH0KIAogICAvKioKQEAgLTExMiw3ICsxMDksNiBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKLQogICAvKioKICAgICogQWRkcyBhIGZpbGUgbmFtZSB0byB0aGUgTVJVIGZpbGUgbGlzdC4KICAgICovCkBAIC0xNjgsNyArMTY0LDcgQEAKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVDb25maWd1cmF0aW9uRGlyZWN0b3J5KCkgewogICAgIFN0cmluZyBob21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLSAgICBTdHJpbmcgc2VwID0gKGhvbWUuc3RhcnRzV2l0aChVTklYX1NFUEFSQVRPUikpID8gVU5JWF9TRVBBUkFUT1IgOiBET1NfU0VQQVJBVE9SOworICAgIFN0cmluZyBzZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7CiAgICAgRmlsZSBmID0gbmV3IEZpbGUoaG9tZSArIHNlcCArICJsZjUiKTsKICAgICBpZiAoIWYuZXhpc3RzKCkpIHsKICAgICAgIHRyeSB7CkBAIC0yNTMsNyArMjQ5LDcgQEAKIAogICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVuYW1lKCkgewogICAgIFN0cmluZyBob21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLSAgICBTdHJpbmcgc2VwID0gKGhvbWUuc3RhcnRzV2l0aChVTklYX1NFUEFSQVRPUikpID8gVU5JWF9TRVBBUkFUT1IgOiBET1NfU0VQQVJBVE9SOworICAgIFN0cmluZyBzZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7CiAKICAgICByZXR1cm4gaG9tZSArIHNlcCArICJsZjUiICsgc2VwICsgQ09ORklHX0ZJTEVfTkFNRTsKICAgfQpAQCAtMjY0LDcgKzI2MCw3IEBACiAgIHByb3RlY3RlZCB2b2lkIHNldE1heFNpemUoaW50IG1heFNpemUpIHsKICAgICBpZiAobWF4U2l6ZSA8IF9tcnVGaWxlTGlzdC5zaXplKCkpIHsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21ydUZpbGVMaXN0LnNpemUoKSAtIG1heFNpemU7IGkrKykgewotICAgICAgICBfbXJ1RmlsZUxpc3QucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgX21ydUZpbGVMaXN0LnJlbW92ZUxhc3QoKTsKICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9pbWFnZXMvbGY1X2Fib3V0LmdpZiBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9pbWFnZXMvbGY1X2Fib3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjNTllZi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvaW1hZ2VzL2xmNV9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2xmNS92aWV3ZXIvaW1hZ2VzL2xmNV9zbWFsbF9pY29uLnBuZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9pbWFnZXMvbGY1X3NtYWxsX2ljb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ2MmUzLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbGY1L3ZpZXdlci9pbWFnZXMvbGY1X3NtYWxsX2ljb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvSk1TQXBwZW5kZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L0pNU0FwcGVuZGVyLmphdmEKaW5kZXggMTY1ZWQxYS4uYTk3YWRjNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvSk1TQXBwZW5kZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9KTVNBcHBlbmRlci5qYXZhCkBAIC0xMiwyNSArMTIsOTggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnNwaS5FcnJvckNvZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLkxvZ0xvZzsKIAotaW1wb3J0IGphdmF4Lmptcy4qOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4Lmptcy5Ub3BpY0Nvbm5lY3Rpb247CitpbXBvcnQgamF2YXguam1zLlRvcGljQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgamF2YXguam1zLlRvcGljOworaW1wb3J0IGphdmF4Lmptcy5Ub3BpY1B1Ymxpc2hlcjsKK2ltcG9ydCBqYXZheC5qbXMuVG9waWNTZXNzaW9uOworaW1wb3J0IGphdmF4Lmptcy5TZXNzaW9uOworaW1wb3J0IGphdmF4Lmptcy5PYmplY3RNZXNzYWdlOwogaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKIGltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKIGltcG9ydCBqYXZheC5uYW1pbmcuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CiAKIC8qKgotICAgQSBzaW1wbGUgYXBwZW5kZXIgYmFzZWQgb24gSk1TLgorICogQSBzaW1wbGUgYXBwZW5kZXIgdGhhdCBwdWJsaXNoZXMgZXZlbnRzIHRvIGEgSk1TIFRvcGljLiBUaGUgZXZlbnRzCisgKiBhcmUgc2VyaWFsaXplZCBhbmQgdHJhbnNtaXR0ZWQgYXMgSk1TIG1lc3NhZ2UgdHlwZSB7QGxpbmsKKyAqIE9iamVjdE1lc3NhZ2V9LgogCi0gICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7Ci0qLworICogPHA+Sk1TIHtAbGluayBUb3BpYyB0b3BpY3N9IGFuZCB7QGxpbmsgVG9waWNDb25uZWN0aW9uRmFjdG9yeSB0b3BpYworICogY29ubmVjdGlvbiBmYWN0b3JpZXN9IGFyZSBhZG1pbmlzdGVyZWQgb2JqZWN0cyB0aGF0IGFyZSByZXRyaWV2ZWQKKyAqIHVzaW5nIEpOREkgbWVzc2FnaW5nIHdoaWNoIGluIHR1cm4gcmVxdWlyZXMgdGhlIHJldHJlaXZhbCBvZiBhIEpOREkKKyAqIHtAbGluayBDb250ZXh0fS4KKworICogPHA+VGhlcmUgYXJlIHR3byBjb21tb24gbWV0aG9kcyBmb3IgcmV0cmlldmluZyBhIEpOREkge0BsaW5rCisgKiBDb250ZXh0fS4gSWYgYSBmaWxlIHJlc291cmNlIG5hbWVkIDxlbT5qbmRpLnByb3BlcnRpZXM8L2VtPiBpcworICogYXZhaWxhYmxlIHRvIHRoZSBKTkRJIEFQSSwgaXQgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIGZvdW5kCisgKiB0aGVyZWluIHRvIHJldHJpZXZlIGFuIGluaXRpYWwgSk5ESSBjb250ZXh0LiBUbyBvYnRhaW4gYW4gaW5pdGlhbAorICogY29udGV4dCwgeW91ciBjb2RlIHdpbGwgc2ltcGx5IGNhbGw6CisKKyAgIDxwcmU+CisgICBJbml0aWFsQ29udGV4dCBqbmRpQ29udGV4dCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworICAgPC9wcmU+CisgIAorICogPHA+Q2FsbGluZyB0aGUgbm8tYXJndW1lbnQgPGNvZGU+SW5pdGlhbENvbnRleHQoKTwvY29kZT4gbWV0aG9kCisgKiB3aWxsIGFsc28gd29yayBmcm9tIHdpdGhpbiBFbnRlcnByaXNlIEphdmEgQmVhbnMgKEVKQnMpIGJlY2F1c2UgaXQKKyAqIGlzIHBhcnQgb2YgdGhlIEVKQiBjb250cmFjdCBmb3IgYXBwbGljYXRpb24gc2VydmVycyB0byBwcm92aWRlIGVhY2gKKyAqIGJlYW4gYW4gZW52aXJvbm1lbnQgbmFtaW5nIGNvbnRleHQgKEVOQykuCisgICAgCisgKiA8cD5JbiB0aGUgc2Vjb25kIGFwcHJvYWNoLCBzZXZlcmFsIHByZWRldGVybWluZWQgcHJvcGVydGllcyBhcmUgc2V0CisgKiBhbmQgdGhlc2UgcHJvcGVydGllcyBhcmUgcGFzc2VkIHRvIHRoZSA8Y29kZT5Jbml0aWFsQ29udGV4dDwvY29kZT4KKyAqIGNvbnRydWN0b3IgdG8gY29ubmVjdCB0byB0aGUgbmFtaW5nIHNlcnZpY2UgcHJvdmlkZXIuIEZvciBleGFtcGxlLAorICogdG8gY29ubmVjdCB0byBKQm9zcyBuYW1pbmcgc2VydmljZSBvbmUgd291bGQgd3JpdGU6CisKKzxwcmU+CisgICBQcm9wZXJ0aWVzIGVudiA9IG5ldyBQcm9wZXJ0aWVzKCApOworICAgZW52LnB1dChDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLCAib3JnLmpucC5pbnRlcmZhY2VzLk5hbWluZ0NvbnRleHRGYWN0b3J5Iik7CisgICBlbnYucHV0KENvbnRleHQuUFJPVklERVJfVVJMLCAiam5wOi8vaG9zdG5hbWU6MTA5OSIpOworICAgZW52LnB1dChDb250ZXh0LlVSTF9QS0dfUFJFRklYRVMsICJvcmcuamJvc3MubmFtaW5nOm9yZy5qbnAuaW50ZXJmYWNlcyIpOworICAgSW5pdGlhbENvbnRleHQgam5kaUNvbnRleHQgPSBuZXcgSW5pdGlhbENvbnRleHQoZW52KTsKKzwvcHJlPgorCisgICAqIHdoZXJlIDxlbT5ob3N0bmFtZTwvZW0+IGlzIHRoZSBob3N0IHdoZXJlIHRoZSBKQm9zcyBhcHBsaWNhaXRvbgorICAgKiBzZXJ2ZXIgaXMgcnVubmluZy4KKyAgICoKKyAgICogPHA+VG8gY29ubmVjdCB0byB0aGUgdGhlIG5hbWluZyBzZXJ2aWNlIG9mIFdlYmxvZ2ljIGFwcGxpY2F0aW9uCisgICAqIHNlcnZlciBvbmUgd291bGQgd3JpdGU6CisKKzxwcmU+CisgICBQcm9wZXJ0aWVzIGVudiA9IG5ldyBQcm9wZXJ0aWVzKCApOworICAgZW52LnB1dChDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLCAid2VibG9naWMuam5kaS5XTEluaXRpYWxDb250ZXh0RmFjdG9yeSIpOworICAgZW52LnB1dChDb250ZXh0LlBST1ZJREVSX1VSTCwgInQzOi8vbG9jYWxob3N0OjcwMDEiKTsKKyAgIEluaXRpYWxDb250ZXh0IGpuZGlDb250ZXh0ID0gbmV3IEluaXRpYWxDb250ZXh0KGVudik7Cis8L3ByZT4KKworICAqIDxwPk90aGVyIEpNUyBwcm92aWRlcnMgd2lsbCBvYnZpb3VzbHkgcmVxdWlyZSBkaWZmZXJlbnQgdmFsdWVzLgorICAqIAorICAqIFRoZSBpbml0aWFsIEpOREkgY29udGV4dCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyB0aGUKKyAgKiBuby1hcmd1bWVudCA8Y29kZT5Jbml0aWFsQ29udGV4dCgpPC9jb2RlPiBtZXRob2QgaW4gRUpCcy4gT25seQorICAqIGNsaWVudHMgcnVubmluZyBpbiBhIHNlcGFyYXRlIEpWTSBuZWVkIHRvIGJlIGNvbmNlcm5lZCBhYm91dCB0aGUKKyAgKiA8ZW0+am5kaS5wcm9wZXJ0aWVzPC9lbT4gZmlsZSBhbmQgY2FsbGluZyB7QGxpbmsKKyAgKiBJbml0aWFsQ29udGV4dCNJbml0aWFsQ29udGV4dCgpfSBvciBhbHRlcm5hdGl2ZWx5IGNvcnJlY3RseQorICAqIHNldHRpbmcgdGhlIGRpZmZlcmVudCBwcm9wZXJ0aWVzIGJlZm9yZSBjYWxsaW5nIHtAbGluaworICAqIEluaXRpYWxDb250ZXh0I0luaXRpYWxDb250ZXh0KGphdmEudXRpbC5IYXNodGFibGUpfSBtZXRob2QuCisKKworICAgQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOyAqLwogcHVibGljIGNsYXNzIEpNU0FwcGVuZGVyIGV4dGVuZHMgQXBwZW5kZXJTa2VsZXRvbiB7CiAKKyAgU3RyaW5nIHNlY3VyaXR5UHJpbmNpcGFsTmFtZTsKKyAgU3RyaW5nIHNlY3VyaXR5Q3JlZGVudGlhbHM7CisgIFN0cmluZyBpbml0aWFsQ29udGV4dEZhY3RvcnlOYW1lOworICBTdHJpbmcgdXJsUGtnUHJlZml4ZXM7CisgIFN0cmluZyBwcm92aWRlclVSTDsKKyAgU3RyaW5nIHRvcGljQmluZGluZ05hbWU7CisgIFN0cmluZyB0Y2ZCaW5kaW5nTmFtZTsKKyAgU3RyaW5nIHVzZXJOYW1lOworICBTdHJpbmcgcGFzc3dvcmQ7CisgIGJvb2xlYW4gbG9jYXRpb25JbmZvOworCiAgIFRvcGljQ29ubmVjdGlvbiAgdG9waWNDb25uZWN0aW9uOwogICBUb3BpY1Nlc3Npb24gdG9waWNTZXNzaW9uOwogICBUb3BpY1B1Ymxpc2hlciAgdG9waWNQdWJsaXNoZXI7Ci0gIFN0cmluZyB0b3BpY0JpbmRpbmdOYW1lOwotICBTdHJpbmcgdGNmQmluZGluZ05hbWU7Ci0gIGJvb2xlYW4gbG9jYXRpb25JbmZvOwogCiAgIHB1YmxpYwogICBKTVNBcHBlbmRlcigpIHsKQEAgLTgyLDMxICsxNTUsNzUgQEAKICAgICByZXR1cm4gbG9jYXRpb25JbmZvOwogICB9CiAKLSAgcHVibGljCi0gIHZvaWQgYWN0aXZhdGVPcHRpb25zKCkgeworICAvKioKKyAgICogIE9wdGlvbnMgYXJlIGFjdGl2YXRlZCBhbmQgYmVjb21lIGVmZmVjdGl2ZSBvbmx5IGFmdGVyIGNhbGxpbmcKKyAgICogIHRoaXMgbWV0aG9kLiovCisgIHB1YmxpYyB2b2lkIGFjdGl2YXRlT3B0aW9ucygpIHsKICAgICBUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5ICB0b3BpY0Nvbm5lY3Rpb25GYWN0b3J5OwogCiAgICAgdHJ5IHsKLSAgICAgIENvbnRleHQgY3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7Ci0gICAgICB0b3BpY0Nvbm5lY3Rpb25GYWN0b3J5ID0gKFRvcGljQ29ubmVjdGlvbkZhY3RvcnkpIGxvb2t1cChjdHgsIHRjZkJpbmRpbmdOYW1lKTsKLSAgICAgIHRvcGljQ29ubmVjdGlvbiA9IHRvcGljQ29ubmVjdGlvbkZhY3RvcnkuY3JlYXRlVG9waWNDb25uZWN0aW9uKCk7Ci0gICAgICB0b3BpY0Nvbm5lY3Rpb24uc3RhcnQoKTsKKyAgICAgIENvbnRleHQgam5kaTsKIAorICAgICAgTG9nTG9nLmRlYnVnKCJHZXR0aW5nIGluaXRpYWwgY29udGV4dC4iKTsKKyAgICAgIGlmKGluaXRpYWxDb250ZXh0RmFjdG9yeU5hbWUgIT0gbnVsbCkgeworCVByb3BlcnRpZXMgZW52ID0gbmV3IFByb3BlcnRpZXMoICk7CisJZW52LnB1dChDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLCBpbml0aWFsQ29udGV4dEZhY3RvcnlOYW1lKTsKKwlpZihwcm92aWRlclVSTCAhPSBudWxsKSB7CisJICBlbnYucHV0KENvbnRleHQuUFJPVklERVJfVVJMLCBwcm92aWRlclVSTCk7CisJfSBlbHNlIHsKKwkgIExvZ0xvZy53YXJuKCJZb3UgaGF2ZSBzZXQgSW5pdGlhbENvbnRleHRGYWN0b3J5TmFtZSBvcHRpb24gYnV0IG5vdCB0aGUgIgorCQkgICAgICsiUHJvdmlkZXJVUkwuIFRoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zLiIpOworCX0KKwlpZih1cmxQa2dQcmVmaXhlcyAhPSBudWxsKSB7CisJICBlbnYucHV0KENvbnRleHQuVVJMX1BLR19QUkVGSVhFUywgdXJsUGtnUHJlZml4ZXMpOworCX0KKwkKKwlpZihzZWN1cml0eVByaW5jaXBhbE5hbWUgIT0gbnVsbCkgeworCSAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX1BSSU5DSVBBTCwgc2VjdXJpdHlQcmluY2lwYWxOYW1lKTsKKwkgIGlmKHNlY3VyaXR5Q3JlZGVudGlhbHMgIT0gbnVsbCkgeworCSAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfQ1JFREVOVElBTFMsIHNlY3VyaXR5Q3JlZGVudGlhbHMpOworCSAgfSBlbHNlIHsKKwkgICAgTG9nTG9nLndhcm4oIllvdSBoYXZlIHNldCBTZWN1cml0eVByaW5jaXBhbE5hbWUgb3B0aW9uIGJ1dCBub3QgdGhlICIKKwkJCSsiU2VjdXJpdHlDcmVkZW50aWFscy4gVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXMuIik7CisJICB9CisJfQkKKwlqbmRpID0gbmV3IEluaXRpYWxDb250ZXh0KGVudik7CisgICAgICB9IGVsc2UgeworCWpuZGkgPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKKyAgICAgIH0KKworICAgICAgTG9nTG9nLmRlYnVnKCJMb29raW5nIHVwIFsiK3RjZkJpbmRpbmdOYW1lKyJdIik7CisgICAgICB0b3BpY0Nvbm5lY3Rpb25GYWN0b3J5ID0gKFRvcGljQ29ubmVjdGlvbkZhY3RvcnkpIGxvb2t1cChqbmRpLCB0Y2ZCaW5kaW5nTmFtZSk7CisgICAgICBMb2dMb2cuZGVidWcoIkFib3V0IHRvIGNyZWF0ZSBUb3BpY0Nvbm5lY3Rpb24uIik7CisgICAgICBpZih1c2VyTmFtZSAhPSBudWxsKSB7CisJdG9waWNDb25uZWN0aW9uID0gdG9waWNDb25uZWN0aW9uRmFjdG9yeS5jcmVhdGVUb3BpY0Nvbm5lY3Rpb24odXNlck5hbWUsIAorCQkJCQkJCQkgICAgICAgcGFzc3dvcmQpOyAKKyAgICAgIH0gZWxzZSB7CisJdG9waWNDb25uZWN0aW9uID0gdG9waWNDb25uZWN0aW9uRmFjdG9yeS5jcmVhdGVUb3BpY0Nvbm5lY3Rpb24oKTsKKyAgICAgIH0KKworICAgICAgTG9nTG9nLmRlYnVnKCJDcmVhdGluZyBUb3BpY1Nlc3Npb24sIG5vbi10cmFuc2FjdGlvbmFsLCAiCisJCSAgICsiaW4gQVVUT19BQ0tOT1dMRURHRSBtb2RlLiIpOwogICAgICAgdG9waWNTZXNzaW9uID0gdG9waWNDb25uZWN0aW9uLmNyZWF0ZVRvcGljU2Vzc2lvbihmYWxzZSwKIAkJCQkJCQlTZXNzaW9uLkFVVE9fQUNLTk9XTEVER0UpOwogCi0gICAgICBUb3BpYyB0b3BpYyA9IChUb3BpYykgbG9va3VwKGN0eCwgdG9waWNCaW5kaW5nTmFtZSk7Ci0gICAgICB0b3BpY1B1Ymxpc2hlciA9IHRvcGljU2Vzc2lvbi5jcmVhdGVQdWJsaXNoZXIodG9waWMpOworICAgICAgTG9nTG9nLmRlYnVnKCJMb29raW5nIHVwIHRvcGljIG5hbWUgWyIrdG9waWNCaW5kaW5nTmFtZSsiXS4iKTsKKyAgICAgIFRvcGljIHRvcGljID0gKFRvcGljKSBsb29rdXAoam5kaSwgdG9waWNCaW5kaW5nTmFtZSk7CiAKLSAgICAgIGN0eC5jbG9zZSgpOworICAgICAgTG9nTG9nLmRlYnVnKCJDcmVhdGluZyBUb3BpY1B1Ymxpc2hlci4iKTsKKyAgICAgIHRvcGljUHVibGlzaGVyID0gdG9waWNTZXNzaW9uLmNyZWF0ZVB1Ymxpc2hlcih0b3BpYyk7CisgICAgICAKKyAgICAgIExvZ0xvZy5kZWJ1ZygiU3RhcnRpbmcgVG9waWNDb25uZWN0aW9uLiIpOworICAgICAgdG9waWNDb25uZWN0aW9uLnN0YXJ0KCk7CisKKyAgICAgIGpuZGkuY2xvc2UoKTsKICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBlcnJvckhhbmRsZXIuZXJyb3IoIkVycm9yIHdoaWxlIGFjdGl2YXRpbmcgb3B0aW9ucyBmb3IgYXBwZW5kZXIgbmFtZWQgWyIrbmFtZSsKIAkJCSAiXS4iLCBlLCBFcnJvckNvZGUuR0VORVJJQ19GQUlMVVJFKTsKICAgICB9CiAgIH0KIAotICBwcm90ZWN0ZWQKLSAgT2JqZWN0IGxvb2t1cChDb250ZXh0IGN0eCwgU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICBwcm90ZWN0ZWQgT2JqZWN0IGxvb2t1cChDb250ZXh0IGN0eCwgU3RyaW5nIG5hbWUpIHRocm93cyBOYW1pbmdFeGNlcHRpb24gewogICAgIHRyeSB7CiAgICAgICByZXR1cm4gY3R4Lmxvb2t1cChuYW1lKTsKICAgICB9IGNhdGNoKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CkBAIC0xMTUsOCArMjMyLDcgQEAKICAgICB9CiAgIH0KIAotICBwcm90ZWN0ZWQKLSAgYm9vbGVhbiBjaGVja0VudHJ5Q29uZGl0aW9ucygpIHsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tFbnRyeUNvbmRpdGlvbnMoKSB7CiAgICAgU3RyaW5nIGZhaWwgPSBudWxsOwogCiAgICAgaWYodGhpcy50b3BpY0Nvbm5lY3Rpb24gPT0gbnVsbCkgewpAQCAtMTM4LDkgKzI1NCw5IEBACiAgIC8qKgogICAgICBDbG9zZSB0aGlzIEpNU0FwcGVuZGVyLiBDbG9zaW5nIHJlbGVhc2VzIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUKICAgICAgYXBwZW5kZXIuIEEgY2xvc2VkIGFwcGVuZGVyIGNhbm5vdCBiZSByZS1vcGVuZWQuICovCi0gIHB1YmxpYwotICBzeW5jaHJvbml6ZWQgLy8gYXZvaWQgY29uY3VycmVudCBhcHBlbmQgYW5kIGNsb3NlIG9wZXJhdGlvbnMKLSAgdm9pZCBjbG9zZSgpIHsKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgeworICAgIC8vIFRoZSBzeW5jaHJvbml6ZWQgbW9kaWZpZXIgYXZvaWRzIGNvbmN1cnJlbnQgYXBwZW5kIGFuZCBjbG9zZSBvcGVyYXRpb25zCisKICAgICBpZih0aGlzLmNsb3NlZCkKICAgICAgIHJldHVybjsKIApAQCAtMTY0LDggKzI4MCw3IEBACiAgIC8qKgogICAgICBUaGlzIG1ldGhvZCBjYWxsZWQgYnkge0BsaW5rIEFwcGVuZGVyU2tlbGV0b24jZG9BcHBlbmR9IG1ldGhvZCB0bwogICAgICBkbyBtb3N0IG9mIHRoZSByZWFsIGFwcGVuZGluZyB3b3JrLiAgKi8KLSAgcHVibGljCi0gIHZvaWQgYXBwZW5kKExvZ2dpbmdFdmVudCBldmVudCkgeworICBwdWJsaWMgdm9pZCBhcHBlbmQoTG9nZ2luZ0V2ZW50IGV2ZW50KSB7CiAgICAgaWYoIWNoZWNrRW50cnlDb25kaXRpb25zKCkpIHsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xODQsMTcgKzI5OSwxMDEgQEAKICAgfQogCiAgIC8qKgotICAgICAgSWYgdHJ1ZSwgdGhlIGluZm9ybWF0aW9uIHNlbnQgdG8gdGhlIHJlbW90ZSBzdWJzY3JpYmVyIHdpbGwgaW5jbHVkZQotICAgICAgbG9jYXRpb24gaW5mb3JtYXRpb24uIEJ5IGRlZmF1bHQgbm8gbG9jYXRpb24gaW5mb3JtYXRpb24gaXMgc2VudAotICAgICAgdG8gdGhlIHN1YnNjcmliZXIuICAqLwotICBwdWJsaWMKLSAgdm9pZCBzZXRMb2NhdGlvbkluZm8oYm9vbGVhbiBsb2NhdGlvbkluZm8pIHsKKyAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIDxiPkluaXRpYWxDb250ZXh0RmFjdG9yeU5hbWU8L2I+IG9wdGlvbi4KKyAgICogU2VlIHtAbGluayAjc2V0SW5pdGlhbENvbnRleHRGYWN0b3J5TmFtZX0gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKKyAgICogbWVhbmluZyBvZiB0aGlzIG9wdGlvbi4KKyAgICogKi8KKyAgcHVibGljIFN0cmluZyBnZXRJbml0aWFsQ29udGV4dEZhY3RvcnlOYW1lKCkgeworICAgIHJldHVybiBpbml0aWFsQ29udGV4dEZhY3RvcnlOYW1lOyAgICAKKyAgfQorICAKKyAgLyoqCisgICAqIFNldHRpbmcgdGhlIDxiPkluaXRpYWxDb250ZXh0RmFjdG9yeU5hbWU8L2I+IG1ldGhvZCB3aWxsIGNhdXNlCisgICAqIHRoaXMgPGNvZGU+Sk1TQXBwZW5kZXI8L2NvZGU+IGluc3RhbmNlIHRvIHVzZSB0aGUge0BsaW5rCisgICAqIEluaXRpYWxDb250ZXh0I0luaXRpYWxDb250ZXh0KEhhc2h0YWJsZSl9IG1ldGhvZCBpbnN0ZWFkIG9mIHRoZQorICAgKiBuby1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gSWYgeW91IHNldCB0aGlzIG9wdGlvbiwgeW91IHNob3VsZCBhbHNvCisgICAqIGF0IGxlYXN0IHNldCB0aGUgPGI+UHJvdmlkZXJVUkw8L2I+IG9wdGlvbi4KKyAgICogCisgICAqIDxwPlNlZSBhbHNvIHtAbGluayAjc2V0UHJvdmlkZXJVUkwoU3RyaW5nKX0uCisgICAqICovCisgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxDb250ZXh0RmFjdG9yeU5hbWUoU3RyaW5nIGluaXRpYWxDb250ZXh0RmFjdG9yeU5hbWUpIHsKKyAgICB0aGlzLmluaXRpYWxDb250ZXh0RmFjdG9yeU5hbWUgPSBpbml0aWFsQ29udGV4dEZhY3RvcnlOYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRQcm92aWRlclVSTCgpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJVUkw7ICAgIAorICB9CisKKyAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXJVUkwoU3RyaW5nIHByb3ZpZGVyVVJMKSB7CisgICAgdGhpcy5wcm92aWRlclVSTCA9IHByb3ZpZGVyVVJMOworICB9CisKKyAgU3RyaW5nIGdldFVSTFBrZ1ByZWZpeGVzKCApIHsKKyAgICByZXR1cm4gdXJsUGtnUHJlZml4ZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVUkxQa2dQcmVmaXhlcyhTdHJpbmcgdXJsUGtnUHJlZml4ZXMgKSB7CisgICAgdGhpcy51cmxQa2dQcmVmaXhlcyA9IHVybFBrZ1ByZWZpeGVzOworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIGdldFNlY3VyaXR5Q3JlZGVudGlhbHMoKSB7CisgICAgcmV0dXJuIHNlY3VyaXR5Q3JlZGVudGlhbHM7ICAgIAorICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2VjdXJpdHlDcmVkZW50aWFscyhTdHJpbmcgc2VjdXJpdHlDcmVkZW50aWFscykgeworICAgIHRoaXMuc2VjdXJpdHlDcmVkZW50aWFscyA9IHNlY3VyaXR5Q3JlZGVudGlhbHM7CisgIH0KKyAgCisgIAorICBwdWJsaWMgU3RyaW5nIGdldFNlY3VyaXR5UHJpbmNpcGFsTmFtZSgpIHsKKyAgICByZXR1cm4gc2VjdXJpdHlQcmluY2lwYWxOYW1lOyAgICAKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNlY3VyaXR5UHJpbmNpcGFsTmFtZShTdHJpbmcgc2VjdXJpdHlQcmluY2lwYWxOYW1lKSB7CisgICAgdGhpcy5zZWN1cml0eVByaW5jaXBhbE5hbWUgPSBzZWN1cml0eVByaW5jaXBhbE5hbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgeworICAgIHJldHVybiB1c2VyTmFtZTsgICAgCisgIH0KKworICAvKioKKyAgICogVGhlIHVzZXIgbmFtZSB0byB1c2Ugd2hlbiB7QGxpbmsKKyAgICogVG9waWNDb25uZWN0aW9uRmFjdG9yeSNjcmVhdGVUb3BpY0Nvbm5lY3Rpb24oU3RyaW5nLCBTdHJpbmcpCisgICAqIGNyZWF0aW5nIGEgdG9waWMgc2Vzc2lvbn0uICBJZiB5b3Ugc2V0IHRoaXMgb3B0aW9uLCB5b3Ugc2hvdWxkCisgICAqIGFsc28gc2V0IHRoZSA8Yj5QYXNzd29yZDwvYj4gb3B0aW9uLiBTZWUge0BsaW5rCisgICAqICNzZXRQYXNzd29yZChTdHJpbmcpfS4KKyAgICogKi8KKyAgcHVibGljIHZvaWQgc2V0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7CisgICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKyAgICByZXR1cm4gcGFzc3dvcmQ7ICAgIAorICB9CisKKyAgLyoqCisgICAqIFRoZSBwYXN3d29yZCB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIHRvcGljIHNlc3Npb24uICAKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgfQorCisKKyAgLyoqCisgICAgICBJZiB0cnVlLCB0aGUgaW5mb3JtYXRpb24gc2VudCB0byB0aGUgcmVtb3RlIHN1YnNjcmliZXIgd2lsbAorICAgICAgaW5jbHVkZSBjYWxsZXIncyBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gQnkgZGVmYXVsdCBubyBsb2NhdGlvbgorICAgICAgaW5mb3JtYXRpb24gaXMgc2VudCB0byB0aGUgc3Vic2NyaWJlci4gICovCisgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uSW5mbyhib29sZWFuIGxvY2F0aW9uSW5mbykgewogICAgIHRoaXMubG9jYXRpb25JbmZvID0gbG9jYXRpb25JbmZvOwogICB9CiAKIAotICBwdWJsaWMKLSAgYm9vbGVhbiByZXF1aXJlc0xheW91dCgpIHsKKyAgLyoqIAorICAgKiBUaGUgSk1TQXBwZW5kZXIgc2VuZHMgc2VyaWFsaXplZCBldmVudHMgYW5kIGNvbnNlcXVlbnRseSBkb2VzIG5vdAorICAgKiByZXF1aXJlIGEgbGF5b3V0LgorICAgKiAqLworICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0xheW91dCgpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L0pNU1NpbmsuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L0pNU1NpbmsuamF2YQppbmRleCA4NzdkZjAwLi5mNTVlNjI5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9KTVNTaW5rLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvSk1TU2luay5qYXZhCkBAIC04LDQzICs4LDgzIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoubmV0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuTG9nZ2luZ0V2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLlJlbmRlcmVyU3VwcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnNwaS5Mb2dnZXJSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoub3Iuam1zLk1lc3NhZ2VSZW5kZXJlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoueG1sLkRPTUNvbmZpZ3VyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuTG9nTG9nOwogCi1pbXBvcnQgamF2YXguam1zLio7CitpbXBvcnQgamF2YXguam1zLk1lc3NhZ2U7CitpbXBvcnQgamF2YXguam1zLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5qbXMuVG9waWNDb25uZWN0aW9uOworaW1wb3J0IGphdmF4Lmptcy5Ub3BpYzsKK2ltcG9ydCBqYXZheC5qbXMuVG9waWNDb25uZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5qbXMuVG9waWNTdWJzY3JpYmVyOworaW1wb3J0IGphdmF4Lmptcy5TZXNzaW9uOworaW1wb3J0IGphdmF4Lmptcy5Ub3BpY1Nlc3Npb247CitpbXBvcnQgamF2YXguam1zLk9iamVjdE1lc3NhZ2U7CitpbXBvcnQgamF2YXguam1zLkpNU0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIAogaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKIGltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKIGltcG9ydCBqYXZheC5uYW1pbmcuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKIC8qKgotICAgQSBzaW1wbGUgYXBwbGljYXRpb24gcmVjZWl2aW5nIHRoZSBsb2dnaW5nIGV2ZW50cyBzZW50IGJ5IGEgSk1TQXBwZW5kZXIuCisgKiBBIHNpbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGNvbnN1bWVzIGxvZ2dpbmcgZXZlbnRzIHNlbnQgYnkgYSB7QGxpbmsKKyAqIEpNU0FwcGVuZGVyfS4KKyAqCisgKgorICogQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOyAKKyAqICovCitwdWJsaWMgY2xhc3MgSk1TU2luayBpbXBsZW1lbnRzIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIgewogCisgIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihKTVNTaW5rLmNsYXNzKTsKIAotICAgQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOwotKi8KLXB1YmxpYyBjbGFzcyBKTVNTaW5rICB7Ci0KLSAgc3RhdGljIHB1YmxpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIGlmKGFyZ3MubGVuZ3RoICE9IDMpIHsKKyAgc3RhdGljIHB1YmxpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaWYoYXJncy5sZW5ndGggIT0gNSkgewogICAgICAgdXNhZ2UoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMuIik7CiAgICAgfQotCisgICAgCiAgICAgU3RyaW5nIHRjZkJpbmRpbmdOYW1lID0gYXJnc1swXTsKICAgICBTdHJpbmcgdG9waWNCaW5kaW5nTmFtZSA9IGFyZ3NbMV07Ci0gICAgUHJvcGVydHlDb25maWd1cmF0b3IuY29uZmlndXJlKGFyZ3NbMl0pOworICAgIFN0cmluZyB1c2VybmFtZSA9IGFyZ3NbMl07CisgICAgU3RyaW5nIHBhc3N3b3JkID0gYXJnc1szXTsKKyAgICAKKyAgICAKKyAgICBTdHJpbmcgY29uZmlnRmlsZSA9IGFyZ3NbNF07CiAKLSAgICBMb2dnZXJSZXBvc2l0b3J5IHJlcCA9IExvZ01hbmFnZXIuZ2V0TG9nZ2VyUmVwb3NpdG9yeSgpOwotICAgIGlmKHJlcCBpbnN0YW5jZW9mIFJlbmRlcmVyU3VwcG9ydCkgewotICAgICAgKChSZW5kZXJlclN1cHBvcnQpIHJlcCkuc2V0UmVuZGVyZXIoTWVzc2FnZS5jbGFzcywgbmV3IE1lc3NhZ2VSZW5kZXJlcigpKTsKKyAgICBpZihjb25maWdGaWxlLmVuZHNXaXRoKCIueG1sIikpIHsKKyAgICAgIG5ldyBET01Db25maWd1cmF0b3IoKS5jb25maWd1cmUoY29uZmlnRmlsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5ldyBQcm9wZXJ0eUNvbmZpZ3VyYXRvcigpLmNvbmZpZ3VyZShjb25maWdGaWxlKTsKICAgICB9CisgICAgCisgICAgbmV3IEpNU1NpbmsodGNmQmluZGluZ05hbWUsIHRvcGljQmluZGluZ05hbWUsIHVzZXJuYW1lLCBwYXNzd29yZCk7CiAKKyAgICBCdWZmZXJlZFJlYWRlciBzdGRpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSk7CisgICAgLy8gTG9vcCB1bnRpbCB0aGUgd29yZCAiZXhpdCIgaXMgdHlwZWQKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGUgXCJleGl0XCIgdG8gcXVpdCBKTVNTaW5rLiIpOworICAgIHdoaWxlKHRydWUpeworICAgICAgU3RyaW5nIHMgPSBzdGRpbi5yZWFkTGluZSggKTsKKyAgICAgIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UoImV4aXQiKSkgeworCVN5c3RlbS5vdXQucHJpbnRsbigiRXhpdGluZy4gS2lsbCB0aGUgYXBwbGljYXRpb24gaWYgaXQgZG9lcyBub3QgZXhpdCAiCisJCQkgICArICJkdWUgdG8gZGFlbW9uIHRocmVhZHMuIik7CisJcmV0dXJuOyAKKyAgICAgIH0KKyAgICB9IAorICB9CisKKyAgcHVibGljIEpNU1NpbmsoIFN0cmluZyB0Y2ZCaW5kaW5nTmFtZSwgU3RyaW5nIHRvcGljQmluZGluZ05hbWUsIFN0cmluZyB1c2VybmFtZSwKKwkJICBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAKICAgICB0cnkgewogICAgICAgQ29udGV4dCBjdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKICAgICAgIFRvcGljQ29ubmVjdGlvbkZhY3RvcnkgdG9waWNDb25uZWN0aW9uRmFjdG9yeTsKQEAgLTUyLDcgKzkyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZkJpbmRpbmdOYW1lKTsKIAogICAgICAgVG9waWNDb25uZWN0aW9uIHRvcGljQ29ubmVjdGlvbiA9Ci0JICAgICAgICAgICAgICAgICAgICAgICAgdG9waWNDb25uZWN0aW9uRmFjdG9yeS5jcmVhdGVUb3BpY0Nvbm5lY3Rpb24oKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICB0b3BpY0Nvbm5lY3Rpb25GYWN0b3J5LmNyZWF0ZVRvcGljQ29ubmVjdGlvbih1c2VybmFtZSwKKwkJCQkJCQkJCSAgICAgcGFzc3dvcmQpOwogICAgICAgdG9waWNDb25uZWN0aW9uLnN0YXJ0KCk7CiAKICAgICAgIFRvcGljU2Vzc2lvbiB0b3BpY1Nlc3Npb24gPSB0b3BpY0Nvbm5lY3Rpb24uY3JlYXRlVG9waWNTZXNzaW9uKGZhbHNlLApAQCAtNjAsNDcgKzEwMSw0OSBAQAogCiAgICAgICBUb3BpYyB0b3BpYyA9IChUb3BpYyljdHgubG9va3VwKHRvcGljQmluZGluZ05hbWUpOwogCi0gICAgICAvL1RvcGljU3Vic2NyaWJlciB0b3BpY1N1YnNjcmliZXIgPSB0b3BpY1Nlc3Npb24uY3JlYXRlU3Vic2NyaWJlcih0b3BpYyk7Ci0gICAgICBUb3BpY1N1YnNjcmliZXIgdG9waWNTdWJzY3JpYmVyID0KLSAgICAgICAgICAgdG9waWNTZXNzaW9uLmNyZWF0ZUR1cmFibGVTdWJzY3JpYmVyKHRvcGljLCAieCIpOworICAgICAgVG9waWNTdWJzY3JpYmVyIHRvcGljU3Vic2NyaWJlciA9IHRvcGljU2Vzc2lvbi5jcmVhdGVTdWJzY3JpYmVyKHRvcGljKTsKKyAgICAKKyAgICAgIHRvcGljU3Vic2NyaWJlci5zZXRNZXNzYWdlTGlzdGVuZXIodGhpcyk7CiAKLQotICAgICAgTG9nZ2luZ0V2ZW50IGV2ZW50OwotICAgICAgQ2F0ZWdvcnkgcmVtb3RlQ2F0ZWdvcnk7Ci0KLSAgICAgIHdoaWxlKHRydWUpIHsKLQlPYmplY3RNZXNzYWdlIG1zZyA9IChPYmplY3RNZXNzYWdlKXRvcGljU3Vic2NyaWJlci5yZWNlaXZlKCk7Ci0JZXZlbnQgPSAoTG9nZ2luZ0V2ZW50KSBtc2cuZ2V0T2JqZWN0KCk7Ci0JcmVtb3RlQ2F0ZWdvcnkgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShldmVudC5jYXRlZ29yeU5hbWUpOwotCXJlbW90ZUNhdGVnb3J5LmNhbGxBcHBlbmRlcnMoZXZlbnQpOwotCi0JLy8gZHVtcCB0aGUgSk1TTWVzc2FnZQotCS8vIHJlbW90ZUNhdGVnb3J5LmRlYnVnKG1zZyk7Ci0KLSAgICAgIH0KICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBMb2dMb2cuZXJyb3IoIkNvdWxkIG5vdCByZWFkIEpNUyBtZXNzYWdlLiIsIGUpOworICAgICAgbG9nZ2VyLmVycm9yKCJDb3VsZCBub3QgcmVhZCBKTVMgbWVzc2FnZS4iLCBlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBvbk1lc3NhZ2UoamF2YXguam1zLk1lc3NhZ2UgbWVzc2FnZSkgeworICAgIExvZ2dpbmdFdmVudCBldmVudDsKKyAgICBMb2dnZXIgcmVtb3RlTG9nZ2VyOworCisgICAgdHJ5IHsKKyAgICAgIGlmKG1lc3NhZ2UgaW5zdGFuY2VvZiAgT2JqZWN0TWVzc2FnZSkgeworCU9iamVjdE1lc3NhZ2Ugb2JqZWN0TWVzc2FnZSA9IChPYmplY3RNZXNzYWdlKSBtZXNzYWdlOworCWV2ZW50ID0gKExvZ2dpbmdFdmVudCkgb2JqZWN0TWVzc2FnZS5nZXRPYmplY3QoKTsKKwlyZW1vdGVMb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGV2ZW50LmdldExvZ2dlck5hbWUoKSk7CisJcmVtb3RlTG9nZ2VyLmNhbGxBcHBlbmRlcnMoZXZlbnQpOworICAgICAgfSBlbHNlIHsKKwlsb2dnZXIud2FybigiUmVjZWl2ZWQgbWVzc2FnZSBpcyBvZiB0eXBlICIrbWVzc2FnZS5nZXRKTVNUeXBlKCkKKwkJICAgICsiLCB3YXMgZXhwZWN0aW5nIE9iamVjdE1lc3NhZ2UuIik7CisgICAgICB9ICAgICAgCisgICAgfSBjYXRjaChKTVNFeGNlcHRpb24gam1zZSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gdGhyb3duIHdoaWxlIHByb2Nlc3NpbmcgaW5jb21pbmcgbWVzc2FnZS4iLCAKKwkJICAgam1zZSk7CiAgICAgfQogICB9CiAKIAotICBwcm90ZWN0ZWQKLSAgc3RhdGljCi0gIE9iamVjdCBsb29rdXAoQ29udGV4dCBjdHgsIFN0cmluZyBuYW1lKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgbG9va3VwKENvbnRleHQgY3R4LCBTdHJpbmcgbmFtZSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKICAgICAgIHJldHVybiBjdHgubG9va3VwKG5hbWUpOwogICAgIH0gY2F0Y2goTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ0xvZy5lcnJvcigiQ291bGQgbm90IGZpbmQgbmFtZSBbIituYW1lKyJdLiIpOworICAgICAgbG9nZ2VyLmVycm9yKCJDb3VsZCBub3QgZmluZCBuYW1lIFsiK25hbWUrIl0uIik7CiAgICAgICB0aHJvdyBlOwogICAgIH0KICAgfQogCi0KLSAgc3RhdGljCi0gIHZvaWQgdXNhZ2UoU3RyaW5nIG1zZykgeworICBzdGF0aWMgdm9pZCB1c2FnZShTdHJpbmcgbXNnKSB7CiAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CiAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogamF2YSAiICsgSk1TU2luay5jbGFzcy5nZXROYW1lKCkKLSAgICAgICAgICAgICsgIiBUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5QmluZGluZ05hbWUgVG9waWNCaW5kaW5nTmFtZSBjb25maWdGaWxlIik7CisgICAgICAgICAgICArICIgVG9waWNDb25uZWN0aW9uRmFjdG9yeUJpbmRpbmdOYW1lIFRvcGljQmluZGluZ05hbWUgdXNlcm5hbWUgcGFzc3dvcmQgY29uZmlnRmlsZSIpOwogICAgIFN5c3RlbS5leGl0KDEpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9TTVRQQXBwZW5kZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NNVFBBcHBlbmRlci5qYXZhCmluZGV4IGJjYTdhY2EuLjgwMzgyNGYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NNVFBBcHBlbmRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NNVFBBcHBlbmRlci5qYXZhCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuICAqLworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLm5ldDsKIApAQCAtMzg2LDYgKzM4Niw2IEBACiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4gKi8KICAgcHVibGljCiAgIGJvb2xlYW4gaXNUcmlnZ2VyaW5nRXZlbnQoTG9nZ2luZ0V2ZW50IGV2ZW50KSB7Ci0gICAgcmV0dXJuIGV2ZW50LmxldmVsLmlzR3JlYXRlck9yRXF1YWwoTGV2ZWwuRVJST1IpOworICAgIHJldHVybiBldmVudC5nZXRMZXZlbCgpLmlzR3JlYXRlck9yRXF1YWwoTGV2ZWwuRVJST1IpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9TaW1wbGVTb2NrZXRTZXJ2ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NpbXBsZVNvY2tldFNlcnZlci5qYXZhCmluZGV4IGY4Y2EzODIuLjJmZGRmMDYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NpbXBsZVNvY2tldFNlcnZlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NpbXBsZVNvY2tldFNlcnZlci5qYXZhCkBAIC0zLDQ3ICszLDQ5IEBACiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKICAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS5BUEwgZmlsZS4gICovCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoubmV0OwogCiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJvcGVydHlDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai54bWwuRE9NQ29uZmlndXJhdG9yOwogCiAKIC8qKgotICAgQSBzaW1wbGUge0BsaW5rIFNvY2tldE5vZGV9IGJhc2VkIHNlcnZlci4KLQorICogIEEgc2ltcGxlIHtAbGluayBTb2NrZXROb2RlfSBiYXNlZCBzZXJ2ZXIuCisgKgogICAgPHByZT4KLSAgICAgPGI+VXNhZ2U6PC9iPiBqYXZhIG9yZy5hcGFjaGUubG9nNGoubmV0LlNpbXBsZVNvY2tldFNlcnZlciBwb3J0IGNvbmZpZ0ZpbGUKKyAgIDxiPlVzYWdlOjwvYj4gamF2YSBvcmcuYXBhY2hlLmxvZzRqLm5ldC5TaW1wbGVTb2NrZXRTZXJ2ZXIgcG9ydCBjb25maWdGaWxlCiAKLSAgICAgd2hlcmUgPGVtPnBvcnQ8L2VtPiBpcyBhIHBhcnQgbnVtYmVyIHdoZXJlIHRoZSBzZXJ2ZXIgbGlzdGVucyBhbmQKLSAgICAgPGVtPmNvbmZpZ0ZpbGU8L2VtPiBpcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBmZWQgdG8gdGhlIHtAbGluawotICAgICBQcm9wZXJ0eUNvbmZpZ3VyYXRvcn0uCisgICB3aGVyZSA8ZW0+cG9ydDwvZW0+IGlzIGEgcGFydCBudW1iZXIgd2hlcmUgdGhlIHNlcnZlciBsaXN0ZW5zIGFuZAorICAgPGVtPmNvbmZpZ0ZpbGU8L2VtPiBpcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBmZWQgdG8gdGhlIHtAbGluaworICAgUHJvcGVydHlDb25maWd1cmF0b3J9IG9yIHRvIHtAbGluayBET01Db25maWd1cmF0b3J9IGlmIGFuIFhNTCBmaWxlLgogICAgPC9wcmU+Ci0KLSAgICBAYXV0aG9yICBDZWtpIEcmdXVtbDtsYyZ1dW1sOwotCi0gICAgQHNpbmNlIDAuOC40ICovCi0KKyAgKgorICAqIEBhdXRob3IgIENla2kgRyZ1dW1sO2xjJnV1bWw7CisgICoKKyAgKiAgQHNpbmNlIDAuOC40IAorICAqICovCiBwdWJsaWMgY2xhc3MgU2ltcGxlU29ja2V0U2VydmVyICB7CiAKLSAgc3RhdGljIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKFNpbXBsZVNvY2tldFNlcnZlci5jbGFzcy5nZXROYW1lKCkpOworICBzdGF0aWMgTG9nZ2VyIGNhdCA9IExvZ2dlci5nZXRMb2dnZXIoU2ltcGxlU29ja2V0U2VydmVyLmNsYXNzKTsKIAogICBzdGF0aWMgaW50IHBvcnQ7CiAKICAgcHVibGljCiAgIHN0YXRpYwogICB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIGlmKGFyZ3YubGVuZ3RoID09IDIpCisgICAgaWYoYXJndi5sZW5ndGggPT0gMikgewogICAgICAgaW5pdChhcmd2WzBdLCBhcmd2WzFdKTsKLSAgICBlbHNlCisgICAgfSBlbHNlIHsKICAgICAgIHVzYWdlKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLiIpOwotCisgICAgfQorICAgIAogICAgIHRyeSB7CiAgICAgICBjYXQuaW5mbygiTGlzdGVuaW5nIG9uIHBvcnQgIiArIHBvcnQpOwogICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCk7CkBAIC01NSwzMCArNTcsMzEgQEAKIAluZXcgVGhyZWFkKG5ldyBTb2NrZXROb2RlKHNvY2tldCwKIAkJCQkgIExvZ01hbmFnZXIuZ2V0TG9nZ2VyUmVwb3NpdG9yeSgpKSkuc3RhcnQoKTsKICAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgIH0KICAgfQogCiAKLSAgc3RhdGljCi0gIHZvaWQgIHVzYWdlKFN0cmluZyBtc2cpIHsKKyAgc3RhdGljIHZvaWQgIHVzYWdlKFN0cmluZyBtc2cpIHsKICAgICBTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAgICAgICAiVXNhZ2U6IGphdmEgIiArU2ltcGxlU29ja2V0U2VydmVyLmNsYXNzLmdldE5hbWUoKSArICIgcG9ydCBjb25maWdGaWxlIik7CiAgICAgU3lzdGVtLmV4aXQoMSk7CiAgIH0KIAotICBzdGF0aWMKLSAgdm9pZCBpbml0KFN0cmluZyBwb3J0U3RyLCBTdHJpbmcgY29uZmlnRmlsZSkgeworICBzdGF0aWMgdm9pZCBpbml0KFN0cmluZyBwb3J0U3RyLCBTdHJpbmcgY29uZmlnRmlsZSkgewogICAgIHRyeSB7CiAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChwb3J0U3RyKTsKLSAgICB9Ci0gICAgY2F0Y2goamF2YS5sYW5nLk51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgfSBjYXRjaChqYXZhLmxhbmcuTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICB1c2FnZSgiQ291bGQgbm90IGludGVycHJldCBwb3J0IG51bWJlciBbIisgcG9ydFN0ciArIl0uIik7CiAgICAgfQotICAgIFByb3BlcnR5Q29uZmlndXJhdG9yLmNvbmZpZ3VyZShjb25maWdGaWxlKTsKKyAgIAorICAgIGlmKGNvbmZpZ0ZpbGUuZW5kc1dpdGgoIi54bWwiKSkgeworICAgICAgbmV3IERPTUNvbmZpZ3VyYXRvcigpLmNvbmZpZ3VyZShjb25maWdGaWxlKTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3IFByb3BlcnR5Q29uZmlndXJhdG9yKCkuY29uZmlndXJlKGNvbmZpZ0ZpbGUpOworICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0QXBwZW5kZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NvY2tldEFwcGVuZGVyLmphdmEKaW5kZXggNmI5MWJlYS4uZGRiNDE0NSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0QXBwZW5kZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9Tb2NrZXRBcHBlbmRlci5qYXZhCkBAIC0xMjgsOCArMTI4LDcgQEAKICAgLyoqCiAgICAgIENvbm5lY3RzIHRvIHJlbW90ZSBzZXJ2ZXIgYXQgPGNvZGU+YWRkcmVzczwvY29kZT4gYW5kIDxjb2RlPnBvcnQ8L2NvZGU+LgogICAqLwotICBwdWJsaWMKLSAgU29ja2V0QXBwZW5kZXIoSW5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQpIHsKKyAgcHVibGljIFNvY2tldEFwcGVuZGVyKEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSB7CiAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKICAgICB0aGlzLnJlbW90ZUhvc3QgPSBhZGRyZXNzLmdldEhvc3ROYW1lKCk7CiAgICAgdGhpcy5wb3J0ID0gcG9ydDsKQEAgLTEzOSw4ICsxMzgsNyBAQAogICAvKioKICAgICAgQ29ubmVjdHMgdG8gcmVtb3RlIHNlcnZlciBhdCA8Y29kZT5ob3N0PC9jb2RlPiBhbmQgPGNvZGU+cG9ydDwvY29kZT4uCiAgICovCi0gIHB1YmxpYwotICBTb2NrZXRBcHBlbmRlcihTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKKyAgcHVibGljIFNvY2tldEFwcGVuZGVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewogICAgIHRoaXMucG9ydCA9IHBvcnQ7CiAgICAgdGhpcy5hZGRyZXNzID0gZ2V0QWRkcmVzc0J5TmFtZShob3N0KTsKICAgICB0aGlzLnJlbW90ZUhvc3QgPSBob3N0OwpAQCAtMTUwLDE5ICsxNDgsMTcgQEAKICAgLyoqCiAgICAgIENvbm5lY3QgdG8gdGhlIHNwZWNpZmllZCA8Yj5SZW1vdGVIb3N0PC9iPiBhbmQgPGI+UG9ydDwvYj4uCiAgICovCi0gIHB1YmxpYwotICB2b2lkIGFjdGl2YXRlT3B0aW9ucygpIHsKKyAgcHVibGljIHZvaWQgYWN0aXZhdGVPcHRpb25zKCkgewogICAgIGNvbm5lY3QoYWRkcmVzcywgcG9ydCk7CiAgIH0KIAogICAvKioKLSAgICAgQ2xvc2UgdGhpcyBhcHBlbmRlci4KLSAgICAgPHA+VGhpcyB3aWxsIG1hcmsgdGhlIGFwcGVuZGVyIGFzIGNsb3NlZCBhbmQKLSAgICAgY2FsbCB0aGVuIHtAbGluayAjY2xlYW5VcH0gbWV0aG9kLgotICAqLwotICBzeW5jaHJvbml6ZWQKLSAgcHVibGljCi0gIHZvaWQgY2xvc2UoKSB7CisgICAqIENsb3NlIHRoaXMgYXBwZW5kZXIuICAKKyAgICoKKyAgICogPHA+VGhpcyB3aWxsIG1hcmsgdGhlIGFwcGVuZGVyIGFzIGNsb3NlZCBhbmQgY2FsbCB0aGVuIHtAbGluaworICAgKiAjY2xlYW5VcH0gbWV0aG9kLgorICAgKiAqLworICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgaWYoY2xvc2VkKQogICAgICAgcmV0dXJuOwogCkBAIC0xNzEsMTYgKzE2NywxNCBAQAogICB9CiAKICAgLyoqCi0gICAgIERyb3AgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBob3N0IGFuZCByZWxlYXNlIHRoZSB1bmRlcmx5aW5nCi0gICAgIGNvbm5lY3RvciB0aHJlYWQgaWYgaXQgaGFzIGJlZW4gY3JlYXRlZAotICAgKi8KLSAgcHVibGljCi0gIHZvaWQgY2xlYW5VcCgpIHsKKyAgICogRHJvcCB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGhvc3QgYW5kIHJlbGVhc2UgdGhlIHVuZGVybHlpbmcKKyAgICogY29ubmVjdG9yIHRocmVhZCBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkIAorICAgKiAqLworICBwdWJsaWMgdm9pZCBjbGVhblVwKCkgewogICAgIGlmKG9vcyAhPSBudWxsKSB7CiAgICAgICB0cnkgewogCW9vcy5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CiAJTG9nTG9nLmVycm9yKCJDb3VsZCBub3QgY2xvc2Ugb29zLiIsIGUpOwogICAgICAgfQogICAgICAgb29zID0gbnVsbDsKQEAgLTE5OSwxNyArMTkzLDIwIEBACiAgICAgICAvLyBGaXJzdCwgY2xvc2UgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24gaWYgYW55LgogICAgICAgY2xlYW5VcCgpOwogICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgU29ja2V0KGFkZHJlc3MsIHBvcnQpLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICB9Ci0gICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgewotICAgICAgTG9nTG9nLmVycm9yKCJDb3VsZCBub3QgY29ubmVjdCB0byByZW1vdGUgbG9nNGogc2VydmVyIGF0IFsiCi0JCSAgICthZGRyZXNzLmdldEhvc3ROYW1lKCkrIl0uIFdlIHdpbGwgdHJ5IGFnYWluIGxhdGVyLiIsIGUpOwotICAgICAgZmlyZUNvbm5lY3RvcigpOworICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCisgICAgICBTdHJpbmcgbXNnID0gIkNvdWxkIG5vdCBjb25uZWN0IHRvIHJlbW90ZSBsb2c0aiBzZXJ2ZXIgYXQgWyIKKwkrYWRkcmVzcy5nZXRIb3N0TmFtZSgpKyJdLiI7CisgICAgICBpZihyZWNvbm5lY3Rpb25EZWxheSA+IDApIHsKKyAgICAgICAgbXNnICs9ICIgV2Ugd2lsbCB0cnkgYWdhaW4gbGF0ZXIuIjsKKwlmaXJlQ29ubmVjdG9yKCk7IC8vIGZpcmUgdGhlIGNvbm5lY3RvciB0aHJlYWQKKyAgICAgIH0gCisgICAgICBMb2dMb2cuZXJyb3IobXNnLCBlKTsKICAgICB9CiAgIH0KIAogCi0gIHB1YmxpYwotICB2b2lkIGFwcGVuZChMb2dnaW5nRXZlbnQgZXZlbnQpIHsKKyAgcHVibGljIHZvaWQgYXBwZW5kKExvZ2dpbmdFdmVudCBldmVudCkgewogICAgIGlmKGV2ZW50ID09IG51bGwpCiAgICAgICByZXR1cm47CiAKQEAgLTIzNCw4ICsyMzEsNyBAQAogCSAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRvaW5nIG9vcy5yZXNldCgpIik7CiAJICBvb3MucmVzZXQoKTsKIAl9Ci0gICAgICB9Ci0gICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKIAlvb3MgPSBudWxsOwogCUxvZ0xvZy53YXJuKCJEZXRlY3RlZCBwcm9ibGVtIHdpdGggY29ubmVjdGlvbjogIitlKTsKIAlpZihyZWNvbm5lY3Rpb25EZWxheSA+IDApIHsKQEAgLTI1OSwyOCArMjU1LDI2IEBACiAgIEluZXRBZGRyZXNzIGdldEFkZHJlc3NCeU5hbWUoU3RyaW5nIGhvc3QpIHsKICAgICB0cnkgewogICAgICAgcmV0dXJuIEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0KTsKLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBMb2dMb2cuZXJyb3IoIkNvdWxkIG5vdCBmaW5kIGFkZHJlc3Mgb2YgWyIraG9zdCsiXS4iLCBlKTsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgfQogCiAgIC8qKgotICAgICBUaGUgU29ja2V0QXBwZW5kZXIgZG9lcyBub3QgdXNlIGEgbGF5b3V0LiBIZW5jZSwgdGhpcyBtZXRob2QgcmV0dXJucwotICAgICA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICovCi0gIHB1YmxpYwotICBib29sZWFuIHJlcXVpcmVzTGF5b3V0KCkgeworICAgKiBUaGUgU29ja2V0QXBwZW5kZXIgZG9lcyBub3QgdXNlIGEgbGF5b3V0LiBIZW5jZSwgdGhpcyBtZXRob2QKKyAgICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uICAKKyAgICogKi8KKyAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNMYXlvdXQoKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKICAgLyoqCi0gICAgIFRoZSA8Yj5SZW1vdGVIb3N0PC9iPiBvcHRpb24gdGFrZXMgYSBzdHJpbmcgdmFsdWUgd2hpY2ggc2hvdWxkIGJlCi0gICAgIHRoZSBob3N0IG5hbWUgb2YgdGhlIHNlcnZlciB3aGVyZSBhIHtAbGluayBTb2NrZXROb2RlfSBpcyBydW5uaW5nLgotICAgKi8KLSAgcHVibGljCi0gIHZvaWQgc2V0UmVtb3RlSG9zdChTdHJpbmcgaG9zdCkgeworICAgKiBUaGUgPGI+UmVtb3RlSG9zdDwvYj4gb3B0aW9uIHRha2VzIGEgc3RyaW5nIHZhbHVlIHdoaWNoIHNob3VsZCBiZQorICAgKiB0aGUgaG9zdCBuYW1lIG9mIHRoZSBzZXJ2ZXIgd2hlcmUgYSB7QGxpbmsgU29ja2V0Tm9kZX0gaXMKKyAgICogcnVubmluZy4KKyAgICogKi8KKyAgcHVibGljIHZvaWQgc2V0UmVtb3RlSG9zdChTdHJpbmcgaG9zdCkgewogICAgIGFkZHJlc3MgPSBnZXRBZGRyZXNzQnlOYW1lKGhvc3QpOwogICAgIHJlbW90ZUhvc3QgPSBob3N0OwogICB9CkBAIC0yODgsOCArMjgyLDcgQEAKICAgLyoqCiAgICAgIFJldHVybnMgdmFsdWUgb2YgdGhlIDxiPlJlbW90ZUhvc3Q8L2I+IG9wdGlvbi4KICAgICovCi0gIHB1YmxpYwotICBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsKKyAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgewogICAgIHJldHVybiByZW1vdGVIb3N0OwogICB9CiAKQEAgLTI5NywxNiArMjkwLDE0IEBACiAgICAgIFRoZSA8Yj5Qb3J0PC9iPiBvcHRpb24gdGFrZXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGluZwogICAgICB0aGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIGlzIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb25zLgogICAgKi8KLSAgcHVibGljCi0gIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7CiAgICAgdGhpcy5wb3J0ID0gcG9ydDsKICAgfQogCiAgIC8qKgogICAgICBSZXR1cm5zIHZhbHVlIG9mIHRoZSA8Yj5Qb3J0PC9iPiBvcHRpb24uCiAgICAqLwotICBwdWJsaWMKLSAgaW50IGdldFBvcnQoKSB7CisgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKICAgICByZXR1cm4gcG9ydDsKICAgfQogCkBAIC0zMTUsMTYgKzMwNiwxNCBAQAogICAgICB0aGUgaW5mb3JtYXRpb24gc2VudCB0byB0aGUgcmVtb3RlIGhvc3Qgd2lsbCBpbmNsdWRlIGxvY2F0aW9uCiAgICAgIGluZm9ybWF0aW9uLiBCeSBkZWZhdWx0IG5vIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIHNlbnQgdG8gdGhlIHNlcnZlci4KICAgICovCi0gIHB1YmxpYwotICB2b2lkIHNldExvY2F0aW9uSW5mbyhib29sZWFuIGxvY2F0aW9uSW5mbykgeworICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbkluZm8oYm9vbGVhbiBsb2NhdGlvbkluZm8pIHsKICAgICB0aGlzLmxvY2F0aW9uSW5mbyA9IGxvY2F0aW9uSW5mbzsKICAgfQogCiAgIC8qKgogICAgICBSZXR1cm5zIHZhbHVlIG9mIHRoZSA8Yj5Mb2NhdGlvbkluZm88L2I+IG9wdGlvbi4KICAgICovCi0gIHB1YmxpYwotICBib29sZWFuIGdldExvY2F0aW9uSW5mbygpIHsKKyAgcHVibGljIGJvb2xlYW4gZ2V0TG9jYXRpb25JbmZvKCkgewogICAgIHJldHVybiBsb2NhdGlvbkluZm87CiAgIH0KIApAQCAtMzM3LDE2ICszMjYsMTQgQEAKICAgICAgPHA+U2V0dGluZyB0aGlzIG9wdGlvbiB0byB6ZXJvIHR1cm5zIG9mZiByZWNvbm5lY3Rpb24KICAgICAgY2FwYWJpbGl0eS4KICAgICovCi0gIHB1YmxpYwotICB2b2lkIHNldFJlY29ubmVjdGlvbkRlbGF5KGludCBkZWxheSkgeworICBwdWJsaWMgdm9pZCBzZXRSZWNvbm5lY3Rpb25EZWxheShpbnQgZGVsYXkpIHsKICAgICB0aGlzLnJlY29ubmVjdGlvbkRlbGF5ID0gZGVsYXk7CiAgIH0KIAogICAvKioKICAgICAgUmV0dXJucyB2YWx1ZSBvZiB0aGUgPGI+UmVjb25uZWN0aW9uRGVsYXk8L2I+IG9wdGlvbi4KICAgICovCi0gIHB1YmxpYwotICBpbnQgZ2V0UmVjb25uZWN0aW9uRGVsYXkoKSB7CisgIHB1YmxpYyBpbnQgZ2V0UmVjb25uZWN0aW9uRGVsYXkoKSB7CiAgICAgcmV0dXJuIHJlY29ubmVjdGlvbkRlbGF5OwogICB9CiAKQEAgLTM3NywxOCArMzY0LDE2IEBACiAJICBzeW5jaHJvbml6ZWQodGhpcykgewogCSAgICBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7CiAJICAgIGNvbm5lY3RvciA9IG51bGw7CisJICAgIExvZ0xvZy5kZWJ1ZygiQ29ubmVjdGlvbiBlc3RhYmxpc2hlZC4gRXhpdGluZyBjb25uZWN0b3IgdGhyZWFkLiIpOwogCSAgICBicmVhazsKIAkgIH0KLQl9Ci0JY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogCSAgTG9nTG9nLmRlYnVnKCJDb25uZWN0b3IgaW50ZXJydXB0ZWQuIExlYXZpbmcgbG9vcC4iKTsKIAkgIHJldHVybjsKLQl9Ci0JY2F0Y2goamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBlKSB7CisJfSBjYXRjaChqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGUpIHsKIAkgIExvZ0xvZy5kZWJ1ZygiUmVtb3RlIGhvc3QgIithZGRyZXNzLmdldEhvc3ROYW1lKCkKIAkJICAgICAgICsiIHJlZnVzZWQgY29ubmVjdGlvbi4iKTsKLQl9Ci0JY2F0Y2goSU9FeGNlcHRpb24gZSkgeworCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewogCSAgTG9nTG9nLmRlYnVnKCJDb3VsZCBub3QgY29ubmVjdCB0byAiICsgYWRkcmVzcy5nZXRIb3N0TmFtZSgpKwogCQkgICAgICAgIi4gRXhjZXB0aW9uIGlzICIgKyBlKTsKIAl9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9Tb2NrZXROb2RlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9Tb2NrZXROb2RlLmphdmEKaW5kZXggNGJjYmQ4Mi4uOTgxNjg5YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0Tm9kZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NvY2tldE5vZGUuamF2YQpAQCAtMzksOCArMzksNyBAQAogCiAgIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihTb2NrZXROb2RlLmNsYXNzKTsKIAotICBwdWJsaWMKLSAgU29ja2V0Tm9kZShTb2NrZXQgc29ja2V0LCBMb2dnZXJSZXBvc2l0b3J5IGhpZXJhcmNoeSkgeworICBwdWJsaWMgU29ja2V0Tm9kZShTb2NrZXQgc29ja2V0LCBMb2dnZXJSZXBvc2l0b3J5IGhpZXJhcmNoeSkgewogICAgIHRoaXMuc29ja2V0ID0gc29ja2V0OwogICAgIHRoaXMuaGllcmFyY2h5ID0gaGllcmFyY2h5OwogICAgIHRyeSB7CkBAIC02NCwxNSArNjMsMTggQEAKIAogICAgIHRyeSB7CiAgICAgICB3aGlsZSh0cnVlKSB7CisJLy8gcmVhZCBhbiBldmVudCBmcm9tIHRoZSB3aXJlCiAJZXZlbnQgPSAoTG9nZ2luZ0V2ZW50KSBvaXMucmVhZE9iamVjdCgpOwotCXJlbW90ZUxvZ2dlciA9IGhpZXJhcmNoeS5nZXRMb2dnZXIoZXZlbnQuY2F0ZWdvcnlOYW1lKTsKLQlldmVudC5sb2dnZXIgPSByZW1vdGVMb2dnZXI7Ci0JaWYoZXZlbnQubGV2ZWwuaXNHcmVhdGVyT3JFcXVhbChyZW1vdGVMb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSkpIHsKKwkvLyBnZXQgYSBsb2dnZXIgZnJvbSB0aGUgaGllcmFyY2h5LiBUaGUgbmFtZSBvZiB0aGUgbG9nZ2VyIGlzIHRha2VuIHRvIGJlIHRoZSBuYW1lIGNvbnRhaW5lZCBpbiB0aGUgZXZlbnQuCisJcmVtb3RlTG9nZ2VyID0gaGllcmFyY2h5LmdldExvZ2dlcihldmVudC5nZXRMb2dnZXJOYW1lKCkpOworCS8vZXZlbnQubG9nZ2VyID0gcmVtb3RlTG9nZ2VyOworCS8vIGFwcGx5IHRoZSBsb2dnZXItbGV2ZWwgZmlsdGVyCisJaWYoZXZlbnQuZ2V0TGV2ZWwoKS5pc0dyZWF0ZXJPckVxdWFsKHJlbW90ZUxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpKSkgeworCSAgLy8gZmluYWxseSBsb2cgdGhlIGV2ZW50IGFzIGlmIHdhcyBnZW5lcmF0ZWQgbG9jYWxseQogCSAgcmVtb3RlTG9nZ2VyLmNhbGxBcHBlbmRlcnMoZXZlbnQpOwogCX0KICAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goamF2YS5pby5FT0ZFeGNlcHRpb24gZSkgeworICAgIH0gY2F0Y2goamF2YS5pby5FT0ZFeGNlcHRpb24gZSkgewogICAgICAgbG9nZ2VyLmluZm8oIkNhdWdodCBqYXZhLmlvLkVPRkV4Y2VwdGlvbiBjbG9zaW5nIGNvbm5lY2l0b24uIik7CiAgICAgfSBjYXRjaChqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24gZSkgewogICAgICAgbG9nZ2VyLmluZm8oIkNhdWdodCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24gY2xvc2luZyBjb25uZWNpdG9uLiIpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0U2VydmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9Tb2NrZXRTZXJ2ZXIuamF2YQppbmRleCA0MTI3MjU4Li5iM2Y0ZDc1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9Tb2NrZXRTZXJ2ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9Tb2NrZXRTZXJ2ZXIuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogICBzdGF0aWMgU3RyaW5nIEdFTkVSSUMgPSAiZ2VuZXJpYyI7CiAgIHN0YXRpYyBTdHJpbmcgQ09ORklHX0ZJTEVfRVhUID0gIi5sY2YiOwogCi0gIHN0YXRpYyBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShTb2NrZXRTZXJ2ZXIuY2xhc3MpOworICBzdGF0aWMgTG9nZ2VyIGNhdCA9IExvZ2dlci5nZXRMb2dnZXIoU29ja2V0U2VydmVyLmNsYXNzKTsKICAgc3RhdGljIFNvY2tldFNlcnZlciBzZXJ2ZXI7CiAgIHN0YXRpYyBpbnQgcG9ydDsKIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAKICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGRpciwga2V5K0NPTkZJR19GSUxFX0VYVCk7CiAgICAgICBpZihjb25maWdGaWxlLmV4aXN0cygpKSB7Ci0JSGllcmFyY2h5IGggPSBuZXcgSGllcmFyY2h5KG5ldyBSb290Q2F0ZWdvcnkoKExldmVsKSBQcmlvcml0eS5ERUJVRykpOworCUhpZXJhcmNoeSBoID0gbmV3IEhpZXJhcmNoeShuZXcgUm9vdExvZ2dlcigoTGV2ZWwpIFByaW9yaXR5LkRFQlVHKSk7CiAJaGllcmFyY2h5TWFwLnB1dChpbmV0QWRkcmVzcywgaCk7CiAKIAluZXcgUHJvcGVydHlDb25maWd1cmF0b3IoKS5kb0NvbmZpZ3VyZShjb25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpLCBoKTsKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgIGlmKGdlbmVyaWNIaWVyYXJjaHkgPT0gbnVsbCkgewogICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBHRU5FUklDK0NPTkZJR19GSUxFX0VYVCk7CiAgICAgICBpZihmLmV4aXN0cygpKSB7Ci0JZ2VuZXJpY0hpZXJhcmNoeSA9IG5ldyBIaWVyYXJjaHkobmV3IFJvb3RDYXRlZ29yeSgoTGV2ZWwpIFByaW9yaXR5LkRFQlVHKSk7CisJZ2VuZXJpY0hpZXJhcmNoeSA9IG5ldyBIaWVyYXJjaHkobmV3IFJvb3RMb2dnZXIoKExldmVsKSBQcmlvcml0eS5ERUJVRykpOwogCW5ldyBQcm9wZXJ0eUNvbmZpZ3VyYXRvcigpLmRvQ29uZmlndXJlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIGdlbmVyaWNIaWVyYXJjaHkpOwogICAgICAgfSBlbHNlIHsKIAljYXQud2FybigiQ291bGQgbm90IGZpbmQgY29uZmlnIGZpbGUgWyIrZisKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1N5c2xvZ0FwcGVuZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9TeXNsb2dBcHBlbmRlci5qYXZhCmluZGV4IGQzYzJkODMuLmEzZmFlMTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1N5c2xvZ0FwcGVuZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU3lzbG9nQXBwZW5kZXIuamF2YQpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQogICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcwotICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLkFQTCBmaWxlLiAgKi8KKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai5uZXQ7CiAKQEAgLTIyOCw3ICsyMjgsNyBAQAogICBwdWJsaWMKICAgdm9pZCBhcHBlbmQoTG9nZ2luZ0V2ZW50IGV2ZW50KSB7CiAKLSAgICBpZighaXNBc1NldmVyZUFzVGhyZXNob2xkKGV2ZW50LmxldmVsKSkKKyAgICBpZighaXNBc1NldmVyZUFzVGhyZXNob2xkKGV2ZW50LmdldExldmVsKCkpKQogICAgICAgcmV0dXJuOwogCiAgICAgLy8gV2UgbXVzdCBub3QgYXR0ZW1wdCB0byBhcHBlbmQgaWYgc3F3IGlzIG51bGwuCkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICBTdHJpbmcgYnVmZmVyID0gKGZhY2lsaXR5UHJpbnRpbmc/IGZhY2lsaXR5U3RyIDogIiIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmZvcm1hdChldmVudCk7CiAKLSAgICBzcXcuc2V0TGV2ZWwoZXZlbnQubGV2ZWwuZ2V0U3lzbG9nRXF1aXZhbGVudCgpKTsKKyAgICBzcXcuc2V0TGV2ZWwoZXZlbnQuZ2V0TGV2ZWwoKS5nZXRTeXNsb2dFcXVpdmFsZW50KCkpOwogICAgIHNxdy53cml0ZShidWZmZXIpOwogCiAgICAgU3RyaW5nW10gcyA9IGV2ZW50LmdldFRocm93YWJsZVN0clJlcCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvdGVzdC9Mb29wLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC90ZXN0L0xvb3AuamF2YQppbmRleCBlNTI0MmYzLi5hNzg0Zjg1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC90ZXN0L0xvb3AuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC90ZXN0L0xvb3AuamF2YQpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQogICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcwotICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLkFQTCBmaWxlLiAgKi8KKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai5uZXQudGVzdDsKIApAQCAtMTUsOCArMTUsOCBAQAogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgCiAgICAgCi0gICAgQ2F0ZWdvcnkgcm9vdCA9IENhdGVnb3J5LmdldFJvb3QoKTsKLSAgICBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShMb29wLmNsYXNzLmdldE5hbWUoKSk7CisgICAgTG9nZ2VyIHJvb3QgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOworICAgIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKExvb3AuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICAgIGlmKGFyZ3MubGVuZ3RoICE9IDIpIAogICAgICAgdXNhZ2UoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMuIik7ICAgICAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L3Rlc3QvU01UUE1pbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvdGVzdC9TTVRQTWluLmphdmEKaW5kZXggNjc3NzE1Ny4uMDk3NWZmMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvdGVzdC9TTVRQTWluLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvdGVzdC9TTVRQTWluLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKICAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS5BUEwgZmlsZS4gICovCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoubmV0LnRlc3Q7CiAKQEAgLTExLDcgKzExLDcgQEAKIAogcHVibGljIGNsYXNzIFNNVFBNaW4gewogCi0gIHN0YXRpYyBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShTTVRQTWluLmNsYXNzKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNNVFBNaW4uY2xhc3MpOwogCiAgIHB1YmxpYwogICBzdGF0aWMKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICBjYXQud2FybiggIk1lc3NhZ2UgIiArIGkrKyk7CiAgICAgY2F0LmVycm9yKCAiTWVzc2FnZSAiICsgaSsrKTsKICAgICBjYXQubG9nKFByaW9yaXR5LkZBVEFMLCAiTWVzc2FnZSAiICsgaSsrKTsKLSAgICBDYXRlZ29yeS5zaHV0ZG93bigpOworICAgIExvZ01hbmFnZXIuc2h1dGRvd24oKTsKICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFRocmVhZEdyb3VwKCkubGlzdCgpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L3Rlc3QvU29ja2V0TWluLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC90ZXN0L1NvY2tldE1pbi5qYXZhCmluZGV4IDE1YWI3ODEuLjMzNGFmYTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L3Rlc3QvU29ja2V0TWluLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvdGVzdC9Tb2NrZXRNaW4uamF2YQpAQCAtMywxMSArMywxMSBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuICAqLworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLm5ldC50ZXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldEFwcGVuZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHk7CkBAIC0xNiw3ICsxNiw3IEBACiAKIHB1YmxpYyBjbGFzcyBTb2NrZXRNaW4gewogCi0gIHN0YXRpYyBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShTeXNsb2dNaW4uY2xhc3MuZ2V0TmFtZSgpKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKFN5c2xvZ01pbi5jbGFzcy5nZXROYW1lKCkpOwogICBzdGF0aWMgU29ja2V0QXBwZW5kZXIgczsKIAogICBwdWJsaWMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogICBzdGF0aWMKICAgdm9pZCBpbml0KFN0cmluZyBob3N0LCBTdHJpbmcgcG9ydFN0cikgewotICAgIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7CisgICAgTG9nZ2VyIHJvb3QgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOwogICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwogICAgIHRyeSB7CiAgICAgICBpbnQgcG9ydCAgID0gSW50ZWdlci5wYXJzZUludChwb3J0U3RyKTsKQEAgLTY4LDcgKzY4LDcgQEAKIAogICBzdGF0aWMKICAgdm9pZCBsb29wKCkgewotICAgIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7CisgICAgTG9nZ2VyIHJvb3QgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOwogICAgIElucHV0U3RyZWFtUmVhZGVyIGluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbik7CiAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlICdxJyB0byBxdWl0Iik7CiAgICAgaW50IGk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC90ZXN0L1N5c2xvZ01pbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvdGVzdC9TeXNsb2dNaW4uamF2YQppbmRleCAzYzhmMDM5Li41YmNhMmZlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC90ZXN0L1N5c2xvZ01pbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L3Rlc3QvU3lzbG9nTWluLmphdmEKQEAgLTMsMTIgKzMsMTIgQEAKICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQogICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcwotICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLkFQTCBmaWxlLiAgKi8KKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCiAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLm5ldC50ZXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5OREM7CkBAIC0xNiw3ICsxNiw3IEBACiAKIHB1YmxpYyBjbGFzcyBTeXNsb2dNaW4gewogCi0gIHN0YXRpYyBDYXRlZ29yeSBDQVQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShTeXNsb2dNaW4uY2xhc3MuZ2V0TmFtZSgpKTsKKyAgc3RhdGljIExvZ2dlciBDQVQgPSBMb2dnZXIuZ2V0TG9nZ2VyKFN5c2xvZ01pbi5jbGFzcyk7CiAKICAgcHVibGljCiAgIHN0YXRpYwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9udC9OVEV2ZW50TG9nQXBwZW5kZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbnQvTlRFdmVudExvZ0FwcGVuZGVyLmphdmEKaW5kZXggMGY2NjNhMy4uYjQwMTIzOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9udC9OVEV2ZW50TG9nQXBwZW5kZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL250L05URXZlbnRMb2dBcHBlbmRlci5qYXZhCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuICAqLworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLm50OwogCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICAgIH0KICAgICB9CiAgICAgLy8gTm9ybWFsaXplIHRoZSBsb2cgbWVzc2FnZSBsZXZlbCBpbnRvIHRoZSBzdXBwb3J0ZWQgY2F0ZWdvcmllcwotICAgIGludCBudF9jYXRlZ29yeSA9IGV2ZW50LmxldmVsLnRvSW50KCk7CisgICAgaW50IG50X2NhdGVnb3J5ID0gZXZlbnQuZ2V0TGV2ZWwoKS50b0ludCgpOwogCiAgICAgLy8gQW55dGhpbmcgYWJvdmUgRkFUQUwgb3IgYmVsb3cgREVCVUcgaXMgbGFiZWxlZCBhcyBJTkZPLgogICAgIC8vaWYgKG50X2NhdGVnb3J5ID4gRkFUQUwgfHwgbnRfY2F0ZWdvcnkgPCBERUJVRykgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9udC90ZXN0L05UTWluLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL250L3Rlc3QvTlRNaW4uamF2YQppbmRleCA1MjM1MWMxLi42YTQ2Mzg3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL250L3Rlc3QvTlRNaW4uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL250L3Rlc3QvTlRNaW4uamF2YQpAQCAtMywxMiArMywxMiBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuICAqLworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLm50LnRlc3Q7CiAKIAotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLm50Lk5URXZlbnRMb2dBcHBlbmRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5OwpAQCAtMTcsNyArMTcsNyBAQAogCiBwdWJsaWMgY2xhc3MgTlRNaW4gewogCi0gIHN0YXRpYyBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShOVE1pbi5jbGFzcy5nZXROYW1lKCkpOworICBzdGF0aWMgTG9nZ2VyIGNhdCA9IExvZ2dlci5nZXRMb2dnZXIoTlRNaW4uY2xhc3MuZ2V0TmFtZSgpKTsKIAogICBwdWJsaWMKICAgc3RhdGljCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL29yL0RlZmF1bHRSZW5kZXJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9vci9EZWZhdWx0UmVuZGVyZXIuamF2YQppbmRleCBkNDA2NmM5Li5hY2YxOTFkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL29yL0RlZmF1bHRSZW5kZXJlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovb3IvRGVmYXVsdFJlbmRlcmVyLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKICAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS5BUEwgZmlsZS4gICovCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoub3I7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovb3IvT2JqZWN0UmVuZGVyZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovb3IvT2JqZWN0UmVuZGVyZXIuamF2YQppbmRleCA1ZDk4ZDY5Li44NDNiYWQ0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL29yL09iamVjdFJlbmRlcmVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9vci9PYmplY3RSZW5kZXJlci5qYXZhCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuICAqLworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLm9yOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL29yL1JlbmRlcmVyTWFwLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL29yL1JlbmRlcmVyTWFwLmphdmEKaW5kZXggNzkwOTQ3OC4uZTcxYmRkNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9vci9SZW5kZXJlck1hcC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovb3IvUmVuZGVyZXJNYXAuamF2YQpAQCAtMywxMiArMywxMyBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuICAqLworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLm9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuUmVuZGVyZXJTdXBwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouaGVscGVycy5Mb2dMb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLkxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuT3B0aW9uQ29udmVydGVyOwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiAKQEAgLTQ2LDcgKzQ3LDcgQEAKICAgICAgIHJldHVybjsKICAgICB9IGVsc2UgewogICAgICAgdHJ5IHsKLQlDbGFzcyByZW5kZXJlZENsYXNzID0gQ2xhc3MuZm9yTmFtZShyZW5kZXJlZENsYXNzTmFtZSk7CisJQ2xhc3MgcmVuZGVyZWRDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MocmVuZGVyZWRDbGFzc05hbWUpOwogCXJlcG9zaXRvcnkuc2V0UmVuZGVyZXIocmVuZGVyZWRDbGFzcywgcmVuZGVyZXIpOwogICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKIAlMb2dMb2cuZXJyb3IoIkNvdWxkIG5vdCBmaW5kIGNsYXNzIFsiK3JlbmRlcmVkQ2xhc3NOYW1lKyJdLiIsIGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9vci9UaHJlYWRHcm91cFJlbmRlcmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL29yL1RocmVhZEdyb3VwUmVuZGVyZXIuamF2YQppbmRleCBkYjAwODE0Li4zZjYzODYwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL29yL1RocmVhZEdyb3VwUmVuZGVyZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL29yL1RocmVhZEdyb3VwUmVuZGVyZXIuamF2YQpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQogICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcwotICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLkFQTCBmaWxlLiAgKi8KKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai5vcjsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9Db25jYXRWc0FycmF5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL0NvbmNhdFZzQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmNmFjYS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL0NvbmNhdFZzQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vICAgICAgQ29weXJpZ2h0IDE5OTYtMTk5OSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAKLS8vICAgICAgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKioKLSAgIE1lYXN1cmUgZGlmZmVyZW5jZSBpbiBwZXJmb3JtYW5jZSBvZiBzdHJpbmcgY29uY2F0ZW5hdGlvbiB2ZXJzdXMKLSAgIGNyZWF0aW5nIGFuIGFub255bW91cyBzdHJpbmcgYXJyYXkuCi0KLSAgIDxwPllvdSBzaG91bGQgYmUgYWJsZSB0byBzZWUgdGhhdCBhbm9ueW1vdXMgc3RyaW5nIGFycmF5Ci0gICBjb25zdHJ1Y3Rpb24gaXMgc2lnbmlmaWNhdG5seSBmYXN0ZXIgdGhhbiBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gVGhlCi0gICBkaWZmZXJlbmNlIGluY3JlYXNlcyBwcm9wb3J0aW9uYWxseSB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZ3MKLSAgIHRvIGJlIGNvbmNhdGFuYXRlZC4KLQotICAgQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOwotICovCi1wdWJsaWMgY2xhc3MgQ29uY2F0VnNBcnJheSB7Ci0KLQotICBzdGF0aWMKLSAgdm9pZCAgVXNhZ2UoKSB7Ci0gICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogamF2YSBvcmcuYXBhY2hlLmxvZzRqLnBlcmZvcm1hbmNlLkNvbmNhdFZzQXJyYXkgIiArCi0JCSAgICAgICAic3RyaW5nMSBzdHJpbmcyIHJ1bkxlbmd0aFxuIiArCi0JCSAgICAgICAiICAgICAgIHdoZXJlIHJ1bkxlbmd0aCBpcyBhbiBpbnRlZ2VyLiIpOwotICAgIFN5c3RlbS5leGl0KDEpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCi0gICAgaWYoYXJncy5sZW5ndGggIT0gMykgewotICAgICAgVXNhZ2UoKTsKLSAgICB9ICAgIAotCi0gICAgU3RyaW5nIHMxID0gYXJnc1swXTsKLSAgICBTdHJpbmcgczIgPSBhcmdzWzFdOwotICAgIGludCBydW5MZW5ndGggPSAwOwotICAgIHRyeSB7Ci0gICAgICBydW5MZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMl0pOyAgICAgIAotICAgIH0KLSAgICBjYXRjaChqYXZhLmxhbmcuTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICAgIFVzYWdlKCk7Ci0gICAgfSAgICAgIAotCi0gICAgZG91YmxlIG1pY3JvczsKLQotICAgIFN0cmluZ1tdIHNhOwotICAgIGxvbmcgYmVmb3JlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IHJ1bkxlbmd0aDsgaSsrKSB7Ci0gICAgICBzYSA9IG5ldyBTdHJpbmdbXXtzMSwgczJ9OwotICAgIH0KLSAgICBtaWNyb3MgPSAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBiZWZvcmUpKjEwMDAuMC9ydW5MZW5ndGg7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgYW5vbnltb3VzIGFycmF5IGxvb3AgdG9vayBhcm91bmQgIiArIG1pY3JvcyArICIgbWljcm9zZWNvbmRzLiIpOwotCi0gICAgU3RyaW5nIHM7ICAgIAotICAgIGJlZm9yZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBydW5MZW5ndGg7IGkrKykgewotICAgICAgcyA9IHMxICsgczI7Ci0gICAgfQotICAgIG1pY3JvcyA9IChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGJlZm9yZSkqMTAwMC4wL3J1bkxlbmd0aDsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBhcHBlbmQgbG9vcCB0b29rIGFyb3VuZCAiICsgbWljcm9zICsgIiBtaWNyb3NlY29uZHMuIik7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9MaXN0VnNWZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvTGlzdFZzVmVjdG9yLmphdmEKaW5kZXggMTY0NDBjZS4uNjMyMmQwMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9MaXN0VnNWZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL0xpc3RWc1ZlY3Rvci5qYXZhCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuICAqLworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnBlcmZvcm1hbmNlOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL0xvZ2dpbmcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvTG9nZ2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmY1MDRkLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvTG9nZ2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8vICAgICAgQ29weXJpZ2h0IDE5OTYtMTk5OSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcwotLy8gICAgICBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotLy8gICAgICBDb3B5cmlnaHQgMjAwMCwgQ2VraSBHdWxjdS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotLy8gICAgICBTZWUgdGhlIExJQ0VOQ0UgZmlsZSBmb3IgdGhlIHRlcm1zIG9mIGRpc3RyaWJ1dGlvbi4KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnhtbC5ET01Db25maWd1cmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLk5EQzsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnBlcmZvcm1hbmNlLk5PUFdyaXRlcjsKLQotCi0vKioKLSAgIE1lYXN1cmUgdGhlIHBlcmZvcm1hbmNlIG9mIGxvZ2dpbmcuCi0KLSAgIDxwPkV4cGVyaW1lbnRhbCByZXN1bHRzIGFyZSBsaXN0ZWQgYmVsb3cgaW4gdW5pdHMgb2YKLSAgIDxiPm1pY3JvLXNlY29uZHM8L2I+LiBNZWFzdXJlbWVudHMgd2VyZSBkb25lIG9uIGEgQU1EIER1cm9uIGNsb2NrZWQKLSAgIGF0IDgwME1oeiBydW5uaW5nIFdpbmRvd3MgMjAwMCBhbmQgU3VuJ3MgMS4zIEpESy4KLQotPHA+PHRhYmxlIGJvcmRlcj0xPgotCi08dHI+Ci08dGg+TGF5b3V0Ci08dGg+TnVsbEFwcGVuZGVyCi08dGg+RmlsZUFwcGVuZGVyCi08dGg+RmlsZUFwcGVuZGVyIChubyBmbHVzaCkKLTx0aD5Bc3luY0FwcGVuZGVyIChubyBmbHVzaCkKLQotPHRyPgotPHRkPlNpbXBsZUxheW91dAotPHRkPjQKLTx0ZD4yMQotPHRkPjE2Ci08dGQ+MzMKLQotPHRyPgotPHRkPlBhdHRlcm5MYXlvdXQgIiVwIC0gJW0lbiIKLTx0ZD40Ci08dGQ+MjEKLTx0ZD4xNgotPHRkPjMyCi0KLTx0cj4KLTx0ZD5QYXR0ZXJuTGF5b3V0ICIlLTVwIC0gJW0lbiIKLTx0ZD40Ci08dGQ+TkEKLTx0ZD5OQQotPHRkPk5BCi0KLTx0cj4KLTx0ZD5UVENDTGF5b3V0L1JFTEFUSVZFCi08dGQ+MTAKLTx0ZD4zNwotPHRkPjMxCi08dGQ+NDUKLQotPHRyPgotPHRkPlBhdHRlcm5MYXlvdXQgIiVyIFsldF0gJS01cCAlY3syfSAleCAtICVtJW4iCi08dGQ+MTEKLTx0ZD5OQQotPHRkPk5BCi08dGQ+TkEKLQotPHRyPgotPHRkPlBhdHRlcm5MYXlvdXQgIiVyIFsldF0gJS01cCAlLjEwYyAleCAtICVtJW4iCi08dGQ+MTEKLTx0ZD5OQQotPHRkPk5BCi08dGQ+TkEKLQotPHRyPgotPHRkPlBhdHRlcm5MYXlvdXQgIiVyIFsldF0gJS01cCAlLjIwYyAleCAtICVtJW4iCi08dGQ+MTEKLTx0ZD5OQQotPHRkPk5BCi08dGQ+TkEKLQotPHRyPgotPHRkPlBhdHRlcm5MYXlvdXQgIiVyIFsldF0gJS01cCAlYyAtICVtJW4iCi08dGQ+OQotPHRkPjM2Ci08dGQ+MjkKLTx0ZD40NQotCi08dHI+Ci08dGQ+VFRDQ0xheW91dC9JU084NjAxCi08dGQ+MjUKLTx0ZD41OAotPHRkPjUxCi08dGQ+NzEKLQotPHRyPgotPHRkPlBhdHRlcm5MYXlvdXQgIiVke0lTTzg2MDF9IFsldF0gJS01cCAlYyAleCAtICVtJW4iCi08dGQ+MjgKLTx0ZD42MgotPHRkPjU1Ci08dGQ+NzYKLQotPHRyPgotPHRkPlBhdHRlcm5MYXlvdXQgIiVke3l5eXktTU0tZGQgSEg6bW06c3MsU1NTfSBbJXRdICUtNXAgJWMgJXggLSAlbSVuIgotPHRkPjQ2Ci08dGQ+ODIKLTx0ZD43MgotPHRkPjk0Ci0KLTx0cj4KLTx0ZD5QYXR0ZXJuTGF5b3V0ICIlbCAtICVtJW4iCi08dGQ+IDI0MQotPHRkPiAzMTcKLTx0ZD4gMjk5Ci08dGQ+IDI1MQotCi08dHI+Ci08dGQ+UGF0dGVybkxheW91dCAiJUMuJU0uJUwgLSAlbSVuIgotPHRkPjI2NwotPHRkPk5BCi08dGQ+TkEKLTx0ZD5OQQotCi08L3RhYmxlPgotCi0gICA8cD5UaGUgcmVzdWx0cyBvZiB0aGUgbWVhc3VyZW1lbnRzIChzaG91bGQpIHNob3cgdGhhdDoKLQotICAgPG9sPgotCi0gICA8bGk+PGI+VGhlIFBhdHRlcm5MYXlvdXQgcGVyZm9yYW5jZSBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBwZXJmb3JtYW5jZSBvZgotICAgYSBkZWRpY2F0ZWQgbGF5b3V0IG9mIGVxdWl2YWxlbnQgZm9ybWF0LjwvYj4KLQotICAgPHA+PGxpPkZvcm1hdCBzcGVjaWZpZXJzIGluIGNvbnZlcnNpb24gcGF0dGVybnMgaGF2ZSBhbG1vc3Qgbm8gaW1wYWN0Ci0gICBvbiBwZXJmb3JtYW5jZS4KLQotICAgPHA+PGxpPkZvcm1hdGluZyB0aW1lIGFuZCBkYXRlIGluZm9ybWF0aW9uIGlzIGNvc3RseS4gVXNpbmcgcmVsYXRpdmUKLSAgIHRpbWUgaGFzIHRoZSBsZWFzdCBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdG8KLSAgIHVzZSBsb2c0aiBzcGVjaWZpYyBkYXRlIGZvcm1hdHRlcnMgc3VjaCBhcyB0aGUge0BsaW5rCi0gICBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuSVNPODYwMURhdGVGb3JtYXR9IGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIHtAbGluawotICAgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXR9IGJlY2F1c2Ugb2YgaXRzIHBvb3IgcGVyZm9ybWFuY2UuIFNlZQotICAgdGhlIDxiPiVkPC9iPiBjb252ZXJzaW9uIGNoYXJhY3RlciBpbiB7QGxpbmsKLSAgIG9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dH0uCi0KLSAgIDxwPjxsaT5Bdm9pZGluZyB0aGUgZmx1c2ggb3BlcmF0aW9uIGF0IHRoZSBlbmQgb2YgZWFjaCBhcHBlbmQKLSAgIHJlc3VsdHMgaW4gYSBwZXJmb3JtYW5jZSBnYWluIG9mIDEwIHRvIDIwIHBlcmNlbnQuIEhvd2V2ZXIsIHRoZXJlCi0gICBpcyBzYWZldHkgdHJhZGVvZmYgaW52bG92ZWQgaW4gc2tpcHBpbmcgZmx1c2hpbmcuIEluZGVlZCwgd2hlbgotICAgZmx1c2hpbmcgaXMgc2tpcHBlZCwgdGhlbiBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgbGFzdCBmZXcgbG9nIGV2ZW50cwotICAgd2lsbCBub3QgYmUgcmVjb3JkZWQgb24gZGlzayB3aGVuIHRoZSBhcHBsaWNhdGlvbiBleGl0cy4gVGhpcyBpcyBhCi0gICBoaWdoIHByaWNlIHRvIHBheSBldmVuIGZvciBhIDIwJSBwZXJmb3JtYW5jZSBnYWluLgotCi0gICA8cD48bGk+VGhlIDxjb2RlPkFzeW5jQXBwZW5kZXI8L2NvZGU+IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkKLSAgIGluY3JlYXNlIHBlcmZvcm1hbmNlLiBPbiB0aGUgY29udHJhcnksIGl0IHNpZ25pZmljYW50bHkgZGVncmFkZXMKLSAgIHBlcmZvcm1hbmNlLiBUaGUgcGVyZm9ybWFuY2UgdGVzdHMgZG9uZSBoZXJlIHZlcnkgcXVpY2tseSBmaWxsIHVwCi0gICB0aGUgYm91bmRlZCBidWZmZXIgb2YgdGhlIDxjb2RlPkFzeW5jQXBwZW5kZXI8L2NvZGU+IGFuZCB0aGVyZSBpcwotICAgY29zaWRlcmFibGUgb3ZlcmhlYWQgaW4gbWFuYWdpbmcgdGhpcyBib3VuZGVkIGJ1ZmZlci4KLQotICAgPHA+T24gdGhlIG90aGVyIGhhbmQsIGhhZCB3ZSBpbnRlcmxlYXZlZCBsb2dnaW5nIG9wZXJhdGlvbnMgd2l0aAotICAgbG9uZyBibG9ja2luZyBhbmQgbm9uIENQVS1pbnRlbnNpdmUgb3BlcmF0aW9ucywgc3VjaCBhcyBJL08sCi0gICBuZXR3b3JrIGFjY2Vzcywgc2xlZXBpbmcgdGhyZWFkcywgdGhlbiB0aGUKLSAgIDxjb2RlPkFzeW5jQXBwZW5kZXI8L2NvZGU+IHdvdWxkIGhhdmUgdHJlbWVuZG91c2x5IHJlZHVjZWQgdGhlIGNvc3QKLSAgIG9mIGxvZ2dpbmcgaW4gdGVybXMgb2Ygb3ZlcmFsbCBhcHBsaWNhdGlvbiBydW50aW1lLgotCi0gICA8cD5JbiBhIHZhcmlhbnQgb2YgdGhpcyB0ZXN0LCB3ZSBoYXZlIGluc2VydGVkIGEgc2hvcnQgc2xlZXAKLSAgIG9wZXJhdGlvbiBiZXR3ZWVuIGV2ZXJ5IDEwIGxvZyBvcGVyYXRpb25zLiBXaGVuIHRoZSB0b3RhbCBzbGVwdAotICAgdGltZSBpcyBzdWJzdHJhY3RlZCwgbG9nZ2luZyB3aXRoIHRoZSA8Y29kZT5Bc3luY0xvZ2dlcjwvY29kZT4KLSAgIHRha2VzIG5vIHRpbWUgYXQgYWxsLiBJbiBvdGhlciB3b3JkcywgbG9nZ2luZyBpcyBkb25lIGZvciAiZnJlZSIuCi0KLSAgIDxwPjxsaT5FeHRyYWN0aW5nIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIGNvbXBhcmF0aXZlbHkgc2xvdy4gSXQKLSAgIGltcGxpZXMgYXQgbGVhc3QgYSB0ZW4gZm9sZCBpbmNyZWFzZSBpbiBsb2dnaW5nIHRpbWUhICBJdCBzaG91bGQgYmUKLSAgIGF2b2lkZWQgdW5sZXNzIHBlcmZvcm1hY2UgaXMgbm90IGEgY29uY2Vybi4gSXQgaGFzIGJlZW4gcmVwb3J0ZWQKLSAgIGZyb20gYSB0cnVzdGVkIHNvdXJjZSB0aGF0IGxvZ2dpbmcgd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBvbiBBSVgKLSAgIG1hY2hpbmVzIHdpbGwgPGVtPmtpbGw8L2VtPiB5b3VyIGFwcGxpY2F0aW9uJ3MgcGVyZm9ybWFuY2UuCi0KLSAgIDwvb2w+Ci0KLSAgIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdXVtbDsKLQotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2luZyB7Ci0KLSAgc3RhdGljIGludCBydW5MZW5ndGg7Ci0gIHN0YXRpYyBpbnQgZGVsYXkgPSAtMTsKLSAgLyoqCi0gICAgIEEgZGVsYXkgaXMgYXBwbGllZCBhZnRlciBldmVyeSA8Y29kZT5idXJzdExlbjwvY29kZT4gbG9nCi0gICAgIHJlcXVlc3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBjb25zdGFudCBpcyAxMDAuICAqLwotICBzdGF0aWMgIGludCBidXJzdExlbiA9IDEwMDsKLSAgc3RhdGljIGludCBERUxBWV9NVUxUID0gMTAwMC9idXJzdExlbjsKLQotICBzdGF0aWMgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoIkEwMTIzNDU2Nzg5LkIwMTIzNDU2Nzg5LkMwMTIzNDU2Nzg5Iik7Ci0KLSAgc3RhdGljCi0gIHZvaWQgIFVzYWdlKFN0cmluZyBtc2cpIHsKLSAgICBTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLSAgICBTeXN0ZW0uZXJyLnByaW50bG4oCi0gICAgICAiVXNhZ2U6IGphdmEgIitMb2dnaW5nLmNsYXNzLmdldE5hbWUoKSsiIGNvbmZGaWxlIHJ1bkxlbmd0aCBbZGVsYXldIFtidXJzdExlbl1cbiIrCi0gICAgICAiICAgICAgICBjb25mRmlsZSBpcyBhbiBYTUwgY29uZmlndXJhdGlvbiBmaWxlIGFuZFxuIisKLSAgICAgICIgICAgICAgIHJ1bkxlbmd0aCAoaW50ZWdlcikgaXMgdGhlIGxlbmd0aCBvZiB0ZXN0IGxvb3AuXG4iKwotICAgICAgIiAgICAgICAgZGVsYXkgaXMgdGhlIHRpbWUgaW4gbWlsbGlzZWNzIHRvIHdhaXQgZXZlcnkgYnVzdExlbiBsb2cgcmVxdWVzdHMuIik7Ci0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICAgPGI+VXNhZ2U6PC9iPiA8Y29kZT5qYXZhIG9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2UuTG9nZ2luZyBjb25mRmlsZSBydW5MZW5ndGggW2RlbGF5XSBbYnVyc3RMZW5dPC9jb2RlPgotCi0gICAgIDxwPjxjb2RlPmNvbmZGaWxlPC9jb2RlPiBpcyBhbiBYTUwgY29uZmlndXJhdGlvbiBmaWxlIGFuZAotICAgICAgPGNvZGU+cnVuTGVuZ3RoPC9jb2RlPiAoaW50ZWdlcikgaXMgdGhlIGxlbmd0aCBvZiB0ZXN0IGxvb3AsCi0gICAgICA8Y29kZT5kZWxheTwvY29kZT4gaXMgdGhlIHRpbWUgaW4gbWlsbGlzZWNzIHRvIHNsZWVwIGV2ZXJ5Ci0gICAgICA8Y29kZT5idXN0TGVuPC9jb2RlPiBsb2cgcmVxdWVzdHMuCi0KLSAgICAgIDxwPlRoaXMgYXBwbGljYXRpb24ganVzdCBwcmludHMgdGhlIGF2ZXJhZ2UgdGltZSBpdCB0b29rIHRvIGxvZy4KLQotCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0KLSAgICBpZihhcmd2Lmxlbmd0aCA9PSAyKQotICAgICAgaW5pdChhcmd2WzBdLCBhcmd2WzFdLCBudWxsLCBudWxsKTsKLSAgICBlbHNlIGlmKCBhcmd2Lmxlbmd0aCA9PSA0KQotICAgICAgaW5pdChhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdLCBhcmd2WzNdKTsKLSAgICBlbHNlCi0gICAgICBVc2FnZSgiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4iKTsKLQotCi0gICAgTkRDLnB1c2goInNvbWUgY29udGV4dCIpOwotCi0gICAgZG91YmxlIGRlbHRhOwotICAgIFN0cmluZyBtc2cgPSAiQUJDREVHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwIjsKLSAgICAgaWYoZGVsYXkgPD0gMCkKLSAgICAgIGRlbHRhID0gTm9EZWxheUxvb3AoY2F0LCBtc2cpOwotICAgIGVsc2UKLSAgICAgIGRlbHRhID0gRGVsYXllZExvb3AoY2F0LCBtc2cpOwotCi0gICAgU3lzdGVtLm91dC5wcmludCgoaW50KWRlbHRhKTsKLQotICAgIENhdGVnb3J5LnNodXRkb3duKCk7Ci0KLSAgfQotCi0gIC8qKgotICAgIFByb2dyYW0gd2lkZSBpbml0aWFsaXphdGlvbiBtZXRob2QuCi0gICAgKi8KLSAgc3RhdGljCi0gIHZvaWQgaW5pdChTdHJpbmcgY29uZmlnRmlsZSwgU3RyaW5nIHJ1bkxlbmd0aFN0ciwgU3RyaW5nIGRlbGF5U3RyLAotCSAgICBTdHJpbmcgYnVyc3RMZW5TdHIpIHsKLSAgICB0cnkgewotICAgICAgcnVuTGVuZ3RoICAgPSBJbnRlZ2VyLnBhcnNlSW50KHJ1bkxlbmd0aFN0cik7Ci0gICAgICBpZihkZWxheVN0ciAhPSBudWxsKSB7Ci0JZGVsYXkgPSBJbnRlZ2VyLnBhcnNlSW50KGRlbGF5U3RyKTsKLSAgICAgIH0KLSAgICAgIGlmKGRlbGF5U3RyICE9IG51bGwpIHsKLQlidXJzdExlbiA9IEludGVnZXIucGFyc2VJbnQoYnVyc3RMZW5TdHIpOwotCURFTEFZX01VTFQgPSAxMDAwL2J1cnN0TGVuOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChqYXZhLmxhbmcuTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIERPTUNvbmZpZ3VyYXRvci5jb25maWd1cmUoY29uZmlnRmlsZSk7Ci0gIH0KLQotICBzdGF0aWMKLSAgZG91YmxlIE5vRGVsYXlMb29wKENhdGVnb3J5IGNhdGVnb3J5LCBTdHJpbmcgbXNnKSB7Ci0gICAgbG9uZyBiZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgcnVuTGVuZ3RoOyBpKyspIHsKLSAgICAgIGNhdGVnb3J5LmluZm8obXNnKTsKLSAgICB9Ci0gICAgcmV0dXJuICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmUpKjEwMDAuMCkvcnVuTGVuZ3RoOwotICB9Ci0KLSAgc3RhdGljCi0gIGRvdWJsZSBEZWxheWVkTG9vcChDYXRlZ29yeSBjYXRlZ29yeSwgU3RyaW5nIG1zZykgewotICAgIGxvbmcgYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgaW50IGogPSAwOwotICAgIFRocmVhZCBjdXJyZW50VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgcnVuTGVuZ3RoOyBpKyspIHsKLSAgICAgIGNhdGVnb3J5LmluZm8obXNnKTsKLSAgICAgIGlmKGorKyA9PSBidXJzdExlbikgewotCWogPSAwOwotCXRyeXtjdXJyZW50VGhyZWFkLnNsZWVwKGRlbGF5KTt9Y2F0Y2goRXhjZXB0aW9uIGUpe30KLSAgICAgIH0KLQotICAgIH0KLSAgICBkb3VibGUgYWN0dWFsVGltZSA9ICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktYmVmb3JlKSoxMDAwLjAvcnVuTGVuZ3RoKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFjdHVhbCB0aW1lOiAiK2FjdHVhbFRpbWUpOwotICAgIHJldHVybiAoYWN0dWFsVGltZSAtIGRlbGF5KkRFTEFZX01VTFQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL05PUFdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9OT1BXcml0ZXIuamF2YQppbmRleCA5NjYyMzYwLi42ODc2NTQ0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL05PUFdyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvTk9QV3JpdGVyLmphdmEKQEAgLTEsNSArMSw5IEBACi0vLyAgICAgIENvcHlyaWdodCAxOTk2LTE5OTksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgCi0vLyAgICAgIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyoKKyAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCisgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2U7CiAKQEAgLTcsNDIgKzExLDM1IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gIEV4dGVuZHMge0BsaW5rIFdyaXRlcn0gd2l0aCBtZXRob2RzIHRoYXQgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQKLSAgZG9pbmcgYW55dGhpbmcuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtZWFzdXJlIHRoZSBjb3N0IG9mCi0gIGNvbnN0cnVjdGluZyBhIGxvZyBtZXNzYWdlIGJ1dCBub3QgYWN0dWFsbHkgd3JpdGluZyB0byB0aGUKLSAgT3V0cHV0U3RyZWFtLgotICAgCi0gIEBhdXRob3IgIENla2kgRyZ1dW1sO2xjJnV1bWw7Ci0qLworICogPHA+RXh0ZW5kcyB7QGxpbmsgV3JpdGVyfSB3aXRoIG1ldGhvZHMgdGhhdCByZXR1cm4gaW1tZWRpYXRlbHkKKyAqIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtZWFzdXJlIHRoZSBjb3N0IG9mCisgKiBjb25zdHJ1Y3RpbmcgYSBsb2cgbWVzc2FnZSBidXQgbm90IGFjdHVhbGx5IHdyaXRpbmcgdG8gYW55IGRldmljZS4KKyAqIDwvcD4KKworICogPHA+PGI+IDxmb250IGNvbG9yPSIjRkYyMjIyIj5UaGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2UuTk9QV3JpdGVyPC9jb2RlPiBjbGFzcyBpcworICogaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LjwvZm9udD4gQ29uc2VxdWVudGx5LCBpdCBpcyBub3QKKyAqIGluY2x1ZGVkIGluIHRoZSA8ZW0+bG9nNGouamFyPC9lbT4gZmlsZS48L2I+IDwvcD4KKyAqICAKKyAqIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdXVtbDsgCisgKiAqLwogcHVibGljIGNsYXNzIE5PUFdyaXRlciBleHRlbmRzIFdyaXRlciB7CiAKLSAgLy9wdWJsaWMKLSAgLy9OT1BXcml0ZXIoKSB7Ci0gIC8vfQotICAKKyAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGNidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYwotICB2b2lkIHdyaXRlKGNoYXJbXSBjYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KLQotICBwdWJsaWMKLSAgdm9pZCB3cml0ZShjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KIAogCi0gIHB1YmxpYwotICB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyAKLSAgdm9pZCB3cml0ZShTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAorICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAogCi0gIHB1YmxpYyAKLSAgdm9pZCB3cml0ZShTdHJpbmcgcywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAorICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgcywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHt9IAogCi0gIHB1YmxpYyAKLSAgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgfQogCi0gIHB1YmxpYyAKLSAgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNsb3NlIGNhbGxlZC4iKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9OZXdWc1NldExlbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9OZXdWc1NldExlbi5qYXZhCmluZGV4IDA3Zjk2ZTcuLmI2OWI4MGUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvTmV3VnNTZXRMZW4uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL05ld1ZzU2V0TGVuLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKICAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS5BUEwgZmlsZS4gICovCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2U7CiAKQEAgLTE2MCw3ICsxNjAsNyBAQAogICAgICAgZm9yKGludCBzZWNvbmQgPSAwOyBzZWNvbmQgPCAxNjspIHsKIAlTeXN0ZW0ub3V0LnByaW50bG4oIlNFQ09ORCBsb29wPSIrc2Vjb25kICsiLCBSVU5fTEVOR1RIPSIKIAkJCSAgICtSVU5fTEVOR1RIKyIsIGxlbj0iK2xlbik7Ci0JdCA9IChpbnQpbmV3QnVmZmVyKGxlbiwgc2Vjb25kKTs7CisJdCA9IChpbnQpbmV3QnVmZmVyKGxlbiwgc2Vjb25kKTsKIAogCVN5c3RlbS5vdXQucHJpbnQoIjx0ZD4iICsgdCk7CiAJdCA9IChpbnQpc2V0TGVuKGxlbiwgc2Vjb25kKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvTm90TG9nZ2luZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9Ob3RMb2dnaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzY1NWEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9Ob3RMb2dnaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8gICAgICBDb3B5cmlnaHQgMTk5Ni0yMDAwLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCi0vLyAgICAgIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2U7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5TaW1wbGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOwotCi0vKioKLSAgIE1lYXN1cmUgdGhlIHBlcmZvcm1hbmNlIG9mIGV2YWx1YXRpbmcgd2hldGhlciB0byBsb2cgb3Igbm90IHRvIGxvZywKLSAgIGJ1dCBub3QgYWN0dWFsbHkgbG9nZ2luZy4KLQotICAgPHA+VGhpcyBwcm9ncmFtIHRha2VzIHR3byBhcmd1bWVudHMsIGEgc3RyaW5nIHdoaWNoIHNob3VsZCBiZQotICAgInRydWUiIGZvciB0ZXN0aW5nIHNoaXBwZWQgY29kZSBwZXJmb3JtYW5jZSBhbmQgImZhbHNlIiBmb3IgdGVzdGluZwotICAgZGVidWctZW5hYmxlZCBwZXJmb3JtYW5jZSB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBydW4gbGVuZ3RoIG9mCi0gICB0aGUgbWVhc3VyZW1lbnQgbG9vcHMuCi0KLSAgIDxwPlRoZSByZXN1bHRzIG9mIHRoZSBtZWFzdXJlbWVudCAoc2hvdWxkKSBzaG93IHRoYXQKLQotICAgPHVsPgotCi0gICA8cD4KLSAgIDxsaT5DYXRlZ29yeSBldmFsdWF0aW9uIGlzIGluZGVwZW5kZW50IG9mIHRoZSBsZW5ndGggb2YgdGhlIGNhdGVnb3J5IG5hbWUuCi0KLSAgIDxwPgotICAgPGxpPkFzIGV4cGVjdGVkLCB1c2luZyB0aGUge0BsaW5rIENhdGVnb3J5I2lzRGVidWdFbmFibGVkCi0gICBpc0RlYnVnRW5hYmxlZH0gYW5kIHtAbGluayBDYXRlZ29yeSNpc0luZm9FbmFibGVkIGlzSW5mb0VuYWJsZWR9Ci0gICBtZXRob2RzIGVsaW1pbmF0ZXMgdGhlIG92ZXJoZWFkIG9mIG1lc3NhZ2UgYXJndW1lbnQgY29uc3RydWN0aW9uLgotCi0gICA8cD4gPGxpPk1lc3NhZ2UgYXJndW1lbnQgY29uc3RydWN0aW9uIGNhbiBiZSBhbiBpbXBvcnRhbnQgc2xvd2luZwotICAgZmFjdG9yIHdoaWxlIGV2YWx1YXRpbmcgd2hldGhlciB0byBsb2cgb3Igbm90LgotCi0gICA8L3VsPgotCi0gICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7Ci0KLSovCi1wdWJsaWMgY2xhc3MgTm90TG9nZ2luZyB7Ci0KLSAgc3RhdGljIGludCBydW5MZW5ndGg7Ci0KLSAgZmluYWwgc3RhdGljIGludCBJTklUSUFMX0hBU0hfU0laRSA9IDEwMTsKLQotICBzdGF0aWMgU3RyaW5nICBTSE9SVF9NU0cgPSAiSGVsbG8gV29ybGQiOwotCi0gIHN0YXRpYyBDYXRlZ29yeSBTSE9SVF9DQVQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZSgiQTAxMjM0NTY3ODkiKTsKLSAgc3RhdGljIENhdGVnb3J5IE1FRElVTV9DQVQ9IENhdGVnb3J5LmdldEluc3RhbmNlKCJBMDEyMzQ1Njc4OS5CMDEyMzQ1Njc4OSIpOwotICBzdGF0aWMgQ2F0ZWdvcnkgTE9OR19DQVQgID0KLSAgICAgICAgICAgICAgICAgICBDYXRlZ29yeS5nZXRJbnN0YW5jZSgiQTAxMjM0NTY3ODkuQjAxMjM0NTY3ODkuQzAxMjM0NTY3ODkiKTsKLQotICBzdGF0aWMgQ2F0ZWdvcnkgSU5FWElTVEVOVF9TSE9SVF9DQVQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZSgiSTAxMjM0NTY3ODkiKTsKLSAgc3RhdGljIENhdGVnb3J5IElORVhJU1RFTlRfTUVESVVNX0NBVD0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoIkkwMTIzNDU2Nzg5LkIwMTIzNDU2Nzg5Iik7Ci0gIHN0YXRpYyBDYXRlZ29yeSBJTkVYSVNURU5UX0xPTkdfQ0FUPQotICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoIkkwMTIzNDU2Nzg5LkIwMTIzNDU2Nzg5LkMwMTIzNDU2Nzg5Iik7Ci0KLQotICBzdGF0aWMgQ2F0ZWdvcnlbXSBDQVRfQVJSQVkgPSBuZXcgQ2F0ZWdvcnlbXSB7U0hPUlRfQ0FULCBNRURJVU1fQ0FULAotCQkJCQkJTE9OR19DQVQsIElORVhJU1RFTlRfU0hPUlRfQ0FULAotCQkJCQkJSU5FWElTVEVOVF9NRURJVU1fQ0FULAotCQkJCQkJSU5FWElTVEVOVF9MT05HX0NBVH07Ci0KLSAgc3RhdGljCi0gIHZvaWQgIFVzYWdlKCkgewotICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICJVc2FnZTogamF2YSBvcmcuYXBhY2hlLmxvZzRqLnRlc3QuTm90TG9nZ2luZyB0cnVlfGZhbHNlIHJ1bkxlbmd0aFxuIiArCi0gICAgICAidHJ1ZSBpbmRpY2F0ZXMgc2hpcHBlZCBjb2RlLCBmYWxzZSBpbmRpY2F0ZXMgY29kZSBpbiBkZXZlbG9wbWVudCIgKwotICAgICAgIiAgd2hlcmUgcnVuTGVuZ3RoIGlzIGFuIGludCByZXByZXNlbnRpbmcgdGhlIHJ1biBsZW5ndGggb2YgbG9vcHNcbiIrCi0gICAgICAiV2Ugc3VnZ2VzdCB0aGF0IHJ1bkxlbmd0aCBiZSBhdCBsZWFzdCAxMDAnMDAwLiIpOwotICAgIFN5c3RlbS5leGl0KDEpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCi0gICAgaWYoYXJndi5sZW5ndGggIT0gMikgewotICAgICAgVXNhZ2UoKTsKLSAgICB9Ci0gICAgUHJvZ3JhbUluaXQoYXJndik7Ci0gICAgZG91YmxlIGRlbHRhOwotCi0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgQ0FUX0FSUkFZLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBkZWx0YSA9IFNpbXBsZU1lc3NhZ2UoQ0FUX0FSUkFZW2ldLCBTSE9SVF9NU0csIHJ1bkxlbmd0aCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbXBsZSBhcmd1bWVudCwgICAgICAgICAgIiArIGRlbHRhCi0JCQkgKyAiIG1pY3Jvcy4gQ2F0OiAiICsgQ0FUX0FSUkFZW2ldLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IENBVF9BUlJBWS5sZW5ndGg7IGkrKykgewotICAgICAgZGVsdGEgPSBGdWxseU9wdGltaXplZENvbXBsZXhNZXNzYWdlKENBVF9BUlJBWVtpXSwgcnVuTGVuZ3RoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRnVsbHkgb3B0aW1pemVkIGNvbXBsZXgsICAiICsgZGVsdGEgKwotCQkJICIgbWljcm9zLiBDYXQ6ICIgKyBDQVRfQVJSQVlbaV0uZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgQ0FUX0FSUkFZLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBkZWx0YSA9IENvbXBsZXhNZXNzYWdlKENBVF9BUlJBWVtpXSwgcnVuTGVuZ3RoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGxleCBtZXNzYWdlIGFyZ3VtZW50LCAiICsgZGVsdGEgKwotCQkJICIgbWljcm9zLiBDYXQ6ICIgKyBDQVRfQVJSQVlbaV0uZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgIFByb2dyYW0gd2lkZSBpbml0aWFsaXphdGlvbiBtZXRob2QuICAqLwotICBzdGF0aWMKLSAgdm9pZCBQcm9ncmFtSW5pdChTdHJpbmdbXSBhcmdzKSB7Ci0KLSAgICB0cnkgewotICAgICAgcnVuTGVuZ3RoID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKLSAgICB9Ci0gICAgY2F0Y2goamF2YS5sYW5nLk51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICBVc2FnZSgpOwotICAgIH0KLQotCi0gICAgQ29uc29sZUFwcGVuZGVyIGFwcGVuZGVyID0gbmV3IENvbnNvbGVBcHBlbmRlcihuZXcgU2ltcGxlTGF5b3V0KCkpOwotCi0gICAgaWYoImZhbHNlIi5lcXVhbHMoYXJnc1swXSkpIHsKLSAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICB9IGVsc2UgaWYgKCJ0cnVlIi5lcXVhbHMoYXJnc1swXSkpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmxhZ2dpbmcgYXMgc2hpcHBlZCBjb2RlLiIpOwotICAgICAgQ2F0ZWdvcnkuZ2V0RGVmYXVsdEhpZXJhcmNoeSgpLnNldFRocmVzaG9sZCgoTGV2ZWwpIExldmVsLldBUk4pOwotICAgIH0gZWxzZQotICAgICAgVXNhZ2UoKTsKLQotICAgIFNIT1JUX0NBVC5zZXRMZXZlbCgoTGV2ZWwpIExldmVsLklORk8pOwotICAgIENhdGVnb3J5LmdldFJvb3QoKS5zZXRMZXZlbCgoTGV2ZWwpIExldmVsLklORk8pOwotCi0gIH0KLQotCi0gIHN0YXRpYwotICBkb3VibGUgU2ltcGxlTWVzc2FnZShDYXRlZ29yeSBjYXRlZ29yeSwgU3RyaW5nIG1zZywgbG9uZyBydW5MZW5ndGgpIHsKLSAgICBsb25nIGJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBydW5MZW5ndGg7IGkrKykgewotICAgICAgY2F0ZWdvcnkuZGVidWcobXNnKTsKLSAgICB9Ci0gICAgcmV0dXJuIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZSkqMTAwMC4wL3J1bkxlbmd0aDsKLSAgfQotCi0gIHN0YXRpYwotICBkb3VibGUgRnVsbHlPcHRpbWl6ZWRDb21wbGV4TWVzc2FnZShDYXRlZ29yeSBjYXRlZ29yeSwgbG9uZyBydW5MZW5ndGgpIHsKLSAgICBsb25nIGJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBydW5MZW5ndGg7IGkrKykgewotICAgICAgaWYoY2F0ZWdvcnkuaXNEZWJ1Z0VuYWJsZWQoKSkKLQljYXRlZ29yeS5kZWJ1ZygiTWVzc2FnZSIgKyBpICsKLQkJICAiIGJvdHRsZXMgb2YgYmVlciBzdGFuZGluZyBvbiB0aGUgd2FsbC4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZSkqMTAwMC4wL3J1bkxlbmd0aDsKLSAgfQotCi0gIHN0YXRpYwotICBkb3VibGUgQ29tcGxleE1lc3NhZ2UoQ2F0ZWdvcnkgY2F0ZWdvcnksIGxvbmcgcnVuTGVuZ3RoKSB7Ci0gICAgbG9uZyBiZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgcnVuTGVuZ3RoOyBpKyspIHsKLSAgICAgIGNhdGVnb3J5LmRlYnVnKCJNZXNzYWdlIiArIGkgKwotCQkiIGJvdHRsZXMgb2YgYmVlciBzdGFuZGluZyBvbiB0aGUgd2FsbC4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZSkqMTAwMC4wL3J1bkxlbmd0aDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9OdWxsQXBwZW5kZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvTnVsbEFwcGVuZGVyLmphdmEKaW5kZXggZTdjZTU2ZS4uOTM3YzU4YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9OdWxsQXBwZW5kZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL051bGxBcHBlbmRlci5qYXZhCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCiAgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UuQVBMIGZpbGUuICAqLworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnBlcmZvcm1hbmNlOwogCkBAIC0xMiw5ICsxMiwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQXBwZW5kZXJTa2VsZXRvbjsKIAogLyoqCi0gICBBIGJvZ3VzIGFwcGVuZGVyIHdoaWNoIGNhbGxzIHRoZSBmb3JtYXQgbWV0aG9kIG9mIGl0cyBsYXlvdXQgb2JqZWN0Ci0gICBidXQgZG9lcyBub3Qgd3JpdGUgdGhlIHJlc3VsdCBhbnl3aGVyZS4KLSAqLworICogQSBib2d1cyBhcHBlbmRlciB3aGljaCBjYWxscyB0aGUgZm9ybWF0IG1ldGhvZCBvZiBpdHMgbGF5b3V0IG9iamVjdAorICogYnV0IGRvZXMgbm90IHdyaXRlIHRoZSByZXN1bHQgYW55d2hlcmUuCisgKgorICogPHA+PGI+IDxmb250IGNvbG9yPSIjRkYyMjIyIj5UaGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2UuTnVsbEFwcGVuZGVyPC9jb2RlPiBjbGFzcyBpcworICogaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LjwvZm9udD4gQ29uc2VxdWVudGx5LCBpdCBpcyBub3QKKyAqIGluY2x1ZGVkIGluIHRoZSA8ZW0+bG9nNGouamFyPC9lbT4gZmlsZS48L2I+IDwvcD4KKyAqICovCiBwdWJsaWMgY2xhc3MgTnVsbEFwcGVuZGVyIGV4dGVuZHMgQXBwZW5kZXJTa2VsZXRvbiB7CiAKICAgcHVibGljIHN0YXRpYyBTdHJpbmcgczsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvU3lzdGVtVGltZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9TeXN0ZW1UaW1lLmphdmEKaW5kZXggYWZmMzA0Yy4uNDRiZjY4YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9TeXN0ZW1UaW1lLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9TeXN0ZW1UaW1lLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKICAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS5BUEwgZmlsZS4gICovCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2U7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvbG9nZ2luZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvbG9nZ2luZwppbmRleCAyMGRhN2NiLi5hZGVjNGY0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL2xvZ2dpbmcKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9sb2dnaW5nCkBAIC0yNTEsNiArMjUxLDU2IEBACiAgICBtdWx0aVJ1biB4bWwvbG9nZ2luZyRURVNULnhtbCA4ICJQYXR0ZXJuTGF5b3V0IFwiJGZvcm1hdFwiIiAgJFNIT1JUUlVOICAgCiBmaQogCitlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VjaG8gIkZpbGVBcHBlbmRlcjogQnVmZmVyZWRJTz10cnVlIgorZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RFU1Q9MjIwCitpZiBbICRURVNUIC1nZSAkc3RhcnQgXTsgdGhlbgorICAgbXVsdGlSdW4geG1sL2xvZ2dpbmckVEVTVC54bWwgOCAiU2ltcGxlTGF5b3V0IiAgJExPTkdSVU4gCitmaQorCitURVNUPTIyMQoraWYgWyAkVEVTVCAtZ2UgJHN0YXJ0IF07IHRoZW4KKyAgIGZvcm1hdD0iJXAgLSAlbSVuIgorICAgbXVsdGlSdW4geG1sL2xvZ2dpbmckVEVTVC54bWwgOCAiUGF0dGVybkxheW91dCBcIiRmb3JtYXRcIiIgICRMT05HUlVOICAgIAorZmkKKworVEVTVD0yMjIKK2lmIFsgJFRFU1QgLWdlICRzdGFydCBdOyB0aGVuCisgICBtdWx0aVJ1biB4bWwvbG9nZ2luZyRURVNULnhtbCA4ICJUVENDL1JFTEFUSVZFIiAkTE9OR1JVTiAKK2ZpCisKK1RFU1Q9MjIzCitpZiBbICRURVNUIC1nZSAkc3RhcnQgXTsgdGhlbgorICAgZm9ybWF0PSIlciBbJXRdICUtNXAgJWMgLSAlbSVuIgorICAgbXVsdGlSdW4geG1sL2xvZ2dpbmckVEVTVC54bWwgOCAiUGF0dGVybkxheW91dCBcIiRmb3JtYXRcIiIgICRMT05HUlVOIAorZmkKKworVEVTVD0yMjQKK2lmIFsgJFRFU1QgLWdlICRzdGFydCBdOyB0aGVuCisgICBtdWx0aVJ1biB4bWwvbG9nZ2luZyRURVNULnhtbCA4ICJUVENDTGF5b3V0L0lTTzg2MDEiICAkTE9OR1JVTiAKK2ZpCisKK1RFU1Q9MjI1CitpZiBbICRURVNUIC1nZSAkc3RhcnQgXTsgdGhlbgorICAgZm9ybWF0PSIlZHtJU084NjAxfSBbJXRdICUtNXAgJWMgJXggLSAlbSVuIgorICAgbXVsdGlSdW4geG1sL2xvZ2dpbmckVEVTVC54bWwgOCAiUGF0dGVybkxheW91dCBcIiRmb3JtYXRcIiIgICRMT05HUlVOIAorZmkKKworVEVTVD0yMjYKK2lmIFsgJFRFU1QgLWdlICRzdGFydCBdOyB0aGVuCisgICBmb3JtYXQ9IiVke3l5eXktTU0tZGQgSEg6bW06c3MsU1NTfSBbJXRdICUtNXAgJWMgJXggLSAlbSVuIgorICAgbXVsdGlSdW4geG1sL2xvZ2dpbmckVEVTVC54bWwgOCAiUGF0dGVybkxheW91dCBcIiRmb3JtYXRcIiIgICRMT05HUlVOICAgIAorZmkKKworVEVTVD0yMjcKK2lmIFsgJFRFU1QgLWdlICRzdGFydCBdOyB0aGVuCisgICBmb3JtYXQ9IiVsIC0gJW0lbiIKKyAgIG11bHRpUnVuIHhtbC9sb2dnaW5nJFRFU1QueG1sIDggIlBhdHRlcm5MYXlvdXQgXCIkZm9ybWF0XCIiICAkU0hPUlRSVU4gICAKK2ZpCisKKwogZWNobyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBlY2hvIEFzeW5jIGFwcGVuZGVyCiBlY2hvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UvcGFja2FnZS5odG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9wYWNrYWdlLmh0bWwKaW5kZXggOTFmMzI2YS4uZTU3YjU5ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9wYWNrYWdlLmh0bWwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS9wYWNrYWdlLmh0bWwKQEAgLTMsMTMgKzMsMTcgQEAKIDx0aXRsZT48L3RpdGxlPgogPC9oZWFkPgogCi08Ym9keT4KLTxwPlBhY2thZ2UgdG8gbWVhc3VyZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGRpZmZlcmVudCBsb2c0aiBjb21wb25lbnRzLgorICA8Ym9keT4KIAorICAgIDxwPlBhY2thZ2UgdG8gbWVhc3VyZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGRpZmZlcmVudCBsb2c0agorICAgICAgY29tcG9uZW50cy4KKyAgICA8L3A+CiAKLTxocj4KLTxhZGRyZXNzPjwvYWRkcmVzcz4KLTwhLS0gaGhtdHMgc3RhcnQgLS0+Ci1MYXN0IG1vZGlmaWVkOiBUaHUgRGVjIDE2IDEwOjMyOjQzIE1FVCAxOTk5Ci08IS0tIGhobXRzIGVuZCAtLT4KLTwvYm9keT4gPC9odG1sPgorICAgIDxwPjxiPiA8Zm9udCBjb2xvcj0iI0ZGMjIyMiI+VGhlCisgICAgICA8Y29kZT5vcmcuYXBhY2hlLmxvZzRqLnBlcmZvcm1hbmNlPC9jb2RlPiBwYWNrYWdlIGlzIGludGVuZGVkCisgICAgICBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuPC9mb250PiBDb25zZXF1ZW50bHksIHRoZSBjbGFzc2VzIGluIHRoaXMKKyAgICAgIHBhY2thZ2UgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgPGVtPmxvZzRqLmphcjwvZW0+IGZpbGUuPC9iPgorICAgIDwvcD4KKworICA8L2JvZHk+IAorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwMS54bWwgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjAxLnhtbAppbmRleCBkMWMyMWUyLi41YjhmY2IyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjAxLnhtbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjAxLnhtbApAQCAtMiwyMyArMiwyMyBAQAogPCFET0NUWVBFIGxvZzRqOmNvbmZpZ3VyYXRpb24gU1lTVEVNICJsb2c0ai5kdGQiPgogCiA8bG9nNGo6Y29uZmlndXJhdGlvbiB4bWxuczpsb2c0aj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai8nPgotICAgICAgICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KLSAgICAgICAgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+Ci0gICAgICAgICAgIDxwYXJhbSBuYW1lPSJBcHBlbmQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiPgotICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIAotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiVwIC0gJW0lbiIvPgotCSAgIDwvbGF5b3V0PgotCTwvYXBwZW5kZXI+Ci0gCi0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJBMDEyMzQ1Njc4OSI+ICAJCi0JICAgPHByaW9yaXR5IHZhbHVlID0iaW5mbyIgLz4KLSAgICAgICAgPC9jYXRlZ29yeT4gIAkKLQotCTxyb290PgotCSAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgotICAgCSAgIDxhcHBlbmRlci1yZWYgcmVmPSJOVUxMIiAvPgotCTwvcm9vdD4KKyAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+CisgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+CisgICAgPHBhcmFtIG5hbWU9IkFwcGVuZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiPgorICAgICAgPHBhcmFtIG5hbWU9IkNvbnZlcnNpb25QYXR0ZXJuIiAKKwl2YWx1ZT0iJXAgLSAlbSVuIi8+CisgICAgPC9sYXlvdXQ+CisgIDwvYXBwZW5kZXI+CisgIAorICA8Y2F0ZWdvcnkgbmFtZT0iQTAxMjM0NTY3ODkiPiAgCQorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImluZm8iIC8+CisgIDwvY2F0ZWdvcnk+ICAJCisgIAorICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTlVMTCIgLz4KKyAgPC9yb290PgogCQogPC9sb2c0ajpjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwMi54bWwgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjAyLnhtbAppbmRleCA1ODUwMDc1Li5mZjkzYTAwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjAyLnhtbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjAyLnhtbApAQCAtMiwyMiArMiwyMiBAQAogPCFET0NUWVBFIGxvZzRqOmNvbmZpZ3VyYXRpb24gU1lTVEVNICJsb2c0ai5kdGQiPgogCiA8bG9nNGo6Y29uZmlndXJhdGlvbiB4bWxuczpsb2c0aj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai8nPgotICAgICAgICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KLSAgICAgICAgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+Ci0gICAgICAgICAgIDxwYXJhbSBuYW1lPSJBcHBlbmQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlRUQ0NMYXlvdXQiPgotICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iRGF0ZUZvcm1hdCIgdmFsdWU9IlJFTEFUSVZFIi8+Ci0JICAgPC9sYXlvdXQ+Ci0JPC9hcHBlbmRlcj4KLSAKLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkEwMTIzNDU2Nzg5Ij4gIAkKLQkgICA8cHJpb3JpdHkgdmFsdWUgPSJpbmZvIiAvPgotICAgICAgICA8L2NhdGVnb3J5PiAgCQotCi0JPHJvb3Q+Ci0JICAgPHByaW9yaXR5IHZhbHVlID0iZGVidWciIC8+Ci0gICAJICAgPGFwcGVuZGVyLXJlZiByZWY9Ik5VTEwiIC8+Ci0JPC9yb290PgotCQorICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KKyAgICA8cGFyYW0gbmFtZT0iRmlsZSIgdmFsdWU9InRlbXAiLz4KKyAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgorICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouVFRDQ0xheW91dCI+CisgICAgICA8cGFyYW0gbmFtZT0iRGF0ZUZvcm1hdCIgdmFsdWU9IlJFTEFUSVZFIi8+CisgICAgPC9sYXlvdXQ+CisgIDwvYXBwZW5kZXI+CisgIAorICA8Y2F0ZWdvcnkgbmFtZT0iQTAxMjM0NTY3ODkiPiAgCQorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImluZm8iIC8+CisgIDwvY2F0ZWdvcnk+ICAJCisgIAorICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTlVMTCIgLz4KKyAgPC9yb290PgorICAKIDwvbG9nNGo6Y29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMDMueG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwMy54bWwKaW5kZXggN2QyZDcwNC4uNzQxYzQ5ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwMy54bWwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwMy54bWwKQEAgLTIsMjMgKzIsMjMgQEAKIDwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KIAogPGxvZzRqOmNvbmZpZ3VyYXRpb24geG1sbnM6bG9nNGo9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovJz4KLSAgICAgICAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+Ci0gICAgICAgICAgIDxwYXJhbSBuYW1lPSJGaWxlIiB2YWx1ZT0idGVtcCIvPgotICAgICAgICAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KLSAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9IkNvbnZlcnNpb25QYXR0ZXJuIiAKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIlciBbJXRdICUtNXAgJWMgLSAlbSVuIi8+Ci0JICAgPC9sYXlvdXQ+Ci0JPC9hcHBlbmRlcj4KLSAKLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkEwMTIzNDU2Nzg5Ij4gIAkKLQkgICA8cHJpb3JpdHkgdmFsdWUgPSJpbmZvIiAvPgotICAgICAgICA8L2NhdGVnb3J5PiAgCQotCi0JPHJvb3Q+Ci0JICAgPHByaW9yaXR5IHZhbHVlID0iZGVidWciIC8+Ci0gICAJICAgPGFwcGVuZGVyLXJlZiByZWY9Ik5VTEwiIC8+Ci0JPC9yb290PgorICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KKyAgICA8cGFyYW0gbmFtZT0iRmlsZSIgdmFsdWU9InRlbXAiLz4KKyAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgorICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCI+CisgICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIAorCXZhbHVlPSIlciBbJXRdICUtNXAgJWMgLSAlbSVuIi8+CisgICAgPC9sYXlvdXQ+CisgIDwvYXBwZW5kZXI+CisgIAorICA8Y2F0ZWdvcnkgbmFtZT0iQTAxMjM0NTY3ODkiPiAgCQorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImluZm8iIC8+CisgIDwvY2F0ZWdvcnk+ICAJCisgIAorICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTlVMTCIgLz4KKyAgPC9yb290PgogCQogPC9sb2c0ajpjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwNC54bWwgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjA0LnhtbAppbmRleCAwNTIxMGYzLi5jZWFhNDVjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjA0LnhtbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjA0LnhtbApAQCAtMiwyMyArMiwyMyBAQAogPCFET0NUWVBFIGxvZzRqOmNvbmZpZ3VyYXRpb24gU1lTVEVNICJsb2c0ai5kdGQiPgogCiA8bG9nNGo6Y29uZmlndXJhdGlvbiB4bWxuczpsb2c0aj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai8nPgotICAgICAgICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KLSAgICAgICAgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+Ci0gICAgICAgICAgIDxwYXJhbSBuYW1lPSJBcHBlbmQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlRUQ0NMYXlvdXQiPgotICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iRGF0ZUZvcm1hdCIgCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iSVNPODYwMSIvPgotCSAgIDwvbGF5b3V0PgotCTwvYXBwZW5kZXI+Ci0gCi0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJBMDEyMzQ1Njc4OSI+ICAJCi0JICAgPHByaW9yaXR5IHZhbHVlID0iaW5mbyIgLz4KLSAgICAgICAgPC9jYXRlZ29yeT4gIAkKLQotCTxyb290PgotCSAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgotICAgCSAgIDxhcHBlbmRlci1yZWYgcmVmPSJOVUxMIiAvPgotCTwvcm9vdD4KLQkKKyAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+CisgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+CisgICAgPHBhcmFtIG5hbWU9IkFwcGVuZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlRUQ0NMYXlvdXQiPgorICAgICAgPHBhcmFtIG5hbWU9IkRhdGVGb3JtYXQiIAorCXZhbHVlPSJJU084NjAxIi8+CisgICAgPC9sYXlvdXQ+CisgIDwvYXBwZW5kZXI+CisgIAorICA8Y2F0ZWdvcnkgbmFtZT0iQTAxMjM0NTY3ODkiPiAgCQorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImluZm8iIC8+CisgIDwvY2F0ZWdvcnk+ICAJCisgIAorICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTlVMTCIgLz4KKyAgPC9yb290PgorICAKIDwvbG9nNGo6Y29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMDUueG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwNS54bWwKaW5kZXggZjlkMGFkMy4uNjMwOTNkZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwNS54bWwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwNS54bWwKQEAgLTIsMjMgKzIsMjMgQEAKIDwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KIAogPGxvZzRqOmNvbmZpZ3VyYXRpb24geG1sbnM6bG9nNGo9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovJz4KLSAgICAgICAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+Ci0gICAgICAgICAgIDxwYXJhbSBuYW1lPSJGaWxlIiB2YWx1ZT0idGVtcCIvPgotICAgICAgICAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KLSAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9IkNvbnZlcnNpb25QYXR0ZXJuIiAKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIlZHtJU084NjAxfSBbJXRdICUtNXAgJWMgJXggLSAlbSVuIi8+Ci0JICAgPC9sYXlvdXQ+Ci0JPC9hcHBlbmRlcj4KLSAKLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkEwMTIzNDU2Nzg5Ij4gIAkKLQkgICA8cHJpb3JpdHkgdmFsdWUgPSJpbmZvIiAvPgotICAgICAgICA8L2NhdGVnb3J5PiAgCQotCi0JPHJvb3Q+Ci0JICAgPHByaW9yaXR5IHZhbHVlID0iZGVidWciIC8+Ci0gICAJICAgPGFwcGVuZGVyLXJlZiByZWY9Ik5VTEwiIC8+Ci0JPC9yb290PgotCQorICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KKyAgICA8cGFyYW0gbmFtZT0iRmlsZSIgdmFsdWU9InRlbXAiLz4KKyAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgorICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCI+CisgICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIAorCXZhbHVlPSIlZHtJU084NjAxfSBbJXRdICUtNXAgJWMgJXggLSAlbSVuIi8+CisgICAgPC9sYXlvdXQ+CisgIDwvYXBwZW5kZXI+CisgIAorICA8Y2F0ZWdvcnkgbmFtZT0iQTAxMjM0NTY3ODkiPiAgCQorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImluZm8iIC8+CisgIDwvY2F0ZWdvcnk+ICAJCisgIAorICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTlVMTCIgLz4KKyAgPC9yb290PgorICAKIDwvbG9nNGo6Y29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMDYueG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwNi54bWwKaW5kZXggYTY5NTIxNC4uY2I4MGIzMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwNi54bWwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwNi54bWwKQEAgLTIsMjMgKzIsMjMgQEAKIDwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KIAogPGxvZzRqOmNvbmZpZ3VyYXRpb24geG1sbnM6bG9nNGo9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovJz4KLSAgICAgICAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+Ci0gICAgICAgICAgIDxwYXJhbSBuYW1lPSJGaWxlIiB2YWx1ZT0idGVtcCIvPgotICAgICAgICAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KLSAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9IkNvbnZlcnNpb25QYXR0ZXJuIiAKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIlZHt5eXl5LU1NLWRkIEhIOm1tOnNzLFNTU30gWyV0XSAlLTVwICVjICV4IC0gJW0lbiIvPgotCSAgIDwvbGF5b3V0PgotCTwvYXBwZW5kZXI+Ci0gCi0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJBMDEyMzQ1Njc4OSI+ICAJCi0JICAgPHByaW9yaXR5IHZhbHVlID0iaW5mbyIgLz4KLSAgICAgICAgPC9jYXRlZ29yeT4gIAkKLQotCTxyb290PgotCSAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgotICAgCSAgIDxhcHBlbmRlci1yZWYgcmVmPSJOVUxMIiAvPgotCTwvcm9vdD4KLQkKKyAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+CisgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+CisgICAgPHBhcmFtIG5hbWU9IkFwcGVuZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiPgorICAgICAgPHBhcmFtIG5hbWU9IkNvbnZlcnNpb25QYXR0ZXJuIiAKKwl2YWx1ZT0iJWR7eXl5eS1NTS1kZCBISDptbTpzcyxTU1N9IFsldF0gJS01cCAlYyAleCAtICVtJW4iLz4KKyAgICA8L2xheW91dD4KKyAgPC9hcHBlbmRlcj4KKyAgCisgIDxjYXRlZ29yeSBuYW1lPSJBMDEyMzQ1Njc4OSI+ICAJCisgICAgPHByaW9yaXR5IHZhbHVlID0iaW5mbyIgLz4KKyAgPC9jYXRlZ29yeT4gIAkKKyAgCisgIDxyb290PgorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJOVUxMIiAvPgorICA8L3Jvb3Q+CisgIAogPC9sb2c0ajpjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIwNy54bWwgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjA3LnhtbAppbmRleCBhNDA5OGE5Li4yMmZjZTg1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjA3LnhtbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjA3LnhtbApAQCAtMiwyMyArMiwyMyBAQAogPCFET0NUWVBFIGxvZzRqOmNvbmZpZ3VyYXRpb24gU1lTVEVNICJsb2c0ai5kdGQiPgogCiA8bG9nNGo6Y29uZmlndXJhdGlvbiB4bWxuczpsb2c0aj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai8nPgotICAgICAgICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KLSAgICAgICAgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+Ci0gICAgICAgICAgIDxwYXJhbSBuYW1lPSJBcHBlbmQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiPgotICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIAotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiVsIC0gJW0lbiIvPgotCSAgIDwvbGF5b3V0PgotCTwvYXBwZW5kZXI+CisgIDxhcHBlbmRlciBuYW1lPSJOVUxMIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXIiPgorICAgIDxwYXJhbSBuYW1lPSJGaWxlIiB2YWx1ZT0idGVtcCIvPgorICAgIDxwYXJhbSBuYW1lPSJBcHBlbmQiIHZhbHVlPSJmYWxzZSIvPgorICAgIDxwYXJhbSBuYW1lPSJJbW1lZGlhdGVGbHVzaCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KKyAgICAgIDxwYXJhbSBuYW1lPSJDb252ZXJzaW9uUGF0dGVybiIgCisJdmFsdWU9IiVsIC0gJW0lbiIvPgorICAgIDwvbGF5b3V0PgorICA8L2FwcGVuZGVyPgogIAotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iQTAxMjM0NTY3ODkiPiAgCQotCSAgIDxwcmlvcml0eSB2YWx1ZSA9ImluZm8iIC8+Ci0gICAgICAgIDwvY2F0ZWdvcnk+ICAJCi0KLQk8cm9vdD4KLQkgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KLSAgIAkgICA8YXBwZW5kZXItcmVmIHJlZj0iTlVMTCIgLz4KLQk8L3Jvb3Q+CisgIDxjYXRlZ29yeSBuYW1lPSJBMDEyMzQ1Njc4OSI+ICAJCisgICAgPHByaW9yaXR5IHZhbHVlID0iaW5mbyIgLz4KKyAgPC9jYXRlZ29yeT4gIAkKKyAgCisgIDxyb290PgorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJOVUxMIiAvPgorICA8L3Jvb3Q+CiAJCiA8L2xvZzRqOmNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjIwLnhtbCBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmFhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjIwLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KKworPGxvZzRqOmNvbmZpZ3VyYXRpb24geG1sbnM6bG9nNGo9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovJz4KKyAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+CisgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZXN0Ii8+CisgICAgPHBhcmFtIG5hbWU9IkFwcGVuZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iQnVmZmVyZWRJTyIgdmFsdWU9InRydWUiLz4KKyAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlNpbXBsZUxheW91dCI+CisgICAgPC9sYXlvdXQ+CisgIDwvYXBwZW5kZXI+CisgIAorICA8Y2F0ZWdvcnkgbmFtZT0iQTAxMjM0NTY3ODkiPiAgCQorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImluZm8iIC8+CisgIDwvY2F0ZWdvcnk+ICAJCisgIAorICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTlVMTCIgLz4KKyAgPC9yb290PgorICAKKzwvbG9nNGo6Y29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjEueG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIyMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzM2JlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjEueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIGxvZzRqOmNvbmZpZ3VyYXRpb24gU1lTVEVNICJsb2c0ai5kdGQiPgorCis8bG9nNGo6Y29uZmlndXJhdGlvbiB4bWxuczpsb2c0aj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai8nPgorICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KKyAgICA8cGFyYW0gbmFtZT0iRmlsZSIgdmFsdWU9InRlbXAiLz4KKyAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgorICAgIDxwYXJhbSBuYW1lPSJCdWZmZXJlZElPIiB2YWx1ZT0idHJ1ZSIvPgorICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCI+CisgICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIAorCXZhbHVlPSIlcCAtICVtJW4iLz4KKyAgICA8L2xheW91dD4KKyAgPC9hcHBlbmRlcj4KKyAgCisgIDxjYXRlZ29yeSBuYW1lPSJBMDEyMzQ1Njc4OSI+ICAJCisgICAgPHByaW9yaXR5IHZhbHVlID0iaW5mbyIgLz4KKyAgPC9jYXRlZ29yeT4gIAkKKyAgCisgIDxyb290PgorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJOVUxMIiAvPgorICA8L3Jvb3Q+CisJCis8L2xvZzRqOmNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjIyLnhtbCBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZWU2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjIyLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KKworPGxvZzRqOmNvbmZpZ3VyYXRpb24geG1sbnM6bG9nNGo9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovJz4KKyAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+CisgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+CisgICAgPHBhcmFtIG5hbWU9IkFwcGVuZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iQnVmZmVyZWRJTyIgdmFsdWU9InRydWUiLz4KKyAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlRUQ0NMYXlvdXQiPgorICAgICAgPHBhcmFtIG5hbWU9IkRhdGVGb3JtYXQiIHZhbHVlPSJSRUxBVElWRSIvPgorICAgIDwvbGF5b3V0PgorICA8L2FwcGVuZGVyPgorICAKKyAgPGNhdGVnb3J5IG5hbWU9IkEwMTIzNDU2Nzg5Ij4gIAkKKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJpbmZvIiAvPgorICA8L2NhdGVnb3J5PiAgCQorICAKKyAgPHJvb3Q+CisgICAgPHByaW9yaXR5IHZhbHVlID0iZGVidWciIC8+CisgICAgPGFwcGVuZGVyLXJlZiByZWY9Ik5VTEwiIC8+CisgIDwvcm9vdD4KKyAgCis8L2xvZzRqOmNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjIzLnhtbCBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhN2RjOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjIzLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KKworPGxvZzRqOmNvbmZpZ3VyYXRpb24geG1sbnM6bG9nNGo9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovJz4KKyAgPGFwcGVuZGVyIG5hbWU9Ik5VTEwiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+CisgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJ0ZW1wIi8+CisgICAgPHBhcmFtIG5hbWU9IkFwcGVuZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHBhcmFtIG5hbWU9IkltbWVkaWF0ZUZsdXNoIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iQnVmZmVyZWRJTyIgdmFsdWU9InRydWUiLz4KKyAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiPgorICAgICAgPHBhcmFtIG5hbWU9IkNvbnZlcnNpb25QYXR0ZXJuIiAKKwl2YWx1ZT0iJXIgWyV0XSAlLTVwICVjIC0gJW0lbiIvPgorICAgIDwvbGF5b3V0PgorICA8L2FwcGVuZGVyPgorICAKKyAgPGNhdGVnb3J5IG5hbWU9IkEwMTIzNDU2Nzg5Ij4gIAkKKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJpbmZvIiAvPgorICA8L2NhdGVnb3J5PiAgCQorICAKKyAgPHJvb3Q+CisgICAgPHByaW9yaXR5IHZhbHVlID0iZGVidWciIC8+CisgICAgPGFwcGVuZGVyLXJlZiByZWY9Ik5VTEwiIC8+CisgIDwvcm9vdD4KKwkKKzwvbG9nNGo6Y29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjQueG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIyNC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5ZmYxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjQueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIGxvZzRqOmNvbmZpZ3VyYXRpb24gU1lTVEVNICJsb2c0ai5kdGQiPgorCis8bG9nNGo6Y29uZmlndXJhdGlvbiB4bWxuczpsb2c0aj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai8nPgorICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KKyAgICA8cGFyYW0gbmFtZT0iRmlsZSIgdmFsdWU9InRlbXAiLz4KKyAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgorICAgIDxwYXJhbSBuYW1lPSJCdWZmZXJlZElPIiB2YWx1ZT0idHJ1ZSIvPgorICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouVFRDQ0xheW91dCI+CisgICAgICA8cGFyYW0gbmFtZT0iRGF0ZUZvcm1hdCIgCisJdmFsdWU9IklTTzg2MDEiLz4KKyAgICA8L2xheW91dD4KKyAgPC9hcHBlbmRlcj4KKyAgCisgIDxjYXRlZ29yeSBuYW1lPSJBMDEyMzQ1Njc4OSI+ICAJCisgICAgPHByaW9yaXR5IHZhbHVlID0iaW5mbyIgLz4KKyAgPC9jYXRlZ29yeT4gIAkKKyAgCisgIDxyb290PgorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJOVUxMIiAvPgorICA8L3Jvb3Q+CisgIAorPC9sb2c0ajpjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIyNS54bWwgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjI1LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGM0NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIyNS54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbG9nNGo6Y29uZmlndXJhdGlvbiBTWVNURU0gImxvZzRqLmR0ZCI+CisKKzxsb2c0ajpjb25maWd1cmF0aW9uIHhtbG5zOmxvZzRqPSdodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyc+CisgIDxhcHBlbmRlciBuYW1lPSJOVUxMIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXIiPgorICAgIDxwYXJhbSBuYW1lPSJGaWxlIiB2YWx1ZT0idGVtcCIvPgorICAgIDxwYXJhbSBuYW1lPSJBcHBlbmQiIHZhbHVlPSJmYWxzZSIvPgorICAgIDxwYXJhbSBuYW1lPSJJbW1lZGlhdGVGbHVzaCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHBhcmFtIG5hbWU9IkJ1ZmZlcmVkSU8iIHZhbHVlPSJ0cnVlIi8+CisgICAgPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KKyAgICAgIDxwYXJhbSBuYW1lPSJDb252ZXJzaW9uUGF0dGVybiIgCisJdmFsdWU9IiVke0lTTzg2MDF9IFsldF0gJS01cCAlYyAleCAtICVtJW4iLz4KKyAgICA8L2xheW91dD4KKyAgPC9hcHBlbmRlcj4KKyAgCisgIDxjYXRlZ29yeSBuYW1lPSJBMDEyMzQ1Njc4OSI+ICAJCisgICAgPHByaW9yaXR5IHZhbHVlID0iaW5mbyIgLz4KKyAgPC9jYXRlZ29yeT4gIAkKKyAgCisgIDxyb290PgorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJOVUxMIiAvPgorICA8L3Jvb3Q+CisgIAorPC9sb2c0ajpjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIyNi54bWwgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3BlcmZvcm1hbmNlL3htbC9sb2dnaW5nMjI2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzExN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIyNi54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbG9nNGo6Y29uZmlndXJhdGlvbiBTWVNURU0gImxvZzRqLmR0ZCI+CisKKzxsb2c0ajpjb25maWd1cmF0aW9uIHhtbG5zOmxvZzRqPSdodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyc+CisgIDxhcHBlbmRlciBuYW1lPSJOVUxMIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXIiPgorICAgIDxwYXJhbSBuYW1lPSJGaWxlIiB2YWx1ZT0idGVtcCIvPgorICAgIDxwYXJhbSBuYW1lPSJBcHBlbmQiIHZhbHVlPSJmYWxzZSIvPgorICAgIDxwYXJhbSBuYW1lPSJJbW1lZGlhdGVGbHVzaCIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHBhcmFtIG5hbWU9IkJ1ZmZlcmVkSU8iIHZhbHVlPSJ0cnVlIi8+CisgICAgPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KKyAgICAgIDxwYXJhbSBuYW1lPSJDb252ZXJzaW9uUGF0dGVybiIgCisJdmFsdWU9IiVke3l5eXktTU0tZGQgSEg6bW06c3MsU1NTfSBbJXRdICUtNXAgJWMgJXggLSAlbSVuIi8+CisgICAgPC9sYXlvdXQ+CisgIDwvYXBwZW5kZXI+CisgIAorICA8Y2F0ZWdvcnkgbmFtZT0iQTAxMjM0NTY3ODkiPiAgCQorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImluZm8iIC8+CisgIDwvY2F0ZWdvcnk+ICAJCisgIAorICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJkZWJ1ZyIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iTlVMTCIgLz4KKyAgPC9yb290PgorICAKKzwvbG9nNGo6Y29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjcueG1sIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9wZXJmb3JtYW5jZS94bWwvbG9nZ2luZzIyNy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhNjFlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovcGVyZm9ybWFuY2UveG1sL2xvZ2dpbmcyMjcueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCFET0NUWVBFIGxvZzRqOmNvbmZpZ3VyYXRpb24gU1lTVEVNICJsb2c0ai5kdGQiPgorCis8bG9nNGo6Y29uZmlndXJhdGlvbiB4bWxuczpsb2c0aj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai8nPgorICA8YXBwZW5kZXIgbmFtZT0iTlVMTCIgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyIj4KKyAgICA8cGFyYW0gbmFtZT0iRmlsZSIgdmFsdWU9InRlbXAiLz4KKyAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cGFyYW0gbmFtZT0iSW1tZWRpYXRlRmx1c2giIHZhbHVlPSJmYWxzZSIvPgorICAgIDxwYXJhbSBuYW1lPSJCdWZmZXJlZElPIiB2YWx1ZT0idHJ1ZSIvPgorICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCI+CisgICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIAorCXZhbHVlPSIlbCAtICVtJW4iLz4KKyAgICA8L2xheW91dD4KKyAgPC9hcHBlbmRlcj4KKyAKKyAgPGNhdGVnb3J5IG5hbWU9IkEwMTIzNDU2Nzg5Ij4gIAkKKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJpbmZvIiAvPgorICA8L2NhdGVnb3J5PiAgCQorICAKKyAgPHJvb3Q+CisgICAgPHByaW9yaXR5IHZhbHVlID0iZGVidWciIC8+CisgICAgPGFwcGVuZGVyLXJlZiByZWY9Ik5VTEwiIC8+CisgIDwvcm9vdD4KKwkKKzwvbG9nNGo6Y29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovc3BpL0NvbmZpZ3VyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvQ29uZmlndXJhdG9yLmphdmEKaW5kZXggN2I3YzdhYi4uZDg2MmEwZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvQ29uZmlndXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvQ29uZmlndXJhdG9yLmphdmEKQEAgLTE5LDIyICsxOSwxNiBAQAogcHVibGljIGludGVyZmFjZSBDb25maWd1cmF0b3IgewogCiAgIC8qKgotICAgICA8cD48Y29kZT5FTkFCTEVfS0VZPC9jb2RlPiBpcyB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQKLSAgICAgaG9sZGluZyB0aGUgc3RyaW5nIHZhbHVlIDxiPmxvZzRqLmVuYWJsZTwvYj4uCi0KLSAgICAgPHA+U2V0dGluZyB0aGUgc3lzdGVtIHByb3BlcnR5IDxiPmxvZzRqLmRpc2FibGU8L2I+IHRvIERFQlVHLAotICAgICBJTkZPLCBXQVJOLCBFUlJPUiBvciBGQVRBTCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIHtAbGluawotICAgICBIaWVyYXJjaHkjZGlzYWJsZX0gbWV0aG9kIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbGV2ZWwuCi0KLSAgICAgQHNpbmNlIDEuMiAqLwotICAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfS0VZID0gImxvZzRqLmVuYWJsZSI7Ci0KKyAgICAgU3BlY2lhbCBsZXZlbCB2YWx1ZSBzaWduaWZ5aW5nIGluaGVyaXRlZCBiZWhhdmlvdXIuIFRoZSBjdXJyZW50CisgICAgIHZhbHVlIG9mIHRoaXMgc3RyaW5nIGNvbnN0YW50IGlzIDxiPmluaGVyaXRlZDwvYj4uIHtAbGluayAjTlVMTH0KKyAgICAgaXMgYSBzeW5vbnltLiAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5IRVJJVEVEID0gImluaGVyaXRlZCI7CiAKICAgLyoqCi0gICAgIFNwZWNpYWwgbGV2ZWwgdmFsdWUgc2lnbmlmeWluZyBpbmhlcml0ZWQgYmVoYXZpb3VyLiBUaGUKLSAgICAgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHN0cmluZyBjb25zdGFudCBpcyA8Yj5pbmhlcml0ZWQ8L2I+LgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkhFUklURUQgPSAiaW5oZXJpdGVkIjsKKyAgICAgU3BlY2lhbCBsZXZlbCBzaWduaWZ5aW5nIGluaGVyaXRlZCBiZWhhdmlvdXIsIHNhbWUgYXMge0BsaW5rCisgICAgICNJTkhFUklURUR9LiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHN0cmluZyBjb25zdGFudCBpcworICAgICA8Yj5udWxsPC9iPi4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTCA9ICJudWxsIjsKIAogCiAKQEAgLTQ1LDcgKzM5LDcgQEAKICAgICAgcGFyYW1ldGVyLgogCiAgICAgIEBwYXJhbSB1cmwgVGhlIFVSTCB0byBwYXJzZQotICAgICBAcGFyYW0gaGllcmFyY2h5IFRoZSBoaWVyYXJjaHkgdG8gb3BlcmF0aW9uIHVwb24uCisgICAgIEBwYXJhbSByZXBvc2l0b3J5IFRoZSBoaWVyYXJjaHkgdG8gb3BlcmF0aW9uIHVwb24uCiAgICAqLwogICB2b2lkIGRvQ29uZmlndXJlKFVSTCB1cmwsIExvZ2dlclJlcG9zaXRvcnkgcmVwb3NpdG9yeSk7CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9GaWx0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovc3BpL0ZpbHRlci5qYXZhCmluZGV4IDNmMTJkYmQuLmZmYTU2NGQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovc3BpL0ZpbHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovc3BpL0ZpbHRlci5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgIHRoZSBjaGFpbi4KIAogICAgICBAcGFyYW0gZXZlbnQgVGhlIExvZ2dpbmdFdmVudCB0byBkZWNpZGUgdXBvbi4KLSAgICAgQHBhcmFtIGRlY2lzaW9uIFRoZSBkZWNpc2lvbiBvZiB0aGUgZmlsdGVyLiAgKi8KKyAgICAgQHJldHVybiBkZWNpc2lvbiBUaGUgZGVjaXNpb24gb2YgdGhlIGZpbHRlci4gICovCiAgIGFic3RyYWN0CiAgIHB1YmxpYwogICBpbnQgZGVjaWRlKExvZ2dpbmdFdmVudCBldmVudCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Mb2dnZXJSZXBvc2l0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Mb2dnZXJSZXBvc2l0b3J5LmphdmEKaW5kZXggMjJjZTJiMy4uMTFlNDY4ZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvTG9nZ2VyUmVwb3NpdG9yeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovc3BpL0xvZ2dlclJlcG9zaXRvcnkuamF2YQpAQCAtMzEsOSArMzEsMTAgQEAKICAgdm9pZCBhZGRIaWVyYXJjaHlFdmVudExpc3RlbmVyKEhpZXJhcmNoeUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOwogCiAgIC8qKgotICAgICBJcyB0aGUgcmVwb3NpdG9yeSBkaXNhYmxlZCBmb3IgYSBnaXZlbiBsZXZlbD8gVGhlIGFuc3dlciBkZXBlbmRzCi0gICAgIG9uIHRoZSByZXBvc2l0b3J5IHRocmVzaG9sZCBhbmQgdGhlIDxjb2RlPmxldmVsPC9jb2RlPgotICAgICBwYXJhbWV0ZXIuIFNlZSBhbHNvIHtAbGluayAjc2V0VGhyZXNob2xkfSBtZXRob2QuICAqLworICAgICBSZXR1cm5zIHdoZXRoZXIgdGhpcyByZXBvc2l0b3J5IGlzIGRpc2FibGVkIGZvciBhIGdpdmVuCisgICAgIGxldmVsLiBUaGUgYW5zd2VyIGRlcGVuZHMgb24gdGhlIHJlcG9zaXRvcnkgdGhyZXNob2xkIGFuZCB0aGUKKyAgICAgPGNvZGU+bGV2ZWw8L2NvZGU+IHBhcmFtZXRlci4gU2VlIGFsc28ge0BsaW5rICNzZXRUaHJlc2hvbGR9CisgICAgIG1ldGhvZC4gICovCiAgIGJvb2xlYW4gaXNEaXNhYmxlZChpbnQgbGV2ZWwpOwogCiAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvTG9nZ2luZ0V2ZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Mb2dnaW5nRXZlbnQuamF2YQppbmRleCA1Y2Q2ZTQyLi45MTcwYzNhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Mb2dnaW5nRXZlbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Mb2dnaW5nRXZlbnQuamF2YQpAQCAtMTAsNyArMTAsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouKjsKIAogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouaGVscGVycy5Mb2dMb2c7Ci0KK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuTG9hZGVyOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwpAQCAtMzksMTkgKzM5LDQwIEBACiAgIC8qKiBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2FsbGluZyBjYXRlZ29yeSBjbGFzcy4gKi8KICAgdHJhbnNpZW50IHB1YmxpYyBmaW5hbCBTdHJpbmcgZnFuT2ZDYXRlZ29yeUNsYXNzOwogCi0gIC8qKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIGxvZ2dpbmcgZXZlbnQuIFRoZSBjYXRlZ29yeSBmaWVsZCBpcyBub3QKLSAgc2VyaWFsaXplZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAgLyoqIAorICAgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIGxvZ2dpbmcgZXZlbnQuIFRoaXMgZmllbGQgaXMgbm90IHNlcmlhbGl6ZWQKKyAgICogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgICAqCisgICAqIDxwPkl0IGlzIHNldCBieSB0aGUgTG9nZ2luZ0V2ZW50IGNvbnN0cnVjdG9yIG9yIHNldCBieSBhIHJlbW90ZQorICAgKiBlbnRpdHkgYWZ0ZXIgZGVzZXJpYWxpemF0aW9uLgorICAgKiAKKyAgICogQGRlcHJlY2F0ZWQgVGhpcyBmaWVsZCB3aWxsIGJlIG1hcmtlZCBhcyBwcml2YXRlIG9yIGJlIGNvbXBsZXRlbHkKKyAgICogcmVtb3ZlZCBpbiBmdXR1cmUgcmVsZWFzZXMuIFBsZWFzZSBkbyBub3QgdXNlIGl0LgorICAgKiAqLworICB0cmFuc2llbnQgcHJpdmF0ZSBDYXRlZ29yeSBsb2dnZXI7CiAKLSAgPHA+SXQgaXMgc2V0IGJ5IHRoZSBMb2dnaW5nRXZlbnQgY29uc3RydWN0b3Igb3Igc2V0IGJ5IGEgcmVtb3RlCi0gIGVudGl0eSBhZnRlciBkZXNlcmlhbGl6YXRpb24uICovCi0gIHRyYW5zaWVudCBwdWJsaWMgQ2F0ZWdvcnkgbG9nZ2VyOworICAvKiogCisgICAqIDxwPlRoZSBjYXRlZ29yeSAobG9nZ2VyKSBuYW1lLgorICAgKiAgIAorICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZpZWxkIHdpbGwgYmUgbWFya2VkIGFzIHByaXZhdGUgaW4gZnV0dXJlCisgICAqIHJlbGVhc2VzLiBQbGVhc2UgZG8gbm90IGFjY2VzcyBpdCBkaXJlY3RseS4gVXNlIHRoZSB7QGxpbmsKKyAgICogI2dldExvZ2dlck5hbWV9IG1ldGhvZCBpbnN0ZWFkLgogCi0gIC8qKiBUaGUgY2F0ZWdvcnkgKGxvZ2dlcikgbmFtZS4gKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyBjYXRlZ29yeU5hbWU7CisgICAqICovCisgIGZpbmFsIHB1YmxpYyBTdHJpbmcgY2F0ZWdvcnlOYW1lOwogCi0gIC8qKiBMZXZlbCBvZiBsb2dnaW5nIGV2ZW50LiBMZXZlbCBjYW5ub3QgYmUgc2VyaWFsaXphYmxlCi0gICAgICBiZWNhdXNlIGl0IGlzIGEgZmx5d2VpZ2h0LiAgRHVlIHRvIGl0cyBzcGVjaWFsIHNlcmFsaXphdGlvbiBpdAotICAgICAgY2Fubm90IGJlIGRlY2xhcmVkIGZpbmFsIGVpdGhlci4gKi8KKyAgLyoqIAorICAgKiBMZXZlbCBvZiBsb2dnaW5nIGV2ZW50LiBMZXZlbCBjYW5ub3QgYmUgc2VyaWFsaXphYmxlIGJlY2F1c2UgaXQKKyAgICogaXMgYSBmbHl3ZWlnaHQuICBEdWUgdG8gaXRzIHNwZWNpYWwgc2VyYWxpemF0aW9uIGl0IGNhbm5vdCBiZQorICAgKiBkZWNsYXJlZCBmaW5hbCBlaXRoZXIuCisgICAqICAgCisgICAqIDxwPiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkuIFlvdSBzaG91ZCB1c2UgdGhlCisgICAqIHtAbGluayAjZ2V0TGV2ZWx9IG1ldGhvZCBpbnN0ZWFkLgorICAgKgorICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZpZWxkIHdpbGwgYmUgbWFya2VkIGFzIHByaXZhdGUgaW4gZnV0dXJlCisgICAqIHJlbGVhc2VzLiBQbGVhc2UgZG8gbm90IGFjY2VzcyBpdCBkaXJlY3RseS4gVXNlIHRoZSB7QGxpbmsKKyAgICogI2dldExldmVsfSBtZXRob2QgaW5zdGVhZC4KKyAgICogKi8KICAgdHJhbnNpZW50IHB1YmxpYyBQcmlvcml0eSBsZXZlbDsKIAogICAvKiogVGhlIG5lc3RlZCBkaWFnbm9zdGljIGNvbnRleHQgKE5EQykgb2YgbG9nZ2luZyBldmVudC4gKi8KQEAgLTYyLDE4ICs4MywxNiBAQAogCiAKICAgLyoqIEhhdmUgd2UgdHJpZWQgdG8gZG8gYW4gTkRDIGxvb2t1cD8gSWYgd2UgZGlkLCB0aGVyZSBpcyBubyBuZWVkCi0gICAgICB0byBkbyBpdCBhZ2Fpbi4gIE5vdGUgdGhhdCBpdHMgdmFsdWUgaXMgYWx3YXlzIGZhbHNlIHdoZW4KLSAgICAgIHNlcmlhbGl6ZWQuIFRodXMsIGEgcmVjZWl2aW5nIFNvY2tldE5vZGUgd2lsbCBuZXZlciB1c2UgaXQncyBvd24KLSAgICAgIChpbmNvcnJlY3QpIE5EQy4gU2VlIGFsc28gd3JpdGVPYmplY3QgbWV0aG9kLiAqLworICAgKiAgdG8gZG8gaXQgYWdhaW4uICBOb3RlIHRoYXQgaXRzIHZhbHVlIGlzIGFsd2F5cyBmYWxzZSB3aGVuCisgICAqICBzZXJpYWxpemVkLiBUaHVzLCBhIHJlY2VpdmluZyBTb2NrZXROb2RlIHdpbGwgbmV2ZXIgdXNlIGl0J3Mgb3duCisgICAqICAoaW5jb3JyZWN0KSBOREMuIFNlZSBhbHNvIHdyaXRlT2JqZWN0IG1ldGhvZC4gKi8KICAgcHJpdmF0ZSBib29sZWFuIG5kY0xvb2t1cFJlcXVpcmVkID0gdHJ1ZTsKIAogCi0gLyoqIEhhdmUgd2UgdHJpZWQgdG8gZG8gYW4gTURDIGxvb2t1cD8gSWYgd2UgZGlkLCB0aGVyZSBpcyBubyBuZWVkIHRvCi0gICAgICBkbyBpdCBhZ2Fpbi4gIE5vdGUgdGhhdCBpdHMgdmFsdWUgaXMgYWx3YXlzIGZhbHNlIHdoZW4KLSAgICAgIHNlcmlhbGl6ZWQuIFRodXMsIGEgcmVjZWl2aW5nIFNvY2tldE5vZGUgd2lsbCBuZXZlciB1c2UgaXQncyBvd24KLSAgICAgIChpbmNvcnJlY3QpIE1EQy4gU2VlIGFsc28gd3JpdGVPYmplY3QgbWV0aG9kLiAqLwotICBwcml2YXRlIGJvb2xlYW4gbWRjTG9va3VwUmVxdWlyZWQgPSB0cnVlOwotCisgIC8qKiBIYXZlIHdlIHRyaWVkIHRvIGRvIGFuIE1EQyBsb29rdXA/IElmIHdlIGRpZCwgdGhlcmUgaXMgbm8gbmVlZAorICAgKiAgdG8gZG8gaXQgYWdhaW4uICBOb3RlIHRoYXQgaXRzIHZhbHVlIGlzIGFsd2F5cyBmYWxzZSB3aGVuCisgICAqICBzZXJpYWxpemVkLiBTZWUgYWxzbyB0aGUgZ2V0TURDIGFuZCBnZXRNRENDb3B5IG1ldGhvZHMuICAqLworICBwcml2YXRlIGJvb2xlYW4gbWRjQ29weUxvb2t1cFJlcXVpcmVkID0gdHJ1ZTsKIAogICAvKiogVGhlIGFwcGxpY2F0aW9uIHN1cHBsaWVkIG1lc3NhZ2Ugb2YgbG9nZ2luZyBldmVudC4gKi8KICAgdHJhbnNpZW50IHByaXZhdGUgT2JqZWN0IG1lc3NhZ2U7CkBAIC0xMTEsMTYgKzEzMCwxNiBAQAogICAgICA8cD5FeGNlcHQge0BsaW5rICN0aW1lU3RhbXB9IGFsbCB0aGUgb3RoZXIgZmllbGRzIG9mCiAgICAgIDxjb2RlPkxvZ2dpbmdFdmVudDwvY29kZT4gYXJlIGZpbGxlZCB3aGVuIGFjdHVhbGx5IG5lZWRlZC4KICAgICAgPHA+Ci0gICAgIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgb2YgdGhpcyBldmVudC4KKyAgICAgQHBhcmFtIGxvZ2dlciBUaGUgbG9nZ2VyIGdlbmVyYXRpbmcgdGhpcyBldmVudC4KICAgICAgQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBvZiB0aGlzIGV2ZW50LgogICAgICBAcGFyYW0gbWVzc2FnZSAgVGhlIG1lc3NhZ2Ugb2YgdGhpcyBldmVudC4KICAgICAgQHBhcmFtIHRocm93YWJsZSBUaGUgdGhyb3dhYmxlIG9mIHRoaXMgZXZlbnQuICAqLwogICBwdWJsaWMgTG9nZ2luZ0V2ZW50KFN0cmluZyBmcW5PZkNhdGVnb3J5Q2xhc3MsIENhdGVnb3J5IGxvZ2dlciwKLQkJICAgICAgUHJpb3JpdHkgcHJpb3JpdHksIE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCSAgICAgIFByaW9yaXR5IGxldmVsLCBPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewogICAgIHRoaXMuZnFuT2ZDYXRlZ29yeUNsYXNzID0gZnFuT2ZDYXRlZ29yeUNsYXNzOwogICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOwogICAgIHRoaXMuY2F0ZWdvcnlOYW1lID0gbG9nZ2VyLmdldE5hbWUoKTsKLSAgICB0aGlzLmxldmVsID0gcHJpb3JpdHk7CisgICAgdGhpcy5sZXZlbCA9IGxldmVsOwogICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICAgaWYodGhyb3dhYmxlICE9IG51bGwpIHsKICAgICAgIHRoaXMudGhyb3dhYmxlSW5mbyA9IG5ldyBUaHJvd2FibGVJbmZvcm1hdGlvbih0aHJvd2FibGUpOwpAQCAtMTM0LDE4ICsxNTMsMTggQEAKICAgICAgPHA+RXhjZXB0IHtAbGluayAjdGltZVN0YW1wfSBhbGwgdGhlIG90aGVyIGZpZWxkcyBvZgogICAgICA8Y29kZT5Mb2dnaW5nRXZlbnQ8L2NvZGU+IGFyZSBmaWxsZWQgd2hlbiBhY3R1YWxseSBuZWVkZWQuCiAgICAgIDxwPgotICAgICBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IG9mIHRoaXMgZXZlbnQuCisgICAgIEBwYXJhbSBsb2dnZXIgVGhlIGxvZ2dlciBnZW5lcmF0aW5nIHRoaXMgZXZlbnQuCiAgICAgIEBwYXJhbSB0aW1lU3RhbXAgdGhlIHRpbWVzdGFtcCBvZiB0aGlzIGxvZ2dpbmcgZXZlbnQKICAgICAgQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBvZiB0aGlzIGV2ZW50LgogICAgICBAcGFyYW0gbWVzc2FnZSAgVGhlIG1lc3NhZ2Ugb2YgdGhpcyBldmVudC4KICAgICAgQHBhcmFtIHRocm93YWJsZSBUaGUgdGhyb3dhYmxlIG9mIHRoaXMgZXZlbnQuICAqLwogICBwdWJsaWMgTG9nZ2luZ0V2ZW50KFN0cmluZyBmcW5PZkNhdGVnb3J5Q2xhc3MsIENhdGVnb3J5IGxvZ2dlciwKLQkJICAgICAgbG9uZyB0aW1lU3RhbXAsIFByaW9yaXR5IHByaW9yaXR5LCBPYmplY3QgbWVzc2FnZSwKKwkJICAgICAgbG9uZyB0aW1lU3RhbXAsIFByaW9yaXR5IGxldmVsLCBPYmplY3QgbWVzc2FnZSwKIAkJICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSkgewogICAgIHRoaXMuZnFuT2ZDYXRlZ29yeUNsYXNzID0gZnFuT2ZDYXRlZ29yeUNsYXNzOwogICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOwogICAgIHRoaXMuY2F0ZWdvcnlOYW1lID0gbG9nZ2VyLmdldE5hbWUoKTsKLSAgICB0aGlzLmxldmVsID0gcHJpb3JpdHk7CisgICAgdGhpcy5sZXZlbCA9IGxldmVsOwogICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICAgaWYodGhyb3dhYmxlICE9IG51bGwpIHsKICAgICAgIHRoaXMudGhyb3dhYmxlSW5mbyA9IG5ldyBUaHJvd2FibGVJbmZvcm1hdGlvbih0aHJvd2FibGUpOwpAQCAtMTU0LDIwICsxNzMsMzEgQEAKICAgICB0aGlzLnRpbWVTdGFtcCA9IHRpbWVTdGFtcDsKICAgfQogCi0KLQogICAvKioKICAgICAgU2V0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBsb2dnaW5nIGV2ZW50LiBUaGUgY29sbGVjdGVkCiAgICAgIGluZm9ybWF0aW9uIGlzIGNhY2hlZCBmb3IgZnV0dXJlIHVzZS4KICAgICovCi0gIHB1YmxpYwotICBMb2NhdGlvbkluZm8gZ2V0TG9jYXRpb25JbmZvcm1hdGlvbigpIHsKKyAgcHVibGljIExvY2F0aW9uSW5mbyBnZXRMb2NhdGlvbkluZm9ybWF0aW9uKCkgewogICAgIGlmKGxvY2F0aW9uSW5mbyA9PSBudWxsKSB7CiAgICAgICBsb2NhdGlvbkluZm8gPSBuZXcgTG9jYXRpb25JbmZvKG5ldyBUaHJvd2FibGUoKSwgZnFuT2ZDYXRlZ29yeUNsYXNzKTsKICAgICB9CiAgICAgcmV0dXJuIGxvY2F0aW9uSW5mbzsKICAgfQogCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGxldmVsIG9mIHRoaXMgZXZlbnQuIFVzZSB0aGlzIGZvcm0gaW5zdGVhZCBvZiBkaXJlY3RseQorICAgKiBhY2Nlc3NpbmcgdGhlIDxjb2RlPmxldmVsPC9jb2RlPiBmaWVsZC4gICovCisgIHB1YmxpYyBMZXZlbCBnZXRMZXZlbCgpIHsKKyAgICByZXR1cm4gKExldmVsKSBsZXZlbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxvZ2dlci4gVXNlIHRoaXMgZm9ybSBpbnN0ZWFkIG9mIGRpcmVjdGx5CisgICAqIGFjY2Vzc2luZyB0aGUgPGNvZGU+Y2F0ZWdvcnlOYW1lPC9jb2RlPiBmaWVsZC4gIAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRMb2dnZXJOYW1lKCkgeworICAgIHJldHVybiBjYXRlZ29yeU5hbWU7CisgIH0KIAogICAvKioKICAgICAgUmV0dXJuIHRoZSBtZXNzYWdlIGZvciB0aGlzIGxvZ2dpbmcgZXZlbnQuCkBAIC0xODcsNiArMjE3LDExIEBACiAgICAgfQogICB9CiAKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIE5EQyBmb3IgdGhpcyBldmVudC4gSXQgd2lsbCByZXR1cm4gdGhlCisgICAqIGNvcnJlY3QgY29udGVudCBldmVuIGlmIHRoZSBldmVudCB3YXMgZ2VuZXJhdGVkIGluIGEgZGlmZmVyZW50CisgICAqIHRocmVhZCBvciBldmVuIG9uIGEgZGlmZmVyZW50IG1hY2hpbmUuIFRoZSB7QGxpbmsgTkRDI2dldH0gbWV0aG9kCisgICAqIHNob3VsZCA8ZW0+bmV2ZXI8L2VtPiBiZSBjYWxsZWQgZGlyZWN0bHkuICAqLwogICBwdWJsaWMKICAgU3RyaW5nIGdldE5EQygpIHsKICAgICBpZihuZGNMb29rdXBSZXF1aXJlZCkgewpAQCAtMTk5LDkgKzIzNCwxMSBAQAogCiAgIC8qKgogICAgICAgUmV0dXJucyB0aGUgdGhlIGNvbnRleHQgY29ycmVzcG9uZGluZyB0byB0aGUgPGNvZGU+a2V5PC9jb2RlPgotICAgICAgcGFyYW1ldGVyLiBJZiB0aGVyZSBpcyBhIGxvY2FsIE1EQyBjb3B5IChwcm9iYWJseSBmcm9tIGEgcmVtb3RlCi0gICAgICBtYWNoaW5lLCB0aGUgd2UgdXNlIGl0LCBpZiB0aGF0IGZhaWxzIHRoZW4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MKLSAgICAgIDxjb2RlPk1EQzwvY29kZT4gaXMgdXNlZC4gCisgICAgICBwYXJhbWV0ZXIuIElmIHRoZXJlIGlzIGEgbG9jYWwgTURDIGNvcHksIHBvc3NpYmx5IGJlY2F1c2Ugd2UgYXJlCisgICAgICBpbiBhIGxvZ2dpbmcgc2VydmVyIG9yIHJ1bm5pbmcgaW5zaWRlIEFzeW5jQXBwZW5kZXIsIHRoZW4gd2UKKyAgICAgIHNlYXJjaCBmb3IgdGhlIGtleSBpbiBNREMgY29weSwgaWYgYSB2YWx1ZSBpcyBmb3VuZCBpdCBpcworICAgICAgcmV0dXJuZWQuIE90aGVyd2lzZSwgaWYgdGhlIHNlYXJjaCBpbiBNREMgY29weSByZXR1cm5zIGEgbnVsbAorICAgICAgcmVzdWx0LCB0aGVuIHRoZSBjdXJyZW50IHRocmVhZCdzIDxjb2RlPk1EQzwvY29kZT4gaXMgdXNlZC4KICAgICAgIAogICAgICAgPHA+Tm90ZSB0aGF0IDxlbT5ib3RoPC9lbT4gdGhlIGxvY2FsIE1EQyBjb3B5IGFuZCB0aGUgY3VycmVudAogICAgICAgdGhyZWFkJ3MgTURDIGFyZSBzZWFyY2hlZC4KQEAgLTIyMywxMSArMjYwLDEyIEBACiAKICAgLyoqCiAgICAgIE9idGFpbiBhIGNvcHkgb2YgdGhpcyB0aHJlYWQncyBNREMgcHJpb3IgdG8gc2VyaWFsaXphdGlvbiBvcgotICAgICBhc3luY2hyb25vdXMgbG9nZ2luZy4gICovCisgICAgIGFzeW5jaHJvbm91cyBsb2dnaW5nLiAgCisgICovCiAgIHB1YmxpYwogICB2b2lkIGdldE1EQ0NvcHkoKSB7Ci0gICAgaWYobWRjTG9va3VwUmVxdWlyZWQpIHsKLSAgICAgIG5kY0xvb2t1cFJlcXVpcmVkID0gZmFsc2U7CisgICAgaWYobWRjQ29weUxvb2t1cFJlcXVpcmVkKSB7CisgICAgICBtZGNDb3B5TG9va3VwUmVxdWlyZWQgPSBmYWxzZTsKICAgICAgIC8vIHRoZSBjbG9uZSBjYWxsIGlzIHJlcXVpcmVkIGZvciBhc3luY2hyb25vdXMgbG9nZ2luZy4KICAgICAgIC8vIFNlZSBhbHNvIGJ1ZyAjNTkzMi4KICAgICAgIEhhc2h0YWJsZSB0ID0gKEhhc2h0YWJsZSkgTURDLmdldENvbnRleHQoKTsKQEAgLTI0Myw3ICsyODEsNyBAQAogICAgICAgIGlmKG1lc3NhZ2UgaW5zdGFuY2VvZiBTdHJpbmcpCiAJIHJlbmRlcmVkTWVzc2FnZSA9IChTdHJpbmcpIG1lc3NhZ2U7CiAgICAgICAgZWxzZSB7Ci0JIExvZ2dlclJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IGxvZ2dlci5nZXRIaWVyYXJjaHkoKTsKKwkgTG9nZ2VyUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gbG9nZ2VyLmdldExvZ2dlclJlcG9zaXRvcnkoKTsKIAogCSBpZihyZXBvc2l0b3J5IGluc3RhbmNlb2YgUmVuZGVyZXJTdXBwb3J0KSB7CiAJICAgUmVuZGVyZXJTdXBwb3J0IHJzID0gKFJlbmRlcmVyU3VwcG9ydCkgcmVwb3NpdG9yeTsKQEAgLTI1OSw5ICsyOTcsNyBAQAogICAvKioKICAgICAgUmV0dXJucyB0aGUgdGltZSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydGVkLCBpbiBtaWxsaXNlY29uZHMKICAgICAgZWxhcHNlZCBzaW5jZSAwMS4wMS4xOTcwLiAgKi8KLSAgcHVibGljCi0gIHN0YXRpYwotICBsb25nIGdldFN0YXJ0VGltZSgpIHsKKyAgcHVibGljIHN0YXRpYyBsb25nIGdldFN0YXJ0VGltZSgpIHsKICAgICByZXR1cm4gc3RhcnRUaW1lOwogICB9CiAKQEAgLTMxMCw3ICszNDYsNyBAQAogICAgICAgfSBlbHNlIHsKIAlNZXRob2QgbSA9IChNZXRob2QpIG1ldGhvZENhY2hlLmdldChjbGFzc05hbWUpOwogCWlmKG0gPT0gbnVsbCkgewotCSAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisJICBDbGFzcyBjbGF6eiA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKIAkgIC8vIE5vdGUgdGhhdCB3ZSB1c2UgQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QgaW5zdGVhZCBvZgogCSAgLy8gQ2xhc3MuZ2V0TWV0aG9kLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgTGV2ZWwgc3ViY2xhc3MKIAkgIC8vIGltcGxlbWVudHMgdGhlIHRvTGV2ZWwoaW50KSBtZXRob2Qgd2hpY2ggaXMgYQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvUm9vdENhdGVnb3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Sb290Q2F0ZWdvcnkuamF2YQppbmRleCA3ZWM4MGI0Li5mODNlMGVjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Sb290Q2F0ZWdvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Sb290Q2F0ZWdvcnkuamF2YQpAQCAtMTMsMTYgKzEzLDcgQEAKIC8vIENvbnRpYnV0b3JzOiBNYXRoaWFzIEJvZ2FlcnQKIAogLyoqCi0gICBSb290Q2F0ZWdvcnkgc2l0cyBhdCB0aGUgdG9wIG9mIHRoZSBjYXRlZ29yeSBoaWVyYWNoeS4gSXQgaXMgYQotICAgcmVndWxhciBjYXRlZ29yeSBleGNlcHQgdGhhdCBpdCBwcm92aWRlcyBzZXZlcmFsIGd1YXJhbnRlZXMuCi0KLSAgIDxwPkZpcnN0LCBpdCBjYW5ub3QgYmUgYXNzaWduZWQgYSA8Y29kZT5udWxsPC9jb2RlPgotICAgcHJpb3JpdHkuIFNlY29uZCwgc2luY2Ugcm9vdCBjYXRlZ29yeSBjYW5ub3QgaGF2ZSBhIHBhcmVudCwgdGhlCi0gICB7QGxpbmsgI2dldENoYWluZWRMZXZlbH0gbWV0aG9kIGFsd2F5cyByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUKLSAgIGxldmVsIGZpZWxkIHdpdGhvdXQgd2Fsa2luZyB0aGUgaGllcmFyY2h5LgotCi0gICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7Ci0KKyAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHtAbGluayBSb290TG9nZ2VyfS4gIAogICovCiBmaW5hbCBwdWJsaWMgY2xhc3MgUm9vdENhdGVnb3J5IGV4dGVuZHMgTG9nZ2VyIHsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvUm9vdExvZ2dlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvUm9vdExvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmRiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9Sb290TG9nZ2VyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGouc3BpOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai4qOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouaGVscGVycy5Mb2dMb2c7CisKKworLy8gQ29udGlidXRvcnM6IE1hdGhpYXMgQm9nYWVydAorCisvKioKKyAgIFJvb3RMb2dnZXIgc2l0cyBhdCB0aGUgdG9wIG9mIHRoZSBsb2dnZXIgaGllcmFjaHkuIEl0IGlzIGEKKyAgIHJlZ3VsYXIgbG9nZ2VyIGV4Y2VwdCB0aGF0IGl0IHByb3ZpZGVzIHNldmVyYWwgZ3VhcmFudGVlcy4KKworICAgPHA+Rmlyc3QsIGl0IGNhbm5vdCBiZSBhc3NpZ25lZCBhIDxjb2RlPm51bGw8L2NvZGU+CisgICBsZXZlbC4gU2Vjb25kLCBzaW5jZSByb290IGxvZ2dlciBjYW5ub3QgaGF2ZSBhIHBhcmVudCwgdGhlCisgICB7QGxpbmsgI2dldENoYWluZWRMZXZlbH0gbWV0aG9kIGFsd2F5cyByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUKKyAgIGxldmVsIGZpZWxkIHdpdGhvdXQgd2Fsa2luZyB0aGUgaGllcmFyY2h5LgorCisgICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7CisKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJvb3RMb2dnZXIgZXh0ZW5kcyBMb2dnZXIgeworICAvKioKKyAgICAgVGhlIHJvb3QgbG9nZ2VyIG5hbWVzIGl0c2VsZiBhcyAicm9vdCIuIEhvd2V2ZXIsIHRoZSByb290CisgICAgIGxvZ2dlciBjYW5ub3QgYmUgcmV0cmlldmVkIGJ5IG5hbWUuCisgICovCisgIHB1YmxpYyBSb290TG9nZ2VyKExldmVsIGxldmVsKSB7CisgICAgc3VwZXIoInJvb3QiKTsKKyAgICBzZXRMZXZlbChsZXZlbCk7CisgIH0KKworICAvKioKKyAgICAgUmV0dXJuIHRoZSBhc3NpZ25lZCBsZXZlbCB2YWx1ZSB3aXRob3V0IHdhbGtpbmcgdGhlIGxvZ2dlcgorICAgICBoaWVyYXJjaHkuCisgICovCisgIHB1YmxpYyBmaW5hbCBMZXZlbCBnZXRDaGFpbmVkTGV2ZWwoKSB7CisgICAgcmV0dXJuIGxldmVsOworICB9CisKKyAgLyoqCisgICAgIFNldHRpbmcgYSBudWxsIHZhbHVlIHRvIHRoZSBsZXZlbCBvZiB0aGUgcm9vdCBsb2dnZXIgbWF5IGhhdmUgY2F0YXN0cm9waGljCisgICAgIHJlc3VsdHMuIFdlIHByZXZlbnQgdGhpcyBoZXJlLgorCisgICAgIEBzaW5jZSAwLjguMyAqLworICBwdWJsaWMgZmluYWwgdm9pZCBzZXRMZXZlbChMZXZlbCBsZXZlbCkgeworICAgIGlmIChsZXZlbCA9PSBudWxsKSB7CisgICAgICBMb2dMb2cuZXJyb3IoCisgICAgICAgICJZb3UgaGF2ZSB0cmllZCB0byBzZXQgYSBudWxsIGxldmVsIHRvIHJvb3QuIiwgbmV3IFRocm93YWJsZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5sZXZlbCA9IGxldmVsOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9UaHJvd2FibGVJbmZvcm1hdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9zcGkvVGhyb3dhYmxlSW5mb3JtYXRpb24uamF2YQppbmRleCAwNmQxM2MxLi5jNzE0NTdlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3NwaS9UaHJvd2FibGVJbmZvcm1hdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovc3BpL1Rocm93YWJsZUluZm9ybWF0aW9uLmphdmEKQEAgLTEyLDEwICsxMiwxOCBAQAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8qKgotICAgCi0KLQotICovCisgICogVGhyb3dhYmxlSW5mb3JtYXRpb24gaXMgbG9nNGoncyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZgorICAqIHRocm93YWJsZXMuIEl0IGVzc2VudGlhbGx5IGNvbnNpc3RzIG9mIGEgc3RyaW5nIGFycmF5LCBjYWxsZWQKKyAgKiAncmVwJywgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQsIHRoYXQgaXMgcmVwWzBdLCByZXByZXNlbnRzIHRoZQorICAqIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGhyb3dhYmxlIChpLmUuIHRoZSB2YWx1ZSB5b3UgZ2V0CisgICogd2hlbiB5b3UgZG8gdGhyb3dhYmxlLnRvU3RyaW5nKCkpIGFuZCBzdWJzZXF1ZW50IGVsZW1lbnRzCisgICogY29ycmVzcG9uZCB0aGUgc3RhY2sgdHJhY2Ugd2l0aCB0aGUgdG9wIG1vc3QgZW50cnkgb2YgdGhlIHN0YWNrCisgICogY29ycmVzcG9uZGluZyB0byB0aGUgc2Vjb25kIGVudHJ5IG9mIHRoZSAncmVwJyBhcnJheSB0aGF0IGlzCisgICogcmVwWzFdLgorICAqCisgICogQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOworICAqCisgICogKi8KIHB1YmxpYyBjbGFzcyBUaHJvd2FibGVJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKIAogICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ3NDg3NjU1NjY4NjQzMjI3MzVMOwpAQCAtNDEsMTIgKzQ5LDIwIEBACiAgICAgICBWZWN0b3JXcml0ZXIgdncgPSBuZXcgVmVjdG9yV3JpdGVyKCk7CiAgICAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHZ3KTsKICAgICAgIHJlcCA9IHZ3LnRvU3RyaW5nQXJyYXkoKTsKLSAgICAgIHZ3LmNsZWFyKCk7CiAgICAgICByZXR1cm4gcmVwOwogICAgIH0KICAgfQogfQogCisvKioKKyAgKiBWZWN0b3JXcml0ZXIgaXMgYSBzZWVtaW5nbHkgdHJpdmlhbCBpbXBsZW10YW50aW9uIG9mIFByaW50V3JpdGVyLgorICAqIFRoZSB0aHJvd2FibGUgaW5zdGFuY2UgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIHJlcHJlc250IGlzIGFza2VkIHRvCisgICogcHJpbnQgaXRzZWxmIHRvIGEgVmVjdG9yV3JpdGVyLiAKKyAgKgorICAqIEJ5IG91ciBkZXNpZ24gY2hvaWNlLCByIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGhyb3dhYmxlCisgICogZG9lcyBub3QgY29udGFpbiBhbnkgbGluZSBzZXBhcmF0b3JzLiBJdCBmb2xsb3dzIHRoYXQgcHJpbnRsbigpCisgICogbWV0aG9kcyBvZiBWZWN0b3JXcml0ZXIgaWdub3JlIHRoZSAnbG4nIHBhcnQuCisgICogKi8KIGNsYXNzIFZlY3RvcldyaXRlciBleHRlbmRzIFByaW50V3JpdGVyIHsKICAgICAKICAgcHJpdmF0ZSBWZWN0b3IgdjsKQEAgLTU2LDM0ICs3MiwyNyBAQAogICAgIHYgPSBuZXcgVmVjdG9yKCk7CiAgIH0KIAotICAvLyBTdXBwb3J0IGZvciBPcmlvbgotICBwdWJsaWMKLSAgdm9pZCBwcmludChPYmplY3QgbykgeyAgICAgIAorICBwdWJsaWMgdm9pZCBwcmludChPYmplY3QgbykgeyAgICAgIAogICAgIHYuYWRkRWxlbWVudChvLnRvU3RyaW5nKCkpOwogICB9CiAgIAotICAvLyBTdXBwb3J0IGZvciBPcmlvbgotICBwdWJsaWMKLSAgdm9pZCBwcmludChjaGFyW10gcykgewotICAgIHYuYWRkRWxlbWVudChuZXcgU3RyaW5nKHMpKTsKKyAgcHVibGljIHZvaWQgcHJpbnQoY2hhcltdIGNoYXJzKSB7CisgICAgdi5hZGRFbGVtZW50KG5ldyBTdHJpbmcoY2hhcnMpKTsKICAgfQogICAKLSAgLy8gU3VwcG9ydCBmb3IgT3Jpb24KLSAgcHVibGljCi0gIHZvaWQgcHJpbnQoU3RyaW5nIHMpIHsKKyAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHMpIHsKICAgICB2LmFkZEVsZW1lbnQocyk7CiAgIH0KIAotICBwdWJsaWMKLSAgdm9pZCBwcmludGxuKE9iamVjdCBvKSB7ICAgICAgCisgIHB1YmxpYyB2b2lkIHByaW50bG4oT2JqZWN0IG8pIHsgICAgICAKICAgICB2LmFkZEVsZW1lbnQoby50b1N0cmluZygpKTsKICAgfQogICAKICAgLy8gSkRLIDEuMS54IGFwcHJlbmx5IHVzZXMgdGhpcyBmb3JtIG9mIHByaW50bG4gd2hpbGUgaW4KICAgLy8gcHJpbnRTdGFja1RyYWNlKCkKICAgcHVibGljCi0gIHZvaWQgcHJpbnRsbihjaGFyW10gcykgewotICAgIHYuYWRkRWxlbWVudChuZXcgU3RyaW5nKHMpKTsKKyAgdm9pZCBwcmludGxuKGNoYXJbXSBjaGFycykgeworICAgIHYuYWRkRWxlbWVudChuZXcgU3RyaW5nKGNoYXJzKSk7CiAgIH0KICAgCiAgIHB1YmxpYyAgCkBAIC05MSw4ICsxMDAsMjMgQEAKICAgICB2LmFkZEVsZW1lbnQocyk7CiAgIH0KIAotICBwdWJsaWMKLSAgU3RyaW5nW10gdG9TdHJpbmdBcnJheSgpIHsKKyAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGNoYXJzKSB7CisgICAgdi5hZGRFbGVtZW50KG5ldyBTdHJpbmcoY2hhcnMpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBjaGFycywgaW50IG9mZiwgaW50IGxlbikgeworICAgIHYuYWRkRWxlbWVudChuZXcgU3RyaW5nKGNoYXJzLCBvZmYsIGxlbikpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICB2LmFkZEVsZW1lbnQocy5zdWJzdHJpbmcob2ZmLCBvZmYrbGVuKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgcykgeworICAgICB2LmFkZEVsZW1lbnQocyk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nW10gdG9TdHJpbmdBcnJheSgpIHsKICAgICBpbnQgbGVuID0gdi5zaXplKCk7CiAgICAgU3RyaW5nW10gc2EgPSBuZXcgU3RyaW5nW2xlbl07CiAgICAgZm9yKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CkBAIC0xMDEsMjQgKzEyNSwyMCBAQAogICAgIHJldHVybiBzYTsKICAgfQogCi0gIHB1YmxpYwotICB2b2lkIGNsZWFyKCkgewotICAgIHYuc2V0U2l6ZSgwKTsKLSAgfQogfSAgCiAKIGNsYXNzIE51bGxXcml0ZXIgZXh0ZW5kcyBXcml0ZXIgeyAgICAKICAgCi0gIHB1YmxpYyAKLSAgdm9pZCBjbG9zZSgpIHsKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgLy8gYmxhbmsKICAgfQogCi0gIHB1YmxpYyAKLSAgdm9pZCBmbHVzaCgpIHsKKyAgcHVibGljIHZvaWQgZmx1c2goKSB7CisgICAgLy8gYmxhbmsKICAgfQogCi0gIHB1YmxpYwotICB2b2lkIHdyaXRlKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgLy8gYmxhbmsKICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvQXN5bmNBcHBlbmRlclRlc3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9Bc3luY0FwcGVuZGVyVGVzdC5qYXZhCmluZGV4IGIzZWZmN2YuLmI5YTcxMDcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9Bc3luY0FwcGVuZGVyVGVzdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9Bc3luY0FwcGVuZGVyVGVzdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCi0gKiB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkICB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGluCi0gKiB0aGUgTElDRU5TRS5BUEwgZmlsZS4KLSAqLworICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai50ZXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ01hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai54bWwuRE9NQ29uZmlndXJhdG9yOwogCiAvKioKQEAgLTE2LDcgKzE2LDcgQEAKICovCiBwdWJsaWMgY2xhc3MgQXN5bmNBcHBlbmRlclRlc3QgewogCi0gIHN0YXRpYyBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShBc3luY0FwcGVuZGVyVGVzdC5jbGFzcyk7CisgIHN0YXRpYyBMb2dnZXIgY2F0ID0gTG9nZ2VyLmdldExvZ2dlcihBc3luY0FwcGVuZGVyVGVzdC5jbGFzcyk7CiAgIHN0YXRpYyBpbnQgZGVsYXlCZWZvcmVDbG9zZTsKICAgCiAKQEAgLTU0LDEzICs1NCwxMyBAQAogCiAgIHN0YXRpYwogICB2b2lkIHRlc3QoKSB7ICAgIAotICAgIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7ICAgIAorICAgIExvZ2dlciByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsgICAgCiAgICAgZm9yKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7ICAgICAgCiAgICAgICByb290LmRlYnVnKCJNZXNzYWdlICIgKyBpKTsgICAgICAgIAogICAgIH0KIAogICAgIHRyeXtUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKGRlbGF5QmVmb3JlQ2xvc2UpO31jYXRjaChFeGNlcHRpb24gZSl7fQotICAgIENhdGVnb3J5LnNodXRkb3duKCk7CisgICAgTG9nTWFuYWdlci5zaHV0ZG93bigpOwogICB9CiAKICAgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvQmFzZTY0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvQmFzZTY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjFmYzIuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0Jhc2U2NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vICAgICAgQ29weXJpZ2h0IDE5OTYtMTk5OSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAKLS8vICAgICAgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnRlc3Q7Ci0KLWNsYXNzIEJhc2U2NCB7Ci0KLSAgZmluYWwgc3RhdGljIGludCBNQVhfTElORSA9IDc2OwotICAKLSAgc3RhdGljIGJ5dGVbXSBhc2NpaUVuY29kaW5nID0KLSAgICAvL0EgICBCICAgQyAgIEQgICBFICAgRiAgIEcgICBIICAgSSAgIEogICBLICAgTCAgIE0gICBOICAgTyAgIFAgICBRICAKLSAgICB7NjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLAotICAgIC8vUiAgUyAuLi4gICAgICAgICAgICAgICAgICAgICAgICBaICAgYSAgIGIgICBjICAgIGQgICAgZSAgICBmICAgIGcKLSAgICA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsCi0gICAgLy9oICAgIGkgICAgaiAgICBrICAgIGwgICAgbSAgICBuICAgIG8gICAgcCAgICBxICAgIHIgICAgcyAgIHQgICAgIHUKLSAgICAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywKLSAgICAvL3YgICAgdyAgICB4ICAgIHkgICAgeiAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICArICAgLwotICAgIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNDMsIDQ3fTsgCi0KLSAgc3RhdGljIGNoYXJbXSBjaGFyRW5jID0gbmV3IGNoYXJbNjRdOwotCi0gIHN0YXRpYyB7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IDI2OyBpICsrKSB7Ci0gICAgICBjaGFyRW5jW2ldID0gKGNoYXIpICgnQScgKyBpKTsKLSAgICAgIGNoYXJFbmNbaSsyNl0gPSAoY2hhcikgKCdhJyArIGkpOwotICAgIH0KLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkgKyspIHsKLSAgICAgIGNoYXJFbmNbaSs1Ml0gPSAoY2hhcikgKCcwJyArIGkpOwotICAgIH0KLSAgICBjaGFyRW5jWzYyXSA9ICcrJzsKLSAgICBjaGFyRW5jWzYzXSA9ICcvJzsKLSAgfQotCi0gIAotICAKLSAgc3RhdGljCi0gIFN0cmluZyB0b1N0cmluZyhieXRlW10gaW5idWYpIHsKLSAgICByZXR1cm4gdG9TdHJpbmcoaW5idWYsIDAsIGluYnVmLmxlbmd0aCk7Ci0gIH0KLSAgLyoqCi0gICAgIAotICAgKi8KLSAgc3RhdGljCi0gIFN0cmluZyB0b1N0cmluZyhieXRlW10gaW5idWYsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAKLSAgICBTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigobGVuZ3RoKSo0LzMgKyAxKTsKLQotICAgIGludCBpbjsKLSAgICBjaGFyW10gb3V0ID0gbmV3IGNoYXJbNF07Ci0gICAgCi0gICAgaW50IGkgPSBvZmZzZXQ7Ci0gICAgYm9vbGVhbiBlbmRlZCA9IGZhbHNlOwotICAgIGludCBsYXN0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotICAgIGludCBqOwotICAgIGludCBiaXRzUmVhZDsKLSAgICAgICAgCi0gICAgd2hpbGUoIWVuZGVkKSB7Ci0gICAgICBpbiA9IDA7Ci0gICAgICBiaXRzUmVhZCA9IDA7Ci0gICAgICBmb3IoaiA9IDA7IGogPCAzOyBqKyspIHsKLQlpZihpID09IGxhc3QpIHsKLQkgIGVuZGVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLQlpbiA9IChpbiA8PCA4KSB8IChpbmJ1ZltpKytdICYgMHhGRik7Ci0JYml0c1JlYWQgKz0gODsKLSAgICAgIH0KLQotICAgICAgd2hpbGUoYml0c1JlYWQgPj0gNikgewotCWJpdHNSZWFkIC09IDY7Ci0Jb3V0cHV0LmFwcGVuZChjaGFyRW5jWyhpbiA+Pj4gYml0c1JlYWQpICYgMHgzRl0pOwotICAgICAgfQotCi0gICAgICBpZihiaXRzUmVhZCA9PSA0KSB7Ci0Jb3V0cHV0LmFwcGVuZChjaGFyRW5jWyhpbiAmIDB4MEYpIDw8IDJdKTsKLQlvdXRwdXQuYXBwZW5kKCI9Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PSAyKSB7Ci0Jb3V0cHV0LmFwcGVuZChjaGFyRW5jWyhpbiAmIDB4MDMpIDw8IDRdKTsKLQlvdXRwdXQuYXBwZW5kKCI9PSIpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotICAgIGJ5dGVbXSBpbmJ1ZiA9IG5ldyBieXRlW01BWF9MSU5FXTsKLQotICAgIHdoaWxlKHRydWUpIHsKLSAgICAgIHRyeSB7Ci0JaW50IHJlYWQgPSBTeXN0ZW0uaW4ucmVhZChpbmJ1ZiwgMCwgTUFYX0xJTkUpOwotCWlmKHJlYWQgPT0gLTEpIGJyZWFrOwotCVN5c3RlbS5vdXQucHJpbnRsbigiUmVhZCAiICsgcmVhZCArICIgY2hhcnMuIik7Ci0JU3lzdGVtLm91dC5wcmludGxuKEJhc2U2NC50b1N0cmluZyhpbmJ1ZiwgMCwgcmVhZCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gIiArIGUpOwotICAgICAgfQotCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvQ2F0ZWdvcnlXcmFwcGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvQ2F0ZWdvcnlXcmFwcGVyLmphdmEKaW5kZXggZmQ1OTI4ZC4uOTQ3YTJjYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0NhdGVnb3J5V3JhcHBlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9DYXRlZ29yeVdyYXBwZXIuamF2YQpAQCAtMTIsMTEgKzEyLDExIEBACiBwdWJsaWMgY2xhc3MgQ2F0ZWdvcnlXcmFwcGVyIHsKIAogCi0gIENhdGVnb3J5IGM7CisgIExvZ2dlciBjOwogICBzdGF0aWMgU3RyaW5nIEZRQ04gPSBDYXRlZ29yeVdyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpOwogCiAgIENhdGVnb3J5V3JhcHBlcihTdHJpbmcgbmFtZSkgewotICAgIGMgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShuYW1lKTsKKyAgICBjID0gTG9nZ2VyLmdldExvZ2dlcihuYW1lKTsKICAgfQogCiAgIHB1YmxpYyAKQEAgLTM5LDcgKzM5LDcgQEAKICAgdm9pZCBwcmludChTdHJpbmcgbXNnKSB7CiAKICAgICAvLyBZb3UgaGF2ZSB0byBzdXBwbHkgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lZCBvZiB0aGUgd3JhcHBlcgotICAgIC8vIGNsYXNzIHRvIHRoZSBzcGVjaWFsbHkgdGFpbG9yZWQgY2F0ZWdvcnkubG9nIG1ldGhvZCBmb3IKKyAgICAvLyBjbGFzcyB0byB0aGUgc3BlY2lhbGx5IHRhaWxvcmVkIGxvZ2dlci5sb2cgbWV0aG9kIGZvcgogICAgIC8vIFBhdHRlcm5MYXlvdXQncyAlQyBjb252ZXJzaW9uIHBhdHRlcm4gdG8gd29yay4KIAogICAgIC8vIFdlIGhhdmUgdG8gYWRkIHRoZSAiLnByaW50IiBzdHJpbmcgYmVjYXVzZSB0aGUgaW52b2NhdGlvbiBvZgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0NvbmZpZ3VyYXRpb25GaWxlUGFyc2luZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0NvbmZpZ3VyYXRpb25GaWxlUGFyc2luZy5qYXZhCmluZGV4IDBlMjc0ZGYuLjhhMDcyNWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9Db25maWd1cmF0aW9uRmlsZVBhcnNpbmcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvQ29uZmlndXJhdGlvbkZpbGVQYXJzaW5nLmphdmEKQEAgLTMsMTIgKzMsMTMgQEAKICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQogICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcwotICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLkFQTCBmaWxlLiAgKi8KKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai50ZXN0OyAKIAogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJvcGVydHlDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ01hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5OREM7CiAKIHB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmlsZVBhcnNpbmcgewpAQCAtMjAsMTEgKzIxLDExIEBACiAgICAgaWYoYXJndi5sZW5ndGggPT0gMSkgewogICAgICAgTkRDLnB1c2goInRlc3RpbmciKTsKICAgICAgIFByb3BlcnR5Q29uZmlndXJhdG9yLmNvbmZpZ3VyZShhcmd2WzBdKTsKLSAgICAgIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7CisgICAgICBMb2dnZXIgcm9vdCA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCk7CiAgICAgICByb290LmRlYnVnKCJNZXNzYWdlIDEiKTsKICAgICAgIHJvb3QuZGVidWcoIk1lc3NhZ2UgMiIpOyAgICAgIAogICAgICAgTkRDLnBvcCgpOwotICAgICAgQ2F0ZWdvcnkuc2h1dGRvd24oKTsKKyAgICAgIExvZ01hbmFnZXIuc2h1dGRvd24oKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBVc2FnZSgiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4iKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9EUkZBVGVzdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0RSRkFUZXN0LmphdmEKaW5kZXggMDdiMDk2OC4uNjQwODQ1NyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0RSRkFUZXN0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0RSRkFUZXN0LmphdmEKQEAgLTcsNyArNyw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai50ZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxheW91dDsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5BcHBlbmRlcjsKQEAgLTIwLDcgKzIwLDcgQEAKICovCiBwdWJsaWMgY2xhc3MgRFJGQVRlc3QgewogCi0gIHN0YXRpYyBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShEUkZBVGVzdC5jbGFzcyk7CisgIHN0YXRpYyBMb2dnZXIgY2F0ID0gTG9nZ2VyLmdldExvZ2dlcihEUkZBVGVzdC5jbGFzcyk7CiAKICAgc3RhdGljIGludCBsaW1pdDsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0RlZmF1bHRJbml0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvRGVmYXVsdEluaXQuamF2YQppbmRleCA4YzM2MTZkLi4zZjE0Zjc3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvRGVmYXVsdEluaXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvRGVmYXVsdEluaXQuamF2YQpAQCAtMSwxMSArMSwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoudGVzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiAKIHB1YmxpYyBjbGFzcyBEZWZhdWx0SW5pdCB7CiAKLSAgc3RhdGljIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKERlZmF1bHRJbml0LmNsYXNzKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKERlZmF1bHRJbml0LmNsYXNzKTsKIAogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJndikgewogICAgIGNhdC5kZWJ1ZygiSGVsbG8gd29ybGQiKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9EZWxheWVkTG9vcC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0RlbGF5ZWRMb29wLmphdmEKaW5kZXggM2FmNmE0OC4uNTgxMjM1ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0RlbGF5ZWRMb29wLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0RlbGF5ZWRMb29wLmphdmEKQEAgLTcsNyArNyw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai50ZXN0OyAKIAotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnhtbC5ET01Db25maWd1cmF0b3I7CiAKQEAgLTIwLDcgKzIwLDcgQEAKICAgIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdXVtbDsgKi8KIHB1YmxpYyBjbGFzcyBEZWxheWVkTG9vcCB7CiAKLSAgc3RhdGljIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKERlbGF5ZWRMb29wLmNsYXNzKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKERlbGF5ZWRMb29wLmNsYXNzKTsKICAgc3RhdGljIGludCBsb29wTGVuZ3RoOwogCiAgIHB1YmxpYyAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9GUUNOVGVzdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0ZRQ05UZXN0LmphdmEKaW5kZXggNWQ2YTMzNy4uNWI5MmZmMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0ZRQ05UZXN0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0ZRQ05UZXN0LmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICovCiBwdWJsaWMgY2xhc3MgRlFDTlRlc3QgewogCi0gIC8vc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VySW5zdGFuY2UoImRkZGQiKTsKKyAgLy9zdGF0aWMgTG9nZ2VyIGNhdCA9IExvZ2dlci5nZXRMb2dnZXIoImRkZGQiKTsKICAgCiAgIHB1YmxpYyAKICAgc3RhdGljIApAQCAtNDIsNyArNDIsNyBAQAogICAgIExheW91dCBsYXlvdXQgPSBuZXcgUGF0dGVybkxheW91dCgiJXAgJWMgKCVDezJ9IyVNKSAtICVtJW4iKTsKICAgICBGaWxlQXBwZW5kZXIgYXBwZW5kZXIgPSBuZXcgRmlsZUFwcGVuZGVyKGxheW91dCwgZmlsZSwgZmFsc2UpOwogICAgIGFwcGVuZGVyLnNldExheW91dChsYXlvdXQpOwotICAgIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7CisgICAgTG9nZ2VyIHJvb3QgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOwogICAgIHJvb3QuYWRkQXBwZW5kZXIoYXBwZW5kZXIpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9GaW5hbGl6ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0ZpbmFsaXplLmphdmEKaW5kZXggM2M5YzhiYS4uOWUwZjE3YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0ZpbmFsaXplLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0ZpbmFsaXplLmphdmEKQEAgLTMsMTMgKzMsMTMgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai50ZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgRmluYWxpemUgewogCi0gIHN0YXRpYyBDYXRlZ29yeSBDQVQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShGaW5hbGl6ZS5jbGFzcy5nZXROYW1lKCkpOworICBzdGF0aWMgTG9nZ2VyIENBVCA9IExvZ2dlci5nZXRMb2dnZXIoRmluYWxpemUuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICBwdWJsaWMKICAgc3RhdGljCkBAIC00Miw3ICs0Miw3IEBACiAgICAgaW50IGkgPSAtMTsKIAogICAgIElucHV0U3RyZWFtUmVhZGVyIGluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbik7Ci0gICAgQ2F0ZWdvcnkgcm9vdCA9IENhdGVnb3J5LmdldFJvb3QoKTsKKyAgICBMb2dnZXIgcm9vdCA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCk7CiAKICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGUgJ3EnIHRvIHF1aXQiKTsKICAgICBpbnQgaiA9IDA7CkBAIC02OCwxMCArNjgsMTAgQEAKICAgfQogCiAgIHN0YXRpYwotICB2b2lkIGZvbyhDYXRlZ29yeSBjYXQpIHsKLSAgICBFbnVtZXJhdGlvbiBlbnVtID0gY2F0LmdldEFsbEFwcGVuZGVycygpOwotICAgIHdoaWxlKGVudW0gIT0gbnVsbCAmJiBlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAoKG9yZy5hcGFjaGUubG9nNGouQXBwZW5kZXIpIGVudW0ubmV4dEVsZW1lbnQoKSkuY2xvc2UoKTsKKyAgdm9pZCBmb28oTG9nZ2VyIGNhdCkgeworICAgIEVudW1lcmF0aW9uIGVudW1hcmF0aW9uID0gY2F0LmdldEFsbEFwcGVuZGVycygpOworICAgIHdoaWxlKGVudW1hcmF0aW9uICE9IG51bGwgJiYgZW51bWFyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICgob3JnLmFwYWNoZS5sb2c0ai5BcHBlbmRlcikgZW51bWFyYXRpb24ubmV4dEVsZW1lbnQoKSkuY2xvc2UoKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0hlbGxvLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvSGVsbG8uamF2YQppbmRleCBhYzY2M2YzLi4wMjc0NmE1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvSGVsbG8uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvSGVsbG8uamF2YQpAQCAtNyw3ICs3LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnRlc3Q7IAogCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwogCiAvKioKQEAgLTE3LDcgKzE3LDcgQEAKICAqLwogcHVibGljIGNsYXNzIEhlbGxvIHsKIAotICBzdGF0aWMgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoSGVsbG8uY2xhc3MpOworICBzdGF0aWMgTG9nZ2VyIGNhdCA9IExvZ2dlci5nZXRMb2dnZXIoSGVsbG8uY2xhc3MpOwogCiAgIHB1YmxpYyAKICAgc3RhdGljIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0w3RC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L0w3RC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGM2NjNiLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9MN0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQotCi0vLyAgICAgIENvcHlyaWdodCAxOTk2LTIwMDAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgCi0vLyAgICAgIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gCi0vLyAgICAgIFNlZSB0aGUgTElDRU5DRSBmaWxlIGZvciB0aGUgdGVybXMgb2YgZGlzdHJpYnV0aW9uLgotCi1wYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoudGVzdDsgCi0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci0KLS8qKgotICAgVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSB0ZXN0IG9mIHRoZSBsb2NhbGl6YXRpb24gcm91dGluZXMgaW4KLSAgIENhdGVnb3J5IGNsYXNzLgotCi0gICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7LCBJQk0gWnVyaWNoIFJlc2VhcmNoIExhYm9yYXRvcnkgKi8KLXB1YmxpYyBjbGFzcyBMN0QgewotICBzdGF0aWMgUmVzb3VyY2VCdW5kbGVbXSBidW5kbGVzOwotICAKLQotICBwdWJsaWMgCi0gIHN0YXRpYyAKLSAgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLSAgICBpZihhcmdzLmxlbmd0aCA9PSAzKSAKLSAgICAgIGluaXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7Ci0gICAgZWxzZSAKLSAgICAgIFVzYWdlKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLiIpOwotCi0gICAgdGVzdCgpOwotICB9Ci0KLSAgc3RhdGljCi0gIHZvaWQgVXNhZ2UoU3RyaW5nIG1zZykgewotICAgIFN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlVzYWdlOiBqYXZhICIgKyBMN0QuY2xhc3MuZ2V0TmFtZSgpICsKLQkJCSJjb25maWdGaWxlIElTTzYzOUxhbmd1YWdlQ29kZSBJU08yMTY2Q291bnRyeUNvZGUiKTsKLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfQotCi0gIHN0YXRpYwotICB2b2lkIGluaXQoU3RyaW5nIGNvbmZpZ0ZpbGUsIFN0cmluZyBsYW5Db2RlLCBTdHJpbmcgY291bnRyeUNvZGUpIHsKLSAgICBQcm9wZXJ0eUNvbmZpZ3VyYXRvci5jb25maWd1cmUoY29uZmlnRmlsZSk7Ci0gICAgYnVuZGxlcyA9IG5ldyBSZXNvdXJjZUJ1bmRsZVszXTsKLQotICAgIHRyeSB7Ci0gICAgICBidW5kbGVzWzBdID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJMN0QiLCBuZXcgTG9jYWxlKCJlbiIsICJVUyIpKTsKLSAgICAgIGJ1bmRsZXNbMV0gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIkw3RCIsIG5ldyBMb2NhbGUoImZyIiwgIkZSIikpOwotICAgICAgYnVuZGxlc1syXSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiTDdEIiwgbmV3IExvY2FsZSgiZnIiLCAiQ0giKSk7IAotCQkJCQkgCi0gICAgfQotICAgIGNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYwotICB2b2lkIHRlc3QoKSB7IAotICAgIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7Ci0gICAgCi0gICAgZm9yKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHJvb3Quc2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlc1tpXSk7Ci0gICAgICAKLSAgICAgIHJvb3QubDdkbG9nKFByaW9yaXR5LkRFQlVHLCAiYm9ndXMxIiwgbnVsbCk7ICAgICAgICAgICAgCi0gICAgICByb290Lmw3ZGxvZyhQcmlvcml0eS5JTkZPLCAidGVzdCIsIG51bGwpOwotICAgICAgcm9vdC5sN2Rsb2coUHJpb3JpdHkuV0FSTiwgImhlbGxvX3dvcmxkIiwgbnVsbCk7Ci0gICAgICByb290Lmw3ZGxvZyhQcmlvcml0eS5ERUJVRywgIm1zZzEiLAotCQkgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaSsxKSwgImxvZzRqIn0sIG51bGwpOwotICAgICAgcm9vdC5sN2Rsb2coUHJpb3JpdHkuRVJST1IsICJib2d1c01zZyIsCi0JCSAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpKzEpLCAibG9nNGoifSwgbnVsbCk7ICAgICAgCi0gICAgICByb290Lmw3ZGxvZyhQcmlvcml0eS5FUlJPUiwgIm1zZzEiLAotCQkgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaSsxKSwgImxvZzRqIn0sIG51bGwpOwotICAgICAgcm9vdC5sN2Rsb2coUHJpb3JpdHkuSU5GTywgImJvZ3VzMiIsIG51bGwpOwotICAgIH0KLSAgICAKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9NRENTdHJlc3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9NRENTdHJlc3MuamF2YQppbmRleCA5ZTdiOTdjLi4zMTVkMDE4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvTURDU3RyZXNzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L01EQ1N0cmVzcy5qYXZhCkBAIC04LDggKzgsOCBAQAogCiBwdWJsaWMgY2xhc3MgTURDU3RyZXNzIGV4dGVuZHMgVGhyZWFkIHsKIAotICBzdGF0aWMgQ2F0ZWdvcnkgcm9vdCA9IENhdGVnb3J5LmdldFJvb3QoKTsgIAotICBzdGF0aWMgQ2F0ZWdvcnkgbG9nID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoTURDU3RyZXNzLmNsYXNzKTsKKyAgc3RhdGljIExvZ2dlciByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsgIAorICBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoTURDU3RyZXNzLmNsYXNzKTsKIAogICBzdGF0aWMgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oMTcpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvTXVsdGlwbGVBcHBlbmRlcnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9NdWx0aXBsZUFwcGVuZGVycy5qYXZhCmluZGV4IDNmZmQzMzUuLjUwNWYzNjggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9NdWx0aXBsZUFwcGVuZGVycy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9NdWx0aXBsZUFwcGVuZGVycy5qYXZhCkBAIC0yLDcgKzIsNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoudGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5BcHBlbmRlcjsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKQEAgLTE2LDcgKzE2LDcgQEAKICAgICAvLyBBMSBhbmQgQTIgc2hvdWxkIGJlIGFkZGVkIHRvIHJvb3QgYnkgcmVhZGluZyB0aGUgY29uZmlnIGZpbGUKICAgICBQcm9wZXJ0eUNvbmZpZ3VyYXRvci5jb25maWd1cmUoYXJndlswXSk7CiAKLSAgICBDYXRlZ29yeSByb290ID0gQ2F0ZWdvcnkuZ2V0Um9vdCgpOworICAgIExvZ2dlciByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsKIAogICAgIEVudW1lcmF0aW9uIGUxID0gcm9vdC5nZXRBbGxBcHBlbmRlcnMoKTsKICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoMSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvUGF0dGVyblRlc3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9QYXR0ZXJuVGVzdC5qYXZhCmluZGV4IGI3ZmVhZWQuLmI2ZGEyZTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9QYXR0ZXJuVGVzdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9QYXR0ZXJuVGVzdC5qYXZhCkBAIC0yLDcgKzIsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHk7CiAvKioKICAgIFRoaXMgY2xhc3MgaXMgYSB0ZXN0IG9mIHRoZSBQYXR0ZXJuTGF5b3V0IGNsYXNzLgpAQCAtMTAsNyArMTEsNyBAQAogICAgQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOwogKi8KIHB1YmxpYyBjbGFzcyBQYXR0ZXJuVGVzdCB7Ci0gIHN0YXRpYyBDYXRlZ29yeSBDQVQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShQYXR0ZXJuVGVzdC5jbGFzcyk7CisgIHN0YXRpYyBMb2dnZXIgQ0FUID0gTG9nZ2VyLmdldExvZ2dlcihQYXR0ZXJuVGVzdC5jbGFzcyk7CiAKIAogICBwdWJsaWMgCkBAIC00MCw3ICs0MSw3IEBACiAgIHN0YXRpYwogICB2b2lkIHRlc3QoKSB7CiAgICAgaW50IGkgPSAtMTsKLSAgICBDYXRlZ29yeSByb290ID0gQ2F0ZWdvcnkuZ2V0Um9vdCgpOworICAgIExvZ2dlciByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsKICAgICAKICAgICBDQVQuZGVidWcoIk1lc3NhZ2UgIiArICsraSk7CiAgICAgcm9vdC5kZWJ1ZygiTWVzc2FnZSAiICsgaSk7ICAgICAgICAKQEAgLTczLDYgKzc0LDYgQEAKICAgICBDQVQubG9nKFByaW9yaXR5LkZBVEFMLCAiTWVzc2FnZSAiICsgKytpLCBlKTsKICAgICByb290LmxvZyhQcmlvcml0eS5GQVRBTCwgIk1lc3NhZ2UgIiArIGksIGUpOyAgICAKICAgICAKLSAgICBDYXRlZ29yeS5zaHV0ZG93bigpOworICAgIExvZ01hbmFnZXIuc2h1dGRvd24oKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1JPRmlsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1JPRmlsZS5qYXZhCmluZGV4IDRmMzZhMGYuLmM2ZWVlZmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9ST0ZpbGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvUk9GaWxlLmphdmEKQEAgLTEsMTEgKzEsMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai50ZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwogCiBwdWJsaWMgY2xhc3MgUk9GaWxlIHsKIAotICBzdGF0aWMgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoUk9GaWxlLmNsYXNzLmdldE5hbWUoKSk7CisgIHN0YXRpYyBMb2dnZXIgY2F0ID0gTG9nZ2VyLmdldExvZ2dlcihST0ZpbGUuY2xhc3MpOwogCiAgIHB1YmxpYwogICBzdGF0aWMKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9TaGFsbG93LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvU2hhbGxvdy5qYXZhCmluZGV4IDJhMjAyZDAuLmZjNGJiMzMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9TaGFsbG93LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1NoYWxsb3cuamF2YQpAQCAtOCw5ICs4LDExIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoudGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByb3BlcnR5Q29uZmlndXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoueG1sLkRPTUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLk5EQzsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTGV2ZWw7CiAvKioKICAgIFRoaXMgY2xhc3MgaXMgYSBzaGFsbG93IHRlc3Qgb2YgdGhlIHZhcmlvdXMgYXBwZW5kZXJzIGFuZAogICAgbGF5b3V0cy4gSXQgYWxzbyB0ZXN0cyB0aGVpciByZWFkaW5nIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCkBAIC0xOCw3ICsyMCw3IEBACiAqLwogcHVibGljIGNsYXNzIFNoYWxsb3cgewogCi0gIHN0YXRpYyBDYXRlZ29yeSBjYXQgPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShTaGFsbG93LmNsYXNzKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNoYWxsb3cuY2xhc3MpOwogCiAgIHB1YmxpYwogICBzdGF0aWMKQEAgLTQ5LDcgKzUxLDcgQEAKICAgdm9pZCB0ZXN0KCkgewogICAgIGludCBpID0gLTE7CiAgICAgTkRDLnB1c2goIk5EQyIpOwotICAgIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7CisgICAgTG9nZ2VyIHJvb3QgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOwogICAgIGNhdC5kZWJ1ZygiTWVzc2FnZSAiICsgKytpKTsKICAgICByb290LmRlYnVnKCJNZXNzYWdlICIgKyBpKTsKIApAQCAtNjIsOCArNjQsOCBAQAogICAgIGNhdC5lcnJvcigiTWVzc2FnZSAiICsgKytpKTsKICAgICByb290LmVycm9yKCJNZXNzYWdlICIgKyBpKTsKIAotICAgIGNhdC5sb2coUHJpb3JpdHkuRkFUQUwsICJNZXNzYWdlICIgKyArK2kpOwotICAgIHJvb3QubG9nKFByaW9yaXR5LkZBVEFMLCAiTWVzc2FnZSAiICsgaSk7CisgICAgY2F0LmxvZyhMZXZlbC5GQVRBTCwgIk1lc3NhZ2UgIiArICsraSk7CisgICAgcm9vdC5sb2coTGV2ZWwuRkFUQUwsICJNZXNzYWdlICIgKyBpKTsKIAogICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiSnVzdCB0ZXN0aW5nIik7CiAgICAgY2F0LmRlYnVnKCJNZXNzYWdlICIgKyArK2ksIGUpOwpAQCAtNzgsMTQgKzgwLDE0IEBACiAgICAgY2F0LmVycm9yKCJNZXNzYWdlICIgKyArK2ksIGUpOwogICAgIHJvb3QuZXJyb3IoIk1lc3NhZ2UgIiArIGksIGUpOwogCi0gICAgY2F0LmxvZyhQcmlvcml0eS5GQVRBTCwgIk1lc3NhZ2UgIiArICsraSwgZSk7Ci0gICAgcm9vdC5sb2coUHJpb3JpdHkuRkFUQUwsICJNZXNzYWdlICIgKyBpLCBlKTsKKyAgICBjYXQubG9nKExldmVsLkZBVEFMLCAiTWVzc2FnZSAiICsgKytpLCBlKTsKKyAgICByb290LmxvZyhMZXZlbC5GQVRBTCwgIk1lc3NhZ2UgIiArIGksIGUpOwogCi0gICAgcm9vdC5zZXRQcmlvcml0eShQcmlvcml0eS5GQVRBTCk7CisgICAgcm9vdC5zZXRMZXZlbChMZXZlbC5GQVRBTCk7CiAKICAgICAvLyBJdCBpcyBhbHdheXMgYSBnb29kIGlkZWEgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aGVuIGV4aXRpbmcgYW4KICAgICAvLyBhcHBsaWNhdGlvbi4KLSAgICBDYXRlZ29yeS5zaHV0ZG93bigpOworICAgIExvZ01hbmFnZXIuc2h1dGRvd24oKTsKICAgfQogCiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9TaG9ydFNvY2tldFNlcnZlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1Nob3J0U29ja2V0U2VydmVyLmphdmEKaW5kZXggZTFiYTM2Yi4uNWViMDJjYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1Nob3J0U29ja2V0U2VydmVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1Nob3J0U29ja2V0U2VydmVyLmphdmEKQEAgLTUsNyArNSw4IEBACiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJvcGVydHlDb25maWd1cmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLkxvZ0xvZzsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXROb2RlOwpAQCAtMTUsNyArMTYsNyBAQAogCiBwdWJsaWMgY2xhc3MgU2hvcnRTb2NrZXRTZXJ2ZXIgIHsKIAotICBzdGF0aWMgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoU2hvcnRTb2NrZXRTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNob3J0U29ja2V0U2VydmVyLmNsYXNzLmdldE5hbWUoKSk7CiAKICAgc3RhdGljIGludCBwb3J0OwogCkBAIC0zNSw3ICszNiw3IEBACiAgICAgICBTb2NrZXQgc29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOwogICAgICAgTG9nTG9nLmRlYnVnKCJDb25uZWN0ZWQgdG8gY2xpZW50IGF0ICIgKyBzb2NrZXQuZ2V0SW5ldEFkZHJlc3MoKSk7CiAgICAgICBMb2dMb2cuZGVidWcoIlN0YXJ0aW5nIG5ldyBzb2NrZXQgbm9kZS4iKTsKLSAgICAgIFNvY2tldE5vZGUgc24gPSBuZXcgU29ja2V0Tm9kZShzb2NrZXQsIENhdGVnb3J5LmdldERlZmF1bHRIaWVyYXJjaHkoKSk7CisgICAgICBTb2NrZXROb2RlIHNuID0gbmV3IFNvY2tldE5vZGUoc29ja2V0LCBMb2dNYW5hZ2VyLmdldExvZ2dlclJlcG9zaXRvcnkoKSk7CiAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoc24pOwogICAgICAgdC5zdGFydCgpOwogICAgICAgdC5qb2luKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvU3RyZXNzQXN5bmNBcHBlbmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1N0cmVzc0FzeW5jQXBwZW5kZXIuamF2YQppbmRleCA1NDlmNjA5Li40ZjMyY2NiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvU3RyZXNzQXN5bmNBcHBlbmRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9TdHJlc3NBc3luY0FwcGVuZGVyLmphdmEKQEAgLTQsNyArNCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoudGVzdDsKIAogCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnhtbC5ET01Db25maWd1cmF0b3I7CiAKIApAQCAtMTYsNyArMTYsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU3RyZXNzQXN5bmNBcHBlbmRlciBleHRlbmRzIFRocmVhZCB7CiAKLSAgc3RhdGljIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7CisgIHN0YXRpYyBMb2dnZXIgcm9vdCA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCk7CiAKICAgc3RhdGljIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKDEwMSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9TdHJlc3NOREMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9TdHJlc3NOREMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5Mzc3NC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvU3RyZXNzTkRDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8gICAgICBDb3B5cmlnaHQgMTk5Ni0xOTk5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCi0vLyAgICAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai50ZXN0OwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5OREM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi0vKioKLSAgIFN0cmVzcyB0ZXN0IHtAbGluayBOREN9LgotCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJlc3NOREMgZXh0ZW5kcyBUaHJlYWQgewotCi0gIHN0YXRpYyBDYXRlZ29yeSByb290ID0gQ2F0ZWdvcnkuZ2V0Um9vdCgpOwotCi0gIHN0YXRpYyBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgxMDEpOwotCi0gIHN0YXRpYyBmaW5hbCBpbnQgTE9PUF9MRU5HVEggPSAyNDsKLSAgc3RhdGljIGZpbmFsIGludCBQVVNIX01JU1MgPSBMT09QX0xFTkdUSC8yOwotICBzdGF0aWMgZmluYWwgaW50IFBPUF9NSVNTID0gUFVTSF9NSVNTKjI7Ci0KLSAgc3RhdGljIGZpbmFsIGludCBCUkFOQ0hJTkdfRkFDVE9SID0gNCArIDE7IC8vIGFkZCAxIHRvIHRoZSBudW1iZXIgeW91IHdhbnQKLQotICBzdGF0aWMgaW50IG1heFRocmVhZHM7Ci0gIHN0YXRpYyBpbnQgbXNnQ291bnRlciA9IDA7Ci0gIHN0YXRpYyBpbnQgdGhyZWFkQ291bnRlciA9IDA7Ci0KLSAgc3RhdGljIGRvdWJsZSBMT0dfMiA9IE1hdGgubG9nKDIpOwotCi0gIHN0YXRpYyBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLQotCi0gIHB1YmxpYwotICBzdGF0aWMKLSAgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLSAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLQotICAgIGlmKGFyZ3MubGVuZ3RoICE9IDEpIHsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIG1heFRocmVhZHMgPSAgSW50ZWdlci5wYXJzZUludChhcmdzWzBdKTsKLSAgICB9Ci0gICAgY2F0Y2goamF2YS5sYW5nLk51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLQotICAgIHJvb3QuZGVidWcoICJwdXNoKElQPTEyNy4wLjAuMSkiKTsKLQotICAgIE5EQy5wdXNoKCJJUD0xMjcuMC4wLjEiKTsKLQotICAgIHdoaWxlKHRydWUpIHsKLSAgICAgIHN5bmNocm9uaXplZChsb2NrKSB7Ci0JLy8gQWRkaW5nIDEgdG8gZW5zdXJlIHRoYXQgYXQgbGVhc3QgMSBjaGlsZCBpcyBjcmVhdGVkLgotCWNyZWF0ZUNoaWxkcmVuKHJhbmRvbUludChCUkFOQ0hJTkdfRkFDVE9SKSArIDEpOwotCi0JLy8gd2FpdCB1bnRpbCBhbGwgdGhyZWFkcyBhcmUgZmluaXNoZWQKLQl0cnkgewotCSAgcm9vdC5kZWJ1ZyggIkFib3V0IHRvIHdhaXQgZm9yIG5vdGlmaWNhdGlvbi4iKTsKLQkgIGxvY2sud2FpdCgpOwotCSAgcm9vdC5kZWJ1ZyggIkdvdCBhIG5vdGlmaWNhdGlvbi4iKTsKLQl9Ci0JY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCSAgcm9vdC53YXJuKCJVbnBleHRlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiByZWNlaXZlZC4iLCBlKTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljCi0gIHZvaWQgdXNhZ2UoKSB7Ci0gICAgU3lzdGVtLmVyci5wcmludGxuKCAiVXNhZ2U6IGphdmEgb3JnLmFwYWNoZS5sb2c0ai50ZXN0LlN0cmVzc05EQyAiICsKLQkJCSJNQVhfVEhSRUFEUyIpOwotICAgIFN5c3RlbS5leGl0KDEpOwotICB9Ci0KLQotICBTdGFjayBwYXJlbnREQzsKLQotICBwdWJsaWMKLSAgU3RyZXNzTkRDKFN0YWNrIHBhcmVudERDKSB7Ci0gICAgdGhpcy5zZXROYW1lKHJhbmRvbUlEKCkpOwotICAgIHRoaXMucGFyZW50REMgPSBwYXJlbnREQzsKLSAgfQotCi0gIHB1YmxpYwotICB2b2lkIHJ1bigpIHsKLSAgICBOREMuaW5oZXJpdChwYXJlbnREQyk7Ci0KLSAgICBpbnQgbG9vcExlbmd0aCA9IFN0cmVzc05EQy5yYW5kb21JbnQoTE9PUF9MRU5HVEgpOwotICAgIHJvb3QuZGVidWcoIkluIHJ1biBsb29wLmRlYnVnKCBsb29wTGVuZ3RoID0gIitsb29wTGVuZ3RoKTsKLQotICAgIGludCBjcmVhdGVJbmRleCA9IGxvb3BMZW5ndGgvMjsKLQotICAgIGZvcihpbnQgaSA9IDA7IGkgPD0gbG9vcExlbmd0aDsgaSsrKSB7Ci0KLSAgICAgIGlmKGkgPT0gY3JlYXRlSW5kZXgpCi0JY3JlYXRlQ2hpbGRyZW4ocmFuZG9tSW50KEJSQU5DSElOR19GQUNUT1IpKTsKLQotICAgICAgaWYocmFuZG9tSW50KFBVU0hfTUlTUykgPT0gMCkgewotCVN0cmluZyBpZCA9IHJhbmRvbUlEKCk7Ci0Jcm9vdC5kZWJ1ZyggInB1c2goIitpZCsiKSIpOwotCU5EQy5wdXNoKGlkKTsKLSAgICAgIH0KLSAgICAgIHJvb3QuZGVidWcoICJNZXNzYWdlIG51bWJlciAiICsgU3RyZXNzTkRDLm1zZ0NvdW50ZXIrKyk7Ci0gICAgICBpZihyYW5kb21JbnQoUE9QX01JU1MpID09IDApIHsKLQlyb290LmRlYnVnKCAicG9wKCkiKTsKLQlOREMucG9wKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkKGxvY2spIHsKLSAgICAgIFN0cmVzc05EQy50aHJlYWRDb3VudGVyLS07Ci0gICAgICByb290LmRlYnVnKCAiRXhpdGluZyBydW4gbG9vcC4gIiArIHRocmVhZENvdW50ZXIpOwotICAgICAgaWYoU3RyZXNzTkRDLnRocmVhZENvdW50ZXIgPD0gMCkgewotCXJvb3QuZGVidWcoICJOb3RpZnlpbmcgW21haW5dIHRocmVhZC4iKTsKLQlsb2NrLm5vdGlmeSgpOyAvLyB3YWtlIHVwIHRoZSBtYWluIHRocmVhZAotICAgICAgfQotICAgIH0KLQotICAgIC8vIFdlIHNvbWV0aW1lcyBmb3JnZXQgdG8gcmVtb3ZlIHJlZmVyZW5jZXMKLSAgICBpZigobG9vcExlbmd0aCAlIDIpID09IDApIHsKLSAgICAgIHJvb3QuZGVidWcoIlJlbW92aW5nIE5EQyBmb3IgdGhpcyB0aHJlYWQuIik7Ci0gICAgICBOREMucmVtb3ZlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljCi0gIHN0YXRpYwotICB2b2lkIGNyZWF0ZUNoaWxkcmVuKGludCBuKSB7Ci0gICAgaWYgKG4gPD0gMCkKLSAgICAgIHJldHVybjsKLQotICAgIHN5bmNocm9uaXplZChsb2NrKSB7Ci0gICAgICBuID0gbWF4VGhyZWFkc0NvbnN0YWluZWQobik7Ci0gICAgICByb290LmRlYnVnKCJDcmVhdGluZyAiICsgbisgIiBjaGlsZCBTdHJlc3NOREMgdGhyZWFkcy4iKTsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQlyb290LmRlYnVnKCJOZXcgU3RyZXNzTkRDLCB0aHJlYWRDb3VudGVyID0gIiArICgrK3RocmVhZENvdW50ZXIpKTsKLQluZXcgU3RyZXNzTkRDKE5EQy5jbG9uZVN0YWNrKCkpLnN0YXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljCi0gIHB1YmxpYwotICBpbnQgbWF4VGhyZWFkc0NvbnN0YWluZWQoaW50IGEpIHsKLSAgICBpbnQgbWF4QWxsb3dlZCA9IFN0cmVzc05EQy5tYXhUaHJlYWRzIC0gU3RyZXNzTkRDLnRocmVhZENvdW50ZXI7Ci0gICAgcmV0dXJuIGEgPD0gbWF4QWxsb3dlZCA/IGEgOiBtYXhBbGxvd2VkOwotICB9Ci0KLSAgLyoqCi0gICAgIFJldHVybiBhIHJhbmRvbSB2YWx1ZSBpbiB0aGUgcmFuZ2UKLSAgICovCi0gIHB1YmxpYwotICBzdGF0aWMKLSAgaW50IHJhbmRvbUludChpbnQgbikgewotICAgIGludCByID0gcmFuZG9tLm5leHRJbnQoKSAlIG47Ci0gICAgcmV0dXJuIHIgPj0gMCA/IHIgOiAtcjsKLSAgfQotCi0gIHB1YmxpYwotICBzdGF0aWMKLSAgU3RyaW5nIHJhbmRvbUlEKCkgewotICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHJhbmRvbS5uZXh0SW50KCkmIDB4RkZGRkZGKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1N5c291dENvbmZpZ3VyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai90ZXN0L1N5c291dENvbmZpZ3VyYXRvci5qYXZhCmluZGV4IGFhODdjODUuLjIwMDdjZTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdGVzdC9TeXNvdXRDb25maWd1cmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3Rlc3QvU3lzb3V0Q29uZmlndXJhdG9yLmphdmEKQEAgLTUsMTQgKzUsMTQgQEAKIAogLyoqCiAgKiBUaGlzIGNvbmZpZ3VyYXRvciBzaW1wbHkgYWx3YXlzIGFkZHMgYSBGaWxlQXBwZW5kZXIgd3JpdGluZyB0bwotICogU3lzdGVtLm91dCB0byB0aGUgcm9vdCBDYXRlZ29yeSBhbmQgaWdub3JlcyB3aGF0ZXZlciBpcyBpbiB0aGUKKyAqIFN5c3RlbS5vdXQgdG8gdGhlIHJvb3QgTG9nZ2VyIGFuZCBpZ25vcmVzIHdoYXRldmVyIGlzIGluIHRoZQogICogcHJvcGVydGllcyBmaWxlLgogICovCiBwdWJsaWMgY2xhc3MgU3lzb3V0Q29uZmlndXJhdG9yIGltcGxlbWVudHMgQ29uZmlndXJhdG9yIHsKICAgcHVibGljCiAgIHZvaWQKICAgZG9Db25maWd1cmUoamF2YS5uZXQuVVJMIHVybCwgIExvZ2dlclJlcG9zaXRvcnkgaGllcmFyY2h5KSB7Ci0gICAgQ2F0ZWdvcnkuZ2V0Um9vdCgpLmFkZEFwcGVuZGVyKAorICAgIExvZ2dlci5nZXRSb290TG9nZ2VyKCkuYWRkQXBwZW5kZXIoCiAgICAgICAgIG5ldyBDb25zb2xlQXBwZW5kZXIoCiAgICAgICAgICAgICBuZXcgU2ltcGxlTGF5b3V0KCksIENvbnNvbGVBcHBlbmRlci5TWVNURU1fT1VUKSk7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvRXh0ZXJuYWxseVJvbGxlZEZpbGVBcHBlbmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9FeHRlcm5hbGx5Um9sbGVkRmlsZUFwcGVuZGVyLmphdmEKaW5kZXggNzM2YWJlMS4uYTQ4NjE5ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9FeHRlcm5hbGx5Um9sbGVkRmlsZUFwcGVuZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9FeHRlcm5hbGx5Um9sbGVkRmlsZUFwcGVuZGVyLmphdmEKQEAgLTEsMTAgKzEsOSBAQAogLyoKICAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKLSAqIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBMSUNFTlNFLkFQTCBmaWxlLgotICovCisgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQorICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnZhcmlhOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL0ZhbGxiYWNrRXJyb3JIYW5kbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL0ZhbGxiYWNrRXJyb3JIYW5kbGVyLmphdmEKaW5kZXggYTdlYmI5Zi4uMThjY2IzZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9GYWxsYmFja0Vycm9ySGFuZGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvRmFsbGJhY2tFcnJvckhhbmRsZXIuamF2YQpAQCAtMTYsMTYgKzE2LDE3IEBACiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKICAKIC8qKgotCi0gICBUaGUgPGNvZGU+RmFsbGJhY2tFcnJvckhhbmRsZXI8L2NvZGU+IGltcGxlbWVudHMgdGhlIEVycm9ySGFuZGxlcgotICAgaW50ZXJmYWNlIHN1Y2ggdGhhdCBhIHNlY29uZGFyeSBhcHBlbmRlciBtYXkgYmUgc3BlY2lmaWVkLiAgVGhpcwotICAgc2Vjb25kYXJ5IGFwcGVuZGVyIHRha2VzIG92ZXIgaWYgdGhlIHByaW1hcnkgYXBwZW5kZXIgZmFpbHMgZm9yCi0gICB3aGF0ZXZlciByZWFzb24uCi0KLSAgIDxwPlRoZSBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQgb24gPGNvZGU+U3lzdGVtLmVycjwvY29kZT4sIGFuZAotICAgbG9nZ2VkIGluIHRoZSBuZXcgc2Vjb25kYXJ5IGFwcGVuZGVyLgotCi0qLworICAqCisgICogVGhlIDxjb2RlPkZhbGxiYWNrRXJyb3JIYW5kbGVyPC9jb2RlPiBpbXBsZW1lbnRzIHRoZSBFcnJvckhhbmRsZXIKKyAgKiBpbnRlcmZhY2Ugc3VjaCB0aGF0IGEgc2Vjb25kYXJ5IGFwcGVuZGVyIG1heSBiZSBzcGVjaWZpZWQuICBUaGlzCisgICogc2Vjb25kYXJ5IGFwcGVuZGVyIHRha2VzIG92ZXIgaWYgdGhlIHByaW1hcnkgYXBwZW5kZXIgZmFpbHMgZm9yCisgICogd2hhdGV2ZXIgcmVhc29uLgorICAqCisgICogPHA+VGhlIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZCBvbiA8Y29kZT5TeXN0ZW0uZXJyPC9jb2RlPiwgYW5kCisgICogbG9nZ2VkIGluIHRoZSBuZXcgc2Vjb25kYXJ5IGFwcGVuZGVyLgorICAqCisgICogQGF1dGhvciBDZWtpIEcmdXVtbDtjJnV1bWw7CisgICogKi8KIHB1YmxpYyBjbGFzcyBGYWxsYmFja0Vycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7CiAKIApAQCAtNzMsMTMgKzc0LDE1IEBACiAgICAqLwogICBwdWJsaWMKICAgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUsIGludCBlcnJvckNvZGUsIExvZ2dpbmdFdmVudCBldmVudCkgeworICAgIExvZ0xvZy5kZWJ1ZygiRkI6IFRoZSBmb2xsb3dpbmcgZXJyb3IgcmVwb3J0ZWQ6ICIgKyBtZXNzYWdlLCBlKTsKKyAgICBMb2dMb2cuZGVidWcoIkZCOiBJTklUSUFUSU5HIEZBTExCQUNLIFBST0NFRFVSRS4iKTsKICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbG9nZ2Vycy5zaXplKCk7IGkrKykgewogICAgICAgTG9nZ2VyIGwgPSAoTG9nZ2VyKSBsb2dnZXJzLmVsZW1lbnRBdChpKTsKLSAgICAgIExvZ0xvZy5kZWJ1ZygiRkI6IFNlYXJjaGluZyBmb3IgWyIrcHJpbWFyeS5nZXROYW1lKCkrIl0gaW4gbG9nZ2VyIgotCQkgICArbC5nZXROYW1lKCkpOworICAgICAgTG9nTG9nLmRlYnVnKCJGQjogU2VhcmNoaW5nIGZvciBbIitwcmltYXJ5LmdldE5hbWUoKSsiXSBpbiBsb2dnZXIgWyIKKwkJICAgK2wuZ2V0TmFtZSgpICsgIl0uIik7CiAgICAgICAvL2lmKGwuaXNBdHRhY2hlZChwcmltYXJ5KSkgewogICAgICAgTG9nTG9nLmRlYnVnKCJGQjogUmVwbGFjaW5nIFsiK3ByaW1hcnkuZ2V0TmFtZSgpKyJdIGJ5IFsiCi0JCSAgICsgYmFja3VwLmdldE5hbWUoKSArICIgaW4gbG9nZ2VyIisgbCk7CisJCSAgICsgYmFja3VwLmdldE5hbWUoKSArICJdIGluIGxvZ2dlciBbIisgbC5nZXROYW1lKCkgKyJdLiIpOwogICAgICAgbC5yZW1vdmVBcHBlbmRlcihwcmltYXJ5KTsKICAgICAgIExvZ0xvZy5kZWJ1ZygiRkI6IEFkZGluZyBhcHBlbmRlciBbIitiYWNrdXAuZ2V0TmFtZSgpKyJdIHRvIGxvZ2dlciAiCiAJCSAgICsgIGwuZ2V0TmFtZSgpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvTGV2ZWxNYXRjaEZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9MZXZlbE1hdGNoRmlsdGVyLmphdmEKaW5kZXggYjAyOGM4My4uMWQ0N2M0YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9MZXZlbE1hdGNoRmlsdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9MZXZlbE1hdGNoRmlsdGVyLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQogICogdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCAgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIExJQ0VOU0UuQVBMIGZpbGUuCisgKiB0aGUgTElDRU5TRS50eHQgZmlsZS4KICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoudmFyaWE7CkBAIC03OSw3ICs3OSw3IEBACiAgICAgfQogICAgIAogICAgIGJvb2xlYW4gbWF0Y2hPY2N1cmVkID0gZmFsc2U7Ci0gICAgaWYodGhpcy5sZXZlbFRvTWF0Y2guZXF1YWxzKGV2ZW50LmxldmVsKSkgeworICAgIGlmKHRoaXMubGV2ZWxUb01hdGNoLmVxdWFscyhldmVudC5nZXRMZXZlbCgpKSkgewogICAgICAgbWF0Y2hPY2N1cmVkID0gdHJ1ZTsKICAgICB9IAogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL0xldmVsUmFuZ2VGaWx0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvTGV2ZWxSYW5nZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZWZiNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL0xldmVsUmFuZ2VGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCisgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoudmFyaWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnNwaS5Mb2dnaW5nRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLkxvZ0xvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuT3B0aW9uQ29udmVydGVyOworCisvKioKKyAgIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBmaWx0ZXIgYmFzZWQgb24gbGV2ZWwgbWF0Y2hpbmcsIHdoaWNoIGNhbiBiZQorICAgdXNlZCB0byByZWplY3QgbWVzc2FnZXMgd2l0aCBwcmlvcml0aWVzIG91dHNpZGUgYSBjZXJ0YWluIHJhbmdlLgorICAgCisgICA8cD5UaGUgZmlsdGVyIGFkbWl0cyB0aHJlZSBvcHRpb25zIDxiPkxldmVsTWluPC9iPiwgPGI+TGV2ZWxNYXg8L2I+CisgICBhbmQgPGI+QWNjZXB0T25NYXRjaDwvYj4uCisKKyAgIDxwPklmIHRoZSBsZXZlbCBvZiB0aGUge0BsaW5rIExvZ2dpbmdFdmVudH0gaXMgbm90IGJldHdlZW4gTWluIGFuZCBNYXgKKyAgIChpbmNsdXNpdmUpLCB0aGVuIHtAbGluayBGaWx0ZXIjREVOWX0gaXMgcmV0dXJuZWQuCisgICAKKyAgIDxwPiBJZiB0aGUgTG9nZ2luZyBldmVudCBsZXZlbCBpcyB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZSwgdGhlbiBpZgorICAgPGI+QWNjZXB0T25NYXRjaDwvYj4gaXMgdHJ1ZSwge0BsaW5rIEZpbHRlciNBQ0NFUFR9IGlzIHJldHVybmVkLCBhbmQgaWYKKyAgIDxiPkFjY2VwdE9uTWF0Y2g8L2I+IGlzIGZhbHNlLCB7QGxpbmsgRmlsdGVyI05FVVRSQUx9IGlzIHJldHVybmVkLgorICAgCisgICA8cD5JZiA8Y29kZT5MZXZlbE1pbjwvY29kZT53IGlzIG5vdCBkZWZpbmVkLCB0aGVuIHRoZXJlIGlzIG5vCisgICBtaW5pbXVtIGFjY2VwdGFibGUgbGV2ZWwgKGllIGEgbGV2ZWwgaXMgbmV2ZXIgcmVqZWN0ZWQgZm9yCisgICBiZWluZyB0b28gImxvdyIvdW5pbXBvcnRhbnQpLiAgSWYgPGNvZGU+TGV2ZWxNYXg8L2NvZGU+IGlzIG5vdAorICAgZGVmaW5lZCwgdGhlbiB0aGVyZSBpcyBubyBtYXhpbXVtIGFjY2VwdGFibGUgbGV2ZWwgKGllIGEKKyAgIGxldmVsIGlzIG5ldmVyIHJlamVjdGVkIGZvciBiZWVpbmcgdG9vICJoaWdoIi9pbXBvcnRhbnQpLgorCisgICA8cD5SZWZlciB0byB0aGUge0BsaW5rCisgICBvcmcuYXBhY2hlLmxvZzRqLkFwcGVuZGVyU2tlbGV0b24jc2V0VGhyZXNob2xkIHNldFRocmVzaG9sZH0gbWV0aG9kCisgICBhdmFpbGFibGUgdG8gPGNvZGU+YWxsPC9jb2RlPiBhcHBlbmRlcnMgZXh0ZW5kaW5nIHtAbGluaworICAgb3JnLmFwYWNoZS5sb2c0ai5BcHBlbmRlclNrZWxldG9ufSBmb3IgYSBtb3JlIGNvbnZlbmllbnQgd2F5IHRvCisgICBmaWx0ZXIgb3V0IGV2ZW50cyBieSBsZXZlbC4KKworICAgQGF1dGhvciBTaW1vbiBLaXRjaGluZworICAgQGF1dGhvciBiYXNlZCBvbiBjb2RlIGJ5IENla2kgRyZ1dW1sO2xjJnV1bWw7IAorKi8KK3B1YmxpYyBjbGFzcyBMZXZlbFJhbmdlRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHsKKworICAvKioKKyAgICAgRG8gd2UgcmV0dXJuIEFDQ0VQVCB3aGVuIGEgbWF0Y2ggb2NjdXJzLiBEZWZhdWx0IGlzCisgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgc28gdGhhdCBsYXRlciBmaWx0ZXJzIGdldCBydW4gYnkgZGVmYXVsdCAgKi8KKyAgYm9vbGVhbiBhY2NlcHRPbk1hdGNoID0gZmFsc2U7CisKKyAgTGV2ZWwgbGV2ZWxNaW47CisgIExldmVsIGxldmVsTWF4OworCisgCisgIC8qKgorICAgICBSZXR1cm4gdGhlIGRlY2lzaW9uIG9mIHRoaXMgZmlsdGVyLgorICAgKi8KKyAgcHVibGljCisgIGludCBkZWNpZGUoTG9nZ2luZ0V2ZW50IGV2ZW50KSB7CisgICAgaWYodGhpcy5sZXZlbE1pbiAhPSBudWxsKSB7CisgICAgICBpZiAoZXZlbnQuZ2V0TGV2ZWwoKS5pc0dyZWF0ZXJPckVxdWFsKGxldmVsTWluKSA9PSBmYWxzZSkgeworICAgICAgICAvLyBsZXZlbCBvZiBldmVudCBpcyBsZXNzIHRoYW4gbWluaW11bQorICAgICAgICByZXR1cm4gRmlsdGVyLkRFTlk7CisgICAgICB9CisgICAgfQorCisgICAgaWYodGhpcy5sZXZlbE1heCAhPSBudWxsKSB7CisgICAgICBpZiAoZXZlbnQuZ2V0TGV2ZWwoKS50b0ludCgpID4gbGV2ZWxNYXgudG9JbnQoKSkgeworICAgICAgICAvLyBsZXZlbCBvZiBldmVudCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bQorICAgICAgICAvLyBBbGFzLCB0aGVyZSBpcyBubyBMZXZlbC5pc0dyZWF0ZXIgbWV0aG9kLiBhbmQgdXNpbmcKKyAgICAgICAgLy8gYSBjb21ibyBvZiBpc0dyZWF0ZXJPckVxdWFsICYmICFFcXVhbCBzZWVtcyB3b3JzZSB0aGFuCisgICAgICAgIC8vIGNoZWNraW5nIHRoZSBpbnQgdmFsdWVzIG9mIHRoZSBsZXZlbCBvYmplY3RzLi4KKyAgICAgICAgcmV0dXJuIEZpbHRlci5ERU5ZOworICAgICAgfQorICAgIH0KKworICAgIGlmIChhY2NlcHRPbk1hdGNoKSB7CisgICAgICAvLyB0aGlzIGZpbHRlciBzZXQgdXAgdG8gYnlwYXNzIGxhdGVyIGZpbHRlcnMgYW5kIGFsd2F5cyByZXR1cm4KKyAgICAgIC8vIGFjY2VwdCBpZiBsZXZlbCBpbiByYW5nZQorICAgICAgcmV0dXJuIEZpbHRlci5BQ0NFUFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy8gZXZlbnQgaXMgb2sgZm9yIHRoaXMgZmlsdGVyOyBhbGxvdyBsYXRlciBmaWx0ZXJzIHRvIGhhdmUgYSBsb29rLi4KKyAgICAgIHJldHVybiBGaWx0ZXIuTkVVVFJBTDsKKyAgICB9CisgIH0KKworIC8qKgorICAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5MZXZlbE1heDwvY29kZT4gb3B0aW9uLiAgKi8KKyAgcHVibGljCisgIExldmVsIGdldExldmVsTWF4KCkgeworICAgIHJldHVybiBsZXZlbE1heDsKKyAgfQorCisKKyAgLyoqCisgICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPkxldmVsTWluPC9jb2RlPiBvcHRpb24uICAqLworICBwdWJsaWMKKyAgTGV2ZWwgZ2V0TGV2ZWxNaW4oKSB7CisgICAgcmV0dXJuIGxldmVsTWluOworICB9CisKKyAgLyoqCisgICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPkFjY2VwdE9uTWF0Y2g8L2NvZGU+IG9wdGlvbi4KKyAgICovCisgIHB1YmxpYworICBib29sZWFuIGdldEFjY2VwdE9uTWF0Y2goKSB7CisgICAgcmV0dXJuIGFjY2VwdE9uTWF0Y2g7CisgIH0KKworICAvKioKKyAgICAgU2V0IHRoZSA8Y29kZT5MZXZlbE1heDwvY29kZT4gb3B0aW9uLgorICAgKi8KKyAgcHVibGljCisgIHZvaWQgc2V0TGV2ZWxNYXgoTGV2ZWwgbGV2ZWxNYXgpIHsKKyAgICB0aGlzLmxldmVsTWF4ID0gIGxldmVsTWF4OworICB9CisKKyAgLyoqCisgICAgIFNldCB0aGUgPGNvZGU+TGV2ZWxNaW48L2NvZGU+IG9wdGlvbi4KKyAgICovCisgIHB1YmxpYworICB2b2lkIHNldExldmVsTWluKExldmVsIGxldmVsTWluKSB7CisgICAgdGhpcy5sZXZlbE1pbiA9ICBsZXZlbE1pbjsKKyAgfQorCisgIC8qKgorICAgICBTZXQgdGhlIDxjb2RlPkFjY2VwdE9uTWF0Y2g8L2NvZGU+IG9wdGlvbi4KKyAgICovICAKKyAgcHVibGljIAorICB2b2lkIHNldEFjY2VwdE9uTWF0Y2goYm9vbGVhbiBhY2NlcHRPbk1hdGNoKSB7CisgICAgdGhpcy5hY2NlcHRPbk1hdGNoID0gYWNjZXB0T25NYXRjaDsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL051bGxBcHBlbmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9OdWxsQXBwZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODkyZGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9OdWxsQXBwZW5kZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai52YXJpYTsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MYXlvdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuT3B0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnNwaS5Mb2dnaW5nRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkFwcGVuZGVyU2tlbGV0b247CisKKy8qKgorICAqIEEgTnVsbEFwcGVuZGVyIG1lcmVseSBleGlzdHMsIGl0IG5ldmVyIG91dHB1dHMgYSBtZXNzYWdlIHRvIGFueQorICAqIGRldmljZS4gIAorICAqIEBhdXRob3IgQ2VraSBHJnV1bWw7bGMmdW1sOworICAqLworcHVibGljIGNsYXNzIE51bGxBcHBlbmRlciBleHRlbmRzIEFwcGVuZGVyU2tlbGV0b24geworCisgIHByaXZhdGUgc3RhdGljIE51bGxBcHBlbmRlciBpbnN0YW5jZSA9IG5ldyBOdWxsQXBwZW5kZXIoKTsKKworICBwdWJsaWMgTnVsbEFwcGVuZGVyKCkgeworICB9CisKKyAgLyoqIAorICAgKiBUaGVyZSBhcmUgbm8gb3B0aW9ucyB0byBhY3RpY2F0ZS4KKyAgICogKi8KKyAgcHVibGljIHZvaWQgYWN0aXZhdGVPcHRpb25zKCkgeworICB9CisKKyAgLyoqCisgICAqIFdoZW5ldmVyIHlvdSBjYW4sIHVzZSB0aGlzIG1ldGhvZCB0byByZXRyZWl2ZSBhbiBpbnN0YW5jZSBpbnN0ZWFkCisgICAqIG9mIGluc3RhbnRpYXRpbmcgYSBuZXcgb25lIHdpdGggPGNvZGU+bmV3PC9jb2RlPi4KKyAgICogKi8KKyAgcHVibGljIE51bGxBcHBlbmRlciBnZXRJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgfQorCisgIC8qKgorICAgKiBEb2VzIG5vdCBkbyBhbnl0aGluZy4gCisgICAqICovCisgIHB1YmxpYyB2b2lkIGRvQXBwZW5kKExvZ2dpbmdFdmVudCBldmVudCkgeworICB9CisKKyAgLyoqCisgICAqIERvZXMgbm90IGRvIGFueXRoaW5nLiAKKyAgICogKi8KKyAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kKExvZ2dpbmdFdmVudCBldmVudCkgeworICB9CisKKyAgLyoqCisgICAgKiBOdWxsQXBwZW5kZXJzIGRvIG5vdCBuZWVkIGEgbGF5b3V0LiAgCisgICAgKiAqLworICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0xheW91dCgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvUm9sbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL1JvbGxlci5qYXZhCmluZGV4IGQ0MTY4OTYuLjhlOTYzMTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvUm9sbGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS9Sb2xsZXIuamF2YQpAQCAtOCw3ICs4LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnZhcmlhOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI5LDcgKzI5LDcgQEAKICAgIEBzaW5jZSB2ZXJzaW9uIDAuOS4wICovCiBwdWJsaWMgY2xhc3MgUm9sbGVyIHsKIAotICBzdGF0aWMgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoUm9sbGVyLmNsYXNzLmdldE5hbWUoKSk7CisgIHN0YXRpYyBMb2dnZXIgY2F0ID0gTG9nZ2VyLmdldExvZ2dlcihSb2xsZXIuY2xhc3MpOwogICAKIAogICBzdGF0aWMgU3RyaW5nIGhvc3Q7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL3Rlc3QvTG9vcC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai92YXJpYS90ZXN0L0xvb3AuamF2YQppbmRleCBhZTYwYWEyLi5hNDNmZGY1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL3Rlc3QvTG9vcC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvdGVzdC9Mb29wLmphdmEKQEAgLTEsNyArMSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai52YXJpYS50ZXN0OyAKIAotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKIAogLyoqCkBAIC0xMiw3ICsxMiw3IEBACiAgICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7ICovCiBwdWJsaWMgY2xhc3MgTG9vcCB7CiAKLSAgc3RhdGljIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKExvb3AuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKExvb3AuY2xhc3MpOwogICBzdGF0aWMgaW50IGxvb3BMZW5ndGg7CiAKICAgcHVibGljIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvRE9NQ29uZmlndXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9ET01Db25maWd1cmF0b3IuamF2YQppbmRleCA4MDYwOTg5Li42MGVmMDNmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9ET01Db25maWd1cmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9ET01Db25maWd1cmF0b3IuamF2YQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHN1YnN0KGFwcGVuZGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUikpOwogICAgIExvZ0xvZy5kZWJ1ZygiQ2xhc3MgbmFtZTogWyIgKyBjbGFzc05hbWUrJ10nKTsgICAgCiAgICAgdHJ5IHsKLSAgICAgIE9iamVjdCBpbnN0YW5jZSAJPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKKyAgICAgIE9iamVjdCBpbnN0YW5jZSAJPSBMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKICAgICAgIEFwcGVuZGVyIGFwcGVuZGVyCT0gKEFwcGVuZGVyKWluc3RhbmNlOwogICAgICAgUHJvcGVydHlTZXR0ZXIgcHJvcFNldHRlciA9IG5ldyBQcm9wZXJ0eVNldHRlcihhcHBlbmRlcik7CiAKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIGVsc2UgewogICAgICAgTG9nTG9nLmRlYnVnKCJEZXNpcmVkIGxvZ2dlciBzdWItY2xhc3M6IFsiK2NsYXNzTmFtZSsnXScpOwogICAgICAgIHRyeSB7CSAKLQkgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisJIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwogCSBNZXRob2QgZ2V0SW5zdGFuY2VNZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoImdldExvZ2dlciIsIAogCQkJCQkJICAgIE9ORV9TVFJJTkdfUEFSQU0pOwogCSBjYXQgPSAoTG9nZ2VyKSBnZXRJbnN0YW5jZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtjYXROYW1lfSk7CkBAIC00NDIsNyArNDQyLDcgQEAKICAgICBTdHJpbmcgY2xhc3NOYW1lID0gc3Vic3QobGF5b3V0X2VsZW1lbnQuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFIpKTsKICAgICBMb2dMb2cuZGVidWcoIlBhcnNpbmcgbGF5b3V0IG9mIGNsYXNzOiBcIiIrY2xhc3NOYW1lKyJcIiIpOwkJIAogICAgIHRyeSB7Ci0gICAgICBPYmplY3QgaW5zdGFuY2UgCT0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7CisgICAgICBPYmplY3QgaW5zdGFuY2UgCT0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7CiAgICAgICBMYXlvdXQgbGF5b3V0ICAgCT0gKExheW91dClpbnN0YW5jZTsKICAgICAgIFByb3BlcnR5U2V0dGVyIHByb3BTZXR0ZXIgPSBuZXcgUHJvcGVydHlTZXR0ZXIobGF5b3V0KTsKICAgICAgIApAQCAtNDkzLDcgKzQ5Myw3IEBACiAgICAgU3RyaW5nIHByaVN0ciA9IHN1YnN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFZBTFVFX0FUVFIpKTsKICAgICBMb2dMb2cuZGVidWcoIkxldmVsIHZhbHVlIGZvciAiK2NhdE5hbWUrIiBpcyAgWyIrcHJpU3RyKyJdLiIpOwogICAgIAotICAgIGlmKElOSEVSSVRFRC5lcXVhbHMocHJpU3RyKSkgeworICAgIGlmKElOSEVSSVRFRC5lcXVhbHNJZ25vcmVDYXNlKHByaVN0cikgfHwgTlVMTC5lcXVhbHNJZ25vcmVDYXNlKHByaVN0cikpIHsKICAgICAgIGlmKGlzUm9vdCkgewogCUxvZ0xvZy5lcnJvcigiUm9vdCBsZXZlbCBjYW5ub3QgYmUgaW5oZXJpdGVkLiBJZ25vcmluZyBkaXJlY3RpdmUuIik7CiAgICAgICB9IGVsc2UgewpAQCAtNTA2LDcgKzUwNiw3IEBACiAgICAgICB9IGVsc2UgewogCUxvZ0xvZy5kZWJ1ZygiRGVzaXJlZCBMZXZlbCBzdWItY2xhc3M6IFsiK2NsYXNzTmFtZSsnXScpOwogCXRyeSB7CSAKLQkgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCSAgQ2xhc3MgY2xhenogPSBMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7CiAJICBNZXRob2QgdG9MZXZlbE1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgidG9MZXZlbCIsIAogCQkJCQkJICAgIE9ORV9TVFJJTkdfUEFSQU0pOwogCSAgTGV2ZWwgcHJpID0gKExldmVsKSB0b0xldmVsTWV0aG9kLmludm9rZShudWxsLCAKQEAgLTY1MSwyNSArNjUxLDE4IEBACiAgICAgfQogICAgICAgCiAgICAgdHJ5IHsKLSAgICAgIC8vIFRoaXMgbWFrZXMgSUQvSURSRUYgYXR0cmlidXRlcyB0byBoYXZlIGEgbWVhbmluZy4gRG9uJ3QgYXNrCi0gICAgICAvLyBtZSB3aHkuCiAgICAgICBkYmYuc2V0VmFsaWRhdGluZyh0cnVlKTsKLSAgICAgIC8vZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwogCiAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgIGRvY0J1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBTQVhFcnJvckhhbmRsZXIoKSk7CiAKLSAgICAgIENsYXNzIGNsYXp6ID0gdGhpcy5nZXRDbGFzcygpOwotICAgICAgVVJMIGR0ZFVSTCA9IGNsYXp6LmdldFJlc291cmNlKCIvb3JnL2FwYWNoZS9sb2c0ai94bWwvbG9nNGouZHRkIik7Ci0gICAgICBpZihkdGRVUkwgPT0gbnVsbCkgewotCUxvZ0xvZy5lcnJvcigiQ291bGQgbm90IGZpbmQgW2xvZzRqLmR0ZF0uIFVzZWQgWyIrY2xhenouZ2V0Q2xhc3NMb2FkZXIoKSsKLQkJICAgICAiXSBjbGFzcyBsb2FkZXIgaW4gdGhlIHNlYXJjaC4iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCUxvZ0xvZy5kZWJ1ZygiVVJMIHRvIGxvZzRqLmR0ZCBpcyBbIiArIGR0ZFVSTC50b1N0cmluZygpKyJdLiIpOwotCWlucHV0U291cmNlLnNldFN5c3RlbUlkKGR0ZFVSTC50b1N0cmluZygpKTsKLSAgICAgIH0KLSAgICAgIERvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIucGFyc2UoaW5wdXRTb3VyY2UpOworICAgICAgZG9jQnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IFNBWEVycm9ySGFuZGxlcigpKTsgICAgICAKKyAgICAgIGRvY0J1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IExvZzRqRW50aXR5UmVzb2x2ZXIoKSk7ICAgICAgICAKKyAgICAgIC8vIHdlIGNoYW5nZSB0aGUgc3lzdGVtIElEIHRvIGEgdmFsaWQgVVJJIHNvIHRoYXQgQ3JpbXNvbiB3b24ndAorICAgICAgLy8gY29tcGxhaW4uIEluZGVlZCwgImxvZzRqLmR0ZCIgYWxvbmUgaXMgbm90IGEgdmFsaWQgVVJJIHdoaWNoCisgICAgICAvLyBjYXVzZXMgQ3JpbXNvbiB0byBiYXJmLiBUaGUgTG9nNGpFbnRpdHlSZXNvbHZlciBvbmx5IGNhcmVzCisgICAgICAvLyBhYm91dCB0aGUgImxvZzRqLmR0ZCIgZW5kaW5nLgorICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoImR1bW15Oi8vbG9nNGouZHRkIik7CisgICAgICBEb2N1bWVudCBkb2MgPSBkb2NCdWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsgCiAgICAgICBwYXJzZShkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAvLyBJIGtub3cgdGhpcyBpcyBtaXNlcmFibGUuLi4KQEAgLTY3NywxMyArNjcwLDEzIEBACiAgICAgfQogICB9CiAKLSAgICAvKioKLSAgICAgICBDb25maWd1cmUgYnkgdGFraW5nIGluIGFuIERPTSBlbGVtZW50LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb0NvbmZpZ3VyZShFbGVtZW50IGVsZW1lbnQsIExvZ2dlclJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JcGFyc2UoZWxlbWVudCk7Ci0gICAgfQorICAvKioKKyAgICAgQ29uZmlndXJlIGJ5IHRha2luZyBpbiBhbiBET00gZWxlbWVudC4gCisgICovCisgIHB1YmxpYyB2b2lkIGRvQ29uZmlndXJlKEVsZW1lbnQgZWxlbWVudCwgTG9nZ2VyUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7CisgICAgdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKKyAgICBwYXJzZShlbGVtZW50KTsKKyAgfQogCiAgIAogICAvKioKQEAgLTczMyw5ICs3MjYsOSBAQAogICAgIC8vICJkZWJ1ZyIgYXR0cmlidXRlIGlzIHJldHVybmVkIGFzIHRoZSBlbXB0eSBzdHJpbmcuCiAgICAgaWYoIWRlYnVnQXR0cmliLmVxdWFscygiIikgJiYgIWRlYnVnQXR0cmliLmVxdWFscygibnVsbCIpKSB7ICAgICAgCiAgICAgICBMb2dMb2cuc2V0SW50ZXJuYWxEZWJ1Z2dpbmcoT3B0aW9uQ29udmVydGVyLnRvQm9vbGVhbihkZWJ1Z0F0dHJpYiwgdHJ1ZSkpOwotICAgIH0KLSAgICBlbHNlIAorICAgIH0gZWxzZSB7CiAgICAgICBMb2dMb2cuZGVidWcoIklnbm9yaW5nICIgKyBJTlRFUk5BTF9ERUJVR19BVFRSICsgIiBhdHRyaWJ1dGUuIik7CisgICAgfQogCiAKICAgICBTdHJpbmcgY29uZkRlYnVnID0gc3Vic3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ09ORklHX0RFQlVHX0FUVFIpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGoveG1sL0xvZzRqRW50aXR5UmVzb2x2ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGoveG1sL0xvZzRqRW50aXR5UmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTcwN2NiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvTG9nNGpFbnRpdHlSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQorICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLnhtbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuTG9nTG9nOworCisvKioKKyAqIEFuIHtAbGluayBFbnRpdHlSZXNvbHZlcn0gc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHJldHVybgorICogPGNvZGU+bG9nNGouZHRkPC9jb2RlPiB3aGljaCBpcyBlbWJlZGRlZCB3aXRoaW4gdGhlIGxvZzRqIGphcgorICogZmlsZS4gCisgKgorICogQGF1dGhvciBQYXVsIEF1c3RpbgorICogKi8KK3B1YmxpYyBjbGFzcyBMb2c0akVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgeworCisgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5IChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgeworICAgIGlmIChzeXN0ZW1JZC5lbmRzV2l0aCgibG9nNGouZHRkIikpIHsKKyAgICAgIENsYXNzIGNsYXp6ID0gZ2V0Q2xhc3MoKTsKKyAgICAgIElucHV0U3RyZWFtIGluID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL29yZy9hcGFjaGUvbG9nNGoveG1sL2xvZzRqLmR0ZCIpOworICAgICAgaWYgKGluID09IG51bGwpIHsKKwlMb2dMb2cuZXJyb3IoIkNvdWxkIG5vdCBmaW5kIFtsb2c0ai5kdGRdLiBVc2VkIFsiICsgY2xhenouZ2V0Q2xhc3NMb2FkZXIoKSAKKwkJICAgICArICJdIGNsYXNzIGxvYWRlciBpbiB0aGUgc2VhcmNoLiIpOworCXJldHVybiBudWxsOworICAgICAgfSBlbHNlIHsKKwlyZXR1cm4gbmV3IElucHV0U291cmNlKGluKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9YTUxMYXlvdXQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGoveG1sL1hNTExheW91dC5qYXZhCmluZGV4IGFiYzJmYTIuLmRlMWRiODYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGoveG1sL1hNTExheW91dC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGoveG1sL1hNTExheW91dC5qYXZhCkBAIC0xNywzNyArMTcsMzggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuVHJhbnNmb3JtOwogCiAvKioKLSAgIFRoZSBvdXRwdXQgb2YgdGhlIFhNTExheW91dCBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBsb2c0ajpldmVudAotICAgZWxlbWVudHMgYXMgZGVmaW5lZCBpbiB0aGUgPGEKLSAgIGhyZWY9ImRvYy1maWxlcy9sb2c0ai5kdGQiPmxvZzRqLmR0ZDwvYT4uIEl0IGRvZXMgbm90IG91dHB1dCBhCi0gICBjb21wbGV0ZSB3ZWxsLWZvcm1lZCBYTUwgZmlsZS4gVGhlIG91dHB1dCBpcyBkZXNpZ25lZCB0byBiZQotICAgaW5jbHVkZWQgYXMgYW4gPGVtPmV4dGVybmFsIGVudGl0eTwvZW0+IGluIGEgc2VwYXJhdGUgZmlsZSB0byBmb3JtCi0gICBhIGNvcnJlY3QgWE1MIGZpbGUuCi0KLSAgIDxwPkZvciBleGFtcGxlLCBpZiA8Y29kZT5hYmM8L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoZXJlCi0gICB0aGUgWE1MTGF5b3V0IG91cHV0IGdvZXMsIHRoZW4gYSB3ZWxsLWZvcm1lZCBYTUwgZmlsZSB3b3VsZCBiZToKLQotICAgPHByZT4KKyAqIFRoZSBvdXRwdXQgb2YgdGhlIFhNTExheW91dCBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBsb2c0ajpldmVudAorICogZWxlbWVudHMgYXMgZGVmaW5lZCBpbiB0aGUgPGEKKyAqIGhyZWY9ImRvYy1maWxlcy9sb2c0ai5kdGQiPmxvZzRqLmR0ZDwvYT4uIEl0IGRvZXMgbm90IG91dHB1dCBhCisgKiBjb21wbGV0ZSB3ZWxsLWZvcm1lZCBYTUwgZmlsZS4gVGhlIG91dHB1dCBpcyBkZXNpZ25lZCB0byBiZQorICogaW5jbHVkZWQgYXMgYW4gPGVtPmV4dGVybmFsIGVudGl0eTwvZW0+IGluIGEgc2VwYXJhdGUgZmlsZSB0byBmb3JtCisgKiBhIGNvcnJlY3QgWE1MIGZpbGUuCisgKgorICogPHA+Rm9yIGV4YW1wbGUsIGlmIDxjb2RlPmFiYzwvY29kZT4gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hlcmUKKyAqIHRoZSBYTUxMYXlvdXQgb3VwdXQgZ29lcywgdGhlbiBhIHdlbGwtZm9ybWVkIFhNTCBmaWxlIHdvdWxkIGJlOgorICoKKyAgPHByZT4KICAgICZsdDs/eG1sIHZlcnNpb249IjEuMCIgPyZndDsKLQotICAgJmx0OyFET0NUWVBFIGxvZzRqOmV2ZW50U2V0IFNZU1RFTSAibG9nNGouZHRkIiBbJmx0OyFFTlRJVFkgZGF0YSBTWVNURU0gImFiYyImZ3Q7XSZndDsKLQotICAgJmx0O2xvZzRqOmV2ZW50U2V0IHZlcnNpb249IjEuMiIgeG1sbnM6bG9nNGo9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovIiZndDsKLSAgICAgICAmbmJzcDsmbmJzcDsmZGF0YTsKLSAgICZsdDsvbG9nNGo6ZXZlbnRTZXQmZ3Q7Ci0gICA8L3ByZT4KLQotICAgPHA+VGhpcyBhcHByb2FjaCBlbmZvcmNlcyB0aGUgaW5kZXBlbmRlbmNlIG9mIHRoZSBYTUxMYXlvdXQgYW5kIHRoZQotICAgYXBwZW5kZXIgd2hlcmUgaXQgaXMgZW1iZWRkZWQuIAotCi0gICA8cD5UaGUgPGNvZGU+dmVyc2lvbjwvY29kZT4gYXR0cmlidXRlIGhlbHBzIGNvbXBvbmVudHMgdG8gY29ycmVjdGx5Ci0gICBpbnRyZXByZXQgb3V0cHV0IGdlbmVyYXRlZCBieSBYTUxMYXlvdXQuIFRoZSB2YWx1ZSBvZiB0aGlzCi0gICBhdHRyaWJ1dGUgc2hvdWxkIGJlICIxLjEiIGZvciBvdXRwdXQgZ2VuZXJhdGVkIGJ5IGxvZzRqIHZlcnNpb25zCi0gICBwcmlvciB0byBsb2c0aiAxLjIgKGZpbmFsIHJlbGVhc2UpIGFuZCAiMS4yIiBmb3IgcmVsYXNlIDEuMiBhbmQKLSAgIGxhdGVyLgotCi0gICBAYXV0aG9yIENla2kgIEcmdXVtbDtsYyZ1dW1sOwotICAgQHNpbmNlIDAuOS4wICovCisgCisgICZsdDshRE9DVFlQRSBsb2c0ajpldmVudFNldCBTWVNURU0gImxvZzRqLmR0ZCIgWyZsdDshRU5USVRZIGRhdGEgU1lTVEVNICJhYmMiJmd0O10mZ3Q7CisgCisgICZsdDtsb2c0ajpldmVudFNldCB2ZXJzaW9uPSIxLjIiIHhtbG5zOmxvZzRqPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyImZ3Q7CisgCSZuYnNwOyZuYnNwOyZkYXRhOworICAmbHQ7L2xvZzRqOmV2ZW50U2V0Jmd0OworICA8L3ByZT4KKyAKKyAqIDxwPlRoaXMgYXBwcm9hY2ggZW5mb3JjZXMgdGhlIGluZGVwZW5kZW5jZSBvZiB0aGUgWE1MTGF5b3V0IGFuZCB0aGUKKyAqIGFwcGVuZGVyIHdoZXJlIGl0IGlzIGVtYmVkZGVkLgorICoKKyAqIDxwPlRoZSA8Y29kZT52ZXJzaW9uPC9jb2RlPiBhdHRyaWJ1dGUgaGVscHMgY29tcG9uZW50cyB0byBjb3JyZWN0bHkKKyAqIGludHJlcHJldCBvdXRwdXQgZ2VuZXJhdGVkIGJ5IFhNTExheW91dC4gVGhlIHZhbHVlIG9mIHRoaXMKKyAqIGF0dHJpYnV0ZSBzaG91bGQgYmUgIjEuMSIgZm9yIG91dHB1dCBnZW5lcmF0ZWQgYnkgbG9nNGogdmVyc2lvbnMKKyAqIHByaW9yIHRvIGxvZzRqIDEuMiAoZmluYWwgcmVsZWFzZSkgYW5kICIxLjIiIGZvciByZWxhc2UgMS4yIGFuZAorICogbGF0ZXIuCisgKgorICogQGF1dGhvciBDZWtpICBHJnV1bWw7bGMmdXVtbDsKKyAqIEBzaW5jZSAwLjkuMCAKKyAqICovCiBwdWJsaWMgY2xhc3MgWE1MTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKIAogICBwcml2YXRlICBmaW5hbCBpbnQgREVGQVVMVF9TSVpFID0gMjU2OwpAQCAtNTUsNDEgKzU2LDM4IEBACiAKICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihERUZBVUxUX1NJWkUpOwogICBwcml2YXRlIGJvb2xlYW4gbG9jYXRpb25JbmZvID0gZmFsc2U7Ci0KICAKICAgLyoqCi0gICAgIFRoZSA8Yj5Mb2NhdGlvbkluZm88L2I+IG9wdGlvbiB0YWtlcyBhIGJvb2xlYW4gdmFsdWUuIEJ5Ci0gICAgIGRlZmF1bHQsIGl0IGlzIHNldCB0byBmYWxzZSB3aGljaCBtZWFucyB0aGVyZSB3aWxsIGJlIG5vIGxvY2F0aW9uCi0gICAgIGluZm9ybWF0aW9uIG91dHB1dCBieSB0aGlzIGxheW91dC4gSWYgdGhlIHRoZSBvcHRpb24gaXMgc2V0IHRvCi0gICAgIHRydWUsIHRoZW4gdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgb2YgdGhlIHN0YXRlbWVudAotICAgICBhdCB0aGUgb3JpZ2luIG9mIHRoZSBsb2cgc3RhdGVtZW50IHdpbGwgYmUgb3V0cHV0LiAKLQotICAgICA8cD5JZiB5b3UgYXJlIGVtYmVkZGluZyB0aGlzIGxheW91dCB3aXRoaW4gYW4ge0BsaW5rCi0gICAgIG9yZy5hcGFjaGUubG9nNGoubmV0LlNNVFBBcHBlbmRlcn0gdGhlbiBtYWtlIHN1cmUgdG8gc2V0IHRoZQotICAgICA8Yj5Mb2NhdGlvbkluZm88L2I+IG9wdGlvbiBvZiB0aGF0IGFwcGVuZGVyIGFzIHdlbGwuCi0gICAqLwotICBwdWJsaWMKLSAgdm9pZCBzZXRMb2NhdGlvbkluZm8oYm9vbGVhbiBmbGFnKSB7CisgICAqIFRoZSA8Yj5Mb2NhdGlvbkluZm88L2I+IG9wdGlvbiB0YWtlcyBhIGJvb2xlYW4gdmFsdWUuIEJ5IGRlZmF1bHQsCisgICAqIGl0IGlzIHNldCB0byBmYWxzZSB3aGljaCBtZWFucyB0aGVyZSB3aWxsIGJlIG5vIGxvY2F0aW9uCisgICAqIGluZm9ybWF0aW9uIG91dHB1dCBieSB0aGlzIGxheW91dC4gSWYgdGhlIHRoZSBvcHRpb24gaXMgc2V0IHRvCisgICAqIHRydWUsIHRoZW4gdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgb2YgdGhlIHN0YXRlbWVudCBhdCB0aGUKKyAgICogb3JpZ2luIG9mIHRoZSBsb2cgc3RhdGVtZW50IHdpbGwgYmUgb3V0cHV0LgorICAgKgorICAgKiA8cD5JZiB5b3UgYXJlIGVtYmVkZGluZyB0aGlzIGxheW91dCB3aXRoaW4gYW4ge0BsaW5rCisgICAqIG9yZy5hcGFjaGUubG9nNGoubmV0LlNNVFBBcHBlbmRlcn0gdGhlbiBtYWtlIHN1cmUgdG8gc2V0IHRoZQorICAgKiA8Yj5Mb2NhdGlvbkluZm88L2I+IG9wdGlvbiBvZiB0aGF0IGFwcGVuZGVyIGFzIHdlbGwuCisgICAqICovCisgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uSW5mbyhib29sZWFuIGZsYWcpIHsKICAgICBsb2NhdGlvbkluZm8gPSBmbGFnOwogICB9CiAgIAogICAvKioKICAgICAgUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgPGI+TG9jYXRpb25JbmZvPC9iPiBvcHRpb24uCiAgICAqLwotICBwdWJsaWMKLSAgYm9vbGVhbiBnZXRMb2NhdGlvbkluZm8oKSB7CisgIHB1YmxpYyBib29sZWFuIGdldExvY2F0aW9uSW5mbygpIHsKICAgICByZXR1cm4gbG9jYXRpb25JbmZvOwogICB9CiAgIAotICBwdWJsaWMKLSAgdm9pZCBhY3RpdmF0ZU9wdGlvbnMoKSB7CisgIC8qKiBObyBvcHRpb25zIHRvIGFjdGl2YXRlLiAqLworICBwdWJsaWMgdm9pZCBhY3RpdmF0ZU9wdGlvbnMoKSB7CiAgIH0KIAogCiAgIC8qKgotICAgICBGb3JtYXRzIGEge0BsaW5rIExvZ2dpbmdFdmVudH0gaW4gY29uZm9ybWFuY2Ugd2l0aCB0aGUgbG9nNGouZHRkLiAgKi8KLSAgcHVibGljCi0gIFN0cmluZyBmb3JtYXQoTG9nZ2luZ0V2ZW50IGV2ZW50KSB7CisgICAqIEZvcm1hdHMgYSB7QGxpbmsgTG9nZ2luZ0V2ZW50fSBpbiBjb25mb3JtYW5jZSB3aXRoIHRoZSBsb2c0ai5kdGQuCisgICAqICovCisgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KExvZ2dpbmdFdmVudCBldmVudCkgewogCiAgICAgLy8gUmVzZXQgd29ya2luZyBidWZmZXIuIElmIHRoZSBidWZmZXIgaXMgdG9vIGxhcmdlLCB0aGVuIHdlIG5lZWQgYSBuZXcKICAgICAvLyBvbmUgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIHBlbmFsdHkgb2YgY3JlYXRpbmcgYSBsYXJnZSBhcnJheS4KQEAgLTEwMSw1MyArOTksNTQgQEAKICAgICAKICAgICAvLyBXZSB5aWVsZCB0byB0aGUgXHJcbiBoZXJlc3kuCiAKLSAgICBidWYuYXBwZW5kKCI8bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9XCIiKTsKLSAgICBidWYuYXBwZW5kKGV2ZW50LmNhdGVnb3J5TmFtZSk7CisgICAgYnVmLmFwcGVuZCgiPGxvZzRqOmV2ZW50IGxvZ2dlcj1cIiIpOworICAgIGJ1Zi5hcHBlbmQoZXZlbnQuZ2V0TG9nZ2VyTmFtZSgpKTsKICAgICBidWYuYXBwZW5kKCJcIiB0aW1lc3RhbXA9XCIiKTsKICAgICBidWYuYXBwZW5kKGV2ZW50LnRpbWVTdGFtcCk7CiAgICAgYnVmLmFwcGVuZCgiXCIgbGV2ZWw9XCIiKTsKLSAgICBidWYuYXBwZW5kKGV2ZW50LmxldmVsKTsKKyAgICBidWYuYXBwZW5kKGV2ZW50LmdldExldmVsKCkpOwogICAgIGJ1Zi5hcHBlbmQoIlwiIHRocmVhZD1cIiIpOwogICAgIGJ1Zi5hcHBlbmQoZXZlbnQuZ2V0VGhyZWFkTmFtZSgpKTsKICAgICBidWYuYXBwZW5kKCJcIj5cclxuIik7CiAKLQotICAgICAgIGJ1Zi5hcHBlbmQoIjxsb2c0ajptZXNzYWdlPjwhW0NEQVRBWyIpOwotICAgICAgIGJ1Zi5hcHBlbmQoZXZlbnQuZ2V0UmVuZGVyZWRNZXNzYWdlKCkpOwotICAgICAgIGJ1Zi5hcHBlbmQoIl1dPjwvbG9nNGo6bWVzc2FnZT5cclxuIik7ICAgICAgIAotCi0gICAgICAgU3RyaW5nIG5kYyA9IGV2ZW50LmdldE5EQygpOwotICAgICAgIGlmKG5kYyAhPSBudWxsKSB7Ci0JIGJ1Zi5hcHBlbmQoIjxsb2c0ajpOREM+PCFbQ0RBVEFbIik7Ci0JIGJ1Zi5hcHBlbmQobmRjKTsKLQkgYnVmLmFwcGVuZCgiXV0+PC9sb2c0ajpOREM+XHJcbiIpOyAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICBTdHJpbmdbXSBzID0gZXZlbnQuZ2V0VGhyb3dhYmxlU3RyUmVwKCk7Ci0gICAgICAgaWYocyAhPSBudWxsKSB7Ci0JIGJ1Zi5hcHBlbmQoIjxsb2c0ajp0aHJvd2FibGU+PCFbQ0RBVEFbIik7Ci0JIGZvcihpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7Ci0JICAgYnVmLmFwcGVuZChzW2ldKTsKLSAgICAgICAgICAgYnVmLmFwcGVuZCgiXHJcbiIpOwotCSB9Ci0JIGJ1Zi5hcHBlbmQoIl1dPjwvbG9nNGo6dGhyb3dhYmxlPlxyXG4iKTsKLSAgICAgICB9Ci0KLSAgICAgICBpZihsb2NhdGlvbkluZm8pIHsgCi0JIExvY2F0aW9uSW5mbyBsb2NhdGlvbkluZm8gPSBldmVudC5nZXRMb2NhdGlvbkluZm9ybWF0aW9uKCk7CQotCSBidWYuYXBwZW5kKCI8bG9nNGo6bG9jYXRpb25JbmZvIGNsYXNzPVwiIik7Ci0JIGJ1Zi5hcHBlbmQobG9jYXRpb25JbmZvLmdldENsYXNzTmFtZSgpKTsKLQkgYnVmLmFwcGVuZCgiXCIgbWV0aG9kPVwiIik7Ci0JIGJ1Zi5hcHBlbmQoVHJhbnNmb3JtLmVzY2FwZVRhZ3MobG9jYXRpb25JbmZvLmdldE1ldGhvZE5hbWUoKSkpOwotCSBidWYuYXBwZW5kKCJcIiBmaWxlPVwiIik7Ci0JIGJ1Zi5hcHBlbmQobG9jYXRpb25JbmZvLmdldEZpbGVOYW1lKCkpOwotCSBidWYuYXBwZW5kKCJcIiBsaW5lPVwiIik7Ci0JIGJ1Zi5hcHBlbmQobG9jYXRpb25JbmZvLmdldExpbmVOdW1iZXIoKSk7Ci0JIGJ1Zi5hcHBlbmQoIlwiLz5cclxuIik7Ci0gICAgICAgfQotCisgICAgYnVmLmFwcGVuZCgiPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbIik7CisgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCBtZXNzYWdlLiBBbHNvIG1ha2Ugc3VyZSB0byBlc2NhcGUgYW55CisgICAgLy8gZXhpc3RpbmcgQ0RBVEEgc2VjdGlvbnMuCisgICAgVHJhbnNmb3JtLmFwcGVuZEVzY2FwaW5nQ0RBVEEoYnVmLCBldmVudC5nZXRSZW5kZXJlZE1lc3NhZ2UoKSk7CisgICAgYnVmLmFwcGVuZCgiXV0+PC9sb2c0ajptZXNzYWdlPlxyXG4iKTsgICAgICAgCisgICAgCisgICAgU3RyaW5nIG5kYyA9IGV2ZW50LmdldE5EQygpOworICAgIGlmKG5kYyAhPSBudWxsKSB7CisgICAgICBidWYuYXBwZW5kKCI8bG9nNGo6TkRDPjwhW0NEQVRBWyIpOworICAgICAgYnVmLmFwcGVuZChuZGMpOworICAgICAgYnVmLmFwcGVuZCgiXV0+PC9sb2c0ajpOREM+XHJcbiIpOyAgICAgICAKKyAgICB9CisgICAgCisgICAgU3RyaW5nW10gcyA9IGV2ZW50LmdldFRocm93YWJsZVN0clJlcCgpOworICAgIGlmKHMgIT0gbnVsbCkgeworICAgICAgYnVmLmFwcGVuZCgiPGxvZzRqOnRocm93YWJsZT48IVtDREFUQVsiKTsKKyAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CisJYnVmLmFwcGVuZChzW2ldKTsKKwlidWYuYXBwZW5kKCJcclxuIik7CisgICAgICB9CisgICAgICBidWYuYXBwZW5kKCJdXT48L2xvZzRqOnRocm93YWJsZT5cclxuIik7CisgICAgfQorICAgIAorICAgIGlmKGxvY2F0aW9uSW5mbykgeyAKKyAgICAgIExvY2F0aW9uSW5mbyBsb2NhdGlvbkluZm8gPSBldmVudC5nZXRMb2NhdGlvbkluZm9ybWF0aW9uKCk7CQorICAgICAgYnVmLmFwcGVuZCgiPGxvZzRqOmxvY2F0aW9uSW5mbyBjbGFzcz1cIiIpOworICAgICAgYnVmLmFwcGVuZChsb2NhdGlvbkluZm8uZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgYnVmLmFwcGVuZCgiXCIgbWV0aG9kPVwiIik7CisgICAgICBidWYuYXBwZW5kKFRyYW5zZm9ybS5lc2NhcGVUYWdzKGxvY2F0aW9uSW5mby5nZXRNZXRob2ROYW1lKCkpKTsKKyAgICAgIGJ1Zi5hcHBlbmQoIlwiIGZpbGU9XCIiKTsKKyAgICAgIGJ1Zi5hcHBlbmQobG9jYXRpb25JbmZvLmdldEZpbGVOYW1lKCkpOworICAgICAgYnVmLmFwcGVuZCgiXCIgbGluZT1cIiIpOworICAgICAgYnVmLmFwcGVuZChsb2NhdGlvbkluZm8uZ2V0TGluZU51bWJlcigpKTsKKyAgICAgIGJ1Zi5hcHBlbmQoIlwiLz5cclxuIik7CisgICAgfQorICAgIAogICAgIGJ1Zi5hcHBlbmQoIjwvbG9nNGo6ZXZlbnQ+XHJcblxyXG4iKTsKLQorICAgIAogICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKICAgfQogICAKQEAgLTE1NSw4ICsxNTQsNyBAQAogICAgICBUaGUgWE1MTGF5b3V0IHByaW50cyBhbmQgZG9lcyBub3QgaWdub3JlIGV4Y2VwdGlvbnMuIEhlbmNlIHRoZQogICAgICByZXR1cm4gdmFsdWUgPGNvZGU+ZmFsc2U8L2NvZGU+LgogICAqLwotICBwdWJsaWMKLSAgYm9vbGVhbiBpZ25vcmVzVGhyb3dhYmxlKCkgeworICBwdWJsaWMgYm9vbGVhbiBpZ25vcmVzVGhyb3dhYmxlKCkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvZXhhbXBsZXMvWE1MU2FtcGxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9leGFtcGxlcy9YTUxTYW1wbGUuamF2YQppbmRleCBkM2VlOThjLi45MWM0ODgyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9leGFtcGxlcy9YTUxTYW1wbGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9leGFtcGxlcy9YTUxTYW1wbGUuamF2YQpAQCAtMiw3ICsyLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai54bWwuZXhhbXBsZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnhtbC5ET01Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKIGltcG9ydCBqYXZhLm5ldC4qOwogCiAvKioKQEAgLTIyLDcgKzIyLDcgQEAKICovCiBwdWJsaWMgY2xhc3MgWE1MU2FtcGxlIHsKIAotICBzdGF0aWMgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoWE1MU2FtcGxlLmNsYXNzLmdldE5hbWUoKSk7CisgIHN0YXRpYyBMb2dnZXIgY2F0ID0gTG9nZ2VyLmdldExvZ2dlcihYTUxTYW1wbGUuY2xhc3MpOwogCiAgIHB1YmxpYwogICBzdGF0aWMKQEAgLTUxLDcgKzUxLDcgQEAKICAgc3RhdGljCiAgIHZvaWQgc2FtcGxlKCkgewogICAgIGludCBpID0gLTE7Ci0gICAgQ2F0ZWdvcnkgcm9vdCA9IENhdGVnb3J5LmdldFJvb3QoKTsKKyAgICBMb2dnZXIgcm9vdCA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCk7CiAgICAgY2F0LmRlYnVnKCJNZXNzYWdlICIgKyArK2kpOwogICAgIGNhdC53YXJuICgiTWVzc2FnZSAiICsgKytpKTsKICAgICBjYXQuZXJyb3IoIk1lc3NhZ2UgIiArICsraSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9sb2c0ai5kdGQgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9sb2c0ai5kdGQKaW5kZXggMTJmMzczYy4uZDkyYTZlNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvbG9nNGouZHRkCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGoveG1sL2xvZzRqLmR0ZApAQCAtMTUsMTIgKzE1LDE1IEBACiA8IS0tIGxvZ2dpbmcgc3RhdGVtZW50cyB3aXRoIGEgbGV2ZWwgZXF1YWwgb3IgYmVsb3cgdGhpcyB2YWx1ZSBhcmUgLS0+CiA8IS0tIGRpc2FibGVkLiAtLT4KIAotPCEtLSBTZXR0aW5nIHRoZSAiZGVidWciIG9yICJjb25maWdEZWJ1ZyIgYXR0cmlidXRlcyBlbmFibGUgdGhlIHByaW50aW5nIC0tPiAKLTwhLS0gb2YgaW50ZXJuYWwgbG9nNGogbG9nZ2luZyBzdGF0ZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gU2V0dGluZyB0aGUgImRlYnVnIiBlbmFibGUgdGhlIHByaW50aW5nIG9mIGludGVybmFsIGxvZzRqIGxvZ2dpbmcgICAtLT4KKzwhLS0gc3RhdGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KIAotPCEtLSBCeSBkZWZhdWx0LCBkZWJ1ZyBhdHRyaWJ1dGUgaXMgIm51bGwiLCBtZWFuaW5nIHRoYXQgd2Ugbm90IHRvdWNoICAgIC0tPiAKLTwhLS0gaW50ZXJuYWwgbG9nNGogbG9nZ2luZyBzZXR0aW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi0KKzwhLS0gQnkgZGVmYXVsdCwgZGVidWcgYXR0cmlidXRlIGlzICJudWxsIiwgbWVhbmluZyB0aGF0IHdlIG5vdCBkbyB0b3VjaCAtLT4KKzwhLS0gaW50ZXJuYWwgbG9nNGogbG9nZ2luZyBzZXR0aW5ncy4gVGhlICJudWxsIiB2YWx1ZSBmb3IgdGhlIHRocmVzaG9sZCAtLT4KKzwhLS0gYXR0cmlidXRlIGNhbiBiZSBtaXNsZWFkaW5nLiBUaGUgdGhyZXNob2xkIGZpZWxkIG9mIGEgcmVwb3NpdG9yeQkgLS0+Cis8IS0tIGNhbm5vdCBiZSBzZXQgdG8gbnVsbC4gVGhlICJudWxsIiB2YWx1ZSBmb3IgdGhlIHRocmVzaG9sZCBhdHRyaWJ1dGUgLS0+Cis8IS0tIHNpbXBseSBtZWFucyBkb24ndCB0b3VjaCB0aGUgdGhyZXNob2xkIGZpZWxkLCB0aGUgdGhyZXNob2xkIGZpZWxkICAgLS0+IAorPCEtLSBrZWVwcyBpdHMgb2xkIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogICAgICAKIDwhQVRUTElTVCBsb2c0ajpjb25maWd1cmF0aW9uCiAgIHhtbG5zOmxvZzRqICAgICAgICAgICAgICBDREFUQSAjRklYRUQgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovIiAKQEAgLTE0Myw4ICsxNDYsOCBAQAogCiA8IS0tIFRoZSB0aW1lc3RhbXAgZm9ybWF0IGlzIGFwcGxpY2F0aW9uIGRlcGVuZGVudC4gLS0+CiA8IUFUVExJU1QgbG9nNGo6ZXZlbnQKLSAgICBjYXRlZ29yeSAgIENEQVRBICNSRVFVSVJFRAotICAgIHByaW9yaXR5ICAgQ0RBVEEgI1JFUVVJUkVECisgICAgbG9nZ2VyICAgICBDREFUQSAjUkVRVUlSRUQKKyAgICBsZXZlbCAgICAgIENEQVRBICNSRVFVSVJFRAogICAgIHRocmVhZCAgICAgQ0RBVEEgI1JFUVVJUkVECiAgICAgdGltZXN0YW1wICBDREFUQSAjUkVRVUlSRUQKID4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGoveG1sL3Rlc3QvRE9NVGVzdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvdGVzdC9ET01UZXN0LmphdmEKaW5kZXggMjI1Y2ZiNi4uYjZjMzAzYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvdGVzdC9ET01UZXN0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvdGVzdC9ET01UZXN0LmphdmEKQEAgLTgsOCArOCw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoueG1sLnRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnhtbC5ET01Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOwogLy9pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai54bWwuZXhhbXBsZXMuUmVwb3J0UGFyc2VyRXJyb3I7CiAvL2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlcjsKIC8vaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwpAQCAtMTksNyArMjAsNyBAQAogICAgQGF1dGhvciBDZWtpIEcmdXVtbDtsYyZ1dW1sOwogKi8KIHB1YmxpYyBjbGFzcyBET01UZXN0IHsKLSAgc3RhdGljIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKERPTVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKERPTVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKIAogCiAgIHB1YmxpYyAKQEAgLTUwLDcgKzUxLDcgQEAKICAgc3RhdGljCiAgIHZvaWQgdGVzdCgpIHsKICAgICBpbnQgaSA9IC0xOwotICAgIENhdGVnb3J5IHJvb3QgPSBDYXRlZ29yeS5nZXRSb290KCk7CisgICAgTG9nZ2VyIHJvb3QgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOwogICAgIAogICAgIGNhdC5kZWJ1ZygiTWVzc2FnZSAiICsgKytpKTsKICAgICByb290LmRlYnVnKCJNZXNzYWdlICIgKyBpKTsgICAgICAgIApAQCAtNjQsOCArNjUsOCBAQAogICAgIGNhdC5lcnJvcigiTWVzc2FnZSAiICsgKytpKTsKICAgICByb290LmVycm9yKCJNZXNzYWdlICIgKyBpKTsKICAgICAKLSAgICBjYXQubG9nKFByaW9yaXR5LkZBVEFMLCAiTWVzc2FnZSAiICsgKytpKTsKLSAgICByb290LmxvZyhQcmlvcml0eS5GQVRBTCwgIk1lc3NhZ2UgIiArIGkpOyAgICAKKyAgICBjYXQubG9nKExldmVsLkZBVEFMLCAiTWVzc2FnZSAiICsgKytpKTsKKyAgICByb290LmxvZyhMZXZlbC5GQVRBTCwgIk1lc3NhZ2UgIiArIGkpOyAgICAKICAgICAKICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIkp1c3QgdGVzdGluZyIpOwogICAgIGNhdC5kZWJ1ZygiTWVzc2FnZSAiICsgKytpLCBlKTsKQEAgLTc0LDYgKzc1LDYgQEAKICAgICBjYXQuZXJyb3IoIk1lc3NhZ2UgIiArICsraSwgZSk7CiAgICAgcm9vdC5lcnJvcigiTWVzc2FnZSAiICsgaSwgZSk7ICAgIAogCi0gICAgQ2F0ZWdvcnkuc2h1dGRvd24oKTsKKyAgICBMb2dNYW5hZ2VyLnNodXRkb3duKCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy94ZG9jcy9jb250YWN0VXMueG1sIGIvc3JjL3hkb2NzL2NvbnRhY3RVcy54bWwKaW5kZXggNThkOWEwYS4uNDIzMzVhMSAxMDA2NDQKLS0tIGEvc3JjL3hkb2NzL2NvbnRhY3RVcy54bWwKKysrIGIvc3JjL3hkb2NzL2NvbnRhY3RVcy54bWwKQEAgLTIsNyArMiw3IEBACiA8ZG9jdW1lbnQ+CiAKICAgPHByb3BlcnRpZXM+Ci0gICAgPGF1dGhvciBlbWFpbD0iY2d1QGFwYWNoZS5vcmciPkNla2kgR3VsY3U8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJjZWtpIGF0IGFwYWNoZS5vcmciPkNla2kgR3VsY3U8L2F1dGhvcj4KICAgICA8dGl0bGU+Q29udGFjdCB1czwvdGl0bGU+CiAgIDwvcHJvcGVydGllcz4KIApAQCAtMTQsMjEgKzE0LDE2IEBACiAgICAgICA8cD5EaXNjdXNzaW9uIG9uIGxvZzRqIGFuZCBsb2dnaW5nIGluIGdlbmVyYWwgYXJlIGhlbGQgb24gdGhlCiAJPGVtPmxvZzRqLXVzZXI8L2VtPiBtYWlsaW5nIGxpc3QuICBUbyBzdWJzY3JpYmUgdG8gdGhpcyBsaXN0CiAJc2VuZCBhbiBlLW1haWwgdG8gPGEKLQlIUkVGPSJtYWlsdG86bG9nNGotdXNlci1zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnIj5sb2c0ai11c2VyLXN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L2E+LgorCUhSRUY9Im1haWx0bzpsb2c0ai11c2VyLXN1YnNjcmliZUBsb2dnaW5nLmFwYWNoZS5vcmciPmxvZzRqLXVzZXItc3Vic2NyaWJlQGxvZ2dpbmcuYXBhY2hlLm9yZzwvYT4uCiAgICAgICA8L3A+CiAKICAgICAgIDxwPkRldmVsb3BtZW50IHJlbGF0ZWQgZGlzY3Vzc2lvbnMgYXJlIGhlbGQgb24gdGhlCiAJPGVtPmxvZzRqLWRldjwvZW0+IG1haWxpbmcgbGlzdC4gVG8gc3Vic2NyaWJlIHRvIHRoaXMgbGlzdAogCXNlbmQgYW4gZS1tYWlsIHRvIDxBCi0JSFJFRj0ibWFpbHRvOmxvZzRqLWRldi1zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnIj5sb2c0ai1kZXYtc3Vic2NyaWJlQGpha2FydGEuYXBhY2hlLm9yZzwvQT4uPC9wPgotCi0gICAgICA8cD5BbGwgZGV2ZWxvcGVycyBhcmUgZW5jb3VyYWdlZCB0byBzdWJzY3JpYmUgdG8gdGhlCi0JPGVtPmxvZzRqLWN2czwvZW0+IGxpc3Qgd2hpY2ggd2lsbCBub3RpZnkgdGhlIHN1YnNjcmliZXJzIG9mCi0JQ1ZTIGFueSBjb21taXRzIHRvIHRoZSByZXBvc2l0b3J5LiAgVG8gc3Vic2NyaWJlIHRvIHRoaXMgbGlzdAotCXNlbmQgYW4gZS1tYWlsIHRvIDxBCi0JSFJFRj0ibWFpbHRvOmxvZzRqLWN2cy1zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnIj5sb2c0ai1jdnMtc3Vic2NyaWJlQGpha2FydGEuYXBhY2hlLm9yZzwvQT4uCi0JQ29tbWl0dGVycyA8ZW0+c2hvdWxkPC9lbT4gc3Vic2NyaWJlIHRvIHRoaXMgbGlzdCB3aXRoIHRoZWlyCi0JQXBhY2hlIGUtbWFpbCBhZGRyZXNzLgorCUhSRUY9Im1haWx0bzpsb2c0ai1kZXYtc3Vic2NyaWJlQGxvZ2dpbmcuYXBhY2hlLm9yZyI+bG9nNGotZGV2LXN1YnNjcmliZUBsb2dnaW5nLmFwYWNoZS5vcmc8L0E+LiBBbGwKKwlkZXZlbG9wZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHN1YnNjcmliZSB0byB0aGUKKwk8ZW0+bG9nNGotZGV2PC9lbT4gbGlzdCB3aGljaCB3aWxsIG5vdGlmeSB0aGUgc3Vic2NyaWJlcnMgb2YKKwlhbnkgY29tbWl0cyB0byBvdXIgQ1ZTIHJlcG9zaXRvcnkuCiAgICAgICA8L3A+CiAKICAgICAgIDxwPjxiPlRvIHByZXZlbnQgc3BhbSwgd2UgZXhwZWN0IHlvdSB0byBiZSBzdWJzY3JpYmVkIHRvIGEgbGlzdApAQCAtMzcsNyArMzIsNyBAQAogCSAgY3JlYXRlcyBuZWVkbGVzcyB3b3JrIGZvciB1cy48L2I+CiAgICAgICA8L3A+CiAKLSAgICAgIDxwPk1vc3QgSmFrYXJ0YSBtYWlsaW5nIGxpc3RzLCBpbiBwYXJ0aWN1bGFyIHRoZSBsb2c0aiBtYWlsaW5nCisgICAgICA8cD5Nb3N0IExvZ2dpbmcgU2VydmljZXMgbWFpbGluZyBsaXN0cywgaW4gcGFydGljdWxhciB0aGUgbG9nNGogbWFpbGluZwogCWxpc3RzLCBhcmUgYXJjaGl2ZWQuIFNvbWUgb2YgdGhlIGtub3duIGFyY2hpdmVzIGFyZSBsaXN0ZWQKIAliZWxvdzoKICAgICAgIDwvcD4KQEAgLTQ4LDkgKzQzLDkgQEAKIAkgIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS8iPmh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbTwvYT4KIAk8L2xpPgogCi0JPGxpPkZ1bGwgbWJveCBhcmNoaXZlcyBvZiBhbGwgSmFrYXJ0YSBsaXN0cyBhcmUgYXZhaWxhYmxlIGF0CisJPGxpPkZ1bGwgbWJveCBhcmNoaXZlcyBvZiBhbGwgTG9nZ2luZyBTZXJ2aWNlcyBsaXN0cyBhcmUgYXZhaWxhYmxlIGF0CiAJICAgIDxhCi0JICAgIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbWFpbC8iPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbWFpbC88L2E+CisJICAgIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbWFpbC8iPmh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbWFpbC88L2E+CiAJPC9saT4KIAogCTxsaT4KZGlmZiAtLWdpdCBhL3NyYy94ZG9jcy9jb250cmlidXRvcnMueG1sIGIvc3JjL3hkb2NzL2NvbnRyaWJ1dG9ycy54bWwKaW5kZXggODc2MzRlNC4uYzg1NWExZiAxMDA2NDQKLS0tIGEvc3JjL3hkb2NzL2NvbnRyaWJ1dG9ycy54bWwKKysrIGIvc3JjL3hkb2NzL2NvbnRyaWJ1dG9ycy54bWwKQEAgLTgsMTUgKzgsMTggQEAKICAgCiAgIDxib2R5PgogICAgIDxzZWN0aW9uIG5hbWU9IkxvZzRqIGNvbnRyaWJ1dG9ycyI+Ci0gICAgICAKKyAgICAgICAKICAgICAgIDxwPkxvZzRqIGlzIHRoZSByZXN1bHQgb2YgY29udHJpYnV0aW9ucyBmcm9tIHNldmVyYWwgZG96ZW4KIAlkZXZlbG9wZXJzIGFuZCBodW5kcmVkcyBvZiB1c2VycyBhY3Jvc3MgdGhlIGdsb2JlLiBTb21lIG9mIHRoZQogCW1vcmUgcHJvbWluZW50IGNvbnRyaWJ1dG9ycyBhcmUgbGlzdGVkIGJlbG93IGluIGFscGhhYmV0aWNhbAogCW9yZGVyLgogICAgICAgPC9wPgorICAgIDx1bD4KIAotICAgICAgPHVsPgotCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gTElTVEVEIElOIEFMUEhBQkVUSUNBTCBPUkRFUiAobGFzdCBuYW1lKSAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgCiAJPGxpPjxiPk1hdGhpYXMgQm9nYWVydDwvYj4gCiAKIAkgIDxwPldoaWxlIG5vdCBsdXJraW5nIG9uIDxhCkBAIC0zOSwxNCArNDIsMzIgQEAKIAogCTxsaT48Yj5DZWtpIEcmIzI1MjtsYyYjMjUyOzwvYj4gCiAKLQkgIDxwPkNla2kgaXMgdGhlIGZvdW5kZXIgdGhlIGxvZzRqIHByb2plY3Qgd2hpY2ggc3RpbGwgdGFrZXMKLQkgIG11Y2ggb2YgaGlzIHRpbWUuIEhlIGVuam95cyB3cml0aW5nIHNvZnR3YXJlIGFsdG91Z2ggaGUgaXMKLQkgIGRpc2NvdmVyaW5nIHRoYXQgaXQgaXMgZmFyIG1vcmUgZGlmZmljdWx0IHRoYW4gaXQgbG9va3MuIEhlCi0JICBpcyBhbHNvIHNsb3dseSBidWlsZGluZyBhbiBJVCBzZXJ2aWNlcyBjb21wYW55IGNhbGxlZCA8YQotCSAgaHJlZj0iaHR0cDovL3Fvcy5jaCI+cW9zLmNoPC9hPi4KLQkgIDwvcD4KKyAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPjx0ZD4gPHA+Q2VraSBpcyB0aGUgZm91bmRlciB0aGUgbG9nNGogcHJvamVjdCB3aGljaAorICAgICAgICAgIGNvbnRpbnVlcyB0byBvY2N1cHkgbXVjaCBvZiBoaXMgdGltZS4gSGUgZW5qb3lzIHdyaXRpbmcKKyAgICAgICAgICBzb2Z0d2FyZSBhbHRvdWdoIGhlIGlzIGRpc2NvdmVyaW5nIHRoYXQgaXQgaXMgZmFyIG1vcmUKKyAgICAgICAgICBkaWZmaWN1bHQgdGhhbiB3aGF0IGl0IG1heSBzZWVtIGluaXRpYWxseS4gSGUgaXMgYWxzbworICAgICAgICAgIG1hbmFnaW5nIGhpcyA8YSBocmVmPSJodHRwOi8vd3d3LnFvcy5jaCI+SVQgc2VydmljZXMKKyAgICAgICAgICBjb21wYW55PC9hPi48L3A+PC90ZD4gCisgICAgICAgICAgPHRkPjxpbWcgc3JjPSJpbWFnZXMvY2VraS03MngxMDEuZ2lmIj48L2ltZz48L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDwvdGFibGU+CiAJPC9saT4KIAorICAgIDxsaT48Yj5KYWNvYiBLam9tZTwvYj4gCisKKyAgICAgICAgPHA+SmFjb2IgS2pvbWUgaGFzIGJlZW4gZGV2ZWxvcGluZyBzb2Z0d2FyZQorCSAgc2luY2UgMTk5NyBhbmQgaGFzIGJlZW4gcGxheWluZyB3aXRoIEphdmEgZm9yIGFib3V0IDQgeWVhcnMuCisJICBKYWtlIGpvaW5lZCB0aGUgbG9nNGogdGVhbSBhZnRlciBiZWluZyB2ZXJ5IGFjdGl2ZSBvbiB0aGUKKwkgIHVzZXIgbGlzdCBhbmQgY29udHJpYnV0aW5nIHNlcnZsZXQgYW5kIHJlcG9zaXRvcnkgc2VsZWN0b3IKKwkgIHJlbGF0ZWQgY29kZSB0byB0aGUgbG9nai1zYW5kYm94LiAgSGUgaXMgYWxzbyBhIGNvbW1pdHRlciBvbgorCSAgdGhlIChub24tQXBhY2hlIHJlbGF0ZWQpIFhNTEMsIEJhcnJhY3VkYU1WQywgYW5kIFByZXZheWxlcgorCSAgcHJvamVjdHMuICBPZiBsYXRlIGhpcyBmcmVlIHRpbWUgaGFzIGJlZW4gc3F1ZWV6ZWQgd2l0aCBhCisJICBuZXcgam9iIGFuZCBoaXMgdmlnb3JvdXMgMiB5ZWFyIG9sZCBzb24sIE5pY2hvbGFzLCBidXQgaGUKKwkgIHN0aWxsIHRyaWVzIHRvIHBpdGNoIGluIHdoZW4gaGUgY2FuLiA6LSkKKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisKIAogCTxsaT48Yj5BbmRlcnMgS3Jpc3RlbnNlbjwvYj4gCiAKQEAgLTYzLDEzICs4NCw1MCBAQAogCSAgPC9wPgogCTwvbGk+CiAKKyAgICA8bGk+PGI+WW9hdiBTaGFwaXJhPC9iPiAKKyAgICAgIDx0YWJsZT4KKyAgICAgICAgPHRyPjx0ZD4KKyAgICAgICAgICA8cD5Zb2F2IFNoYXBpcmEgd29ya3MgZm9yIE1pbGxlbm5pdW0gUGhhcm1hY2V1dGljYWxzIGFuZAorICAgICAgICAgIGlzIGFzIGludGVyZXN0ZWQgaW4gdGhlIGJ1c2luZXNzIGFzcGVjdHMgb2YgT3Blbi1Tb3VyY2UKKyAgICAgICAgICBTb2Z0d2FyZSBhcyBoZSBpcyBpbiB0aGUgdGVjaG5pY2FsIGFzcGVjdHMuIFlvYXYgY29udHJpYnV0ZXMKKyAgICAgICAgICB0byB0aGUgVG9tY2F0IGNvbnRhaW5lciwgdGhlIExvZzRqIGxvZ2dpbmcgc3lzdGVtLCBhbmQgYQorICAgICAgICAgIG51bWJlciBvZiBqYWthcnRhLWNvbW1vbnMgYW5kIG90aGVyIG9wZW4tc291cmNlIHByb2plY3RzLgorICAgICAgICAgICAgICA8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJpbWFnZXMveXNoYXBpcmEuYm1wIj48L2ltZz48L3RkPgorICAgICAgIDwvdHI+CisgICAgIDwvdGFibGU+CisgICA8L2xpPgorCiAJPGxpPjxiPkpvbiBTa2VldDwvYj4gCi0JICAKLQkgIDxwPkpvbiBhY3RzIGFzIGEgbW9kZXJhdG9yIGZvciB0aGUgbG9nNGogbWFpbGluZyBsaXN0cyB3aGVyZQotCSAgaGUgaXMgb25lIG9mIHRoZSBtb3N0IGFjdGl2ZSBwYXJ0aWNpcGFudHMuCisKKwkgIDxwPkpvbiBpcyBhIHNvZnR3YXJlIGRldmVsb3BlciBpbiBoaXMgbWlkLXR3ZW50aWVzIGxpdmluZyBpbgorCSAgdGhlIFVLLiBIZSBpcyBhIEphdmEgZW50aHVzaWFzdCBhbmQgdmVyeSBhY3RpdmUgcGFydGljaXBhbnQKKwkgIGluIHRoZSBjb21wLmxhbmcuamF2YS4qIG5ld3Nncm91cHMgYXMgd2VsbCBhcyBhIG1vZGVyYXRvcgorCSAgZm9yIHRoZSBsb2c0aiBtYWlsaW5nIGxpc3RzLiBIZSBpcyBhIGNvbW1pdHRlciBmb3IgdGhlIEFudAorCSAgcHJvamVjdCwgaW52b2x2ZWQgKHdoZW4gdGltZSBwZXJtaXRzISkgaW4gdGlkeWluZyB1cCB0aGUKKwkgIGNvZGUgZG9jdW1lbnRhdGlvbi4KIAkgIDwvcD4KIAk8L2xpPgogCisJPGxpPjxiPlBhdWwgU21pdGg8L2I+IAorICAgICAgPHRhYmxlPgorICAgICAgICA8dHI+PHRkPgorICAgICAgICA8cD5QYXVsIFNtaXRoIGhhcyBiZWVuIGRldmVsb3Bpbmcgc29mdHdhcmUgc2luY2UgMTk5MCwgYW5kIHBsYXlpbmcgCisJICAgIGNvbXB1dGVyIGdhbWVzIGEgZmV3IHllYXJzIGxvbmdlciB0aGFuIHRoYXQuICBIZSBoYXMgYmVlbiB0aG9yb3VnaGx5CisJICAgIGVuam95aW5nIEphdmEgc2luY2UgMTk5OCBhZnRlciBoZSBnYXZlIHVwIG9uIFZpc3VhbCBCYXNpYyBpbiBkaXNndXN0LgorCSAgICBQYXVsIGpvaW5lZCB0aGUgbG9nNGogdGVhbSBhZnRlciBmaW5kaW5nIGhvdyBkYXJuIHVzZWZ1bCBpdCBhbmQgdGhlIAorCSAgICBjb21wYW5pb24gQ2hhaW5zYXcgYXBwbGljYXRpb24gd2FzIGluICcwMywgYW5kIGhhcyBiZWVuIGhlbHBpbmcgb3V0IAorCSAgICB3aGVyZSBoZSBjYW4sIHdvcmtpbmcgb24gQ2hhaW5zYXcgdjIsIGFuZCBnZW5lcmFsbHkgbWFraW5nIGEgZ29vZCAKKwkgICAgbnVpc2FuY2Ugb2YgaGltc2VsZi4KKwkgICAgPC9wPjwvdGQ+CisgICAgICAgIDx0ZD48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJpbWFnZXMvcHNtaXRoLmpwZyI+PC9pbWc+PC90ZD4KKyAgICAgICA8L3RyPgorICAgICA8L3RhYmxlPgorCQorCisgICAgPC9saT4KKwogCQogCTxsaT48Yj5DaHJpcyBUYXlsb3I8L2I+IAogCSAgCkBAIC03OSw5ICsxMzcsMjkgQEAKIAkgIGhyZWY9Impha2FydGEuYXBhY2hlLm9yZy9hbnQvIj5qYWthcnRhLWFudDwvYT4uCiAJICA8L3A+CiAJPC9saT4KLQkKLSAgICAgIDwvdWw+CiAKKwk8bGk+PGI+TWFyayBXb21hY2s8L2I+IAorICA8dGFibGU+CisgIDx0cj4KKyAgPHRkPgorICAgIDxwPk1hcmsgV29tYWNrIGhhcyBiZWVuIGRldmVsb3Bpbmcgc29mdHdhcmUgZm9yIG92ZXIgMTMKKwkgIHllYXJzLiBIZSBoYXMgYmVlbiBkZXZlbG9waW5nIGluIEphdmEgZm9yIHRoZSBwYXN0IDUgeWVhcnMsCisJICBmb2N1c2luZyBvbiB3ZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQuIEhlIGhhcyBiZWVuIGFuCisJICBhY3RpdmUgY29tbWl0dGVyIGZvciB0aGUgQXBhY2hlIExvZ2dpbmcgU2VydmljZXMgbG9nNGogcHJvamVjdCBzaW5jZQorCSAgQXByaWwgMjAwMiwgY29udHJpYnV0aW5nIGZlYXR1cmVzIGZvciB0aGUgdXBjb21pbmcgdjEuMworCSAgcmVsZWFzZS4gIEhlIGlzIGFsc28gYSBtZW1iZXIgb2YgdGhlIExvZ2dpbmcgU2VydmljZXMgUE1DLjwvcD4KKyAgPC90ZD4gCisgIDx0ZD48aW1nIHNyYz0iaW1hZ2VzL21hcmstNzJ4OTkuZ2lmIj48L2ltZz48L3RkPgorICA8L3RyPgorICA8L3RhYmxlPgorCQorICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgCisgICAgPC9saT4KKworICAgICAgICAgCisgICAgICA8L3VsPgogICAgIDwvc2VjdGlvbj4KICAgICAKICAgPC9ib2R5PgpkaWZmIC0tZ2l0IGEvc3JjL3hkb2NzL2RvY3VtZW50YXRpb24ueG1sIGIvc3JjL3hkb2NzL2RvY3VtZW50YXRpb24ueG1sCmluZGV4IDBmMjY5MGEuLjdkY2IzZWYgMTAwNjQ0Ci0tLSBhL3NyYy94ZG9jcy9kb2N1bWVudGF0aW9uLnhtbAorKysgYi9zcmMveGRvY3MvZG9jdW1lbnRhdGlvbi54bWwKQEAgLTIsMzkgKzIsNTYgQEAKIDxkb2N1bWVudD4KIAogICA8cHJvcGVydGllcz4KLSAgICA8YXV0aG9yIGVtYWlsPSJjZWtpQGFwYWNoZS5vcmciPkNla2kgR3VsY3U8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPkNla2kgR3VsY3U8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KICAgICA8dGl0bGU+RG9jdW1lbnRhdGlvbjwvdGl0bGU+CiAgIDwvcHJvcGVydGllcz4KIAotPGJvZHk+CisgIDxib2R5PgogCiAgICAgPHNlY3Rpb24gbmFtZT0iT2ZmaWNpYWwgbG9nNGogZG9jdW1lbnRhdGlvbiI+Ci0KLSAgICAgIDxwPlRoZSBmb2xsb3dpbmcgZG9jdW1lbnRhdGlvbiBpcyBpbmNsdWRlZCB3aXRoIHRoZSBzdGFuZGFyZCBsb2c0agotCWRpc3RyaWJ1dGlvbiBhbmQgYWxzbyBicm93c2FibGUgb25saW5lOjwvcD4KKyAgICAgIAorICAgICAgPHA+V2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBjb21wbGV0ZSBtYW51YWwsIHRoZSBmb2xsb3dpbmcKKyAgICAgIGRvY3VtZW50YXRpb24gaXMgaW5jbHVkZWQgd2l0aCB0aGUgc3RhbmRhcmQgbG9nNGogZGlzdHJpYnV0aW9uCisgICAgICBhbmQgYWxzbyBicm93c2FibGUgb25saW5lOgorICAgICAgPC9wPgogICAgICAgCiAgICAgICA8dWw+Ci0JPHA+Ci0JICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwiPjxiPnNob3J0IG1hbnVhbDwvYj48L2E+LAotCSAgPC9saT4KLQk8L3A+Ci0JCi0JPHA+Ci0JICA8bGk+Ci0JICAgIDxhIGhyZWY9ImFwaS9pbmRleC5odG1sIj48Yj5qYXZhZG9jIGRvY3VtZW50YXRpb248L2I+PC9hPiwKLQkgIDwvbGk+Ci0JPC9wPgotCQotCTxwPgotCSAgPGxpPgotCSAgICA8YSBocmVmPSJISVNUT1JZIj48Yj5wcm9qZWN0IGhpc3Rvcnk8L2I+PC9hPiwKLQkgIDwvbGk+Ci0JPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICA8YQorICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LnFvcy5jaC9zaG9wL3Byb2R1Y3RzL2VjbG0vIj48aW1nCisgICAgICAgICAgIGFsaWduPSJyaWdodCIgc3JjPSJpbWFnZXMvY292ZXJTbWFsbC5wbmciPjwvaW1nPjwvYT4gPGxpPjxhCisgICAgICAgICAgIGhyZWY9Im1hbnVhbC5odG1sIj48Yj5zaG9ydCBtYW51YWw8L2I+PC9hPiwgCisgICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPgorICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnFvcy5jaC9zaG9wL3Byb2R1Y3RzL2VjbG0vIj48Yj5jb21wbGV0ZSBtYW51YWw8L2I+PC9hPiAoY29tbWVyY2lhbCksIAorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPgorICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9ImFwaS9pbmRleC5odG1sIj48Yj5qYXZhZG9jIGRvY3VtZW50YXRpb248L2I+PC9hPiwKKyAgICAgICAgICA8L2xpPgorICAgICAgICA8L3A+CisgICAgICAgIAorICAgICAgICA8cD4KKyAgICAgICAgICA8bGk+IAorICAgICAgICAgICAgPGEgaHJlZj0iY2hhaW5zYXcuaHRtbCI+PGI+Q2hhaW5zYXcgZG9jdW1lbnRhdGlvbjwvYj48L2E+LAorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPgorICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IkhJU1RPUlkiPjxiPnByb2plY3QgaGlzdG9yeTwvYj48L2E+LAorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvcD4KIAkKIAkKIAk8cD4KIAkgIDxsaT4KLQkgICAgPGEgaHJlZj0iRkFRLmh0bWwiPjxiPkZBUTwvYj48L2E+LAorCSAgICA8YSBocmVmPSJmYXEuaHRtbCI+PGI+RkFRPC9iPjwvYT4sCiAJICA8L2xpPgogCTwvcD4KIAkKQEAgLTQ2LDM1ICs2MywxNTIgQEAKIAkKICAgICAgIDwvdWw+CiAgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0iVHJhbnNsYXRpb25zIHRvIG90aGVyIGxhbmd1YWdlcyI+CisgICAgICAgPHVsPgorICAgICAgICAgPGxpPjxhCisgICAgICAgICBocmVmPSJodHRwOi8vd3d3LnZpbWV3b3Jrcy5jb20vfm1hdXJpY2lvL21hbnVhbExvZzRKLmh0bWwiPlNwYW5pc2gKKyAgICAgICAgIHRyYW5zbGF0aW9uPC9hPiBvZiB0aGUgc2hvcnQgbWFudWFsIE1hdXJpY2lvIFNhbnRhY3J1eiAoPGEgaHJlZj0iaHR0cDovL3d3dy52aW1ld29ya3MuY29tL35tYXVyaWNpby9tYW51YWxMb2c0Si5wZGYiPlBERjwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cudmltZXdvcmtzLmNvbS9+bWF1cmljaW8vbWFudWFsTG9nNEouaHRtbCI+SFRNTDwvYT4pPC9saT4KKyAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmphdmFjb3JlLmRlL2p1bXBUb0Rvd25sb2FkLnBocD9pZD04JmFtcDt1cmw9dHV0b3JpYWxzL3NjaG5lbGxlL2xvZzRqbWFudWFsLnBkZiI+R2VybWFuIHRyYW5zbGF0aW9uPC9hPiBvZiB0aGUgc2hvcnQgbWFudWFsLCBjb3VydGVzeSBvZiBEaXJrIFNjaG5lbGxlLiAoUERGIG9ubHkgYXQgdGhpcyB0aW1lKTwvbGk+CisgICAgICA8L3VsPgorICAgIDwvc2VjdGlvbj4KKyAgICAKICAgICAKICAgICA8c2VjdGlvbiBuYW1lPSJBcnRpY2xlcyBvbiBsb2c0aiI+CiAgICAgICA8dWw+CisgICAgICAgIAorICAgICAgICA8cD4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy52aXBhbi5jb20vaHRkb2NzL2xvZzRqaGVscC5odG1sIj5Eb24ndCBVc2UgU3lzdGVtLm91dC5wcmludGxuIQorICAgICAgICAgIFVzZSBMb2c0ajwvYT4gYnkgVmlwYW4gU2luZ2xhCisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+PGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub25qYXZhLmNvbS9wdWIvYS9vbmphdmEvMjAwMi8wOC8wNy9sb2c0ai5odG1sP3BhZ2U9MSI+CisgICAgICAgIEJ1aWxkIEZsZXhpYmxlIExvZ3MgV2l0aCBsb2c0ajwvYT4gYnkgVmlrcmFtIEdveWFsCisgICAgICAgIDwvbGk+PC9wPgorICAgICAgICAKKyAgICAgICAgPHA+PGxpPjxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly9zdXBwb3J0d2ViLmNzLmJoYW0uYWMudWsvZG9jdW1lbnRhdGlvbi90dXRvcmlhbHMvZG9jc3lzdGVtL2J1aWxkL3R1dG9yaWFscy9sb2c0ai9sb2c0ai5odG1sIj5sb2c0ajwvYT4KKyAgICAgICAgYnkgQXNobGV5IEouUyBNaWxscywgVW5pdmVyc2l0eSBPZiBCaXJtaW5naGFtPC9saT48L3A+CisgICAgICAgIAorICAgICAgICA8cD48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5idWlsZGVyLmNvbS5jb20vYXJ0aWNsZS5qaHRtbD9pZD11MDA4MjAwMjAxMjRrZXYwMS5odG0iPgorICAgICAgICBBZGQgbG9nZ2luZyB0byB5b3VyIEphdmEgQXBwbGljYXRpb25zPC9hPiBieSBLZXZpbiBCcm93bgorICAgICAgICA8L2xpPjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmJ1aWxkZXIuY29tLmNvbS9hcnRpY2xlLmpodG1sP2lkPXUwMDIyMDAyMDcyNGtldjAxLmh0bSI+CisgICAgICAgIEhvdyBkb2VzIHRoZSBKYXZhIGxvZ2dpbmcgQVBJIHN0YWNrIHVwIGFnYWluc3QgbG9nNGo/PC9hPiBieSBLZXZpbiBCcm93bgorICAgICAgICA8L2xpPjwvcD4KKyAgICAgICAgCisgICAgICAgIDxwPgorICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnN5bXBob255LmNvbS9ndWlkZWxpbmVzL2xvZ2dpbmcuanNwIj5PcGVuU3ltcGhvbnkgTG9nZ2luZyBQcmltZXI8L2E+CisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC9wPgorICAgICAgICAKKyAgICAgICAgPHA+PGxpPgorCSAgPGEgaHJlZj0iaHR0cDovL3d3dy5qZ3VydS5jb20vZmFxL0xvZzRqIj5sb2c0aiBGQVE8L2E+IGF0IGpHdXJ1CisJPC9saT48L3A+CiAKLQk8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy52aXBhbi5jb20vaHRkb2NzL2xvZzRqaGVscC5odG1sIj5Eb24ndCBVc2UgU3lzdGVtLm91dC5wcmludGxuIQotCSAgICBVc2UgTG9nNGo8L2E+IGJ5IFZpcGFuIFNpbmdsYQotCTwvbGk+CisJPHA+PGxpPgorCSAgPGEgaHJlZj0iaHR0cDovL3d3dy5xb3MuY2gvbG9nZ2luZy90aGlua0FnYWluLmh0bWwiPlRoaW5rIEFnYWluPC9hPiBieSBDZWtpIEcmIzI1MjtsYyYjMjUyOwogCi0JPGxpPjxhIGhyZWY9Imh0dHA6Ly9idWlsZGVyLmNvbS5jb20vYXJ0aWNsZS5qaHRtbD9pZD11MDA4MjAwMjAxMjRrZXYwMS5odG0iPgotCSAgICBBZGQgbG9nZ2luZyB0byB5b3VyIEphdmEgQXBwbGljYXRpb25zPC9hPiBieSBLZXZpbiBCcm93bgotCTwvbGk+Ci0JCi0JPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuZW50d2lja2xlci5jb20vam0vYXVzZ2FiZW4vMjAwMS80L2FydGlrZWwvMTcvb25saW5lLnNodG1sIj4KLQkgICAgQ29tcHV0ZXI6IGNhcHRhaW5zLCBuZXcgZW50cnkuLi4gRGFzSmFrYXJ0YSBMb2dnaW5nLVN5c3RlbSBsb2c0ajwvYT4gYnkgVGhvbWFzIFBvc2NobWFubgotCTwvbGk+CisJPC9saT48L3A+CiAKLQk8bGk+Ci0JICA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zeW1waG9ueS5jb20vZ3VpZGVsaW5lcy9sb2dnaW5nLmpzcCI+T3BlblN5bXBob255IExvZ2dpbmcgUHJpbWVyPC9hPgotCTwvbGk+Ci0gICAgICA8L3VsPgorCTxwPjxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5xb3MuY2gvbG9nZ2luZy9zYy5odG1sIj5TdXBwb3J0aW5nIHRoZQorCSAgbG9nNGogPGNvZGU+UmVwb3NpdG9yeVNlbGVjdG9yPC9jb2RlPjwvYT4gYnkgQ2VraQorCSAgRyYjMjUyO2xjJiMyNTI7CisJPC9saT48L3A+CiAKLSAgICAgIDxwPklmIHlvdSB3b3VsZCBsaWtlIHlvdXIgbG9nNGotcmVsYXRlZWQgYXJ0aWNsZSB0byBiZSBsaXN0ZWQKLQkgIGhlcmUsIHRoZW4gcGxlYXNlIHNlbmQgYSBub3RlIHRvIHRoZSA8YQotCSAgaHJlZj0ibWFpbHRvOmxvZzRqLXVzZXJAamFrYXJ0YS5hcGFjaGUub3JnIj5sb2c0ai11c2VyQGpha2FydGEuYXBhY2hlLm9yZzwvYT4KLQkgIGxpc3QuCi0gICAgICA8L3A+CisgICAgICAgICA8cD48bGk+IDxhIGhyZWY9Imh0dHA6Ly9yZWkxLm0tcGxpZnkubmV0L2xvZzRqLyI+TG9nNGogY2xhc3MKKyAgICAgICAgIGRpYWdyYW1zPC9hPiwgY291cnRlc3kgb2YgRGF2aWQgVG9uaG9mZXIKKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICA8L3A+CisKKyAgICAgICAgIDxwPjxsaT4gPGEKKyAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cub25qYXZhLmNvbS9wdWIvYS9vbmphdmEvMjAwMy8wNC8wMi9sb2c0al9lamIuaHRtbCI+VW5kZXJzdGFuZGluZworICAgICAgICAgQ2xhc3Nsb2FkZXJzOiBsb2c0aiBpbiBhIEoyRUUgRW52aXJvbm1lbnQ8L2E+IGJ5IFZpa3JhbSBHb3lhbAorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgIDwvcD4KIAogCisgICAgICAgICA8cD48bGk+IDxhCisgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmxpbnV4LW1hZ2F6aW4uZGUvQXJ0aWtlbC9hdXNnYWJlLzIwMDIvMDQvY29mZmVlL2NvZmZlZS5odG1sIj5Mb2dnaW5nCisgICAgICAgICBmJiMyNTI7ciBKYXZhLVByb2dyYW1tZSwgWnUgZGVuIEFrdGVuPC9hPiBieSBCZXJuaGFyZCBCYWJsb2sKKyAgICAgICAgIGluIExpbnV4IE1hZ2F6aW5lLCAwNC8yMDAyLgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgIDwvcD4KKworICAgICAgICAgPHA+PGxpPiA8YQorICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy0xMDYuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9qYXZhL2xpYnJhcnkvai1pbnN0bG9nLyI+SW5zdGFudCBsb2dnaW5nOiBIYXJuZXNzIHRoZSBwb3dlciBvZiBsb2c0aiB3aXRoIEphYmJlcjwvYT4gYnkgUnV0aCBaYW1vcmFubyBhbmQgUmFmYWVsIEx1cXVlLCBpbiBkZXZlbG9wZXJXb3JrcyAyMDAzCisgICAgICAgICA8L2xpPgorICAgICAgICAgPC9wPgorCisgICAgICAgICA8cD4KKyAgICAgICAgICAgPGxpPiA8YQorICAgICAgICAgICBocmVmPSJodHRwOi8vZGV2ZWxvcGVycy5zdW4uY29tL3Byb2R0ZWNoL2FwcHNlcnZlci9yZWZlcmVuY2UvdGVjaGFydC9sb2c0ai5odG1sIj5Vc2luZyBMb2c0aiBpbiB0aGUgU3VuIEphdmEgU3lzdGVtIEFwcGxpY2F0aW9uIFNlcnZlcjwvYT4gYnkgTWF0dGhldyBMaXRrZXksIEpheSBHYWx2aW4sIGFuZCBNYXJpbmEgU3VtLCBmcm9tIFN1bi4KKyAgICAgICAgICAgPC9saT4KKyAgICAgICAgIDwvcD4KKyAgICAgICAgIAorICAgICAgICAgPHA+CisgICAgICAgICAgIDxsaT4gPGEKKyAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDA0LzA5LzI5L3NtdHAtbG9nZ2luZy5odG1sIj5SZXBvcnRpbmcKKyAgICAgICAgICAgQXBwbGljYXRpb24gRXJyb3JzIGJ5IEVtYWlsPC9hPiBieSBTZWFuIEMuIFN1bGxpdmFuLAorICAgICAgICAgICAyMDA0LTA5LTI0LCBwdWJsaXNoZWQgYnkgTydSZWlsbHkuCisgICAgICAgICAgIDwvbGk+CisgICAgICAgICA8L3A+CisgICAgICAgICAKKyAgICAgIDwvdWw+IAogICAgIDwvc2VjdGlvbj4KLTwvYm9keT4KKyAgIAorICAgIDxzZWN0aW9uIG5hbWU9IkxvZzRqIHByZXNlbnRhdGlvbnMiPgorICAgICAgIDx1bD4KKworCisgICAgICAgICA8cD48bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cuanVnLWwub3JnL2xvZzRqLmh0bWwiPkFkdmFuY2VkCisgICAgICAgICBMb2c0ajwvYT4gTG91aXN2aWxsZSBKVUcgcHJlc2VudGF0aW9uIGJ5IEpvbmF0aGFuIENvd2hlcmQgPC9saT48L3A+CisgICAgICAgICAKKyAgICAgICAgIDxwPjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmpvaG5tdW5zY2guY29tL3Byb2plY3RzL1ByZXNlbnRhdGlvbnMvIj5Mb2c0SgorICAgICAgICAgSW4gMzAgTWludXRlcyBPciBMZXNzPC9hPiBieSBKb2huIE11bnNjaDwvbGk+PC9wPgorICAgICAgICAgCisgICAgICAgICA8cD48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cucW9zLmNoL2FjMjAwMS9GMTEtMTAuaHRtbCI+TG9nNGosIGEgbG9nZ2luZyBwYWNrYWdlIGZvciB0aGUgSmF2YSBsYW5ndWFnZTwvYT4gYnkgQ2VraSBHJiMyNTI7bGMmIzI1Mjs8L2xpPjwvcD4KKyAgICAgICAgIAorICAgICAgICAgPHA+PGxpPjxhCisgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmVqdWcub3JnL09wZW5Tb3VyY2UlMjBMb2c0ajJfZmlsZXMvZnJhbWUuaHRtIj5Mb2c0aiBwcmVzZW50YXRpb24gYnkgdGhlPC9hPgorICAgICAgICAgRWRtb250b24gSmF2YSBVc2VycyBHcm91cDwvbGk+PC9wPgorICAgICAgICAgCisgICAgICAgICA8cD48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vY2l3ZWIuY29tL2phdmFzaWcva25vd2xlZGdlYmFzZS9KYW51YXJ5MjAwMS9Mb2c0Si5wcHQiPkxvZzRqPC9hPiBieSBCcmVudCBUd2VudGVyCisgICAgICAgICA8L2xpPjwvcD4KKyAgICAgIDwvdWw+CisgICAgPC9zZWN0aW9uPgorICAgIAorICAgIAorICAgIDxzZWN0aW9uIG5hbWU9IlRyYWluaW5nICZhbXA7IFByb2Zlc3Npb25hbCBzdXBwb3J0Ij4KKyAgICAgIDxwPlRoZSBmb2xsb3dpbmcgb3JnYW5pc2F0aW9ucyBvZmZlciBsb2c0ai1yZWxhdGVkIGNvbnN1bHRhbmN5CisgICAgICBhbmQgdHJhaW5pbmcgc2VydmljZXMuIFRoZWlyIGluY2x1c2lvbiBvbiB0aGlzIHBhZ2UgZG9lcworICAgICAgbm90IGltcGx5IGVuZG9yc2VtZW50IGJ5IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4JICAKKyAgICAgIDwvcD4KKyAgICAgIAorICAgICAgPHVsPgorICAgICAgICA8bGk+PGEKKyAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cucW9zLmNoL3Nob3AvcHJvZHVjdHMvcHJvZlN1cHBvcnQvIj5RT1MuY2gsCisgICAgICAgIFN3aXR6ZXJsYW5kPC9hPiBwcm9wb3NlcyBwcm9mZXNzaW9uYWwgc3VwcG9ydCBjb250cmFjdHMuCisgICAgICAgIDwvbGk+CisgICAgICA8L3VsPgorICAgICAgCisgICAgICA8dWw+CisgICAgICAgIDxsaT48YQorICAgICAgICBocmVmPSJodHRwOi8vd3d3LnRoZWdvb2Rzb2Z0d2FyZWNvbXBhbnkuY29tL2xvZzRqVHJhaW5pbmcuZG8iPlRoZQorICAgICAgICBHb29kIFNvZnR3YXJlIENvbXBhbnk8L2E+IHByb3Bvc2VzIGxvZzRqIHRyYWluaW5nIGNvdXJzZXMuCisgICAgICAgIDwvbGk+CisgICAgICA8L3VsPgorICAgICAgCisgICAgICA8cD48Yj5JZiB5b3Ugd291bGQgbGlrZSB5b3VyIGxvZzRqLXJlbGF0ZWQgYXJ0aWNsZSBvciBzZXJ2aWNlCisgICAgICB0byBiZSBsaXN0ZWQgaGVyZSwgdGhlbiBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gdGhlIDxhCisgICAgICBocmVmPSJtYWlsdG86bG9nNGotdXNlckBsb2dnaW5nLmFwYWNoZS5vcmciPmxvZzRqLXVzZXJAbG9nZ2luZy5hcGFjaGUub3JnPC9hPgorICAgICAgbGlzdC48L2I+CisgICAgICA8L3A+CisgICAgPC9zZWN0aW9uPgorCisgIDwvYm9keT4KIDwvZG9jdW1lbnQ+CiAKZGlmZiAtLWdpdCBhL3NyYy94ZG9jcy9kb3dubG9hZC54bWwgYi9zcmMveGRvY3MvZG93bmxvYWQueG1sCmluZGV4IDZmNDBmYjEuLjNjZmMxM2YgMTAwNjQ0Ci0tLSBhL3NyYy94ZG9jcy9kb3dubG9hZC54bWwKKysrIGIvc3JjL3hkb2NzL2Rvd25sb2FkLnhtbApAQCAtNiw0NyArNiw0NSBAQAogICAgIDx0aXRsZT5Eb3dubG9hZDwvdGl0bGU+CiAgIDwvcHJvcGVydGllcz4KIAotICA8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iamF2YSwgbG9nZ2luZywgdHJhY2luZywgY29tcG9uZW50LCBmcmFtZXdvcmssIEFQSSwgbG9nNGoiLz4KLTxib2R5PgorICAgIDxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJqYXZhLCBsb2c0aiBkb3dubG9hZCwgbG9nZ2luZywgdHJhY2luZywgY29tcG9uZW50LCBmcmFtZXdvcmssIEFQSSwgbG9nNGoiLz4KKyAgICAgIDxib2R5PgorCQorICAgICAgPHNlY3Rpb24gbmFtZT0ibG9nNGogdmVyc2lvbiAxLjIuOSI+CisJPHA+TG9nNGogaXMgPGEKKwkgICAgICBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL3NpdGUvYmluaW5kZXguY2dpIj48Yj5hdmFpbGFibGUKKwkgICAgICBmb3IgZG93bmxvYWQ8L2I+PC9hPiBmcm9tIGEgbnVtYmVyIG9mIG1pcnJvcnMuIFBsZWFzZQorCSAgICAgIHVzZSB0aGVzZSBtaXJyb3JzIGFzIHRoZXkgaW1wcm92ZSBkb3dubG9hZCB0aW1lIGFuZCBzYXZlCisJICAgICAgYmFuZHdpZHRoLgorCSAgPC9wPgorCSAgCisJICA8cD5Mb2c0aiB2ZXJzaW9uIDEuMi45LCBpcyBpZGVudGljYWwgdG8gdmVyc2lvbiAxLjIuOCwKKwkgIGV4Y2VwdCB0aGF0IHNldmVyYWwga2V5IG1ldGhvZHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgaW4KKwkgIHByZXBhcmF0aW9uIGZvciB2ZXJzaW9uIDEuMy4wLCB0aGUgbmV4dCBtYWpvciByZWxlYXNlIG9mCisJICBsb2c0ai4gVGhlc2UgY2hhbmdlcyBhcmUgaW50ZW5kZWQgdG8gZW5mb3JjZSB0aGUgcnVsZSB0aGF0CisJICBjbGllbnQgY29kZSBzaG91bGQgbmV2ZXIgcmVmZXIgdG8gdGhlIDxjb2RlPkNhdGVnb3J5PC9jb2RlPgorCSAgY2xhc3MgZGlyZWN0bHksIGJ1dCB1c2UgdGhlIDxjb2RlPkxvZ2dlcjwvY29kZT4gY2xhc3MKKwkgIGluc3RlYWQuIFNpbWlsYXJseSwgY2xpZW50IGNvZGUgc2hvdWxkIG5vdCByZWZlciB0byB0aGUKKwkgIDxjb2RlPlByaW9yaXR5PC9jb2RlPiBjbGFzcyBidXQgdG8gdGhlIDxjb2RlPkxldmVsPC9jb2RlPgorCSAgY2xhc3MgaW5zdGVhZC4KKyAgICAgICAgICA8L3A+CiAKLSAgICA8c2VjdGlvbiBuYW1lPSJsb2c0aiB2ZXJzaW9uIDEuMiAoZmluYWwpIj4KLSAgICAgIDxwPmxvZzRqIDEuMiBpcyBub3cgYXZhaWxhYmxlIGluIDxhCi0JaHJlZj0iLi4vamFrYXJ0YS1sb2c0ai0xLjIudGFyLmd6Ij48Yj5UQVIuR1o8L2I+PC9hPiBmb3JtYXQgb3IKLQlpbiA8YSBocmVmPSIuLi9qYWthcnRhLWxvZzRqLTEuMi56aXAiPjxiPlpJUDwvYj48L2E+IGZvcm1hdC4KLSAgICAgIDwvcD4KKyAgICAgICAgICA8cD5TZWUgdGhlIGRvY3VtZW50IGVudGl0bGVkIDxhCisgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5xb3MuY2gvbG9nZ2luZy9wcmVwYXJpbmdGb3IxMy5qc3AiPnByZXBhcmluZworICAgICAgICAgIGZvciBsb2c0aiAxLjM8L2E+IGZvciBhIG1vcmUgZGV0YWlsZWQgZGlzY3Vzc2lvbi4KKyAgICAgICAgICA8L3A+CisgICAgICAgICAgCisgICAgICAgICAgCiAKKwkgIDxzdWJzZWN0aW9uIG5hbWU9J0VhcmxpZXIgUmVsZWFzZXMnPgorCSAgICA8cD5XZSBhbHNvIG1haW50YWluIDxhCisJICAgICAgaHJlZj0iZWFybGllci5odG1sIj5lYXJsaWVyCisJICAgICAgdmVyc2lvbnMgb2YgbG9nNGo8L2E+IGZvciBkb3dubG9hZCwgaW50ZW5kZWQgZm9yIHRoZQorCSAgICAgIGN1cmlvdXMgcGFsZW9udG9sb2dpc3QgLS0gdGhlcmUgc2VlbXMgdG8gYmUgcXVpdGUgYSBmZXcKKwkgICAgICBvZiB0aGVtIQorCSAgICA8L3A+CisJICA8L3N1YnNlY3Rpb24+CiAKLSAgICAgIDxwPkluIGFkZGl0aW9uIHRvIG1hbnkgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLCBidWcgZml4ZXMsIGFuZAotCW90aGVyIHNtYWxsIGVuaGFuY2VtZW50cywgbG9nNGogMS4yIGFkZHMgSk1YIHN1cHBvcnQsIE1hcHBlZAotCURpYWdub3N0aWMgQ29udGV4dHMsIEpEQkMgbG9nZ2luZywgZ3JhcGhpY2FsIGxvZyB2aWV3ZXIKLQkoY2hhaW5zYXcpLCBhbmQgYnVmZmVyZWQgSU8gY2FwYWJpbGl0eS4gT25lIGltcG9ydGFudCBjaGFuZ2UKLQlpcyB0aGUgcmVwbGFjZW1lbnQgb2YgdGhlIDxjb2RlPkNhdGVnb3J5PC9jb2RlPiBjbGFzcyB3aXRoCi0JPGNvZGU+TG9nZ2VyPC9jb2RlPiBjbGFzcyBhbmQgdGhlIDxjb2RlPlByaW9yaXR5PC9jb2RlPiBjbGFzcwotCXdpdGggdGhlIDxjb2RlPkxldmVsPC9jb2RlPiBjbGFzcyBpbiBvcmRlciB0byBmYWNpbGl0YXRlCi0JbWlncmF0aW5nIGZyb20gdGhlIEpESyAxLjQgbG9nZ2luZyBBUEkgdG8gbG9nNGouIDxhCi0JaHJlZj0iaHR0cDovL3d3dy5qYXZhd29ybGQuY29tL2phdmF3b3JsZC9qdy0wNS0yMDAxL2p3LTA1MDQtZmluYWxpc3RzLmh0bWwiPjxpbWcKLQlzcmM9ImltYWdlcy9lY2F3YXJkX2ZpbmFsaXN0X2xvZ28uZ2lmIiBhbGlnbj0icmlnaHQiCi0JYm9yZGVyPSIwIi8+PC9hPgotICAgICAgPC9wPgotCi0JPHA+VmVyc2lvbiAxLjIgaXMgdGhlIDIybmQgbWFqb3IgcHVibGljIHJlbGVhc2Ugb2YgbG9nNGouICBBbGwKLQljaGFuZ2VzIGV4Y2VwdCB0aGUgcmVtb3ZhbCBvZiBkZXByZWNhdGVkIG1ldGhvZHMgYXJlIGJhY2t3YXJkCi0JY29tcGF0aWJsZSBzdWNoIHRoYXQgbG9nNGogMS4yIGNhbiBiZSBjb25zaWRlcmVkIGEgZHJvcCBpbgotCXJlcGxhY2VtZW50IGZvciBsb2c0aiAxLjEuMy4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoZQotCXJlbmFtaW5nIG9mIHRoZSA8Y29kZT5DYXRlZ29yeUZhY3Rvcnk8L2NvZGU+IGNsYXNzIHRvCi0JPGNvZGU+TG9nZ2VyRmFjdG9yeTwvY29kZT4gY2xhc3Mgc3VjaCB0aGF0IHN1YmNsYXNzZXMgb2YKLQk8Y29kZT5DYXRlZ29yeTwvY29kZT4gY2xhc3MgdG8gYmUgbW9kaWZpZWQgYW5kIHJlY29tcGlsZWQuIEJ5Ci0JdGhlIHdheSwgd2Ugc3Ryb25nbHkgZGlzY291cmFnZSBjYXN1YWwgdXNlcnMgZnJvbSBzdWJjbGFzc2luZwotCXRoZSA8Y29kZT5DYXRlZ29yeTwvY29kZT4gb3IgPGNvZGU+TG9nZ2VyPC9jb2RlPiBjbGFzc2VzLgotICAgICAgPC9wPgotCi0gICAgICA8cD5XZSBhbHNvIG1haW50YWluIGEgbGlzdCBvZiA8YSBocmVmPSJlYXJsaWVyLmh0bWwiPmVhcmxpZXIKLQkgIHZlcnNpb25zPC9hPiBvZiBsb2c0aiBmb3IgZG93bmxvYWQsIGludGVuZGVkIGZvciB0aGUgY3VyaW91cwotCSAgcGFsZW9udG9sb2dpc3QuCi0gICAgICA8L3A+Ci0KLQotICAgIDwvc2VjdGlvbj4KKwk8L3NlY3Rpb24+CiAKIAogICAgIDxzZWN0aW9uIG5hbWU9IlRoaXJkLXBhcnR5IGV4dGVuc2lvbnMgKGxpc3RlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIpIj4KQEAgLTU2LDQ3ICs1NCw5MCBAQAogCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogCQogCTxkdD48YQotCWhyZWY9Imh0dHA6Ly9sb2d1aS5zb3VyY2Vmb3JnZS5uZXQvIj48Yj5DaGFpbnNhdzwvYj48L2E+PC9kdD4KLQk8ZGQ+Q2hhaW5zYXcgaXMgbm93IGludGVncmF0ZWQgd2l0aCBsb2c0aiBhbmQgc2hpcHMgd2l0aCB0aGUKLQlvZmZpY2lhbCBkaXN0cmlidXRpb24uIENoYWluc2F3IGlzIGEgZ3JhcGhpY2FsIGxvZyB2aWV3ZXIgYW5kCi0JZmlsdGVyIGZvciB0aGUgbG9nNGogcGFja2FnZS4gSXQgbGlzdGVucyBmb3IgPGEKLQlocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqL2RvY3MvYXBpL29yZy9hcGFjaGUvbG9nNGovc3BpL0xvZ2dpbmdFdmVudC5odG1sIj5Mb2dnaW5nRXZlbnQ8L2E+Ci0Jb2JqZWN0cyBzZW50IHVzaW5nIHRoZSA8YQotCWhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovZG9jcy9hcGkvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0QXBwZW5kZXIuaHRtbCI+U29ja2V0QXBwZW5kZXI8L2E+Ci0JYW5kIGRpc3BsYXlzIHRoZW0gaW4gYSB0YWJsZS4gQ2hhaW5zYXcgYWxzbyBzdXBwb3J0cyBsb2FkaW5nCi0JZXZlbnRzIGZyb20gZmlsZXMgaW4gPGNvZGU+WE1MTGF5b3V0PC9jb2RlPiBmb3JtYXQuCisJaHJlZj0iY2hhaW5zYXcuaHRtbCI+PGI+Q2hhaW5zYXcgdjIgKE5FVyEpPC9iPjwvYT48L2R0PgorCisJPGRkPkEgbmV3IGFuZCBpbXByb3ZlZCB2ZXJzaW9uIG9mIHRoZSB2ZW5lcmFibGUgQ2hhaW5zYXcKKwl1dGlsaXR5LCBub3cgYmVpbmcgd3JpdHRlbiBieSB0aGUgbG9nNGogZGV2ZWxvcG1lbnQgdGVhbSBpcworCWdldHRpbmcgY2xvc2VyIHRvIHJlbGVhc2UuICBZb3UgY2FuIHNlZSBzY3JlZW4gc2hvdHMgb2YgaXQgYW5kCisJaW5zdGFsbCBpdCBhbmQgcnVuIG92ZXIgPEEgaHJlZj0iY2hhaW5zYXcuaHRtbCI+aGVyZTwvQT4KKwk8L2RkPgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPGR0PjxhIGhyZWY9Imh0dHA6Ly9taW5hcmV0LmJpei90aXBzL2RhdGVkRmlsZUFwcGVuZGVyLmh0bWwiPjxiPkRhdGVkRmlsZUFwcGVuZGVyPC9iPjwvYT48L2R0PgorCisJPGRkPjxjb2RlPkRhdGVkRmlsZUFwcGVuZGVyPC9jb2RlPiB3b3JrcyBpbiB0aGUgc2FtZSBtYW5uZXIgYXMKKwl0aGUgVG9tY2F0IEZpbGVMb2dnZXIuIENvbnRyYXJ5IHRvCisJPGNvZGU+RGFpbHlSb2xsaW5nRmlsZUFwcGVuZGVyPC9jb2RlPiBzaGlwcGluZyB3aXRoIGxvZzRqLCBsb2cKKwlmaWxlIG5hbWVzIGdlbmVyYXRlZCBieSA8Y29kZT5EYXRlZEZpbGVBcHBlbmRlcjwvY29kZT4gYWx3YXlzCisJY29udGFpbiB0b2RheSdzIGRhdGUuIFdoaWxlIHRoaXMgZGlzdGluY3Rpb24gc2VlbXMgbWlub3IsIGl0CisJbWVhbnMgeW91IGNhbiByZWxpYWJseSBjb3B5LCBjb21wcmVzcywgcmVtb3ZlIG9yIG1hbmlwdWxhdGUgYQorCWRheSdzIGxvZyBmaWxlIHNob3J0bHkgYWZ0ZXIgbWlkbmlnaHQuIFdpdGggdGhlCisJPG9jZGU+RGFpbHlSb2xsaW5nRmlsZUFwcGVuZGVyPC9vY2RlPiwgYSBkYXkncyBsb2cgZmlsZSBpcyBub3QKKwlyZW5hbWVkIHVudGlsIHRoZSBmaXJzdCBtZXNzYWdlIGlzIGxvZ2dlZCBzb21lIHRpbWUgYWZ0ZXIKKwltaWRuaWdodC4KIAk8L2RkPgogCiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAKLQk8ZHQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qYXBoeS5kZS9jb25maWdMb2c0aiI+PGI+Y29uZmlnTG9nNGo8L2I+PC9hPjwvZHQ+Cis8IS0tCTxkdD48YSBocmVmPSJodHRwOi8vd3d3LmphcGh5LmRlL2NvbmZpZ0xvZzRqIj48Yj5jb25maWdMb2c0ajwvYj48L2E+PC9kdD4KIAogCTxkZD5BIGdyYXBoaWNhbCBsb2c0aiBjb25maWd1cmF0aW9uIGVkaXRvciBieSBUb2JpYXMKIAlEZXp1bGlhbi48L2RkPgotCistLT4KIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAogCTxkdD4KIAkgIDxhCi0JaHJlZj0iaHR0cDovL3N1cHBvcnQua2xvcG90ZWsuZGUvbG9nNGovamRiYy9pbmRleC5odG1sIj48Yj5KREJDQXBwZW5kZXI8L2I+PC9hPgorCWhyZWY9Imh0dHA6Ly93d3cuZGFua29tYW5uaGF1cHQuZGUvcHJvamVjdHMvaW5kZXguaHRtbCI+PGI+SkRCQ0FwcGVuZGVyPC9iPjwvYT4KKwk8L2R0PiAKIAotCTwvZHQ+IDxkZD5BIDxjb2RlPkpEQkNBcHBlbmRlcjwvY29kZT4gYnkgPGEKLQlocmVmPSJtYWlsdG86dC5mZW5uZXJAa2xvcG90ZWsuZGUiPlRob21hcyBGZW5uZXI8L2E+LiBOb3RlCi0JdGhhdCBsb2c0aiAxLjIgc2hpcHMgd2l0aCBhbm90aGVyIDxjb2RlPkpEQkNBcHBlbmRlcjwvY29kZT4KLQl3cml0dGVuIGJ5IEtldmluIFN0ZXBwZS4KKyAgICAgICAgPGRkPkEgcG93ZXJmdWwgPGNvZGU+SkRCQ0FwcGVuZGVyPC9jb2RlPiBieSBEYW5rbyBNYW5uaGF1cHQKKwkgIHdobyBjb250aW51ZXMgdGhlIHdvcmsgb2YgVGhvbWFzIEZlbm5lci4gWW91IG1pZ2h0IGZpbmQKKwkgIHRoaXMgSkRCQ0FwcGVuZGVyIG1vcmUgc3VpdGFibGUgdGhlbiB0aGUgb25lIHRoYXQgc2hpcHMgd2l0aAorCSAgbG9nNGogMS4yLiAKIAk8L2RkPgogCisgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKwk8ZHQ+CisJICA8YQorCWhyZWY9Imh0dHA6Ly9qdXN0NGxvZy5zZi5uZXQvIj48Yj5KdXN0NGxvZzwvYj48L2E+CisJPC9kdD4gCisKKyAgICAgICAgPGRkPkp1c3Q0TG9nIGlzIGEgbGlicmFyeSB0byBlbmhhbmNlIGR5bmFtaWNhbGx5IHRoZQorICAgICAgICBwZXJmb3JtYW5jZSBvZiB2YXJpb3VzIGxvZ2dpbmcgc3lzdGVtcyBpbnNpZGUgYSBqYXZhCisgICAgICAgIGFwcGxpY2F0aW9uLiBEeW5hbWljYWxseSBiZWNhdXNlIHRoZSBzb3VyY2Vjb2RlIGluIGphdmEgaXMgbm90CisgICAgICAgIG1vZGlmaWVkIGJ1dCByYXRoZXIgdGhlIG9wdGltaXphdGlvbiBvY2N1cnMgb24gdGhlIGNvbXBpbGVkCisgICAgICAgIEJ5dGVDb2RlIGZpbGVzLgorCTwvZGQ+CisKKyAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CQorCTxkdD48YSBocmVmPSJodHRwOi8vcHVybC5uZXQvandhcmUvYW50eC8iPjxiPmxvZzRBbnQ8L2I+PC9hPjwvZHQ+CisKKwk8ZGQ+bG9nNEFudCBpbmNsdWRlcyBhIGNvbXBsZXRlIGJyaWRnZSB0byB0aGUgTG9nNEogbG9nZ2luZyBzeXN0ZW1mb3IgYSByb2J1c3QgYnVpbGQgbW9uaXRvcmluZyBzeXN0ZW0uIAorCVRoZXNlIEFudCBjb21wb25lbnRzIGxldCB5b3UgY2FwdHVyZSwgbWFwLCBhbmQgc2VuZCBBbnQgbG9nIG1lc3NhZ2VzIGFuZCBzdGRpbyBvdXRwdXQgdGhyb3VnaCB5b3VyIExvZzRKIGluc3RhbGxhdGlvbi4gIENvbnRhY3QgPGEgaHJlZj0ibWFpdG86Y29udGFjdEBqd2FyZS5pbmZvIj5jb250YWN0QGp3YXJlLmluZm88L2E+CisgICAgICAgIDwvZGQ+CisgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkKKworCTxkdD48YSBocmVmPSJodHRwOi8vbG9nNGo0MDAuc291cmNlZm9yZ2UubmV0LyI+PGI+bG9nNGo0MDA8L2I+PC9hPjwvZHQ+CisKKwk8ZGQ+TG9nNEo0MDAgaW5jbHVkZXMgTWVzc2FnZVF1ZXVlIGFuZCBEYXRhUXVldWUgQXBwZW5kZXJzIGZvcgorCXRoZSBBUy80MDAgKGFrYSBJQk0gaVNlcmllcykuCisgICAgICAgIDwvZGQ+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JCisJCisJPGR0PjxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbG9nNGoyZGIiPjxiPmxvZzRqMmRiPC9iPjwvYT48L2R0PgorCisJPGRkPlRoaXMgUHJvamVjdCBwcm92aWRlcyBhIHNldCBvZiBFSkJzIHRvIHN0b3JlIExvZzRKIGV2ZW50cworCShyZWNlaXZlZCB2aWEgSk1TIGFwcGVuZGVyKSBpbiBhIGRhdGFiYXNlLiBUaGUgbWFpbiBhaW0gaXMgdG8KKwlwcm92aWRlIGEgdG9vbHNldCBmb3IgYSBjZW50cmFsaXplZCwgZGF0YS1jZW50ZXIgc3VpdGFibGUKKwlsb2dnaW5nLgorICAgICAgICA8L2RkPgorCiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CQogCQotCTxkdD48YQotCWhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuamluaS5vcmcvZXhjaGFuZ2UvcHJvamVjdHMvbG9nIj48Yj5KSU5JCi0JbG9nZ2luZyBzZXJ2aWNlPC9iPjwvYT4gKHJlZ2lzdHJhdGlvbiByZXF1aXJlZCk8L2R0PgotCi0JPGRkPkEgbG9nNGogd3JhcHBlciBmb3IgSklOSSBieSBKZXJvbWUgQmVybmFyZC48L2RkPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQk8ZHQ+PGEgaHJlZj0iaHR0cDovL3Fvcy5jaC8iPjxiPmxvZzRqPGVtPk1FPC9lbT48L2I+PC9hPjwvZHQ+CisJPGR0PjxhIGhyZWY9Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzL2pha2FydGEtbG9nNGovbG9nNGpNaW5pLyI+PGI+bG9nNGo8ZW0+TUU8L2VtPjwvYj48L2E+PC9kdD4KIAogCTxkZD5Mb2c0ajxlbT5NRTwvZW0+LCBvciBsb2c0aiBNaW5pRWRpdGlvbiwgaXMgYmFzZWQgb24gdGhlCiAJc2FtZSBjb2RlIGFzIGxvZzRqLiBIb3dldmVyLCBhcyB0aGUgbmFtZSBpbmRpY2F0ZXMgdGhlCkBAIC0xMDUsNDAgKzE0NiwzOSBAQAogCWNvbXBhdGlibGUgd2l0aCBsb2c0aiBzdGFuZGFyZCBlZGl0aW9uLiBZb3UgY2FuIGNob29zZSB0bwogCXVwZ3JhZGUgdG8gbG9nNGogc3RhbmRhcmQgZWRpdGlvbiBhdCBhbnkgdGltZSBieSByZXBsYWNpbmcKIAk8ZW0+bG9nNGpNRS5qYXI8L2VtPiB3aXRoIDxlbT5sb2c0ai5qYXI8L2VtPiBpbiB5b3VyCi0JY2xhc3NwYXRoLgorCWNsYXNzcGF0aC4gQXQgdGhpcyB0aW1lLCBsb2c0ak1FIGlzIG9ubHkgYXZhaWxhYmxlIHRocm91Z2gKKwlDVlMuCisJPC9kZD4KKwkKKyAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JCisJCisJPGR0PjxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbmZ1dHVyZS5kZS9Mb2c0VW5pdC8iPjxiPmxvZzQ8ZW0+VW5pdDwvZW0+PC9iPjwvYT48L2R0PgorCisJPGRkPkxvZzRVbml0IGlzIGEgPGEKKwlocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZy9pbmRleC5odG0iPkpVbml0PC9hPiBleHRlbnNpb24KKwljb21iaW5pbmcgSlVuaXQgd2l0aCBMb2c0Si4gVGhlIGludGVudGlvbiBpcyB0byBjcmVhdGUgdGVzdAorCXByb3RvY29scyBmb3IgSlVuaXQuCisKKyAgICAgICAgPHA+SlVuaXQgaXMgYXN5bW1ldHJpY2FsIGluIHRoZSBzZW5zZSB0aGF0IGl0IGZvY3Vzc2VzIG9uIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIG9mIHRlc3QgZmFpbHVyZXMgYW5kIGVycm9ycy4gU3VjY2Vzc2Z1bAorICAgICAgICBleGVjdXRpb24gb2YgYSB0ZXN0IGNhc2UgaXMgbm90IGZ1cnRoZXIgZG9jdW1lbnRlZC4gSW4gb3JkZXIKKyAgICAgICAgdG8gb2J0YWluIGEgdGVzdCBwcm90b2NvbCB0aGF0IGRvY3VtZW50cyB0aGUgaW5pdGlhbCBzZXR0aW5ncywKKyAgICAgICAgdGhlIHRlc3QgY2FzZSBleGVjdXRpb24gYW5kIGl0cyByZXN1bHRzLCBhIGxvZ2dpbmcgY29tcG9uZW50CisgICAgICAgIGlzIHJlcXVpcmVkLiBMb2c0SiBhcyB0aGUgY3VycmVudCBkZSBmYWN0byBzdGFuZGFyZCBpcworICAgICAgICBzZWxlY3RlZCBmb3IgdGhpcyBleHRlbnNpb24uCisgICAgICAgIDwvcD4KIAk8L2RkPgogCiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAKLQk8ZHQ+PGEgaHJlZj0iaHR0cDovL3d3dy5sYXVuY2hzb2Z0d2FyZS5jb20iPjxiPkxvZ1dlYjwvYj48L2E+IChjb21tZXJjaWFsKSA8L2R0PgorCTxkdD48YSBocmVmPSJodHRwOi8vd3d3LmxhdW5jaHNvZnR3YXJlLmNvbSI+PGI+TG9nNFdlYjwvYj48L2E+IChjb21tZXJjaWFsKSA8L2R0PgogCiAJPGRkPkxvZzRXZWIgaXMgYSBKMkVFIHdlYiBhcHBsaWNhdGlvbiwgZGVzaWduZWQgdG8gd2ViLWVuYWJsZQogCSAgc3lzdGVtIGxvZyBmaWxlcyB0aGF0IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgbG9nNGouCiAJPC9kZD4KIAogCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPGR0PjxhCi0JICAgIGhyZWY9Imh0dHA6Ly90cmF4ZWwuY29tL2x1bWJlcm1pbGwvIj48Yj5MdW1iZXJtaWxsPC9iPjwvYT48L2R0PgotCTxkZD5MdW1iZXJtaWxsIGlzIGEgU3dpbmcodG0pIGxvZyBwcm9jZXNzaW5nIGFuZCBkaXN0cmlidXRpb24KLQkgIHN5c3RlbSBmb3IgTG9nNGouIDwvZGQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JCi0JPGR0PgotCSAgPGEKLQlocmVmPSJodHRwOi8vd3d3LnNlcnZpZGl1bS5jb20vc2l0ZS9sb2dmYWN0b3I1L2luZGV4Lmh0bWwiPjxiPkxvZ0ZhY3RvcjU8L2I+Ci0JPC9hPihjb21tZXJjaWFsKQotCTwvZHQ+IAotCi0JPGRkPkFub3RoZXIgZnVsbC1mZWF0dXJlZCBncmFwaGljYWwgbG9nIHZpZXdlci4gQWZ0ZXIgYSBtZXJnZXIKLQkgIHdpdGggYSBzZXJ2aWNlLW9yaW50ZWQgY29tcGFueSBhbmQgYSBjaGFuZ2UgaW4KLQkgIGJ1c2luZXNzLW9yaWVudGF0aW9uLCB0aGUgb3duZXJzIG9mIExvZ0ZhY3RvcjUgaGF2ZSBkZWNpZGVkCi0JICB0byBkb25hdGUgdGhlaXIgcHJvZHVjdCB0byB0aGUgbG9nNGogcHJvamVjdC4KLQk8L2RkPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JCisJCQogCTxkdD48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RhZ2xpYnMvZG9jL2xvZy1kb2MvaW50cm8uaHRtbCI+CiAJICAgIDxiPkxvZyBUYWc8L2I+PC9hPgogCTwvZHQ+CkBAIC0xNDgsNiArMTg4LDE2IEBACiAKIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAorCTxkdD48YSBocmVmPSJodHRwOi8vd3d3LmNvZGVjemFyLmNvbS9wcm9kdWN0cy9sb2d3ZWIvaW5kZXguaHRtbCI+PGI+TG9nV2ViPC9iPjwvYT4gPC9kdD4KKworCTxkZD5Mb2dXZWIgaXMgYSB3ZWIgaW50ZXJmYWNlIGZvciBjb25maWd1cmluZyBsb2c0aiBhdCBydW50aW1lCisJd2l0aGluIGEgc2VydmxldCBjb250YWluZXIuICBFdmVyeSBsb2c0aiBmZWF0dXJlIG9mIGlzCisJY29uZmlndXJhYmxlIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuCisJPC9kZD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKIAk8ZHQ+PGEgaHJlZj0iaHR0cDovL3d3dy5tMnRlY2hub2xvZ2llcy5uZXQvYXNwL3NubXBUcmFwQXBwZW5kZXIuYXNwIj4KIAkgICAgPGI+U05NUFRyYXBBcHBlbmRlcjwvYj48L2E+CiAJPC9kdD4KQEAgLTE2MCwxMyArMjEwLDUwIEBACiAKIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAorICAgICAgICAgPGR0PjxhIGhyZWY9Imh0dHA6Ly94cG9sb2cuY29tIj48Yj5YcG9Mb2c8L2I+PC9hPgorCTwvZHQ+CisKKwk8ZGQ+TG9nIHZpZXcgYW5kIGFuYWx5c2lzIGFwcGxpY2F0aW9uIHdoaWNoIGVuYWJsZXMgd2ViCisJYnJvd3NpbmcgYW5kIGFuYWx5c2lzIG92ZXIgbG9ncy4KKwk8L2RkPgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKICAgICAgIDwvZGw+CiAgICAgPC9zZWN0aW9uPgogICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IlBvcnRzIHRvIG90aGVyIGxhbmd1YWdlcyI+CisgICAgPHNlY3Rpb24gbmFtZT0iUG9ydHMgdG8gb3RoZXIgbGFuZ3VhZ2VzIChsaXN0ZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIHdpdGhpbiBlYWNoIHNlY3Rpb24pIj4KKworICAgICA8c3Vic2VjdGlvbiBuYW1lPSJGZWxsb3cgQXBhY2hlIExvZ2dpbmcgU2VydmljZXMgUHJvamVjdHMiPgogCiAgICAgICA8ZGw+CQogCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisJPGR0PjxhCisJaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0Y3h4LyI+PGI+bG9nNGN4eDwvYj48L2E+PC9kdD4KKwk8ZGQ+TG9nNGN4eCBpcyBhIHBvcnQgdG8gQysrIG9mIHRoZSBsb2c0aiBwcm9qZWN0LjwvZGQ+CisKKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JCisJPGR0PjxhCisJaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0bmV0LyI+PGI+bG9nNG5ldDwvYj48L2E+PC9kdD4KKworCTxkZD5UaGUgLk5FVCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcG9wdWxhciBsb2c0aiBKYXZhIEFQSQorCXByb3ZpZGluZyBmbGV4aWJsZSBhbmQgYXJiaXRyYXJpbHkgZ3JhbnVsYXIgY29udHJvbCBvdmVyIGxvZworCW1hbmFnZW1lbnQgYW5kIGNvbmZpZ3VyYXRpb24uPC9kZD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPiAKKyAgICAgICAgPGR0PjxhIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNHBocC8iPjxiPmxvZzRwaHA8L2I+PC9hPjwvZHQ+IAorCisgICAgICAgIDxkZD5Mb2c0UGhwIGlzIGEgUEhQIHBvcnQgb2YgbG9nNGogZnJhbWV3b3JrLiBJdCBzdXBwb3J0cyB4bWwgY29uZmlndXJhdGlvbiwKKyAgICAgICAgbG9nZ2luZyB0byBmaWxlcywgc3Rkb3V0L2Vyciwgc3lzbG9nLCBzb2NrZXQsIGNvbmZpZ3VyYWJsZQorICAgICAgICBvdXRwdXQgbGF5b3V0cyBhbmQgbG9nZ2luZyBsZXZlbHMuIDwvZGQ+CisKKyAgICAgPC9kbD4KKyAgICA8L3N1YnNlY3Rpb24+CisKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJPdGhlciBQb3J0cyI+CisgICAgIDxkbD4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAk8ZHQ+PGEKIAlocmVmPSJodHRwOi8vbG9nNGMuc291cmNlZm9yZ2UubmV0Ij48Yj5sb2c0YzwvYj48L2E+PC9kdD4KIApAQCAtMTg2LDcgKzI3MywxMCBAQAogCiAJPGR0PjxhCiAJaHJlZj0iaHR0cDovL2xvZzRjcGx1cy5zb3VyY2Vmb3JnZS5uZXQvIj48Yj5sb2c0Y3BsdXM8L2I+PC9hPjwvZHQ+Ci0JPGRkPkEgY29tcGV0aW5nIHBvcnQgdG8gQysrLjwvZGQ+IAorCTxkZD5Mb2c0Y3BsdXMgaXMgYSBzaW1wbGUgdG8gdXNlIEMrKyBsb2dnaW5nIEFQSSBwcm92aWRpbmcKKwl0aHJlYWQtc2FmZSwgZmxleGlibGUsIGFuZCBhcmJpdHJhcmlseSBncmFudWxhciBjb250cm9sIG92ZXIKKwlsb2cgbWFuYWdlbWVudCBhbmQgY29uZmlndXJhdGlvbi4gSXQgaXMgbW9kZWxlZCBhZnRlciB0aGUgSmF2YQorCWxvZzRqIEFQSS48L2RkPgogCiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAJCkBAIC0xOTgsMTQgKzI4OCwyNSBAQAogCTwvZGQ+CiAJCiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JCiAJPGR0PjxhCi0JaHJlZj0iaHR0cDovL3d3dy5uZW93b3Jrcy5jb20vcHJvZHVjdHMvbG9nNG5ldC8iPjxiPmxvZzRuZXQ8L2I+PC9hPjwvZHQ+CisJaHJlZj0iaHR0cDovL2xvZzRwZXJsLnNvdXJjZWZvcmdlLm5ldCI+PGI+TG9nOjpMb2c0cGVybDwvYj48L2E+PC9kdD4KIAotCTxkZD5UaGUgLk5FVCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcG9wdWxhciBsb2c0aiBKYXZhIEFQSQotCXByb3ZpZGluZyBmbGV4aWJsZSBhbmQgYXJiaXRyYXJpbHkgZ3JhbnVsYXIgY29udHJvbCBvdmVyIGxvZwotCW1hbmFnZW1lbnQgYW5kIGNvbmZpZ3VyYXRpb24uPC9kZD4KLQkKKwk8ZGQ+TG9nOjpMb2c0cGVybCBpcyBhIFBlcmwgcG9ydCBvZiBsb2c0aiBieSBLZXZpbiBHb2VzcyBhbmQKKwlNaWtlIFNjaGlsbGkuIFRoZSBhdXRob3JzIG1hZGUgc3VyZSB0aGF0IHRoZWlyIHBvcnQgd2FzIGFzCisJY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uLiAgRXZlbiB0aGUKKwljb25maWd1cmF0aW9uIGZpbGVzIGFyZSBzaW1pbGFyISBUaGUgcHJvamVjdCBpcyBzdGlsbCBiZWluZworCWVuaGFuY2VkLCBob3dldmVyIHRoZSBjdXJyZW50IHJlbGVhc2UgaXMgc3RhYmxlIGFuZCBoYXMgYmVlbgorCXJlbGVhc2VkIHRvIENQQU4uCisJPC9kZD4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JCisgICAgICAgIDxkdD48YSBocmVmPSJodHRwOi8vbG9nNGxzLnNvdXJjZWZvcmdlLm5ldC8iPjxiPmxvZzRMUzwvYj48L2E+PC9kdD4KKworICAgICAgICA8ZGQ+TG9nNExTIGlzIGEgTG90dXNTY3JpcHQgbGlicmFyeSBwYWNrYWdlIGFuZCBpcyB1c2VkIHRvIGdldAorICAgICAgICAgbG9nZ2luZyBzdGF0ZW1lbnRzIHRvIGEgRG9taW5vIGRhdGFiYXNlLCBzZW50IGJ5IG1haWwgb3IKKyAgICAgICAgIHdyaXR0ZW4gdG8gYSBmaWxlLiBJdCBpcyBtb2RlbGVkIGFmdGVyIEpha2FydGEgbG9nNGouCisgICAgICAgICA8L2RkPgorCiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAJPGR0PjxhCiAJaHJlZj0iaHR0cDovL3d3dy5pdHM0eW91LmF0L2xvZzRweS5waHAiPjxiPmxvZzRweTwvYj48L2E+PC9kdD4KQEAgLTIzMyw3ICszMzQsMTMgQEAKIAk8L2RkPgogCQogCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQorCTxkdD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3FtbXNsb2ciPjxiPnFtbXNsb2c8L2I+PC9hPjwvZHQ+CiAKKwk8ZGQ+UW1tc2xvZyBpcyBhIHBvcnQgb2YgbG9nNGogdG8gdGhlIFF0L0MrKyBwbGF0Zm9ybS4KKwk8L2RkPgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAJPGR0PjxhCiAJaHJlZj0iaHR0cDovL2xvZzRyLnNvdXJjZWZvcmdlLm5ldCI+PGI+bG9nNHI8L2I+PC9hPjwvZHQ+CiAJPGRkPkEgUG93ZXJmdWwgTG9nZ2VyIGZvciBSdWJ5LiAKQEAgLTI0OCwxMCArMzU1LDExIEBACiAJCiAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgICA8L2RsPgotICAgICAgCisKKyAgICAgPC9zdWJzZWN0aW9uPgogICAgICAgCiAgICAgICA8cD5JZiB5b3Ugd291bGQgbGlrZSB5b3VyIHNvZnR3YXJlIHRvIGJlIGxpc3RlZCBoZXJlLCB0aGVuIHNlbmQgYSBub3RlIHRvIHRoZSA8YQotCSAgaHJlZj0ibWFpbHRvOmxvZzRqLXVzZXJAamFrYXJ0YS5hcGFjaGUub3JnIj5sb2c0ai11c2VyQGpha2FydGEuYXBhY2hlLm9yZzwvYT4KKwkgIGhyZWY9Im1haWx0bzpsb2c0ai11c2VyQGxvZ2dpbmcuYXBhY2hlLm9yZyI+bG9nNGotdXNlckBsb2dnaW5nLmFwYWNoZS5vcmc8L2E+CiAJbGlzdC48L3A+CiAgICAgICAKICAgICA8L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9zcmMveGRvY3MvZWFybGllci54bWwgYi9zcmMveGRvY3MvZWFybGllci54bWwKaW5kZXggZjk3ZmViNC4uZjUxYzY5NiAxMDA2NDQKLS0tIGEvc3JjL3hkb2NzL2VhcmxpZXIueG1sCisrKyBiL3NyYy94ZG9jcy9lYXJsaWVyLnhtbApAQCAtMTIsMjcgKzEyLDE1IEBACiAKICAgICAgIDxoci8+IAogICAgICAgCi0gICAgICA8cD48Yj5CRVdBUkU6PC9iPiBGb3Igc29tZSByZWFzb24gSW50ZXJuZXQgRXhwbG9yZXIgZGVjaWRlcyB0bwotCXJlbmFtZSAiLnRhci5neiIgZmlsZXMgYXMgIi50YXIiLiBZb3Ugc2hvdWxkIHJlbmFtZSB0aGUgZmlsZXMgYmFjayB0bworICAgICAgPHA+PGI+QkVXQVJFOjwvYj5DZXJ0YWluIEludGVybmV0IEV4cGxvcmVyIHZlcnNpb25zIHJlbmFtZSAudGFyLmd6IGRvd25sb2FkcworICAgICAgICBhcyAudGFyLiAgWW91IHNob3VsZCByZW5hbWUgdGhlIGZpbGVzIGJhY2sgdG8KIAk8Y29kZT50YXIuZ3o8L2NvZGU+IGFmdGVyIHRoZSBkb3dubG9hZCBjb21wbGV0ZXMuCiAgICAgICA8L3A+IAogICAgICAgPGhyLz4KIAotICAgICAgPGRsPgotCTxkdD48Yj5qYWthcnRhLWxvZzRqLTEuMC40PC9iPjwvZHQ+Ci0JPGRkPgotCSAgRG93bmxvYWQgZnVsbCBwYWNrYWdlIGluIDxhIGhyZWY9Ii4uL2pha2FydGEtbG9nNGotMS4wLjQudGFyLmd6Ij5UQVIuR1o8L2E+IAotCSAgZm9ybWF0LiAKLQk8L2RkPgorICAgICAgPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2xvZ2dpbmcvbG9nNGovIj5Mb2c0aiBBcmNoaXZlczwvYT4KIAotCTxkdD48Yj5qYWthcnRhLWxvZzRqLTEuMS4zPC9iPjwvZHQ+Ci0JPGRkPgotCSAgRG93bmxvYWQgZnVsbCBwYWNrYWdlIGluIDxhIGhyZWY9Ii4uL2pha2FydGEtbG9nNGotMS4xLjMudGFyLmd6Ij5UQVIuR1o8L2E+IAotCSAgZm9ybWF0LgotCTwvZGQ+Ci0gICAgICA8L2RsPgotCi08L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgogCiA8L2JvZHk+CiA8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvc3JjL3hkb2NzL2hpc3RvcnkueG1sIGIvc3JjL3hkb2NzL2hpc3RvcnkueG1sCmluZGV4IGE1OWQ3YTYuLjc3ZjQ0ODMgMTAwNjQ0Ci0tLSBhL3NyYy94ZG9jcy9oaXN0b3J5LnhtbAorKysgYi9zcmMveGRvY3MvaGlzdG9yeS54bWwKQEAgLTE3LDIwICsxNywxOSBAQAogICAgICAgPC9wPgogCiAgICAgICA8cD5UaGUgcHJvamVjdCdzIG9mZmljaWFsIFVSTCBpcyA8YQotCSAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0aiI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ajwvYT4uCisJICBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqIj5odHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqPC9hPi4KICAgICAgIDwvcD4KIAogICAgICAgPHA+TWFueSB0aGFua3MgdG8gYWxsIHRoZSBsb2c0aiB1c2VycyB3aG8ga2VlcCBzZW5kaW5nIHVzIGlucHV0Ci0JYW5kIHNvbWV0aW1lcyBldmVuIHByYWlzZSBmb3Igb3VyIGNvbGxlY3RpdmUgZWZmb3J0LiBUaGUgZmlyc3QKLQlhbmNlc3RvciBvZiBsb2c0aiB3YXMgd3JpdHRlbiBmb3IgdGhlIEUuVS4gc3BvbnNvcmVkIDxhCi0JaHJlZj0iaHR0cDovL3d3dy5zZW1wZXIub3JnIj5TRU1QRVI8L2E+IHByb2plY3QuICBOLiBBc29rYW4sCi0JQ2VraSBHJiMyNTI7bGMmIzI1MjsgYW5kIE1pY2hhZWwgU3RlaW5lciBjYW1lIHVwIHdpdGggdGhlIGlkZWEKLQlvZiBoaWVyYXJjaGljYWwgbG9nZ2VycyBiYWNrIGluIDE5OTYuIFRoZWlyIGlkZWEgaXMgc3RpbGwKLQlhdCB0aGUgaGVhcnQgb2YgbG9nNGouIFRoZSBwYWNrYWdlIHdhcyBjb25zaWRlcmFibHkgaW1wcm92ZWQKLQlvdmVyIHRoZSB5ZWFycyBhdCB0aGUgPGEKLQlocmVmPSJodHRwOi8vd3d3Lnp1cmljaC5pYm0uY29tIj48Yj5JQk0gWnVyaWNoIFJlc2VhcmNoCi0JTGFib3JhdG9yeTwvYj48L2E+LiBIb3dldmVyLCBsb2c0aiBpcyBubyBsb25nZXIgYXNzb2NpYXRlZCBub3IKLQlzdXBwb3J0ZWQgYnkgSUJNLgorICAgICAgYW5kIHNvbWV0aW1lcyBldmVuIHByYWlzZSBmb3Igb3VyIGNvbGxlY3RpdmUgZWZmb3J0LiBUaGUgZmlyc3QKKyAgICAgIGFuY2VzdG9yIG9mIGxvZzRqIHdhcyB3cml0dGVuIGZvciB0aGUgRS5VLiBzcG9uc29yZWQgPGEKKyAgICAgIGhyZWY9Imh0dHA6Ly93d3cuc2VtcGVyLm9yZyI+U0VNUEVSPC9hPiBwcm9qZWN0LiAgTi4gQXNva2FuLAorICAgICAgQ2VraSBHJiMyNTI7bGMmIzI1MjsgYW5kIE1pY2hhZWwgU3RlaW5lciBjYW1lIHVwIHdpdGggdGhlIGlkZWEKKyAgICAgIG9mIGhpZXJhcmNoaWNhbCBsb2dnZXJzIGJhY2sgaW4gMTk5Ni4gVGhlaXIgaWRlYSBpcyBzdGlsbCBhdCB0aGUKKyAgICAgIGhlYXJ0IG9mIGxvZzRqLiBUaGUgcGFja2FnZSB3YXMgY29uc2lkZXJhYmx5IGltcHJvdmVkIG92ZXIgdGhlCisgICAgICB5ZWFycyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy56dXJpY2guaWJtLmNvbSI+SUJNIFp1cmljaAorICAgICAgUmVzZWFyY2ggTGFib3JhdG9yeTwvYT4uIEhvd2V2ZXIsIGxvZzRqIGlzIG5vIGxvbmdlciBhc3NvY2lhdGVkCisgICAgICBub3Igc3VwcG9ydGVkIGJ5IElCTS4KICAgICAgIDwvcD4KIAogICAgICAgPHA+U3BlY2lhbCB0aGFua3MgdG8gTS4gTmlrc2NoIGZyb20gWlJMIGZvciBoaXMgYXNzaXN0YW5jZSBvbgpAQCAtMzksMTAgKzM4LDcgQEAKIAloZWxwZnVsIGluIGVhc2luZyB0aGUgbW92ZSB0byBBcGFjaGUuCiAgICAgICA8L3A+CiAKLSAgICAgIDxwPlRoZSBsb2c0aiBsb2dvIHdhcyBkZXNpZ25lZCBhbmQga2luZGx5IGRvbmF0ZWQgYnkgPGEKLQkgIGhyZWY9Imh0dHA6Ly93d3cuY3liZXJsYWIuY2giPjxJTUcKLQkgIHNyYz0iaW1hZ2VzL2N5YmVybGFiMTUuZ2lmIiBBTFQ9IkN5YmVybGFiIFMuQS4iCi0JICBBTElHTj0iYWJzY2VudGVyIi8+PC9hPiBvZiBTd2l0emVybGFuZC4KKyAgICAgIDxwPlRoZSBsb2c0aiBsb2dvIHdhcyBkZXNpZ25lZCBhbmQga2luZGx5IGRvbmF0ZWQgYnkgQ3liZXJsYWIgU0Egb2YgU3dpdHplcmxhbmQuCiAgICAgICA8L3A+IAogCiAgICAgPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvc3JjL3hkb2NzL2luZGV4LnhtbCBiL3NyYy94ZG9jcy9pbmRleC54bWwKaW5kZXggNjFjYzFiZC4uZjJiMmE2MyAxMDA2NDQKLS0tIGEvc3JjL3hkb2NzL2luZGV4LnhtbAorKysgYi9zcmMveGRvY3MvaW5kZXgueG1sCkBAIC01MywxNCArNTMsMTMgQEAKIAlyZW1vdGUgbG9nNGogc2VydmVyLCBhIHJlbW90ZSBVbml4IFN5c2xvZyBkYWVtb24sIG9yIGV2ZW4gYSBOVAogCUV2ZW50IGxvZ2dlciBhbW9uZyBtYW55IG90aGVyIG91dHB1dCB0YXJnZXRzLjwvcD4KIAotICAgICAgPHA+T24gYSAyMzMgTUh6IFRoaW5rUGFkIHJ1bm5pbmcgSkRLIDEuMS43QiwgaXQgY29zdHMgYWJvdXQgNDYKLQluYW5vc2Vjb25kcyB0byBkZXRlcm1pbmUgaWYgdGhhdCBzdGF0ZW1lbnQgc2hvdWxkIGJlIGxvZ2dlZCBvcgotCW5vdC4gQWN0dWFsIGxvZ2dpbmcgaXMgYWxzbyBxdWl0ZSBmYXN0LCByYW5naW5nIGZyb20gNzkKLQltaWNyb3NlY29uZHMgdXNpbmcgdGhlIFNpbXBsZUxheW91dCwgMTY0IG1pY3Jvc2Vjb25kcyB1c2luZwotCXRoZSBUVENDTGF5b3V0IGFuZCBhcm91bmQgYSBtaWxsaXNlY29uZCB3aGVuIHByaW50aW5nCi0JZXhjZXB0aW9ucy4gVGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBQYXR0ZXJuTGF5b3V0IGlzIGFsbW9zdCBhcwotCWdvb2QgYXMgdGhlIGRlZGljYXRlZCBsYXlvdXRzLCBleGNlcHQgdGhhdCBpdCBpcyBhIGxvdCBtb3JlCi0JZmxleGlibGUuPC9wPgorICAgICAgPHA+T24gYW4gQU1EIER1cm9uIGNsb2NrZWQgYXQgODAwTWh6IHJ1bm5pbmcgSkRLIDEuMy4xLCBpdCBjb3N0cworCWFib3V0IDUgbmFub3NlY29uZHMgdG8gZGV0ZXJtaW5lIGlmIGEgbG9nZ2luZyBzdGF0ZW1lbnQgc2hvdWxkCisJYmUgbG9nZ2VkIG9yIG5vdC4gQWN0dWFsIGxvZ2dpbmcgaXMgYWxzbyBxdWl0ZSBmYXN0LCByYW5naW5nCisJZnJvbSAyMSBtaWNyb3NlY29uZHMgdXNpbmcgdGhlIFNpbXBsZUxheW91dCwgMzcKKwltaWNyb3NlY29uZHMgdXNpbmcgdGhlIFRUQ0NMYXlvdXQuICBUaGUgcGVyZm9ybWFuY2Ugb2YgdGhlCisJUGF0dGVybkxheW91dCBpcyBhbG1vc3QgYXMgZ29vZCBhcyB0aGUgZGVkaWNhdGVkIGxheW91dHMsCisJZXhjZXB0IHRoYXQgaXQgaXMgbXVjaCBtb3JlIGZsZXhpYmxlLjwvcD4KIAogICAgICAgPHA+VGhlIHBhY2thZ2UgaXMgYmVpbmcgY29uc3RhbnRseSBpbXByb3ZlZCB0aGFua3MgdG8gaW5wdXQgZnJvbQogCXVzZXJzIGFuZCBjb2RlIGNvbnRyaWJ1dGVkIGJ5IGF1dGhvcnMgaW4gdGhlIGNvbW11bml0eS4KZGlmZiAtLWdpdCBhL3NyYy94ZG9jcy9sZjUvY29uZmlndXJhdGlvbi54bWwgYi9zcmMveGRvY3MvbGY1L2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzhlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveGRvY3MvbGY1L2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMTE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxkb2N1bWVudD4KKyAgCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9IkJNYXJsYm9yb3VnaEB0aG91Z2h0d29ya3MuY29tIj5CcmFkIE1hcmxib3JvdWdoPC9hdXRob3I+CisgICAgPHRpdGxlPkxvZ0ZhY3RvcjUgVXNlcnMnIEd1aWRlPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorICAKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iTG9nRmFjdG9yNSBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uIj4KKworICAgICAgCisgICAgICA8cD5UaGVyZSBhcmUgdHdvIHdheXMgb2YgY29uZmlndXJpbmcgTG9nRmFjdG9yNTogdXNpbmcgYSBsb2c0aiBwcm9wZXJ0aWVzIGZpbGUsIAorCW9yIHVzaW5nIHRoZSBDb25maWd1cmUgbWVudSBpbiB0aGUgTG9nRmFjdG9yNSBHVUkuIAorICAgICAgPC9wPgorCisgICAgICA8aDM+Q29uZmlndXJhdGlvbiBVc2luZyBhIFByb3BlcnRpZXMgRmlsZTwvaDM+CisKKyAgICAgIDxwPlRoZSA8Y29kZT5MRjVBcHBlbmRlcjwvY29kZT4gaGFzIGEgc2luZ2xlIHByb3BlcnR5IHRoYXQgY2FuCisJYmUgc2V0IHZpYSBhIGxvZzRqIHByb3BlcnRpZXMgZmlsZSwgdGhlCisJPGI+TWF4TnVtYmVyT2ZSZWNvcmRzPC9iPiBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5CisJTG9nRmFjdG9yNSB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8KKwlkaXNwbGF5IGF0IGFueSBvbmUgdGltZSBpbiB0aGUgR1VJLiAgSWYgdGhpcyBtYXhpbXVtIG51bWJlciBpcworCWV4Y2VlZGVkLCBMb2dGYWN0b3I1IGJlZ2lucyB0byByZW1vdmUgdGhlIG9sZGVzdCByZWNvcmRzLCBvbmUKKwlhdCBhIHRpbWUuIFJlbW92aW5nIHJlY29yZHMgaW4gdGhpcyBmYXNoaW9uIHJlZHVjZXMgdGhlIHJpc2sKKwl0aGF0IHlvdXIgY29tcHV0ZXIgd2lsbCBydW4gb3V0IG9mIG1lbW9yeSB3aGlsZSB0aGUgR1VJIGlzCisJcnVubmluZy4gSWYgdGhlIDxiPk1heE51bWJlck9mUmVjb3JkczwvYj4gcHJvcGVydHkgaXMgbm90IHNldCwKKwlMb2dGYWN0b3I1IHNldHMgYSBkZWZhdWx0IHZhbHVlIG9mIDUwMDAuPC9wPgorCisgICAgICA8cD5UbyBzZXQgdGhlIDxiPk1heE51bWJlck9mUmVjb3JkczwvYj4gcHJvcGVydHkgdXNpbmcgYSByZWd1bGFyCisJPGk+amF2YS51dGlsLlByb3BlcnRpZXM8L2k+IGZpbGUsIHlvdSBzaG91bGQgdXNlIHRoZSBmb2xsb3dpbmcKKwlsaW5lIChyZXBsYWNlIEExIHdpdGggdGhlIG5hbWUgb2YgeW91ciBhcHBlbmRlcik6CisgICAgICA8L3A+CisKKzxwcmU+ICAgICBsb2c0ai5hcHBlbmRlci5BMS5NYXhOdW1iZXJPZlJlY29yZHM9MjAwMAorPC9wcmU+CisKKyAgICAgIDxwPlRvIHNldCB0aGUgPGI+TWF4TnVtYmVyT2ZSZWNvcmRzPC9iPiBwcm9wZXJ0eSB1c2luZyBhbiBYTUwKKwlwcm9wZXJ0aWVzIGZpbGUsIHlvdSBzaG91bGQgdXNlIHRoZSBmb2xsb3dpbmcgbGluZXMgKHJlcGxhY2UKKwl0aGUgbmFtZSBMRjVBcHBlbmRlciB3aXRoIHRoZSBuYW1lIG9mIHlvdXIgYXBwZW5kZXIpOjwvcD4KKzxwcmU+CisgICAgJmx0O2FwcGVuZGVyIG5hbWU9IkxGNUFwcGVuZGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5sZjUuTEY1QXBwZW5kZXIiJmd0OworICAgICAgICZsdDtwYXJhbSBuYW1lPSJNYXhOdW1iZXJPZlJlY29yZHMiIHZhbHVlPSIxMDAwIi8mZ3Q7CisgICAgJmx0Oy9hcHBlbmRlciZndDsKKworICAgICZsdDtyb290Jmd0OworICAgICAgJmx0O3ByaW9yaXR5IHZhbHVlID0iZGVidWciIC8mZ3Q7CisgICAgICAmbHQ7YXBwZW5kZXItcmVmIHJlZj0iTEY1QXBwZW5kZXIiLyZndDsKKyAgICAmbHQ7L3Jvb3QmZ3Q7Cis8L3ByZT4KKworICAgICAgPHA+PGI+Tm90ZTo8L2I+IFNldHRpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8gZGlzcGxheQorCXZpYSB0aGUgQ29uZmlndXJlLSZndDtTZXQgTWF4IE51bWJlciBPZiBSZWNvcmRzIG1lbnUgaW4gdGhlCisJTG9nRmFjdG9yNSBHVUkgd2lsbCBvdmVycmlkZSBhbnkgdmFsdWUgdGhhdCB5b3Ugc2V0IGluIHRoaXMKKwljb25maWd1cmF0aW9uIGZpbGUuCisgICAgICA8L3A+CisKKyAgICAgIDxoMz5Db25maWd1cmF0aW9uIFVzaW5nIHRoZSBHVUk8L2gzPiAKKyAgICAgIDxoND5TYXZlPC9oND4gCisKKyAgICAgIDxwPiBMb2dGYWN0b3I1IGFsbG93cyB5b3UgdG8gc2F2ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mCisJeW91ciBsb2dnaW5nIGNvbnNvbGUgdXNpbmcgdGhlIENvbmZpZ3VyZSBtZW51LiBUaGUKKwlDb25maWd1cmUtJmd0O1NhdmUgbWVudSBvcHRpb24gc2F2ZXMgeW91ciBjdXJyZW50IEdVSQorCWNvbmZpZ3VyYXRpb24gdG8gYSBmaWxlIGNhbGxlZAorCTxiPmxmNV9jb25maWd1cmF0aW9uLnhtbDwvYj4uIFRoaXMgY29uZmlndXJhdGlvbiBmaWxlIGlzIGEKKwlzYXZlZCB0byB0aGUgbG9jYXRpb24gJmx0O1VTRVJfSE9NRSZndDsvbGY1IG9uIHlvdXIgbG9jYWwKKwlkcml2ZS4KKyAgICAgIDwvcD4KKworICAgICAgPHA+VGhlIGluZm9ybWF0aW9uIHNhdmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgYXMKKwlmb2xsb3dzOjwvcD4KKworICAgICAgPHVsPgorCTxsaT5UaGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBsb2dnZXIgZXhwbG9yZXIgd2luZG93IGluY2x1ZGluZyBhbGwgCisJICBzZWxlY3RlZCBhbmQgZGUtc2VsZWN0ZWQgY2hhbm5lbHM8L2xpPgorCTxsaT5UaGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGFsbCBsZXZlbDwvbGk+CisJPGxpPlRoZSB2aWV3IHNldHRpbmdzLCBhbmQ8L2xpPgorCTxsaT5UaGUgbGFzdCBOREMgZmlsdGVyIHVzZWQgKGlmIHRoZSBSZXN0b3JlIEFsbCBOREMncyBpdGVtIHdhcyBub3Qgc2VsZWN0ZWQgCisJICBwcmlvciB0byBzYXZpbmcpLjwvbGk+CisgICAgICA8L3VsPgorCisgICAgICA8cD5PbmNlIHlvdSBoYXZlIHNhdmVkIGEgY29uZmlndXJhdGlvbiwgeW91ciBjb25maWd1cmF0aW9uIGlzIGxvYWRlZCBlYWNoIHRpbWUgCisJdGhhdCB5b3Ugc3RhcnQgTG9nRmFjdG9yNS48L3A+CisKKyAgICAgIDxoND5SZXNldDwvaDQ+CisKKyAgICAgIDxwPiBZb3UgY2FuIHJlbW92ZSB5b3VyIGN1cnJlbnRseSBzYXZlZCBjb25maWd1cmF0aW9uIGJ5IHVzaW5nCisJdGhlIENvbmZpZ3VyZS0mZ3Q7UmVzZXQgbWVudSBvcHRpb24uIFRoaXMgd2lsbCBkZWxldGUgdGhlCisJbGY1X2NvbmZpZ3VyYXRpb24ueG1sIGZpbGUgZnJvbSB5b3VyIGxvY2FsIGZpbGUgc3lzdGVtLjwvcD4KKyAgICAgIAorICAgICAgPGg0PlNldCBNYXggTnVtYmVyIE9mIFJlY29yZHM8L2g0PgorCisgICAgICA8cD5UaGUgQ29uZmlndXJlIG1lbnUgYWxzbyBpbmNsdWRlcyBhICZxdW90O1NldCBNYXggTnVtYmVyIE9mIFJlY29yZHMmcXVvdDsgb3B0aW9uLCAKKwl3aGljaCBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIAorCWluIHRoZSBHVUkgYXQgYW55IHRpbWUuIFNldHRpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdXNpbmcgdGhpcyBtZW51IAorCWl0ZW0gd2lsbCBvdmVycmlkZSBhbnkgdmFsdWUgdGhhdCB5b3Ugc2V0IGluIHlvdXIgbG9nNGogcHJvcGVydHkgZmlsZSAoc2VlIGJlbG93KS4gCisJPGI+Tm90ZTo8L2I+IFRoZSB2YWx1ZSB0aGF0IHlvdSBzZXQgdXNpbmcgdGhpcyBvcHRpb24gPGI+aXMgbm90PC9iPiBzYXZlZCBpbnRvIAorCXRoZSBsZjVfY29uZmlndXJhdGlvbiBmaWxlLjwvcD4KKworICAgICAgPGg0PlJlbW92aW5nIEVtcHR5IENhdGVnb3JpZXM8L2g0PgorCisgICAgICA8cD5XaGVuIHlvdSBzYXZlIHlvdXIgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgQ29uZmlndXJlLSZndDtTYXZlIG1lbnUgb3B0aW9uLCAKKwlhbmQgdGhlbiBzdGFydCBsb2dnaW5nIGZyb20gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24sIHlvdSB3aWxsIGxpa2VseSBmaW5kIHRoYXQgCisJbWFueSBvZiB0aGUgY2F0ZWdvcmllcyB5b3Ugc2F2ZWQgYXJlIGVtcHR5LiBZb3UgY2FuIHJlbW92ZSB0aGVzZSAmcXVvdDtkZWFkJnF1b3Q7IAorCWNhdGVnb3JpZXMgZnJvbSB0aGUgZGlzcGxheSBieSByaWdodCBjbGlja2luZyBvbiB0aGUgcm9vdCBvZiB0aGUgY2F0ZWdvcnkgdHJlZSAKKwlpbiB0aGUgY2F0ZWdvcnkgZXhwbG9yZXIsIGFuZCBjaG9vc2luZyB0aGUgJnF1b3Q7UmVtb3ZlIEFsbCBFbXB0eSBDYXRlZ29yaWVzJnF1b3Q7IAorCW9wdGlvbi4gVGhpcyB3aWxsIHBydW5lIHRoZSBjYXRlZ29yeSBleHBsb3JlciB0cmVlIHRvIGRpc3BsYXkgb25seSB0aG9zZSBjaGFubmVscyAKKwl0aGF0IGNvbnRhaW4gaW5mb3JtYXRpb24uPC9wPgorCisgICAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xmNV9yZW1vdmVfY2F0ZWdvcmllcy5naWYiIHdpZHRoPSI2MDAiIGhlaWdodD0iNDkwIi8+PC9wPgorCisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy94ZG9jcy9sZjUvZXhhbXBsZXMueG1sIGIvc3JjL3hkb2NzL2xmNS9leGFtcGxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjNWYyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94ZG9jcy9sZjUvZXhhbXBsZXMueG1sCkBAIC0wLDAgKzEsNTY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxkb2N1bWVudD4KKyAgCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9IkJNYXJsYm9yb3VnaEB0aG91Z2h0d29ya3MuY29tIj5CcmFkIE1hcmxib3JvdWdoPC9hdXRob3I+CisgICAgPHRpdGxlPkxvZ0ZhY3RvcjUgVXNlcnMnIEd1aWRlPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorICAKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iTG9nRmFjdG9yNSBFeGFtcGxlcyI+CisKKyAgICAgIDxoMz48Yj48Zm9udCBjb2xvcj0iIzAwMDA5OSI+RXhhbXBsZSAxOiBJbml0VXNpbmdEZWZhdWx0Q29uZmlndXJhdG9yPC9mb250PjwvYj4KKyAgICAgIDwvaDM+CisgICAgICA8aDQ+RXhhbXBsZSBEZXNjcmlwdGlvbjo8L2g0PgorCisgICAgICA8cD5UaGUgTG9nRmFjdG9yNSBsaWJyYXJ5IGhhcyBhIERlZmF1bHRMRjVDb25maWd1cmF0b3IgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYQorCXZlcnkgYmFzaWMgTG9nRmFjdG9yNSBjb25maWd1cmF0aW9uIGZvciB5b3UuIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gcHJvZ3JhbW1hdGljYWxseQorCXJlZ2lzdGVyIGFuIExGNUFwcGVuZGVyIGF0IHRoZSByb290IG9mIHRoZSA8aT5vcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5PC9pPgorCXRyZWUuIFRoZSBJbml0VXNpbmdEZWZhdWx0Q29uZmlndXJhdG9yLmphdmEgY2xhc3MgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhpcworCWNvbmZpZ3VyYXRvci4gPC9wPgorCisgICAgICA8cD5XaGVuIHVzaW5nIHRoaXMgY2xhc3MsIGFsbCB0aGF0IHlvdSBoYXZlIHRvIGRvIGlzIG1ha2UgYSBjYWxsIHRvIHRoZSBzdGF0aWMgbAorCW1ldGhvZCBEZWZhdWx0TEY1Q29uZmlndXJhdG9yLmNvbmZpZ3VyZSggKSwgYW5kIHlvdXIgYmFzaWMgY29uZmlndXJhdGlvbiB3aWxsCisJYmUgZG9uZSBmb3IgeW91LjwvcD4KKyAgICAgIAorICAgICAgPGg0PlJ1bm5pbmcgdGhlIEV4YW1wbGU6PC9oND4KKworICAgICAgPHA+TGV0IDxjb2RlPkxPRzRKX0hPTUU8L2NvZGU+IGJlIHRoZSB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdQorICAgICAgaW5zdGFsbGVkIGxvZzRqIGFuZCBsZXQgVkVSU0lPTiBzdGFuZCBmb3IgdGhlIGxvZzRqIHZlcnNpb24uPC9wPgorICAgICAgCisgICAgICA8dWw+CisJPGxpPkVuc3VyZSB0aGF0IDxpPkxPRzRKX0hPTUUvZGlzdC9saWIvbG9nNGotVkVSU0lPTi5qYXI8L2k+CisJICBpcyBpbiB5b3VyIENMQVNTUEFUSC48L2xpPgorCisJPGxpPkVuc3VyZSB0aGF0IDxpPkxPRzRKX0hPTUUvZGlzdC9jbGFzc2VzPC9pPiBpcyBpbiB5b3VyCisJQ0xBU1NQQVRILiBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgYmluYXJ5IGNsYXNzIGZpbGVzIGZvcgorCXJ1bm5pbmcgdGhlIGxmNSBleGFtcGxlcy4gPGVtPkl0IGlzIG5vdCBuZWVkZWQgdW5kZXIgbm9ybWFsCisJb3BlcmF0aW9uYWwgY2lyY3Vtc3RhbmNlcy48L2VtPiA8L2xpPgorCisJPGxpPkVuc3VyZSB0aGF0IGEgSkFYUCBjb21wYXRpYmxlIFhNTCBwYXJzZXIgaXMgaW4gaXMgaW4geW91cgorCUNMQVNTUEFUSC48L2xpPgorCQorCTxsaT5UeXBlPGI+IDwvYj50aGUgZm9sbG93aW5nIGF0IHRoZSBjb21tYW5kIGxpbmU6CisKKwkgIDxwPjxiPiBqYXZhIGV4YW1wbGVzLmxmNS5Jbml0VXNpbmdEZWZhdWx0Q29uZmlndXJhdG9yLkluaXRVc2luZ0RlZmF1bHRDb25maWd1cmF0b3I8L2I+PC9wPgorCTwvbGk+CisgICAgICA8L3VsPiAgICAgIAorCisgICAgICA8aDM+PGI+PGZvbnQgY29sb3I9IiMwMDAwOTkiPkV4YW1wbGUgMjogSW5pdFVzaW5nUHJvcGVydGllc0ZpbGU8L2ZvbnQ+IDwvYj4gPC9oMz4KKyAgICAgIDxoND5FeGFtcGxlIERlc2NyaXB0aW9uOjwvaDQ+CisKKyAgICAgIDxwPlRoZSBsb2c0aiBlbnZpcm9ubWVudCBpcyBmdWxseSBjb25maWd1cmFibGUKKwlwcm9ncmFtbWF0aWNhbGx5LiBIb3dldmVyLCBpdCBpcyBmYXIgbW9yZSBmbGV4aWJsZSB0bworCWNvbmZpZ3VyZSBsb2c0aiB1c2luZyBjb25maWd1cmF0aW9uIGZpbGVzLiBPbmUgY29tbW9uIG1ldGhvZAorCW9mIGNvbmZpZ3VyaW5nIGxvZzRqIGludm9sdmVzIHVzaW5nIGEgcHJvcGVydGllcyBmaWxlLCBhbmQgdGhlCisJPGNvZGU+b3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjwvY29kZT4gY2xhc3MuIFRoZQorCTxjb2RlPlByb3BlcnR5Q29uZmlndXJhdG9yPC9jb2RlPiBjbGFzcyBhbGxvd3MgeW91IHRvIGxvYWQKKwlwcm9wZXJ0aWVzIGZyb20gYSBzdGFuZGFyZCBwcm9wZXJ0aWVzIGRvY3VtZW50IGNvbnNpc3Rpbmcgb2YKKwlrZXk9dmFsdWUgcGFpcnMuIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGxvYWQKKwlMb2dGYWN0b3I1IHZpYSBhIGNvbmZpZ3VyYXRpb24gZmlsZSB1c2VkIGJ5IGEKKwlQcm9wZXJ0eUNvbmZpZ3VyYXRvci48L3A+CisKKyAgICAgIDxwPlRoaXMgZXhhbXBsZSB1c2VzIGEgdmVyeSBiYXNpYyBwcm9wZXJ0aWVzIGZpbGUsIHdoaWNoIGlzCisJbG9hZGVkIHZpYSBhIFByb3BlcnR5Q29uZmlndXJhdG9yLiAgVGhlCisJPGk+ZXhhbXBsZS5wcm9wZXJ0aWVzPC9pPiBmaWxlIGhhcyBvbmx5IG9uZSBwcm9wZXJ0eSwgd2hpY2gKKwlyZWdpc3RlcnMgYSA8Y29kZT5MRjVBcHBlbmRlcjwvY29kZT4gd2l0aCB0aGUgcm9vdCBvZiB0aGUKKwlDYXRlZ29yeSB0cmVlLiBUaGUgPGNvZGU+SW5pdFVzaW5nUHJvcGVydGllc0ZpbGU8L2NvZGU+IGNsYXNzCisJbG9hZHMgdGhpcyBmaWxlIHVzaW5nIHRoZSA8Y29kZT5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjwvY29kZT4KKwljbGFzcy4gPC9wPgorCisgICAgICA8cD48Yj5Ob3RlOjwvYj4gVGhlIDxpPmV4YW1wbGUucHJvcGVydGllczwvaT4gZmlsZSB1c2VkIGluIHRoaXMKKwlleGFtcGxlIGlzIGxvYWRlZCBhcyBhIHJlc291cmNlIHZpYSB5b3VyIENMQVNTUEFUSC4gRm9yIHRoaXMKKwlyZWFzb24sIHRoZSBleGFtcGxlIHdpbGwgb25seSB3b3JrIGlmIHRoZQorCTxpPkxPRzRKX0hPTUUvZGlzdC9jbGFzc2VzPC9pPiBkaXJlY3RvcnkgaXMgaW4geW91cgorCUNMQVNTUEFUSDwvcD4KKyAgICAgIAorICAgICAgPGg0PlJ1bm5pbmcgdGhlIEV4YW1wbGU6PC9oND4KKworICAgICAgPHA+TGV0IDxjb2RlPkxPRzRKX0hPTUU8L2NvZGU+IGJlIHRoZSB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdQorICAgICAgaW5zdGFsbGVkIGxvZzRqLjwvcD4KKworICAgICAgPHVsPgorCTxsaT5TZXQgdXAgeW91ciBDTEFTU1BBVEggYXMgaW4gRXhhbXBsZSAxIGFib3ZlLjwvbGk+CisJCisJPGxpPlR5cGU8Yj4gPC9iPnRoZSBmb2xsb3dpbmcgYXQgdGhlIGNvbW1hbmQgbGluZTogCisKKwkgIDxwPjxiPiBqYXZhCisJICBleGFtcGxlcy5sZjUuSW5pdFVzaW5nUHJvcGVydGllc0ZpbGU8L2I+LjxiPkluaXRVc2luZ1Byb3BlcnRpZXNGaWxlPC9iPjwvcD4KKwk8L2xpPgorICAgICAgPC91bD4KKworICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgICA8aDM+PGI+PGZvbnQgY29sb3I9IiMwMDAwOTkiPkV4YW1wbGUgMzogSW5pdFVzaW5nWE1MUHJvcGVydGllc0ZpbGU8L2ZvbnQ+PC9iPgorICAgICAgPC9oMz4KKworICAgICAgPGg0PkV4YW1wbGUgRGVzY3JpcHRpb246PC9oND4KKworICAgICAgPHA+TG9nNGogY2FuIGFsc28gYmUgY29uZmlndXJlZCB1c2luZyBhbiBYTUwgcHJvcGVydGllcyBmaWxlLAorCWFuZCB0aGUgPGk+b3JnLmFwYWNoZS5sb2c0ai54bWwuRE9NQ29uZmlndXJhdG9yPC9pPiBjbGFzcy4gVGhlCisJRE9NQ29uZmlndXJhdG9yIGNsYXNzIGFsbG93cyB5b3UgdG8gbG9hZCBwcm9wZXJ0aWVzIGZyb20gYW4KKwlYTUwgYmFzZWQgcHJvcGVydGllcyBmaWxlLiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0bworCWxvYWQgTG9nRmFjdG9yNSB2aWEgYW4gWE1MY29uZmlndXJhdGlvbiBmaWxlIHVzZWQgYnkgYQorCURPTUNvbmZpZ3VyYXRvci4KKyAgICAgIDwvcD4KKworICAgICAgPHA+VGhpcyBleGFtcGxlIHVzZXMgYSB2ZXJ5IGJhc2ljIFhNTCBwcm9wZXJ0aWVzIGZpbGUuIFRoZQorCWV4YW1wbGUueG1sIGZpbGUgcmVnaXN0ZXJzIGFuIExGNUFwcGVuZGVyIHdpdGggdGhlIHJvb3Qgb2YgdGhlCisJQ2F0ZWdvcnkgdHJlZS4gVGhlIEluaXRVc2luZ1hNTFByb3BlcnRpZXNGaWxlLmphdmEgY2xhc3MgbG9hZHMKKwl0aGlzIGZpbGUgdXNpbmcgdGhlIERPTUNvbmZpZ3VyYXRvciBjbGFzcy4gCisgICAgICA8L3A+CisKKyAgICAgIDxwPjxiPk5vdGU6PC9iPiBUaGUgPGk+ZXhhbXBsZS54bWw8L2k+IGZpbGUgdXNlZCBpbiB0aGlzIGV4YW1wbGUKKwlpcyBsb2FkZWQgYXMgYSByZXNvdXJjZSB2aWEgeW91ciBDTEFTU1BBVEguICBGb3IgdGhpcyByZWFzb24sCisJdGhlIGV4YW1wbGUgd2lsbCBvbmx5IHdvcmsgaWYgdGhlCisJPGk+TE9HNEpfSE9NRS9kaXN0L2NsYXNzZXM8L2k+IGRpcmVjdG9yeSBpcyBpbiB5b3VyCisJQ0xBU1NQQVRILiBZb3Ugd2lsbCBhbHNvIG5lZWQgYW4gWE1MIHBhcnNlciBpbiBvcmRlciB0byBydW4KKwl0aGlzIGV4YW1wbGUuCisgICAgICA8L3A+CisKKyAgICAgIDxoND5SdW5uaW5nIHRoZSBFeGFtcGxlOjwvaDQ+CisKKyAgICAgIDxwPkxldCA8Y29kZT5MT0c0Sl9IT01FPC9jb2RlPiBiZSB0aGUgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3UKKyAgICAgIGluc3RhbGxlZCBsb2c0ai48L3A+CisKKyAgICAgIDx1bD4KKwk8bGk+U2V0IHVwIHlvdXIgQ0xBU1NQQVRIIGFzIGluIEV4YW1wbGUgMSBhYm92ZS48L2xpPgorCisJPGxpPlR5cGU8Yj4gPC9iPnRoZSBmb2xsb3dpbmcgYXQgdGhlIGNvbW1hbmQgbGluZToKKworCSAgPHA+PGI+IGphdmEKKwkgIGV4YW1wbGVzLmxmNS5Jbml0VXNpbmdYTUxQcm9wZXJ0aWVzRmlsZS5Jbml0VXNpbmdYTUxQcm9wZXJ0aWVzRmlsZTwvYj48L3A+CisJPC9saT4KKyAgICAgIDwvdWw+CisKKyAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgICAgPGgzPjxiPjxmb250IGNvbG9yPSIjMDAwMDk5Ij5FeGFtcGxlIDQ6CisJICAgIEluaXRVc2luZ0xvZzRKUHJvcGVydGllczwvZm9udD48L2I+IDwvaDM+CisKKyAgICAgIDxoND5FeGFtcGxlIERlc2NyaXB0aW9uOjwvaDQ+CisKKyAgICAgIDxwPlRoZSBsb2c0aiBsaWJyYXJ5IGRvZXMgbm90IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IGl0cworCWVudmlyb25tZW50LiBJbiBwYXJ0aWN1bGFyLCB0aGVyZSBhcmUgbm8gZGVmYXVsdCBsb2c0agorCWFwcGVuZGVycy4gVW5kZXIgY2VydGFpbiB3ZWxsLWRlZmluZWQgY2lyY3Vtc3RhbmNlcyBob3dldmVyLAorCXRoZSBzdGF0aWMgaW5pdGlhbGl6ZXIgb2YgdGhlIDxpPm9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnkKKwk8L2k+Y2xhc3Mgd2lsbCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIGxvZzRqLiBUaGUKKwlKYXZhIGxhbmd1YWdlIGd1YXJhbnRlZXMgdGhhdCB0aGUgc3RhdGljIGluaXRpYWxpemVyIG9mIGEKKwljbGFzcyBpcyBjYWxsZWQgb25jZSBhbmQgb25seSBkdXJpbmcgdGhlIGxvYWRpbmcgb2YgYSBjbGFzcworCWludG8gbWVtb3J5LiBUaGlzIGF1dG9tYXRpYyBjb25maWd1cmF0aW9uIGlzIGRvbmUgZnJvbSBhIGZpbGUKKwluYW1lZCA8Yj5sb2c0ai5wcm9wZXJ0aWVzPC9iPi4gSWYgeW91IGhhdmUgYSBsb2c0ai5wcm9wZXJ0aWVzCisJZmlsZSBpbiB5b3VyIENMQVNTUEFUSCBhdCB0aGUgdGltZSB0aGF0IHlvdSBpbnN0YW50aWF0ZSBhCisJQ2F0ZWdvcnksIGxvZzRqIHdpbGwgcmVnaXN0ZXIgYW55IGFwcGVuZGVycyBpbiB0aGlzIGZpbGUgYXQKKwl0aGUgcm9vdCBvZiB0aGUgQ2F0ZWdvcnkgdHJlZS4KKyAgICAgIDwvcD4KKworICAgICAgPHA+VGhpcyBleGFtcGxlIHByb3ZpZGVzIHlvdSB3aXRoIGEgdmVyeSBiYXNpYyBsb2c0ai5wcm9wZXJ0aWVzCisJZmlsZSB0aGF0IHlvdSBjYW4gYWRkIHRvIHlvdXIgQ0xBU1NQQVRIIGluIG9yZGVyIHRvIHJlZ2lzdGVyCisJdGhlIExGNUFwcGVuZGVyIHdpdGggdGhlIENhdGVnb3J5IGNsYXNzLiBJZiB5b3UgcHV0IHRoaXMgZmlsZQorCXNvbWV3aGVyZSBpbiB5b3VyIENMQVNTUEFUSCwgYWxsIGxvZ2dpbmcgcmVxdWVzdHMgd2lsbCBub3cKKwlhdXRvbWF0aWNhbGx5IGJlIHJlZGlyZWN0ZWQgdG8gdGhlIExvZ0ZhY3RvcjUgbG9nZ2luZyBjb25zb2xlCisJaW4gYWRkaXRpb24gdG8gYW55IG90aGVyIEFwcGVuZGVycyB5b3UgbWF5IGhhdmUgZW5hYmxlZC4KKyAgICAgIDwvcD4KKworICAgICAgPHA+SWYgeW91IGxvb2sgYXQgdGhlIEluaXRVc2luZ0xvZzRKUHJvcGVydGllcy5qYXZhIGZpbGUgeW91CisJd2lsbCBub3RpY2UgdGhhdCBubyBDb25maWd1cmF0b3JzIGFyZSB1c2VkIGluIHRoZSBjb2RlLiBBCisJQ2F0ZWdvcnkgaXMgaW5zdGFudGlhdGVkIHVzaW5nIHRoZSBnZXRJbnN0YW5jZSgpIG1ldGhvZCwgYW5kCisJbG9nZ2luZyBjYWxscyBzdWNoIGFzIGNhdC5kZWJ1ZyggKSBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseS4KKyAgICAgIDwvcD4KKworICAgICAgPHA+PGI+Tm90ZTogPC9iPkFkZGluZyB0aGUKKwk8aT5MT0c0Sl9IT01FL2V4YW1wbGVzL2xmNS9Jbml0VXNpbmdMb2c0SlByb3BlcnRpZXMvbG9nNGoucHJvcGVydGllczwvaT4KKwlmaWxlIHRvIHlvdXIgQ0xBU1NQQVRIIHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgbGluZXMgb2YgY29kZQorCXlvdSBoYXZlIHRvIHdyaXRlIChlLmcuIHlvdSB3aWxsIG5vdCBuZWVkIHRvIGFkZCBsaW5lcyBzdWNoIGFzCisJUHJvcGVydHlDb25maWd1cmF0b3IuY29uZmlndXJlKGNvbmZpZ0ZpbGVSZXNvdXJjZSkpLiBIb3dldmVyLAorCXlvdSBzaG91bGQgYmUgYXdhcmUgdGhhdCB1c2luZyB0aGlzIGRlZmF1bHQgc3RhdGljCisJaW5pdGlhbGl6YXRpb24gaGFzIGFwcGxpY2F0aW9uIHdpZGUgZWZmZWN0cy4gQWxsIGxvZ2dpbmcgd2lsbAorCWJlIGRpcmVjdGVkIHRvIExvZ0ZhY3RvcjUgaWYgeW91IHVzZSB0aGlzIGFwcHJvYWNoIQorICAgICAgPC9wPgorCQorICAgICAgPGg0PlJ1bm5pbmcgdGhlIEV4YW1wbGU6PC9oND4KKyAgICAgCisgICAgICA8dWw+CisJPGxpPlNldCB1cCB5b3VyIENMQVNTUEFUSCBhcyBpbiBFeGFtcGxlIDEgYWJvdmUuPC9saT4KKworCTxsaT5Db3B5IHRoZSBwcm92aWRlZAorCSAgPGk+TE9HNEpfSE9NRS9leGFtcGxlcy9sZjUvSW5pdFVzaW5nTG9nNEpQcm9wZXJ0aWVzL2xvZzRqLnByb3BlcnRpZXM8L2k+CisJICBmaWxlIHRvIGEgZGlyZWN0b3J5IHRoYXQgaXMgY3VycmVudGx5IGluIHlvdXIKKwkgIENMQVNTUEFUSC4gPC9saT4KKwkgIAorCTxsaT5UeXBlPGI+IDwvYj50aGUgZm9sbG93aW5nIGF0IHRoZSBjb21tYW5kIGxpbmU6CisKKwkgIDxwPjxiPiBqYXZhCisJICAgIGV4YW1wbGVzLmxmNS5Jbml0VXNpbmdMb2c0SlByb3BlcnRpZXMuSW5pdFVzaW5nTG9nNEpQcm9wZXJ0aWVzPC9iPjwvcD4KKwk8L2xpPgorCisJPGxpPkFmdGVyIHlvdSBhcmUgZG9uZSBydW5uaW5nIHRoZSBleGFtcGxlLCBtYWtlIHN1cmUgdG8KKwkgIHJlbW92ZSB0aGUgPGk+bG9nNGoucHJvcGVydGllczwvaT4gZmlsZSBhZ2Fpbiwgb3RoZXJ3aXNlIHRoZQorCSAgbG9nNGogd2lsbCBhbHdheXMgYmUgdXNpbmcgdGhlIHNhbWUgY29uZmlndXJhdGlvbi48L2xpPgorICAgICAgPC91bD4KKworICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgICA8aDM+PGI+PGZvbnQgY29sb3I9IiMwMDAwOTkiPkV4YW1wbGUgNTogSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnM8L2ZvbnQ+PC9iPgorICAgICAgPC9oMz4KKyAgICAgIDxoND5FeGFtcGxlIERlc2NyaXB0aW9uOjwvaDQ+CisKKyAgICAgIDxwPkluIExvZzRKLCBvdXRwdXQgZGVzdGluYXRpb25zIGFyZSBjYWxsZWQKKwlhcHBlbmRlcnMuIEN1cnJlbnRseSwgYXBwZW5kZXJzIGV4aXQgZm9yIHRoZSBjb25zb2xlLCByb2xsaW5nCisJbG9nIGZpbGVzLCByZW1vdGUgc29ja2V0IHNlcnZlcnMsIE5UIEV2ZW50IExvZ2dlcnMsIGFuZCByZW1vdGUKKwlVTklYIFN5c2xvZyBkYWVtb25zLiBTdXBwb3NlIHlvdSB3YW50IHRvIG91dHB1dCBsb2cgbWVzc2FnZXMKKwl0byBtb3JlIHRoYW4gb25lIGFwcGVuZGVyLi4uPC9wPgorCisgICAgICA8cD5UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgTG9nRmFjdG9yNSBhbG9uZyB3aXRoCisJTG9nNEoncyBSb2xsaW5nRmlsZUFwcGVuZGVyIHRvIG91dHB1dCBsb2cgbWVzc2FnZXMgdG8gYm90aCB0aGUKKwlMb2dGYWN0b3I1IGNvbnNvbGUgYW5kIGEgc2VyaWVzIG9mIHJvbGxpbmcgbG9nIGZpbGVzLiBUaGUKKwlleGFtcGxlLnByb3BlcnRpZXMgcmVnaXN0ZXJzIHR3byBhcHBlbmRlcnMgd2l0aCB0aGUgcm9vdCBvZgorCXRoZSBDYXRlZ29yeSB0cmVlLiA8L3A+CisKKzxwcmU+PGZvbnQgZmFjZT0iQ291cmllciBOZXcsIENvdXJpZXIsIG1vbm8iPmxvZzRqLnJvb3RDYXRlZ29yeT0sIEExLCBSCisKKyMgQTEgaXMgc2V0IHRvIGJlIGEgTEY1QXBwZW5kZXIgd2hpY2ggb3V0cHV0cyB0byBhIHN3aW5nCisjIGxvZ2dpbmcgY29uc29sZS4KKworbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5sZjUuTEY1QXBwZW5kZXIKKworIyBSIGlzIHRoZSBSb2xsaW5nRmlsZUFwcGVuZGVyIHRoYXQgb3V0cHV0cyB0byBhIHJvbGxpbmcgbG9nCisjIGZpbGUgY2FsbGVkIHJvbGxpbmdfbG9nX2ZpbGUubG9nLgorCitsb2c0ai5hcHBlbmRlci5SPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuUi5GaWxlPXJvbGxpbmdfbG9nX2ZpbGUubG9nPC9mb250PgorPC9wcmU+CisKKyAgICAgIDxwPlVzZXJzIG11c3QgYWxzbyBkZWZpbmUgYSBQYXR0ZXJuIExheW91dCBmb3IgdGhlIGxvZworCWZpbGUuIFRoYXQgaXMsIHdoaWNoIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB5b3Ugd2FudCBsb2dnZWQgdG8KKwl0aGUgbG9nIGZpbGUgYW5kIGluIHdoaWNoIG9yZGVyLiBJbmZvcm1hdGlvbiBvbiB0aGUgdmFyaW91cworCWNvbnZlcnNpb24gc3BlY2lmaWVycyAoaS5lLiBkLCBwLCB0LCBsLCBtLCBuKSBhcmUgZG9jdW1lbnRlZAorCWluIHRoZSBQYXR0ZXJuTGF5b3V0IGNsYXNzIG9mIHRoZSBMb2c0SiBBUEkuPC9wPgorCis8cHJlPmxvZzRqLmFwcGVuZGVyLlIubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorIyBOZXh0IGxpbmUgaXMgZWRpdGl0ZWQgdG8gZml0LgorbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49W3NsZjVzLnN0YXJ0XSVke0RBVEV9W3NsZjVzLkRBVEVdJW5cCisgICVwW3NsZjVzLlBSSU9SSVRZXSVuJXhbc2xmNXMuTkRDXSVuJXRbc2xmNXMuVEhSRUFEXSVuJWNbc2xmNXMuQ0FURUdPUlldJW5cCisgICVsW3NsZjVzLkxPQ0FUSU9OXSVuJW1bc2xmNXMuTUVTU0FHRV0lbiVuCis8L3ByZT4KKworICAgICAgPHA+VXNlcnMgYWxzbyBoYXZlIHRoZSBhYmlsaXR5IHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgcm9sbGluZyBsb2cgZmlsZShzKSBhbmQKKwl0aGUgbnVtYmVyIG9mIGJhY2t1cCBmaWxlcyB0aGF0IHNob3VsZCBiZSBrZXB0LiBJbiB0aGlzIGNhc2UgdGhlIHRoZSBzaXplIG9mCisJdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbG9nIGZpbGUgaXMgMTAwS0IgYW5kIHRoZSBudW1iZXIgb2YgYmFja3VwIGZpbGVzIGtlcHQKKwlpcyAxLjwvcD4KKzxwcmU+Citsb2c0ai5hcHBlbmRlci5SLk1heEZpbGVTaXplPTEwMEtCCitsb2c0ai5hcHBlbmRlci5SLk1heEJhY2t1cEluZGV4PTEKKzwvcHJlPgorCisgICAgICA8cD5UaGUgSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMuamF2YSBjbGFzcyBsb2FkcyB0aGlzIGZpbGUKKwl1c2luZyB0aGUgUHJvcGVydHlDb25maWd1cmF0b3IgY2xhc3MuIDwvcD4KKworICAgICAgPHA+PGI+Tm90ZTo8L2I+IEFub3RoZXIgYXBwcm9hY2ggd291bGQgYmUgdG8gYWRkIHRoZQorCVJvbGxpbmdGaWxlQXBwZW5kZXIgY29uZmlndXJhdGlvbiB0byB0aGUgbG9nNGoucHJvcGVydGllcworCWZpbGUuIFRoaXMgd291bGQgY2F1c2UgdGhlIEluaXRVc2luZ0xvZzRKUHJvcGVydGllcyBleGFtcGxlIHRvCisJdXNlIGJvdGggdGhlIExvZ0ZhY3RvcjUgY29uc29sZSBhbmQgYSByb2xsaW5nIGxvZyBmaWxlIGFzIGl0J3MKKwlvdXRwdXQgZGVzdGluYXRpb25zLiAKKyAgICAgIDwvcD4KKworICAgICAgPGg0PlJ1bm5pbmcgdGhlIEV4YW1wbGU6PC9oND4KKworICAgICAgPHVsPgorCTxsaT5TZXQgdXAgeW91ciBDTEFTU1BBVEggYXMgaW4gRXhhbXBsZSAxIGFib3ZlLjwvbGk+CisKKwk8bGk+VHlwZTxiPiA8L2I+dGhlIGZvbGxvd2luZyBhdCB0aGUgY29tbWFuZCBsaW5lOgorCisJICA8cD48Yj4gamF2YQorCWV4YW1wbGVzLmxmNS5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVyczwvYj48L3A+CisJPC9saT4KKyAgICAgIDwvdWw+CisKKworICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgPGgzPjxiPjxmb250IGNvbG9yPSIjMDAwMDk5Ij5FeGFtcGxlIDY6IFVzaW5nU29ja2V0QXBwZW5kZXJzPC9mb250PjwvYj4gPC9oMz4KKyAgICAgIDxoND5FeGFtcGxlIERlc2NyaXB0aW9uOjwvaDQ+CisKKyAgICAgIDxwPldoZW4gbG9nZ2luZyBtZXNzYWdlcyBmcm9tIGFuIGFwcGxpY2F0aW9uLCBpdCBpcyBvZnRlbiB1c2VmdWwKKwl0byBsb2cgdGhlIG1lc3NhZ2VzIHRvIGEgcmVtb3RlIGxvY2F0aW9uIG92ZXIgYSBzb2NrZXQuIExvZzRqCisJY29tZXMgd2l0aCBhIHZhcmlldHkgb2YgY2xhc3NlcyBkZXNpZ25lZCBmb3IgdGhpcworCXB1cnBvc2UuIFRoaXMgZXhhbXBsZSBpcyBkZXNpZ25lZCB0byBzaG93IHlvdSBob3cgdG8gdXNlIHRoZXNlCisJbG9nNGogY2xhc3NlcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBMRjVBcHBlbmRlci4gCisgICAgICA8L3A+CisKKyAgICAgIDxwPlR3byBzcGVjaWZpYyBsb2c0aiBjbGFzc2VzIGFyZSBpbnN0cnVtZW50YWwgZm9yIGxvZ2dpbmcKKwltZXNzYWdlcyBvdmVyIGEgc29ja2V0OiB0aGUKKwk8aT5vcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRBcHBlbmRlcjwvaT4gY2xhc3MgYW5kIHRoZQorCTxpPm9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldFNlcnZlcjwvaT4gY2xhc3MuIDwvcD4KKworICAgICAgPHA+PGI+VGhlIFNvY2tldEFwcGVuZGVyIGNsYXNzOjwvYj48L3A+CisKKyAgICAgIDxwPlRoZSBTb2NrZXRBcHBlbmRlciBjbGFzcyBpcyB1c2VkIG9uIHRoZSBhcHBsaWNhdGlvbiBzaWRlLAorCXdoZXJlIGxvZyBtZXNzYWdlcyBhcmUgYmVpbmcgY3JlYXRlZC4gVGhpcyBjbGFzcyBzZW5kcyBhbGwKKwlsb2dnaW5nIG1lc3NhZ2VzIHRvIGEgc3BlY2lmaWMgaG9zdCBhbmQgcG9ydCBhcyBzcGVjaWZpZWQgaW4gYQorCXByb3BlcnRpZXMgZmlsZS4gVGhlIHByb3BlcnRpZXMgZmlsZSBjYW4gYmUgZWl0aGVyIGFuCisJYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydGllcyBmaWxlLCBvciB0aGUgc3lzdGVtCisJbG9nNGoucHJvcGVydGllcyBmaWxlLiAgSW4gdGhpcyBleGFtcGxlLCB0aGUKKwlzb2NrZXRjbGllbnQucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiB0aGF0CisJcmVnaXN0ZXJzIHRoZSBTb2NrZXRBcHBlbmRlciB3aXRoIGxvZzRqLiBUaGUgZm9sbG93aW5nIGxpbmVzCisJZnJvbSB0aGUgc29ja2V0Y2xpZW50LnByb3BlcnRpZXMgZmlsZSByZWdpc3RlciB0aGUKKwlTb2NrZXRBcHBlbmRlciB3aXRoIGxvZzRqOgorICAgICAgPC9wPgorPHByZT4KKyAgICAgICBsb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRBcHBlbmRlcgorICAgICAgIGxvZzRqLmFwcGVuZGVyLkExLlJlbW90ZUhvc3Q9bG9jYWxob3N0CisgICAgICAgbG9nNGouYXBwZW5kZXIuQTEuUG9ydD04ODg3Cis8L3ByZT4KKworICAgICAgPHA+Rm9yIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCBwcm9wZXJ0aWVzIGZpbGVzLCByZWZlciB0byB0aGUgbG9nNGogZG9jdW1lbnRhdGlvbgorCW9yIHRoZSBvdGhlciBMb2dGYWN0b3I1IGV4YW1wbGVzLgorICAgICAgPC9wPgorCisgICAgICA8cD48Yj5UaGUgU29ja2V0U2VydmVyIGNsYXNzOjwvYj48L3A+CisKKyAgICAgIDxwPlRoZSBTb2NrZXRTZXJ2ZXIgY2xhc3MgbGlzdGVucyBvbiBhIHBvcnQgc3BlY2lmaWVkIGFzIGEKKwljb21tYW5kIGxpbmUgYXJndW1lbnQuICBUaGUgaG9zdCBhbmQgcG9ydCBvZiB0aGUgbWFjaGluZQorCXJ1bm5pbmcgdGhlIFNvY2tldFNlcnZlciBjbGFzcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGhvc3QgYW5kCisJcG9ydCBpbiB0aGUgc29ja2V0Y2xpZW50LnByb3BlcnRpZXMgZmlsZS4gVGhlIFNvY2tldFNlcnZlcgorCWNsYXNzIHVzZXMgYSBzZXBhcmF0ZSBwcm9wZXJ0aWVzIGZpbGUgdG8gZGV0ZXJtaW5lIHdoaWNoCisJQXBwZW5kZXJzIGl0IHNob3VsZCBmb3J3YXJkIGluY29taW5nIG1lc3NhZ2VzIHRvLiBJbiB0aGlzCisJZXhhbXBsZSwgdGhlIHNvY2tldHNlcnZlci5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgdGhlCisJaW5mb3JtYXRpb24gdGhhdCByZWdpc3RlcnMgdGhlIExGNUFwcGVuZGVyIHdpdGggbG9nNGouIFRoZQorCWZvbGxvd2luZyBsaW5lcyBmcm9tIHRoZSBzb2NrZXRzZXJ2ZXIucHJvcGVydGllcyBmaWxlIHJlZ2lzdGVyCisJdGhlIExGNUFwcGVuZGVyIHdpdGggbG9nNGogb24gdGhlIHNlcnZlciBzaWRlOjwvcD4KKworPHByZT4KKyAgICAgICBsb2c0ai5hcHBlbmRlci5BPW9yZy5hcGFjaGUubG9nNGoubGY1LkxGNUFwcGVuZGVyCisgICAgICAgbG9nNGouYXBwZW5kZXIuQTEuTWF4TnVtYmVyT2ZSZWNvcmRzPTcwMAorPC9wcmU+CisKKyAgICAgIDxwPiBUaGUgZmlyc3QgbGluZSByZWdpc3RlcnMgdGhlIExGNUFwcGVuZGVyIHdpdGggbG9nNGosIGFuZCB0aGUKKwlzZWNvbmQgbGluZSB0ZWxscyBMb2dGYWN0b3I1IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHRvCisJZGlzcGxheSBpbiB0aGUgR1VJIGF0IGFueSBvbmUgdGltZS4gIEZvciBhZGRpdGlvbmFsCisJaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSBTb2NrZXRTZXJ2ZXIgY2xhc3MgbG9hZHMgcHJvcGVydGllcworCWZpbGVzIChpbmNsdWRpbmcgZGVmYXVsdCBwcm9wZXJ0aWVzIGZpbGVzKSBwbGVhc2UgcmVmZXIgdG8gdGhlCisJbG9nNGogZG9jdW1lbmF0aW9uLgorICAgICAgPC9wPgorCisgICAgICA8aDQ+UnVubmluZyB0aGUgRXhhbXBsZTo8L2g0PgorICAgICAgPHVsPgorCTxsaT5TZXQgdXAgeW91ciBDTEFTU1BBVEggYXMgaW4gRXhhbXBsZSAxIGFib3ZlLjwvbGk+CisJCisJPGxpPiBTdGFydCB0aGUgU29ja2V0U2VydmVyIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogPC9saT4KKwkKKwk8cD48Yj5qYXZhIG9yZy5hcGFjaGUubG9nNGoubmV0LlNpbXBsZVNvY2tldFNlcnZlciA4ODg3CisJTE9HNEpfSE9NRS9leGFtcGxlcy9sZjUvVXNpbmdTb2NrZXRBcHBlbmRlcnMvc29ja2V0c2VydmVyLnByb3BlcnRpZXM8L2I+PC9wPgorCQorCTxsaT5BdCBhbm90aGVyIGNvbW1hbmQgbGluZSwgc3RhcnQgdGhlIGNsaWVudCB1c2luZyB0aGUKKwlmb2xsb3dpbmcgY29tbWFuZDo8L2xpPiAKKworCTxwPjxiPiBqYXZhIGV4YW1wbGVzLmxmNS5Vc2luZ1NvY2tldEFwcGVuZGVycy5Vc2luZ1NvY2tldEFwcGVuZGVyczwvYj48L3A+CisgICAgICA8L3VsPgorCisgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlIDcgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICAgIDxoMz48Yj48Zm9udCBjb2xvcj0iIzAwMDA5OSI+RXhhbXBsZSA3OiBPcGVuaW5nTG9nRmlsZXM8L2ZvbnQ+PC9iPiA8L2gzPgorICAgICAgPGg0PkV4YW1wbGUgRGVzY3JpcHRpb246PC9oND4KKworICAgICAgPHA+TG9nNEoncyBSb2xsaW5nRmlsZUFwcGVuZGVyIGdpdmVzIHlvdSB0aGUgYWJpbGl0eSB0byBvdXRwdXQKKwlsb2cgbWVzc2FnZXMgdG8gYSBzZXJpZXMgb2Ygcm9sbGluZyBmaWxlcy4gSG93ZXZlciwgdGhlcmUgYXJlCisJbm8gdXRpbGl0aWVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZyBpbiBhbmQgdmlld2luZyB0aG9zZSBmaWxlcworCW9uY2UgdGhleSBoYXZlIGJlZW4gd3JpdHRlbi4gTG9nRmFjdG9yNSBwcm92aWRlcyBkZXZlbG9wZXJzCisJd2l0aCB0d28gZWFzeSB3YXlzIHRvIG9wZW4gYW5kIHZpZXcgbG9nIGZpbGVzLiBMb2cgZmlsZXMgY2FuCisJYmUgb3BlbmVkIGxvY2FsbHkgdXNpbmcgdGhlICdPcGVuJyBtZW51IGl0ZW0gb3IgbG9nIGZpbGVzIGNhbgorCWJlIG9wZW5lZCBmcm9tIGEgcmVtb3RlIHNlcnZlciB1c2luZyB0aGUgJ09wZW4gVVJMJyBtZW51CisJaXRlbS4gCisgICAgICA8L3A+CisKKyAgICAgIDxwPkFuIGFkZGl0aW9uYWwgZmVhdHVyZSB0aGF0IHdhcyBhZGRlZCB0byBMb2dGYWN0b3I1IHdhcyB0aGUKKwlhYmlsaXR5IHRvIHN0YXJ0IHRoZSBjb25zb2xlIHdpbmRvdyBpbmRlcGVuZGVudCBvZiBMb2c0Si4gVGhhdAorCWlzIHRvIHNheSwgeW91IGRvIG5vdCBuZWVkIHRvIGFkZCBhIExGNUFwcGVuZGVyIHRvIHlvdXIKKwlwcm9wZXJ0aWVzIGZpbGUgdG8gdXNlIExvZ0ZhY3RvcjUuIFRoZSBiZW5lZml0IG9mIHRoaXMgZmVhdHVyZQorCWlzIHRoYXQgZGV2ZWxvcGVycyB3aG8gcnVuIHV0aWxpdGllcyBsaWtlIEFudCB0byB0ZXN0IHRoZWlyCisJYXBwbGljYXRpb25zIGNhbiBub3cgdmlldyB0aGVpciBsb2cgZmlsZXMgb2ZmLWxpbmUgKGkuZS4gYWZ0ZXIKKwl0aGVpciBhcHBsaWNhdGlvbiBoYXMgY29tcGxldGVkIHRoZSB0ZXN0IGFuZCB0aGUgSlZNIGhhcyBzaHV0CisJZG93bikuIE1vcmVvdmVyLCB0aGUgYWJpbGl0eSB0byBvcGVuIGxvZyBmaWxlcyBvbiBhIHJlbW90ZQorCXNlcnZlciBwcm92aWRlcyB0aGUgYWJpbGl0eSBmb3IgbXVsdGlwbGUgZGV2ZWxvcGVycyB3b3JraW5nIG9uCisJdGhlIHNhbWUgYXBwbGljYXRpb24gdG8gdmlldyBsb2cgZmlsZXMgaW5kZXBlbmRlbnRseS4gSXQgYWxzbworCWdpdmVzIGRldmVsb3BlcnMgdGhlIGFiaWxpdHkgdG8gdmlldyBsb2cgZmlsZXMgYm90aCBpbnRlcm5hbGx5CisJYW5kIGZyb20gcmVtb3RlIGxvY2F0aW9ucy4gCisgICAgICA8L3A+CisKKyAgICAgIDxwPlRoaXMgZXhhbXBsZSB1c2VzIHRoZSBzYW1wbGUubG9nIGZpbGUgY3JlYXRlZCBieSBMb2c0SidzCisJUm9sbGluZ0ZpbGVBcHBlbmRlci4gIDFUaGUgZm9ybWF0IG9mIHRoZSBsb2cgZmlsZSBjYW4gYmUgc2V0IGluCisJdGhlIGxvZzRqLnByb3BlcnRpZXMgb3IgYSBzdGFuZGFyZCBwcm9wZXJ0aWVzIGZpbGUgYW5kCisJPGI+bXVzdDwvYj4gZm9sbG93IHRoZSBMb2dGYWN0b3I1IGxheW91dCBjb252ZW50aW9ucyBpbiBvcmRlcgorCWZvciBMb2dGYWN0b3I1IHRvIG9wZW4gdGhlIGZpbGUuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZQorCW9mIGEgcHJvcGVydGllcyBmaWxlIHdpdGggdGhlIExvZ0ZhY3RvcjUgY29udmVyc2lvbiBwYXR0ZXJuCisJYWRkZWQ6CisgICAgICA8L3A+CisKKzxwcmU+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWYiPmxvZzRqLnJvb3RDYXRlZ29yeT0gUgorCisjIFIgaXMgdGhlIFJvbGxpbmdGaWxlQXBwZW5kZXIgdGhhdCBvdXRwdXRzIHRvIGEgcm9sbGluZyBsb2cKKyMgZmlsZSBjYWxsZWQgc2FtcGxlLmxvZy4KKworbG9nNGouYXBwZW5kZXIuUj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLlIuRmlsZT1zYW1wbGUubG9nCisKKyMgRGVmaW5lIGEgcGF0dGVybiBsYXlvdXQgZm9yIHRoZSBmaWxlLgorIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb252ZXJzaW9uIGNoYXJhY3RlcnMgKGkuZS4gZCxwLHQsYyxsLG0sbikKKyMgcGxlYXNlIHNlZSB0aGUgUGF0dGVybkxheW91dCBjbGFzcyBvZiB0aGUgTG9nNGogQVBJLgorCis8Yj5sb2c0ai5hcHBlbmRlci5SLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPTwvYj48Yj5bc2xmNXMuc3RhcnRdJWR7REFURX1bc2xmNXMuREFURV0lblwKKyVwW3NsZjVzLlBSSU9SSVRZXSVuJXhbc2xmNXMuTkRDXSVuJXRbc2xmNXMuVEhSRUFEXSVuXAorJWNbc2xmNXMuQ0FURUdPUlldJW4lbFtzbGY1cy5MT0NBVElPTl0lbiVtW3NsZjVzLk1FU1NBR0VdJW4lbjwvYj4KKworIyBTZXQgdGhlIG1heCBzaXplIG9mIHRoZSBmaWxlCisKK2xvZzRqLmFwcGVuZGVyLlIuTWF4RmlsZVNpemU9NTAwS0I8L2ZvbnQ+PC9wcmU+CisKKyAgICAgIDxwPllvdSBhcmUgZnJlZSB0byB1c2UgYW55IG9yIGFsbCBvZiB0aGUgbWFpbiBjb252ZXJzaW9uCisJY2hhcmFjdGVycyB0byBjcmVhdGUgbWwgeW91ciBsb2cgZmlsZSAoaS5lLiAlcCBmb3IKKwlQcmlvcml0eSkuIFRoZXJlIGFyZSBvbmx5IHR3byByZXF1aXJlbWVudHMgZm9yIHRoZSBjb252ZXJzaW9uCisJcGF0dGVybi4gRmlyc3QsIHRoZSBjb252ZXJzaW9uIHBhdHRlcm4gc3RyaW5nIDxiPm11c3Q8L2I+CisJc3RhcnQgd2l0aCB0aGUgdGFnIDxiPltzbGY1cy5zdGFydF08L2I+LiBTZWNvbmQsIGZvciBlYWNoCisJbG9nNGogY29udmVyc2lvbiBjaGFyYWN0ZXIgbGlzdGVkIGluIHRoZSBjb252ZXJzaW9uIHBhdHRlcm4KKwlzdHJpbmcsIGEgY29ycmVzcG9uZGluZyBMb2dGYWN0b3I1IHRhZyA8Yj5tdXN0PC9iPiBiZSBwbGFjZWQKKwlpbW1lZGlhdGVseSA8Yj5hZnRlcjwvYj4gdGhlIGNoYXJhY3Rlci4gVGhlIGZvbGxvd2luZyBpcyBhCisJY29tcGxldGUgbGlzdCBvZiB0aGUgbG9nNGogY2hhcmFjdGVycyBhbmQgTG9nRmFjdG9yNSB0YWdzOgorICAgICAgPC9wPgorCis8cHJlPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmIj5EYXRlIC0gJWR7REFURX1bc2xmNXMuREFURV0KK1ByaW9yaXR5IC0gJXBbc2xmNXMuUFJJT1JJVFldCitOREMgLSAleFtzbGY1cy5ORENdCitUaHJlYWQgLSAldFtzbGY1cy5USFJFQURdCitDYXRlZ29yeSAtICVjW3NsZjVzLkNBVEVHT1JZXQorTG9jYXRpb24gLSAlbFtzbGY1cy5MT0NBVElPTl0KK01lc3NhZ2UgLSAlbVtzbGY1cy5NRVNTQUdFXTwvZm9udD4KKzwvcHJlPgorCisgICAgICA8cD4gPGI+Tm90ZTo8L2I+IFRoZSBvcmRlciBvZiB0aGUgY2hhcmFjdGVycyBkb2VzIG5vdCBtYXR0ZXIgc28KKwl5b3UgYXJlIGZyZWUgdG8gbGF5b3V0IHlvdXIgbG9nIGZpbGUgYW55IHdheSB5b3UgbGlrZS4gSnVzdAorCXJlbWVtYmVyIHRvIGluY2x1ZGUgdGhlIExvZ0ZhY3RvcjUgc3RhcnQgdGFnIGF0IHRoZSBiZWdpbm5pbmcKKwlvZiB0aGUgc3RyaW5nIGFuZCBhbnkgTG9nRmFjdG9yNSB0YWdzIGFmdGVyIGVhY2ggY29ycmVzcG9uZGluZworCWxvZzRqIGNvbnZlcnNpb24gY2hhcmFjdGVyLjwvcD4KKworICAgICAgPGg0PlJ1bm5pbmcgdGhlIEV4YW1wbGU6PC9oND4KKyAgICAgIAorICAgICAgPHVsPgorCTxsaT5TZXQgdXAgeW91ciBDTEFTU1BBVEggYXMgaW4gRXhhbXBsZSAxIGFib3ZlLjwvbGk+CisKKwk8bGk+VHlwZTxiPiA8L2I+dGhlIGZvbGxvd2luZyBhdCB0aGUgY29tbWFuZCBsaW5lOjxiPiBqYXZhCisJICAgIG9yZy5hcGFjaGUubG9nNGoubGY1LlN0YXJ0TG9nRmFjdG9yNTwvYj4KKwk8L2xpPgorCisJPGxpPlVuZGVyIHRoZSAnRmlsZScgbWVudSwgc2VsZWN0ICdPcGVuJy48L2xpPgorCisJPGxpPk9wZW4gdGhlIDxpPnNhbXBsZS5sb2c8L2k+IGZpbGUgbG9jYXRlZCBpbiB0aGUgPGZvbnQKKwkgIGZhY2U9IkNvdXJpZXIgTmV3LCBDb3VyaWVyLAorCSAgbW9ubyI+ZXhhbXBsZXMvbGY1L09wZW5pbmdMb2dGaWxlczwvZm9udD4gZGlyZWN0b3J5LjwvbGk+CisKKwk8bGk+Q2xlYXIgdGhlIGxvZyB0YWJsZSB1c2luZyB0aGUgQ2xlYXIgTG9nIFRhYmxlIGJ1dHRvbi48L2xpPgorICAgICAgPC91bD4KKworICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgPGgzPjxiPjxmb250IGNvbG9yPSIjMDAwMDk5Ij5FeGFtcGxlIDg8L2ZvbnQ+PC9iPjwvaDM+CisgICAgICA8aDQ+PGI+PGZvbnQgY29sb3I9IiMwMDAwOTkiPkV4YW1wbGUgOGE6IFVzaW5nTG9nTW9uaXRvckFkYXB0ZXI8L2ZvbnQ+PC9iPjwvaDQ+CisgICAgICA8aDQ+RXhhbXBsZSBEZXNjcmlwdGlvbjo8L2g0PgorCisgICAgICA8cD5JZGVhbGx5IExvZ0ZhY3RvcjUncyBpbnRlbmRlZCB1c2UgaXMgd2l0aCBMb2c0SiwgYnV0IHRoaXMKKwlkb2VzIG5vdCBwcmVjbHVkZSBpdHMgdXNlIHdpdGggb3RoZXIgbG9nZ2luZyBzY2hlbWVzLiBUaGUKKwlMb2dNb25pdG9yQWRhcHRlciBBUEkgYWxsb3dzIGRldmVsb3BlcnMgdG8gbG9nIGRpcmVjdGx5IHRvIHRoZQorCUxvZ0ZhY3RvcjUgR1VJIE1vbml0b3Igd2l0aCBhIG1pbmltdW0gb2YgZWZmb3J0LgorICAgICAgPC9wPgorCisgICAgICA8cD5UaGUgVXNpbmdMb2dNb25pdG9yQWRhcHRlci5qYXZhIGNsYXNzIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlCisJdGhlIExvZ01vbml0b3JBZGFwdGVyLiAgVGhpcyBleGFtcGxlIHJlcXVlc3RzIGEgbmV3IGluc3RhbmNlCisJb2YgdGhlIExvZ01vbml0b3JBZGFwdGVyLCBhbmQgdXNlcyB0aGUgbG9nNGogUHJpb3JpdHkKKwlsZXZlbHMuIDwvcD4KKworPHByZT4gICAgIF9hZGFwdGVyID0gTG9nTW9uaXRvckFkYXB0ZXIubmV3SW5zdGFuY2UoTG9nTW9uaXRvckFkYXB0ZXIuTE9HNEpfTE9HX0xFVkVMUyk7PC9wcmU+Cis8cD5XaGVuIHlvdSBsb2cgdG8gdGhlIExvZ0ZhY3RvcjUgR1VJIE1vbml0b3IsIHNpbXBseSBjYWxsIG9uZSBvZiB0aGUgbWFueSBsb2cKKyAgbWV0aG9kcyBvbiB0aGUgTG9nTW9uaXRvckFkYXB0ZXIgb2JqZWN0OjwvcD4KKzxwcmU+ICAgICBfYWRhcHRlci5sb2coY2hhbm5lbCwiRG9oIHRoaXMgaXMgYSBkZWJ1Z2dpbmciKTsKKworICAgICBfYWRhcHRlci5sb2coY2hhbm5lbCxMb2dMZXZlbC5JTkZPLCJIbW1tIGZvYmlkZGVuIGRvdWdobnV0Iik7CisgICAgIF9hZGFwdGVyLmxvZyhjaGFubmVsLExvZ0xldmVsLldBUk4sIkRhbmdlciBEYW5nZXIgV2lsbCBSb2JpbnNvbiIsCisgICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvbigiREFOR0VSIiksICIzMiIpOworICAgICBfYWRhcHRlci5sb2coY2hhbm5lbCxMb2dMZXZlbC5FUlJPUiwiRXhpdCBzdGFnZSByaWdodC0+Iik7CisgICAgIF9hZGFwdGVyLmxvZyhjaGFubmVsLExvZ0xldmVsLkZBVEFMLCJXaGF0J3MgdXAgRG9jPyIsCisgICAgICAgICBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlVuZm9ydHVuYXRlIGV4Y2VwdGlvbiIpKTsKKzwvcHJlPgorCisgICAgICA8aDQ+UnVubmluZyB0aGUgRXhhbXBsZTo8L2g0PgorICAgICAgPHVsPgorCTxsaT5TZXQgdXAgeW91ciBDTEFTU1BBVEggYXMgaW4gRXhhbXBsZSAxIGFib3ZlLjwvbGk+CisKKwk8bGk+VHlwZTxiPiA8L2I+dGhlIGZvbGxvd2luZyBhdCB0aGUgY29tbWFuZCBsaW5lOgorCisJICA8cD48Yj5qYXZhCisJICBleGFtcGxlcy5sZjUuVXNpbmdMb2dNb25pdG9yQWRhcHRlci5Vc2luZ0xvZ01vbml0b3JBZGFwdGVyPC9iPjwvcD4KKwk8L2xpPgorICAgICAgPC91bD4KKworICAgICAgPGg0PjxiPjxmb250IGNvbG9yPSIjMDAwMDk5Ij5FeGFtcGxlIDhiOiBDdXN0b21pemVkTG9nTGV2ZWxzPC9mb250PjwvYj4gPC9oND4KKyAgICAgIDxoND5FeGFtcGxlIERlc2NyaXB0aW9uOjwvaDQ+CisKKyAgICAgIDxwPldoYXQgZ29vZCBpcyBhIExvZ01vbml0b3JBZGFwdGVyIGlmIHlvdSBjYW4gb25seSB1c2UgcHJlc2V0CisJTG9nTGV2ZWxzPyBUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUKKwlMb2dNb25pdG9yQWRhcHRlciB3aXRoIGEgc2V0IG9mIHVzZXItZGVmaW5lZCBMb2dMZXZlbHMuPC9wPgorCisgICAgICA8cD5UaGUgQ3VzdG9taXplZExvZ0xldmVscy5qYXZhIGNsYXNzIGRlbW9uc3RyYXRlcyBob3cgdG8gY3VzdG9taXplIExvZ0xldmVscyBtbAorCXRvIHN1aXQgeW91ciBsb2dnaW5nIG5lZWRzLiBBcyB3aXRoIHRoZSBwcmV2aW91cyBleGFtcGxlIHdlIHJlcXVlc3QgYW4gaW5zdGFuY2UKKwlvZiB0aGUgTG9nTW9uaXRvckFkYXB0ZXIsIGJ1dCB0aGlzIHRpbWUgYW4gYXJyYXkgb2YgZGVmaW5lZCBMb2dMZXZlbHMgaXMgc3VwcGxpZWQ6PC9wPgorCis8cHJlPiAgICAgX2FkYXB0ZXIgPSBMb2dNb25pdG9yQWRhcHRlci5uZXdJbnN0YW5jZShuZXcgTG9nTGV2ZWxbXSB7REVGQVVMVCwgTEVWRUxfT05FLAorICAgICAgICAgICBMRVZFTF9UV08sTEVWRUxfVEhSRUUsIExFVkVMX0ZPVVIgfSk7Cis8L3ByZT4KKworICAgICAgPHA+VGhlIExvZ01vbml0b3JBZGFwdGVyIHdpbGwgc2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgYXJyYXkgdG8gYmUgdGhlIGRlZmF1bHQKKwlMb2dMZXZlbC4gRm9yIGV4YW1wbGUsIHdoZW4gbG9nZ2luZyBhIG1lc3NhZ2Ugd2hlcmUgbm8gTG9nTGV2ZWwgaGFzIGJlZW4gc3BlY2lmaWVkLAorCXRoZSBERUZBVUxUIExvZ0xldmVsIHdpbGwgYmUgdXNlZC4gVGhlIGRlZmF1bHQgTG9nTGV2ZWwgY2FuIGFsc28gYmUgc2V0IHVzaW5nCisJdGhlIExvZ01vbml0b3JBZGFwdGVyJ3Mgc2V0RGVmYXVsdExldmVsIG1ldGhvZCwgd2hpbGUgdGhlIHNldmVyZSBMb2dMZXZlbCBjYW4KKwliZSBzZXQgYXMgZm9sbG93czoKKyAgICAgIDwvcD4KKworPHByZT4gICAgIF9hZGFwdGVyLnNldFNldmVyZUxldmVsKExFVkVMX09ORSk7PC9wcmU+CisgICAgICA8cD48L3A+CisKKyAgICAgIDxwPkxvZ2dpbmcgbWVzc2FnZXMgdGhlbiBmb2xsb3cgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGV4YW1wbGUgYWJvdmUuPC9wPgorCis8cHJlPiAgICAgX2FkYXB0ZXIubG9nKGNoYW5uZWwsIlVzaW5nIHRoZSBjdXN0b21pemVkIExvZ0xldmVscyIpOworCisgICAgIF9hZGFwdGVyLmxvZyhjaGFubmVsLExFVkVMX0ZPVVIsIlRoaXMgaXMgYSB0ZXN0Iik7CisgICAgIF9hZGFwdGVyLmxvZyhjaGFubmVsLExFVkVMX1RIUkVFLCJIbW1tIGZvYmlkZGVuIGRvdWdobnV0Iik7CisgICAgIF9hZGFwdGVyLmxvZyhjaGFubmVsLExFVkVMX09ORSwiRGFuZ2VyIERhbmdlciBXaWxsIFJvYmluc29uIiwKKyAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEQU5HRVIiKSwgIjMyIik7CisgICAgIF9hZGFwdGVyLmxvZyhjaGFubmVsLExFVkVMX1RXTywiRXhpdCBzdGFnZSByaWdodC0+Iik7CisgICAgIF9hZGFwdGVyLmxvZyhjaGFubmVsLExFVkVMX0ZPVVIsIldoYXQncyB1cCBEb2M/IiwKKyAgICAgICAgIG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVW5mb3J0dW5hdGUgZXhjZXB0aW9uIikpOworICAgICAgPC9wcmU+CisKKyAgICAgIDxoND5SdW5uaW5nIHRoZSBFeGFtcGxlOjwvaDQ+CisgICAgICA8dWw+CisJPGxpPlNldCB1cCB5b3VyIENMQVNTUEFUSCBhcyBpbiBFeGFtcGxlIDEgYWJvdmUuPC9saT4KKworCTxsaT5UeXBlPGI+IDwvYj50aGUgZm9sbG93aW5nIGF0IHRoZSBjb21tYW5kIGxpbmU6CisJICAKKwkgIDxwPjxiPiBqYXZhCisJICAgICAgZXhhbXBsZXMubGY1LlVzaW5nTG9nTW9uaXRvckFkYXB0ZXIuQ3VzdG9taXplZExvZ0xldmVsczwvYj48L3A+CisJPC9saT4KKyAgICAgIDwvdWw+CisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy94ZG9jcy9sZjUvZmFxLnhtbCBiL3NyYy94ZG9jcy9sZjUvZmFxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JiODUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3hkb2NzL2xmNS9mYXEueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGRvY3VtZW50PgorICAKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iQk1hcmxib3JvdWdoQHRob3VnaHR3b3Jrcy5jb20iPkJyYWQgTWFybGJvcm91Z2g8L2F1dGhvcj4KKyAgICA8dGl0bGU+TG9nRmFjdG9yNSBVc2VycycgR3VpZGU8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisgIAorICA8Ym9keT4KKyAgICA8c2VjdGlvbiBuYW1lPSJGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyI+CisKKworICAgICAgPHA+PGI+US4gV2hhdCBpcyBMb2dGYWN0b3I1PzwvYj4gPC9wPgorCisgICAgICA8cD48Yj5BLjwvYj4gTG9nRmFjdG9yNSBpcyBhIFN3aW5nIGJhc2VkIEdVSSB0aGF0IGxldmVyYWdlcyB0aGUKKwlwb3dlciBvZiBsb2c0aiB0byBwcm92aWRlIGRldmVsb3BlcnMgd2l0aCBhIHNvcGhpc3RpY2F0ZWQsCisJZmVhdHVyZS1yaWNoLCB2aXN1YWwgdG9vbCBmb3IgbWFuYWdpbmcgbG9nIG1lc3NhZ2VzLjwvcD4gCisKKyAgICAgIDxoci8+CisKKyAgICAgIDxwPjxiPlEuIERvIEkgbmVlZCB0byBrbm93IGhvdyB0byB1c2UgbG9nNGogaW4gb3JkZXIgdG8gdXNlIExvZ0ZhY3RvcjU/PC9iPjwvcD4KKworICAgICAgPHA+PGI+QS48L2I+IFllcywgdGhlIGRvY3VtZW50YXRpb24gZm9yIExvZ0ZhY3RvcjUgYXNzdW1lcyB0aGUKKwl1c2VyIGhhcyBzb21lIHVuZGVyc3RhbmRpbmcgb2YgaG93IGxvZzRqIHdvcmtzLiBOb3RlIGhvd2V2ZXIKKwl0aGF0IHRoZSBMb2dGYWN0b3I1IGV4YW1wbGVzIHdpbGwgcnVuIHJlZ2FyZGxlc3Mgb2YgYSB1c2VyJ3MKKwlsb2c0aiBrbm93bGVkZ2UgbGV2ZWwuPC9wPiA8aHIvPgorCisgICAgICA8cD48Yj5RLiBXaGF0IGFyZSB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgTG9nRmFjdG9yNT88L2I+PC9wPgorCisgICAgICA8cD48Yj5BLjwvYj4gVGhlIExvZ0ZhY3RvcjUgbG9nZ2luZyBjb25zb2xlIHdpbmRvdyB1c2VzIGFyb3VuZAorCTEzIE1CIG9mIG1lbW9yeSB0byBydW4gb24gYSBXaW5kb3dzIE9TLiBPdXIgbWVtb3J5IHByb2ZpbGluZworCWhhcyBzaG93biB0aGF0IHdpdGggYSBsb2dnaW5nIG1lc3NhZ2Ugb2YgMjUgd29yZHMgaW4gbGVuZ3RoLAorCWFuZCBhIHN0YWNrIHRyYWNlIG5lc3RlZCBzZXZlbiBtZXRob2RzIGRlZXAsIGV2ZXJ5IDEwMDAKKwlyZWNvcmRzIGRpc3BsYXllZCBpbiB0aGUgbG9nZ2luZyBjb25zb2xlIHVzZXMgYWJvdXQgNi41IE1CIG9mCisJbWVtb3J5LiBGb3IgdGhpcyByZWFzb24sIHdoZW4geW91IGFyZSBzZXR0aW5nIHRoZSBtYXhpbXVtCisJbnVtYmVyIG9mIGxvZyByZWNvcmRzIHRvIGJlIHNob3duLCB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwgdGhhdAorCXlvdSBoYXZlIGVub3VnaCBtZW1vcnkgdG8gZGlzcGxheSBhbGwgb2YgdGhlIHJlY29yZHMuICBUaGUKKwlkZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpcworCXNldCB0byA1MDAwIHRvIG1pbmltaXplIHRoZSBwb3NzaWJpbGl0eSBvZiBydW5uaW5nIG91dCBvZgorCW1lbW9yeS4gV2UgcmVjb21tZW5kIHRoYXQgV2luZG93cyB1c2VycyBoYXZlIGF0IGxlYXN0IDk2IE1CIG9mCisJUkFNIHdoZW4gdXNpbmcgTG9nRmFjdG9yNS48L3A+CisKKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9zcmMveGRvY3MvbGY1L2ZlYXR1cmVzLnhtbCBiL3NyYy94ZG9jcy9sZjUvZmVhdHVyZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGRjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveGRvY3MvbGY1L2ZlYXR1cmVzLnhtbApAQCAtMCwwICsxLDI0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8ZG9jdW1lbnQ+CisgIAorICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJCTWFybGJvcm91Z2hAdGhvdWdodHdvcmtzLmNvbSI+QnJhZCBNYXJsYm9yb3VnaDwvYXV0aG9yPgorICAgIDx0aXRsZT5Mb2dGYWN0b3I1IEZlYXR1cmVzIFVzZXJzJyBHdWlkZTwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKyAgCisgIDxib2R5PgorICAgIDxzZWN0aW9uIG5hbWU9IkxvZ0ZhY3RvcjUgRmVhdHVyZXMiPgorCisgICAgICA8aDM+PGZvbnQgY29sb3I9IiMwMDAwOTkiPk1hbmFnZSBMb2cgTWVzc2FnZXM8L2ZvbnQ+PC9oMz4KKworICAgICAgPHA+VGhlIExvZyBUYWJsZSBwYW5lIHNob3dzIHRoZSBsaXN0aW5nIG9mIExvZ1JlY29yZHMgdGhhdCBoYXZlCisJYmVlbiBzZW50IHRvIHRoZSBMb2dGYWN0b3I1IGFwcGVuZGVyLiBUaGUgbmV3ZXN0IGxvZyBtZXNzYWdlcworCWFwcGVhciBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4KKyAgICAgIDwvcD4KKworICAgICAgPHA+PGltZyBzcmM9ImltYWdlcy9sZjVfbG9ndGFibGUuZ2lmIiBhbGlnbj0iYWJzYm90dG9tIiBhbHQ9IkxvZyBUYWJsZSIgd2lkdGg9IjYwMCIgaGVpZ2h0PSI0ODkiPjwvaW1nPjwvcD4KKworICAgICAgPGg0Pjxmb250IGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9IjMiPjxhIG5hbWU9ImxldmVscyI+PC9hPjwvZm9udD5Mb2cgCisJTGV2ZWwgU2VsZWN0aW9uIDwvaDQ+CisKKyAgICAgIDxwPlRoZSBMb2dGYWN0b3I1IHRvb2xiYXIgYXBwbGllcyBkaXJlY3RseSB0byB0aGUgTG9nIFRhYmxlCisJYXJlYS4gTG9nIGxldmVscyBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmIHRvIGZpbHRlciBvdXQKKwltZXNzYWdlcyB0aGF0IHlvdSB3YW50IHRvIHZpZXcgb3IgaGlkZS4gTGV2ZWxzIGluY2x1ZGUgRkFUQUwsCisJRVJST1IsIFdBUk4sIElORk8gYW5kIERFQlVHLiA8L3A+CisKKworICAgICAgPHA+PGltZyBzcmM9ImltYWdlcy9sZjVfbG9nbGV2ZWxzLmdpZiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSI0ODgiCisgICAgICBhbHQ9IkxvZyBMZXZlbHMiLz48L3A+CisKKyAgICAgIDxwPjxhIG5hbWU9ImNvbG9yIj48L2E+PGI+TG9nIExldmVsIENvbG9yIENvbmZpZ3VyYXRpb248L2I+PC9wPgorCisgICAgICA8cD5UbyBoZWxwIGRpc3RpZ3Vpc2ggdGhlIHZhcmlvdXMgbG9nIGV2ZW50cyBkaXNwbGF5ZWQgaW4gdGhlCisJTG9nVGFibGUsIExvZ0ZhY3RvcjUgYWxsb3dzIHVzZXJzIHRvIHNldCB0aGUgY29sb3JzIG9mIHRoZWlyCisJbG9nIGV2ZW50cyBiYXNlZCBvbiBsZXZlbC48L3A+CisKKyAgICAgIDxwPjxpbWcgc3JjPSJpbWFnZXMvbGY1X2NvbG9yY2hvb3Nlci5naWYiIHdpZHRoPSI2MDAiCisgICAgICBoZWlnaHQ9IjQ4OSIgYWx0PSJMb2cgTGV2ZWwgQ29sb3IgQ29uZmlndXJhdGlvbiIvPjwvcD4KKyAgICAgIAorICAgICAgPGg0PjxhIG5hbWU9InNlYXJjaCI+PC9hPkZ1bGwgVGV4dCBTZWFyY2hpbmc8L2g0PgorCisgICAgICA8cD5UaGUgTG9nIFRhYmxlIHN1cHBvcnRzIGZ1bGwgdGV4dCBzZWFyY2hpbmcuIFRvIHBlcmZvcm0gYQorCXNlYXJjaCwgY2hvb3NlIEVkaXQtJmd0O0ZpbmQgZnJvbSB0aGUgbWVudSBiYXIgb3IgQ1RSTC1GIGFuZAorCXRoZW4gZW50ZXIgdGhlIHRleHQgeW91IHdhbnQgdG8gc2VhcmNoIGZvci4gIExvZ0ZhY3RvcjUgd2lsbAorCWZpbmQgYW55IHN0cmluZ3MgdGhhdCBhcmUgYW4gZXhhY3QgbWF0Y2ggZm9yIHRoZSBzdHJpbmcgeW91CisJZW50ZXJlZC4gUHJlc3NpbmcgRjMgd2lsbCBmaW5kIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlCisJc3RyaW5nLgorICAgICAgPC9wPgorICAgICAgCisgICAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xmNV9zZWFyY2guZ2lmIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjQ4OCIKKyAgICAgIGFsdD0iRnVsbCBUZXh0IFNlYXJjaGluZyIvPjwvcD4KKworICAgICAgPGg0PjxhIG5hbWU9InZpZXdzIj48L2E+TG9nIFRhYmxlIFZpZXdzPC9oND4KKworICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgIDwhLS0gSW4gdGhlIG5leHQgcGFyYWdyYXBoLCBjaGFuZ2VkIGNhdGVnb3J5IHRvIGxvZ2dlciwgcHJpb3JpdHkgLS0+IAorICAgICAgPCEtLSB0byBsZXZlbCwgTG9nUmVjb3JkIHRvIGV2ZW50LiAoQ2VraSkgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICA8cD5UaGUgTG9nIFRhYmxlIGhhcyB0aHJlZSB2aWV3czsgY29tcGFjdCwgc3RhbmRhcmQgYW5kCisJZGV0YWlsZWQuIFRoZSBjb21wYWN0IHZpZXcgb25seSBkaXNwbGF5cyB0aGUgTmVzdGVkIERpYWdub3N0aWMKKwlDb250ZXh0IChOREMpLCBsb2dnZXIgYW5kIG1lc3NhZ2UuICBUaGUgc3RhbmRhcmQgdmlldyBpcyB0aGUKKwlkZWZhdWx0IHZpZXcsIGFuZCBkaXNwbGF5cyB0aGUgbGV2ZWwsIE5EQywgbG9nZ2VyIGFuZCBtZXNzYWdlCisJb2YgdGhlIGxvZ2dpbmcgZXZlbnQuIFRoZSBkZXRhaWxlZCB2aWV3IGRpc3BsYXlzLCBpbiBhZGRpdGlvbiwKKwl0aGUgZGF0ZSwgbWVzc2FnZSBudW1iZXIsIGxvY2F0aW9uIChpLmUuIHRoZSBtZXRob2QgdGhhdCBpcworCWxvZ2dpbmcgdGhlIG1lc3NhZ2UpLCB0aHJlYWQgZGVzY3JpcHRpb24gYW5kIHRoZQorCXRocm93YWJsZS4gVGhlIHZpZXcgc2VsZWN0b3Igb24gdGhlIHRvb2xiYXIgc3dpdGNoZXMgYmV0d2VlbgorCXRoZSB0aHJlZSB2aWV3cy4gQ29sdW1ucyBpbiB0aGUgTG9nIFRhYmxlIGNhbiBiZSByZS1zaXplZCBhbmQKKwltb3ZlZCBieSBpbnRlcmFjdGluZyB3aXRoIHRoZSBjb2x1bW4gaGVhZGVycy4KKyAgICAgIDwvcD4KKworICAgICAgPHA+PGltZyBzcmM9ImltYWdlcy9sZjVfdmlldy5naWYiIHdpZHRoPSI2MDAiIGhlaWdodD0iNDg5IgorICAgICAgYWx0PSJMb2cgVGFibGUgVmlldyIvPjwvcD4KKyAgICAgIAorICAgICAgPGg0PjxhIG5hbWU9InJlY29yZGRldGFpbHMiPjwvYT5Mb2cgUmVjb3JkIERldGFpbHM8L2g0PgorICAgICAgCisgICAgICA8cD5UaGUgTG9nIFJlY29yZCBEZXRhaWwgYXJlYSBkaXNwbGF5cyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgb2YKKwl0aGUgTG9nUmVjb3JkIHdoaWNoIGlzIHNlbGVjdGVkIGluIHRoZSBMb2cgVGFibGUuIFdoZW4gYSByb3csCisJb3IgTG9nUmVjb3JkLCBpcyBzZWxlY3RlZCBpbiB0aGUgTG9nIFRhYmxlLCB0aGUgY29tcGxldGUKKwlkZXRhaWxzIG9mIHRoYXQgTG9nUmVjb3JkIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIExvZ1JlY29yZAorCURldGFpbCBhcmVhLCBpbmRlcGVuZGVudCBvZiB0aGUgdmlldyBpbiBlZmZlY3QuCisgICAgICA8L3A+CisKKyAgICAgIDxwPjxpbWcgc3JjPSJpbWFnZXMvbGY1X3JlY29yZGRldGFpbC5naWYiIHdpZHRoPSI2MDAiCisgICAgICBoZWlnaHQ9IjQ4MSIgYWx0PSJMb2dSZWNvcmQgRGV0YWlscyIvPgorICAgICAgPC9wPgorCisgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgIDwhLS0gSW4gdGhlIG5leHQgMiBwYXJhZ3JhcGhzLCBjaGFuZ2VkIGNhdGVnb3J5IHRvIGxvZ2dlci4gKENla2kpIC0tPgorICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICA8aDQ+PGEgbmFtZT0iZXhwbG9yZXIiPjwvYT5Mb2dnZXIgRXhwbG9yZXI8L2g0PgorCisgICAgICA8cD5UaGUgTG9nZ2VyIEV4cGxvcmVyIGFyZWEgZW5hYmxlcyB0aGUgZmlsdGVyaW5nIG9mIGluY29taW5nCisJbG9nIG1lc3NhZ2VzIGJhc2VkIG9uIGxvZ2dlci4gSWYgYSBsb2dnZXIgaXMgZGVzZWxlY3RlZAorCShubyBjaGVja21hcmsgaXMgc2hvd24gbmV4dCB0byBpdCkgdGhlbiBuZXcgbWVzc2FnZXMgb24gdGhhdAorCWxvZ2dlciB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQuIFRoZSBMb2dnZXIgRXhwbG9yZXIgaGFzIG5vCisJZWZmZWN0IG9uIGxvZyBtZXNzYWdlcyBhbHJlYWR5IGluIHRoZSBMb2cgVGFibGUuCisgICAgICA8L3A+CisKKyAgICAgIDxwPlRoZSBMb2dnZXIgRXhwbG9yZXIgZGlzcGxheXMgbG9nZ2VycyBpbiBhIGhpZXJhcmNoaWNhbAorCXRyZWUtbGlrZSBmYXNoaW9uLiAgTG9nZ2VycyBhcmUgaWRlbnRpZmllZCB3aXRoCisJZG90LXNlcGFyYXRlZCBuYW1lcyBzaW1pbGFyIHRvIEphdmEgcGFja2FnZSBhbmQgY2xhc3MKKwluYW1lcy4gVGhlIG5hbWUgY29tcG9uZW50cyBhcmUgbWFwcGVkIHRvIHRoZSBsZXZlbHMgaW4gdGhlCisJaGllcmFyY2h5IGluIHRoZSBMb2dnZXIgRXhwbG9yZXIuIEZvciBleGFtcGxlLCB0aGUgbG9nZ2VyCisJbmFtZSBvcmcuYXBhY2hlLmFwcGxpY2F0aW9ucy5sb2c0ai5Jbml0VXNpbmcgTG9nNEpQcm9wZXJ0aWVzCisJaXMgZGlzcGxheWVkIGJlbG93OiAKKyAgICAgIDwvcD4KKworICAgICAgPHA+PGltZyBzcmM9ImltYWdlcy9sZjVfY2F0ZWdvcnlfZXhwbG9yZXIuZ2lmIiB3aWR0aD0iNjAwIgorCSAgaGVpZ2h0PSI0ODEiIGFsdD0iTG9nZ2VyIEV4cGxvcmVyIi8+PC9wPgorCisKKyAgICAgIDxoND48YSBuYW1lPSJzZWxlY3Rsb2dnZXJzIj48L2E+U2VsZWN0aW5nIGFuZCBEZXNlbGVjdGluZyBMb2dnZXJzPC9oND4KKworICAgICAgPHA+V2hlbiBhIGxvZ2dlciBpbiBhIGhpZXJhcmNoeSBpcyBkZXNlbGVjdGVkLCBubyBtZXNzYWdlcyBhdAorCXRoYXQgbGV2ZWwgb3IgYmVsb3cgd2lsbCBhcHBlYXIgaW4gdGhlIExvZyBUYWJsZS4gRm9yIGV4YW1wbGUsCisJaWYganVzdCB0aGUgZmlyc3QgSW5pdFVzaW5nTXVsdGlwbGVBcHBlbmRlcnMgbG9nZ2VyIGluIHRoZQorCWV4YW1wbGVzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzLkluaXRVc2luZ011bHRpcGxlQXBwZW5kZXJzCisJbG9nZ2VyIGlzIGRlc2VsZWN0ZWQsIHRoZW4gbWVzc2FnZXMgd2l0aCB0aGUgbG9nZ2VyIGV4YW1wbGVzCisJd291bGQgYmUgZGlzcGxheWVkIGluIHRoZSBMb2cgVGFibGUsIGJ1dCBtZXNzYWdlcyB3aXRoIHRoZQorCWxvZ2dlciBJbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycy5Jbml0VXNpbmdNdWx0aXBsZUFwcGVuZGVycworCXdvdWxkIGJlIGZpbHRlcmVkIGFuZCBub3QgZGlzcGxheWVkIGluIHRoZSBMb2cgVGFibGUuIAorICAgICAgPC9wPgorCisgICAgICA8cD5UbyBxdWlja2x5IHNlbGVjdCBvciBkZXNlbGVjdCBsb2dnZXJzIGluIHRoZSBoaWVyYXJjaHksCisJdGhlIHJpZ2h0LW1vdXNlIGJ1dHRvbiBjYW4gYmUgdXNlZCB0byBicmluZyB1cCB0aGUgcG9wLXVwIG1lbnUKKwlkaXNwbGF5ZWQgYmVsb3cuIDwvcD4KKworICAgICAgPHA+PGltZyBzcmM9ImltYWdlcy9sZjVfZGVzZWxlY3RhbGwuZ2lmIiB3aWR0aD0iNjAwIgorCSAgaGVpZ2h0PSI0ODgiIGFsdD0iRGVzZWxlY3QgQWxsIERlc2NlbmRhbnRzIi8+PC9wPgorCisgICAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xmNV9zZWxlY3RhbGwuZ2lmIiB3aWR0aD0iNjAwIgorCSAgaGVpZ2h0PSI0ODgiIGFsdD0iU2VsZWN0IEFsbCBEZXNjZW5kYW50cyIvPjwvcD4KKyAgICAgIAorCisgICAgICA8aDQ+PGEgbmFtZT0iZXhwYW5kY2F0dHJlZSI+PC9hPkV4cGFuZGluZyBhbmQgQ29sbGFwc2luZyB0aGUgTG9nZ2VyIFRyZWU8L2g0PgorICAgICAgCisgICAgICA8cD5Zb3UgY2FuIGFsc28gZXhwYW5kIGFuZCBjb2xsYXBzZSB0aGUgaGllcmFyY2h5IHRyZWUgdXNpbmcKKwl0aGUgcG9wLXVwIG1lbnUgZGlzcGxheWVkIGJlbG93LjwvcD4KKyAgICAgIAorICAgICAgPHA+PGltZyBzcmM9ImltYWdlcy9sZjVfZXhwYW5kYWxsLmdpZiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSI0ODgiCisgICAgICBhbHQ9IkV4cGFuZCBUcmVlIi8+PC9wPgorICAgICAgCisgICAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xmNV9jb2xsYXBzZWFsbC5naWYiIHdpZHRoPSI2MDAiCisgICAgICBoZWlnaHQ9IjQ4OCIgYWx0PSJDb2xsYXBzZSBUcmVlIi8+PC9wPgorICAgICAgCisgICAgICA8SDQ+PGEgbmFtZT0ibmRjZmlsdGVyaW5nIj48L2E+TkRDIFJlY29yZCBGaWx0ZXJpbmc8L0g0PgorCisKKyAgICAgIDxwPkxvZzRqIHByb3ZpZGVzIGEgbGlnaHR3ZWlnaHQgdGVjaG5pcXVlIGZvciBzdGFtcGluZyBsb2cKKwlyZXF1ZXN0cyBpbml0aWF0ZWQgZnJvbSB0aGUgc2FtZSBjbGllbnQgd2l0aGluIGEgbXVsdGl0aHJlYWRlZAorCXN5c3RlbS4gVGhlIE5lc3RlZCBEaWFnbm9zdGljIENvbnRleHQgKE5EQykgcHJvdmlkZXMgYW4gZWFzeQorCXdheSB0byBkaWZmZXJlbnRpYXRlIGxvZ2dpbmcgb3V0cHV0IG9mIG9uZSBjbGllbnQgZnJvbQorCWFub3RoZXIuIFRoZSBOREMgaXMgYWxzbyB1c2VmdWwgZm9yIGRpZmZlcmVudGlhdGluZyBsb2cKKwltZXNzYWdlcyBiZWluZyBvdXRwdXQgYnkgZGlmZmVyZW50IG1lbWJlcnMgb2YgYSBsYXJnZQorCWRldmVsb3BtZW50IHRlYW0gYnVpbGRpbmcgYW4gYXBwbGljYXRpb24gb24gdGhlIHNhbWUKKwlzZXJ2ZXIuIFRvIGltcHJvdmUgdGhlIHNvcnRpbmcgb2YgcG90ZW50aWFsbHkgdGhvdXNhbmRzIG9mIGxvZworCXJlY29yZHMgYmVpbmcgb3V0cHV0IGZyb20gbXVsdGlwbGUgY2xpZW50cywgYSBOREMgZmlsdGVyIGhhcworCWJlZW4gcHJvdmlkZWQuIFRvIHVzZSB0aGUgTkRDIGZpbHRlciwgc2VsZWN0IHRoZSBFZGl0IG1lbnUKKwlpdGVtIGFuZCBjaG9vc2UgJ1NvcnQgYnkgTkRDJy4gRmlsbCBpbiB0aGUgbmFtZSBvZiB0aGUgTkRDIHlvdQorCXdvdWxkIGxpa2UgdG8gZmlsdGVyIG9uLiBBbGwgcmVjb3JkcyBjb250YWluaW5nIHRoZSBmaWx0ZXIga2V5CisJd29yZCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgTG9nIFRhYmxlLiBUbyByZXN0b3JlIGFsbCBvZiB0aGUKKwlsb2cgcmVjb3JkcyB1c2UgdGhlIEVkaXQgLSZndDsgUmVzdG9yZSBhbGwgTkRDJ3MuIFlvdSBjYW4gYWxzbworCXVzZSB0aGUgRWRpdC0mZ3Q7RmluZCBmZWF0dXJlIHRvIGxvY2F0ZSBOREMncyB3aXRob3V0IHJlbW92aW5nCisJbG9nIHJlY29yZHMgZnJvbSB0aGUgTG9nIFRhYmxlLiBGdXJ0aGVybW9yZSwgeW91IGNhbiB1c2UgdGhlCisJQ29uZmlndXJlLSZndDtTYXZlIGZlYXR1cmUgdG8gcGVyc2lzdCB0aGUgbGFzdCBOREMgZmlsdGVyIGtleQorCXdvcmQgdGhhdCB3YXMgdXNlZC4gTm90ZSBob3dldmVyIHRoYXQgcmVzdG9yaW5nIGFsbCBORENzIHdpbGwKKwllZmZlY3RpdmVseSBlcmFzZSB0aGUgTkRDIGZpbHRlciBrZXkgd29yZC4gUmVmZXIgdG8gdGhlIDxhCisJaHJlZj0iI2NvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb24gc2VjdGlvbjwvYT4gYmVsb3cgZm9yIG1vcmUKKwlpbmZvcm1hdGlvbiBvbiBzYXZpbmcgTkRDIGZpbHRlciBrZXkgd29yZHMuPC9wPgorCisgICAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xmNV9uZGNfZmlsdGVyaW5nLmdpZiIgd2lkdGg9IjYwMCIKKyAgICAgIGhlaWdodD0iNDg4IiBhbHQ9Ik5EQyBGaWx0ZXJpbmciLz48L3A+CisKKworICAgICAgPGZvbnQgY29sb3I9IiMwMDAwOTkiPjxoMz5SZWFkIExvZyBGaWxlczwvaDM+CisgICAgICA8L2ZvbnQ+IAorCisgICAgICA8aDQ+PGEgbmFtZT0icmVhZGZpbGUiPjwvYT5SZWFkIGEgRmlsZTwvaDQ+CisKKyAgICAgIDxwPkxvZ0ZhY3RvcjUgc3VwcG9ydHMgcmVhZGluZyBpbiBsb2cgZmlsZXMgdGhhdCB3ZXJlIGNyZWF0ZWQKKwl1c2luZyBsb2c0aidzIFJvbGxpbmdGaWxlQXBwZW5kZXIuICBUaGUgYmVuZWZpdCBvZiB0aGlzCisJZmVhdHVyZSBpcyB0aGF0IGRldmVsb3BlcnMgd2hvIHJ1biB1dGlsaXRpZXMgbGlrZSBBbnQgdG8gdGVzdAorCXRoZWlyIGFwcGxpY2F0aW9ucyBjYW4gbm93IHZpZXcgdGhlaXIgbG9nIGZpbGVzIG9mZi1saW5lCisJKGkuZS4gYWZ0ZXIgdGhlaXIgYXBwbGljYXRpb24gaGFzIGNvbXBsZXRlZCB0aGUgdGVzdCBhbmQgdGhlCisJSlZNIGhhcyBzaHV0IGRvd24pLiBSZWFkaW5nIGxvZyBmaWxlcyBjdXJyZW50bHkgb25seSB3b3JrcyBmb3IKKwlmaWxlcyB3cml0dGVuIGEgTG9nRmFjdG9yNSdzIHVuaXF1ZSBDb252ZXJzaW9uUGF0dGVybi4gIEZvcgorCW1vcmUgaW5mb3JtYXRpb24gb24gc2V0dGluZyB0aGUgTG9nRmFjdG9yNSBjb252ZXJzaW9uIHBhdHRlcm4sCisJcGxlYXNlIHNlZSB0aGUgT3BlbmluZ0xvZ0ZpbGVzIGV4YW1wbGUuIFRvIG9wZW4gYSBmaWxlIGFuZAorCXJlYWQgaXQgaW50byBMb2dGYWN0b3I1LCB5b3UgbmVlZCB0byBzdGFydCB0aGUgbG9nZ2luZyBjb25zb2xlCisJdXNpbmcgdGhlIFN0YXJ0TG9nRmFjdG9yNUNvbnNvbGUuYmF0IGZpbGUgcHJvdmlkZWQgaW4gdGhlIGJpbgorCWRpcmVjdG9yeS4gT25jZSB0aGUgY29uc29sZSBpcyBvcGVuLCBjaG9vc2UgRmlsZS0mZ3Q7T3BlbiBmcm9tCisJdGhlIG1lbnUgYXQgdGhlIHRvcCBvZiB0aGUgR1VJLgorCTwvcD4KKworICAgICAgPHA+PGltZyBzcmM9ImltYWdlcy9sZjVfb3BlbmZpbGUuZ2lmIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjQ4OCIKKwkgIGFsaWduPSJhYnNib3R0b20iIGFsdD0iTG9nIFRhYmxlIi8+PC9wPgorCisgICAgICA8aDQ+PGEgbmFtZT0icmVhZHVybCI+PC9hPlJlYWQgYSBGaWxlIEZyb20gYSBVUkw8L2g0PgorCisgICAgICA8cD5Mb2dGYWN0b3I1IHN1cHBvcnRzIHJlYWRpbmcgbG9nIGZpbGVzIGNyZWF0ZWQgdXNpbmcgbG9nNGoKKwlmcm9tIGEgVVJMLiBIYXZpbmcgdGhlIGFiaWxpdHkgdG8gb3BlbiBsb2cgZmlsZXMgb24gYSByZW1vdGUKKwlzZXJ2ZXIgcHJvdmlkZXMgdGhlIGFiaWxpdHkgZm9yIG11bHRpcGxlIGRldmVsb3BlcnMgd29ya2luZyBvbgorCXRoZSBzYW1lIGFwcGxpY2F0aW9uIHRvIHZpZXcgbG9nIGZpbGVzIGluZGVwZW5kZW50bHkuICBJdCBhbHNvCisJZ2l2ZXMgZGV2ZWxvcGVycyB0aGUgYWJpbGl0eSB0byB2aWV3IGxvZyBmaWxlcyBib3RoIGludGVybmFsbHkKKwlhbmQgZnJvbSByZW1vdGUgbG9jYXRpb25zLiBSZWFkaW5nIGxvZyBmaWxlcyBjdXJyZW50bHkgb25seQorCXdvcmtzIGZvciBmaWxlcyB3cml0dGVuIGEgTG9nRmFjdG9yNSdzIHVuaXF1ZQorCUNvbnZlcnNpb25QYXR0ZXJuLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIHRoZQorCUxvZ0ZhY3RvcjUgY29udmVyc2lvbiBwYXR0ZXJuLCBwbGVhc2Ugc2VlIHRoZSA8YQorCWhyZWY9ImV4YW1wbGU3Lmh0bWwiPk9wZW5pbmdMb2dGaWxlczwvYT4gZXhhbXBsZS4gVG8gb3BlbiBhCisJZmlsZSBhbmQgcmVhZCBpdCBpbnRvIExvZ0ZhY3RvcjUsIHlvdSBuZWVkIHRvIHN0YXJ0IHRoZQorCWxvZ2dpbmcgY29uc29sZSB1c2luZyB0aGUgU3RhcnRMb2dGYWN0b3I1Q29uc29sZS5iYXQgZmlsZQorCXByb3ZpZGVkIGluIHRoZSBiaW4gZGlyZWN0b3J5LiAgT25jZSB0aGUgY29uc29sZSBpcyBvcGVuLAorCWNob29zZSBGaWxlLSZndDtPcGVuIFVSTCBmcm9tIHRoZSBtZW51IGF0IHRoZSB0b3Agb2YgdGhlIEdVSS4KKwk8L3A+CisKKyAgICAgIDxwPjxpbWcgc3JjPSJpbWFnZXMvbGY1X29wZW51cmwuZ2lmIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjQ4OCIgYWxpZ249ImFic2JvdHRvbSIgYWx0PSJMb2cgVGFibGUiLz4gPC9wPgorCisgICAgICA8cD48YSBocmVmPSIjdG9wIj48Zm9udCBzaXplPSIyIj4mbHQ7Jmx0OyBSZXR1cm4gdG8gVG9wIG9mIFBhZ2UgJmd0OyZndDs8L2ZvbnQ+PC9hPjwvcD4KKwkKKyAgICAgIDxmb250IGNvbG9yPSIjMDAwMDk5Ij4gPGgzPkNvbmZpZ3VyYXRpb248L2gzPjwvZm9udD4gCisKKyAgICAgIDxoND48YSBuYW1lPSJjb25maWd1cmF0aW9uIj48L2E+U2F2ZSBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uPC9oND4KKworICAgICAgPHA+TG9nRmFjdG9yNSBhbGxvd3MgeW91IHRvIHNhdmUgeW91ciBjdXJyZW50CisJY29uZmlndXJhdGlvbi4gV2hlbiB5b3UgY2hvb3NlIHRoZSBDb25maWd1cmF0aW9uLSZndDtTYXZlCisJb3B0aW9uIGZyb20gdGhlIG1lbnUgYXQgdGhlIHRvcCBvZiB0aGUgR1VJLCB0aGUgbG9nZ2VycyBhbmQKKwlsZXZlbHMgdGhhdCB5b3UgY3VycmVudGx5IGhhdmUgc2VsZWN0ZWQsIGFsb25nIHdpdGggdGhlIGxhc3QKKwlOREMgZmlsdGVyIGtleSB3b3JkIHVzZWQgKGFzc3VtaW5nICdSZXN0b3JlIGFsbCBOREMncycgaGFzIG5vdAorCWJlZW4gc2VsZWN0ZWQpLCBhcmUgc2F2ZWQgdG8geW91ciBsb2NhbCBmaWxlIHN5c3RlbS4gVGhpcworCW1lYW5zIHRoYXQgdGhlIG5leHQgdGltZSB5b3Ugc3RhcnQgdXAgdGhlIGNvbnNvbGUgeW91IHdpbGwgbm90CisJbmVlZCB0byByZXNlbGVjdCB0aGUgbG9nZ2VycywgbGV2ZWxzLCBhbmQgTkRDIGZpbHRlciB0aGF0IHlvdQorCXdvdWxkIGxpa2UgdXNlZCBmb3IgZmlsdGVyaW5nLgorICAgICAgPC9wPgorCisgICAgICA8cD5Mb2dGYWN0b3I1IGFsc28gYWxsb3dzIHlvdSB0byByZW1vdmUgeW91ciBzYXZlZAorCWNvbmZpZ3VyYXRpb24sIGFuZCB0byBjb25maWd1cmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMKKwl0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGF0IGFueSB0aW1lIGluIHRoZSBsb2dnaW5nCisJY29uc29sZS4gU2V0dGluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyB0byBkaXNwbGF5CisJYWxsb3dzIHlvdSB0byBvcHRpbWl6ZSBMb2dGYWN0b3I1J3MgcGVyZm9ybWFuY2UgZm9yIHlvdXIKKwlzeXN0ZW0uIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQKKwl2aWEgYSBsb2c0aiBwcm9wZXJ0aWVzIGZpbGUuCisgICAgICA8L3A+CisKKyAgICAgIDxwPjxpbWcgc3JjPSJpbWFnZXMvbGY1X2NvbmZpZ3VyZS5naWYiIHdpZHRoPSI2MDAiIGhlaWdodD0iNDg4IiBhbGlnbj0iYWJzYm90dG9tIiBhbHQ9IkxvZyBUYWJsZSIvPjwvcD4KKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3hkb2NzL2xmNS9vdmVydmlldy54bWwgYi9zcmMveGRvY3MvbGY1L292ZXJ2aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmVhMGJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3hkb2NzL2xmNS9vdmVydmlldy54bWwKQEAgLTAsMCArMSw3NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8ZG9jdW1lbnQ+CisgIAorICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJCTWFybGJvcm91Z2hAdGhvdWdodHdvcmtzLmNvbSI+QnJhZCBNYXJsYm9yb3VnaDwvYXV0aG9yPgorICAgIDx0aXRsZT5Mb2dGYWN0b3I1IFVzZXJzJyBHdWlkZTwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKyAgCisgIDxib2R5PgorICAgIDxzZWN0aW9uIG5hbWU9IkxvZ0ZhY3RvcjUgT3ZlcnZpZXciPgorCisgICAgICA8cD48Yj5XaGF0IGlzIExvZ0ZhY3RvcjU/PC9iPiAtIExvZ0ZhY3RvcjUgaXMgYSBTd2luZyBiYXNlZCBHVUkKKwl0aGF0IGxldmVyYWdlcyB0aGUgcG93ZXIgb2YgbG9nNGogbG9nZ2luZyBmcmFtZXdvcmsgYW5kCisJcHJvdmlkZXMgZGV2ZWxvcGVycyB3aXRoIGEgc29waGlzdGljYXRlZCwgZmVhdHVyZS1yaWNoLAorCWxvZ2dpbmcgaW50ZXJmYWNlIGZvciBtYW5hZ2luZyBsb2cgbWVzc2FnZXMuCisgICAgICA8L3A+CisKKyAgICAgIDxwPjxiPkhvdyBkb2VzIGl0IHdvcms/PC9iPiAtIExvZ0ZhY3RvcjUgc2VhbWxlc3NseSBwbHVncyBpbnRvCisJbG9nNGogYW5kIHByb3ZpZGVzIGRldmVsb3BlcnMgd2l0aCBhbiBhbHRlcm5hdGUgZGVzdGluYXRpb24KKwlmb3Igb3V0cHV0dGluZyBtZXNzYWdlcy4gPC9wPgorCisgICAgICA8cD48Yj5CZW5lZml0czo8L2I+PC9wPgorICAgICAgPHVsPgorCTxsaT5RdWlja2x5IGlzb2xhdGUgcHJvYmxlbXMgaW4geW91ciBhcHBsaWNhdGlvbi48L2xpPgorCTxsaT5FbmFibGUgb25seSB0aGUgY2F0ZWdvcmllcyB0aGF0IHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB3aXRob3V0IGFmZmVjdGluZyAKKwkgIG90aGVyIG1lc3NhZ2VzLjwvbGk+CisJPGxpPkZpbHRlciBvdXQgcHJpb3JpdHkgbGV2ZWxzIHlvdSBkb24ndCBuZWVkLjwvbGk+CisJPGxpPkZpbHRlciBvdXQgcmVjb3JkcyBiYXNlZCBvbiBOREMuPC9saT4KKwk8bGk+UmVkdWNlIHRoZSB0aW1lIHJlcXVpcmVkIHRvIGxvY2F0ZSBzcGVjaWZpYyBtZXNzYWdlcy48L2xpPgorCTxsaT5SZWFkIGluIGFuZCB2aWV3IGxvZzRqIGxvZyBmaWxlcyBmcm9tIGVpdGhlciBhIGZpbGUgb3IgYSBVUkwuPC9saT4KKwk8bGk+U3RhcnQgdGhlIExvZ0ZhY3RvcjUgR1VJIHVwIGluZGVwZW5kZW50IG9mIHlvdXIgYXBwbGljYXRpb24uPC9saT4KKyAgICAgIDwvdWw+CisgICAgICA8cD48Yj5GZWF0dXJlczogPC9iPiAKKwk8dWw+CisJICA8bGk+UmVhbC10aW1lIGNhdGVnb3J5IGFuZCBsb2cgbGV2ZWwgZmlsdGVyaW5nLjwvbGk+CisJICA8bGk+UmVhZCBsb2cgZmlsZXMgZnJvbSBhIGZpbGUuPC9saT4KKwkgIDxsaT5SZWFkIGxvZyBmaWxlcyBmcm9tIGEgVVJMLjwvbGk+CisJICA8bGk+Q3VzdG9taXphYmxlIExvZyBUYWJsZSB2aWV3LjwvbGk+CisJICA8bGk+Q2F0ZWdvcnkgbGV2ZWwgdHJlZSBuYXZpZ2F0aW9uLjwvbGk+CisJICA8bGk+TkRDIHJlY29yZCBmaWx0ZXJpbmcuPC9saT4KKwkgIDxsaT5GdWxsIHRleHQgc2VhcmNoaW5nIG9uIGxvZ2dlZCBtZXNzYWdlcy48L2xpPgorCSAgPGxpPlNhdmUgY29uZmlndXJhdGlvbiBhbmQgZmlsdGVyaW5nIHNldHRpbmdzIGZvciBsYXRlciBzZXNzaW9ucy48L2xpPgorCSAgPGxpPkNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGxvZyByZWNvcmRzIHRvIGJlIGRpc3BsYXllZC48L2xpPgorCSAgPGxpPkN1c3RvbWl6YWJsZSByZWNvcmQgY29sb3JzLjwvbGk+CisJICA8bGk+Q29uZmlndXJhYmxlIGZvbnQgZmFjZSBhbmQgc2l6ZS48L2xpPgorCSAgPGxpPkN1c3RvbWl6YWJsZSBMb2cgVGFibGUgY29sdW1uIGxheW91dC48L2xpPgorCSAgPGxpPkZ1bGwgc3VwcG9ydCBmb3IgYWxsIGxvZzRqIGxldmVscy48L2xpPgorCSAgPGxpPkZ1bGwgc3VwcG9ydCBmb3IgY3VzdG9tIGxldmVscy48L2xpPgorCSAgPGxpPkR5bmFtaWMgbWVzc2FnZSBjb3VudGluZy48L2xpPgorCTwvdWw+CisgICAgICA8L3A+CisKKyAgICAgIDxwPjxiPkxvZ0ZhY3RvcjUgU3lzdGVtIFJlcXVpcmVtZW50czo8L2I+PC9wPgorICAgICAgCisgICAgICA8cD5Mb2dGYWN0b3I1IHJlcXVpcmVzIEphdmEgKFRNKSBWaXJ0dWFsIE1hY2hpbmUgMS4yLjIgYW5kIGxvZzRqCisJMS4yIG9yIGxhdGVyLgorICAgICAgPC9wPgorICAgCisgICAgICA8cD48Yj4gRG9jdW1lbnRhdGlvbiBhbmQgSGVscDwvYj48L3A+CisgICAgICA8dWw+CisJPGxpPkFsbCBkb2N1bWVudGF0aW9uIGlzIGluIEhUTUwgZm9ybWF0LjwvbGk+CisJCisJPGxpPkZvciBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gb24gbG9nZ2luZywgcGxlYXNlIHNlZSB0aGUgPGEKKwkgICAgaHJlZj0ic3VnZ2VzdGVkX3JlYWRpbmcuaHRtbCI+U3VnZ2VzdGVkIFJlYWRpbmc8L2E+CisJICAgIHNlY3Rpb24uIDwvbGk+CisgICAgICA8L3VsPgorICAgICAgPHA+PGI+IFBsYXRmb3JtIFN1cHBvcnQ8L2I+PC9wPgorICAgICAgPHVsPgorCTxsaT5Mb2dGYWN0b3I1IGlzIHdyaXR0ZW4gaW4gMTAwJSBKYXZhIGFuZCB3aWxsIHdvcmsgd2l0aCBhbnkKKwkgIHN5c3RlbSBzdXBwb3J0aW5nIHRoZSBKYXZhIDIgcGxhdGZvcm0uPC9saT4KKyAgICAgIDwvdWw+CisgICAgICA8cD48L3A+CisKKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3hkb2NzL2xmNS9yZWFkaW5nZmlsZXMueG1sIGIvc3JjL3hkb2NzL2xmNS9yZWFkaW5nZmlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzliZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMveGRvY3MvbGY1L3JlYWRpbmdmaWxlcy54bWwKQEAgLTAsMCArMSw5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8ZG9jdW1lbnQ+CisgIAorICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJCTWFybGJvcm91Z2hAdGhvdWdodHdvcmtzLmNvbSI+QnJhZCBNYXJsYm9yb3VnaDwvYXV0aG9yPgorICAgIDx0aXRsZT5Mb2dGYWN0b3I1IFVzZXJzJyBHdWlkZTwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKyAgCisgIDxib2R5PgorICAgIDxzZWN0aW9uIG5hbWU9IlJlYWRpbmcgTG9nIEZpbGVzIj4KKworICAgICAgPHA+PGNvZGU+RmlsZUFwcGVuZGVyPC9jb2RlPiBhbmQgZGVyaXZlZCBjbGFzc2VzIGdpdmUgeW91IHRoZQorCWFiaWxpdHkgdG8gb3V0cHV0IGxvZyBtZXNzYWdlcyB0byBhIGZpbGVzLiBMb2dGYWN0b3I1IHByb3ZpZGVzCisJZGV2ZWxvcGVycyB3aXRoIHR3byBlYXN5IHdheXMgdG8gb3BlbiBhbmQgdmlldyB0aGVzZSBsb2cKKwlmaWxlcy4gTG9nIGZpbGVzIGNhbiBiZSBvcGVuZWQgbG9jYWxseSB1c2luZyB0aGUgRmlsZS0mZ3Q7T3BlbgorCW1lbnUgaXRlbSBvciBsb2cgZmlsZXMgY2FuIGJlIG9wZW5lZCBmcm9tIGEgcmVtb3RlIHNlcnZlcgorCXVzaW5nIHRoZSBGaWxlLSZndDtPcGVuIFVSTCBtZW51IGl0ZW0uCisgICAgICA8L3A+CisgICAgICAKKyAgICAgIDxwPkFuIGFkZGl0aW9uYWwgZmVhdHVyZSB0aGF0IHdhcyBhZGRlZCB0byBMb2dGYWN0b3I1IHdhcyB0aGUKKwlhYmlsaXR5IHRvIHN0YXJ0IHRoZSBjb25zb2xlIHdpbmRvdyBpbmRlcGVuZGVudGx5IG9mCisJbG9nNGouIFRoYXQgaXMgdG8gc2F5LCB5b3UgZG8gbm90IG5lZWQgdG8gYWRkIGEKKwk8Y29kZT5MRjVBcHBlbmRlcjwvY29kZT4gdG8geW91ciBwcm9wZXJ0aWVzIGZpbGUgdG8gdXNlCisJTG9nRmFjdG9yNS4gVGhlIGJlbmVmaXQgb2YgdGhpcyBmZWF0dXJlIGlzIHRoYXQgZGV2ZWxvcGVycyB3aG8KKwlydW4gdXRpbGl0aWVzIGxpa2UgQW50IHRvIHRlc3QgdGhlaXIgYXBwbGljYXRpb25zIGNhbiBub3cgdmlldworCXRoZWlyIGxvZyBmaWxlcyBvZmYtbGluZSAoaS5lLiBhZnRlciB0aGVpciBhcHBsaWNhdGlvbiBoYXMKKwljb21wbGV0ZWQgdGhlIHRlc3QgYW5kIHRoZSBKVk0gaGFzIHNodXQgZG93bikuIE1vcmVvdmVyLCB0aGUKKwlhYmlsaXR5IHRvIG9wZW4gbG9nIGZpbGVzIG9uIGEgcmVtb3RlIHNlcnZlciBwcm92aWRlcyB0aGUKKwlhYmlsaXR5IGZvciBtdWx0aXBsZSBkZXZlbG9wZXJzIHdvcmtpbmcgb24gdGhlIHNhbWUKKwlhcHBsaWNhdGlvbiB0byB2aWV3IGxvZyBmaWxlcyBpbmRlcGVuZGVudGx5LiBJdCBhbHNvIGdpdmVzCisJZGV2ZWxvcGVycyB0aGUgYWJpbGl0eSB0byB2aWV3IGxvZyBmaWxlcyBib3RoIGludGVybmFsbHkgYW5kCisJZnJvbSByZW1vdGUgbG9jYXRpb25zLgorICAgICAgPC9wPgorCisgICAgICA8cD5Mb2dGYWN0b3I1IGNhbiByZWFkIGluIGxvZyBmaWxlcyBjcmVhdGVkIHdpdGgKKwk8Y29kZT5Sb2xsaW5nRmlsZUFwcGVuZGVyPC9jb2RlPi4gIFRoZSBmb3JtYXQgb2YgdGhlIGxvZyBmaWxlCisJY2FuIGJlIHNldCBpbiB0aGUgbG9nNGoucHJvcGVydGllcyBvciBhIHN0YW5kYXJkIHByb3BlcnRpZXMKKwlmaWxlIGFuZCA8Yj5tdXN0PC9iPiBmb2xsb3cgdGhlIExvZ0ZhY3RvcjUgbGF5b3V0IGNvbnZlbnRpb25zCisJaW4gb3JkZXIgZm9yIExvZ0ZhY3RvcjUgdG8gcmVhZCB0aGUgZmlsZS4gVGhlIGZvbGxvd2luZyBpcyBhbgorCWV4YW1wbGUgb2YgYSBwcm9wZXJ0aWVzIGZpbGUgd2l0aCB0aGUgTG9nRmFjdG9yNSBjb252ZXJzaW9uCisJcGF0dGVybiBhZGRlZDoKKyAgICAgIDwvcD4KKworPHByZT48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4sIFRpbWVzLCBzZXJpZiI+Citsb2c0ai5yb290TG9nZ2VyPWRlYnVnLCBSCisKKyMgUiBpcyB0aGUgUm9sbGluZ0ZpbGVBcHBlbmRlciB0aGF0IG91dHB1dHMgdG8gYSByb2xsaW5nIGxvZyAKKyMgZmlsZSBjYWxsZWQgc2FtcGxlLmxvZy4KKworbG9nNGouYXBwZW5kZXIuUj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLlIuRmlsZT1zYW1wbGUubG9nCisKKyMgRGVmaW5lIGEgcGF0dGVybiBsYXlvdXQgZm9yIHRoZSBmaWxlLiAgCisjIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnZlcnNpb24gY2hhcmFjdGVycyAoaS5lLiBkLHAsdCxjLGwsbSxuKQorIyBwbGVhc2Ugc2VlIHRoZSBQYXR0ZXJuTGF5b3V0IGNsYXNzIG9mIHRoZSBMb2c0aiBBUEkuCisKK2xvZzRqLmFwcGVuZGVyLlIubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorCisjIFRoZSBmb2xsb3dpbmcgbm9ybWFsbHkgYXBwZWFycyBvbiBvbmUgc2luZ2xlIGxpbmUuCis8Yj5sb2c0ai5hcHBlbmRlci5SLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bc2xmNXMuc3RhcnRdJWR7REFURX1bc2xmNXMuREFURV0lblwKKyAgICVwW3NsZjVzLlBSSU9SSVRZXSVuJXhbc2xmNXMuTkRDXSVuJXRbc2xmNXMuVEhSRUFEXSVuXAorICAgJWNbc2xmNXMuQ0FURUdPUlldJW4lbFtzbGY1cy5MT0NBVElPTl0lbiVtW3NsZjVzLk1FU1NBR0VdJW4lbjwvYj4KKworIyBTZXQgdGhlIG1heCBzaXplIG9mIHRoZSBmaWxlIAorbG9nNGouYXBwZW5kZXIuUi5NYXhGaWxlU2l6ZT01MDBLQjwvZm9udD48L3ByZT4KKworICAgICAgPHA+WW91IGFyZSBmcmVlIHRvIHVzZSBhbnkgb3IgYWxsIG9mIHRoZSBtYWluIGNvbnZlcnNpb24KKwljaGFyYWN0ZXJzIHRvIGNyZWF0ZSB5b3VyIGxvZyBmaWxlIChpLmUuICVwIGZvcgorCVByaW9yaXR5KS4gVGhlcmUgYXJlIG9ubHkgdHdvIHJlcXVpcmVtZW50cyBmb3IgdGhlIGNvbnZlcnNpb24KKwlwYXR0ZXJuLiBGaXJzdCwgdGhlIGNvbnZlcnNpb24gcGF0dGVybiBzdHJpbmcgPGI+bXVzdDwvYj4KKwlzdGFydCB3aXRoIHRoZSB0YWcgPGI+W3NsZjVzLnN0YXJ0XTwvYj4uIFNlY29uZCwgZm9yIGVhY2gKKwlsb2c0aiBjb252ZXJzaW9uIGNoYXJhY3RlciBsaXN0ZWQgaW4gdGhlIGNvbnZlcnNpb24gcGF0dGVybgorCXN0cmluZywgYSBjb3JyZXNwb25kaW5nIExvZ0ZhY3RvcjUgdGFnIDxiPm11c3Q8L2I+IGJlIHBsYWNlZAorCWltbWVkaWF0ZWx5IDxiPmFmdGVyPC9iPiB0aGUgY2hhcmFjdGVyLiBUaGUgZm9sbG93aW5nIGlzIGEKKwljb21wbGV0ZSBsaXN0IG9mIHRoZSBsb2c0aiBjaGFyYWN0ZXJzIGFuZCBMb2dGYWN0b3I1IHRhZ3M6CisgICAgICA8L3A+CisKKzxwcmU+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWYiPkRhdGUgLSAlZHtEQVRFfVtzbGY1cy5EQVRFXQorUHJpb3JpdHkgLSAlcFtzbGY1cy5QUklPUklUWV0KK05EQyAtICV4W3NsZjVzLk5EQ10KK1RocmVhZCAtICV0W3NsZjVzLlRIUkVBRF0KK0NhdGVnb3J5IC0gJWNbc2xmNXMuQ0FURUdPUlldCitMb2NhdGlvbiAtICVsW3NsZjVzLkxPQ0FUSU9OXQorTWVzc2FnZSAtICVtW3NsZjVzLk1FU1NBR0VdPC9mb250PgorPC9wcmU+CisKKyAgICAgIDxwPiA8Yj5Ob3RlOjwvYj4gVGhlIG9yZGVyIG9mIHRoZSBjaGFyYWN0ZXJzIGRvZXMgbm90IG1hdHRlciBzbworCXlvdSBhcmUgZnJlZSB0byBsYXlvdXQgeW91ciBsb2cgZmlsZSBhbnkgd2F5IHlvdSBsaWtlLiBKdXN0CisJcmVtZW1iZXIgdG8gaW5jbHVkZSB0aGUgTG9nRmFjdG9yNSBzdGFydCB0YWcgYXQgdGhlIGJlZ2lubmluZworCW9mIHRoZSBzdHJpbmcgYW5kIGFueSBMb2dGYWN0b3I1IHRhZ3MgYWZ0ZXIgZWFjaCBjb3JyZXNwb25kaW5nCisJbG9nNGogY29udmVyc2lvbiBjaGFyYWN0ZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9yIHRvIHNlZSBhCisJd29ya2luZyBleGFtcGxlLCB0cnkgdGhlIE9wZW5pbmdMb2dGaWxlcyBleGFtcGxlIGluIHRoZQorCWV4YW1wbGVzIGRpcmVjdG9yeS4KKyAgICAgIDwvcD4KKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CisKKwpkaWZmIC0tZ2l0IGEvc3JjL3hkb2NzL2xmNS90cm91YmxlLnhtbCBiL3NyYy94ZG9jcy9sZjUvdHJvdWJsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyZGIwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94ZG9jcy9sZjUvdHJvdWJsZS54bWwKQEAgLTAsMCArMSwzMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGRvY3VtZW50PgorICAKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iQk1hcmxib3JvdWdoQHRob3VnaHR3b3Jrcy5jb20iPkJyYWQgTWFybGJvcm91Z2g8L2F1dGhvcj4KKyAgICA8dGl0bGU+TG9nRmFjdG9yNSBVc2VycycgR3VpZGU8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisgIAorICA8Ym9keT4KKyAgICA8c2VjdGlvbiBuYW1lPSJUcm91Ymxlc2hvb3RpbmcgRXhhbXBsZXMiPgorCisgICAgICA8cD48Yj5RLiBIb3cgZG8gSSBzZW5kIGxvZyBtZXNzYWdlcyB0byBib3RoIExvZ0ZhY3RvcjUgYW5kIGEgcm9sbGluZyBsb2cgZmlsZT88L2I+IAorICAgICAgPC9wPiAKKworICAgICAgPHA+PGI+QS48L2I+IExvZzRKIGdpdmVzIHlvdSB0aGUgYWJpbGl0eSB0byBsb2cgdG8gbXVsaXRwbGUKKwlhcHBlbmRlcnMuIFRoZSA8aT5Sb2xsaW5nRmlsZUFwcGVuZGVyPC9pPiBjbGFzcyBpcyB0aGUKKwlhcHBlbmRlciB1c2VkIHRvIGxvZyBtZXNzYWdlcyB0byBhIHNlcmllcyBvZiBmaWxlcy4gVGhlCisJZm9sbG93aW5nIGNvZGUgc25pcHBldCBzaG93cyBob3cgdG8gY29uZmlndXJlIGEKKwlsb2c0ai5wcm9wZXJ0aWVzIGZpbGUgb3IgYSBzdGFuZGFyZCBwcm9wZXJpdGVzIGZpbGUgc28gdGhhdCBpdAorCWxvZ3MgdG8gYm90aCB0aGUgTG9nRmFjdG9yNSBjb25zb2xlIGFuZCBhIHJvbGxpbmcgbG9nCisJZmlsZS48L3A+CisKKzxwcmU+PGZvbnQgZmFjZT0iQ291cmllciBOZXcsIENvdXJpZXIsIG1vbm8iPiMgUmVnaXN0ZXIgYm90aCBhcHBlbmRlcnMKK3dpdGggdGhlIHJvb3Qgb2YgdGhlIGxvZ2dlciB0cmVlLgorCitsb2c0ai5yb290TG9nZ2VyPSwgQTEsIFIKKworIyBBMSBpcyBzZXQgdG8gYmUgYSBMRjVBcHBlbmRlciB3aGljaCBvdXRwdXRzIHRvIGEgc3dpbmcKKyMgbG9nZ2luZyBjb25zb2xlLiAgIAorICAKK2xvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGoubGY1LkxGNUFwcGVuZGVyCisKKyMgUiBpcyB0aGUgUm9sbGluZ0ZpbGVBcHBlbmRlciB0aGF0IG91dHB1dHMgdG8gYSByb2xsaW5nIGxvZyAKKyMgZmlsZSBjYWxsZWQgcm9sbGluZ19sb2dfZmlsZS5sb2cuCisKK2xvZzRqLmFwcGVuZGVyLlI9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5SLkZpbGU9cm9sbGluZ19sb2dfZmlsZS5sb2cKKworIyBDb25maWd1cmUgYSBwYXR0ZXJuIGxheW91dCwgdGhlIHNpemUgb2YgdGhlIGZpbGUgYW5kIHRoZSBudW1iZXIKKyMgb2YgYmFja3VwIGZpbGVzLgorCitsb2c0ai5hcHBlbmRlci5SLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKKyMgRWRpdGVkIHRvIGZpdC4KK2xvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPVtzbGY1cy5zdGFydF0lZHtEQVRFfVtzbGY1cy5EQVRFXSVuXAorICAlcFtzbGY1cy5QUklPUklUWV0lbiV4W3NsZjVzLk5EQ10lbiV0W3NsZjVzLlRIUkVBRF0lblwKKyAgJWNbc2xmNXMuQ0FURUdPUlldJW4lbFtzbGY1cy5MT0NBVElPTl0lbiVtW3NsZjVzLk1FU1NBR0VdJW4lbgorbG9nNGouYXBwZW5kZXIuUi5NYXhGaWxlU2l6ZT0xMDBLQgorbG9nNGouYXBwZW5kZXIuUi5NYXhCYWNrdXBJbmRleD0xPC9mb250PjwvcHJlPgorCisgICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBsb2dnaW5nIHRvIG11bHRpcGxlIGFwcGVuZGVycyBhbG9uZworCXdpdGggYSBkZW1vLCBwbGVhc2Ugc2VlIHRoZSA8YQorCSAgaHJlZj0iZXhhbXBsZTUuaHRtbCI+SW50aVVzaW5nTXVsdGlwbGVBcHBlbmRlcnM8L2E+IGV4YW1wbGUgaW4gdGhlCisJZXhhbXBsZXMgZm9sZGVyLgorICAgICAgPC9wPgorCisgICAgICA8aHIvPgorCisgICAgICA8cD48Yj5RLiBXaGF0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2cgcmVjb3JkcyB0aGF0IHdpbGwgYmUgdmlzaWJsZSBhdCBhbnkgCisJICBvbmUgdGltZT88L2I+IAorICAgICAgPC9wPgorCisgICAgICA8cD48Yj5BLjwvYj4gVGhlIGxvZ2dpbmcgY29uc29sZSB3aWxsIG9ubHkgZGlzcGxheSB1cCB0byA1MDAwIExvZ1JlY29yZHMgYXMgYSAKKwlkZWZhdWx0LiBXaGVuIHRoaXMgbGltaXQgaGFzIHJlYWNoZWQsIHRoZSBvbGRlc3QgcmVjb3JkIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIAorCXRob3NlIHRoYXQgYXJlIGRpc3BsYXllZC48L3A+CisgICAgICA8aHIvPgorCisgICAgICA8cD48Yj5RLiBJcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyBzaG93biBjb25maWd1cmFibGU/IDwvYj48L3A+IAorCisgICAgICA8cD48Yj5BLjwvYj4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgc2hvd24gaXMgY29uZmlndXJhYmxlCisJdmlhIGEgbG9nNGogcHJvcGVydGllcyBmaWxlLCBvciB2aWEgdGhlIENvbmZpZ3VyZSBtZW51IGl0ZW0gaW4KKwl0aGUgTG9nRmFjdG9yNSBHVUkuIE91ciBtZW1vcnkgcHJvZmlsaW5nIGhhcyBzaG93biB0aGF0IHdpdGggYQorCWxvZ2dpbmcgbWVzc2FnZSBvZiAyNSB3b3JkcyBpbiBsZW5ndGgsIGFuZCBhIHN0YWNrIHRyYWNlCisJbmVzdGVkIHNldmVuIG1ldGhvZHMgZGVlcCwgZXZlcnkgMTAwMCByZWNvcmRzIGRpc3BsYXllZCBpbiB0aGUKKwlsb2dnaW5nIGNvbnNvbGUgdXNlcyBhYm91dCA2IE1CIG9mIG1lbW9yeS4gRm9yIHRoaXMgcmVhc29uLAorCXdoZW4geW91IGFyZSBzZXR0aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2cgcmVjb3JkcyB0byBiZQorCXNob3duLCBpdCBpcyBwb3NzaWJsZSB0byBydW4gb3V0IG9mIG1lbW9yeSBpZiB5b3UgYXJlIG5vdAorCWNhcmVmdWwuIFRoZSBkZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgaXMgc2V0IHRvIDUwMDAKKwlyZWNvcmRzIHRvIG1pbmltaXplIHRoZSBwb3NzaWJpbGl0eSBvZiBydW5uaW5nIG91dCBvZgorCW1lbW9yeS48L3A+CisgICAgICA8aHIvPgorCisgICAgICA8cD48Yj5RLiBXaHkgZG9lcyB0aGUgY29tbWFuZCBwcm9tcHQgaGFuZyB3aGVuIEkgY2xvc2UgdGhlCisgICAgICBjb25zb2xlPyA8L2I+PC9wPgorICAgICAgCisgICAgICA8cD48Yj5BLjwvYj4gSWYgeW91IGNsb3NlIHRoZSBMb2dGYWN0b3I1IGNvbnNvbGUgKGFzIG9wcG9zZWQgdG8KKwlleGl0aW5nKSB5b3UgYXJlIGVmZmVjdGl2ZWx5IGhpZGluZyB0aGUgY29uc29sZSBhbmQgdHVybmluZworCW9mZiBhbnkgbG9nZ2luZyB0byBjb25zb2xlLiBIb3dldmVyLCBjbG9zaW5nIHRoZSBjb25zb2xlIGRvZXMKKwlub3Qgc2h1dCBkb3duIHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZS4gQXMgYSByZXN1bHQsIHRoZQorCWNvbW1hbmQgcHJvbXB0IGhhbmdzIHVudGlsIHRoZSB2aXJ0dWFsIG1hY2hpbmUgaXMgcHJvcGVybHkKKwlzaHV0IGRvd24uPC9wPgorICAgICAgPGhyLz4KKworICAgICAgPHA+PGI+US4gSG93IGRvIEkgc2h1dCBkb3duIHRoZSBjb25zb2xlIGNvbXBsZXRlbHkgaW5jbHVkaW5nIHRoZSB2aXJ0dWFsIG1hY2hpbmU/IAorCTwvYj4KKyAgICAgIDwvcD4KKyAgICAgIDxwPjxiPkEuPC9iPiBTZWxlY3RpbmcgZXhpdCAoYXMgb3Bwb3NlZCB0byBjbG9zZSkgd2lsbCBzaHV0IGRvd24gdGhlIExvZ0ZhY3RvcjUgCisgIGNvbnNvbGUgYWxvbmcgd2l0aCB0aGUgdmlydHVhbCBtYWNoaW5lLiA8L3A+CisgICAgICA8aHIvPgorCisgICAgICA8cD48Yj5RLiBJIGhhdmUgbm90IGFkZGVkIExvZ0ZhY3RvcjUgdmlhIGEgY29uZmlndXJhdG9yIG9yIHRoZSBhZGRBcHBlbmRlcigpIG1ldGhvZCwgCisgIHlldCB0aGUgY29uc29sZSBzdGlsbCBwb3BzIHVwIGV2ZXJ5IHRpbWUuIFdoYXQncyBoYXBwZW5pbmc/IDwvYj48L3A+CisKKyAgICAgIDxwPjxiPkEuIDwvYj5UaGUgZXhhbXBsZSBsb2c0ai5wcm9wZXJ0aWVzIGZpbGUgdGhhdCBzaGlwcyB3aXRoCisJTG9nRmFjdG9yNSBpcyBpbiB5b3VyIENMQVNTUEFUSCwgYW5kIGlzIGJlaW5nIGxvYWRlZCBkdXJpbmcKKwlzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIENhdGVnb3J5IGNsYXNzLiBJZiB5b3UgcmVtb3ZlIHRoZQorCWZpbGUgZnJvbSB5b3VyIENMQVNTUEFUSCwgb3IgcmVuYW1lIHRoZSBmaWxlLCB0aGUgbG9nZ2luZworCWNvbnNvbGUgc2hvdWxkIHN0b3AgbG9hZGluZy48L3A+CisgICAgICA8aHIvPgorCisgICAgICAKKyAgICAgIDxwPjxiPlEuIElmIEkgY2xvc2UgdGhlIExvZ0ZhY3RvcjUgbG9nZ2luZyBjb25zb2xlLCBidXQgZG9uJ3Qgc2h1dCBkb3duIHRoZSB2aXJ0dWFsIAorCSAgbWFjaGluZSAoaS5lLiB1c2UgY2xvc2UgcmF0aGVyIHRoYW4gZXhpdCkgZG9lcyB0aGUgY29uc29sZSBjb250aW51ZSB0byBsb2cgbWVzc2FnZXM/IAorCTwvYj48L3A+CisKKyAgICAgIDxwPjxiPkEuPC9iPiBOby4gT25jZSB0aGUgTG9nRmFjdG9yNSBjb25zb2xlIGlzIGNsb3NlZCwgaXQgc3RvcHMgbG9nZ2luZyBtZXNzYWdlcy4gCisJVGhpcyBkb2VzIG5vdCBlZmZlY3QgYW55IG90aGVyIGFwcGVuZGVycyB5b3UgbWF5IGJlIHVzaW5nIChpLmUuIHJvbGxpbmcgbG9nIAorCWZpbGVzKS48L3A+CisgICAgICA8aHIvPgorCisgICAgICA8cD48Yj5RLiBXaGVuIEkgY2FsbCB0aGUgcmVtb3ZlQXBwZW5kZXIoICkgbWV0aG9kIG9uIHRoZSBDYXRlZ29yeSBjbGFzcywgdGhlIGxvZ2dpbmcgCisJICB3aW5kb3cgZG9lcyBub3QgZGlzYXBwZWFyLiBXaGF0J3MgaGFwcGVuaW5nPzwvYj48L3A+CisgICAgICA8cD48Yj5BLiA8L2I+VGhlIExGNUFwcGVuZGVyIDxiPmlzPC9iPiBiZWluZyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCAKKwlBcHBlbmRlcnMgaW4gdGhlIENhdGVnb3J5IGNsYXNzLCBhbmQgbWVzc2FnZXMgYXJlIG5vIGxvbmdlciBiZWluZyBzZW50IHRvIHRoZSAKKwlsb2dnaW5nIHdpbmRvdy4gSG93ZXZlciwgdGhlIGxvZ2dpbmcgd2luZG93IGlzIGJlaW5nIGtlcHQgYWxpdmUgYnkgdGhlIFN3aW5nIAorCXRocmVhZCwgc28geW91IHdpbGwgbmVlZCB0byBjbG9zZSB0aGUgd2luZG93IG1hbnVhbGx5IGluIG9yZGVyIHRvIGdldCByaWQgb2YgCisJaXQuIDwvcD4KKyAgICAgIDxoci8+CisKKyAgICAgIDxwPjxiPlEuIEhvdyBkbyBJIHNlbmQgbG9nIG1lc3NhZ2VzIHRvIExvZ0ZhY3RvcjUgdXNpbmcgbG9nNGoncyBTb2NrZXRBcHBlbmRlciAKKwkgIGFuZCBTb2NrZXRTZXJ2ZXIgY2xhc3Nlcz88L2I+PC9wPgorIAorICAgICAgPHA+PGI+QS48L2I+IExvZzQgZ2l2ZXMgeW91IHRoZSBhYmlsaXR5IHRvIHNlbmQgbWVzc2FnZXMgdG8gYSByZW1vdGUgbG9jYXRpb24gCisJb3ZlciBhIHNvY2tldCBmb3IgbG9nZ2luZyBwdXJwb3Nlcy4gVGhlIG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldEFwcGVuZGVyIAorCWFuZCBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRTZXJ2ZXIgY2xhc3NlcyBhcmUgdGhlIGtleSBjbGFzc2VzIHVzZWQgaW4gcmVtb3RlIAorCWxvZ2dpbmcuPC9wPgorCisgICAgICA8cD5JZiB5b3Ugd2FudCB0byB1c2UgdGhlIExGNUFwcGVuZGVyIHRvIGxvZyBtZXNzYWdlcyByZW1vdGVseSwKKwl5b3UgY2FuIHNpbXBseSByZWdpc3RlciB0aGUgTEY1QXBwZW5kZXIgaW4gdGhlIHByb3BlcnRpZXMgZmlsZQorCWJlaW5nIGxvYWRlZCBieSB5b3VyIFNvY2tldFNlcnZlci4gIFRoZSBmb2xsb3dpbmcgc3RlcHMgZ2l2ZQorCXlvdSBhIGhpZ2ggbGV2ZWwgZGVzY3JpcHRpb24gb2YgaG93IHRvIGRvIHRoaXMuIEZvciBtb3JlCisJaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIFNvY2tldEFwcGVuZGVyLCBhbG9uZyB3aXRoIGEgZGVtbywKKwlwbGVhc2Ugc2VlIHRoZSBVc2luZ1NvY2tldEFwcGVuZGVycyBleGFtcGxlIGluIHRoZSBleGFtcGxlcworCWZvbGRlci48L3A+IAorCisgICAgICA8cD5TVEVQIDE6IE9uIHRoZSBjbGllbnQgc2lkZSAodGhlIGFwcGxpY2F0aW9uIHByb2R1Y2luZyB0aGUKKwlsb2dnaW5nIG1lc3NhZ2VzKSwgbW9kaWZ5IHlvdXIgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZpbGUKKwl0byB3cml0ZSB0byBhIFNvY2tldEFwcGVuZGVyLiBJZiB5b3UgYWRkIGxpbmVzIHNpbWlsYXIgdG8gdGhlCisJZm9sbG93aW5nIHRvIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlLCBpdCBzaG91bGQgZG8gdGhlIHRyaWNrOgorICAgICAgPC9wPgorPHByZT4KKyAgICBsb2c0ai5yb290Q2F0ZWdvcnk9LCBBMQorICAgIGxvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldEFwcGVuZGVyCisgICAgbG9nNGouYXBwZW5kZXIuQTEuUmVtb3RlSG9zdD1sb2NhbGhvc3QKKyAgICBsb2c0ai5hcHBlbmRlci5BMS5Qb3J0PTg4ODgKKzwvcHJlPgorCisgICAgICA8cD5PbmNlIHlvdSBoYXZlIGxvYWRlZCB0aGlzIGNvbmZpZ3VyYXRpb24sIGFsbCBtZXNzYWdlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIAorCW1hY2hpbmUgYW5kIHBvcnQgdGhhdCB5b3Ugc3BlY2lmeS4gPC9wPgorCisgICAgICA8cD5TVEVQIDI6IE9uIHRoZSBzZXJ2ZXIgc2lkZSAod2hlcmUgeW91IGFyZSBsaXN0ZW5pbmcgZm9yCisJbWVzc2FnZXMpLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBsb2c0aidzIFNvY2tldFNlcnZlcgorCWNsYXNzLiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoCisJY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6IDwvcD4KKzxwcmU+CisgICAgbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLEEgCisgICAgbG9nNGouY2F0ZWdvcnkub3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0Tm9kZT1ERUJVRworICAgIGxvZzRqLmFwcGVuZGVyLkE9b3JnLmFwYWNoZS5sb2c0ai5sZjUuTEY1QXBwZW5kZXIKKzwvcHJlPgorCisgICAgICA8cD5TVEVQIDM6IFNldCB1cCB5b3VyIENMQVNTUEFUSCBvbiBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlcgorCXRvIHJ1biBsb2c0aiBhbmQgTG9nRmFjdG9yNS4gPC9wPgorCisgICAgICA8cD5TVEVQIDQ6IFJ1biB0aGUgU29ja2V0U2VydmVyIGF0IHRoZSBjb21tYW5kIGxpbmUuIFRoZSBjb21tYW5kCisJbGluZSBzeW50YXggZm9yIHRoZSBTb2NrZXRTZXJ2ZXIgaXMgYXMgZm9sbG93czogPC9wPgorCis8cHJlPgorICAgIGphdmEgb3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0U2VydmVyIHBvcnROdW1iZXIgY29uZmlndXJhdGlvbkZpbGVcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkRpcmVjdG9yeSAKKzwvcHJlPgorCisKKyAgICAgIDxwPiBGb3IgZXhhbXBsZSwgd2UgcmFuIHRoZSBmb2xsb3dpbmcgYXQgdGhlIGNvbW1hbmQgbGluZTogamF2YQorICBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRTZXJ2ZXIgODg4OAorICBDOlx0ZW1wXHNvY2tldHNlcnZlci5wcm9wZXJ0aWVzIEM6XHRlbXAKKyAgICAgIDwvcD4KKworICAgICAgPHA+U1RFUCA1OiBTdGFydCB5b3VyIGNsaWVudCwgYW5kIHN0YXJ0IGxvZ2dpbmcgbWVzc2FnZXMgdG8gdGhlIFNvY2tldEFwcGVuZGVyLjwvcD4KKworICAgICAgPGhyLz4KKworICAgICAgPHA+PGI+US4gSG93IGRvIEkgc2F2ZSBteSBjdXJyZW50IGNvbmZpZ3VyYXRpb24/PC9iPjwvcD4KKworICAgICAgPHA+PGI+QS4gPC9iPkxvZ0ZhY3RvcjUgaGFzIGEgQ29uZmlndXJlIG1lbnUgaXRlbSBpbiB0aGUgdG9wCisJbWVudSBiYXIuIElmIHlvdSBjaG9vc2Ugc2F2ZSBmcm9tIHRoaXMgbWVudSwgaXQgd2lsbCBzYXZlIHlvdXIKKwljdXJyZW50IGNvbmZpZ3VyYXRpb24uIElmIHlvdSBjaG9vc2UgcmVzZXQgZnJvbSB0aGlzIG1lbnUsIGl0CisJd2lsbCBkZWxldGUgYW55IHNhdmVkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICAgICA8L3A+CisgICAgICA8aHIvPgorCisgICAgICA8cD48Yj5RLiBXaGF0IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgc2F2ZWQ/PC9iPjwvcD4KKyAgICAgIDxwPjxiPkEuIDwvYj5JZiB5b3UgY2hvb3NlIENvbmZpZ3VyZS0mZ3Q7U2F2ZSBmcm9tIHRoZSBMb2dGYWN0b3I1IG1lbnUsIExvZ0ZhY3RvcjUgCisJc2F2ZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNhdGVnb3J5IGV4cGxvcmVyIHdpbmRvdy4gVGhpcyBtZWFucyB0aGF0IHRoZSAKKwluZXh0IHRpbWUgeW91IG9wZW4gTG9nRmFjdG9yNSwgYW55IGNoYW5uZWxzIHRoYXQgeW91IGhhdmUgc2VsZWN0ZWQgb3IgZGUtc2VsZWN0ZWQgCisJd2lsbCByZW1haW4gYXMgdGhleSB3ZXJlIHdoZW4geW91IGxhc3QgZXhpdGVkIHRoZSBHVUkuPC9wPgorICAgICAgPGhyLz4KKworICAgICAgPHA+PGI+US4gV2hlbiBJIG9wZW4gTG9nRmFjdG9yNSwgSSBoYXZlIGEgYnVuY2ggb2Ygb2xkIGNhdGVnb3JpZXMgZnJvbSBhbm90aGVyIAorCSAgYXBwbGljYXRpb24uIFdoYXQncyBnb2luZyBvbiBoZXJlLCBhbmQgaG93IGRvIEkgZ2V0IHJpZCBvZiB0aGVzZSBkZWFkIGNhdGVnb3JpZXM/PC9iPgorICAgICAgPC9wPgorCisgICAgICA8cD48Yj5BLiA8L2I+WW91IG11c3QgaGF2ZSBzYXZlZCB5b3VyIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG90aGVyCisJYXBwbGljYXRpb24uICBMb2dGYWN0b3I1IGlzIGRpc3BsYXlpbmcgeW91ciBzYXZlZAorCWNvbmZpZ3VyYXRpb24sIGFzIHdlbGwgYXMgYW55IG5ldyBjYXRlZ29yaWVzIGluIHRoZQorCWFwcGxpY2F0aW9uIHlvdSBhcmUgbm93IHJ1bm5pbmcuIFRvIHJlbW92ZSB0aGVzZSBlbXB0eQorCWNhdGVnb3JpZXMsIHJpZ2h0LWNsaWNrIGF0IHRoZSByb290IG9mIHRoZSBjYXRlZ29yeSB0cmVlIGluCisJdGhlIGNhdGVnb3J5IGV4cGxvcmVyIHdpbmRvdywgYW5kIGNob29zZSAmcXVvdDtSZW1vdmUgQWxsCisJRW1wdHkgQ2F0ZWdvcmllcyZxdW90Oy4gSWYgeW91IHdhbnQgdG8gZ2V0IHJpZCBvZiB0aGlzIG9sZAorCWNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcGVybWFuZW50bHksIHlvdSBzaG91bGQgY2hvb3NlCisJQ29uZmlndXJlLSZndDtSZXNldCBmcm9tIHRoZSBtZW51IGFzIHdlbGwuPC9wPiAKKworICAgICAgPGhyLz4KKworICAgICAgPHA+PGI+US4gSSdtIHVzaW5nIEFudCB0byBidWlsZCBteSBwcm9qZWN0IGFuZCBvbmUgb2YgbXkgdGFza3MKKwkgIGlzIHRvIGV4ZWN1dGUgYSBzZXJpZXMgb2YgSlVuaXQgdGVzdHMuIFdoZW4gSSBhdHRlbXB0IHRvIHVzZQorCSAgdGhlIExGNUFwcGVuZGVyIGFzIGFuIGFwcGVuZGVyIEkgZ2V0IHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uCisJICB0aHJvd246IDwvYj4KKyAgICAgIDwvcD4KKworPHByZT4KKyAgICBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gCisgICAgYXQgamF2YXguc3dpbmcuSW1hZ2VJY29uLiZsdDtpbml0Jmd0OyhJbWFnZUljb24uamF2YToxMzQpCisgICAgYXQgb3JnLmFwYWNoZS5sb2c0ai5sZjUudmlld2VyLmNoYW5uZWxleHBsb3Jlci5DaGFubmVsTm9kZVJlbmRlcmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2luaXQmZ3Q7KENoYW5uZWxOb2RlUmVuZGVyZXIuamF2YTo3MSkgCisgICAgLi4uIGV0Yy4KKzwvcHJlPgorCisgICAgICA8cD48Yj5XaGF0IGRvIEkgbmVlZCB0byBkbyB0byBmaXggdGhpcyBwcm9ibGVtPzwvYj48L3A+CisKKyAgICAgIDxwPjxiPkEuIDwvYj5UaGlzIHByb2JsZW0gaXMgcmVsYXRlZCB0byB0aGUgd2F5IHRoYXQgQW50J3MgY2xhc3MKKwlsb2FkZXIgd29ya3MuICBUaGUgc29sdXRpb24gZm9yIHRoaXMgcHJvYmxlbSBpcyB0byBmb3JrIHRoZQorCWp1bml0IHRhc2sgaW50byBhIHNlcGFyYXRlIEphdmEgVmlydHVhbCBNYWNoaW5lLiBUaGUKKwlhcHByb3ByaWF0ZSBjb2RlIHRvIGZvcmsgdGhlIFZNIGlzIGEgZm9sbG93czoKKyAgICAgIDwvcD4KKworPHByZT4KKyAgICAmbHQ7anVuaXQgZm9yaz0ieWVzIiZndDsKKyAgICAgIC4uLgorICAgICZsdDsvanVuaXQmZ3Q7Cis8L3ByZT4KKyAgICAgIDxoci8+CisKKyAgICAgIDxwPjxiPlEuIFdoZW4gSSB0cnkgdG8gb3BlbiBhIGZpbGUsIEkgZ2V0IHRoZSBmb2xsb3dpbmcgZXJyb3I6CisJICAnRXJyb3IgLSBJbnZhbGlkIGxvZyBmaWxlIGZvcm1hdCEnLiBXaGF0IGlzIGdvaW5nCisJICBvbj88L2I+PC9wPgorCisgICAgICA8cD48Yj5BLiA8L2I+TG9nRmFjdG9yNSBjYW4gcmVhZCBpbiBsb2cgZmlsZXMgY3JlYXRlZCB3aXRoCisJTG9nNEoncyBSb2xsaW5nRmlsZUFwcGVuZGVyLiAgVGhlIGZvcm1hdCBvZiB0aGUgbG9nIGZpbGUKKwk8Yj5tdXN0PC9iPiBmb2xsb3cgdGhlIExvZ0ZhY3RvcjUgbGF5b3V0IGNvbnZlbnRpb25zIGluIG9yZGVyCisJZm9yIExvZ0ZhY3RvcjUgdG8gb3BlbiB0aGUgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKwlMb2dGYWN0b3I1J3MgbGF5b3V0IGNvbnZlbnRpb25zIGFuZCBob3cgdG8gc2V0IHRoZSBjb252ZXJzaW9uCisJcGF0dGVybiBpbiBhIExvZzRKIHByb3BlcnRpZXMgZmlsZSwgcGxlYXNlIHNlZSB0aGUKKwlPcGVuaW5nTG9nRmlsZXMgZXhhbXBsZS48L3A+CisKKyAgICAgIDxoci8+CisKKyAgICAgIDxwPjxiPlEuIFdoeSBjYW4ndCBJIHNldCBteSBvd24gY3VzdG9tIGRhdGUgZm9ybWF0PzwvYj48L3A+CisKKyAgICAgIDxwPjxiPkEuIDwvYj5Mb2c0aiBhbGxvd3MgdXNlcnMgdG8gY3V0b21pemUgdGhlIGRhdGUgZm9ybWF0IG9mCisJdGhlaXIgbG9nIHJlY29yZHMuICBVbmZvcnR1bmF0ZWx5IExvZ0ZhY3RvcjUgZG9lcyBub3Qgc3VwcG9ydAorCXRoaXMgZmVhdHVyZS4gTG9nRmFjdG9yNSB1c2VzIGEgZGF0ZSBtYW5hZ2VyIHRvIGVuc3VyZSB0aGF0CisJb25seSBvbmUgZGF0ZSBmb3JtYXQgaXMgZXZlciB1c2VkLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKKwlMb2dGYWN0b3I1IGNhbiByZWFkIGluIGxvZyBmaWxlcyBjcmVhdGVkIHdpdGggTG9nNEoncworCVJvbGxpbmdGaWxlQXBwZW5kZXIuICBIb3dldmVyLCB0aGUgZGF0YSBpbiB0aGUgbG9nIGZpbGVzIGlzCisJdGV4dCByYXRoZXIgdGhhbiBvYmplY3RzLiBJbiBvcmRlciBmb3IgTG9nRmFjdG9yNSB0byByZWFkIGluCisJdGhlIGxvZyBmaWxlLCBpdCBtdXN0IGtub3cgdGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgZGF0YSBpbgorCW9yZGVyIHRvIHBhcnNlIHRoZSBpbmZvcm1hdGlvbi4gVGhpcyBpbmNsdWRlIHRoZSBmb3JtYXQgb2YgdGhlCisJZGF0ZS4gQW55IGZpbGVzIGNvbnRhaW5pbmcgaW52YWxpZCBkYXRlIGZvcm1hdHMgd291bGQgbm90IGJlCisJYWJsZSB0byBiZSBvcGVuZWQgYW5kIHJlYWQuICBBcyBhIHJlc3VsdCwgdXNlcnMgYXJlIGZvcmNlZCB0bworCXVzZSBhIGRlZmF1bHQgZGF0ZSBmb3JtYXQgcHJvdmlkZWQgYnkgTG9nNGogKCAlZHtEYXRlfSApLjwvcD4KKyAgCisgICAgICA8aHIvPgorCisgICAgICA8cD48Yj5RLiBXaHkgZG9lcyB0aGUgTG9nRmFjdG9yNSBHVUkgaGFuZyB3aGVuIEkgdXNlIFRvbWNhdAorCSAgMS40J3MgcmVsb2FkIGZlYXR1cmUgdG8gcmVsb2FkIG15IGFwcGxpY2F0aW9uPzwvYj48L3A+CisKKyAgICAgIDxwPjxiPkEuIDwvYj5XaGVuIGFuIGFwcGxpY2F0aW9uIHVzaW5nIExvZ0ZhY3RvcjUgaXMgZGVwbG95ZWQKKwl1c2luZyBUb21jYXQsIHRoZSBHVUkgYmluZHMgaXRzZWxmIHRvIHRoZSBuYW1pbmcgY29udGV4dCBvZgorCXRoZSBhcHBsaWNhdGlvbi4gSG93ZXZlciwgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgcmVsb2FkZWQKKwl1c2luZyBUb21jYXQncyByZWxvYWQgZmVhdHVyZSwgdGhlIG5hbWluZyBjb250ZXh0IGlzIG51bGxlZAorCWFuZCBhIG5ldyBuYW1pbmcgY29udGV4dCBpcyBjcmVhdGVkLiBTaW5jZSB0aGUgVk0gaXMgbm90IHNodXQKKwlkb3duIGFuZCByZXN0YXJ0ZWQgZHVyaW5nIHRoZSByZWxvYWQgcHJvY2VzcywgYW5kIHRoZXJlIGlzIG5vCisJbG9uZ2VyIGEgbmFtaW5nIGNvbnRleHQgdG8gYmluZCB0bywgdGhlIExvZ0ZhY3RvcjUgY29uc29sZQorCWhhbmdzLiBXaGVuIHRoZSBhcHBsaWNhdGlvbiBpcyByZWxvYWRlZCwgYSBuZXcgTG9nRmFjdG9yNQorCWNvbnNvbGUgaXMgY3JlYXRlZCB3aGlsZSB0aGUgb2xkIG9uZSBpcyBsZWZ0IGhhbmdpbmcgaW4gbGltYm8uCisJT25lIHdheSBhcm91bmQgdGhpcyBwcm9ibGVtIGlzIHRvIHVzZSBUb21jYXQgaW4gY29uanVuY3Rpb24KKwl3aXRoIEpCb3NzIHRvIHJlZGVwbG95IHRoZSBhcHBsaWNhdGlvbi4gSkJvc3MgYWxzbyBoYXMgYQorCXJlbG9hZCBmZWF0dXJlIHRoYXQgYWxsb3dzIHVzZXJzIHRvIHJlZGVwbG95IHRoZWlyIGFwcGxpY2F0aW9uCisJd2l0aG91dCBoYXZpbmcgdG8gYm91bmNlIHRoZSB3ZWIvYXBwbGljYXRpb24gc2VydmVyLiBUaGUKKwlkaWZmZXJlbmNlIGlzIHRoYXQgSkJvc3MgaGFzIGEgbmFtaW5nIGNvbnRleHQgbWFuYWdlciB0aGF0CisJa2VlcHMgdHJhY2sgb2YgYW4gYXBwbGljYXRpb25zIG5hbWluZyBjb250ZXh0IGJldHdlZW4gZGVwbG95cworCXJhdGhlciB0aGFuIG51bGxpbmcgdGhlIGNvbnRleHQgYW5kIGNyZWF0aW5nIGEgbmV3IG9uZS4gQXMgYQorCXJlc3VsdCwgdGhlIExvZ0ZhY3RvcjUgY29uc29sZSB3aWxsIHJlbWFpbiBib3VuZCB0byB0aGUKKwlhcHBsaWNhdGlvbiBiZXR3ZWVuIGVhY2ggZGVwbG95LiA8L3A+CisgIAorICAgIDwvc2VjdGlvbj4KKyAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3NyYy94ZG9jcy9wbGFuLnhtbCBiL3NyYy94ZG9jcy9wbGFuLnhtbAppbmRleCA3MmE1MWE2Li5hNDlkNTk2IDEwMDY0NAotLS0gYS9zcmMveGRvY3MvcGxhbi54bWwKKysrIGIvc3JjL3hkb2NzL3BsYW4ueG1sCkBAIC0zLDcgKzMsNyBAQAogCiAgIDxwcm9wZXJ0aWVzPgogICAgIDxhdXRob3IgZW1haWw9ImNla2lAYXBhY2hlLm9yZyI+Q2VraSBHdWxjdTwvYXV0aG9yPgotICAgIDx0aXRsZT5SZWxlYXNlIHBsYW4gZm9yIGxvZzRqIDEuMjwvdGl0bGU+CisgICAgPHRpdGxlPlJlbGVhc2UgcGxhbiBmb3IgbG9nNGogMS4zPC90aXRsZT4KICAgPC9wcm9wZXJ0aWVzPgogCiAgIDxib2R5PgpAQCAtMTEsOCArMTEsOCBAQAogICAgIDxzZWN0aW9uIG5hbWU9IlBsYW4/IFdoYXQgcGxhbj8iPgogCiAgICAgICA8cD5UaGUgZm9sbG93aW5nIHBhcmFncmFnaCB3YXMgYWRhcHRlZCBmcm9tIHRoZSA8YQotCSAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jYWN0dXMvdG9kby5odG1sIj5DYWN0dXMKLQkgIHByb2plY3QncyByb2FkbWFwPC9hPiB3aXRoIHRoZSBhdXRob3IncyBwZXJtaXNzaW9uLgorICAgICAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jYWN0dXMvIj5DYWN0dXM8L2E+IHByb2plY3QncworICAgICAgcm9hZG1hcCB3aXRoIHRoZSBhdXRob3IncyBwZXJtaXNzaW9uLgogICAgICAgPC9wPgogICAgICAgCiAgICAgICA8cD5PdXIgdXNlcnMga2VlcCBpbnZlbnRpbmcgYmV0dGVyIHdheXMgYW5kIGFkZGluZyBuZXcKQEAgLTM1LDEzICszNSwxNiBAQAogCiAgICAgPHNlY3Rpb24gbmFtZT0iV29ya3BsYW4gZm9yIGxvZzRqIDEuMyI+CiAKLSAgICAgIDxwPldpdGggbG9nNGogMS4yIHN0aWxsIGluIGJldGEsIHRoZSB3b3JrcGxhbiBmb3IgbG9nNGogMS4zIGlzCi0Jb2J2aW91c2x5IG5vdCBmaW5hbC4gSXQgaXMgaW5jbHVkZWQgaGVyZSB0byBnaXZlIHlvdSBhbiBpZGVhCi0Jb2YgdGhlIGZ1dHVyZS4gVGhlIGl0ZW1zIGFyZSBub3QgbGlzdGVkIGluIGFueSBwYXJ0aWN1bGFyCi0Jb3JkZXIuCisgICAgICA8cD5UaGUgd29ya3BsYW4gZm9yIGxvZzRqIDEuMyBpcyBub3QgZmluYWwuIEl0IGlzIGluY2x1ZGVkIGhlcmUKKwl0byBnaXZlIHlvdSBhbiBpZGVhIG9mIHRoZSBmdXR1cmUuIFRoZSBpdGVtcyBhcmUgbm90IGxpc3RlZCBpbgorCWFueSBwYXJ0aWN1bGFyIG9yZGVyLiAgQXMgYWx3YXlzLCB0aGVyZSBpcyBubyBzY2hlZHVsZWQKKwlyZWxlYXNlIGRhdGUuIFRoZSBsYWNrIG9mIHNjaGVkdWxlIHN1cHJpc2VzIGFuZCBkaXN0dXJicyBzb21lCisJcGVvcGxlLiBXcml0aW5nIGdvb2Qgc29mdHdhcmUsIGxpa2UgZ29vZCBjb29raW5nLCB0YWtlcworCXRpbWUuIElmIHdlIG1ha2UgeW91IHdhaXQsIGl0IGlzIHRvIGNyZWF0ZSBhIGJldHRlciBhbmQgbW9yZQorCXJlbGlhYmxlIHByb2R1Y3QuCiAgICAgICA8L3A+CiAgICAgICAKLSAgICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMiI+CisgICAgICA8dGFibGUgY2xhc3M9ImxzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjIiPgogCQogCTx0cj4KIAkgIDx0aD5MYWJlbDwvdGg+CkBAIC02MCw4ICs2Myw4IEBACiAJICAgICAgYXMgZWFybHkgaXMgcG9zc2libGUuICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBhZGQKIAkgICAgICBhIG5ldyB0ZXN0IGNhc2Ugd2l0aCBlYWNoIG5ldyBmZWF0dXJlIG9yIGNvbXBvbmVudC48L3A+CiAKLQkgICAgPHA+RXhpc3RpbmcgPGVtPlBlcmw8L2VtPiBsYW5ndWFnZSBiYXNlZCB0ZXN0IGNhc2VzIGFyZQotCSAgICAgIGdyYWR1YWxseSBiZWluZyBtaWdyYXRlZCB0byBqdW5pdCAoYWxsLUphdmEpYmFzZWQgdGVzdAorCSAgICA8cD5FeGlzdGluZyA8ZW0+UGVybDwvZW0+IGxhbmd1YWdlIGJhc2VkIHRlc3QgY2FzZXMgaGF2ZSBiZWVuIAorCQkJbWlncmF0ZWQgdG8ganVuaXQgKGFsbC1KYXZhKWJhc2VkIHRlc3QKIAkgICAgICBjYXNlcy4gIFRoZSBuZXcgdGVzdHMgYXJlIHBsYWNlZCB1bmRlciB0aGUKIAkgICAgICA8Y29kZT50ZXN0cy88L2NvZGU+IGRpcmVjdG9yeS4gIEl0IHNob3VsZCBiZSB0aHVzCiAJICAgICAgcG9zc2libGUgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgcHJvamVjdCB0byB1bmRlcnN0YW5kCkBAIC04OCwxNCArOTEsMTMgQEAKIAkgICAgICBhcmUgY29uZmlndXJlZCBzZXBhcmF0ZWx5LgogCSAgICA8L3A+CiAKLQkgICAgPHA+VGhlIHN1cHBvcnQgZm9yIGV4dGVuc2libGUgY29uZmlndXJhdGlvbiBmaWxlcyB3aWxsIGJlCi0JICAgIGJhc2VkIG9uIHRoZSBjb2RlIGluIGNvbW1vbnMtZGlnZXN0ZXIgYXV0aG9yZWQgYnkgQ3JhaWcKLQkgICAgTWNDbGFuYWhhbiBhbmQgU2NvdHQgU2FuZGVycy4gVGhleSBncmFjaW91c2x5IGdyYW50ZWQKLQkgICAgcGVybWlzc2lvbiBmb3IgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb2RlIGFuZCBpdHMKLQkgICAgaW5jbHVzaW9uIGluIGxvZzRqLjwvcD4JICAgICAgCisJICAgIDxwPlRoZSBuZXcgSm9yYW5Db25maWd1cmF0b3IgYmVpbmcgY3JlYXRlZCBieSBDZWtpIHdpbGwgYmUgYmFzZWQgb24KKwkgICAgYSBuZXcgJ21vZHVsZScga25vdyBhcyBKb3Jhbiwgd2hpY2ggY2FuIGNvbnZlcnQgWE1MIGZpbGVzIGludG8gb3RoZXIgb2JqZWN0cyBiYXNlZAorCSAgICBvbiBydWxlcy4gIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0aCBKb3JhbiA8Yj48dT48YSBocmVmPSJodHRwOi8vd3d3LnFvcy5jaC9sb2dnaW5nL0pvcmFuQ29uZmlndXJhdG9yLmh0bWwiPmhlcmU8L2E+PC91PjwvYj4KKwkgICAgPC9wPgkgICAgICAKIAkgIDwvdGQ+CiAJICA8dGQ+Q2VraTwvdGQ+CSAgCi0JICA8dGQ+ZGVzaWduIGJvYXJkPC90ZD4KKwkgIDx0ZD5TaWduaWZpY2FudGx5IHByb2dyZXNzZWQ8L3RkPgogCTwvdHI+CiAKIAk8dHI+CkBAIC0xMzAsMjAgKzEzMiwzNSBAQAogCSAgPHRkPj88L3RkPgkgIAogCSAgPHRkPnZhcG9yd2FyZTwvdGQ+CiAJPC90cj4KKwk8dHI+CisJICA8dGQ+UGx1Z2lucy9SZWNlaXZlcnM8L3RkPgorCSAgCisJICA8dGQ+CisJICAgIDxwPkEgUGx1Z2luIGZyYW1ld29yayBoYXMgYmVlbiBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQuPC9wPgorCSAgICA8cD5BbGwgb2YgdGhlIGN1cnJlbnRseSBkZXZlbG9wZWQgcGx1Z2lucyBhcmUgIlJlY2VpdmVycyIsIHdoaWNoIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHRoZSByZXZlcnNlIG9mIGFuIGFwcGVuZGVyOyBzb21ldGhpbmcKKwkgICAgdGhhdCA8Yj5hY2NlcHRzPC9iPiBMb2dnaW5nRXZlbnRzIGZyb20gc29tZSBleHRlcm5hbCBzb3VyY2UuCisJICAgIDwvcD4KKwkgICAgPHA+VGhpcyBoYXMgcHJvdmVuIHBhcnRpY3VsYWx5IHVzZWZ1bCB3aXRoIHRoZSBsb2c0aiBwb3J0cywgd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlIFhNTC1iYXNlZCBSZWNlaXZlcnMgYWJsZSB0byBhY2NlcHQKKwkgICAgTG9nZ2luZ0V2ZW50cyBnZW5lcmF0ZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMgKHNlZSAiT3ZlcnR1cmUgdG8gb3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIiBiZWxvdykKKwkgICAgPC9wPgorCisJICA8L3RkPgorCSAgPHRkPkFsbDwvdGQ+CSAgCisJICA8dGQ+U2lnbmlmaWNhbnRseSBwcm9ncmVzc2VkPC90ZD4KKwk8L3RyPgogCiAJPHRyPgogCSAgPHRkPkltcHJvdmVtZW50cyB0byBDaGFpbnNhdzwvdGQ+CiAJICAKIAkgIDx0ZD4KLQkgICAgPHA+VmlzdWFsaXNhdGlvbiBhbmQgZHluYW1pYyBmaWx0ZXJpbmcgb2YgbG9nZ2luZyBldmVudCBpcwotCSAgICAgIGJvdW5kIHRvIGJlIGEgdmVyeSBpbXBvcnRhbnQgYXJlYSBvZiBhY3Rpdml0eSBpbiB0aGUKLQkgICAgICBmdXR1cmUuIEEgbnVtYmVyIG9mIGltcG9ydGFudCBpbXByb3ZlbWVudHMgdG8gY2hhaW5zYXcKLQkgICAgICBoYXZlIGJlZW4gc3VnZ2VzdGVkLgorCSAgICA8cD48YSBocmVmPSJjaGFpbnNhdy5odG1sIj5DaGFpbnNhdyB2MjwvYT4gZGV2ZWxvcG1lbnQgaGFzIG5vdyBwcm9ncmVzc2VkIHRvIHRoZSBwb2ludCB3aGVyZSB0aGUgbWFpbiBkZXZlbG9wZXJzIG9mIGl0CisJICAgIGFuZCBtYW55IG90aGVyIG1lbWJlcnMgb2YgdGhlIGxvZ2dpbmcgY29tbXVuaXR5IGFyZSB1c2luZyBpdCBkYWlseS4gIEl0J3Mgc3RpbGwgcHJlLWFscGhhIGJ1dCBvbmx5CisJICAgIGJlY2F1c2Ugd2Uga2VlcCB0aGlua2luZyB1cCB0aGluZ3MgdG8gYWRkLiAKIAkgICAgPC9wPgogCSAgICAKIAkgIDwvdGQ+Ci0JICA8dGQ+T2xpdmVyIEJ1cm48L3RkPgkgIAotCSAgPHRkPnVuZGVyIGRpc2N1c2lzb248L3RkPgorCSAgPHRkPlNjb3R0IERlYm95IGFuZCBQYXVsIFNtaXRoPC90ZD4JICAKKwkgIDx0ZD5TaWduaWZpY2FudGx5IHByb2dyZXNzZWQgPC90ZD4KIAk8L3RyPgogCiAJPHRyPgpAQCAtMTU0LDE5ICsxNzEsMjQgQEAKIAkgIGV4dGVuc2lvbnMgdG8gWE1MIGNvbmZpZ3VyYXRpb24gbGFuZ3VhZ2UgbWVudGlvbmVkCiAJICBhYm92ZS48L3RkPgogCi0JICA8dGQ+PzwvdGQ+IAotCSAgPHRkPm5vdCBzdGFydGVkPC90ZD4KKwkgIDx0ZD5DZWtpPC90ZD4gCisJICA8dGQ+Q29tcGxldGVkLCBzdGlsbCB0ZXN0aW5nPC90ZD4KIAk8L3RyPgogCQogCTx0cj4KIAkgIDx0ZD5PdmVydHVyZSB0byBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXM8L3RkPgogCi0JICA8dGQ+SXQgaXMgaGlnbHkgZGVzcmlhYmxlIHRvIGFsbG93IGxvZzRqIHBvcnRzIGluIG90aGVyIGxhbmd1YWdlcyAKLQkgICAgdG8gYWNjZXNzIGxvZzRqIHNlcnZpY2VzIGluIGEgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgd2F5LiAKLQkgIDwvdGQ+CisJICA8dGQ+PHA+SXQgaXMgaGlnbHkgZGVzcmlhYmxlIHRvIGFsbG93IGxvZzRqIHBvcnRzIGluIG90aGVyIGxhbmd1YWdlcyAKKwkgICAgdG8gYWNjZXNzIGxvZzRqIHNlcnZpY2VzIGluIGEgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgd2F5LiA8L3A+CisJICAKKwkgIDxwPlRoZSB1c2Ugb2YgYSBzdGFuZGFyZCBYTUwgZm9ybWF0IHRvIHJlcHJlc2VudCBhIExvZ2dpbmdFdmVudCBoYXMgYmVlbiBlc3RhYmxpc2hlZCBhbmQgbWFueSBvZiB0aGUgcmVsYXRlZCBsb2dnaW5nIHByb2plY3RzIGZyb20gCisJICBub24tSmF2YSBsYW5ndWFnZXMgaGF2ZSBiZWd1biB0byBzdXBwb3J0IGl0LiAgIEluIGZhY3QsIGEgbnVtYmVyIG9mIHRoZSBsb2c0aiBwb3J0cyBoYXZlIHZvbHVudGVlcmVkIHRvIGpvaW4gQXBhY2hlITwvcD4KKwkgIAorCSAgPHA+U2NvdHQgRGVib3kgaGFzIGNvbXBsZXRlZCB3b3JrIHRvIGNyZWF0ZSBhIGZleCBYTUwtYmFzZWQgUmVjZWl2ZXIKKwkgIGNsYXNzZXMgdGhhdCBjYW4gYWNjZXB0IGxvZ2dpbmcgZXZlbnRzIGZyb20gYW4gZXh0ZXJuYWwgc291cmNlLCBhbmQgJ2ltcG9ydCcgdGhlbSBpbnRvIHRoZSBsb2NhbCBsb2c0aiBlbnZpcm9ubWVudC4gIDwvcD4gPC90ZD4gCiAKLQkgIDx0ZD4/PC90ZD4gCi0JICA8dGQ+bm90IHN0YXJ0ZWQ8L3RkPgorCSAgPHRkPkNla2ksIFNjb3R0IERlYm95PC90ZD4KKwkgIDx0ZD5TaWduaWZpY2FudGx5IFByb2dyZXNzZWQgKGlmIG5vdCBjb21wbGV0ZWQpPC90ZD4KIAk8L3RyPgogCiAJPHRyPgpAQCAtMTg2LDggKzIwOCw4IEBACiAJICAgIHNjcmlwdHMuCiAJICAgIDwvcD4KIAkgIDwvdGQ+Ci0JICA8dGQ+S2V2aW4gU3RlcHBlPC90ZD4JICAKLQkgIDx0ZD5ub3Qgc3RhcnRlZDwvdGQ+CisJICA8dGQ+Q2VraTwvdGQ+CSAgCisJICA8dGQ+U2lnbmlmaWNhbnRseSBQcm9ncmVzc2VkPC90ZD4KIAk8L3RyPgogCiAKQEAgLTIyOSwxNzMgKzI1MSw3IEBACiAJPC90cj4KICAgICAgIDwvdGFibGU+CiAgICAgPC9zZWN0aW9uPgotICAgICAgCi0gICAgICAKLSAgICAgIAotICAgIDxzZWN0aW9uIG5hbWU9IldvcmtwbGFuIGZvciBsb2c0aiAxLjIiPgotICAgICAgPHA+Ci0JSGVyZSBpcyB3b3JrcGxhbiBmb3IgdGhlIDEuMiByZWxlYXNlLiBBcyBhbHdheXMsIHRoZXJlIGlzIG5vCi0Jc2NoZWR1bGVkIHJlbGVhc2UgZGF0ZS4gVGhlIGxhY2sgb2Ygc2NoZWR1bGUgc3VwcmlzZXMgYW5kCi0JZGlzdHVyYnMgc29tZSBwZW9wbGUuIFdyaXRpbmcgZ29vZCBzb2Z0d2FyZSwgbGlrZSBnb29kCi0JY29va2luZywgdGFrZXMgdGltZS4gSWYgd2UgbWFrZSB5b3Ugd2FpdCwgaXQgaXMgdG8gY3JlYXRlIGEKLQliZXR0ZXIgYW5kIG1vcmUgcmVsaWFibGUgcHJvZHVjdC4KLSAgICAgIDwvcD4KLSAgICAgIAotICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIyIj4KLQkgICAgCi0JPHRyPgotCSAgPHRoPkxhYmVsPC90aD4KLQkgIDx0aD5Db21tZW50PC90aD4KLQkgIDx0aD5Wb2x1bnRlZXI8L3RoPgotCSAgPHRoPlN0YXR1czwvdGg+Ci0JPC90cj4KLQkKLQk8dHIgYmdjb2xvcj0iREREREREIj4KLQkgIDx0ZD5Nb3JlIHRlc3QgY2FzZXM8L3RkPgotCSAgCi0JICA8dGQ+V2UgbmVlZCBtb3JlIGF1dG9tYXRlZCB0ZXN0IGNhc2VzIHRvIGNhdGNoIGJ1Z3MgYXMgZWFybHkKLQkgICAgaXMgcG9zc2libGUuSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIGFkZCBhIG5ldyB0ZXN0IGNhc2UKLQkgICAgd2l0aCBlYWNoIG5ldyBmZWF0dXJlIG9yIGNvbXBvbmVudC48L3RkPgotCSAgCi0JICA8dGQ+QWxsIGNvbW1pdHRlcnM8L3RkPgotCSAgPHRkPm9uZ29pbmcgZWZmb3J0PC90ZD4JICAKLQk8L3RyPgotCi0KLQk8dHI+Ci0JICA8dGQ+UmVtb3ZhbCBvZiBkZXByZWNhdGVkIG1ldGhvZHM8L3RkPgotCSAgICAKLQkgIDx0ZD5EZXByZWNhdGVkIDxjb2RlPnNldE9wdGlvbjwvY29kZT4gYW5kIDxjb2RlPmdldE9wdGlvbjwvY29kZT4KLQkgICAgbWV0aG9kcyBpbiBhcHBlbmRlciBhbmQgbGF5b3V0cyBzaG91bGQgYmUgcmVtb3ZlZC48L3RkPgotCi0JICA8dGQ+Q2VraTwvdGQ+Ci0JICA8dGQ+ZG9uZTwvdGQ+Ci0JPC90cj4KLQkKLQk8dHIgYmdjb2xvcj0iREREREREIj4KLQkgIDx0ZD5KREJDQXBwZW5kZXI8L3RkPgotCSAgCi0JICA8dGQ+Ci0JICAgIDxwPldlIGN1cnJlbnRseSBoYXZlIHR3byBjb21wZXRpbmcgSkRCQ0FwcGVuZGVyczogb25lIGJ5Ci0JICAgIFRob21hcyBGZW5uZXIgYW5kIHRoZSBvdGhlciBieSBLZXZpbiBTdGVwcGUuPC9wPgotCi0JICAgIDxwPktldmluIFN0ZXBwZSBzdG9vZCB1cCBhbmQgZGlkIGl0LjwvcD4JICAgIAotCSAgICA8L3RkPgotCSAgCi0JICA8dGQ+S2V2aW4gU3RlcHBlPC90ZD4KLQkgIAotCSAgPHRkPmRvbmU8L3RkPgotCTwvdHI+Ci0JCi0JPHRyPgotCSAgPHRkPkxvZzRqIGluIGFwcGxldHM8L3RkPgotCSAgCi0JICA8dGQ+SW4gb3JkZXIgdG8gbWluaW1pemUgbmV0d29yayB0cmFmZmljLCB0aGUgc2l6ZSBvZiBsb2c0ai1jb3JlLmphcgotCSAgICBuZWVkcyB0byBiZSByZWR1Y2VkIHRvIGF0IG1vc3QgNTBLQi4KLQkgICAgCi0JICAgIDxwPkxvZzRqTUUgaGFzIGJlZW4gcmVsZWFzZWQuIEl0J3MgbGVzcyB0aGFuIDIwS0IuPC9wPgotCSAgPC90ZD4KLQkgIAotCSAgPHRkPkNla2k8L3RkPgotCSAgPHRkPmRvbmU8L3RkPgotCTwvdHI+Ci0JCi0JPHRyICBiZ2NvbG9yPSJEREREREQiPgotCSAgPHRkPkltcHJvdmVkIGRvY3VtZW50YXRpb248L3RkPgotCSAgCi0JICA8dGQ+TG9nNGogZG9jdW1lbnRhdGlvbiBuZWVkcyB0byBiZSBlbmhhbmNlZCB3aXRoIGNvbmZpZ3VyYXRpb24KLQkgICAgZXhhbXBsZXMgYW5kIG11Y2ggbW9yZSBoYW5kLWhvbGRpbmcuPC90ZD4KLQkgIAotCSAgPHRkPkNla2k8L3RkPgotCSAgCi0JICA8dGQ+b25nb2luZyBlZmZvcnQ8L3RkPgotCSAgCi0JPC90cj4KLQkKLQk8dHI+Ci0JICA8dGQgdmFsaWduPSJ0b3AiPk1hcHBlZCBEaWFnbm9zdGljIENvbnRleHRzPC90ZD4KLQkgIAotCSAgPHRkPk1hcHBlZCBEaWFnbm9zdGljIENvbnRleHRzIGFyZSBzaW1pbGFyIHRvIHRoZSBOREMKLQkgICAgZXhjZXB0IHRoYXQgdGhlIE1EQyBpcyBhIHN0cmluZyB0byBzdHJpbmcgbWFwIGluc3RlYWQgb2YKLQkgICAgYSBzdGFjayB0aGF0IHRoZSB1c2VyIHNldHMgd2hlbiBlbnRlcmluZyBhIHNwZWNpYWwKLQkgICAgY29udGV4dC4gVGhlIDxjb2RlPlBhdHRlcm5MYXlvdXQ8L2NvZGU+IGhhcyB0byBiZQotCSAgICBlbmhhbmNlZCB0byBzdXBwb3J0IHRoaXMgYnkgZXh0ZW5kaW5nIHRoZSAleCBwYXR0ZXJuIHRvCi0JICAgIGFjY2VwdCBhbiBhcmd1bWVudC4gIEhlcmUgaXMgYW4gZXhhbXBsZToKLQkgICAgCi0JICAgIDxwcmU+Ci0gICAgQ29udmVyc2lvblBhdHRlcm49M0QlZCAlcCAlYyAleHtzZXJ2ZXJ9ICV4e2hvc3R9IC0gJW0lbgotCSAgICA8L3ByZT4KLQkgICAgCi0JICAgIFVzZXIgY29kZToKLQkgICAgPHByZT4KLSAgICB7Ci0gICAgICAgTURDLnB1dCgic2VydmVyIiwgInRvdG9TZXJ2ZXIiKTsKLSAgICAgICBNREMucHV0KCJob3N0IiwgInNvbWVIb3N0Iik7Ci0JICAgICAgCi0gICAgICAgbG9nZ2VyLmRlYnVnKCJIZWxsbyIpOwotCSAgICAgIAotICAgIH0KLTwvcHJlPgotICAgICAgd2lsbCBwcmludDoKLSAgICAgIDxwcmU+MjAwMC0wMS0yNCAxMDowMDowMCwwMDAgREVCVUcgdG90b1NlcnZlciBzb21lSG9zdCAtIEhlbGxvPC9wcmU+Ci0KLQkgICAgPHA+VG8gbWFrZSBNRENzIHRydWx5IHVzZXIgZnJpZW5kbHkKLQkgICAgICA8Y29kZT5UaHJlYWRMb2NhbDwvY29kZT4gdmFyaWFibGVzIGFyZSByZXF1aXJlZC4gVGhpcwotCSAgICAgIHdpbGwgYWxsb3cgdGhlIE1EQyB0byBiZSBpbmhlcml0ZWQgYnkgY2hpbGQKLQkgICAgICB0aHJlYWRzLiA8Y29kZT5UaHJlYWRMb2NhbDwvY29kZT4gYXJlIG9ubHkgc3VwcG9ydGVkCi0JICAgICAgdW5kZXIgSkRLIDEuMiBhbmQgYWJvdmUuIEluIEpESyAxLjEsIHRoZSBNREMgd2lsbCBub3QKLQkgICAgICB3b3JrIGJ1dCB3b24ndCBoYXJtIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGVpdGhlci48L3A+Ci0JICAgICAgPC90ZD4gCi0JICA8dGQ+Q2VraTwvdGQ+IAotCSAgPHRkPmRvbmU8L3RkPgotCTwvdHI+Ci0KLQk8dHIgYmdjb2xvcj0iREREREREIj4KLQkgIDx0ZD5FbmhhbmNlZCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gc3VwcG9ydCBpbiBET01Db25maWd1cmF0b3I8L3RkPgotCSAgPHRkPjwvdGQ+Ci0JICAKLQkgIDx0ZD5DZWtpPC90ZD4KLQkgIDx0ZD5kb25lPC90ZD4JICAKLQk8L3RyPgotCSAgICAKLQk8dHI+Ci0JICA8dGQ+RmFsbGJhY2tFcnJvckhhbmRsZXI8L3RkPgotCSAgCi0JICA8dGQ+VGhlIEZhbGxiYWNrRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgdGhlIEVycm9ySGFuZGxlcgotCSAgICBpbnRlcmZhY2Ugc3VjaCB0aGF0IGEgc2Vjb25kYXJ5IGFwcGVuZGVyIG1heSBiZQotCSAgICBzcGVjaWZpZWQuIFRoaXMgc2Vjb25kYXJ5IGFwcGVuZGVyIHRha2VzIG92ZXIgaWYgdGhlIHByaW1hcnkKLQkgICAgYXBwZW5kZXIgZmFpbHMgZm9yIHdoYXRldmVyIHJlYXNvbi4KLQkgICAgCi0JICAgIDxwPlRoZSBET01Db25maWd1cmF0b3IgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydCB0aGUKLQkgICAgICBGYWxsYmFja0Vycm9ySGFuZGxlcjwvcD4KLQkgICAgCi0JICA8L3RkPgotCSAgPHRkPkNla2k8L3RkPgotCSAgPHRkPmltcGxlbWVudGVkLCByZXF1aXJlcyBmdXJ0aGVyIHRlc3Rpbmc8L3RkPgotCTwvdHI+Ci0JCi0JCi0JPHRyPgotCSAgPHRkPkVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9mIExvZ2dpbmdFdmVudAotCSAgb2JqZWN0czwvdGQ+IAotCSAgCi0JICA8dGQ+VG8gYXZvaWQgZGVwbG95bWVudCBwcm9ibGVtcyB3ZSBtdXN0IGVuc3VyZSB0aGF0Ci0JICBMb2dnaW5nRXZlbnQgb2JqZWN0cyBhcmUgY29tcGF0aWJsZSBiZXR3ZWVuIDEuMiBhbmQgMS4xLjMuCi0KLQkgICAgPHA+Um9iZXJ0IEJ1c2htYW4gaGFzIHByb3Bvc2VkIGEgdmVyeSBpbm5vdmF0aXZlIHdheSBmb3IKLQkgICAgc29sdmluZyB0aGlzIHByb2JsZW0uIFNlZSA8YQotCSAgICBocmVmPSJodHRwOi8vd3d3Lm1haWwtYXJjaGl2ZS5jb20vbG9nNGotZGV2QGpha2FydGEuYXBhY2hlLm9yZy9tc2cwMTM5Ny5odG1sIj4KLQkgICAgaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL2xvZzRqLWRldkBqYWthcnRhLmFwYWNoZS5vcmcvbXNnMDEzOTcuaHRtbDwvYT4KLQkgICAgZm9yIGZ1cnRoZXIgZGV0YWlscy4KLQkgICAgPC9wPgotCSAgPC90ZD4KLQkgIAotCSAgPHRkPkNla2k8L3RkPgotCSAgPHRkPmltcGxlbWVudGVkLCBtYW51YWxseSB0ZXN0ZWQsIHJlcXVpcmVzIGF1dG9tYXRlZCB0ZXN0IGNhc2VzPC90ZD4KLQk8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L3NlY3Rpb24+Ci0KKyAgICAgCiAgIDwvYm9keT4KIAogPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3NyYy94ZG9jcy9zdHlsZXNoZWV0cy9sZjUueG1sIGIvc3JjL3hkb2NzL3N0eWxlc2hlZXRzL2xmNS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5NTJlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy94ZG9jcy9zdHlsZXNoZWV0cy9sZjUueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzxwcm9qZWN0IG5hbWU9Ikpha2FydGEgU2l0ZSIKKyAgICAgICAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8iPgorCisgIDx0aXRsZT5Mb2c0aiBwcm9qZWN0PC90aXRsZT4KKyAgPGxvZ28gaHJlZj0ibGY1L2ltYWdlcy9sZjVfbG9nby5naWYiPkxvZ0ZhY3RvcjU8L2xvZ28+CisgIDxib2R5PgorCisgICAgPG1lbnUgbmFtZT0iTEY1IFVzZXIgR3VpZGUiPgorICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgaHJlZj0iL2xmNS9vdmVydmlldy5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJGZWF0dXJlcyIgICBocmVmPSIvbGY1L2ZlYXR1cmVzLmh0bWwiLz4KKyAgICAgIDxpdGVtIG5hbWU9IlJlYWRpbmcgRmlsZXMiICAgaHJlZj0iL2xmNS9yZWFkaW5nZmlsZXMuaHRtbCIvPgorICAgICAgPGl0ZW0gbmFtZT0iQ29uZmlndXJhdGlvbiIgICBocmVmPSIvbGY1L2NvbmZpZ3VyYXRpb24uaHRtbCIvPgorICAgICAgPGl0ZW0gbmFtZT0iTGlicmFyeSIgICBocmVmPSIvbGY1L2xpYnJhcnkuaHRtbCIvPgorICAgICAgPGl0ZW0gbmFtZT0iRXhhbXBsZXMiICAgaHJlZj0iL2xmNS9leGFtcGxlcy5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJUcm91Ymxlc2hvb3QiICAgaHJlZj0iL2xmNS90cm91YmxlLmh0bWwiLz4KKyAgICAgIDxpdGVtIG5hbWU9IkZBUSIgICBocmVmPSIvbGY1L2ZhcS5odG1sIi8+CisgICAgPC9tZW51PiAKKworICAgIAorICAgIDxtZW51IG5hbWU9IkxvZzRqIFByb2plY3QiPgorICAgICAgPGl0ZW0gbmFtZT0iSG9tZSBwYWdlIiAgIGhyZWY9Ii9pbmRleC5odG1sIi8+CisgICAgPC9tZW51PgorCisKKyAgPC9ib2R5PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3hkb2NzL3N0eWxlc2hlZXRzL3Byb2plY3QueG1sIGIvc3JjL3hkb2NzL3N0eWxlc2hlZXRzL3Byb2plY3QueG1sCmluZGV4IGM1NjQwYWEuLjA0YmNjYjMgMTAwNjQ0Ci0tLSBhL3NyYy94ZG9jcy9zdHlsZXNoZWV0cy9wcm9qZWN0LnhtbAorKysgYi9zcmMveGRvY3Mvc3R5bGVzaGVldHMvcHJvamVjdC54bWwKQEAgLTEsMzEgKzEsMzMgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTxwcm9qZWN0IG5hbWU9Ikpha2FydGEgU2l0ZSIKLSAgICAgICAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8iPgorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IG5hbWU9IkxvZ2dpbmcgU2VydmljZXMgTG9nNGoiCisgICAgICAgICBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqL2RvY3MvIj4KIAogICA8dGl0bGU+TG9nNGogcHJvamVjdDwvdGl0bGU+CiAgIDxsb2dvIGhyZWY9ImltYWdlcy9sb2dvLmpwZyI+VGhlIGxvZzRqIHByb2plY3Q8L2xvZ28+CiAgIAogICA8Ym9keT4KLSAgICAKKyAgICAgIAogICAgIDxtZW51IG5hbWU9IkxvZzRqIFByb2plY3QiPgogICAgICAgPGl0ZW0gbmFtZT0iSW50cm9kdWN0aW9uIiAgIGhyZWY9Ii9pbmRleC5odG1sIi8+CiAgICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iL2Rvd25sb2FkLmh0bWwiLz4KICAgICAgIDxpdGVtIG5hbWU9IkRvY3VtZW50YXRpb24iICBocmVmPSIvZG9jdW1lbnRhdGlvbi5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJDaGFpbnNhdyIgICAgICAgaHJlZj0iL2NoYWluc2F3Lmh0bWwiLz4KICAgICAgIDxpdGVtIG5hbWU9IlBsYW4iICAgICAgICAgICBocmVmPSIvcGxhbi5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9sb2dnaW5nLWxvZzRqL0xvZzRKUHJvamVjdFBhZ2VzIi8+CiAgICAgICA8aXRlbSBuYW1lPSJDb250YWN0IHVzIiAgICAgaHJlZj0iL2NvbnRhY3RVcy5odG1sIi8+CiAgICAgICA8aXRlbSBuYW1lPSJDb250cmlidXRvcnMiICAgaHJlZj0iL2NvbnRyaWJ1dG9ycy5odG1sIi8+CiAgICAgICA8aXRlbSBuYW1lPSJIaXN0b3J5IiAgICAgICAgaHJlZj0iL2hpc3RvcnkuaHRtbCIvPgogICAgIDwvbWVudT4KIAotICAgIDxtZW51IG5hbWU9Ikpha2FydGEgKHBhcmVudCBwcm9qZWN0KSI+Ci0gICAgICA8aXRlbSBuYW1lPSJIb21lIHBhZ2UiIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJOZXdzIiBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvbmV3cy5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNaXNzaW9uIiBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvbWlzc2lvbi5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJHdWlkZWxpbmVzIiBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvZ3VpZGVsaW5lcy5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJGQVFzIiBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvZmFxcy5odG1sIi8+CisgICAgPG1lbnUgbmFtZT0iTG9nZ2luZyBTZXJ2aWNlcyI+CisgICAgICA8aXRlbSBuYW1lPSJIb21lIHBhZ2UiIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvIi8+CisgICAgICA8aXRlbSBuYW1lPSJOZXdzIiBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL3NpdGUvbmV3cy5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJNaXNzaW9uIiBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL3NpdGUvbWlzc2lvbi1zdGF0ZW1lbnQuaHRtbCIvPgorICAgICAgPGl0ZW0gbmFtZT0iR3VpZGVsaW5lcyIgaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9zaXRlL2J5bGF3cy5odG1sIi8+CiAgICAgPC9tZW51PgogCiAgICAgPG1lbnUgbmFtZT0iVHJhbnNsYXRpb25zIj4KKyAgICAgIDxpdGVtIG5hbWU9IktvcmVhbiIgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLWtvcmVhLm9yZy9sb2c0ai9pbmRleC5odG1sIi8+CiAgICAgICA8aXRlbSBuYW1lPSJKYXBhbmVzZSIgaHJlZj0iaHR0cDovL3d3dy5pbmdyaWQub3JnL2phamFrYXJ0YS9sb2c0ai8iLz4KICAgICA8L21lbnU+CiAgIDwvYm9keT4KZGlmZiAtLWdpdCBhL3Rlc3RzL2J1aWxkLnhtbCBiL3Rlc3RzL2J1aWxkLnhtbAppbmRleCBhMjQ5YmRkLi5jODlkYzU4IDEwMDY0NAotLS0gYS90ZXN0cy9idWlsZC54bWwKKysrIGIvdGVzdHMvYnVpbGQueG1sCkBAIC01MSw5ICs1MSw3IEBACiAgICAgYnVpbGQgIC0gY29tcGlsZSBhbGwgcHJvamVjdCBmaWxlcywgaWYgYSBjZXJ0YWluIGxpYnJhcnkgaXMgbWlzc2luZywgCiAJICAgICAgdGhlbiB0aGUgY29tcGlsYXRpb24gb2YgaXRzIGRlcGVuZGVudHMgYXJlIHNraXBwZWQuCiAKLSAgICByZWdyZXNzaW9uIC0gUnVuIHJlZ3Jlc3Npb24gZXN0cyB3aGljaCBjaGVjayBsYXJnZSBwYXJ0cyBvZiBsb2c0ai4KLSAgICB1bml0ICAgICAgIC0gUnVuIHVuaXQgdGVzdHMgd2hpY2ggY2hlY2sgb25lIGNvbXBvbmVudCBhdCBhIHRpbWUuCi0gICAgbG9uZ1VuaXQgICAtIFJ1biBsb25nIHVuaXQgdGVzdHMgd2hpY2ggY2hlY2sgb25lIGNvbXBvbmVudCBhdCBhIHRpbWUuCisgICAgcmVncmVzc2lvbiAtIFJ1biByZWdyZXNzaW9uIHRlc3RzIHdoaWNoIGNoZWNrIGxhcmdlIHBhcnRzIG9mIGxvZzRqLgogCiAgICAgcnVuQWxsICAgICAtIHJ1biBhbGwgYXZhaWxhYmxlIHRlc3RzCiAgICAgPC9lY2hvPgpAQCAtOTgsMTEgKzk2LDExIEBACiAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+ICAKICAgPHRhcmdldCBuYW1lPSJyZWdyZXNzaW9uIiBkZXBlbmRzPSJNaW5pbXVtLCBMb2dnZXIsIERPTSwgQ3VzdG9tTGV2ZWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUxvZ2dlciwgUGF0dGVybkxheW91dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGllcmFyY2h5VGhyZXNob2xkLCBTb2NrZXRTZXJ2ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZXJhcmNoeVRocmVzaG9sZCwgRGVmYXVsdEluaXQsIFNvY2tldFNlcnZlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MTGF5b3V0LCBBc3luY0FwcGVuZGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25Db252ZXJ0ZXIsIEJvdW5kZWRGSUZPLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDeWNsaWNCdWZmZXIsIE9SLCBMZXZlbE1hdGNoRmlsdGVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkZBIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ljbGljQnVmZmVyLCBQYXR0ZXJuUGFyc2VyLCBPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWxNYXRjaEZpbHRlciwgRFJGQSIvPgogCiAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgIDwhLS0gTG9uZ2VyIHVuaXQgdGVzdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CkBAIC0xNjksMTAgKzE2Nyw2MCBAQAogICAgIDwvanVuaXQ+CiAgIDwvdGFyZ2V0PgogCisgIDx0YXJnZXQgbmFtZT0iRGVmYXVsdEluaXQiIGRlcGVuZHM9ImJ1aWxkIj4KKyAgICA8IS0tIERlbGV0ZSBwb3NzaWJsZSBjcnVmdCBmcm9tIHByZXZpb3VzIHJ1bnMuIC0tPgorICAgIDxkZWxldGUgZmlsZT0iY2xhc3Nlcy9sb2c0ai54bWwiLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImNsYXNzZXMvbG9nNGoucHJvcGVydGllcyIvPgorCisgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBmb3JrPSJ5ZXMiIGhhbHRvbmZhaWx1cmU9InllcyI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0cy5jbGFzc3BhdGgiLz4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICA8dGVzdCBmb3JrPSJ0cnVlIiBuYW1lPSJvcmcuYXBhY2hlLmxvZzRqLmRlZmF1bHRJbml0LlRlc3RDYXNlMSIgLz4KKyAgICA8L2p1bml0PgorCisgICAgPGNvcHkgZmlsZT0iaW5wdXQveG1sL2RlZmF1bHRJbml0LnhtbCIgdG9maWxlPSJjbGFzc2VzL2xvZzRqLnhtbCIvPgorICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgZm9yaz0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdHMuY2xhc3NwYXRoIi8+CisgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJmYWxzZSIvPgorICAgICAgPHRlc3QgZm9yaz0idHJ1ZSIgbmFtZT0ib3JnLmFwYWNoZS5sb2c0ai5kZWZhdWx0SW5pdC5UZXN0Q2FzZTIiIC8+ICAgICAgCisgICAgPC9qdW5pdD4KKyAgICA8ZGVsZXRlIGZpbGU9ImNsYXNzZXMvbG9nNGoueG1sIi8+CisKKyAgICA8IS0tIHRlc3QgaGFuZGxpbmcgb2YgbG9nNGouZGVmYXVsdEluaXRPdmVycmlkZSBzeXN0ZW0gcHJvcGVydHkgLS0+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQveG1sL2RlZmF1bHRJbml0LnhtbCIgdG9maWxlPSJjbGFzc2VzL2xvZzRqLnhtbCIvPgorICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgZm9yaz0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLURsb2c0ai5kZWZhdWx0SW5pdE92ZXJyaWRlPXRydWUiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RzLmNsYXNzcGF0aCIvPgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiLz4KKyAgICAgIDx0ZXN0IGZvcms9InRydWUiIG5hbWU9Im9yZy5hcGFjaGUubG9nNGouZGVmYXVsdEluaXQuVGVzdENhc2UxIiAvPgorICAgIDwvanVuaXQ+CisgICAgPGRlbGV0ZSBmaWxlPSJjbGFzc2VzL2xvZzRqLnhtbCIvPgorCisgICAgPCEtLSB0ZXN0IGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZnJvbSBsb2c0ai54bWwgLS0+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvZGVmYXVsdEluaXQzLnByb3BlcnRpZXMiIHRvZmlsZT0iY2xhc3Nlcy9sb2c0ai5wcm9wZXJ0aWVzIi8+CisgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBmb3JrPSJ5ZXMiIGhhbHRvbmZhaWx1cmU9InllcyI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0cy5jbGFzc3BhdGgiLz4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICA8dGVzdCBmb3JrPSJ0cnVlIiBuYW1lPSJvcmcuYXBhY2hlLmxvZzRqLmRlZmF1bHRJbml0LlRlc3RDYXNlMyIgLz4gICAgICAKKyAgICA8L2p1bml0PgorICAgIDxkZWxldGUgZmlsZT0iY2xhc3Nlcy9sb2c0ai5wcm9wZXJ0aWVzIi8+CisKKyAgICA8IS0tIHRlc3QgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmcm9tIGxvZzRqLnByb3BlcnRpZXMgLS0+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQveG1sL2RlZmF1bHRJbml0LnhtbCIgdG9maWxlPSJjbGFzc2VzL2xvZzRqLnhtbCIvPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2RlZmF1bHRJbml0My5wcm9wZXJ0aWVzIiB0b2ZpbGU9ImNsYXNzZXMvbG9nNGoucHJvcGVydGllcyIvPgorICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgZm9yaz0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdHMuY2xhc3NwYXRoIi8+CisgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJmYWxzZSIvPgorICAgICAgPHRlc3QgZm9yaz0idHJ1ZSIgbmFtZT0ib3JnLmFwYWNoZS5sb2c0ai5kZWZhdWx0SW5pdC5UZXN0Q2FzZTQiIC8+ICAgICAgCisgICAgPC9qdW5pdD4KKyAgICA8ZGVsZXRlIGZpbGU9ImNsYXNzZXMvbG9nNGoueG1sIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJjbGFzc2VzL2xvZzRqLnByb3BlcnRpZXMiLz4KKyAgPC90YXJnZXQ+CisKICAgPHRhcmdldCBuYW1lPSJTb2NrZXRTZXJ2ZXIiIGRlcGVuZHM9ImJ1aWxkIj4KICAgICA8cGFyYWxsZWw+CiAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUubG9nNGoubmV0LlNob3J0U29ja2V0U2VydmVyIiBmb3JrPSJ5ZXMiPgotCTxhcmcgdmFsdWU9IjQiLz4gCisJPGFyZyB2YWx1ZT0iOCIvPiAKIAk8YXJnIHZhbHVlPSJpbnB1dC9zb2NrZXRTZXJ2ZXIiLz4gCiAJPGNsYXNzcGF0aCByZWZpZD0idGVzdHMuY2xhc3NwYXRoIi8+CiAgICAgICA8L2phdmE+CkBAIC0yMTIsNiArMjYwLDEzIEBACiAgICAgPC9qdW5pdD4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJFcnJvckhhbmRsZXIiIGRlcGVuZHM9ImJ1aWxkIj4KKyAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGZvcms9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RzLmNsYXNzcGF0aCIvPgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiIC8+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLmxvZzRqLnZhcmlhLkVycm9ySGFuZGxlclRlc3RDYXNlIiAvPgorICAgIDwvanVuaXQ+CisgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iT3B0aW9uQ29udmVydGVyIiBkZXBlbmRzPSJidWlsZCI+CiAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBmb3JrPSJ5ZXMiIGhhbHRvbmZhaWx1cmU9InllcyI+CkBAIC0yMzcsNiArMjkyLDE0IEBACiAgICAgPC9qdW5pdD4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJQYXR0ZXJuUGFyc2VyIiBkZXBlbmRzPSJidWlsZCI+CisgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBmb3JrPSJ5ZXMiIGhhbHRvbmZhaWx1cmU9InllcyI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0cy5jbGFzc3BhdGgiLz4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMuUGF0dGVyblBhcnNlclRlc3RDYXNlIiAvPgorICAgIDwvanVuaXQ+CisgIDwvdGFyZ2V0PgorCiAKICAgPHRhcmdldCBuYW1lPSJPUiIgZGVwZW5kcz0iYnVpbGQiPgogICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgZm9yaz0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZGVmYXVsdEluaXQzLnByb3BlcnRpZXMgYi90ZXN0cy9pbnB1dC9kZWZhdWx0SW5pdDMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM4OTUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvZGVmYXVsdEluaXQzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3IEBACisKK2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgRDMKK2xvZzRqLmFwcGVuZGVyLkQzPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyICAKK2xvZzRqLmFwcGVuZGVyLkQzLkZpbGU9b3V0cHV0L3RlbXAKK2xvZzRqLmFwcGVuZGVyLkQzLkFwcGVuZD1mYWxzZQorbG9nNGouYXBwZW5kZXIuRDMubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCAgCitsb2c0ai5hcHBlbmRlci5EMy5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyV0XSAlLTVwICUuMTZjIC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L3NvY2tldFNlcnZlcjUucHJvcGVydGllcyBiL3Rlc3RzL2lucHV0L3NvY2tldFNlcnZlcjUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzcyNDQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvc29ja2V0U2VydmVyNS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOCBAQAorbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgQQorbG9nNGouTG9nZ2VyLm9yZy5hcGFjaGUubG9nNGoudGVzdC5TaG9ydFNvY2tldFNlcnZlcj1XQVJOCitsb2c0ai5Mb2dnZXIub3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0Tm9kZT1XQVJOCitsb2c0ai5hcHBlbmRlci5BPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5BLmZpbGU9b3V0cHV0L3RlbXAKK2xvZzRqLmFwcGVuZGVyLkEuQXBwZW5kPWZhbHNlCitsb2c0ai5hcHBlbmRlci5BLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLkEubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSU1cCAleCAlWHtrZXkxfSVYe2tleTV9IFsldF0gJWN7MX0gLSAlbSVuCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9zb2NrZXRTZXJ2ZXI2LnByb3BlcnRpZXMgYi90ZXN0cy9pbnB1dC9zb2NrZXRTZXJ2ZXI2LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwNzQyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L3NvY2tldFNlcnZlcjYucHJvcGVydGllcwpAQCAtMCwwICsxLDggQEAKK2xvZzRqLnJvb3RMb2dnZXI9REVCVUcsIEEKK2xvZzRqLkxvZ2dlci5vcmcuYXBhY2hlLmxvZzRqLnRlc3QuU2hvcnRTb2NrZXRTZXJ2ZXI9V0FSTgorbG9nNGouTG9nZ2VyLm9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldE5vZGU9V0FSTgorbG9nNGouYXBwZW5kZXIuQT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuQS5maWxlPW91dHB1dC90ZW1wCitsb2c0ai5hcHBlbmRlci5BLkFwcGVuZD1mYWxzZQorbG9nNGouYXBwZW5kZXIuQS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Citsb2c0ai5hcHBlbmRlci5BLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lNXAgJXggJVh7aG9zdElEfSAlWHtrZXk2fSBbJXRdICVjezF9IC0gJW0lbgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvc29ja2V0U2VydmVyNy5wcm9wZXJ0aWVzIGIvdGVzdHMvaW5wdXQvc29ja2V0U2VydmVyNy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTE2OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9zb2NrZXRTZXJ2ZXI3LnByb3BlcnRpZXMKQEAgLTAsMCArMSw4IEBACitsb2c0ai5yb290TG9nZ2VyPURFQlVHLCBBCitsb2c0ai5Mb2dnZXIub3JnLmFwYWNoZS5sb2c0ai50ZXN0LlNob3J0U29ja2V0U2VydmVyPVdBUk4KK2xvZzRqLkxvZ2dlci5vcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXROb2RlPVdBUk4KK2xvZzRqLmFwcGVuZGVyLkE9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLkEuZmlsZT1vdXRwdXQvdGVtcAorbG9nNGouYXBwZW5kZXIuQS5BcHBlbmQ9ZmFsc2UKK2xvZzRqLmFwcGVuZGVyLkEubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuQS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JTVwICV4ICVYe2hvc3RJRH0gJVh7a2V5N30gWyV0XSAlY3sxfSAtICVtJW4KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L3NvY2tldFNlcnZlcjgucHJvcGVydGllcyBiL3Rlc3RzL2lucHV0L3NvY2tldFNlcnZlcjgucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhhZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvc29ja2V0U2VydmVyOC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOCBAQAorbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgQQorbG9nNGouTG9nZ2VyLm9yZy5hcGFjaGUubG9nNGoudGVzdC5TaG9ydFNvY2tldFNlcnZlcj1XQVJOCitsb2c0ai5Mb2dnZXIub3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0Tm9kZT1XQVJOCitsb2c0ai5hcHBlbmRlci5BPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5BLmZpbGU9b3V0cHV0L3RlbXAKK2xvZzRqLmFwcGVuZGVyLkEuQXBwZW5kPWZhbHNlCitsb2c0ai5hcHBlbmRlci5BLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLkEubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSU1cCAleCAlWHtob3N0SUR9ICVYe2tleTh9IFsldF0gJWN7MX0gLSAlbSVuCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC94bWwvZGVmYXVsdEluaXQueG1sIGIvdGVzdHMvaW5wdXQveG1sL2RlZmF1bHRJbml0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFkYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQveG1sL2RlZmF1bHRJbml0LnhtbApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KKworPGxvZzRqOmNvbmZpZ3VyYXRpb24gZGVidWc9InRydWUiIHhtbG5zOmxvZzRqPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyI+CisKKyAgPGFwcGVuZGVyIG5hbWU9IkQxIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiPgorICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCI+CisgICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIHZhbHVlPSIlLTVwICVjezJ9IC0gJW0lbiIvPgorICAgIDwvbGF5b3V0PgkgICAgCisgIDwvYXBwZW5kZXI+CisgIAorICA8cm9vdD4KKyAgICA8cHJpb3JpdHkgdmFsdWUgPSJPRkYiIC8+CisgICAgPGFwcGVuZGVyLXJlZiByZWY9IkQxIiAvPgorICA8L3Jvb3Q+CisgIAorPC9sb2c0ajpjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQveG1sL2ZhbGxiYWNrMS54bWwgYi90ZXN0cy9pbnB1dC94bWwvZmFsbGJhY2sxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTFlOTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQveG1sL2ZhbGxiYWNrMS54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IURPQ1RZUEUgbG9nNGo6Y29uZmlndXJhdGlvbiBTWVNURU0gImxvZzRqLmR0ZCI+CisKKzxsb2c0ajpjb25maWd1cmF0aW9uIGRlYnVnPSJ0cnVlIiB4bWxuczpsb2c0aj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9sb2c0ai8iPgorCisKKyAgPGFwcGVuZGVyIG5hbWU9IlBSSU1BUlkiIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+CisgICAgPGVycm9ySGFuZGxlciBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai52YXJpYS5GYWxsYmFja0Vycm9ySGFuZGxlciI+CisgICAgICA8cm9vdC1yZWYvPgorICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkZBTExCQUNLIiAvPgorICAgIDwvZXJyb3JIYW5kbGVyPgorCisgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSIveHl6L3gubG9nIiAvPgorICAgIDxwYXJhbSBuYW1lPSJBcHBlbmQiIHZhbHVlPSJmYWxzZSIgLz4JICAgIAorICAgIAorICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCI+CisgICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIHZhbHVlPSIlLTVwICVjezJ9IC0gJW0lbiIvPgorICAgIDwvbGF5b3V0PgkgICAgCisgIDwvYXBwZW5kZXI+CisgIAorICA8YXBwZW5kZXIgbmFtZT0iRkFMTEJBQ0siIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlciI+CisgICAgPHBhcmFtIG5hbWU9IkZpbGUiIHZhbHVlPSJvdXRwdXQvdGVtcCIgLz4KKyAgICA8cGFyYW0gbmFtZT0iQXBwZW5kIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPGxheW91dCBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ij4KKyAgICAgIDxwYXJhbSBuYW1lPSJDb252ZXJzaW9uUGF0dGVybiIgdmFsdWU9IkZBTExCQUNLIC0gJWMgLSAlbSVuIi8+CisgICAgPC9sYXlvdXQ+CSAgICAKKyAgPC9hcHBlbmRlcj4KKwkKKyAgCisgIDxyb290PgorICAgIDxwcmlvcml0eSB2YWx1ZSA9ImRlYnVnIiAvPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJQUklNQVJZIiAvPgorICA8L3Jvb3Q+CisJCis8L2xvZzRqOmNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0FzeW5jQXBwZW5kZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Bc3luY0FwcGVuZGVyVGVzdENhc2UuamF2YQppbmRleCA3ZDQyYWNhLi43ZGFmYzBkIDEwMDY0NAotLS0gYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0FzeW5jQXBwZW5kZXJUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovQXN5bmNBcHBlbmRlclRlc3RDYXNlLmphdmEKQEAgLTI4LDE0ICsyOCwxNyBAQAogICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeyAgCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIExvZ01hbmFnZXIuc2h1dGRvd24oKTsKICAgfQogCisgIC8vIHRoaXMgdGVzdCBjaGVja3Mgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSB0byBhIGNsb3NlZCBBc3luY0FwcGVuZGVyCiAgIHB1YmxpYyB2b2lkIGNsb3NlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geyAgICAKICAgICBMb2dnZXIgcm9vdCA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCk7CiAgICAgTGF5b3V0IGxheW91dCA9IG5ldyBTaW1wbGVMYXlvdXQoKTsKICAgICBWZWN0b3JBcHBlbmRlciB2ZWN0b3JBcHBlbmRlciA9IG5ldyBWZWN0b3JBcHBlbmRlcigpOwogICAgIEFzeW5jQXBwZW5kZXIgYXN5bmNBcHBlbmRlciA9IG5ldyBBc3luY0FwcGVuZGVyKCk7CisgICAgYXN5bmNBcHBlbmRlci5zZXROYW1lKCJhc3luYy1DbG9zZVRlc3QiKTsKICAgICBhc3luY0FwcGVuZGVyLmFkZEFwcGVuZGVyKHZlY3RvckFwcGVuZGVyKTsKICAgICByb290LmFkZEFwcGVuZGVyKGFzeW5jQXBwZW5kZXIpOyAKIApAQCAtNDUsMTMgKzQ4LDYwIEBACiAgICAgCiAgICAgVmVjdG9yIHYgPSB2ZWN0b3JBcHBlbmRlci5nZXRWZWN0b3IoKTsKICAgICBhc3NlcnRFcXVhbHModi5zaXplKCksIDEpOwotICAgIAotCiAgIH0KIAorICAvLyB0aGlzIHRlc3QgY2hlY2tzIHdoZXRoZXIgYXBwZW5kZXJzIGVtYmVkZGVkIHdpdGhpbiBhbiBBc3luY0FwcGVuZGVyIGFyZSBhbHNvIAorICAvLyBjbG9zZWQgCisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgIExvZ2dlciByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsKKyAgICBMYXlvdXQgbGF5b3V0ID0gbmV3IFNpbXBsZUxheW91dCgpOworICAgIFZlY3RvckFwcGVuZGVyIHZlY3RvckFwcGVuZGVyID0gbmV3IFZlY3RvckFwcGVuZGVyKCk7CisgICAgQXN5bmNBcHBlbmRlciBhc3luY0FwcGVuZGVyID0gbmV3IEFzeW5jQXBwZW5kZXIoKTsKKyAgICBhc3luY0FwcGVuZGVyLnNldE5hbWUoImFzeW5jLXRlc3QyIik7CisgICAgYXN5bmNBcHBlbmRlci5hZGRBcHBlbmRlcih2ZWN0b3JBcHBlbmRlcik7CisgICAgcm9vdC5hZGRBcHBlbmRlcihhc3luY0FwcGVuZGVyKTsgCisKKyAgICByb290LmRlYnVnKCJtMSIpOworICAgIGFzeW5jQXBwZW5kZXIuY2xvc2UoKTsKKyAgICByb290LmRlYnVnKCJtMiIpOworICAgIAorICAgIFZlY3RvciB2ID0gdmVjdG9yQXBwZW5kZXIuZ2V0VmVjdG9yKCk7CisgICAgYXNzZXJ0RXF1YWxzKHYuc2l6ZSgpLCAxKTsKKyAgICBhc3NlcnRUcnVlKHZlY3RvckFwcGVuZGVyLmlzQ2xvc2VkKCkpOworICB9CisKKyAgLy8gdGhpcyB0ZXN0IGNoZWNrcyB3aGV0aGVyIGFwcGVuZGVycyBlbWJlZGRlZCB3aXRoaW4gYW4gQXN5bmNBcHBlbmRlciBhcmUgYWxzbyAKKyAgLy8gY2xvc2VkIAorICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICBpbnQgTEVOID0gMjAwOworICAgIExvZ2dlciByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsKKyAgICBMYXlvdXQgbGF5b3V0ID0gbmV3IFNpbXBsZUxheW91dCgpOworICAgIFZlY3RvckFwcGVuZGVyIHZlY3RvckFwcGVuZGVyID0gbmV3IFZlY3RvckFwcGVuZGVyKCk7CisgICAgQXN5bmNBcHBlbmRlciBhc3luY0FwcGVuZGVyID0gbmV3IEFzeW5jQXBwZW5kZXIoKTsKKyAgICBhc3luY0FwcGVuZGVyLnNldE5hbWUoImFzeW5jLXRlc3QzIik7CisgICAgYXN5bmNBcHBlbmRlci5hZGRBcHBlbmRlcih2ZWN0b3JBcHBlbmRlcik7CisgICAgcm9vdC5hZGRBcHBlbmRlcihhc3luY0FwcGVuZGVyKTsgCisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgTEVOOyBpKyspIHsKKyAgICAgIHJvb3QuZGVidWcoIm1lc3NhZ2UiK2kpOworICAgIH0KKyAgICAKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgbG9vcC4iKTsKKyAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7CisgICAgYXN5bmNBcHBlbmRlci5jbG9zZSgpOworICAgIHJvb3QuZGVidWcoIm0yIik7CisgICAgCisgICAgVmVjdG9yIHYgPSB2ZWN0b3JBcHBlbmRlci5nZXRWZWN0b3IoKTsKKyAgICBhc3NlcnRFcXVhbHModi5zaXplKCksIExFTik7CisgICAgYXNzZXJ0VHJ1ZSh2ZWN0b3JBcHBlbmRlci5pc0Nsb3NlZCgpKTsKKyAgfQorCisKICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewogICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBBc3luY0FwcGVuZGVyVGVzdENhc2UoImNsb3NlVGVzdCIpKTsKKyAgICBzdWl0ZS5hZGRUZXN0KG5ldyBBc3luY0FwcGVuZGVyVGVzdENhc2UoInRlc3QyIikpOworICAgIHN1aXRlLmFkZFRlc3QobmV3IEFzeW5jQXBwZW5kZXJUZXN0Q2FzZSgidGVzdDMiKSk7CiAgICAgcmV0dXJuIHN1aXRlOwogICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyVGVzdENhc2UuamF2YSBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovTG9nZ2VyVGVzdENhc2UuamF2YQppbmRleCBkNWY0Mjc0Li42ZmZhZjRmIDEwMDY0NAotLS0gYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL0xvZ2dlclRlc3RDYXNlLmphdmEKKysrIGIvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9Mb2dnZXJUZXN0Q2FzZS5qYXZhCkBAIC03Myw4ICs3Myw4IEBACiAgICAgYTEuc2V0TmFtZSgidGVzdEFwcGVuZGVyMSIpOyAgICAgICAgICAgICAKICAgICBsb2dnZXIuYWRkQXBwZW5kZXIoYTEpOwogCi0gICAgRW51bWVyYXRpb24gZW51bSA9IGxvZ2dlci5nZXRBbGxBcHBlbmRlcnMoKTsKLSAgICBBcHBlbmRlciBhSGF0ID0gKEFwcGVuZGVyKSBlbnVtLm5leHRFbGVtZW50KCk7ICAgIAorICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gbG9nZ2VyLmdldEFsbEFwcGVuZGVycygpOworICAgIEFwcGVuZGVyIGFIYXQgPSAoQXBwZW5kZXIpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7ICAgIAogICAgIGFzc2VydEVxdWFscyhhMSwgYUhhdCk7ICAgIAogICB9CiAKQEAgLTkzLDEwICs5MywxMCBAQAogICAgIGxvZ2dlci5hZGRBcHBlbmRlcihhMSk7CiAgICAgbG9nZ2VyLmFkZEFwcGVuZGVyKGEyKTsgICAgCiAgICAgbG9nZ2VyLnJlbW92ZUFwcGVuZGVyKCJ0ZXN0QXBwZW5kZXIyLjEiKTsKLSAgICBFbnVtZXJhdGlvbiBlbnVtID0gbG9nZ2VyLmdldEFsbEFwcGVuZGVycygpOwotICAgIEFwcGVuZGVyIGFIYXQgPSAoQXBwZW5kZXIpIGVudW0ubmV4dEVsZW1lbnQoKTsgICAgCisgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBsb2dnZXIuZ2V0QWxsQXBwZW5kZXJzKCk7CisgICAgQXBwZW5kZXIgYUhhdCA9IChBcHBlbmRlcikgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsgICAgCiAgICAgYXNzZXJ0RXF1YWxzKGEyLCBhSGF0KTsKLSAgICBhc3NlcnRUcnVlKCFlbnVtLmhhc01vcmVFbGVtZW50cygpKTsKKyAgICBhc3NlcnRUcnVlKCFlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSk7CiAgIH0KIAogICAvKioKQEAgLTIwNCw3ICsyMDQsNyBAQAogICAgIExvZ2dlciByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsgICAgCiAgICAgcm9vdC5hZGRBcHBlbmRlcihjYVJvb3QpOwogCi0gICAgTG9nZ2VyUmVwb3NpdG9yeSBoID0gQ2F0ZWdvcnkuZ2V0RGVmYXVsdEhpZXJhcmNoeSgpOworICAgIExvZ2dlclJlcG9zaXRvcnkgaCA9IExvZ01hbmFnZXIuZ2V0TG9nZ2VyUmVwb3NpdG9yeSgpOwogICAgIC8vaC5kaXNhYmxlRGVidWcoKTsKICAgICBoLnNldFRocmVzaG9sZCgoTGV2ZWwpIExldmVsLklORk8pOwogICAgIGFzc2VydEVxdWFscyhjYVJvb3QuY291bnRlciwgMCk7ICAgICAKQEAgLTMwOSw3ICszMDksNyBAQAogCiAgIHB1YmxpYwogICB2b2lkIHRlc3RIaWVyYXJjaHkxKCkgewotICAgIEhpZXJhcmNoeSBoID0gbmV3IEhpZXJhcmNoeShuZXcgUm9vdENhdGVnb3J5KChMZXZlbCkgTGV2ZWwuRVJST1IpKTsKKyAgICBIaWVyYXJjaHkgaCA9IG5ldyBIaWVyYXJjaHkobmV3IFJvb3RMb2dnZXIoKExldmVsKSBMZXZlbC5FUlJPUikpOwogICAgIExvZ2dlciBhMCA9IGguZ2V0TG9nZ2VyKCJhIik7CiAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYTAuZ2V0TmFtZSgpKTsKICAgICBhc3NlcnROdWxsKGEwLmdldExldmVsKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9NeVBhdHRlcm5MYXlvdXQuamF2YSBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovTXlQYXR0ZXJuTGF5b3V0LmphdmEKaW5kZXggYWU4YjkwMy4uYzRjZDkyNiAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9NeVBhdHRlcm5MYXlvdXQuamF2YQorKysgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL015UGF0dGVybkxheW91dC5qYXZhCkBAIC00NCw5ICs0NCw5IEBACiAgIHB1YmxpYwogICBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICBMYXlvdXQgbGF5b3V0ID0gbmV3IE15UGF0dGVybkxheW91dCgiW2NvdW50ZXI9JS4xMCNdIC0gJW0lbiIpOwotICAgIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKCJzb21lLmNhdCIpOwotICAgIGNhdC5hZGRBcHBlbmRlcihuZXcgQ29uc29sZUFwcGVuZGVyKGxheW91dCwgQ29uc29sZUFwcGVuZGVyLlNZU1RFTV9PVVQpKTsKLSAgICBjYXQuZGVidWcoIkhlbGxvLCBsb2ciKTsKLSAgICBjYXQuaW5mbygiSGVsbG8gYWdhaW4uLi4iKTsgICAgCisgICAgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoInNvbWUuY2F0Iik7CisgICAgbG9nZ2VyLmFkZEFwcGVuZGVyKG5ldyBDb25zb2xlQXBwZW5kZXIobGF5b3V0LCBDb25zb2xlQXBwZW5kZXIuU1lTVEVNX09VVCkpOworICAgIGxvZ2dlci5kZWJ1ZygiSGVsbG8sIGxvZyIpOworICAgIGxvZ2dlci5pbmZvKCJIZWxsbyBhZ2Fpbi4uLiIpOyAgICAKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9TdHJlc3NDYXRlZ29yeS5qYXZhIGIvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9TdHJlc3NDYXRlZ29yeS5qYXZhCmluZGV4IGRiY2UwYTAuLjA1YTYzODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovU3RyZXNzQ2F0ZWdvcnkuamF2YQorKysgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL1N0cmVzc0NhdGVnb3J5LmphdmEKQEAgLTksMTEgKzksMTEgQEAKIAogCiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNhdGVnb3J5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKIC8qCi0gIFN0cmVzcyB0ZXN0IHRoZSBDYXRlZ29yeSBjbGFzcy4KKyAgU3RyZXNzIHRlc3QgdGhlIExvZ2dlciBjbGFzcy4KIAogKi8KIApAQCAtMjUsMTEgKzI1LDExIEBACiAJCQkJICAgICAgTGV2ZWwuRVJST1IsCiAJCQkJICAgICAgTGV2ZWwuRkFUQUx9OwogCi0gIHN0YXRpYyBMZXZlbCBkZWZhdWx0TGV2ZWwgPSBDYXRlZ29yeS5nZXRSb290KCkuZ2V0TGV2ZWwoKTsKKyAgc3RhdGljIExldmVsIGRlZmF1bHRMZXZlbCA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCkuZ2V0TGV2ZWwoKTsKICAgCiAgIHN0YXRpYyBpbnQgTEVOR1RIOwogICBzdGF0aWMgU3RyaW5nW10gbmFtZXM7Ci0gIHN0YXRpYyBDYXRlZ29yeVtdIGNhdDsKKyAgc3RhdGljIExvZ2dlcltdIGNhdDsKICAgc3RhdGljIENUW10gY3Q7CiAKICAgc3RhdGljIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKDEwKTsKQEAgLTUzLDcgKzUzLDcgQEAKICAgICBmb3IoaW50IGk9MDsgaSA8IExFTkdUSDsgaSsrKSB7CiAgICAgICBuYW1lc1tpXSA9IGFyZ3NbaV07CiAgICAgfSAgICAKLSAgICBjYXQgPSBuZXcgQ2F0ZWdvcnlbTEVOR1RIXTsKKyAgICBjYXQgPSBuZXcgTG9nZ2VyW0xFTkdUSF07CiAgICAgY3QgPSBuZXcgQ1RbTEVOR1RIXTsgCiAKIApAQCAtMTA1LDcgKzEwNSw3IEBACiAJaWYoY3RbaV0gPT0gbnVsbCkKIAkgIGNhdFtpXSA9IG51bGw7CiAJZWxzZSB7Ci0JICBjYXRbaV0gPSBDYXRlZ29yeS5nZXRJbnN0YW5jZShjdFtpXS5jYXRzdHIpOworCSAgY2F0W2ldID0gTG9nZ2VyLmdldExvZ2dlcihjdFtpXS5jYXRzdHIpOwogCSAgY2F0W2ldLnNldExldmVsKGN0W2ldLmxldmVsKTsKIAl9CiAgICAgICB9CkBAIC0xODMsNyArMTgzLDcgQEAKICAgYm9vbGVhbiBjaGVja0NvcnJlY3RuZXNzKGludCBpKSB7CiAgICAgQ1QgbG9jYWxDVCA9IGN0W2ldOwogCi0gICAgLy8gQ2FuJ3QgcGVyZm9ybSB0ZXN0IGlmIGNhdGVnb3J5IGlzIG5vdCBpbnN0YW50aWF0ZWQKKyAgICAvLyBDYW4ndCBwZXJmb3JtIHRlc3QgaWYgbG9nZ2VyIGlzIG5vdCBpbnN0YW50aWF0ZWQKICAgICBpZihsb2NhbENUID09IG51bGwpIAogICAgICAgcmV0dXJuIHRydWU7CiAgICAgCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL1ZlY3RvckFwcGVuZGVyLmphdmEgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL1ZlY3RvckFwcGVuZGVyLmphdmEKaW5kZXggNjYyMWJjNy4uMTQ2YjhjZiAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9WZWN0b3JBcHBlbmRlci5qYXZhCisrKyBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovVmVjdG9yQXBwZW5kZXIuamF2YQpAQCAtMjQsMTYgKzI0LDE0IEBACiAKICAgcHVibGljIFZlY3RvciB2ZWN0b3I7CiAgIAotICBwdWJsaWMKLSAgVmVjdG9yQXBwZW5kZXIoKSB7CisgIHB1YmxpYyBWZWN0b3JBcHBlbmRlcigpIHsKICAgICB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7CiAgIH0KIAogICAvKioKICAgICAgRG9lcyBub3RoaW5nLgogICAqLwotICBwdWJsaWMKLSAgdm9pZCBhY3RpdmF0ZU9wdGlvbnMoKSB7CisgIHB1YmxpYyB2b2lkIGFjdGl2YXRlT3B0aW9ucygpIHsKICAgfQogCiAKQEAgLTQyLDI4ICs0MCwzMiBAQAogICAgICBtZXRob2QuCiAKICAgKi8KLSAgcHVibGljCi0gIHZvaWQgYXBwZW5kKExvZ2dpbmdFdmVudCBldmVudCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tVmVjdG9yIGFwcGVuZGVyIGNhbGxlZCB3aXRoIG1lc3NhZ2UgWyIrZXZlbnQuZ2V0UmVuZGVyZWRNZXNzYWdlKCkrIl0uIik7CisgIHB1YmxpYyB2b2lkIGFwcGVuZChMb2dnaW5nRXZlbnQgZXZlbnQpIHsKKyAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tVmVjdG9yIGFwcGVuZGVyIGNhbGxlZCB3aXRoIG1lc3NhZ2UgWyIrZXZlbnQuZ2V0UmVuZGVyZWRNZXNzYWdlKCkrIl0uIik7CisgICAgLy9TeXN0ZW0ub3V0LmZsdXNoKCk7CisgICAgdHJ5IHsKKyAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMTAwKTsKKyAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgfQogICAgIHZlY3Rvci5hZGRFbGVtZW50KGV2ZW50KTsKICAgIH0KIAotICBwdWJsaWMKLSAgVmVjdG9yIGdldFZlY3RvcigpIHsKKyAgcHVibGljIFZlY3RvciBnZXRWZWN0b3IoKSB7CiAgICAgcmV0dXJuIHZlY3RvcjsKICAgfQogCi0gIHB1YmxpYwotICBzeW5jaHJvbml6ZWQKLSAgdm9pZCBjbG9zZSgpIHsKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgewogICAgIGlmKHRoaXMuY2xvc2VkKQogICAgICAgcmV0dXJuOwogICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgfQogCiAKLSAgcHVibGljCi0gIGJvb2xlYW4gcmVxdWlyZXNMYXlvdXQoKSB7CisgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgIHJldHVybiBjbG9zZWQ7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0xheW91dCgpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovZGVmYXVsdEluaXQvVGVzdENhc2UxLmphdmEgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2RlZmF1bHRJbml0L1Rlc3RDYXNlMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjg3NjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2RlZmF1bHRJbml0L1Rlc3RDYXNlMS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQorICogTGljZW5zZSB2ZXJzaW9uIDEuMSwgYSBjb3B5IG9mIHdoaWNoIGhhcyBiZWVuIGluY2x1ZGVkIHdpdGggdGhpcworICogZGlzdHJpYnV0aW9uIGluIHRoZSBMSUNFTlNFLnR4dCBmaWxlLiAgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLmRlZmF1bHRJbml0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai4qOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2UuTnVsbEFwcGVuZGVyOworCitwdWJsaWMgY2xhc3MgVGVzdENhc2UxIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyBUZXN0Q2FzZTEoU3RyaW5nIG5hbWUpIHsKKyAgICBzdXBlcihuYW1lKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICB9CisKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgTG9nTWFuYWdlci5zaHV0ZG93bigpOworICB9CisKKyAgcHVibGljIHZvaWQgbm9uZVRlc3QoKSB7CisgICAgTG9nZ2VyIHJvb3QgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOworICAgIGJvb2xlYW4gcm9vdElzQ29uZmlndXJlZCA9IHJvb3QuZ2V0QWxsQXBwZW5kZXJzKCkuaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgYXNzZXJ0VHJ1ZSghcm9vdElzQ29uZmlndXJlZCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RDYXNlMSgibm9uZVRlc3QiKSk7CisgICAgcmV0dXJuIHN1aXRlOworICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9kZWZhdWx0SW5pdC9UZXN0Q2FzZTIuamF2YSBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovZGVmYXVsdEluaXQvVGVzdENhc2UyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlZDY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovZGVmYXVsdEluaXQvVGVzdENhc2UyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCisgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGouZGVmYXVsdEluaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai4qOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2UuTnVsbEFwcGVuZGVyOworCitwdWJsaWMgY2xhc3MgVGVzdENhc2UyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyBUZXN0Q2FzZTIoU3RyaW5nIG5hbWUpIHsKKyAgICBzdXBlcihuYW1lKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICB9CisKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgTG9nTWFuYWdlci5zaHV0ZG93bigpOworICB9CisKKyAgcHVibGljIHZvaWQgeG1sVGVzdCgpIHsKKyAgICBMb2dnZXIgcm9vdCA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCk7CisgICAgYm9vbGVhbiByb290SXNDb25maWd1cmVkID0gcm9vdC5nZXRBbGxBcHBlbmRlcnMoKS5oYXNNb3JlRWxlbWVudHMoKTsKKyAgICBhc3NlcnRUcnVlKHJvb3RJc0NvbmZpZ3VyZWQpOworICAgIEVudW1lcmF0aW9uIGUgPSByb290LmdldEFsbEFwcGVuZGVycygpOworICAgIEFwcGVuZGVyIGFwcGVuZGVyID0gKEFwcGVuZGVyKSBlLm5leHRFbGVtZW50KCk7CisgICAgYXNzZXJ0RXF1YWxzKGFwcGVuZGVyLmdldE5hbWUoKSwgIkQxIik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RDYXNlMigieG1sVGVzdCIpKTsKKyAgICByZXR1cm4gc3VpdGU7CisgIH0KKworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2RlZmF1bHRJbml0L1Rlc3RDYXNlMy5qYXZhIGIvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9kZWZhdWx0SW5pdC9UZXN0Q2FzZTMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFhZjZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9kZWZhdWx0SW5pdC9UZXN0Q2FzZTMuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai5kZWZhdWx0SW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLio7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5wZXJmb3JtYW5jZS5OdWxsQXBwZW5kZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0Q2FzZTMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIFRlc3RDYXNlMyhTdHJpbmcgbmFtZSkgeworICAgIHN1cGVyKG5hbWUpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICBMb2dNYW5hZ2VyLnNodXRkb3duKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwcm9wZXJ0aWVzVGVzdCgpIHsKKyAgICBMb2dnZXIgcm9vdCA9IExvZ2dlci5nZXRSb290TG9nZ2VyKCk7CisgICAgYm9vbGVhbiByb290SXNDb25maWd1cmVkID0gcm9vdC5nZXRBbGxBcHBlbmRlcnMoKS5oYXNNb3JlRWxlbWVudHMoKTsKKyAgICBhc3NlcnRUcnVlKHJvb3RJc0NvbmZpZ3VyZWQpOworICAgIEVudW1lcmF0aW9uIGUgPSByb290LmdldEFsbEFwcGVuZGVycygpOworICAgIEFwcGVuZGVyIGFwcGVuZGVyID0gKEFwcGVuZGVyKSBlLm5leHRFbGVtZW50KCk7CisgICAgYXNzZXJ0RXF1YWxzKGFwcGVuZGVyLmdldE5hbWUoKSwgIkQzIik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RDYXNlMygicHJvcGVydGllc1Rlc3QiKSk7CisgICAgcmV0dXJuIHN1aXRlOworICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9kZWZhdWx0SW5pdC9UZXN0Q2FzZTQuamF2YSBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovZGVmYXVsdEluaXQvVGVzdENhc2U0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxMjZkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovZGVmYXVsdEluaXQvVGVzdENhc2U0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCisgKiBMaWNlbnNlIHZlcnNpb24gMS4xLCBhIGNvcHkgb2Ygd2hpY2ggaGFzIGJlZW4gaW5jbHVkZWQgd2l0aCB0aGlzCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIExJQ0VOU0UudHh0IGZpbGUuICAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGouZGVmYXVsdEluaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai4qOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoucGVyZm9ybWFuY2UuTnVsbEFwcGVuZGVyOworCitwdWJsaWMgY2xhc3MgVGVzdENhc2U0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyBUZXN0Q2FzZTQoU3RyaW5nIG5hbWUpIHsKKyAgICBzdXBlcihuYW1lKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICB9CisKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgTG9nTWFuYWdlci5zaHV0ZG93bigpOworICB9CisKKyAgcHVibGljIHZvaWQgY29tYmluZWRUZXN0KCkgeworICAgIExvZ2dlciByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsKKyAgICBib29sZWFuIHJvb3RJc0NvbmZpZ3VyZWQgPSByb290LmdldEFsbEFwcGVuZGVycygpLmhhc01vcmVFbGVtZW50cygpOworICAgIGFzc2VydFRydWUocm9vdElzQ29uZmlndXJlZCk7CisgICAgRW51bWVyYXRpb24gZSA9IHJvb3QuZ2V0QWxsQXBwZW5kZXJzKCk7CisgICAgQXBwZW5kZXIgYXBwZW5kZXIgPSAoQXBwZW5kZXIpIGUubmV4dEVsZW1lbnQoKTsKKyAgICBhc3NlcnRFcXVhbHMoYXBwZW5kZXIuZ2V0TmFtZSgpLCAiRDEiKTsKKyAgICBhc3NlcnRFcXVhbHMoZS5oYXNNb3JlRWxlbWVudHMoKSwgZmFsc2UpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKyAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0Q2FzZTQoImNvbWJpbmVkVGVzdCIpKTsKKyAgICByZXR1cm4gc3VpdGU7CisgIH0KKworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvQm91bmRlZEZJRk9UZXN0Q2FzZS5qYXZhIGIvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL0JvdW5kZWRGSUZPVGVzdENhc2UuamF2YQppbmRleCAyYmFhNjcyLi42NGEwNDQwIDEwMDY0NAotLS0gYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvQm91bmRlZEZJRk9UZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9Cb3VuZGVkRklGT1Rlc3RDYXNlLmphdmEKQEAgLTE1LDggKzE1LDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuTG9nZ2luZ0V2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcmlvcml0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLkJvdW5kZWRGSUZPOwogCkBAIC0zMyw3ICszMyw3IEBACiAgICBAYXV0aG9yIENla2kgRyZ1dW1sO2xjJnV1bWw7CiAgICBAc2luY2UgMC45LjEgKi8KIHB1YmxpYyBjbGFzcyBCb3VuZGVkRklGT1Rlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotICBzdGF0aWMgQ2F0ZWdvcnkgY2F0ID0gQ2F0ZWdvcnkuZ2V0SW5zdGFuY2UoIngiKTsKKyAgc3RhdGljIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJ4Iik7CiAKICAgc3RhdGljIGludCBNQVggPSAxMDAwOyAgCiAKQEAgLTQxLDcgKzQxLDcgQEAKIAogICB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVg7IGkrKykgewotICAgICAgZVtpXSA9ICBuZXcgTG9nZ2luZ0V2ZW50KCIiLCBjYXQsIFByaW9yaXR5LkRFQlVHLCAiZSIraSwgbnVsbCk7CisgICAgICBlW2ldID0gIG5ldyBMb2dnaW5nRXZlbnQoIiIsIGNhdCwgTGV2ZWwuREVCVUcsICJlIitpLCBudWxsKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL0N5Y2xpY0J1ZmZlclRlc3RDYXNlLmphdmEgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvQ3ljbGljQnVmZmVyVGVzdENhc2UuamF2YQppbmRleCAyMjFlODZmLi43NmNhYTU3IDEwMDY0NAotLS0gYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvQ3ljbGljQnVmZmVyVGVzdENhc2UuamF2YQorKysgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL2hlbHBlcnMvQ3ljbGljQnVmZmVyVGVzdENhc2UuamF2YQpAQCAtMTUsOCArMTUsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnNwaS5Mb2dnaW5nRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTGV2ZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLkN5Y2xpY0J1ZmZlcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTMyLDcgKzMyLDcgQEAKICovCiBwdWJsaWMgY2xhc3MgQ3ljbGljQnVmZmVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKLSAgc3RhdGljIENhdGVnb3J5IGNhdCA9IENhdGVnb3J5LmdldEluc3RhbmNlKCJ4Iik7CisgIHN0YXRpYyBMb2dnZXIgY2F0ID0gTG9nZ2VyLmdldExvZ2dlcigieCIpOwogCiAgIHN0YXRpYyBpbnQgTUFYID0gMTAwMDsKICAgCkBAIC00MCw3ICs0MCw3IEBACiAKICAgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYOyBpKyspIHsKLSAgICAgIGVbaV0gPSAgbmV3IExvZ2dpbmdFdmVudCgiIiwgY2F0LCBQcmlvcml0eS5ERUJVRywgImUiK2ksIG51bGwpOworICAgICAgZVtpXSA9ICBuZXcgTG9nZ2luZ0V2ZW50KCIiLCBjYXQsIExldmVsLkRFQlVHLCAiZSIraSwgbnVsbCk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9QYXR0ZXJuUGFyc2VyVGVzdENhc2UuamF2YSBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovaGVscGVycy9QYXR0ZXJuUGFyc2VyVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGYzMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9oZWxwZXJzL1BhdHRlcm5QYXJzZXJUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAqIExpY2Vuc2UgdmVyc2lvbiAxLjEsIGEgY29weSBvZiB3aGljaCBoYXMgYmVlbiBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgTElDRU5TRS50eHQgZmlsZS4gICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTURDOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai51dGlsLkNvbXBhcmU7CisKKy8qKgorICAgVGVzdCBjYXNlIGZvciBoZWxwZXJzL1BhdHRlcm5QYXJzZXIuamF2YS4gVGVzdHMgdGhlIHZhcmlvdXMgCisgICBjb252ZXJzaW9uIHBhdHRlcm5zIHN1cHBvcnRlZCBieSBQYXR0ZXJuUGFyc2VyLiBUaGlzIHRlc3QKKyAgIGNsYXNzIHRlc3RzIFBhdHRlcm5QYXJzZXIgdmlhIHRoZSBQYXR0ZXJuTGF5b3V0IGNsYXNzIHdoaWNoCisgICB1c2VzIGl0LgorICovCitwdWJsaWMgY2xhc3MgUGF0dGVyblBhcnNlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgeworICAKKyAgc3RhdGljIFN0cmluZyBPVVRQVVRfRklMRSAgID0gIm91dHB1dC9QYXR0ZXJuUGFyc2VyIjsKKyAgc3RhdGljIFN0cmluZyBXSVRORVNTX0ZJTEUgID0gIndpdG5lc3MvUGF0dGVyblBhcnNlciI7CisKKyAgc3RhdGljIFN0cmluZyBtc2dQYXR0ZXJuID0gIiVtJW4iOworICAKKyAgTG9nZ2VyIHJvb3Q7IAorICBMb2dnZXIgbG9nZ2VyOworCisgIHB1YmxpYyBQYXR0ZXJuUGFyc2VyVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKyAgICBzdXBlcihuYW1lKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIHJvb3QgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOworICAgIHJvb3QucmVtb3ZlQWxsQXBwZW5kZXJzKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsgIAorICAgIHJvb3QuZ2V0TG9nZ2VyUmVwb3NpdG9yeSgpLnJlc2V0Q29uZmlndXJhdGlvbigpOworICB9CisKKyAgLyoqCisgICAgVGVzdCBjYXNlIGZvciBNREMgY29udmVyc2lvbiBwYXR0ZXJuLiAqLworICBwdWJsaWMgdm9pZCBtZGNQYXR0ZXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgCisgICAgU3RyaW5nIG1kY01zZ1BhdHRlcm4xID0gIiVtIDogJVglbiI7CisgICAgU3RyaW5nIG1kY01zZ1BhdHRlcm4yID0gIiVtIDogJVh7a2V5MX0lbiI7CisgICAgU3RyaW5nIG1kY01zZ1BhdHRlcm4zID0gIiVtIDogJVh7a2V5Mn0lbiI7CisgICAgU3RyaW5nIG1kY01zZ1BhdHRlcm40ID0gIiVtIDogJVh7a2V5M30lbiI7CisgICAgU3RyaW5nIG1kY01zZ1BhdHRlcm41ID0gIiVtIDogJVh7a2V5MX0sJVh7a2V5Mn0sJVh7a2V5M30lbiI7CisgICAgCisgICAgLy8gc2V0IHVwIGFwcGVuZGVyCisgICAgUGF0dGVybkxheW91dCBsYXlvdXQgPSBuZXcgUGF0dGVybkxheW91dChtc2dQYXR0ZXJuKTsKKyAgICBBcHBlbmRlciBhcHBlbmRlciA9IG5ldyBGaWxlQXBwZW5kZXIobGF5b3V0LCBPVVRQVVRfRklMRSsiX21kYyIsIGZhbHNlKTsKKyAgICAgICAgICAgIAorICAgIC8vIHNldCBhcHBlbmRlciBvbiByb290IGFuZCBzZXQgbGV2ZWwgdG8gZGVidWcKKyAgICByb290LmFkZEFwcGVuZGVyKGFwcGVuZGVyKTsKKyAgICByb290LnNldExldmVsKExldmVsLkRFQlVHKTsKKyAgICAKKyAgICAvLyBvdXRwdXQgc3RhcnRpbmcgbWVzc2FnZQorICAgIHJvb3QuZGVidWcoInN0YXJ0aW5nIG1kYyBwYXR0ZXJuIHRlc3QiKTsKKyAKKyAgICBsYXlvdXQuc2V0Q29udmVyc2lvblBhdHRlcm4obWRjTXNnUGF0dGVybjEpOworICAgIHJvb3QuZGVidWcoImVtcHR5IG1kYywgbm8ga2V5IHNwZWNpZmllZCBpbiBwYXR0ZXJuIik7CisgICAgCisgICAgbGF5b3V0LnNldENvbnZlcnNpb25QYXR0ZXJuKG1kY01zZ1BhdHRlcm4yKTsKKyAgICByb290LmRlYnVnKCJlbXB0eSBtZGMsIGtleTEgaW4gcGF0dGVybiIpOworICAgIAorICAgIGxheW91dC5zZXRDb252ZXJzaW9uUGF0dGVybihtZGNNc2dQYXR0ZXJuMyk7CisgICAgcm9vdC5kZWJ1ZygiZW1wdHkgbWRjLCBrZXkyIGluIHBhdHRlcm4iKTsKKyAgICAKKyAgICBsYXlvdXQuc2V0Q29udmVyc2lvblBhdHRlcm4obWRjTXNnUGF0dGVybjQpOworICAgIHJvb3QuZGVidWcoImVtcHR5IG1kYywga2V5MyBpbiBwYXR0ZXJuIik7CisgICAgCisgICAgbGF5b3V0LnNldENvbnZlcnNpb25QYXR0ZXJuKG1kY01zZ1BhdHRlcm41KTsKKyAgICByb290LmRlYnVnKCJlbXB0eSBtZGMsIGtleTEsIGtleTIsIGFuZCBrZXkzIGluIHBhdHRlcm4iKTsKKworICAgIE1EQy5wdXQoImtleTEiLCAidmFsdWUxIik7CisgICAgTURDLnB1dCgia2V5MiIsICJ2YWx1ZTIiKTsKKworICAgIGxheW91dC5zZXRDb252ZXJzaW9uUGF0dGVybihtZGNNc2dQYXR0ZXJuMSk7CisgICAgcm9vdC5kZWJ1ZygiZmlsbGVkIG1kYywgbm8ga2V5IHNwZWNpZmllZCBpbiBwYXR0ZXJuIik7CisgICAgCisgICAgbGF5b3V0LnNldENvbnZlcnNpb25QYXR0ZXJuKG1kY01zZ1BhdHRlcm4yKTsKKyAgICByb290LmRlYnVnKCJmaWxsZWQgbWRjLCBrZXkxIGluIHBhdHRlcm4iKTsKKyAgICAKKyAgICBsYXlvdXQuc2V0Q29udmVyc2lvblBhdHRlcm4obWRjTXNnUGF0dGVybjMpOworICAgIHJvb3QuZGVidWcoImZpbGxlZCBtZGMsIGtleTIgaW4gcGF0dGVybiIpOworICAgIAorICAgIGxheW91dC5zZXRDb252ZXJzaW9uUGF0dGVybihtZGNNc2dQYXR0ZXJuNCk7CisgICAgcm9vdC5kZWJ1ZygiZmlsbGVkIG1kYywga2V5MyBpbiBwYXR0ZXJuIik7CisgICAgCisgICAgbGF5b3V0LnNldENvbnZlcnNpb25QYXR0ZXJuKG1kY01zZ1BhdHRlcm41KTsKKyAgICByb290LmRlYnVnKCJmaWxsZWQgbWRjLCBrZXkxLCBrZXkyLCBhbmQga2V5MyBpbiBwYXR0ZXJuIik7CisKKyAgICBNREMucmVtb3ZlKCJrZXkxIik7CisgICAgTURDLnJlbW92ZSgia2V5MiIpOworCisgICAgbGF5b3V0LnNldENvbnZlcnNpb25QYXR0ZXJuKG1zZ1BhdHRlcm4pOworICAgIHJvb3QuZGVidWcoImZpbmlzaGVkIG1kYyBwYXR0ZXJuIHRlc3QiKTsKKworICAgIGFzc2VydFRydWUoQ29tcGFyZS5jb21wYXJlKE9VVFBVVF9GSUxFKyJfbWRjIiwgV0lUTkVTU19GSUxFKyJfbWRjIikpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKyAgICBzdWl0ZS5hZGRUZXN0KG5ldyBQYXR0ZXJuUGFyc2VyVGVzdENhc2UoIm1kY1BhdHRlcm4iKSk7CisgICAgcmV0dXJuIHN1aXRlOworICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1Nob3J0U29ja2V0U2VydmVyLmphdmEgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9TaG9ydFNvY2tldFNlcnZlci5qYXZhCmluZGV4IDk5YjhkNWMuLjMzZTBkNTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1Nob3J0U29ja2V0U2VydmVyLmphdmEKKysrIGIvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU2hvcnRTb2NrZXRTZXJ2ZXIuamF2YQpAQCAtMTUsMTUgKzE1LDIxIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJvcGVydHlDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5NREM7CiBpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLkxvZ0xvZzsKIGltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXROb2RlOwogaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldFNlcnZlcjsKIAogLyoqCi0gICBUaGlzIFNvY2tldFNlcnZlciBleGl0cyBhZnRlciBqdXN0IG9uZSBjb25uZWN0aW9uIGZyb20gYSBjbGllbnQuCi0KLSAgIEBhdXRob3IgQ2VraSBHdWxjdQotKi8KKyAqIFRoaXMgU29ja2V0U2VydmVyIGV4aXRzIGFmdGVyIGNlcnRhaW4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGZyb20gYQorICogY2xpZW50LiBUaGlzIG51bWJlciBpcyBkZXRlcm1pbmVkIHRoZSB0b3RhbHNUZXN0IHBhcmFtZXRlciwgdGhhdCBpcworICogdGhlIGZpcnN0IGFyZ3VtZW50IG9uIHRoZSBjb21tbWFuZCBsaW5lLiBUaGUgc2Vjb25kIGFyZ3VtZW50LAorICogcHJlZml4LCBkZXRlcm1pbmVzIHRoZSBwcmVmaXggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0bworICogdXNlLiBFYWNoIHJ1biBvZiB0aGUgc2VydmVyIHdpbGwgdXNlIGEgZGlmZmVyZW50IHByb3BlcnRpZXMKKyAqIGZpbGUuIEZvciB0aGUgaS10aCBydW4sIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGlzCisgKiAocHJlZml4K2krIi5wcm9wZXJ0aWVzIikuCisgKgorICogQGF1dGhvciBDZWtpIEd1bGN1ICovCiAKIHB1YmxpYyBjbGFzcyBTaG9ydFNvY2tldFNlcnZlciAgewogCkBAIC00Niw2ICs1Miw4IEBACiAgICAgICBMb2dMb2cuZGVidWcoIkxpc3RlbmluZyBvbiBwb3J0ICIgKyBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5QT1JUKTsKICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KFNvY2tldFNlcnZlclRlc3RDYXNlLlBPUlQpOwogCisgICAgICBNREMucHV0KCJob3N0SUQiLCAic2hvcnRTb2NrZXRTZXJ2ZXIiKTsKKwogICAgICAgZm9yKGludCBpID0gMTsgaSA8PSB0b3RhbFRlc3RzOyBpKyspIHsKIAlQcm9wZXJ0eUNvbmZpZ3VyYXRvci5jb25maWd1cmUocHJlZml4K2krIi5wcm9wZXJ0aWVzIik7CiAJTG9nTG9nLmRlYnVnKCJXYWl0aW5nIHRvIGFjY2VwdCBhIG5ldyBjbGllbnQuIik7CkBAIC02MSw3ICs2OSw3IEBACiAKICAgCiAgIHN0YXRpYwotICB2b2lkICB1c2FnZShTdHJpbmcgbXNnKSB7CisgIHZvaWQgdXNhZ2UoU3RyaW5nIG1zZykgewogICAgIFN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwogICAgIFN5c3RlbS5lcnIucHJpbnRsbigKICAgICAgICJVc2FnZTogamF2YSAiICtTaG9ydFNvY2tldFNlcnZlci5jbGFzcy5nZXROYW1lKCkgKyAiIHRvdGFsVGVzdHMgY29uZmlnRmlsZVByZWZpeCIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0U2VydmVyVGVzdENhc2UuamF2YSBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovbmV0L1NvY2tldFNlcnZlclRlc3RDYXNlLmphdmEKaW5kZXggMzgxMGFjMi4uZDRjNjdjZiAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai9uZXQvU29ja2V0U2VydmVyVGVzdENhc2UuamF2YQorKysgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL25ldC9Tb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5qYXZhCkBAIC01NSw2ICs1NSwyMCBAQAogICBzdGF0aWMgU3RyaW5nIFBBVDQgPSAiXihERUJVR3wgSU5GT3wgV0FSTnxFUlJPUnxGQVRBTHxMRVRIQUwpIHNvbWUgVDQgTURDLVRFU1Q0IFxcW21haW5dXFwiCiAgICAgICAgICAgICAgICAgICAgICAgICsgIiAocm9vdHxTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSkgLSBNZXNzYWdlIFxcZHsxLDJ9IjsKIAorICBzdGF0aWMgU3RyaW5nIFBBVDUgPSAiXihERUJVR3wgSU5GT3wgV0FSTnxFUlJPUnxGQVRBTHxMRVRIQUwpIHNvbWU1IFQ1IE1EQy1URVNUNSBcXFttYWluXVxcIgorICAgICAgICAgICAgICAgICAgICAgICArICIgKHJvb3R8U29ja2V0U2VydmVyVGVzdENhc2UpIC0gTWVzc2FnZSBcXGR7MSwyfSI7CisKKyAgc3RhdGljIFN0cmluZyBQQVQ2ID0gIl4oREVCVUd8IElORk98IFdBUk58RVJST1J8RkFUQUx8TEVUSEFMKSBzb21lNiBUNiBjbGllbnQtdGVzdDYgTURDLVRFU1Q2IgorICAgICAgICAgICAgICAgICAgICAgICArICIgXFxbbWFpbl1cXCAocm9vdHxTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSkgLSBNZXNzYWdlIFxcZHsxLDJ9IjsKKworICBzdGF0aWMgU3RyaW5nIFBBVDcgPSAiXihERUJVR3wgSU5GT3wgV0FSTnxFUlJPUnxGQVRBTHxMRVRIQUwpIHNvbWU3IFQ3IGNsaWVudC10ZXN0NyBNREMtVEVTVDciCisgICAgICAgICAgICAgICAgICAgICAgICsgIiBcXFttYWluXVxcIChyb290fFNvY2tldFNlcnZlclRlc3RDYXNlKSAtIE1lc3NhZ2UgXFxkezEsMn0iOworCisgIC8vIERFQlVHIHNvbWU4IFQ4IHNob3J0U29ja2V0U2VydmVyIE1EQy1URVNUNyBbbWFpbl0gU29ja2V0U2VydmVyVGVzdENhc2UgLSBNZXNzYWdlIDEKKyAgc3RhdGljIFN0cmluZyBQQVQ4ID0gIl4oREVCVUd8IElORk98IFdBUk58RVJST1J8RkFUQUx8TEVUSEFMKSBzb21lOCBUOCBzaG9ydFNvY2tldFNlcnZlciIKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiIE1EQy1URVNUOCBcXFttYWluXVxcIChyb290fFNvY2tldFNlcnZlclRlc3RDYXNlKSAtIE1lc3NhZ2UgXFxkezEsMn0iOworCisKIAogICBzdGF0aWMgU3RyaW5nIEVYQ0VQVElPTjEgPSAiamF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nIjsKICAgc3RhdGljIFN0cmluZyBFWENFUFRJT04yID0gIlxccyphdCAuKlxcKC4qOlxcZHsxLDR9XFwpIjsKQEAgLTcyLDggKzg2LDYgQEAKIAogICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgdXAgdGVzdCBjYXNlLiIpOwotICAgIHNvY2tldEFwcGVuZGVyID0gbmV3IFNvY2tldEFwcGVuZGVyKCJsb2NhbGhvc3QiLCBQT1JUKTsKLSAgICByb290TG9nZ2VyLmFkZEFwcGVuZGVyKHNvY2tldEFwcGVuZGVyKTsKICAgfQogICAKICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CkBAIC04MSw4ICs5MywxNSBAQAogICAgIHNvY2tldEFwcGVuZGVyID0gbnVsbDsKICAgICByb290TG9nZ2VyLnJlbW92ZUFsbEFwcGVuZGVycygpOwogICB9Ci0gIAorCisgIC8qKgorICAgKiBUaGUgcGF0dGVybiBvbiB0aGUgc2VydmVyIHNpZGU6ICU1cCAleCBbJXRdICVjICVtJW4gICAgIAorICAgKgorICAgKiBXZSBhcmUgdGVzdGluZyBOREMgZnVuY3Rpb25hbGl0eSBhY3Jvc3MgdGhlIHdpcmUuICAKKyAgICovCiAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc29ja2V0QXBwZW5kZXIgPSBuZXcgU29ja2V0QXBwZW5kZXIoImxvY2FsaG9zdCIsIFBPUlQpOworICAgIHJvb3RMb2dnZXIuYWRkQXBwZW5kZXIoc29ja2V0QXBwZW5kZXIpOwogICAgIGNvbW1vbigiVDEiLCAia2V5MSIsICJNREMtVEVTVDEiKTsKICAgICBkZWxheSgxKTsKICAgICBDb250cm9sRmlsdGVyIGNmID0gbmV3IENvbnRyb2xGaWx0ZXIobmV3IFN0cmluZ1tde1BBVDEsIEVYQ0VQVElPTjEsIApAQCAtOTMsNyArMTEyLDE2IEBACiAgICAgYXNzZXJ0VHJ1ZShDb21wYXJlLmNvbXBhcmUoRklMVEVSRUQsICJ3aXRuZXNzL3NvY2tldFNlcnZlci4xIikpOwogICB9CiAKKyAgLyoqCisgICAqIFRoZSBwYXR0ZXJuIG9uIHRoZSBzZXJ2ZXIgc2lkZTogJTVwICV4IFsldF0gJUMgKCVGOiVMKSAlbSVuCisgICAqCisgICAqIFdlIGFyZSB0ZXN0aW5nIE5EQyBhY3Jvc3MgdGhlIHdpcmUuIExvY2FsaXphdGlvbiBpcyB0dXJuZWQgb2ZmIGJ5CisgICAqIGRlZmF1bHQgc28gaXQgaXMgbm90IHRlc3RlZCBoZXJlIGV2ZW4gaWYgdGhlIGNvbnZlcnNpb24gcGF0dGVybgorICAgKiB1c2VzIGxvY2FsaXphdGlvbi4gKi8KICAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzb2NrZXRBcHBlbmRlciA9IG5ldyBTb2NrZXRBcHBlbmRlcigibG9jYWxob3N0IiwgUE9SVCk7CisgICAgcm9vdExvZ2dlci5hZGRBcHBlbmRlcihzb2NrZXRBcHBlbmRlcik7CisKICAgICBjb21tb24oIlQyIiwgImtleTIiLCAiTURDLVRFU1QyIik7CiAgICAgZGVsYXkoMSk7CiAgICAgQ29udHJvbEZpbHRlciBjZiA9IG5ldyBDb250cm9sRmlsdGVyKG5ldyBTdHJpbmdbXXtQQVQyLCBFWENFUFRJT04xLCAKQEAgLTEwNCw4ICsxMzIsMTUgQEAKICAgICBhc3NlcnRUcnVlKENvbXBhcmUuY29tcGFyZShGSUxURVJFRCwgIndpdG5lc3Mvc29ja2V0U2VydmVyLjIiKSk7CiAgIH0KIAorICAvKioKKyAgICogIFRoZSBwYXR0ZXJuIG9uIHRoZSBzZXJ2ZXIgc2lkZTogJTVwICV4IFsldF0gJUMgKCVGOiVMKSAlbSVuCisgICAqICBtZWFuaW5nIHRoYXQgd2UgYXJlIHRlc3RpbmcgTkRDIGFuZCBsb2NhdGl6YXRpb24gZnVuY3Rpb25hbGl0eQorICAgKiAgYWNyb3NzIHRoZSB3aXJlLiAgKi8KICAgcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzb2NrZXRBcHBlbmRlciA9IG5ldyBTb2NrZXRBcHBlbmRlcigibG9jYWxob3N0IiwgUE9SVCk7CiAgICAgc29ja2V0QXBwZW5kZXIuc2V0TG9jYXRpb25JbmZvKHRydWUpOworICAgIHJvb3RMb2dnZXIuYWRkQXBwZW5kZXIoc29ja2V0QXBwZW5kZXIpOworCiAgICAgY29tbW9uKCJUMyIsICJrZXkzIiwgIk1EQy1URVNUMyIpOwogICAgIGRlbGF5KDEpOwogICAgIENvbnRyb2xGaWx0ZXIgY2YgPSBuZXcgQ29udHJvbEZpbHRlcihuZXcgU3RyaW5nW117UEFUMywgRVhDRVBUSU9OMSwgCkBAIC0xMTYsMTAgKzE1MSwxOSBAQAogICAgIGFzc2VydFRydWUoQ29tcGFyZS5jb21wYXJlKEZJTFRFUkVELCAid2l0bmVzcy9zb2NrZXRTZXJ2ZXIuMyIpKTsKICAgfQogCisgIC8qKgorICAgKiAgVGhlIHBhdHRlcm4gb24gdGhlIHNlcnZlciBzaWRlOiAlNXAgJXggJVh7a2V5MX0lWHtrZXk0fSBbJXRdICVjezF9IC0gJW0lbiAKKyAgICogIG1lYW5pbmcgdGhhdCB3ZSBhcmUgdGVzdGluZyBOREMsIE1EQyBhbmQgbG9jYWxpemF0aW9uIGZ1bmN0aW9uYWxpdHkgYWNyb3NzIAorICAgKiAgdGhlIHdpcmUuICAKKyAgKi8KICAgcHVibGljIHZvaWQgdGVzdDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzb2NrZXRBcHBlbmRlciA9IG5ldyBTb2NrZXRBcHBlbmRlcigibG9jYWxob3N0IiwgUE9SVCk7CiAgICAgc29ja2V0QXBwZW5kZXIuc2V0TG9jYXRpb25JbmZvKHRydWUpOworICAgIHJvb3RMb2dnZXIuYWRkQXBwZW5kZXIoc29ja2V0QXBwZW5kZXIpOworCiAgICAgTkRDLnB1c2goInNvbWUiKTsKICAgICBjb21tb24oIlQ0IiwgImtleTQiLCAiTURDLVRFU1Q0Iik7CisgICAgTkRDLnBvcCgpOwogICAgIGRlbGF5KDEpOwogICAgIENvbnRyb2xGaWx0ZXIgY2YgPSBuZXcgQ29udHJvbEZpbHRlcihuZXcgU3RyaW5nW117UEFUNCwgRVhDRVBUSU9OMSwgCiAJCQkJCQkgICAgICAgRVhDRVBUSU9OMiwgRVhDRVBUSU9OM30pOwpAQCAtMTI5LDYgKzE3MywxMTAgQEAKICAgICBhc3NlcnRUcnVlKENvbXBhcmUuY29tcGFyZShGSUxURVJFRCwgIndpdG5lc3Mvc29ja2V0U2VydmVyLjQiKSk7CiAgIH0KIAorICAvKioKKyAgICogVGhlIHBhdHRlcm4gb24gdGhlIHNlcnZlciBzaWRlOiAlNXAgJXggJVh7a2V5MX0lWHtrZXk1fSBbJXRdICVjezF9IC0gJW0lbiAKKyAgICoKKyAgICogVGhlIHRlc3QgY2FzZSB1c2VzIHdyYXBzIGFuIEFzeW5jQXBwZW5kZXIgYXJvdW5kIHRoZQorICAgKiBTb2NrZXRBcHBlbmRlci4gVGhpcyB0ZXN0cyB3YXMgd3JpdHRlbiBzcGVjaWZpY2FsbHkgZm9yIGJ1ZworICAgKiByZXBvcnQgIzkxNTUuCisKKyAgICogUHJpb3IgdG8gdGhlIGJ1ZyBmaXggdGhlIG91dHB1dCBvbiB0aGUgc2VydmVyIGRpZCBub3QgY29udGFpbiB0aGUKKyAgICogTURDLVRFU1Q1IHN0cmluZyBiZWNhdXNlIHRoZSBNREMgY2xvbmUgb3BlcmF0aW9uIChpbiBnZXRNRENDb3B5CisgICAqIG1ldGhvZCkgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCB0d2ljZSwgb25jZSBmcm9tIHRoZSBtYWluIHRocmVhZAorICAgKiB3aGljaCBpcyBjb3JyZWN0LCBhbmQgYSBzZWNvbmQgdGltZSBmcm9tIHRoZSBBc3luY0FwcGVuZGVyJ3MKKyAgICogZGlzcGF0Y2ggdGhyZWFkIHdoaWNoIGlzIGluY3JvcnJlY3QuCisKKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc29ja2V0QXBwZW5kZXIgPSBuZXcgU29ja2V0QXBwZW5kZXIoImxvY2FsaG9zdCIsIFBPUlQpOworICAgIHNvY2tldEFwcGVuZGVyLnNldExvY2F0aW9uSW5mbyh0cnVlKTsKKyAgICBBc3luY0FwcGVuZGVyIGFzeW5jQXBwZW5kZXIgPSBuZXcgQXN5bmNBcHBlbmRlcigpOworICAgIGFzeW5jQXBwZW5kZXIuc2V0TG9jYXRpb25JbmZvKHRydWUpOworICAgIGFzeW5jQXBwZW5kZXIuYWRkQXBwZW5kZXIoc29ja2V0QXBwZW5kZXIpOworICAgIHJvb3RMb2dnZXIuYWRkQXBwZW5kZXIoYXN5bmNBcHBlbmRlcik7CisKKyAgICBOREMucHVzaCgic29tZTUiKTsKKyAgICBjb21tb24oIlQ1IiwgImtleTUiLCAiTURDLVRFU1Q1Iik7CisgICAgTkRDLnBvcCgpOworICAgIGRlbGF5KDIpOworICAgIENvbnRyb2xGaWx0ZXIgY2YgPSBuZXcgQ29udHJvbEZpbHRlcihuZXcgU3RyaW5nW117UEFUNSwgRVhDRVBUSU9OMSwgCisJCQkJCQkgICAgICAgRVhDRVBUSU9OMiwgRVhDRVBUSU9OM30pOworICAgIAorICAgIFRyYW5zZm9ybWVyLnRyYW5zZm9ybShURU1QLCBGSUxURVJFRCwgbmV3IEZpbHRlcltdIHtjZiwgbmV3IExpbmVOdW1iZXJGaWx0ZXIoKX0pOworICAgIGFzc2VydFRydWUoQ29tcGFyZS5jb21wYXJlKEZJTFRFUkVELCAid2l0bmVzcy9zb2NrZXRTZXJ2ZXIuNSIpKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgcGF0dGVybiBvbiB0aGUgc2VydmVyIHNpZGU6ICU1cCAleCAlWHtob3N0SUR9JHtrZXk2fSBbJXRdICVjezF9IC0gJW0lbiAKKyAgICoKKyAgICogVGhpcyB0ZXN0IGNoZWNrcyB3aGV0aGVyIGNsaWVudC1zaWRlIE1EQyBvdmVycmlkZXMgdGhlIHNlcnZlciBzaWRlLgorICAgKiBJdCB1c2VzIGFuIEFzeW5jQXBwZW5kZXIgZW5jYXBzdWxhdGluZyBhIFNvY2tldEFwcGVuZGVyCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0NigpIHRocm93cyBFeGNlcHRpb24geworICAgIHNvY2tldEFwcGVuZGVyID0gbmV3IFNvY2tldEFwcGVuZGVyKCJsb2NhbGhvc3QiLCBQT1JUKTsKKyAgICBzb2NrZXRBcHBlbmRlci5zZXRMb2NhdGlvbkluZm8odHJ1ZSk7CisgICAgQXN5bmNBcHBlbmRlciBhc3luY0FwcGVuZGVyID0gbmV3IEFzeW5jQXBwZW5kZXIoKTsKKyAgICBhc3luY0FwcGVuZGVyLnNldExvY2F0aW9uSW5mbyh0cnVlKTsKKyAgICBhc3luY0FwcGVuZGVyLmFkZEFwcGVuZGVyKHNvY2tldEFwcGVuZGVyKTsKKyAgICByb290TG9nZ2VyLmFkZEFwcGVuZGVyKGFzeW5jQXBwZW5kZXIpOworCisgICAgTkRDLnB1c2goInNvbWU2Iik7CisgICAgTURDLnB1dCgiaG9zdElEIiwgImNsaWVudC10ZXN0NiIpOworICAgIGNvbW1vbigiVDYiLCAia2V5NiIsICJNREMtVEVTVDYiKTsKKyAgICBOREMucG9wKCk7CisgICAgTURDLnJlbW92ZSgiaG9zdElEIik7CisgICAgZGVsYXkoMik7CisgICAgQ29udHJvbEZpbHRlciBjZiA9IG5ldyBDb250cm9sRmlsdGVyKG5ldyBTdHJpbmdbXXtQQVQ2LCBFWENFUFRJT04xLCAKKwkJCQkJCSAgICAgICBFWENFUFRJT04yLCBFWENFUFRJT04zfSk7CisgICAgCisgICAgVHJhbnNmb3JtZXIudHJhbnNmb3JtKFRFTVAsIEZJTFRFUkVELCBuZXcgRmlsdGVyW10ge2NmLCBuZXcgTGluZU51bWJlckZpbHRlcigpfSk7CisgICAgYXNzZXJ0VHJ1ZShDb21wYXJlLmNvbXBhcmUoRklMVEVSRUQsICJ3aXRuZXNzL3NvY2tldFNlcnZlci42IikpOworICB9CisKKyAgLyoqCisgICAqIFRoZSBwYXR0ZXJuIG9uIHRoZSBzZXJ2ZXIgc2lkZTogJTVwICV4ICVYe2hvc3RJRH0ke2tleTd9IFsldF0gJWN7MX0gLSAlbSVuIAorICAgKgorICAgKiBUaGlzIHRlc3QgY2hlY2tzIHdoZXRoZXIgY2xpZW50LXNpZGUgTURDIG92ZXJyaWRlcyB0aGUgc2VydmVyIHNpZGUuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0NygpIHRocm93cyBFeGNlcHRpb24geworICAgIHNvY2tldEFwcGVuZGVyID0gbmV3IFNvY2tldEFwcGVuZGVyKCJsb2NhbGhvc3QiLCBQT1JUKTsKKyAgICBzb2NrZXRBcHBlbmRlci5zZXRMb2NhdGlvbkluZm8odHJ1ZSk7CisgICAgcm9vdExvZ2dlci5hZGRBcHBlbmRlcihzb2NrZXRBcHBlbmRlcik7CisKKyAgICBOREMucHVzaCgic29tZTciKTsKKyAgICBNREMucHV0KCJob3N0SUQiLCAiY2xpZW50LXRlc3Q3Iik7CisgICAgY29tbW9uKCJUNyIsICJrZXk3IiwgIk1EQy1URVNUNyIpOworICAgIE5EQy5wb3AoKTsKKyAgICBNREMucmVtb3ZlKCJob3N0SUQiKTsgCisgICAgZGVsYXkoMik7CisgICAgQ29udHJvbEZpbHRlciBjZiA9IG5ldyBDb250cm9sRmlsdGVyKG5ldyBTdHJpbmdbXXtQQVQ3LCBFWENFUFRJT04xLCAKKwkJCQkJCSAgICAgICBFWENFUFRJT04yLCBFWENFUFRJT04zfSk7CisgICAgCisgICAgVHJhbnNmb3JtZXIudHJhbnNmb3JtKFRFTVAsIEZJTFRFUkVELCBuZXcgRmlsdGVyW10ge2NmLCBuZXcgTGluZU51bWJlckZpbHRlcigpfSk7CisgICAgYXNzZXJ0VHJ1ZShDb21wYXJlLmNvbXBhcmUoRklMVEVSRUQsICJ3aXRuZXNzL3NvY2tldFNlcnZlci43IikpOworICB9CisKKyAgLyoqCisgICAqIFRoZSBwYXR0ZXJuIG9uIHRoZSBzZXJ2ZXIgc2lkZTogJTVwICV4ICVYe2hvc3RJRH0ke2tleTd9IFsldF0gJWN7MX0gLSAlbSVuIAorICAgKgorICAgKiBUaGlzIHRlc3QgY2hlY2tzIHdoZXRoZXIgc2VydmVyIHNpZGUgTURDIHdvcmtzLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzb2NrZXRBcHBlbmRlciA9IG5ldyBTb2NrZXRBcHBlbmRlcigibG9jYWxob3N0IiwgUE9SVCk7CisgICAgc29ja2V0QXBwZW5kZXIuc2V0TG9jYXRpb25JbmZvKHRydWUpOworICAgIHJvb3RMb2dnZXIuYWRkQXBwZW5kZXIoc29ja2V0QXBwZW5kZXIpOworCisgICAgTkRDLnB1c2goInNvbWU4Iik7CisgICAgY29tbW9uKCJUOCIsICJrZXk4IiwgIk1EQy1URVNUOCIpOworICAgIE5EQy5wb3AoKTsKKyAgICBkZWxheSgyKTsKKyAgICBDb250cm9sRmlsdGVyIGNmID0gbmV3IENvbnRyb2xGaWx0ZXIobmV3IFN0cmluZ1tde1BBVDgsIEVYQ0VQVElPTjEsIAorCQkJCQkJICAgICAgIEVYQ0VQVElPTjIsIEVYQ0VQVElPTjN9KTsKKyAgICAKKyAgICBUcmFuc2Zvcm1lci50cmFuc2Zvcm0oVEVNUCwgRklMVEVSRUQsIG5ldyBGaWx0ZXJbXSB7Y2YsIG5ldyBMaW5lTnVtYmVyRmlsdGVyKCl9KTsKKyAgICBhc3NlcnRUcnVlKENvbXBhcmUuY29tcGFyZShGSUxURVJFRCwgIndpdG5lc3Mvc29ja2V0U2VydmVyLjgiKSk7CisgIH0KKwogICBzdGF0aWMgCiAgIHZvaWQgY29tbW9uKFN0cmluZyBkYywgU3RyaW5nIGtleSwgT2JqZWN0IG8pIHsKICAgICBpbnQgaSA9IC0xOyAKQEAgLTE2MSw2ICszMDksMTAgQEAKICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSgidGVzdDIiKSk7CiAgICAgc3VpdGUuYWRkVGVzdChuZXcgU29ja2V0U2VydmVyVGVzdENhc2UoInRlc3QzIikpOwogICAgIHN1aXRlLmFkZFRlc3QobmV3IFNvY2tldFNlcnZlclRlc3RDYXNlKCJ0ZXN0NCIpKTsKKyAgICBzdWl0ZS5hZGRUZXN0KG5ldyBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSgidGVzdDUiKSk7CisgICAgc3VpdGUuYWRkVGVzdChuZXcgU29ja2V0U2VydmVyVGVzdENhc2UoInRlc3Q2IikpOworICAgIHN1aXRlLmFkZFRlc3QobmV3IFNvY2tldFNlcnZlclRlc3RDYXNlKCJ0ZXN0NyIpKTsKKyAgICBzdWl0ZS5hZGRUZXN0KG5ldyBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSgidGVzdDgiKSk7CiAgICAgcmV0dXJuIHN1aXRlOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL0Vycm9ySGFuZGxlclRlc3RDYXNlLmphdmEgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3ZhcmlhL0Vycm9ySGFuZGxlclRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2NjAyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGovdmFyaWEvRXJyb3JIYW5kbGVyVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorCitwYWNrYWdlIG9yZy5hcGFjaGUubG9nNGoudmFyaWE7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai54bWwuRE9NQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoudXRpbC5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai51dGlsLkxpbmVOdW1iZXJGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai51dGlsLkNvbnRyb2xGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai51dGlsLklTTzg2MDFGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai51dGlsLlRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoudXRpbC5Db21wYXJlOworCitwdWJsaWMgY2xhc3MgRXJyb3JIYW5kbGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgc3RhdGljIFN0cmluZyBURU1QX0ExID0gIm91dHB1dC90ZW1wLkExIjsKKyAgc3RhdGljIFN0cmluZyBURU1QX0EyID0gIm91dHB1dC90ZW1wLkEyIjsKKyAgc3RhdGljIFN0cmluZyBGSUxURVJFRF9BMSA9ICJvdXRwdXQvZmlsdGVyZWQuQTEiOworICBzdGF0aWMgU3RyaW5nIEZJTFRFUkVEX0EyID0gIm91dHB1dC9maWx0ZXJlZC5BMiI7CisKKworICBzdGF0aWMgU3RyaW5nIEVYQ0VQVElPTjEgPSAiamF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nIjsKKyAgc3RhdGljIFN0cmluZyBFWENFUFRJT04yID0gIlxccyphdCAuKlxcKC4qOlxcZHsxLDR9XFwpIjsKKyAgc3RhdGljIFN0cmluZyBFWENFUFRJT04zID0gIlxccyphdCAuKlxcKE5hdGl2ZSBNZXRob2RcXCkiOworCisgIHN0YXRpYyBTdHJpbmcgVEVTVDFfMUFfUEFUID0gCisgICAgICAgICAgICAgICAgICAgICAgICIoREVCVUd8SU5GTyB8V0FSTiB8RVJST1J8RkFUQUwpIFxcdypcXC5cXHcqIC0gTWVzc2FnZSBcXGQiOworCisgIHN0YXRpYyBTdHJpbmcgVEVTVDFfMUJfUEFUID0gIihERUJVR3xJTkZPIHxXQVJOIHxFUlJPUnxGQVRBTCkgcm9vdCAtIE1lc3NhZ2UgXFxkIjsKKworICBzdGF0aWMgU3RyaW5nIFRFU1QxXzJfUEFUID0gIl5cXGR7NH0tXFxkezJ9LVxcZHsyfSBcXGR7Mn06XFxkezJ9OlxcZHsyfSxcXGR7M30gIisKKyAgICAgICAgICAgICAgICAgICAgICAgICJcXFttYWluXVxcIChERUJVR3xJTkZPfFdBUk58RVJST1J8RkFUQUwpIC4qIC0gTWVzc2FnZSBcXGQiOworCisKKworICBMb2dnZXIgcm9vdDsgCisgIExvZ2dlciBsb2dnZXI7CisKKyAgcHVibGljIEVycm9ySGFuZGxlclRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisgICAgc3VwZXIobmFtZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICByb290ID0gTG9nZ2VyLmdldFJvb3RMb2dnZXIoKTsKKyAgICBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJ0ZXN0Iik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsgIAorICAgIHJvb3QuZ2V0TG9nZ2VyUmVwb3NpdG9yeSgpLnJlc2V0Q29uZmlndXJhdGlvbigpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBET01Db25maWd1cmF0b3IuY29uZmlndXJlKCJpbnB1dC94bWwvZmFsbGJhY2sxLnhtbCIpOworICAgIGNvbW1vbigpOworCisgICAgQ29udHJvbEZpbHRlciBjZjEgPSBuZXcgQ29udHJvbEZpbHRlcihuZXcgU3RyaW5nW117VEVTVDFfMUFfUEFULCBURVNUMV8xQl9QQVQsIAorCQkJCQkgICAgICAgRVhDRVBUSU9OMSwgRVhDRVBUSU9OMiwgRVhDRVBUSU9OM30pOworCisgICAgQ29udHJvbEZpbHRlciBjZjIgPSBuZXcgQ29udHJvbEZpbHRlcihuZXcgU3RyaW5nW117VEVTVDFfMl9QQVQsIAorCQkJCQkgICAgICAgRVhDRVBUSU9OMSwgRVhDRVBUSU9OMiwgRVhDRVBUSU9OM30pOworCisgICAgVHJhbnNmb3JtZXIudHJhbnNmb3JtKFRFTVBfQTEsIEZJTFRFUkVEX0ExLCBuZXcgRmlsdGVyW10ge2NmMSwgCisJCQkJCQkJbmV3IExpbmVOdW1iZXJGaWx0ZXIoKX0pOworCisgICAgVHJhbnNmb3JtZXIudHJhbnNmb3JtKFRFTVBfQTIsIEZJTFRFUkVEX0EyLCBuZXcgRmlsdGVyW10ge2NmMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpbmVOdW1iZXJGaWx0ZXIoKSwgbmV3IElTTzg2MDFGaWx0ZXIoKX0pOworCisgICAgYXNzZXJ0VHJ1ZShDb21wYXJlLmNvbXBhcmUoRklMVEVSRURfQTEsICJ3aXRuZXNzL2RvbS5BMS4xIikpOworICAgIGFzc2VydFRydWUoQ29tcGFyZS5jb21wYXJlKEZJTFRFUkVEX0EyLCAid2l0bmVzcy9kb20uQTIuMSIpKTsKKyAgfQorCisgIHZvaWQgY29tbW9uKCkgeworICAgIGludCBpID0gLTE7CisgCisgICAgbG9nZ2VyLmRlYnVnKCJNZXNzYWdlICIgKyArK2kpOworICAgIHJvb3QuZGVidWcoIk1lc3NhZ2UgIiArIGkpOyAgICAgICAgCisKKyAgICBsb2dnZXIuaW5mbyAoIk1lc3NhZ2UgIiArICsraSk7CisgICAgcm9vdC5pbmZvKCJNZXNzYWdlICIgKyBpKTsgICAgICAgIAorCisgICAgbG9nZ2VyLndhcm4gKCJNZXNzYWdlICIgKyArK2kpOworICAgIHJvb3Qud2FybigiTWVzc2FnZSAiICsgaSk7ICAgICAgICAKKworICAgIGxvZ2dlci5lcnJvcigiTWVzc2FnZSAiICsgKytpKTsKKyAgICByb290LmVycm9yKCJNZXNzYWdlICIgKyBpKTsKKyAgICAKKyAgICBsb2dnZXIubG9nKExldmVsLkZBVEFMLCAiTWVzc2FnZSAiICsgKytpKTsKKyAgICByb290LmxvZyhMZXZlbC5GQVRBTCwgIk1lc3NhZ2UgIiArIGkpOyAgICAKKyAgICAKKyAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIkp1c3QgdGVzdGluZyIpOworICAgIGxvZ2dlci5kZWJ1ZygiTWVzc2FnZSAiICsgKytpLCBlKTsKKyAgICByb290LmRlYnVnKCJNZXNzYWdlICIgKyBpLCBlKTsKKyAgICAKKyAgICBsb2dnZXIuZXJyb3IoIk1lc3NhZ2UgIiArICsraSwgZSk7CisgICAgcm9vdC5lcnJvcigiTWVzc2FnZSAiICsgaSwgZSk7ICAgIAorCisgIH0KKworICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworICAgIHN1aXRlLmFkZFRlc3QobmV3IEVycm9ySGFuZGxlclRlc3RDYXNlKCJ0ZXN0MSIpKTsKKyAgICByZXR1cm4gc3VpdGU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvWE1MTGF5b3V0VGVzdENhc2UuamF2YSBiL3Rlc3RzL3NyYy9qYXZhL29yZy9hcGFjaGUvbG9nNGoveG1sL1hNTExheW91dFRlc3RDYXNlLmphdmEKaW5kZXggNDljMjE0ZC4uNGJjZmNkNyAxMDA2NDQKLS0tIGEvdGVzdHMvc3JjL2phdmEvb3JnL2FwYWNoZS9sb2c0ai94bWwvWE1MTGF5b3V0VGVzdENhc2UuamF2YQorKysgYi90ZXN0cy9zcmMvamF2YS9vcmcvYXBhY2hlL2xvZzRqL3htbC9YTUxMYXlvdXRUZXN0Q2FzZS5qYXZhCkBAIC01OCw2ICs1OCwzMSBAQAogICAgIGFzc2VydFRydWUoQ29tcGFyZS5jb21wYXJlKEZJTFRFUkVELCAid2l0bmVzcy94bWxMYXlvdXQuMiIpKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHRlc3RDREFUQSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFhNTExheW91dCB4bWxMYXlvdXQgPSBuZXcgWE1MTGF5b3V0KCk7CisgICAgeG1sTGF5b3V0LnNldExvY2F0aW9uSW5mbyh0cnVlKTsKKyAgICByb290LmFkZEFwcGVuZGVyKG5ldyBGaWxlQXBwZW5kZXIoeG1sTGF5b3V0LCBURU1QLCBmYWxzZSkpOworICAgIAorICAgIGxvZ2dlci5kZWJ1ZygiTWVzc2FnZSB3aXRoIGVtYmVkZGVkIDwhW0NEQVRBWzxoZWxsbz5oaTwvaGVsbG8+XV0+LiIpOworCisgICAgVHJhbnNmb3JtZXIudHJhbnNmb3JtKFRFTVAsIEZJTFRFUkVELCBuZXcgRmlsdGVyW10ge25ldyBMaW5lTnVtYmVyRmlsdGVyKCksCisgICAgCQkJCQkJICBuZXcgWE1MVGltZXN0YW1wRmlsdGVyKCksCisgICAgCQkJCQkJICBuZXcgWE1MTGluZUF0dHJpYnV0ZUZpbHRlcigpfSk7CisgICAgYXNzZXJ0VHJ1ZShDb21wYXJlLmNvbXBhcmUoRklMVEVSRUQsICJ3aXRuZXNzL3htbExheW91dC4zIikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBYTUxMYXlvdXQgeG1sTGF5b3V0ID0gbmV3IFhNTExheW91dCgpOworICAgIHJvb3QuYWRkQXBwZW5kZXIobmV3IEZpbGVBcHBlbmRlcih4bWxMYXlvdXQsIFRFTVAsIGZhbHNlKSk7CisgICAgbG9nZ2VyLmRlYnVnKCJoaSIpOworICAgIGxvZ2dlci5kZWJ1ZyhudWxsKTsKKyAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oKFN0cmluZykgbnVsbCk7CisgICAgbG9nZ2VyLmRlYnVnKCJoaSIsIGUpOworICAgIFRyYW5zZm9ybWVyLnRyYW5zZm9ybShURU1QLCBGSUxURVJFRCwgbmV3IEZpbHRlcltdIHtuZXcgTGluZU51bWJlckZpbHRlcigpLCAKKwkJCQkJCQluZXcgWE1MVGltZXN0YW1wRmlsdGVyKCl9KTsKKyAgICBhc3NlcnRUcnVlKENvbXBhcmUuY29tcGFyZShGSUxURVJFRCwgIndpdG5lc3MveG1sTGF5b3V0Lm51bGwiKSk7CisgIH0KKyAgCiAgIHZvaWQgY29tbW9uKCkgewogICAgIGludCBpID0gLTE7CiAgCkBAIC03MSw3ICs5Niw3IEBACiAKICAgICBsb2dnZXIud2FybiAoIk1lc3NhZ2UgIiArICsraSk7CiAgICAgcm9vdC53YXJuKCJNZXNzYWdlICIgKyBpKTsgICAgICAgIAotCisgCiAgICAgbG9nZ2VyLmVycm9yKCJNZXNzYWdlICIgKyArK2kpOwogICAgIHJvb3QuZXJyb3IoIk1lc3NhZ2UgIiArIGkpOwogICAgIApAQCAtODQsMTMgKzEwOSwxNCBAQAogICAgIAogICAgIGxvZ2dlci5lcnJvcigiTWVzc2FnZSAiICsgKytpLCBlKTsKICAgICByb290LmVycm9yKCJNZXNzYWdlICIgKyBpLCBlKTsgICAgCi0KICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CiAgICAgc3VpdGUuYWRkVGVzdChuZXcgWE1MTGF5b3V0VGVzdENhc2UoImJhc2ljIikpOwogICAgIHN1aXRlLmFkZFRlc3QobmV3IFhNTExheW91dFRlc3RDYXNlKCJsb2NhdGlvbkluZm8iKSk7CisgICAgc3VpdGUuYWRkVGVzdChuZXcgWE1MTGF5b3V0VGVzdENhc2UoInRlc3RDREFUQSIpKTsKKyAgICBzdWl0ZS5hZGRUZXN0KG5ldyBYTUxMYXlvdXRUZXN0Q2FzZSgidGVzdE51bGwiKSk7CiAgICAgcmV0dXJuIHN1aXRlOwogICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3dpdG5lc3MvUGF0dGVyblBhcnNlcl9tZGMgYi90ZXN0cy93aXRuZXNzL1BhdHRlcm5QYXJzZXJfbWRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NjAyNDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy93aXRuZXNzL1BhdHRlcm5QYXJzZXJfbWRjCkBAIC0wLDAgKzEsMTIgQEAKK3N0YXJ0aW5nIG1kYyBwYXR0ZXJuIHRlc3QKK2VtcHR5IG1kYywgbm8ga2V5IHNwZWNpZmllZCBpbiBwYXR0ZXJuIDogCitlbXB0eSBtZGMsIGtleTEgaW4gcGF0dGVybiA6IAorZW1wdHkgbWRjLCBrZXkyIGluIHBhdHRlcm4gOiAKK2VtcHR5IG1kYywga2V5MyBpbiBwYXR0ZXJuIDogCitlbXB0eSBtZGMsIGtleTEsIGtleTIsIGFuZCBrZXkzIGluIHBhdHRlcm4gOiAsLAorZmlsbGVkIG1kYywgbm8ga2V5IHNwZWNpZmllZCBpbiBwYXR0ZXJuIDogCitmaWxsZWQgbWRjLCBrZXkxIGluIHBhdHRlcm4gOiB2YWx1ZTEKK2ZpbGxlZCBtZGMsIGtleTIgaW4gcGF0dGVybiA6IHZhbHVlMgorZmlsbGVkIG1kYywga2V5MyBpbiBwYXR0ZXJuIDogCitmaWxsZWQgbWRjLCBrZXkxLCBrZXkyLCBhbmQga2V5MyBpbiBwYXR0ZXJuIDogdmFsdWUxLHZhbHVlMiwKK2ZpbmlzaGVkIG1kYyBwYXR0ZXJuIHRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL3dpdG5lc3Mvc29ja2V0U2VydmVyLjUgYi90ZXN0cy93aXRuZXNzL3NvY2tldFNlcnZlci41Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYzZiMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy93aXRuZXNzL3NvY2tldFNlcnZlci41CkBAIC0wLDAgKzEsMzUgQEAKK0RFQlVHIHNvbWU1IFQ1IE1EQy1URVNUNSBbbWFpbl0gU29ja2V0U2VydmVyVGVzdENhc2UgLSBNZXNzYWdlIDEKK0RFQlVHIHNvbWU1IFQ1IE1EQy1URVNUNSBbbWFpbl0gcm9vdCAtIE1lc3NhZ2UgMgorIElORk8gc29tZTUgVDUgTURDLVRFU1Q1IFttYWluXSBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSAtIE1lc3NhZ2UgMworIFdBUk4gc29tZTUgVDUgTURDLVRFU1Q1IFttYWluXSBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSAtIE1lc3NhZ2UgNAorTEVUSEFMIHNvbWU1IFQ1IE1EQy1URVNUNSBbbWFpbl0gU29ja2V0U2VydmVyVGVzdENhc2UgLSBNZXNzYWdlIDUKK0RFQlVHIHNvbWU1IFQ1IE1EQy1URVNUNSBbbWFpbl0gU29ja2V0U2VydmVyVGVzdENhc2UgLSBNZXNzYWdlIDYKK2phdmEubGFuZy5FeGNlcHRpb246IEp1c3QgdGVzdGluZworCWF0IG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldFNlcnZlclRlc3RDYXNlLmNvbW1vbihTb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRTZXJ2ZXJUZXN0Q2FzZS50ZXN0NShTb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE5hdGl2ZSBNZXRob2QpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1blRlc3QoVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1bkJhcmUoVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQkMS5wcm90ZWN0KFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQucnVuUHJvdGVjdGVkKFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQucnVuKFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1bihUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlLnJ1blRlc3QoVGVzdFN1aXRlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUucnVuKFRlc3RTdWl0ZS5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIucnVuKEpVbml0VGVzdFJ1bm5lci5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIubWFpbihKVW5pdFRlc3RSdW5uZXIuamF2YTpYWFgpCitFUlJPUiBzb21lNSBUNSBNREMtVEVTVDUgW21haW5dIHJvb3QgLSBNZXNzYWdlIDcKK2phdmEubGFuZy5FeGNlcHRpb246IEp1c3QgdGVzdGluZworCWF0IG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldFNlcnZlclRlc3RDYXNlLmNvbW1vbihTb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRTZXJ2ZXJUZXN0Q2FzZS50ZXN0NShTb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE5hdGl2ZSBNZXRob2QpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1blRlc3QoVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1bkJhcmUoVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQkMS5wcm90ZWN0KFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQucnVuUHJvdGVjdGVkKFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQucnVuKFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1bihUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlLnJ1blRlc3QoVGVzdFN1aXRlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUucnVuKFRlc3RTdWl0ZS5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIucnVuKEpVbml0VGVzdFJ1bm5lci5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIubWFpbihKVW5pdFRlc3RSdW5uZXIuamF2YTpYWFgpCmRpZmYgLS1naXQgYS90ZXN0cy93aXRuZXNzL3NvY2tldFNlcnZlci42IGIvdGVzdHMvd2l0bmVzcy9zb2NrZXRTZXJ2ZXIuNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTYzODNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvd2l0bmVzcy9zb2NrZXRTZXJ2ZXIuNgpAQCAtMCwwICsxLDM1IEBACitERUJVRyBzb21lNiBUNiBjbGllbnQtdGVzdDYgTURDLVRFU1Q2IFttYWluXSBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSAtIE1lc3NhZ2UgMQorREVCVUcgc29tZTYgVDYgY2xpZW50LXRlc3Q2IE1EQy1URVNUNiBbbWFpbl0gcm9vdCAtIE1lc3NhZ2UgMgorIElORk8gc29tZTYgVDYgY2xpZW50LXRlc3Q2IE1EQy1URVNUNiBbbWFpbl0gU29ja2V0U2VydmVyVGVzdENhc2UgLSBNZXNzYWdlIDMKKyBXQVJOIHNvbWU2IFQ2IGNsaWVudC10ZXN0NiBNREMtVEVTVDYgW21haW5dIFNvY2tldFNlcnZlclRlc3RDYXNlIC0gTWVzc2FnZSA0CitMRVRIQUwgc29tZTYgVDYgY2xpZW50LXRlc3Q2IE1EQy1URVNUNiBbbWFpbl0gU29ja2V0U2VydmVyVGVzdENhc2UgLSBNZXNzYWdlIDUKK0RFQlVHIHNvbWU2IFQ2IGNsaWVudC10ZXN0NiBNREMtVEVTVDYgW21haW5dIFNvY2tldFNlcnZlclRlc3RDYXNlIC0gTWVzc2FnZSA2CitqYXZhLmxhbmcuRXhjZXB0aW9uOiBKdXN0IHRlc3RpbmcKKwlhdCBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5jb21tb24oU29ja2V0U2VydmVyVGVzdENhc2UuamF2YTpYWFgpCisJYXQgb3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0U2VydmVyVGVzdENhc2UudGVzdDYoU29ja2V0U2VydmVyVGVzdENhc2UuamF2YTpYWFgpCisJYXQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZShOYXRpdmUgTWV0aG9kKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW5UZXN0KFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW5CYXJlKFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0JDEucHJvdGVjdChUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0LnJ1blByb3RlY3RlZChUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0LnJ1bihUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW4oVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZS5ydW5UZXN0KFRlc3RTdWl0ZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlLnJ1bihUZXN0U3VpdGUuamF2YTpYWFgpCisJYXQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0UnVubmVyLnJ1bihKVW5pdFRlc3RSdW5uZXIuamF2YTpYWFgpCisJYXQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0UnVubmVyLm1haW4oSlVuaXRUZXN0UnVubmVyLmphdmE6WFhYKQorRVJST1Igc29tZTYgVDYgY2xpZW50LXRlc3Q2IE1EQy1URVNUNiBbbWFpbl0gcm9vdCAtIE1lc3NhZ2UgNworamF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nCisJYXQgb3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0U2VydmVyVGVzdENhc2UuY29tbW9uKFNvY2tldFNlcnZlclRlc3RDYXNlLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldFNlcnZlclRlc3RDYXNlLnRlc3Q2KFNvY2tldFNlcnZlclRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoTmF0aXZlIE1ldGhvZCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuVGVzdChUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuQmFyZShUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCQxLnByb3RlY3QoVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdC5ydW5Qcm90ZWN0ZWQoVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdC5ydW4oVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuKFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUucnVuVGVzdChUZXN0U3VpdGUuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZS5ydW4oVGVzdFN1aXRlLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0VGVzdFJ1bm5lci5ydW4oSlVuaXRUZXN0UnVubmVyLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0VGVzdFJ1bm5lci5tYWluKEpVbml0VGVzdFJ1bm5lci5qYXZhOlhYWCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3dpdG5lc3Mvc29ja2V0U2VydmVyLjcgYi90ZXN0cy93aXRuZXNzL3NvY2tldFNlcnZlci43Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTc1NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy93aXRuZXNzL3NvY2tldFNlcnZlci43CkBAIC0wLDAgKzEsMzUgQEAKK0RFQlVHIHNvbWU3IFQ3IGNsaWVudC10ZXN0NyBNREMtVEVTVDcgW21haW5dIFNvY2tldFNlcnZlclRlc3RDYXNlIC0gTWVzc2FnZSAxCitERUJVRyBzb21lNyBUNyBjbGllbnQtdGVzdDcgTURDLVRFU1Q3IFttYWluXSByb290IC0gTWVzc2FnZSAyCisgSU5GTyBzb21lNyBUNyBjbGllbnQtdGVzdDcgTURDLVRFU1Q3IFttYWluXSBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSAtIE1lc3NhZ2UgMworIFdBUk4gc29tZTcgVDcgY2xpZW50LXRlc3Q3IE1EQy1URVNUNyBbbWFpbl0gU29ja2V0U2VydmVyVGVzdENhc2UgLSBNZXNzYWdlIDQKK0xFVEhBTCBzb21lNyBUNyBjbGllbnQtdGVzdDcgTURDLVRFU1Q3IFttYWluXSBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSAtIE1lc3NhZ2UgNQorREVCVUcgc29tZTcgVDcgY2xpZW50LXRlc3Q3IE1EQy1URVNUNyBbbWFpbl0gU29ja2V0U2VydmVyVGVzdENhc2UgLSBNZXNzYWdlIDYKK2phdmEubGFuZy5FeGNlcHRpb246IEp1c3QgdGVzdGluZworCWF0IG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldFNlcnZlclRlc3RDYXNlLmNvbW1vbihTb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRTZXJ2ZXJUZXN0Q2FzZS50ZXN0NyhTb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE5hdGl2ZSBNZXRob2QpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1blRlc3QoVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1bkJhcmUoVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQkMS5wcm90ZWN0KFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQucnVuUHJvdGVjdGVkKFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQucnVuKFRlc3RSZXN1bHQuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLnJ1bihUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlLnJ1blRlc3QoVGVzdFN1aXRlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUucnVuKFRlc3RTdWl0ZS5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIucnVuKEpVbml0VGVzdFJ1bm5lci5qYXZhOlhYWCkKKwlhdCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIubWFpbihKVW5pdFRlc3RSdW5uZXIuamF2YTpYWFgpCitFUlJPUiBzb21lNyBUNyBjbGllbnQtdGVzdDcgTURDLVRFU1Q3IFttYWluXSByb290IC0gTWVzc2FnZSA3CitqYXZhLmxhbmcuRXhjZXB0aW9uOiBKdXN0IHRlc3RpbmcKKwlhdCBvcmcuYXBhY2hlLmxvZzRqLm5ldC5Tb2NrZXRTZXJ2ZXJUZXN0Q2FzZS5jb21tb24oU29ja2V0U2VydmVyVGVzdENhc2UuamF2YTpYWFgpCisJYXQgb3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0U2VydmVyVGVzdENhc2UudGVzdDcoU29ja2V0U2VydmVyVGVzdENhc2UuamF2YTpYWFgpCisJYXQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZShOYXRpdmUgTWV0aG9kKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW5UZXN0KFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW5CYXJlKFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0JDEucHJvdGVjdChUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0LnJ1blByb3RlY3RlZChUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0LnJ1bihUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW4oVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZS5ydW5UZXN0KFRlc3RTdWl0ZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlLnJ1bihUZXN0U3VpdGUuamF2YTpYWFgpCisJYXQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0UnVubmVyLnJ1bihKVW5pdFRlc3RSdW5uZXIuamF2YTpYWFgpCisJYXQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0UnVubmVyLm1haW4oSlVuaXRUZXN0UnVubmVyLmphdmE6WFhYKQpkaWZmIC0tZ2l0IGEvdGVzdHMvd2l0bmVzcy9zb2NrZXRTZXJ2ZXIuOCBiL3Rlc3RzL3dpdG5lc3Mvc29ja2V0U2VydmVyLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5NjRmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3dpdG5lc3Mvc29ja2V0U2VydmVyLjgKQEAgLTAsMCArMSwzNSBAQAorREVCVUcgc29tZTggVDggc2hvcnRTb2NrZXRTZXJ2ZXIgTURDLVRFU1Q4IFttYWluXSBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSAtIE1lc3NhZ2UgMQorREVCVUcgc29tZTggVDggc2hvcnRTb2NrZXRTZXJ2ZXIgTURDLVRFU1Q4IFttYWluXSByb290IC0gTWVzc2FnZSAyCisgSU5GTyBzb21lOCBUOCBzaG9ydFNvY2tldFNlcnZlciBNREMtVEVTVDggW21haW5dIFNvY2tldFNlcnZlclRlc3RDYXNlIC0gTWVzc2FnZSAzCisgV0FSTiBzb21lOCBUOCBzaG9ydFNvY2tldFNlcnZlciBNREMtVEVTVDggW21haW5dIFNvY2tldFNlcnZlclRlc3RDYXNlIC0gTWVzc2FnZSA0CitMRVRIQUwgc29tZTggVDggc2hvcnRTb2NrZXRTZXJ2ZXIgTURDLVRFU1Q4IFttYWluXSBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSAtIE1lc3NhZ2UgNQorREVCVUcgc29tZTggVDggc2hvcnRTb2NrZXRTZXJ2ZXIgTURDLVRFU1Q4IFttYWluXSBTb2NrZXRTZXJ2ZXJUZXN0Q2FzZSAtIE1lc3NhZ2UgNgoramF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nCisJYXQgb3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0U2VydmVyVGVzdENhc2UuY29tbW9uKFNvY2tldFNlcnZlclRlc3RDYXNlLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldFNlcnZlclRlc3RDYXNlLnRlc3Q4KFNvY2tldFNlcnZlclRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoTmF0aXZlIE1ldGhvZCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuVGVzdChUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuQmFyZShUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCQxLnByb3RlY3QoVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdC5ydW5Qcm90ZWN0ZWQoVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdC5ydW4oVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuKFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUucnVuVGVzdChUZXN0U3VpdGUuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZS5ydW4oVGVzdFN1aXRlLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0VGVzdFJ1bm5lci5ydW4oSlVuaXRUZXN0UnVubmVyLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0VGVzdFJ1bm5lci5tYWluKEpVbml0VGVzdFJ1bm5lci5qYXZhOlhYWCkKK0VSUk9SIHNvbWU4IFQ4IHNob3J0U29ja2V0U2VydmVyIE1EQy1URVNUOCBbbWFpbl0gcm9vdCAtIE1lc3NhZ2UgNworamF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nCisJYXQgb3JnLmFwYWNoZS5sb2c0ai5uZXQuU29ja2V0U2VydmVyVGVzdENhc2UuY29tbW9uKFNvY2tldFNlcnZlclRlc3RDYXNlLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUubG9nNGoubmV0LlNvY2tldFNlcnZlclRlc3RDYXNlLnRlc3Q4KFNvY2tldFNlcnZlclRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoTmF0aXZlIE1ldGhvZCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuVGVzdChUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuQmFyZShUZXN0Q2FzZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCQxLnByb3RlY3QoVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdC5ydW5Qcm90ZWN0ZWQoVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdC5ydW4oVGVzdFJlc3VsdC5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UucnVuKFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUucnVuVGVzdChUZXN0U3VpdGUuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZS5ydW4oVGVzdFN1aXRlLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0VGVzdFJ1bm5lci5ydW4oSlVuaXRUZXN0UnVubmVyLmphdmE6WFhYKQorCWF0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0VGVzdFJ1bm5lci5tYWluKEpVbml0VGVzdFJ1bm5lci5qYXZhOlhYWCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3dpdG5lc3MveG1sTGF5b3V0LjEgYi90ZXN0cy93aXRuZXNzL3htbExheW91dC4xCmluZGV4IGRkMTYwYzIuLjRjMzYxOTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3dpdG5lc3MveG1sTGF5b3V0LjEKKysrIGIvdGVzdHMvd2l0bmVzcy94bWxMYXlvdXQuMQpAQCAtMSw0OCArMSw0OCBAQAotPGxvZzRqOmV2ZW50IGNhdGVnb3J5PSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSRYIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IklORk8iIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSRYIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IklORk8iIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtpbiBYKCkgY29uc3RydWN0b3JdXT48L2xvZzRqOm1lc3NhZ2U+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkRFQlVHIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDBdXT48L2xvZzRqOm1lc3NhZ2U+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJyb290IiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkRFQlVHIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSAwXV0+PC9sb2c0ajptZXNzYWdlPgogPC9sb2c0ajpldmVudD4KIAotPGxvZzRqOmV2ZW50IGNhdGVnb3J5PSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJJTkZPIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iSU5GTyIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgMV1dPjwvbG9nNGo6bWVzc2FnZT4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJJTkZPIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJJTkZPIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSAxXV0+PC9sb2c0ajptZXNzYWdlPgogPC9sb2c0ajpldmVudD4KIAotPGxvZzRqOmV2ZW50IGNhdGVnb3J5PSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJXQVJOIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iV0FSTiIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgMl1dPjwvbG9nNGo6bWVzc2FnZT4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJXQVJOIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJXQVJOIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSAyXV0+PC9sb2c0ajptZXNzYWdlPgogPC9sb2c0ajpldmVudD4KIAotPGxvZzRqOmV2ZW50IGNhdGVnb3J5PSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJFUlJPUiIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkVSUk9SIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSAzXV0+PC9sb2c0ajptZXNzYWdlPgogPC9sb2c0ajpldmVudD4KIAotPGxvZzRqOmV2ZW50IGNhdGVnb3J5PSJyb290IiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkVSUk9SIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJFUlJPUiIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgM11dPjwvbG9nNGo6bWVzc2FnZT4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iRkFUQUwiIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJGQVRBTCIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgNF1dPjwvbG9nNGo6bWVzc2FnZT4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJGQVRBTCIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iRkFUQUwiIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDRdXT48L2xvZzRqOm1lc3NhZ2U+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkRFQlVHIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDVdXT48L2xvZzRqOm1lc3NhZ2U+CiA8bG9nNGo6dGhyb3dhYmxlPjwhW0NEQVRBW2phdmEubGFuZy5FeGNlcHRpb246IEp1c3QgdGVzdGluZwogCWF0IG9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlLmNvbW1vbihYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhOlhYWCkKQEAgLTYxLDcgKzYxLDcgQEAKIF1dPjwvbG9nNGo6dGhyb3dhYmxlPgogPC9sb2c0ajpldmVudD4KIAotPGxvZzRqOmV2ZW50IGNhdGVnb3J5PSJyb290IiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkRFQlVHIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJERUJVRyIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgNV1dPjwvbG9nNGo6bWVzc2FnZT4KIDxsb2c0ajp0aHJvd2FibGU+PCFbQ0RBVEFbamF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nCiAJYXQgb3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UuY29tbW9uKFhNTExheW91dFRlc3RDYXNlLmphdmE6WFhYKQpAQCAtODAsNyArODAsNyBAQAogXV0+PC9sb2c0ajp0aHJvd2FibGU+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkVSUk9SIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iRVJST1IiIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDZdXT48L2xvZzRqOm1lc3NhZ2U+CiA8bG9nNGo6dGhyb3dhYmxlPjwhW0NEQVRBW2phdmEubGFuZy5FeGNlcHRpb246IEp1c3QgdGVzdGluZwogCWF0IG9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlLmNvbW1vbihYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhOlhYWCkKQEAgLTk5LDcgKzk5LDcgQEAKIF1dPjwvbG9nNGo6dGhyb3dhYmxlPgogPC9sb2c0ajpldmVudD4KIAotPGxvZzRqOmV2ZW50IGNhdGVnb3J5PSJyb290IiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkVSUk9SIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJFUlJPUiIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgNl1dPjwvbG9nNGo6bWVzc2FnZT4KIDxsb2c0ajp0aHJvd2FibGU+PCFbQ0RBVEFbamF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nCiAJYXQgb3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UuY29tbW9uKFhNTExheW91dFRlc3RDYXNlLmphdmE6WFhYKQpkaWZmIC0tZ2l0IGEvdGVzdHMvd2l0bmVzcy94bWxMYXlvdXQuMiBiL3Rlc3RzL3dpdG5lc3MveG1sTGF5b3V0LjIKaW5kZXggYmUyMGIzNC4uZTE4MWViNSAxMDA2NDQKLS0tIGEvdGVzdHMvd2l0bmVzcy94bWxMYXlvdXQuMgorKysgYi90ZXN0cy93aXRuZXNzL3htbExheW91dC4yCkBAIC0xLDU5ICsxLDU5IEBACi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlJFgiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iSU5GTyIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlJFgiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iSU5GTyIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW2luIFgoKSBjb25zdHJ1Y3Rvcl1dPjwvbG9nNGo6bWVzc2FnZT4KIDxsb2c0ajpsb2NhdGlvbkluZm8gY2xhc3M9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlJFgiIG1ldGhvZD0iJmx0O2luaXQmZ3Q7IiBmaWxlPSJYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhIiBsaW5lPSJYIi8+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkRFQlVHIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDBdXT48L2xvZzRqOm1lc3NhZ2U+CiA8bG9nNGo6bG9jYXRpb25JbmZvIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgbWV0aG9kPSJjb21tb24iIGZpbGU9IlhNTExheW91dFRlc3RDYXNlLmphdmEiIGxpbmU9IlgiLz4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJERUJVRyIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDBdXT48L2xvZzRqOm1lc3NhZ2U+CiA8bG9nNGo6bG9jYXRpb25JbmZvIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgbWV0aG9kPSJjb21tb24iIGZpbGU9IlhNTExheW91dFRlc3RDYXNlLmphdmEiIGxpbmU9IlgiLz4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iSU5GTyIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IklORk8iIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDFdXT48L2xvZzRqOm1lc3NhZ2U+CiA8bG9nNGo6bG9jYXRpb25JbmZvIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgbWV0aG9kPSJjb21tb24iIGZpbGU9IlhNTExheW91dFRlc3RDYXNlLmphdmEiIGxpbmU9IlgiLz4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJJTkZPIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJJTkZPIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSAxXV0+PC9sb2c0ajptZXNzYWdlPgogPGxvZzRqOmxvY2F0aW9uSW5mbyBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIG1ldGhvZD0iY29tbW9uIiBmaWxlPSJYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhIiBsaW5lPSJYIi8+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IldBUk4iIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJXQVJOIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSAyXV0+PC9sb2c0ajptZXNzYWdlPgogPGxvZzRqOmxvY2F0aW9uSW5mbyBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIG1ldGhvZD0iY29tbW9uIiBmaWxlPSJYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhIiBsaW5lPSJYIi8+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iV0FSTiIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iV0FSTiIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgMl1dPjwvbG9nNGo6bWVzc2FnZT4KIDxsb2c0ajpsb2NhdGlvbkluZm8gY2xhc3M9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiBtZXRob2Q9ImNvbW1vbiIgZmlsZT0iWE1MTGF5b3V0VGVzdENhc2UuamF2YSIgbGluZT0iWCIvPgogPC9sb2c0ajpldmVudD4KIAotPGxvZzRqOmV2ZW50IGNhdGVnb3J5PSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJFUlJPUiIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkVSUk9SIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSAzXV0+PC9sb2c0ajptZXNzYWdlPgogPGxvZzRqOmxvY2F0aW9uSW5mbyBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIG1ldGhvZD0iY29tbW9uIiBmaWxlPSJYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhIiBsaW5lPSJYIi8+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iRVJST1IiIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJyb290IiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkVSUk9SIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSAzXV0+PC9sb2c0ajptZXNzYWdlPgogPGxvZzRqOmxvY2F0aW9uSW5mbyBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIG1ldGhvZD0iY29tbW9uIiBmaWxlPSJYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhIiBsaW5lPSJYIi8+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9Im9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlIiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkZBVEFMIiB0aHJlYWQ9Im1haW4iPgorPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iRkFUQUwiIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDRdXT48L2xvZzRqOm1lc3NhZ2U+CiA8bG9nNGo6bG9jYXRpb25JbmZvIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgbWV0aG9kPSJjb21tb24iIGZpbGU9IlhNTExheW91dFRlc3RDYXNlLmphdmEiIGxpbmU9IlgiLz4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJGQVRBTCIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iRkFUQUwiIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDRdXT48L2xvZzRqOm1lc3NhZ2U+CiA8bG9nNGo6bG9jYXRpb25JbmZvIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgbWV0aG9kPSJjb21tb24iIGZpbGU9IlhNTExheW91dFRlc3RDYXNlLmphdmEiIGxpbmU9IlgiLz4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJERUJVRyIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgNV1dPjwvbG9nNGo6bWVzc2FnZT4KIDxsb2c0ajp0aHJvd2FibGU+PCFbQ0RBVEFbamF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nCiAJYXQgb3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UuY29tbW9uKFhNTExheW91dFRlc3RDYXNlLmphdmE6WFhYKQpAQCAtNzMsNyArNzMsNyBAQAogPGxvZzRqOmxvY2F0aW9uSW5mbyBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIG1ldGhvZD0iY29tbW9uIiBmaWxlPSJYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhIiBsaW5lPSJYIi8+CiA8L2xvZzRqOmV2ZW50PgogCi08bG9nNGo6ZXZlbnQgY2F0ZWdvcnk9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJyb290IiB0aW1lc3RhbXA9IlhYWCIgbGV2ZWw9IkRFQlVHIiB0aHJlYWQ9Im1haW4iPgogPGxvZzRqOm1lc3NhZ2U+PCFbQ0RBVEFbTWVzc2FnZSA1XV0+PC9sb2c0ajptZXNzYWdlPgogPGxvZzRqOnRocm93YWJsZT48IVtDREFUQVtqYXZhLmxhbmcuRXhjZXB0aW9uOiBKdXN0IHRlc3RpbmcKIAlhdCBvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZS5jb21tb24oWE1MTGF5b3V0VGVzdENhc2UuamF2YTpYWFgpCkBAIC05Myw3ICs5Myw3IEBACiA8bG9nNGo6bG9jYXRpb25JbmZvIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgbWV0aG9kPSJjb21tb24iIGZpbGU9IlhNTExheW91dFRlc3RDYXNlLmphdmEiIGxpbmU9IlgiLz4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iRVJST1IiIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJFUlJPUiIgdGhyZWFkPSJtYWluIj4KIDxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW01lc3NhZ2UgNl1dPjwvbG9nNGo6bWVzc2FnZT4KIDxsb2c0ajp0aHJvd2FibGU+PCFbQ0RBVEFbamF2YS5sYW5nLkV4Y2VwdGlvbjogSnVzdCB0ZXN0aW5nCiAJYXQgb3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UuY29tbW9uKFhNTExheW91dFRlc3RDYXNlLmphdmE6WFhYKQpAQCAtMTEzLDcgKzExMyw3IEBACiA8bG9nNGo6bG9jYXRpb25JbmZvIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgbWV0aG9kPSJjb21tb24iIGZpbGU9IlhNTExheW91dFRlc3RDYXNlLmphdmEiIGxpbmU9IlgiLz4KIDwvbG9nNGo6ZXZlbnQ+CiAKLTxsb2c0ajpldmVudCBjYXRlZ29yeT0icm9vdCIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJFUlJPUiIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajpldmVudCBsb2dnZXI9InJvb3QiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iRVJST1IiIHRocmVhZD0ibWFpbiI+CiA8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIDZdXT48L2xvZzRqOm1lc3NhZ2U+CiA8bG9nNGo6dGhyb3dhYmxlPjwhW0NEQVRBW2phdmEubGFuZy5FeGNlcHRpb246IEp1c3QgdGVzdGluZwogCWF0IG9yZy5hcGFjaGUubG9nNGoueG1sLlhNTExheW91dFRlc3RDYXNlLmNvbW1vbihYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhOlhYWCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3dpdG5lc3MveG1sTGF5b3V0LjMgYi90ZXN0cy93aXRuZXNzL3htbExheW91dC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMWM0NjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy93aXRuZXNzL3htbExheW91dC4zCkBAIC0wLDAgKzEsNSBAQAorPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtNZXNzYWdlIHdpdGggZW1iZWRkZWQgPCFbQ0RBVEFbPGhlbGxvPmhpPC9oZWxsbz5dXT5dXSZndDs8IVtDREFUQVsuXV0+PC9sb2c0ajptZXNzYWdlPgorPGxvZzRqOmxvY2F0aW9uSW5mbyBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIG1ldGhvZD0idGVzdENEQVRBIiBmaWxlPSJYTUxMYXlvdXRUZXN0Q2FzZS5qYXZhIiBsaW5lPSJYIi8+Cis8L2xvZzRqOmV2ZW50PgorCmRpZmYgLS1naXQgYS90ZXN0cy93aXRuZXNzL3htbExheW91dC5udWxsIGIvdGVzdHMvd2l0bmVzcy94bWxMYXlvdXQubnVsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmIxYzdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvd2l0bmVzcy94bWxMYXlvdXQubnVsbApAQCAtMCwwICsxLDI2IEBACis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJERUJVRyIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW2hpXV0+PC9sb2c0ajptZXNzYWdlPgorPC9sb2c0ajpldmVudD4KKworPGxvZzRqOmV2ZW50IGxvZ2dlcj0ib3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UiIHRpbWVzdGFtcD0iWFhYIiBsZXZlbD0iREVCVUciIHRocmVhZD0ibWFpbiI+Cis8bG9nNGo6bWVzc2FnZT48IVtDREFUQVtdXT48L2xvZzRqOm1lc3NhZ2U+Cis8L2xvZzRqOmV2ZW50PgorCis8bG9nNGo6ZXZlbnQgbG9nZ2VyPSJvcmcuYXBhY2hlLmxvZzRqLnhtbC5YTUxMYXlvdXRUZXN0Q2FzZSIgdGltZXN0YW1wPSJYWFgiIGxldmVsPSJERUJVRyIgdGhyZWFkPSJtYWluIj4KKzxsb2c0ajptZXNzYWdlPjwhW0NEQVRBW2hpXV0+PC9sb2c0ajptZXNzYWdlPgorPGxvZzRqOnRocm93YWJsZT48IVtDREFUQVtqYXZhLmxhbmcuRXhjZXB0aW9uCisJYXQgb3JnLmFwYWNoZS5sb2c0ai54bWwuWE1MTGF5b3V0VGVzdENhc2UudGVzdE51bGwoWE1MTGF5b3V0VGVzdENhc2UuamF2YTpYWFgpCisJYXQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZShOYXRpdmUgTWV0aG9kKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW5UZXN0KFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW5CYXJlKFRlc3RDYXNlLmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0JDEucHJvdGVjdChUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0LnJ1blByb3RlY3RlZChUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0LnJ1bihUZXN0UmVzdWx0LmphdmE6WFhYKQorCWF0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5ydW4oVGVzdENhc2UuamF2YTpYWFgpCisJYXQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZS5ydW5UZXN0KFRlc3RTdWl0ZS5qYXZhOlhYWCkKKwlhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlLnJ1bihUZXN0U3VpdGUuamF2YTpYWFgpCisJYXQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0UnVubmVyLnJ1bihKVW5pdFRlc3RSdW5uZXIuamF2YTpYWFgpCisJYXQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0UnVubmVyLm1haW4oSlVuaXRUZXN0UnVubmVyLmphdmE6WFhYKQorXV0+PC9sb2c0ajp0aHJvd2FibGU+Cis8L2xvZzRqOmV2ZW50PgorCg==