ZGlmZiAtLWdpdCBhLy5jbGFzc3BhdGggYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTU4OWUyLi4wMDAwMDAwCi0tLSBhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvdGVzdGNhc2VzIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL2phdmEiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvZXhhbXBsZXMvc3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0idG9vbHMvY2VudHMvanVuaXQuY2VudC9saWIvanVuaXQtMy43LmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9jb3JlL2NvbW1vbnMtbG9nZ2luZy0xLjAuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYnVpbGQiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvLmN2c2lnbm9yZSBiLy5jdnNpZ25vcmUKaW5kZXggNTU4MzQyYy4uNmEzMzEwNyAxMDA2NDQKLS0tIGEvLmN2c2lnbm9yZQorKysgYi8uY3ZzaWdub3JlCkBAIC0xLDQgKzEsNSBAQAogZGlzdAorYnVpbGQKIHNjcmlwdHMKICouZWwKICouaXByCkBAIC04LDMgKzksNSBAQAogbG9nKi4qCiAqLmxvZwogYnVpbGQKKy5jbGFzc3BhdGgKKy5wcm9qZWN0CmRpZmYgLS1naXQgYS8ucHJvamVjdCBiLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTkwZWNkLi4wMDAwMDAwCi0tLSBhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+UE9JPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1aWxkLnhtbCBiL2J1aWxkLnhtbAppbmRleCAwZWQzMTRlLi4zYjZiYTc2IDEwMDY0NAotLS0gYS9idWlsZC54bWwKKysrIGIvYnVpbGQueG1sCkBAIC02LDcgKzYsNyBAQAogICAgICAgICBHbGVuIFN0YW1wb3VsdHppcyAgIGdsZW5zIGF0IGFwYWNoZS5vcmcKIAogCi0gICAgVGhpcyBidWlsZCB3YXMgdGVzdGVkIHdpdGggYW5kIDEuNS4zIGFsdGhvdWdoIGl0IHdpbGwgcHJvYmFibHkgd29yayB3aXRoCisgICAgVGhpcyBidWlsZCB3YXMgdGVzdGVkIHdpdGggYW50IDEuNS4zIGFsdGhvdWdoIGl0IHdpbGwgcHJvYmFibHkgd29yayB3aXRoCiAgICAgb3RoZXIgdmVyc2lvbnMuICBUaGUgZm9sbG93aW5nIGphciBmaWxlcyBzaG91bGQgYmUgaW5zdGFsbGVkCiAgICAgaW50byB0aGUgYW50IGxpYiBkaXJlY3Rvcnk6CiAKQEAgLTE1LDYgKzE1LDcgQEAKICAgICBqdW5pdCgzLjgrKSAgICAgaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qdW5pdC9qYXJzLwogICAgIHhlcmNlcyAgICAgICAgICBodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzLwogICAgIGpkZXBlbmQgICAgICAgICBodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL2pkZXBlbmQvamFycy8KKyAgICB4YWxhbiAgICAgICAgICAgaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94YWxhbi9qYXJzLwogCiAgICAgVGhlIGFudCBqYXIgIm9wdGlvbmFsLmphciIgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIG90aGVyd2lzZSB0aGUKICAgICBidWlsZCB3aWxsIGZhaWwuCkBAIC04Miw3ICs4Myw3IEBACiAgICAgPHByb3BlcnR5IG5hbWU9ImNoYW5nZWxvZy5maWxlIiB2YWx1ZT0iJHtidWlsZC5zaXRlfS9jaGFuZ2Vsb2cuaHRtbCIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpciIgdmFsdWU9ImJ1aWxkL2Rpc3QiLz4KICAgICA8cHJvcGVydHkgbmFtZT0iamFyLm5hbWUiIHZhbHVlPSJwb2kiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbi5pZCIgdmFsdWU9IjIuMC1wcmUxIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24uaWQiIHZhbHVlPSIyLjAtUkMxIi8+CiAgICAgPHByb3BlcnR5IG5hbWU9ImhhbHQub24udGVzdC5mYWlsdXJlIiB2YWx1ZT0idHJ1ZSIvPgogCiAgICAgPHBhdGggaWQ9Im1haW4uY2xhc3NwYXRoIj4KQEAgLTE0MSwxNCArMTQyLDE3IEBACiAKICAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrLWphcnMiPgogICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXJzLnByZXNlbnQiPgorCSAgICA8b3I+CiAgICAgICAgICAgICA8YW5kPgogICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHttYWluLmphcjEuZGlyfSIvPgogICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHttYWluLmphcjIuZGlyfSIvPgogICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtjb250cmliLmphcjEuZGlyfSIvPgogICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtjb250cmliLmphcjIuZGlyfSIvPgotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtjb250cmliLmphcjMuZGlyfSIvPgotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtqdW5pdC5qYXIxLmRpcn0iLz4KKyAgICAgICAgICAgICAgCTxhdmFpbGFibGUgZmlsZT0iJHtjb250cmliLmphcjMuZGlyfSIvPgorICAgICAgICAgICAgICAgCTxhdmFpbGFibGUgZmlsZT0iJHtqdW5pdC5qYXIxLmRpcn0iLz4KICAgICAgICAgICAgIDwvYW5kPgorCQkJPGlzc2V0IHByb3BlcnR5PSJkaXNjb25uZWN0ZWQiLz4KKwkgICAgPC9vcj4KICAgICAgICAgPC9jb25kaXRpb24+CiAgICAgPC90YXJnZXQ+CiAKQEAgLTIxNCwxNSArMjE4LDE2IEBACiAgICAgICAgIDwvdXB0b2RhdGU+CiAgICAgPC90YXJnZXQ+CiAKLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtbWFpbiIgZGVwZW5kcz0iY29tcGlsZS1tYWluLC10ZXN0LW1haW4tY2hlY2siIHVubGVzcz0ibWFpbi50ZXN0Lm5vdFJlcXVpcmVkIj4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBzaG93b3V0cHV0PSJ0cnVlIiBmaWx0ZXJ0cmFjZT0ibm8iIGZvcms9Im5vIgotICAgICAgICAgICAgaGFsdG9uZmFpbHVyZT0iJHtoYWx0Lm9uLnRlc3QuZmFpbHVyZX0iIGZhaWx1cmVwcm9wZXJ0eT0ibWFpbi50ZXN0LmZhaWxlZCI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgorCTxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+CiAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1haW4uY2xhc3NwYXRoIi8+CiAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21haW4ub3V0cHV0LmRpcn0iLz4KICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bWFpbi5vdXRwdXQudGVzdC5kaXJ9Ii8+CiAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p1bml0LmphcjEuZGlyfSIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICA8L3BhdGg+CisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW1haW4iIGRlcGVuZHM9ImNvbXBpbGUtbWFpbiwtdGVzdC1tYWluLWNoZWNrIiB1bmxlc3M9Im1haW4udGVzdC5ub3RSZXF1aXJlZCI+CisgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgc2hvd291dHB1dD0idHJ1ZSIgZmlsdGVydHJhY2U9Im5vIiBmb3JrPSJubyIKKyAgICAgICAgICAgIGhhbHRvbmZhaWx1cmU9IiR7aGFsdC5vbi50ZXN0LmZhaWx1cmV9IiBmYWlsdXJlcHJvcGVydHk9Im1haW4udGVzdC5mYWlsZWQiPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KICAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9IkhTU0YudGVzdGRhdGEucGF0aCIgdmFsdWU9IiR7bWFpbi5zcmMudGVzdH0vb3JnL2FwYWNoZS9wb2kvaHNzZi9kYXRhIi8+CiAgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJIUFNGLnRlc3RkYXRhLnBhdGgiIHZhbHVlPSIke21haW4uc3JjLnRlc3R9L29yZy9hcGFjaGUvcG9pL2hwc2YvZGF0YSIvPgogICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIvPgpAQCAtMjM4LDE0ICsyNDMsOSBAQAogICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9Ii10ZXN0LW1haW4td3JpdGUtdGVzdGZpbGUiLz4KICAgICA8L3RhcmdldD4KIAotICAgIDx0YXJnZXQgbmFtZT0ic2luZ2xlLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtbWFpbiI+Ci0JPGp1bml0IHByaW50c3VtbWFyeT0ibm8iIHNob3dvdXRwdXQ9InRydWUiIGZpbHRlcnRyYWNlPSJubyIgZm9yaz0ibm8iIGhhbHRvbmZhaWx1cmU9IiR7aGFsdC5vbi50ZXN0LmZhaWx1cmV9IiBmYWlsdXJlcHJvcGVydHk9Im1haW4udGVzdC5mYWlsZWQiID4KLQk8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYWluLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHttYWluLm91dHB1dC5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21haW4ub3V0cHV0LnRlc3QuZGlyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqdW5pdC5qYXIxLmRpcn0iLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgIDx0YXJnZXQgbmFtZT0ic2luZ2xlLXRlc3QiIGRlcGVuZHM9Ii10ZXN0LXByb3BlcnR5LWNoZWNrLGNvbXBpbGUtbWFpbiI+CisJPGp1bml0IHByaW50c3VtbWFyeT0ibm8iIHNob3dvdXRwdXQ9InRydWUiIGZpbHRlcnRyYWNlPSJubyIgaGFsdG9uZmFpbHVyZT0iJHtoYWx0Lm9uLnRlc3QuZmFpbHVyZX0iIGZhaWx1cmVwcm9wZXJ0eT0ibWFpbi50ZXN0LmZhaWxlZCIgPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KIAkgICAgPHN5c3Byb3BlcnR5IGtleT0iSFNTRi50ZXN0ZGF0YS5wYXRoIiB2YWx1ZT0iJHttYWluLnNyYy50ZXN0fS9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEiLz4KICAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9IkhQU0YudGVzdGRhdGEucGF0aCIgdmFsdWU9IiR7bWFpbi5zcmMudGVzdH0vb3JnL2FwYWNoZS9wb2kvaHBzZi9kYXRhIi8+CiAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJubyIvPgpAQCAtMjU0LDYgKzI1NCwyNCBAQAogCTwvanVuaXQ+CiAgICAgPC90YXJnZXQ+CiAKKyAgICA8dGFyZ2V0IG5hbWU9ImRlYnVnLXRlc3QiIGRlcGVuZHM9Ii10ZXN0LXByb3BlcnR5LWNoZWNrLGNvbXBpbGUtbWFpbiI+CisJPGp1bml0IHByaW50c3VtbWFyeT0ibm8iIHNob3dvdXRwdXQ9InRydWUiIGZpbHRlcnRyYWNlPSJubyIgZm9yaz0ieWVzIiBoYWx0b25mYWlsdXJlPSIke2hhbHQub24udGVzdC5mYWlsdXJlfSIgZmFpbHVyZXByb3BlcnR5PSJtYWluLnRlc3QuZmFpbGVkIiA+CisJPGp2bWFyZyB2YWx1ZT0iLVhkZWJ1ZyIvPgorCTxqdm1hcmcgdmFsdWU9Ii1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LGFkZHJlc3M9NTAwMSxzZXJ2ZXI9eSxzdXNwZW5kPXkiLz4KKwk8c3lzcHJvcGVydHkga2V5PSJqYXZhLmNvbXBpbGVyIiB2YWx1ZT0iTk9ORSIvPgorCTxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisJICAgIDxzeXNwcm9wZXJ0eSBrZXk9IkhTU0YudGVzdGRhdGEucGF0aCIgdmFsdWU9IiR7bWFpbi5zcmMudGVzdH0vb3JnL2FwYWNoZS9wb2kvaHNzZi9kYXRhIi8+CisgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJIUFNGLnRlc3RkYXRhLnBhdGgiIHZhbHVlPSIke21haW4uc3JjLnRlc3R9L29yZy9hcGFjaGUvcG9pL2hwc2YvZGF0YSIvPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0ibm8iLz4KKwkgICAgPHRlc3QgbmFtZT0iJHt0ZXN0Y2FzZX0iIC8+CisJPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLXRlc3QtcHJvcGVydHktY2hlY2siIHVubGVzcz0idGVzdGNhc2UiPgorCTxlY2hvIG1lc3NhZ2U9IlBsZWFzZSB1c2UgLUR0ZXN0Y2FzZT1vcmcueW91ci50ZXN0Y2FzZSB0byBydW4gYSBzaW5nbGUgdGVzdCIvPgorCTxmYWlsLz4KKyAgICA8L3RhcmdldD4KKwogICAgIDx0YXJnZXQgbmFtZT0iLXRlc3QtbWFpbi13cml0ZS10ZXN0ZmlsZSIgdW5sZXNzPSJtYWluLnRlc3QuZmFpbGVkIj4KICAgICAgICAgPGVjaG8gZmlsZT0iJHttYWluLnRlc3Rva2ZpbGV9IiBhcHBlbmQ9ImZhbHNlIiBtZXNzYWdlPSJ0ZXN0b2siLz4KICAgICA8L3RhcmdldD4KQEAgLTMzNCwxMSArMzUyLDEwIEBACiAgICAgPC90YXJnZXQ+CiAKICAgICA8dGFyZ2V0IG5hbWU9Ii1jaGVjay1mb3JyZXN0LWluc3RhbGxlZCIgdW5sZXNzPSJlbnYuRk9SUkVTVF9IT01FIj4KLSAgICAgICAgPGVjaG8+Ci0gICAgICAgICAgICBQbGVhc2UgaW5zdGFsbCBhcGFjaGUgZm9ycmVzdCBhbmQgc2V0IHRoZQotICAgICAgICAgICAgRk9SUkVTVF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlLgotICAgICAgICA8L2VjaG8+Ci0gICAgICAgIDxmYWlsLz4KKyAgICAgICAgPGVjaG8+UGxlYXNlIGluc3RhbGwgQXBhY2hlIEZvcnJlc3QgKHNlZQorJmx0O2h0dHA6Ly94bWwuYXBhY2hlLm9yZy9mb3JyZXN0L2luZGV4Lmh0bWwmZ3Q7KSBhbmQgc2V0IHRoZQorRk9SUkVTVF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlITwvZWNobz4KKyAgICAgICAgPGZhaWwgbWVzc2FnZT0iQXBhY2hlIEZvcnJlc3QgaXMgbm90IGluc3RhbGxlZC4iLz4KICAgICA8L3RhcmdldD4KIAogICAgIDwhLS0gICAgPHRhcmdldCBuYW1lPSJjaGVjay1kb2NzIj4tLT4KQEAgLTM4Niw2ICs0MDMsMTggQEAKICAgICAgICAgPC9jb25kaXRpb24+CiAgICAgPC90YXJnZXQ+CiAKKyAgICA8dGFyZ2V0IG5hbWU9Ii1jdnNjaGFuZ2Vsb2ciIHVubGVzcz0iZGlzY29ubmVjdGVkIj4KKyAgICAgICAgPGN2c2NoYW5nZWxvZyBkZXN0ZmlsZT0iJHtjaGFuZ2Vsb2cuZmlsZX0iIGRheXNpbnBhc3Q9IjMwIi8+CisKKwk8c3R5bGUgaW49IiR7Y2hhbmdlbG9nLmZpbGV9IgorICAgICAgICAgICAgb3V0PSIke2J1aWxkLnNpdGUuc3JjfS9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L2NoYW5nZWxvZy5odG1sIgorICAgICAgICAgICAgc3R5bGU9ImNoYW5nZWxvZy54c2wiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRpdGxlIiBleHByZXNzaW9uPSJQT0kgQ2hhbmdlIExvZyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1vZHVsZSIgZXhwcmVzc2lvbj0iamFrYXJ0YS1wb2kiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdnN3ZWIiIGV4cHJlc3Npb249Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzLyIvPgorICAgICAgICA8L3N0eWxlPgorICAgIDwvdGFyZ2V0PgorCiAgICAgPHRhcmdldCBuYW1lPSJyZXBvcnRzIiBkZXBlbmRzPSItY2hlY2stcmVwb3J0cyIgdW5sZXNzPSJyZXBvcnRzLm5vdFJlcXVpcmVkIgogICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlcyBqdW5pdCxqZGVwZW5kIGFuZCBqYXZhZG9jIHJlcG9ydHMiPgogICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9InRlc3QiPgpAQCAtNDI1LDE1ICs0NTQsNyBAQAogICAgICAgICAgICAgb3V0PSIke2pkZXBlbmQucmVwb3J0Lm91dC5kaXJ9L2luZGV4Lmh0bWwiCiAgICAgICAgICAgICBzdHlsZT0iamRlcGVuZC54c2wiLz4KIAotICAgICAgICA8Y3ZzY2hhbmdlbG9nIGRlc3RmaWxlPSIke2NoYW5nZWxvZy5maWxlfSIgZGF5c2lucGFzdD0iMzAiLz4KLQotICAgICAgICA8c3R5bGUgaW49IiR7Y2hhbmdlbG9nLmZpbGV9IgotICAgICAgICAgICAgb3V0PSIke2J1aWxkLnNpdGUuc3JjfS9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L2NoYW5nZWxvZy5odG1sIgotICAgICAgICAgICAgc3R5bGU9ImNoYW5nZWxvZy54c2wiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRpdGxlIiBleHByZXNzaW9uPSJQT0kgQ2hhbmdlIExvZyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9Im1vZHVsZSIgZXhwcmVzc2lvbj0iamFrYXJ0YS1wb2kiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjdnN3ZWIiIGV4cHJlc3Npb249Imh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzLyIvPgotICAgICAgICA8L3N0eWxlPgorCTxhbnRjYWxsIHRhcmdldD0iLWN2c2NoYW5nZWxvZyIvPgogCiAgICAgICAgIDxqYXZhZG9jCiAgICAgICAgICAgICBkZXN0ZGlyPSIke2FwaWRvY3MucmVwb3J0LmRpcn0iCkBAIC01NDcsOSArNTY4LDkgQEAKIAogICAgICAgICA8dGFyIGRlc3RmaWxlPSIke2Rpc3QuZGlyfS8ke2phci5uYW1lfS1iaW4tJHt2ZXJzaW9uLmlkfS0ke0RTVEFNUH0udGFyLmd6IiBjb21wcmVzc2lvbj0iZ3ppcCI+CiAgICAgICAgICAgICA8dGFyZmlsZXNldCBkaXI9IiR7YnVpbGQuc2l0ZX0iIHByZWZpeD0iZG9jcyIvPgotICAgICAgICAgICAgPHRhcmZpbGVzZXQgZmlsZT0iJHtkaXN0LmRpcn0vJHtqYXIubmFtZX0tJHt2ZXJzaW9uLmlkfS5qYXIiLz4KLSAgICAgICAgICAgIDx0YXJmaWxlc2V0IGZpbGU9IiR7ZGlzdC5kaXJ9LyR7amFyLm5hbWV9LWNvbnRyaWItJHt2ZXJzaW9uLmlkfS5qYXIiLz4KLSAgICAgICAgICAgIDx0YXJmaWxlc2V0IGZpbGU9IiR7ZGlzdC5kaXJ9LyR7amFyLm5hbWV9LXNjcmF0Y2hwYWQtJHt2ZXJzaW9uLmlkfS5qYXIiLz4KKyAgICAgICAgICAgIDx0YXJmaWxlc2V0IGZpbGU9IiR7ZGlzdC5kaXJ9LyR7amFyLm5hbWV9LSR7dmVyc2lvbi5pZH0tJHtEU1RBTVB9LmphciIvPgorICAgICAgICAgICAgPHRhcmZpbGVzZXQgZmlsZT0iJHtkaXN0LmRpcn0vJHtqYXIubmFtZX0tY29udHJpYi0ke3ZlcnNpb24uaWR9LSR7RFNUQU1QfS5qYXIiLz4KKyAgICAgICAgICAgIDx0YXJmaWxlc2V0IGZpbGU9IiR7ZGlzdC5kaXJ9LyR7amFyLm5hbWV9LXNjcmF0Y2hwYWQtJHt2ZXJzaW9uLmlkfS0ke0RTVEFNUH0uamFyIi8+CiAgICAgICAgICAgICA8dGFyZmlsZXNldCBkaXI9ImxlZ2FsIiBwcmVmaXg9ImxlZ2FsIi8+CiAgICAgICAgIDwvdGFyPgogCkBAIC01NzAsNiArNTkxLDYgQEAKIAogICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4tZGlzdCIgZGVwZW5kcz0iY2xlYW4sZGlzdCIgZGVzY3JpcHRpb249IkNsZWFucyB0aGUgYnVpbGQgZGlyZWN0b3J5IHRoZW4gY3JlYXRlcyBhIGRpc3RyaWJ1dGlvbiIvPgogCi0gICAgPHRhcmdldCBuYW1lPSJndW1wIiBkZXBlbmRzPSJqYXIiLz4KKyAgICA8dGFyZ2V0IG5hbWU9Imd1bXAiIGRlcGVuZHM9Imphcix0ZXN0Ii8+CiAKIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvYm9vay54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2Jvb2sueG1sCmluZGV4IDE3OGVjYWQuLjdiMDU0MTggMTAwNjQ0Ci0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvYm9vay54bWwKKysrIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9ib29rLnhtbApAQCAtOSw3ICs5LDcgQEAKICAgICA8bWVudSBsYWJlbD0iQ29tbXVuaXR5Ij4KICAgICAgICAgPG1lbnUtaXRlbSBsYWJlbD0iTmV3cyIgaHJlZj0ibmV3cy5odG1sIi8+CiAgICAgICAgIDxtZW51LWl0ZW0gbGFiZWw9Ik1pcnJvcnMiIGhyZWY9Im1pcnJvcnMuaHRtbCIvPgotICAgICAgICA8bWVudS1pdGVtIGxhYmVsPSJDaGFuZ2VzIiBocmVmPSJjaGFuZ2VzLmh0bWwiLz4KKyAgICAgICAgPG1lbnUtaXRlbSBsYWJlbD0iQ2hhbmdlcyIgaHJlZj0ic2l0ZTpjaGFuZ2VzIi8+CiAgICAgICAgIDxtZW51LWl0ZW0gbGFiZWw9IlRvIERvIiBocmVmPSJ0b2RvLmh0bWwiLz4KICAgICAgICAgPG1lbnUtaXRlbSBsYWJlbD0iR2V0IEludm9sdmVkIiBocmVmPSJnZXRpbnZvbHZlZC9pbmRleC5odG1sIi8+CiAgICAgICAgIDxtZW51LWl0ZW0gbGFiZWw9Ik1haWxpbmcgTGlzdHMiIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9tYWlsLmh0bWwiLz4KZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvY2hhbmdlcy54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTczYzdiLi4wMDAwMDAwCi0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvY2hhbmdlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgY2hhbmdlcyBQVUJMSUMgIi0vL0FQQUNIRS8vRFREIENoYW5nZXMgVjEuMS8vRU4iICIuL2R0ZC9jaGFuZ2VzLXYxMS5kdGQiPgotCi08Y2hhbmdlcz4KLQotICAgIDx0aXRsZT5IaXN0b3J5IG9mIENoYW5nZXM8L3RpdGxlPgotCi0gICAgPGRldnM+Ci0gICAgICAgIDwhLS0gaW4gc3RyaWN0IGFscGhhYmV0aWNhbCBvcmRlciAtLT4KLSAgICAgICAgPHBlcnNvbiBpZD0iQU8iIG5hbWU9IkFuZHJldyBDLiBPbGl2ZXIiIGVtYWlsPSJhY29saXZlcjJAdXNlcnMuc291cmNlZm9yZ2UubmV0Ii8+Ci0gICAgICAgIDxwZXJzb24gaWQ9IkdKUyIgbmFtZT0iR2xlbiBTdGFtcG91bHR6aXMiIGVtYWlsPSJnbGVuc0BhcGFjaGUub3JnIi8+Ci0gICAgICAgIDxwZXJzb24gaWQ9Ik1KIiBuYW1lPSJNYXJjIEpvaG5zb24iIGVtYWlsPSJtam9obnNvbkBhcGFjaGUub3JnIi8+Ci0gICAgICAgIDxwZXJzb24gaWQ9Ik5LQiIgbmFtZT0iTmljb2xhIEtlbiBCYXJvenppIiBlbWFpbD0iYmFyb3p6aUBuaWNvbGFrZW4uY29tIi8+Ci0gICAgICAgIDxwZXJzb24gaWQ9IlBPSS1ERVZFTE9QRVJTIiBuYW1lPSJQb2kgRGV2ZWxvcGVycyIgZW1haWw9InBvaS1kZXZAamFrYXJ0YS5hcGFjaGUub3JnIi8+Ci0gICAgPC9kZXZzPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjIuMC1wcmUxIiBkYXRlPSJ1bnJlbGVhc2VkIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPlBhdGNoIGFwcGxpZWQgZm9yIGRlZXAgY2xvbmluZyBvZiB3b3Jrc2hlZXRzIHdhcyBwcm92aWRlZDwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+UGF0Y2ggYXBwbGllZCB0byBhbGxvdyBzaGVldCByZW9yZGVyaW5nPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5BZGRlZCBhZGRpdGlvbmFsIHByaW50IGFyZWEgc2V0dGluZyBtZXRob2RzIHVzaW5nIHJvdy9jb2x1bW4gbnVtYmVyczwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCI+SERGOiAgTmVnYXRpdmUgQXJyYXkgc2l6ZSBmaXg8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiPkFkZGVkIGFyZ3VtZW50IHBvaW50ZXJzIHRvIHN1cHBvcnQgdGhlIElGIGZvcm11bGE8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiPkZvcm11bGFzOiBBZGRlZCBzcGVjaWFsIGNoYXJhY3RlciBzdXBwb3J0IGZvciBzdHJpbmcgbGl0ZXJhbHMsIHNwZWNpZmljYWxseSBmb3IgU1VNSUYgZm9ybXVsYSBzdXBwb3J0IGFuZCBhZGRyZXNzZXMgYSBidWcgYXMgd2VsbDwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCI+QmxvY2tpbmdJbnB1dFN0cmVhbSBjb21taXR0ZWQgdG8gaGVscCBlbnN1cmUgcmVhZHM8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiPkZpeGVkIHByb2JsZW0gd2l0aCBOYU4gdmFsdWVzIGRpZmZlcmluZyBmcm9tIHRoZSBpbnZlc3RpZ2F0ZWQgdmFsdWUgZnJvbSBmaWxlIHJlYWRzIGluIEZvcm11bGFSZWNvcmRzPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4Ij5QYXRjaCBmb3IgZ2V0Q29sdW1uV2lkdGggaW4gSFNTRjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+UGF0Y2ggZm9yIGRlYWxpbmcgd2l0aCBtdWx0LWxldmVsIG51bWJlcmVkIGxpc3RzIGluIEhERjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCI+RHVlIHRvIG5hbWVkIHJlZmVyZW5jZSB3b3JrLCBzZXZlcmFsIG5hbWVkLXJhbmdlZCBidWdzIHdlcmUgY2xvc2VkPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4Ij5QYXRjaCBhcHBsaWVkIHRvIHByZXZlbnQgc2hlZXQgY29ycnVwdGlvbiBhZnRlciBhIHRlbXBsYXRlIG1vZGlmaWNhdGlvbjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSI+U2hhcmVkIEZvcm11bGFzIG5vdyBTdXBwb3J0ZWQ8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiPkFkZGVkIEdyZWF0ZXJFcXVhbCwgTGVzc0VxdWFsIGFuZCBOb3RFcXVhbCB0byBGb3JtdWxhIFBhcnNlcjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSI+QWRkZWQgR3JlYXRlclRoYW4gYW5kIExlc3NUaGFuIGZ1bmN0aW9uYWxpdHkgdG8gZm9ybXVsYXM8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiPlBhdGNoZXMgZm9yIGkxMG48L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiPlBPSSBCdWlsZCBTeXN0ZW0gVXBkYXRlZDwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCI+Zm9udCBuYW1lcyBjYW4gbm93IGJlIG51bGw8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4xMC1kZXYiIGRhdGU9IjE5IEZlYiAyMDAzIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPlN1cHBvcnQgZm9yIHpvb20gbGV2ZWw8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPkZyZWV6ZSBhbmQgc3BsaXQgcGFuZSBzdXBwb3J0PC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5Sb3cgYW5kIGNvbHVtbiBoZWFkZXJzIG9uIHByaW50b3V0czwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjgtZGV2IiBkYXRlPSIyMCBTZXAgMjAwMiI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5DdXN0b20gRGF0YSBGb3JtYXQgU3VwcG9ydDwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+RW5oYW5jZWQgVW5pY29kZSBTdXBwb3J0IGZvciBSdXNzaWFuIGFuZCBKYXBhbmVzZTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+RW5oYW5jZWQgZm9ybXVsYSBzdXBwb3J0IGluY2x1ZGluZyByZWFkLW9ubHkgZm9yCi0gICAgICAgICAgICAib3B0aW1pemVkIGlmIiBzdGF0ZW1lbnRzLjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+U3VwcG9ydCBmb3IgY2xvbmluZyBvYmplY3RzPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5GaXhlcyBmb3IgaGVhZGVyL2Zvb3RlcjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+U3BhbmlzaCBEb2N1bWVudGF0aW9uIHRyYW5zbGF0aW9uczwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+U3VwcG9ydCBmb3IgcHJlc2VydmluZyBWQkEgbWFjcm9zPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuNy1kZXYiIGRhdGU9Ij8/PyI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJOS0IiIHR5cGU9InVwZGF0ZSI+UmVtb3ZlZCBydW50aW1lIGRlcGVuZGVuY3kgb24gY29tbW9ucyBsb2dnaW5nLjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSI+Rm9ybXVsYSBzdXBwb3J0PC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuNS4xIiBkYXRlPSIxNiBKdW5lIDIwMDIiPgotICAgICAgICA8YWN0aW9uIGRldj0iR0pTIiB0eXBlPSJ1cGRhdGUiPlJlbW92ZWQgZGVwZWRlbmN5IG9uIGNvbW1vbnMgbG9nZ2luZy4gIE5vdyBkZWZpbmUgcG9pLmxvZ2dpbmcgc3lzdGVtIHByb3BlcnR5IHRvIGVuYWJsZSBsb2dnaW5nIHRvIHN0YW5kYXJkIG91dC48L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IkdKUyIgdHlwZT0iZml4Ij5GaXhlZCBTU1Qgc3RyaW5nIGhhbmRsaW5nIHNvIHRoYXQgc3ByZWFkc2hlZXRzIHdpdGggcmljaCB0ZXh0IG9yIGV4dGVuZGVkIHRleHQgd2lsbCBiZSByZWFkIGNvcnJlY3RseS48L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS41IiBkYXRlPSIwNiBNYXkgMjAwMiI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJOS0IiIHR5cGU9InVwZGF0ZSI+TmV3IHByb2plY3QgYnVpbGQuPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJOS0IiIHR5cGU9InVwZGF0ZSI+TmV3IHByb2plY3QgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gYmFzZWQgb24gQ29jb29uLjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSI+UGFja2FnZSByZW5hbWU8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiPlZhcmlvdXMgYnVnIGZpeGVzPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5FYXJseSBzdGFnZXMgb2YgSFNGIGRldmVsb3BtZW50IChub3QgcmVhZHkgZm9yIGRldmVsb3BtZW50KTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+SW5pdGlhbCBsb3cgbGV2ZWwgcmVjb3JkIHN1cHBvcnQgZm9yIGNoYXJ0aW5nIChub3QgY29tcGxldGUpPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMS4wIiBkYXRlPSJSZWxlYXNlIGRhdGUgbm90IHJlY29yZGVkIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5DcmVhdGVkIG5ldyBldmVudCBtb2RlbDwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPk9wdGltaXphdGlvbnMgbWFkZSB0byBIU1NGIGluY2x1ZGluZyBhZ2dyZWdhdGUgcmVjb3JkcyBmb3IKLSAgICAgICAgdmFsdWVzLCByb3dzLCBldGMuPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+cHJlZGljdGl2ZSBzaXppbmcsIG9mZnNldCBiYXNlZCB3cml0aW5nIChpbnN0ZWFkIG9mIGxvdHMgb2YKLSAgICAgICAgYXJyYXkgY29waWVzKTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPm1pbm9yIHJlLWZhY3RvcmluZyBhbmQgYnVnIGZpeGVzLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAuMCIgZGF0ZT0iUmVsZWFzZSBkYXRlIG5vdCByZWNvcmRlZCI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+TWlub3IgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjE0LjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkFkZGVkIERhdGFGb3JtYXQgaGVscGVyIGNsYXNzIGFuZCBleHBvc2VkIHNldCBhbmQgZ2V0IGZvcm1hdAotICAgICAgICBvbiBIU1NGQ2VsbFN0eWxlPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+Rml4ZWQgY29sdW1uIHdpZHRoIGFwaXMgKHVuaXQgd2lzZSkgYW5kIHZhcmlvdXMgamF2YWRvYyBvbgotICAgICAgICB0aGUgc3ViamVjdDwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkZpeCBmb3IgRGltZW5zaW9ucyByZWNvcmQgKGFnYWluKS4uLiAob25lIG9mIHRoZXNlIGRheXMgSSdsbAotICAgICAgICB3cml0ZSBhIHVuaXQgdGVzdCBmb3IgdGhpcyA7LXApLjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPlNvbWUgb3B0aW1pemF0aW9uIG9uIHNoZWV0IGNyZWF0aW9uLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjEzLjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkNoYW5nZXMgbm90IHJlY29yZGVkLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjEyLjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkFkZGVkIE11bEJsYW5rLCBCbGFuaywgQ29sSW5mbzwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkFkZGVkIGxvZzRqIGZhY2lsaXR5IGFuZCByZW1vdmVkIGFsbCBzeXMub3V0IHR5cGUgbG9nZ2luZzwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkFkZGVkIHN1cHBvcnQgZm9yIGFkZGluZyBmb250J3MsIHN0eWxlcyBhbmQgY29ycmVzcG9uZGluZwotICAgICAgICBoaWdoIGxldmVsIGFwaSBmb3Igc3R5bGluZyBjZWxsczwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPmFkZGVkIHN1cHBvcnQgZm9yIGNoYW5naW5nIHJvdyBoZWlnaHQsIGNlbGwgd2lkdGggYW5kIGRlZmF1bHQKLSAgICAgICAgcm93IGhlaWdodC9jZWxsIHdpZHRoLjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkFkZGVkIGZpeGVzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAoVVRGLTE2IHNob3VsZCB3b3JrIG5vdwotICAgICAgICBmcm9tIEhTU0ZDZWxsLnNldFN0cmluZ1ZhbHVlLCBldGMgd2hlbiB0aGUgZW5jb2RpbmcgaXMgc2V0KTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPmFkZGVkIHN1cHBvcnQgZm9yIGFkZGluZy9yZW1vdmluZyBhbmQgbmFtaW5nIHNoZWV0cy48L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMC4xMS4wIiBkYXRlPSJSZWxlYXNlIGRhdGUgbm90IHJlY29yZGVkIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5CdWdmaXggcmVsZWFzZS4gV2Ugd2VyZSB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hlbiByZWFkaW5nCi0gICAgICAgIFJLUmVjb3JkIG9iamVjdHMuPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjAuMTAuMCIgZGF0ZT0iUmVsZWFzZSBkYXRlIG5vdCByZWNvcmRlZCI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+R290IGNvbnRpbnVhdGlvbiByZWNvcmRzIHRvIHdvcmsgKHJlYWQvd3JpdGUpPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+QWRkZWQgdmFyaW91cyBwcmUtc3VwcG9ydCBmb3IgZm9ybXVsYXM8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5NYXNzaXZlIEFQSSByZW9yZ2FuaXphdGlvbiwgcmVwYWNrYWdpbmcuPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+QmlmZlZpZXdlciBjbGFzcyBhZGRlZCBmb3IgdmFsaWRhdGluZyBIU1NGICZhbXA7IFBPSSBhbmQvb3IKLSAgICAgICAgSFNTRiBPdXRwdXQuPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+QmV0dGVyIEFQSSBzdXBwb3J0IGZvciBtb2RpZmljYXRpb24uPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjAuNyAoYW5kIGludGVyaW0gcmVsZWFzZXMpIiBkYXRlPSJSZWxlYXNlIGRhdGUgbm90IHJlY29yZGVkIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5BZGRlZCBlbmNvZGluZyBmbGFnIHRvIGhpZ2ggYW5kIGxvdyBsZXZlbCBhcGkgdG8gdXNlIHV0Zi0xNgotICAgICAgICB3aGVuIG5lZWRlZCAoSFNTRkNlbGwuc2V0RW5jb2RpbmcoKSk8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5hZGRlZCByZWFkIG9ubHkgc3VwcG9ydCBmb3IgTGFiZWwgcmVjb3JkcyAod2hpY2ggYXJlCi0gICAgICAgIHJlaW50ZXJwcmV0ZWQgYXMgTGFiZWxTU1Qgd2hlbiB3cml0dGVuKTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkJyb2tlbiBjb250aW51YXRpb24gcmVjb3JkIGltcGxlbWVudGF0aW9uIChvb3BzKTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkJpZmZWaWV3ZXIgY2xhc3MgYWRkZWQgZm9yIHZhbGlkYXRpbmcgSFNTRiAmYW1wOyBQT0kgYW5kL29yCi0gICAgICAgIEhTU0YgT3V0cHV0LjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjYgKHJlbGVhc2UpIiBkYXRlPSJSZWxlYXNlIGRhdGUgbm90IHJlY29yZGVkIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5TdXBwb3J0IGZvciByZWFkL3dyaXRlIGFuZCBtb2RpZnkuPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+UmVhZCBvbmx5IHN1cHBvcnQgZm9yIE11bFJLIHJlY29yZHMgKGNvbnZlcnRlZCB0byBOdW1iZXIgd2hlbgotICAgICAgICB3cml0aW5nKQotICAgICAgICA8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0KLTwvY2hhbmdlcz4KZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL3hkb2NzL2R0ZC9ib29rLWNvY29vbi12MTAuZHRkIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9kdGQvYm9vay1jb2Nvb24tdjEwLmR0ZApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kdGQvYm9vay1jb2Nvb24tdjEwLmR0ZApyZW5hbWUgdG8gc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9kdGQvYm9vay1jb2Nvb24tdjEwLmR0ZApkaWZmIC0tZ2l0IGEvc3JjL2RvY3VtZW50YXRpb24veGRvY3MvZHRkL2NoYW5nZXMtdjExLmR0ZCBiL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvZHRkL2NoYW5nZXMtdjExLmR0ZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2RvY3VtZW50YXRpb24veGRvY3MvZHRkL2NoYW5nZXMtdjExLmR0ZApyZW5hbWUgdG8gc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9kdGQvY2hhbmdlcy12MTEuZHRkCmRpZmYgLS1naXQgYS9zcmMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kdGQvZG9jdW1lbnQtdjExLmR0ZCBiL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvZHRkL2RvY3VtZW50LXYxMS5kdGQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9kb2N1bWVudGF0aW9uL3hkb2NzL2R0ZC9kb2N1bWVudC12MTEuZHRkCnJlbmFtZSB0byBzcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2R0ZC9kb2N1bWVudC12MTEuZHRkCmRpZmYgLS1naXQgYS9zcmMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kdGQvZmFxLXYxMS5kdGQgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2R0ZC9mYXEtdjExLmR0ZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2RvY3VtZW50YXRpb24veGRvY3MvZHRkL2ZhcS12MTEuZHRkCnJlbmFtZSB0byBzcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2R0ZC9mYXEtdjExLmR0ZApkaWZmIC0tZ2l0IGEvc3JjL2RvY3VtZW50YXRpb24veGRvY3MvZHRkL2phdmFkb2MtdjA0ZHJhZnQuZHRkIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9kdGQvamF2YWRvYy12MDRkcmFmdC5kdGQKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2RvY3VtZW50YXRpb24veGRvY3MvZHRkL2phdmFkb2MtdjA0ZHJhZnQuZHRkCnJlbmFtZSB0byBzcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2R0ZC9qYXZhZG9jLXYwNGRyYWZ0LmR0ZApkaWZmIC0tZ2l0IGEvc3JjL2RvY3VtZW50YXRpb24veGRvY3MvZHRkL3NwZWNpZmljYXRpb24tdjExLmR0ZCBiL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvZHRkL3NwZWNpZmljYXRpb24tdjExLmR0ZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2RvY3VtZW50YXRpb24veGRvY3MvZHRkL3NwZWNpZmljYXRpb24tdjExLmR0ZApyZW5hbWUgdG8gc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9kdGQvc3BlY2lmaWNhdGlvbi12MTEuZHRkCmRpZmYgLS1naXQgYS9zcmMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kdGQvdG9kby12MTEuZHRkIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9kdGQvdG9kby12MTEuZHRkCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kdGQvdG9kby12MTEuZHRkCnJlbmFtZSB0byBzcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2R0ZC90b2RvLXYxMS5kdGQKZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaG93dG9idWlsZC54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2hvd3RvYnVpbGQueG1sCmluZGV4IDMwY2NhNjUuLjliOTliMjYgMTAwNjQ0Ci0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaG93dG9idWlsZC54bWwKKysrIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9ob3d0b2J1aWxkLnhtbApAQCAtNDYsNiArNDYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgPHRkPmpkZXBlbmQ8L3RkPgogICAgICAgICAgICAgICAgICAgICA8dGQ+aHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi9qZGVwZW5kL2phcnMvPC90ZD4KICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPnhhbGFuPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPmh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veGFsYW4vamFycy88L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgSnVzdCBwaWNrIHRoZSBsYXRlc3QgdmVyc2lvbnMgb2YgdGhlc2UgamFycyBhbmQgcGxhY2UKZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaHNzZi9jaGFydC54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2hzc2YvY2hhcnQueG1sCmluZGV4IDU1ZDJjODMuLjMzYjE3NGIgMTAwNjQ0Ci0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaHNzZi9jaGFydC54bWwKKysrIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9oc3NmL2NoYXJ0LnhtbApAQCAtNDc4LDcgKzQ3OCw3IEBACiAgICAgcmVjb3JkaWQgPSAweDEwMzQsIHNpemUgPTAKICAgICBbRU5EXQogICAgIFsvRU5EXQotCisgICAgICAgICAgICAgICAgPCEtLSAgYnJlYWsgLS0+CiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBPZmZzZXQgMHgxMDA2ICg0MTAyKQogICAgIHJlY3R5cGUgPSAweDEwNDQsIHJlY3NpemUgPSAweDQKQEAgLTgwMSw2ICs4MDEsNyBAQAogICAgICAgICAgICAgIC5jcm9zc2VzRmFyUmlnaHQgICAgICAgICAgPSBmYWxzZQogICAgICAgICAgICAgIC5yZXZlcnNlZCAgICAgICAgICAgICAgICAgPSBmYWxzZQogICAgIFsvQ0FUU0VSUkFOR0VdCisgICAgICAgICAgICAgICAgPCEtLSAgYnJlYWsgLS0+CiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIE9mZnNldCAweDExMjQgKDQzODgpCkBAIC0xMjIwLDcgKzEyMjEsNyBAQAogICAgIFtVTktOT1dOIFJFQ09SRF0KICAgICAgICAgLmlkICAgICAgICA9IDEwNGYKICAgICBbL1VOS05PV04gUkVDT1JEXQotCisgICAgICAgICAgICAgICAgPCEtLSAgYnJlYWsgLS0+CiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBPZmZzZXQgMHgxMmM0ICg0ODA0KQogICAgIHJlY3R5cGUgPSAweDEwNTEsIHJlY3NpemUgPSAweDgKZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaHNzZi9xdWljay1ndWlkZS54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2hzc2YvcXVpY2stZ3VpZGUueG1sCmluZGV4IGI1MjAzZDIuLjM5YTE3NTMgMTAwNjQ0Ci0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaHNzZi9xdWljay1ndWlkZS54bWwKKysrIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9oc3NmL3F1aWNrLWd1aWRlLnhtbApAQCAtMzEsNyArMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICA8bGk+PGxpbmsgaHJlZj0iI1JlYWRXcml0ZVdvcmtib29rIj5SZWFkaW5nIGFuZCB3cml0aW5nPC9saW5rPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgIDxsaT48bGluayBocmVmPSIjTmV3TGluZXNJbkNlbGxzIj5Vc2UgbmV3bGluZXMgaW4gY2VsbHMuPC9saW5rPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgIDxsaT48bGluayBocmVmPSIjRGF0YUZvcm1hdHMiPkNyZWF0ZSB1c2VyIGRlZmluZWQgZGF0YSBmb3JtYXRzLjwvbGluaz48L2xpPgotICAgICAgICAgICAgICAgICAgICA8bGk+PGxpbmsgaHJlZj0iI1ByaW50QXJlYSI+Rml0IHNoZWV0IHRvIG9uZSBwYWdlPC9saW5rPjwvbGk+CisgICAgICAgICAgICAgICAgICAgIDxsaT48bGluayBocmVmPSIjRml0VG8iPkZpdCBTaGVldCB0byBPbmUgUGFnZTwvbGluaz48L2xpPgogICAgICAgICAgICAgICAgICAgICA8bGk+PGxpbmsgaHJlZj0iI1ByaW50QXJlYTIiPlNldCBwcmludCBhcmVhIGZvciBhIHNoZWV0LjwvbGluaz48L2xpPgkJICAgIAogICAgICAgICAgICAgICAgICAgICA8bGk+PGxpbmsgaHJlZj0iI0Zvb3RlclBhZ2VOdW1iZXJzIj5TZXQgcGFnZSBudW1iZXJzIG9uIHRoZSBmb290ZXIgb2YgYSBzaGVldC48L2xpbms+PC9saT4KICAgICAgICAgICAgICAgICAgICAgPGxpPjxsaW5rIGhyZWY9IiNTaGlmdFJvd3MiPlNoaWZ0IHJvd3MuPC9saW5rPjwvbGk+CkBAIC00MjAsMTQgKzQyMCwxNCBAQAogICAgIGZpbGVPdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+CiAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9IlByaW50QXJlYSIvPgotICAgICAgICAgICAgICAgIDxzZWN0aW9uPjx0aXRsZT5TZXQgUHJpbnQgQXJlYSB0byBPbmUgUGFnZTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGFuY2hvciBpZD0iRml0VG8iLz4KKyAgICAgICAgICAgICAgICA8c2VjdGlvbj48dGl0bGU+Rml0IFNoZWV0IHRvIE9uZSBQYWdlPC90aXRsZT4KICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4KICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKCk7CiAgICAgSFNTRlNoZWV0IHNoZWV0ID0gd2IuY3JlYXRlU2hlZXQoImZvcm1hdCBzaGVldCIpOwotICAgIEhTU0ZQcmludFNldHVwIHBzID0gc2hlZXQuZ2V0UHJpbnRTZXR1cCgpCisgICAgSFNTRlByaW50U2V0dXAgcHMgPSBzaGVldC5nZXRQcmludFNldHVwKCk7CiAgICAgCi0gICAgc2hlZXQuc2V0QXV0b2JyZWFrcyh0cnVlKQorICAgIHNoZWV0LnNldEF1dG9icmVha3ModHJ1ZSk7CiAgICAgCiAgICAgcHMuc2V0Rml0SGVpZ2h0KChzaG9ydCkxKTsKICAgICBwcy5zZXRGaXRXaWR0aCgoc2hvcnQpMSk7CmRpZmYgLS1naXQgYS9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL2luZGV4LnhtbCBiL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaW5kZXgueG1sCmluZGV4IDI3NGViZjMuLjYzNDc0NWUgMTAwNjQ0Ci0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaW5kZXgueG1sCisrKyBiL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvaW5kZXgueG1sCkBAIC0xOCwxMSArMTgsMTUgQEAKICAgICA8c2VjdGlvbj48dGl0bGU+UHVycG9zZTwvdGl0bGU+CiAgICAgICA8cD4KICAgICAgIFRoZSBQT0kgcHJvamVjdCBjb25zaXN0cyBvZiBBUElzIGZvciBtYW5pcHVsYXRpbmcgdmFyaW91cyBmaWxlIGZvcm1hdHMKLSAgICAgIGJhc2VkIHVwb24gTWljcm9zb2Z0J3MgT0xFIDIgQ29tcG91bmQgRG9jdW1lbnQgZm9ybWF0IHVzaW5nIHB1cmUgSmF2YS4KKyAgICAgIGJhc2VkIHVwb24gTWljcm9zb2Z0J3MgT0xFIDIgQ29tcG91bmQgRG9jdW1lbnQgZm9ybWF0IHVzaW5nIHB1cmUgSmF2YS4gIEluIHNob3J0LCB5b3UgY2FuCisgICAgICByZWFkIGFuZCB3cml0ZSBNUyBFeGNlbCBmaWxlcyB1c2luZyBKYXZhLiAgU29vbiwgeW91J2xsIGJlIGFibGUgdG8gcmVhZCBhbmQgd3JpdGUgCisgICAgICBXb3JkIGZpbGVzIHVzaW5nIEphdmEuICBQT0kgaXMgeW91ciBKYXZhIEV4Y2VsIHNvbHV0aW9uIGFzIHdlbGwgYXMgeW91ciBXb3JkIEV4Y2VsIHNvbHV0aW9uLgorICAgICAgSG93ZXZlciwgd2UgaGF2ZSBhIGNvbXBsZXRlIEFQSSBmb3IgcG9ydGluZyBvdGhlciBPTEUgMiBDb21wb3VuZCBEb2N1bWVudCBmb3JtYXRzIGFuZCB3ZWxjb21lCisgICAgICBvdGhlcnMgdG8gcGFydGljaXBhdGUuCiAgICAgICA8L3A+CiAgICAgICA8cD4KICAgICAgIE9MRSAyIENvbXBvdW5kIERvY3VtZW50IEZvcm1hdCBiYXNlZCBmaWxlcyBpbmNsdWRlIG1vc3QgTWljcm9zb2Z0IE9mZmljZQotICAgICAgZmlsZXMgc3VjaCBhcyBYTFMgYW5kIERPQy4KKyAgICAgIGZpbGVzIHN1Y2ggYXMgWExTIGFuZCBET0MgYXMgd2VsbCBhcyBNRkMgc2VyaWFsaXphdGlvbiBBUEkgYmFzZWQgZmlsZSBmb3JtYXRzLgogICAgICAgPC9wPgogICAgICAgPHA+CiAgICAgICAgICBBcyBhIGdlbmVyYWwgcG9saWN5IHdlIHRyeSB0byBjb2xsYWJvcmF0ZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgcHJvamVjdHMgdG8KQEAgLTQ2LDcgKzUwLDcgQEAKIAkJd2Ugc2F5IHRoYXQgUE9JRlMgaXMgdGhlIG1vc3QgY29tcGxldGUgYW5kIGNvcnJlY3QgcG9ydCBvZiB0aGlzIGZpbGUgZm9ybWF0IHRvIGRhdGUhCiAgICAgICAgIDwvcD4KICAgICAgICAgPHA+Ci0JCVlvdSdkIHVzZSBIU1NGIGlmIHlvdSBuZWVkZWQgdG8gcmVhZCBvciB3cml0ZSBhbiBYTFMgKEV4Y2VsKSBmaWxlIHVzaW5nIEphdmEuIFlvdSBjYW4gYWxzbyByZWFkIGFuZCBtb2RpZnkKKwkJWW91J2QgdXNlIEhTU0YgaWYgeW91IG5lZWRlZCB0byByZWFkIG9yIHdyaXRlIGFuIEV4Y2VsIGZpbGUgdXNpbmcgSmF2YSAoWExTKS4gWW91IGNhbiBhbHNvIHJlYWQgYW5kIG1vZGlmeQogCQlzcHJlYWRzaGVldHMgdXNpbmcgdGhpcyBBUEksIGFsdGhvdWdoIHJpZ2h0IG5vdyB3cml0aW5nIGlzIG1vcmUgbWF0dXJlLgogICAgICAgICA8L3A+CiAgICAgICA8L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3NpdGUueG1sIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9zaXRlLnhtbAppbmRleCAwZDU3YjYwLi4wZjgwZGVmIDEwMDY0NAotLS0gYS9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3NpdGUueG1sCisrKyBiL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3Mvc2l0ZS54bWwKQEAgLTE2LDYgKzE2LDcgQEAKIAogPHNpdGUgbGFiZWw9IlBPSSIgaHJlZj0iIiB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvZm9ycmVzdC9saW5rbWFwLzEuMCI+CiAKKwogICAgIDxleHRlcm5hbC1yZWZzPgogICAgICAgICA8eG1sLmFwYWNoZS5vcmcgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnLyI+CiAgICAgICAgICAgICA8Zm9ycmVzdCBocmVmPSJmb3JyZXN0LyI+CkBAIC0zMSw3ICszMiw4IEBACiAgICAgICAgIDxqdW5pdCBocmVmPSJqdW5pdC9pbmRleC5odG1sIi8+CiAgICAgICAgIDxqZGVwZW5kIGhyZWY9ImpkZXBlbmQvaW5kZXguaHRtbCIvPgogICAgICAgICA8amF2YWRvYyBocmVmPSJhcGlkb2NzL2luZGV4Lmh0bWwiLz4KLQk8ZG93bmxvYWQgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1wb2kvIi8+CisgICAgICAgIDxkb3dubG9hZCBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLXBvaS8iLz4KKyAgICAgICAgPGNoYW5nZXMgaHJlZj0iY2hhbmdlcy5odG1sIi8+CiAgICAgPC9leHRlcm5hbC1yZWZzPgogCiA8L3NpdGU+CmRpZmYgLS1naXQgYS9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3N0YXR1cy54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3N0YXR1cy54bWwKaW5kZXggNmEyMTAwMi4uMmNmODE0YSAxMDA2NDQKLS0tIGEvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy9zdGF0dXMueG1sCisrKyBiL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3Mvc3RhdHVzLnhtbApAQCAtMSwxOCArMSwxOTEgQEAKIDw/eG1sIHZlcnNpb249IjEuMCI/PgogPHN0YXR1cz4KLSAgICA8ZGV2cz4KKyAgICA8ZGV2ZWxvcGVycz4KICAgICAgICAgPCEtLSBpbiBzdHJpY3QgYWxwaGFiZXRpY2FsIG9yZGVyIC0tPgogICAgICAgICA8cGVyc29uIGlkPSJBTyIgbmFtZT0iQW5kcmV3IEMuIE9saXZlciIgZW1haWw9ImFjb2xpdmVyMkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiLz4KICAgICAgICAgPHBlcnNvbiBpZD0iR1MiIG5hbWU9IkdsZW4gU3RhbXBvdWx0emlzIiBlbWFpbD0iZ3N0YW1wQGlwcmltdXMuY29tLmF1Ii8+CiAgICAgICAgIDxwZXJzb24gaWQ9Ik1KIiBuYW1lPSJNYXJjIEpvaG5zb24iIGVtYWlsPSJtam9obnNvbiBhdCBhcGFjaGUgZG90IG9yZyIvPgogICAgICAgICA8cGVyc29uIGlkPSJOS0IiIG5hbWU9Ik5pY29sYSBLZW4gQmFyb3p6aSIgZW1haWw9ImJhcm96emlAbmljb2xha2VuLmNvbSIvPgogICAgICAgICA8cGVyc29uIGlkPSJvcGVuIiBuYW1lPSJQb2kgRGV2ZWxvcGVycyIgZW1haWw9InBvaS1kZXZAamFrYXJ0YS5hcGFjaGUub3JnIi8+Ci0gICAgPC9kZXZzPgorICAgIDwvZGV2ZWxvcGVycz4KKworICAgIDxjaGFuZ2VzPgorCisgICAgICAgIDxyZWxlYXNlIHZlcmlvbj0iMi4wLVJDMSIgZGF0ZT0iMiBOb3ZlbWJlciAyMDAzIj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjEyNTYxIChNaW4pCUhTU0ZXb3JrYm9vayB0aHJvd3MgRXhjZXB0aW9uczwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTI3MzAgKE5vcikJdmFsdWVzIGRvbnQgZ2V0IGNvcGllZCB0byBhbm90aGVyIHNoZWV0LjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTMyMjQgKE1haikJRXhjZXB0aW9uIHRocm93biB3aGVuIGNlbGwgaGFzID1OYW1lcyBjYWxsPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4xMzc5NiAoTm9yKQlFcnJvciBSZWFkaW5nIEZvcm11bGEgUmVjb3JkIChvcHRpbWl6ZWQgaWYsIGV4dGVybmFsIGxpbmspPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4xMzkyMSAoTm9yKQlTaGVldCBuYW1lIGNhbm5vdCBleGNlZWQgMzEgY2hhcmFjdGVycyBhbmQgY2Fubm90IGNvbnRhaW4gOjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTQzMzAgKE5vcikJRXJyb3IgcmVhZGluZyBGb3JtdWxhUmVjb3JkPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4xNDQ2MCAoTm9yKQlOYW1lIGluIEZvcm11bGEgLSBBcnJheU91dE9mQm91bmRzRXhjZXB0aW9uPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4xNTIyOCAoQ3JpKQlbVXJnZW50XSBBcnJheUluZGV4b3V0b2Zib3VuZHMgRXhjZXB0aW9uLiBQT0kgLSBWZXJzaW9uIDEuODwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTY0ODggKE1haikJVW5hYmxlIHRvIG9wZW4gd3JpdHRlbiBzcHJlYWRzaGVldCBpbiBFeGNlbCwgYnV0IGNhbiBpbiBPcGVuPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4xNjU1OSAoTm9yKQl0ZXN0Q3VzdG9tUGFsZXR0ZS54bHMgY3Jhc2hlcyBFeGNlbCA5NzwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTY1NjAgKE5vcikJdGVzdEJvb2xFcnIueGxzIGNyYXNoZXMgRXhjZWwgJzk3PC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4xNzM3NCAoTWluKQlIU1NGRm9udCAtIEJPTERXRUlHSFRfTk9STUFMPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4xODgwMCAoTWFqKQlUaGUgc2hlZXQgbWFkZSBieSBIU1NGV29ya2Jvb2sjY2xvbmVTaGVldCgpIGRvZXNuJ3Qgd29yayBjb3I8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjE4ODQ2IChNaW4pCVtQQVRDSF1bUkZFXVJlZmFjdG9yIHRoZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGJ5dGUgYXJyYXkgYTwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTk1OTkgKE1pbikJamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTk5NjEgKE5vcikJW1BBVENIXSBTaGVldC5nZXRDb2x1bW5XaWR0aCgpIHJldHVybnMgd3JvbmcgdmFsdWU8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjIxMDY2IChCbG8pCUNhbiBub3QgbW9kaWZ5IGEgYmxhbmsgc3ByZWFkc2hlZXQ8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjIxNDQ0IChFbmgpCVtQQVRDSF0gTWFjcm8gZnVuY3Rpb25zPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4yMTQ0NyAoTm9yKQlbUkZFXVN0cmluZyBGb3JtdWxhIENlbGxzPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4yMTY3NCAoRW5oKQlbUEFUQ0hdIERvY3VtZW50YXRpb24gY2hhbmdlcyBmb3IgQChHcmVhdGVyfExlc3N8Tm90KUVxdWFsUHQ8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjIxODYzIChFbmgpCVtQQVRDSF0gYnVpbGQueG1sIGZpeGVzPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4yMjE5NSAoTm9yKQlbUkZFXSBbUEFUQ0hdIFN1cHBvcnQgZm9yIFN0b3JhZ2UgQ2xhc3MgSUQ8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjIyNzQyIChDcmkpCUZhaWxlZCB0byBjcmVhdGUgSFNTRldvcmtib29rITwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MjI5MjIgKENyaSkJSFNTRlNoZWV0LnNoaWZ0Um93cygpIHRocm93cyBqYXZhLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4yMjk2MyAoTm9yKQlvcmcuYXBhY2hlLnBvaS5ocHNmLlN1bW1hcnlJbmZvcm1hdGlvbi5nZXRFZGl0VGltZSgpIHNob3VsZDwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MjQxNDkgKE1haikJRXJyb3IgcGFzc2luZyBpbnB1dHN0cmVhbSB0byBQT0lGU0ZpbGVTeXN0ZW08L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjIxNzIyIChOb3IpCVtQQVRDSF0gQWRkIGEgUHJvdGVjdFJlY29yZCB0byBTaGVldHMgYW5kIGdpdmUgY29udHJvbCBvdmVyPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj45NTc2ICAoTm9yKSAJW1BBVENIXSBEQkNFTEwsIElOREVYIEVYVFNTVCAod2FzIEFjZXNzIDk3IGltcG9ydCk8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjEzNDc4IChCbG8pCVtQQVRDSF0gW1JGRV0gUE9JRlMsIFJhd0RhdGFCbG9jazogTWlzc2luZyB3b3JrYXJvdW5kIGZvciBsbzwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTQ4MjQgKE5vcikJVW5hYmxlIHRvIG1vZGlmeSBlbXB0eSBzaGVldHM8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPjEyODQzIChDcmkpCVtQQVRDSF0gTWFrZSBQT0kgaGFuZGxlIGNoaW5lc2UgYmV0dGVyPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj4xNTM1MyAoTm9yKQlbUkZFXSBjcmVhdGluZyBhIGNlbGwgd2l0aCBhIGh5cGVybGluazwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+MTUzNzUgKEJsbykJUG9zdCAxLjUuMSBQT0kgY2F1c2VzIHNwcmVhZHNoZWV0IHRvIGJlY29tZSB1bm9wZW5hYmxlLjwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisKKyAgICAgICAgPHJlbGVhc2UgdmVyc2lvbj0iMi4wLXByZTMiIGRhdGU9IjI5IEp1bHkgMjAwMyI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCIgY29udGV4dD0iQWxsIj5IUFNGIGlzIG5vdyBhYmxlIHRvIHJlYWQgcHJvcGVydGllcyB3aGljaCBhcmUgZ2l2ZW4gaW4gdGhlIHByb3BlcnR5IHNldCBzdHJlYW0gYnV0IHdoaWNoIGRvbid0IGhhdmUgYSB2YWx1ZSAoInZhcmlhbnQiIHR5cGUgVlRfRU1QVFkpLiBUaGUgZ2V0WFhYKCkgbWV0aG9kcyBvZiB0aGUgUHJvcGVydHlTZXQgY2xhc3MgcmV0dXJuIG51bGwgaWYgdGhlaXIgcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UgKGxpa2UgYSBzdHJpbmcpIG9yIDAgaWYgdGhlIHJldHVybiB0eXBlIGlzIG51bWVyaWMuIERldGFpbHMgYWJvdXQgdGhlIHJldHVybiB0eXBlcyBhbmQgYWJvdXQgaG93IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBwcm9wZXJ0eSB2YWx1ZSBvZiB6ZXJvIGFuZCBhIHByb3BlcnR5IHZhbHVlIHRoYXQgaXMgbm90IHByZXNlbnQgY2FuIGJlIGZvdW5kIGluIHRoZSBBUEkgZG9jdW1lbnRhdGlvbi48L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPkdyaWRsaW5lcyBjYW4gbm93IGJlIHR1cm5lZCBvbiBhbmQgb2ZmPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj5OYW1lUFRHIHJlZmFjdG9yaW5nL2ZpeGVzPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj5taW5vciBmaXhlcyB0byBFeHRlcm5TaGVldCBhbmQgZm9ybXVsYSBzdHJpbmdzPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj5TaGVldCBjb21wYXJpc29ucyBub3cgaWdub3JlIGNhc2U8L2FjdGlvbj4KKyAgICAgICAgPC9yZWxlYXNlPgorCisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjIuMC1wcmUyIiBkYXRlPSI2IEp1bHkgMjAwMyI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIiA+QSBuYXN0eSBjb25jdXJyZW5jeSBwcm9ibGVtIGhhcyBiZWVuIGZpeGVkLiBBbnkgdXNlcnMgd29ya2luZyBpbiBhIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQgc2hvdWxkIHNlcmlvdXNseSBjb25zaWRlciB1cGdyYWRpbmcgdG8gdGhpcyByZWxlYXNlLjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+VGhlIEVYVFNTVCByZWNvcmQgaGFzIGJlZW4gaW1wbGVtZW50ZWQuIFRoaXMgcmVjb3JkIGlzIHVzZWQgYnkgZXhjZWwgZm9yIG9wdGltaXplZCByZWFkaW5nIG9mIHN0cmluZ3MuPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5XaGVuIHJvd3MgYXJlIHNoaWZ0ZWQsIHRoZSBtZXJnZWQgcmVnaW9ucyBub3cgbW92ZSB3aXRoIHRoZW0uIElmIGEgcm93IGNvbnRhaW5zIDIgbWVyZ2VkIGNlbGxzLCB0aGUgcmVzdWx0aW5nIHNoaWZ0ZWQgcm93IHNob3VsZCBoYXZlIHRob3NlIGNlbGxzIG1lcmdlZCBhcyB3ZWxsLjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+VGhlcmUgd2VyZSBzb21lIGlzc3VlcyB3aGVuIHJlbW92aW5nIG1lcmdlZAorCQkgICAgcmVnaW9ucyAoc3BlY2lmaWNhbGx5LCByZW1vdmluZyBhbGwgb2YgdGhlbSBhbmQgdGhlbiBhZGRpbmcgc29tZSBtb3JlKSBhbmQgaGF2ZSBiZWVuIHJlc29sdmVkLjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+V2hlbiBhIHNoZWV0IGNvbnRhaW5lZCBzaGFyZWQgZm9ybXVsYXMgKHdoZW4gYSBmb3JtdWxhIGlzCisJCSAgICBkcmFnZ2VkIGFjcm9zcyBncmVhdGVyIHRoYW4gNiBjZWxscyksIHRoZSBjbG9uZSB3b3VsZCBmYWlsLiBXZSBub3cgc3VwcG9ydCBjbG9uaW5nIG9mIAorCQkgICAgc2hlZXRzIHRoYXQgY29udGFpbiB0aGlzIEV4Y2VsIG9wdGltaXphdGlvbi4gPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCIgY29udGV4dD0iQWxsIj5TdXBwb3J0IGFkZGVkIGZvciByZWFkaW5nIGZvcm11bGFzIHdpdGggVW5hcnlQbHVzIGFuZCBVbmFyeU1pbnVzIG9wZXJhdG9ycy48L2FjdGlvbj4KKyAgICAgICAgPC9yZWxlYXNlPgorICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIyLjAtcHJlMSIgZGF0ZT0iMTcgTWF5IDIwMDMiPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiIGNvbnRleHQ9IkFsbCI+UGF0Y2ggYXBwbGllZCBmb3IgZGVlcCBjbG9uaW5nIG9mIHdvcmtzaGVldHMgd2FzIHByb3ZpZGVkPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCIgY29udGV4dD0iQWxsIj5QYXRjaCBhcHBsaWVkIHRvIGFsbG93IHNoZWV0IHJlb3JkZXJpbmc8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIiBjb250ZXh0PSJBbGwiPkFkZGVkIGFkZGl0aW9uYWwgcHJpbnQgYXJlYSBzZXR0aW5nIG1ldGhvZHMgdXNpbmcgcm93L2NvbHVtbiBudW1iZXJzPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj5IREY6ICBOZWdhdGl2ZSBBcnJheSBzaXplIGZpeDwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+QWRkZWQgYXJndW1lbnQgcG9pbnRlcnMgdG8gc3VwcG9ydCB0aGUgSUYgZm9ybXVsYTwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+Rm9ybXVsYXM6IEFkZGVkIHNwZWNpYWwgY2hhcmFjdGVyIHN1cHBvcnQgZm9yIHN0cmluZyBsaXRlcmFscywgc3BlY2lmaWNhbGx5IGZvciBTVU1JRiBmb3JtdWxhIHN1cHBvcnQgYW5kIGFkZHJlc3NlcyBhIGJ1ZyBhcyB3ZWxsPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj5CbG9ja2luZ0lucHV0U3RyZWFtIGNvbW1pdHRlZCB0byBoZWxwIGVuc3VyZSByZWFkczwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+Rml4ZWQgcHJvYmxlbSB3aXRoIE5hTiB2YWx1ZXMgZGlmZmVyaW5nIGZyb20gdGhlIGludmVzdGlnYXRlZCB2YWx1ZSBmcm9tIGZpbGUgcmVhZHMgaW4gRm9ybXVsYVJlY29yZHM8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPlBhdGNoIGZvciBnZXRDb2x1bW5XaWR0aCBpbiBIU1NGPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCIgY29udGV4dD0iQWxsIj5QYXRjaCBmb3IgZGVhbGluZyB3aXRoIG11bHQtbGV2ZWwgbnVtYmVyZWQgbGlzdHMgaW4gSERGPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj5EdWUgdG8gbmFtZWQgcmVmZXJlbmNlIHdvcmssIHNldmVyYWwgbmFtZWQtcmFuZ2VkIGJ1Z3Mgd2VyZSBjbG9zZWQ8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPlBhdGNoIGFwcGxpZWQgdG8gcHJldmVudCBzaGVldCBjb3JydXB0aW9uIGFmdGVyIGEgdGVtcGxhdGUgbW9kaWZpY2F0aW9uPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5TaGFyZWQgRm9ybXVsYXMgbm93IFN1cHBvcnRlZDwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+QWRkZWQgR3JlYXRlckVxdWFsLCBMZXNzRXF1YWwgYW5kIE5vdEVxdWFsIHRvIEZvcm11bGEgUGFyc2VyPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5BZGRlZCBHcmVhdGVyVGhhbiBhbmQgTGVzc1RoYW4gZnVuY3Rpb25hbGl0eSB0byBmb3JtdWxhczwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiIGNvbnRleHQ9IkFsbCI+UGF0Y2hlcyBmb3IgaTEwbjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+UE9JIEJ1aWxkIFN5c3RlbSBVcGRhdGVkPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj5mb250IG5hbWVzIGNhbiBub3cgYmUgbnVsbDwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMTAtZGV2IiBkYXRlPSIxOSBGZWIgMjAwMyI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCIgY29udGV4dD0iQWxsIj5TdXBwb3J0IGZvciB6b29tIGxldmVsPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCIgY29udGV4dD0iQWxsIj5GcmVlemUgYW5kIHNwbGl0IHBhbmUgc3VwcG9ydDwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiIGNvbnRleHQ9IkFsbCI+Um93IGFuZCBjb2x1bW4gaGVhZGVycyBvbiBwcmludG91dHM8L2FjdGlvbj4KKyAgICAgICAgPC9yZWxlYXNlPgorICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjgtZGV2IiBkYXRlPSIyMCBTZXAgMjAwMiI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCIgY29udGV4dD0iQWxsIj5DdXN0b20gRGF0YSBGb3JtYXQgU3VwcG9ydDwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiIGNvbnRleHQ9IkFsbCI+RW5oYW5jZWQgVW5pY29kZSBTdXBwb3J0IGZvciBSdXNzaWFuIGFuZCBKYXBhbmVzZTwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiIGNvbnRleHQ9IkFsbCI+RW5oYW5jZWQgZm9ybXVsYSBzdXBwb3J0IGluY2x1ZGluZyByZWFkLW9ubHkgZm9yCisgICAgICAgICAgICAgICAgIm9wdGltaXplZCBpZiIgc3RhdGVtZW50cy48L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIiBjb250ZXh0PSJBbGwiPlN1cHBvcnQgZm9yIGNsb25pbmcgb2JqZWN0czwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiIGNvbnRleHQ9IkFsbCI+Rml4ZXMgZm9yIGhlYWRlci9mb290ZXI8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIiBjb250ZXh0PSJBbGwiPlNwYW5pc2ggRG9jdW1lbnRhdGlvbiB0cmFuc2xhdGlvbnM8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIiBjb250ZXh0PSJBbGwiPlN1cHBvcnQgZm9yIHByZXNlcnZpbmcgVkJBIG1hY3JvczwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjEuNy1kZXYiIGRhdGU9Ij8/PyI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iTktCIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+UmVtb3ZlZCBydW50aW1lIGRlcGVuZGVuY3kgb24gY29tbW9ucyBsb2dnaW5nLjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+Rm9ybXVsYSBzdXBwb3J0PC9hY3Rpb24+CisgICAgICAgIDwvcmVsZWFzZT4KKyAgICAgICAgPHJlbGVhc2UgdmVyc2lvbj0iMS41LjEiIGRhdGU9IjE2IEp1bmUgMjAwMiI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iR0pTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+UmVtb3ZlZCBkZXBlZGVuY3kgb24gY29tbW9ucyBsb2dnaW5nLiAgTm93IGRlZmluZSBwb2kubG9nZ2luZyBzeXN0ZW0gcHJvcGVydHkgdG8gZW5hYmxlIGxvZ2dpbmcgdG8gc3RhbmRhcmQgb3V0LjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IkdKUyIgdHlwZT0iZml4IiBjb250ZXh0PSJBbGwiPkZpeGVkIFNTVCBzdHJpbmcgaGFuZGxpbmcgc28gdGhhdCBzcHJlYWRzaGVldHMgd2l0aCByaWNoIHRleHQgb3IgZXh0ZW5kZWQgdGV4dCB3aWxsIGJlIHJlYWQgY29ycmVjdGx5LjwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjEuNSIgZGF0ZT0iMDYgTWF5IDIwMDIiPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9Ik5LQiIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPk5ldyBwcm9qZWN0IGJ1aWxkLjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9Ik5LQiIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPk5ldyBwcm9qZWN0IGRvY3VtZW50YXRpb24gc3lzdGVtIGJhc2VkIG9uIENvY29vbi48L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPlBhY2thZ2UgcmVuYW1lPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImZpeCIgY29udGV4dD0iQWxsIj5WYXJpb3VzIGJ1ZyBmaXhlczwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiIGNvbnRleHQ9IkFsbCI+RWFybHkgc3RhZ2VzIG9mIEhTRiBkZXZlbG9wbWVudCAobm90IHJlYWR5IGZvciBkZXZlbG9wbWVudCk8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIiBjb250ZXh0PSJBbGwiPkluaXRpYWwgbG93IGxldmVsIHJlY29yZCBzdXBwb3J0IGZvciBjaGFydGluZyAobm90IGNvbXBsZXRlKTwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMS4wIiBkYXRlPSJSZWxlYXNlIGRhdGUgbm90IHJlY29yZGVkIj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPkNyZWF0ZWQgbmV3IGV2ZW50IG1vZGVsPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5PcHRpbWl6YXRpb25zIG1hZGUgdG8gSFNTRiBpbmNsdWRpbmcgYWdncmVnYXRlIHJlY29yZHMgZm9yCisgICAgICAgICAgICAgICAgdmFsdWVzLCByb3dzLCBldGMuPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5wcmVkaWN0aXZlIHNpemluZywgb2Zmc2V0IGJhc2VkIHdyaXRpbmcgKGluc3RlYWQgb2YgbG90cyBvZgorICAgICAgICAgICAgICAgIGFycmF5IGNvcGllcyk8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPm1pbm9yIHJlLWZhY3RvcmluZyBhbmQgYnVnIGZpeGVzLjwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMC4wIiBkYXRlPSJSZWxlYXNlIGRhdGUgbm90IHJlY29yZGVkIj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPk1pbm9yIGRvY3VtZW50YXRpb24gdXBkYXRlcy48L2FjdGlvbj4KKyAgICAgICAgPC9yZWxlYXNlPgorICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjE0LjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+QWRkZWQgRGF0YUZvcm1hdCBoZWxwZXIgY2xhc3MgYW5kIGV4cG9zZWQgc2V0IGFuZCBnZXQgZm9ybWF0CisgICAgICAgICAgICAgICAgb24gSFNTRkNlbGxTdHlsZTwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+Rml4ZWQgY29sdW1uIHdpZHRoIGFwaXMgKHVuaXQgd2lzZSkgYW5kIHZhcmlvdXMgamF2YWRvYyBvbgorICAgICAgICAgICAgICAgIHRoZSBzdWJqZWN0PC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5GaXggZm9yIERpbWVuc2lvbnMgcmVjb3JkIChhZ2FpbikuLi4gKG9uZSBvZiB0aGVzZSBkYXlzIEknbGwKKyAgICAgICAgICAgICAgICB3cml0ZSBhIHVuaXQgdGVzdCBmb3IgdGhpcyA7LXApLjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+U29tZSBvcHRpbWl6YXRpb24gb24gc2hlZXQgY3JlYXRpb24uPC9hY3Rpb24+CisgICAgICAgIDwvcmVsZWFzZT4KKyAgICAgICAgPHJlbGVhc2UgdmVyc2lvbj0iMC4xMy4wIiBkYXRlPSJSZWxlYXNlIGRhdGUgbm90IHJlY29yZGVkIj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPkNoYW5nZXMgbm90IHJlY29yZGVkLjwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjAuMTIuMCIgZGF0ZT0iUmVsZWFzZSBkYXRlIG5vdCByZWNvcmRlZCI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5BZGRlZCBNdWxCbGFuaywgQmxhbmssIENvbEluZm88L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPkFkZGVkIGxvZzRqIGZhY2lsaXR5IGFuZCByZW1vdmVkIGFsbCBzeXMub3V0IHR5cGUgbG9nZ2luZzwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+QWRkZWQgc3VwcG9ydCBmb3IgYWRkaW5nIGZvbnQncywgc3R5bGVzIGFuZCBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgaGlnaCBsZXZlbCBhcGkgZm9yIHN0eWxpbmcgY2VsbHM8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPmFkZGVkIHN1cHBvcnQgZm9yIGNoYW5naW5nIHJvdyBoZWlnaHQsIGNlbGwgd2lkdGggYW5kIGRlZmF1bHQKKyAgICAgICAgICAgICAgICByb3cgaGVpZ2h0L2NlbGwgd2lkdGguPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5BZGRlZCBmaXhlcyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKFVURi0xNiBzaG91bGQgd29yayBub3cKKyAgICAgICAgICAgICAgICBmcm9tIEhTU0ZDZWxsLnNldFN0cmluZ1ZhbHVlLCBldGMgd2hlbiB0aGUgZW5jb2RpbmcgaXMgc2V0KTwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+YWRkZWQgc3VwcG9ydCBmb3IgYWRkaW5nL3JlbW92aW5nIGFuZCBuYW1pbmcgc2hlZXRzLjwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjAuMTEuMCIgZGF0ZT0iUmVsZWFzZSBkYXRlIG5vdCByZWNvcmRlZCI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5CdWdmaXggcmVsZWFzZS4gV2Ugd2VyZSB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hlbiByZWFkaW5nCisgICAgICAgICAgICAgICAgUktSZWNvcmQgb2JqZWN0cy48L2FjdGlvbj4KKyAgICAgICAgPC9yZWxlYXNlPgorICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjEwLjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+R290IGNvbnRpbnVhdGlvbiByZWNvcmRzIHRvIHdvcmsgKHJlYWQvd3JpdGUpPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5BZGRlZCB2YXJpb3VzIHByZS1zdXBwb3J0IGZvciBmb3JtdWxhczwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+TWFzc2l2ZSBBUEkgcmVvcmdhbml6YXRpb24sIHJlcGFja2FnaW5nLjwvYWN0aW9uPgorICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiIGNvbnRleHQ9IkFsbCI+QmlmZlZpZXdlciBjbGFzcyBhZGRlZCBmb3IgdmFsaWRhdGluZyBIU1NGICZhbXA7IFBPSSBhbmQvb3IKKyAgICAgICAgICAgICAgICBIU1NGIE91dHB1dC48L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPkJldHRlciBBUEkgc3VwcG9ydCBmb3IgbW9kaWZpY2F0aW9uLjwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisgICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjAuNyAoYW5kIGludGVyaW0gcmVsZWFzZXMpIiBkYXRlPSJSZWxlYXNlIGRhdGUgbm90IHJlY29yZGVkIj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPkFkZGVkIGVuY29kaW5nIGZsYWcgdG8gaGlnaCBhbmQgbG93IGxldmVsIGFwaSB0byB1c2UgdXRmLTE2CisgICAgICAgICAgICAgICAgd2hlbiBuZWVkZWQgKEhTU0ZDZWxsLnNldEVuY29kaW5nKCkpPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5hZGRlZCByZWFkIG9ubHkgc3VwcG9ydCBmb3IgTGFiZWwgcmVjb3JkcyAod2hpY2ggYXJlCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRlZCBhcyBMYWJlbFNTVCB3aGVuIHdyaXR0ZW4pPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5Ccm9rZW4gY29udGludWF0aW9uIHJlY29yZCBpbXBsZW1lbnRhdGlvbiAob29wcyk8L2FjdGlvbj4KKyAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0idXBkYXRlIiBjb250ZXh0PSJBbGwiPkJpZmZWaWV3ZXIgY2xhc3MgYWRkZWQgZm9yIHZhbGlkYXRpbmcgSFNTRiAmYW1wOyBQT0kgYW5kL29yCisgICAgICAgICAgICAgICAgSFNTRiBPdXRwdXQuPC9hY3Rpb24+CisgICAgICAgIDwvcmVsZWFzZT4KKyAgICAgICAgPHJlbGVhc2UgdmVyc2lvbj0iMC42IChyZWxlYXNlKSIgZGF0ZT0iUmVsZWFzZSBkYXRlIG5vdCByZWNvcmRlZCI+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5TdXBwb3J0IGZvciByZWFkL3dyaXRlIGFuZCBtb2RpZnkuPC9hY3Rpb24+CisgICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSIgY29udGV4dD0iQWxsIj5SZWFkIG9ubHkgc3VwcG9ydCBmb3IgTXVsUksgcmVjb3JkcyAoY29udmVydGVkIHRvIE51bWJlciB3aGVuCisgICAgICAgICAgICAgICAgd3JpdGluZykKKyAgICAgICAgICAgIDwvYWN0aW9uPgorICAgICAgICA8L3JlbGVhc2U+CisKKyAgICA8L2NoYW5nZXM+CisKIAogICAgIDx0b2RvPgotICAgICAgICA8dGl0bGU+VGhpbmdzIFRvIERvIGZvciBQT0k8L3RpdGxlPgorPCEtLSAgICAgICAgPHRpdGxlPlRoaW5ncyBUbyBEbyBmb3IgUE9JPC90aXRsZT4tLT4KIAotICAgICAgICA8YWN0aW9ucyBwcmlvcml0eT0iaGlnaCI+CisgICAgICAgIDxhY3Rpb25zIGNvbnRleHQ9ImFsbCIgcHJpb3JpdHk9ImhpZ2giPgogICAgICAgICAgICAgPGFjdGlvbiBjb250ZXh0PSJjb2RlIiBkZXY9Ik5LQiI+CiAgICAgICAgICAgICAgICAgRmluaXNoIEhERgogICAgICAgICAgICAgPC9hY3Rpb24+CkBAIC0yNCw3ICsxOTcsNyBAQAogICAgICAgICAgICAgPC9hY3Rpb24+CiAgICAgICAgIDwvYWN0aW9ucz4KIAotICAgICAgICA8YWN0aW9ucyBwcmlvcml0eT0ibWVkaXVtIj4KKyAgICAgICAgPGFjdGlvbnMgY29udGV4dD0iYWxsIiBwcmlvcml0eT0ibWVkaXVtIj4KICAgICAgICAgICAgIDxhY3Rpb24gY29udGV4dD0iY29kZSIgZGV2PSJvcGVuIj4KICAgICAgICAgICAgICAgICBFeHBvc2UgZnVuY3Rpb25hbGl0eSBpbiBsb3cgbGV2ZWwgcmVjb3JkcyBpbiBoaWdoZXIgbGV2ZWwgQVBJCiAgICAgICAgICAgICA8L2FjdGlvbj4KQEAgLTUwLDEwMyArMjIzLDQgQEAKIAogICAgIDwvdG9kbz4KIAotICAgIDxjaGFuZ2VzPgotCi0gICAgICAgIDx0aXRsZT5IaXN0b3J5IG9mIENoYW5nZXM8L3RpdGxlPgotCi0gICAgICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMTAtZGV2IiBkYXRlPSIxOSBGZWIgMjAwMyI+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+U3VwcG9ydCBmb3Igem9vbSBsZXZlbDwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPkZyZWV6ZSBhbmQgc3BsaXQgcGFuZSBzdXBwb3J0PC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+Um93IGFuZCBjb2x1bW4gaGVhZGVycyBvbiBwcmludG91dHM8L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjgtZGV2IiBkYXRlPSIyMCBTZXAgMjAwMiI+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+Q3VzdG9tIERhdGEgRm9ybWF0IFN1cHBvcnQ8L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5FbmhhbmNlZCBVbmljb2RlIFN1cHBvcnQgZm9yIFJ1c3NpYW4gYW5kIEphcGFuZXNlPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+RW5oYW5jZWQgZm9ybXVsYSBzdXBwb3J0IGluY2x1ZGluZyByZWFkLW9ubHkgZm9yCi0gICAgICAgICAgICAgICAgIm9wdGltaXplZCBpZiIgc3RhdGVtZW50cy48L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5TdXBwb3J0IGZvciBjbG9uaW5nIG9iamVjdHM8L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5GaXhlcyBmb3IgaGVhZGVyL2Zvb3RlcjwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPlNwYW5pc2ggRG9jdW1lbnRhdGlvbiB0cmFuc2xhdGlvbnM8L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5TdXBwb3J0IGZvciBwcmVzZXJ2aW5nIFZCQSBtYWNyb3M8L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjctZGV2IiBkYXRlPSI/Pz8iPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9Ik5LQiIgdHlwZT0idXBkYXRlIj5SZW1vdmVkIHJ1bnRpbWUgZGVwZW5kZW5jeSBvbiBjb21tb25zIGxvZ2dpbmcuPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSI+Rm9ybXVsYSBzdXBwb3J0PC9hY3Rpb24+Ci0gICAgICAgIDwvcmVsZWFzZT4KLSAgICAgICAgPHJlbGVhc2UgdmVyc2lvbj0iMS41LjEiIGRhdGU9IjE2IEp1bmUgMjAwMiI+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iR0pTIiB0eXBlPSJ1cGRhdGUiPlJlbW92ZWQgZGVwZWRlbmN5IG9uIGNvbW1vbnMgbG9nZ2luZy4gIE5vdyBkZWZpbmUgcG9pLmxvZ2dpbmcgc3lzdGVtIHByb3BlcnR5IHRvIGVuYWJsZSBsb2dnaW5nIHRvIHN0YW5kYXJkIG91dC48L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJHSlMiIHR5cGU9ImZpeCI+Rml4ZWQgU1NUIHN0cmluZyBoYW5kbGluZyBzbyB0aGF0IHNwcmVhZHNoZWV0cyB3aXRoIHJpY2ggdGV4dCBvciBleHRlbmRlZCB0ZXh0IHdpbGwgYmUgcmVhZCBjb3JyZWN0bHkuPC9hY3Rpb24+Ci0gICAgICAgIDwvcmVsZWFzZT4KLSAgICAgICAgPHJlbGVhc2UgdmVyc2lvbj0iMS41IiBkYXRlPSIwNiBNYXkgMjAwMiI+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iTktCIiB0eXBlPSJ1cGRhdGUiPk5ldyBwcm9qZWN0IGJ1aWxkLjwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9Ik5LQiIgdHlwZT0idXBkYXRlIj5OZXcgcHJvamVjdCBkb2N1bWVudGF0aW9uIHN5c3RlbSBiYXNlZCBvbiBDb2Nvb24uPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSI+UGFja2FnZSByZW5hbWU8L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iZml4Ij5WYXJpb3VzIGJ1ZyBmaXhlczwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPkVhcmx5IHN0YWdlcyBvZiBIU0YgZGV2ZWxvcG1lbnQgKG5vdCByZWFkeSBmb3IgZGV2ZWxvcG1lbnQpPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+SW5pdGlhbCBsb3cgbGV2ZWwgcmVjb3JkIHN1cHBvcnQgZm9yIGNoYXJ0aW5nIChub3QgY29tcGxldGUpPC9hY3Rpb24+Ci0gICAgICAgIDwvcmVsZWFzZT4KLSAgICAgICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4xLjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5DcmVhdGVkIG5ldyBldmVudCBtb2RlbDwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5PcHRpbWl6YXRpb25zIG1hZGUgdG8gSFNTRiBpbmNsdWRpbmcgYWdncmVnYXRlIHJlY29yZHMgZm9yCi0gICAgICAgICAgICAgICAgdmFsdWVzLCByb3dzLCBldGMuPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPnByZWRpY3RpdmUgc2l6aW5nLCBvZmZzZXQgYmFzZWQgd3JpdGluZyAoaW5zdGVhZCBvZiBsb3RzIG9mCi0gICAgICAgICAgICAgICAgYXJyYXkgY29waWVzKTwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5taW5vciByZS1mYWN0b3JpbmcgYW5kIGJ1ZyBmaXhlcy48L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAuMCIgZGF0ZT0iUmVsZWFzZSBkYXRlIG5vdCByZWNvcmRlZCI+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPk1pbm9yIGRvY3VtZW50YXRpb24gdXBkYXRlcy48L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjE0LjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5BZGRlZCBEYXRhRm9ybWF0IGhlbHBlciBjbGFzcyBhbmQgZXhwb3NlZCBzZXQgYW5kIGdldCBmb3JtYXQKLSAgICAgICAgICAgICAgICBvbiBIU1NGQ2VsbFN0eWxlPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkZpeGVkIGNvbHVtbiB3aWR0aCBhcGlzICh1bml0IHdpc2UpIGFuZCB2YXJpb3VzIGphdmFkb2Mgb24KLSAgICAgICAgICAgICAgICB0aGUgc3ViamVjdDwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5GaXggZm9yIERpbWVuc2lvbnMgcmVjb3JkIChhZ2FpbikuLi4gKG9uZSBvZiB0aGVzZSBkYXlzIEknbGwKLSAgICAgICAgICAgICAgICB3cml0ZSBhIHVuaXQgdGVzdCBmb3IgdGhpcyA7LXApLjwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5Tb21lIG9wdGltaXphdGlvbiBvbiBzaGVldCBjcmVhdGlvbi48L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjEzLjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5DaGFuZ2VzIG5vdCByZWNvcmRlZC48L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjEyLjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5BZGRlZCBNdWxCbGFuaywgQmxhbmssIENvbEluZm88L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+QWRkZWQgbG9nNGogZmFjaWxpdHkgYW5kIHJlbW92ZWQgYWxsIHN5cy5vdXQgdHlwZSBsb2dnaW5nPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkFkZGVkIHN1cHBvcnQgZm9yIGFkZGluZyBmb250J3MsIHN0eWxlcyBhbmQgY29ycmVzcG9uZGluZwotICAgICAgICAgICAgICAgIGhpZ2ggbGV2ZWwgYXBpIGZvciBzdHlsaW5nIGNlbGxzPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPmFkZGVkIHN1cHBvcnQgZm9yIGNoYW5naW5nIHJvdyBoZWlnaHQsIGNlbGwgd2lkdGggYW5kIGRlZmF1bHQKLSAgICAgICAgICAgICAgICByb3cgaGVpZ2h0L2NlbGwgd2lkdGguPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkFkZGVkIGZpeGVzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAoVVRGLTE2IHNob3VsZCB3b3JrIG5vdwotICAgICAgICAgICAgICAgIGZyb20gSFNTRkNlbGwuc2V0U3RyaW5nVmFsdWUsIGV0YyB3aGVuIHRoZSBlbmNvZGluZyBpcyBzZXQpPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPmFkZGVkIHN1cHBvcnQgZm9yIGFkZGluZy9yZW1vdmluZyBhbmQgbmFtaW5nIHNoZWV0cy48L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjExLjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5CdWdmaXggcmVsZWFzZS4gV2Ugd2VyZSB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hlbiByZWFkaW5nCi0gICAgICAgICAgICAgICAgUktSZWNvcmQgb2JqZWN0cy48L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjEwLjAiIGRhdGU9IlJlbGVhc2UgZGF0ZSBub3QgcmVjb3JkZWQiPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5Hb3QgY29udGludWF0aW9uIHJlY29yZHMgdG8gd29yayAocmVhZC93cml0ZSk8L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+QWRkZWQgdmFyaW91cyBwcmUtc3VwcG9ydCBmb3IgZm9ybXVsYXM8L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+TWFzc2l2ZSBBUEkgcmVvcmdhbml6YXRpb24sIHJlcGFja2FnaW5nLjwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5CaWZmVmlld2VyIGNsYXNzIGFkZGVkIGZvciB2YWxpZGF0aW5nIEhTU0YgJmFtcDsgUE9JIGFuZC9vcgotICAgICAgICAgICAgICAgIEhTU0YgT3V0cHV0LjwvYWN0aW9uPgotICAgICAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5CZXR0ZXIgQVBJIHN1cHBvcnQgZm9yIG1vZGlmaWNhdGlvbi48L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotICAgICAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjcgKGFuZCBpbnRlcmltIHJlbGVhc2VzKSIgZGF0ZT0iUmVsZWFzZSBkYXRlIG5vdCByZWNvcmRlZCI+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkFkZGVkIGVuY29kaW5nIGZsYWcgdG8gaGlnaCBhbmQgbG93IGxldmVsIGFwaSB0byB1c2UgdXRmLTE2Ci0gICAgICAgICAgICAgICAgd2hlbiBuZWVkZWQgKEhTU0ZDZWxsLnNldEVuY29kaW5nKCkpPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPmFkZGVkIHJlYWQgb25seSBzdXBwb3J0IGZvciBMYWJlbCByZWNvcmRzICh3aGljaCBhcmUKLSAgICAgICAgICAgICAgICByZWludGVycHJldGVkIGFzIExhYmVsU1NUIHdoZW4gd3JpdHRlbik8L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+QnJva2VuIGNvbnRpbnVhdGlvbiByZWNvcmQgaW1wbGVtZW50YXRpb24gKG9vcHMpPC9hY3Rpb24+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkJpZmZWaWV3ZXIgY2xhc3MgYWRkZWQgZm9yIHZhbGlkYXRpbmcgSFNTRiAmYW1wOyBQT0kgYW5kL29yCi0gICAgICAgICAgICAgICAgSFNTRiBPdXRwdXQuPC9hY3Rpb24+Ci0gICAgICAgIDwvcmVsZWFzZT4KLSAgICAgICAgPHJlbGVhc2UgdmVyc2lvbj0iMC42IChyZWxlYXNlKSIgZGF0ZT0iUmVsZWFzZSBkYXRlIG5vdCByZWNvcmRlZCI+Ci0gICAgICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPlN1cHBvcnQgZm9yIHJlYWQvd3JpdGUgYW5kIG1vZGlmeS48L2FjdGlvbj4KLSAgICAgICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+UmVhZCBvbmx5IHN1cHBvcnQgZm9yIE11bFJLIHJlY29yZHMgKGNvbnZlcnRlZCB0byBOdW1iZXIgd2hlbgotICAgICAgICAgICAgICAgIHdyaXRpbmcpCi0gICAgICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgPC9yZWxlYXNlPgotCi0gICAgPC9jaGFuZ2VzPgotCi08L3N0YXR1cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L3N0YXR1cz4KZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvdGFicy54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3RhYnMueG1sCmluZGV4IDc2MWNmNDkuLjdhNGIxODkgMTAwNjQ0Ci0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvdGFicy54bWwKKysrIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy90YWJzLnhtbApAQCAtMSw5ICsxLDkgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CiA8IURPQ1RZUEUgdGFicyBQVUJMSUMgIi0vL0FQQUNIRS8vRFREIENvY29vbiBEb2N1bWVudGF0aW9uIFRhYiBWMS4wLy9FTiIgInRhYi1jb2Nvb24tdjEwLmR0ZCI+CiAKLTx0YWJzIHNvZnR3YXJlPSJNeVByb2oiCi0gIHRpdGxlPSJNeVByb2oiCi0gIGNvcHlyaWdodD0iRm9vIgorPHRhYnMgc29mdHdhcmU9IlBPSSIKKyAgdGl0bGU9IlBPSSIKKyAgY29weXJpZ2h0PSJBcGFjaGUgRm91bmRhdGlvbiIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogCiAgIDwhLS0gVGhlIHJ1bGVzIGFyZToKZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvdHJhbnMvZGUvYm9vay54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3RyYW5zL2RlL2Jvb2sueG1sCmluZGV4IDU4MTBhOTYuLjllMmZhODYgMTAwNjQ0Ci0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvdHJhbnMvZGUvYm9vay54bWwKKysrIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy90cmFucy9kZS9ib29rLnhtbApAQCAtOCw3ICs4LDcgQEAKIAogICA8bWVudSBsYWJlbD0iR2VtZWluc2NoYWZ0Ij4KICAgICA8bWVudS1pdGVtIGxhYmVsPSJOZXVpZ2tlaXRlbiIgaHJlZj0iLi4vLi4vbmV3cy5odG1sIi8+Ci0gICAgPG1lbnUtaXRlbSBsYWJlbD0ixG5kZXJ1bmdlbiIgaHJlZj0iLi4vLi4vY2hhbmdlcy5odG1sIi8+CisgICAgPG1lbnUtaXRlbSBsYWJlbD0ixG5kZXJ1bmdlbiIgaHJlZj0iL2NoYW5nZXMuaHRtbCIvPgogICAgIDxtZW51LWl0ZW0gbGFiZWw9IkF1ZmdhYmVuIiBocmVmPSIuLi8uLi90b2RvLmh0bWwiLz4KICAgICA8bWVudS1pdGVtIGxhYmVsPSJNaXRtYWNoZW4iIGhyZWY9Ii4uLy4uL2dldGludm9sdmVkL2luZGV4Lmh0bWwiLz4KICAgICA8bWVudS1pdGVtIGxhYmVsPSJVbnNlcmUgVmlzaW9uIiBocmVmPSIuLi8uLi9wbGFuL1BPSTIwVmlzaW9uLmh0bWwiLz4KZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvdHJhbnMvZXMvYm9vay54bWwgYi9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3RyYW5zL2VzL2Jvb2sueG1sCmluZGV4IDYwMmU3NWMuLjYxMzQ2ZDEgMTAwNjQ0Ci0tLSBhL3NyYy9kb2N1bWVudGF0aW9uL2NvbnRlbnQveGRvY3MvdHJhbnMvZXMvYm9vay54bWwKKysrIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy90cmFucy9lcy9ib29rLnhtbApAQCAtOSw3ICs5LDcgQEAKICAgPG1lbnUgbGFiZWw9IkNvbXVuaWRhZCI+CiAgICAgPG1lbnUtaXRlbSBsYWJlbD0iTm90aWNpYXMiIGhyZWY9Im5ld3MuaHRtbCIvPiAgICAKICAgICA8bWVudS1pdGVtIGxhYmVsPSJFc3Blam9zIiBocmVmPSIuLi8uLi9taXJyb3JzLmh0bWwiLz4gICAgCi0gICAgPG1lbnUtaXRlbSBsYWJlbD0iQ2FtYmlvcyIgaHJlZj0iY2hhbmdlcy5odG1sIi8+IAorICAgIDxtZW51LWl0ZW0gbGFiZWw9IkNhbWJpb3MiIGhyZWY9InNpdGU6Y2hhbmdlcyIvPgogICAgIDxtZW51LWl0ZW0gbGFiZWw9IlRhcmVhcyIgaHJlZj0idG9kby5odG1sIi8+IAogICAgIDxtZW51LWl0ZW0gbGFiZWw9IkNvbnRyaWJ1eWEiIGhyZWY9Ii4uLy4uL2dldGludm9sdmVkL2luZGV4Lmh0bWwiLz4KICAgICA8bWVudS1pdGVtIGxhYmVsPSJMaXN0YXMgZGUgQ29ycmVvIiBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvbWFpbC5odG1sIi8+CmRpZmYgLS1naXQgYS9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3RyYW5zL2VzL2NoYW5nZXMueG1sIGIvc3JjL2RvY3VtZW50YXRpb24vY29udGVudC94ZG9jcy90cmFucy9lcy9jaGFuZ2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyOTJiZS4uMDAwMDAwMAotLS0gYS9zcmMvZG9jdW1lbnRhdGlvbi9jb250ZW50L3hkb2NzL3RyYW5zL2VzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhRE9DVFlQRSBjaGFuZ2VzIFBVQkxJQyAiLS8vQVBBQ0hFLy9EVEQgQ2hhbmdlcyBWMS4xLy9FTiIgIi4uLy4uL2R0ZC9jaGFuZ2VzLXYxMS5kdGQiPgotCi08Y2hhbmdlcz48dGl0bGU+SGlzdG9yaWFsIGRlIENhbWJpb3M8L3RpdGxlPgotCi0gICAgPGRldnM+Ci0gICAgICAgIDwhLS0gaW4gc3RyaWN0IGFscGhhYmV0aWNhbCBvcmRlciAtLT4KLSAgICAgICAgPHBlcnNvbiBpZD0iQU8iICBuYW1lPSJBbmRyZXcgQy4gT2xpdmVyIiAgIGVtYWlsPSJhY29saXZlcjJAdXNlcnMuc291cmNlZm9yZ2UubmV0Ii8+Ci0gICAgICAgIDxwZXJzb24gaWQ9IkdKUyIgIG5hbWU9IkdsZW4gU3RhbXBvdWx0emlzIiBlbWFpbD0iZ2xlbnNAYXBhY2hlLm9yZyIvPgotICAgICAgICA8cGVyc29uIGlkPSJNSiIgIG5hbWU9Ik1hcmMgSm9obnNvbiIgICAgICAgZW1haWw9Im1qb2huc29uQGFwYWNoZS5vcmciLz4KLSAgICAgICAgPHBlcnNvbiBpZD0iTktCIiBuYW1lPSJOaWNvbGEgS2VuIEJhcm96emkiIGVtYWlsPSJiYXJvenppQG5pY29sYWtlbi5jb20iLz4KLSAgICAgICAgPHBlcnNvbiBpZD0iUE9JLURFVkVMT1BFUlMiIG5hbWU9IlBvaSBEZXZlbG9wZXJzIiAgICBlbWFpbD0icG9pLWRldkBqYWthcnRhLmFwYWNoZS5vcmciLz4KLSAgICA8L2RldnM+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS44LWRldiIgZGF0ZT0iMjAgU2VwdGllbWJyZSAyMDAyIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPlNvcG9ydGUgcGFyYSBGb3JtYXRvIGRlIERhdG9zIFBlcnNvbmFsaXphZG8gKEN1c3RvbSk8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPlNvcG9ydGUgVW5pY29kZSBNZWpvcmFkbyBwYXJhIFJ1c28geSBKYXBvbulzPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5Tb3BvcnRlIHBhcmEgRvNybXVsYXMgTWVqb3JhZG8sIGluY2x1eWVuZG8KLSAgICAgICAgICAgIHPzbG8tbGVjdHVyYSBwYXJhIHNlbnRlbmNpYXMgdGlwbyAib3B0aW1pemFkbyBzaSIgKG9wdGltaXplZCBpZikuPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5Tb3BvcnRlIHBhcmEgbGEgY2xvbmFjafNuIGRlIG9iamV0b3M8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJhZGQiPkFycmVnbG9zIGVuIGxhIGNhYmVjZXJhL3BpZTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+VHJhZHVjY2lvbmVzIGRlIGxhIGRvY3VtZW50YWNp824gYWwgRXNwYfFvbDwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9ImFkZCI+U29wb3J0ZSBwYXJhIHByZXNlcnZhciBtYWNyb3MgVkJBPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuNy1kZXYiIGRhdGU9Ij8/PyI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJOS0IiIHR5cGU9InVwZGF0ZSI+U2UgcXVpdGEgbGEgZGVwZW5kZW5jaWEgZW4gdGllbXBvIGRlIGVqZWN1Y2nzbiBkZWwgcmVnaXN0cm8KLQkobG9nZ2luZykgZGUgImNvbW1vbnMiLjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiIHR5cGU9InVwZGF0ZSI+U29wb3J0ZSBwYXJhIGbzcm11bGFzPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuNS4xIiBkYXRlPSIxNiBKdW5pbyAyMDAyIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IkdKUyIgdHlwZT0idXBkYXRlIj5TZSBxdWl0YSBsYSBkZXBlbmRlbmNpYSBkZWwgcmVnaXN0cm8gZGUgImNvbW1vbnMiLiBBaG9yYSBoYXkgcXVlIGRlZmluaXIgbGEgcHJvcGllZGFkIGRlbCBzaXN0ZW1hIHBvaS5sb2dnaW4gcGFyYSBwZXJtaXRpcgotCXF1ZSBsb3MgcmVnaXN0cm9zIChsb2dzKSB2YXlhbiBhIGxhIHNhbGlkYSBlc3ThbmRhci48L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IkdKUyIgdHlwZT0iZml4Ij5TZSBhcnJlZ2xhIGxhIGdlc3Rp824gZGUgbGEgY2FkZW5hIFNTVCBwYXJhIHF1ZSBsYXMgaG9qYXMgZGUgY+FsY3VsbyBjb24gdGV4dG8gcmljbyAocmljaCB0ZXh0KSBvIHRleHRvCi0JZXh0ZW5kaWRvIHNlIGxlYW4gY29ycmVjdGFtZW50ZS48L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS41IiBkYXRlPSIwNiBNYXlvIDIwMDIiPgotICAgICAgICA8YWN0aW9uIGRldj0iTktCIiB0eXBlPSJ1cGRhdGUiPk51ZXZhIHZlcnNp824gKGJ1aWxkKSBkZWwgcHJveWVjdG8uPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJOS0IiIHR5cGU9InVwZGF0ZSI+TnVldm8gc2lzdGVtYSBkZSBkb2N1bWVudGFjafNuIGRlbCBwcm95ZWN0byBiYXNhZGEgZW4gIENvY29vbi48L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJ1cGRhdGUiPkNhbWJpbyBkZSBub21icmUgZGVsIHBhcXVldGU8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIiB0eXBlPSJmaXgiPlZhcmlvcyBlcnJvcmVzIChidWdzKSBjb3JyZWdpZG9zPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5FdGFwYXMgcHJlbGltaW5hcmVzIGRlbCBkZXNhcnJvbGxvIGRlIEhGUyAobm8gZXN0YSBsaXN0byBwYXJhIGVsIGRlc2Fycm9sbG8pPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyIgdHlwZT0iYWRkIj5Tb3BvcnRlIGluaWNpYWwgZGUgcmVnaXN0cm9zIGRlIGJham8gbml2ZWwgcGFyYSBncuFmaWNhcyAobm8gZXN04SBjb21wbGV0byk8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4xLjAiIGRhdGU9IkZlY2hhIGRlIGRpc3RyaWJ1Y2nzbiBubyByZWdpc3RyYWRhIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5TZSBjcmVhIHVuIG51ZXZvIG1vZGVsbyBkZSBldmVudG9zPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+U2Ugb3B0aW1pemEgSFNTRiwgaW5jbHV5ZW5kbyByZWdpc3Ryb3MgKHJlY29yZHMpIHBhcmEKLQl2YWxvcmVzLCBmaWxhcywgZXRjLjwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPnByZWRpY2Np824gZGUgdGFtYfFvLCBlc2NyaXR1cmEgYmFzYWRhIGVuIGRlc3BsYXphbWllbnRvIChlbiBsdWdhciBkZQotCW11bHRpdHVkIGRlIGNvcGlhcyBkZSBhcnJheXMpPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+dW4gcG9jbyBkZSByZS1mYWN0b3JpbmcgKL9yZS1mYWN0b3JpemFjafNuPyBtZWpvciBubykgeSBjb3JyZWNjafNuIGRlIGVycm9yZXMuPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMC4wIiBkYXRlPSJGZWNoYSBkZSBkaXN0cmlidWNp824gbm8gcmVnaXN0cmFkYSI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+QWN0dWFsaXphY2lvbmVzIG1lbm9yZXMgYSBsYSBkb2N1bWVudGFjafNuLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjE0LjAiIGRhdGU9IkZlY2hhIGRlIGRpc3RyaWJ1Y2nzbiBubyByZWdpc3RyYWRhIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5TZSBh8WFkZSBsYSBjbGFzZSBkZSBheXVkYSBEYXRhRm9ybWF0IHkgc2UgZXhwb25lIGVsIGZvcm1hdG8gc2V0IHkgZ2V0IGVuCi0JSFNTRkNlbGxTdHlsZTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPkNvcnJlY2Npb25lcyBhIGxhcyBhcGlzIGRlIGFuY2h1cmEgZGUgY29sdW1uYSAoZW4gY3VhbnRvIGEgbGFzIHVuaWRhZGVzKSB5Ci0JdmFyaW9zIGNvbWVudGFyaW9zIGphdmFkb2MgYWwgcmVzcGVjdG88L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5Db3JyZWNjafNuIHBhcmEgZWwgcmVnaXN0cm8gZGUgIkRpbWVuc2lvbnMiIChkZSBudWV2bykuLi4gKHVubyBkZSBlc3RvcyBk7WFzCi0JZXNjcmliaXLpIHVuYSBwcnVlYmEgdW5pdGFyaWEgKHVuaXQgdGVzdCkgcGFyYSBlc3RvIDstcCkuPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+QWxndW5hIG9wdGltaXphY2nzbiBlbiBsYSBjcmVhY2nzbiBkZSBw4WdpbmFzLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjEzLjAiIGRhdGU9IkZlY2hhIGRlIGRpc3RyaWJ1Y2nzbiBubyByZWdpc3RyYWRhIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5NZWpvcmFzIG5vIHJlZ2lzdHJhZGFzPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjAuMTIuMCIgZGF0ZT0iRmVjaGEgZGUgZGlzdHJpYnVjafNuIG5vIHJlZ2lzdHJhZGEiPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPlNlIGHxYWRlbiBNdWxCbGFuaywgQmxhbmssIENvbEluZm88L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5TZSBh8WFkZSBmYWNpbGlkYWQgbG9nNGogeSBzZSBxdWl0YW4gbGFzIGFub3RhY2lvbmVzIChsb2dzKSBkZWwgdGlwbyBzeXMub3V0PC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+U2UgYfFhZGUgc29wb3J0ZSBwYXJhIGxhIGFkaWNp824gZGUgZnVlbnRlcywgZXN0aWxvcyB5IGVsIGFwaSBkZSBhbHRvCi0Jbml2ZWwgY29ycmVzcG9uZGllbnRlIHBhcmEgZGFyIGVzdGlsbyBhIGxhcyBjZWxkYXM8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5TZSBh8WFkZSBzb3BvcnRlIHBhcmEgY2FtYmlhciBlbCBhbHRvIGRlIHVuYSBmaWxhLCBlbCBhbmNobyBkZSB1bmEgY2VsZGEsIHkKLQlzdXMgdmFsb3JlcyBwb3IgZGVmZWN0by48L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5Db3JyZWNjaW9uZXMgcGFyYSBpbnRlcm5hY2lvbmFsaXphY2nzbiAoVVRGLTE2IGRlYmVy7WEgZnVuY2lvbmFyIGFob3JhCi0JZGVzZGUgSFNTRkNlbGwuc2V0U3RyaW5nVmFsdWUsIGV0YyBjdWFuZG8gc2UgZGVmaW5lIGxhIGNvZGlmaWNhY2nzbik8L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5Tb3BvcnRlIHBhcmEgbGEgYWRpY2nzbiAvIGVsaW1pbmFjafNuIHkgY2FtYmlvIGRlIG5vbWJyZSBkZSBob2phcy48L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMC4xMS4wIiBkYXRlPSJGZWNoYSBkZSBkaXN0cmlidWNp824gbm8gcmVnaXN0cmFkYSI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+RGlzdHJpYnVjafNuIGRlIGNvcnJlY2Np824gZGUgZXJyb3Jlcy4KLQlMYW56YW1vcyB1bmEgZXhjZXBjafNuIGN1YW5kbyBsZWVtb3Mgb2JqZXRvcyBkZSB0aXBvIFJLUmVjb3JkLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjEwLjAiIGRhdGU9IkZlY2hhIGRlIGRpc3RyaWJ1Y2nzbiBubyByZWdpc3RyYWRhIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5SZWdpc3Ryb3MgZGUgY29udGludWFjafNuIHlhIGZ1bmNpb25hbiAobGVjdHVyYS9lc2NyaXR1cmEpPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+U2UgYfFhZGUgc29wb3J0ZSBwcmV2aW8gcGFyYSBm83JtdWxhczwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPlJlb3JnYW5pemFjafNuIGRlbCBBUEkgbWFzaXZhLCByZS1lbnBhcXVldGFkby48L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5TZSBh8WFkZSBsYSBjbGFzZSBCaWZmVmlld2VyIHBhcmEgdmFsaWRhciBIU1NGICZhbXA7IFBPSSB5L28gbGEKLQlzYWxpZGEgZGUgSFNTRi48L2FjdGlvbj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5TZSBtZWpvcmEgZWwgc29wb3J0ZSBhIGxhIG1vZGlmaWNhY2nzbiBkZWwgQVBJLjwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIwLjcgKHkgZGlzdHJpYnVjaW9uZXMgaW50ZXJuYXMpIiBkYXRlPSJGZWNoYSBkZSBkaXN0cmlidWNp824gbm8gcmVnaXN0cmFkYSI+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+U2UgYfFhZGUgdW5hIGJhbmRlcmEgZGUgY29kaWZpY2FjafNuIHBhcmEgcXVlIGxhcyBhcGlzIGRlIGFsdG8KLQl5IGJham8gbml2ZWwgdXRpbGljZW4gdXRmLTE2IGN1YW5kbyBzZWEgbmVjZXNhcmlvIChIU1NGQ2VsbC5zZXRFbmNvZGluZygpKTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPlNlIGHxYWRlIHNvcG9ydGUgZGUgc/NsbyBsZWN0dXJhIGEgcmVnaXN0cm9zIGRlIEV0aXF1ZXRhCi0JKHF1ZSBzb24gcmVpbnRlcnByZXRhZG9zIGNvbW8gTGFiZWxTU1QgY3VhbmRvIHNlIGVzY3JpYmVuKTwvYWN0aW9uPgotICAgICAgICA8YWN0aW9uIGRldj0iUE9JLURFVkVMT1BFUlMiPlNlIHJvbXBlIGxhIGltcGxlbWVudGFjafNuIGRlbCByZWdpc3RybyBkZSBjb250aW51YWNp824gKG9vcHMpPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+U2UgYfFhZGUgbGEgY2xhc2UgQmlmZlZpZXdlcgotCXBhcmEgdmFsaWRhciBIU1NGICZhbXA7IFBPSSB5L28gbGEKLQlzYWxpZGEgZGUgSFNTRi48L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMC42IChkaXN0cmlidWNp824vcmVsZWFzZSkiIGRhdGU9IkZlY2hhIGRlIGRpc3RyaWJ1Y2nzbiBubyByZWdpc3RyYWRhIj4KLSAgICAgICAgPGFjdGlvbiBkZXY9IlBPSS1ERVZFTE9QRVJTIj5Tb3BvcnRlIHBhcmEgbGVjdHVyYS9lc2NyaXR1cmEgeSBtb2RpZmljYWNp824uPC9hY3Rpb24+Ci0gICAgICAgIDxhY3Rpb24gZGV2PSJQT0ktREVWRUxPUEVSUyI+U29wb3J0ZSBkZSBz82xvIGxlY3R1cmEgcGFyYSByZWdpc3Ryb3MgZGUgdGlwbyBNdWxSSwotCShjb252ZXJ0aWRvcyBhIE51bWJlciBjdWFuZG8gc2UgZXNjcmliZW4pCi0gICAgICAgIDwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLQotPC9jaGFuZ2VzPgpkaWZmIC0tZ2l0IGEvc3JjL2RvY3VtZW50YXRpb24vcmVzb3VyY2VzL2ltYWdlcy9ncm91cC1sb2dvLmdpZiBiL3NyYy9kb2N1bWVudGF0aW9uL3Jlc291cmNlcy9pbWFnZXMvZ3JvdXAtbG9nby5naWYKaW5kZXggNTQzZjY4Ni4uNDcyZTQ3ZiAxMDA2NDQKLS0tIGEvc3JjL2RvY3VtZW50YXRpb24vcmVzb3VyY2VzL2ltYWdlcy9ncm91cC1sb2dvLmdpZgorKysgYi9zcmMvZG9jdW1lbnRhdGlvbi9yZXNvdXJjZXMvaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9kb2N1bWVudGF0aW9uL3NraW5jb25mLnhtbCBiL3NyYy9kb2N1bWVudGF0aW9uL3NraW5jb25mLnhtbAppbmRleCA0NjA2Njg0Li44NmRjYzUyIDEwMDY0NAotLS0gYS9zcmMvZG9jdW1lbnRhdGlvbi9za2luY29uZi54bWwKKysrIGIvc3JjL2RvY3VtZW50YXRpb24vc2tpbmNvbmYueG1sCkBAIC05LDIyICs5LDI5IEBACiAKICAgPCFFTlRJVFkgJSBsaW5rcy5hdHQgJ25hbWUgQ0RBVEEgI1JFUVVJUkVEJz4KICAgPCFFTlRJVFkgJSBsaW5rLmF0dCAnbmFtZSBDREFUQSAjUkVRVUlSRUQgaHJlZiBDREFUQSAjUkVRVUlSRUQnPgotICA8IUVMRU1FTlQgc2tpbmNvbmZpZyAoZGlzYWJsZS1zZWFyY2g/LCBkaXNhYmxlLWNvbXBsaWFuY2UtbGlua3M/LCBzZWFyY2hzaXRlLWRvbWFpbj8sIHNlYXJjaHNpdGUtbmFtZT8sCi0gIHByb2plY3QtbmFtZSwgcHJvamVjdC11cmwsIHByb2plY3QtbG9nbywgZ3JvdXAtbmFtZT8sIGdyb3VwLXVybD8sIGdyb3VwLWxvZ28/LAotICBob3N0LXVybD8sIGhvc3QtbG9nbz8sIHllYXI/LCB2ZW5kb3I/LCB0cmFpbD8sIGNyZWRpdHM/KSo+CisgIDwhRUxFTUVOVCBza2luY29uZmlnIChkaXNhYmxlLXNlYXJjaD8sIGRpc2FibGUtcHJpbnQtbGluaz8sIGRpc2FibGUtcGRmLWxpbms/LAorICBkaXNhYmxlLXhtbC1saW5rPywgZGlzYWJsZS1jb21wbGlhbmNlLWxpbmtzPywgb2JmdXNjYXRlLW1haWwtbGlua3M/LCBzZWFyY2hzaXRlLWRvbWFpbj8sIHNlYXJjaHNpdGUtbmFtZT8sCisgIHByb2plY3QtbmFtZSwgcHJvamVjdC1kZXNjcmlwdGlvbj8sIHByb2plY3QtdXJsLCBwcm9qZWN0LWxvZ28sIGdyb3VwLW5hbWU/LCBncm91cC1kZXNjcmlwdGlvbj8sIGdyb3VwLXVybD8sIGdyb3VwLWxvZ28/LAorICBob3N0LXVybD8sIGhvc3QtbG9nbz8sIHllYXI/LCB2ZW5kb3I/LCB0cmFpbD8sIHRvYz8sIGNyZWRpdHM/KSo+CiAgIDwhRUxFTUVOVCBjcmVkaXRzIChjcmVkaXQqKT4KICAgPCFFTEVNRU5UIGNyZWRpdCAobmFtZSwgdXJsLCBpbWFnZT8sIHdpZHRoPywgaGVpZ2h0Pyk+CiAgIDwhLS0gaWQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgdG9vbCwgYW5kIHJvbGUgaW5kaWNhdGVzIGl0cyBmdW5jdGlvbiAtLT4KICAgPCFBVFRMSVNUIGNyZWRpdCBpZCAgIENEQVRBICNJTVBMSUVECiAgICAgICAgICAgICAgICAgICAgcm9sZSBDREFUQSAjSU1QTElFRD4KICAgPCFFTEVNRU5UIGRpc2FibGUtc2VhcmNoICgjUENEQVRBKT4KKyAgPCFFTEVNRU5UIGRpc2FibGUtcHJpbnQtbGluayAoI1BDREFUQSk+CisgIDwhRUxFTUVOVCBkaXNhYmxlLXBkZi1saW5rICgjUENEQVRBKT4KKyAgPCFFTEVNRU5UIGRpc2FibGUteG1sLWxpbmsgKCNQQ0RBVEEpPgogICA8IUVMRU1FTlQgZGlzYWJsZS1jb21wbGlhbmNlLWxpbmtzICgjUENEQVRBKT4KKyAgPCFFTEVNRU5UIG9iZnVzY2F0ZS1tYWlsLWxpbmtzICgjUENEQVRBKT4KICAgPCFFTEVNRU5UIHNlYXJjaHNpdGUtZG9tYWluICgjUENEQVRBKT4KLSAgPCFFTEVNRU5UIHNlYXJjaHNpdGUtbmFtZSAoI1BDREFUQSk+ICAKKyAgPCFFTEVNRU5UIHNlYXJjaHNpdGUtbmFtZSAoI1BDREFUQSk+CiAgIDwhRUxFTUVOVCBwcm9qZWN0LW5hbWUgKCNQQ0RBVEEpPgorICA8IUVMRU1FTlQgcHJvamVjdC1kZXNjcmlwdGlvbiAoI1BDREFUQSk+CiAgIDwhRUxFTUVOVCBwcm9qZWN0LXVybCAoI1BDREFUQSk+CiAgIDwhRUxFTUVOVCBwcm9qZWN0LWxvZ28gKCNQQ0RBVEEpPgogICA8IUVMRU1FTlQgZ3JvdXAtbmFtZSAoI1BDREFUQSk+CisgIDwhRUxFTUVOVCBncm91cC1kZXNjcmlwdGlvbiAoI1BDREFUQSk+CiAgIDwhRUxFTUVOVCBncm91cC11cmwgKCNQQ0RBVEEpPgogICA8IUVMRU1FTlQgZ3JvdXAtbG9nbyAoI1BDREFUQSk+CiAgIDwhRUxFTUVOVCBob3N0LXVybCAoI1BDREFUQSk+CkBAIC00NCwxMiArNTEsMTUgQEAKICAgPCFFTEVNRU5UIGltYWdlICgjUENEQVRBKT4KICAgPCFFTEVNRU5UIHdpZHRoICgjUENEQVRBKT4KICAgPCFFTEVNRU5UIGhlaWdodCAoI1BDREFUQSk+CisgIDwhRUxFTUVOVCB0b2MgRU1QVFk+CisgIDwhQVRUTElTVCB0b2MgbGV2ZWwgQ0RBVEEgI0lNUExJRUQ+CiAgIF0+CiAKIDxza2luY29uZmlnPgogICA8IS0tIERvIHdlIHdhbnQgdG8gZGlzYWJsZSB0aGUgR29vZ2xlIHNlYXJjaCBib3g/IC0tPgogICA8ZGlzYWJsZS1zZWFyY2g+ZmFsc2U8L2Rpc2FibGUtc2VhcmNoPgogICA8ZGlzYWJsZS1jb21wbGlhbmNlLWxpbmtzPmZhbHNlPC9kaXNhYmxlLWNvbXBsaWFuY2UtbGlua3M+CisgIDxkaXNhYmxlLXhtbC1saW5rPnRydWU8L2Rpc2FibGUteG1sLWxpbms+CiAgIDxzZWFyY2hzaXRlLWRvbWFpbj5qYWthcnRhLmFwYWNoZS5vcmc8L3NlYXJjaHNpdGUtZG9tYWluPgogICA8c2VhcmNoc2l0ZS1uYW1lPmpha2FydGE8L3NlYXJjaHNpdGUtbmFtZT4KIApkaWZmIC0tZ2l0IGEvc3JjL2V4YW1wbGVzL3NyYy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9leGFtcGxlcy9SZWFkV3JpdGVXb3JrYm9vay5qYXZhIGIvc3JjL2V4YW1wbGVzL3NyYy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9leGFtcGxlcy9SZWFkV3JpdGVXb3JrYm9vay5qYXZhCmluZGV4IGY4MGFmYjkuLjQwODBhNGQgMTAwNjQ0Ci0tLSBhL3NyYy9leGFtcGxlcy9zcmMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvZXhhbXBsZXMvUmVhZFdyaXRlV29ya2Jvb2suamF2YQorKysgYi9zcmMvZXhhbXBsZXMvc3JjL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL2V4YW1wbGVzL1JlYWRXcml0ZVdvcmtib29rLmphdmEKQEAgLTgwLDYgKzgwLDggQEAKICAgICAgICAgSFNTRldvcmtib29rIHdiID0gbmV3IEhTU0ZXb3JrYm9vayhmcyk7CiAgICAgICAgIEhTU0ZTaGVldCBzaGVldCA9IHdiLmdldFNoZWV0QXQoMCk7CiAgICAgICAgIEhTU0ZSb3cgcm93ID0gc2hlZXQuZ2V0Um93KDIpOworICAgICAgICBpZiAocm93ID09IG51bGwpCisgICAgICAgICAgICByb3cgPSBzaGVldC5jcmVhdGVSb3coMik7CiAgICAgICAgIEhTU0ZDZWxsIGNlbGwgPSByb3cuZ2V0Q2VsbCgoc2hvcnQpMyk7CiAgICAgICAgIGlmIChjZWxsID09IG51bGwpCiAgICAgICAgICAgICBjZWxsID0gcm93LmNyZWF0ZUNlbGwoKHNob3J0KTMpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHBzZi9DbGFzc0lELmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9ocHNmL0NsYXNzSUQuamF2YQppbmRleCA2ZDU2NzY3Li5lOTkzOWFmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9ocHNmL0NsYXNzSUQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9ocHNmL0NsYXNzSUQuamF2YQpAQCAtNTYsNiArNTYsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5ocHNmOwogCiBpbXBvcnQgamF2YS5pby4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5IZXhEdW1wOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuTGl0dGxlRW5kaWFuOwogCiAvKioKQEAgLTk4LDE1ICsxMDAsMjEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3NJRCgpCiAgICAgewotCWJ5dGVzID0gbmV3IGJ5dGVbTEVOR1RIXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IExFTkdUSDsgaSsrKQotCSAgICBieXRlc1tpXSA9IDB4MDA7CisgICAgICAgIGJ5dGVzID0gbmV3IGJ5dGVbTEVOR1RIXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRU5HVEg7IGkrKykKKyAgICAgICAgICAgIGJ5dGVzW2ldID0gMHgwMDsKICAgICB9CiAKIAogCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTEVOR1RIID0gMTY7CisgICAgLyoqIDxwPlRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgdGhpcyBvYmplY3QgaW4gdGhlIGJ5dGUKKyAgICAgKiBzdHJlYW0uPC9wPiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSCA9IDE2OwogCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IHRoaXMgb2JqZWN0IGluIHRoZSBieXRlCisgICAgICogc3RyZWFtLgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkKICAgICB7CiAgICAgICAgIHJldHVybiBMRU5HVEg7CkBAIC0xMTcsMTAgKzEyNSwxMiBAQAogICAgIC8qKgogICAgICAqIDxwPkdldHMgdGhlIGJ5dGVzIG1ha2luZyBvdXQgdGhlIGNsYXNzIElELiBUaGV5IGFyZSByZXR1cm5lZCBpbgogICAgICAqIGNvcnJlY3Qgb3JkZXIsIGkuZS4gYmlnLWVuZGlhbi48L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYnl0ZXMgbWFraW5nIG91dCB0aGUgY2xhc3MgSUQuCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpCiAgICAgewotCXJldHVybiBieXRlczsKKyAgICAgICAgcmV0dXJuIGJ5dGVzOwogICAgIH0KIAogCkBAIC0xNTMsOSArMTYzLDkgQEAKICAgICAgICAgYnl0ZXNbNl0gPSBzcmNbNyArIG9mZnNldF07CiAgICAgICAgIGJ5dGVzWzddID0gc3JjWzYgKyBvZmZzZXRdOwogCi0JLyogUmVhZCA4IGJ5dGVzLiAqLwotCWZvciAoaW50IGkgPSA4OyBpIDwgMTY7IGkrKykKLQkgICAgYnl0ZXNbaV0gPSBzcmNbaSArIG9mZnNldF07CisgICAgICAgIC8qIFJlYWQgOCBieXRlcy4gKi8KKyAgICAgICAgZm9yIChpbnQgaSA9IDg7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgYnl0ZXNbaV0gPSBzcmNbaSArIG9mZnNldF07CiAKICAgICAgICAgcmV0dXJuIGJ5dGVzOwogICAgIH0KQEAgLTE3MCwzMCArMTgwLDc1IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgd2l0aGluIHRoZSA8dmFyPmRzdDwvdmFyPiBieXRlIGFycmF5LgogICAgICAqCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm90IGVub3VnaAotICAgICAqIHJvb20gZm9yIHRoZSBjbGFzcyBJRCBpbiB0aGUgYnl0ZSBhcnJheS4gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdAotICAgICAqIDE2IGJ5dGVzIGluIHRoZSBieXRlIGFycmF5IGFmdGVyIHRoZSA8dmFyPm9mZnNldDwvdmFyPgotICAgICAqIHBvc2l0aW9uLgorICAgICAqIEBleGNlcHRpb24gQXJyYXlTdG9yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBjbGFzcyAKKyAgICAgKiBJRCAxNiBieXRlcyBpbiB0aGUgYnl0ZSBhcnJheSBhZnRlciB0aGUgPHZhcj5vZmZzZXQ8L3Zhcj4gcG9zaXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGRzdCwgZmluYWwgaW50IG9mZnNldCkKKyAgICB0aHJvd3MgQXJyYXlTdG9yZUV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgLyogQ2hlY2sgYXJyYXkgc2l6ZTogKi8KKyAgICAgICAgaWYgKGRzdC5sZW5ndGggPCAxNikKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheVN0b3JlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJEZXN0aW5hdGlvbiBieXRlW10gbXVzdCBoYXZlIHJvb20gZm9yIGF0IGxlYXN0IDE2IGJ5dGVzLCAiICsKKyAgICAgICAgICAgICAgICAgImJ1dCBoYXMgYSBsZW5ndGggb2Ygb25seSAiICsgZHN0Lmxlbmd0aCArICIuIik7CiAgICAgICAgIC8qIFdyaXRlIGRvdWJsZSB3b3JkLiAqLwotCWRzdFswICsgb2Zmc2V0XSA9IGJ5dGVzWzNdOwotCWRzdFsxICsgb2Zmc2V0XSA9IGJ5dGVzWzJdOwotCWRzdFsyICsgb2Zmc2V0XSA9IGJ5dGVzWzFdOwotCWRzdFszICsgb2Zmc2V0XSA9IGJ5dGVzWzBdOworICAgICAgICBkc3RbMCArIG9mZnNldF0gPSBieXRlc1szXTsKKyAgICAgICAgZHN0WzEgKyBvZmZzZXRdID0gYnl0ZXNbMl07CisgICAgICAgIGRzdFsyICsgb2Zmc2V0XSA9IGJ5dGVzWzFdOworICAgICAgICBkc3RbMyArIG9mZnNldF0gPSBieXRlc1swXTsKIAogICAgICAgICAvKiBXcml0ZSBmaXJzdCB3b3JkLiAqLwotCWRzdFs0ICsgb2Zmc2V0XSA9IGJ5dGVzWzVdOwotCWRzdFs1ICsgb2Zmc2V0XSA9IGJ5dGVzWzRdOworICAgICAgICBkc3RbNCArIG9mZnNldF0gPSBieXRlc1s1XTsKKyAgICAgICAgZHN0WzUgKyBvZmZzZXRdID0gYnl0ZXNbNF07CiAKICAgICAgICAgLyogV3JpdGUgc2Vjb25kIHdvcmQuICovCi0JZHN0WzYgKyBvZmZzZXRdID0gYnl0ZXNbN107Ci0JZHN0WzcgKyBvZmZzZXRdID0gYnl0ZXNbNl07CisgICAgICAgIGRzdFs2ICsgb2Zmc2V0XSA9IGJ5dGVzWzddOworICAgICAgICBkc3RbNyArIG9mZnNldF0gPSBieXRlc1s2XTsKIAotCS8qIFdyaXRlIDggYnl0ZXMuICovCi0JZm9yIChpbnQgaSA9IDg7IGkgPCAxNjsgaSsrKQotCSAgICBkc3RbaSArIG9mZnNldF0gPSBieXRlc1tpXTsKKyAgICAgICAgLyogV3JpdGUgOCBieXRlcy4gKi8KKyAgICAgICAgZm9yIChpbnQgaSA9IDg7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgZHN0W2kgKyBvZmZzZXRdID0gYnl0ZXNbaV07CiAgICAgfQogCisKKworICAgIC8qKgorICAgICAqIDxwPkNoZWNrcyB3aGV0aGVyIHRoaXMgPGNvZGU+Q2xhc3NJRDwvY29kZT4gaXMgZXF1YWwgdG8gYW5vdGhlcgorICAgICAqIG9iamVjdC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbyB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyA8Y29kZT5Qcm9wZXJ0eVNldDwvY29kZT4gd2l0aAorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdHMgYXJlIGVxdWFsLCBlbHNlCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pCisgICAgeworICAgICAgICBpZiAobyA9PSBudWxsIHx8ICEobyBpbnN0YW5jZW9mIENsYXNzSUQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmaW5hbCBDbGFzc0lEIGNpZCA9IChDbGFzc0lEKSBvOworICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoICE9IGNpZC5ieXRlcy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpZiAoYnl0ZXNbaV0gIT0gY2lkLmJ5dGVzW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ2xhc3MgSUQKKyAgICAgKiAgIGluIHN0YW5kYXJkIGZvcm1hdCA8Y29kZT4ie3h4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eH0iPC9jb2RlPgorICAgICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBDbGFzcyBJRCByZXByZXNlbnRlZAorICAgICAqICAgYnkgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2JDbGFzc0lkID0gbmV3IFN0cmluZ0J1ZmZlciggMzgpOworICAgICAgICBzYkNsYXNzSWQuYXBwZW5kKCAneycpOworICAgICAgICBmb3IoIGludCBpPTA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBzYkNsYXNzSWQuYXBwZW5kKCBIZXhEdW1wLnRvSGV4KCBieXRlc1sgaV0pKTsKKyAgICAgICAgICAgIGlmKCBpID09IDMgfHwgaSA9PSA1IHx8IGkgPT0gNyB8fCBpID09IDkpIHsKKyAgICAgICAgICAgICAgICBzYkNsYXNzSWQuYXBwZW5kKCAnLScpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNiQ2xhc3NJZC5hcHBlbmQoICd9Jyk7CisgICAgICAgIHJldHVybiBzYkNsYXNzSWQudG9TdHJpbmcoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9ocHNmL1R5cGVSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hwc2YvVHlwZVJlYWRlci5qYXZhCmluZGV4IGE2MjY0ZjcuLmRjNDQxYjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hwc2YvVHlwZVJlYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hwc2YvVHlwZVJlYWRlci5qYXZhCkBAIC02Miw3ICs2Miw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHBzZjsKIAotaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuTGl0dGxlRW5kaWFuOwogCiAvKioKQEAgLTg1LDYgKzg0LDcgQEAKICAgICAgKiBzdGFydHMKICAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHZhcmlhbnQgaW5jbHVkaW5nIHRoZSB2YXJpYW50CiAgICAgICogdHlwZSBmaWVsZAorICAgICAqIEBwYXJhbSB0eXBlIFRoZSB2YXJpYW50IHR5cGUgdG8gcmVhZAogICAgICAqIEByZXR1cm4gQSBKYXZhIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIGJlc3QgdG8gdGhlIHZhcmlhbnQKICAgICAgKiBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgVlRfSTQgaXMgcmV0dXJuZWQgYXMgYSB7QGxpbmsgTG9uZ30sIGEKICAgICAgKiBWVF9MUFNUUiBhcyBhIHtAbGluayBTdHJpbmd9LgpAQCAtOTIsMTUgKzkyLDI1IEBACiAgICAgICogQHNlZSBWYXJpYW50CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgcmVhZChmaW5hbCBieXRlW10gc3JjLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAotCQkJICAgICAgZmluYWwgaW50IHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSkKICAgICB7Ci0JLyoKLQkgKiBGSVhNRTogU3VwcG9ydCByZWFkaW5nIG1vcmUgdHlwZXMgYW5kIGNsZWFuIHVwIHRoaXMgY29kZSEKLQkgKi8KLQlPYmplY3QgdmFsdWU7Ci0JbGVuZ3RoID0gbGVuZ3RoIC0gTGl0dGxlRW5kaWFuLklOVF9TSVpFOworICAgICAgICAvKgorICAgICAgICAgKiBGSVhNRTogU3VwcG9ydCByZWFkaW5nIG1vcmUgdHlwZXMgYW5kIGNsZWFuIHVwIHRoaXMgY29kZSEKKyAgICAgICAgICovCisgICAgICAgIE9iamVjdCB2YWx1ZTsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIC0gTGl0dGxlRW5kaWFuLklOVF9TSVpFOwogICAgICAgICBzd2l0Y2ggKHR5cGUpCi0JeworICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFZhcmlhbnQuVlRfRU1QVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBGSVhNRTogVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FzZSByZWxpZXMgb24gdGhlCisgICAgICAgICAgICAgICAgICogYXNzdW1wdGlvbiB0aGF0IHRoZSB2YWx1ZSBWVF9FTVBUWSBkZW5vdGVzIGNvbnNpc3RzIG9mIHplcm8gCisgICAgICAgICAgICAgICAgICogYnl0ZXMuIEknZCBiZSBnbGFkIGlmIHNvbWUgY291bGQgY29uZmlybSBvciBjb3JyZWN0IHRoaXMuIAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgVmFyaWFudC5WVF9JMjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKgpAQCAtMTM3LDExICsxNDcsMTEgQEAKICAgICAgICAgICAgICAgICAgKiBSZWFkIGEgYnl0ZSBzdHJpbmcuIEluIEphdmEgaXQgaXMgcmVwcmVzZW50ZWQgYXMgYQogICAgICAgICAgICAgICAgICAqIFN0cmluZyBvYmplY3QuIFRoZSAweDAwIGJ5dGVzIGF0IHRoZSBlbmQgbXVzdCBiZQogICAgICAgICAgICAgICAgICAqIHN0cmlwcGVkLgotCQkgKgotCQkgKiBGSVhNRTogUmVhZGluZyBhbiA4LWJpdCBzdHJpbmcgc2hvdWxkIHBheSBhdHRlbnRpb24KLQkJICogdG8gdGhlIGNvZGVwYWdlLiBDdXJyZW50bHkgdGhlIGJ5dGUgbWFraW5nIG91dCB0aGUKLQkJICogcHJvcGVydHkncyB2YWx1ZSBhcmUgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZQotCQkgKiBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIHNldC4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIEZJWE1FOiBSZWFkaW5nIGFuIDgtYml0IHN0cmluZyBzaG91bGQgcGF5IGF0dGVudGlvbgorICAgICAgICAgICAgICAgICAqIHRvIHRoZSBjb2RlcGFnZS4gQ3VycmVudGx5IHRoZSBieXRlIG1ha2luZyBvdXQgdGhlCisgICAgICAgICAgICAgICAgICogcHJvcGVydHkncyB2YWx1ZSBhcmUgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICAgICAgICAgICAqIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0LgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdCA9IG9mZnNldCArIExpdHRsZUVuZGlhbi5JTlRfU0laRTsKICAgICAgICAgICAgICAgICBsb25nIGxhc3QgPSBmaXJzdCArIExpdHRsZUVuZGlhbi5nZXRVSW50KHNyYywgb2Zmc2V0KSAtIDE7CkBAIC0xNDksNyArMTU5LDcgQEAKICAgICAgICAgICAgICAgICB3aGlsZSAoc3JjWyhpbnQpIGxhc3RdID09IDAgJiYgZmlyc3QgPD0gbGFzdCkKICAgICAgICAgICAgICAgICAgICAgbGFzdC0tOwogICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IFN0cmluZyhzcmMsIChpbnQpIGZpcnN0LCAoaW50KSAobGFzdCAtIGZpcnN0ICsgMSkpOwotCQlicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgVmFyaWFudC5WVF9MUFdTVFI6CiAgICAgICAgICAgICB7CkBAIC0xNjAsMjcgKzE3MCwyNyBAQAogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdCA9IG9mZnNldCArIExpdHRsZUVuZGlhbi5JTlRfU0laRTsKICAgICAgICAgICAgICAgICBsb25nIGxhc3QgPSBmaXJzdCArIExpdHRsZUVuZGlhbi5nZXRVSW50KHNyYywgb2Zmc2V0KSAtIDE7Ci0JCWxvbmcgbCA9IGxhc3QgLSBmaXJzdDsKKyAgICAgICAgICAgICAgICBsb25nIGwgPSBsYXN0IC0gZmlyc3Q7CiAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IExpdHRsZUVuZGlhbi5JTlRfU0laRTsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKChpbnQpIChsYXN0IC0gZmlyc3QpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbDsgaSsrKQotCQl7Ci0JCSAgICBmaW5hbCBpbnQgaTEgPSBvZmZzZXQgKyAoaSAqIDIpOwotCQkgICAgZmluYWwgaW50IGkyID0gaTEgKyAxOwotCQkgICAgYi5hcHBlbmQoKGNoYXIpICgoc3JjW2kyXSA8PCA4KSArIHNyY1tpMV0pKTsKLQkJfQotCQkvKiBTdHJpcCAweDAwIGNoYXJhY3RlcnMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmc6ICovCi0JCXdoaWxlIChiLmNoYXJBdChiLmxlbmd0aCgpIC0gMSkgPT0gMHgwMCkKLQkJICAgIGIuc2V0TGVuZ3RoKGIubGVuZ3RoKCkgLSAxKTsKLQkJdmFsdWUgPSBiLnRvU3RyaW5nKCk7Ci0JCWJyZWFrOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigoaW50KSAobGFzdCAtIGZpcnN0KSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGkxID0gb2Zmc2V0ICsgKGkgKiAyKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGkyID0gaTEgKyAxOworICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgoY2hhcikgKChzcmNbaTJdIDw8IDgpICsgc3JjW2kxXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBTdHJpcCAweDAwIGNoYXJhY3RlcnMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmc6ICovCisgICAgICAgICAgICAgICAgd2hpbGUgKGIuY2hhckF0KGIubGVuZ3RoKCkgLSAxKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICBiLnNldExlbmd0aChiLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIFZhcmlhbnQuVlRfQ0Y6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIHYgPSBuZXcgYnl0ZVtsZW5ndGhdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgIHZbaV0gPSBzcmNbKGludCkgKG9mZnNldCArIGkpXTsKLQkJdmFsdWUgPSB2OworICAgICAgICAgICAgICAgIHZhbHVlID0gdjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgVmFyaWFudC5WVF9CT09MOgpAQCAtMTkwLDI0ICsyMDAsMjQgQEAKICAgICAgICAgICAgICAgICAgKiBzcmNbb2Zmc2V0ICsgM10gY29udGFpbiB0aGUgRFdvcmQgZm9yIFZUX0JPT0wsIHNvCiAgICAgICAgICAgICAgICAgICogc2tpcCBpdCwgd2UgZG9uJ3QgbmVlZCBpdC4KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlyc3QgPSBvZmZzZXQgKyBMaXR0bGVFbmRpYW4uSU5UX1NJWkU7CisgICAgICAgICAgICAgICAgLy8gZmluYWwgaW50IGZpcnN0ID0gb2Zmc2V0ICsgTGl0dGxlRW5kaWFuLklOVF9TSVpFOwogICAgICAgICAgICAgICAgIGxvbmcgYm9vbCA9IExpdHRsZUVuZGlhbi5nZXRVSW50KHNyYywgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICBpZiAoYm9vbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBCb29sZWFuKHRydWUpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCWJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gdiA9IG5ldyBieXRlW2xlbmd0aF07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgdltpXSA9IHNyY1soaW50KSAob2Zmc2V0ICsgaSldOwotCQl2YWx1ZSA9IHY7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0JcmV0dXJuIHZhbHVlOworICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9ocHNmL1ZhcmlhbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hwc2YvVmFyaWFudC5qYXZhCmluZGV4IGY0OWNlNGEuLmU0MDY4NWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hwc2YvVmFyaWFudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hwc2YvVmFyaWFudC5qYXZhCkBAIC03NiwxNzggKzc2LDE3OCBAQAogICAgIC8qKgogICAgICAqIDxwPltWXVtQXSBOb3RoaW5nLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9FTVBUWSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfRU1QVFkgPSAwOwogCiAgICAgLyoqCiAgICAgICogPHA+W1ZdW1BdIFNRTCBzdHlsZSBOdWxsLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9OVUxMID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9OVUxMID0gMTsKIAogICAgIC8qKgogICAgICAqIDxwPltWXVtUXVtQXVtTXSAyIGJ5dGUgc2lnbmVkIGludC48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfSTIgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0kyID0gMjsKIAogICAgIC8qKgogICAgICAqIDxwPltWXVtUXVtQXVtTXSA0IGJ5dGUgc2lnbmVkIGludC48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfSTQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0k0ID0gMzsKIAogICAgIC8qKgogICAgICAqIDxwPltWXVtUXVtQXVtTXSA0IGJ5dGUgcmVhbC48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfUjQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX1I0ID0gNDsKIAogICAgIC8qKgogICAgICAqIDxwPltWXVtUXVtQXVtTXSA4IGJ5dGUgcmVhbC48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfUjggPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX1I4ID0gNTsKIAogICAgIC8qKgogICAgICAqIDxwPltWXVtUXVtQXVtTXSBjdXJyZW5jeS4gPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6CiAgICAgICogI2ZmZmYwMCI+SG93IGxvbmcgaXMgdGhpcz8gSG93IGlzIGl0IHRvIGJlCiAgICAgICogaW50ZXJwcmV0ZWQ/PC9zcGFuPjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9DWSA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfQ1kgPSA2OwogCiAgICAgLyoqCiAgICAgICogPHA+W1ZdW1RdW1BdW1NdIGRhdGUuIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOgogICAgICAqICNmZmZmMDAiPkhvdyBsb25nIGlzIHRoaXM/IEhvdyBpcyBpdCB0byBiZQogICAgICAqIGludGVycHJldGVkPzwvc3Bhbj48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfREFURSA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfREFURSA9IDc7CiAKICAgICAvKioKICAgICAgKiA8cD5bVl1bVF1bUF1bU10gT0xFIEF1dG9tYXRpb24gc3RyaW5nLiA8c3BhbgogICAgICAqIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZjAwIj5Ib3cgbG9uZyBpcyB0aGlzPyBIb3cgaXMgaXQKICAgICAgKiB0byBiZSBpbnRlcnByZXRlZD88L3NwYW4+PC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX0JTVFIgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0JTVFIgPSA4OwogCiAgICAgLyoqCiAgICAgICogPHA+W1ZdW1RdW1BdW1NdIElEaXNwYXRjaCAqLiA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjoKICAgICAgKiAjZmZmZjAwIj5Ib3cgbG9uZyBpcyB0aGlzPyBIb3cgaXMgaXQgdG8gYmUKICAgICAgKiBpbnRlcnByZXRlZD88L3NwYW4+PC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX0RJU1BBVENIID0gOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9ESVNQQVRDSCA9IDk7CiAKICAgICAvKioKICAgICAgKiA8cD5bVl1bVF1bU10gU0NPREUuIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZjAwIj5Ib3cKICAgICAgKiBsb25nIGlzIHRoaXM/IEhvdyBpcyBpdCB0byBiZSBpbnRlcnByZXRlZD88L3NwYW4+PC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX0VSUk9SID0gMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfRVJST1IgPSAxMDsKIAogICAgIC8qKgogICAgICAqIDxwPltWXVtUXVtQXVtTXSBUcnVlPS0xLCBGYWxzZT0wLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9CT09MID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfQk9PTCA9IDExOwogCiAgICAgLyoqCiAgICAgICogPHA+W1ZdW1RdW1BdW1NdIFZBUklBTlQgKi4gPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6CiAgICAgICogI2ZmZmYwMCI+SG93IGxvbmcgaXMgdGhpcz8gSG93IGlzIGl0IHRvIGJlCiAgICAgICogaW50ZXJwcmV0ZWQ/PC9zcGFuPjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9WQVJJQU5UID0gMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfVkFSSUFOVCA9IDEyOwogCiAgICAgLyoqCiAgICAgICogPHA+W1ZdW1RdW1NdIElVbmtub3duICouIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOgogICAgICAqICNmZmZmMDAiPkhvdyBsb25nIGlzIHRoaXM/IEhvdyBpcyBpdCB0byBiZQogICAgICAqIGludGVycHJldGVkPzwvc3Bhbj48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfVU5LTk9XTiA9IDEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX1VOS05PV04gPSAxMzsKIAogICAgIC8qKgogICAgICAqIDxwPltWXVtUXVtTXSAxNiBieXRlIGZpeGVkIHBvaW50LjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9ERUNJTUFMID0gMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfREVDSU1BTCA9IDE0OwogCiAgICAgLyoqCiAgICAgICogPHA+W1RdIHNpZ25lZCBjaGFyLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9JMSA9IDE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0kxID0gMTY7CiAKICAgICAvKioKICAgICAgKiA8cD5bVl1bVF1bUF1bU10gdW5zaWduZWQgY2hhci48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfVUkxID0gMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfVUkxID0gMTc7CiAKICAgICAvKioKICAgICAgKiA8cD5bVF1bUF0gdW5zaWduZWQgc2hvcnQuPC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX1VJMiA9IDE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX1VJMiA9IDE4OwogCiAgICAgLyoqCiAgICAgICogPHA+W1RdW1BdIHVuc2lnbmVkIGludC48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfVUk0ID0gMTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfVUk0ID0gMTk7CiAKICAgICAvKioKICAgICAgKiA8cD5bVF1bUF0gc2lnbmVkIDY0LWJpdCBpbnQuPC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX0k4ID0gMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfSTggPSAyMDsKIAogICAgIC8qKgogICAgICAqIDxwPltUXVtQXSB1bnNpZ25lZCA2NC1iaXQgaW50LjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9VSTggPSAyMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9VSTggPSAyMTsKIAogICAgIC8qKgogICAgICAqIDxwPltUXSBzaWduZWQgbWFjaGluZSBpbnQuPC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX0lOVCA9IDIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0lOVCA9IDIyOwogCiAgICAgLyoqCiAgICAgICogPHA+W1RdIHVuc2lnbmVkIG1hY2hpbmUgaW50LjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9VSU5UID0gMjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfVUlOVCA9IDIzOwogCiAgICAgLyoqCiAgICAgICogPHA+W1RdIEMgc3R5bGUgdm9pZC48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfVk9JRCA9IDI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX1ZPSUQgPSAyNDsKIAogICAgIC8qKgogICAgICAqIDxwPltUXSBTdGFuZGFyZCByZXR1cm4gdHlwZS4gPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6CiAgICAgICogI2ZmZmYwMCI+SG93IGxvbmcgaXMgdGhpcz8gSG93IGlzIGl0IHRvIGJlCiAgICAgICogaW50ZXJwcmV0ZWQ/PC9zcGFuPjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9IUkVTVUxUID0gMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfSFJFU1VMVCA9IDI1OwogCiAgICAgLyoqCiAgICAgICogPHA+W1RdIHBvaW50ZXIgdHlwZS4gPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6CiAgICAgICogI2ZmZmYwMCI+SG93IGxvbmcgaXMgdGhpcz8gSG93IGlzIGl0IHRvIGJlCiAgICAgICogaW50ZXJwcmV0ZWQ/PC9zcGFuPjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9QVFIgPSAyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9QVFIgPSAyNjsKIAogICAgIC8qKgogICAgICAqIDxwPltUXSAodXNlIFZUX0FSUkFZIGluIFZBUklBTlQpLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9TQUZFQVJSQVkgPSAyNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9TQUZFQVJSQVkgPSAyNzsKIAogICAgIC8qKgogICAgICAqIDxwPltUXSBDIHN0eWxlIGFycmF5LiA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjoKICAgICAgKiAjZmZmZjAwIj5Ib3cgbG9uZyBpcyB0aGlzPyBIb3cgaXMgaXQgdG8gYmUKICAgICAgKiBpbnRlcnByZXRlZD88L3NwYW4+PC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX0NBUlJBWSA9IDI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0NBUlJBWSA9IDI4OwogCiAgICAgLyoqCiAgICAgICogPHA+W1RdIHVzZXIgZGVmaW5lZCB0eXBlLiA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjoKICAgICAgKiAjZmZmZjAwIj5Ib3cgbG9uZyBpcyB0aGlzPyBIb3cgaXMgaXQgdG8gYmUKICAgICAgKiBpbnRlcnByZXRlZD88L3NwYW4+PC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX1VTRVJERUZJTkVEID0gMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfVVNFUkRFRklORUQgPSAyOTsKIAogICAgIC8qKgogICAgICAqIDxwPltUXVtQXSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9MUFNUUiA9IDMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0xQU1RSID0gMzA7CiAKICAgICAvKioKICAgICAgKiA8cD5bVF1bUF0gd2lkZSAoVW5pY29kZSkgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfTFBXU1RSID0gMzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfTFBXU1RSID0gMzE7CiAKICAgICAvKioKICAgICAgKiA8cD5bUF0gRklMRVRJTUUuIFRoZSBGSUxFVElNRSBzdHJ1Y3R1cmUgaG9sZHMgYSBkYXRlIGFuZCB0aW1lCkBAIC0yNTYsNTAgKzI1Niw1MCBAQAogICAgICAqIGhhdmUgcGFzc2VkIHNpbmNlIEphbnVhcnkgMSwgMTYwMS4gVGhpcyA2NC1iaXQgdmFsdWUgaXMgc3BsaXQKICAgICAgKiBpbnRvIHRoZSB0d28gZHdvcmRzIHN0b3JlZCBpbiB0aGUgc3RydWN0dXJlLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9GSUxFVElNRSA9IDY0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0ZJTEVUSU1FID0gNjQ7CiAKICAgICAvKioKICAgICAgKiA8cD5bUF0gTGVuZ3RoIHByZWZpeGVkIGJ5dGVzLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9CTE9CID0gNjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfQkxPQiA9IDY1OwogCiAgICAgLyoqCiAgICAgICogPHA+W1BdIE5hbWUgb2YgdGhlIHN0cmVhbSBmb2xsb3dzLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9TVFJFQU0gPSA2NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9TVFJFQU0gPSA2NjsKIAogICAgIC8qKgogICAgICAqIDxwPltQXSBOYW1lIG9mIHRoZSBzdG9yYWdlIGZvbGxvd3MuPC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX1NUT1JBR0UgPSA2NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9TVE9SQUdFID0gNjc7CiAKICAgICAvKioKICAgICAgKiA8cD5bUF0gU3RyZWFtIGNvbnRhaW5zIGFuIG9iamVjdC4gPHNwYW4KICAgICAgKiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2ZmZmYwMCI+IEhvdyBsb25nIGlzIHRoaXM/IEhvdyBpcyBpdAogICAgICAqIHRvIGJlIGludGVycHJldGVkPzwvc3Bhbj48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfU1RSRUFNRURfT0JKRUNUID0gNjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfU1RSRUFNRURfT0JKRUNUID0gNjg7CiAKICAgICAvKioKICAgICAgKiA8cD5bUF0gU3RvcmFnZSBjb250YWlucyBhbiBvYmplY3QuIDxzcGFuCiAgICAgICogc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmZmMDAiPiBIb3cgbG9uZyBpcyB0aGlzPyBIb3cgaXMgaXQKICAgICAgKiB0byBiZSBpbnRlcnByZXRlZD88L3NwYW4+PC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX1NUT1JFRF9PQkpFQ1QgPSA2OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9TVE9SRURfT0JKRUNUID0gNjk7CiAKICAgICAvKioKICAgICAgKiA8cD5bUF0gQmxvYiBjb250YWlucyBhbiBvYmplY3QuIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOgogICAgICAqICNmZmZmMDAiPkhvdyBsb25nIGlzIHRoaXM/IEhvdyBpcyBpdCB0byBiZQogICAgICAqIGludGVycHJldGVkPzwvc3Bhbj48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfQkxPQl9PQkpFQ1QgPSA3MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9CTE9CX09CSkVDVCA9IDcwOwogCiAgICAgLyoqCiAgICAgICogPHA+W1BdIENsaXBib2FyZCBmb3JtYXQuIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOgogICAgICAqICNmZmZmMDAiPkhvdyBsb25nIGlzIHRoaXM/IEhvdyBpcyBpdCB0byBiZQogICAgICAqIGludGVycHJldGVkPzwvc3Bhbj48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfQ0YgPSA3MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9DRiA9IDcxOwogCiAgICAgLyoqCiAgICAgICogPHA+W1BdIEEgQ2xhc3MgSUQuPC9wPgpAQCAtMzMxLDM0ICszMzEsNDYgQEAKICAgICAgKiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICogbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvY29tL3N0Z3JzdHJjXzB1d2suYXNwPC9hPi48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfQ0xTSUQgPSA3MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9DTFNJRCA9IDcyOwogCiAgICAgLyoqCiAgICAgICogPHA+W1BdIHNpbXBsZSBjb3VudGVkIGFycmF5LiA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjoKICAgICAgKiAjZmZmZjAwIj5Ib3cgbG9uZyBpcyB0aGlzPyBIb3cgaXMgaXQgdG8gYmUKICAgICAgKiBpbnRlcnByZXRlZD88L3NwYW4+PC9wPgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX1ZFQ1RPUiA9IDB4MTAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9WRUNUT1IgPSAweDEwMDA7CiAKICAgICAvKioKICAgICAgKiA8cD5bVl0gU0FGRUFSUkFZKi4gPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmZmMDAiPkhvdwogICAgICAqIGxvbmcgaXMgdGhpcz8gSG93IGlzIGl0IHRvIGJlIGludGVycHJldGVkPzwvc3Bhbj48L3A+CiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVlRfQVJSQVkgPSAweDIwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVlRfQVJSQVkgPSAweDIwMDA7CiAKICAgICAvKioKICAgICAgKiA8cD5bVl0gdm9pZCogZm9yIGxvY2FsIHVzZS4gPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6CiAgICAgICogI2ZmZmYwMCI+SG93IGxvbmcgaXMgdGhpcz8gSG93IGlzIGl0IHRvIGJlCiAgICAgICogaW50ZXJwcmV0ZWQ/PC9zcGFuPjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9CWVJFRiA9IDB4NDAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9CWVJFRiA9IDB4NDAwMDsKIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX1JFU0VSVkVEID0gMHg4MDAwOworICAgIC8qKgorICAgICAqIDxwPkZJWE1FOiBEb2N1bWVudCB0aGlzITwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWVF9SRVNFUlZFRCA9IDB4ODAwMDsKIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX0lMTEVHQUwgPSAweEZGRkY7CisgICAgLyoqCisgICAgICogPHA+RklYTUU6IERvY3VtZW50IHRoaXMhPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0lMTEVHQUwgPSAweEZGRkY7CiAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBWVF9JTExFR0FMTUFTS0VEID0gMHhGRkY7CisgICAgLyoqCisgICAgICogPHA+RklYTUU6IERvY3VtZW50IHRoaXMhPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX0lMTEVHQUxNQVNLRUQgPSAweEZGRjsKIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFZUX1RZUEVNQVNLID0gMHhGRkY7CisgICAgLyoqCisgICAgICogPHA+RklYTUU6IERvY3VtZW50IHRoaXMhPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZUX1RZUEVNQVNLID0gMHhGRkY7CiAKLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL2Rldi9Gb3JtdWxhVmlld2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL2Rldi9Gb3JtdWxhVmlld2VyLmphdmEKaW5kZXggMWU3ZmQ5NS4uMzQ0M2ZkYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9kZXYvRm9ybXVsYVZpZXdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvZGV2L0Zvcm11bGFWaWV3ZXIuamF2YQpAQCAtNzcsNyArNzcsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGEuKjsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOwogCiAvKioKICAqIEZvcm11bGFWaWV3ZXIgLSBmaW5kcyBmb3JtdWxhcyBpbiBhIEJJRkY4IGZpbGUgYW5kIGF0dGVtcHRzIHRvIHJlYWQgdGhlbS9kaXNwbGF5CkBAIC0xNDQsNyArMTQzLDcgQEAKICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmICh0b2tlbiBpbnN0YW5jZW9mIEV4cFB0ZykgcmV0dXJuOwotICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lPSgoT3BlcmF0aW9uUHRnKSB0b2tlbikudG9Gb3JtdWxhU3RyaW5nKChTaGVldFJlZmVyZW5jZXMpbnVsbCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lPSgoT3BlcmF0aW9uUHRnKSB0b2tlbikudG9Gb3JtdWxhU3RyaW5nKChXb3JrYm9vayludWxsKSk7CiAgICAgICAgICAgICBidWYuYXBwZW5kKHNlcCk7CiAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLmdldFB0Z0NsYXNzKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIFB0Zy5DTEFTU19SRUYgOgpAQCAtMjEzLDcgKzIxMiw3IEBACiAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPG51bXB0Z3M7aSsrKSB7CiAgICAgICAgICAgIHRva2VuID0gKFB0ZykgdG9rZW5zLmdldChpKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHRva2VuLnRvRm9ybXVsYVN0cmluZygoU2hlZXRSZWZlcmVuY2VzKW51bGwpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHRva2VuLnRvRm9ybXVsYVN0cmluZygoV29ya2Jvb2spbnVsbCkpOwogICAgICAgICAgICAgc3dpdGNoICh0b2tlbi5nZXRQdGdDbGFzcygpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBQdGcuQ0xBU1NfUkVGIDoKICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiKFIpIik7CkBAIC0yMzMsNyArMjMyLDcgQEAKICAgICAKICAgICBwcml2YXRlIFN0cmluZyBjb21wb3NlRm9ybXVsYShGb3JtdWxhUmVjb3JkIHJlY29yZCkKICAgICB7Ci0gICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLkZvcm11bGFQYXJzZXIudG9Gb3JtdWxhU3RyaW5nKChTaGVldFJlZmVyZW5jZXMpbnVsbCxyZWNvcmQuZ2V0UGFyc2VkRXhwcmVzc2lvbigpKTsKKyAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuRm9ybXVsYVBhcnNlci50b0Zvcm11bGFTdHJpbmcoKFdvcmtib29rKW51bGwscmVjb3JkLmdldFBhcnNlZEV4cHJlc3Npb24oKSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL21vZGVsL0Zvcm11bGFQYXJzZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvRm9ybXVsYVBhcnNlci5qYXZhCmluZGV4IGI0MWYwODQuLjYwNTE1NzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvRm9ybXVsYVBhcnNlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvRm9ybXVsYVBhcnNlci5qYXZhCkBAIC02NCw3ICs2NCw2IEBACiAvL2ltcG9ydCBQVEcncyAuLiBzaW5jZSB3ZSBuZWVkIGV2ZXJ5dGhpbmcsIGltcG9ydCAqCiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuZm9ybXVsYS4qOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKIAogCiAvKioKQEAgLTMzNSwxMCArMzM0LDE0IEBACiAgICAgICAgIGludCBudW1BcmdzID0gQXJndW1lbnRzKCk7CiAgICAgICAgIE1hdGNoKCcpJyk7CiAgICAgICAgICAgICAgICAgCi0gICAgICAgIFB0ZyBmdW5jdGlvblB0ZyA9IGdldEZ1bmN0aW9uKG5hbWUsKGJ5dGUpbnVtQXJncyk7CisgICAgICAgIEFic3RyYWN0RnVuY3Rpb25QdGcgZnVuY3Rpb25QdGcgPSBnZXRGdW5jdGlvbihuYW1lLChieXRlKW51bUFyZ3MpOwogICAgICAgICAKIAkJdG9rZW5zLmFkZChmdW5jdGlvblB0Zyk7CiAgCisgICAgICAgIGlmIChmdW5jdGlvblB0Zy5nZXROYW1lKCkuZXF1YWxzKCJleHRlcm5hbGZsYWciKSkgeworICAgICAgICAgICAgdG9rZW5zLmFkZChuZXcgTmFtZVB0ZyhuYW1lLCB0aGlzLmJvb2spKTsKKyAgICAgICAgfQorCiAgCQkvL3JlbW92ZSB3aGF0IHdlIGp1c3QgcHV0IGluCiAJCXRoaXMuZnVuY3Rpb25Ub2tlbnMucmVtb3ZlKDApOwogICAgIH0KQEAgLTM4Miw4ICszODUsOCBAQAogICAgICAqIEBwYXJhbSBudW1BcmdzCiAgICAgICogQHJldHVybiBQdGcgYSBudWxsIGlzIHJldHVybmVkIGlmIHdlJ3JlIGluIGFuIElGIGZvcm11bGEsIGl0IG5lZWRzIGV4dHJlbWUgbWFuaXB1bGF0aW9uIGFuZCBpcyBoYW5kbGVkIGluIHRoaXMgZnVuY3Rpb24KICAgICAgKi8KLSAgICBwcml2YXRlIFB0ZyBnZXRGdW5jdGlvbihTdHJpbmcgbmFtZSxieXRlIG51bUFyZ3MpIHsKLSAgICAgICAgUHRnIHJldHZhbCA9IG51bGw7CisgICAgcHJpdmF0ZSBBYnN0cmFjdEZ1bmN0aW9uUHRnIGdldEZ1bmN0aW9uKFN0cmluZyBuYW1lLCBieXRlIG51bUFyZ3MpIHsKKyAgICAgICAgQWJzdHJhY3RGdW5jdGlvblB0ZyByZXR2YWwgPSBudWxsOwogICAgICAgICAKICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJJRiIpKSB7CiAgICAgICAgICAgICByZXR2YWwgPSBuZXcgRnVuY1ZhclB0ZyhBYnN0cmFjdEZ1bmN0aW9uUHRnLkFUVFJfTkFNRSwgbnVtQXJncyk7CkBAIC03OTUsNjkgKzc5OCw4NSBAQAogICAgIC8qKgogICAgICAqIENvbnZpZW5jZSBtZXRob2Qgd2hpY2ggdGFrZXMgaW4gYSBsaXN0IHRoZW4gcGFzc2VzIGl0IHRvIHRoZSBvdGhlciB0b0Zvcm11bGFTdHJpbmcKICAgICAgKiBzaWduYXR1cmUuIAotICAgICAqIEBwYXJhbSBscHRncyAtIGxpc3Qgb2YgcHRncywgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gYm9vayAgIHdvcmtib29rIGZvciAzRCBhbmQgbmFtZWQgcmVmZXJlbmNlcworICAgICAqIEBwYXJhbSBscHRncyAgbGlzdCBvZiBQdGcsIGNhbiBiZSBudWxsIG9yIGVtcHR5CisgICAgICogQHJldHVybiBhIGh1bWFuIHJlYWRhYmxlIFN0cmluZwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhTaGVldFJlZmVyZW5jZXMgcmVmcywgTGlzdCBscHRncykgeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rLCBMaXN0IGxwdGdzKSB7CiAgICAgICAgIFN0cmluZyByZXR2YWwgPSBudWxsOwogICAgICAgICBpZiAobHB0Z3MgPT0gbnVsbCB8fCBscHRncy5zaXplKCkgPT0gMCkgcmV0dXJuICIjTkFNRSI7CiAgICAgICAgIFB0Z1tdIHB0Z3MgPSBuZXcgUHRnW2xwdGdzLnNpemUoKV07CiAgICAgICAgIHB0Z3MgPSAoUHRnW10pbHB0Z3MudG9BcnJheShwdGdzKTsKLSAgICAgICAgcmV0dmFsID0gdG9Gb3JtdWxhU3RyaW5nKHJlZnMsIHB0Z3MpOworICAgICAgICByZXR2YWwgPSB0b0Zvcm11bGFTdHJpbmcoYm9vaywgcHRncyk7CiAgICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgfQogICAgIAotICAgIC8qKiBTdGF0aWMgbWV0aG9kIHRvIGNvbnZlcnQgYW4gYXJyYXkgb2YgUHRncyBpbiBSUE4gb3JkZXIgCi0gICAgICogIHRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIGZvcm1hdCBpbiBpbmZpeCBtb2RlCi0gICAgICogIEBwYXJhbSBwdGdzIC0gYXJyYXkgb2YgcHRncywgY2FuIGJlIG51bGwgb3IgZW1wdHkKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIGNvbnZlcnQgYW4gYXJyYXkgb2YgUHRncyBpbiBSUE4gb3JkZXIKKyAgICAgKiB0byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyBmb3JtYXQgaW4gaW5maXggbW9kZS4KKyAgICAgKiBAcGFyYW0gYm9vayAgd29ya2Jvb2sgZm9yIG5hbWVkIGFuZCAzRCByZWZlcmVuY2VzCisgICAgICogQHBhcmFtIHB0Z3MgIGFycmF5IG9mIFB0ZywgY2FuIGJlIG51bGwgb3IgZW1wdHkKKyAgICAgKiBAcmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgU3RyaW5nCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzLCBQdGdbXSBwdGdzKSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2ssIFB0Z1tdIHB0Z3MpIHsKICAgICAgICAgaWYgKHB0Z3MgPT0gbnVsbCB8fCBwdGdzLmxlbmd0aCA9PSAwKSByZXR1cm4gIiNOQU1FIjsKICAgICAgICAgamF2YS51dGlsLlN0YWNrIHN0YWNrID0gbmV3IGphdmEudXRpbC5TdGFjaygpOwotICAgICAgICBpbnQgbnVtUHRncyA9IHB0Z3MubGVuZ3RoOwotICAgICAgICBPcGVyYXRpb25QdGcgbzsKLSAgICAgICAgaW50IG51bU9wZXJhbmRzOwotICAgICAgICBTdHJpbmcgcmVzdWx0PW51bGw7Ci0gICAgICAgIFN0cmluZ1tdIG9wZXJhbmRzOwogICAgICAgICBBdHRyUHRnIGlmcHRnID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8bnVtUHRncztpKyspIHsKKwogICAgICAgICAgICAvLyBFeGNlbCBhbGxvd3MgdG8gaGF2ZSBBdHRyUHRnIGF0IHBvc2l0aW9uIDAgKHN1Y2ggYXMgQmxhbmtzKSB3aGljaAogICAgICAgICAgICAvLyBkbyBub3QgaGF2ZSBhbnkgb3BlcmFuZHMuIFNraXAgdGhlbS4KLSAgICAgICAgICAgIGlmIChwdGdzW2ldIGluc3RhbmNlb2YgT3BlcmF0aW9uUHRnICYmIGk+MCkgewotICAgICAgICAgICAgICAgICAgbyA9IChPcGVyYXRpb25QdGcpIHB0Z3NbaV07CisgICAgICAgIHN0YWNrLnB1c2gocHRnc1swXS50b0Zvcm11bGFTdHJpbmcoYm9vaykpOwogICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEF0dHJQdGcgJiYgKChBdHRyUHRnKW8pLmlzT3B0aW1pemVkSWYoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWZwdGc9KEF0dHJQdGcpbzsKLSAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcHRncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCEgKHB0Z3NbaV0gaW5zdGFuY2VvZiBPcGVyYXRpb25QdGcpKSB7CisgICAgICAgICAgICAgICAgc3RhY2sucHVzaChwdGdzW2ldLnRvRm9ybXVsYVN0cmluZyhib29rKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgbnVtT3BlcmFuZHMgPSBvLmdldE51bWJlck9mT3BlcmFuZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kcyA9IG5ldyBTdHJpbmdbbnVtT3BlcmFuZHNdOworICAgICAgICAgICAgaWYgKHB0Z3NbaV0gaW5zdGFuY2VvZiBBdHRyUHRnICYmICgoQXR0clB0ZykgcHRnc1tpXSkuaXNPcHRpbWl6ZWRJZigpKSB7CisgICAgICAgICAgICAgICAgaWZwdGcgPSAoQXR0clB0ZykgcHRnc1tpXTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7ajxudW1PcGVyYW5kcztqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNbbnVtT3BlcmFuZHMtai0xXSA9IChTdHJpbmcpIHN0YWNrLnBvcCgpOyAvL1RPRE86IGNhdGNoIHN0YWNrIHVuZGVyZmxvdyBhbmQgdGhyb3cgcGFyc2UgZXhjZXB0aW9uLiAKKyAgICAgICAgICAgIGZpbmFsIE9wZXJhdGlvblB0ZyBvID0gKE9wZXJhdGlvblB0ZykgcHRnc1tpXTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG9wZXJhbmRzID0gbmV3IFN0cmluZ1tvLmdldE51bWJlck9mT3BlcmFuZHMoKV07CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBvcGVyYW5kcy5sZW5ndGg7IGogPiAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAvL1RPRE86IGNhdGNoIHN0YWNrIHVuZGVyZmxvdyBhbmQgdGhyb3cgcGFyc2UgZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgIG9wZXJhbmRzW2ogLSAxXSA9IChTdHJpbmcpIHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgIH0gIAogCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKCAobyBpbnN0YW5jZW9mIEFic3RyYWN0RnVuY3Rpb25QdGcpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQWJzdHJhY3RGdW5jdGlvblB0ZylvKS5nZXROYW1lKCkuZXF1YWxzKCJzcGVjaWFsZmxhZyIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZwdGcgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgc3RhY2sucHVzaChvLnRvRm9ybXVsYVN0cmluZyhvcGVyYW5kcykpOworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEFic3RyYWN0RnVuY3Rpb25QdGcpKSBjb250aW51ZTsKKworICAgICAgICAgICAgZmluYWwgQWJzdHJhY3RGdW5jdGlvblB0ZyBmID0gKEFic3RyYWN0RnVuY3Rpb25QdGcpIG87CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm5hbWUgPSBmLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChmbmFtZSA9PSBudWxsKSBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKChpZnB0ZyAhPSBudWxsKSAmJiAoZm5hbWUuZXF1YWxzKCJzcGVjaWFsZmxhZyIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNwZWNpYWwgY2FzZSB3aWxsIGJlIHdheSBkaWZmZXJlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlmcHRnLnRvRm9ybXVsYVN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyhvLnRvRm9ybXVsYVN0cmluZyhvcGVyYW5kcykpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnB0ZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBvLnRvRm9ybXVsYVN0cmluZyhvcGVyYW5kcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goaWZwdGcudG9Gb3JtdWxhU3RyaW5nKG5ldyBTdHJpbmdbXXsoU3RyaW5nKSBzdGFjay5wb3AoKX0pKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChyZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChmbmFtZS5lcXVhbHMoImV4dGVybmFsZmxhZyIpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRvcCA9IChTdHJpbmcpIHN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwYXJlbiA9IHRvcC5pbmRleE9mKCcoJyk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbW1hID0gdG9wLmluZGV4T2YoJywnKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWEgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJwYXJlbiA9IHRvcC5pbmRleE9mKCcpJyk7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godG9wLnN1YnN0cmluZyhwYXJlbiArIDEsIHJwYXJlbikgKyAiKCkiKTsKICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHB0Z3NbaV0udG9Gb3JtdWxhU3RyaW5nKHJlZnMpKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0b3Auc3Vic3RyaW5nKHBhcmVuICsgMSwgY29tbWEpICsgJygnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3Auc3Vic3RyaW5nKGNvbW1hICsgMSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBzdGFjay5wb3AoKTsgLy9UT0RPOiBjYXRjaCBzdGFjayB1bmRlcmZsb3cgYW5kIHRocm93IHBhcnNlIGV4Y2VwdGlvbi4gCiAgICAgfQorICAgICAgICAvLyBUT0RPOiBjYXRjaCBzdGFjayB1bmRlcmZsb3cgYW5kIHRocm93IHBhcnNlIGV4Y2VwdGlvbi4KKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIHN0YWNrLnBvcCgpOworICAgIH0KKworCiAgICAgLyoqIENyZWF0ZSBhIHRyZWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIFJQTiB0b2tlbiBhcnJheQogICAgICAqdXNlZCB0byBydW4gdGhlIGNsYXNzKFJWQSkgY2hhbmdlIGFsZ28KICAgICAgKi8KQEAgLTg5MCwxMSArOTA5LDkgQEAKICAgICAgKiAgIFVzZWZ1bCBmb3IgdGVzdGluZwogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFNoZWV0UmVmZXJlbmNlcyByZWZzID0gbnVsbDsKLSAgICAgICAgaWYgKGJvb2shPW51bGwpICBib29rLmdldFNoZWV0UmVmZXJlbmNlcygpOwogICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICBmb3IgKGludCBpPTA7aTx0b2tlbnMuc2l6ZSgpO2krKykgewotICAgICAgICAgICAgYnVmLmFwcGVuZCggKCAoUHRnKXRva2Vucy5nZXQoaSkpLnRvRm9ybXVsYVN0cmluZyhyZWZzKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCAoIChQdGcpdG9rZW5zLmdldChpKSkudG9Gb3JtdWxhU3RyaW5nKGJvb2spKTsKICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyAnKTsKICAgICAgICAgfSAKICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9tb2RlbC9TaGVldC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9tb2RlbC9TaGVldC5qYXZhCmluZGV4IDlhN2FiYWQuLmMwZjA3YjggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvU2hlZXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL21vZGVsL1NoZWV0LmphdmEKQEAgLTEwOCw5ICsxMDgsMTAgQEAKICAgICBwcm90ZWN0ZWQgSGVhZGVyUmVjb3JkICAgICAgICAgICAgICBoZWFkZXIgICAgICAgICAgID0gbnVsbDsKICAgICBwcm90ZWN0ZWQgRm9vdGVyUmVjb3JkICAgICAgICAgICAgICBmb290ZXIgICAgICAgICAgID0gbnVsbDsKICAgICBwcm90ZWN0ZWQgUHJpbnRHcmlkbGluZXNSZWNvcmQgICAgICBwcmludEdyaWRsaW5lcyAgID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgV2luZG93VHdvUmVjb3JkICAgICAgICAgICB3aW5kb3dUd28gICAgICAgID0gbnVsbDsKICAgICBwcm90ZWN0ZWQgTWVyZ2VDZWxsc1JlY29yZCAgICAgICAgICBtZXJnZWQgICAgICAgICAgID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0ICAgICAgICAgICAgICAgICBtZXJnZWRSZWNvcmRzICAgID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgICAgICAgICAgICAgICAgIG1lcmdlZExvY3MgICAgICAgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJvdGVjdGVkIE1hcmdpbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luc1tdICAgICAgICA9IG51bGw7CisgICAgcHJvdGVjdGVkIExpc3QgICAgICAgICAgICAgICAgIAkJbWVyZ2VkUmVjb3JkcyAgICA9IG5ldyBBcnJheUxpc3QoKTsKICAgICBwcm90ZWN0ZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICBudW1NZXJnZWRSZWdpb25zID0gMDsKICAgICBwcm90ZWN0ZWQgU2VsZWN0aW9uUmVjb3JkICAgICAgICAgICBzZWxlY3Rpb24gICAgICAgID0gbnVsbDsKICAgICBwcml2YXRlIHN0YXRpYyBQT0lMb2dnZXIgICAgICAgICAgICBsb2cgICAgICAgICAgICAgID0gUE9JTG9nRmFjdG9yeS5nZXRMb2dnZXIoU2hlZXQuY2xhc3MpOwpAQCAtMTIwLDYgKzEyMSw3IEBACiAgICAgcHJpdmF0ZSBJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgdmFsdWVSZWNJdGVyYXRvciA9IG51bGw7CiAgICAgcHJpdmF0ZSBJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgcm93UmVjSXRlcmF0b3IgICA9IG51bGw7CiAgICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgICAgICAgICAgICAgZW9mTG9jICAgICAgICAgICA9IDA7CisJcHJvdGVjdGVkIFByb3RlY3RSZWNvcmQgICAgICAgICAgICAgcHJvdGVjdCAgICAgICAgICA9IG51bGw7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEFORV9MT1dFUl9SSUdIVCA9IChieXRlKTA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBBTkVfVVBQRVJfUklHSFQgPSAoYnl0ZSkxOwpAQCAtMTk1LDcgKzE5Nyw2IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dmFsLm1lcmdlZFJlY29yZHMuYWRkKHJlYyk7CiAgICAgICAgICAgICAgICAgcmV0dmFsLm1lcmdlZCA9ICggTWVyZ2VDZWxsc1JlY29yZCApIHJlYzsKLSAgICAgICAgICAgICAgICByZXR2YWwubWVyZ2VkTG9jcy5hZGQobmV3IEludGVnZXIoayAtIG9mZnNldCkpOwogICAgICAgICAgICAgICAgIHJldHZhbC5udW1NZXJnZWRSZWdpb25zICs9IHJldHZhbC5tZXJnZWQuZ2V0TnVtQXJlYXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKHJlYy5nZXRTaWQoKSA9PSBDb2x1bW5JbmZvUmVjb3JkLnNpZCkKQEAgLTIzNCw5ICsyMzUsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoIHJlYy5nZXRTaWQoKSA9PSBSb3dSZWNvcmQuc2lkICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAkgUm93UmVjb3JkIHJvdyA9IChSb3dSZWNvcmQpcmVjOwotICAgICAgICAgICAgCSBpZiAoIWlzZmlyc3Ryb3cpIHJlYyA9IG51bGw7IC8vb25seSBhZGQgdGhlIGFnZ3JlZ2F0ZSBvbmNlCi0gICAgICAgICAgICAJIAorICAgICAgICAgICAgICAgIFJvd1JlY29yZCByb3cgPSAoUm93UmVjb3JkKXJlYzsKKyAgICAgICAgICAgICAgICBpZiAoIWlzZmlyc3Ryb3cpIHJlYyA9IG51bGw7IC8vb25seSBhZGQgdGhlIGFnZ3JlZ2F0ZSBvbmNlCisKICAgICAgICAgICAgICAgICBpZiAoIGlzZmlyc3Ryb3cgKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnJvd3MgPSBuZXcgUm93UmVjb3Jkc0FnZ3JlZ2F0ZSgpOwpAQCAtMjQ5LDIyICsyNTAsNDYgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR2YWwucHJpbnRHcmlkbGluZXMgPSAoUHJpbnRHcmlkbGluZXNSZWNvcmQpIHJlYzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCByZWMuZ2V0U2lkKCkgPT0gSGVhZGVyUmVjb3JkLnNpZCApCisgICAgICAgICAgICBlbHNlIGlmICggcmVjLmdldFNpZCgpID09IEhlYWRlclJlY29yZC5zaWQgJiYgYm9mRW9mTmVzdGluZ0xldmVsID09IDEpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dmFsLmhlYWRlciA9IChIZWFkZXJSZWNvcmQpIHJlYzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCByZWMuZ2V0U2lkKCkgPT0gRm9vdGVyUmVjb3JkLnNpZCApCisgICAgICAgICAgICBlbHNlIGlmICggcmVjLmdldFNpZCgpID09IEZvb3RlclJlY29yZC5zaWQgJiYgYm9mRW9mTmVzdGluZ0xldmVsID09IDEpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dmFsLmZvb3RlciA9IChGb290ZXJSZWNvcmQpIHJlYzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCByZWMuZ2V0U2lkKCkgPT0gUHJpbnRTZXR1cFJlY29yZC5zaWQgKQorICAgICAgICAgICAgZWxzZSBpZiAoIHJlYy5nZXRTaWQoKSA9PSBQcmludFNldHVwUmVjb3JkLnNpZCAmJiBib2ZFb2ZOZXN0aW5nTGV2ZWwgPT0gMSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR2YWwucHJpbnRTZXR1cCA9IChQcmludFNldHVwUmVjb3JkKSByZWM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggcmVjLmdldFNpZCgpID09IExlZnRNYXJnaW5SZWNvcmQuc2lkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHZhbC5nZXRNYXJnaW5zKClbTGVmdE1hcmdpbl0gPSAoTGVmdE1hcmdpblJlY29yZCkgcmVjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHJlYy5nZXRTaWQoKSA9PSBSaWdodE1hcmdpblJlY29yZC5zaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dmFsLmdldE1hcmdpbnMoKVtSaWdodE1hcmdpbl0gPSAoUmlnaHRNYXJnaW5SZWNvcmQpIHJlYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCByZWMuZ2V0U2lkKCkgPT0gVG9wTWFyZ2luUmVjb3JkLnNpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR2YWwuZ2V0TWFyZ2lucygpW1RvcE1hcmdpbl0gPSAoVG9wTWFyZ2luUmVjb3JkKSByZWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggcmVjLmdldFNpZCgpID09IEJvdHRvbU1hcmdpblJlY29yZC5zaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dmFsLmdldE1hcmdpbnMoKVtCb3R0b21NYXJnaW5dID0gKEJvdHRvbU1hcmdpblJlY29yZCkgcmVjOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoIHJlYy5nZXRTaWQoKSA9PSBTZWxlY3Rpb25SZWNvcmQuc2lkICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR2YWwuc2VsZWN0aW9uID0gKFNlbGVjdGlvblJlY29yZCkgcmVjOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHJlYy5nZXRTaWQoKSA9PSBXaW5kb3dUd29SZWNvcmQuc2lkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR2YWwud2luZG93VHdvID0gKFdpbmRvd1R3b1JlY29yZCkgcmVjOworICAgICAgICAgICAgfQorCQkJZWxzZSBpZiAoIHJlYy5nZXRTaWQoKSA9PSBQcm90ZWN0UmVjb3JkLnNpZCApCisJCQl7CisJCQkJcmV0dmFsLnByb3RlY3QgPSAoUHJvdGVjdFJlY29yZCkgcmVjOworCQkJfQogCiAgICAgICAgICAgICBpZiAocmVjICE9IG51bGwpCiAgICAgICAgICAgICB7CkBAIC0yNzIsMTQgKzI5NywxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHZhbC5yZWNvcmRzID0gcmVjb3JkczsKLSAgICAgICAgaWYgKHJldHZhbC5yb3dzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHZhbC5yb3dzID0gbmV3IFJvd1JlY29yZHNBZ2dyZWdhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dmFsLmNlbGxzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHZhbC5jZWxscyA9IG5ldyBWYWx1ZVJlY29yZHNBZ2dyZWdhdGUoKTsKLSAgICAgICAgfQorLy8gICAgICAgIGlmIChyZXR2YWwucm93cyA9PSBudWxsKQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgcmV0dmFsLnJvd3MgPSBuZXcgUm93UmVjb3Jkc0FnZ3JlZ2F0ZSgpOworLy8gICAgICAgIH0KKyAgICAgICAgcmV0dmFsLmNoZWNrQ2VsbHMoKTsKKyAgICAgICAgcmV0dmFsLmNoZWNrUm93cygpOworLy8gICAgICAgIGlmIChyZXR2YWwuY2VsbHMgPT0gbnVsbCkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHJldHZhbC5jZWxscyA9IG5ldyBWYWx1ZVJlY29yZHNBZ2dyZWdhdGUoKTsKKy8vICAgICAgICB9CiAgICAgICAgIGxvZy5sb2cobG9nLkRFQlVHLCAic2hlZXQgY3JlYXRlU2hlZXQgKGV4aXN0aW5nIGZpbGUpIGV4aXRlZCIpOwogICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgIH0KQEAgLTM5MSwxMSArNDE4LDEzIEBACiAgICAgICAgIHJldHZhbC5kaW1zICAgID0gKCBEaW1lbnNpb25zUmVjb3JkICkgcmV0dmFsLmNyZWF0ZURpbWVuc2lvbnMoKTsKICAgICAgICAgcmV0dmFsLmRpbXNsb2MgPSAxOTsKICAgICAgICAgcmVjb3Jkcy5hZGQocmV0dmFsLmRpbXMpOwotICAgICAgICByZWNvcmRzLmFkZChyZXR2YWwuY3JlYXRlV2luZG93VHdvKCkpOworICAgICAgICByZWNvcmRzLmFkZChyZXR2YWwud2luZG93VHdvID0gcmV0dmFsLmNyZWF0ZVdpbmRvd1R3bygpKTsKICAgICAgICAgcmV0dmFsLnNldExvYyhyZWNvcmRzLnNpemUoKSAtIDEpOwogICAgICAgICByZXR2YWwuc2VsZWN0aW9uID0gCiAgICAgICAgICAgICAgICAgKFNlbGVjdGlvblJlY29yZCkgcmV0dmFsLmNyZWF0ZVNlbGVjdGlvbigpOwogICAgICAgICByZWNvcmRzLmFkZChyZXR2YWwuc2VsZWN0aW9uKTsKKwkJcmV0dmFsLnByb3RlY3QgPSAoUHJvdGVjdFJlY29yZCkgcmV0dmFsLmNyZWF0ZVByb3RlY3QoKTsKKwkJcmVjb3Jkcy5hZGQocmV0dmFsLnByb3RlY3QpOwogICAgICAgICByZWNvcmRzLmFkZChyZXR2YWwuY3JlYXRlRU9GKCkpOwogICAgICAgICByZXR2YWwucmVjb3JkcyA9IHJlY29yZHM7CiAgICAgICAgIGxvZy5sb2cobG9nLkRFQlVHLCAiU2hlZXQgY3JlYXRlc2hlZXQgZnJvbSBzY3JhdGNoIGV4aXQiKTsKQEAgLTQyNyw4ICs0NTYsNyBAQAogICAgICAgICBpZiAobWVyZ2VkID09IG51bGwgfHwgbWVyZ2VkLmdldE51bUFyZWFzKCkgPT0gMTAyNykKICAgICAgICAgewogICAgICAgICAgICAgbWVyZ2VkID0gKCBNZXJnZUNlbGxzUmVjb3JkICkgY3JlYXRlTWVyZ2VkQ2VsbHMoKTsKLSAgICAgICAgICAgIG1lcmdlZFJlY29yZHMuYWRkKG1lcmdlZCk7Ci0gICAgICAgICAgICBtZXJnZWRMb2NzLmFkZChuZXcgSW50ZWdlcihyZWNvcmRzLnNpemUoKSAtIDEpKTsKKyAgICAgICAgICAgIG1lcmdlZFJlY29yZHMuYWRkKG1lcmdlZCk7ICAgICAgICAgICAgCiAgICAgICAgICAgICByZWNvcmRzLmFkZChyZWNvcmRzLnNpemUoKSAtIDEsIG1lcmdlZCk7CiAgICAgICAgIH0KICAgICAgICAgbWVyZ2VkLmFkZEFyZWEocm93RnJvbSwgY29sRnJvbSwgcm93VG8sIGNvbFRvKTsKQEAgLTQ2OSwxMiArNDk3LDE4IEBACiAgICAgICAgIG51bU1lcmdlZFJlZ2lvbnMtLTsKICAgICAgICAgaWYgKHJlYy5nZXROdW1BcmVhcygpID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1lcmdlZFJlY29yZHMucmVtb3ZlKHBvcyk7Ci0gICAgICAgICAgICBpZiAobWVyZ2VkID09IHJlYykKLSAgICAgICAgICAgIAltZXJnZWQgPSAoTWVyZ2VDZWxsc1JlY29yZCkgbWVyZ2VkUmVjb3Jkcy5nZXQobWVyZ2VkUmVjb3Jkcy5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIGludCByZW1vdmVQb3MgPSAoKEludGVnZXIpIG1lcmdlZExvY3MuZ2V0KHBvcykpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICByZWNvcmRzLnJlbW92ZShyZW1vdmVQb3MpOwotICAgICAgICAgICAgbWVyZ2VkTG9jcy5yZW1vdmUocG9zKTsKKwkJCW1lcmdlZFJlY29yZHMucmVtb3ZlKHBvcyk7CisJCQkvL2dldCByaWQgb2YgdGhlIHJlY29yZCBmcm9tIHRoZSBzaGVldAorCQkJcmVjb3Jkcy5yZW1vdmUobWVyZ2VkKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChtZXJnZWQgPT0gcmVjKSB7CisgICAgICAgICAgICAJLy9wdWxsIHVwIHRoZSBMQVNUIHJlY29yZCBmb3Igb3BlcmF0aW9ucyB3aGVuIHdlIGZpbmFsbHkKKyAgICAgICAgICAgIAkvL3N1cHBvcnQgY29udGludWUgcmVjb3JkcyBmb3IgbWVyZ2VkUmVnaW9ucworICAgICAgICAgICAgCWlmIChtZXJnZWRSZWNvcmRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIAkJbWVyZ2VkID0gKE1lcmdlQ2VsbHNSZWNvcmQpIG1lcmdlZFJlY29yZHMuZ2V0KG1lcmdlZFJlY29yZHMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgICAgIAkJbWVyZ2VkID0gbnVsbDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk3MCwxMCArMTAwNCw3IEBACiAgICAgewogICAgICAgICBjaGVja0NlbGxzKCk7CiAgICAgICAgIGxvZy5sb2dGb3JtYXR0ZWQobG9nLkRFQlVHLCAicmVtb3ZlIHZhbHVlIHJlY29yZCByb3csZGltc2xvYyAlLCUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXQotICAgICAgICB7Ci0gICAgICAgICAgICByb3csIGRpbXNsb2MKLSAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtde3JvdywgZGltc2xvY30gKTsKICAgICAgICAgbG9jID0gZGltc2xvYzsKICAgICAgICAgY2VsbHMucmVtb3ZlQ2VsbChjb2wpOwogCkBAIC0yMDExLDcgKzIwNDIsNyBAQAogICAgICAqIEByZXR1cm4gcmVjb3JkIGNvbnRhaW5pbmcgYSBXaW5kb3dUd29SZWNvcmQKICAgICAgKi8KIAotICAgIHByb3RlY3RlZCBSZWNvcmQgY3JlYXRlV2luZG93VHdvKCkKKyAgICBwcm90ZWN0ZWQgV2luZG93VHdvUmVjb3JkIGNyZWF0ZVdpbmRvd1R3bygpCiAgICAgewogICAgICAgICBXaW5kb3dUd29SZWNvcmQgcmV0dmFsID0gbmV3IFdpbmRvd1R3b1JlY29yZCgpOwogCkBAIC0yMzEyLDcgKzIzNDMsNiBAQAogICAgICAqIEBwYXJhbSBzZWwgVHJ1ZSB0byBzZWxlY3QgdGhlIHNoZWV0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWwpIHsKLSAgICAgICAgV2luZG93VHdvUmVjb3JkIHdpbmRvd1R3byA9IChXaW5kb3dUd29SZWNvcmQpIGZpbmRGaXJzdFJlY29yZEJ5U2lkKFdpbmRvd1R3b1JlY29yZC5zaWQpOwogICAgICAgICB3aW5kb3dUd28uc2V0U2VsZWN0ZWQoc2VsKTsKICAgICB9CiAKQEAgLTIzMjEsODIgKzIzNTEsNTkgQEAKICAgICAgICogQHBhcmFtIG1hcmdpbiB3aGljaCBtYXJnaW4gdG8gZ2V0CiAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIG1hcmdpbgogICAgICAgKi8KLSAgICAgcHVibGljIGRvdWJsZSBnZXRNYXJnaW4oc2hvcnQgbWFyZ2luKSB7Ci0gICAgICAgICBNYXJnaW4gbTsKLSAgICAgICAgIHN3aXRjaCAoIG1hcmdpbiApCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgY2FzZSBMZWZ0TWFyZ2luOgotICAgICAgICAgICAgICAgICBtID0gKE1hcmdpbikgZmluZEZpcnN0UmVjb3JkQnlTaWQoIExlZnRNYXJnaW5SZWNvcmQuc2lkICk7Ci0gICAgICAgICAgICAgICAgIGlmICggbSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiAuNzU7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGNhc2UgUmlnaHRNYXJnaW46Ci0gICAgICAgICAgICAgICAgIG0gPSAoTWFyZ2luKSBmaW5kRmlyc3RSZWNvcmRCeVNpZCggUmlnaHRNYXJnaW5SZWNvcmQuc2lkICk7Ci0gICAgICAgICAgICAgICAgIGlmICggbSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiAuNzU7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGNhc2UgVG9wTWFyZ2luOgotICAgICAgICAgICAgICAgICBtID0gKE1hcmdpbikgZmluZEZpcnN0UmVjb3JkQnlTaWQoIFRvcE1hcmdpblJlY29yZC5zaWQgKTsKLSAgICAgICAgICAgICAgICAgaWYgKCBtID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEuMDsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSBCb3R0b21NYXJnaW46Ci0gICAgICAgICAgICAgICAgIG0gPSAoTWFyZ2luKSBmaW5kRmlyc3RSZWNvcmRCeVNpZCggQm90dG9tTWFyZ2luUmVjb3JkLnNpZCApOwotICAgICAgICAgICAgICAgICBpZiAoIG0gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gMS4wOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJVbmtub3duIG1hcmdpbiBjb25zdGFudDogICIgKyBtYXJnaW4gKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBtLmdldE1hcmdpbigpOwotICAgICB9CisgICAgcHVibGljIGRvdWJsZSBnZXRNYXJnaW4oc2hvcnQgbWFyZ2luKSB7CisJaWYgKGdldE1hcmdpbnMoKVttYXJnaW5dICE9IG51bGwpCisJICAgIHJldHVybiBtYXJnaW5zW21hcmdpbl0uZ2V0TWFyZ2luKCk7CisJZWxzZSB7CisJICAgIHN3aXRjaCAoIG1hcmdpbiApCisJCXsKKwkJY2FzZSBMZWZ0TWFyZ2luOgorCQkgICAgcmV0dXJuIC43NTsKKwkJY2FzZSBSaWdodE1hcmdpbjoKKwkJICAgIHJldHVybiAuNzU7CisJCWNhc2UgVG9wTWFyZ2luOgorCQkgICAgcmV0dXJuIDEuMDsKKwkJY2FzZSBCb3R0b21NYXJnaW46CisJCSAgICByZXR1cm4gMS4wOworCQlkZWZhdWx0IDoKKwkJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5rbm93biBtYXJnaW4gY29uc3RhbnQ6ICAiICsgbWFyZ2luICk7CisJCX0KKwl9CisgICAgfQogCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBtYXJnaW4gaW4gaW5jaGVzLgogICAgICAgKiBAcGFyYW0gbWFyZ2luIHdoaWNoIG1hcmdpbiB0byBnZXQKICAgICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIG1hcmdpbgogICAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgc2V0TWFyZ2luKHNob3J0IG1hcmdpbiwgZG91YmxlIHNpemUpIHsKLSAgICAgICAgIE1hcmdpbiBtOwotICAgICAgICAgc3dpdGNoICggbWFyZ2luICkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBjYXNlIExlZnRNYXJnaW46Ci0gICAgICAgICAgICAgICAgIG0gPSAoTWFyZ2luKSBmaW5kRmlyc3RSZWNvcmRCeVNpZCggTGVmdE1hcmdpblJlY29yZC5zaWQgKTsKLSAgICAgICAgICAgICAgICAgaWYgKCBtID09IG51bGwgKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBtID0gbmV3IExlZnRNYXJnaW5SZWNvcmQoKTsKLSAgICAgICAgICAgICAgICAgICAgIHJlY29yZHMuYWRkKCBnZXREaW1zTG9jKCkgKyAxLCBtICk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSBSaWdodE1hcmdpbjoKLSAgICAgICAgICAgICAgICAgbSA9IChNYXJnaW4pIGZpbmRGaXJzdFJlY29yZEJ5U2lkKCBSaWdodE1hcmdpblJlY29yZC5zaWQgKTsKLSAgICAgICAgICAgICAgICAgaWYgKCBtID09IG51bGwgKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBtID0gbmV3IFJpZ2h0TWFyZ2luUmVjb3JkKCk7Ci0gICAgICAgICAgICAgICAgICAgICByZWNvcmRzLmFkZCggZ2V0RGltc0xvYygpICsgMSwgbSApOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGNhc2UgVG9wTWFyZ2luOgotICAgICAgICAgICAgICAgICBtID0gKE1hcmdpbikgZmluZEZpcnN0UmVjb3JkQnlTaWQoIFRvcE1hcmdpblJlY29yZC5zaWQgKTsKLSAgICAgICAgICAgICAgICAgaWYgKCBtID09IG51bGwgKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBtID0gbmV3IFRvcE1hcmdpblJlY29yZCgpOwotICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkcy5hZGQoIGdldERpbXNMb2MoKSArIDEsIG0gKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICBjYXNlIEJvdHRvbU1hcmdpbjoKLSAgICAgICAgICAgICAgICAgbSA9IChNYXJnaW4pIGZpbmRGaXJzdFJlY29yZEJ5U2lkKCBCb3R0b21NYXJnaW5SZWNvcmQuc2lkICk7Ci0gICAgICAgICAgICAgICAgIGlmICggbSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgbSA9IG5ldyBCb3R0b21NYXJnaW5SZWNvcmQoKTsKLSAgICAgICAgICAgICAgICAgICAgIHJlY29yZHMuYWRkKCBnZXREaW1zTG9jKCkgKyAxLCBtICk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5rbm93biBtYXJnaW4gY29uc3RhbnQ6ICAiICsgbWFyZ2luICk7Ci0gICAgICAgICB9Ci0gICAgICAgICBtLnNldE1hcmdpbiggc2l6ZSApOwotICAgICB9CisgICAgcHVibGljIHZvaWQgc2V0TWFyZ2luKHNob3J0IG1hcmdpbiwgZG91YmxlIHNpemUpIHsKKwlNYXJnaW4gbSA9IGdldE1hcmdpbnMoKVttYXJnaW5dOworCWlmIChtICA9PSBudWxsKSB7CisJICAgIHN3aXRjaCAoIG1hcmdpbiApCisJCXsKKwkJY2FzZSBMZWZ0TWFyZ2luOgorCQkgICAgbSA9IG5ldyBMZWZ0TWFyZ2luUmVjb3JkKCk7CisJCSAgICByZWNvcmRzLmFkZCggZ2V0RGltc0xvYygpICsgMSwgbSApOworCQkgICAgYnJlYWs7CisJCWNhc2UgUmlnaHRNYXJnaW46CisJCSAgICBtID0gbmV3IFJpZ2h0TWFyZ2luUmVjb3JkKCk7CisJCSAgICByZWNvcmRzLmFkZCggZ2V0RGltc0xvYygpICsgMSwgbSApOworCQkgICAgYnJlYWs7CisJCWNhc2UgVG9wTWFyZ2luOgorCQkgICAgbSA9IG5ldyBUb3BNYXJnaW5SZWNvcmQoKTsKKwkJICAgIHJlY29yZHMuYWRkKCBnZXREaW1zTG9jKCkgKyAxLCBtICk7CisJCSAgICBicmVhazsKKwkJY2FzZSBCb3R0b21NYXJnaW46CisJCSAgICBtID0gbmV3IEJvdHRvbU1hcmdpblJlY29yZCgpOworCQkgICAgcmVjb3Jkcy5hZGQoIGdldERpbXNMb2MoKSArIDEsIG0gKTsKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0IDoKKwkJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5rbm93biBtYXJnaW4gY29uc3RhbnQ6ICAiICsgbWFyZ2luICk7CisJCX0KKwkgICAgbWFyZ2luc1ttYXJnaW5dID0gbTsKKwl9CisJbS5zZXRNYXJnaW4oIHNpemUgKTsKKyAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldEVvZkxvYygpCiAgICAgewpAQCAtMjQzNCw5ICsyNDQxLDggQEAKICAgICAgICAgfQogICAgICAgICByZWNvcmRzLmFkZChsb2MrMSwgcGFuZSk7CiAKLSAgICAgICAgV2luZG93VHdvUmVjb3JkIHdpbmRvd1JlY29yZCA9IChXaW5kb3dUd29SZWNvcmQpIHJlY29yZHMuZ2V0KGxvYyk7Ci0gICAgICAgIHdpbmRvd1JlY29yZC5zZXRGcmVlemVQYW5lcyh0cnVlKTsKLSAgICAgICAgd2luZG93UmVjb3JkLnNldEZyZWV6ZVBhbmVzTm9TcGxpdCh0cnVlKTsKKyAgICAgICAgd2luZG93VHdvLnNldEZyZWV6ZVBhbmVzKHRydWUpOworICAgICAgICB3aW5kb3dUd28uc2V0RnJlZXplUGFuZXNOb1NwbGl0KHRydWUpOwogCiAgICAgICAgIFNlbGVjdGlvblJlY29yZCBzZWwgPSAoU2VsZWN0aW9uUmVjb3JkKSBmaW5kRmlyc3RSZWNvcmRCeVNpZChTZWxlY3Rpb25SZWNvcmQuc2lkKTsKIC8vICAgICAgICBTZWxlY3Rpb25SZWNvcmQgc2VsMiA9IChTZWxlY3Rpb25SZWNvcmQpIHNlbC5jbG9uZSgpOwpAQCAtMjQ4NCw5ICsyNDkwLDggQEAKICAgICAgICAgci5zZXRBY3RpdmVQYW5lKChzaG9ydCkgYWN0aXZlUGFuZSk7CiAgICAgICAgIHJlY29yZHMuYWRkKGxvYysxLCByKTsKIAotICAgICAgICBXaW5kb3dUd29SZWNvcmQgd2luZG93UmVjb3JkID0gKFdpbmRvd1R3b1JlY29yZCkgcmVjb3Jkcy5nZXQobG9jKTsKLSAgICAgICAgd2luZG93UmVjb3JkLnNldEZyZWV6ZVBhbmVzKGZhbHNlKTsKLSAgICAgICAgd2luZG93UmVjb3JkLnNldEZyZWV6ZVBhbmVzTm9TcGxpdChmYWxzZSk7CisgICAgICAgIHdpbmRvd1R3by5zZXRGcmVlemVQYW5lcyhmYWxzZSk7CisgICAgICAgIHdpbmRvd1R3by5zZXRGcmVlemVQYW5lc05vU3BsaXQoZmFsc2UpOwogCiAgICAgICAgIFNlbGVjdGlvblJlY29yZCBzZWwgPSAoU2VsZWN0aW9uUmVjb3JkKSBmaW5kRmlyc3RSZWNvcmRCeVNpZChTZWxlY3Rpb25SZWNvcmQuc2lkKTsKIC8vICAgICAgICBTZWxlY3Rpb25SZWNvcmQgc2VsMiA9IChTZWxlY3Rpb25SZWNvcmQpIHNlbC5jbG9uZSgpOwpAQCAtMjUxOSw1ICsyNTI0LDg0IEBACiAgICAgewogICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKICAgICB9CisgICAgICAgLyoqCisgICAgICAgICogY3JlYXRlcyBhIFByb3RlY3QgcmVjb3JkIHdpdGggcHJvdGVjdCBzZXQgdG8gZmFsc2UuCisgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5Qcm90ZWN0UmVjb3JkCisgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5SZWNvcmQKKyAgICAgICAgKiBAcmV0dXJuIGEgUHJvdGVjdFJlY29yZAorICAgICAgICAqLwogCisgICAgICAgcHJvdGVjdGVkIFJlY29yZCBjcmVhdGVQcm90ZWN0KCkKKyAgICAgICB7CisgICAgICAgICAgICAgICBsb2cubG9nKGxvZy5ERUJVRywgImNyZWF0ZSBwcm90ZWN0IHJlY29yZCB3aXRoIHByb3RlY3Rpb24gZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgIFByb3RlY3RSZWNvcmQgcmV0dmFsID0gbmV3IFByb3RlY3RSZWNvcmQoKTsKKworICAgICAgICAgICAgICAgcmV0dmFsLnNldFByb3RlY3QoZmFsc2UpOworICAgICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCBldmVuIHdoZW4gd2Ugc3VwcG9ydCBlbmNyeXB0aW9uIHdlIHdvbid0CisgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyBQcm90ZWN0UmVjb3JkIGdldFByb3RlY3QoKQorICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiBwcm90ZWN0OworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdyaWRsaW5lcyBhcmUgc2hvd24gaW4gYSB2aWV3ZXIuCisgICAgICogQHBhcmFtIHNob3cgd2hldGhlciB0byBzaG93IGdyaWRsaW5lcyBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5R3JpZGxpbmVzKGJvb2xlYW4gc2hvdykgeworICAgICAgICB3aW5kb3dUd28uc2V0RGlzcGxheUdyaWRsaW5lcyhzaG93KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIGdyaWRsaW5lcyBhcmUgZGlzcGxheWVkLgorICAgICAqIEByZXR1cm4gd2hldGhlciBncmlkbGluZXMgYXJlIGRpc3BsYXllZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheUdyaWRsaW5lcygpIHsKKwlyZXR1cm4gd2luZG93VHdvLmdldERpc3BsYXlHcmlkbGluZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGZvcm11bGFzIGFyZSBzaG93biBpbiBhIHZpZXdlci4KKyAgICAgKiBAcGFyYW0gc2hvdyB3aGV0aGVyIHRvIHNob3cgZm9ybXVsYXMgb3Igbm90CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheUZvcm11bGFzKGJvb2xlYW4gc2hvdykgeworICAgICAgICB3aW5kb3dUd28uc2V0RGlzcGxheUZvcm11bGFzKHNob3cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgZm9ybXVsYXMgYXJlIGRpc3BsYXllZC4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgZm9ybXVsYXMgYXJlIGRpc3BsYXllZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheUZvcm11bGFzKCkgeworCXJldHVybiB3aW5kb3dUd28uZ2V0RGlzcGxheUZvcm11bGFzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBSb3dDb2xIZWFkaW5ncyBhcmUgc2hvd24gaW4gYSB2aWV3ZXIuCisgICAgICogQHBhcmFtIHNob3cgd2hldGhlciB0byBzaG93IFJvd0NvbEhlYWRpbmdzIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlSb3dDb2xIZWFkaW5ncyhib29sZWFuIHNob3cpIHsKKyAgICAgICAgd2luZG93VHdvLnNldERpc3BsYXlSb3dDb2xIZWFkaW5ncyhzaG93KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIFJvd0NvbEhlYWRpbmdzIGFyZSBkaXNwbGF5ZWQuCisgICAgICogQHJldHVybiB3aGV0aGVyIFJvd0NvbEhlYWRpbmdzIGFyZSBkaXNwbGF5ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc3BsYXlSb3dDb2xIZWFkaW5ncygpIHsKKwlyZXR1cm4gd2luZG93VHdvLmdldERpc3BsYXlSb3dDb2xIZWFkaW5ncygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIG1hcmdpbnMuICBJZiBub3QgY3JlYXRlZCwgd2lsbCBjcmVhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBtYXJpbmdzLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXJnaW5bXSBnZXRNYXJnaW5zKCkgeworICAgICAgICBpZiAobWFyZ2lucyA9PSBudWxsKQorICAgICAgICAgICAgbWFyZ2lucyA9IG5ldyBNYXJnaW5bNF07CisJcmV0dXJuIG1hcmdpbnM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9tb2RlbC9Xb3JrYm9vay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9tb2RlbC9Xb3JrYm9vay5qYXZhCmluZGV4IGNhZDkxMTcuLjQ2OTZkODkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvV29ya2Jvb2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL21vZGVsL1dvcmtib29rLmphdmEKQEAgLTUxMyw3ICs1MTMsNyBAQAogICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGJvdW5kc2hlZXRzLnNpemUoKTsgaysrKSB7CiAgICAgICAgICAgICBTdHJpbmcgc2hlZXQgPSBnZXRTaGVldE5hbWUoayk7CiAKLSAgICAgICAgICAgIGlmIChzaGVldC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChzaGVldC5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gazsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTY4NiwzNyArNjg2LDI3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgSFNTRi1vbmx5IHBvcnRpb25zIG9mIHRoZSBQT0lGUyBmaWxlLgogICAgICAqLwotCi0gICAgcHVibGljIGJ5dGUgW10gc2VyaWFsaXplKCkgewotICAgICAgICBsb2cubG9nKERFQlVHLCAiU2VyaWFsaXppbmcgV29ya2Jvb2shIik7Ci0gICAgICAgIGJ5dGVbXSByZXR2YWwgICAgPSBudWxsOwotCi0gICAgICAgIC8vIEFycmF5TGlzdCBieXRlcyAgICAgPSBuZXcgQXJyYXlMaXN0KHJlY29yZHMuc2l6ZSgpKTsKLSAgICAgICAgaW50ICAgIGFycmF5c2l6ZSA9IGdldFNpemUoKTsKLSAgICAgICAgaW50ICAgIHBvcyAgICAgICA9IDA7Ci0KLSAgICAgICAgLy8gZm9yIChpbnQgayA9IDA7IGsgPCByZWNvcmRzLnNpemUoKTsgaysrKQotICAgICAgICAvLyB7Ci0gICAgICAgIC8vIGJ5dGVzLmFkZCgoKCBSZWNvcmQgKSByZWNvcmRzLmdldChrKSkuc2VyaWFsaXplKCkpOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyBmb3IgKGludCBrID0gMDsgayA8IGJ5dGVzLnNpemUoKTsgaysrKQotICAgICAgICAvLyB7Ci0gICAgICAgIC8vIGFycmF5c2l6ZSArPSAoKCBieXRlIFtdICkgYnl0ZXMuZ2V0KGspKS5sZW5ndGg7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgcmV0dmFsID0gbmV3IGJ5dGVbIGFycmF5c2l6ZSBdOwotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlY29yZHMuc2l6ZSgpOyBrKyspIHsKLQotICAgICAgICAgICAgLy8gYnl0ZVtdIHJlYyA9ICgoIGJ5dGUgW10gKSBieXRlcy5nZXQoaykpOwotICAgICAgICAgICAgLy8gU3lzdGVtLmFycmF5Y29weShyZWMsIDAsIHJldHZhbCwgcG9zLCByZWMubGVuZ3RoKTsKLSAgICAgICAgICAgIFJlY29yZCByZWNvcmQgPSByZWNvcmRzLmdldChrKTsKLSAgICAgICAgICAgIC8vIExldCdzIHNraXAgUkVDQUxDSUQgcmVjb3JkcywgYXMgdGhleSBhcmUgb25seSB1c2UgZm9yIG9wdGltaXphdGlvbgotCSAgICBpZihyZWNvcmQuZ2V0U2lkKCkgIT0gUmVjYWxjSWRSZWNvcmQuc2lkIHx8ICgoUmVjYWxjSWRSZWNvcmQpcmVjb3JkKS5pc05lZWRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcG9zICs9IHJlY29yZC5zZXJpYWxpemUocG9zLCByZXR2YWwpOyAgIC8vIHJlYy5sZW5ndGg7Ci0JICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2cubG9nKERFQlVHLCAiRXhpdGluZyBzZXJpYWxpemUgd29ya2Jvb2siKTsKLSAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9CisgICAgIC8vIEdKUzogTm90IHVzZWQgc28gd2h5IGtlZXAgaXQuCisvLyAgICBwdWJsaWMgYnl0ZSBbXSBzZXJpYWxpemUoKSB7CisvLyAgICAgICAgbG9nLmxvZyhERUJVRywgIlNlcmlhbGl6aW5nIFdvcmtib29rISIpOworLy8gICAgICAgIGJ5dGVbXSByZXR2YWwgICAgPSBudWxsOworLy8KKy8vLy8gICAgICAgICBBcnJheUxpc3QgYnl0ZXMgICAgID0gbmV3IEFycmF5TGlzdChyZWNvcmRzLnNpemUoKSk7CisvLyAgICAgICAgaW50ICAgIGFycmF5c2l6ZSA9IGdldFNpemUoKTsKKy8vICAgICAgICBpbnQgICAgcG9zICAgICAgID0gMDsKKy8vCisvLyAgICAgICAgcmV0dmFsID0gbmV3IGJ5dGVbIGFycmF5c2l6ZSBdOworLy8gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVjb3Jkcy5zaXplKCk7IGsrKykgeworLy8KKy8vICAgICAgICAgICAgUmVjb3JkIHJlY29yZCA9IHJlY29yZHMuZ2V0KGspOworLy8vLyAgICAgICAgICAgICBMZXQncyBza2lwIFJFQ0FMQ0lEIHJlY29yZHMsIGFzIHRoZXkgYXJlIG9ubHkgdXNlIGZvciBvcHRpbWl6YXRpb24KKy8vCSAgICBpZihyZWNvcmQuZ2V0U2lkKCkgIT0gUmVjYWxjSWRSZWNvcmQuc2lkIHx8ICgoUmVjYWxjSWRSZWNvcmQpcmVjb3JkKS5pc05lZWRlZCgpKSB7CisvLyAgICAgICAgICAgICAgICBwb3MgKz0gcmVjb3JkLnNlcmlhbGl6ZShwb3MsIHJldHZhbCk7ICAgLy8gcmVjLmxlbmd0aDsKKy8vCSAgICB9CisvLyAgICAgICAgfQorLy8gICAgICAgIGxvZy5sb2coREVCVUcsICJFeGl0aW5nIHNlcmlhbGl6ZSB3b3JrYm9vayIpOworLy8gICAgICAgIHJldHVybiByZXR2YWw7CisvLyAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXJpYWxpemVzIGFsbCByZWNvcmRzIGludCB0aGUgd29ya3NoZWV0IHNlY3Rpb24gaW50byBhIGJpZyBieXRlIGFycmF5LiBVc2UKQEAgLTcyNSw0NCArNzE1LDU0IEBACiAgICAgICogQHBhcmFtIGRhdGEgYXJyYXkgb2YgYnl0ZXMgdG8gd3JpdGUgdGhpcyB0bwogICAgICAqLwogCi0gICAgcHVibGljIGludCBzZXJpYWxpemUoaW50IG9mZnNldCwgYnl0ZSBbXSBkYXRhKSB7Ci0gICAgICAgIGxvZy5sb2coREVCVUcsICJTZXJpYWxpemluZyBXb3JrYm9vayB3aXRoIG9mZnNldHMiKTsKKyAgICBwdWJsaWMgaW50IHNlcmlhbGl6ZSggaW50IG9mZnNldCwgYnl0ZVtdIGRhdGEgKQorICAgIHsKKyAgICAgICAgbG9nLmxvZyggREVCVUcsICJTZXJpYWxpemluZyBXb3JrYm9vayB3aXRoIG9mZnNldHMiICk7CiAKLSAgICAgICAgLy8gQXJyYXlMaXN0IGJ5dGVzICAgICA9IG5ldyBBcnJheUxpc3QocmVjb3Jkcy5zaXplKCkpOwotICAgICAgICAvLyAgICAgICAgaW50IGFycmF5c2l6ZSA9IGdldFNpemUoKTsgICAvLyAwOwotICAgICAgICBpbnQgcG9zICAgICAgID0gMDsKKyAgICAgICAgaW50IHBvcyA9IDA7CiAKLSAgICAgICAgLy8gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVjb3Jkcy5zaXplKCk7IGsrKykKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBieXRlcy5hZGQoKCggUmVjb3JkICkgcmVjb3Jkcy5nZXQoaykpLnNlcmlhbGl6ZSgpKTsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYnl0ZXMuc2l6ZSgpOyBrKyspCi0gICAgICAgIC8vICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBhcnJheXNpemUgKz0gKCggYnl0ZSBbXSApIGJ5dGVzLmdldChrKSkubGVuZ3RoOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlY29yZHMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgU1NUUmVjb3JkIHNzdCA9IG51bGw7CisgICAgICAgIGludCBzc3RQb3MgPSAwOworICAgICAgICBmb3IgKCBpbnQgayA9IDA7IGsgPCByZWNvcmRzLnNpemUoKTsgaysrICkKKyAgICAgICAgewogCi0gICAgICAgICAgICAvLyBieXRlW10gcmVjID0gKCggYnl0ZSBbXSApIGJ5dGVzLmdldChrKSk7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0uYXJyYXljb3B5KHJlYywgMCwgZGF0YSwgb2Zmc2V0ICsgcG9zLCByZWMubGVuZ3RoKTsKLSAgICAgICAgICAgIFJlY29yZCByZWNvcmQgPSByZWNvcmRzLmdldChrKTsKKyAgICAgICAgICAgIFJlY29yZCByZWNvcmQgPSByZWNvcmRzLmdldCggayApOwogICAgICAgICAgICAgLy8gTGV0J3Mgc2tpcCBSRUNBTENJRCByZWNvcmRzLCBhcyB0aGV5IGFyZSBvbmx5IHVzZSBmb3Igb3B0aW1pemF0aW9uCi0gICAgICAgICAgICBpZihyZWNvcmQuZ2V0U2lkKCkgIT0gUmVjYWxjSWRSZWNvcmQuc2lkIHx8ICgoUmVjYWxjSWRSZWNvcmQpcmVjb3JkKS5pc05lZWRlZCgpKSB7Ci0JCXBvcyArPSByZWNvcmQuc2VyaWFsaXplKHBvcyArIG9mZnNldCwgZGF0YSk7ICAgLy8gcmVjLmxlbmd0aDsKKyAgICAgICAgICAgIGlmICggcmVjb3JkLmdldFNpZCgpICE9IFJlY2FsY0lkUmVjb3JkLnNpZCB8fCAoIChSZWNhbGNJZFJlY29yZCkgcmVjb3JkICkuaXNOZWVkZWQoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIFNTVFJlY29yZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNzdCA9IChTU1RSZWNvcmQpcmVjb3JkOworICAgICAgICAgICAgICAgICAgICBzc3RQb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0U2lkKCkgPT0gRXh0U1NUUmVjb3JkLnNpZCAmJiBzc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHNzdC5jcmVhdGVFeHRTU1RSZWNvcmQoc3N0UG9zICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9zICs9IHJlY29yZC5zZXJpYWxpemUoIHBvcyArIG9mZnNldCwgZGF0YSApOyAgIC8vIHJlYy5sZW5ndGg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbG9nLmxvZyhERUJVRywgIkV4aXRpbmcgc2VyaWFsaXplIHdvcmtib29rIik7CisgICAgICAgIGxvZy5sb2coIERFQlVHLCAiRXhpdGluZyBzZXJpYWxpemUgd29ya2Jvb2siICk7CiAgICAgICAgIHJldHVybiBwb3M7CiAgICAgfQogCi0gICAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpCisgICAgewogICAgICAgICBpbnQgcmV0dmFsID0gMDsKIAotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlY29yZHMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIFJlY29yZCByZWNvcmQgPSByZWNvcmRzLmdldChrKTsKKyAgICAgICAgU1NUUmVjb3JkIHNzdCA9IG51bGw7CisgICAgICAgIGZvciAoIGludCBrID0gMDsgayA8IHJlY29yZHMuc2l6ZSgpOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBSZWNvcmQgcmVjb3JkID0gcmVjb3Jkcy5nZXQoIGsgKTsKICAgICAgICAgICAgIC8vIExldCdzIHNraXAgUkVDQUxDSUQgcmVjb3JkcywgYXMgdGhleSBhcmUgb25seSB1c2UgZm9yIG9wdGltaXphdGlvbgotICAgICAgICAgICAgaWYocmVjb3JkLmdldFNpZCgpICE9IFJlY2FsY0lkUmVjb3JkLnNpZCB8fCAoKFJlY2FsY0lkUmVjb3JkKXJlY29yZCkuaXNOZWVkZWQoKSkgewotCQlyZXR2YWwgKz0gcmVjb3JkLmdldFJlY29yZFNpemUoKTsKKyAgICAgICAgICAgIGlmICggcmVjb3JkLmdldFNpZCgpICE9IFJlY2FsY0lkUmVjb3JkLnNpZCB8fCAoIChSZWNhbGNJZFJlY29yZCkgcmVjb3JkICkuaXNOZWVkZWQoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIFNTVFJlY29yZCkKKyAgICAgICAgICAgICAgICAgICAgc3N0ID0gKFNTVFJlY29yZClyZWNvcmQ7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRTaWQoKSA9PSBFeHRTU1RSZWNvcmQuc2lkICYmIHNzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR2YWwgKz0gc3N0LmNhbGNFeHRTU1RSZWNvcmRTaXplKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR2YWwgKz0gcmVjb3JkLmdldFJlY29yZFNpemUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0dmFsOwpAQCAtMTcyOSwxNSArMTcyOSwxNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBTaGVldFJlZmVyZW5jZXMgZ2V0U2hlZXRSZWZlcmVuY2VzKCkgewotICAgICAgIFNoZWV0UmVmZXJlbmNlcyByZWZzID0gbmV3IFNoZWV0UmVmZXJlbmNlcygpOwotCi0gICAgICAgaWYgKGV4dGVyblNoZWV0ICE9IG51bGwpIHsKLSAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGV4dGVyblNoZWV0LmdldE51bU9mUkVGU3RydWN0dXJlcygpOyBrKyspIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHNoZWV0TmFtZSA9IGZpbmRTaGVldE5hbWVGcm9tRXh0ZXJuU2hlZXQoKHNob3J0KWspOwotICAgICAgICAgICAgICByZWZzLmFkZFNoZWV0UmVmZXJlbmNlKHNoZWV0TmFtZSwgayk7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gcmVmczsKKyAgICAgICAgU2hlZXRSZWZlcmVuY2VzIHJlZnMgPSBuZXcgU2hlZXRSZWZlcmVuY2VzKCk7CisgICAgICAgIAorICAgICAgICBpZiAoZXh0ZXJuU2hlZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBleHRlcm5TaGVldC5nZXROdW1PZlJFRlN0cnVjdHVyZXMoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIHNoZWV0TmFtZSA9IGZpbmRTaGVldE5hbWVGcm9tRXh0ZXJuU2hlZXQoKHNob3J0KWspOworICAgICAgICAgICAgICAgIHJlZnMuYWRkU2hlZXRSZWZlcmVuY2Uoc2hlZXROYW1lLCBrKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVmczsKICAgICB9CiAKICAgICAvKiogZmluZHMgdGhlIHNoZWV0IG5hbWUgYnkgaGlzIGV4dGVybiBzaGVldCBpbmRleApAQCAtMTc0NSwxMCArMTc0NywxMiBAQAogICAgICAqIEByZXR1cm4gc2hlZXQgbmFtZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZmluZFNoZWV0TmFtZUZyb21FeHRlcm5TaGVldChzaG9ydCBudW0pewotICAgICAgICBTdHJpbmcgcmVzdWx0OworICAgICAgICBTdHJpbmcgcmVzdWx0PSIiOwogCiAgICAgICAgIHNob3J0IGluZGV4VG9TaGVldCA9IGV4dGVyblNoZWV0LmdldFJFRlJlY29yZEF0KG51bSkuZ2V0SW5kZXhUb0ZpcnN0U3VwQm9vaygpOwotICAgICAgICByZXN1bHQgPSBnZXRTaGVldE5hbWUoaW5kZXhUb1NoZWV0KTsKKyAgICAgICAgaWYgKGluZGV4VG9TaGVldD4tMSkgeyAvL2Vycm9yIGNoZWNrLCBiYWlsIG91dCBncmFjZWZ1bGx5IQorICAgICAgICAgICAgcmVzdWx0ID0gZ2V0U2hlZXROYW1lKGluZGV4VG9TaGVldCk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTIwNjAsMTggKzIwNjQsMjIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUGFsZXR0ZVJlY29yZCBnZXRDdXN0b21QYWxldHRlKCkKICAgICB7Ci0gICAgICAgIFBhbGV0dGVSZWNvcmQgcGFsZXR0ZTsKLSAgICAgICAgUmVjb3JkIHJlYyA9IHJlY29yZHMuZ2V0KHJlY29yZHMuZ2V0UGFsZXR0ZXBvcygpKTsKLSAgICAgICAgaWYgKHJlYyBpbnN0YW5jZW9mIFBhbGV0dGVSZWNvcmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhbGV0dGUgPSAoUGFsZXR0ZVJlY29yZCkgcmVjOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcGFsZXR0ZSA9IGNyZWF0ZVBhbGV0dGUoKTsKLSAgICAgICAgICAgIHJlY29yZHMuYWRkKHJlY29yZHMuZ2V0UGFsZXR0ZXBvcygpLCBwYWxldHRlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFsZXR0ZTsKKyAgICAgIFBhbGV0dGVSZWNvcmQgcGFsZXR0ZTsKKyAgICAgIGludCBwYWxldHRlUG9zID0gcmVjb3Jkcy5nZXRQYWxldHRlcG9zKCk7CisgICAgICBpZiAocGFsZXR0ZVBvcyAhPSAtMSkgeworICAgICAgICBSZWNvcmQgcmVjID0gcmVjb3Jkcy5nZXQocGFsZXR0ZVBvcyk7CisgICAgICAgIGlmIChyZWMgaW5zdGFuY2VvZiBQYWxldHRlUmVjb3JkKSB7CisgICAgICAgICAgcGFsZXR0ZSA9IChQYWxldHRlUmVjb3JkKSByZWM7CisgICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWxFcnJvcjogRXhwZWN0ZWQgUGFsZXR0ZVJlY29yZCBidXQgZ290IGEgJyIrcmVjKyInIik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAgcGFsZXR0ZSA9IGNyZWF0ZVBhbGV0dGUoKTsKKyAgICAgICAgICAvL0FkZCB0aGUgcGFsZXR0ZSByZWNvcmQgYWZ0ZXIgdGhlIGJvZiB3aGljaCBpcyBhbHdheXMgdGhlIGZpcnN0IHJlY29yZAorICAgICAgICAgIHJlY29yZHMuYWRkKDEsIHBhbGV0dGUpOworICAgICAgICAgIHJlY29yZHMuc2V0UGFsZXR0ZXBvcygxKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwYWxldHRlOwogICAgIH0KICAKICAgICAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvV29ya2Jvb2tSZWNvcmRMaXN0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL21vZGVsL1dvcmtib29rUmVjb3JkTGlzdC5qYXZhCmluZGV4IDBmMmZhMzIuLjY1NGVhODggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvV29ya2Jvb2tSZWNvcmRMaXN0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9tb2RlbC9Xb3JrYm9va1JlY29yZExpc3QuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogICAgIHByaXZhdGUgaW50ICBuYW1lcG9zICAgICA9IDA7ICAgLy8gaG9sZHMgdGhlIHBvc2l0aW9uIG9mIGxhc3QgbmFtZSByZWNvcmQKICAgICBwcml2YXRlIGludCAgc3VwYm9va3BvcyAgPSAwOyAgIC8vIGhvbGRzIHRoZSBwb3NpdGlvbiBvZiBzdXAgYm9vawogICAgIHByaXZhdGUgaW50ICBleHRlcm5zaGVldFBvcyA9IDA7Ly8gaG9sZHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBleHRlcm4gc2hlZXQKLSAgICBwcml2YXRlIGludCAgcGFsZXR0ZXBvcyAgPSAwOyAgIC8vIGhvbGQgdGhlIHBvc2l0aW9uIG9mIHRoZSBwYWxldHRlLCBpZiBhcHBsaWNhYmxlCisgICAgcHJpdmF0ZSBpbnQgIHBhbGV0dGVwb3MgID0gLTE7ICAgLy8gaG9sZCB0aGUgcG9zaXRpb24gb2YgdGhlIHBhbGV0dGUsIGlmIGFwcGxpY2FibGUKIAogCiAgICAgcHVibGljIHZvaWQgc2V0UmVjb3JkcyggTGlzdCByZWNvcmRzICkKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICBpZiAoZ2V0QmFja3VwcG9zKCkgPj0gcG9zKSBzZXRCYWNrdXBwb3MoIGJhY2t1cHBvcyArIDEgKTsKICAgICAgICAgaWYgKGdldE5hbWVwb3MoKSA+PSBwb3MpIHNldE5hbWVwb3MobmFtZXBvcysxKTsKICAgICAgICAgaWYgKGdldFN1cGJvb2twb3MoKSA+PSBwb3MpIHNldFN1cGJvb2twb3Moc3VwYm9va3BvcysxKTsKLSAgICAgICAgaWYgKGdldFBhbGV0dGVwb3MoKSA+PSBwb3MpIHNldFBhbGV0dGVwb3MoIHBhbGV0dGVwb3MgKyAxICk7CisgICAgICAgIGlmICgoZ2V0UGFsZXR0ZXBvcygpICE9IC0xKSAmJiAoZ2V0UGFsZXR0ZXBvcygpID49IHBvcykpIHNldFBhbGV0dGVwb3MoIHBhbGV0dGVwb3MgKyAxICk7CiAgICAgICAgIGlmIChnZXRFeHRlcm5zaGVldFBvcygpID49IHBvcykgc2V0RXh0ZXJuc2hlZXRQb3MoZ2V0RXh0ZXJuc2hlZXRQb3MoKSArIDEpOwogICAgIH0KIApAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICAgIGlmIChnZXRCYWNrdXBwb3MoKSA+PSBwb3MpIHNldEJhY2t1cHBvcyggYmFja3VwcG9zIC0gMSApOwogICAgICAgICBpZiAoZ2V0TmFtZXBvcygpID49IHBvcykgc2V0TmFtZXBvcyhnZXROYW1lcG9zKCktMSk7CiAgICAgICAgIGlmIChnZXRTdXBib29rcG9zKCkgPj0gcG9zKSBzZXRTdXBib29rcG9zKGdldFN1cGJvb2twb3MoKS0xKTsKLSAgICAgICAgaWYgKGdldFBhbGV0dGVwb3MoKSA+PSBwb3MpIHNldFBhbGV0dGVwb3MoIHBhbGV0dGVwb3MgLSAxICk7CisgICAgICAgIGlmICgoZ2V0UGFsZXR0ZXBvcygpICE9IC0xKSAmJiAoZ2V0UGFsZXR0ZXBvcygpID49IHBvcykpIHNldFBhbGV0dGVwb3MoIHBhbGV0dGVwb3MgLSAxICk7CiAgICAgICAgIGlmIChnZXRFeHRlcm5zaGVldFBvcygpID49IHBvcykgc2V0RXh0ZXJuc2hlZXRQb3MoIGdldEV4dGVybnNoZWV0UG9zKCkgLTEpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvQm9vbEVyclJlY29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvQm9vbEVyclJlY29yZC5qYXZhCmluZGV4IDg1OTc0OGEuLjQzOTFmYzQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0Jvb2xFcnJSZWNvcmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Cb29sRXJyUmVjb3JkLmphdmEKQEAgLTE3MiwxMiArMTcyLDE4IEBACiAgICAgICogc2V0IHRoZSBlcnJvciB2YWx1ZSBmb3IgdGhlIGNlbGwKICAgICAgKgogICAgICAqIEBwYXJhbSB2YWx1ZSAgICAgZXJyb3IgcmVwcmVzZW50aW5nIHRoZSBlcnJvciB2YWx1ZQorICAgICAqICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBjYW4gb25seSBiZSAwLDcsMTUsMjMsMjksMzYgb3IgNDIKKyAgICAgKiAgICAgICAgICAgICAgICAgIHNlZSBidWd6aWxsYSBidWcgMTY1NjAgZm9yIGFuIGV4cGxhbmF0aW9uCiAgICAgICovCiAKICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShieXRlIHZhbHVlKQogICAgIHsKLSAgICAgICAgZmllbGRfNF9iQm9vbEVyciA9IHZhbHVlOwotICAgICAgICBmaWVsZF81X2ZFcnJvciAgID0gKCBieXRlICkgMTsKKyAgICAgICAgaWYgKCAodmFsdWU9PTApfHwodmFsdWU9PTcpfHwodmFsdWU9PTE1KXx8KHZhbHVlPT0yMyl8fCh2YWx1ZT09MjkpfHwodmFsdWU9PTM2KXx8KHZhbHVlPT00MikpIHsKKyAgICAgICAgICAgIGZpZWxkXzRfYkJvb2xFcnIgPSB2YWx1ZTsKKyAgICAgICAgICAgIGZpZWxkXzVfZkVycm9yICAgPSAoIGJ5dGUgKSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIFZhbHVlIGNhbiBvbmx5IGJlIDAsNywxNSwyMywyOSwzNiBvciA0Mi4gSXQgY2Fubm90IGJlICIrdmFsdWUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy9wdWJsaWMgc2hvcnQgZ2V0Um93KCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0JvdHRvbU1hcmdpblJlY29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvQm90dG9tTWFyZ2luUmVjb3JkLmphdmEKaW5kZXggYTc0YmUwZi4uZmNhYjQxYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvQm90dG9tTWFyZ2luUmVjb3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvQm90dG9tTWFyZ2luUmVjb3JkLmphdmEKQEAgLTEgKzEsMTg3IEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgKiAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzICogcmVzZXJ2ZWQuICogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgKiBhcmUgbWV0OiAqICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgKiAgICBkaXN0cmlidXRpb24uICogKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLiAqICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIGFuZCAqICAgICJBcGFjaGUgUE9JIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLiAqICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsICogICAgIkFwYWNoZSBQT0kiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0ICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gKiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUiAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgKiBTVUNIIERBTUFHRS4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uICovcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZDtpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC4qOy8qKiAqIFJlY29yZCBmb3IgdGhlIGJvdHRvbSBtYXJnaW4uICogTk9URTogVGhpcyBzb3VyY2Ugd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiAqIEBhdXRob3IgU2hhd24gTGF1YmFjaCAoc2xhdWJhY2ggYXQgYXBhY2hlIGRvdCBvcmcpICovcHVibGljIGNsYXNzIEJvdHRvbU1hcmdpblJlY29yZCAgICBleHRlbmRzIFJlY29yZCBpbXBsZW1lbnRzIE1hcmdpbnsgICAgcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCAgICAgIHNpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI5OyAgICBwcml2YXRlICBkb3VibGUgICAgIGZpZWxkXzFfbWFyZ2luOyAgICBwdWJsaWMgQm90dG9tTWFyZ2luUmVjb3JkKCkgICAgeyAgICB9ICAgIC8qKiAgICAgKiBDb25zdHJ1Y3RzIGEgQm90dG9tTWFyZ2luIHJlY29yZCBhbmQgc2V0cyBpdHMgZmllbGRzIGFwcHJvcHJpYXRlbHkuICAgICAqICAgICAqIEBwYXJhbSBpZCAgICBpZCBtdXN0IGJlIDB4Mjkgb3IgYW4gZXhjZXB0aW9uICAgICAqICAgICAgICAgICAgICB3aWxsIGJlIHRocm93IHVwb24gdmFsaWRhdGlvbiAgICAgKiBAcGFyYW0gc2l6ZSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhcmVhIG9mIHRoZSByZWNvcmQgICAgICogQHBhcmFtIGRhdGEgIGRhdGEgb2YgdGhlIHJlY29yZCAoc2hvdWxkIG5vdCBjb250YWluIHNpZC9sZW4pICAgICAqLyAgICBwdWJsaWMgQm90dG9tTWFyZ2luUmVjb3JkKHNob3J0IGlkLCBzaG9ydCBzaXplLCBieXRlIFtdIGRhdGEpICAgIHsgICAgICAgIHN1cGVyKGlkLCBzaXplLCBkYXRhKTsgICAgfSAgICAvKiogICAgICogQ29uc3RydWN0cyBhIEJvdHRvbU1hcmdpbiByZWNvcmQgYW5kIHNldHMgaXRzIGZpZWxkcyBhcHByb3ByaWF0ZWx5LiAgICAgKiAgICAgKiBAcGFyYW0gaWQgICAgaWQgbXVzdCBiZSAweDI5IG9yIGFuIGV4Y2VwdGlvbiAgICAgKiAgICAgICAgICAgICAgd2lsbCBiZSB0aHJvdyB1cG9uIHZhbGlkYXRpb24gICAgICogQHBhcmFtIHNpemUgIHNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgYXJlYSBvZiB0aGUgcmVjb3JkICAgICAqIEBwYXJhbSBkYXRhICBkYXRhIG9mIHRoZSByZWNvcmQgKHNob3VsZCBub3QgY29udGFpbiBzaWQvbGVuKSAgICAgKiBAcGFyYW0gb2Zmc2V0IG9mIHRoZSByZWNvcmQncyBkYXRhICAgICAqLyAgICBwdWJsaWMgQm90dG9tTWFyZ2luUmVjb3JkKHNob3J0IGlkLCBzaG9ydCBzaXplLCBieXRlIFtdIGRhdGEsIGludCBvZmZzZXQpICAgIHsgICAgICAgIHN1cGVyKGlkLCBzaXplLCBkYXRhLCBvZmZzZXQpOyAgICB9ICAgIC8qKiAgICAgKiBDaGVja3MgdGhlIHNpZCBtYXRjaGVzIHRoZSBleHBlY3RlZCBzaWRlIGZvciB0aGlzIHJlY29yZCAgICAgKiAgICAgKiBAcGFyYW0gaWQgICB0aGUgZXhwZWN0ZWQgc2lkLiAgICAgKi8gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTaWQoc2hvcnQgaWQpICAgIHsgICAgICAgIGlmIChpZCAhPSBzaWQpICAgICAgICB7ICAgICAgICAgICAgdGhyb3cgbmV3IFJlY29yZEZvcm1hdEV4Y2VwdGlvbigiTm90IGEgQm90dG9tTWFyZ2luIHJlY29yZCIpOyAgICAgICAgfSAgICB9ICAgIHByb3RlY3RlZCB2b2lkIGZpbGxGaWVsZHMoYnl0ZSBbXSBkYXRhLCBzaG9ydCBzaXplLCBpbnQgb2Zmc2V0KSAgICB7ICAgICAgICBmaWVsZF8xX21hcmdpbiAgICAgICAgICAgICAgICAgID0gTGl0dGxlRW5kaWFuLmdldERvdWJsZShkYXRhLCAweDAgKyBvZmZzZXQpOyAgICB9ICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSAgICB7ICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOyAgICAgICAgYnVmZmVyLmFwcGVuZCgiW0JvdHRvbU1hcmdpbl1cbiIpOyAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgIC5tYXJnaW4gICAgICAgICAgICAgICA9ICIpICAgICAgICAgICAgLmFwcGVuZCgiICgiKS5hcHBlbmQoZ2V0TWFyZ2luKCkpLmFwcGVuZCgiIClcbiIpOyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWy9Cb3R0b21NYXJnaW5dXG4iKTsgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsgICAgfSAgICBwdWJsaWMgaW50IHNlcmlhbGl6ZShpbnQgb2Zmc2V0LCBieXRlW10gZGF0YSkgICAgeyAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDAgKyBvZmZzZXQsIHNpZCk7ICAgICAgICBMaXR0bGVFbmRpYW4ucHV0U2hvcnQoZGF0YSwgMiArIG9mZnNldCwgKHNob3J0KShnZXRSZWNvcmRTaXplKCkgLSA0KSk7ICAgICAgICBMaXR0bGVFbmRpYW4ucHV0RG91YmxlKGRhdGEsIDQgKyBvZmZzZXQsIGZpZWxkXzFfbWFyZ2luKTsgICAgICAgIHJldHVybiBnZXRSZWNvcmRTaXplKCk7ICAgIH0gICAgLyoqICAgICAqIFNpemUgb2YgcmVjb3JkIChleGx1ZGluZyA0IGJ5dGUgaGVhZGVyKSAgICAgKi8gICAgcHVibGljIGludCBnZXRSZWNvcmRTaXplKCkgICAgeyAgICAgICAgcmV0dXJuIDQgICsgODsgICAgfSAgICBwdWJsaWMgc2hvcnQgZ2V0U2lkKCkgICAgeyAgICAgICAgcmV0dXJuIHRoaXMuc2lkOyAgICB9ICAgIC8qKiAgICAgKiBHZXQgdGhlIG1hcmdpbiBmaWVsZCBmb3IgdGhlIEJvdHRvbU1hcmdpbiByZWNvcmQuICAgICAqLyAgICBwdWJsaWMgZG91YmxlIGdldE1hcmdpbigpICAgIHsgICAgICAgIHJldHVybiBmaWVsZF8xX21hcmdpbjsgICAgfSAgICAvKiogICAgICogU2V0IHRoZSBtYXJnaW4gZmllbGQgZm9yIHRoZSBCb3R0b21NYXJnaW4gcmVjb3JkLiAgICAgKi8gICAgcHVibGljIHZvaWQgc2V0TWFyZ2luKGRvdWJsZSBmaWVsZF8xX21hcmdpbikgICAgeyAgICAgICAgdGhpcy5maWVsZF8xX21hcmdpbiA9IGZpZWxkXzFfbWFyZ2luOyAgICB9ICAgICAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsgICAgICAgIEJvdHRvbU1hcmdpblJlY29yZCByZWMgPSBuZXcgQm90dG9tTWFyZ2luUmVjb3JkKCk7ICAgICAgICByZWMuZmllbGRfMV9tYXJnaW4gPSB0aGlzLmZpZWxkXzFfbWFyZ2luOyAgICAgICAgcmV0dXJuIHJlYzsgICAgfX0gIC8vIEVORCBPRiBDTEFTUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBhbmQKKyAqICAgICJBcGFjaGUgUE9JIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgICJBcGFjaGUgUE9JIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQ7CisKKworCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC4qOworCisvKioKKyAqIFJlY29yZCBmb3IgdGhlIGJvdHRvbSBtYXJnaW4uCisgKiBOT1RFOiBUaGlzIHNvdXJjZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisgKiBAYXV0aG9yIFNoYXduIExhdWJhY2ggKHNsYXViYWNoIGF0IGFwYWNoZSBkb3Qgb3JnKQorICovCitwdWJsaWMgY2xhc3MgQm90dG9tTWFyZ2luUmVjb3JkCisJIGV4dGVuZHMgUmVjb3JkIGltcGxlbWVudHMgTWFyZ2luCit7CisJIHB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgICAgICBzaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyOTsKKwkgcHJpdmF0ZSAgZG91YmxlICAgICBmaWVsZF8xX21hcmdpbjsKKworCisJIHB1YmxpYyBCb3R0b21NYXJnaW5SZWNvcmQoKQorCSB7CisKKwkgfQorCisJIC8qKgorCSAgKiBDb25zdHJ1Y3RzIGEgQm90dG9tTWFyZ2luIHJlY29yZCBhbmQgc2V0cyBpdHMgZmllbGRzIGFwcHJvcHJpYXRlbHkuCisJICAqCisJICAqIEBwYXJhbSBpZCAgICBpZCBtdXN0IGJlIDB4Mjkgb3IgYW4gZXhjZXB0aW9uCisJICAqICAgICAgICAgICAgICB3aWxsIGJlIHRocm93IHVwb24gdmFsaWRhdGlvbgorCSAgKiBAcGFyYW0gc2l6ZSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhcmVhIG9mIHRoZSByZWNvcmQKKwkgICogQHBhcmFtIGRhdGEgIGRhdGEgb2YgdGhlIHJlY29yZCAoc2hvdWxkIG5vdCBjb250YWluIHNpZC9sZW4pCisJICAqLworCisJIHB1YmxpYyBCb3R0b21NYXJnaW5SZWNvcmQoc2hvcnQgaWQsIHNob3J0IHNpemUsIGJ5dGUgW10gZGF0YSkKKwkgeworCQkgIHN1cGVyKGlkLCBzaXplLCBkYXRhKTsKKwkgfQorCisJIC8qKgorCSAgKiBDb25zdHJ1Y3RzIGEgQm90dG9tTWFyZ2luIHJlY29yZCBhbmQgc2V0cyBpdHMgZmllbGRzIGFwcHJvcHJpYXRlbHkuCisJICAqCisJICAqIEBwYXJhbSBpZCAgICBpZCBtdXN0IGJlIDB4Mjkgb3IgYW4gZXhjZXB0aW9uCisJICAqICAgICAgICAgICAgICB3aWxsIGJlIHRocm93IHVwb24gdmFsaWRhdGlvbgorCSAgKiBAcGFyYW0gc2l6ZSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhcmVhIG9mIHRoZSByZWNvcmQKKwkgICogQHBhcmFtIGRhdGEgIGRhdGEgb2YgdGhlIHJlY29yZCAoc2hvdWxkIG5vdCBjb250YWluIHNpZC9sZW4pCisJICAqIEBwYXJhbSBvZmZzZXQgb2YgdGhlIHJlY29yZCdzIGRhdGEKKwkgICovCisKKwkgcHVibGljIEJvdHRvbU1hcmdpblJlY29yZChzaG9ydCBpZCwgc2hvcnQgc2l6ZSwgYnl0ZSBbXSBkYXRhLCBpbnQgb2Zmc2V0KQorCSB7CisJCSAgc3VwZXIoaWQsIHNpemUsIGRhdGEsIG9mZnNldCk7CisJIH0KKworCSAvKioKKwkgICogQ2hlY2tzIHRoZSBzaWQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgc2lkZSBmb3IgdGhpcyByZWNvcmQKKwkgICoKKwkgICogQHBhcmFtIGlkICAgdGhlIGV4cGVjdGVkIHNpZC4KKwkgICovCisJIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2lkKHNob3J0IGlkKQorCSB7CisJCSAgaWYgKGlkICE9IHNpZCkKKwkJICB7CisJCQkJdGhyb3cgbmV3IFJlY29yZEZvcm1hdEV4Y2VwdGlvbigiTm90IGEgQm90dG9tTWFyZ2luIHJlY29yZCIpOworCQkgIH0KKwkgfQorCisJIHByb3RlY3RlZCB2b2lkIGZpbGxGaWVsZHMoYnl0ZSBbXSBkYXRhLCBzaG9ydCBzaXplLCBpbnQgb2Zmc2V0KQorCSB7CisJCSAgZmllbGRfMV9tYXJnaW4gICAgICAgICAgICAgICAgICA9IExpdHRsZUVuZGlhbi5nZXREb3VibGUoZGF0YSwgMHgwICsgb2Zmc2V0KTsKKworCSB9CisKKwkgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJIHsKKwkJICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJCSAgYnVmZmVyLmFwcGVuZCgiW0JvdHRvbU1hcmdpbl1cbiIpOworCisJCSAgYnVmZmVyLmFwcGVuZCgiICAgIC5tYXJnaW4gICAgICAgICAgICAgICA9ICIpCisJCQkJLmFwcGVuZCgiICgiKS5hcHBlbmQoZ2V0TWFyZ2luKCkpLmFwcGVuZCgiIClcbiIpOworCisJCSAgYnVmZmVyLmFwcGVuZCgiWy9Cb3R0b21NYXJnaW5dXG4iKTsKKwkJICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJIH0KKworCSBwdWJsaWMgaW50IHNlcmlhbGl6ZShpbnQgb2Zmc2V0LCBieXRlW10gZGF0YSkKKwkgeworCQkgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCAwICsgb2Zmc2V0LCBzaWQpOworCQkgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCAyICsgb2Zmc2V0LCAoc2hvcnQpKGdldFJlY29yZFNpemUoKSAtIDQpKTsKKworCQkgIExpdHRsZUVuZGlhbi5wdXREb3VibGUoZGF0YSwgNCArIG9mZnNldCwgZmllbGRfMV9tYXJnaW4pOworCisJCSAgcmV0dXJuIGdldFJlY29yZFNpemUoKTsKKwkgfQorCisJIC8qKgorCSAgKiBTaXplIG9mIHJlY29yZCAoZXhsdWRpbmcgNCBieXRlIGhlYWRlcikKKwkgICovCisJIHB1YmxpYyBpbnQgZ2V0UmVjb3JkU2l6ZSgpCisJIHsKKwkJICByZXR1cm4gNCAgKyA4OworCSB9CisKKwkgcHVibGljIHNob3J0IGdldFNpZCgpCisJIHsKKwkJICByZXR1cm4gdGhpcy5zaWQ7CisJIH0KKworCisJIC8qKgorCSAgKiBHZXQgdGhlIG1hcmdpbiBmaWVsZCBmb3IgdGhlIEJvdHRvbU1hcmdpbiByZWNvcmQuCisJICAqLworCSBwdWJsaWMgZG91YmxlIGdldE1hcmdpbigpCisJIHsKKwkJICByZXR1cm4gZmllbGRfMV9tYXJnaW47CisJIH0KKworCSAvKioKKwkgICogU2V0IHRoZSBtYXJnaW4gZmllbGQgZm9yIHRoZSBCb3R0b21NYXJnaW4gcmVjb3JkLgorCSAgKi8KKwkgcHVibGljIHZvaWQgc2V0TWFyZ2luKGRvdWJsZSBmaWVsZF8xX21hcmdpbikKKwkgeworCQkgIHRoaXMuZmllbGRfMV9tYXJnaW4gPSBmaWVsZF8xX21hcmdpbjsKKwkgfQorICAgIAorCSAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJICBCb3R0b21NYXJnaW5SZWNvcmQgcmVjID0gbmV3IEJvdHRvbU1hcmdpblJlY29yZCgpOworCQkgIHJlYy5maWVsZF8xX21hcmdpbiA9IHRoaXMuZmllbGRfMV9tYXJnaW47CisJCSAgcmV0dXJuIHJlYzsKKwkgfQorCisKK30gIC8vIEVORCBPRiBDTEFTUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0JvdW5kU2hlZXRSZWNvcmQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0JvdW5kU2hlZXRSZWNvcmQuamF2YQppbmRleCA2ZTAxMjQ2Li45NWM1ODc4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Cb3VuZFNoZWV0UmVjb3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvQm91bmRTaGVldFJlY29yZC5qYXZhCkBAIC0xOTQsMTAgKzE5NCwyMiBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgc2hlZXRuYW1lIGZvciB0aGlzIHNoZWV0LiAgKHRoaXMgYXBwZWFycyBpbiB0aGUgdGFicyBhdCB0aGUgYm90dG9tKQogICAgICAqIEBwYXJhbSBzaGVldG5hbWUgdGhlIG5hbWUgb2YgdGhlIHNoZWV0CisgICAgICogQHRob3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzaGVldCBuYW1lIHdpbGwgY2F1c2UgZXhjZWwgdG8gY3Jhc2guIAogICAgICAqLwogCiAgICAgcHVibGljIHZvaWQgc2V0U2hlZXRuYW1lKCBTdHJpbmcgc2hlZXRuYW1lICkKICAgICB7CisgICAgICAgIAorICAgICAgICBpZiAoKHNoZWV0bmFtZSA9PSBudWxsKSB8fCAoc2hlZXRuYW1lLmxlbmd0aCgpPT0wKQorICAgICAgICAgICAgICAgIHx8IChzaGVldG5hbWUubGVuZ3RoKCk+MzEpCisgICAgICAgICAgICAgICAgfHwgKHNoZWV0bmFtZS5pbmRleE9mKCIvIikgPiAtMSkKKyAgICAgICAgICAgICAgICB8fCAoc2hlZXRuYW1lLmluZGV4T2YoIlxcIikgPiAtMSkKKyAgICAgICAgICAgICAgICB8fCAoc2hlZXRuYW1lLmluZGV4T2YoIj8iKSA+IC0xKQorICAgICAgICAgICAgICAgIHx8IChzaGVldG5hbWUuaW5kZXhPZigiKiIpID4gLTEpCisgICAgICAgICAgICAgICAgfHwgKHNoZWV0bmFtZS5pbmRleE9mKCJdIikgPiAtMSkKKyAgICAgICAgICAgICAgICB8fCAoc2hlZXRuYW1lLmluZGV4T2YoIlsiKSA+IC0xKSApeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTaGVldCBuYW1lIGNhbm5vdCBiZSBibGFuaywgZ3JlYXRlciB0aGFuIDMxIGNoYXJzLCBvciBjb250YWluIGFueSBvZiAvXFwqP1tdIik7CisgICAgICAgIH0KICAgICAgICAgZmllbGRfNV9zaGVldG5hbWUgPSBzaGVldG5hbWU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Db250aW51ZVJlY29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvQ29udGludWVSZWNvcmQuamF2YQppbmRleCBkYmUwMGU1Li44ZDdlZWU3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Db250aW51ZVJlY29yZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0NvbnRpbnVlUmVjb3JkLmphdmEKQEAgLTI2Nyw0ICsyNjcsMTQgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsRmllbGRzKGJ5dGUgW10gaWdub3JlZF9wYXJtMSwgc2hvcnQgaWdub3JlZF9wYXJtMiwgaW50IGlnbm9yZWRfcGFybTMpCiAgICAgewogICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25lIHRoaXMgcmVjb3JkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICBDb250aW51ZVJlY29yZCBjbG9uZSA9IG5ldyBDb250aW51ZVJlY29yZCgpOworICAgICAgY2xvbmUuc2V0RGF0YShmaWVsZF8xX2RhdGEpOworICAgICAgcmV0dXJuIGNsb25lOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvRXh0U1NUSW5mb1N1YlJlY29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvRXh0U1NUSW5mb1N1YlJlY29yZC5qYXZhCmluZGV4IGU4MGM4YWYuLmQ5OGY0NjYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0V4dFNTVEluZm9TdWJSZWNvcmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9FeHRTU1RJbmZvU3ViUmVjb3JkLmphdmEKQEAgLTY1LDcgKzY1LDYgQEAKIC8qKgogICogRXh0ZW5kZWQgU1NUIHRhYmxlIGluZm8gc3VicmVjb3JkPFA+CiAgKiBjb250YWlucyB0aGUgZWxlbWVudHMgb2YgImluZm8iIGluIHRoZSBTU1QncyBhcnJheSBmaWVsZDxQPgotICogV0UgSEFWRSBWRVJZIExJVFRMRSBJTkZPUk1BVElPTiBPTiBIT1cgVE8gSU1QTEVNRU5UIFRISVMgUkVDT1JEISAoRVhUU1NTVCk8UD4KICAqIEBhdXRob3IgQW5kcmV3IEMuIE9saXZlciAoYWNvbGl2ZXIgYXQgYXBhY2hlIGRvdCBvcmcpCiAgKiBAdmVyc2lvbiAyLjAtcHJlCiAgKiBAc2VlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLkV4dFNTVFJlY29yZApAQCAtNzQsNiArNzMsNyBAQAogcHVibGljIGNsYXNzIEV4dFNTVEluZm9TdWJSZWNvcmQKICAgICBleHRlbmRzIFJlY29yZAogeworICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19TSVpFID0gODsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IHNpZCA9CiAgICAgICAgIDB4RkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaGVyZSBmb3IgY29uZm9ybWFuY2UsIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYW4gc2lkCiAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICBmaWVsZF8xX3N0cmVhbV9wb3M7ICAgICAgICAgIC8vIHN0cmVhbSBwb2ludGVyIHRvIHRoZSBTU1QgcmVjb3JkCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgZmllbGRfMV9zdHJlYW1fcG9zID0gcG9zOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldEJ1Y2tldFNTVE9mZnNldChzaG9ydCBvZmZzZXQpCisgICAgcHVibGljIHZvaWQgc2V0QnVja2V0UmVjb3JkT2Zmc2V0KHNob3J0IG9mZnNldCkKICAgICB7CiAgICAgICAgIGZpZWxkXzJfYnVja2V0X3NzdF9vZmZzZXQgPSBvZmZzZXQ7CiAgICAgfQpAQCAtMTU5LDYgKzE1OSw2IEBACiAKICAgICBwdWJsaWMgc2hvcnQgZ2V0U2lkKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNpZDsKKyAgICAgICAgcmV0dXJuIHNpZDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9FeHRTU1RSZWNvcmQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0V4dFNTVFJlY29yZC5qYXZhCmluZGV4IDdhOGUyMzkuLjlhODVlNTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0V4dFNTVFJlY29yZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0V4dFNTVFJlY29yZC5qYXZhCkBAIC02MSwxMyArNjEsMTMgQEAKIAogLyoqCiAgKiBUaXRsZTogICAgICAgIEV4dGVuZGVkIFN0YXRpYyBTdHJpbmcgVGFibGU8UD4KLSAqIERlc2NyaXB0aW9uOiAgSSByZWFsbHkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIHRoaW5nLi4uIGl0cyBzdXBwb3NlZCB0byBiZSAiYSBoYXNoCi0gKiAgICAgICAgICAgICAgIHRhYmxlIGZvciBvcHRpbWl6aW5nIGV4dGVybmFsIGNvcHkgb3BlcmF0aW9ucyIgIC0tCi0gKjxQPgotICogICAgICAgICAgICAgICBUaGlzIHNvdW5kcyBsaWtlIGEgam9iIGZvciBNYXJjICJCaXRNYXN0ZXIiIEpvaG5zb24gYWthIHRoZQotICogICAgICAgICAgICAgICAiSGF3YWlpYW4gTWFzdGVyIENoZWYiLjxQPgorICogRGVzY3JpcHRpb246IFRoaXMgcmVjb3JkIGlzIHVzZWQgZm9yIGEgcXVpY2sgbG9va3VwIGludG8gdGhlIFNTVCByZWNvcmQuIFRoaXMKKyAqICAgICAgICAgICAgICByZWNvcmQgYnJlYWtzIHRoZSBTU1QgdGFibGUgaW50byBhIHNldCBvZiBidWNrZXRzLiBUaGUgb2Zmc2V0cworICogICAgICAgICAgICAgIHRvIHRoZXNlIGJ1Y2tldHMgd2l0aGluIHRoZSBTU1QgcmVjb3JkIGFyZSBrZXB0IGFzIHdlbGwgYXMgdGhlCisgKiAgICAgICAgICAgICAgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBTU1QgcmVjb3JkLgogICogUkVGRVJFTkNFOiAgUEcgMzEzIE1pY3Jvc29mdCBFeGNlbCA5NyBEZXZlbG9wZXIncyBLaXQgKElTQk46IDEtNTcyMzEtNDk4LTIpPFA+CiAgKiBAYXV0aG9yIEFuZHJldyBDLiBPbGl2ZXIgKGFjb2xpdmVyIGF0IGFwYWNoZSBkb3Qgb3JnKQorICogQGF1dGhvciBKYXNvbiBIZWlnaHQgKGpoZWlnaHQgYXQgYXBhY2hlIGRvdCBvcmcpCiAgKiBAdmVyc2lvbiAyLjAtcHJlCiAgKiBAc2VlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLkV4dFNTVEluZm9TdWJSZWNvcmQKICAqLwpAQCAtNzUsMTAgKzc1LDE1IEBACiBwdWJsaWMgY2xhc3MgRXh0U1NUUmVjb3JkCiAgICAgZXh0ZW5kcyBSZWNvcmQKIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVQ0tFVF9TSVpFID0gODsKKyAgICAvL0NhbnQgc2VlbSB0byBmaW5kIHRoaXMgZG9jdW1lbnRlZCBidXQgZnJvbSB0aGUgYmlmZnZpZXdlciBpdCBpcyBjbGVhciB0aGF0CisgICAgLy9FeGNlbCBvbmx5IHJlY29yZHMgdGhlIGluZGV4ZXMgZm9yIHRoZSBmaXJzdCAxMjggYnVja2V0cy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQlVDS0VUUyA9IDEyODsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IHNpZCA9IDB4ZmY7Ci0gICAgcHJpdmF0ZSBzaG9ydCAgICAgICAgICAgICBmaWVsZF8xX3N0cmluZ3NfcGVyX2J1Y2tldDsKKyAgICBwcml2YXRlIHNob3J0ICAgICAgICAgICAgIGZpZWxkXzFfc3RyaW5nc19wZXJfYnVja2V0ID0gREVGQVVMVF9CVUNLRVRfU0laRTsKICAgICBwcml2YXRlIEFycmF5TGlzdCAgICAgICAgIGZpZWxkXzJfc3N0X2luZm87CiAKKwogICAgIHB1YmxpYyBFeHRTU1RSZWNvcmQoKQogICAgIHsKICAgICAgICAgZmllbGRfMl9zc3RfaW5mbyA9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTExOSwxMiArMTI0LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB0aGlzIHByb2JhYmx5IGRvZXNuJ3Qgd29yayBidXQgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYXQgdGhpcyBwb2ludAogICAgIHByb3RlY3RlZCB2b2lkIGZpbGxGaWVsZHMoYnl0ZSBbXSBkYXRhLCBzaG9ydCBzaXplLCBpbnQgb2Zmc2V0KQogICAgIHsKICAgICAgICAgZmllbGRfMl9zc3RfaW5mbyAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIGZpZWxkXzFfc3RyaW5nc19wZXJfYnVja2V0ID0gTGl0dGxlRW5kaWFuLmdldFNob3J0KGRhdGEsIDAgKyBvZmZzZXQpOwotICAgICAgICBmb3IgKGludCBrID0gMjsgayA8ICgoZGF0YS5sZW5ndGggLSBvZmZzZXQpIC0gc2l6ZSk7IGsgKz0gOCkKKyAgICAgICAgZm9yIChpbnQgayA9IDI7IGsgPCAoc2l6ZS1vZmZzZXQpOyBrICs9IDgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSB0ZW1wZGF0YSA9IG5ldyBieXRlWyA4ICsgb2Zmc2V0IF07CiAKQEAgLTE4OSwyNiArMTkzLDU1IEBACiAgICAgcHVibGljIGludCBzZXJpYWxpemUoaW50IG9mZnNldCwgYnl0ZSBbXSBkYXRhKQogICAgIHsKICAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDAgKyBvZmZzZXQsIHNpZCk7Ci0KLS8vICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLDIsKHNob3J0KSgyICsgKGdldE51bUluZm9SZWNvcmRzKCkgKjgpKSk7Ci0gICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCAyICsgb2Zmc2V0LCAoIHNob3J0ICkgKDIgKyAoMHgzZmEgLSAyKSkpOwotICAgICAgICBpbnQgcG9zID0gNDsKKyAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDIgKyBvZmZzZXQsIChzaG9ydCkoZ2V0UmVjb3JkU2l6ZSgpIC0gNCkpOworICAgICAgICBMaXR0bGVFbmRpYW4ucHV0U2hvcnQoZGF0YSwgNCArIG9mZnNldCwgZmllbGRfMV9zdHJpbmdzX3Blcl9idWNrZXQpOworICAgICAgICBpbnQgcG9zID0gNjsKIAogICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGdldE51bUluZm9SZWNvcmRzKCk7IGsrKykKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShnZXRJbmZvUmVjb3JkQXQoaykuc2VyaWFsaXplKCksIDAsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArIG9mZnNldCwgOCk7CisgICAgICAgICAgICBFeHRTU1RJbmZvU3ViUmVjb3JkIHJlYyA9IGdldEluZm9SZWNvcmRBdChrKTsKKyAgICAgICAgICAgIHBvcyArPSByZWMuc2VyaWFsaXplKHBvcyArIG9mZnNldCwgZGF0YSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFJlY29yZFNpemUoKTsKKyAgICAgICAgcmV0dXJuIHBvczsKICAgICB9CiAKKyAgICAvKiogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIHJlY29yZCAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UmVjb3JkU2l6ZSgpCiAgICAgewotICAgICAgICByZXR1cm4gNiArIDB4M2ZhIC0gMjsKKyAgICAgICAgcmV0dXJuIDYgKyA4KmdldE51bUluZm9SZWNvcmRzKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0TnVtYmVyT2ZJbmZvUmVjc0ZvclN0cmluZ3MoaW50IG51bVN0cmluZ3MpIHsKKyAgICAgIGludCBpbmZvUmVjcyA9IChudW1TdHJpbmdzIC8gREVGQVVMVF9CVUNLRVRfU0laRSk7CisgICAgICBpZiAoKG51bVN0cmluZ3MgJSBERUZBVUxUX0JVQ0tFVF9TSVpFKSAhPSAwKQorICAgICAgICBpbmZvUmVjcyArKzsKKyAgICAgIC8vRXhjZWwgc2VlbXMgdG8gbWF4IG91dCBhZnRlciAxMjggaW5mbyByZWNvcmRzLgorICAgICAgLy9UaGlzIGlzbnQgcmVhbGx5IGRvY3VtZW50ZWQgYW55d2hlcmUuLi4KKyAgICAgIGlmIChpbmZvUmVjcyA+IE1BWF9CVUNLRVRTKQorICAgICAgICBpbmZvUmVjcyA9IE1BWF9CVUNLRVRTOworICAgICAgcmV0dXJuIGluZm9SZWNzOworICAgIH0KKworICAgIC8qKiBHaXZlbiBhIG51bWJlciBvZiBzdHJpbmdzIChpbiB0aGUgc3N0KSwgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZXh0c3N0IHJlY29yZCovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0UmVjb3JkU2l6ZUZvclN0cmluZ3MoaW50IG51bVN0cmluZ3MpIHsKKyAgICAgIHJldHVybiA0ICsgMiArIChnZXROdW1iZXJPZkluZm9SZWNzRm9yU3RyaW5ncyhudW1TdHJpbmdzKSAqIDgpOwogICAgIH0KIAogICAgIHB1YmxpYyBzaG9ydCBnZXRTaWQoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2lkOworICAgICAgICByZXR1cm4gc2lkOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJ1Y2tldE9mZnNldHMoIGludFtdIGJ1Y2tldEFic29sdXRlT2Zmc2V0cywgaW50W10gYnVja2V0UmVsYXRpdmVPZmZzZXRzICkKKyAgICB7CisgICAgICAgIHRoaXMuZmllbGRfMl9zc3RfaW5mbyA9IG5ldyBBcnJheUxpc3QoYnVja2V0QWJzb2x1dGVPZmZzZXRzLmxlbmd0aCk7CisgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGJ1Y2tldEFic29sdXRlT2Zmc2V0cy5sZW5ndGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4dFNTVEluZm9TdWJSZWNvcmQgciA9IG5ldyBFeHRTU1RJbmZvU3ViUmVjb3JkKCk7CisgICAgICAgICAgICByLnNldEJ1Y2tldFJlY29yZE9mZnNldCgoc2hvcnQpYnVja2V0UmVsYXRpdmVPZmZzZXRzW2ldKTsKKyAgICAgICAgICAgIHIuc2V0U3RyZWFtUG9zKGJ1Y2tldEFic29sdXRlT2Zmc2V0c1tpXSk7CisgICAgICAgICAgICBmaWVsZF8yX3NzdF9pbmZvLmFkZChyKTsKKyAgICAgICAgfQorICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvRXh0ZXJuU2hlZXRSZWNvcmQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0V4dGVyblNoZWV0UmVjb3JkLmphdmEKaW5kZXggNzYxZDQwMC4uMDQ4ZmI0NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvRXh0ZXJuU2hlZXRSZWNvcmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9FeHRlcm5TaGVldFJlY29yZC5qYXZhCkBAIC0xICsxLDIzMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xICogKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAqIHJlc2VydmVkLiAqICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zICogYXJlIG1ldDogKiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAqICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlICogICAgZGlzdHJpYnV0aW9uLiAqICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4gKiAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBhbmQgKiAgICAiQXBhY2hlIFBPSSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4gKiAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLCAqICAgICJBcGFjaGUgUE9JIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GICogU1VDSCBEQU1BR0UuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKiAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55ICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAqL3BhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQ7aW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuTGl0dGxlRW5kaWFuO2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Oy8qKiAqIFRpdGxlOiAgICAgICAgRXh0ZXJuIFNoZWV0IDxQPiAqIERlc2NyaXB0aW9uOiAgQSBMaXN0IG9mIElubmRleGVzIHRvIFN1cEJvb2sgPFA+ICogUkVGRVJFTkNFOiAgPFA+ICogQGF1dGhvciBMaWJpbiBSb21hbiAoVmlzdGEgUG9ydGFsIExEVC4gRGV2ZWxvcGVyKSAqIEB2ZXJzaW9uIDEuMC1wcmUgKi9wdWJsaWMgY2xhc3MgRXh0ZXJuU2hlZXRSZWNvcmQgZXh0ZW5kcyBSZWNvcmQgeyAgICBwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IHNpZCA9IDB4MTc7ICAgIHByaXZhdGUgc2hvcnQgICAgICAgICAgICAgZmllbGRfMV9udW1iZXJfb2ZfUkVGX3N0dXJjdXRyZXM7ICAgIHByaXZhdGUgQXJyYXlMaXN0ICAgICAgICAgZmllbGRfMl9SRUZfc3RydWN0dXJlczsgICAgICAgIHB1YmxpYyBFeHRlcm5TaGVldFJlY29yZCgpIHsgICAgICAgIGZpZWxkXzJfUkVGX3N0cnVjdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIH0gICAgICAgIC8qKiAgICAgKiBDb25zdHJ1Y3RzIGEgRXh0ZXJuIFNoZWV0IHJlY29yZCBhbmQgc2V0cyBpdHMgZmllbGRzIGFwcHJvcHJpYXRlbHkuICAgICAqICAgICAqIEBwYXJhbSBpZCAgICAgaWQgbXVzdCBiZSAweDE2IG9yIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93IHVwb24gdmFsaWRhdGlvbiAgICAgKiBAcGFyYW0gc2l6ZSAgdGhlIHNpemUgb2YgdGhlIGRhdGEgYXJlYSBvZiB0aGUgcmVjb3JkICAgICAqIEBwYXJhbSBkYXRhICBkYXRhIG9mIHRoZSByZWNvcmQgKHNob3VsZCBub3QgY29udGFpbiBzaWQvbGVuKSAgICAgKi8gICAgICAgIHB1YmxpYyBFeHRlcm5TaGVldFJlY29yZChzaG9ydCBpZCwgc2hvcnQgc2l6ZSwgYnl0ZVtdIGRhdGEpIHsgICAgICAgIHN1cGVyKGlkLCBzaXplLCBkYXRhKTsgICAgfSAgICAgICAgLyoqICAgICAqIENvbnN0cnVjdHMgYSBFeHRlcm4gU2hlZXQgcmVjb3JkIGFuZCBzZXRzIGl0cyBmaWVsZHMgYXBwcm9wcmlhdGVseS4gICAgICogICAgICogQHBhcmFtIGlkICAgICBpZCBtdXN0IGJlIDB4MTYgb3IgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3cgdXBvbiB2YWxpZGF0aW9uICAgICAqIEBwYXJhbSBzaXplICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhcmVhIG9mIHRoZSByZWNvcmQgICAgICogQHBhcmFtIGRhdGEgIGRhdGEgb2YgdGhlIHJlY29yZCAoc2hvdWxkIG5vdCBjb250YWluIHNpZC9sZW4pICAgICAqIEBwYXJhbSBvZmZzZXQgb2YgdGhlIHJlY29yZCdzIGRhdGEgICAgICovICAgIHB1YmxpYyBFeHRlcm5TaGVldFJlY29yZChzaG9ydCBpZCwgc2hvcnQgc2l6ZSwgYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQpIHsgICAgICAgIHN1cGVyKGlkLCBzaXplLCBkYXRhLCBvZmZzZXQpOyAgICB9ICAgICAgICAvKiogICAgICogY2FsbGVkIGJ5IGNvbnN0cnVjdG9yLCBzaG91bGQgdGhyb3cgcnVudGltZSBleGNlcHRpb24gaW4gdGhlIGV2ZW50IG9mIGEgICAgICogcmVjb3JkIHBhc3NlZCB3aXRoIGEgZGlmZmVyaW5nIElELiAgICAgKiAgICAgKiBAcGFyYW0gaWQgYWxsZWdlZCBpZCBmb3IgdGhpcyByZWNvcmQgICAgICovICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2lkKHNob3J0IGlkKSB7ICAgICAgICBpZiAoaWQgIT0gc2lkKSB7ICAgICAgICAgICAgdGhyb3cgbmV3IFJlY29yZEZvcm1hdEV4Y2VwdGlvbigiTk9UIEFuIEV4dGVyblNoZWV0IFJFQ09SRCIpOyAgICAgICAgfSAgICB9ICAgICAgICAvKiogICAgICogY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvciwgc2hvdWxkIHNldCBjbGFzcyBsZXZlbCBmaWVsZHMuICBTaG91bGQgdGhyb3cgICAgICogcnVudGltZSBleGNlcHRpb24gZm9yIGJhZC9pY29tcGxldGUgZGF0YS4gICAgICogICAgICogQHBhcmFtIGRhdGEgcmF3IGRhdGEgICAgICogQHBhcmFtIHNpemUgc2l6ZSBvZiBkYXRhICAgICAqIEBwYXJhbSBvZmZzZXQgb2YgdGhlIHJlY29yZCdzIGRhdGEgKHByb3ZpZGVkIGEgYmlnIGFycmF5IG9mIHRoZSBmaWxlKSAgICAgKi8gICAgcHJvdGVjdGVkIHZvaWQgZmlsbEZpZWxkcyhieXRlIFtdIGRhdGEsIHNob3J0IHNpemUsIGludCBvZmZzZXQpIHsgICAgICAgIGZpZWxkXzJfUkVGX3N0cnVjdHVyZXMgICAgICAgICAgID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAgICBmaWVsZF8xX251bWJlcl9vZl9SRUZfc3R1cmN1dHJlcyA9IExpdHRsZUVuZGlhbi5nZXRTaG9ydChkYXRhLCAwICsgb2Zmc2V0KTsgICAgICAgICAgICAgICAgaW50IHBvcyA9IDIgKyBvZmZzZXQ7ICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBmaWVsZF8xX251bWJlcl9vZl9SRUZfc3R1cmN1dHJlcyA7ICsraSkgeyAgICAgICAgICAgIEV4dGVyblNoZWV0U3ViUmVjb3JkIHJlYyA9IG5ldyBFeHRlcm5TaGVldFN1YlJlY29yZCgoc2hvcnQpMCwgKHNob3J0KTYgLCBkYXRhICwgcG9zKTsgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gNjsgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF8yX1JFRl9zdHJ1Y3R1cmVzLmFkZCggcmVjKTsgICAgICAgIH0gICAgfSAgICAgICAgLyoqICAgICAgKiBzZXRzIHRoZSBudW1iZXIgb2YgdGhlIFJFRiBzdHJ1Y3RvcnMgLCB0aGF0IGlzIGluIEV4Y2VsIGZpbGUgICAgICogQHBhcmFtIG51bVN0cnVjdCBudW1iZXIgb2YgUkVGIHN0cnVjdHMgICAgICovICAgIHB1YmxpYyB2b2lkIHNldE51bU9mUkVGU3RydWN0dXJlcyhzaG9ydCBudW1TdHJ1Y3QpIHsgICAgICAgIGZpZWxkXzFfbnVtYmVyX29mX1JFRl9zdHVyY3V0cmVzID0gbnVtU3RydWN0OyAgICB9ICAgICAgICAvKiogICAgICAgKiByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgUkVGIHN0cnVjdG9ycyAsIHRoYXQgaXMgaW4gRXhjZWwgZmlsZSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBSRUYgc3RydWN0cyAgICAgKi8gICAgcHVibGljIHNob3J0IGdldE51bU9mUkVGU3RydWN0dXJlcygpIHsgICAgICAgIHJldHVybiBmaWVsZF8xX251bWJlcl9vZl9SRUZfc3R1cmN1dHJlczsgICAgfSAgICAgICAgLyoqICAgICAgKiBhZGRzIFJFRiBzdHJ1Y3QgKEV4dGVyblNoZWV0U3ViUmVjb3JkKSAgICAgKiBAcGFyYW0gcmVjIFJFRiBzdHJ1Y3QgICAgICovICAgIHB1YmxpYyB2b2lkIGFkZFJFRlJlY29yZChFeHRlcm5TaGVldFN1YlJlY29yZCByZWMpIHsgICAgICAgIGZpZWxkXzJfUkVGX3N0cnVjdHVyZXMuYWRkKHJlYyk7ICAgIH0gICAgICAgIC8qKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgUkVGIFJlY29yZHMsIHdoaWNoIGlzIGluIG1vZGVsICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIFJFRiByZWNvcmRzICAgICAqLyAgICBwdWJsaWMgaW50IGdldE51bU9mUkVGUmVjb3JkcygpIHsgICAgICAgIHJldHVybiBmaWVsZF8yX1JFRl9zdHJ1Y3R1cmVzLnNpemUoKTsgICAgfSAgICAgICAgLyoqIHJldHVybnMgdGhlIFJFRiByZWNvcmQgKEV4dGVyblNoZWV0U3ViUmVjb3JkKSAgICAgKiBAcGFyYW0gZWxlbSBpbmRleCB0byBwbGFjZSAgICAgKiBAcmV0dXJuIFJFRiByZWNvcmQgICAgICovICAgIHB1YmxpYyBFeHRlcm5TaGVldFN1YlJlY29yZCBnZXRSRUZSZWNvcmRBdChpbnQgZWxlbSkgeyAgICAgICAgRXh0ZXJuU2hlZXRTdWJSZWNvcmQgcmVzdWx0ID0gKCBFeHRlcm5TaGVldFN1YlJlY29yZCApIGZpZWxkXzJfUkVGX3N0cnVjdHVyZXMuZ2V0KGVsZW0pOyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAgICB9ICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiW0VYVEVSTlNIRUVUXVxuIik7ICAgICAgICBidWZmZXIuYXBwZW5kKCIgICBudW1PZlJlZnMgICAgID0gIikuYXBwZW5kKGdldE51bU9mUkVGU3RydWN0dXJlcygpKS5hcHBlbmQoIlxuIik7ICAgICAgICBmb3IgKGludCBrPTA7IGsgPCB0aGlzLmdldE51bU9mUkVGUmVjb3JkcygpOyBrKyspIHsgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJyZWZyZWMgICAgICAgICAjIikuYXBwZW5kKGspLmFwcGVuZCgnXG4nKTsgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJFRlJlY29yZEF0KGspLnRvU3RyaW5nKCkpOyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0tLS1yZWZyZWMgICAgICMiKS5hcHBlbmQoaykuYXBwZW5kKCdcbicpOyAgICAgICAgfSAgICAgICAgYnVmZmVyLmFwcGVuZCgiWy9FWFRFUk5TSEVFVF1cbiIpOyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsgICAgfSAgICAgICAgLyoqICAgICAqIGNhbGxlZCBieSB0aGUgY2xhc3MgdGhhdCBpcyByZXNwb25zaWJsZSBmb3Igd3JpdGluZyB0aGlzIHN1Y2tlci4gICAgICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgc28gdGhhdCB0aGVpciBkYXRhIGlzIHBhc3NlZCBiYWNrIGluIGEgICAgICogYnl0ZSBhcnJheS4gICAgICogICAgICogQHBhcmFtIG9mZnNldCB0byBiZWdpbiB3cml0aW5nIGF0ICAgICAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbnN0YW5jZSBkYXRhICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gICAgICovICAgIHB1YmxpYyBpbnQgc2VyaWFsaXplKGludCBvZmZzZXQsIGJ5dGUgW10gZGF0YSkgeyAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDAgKyBvZmZzZXQsIHNpZCk7ICAgICAgICBMaXR0bGVFbmRpYW4ucHV0U2hvcnQoZGF0YSwgMiArIG9mZnNldCwoc2hvcnQpKDIgKyAoZ2V0TnVtT2ZSRUZSZWNvcmRzKCkgKjYpKSk7ICAgICAgICAgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCA0ICsgb2Zmc2V0LCBnZXROdW1PZlJFRlN0cnVjdHVyZXMoKSk7ICAgICAgICAgICAgICAgIGludCBwb3MgPSA2IDsgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBnZXROdW1PZlJFRlJlY29yZHMoKTsgaysrKSB7ICAgICAgICAgICAgRXh0ZXJuU2hlZXRTdWJSZWNvcmQgcmVjb3JkID0gZ2V0UkVGUmVjb3JkQXQoayk7ICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZWNvcmQuc2VyaWFsaXplKCksIDAsIGRhdGEsIHBvcyArIG9mZnNldCwgNik7ICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9NjsgICAgICAgIH0gICAgICAgIHJldHVybiBnZXRSZWNvcmRTaXplKCk7ICAgIH0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVjb3JkU2l6ZSgpIHsgICAgICAgIHJldHVybiA0ICsgMiArIGdldE51bU9mUkVGUmVjb3JkcygpICogNjsgICAgfSAgICAgICAgLyoqICAgICAqIHJldHVybiB0aGUgbm9uIHN0YXRpYyB2ZXJzaW9uIG9mIHRoZSBpZCBmb3IgdGhpcyByZWNvcmQuICAgICAqLyAgICBwdWJsaWMgc2hvcnQgZ2V0U2lkKCkgeyAgICAgICAgcmV0dXJuIHRoaXMuc2lkOyAgICB9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBhbmQKKyAqICAgICJBcGFjaGUgUE9JIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgICJBcGFjaGUgUE9JIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkOworCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5MaXR0bGVFbmRpYW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFRpdGxlOiAgICAgICAgRXh0ZXJuIFNoZWV0IDxQPgorICogRGVzY3JpcHRpb246ICBBIExpc3Qgb2YgSW5uZGV4ZXMgdG8gU3VwQm9vayA8UD4KKyAqIFJFRkVSRU5DRTogIDxQPgorICogQGF1dGhvciBMaWJpbiBSb21hbiAoVmlzdGEgUG9ydGFsIExEVC4gRGV2ZWxvcGVyKQorICogQHZlcnNpb24gMS4wLXByZQorICovCisKK3B1YmxpYyBjbGFzcyBFeHRlcm5TaGVldFJlY29yZCBleHRlbmRzIFJlY29yZCB7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBzaWQgPSAweDE3OworICAgIHByaXZhdGUgc2hvcnQgICAgICAgICAgICAgZmllbGRfMV9udW1iZXJfb2ZfUkVGX3N0dXJjdXRyZXM7CisgICAgcHJpdmF0ZSBBcnJheUxpc3QgICAgICAgICBmaWVsZF8yX1JFRl9zdHJ1Y3R1cmVzOworICAgIAorICAgIHB1YmxpYyBFeHRlcm5TaGVldFJlY29yZCgpIHsKKyAgICAgICAgZmllbGRfMl9SRUZfc3RydWN0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEV4dGVybiBTaGVldCByZWNvcmQgYW5kIHNldHMgaXRzIGZpZWxkcyBhcHByb3ByaWF0ZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIGlkICAgICBpZCBtdXN0IGJlIDB4MTYgb3IgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3cgdXBvbiB2YWxpZGF0aW9uCisgICAgICogQHBhcmFtIHNpemUgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGFyZWEgb2YgdGhlIHJlY29yZAorICAgICAqIEBwYXJhbSBkYXRhICBkYXRhIG9mIHRoZSByZWNvcmQgKHNob3VsZCBub3QgY29udGFpbiBzaWQvbGVuKQorICAgICAqLworICAgIAorICAgIHB1YmxpYyBFeHRlcm5TaGVldFJlY29yZChzaG9ydCBpZCwgc2hvcnQgc2l6ZSwgYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgc3VwZXIoaWQsIHNpemUsIGRhdGEpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgRXh0ZXJuIFNoZWV0IHJlY29yZCBhbmQgc2V0cyBpdHMgZmllbGRzIGFwcHJvcHJpYXRlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgICAgIGlkIG11c3QgYmUgMHgxNiBvciBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvdyB1cG9uIHZhbGlkYXRpb24KKyAgICAgKiBAcGFyYW0gc2l6ZSAgdGhlIHNpemUgb2YgdGhlIGRhdGEgYXJlYSBvZiB0aGUgcmVjb3JkCisgICAgICogQHBhcmFtIGRhdGEgIGRhdGEgb2YgdGhlIHJlY29yZCAoc2hvdWxkIG5vdCBjb250YWluIHNpZC9sZW4pCisgICAgICogQHBhcmFtIG9mZnNldCBvZiB0aGUgcmVjb3JkJ3MgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBFeHRlcm5TaGVldFJlY29yZChzaG9ydCBpZCwgc2hvcnQgc2l6ZSwgYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQpIHsKKyAgICAgICAgc3VwZXIoaWQsIHNpemUsIGRhdGEsIG9mZnNldCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGNhbGxlZCBieSBjb25zdHJ1Y3Rvciwgc2hvdWxkIHRocm93IHJ1bnRpbWUgZXhjZXB0aW9uIGluIHRoZSBldmVudCBvZiBhCisgICAgICogcmVjb3JkIHBhc3NlZCB3aXRoIGEgZGlmZmVyaW5nIElELgorICAgICAqCisgICAgICogQHBhcmFtIGlkIGFsbGVnZWQgaWQgZm9yIHRoaXMgcmVjb3JkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTaWQoc2hvcnQgaWQpIHsKKyAgICAgICAgaWYgKGlkICE9IHNpZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlY29yZEZvcm1hdEV4Y2VwdGlvbigiTk9UIEFuIEV4dGVyblNoZWV0IFJFQ09SRCIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3IsIHNob3VsZCBzZXQgY2xhc3MgbGV2ZWwgZmllbGRzLiAgU2hvdWxkIHRocm93CisgICAgICogcnVudGltZSBleGNlcHRpb24gZm9yIGJhZC9pY29tcGxldGUgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHJhdyBkYXRhCisgICAgICogQHBhcmFtIHNpemUgc2l6ZSBvZiBkYXRhCisgICAgICogQHBhcmFtIG9mZnNldCBvZiB0aGUgcmVjb3JkJ3MgZGF0YSAocHJvdmlkZWQgYSBiaWcgYXJyYXkgb2YgdGhlIGZpbGUpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmlsbEZpZWxkcyhieXRlIFtdIGRhdGEsIHNob3J0IHNpemUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgZmllbGRfMl9SRUZfc3RydWN0dXJlcyAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIAorICAgICAgICBmaWVsZF8xX251bWJlcl9vZl9SRUZfc3R1cmN1dHJlcyA9IExpdHRsZUVuZGlhbi5nZXRTaG9ydChkYXRhLCAwICsgb2Zmc2V0KTsKKyAgICAgICAgCisgICAgICAgIGludCBwb3MgPSAyICsgb2Zmc2V0OworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBmaWVsZF8xX251bWJlcl9vZl9SRUZfc3R1cmN1dHJlcyA7ICsraSkgeworICAgICAgICAgICAgRXh0ZXJuU2hlZXRTdWJSZWNvcmQgcmVjID0gbmV3IEV4dGVyblNoZWV0U3ViUmVjb3JkKChzaG9ydCkwLCAoc2hvcnQpNiAsIGRhdGEgLCBwb3MpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gNjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmllbGRfMl9SRUZfc3RydWN0dXJlcy5hZGQoIHJlYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIHNldHMgdGhlIG51bWJlciBvZiB0aGUgUkVGIHN0cnVjdG9ycyAsIHRoYXQgaXMgaW4gRXhjZWwgZmlsZQorICAgICAqIEBwYXJhbSBudW1TdHJ1Y3QgbnVtYmVyIG9mIFJFRiBzdHJ1Y3RzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtT2ZSRUZTdHJ1Y3R1cmVzKHNob3J0IG51bVN0cnVjdCkgeworICAgICAgICBmaWVsZF8xX251bWJlcl9vZl9SRUZfc3R1cmN1dHJlcyA9IG51bVN0cnVjdDsKKyAgICB9CisgICAgCisgICAgLyoqICAKKyAgICAgKiByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgUkVGIHN0cnVjdG9ycyAsIHRoYXQgaXMgaW4gRXhjZWwgZmlsZQorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIFJFRiBzdHJ1Y3RzCisgICAgICovCisgICAgcHVibGljIHNob3J0IGdldE51bU9mUkVGU3RydWN0dXJlcygpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkXzFfbnVtYmVyX29mX1JFRl9zdHVyY3V0cmVzOworICAgIH0KKyAgICAKKyAgICAvKiogCisgICAgICogYWRkcyBSRUYgc3RydWN0IChFeHRlcm5TaGVldFN1YlJlY29yZCkKKyAgICAgKiBAcGFyYW0gcmVjIFJFRiBzdHJ1Y3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSRUZSZWNvcmQoRXh0ZXJuU2hlZXRTdWJSZWNvcmQgcmVjKSB7CisgICAgICAgIGZpZWxkXzJfUkVGX3N0cnVjdHVyZXMuYWRkKHJlYyk7CisgICAgfQorICAgIAorICAgIC8qKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgUkVGIFJlY29yZHMsIHdoaWNoIGlzIGluIG1vZGVsCisgICAgICogQHJldHVybiBudW1iZXIgb2YgUkVGIHJlY29yZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bU9mUkVGUmVjb3JkcygpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkXzJfUkVGX3N0cnVjdHVyZXMuc2l6ZSgpOworICAgIH0KKyAgICAKKyAgICAvKiogcmV0dXJucyB0aGUgUkVGIHJlY29yZCAoRXh0ZXJuU2hlZXRTdWJSZWNvcmQpCisgICAgICogQHBhcmFtIGVsZW0gaW5kZXggdG8gcGxhY2UKKyAgICAgKiBAcmV0dXJuIFJFRiByZWNvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0ZXJuU2hlZXRTdWJSZWNvcmQgZ2V0UkVGUmVjb3JkQXQoaW50IGVsZW0pIHsKKyAgICAgICAgRXh0ZXJuU2hlZXRTdWJSZWNvcmQgcmVzdWx0ID0gKCBFeHRlcm5TaGVldFN1YlJlY29yZCApIGZpZWxkXzJfUkVGX3N0cnVjdHVyZXMuZ2V0KGVsZW0pOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIltFWFRFUk5TSEVFVF1cbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgICBudW1PZlJlZnMgICAgID0gIikuYXBwZW5kKGdldE51bU9mUkVGU3RydWN0dXJlcygpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGZvciAoaW50IGs9MDsgayA8IHRoaXMuZ2V0TnVtT2ZSRUZSZWNvcmRzKCk7IGsrKykgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgicmVmcmVjICAgICAgICAgIyIpLmFwcGVuZChrKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJFRlJlY29yZEF0KGspLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLS0tLXJlZnJlYyAgICAgIyIpLmFwcGVuZChrKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWy9FWFRFUk5TSEVFVF1cbiIpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogY2FsbGVkIGJ5IHRoZSBjbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIHRoaXMgc3Vja2VyLgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIHNvIHRoYXQgdGhlaXIgZGF0YSBpcyBwYXNzZWQgYmFjayBpbiBhCisgICAgICogYnl0ZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgdG8gYmVnaW4gd3JpdGluZyBhdAorICAgICAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbnN0YW5jZSBkYXRhCisgICAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2VyaWFsaXplKGludCBvZmZzZXQsIGJ5dGUgW10gZGF0YSkgeworICAgICAgICBMaXR0bGVFbmRpYW4ucHV0U2hvcnQoZGF0YSwgMCArIG9mZnNldCwgc2lkKTsKKyAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDIgKyBvZmZzZXQsKHNob3J0KSgyICsgKGdldE51bU9mUkVGUmVjb3JkcygpICo2KSkpOworICAgICAgICAKKyAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDQgKyBvZmZzZXQsIGdldE51bU9mUkVGU3RydWN0dXJlcygpKTsKKyAgICAgICAgCisgICAgICAgIGludCBwb3MgPSA2IDsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZ2V0TnVtT2ZSRUZSZWNvcmRzKCk7IGsrKykgeworICAgICAgICAgICAgRXh0ZXJuU2hlZXRTdWJSZWNvcmQgcmVjb3JkID0gZ2V0UkVGUmVjb3JkQXQoayk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlY29yZC5zZXJpYWxpemUoKSwgMCwgZGF0YSwgcG9zICsgb2Zmc2V0LCA2KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UmVjb3JkU2l6ZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFJlY29yZFNpemUoKSB7CisgICAgICAgIHJldHVybiA0ICsgMiArIGdldE51bU9mUkVGUmVjb3JkcygpICogNjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogcmV0dXJuIHRoZSBub24gc3RhdGljIHZlcnNpb24gb2YgdGhlIGlkIGZvciB0aGlzIHJlY29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2lkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zaWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvRm9ybXVsYVJlY29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvRm9ybXVsYVJlY29yZC5qYXZhCmluZGV4IGFkOTI2YmUuLjA1MDU1ODcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0Zvcm11bGFSZWNvcmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Gb3JtdWxhUmVjb3JkLmphdmEKQEAgLTU1Nyw4ICs1NTcsMTMgQEAKICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgIC54ZiAgICAgICAgICAgICAgPSAiKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhnZXRYRkluZGV4KCkpKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLnZhbHVlICAgICAgICAgICA9ICIpLmFwcGVuZChnZXRWYWx1ZSgpKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICBpZiAoRG91YmxlLmlzTmFOKHRoaXMuZ2V0VmFsdWUoKSkgJiYgdmFsdWVfZGF0YSAhPSBudWxsKQorICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLnZhbHVlIChOYU4pICAgICA9ICIpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9yZy5hcGFjaGUucG9pLnV0aWwuSGV4RHVtcC5kdW1wKHZhbHVlX2RhdGEsMCwwKSkKKyAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAgICAudmFsdWUgICAgICAgICAgID0gIikuYXBwZW5kKGdldFZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgIC5vcHRpb25zICAgICAgICAgPSAiKS5hcHBlbmQoZ2V0T3B0aW9ucygpKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLnplcm8gICAgICAgICAgICA9ICIpLmFwcGVuZChmaWVsZF82X3plcm8pCkBAIC02MDcsOSArNjEyLDEwIEBACiAgICAgICBpZiAoZmllbGRfOF9wYXJzZWRfZXhwciAhPSBudWxsKQogICAgICAgICBzaXplID0gZmllbGRfOF9wYXJzZWRfZXhwci5zaXplKCk7CiAgICAgICBmb3IgKGludCBpPTA7IGk8IHNpemU7IGkrKykgewotICAgICAgICBQdGcgcHRnID0gKFB0ZykoKFB0ZylmaWVsZF84X3BhcnNlZF9leHByLmdldChpKSkuY2xvbmUoKTsKLSAgICAgICAgcmVjLmZpZWxkXzhfcGFyc2VkX2V4cHIuc2V0KGksIHB0Zyk7CisgICAgICAgIFB0ZyBwdGcgPSAoUHRnKSgoUHRnKWZpZWxkXzhfcGFyc2VkX2V4cHIuZ2V0KGkpKS5jbG9uZSgpOyAgICAgICAgCisgICAgICAgIHJlYy5maWVsZF84X3BhcnNlZF9leHByLmFkZChpLCBwdGcpOwogICAgICAgfQorICAgICAgcmVjLnZhbHVlX2RhdGEgPSB2YWx1ZV9kYXRhOwogICAgICAgcmVjLmFsbF9kYXRhID0gYWxsX2RhdGE7CiAgICAgICByZXR1cm4gcmVjOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0xhYmVsUmVjb3JkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9MYWJlbFJlY29yZC5qYXZhCmluZGV4IDU1ODU4NGIuLjg3NTVhMDYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL0xhYmVsUmVjb3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvTGFiZWxSZWNvcmQuamF2YQpAQCAtMTUwLDE1ICsxNTAsMTYgQEAKICAgICAgICAgZmllbGRfM194Zl9pbmRleCAgICAgPSBMaXR0bGVFbmRpYW4uZ2V0U2hvcnQoZGF0YSwgNCArIG9mZnNldCk7CiAgICAgICAgIGZpZWxkXzRfc3RyaW5nX2xlbiAgID0gTGl0dGxlRW5kaWFuLmdldFNob3J0KGRhdGEsIDYgKyBvZmZzZXQpOwogICAgICAgICBmaWVsZF81X3VuaWNvZGVfZmxhZyA9IGRhdGFbIDggKyBvZmZzZXQgXTsKLSAgICAgICAgaWYgKGlzVW5Db21wcmVzc2VkVW5pY29kZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWVsZF82X3ZhbHVlID0gU3RyaW5nVXRpbC5nZXRGcm9tVW5pY29kZShkYXRhLCA4ICsgb2Zmc2V0LAorICAgICAgICBpZiAoZmllbGRfNF9zdHJpbmdfbGVuID4gMCkgeworICAgICAgICAgIGlmIChpc1VuQ29tcHJlc3NlZFVuaWNvZGUoKSkgeworICAgICAgICAgICAgZmllbGRfNl92YWx1ZSA9IFN0cmluZ1V0aWwuZ2V0RnJvbVVuaWNvZGUoZGF0YSwgOSArIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkXzRfc3RyaW5nX2xlbik7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWVsZF82X3ZhbHVlID0gU3RyaW5nVXRpbC5nZXRGcm9tQ29tcHJlc3NlZFVuaWNvZGUoZGF0YSwgOSArIG9mZnNldCwgZ2V0U3RyaW5nTGVuZ3RoKCkpOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZmllbGRfNl92YWx1ZSA9IFN0cmluZ1V0aWwuZ2V0RnJvbUNvbXByZXNzZWRVbmljb2RlKGRhdGEsIDkgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgZ2V0U3RyaW5nTGVuZ3RoKCkpOwogICAgICAgICB9CisgICAgICAgIH0gZWxzZSBmaWVsZF82X3ZhbHVlID0gbnVsbDsKICAgICB9CiAKIC8qIFJFQUQgT05MWSBBQ0NFU1MuLi4gVEhJUyBJUyBGT1IgQ09NUEFUSUJJTElUWSBPTkxZLi4uVVNFIExBQkVMU1NUIQpAQCAtMjM3LDYgKzIzOCwyNyBAQAogICAgICAgICByZXR1cm4gdGhpcy5zaWQ7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKCJbTEFCRUxdXG4iKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgIC5yb3cgICAgICAgICAgICA9ICIpCisgICAgICAgICAgICAuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoZ2V0Um93KCkpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAgICAuY29sdW1uICAgICAgICAgPSAiKQorICAgICAgICAgICAgLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGdldENvbHVtbigpKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLnhmaW5kZXggICAgICAgID0gIikKKyAgICAgICAgICAgIC5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhnZXRYRkluZGV4KCkpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAgICAuc3RyaW5nX2xlbiAgICAgICA9ICIpCisgICAgICAgICAgICAuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoZmllbGRfNF9zdHJpbmdfbGVuKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLnVuaWNvZGVfZmxhZyAgICAgICA9ICIpCisgICAgICAgICAgICAuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoZmllbGRfNV91bmljb2RlX2ZsYWcpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAgICAudmFsdWUgICAgICAgPSAiKQorICAgICAgICAgICAgLmFwcGVuZChnZXRWYWx1ZSgpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlsvTEFCRUxdXG4iKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworCiAgICAgcHVibGljIGJvb2xlYW4gaXNCZWZvcmUoQ2VsbFZhbHVlUmVjb3JkSW50ZXJmYWNlIGkpCiAgICAgewogICAgICAgICBpZiAodGhpcy5nZXRSb3coKSA+IGkuZ2V0Um93KCkpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9OYW1lUmVjb3JkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9OYW1lUmVjb3JkLmphdmEKaW5kZXggMDliZjJhNC4uYjkxYzgyOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvTmFtZVJlY29yZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL05hbWVSZWNvcmQuamF2YQpAQCAtNTgsMTEgKzU4LDExIEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhLkFyZWEzRFB0ZzsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhLlB0ZzsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhLlJlZjNEUHRnOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5SYW5nZUFkZHJlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkhleER1bXA7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5MaXR0bGVFbmRpYW47CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5TdHJpbmdVdGlsOwpAQCAtMTI3LDYgKzEyNywxNCBAQAogCSAqLwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZSAgQlVJTFRJTl9TSEVFVF9USVRMRSAgICAgICAgICAgPSAoYnl0ZSkxMjsKICAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IE9QVF9ISURERU5fTkFNRSA9ICAgKHNob3J0KSAweDAwMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBPUFRfRlVOQ1RJT05fTkFNRSA9IChzaG9ydCkgMHgwMDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgT1BUX0NPTU1BTkRfTkFNRSA9ICAoc2hvcnQpIDB4MDAwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IE9QVF9NQUNSTyA9ICAgICAgICAgKHNob3J0KSAweDAwMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBPUFRfQ09NUExFWCA9ICAgICAgIChzaG9ydCkgMHgwMDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgT1BUX0JVSUxUSU4gPSAgICAgICAoc2hvcnQpIDB4MDAyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IE9QVF9CSU5EQVRBID0gICAgICAgKHNob3J0KSAweDEwMDA7CisKICAgICAKICAgICBwcml2YXRlIHNob3J0ICAgICAgICAgICAgIGZpZWxkXzFfb3B0aW9uX2ZsYWc7CiAgICAgcHJpdmF0ZSBieXRlICAgICAgICAgICAgICBmaWVsZF8yX2tleWJvYXJkX3Nob3J0Y3V0OwpAQCAtMTkyLDcgKzIwMCw3IEBACiAJewogCSAgICB0aGlzKCk7CSAgICAKIAkgICAgdGhpcy5maWVsZF8xMl9idWlsdEluX25hbWUgPSBidWlsdGluOwotCSAgICB0aGlzLnNldE9wdGlvbkZsYWcoKHNob3J0KSh0aGlzLmdldE9wdGlvbkZsYWcoKSB8IChzaG9ydCkweDIwKSk7CisJICAgIHRoaXMuc2V0T3B0aW9uRmxhZygoc2hvcnQpKHRoaXMuZ2V0T3B0aW9uRmxhZygpIHwgT1BUX0JVSUxUSU4pKTsKIAkgICAgdGhpcy5zZXROYW1lVGV4dExlbmd0aCgoYnl0ZSkxKTsKIAkgICAgdGhpcy5zZXRFcXVhbHNUb0luZGV4VG9TaGVldChpbmRleCk7IC8vdGhlIGV4dGVybiBzaGVldHMgYXJlIHNldCB0aHJvdWdoIHJlZmVyZW5jZXMKIAkgICAgCkBAIC0yNTIsMTMgKzI2MCwyMiBAQAogCiAJLyoqCiAJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBpbmRleCB0aGUgbmFtZSByZWZlcnMgdG8uCi0JICogQHNlZSBnZXRFcXVhbHNUb0luZGV4VG9TaGVldCgpCisJICogQHNlZSAjZ2V0RXF1YWxzVG9JbmRleFRvU2hlZXQoKQogCSAqIEByZXR1cm4gc2hvcnQKIAkgKi8KIAlwdWJsaWMgc2hvcnQgZ2V0SW5kZXhUb1NoZWV0KCkgewogCQlyZXR1cm4gZ2V0RXF1YWxzVG9JbmRleFRvU2hlZXQoKTsKIAl9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGZ1bmN0aW9uIGdyb3VwCisgICAgICogQHNlZSBGbkdyb3VwQ291bnRSZWNvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZSBnZXRGbkdyb3VwKCkgeworICAgICAgICBpbnQgbWFza2VkID0gZmllbGRfMV9vcHRpb25fZmxhZyAmIDB4MGZjMDsKKyAgICAgICAgcmV0dXJuIChieXRlKSAobWFza2VkID4+IDQpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHNldEVxdWFsc1RvSW5kZXhUb1NoZWV0KHNob3J0IHZhbHVlKQogICAgIHsKICAgICAgICAgZmllbGRfNl9lcXVhbHNfdG9faW5kZXhfdG9fc2hlZXQgPSB2YWx1ZTsKQEAgLTQwOSwxMSArNDI2LDQ3IEBACiAgICAgICAgIHJldHVybiBmaWVsZF8xMV9jb21wcmVzc2VkX3VuaWNvZGVfZmxhZzsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBoaWRkZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAoZmllbGRfMV9vcHRpb25fZmxhZyAmIE9QVF9ISURERU5fTkFNRSkgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIGZ1bmN0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGdW5jdGlvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAoZmllbGRfMV9vcHRpb25fZmxhZyAmIE9QVF9GVU5DVElPTl9OQU1FKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWFuZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAoZmllbGRfMV9vcHRpb25fZmxhZyAmIE9QVF9DT01NQU5EX05BTUUpICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGZ1bmN0aW9uIG1hY3JvIG9yIGNvbW1hbmQgbWFjcm8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hY3JvKCkgeworICAgICAgICByZXR1cm4gKGZpZWxkXzFfb3B0aW9uX2ZsYWcgJiBPUFRfTUFDUk8pICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGFycmF5IGZvcm11bGEgb3IgdXNlciBkZWZpbmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV4RnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAoZmllbGRfMV9vcHRpb25fZmxhZyAmIE9QVF9DT01QTEVYKSAhPSAwOworICAgIH0KKworCiAJLyoqQ29udmVuaWVuY2UgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBuYW1lIGlzIGEgYnVpbHQtaW4gbmFtZQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzQnVpbHRJbk5hbWUoKQogCXsKLQkgICAgcmV0dXJuICgodGhpcy5nZXRPcHRpb25GbGFnKCkgJiAoc2hvcnQpMHgyMCkgIT0gMCk7CisJICAgIHJldHVybiAoKHRoaXMuZ2V0T3B0aW9uRmxhZygpICYgT1BUX0JVSUxUSU4pICE9IDApOwogCX0KIAogCkBAIC01MTEsNyArNTY0LDcgQEAKICAgICAgICAgZGF0YVsxOCArIG9mZnNldF0gPSBnZXRDb21wcmVzc2VkVW5pY29kZUZsYWcoKTsKIAogICAgICAgICAvKiB0ZW1wOiBnanMKLSAgICAgICAgaWYgKCAoIGZpZWxkXzFfb3B0aW9uX2ZsYWcgJiAoc2hvcnQpIDB4MjAgKSAhPSAwICkKKyAgICAgICAgaWYgKGlzQnVpbHRJbk5hbWUoKSkKICAgICAgICAgewogICAgICAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KCBkYXRhLCAyICsgb2Zmc2V0LCAoc2hvcnQpICggMTYgKyBmaWVsZF8xM19yYXdfbmFtZV9kZWZpbml0aW9uLmxlbmd0aCApICk7CiAKQEAgLTY0NywxNiArNzAwLDE2IEBACiAgICAgLyoqIGdldHMgdGhlIHJlZmVyZW5jZSAsIHRoZSBhcmVhIG9ubHkgKHJhbmdlKQogICAgICAqIEByZXR1cm4gYXJlYSByZWZlcmVuY2UKICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFyZWFSZWZlcmVuY2UoU2hlZXRSZWZlcmVuY2VzIHJlZnMpeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJlYVJlZmVyZW5jZShXb3JrYm9vayBib29rKXsKICAgICAgICAgaWYgKGZpZWxkXzEzX25hbWVfZGVmaW5pdGlvbiA9PSBudWxsKSByZXR1cm4gIiNSRUYhIjsKICAgICAgICAgUHRnIHB0ZyA9IChQdGcpIGZpZWxkXzEzX25hbWVfZGVmaW5pdGlvbi5wZWVrKCk7CiAgICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsKIAogICAgICAgICBpZiAocHRnLmdldENsYXNzKCkgPT0gQXJlYTNEUHRnLmNsYXNzKXsKLSAgICAgICAgICAgIHJlc3VsdCA9IHB0Zy50b0Zvcm11bGFTdHJpbmcocmVmcyk7CisgICAgICAgICAgICByZXN1bHQgPSBwdGcudG9Gb3JtdWxhU3RyaW5nKGJvb2spOwogCiAgICAgICAgIH0gZWxzZSBpZiAocHRnLmdldENsYXNzKCkgPT0gUmVmM0RQdGcuY2xhc3MpewotICAgICAgICAgICAgcmVzdWx0ID0gcHRnLnRvRm9ybXVsYVN0cmluZyhyZWZzKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHB0Zy50b0Zvcm11bGFTdHJpbmcoYm9vayk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNzI3LDcgKzc4MCw3IEBACiAKICAgICAgICAgLyoKICAgICAgICAgdGVtcDogZ2pzCi0gICAgICAgIGlmICggKCBmaWVsZF8xX29wdGlvbl9mbGFnICYgKHNob3J0KTB4MjAgKSAhPSAwICkgeworICAgICAgICBpZiAoaXNCdWlsdEluTmFtZSgpKSB7CiAgICAgICAgICAgICAvLyBERUJVRwogICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiQnVpbHQtaW4gbmFtZSIgKTsKIApAQCAtNzk0LDYgKzg0Nyw4IEBACiAgICAgICAgICAgICAgICAgcG9zICs9IHB0Zy5nZXRTaXplKCk7CiAgICAgICAgICAgICAgICAgc2l6ZUNvdW50ZXIgKz0gcHRnLmdldFNpemUoKTsKICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHB0Zyk7CisgICAgICAgICAgICAgICAgZmllbGRfMTNfcmF3X25hbWVfZGVmaW5pdGlvbj1uZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsb2Zmc2V0LGZpZWxkXzEzX3Jhd19uYW1lX2RlZmluaXRpb24sMCxzaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbV0FSTklOR10gVW5rbm93biBQdGcgIgpAQCAtODgwLDcgKzkzNSw3IEBACiAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwogICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLnVudXNlZCAgICAgICAgICAgICAgICAgICA9ICIpLmFwcGVuZCggZmllbGRfNV9pbmRleF90b19zaGVldCApCiAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLiggMCA9IEdsb2JhbCBuYW1lLCBvdGhlcndpc2UgaW5kZXggdG8gc2hlZXQgKG9uZS1iYXNlZCkgKSA9ICIpLmFwcGVuZCggZmllbGRfNl9lcXVhbHNfdG9faW5kZXhfdG9fc2hlZXQgKQorICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLmluZGV4IHRvIHNoZWV0ICgxLWJhc2VkLCAwPUdsb2JhbCkgICAgICAgICAgID0gIikuYXBwZW5kKCBmaWVsZF82X2VxdWFsc190b19pbmRleF90b19zaGVldCApCiAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwogICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLkxlbmd0aCBvZiBtZW51IHRleHQgKGNoYXJhY3RlciBjb3VudCkgICAgICAgID0gIikuYXBwZW5kKCBmaWVsZF83X2xlbmd0aF9jdXN0b21fbWVudSApCiAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwpAQCAtOTA2LDYgKzk2MSw3IEBACiAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwogICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLlN0YXR1cyBiYXIgdGV4dCAoVW5pY29kZSBzdHJpbmcgd2l0aG91dCBsZW5ndGggZmllbGQpICA9ICIpLmFwcGVuZCggZmllbGRfMTdfc3RhdHVzX2Jhcl90ZXh0ICkKICAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQob3JnLmFwYWNoZS5wb2kudXRpbC5IZXhEdW1wLmR1bXAodGhpcy5maWVsZF8xM19yYXdfbmFtZV9kZWZpbml0aW9uLDAsMCkpOwogICAgICAgICBidWZmZXIuYXBwZW5kKCJbL05BTUVdXG4iKTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Bhc3N3b3JkUmVjb3JkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9QYXNzd29yZFJlY29yZC5qYXZhCmluZGV4IDlmZWI2YTIuLmJhOWNiZmMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Bhc3N3b3JkUmVjb3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvUGFzc3dvcmRSZWNvcmQuamF2YQpAQCAtMTY2LDQgKzE2NiwxNCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHRoaXMuc2lkOwogICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25lIHRoaXMgcmVjb3JkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICBQYXNzd29yZFJlY29yZCBjbG9uZSA9IG5ldyBQYXNzd29yZFJlY29yZCgpOworICAgICAgY2xvbmUuc2V0UGFzc3dvcmQoZmllbGRfMV9wYXNzd29yZCk7CisgICAgICByZXR1cm4gY2xvbmU7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Qcm90ZWN0UmVjb3JkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Qcm90ZWN0UmVjb3JkLmphdmEKaW5kZXggNjY5NzhmOS4uYTYzMzc1NiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvUHJvdGVjdFJlY29yZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Byb3RlY3RSZWNvcmQuamF2YQpAQCAtMTM5LDkgKzEzOSw5IEBACiAgICAgICogQHJldHVybiB3aGV0aGVyIHRvIHByb3RlY3QgdGhlIHNoZWV0IG9yIG5vdAogICAgICAqLwogCi0gICAgcHVibGljIHNob3J0IGdldFByb3RlY3QoKQorICAgIHB1YmxpYyBib29sZWFuIGdldFByb3RlY3QoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkXzFfcHJvdGVjdDsKKyAgICAgICAgcmV0dXJuIChmaWVsZF8xX3Byb3RlY3QgPT0gMSk7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCkBAIC0xNDksOCArMTQ5LDggQEAKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAogICAgICAgICBidWZmZXIuYXBwZW5kKCJbUFJPVEVDVF1cbiIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgLnByb3RlY3RlZCAgICAgID0gIikKLSAgICAgICAgICAgIC5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhnZXRQcm90ZWN0KCkpKS5hcHBlbmQoIlxuIik7CisJICAgIGJ1ZmZlci5hcHBlbmQoIiAgICAucHJvdGVjdCAgICAgICAgID0gIikuYXBwZW5kKGdldFByb3RlY3QoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CiAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlsvUFJPVEVDVF1cbiIpOwogICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgICAgfQpAQCAtMTYwLDcgKzE2MCw3IEBACiAgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCAwICsgb2Zmc2V0LCBzaWQpOwogICAgICAgICBMaXR0bGVFbmRpYW4ucHV0U2hvcnQoZGF0YSwgMiArIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoIHNob3J0ICkgMHgwMikpOyAgIC8vIDIgYnl0ZXMgKDYgdG90YWwpCi0gICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCA0ICsgb2Zmc2V0LCBnZXRQcm90ZWN0KCkpOworICAgICAgICBMaXR0bGVFbmRpYW4ucHV0U2hvcnQoZGF0YSwgNCArIG9mZnNldCwgZmllbGRfMV9wcm90ZWN0KTsKICAgICAgICAgcmV0dXJuIGdldFJlY29yZFNpemUoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Byb3RlY3Rpb25SZXY0UmVjb3JkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Qcm90ZWN0aW9uUmV2NFJlY29yZC5qYXZhCmluZGV4IGUzODVhNGEuLmJlNjQ5MzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Byb3RlY3Rpb25SZXY0UmVjb3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvUHJvdGVjdGlvblJldjRSZWNvcmQuamF2YQpAQCAtMTM5LDE4ICsxMzksMTggQEAKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdG8gcHJvdGVjdCB0aGUgd29ya2Jvb2sgb3Igbm90CiAgICAgICovCiAKLSAgICBwdWJsaWMgc2hvcnQgZ2V0UHJvdGVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmllbGRfMV9wcm90ZWN0OwotICAgIH0KKwlwdWJsaWMgYm9vbGVhbiBnZXRQcm90ZWN0KCkKKwl7CisJCXJldHVybiAoZmllbGRfMV9wcm90ZWN0ID09IDEpOworCX0KIAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAogICAgICAgICBidWZmZXIuYXBwZW5kKCJbUFJPVDRSRVZdXG4iKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgIC5yb3doZWlnaHQgICAgICA9ICIpCi0gICAgICAgICAgICAuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoZ2V0UHJvdGVjdCgpKSkuYXBwZW5kKCJcbiIpOworCSAgICBidWZmZXIuYXBwZW5kKCIgICAgLnByb3RlY3QgICAgICAgICA9ICIpLmFwcGVuZChnZXRQcm90ZWN0KCkpCisgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOwogICAgICAgICBidWZmZXIuYXBwZW5kKCJbL1BST1Q0UkVWXVxuIik7CiAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgICB9CkBAIC0xNjAsNyArMTYwLDcgQEAKICAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDAgKyBvZmZzZXQsIHNpZCk7CiAgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCAyICsgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCggc2hvcnQgKSAweDAyKSk7ICAgLy8gMiBieXRlcyAoNiB0b3RhbCkKLSAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDQgKyBvZmZzZXQsIGdldFByb3RlY3QoKSk7CisgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCA0ICsgb2Zmc2V0LCBmaWVsZF8xX3Byb3RlY3QpOwogICAgICAgICByZXR1cm4gZ2V0UmVjb3JkU2l6ZSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvUmVjb3JkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9SZWNvcmQuamF2YQppbmRleCA3NzgzMDI2Li5iZDRlNzM3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9SZWNvcmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9SZWNvcmQuamF2YQpAQCAtNzEsMTYgKzcxLDYgQEAKIHsKIAogICAgIC8qKgotICAgICAqIFRoZSBzdGF0aWMgSUQsIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdmFsdWUgd2l0aCB0aGUgaWQgZm9yIHRoZQotICAgICAqIHJlY29yZCB0eXBlIHRoZXkgaGFuZGxlLgotICAgICAqLwotCi0gICAgcHVibGljIHNob3J0ICAgc2lkICA9IDA7Ci0gICAgcHJpdmF0ZSBzaG9ydCAgaWQgICA9IDA7Ci0gICAgcHJpdmF0ZSBzaG9ydCAgc2l6ZSA9IDA7Ci0gICAgcHJpdmF0ZSBieXRlW10gZGF0YSA9IG51bGw7Ci0KLSAgICAvKioKICAgICAgKiBpbnN0YW50aWF0ZXMgYSBibGFuayByZWNvcmQgc3RyaWN0bHkgZm9yIElEIG1hdGNoaW5nCiAgICAgICovCiAKQEAgLTk4LDkgKzg4LDYgQEAKIAogICAgIHB1YmxpYyBSZWNvcmQoc2hvcnQgaWQsIHNob3J0IHNpemUsIGJ5dGUgW10gZGF0YSkKICAgICB7Ci0gICAgICAgIHRoaXMuaWQgICA9IGlkOwotICAgICAgICB0aGlzLnNpemUgPSBzaXplOwotICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgICB2YWxpZGF0ZVNpZChpZCk7CiAgICAgICAgIGZpbGxGaWVsZHMoZGF0YSwgc2l6ZSk7CiAgICAgfQpAQCAtMTE1LDkgKzEwMiw2IEBACiAKICAgICBwdWJsaWMgUmVjb3JkKHNob3J0IGlkLCBzaG9ydCBzaXplLCBieXRlIFtdIGRhdGEsIGludCBvZmZzZXQpCiAgICAgewotICAgICAgICB0aGlzLmlkICAgPSBpZDsKLSAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKLSAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKICAgICAgICAgdmFsaWRhdGVTaWQoaWQpOwogICAgICAgICBmaWxsRmllbGRzKGRhdGEsIHNpemUsIG9mZnNldCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvUmVjb3JkUHJvY2Vzc29yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9SZWNvcmRQcm9jZXNzb3IuamF2YQppbmRleCBjOGQ2NTljLi5iYTg2ZjY3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9SZWNvcmRQcm9jZXNzb3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9SZWNvcmRQcm9jZXNzb3IuamF2YQpAQCAtMTU2LDUgKzE1NiwxMCBAQAogICAgICAgICByZWNvcmRPZmZzZXQgKz0gYW1vdW50OwogICAgICAgICBhdmFpbGFibGUgLT0gYW1vdW50OwogICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVjb3JkT2Zmc2V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiByZWNvcmRPZmZzZXQ7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9TU1REZXNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1NTVERlc2VyaWFsaXplci5qYXZhCmluZGV4IGRjZjRlNTAuLjQwZmQ0YjAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1NTVERlc2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1NTVERlc2VyaWFsaXplci5qYXZhCkBAIC02MiwxMyArNjIsMTQgQEAKICAqIEhhbmRsZXMgdGhlIHRhc2sgb2YgZGVzZXJpYWxpemluZyBhIFNTVCBzdHJpbmcuICBUaGUgdHdvIG1haW4gZW50cnkgcG9pbnRzIGFyZQogICoKICAqIEBhdXRob3IgR2xlbiBTdGFtcG91bHR6aXMgKGdsZW5zIGF0IGFwYWNoZS5vcmcpCisgKiBAYXV0aG9yIEphc29uIEhlaWdodCAoamhlaWdodCBhdCBhcGFjaGUub3JnKQogICovCiBjbGFzcyBTU1REZXNlcmlhbGl6ZXIKIHsKIAogICAgIHByaXZhdGUgQmluYXJ5VHJlZSBzdHJpbmdzOwotICAgIC8qKiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3ZSBleHBlY3QgaW4gdGhlIGZpcnN0IHN1Yi1yZWNvcmQgaW4gYSBzdWJzZXF1ZW50IGNvbnRpbnVhdGlvbiByZWNvcmQgKi8KLSAgICBwcml2YXRlIGludCBjb250aW51YXRpb25FeHBlY3RlZENoYXJzOworICAgIC8qKiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGhhdmUgYmVlbiByZWFkIHByaW9yIHRvIHRoZSBjb250aW51YXRpb24gKi8KKyAgICBwcml2YXRlIGludCBjb250aW51YXRpb25SZWFkQ2hhcnM7CiAgICAgLyoqIHRoaXMgaXMgdGhlIHN0cmluZyB3ZSB3ZXJlIHdvcmtpbmcgb24gYmVmb3JlIGhpdHRpbmcgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZWNvcmQuIFRoaXMgc3RyaW5nIGlzIE5PVCBmaW5pc2hlZC4gKi8KICAgICBwcml2YXRlIFN0cmluZyB1bmZpbmlzaGVkU3RyaW5nOwogICAgIC8qKiB0aGlzIGlzIHRydWUgaWYgdGhlIHN0cmluZyB1c2VzIHdpZGUgY2hhcmFjdGVycyAqLwpAQCAtODIsNiArODMsNyBAQAogICAgIC8qKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBjdXJyZW50IHN0cmluZyAqLwogICAgIHByaXZhdGUgaW50IGNoYXJDb3VudDsKICAgICBwcml2YXRlIGludCBleHRlbnNpb25MZW5ndGg7CisgICAgcHJpdmF0ZSBpbnQgY29udGludWVTa2lwQnl0ZXMgPSAwOwogCiAKICAgICBwdWJsaWMgU1NURGVzZXJpYWxpemVyKCBCaW5hcnlUcmVlIHN0cmluZ3MgKQpAQCAtOTMsMTMgKzk1LDE0IEBACiAgICAgcHJpdmF0ZSB2b2lkIGluaXRWYXJzKCkKICAgICB7CiAgICAgICAgIHJ1bkNvdW50ID0gMDsKLSAgICAgICAgY29udGludWF0aW9uRXhwZWN0ZWRDaGFycyA9IDA7CisgICAgICAgIGNvbnRpbnVhdGlvblJlYWRDaGFycyA9IDA7CiAgICAgICAgIHVuZmluaXNoZWRTdHJpbmcgPSAiIjsKIC8vICAgICAgICBieXRlc0luQ3VycmVudFNlZ21lbnQgPSAwOwogLy8gICAgICAgIHN0cmluZ0RhdGFPZmZzZXQgPSAwOwogICAgICAgICB3aWRlQ2hhciA9IGZhbHNlOwogICAgICAgICByaWNoVGV4dCA9IGZhbHNlOwogICAgICAgICBleHRlbmRlZFRleHQgPSBmYWxzZTsKKyAgICAgICAgY29udGludWVTa2lwQnl0ZXMgPSAwOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA3LDE0ICsxMTAsMTUgQEAKICAgICAgKiBzdHJpbmdzIG1heSBzcGFuIGFjcm9zcyBtdWx0aXBsZSBjb250aW51YXRpb25zLiBSZWFkIHRoZSBTU1QgcmVjb3JkCiAgICAgICogY2FyZWZ1bGx5IGJlZm9yZSBiZWdpbm5pbmcgdG8gaGFjay4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYW51ZmFjdHVyZVN0cmluZ3MoIGZpbmFsIGJ5dGVbXSBkYXRhLCBmaW5hbCBpbnQgaW5pdGlhbE9mZnNldCwgc2hvcnQgZGF0YVNpemUgKQorICAgIHB1YmxpYyB2b2lkIG1hbnVmYWN0dXJlU3RyaW5ncyggZmluYWwgYnl0ZVtdIGRhdGEsIGZpbmFsIGludCBpbml0aWFsT2Zmc2V0KQogICAgIHsKICAgICAgICAgaW5pdFZhcnMoKTsKIAogICAgICAgICBpbnQgb2Zmc2V0ID0gaW5pdGlhbE9mZnNldDsKLSAgICAgICAgd2hpbGUgKCAoIG9mZnNldCAtIGluaXRpYWxPZmZzZXQgKSA8IGRhdGFTaXplICkKKyAgICAgICAgZmluYWwgaW50IGRhdGFTaXplID0gZGF0YS5sZW5ndGg7CisgICAgICAgIHdoaWxlICggb2Zmc2V0IDwgZGF0YVNpemUgKQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gZGF0YVNpemUgLSBvZmZzZXQgKyBpbml0aWFsT2Zmc2V0OworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGRhdGFTaXplIC0gb2Zmc2V0OwogCiAgICAgICAgICAgICBpZiAoICggcmVtYWluaW5nID4gMCApICYmICggcmVtYWluaW5nIDwgTGl0dGxlRW5kaWFuQ29uc3RzLlNIT1JUX1NJWkUgKSApCiAgICAgICAgICAgICB7CkBAIC0xMjIsMjYgKzEyNiwzMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCByZW1haW5pbmcgPT0gTGl0dGxlRW5kaWFuQ29uc3RzLlNIT1JUX1NJWkUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoIExpdHRsZUVuZGlhbi5nZXRVU2hvcnQoIGRhdGEsIG9mZnNldCApICk7CisgICAgICAgICAgICAgIC8vSk1IIERvbnQga25vdyBhYm91dCB0aGlzCisgICAgICAgICAgICAgICAgc2V0Q29udGludWF0aW9uQ2hhcnNSZWFkKCAwICk7Ly9MaXR0bGVFbmRpYW4uZ2V0VVNob3J0KCBkYXRhLCBvZmZzZXQgKSApOwogICAgICAgICAgICAgICAgIHVuZmluaXNoZWRTdHJpbmcgPSAiIjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNoYXJDb3VudCA9IExpdHRsZUVuZGlhbi5nZXRVU2hvcnQoIGRhdGEsIG9mZnNldCApOworICAgICAgICAgICAgaW50IGNoYXJzUmVhZCA9IGNoYXJDb3VudDsKICAgICAgICAgICAgIHJlYWRTdHJpbmdIZWFkZXIoIGRhdGEsIG9mZnNldCApOwogICAgICAgICAgICAgYm9vbGVhbiBzdHJpbmdDb250aW51ZXNPdmVyQ29udGludWF0aW9uID0gcmVtYWluaW5nIDwgdG90YWxTdHJpbmdTaXplKCk7CiAgICAgICAgICAgICBpZiAoIHN0cmluZ0NvbnRpbnVlc092ZXJDb250aW51YXRpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdCeXRlcyA9ICggaW5pdGlhbE9mZnNldCArIGRhdGFTaXplICkgLSBvZmZzZXQgLSBzdHJpbmdIZWFkZXJPdmVyaGVhZCgpOwotICAgICAgICAgICAgICAgIHNldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoIGNoYXJDb3VudCAtIGNhbGN1bGF0ZUNoYXJDb3VudCggcmVtYWluaW5nQnl0ZXMgKSApOwotICAgICAgICAgICAgICAgIGNoYXJDb3VudCAtPSBnZXRDb250aW51YXRpb25FeHBlY3RlZENoYXJzKCk7CisgICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ0J5dGVzID0gZGF0YVNpemUgLSBvZmZzZXQgLSBzdHJpbmdIZWFkZXJPdmVyaGVhZCgpOworICAgICAgICAgICAgICAgIC8vT25seSByZWFkIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgb3Igd2hhdGV2ZXIgaXMgbGVmdCBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgLy9jb250aW51YXRpb24KKyAgICAgICAgICAgICAgICBjaGFyc1JlYWQgPSBNYXRoLm1pbihjaGFyc1JlYWQsIGNhbGN1bGF0ZUNoYXJDb3VudCggcmVtYWluaW5nQnl0ZXMgKSk7CisgICAgICAgICAgICAgICAgc2V0Q29udGludWF0aW9uQ2hhcnNSZWFkKCBjaGFyc1JlYWQgKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGNoYXJzUmVhZCA9PSBjaGFyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgIC8vU2luY2UgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIHdpbGwgaGF2ZSBiZWVuIHJlYWQsIGJ1dCB0aGUgZW50aXJlIHN0cmluZyAoaW5jbHVkaW5nIGZvcm1hdHRpbmcgcnVucyBldGMpCisgICAgICAgICAgICAgICAgICAvL2hhc250LCBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCB3aGVuIHRoZSBjb250aW51ZSByZWNvcmQgc3RhcnRzCisgICAgICAgICAgICAgICAgICBjb250aW51ZVNraXBCeXRlcyA9IG9mZnNldEZvckNvbnRpbnVlZFJlY29yZCgwKSAtIChyZW1haW5pbmdCeXRlcyAtIGNhbGN1bGF0ZUJ5dGVDb3VudChjaGFyc1JlYWQpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0Q29udGludWF0aW9uRXhwZWN0ZWRDaGFycyggMCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvY2Vzc1N0cmluZyggZGF0YSwgb2Zmc2V0LCBjaGFyQ291bnQgKTsKKyAgICAgICAgICAgIHByb2Nlc3NTdHJpbmcoIGRhdGEsIG9mZnNldCwgY2hhcnNSZWFkICk7CiAgICAgICAgICAgICBvZmZzZXQgKz0gdG90YWxTdHJpbmdTaXplKCk7Ci0gICAgICAgICAgICBpZiAoIGdldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoKSAhPSAwICkKKyAgICAgICAgICAgIGlmICggc3RyaW5nQ29udGludWVzT3ZlckNvbnRpbnVhdGlvbiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yMjIsNiArMjMxLDcgQEAKICAgICAgICAgVW5pY29kZVN0cmluZyBzdHJpbmcgPSBuZXcgVW5pY29kZVN0cmluZyggVW5pY29kZVN0cmluZy5zaWQsCiAgICAgICAgICAgICAgICAgKHNob3J0KSB1bmljb2RlU3RyaW5nQnVmZmVyLmxlbmd0aCwKICAgICAgICAgICAgICAgICB1bmljb2RlU3RyaW5nQnVmZmVyICk7CisgICAgICAgIHNldENvbnRpbnVhdGlvbkNoYXJzUmVhZCggY2FsY3VsYXRlQ2hhckNvdW50KGJ5dGVzUmVhZCkpOwogCiAgICAgICAgIGlmICggaXNTdHJpbmdGaW5pc2hlZCgpICkKICAgICAgICAgewpAQCAtMjM4LDcgKzI0OCw3IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNTdHJpbmdGaW5pc2hlZCgpCiAgICAgewotICAgICAgICByZXR1cm4gZ2V0Q29udGludWF0aW9uRXhwZWN0ZWRDaGFycygpID09IDA7CisgICAgICAgIHJldHVybiBnZXRDb250aW51YXRpb25DaGFyc1JlYWQoKSA9PSBjaGFyQ291bnQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDEsOCArMzExLDkgQEAKICAgICB7CiAgICAgICAgIGlmICggaXNTdHJpbmdGaW5pc2hlZCgpICkKICAgICAgICAgeworICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCA9IGNvbnRpbnVlU2tpcEJ5dGVzOwogICAgICAgICAgICAgaW5pdFZhcnMoKTsKLSAgICAgICAgICAgIG1hbnVmYWN0dXJlU3RyaW5ncyggcmVjb3JkLCAwLCAoc2hvcnQpIHJlY29yZC5sZW5ndGggKTsKKyAgICAgICAgICAgIG1hbnVmYWN0dXJlU3RyaW5ncyggcmVjb3JkLCBvZmZzZXQpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMzMwLDEzICszNDEsMTIgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVhZFN0cmluZ1JlbWFpbmRlciggZmluYWwgYnl0ZVtdIHJlY29yZCApCiAgICAgewotICAgICAgICBpbnQgc3RyaW5nUmVtYWluZGVyU2l6ZUluQnl0ZXMgPSBjYWxjdWxhdGVCeXRlQ291bnQoIGdldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoKSApOwotLy8gICAgICAgIHN0cmluZ0RhdGFPZmZzZXQgPSBMaXR0bGVFbmRpYW5Db25zdHMuQllURV9TSVpFOworICAgICAgICBpbnQgc3RyaW5nUmVtYWluZGVyU2l6ZUluQnl0ZXMgPSBjYWxjdWxhdGVCeXRlQ291bnQoIGNoYXJDb3VudC1nZXRDb250aW51YXRpb25DaGFyc1JlYWQoKSApOwogICAgICAgICBieXRlW10gdW5pY29kZVN0cmluZ0RhdGEgPSBuZXcgYnl0ZVtTU1RSZWNvcmQuU1RSSU5HX01JTklNQUxfT1ZFUkhFQUQKLSAgICAgICAgICAgICAgICArIGNhbGN1bGF0ZUJ5dGVDb3VudCggZ2V0Q29udGludWF0aW9uRXhwZWN0ZWRDaGFycygpICldOworICAgICAgICAgICAgICAgICsgc3RyaW5nUmVtYWluZGVyU2l6ZUluQnl0ZXNdOwogCiAgICAgICAgIC8vIHdyaXRlIHRoZSBzdHJpbmcgbGVuZ3RoCi0gICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydCggdW5pY29kZVN0cmluZ0RhdGEsIDAsIChzaG9ydCkgZ2V0Q29udGludWF0aW9uRXhwZWN0ZWRDaGFycygpICk7CisgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydCggdW5pY29kZVN0cmluZ0RhdGEsIDAsIChzaG9ydCkgKGNoYXJDb3VudC1nZXRDb250aW51YXRpb25DaGFyc1JlYWQoKSkgKTsKIAogICAgICAgICAvLyB3cml0ZSB0aGUgb3B0aW9ucyBmbGFnCiAgICAgICAgIHVuaWNvZGVTdHJpbmdEYXRhW0xpdHRsZUVuZGlhbkNvbnN0cy5TSE9SVF9TSVpFXSA9IGNyZWF0ZU9wdGlvbkJ5dGUoIHdpZGVDaGFyLCByaWNoVGV4dCwgZXh0ZW5kZWRUZXh0ICk7CkBAIC0zNDUsNyArMzU1LDcgQEAKICAgICAgICAgLy8gcGFzdCBhbGwgdGhlIG92ZXJoZWFkIG9mIHRoZSBzdHJfZGF0YSBhcnJheQogICAgICAgICBhcnJheWNvcHkoIHJlY29yZCwgTGl0dGxlRW5kaWFuQ29uc3RzLkJZVEVfU0laRSwgdW5pY29kZVN0cmluZ0RhdGEsCiAgICAgICAgICAgICAgICAgU1NUUmVjb3JkLlNUUklOR19NSU5JTUFMX09WRVJIRUFELAotICAgICAgICAgICAgICAgIHVuaWNvZGVTdHJpbmdEYXRhLmxlbmd0aCAtIFNTVFJlY29yZC5TVFJJTkdfTUlOSU1BTF9PVkVSSEVBRCApOworICAgICAgICAgICAgICAgIHN0cmluZ1JlbWFpbmRlclNpemVJbkJ5dGVzICk7CiAKICAgICAgICAgLy8gdXNlIHNwZWNpYWwgY29uc3RydWN0b3IgdG8gY3JlYXRlIHRoZSBmaW5hbCBzdHJpbmcKICAgICAgICAgVW5pY29kZVN0cmluZyBzdHJpbmcgPSBuZXcgVW5pY29kZVN0cmluZyggVW5pY29kZVN0cmluZy5zaWQsCkBAIC0zNTYsNyArMzY2LDcgQEAKICAgICAgICAgYWRkVG9TdHJpbmdUYWJsZSggc3RyaW5ncywgaW50ZWdlciwgc3RyaW5nICk7CiAKICAgICAgICAgaW50IG5ld09mZnNldCA9IG9mZnNldEZvckNvbnRpbnVlZFJlY29yZCggc3RyaW5nUmVtYWluZGVyU2l6ZUluQnl0ZXMgKTsKLSAgICAgICAgbWFudWZhY3R1cmVTdHJpbmdzKCByZWNvcmQsIG5ld09mZnNldCwgKHNob3J0KSAoIHJlY29yZC5sZW5ndGggLSBuZXdPZmZzZXQgKSApOworICAgICAgICBtYW51ZmFjdHVyZVN0cmluZ3MoIHJlY29yZCwgbmV3T2Zmc2V0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTM4OCw4ICszOTgsMTIgQEAKIAogICAgIHByaXZhdGUgaW50IG9mZnNldEZvckNvbnRpbnVlZFJlY29yZCggaW50IHN0cmluZ1JlbWFpbmRlclNpemVJbkJ5dGVzICkKICAgICB7Ci0gICAgICAgIHJldHVybiBzdHJpbmdSZW1haW5kZXJTaXplSW5CeXRlcyArIExpdHRsZUVuZGlhbkNvbnN0cy5CWVRFX1NJWkUKLSAgICAgICAgICAgICAgICArIHJ1bkNvdW50ICogTGl0dGxlRW5kaWFuQ29uc3RzLklOVF9TSVpFICsgZXh0ZW5zaW9uTGVuZ3RoOworICAgICAgICBpbnQgb2Zmc2V0ID0gc3RyaW5nUmVtYWluZGVyU2l6ZUluQnl0ZXMgKyBydW5Db3VudCAqIExpdHRsZUVuZGlhbkNvbnN0cy5JTlRfU0laRSArIGV4dGVuc2lvbkxlbmd0aDsgICAgICAgIAorICAgICAgICBpZiAoc3RyaW5nUmVtYWluZGVyU2l6ZUluQnl0ZXMgIT0gMCkKKyAgICAgICAgICAvL0lmIGEgcG9ydGlvbiBvZiB0aGUgc3RyaW5nIHJlbWFpbnMgdGhlbiB0aGUgd2lkZUNoYXIgb3B0aW9ucyBieXRlIGlzIHJlcGVhdGVkLAorICAgICAgICAgIC8vc28gbmVlZCB0byBza2lwIHRoaXMuCisgICAgICAgICAgb2Zmc2V0ICs9ICsgTGl0dGxlRW5kaWFuQ29uc3RzLkJZVEVfU0laRTsKKyAgICAgICAgcmV0dXJuIG9mZnNldDsgIAogICAgIH0KIAogICAgIHByaXZhdGUgYnl0ZSBjcmVhdGVPcHRpb25CeXRlKCBib29sZWFuIHdpZGVDaGFyLCBib29sZWFuIHJpY2hUZXh0LCBib29sZWFuIGZhckVhc3QgKQpAQCAtNDA5LDE3ICs0MjMsMjIgQEAKICAgICAgICAgaW50IGRhdGFMZW5ndGhJbkJ5dGVzID0gcmVjb3JkLmxlbmd0aCAtIExpdHRsZUVuZGlhbkNvbnN0cy5CWVRFX1NJWkU7CiAgICAgICAgIGJ5dGVbXSB1bmljb2RlU3RyaW5nRGF0YSA9IG5ldyBieXRlW3JlY29yZC5sZW5ndGggKyBMaXR0bGVFbmRpYW5Db25zdHMuU0hPUlRfU0laRV07CiAKLSAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KCB1bmljb2RlU3RyaW5nRGF0YSwgKGJ5dGUpIDAsIChzaG9ydCkgY2FsY3VsYXRlQ2hhckNvdW50KCBkYXRhTGVuZ3RoSW5CeXRlcyApICk7CisgICAgICAgIGludCBjaGFyc1JlYWQgPSBjYWxjdWxhdGVDaGFyQ291bnQoIGRhdGFMZW5ndGhJbkJ5dGVzICk7CisgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydCggdW5pY29kZVN0cmluZ0RhdGEsIChieXRlKSAwLCAoc2hvcnQpIGNoYXJzUmVhZCApOwogICAgICAgICBhcnJheWNvcHkoIHJlY29yZCwgMCwgdW5pY29kZVN0cmluZ0RhdGEsIExpdHRsZUVuZGlhbkNvbnN0cy5TSE9SVF9TSVpFLCByZWNvcmQubGVuZ3RoICk7Ci0gICAgICAgIFVuaWNvZGVTdHJpbmcgdWNzID0gbmV3IFVuaWNvZGVTdHJpbmcoIFVuaWNvZGVTdHJpbmcuc2lkLCAoc2hvcnQpIHVuaWNvZGVTdHJpbmdEYXRhLmxlbmd0aCwgdW5pY29kZVN0cmluZ0RhdGEgKTsKKyAgICAgICAgVW5pY29kZVN0cmluZyB1Y3MgPSBuZXcgVW5pY29kZVN0cmluZyggVW5pY29kZVN0cmluZy5zaWQsIChzaG9ydCkgdW5pY29kZVN0cmluZ0RhdGEubGVuZ3RoLCB1bmljb2RlU3RyaW5nRGF0YSwgdW5maW5pc2hlZFN0cmluZyk7CiAKLSAgICAgICAgdW5maW5pc2hlZFN0cmluZyA9IHVuZmluaXNoZWRTdHJpbmcgKyB1Y3MuZ2V0U3RyaW5nKCk7Ci0gICAgICAgIHNldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoIGdldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoKSAtIGNhbGN1bGF0ZUNoYXJDb3VudCggZGF0YUxlbmd0aEluQnl0ZXMgKSApOworICAgICAgICB1bmZpbmlzaGVkU3RyaW5nID0gdWNzLmdldFN0cmluZygpOworICAgICAgICBzZXRDb250aW51YXRpb25DaGFyc1JlYWQoIGdldENvbnRpbnVhdGlvbkNoYXJzUmVhZCgpICsgY2hhcnNSZWFkICk7CisgICAgICAgIGlmIChnZXRDb250aW51YXRpb25DaGFyc1JlYWQoKSA9PSBjaGFyQ291bnQpIHsKKyAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSBuZXcgSW50ZWdlciggc3RyaW5ncy5zaXplKCkgKTsKKyAgICAgICAgICBhZGRUb1N0cmluZ1RhYmxlKCBzdHJpbmdzLCBpbnRlZ2VyLCB1Y3MgKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpbmdTcGFuc0NvbnRpbnVhdGlvbiggaW50IGNvbnRpbnVhdGlvblNpemVJbkJ5dGVzICkKICAgICB7Ci0gICAgICAgIHJldHVybiBjYWxjdWxhdGVCeXRlQ291bnQoIGdldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoKSApID4gY29udGludWF0aW9uU2l6ZUluQnl0ZXM7CisgICAgICAgIHJldHVybiBjYWxjdWxhdGVCeXRlQ291bnQoIGNoYXJDb3VudCAtIGdldENvbnRpbnVhdGlvbkNoYXJzUmVhZCgpICkgPiBjb250aW51YXRpb25TaXplSW5CeXRlczsKICAgICB9CiAKICAgICAvKioKQEAgLTQyNywxNCArNDQ2LDE0IEBACiAgICAgICogICAgICAgICBzdWItcmVjb3JkIGluIGEgc3Vic2VxdWVudCBjb250aW51YXRpb24gcmVjb3JkCiAgICAgICovCiAKLSAgICBpbnQgZ2V0Q29udGludWF0aW9uRXhwZWN0ZWRDaGFycygpCisgICAgaW50IGdldENvbnRpbnVhdGlvbkNoYXJzUmVhZCgpCiAgICAgewotICAgICAgICByZXR1cm4gY29udGludWF0aW9uRXhwZWN0ZWRDaGFyczsKKyAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJlYWRDaGFyczsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0Q29udGludWF0aW9uRXhwZWN0ZWRDaGFycyggZmluYWwgaW50IGNvdW50ICkKKyAgICBwcml2YXRlIHZvaWQgc2V0Q29udGludWF0aW9uQ2hhcnNSZWFkKCBmaW5hbCBpbnQgY291bnQgKQogICAgIHsKLSAgICAgICAgY29udGludWF0aW9uRXhwZWN0ZWRDaGFycyA9IGNvdW50OworICAgICAgICBjb250aW51YXRpb25SZWFkQ2hhcnMgPSBjb3VudDsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBjYWxjdWxhdGVCeXRlQ291bnQoIGZpbmFsIGludCBjaGFyYWN0ZXJfY291bnQgKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU1NUUmVjb3JkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9TU1RSZWNvcmQuamF2YQppbmRleCBhM2YwODA3Li43ZjcwM2U3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9TU1RSZWNvcmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9TU1RSZWNvcmQuamF2YQpAQCAtNjAsNyArNjAsNiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgogICogVGl0bGU6ICAgICAgICBTdGF0aWMgU3RyaW5nIFRhYmxlIFJlY29yZApAQCAtNzMsNyArNzIsNyBAQAogICogQGF1dGhvciBBbmRyZXcgQy4gT2xpdmVyIChhY29saXZlciBhdCBhcGFjaGUgZG90IG9yZykKICAqIEBhdXRob3IgTWFyYyBKb2huc29uIChtam9obnNvbiBhdCBhcGFjaGUgZG90IG9yZykKICAqIEBhdXRob3IgR2xlbiBTdGFtcG91bHR6aXMgKGdsZW5zIGF0IGFwYWNoZS5vcmcpCi0gKiBAdmVyc2lvbiAyLjAtcHJlCisgKgogICogQHNlZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5MYWJlbFNTVFJlY29yZAogICogQHNlZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5Db250aW51ZVJlY29yZAogICovCkBAIC0xMTIsMTAgKzExMSwxNCBAQAogICAgIHByaXZhdGUgTGlzdCBfcmVjb3JkX2xlbmd0aHMgPSBudWxsOwogICAgIHByaXZhdGUgU1NURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplcjsKIAorICAgIC8qKiBPZmZzZXRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgU1NUIHJlY29yZCAoZXZlbiBhY3Jvc3MgY29udGludWF0aW9ucykgKi8KKyAgICBpbnRbXSBidWNrZXRBYnNvbHV0ZU9mZnNldHM7CisgICAgLyoqIE9mZnNldHMgcmVsYXRpdmUgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IFNTVCBvciBjb250aW51ZSByZWNvcmQgKi8KKyAgICBpbnRbXSBidWNrZXRSZWxhdGl2ZU9mZnNldHM7CisKICAgICAvKioKICAgICAgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICovCi0KICAgICBwdWJsaWMgU1NUUmVjb3JkKCkKICAgICB7CiAgICAgICAgIGZpZWxkXzFfbnVtX3N0cmluZ3MgPSAwOwpAQCAtMjIwLDcgKzIyMyw3IEBACiAgICAgICAgIGZpZWxkXzFfbnVtX3N0cmluZ3MrKzsKICAgICAgICAgU3RyaW5nIHN0ciA9ICggc3RyaW5nID09IG51bGwgKSA/ICIiCiAgICAgICAgICAgICAgICAgOiBzdHJpbmc7Ci0gICAgICAgIGludCBydmFsID0gLTE7CisgICAgICAgIGludCBydmFsOwogICAgICAgICBVbmljb2RlU3RyaW5nIHVjcyA9IG5ldyBVbmljb2RlU3RyaW5nKCk7CiAKICAgICAgICAgdWNzLnNldFN0cmluZyggc3RyICk7CkBAIC0zMzQsNyArMzM3LDcgQEAKICAgICAgICAgZm9yICggaW50IGsgPSAwOyBrIDwgZmllbGRfM19zdHJpbmdzLnNpemUoKTsgaysrICkKICAgICAgICAgewogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCggIiAgICAuc3RyaW5nXyIgKyBrICsgIiAgICAgID0gIiApCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoICggKFVuaWNvZGVTdHJpbmcpIGZpZWxkXzNfc3RyaW5ncworICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCAoIGZpZWxkXzNfc3RyaW5ncwogICAgICAgICAgICAgICAgICAgICAuZ2V0KCBuZXcgSW50ZWdlciggayApICkgKS50b1N0cmluZygpICkuYXBwZW5kKCAiXG4iICk7CiAgICAgICAgIH0KICAgICAgICAgYnVmZmVyLmFwcGVuZCggIlsvU1NUXVxuIiApOwpAQCAtMzk0LDcgKzM5Nyw3IEBACiAgICAgICogVGhlIGRhdGEgY29uc2lzdHMgb2Ygc2V0cyBvZiBzdHJpbmcgZGF0YS4gVGhpcyBzdHJpbmcgZGF0YSBpcwogICAgICAqIGFycmFuZ2VkIGFzIGZvbGxvd3M6CiAgICAgICogPFA+Ci0gICAgICogPENPREU+CisgICAgICogPENPREU+PHByZT4KICAgICAgKiBzaG9ydCAgc3RyaW5nX2xlbmd0aDsgICAvLyBsZW5ndGggb2Ygc3RyaW5nIGRhdGEKICAgICAgKiBieXRlICAgc3RyaW5nX2ZsYWc7ICAgICAvLyBmbGFnIHNwZWNpZnlpbmcgc3BlY2lhbCBzdHJpbmcKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGluZwpAQCAtNDA3LDcgKzQxMCw3IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgaXMgcnVuX2NvdW50KQogICAgICAqIGJ5dGVbXSBleHRlbnNpb247ICAgICAgIC8vIG9wdGlvbmFsIGV4dGVuc2lvbiAobGVuZ3RoIG9mIGFycmF5CiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgZXh0ZW5kX2xlbmd0aCkKLSAgICAgKiA8L0NPREU+CisgICAgICogPC9wcmU+PC9DT0RFPgogICAgICAqIDxQPgogICAgICAqIFRoZSBzdHJpbmdfZmxhZyBpcyBiaXQgbWFwcGVkIGFzIGZvbGxvd3M6CiAgICAgICogPFA+CkBAIC00NzksNyArNDgyLDcgQEAKICAgICAgICAgZmllbGRfMl9udW1fdW5pcXVlX3N0cmluZ3MgPSBMaXR0bGVFbmRpYW4uZ2V0SW50KCBkYXRhLCA0ICsgb2Zmc2V0ICk7CiAgICAgICAgIGZpZWxkXzNfc3RyaW5ncyA9IG5ldyBCaW5hcnlUcmVlKCk7CiAgICAgICAgIGRlc2VyaWFsaXplciA9IG5ldyBTU1REZXNlcmlhbGl6ZXIoZmllbGRfM19zdHJpbmdzKTsKLSAgICAgICAgZGVzZXJpYWxpemVyLm1hbnVmYWN0dXJlU3RyaW5ncyggZGF0YSwgOCArIG9mZnNldCwgKHNob3J0KShzaXplIC0gOCkgKTsKKyAgICAgICAgZGVzZXJpYWxpemVyLm1hbnVmYWN0dXJlU3RyaW5ncyggZGF0YSwgOCArIG9mZnNldCk7CiAgICAgfQogCiAKQEAgLTUwNywxNCArNTEwLDIyIEBACiAgICAgICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgc28gdGhhdCB0aGVpciBkYXRhIGlzIHBhc3NlZCBiYWNrIGluIGEKICAgICAgKiBieXRlIGFycmF5LgogICAgICAqCi0gICAgICogQHJldHVybiBieXRlIGFycmF5IGNvbnRhaW5pbmcgaW5zdGFuY2UgZGF0YQorICAgICAqIEByZXR1cm4gc2l6ZQogICAgICAqLwogCiAgICAgcHVibGljIGludCBzZXJpYWxpemUoIGludCBvZmZzZXQsIGJ5dGVbXSBkYXRhICkKICAgICB7CiAgICAgICAgIFNTVFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBTU1RTZXJpYWxpemVyKAogICAgICAgICAgICAgICAgIF9yZWNvcmRfbGVuZ3RocywgZmllbGRfM19zdHJpbmdzLCBnZXROdW1TdHJpbmdzKCksIGdldE51bVVuaXF1ZVN0cmluZ3MoKSApOwotICAgICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUoIGdldFJlY29yZFNpemUoKSwgb2Zmc2V0LCBkYXRhICk7CisgICAgICAgIGludCBieXRlcyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKCBnZXRSZWNvcmRTaXplKCksIG9mZnNldCwgZGF0YSApOworICAgICAgICBidWNrZXRBYnNvbHV0ZU9mZnNldHMgPSBzZXJpYWxpemVyLmdldEJ1Y2tldEFic29sdXRlT2Zmc2V0cygpOworICAgICAgICBidWNrZXRSZWxhdGl2ZU9mZnNldHMgPSBzZXJpYWxpemVyLmdldEJ1Y2tldFJlbGF0aXZlT2Zmc2V0cygpOworLy8gICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGJ1Y2tldEFic29sdXRlT2Zmc2V0cy5sZW5ndGg7IGkrKyApCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJidWNrZXRBYnNvbHV0ZU9mZnNldCA9ICIgKyBidWNrZXRBYnNvbHV0ZU9mZnNldHNbaV0gKTsKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYnVja2V0UmVsYXRpdmVPZmZzZXQgPSAiICsgYnVja2V0UmVsYXRpdmVPZmZzZXRzW2ldICk7CisvLyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnl0ZXM7CiAgICAgfQogCiAKQEAgLTUzOCw2ICs1NDksNDUgQEAKICAgICB7CiAgICAgICAgIGRlc2VyaWFsaXplci5wcm9jZXNzQ29udGludWVSZWNvcmQoIHJlY29yZCApOwogICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gZXh0ZW5kZWQgc3RyaW5nIHJlY29yZCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250ZW50cyBvZgorICAgICAqIHRoZSBjdXJyZW50IFNTVCByZWNvcmQuICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgc3RyZWFtIHRvIHRoZSBTU1QgcmVjb3JkCisgICAgICogaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgZXh0ZW5kZWQgc3RyaW5nIHJlY29yZCBwb2ludHMgZGlyZWN0bHkgdG8gdGhlCisgICAgICogc3RyaW5ncyBpbiB0aGUgU1NUIHJlY29yZC4KKyAgICAgKiA8cD4KKyAgICAgKiBOT1RFOiBUSElTIEZVTkNUSU9OIE1VU1QgT05MWSBCRSBDQUxMRUQgQUZURVIgVEhFIFNTVCBSRUNPUkQgSEFTIEJFRU4KKyAgICAgKiAgICAgICBTRVJJQUxJWkVELgorICAgICAqCisgICAgICogQHBhcmFtIHNzdE9mZnNldCAgICAgVGhlIG9mZnNldCBpbiB0aGUgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBTU1QgcmVjb3JkLgorICAgICAqIEByZXR1cm4gIFRoZSBuZXcgU1NUIHJlY29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0U1NUUmVjb3JkIGNyZWF0ZUV4dFNTVFJlY29yZChpbnQgc3N0T2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKGJ1Y2tldEFic29sdXRlT2Zmc2V0cyA9PSBudWxsIHx8IGJ1Y2tldEFic29sdXRlT2Zmc2V0cyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU1NUIHJlY29yZCBoYXMgbm90IHlldCBiZWVuIHNlcmlhbGl6ZWQuIik7CisKKyAgICAgICAgRXh0U1NUUmVjb3JkIGV4dFNTVCA9IG5ldyBFeHRTU1RSZWNvcmQoKTsKKyAgICAgICAgZXh0U1NULnNldE51bVN0cmluZ3NQZXJCdWNrZXQoKHNob3J0KTgpOworICAgICAgICBpbnRbXSBhYnNvbHV0ZU9mZnNldHMgPSAoaW50W10pIGJ1Y2tldEFic29sdXRlT2Zmc2V0cy5jbG9uZSgpOworICAgICAgICBpbnRbXSByZWxhdGl2ZU9mZnNldHMgPSAoaW50W10pIGJ1Y2tldFJlbGF0aXZlT2Zmc2V0cy5jbG9uZSgpOworICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhYnNvbHV0ZU9mZnNldHMubGVuZ3RoOyBpKysgKQorICAgICAgICAgICAgYWJzb2x1dGVPZmZzZXRzW2ldICs9IHNzdE9mZnNldDsKKyAgICAgICAgZXh0U1NULnNldEJ1Y2tldE9mZnNldHMoYWJzb2x1dGVPZmZzZXRzLCByZWxhdGl2ZU9mZnNldHMpOworICAgICAgICByZXR1cm4gZXh0U1NUOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIEVYVFNTVCByZWNvcmQgYXMgaXQgd291bGQgYmUgaWYgdGhlCisgICAgICogcmVjb3JkIHdhcyBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHJldHVybiAgVGhlIHNpemUgb2YgdGhlIEV4dFNTVCByZWNvcmQgaW4gYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIGludCBjYWxjRXh0U1NUUmVjb3JkU2l6ZSgpCisgICAgeworICAgICAgcmV0dXJuIEV4dFNTVFJlY29yZC5nZXRSZWNvcmRTaXplRm9yU3RyaW5ncyhmaWVsZF8zX3N0cmluZ3Muc2l6ZSgpKTsKKyAgICB9CiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU1NUUmVjb3JkU2l6ZUNhbGN1bGF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1NTVFJlY29yZFNpemVDYWxjdWxhdG9yLmphdmEKaW5kZXggZmJkZmJhNS4uMTVhNTJmOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU1NUUmVjb3JkU2l6ZUNhbGN1bGF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9TU1RSZWNvcmRTaXplQ2FsY3VsYXRvci5qYXZhCkBAIC02MSw3ICs2MSw5IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCi0gKiBVc2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVjb3JkIHNpemVzIGZvciBhIHBhcnRpY3VsYXIgcmVjb3JkLgorICogVXNlZCB0byBjYWxjdWxhdGUgdGhlIHJlY29yZCBzaXplcyBmb3IgYSBwYXJ0aWN1bGFyIHJlY29yZC4gIFRoaXMga2luZCBvZgorICogc3Vja3MgYmVjYXVzZSBpdCdzIHNpbWlsYXIgdG8gdGhlIFNTVCBzZXJpYWxpemF0aW9uIGNvZGUuICBJbiBnZW5lcmFsCisgKiB0aGUgU1NUIHNlcmlhbGl6YXRpb24gY29kZSBuZWVkcyB0byBiZSByZXdyaXR0ZW4uCiAgKgogICogQGF1dGhvciBHbGVuIFN0YW1wb3VsdHppcyAoZ2xlbnMgYXQgYXBhY2hlLm9yZykKICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU1NUU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU1NUU2VyaWFsaXplci5qYXZhCmluZGV4IDgyMzllZWIuLmY0NTM4YmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1NTVFNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9TU1RTZXJpYWxpemVyLmphdmEKQEAgLTc3LDYgKzc3LDEyIEBACiAgICAgcHJpdmF0ZSBpbnQgbnVtVW5pcXVlU3RyaW5nczsKICAgICBwcml2YXRlIFNTVFJlY29yZEhlYWRlciBzc3RSZWNvcmRIZWFkZXI7CiAKKyAgICAvKiogT2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNTVCByZWNvcmQgKGV2ZW4gYWNyb3NzIGNvbnRpbnVhdGlvbnMpICovCisgICAgaW50W10gYnVja2V0QWJzb2x1dGVPZmZzZXRzOworICAgIC8qKiBPZmZzZXRzIHJlbGF0aXZlIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBTU1Qgb3IgY29udGludWUgcmVjb3JkICovCisgICAgaW50W10gYnVja2V0UmVsYXRpdmVPZmZzZXRzOworICAgIGludCBzdGFydE9mU1NULCBzdGFydE9mUmVjb3JkOworCiAgICAgcHVibGljIFNTVFNlcmlhbGl6ZXIoIExpc3QgcmVjb3JkTGVuZ3RocywgQmluYXJ5VHJlZSBzdHJpbmdzLCBpbnQgbnVtU3RyaW5ncywgaW50IG51bVVuaXF1ZVN0cmluZ3MgKQogICAgIHsKICAgICAgICAgdGhpcy5yZWNvcmRMZW5ndGhzID0gcmVjb3JkTGVuZ3RoczsKQEAgLTg0LDYgKzkwLDEwIEBACiAgICAgICAgIHRoaXMubnVtU3RyaW5ncyA9IG51bVN0cmluZ3M7CiAgICAgICAgIHRoaXMubnVtVW5pcXVlU3RyaW5ncyA9IG51bVVuaXF1ZVN0cmluZ3M7CiAgICAgICAgIHRoaXMuc3N0UmVjb3JkSGVhZGVyID0gbmV3IFNTVFJlY29yZEhlYWRlciggbnVtU3RyaW5ncywgbnVtVW5pcXVlU3RyaW5ncyApOworCisgICAgICAgIGludCBpbmZvUmVjcyA9IEV4dFNTVFJlY29yZC5nZXROdW1iZXJPZkluZm9SZWNzRm9yU3RyaW5ncyhzdHJpbmdzLnNpemUoKSk7CisgICAgICAgIHRoaXMuYnVja2V0QWJzb2x1dGVPZmZzZXRzID0gbmV3IGludFtpbmZvUmVjc107CisgICAgICAgIHRoaXMuYnVja2V0UmVsYXRpdmVPZmZzZXRzID0gbmV3IGludFtpbmZvUmVjc107CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzMsNyArMTQzLDYgQEAKIAogICAgIC8qKgogICAgICAqIFRoaXMgY2FzZSBpcyBjaG9zZW4gd2hlbiBhbiBTU1QgcmVjb3JkIGRvZXMgbm90IHNwYW4gb3ZlciB0byBhIGNvbnRpbnVlIHJlY29yZC4KLSAgICAgKgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVTaW5nbGVTU1RSZWNvcmQoIGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgcmVjb3JkX2xlbmd0aF9pbmRleCApCiAgICAgewpAQCAtMTQ0LDYgKzE1MywxNSBAQAogCiAgICAgICAgIGZvciAoIGludCBrID0gMDsgayA8IHN0cmluZ3Muc2l6ZSgpOyBrKysgKQogICAgICAgICB7CisgICAgICAgICAgICBpZiAoayAlIEV4dFNTVFJlY29yZC5ERUZBVUxUX0JVQ0tFVF9TSVpFID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBpbmRleCA9IGsvRXh0U1NUUmVjb3JkLkRFRkFVTFRfQlVDS0VUX1NJWkU7CisgICAgICAgICAgICAgIGlmIChpbmRleCA8IEV4dFNTVFJlY29yZC5NQVhfQlVDS0VUUykgeworICAgICAgICAgICAgICAgIC8vRXhjZWwgb25seSBpbmRleGVzIHRoZSBmaXJzdCAxMjggYnVja2V0cy4KKyAgICAgICAgICAgICAgICBidWNrZXRBYnNvbHV0ZU9mZnNldHNbaW5kZXhdID0gcG9zOworICAgICAgICAgICAgICAgIGJ1Y2tldFJlbGF0aXZlT2Zmc2V0c1tpbmRleF0gPSBwb3M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGdldFVuaWNvZGVTdHJpbmcoIGsgKS5zZXJpYWxpemUoKSwgMCwgZGF0YSwgcG9zICsgb2Zmc2V0LCBnZXRVbmljb2RlU3RyaW5nKCBrICkuZ2V0UmVjb3JkU2l6ZSgpICk7CiAgICAgICAgICAgICBwb3MgKz0gZ2V0VW5pY29kZVN0cmluZyggayApLmdldFJlY29yZFNpemUoKTsKICAgICAgICAgfQpAQCAtMTU3LDYgKzE3NSw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZUxhcmdlUmVjb3JkKCBpbnQgcmVjb3JkX3NpemUsIGludCByZWNvcmRfbGVuZ3RoX2luZGV4LCBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0ICkKICAgICB7CiAKKyAgICAgICAgc3RhcnRPZlNTVCA9IG9mZnNldDsKKwogICAgICAgICBieXRlW10gc3RyaW5nUmVtaW5hbnQgPSBudWxsOwogICAgICAgICBpbnQgc3RyaW5nSW5kZXggPSAwOwogICAgICAgICBib29sZWFuIGxhc3RuZWVkY29udGludWUgPSBmYWxzZTsKQEAgLTE3MCw2ICsxOTAsNyBAQAogICAgICAgICAgICAgICAgICAgICByZWNvcmRMZW5ndGgsIG51bVN0cmluZ3MsIG51bVVuaXF1ZVN0cmluZ3MgKTsKIAogICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGFwcHJvcHJpYXRlIGhlYWRlcgorICAgICAgICAgICAgc3RhcnRPZlJlY29yZCA9IG9mZnNldCArIHRvdGFsV3JpdHRlbjsKICAgICAgICAgICAgIHJlY29yZFByb2Nlc3Nvci53cml0ZVJlY29yZEhlYWRlciggb2Zmc2V0LCB0b3RhbFdyaXR0ZW4sIHJlY29yZExlbmd0aCwgZmlyc3RfcmVjb3JkICk7CiAgICAgICAgICAgICBmaXJzdF9yZWNvcmQgPSBmYWxzZTsKIApAQCAtMTg5LDYgKzIxMCwxNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgdW5pc3RyID0gZ2V0VW5pY29kZVN0cmluZyggc3RyaW5nSW5kZXggKTsKIAorICAgICAgICAgICAgICAgIGlmIChzdHJpbmdJbmRleCAlIEV4dFNTVFJlY29yZC5ERUZBVUxUX0JVQ0tFVF9TSVpFID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gc3RyaW5nSW5kZXggLyBFeHRTU1RSZWNvcmQuREVGQVVMVF9CVUNLRVRfU0laRTsKKyAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IEV4dFNTVFJlY29yZC5NQVhfQlVDS0VUUykgeworICAgICAgICAgICAgICAgICAgICBidWNrZXRBYnNvbHV0ZU9mZnNldHNbaW5kZXhdID0gb2Zmc2V0ICsgdG90YWxXcml0dGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFByb2Nlc3Nvci5nZXRSZWNvcmRPZmZzZXQoKSAtIHN0YXJ0T2ZTU1Q7CisgICAgICAgICAgICAgICAgICAgIGJ1Y2tldFJlbGF0aXZlT2Zmc2V0c1tpbmRleF0gPSBvZmZzZXQgKyB0b3RhbFdyaXR0ZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkUHJvY2Vzc29yLmdldFJlY29yZE9mZnNldCgpIC0gc3RhcnRPZlJlY29yZDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBpZiAoIHVuaXN0ci5nZXRSZWNvcmRTaXplKCkgPD0gcmVjb3JkUHJvY2Vzc29yLmdldEF2YWlsYWJsZSgpICkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHJlY29yZFByb2Nlc3Nvci53cml0ZVdob2xlU3RyaW5nKCB1bmlzdHIsIG9mZnNldCwgdG90YWxXcml0dGVuICk7CkBAIC0yMzUsNCArMjY3LDE0IEBACiAgICAgewogICAgICAgICByZXR1cm4gcmVjb3JkTGVuZ3RoczsKICAgICB9CisKKyAgICBwdWJsaWMgaW50W10gZ2V0QnVja2V0QWJzb2x1dGVPZmZzZXRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBidWNrZXRBYnNvbHV0ZU9mZnNldHM7CisgICAgfQorCisgICAgcHVibGljIGludFtdIGdldEJ1Y2tldFJlbGF0aXZlT2Zmc2V0cygpCisgICAgeworICAgICAgICByZXR1cm4gYnVja2V0UmVsYXRpdmVPZmZzZXRzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1N0cmluZ1JlY29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU3RyaW5nUmVjb3JkLmphdmEKaW5kZXggZWQxNTdiYi4uOTE0YTkyZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU3RyaW5nUmVjb3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU3RyaW5nUmVjb3JkLmphdmEKQEAgLTEzOCw2ICsxMzgsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzSW5WYWx1ZVNlY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgcHJpdmF0ZSBpbnQgZ2V0U3RyaW5nTGVuZ3RoKCkKICAgICB7CiAgICAgICAgIHJldHVybiBmaWVsZF8xX3N0cmluZ19sZW5ndGg7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9TdHlsZVJlY29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvU3R5bGVSZWNvcmQuamF2YQppbmRleCBjNGY4ZWUzLi5kNmJiNDgyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9TdHlsZVJlY29yZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1N0eWxlUmVjb3JkLmphdmEKQEAgLTU3LDEyICs1NywxNCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5MaXR0bGVFbmRpYW47CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5TdHJpbmdVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuQml0RmllbGQ7CiAKIC8qKgogICogVGl0bGU6ICAgICAgICBTdHlsZSBSZWNvcmQ8UD4KICAqIERlc2NyaXB0aW9uOiAgRGVzY3JpYmVzIGEgYnVpbHRpbiB0byB0aGUgZ3VpIG9yIHVzZXIgZGVmaW5lZCBzdHlsZTxQPgogICogUkVGRVJFTkNFOiAgUEcgMzkwIE1pY3Jvc29mdCBFeGNlbCA5NyBEZXZlbG9wZXIncyBLaXQgKElTQk46IDEtNTcyMzEtNDk4LTIpPFA+CiAgKiBAYXV0aG9yIEFuZHJldyBDLiBPbGl2ZXIgKGFjb2xpdmVyIGF0IGFwYWNoZSBkb3Qgb3JnKQorICogQGF1dGhvciBhdmlrcyA6IHN0cmluZyBmaXhlcyBmb3IgVXNlckRlZmluZWQgU3R5bGUKICAqIEB2ZXJzaW9uIDIuMC1wcmUKICAqLwogCkBAIC04MSw4ICs4MywxMCBAQAogICAgIHByaXZhdGUgYnl0ZSAgICAgICAgICAgICAgZmllbGRfM19vdXRsaW5lX3N0eWxlX2xldmVsOwogCiAgICAgLy8gb25seSBmb3IgdXNlciBkZWZpbmVkIHN0eWxlcwotICAgIHByaXZhdGUgYnl0ZSAgICAgICAgICAgICAgZmllbGRfMl9uYW1lX2xlbmd0aDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGZpZWxkXzNfbmFtZTsKKyAgICBwcml2YXRlIHNob3J0ICAgICAgICAgICAgICBmaWVsZF8yX25hbWVfbGVuZ3RoOyAvL09PIGRvYyBzYXlzIDE2IGJpdCBsZW5ndGgsIHNvIHdlIGJlbGlldmUKKyAgICBwcml2YXRlIGJ5dGUgICAgICAgICAgICAgICBmaWVsZF8zX3N0cmluZ19vcHRpb25zOworICAgIHByaXZhdGUgQml0RmllbGQgZkhpZ2hCeXRlOworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIGZpZWxkXzRfbmFtZTsKIAogICAgIHB1YmxpYyBTdHlsZVJlY29yZCgpCiAgICAgewpAQCAtMTI1LDE3ICsxMjksMjQgQEAKIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbGxGaWVsZHMoYnl0ZSBbXSBkYXRhLCBzaG9ydCBzaXplLCBpbnQgb2Zmc2V0KQogICAgIHsKKyAgICAgICAgZkhpZ2hCeXRlID0gbmV3IEJpdEZpZWxkKDB4MDEpOyAvL2hhdmUgdG8gaW5pdCBoZXJlLCBzaW5jZSB3ZSBhcmUgYmVpbmcgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mcm9tIHN1cGVyLCBhbmQgY2xhc3MgbGV2ZWwgaW5pdCBoYXNudCBiZWVuIGRvbmUuIAogICAgICAgICBmaWVsZF8xX3hmX2luZGV4ID0gTGl0dGxlRW5kaWFuLmdldFNob3J0KGRhdGEsIDAgKyBvZmZzZXQpOwotICAgICAgICBpZiAoZ2V0VHlwZSgpID09IDEpCisgICAgICAgIGlmIChnZXRUeXBlKCkgPT0gU1RZTEVfQlVJTFRfSU4pCiAgICAgICAgIHsKICAgICAgICAgICAgIGZpZWxkXzJfYnVpbHRpbl9zdHlsZSAgICAgICA9IGRhdGFbIDIgKyBvZmZzZXQgXTsKICAgICAgICAgICAgIGZpZWxkXzNfb3V0bGluZV9zdHlsZV9sZXZlbCA9IGRhdGFbIDMgKyBvZmZzZXQgXTsKICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChnZXRUeXBlKCkgPT0gMCkKKyAgICAgICAgZWxzZSBpZiAoZ2V0VHlwZSgpID09IFNUWUxFX1VTRVJfREVGSU5FRCkKICAgICAgICAgewotICAgICAgICAgICAgZmllbGRfMl9uYW1lX2xlbmd0aCA9IGRhdGFbIDIgKyBvZmZzZXQgXTsKLSAgICAgICAgICAgIGZpZWxkXzNfbmFtZSAgICAgICAgPSBTdHJpbmdVdGlsLmdldEZyb21Db21wcmVzc2VkVW5pY29kZShkYXRhLCAzICsgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl0dGxlRW5kaWFuLnVieXRlVG9JbnQoZmllbGRfMl9uYW1lX2xlbmd0aCkpOworICAgICAgICAgICAgZmllbGRfMl9uYW1lX2xlbmd0aCA9IExpdHRsZUVuZGlhbi5nZXRTaG9ydChkYXRhLCAyICsgb2Zmc2V0ICk7CisgICAgICAgICAgICBmaWVsZF8zX3N0cmluZ19vcHRpb25zID0gZGF0YVs0K29mZnNldF07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChmSGlnaEJ5dGUuaXNTZXQoZmllbGRfM19zdHJpbmdfb3B0aW9ucykpIHsKKyAgICAgICAgICAgICAgICBmaWVsZF80X25hbWU9IFN0cmluZ1V0aWwuZ2V0RnJvbVVuaWNvZGUoZGF0YSxvZmZzZXQrNSxmaWVsZF8yX25hbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgICAgICBmaWVsZF80X25hbWU9U3RyaW5nVXRpbC5nZXRGcm9tQ29tcHJlc3NlZFVuaWNvZGUoZGF0YSxvZmZzZXQrNSxmaWVsZF8yX25hbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIHRvZG8gc2FuaXR5IGNoZWNrIGV4Y2VwdGlvbiB0byBtYWtlIHN1cmUgd2UncmUgb25lIG9yIHRoZSBvdGhlcgpAQCAtMTk5LDcgKzIxMCw4IEBACiAKICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQogICAgIHsKLSAgICAgICAgZmllbGRfM19uYW1lID0gbmFtZTsKKyAgICAgICAgZmllbGRfNF9uYW1lID0gbmFtZTsKKyAgICAgICAgLy9UT0RPIHNldCBuYW1lIGxlbmd0aCBhbmQgc3RyaW5nIG9wdGlvbnMKICAgICB9CiAKICAgICAvLyBlbmQgdXNlciBkZWZpbmVkCkBAIC0yNzMsNyArMjg1LDcgQEAKICAgICAgKiBAc2VlICNnZXROYW1lKCkKICAgICAgKi8KIAotICAgIHB1YmxpYyBieXRlIGdldE5hbWVMZW5ndGgoKQorICAgIHB1YmxpYyBzaG9ydCBnZXROYW1lTGVuZ3RoKCkKICAgICB7CiAgICAgICAgIHJldHVybiBmaWVsZF8yX25hbWVfbGVuZ3RoOwogICAgIH0KQEAgLTI4Niw3ICsyOTgsNyBAQAogCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBmaWVsZF8zX25hbWU7CisgICAgICAgIHJldHVybiBmaWVsZF80X25hbWU7CiAgICAgfQogCiAgICAgLy8gZW5kIHVzZXIgZGVmaW5lZApAQCAtMzYxLDcgKzM3Myw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGRhdGEsIDIgKyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCggc2hvcnQgKSAoMHgwMyArIGdldE5hbWVMZW5ndGgoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCBzaG9ydCApIChnZXRSZWNvcmRTaXplKCktNCkpKTsKICAgICAgICAgfQogICAgICAgICBMaXR0bGVFbmRpYW4ucHV0U2hvcnQoZGF0YSwgNCArIG9mZnNldCwgZ2V0SW5kZXgoKSk7CiAgICAgICAgIGlmIChnZXRUeXBlKCkgPT0gU1RZTEVfQlVJTFRfSU4pCkBAIC0zNzEsOCArMzgzLDkgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFbIDYgKyBvZmZzZXQgXSA9IGdldE5hbWVMZW5ndGgoKTsKLSAgICAgICAgICAgIFN0cmluZ1V0aWwucHV0Q29tcHJlc3NlZFVuaWNvZGUoZ2V0TmFtZSgpLCBkYXRhLCA3ICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChkYXRhLCA2ICsgb2Zmc2V0ICwgZ2V0TmFtZUxlbmd0aCgpKTsKKyAgICAgICAgICAgIGRhdGFbOCtvZmZzZXRdPXRoaXMuZmllbGRfM19zdHJpbmdfb3B0aW9uczsKKyAgICAgICAgICAgIFN0cmluZ1V0aWwucHV0Q29tcHJlc3NlZFVuaWNvZGUoZ2V0TmFtZSgpLCBkYXRhLCA5ICsgb2Zmc2V0KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2V0UmVjb3JkU2l6ZSgpOwogICAgIH0KQEAgLTM4Nyw3ICs0MDAsMTEgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHZhbCA9IDcgKyBnZXROYW1lTGVuZ3RoKCk7CisgICAgICAgICAgICAgaWYgKGZIaWdoQnl0ZS5pc1NldChmaWVsZF8zX3N0cmluZ19vcHRpb25zKSkgIHsKKyAgICAgICAgICAgICAgICAgcmV0dmFsPSA5KzIqZ2V0TmFtZUxlbmd0aCgpOworICAgICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSA5ICsgZ2V0TmFtZUxlbmd0aCgpOworICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Vua25vd25SZWNvcmQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Vua25vd25SZWNvcmQuamF2YQppbmRleCAzNmIwNTk1Li5iODhkMjJmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9Vbmtub3duUmVjb3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvVW5rbm93blJlY29yZC5qYXZhCkBAIC02NSwxNiArNjUsMTQgQEAKICAqIENvbXBhbnk6ICAgICAgU3VwZXJMaW5rIFNvZnR3YXJlLCBJbmMuPFA+CiAgKiBAYXV0aG9yIEFuZHJldyBDLiBPbGl2ZXIgKGFjb2xpdmVyIGF0IGFwYWNoZSBkb3Qgb3JnKQogICogQGF1dGhvciBKYXNvbiBIZWlnaHQgKGpoZWlnaHQgYXQgY2hhcmlvdCBkb3QgbmV0IGRvdCBhdSkKLSAqIEB2ZXJzaW9uIDIuMC1wcmUKKyAqIEBhdXRob3IgR2xlbiBTdGFtcG91bHR6aXMgKGdsZW5zIGF0IGFwYWNoZS5vcmcpCiAgKi8KIAogcHVibGljIGNsYXNzIFVua25vd25SZWNvcmQKICAgICBleHRlbmRzIFJlY29yZAogewotICAgIHByaXZhdGUgc2hvcnQgIHNpZCAgICAgPSAwOwotICAgIHByaXZhdGUgc2hvcnQgIHNpemUgICAgPSAwOwotICAgIHByaXZhdGUgYnl0ZVtdIHRoZWRhdGEgPSBudWxsOwotICAgIGludCAgICAgICAgICAgIG9mZnNldCAgPSAwOworICAgIHByaXZhdGUgc2hvcnQgICBzaWQgICAgID0gMDsKKyAgICBwcml2YXRlIGJ5dGVbXSAgdGhlZGF0YSA9IG51bGw7CiAKICAgICBwdWJsaWMgVW5rbm93blJlY29yZCgpCiAgICAgewpAQCAtOTEsNyArODksNiBAQAogICAgIHB1YmxpYyBVbmtub3duUmVjb3JkKHNob3J0IGlkLCBzaG9ydCBzaXplLCBieXRlIFtdIGRhdGEpCiAgICAgewogICAgICAgICBzaWQgICAgID0gaWQ7Ci0gICAgICAgIHNpemUgICAgPSBzaXplOwogICAgICAgICB0aGVkYXRhID0gZGF0YTsKICAgICB9CiAKQEAgLTEyNyw3ICsxMjQsNyBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmlsbEZpZWxkcyhieXRlIFtdIGRhdGEsIHNob3J0IHNpZCkKICAgICB7Ci0gICAgICAgIHNpZCAgICAgPSBzaWQ7CisgICAgICAgIHRoaXMuc2lkICAgICA9IHNpZDsKICAgICAgICAgdGhlZGF0YSA9IGRhdGE7CiAgICAgfQogCkBAIC0xNzksOSArMTc2LDcgQEAKICAgICAvKiogVW5saWtlIHRoZSBvdGhlciBSZWNvcmQuY2xvbmUgbWV0aG9kcyB0aGlzIGlzIGEgc2hhbGxvdyBjbG9uZSovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgIFVua25vd25SZWNvcmQgcmVjID0gbmV3IFVua25vd25SZWNvcmQoKTsKLSAgICAgIHJlYy5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICByZWMuc2lkID0gc2lkOwotICAgICAgcmVjLnNpemUgPSBzaXplOwogICAgICAgcmVjLnRoZWRhdGEgPSB0aGVkYXRhOwogICAgICAgcmV0dXJuIHJlYzsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9hZ2dyZWdhdGVzL0Zvcm11bGFSZWNvcmRBZ2dyZWdhdGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2FnZ3JlZ2F0ZXMvRm9ybXVsYVJlY29yZEFnZ3JlZ2F0ZS5qYXZhCmluZGV4IDdkNWIwYjAuLjc2MWQ4MjEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2FnZ3JlZ2F0ZXMvRm9ybXVsYVJlY29yZEFnZ3JlZ2F0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2FnZ3JlZ2F0ZXMvRm9ybXVsYVJlY29yZEFnZ3JlZ2F0ZS5qYXZhCkBAIC04Miw2ICs4MiwxOSBAQAogICAgICAgICB0aGlzLnN0cmluZ1JlY29yZCA9IHN0cmluZ1JlY29yZDsKICAgICB9CiAKKwkvKioKKwkgKiBVc2VkIG9ubHkgaW4gdGhlIGNsb25lCisJICogQHBhcmFtIGZvcm11bGFSZWNvcmQKKwkgKiBAcGFyYW0gc3RyaW5nUmVjb3JkCisJICogQHBhcmFtIHNoYXJlZFJlY29yZAorCSAqLworCXB1YmxpYyBGb3JtdWxhUmVjb3JkQWdncmVnYXRlKCBGb3JtdWxhUmVjb3JkIGZvcm11bGFSZWNvcmQsIFN0cmluZ1JlY29yZCBzdHJpbmdSZWNvcmQsIFNoYXJlZEZvcm11bGFSZWNvcmQgc2hhcmVkUmVjb3JkKQorCXsKKwkJICB0aGlzLmZvcm11bGFSZWNvcmQgPSBmb3JtdWxhUmVjb3JkOworCQkgIHRoaXMuc3RyaW5nUmVjb3JkID0gc3RyaW5nUmVjb3JkOworCQkgIHRoaXMuc2hhcmVkRm9ybXVsYVJlY29yZCA9IHNoYXJlZFJlY29yZDsKKwl9CisKIAogCiAgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTaWQoIHNob3J0IGlkICkKQEAgLTEwNiwxNCArMTE5LDE0IEBACiAgICAgewogICAgICAgICBpbnQgcG9zID0gb2Zmc2V0OwogICAgICAgICBwb3MgKz0gZm9ybXVsYVJlY29yZC5zZXJpYWxpemUocG9zLCBkYXRhKTsKLSAgICAgICAgaWYgKHN0cmluZ1JlY29yZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3MgKz0gc3RyaW5nUmVjb3JkLnNlcmlhbGl6ZShwb3MsIGRhdGEpOwotICAgICAgICB9CiAgICAgICAgIGlmICh0aGlzLmdldFNoYXJlZEZvcm11bGFSZWNvcmQoKSAhPSBudWxsKSAKICAgICAgICAgewogICAgICAgICAJCXBvcyArPSBnZXRTaGFyZWRGb3JtdWxhUmVjb3JkKCkuc2VyaWFsaXplKHBvcywgZGF0YSk7CiAgICAgICAgIH0JCisgICAgICAgICBpZiAoc3RyaW5nUmVjb3JkICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyArPSBzdHJpbmdSZWNvcmQuc2VyaWFsaXplKHBvcywgZGF0YSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBvcyAtIG9mZnNldDsKICAgICAgICAgCiAgICAgfQpAQCAtMjIxLDcgKzIzNCwxMCBAQAogICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGb3JtdWxhUmVjb3JkQWdncmVnYXRlKChGb3JtdWxhUmVjb3JkKSB0aGlzLmZvcm11bGFSZWNvcmQuY2xvbmUoKSwgKFN0cmluZ1JlY29yZCkgdGhpcy5zdHJpbmdSZWNvcmQuY2xvbmUoKSk7CisJCQlTdHJpbmdSZWNvcmQgY2xvbmVkU3RyaW5nID0gKHN0cmluZ1JlY29yZCA9PSBudWxsKSA/IG51bGwgOiAoU3RyaW5nUmVjb3JkKXN0cmluZ1JlY29yZC5jbG9uZSgpOworICAgIAkJU2hhcmVkRm9ybXVsYVJlY29yZCBjbG9uZWRTaGFyZWQgPSAoc2hhcmVkRm9ybXVsYVJlY29yZCA9PSBudWxsKSA/IG51bGwgOiAoU2hhcmVkRm9ybXVsYVJlY29yZClzaGFyZWRGb3JtdWxhUmVjb3JkLmNsb25lKCk7CisgICAgCQkKKyAgICAgICAgcmV0dXJuIG5ldyBGb3JtdWxhUmVjb3JkQWdncmVnYXRlKChGb3JtdWxhUmVjb3JkKSB0aGlzLmZvcm11bGFSZWNvcmQuY2xvbmUoKSwgY2xvbmVkU3RyaW5nLCBjbG9uZWRTaGFyZWQpOwogICAgIH0KIAogCkBAIC0yNDEsNCArMjU3LDE5IEBACiAgICAgICB0aGlzLnNoYXJlZEZvcm11bGFSZWNvcmQgPSBzaGFyZWRGb3JtdWxhUmVjb3JkOwogICAgfQogCisgICAvKiAKKyAgICAqIFNldHRpbmcgdG8gdHJ1ZSBzbyB0aGF0IHRoaXMgdmFsdWUgZG9lcyBub3QgYWJvcnQgdGhlIHdob2xlIFZhbHVlQWdncmVnYXRpb24KKyAgICAqIChub24tSmF2YWRvYykKKyAgICAqIEBzZWUgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuUmVjb3JkI2lzSW5WYWx1ZVNlY3Rpb24oKQorICAgICovCisgICBwdWJsaWMgYm9vbGVhbiBpc0luVmFsdWVTZWN0aW9uKCkgeworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKyAgIAorICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHsKKyAgICAgICAgaWYoc3RyaW5nUmVjb3JkPT1udWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHN0cmluZ1JlY29yZC5nZXRTdHJpbmcoKTsKKyAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9BYnN0cmFjdEZ1bmN0aW9uUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0Fic3RyYWN0RnVuY3Rpb25QdGcuamF2YQppbmRleCBkYTA4YTZkLi5jZDI2NjAyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0Fic3RyYWN0RnVuY3Rpb25QdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0Fic3RyYWN0RnVuY3Rpb25QdGcuamF2YQpAQCAtNTQsOSArNTQsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5CaW5hcnlUcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIEV4Y2VsIHNoZWV0IGZ1bmN0aW9ucyAKQEAgLTY5LDcgKzY4LDcgQEAKIAkvL2NvbnN0YW50IHVzZWQgYWxsb3cgYSBwdGdBdHRyIHRvIGJlIG1hcHBlZCBwcm9wZXJseSBmb3IgaXRzIGZ1bmN0aW9uUHRnCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gInNwZWNpYWxmbGFnIjsKIAkgICAgCi0gICAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IElOREVYX0VYVEVSTkFMID0gMjU1OwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIEJpbmFyeVRyZWUgbWFwID0gcHJvZHVjZUhhc2goKTsgCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3RbXVtdIGZ1bmN0aW9uRGF0YSA9IHByb2R1Y2VGdW5jdGlvbkRhdGEoKTsKQEAgLTEwNCw3ICsxMDMsNyBAQAogICAgICAgICByZXR1cm4gbG9va3VwTmFtZShmaWVsZF8yX2ZuY19pbmRleCk7CiAgICAgfQogICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKSB7CisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykgewogICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwogICAgIH0KICAgICAKQEAgLTE0MCw3ICsxMzksOSBAQAogICAgIH0KICAgICAKICAgICBwcm90ZWN0ZWQgc2hvcnQgbG9va3VwSW5kZXgoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChzaG9ydCkoKEludGVnZXIpbWFwLmdldEtleUZvclZhbHVlKG5hbWUpKS5pbnRWYWx1ZSgpOworICAgICAgICBJbnRlZ2VyIGluZGV4ID0gKEludGVnZXIpIG1hcC5nZXRLZXlGb3JWYWx1ZShuYW1lKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHJldHVybiBpbmRleC5zaG9ydFZhbHVlKCk7CisgICAgICAgIHJldHVybiBJTkRFWF9FWFRFUk5BTDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODksNiArMzkwLDcgQEAKICAgICAgICAgZG1hcC5wdXQobmV3IEludGVnZXIoMjUyKSwiRlJFUVVFTkNZIik7CiAgICAgICAgIGRtYXAucHV0KG5ldyBJbnRlZ2VyKDI1MyksIkFERFRPT0xCQVIiKTsKICAgICAgICAgZG1hcC5wdXQobmV3IEludGVnZXIoMjU0KSwiREVMRVRFVE9PTEJBUiIpOworICAgICAgICBkbWFwLnB1dChuZXcgSW50ZWdlcigyNTUpLCJleHRlcm5hbGZsYWciKTsKICAgICAgICAgZG1hcC5wdXQobmV3IEludGVnZXIoMjU2KSwiUkVTRVRUT09MQkFSIik7CiAgICAgICAgIGRtYXAucHV0KG5ldyBJbnRlZ2VyKDI1NyksIkVWQUxVQVRFIik7CiAgICAgICAgIGRtYXAucHV0KG5ldyBJbnRlZ2VyKDI1OCksIkdFVFRPT0xCQVIiKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvQWRkUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0FkZFB0Zy5qYXZhCmluZGV4IGVhZDg4NDAuLjNhNTE5ZGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvQWRkUHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9BZGRQdGcuamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CiAKIC8qKgogICogQWRkaXRpb24gb3BlcmF0b3IgUFRHIHRoZSAiKyIgYmlub21pYWwgb3BlcmF0b3IuICBJZiB5b3UgbmVlZCBtb3JlIApAQCAtMTEzLDcgKzExMyw3IEBACiAgICAgfQogICAgIAogICAgIC8qKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSBQdGcgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhTaGVldFJlZmVyZW5jZXMgcmVmcykKKyAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKQogICAgIHsKICAgICAgICAgcmV0dXJuICIrIjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0FyZWEzRFB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9BcmVhM0RQdGcuamF2YQppbmRleCAxZTQyNTY2Li41OWM0MDVjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0FyZWEzRFB0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvQXJlYTNEUHRnLmphdmEKQEAgLTI5MSw4ICsyOTEsOSBAQAogCiAJfQogCi0JcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoIFNoZWV0UmVmZXJlbmNlcyByZWZzICkKKwlwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKQogCXsKKwkJU2hlZXRSZWZlcmVuY2VzIHJlZnMgPSBib29rID09IG51bGwgPyBudWxsIDogYm9vay5nZXRTaGVldFJlZmVyZW5jZXMoKTsKIAkJU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJaWYgKCByZWZzICE9IG51bGwgKQogCQl7CkBAIC0zMTgsNiArMzE5LDcgQEAKIAkJcHRnLmZpZWxkXzNfbGFzdF9yb3cgPSBmaWVsZF8zX2xhc3Rfcm93OwogCQlwdGcuZmllbGRfNF9maXJzdF9jb2x1bW4gPSBmaWVsZF80X2ZpcnN0X2NvbHVtbjsKIAkJcHRnLmZpZWxkXzVfbGFzdF9jb2x1bW4gPSBmaWVsZF81X2xhc3RfY29sdW1uOworICAgICAgICAgICAgcHRnLnNldENsYXNzKHB0Z0NsYXNzKTsKIAkJcmV0dXJuIHB0ZzsKIAl9CiAKQEAgLTM1MSw0ICszNTMsMyBAQAogCiAKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9BcmVhUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0FyZWFQdGcuamF2YQppbmRleCA4N2ViYjJjLi4zMTg5YTJjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0FyZWFQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0FyZWFQdGcuamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLkFyZWFSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLkNlbGxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqIFNwZWNpZmllcyBhIHJlY3Rhbmd1bGFyIGFyZWEgb2YgY2VsbHMgQTE6QTQgZm9yIGluc3RhbmNlLgpAQCAtMzA1LDcgKzMwNSw3IEBACiAgICAgICAgIGZpZWxkXzRfbGFzdF9jb2x1bW4gPSBjb2x1bW47CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgICByZXR1cm4gKG5ldyBDZWxsUmVmZXJlbmNlKGdldEZpcnN0Um93KCksZ2V0Rmlyc3RDb2x1bW4oKSwhaXNGaXJzdFJvd1JlbGF0aXZlKCksIWlzRmlyc3RDb2xSZWxhdGl2ZSgpKSkudG9TdHJpbmcoKSArICI6IiArCiAgICAgICAgICAgICAgICAgKG5ldyBDZWxsUmVmZXJlbmNlKGdldExhc3RSb3coKSxnZXRMYXN0Q29sdW1uKCksIWlzTGFzdFJvd1JlbGF0aXZlKCksIWlzTGFzdENvbFJlbGF0aXZlKCkpKS50b1N0cmluZygpOwpAQCAtMzIxLDYgKzMyMSw3IEBACiAgICAgICBwdGcuZmllbGRfMl9sYXN0X3JvdyA9IGZpZWxkXzJfbGFzdF9yb3c7CiAgICAgICBwdGcuZmllbGRfM19maXJzdF9jb2x1bW4gPSBmaWVsZF8zX2ZpcnN0X2NvbHVtbjsKICAgICAgIHB0Zy5maWVsZF80X2xhc3RfY29sdW1uID0gZmllbGRfNF9sYXN0X2NvbHVtbjsKKyAgICAgIHB0Zy5zZXRDbGFzcyhwdGdDbGFzcyk7CiAgICAgICByZXR1cm4gcHRnOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9BdHRyUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0F0dHJQdGcuamF2YQppbmRleCBkMzg5MDk0Li5lYmJmY2JhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0F0dHJQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0F0dHJQdGcuamF2YQpAQCAtNjAsNyArNjAsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGE7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkxpdHRsZUVuZGlhbjsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkJpdEZpZWxkOwpAQCAtMjA3LDExICsyMDcsMTEgQEAKICAgICAgICAgaWYoc3BhY2UuaXNTZXQoZmllbGRfMV9vcHRpb25zKSkgewogICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmRzWyAwIF07CiAgICAgICAgIH0gZWxzZSBpZiAob3B0aUlmLmlzU2V0KGZpZWxkXzFfb3B0aW9ucykpIHsKLSAgICAgICAgICAgIHJldHVybiB0b0Zvcm11bGFTdHJpbmcoKFNoZWV0UmVmZXJlbmNlcyludWxsKSArICIoIiArIG9wZXJhbmRzWyAwIF0gICAgICAgICAgICAgKyIpIjsgCisgICAgICAgICAgICByZXR1cm4gdG9Gb3JtdWxhU3RyaW5nKChXb3JrYm9vayludWxsKSArICIoIiArIG9wZXJhbmRzWyAwIF0gICAgICAgICAgICAgKyIpIjsKICAgICAgICAgfSBlbHNlIGlmIChvcHRHb3RvLmlzU2V0KGZpZWxkXzFfb3B0aW9ucykpIHsKLSAgICAgICAgICAgIHJldHVybiB0b0Zvcm11bGFTdHJpbmcoKFNoZWV0UmVmZXJlbmNlcyludWxsKSArIG9wZXJhbmRzWzBdOyAgIC8vZ290byBpc24ndCBhIHJlYWwgZm9ybXVsYSBlbGVtZW50IHNob3VsZCBub3Qgc2hvdyB1cAorICAgICAgICAgICAgcmV0dXJuIHRvRm9ybXVsYVN0cmluZygoV29ya2Jvb2spbnVsbCkgKyBvcGVyYW5kc1swXTsgICAvL2dvdG8gaXNuJ3QgYSByZWFsIGZvcm11bGEgZWxlbWVudCBzaG91bGQgbm90IHNob3cgdXAKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0b0Zvcm11bGFTdHJpbmcoKFNoZWV0UmVmZXJlbmNlcyludWxsKSArICIoIiArIG9wZXJhbmRzWyAwIF0gKyAiKSI7CisgICAgICAgICAgICByZXR1cm4gdG9Gb3JtdWxhU3RyaW5nKChXb3JrYm9vayludWxsKSArICIoIiArIG9wZXJhbmRzWyAwIF0gKyAiKSI7CiAgICAgICAgIH0KICAgICB9CiAgIApAQCAtMjI2LDcgKzIyNiw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgICAgIAotICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpIHsKKyAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spIHsKICAgICAgIGlmKHNlbWlWb2xhdGlsZS5pc1NldChmaWVsZF8xX29wdGlvbnMpKSB7CiAgICAgICAgIHJldHVybiAiQVRUUihzZW1pVm9sYXRpbGUpIjsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvQm9vbFB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Cb29sUHRnLmphdmEKaW5kZXggOTU0ZWIwZi4uODRhZDdjZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Cb29sUHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Cb29sUHRnLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuZm9ybXVsYTsKIAogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuTGl0dGxlRW5kaWFuOwotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKiBCb29sZWFuIChib29sZWFuKQpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIHJldHVybiBTSVpFOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gZmllbGRfMV92YWx1ZSA/ICJUUlVFIiA6ICJGQUxTRSI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Db25jYXRQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvQ29uY2F0UHRnLmphdmEKaW5kZXggYmVkOTJlNC4uZTcyNDliZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Db25jYXRQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0NvbmNhdFB0Zy5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKgpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgIHJldHVybiAyOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gQ09OQ0FUOwogICAgIH0gICAgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0RpdmlkZVB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9EaXZpZGVQdGcuamF2YQppbmRleCAxMjRmMjVlLi42YmIwZDk0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0RpdmlkZVB0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvRGl2aWRlUHRnLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqIFRoaXMgUFRHIGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIGJpbm9taWFsIGRpdmlkZSAiLyIKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICByZXR1cm4gMjsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhTaGVldFJlZmVyZW5jZXMgcmVmcykKKyAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKQogICAgIHsKICAgICAgICAgcmV0dXJuICIvIjsKICAgICB9CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAogICAgICAgICBidWZmZXIuYXBwZW5kKG9wZXJhbmRzWyAwIF0pOwotICAgICAgICBidWZmZXIuYXBwZW5kKHRvRm9ybXVsYVN0cmluZygoU2hlZXRSZWZlcmVuY2VzKW51bGwpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0b0Zvcm11bGFTdHJpbmcoKFdvcmtib29rKW51bGwpKTsKICAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMSBdKTsKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0gICAgICAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvRXF1YWxQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvRXF1YWxQdGcuamF2YQppbmRleCAxZGRmZjlhLi4xMjQzOGEzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0VxdWFsUHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9FcXVhbFB0Zy5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKgpAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICAgIHJldHVybiAyOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gIj0iOwogICAgIH0KQEAgLTExNyw3ICsxMTcsNyBAQAogCiAgICAgICAgIAogICAgICAgICBidWZmZXIuYXBwZW5kKG9wZXJhbmRzWyAwIF0pOwotICAgICAgICBidWZmZXIuYXBwZW5kKHRvRm9ybXVsYVN0cmluZygoU2hlZXRSZWZlcmVuY2VzKW51bGwpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0b0Zvcm11bGFTdHJpbmcoKFdvcmtib29rKW51bGwpKTsKICAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMSBdKTsKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0gICAgICAgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0V4cFB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9FeHBQdGcuamF2YQppbmRleCA1NzZiY2UzLi5kNzBlNTc5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0V4cFB0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvRXhwUHRnLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgcmV0dXJuIFNJWkU7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgIHJldHVybiAiTk8gSURFQSBTSEFSRUQgRk9STVVMQSBFWFAgUFRHIjsKICAgICB9CkBAIC0xMTAsNyArMTEwLDEwIEBACiAgICAgcHVibGljIGJ5dGUgZ2V0RGVmYXVsdE9wZXJhbmRDbGFzcygpIHtyZXR1cm4gUHRnLkNMQVNTX1ZBTFVFO30KICAgICAKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5PIElERUEgU0hBUkVEIEZPUk1VTEEgRVhQIFBURyIpOworICAgIAkvL2Nhbid0IGNsb25lIG9uZSB0aGF0IGRvZXNudCBoYXZlIGRhdGEgY2FuIHdlPz8KKwkJaWYgKHRoaXMuZXhpc3RpbmcgPT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5PIElERUEgU0hBUkVEIEZPUk1VTEEgRVhQIFBURyIpOyAKKwkJCisgICAgCXJldHVybiBuZXcgRXhwUHRnKHRoaXMuZXhpc3RpbmcsIDApOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9GdW5jUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0Z1bmNQdGcuamF2YQppbmRleCAxYzIzMGM5Li43MTNkMjAwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0Z1bmNQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0Z1bmNQdGcuamF2YQpAQCAtNjMsNyArNjMsOCBAQAogICAgICAgRnVuY1B0ZyBwdGcgPSBuZXcgRnVuY1B0ZygpOwogICAgICAgLy9wdGcuZmllbGRfMV9udW1fYXJncyA9IGZpZWxkXzFfbnVtX2FyZ3M7CiAgICAgICBwdGcuZmllbGRfMl9mbmNfaW5kZXggPSBmaWVsZF8yX2ZuY19pbmRleDsKLSAgICAgIHJldHVybiBwdGc7CisgICAgICBwdGcuc2V0Q2xhc3MocHRnQ2xhc3MpOworICAgICByZXR1cm4gcHRnOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0Z1bmNWYXJQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvRnVuY1ZhclB0Zy5qYXZhCmluZGV4IGYzMzNiYTYuLjZiZjRkN2YgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvRnVuY1ZhclB0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvRnVuY1ZhclB0Zy5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICBGdW5jVmFyUHRnIHB0ZyA9IG5ldyBGdW5jVmFyUHRnKCk7CiAgICAgICBwdGcuZmllbGRfMV9udW1fYXJncyA9IGZpZWxkXzFfbnVtX2FyZ3M7CiAgICAgICBwdGcuZmllbGRfMl9mbmNfaW5kZXggPSBmaWVsZF8yX2ZuY19pbmRleDsKKyAgICAgIHB0Zy5zZXRDbGFzcyhwdGdDbGFzcyk7CiAgICAgICByZXR1cm4gcHRnOwogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvR3JlYXRlckVxdWFsUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0dyZWF0ZXJFcXVhbFB0Zy5qYXZhCmluZGV4IGRlMGI2MjMuLmIzODdhNWUgMTAwNzU1Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvR3JlYXRlckVxdWFsUHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9HcmVhdGVyRXF1YWxQdGcuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhOwogCiAKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CiAKIC8qKgogICogUFRHIGNsYXNzIHRvIGltcGxlbWVudCBncmVhdGVyIG9yIGVxdWFsIHRvCkBAIC02Niw3ICs2Niw3IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgIFNJWkUgPSAxOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZSBzaWQgID0gMHgwYzsKIAotICAgIC8qKiBDcmVhdGVzIG5ldyBBZGRQdGcgKi8KKyAgICAvKiogQ3JlYXRlcyBuZXcgR3JlYXRlckVxdWFsUHRnICovCiAKICAgIHB1YmxpYyBHcmVhdGVyRXF1YWxQdGcoKQogICAgIHsKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgcmV0dXJuIDI7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgIHJldHVybiAiPj0iOwogICAgIH0KQEAgLTEwOCw3ICsxMDgsNyBAQAogCiAgICAgICAgIAogICAgICAgICBidWZmZXIuYXBwZW5kKG9wZXJhbmRzWyAwIF0pOwotICAgICAgICBidWZmZXIuYXBwZW5kKHRvRm9ybXVsYVN0cmluZygoU2hlZXRSZWZlcmVuY2VzKW51bGwpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0b0Zvcm11bGFTdHJpbmcoKFdvcmtib29rKW51bGwpKTsKICAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMSBdKTsKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0gICAgICAgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0dyZWF0ZXJUaGFuUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0dyZWF0ZXJUaGFuUHRnLmphdmEKaW5kZXggNWY3ZDY0NS4uMDRmYmNhYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9HcmVhdGVyVGhhblB0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvR3JlYXRlclRoYW5QdGcuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CiAKIC8qKgogICogR3JlYXRlciB0aGFuIG9wZXJhdG9yIFBURyAiPiIKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBmcm9tIFB0ZyAKICAgICAgKiBAcGFyYW0gcmVmcyB0aGUgU2hlZXQgUmVmZXJlbmNlcwogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gdGhpcy5HUkVBVEVSVEhBTjsKICAgICB9CkBAIC0xNzEsNSArMTcxLDMgQEAKICAgICAgICAgcmV0dXJuIG5ldyBHcmVhdGVyVGhhblB0ZygpOwogICAgIH0KIH0KLQotCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0ludFB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9JbnRQdGcuamF2YQppbmRleCAyMDBmNWRjLi5lMDZmMWVjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0ludFB0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvSW50UHRnLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuZm9ybXVsYTsKIAogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuTGl0dGxlRW5kaWFuOwotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKiBJbnRlZ2VyIChzaG9ydCBpbnRnZXIpCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgICAgcmV0dXJuIFNJWkU7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgIHJldHVybiAiIiArIGdldFZhbHVlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9MZXNzRXF1YWxQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTGVzc0VxdWFsUHRnLmphdmEKaW5kZXggMGM4MTY1Zi4uYzFjNzU3MCAxMDA3NTUKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9MZXNzRXF1YWxQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0xlc3NFcXVhbFB0Zy5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuZm9ybXVsYTsKIAotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogCiAvKioKQEAgLTY3LDcgKzY3LDcgQEAKIAkgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgIFNJWkUgPSAxOwogCSBwdWJsaWMgZmluYWwgc3RhdGljIGJ5dGUgc2lkICA9IDB4MGE7CiAKLQkgLyoqIENyZWF0ZXMgbmV3IEFkZFB0ZyAqLworCSAvKiogQ3JlYXRlcyBuZXcgTGVzc0VxdWFsUHRnICovCiAKIAlwdWJsaWMgTGVzc0VxdWFsUHRnKCkKIAkgewpAQCAtOTksNyArOTksNyBAQAogCQkgIHJldHVybiAyOwogCSB9CiAKLQkgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKIAkgewogCQkgIHJldHVybiAiPD0iOwogCSB9CkBAIC0xMDksNyArMTA5LDcgQEAKIAogICAgICAgICAKIAkJICBidWZmZXIuYXBwZW5kKG9wZXJhbmRzWyAwIF0pOwotCQkgIGJ1ZmZlci5hcHBlbmQodG9Gb3JtdWxhU3RyaW5nKChTaGVldFJlZmVyZW5jZXMpbnVsbCkpOworCQkgIGJ1ZmZlci5hcHBlbmQodG9Gb3JtdWxhU3RyaW5nKChXb3JrYm9vayludWxsKSk7CiAJCSAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMSBdKTsKIAkJICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJIH0gICAgICAgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0xlc3NUaGFuUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL0xlc3NUaGFuUHRnLmphdmEKaW5kZXggY2FiOTliZS4uYTg1NmI5MyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9MZXNzVGhhblB0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTGVzc1RoYW5QdGcuamF2YQpAQCAtNjMsNyArNjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvL1BPSQotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKiBMZXNzIHRoYW4gb3BlcmF0b3IgUFRHICI8Ii4gVGhlIFNJRCBpcyB0YWtlbiBmcm9tIHRoZSAKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBmcm9tIFB0ZyAKICAgICAgKiBAcGFyYW0gcmVmcyB0aGUgU2hlZXQgUmVmZXJlbmNlcwogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gdGhpcy5MRVNTVEhBTjsKICAgICB9CkBAIC0xODAsNiArMTgwLDMgQEAKICAgICB9CiAKIH0KLQotCi0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTWVtRXJyUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL01lbUVyclB0Zy5qYXZhCmluZGV4IGM0OGFkOGMuLjMxYTFiY2EgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTWVtRXJyUHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9NZW1FcnJQdGcuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5MaXR0bGVFbmRpYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqCkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgICAgcmV0dXJuIFNJWkU7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgIHJldHVybiAiRVJSIyI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9NZW1GdW5jUHRnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL01lbUZ1bmNQdGcuamF2YQppbmRleCAyZDQyMmIxLi5hOGI2MzYwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL01lbUZ1bmNQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL01lbUZ1bmNQdGcuamF2YQpAQCAtNjAsNyArNjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5MaXR0bGVFbmRpYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqIEBhdXRob3IgR2xlbiBTdGFtcG91bHR6aXMgKGdsZW5zIGF0IGFwYWNoZS5vcmcpCkBAIC05Niw3ICs5Niw3IEBACiAgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydCggYXJyYXksIG9mZnNldCArIDEsIChzaG9ydClmaWVsZF8xX2xlbl9yZWZfc3ViZXhwcmVzc2lvbiApOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKCBTaGVldFJlZmVyZW5jZXMgcmVmcyApCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL01pc3NpbmdBcmdQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTWlzc2luZ0FyZ1B0Zy5qYXZhCmluZGV4IDNmODhkZWQuLmM2NWFiNDEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTWlzc2luZ0FyZ1B0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTWlzc2luZ0FyZ1B0Zy5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuZm9ybXVsYTsKIAotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKiBNaXNzaW5nIEZ1bmN0aW9uIEFyZ3VtZW50cwpAQCAtOTEsNyArOTEsNyBAQAogICAgIH0KIAogICAgCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgIHJldHVybiAiICI7CiAgICAgfQpAQCAtMTAzLDUgKzEwMywzIEBACiAgICAgfQogCiB9Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9NdWx0aXBseVB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9NdWx0aXBseVB0Zy5qYXZhCmluZGV4IDE0MzcwMmMuLjZiMzNlNjEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTXVsdGlwbHlQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL011bHRpcGx5UHRnLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuZm9ybXVsYTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKiBJbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBtYXRobWF0aWNhbCBtdWx0aXBsaWNhdGlvbiAtICoKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIH0KICAgICAKIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gIioiOwogICAgIH0KQEAgLTEyMyw5ICsxMjMsOSBAQAogICAgIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAotICAgICAgICBidWZmZXIuYXBwZW5kKG9wZXJhbmRzWyAwIF0udG9Gb3JtdWxhU3RyaW5nKChTaGVldFJlZmVyZW5jZXMpbnVsbCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKG9wZXJhbmRzWyAwIF0udG9Gb3JtdWxhU3RyaW5nKChXb3JrYm9vayludWxsKSk7CiAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIioiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMSBdLnRvRm9ybXVsYVN0cmluZygoU2hlZXRSZWZlcmVuY2VzKW51bGwpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMSBdLnRvRm9ybXVsYVN0cmluZygoV29ya2Jvb2spbnVsbCkpOwogICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgICAgfQogICAgIApAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAKICAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMCBdKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh0b0Zvcm11bGFTdHJpbmcoKFNoZWV0UmVmZXJlbmNlcyludWxsKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQodG9Gb3JtdWxhU3RyaW5nKChXb3JrYm9vayludWxsKSk7CiAgICAgICAgIGJ1ZmZlci5hcHBlbmQob3BlcmFuZHNbIDEgXSk7CiAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgICB9ICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL05hbWVQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTmFtZVB0Zy5qYXZhCmluZGV4IGM5MjZkNTEuLjZjZGVlNmEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTmFtZVB0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTmFtZVB0Zy5qYXZhCkBAIC02MSw3ICs2MSw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGE7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkxpdHRsZUVuZGlhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuTmFtZVJlY29yZDsKIAogLyoqCiAgKgpAQCAtNzMsMTAgKzc0LDEwIEBACiAgICAgZXh0ZW5kcyBQdGcKIHsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IHNpZCAgPSAweDIzOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCAgU0laRSA9IDc7Ci0gICAgcHJpdmF0ZSBzaG9ydCAgICAgICAgICAgICBmaWVsZF8xX2l4dGk7ICAgLy8gdW5rbm93biBmdW5jdGlvbgotICAgIHByaXZhdGUgc2hvcnQgICAgICAgICAgICAgZmllbGRfMl9sYWJlbF9pbmRleDsKLSAgICBwcml2YXRlIHNob3J0ICAgICAgICAgICAgIGZpZWxkXzNfemVybzsgICAvLyByZXNlcnZlZCBtdXN0IGJlIDAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgIFNJWkUgPSA1OworICAgIHByaXZhdGUgc2hvcnQgICAgICAgICAgICAgZmllbGRfMV9sYWJlbF9pbmRleDsKKyAgICBwcml2YXRlIHNob3J0ICAgICAgICAgICAgIGZpZWxkXzJfemVybzsgICAvLyByZXNlcnZlZCBtdXN0IGJlIDAKKyAgICBib29sZWFuIHh0cmE9ZmFsc2U7CiAKIAogICAgIHByaXZhdGUgTmFtZVB0ZygpIHsKQEAgLTg1LDkgKzg2LDIyIEBACiAKICAgICAvKiogQ3JlYXRlcyBuZXcgTmFtZVB0ZyAqLwogCi0gICAgcHVibGljIE5hbWVQdGcoU3RyaW5nIG5hbWUpCisgICAgcHVibGljIE5hbWVQdGcoU3RyaW5nIG5hbWUsIFdvcmtib29rIGJvb2spCiAgICAgewotICAgICAgICAvL1RPRE8KKyAgICAgICAgZmluYWwgc2hvcnQgbiA9IChzaG9ydCkgKGJvb2suZ2V0TnVtTmFtZXMoKSArIDEpOworICAgICAgICBOYW1lUmVjb3JkIHJlYzsKKyAgICAgICAgZm9yIChzaG9ydCBpID0gMTsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgcmVjID0gYm9vay5nZXROYW1lUmVjb3JkKGkgLSAxKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhyZWMuZ2V0TmFtZVRleHQoKSkpIHsKKyAgICAgICAgICAgICAgICBmaWVsZF8xX2xhYmVsX2luZGV4ID0gaTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVjID0gbmV3IE5hbWVSZWNvcmQoKTsKKyAgICAgICAgcmVjLnNldE5hbWVUZXh0KG5hbWUpOworICAgICAgICByZWMuc2V0TmFtZVRleHRMZW5ndGgoKGJ5dGUpIG5hbWUubGVuZ3RoKCkpOworICAgICAgICBib29rLmFkZE5hbWUocmVjKTsKKyAgICAgICAgZmllbGRfMV9sYWJlbF9pbmRleCA9IG47CiAgICAgfQogCiAgICAgLyoqIENyZWF0ZXMgbmV3IE5hbWVQdGcgKi8KQEAgLTk1LDEzICsxMDksMTcgQEAKICAgICBwdWJsaWMgTmFtZVB0ZyhieXRlIFtdIGRhdGEsIGludCBvZmZzZXQpCiAgICAgewogICAgICAgICBvZmZzZXQrKzsKLSAgICAgICAgZmllbGRfMV9peHRpICAgICAgICA9IExpdHRsZUVuZGlhbi5nZXRTaG9ydChkYXRhLCBvZmZzZXQpOwotICAgICAgICBmaWVsZF8yX2xhYmVsX2luZGV4ID0gTGl0dGxlRW5kaWFuLmdldFNob3J0KGRhdGEsIG9mZnNldCArIDIpOwotICAgICAgICBmaWVsZF8zX3plcm8gICAgICAgID0gTGl0dGxlRW5kaWFuLmdldFNob3J0KGRhdGEsIG9mZnNldCArIDQpOworICAgICAgICAvL2ZpZWxkXzFfaXh0aSAgICAgICAgPSBMaXR0bGVFbmRpYW4uZ2V0U2hvcnQoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgZmllbGRfMV9sYWJlbF9pbmRleCA9IExpdHRsZUVuZGlhbi5nZXRTaG9ydChkYXRhLCBvZmZzZXQgKTsKKyAgICAgICAgZmllbGRfMl96ZXJvICAgICAgICA9IExpdHRsZUVuZGlhbi5nZXRTaG9ydChkYXRhLCBvZmZzZXQgKyAyKTsKKyAgICAgICAgLy9pZiAoZGF0YVtvZmZzZXQrNl09PTApIHh0cmE9dHJ1ZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGJ5dGUgW10gYXJyYXksIGludCBvZmZzZXQpCiAgICAgeworICAgICAgICBhcnJheVtvZmZzZXQrMF09IChieXRlKSAoc2lkICsgcHRnQ2xhc3MpOworICAgICAgICBMaXR0bGVFbmRpYW4ucHV0U2hvcnQoYXJyYXksb2Zmc2V0KzEsZmllbGRfMV9sYWJlbF9pbmRleCk7CisgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChhcnJheSxvZmZzZXQrMywgZmllbGRfMl96ZXJvKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFNpemUoKQpAQCAtMTA5LDE4ICsxMjcsMTggQEAKICAgICAgICAgcmV0dXJuIFNJWkU7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7Ci0gICAgICAgIHJldHVybiAiTk8gSURFQSAtIE5BTUUiOworICAgICAgICBOYW1lUmVjb3JkIHJlYyA9IGJvb2suZ2V0TmFtZVJlY29yZChmaWVsZF8xX2xhYmVsX2luZGV4IC0gMSk7CisgICAgICAgIHJldHVybiByZWMuZ2V0TmFtZVRleHQoKTsKICAgICB9CiAgICAgCi0gICAgcHVibGljIGJ5dGUgZ2V0RGVmYXVsdE9wZXJhbmRDbGFzcygpIHtyZXR1cm4gUHRnLkNMQVNTX1ZBTFVFO30KKyAgICBwdWJsaWMgYnl0ZSBnZXREZWZhdWx0T3BlcmFuZENsYXNzKCkge3JldHVybiBQdGcuQ0xBU1NfUkVGO30KIAogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICBOYW1lUHRnIHB0ZyA9IG5ldyBOYW1lUHRnKCk7Ci0gICAgICBwdGcuZmllbGRfMV9peHRpID0gZmllbGRfMV9peHRpOwotICAgICAgcHRnLmZpZWxkXzJfbGFiZWxfaW5kZXggPSBmaWVsZF8yX2xhYmVsX2luZGV4OwotICAgICAgcHRnLmZpZWxkXzNfemVybyA9IGZpZWxkXzNfemVybzsKKyAgICAgIHB0Zy5maWVsZF8xX2xhYmVsX2luZGV4ID0gZmllbGRfMV9sYWJlbF9pbmRleDsKKyAgICAgIHB0Zy5maWVsZF8yX3plcm8gPSBmaWVsZF8yX3plcm87CiAgICAgICByZXR1cm4gcHRnOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTmFtZVhQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTmFtZVhQdGcuamF2YQppbmRleCBiOTEzZjQzLi45YjYyMjVkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL05hbWVYUHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9OYW1lWFB0Zy5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGE7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkxpdHRsZUVuZGlhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CiAKIC8qKgogICoKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAgICAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhieXRlIFtdIGFycmF5LCBpbnQgb2Zmc2V0KQogICAgIHsKLSAgICAgICAgYXJyYXlbIG9mZnNldCArIDAgXSA9IHNpZDsKKyAgICAgICAgYXJyYXlbIG9mZnNldCArIDAgXSA9IChieXRlKShzaWQgKyBwdGdDbGFzcyk7CiAgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChhcnJheSwgb2Zmc2V0ICsgMSwgZmllbGRfMV9peGFscyk7CiAgICAgICAgIExpdHRsZUVuZGlhbi5wdXRTaG9ydChhcnJheSxvZmZzZXQrMywgZmllbGRfMl9pbGJsKTsKICAgICAgICAgTGl0dGxlRW5kaWFuLnB1dFNob3J0KGFycmF5LCBvZmZzZXQgKyA1LCBmaWVsZF8zX3Jlc2VydmVkKTsKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgICAgICByZXR1cm4gU0laRTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhTaGVldFJlZmVyZW5jZXMgcmVmcykKKyAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKQogICAgIHsKICAgICAgICAgcmV0dXJuICJOTyBJREVBIC0gTkFNRSI7CiAgICAgfQpAQCAtMTI1LDYgKzEyNSw3IEBACiAgICAgICBwdGcuZmllbGRfMV9peGFscyA9IGZpZWxkXzFfaXhhbHM7CiAgICAgICBwdGcuZmllbGRfM19yZXNlcnZlZCA9IGZpZWxkXzNfcmVzZXJ2ZWQ7CiAgICAgICBwdGcuZmllbGRfMl9pbGJsID0gZmllbGRfMl9pbGJsOworICAgICAgcHRnLnNldENsYXNzKHB0Z0NsYXNzKTsKICAgICAgIHJldHVybiBwdGc7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Ob3RFcXVhbFB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Ob3RFcXVhbFB0Zy5qYXZhCmluZGV4IGM0M2MxOTYuLmIxMmIxNmEgMTAwNzU1Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTm90RXF1YWxQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL05vdEVxdWFsUHRnLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqIFB0ZyBjbGFzcyB0byBpbXBsZW1lbnQgbm90IGVxdWFsCkBAIC02OSw3ICs2OSw3IEBACiAJIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50ICBTSVpFID0gMTsKIAkgcHVibGljIGZpbmFsIHN0YXRpYyBieXRlIHNpZCAgPSAweDBlOwogCi0JIC8qKiBDcmVhdGVzIG5ldyBBZGRQdGcgKi8KKwkgLyoqIENyZWF0ZXMgbmV3IE5vdEVxdWFsUHRnICovCiAKIAlwdWJsaWMgTm90RXF1YWxQdGcoKQogCSB7CkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJICByZXR1cm4gMjsKIAkgfQogCi0JIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAJIHsKIAkJICByZXR1cm4gIjw+IjsKIAkgfQpAQCAtMTExLDcgKzExMSw3IEBACiAKICAgICAgICAgCiAJCSAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMCBdKTsKLQkJICBidWZmZXIuYXBwZW5kKHRvRm9ybXVsYVN0cmluZygoU2hlZXRSZWZlcmVuY2VzKW51bGwpKTsKKwkJICBidWZmZXIuYXBwZW5kKHRvRm9ybXVsYVN0cmluZygoV29ya2Jvb2spbnVsbCkpOwogCQkgIGJ1ZmZlci5hcHBlbmQob3BlcmFuZHNbIDEgXSk7CiAJCSAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCSB9ICAgICAgIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9OdW1iZXJQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvTnVtYmVyUHRnLmphdmEKaW5kZXggZTA3MTQyMC4uYjQzYzU1MyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9OdW1iZXJQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL051bWJlclB0Zy5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGE7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkxpdHRsZUVuZGlhbjsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CiAvKioKICAqIE51bWJlcgogICogU3RvcmVzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gYSBmb3JtdWxhCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgcmV0dXJuIFNJWkU7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgIHJldHVybiAiIiArIGdldFZhbHVlKCk7CiAgICAgfQpAQCAtMTI1LDQgKzEyNSwzIEBACiAgICAgICByZXR1cm4gcHRnOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9QYXJlbnRoZXNpc1B0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9QYXJlbnRoZXNpc1B0Zy5qYXZhCmluZGV4IGMyMTE4ZjEuLjJhYmZmOWUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvUGFyZW50aGVzaXNQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1BhcmVudGhlc2lzUHRnLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqIFdoaWxlIGZvcm11bGEgdG9rZW5zIGFyZSBzdG9yZWQgaW4gUlBOIG9yZGVyIGFuZCB0aHVzIGRvIG5vdCBuZWVkIHBhcmVudGhlc2lzIGZvciAKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhTaGVldFJlZmVyZW5jZXMgcmVmcykKKyAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKQogICAgIHsKICAgICAgICAgcmV0dXJuICIoKSI7CiAgICAgfQpAQCAtMTI0LDQgKzEyNCwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvUG93ZXJQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvUG93ZXJQdGcuamF2YQppbmRleCBjYTdmYTY0Li4xNjE5MThhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1Bvd2VyUHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Qb3dlclB0Zy5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKgpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgIHJldHVybiAyOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gIl4iOwogICAgIH0KQEAgLTExOCw3ICsxMTgsNyBAQAogCiAgICAgICAgIAogICAgICAgICBidWZmZXIuYXBwZW5kKG9wZXJhbmRzWyAwIF0pOwotICAgICAgICBidWZmZXIuYXBwZW5kKHRvRm9ybXVsYVN0cmluZygoU2hlZXRSZWZlcmVuY2VzKW51bGwpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0b0Zvcm11bGFTdHJpbmcoKFdvcmtib29rKW51bGwpKTsKICAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMSBdKTsKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0gICAgICAgCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1B0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9QdGcuamF2YQppbmRleCAzNzg3ZDAwLi5jZGY1ODRlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1B0Zy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvUHRnLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqCkBAIC0zMDcsNiArMzA3LDEyIEBACiAgICAgICAgICAgICBjYXNlIE1pc3NpbmdBcmdQdGcuc2lkOgogICAgICAgICAgICAgICAgIHJldHZhbCA9IG5ldyBNaXNzaW5nQXJnUHRnKGRhdGEsb2Zmc2V0KTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVW5hcnlQbHVzUHRnLnNpZDoKKyAgICAgICAgICAgICAgICByZXR2YWw9bmV3IFVuYXJ5UGx1c1B0ZyhkYXRhLG9mZnNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFVuYXJ5TWludXNQdGcuc2lkOgorICAgICAgICAgICAgICAgIHJldHZhbD1uZXcgVW5hcnlNaW51c1B0ZyhkYXRhLG9mZnNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGRlZmF1bHQgOgogCkBAIC0zNDEsNyArMzQ3LDcgQEAKICAgICAvKioKICAgICAgKiByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0b2tlbiBhbG9uZQogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKTsKICAgICAvKioKICAgICAgKiBkdW1wIGEgZGVidWcgcmVwcmVzZW50YXRpb24gKGhleGR1bXApIHRvIGEgc3RyaW5nCiAgICAgICovCkBAIC0zNTcsNiArMzYzLDE0IEBACiAgICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgfQogICAgIAorICAgIC8qKiBPdmVycmlkZGVuIHRvU3RyaW5nIG1ldGhvZCB0byBlbnN1cmUgb2JqZWN0IGhhc2ggaXMgbm90IHByaW50ZWQuCisgICAgICogVGhpcyBoZWxwcyBnZXQgcmlkIG9mIGdyYXR1aXRvdXMgZGlmZnMgd2hlbiBjb21wYXJpbmcgdHdvIGR1bXBzCisgICAgICogU3ViY2xhc3NlcyBtYXkgb3V0cHV0IG1vcmUgcmVsZXZhbnQgaW5mb3JtYXRpb24gYnkgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZAorICAgICAqKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisgICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENMQVNTX1JFRiA9IDB4MDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENMQVNTX1ZBTFVFID0gMHgyMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ0xBU1NfQVJSQVkgPSAweDQwOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9SZWYzRFB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9SZWYzRFB0Zy5qYXZhCmluZGV4IDBkODQyOTUuLjRlMTc1ZTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvUmVmM0RQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1JlZjNEUHRnLmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuUmFuZ2VBZGRyZXNzOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5DZWxsUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkJpdEZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CiAKQEAgLTEwNCw3ICsxMDUsNyBAQAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiUmVmM2RQcmdcbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCJSZWYzZFB0Z1xuIik7CiAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkluZGV4IHRvIEV4dGVybiBTaGVldCA9ICIgKyBnZXRFeHRlcm5TaGVldEluZGV4KCkpLmFwcGVuZCgiXG4iKTsKICAgICAgICAgYnVmZmVyLmFwcGVuZCgiUm93ID0gIiArIGdldFJvdygpKS5hcHBlbmQoIlxuIik7CiAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkNvbCAgPSAiICsgZ2V0Q29sdW1uKCkpLmFwcGVuZCgiXG4iKTsKQEAgLTE5Myw4ICsxOTQsOSBAQAogCiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpIHsKKyAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFNoZWV0UmVmZXJlbmNlcyByZWZzID0gYm9vayA9PSBudWxsID8gbnVsbCA6IGJvb2suZ2V0U2hlZXRSZWZlcmVuY2VzKCk7CiAgICAgICAgIGlmIChyZWZzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQocmVmcy5nZXRTaGVldE5hbWUoKGludCl0aGlzLmZpZWxkXzFfaW5kZXhfZXh0ZXJuX3NoZWV0KSk7CiAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCchJyk7CkBAIC0yMTAsNiArMjEyLDcgQEAKICAgICAgcHRnLmZpZWxkXzFfaW5kZXhfZXh0ZXJuX3NoZWV0ID0gZmllbGRfMV9pbmRleF9leHRlcm5fc2hlZXQ7CiAgICAgIHB0Zy5maWVsZF8yX3JvdyA9IGZpZWxkXzJfcm93OwogICAgICBwdGcuZmllbGRfM19jb2x1bW4gPSBmaWVsZF8zX2NvbHVtbjsKKyAgICAgcHRnLnNldENsYXNzKHB0Z0NsYXNzKTsKICAgICAgcmV0dXJuIHB0ZzsKICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9SZWZlcmVuY2VQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvUmVmZXJlbmNlUHRnLmphdmEKaW5kZXggOTBmN2Q4OS4uNGMxNGFhZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9SZWZlcmVuY2VQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1JlZmVyZW5jZVB0Zy5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5CaXRGaWVsZDsKIAogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5DZWxsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKIAogLyoqCiAgKiBSZWZlcmVuY2VQdGcgLSBoYW5kbGVzIHJlZmVyZW5jZXMgKHN1Y2ggYXMgQTEsIEEyLCBJQTQpCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgICAgcmV0dXJuIFNJWkU7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoU2hlZXRSZWZlcmVuY2VzIHJlZnMpCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm11bGFTdHJpbmcoV29ya2Jvb2sgYm9vaykKICAgICB7CiAgICAgICAgIC8vVE9ETyAtLSBzaG91bGQgd2Ugc3RvcmUgYSBjZWxscmVmZXJlbmNlIGluc3RhbmNlIGluIHRoaXMgcHRnPz8gYnV0IC4uIG1lbW9yeSBpcyBhbiBpc3N1ZSwgaSBiZWxpZXZlIQogICAgICAgICByZXR1cm4gKG5ldyBDZWxsUmVmZXJlbmNlKGdldFJvdygpLGdldENvbHVtbigpLCFpc1Jvd1JlbGF0aXZlKCksIWlzQ29sUmVsYXRpdmUoKSkpLnRvU3RyaW5nKCk7CkBAIC0xOTMsNiArMTkzLDcgQEAKICAgICAgIFJlZmVyZW5jZVB0ZyBwdGcgPSBuZXcgUmVmZXJlbmNlUHRnKCk7CiAgICAgICBwdGcuZmllbGRfMV9yb3cgPSBmaWVsZF8xX3JvdzsKICAgICAgIHB0Zy5maWVsZF8yX2NvbCA9IGZpZWxkXzJfY29sOworICAgICAgcHRnLnNldENsYXNzKHB0Z0NsYXNzKTsKICAgICAgIHJldHVybiBwdGc7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9TdHJpbmdQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvU3RyaW5nUHRnLmphdmEKaW5kZXggMDIyZmZmZC4uMWFkMjc4OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9TdHJpbmdQdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1N0cmluZ1B0Zy5qYXZhCkBAIC01NSw4ICs1NSw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGE7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkxpdHRsZUVuZGlhbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5TaGVldFJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5CaXRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuU3RyaW5nVXRpbDsKIAogLyoqCiAgKiBOdW1iZXIKQEAgLTcwLDcgKzcxLDEyIEBACiB7CiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgIFNJWkUgPSA5OwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZSBzaWQgID0gMHgxNzsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGZpZWxkXzFfdmFsdWU7CisgICAgLy9OT1RFOiBPTyBkb2Mgc2F5cyAxNmJpdCBsZW5naHQsIGJ1dCBCaWZmVmlld2VyIHNheXMgOAorICAgIC8vIEJvb2sgc2F5cyBzb21ldGhpbmcgdG90YWxseSBkaWZmZXJlbnQsIHNvIGRvbnQgbG9vayB0aGVyZSEKKyAgICBieXRlIGZpZWxkXzFfbGVuZ3RoOworICAgIGJ5dGUgZmllbGRfMl9vcHRpb25zOworICAgIEJpdEZpZWxkIGZIaWdoQnl0ZSA9IG5ldyBCaXRGaWVsZCgweDAxKTsKKyAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGZpZWxkXzNfc3RyaW5nOwogCiAgICAgcHJpdmF0ZSBTdHJpbmdQdGcoKSB7CiAgICAgICAvL1JlcXVpcmVkIGZvciBjbG9uZSBtZXRob2RzCkBAIC03OSw3ICs4NSwxNiBAQAogICAgIC8qKiBDcmVhdGUgYSBTdHJpbmdQdGcgZnJvbSBhIGJ5dGUgYXJyYXkgcmVhZCBmcm9tIGRpc2sgKi8KICAgICBwdWJsaWMgU3RyaW5nUHRnKGJ5dGUgW10gZGF0YSwgaW50IG9mZnNldCkKICAgICB7Ci0gICAgICAgIHNldFZhbHVlKG5ldyBTdHJpbmcoZGF0YSwgb2Zmc2V0KzMsIGRhdGFbb2Zmc2V0KzFdICsgMjU2KmRhdGFbb2Zmc2V0KzJdKSk7CisgICAgICAgIG9mZnNldCsrOworICAgICAgICBmaWVsZF8xX2xlbmd0aCA9IGRhdGFbb2Zmc2V0XTsKKyAgICAgICAgZmllbGRfMl9vcHRpb25zID0gZGF0YVtvZmZzZXQrMV07CisgICAgICAgIGlmIChmSGlnaEJ5dGUuaXNTZXQoZmllbGRfMl9vcHRpb25zKSkgeworICAgICAgICAgICAgZmllbGRfM19zdHJpbmc9IFN0cmluZ1V0aWwuZ2V0RnJvbVVuaWNvZGUoZGF0YSxvZmZzZXQrMixmaWVsZF8xX2xlbmd0aCk7CisgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgIGZpZWxkXzNfc3RyaW5nPVN0cmluZ1V0aWwuZ2V0RnJvbUNvbXByZXNzZWRVbmljb2RlKGRhdGEsb2Zmc2V0KzIsZmllbGRfMV9sZW5ndGgpOworICAgICAgICB9CisJCQkJIAorICAgICAgICAvL3NldFZhbHVlKG5ldyBTdHJpbmcoZGF0YSwgb2Zmc2V0KzMsIGRhdGFbb2Zmc2V0KzFdICsgMjU2KmRhdGFbb2Zmc2V0KzJdKSk7CiAgICAgfQogCiAgICAgLyoqIENyZWF0ZSBhIFN0cmluZ1B0ZyBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mICB0aGUgbnVtYmVyCkBAIC04OCwzNSArMTAzLDQ5IEBACiAgICAgICogIEBwYXJhbSB2YWx1ZSA6IFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlcgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdQdGcoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4yNTUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBsaXRlcmFscyBpbiBmb3JtdWxhcyBjYW50IGJlIGJpZ2dlciB0aGFuIDI1NSBjaGFyYWN0ZXJzIEFTQ0lJIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5maWVsZF8yX29wdGlvbnM9MDsKKyAgICAgICAgdGhpcy5mSGlnaEJ5dGUuc2V0Qm9vbGVhbihmaWVsZF8yX29wdGlvbnMsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5maWVsZF8zX3N0cmluZz12YWx1ZTsKKyAgICAgICAgdGhpcy5maWVsZF8xX2xlbmd0aD0oYnl0ZSl2YWx1ZS5sZW5ndGgoKTsgLy9mb3IgdGhlIG1vbWVudCwgd2Ugc3VwcG9ydCBvbmx5IEFTQ0lJIHN0cmluZ3MgaW4gZm9ybXVsYXMgd2UgY3JlYXRlCiAgICAgfQogCi0KKyAgICAvKgogICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKICAgICB7CiAgICAgICAgIGZpZWxkXzFfdmFsdWUgPSB2YWx1ZTsKLSAgICB9CisgICAgfSovCiAKIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkXzFfdmFsdWU7CisgICAgICAgIHJldHVybiBmaWVsZF8zX3N0cmluZzsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGJ5dGUgW10gYXJyYXksIGludCBvZmZzZXQpCiAgICAgewogICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMCBdID0gc2lkOwotICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMSBdID0gKGJ5dGUpKGdldFZhbHVlKCkubGVuZ3RoKCkgJSAyNTYpOwotICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMiBdID0gKGJ5dGUpKGdldFZhbHVlKCkubGVuZ3RoKCkgLyAyNTYpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGdldFZhbHVlKCkuZ2V0Qnl0ZXMoKSwgMCwgYXJyYXksIG9mZnNldCArIDMsIGdldFZhbHVlKCkubGVuZ3RoKCkpOworICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMSBdID0gZmllbGRfMV9sZW5ndGg7CisgICAgICAgIGFycmF5WyBvZmZzZXQgKyAyIF0gPSBmaWVsZF8yX29wdGlvbnM7CisgICAgICAgIGlmIChmSGlnaEJ5dGUuaXNTZXQoZmllbGRfMl9vcHRpb25zKSkgeworICAgICAgICAgICAgU3RyaW5nVXRpbC5wdXRVbmNvbXByZXNzZWRVbmljb2RlKGdldFZhbHVlKCksYXJyYXksb2Zmc2V0KzMpOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdVdGlsLnB1dENvbXByZXNzZWRVbmljb2RlKGdldFZhbHVlKCksYXJyYXksb2Zmc2V0KzMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRTaXplKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBmaWVsZF8xX3ZhbHVlLmxlbmd0aCgpICsgMzsKKyAgICAgICAgaWYgKGZIaWdoQnl0ZS5pc1NldChmaWVsZF8yX29wdGlvbnMpKSB7CisgICAgICAgICAgICByZXR1cm4gMipmaWVsZF8xX2xlbmd0aCszOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmllbGRfMV9sZW5ndGgrMzsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gIlwiIitnZXRWYWx1ZSgpKyJcIiI7CiAgICAgfQpAQCAtMTI2LDkgKzE1NSwxMCBAQAogCiAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAgICBTdHJpbmdQdGcgcHRnID0gbmV3IFN0cmluZ1B0ZygpOwotICAgICBwdGcuZmllbGRfMV92YWx1ZSA9IGZpZWxkXzFfdmFsdWU7CisgICAgIHB0Zy5maWVsZF8xX2xlbmd0aCA9IGZpZWxkXzFfbGVuZ3RoOworICAgICBwdGcuZmllbGRfMl9vcHRpb25zPWZpZWxkXzJfb3B0aW9uczsKKyAgICAgcHRnLmZpZWxkXzNfc3RyaW5nPWZpZWxkXzNfc3RyaW5nOwogICAgICByZXR1cm4gcHRnOwogICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvU3VidHJhY3RQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvU3VidHJhY3RQdGcuamF2YQppbmRleCAyYzU1ODhmLi5jZDlmYTVmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1N1YnRyYWN0UHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9TdWJ0cmFjdFB0Zy5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGE7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CiAKIC8qKgogICoKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICByZXR1cm4gMjsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhTaGVldFJlZmVyZW5jZXMgcmVmcykKKyAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKQogICAgIHsKICAgICAgICAgcmV0dXJuICItIjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1VuYXJ5TWludXNQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvVW5hcnlNaW51c1B0Zy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNjBkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1VuYXJ5TWludXNQdGcuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kCisgKiAgICAiQXBhY2hlIFBPSSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICAiQXBhY2hlIFBPSSIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuZm9ybXVsYTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKKworLyoqCisgKiBVbmFyeSBQbHVzIG9wZXJhdG9yCisgKiBkb2VzIG5vdCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIG9wZXJhbmQKKyAqIEBhdXRob3IgQXZpayBTZW5ndXB0YQorICovCisKK3B1YmxpYyBjbGFzcyBVbmFyeU1pbnVzUHRnIGV4dGVuZHMgT3BlcmF0aW9uUHRnCit7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgIFNJWkUgPSAxOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZSBzaWQgID0gMHgxMzsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlOVVMgPSAiLSI7CisKKyAgICAvKiogQ3JlYXRlcyBuZXcgQWRkUHRnICovCisKKyAgICBwdWJsaWMgVW5hcnlNaW51c1B0ZygpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBVbmFyeU1pbnVzUHRnKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0KQorICAgIHsKKworICAgICAgICAvLyBkb2Vzbid0IG5lZWQgYW55dGhpbmcKKyAgICB9CisgICAgCisgICAKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGJ5dGUgW10gYXJyYXksIGludCBvZmZzZXQpCisgICAgeworICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMCBdID0gc2lkOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gU0laRTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuVFlQRV9VTkFSWTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bWJlck9mT3BlcmFuZHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIC8qKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSBQdGcgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhXb3JrYm9vayBib29rKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIrIjsKKyAgICB9CisgICAgICAgCisgICAvKiogaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGZyb20gT3BlcmF0aW9uc1B0ZyovICAKKyAgICBwdWJsaWMgU3RyaW5nIHRvRm9ybXVsYVN0cmluZyhTdHJpbmdbXSBvcGVyYW5kcykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKE1JTlVTKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMF0pOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBieXRlIGdldERlZmF1bHRPcGVyYW5kQ2xhc3MoKSB7cmV0dXJuIFB0Zy5DTEFTU19WQUxVRTt9CisgICAgICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICByZXR1cm4gbmV3IFVuYXJ5UGx1c1B0ZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9VbmFyeVBsdXNQdGcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvVW5hcnlQbHVzUHRnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlYzFlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvVW5hcnlQbHVzUHRnLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCisgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIGFuZAorICogICAgIkFwYWNoZSBQT0kiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgIkFwYWNoZSBQT0kiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuV29ya2Jvb2s7CisKKy8qKgorICogVW5hcnkgUGx1cyBvcGVyYXRvcgorICogZG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBvcGVyYW5kCisgKiBAYXV0aG9yIEF2aWsgU2VuZ3VwdGEKKyAqLworCitwdWJsaWMgY2xhc3MgVW5hcnlQbHVzUHRnIGV4dGVuZHMgT3BlcmF0aW9uUHRnCit7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgIFNJWkUgPSAxOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYnl0ZSBzaWQgID0gMHgxMjsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREID0gIisiOworCisgICAgLyoqIENyZWF0ZXMgbmV3IEFkZFB0ZyAqLworCisgICAgcHVibGljIFVuYXJ5UGx1c1B0ZygpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBVbmFyeVBsdXNQdGcoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQpCisgICAgeworCisgICAgICAgIC8vIGRvZXNuJ3QgbmVlZCBhbnl0aGluZworICAgIH0KKyAgICAKKyAgIAorICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoYnl0ZSBbXSBhcnJheSwgaW50IG9mZnNldCkKKyAgICB7CisgICAgICAgIGFycmF5WyBvZmZzZXQgKyAwIF0gPSBzaWQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTSVpFOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5UWVBFX1VOQVJZOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZPcGVyYW5kcygpCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgCisgICAgLyoqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBmcm9tIFB0ZyAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCisgICAgeworICAgICAgICByZXR1cm4gIisiOworICAgIH0KKyAgICAgICAKKyAgIC8qKiBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSBPcGVyYXRpb25zUHRnKi8gIAorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFN0cmluZ1tdIG9wZXJhbmRzKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoQUREKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChvcGVyYW5kc1sgMF0pOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBieXRlIGdldERlZmF1bHRPcGVyYW5kQ2xhc3MoKSB7cmV0dXJuIFB0Zy5DTEFTU19WQUxVRTt9CisgICAgICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICByZXR1cm4gbmV3IFVuYXJ5UGx1c1B0ZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9VbmlvblB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9VbmlvblB0Zy5qYXZhCmluZGV4IGY4NDIzNTAuLmRlYTU5OTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvVW5pb25QdGcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9mb3JtdWxhL1VuaW9uUHRnLmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqIEBhdXRob3IgR2xlbiBTdGFtcG91bHR6aXMgKGdsZW5zIGF0IGFwYWNoZS5vcmcpCkBAIC05NSw3ICs5NSw3IEBACiAgICAgfQogCiAgICAgLyoqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBmcm9tIFB0ZyAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gIiwiOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL2Zvcm11bGEvVW5rbm93blB0Zy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Vbmtub3duUHRnLmphdmEKaW5kZXggMmRkMDY0OS4uNTZkMDNmNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Vbmtub3duUHRnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvZm9ybXVsYS9Vbmtub3duUHRnLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5mb3JtdWxhOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51dGlsLlNoZWV0UmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLldvcmtib29rOwogCiAvKioKICAqCkBAIC05NCw3ICs5NCw3IEBACiAgICAgICAgIHJldHVybiBzaXplOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFNoZWV0UmVmZXJlbmNlcyByZWZzKQorICAgIHB1YmxpYyBTdHJpbmcgdG9Gb3JtdWxhU3RyaW5nKFdvcmtib29rIGJvb2spCiAgICAgewogICAgICAgICByZXR1cm4gIlVOS05PV04iOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZDZWxsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGQ2VsbC5qYXZhCmluZGV4IDU5ODZiODQuLjdlYmQ3ZTMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZDZWxsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvSFNTRkNlbGwuamF2YQpAQCAtMzI2LDYgKzMyNiw3IEBACiAKICAgICAgICAgICAgIGNhc2UgQ0VMTF9UWVBFX0ZPUk1VTEEgOgogICAgICAgICAgICAgICAgIGNlbGxWYWx1ZSA9ICgoIEZvcm11bGFSZWNvcmRBZ2dyZWdhdGUgKSBjdmFsKS5nZXRGb3JtdWxhUmVjb3JkKCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZT0oKEZvcm11bGFSZWNvcmRBZ2dyZWdhdGUpIGN2YWwpLmdldFN0cmluZ1ZhbHVlKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQ0VMTF9UWVBFX0JPT0xFQU4gOgpAQCAtNzI2LDggKzcyNyw3IEBACiAKICAgICBwdWJsaWMgU3RyaW5nIGdldENlbGxGb3JtdWxhKCkgewogICAgICAgICAvL1dvcmtib29rLmN1cnJlbnRCb29rPWJvb2s7Ci0gICAgICAgIFNoZWV0UmVmZXJlbmNlcyByZWZzID0gYm9vay5nZXRTaGVldFJlZmVyZW5jZXMoKTsKLSAgICAgICAgU3RyaW5nIHJldHZhbCA9IEZvcm11bGFQYXJzZXIudG9Gb3JtdWxhU3RyaW5nKHJlZnMsICgoRm9ybXVsYVJlY29yZEFnZ3JlZ2F0ZSlyZWNvcmQpLmdldEZvcm11bGFSZWNvcmQoKS5nZXRQYXJzZWRFeHByZXNzaW9uKCkpOworICAgICAgICBTdHJpbmcgcmV0dmFsID0gRm9ybXVsYVBhcnNlci50b0Zvcm11bGFTdHJpbmcoYm9vaywgKChGb3JtdWxhUmVjb3JkQWdncmVnYXRlKXJlY29yZCkuZ2V0Rm9ybXVsYVJlY29yZCgpLmdldFBhcnNlZEV4cHJlc3Npb24oKSk7CiAgICAgICAgIC8vV29ya2Jvb2suY3VycmVudEJvb2s9bnVsbDsKICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICB9CkBAIC03OTgsNiArNzk4LDcgQEAKICAgICAvKioKICAgICAgKiBnZXQgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIGFzIGEgc3RyaW5nIC0gZm9yIG51bWVyaWMgY2VsbHMgd2UgdGhyb3cgYW4gZXhjZXB0aW9uLgogICAgICAqIEZvciBibGFuayBjZWxscyB3ZSByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgorICAgICAqIEZvciBmb3JtdWxhQ2VsbHMgdGhhdCBhcmUgbm90IHN0cmluZyBGb3JtdWxhcywgd2UgcmV0dXJuIGVtcHR5IFN0cmluZwogICAgICAqLwogCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdDZWxsVmFsdWUoKQpAQCAtODIxLDYgKzgyMiwxMCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiWW91IGNhbm5vdCBnZXQgYSBzdHJpbmcgdmFsdWUgZnJvbSBhbiBlcnJvciBjZWxsIik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGNlbGxUeXBlID09IENFTExfVFlQRV9GT1JNVUxBKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZ1ZhbHVlPT1udWxsKSByZXR1cm4gIiI7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvSFNTRkZvbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZGb250LmphdmEKaW5kZXggYmJkZTQ2YS4uNjFiOGM2MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvSFNTRkZvbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGRm9udC5qYXZhCkBAIC04NSw3ICs4NSw3IEBACiAgICAgICogTm9ybWFsIGJvbGRuZXNzIChub3QgYm9sZCkKICAgICAgKi8KIAotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgIEJPTERXRUlHSFRfTk9STUFMICAgPSAxOTA7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCAgQk9MRFdFSUdIVF9OT1JNQUwgICA9IDB4MTkwOwogCiAgICAgLyoqCiAgICAgICogQm9sZCBib2xkbmVzcyAoYm9sZCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZOYW1lLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGTmFtZS5qYXZhCmluZGV4IDBmNzE3ODIuLjhjMTg2MzQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZOYW1lLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvSFNTRk5hbWUuamF2YQpAQCAtMTIzLDggKzEyMyw3IEBACiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZSgpIHsKICAgICAgICAgU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgU2hlZXRSZWZlcmVuY2VzIHJlZnMgPSBib29rLmdldFNoZWV0UmVmZXJlbmNlcygpOwotICAgICAgICByZXN1bHQgPSBuYW1lLmdldEFyZWFSZWZlcmVuY2UocmVmcyk7CisgICAgICAgIHJlc3VsdCA9IG5hbWUuZ2V0QXJlYVJlZmVyZW5jZShib29rKTsKIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTE2Nyw0ICsxNjYsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGUGFsZXR0ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvSFNTRlBhbGV0dGUuamF2YQppbmRleCA2YzVkMGVlLi44NjM1MzNkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGUGFsZXR0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZQYWxldHRlLmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICBmb3IgKHNob3J0IGkgPSAoc2hvcnQpIFBhbGV0dGVSZWNvcmQuRklSU1RfQ09MT1JfSU5ERVg7IGIgIT0gbnVsbDsKICAgICAgICAgICAgIGIgPSBwYWxldHRlLmdldENvbG9yKCsraSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChiWzBdID09IHJlZCAmJiBiWzFdID09IGJsdWUgJiYgYlsyXSA9PSBncmVlbikKKyAgICAgICAgICAgIGlmIChiWzBdID09IHJlZCAmJiBiWzFdID09IGdyZWVuICYmIGJbMl0gPT0gYmx1ZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEN1c3RvbUNvbG9yKGksIGIpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvSFNTRlNoZWV0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGU2hlZXQuamF2YQppbmRleCBhMWE2ZTc5Li45ZmU2OTE3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGU2hlZXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGU2hlZXQuamF2YQpAQCAtNTksMTcgKzU5LDI1IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YubW9kZWwuU2hlZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5tb2RlbC5Xb3JrYm9vazsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC4qOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLkNlbGxWYWx1ZVJlY29yZEludGVyZmFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5IQ2VudGVyUmVjb3JkOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLlJlY29yZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5Sb3dSZWNvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuU0NMUmVjb3JkOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLlZDZW50ZXJSZWNvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuV1NCb29sUmVjb3JkOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLldpbmRvd1R3b1JlY29yZDsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuUmVnaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuUE9JTG9nRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLlBPSUxvZ2dlcjsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQogLyoqCiAgKiBIaWdoIGxldmVsIHJlcHJlc2VudGF0aW9uIG9mIGEgd29ya3NoZWV0LgogICogQGF1dGhvciAgQW5kcmV3IEMuIE9saXZlciAoYWNvbGl2ZXIgYXQgYXBhY2hlIGRvdCBvcmcpCkBAIC04NjUsNiArODczLDIyIEBACiAgICAgewogICAgICAgICBnZXRTaGVldCgpLnNldE1hcmdpbiggbWFyZ2luLCBzaXplICk7CiAgICAgfQorICAgIAorCS8qKgorCSAqIEFuc3dlciB3aGV0aGVyIHByb3RlY3Rpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorCSAqIEByZXR1cm4gdHJ1ZSA9PiBwcm90ZWN0aW9uIGVuYWJsZWQ7IGZhbHNlID0+IHByb3RlY3Rpb24gZGlzYWJsZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBnZXRQcm90ZWN0KCkgeworCQlyZXR1cm4gZ2V0U2hlZXQoKS5nZXRQcm90ZWN0KCkuZ2V0UHJvdGVjdCgpOwkJCisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcHJvdGVjdGlvbiBvbiBlbmFibGVkIG9yIGRpc2FibGVkCisJICogQHBhcmFtIHByb3RlY3QgdHJ1ZSA9PiBwcm90ZWN0aW9uIGVuYWJsZWQ7IGZhbHNlID0+IHByb3RlY3Rpb24gZGlzYWJsZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm90ZWN0KGJvb2xlYW4gcHJvdGVjdCkgeworCQlnZXRTaGVldCgpLmdldFByb3RlY3QoKS5zZXRQcm90ZWN0KHByb3RlY3QpOwkJCisJfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgem9vbSBtYWduaWNhdGlvbiBmb3IgdGhlIHNoZWV0LiAgVGhlIHpvb20gaXMgZXhwcmVzc2VkIGFzIGEKQEAgLTg4Nyw2ICs5MTEsNTAgQEAKICAgICAgICAgZ2V0U2hlZXQoKS5zZXRTQ0xSZWNvcmQoc2NsUmVjb3JkKTsKICAgICB9CiAKKwkvKioKKwkgKiBTaGlmdHMgdGhlIG1lcmdlZCByZWdpb25zIGxlZnQgb3IgcmlnaHQgZGVwZW5kaW5nIG9uIG1vZGUKKwkgKiA8cD4KKwkgKiBUT0RPOiBNT0RFICwgdGhpcyBpcyBvbmx5IHJvdyBzcGVjaWZpYworCSAqIEBwYXJhbSBzdGFydFJvdworCSAqIEBwYXJhbSBlbmRSb3cKKwkgKiBAcGFyYW0gbgorCSAqIEBwYXJhbSBpc1JvdworCSAqLworCXByb3RlY3RlZCB2b2lkIHNoaWZ0TWVyZ2VkKGludCBzdGFydFJvdywgaW50IGVuZFJvdywgaW50IG4sIGJvb2xlYW4gaXNSb3cpIHsKKwkJTGlzdCBzaGlmdGVkUmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJLy9tb3ZlIG1lcmdlZCByZWdpb25zIGNvbXBsZXRlbHkgaWYgdGhleSBmYWxsIHdpdGhpbiB0aGUgbmV3IHJlZ2lvbiBib3VuZGFyaWVzIHdoZW4gdGhleSBhcmUgc2hpZnRlZAorCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZ2V0TnVtTWVyZ2VkUmVnaW9ucygpOyBpKyspIHsKKwkJCSBSZWdpb24gbWVyZ2VkID0gdGhpcy5nZXRNZXJnZWRSZWdpb25BdChpKTsKKyAgICAgICAgCQkKKwkJCSBib29sZWFuIGluU3RhcnQgPSAobWVyZ2VkLmdldFJvd0Zyb20oKSA+PSBzdGFydFJvdyB8fCBtZXJnZWQuZ2V0Um93VG8oKSA+PSBzdGFydFJvdyk7CisJCQkgYm9vbGVhbiBpbkVuZCA9ICAobWVyZ2VkLmdldFJvd1RvKCkgPD0gZW5kUm93IHx8IG1lcmdlZC5nZXRSb3dGcm9tKCkgPD0gZW5kUm93KTsKKyAgICAgICAgCQkKKwkJCSAvL2RvbnQgY2hlY2sgaWYgaXQncyBub3Qgd2l0aGluIHRoZSBzaGlmdGVkIGFyZWEKKwkJCSBpZiAoISAoaW5TdGFydCAmJiBpbkVuZCkpIGNvbnRpbnVlOworICAgICAgICAJCQorCQkJIC8vb25seSBzaGlmdCBpZiB0aGUgcmVnaW9uIG91dHNpZGUgdGhlIHNoaWZ0ZWQgcm93cyBpcyBub3QgbWVyZ2VkIHRvbyAgICAgICAgCSAgICAgICAgICAgCQkKKwkJCSBpZiAoIW1lcmdlZC5jb250YWlucyhzdGFydFJvdy0xLCAoc2hvcnQpMCkgJiYgIW1lcmdlZC5jb250YWlucyhlbmRSb3crMSwgKHNob3J0KTApKXsKKwkJCQkgbWVyZ2VkLnNldFJvd0Zyb20obWVyZ2VkLmdldFJvd0Zyb20oKStuKTsJCQkJCQorCQkJCSBtZXJnZWQuc2V0Um93VG8obWVyZ2VkLmdldFJvd1RvKCkrbik7CisJCQkJIC8vaGF2ZSB0byByZW1vdmUvYWRkIGl0IGJhY2sKKwkJCQkgc2hpZnRlZFJlZ2lvbnMuYWRkKG1lcmdlZCk7CisJCQkJIHRoaXMucmVtb3ZlTWVyZ2VkUmVnaW9uKGkpOworCQkJCSBpID0gaSAtMTsgLy8gd2UgaGF2ZSB0byBiYWNrIHVwIG5vdyBzaW5jZSB3ZSByZW1vdmVkIG9uZQorCQkJCQkKKwkJCSB9CisgICAgICAgIAkJCisJCX0KKwkJCisJCS8vcmVhZGQgc28gaXQgZG9lc24ndCBnZXQgc2hpZnRlZCBhZ2FpbgorCQlJdGVyYXRvciBpdGVyYXRvciA9IHNoaWZ0ZWRSZWdpb25zLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKWl0ZXJhdG9yLm5leHQoKTsKKwkJCQorCQkJdGhpcy5hZGRNZXJnZWRSZWdpb24ocmVnaW9uKTsKKwkJfQorCQkKKwl9CisKICAgICAvKioKICAgICAgKiBTaGlmdHMgcm93cyBiZXR3ZWVuIHN0YXJ0Um93IGFuZCBlbmRSb3cgbiBudW1iZXIgb2Ygcm93cy4KICAgICAgKiBJZiB5b3UgdXNlIGEgbmVnYXRpdmUgbnVtYmVyLCBpdCB3aWxsIHNoaWZ0IHJvd3MgdXAuCkBAIC04OTQsMTkgKzk2MiwyNSBAQAogICAgICAqCiAgICAgICogQ2FsbHMgc2hpZnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csIG4sIGZhbHNlLCBmYWxzZSk7CiAgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBZGRpdGlvbmFsbHkgc2hpZnRzIG1lcmdlZCByZWdpb25zIHRoYXQgYXJlIGNvbXBsZXRlbHkgZGVmaW5lZCBpbiB0aGVzZQorICAgICAqIHJvd3MgKGllLiBtZXJnZWQgMiBjZWxscyBvbiBhIHJvdyB0byBiZSBzaGlmdGVkKS4KICAgICAgKiBAcGFyYW0gc3RhcnRSb3cgdGhlIHJvdyB0byBzdGFydCBzaGlmdGluZwogICAgICAqIEBwYXJhbSBlbmRSb3cgdGhlIHJvdyB0byBlbmQgc2hpZnRpbmcKICAgICAgKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gc2hpZnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaGlmdFJvd3MoIGludCBzdGFydFJvdywgaW50IGVuZFJvdywgaW50IG4gKSB7Ci0Jc2hpZnRSb3dzKHN0YXJ0Um93LCBlbmRSb3csIG4sIGZhbHNlLCBmYWxzZSk7CisJCXNoaWZ0Um93cyhzdGFydFJvdywgZW5kUm93LCBuLCBmYWxzZSwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNoaWZ0cyByb3dzIGJldHdlZW4gc3RhcnRSb3cgYW5kIGVuZFJvdyBuIG51bWJlciBvZiByb3dzLgogICAgICAqIElmIHlvdSB1c2UgYSBuZWdhdGl2ZSBudW1iZXIsIGl0IHdpbGwgc2hpZnQgcm93cyB1cC4KICAgICAgKiBDb2RlIGVuc3VyZXMgdGhhdCByb3dzIGRvbid0IHdyYXAgYXJvdW5kCi0gICAgICoKKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBBZGRpdGlvbmFsbHkgc2hpZnRzIG1lcmdlZCByZWdpb25zIHRoYXQgYXJlIGNvbXBsZXRlbHkgZGVmaW5lZCBpbiB0aGVzZQorICAgICAqIHJvd3MgKGllLiBtZXJnZWQgMiBjZWxscyBvbiBhIHJvdyB0byBiZSBzaGlmdGVkKS4KICAgICAgKiBAcGFyYW0gc3RhcnRSb3cgdGhlIHJvdyB0byBzdGFydCBzaGlmdGluZwogICAgICAqIEBwYXJhbSBlbmRSb3cgdGhlIHJvdyB0byBlbmQgc2hpZnRpbmcKICAgICAgKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gc2hpZnQKQEAgLTkyOCw2ICsxMDAyLDkgQEAKICAgICAgICAgICAgIGUgPSBzdGFydFJvdzsKICAgICAgICAgICAgIGluYyA9IC0xOwogICAgICAgICB9CisKKwkJCXNoaWZ0TWVyZ2VkKHN0YXJ0Um93LCBlbmRSb3csIG4sIHRydWUpOyAgICAgICAgCisgICAgICAgIAogICAgICAgICBmb3IgKCBpbnQgcm93TnVtID0gczsgcm93TnVtID49IHN0YXJ0Um93ICYmIHJvd051bSA8PSBlbmRSb3cgJiYgcm93TnVtID49IDAgJiYgcm93TnVtIDwgNjU1MzY7IHJvd051bSArPSBpbmMgKQogICAgICAgICB7CiAgICAgICAgICAgICBIU1NGUm93IHJvdyA9IGdldFJvdyggcm93TnVtICk7CkBAIC05MzcsNiArMTAxNCw5IEBACiAJICAgIAogICAgICAgICAgICAgSFNTRkNlbGwgY2VsbDsKIAorCQkJCisKKwogCSAgICAvLyBSZW1vdmVzIHRoZSBjZWxscyBiZWZvcmUgb3ZlciB3cml0dGluZyB0aGVtLgogICAgICAgICAgICAgZm9yICggc2hvcnQgY29sID0gcm93MlJlcGxhY2UuZ2V0Rmlyc3RDZWxsTnVtKCk7IGNvbCA8PSByb3cyUmVwbGFjZS5nZXRMYXN0Q2VsbE51bSgpOyBjb2wrKyApCiAgICAgICAgICAgICB7CkBAIC0xMDIxLDUgKzExMDEsNTEgQEAKICAgICAgICAgZ2V0U2hlZXQoKS5jcmVhdGVTcGxpdFBhbmUoIHhTcGxpdFBvcywgeVNwbGl0UG9zLCB0b3BSb3csIGxlZnRtb3N0Q29sdW1uLCBhY3RpdmVQYW5lICk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBncmlkbGluZXMgYXJlIHNob3duIGluIGEgdmlld2VyLgorICAgICAqIEBwYXJhbSBzaG93IHdoZXRoZXIgdG8gc2hvdyBncmlkbGluZXMgb3Igbm90CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheUdyaWRsaW5lcyhib29sZWFuIHNob3cpIHsKKyAgICAgICAgc2hlZXQuc2V0RGlzcGxheUdyaWRsaW5lcyhzaG93KTsKKyAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIGdyaWRsaW5lcyBhcmUgZGlzcGxheWVkLgorICAgICAqIEByZXR1cm4gd2hldGhlciBncmlkbGluZXMgYXJlIGRpc3BsYXllZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheUdyaWRsaW5lcygpIHsKKwlyZXR1cm4gc2hlZXQuaXNEaXNwbGF5R3JpZGxpbmVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBmb3JtdWxhcyBhcmUgc2hvd24gaW4gYSB2aWV3ZXIuCisgICAgICogQHBhcmFtIHNob3cgd2hldGhlciB0byBzaG93IGZvcm11bGFzIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlGb3JtdWxhcyhib29sZWFuIHNob3cpIHsKKyAgICAgICAgc2hlZXQuc2V0RGlzcGxheUZvcm11bGFzKHNob3cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgZm9ybXVsYXMgYXJlIGRpc3BsYXllZC4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgZm9ybXVsYXMgYXJlIGRpc3BsYXllZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheUZvcm11bGFzKCkgeworCXJldHVybiBzaGVldC5pc0Rpc3BsYXlGb3JtdWxhcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgUm93Q29sSGVhZGluZ3MgYXJlIHNob3duIGluIGEgdmlld2VyLgorICAgICAqIEBwYXJhbSBzaG93IHdoZXRoZXIgdG8gc2hvdyBSb3dDb2xIZWFkaW5ncyBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5Um93Q29sSGVhZGluZ3MoYm9vbGVhbiBzaG93KSB7CisgICAgICAgIHNoZWV0LnNldERpc3BsYXlSb3dDb2xIZWFkaW5ncyhzaG93KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIFJvd0NvbEhlYWRpbmdzIGFyZSBkaXNwbGF5ZWQuCisgICAgICogQHJldHVybiB3aGV0aGVyIFJvd0NvbEhlYWRpbmdzIGFyZSBkaXNwbGF5ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc3BsYXlSb3dDb2xIZWFkaW5ncygpIHsKKwlyZXR1cm4gc2hlZXQuaXNEaXNwbGF5Um93Q29sSGVhZGluZ3MoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9IU1NGV29ya2Jvb2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZXb3JrYm9vay5qYXZhCmluZGV4IDg0MjBhYTYuLmMxYmZiZDMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZXb3JrYm9vay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL0hTU0ZXb3JrYm9vay5qYXZhCkBAIC0xNDcsNiArMTQ3LDE0IEBACiAgICAgICogbWVtb3J5LgogICAgICAqLwogICAgIHByaXZhdGUgUE9JRlNGaWxlU3lzdGVtIHBvaWZzOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBkYXRhIGZvcm1hdHRlciBzbyB0aGF0IGFsbAorICAgICAqIGNyZWF0ZURhdGFGb3JtYXR0ZXIgY2FsbHMgcmV0dXJuIHRoZSBzYW1lIG9uZSBmb3IgYSBnaXZlbgorICAgICAqIGJvb2suICBUaGlzIGVuc3VyZXMgdGhhdCB1cGRhdGVzIGZyb20gb25lIHBsYWNlcyBpcyB2aXNpYmxlCisgICAgICogc29tZXBsYWNlIGVsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBIU1NGRGF0YUZvcm1hdCBmb3JtYXR0ZXI7CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgUE9JTG9nZ2VyIGxvZyA9IFBPSUxvZ0ZhY3RvcnkuZ2V0TG9nZ2VyKEhTU0ZXb3JrYm9vay5jbGFzcyk7CiAKQEAgLTI3Myw3ICsyODEsOSBAQAogICAgIAogICAgICAKICAgICAvKioKLSAgICAgKiBzZXQgdGhlIHNoZWV0IG5hbWUuCisgICAgICogc2V0IHRoZSBzaGVldCBuYW1lLiAKKyAgICAgKiBXaWxsIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBncmVhdGVyIHRoYW4gMzEgY2hhcnMKKyAgICAgKiBvciBjb250YWlucyAvXD8qW10KICAgICAgKiBAcGFyYW0gc2hlZXQgbnVtYmVyICgwIGJhc2VkKQogICAgICAqIEBwYXJhbSBzaGVldCBuYW1lCiAgICAgICovCkBAIC0zNzQsNyArMzg0LDExIEBACiAgICAgICAgIHdpbmRvd1R3by5zZXRQYWdlZChzaGVldHMuc2l6ZSgpID09IDEpOwogCiAgICAgICAgIHNoZWV0cy5hZGQoY2xvbmVkU2hlZXQpOwotICAgICAgICB3b3JrYm9vay5zZXRTaGVldE5hbWUoc2hlZXRzLnNpemUoKS0xLCBzcmNOYW1lKyJbMV0iKTsKKyAgICAgICAgaWYgKHNyY05hbWUubGVuZ3RoKCk8MjgpIHsKKyAgICAgICAgICAgIHdvcmtib29rLnNldFNoZWV0TmFtZShzaGVldHMuc2l6ZSgpLTEsIHNyY05hbWUrIigyKSIpOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICB3b3JrYm9vay5zZXRTaGVldE5hbWUoc2hlZXRzLnNpemUoKS0xLHNyY05hbWUuc3Vic3RyaW5nKDAsMjgpKyIoMikiKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gY2xvbmVkU2hlZXQ7CiAgICAgICB9CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTg5MCw3ICs5MDQsNyBAQAogCQlpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJLy9hZGRpbmcgb25lIGhlcmUgYmVjYXVzZSAwIGluZGljYXRlcyBhIGdsb2JhbCBuYW1lZCByZWdpb247IGRvZXNudCBtYWtlIHNlbnNlIGZvciBwcmludCBhcmVhcwogICAgCi0JCXJldHVybiBuYW1lLmdldEFyZWFSZWZlcmVuY2Uod29ya2Jvb2suZ2V0U2hlZXRSZWZlcmVuY2VzKCkpOworCQlyZXR1cm4gbmFtZS5nZXRBcmVhUmVmZXJlbmNlKHdvcmtib29rKTsKIAl9ICAgIAogICAgIAogICAgIC8qKgpAQCAtOTQ1LDEzICs5NTksMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEhTU0ZEYXRhRm9ybWF0LgorICAgICAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIEhTU0ZEYXRhRm9ybWF0IGZvciB0aGlzIHdvcmtib29rLgogICAgICAqIEByZXR1cm4gdGhlIEhTU0ZEYXRhRm9ybWF0IG9iamVjdAogICAgICAqIEBzZWUgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuRm9ybWF0UmVjb3JkCiAgICAgICogQHNlZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5SZWNvcmQKICAgICAgKi8KICAgICBwdWJsaWMgSFNTRkRhdGFGb3JtYXQgY3JlYXRlRGF0YUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIU1NGRGF0YUZvcm1hdCh3b3JrYm9vayk7CisJaWYgKGZvcm1hdHRlciA9PSBudWxsKQorCSAgICBmb3JtYXR0ZXIgPSBuZXcgSFNTRkRhdGFGb3JtYXQod29ya2Jvb2spOworCXJldHVybiBmb3JtYXR0ZXI7CiAgICAgfQogCQogICAgIC8qKiByZW1vdmUgdGhlIG5hbWVkIHJhbmdlIGJ5IGhpcyBuYW1lCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL0RpcmVjdG9yeUVudHJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL0RpcmVjdG9yeUVudHJ5LmphdmEKaW5kZXggMTM1YTJiYS4uYTg1ZTdlOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvcG9pZnMvZmlsZXN5c3RlbS9EaXJlY3RvcnlFbnRyeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3BvaWZzL2ZpbGVzeXN0ZW0vRGlyZWN0b3J5RW50cnkuamF2YQpAQCAtNTksNiArNTksOCBAQAogCiBpbXBvcnQgamF2YS51dGlsLio7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLkNsYXNzSUQ7CisKIC8qKgogICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBtZXRob2RzIHNwZWNpZmljIHRvIERpcmVjdG9yeSBvYmplY3RzCiAgKiBtYW5hZ2VkIGJ5IGEgRmlsZXN5c3RlbSBpbnN0YW5jZS4KQEAgLTE2MCw1ICsxNjIsMjAgQEAKIAogICAgIHB1YmxpYyBEaXJlY3RvcnlFbnRyeSBjcmVhdGVEaXJlY3RvcnkoZmluYWwgU3RyaW5nIG5hbWUpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0b3JhZ2UgY2xzaWQgb2YgdGhlIGRpcmVjdG9yeSBlbnRyeQorICAgICAqCisgICAgICogQHJldHVybiBzdG9yYWdlIENsYXNzIElECisgICAgICovCisgICAgcHVibGljIENsYXNzSUQgZ2V0U3RvcmFnZUNsc2lkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdG9yYWdlIGNsc2lkIGZvciB0aGUgZGlyZWN0b3J5IGVudHJ5CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xzaWRTdG9yYWdlIHN0b3JhZ2UgQ2xhc3MgSUQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9yYWdlQ2xzaWQoQ2xhc3NJRCBjbHNpZFN0b3JhZ2UpOworCiB9ICAgLy8gZW5kIHB1YmxpYyBpbnRlcmZhY2UgRGlyZWN0b3J5RW50cnkKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvcG9pZnMvZmlsZXN5c3RlbS9EaXJlY3RvcnlOb2RlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL0RpcmVjdG9yeU5vZGUuamF2YQppbmRleCBkN2M2NzBjLi5mZWViNzQ3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL0RpcmVjdG9yeU5vZGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL0RpcmVjdG9yeU5vZGUuamF2YQpAQCAtNTksNiArNTksNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLio7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLkNsYXNzSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kucG9pZnMuZGV2LlBPSUZTVmlld2FibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kucG9pZnMucHJvcGVydHkuRGlyZWN0b3J5UHJvcGVydHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kucG9pZnMucHJvcGVydHkuRG9jdW1lbnRQcm9wZXJ0eTsKQEAgLTM0Niw2ICszNDcsMjYgQEAKICAgICAgICAgcmV0dXJuIHJ2YWw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3RvcmFnZSBjbHNpZCBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0b3JhZ2UgQ2xhc3MgSUQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NJRCBnZXRTdG9yYWdlQ2xzaWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5KCkuZ2V0U3RvcmFnZUNsc2lkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3RvcmFnZSBjbHNpZCBmb3IgdGhlIGRpcmVjdG9yeSBlbnRyeQorICAgICAqCisgICAgICogQHBhcmFtIGNsc2lkU3RvcmFnZSBzdG9yYWdlIENsYXNzIElECisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmFnZUNsc2lkKENsYXNzSUQgY2xzaWRTdG9yYWdlKQorICAgIHsKKyAgICAgICAgZ2V0UHJvcGVydHkoKS5zZXRTdG9yYWdlQ2xzaWQoY2xzaWRTdG9yYWdlKTsKKyAgICB9CisKICAgICAvKiAqKioqKioqKioqICBFTkQgIGltcGxlbWVudGF0aW9uIG9mIERpcmVjdG9yeUVudHJ5ICoqKioqKioqKiogKi8KICAgICAvKiAqKioqKioqKioqIFNUQVJUIGltcGxlbWVudGF0aW9uIG9mIEVudHJ5ICoqKioqKioqKiogKi8KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvcG9pZnMvZmlsZXN5c3RlbS9QT0lGU0ZpbGVTeXN0ZW0uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3BvaWZzL2ZpbGVzeXN0ZW0vUE9JRlNGaWxlU3lzdGVtLmphdmEKaW5kZXggM2QxNzNhYS4uM2E2MmUzZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvcG9pZnMvZmlsZXN5c3RlbS9QT0lGU0ZpbGVTeXN0ZW0uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL1BPSUZTRmlsZVN5c3RlbS5qYXZhCkBAIC00MjMsNiArNDIzLDggQEAKICAgICAgICAgICAgICAgICBEaXJlY3RvcnlOb2RlIG5ld19kaXIgPQogICAgICAgICAgICAgICAgICAgICAoIERpcmVjdG9yeU5vZGUgKSBwYXJlbnQuY3JlYXRlRGlyZWN0b3J5KG5hbWUpOwogCisgICAgICAgICAgICAgICAgbmV3X2Rpci5zZXRTdG9yYWdlQ2xzaWQoIHByb3BlcnR5LmdldFN0b3JhZ2VDbHNpZCgpICk7CisKICAgICAgICAgICAgICAgICBwcm9jZXNzUHJvcGVydGllcygKICAgICAgICAgICAgICAgICAgICAgc21hbGxfYmxvY2tzLCBiaWdfYmxvY2tzLAogICAgICAgICAgICAgICAgICAgICAoKCBEaXJlY3RvcnlQcm9wZXJ0eSApIHByb3BlcnR5KS5nZXRDaGlsZHJlbigpLCBuZXdfZGlyKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3BvaWZzL3Byb3BlcnR5L1Byb3BlcnR5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9wcm9wZXJ0eS9Qcm9wZXJ0eS5qYXZhCmluZGV4IDY4MTFhNzIuLmMwOWMyNTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3BvaWZzL3Byb3BlcnR5L1Byb3BlcnR5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvcG9pZnMvcHJvcGVydHkvUHJvcGVydHkuamF2YQpAQCAtNTksNiArNTksOCBAQAogCiBpbXBvcnQgamF2YS51dGlsLio7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLkNsYXNzSUQ7CisKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5wb2lmcy5jb21tb24uUE9JRlNDb25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kucG9pZnMuZGV2LlBPSUZTVmlld2FibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5CeXRlRmllbGQ7CkBAIC04Nyw2ICs4OSw4IEBACiAgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50ICAgIF9wcmV2aW91c19wcm9wZXJ0eV9vZmZzZXQgPSAweDQ0OwogICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGludCAgICBfbmV4dF9wcm9wZXJ0eV9vZmZzZXQgICAgID0gMHg0ODsKICAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgICAgX2NoaWxkX3Byb3BlcnR5X29mZnNldCAgICA9IDB4NEM7CisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50ICAgIF9zdG9yYWdlX2Nsc2lkX29mZnNldCAgICAgPSAweDUwOworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGludCAgICBfdXNlcl9mbGFnc19vZmZzZXQgICAgICAgID0gMHg2MDsKICAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgICAgX3NlY29uZHNfMV9vZmZzZXQgICAgICAgICA9IDB4NjQ7CiAgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50ICAgIF9kYXlzXzFfb2Zmc2V0ICAgICAgICAgICAgPSAweDY4OwogICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGludCAgICBfc2Vjb25kc18yX29mZnNldCAgICAgICAgID0gMHg2QzsKQEAgLTEwNyw2ICsxMTEsOCBAQAogICAgIHByaXZhdGUgSW50ZWdlckZpZWxkICAgICAgICBfcHJldmlvdXNfcHJvcGVydHk7CiAgICAgcHJpdmF0ZSBJbnRlZ2VyRmllbGQgICAgICAgIF9uZXh0X3Byb3BlcnR5OwogICAgIHByaXZhdGUgSW50ZWdlckZpZWxkICAgICAgICBfY2hpbGRfcHJvcGVydHk7CisgICAgcHJpdmF0ZSBDbGFzc0lEICAgICAgICAgICAgIF9zdG9yYWdlX2Nsc2lkOworICAgIHByaXZhdGUgSW50ZWdlckZpZWxkICAgICAgICBfdXNlcl9mbGFnczsKICAgICBwcml2YXRlIEludGVnZXJGaWVsZCAgICAgICAgX3NlY29uZHNfMTsKICAgICBwcml2YXRlIEludGVnZXJGaWVsZCAgICAgICAgX2RheXNfMTsKICAgICBwcml2YXRlIEludGVnZXJGaWVsZCAgICAgICAgX3NlY29uZHNfMjsKQEAgLTEzNiw2ICsxNDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9OT19JTkRFWCwgX3Jhd19kYXRhKTsKICAgICAgICAgX2NoaWxkX3Byb3BlcnR5ICAgID0gbmV3IEludGVnZXJGaWVsZChfY2hpbGRfcHJvcGVydHlfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9OT19JTkRFWCwgX3Jhd19kYXRhKTsKKyAgICAgICAgX3N0b3JhZ2VfY2xzaWQgICAgID0gbmV3IENsYXNzSUQoX3Jhd19kYXRhLF9zdG9yYWdlX2Nsc2lkX29mZnNldCk7CisgICAgICAgIF91c2VyX2ZsYWdzICAgICAgICA9IG5ldyBJbnRlZ2VyRmllbGQoX3VzZXJfZmxhZ3Nfb2Zmc2V0LCAwLCBfcmF3X2RhdGEpOwogICAgICAgICBfc2Vjb25kc18xICAgICAgICAgPSBuZXcgSW50ZWdlckZpZWxkKF9zZWNvbmRzXzFfb2Zmc2V0LCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdfZGF0YSk7CiAgICAgICAgIF9kYXlzXzEgICAgICAgICAgICA9IG5ldyBJbnRlZ2VyRmllbGQoX2RheXNfMV9vZmZzZXQsIDAsIF9yYXdfZGF0YSk7CkBAIC0xNzMsNiArMTgxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmF3X2RhdGEpOwogICAgICAgICBfY2hpbGRfcHJvcGVydHkgICAgPSBuZXcgSW50ZWdlckZpZWxkKF9jaGlsZF9wcm9wZXJ0eV9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd19kYXRhKTsKKyAgICAgICAgX3N0b3JhZ2VfY2xzaWQgICAgID0gbmV3IENsYXNzSUQoX3Jhd19kYXRhLF9zdG9yYWdlX2Nsc2lkX29mZnNldCk7CisgICAgICAgIF91c2VyX2ZsYWdzICAgICAgICA9IG5ldyBJbnRlZ2VyRmllbGQoX3VzZXJfZmxhZ3Nfb2Zmc2V0LCAwLCBfcmF3X2RhdGEpOwogICAgICAgICBfc2Vjb25kc18xICAgICAgICAgPSBuZXcgSW50ZWdlckZpZWxkKF9zZWNvbmRzXzFfb2Zmc2V0LCBfcmF3X2RhdGEpOwogICAgICAgICBfZGF5c18xICAgICAgICAgICAgPSBuZXcgSW50ZWdlckZpZWxkKF9kYXlzXzFfb2Zmc2V0LCBfcmF3X2RhdGEpOwogICAgICAgICBfc2Vjb25kc18yICAgICAgICAgPSBuZXcgSW50ZWdlckZpZWxkKF9zZWNvbmRzXzJfb2Zmc2V0LCBfcmF3X2RhdGEpOwpAQCAtMjk2LDExICszMDYsMjAgQEAKICAgICBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpOwogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3RvcmFnZSBjbHNpZCwgd2hpY2ggaXMgdGhlIENsYXNzIElEIG9mIGEgQ09NIG9iamVjdCB3aGljaAorICAgICAqICAgcmVhZHMgYW5kIHdyaXRlcyB0aGlzIHN0cmVhbQorICAgICAqIEByZXR1cm4gc3RvcmFnZSBDbGFzcyBJRCBmb3IgdGhpcyBwcm9wZXJ0eSBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NJRCBnZXRTdG9yYWdlQ2xzaWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9zdG9yYWdlX2Nsc2lkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB0aGUgbmFtZTsgc2lsZW50bHkgdHJ1bmNhdGVzIHRoZSBuYW1lIGlmIGl0J3MgdG9vIGxvbmcuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG5hbWUKICAgICAgKi8KLQogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpCiAgICAgewogICAgICAgICBjaGFyW10gY2hhcl9hcnJheSA9IG5hbWUudG9DaGFyQXJyYXkoKTsKQEAgLTMyOCw2ICszNDcsMjAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdG9yYWdlIGNsYXNzIElEIGZvciB0aGlzIHByb3BlcnR5IHN0cmVhbS4gVGhpcyBpcyB0aGUgQ2xhc3MgSUQKKyAgICAgKiAgIG9mIHRoZSBDT00gb2JqZWN0IHdoaWNoIGNhbiByZWFkIGFuZCB3cml0ZSB0aGlzIHByb3BlcnR5IHN0cmVhbQorICAgICAqIEBwYXJhbSBjbHNpZFN0b3JhZ2UgU3RvcmFnZSBDbGFzcyBJRAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JhZ2VDbHNpZCggQ2xhc3NJRCBjbHNpZFN0b3JhZ2UpCisgICAgeworICAgICAgICBfc3RvcmFnZV9jbHNpZCA9IGNsc2lkU3RvcmFnZTsKKyAgICAgICAgaWYoIGNsc2lkU3RvcmFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBBcnJheXMuZmlsbCggX3Jhd19kYXRhLCBfc3RvcmFnZV9jbHNpZF9vZmZzZXQsIF9zdG9yYWdlX2Nsc2lkX29mZnNldCArIENsYXNzSUQuTEVOR1RILCAoYnl0ZSkgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbHNpZFN0b3JhZ2Uud3JpdGUoIF9yYXdfZGF0YSwgX3N0b3JhZ2VfY2xzaWRfb2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKICAgICAgKiBTZXQgdGhlIHByb3BlcnR5IHR5cGUuIE1ha2VzIG5vIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIHZhbHVlLgogICAgICAqCiAgICAgICogQHBhcmFtIHByb3BlcnR5VHlwZSB0aGUgcHJvcGVydHkgdHlwZSAocm9vdCwgZmlsZSwgZGlyZWN0b3J5KQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvcG9pZnMvc3RvcmFnZS9Eb2N1bWVudEJsb2NrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9zdG9yYWdlL0RvY3VtZW50QmxvY2suamF2YQppbmRleCBmNmQwZDkyLi43YWYzNDg3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9zdG9yYWdlL0RvY3VtZW50QmxvY2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9zdG9yYWdlL0RvY3VtZW50QmxvY2suamF2YQpAQCAtNjIsNiArNjIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5wb2lmcy5jb21tb24uUE9JRlNDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kudXRpbC5JT1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuSW50ZWdlckZpZWxkOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuTGl0dGxlRW5kaWFuOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuTGl0dGxlRW5kaWFuQ29uc3RzOwpAQCAtMTA2LDcgKzEwNyw3IEBACiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgdGhpcygpOwotICAgICAgICBpbnQgY291bnQgPSBzdHJlYW0ucmVhZChfZGF0YSk7CisgICAgICAgIGludCBjb3VudCA9IElPVXRpbHMucmVhZEZ1bGx5KHN0cmVhbSwgX2RhdGEpOwogCiAgICAgICAgIF9ieXRlc19yZWFkID0gKGNvdW50ID09IC0xKSA/IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY291bnQ7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9zdG9yYWdlL0hlYWRlckJsb2NrUmVhZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9zdG9yYWdlL0hlYWRlckJsb2NrUmVhZGVyLmphdmEKaW5kZXggMDE1ZDQ1NS4uYWQ3NzM2OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvcG9pZnMvc3RvcmFnZS9IZWFkZXJCbG9ja1JlYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3BvaWZzL3N0b3JhZ2UvSGVhZGVyQmxvY2tSZWFkZXIuamF2YQpAQCAtNjAsNiArNjAsNyBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kucG9pZnMuY29tbW9uLlBPSUZTQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnV0aWwuSU9VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkludGVnZXJGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkxpdHRsZUVuZGlhbjsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLkxpdHRsZUVuZGlhbkNvbnN0czsKQEAgLTEwNCw3ICsxMDUsNyBAQAogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIF9kYXRhID0gbmV3IGJ5dGVbIFBPSUZTQ29uc3RhbnRzLkJJR19CTE9DS19TSVpFIF07Ci0gICAgICAgIGludCBieXRlX2NvdW50ID0gc3RyZWFtLnJlYWQoX2RhdGEpOworICAgICAgICBpbnQgYnl0ZV9jb3VudCA9IElPVXRpbHMucmVhZEZ1bGx5KHN0cmVhbSwgX2RhdGEpOwogCiAgICAgICAgIGlmIChieXRlX2NvdW50ICE9IFBPSUZTQ29uc3RhbnRzLkJJR19CTE9DS19TSVpFKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9zdG9yYWdlL1Jhd0RhdGFCbG9jay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvcG9pZnMvc3RvcmFnZS9SYXdEYXRhQmxvY2suamF2YQppbmRleCA4NjJmZDhjLi44NjNiNjEwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS9wb2lmcy9zdG9yYWdlL1Jhd0RhdGFCbG9jay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3BvaWZzL3N0b3JhZ2UvUmF3RGF0YUJsb2NrLmphdmEKQEAgLTU2LDYgKzU2LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kucG9pZnMuc3RvcmFnZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUucG9pLnBvaWZzLmNvbW1vbi5QT0lGU0NvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS51dGlsLklPVXRpbHM7CiAKIGltcG9ydCBqYXZhLmlvLio7CiAKQEAgLTg0LDcgKzg1LDcgQEAKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBfZGF0YSA9IG5ldyBieXRlWyBQT0lGU0NvbnN0YW50cy5CSUdfQkxPQ0tfU0laRSBdOwotICAgICAgICBpbnQgY291bnQgPSBzdHJlYW0ucmVhZChfZGF0YSk7CisgICAgICAgIGludCBjb3VudCA9IElPVXRpbHMucmVhZEZ1bGx5KHN0cmVhbSwgX2RhdGEpOwogCiAgICAgICAgIGlmIChjb3VudCA9PSAtMSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvdXRpbC9IZXhEdW1wLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL0hleER1bXAuamF2YQppbmRleCBiYzg0NjQ1Li43NDE5OGJjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL0hleER1bXAuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL0hleER1bXAuamF2YQpAQCAtNjcsNiArNjcsMjAgQEAKIAogcHVibGljIGNsYXNzIEhleER1bXAKIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgICAgRU9MICAgICAgICAgPQorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisvLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdCdWZmZXIgX2xidWZmZXIgICAgPSBuZXcgU3RyaW5nQnVmZmVyKDgpOworLy8gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nQnVmZmVyIF9jYnVmZmVyICAgID0gbmV3IFN0cmluZ0J1ZmZlcigyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyICAgICAgICAgX2hleGNvZGVzW10gPQorICAgIHsKKyAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsCisgICAgICAgICdFJywgJ0YnCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgICAgICAgX3NoaWZ0c1tdICAgPQorICAgIHsKKyAgICAgICAgMjgsIDI0LCAyMCwgMTYsIDEyLCA4LCA0LCAwCisgICAgfTsKKwogCiAgICAgLy8gYWxsIHN0YXRpYyBtZXRob2RzLCBzbyBubyBuZWVkIGZvciBhIHB1YmxpYyBjb25zdHJ1Y3RvcgogICAgIHByaXZhdGUgSGV4RHVtcCgpCkBAIC05NSwxMiArMTA5LDE0IEBACiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgewotICAgICAgICBpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IGRhdGEubGVuZ3RoKSkKKyAgICAgICAgaWYgKChpbmRleCA8IDApIHx8IChkYXRhLmxlbmd0aCAhPSAwICYmIGluZGV4ID49IGRhdGEubGVuZ3RoKSkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiaWxsZWdhbCBpbmRleDogIiArIGluZGV4ICsgIiBpbnRvIGFycmF5IG9mIGxlbmd0aCAiCiAgICAgICAgICAgICAgICAgKyBkYXRhLmxlbmd0aCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47IC8vIG5vdGhpbmcgbW9yZSB0byBkby4KICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW5ub3Qgd3JpdGUgdG8gbnVsbHN0cmVhbSIpOwpAQCAtMjQxLDM5ICsyNTcsMjYgQEAKICAgICB9CiAgICAgCiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgICAgRU9MICAgICAgICAgPQotICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nQnVmZmVyIF9sYnVmZmVyICAgID0gbmV3IFN0cmluZ0J1ZmZlcig4KTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdCdWZmZXIgX2NidWZmZXIgICAgPSBuZXcgU3RyaW5nQnVmZmVyKDIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgICAgICAgICBfaGV4Y29kZXNbXSA9Ci0gICAgewotICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywKLSAgICAgICAgJ0UnLCAnRicKLSAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgICAgICAgICBfc2hpZnRzW10gICA9Ci0gICAgewotICAgICAgICAyOCwgMjQsIDIwLCAxNiwgMTIsIDgsIDQsIDAKLSAgICB9OwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGR1bXAoZmluYWwgbG9uZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIF9sYnVmZmVyLnNldExlbmd0aCgwKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIF9sYnVmZmVyCi0gICAgICAgICAgICAgICAgLmFwcGVuZChfaGV4Y29kZXNbICgoIGludCApICh2YWx1ZSA+PiBfc2hpZnRzWyBqIF0pKSAmIDE1IF0pOworICAgICAgICAgICAgYnVmLmFwcGVuZCggX2hleGNvZGVzWyAoKCBpbnQgKSAodmFsdWUgPj4gX3NoaWZ0c1sgaiBdKSkgJiAxNSBdKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gX2xidWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkdW1wKGZpbmFsIGJ5dGUgdmFsdWUpCiAgICAgewotICAgICAgICBfY2J1ZmZlci5zZXRMZW5ndGgoMCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKQogICAgICAgICB7Ci0gICAgICAgICAgICBfY2J1ZmZlci5hcHBlbmQoX2hleGNvZGVzWyAodmFsdWUgPj4gX3NoaWZ0c1sgaiArIDYgXSkgJiAxNSBdKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoX2hleGNvZGVzWyAodmFsdWUgPj4gX3NoaWZ0c1sgaiArIDYgXSkgJiAxNSBdKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gX2NidWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjk0LDYgKzI5Nyw3IEBACiAgICAgICAgIHJldFZhbC5hcHBlbmQoJ10nKTsKICAgICAgICAgcmV0dXJuIHJldFZhbC50b1N0cmluZygpOwogICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbnZlcnRzIHRoZSBwYXJhbWV0ZXIgdG8gYSBoZXggdmFsdWUuCiAgICAgICoKQEAgLTMzNyw0ICszNDEsNDEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcHMgPGNvZGU+Ynl0ZXNUb0R1bXA8L2NvZGU+IGJ5dGVzIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gICAgICAgICAgVGhlIHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKiBAcGFyYW0gb3V0ICAgICAgICAgVGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gc3RhcnQgICAgICAgVGhlIGluZGV4IHRvIHVzZSBhcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBsZWZ0IGhhbmQgc2lkZSBsYWJlbAorICAgICAqIEBwYXJhbSBieXRlc1RvRHVtcCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG91dHB1dC4gIFVzZSAtMSB0byByZWFkIHVudGlsIHRoZSBlbmQgb2YgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCggSW5wdXRTdHJlYW0gaW4sIFByaW50U3RyZWFtIG91dCwgaW50IHN0YXJ0LCBpbnQgYnl0ZXNUb0R1bXAgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGlmIChieXRlc1RvRHVtcCA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSBpbi5yZWFkKCk7CisgICAgICAgICAgICB3aGlsZSAoYyAhPSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWYud3JpdGUoYyk7CisgICAgICAgICAgICAgICAgYyA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBieXRlc1JlbWFpbmluZyA9IGJ5dGVzVG9EdW1wOworICAgICAgICAgICAgd2hpbGUgKGJ5dGVzUmVtYWluaW5nLS0gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjID0gaW4ucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChjID09IC0xKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBkYXRhID0gYnVmLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIGR1bXAoZGF0YSwgMCwgb3V0LCBzdGFydCwgZGF0YS5sZW5ndGgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3V0aWwvSGV4UmVhZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvdXRpbC9IZXhSZWFkLmphdmEKaW5kZXggMGJlNzkzMC4uNmM1ZWNlYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvdXRpbC9IZXhSZWFkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvdXRpbC9IZXhSZWFkLmphdmEKQEAgLTEgKzEsMjI1IEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgKiAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzICogcmVzZXJ2ZWQuICogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgKiBhcmUgbWV0OiAqICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgKiAgICBkaXN0cmlidXRpb24uICogKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLiAqICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIGFuZCAqICAgICJBcGFjaGUgUE9JIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLiAqICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsICogICAgIkFwYWNoZSBQT0kiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0ICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gKiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUiAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgKiBTVUNIIERBTUFHRS4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uICovcGFja2FnZSBvcmcuYXBhY2hlLnBvaS51dGlsO2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uO2ltcG9ydCBqYXZhLmlvLkZpbGU7aW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtO2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtO2ltcG9ydCBqYXZhLnV0aWwuTGlzdDtpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsvKiogKiBVdGlsaXRpZXMgdG8gcmVhZCBoZXggZnJvbSBmaWxlcy4gKiAqIEBhdXRob3IgTWFyYyBKb2huc29uICogQGF1dGhvciBHbGVuIFN0YW1wb3VsdHppcyAoZ2xlbnMgYXQgYXBhY2hlLm9yZykgKi9wdWJsaWMgY2xhc3MgSGV4UmVhZHsgICAgLyoqICAgICAqIFRoaXMgbWV0aG9kIHJlYWRzIGhleCBkYXRhIGZyb20gYSBmaWxlbmFtZSBhbmQgcmV0dXJucyBhIGJ5dGUgYXJyYXkuICAgICAqIFRoZSBmaWxlIG1heSBjb250YWluIGxpbmUgY29tbWVudHMgdGhhdCBhcmUgcHJlY2VlZGVkIHdpdGggYSAjIHN5bWJvbC4gICAgICogICAgICogQHBhcmFtIGZpbGVuYW1lICBUaGUgZmlsZW5hbWUgdG8gcmVhZCAgICAgKiBAcmV0dXJuIFRoZSBieXRlcyByZWFkIGZyb20gdGhlIGZpbGUuICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aGlsZSByZWFkaW5nIHRoZSBmaWxlLiAgICAgKi8gICAgcHVibGljIHN0YXRpYyBieXRlW10gcmVhZERhdGEoIFN0cmluZyBmaWxlbmFtZSApICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uICAgIHsgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCBmaWxlbmFtZSApOyAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGUgKTsgICAgICAgIHRyeSAgICAgICAgeyAgICAgICAgICAgIHJldHVybiByZWFkRGF0YShzdHJlYW0sIC0xKTsgICAgICAgIH0gICAgICAgIGZpbmFsbHkgICAgICAgIHsgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsgICAgICAgIH0gICAgfSAgICAvKiogICAgICogU2FtZSBhcyByZWFkRGF0YShTdHJpbmcpIGV4Y2VwdCB0aGF0IHRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBzZWN0aW9ucyB3aXRoaW4gICAgICogYSBmaWxlLiAgU2VjdGlvbnMgYXJlIHJlZmVyZW5jZWQgdXNpbmcgc2VjdGlvbiBoZWFkZXJzIGluIHRoZSBmb3JtOiAgICAgKiA8cHJlPiAgICAgKiAgW3NlY3Rpb25hbWVdICAgICAqIDwvcHJlPiAgICAgKiAgICAgKiBAc2VlICNyZWFkRGF0YShTdHJpbmcpICAgICAqLyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRGF0YShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBzZWN0aW9uKSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uICAgIHsgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCBmaWxlbmFtZSApOyAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGUgKTsgICAgICAgIHRyeSAgICAgICAgeyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzZWN0aW9uVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgICAgICAgICAgICBib29sZWFuIGluU2VjdGlvbiA9IGZhbHNlOyAgICAgICAgICAgIGludCBjID0gc3RyZWFtLnJlYWQoKTsgICAgICAgICAgICB3aGlsZSAoYyAhPSAtMSkgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIHN3aXRjaChjKSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzogICAgICAgICAgICAgICAgICAgICAgICBpblNlY3Rpb24gPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOiBjYXNlICdccic6ICAgICAgICAgICAgICAgICAgICAgICAgaW5TZWN0aW9uID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICBjYXNlICddJzogICAgICAgICAgICAgICAgICAgICAgICBpblNlY3Rpb24gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdGlvblRleHQudG9TdHJpbmcoKS5lcXVhbHMoc2VjdGlvbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkRGF0YShzdHJlYW0sICdbJyk7ICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpblNlY3Rpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0LmFwcGVuZCgoY2hhciljKTsgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBjID0gc3RyZWFtLnJlYWQoKTsgICAgICAgICAgICB9ICAgICAgICB9ICAgICAgICBmaW5hbGx5ICAgICAgICB7ICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7ICAgICAgICB9ICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlNlY3Rpb24gJyIgKyBzZWN0aW9uICsgIicgbm90IGZvdW5kIik7ICAgIH0gICAgc3RhdGljIHByaXZhdGUgYnl0ZVtdIHJlYWREYXRhKCBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtLCBpbnQgZW9mQ2hhciApIHRocm93cyBJT0V4Y2VwdGlvbiAgICB7ICAgICAgICBpbnQgY2hhcmFjdGVyQ291bnQgPSAwOyAgICAgICAgYnl0ZSBiID0gKGJ5dGUpIDA7ICAgICAgICBMaXN0IGJ5dGVzID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7ICAgICAgICB3aGlsZSAoICFkb25lICkgICAgICAgIHsgICAgICAgICAgICBpbnQgY291bnQgPSBzdHJlYW0ucmVhZCgpOyAgICAgICAgICAgIGNoYXIgYmFzZUNoYXIgPSAnYSc7ICAgICAgICAgICAgaWYgKCBjb3VudCA9PSBlb2ZDaGFyKSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICBzd2l0Y2ggKCBjb3VudCApICAgICAgICAgICAgeyAgICAgICAgICAgICAgICBjYXNlICcjJzogICAgICAgICAgICAgICAgICAgIHJlYWRUb0VPTChzdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOiAgICAgICAgICAgICAgICAgICAgYiA8PD0gNDsgICAgICAgICAgICAgICAgICAgIGIgKz0gKGJ5dGUpICggY291bnQgLSAnMCcgKTsgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckNvdW50Kys7ICAgICAgICAgICAgICAgICAgICBpZiAoIGNoYXJhY3RlckNvdW50ID09IDIgKSAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLmFkZCggbmV3IEJ5dGUoIGIgKSApOyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckNvdW50ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICBiID0gKGJ5dGUpIDA7ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgY2FzZSAnQSc6IGNhc2UgJ0InOiBjYXNlICdDJzogY2FzZSAnRCc6IGNhc2UgJ0UnOiBjYXNlICdGJzogICAgICAgICAgICAgICAgICAgIGJhc2VDaGFyID0gJ0EnOyAgICAgICAgICAgICAgICBjYXNlICdhJzogY2FzZSAnYic6IGNhc2UgJ2MnOiBjYXNlICdkJzogY2FzZSAnZSc6IGNhc2UgJ2YnOiAgICAgICAgICAgICAgICAgICAgYiA8PD0gNDsgICAgICAgICAgICAgICAgICAgIGIgKz0gKGJ5dGUpICggY291bnQgKyAxMCAtIGJhc2VDaGFyICk7ICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJDb3VudCsrOyAgICAgICAgICAgICAgICAgICAgaWYgKCBjaGFyYWN0ZXJDb3VudCA9PSAyICkgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICBieXRlcy5hZGQoIG5ldyBCeXRlKCBiICkgKTsgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJDb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChieXRlKSAwOyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIGNhc2UgLTE6ICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICBkZWZhdWx0IDogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIH0gICAgICAgIH0gICAgICAgIEJ5dGVbXSBwb2xpc2hlZCA9IChCeXRlW10pIGJ5dGVzLnRvQXJyYXkoIG5ldyBCeXRlWzBdICk7ICAgICAgICBieXRlW10gcnZhbCA9IG5ldyBieXRlW3BvbGlzaGVkLmxlbmd0aF07ICAgICAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBwb2xpc2hlZC5sZW5ndGg7IGorKyApICAgICAgICB7ICAgICAgICAgICAgcnZhbFtqXSA9IHBvbGlzaGVkW2pdLmJ5dGVWYWx1ZSgpOyAgICAgICAgfSAgICAgICAgcmV0dXJuIHJ2YWw7ICAgIH0gICAgc3RhdGljIHByaXZhdGUgdm9pZCByZWFkVG9FT0woIElucHV0U3RyZWFtIHN0cmVhbSApIHRocm93cyBJT0V4Y2VwdGlvbiAgICB7ICAgICAgICBpbnQgYyA9IHN0cmVhbS5yZWFkKCk7ICAgICAgICB3aGlsZSAoIGMgIT0gLTEgJiYgYyAhPSAnXG4nICYmIGMgIT0gJ1xyJykgICAgICAgIHsgICAgICAgICAgICBjID0gc3RyZWFtLnJlYWQoKTsgICAgICAgIH0gICAgfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kCisgKiAgICAiQXBhY2hlIFBPSSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICAiQXBhY2hlIFBPSSIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnBvaS51dGlsOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVXRpbGl0aWVzIHRvIHJlYWQgaGV4IGZyb20gZmlsZXMuCisgKgorICogQGF1dGhvciBNYXJjIEpvaG5zb24KKyAqIEBhdXRob3IgR2xlbiBTdGFtcG91bHR6aXMgKGdsZW5zIGF0IGFwYWNoZS5vcmcpICovCitwdWJsaWMgY2xhc3MgSGV4UmVhZAoreworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJlYWRzIGhleCBkYXRhIGZyb20gYSBmaWxlbmFtZSBhbmQgcmV0dXJucyBhIGJ5dGUgYXJyYXkuCisgICAgICogVGhlIGZpbGUgbWF5IGNvbnRhaW4gbGluZSBjb21tZW50cyB0aGF0IGFyZSBwcmVjZWVkZWQgd2l0aCBhICMgc3ltYm9sLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lICBUaGUgZmlsZW5hbWUgdG8gcmVhZAorICAgICAqIEByZXR1cm4gVGhlIGJ5dGVzIHJlYWQgZnJvbSB0aGUgZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgcmVhZGluZyB0aGUgZmlsZS4gICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gcmVhZERhdGEoIFN0cmluZyBmaWxlbmFtZSApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoIGZpbGVuYW1lICk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlICk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVhZERhdGEoIHN0cmVhbSwgLTEgKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyByZWFkRGF0YShTdHJpbmcpIGV4Y2VwdCB0aGF0IHRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBzZWN0aW9ucyB3aXRoaW4KKyAgICAgKiBhIGZpbGUuICBTZWN0aW9ucyBhcmUgcmVmZXJlbmNlZCB1c2luZyBzZWN0aW9uIGhlYWRlcnMgaW4gdGhlIGZvcm06CisgICAgICogPHByZT4KKyAgICAgKiAgW3NlY3Rpb25hbWVdCisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAc2VlICNyZWFkRGF0YShTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gcmVhZERhdGEoIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHNlY3Rpb24gKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCBmaWxlbmFtZSApOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZmlsZSApOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNlY3Rpb25UZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgYm9vbGVhbiBpblNlY3Rpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIGludCBjID0gc3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIHdoaWxlICggYyAhPSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICggYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGluU2VjdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgICAgICBpblNlY3Rpb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5TZWN0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHNlY3Rpb25UZXh0LnRvU3RyaW5nKCkuZXF1YWxzKCBzZWN0aW9uICkgKSByZXR1cm4gcmVhZERhdGEoIHN0cmVhbSwgJ1snICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpblNlY3Rpb24gKSBzZWN0aW9uVGV4dC5hcHBlbmQoIChjaGFyKSBjICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGMgPSBzdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCAiU2VjdGlvbiAnIiArIHNlY3Rpb24gKyAiJyBub3QgZm91bmQiICk7CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBieXRlW10gcmVhZERhdGEoIElucHV0U3RyZWFtIHN0cmVhbSwgaW50IGVvZkNoYXIgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBjaGFyYWN0ZXJDb3VudCA9IDA7CisgICAgICAgIGJ5dGUgYiA9IChieXRlKSAwOworICAgICAgICBMaXN0IGJ5dGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKCAhZG9uZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICBjaGFyIGJhc2VDaGFyID0gJ2EnOworICAgICAgICAgICAgaWYgKCBjb3VudCA9PSBlb2ZDaGFyICkgYnJlYWs7CisgICAgICAgICAgICBzd2l0Y2ggKCBjb3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICAgICAgICAgIHJlYWRUb0VPTCggc3RyZWFtICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgICAgICAgICBiIDw8PSA0OworICAgICAgICAgICAgICAgICAgICBiICs9IChieXRlKSAoIGNvdW50IC0gJzAnICk7CisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGlmICggY2hhcmFjdGVyQ291bnQgPT0gMiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLmFkZCggbmV3IEJ5dGUoIGIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChieXRlKSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgorICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgICAgICAgICBiYXNlQ2hhciA9ICdBJzsKKyAgICAgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICAgICAgYiA8PD0gNDsKKyAgICAgICAgICAgICAgICAgICAgYiArPSAoYnl0ZSkgKCBjb3VudCArIDEwIC0gYmFzZUNoYXIgKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjaGFyYWN0ZXJDb3VudCA9PSAyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMuYWRkKCBuZXcgQnl0ZSggYiApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gKGJ5dGUpIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBCeXRlW10gcG9saXNoZWQgPSAoQnl0ZVtdKSBieXRlcy50b0FycmF5KCBuZXcgQnl0ZVswXSApOworICAgICAgICBieXRlW10gcnZhbCA9IG5ldyBieXRlW3BvbGlzaGVkLmxlbmd0aF07CisgICAgICAgIGZvciAoIGludCBqID0gMDsgaiA8IHBvbGlzaGVkLmxlbmd0aDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgcnZhbFtqXSA9IHBvbGlzaGVkW2pdLmJ5dGVWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydmFsOworICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgYnl0ZVtdIHJlYWRGcm9tU3RyaW5nKFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiByZWFkRGF0YShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIGRhdGEuZ2V0Qnl0ZXMoKSApLCAtMSk7CisgICAgfQorCisgICAgc3RhdGljIHByaXZhdGUgdm9pZCByZWFkVG9FT0woIElucHV0U3RyZWFtIHN0cmVhbSApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGMgPSBzdHJlYW0ucmVhZCgpOworICAgICAgICB3aGlsZSAoIGMgIT0gLTEgJiYgYyAhPSAnXG4nICYmIGMgIT0gJ1xyJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMgPSBzdHJlYW0ucmVhZCgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3V0aWwvSU9VdGlscy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvdXRpbC9JT1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwODliMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3V0aWwvSU9VdGlscy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCisgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIGFuZAorICogICAgIkFwYWNoZSBQT0kiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAorICogICAgIkFwYWNoZSBQT0kiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5wb2kudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworcHVibGljIGNsYXNzIElPVXRpbHMKK3sKKyAgICBwcml2YXRlIElPVXRpbHMoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kLCBqdXN0IGNhbGxzIDx0dD5yZWFkRnVsbHkoaW4sIGIsIDAsIGIubGVuZ3RoKTwvdHQ+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZEZ1bGx5KElucHV0U3RyZWFtIGluLCBieXRlW10gYikKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiByZWFkRnVsbHkoaW4sIGIsIDAsIGIubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHRoZSBub3JtYWwgPHR0PmluLnJlYWQoYiwgb2ZmLCBsZW4pPC90dD4sIGJ1dCB0cmllcyB0byBlbnN1cmUgdGhhdAorICAgICAqIHRoZSBlbnRpcmUgbGVuIG51bWJlciBvZiBieXRlcyBpcyByZWFkLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkIGJlZm9yZSBhbnkgYnl0ZXMgYXJlIHJlYWQsIHJldHVybnMgLTEuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCByZWFkRnVsbHkoSW5wdXRTdHJlYW0gaW4sIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaW50IGdvdCA9IGluLnJlYWQoYiwgb2ZmICsgdG90YWwsIGxlbiAtIHRvdGFsKTsKKyAgICAgICAgICAgIGlmIChnb3QgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IC0xIDogdG90YWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvdGFsICs9IGdvdDsKKyAgICAgICAgICAgICAgICBpZiAodG90YWwgPT0gbGVuKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG90YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3V0aWwvTGl0dGxlRW5kaWFuLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL0xpdHRsZUVuZGlhbi5qYXZhCmluZGV4IDBmNTI1YzEuLjRjNGI1MWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3V0aWwvTGl0dGxlRW5kaWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvdXRpbC9MaXR0bGVFbmRpYW4uamF2YQpAQCAtNDc1LDIzICs0NzUsMTAgQEAKICAgICAgICAgcmV0dXJuIGdldExvbmcocmVhZEZyb21TdHJlYW0oc3RyZWFtLCBMT05HX1NJWkUpKTsKICAgICB9CiAKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBfc2hvcnRfYnVmZmVyID0gbmV3IGJ5dGVbU0hPUlRfU0laRV07Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIF9pbnRfYnVmZmVyID0gbmV3IGJ5dGVbSU5UX1NJWkVdOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBfbG9uZ19idWZmZXIgPSBuZXcgYnl0ZVtMT05HX1NJWkVdOwotCi0KICAgICAvKioKICAgICAgKiAgUmVhZCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJuIHRoZW0gdG8KICAgICAgKiAgdGhlIGNhbGxlci4gPHA+CiAgICAgICoKLSAgICAgKiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQsIGluIGFuIGF0dGVtcHQgdG8gaW1wcm92ZSBzeXN0ZW0gcGVyZm9ybWFuY2UgYW5kCi0gICAgICogIHRvIHByZXZlbnQgYSB0cmFuc2llbnQgZXhwbG9zaW9uIG9mIGRpc2NhcmRlZCBieXRlIGFycmF5cyB0byBiZSBnYXJiYWdlCi0gICAgICogIGNvbGxlY3RlZCwgc3RhdGljIGJ5dGUgYXJyYXlzIGFyZSBlbXBsb3llZCBmb3IgdGhlIHN0YW5kYXJkIGNhc2VzIG9mCi0gICAgICogIHJlYWRpbmcgYSBzaG9ydCwgYW4gaW50LCBvciBhIGxvbmcuIDxwPgotICAgICAqCi0gICAgICogIDxiPlRISVMgSU5UUk9EVUNFUyBBIFJJU0sgRk9SIFRIUkVBREVEIE9QRVJBVElPTlMhPC9iPiA8cD4KLSAgICAgKgogICAgICAqICBIb3dldmVyLCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBQT0kgcHJvamVjdCwgdGhpcyByaXNrIGlzIGRlZW1lZAogICAgICAqICBuZWdsaWdpYmxlLiBJdCBpcywgaG93ZXZlciwgc28gbm90ZWQuCiAgICAgICoKQEAgLTUxMCwyMyArNDk3LDggQEAKICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRnJvbVN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0sCiAgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSkKICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1ZmZlclVuZGVycnVuRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG51bGw7CisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKIAotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLQotICAgICAgICAgICAgY2FzZSBTSE9SVF9TSVpFOgotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IF9zaG9ydF9idWZmZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVF9TSVpFOgotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IF9pbnRfYnVmZmVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMT05HX1NJWkU6Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gX2xvbmdfYnVmZmVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQogICAgICAgICBpbnQgY291bnQgPSBzdHJlYW0ucmVhZChidWZmZXIpOwogCiAgICAgICAgIGlmIChjb3VudCA9PSAtMSkgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvdXRpbC9TdHJpbmdVdGlsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL1N0cmluZ1V0aWwuamF2YQppbmRleCA4NDU4NTRlLi5hMmVmMTI0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL1N0cmluZ1V0aWwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL1N0cmluZ1V0aWwuamF2YQpAQCAtMSArMSwzNjMgQEAKLS8qICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICogIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEgKiAqICBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAqICByZXNlcnZlZC4gKiAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zICogIGFyZSBtZXQ6ICogKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgKiAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAqICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0ICogIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAqICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlICogIGRpc3RyaWJ1dGlvbi4gKiAqICAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgKiAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogKiAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlICogIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iICogIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgKiAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4gKiAqICA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kICogICJBcGFjaGUgUE9JIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAqICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yICogIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuICogKiAgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsICogICJBcGFjaGUgUE9JIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCAqICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAqICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgKiAgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUiAqICBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgKiAgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiAqICBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCAqICBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgKiAgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GICogIFNVQ0ggREFNQUdFLiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqICogIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55ICogIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZSAqICBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgKiAgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAqL3BhY2thZ2Ugb3JnLmFwYWNoZS5wb2kudXRpbDtpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uO2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0O2ltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsvKiogKiAgVGl0bGU6IFN0cmluZyBVdGlsaXR5IERlc2NyaXB0aW9uOiBDb2xsZWN0aW9uIG9mIHN0cmluZyBoYW5kbGluZyB1dGlsaXRpZXMgKiAgKiBOb3cgaXQgaXMgcXVpdGUgY29uZnVzaW5nOiB0aGUgbWV0aG9kIHBhaXJzLCBpbiB3aGljaCAqIG9uZSBvZiB0aGVtIHdyaXRlIGRhdGEgYW5kIG90aGVyIHJlYWQgd3JpdHRlbiBkYXRhIGFyZTogKiBwdXRVbmNvbXByZXNzZWRVbmljb2RlSGlnaCBhbmQgZ2V0RnJvbVVuaWNvZGUgKiBwdXRVbmNvbXByZXNzZWRVbmljb2RlICAgICBhbmQgZ2V0RnJvbVVuaWNvZGVIaWdoICogKkBhdXRob3IgICAgIEFuZHJldyBDLiBPbGl2ZXIgKkBhdXRob3IgICAgIFNlcmdlaSBLb3plbGxvIChzZXJnZWlrb3plbGxvIGF0IG1haWwucnUpICpAY3JlYXRlZCAgICBNYXkgMTAsIDIwMDIgKkB2ZXJzaW9uICAgIDEuMCAqL3B1YmxpYyBjbGFzcyBTdHJpbmdVdGlsIHsgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFTkNPRElORz0iSVNPLTg4NTktMSI7ICAgIC8qKiAgICAgKiAgQ29uc3RydWN0b3IgZm9yIHRoZSBTdHJpbmdVdGlsIG9iamVjdCAgICAgKi8gICAgcHJpdmF0ZSBTdHJpbmdVdGlsKCkgeyB9ICAgICAgICAvKiogICAgICogIGdpdmVuIGEgYnl0ZSBhcnJheSBvZiAxNi1iaXQgdW5pY29kZSBjaGFyYWN0ZXJzLCBjb21wcmVzcyB0byA4LWJpdCBhbmQgICAgICogIHJldHVybiBhIHN0cmluZyAgICAgKiAgICAgKiB7IDB4MTYsIDB4MDAgfSAtPiAweDE2ICAgICAqICAgICAgKkBwYXJhbSAgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgdG8gYmUgY29udmVydGVkICAgICAqQHBhcmFtICBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbCBvZmZzZXQgaW50byB0aGUgICAgICogICAgICBieXRlIGFycmF5LiBpdCBpcyBhc3N1bWVkIHRoYXQgc3RyaW5nWyBvZmZzZXQgXSBhbmQgc3RyaW5nWyBvZmZzZXQgKyAgICAgKiAgICAgIDEgXSBjb250YWluIHRoZSBmaXJzdCAxNi1iaXQgdW5pY29kZSBjaGFyYWN0ZXIgICAgICpAcGFyYW0gIGxlbiAgICAgKkByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbnZlcnRlZCBzdHJpbmcgICAgICpAZXhjZXB0aW9uICBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIGlmIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIGZvciAgICAgKiAgICAgIHRoZSBieXRlIGFycmF5IChpLmUuLCBpcyBuZWdhdGl2ZSBvciBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gICAgICogICAgICBzdHJpbmcubGVuZ3RoKSAgICAgKkBleGNlcHRpb24gIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgICAgICAgaWYgbGVuIGlzIHRvbyBsYXJnZSAoaS5lLiwgICAgICogICAgICB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEgaW4gc3RyaW5nIHRvIGNyZWF0ZSBhIFN0cmluZyBvZiB0aGF0ICAgICAqICAgICAgbGVuZ3RoKSAgICAgKkBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZmluYWwgc3RyaW5nICAgICAqLyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGcm9tVW5pY29kZUhpZ2goZmluYWwgYnl0ZVtdIHN0cmluZywgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuKSAgICAgICAgICAgICB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geyAgICAgICAgaWYgKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ID49IHN0cmluZy5sZW5ndGgpKSB7ICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSWxsZWdhbCBvZmZzZXQiKTsgICAgICAgIH0gICAgICAgIGlmICgobGVuIDwgMCkgfHwgKCgoc3RyaW5nLmxlbmd0aCAtIG9mZnNldCkgLyAyKSA8IGxlbikpIHsgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGxlbmd0aCIpOyAgICAgICAgfSAgICAgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsgbGVuIF07ICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKyApIHsgICAgICAgICAgICBjaGFyc1tpXSA9IChjaGFyKSggc3RyaW5nWyBvZmZzZXQgKyAoIDIqaSApIF0gJiAweEZGIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHN0cmluZ1sgb2Zmc2V0ICsgKCAyKmkrMSApIF0gPDwgOCApICk7ICAgICAgICB9ICAgICAgICByZXR1cm4gbmV3IFN0cmluZyggY2hhcnMgKTsgICAgfSAgICAgICAgICAgIC8qKiAgICAgKiAgZ2l2ZW4gYSBieXRlIGFycmF5IG9mIDE2LWJpdCB1bmljb2RlIGNoYXJhY3RlcnMsIGNvbXByZXNzIHRvIDgtYml0IGFuZCAgICAgKiAgcmV0dXJuIGEgc3RyaW5nICAgICAqICAgICAgKiB7IDB4MTYsIDB4MDAgfSAtPiAweDE2ICAgICAqICAgICAqQHBhcmFtICBzdHJpbmcgIHRoZSBieXRlIGFycmF5IHRvIGJlIGNvbnZlcnRlZCAgICAgKkByZXR1cm4gICAgICAgICB0aGUgY29udmVydGVkIHN0cmluZyAgICAgKi8gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnJvbVVuaWNvZGVIaWdoKCBmaW5hbCBieXRlW10gc3RyaW5nICkgeyAgICAgICAgcmV0dXJuIGdldEZyb21Vbmljb2RlSGlnaCggc3RyaW5nLCAwLCBzdHJpbmcubGVuZ3RoIC8gMiApOyAgICB9ICAgIC8qKiAgICAgKiAgZ2l2ZW4gYSBieXRlIGFycmF5IG9mIDE2LWJpdCB1bmljb2RlIGNoYXJhY3RlcnMsIGNvbXByZXNzIHRvIDgtYml0IGFuZCAgICAgKiAgcmV0dXJuIGEgc3RyaW5nICAgICAqICAgICAgKiB7IDB4MDAsIDB4MTYgfSAtPiAweDE2ICAgICAqICAgICAqQHBhcmFtICBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBiZSBjb252ZXJ0ZWQgICAgICpAcGFyYW0gIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIG9mZnNldCBpbnRvIHRoZSAgICAgKiAgICAgIGJ5dGUgYXJyYXkuIGl0IGlzIGFzc3VtZWQgdGhhdCBzdHJpbmdbIG9mZnNldCBdIGFuZCBzdHJpbmdbIG9mZnNldCArICAgICAqICAgICAgMSBdIGNvbnRhaW4gdGhlIGZpcnN0IDE2LWJpdCB1bmljb2RlIGNoYXJhY3RlciAgICAgKkBwYXJhbSAgbGVuICAgICAqQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udmVydGVkIHN0cmluZyAgICAgKkBleGNlcHRpb24gIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAgaWYgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgZm9yICAgICAqICAgICAgdGhlIGJ5dGUgYXJyYXkgKGkuZS4sIGlzIG5lZ2F0aXZlIG9yIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAgICAgKiAgICAgIHN0cmluZy5sZW5ndGgpICAgICAqQGV4Y2VwdGlvbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICAgICBpZiBsZW4gaXMgdG9vIGxhcmdlIChpLmUuLCAgICAgKiAgICAgIHRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YSBpbiBzdHJpbmcgdG8gY3JlYXRlIGEgU3RyaW5nIG9mIHRoYXQgICAgICogICAgICBsZW5ndGgpICAgICAqQGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBmaW5hbCBzdHJpbmcgICAgICovICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZyb21Vbmljb2RlKGZpbmFsIGJ5dGVbXSBzdHJpbmcsICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCwgZmluYWwgaW50IGxlbikgICAgICAgICAgICAgdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsgICAgICAgIGlmICgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSBzdHJpbmcubGVuZ3RoKSkgeyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIklsbGVnYWwgb2Zmc2V0Iik7ICAgICAgICB9ICAgICAgICBpZiAoKGxlbiA8IDApIHx8ICgoKHN0cmluZy5sZW5ndGggLSBvZmZzZXQpIC8gMikgPCBsZW4pKSB7ICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBsZW5ndGgiKTsgICAgICAgIH0gICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbIGxlbiBdOyAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKysgKSB7ICAgICAgICAgICAgY2hhcnNbaV0gPSAoY2hhcikoICggc3RyaW5nWyBvZmZzZXQgKyAoIDIqaSApIF0gPDwgOCApICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdbIG9mZnNldCArICggMippKzEgKSBdICk7ICAgICAgICB9ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKCBjaGFycyApOyAgICB9ICAgIC8qKiAgICAgKiAgZ2l2ZW4gYSBieXRlIGFycmF5IG9mIDE2LWJpdCB1bmljb2RlIGNoYXJhY3RlcnMsIGNvbXByZXNzIHRvIDgtYml0IGFuZCAgICAgKiAgcmV0dXJuIGEgc3RyaW5nICAgICAqICAgICAgKiB7IDB4MDAsIDB4MTYgfSAtPiAweDE2ICAgICAqICAgICAqQHBhcmFtICBzdHJpbmcgIHRoZSBieXRlIGFycmF5IHRvIGJlIGNvbnZlcnRlZCAgICAgKkByZXR1cm4gICAgICAgICB0aGUgY29udmVydGVkIHN0cmluZyAgICAgKi8gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnJvbVVuaWNvZGUoZmluYWwgYnl0ZVtdIHN0cmluZykgeyAgICAgICAgcmV0dXJuIGdldEZyb21Vbmljb2RlKHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCAvIDIpOyAgICB9ICAgICAgLyoqICAgICAgKiByZWFkIGNvbXByZXNzZWQgdW5pY29kZSg4Yml0KSAgICAgICogICAgICAgKiBAYXV0aG9yIFRvc2hpYWtpIEthbW9zaGlkYShrYW1vc2hpZGEudG9zaGlha2kgYXQgZnV0dXJlIGRvdCBjbyBkb3QganApICAgICAgKiAgICAgICAqIEBwYXJhbSBzdHJpbmcgYnl0ZSBhcnJheSB0byByZWFkICAgICAgKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCB0byByZWFkIGJ5dGUgYXJyYXkgICAgICAqIEBwYXJhbSBsZW4gICAgbGVuZ3RoIHRvIHJlYWQgYnl0ZSBhcnJheSAgICAgICogQHJldHVybiBTdHJpbmcgZ2VuZXJhdGVkIFN0cmluZyBpbnN0YW5jZSBieSByZWFkaW5nIGJ5dGUgYXJyYXkgICAgICAqLyAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnJvbUNvbXByZXNzZWRVbmljb2RlKGZpbmFsIGJ5dGVbXSBzdHJpbmcsICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCwgZmluYWwgaW50IGxlbil7ICAgICAgICAgdHJ5eyAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzdHJpbmcsb2Zmc2V0LGxlbiwiSVNPLTg4NTktMSIpOyAgICAgICAgIH0gICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpeyAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOy8qIHVucmVhY2hhYmxlICovICAgICAgICAgfSAgICAgfSAgICAvKiogICAgICogIHdyaXRlIGNvbXByZXNzZWQgdW5pY29kZSAgICAgKiAgICAgKkBwYXJhbSAgaW5wdXQgICB0aGUgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiAgICAgKkBwYXJhbSAgb3V0cHV0ICB0aGUgYnl0ZSBhcnJheSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuICAgICAqQHBhcmFtICBvZmZzZXQgIGFuIG9mZnNldCBpbnRvIHRoZSBieXRlIGFycmF0IGF0IHdoaWNoIHRoZSBkYXRhIGlzIHN0YXJ0ICAgICAqICAgICAgd2hlbiB3cml0dGVuICAgICAqLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0Q29tcHJlc3NlZFVuaWNvZGUoZmluYWwgU3RyaW5nIGlucHV0LCAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBvdXRwdXQsICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCkgeyAgICAgICAgaW50IHN0cmxlbiA9IGlucHV0Lmxlbmd0aCgpOyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzdHJsZW47IGsrKykgeyAgICAgICAgICAgIG91dHB1dFtvZmZzZXQgKyBrXSA9IChieXRlKSBpbnB1dC5jaGFyQXQoayk7ICAgICAgICB9ICAgIH0gICAgLyoqICAgICAqICBXcml0ZSB1bmNvbXByZXNzZWQgdW5pY29kZSAgICAgKiAgICAgKkBwYXJhbSAgaW5wdXQgICB0aGUgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHVuaWNvZGUgZGF0YSB0byBiZSB3cml0dGVuICAgICAqQHBhcmFtICBvdXRwdXQgIHRoZSBieXRlIGFycmF5IHRvIGhvbGQgdGhlIHVuY29tcHJlc3NlZCB1bmljb2RlICAgICAqQHBhcmFtICBvZmZzZXQgIHRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBpbnRvIHRoZSBieXRlIGFycmF5ICAgICAqLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0VW5jb21wcmVzc2VkVW5pY29kZShmaW5hbCBTdHJpbmcgaW5wdXQsICAgICAgICAgICAgZmluYWwgYnl0ZVtdIG91dHB1dCwgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0KSB7ICAgICAgICBpbnQgc3RybGVuID0gaW5wdXQubGVuZ3RoKCk7ICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHN0cmxlbjsgaysrKSB7ICAgICAgICAgICAgY2hhciBjID0gaW5wdXQuY2hhckF0KGspOyAgICAgICAgICAgIG91dHB1dFtvZmZzZXQgKyAoMiAqIGspXSA9IChieXRlKSBjOyAgICAgICAgICAgIG91dHB1dFtvZmZzZXQgKyAoMiAqIGspICsgMV0gPSAoYnl0ZSkgKGMgPj4gOCk7ICAgICAgICB9ICAgIH0gICAgLyoqICAgICAqICBXcml0ZSB1bmNvbXByZXNzZWQgdW5pY29kZSAgICAgKiAgICAgKkBwYXJhbSAgaW5wdXQgICB0aGUgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHVuaWNvZGUgZGF0YSB0byBiZSB3cml0dGVuICAgICAqQHBhcmFtICBvdXRwdXQgIHRoZSBieXRlIGFycmF5IHRvIGhvbGQgdGhlIHVuY29tcHJlc3NlZCB1bmljb2RlICAgICAqQHBhcmFtICBvZmZzZXQgIHRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBpbnRvIHRoZSBieXRlIGFycmF5ICAgICAqLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0VW5jb21wcmVzc2VkVW5pY29kZUhpZ2goZmluYWwgU3RyaW5nIGlucHV0LCAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBvdXRwdXQsICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCkgeyAgICAgICAgaW50IHN0cmxlbiA9IGlucHV0Lmxlbmd0aCgpOyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzdHJsZW47IGsrKykgeyAgICAgICAgICAgIGNoYXIgYyA9IGlucHV0LmNoYXJBdChrKTsgICAgICAgICAgICBvdXRwdXRbb2Zmc2V0ICsgKDIgKiBrKV0gPSAoYnl0ZSkgKGMgPj4gOCk7ICAgICAgICAgICAgb3V0cHV0W29mZnNldCArICgyICogayldID0gKGJ5dGUpIGM7ICAgICAgICB9ICAgIH0gICAgICAgICAgICAgICAgLyoqICAgICAqICBEZXNjcmlwdGlvbiBvZiB0aGUgTWV0aG9kICAgICAqICAgICAqQHBhcmFtICBtZXNzYWdlICBEZXNjcmlwdGlvbiBvZiB0aGUgUGFyYW1ldGVyICAgICAqQHBhcmFtICBwYXJhbXMgICBEZXNjcmlwdGlvbiBvZiB0aGUgUGFyYW1ldGVyICAgICAqQHJldHVybiAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgUmV0dXJuIFZhbHVlICAgICAqLyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIHBhcmFtcykgeyAgICAgICAgaW50IGN1cnJlbnRQYXJhbU51bWJlciA9IDA7ICAgICAgICBTdHJpbmdCdWZmZXIgZm9ybWF0dGVkTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS5sZW5ndGgoKTsgaSsrKSB7ICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY2hhckF0KGkpID09ICclJykgeyAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBhcmFtTnVtYmVyID49IHBhcmFtcy5sZW5ndGgpIHsgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKCI/bWlzc2luZyBkYXRhPyIpOyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXJhbXNbY3VycmVudFBhcmFtTnVtYmVyXSBpbnN0YW5jZW9mIE51bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAmJiAoaSArIDEgPCBtZXNzYWdlLmxlbmd0aCgpKSkgeyAgICAgICAgICAgICAgICAgICAgaSArPSBtYXRjaE9wdGlvbmFsRm9ybWF0dGluZyggICAgICAgICAgICAgICAgICAgICAgICAgICAgKE51bWJlcikgcGFyYW1zW2N1cnJlbnRQYXJhbU51bWJlcisrXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdWJzdHJpbmcoaSArIDEpLCBmb3JtYXR0ZWRNZXNzYWdlKTsgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKHBhcmFtc1tjdXJyZW50UGFyYW1OdW1iZXIrK10udG9TdHJpbmcoKSk7ICAgICAgICAgICAgICAgIH0gICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICBpZiAoKG1lc3NhZ2UuY2hhckF0KGkpID09ICdcXCcpICYmIChpICsgMSA8IG1lc3NhZ2UubGVuZ3RoKCkpICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1lc3NhZ2UuY2hhckF0KGkgKyAxKSA9PSAnJScpKSB7ICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgnJScpOyAgICAgICAgICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQobWVzc2FnZS5jaGFyQXQoaSkpOyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgfSAgICAgICAgfSAgICAgICAgcmV0dXJuIGZvcm1hdHRlZE1lc3NhZ2UudG9TdHJpbmcoKTsgICAgfSAgICAvKiogICAgICogIERlc2NyaXB0aW9uIG9mIHRoZSBNZXRob2QgICAgICogICAgICpAcGFyYW0gIG51bWJlciAgICAgIERlc2NyaXB0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgICAgICpAcGFyYW0gIGZvcm1hdHRpbmcgIERlc2NyaXB0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgICAgICpAcGFyYW0gIG91dHB1dFRvICAgIERlc2NyaXB0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgICAgICpAcmV0dXJuICAgICAgICAgICAgIERlc2NyaXB0aW9uIG9mIHRoZSBSZXR1cm4gVmFsdWUgICAgICovICAgIHByaXZhdGUgc3RhdGljIGludCBtYXRjaE9wdGlvbmFsRm9ybWF0dGluZyhOdW1iZXIgbnVtYmVyLCAgICAgICAgICAgIFN0cmluZyBmb3JtYXR0aW5nLCAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXRUbykgeyAgICAgICAgTnVtYmVyRm9ybWF0IG51bWJlckZvcm1hdCA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOyAgICAgICAgaWYgKCgwIDwgZm9ybWF0dGluZy5sZW5ndGgoKSkgICAgICAgICAgICAgICAgJiYgQ2hhcmFjdGVyLmlzRGlnaXQoZm9ybWF0dGluZy5jaGFyQXQoMCkpKSB7ICAgICAgICAgICAgbnVtYmVyRm9ybWF0LnNldE1pbmltdW1JbnRlZ2VyRGlnaXRzKEludGVnZXIucGFyc2VJbnQoZm9ybWF0dGluZy5jaGFyQXQoMCkgKyAiIikpOyAgICAgICAgICAgIGlmICgoMiA8IGZvcm1hdHRpbmcubGVuZ3RoKCkpICYmIChmb3JtYXR0aW5nLmNoYXJBdCgxKSA9PSAnLicpICAgICAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNEaWdpdChmb3JtYXR0aW5nLmNoYXJBdCgyKSkpIHsgICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0LnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cyhJbnRlZ2VyLnBhcnNlSW50KGZvcm1hdHRpbmcuY2hhckF0KDIpICsgIiIpKTsgICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0LmZvcm1hdChudW1iZXIsIG91dHB1dFRvLCBuZXcgRmllbGRQb3NpdGlvbigwKSk7ICAgICAgICAgICAgICAgIHJldHVybiAzOyAgICAgICAgICAgIH0gICAgICAgICAgICBudW1iZXJGb3JtYXQuZm9ybWF0KG51bWJlciwgb3V0cHV0VG8sIG5ldyBGaWVsZFBvc2l0aW9uKDApKTsgICAgICAgICAgICByZXR1cm4gMTsgICAgICAgIH0gZWxzZSBpZiAoKDAgPCBmb3JtYXR0aW5nLmxlbmd0aCgpKSAmJiAoZm9ybWF0dGluZy5jaGFyQXQoMCkgPT0gJy4nKSkgeyAgICAgICAgICAgIGlmICgoMSA8IGZvcm1hdHRpbmcubGVuZ3RoKCkpICAgICAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNEaWdpdChmb3JtYXR0aW5nLmNoYXJBdCgxKSkpIHsgICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0LnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cyhJbnRlZ2VyLnBhcnNlSW50KGZvcm1hdHRpbmcuY2hhckF0KDEpICsgIiIpKTsgICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0LmZvcm1hdChudW1iZXIsIG91dHB1dFRvLCBuZXcgRmllbGRQb3NpdGlvbigwKSk7ICAgICAgICAgICAgICAgIHJldHVybiAyOyAgICAgICAgICAgIH0gICAgICAgIH0gICAgICAgIG51bWJlckZvcm1hdC5mb3JtYXQobnVtYmVyLCBvdXRwdXRUbywgbmV3IEZpZWxkUG9zaXRpb24oMCkpOyAgICAgICAgcmV0dXJuIDE7ICAgIH0gICAgICAgIC8qKiAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyB3ZSB3YW50IHRvIHVzZSAoSVNPLTg4NTktMSkgICAgICovICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcnJlZEVuY29kaW5nKCkgeyAgICAgICAgcmV0dXJuIEVOQ09ESU5HOyAgICAgICB9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy8qCisgKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiAgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICBkaXN0cmlidXRpb24uCisgKgorICogIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiAgNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIGFuZAorICogICJBcGFjaGUgUE9JIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IKKyAqICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqICA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAiQXBhY2hlIFBPSSIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQKKyAqICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqICBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiAgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiAgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiAgU1VDSCBEQU1BR0UuCisgKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqICBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqICBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqICA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5wb2kudXRpbDsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247CisKKy8qKgorICogIFRpdGxlOiBTdHJpbmcgVXRpbGl0eSBEZXNjcmlwdGlvbjogQ29sbGVjdGlvbiBvZiBzdHJpbmcgaGFuZGxpbmcgdXRpbGl0aWVzCisgKiAKKyAqIE5vdyBpdCBpcyBxdWl0ZSBjb25mdXNpbmc6IHRoZSBtZXRob2QgcGFpcnMsIGluIHdoaWNoCisgKiBvbmUgb2YgdGhlbSB3cml0ZSBkYXRhIGFuZCBvdGhlciByZWFkIHdyaXR0ZW4gZGF0YSBhcmU6CisgKiBwdXRVbmNvbXByZXNzZWRVbmljb2RlSGlnaCBhbmQgZ2V0RnJvbVVuaWNvZGUKKyAqIHB1dFVuY29tcHJlc3NlZFVuaWNvZGUgICAgIGFuZCBnZXRGcm9tVW5pY29kZUhpZ2gKKyAqCisgKkBhdXRob3IgICAgIEFuZHJldyBDLiBPbGl2ZXIKKyAqQGF1dGhvciAgICAgU2VyZ2VpIEtvemVsbG8gKHNlcmdlaWtvemVsbG8gYXQgbWFpbC5ydSkKKyAqQGNyZWF0ZWQgICAgTWF5IDEwLCAyMDAyCisgKkB2ZXJzaW9uICAgIDEuMAorICovCisKK3B1YmxpYyBjbGFzcyBTdHJpbmdVdGlsIHsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU5DT0RJTkc9IklTTy04ODU5LTEiOworICAgIC8qKgorICAgICAqICBDb25zdHJ1Y3RvciBmb3IgdGhlIFN0cmluZ1V0aWwgb2JqZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdVdGlsKCkgeyB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiAgZ2l2ZW4gYSBieXRlIGFycmF5IG9mIDE2LWJpdCB1bmljb2RlIGNoYXJhY3RlcnMsIGNvbXByZXNzIHRvIDgtYml0IGFuZAorICAgICAqICByZXR1cm4gYSBzdHJpbmcKKyAgICAgKgorICAgICAqIHsgMHgxNiwgMHgwMCB9IC0+IDB4MTYKKyAgICAgKiAKKyAgICAgKkBwYXJhbSAgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgdG8gYmUgY29udmVydGVkCisgICAgICpAcGFyYW0gIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIG9mZnNldCBpbnRvIHRoZQorICAgICAqICAgICAgYnl0ZSBhcnJheS4gaXQgaXMgYXNzdW1lZCB0aGF0IHN0cmluZ1sgb2Zmc2V0IF0gYW5kIHN0cmluZ1sgb2Zmc2V0ICsKKyAgICAgKiAgICAgIDEgXSBjb250YWluIHRoZSBmaXJzdCAxNi1iaXQgdW5pY29kZSBjaGFyYWN0ZXIKKyAgICAgKkBwYXJhbSAgbGVuCisgICAgICpAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCisgICAgICpAZXhjZXB0aW9uICBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gIGlmIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIGZvcgorICAgICAqICAgICAgdGhlIGJ5dGUgYXJyYXkgKGkuZS4sIGlzIG5lZ2F0aXZlIG9yIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgICAqICAgICAgc3RyaW5nLmxlbmd0aCkKKyAgICAgKkBleGNlcHRpb24gIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgICAgICAgaWYgbGVuIGlzIHRvbyBsYXJnZSAoaS5lLiwKKyAgICAgKiAgICAgIHRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YSBpbiBzdHJpbmcgdG8gY3JlYXRlIGEgU3RyaW5nIG9mIHRoYXQKKyAgICAgKiAgICAgIGxlbmd0aCkKKyAgICAgKkBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZmluYWwgc3RyaW5nCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGcm9tVW5pY29kZUhpZ2goZmluYWwgYnl0ZVtdIHN0cmluZywKKyAgICAgICAgICAgIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW4pCisgICAgICAgICAgICAgdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoKG9mZnNldCA8IDApIHx8IChvZmZzZXQgPj0gc3RyaW5nLmxlbmd0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIklsbGVnYWwgb2Zmc2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsZW4gPCAwKSB8fCAoKChzdHJpbmcubGVuZ3RoIC0gb2Zmc2V0KSAvIDIpIDwgbGVuKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBsZW5ndGgiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbIGxlbiBdOworICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIGNoYXJzW2ldID0gKGNoYXIpKCBzdHJpbmdbIG9mZnNldCArICggMippICkgXSAmIDB4RkYgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBzdHJpbmdbIG9mZnNldCArICggMippKzEgKSBdIDw8IDggKSApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIGNoYXJzICk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqICBnaXZlbiBhIGJ5dGUgYXJyYXkgb2YgMTYtYml0IHVuaWNvZGUgY2hhcmFjdGVycywgY29tcHJlc3MgdG8gOC1iaXQgYW5kCisgICAgICogIHJldHVybiBhIHN0cmluZworICAgICAqIAorICAgICAqIHsgMHgxNiwgMHgwMCB9IC0+IDB4MTYKKyAgICAgKgorICAgICAqQHBhcmFtICBzdHJpbmcgIHRoZSBieXRlIGFycmF5IHRvIGJlIGNvbnZlcnRlZAorICAgICAqQHJldHVybiAgICAgICAgIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGcm9tVW5pY29kZUhpZ2goIGZpbmFsIGJ5dGVbXSBzdHJpbmcgKSB7CisgICAgICAgIHJldHVybiBnZXRGcm9tVW5pY29kZUhpZ2goIHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCAvIDIgKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBnaXZlbiBhIGJ5dGUgYXJyYXkgb2YgMTYtYml0IHVuaWNvZGUgY2hhcmFjdGVycywgY29tcHJlc3MgdG8gOC1iaXQgYW5kCisgICAgICogIHJldHVybiBhIHN0cmluZworICAgICAqIAorICAgICAqIHsgMHgwMCwgMHgxNiB9IC0+IDB4MTYKKyAgICAgKgorICAgICAqQHBhcmFtICBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKkBwYXJhbSAgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgb2Zmc2V0IGludG8gdGhlCisgICAgICogICAgICBieXRlIGFycmF5LiBpdCBpcyBhc3N1bWVkIHRoYXQgc3RyaW5nWyBvZmZzZXQgXSBhbmQgc3RyaW5nWyBvZmZzZXQgKworICAgICAqICAgICAgMSBdIGNvbnRhaW4gdGhlIGZpcnN0IDE2LWJpdCB1bmljb2RlIGNoYXJhY3RlcgorICAgICAqQHBhcmFtICBsZW4KKyAgICAgKkByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbnZlcnRlZCBzdHJpbmcKKyAgICAgKkBleGNlcHRpb24gIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAgaWYgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgZm9yCisgICAgICogICAgICB0aGUgYnl0ZSBhcnJheSAoaS5lLiwgaXMgbmVnYXRpdmUgb3IgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICogICAgICBzdHJpbmcubGVuZ3RoKQorICAgICAqQGV4Y2VwdGlvbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICAgICBpZiBsZW4gaXMgdG9vIGxhcmdlIChpLmUuLAorICAgICAqICAgICAgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIGluIHN0cmluZyB0byBjcmVhdGUgYSBTdHJpbmcgb2YgdGhhdAorICAgICAqICAgICAgbGVuZ3RoKQorICAgICAqQGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBmaW5hbCBzdHJpbmcKKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZyb21Vbmljb2RlKGZpbmFsIGJ5dGVbXSBzdHJpbmcsCisgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuKQorICAgICAgICAgICAgIHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSBzdHJpbmcubGVuZ3RoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSWxsZWdhbCBvZmZzZXQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGxlbiA8IDApIHx8ICgoKHN0cmluZy5sZW5ndGggLSBvZmZzZXQpIC8gMikgPCBsZW4pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGxlbmd0aCIpOworICAgICAgICB9CisKKyAgICAgICAgCisgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWyBsZW4gXTsKKyAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBjaGFyc1tpXSA9IChjaGFyKSggKCBzdHJpbmdbIG9mZnNldCArICggMippICkgXSA8PCA4ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nWyBvZmZzZXQgKyAoIDIqaSsxICkgXSApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyggY2hhcnMgKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBnaXZlbiBhIGJ5dGUgYXJyYXkgb2YgMTYtYml0IHVuaWNvZGUgY2hhcmFjdGVycywgY29tcHJlc3MgdG8gOC1iaXQgYW5kCisgICAgICogIHJldHVybiBhIHN0cmluZworICAgICAqIAorICAgICAqIHsgMHgwMCwgMHgxNiB9IC0+IDB4MTYKKyAgICAgKgorICAgICAqQHBhcmFtICBzdHJpbmcgIHRoZSBieXRlIGFycmF5IHRvIGJlIGNvbnZlcnRlZAorICAgICAqQHJldHVybiAgICAgICAgIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGcm9tVW5pY29kZShmaW5hbCBieXRlW10gc3RyaW5nKSB7CisgICAgICAgIHJldHVybiBnZXRGcm9tVW5pY29kZShzdHJpbmcsIDAsIHN0cmluZy5sZW5ndGggLyAyKTsKKyAgICB9CisKKworICAgICAgLyoqCisgICAgICAqIHJlYWQgY29tcHJlc3NlZCB1bmljb2RlKDhiaXQpCisgICAgICAqIAorICAgICAgKiBAYXV0aG9yIFRvc2hpYWtpIEthbW9zaGlkYShrYW1vc2hpZGEudG9zaGlha2kgYXQgZnV0dXJlIGRvdCBjbyBkb3QganApCisgICAgICAqIAorICAgICAgKiBAcGFyYW0gc3RyaW5nIGJ5dGUgYXJyYXkgdG8gcmVhZAorICAgICAgKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCB0byByZWFkIGJ5dGUgYXJyYXkKKyAgICAgICogQHBhcmFtIGxlbiAgICBsZW5ndGggdG8gcmVhZCBieXRlIGFycmF5CisgICAgICAqIEByZXR1cm4gU3RyaW5nIGdlbmVyYXRlZCBTdHJpbmcgaW5zdGFuY2UgYnkgcmVhZGluZyBieXRlIGFycmF5CisgICAgICAqLworICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGcm9tQ29tcHJlc3NlZFVuaWNvZGUoZmluYWwgYnl0ZVtdIHN0cmluZywKKyAgICAgICAgICAgIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW4peworICAgICAgICAgdHJ5eworICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHN0cmluZyxvZmZzZXQsbGVuLCJJU08tODg1OS0xIik7CisgICAgICAgICB9CisgICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7LyogdW5yZWFjaGFibGUgKi8KKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCisgICAgICogIHdyaXRlIGNvbXByZXNzZWQgdW5pY29kZQorICAgICAqCisgICAgICpAcGFyYW0gIGlucHV0ICAgdGhlIFN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAgICAgKkBwYXJhbSAgb3V0cHV0ICB0aGUgYnl0ZSBhcnJheSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuCisgICAgICpAcGFyYW0gIG9mZnNldCAgYW4gb2Zmc2V0IGludG8gdGhlIGJ5dGUgYXJyYXQgYXQgd2hpY2ggdGhlIGRhdGEgaXMgc3RhcnQKKyAgICAgKiAgICAgIHdoZW4gd3JpdHRlbgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dENvbXByZXNzZWRVbmljb2RlKGZpbmFsIFN0cmluZyBpbnB1dCwKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBvdXRwdXQsCisgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCBzdHJsZW4gPSBpbnB1dC5sZW5ndGgoKTsKKworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHN0cmxlbjsgaysrKSB7CisgICAgICAgICAgICBvdXRwdXRbb2Zmc2V0ICsga10gPSAoYnl0ZSkgaW5wdXQuY2hhckF0KGspOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgV3JpdGUgdW5jb21wcmVzc2VkIHVuaWNvZGUKKyAgICAgKgorICAgICAqQHBhcmFtICBpbnB1dCAgIHRoZSBTdHJpbmcgY29udGFpbmluZyB0aGUgdW5pY29kZSBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAgICAgKkBwYXJhbSAgb3V0cHV0ICB0aGUgYnl0ZSBhcnJheSB0byBob2xkIHRoZSB1bmNvbXByZXNzZWQgdW5pY29kZQorICAgICAqQHBhcmFtICBvZmZzZXQgIHRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBpbnRvIHRoZSBieXRlIGFycmF5CisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0VW5jb21wcmVzc2VkVW5pY29kZShmaW5hbCBTdHJpbmcgaW5wdXQsCisgICAgICAgICAgICBmaW5hbCBieXRlW10gb3V0cHV0LAorICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCkgeworICAgICAgICBpbnQgc3RybGVuID0gaW5wdXQubGVuZ3RoKCk7CisKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzdHJsZW47IGsrKykgeworICAgICAgICAgICAgY2hhciBjID0gaW5wdXQuY2hhckF0KGspOworCisgICAgICAgICAgICBvdXRwdXRbb2Zmc2V0ICsgKDIgKiBrKV0gPSAoYnl0ZSkgYzsKKyAgICAgICAgICAgIG91dHB1dFtvZmZzZXQgKyAoMiAqIGspICsgMV0gPSAoYnl0ZSkgKGMgPj4gOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgV3JpdGUgdW5jb21wcmVzc2VkIHVuaWNvZGUKKyAgICAgKgorICAgICAqQHBhcmFtICBpbnB1dCAgIHRoZSBTdHJpbmcgY29udGFpbmluZyB0aGUgdW5pY29kZSBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAgICAgKkBwYXJhbSAgb3V0cHV0ICB0aGUgYnl0ZSBhcnJheSB0byBob2xkIHRoZSB1bmNvbXByZXNzZWQgdW5pY29kZQorICAgICAqQHBhcmFtICBvZmZzZXQgIHRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBpbnRvIHRoZSBieXRlIGFycmF5CisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0VW5jb21wcmVzc2VkVW5pY29kZUhpZ2goZmluYWwgU3RyaW5nIGlucHV0LAorICAgICAgICAgICAgZmluYWwgYnl0ZVtdIG91dHB1dCwKKyAgICAgICAgICAgIGZpbmFsIGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IHN0cmxlbiA9IGlucHV0Lmxlbmd0aCgpOworCisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc3RybGVuOyBrKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IGlucHV0LmNoYXJBdChrKTsKKworICAgICAgICAgICAgb3V0cHV0W29mZnNldCArICgyICogayldID0gKGJ5dGUpIChjID4+IDgpOworICAgICAgICAgICAgb3V0cHV0W29mZnNldCArICgyICogayldID0gKGJ5dGUpIGM7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiAgRGVzY3JpcHRpb24gb2YgdGhlIE1ldGhvZAorICAgICAqCisgICAgICpAcGFyYW0gIG1lc3NhZ2UgIERlc2NyaXB0aW9uIG9mIHRoZSBQYXJhbWV0ZXIKKyAgICAgKkBwYXJhbSAgcGFyYW1zICAgRGVzY3JpcHRpb24gb2YgdGhlIFBhcmFtZXRlcgorICAgICAqQHJldHVybiAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgUmV0dXJuIFZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBtZXNzYWdlLCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgaW50IGN1cnJlbnRQYXJhbU51bWJlciA9IDA7CisgICAgICAgIFN0cmluZ0J1ZmZlciBmb3JtYXR0ZWRNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5jaGFyQXQoaSkgPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJhbU51bWJlciA+PSBwYXJhbXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKCI/bWlzc2luZyBkYXRhPyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBhcmFtc1tjdXJyZW50UGFyYW1OdW1iZXJdIGluc3RhbmNlb2YgTnVtYmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGkgKyAxIDwgbWVzc2FnZS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaSArPSBtYXRjaE9wdGlvbmFsRm9ybWF0dGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTnVtYmVyKSBwYXJhbXNbY3VycmVudFBhcmFtTnVtYmVyKytdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3Vic3RyaW5nKGkgKyAxKSwgZm9ybWF0dGVkTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQocGFyYW1zW2N1cnJlbnRQYXJhbU51bWJlcisrXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZS5jaGFyQXQoaSkgPT0gJ1xcJykgJiYgKGkgKyAxIDwgbWVzc2FnZS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtZXNzYWdlLmNoYXJBdChpICsgMSkgPT0gJyUnKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgnJScpOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQobWVzc2FnZS5jaGFyQXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9ybWF0dGVkTWVzc2FnZS50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIERlc2NyaXB0aW9uIG9mIHRoZSBNZXRob2QKKyAgICAgKgorICAgICAqQHBhcmFtICBudW1iZXIgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgUGFyYW1ldGVyCisgICAgICpAcGFyYW0gIGZvcm1hdHRpbmcgIERlc2NyaXB0aW9uIG9mIHRoZSBQYXJhbWV0ZXIKKyAgICAgKkBwYXJhbSAgb3V0cHV0VG8gICAgRGVzY3JpcHRpb24gb2YgdGhlIFBhcmFtZXRlcgorICAgICAqQHJldHVybiAgICAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgUmV0dXJuIFZhbHVlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1hdGNoT3B0aW9uYWxGb3JtYXR0aW5nKE51bWJlciBudW1iZXIsCisgICAgICAgICAgICBTdHJpbmcgZm9ybWF0dGluZywKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXRUbykgeworICAgICAgICBOdW1iZXJGb3JtYXQgbnVtYmVyRm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgaWYgKCgwIDwgZm9ybWF0dGluZy5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNEaWdpdChmb3JtYXR0aW5nLmNoYXJBdCgwKSkpIHsKKyAgICAgICAgICAgIG51bWJlckZvcm1hdC5zZXRNaW5pbXVtSW50ZWdlckRpZ2l0cyhJbnRlZ2VyLnBhcnNlSW50KGZvcm1hdHRpbmcuY2hhckF0KDApICsgIiIpKTsKKyAgICAgICAgICAgIGlmICgoMiA8IGZvcm1hdHRpbmcubGVuZ3RoKCkpICYmIChmb3JtYXR0aW5nLmNoYXJBdCgxKSA9PSAnLicpCisgICAgICAgICAgICAgICAgICAgICYmIENoYXJhY3Rlci5pc0RpZ2l0KGZvcm1hdHRpbmcuY2hhckF0KDIpKSkgeworICAgICAgICAgICAgICAgIG51bWJlckZvcm1hdC5zZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoSW50ZWdlci5wYXJzZUludChmb3JtYXR0aW5nLmNoYXJBdCgyKSArICIiKSk7CisgICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0LmZvcm1hdChudW1iZXIsIG91dHB1dFRvLCBuZXcgRmllbGRQb3NpdGlvbigwKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1iZXJGb3JtYXQuZm9ybWF0KG51bWJlciwgb3V0cHV0VG8sIG5ldyBGaWVsZFBvc2l0aW9uKDApKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgaWYgKCgwIDwgZm9ybWF0dGluZy5sZW5ndGgoKSkgJiYgKGZvcm1hdHRpbmcuY2hhckF0KDApID09ICcuJykpIHsKKyAgICAgICAgICAgIGlmICgoMSA8IGZvcm1hdHRpbmcubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICYmIENoYXJhY3Rlci5pc0RpZ2l0KGZvcm1hdHRpbmcuY2hhckF0KDEpKSkgeworICAgICAgICAgICAgICAgIG51bWJlckZvcm1hdC5zZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoSW50ZWdlci5wYXJzZUludChmb3JtYXR0aW5nLmNoYXJBdCgxKSArICIiKSk7CisgICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0LmZvcm1hdChudW1iZXIsIG91dHB1dFRvLCBuZXcgRmllbGRQb3NpdGlvbigwKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbnVtYmVyRm9ybWF0LmZvcm1hdChudW1iZXIsIG91dHB1dFRvLCBuZXcgRmllbGRQb3NpdGlvbigwKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyB3ZSB3YW50IHRvIHVzZSAoSVNPLTg4NTktMSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmZXJyZWRFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIEVOQ09ESU5HOyAgIAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL1N5c3RlbU91dExvZ2dlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9wb2kvdXRpbC9TeXN0ZW1PdXRMb2dnZXIuamF2YQppbmRleCBjY2Q5NTIyLi45ODQ1OGY3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL3BvaS91dGlsL1N5c3RlbU91dExvZ2dlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvcG9pL3V0aWwvU3lzdGVtT3V0TG9nZ2VyLmphdmEKQEAgLTYzLDEzICs2MywxMiBAQAogICogQSBsb2dnZXIgY2xhc3MgdGhhdCBzdHJpdmVzIHRvIG1ha2UgaXQgYXMgZWFzeSBhcyBwb3NzaWJsZSBmb3IKICAqIGRldmVsb3BlcnMgdG8gd3JpdGUgbG9nIGNhbGxzLCB3aGlsZSBzaW11bHRhbmVvdXNseSBtYWtpbmcgdGhvc2UKICAqIGNhbGxzIGFzIGNoZWFwIGFzIHBvc3NpYmxlIGJ5IHBlcmZvcm1pbmcgbGF6eSBldmFsdWF0aW9uIG9mIHRoZSBsb2cKLSAqIG1lc3NhZ2UuPHA+CisgKiBtZXNzYWdlLgogICoKICAqIEBhdXRob3IgTWFyYyBKb2huc29uIChtam9obnNvbiBhdCBhcGFjaGUgZG90IG9yZykKICAqIEBhdXRob3IgR2xlbiBTdGFtcG91bHR6aXMgKGdsZW5zIGF0IGFwYWNoZS5vcmcpCiAgKiBAYXV0aG9yIE5pY29sYSBLZW4gQmFyb3p6aSAobmljb2xha2VuIGF0IGFwYWNoZS5vcmcpCiAgKi8KLQogcHVibGljIGNsYXNzIFN5c3RlbU91dExvZ2dlciBleHRlbmRzIFBPSUxvZ2dlcgogewogICAgIHByaXZhdGUgU3RyaW5nIGNhdDsKQEAgLTg4LDE5ICs4NywyNyBAQAogCiAgICAgcHVibGljIHZvaWQgbG9nKGZpbmFsIGludCBsZXZlbCwgZmluYWwgT2JqZWN0IG9iajEpCiAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlsiK2NhdCsiXSAiK29iajEpOworICAgICAgICBpZiAoY2hlY2sobGV2ZWwpKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbIitjYXQrIl0gIitvYmoxKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiBhIGxvZ2dlciBpcyBlbmFibGVkIHRvIGxvZyBhdCB0aGUgc3BlY2lmaWVkIGxldmVsCiAgICAgICoKICAgICAgKiBAcGFyYW0gbGV2ZWwgT25lIG9mIERFQlVHLCBJTkZPLCBXQVJOLCBFUlJPUiwgRkFUQUwKLSAgICAgKiBAcGFyYW0gb2JqMSBUaGUgbG9nZ2VyIHRvIGNoZWNrLgorICAgICAqIEBzZWUgI0RFQlVHCisgICAgICogQHNlZSAjSU5GTworICAgICAqIEBzZWUgI1dBUk4KKyAgICAgKiBAc2VlICNFUlJPUgorICAgICAqIEBzZWUgI0ZBVEFMCiAgICAgICovCi0KICAgICBwdWJsaWMgYm9vbGVhbiBjaGVjayhmaW5hbCBpbnQgbGV2ZWwpCiAgICAgewotICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpbnQgY3VycmVudExldmVsID0gSW50ZWdlci5wYXJzZUludChTeXN0ZW0uZ2V0UHJvcGVydHkoInBvaS5sb2cubGV2ZWwiLCBXQVJOICsgIiIpKTsKKyAgICAgICAgaWYgKGxldmVsID49IGN1cnJlbnRMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgCmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvYmFzaWMvUE9JRmlsZS5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9ocHNmL2Jhc2ljL1BPSUZpbGUuamF2YQppbmRleCA5Nzg2ZjM1Li4yODgyNDJmIDEwMDY0NAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvYmFzaWMvUE9JRmlsZS5qYXZhCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9QT0lGaWxlLmphdmEKQEAgLTUzLDcgKzUzLDggQEAKICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhwc2YuYmFzaWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5wb2kucG9pZnMuZmlsZXN5c3RlbS4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kucG9pZnMuZmlsZXN5c3RlbS5QT0lGU0RvY3VtZW50UGF0aDsKIAogCiAKQEAgLTczLDMyICs3NCwzMiBAQAogCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkKICAgICB7Ci0JdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQogICAgIHsKLQlyZXR1cm4gbmFtZTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0UGF0aChmaW5hbCBQT0lGU0RvY3VtZW50UGF0aCBwYXRoKQogICAgIHsKLQl0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwogICAgIH0KIAogICAgIHB1YmxpYyBQT0lGU0RvY3VtZW50UGF0aCBnZXRQYXRoKCkKICAgICB7Ci0JcmV0dXJuIHBhdGg7CisgICAgICAgIHJldHVybiBwYXRoOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEJ5dGVzKGZpbmFsIGJ5dGVbXSBieXRlcykKICAgICB7Ci0JdGhpcy5ieXRlcyA9IGJ5dGVzOworICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7CiAgICAgfQogCiAgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpCiAgICAgewotCXJldHVybiBieXRlczsKKyAgICAgICAgcmV0dXJuIGJ5dGVzOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9ocHNmL2Jhc2ljL1Rlc3RCYXNpYy5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9ocHNmL2Jhc2ljL1Rlc3RCYXNpYy5qYXZhCmluZGV4IDQ3NDQ4OWIuLjAzNTdjNWEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9UZXN0QmFzaWMuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvYmFzaWMvVGVzdEJhc2ljLmphdmEKQEAgLTU0LDEwICs1NCwyMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhwc2YuYmFzaWM7CiAKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi4qOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi5Eb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLkhQU0ZFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi5NYXJrVW5zdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi5Ob1Byb3BlcnR5U2V0U3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhwc2YuUHJvcGVydHlTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi5Qcm9wZXJ0eVNldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi5TdW1tYXJ5SW5mb3JtYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi5VbmV4cGVjdGVkUHJvcGVydHlTZXRUeXBlRXhjZXB0aW9uOwogCiAKIApAQCAtNzEsMzcgKzg0LDM3IEBACiBwdWJsaWMgY2xhc3MgVGVzdEJhc2ljIGV4dGVuZHMgVGVzdENhc2UKIHsKIAotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgUE9JX0ZTID0gIlRlc3RHZXJtYW5Xb3JkOTAuZG9jIjsKLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUE9JX0ZJTEVTID0gbmV3IFN0cmluZ1tdCi0JewotCSAgICAiXDAwNVN1bW1hcnlJbmZvcm1hdGlvbiIsCi0JICAgICJcMDA1RG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24iLAotCSAgICAiV29yZERvY3VtZW50IiwKLQkgICAgIlwwMDFDb21wT2JqIiwKLQkgICAgIjFUYWJsZSIKLQl9OwotICAgIGZpbmFsIHN0YXRpYyBpbnQgQllURV9PUkRFUiA9IDB4ZmZmZTsKLSAgICBmaW5hbCBzdGF0aWMgaW50IEZPUk1BVCAgICAgPSAweDAwMDA7Ci0gICAgZmluYWwgc3RhdGljIGludCBPU19WRVJTSU9OID0gMHgwMDAyMEEwNDsKLSAgICBmaW5hbCBzdGF0aWMgYnl0ZVtdIENMQVNTX0lEID0KLQl7Ci0JICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAotCSAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKLQkgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCi0JICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwCi0JfTsKLSAgICBmaW5hbCBzdGF0aWMgaW50W10gU0VDVElPTl9DT1VOVCA9CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQT0lfRlMgPSAiVGVzdEdlcm1hbldvcmQ5MC5kb2MiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQT0lfRklMRVMgPSBuZXcgU3RyaW5nW10KKyAgICAgICAgeworICAgICAgICAgICAgIlwwMDVTdW1tYXJ5SW5mb3JtYXRpb24iLAorICAgICAgICAgICAgIlwwMDVEb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbiIsCisgICAgICAgICAgICAiV29yZERvY3VtZW50IiwKKyAgICAgICAgICAgICJcMDAxQ29tcE9iaiIsCisgICAgICAgICAgICAiMVRhYmxlIgorICAgICAgICB9OworICAgIHN0YXRpYyBmaW5hbCBpbnQgQllURV9PUkRFUiA9IDB4ZmZmZTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZPUk1BVCAgICAgPSAweDAwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBPU19WRVJTSU9OID0gMHgwMDAyMEEwNDsKKyAgICBzdGF0aWMgZmluYWwgYnl0ZVtdIENMQVNTX0lEID0KKyAgICAgICAgeworICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgICAgICAgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAKKyAgICAgICAgfTsKKyAgICBzdGF0aWMgZmluYWwgaW50W10gU0VDVElPTl9DT1VOVCA9CiAgICAgICAgIHsxLCAyfTsKLSAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIElTX1NVTU1BUllfSU5GT1JNQVRJT04gPQorICAgIHN0YXRpYyBmaW5hbCBib29sZWFuW10gSVNfU1VNTUFSWV9JTkZPUk1BVElPTiA9CiAgICAgICAgIHt0cnVlLCBmYWxzZX07Ci0gICAgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBJU19ET0NVTUVOVF9TVU1NQVJZX0lORk9STUFUSU9OID0KLSAgICAgICAge2ZhbHNlLCB0cnVlfTsJICAgIAorICAgIHN0YXRpYyBmaW5hbCBib29sZWFuW10gSVNfRE9DVU1FTlRfU1VNTUFSWV9JTkZPUk1BVElPTiA9CisgICAgICAgIHtmYWxzZSwgdHJ1ZX07ICAgICAgICAgICAgCiAKICAgICBQT0lGaWxlW10gcG9pRmlsZXM7CiAKIAogCi0gICAgcHVibGljIFRlc3RCYXNpYyhTdHJpbmcgbmFtZSkKKyAgICBwdWJsaWMgVGVzdEJhc2ljKGZpbmFsIFN0cmluZyBuYW1lKQogICAgIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQpAQCAtMTEzLDExICsxMjYsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgICAgewotCWZpbmFsIEZpbGUgZGF0YURpciA9Ci0JICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFBTRi50ZXN0ZGF0YS5wYXRoIikpOwotCWZpbmFsIEZpbGUgZGF0YSA9IG5ldyBGaWxlKGRhdGFEaXIsIFBPSV9GUyk7CisgICAgICAgIGZpbmFsIEZpbGUgZGF0YURpciA9CisgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoIkhQU0YudGVzdGRhdGEucGF0aCIpKTsKKyAgICAgICAgZmluYWwgRmlsZSBkYXRhID0gbmV3IEZpbGUoZGF0YURpciwgUE9JX0ZTKTsKIAotCXBvaUZpbGVzID0gVXRpbC5yZWFkUE9JRmlsZXMoZGF0YSk7CisgICAgICAgIHBvaUZpbGVzID0gVXRpbC5yZWFkUE9JRmlsZXMoZGF0YSk7CiAgICAgfQogCiAKQEAgLTEyOCw5ICsxNDEsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRmlsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0JU3RyaW5nW10gZXhwZWN0ZWQgPSBQT0lfRklMRVM7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKLQkgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwb2lGaWxlc1tpXS5nZXROYW1lKCksIGV4cGVjdGVkW2ldKTsKKyAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWQgPSBQT0lfRklMRVM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBvaUZpbGVzW2ldLmdldE5hbWUoKSwgZXhwZWN0ZWRbaV0pOwogICAgIH0KIAogCkBAIC0xNDYsMzcgKzE1OSwzNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQcm9wZXJ0eVNldHMoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0JQ2xhc3NbXSBleHBlY3RlZCA9IG5ldyBDbGFzc1tdCi0JICAgIHsKLQkJU3VtbWFyeUluZm9ybWF0aW9uLmNsYXNzLAotCQlEb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbi5jbGFzcywKLQkJTm9Qcm9wZXJ0eVNldFN0cmVhbUV4Y2VwdGlvbi5jbGFzcywKLQkJTm9Qcm9wZXJ0eVNldFN0cmVhbUV4Y2VwdGlvbi5jbGFzcywKLQkJTm9Qcm9wZXJ0eVNldFN0cmVhbUV4Y2VwdGlvbi5jbGFzcwotCSAgICB9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspCi0JewotCSAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2lGaWxlc1tpXS5nZXRCeXRlcygpKTsKLQkgICAgT2JqZWN0IG87Ci0JICAgIHRyeQotCSAgICB7Ci0JCW8gPSBQcm9wZXJ0eVNldEZhY3RvcnkuY3JlYXRlKGluKTsKLQkgICAgfQotCSAgICBjYXRjaCAoTm9Qcm9wZXJ0eVNldFN0cmVhbUV4Y2VwdGlvbiBleCkKLQkgICAgewotCQlvID0gZXg7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKFVuZXhwZWN0ZWRQcm9wZXJ0eVNldFR5cGVFeGNlcHRpb24gZXgpCi0JICAgIHsKLQkJbyA9IGV4OwotCSAgICB9Ci0JICAgIGNhdGNoIChNYXJrVW5zdXBwb3J0ZWRFeGNlcHRpb24gZXgpCi0JICAgIHsKLQkJbyA9IGV4OwotCSAgICB9Ci0JICAgIGluLmNsb3NlKCk7Ci0JICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoby5nZXRDbGFzcygpLCBleHBlY3RlZFtpXSk7Ci0JfQorICAgICAgICBDbGFzc1tdIGV4cGVjdGVkID0gbmV3IENsYXNzW10KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdW1tYXJ5SW5mb3JtYXRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgRG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgTm9Qcm9wZXJ0eVNldFN0cmVhbUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICBOb1Byb3BlcnR5U2V0U3RyZWFtRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgIE5vUHJvcGVydHlTZXRTdHJlYW1FeGNlcHRpb24uY2xhc3MKKyAgICAgICAgICAgIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBvaUZpbGVzW2ldLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgT2JqZWN0IG87CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvID0gUHJvcGVydHlTZXRGYWN0b3J5LmNyZWF0ZShpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoTm9Qcm9wZXJ0eVNldFN0cmVhbUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvID0gZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVW5leHBlY3RlZFByb3BlcnR5U2V0VHlwZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvID0gZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoTWFya1Vuc3VwcG9ydGVkRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG8gPSBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG8uZ2V0Q2xhc3MoKSwgZXhwZWN0ZWRbaV0pOworICAgICAgICB9CiAgICAgfQogCiAKQEAgLTE4OCwyNSArMjAxLDI0IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5U2V0TWV0aG9kcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSFBTRkV4Y2VwdGlvbgogICAgIHsKLQlTdHJpbmdbXSBleHBlY3RlZCA9IFBPSV9GSUxFUzsKIAotCS8qIExvb3Agb3ZlciB0aGUgdHdvIHByb3BlcnR5IHNldHMuICovCi0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCSAgICBieXRlW10gYiA9IHBvaUZpbGVzW2ldLmdldEJ5dGVzKCk7Ci0JICAgIFByb3BlcnR5U2V0IHBzID0KLQkJUHJvcGVydHlTZXRGYWN0b3J5LmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYikpOwotCSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBzLmdldEJ5dGVPcmRlcigpLCBCWVRFX09SREVSKTsKLQkgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwcy5nZXRGb3JtYXQoKSwgRk9STUFUKTsKLQkgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwcy5nZXRPU1ZlcnNpb24oKSwgT1NfVkVSU0lPTik7Ci0JICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFN0cmluZyhwcy5nZXRDbGFzc0lEKCkuZ2V0Qnl0ZXMoKSksCi0JCQkJbmV3IFN0cmluZyhDTEFTU19JRCkpOwotCSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBzLmdldFNlY3Rpb25Db3VudCgpLCBTRUNUSU9OX0NPVU5UW2ldKTsKLQkgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwcy5pc1N1bW1hcnlJbmZvcm1hdGlvbigpLAotCQkJCUlTX1NVTU1BUllfSU5GT1JNQVRJT05baV0pOwotCSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBzLmlzRG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24oKSwKLQkJCQlJU19ET0NVTUVOVF9TVU1NQVJZX0lORk9STUFUSU9OW2ldKTsKLQl9CisgICAgICAgIC8qIExvb3Agb3ZlciB0aGUgdHdvIHByb3BlcnR5IHNldHMuICovCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYiA9IHBvaUZpbGVzW2ldLmdldEJ5dGVzKCk7CisgICAgICAgICAgICBQcm9wZXJ0eVNldCBwcyA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlTZXRGYWN0b3J5LmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYikpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwcy5nZXRCeXRlT3JkZXIoKSwgQllURV9PUkRFUik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBzLmdldEZvcm1hdCgpLCBGT1JNQVQpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwcy5nZXRPU1ZlcnNpb24oKSwgT1NfVkVSU0lPTik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmcocHMuZ2V0Q2xhc3NJRCgpLmdldEJ5dGVzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKENMQVNTX0lEKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBzLmdldFNlY3Rpb25Db3VudCgpLCBTRUNUSU9OX0NPVU5UW2ldKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocHMuaXNTdW1tYXJ5SW5mb3JtYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfU1VNTUFSWV9JTkZPUk1BVElPTltpXSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBzLmlzRG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfRE9DVU1FTlRfU1VNTUFSWV9JTkZPUk1BVElPTltpXSk7CisgICAgICAgIH0KICAgICB9CiAKIApAQCAtMjE0LDExICsyMjYsMTEgQEAKICAgICAvKioKICAgICAgKiA8cD5SdW5zIHRoZSB0ZXN0IGNhc2VzIHN0YW5kLWFsb25lLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLQlTeXN0ZW0uc2V0UHJvcGVydHkoIkhQU0YudGVzdGRhdGEucGF0aCIsCi0JCQkgICAiLi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvZGF0YSIpOwotCWp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihUZXN0QmFzaWMuY2xhc3MpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIkhQU0YudGVzdGRhdGEucGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvZGF0YSIpOworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oVGVzdEJhc2ljLmNsYXNzKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9UZXN0Q2xhc3NJRC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9ocHNmL2Jhc2ljL1Rlc3RDbGFzc0lELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2ZjgxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9UZXN0Q2xhc3NJRC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjENCisgKg0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzDQorICogcmVzZXJ2ZWQuDQorICoNCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCisgKiBhcmUgbWV0Og0KKyAqDQorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICoNCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbg0KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisgKiAgICBkaXN0cmlidXRpb24uDQorICoNCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwNCisgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50Og0KKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQ0KKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIg0KKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwNCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLg0KKyAqDQorICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIGFuZA0KKyAqICAgICJBcGFjaGUgUE9JIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cw0KKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3INCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLg0KKyAqDQorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsDQorICogICAgIkFwYWNoZSBQT0kiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0DQorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4NCisgKg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQNCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUw0KKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFDQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUg0KKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRg0KKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQNCisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQNCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YNCisgKiBTVUNIIERBTUFHRS4NCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkNCisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUNCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUNCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uDQorICovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5ocHNmLmJhc2ljOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUucG9pLmhwc2YuQ2xhc3NJRDsNCisNCisvKioNCisgKiA8cD5UZXN0cyBDbGFzc0lEIHN0cnVjdHVyZS48L3A+DQorICoNCisgKiBAYXV0aG9yIE1pY2hhZWwgWmFsZXdza2kgKHphbGV3c2tpQG9wdG9ubGluZS5uZXQpDQorICovDQorcHVibGljIGNsYXNzIFRlc3RDbGFzc0lEIGV4dGVuZHMgVGVzdENhc2UNCit7DQorICAgIC8qKg0KKyAgICAgKiA8cD5Db25zdHJ1Y3RvcjwvcD4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSB0ZXN0IGNhc2UncyBuYW1lDQorICAgICAqLw0KKyAgICBwdWJsaWMgVGVzdENsYXNzSUQoZmluYWwgU3RyaW5nIG5hbWUpDQorICAgIHsNCisgICAgICAgIHN1cGVyKG5hbWUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBWYXJpb3VzIHRlc3RzIG9mIG92ZXJyaWRkZW4gLmVxdWFscygpDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkNCisgICAgew0KKyAgICAgICAgQ2xhc3NJRCBjbHNpZFRlc3QxID0gbmV3IENsYXNzSUQoDQorICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAgfQ0KKyAgICAgICAgICAgICwgMA0KKyAgICAgICAgKTsNCisgICAgICAgIENsYXNzSUQgY2xzaWRUZXN0MiA9IG5ldyBDbGFzc0lEKA0KKyAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgNCisgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwIH0NCisgICAgICAgICAgICAsIDANCisgICAgICAgICk7DQorICAgICAgICBDbGFzc0lEIGNsc2lkVGVzdDMgPSBuZXcgQ2xhc3NJRCgNCisgICAgICAgICAgICAgIG5ldyBieXRlW10geyAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4DQorICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMSB9DQorICAgICAgICAgICAgLCAwDQorICAgICAgICApOw0KKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggY2xzaWRUZXN0MSwgY2xzaWRUZXN0MSk7DQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBjbHNpZFRlc3QxLCBjbHNpZFRlc3QyKTsNCisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSggY2xzaWRUZXN0MS5lcXVhbHMoIGNsc2lkVGVzdDMpKTsNCisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSggY2xzaWRUZXN0MS5lcXVhbHMoIG51bGwpKTsNCisgICAgfQ0KKyAgICAvKioNCisgICAgICogVHJ5IHRvIHdyaXRlIHRvIGEgYnVmZmVyIHRoYXQgaXMgdG9vIHNtYWxsLiBUaGlzIHNob3VsZA0KKyAgICAgKiAgIHRocm93IGFuIEV4Y2VwdGlvbg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlQXJyYXlTdG9yZUV4Y2VwdGlvbigpDQorICAgIHsNCisgICAgICAgIENsYXNzSUQgY2xzaWRUZXN0ID0gbmV3IENsYXNzSUQoDQorICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAgfQ0KKyAgICAgICAgICAgICwgMA0KKyAgICAgICAgKTsNCisgICAgICAgIGJvb2xlYW4gYkV4Y2VwdGlvbk9jY3VycmVkID0gZmFsc2U7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGNsc2lkVGVzdC53cml0ZSggbmV3IGJ5dGVbIDE1XSwgMCk7DQorICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGJFeGNlcHRpb25PY2N1cnJlZCA9IHRydWU7DQorICAgICAgICB9DQorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYkV4Y2VwdGlvbk9jY3VycmVkKTsNCisNCisgICAgICAgIGJFeGNlcHRpb25PY2N1cnJlZCA9IGZhbHNlOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBjbHNpZFRlc3Qud3JpdGUoIG5ldyBieXRlWyAxNl0sIDEpOw0KKyAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBiRXhjZXB0aW9uT2NjdXJyZWQgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJFeGNlcHRpb25PY2N1cnJlZCk7DQorDQorICAgICAgICAvLyBUaGVzZSBzaG91bGQgd29yayB3aXRob3V0IHRocm93aW5nIGFuIEV4Y2VwdGlvbg0KKyAgICAgICAgYkV4Y2VwdGlvbk9jY3VycmVkID0gZmFsc2U7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGNsc2lkVGVzdC53cml0ZSggbmV3IGJ5dGVbIDE2XSwgMCk7DQorICAgICAgICAgICAgY2xzaWRUZXN0LndyaXRlKCBuZXcgYnl0ZVsgMTddLCAxKTsNCisgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgYkV4Y2VwdGlvbk9jY3VycmVkID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSggYkV4Y2VwdGlvbk9jY3VycmVkKTsNCisgICAgfQ0KKyAgICAvKioNCisgICAgICogPHA+VGVzdHMgdGhlIHtAbGluayBQcm9wZXJ0eVNldH0gbWV0aG9kcy4gVGhlIHRlc3QgZmlsZSBoYXMgdHdvDQorICAgICAqIHByb3BlcnR5IHNldDogdGhlIGZpcnN0IG9uZSBpcyBhIHtAbGluayBTdW1tYXJ5SW5mb3JtYXRpb259LA0KKyAgICAgKiB0aGUgc2Vjb25kIG9uZSBpcyBhIHtAbGluayBEb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbn0uPC9wPg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzSUQoKQ0KKyAgICB7DQorICAgICAgICBDbGFzc0lEIGNsc2lkVGVzdCA9IG5ldyBDbGFzc0lEKA0KKyAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7IDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgNCisgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwIH0NCisgICAgICAgICAgICAsIDANCisgICAgICAgICk7DQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCANCisgICAgICAgICAgICAgIGNsc2lkVGVzdC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkNCisgICAgICAgICAgICAsICJ7MDQwMzAyMDEtMDYwNS0wODA3LTA5MEEtMEIwQzBEMEUwRjEwfSINCisgICAgICAgICk7DQorICAgIH0NCisNCisNCisNCisgICAgLyoqDQorICAgICAqIDxwPlJ1bnMgdGhlIHRlc3QgY2FzZXMgc3RhbmQtYWxvbmUuPC9wPg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykNCisgICAgew0KKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJIUFNGLnRlc3RkYXRhLnBhdGgiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9kYXRhIik7DQorICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oVGVzdENsYXNzSUQuY2xhc3MpOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9UZXN0RW1wdHlQcm9wZXJ0aWVzLmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvYmFzaWMvVGVzdEVtcHR5UHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTlmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvYmFzaWMvVGVzdEVtcHR5UHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACitwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhwc2YuYmFzaWM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhwc2YuSFBTRkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLk1hcmtVbnN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLk5vUHJvcGVydHlTZXRTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi5Qcm9wZXJ0eVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLlByb3BlcnR5U2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLlN1bW1hcnlJbmZvcm1hdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLlVuZXhwZWN0ZWRQcm9wZXJ0eVNldFR5cGVFeGNlcHRpb247CisKKy8qKgorICogPHA+VGVzdCBjYXNlIGZvciBPTEUyIGZpbGVzIHdpdGggZW1wdHkgcHJvcGVydGllcy4gQW4gZW1wdHkgcHJvcGVydHkncyB0eXBlCisgKiBpcyB7QGxpbmsgVmFyaWFudC5WVF9FTVBUWX0uPC9wPgorICoKKyAqIEBhdXRob3IgUmFpbmVyIEtsdXRlIDxhCisgKiBocmVmPSJtYWlsdG86a2x1dGVAcmFpbmVyLWtsdXRlLmRlIj4mbHQ7a2x1dGVAcmFpbmVyLWtsdXRlLmRlJmd0OzwvYT4KKyAqIEBzaW5jZSAyMDAzLTA3LTI1CisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RW1wdHlQcm9wZXJ0aWVzIGV4dGVuZHMgVGVzdENhc2UKK3sKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgdGVzdCBmaWxlJ3Mgc3VtbWFyeSBpbmZvcm1hdGlvbiBzdHJlYW0gY29udGFpbnMgc29tZSBlbXB0eQorICAgICAqIHByb3BlcnRpZXMuPC9wPgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9JX0ZTID0gIlRlc3RDb3JlbC5zaHciOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBPSV9GSUxFUyA9IG5ldyBTdHJpbmdbXQorICAgICAgICB7CisgICAgICAgICAgICAiUGVyZmVjdE9mZmljZV9NQUlOIiwKKyAgICAgICAgICAgICJcMDA1U3VtbWFyeUluZm9ybWF0aW9uIiwKKyAgICAgICAgICAgICJNYWluIgorICAgICAgICB9OworCisgICAgUE9JRmlsZVtdIHBvaUZpbGVzOworCisKKworICAgIC8qKgorICAgICAqIDxwPkNvbnN0cnVjdG9yPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdEVtcHR5UHJvcGVydGllcyhmaW5hbCBTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiA8cD5SZWFkIGEgdGhlIHRlc3QgZmlsZSBmcm9tIHRoZSAiZGF0YSIgZGlyZWN0b3J5LjwvcD4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHRlc3QgZGF0YQorICAgICAqIGRvZXMgbm90IGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZpbmFsIEZpbGUgZGF0YURpciA9CisgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoIkhQU0YudGVzdGRhdGEucGF0aCIpKTsKKyAgICAgICAgZmluYWwgRmlsZSBkYXRhID0gbmV3IEZpbGUoZGF0YURpciwgUE9JX0ZTKTsKKworICAgICAgICBwb2lGaWxlcyA9IFV0aWwucmVhZFBPSUZpbGVzKGRhdGEpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiA8cD5DaGVja3MgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyBpbiB0aGUgUE9JIGZpbGVzeXN0ZW0uIFRoZXkKKyAgICAgKiBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gYSBjZXJ0YWluIG9yZGVyLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRGaWxlcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWQgPSBQT0lfRklMRVM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBvaUZpbGVzW2ldLmdldE5hbWUoKSwgZXhwZWN0ZWRbaV0pOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiA8cD5UZXN0cyB3aGV0aGVyIHByb3BlcnR5IHNldHMgY2FuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgUE9JCisgICAgICogZmlsZXMgaW4gdGhlIFBPSSBmaWxlIHN5c3RlbS4gVGhpcyB0ZXN0IGNhc2UgZXhwZWN0cyB0aGUgZmlyc3QKKyAgICAgKiBmaWxlIHRvIGJlIGEge0BsaW5rIFN1bW1hcnlJbmZvcm1hdGlvbn0sIHRoZSBzZWNvbmQgZmlsZSB0byBiZQorICAgICAqIGEge0BsaW5rIERvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9ufSBhbmQgdGhlIHJlc3QgdG8gYmUgbm8KKyAgICAgKiBwcm9wZXJ0eSBzZXRzLiBJbiB0aGUgbGF0dGVyIGNhc2VzIGEge0BsaW5rCisgICAgICogTm9Qcm9wZXJ0eVNldFN0cmVhbUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gd2hlbiB0cnlpbmcgdG8KKyAgICAgKiBjcmVhdGUgYSB7QGxpbmsgUHJvcGVydHlTZXR9LjwvcD4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3BlcnR5U2V0cygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsgCisgICAgICAgIENsYXNzW10gZXhwZWN0ZWQgPSBuZXcgQ2xhc3NbXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vUHJvcGVydHlTZXRTdHJlYW1FeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgU3VtbWFyeUluZm9ybWF0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgIE5vUHJvcGVydHlTZXRTdHJlYW1FeGNlcHRpb24uY2xhc3MKKyAgICAgICAgICAgIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBvaUZpbGVzW2ldLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgT2JqZWN0IG87CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvID0gUHJvcGVydHlTZXRGYWN0b3J5LmNyZWF0ZShpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoTm9Qcm9wZXJ0eVNldFN0cmVhbUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvID0gZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVW5leHBlY3RlZFByb3BlcnR5U2V0VHlwZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvID0gZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoTWFya1Vuc3VwcG9ydGVkRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG8gPSBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG8uZ2V0Q2xhc3MoKSwgZXhwZWN0ZWRbaV0pOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIDxwPlRlc3RzIHRoZSB7QGxpbmsgUHJvcGVydHlTZXR9IG1ldGhvZHMuIFRoZSB0ZXN0IGZpbGUgaGFzIHR3bworICAgICAqIHByb3BlcnR5IHNldHM6IHRoZSBmaXJzdCBvbmUgaXMgYSB7QGxpbmsgU3VtbWFyeUluZm9ybWF0aW9ufSwKKyAgICAgKiB0aGUgc2Vjb25kIG9uZSBpcyBhIHtAbGluayBEb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbn0uPC9wPgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIEhQU0ZFeGNlcHRpb24gaWYgYW4gSFBTRiBvcGVyYXRpb24gZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlTZXRNZXRob2RzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBIUFNGRXhjZXB0aW9uCisgICAgeworICAgICAgICBieXRlW10gYiA9IHBvaUZpbGVzWzFdLmdldEJ5dGVzKCk7CisgICAgICAgIFByb3BlcnR5U2V0IHBzID0KKyAgICAgICAgICAgIFByb3BlcnR5U2V0RmFjdG9yeS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpKTsKKyAgICAgICAgU3VtbWFyeUluZm9ybWF0aW9uIHMgPSAoU3VtbWFyeUluZm9ybWF0aW9uKSBwczsKKyAgICAgICAgYXNzZXJ0TnVsbChzLmdldFRpdGxlKCkpOworICAgICAgICBhc3NlcnROdWxsKHMuZ2V0U3ViamVjdCgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzLmdldEF1dGhvcigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzLmdldEtleXdvcmRzKCkpOworICAgICAgICBhc3NlcnROdWxsKHMuZ2V0Q29tbWVudHMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocy5nZXRUZW1wbGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzLmdldExhc3RBdXRob3IoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocy5nZXRSZXZOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydE51bGwocy5nZXRFZGl0VGltZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChzLmdldExhc3RQcmludGVkKCkpOworICAgICAgICBhc3NlcnROdWxsKHMuZ2V0Q3JlYXRlRGF0ZVRpbWUoKSk7CisgICAgICAgIGFzc2VydE51bGwocy5nZXRMYXN0U2F2ZURhdGVUaW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocy5nZXRQYWdlQ291bnQoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLmdldFdvcmRDb3VudCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMuZ2V0Q2hhckNvdW50KCksIDApOworICAgICAgICBhc3NlcnROdWxsKHMuZ2V0VGh1bWJuYWlsKCkpOworICAgICAgICBhc3NlcnROdWxsKHMuZ2V0QXBwbGljYXRpb25OYW1lKCkpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiA8cD5SdW5zIHRoZSB0ZXN0IGNhc2VzIHN0YW5kLWFsb25lLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyAodW51c2VkKQorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gVGhyb3dhYmxlIGlmIGFueSBleGNlcHRpb24gb3IgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJIUFNGLnRlc3RkYXRhLnBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4vc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9ocHNmL2RhdGEiKTsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKFRlc3RCYXNpYy5jbGFzcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvYmFzaWMvVGVzdFVuaWNvZGUuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9UZXN0VW5pY29kZS5qYXZhCmluZGV4IGIyYzdiMmEuLmNmM2IzNTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9UZXN0VW5pY29kZS5qYXZhCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9UZXN0VW5pY29kZS5qYXZhCkBAIC01NCwxMCArNTQsMTggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5ocHNmLmJhc2ljOwogCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhwc2YuKjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLkhQU0ZFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHBzZi5Qcm9wZXJ0eVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLlByb3BlcnR5U2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5ocHNmLlNlY3Rpb247CiAKIAogCkBAIC03MiwxNyArODAsMjIgQEAKIHB1YmxpYyBjbGFzcyBUZXN0VW5pY29kZSBleHRlbmRzIFRlc3RDYXNlCiB7CiAKLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIFBPSV9GUyA9ICJUZXN0VW5pY29kZS54bHMiOwotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQT0lfRklMRVMgPSBuZXcgU3RyaW5nW10KLQl7Ci0JICAgICJcMDA1RG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24iLAotCX07CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQT0lfRlMgPSAiVGVzdFVuaWNvZGUueGxzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gUE9JX0ZJTEVTID0gbmV3IFN0cmluZ1tdCisgICAgICAgIHsKKyAgICAgICAgICAgICJcMDA1RG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24iLAorICAgICAgICB9OwogICAgIEZpbGUgZGF0YTsKICAgICBQT0lGaWxlW10gcG9pRmlsZXM7CiAKIAogCi0gICAgcHVibGljIFRlc3RVbmljb2RlKFN0cmluZyBuYW1lKQorICAgIC8qKgorICAgICAqIDxwPkNvbnN0cnVjdG9yPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSB0ZXN0IGNhc2UncyBuYW1lCisgICAgICovCisgICAgcHVibGljIFRlc3RVbmljb2RlKGZpbmFsIFN0cmluZyBuYW1lKQogICAgIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQpAQCAtOTIsMTEgKzEwNSwxMSBAQAogICAgIC8qKgogICAgICAqIDxwPlJlYWQgYSB0aGUgdGVzdCBmaWxlIGZyb20gdGhlICJkYXRhIiBkaXJlY3RvcnkuPC9wPgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgICAgewotCWZpbmFsIEZpbGUgZGF0YURpciA9Ci0JICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFBTRi50ZXN0ZGF0YS5wYXRoIikpOwotCWRhdGEgPSBuZXcgRmlsZShkYXRhRGlyLCBQT0lfRlMpOworICAgICAgICBmaW5hbCBGaWxlIGRhdGFEaXIgPQorICAgICAgICAgICAgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJIUFNGLnRlc3RkYXRhLnBhdGgiKSk7CisgICAgICAgIGRhdGEgPSBuZXcgRmlsZShkYXRhRGlyLCBQT0lfRlMpOwogICAgIH0KIAogCkBAIC0xMDgsMjMgKzEyMSwyMyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVNldE1ldGhvZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEhQU0ZFeGNlcHRpb24KICAgICB7Ci0JUE9JRmlsZSBwb2lGaWxlID0gVXRpbC5yZWFkUE9JRmlsZXMoZGF0YSwgUE9JX0ZJTEVTKVswXTsKLQlieXRlW10gYiA9IHBvaUZpbGUuZ2V0Qnl0ZXMoKTsKLQlQcm9wZXJ0eVNldCBwcyA9Ci0JICAgIFByb3BlcnR5U2V0RmFjdG9yeS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpKTsKLQlBc3NlcnQuYXNzZXJ0VHJ1ZShwcy5pc0RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uKCkpOwotCUFzc2VydC5hc3NlcnRFcXVhbHMocHMuZ2V0U2VjdGlvbkNvdW50KCksIDIpOwotCVNlY3Rpb24gcyA9IChTZWN0aW9uKSBwcy5nZXRTZWN0aW9ucygpLmdldCgxKTsKLQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHMuZ2V0UHJvcGVydHkoMSksCi0JCQkgICAgbmV3IEludGVnZXIoMTIwMCkpOwotCUFzc2VydC5hc3NlcnRFcXVhbHMocy5nZXRQcm9wZXJ0eSgyKSwKLQkJCSAgICBuZXcgTG9uZyg0MTk4ODk3MDE4bCkpOwotCUFzc2VydC5hc3NlcnRFcXVhbHMocy5nZXRQcm9wZXJ0eSgzKSwKLQkJCSAgICAiTUNvbl9JbmZvIHp1IE9mZmljZSBiZWkgU2NocmVpbmVyIik7Ci0JQXNzZXJ0LmFzc2VydEVxdWFscyhzLmdldFByb3BlcnR5KDQpLAotCQkJICAgICJwZXRyb3ZpdHNjaEBzY2hyZWluZXItb25saW5lLmRlIik7Ci0JQXNzZXJ0LmFzc2VydEVxdWFscyhzLmdldFByb3BlcnR5KDUpLAotCQkJICAgICJQZXRyb3ZpdHNjaCwgV2lsaGVsbSIpOworICAgICAgICBQT0lGaWxlIHBvaUZpbGUgPSBVdGlsLnJlYWRQT0lGaWxlcyhkYXRhLCBQT0lfRklMRVMpWzBdOworICAgICAgICBieXRlW10gYiA9IHBvaUZpbGUuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgUHJvcGVydHlTZXQgcHMgPQorICAgICAgICAgICAgUHJvcGVydHlTZXRGYWN0b3J5LmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcy5pc0RvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBzLmdldFNlY3Rpb25Db3VudCgpLCAyKTsKKyAgICAgICAgU2VjdGlvbiBzID0gKFNlY3Rpb24pIHBzLmdldFNlY3Rpb25zKCkuZ2V0KDEpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMuZ2V0UHJvcGVydHkoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoMTIwMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMuZ2V0UHJvcGVydHkoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoNDE5ODg5NzAxOEwpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzLmdldFByb3BlcnR5KDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQ29uX0luZm8genUgT2ZmaWNlIGJlaSBTY2hyZWluZXIiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzLmdldFByb3BlcnR5KDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXRyb3ZpdHNjaEBzY2hyZWluZXItb25saW5lLmRlIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocy5nZXRQcm9wZXJ0eSg1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGV0cm92aXRzY2gsIFdpbGhlbG0iKTsKICAgICB9CiAKIApAQCAtMTMyLDEwICsxNDUsMTAgQEAKICAgICAvKioKICAgICAgKiA8cD5SdW5zIHRoZSB0ZXN0IGNhc2VzIHN0YW5kLWFsb25lLjwvcD4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpCiAgICAgewotCVN5c3RlbS5zZXRQcm9wZXJ0eSgiSFBTRi50ZXN0ZGF0YS5wYXRoIiwKLQkJCSAgICIuL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9kYXRhIik7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiSFBTRi50ZXN0ZGF0YS5wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9kYXRhIik7CiAgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihUZXN0VW5pY29kZS5jbGFzcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvYmFzaWMvVXRpbC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9ocHNmL2Jhc2ljL1V0aWwuamF2YQppbmRleCA4N2FhZjIxLi43YWZkMzcxIDEwMDY0NAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hwc2YvYmFzaWMvVXRpbC5qYXZhCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9iYXNpYy9VdGlsLmphdmEKQEAgLTU0LDkgKzU0LDI0IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5wb2kuaHBzZi5iYXNpYzsKIAotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5wb2lmcy5ldmVudGZpbGVzeXN0ZW0uKjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnBvaWZzLmV2ZW50ZmlsZXN5c3RlbS5QT0lGU1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5wb2lmcy5ldmVudGZpbGVzeXN0ZW0uUE9JRlNSZWFkZXJFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5wb2lmcy5ldmVudGZpbGVzeXN0ZW0uUE9JRlNSZWFkZXJMaXN0ZW5lcjsKIAogCiAKQEAgLTczLDYgKzg4LDkgQEAKICAgICAvKioKICAgICAgKiA8cD5SZWFkcyBieXRlcyBmcm9tIGFuIGlucHV0IHN0cmVhbSBhbmQgd3JpdGVzIHRoZW0gdG8gYW4KICAgICAgKiBvdXRwdXQgc3RyZWFtIHVudGlsIGVuZCBvZiBmaWxlIGlzIGVuY291bnRlcmVkLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCkBAIC04OCw4ICsxMDYsOCBAQAogICAgICAgICAgICAgICAgIHJlYWQgPSBpbi5yZWFkKGIsIDAsIEJVRl9TSVpFKTsKICAgICAgICAgICAgICAgICBpZiAocmVhZCA+IDApCiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShiLCAwLCByZWFkKTsKLQkJZWxzZQotCQkgICAgZW9mID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVvZiA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRU9GRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgewpAQCAtMTA2LDE2ICsxMjQsMTYgQEAKICAgICAgKiBpbnRvIG1lbW9yeSBhbmQgdGh1cyBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCBsYXJnZSBQT0kKICAgICAgKiBmaWxlc3N5c3RlbXMuPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlIFRoZSBuYW1lIG9mIHRoZSBQT0kgZmlsZXN5c3RlbSBhcyBzZWVuIGJ5IHRoZQorICAgICAqIEBwYXJhbSBwb2lGcyBUaGUgbmFtZSBvZiB0aGUgUE9JIGZpbGVzeXN0ZW0gYXMgc2VlbiBieSB0aGUKICAgICAgKiBvcGVyYXRpbmcgc3lzdGVtLiAoVGhpcyBpcyB0aGUgImZpbGVuYW1lIi4pCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBQT0kgZmlsZXMuIFRoZSBlbGVtZW50cyBhcmUgb3JkZXJlZCBpbiB0aGUgc2FtZSB3YXkKICAgICAgKiBhcyB0aGUgZmlsZXMgaW4gdGhlIFBPSSBmaWxlc3lzdGVtLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgUE9JRmlsZVtdIHJlYWRQT0lGaWxlcyhmaW5hbCBGaWxlIHBvaUZzKQotCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgICAgewotCXJldHVybiByZWFkUE9JRmlsZXMocG9pRnMsIG51bGwpOworICAgICAgICByZXR1cm4gcmVhZFBPSUZpbGVzKHBvaUZzLCBudWxsKTsKICAgICB9CiAKIApAQCAtMTI2LDcgKzE0NCw3IEBACiAgICAgICogZmlsZXMgaW50byBtZW1vcnkgYW5kIHRodXMgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggbGFyZ2UgUE9JCiAgICAgICogZmlsZXNzeXN0ZW1zLjwvcD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZSBUaGUgbmFtZSBvZiB0aGUgUE9JIGZpbGVzeXN0ZW0gYXMgc2VlbiBieSB0aGUKKyAgICAgKiBAcGFyYW0gcG9pRnMgVGhlIG5hbWUgb2YgdGhlIFBPSSBmaWxlc3lzdGVtIGFzIHNlZW4gYnkgdGhlCiAgICAgICogb3BlcmF0aW5nIHN5c3RlbS4gKFRoaXMgaXMgdGhlICJmaWxlbmFtZSIuKQogICAgICAqCiAgICAgICogQHBhcmFtIHBvaUZpbGVzIFRoZSBuYW1lcyBvZiB0aGUgUE9JIGZpbGVzIHRvIGJlIHJlYWQuCkBAIC0xMzUsNTAgKzE1Myw0OSBAQAogICAgICAqIGFzIHRoZSBmaWxlcyBpbiB0aGUgUE9JIGZpbGVzeXN0ZW0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQT0lGaWxlW10gcmVhZFBPSUZpbGVzKGZpbmFsIEZpbGUgcG9pRnMsCi0JCQkJCSBmaW5hbCBTdHJpbmdbXSBwb2lGaWxlcykKLQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBwb2lGaWxlcykKKyAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KICAgICB7Ci0JZmluYWwgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlQT0lGU1JlYWRlciByID0gbmV3IFBPSUZTUmVhZGVyKCk7Ci0JUE9JRlNSZWFkZXJMaXN0ZW5lciBwZmwgPSBuZXcgUE9JRlNSZWFkZXJMaXN0ZW5lcigpCi0JICAgIHsKLQkJcHVibGljIHZvaWQgcHJvY2Vzc1BPSUZTUmVhZGVyRXZlbnQoUE9JRlNSZWFkZXJFdmVudCBldmVudCkKLQkJewotCQkgICAgdHJ5Ci0JCSAgICB7Ci0JCQlQT0lGaWxlIGYgPSBuZXcgUE9JRmlsZSgpOwotCQkJZi5zZXROYW1lKGV2ZW50LmdldE5hbWUoKSk7Ci0JCQlmLnNldFBhdGgoZXZlbnQuZ2V0UGF0aCgpKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZXZlbnQuZ2V0U3RyZWFtKCk7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0KLQkJCSAgICBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlVdGlsLmNvcHkoaW4sIG91dCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJCWYuc2V0Qnl0ZXMob3V0LnRvQnl0ZUFycmF5KCkpOwotCQkJZmlsZXMuYWRkKGYpOwotCQkgICAgfQotCQkgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotCQkgICAgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOwotCQkgICAgfQotCQl9Ci0JICAgIH07Ci0JaWYgKHBvaUZpbGVzID09IG51bGwpCi0JICAgIC8qIFJlZ2lzdGVyIHRoZSBsaXN0ZW5lciBmb3IgYWxsIFBPSSBmaWxlcy4gKi8KLQkgICAgci5yZWdpc3Rlckxpc3RlbmVyKHBmbCk7Ci0JZWxzZQotCSAgICAvKiBSZWdpc3RlciB0aGUgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgUE9JIGZpbGVzCi0JICAgICAqIG9ubHkuICovCi0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9pRmlsZXMubGVuZ3RoOyBpKyspCi0JCXIucmVnaXN0ZXJMaXN0ZW5lcihwZmwsIHBvaUZpbGVzW2ldKTsKKyAgICAgICAgZmluYWwgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgUE9JRlNSZWFkZXIgciA9IG5ldyBQT0lGU1JlYWRlcigpOworICAgICAgICBQT0lGU1JlYWRlckxpc3RlbmVyIHBmbCA9IG5ldyBQT0lGU1JlYWRlckxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc1BPSUZTUmVhZGVyRXZlbnQoZmluYWwgUE9JRlNSZWFkZXJFdmVudCBldmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBPSUZpbGUgZiA9IG5ldyBQT0lGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGYuc2V0TmFtZShldmVudC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBmLnNldFBhdGgoZXZlbnQuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBldmVudC5nZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgVXRpbC5jb3B5KGluLCBvdXQpOworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZi5zZXRCeXRlcyhvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzLmFkZChmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBpZiAocG9pRmlsZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIHRoZSBsaXN0ZW5lciBmb3IgYWxsIFBPSSBmaWxlcy4gKi8KKyAgICAgICAgICAgIHIucmVnaXN0ZXJMaXN0ZW5lcihwZmwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBSZWdpc3RlciB0aGUgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgUE9JIGZpbGVzCisgICAgICAgICAgICAgKiBvbmx5LiAqLworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2lGaWxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByLnJlZ2lzdGVyTGlzdGVuZXIocGZsLCBwb2lGaWxlc1tpXSk7CiAKLQkvKiBSZWFkIHRoZSBQT0kgZmlsZXN5c3RlbS4gKi8KLQlyLnJlYWQobmV3IEZpbGVJbnB1dFN0cmVhbShwb2lGcykpOwotCVBPSUZpbGVbXSByZXN1bHQgPSBuZXcgUE9JRmlsZVtmaWxlcy5zaXplKCldOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotCSAgICByZXN1bHRbaV0gPSAoUE9JRmlsZSkgZmlsZXMuZ2V0KGkpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgIC8qIFJlYWQgdGhlIFBPSSBmaWxlc3lzdGVtLiAqLworICAgICAgICByLnJlYWQobmV3IEZpbGVJbnB1dFN0cmVhbShwb2lGcykpOworICAgICAgICBQT0lGaWxlW10gcmVzdWx0ID0gbmV3IFBPSUZpbGVbZmlsZXMuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHRbaV0gPSAoUE9JRmlsZSkgZmlsZXMuZ2V0KGkpOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogCkBAIC0xODgsMTkgKzIwNSwxOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN5c3RlbVByb3BlcnRpZXMoKQogICAgIHsKLQlQcm9wZXJ0aWVzIHAgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOwotCUxpc3QgbmFtZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCWZvciAoSXRlcmF0b3IgaSA9IHAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCSAgICBuYW1lcy5hZGQoaS5uZXh0KCkpOwotCUNvbGxlY3Rpb25zLnNvcnQobmFtZXMpOwotCWZvciAoSXRlcmF0b3IgaSA9IG5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKKyAgICAgICAgZmluYWwgUHJvcGVydGllcyBwID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgZmluYWwgTGlzdCBuYW1lcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQorICAgICAgICAgICAgbmFtZXMuYWRkKGkubmV4dCgpKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChuYW1lcyk7CisgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3IgaSA9IG5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKICAgICAgICAgewotCSAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCSAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwLmdldChuYW1lKTsKLQkgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOiAiICsgdmFsdWUpOwotCX0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIkN1cnJlbnQgZGlyZWN0b3J5OiAiICsKLQkJCSAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcC5nZXQobmFtZSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICI6ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IGRpcmVjdG9yeTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9ocHNmL2RhdGEvVGVzdENvcmVsLnNodyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9kYXRhL1Rlc3RDb3JlbC5zaHcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBhZjE5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHBzZi9kYXRhL1Rlc3RDb3JlbC5zaHcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTI1NjEtMS54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xMjU2MS0xLnhscwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGI3Mjc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTI1NjEtMS54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTI1NjEtMi54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xMjU2MS0yLnhscwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYjM2MGMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTI1NjEtMi54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTI4NDMtMS54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xMjg0My0xLnhscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY1ZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTI4NDMtMS54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTI4NDMtMi54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xMjg0My0yLnhscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWZmNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTI4NDMtMi54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTMyMjQueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTMyMjQueGxzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgxZjY5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xMzIyNC54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTM3OTYueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTM3OTYueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYWU1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xMzc5Ni54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTQzMzAtMS54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xNDMzMC0xLnhscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQyZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTQzMzAtMS54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTQzMzAtMi54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xNDMzMC0yLnhscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTU2YTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTQzMzAtMi54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTQ0NjAueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTQ0NjAueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NGQ2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xNDQ2MC54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTUyMjgueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTUyMjgueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjZlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xNTIyOC54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTUzNzUueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTUzNzUueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWIxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xNTM3NS54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTU1NTYueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTU1NTYueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjQ4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xNTU1Ni54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTk1OTktMS54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xOTU5OS0xLnhscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2UyN2QxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTk1OTktMS54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTk1OTktMi54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8xOTU5OS0yLnhscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Y0NTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMTk1OTktMi54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMjI3NDIueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMjI3NDIueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMzY3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8yMjc0Mi54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMjQyMTUueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvMjQyMTUueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmJlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS8yNDIxNS54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvRW1iZWRkZWRDaGFydEhlYWRlclRlc3QueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvRW1iZWRkZWRDaGFydEhlYWRlclRlc3QueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGNiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS9FbWJlZGRlZENoYXJ0SGVhZGVyVGVzdC54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvU3F1YXJlTWFjcm8ueGxzIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvU3F1YXJlTWFjcm8ueGxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmVlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS9TcXVhcmVNYWNyby54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvYmxhbmt3b3JrYm9vay54bHMgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvZGF0YS9ibGFua3dvcmtib29rLnhscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Y3MzRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL2RhdGEvYmxhbmt3b3JrYm9vay54bHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL21vZGVsL1NoZWV0VGVzdC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL21vZGVsL1NoZWV0VGVzdC5qYXZhCmluZGV4IDlhNzhmZDYuLjBiMjcyM2MgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi9tb2RlbC9TaGVldFRlc3QuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvU2hlZXRUZXN0LmphdmEKQEAgLTcsNiArNyw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuQ29sdW1uSW5mb1JlY29yZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5NZXJnZUNlbGxzUmVjb3JkOwogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLlJvd1JlY29yZDsKIGltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5TdHJpbmdSZWNvcmQ7CiAKQEAgLTcxLDYgKzcyLDMxIEBACiAJCWFzc2VydFRydWUoIkV4cGVjdGVkICIgKyByZWNvcmRzUmVtb3ZlZCArICIgcmVjb3JkIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc3RhcnRpbmcgIiArIHJlY29yZHMgKyAiLiAgQ3VycmVudGx5IHRoZXJlIGFyZSAiICsgc2hlZXQuZ2V0UmVjb3JkcygpLnNpemUoKSArICIgcmVjb3JkcyIsIHJlY29yZHMgLSBzaGVldC5nZXRSZWNvcmRzKCkuc2l6ZSgpID09IHJlY29yZHNSZW1vdmVkKTsKIAl9CiAKKwkvKioKKwkgKiBCdWc6IDIyOTIyIChSZXBvcnRlZCBieSBYdWVtaW4gR3VhbikKKwkgKiA8cD4KKwkgKiBSZW1vdmUgbWVyZ2VkcmVnaW9uIGZhaWxzIHdoZW4gYSBzaGVldCBsb3NlcyByZWNvcmRzIGFmdGVyIGFuIGluaXRpYWwgQ3JlYXRlU2hlZXQKKwkgKiBmaWxscyB1cCB0aGUgcmVjb3Jkcy4KKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RNb3ZpbmdNZXJnZWRSZWdpb24oKSB7CisJCUxpc3QgcmVjb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCisJCU1lcmdlQ2VsbHNSZWNvcmQgbWVyZ2VkID0gbmV3IE1lcmdlQ2VsbHNSZWNvcmQoKTsKKwkJbWVyZ2VkLmFkZEFyZWEoMCwgKHNob3J0KTAsIDEsIChzaG9ydCkyKTsKKwkJcmVjb3Jkcy5hZGQobmV3IFJvd1JlY29yZCgpKTsKKwkJcmVjb3Jkcy5hZGQobmV3IFJvd1JlY29yZCgpKTsKKwkJcmVjb3Jkcy5hZGQobmV3IFJvd1JlY29yZCgpKTsKKwkJcmVjb3Jkcy5hZGQobWVyZ2VkKTsKKwkJCisJCVNoZWV0IHNoZWV0ID0gU2hlZXQuY3JlYXRlU2hlZXQocmVjb3JkcywgMCk7CisJCXNoZWV0LnJlY29yZHMucmVtb3ZlKDApOworCQkKKwkJLy9zdHViIG9iamVjdCB0byB0aHJvdyBvZmYgbGlzdCBJTkRFWCBvcGVyYXRpb25zCisJCXNoZWV0LnJlbW92ZU1lcmdlZFJlZ2lvbigwKTsKKwkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgYmUgbm8gbW9yZSBtZXJnZWQgcmVnaW9ucyIsIDAsIHNoZWV0LmdldE51bU1lcmdlZFJlZ2lvbnMoKSk7CisJfQorCiAJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZFJlZ2lvbkF0KCkKIAl7CiAJCS8vVE9ETwpAQCAtMTQ3LDEzICsxNzMsNiBAQAogCQkKIAl9CiAKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQKLQkJLnByaW50bG4oIlRlc3RpbmcgOiAiK1NoZWV0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oU2hlZXRUZXN0LmNsYXNzKTsKLSAgfQotCiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL21vZGVsL1Rlc3RGb3JtdWxhUGFyc2VyLmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvVGVzdEZvcm11bGFQYXJzZXIuamF2YQppbmRleCBjNDcyMmE5Li5iNDVmNDhmIDEwMDY0NAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvVGVzdEZvcm11bGFQYXJzZXIuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvbW9kZWwvVGVzdEZvcm11bGFQYXJzZXIuamF2YQpAQCAtNTYsNyArNTYsNiBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGEuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnV0aWwuU2hlZXRSZWZlcmVuY2VzOwogCiAvKioKICAqIFRlc3QgdGhlIGxvdyBsZXZlbCBmb3JtdWxhIHBhcnNlciBmdW5jdGlvbmFsaXR5LiBIaWdoIGxldmVsIHRlc3RzIGFyZSB0byAKQEAgLTE0NSw3ICsxNDQsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZmxhZy5nZXRWYWx1ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZIiwgeS5nZXRWYWx1ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOIiwgbi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJRiIsIGZ1bmlmLnRvRm9ybXVsYVN0cmluZyhuZXcgU2hlZXRSZWZlcmVuY2VzKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJRiIsIGZ1bmlmLnRvRm9ybXVsYVN0cmluZygoV29ya2Jvb2spIG51bGwpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiR290byBwdGcgZXhpc3RzIiwgZ290bzEuaXNHb3RvKCkpOwogICAgIH0KIApAQCAtMjg1LDYgKzI4NCwzNiBAQAogCQkKIAl9CiAJICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWNyb0Z1bmN0aW9uKCkgeworICAgICAgICBXb3JrYm9vayB3ID0gbmV3IFdvcmtib29rKCk7CisgICAgICAgIEZvcm11bGFQYXJzZXIgZnAgPSBuZXcgRm9ybXVsYVBhcnNlcigiRk9PKCkiLCB3KTsKKyAgICAgICAgZnAucGFyc2UoKTsKKyAgICAgICAgUHRnW10gcHRnID0gZnAuZ2V0UlBOUHRnKCk7CisKKyAgICAgICAgQWJzdHJhY3RGdW5jdGlvblB0ZyB0ZnVuYyA9IChBYnN0cmFjdEZ1bmN0aW9uUHRnKSBwdGdbMF07CisgICAgICAgIGFzc2VydEVxdWFscygiZXh0ZXJuYWxmbGFnIiwgdGZ1bmMuZ2V0TmFtZSgpKTsKKworICAgICAgICBOYW1lUHRnIHRuYW1lID0gKE5hbWVQdGcpIHB0Z1sxXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGT08iLCB0bmFtZS50b0Zvcm11bGFTdHJpbmcodykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZFNsYXNoKCkgeworICAgICAgICBGb3JtdWxhUGFyc2VyIGZwID0gbmV3IEZvcm11bGFQYXJzZXIoIkhZUEVSTElOSyhcImh0dHA6Ly93d3cuamFrYXJ0YS5vcmdcIixcIkpha2FydGFcIik7IixudWxsKTsKKyAgICAgICAgZnAucGFyc2UoKTsKKyAgICAgICAgUHRnW10gcHRnID0gZnAuZ2V0UlBOUHRnKCk7CisgICAgICAgIGFzc2VydFRydWUoImZpcnN0IHB0ZyBpcyBzdHJpbmciLHB0Z1swXSBpbnN0YW5jZW9mIFN0cmluZ1B0Zyk7CisgICAgICAgIGFzc2VydFRydWUoInNlY29uZCBwdGcgaXMgc3RyaW5nIixwdGdbMV0gaW5zdGFuY2VvZiBTdHJpbmdQdGcpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlKCl7CisgICAgICAgICBGb3JtdWxhUGFyc2VyIGZwID0gbmV3IEZvcm11bGFQYXJzZXIoIkNPTkNBVEVOQVRFKFwiZmlyc3RcIixcInNlY29uZFwiKSIsbnVsbCk7CisgICAgICAgICBmcC5wYXJzZSgpOworICAgICAgICAgUHRnW10gcHRnID0gZnAuZ2V0UlBOUHRnKCk7CisgICAgICAgIGFzc2VydFRydWUoImZpcnN0IHB0ZyBpcyBzdHJpbmciLHB0Z1swXSBpbnN0YW5jZW9mIFN0cmluZ1B0Zyk7CisgICAgICAgIGFzc2VydFRydWUoInNlY29uZCBwdGcgaXMgc3RyaW5nIixwdGdbMV0gaW5zdGFuY2VvZiBTdHJpbmdQdGcpOworICAgIH0KKyAgICAKICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5nIG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLmZvcm11bGEuRm9ybXVsYVBhcnNlciIpOwogICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oVGVzdEZvcm11bGFQYXJzZXIuY2xhc3MpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9UZXN0Qm91bmRTaGVldFJlY29yZC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9UZXN0Qm91bmRTaGVldFJlY29yZC5qYXZhCmluZGV4IDIwNThjMmYuLjRjYTYwNzUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvVGVzdEJvdW5kU2hlZXRSZWNvcmQuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Rlc3RCb3VuZFNoZWV0UmVjb3JkLmphdmEKQEAgLTkyLDUgKzkyLDI1IEBACiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIgMiAgKyAgMiAgKyAgNCAgKyAgIDIgICArICAgIDEgICAgICsgICAgMSAgICArIGxlbihzdHIpICogMiIsIDI0LCByZWNvcmQuZ2V0UmVjb3JkU2l6ZSgpKTsKICAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWUoKSB7CisgICAgICAgIEJvdW5kU2hlZXRSZWNvcmQgcmVjb3JkID0gbmV3IEJvdW5kU2hlZXRSZWNvcmQoKTsKKyAgICAgICAgcmVjb3JkLnNldFNoZWV0bmFtZSgiMTIzNDU2Nzg5MDIyMzQ1Njc4OTAzMjM0NTY3ODkwNCIpOworICAgICAgICBhc3NlcnRUcnVlKCJTdWNjZXNzIiwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWNvcmQuc2V0U2hlZXRuYW1lKCIxMjM0NTY3ODkwMjIzNDU2Nzg5MDMyMzQ1Njc4OTA0MiIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgYnV0IGRpZG50IiwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3VjY2VmdWxseSB0aHJldyBleGNlcHRpb24iLHRydWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVjb3JkLnNldFNoZWV0bmFtZSgicy8vKnMiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIGJ1dCBkaWRudCIsIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInN1Y2NlZnVsbHkgdGhyZXcgZXhjZXB0aW9uIix0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Rlc3RTU1REZXNlcmlhbGl6ZXIuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvVGVzdFNTVERlc2VyaWFsaXplci5qYXZhCmluZGV4IDYyNzI2NTMuLmE1MDZlMzcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvVGVzdFNTVERlc2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi9yZWNvcmQvVGVzdFNTVERlc2VyaWFsaXplci5qYXZhCkBAIC04OCw3ICs4OCw3IEBACiAgICAgICAgIGJ5dGVbXSBieXRlcyA9IEhleFJlYWQucmVhZERhdGEoIF90ZXN0X2ZpbGVfcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgInJpY2h0ZXh0ZGF0YS50eHQiLCAiaGVhZGVyIiApOwogICAgICAgICBCaW5hcnlUcmVlIHN0cmluZ3MgPSBuZXcgQmluYXJ5VHJlZSgpOwogICAgICAgICBTU1REZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyID0gbmV3IFNTVERlc2VyaWFsaXplciggc3RyaW5ncyApOwotICAgICAgICBkZXNlcmlhbGl6ZXIubWFudWZhY3R1cmVTdHJpbmdzKCBieXRlcywgMCwgKHNob3J0KWJ5dGVzLmxlbmd0aCApOworICAgICAgICBkZXNlcmlhbGl6ZXIubWFudWZhY3R1cmVTdHJpbmdzKCBieXRlcywgMCk7CiAgICAgICAgIGJ5dGVbXSBjb250aW51ZUJ5dGVzID0gSGV4UmVhZC5yZWFkRGF0YSggX3Rlc3RfZmlsZV9wYXRoICsgRmlsZS5zZXBhcmF0b3IgKyAicmljaHRleHRkYXRhLnR4dCIsICJjb250aW51ZTEiICk7CiAgICAgICAgIGRlc2VyaWFsaXplci5wcm9jZXNzQ29udGludWVSZWNvcmQoIGNvbnRpbnVlQnl0ZXMgKTsKIApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgIGJ5dGVbXSBieXRlcyA9IEhleFJlYWQucmVhZERhdGEoIF90ZXN0X2ZpbGVfcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgImV2ZW5jb250aW51YXRpb24udHh0IiwgImhlYWRlciIgKTsKICAgICAgICAgQmluYXJ5VHJlZSBzdHJpbmdzID0gbmV3IEJpbmFyeVRyZWUoKTsKICAgICAgICAgU1NURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBTU1REZXNlcmlhbGl6ZXIoIHN0cmluZ3MgKTsKLSAgICAgICAgZGVzZXJpYWxpemVyLm1hbnVmYWN0dXJlU3RyaW5ncyggYnl0ZXMsIDAsIChzaG9ydClieXRlcy5sZW5ndGggKTsKKyAgICAgICAgZGVzZXJpYWxpemVyLm1hbnVmYWN0dXJlU3RyaW5ncyggYnl0ZXMsIDApOwogICAgICAgICBieXRlW10gY29udGludWVCeXRlcyA9IEhleFJlYWQucmVhZERhdGEoIF90ZXN0X2ZpbGVfcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgImV2ZW5jb250aW51YXRpb24udHh0IiwgImNvbnRpbnVlMSIgKTsKICAgICAgICAgZGVzZXJpYWxpemVyLnByb2Nlc3NDb250aW51ZVJlY29yZCggY29udGludWVCeXRlcyApOwogCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gSGV4UmVhZC5yZWFkRGF0YSggX3Rlc3RfZmlsZV9wYXRoICsgRmlsZS5zZXBhcmF0b3IgKyAic3RyaW5nYWNyb3NzMmNvbnRpbnVhdGlvbnMudHh0IiwgImhlYWRlciIgKTsKICAgICAgICAgQmluYXJ5VHJlZSBzdHJpbmdzID0gbmV3IEJpbmFyeVRyZWUoKTsKICAgICAgICAgU1NURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBTU1REZXNlcmlhbGl6ZXIoIHN0cmluZ3MgKTsKLSAgICAgICAgZGVzZXJpYWxpemVyLm1hbnVmYWN0dXJlU3RyaW5ncyggYnl0ZXMsIDAsIChzaG9ydClieXRlcy5sZW5ndGggKTsKKyAgICAgICAgZGVzZXJpYWxpemVyLm1hbnVmYWN0dXJlU3RyaW5ncyggYnl0ZXMsIDApOwogICAgICAgICBieXRlcyA9IEhleFJlYWQucmVhZERhdGEoIF90ZXN0X2ZpbGVfcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgInN0cmluZ2Fjcm9zczJjb250aW51YXRpb25zLnR4dCIsICJjb250aW51ZTEiICk7CiAgICAgICAgIGRlc2VyaWFsaXplci5wcm9jZXNzQ29udGludWVSZWNvcmQoIGJ5dGVzICk7CiAgICAgICAgIGJ5dGVzID0gSGV4UmVhZC5yZWFkRGF0YSggX3Rlc3RfZmlsZV9wYXRoICsgRmlsZS5zZXBhcmF0b3IgKyAic3RyaW5nYWNyb3NzMmNvbnRpbnVhdGlvbnMudHh0IiwgImNvbnRpbnVlMiIgKTsKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICBieXRlW10gYnl0ZXMgPSBIZXhSZWFkLnJlYWREYXRhKCBfdGVzdF9maWxlX3BhdGggKyBGaWxlLnNlcGFyYXRvciArICJleHRlbmRlZHRleHRzdHJpbmdzLnR4dCIsICJyaWNoLWhlYWRlciIgKTsKICAgICAgICAgQmluYXJ5VHJlZSBzdHJpbmdzID0gbmV3IEJpbmFyeVRyZWUoKTsKICAgICAgICAgU1NURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBTU1REZXNlcmlhbGl6ZXIoIHN0cmluZ3MgKTsKLSAgICAgICAgZGVzZXJpYWxpemVyLm1hbnVmYWN0dXJlU3RyaW5ncyggYnl0ZXMsIDAsIChzaG9ydClieXRlcy5sZW5ndGggKTsKKyAgICAgICAgZGVzZXJpYWxpemVyLm1hbnVmYWN0dXJlU3RyaW5ncyggYnl0ZXMsIDApOwogICAgICAgICBieXRlW10gY29udGludWVCeXRlcyA9IEhleFJlYWQucmVhZERhdGEoIF90ZXN0X2ZpbGVfcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgImV4dGVuZGVkdGV4dHN0cmluZ3MudHh0IiwgInJpY2gtY29udGludWUxIiApOwogICAgICAgICBkZXNlcmlhbGl6ZXIucHJvY2Vzc0NvbnRpbnVlUmVjb3JkKCBjb250aW51ZUJ5dGVzICk7CiAKQEAgLTE0Niw3ICsxNDYsNyBAQAogICAgICAgICBieXRlcyA9IEhleFJlYWQucmVhZERhdGEoIF90ZXN0X2ZpbGVfcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgImV4dGVuZGVkdGV4dHN0cmluZ3MudHh0IiwgIm5vcmljaC1oZWFkZXIiICk7CiAgICAgICAgIHN0cmluZ3MgPSBuZXcgQmluYXJ5VHJlZSgpOwogICAgICAgICBkZXNlcmlhbGl6ZXIgPSBuZXcgU1NURGVzZXJpYWxpemVyKCBzdHJpbmdzICk7Ci0gICAgICAgIGRlc2VyaWFsaXplci5tYW51ZmFjdHVyZVN0cmluZ3MoIGJ5dGVzLCAwLCAoc2hvcnQpYnl0ZXMubGVuZ3RoICk7CisgICAgICAgIGRlc2VyaWFsaXplci5tYW51ZmFjdHVyZVN0cmluZ3MoIGJ5dGVzLCAwKTsKICAgICAgICAgY29udGludWVCeXRlcyA9IEhleFJlYWQucmVhZERhdGEoIF90ZXN0X2ZpbGVfcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgImV4dGVuZGVkdGV4dHN0cmluZ3MudHh0IiwgIm5vcmljaC1jb250aW51ZTEiICk7CiAgICAgICAgIGRlc2VyaWFsaXplci5wcm9jZXNzQ29udGludWVSZWNvcmQoIGNvbnRpbnVlQnl0ZXMgKTsKIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3JlY29yZC9UZXN0U1NUUmVjb3JkLmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Rlc3RTU1RSZWNvcmQuamF2YQppbmRleCAyNDEwNTk5Li43NDc4NjhjIDEwMDY0NAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Rlc3RTU1RSZWNvcmQuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvcmVjb3JkL1Rlc3RTU1RSZWNvcmQuamF2YQpAQCAtNDI5LDcgKzQyOSw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyggMTQ2NCwgcmVjb3JkLmdldE51bVN0cmluZ3MoKSApOwogICAgICAgICBhc3NlcnRFcXVhbHMoIDY4OCwgcmVjb3JkLmdldE51bVVuaXF1ZVN0cmluZ3MoKSApOwogICAgICAgICBhc3NlcnRFcXVhbHMoIDQ5MiwgcmVjb3JkLmNvdW50U3RyaW5ncygpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMSwgcmVjb3JkLmdldERlc2VyaWFsaXplcigpLmdldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoKSApOworLy9qbWggICAgICAgIGFzc2VydEVxdWFscyggMSwgcmVjb3JkLmdldERlc2VyaWFsaXplcigpLmdldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoKSApOwogICAgICAgICBhc3NlcnRFcXVhbHMoICJDb25zb2xpZGF0ZWQgQi0yNEogTGliZXJhdG9yIFRoZSBEcmFnb24gJiBIaXMgVGFpIiwKICAgICAgICAgICAgICAgICByZWNvcmQuZ2V0RGVzZXJpYWxpemVyKCkuZ2V0VW5maW5pc2hlZFN0cmluZygpICk7CiAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCA1MiwgcmVjb3JkLmdldERlc2VyaWFsaXplcigpLmdldFRvdGFsTGVuZ3RoKCkgKTsKQEAgLTQ0OCw3ICs0NDgsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIDAsIHJlY29yZC5nZXROdW1TdHJpbmdzKCkgKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCAwLCByZWNvcmQuZ2V0TnVtVW5pcXVlU3RyaW5ncygpICk7CiAgICAgICAgIGFzc2VydEVxdWFscyggMCwgcmVjb3JkLmNvdW50U3RyaW5ncygpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMCwgcmVjb3JkLmdldERlc2VyaWFsaXplcigpLmdldENvbnRpbnVhdGlvbkV4cGVjdGVkQ2hhcnMoKSApOworICAgICAgICBhc3NlcnRFcXVhbHMoIDAsIHJlY29yZC5nZXREZXNlcmlhbGl6ZXIoKS5nZXRDb250aW51YXRpb25DaGFyc1JlYWQoKSApOwogICAgICAgICBhc3NlcnRFcXVhbHMoICIiLCByZWNvcmQuZ2V0RGVzZXJpYWxpemVyKCkuZ2V0VW5maW5pc2hlZFN0cmluZygpICk7CiAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCAwLCByZWNvcmQuZ2V0RGVzZXJpYWxpemVyKCkuZ2V0VG90YWxMZW5ndGgoKSApOwogLy8gICAgICAgIGFzc2VydEVxdWFscyggMCwgcmVjb3JkLmdldERlc2VyaWFsaXplcigpLmdldFN0cmluZ0RhdGFPZmZzZXQoKSApOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0QnVncy5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0QnVncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0M2Q1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RCdWdzLmphdmEKQEAgLTAsMCArMSw0MTMgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBhbmQKKyAqICAgICJBcGFjaGUgUE9JIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKKyAqICAgICJBcGFjaGUgUE9JIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUucG9pLmhzc2YudXNlcm1vZGVsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworCisvKioKKyAqIFRlc3RjYXNlcyBmb3IgYnVncyBlbnRlcmVkIGluIGJ1Z3ppbGxhCisgKiB0aGUgVGVzdCBuYW1lIGNvbnRhaW5zIHRoZSBidWd6aWxsYSBidWcgaWQKKyAqIEBhdXRob3IgQXZpayBTZW5ndXB0YQorICovCisKK3B1YmxpYyBjbGFzcyBUZXN0QnVncworZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIFRlc3RCdWdzKFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KKyAgICAKKyAgICAvKiogVGVzdCByZWFkaW5nIEFORCB3cml0aW5nIGEgY29tcGxpY2F0ZWQgd29ya2Jvb2sKKyAgICAgKlRlc3Qgb3BlbmluZyByZXN1bHRpbmcgc2hlZXQgaW4gZXhjZWwqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxNTIyOCgpCisgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVhZEZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZWFkRmlsZW5hbWUrRmlsZS5zZXBhcmF0b3IrIjE1MjI4LnhscyIpOworICAgICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKGluKTsKKyAgICAgICAgSFNTRlNoZWV0IHMgPSB3Yi5nZXRTaGVldEF0KDApOworICAgICAgICBIU1NGUm93IHIgPSBzLmNyZWF0ZVJvdygwKTsKKyAgICAgICAgSFNTRkNlbGwgYyA9IHIuY3JlYXRlQ2VsbCgoc2hvcnQpMCk7CisgICAgICAgIGMuc2V0Q2VsbFZhbHVlKDEwKTsKKyAgICAgICAgRmlsZSBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdDE1MjI4IiwiLnhscyIpOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCAgICA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICB3Yi53cml0ZShvdXQpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgU2hvdWxkIEV4aXN0IiwgZmlsZS5leGlzdHMoKSk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTM3OTYoKQorICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlYWRGaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFNTRi50ZXN0ZGF0YS5wYXRoIik7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVhZEZpbGVuYW1lK0ZpbGUuc2VwYXJhdG9yKyIxMzc5Ni54bHMiKTsKKyAgICAgICAgSFNTRldvcmtib29rIHdiID0gbmV3IEhTU0ZXb3JrYm9vayhpbik7CisgICAgICAgIEhTU0ZTaGVldCBzID0gd2IuZ2V0U2hlZXRBdCgwKTsKKyAgICAgICAgSFNTRlJvdyByID0gcy5jcmVhdGVSb3coMCk7CisgICAgICAgIEhTU0ZDZWxsIGMgPSByLmNyZWF0ZUNlbGwoKHNob3J0KTApOworICAgICAgICBjLnNldENlbGxWYWx1ZSgxMCk7CisgICAgICAgIEZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QxMzc5NiIsIi54bHMiKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgICAgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgd2Iud3JpdGUob3V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIFNob3VsZCBFeGlzdCIsIGZpbGUuZXhpc3RzKCkpOworICAgICAgICAKKyAgICB9CisgICAgLyoqVGVzdCB3cml0aW5nIGEgaHlwZXJsaW5rCisgICAgICogT3BlbiByZXN1bHRpbmcgc2hlZXQgaW4gRXhjZWwgYW5kIGNoZWNrIHRoYXQgQTEgY29udGFpbnMgYSBoeXBlcmxpbmsqLworICAgIHB1YmxpYyB2b2lkIHRlc3QyMzA5NCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0MjMwOTQiLCIueGxzIik7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ICAgID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIEhTU0ZXb3JrYm9vayAgICAgd2IgICAgID0gbmV3IEhTU0ZXb3JrYm9vaygpOworICAgICAgICBIU1NGU2hlZXQgICAgICAgIHMgICAgICA9IHdiLmNyZWF0ZVNoZWV0KCk7CisgICAgICAgIEhTU0ZSb3cgciA9IHMuY3JlYXRlUm93KDApOworICAgICAgICByLmNyZWF0ZUNlbGwoKHNob3J0KTApLnNldENlbGxGb3JtdWxhKCJIWVBFUkxJTksoIFwiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZ1wiLCBcIkpha2FydGFcIiApIik7CisgICAgICAgIGFzc2VydFRydWUoIk5vIEV4Y2VwdGlvbiBleHBlY3RlZCIsdHJ1ZSk7CisgICAgICAgIHdiLndyaXRlKG91dCk7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgICAKKyAgICAgLyogdGVzdCBoeXBlcmxpbmtzCisgICAgICAqIG9wZW4gcmVzdWx0aW5nIGZpbGUgaW4gZXhjZWwsIGFuZCBjaGVjayB0aGF0IHRoZXJlIGlzIGEgbGluayB0byBHb29nbGUKKyAgICAgICoqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxNTM1MygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKCk7CisgICAgICAgIEhTU0ZTaGVldCBzaGVldCA9IHdiLmNyZWF0ZVNoZWV0KCJNeSBzaGVldCIpOworICAgICAgICAKKyAgICAgICAgSFNTRlJvdyByb3cgPSBzaGVldC5jcmVhdGVSb3coIChzaG9ydCkgMCApOworICAgICAgICBIU1NGQ2VsbCBjZWxsID0gcm93LmNyZWF0ZUNlbGwoIChzaG9ydCkgMCApOworICAgICAgICBjZWxsLnNldENlbGxGb3JtdWxhKCJIWVBFUkxJTksoXCJodHRwOi8vZ29vZ2xlLmNvbVwiLFwiR29vZ2xlXCIpIik7CisgICAgICAgIAorICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIHdvcmtib29rCisgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QxNTM1MyIsIi54bHMiKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisgICAgICAgIHdiLndyaXRlKGZpbGVPdXQpOworICAgICAgICBmaWxlT3V0LmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIC8qKiB0ZXN0IHJlYWRpbmcgb2YgYSBmb3JtdWxhIHdpdGggYSBuYW1lIGFuZCBhIGNlbGwgcmVmIGluIG9uZQorICAgICAqKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTQ0NjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgZmlsZW5hbWU9ZmlsZW5hbWUrIi8xNDQ2MC54bHMiOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKKyAgICAgICAgSFNTRldvcmtib29rIHdiID0gbmV3IEhTU0ZXb3JrYm9vayhpbik7CisgICAgICAgIEhTU0ZTaGVldCBzaGVldCA9IHdiLmdldFNoZWV0QXQoMCk7CisgICAgICAgIGFzc2VydFRydWUoIk5vIGV4Y2VwdGlvbiB0aHJvd3MiLCB0cnVlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdDE0MzMwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lPWZpbGVkaXIrIi8xNDMzMC0xLnhscyI7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOworICAgICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKGluKTsKKyAgICAgICAgSFNTRlNoZWV0IHNoZWV0ID0gd2IuZ2V0U2hlZXRBdCgwKTsKKyAgICAgICAgCisgICAgICAgIGZpbGVuYW1lPWZpbGVkaXIrIi8xNDMzMC0yLnhscyI7CisgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7CisgICAgICAgIHdiID0gbmV3IEhTU0ZXb3JrYm9vayhpbik7CisgICAgICAgIHNoZWV0ID0gd2IuZ2V0U2hlZXRBdCgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIHRocm93cyIsIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvKiogdGVzdCByZXdyaXRpbmcgYSBmaWxlIHdpdGggbGFyZ2UgbnVtYmVyIG9mIHVuaXF1ZSBzdHJpbmdzCisgICAgICpvcGVuIHJlc3VsdGluZyBmaWxlIGluIEV4Y2VsIHRvIGNoZWNrIHJlc3VsdHMhKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTUzNzUoKSB7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgICAgIGZpbGVuYW1lPWZpbGVuYW1lKyIvMTUzNzUueGxzIjsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOworICAgICAgICAgICAgSFNTRldvcmtib29rIHdiID0gbmV3IEhTU0ZXb3JrYm9vayhpbik7CisgICAgICAgICAgICBIU1NGU2hlZXQgc2hlZXQgPSB3Yi5nZXRTaGVldEF0KDApOworICAgICAgICAgICAgCisgICAgICAgICAgICBIU1NGUm93IHJvdyA9IHNoZWV0LmdldFJvdyg1KTsKKyAgICAgICAgICAgIEhTU0ZDZWxsIGNlbGwgPSByb3cuZ2V0Q2VsbCgoc2hvcnQpMyk7CisgICAgICAgICAgICBpZiAoY2VsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNlbGwgPSByb3cuY3JlYXRlQ2VsbCgoc2hvcnQpMyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdyaXRlIHRlc3QKKyAgICAgICAgICAgIGNlbGwuc2V0Q2VsbFR5cGUoSFNTRkNlbGwuQ0VMTF9UWVBFX1NUUklORyk7CisgICAgICAgICAgICBjZWxsLnNldENlbGxWYWx1ZSgiYSB0ZXN0Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGNoYW5nZSBleGlzdGluZyBudW1lcmljIGNlbGwgdmFsdWUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgSFNTRlJvdyBvUm93ID0gc2hlZXQuZ2V0Um93KDE0KTsKKyAgICAgICAgICAgIEhTU0ZDZWxsIG9DZWxsID0gb1Jvdy5nZXRDZWxsKChzaG9ydCk0KTsKKyAgICAgICAgICAgIG9DZWxsLnNldENlbGxWYWx1ZSg3NSk7CisgICAgICAgICAgICBvQ2VsbCA9IG9Sb3cuZ2V0Q2VsbCgoc2hvcnQpNSk7CisgICAgICAgICAgICBvQ2VsbC5zZXRDZWxsVmFsdWUoIjAuMyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXcml0ZSB0aGUgb3V0cHV0IHRvIGEgZmlsZQorICAgICAgICAgICAgRmlsZSBmID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdDE1Mzc1IiwiLnhscyIpOworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisgICAgICAgICAgICB3Yi53cml0ZShmaWxlT3V0KTsKKyAgICAgICAgICAgIGZpbGVPdXQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqIHRlc3Qgd3JpdGluZyBhIGZpbGUgd2l0aCBsYXJnZSBudW1iZXIgb2YgdW5pcXVlIHN0cmluZ3MKKyAgICAgKm9wZW4gcmVzdWx0aW5nIGZpbGUgaW4gRXhjZWwgdG8gY2hlY2sgcmVzdWx0cyEqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3QxNTM3NV8yKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKCk7CisgICAgICAgIEhTU0ZTaGVldCBzaGVldCA9IHdiLmNyZWF0ZVNoZWV0KCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgdG1wMSA9IG51bGw7CisgICAgICAgIFN0cmluZyB0bXAyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHRtcDMgPSBudWxsOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MDAwOyBpKyspIHsKKyAgICAgICAgICAgIHRtcDEgPSAiVGVzdDEiICsgaTsKKyAgICAgICAgICAgIHRtcDIgPSAiVGVzdDIiICsgaTsKKyAgICAgICAgICAgIHRtcDMgPSAiVGVzdDMiICsgaTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgSFNTRlJvdyByb3cgPSBzaGVldC5jcmVhdGVSb3coKHNob3J0KWkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBIU1NGQ2VsbCBjZWxsID0gcm93LmNyZWF0ZUNlbGwoKHNob3J0KTApOworICAgICAgICAgICAgY2VsbC5zZXRDZWxsVmFsdWUodG1wMSk7CisgICAgICAgICAgICBjZWxsID0gcm93LmNyZWF0ZUNlbGwoKHNob3J0KTEpOworICAgICAgICAgICAgY2VsbC5zZXRDZWxsVmFsdWUodG1wMik7CisgICAgICAgICAgICBjZWxsID0gcm93LmNyZWF0ZUNlbGwoKHNob3J0KTIpOworICAgICAgICAgICAgY2VsbC5zZXRDZWxsVmFsdWUodG1wMyk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBmID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdDE1Mzc1LTIiLCIueGxzIik7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworICAgICAgICB3Yi53cml0ZShmaWxlT3V0KTsKKyAgICAgICAgZmlsZU91dC5jbG9zZSgpOworICAgIH0KKyAgICAvKiogYW5vdGhlciB0ZXN0IGZvciB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBzdHJpbmdzIGlzc3VlCisgICAgICp0ZXN0IG9wZW5pbmcgdGhlIHJlc3VsdGluZyBmaWxlIGluIEV4Y2VsKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjI1NjgoKSB7CisgICAgICAgIGludCByPTIwMDA7aW50IGM9MzsKKyAgICAgICAgCisgICAgICAgIEhTU0ZXb3JrYm9vayB3YiA9IG5ldyBIU1NGV29ya2Jvb2soKSA7CisgICAgICAgIEhTU0ZTaGVldCBzaGVldCA9IHdiLmNyZWF0ZVNoZWV0KCJFeGNlbFRlc3QiKSA7CisgICAgICAgIAorICAgICAgICBpbnQgY29sX2NudD0wLCByd19jbnQ9MCA7CisgICAgICAgIAorICAgICAgICBjb2xfY250ID0gYzsKKyAgICAgICAgcndfY250ID0gcjsKKyAgICAgICAgCisgICAgICAgIEhTU0ZSb3cgcncgPSBudWxsIDsKKyAgICAgICAgSFNTRkNlbGwgY2VsbCA9bnVsbDsKKyAgICAgICAgcncgPSBzaGVldC5jcmVhdGVSb3coKHNob3J0KTApIDsKKyAgICAgICAgLy9IZWFkZXIgcm93CisgICAgICAgIGZvcihzaG9ydCBqPTA7IGo8Y29sX2NudDsgaisrKXsKKyAgICAgICAgICAgIGNlbGwgPSBydy5jcmVhdGVDZWxsKChzaG9ydClqKSA7CisgICAgICAgICAgICBjZWxsLnNldENlbGxWYWx1ZSgiQ29sICIgKyAoaisxKSkgOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IoaW50IGk9MTsgaTxyd19jbnQ7IGkrKyl7CisgICAgICAgICAgICBydyA9IHNoZWV0LmNyZWF0ZVJvdygoc2hvcnQpaSkgOworICAgICAgICAgICAgZm9yKHNob3J0IGo9MDsgajxjb2xfY250OyBqKyspeworICAgICAgICAgICAgICAgIGNlbGwgPSBydy5jcmVhdGVDZWxsKChzaG9ydClqKSA7CisgICAgICAgICAgICAgICAgY2VsbC5zZXRDZWxsVmFsdWUoIlJvdzoiICsgKGkrMSkgKyAiLENvbHVtbjoiICsKKyAgICAgICAgICAgICAgICAoaisxKSkgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzaGVldC5zZXREZWZhdWx0Q29sdW1uV2lkdGgoKHNob3J0KSAxOCkgOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QyMjU2OCIsIi54bHMiKTsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZikgOworICAgICAgICAgICAgd2Iud3JpdGUob3V0KSA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dC5jbG9zZSgpIDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGlvX0V4Y3ApIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpb19FeGNwLmdldE1lc3NhZ2UoKSkgOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKkRvdWJsZSBieXRlIHN0cmluZ3MqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxNTU1NigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFNTRi50ZXN0ZGF0YS5wYXRoIik7CisgICAgICAgIGZpbGVuYW1lPWZpbGVuYW1lKyIvMTU1NTYueGxzIjsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7CisgICAgICAgIEhTU0ZXb3JrYm9vayB3YiA9IG5ldyBIU1NGV29ya2Jvb2soaW4pOworICAgICAgICBIU1NGU2hlZXQgc2hlZXQgPSB3Yi5nZXRTaGVldEF0KDApOworICAgICAgICBIU1NGUm93IHJvdyA9IHNoZWV0LmdldFJvdyg0NSk7CisgICAgICAgIHRoaXMuYXNzZXJ0VHJ1ZSgiUmVhZCByb3cgZmluZSEiICwgdHJ1ZSk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKkRvdWJsZSBieXRlIHN0cmluZ3MgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjI3NDIoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFNTRi50ZXN0ZGF0YS5wYXRoIik7CisgICAgICAgIGZpbGVuYW1lPWZpbGVuYW1lKyIvMjI3NDIueGxzIjsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7CisgICAgICAgIEhTU0ZXb3JrYm9vayB3YiA9IG5ldyBIU1NGV29ya2Jvb2soaW4pOyAgICAgICAgdGhpcy5hc3NlcnRUcnVlKCJSZWFkIHdvcmtib29rISIgLCB0cnVlKTsKKyAgICAgICAgCisgICAgfQorICAgIC8qRG91YmxlIGJ5dGUgc3RyaW5ncyAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxMjU2MV8xKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgZmlsZW5hbWU9ZmlsZW5hbWUrIi8xMjU2MS0xLnhscyI7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOworICAgICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKGluKTsKKyAgICAgICAgdGhpcy5hc3NlcnRUcnVlKCJSZWFkIHdvcmtib29rISIgLCB0cnVlKTsKKyAgICAgICAgCisgICAgfQorICAgIC8qRG91YmxlIGJ5dGUgc3RyaW5ncyAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxMjU2MV8yKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgZmlsZW5hbWU9ZmlsZW5hbWUrIi8xMjU2MS0yLnhscyI7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOworICAgICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKGluKTsKKyAgICAgICAgdGhpcy5hc3NlcnRUcnVlKCJSZWFkIHdvcmtib29rISIgLCB0cnVlKTsKKyAgICAgICAgCisgICAgfQorICAgIC8qRG91YmxlIGJ5dGUgc3RyaW5ncworICAgICBGaWxlIHN1cHBsaWVkIGJ5IGp1YmVzb24qLworICAgIHB1YmxpYyB2b2lkIHRlc3QxMjg0M18xKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIkhTU0YudGVzdGRhdGEucGF0aCIpOworICAgICAgICBmaWxlbmFtZT1maWxlbmFtZSsiLzEyODQzLTEueGxzIjsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7CisgICAgICAgIEhTU0ZXb3JrYm9vayB3YiA9IG5ldyBIU1NGV29ya2Jvb2soaW4pOworICAgICAgICB0aGlzLmFzc2VydFRydWUoIlJlYWQgd29ya2Jvb2shIiAsIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvKkRvdWJsZSBieXRlIHN0cmluZ3MKKyAgICAgRmlsZSBzdXBwbGllZCBieSBQYXVsIENodW5nKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTI4NDNfMigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgZmlsZW5hbWU9ZmlsZW5hbWUrIi8xMjg0My0yLnhscyI7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOworICAgICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKGluKTsKKyAgICAgICAgdGhpcy5hc3NlcnRUcnVlKCJSZWFkIHdvcmtib29rISIgLCB0cnVlKTsKKyAgICB9CisgICAgCisgICAgLyoqIFJlZmVyZW5jZSB0byBOYW1lKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTMyMjQoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFNTRi50ZXN0ZGF0YS5wYXRoIik7CisgICAgICAgIGZpbGVuYW1lPWZpbGVuYW1lKyIvMTMyMjQueGxzIjsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7CisgICAgICAgIEhTU0ZXb3JrYm9vayB3YiA9IG5ldyBIU1NGV29ya2Jvb2soaW4pOworICAgICAgICB0aGlzLmFzc2VydFRydWUoIlJlYWQgd29ya2Jvb2shIiAsIHRydWUpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqIElsbGVnYWwgYXJndW1lbnQgZXhjZXB0aW9uIC0gY2Fubm90IHN0b3JlIGR1cGxpY2F0ZSB2YWx1ZSBpbiBNYXAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxOTU5OSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSsiLzE5NTk5LTEueGxzIik7CisgICAgICAgIEhTU0ZXb3JrYm9vayB3YiA9IG5ldyBIU1NGV29ya2Jvb2soaW4pOworICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUrIi8xOTU5OS0yLnhscyIpOworICAgICAgICB3YiA9IG5ldyBIU1NGV29ya2Jvb2soaW4pOworICAgICAgICB0aGlzLmFzc2VydFRydWUoIlJlYWQgd29ya2Jvb2ssIE5vIGV4Y2VwdGlvbnMiICwgdHJ1ZSk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjQyMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJIU1NGLnRlc3RkYXRhLnBhdGgiKTsKKyAgICAgICAgSFNTRldvcmtib29rIHdiID0gbmV3IEhTU0ZXb3JrYm9vayhuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKyIvMjQyMTUueGxzIikpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgc2hlZXRJbmRleCA9IDA7IHNoZWV0SW5kZXggPCB3Yi5nZXROdW1iZXJPZlNoZWV0cygpO3NoZWV0SW5kZXgrKykgeworICAgICAgICAgICAgSFNTRlNoZWV0IHNoZWV0ID0gd2IuZ2V0U2hlZXRBdChzaGVldEluZGV4KTsKKyAgICAgICAgICAgIGludCByb3dzID0gc2hlZXQuZ2V0TGFzdFJvd051bSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93czsgcm93SW5kZXgrKykgeworICAgICAgICAgICAgICAgIEhTU0ZSb3cgcm93ID0gc2hlZXQuZ2V0Um93KHJvd0luZGV4KTsKKyAgICAgICAgICAgICAgICBpbnQgY2VsbHMgPSByb3cuZ2V0TGFzdENlbGxOdW0oKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKHNob3J0IGNlbGxJbmRleCA9IDA7IGNlbGxJbmRleCA8IGNlbGxzOyBjZWxsSW5kZXgrKykgeworICAgICAgICAgICAgICAgICAgICBIU1NGQ2VsbCBjZWxsICA9IHJvdy5nZXRDZWxsKGNlbGxJbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIk5vIEV4Y2VwdGlvbnMgd2hpbGUgcmVhZGluZyBmaWxlIiwgdHJ1ZSk7CisgICAgfQorICAgIAorICAgICBwdWJsaWMgdm9pZCB0ZXN0MTg4MDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgSFNTRldvcmtib29rIGJvb2sgPSBuZXcgSFNTRldvcmtib29rKCk7CisgICAgICAgIGJvb2suY3JlYXRlU2hlZXQoIlRFU1QiKTsKKyAgICAgICAgSFNTRlNoZWV0IHNoZWV0ID0gYm9vay5jbG9uZVNoZWV0KDApOworICAgICAgICBib29rLnNldFNoZWV0TmFtZSgxLCJDTE9ORSIpOworICAgICAgICBzaGVldC5jcmVhdGVSb3coMCkuY3JlYXRlQ2VsbCgoc2hvcnQpMCkuc2V0Q2VsbFZhbHVlKCJUZXN0Iik7CisgICAgICAgIGJvb2sud3JpdGUob3V0KTsKKyAgICAgICAgCisgICAgICAgIGJvb2sgPSBuZXcgSFNTRldvcmtib29rKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBzaGVldCA9IGJvb2suZ2V0U2hlZXQoIkNMT05FIik7CisgICAgICAgIEhTU0ZSb3cgcm93ID0gc2hlZXQuZ2V0Um93KDApOworICAgICAgICBIU1NGQ2VsbCBjZWxsID0gcm93LmdldENlbGwoKHNob3J0KTApOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY2VsbC5nZXRTdHJpbmdDZWxsVmFsdWUoKSk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0Q2xvbmVTaGVldC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0Q2xvbmVTaGVldC5qYXZhCmluZGV4IDA1MjUxNjEuLjZjY2YyOWUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdENsb25lU2hlZXQuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RDbG9uZVNoZWV0LmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKIAkJCXMuYWRkTWVyZ2VkUmVnaW9uKG5ldyBSZWdpb24oKHNob3J0KTAsKHNob3J0KTAsKHNob3J0KTEsKHNob3J0KTEpKTsKIAkJCWIuY2xvbmVTaGVldCgwKTsKIAkJfQotCQljYXRjaChFeGNlcHRpb24gZSl7ZmFpbChlLmdldE1lc3NhZ2UoKSk7fQorCQljYXRjaChFeGNlcHRpb24gZSl7ZS5wcmludFN0YWNrVHJhY2UoKTtmYWlsKGUuZ2V0TWVzc2FnZSgpKTt9CiAJfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RGb3JtdWxhcy5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0Rm9ybXVsYXMuamF2YQppbmRleCA0NTBjNzMyLi41Yjc1MzAzIDEwMDY0NAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RGb3JtdWxhcy5qYXZhCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdEZvcm11bGFzLmphdmEKQEAgLTc0NCw3ICs3NDQsNyBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hlZXRGdW5jdGlvbnMoKQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFNTRi50ZXN0ZGF0YS5wYXRoIik7CiAKQEAgLTgxOCw3ICs4MTgsNyBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nRm9ybXVsYXMoKQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFN0cmluZyByZWFkRmlsZW5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIkhTU0YudGVzdGRhdGEucGF0aCIpOwogCkBAIC04NTIsNyArODUyLDcgQEAKICAgICAKICAgICAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9naWNhbEZvcm11bGFzKCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogCiAgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0TG9naWNhbEZvcm11bGEiLCIueGxzIik7CkBAIC04ODAsNyArODgwLDcgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdERhdGVGb3JtdWxhcygpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgU3RyaW5nIHJlYWRGaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFNTRi50ZXN0ZGF0YS5wYXRoIik7CiAKQEAgLTkxOCw3ICs5MTgsNyBAQAogCiAgICAgCiAgICAgcHVibGljIHZvaWQgdGVzdElmRm9ybXVsYXMoKQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFN0cmluZyByZWFkRmlsZW5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIkhTU0YudGVzdGRhdGEucGF0aCIpOwogCkBAIC0xMDA4LDcgKzEwMDgsNyBAQAogICAgIH0KIAogCXB1YmxpYyB2b2lkIHRlc3RTdW1JZigpCi0JCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJCXRocm93cyBJT0V4Y2VwdGlvbgogCXsKIAkJU3RyaW5nIHJlYWRGaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSFNTRi50ZXN0ZGF0YS5wYXRoIik7CQkKIAkJU3RyaW5nIGZ1bmN0aW9uID0iU1VNSUYoQTE6QTUsXCI+NDAwMFwiLEIxOkI1KSI7CkBAIC0xMDYwLDYgKzEwNjAsNjYgQEAKIAkJYXNzZXJ0VHJ1ZSgic3VtaWYgPT0gMCBieXRlcyIsIGZpbGUubGVuZ3RoKCkgPiAwKTsKIAl9CiAgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNxdWFyZU1hY3JvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoIkhTU0YudGVzdGRhdGEucGF0aCIpKTsKKyAgICAgICAgRmlsZSB4bHMgPSBuZXcgRmlsZShkaXIsICJTcXVhcmVNYWNyby54bHMiKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh4bHMpOworICAgICAgICBIU1NGV29ya2Jvb2sgdzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHcgPSBuZXcgSFNTRldvcmtib29rKGluKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgSFNTRlNoZWV0IHMwID0gdy5nZXRTaGVldEF0KDApOworICAgICAgICBIU1NGUm93W10gciA9IHtzMC5nZXRSb3coMCksIHMwLmdldFJvdygxKX07CisKKyAgICAgICAgSFNTRkNlbGwgYTEgPSByWzBdLmdldENlbGwoKHNob3J0KSAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzcXVhcmUoMSkiLCBhMS5nZXRDZWxsRm9ybXVsYSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFkLCBhMS5nZXROdW1lcmljQ2VsbFZhbHVlKCksIDFlLTkpOworCisgICAgICAgIEhTU0ZDZWxsIGEyID0gclsxXS5nZXRDZWxsKChzaG9ydCkgMCk7CisgICAgICAgIGFzc2VydEVxdWFscygic3F1YXJlKDIpIiwgYTIuZ2V0Q2VsbEZvcm11bGEoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0ZCwgYTIuZ2V0TnVtZXJpY0NlbGxWYWx1ZSgpLCAxZS05KTsKKworICAgICAgICBIU1NGQ2VsbCBiMSA9IHJbMF0uZ2V0Q2VsbCgoc2hvcnQpIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIklGKFRSVUUsc3F1YXJlKDEpKSIsIGIxLmdldENlbGxGb3JtdWxhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMWQsIGIxLmdldE51bWVyaWNDZWxsVmFsdWUoKSwgMWUtOSk7CisKKyAgICAgICAgSFNTRkNlbGwgYjIgPSByWzFdLmdldENlbGwoKHNob3J0KSAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJRihUUlVFLHNxdWFyZSgyKSkiLCBiMi5nZXRDZWxsRm9ybXVsYSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDRkLCBiMi5nZXROdW1lcmljQ2VsbFZhbHVlKCksIDFlLTkpOworCisgICAgICAgIEhTU0ZDZWxsIGMxID0gclswXS5nZXRDZWxsKChzaG9ydCkgMik7CisgICAgICAgIGFzc2VydEVxdWFscygic3F1YXJlKHNxdWFyZSgxKSkiLCBjMS5nZXRDZWxsRm9ybXVsYSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFkLCBjMS5nZXROdW1lcmljQ2VsbFZhbHVlKCksIDFlLTkpOworCisgICAgICAgIEhTU0ZDZWxsIGMyID0gclsxXS5nZXRDZWxsKChzaG9ydCkgMik7CisgICAgICAgIGFzc2VydEVxdWFscygic3F1YXJlKHNxdWFyZSgyKSkiLCBjMi5nZXRDZWxsRm9ybXVsYSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE2ZCwgYzIuZ2V0TnVtZXJpY0NlbGxWYWx1ZSgpLCAxZS05KTsKKworICAgICAgICBIU1NGQ2VsbCBkMSA9IHJbMF0uZ2V0Q2VsbCgoc2hvcnQpIDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNxdWFyZShvbmUoKSkiLCBkMS5nZXRDZWxsRm9ybXVsYSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFkLCBkMS5nZXROdW1lcmljQ2VsbFZhbHVlKCksIDFlLTkpOworCisgICAgICAgIEhTU0ZDZWxsIGQyID0gclsxXS5nZXRDZWxsKChzaG9ydCkgMyk7CisgICAgICAgIGFzc2VydEVxdWFscygic3F1YXJlKHR3bygpKSIsIGQyLmdldENlbGxGb3JtdWxhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNGQsIGQyLmdldE51bWVyaWNDZWxsVmFsdWUoKSwgMWUtOSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0Zvcm11bGFSZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoIkhTU0YudGVzdGRhdGEucGF0aCIpKTsKKyAgICAgICAgRmlsZSB4bHMgPSBuZXcgRmlsZShkaXIsICJTdHJpbmdGb3JtdWxhcy54bHMiKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh4bHMpOworICAgICAgICBIU1NGV29ya2Jvb2sgdzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHcgPSBuZXcgSFNTRldvcmtib29rKGluKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgSFNTRkNlbGwgYyA9IHcuZ2V0U2hlZXRBdCgwKS5nZXRSb3coMCkuZ2V0Q2VsbCgoc2hvcnQpMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiU3RyaW5nIENlbGwgdmFsdWUiLCJYWVoiLGMuZ2V0U3RyaW5nQ2VsbFZhbHVlKCkpOworICAgIH0KKyAgICAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewogICAgICAgICBTeXN0ZW0ub3V0CiAgICAgICAgIC5wcmludGxuKCJUZXN0aW5nIG9yZy5hcGFjaGUucG9pLmhzc2YudXNlcm1vZGVsLlRlc3RGb3JtdWxhcyIpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0SFNTRkNlbGwuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdEhTU0ZDZWxsLmphdmEKaW5kZXggZGNiMTE0Yy4uMWFkOTc1OSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0SFNTRkNlbGwuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RIU1NGQ2VsbC5qYXZhCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogICAgICAgICAgICAgYz1yLmNyZWF0ZUNlbGwoKHNob3J0KTIpOwogICAgICAgICAgICAgLy9jLnNldENlbGxUeXBlKEhTU0ZDZWxsLkNFTExfVFlQRV9FUlJPUik7Ci0gICAgICAgICAgICBjLnNldENlbGxFcnJvclZhbHVlKChieXRlKTEpOworICAgICAgICAgICAgYy5zZXRDZWxsRXJyb3JWYWx1ZSgoYnl0ZSk3KTsKIAogCiAgICAgICAgICAgICB3Yi53cml0ZShvdXQpOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAgICAgICAgICAgICBjID0gci5nZXRDZWxsKChzaG9ydCkxKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoImJvb2xlYW4gdmFsdWUgMCwxID0gMCIsYy5nZXRFcnJvckNlbGxWYWx1ZSgpID09IDApOwogICAgICAgICAgICAgYyA9IHIuZ2V0Q2VsbCgoc2hvcnQpMik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJib29sZWFuIHZhbHVlIDAsMiA9IDEiLGMuZ2V0RXJyb3JDZWxsVmFsdWUoKSA9PSAxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImJvb2xlYW4gdmFsdWUgMCwyID0gNyIsYy5nZXRFcnJvckNlbGxWYWx1ZSgpID09IDcpOwogCiAgICAgICAgICAgICBpbi5jbG9zZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdEhTU0ZIZWFkZXJGb290ZXIuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdEhTU0ZIZWFkZXJGb290ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzc0YzE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0SFNTRkhlYWRlckZvb3Rlci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kCisgKiAgICAiQXBhY2hlIFBPSSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICAiQXBhY2hlIFBPSSIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnVzZXJtb2RlbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnVzZXJtb2RlbC5IU1NGSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXNlcm1vZGVsLkhTU0ZGb290ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi51c2VybW9kZWwuSFNTRlNoZWV0OworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXNlcm1vZGVsLkhTU0ZXb3JrYm9vazsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CisKKy8qKgorICogVGVzdHMgcm93IHNoaWZ0aW5nIGNhcGFiaWxpdGllcy4KKyAqCisgKgorICogQGF1dGhvciBTaGF3biBMYXViYWNoIChzbGF1YmFjaCBhdCBhcGFjaGUgZG90IGNvbSkKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdEhTU0ZIZWFkZXJGb290ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdEhlYWRlckZvb3Rlci4KKyAgICAgKiBAcGFyYW0gYXJnMAorICAgICAqLworICAgIHB1YmxpYyBUZXN0SFNTRkhlYWRlckZvb3RlcihTdHJpbmcgYXJnMCkgeworCXN1cGVyKGFyZzApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgZ2V0IGhlYWRlciByZXRyZWl2ZXMgdGhlIHByb3BlciB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIFNoYXduIExhdWJhY2ggKHNsYXViYWNoIGF0IGFwYWNoZSBkb3Qgb3JnKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRyaWV2ZUNvcnJlY3RIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBSZWFkIGluaXRpYWwgZmlsZSBpbgorICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoICJIU1NGLnRlc3RkYXRhLnBhdGgiICk7CisgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyAiL0VtYmVkZGVkQ2hhcnRIZWFkZXJUZXN0LnhscyI7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlbmFtZSApOworICAgICAgICBIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKCBmaW4gKTsKKyAgICAgICAgZmluLmNsb3NlKCk7CisgICAgICAgIEhTU0ZTaGVldCBzID0gd2IuZ2V0U2hlZXRBdCggMCApOworCUhTU0ZIZWFkZXIgaGVhZCA9IHMuZ2V0SGVhZGVyKCk7CisKKwlhc3NlcnRFcXVhbHMoIlRvcCBMZWZ0IiwgaGVhZC5nZXRMZWZ0KCkpOworCWFzc2VydEVxdWFscygiVG9wIENlbnRlciIsIGhlYWQuZ2V0Q2VudGVyKCkpOworCWFzc2VydEVxdWFscygiVG9wIFJpZ2h0IiwgaGVhZC5nZXRSaWdodCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGdldCBoZWFkZXIgcmV0cmVpdmVzIHRoZSBwcm9wZXIgdmFsdWVzLgorICAgICAqCisgICAgICogQGF1dGhvciBTaGF3biBMYXViYWNoIChzbGF1YmFjaCBhdCBhcGFjaGUgZG90IG9yZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0cmlldmVDb3JyZWN0Rm9vdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gUmVhZCBpbml0aWFsIGZpbGUgaW4KKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCAiSFNTRi50ZXN0ZGF0YS5wYXRoIiApOworICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgIi9FbWJlZGRlZENoYXJ0SGVhZGVyVGVzdC54bHMiOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZmlsZW5hbWUgKTsKKyAgICAgICAgSFNTRldvcmtib29rIHdiID0gbmV3IEhTU0ZXb3JrYm9vayggZmluICk7CisgICAgICAgIGZpbi5jbG9zZSgpOworICAgICAgICBIU1NGU2hlZXQgcyA9IHdiLmdldFNoZWV0QXQoIDAgKTsKKwlIU1NGRm9vdGVyIGZvb3QgPSBzLmdldEZvb3RlcigpOworCisJYXNzZXJ0RXF1YWxzKCJCb3R0b20gTGVmdCIsIGZvb3QuZ2V0TGVmdCgpKTsKKwlhc3NlcnRFcXVhbHMoIkJvdHRvbSBDZW50ZXIiLCBmb290LmdldENlbnRlcigpKTsKKwlhc3NlcnRFcXVhbHMoIkJvdHRvbSBSaWdodCIsIGZvb3QuZ2V0UmlnaHQoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RIU1NGU2hlZXQuamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdEhTU0ZTaGVldC5qYXZhCmluZGV4IDhlNTgxODYuLjM3NzlmM2EgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdEhTU0ZTaGVldC5qYXZhCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdEhTU0ZTaGVldC5qYXZhCkBAIC01NCwxOCArNTQsMjEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5oc3NmLnVzZXJtb2RlbDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLlNoZWV0OwotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLkhDZW50ZXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuVkNlbnRlclJlY29yZDsKLWltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5XU0Jvb2xSZWNvcmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuU0NMUmVjb3JkOwotaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLldpbmRvd1R3b1JlY29yZDsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLm1vZGVsLlNoZWV0OworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YucmVjb3JkLkhDZW50ZXJSZWNvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuUHJvdGVjdFJlY29yZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5TQ0xSZWNvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuVkNlbnRlclJlY29yZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5oc3NmLnJlY29yZC5XU0Jvb2xSZWNvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5wb2kuaHNzZi5yZWNvcmQuV2luZG93VHdvUmVjb3JkOworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXRpbC5SZWdpb247CisKIC8qKgogICogVGVzdHMgSFNTRlNoZWV0LiAgVGhpcyB0ZXN0IGNhc2UgaXMgdmVyeSBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCiAgKgpAQCAtMjM2LDYgKzIzOSwyNyBAQAogICAgICAgICBjZWxsLnNldENlbGxWYWx1ZSgiRGlmZmVyZW5jZSBDaGVjayIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoY2xvbmVkLmdldFJvdygoc2hvcnQpMCkuZ2V0Q2VsbCgoc2hvcnQpMCkuZ2V0U3RyaW5nQ2VsbFZhbHVlKCksICJjbG9uZV90ZXN0Iik7CiAgICAgfQorICAgIAorCS8qKgorCSAqIFRlc3QgdGhhdCB0aGUgUHJvdGVjdFJlY29yZCBpcyBpbmNsdWRlZCB3aGVuIGNyZWF0aW5nIG9yIGNsb25pbmcgYSBzaGVldAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RQcm90ZWN0KCkgeworCQlIU1NGV29ya2Jvb2sgd29ya2Jvb2sgPSBuZXcgSFNTRldvcmtib29rKCk7CisJCUhTU0ZTaGVldCBoc3NmU2hlZXQgPSB3b3JrYm9vay5jcmVhdGVTaGVldCgpOworCQlTaGVldCBzaGVldCA9IGhzc2ZTaGVldC5nZXRTaGVldCgpOworCQlQcm90ZWN0UmVjb3JkIHByb3RlY3QgPSBzaGVldC5nZXRQcm90ZWN0KCk7CisgICAJCisJCWFzc2VydEZhbHNlKHByb3RlY3QuZ2V0UHJvdGVjdCgpKTsKKworCQkvLyBUaGlzIHdpbGwgdGVsbCB1cyB0aGF0IGNsb25lU2hlZXQsIGFuZCBieSBleHRlbnNpb24sCisJCS8vIHRoZSBsaXN0IGZvcm1zIG9mIGNyZWF0ZVNoZWV0IGxlYXZlIHVzIHdpdGggYW4gYWNjZXNzaWJsZQorCQkvLyBQcm90ZWN0UmVjb3JkLgorCQloc3NmU2hlZXQuc2V0UHJvdGVjdCh0cnVlKTsKKwkJU2hlZXQgY2xvbmVkID0gc2hlZXQuY2xvbmVTaGVldCgpOworCQlhc3NlcnROb3ROdWxsKGNsb25lZC5nZXRQcm90ZWN0KCkpOworCQlhc3NlcnRUcnVlKGhzc2ZTaGVldC5nZXRQcm90ZWN0KCkpOworCX0KKwogCiAgICAgcHVibGljIHZvaWQgdGVzdFpvb20oKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgpAQCAtMjU0LDQgKzI3OCwxMTEgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShzY2xMb2MgPT0gd2luZG93MkxvYyArIDEpOwogCiAgICAgfQorICAgIAorCisJLyoqCisJICogV2hlbiByZW1vdmluZyBvbmUgbWVyZ2VkIHJlZ2lvbiwgaXQgd291bGQgYnJlYWsKKwkgKgorCSAqLyAgICAKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTWVyZ2VkKCkgeworCQlIU1NGV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKCk7CisJCUhTU0ZTaGVldCBzaGVldCA9IHdiLmNyZWF0ZVNoZWV0KCk7CisJCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKDAsIChzaG9ydCkwLCAxLCAoc2hvcnQpMSk7ICAgCQorCQlzaGVldC5hZGRNZXJnZWRSZWdpb24ocmVnaW9uKTsKKwkJcmVnaW9uID0gbmV3IFJlZ2lvbigxLCAoc2hvcnQpMCwgMiwgKHNob3J0KTEpOworCQlzaGVldC5hZGRNZXJnZWRSZWdpb24ocmVnaW9uKTsKKwkJCisgICAgCXNoZWV0LnJlbW92ZU1lcmdlZFJlZ2lvbigwKTsKKyAgICAJCisgICAgCXJlZ2lvbiA9IHNoZWV0LmdldE1lcmdlZFJlZ2lvbkF0KDApOworICAgIAlhc3NlcnRFcXVhbHMoIkxlZnQgb3ZlciByZWdpb24gc2hvdWxkIGJlIHN0YXJ0aW5nIGF0IHJvdyAxIiwgMSwgcmVnaW9uLmdldFJvd0Zyb20oKSk7CisgICAgCQorICAgIAlzaGVldC5yZW1vdmVNZXJnZWRSZWdpb24oMCk7CisgICAgCQorCQlhc3NlcnRFcXVhbHMoInRoZXJlIHNob3VsZCBiZSBubyBtZXJnZWQgcmVnaW9ucyBsZWZ0ISIsIDAsIHNoZWV0LmdldE51bU1lcmdlZFJlZ2lvbnMoKSk7CisJCQorCQkvL2FuLCBhZGQsIHJlbW92ZSwgZ2V0KDApIHdvdWxkIG51bGwgcG9pbnRlcgorCQlzaGVldC5hZGRNZXJnZWRSZWdpb24ocmVnaW9uKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0aGVyZSBzaG91bGQgbm93IGJlIG9uZSBtZXJnZWQgcmVnaW9uISIsIDEsIHNoZWV0LmdldE51bU1lcmdlZFJlZ2lvbnMoKSk7CisJCXNoZWV0LnJlbW92ZU1lcmdlZFJlZ2lvbigwKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0aGVyZSBzaG91bGQgbm93IGJlIHplcm8gbWVyZ2VkIHJlZ2lvbnMhIiwgMCwgc2hlZXQuZ2V0TnVtTWVyZ2VkUmVnaW9ucygpKTsKKwkJLy9hZGQgaXQgYWdhaW4hCisJCXJlZ2lvbi5zZXRSb3dUbyg0KTsKKyAgICAJCisJCXNoZWV0LmFkZE1lcmdlZFJlZ2lvbihyZWdpb24pOworCQlhc3NlcnRFcXVhbHMoInRoZXJlIHNob3VsZCBub3cgYmUgb25lIG1lcmdlZCByZWdpb24hIiwgMSwgc2hlZXQuZ2V0TnVtTWVyZ2VkUmVnaW9ucygpKTsKKwkJCisJCS8vc2hvdWxkIGV4aXN0IG5vdyEKKwkJYXNzZXJ0VHJ1ZSgidGhlcmUgaXNuJ3QgbW9yZSB0aGFuIG9uZSBtZXJnZWQgcmVnaW9uIGluIHRoZXJlIiwgMSA8PSBzaGVldC5nZXROdW1NZXJnZWRSZWdpb25zKCkpOworCQlyZWdpb24gPSBzaGVldC5nZXRNZXJnZWRSZWdpb25BdCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0aGUgbWVyZ2VkIHJvdyB0byBkb2VzbnQgbWF0Y2ggdGhlIG9uZSB3ZSBwdXQgaW4gIiwgNCwgcmVnaW9uLmdldFJvd1RvKCkpOworICAgIAkKKyAgICB9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2hpZnRNZXJnZWQoKSB7CisJCUhTU0ZXb3JrYm9vayB3YiA9IG5ldyBIU1NGV29ya2Jvb2soKTsKKwkJSFNTRlNoZWV0IHNoZWV0ID0gd2IuY3JlYXRlU2hlZXQoKTsKKwkJSFNTRlJvdyByb3cgPSBzaGVldC5jcmVhdGVSb3coMCk7CisJCUhTU0ZDZWxsIGNlbGwgPSByb3cuY3JlYXRlQ2VsbCgoc2hvcnQpMCk7CisJCWNlbGwuc2V0Q2VsbFZhbHVlKCJmaXJzdCByb3csIGZpcnN0IGNlbGwiKTsKKwkJCisJCXJvdyA9IHNoZWV0LmNyZWF0ZVJvdygxKTsKKwkJY2VsbCA9IHJvdy5jcmVhdGVDZWxsKChzaG9ydCkxKTsKKwkJY2VsbC5zZXRDZWxsVmFsdWUoInNlY29uZCByb3csIHNlY29uZCBjZWxsIik7CisJCQorCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigxLCAoc2hvcnQpMCwgMSwgKHNob3J0KTEpOyAgIAkKKwkJc2hlZXQuYWRkTWVyZ2VkUmVnaW9uKHJlZ2lvbik7CisJCQorCQlzaGVldC5zaGlmdFJvd3MoMSwgMSwgMSk7CisJCQorCQlyZWdpb24gPSBzaGVldC5nZXRNZXJnZWRSZWdpb25BdCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJNZXJnZWQgcmVnaW9uIG5vdCBtb3ZlZCBvdmVyIHRvIHJvdyAyIiwgMiwgcmVnaW9uLmdldFJvd0Zyb20oKSk7CisJCQorCX0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBkaXNwbGF5IG9mIGdyaWRsaW5lcywgZm9ybXVsYXMsIGFuZCByb3djb2xoZWFkaW5ncy4KKyAgICAgKiBAYXV0aG9yIFNoYXduIExhdWJhY2ggKHNsYXViYWNoIGF0IGFwYWNoZSBkb3Qgb3JnKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwbGF5T3B0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCUhTU0ZXb3JrYm9vayB3YiA9IG5ldyBIU1NGV29ya2Jvb2soKTsKKwlIU1NGU2hlZXQgc2hlZXQgPSB3Yi5jcmVhdGVTaGVldCgpOworCQorICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZGlzcGxheSIsICJ0ZXN0LnhscyIpOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKKyAgICAgICAgd2Iud3JpdGUoc3RyZWFtKTsKKyAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIHJlYWRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKTsKKyAgICAgICAgd2IgPSBuZXcgSFNTRldvcmtib29rKHJlYWRTdHJlYW0pOworICAgICAgICBzaGVldCA9IHdiLmdldFNoZWV0QXQoMCk7CisJcmVhZFN0cmVhbS5jbG9zZSgpOworCisJYXNzZXJ0RXF1YWxzKHNoZWV0LmlzRGlzcGxheUdyaWRsaW5lcygpLCB0cnVlKTsKKwlhc3NlcnRFcXVhbHMoc2hlZXQuaXNEaXNwbGF5Um93Q29sSGVhZGluZ3MoKSwgdHJ1ZSk7CisJYXNzZXJ0RXF1YWxzKHNoZWV0LmlzRGlzcGxheUZvcm11bGFzKCksIGZhbHNlKTsKKworCXNoZWV0LnNldERpc3BsYXlHcmlkbGluZXMoZmFsc2UpOworCXNoZWV0LnNldERpc3BsYXlSb3dDb2xIZWFkaW5ncyhmYWxzZSk7CisJc2hlZXQuc2V0RGlzcGxheUZvcm11bGFzKHRydWUpOworCisgICAgICAgIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZGlzcGxheSIsICJ0ZXN0LnhscyIpOworICAgICAgICBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7CisgICAgICAgIHdiLndyaXRlKHN0cmVhbSk7CisgICAgICAgIHN0cmVhbS5jbG9zZSgpOworCisgICAgICAgIHJlYWRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKTsKKyAgICAgICAgd2IgPSBuZXcgSFNTRldvcmtib29rKHJlYWRTdHJlYW0pOworICAgICAgICBzaGVldCA9IHdiLmdldFNoZWV0QXQoMCk7CisJcmVhZFN0cmVhbS5jbG9zZSgpOworCisKKwlhc3NlcnRFcXVhbHMoc2hlZXQuaXNEaXNwbGF5R3JpZGxpbmVzKCksIGZhbHNlKTsKKwlhc3NlcnRFcXVhbHMoc2hlZXQuaXNEaXNwbGF5Um93Q29sSGVhZGluZ3MoKSwgZmFsc2UpOworCWFzc2VydEVxdWFscyhzaGVldC5pc0Rpc3BsYXlGb3JtdWxhcygpLCB0cnVlKTsKKyAgICB9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgeworCQkganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKFRlc3RIU1NGU2hlZXQuY2xhc3MpOworCX0gICAgCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RTaGVldFNoaWZ0Um93cy5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0U2hlZXRTaGlmdFJvd3MuamF2YQppbmRleCBhNDhmYjY4Li5lOTEwMDNlIDEwMDc1NQotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RTaGVldFNoaWZ0Um93cy5qYXZhCisrKyBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdFNoZWV0U2hpZnRSb3dzLmphdmEKQEAgLTE3NSw1ICsxNzUsMTggQEAKIAlzLmNyZWF0ZVJvdygzKS5jcmVhdGVDZWxsKChzaG9ydCkwKS5zZXRDZWxsVmFsdWUoIlRFU1QyIik7CiAJcy5zaGlmdFJvd3MoMCw0LDEpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZW4gc2hpZnRpbmcgdGhlIGZpcnN0IHJvdy4KKyAgICAgKgorICAgICAqIEBhdXRob3IgVG9zaGlha2kgS2Ftb3NoaWRhIChrYW1vc2hpZGEudG9zaGlha2kgYXQgZnV0dXJlIGRvdCBjbyBkb3QganApCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNoaWZ0Um93MCgpeworCUhTU0ZXb3JrYm9vayBiID0gbmV3IEhTU0ZXb3JrYm9vaygpOworCUhTU0ZTaGVldCBzICAgID0gYi5jcmVhdGVTaGVldCgpOworCXMuY3JlYXRlUm93KDApLmNyZWF0ZUNlbGwoKHNob3J0KTApLnNldENlbGxWYWx1ZSgiVEVTVDEiKTsKKwlzLmNyZWF0ZVJvdygzKS5jcmVhdGVDZWxsKChzaG9ydCkwKS5zZXRDZWxsVmFsdWUoIlRFU1QyIik7CisJcy5zaGlmdFJvd3MoMCw0LDEpOworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0V29ya2Jvb2suamF2YSBiL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvaHNzZi91c2VybW9kZWwvVGVzdFdvcmtib29rLmphdmEKaW5kZXggYzhiYzdiOC4uNmI1ZmQ5NyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9oc3NmL3VzZXJtb2RlbC9UZXN0V29ya2Jvb2suamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL2hzc2YvdXNlcm1vZGVsL1Rlc3RXb3JrYm9vay5qYXZhCkBAIC0zMDQsNiArMzA0LDggQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMjUsY2VsbC5nZXROdW1lcmljQ2VsbFZhbHVlKCksIDFlLTEwKTsKIAogCWFzc2VydEVxdWFscyhmb3JtYXQuZ2V0Rm9ybWF0KGRmKSwgIjAuMCIpOworCisJYXNzZXJ0RXF1YWxzKGZvcm1hdCwgd29ya2Jvb2suY3JlYXRlRGF0YUZvcm1hdCgpKTsKIAkKICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL1Nsb3dJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL1Nsb3dJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDhjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL3BvaWZzL2ZpbGVzeXN0ZW0vU2xvd0lucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw3NiBAQAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kCisgKiAgICAiQXBhY2hlIFBPSSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisgKiAgICAiQXBhY2hlIFBPSSIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnBvaS5wb2lmcy5maWxlc3lzdGVtOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogUmV0dXJucyBhIHJhbmRvbSBhbW91bnQgb2YgcmVxdWVzdGVkIGRhdGEuIFVzZWQgdG8gY2hlY2sgY29uZm9ybWFuY2Ugd2l0aAorICogSW5wdXRTdHJlYW0gQVBJIGNvbnRyYWN0cy4KKyAqLworcHVibGljIGNsYXNzIFNsb3dJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtCit7CisgICAgcHJpdmF0ZSBSYW5kb20gciA9IG5ldyBSYW5kb20oMCk7CisgICAgCisgICAgcHVibGljIFNsb3dJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3VwZXIucmVhZChiLCBvZmYsIHIubmV4dEludChsZW4pICsgMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL1Rlc3REb2N1bWVudC5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9maWxlc3lzdGVtL1Rlc3REb2N1bWVudC5qYXZhCmluZGV4IGFmNDE3ZmEuLjJlOWZkMDIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvcG9pZnMvZmlsZXN5c3RlbS9UZXN0RG9jdW1lbnQuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL3BvaWZzL2ZpbGVzeXN0ZW0vVGVzdERvY3VtZW50LmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBhcnJheVsgaiBdID0gKCBieXRlICkgajsKICAgICAgICAgfQotICAgICAgICBkb2N1bWVudCA9IG5ldyBQT0lGU0RvY3VtZW50KCJmb28iLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYXJyYXkpKTsKKyAgICAgICAgZG9jdW1lbnQgPSBuZXcgUE9JRlNEb2N1bWVudCgiZm9vIiwgbmV3IFNsb3dJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYXJyYXkpKSk7CiAgICAgICAgIGNoZWNrRG9jdW1lbnQoZG9jdW1lbnQsIGFycmF5KTsKIAogICAgICAgICAvLyB2ZXJpZnkgY29ycmVjdCBudW1iZXIgb2YgYmxvY2tzIGdldCBjcmVhdGVkIGZvciBkb2N1bWVudApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9wcm9wZXJ0eS9UZXN0RG9jdW1lbnRQcm9wZXJ0eS5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9wcm9wZXJ0eS9UZXN0RG9jdW1lbnRQcm9wZXJ0eS5qYXZhCmluZGV4IDc0YTM4MDcuLmU2NzdhNzkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvcG9pZnMvcHJvcGVydHkvVGVzdERvY3VtZW50UHJvcGVydHkuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL3BvaWZzL3Byb3BlcnR5L1Rlc3REb2N1bWVudFByb3BlcnR5LmphdmEKQEAgLTE1MCw2ICsxNTAsNyBAQAogICAgICAgICAgICAgKCBieXRlICkgMHhGRSwgKCBieXRlICkgMHhGRiwgKCBieXRlICkgMHhGRiwgKCBieXRlICkgMHhGRiwKICAgICAgICAgICAgICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsCiAgICAgICAgICAgICAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwLAorCiAgICAgICAgICAgICAoIGJ5dGUgKSAweDU3LCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDZGLCAoIGJ5dGUgKSAweDAwLAogICAgICAgICAgICAgKCBieXRlICkgMHg3MiwgKCBieXRlICkgMHgwMCwgKCBieXRlICkgMHg2QiwgKCBieXRlICkgMHgwMCwKICAgICAgICAgICAgICggYnl0ZSApIDB4NjIsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4NkYsICggYnl0ZSApIDB4MDAsCkBAIC0xODIsNiArMTgzLDcgQEAKICAgICAgICAgICAgICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsCiAgICAgICAgICAgICAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDEwLCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwLAogICAgICAgICAgICAgKCBieXRlICkgMHgwMCwgKCBieXRlICkgMHgwMCwgKCBieXRlICkgMHgwMCwgKCBieXRlICkgMHgwMCwKKwogICAgICAgICAgICAgKCBieXRlICkgMHgwNSwgKCBieXRlICkgMHgwMCwgKCBieXRlICkgMHg1MywgKCBieXRlICkgMHgwMCwKICAgICAgICAgICAgICggYnl0ZSApIDB4NzUsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4NkQsICggYnl0ZSApIDB4MDAsCiAgICAgICAgICAgICAoIGJ5dGUgKSAweDZELCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDYxLCAoIGJ5dGUgKSAweDAwLApAQCAtMjE0LDYgKzIxNiw3IEBACiAgICAgICAgICAgICAoIGJ5dGUgKSAweDA4LCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwLAogICAgICAgICAgICAgKCBieXRlICkgMHgwMCwgKCBieXRlICkgMHgxMCwgKCBieXRlICkgMHgwMCwgKCBieXRlICkgMHgwMCwKICAgICAgICAgICAgICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4MDAsCisKICAgICAgICAgICAgICggYnl0ZSApIDB4MDUsICggYnl0ZSApIDB4MDAsICggYnl0ZSApIDB4NDQsICggYnl0ZSApIDB4MDAsCiAgICAgICAgICAgICAoIGJ5dGUgKSAweDZGLCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDYzLCAoIGJ5dGUgKSAweDAwLAogICAgICAgICAgICAgKCBieXRlICkgMHg3NSwgKCBieXRlICkgMHgwMCwgKCBieXRlICkgMHg2RCwgKCBieXRlICkgMHgwMCwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS9wb2kvcG9pZnMvcHJvcGVydHkvVGVzdFJvb3RQcm9wZXJ0eS5qYXZhIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9wcm9wZXJ0eS9UZXN0Um9vdFByb3BlcnR5LmphdmEKaW5kZXggNDMwYzUyMS4uODM1N2EwYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9wcm9wZXJ0eS9UZXN0Um9vdFByb3BlcnR5LmphdmEKKysrIGIvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS9wb2lmcy9wcm9wZXJ0eS9UZXN0Um9vdFByb3BlcnR5LmphdmEKQEAgLTIxNywxMSArMjE3LDExIEBACiAgICAgICAgICAgICAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwLCAoIGJ5dGUgKSAweDAwCiAgICAgICAgIH07CiAKLSAgICAgICAgdmVyaWZ5UmVhZGluZ1Byb3BlcnR5KDAsIGlucHV0LCAwLCAiUm9vdCBFbnRyeSIpOworICAgICAgICB2ZXJpZnlSZWFkaW5nUHJvcGVydHkoMCwgaW5wdXQsIDAsICJSb290IEVudHJ5IiwgInswMDAyMDgyMC0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9Iik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVJlYWRpbmdQcm9wZXJ0eShpbnQgaW5kZXgsIGJ5dGUgW10gaW5wdXQsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgc0Nsc0lkKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFJvb3RQcm9wZXJ0eSAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBSb290UHJvcGVydHkoaW5kZXgsIGlucHV0LApAQCAtMjQyLDYgKzI0Miw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhpbmRleCwgcHJvcGVydHkuZ2V0SW5kZXgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLCBwcm9wZXJ0eS5nZXROYW1lKCkpOwogICAgICAgICBhc3NlcnRUcnVlKCFwcm9wZXJ0eS5nZXRDaGlsZHJlbigpLmhhc05leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcm9wZXJ0eS5nZXRTdG9yYWdlQ2xzaWQoKS50b1N0cmluZygpLCBzQ2xzSWQpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3BvaS91dGlsL1Rlc3RIZXhEdW1wLmphdmEgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL3V0aWwvVGVzdEhleER1bXAuamF2YQppbmRleCA3YTg2Y2ZmLi5jOGUzY2E5IDEwMDY0NAotLS0gYS9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL3V0aWwvVGVzdEhleER1bXAuamF2YQorKysgYi9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvcG9pL3V0aWwvVGVzdEhleER1bXAuamF2YQpAQCAtMzE0LDYgKzMxNCw5IEBACiAKICAgICAgICAgICAgIC8vIGFzIGV4cGVjdGVkCiAgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgcHJvcGVyIGJlaGF2aW91ciB3aXRoIGEgMCBsZW5ndGggZHVtcCBvbiAwIGxlbmd0aCBkYXRhc2V0CisgICAgICAgIEhleER1bXAuZHVtcChuZXcgYnl0ZVswXSwgMCwgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpLCAwLCAwKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9IZXgoKQo=