ZGlmZiAtLWdpdCBhL01hZ2ljaysrL2xpYi9JbWFnZS5jcHAgYi9NYWdpY2srKy9saWIvSW1hZ2UuY3BwCmluZGV4IDgzMDAxZGEuLjA4OWJkYTYgMTAwNjQ0Ci0tLSBhL01hZ2ljaysrL2xpYi9JbWFnZS5jcHAKKysrIGIvTWFnaWNrKysvbGliL0ltYWdlLmNwcApAQCAtNDI3Myw3ICs0MjczLDcgQEAKICAgICAgIEV4Y2VwdGlvbkluZm8gZXhjZXB0aW9uSW5mbzsKICAgICAgIEdldEV4Y2VwdGlvbkluZm8oICZleGNlcHRpb25JbmZvICk7CiAgICAgICBfaW1nUmVmLT5pZChfaW1nUmVmLT5pZCgpKzEpOwotICAgICAgc3ByaW50ZihpZCwiJWxkXG4iLChsb25nKSBfaW1nUmVmLT5pZCgpKTsKKyAgICAgIHNwcmludGYoaWQsIiUuMjBnXG4iLChkb3VibGUpIF9pbWdSZWYtPmlkKCkpOwogICAgICAgU2V0SW1hZ2VSZWdpc3RyeShJbWFnZVJlZ2lzdHJ5VHlwZSwgaWQsIGltYWdlKCksICZleGNlcHRpb25JbmZvKTsKICAgICAgIHRocm93RXhjZXB0aW9uKCBleGNlcHRpb25JbmZvICk7CiAgICh2b2lkKSBEZXN0cm95RXhjZXB0aW9uSW5mbyggJmV4Y2VwdGlvbkluZm8gKTsKZGlmZiAtLWdpdCBhL01hZ2ljaysrL2xpYi9JbWFnZVJlZi5jcHAgYi9NYWdpY2srKy9saWIvSW1hZ2VSZWYuY3BwCmluZGV4IDhhMDA3YjQuLmM3MzZhODkgMTAwNjQ0Ci0tLSBhL01hZ2ljaysrL2xpYi9JbWFnZVJlZi5jcHAKKysrIGIvTWFnaWNrKysvbGliL0ltYWdlUmVmLmNwcApAQCAtNTksNyArNTksNyBAQAogICBpZiggX2lkID4gLTEgKQogICAgIHsKICAgICAgIGNoYXIgaWRbTWF4VGV4dEV4dGVudF07Ci0gICAgICBzcHJpbnRmKGlkLCIlbGQiLChsb25nKSBfaWQpOworICAgICAgc3ByaW50ZihpZCwiJS4yMGciLChkb3VibGUpIF9pZCk7CiAgICAgICBEZWxldGVJbWFnZVJlZ2lzdHJ5KCBpZCApOwogICAgICAgX2lkPS0xOwogICAgIH0KQEAgLTk3LDcgKzk3LDcgQEAKICAgaWYoIF9pZCA+IC0xICkKICAgICB7CiAgICAgICBjaGFyIGlkW01heFRleHRFeHRlbnRdOwotICAgICAgc3ByaW50ZihpZCwiJWxkIiwobG9uZykgX2lkKTsKKyAgICAgIHNwcmludGYoaWQsIiUuMjBnIiwoZG91YmxlKSBfaWQpOwogICAgICAgRGVsZXRlSW1hZ2VSZWdpc3RyeSggaWQgKTsKICAgICB9CiAgIF9pZCA9IGlkXzsKZGlmZiAtLWdpdCBhL1BlcmxNYWdpY2svTWFnaWNrLnhzIGIvUGVybE1hZ2ljay9NYWdpY2sueHMKaW5kZXggZWIyMGZkNi4uYjk2MGI4YyAxMDA2NDQKLS0tIGEvUGVybE1hZ2ljay9NYWdpY2sueHMKKysrIGIvUGVybE1hZ2ljay9NYWdpY2sueHMKQEAgLTkyNiw4ICs5MjYsOCBAQAogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQotICAodm9pZCkgZnByaW50ZihzdGRlcnIsIkdldExpc3Q6IFVucmVjb2duaXplZFR5cGUgJWxkXG4iLAotICAgIChsb25nKSBTdlRZUEUocmVmZXJlbmNlKSk7CisgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwiR2V0TGlzdDogVW5yZWNvZ25pemVkVHlwZSAlLjIwZ1xuIiwKKyAgICAoZG91YmxlKSBTdlRZUEUocmVmZXJlbmNlKSk7CiAgIHJldHVybigoSW1hZ2UgKikgTlVMTCk7CiB9CiAMCkBAIC00MzU1LDggKzQzNTUsOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBwYWdlPUdldEltYWdlQm91bmRpbmdCb3goaW1hZ2UsJmltYWdlLT5leGNlcHRpb24pOwogICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICAgIiVsdXglbHUlK2xkJStsZCIsKHVuc2lnbmVkIGxvbmcpIHBhZ2Uud2lkdGgsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgICAgcGFnZS5oZWlnaHQsKGxvbmcpIHBhZ2UueCwobG9uZykgcGFnZS55KTsKKyAgICAgICAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwoZG91YmxlKSBwYWdlLndpZHRoLChkb3VibGUpCisgICAgICAgICAgICAgICAgcGFnZS5oZWlnaHQsKGRvdWJsZSkgcGFnZS54LChkb3VibGUpIHBhZ2UueSk7CiAgICAgICAgICAgICAgIHM9bmV3U1ZwdihnZW9tZXRyeSwwKTsKICAgICAgICAgICAgICAgUFVTSHMocyA/IHN2XzJtb3J0YWwocykgOiAmc3ZfdW5kZWYpOwogICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ3NjUsNyArNDc2NSw3IEBACiAgICAgICAgICAgICAgICAgICBzdGF0aWMgc3NpemVfdAogICAgICAgICAgICAgICAgICAgICBpZCA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoa2V5LE1heFRleHRFeHRlbnQsIiVsZFxuIiwobG9uZykKKyAgICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoa2V5LE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpCiAgICAgICAgICAgICAgICAgICAgIGlkKTsKICAgICAgICAgICAgICAgICAgIHN0YXR1cz1TZXRJbWFnZVJlZ2lzdHJ5KEltYWdlUmVnaXN0cnlUeXBlLGtleSxpbWFnZSwKICAgICAgICAgICAgICAgICAgICAgJmltYWdlLT5leGNlcHRpb24pOwpAQCAtNTAxNyw5ICs1MDE3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnlbTWF4VGV4dEV4dGVudF07CiAKICAgICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgICAgICAgIiVsdXglbHUlK2xkJStsZCIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLndpZHRoLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2UuaGVpZ2h0LChsb25nKSBpbWFnZS0+cGFnZS54LAotICAgICAgICAgICAgICAgICAgICAobG9uZykgaW1hZ2UtPnBhZ2UueSk7CisgICAgICAgICAgICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIGltYWdlLT5wYWdlLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+cGFnZS5oZWlnaHQsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueCwoZG91YmxlKQorICAgICAgICAgICAgICAgICAgICBpbWFnZS0+cGFnZS55KTsKICAgICAgICAgICAgICAgICAgIHM9bmV3U1ZwdihnZW9tZXRyeSwwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFBVU0hzKHMgPyBzdl8ybW9ydGFsKHMpIDogJnN2X3VuZGVmKTsKQEAgLTU5ODksOCArNTk4OSw4IEBACiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LFF1YW50dW1Gb3JtYXQsCiAgICAgICAgICAgaGlzdG9ncmFtW2ldLnBpeGVsLm9wYWNpdHkpOwogICAgICAgICBQVVNIcyhzdl8ybW9ydGFsKG5ld1NWcHYobWVzc2FnZSwwKSkpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJWx1IiwKLSAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGhpc3RvZ3JhbVtpXS5jb3VudCk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgICBoaXN0b2dyYW1baV0uY291bnQpOwogICAgICAgICBQVVNIcyhzdl8ybW9ydGFsKG5ld1NWcHYobWVzc2FnZSwwKSkpOwogICAgICAgfQogICAgICAgaGlzdG9ncmFtPShDb2xvclBhY2tldCAqKSBSZWxpbnF1aXNoTWFnaWNrTWVtb3J5KGhpc3RvZ3JhbSk7CkBAIC03NDYwLDcgKzc0NjAsNyBAQAogICAgICAgewogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsIiVsZCIsKGxvbmcpIGl4KTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpIGl4KTsKICAgICAgICAgICBUaHJvd1BlcmxFeGNlcHRpb24oZXhjZXB0aW9uLE9wdGlvbkVycm9yLAogICAgICAgICAgICAgIlVucmVjb2duaXplZFBlcmxNYWdpY2tNZXRob2QiLG1lc3NhZ2UpOwogICAgICAgICAgIGdvdG8gUGVybEV4Y2VwdGlvbjsKQEAgLTgzMTAsOCArODMxMCw4IEBACiAgICAgICAgICAgICBDb21wb3NpdGUgdHdvIGltYWdlcyAobm9ybWFsIGNvbXBvc2l0aW9uKS4KICAgICAgICAgICAqLwogICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY29tcG9zaXRlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAiJWx1eCVsdSUrbGQlK2xkIiwodW5zaWduZWQgbG9uZykgY29tcG9zaXRlX2ltYWdlLT5jb2x1bW5zLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNvbXBvc2l0ZV9pbWFnZS0+cm93cywobG9uZykgZ2VvbWV0cnkueCwobG9uZykKKyAgICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIGNvbXBvc2l0ZV9pbWFnZS0+Y29sdW1ucywKKyAgICAgICAgICAgIChkb3VibGUpIGNvbXBvc2l0ZV9pbWFnZS0+cm93cywoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpCiAgICAgICAgICAgICBnZW9tZXRyeS55KTsKICAgICAgICAgICBmbGFncz1QYXJzZUdyYXZpdHlHZW9tZXRyeShpbWFnZSxjb21wb3NpdGVfZ2VvbWV0cnksJmdlb21ldHJ5LAogICAgICAgICAgICAgZXhjZXB0aW9uKTsKQEAgLTExNzMyLDcgKzExNzMyLDcgQEAKICAgICAgIGVsc2UKICAgICAgICAgUFVTSHMoc3ZfMm1vcnRhbChuZXdTVnB2KE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrU3RyZXRjaE9wdGlvbnMsCiAgICAgICAgICAgdHlwZV9pbmZvLT5zdHJldGNoKSwwKSkpOwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCiAgICAgICAgIHR5cGVfaW5mby0+d2VpZ2h0KTsKICAgICAgIFBVU0hzKHN2XzJtb3J0YWwobmV3U1ZwdihtZXNzYWdlLDApKSk7CiAgICAgICBpZiAodHlwZV9pbmZvLT5lbmNvZGluZyA9PSAoY2hhciAqKSBOVUxMKQpAQCAtMTMyODgsOCArMTMyODgsOCBAQAogICB7CiAjZGVmaW5lIENoYW5uZWxTdGF0aXN0aWNzKGNoYW5uZWwpIFwKIHsgXAotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJWx1IiwgXAotICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX3N0YXRpc3RpY3NbY2hhbm5lbF0uZGVwdGgpOyBcCisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsIFwKKyAgICAoZG91YmxlKSBjaGFubmVsX3N0YXRpc3RpY3NbY2hhbm5lbF0uZGVwdGgpOyBcCiAgIFBVU0hzKHN2XzJtb3J0YWwobmV3U1ZwdihtZXNzYWdlLDApKSk7IFwKICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsIiUuMTVnIiwgXAogICAgIGNoYW5uZWxfc3RhdGlzdGljc1tjaGFubmVsXS5taW5pbWEvc2NhbGUpOyBcCmRpZmYgLS1naXQgYS9jb2RlcnMvYm1wLmMgYi9jb2RlcnMvYm1wLmMKaW5kZXggYTEyMjBjMC4uZWRjMjkzOSAxMDA2NDQKLS0tIGEvY29kZXJzL2JtcC5jCisrKyBiL2NvZGVycy9ibXAuYwpAQCAtNjIwLDggKzYyMCw4IEBACiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICAgICAgIiAgRm9ybWF0OiBPUy8yIEJpdG1hcCIpOwogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgIEdlb21ldHJ5OiAlbHV4JWx1IiwodW5zaWduZWQgbG9uZykgYm1wX2luZm8ud2lkdGgsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBibXBfaW5mby5oZWlnaHQpOworICAgICAgICAgICAgICAiICBHZW9tZXRyeTogJS4yMGd4JS4yMGciLChkb3VibGUpIGJtcF9pbmZvLndpZHRoLChkb3VibGUpCisgICAgICAgICAgICAgIGJtcF9pbmZvLmhlaWdodCk7CiAgICAgICAgICAgfQogICAgICAgfQogICAgIGVsc2UKQEAgLTY0OCwxMCArNjQ4LDEwIEBACiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICAgICAgIiAgRm9ybWF0OiBNUyBXaW5kb3dzIGJpdG1hcCIpOwogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgIEdlb21ldHJ5OiAlbHV4JWx1IiwodW5zaWduZWQgbG9uZykgYm1wX2luZm8ud2lkdGgsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBibXBfaW5mby5oZWlnaHQpOworICAgICAgICAgICAgICAiICBHZW9tZXRyeTogJS4yMGd4JS4yMGciLChkb3VibGUpIGJtcF9pbmZvLndpZHRoLChkb3VibGUpCisgICAgICAgICAgICAgIGJtcF9pbmZvLmhlaWdodCk7CiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgQml0cyBwZXIgcGl4ZWw6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIGJtcF9pbmZvLmJpdHNfcGVyX3BpeGVsKTsKKyAgICAgICAgICAgICAgIiAgQml0cyBwZXIgcGl4ZWw6ICUuMjBnIiwoZG91YmxlKSBibXBfaW5mby5iaXRzX3Blcl9waXhlbCk7CiAgICAgICAgICAgICBzd2l0Y2ggKChpbnQpIGJtcF9pbmZvLmNvbXByZXNzaW9uKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBjYXNlIEJJX1JHQjoKQEAgLTg1Nyw3ICs4NTcsNyBAQAogICAgICAgICAqLwogICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgIiAgUmVhZGluZyBjb2xvcm1hcCBvZiAlbHUgY29sb3JzIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbG9ycyk7CisgICAgICAgICAgICAiICBSZWFkaW5nIGNvbG9ybWFwIG9mICUuMjBnIGNvbG9ycyIsKGRvdWJsZSkgaW1hZ2UtPmNvbG9ycyk7CiAgICAgICAgIGlmIChBY3F1aXJlSW1hZ2VDb2xvcm1hcChpbWFnZSxpbWFnZS0+Y29sb3JzKSA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICBUaHJvd1JlYWRlckV4Y2VwdGlvbihSZXNvdXJjZUxpbWl0RXJyb3IsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiKTsKICAgICAgICAgYm1wX2NvbG9ybWFwPSh1bnNpZ25lZCBjaGFyICopIEFjcXVpcmVRdWFudHVtTWVtb3J5KChzaXplX3QpCkBAIC05MDcsNyArOTA3LDcgQEAKICAgICAgIHsKICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICIgIFJlYWRpbmcgcGl4ZWxzICglbHUgYnl0ZXMpIiwodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICAgICAgICIgIFJlYWRpbmcgcGl4ZWxzICglLjIwZyBieXRlcykiLChkb3VibGUpIGxlbmd0aCk7CiAgICAgICAgIGNvdW50PVJlYWRCbG9iKGltYWdlLGxlbmd0aCxwaXhlbHMpOwogICAgICAgICBpZiAoY291bnQgIT0gKHNzaXplX3QpIGxlbmd0aCkKICAgICAgICAgICBUaHJvd1JlYWRlckV4Y2VwdGlvbihDb3JydXB0SW1hZ2VFcnJvciwiSW5zdWZmaWNpZW50SW1hZ2VEYXRhSW5GaWxlIik7CkBAIC0xODMwLDcgKzE4MzAsNyBAQAogICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICB7CiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICIgICBXcml0aW5nIEJNUCB2ZXJzaW9uICVsZCBkYXRhc3RyZWFtIiwobG9uZykgdHlwZSk7CisgICAgICAgICAgIiAgIFdyaXRpbmcgQk1QIHZlcnNpb24gJS4yMGcgZGF0YXN0cmVhbSIsKGRvdWJsZSkgdHlwZSk7CiAgICAgICAgIGlmIChpbWFnZS0+c3RvcmFnZV9jbGFzcyA9PSBEaXJlY3RDbGFzcykKICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICAgICIgICBTdG9yYWdlIGNsYXNzPURpcmVjdENsYXNzIik7CkBAIC0xODM4LDcgKzE4MzgsNyBAQAogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICAgIiAgIFN0b3JhZ2UgY2xhc3M9UHNldWRvQ2xhc3MiKTsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgIEltYWdlIGRlcHRoPSVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZXB0aCk7CisgICAgICAgICAgIiAgIEltYWdlIGRlcHRoPSUuMjBnIiwoZG91YmxlKSBpbWFnZS0+ZGVwdGgpOwogICAgICAgICBpZiAoaW1hZ2UtPm1hdHRlICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICAgIiAgIE1hdHRlPVRydWUiKTsKQEAgLTE4NDYsNyArMTg0Niw3IEBACiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgICAiICAgTWF0dGU9TWFnaWNrRmFsc2UiKTsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgIEJNUCBiaXRzX3Blcl9waXhlbD0lbHUiLCh1bnNpZ25lZCBsb25nKSBibXBfaW5mby5iaXRzX3Blcl9waXhlbCk7CisgICAgICAgICAgIiAgIEJNUCBiaXRzX3Blcl9waXhlbD0lLjIwZyIsKGRvdWJsZSkgYm1wX2luZm8uYml0c19wZXJfcGl4ZWwpOwogICAgICAgICBzd2l0Y2ggKChpbnQpIGJtcF9pbmZvLmNvbXByZXNzaW9uKQogICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgQklfUkdCOgpAQCAtMjAwMSw3ICsyMDAxLDcgQEAKICAgICAgICAgKi8KICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICIgIENvbG9ybWFwOiAlbHUgZW50cmllcyIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2xvcnMpOworICAgICAgICAgICAgIiAgQ29sb3JtYXA6ICUuMjBnIGVudHJpZXMiLChkb3VibGUpIGltYWdlLT5jb2xvcnMpOwogICAgICAgICBibXBfY29sb3JtYXA9KHVuc2lnbmVkIGNoYXIgKikgQWNxdWlyZVF1YW50dW1NZW1vcnkoKHNpemVfdCkgKDFVTCA8PAogICAgICAgICAgIGJtcF9pbmZvLmJpdHNfcGVyX3BpeGVsKSw0KnNpemVvZigqYm1wX2NvbG9ybWFwKSk7CiAgICAgICAgIGlmIChibXBfY29sb3JtYXAgPT0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTCkKZGlmZiAtLWdpdCBhL2NvZGVycy9icmFpbGxlLmMgYi9jb2RlcnMvYnJhaWxsZS5jCmluZGV4IDlkYWM4ZTUuLmQ1NTA5Y2YgMTAwNjQ0Ci0tLSBhL2NvZGVycy9icmFpbGxlLmMKKysrIGIvY29kZXJzL2JyYWlsbGUuYwpAQCAtMjI4LDIxICsyMjgsMjEgQEAKICAgICAgIH0KICAgICAgIGlmIChpbWFnZS0+cGFnZS54KQogICAgICAgewotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJYOiAlbGRcbiIsKGxvbmcpIAorICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJYOiAlLjIwZ1xuIiwoZG91YmxlKSAKICAgICAgICAgICBpbWFnZS0+cGFnZS54KTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgfQogICAgICAgaWYgKGltYWdlLT5wYWdlLnkpCiAgICAgICB7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlk6ICVsZFxuIiwobG9uZykgCisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlk6ICUuMjBnXG4iLChkb3VibGUpIAogICAgICAgICAgIGltYWdlLT5wYWdlLnkpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9Ci0gICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJXaWR0aDogJWx1XG4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgKGltYWdlLT5jb2x1bW5zKyhpbWFnZS0+Y29sdW1ucyAlIDIpKSk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJXaWR0aDogJS4yMGdcbiIsCisgICAgICAgIChkb3VibGUpIChpbWFnZS0+Y29sdW1ucysoaW1hZ2UtPmNvbHVtbnMgJSAyKSkpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiSGVpZ2h0OiAlbHVcbiIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJIZWlnaHQ6ICUuMjBnXG4iLAorICAgICAgICAoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJcbiIpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvZGVycy9jaW4uYyBiL2NvZGVycy9jaW4uYwppbmRleCAyMjY1NmUzLi5lOWYwNTVhIDEwMDY0NAotLS0gYS9jb2RlcnMvY2luLmMKKysrIGIvY29kZXJzL2Npbi5jCkBAIC01ODQsMTMgKzU4NCwxMyBAQAogICBjaW4ub3JpZ2luYXRpb24ueF9vZmZzZXQ9KHNzaXplX3QpIFJlYWRCbG9iTG9uZyhpbWFnZSk7CiAgIG9mZnNldCs9NDsKICAgaWYgKChzaXplX3QpIGNpbi5vcmlnaW5hdGlvbi54X29mZnNldCAhPSB+MFVMKQotICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJjaW46b3JpZ2luYXRpb24ueF9vZmZzZXQiLCIlbGQiLAotICAgICAgKGxvbmcpIGNpbi5vcmlnaW5hdGlvbi54X29mZnNldCk7CisgICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImNpbjpvcmlnaW5hdGlvbi54X29mZnNldCIsIiUuMjBnIiwKKyAgICAgIChkb3VibGUpIGNpbi5vcmlnaW5hdGlvbi54X29mZnNldCk7CiAgIGNpbi5vcmlnaW5hdGlvbi55X29mZnNldD0oc3NpemVfdCkgUmVhZEJsb2JMb25nKGltYWdlKTsKICAgb2Zmc2V0Kz00OwogICBpZiAoKHNpemVfdCkgY2luLm9yaWdpbmF0aW9uLnlfb2Zmc2V0ICE9IH4wVUwpCi0gICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImNpbjpvcmlnaW5hdGlvbi55X29mZnNldCIsIiVsZCIsCi0gICAgICAobG9uZykgY2luLm9yaWdpbmF0aW9uLnlfb2Zmc2V0KTsKKyAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiY2luOm9yaWdpbmF0aW9uLnlfb2Zmc2V0IiwiJS4yMGciLAorICAgICAgKGRvdWJsZSkgY2luLm9yaWdpbmF0aW9uLnlfb2Zmc2V0KTsKICAgb2Zmc2V0Kz1SZWFkQmxvYihpbWFnZSxzaXplb2YoY2luLm9yaWdpbmF0aW9uLmZpbGVuYW1lKSwodW5zaWduZWQgY2hhciAqKQogICAgIGNpbi5vcmlnaW5hdGlvbi5maWxlbmFtZSk7CiAgICh2b2lkKSBTZXRJbWFnZVByb3BlcnR5KGltYWdlLCJjaW46b3JpZ2luYXRpb24uZmlsZW5hbWUiLApAQCAtNjQ3LDcgKzY0Nyw3IEBACiAgICAgICBjaW4uZmlsbS5wcmVmaXg9UmVhZEJsb2JMb25nKGltYWdlKTsKICAgICAgIG9mZnNldCs9NDsKICAgICAgIGlmIChjaW4uZmlsbS5wcmVmaXggIT0gfjBVTCkKLSAgICAgICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImNpbjpmaWxtLnByZWZpeCIsIiVsdSIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJjaW46ZmlsbS5wcmVmaXgiLCIlLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICBjaW4uZmlsbS5wcmVmaXgpOwogICAgICAgY2luLmZpbG0uY291bnQ9UmVhZEJsb2JMb25nKGltYWdlKTsKICAgICAgIG9mZnNldCs9NDsKQEAgLTY1Nyw4ICs2NTcsOCBAQAogICAgICAgY2luLmZpbG0uZnJhbWVfcG9zaXRpb249UmVhZEJsb2JMb25nKGltYWdlKTsKICAgICAgIG9mZnNldCs9NDsKICAgICAgIGlmIChjaW4uZmlsbS5mcmFtZV9wb3NpdGlvbiAhPSB+MFVMKQotICAgICAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiY2luOmZpbG0uZnJhbWVfcG9zaXRpb24iLCIlbHUiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaW4uZmlsbS5mcmFtZV9wb3NpdGlvbik7CisgICAgICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJjaW46ZmlsbS5mcmFtZV9wb3NpdGlvbiIsIiUuMjBnIiwKKyAgICAgICAgICAoZG91YmxlKSBjaW4uZmlsbS5mcmFtZV9wb3NpdGlvbik7CiAgICAgICBjaW4uZmlsbS5mcmFtZV9yYXRlPVJlYWRCbG9iRmxvYXQoaW1hZ2UpOwogICAgICAgb2Zmc2V0Kz00OwogICAgICAgaWYgKElzRmxvYXREZWZpbmVkKGNpbi5maWxtLmZyYW1lX3JhdGUpICE9IE1hZ2lja0ZhbHNlKQpkaWZmIC0tZ2l0IGEvY29kZXJzL2NpcC5jIGIvY29kZXJzL2NpcC5jCmluZGV4IGNlN2Y5NzMuLjMxOGViMzEgMTAwNjQ0Ci0tLSBhL2NvZGVycy9jaXAuYworKysgYi9jb2RlcnMvY2lwLmMKQEAgLTIxMiwxNyArMjEyLDE3IEBACiAgICAgICAgIGJhc2VuYW1lKTsKICAgICB9CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiPExvY2F0aW9uWD4lbGQ8L0xvY2F0aW9uWD5cbiIsCi0gICAgKGxvbmcpIGltYWdlLT5wYWdlLngpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAorICAgICI8TG9jYXRpb25YPiUuMjBnPC9Mb2NhdGlvblg+XG4iLChkb3VibGUpIGltYWdlLT5wYWdlLngpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIjxMb2NhdGlvblk+JWxkPC9Mb2NhdGlvblk+XG4iLAotICAgIChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAiPExvY2F0aW9uWT4lLjIwZzwvTG9jYXRpb25ZPlxuIiwoZG91YmxlKSBpbWFnZS0+cGFnZS55KTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCI8V2lkdGg+JWx1PC9XaWR0aD5cbiIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIChpbWFnZS0+Y29sdW1ucysoaW1hZ2UtPmNvbHVtbnMgJSAyKSkpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCI8V2lkdGg+JS4yMGc8L1dpZHRoPlxuIiwKKyAgICAoZG91YmxlKSAoaW1hZ2UtPmNvbHVtbnMrKGltYWdlLT5jb2x1bW5zICUgMikpKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCI8SGVpZ2h0PiVsdTwvSGVpZ2h0PlxuIiwKLSAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCI8SGVpZ2h0PiUuMjBnPC9IZWlnaHQ+XG4iLAorICAgIChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCI8RGVwdGg+MjwvRGVwdGg+XG4iKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL2RqdnUuYyBiL2NvZGVycy9kanZ1LmMKaW5kZXggMmZmMmUwNy4uYmEwZTUwOCAxMDA2NDQKLS0tIGEvY29kZXJzL2RqdnUuYworKysgYi9jb2RlcnMvZGp2dS5jCkBAIC02NTksNyArNjU5LDggQEAKICAgICAgICAgICAgICAgICAvKiBpcyB0aGlzIHVzZWZ1bD8gKi8KICAgICAgICAgfQogI2lmIERFQlVHCi0gICAgICAgIHByaW50Zigibm93IGZpbGxpbmcgJWxkIHggJWxkXG4iLCBpbWFnZS0+Y29sdW1ucyxpbWFnZS0+cm93cyk7CisgICAgICAgIHByaW50Zigibm93IGZpbGxpbmcgJS4yMGcgeCAlLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5yb3dzKTsKICNlbmRpZgogCiAKQEAgLTY4NCw3ICs2ODUsOCBAQAogCiAKICNpZiBERUJVRwotICAgICAgICBwcmludGYoIkVORDogZmluaXNoZWQgZmlsbGluZyAlbGQgeCAlbGRcbiIsIGltYWdlLT5jb2x1bW5zLGltYWdlLT5yb3dzKTsKKyAgICAgICAgcHJpbnRmKCJFTkQ6IGZpbmlzaGVkIGZpbGxpbmcgJS4yMGcgeCAlLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAjZW5kaWYKIAogICAgICAgICBTeW5jSW1hZ2UoaW1hZ2UpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL2RweC5jIGIvY29kZXJzL2RweC5jCmluZGV4IDJlODAyNjAuLmMwZjJmNWMgMTAwNjQ0Ci0tLSBhL2NvZGVycy9kcHguYworKysgYi9jb2RlcnMvZHB4LmMKQEAgLTkwMCwxOCArOTAwLDE4IEBACiAgICAgICBkcHgudGVsZXZpc2lvbi5pbnRlcmxhY2U9KHVuc2lnbmVkIGNoYXIpIFJlYWRCbG9iQnl0ZShpbWFnZSk7CiAgICAgICBvZmZzZXQrKzsKICAgICAgIGlmIChkcHgudGVsZXZpc2lvbi5pbnRlcmxhY2UgIT0gMCkKLSAgICAgICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImRweDp0ZWxldmlzaW9uLmludGVybGFjZSIsIiVsZCIsCi0gICAgICAgICAgKGxvbmcpIGRweC50ZWxldmlzaW9uLmludGVybGFjZSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJkcHg6dGVsZXZpc2lvbi5pbnRlcmxhY2UiLCIlLjIwZyIsCisgICAgICAgICAgKGRvdWJsZSkgZHB4LnRlbGV2aXNpb24uaW50ZXJsYWNlKTsKICAgICAgIGRweC50ZWxldmlzaW9uLmZpZWxkX251bWJlcj0odW5zaWduZWQgY2hhcikgUmVhZEJsb2JCeXRlKGltYWdlKTsKICAgICAgIG9mZnNldCsrOwogICAgICAgaWYgKGRweC50ZWxldmlzaW9uLmZpZWxkX251bWJlciAhPSAwKQotICAgICAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiZHB4OnRlbGV2aXNpb24uZmllbGRfbnVtYmVyIiwiJWxkIiwKLSAgICAgICAgICAobG9uZykgZHB4LnRlbGV2aXNpb24uZmllbGRfbnVtYmVyKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdEltYWdlUHJvcGVydHkoaW1hZ2UsImRweDp0ZWxldmlzaW9uLmZpZWxkX251bWJlciIsIiUuMjBnIiwKKyAgICAgICAgICAoZG91YmxlKSBkcHgudGVsZXZpc2lvbi5maWVsZF9udW1iZXIpOwogICAgICAgZHB4LnRlbGV2aXNpb24udmlkZW9fc2lnbmFsPSh1bnNpZ25lZCBjaGFyKSBSZWFkQmxvYkJ5dGUoaW1hZ2UpOwogICAgICAgb2Zmc2V0Kys7CiAgICAgICBpZiAoZHB4LnRlbGV2aXNpb24udmlkZW9fc2lnbmFsICE9IDApCi0gICAgICAgICh2b2lkKSBGb3JtYXRJbWFnZVByb3BlcnR5KGltYWdlLCJkcHg6dGVsZXZpc2lvbi52aWRlb19zaWduYWwiLCIlbGQiLAotICAgICAgICAgIChsb25nKSBkcHgudGVsZXZpc2lvbi52aWRlb19zaWduYWwpOworICAgICAgICAodm9pZCkgRm9ybWF0SW1hZ2VQcm9wZXJ0eShpbWFnZSwiZHB4OnRlbGV2aXNpb24udmlkZW9fc2lnbmFsIiwiJS4yMGciLAorICAgICAgICAgIChkb3VibGUpIGRweC50ZWxldmlzaW9uLnZpZGVvX3NpZ25hbCk7CiAgICAgICBkcHgudGVsZXZpc2lvbi5wYWRkaW5nPSh1bnNpZ25lZCBjaGFyKSBSZWFkQmxvYkJ5dGUoaW1hZ2UpOwogICAgICAgb2Zmc2V0Kys7CiAgICAgICBpZiAoZHB4LnRlbGV2aXNpb24ucGFkZGluZyAhPSAwKQpkaWZmIC0tZ2l0IGEvY29kZXJzL2h0bWwuYyBiL2NvZGVycy9odG1sLmMKaW5kZXggOWZlZTRkNS4uN2JjNmQ0MCAxMDA2NDQKLS0tIGEvY29kZXJzL2h0bWwuYworKysgYi9jb2RlcnMvaHRtbC5jCkBAIC0zNDAsOSArMzQwLDkgQEAKICAgICAgIGlmIChpbWFnZS0+ZGlyZWN0b3J5ID09IChjaGFyICopIE5VTEwpCiAgICAgICAgIHsKICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgIiVzXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiMCwwLCVsdSwlbHVcIiBhbHQ9XCJcIiAvPlxuIiwKLSAgICAgICAgICAgIGltYWdlLT5maWxlbmFtZSwodW5zaWduZWQgbG9uZykgZ2VvbWV0cnkud2lkdGgtMSwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgIGdlb21ldHJ5LmhlaWdodC0xKTsKKyAgICAgICAgICAgICIlc1wiIHNoYXBlPVwicmVjdFwiIGNvb3Jkcz1cIjAsMCwlLjIwZywlLjIwZ1wiIGFsdD1cIlwiIC8+XG4iLAorICAgICAgICAgICAgaW1hZ2UtPmZpbGVuYW1lLChkb3VibGUpIGdlb21ldHJ5LndpZHRoLTEsKGRvdWJsZSkgZ2VvbWV0cnkuaGVpZ2h0LQorICAgICAgICAgICAgMSk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICB9CiAgICAgICBlbHNlCkBAIC0zNTIsOSArMzUyLDkgQEAKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICAgIlwiIHNoYXBlPVwicmVjdFwiIGNvb3Jkcz1cIiVsZCwlbGQsJWxkLCVsZFwiIGFsdD1cIlwiIC8+XG4iLAotICAgICAgICAgICAgICAgIChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55LChsb25nKSAoZ2VvbWV0cnkueCsKLSAgICAgICAgICAgICAgICBnZW9tZXRyeS53aWR0aC0xKSwobG9uZykgKGdlb21ldHJ5LnkrZ2VvbWV0cnkuaGVpZ2h0LTEpKTsKKyAgICAgICAgICAgICAgICAiXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiJS4yMGcsJS4yMGcsJS4yMGcsJS4yMGdcIiBhbHQ9XCJcIiAvPlxuIiwKKyAgICAgICAgICAgICAgICAoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5LnksKGRvdWJsZSkgKGdlb21ldHJ5LngrCisgICAgICAgICAgICAgICAgZ2VvbWV0cnkud2lkdGgtMSksKGRvdWJsZSkgKGdlb21ldHJ5LnkrZ2VvbWV0cnkuaGVpZ2h0LTEpKTsKICAgICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgICBpZiAoKihwKzEpICE9ICdcMCcpCiAgICAgICAgICAgICAgICAgewpAQCAtNDE2LDkgKzQxNiw4IEBACiAgIGlmIChpbWFnZS0+ZGlyZWN0b3J5ID09IChjaGFyICopIE5VTEwpCiAgICAgewogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgIiVzXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiMCwwLCVsdSwlbHVcIiBhbHQ9XCJcIiAvPlxuIiwKLSAgICAgICAgaW1hZ2UtPmZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS53aWR0aC0xLCh1bnNpZ25lZCBsb25nKQotICAgICAgICBnZW9tZXRyeS5oZWlnaHQtMSk7CisgICAgICAgICIlc1wiIHNoYXBlPVwicmVjdFwiIGNvb3Jkcz1cIjAsMCwlLjIwZywlLjIwZ1wiIGFsdD1cIlwiIC8+XG4iLAorICAgICAgICBpbWFnZS0+ZmlsZW5hbWUsKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgtMSwoZG91YmxlKSBnZW9tZXRyeS5oZWlnaHQtMSk7CiAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgfQogICBlbHNlCkBAIC00MjgsOSArNDI3LDkgQEAKICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAiXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiJWxkLCVsZCwlbGQsJWxkXCIgYWx0PVwiXCIgLz5cbiIsCi0gICAgICAgICAgICAobG9uZykgZ2VvbWV0cnkueCwobG9uZykgZ2VvbWV0cnkueSxnZW9tZXRyeS54Kyhsb25nKQotICAgICAgICAgICAgZ2VvbWV0cnkud2lkdGgtMSxnZW9tZXRyeS55Kyhsb25nKSBnZW9tZXRyeS5oZWlnaHQtMSk7CisgICAgICAgICAgICAiXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiJS4yMGcsJS4yMGcsJS4yMGcsJS4yMGdcIiBhbHQ9XCJcIiAvPlxuIiwKKyAgICAgICAgICAgIChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkgZ2VvbWV0cnkueSxnZW9tZXRyeS54Kyhkb3VibGUpCisgICAgICAgICAgICBnZW9tZXRyeS53aWR0aC0xLGdlb21ldHJ5LnkrKGRvdWJsZSkgZ2VvbWV0cnkuaGVpZ2h0LTEpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICBpZiAoKihwKzEpICE9ICdcMCcpCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9jb2RlcnMvaWNvbi5jIGIvY29kZXJzL2ljb24uYwppbmRleCBjZjU1ZWFhLi5iMzdhZmE1IDEwMDY0NAotLS0gYS9jb2RlcnMvaWNvbi5jCisrKyBiL2NvZGVycy9pY29uLmMKQEAgLTMyNCwxOSArMzI0LDE5IEBACiAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgewogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgc2NlbmUgICAgPSAlbHUiLCh1bnNpZ25lZCBsb25nKSBpKTsKKyAgICAgICAgICAgICAgIiBzY2VuZSAgICA9ICUuMjBnIiwoZG91YmxlKSBpKTsKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICAgc2l6ZSAgID0gJWx1IiwodW5zaWduZWQgbG9uZykgaWNvbl9pbmZvLnNpemUpOworICAgICAgICAgICAgICAiICAgc2l6ZSAgID0gJS4yMGciLChkb3VibGUpIGljb25faW5mby5zaXplKTsKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICAgd2lkdGggID0gJWx1IiwodW5zaWduZWQgbG9uZykgaWNvbl9maWxlLmRpcmVjdG9yeVtpXS53aWR0aCk7CisgICAgICAgICAgICAgICIgICB3aWR0aCAgPSAlLjIwZyIsKGRvdWJsZSkgaWNvbl9maWxlLmRpcmVjdG9yeVtpXS53aWR0aCk7CiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgIGhlaWdodCA9ICVsdSIsKHVuc2lnbmVkIGxvbmcpIGljb25fZmlsZS5kaXJlY3RvcnlbaV0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgIiAgIGhlaWdodCA9ICUuMjBnIiwoZG91YmxlKSBpY29uX2ZpbGUuZGlyZWN0b3J5W2ldLmhlaWdodCk7CiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgIGNvbG9ycyA9ICVsdSIsKHVuc2lnbmVkIGxvbmcgKSBpY29uX2luZm8ubnVtYmVyX2NvbG9ycyk7CisgICAgICAgICAgICAgICIgICBjb2xvcnMgPSAlLjIwZyIsKGRvdWJsZSApIGljb25faW5mby5udW1iZXJfY29sb3JzKTsKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICAgcGxhbmVzID0gJWx1IiwodW5zaWduZWQgbG9uZykgaWNvbl9pbmZvLnBsYW5lcyk7CisgICAgICAgICAgICAgICIgICBwbGFuZXMgPSAlLjIwZyIsKGRvdWJsZSkgaWNvbl9pbmZvLnBsYW5lcyk7CiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgIGJwcCAgICA9ICVsdSIsKHVuc2lnbmVkIGxvbmcpIGljb25faW5mby5iaXRzX3Blcl9waXhlbCk7CisgICAgICAgICAgICAgICIgICBicHAgICAgPSAlLjIwZyIsKGRvdWJsZSkgaWNvbl9pbmZvLmJpdHNfcGVyX3BpeGVsKTsKICAgICAgICAgICB9CiAgICAgICBpZiAoKGljb25faW5mby5udW1iZXJfY29sb3JzICE9IDApIHx8IChpY29uX2luZm8uYml0c19wZXJfcGl4ZWwgPD0gMTYpKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9jb2RlcnMvaXBsLmMgYi9jb2RlcnMvaXBsLmMKaW5kZXggNzU4Mzg4YS4uMWEwYjgzNCAxMDA2NDQKLS0tIGEvY29kZXJzL2lwbC5jCisrKyBiL2NvZGVycy9pcGwuYwpAQCAtMzE0LDcgKzMxNCw4IEBACiAgICAgICBpZiAoaW1hZ2UtPnNjZW5lID49IChpbWFnZV9pbmZvLT5zY2VuZStpbWFnZV9pbmZvLT5udW1iZXJfc2NlbmVzLTEpKQogICAgICAgICBicmVhazsKIC8qCi0gICBwcmludGYoIkxlbmd0aDogJWx1LCBNZW1vcnkgc2l6ZTogJWx1XG4iLCBsZW5ndGgsKHNpemVfdCkoaW1hZ2UtPmRlcHRoKSk7CisgICBwcmludGYoIkxlbmd0aDogJS4yMGcsIE1lbW9yeSBzaXplOiAlLjIwZ1xuIiwgKGRvdWJsZSkgbGVuZ3RoLChkb3VibGUpCisgICAgIGltYWdlLT5kZXB0aCk7CiAqLwogICAgICBxdWFudHVtX2luZm89QWNxdWlyZVF1YW50dW1JbmZvKGltYWdlX2luZm8saW1hZ2UpOwogICAgICBpZiAocXVhbnR1bV9pbmZvID09IChRdWFudHVtSW5mbyAqKSBOVUxMKQpAQCAtMzI1LDggKzMyNiw4IEBACiAgICAgIHBpeGVscz1HZXRRdWFudHVtUGl4ZWxzKHF1YW50dW1faW5mbyk7IAogICAgICBpZihpbWFnZS0+Y29sdW1ucyAhPSBpcGxfaW5mby53aWR0aCl7CiAvKgotICAgICBwcmludGYoIkNvbHVtbnMgbm90IHNldCBjb3JyZWN0bHkhICBXYW50ZWQ6ICVsdSwgZ290OiAlbHVcbiIsCi0gICAgICAgaXBsX2luZm8ud2lkdGgsIGltYWdlLT5jb2x1bW5zKTsKKyAgICAgcHJpbnRmKCJDb2x1bW5zIG5vdCBzZXQgY29ycmVjdGx5ISAgV2FudGVkOiAlLjIwZywgZ290OiAlLjIwZ1xuIiwKKyAgICAgICAoZG91YmxlKSBpcGxfaW5mby53aWR0aCwgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMpOwogKi8KICAgICAgfQogCmRpZmYgLS1naXQgYS9jb2RlcnMvanAyLmMgYi9jb2RlcnMvanAyLmMKaW5kZXggYTBhZDI1ZS4uNWUzYWZhMyAxMDA2NDQKLS0tIGEvY29kZXJzL2pwMi5jCisrKyBiL2NvZGVycy9qcDIuYwpAQCAtNjE0LDcgKzYxNCw3IEBACiAgICAgICAgICAgYmxvYj0oamFzX3N0cmVhbV9tZW1vYmpfdCAqKSBpY2Nfc3RyZWFtLT5vYmpfOwogICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIlByb2ZpbGU6IElDQywgJWx1IGJ5dGVzIiwodW5zaWduZWQgbG9uZykgYmxvYi0+bGVuXyk7CisgICAgICAgICAgICAgICJQcm9maWxlOiBJQ0MsICUuMjBnIGJ5dGVzIiwoZG91YmxlKSBibG9iLT5sZW5fKTsKICAgICAgICAgICBwcm9maWxlPUFjcXVpcmVTdHJpbmdJbmZvKGJsb2ItPmxlbl8pOwogICAgICAgICAgIFNldFN0cmluZ0luZm9EYXR1bShwcm9maWxlLGJsb2ItPmJ1Zl8pOwogICAgICAgICAgIGljY19wcm9maWxlPShTdHJpbmdJbmZvICopIEdldEltYWdlUHJvZmlsZShpbWFnZSwiaWNjIik7CmRpZmYgLS1naXQgYS9jb2RlcnMvanBlZy5jIGIvY29kZXJzL2pwZWcuYwppbmRleCA4YzYyMzI2Li5iMmQ3NjhhIDEwMDY0NAotLS0gYS9jb2RlcnMvanBlZy5jCisrKyBiL2NvZGVycy9qcGVnLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogICAgIH0KICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICJQcm9maWxlOiBJQ0MsICVsdSBieXRlcyIsKHVuc2lnbmVkIGxvbmcpIGxlbmd0aCk7CisgICAgICAiUHJvZmlsZTogSUNDLCAlLjIwZyBieXRlcyIsKGRvdWJsZSkgbGVuZ3RoKTsKICAgcmV0dXJuKE1hZ2lja1RydWUpOwogfQogCkBAIC01MjgsNyArNTI4LDcgQEAKICAgICB9CiAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAiUHJvZmlsZTogaXB0YywgJWx1IGJ5dGVzIiwodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICJQcm9maWxlOiBpcHRjLCAlLjIwZyBieXRlcyIsKGRvdWJsZSkgbGVuZ3RoKTsKICAgcmV0dXJuKE1hZ2lja1RydWUpOwogfQogCkBAIC02MTIsNyArNjEyLDcgQEAKICAgICAgIGltYWdlLT5maWxlbmFtZSk7CiAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAiUHJvZmlsZTogJXMsICVsdSBieXRlcyIsbmFtZSwodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICJQcm9maWxlOiAlcywgJS4yMGcgYnl0ZXMiLG5hbWUsKGRvdWJsZSkgbGVuZ3RoKTsKICAgcmV0dXJuKE1hZ2lja1RydWUpOwogfQogCkBAIC03MzcsNyArNzM3LDcgQEAKICAgICAgICAgICAgICBpbWFnZS0+cXVhbGl0eT0oc2l6ZV90KSBpKzE7CiAgICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAiUXVhbGl0eTogJWxkICglcykiLChsb25nKSBpKzEsKHF2YWx1ZSA8PSBoYXNoW2ldKSAmJgorICAgICAgICAgICAgICAgIlF1YWxpdHk6ICUuMjBnICglcykiLChkb3VibGUpIGkrMSwocXZhbHVlIDw9IGhhc2hbaV0pICYmCiAgICAgICAgICAgICAgICAoc3VtIDw9IHN1bXNbaV0pID8gImV4YWN0IiA6ICJhcHByb3hpbWF0ZSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KQEAgLTc4Niw3ICs3ODYsNyBAQAogICAgICAgICAgICAgICAgaW1hZ2UtPnF1YWxpdHk9KHNpemVfdCkgaSsxOwogICAgICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgIlF1YWxpdHk6ICVsZCAoJXMpIiwobG9uZykgaSsxLChxdmFsdWUgPD0gaGFzaFtpXSkgJiYKKyAgICAgICAgICAgICAgICAgIlF1YWxpdHk6ICUuMjBnICglcykiLChkb3VibGUpIGkrMSwocXZhbHVlIDw9IGhhc2hbaV0pICYmCiAgICAgICAgICAgICAgICAgIChzdW0gPD0gc3Vtc1tpXSkgPyAiZXhhY3QiIDogImFwcHJveGltYXRlIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KQEAgLTEwMTQsOCArMTAxNCw4IEBACiAgICAgICBqcGVnX2luZm8uc2NhbGVfZGVub209KHVuc2lnbmVkIGludCkgc2NhbGVfZmFjdG9yOwogICAgICAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCZqcGVnX2luZm8pOwogICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKLSAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIlNjYWxlIGZhY3RvcjogJWxkIiwKLSAgICAgICAgICAobG9uZykgc2NhbGVfZmFjdG9yKTsKKyAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCisgICAgICAgICAgIlNjYWxlIGZhY3RvcjogJS4yMGciLChkb3VibGUpIHNjYWxlX2ZhY3Rvcik7CiAgICAgfQogICBwcmVjaXNpb249KHNpemVfdCkganBlZ19pbmZvLmRhdGFfcHJlY2lzaW9uOwogI2lmIChKUEVHX0xJQl9WRVJTSU9OID49IDYxKSAmJiBkZWZpbmVkKERfUFJPR1JFU1NJVkVfU1VQUE9SVEVEKQpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKICAgICB9CiAgIEpQRUdTZXRJbWFnZVF1YWxpdHkoJmpwZWdfaW5mbyxpbWFnZSk7CiAgIEpQRUdTZXRJbWFnZVNhbXBsaW5nRmFjdG9yKCZqcGVnX2luZm8saW1hZ2UpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZhbHVlLE1heFRleHRFeHRlbnQsIiVsZCIsKGxvbmcpCisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCiAgICAganBlZ19pbmZvLm91dF9jb2xvcl9zcGFjZSk7CiAgICh2b2lkKSBTZXRJbWFnZVByb3BlcnR5KGltYWdlLCJqcGVnOmNvbG9yc3BhY2UiLHZhbHVlKTsKICAgaWYgKGltYWdlX2luZm8tPnBpbmcgIT0gTWFnaWNrRmFsc2UpCkBAIC0xNTkwLDggKzE1OTAsOCBAQAogICAgICAgICB9CiAgICAgICAgIHhtcF9wcm9maWxlPURlc3Ryb3lTdHJpbmdJbmZvKHhtcF9wcm9maWxlKTsKICAgICAgIH0KLSAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJXMgcHJvZmlsZTogJWx1IGJ5dGVzIiwKLSAgICAgIG5hbWUsKHVuc2lnbmVkIGxvbmcpIEdldFN0cmluZ0luZm9MZW5ndGgocHJvZmlsZSkpOworICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAorICAgICAgIiVzIHByb2ZpbGU6ICUuMjBnIGJ5dGVzIixuYW1lLChkb3VibGUpIEdldFN0cmluZ0luZm9MZW5ndGgocHJvZmlsZSkpOwogICAgIG5hbWU9R2V0TmV4dEltYWdlUHJvZmlsZShpbWFnZSk7CiAgIH0KICAgY3VzdG9tX3Byb2ZpbGU9RGVzdHJveVN0cmluZ0luZm8oY3VzdG9tX3Byb2ZpbGUpOwpAQCAtMTc4MCw4ICsxNzgwLDggQEAKICAganBlZ19pbmZvLmRlbnNpdHlfdW5pdD0oVUlOVDgpIDE7CiAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAiSW1hZ2UgcmVzb2x1dGlvbjogJWxkLCVsZCIsKGxvbmcpIGZsb29yKGltYWdlLT54X3Jlc29sdXRpb24rMC41KSwKLSAgICAgIChsb25nKSBmbG9vcihpbWFnZS0+eV9yZXNvbHV0aW9uKzAuNSkpOworICAgICAgIkltYWdlIHJlc29sdXRpb246ICUuMjBnLCUuMjBnIixmbG9vcihpbWFnZS0+eF9yZXNvbHV0aW9uKzAuNSksCisgICAgICBmbG9vcihpbWFnZS0+eV9yZXNvbHV0aW9uKzAuNSkpOwogICBpZiAoKGltYWdlLT54X3Jlc29sdXRpb24gIT0gMC4wKSAmJiAoaW1hZ2UtPnlfcmVzb2x1dGlvbiAhPSAwLjApKQogICAgIHsKICAgICAgIC8qCkBAIC0xOTE5LDggKzE5MTksOCBAQAogICAgICAgZWxzZQogICAgICAgICBqcGVnX3NldF9xdWFsaXR5KCZqcGVnX2luZm8sKGludCkgaW1hZ2UtPnF1YWxpdHksTWFnaWNrVHJ1ZSk7CiAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQotICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiUXVhbGl0eTogJWx1IiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnF1YWxpdHkpOworICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiUXVhbGl0eTogJS4yMGciLAorICAgICAgICAgIChkb3VibGUpIGltYWdlLT5xdWFsaXR5KTsKICAgICB9CiAgIGVsc2UKICAgICB7CkBAIC0yMDI1LDExICsyMDI1LDExIEBACiAgICAgICBlbHNlCiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICJTdG9yYWdlIGNsYXNzOiBEaXJlY3RDbGFzcyIpOwotICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIkRlcHRoOiAlbHUiLAotICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlcHRoKTsKKyAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCJEZXB0aDogJS4yMGciLAorICAgICAgICAoZG91YmxlKSBpbWFnZS0+ZGVwdGgpOwogICAgICAgaWYgKGltYWdlLT5jb2xvcnMgIT0gMCkKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIk51bWJlciBvZiBjb2xvcnM6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2xvcnMpOworICAgICAgICAgICJOdW1iZXIgb2YgY29sb3JzOiAlLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPmNvbG9ycyk7CiAgICAgICBlbHNlCiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICJOdW1iZXIgb2YgY29sb3JzOiB1bnNwZWNpZmllZCIpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL21hdC5jIGIvY29kZXJzL21hdC5jCmluZGV4IGVlZDU5MWEuLjYzYWIyOTQgMTAwNjQ0Ci0tLSBhL2NvZGVycy9tYXQuYworKysgYi9jb2RlcnMvbWF0LmMKQEAgLTc0OSw3ICs3NDksNyBAQAogICAgIENlbGxUeXBlID0gUmVhZEJsb2JYWFhMb25nKGltYWdlMik7ICAgIC8qIEFkZGl0aW9uYWwgb2JqZWN0IHR5cGUgKi8KICAgICBpZiAobG9nZ2luZykKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiTUFUTEFCX0hEUi5DZWxsVHlwZTogJWxkIiwobG9uZykgQ2VsbFR5cGUpOworICAgICAgICAiTUFUTEFCX0hEUi5DZWxsVHlwZTogJS4yMGciLChkb3VibGUpIENlbGxUeXBlKTsKICAgCiAgICAgKHZvaWQpIFJlYWRCbG9iKGltYWdlMiwgNCwgKHVuc2lnbmVkIGNoYXIgKikgJnNpemUpOyAgICAgLyogZGF0YSBzaXplICovCiAKZGlmZiAtLWdpdCBhL2NvZGVycy9taWZmLmMgYi9jb2RlcnMvbWlmZi5jCmluZGV4IDI3ZDc4YjEuLjUzZTc0ZDkgMTAwNjQ0Ci0tLSBhL2NvZGVycy9taWZmLmMKKysrIGIvY29kZXJzL21pZmYuYwpAQCAtMTgxOCwxMyArMTgxOCwxMyBAQAogICAgICovCiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiaWQ9SW1hZ2VNYWdpY2sgIHZlcnNpb249MS4wXG4iKTsKICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgImNsYXNzPSVzICBjb2xvcnM9JWx1ICBtYXR0ZT0lc1xuIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKAotICAgICAgTWFnaWNrQ2xhc3NPcHRpb25zLGltYWdlLT5zdG9yYWdlX2NsYXNzKSwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbG9ycywKKyAgICAgICJjbGFzcz0lcyAgY29sb3JzPSUuMjBnICBtYXR0ZT0lc1xuIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKAorICAgICAgTWFnaWNrQ2xhc3NPcHRpb25zLGltYWdlLT5zdG9yYWdlX2NsYXNzKSwoZG91YmxlKSBpbWFnZS0+Y29sb3JzLAogICAgICAgTWFnaWNrT3B0aW9uVG9NbmVtb25pYyhNYWdpY2tCb29sZWFuT3B0aW9ucywoc3NpemVfdCkgaW1hZ2UtPm1hdHRlKSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsImNvbHVtbnM9JWx1ICByb3dzPSVsdSAgIgotICAgICAgImRlcHRoPSVsdVxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZXB0aCk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiY29sdW1ucz0lLjIwZyAgcm93cz0lLjIwZyAgIgorICAgICAgImRlcHRoPSUuMjBnXG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzLChkb3VibGUpCisgICAgICBpbWFnZS0+ZGVwdGgpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBpZiAoaW1hZ2UtPnR5cGUgIT0gVW5kZWZpbmVkVHlwZSkKICAgICAgIHsKQEAgLTE4NDEsOCArMTg0MSw4IEBACiAgICAgaWYgKGNvbXByZXNzaW9uICE9IFVuZGVmaW5lZENvbXByZXNzaW9uKQogICAgICAgewogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJjb21wcmVzc2lvbj0lcyAgIgotICAgICAgICAgICJxdWFsaXR5PSVsdVxuIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKE1hZ2lja0NvbXByZXNzT3B0aW9ucywKLSAgICAgICAgICBjb21wcmVzc2lvbiksKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5xdWFsaXR5KTsKKyAgICAgICAgICAicXVhbGl0eT0lLjIwZ1xuIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKE1hZ2lja0NvbXByZXNzT3B0aW9ucywKKyAgICAgICAgICBjb21wcmVzc2lvbiksKGRvdWJsZSkgaW1hZ2UtPnF1YWxpdHkpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9CiAgICAgaWYgKGltYWdlLT51bml0cyAhPSBVbmRlZmluZWRSZXNvbHV0aW9uKQpAQCAtMTg1OSw5ICsxODU5LDkgQEAKICAgICAgIH0KICAgICBpZiAoKGltYWdlLT5wYWdlLndpZHRoICE9IDApIHx8IChpbWFnZS0+cGFnZS5oZWlnaHQgIT0gMCkpCiAgICAgICB7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsInBhZ2U9JWx1eCVsdSUrbGQlK2xkXG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2UuaGVpZ2h0LAotICAgICAgICAgIChsb25nKSBpbWFnZS0+cGFnZS54LChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAicGFnZT0lLjIwZ3glLjIwZyUrLjIwZyUrLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+cGFnZS53aWR0aCwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKSBpbWFnZS0+cGFnZS54LChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9CiAgICAgZWxzZQpAQCAtMTg4MSw0MSArMTg4MSw0MCBAQAogICAgICAgICAoR2V0UHJldmlvdXNJbWFnZUluTGlzdChpbWFnZSkgIT0gKEltYWdlICopIE5VTEwpKQogICAgICAgewogICAgICAgICBpZiAoaW1hZ2UtPnNjZW5lID09IDApCi0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiaXRlcmF0aW9ucz0lbHUgICIKLSAgICAgICAgICAgICJkZWxheT0lbHUgIHRpY2tzLXBlci1zZWNvbmQ9JWx1XG4iLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgIGltYWdlLT5pdGVyYXRpb25zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVsYXksKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIml0ZXJhdGlvbnM9JS4yMGcgICIKKyAgICAgICAgICAgICJkZWxheT0lLjIwZyAgdGlja3MtcGVyLXNlY29uZD0lLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+aXRlcmF0aW9ucywKKyAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5kZWxheSwoZG91YmxlKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJzY2VuZT0lbHUgICIKLSAgICAgICAgICAgICJpdGVyYXRpb25zPSVsdSAgZGVsYXk9JWx1ICB0aWNrcy1wZXItc2Vjb25kPSVsdVxuIiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgIGltYWdlLT5zY2VuZSwodW5zaWduZWQgbG9uZykgaW1hZ2UtPml0ZXJhdGlvbnMsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICBpbWFnZS0+ZGVsYXksKHVuc2lnbmVkIGxvbmcpIGltYWdlLT50aWNrc19wZXJfc2Vjb25kKTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJzY2VuZT0lLjIwZyAgIgorICAgICAgICAgICAgIml0ZXJhdGlvbnM9JS4yMGcgIGRlbGF5PSUuMjBnICB0aWNrcy1wZXItc2Vjb25kPSUuMjBnXG4iLChkb3VibGUpCisgICAgICAgICAgICBpbWFnZS0+c2NlbmUsKGRvdWJsZSkgaW1hZ2UtPml0ZXJhdGlvbnMsKGRvdWJsZSkgaW1hZ2UtPmRlbGF5LAorICAgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9CiAgICAgZWxzZQogICAgICAgewogICAgICAgICBpZiAoaW1hZ2UtPnNjZW5lICE9IDApCiAgICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwic2NlbmU9JWx1XG4iLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnNjZW5lKTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsInNjZW5lPSUuMjBnXG4iLAorICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+c2NlbmUpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIH0KICAgICAgICAgaWYgKGltYWdlLT5pdGVyYXRpb25zICE9IDApCiAgICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiaXRlcmF0aW9ucz0lbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+aXRlcmF0aW9ucyk7CisgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJpdGVyYXRpb25zPSUuMjBnXG4iLAorICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+aXRlcmF0aW9ucyk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICBpZiAoaW1hZ2UtPmRlbGF5ICE9IDApCiAgICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiZGVsYXk9JWx1XG4iLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlbGF5KTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsImRlbGF5PSUuMjBnXG4iLAorICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+ZGVsYXkpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIH0KICAgICAgICAgaWYgKGltYWdlLT50aWNrc19wZXJfc2Vjb25kICE9IFVuZGVmaW5lZFRpY2tzUGVyU2Vjb25kKQogICAgICAgICAgIHsKICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICJ0aWNrcy1wZXItc2Vjb25kPSVsdVxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQpOworICAgICAgICAgICAgICAidGlja3MtcGVyLXNlY29uZD0lLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgfQpAQCAtMTk4Niw4ICsxOTg1LDkgQEAKICAgICAgICAgICBwcm9maWxlPUdldEltYWdlUHJvZmlsZShpbWFnZSxuYW1lKTsKICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAoU3RyaW5nSW5mbyAqKSBOVUxMKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJwcm9maWxlOiVzPSVsdVxuIiwKLSAgICAgICAgICAgICAgICBuYW1lLCh1bnNpZ25lZCBsb25nKSBHZXRTdHJpbmdJbmZvTGVuZ3RoKHByb2ZpbGUpKTsKKyAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICAgICAicHJvZmlsZTolcz0lLjIwZ1xuIixuYW1lLChkb3VibGUpCisgICAgICAgICAgICAgICAgR2V0U3RyaW5nSW5mb0xlbmd0aChwcm9maWxlKSk7CiAgICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICBuYW1lPUdldE5leHRJbWFnZVByb2ZpbGUoaW1hZ2UpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL21wYy5jIGIvY29kZXJzL21wYy5jCmluZGV4IDBkNTkyNzguLjJiNTM3NmMgMTAwNjQ0Ci0tLSBhL2NvZGVycy9tcGMuYworKysgYi9jb2RlcnMvbXBjLmMKQEAgLTEwODAsMTMgKzEwODAsMTMgQEAKICAgICAgIE1BR0lDS0NPUkVfUVVBTlRVTV9ERVBUSCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAiY2xhc3M9JXMgIGNvbG9ycz0lbHUgIG1hdHRlPSVzXG4iLE1hZ2lja09wdGlvblRvTW5lbW9uaWMoCi0gICAgICBNYWdpY2tDbGFzc09wdGlvbnMsaW1hZ2UtPnN0b3JhZ2VfY2xhc3MpLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sb3JzLAorICAgICAgImNsYXNzPSVzICBjb2xvcnM9JS4yMGcgIG1hdHRlPSVzXG4iLE1hZ2lja09wdGlvblRvTW5lbW9uaWMoCisgICAgICBNYWdpY2tDbGFzc09wdGlvbnMsaW1hZ2UtPnN0b3JhZ2VfY2xhc3MpLChkb3VibGUpIGltYWdlLT5jb2xvcnMsCiAgICAgICBNYWdpY2tPcHRpb25Ub01uZW1vbmljKE1hZ2lja0Jvb2xlYW5PcHRpb25zLChzc2l6ZV90KSBpbWFnZS0+bWF0dGUpKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICJjb2x1bW5zPSVsdSAgcm93cz0lbHUgIGRlcHRoPSVsdVxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsCi0gICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZXB0aCk7CisgICAgICAiY29sdW1ucz0lLjIwZyAgcm93cz0lLjIwZyBkZXB0aD0lLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywKKyAgICAgIChkb3VibGUpIGltYWdlLT5yb3dzLChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIGlmIChpbWFnZS0+dHlwZSAhPSBVbmRlZmluZWRUeXBlKQogICAgICAgewpAQCAtMTEwOSw5ICsxMTA5LDggQEAKICAgICBpZiAoaW1hZ2UtPmNvbXByZXNzaW9uICE9IFVuZGVmaW5lZENvbXByZXNzaW9uKQogICAgICAgewogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICJjb21wcmVzc2lvbj0lcyAgcXVhbGl0eT0lbHVcbiIsTWFnaWNrT3B0aW9uVG9NbmVtb25pYygKLSAgICAgICAgICBNYWdpY2tDb21wcmVzc09wdGlvbnMsaW1hZ2UtPmNvbXByZXNzaW9uKSwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICBpbWFnZS0+cXVhbGl0eSk7CisgICAgICAgICAgImNvbXByZXNzaW9uPSVzICBxdWFsaXR5PSUuMjBnXG4iLE1hZ2lja09wdGlvblRvTW5lbW9uaWMoCisgICAgICAgICAgTWFnaWNrQ29tcHJlc3NPcHRpb25zLGltYWdlLT5jb21wcmVzc2lvbiksKGRvdWJsZSkgaW1hZ2UtPnF1YWxpdHkpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9CiAgICAgaWYgKGltYWdlLT51bml0cyAhPSBVbmRlZmluZWRSZXNvbHV0aW9uKQpAQCAtMTEyOCw5ICsxMTI3LDkgQEAKICAgICAgIH0KICAgICBpZiAoKGltYWdlLT5wYWdlLndpZHRoICE9IDApIHx8IChpbWFnZS0+cGFnZS5oZWlnaHQgIT0gMCkpCiAgICAgICB7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsInBhZ2U9JWx1eCVsdSUrbGQlK2xkXG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2UuaGVpZ2h0LAotICAgICAgICAgIChsb25nKSBpbWFnZS0+cGFnZS54LChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAicGFnZT0lLjIwZ3glLjIwZyUrLjIwZyUrLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+cGFnZS53aWR0aCwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKSBpbWFnZS0+cGFnZS54LChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9CiAgICAgZWxzZQpAQCAtMTE1MSw0MCArMTE1MCw0MCBAQAogICAgICAgewogICAgICAgICBpZiAoaW1hZ2UtPnNjZW5lID09IDApCiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICJpdGVyYXRpb25zPSVsdSAgZGVsYXk9JWx1ICB0aWNrcy1wZXItc2Vjb25kPSVsdVxuIiwobG9uZykKLSAgICAgICAgICAgIGltYWdlLT5pdGVyYXRpb25zLChsb25nKSBpbWFnZS0+ZGVsYXksKGxvbmcpCisgICAgICAgICAgICAiaXRlcmF0aW9ucz0lLjIwZyAgZGVsYXk9JS4yMGcgIHRpY2tzLXBlci1zZWNvbmQ9JS4yMGdcbiIsKGRvdWJsZSkKKyAgICAgICAgICAgIGltYWdlLT5pdGVyYXRpb25zLChkb3VibGUpIGltYWdlLT5kZWxheSwoZG91YmxlKQogICAgICAgICAgICAgaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICJzY2VuZT0lbHUgIGl0ZXJhdGlvbnM9JWx1ICBkZWxheT0lbHUgIHRpY2tzLXBlci1zZWNvbmQ9JWx1XG4iLAotICAgICAgICAgICAgKGxvbmcpIGltYWdlLT5zY2VuZSwobG9uZykgaW1hZ2UtPml0ZXJhdGlvbnMsKGxvbmcpIGltYWdlLT5kZWxheSwKLSAgICAgICAgICAgIChsb25nKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CisgICAgICAgICAgICAic2NlbmU9JS4yMGcgIGl0ZXJhdGlvbnM9JS4yMGcgIGRlbGF5PSUuMjBnICB0aWNrcy1wZXItc2Vjb25kPSUuMjBnXG4iLAorICAgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnNjZW5lLChkb3VibGUpIGltYWdlLT5pdGVyYXRpb25zLChkb3VibGUpCisgICAgICAgICAgICBpbWFnZS0+ZGVsYXksKGRvdWJsZSkgaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9CiAgICAgZWxzZQogICAgICAgewogICAgICAgICBpZiAoaW1hZ2UtPnNjZW5lICE9IDApCiAgICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwic2NlbmU9JWx1XG4iLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnNjZW5lKTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsInNjZW5lPSUuMjBnXG4iLAorICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+c2NlbmUpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIH0KICAgICAgICAgaWYgKGltYWdlLT5pdGVyYXRpb25zICE9IDApCiAgICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiaXRlcmF0aW9ucz0lbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+aXRlcmF0aW9ucyk7CisgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJpdGVyYXRpb25zPSUuMjBnXG4iLAorICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+aXRlcmF0aW9ucyk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICBpZiAoaW1hZ2UtPmRlbGF5ICE9IDApCiAgICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiZGVsYXk9JWx1XG4iLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlbGF5KTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsImRlbGF5PSUuMjBnXG4iLAorICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+ZGVsYXkpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIH0KICAgICAgICAgaWYgKGltYWdlLT50aWNrc19wZXJfc2Vjb25kICE9IFVuZGVmaW5lZFRpY2tzUGVyU2Vjb25kKQogICAgICAgICAgIHsKICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICJ0aWNrcy1wZXItc2Vjb25kPSVsdVxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnRpY2tzX3Blcl9zZWNvbmQpOworICAgICAgICAgICAgICAidGlja3MtcGVyLXNlY29uZD0lLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgfQpAQCAtMTI1NSw4ICsxMjU0LDkgQEAKICAgICAgICAgICBwcm9maWxlPUdldEltYWdlUHJvZmlsZShpbWFnZSxuYW1lKTsKICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAoU3RyaW5nSW5mbyAqKSBOVUxMKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJwcm9maWxlOiVzPSVsdVxuIiwKLSAgICAgICAgICAgICAgICBuYW1lLCh1bnNpZ25lZCBsb25nKSBHZXRTdHJpbmdJbmZvTGVuZ3RoKHByb2ZpbGUpKTsKKyAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICAgICAicHJvZmlsZTolcz0lLjIwZ1xuIixuYW1lLChkb3VibGUpCisgICAgICAgICAgICAgICAgR2V0U3RyaW5nSW5mb0xlbmd0aChwcm9maWxlKSk7CiAgICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICBuYW1lPUdldE5leHRJbWFnZVByb2ZpbGUoaW1hZ2UpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL21wZWcuYyBiL2NvZGVycy9tcGVnLmMKaW5kZXggZGZmZTYwNi4uNGY0ODllMCAxMDA2NDQKLS0tIGEvY29kZXJzL21wZWcuYworKysgYi9jb2RlcnMvbXBlZy5jCkBAIC01MzksMTIgKzUzOSwxMiBAQAogICAgICAgICAgIEltYWdlCiAgICAgICAgICAgICAqZnJhbWU7CiAKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHAtPmZpbGVuYW1lLE1heFRleHRFeHRlbnQsIiVzJWx1LiVzIiwKLSAgICAgICAgICAgIGJhc2VuYW1lLCh1bnNpZ25lZCBsb25nKSBwLT5zY2VuZSxXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQpOwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZmlsZW5hbWUsTWF4VGV4dEV4dGVudCwiJXMlbHUuJXMiLAotICAgICAgICAgICAgYmFzZW5hbWUsKHVuc2lnbmVkIGxvbmcpIHAtPnNjZW5lLFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwLT5maWxlbmFtZSxNYXhUZXh0RXh0ZW50LCIlcyUuMjBnLiVzIiwKKyAgICAgICAgICAgIGJhc2VuYW1lLChkb3VibGUpIHAtPnNjZW5lLFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmaWxlbmFtZSxNYXhUZXh0RXh0ZW50LCIlcyUuMjBnLiVzIiwKKyAgICAgICAgICAgIGJhc2VuYW1lLChkb3VibGUpIHAtPnNjZW5lLFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCk7CiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwcmV2aW91c19pbWFnZSxNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgIiVzJWx1LiVzIixiYXNlbmFtZSwodW5zaWduZWQgbG9uZykgcC0+c2NlbmUsCisgICAgICAgICAgICAiJXMlLjIwZy4lcyIsYmFzZW5hbWUsKGRvdWJsZSkgcC0+c2NlbmUsCiAgICAgICAgICAgICBXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQpOwogICAgICAgICAgIGZyYW1lPUNsb25lSW1hZ2UocCwwLDAsTWFnaWNrVHJ1ZSwmcC0+ZXhjZXB0aW9uKTsKICAgICAgICAgICBpZiAoZnJhbWUgPT0gKEltYWdlICopIE5VTEwpCkBAIC01NjAsOCArNTYwLDggQEAKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmaWxlbmFtZSxNYXhUZXh0RXh0ZW50LCIlcyVsdS4lcyIsCi0gICAgICAgICAgICBiYXNlbmFtZSwodW5zaWduZWQgbG9uZykgcC0+c2NlbmUsV3JpdGVNUEVHSW50ZXJtZWRpYXRlRm9ybWF0KTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZpbGVuYW1lLE1heFRleHRFeHRlbnQsIiVzJS4yMGcuJXMiLAorICAgICAgICAgICAgYmFzZW5hbWUsKGRvdWJsZSkgcC0+c2NlbmUsV3JpdGVNUEVHSW50ZXJtZWRpYXRlRm9ybWF0KTsKICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkKICAgICAgICAgICAgIHN0YXR1cz1CbG9iVG9GaWxlKGZpbGVuYW1lLGJsb2IsbGVuZ3RoLCZpbWFnZS0+ZXhjZXB0aW9uKTsKICAgICAgICAgICBicmVhazsKQEAgLTU3MSwxNCArNTcxLDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICBpZiAoc3RhdHVzICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIlbHUuIFdyb3RlICVzIGZpbGUgZm9yIHNjZW5lICVsdToiLCh1bnNpZ25lZCBsb25nKSBpLAotICAgICAgICAgICAgICBXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQsKHVuc2lnbmVkIGxvbmcpIHAtPnNjZW5lKTsKKyAgICAgICAgICAgICAgIiUuMjBnLiBXcm90ZSAlcyBmaWxlIGZvciBzY2VuZSAlLjIwZzoiLChkb3VibGUpIGksCisgICAgICAgICAgICAgIFdyaXRlTVBFR0ludGVybWVkaWF0ZUZvcm1hdCwoZG91YmxlKSBwLT5zY2VuZSk7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIlbHUuIEZhaWxlZCB0byB3cml0ZSAlcyBmaWxlIGZvciBzY2VuZSAlbHU6IiwodW5zaWduZWQgbG9uZykgaSwKLSAgICAgICAgICAgICAgV3JpdGVNUEVHSW50ZXJtZWRpYXRlRm9ybWF0LCh1bnNpZ25lZCBsb25nKSBwLT5zY2VuZSk7Ci0gICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIiwKLSAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgIiUuMjBnLiBGYWlsZWQgdG8gd3JpdGUgJXMgZmlsZSBmb3Igc2NlbmUgJS4yMGc6IiwoZG91YmxlKSBpLAorICAgICAgICAgICAgICBXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQsKGRvdWJsZSkgcC0+c2NlbmUpOworICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsZmlsZW5hbWUpOwogICAgICAgICB9CiAgICAgfQogICAgIHAtPnNjZW5lPXNjZW5lOwpAQCAtNjEyLDggKzYxMSw4IEBACiAgICAgZGVsYXk9MTAwLjAqcC0+ZGVsYXkvTWFnaWNrTWF4KDEuMCpwLT50aWNrc19wZXJfc2Vjb25kLDEuMCk7CiAgICAgZm9yIChpPTA7IGkgPCAoc3NpemVfdCkgTWFnaWNrTWF4KCgxLjAqZGVsYXkrMS4wKS8zLjAsMS4wKTsgaSsrKQogICAgIHsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocC0+ZmlsZW5hbWUsTWF4VGV4dEV4dGVudCwiJXMlbHUuJXMiLAotICAgICAgICBiYXNlbmFtZSwodW5zaWduZWQgbG9uZykgY291bnQrKyxXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQpOworICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwLT5maWxlbmFtZSxNYXhUZXh0RXh0ZW50LCIlcyUuMjBnLiVzIiwKKyAgICAgICAgYmFzZW5hbWUsKGRvdWJsZSkgY291bnQrKyxXcml0ZU1QRUdJbnRlcm1lZGlhdGVGb3JtYXQpOwogICAgICAgKHZvaWQpIFJlbGlucXVpc2hVbmlxdWVGaWxlUmVzb3VyY2UocC0+ZmlsZW5hbWUpOwogICAgIH0KICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhwLT5maWxlbmFtZSxpbWFnZV9pbmZvLT5maWxlbmFtZSxNYXhUZXh0RXh0ZW50KTsKZGlmZiAtLWdpdCBhL2NvZGVycy9tc2wuYyBiL2NvZGVycy9tc2wuYwppbmRleCAwNTNkOWU1Li42OTU0MmM2IDEwMDY0NAotLS0gYS9jb2RlcnMvbXNsLmMKKysrIGIvY29kZXJzL21zbC5jCkBAIC0xMDYxLDkgKzEwNjEsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LndpZHRoLCh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS5oZWlnaHQsCi0gICAgICAgICAgICAobG9uZykgZ2VvbWV0cnkueCwobG9uZykgZ2VvbWV0cnkueSk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGclKy4yMGciLChkb3VibGUpIGdlb21ldHJ5LndpZHRoLChkb3VibGUpCisgICAgICAgICAgICBnZW9tZXRyeS5oZWlnaHQsKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSBnZW9tZXRyeS55KTsKICAgICAgICAgICBDbG9uZVN0cmluZygmZHJhd19pbmZvLT5nZW9tZXRyeSx0ZXh0KTsKICAgICAgICAgICBkcmF3X2luZm8tPmFmZmluZS5zeD1jdXJyZW50LnN4KmFmZmluZS5zeCtjdXJyZW50LnJ5KmFmZmluZS5yeDsKICAgICAgICAgICBkcmF3X2luZm8tPmFmZmluZS5yeD1jdXJyZW50LnJ4KmFmZmluZS5zeCtjdXJyZW50LnN5KmFmZmluZS5yeDsKQEAgLTIwNDAsOCArMjA0MCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgaW1hZ2U9bXNsX2luZm8tPmltYWdlW25dOwogICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY29tcG9zaXRlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAiJWx1eCVsdSUrbGQlK2xkIiwodW5zaWduZWQgbG9uZykgY29tcG9zaXRlX2ltYWdlLT5jb2x1bW5zLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNvbXBvc2l0ZV9pbWFnZS0+cm93cywobG9uZykgZ2VvbWV0cnkueCwobG9uZykKKyAgICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZyUrLjIwZyIsKGRvdWJsZSkgY29tcG9zaXRlX2ltYWdlLT5jb2x1bW5zLAorICAgICAgICAgICAgKGRvdWJsZSkgY29tcG9zaXRlX2ltYWdlLT5yb3dzLChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkKICAgICAgICAgICAgIGdlb21ldHJ5LnkpOwogICAgICAgICAgIGZsYWdzPVBhcnNlR3Jhdml0eUdlb21ldHJ5KGltYWdlLGNvbXBvc2l0ZV9nZW9tZXRyeSwmZ2VvbWV0cnksCiAgICAgICAgICAgICAmZXhjZXB0aW9uKTsKQEAgLTI2NTEsOSArMjY1MSw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgZ2VvbWV0cnkud2lkdGgsKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LmhlaWdodCwKLSAgICAgICAgICAgIChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55KTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZyUrLjIwZyIsKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICAgIGdlb21ldHJ5LmhlaWdodCwoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5LnkpOwogICAgICAgICAgIENsb25lU3RyaW5nKCZkcmF3X2luZm8tPmdlb21ldHJ5LHRleHQpOwogICAgICAgICAgIGRyYXdfaW5mby0+YWZmaW5lLnN4PWN1cnJlbnQuc3gqYWZmaW5lLnN4K2N1cnJlbnQucnkqYWZmaW5lLnJ4OwogICAgICAgICAgIGRyYXdfaW5mby0+YWZmaW5lLnJ4PWN1cnJlbnQucngqYWZmaW5lLnN4K2N1cnJlbnQuc3kqYWZmaW5lLnJ4OwpAQCAtMzI2NSw4ICszMjY1LDggQEAKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChMb2NhbGVDb21wYXJlKGtleXdvcmQsImhlaWdodCIpID09IDApCiAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbXNsX2luZm8tPmltYWdlW25dLT5yb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsCisgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgbXNsX2luZm8tPmltYWdlW25dLT5yb3dzKTsKICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkobXNsX2luZm8tPmF0dHJpYnV0ZXNbbl0sa2V5LHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICB9CkBAIC0zMjc3LDggKzMyNzcsOCBAQAogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKExvY2FsZUNvbXBhcmUoa2V5d29yZCwid2lkdGgiKSA9PSAwKQogICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZhbHVlLE1heFRleHRFeHRlbnQsIiVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG1zbF9pbmZvLT5pbWFnZVtuXS0+Y29sdW1ucyk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJS4yMGciLAorICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIG1zbF9pbmZvLT5pbWFnZVtuXS0+Y29sdW1ucyk7CiAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBTZXRJbWFnZVByb3BlcnR5KG1zbF9pbmZvLT5hdHRyaWJ1dGVzW25dLGtleSx2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgfQpAQCAtNDc5NCw5ICs0Nzk0LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwiJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS53aWR0aCwodW5zaWduZWQgbG9uZykgZ2VvbWV0cnkuaGVpZ2h0LAotICAgICAgICAgICAgKGxvbmcpIGdlb21ldHJ5LngsKGxvbmcpIGdlb21ldHJ5LnkpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBnJSsuMjBnIiwoZG91YmxlKSBnZW9tZXRyeS53aWR0aCwoZG91YmxlKQorICAgICAgICAgICAgZ2VvbWV0cnkuaGVpZ2h0LChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkgZ2VvbWV0cnkueSk7CiAgICAgICAgICAgQ2xvbmVTdHJpbmcoJmRyYXdfaW5mby0+Z2VvbWV0cnksdGV4dCk7CiAgICAgICAgICAgZHJhd19pbmZvLT5hZmZpbmUuc3g9Y3VycmVudC5zeCphZmZpbmUuc3grY3VycmVudC5yeSphZmZpbmUucng7CiAgICAgICAgICAgZHJhd19pbmZvLT5hZmZpbmUucng9Y3VycmVudC5yeCphZmZpbmUuc3grY3VycmVudC5zeSphZmZpbmUucng7CkBAIC02MDQ4LDEzICs2MDQ4LDEyIEBACiAgICAgICAgICAgICAgICAgaWYgKGltYWdlX29wdGlvbiAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQogICAgICAgICAgICAgICAgICAgZmxhZ3M9UGFyc2VBYnNvbHV0ZUdlb21ldHJ5KGltYWdlX29wdGlvbiwmZ2VvbWV0cnkpOwogICAgICAgICAgICAgICAgIGZsYWdzPVBhcnNlQWJzb2x1dGVHZW9tZXRyeSh2YWx1ZSwmZ2VvbWV0cnkpOwotICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwKLSAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS53aWR0aCwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmhlaWdodCk7CisgICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlLE1heFRleHRFeHRlbnQsIiUuMjBneCUuMjBnIiwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpIGdlb21ldHJ5LndpZHRoLChkb3VibGUpIGdlb21ldHJ5LmhlaWdodCk7CiAgICAgICAgICAgICAgICAgaWYgKCgoZmxhZ3MgJiBYVmFsdWUpICE9IDApIHx8ICgoZmxhZ3MgJiBZVmFsdWUpICE9IDApKQogICAgICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICAgICAgICIlbHV4JWx1JStsZCUrbGQiLCh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LmhlaWdodCwobG9uZykgZ2VvbWV0cnkueCwobG9uZykKKyAgICAgICAgICAgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBnJSsuMjBnIiwoZG91YmxlKSBnZW9tZXRyeS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgZ2VvbWV0cnkuaGVpZ2h0LChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkKICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkueSk7CiAgICAgICAgICAgICAgICAgKHZvaWQpIFNldEltYWdlT3B0aW9uKG1zbF9pbmZvLT5pbWFnZV9pbmZvW25dLGtleXdvcmQscGFnZSk7CiAgICAgICAgICAgICAgICAgbXNsX2luZm8tPmltYWdlX2luZm9bbl0tPnBhZ2U9R2V0UGFnZUdlb21ldHJ5KHBhZ2UpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL210di5jIGIvY29kZXJzL210di5jCmluZGV4IGE5ZTNjZmYuLjcyYTI5MDkgMTAwNjQ0Ci0tLSBhL2NvZGVycy9tdHYuYworKysgYi9jb2RlcnMvbXR2LmMKQEAgLTM2OSw4ICszNjksOCBAQAogICAgIC8qCiAgICAgICBJbml0aWFsaXplIHJhc3RlciBmaWxlIGhlYWRlci4KICAgICAqLwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAlbHVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAlLjIwZ1xuIiwoZG91YmxlKQorICAgICAgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQogICAgIHsKZGlmZiAtLWdpdCBhL2NvZGVycy9wY2wuYyBiL2NvZGVycy9wY2wuYwppbmRleCA4NThkOTk0Li4yYzY0MjdlIDEwMDY0NAotLS0gYS9jb2RlcnMvcGNsLmMKKysrIGIvY29kZXJzL3BjbC5jCkBAIC0zMDUsOCArMzA1LDggQEAKICAgICAodm9pZCkgUGFyc2VBYnNvbHV0ZUdlb21ldHJ5KFBTUGFnZUdlb21ldHJ5LCZwYWdlKTsKICAgaWYgKGltYWdlX2luZm8tPnBhZ2UgIT0gKGNoYXIgKikgTlVMTCkKICAgICAodm9pZCkgUGFyc2VBYnNvbHV0ZUdlb21ldHJ5KGltYWdlX2luZm8tPnBhZ2UsJnBhZ2UpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUiLAotICAgICh1bnNpZ25lZCBsb25nKSBwYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBwYWdlLmhlaWdodCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGciLChkb3VibGUpCisgICAgcGFnZS53aWR0aCwoZG91YmxlKSBwYWdlLmhlaWdodCk7CiAgIGlmIChpbWFnZV9pbmZvLT5tb25vY2hyb21lICE9IE1hZ2lja0ZhbHNlKQogICAgIGRlbGVnYXRlX2luZm89R2V0RGVsZWdhdGVJbmZvKCJwY2w6bW9ubyIsKGNoYXIgKikgTlVMTCxleGNlcHRpb24pOwogICBlbHNlCkBAIC0zMjYsMjAgKzMyNiwyMCBAQAogICBwYWdlLndpZHRoPShzaXplX3QpIGZsb29yKHBhZ2Uud2lkdGgqaW1hZ2UtPnhfcmVzb2x1dGlvbi9kZWx0YS54KzAuNSk7CiAgIHBhZ2UuaGVpZ2h0PShzaXplX3QpIGZsb29yKHBhZ2UuaGVpZ2h0KmltYWdlLT55X3Jlc29sdXRpb24vZGVsdGEueSsKICAgICAwLjUpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWclbHV4JWx1ICIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIHBhZ2Uud2lkdGgsKHVuc2lnbmVkIGxvbmcpIHBhZ2UuaGVpZ2h0KTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1nJS4yMGd4JS4yMGcgIiwoZG91YmxlKQorICAgICBwYWdlLndpZHRoLChkb3VibGUpIHBhZ2UuaGVpZ2h0KTsKICAgaW1hZ2U9RGVzdHJveUltYWdlKGltYWdlKTsKICAgcmVhZF9pbmZvPUNsb25lSW1hZ2VJbmZvKGltYWdlX2luZm8pOwogICAqcmVhZF9pbmZvLT5tYWdpY2s9J1wwJzsKICAgaWYgKHJlYWRfaW5mby0+bnVtYmVyX3NjZW5lcyAhPSAwKQogICAgIHsKICAgICAgIGlmIChyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMgIT0gMSkKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1kTGFzdFBhZ2U9JWx1IiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgKHJlYWRfaW5mby0+c2NlbmUrcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzKSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcob3B0aW9ucyxNYXhUZXh0RXh0ZW50LCItZExhc3RQYWdlPSUuMjBnIiwKKyAgICAgICAgICAoZG91YmxlKSAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKICAgICAgIGVsc2UKICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgIi1kRmlyc3RQYWdlPSVsdSAtZExhc3RQYWdlPSVsdSIsKHVuc2lnbmVkIGxvbmcpIHJlYWRfaW5mby0+c2NlbmUrMSwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgKHJlYWRfaW5mby0+c2NlbmUrcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzKSk7CisgICAgICAgICAgIi1kRmlyc3RQYWdlPSUuMjBnIC1kTGFzdFBhZ2U9JS4yMGciLChkb3VibGUpIHJlYWRfaW5mby0+c2NlbmUrMSwKKyAgICAgICAgICAoZG91YmxlKSAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKICAgICAgIHJlYWRfaW5mby0+bnVtYmVyX3NjZW5lcz0wOwogICAgICAgaWYgKHJlYWRfaW5mby0+c2NlbmVzICE9IChjaGFyICopIE5VTEwpCiAgICAgICAgICpyZWFkX2luZm8tPnNjZW5lcz0nXDAnOwpAQCAtNzIxLDEwICs3MjEsMTEgQEAKICAgICAqLwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIlwwMzNFIik7ICAvKiBwcmludGVyIHJlc2V0ICovCiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiXDAzMypyM0YiKTsgIC8qIHNldCBwcmVzZW50YXRpb24gbW9kZSAqLwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwwMzMqciVsdXMlbHVUIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwwMzMqciUuMjBncyUuMjBnVCIsCisgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwwMzMqdCVsZFIiLChsb25nKSBkZW5zaXR5KTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKnQlLjIwZ1IiLChkb3VibGUpCisgICAgICBkZW5zaXR5KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiXDAzMyZsMEUiKTsgIC8qIHRvcCBtYXJnaW4gMCAqLwogICAgIGlmIChJc01vbm9jaHJvbWVJbWFnZShpbWFnZSwmaW1hZ2UtPmV4Y2VwdGlvbikgIT0gTWFnaWNrRmFsc2UpCkBAIC03NzYsMTUgKzc3NywxNiBAQAogICAgICAgICAgIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIGltYWdlLT5jb2xvcnM7IGkrKykKICAgICAgICAgICB7CiAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgICAiXDAzMyp2JWRhJWRiJWRjJWxkSSIsU2NhbGVRdWFudHVtVG9DaGFyKGltYWdlLT5jb2xvcm1hcFtpXS5yZWQpLAorICAgICAgICAgICAgICAiXDAzMyp2JWRhJWRiJWRjJS4yMGdJIiwKKyAgICAgICAgICAgICAgU2NhbGVRdWFudHVtVG9DaGFyKGltYWdlLT5jb2xvcm1hcFtpXS5yZWQpLAogICAgICAgICAgICAgICBTY2FsZVF1YW50dW1Ub0NoYXIoaW1hZ2UtPmNvbG9ybWFwW2ldLmdyZWVuKSwKLSAgICAgICAgICAgICAgU2NhbGVRdWFudHVtVG9DaGFyKGltYWdlLT5jb2xvcm1hcFtpXS5ibHVlKSwobG9uZykgaSk7CisgICAgICAgICAgICAgIFNjYWxlUXVhbnR1bVRvQ2hhcihpbWFnZS0+Y29sb3JtYXBbaV0uYmx1ZSksKGRvdWJsZSkgaSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICAgIGZvciAoIDsgaSA8ICgxTCA8PCBiaXRzX3Blcl9waXhlbCk7IGkrKykKICAgICAgICAgICB7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKnYlbHVJIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGkpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiXDAzMyp2JS4yMGdJIiwKKyAgICAgICAgICAgICAgKGRvdWJsZSkgaSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05MTIsOCArOTE0LDggQEAKICAgICAgIHsKICAgICAgICAgY2FzZSBOb0NvbXByZXNzaW9uOgogICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiXDAzMypiJWx1VyIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKmIlLjIwZ1ciLAorICAgICAgICAgICAgKGRvdWJsZSkgbGVuZ3RoKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYihpbWFnZSxsZW5ndGgscGl4ZWxzKTsKICAgICAgICAgICBicmVhazsKQEAgLTkyMiw4ICs5MjQsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgcGFja2V0cz1QQ0xQYWNrYml0c0NvbXByZXNzSW1hZ2UobGVuZ3RoLHBpeGVscywKICAgICAgICAgICAgIGNvbXByZXNzX3BpeGVscyk7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiXDAzMypiJWx1VyIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgcGFja2V0cyk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiXDAzMypiJS4yMGdXIiwKKyAgICAgICAgICAgIChkb3VibGUpIHBhY2tldHMpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iKGltYWdlLHBhY2tldHMsY29tcHJlc3NfcGl4ZWxzKTsKICAgICAgICAgICBicmVhazsKQEAgLTkzNSw4ICs5MzcsOCBAQAogICAgICAgICAgICAgICBwcmV2aW91c19waXhlbHNbaV09KH5waXhlbHNbaV0pOwogICAgICAgICAgIHBhY2tldHM9UENMRGVsdGFDb21wcmVzc0ltYWdlKGxlbmd0aCxwcmV2aW91c19waXhlbHMscGl4ZWxzLAogICAgICAgICAgICAgY29tcHJlc3NfcGl4ZWxzKTsKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKmIlbHVXIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBwYWNrZXRzKTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcMDMzKmIlLjIwZ1ciLAorICAgICAgICAgICAgKGRvdWJsZSkgcGFja2V0cyk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2IoaW1hZ2UscGFja2V0cyxjb21wcmVzc19waXhlbHMpOwogICAgICAgICAgICh2b2lkKSBDb3B5TWFnaWNrTWVtb3J5KHByZXZpb3VzX3BpeGVscyxwaXhlbHMsbGVuZ3RoKgpkaWZmIC0tZ2l0IGEvY29kZXJzL3BkZi5jIGIvY29kZXJzL3BkZi5jCmluZGV4IGIxM2JmMmQuLjVlNGFkODIgMTAwNjQ0Ci0tLSBhL2NvZGVycy9wZGYuYworKysgYi9jb2RlcnMvcGRmLmMKQEAgLTQ1Niw4ICs0NTYsOCBAQAogICAgICAgICAvKgogICAgICAgICAgIE5vdGUgc3BvdCBuYW1lcy4KICAgICAgICAgKi8KLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwcm9wZXJ0eSxNYXhUZXh0RXh0ZW50LCJwZGY6U3BvdENvbG9yLSVsdSIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNwb3Rjb2xvcisrKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwcm9wZXJ0eSxNYXhUZXh0RXh0ZW50LCJwZGY6U3BvdENvbG9yLSUuMjBnIiwKKyAgICAgICAgICAoZG91YmxlKSBzcG90Y29sb3IrKyk7CiAgICAgICAgIGk9MDsKICAgICAgICAgZm9yIChjPVJlYWRCbG9iQnl0ZShpbWFnZSk7IGMgIT0gRU9GOyBjPVJlYWRCbG9iQnl0ZShpbWFnZSkpCiAgICAgICAgIHsKQEAgLTU5Niw4ICs1OTYsOCBAQAogICAgICAgICAwLjUpOwogICAgICAgcGFnZS5oZWlnaHQ9KHNpemVfdCkgZmxvb3IocGFnZS5oZWlnaHQqaW1hZ2UtPnlfcmVzb2x1dGlvbi9kZWx0YS55KwogICAgICAgICAwLjUpOwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1nJWx1eCVsdSAiLAotICAgICAgICAodW5zaWduZWQgbG9uZykgcGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgcGFnZS5oZWlnaHQpOworICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1nJS4yMGd4JS4yMGcgIiwKKyAgICAgICAgKGRvdWJsZSkgcGFnZS53aWR0aCwoZG91YmxlKSBwYWdlLmhlaWdodCk7CiAgICAgfQogICBpZiAoY215ayAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcob3B0aW9ucywiLWRVc2VDSUVDb2xvciAiLE1heFRleHRFeHRlbnQpOwpAQCAtNjEyLDggKzYxMiw4IEBACiAgICAgICBjaGFyCiAgICAgICAgIHBhZ2VzW01heFRleHRFeHRlbnRdOwogCi0gICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VzLE1heFRleHRFeHRlbnQsIi1kRmlyc3RQYWdlPSVsdSAiCi0gICAgICAgICItZExhc3RQYWdlPSVsdSIsKHVuc2lnbmVkIGxvbmcpIHJlYWRfaW5mby0+c2NlbmUrMSwodW5zaWduZWQgbG9uZykKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZXMsTWF4VGV4dEV4dGVudCwiLWRGaXJzdFBhZ2U9JS4yMGcgIgorICAgICAgICAiLWRMYXN0UGFnZT0lLjIwZyIsKGRvdWJsZSkgcmVhZF9pbmZvLT5zY2VuZSsxLChkb3VibGUpCiAgICAgICAgIChyZWFkX2luZm8tPnNjZW5lK3JlYWRfaW5mby0+bnVtYmVyX3NjZW5lcykpOwogICAgICAgKHZvaWQpIENvbmNhdGVuYXRlTWFnaWNrU3RyaW5nKG9wdGlvbnMscGFnZXMsTWF4VGV4dEV4dGVudCk7CiAgICAgICByZWFkX2luZm8tPm51bWJlcl9zY2VuZXM9MDsKQEAgLTEwNTUsOCArMTA1NSw4IEBACiAgICAgICB2ZXJzaW9uPShzaXplX3QpIE1hZ2lja01heCh2ZXJzaW9uLDQpOwogICBpZiAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBERkEiKSA9PSAwKQogICAgIHZlcnNpb249KHNpemVfdCkgTWFnaWNrTWF4KHZlcnNpb24sNik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlUERGLTEuJWx1IFxuIiwKLSAgICAodW5zaWduZWQgbG9uZykgdmVyc2lvbik7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlUERGLTEuJS4yMGcgXG4iLAorICAgIChkb3VibGUpIHZlcnNpb24pOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgIGlmIChMb2NhbGVDb21wYXJlKGltYWdlX2luZm8tPm1hZ2ljaywiUERGQSIpID09IDApCiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJeLjz9NcbiIpOwpAQCAtMTA2NSwyMCArMTA2NSwyMCBAQAogICAqLwogICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgIHJvb3RfaWQ9b2JqZWN0OwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCisgICAgb2JqZWN0KTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgIGlmIChMb2NhbGVDb21wYXJlKGltYWdlX2luZm8tPm1hZ2ljaywiUERGQSIpICE9IDApCi0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1BhZ2VzICVsdSAwIFJcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzEpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9QYWdlcyAlLjIwZyAwIFJcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgIGVsc2UKICAgICB7Ci0gICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTWV0YWRhdGEgJWx1IDAgUlxuIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCsxKTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9NZXRhZGF0YSAlLjIwZyAwIFJcbiIsCisgICAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9QYWdlcyAlbHUgMCBSXG4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzIpOworICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1BhZ2VzICUuMjBnIDAgUlxuIiwKKyAgICAgICAgKGRvdWJsZSkgb2JqZWN0KzIpOwogICAgIH0KICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvQ2F0YWxvZ1xuIik7CkBAIC0xMDk5LDggKzEwOTksOCBAQAogICAgICAgICBXcml0ZSBYTVAgb2JqZWN0LgogICAgICAgKi8KICAgICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwKKyAgICAgICAgKGRvdWJsZSkgb2JqZWN0KTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9TdWJ0eXBlIC9YTUxcbiIpOwpAQCAtMTExNiw3ICsxMTE2LDggQEAKICAgICAgIGk9Rm9ybWF0TWFnaWNrU3RyaW5nKHhtcF9wcm9maWxlLE1heFRleHRFeHRlbnQsWE1QUHJvZmlsZSwKICAgICAgICAgWE1QUHJvZmlsZU1hZ2ljayxtb2RpZnlfZGF0ZSxjcmVhdGVfZGF0ZSx0aW1lc3RhbXAsCiAgICAgICAgIEdldE1hZ2lja1ZlcnNpb24oJnZlcnNpb24pLEdldE1hZ2lja1ZlcnNpb24oJnZlcnNpb24pKTsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJWx1XG4iLDFVTCppKTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJS4yMGdcbiIsCisgICAgICAgIChkb3VibGUpIGkpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1R5cGUgL01ldGFkYXRhXG4iKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG5zdHJlYW1cbiIpOwpAQCAtMTEyOSwxMyArMTEzMCwxMyBAQAogICAqLwogICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7CiAgIHBhZ2VzX2lkPW9iamVjdDsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgIG9iamVjdCk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvUGFnZXNcbiIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvS2lkcyBbICVsdSAwIFIgIiwKLSAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzEpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvS2lkcyBbICUuMjBnIDAgUiAiLAorICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICBjb3VudD0oc3NpemVfdCkgKHBhZ2VzX2lkK09iamVjdHNQZXJJbWFnZSsxKTsKICAgaWYgKGltYWdlX2luZm8tPmFkam9pbiAhPSBNYWdpY2tGYWxzZSkKQEAgLTExNDksNyArMTE1MCw4IEBACiAgICAgICBraWRfaW1hZ2U9aW1hZ2U7CiAgICAgICBmb3IgKCA7IEdldE5leHRJbWFnZUluTGlzdChraWRfaW1hZ2UpICE9IChJbWFnZSAqKSBOVUxMOyBjb3VudCs9T2JqZWN0c1BlckltYWdlKQogICAgICAgewotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbGQgMCBSICIsKGxvbmcpIGNvdW50KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBSICIsKGRvdWJsZSkKKyAgICAgICAgICBjb3VudCk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAga2lkX2ltYWdlPUdldE5leHRJbWFnZUluTGlzdChraWRfaW1hZ2UpOwogICAgICAgfQpAQCAtMTE1OSw4ICsxMTYxLDggQEAKICAgICAgICAgVGhyb3dXcml0ZXJFeGNlcHRpb24oUmVzb3VyY2VMaW1pdEVycm9yLCJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICAgfQogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJdXG4iKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0NvdW50ICVsdVxuIiwKLSAgICAodW5zaWduZWQgbG9uZykgKChjb3VudC1wYWdlc19pZCkvT2JqZWN0c1BlckltYWdlKSk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Db3VudCAlLjIwZ1xuIiwKKyAgICAoZG91YmxlKSAoKGNvdW50LXBhZ2VzX2lkKS9PYmplY3RzUGVySW1hZ2UpKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CkBAIC0xMjU5LDE1ICsxMjYxLDE2IEBACiAgICAgICAgIHJlc29sdXRpb24ueT0oc2l6ZV90KSAoMTAwLjAqMi41NCpyZXNvbHV0aW9uLnkrMC41KS8xMDAuMDsKICAgICAgIH0KICAgICBTZXRHZW9tZXRyeShpbWFnZSwmZ2VvbWV0cnkpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyIsCisgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgaWYgKGltYWdlX2luZm8tPnBhZ2UgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksaW1hZ2VfaW5mby0+cGFnZSxNYXhUZXh0RXh0ZW50KTsKICAgICBlbHNlCiAgICAgICBpZiAoKGltYWdlLT5wYWdlLndpZHRoICE9IDApICYmIChpbWFnZS0+cGFnZS5oZWlnaHQgIT0gMCkpCi0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2UuaGVpZ2h0LAotICAgICAgICAgIChsb25nKSBpbWFnZS0+cGFnZS54LChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBnJSsuMjBnIiwoZG91YmxlKSBpbWFnZS0+cGFnZS53aWR0aCwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+cGFnZS5oZWlnaHQsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueCwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5wYWdlLnkpOwogICAgICAgZWxzZQogICAgICAgICBpZiAoKGltYWdlLT5ncmF2aXR5ICE9IFVuZGVmaW5lZEdyYXZpdHkpICYmCiAgICAgICAgICAgICAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBERiIpID09IDApKQpAQCAtMTI5OCwxMyArMTMwMSwxMyBAQAogICAgICAgV3JpdGUgUGFnZSBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1R5cGUgL1BhZ2VcbiIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9QYXJlbnQgJWx1IDAgUlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBwYWdlc19pZCk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1BhcmVudCAlLjIwZyAwIFJcbiIsCisgICAgICAoZG91YmxlKSBwYWdlc19pZCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9SZXNvdXJjZXMgPDxcbiIpOwogICAgIGxhYmVscz0oY2hhciAqKikgTlVMTDsKQEAgLTEzMTQsMTYgKzEzMTcsMTYgQEAKICAgICBpZiAobGFiZWxzICE9IChjaGFyICoqKSBOVUxMKQogICAgICAgewogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICIvRm9udCA8PCAvRiVsdSAlbHUgMCBSID4+XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCs0KTsKKyAgICAgICAgICAiL0ZvbnQgPDwgL0YlLjIwZyAlLjIwZyAwIFIgPj5cbiIsKGRvdWJsZSkgaW1hZ2UtPnNjZW5lLChkb3VibGUpCisgICAgICAgICAgb2JqZWN0KzQpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICB9CiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICIvWE9iamVjdCA8PCAvSW0lbHUgJWx1IDAgUiA+PlxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnNjZW5lLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCs1KTsKKyAgICAgICIvWE9iamVjdCA8PCAvSW0lLjIwZyAlLjIwZyAwIFIgPj5cbiIsKGRvdWJsZSkgaW1hZ2UtPnNjZW5lLChkb3VibGUpCisgICAgICBvYmplY3QrNSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Qcm9jU2V0ICVsdSAwIFIgPj5cbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzMpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Qcm9jU2V0ICUuMjBnIDAgUiA+PlxuIiwKKyAgICAgIChkb3VibGUpIG9iamVjdCszKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKICAgICAgICIvTWVkaWFCb3ggWzAgMCAlZyAlZ11cbiIsNzIuMCptZWRpYV9pbmZvLndpZHRoL3Jlc29sdXRpb24ueCwKQEAgLTEzMzMsMTEgKzEzMzYsMTEgQEAKICAgICAgICIvQ3JvcEJveCBbMCAwICVnICVnXVxuIiw3Mi4wKm1lZGlhX2luZm8ud2lkdGgvcmVzb2x1dGlvbi54LAogICAgICAgNzIuMCptZWRpYV9pbmZvLmhlaWdodC9yZXNvbHV0aW9uLnkpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ29udGVudHMgJWx1IDAgUlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0NvbnRlbnRzICUuMjBnIDAgUlxuIiwKKyAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1RodW1iICVsdSAwIFJcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzgpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9UaHVtYiAlLjIwZyAwIFJcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QrOCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwpAQCAtMTM0NSwxMiArMTM0OCwxMiBAQAogICAgICAgV3JpdGUgQ29udGVudHMgb2JqZWN0LgogICAgICovCiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJWx1IDAgUlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlLjIwZyAwIFJcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdHJlYW1cbiIpOwpAQCAtMTM2MCwyMiArMTM2MywyMyBAQAogICAgICAgZm9yIChpPTA7IGxhYmVsc1tpXSAhPSAoY2hhciAqKSBOVUxMOyBpKyspCiAgICAgICB7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIkJUXG4iKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0YlbHUgJWcgVGZcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5zY2VuZSxwb2ludHNpemUpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvRiUuMjBnICVnIFRmXG4iLAorICAgICAgICAgIChkb3VibGUpIGltYWdlLT5zY2VuZSxwb2ludHNpemUpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsZCAlbGQgVGRcbiIsKGxvbmcpCi0gICAgICAgICAgZ2VvbWV0cnkueCwobG9uZykgKGdlb21ldHJ5LnkrZ2VvbWV0cnkuaGVpZ2h0K2kqcG9pbnRzaXplKzEyKSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnIFRkXG4iLAorICAgICAgICAgIChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkgKGdlb21ldHJ5LnkrZ2VvbWV0cnkuaGVpZ2h0K2kqcG9pbnRzaXplKworICAgICAgICAgIDEyKSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiKCVzKSBUalxuIixsYWJlbHNbaV0pOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIkVUXG4iKTsKICAgICAgICAgbGFiZWxzW2ldPURlc3Ryb3lTdHJpbmcobGFiZWxzW2ldKTsKICAgICAgIH0KLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlZyAwIDAgJWcgJWxkICVsZCBjbVxuIiwKLSAgICAgIHNjYWxlLngsc2NhbGUueSwobG9uZykgZ2VvbWV0cnkueCwobG9uZykgZ2VvbWV0cnkueSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWcgMCAwICVnICUuMjBnICUuMjBnIGNtXG4iLAorICAgICAgc2NhbGUueCxzY2FsZS55LChkb3VibGUpIGdlb21ldHJ5LngsKGRvdWJsZSkgZ2VvbWV0cnkueSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9JbSVsdSBEb1xuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9JbSUuMjBnIERvXG4iLAorICAgICAgKGRvdWJsZSkgaW1hZ2UtPnNjZW5lKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiUVxuIik7CiAgICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKS1vZmZzZXQ7CkBAIC0xMzg1LDE5ICsxMzg5LDE4IEBACiAgICAgICBXcml0ZSBMZW5ndGggb2JqZWN0LgogICAgICovCiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1XG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9mZnNldCk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsKGRvdWJsZSkgb2Zmc2V0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgICAvKgogICAgICAgV3JpdGUgUHJvY3NldCBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBpZiAoKGltYWdlLT5zdG9yYWdlX2NsYXNzID09IERpcmVjdENsYXNzKSB8fCAoaW1hZ2UtPmNvbG9ycyA+IDI1NikpCiAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIlsgL1BERiAvVGV4dCAvSW1hZ2VDIixNYXhUZXh0RXh0ZW50KTsKQEAgLTE0MTMsMTYgKzE0MTYsMTYgQEAKICAgICAgIFdyaXRlIEZvbnQgb2JqZWN0LgogICAgICovCiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLAorICAgICAgKGRvdWJsZSkgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgIGlmIChsYWJlbHMgIT0gKGNoYXIgKiopIE5VTEwpCiAgICAgICB7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9UeXBlIC9Gb250XG4iKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1N1YnR5cGUgL1R5cGUxXG4iKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL05hbWUgL0YlbHVcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5zY2VuZSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9OYW1lIC9GJS4yMGdcbiIsCisgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnNjZW5lKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvQmFzZUZvbnQgL0hlbHZldGljYVxuIik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZ1xuIik7CkBAIC0xNDM0LDE0ICsxNDM3LDE0IEBACiAgICAgICBXcml0ZSBYT2JqZWN0IG9iamVjdC4KICAgICAqLwogICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgIG9iamVjdCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvWE9iamVjdFxuIik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiL1N1YnR5cGUgL0ltYWdlXG4iKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTmFtZSAvSW0lbHVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnNjZW5lKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTmFtZSAvSW0lLjIwZ1xuIiwKKyAgICAgIChkb3VibGUpIGltYWdlLT5zY2VuZSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIHN3aXRjaCAoY29tcHJlc3Npb24pCiAgICAgewpAQCAtMTQ4Nyw4ICsxNDkwLDggQEAKICAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvRGVjb2RlUGFybXMgWyA8PCAiCi0gICAgICAgICAgIi9LICVzIC9CbGFja0lzMSBmYWxzZSAvQ29sdW1ucyAlbGQgL1Jvd3MgJWxkID4+IF1cbiIsQ0NJVFRQYXJhbSwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgICAiL0sgJXMgL0JsYWNrSXMxIGZhbHNlIC9Db2x1bW5zICUuMjBnIC9Sb3dzICUuMjBnID4+IF1cbiIsQ0NJVFRQYXJhbSwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgZGVmYXVsdDoKQEAgLTE0OTksMTQgKzE1MDIsMTQgQEAKICAgICAgIH0KICAgICB9CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9XaWR0aCAlbHVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9XaWR0aCAlLjIwZ1xuIiwoZG91YmxlKQorICAgICAgaW1hZ2UtPmNvbHVtbnMpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvSGVpZ2h0ICVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0hlaWdodCAlLjIwZ1xuIiwoZG91YmxlKQorICAgICAgaW1hZ2UtPnJvd3MpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ29sb3JTcGFjZSAlbHUgMCBSXG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCsyKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQ29sb3JTcGFjZSAlLjIwZyAwIFJcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QrMik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9CaXRzUGVyQ29tcG9uZW50ICVkXG4iLAogICAgICAgKGNvbXByZXNzaW9uID09IEZheENvbXByZXNzaW9uKSB8fCAoY29tcHJlc3Npb24gPT0gR3JvdXA0Q29tcHJlc3Npb24pID8KQEAgLTE1MTQsMTIgKzE1MTcsMTIgQEAKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgaWYgKGltYWdlLT5tYXR0ZSAhPSBNYWdpY2tGYWxzZSkKICAgICAgIHsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1NNYXNrICVsdSAwIFJcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9iamVjdCs3KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1NNYXNrICUuMjBnIDAgUlxuIiwKKyAgICAgICAgICAoZG91YmxlKSBvYmplY3QrNyk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICVsdSAwIFJcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzEpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJS4yMGcgMCBSXG4iLAorICAgICAgKGRvdWJsZSkgb2JqZWN0KzEpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwic3RyZWFtXG4iKTsKQEAgLTE4NDcsMTggKzE4NTAsMTggQEAKICAgICAgIFdyaXRlIExlbmd0aCBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgb2Zmc2V0KTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwKKyAgICAgIChkb3VibGUpIG9mZnNldCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICAgLyoKICAgICAgIFdyaXRlIENvbG9yc3BhY2Ugb2JqZWN0LgogICAgICovCiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgaWYgKGltYWdlLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlKQpAQCAtMTg3Niw4ICsxODc5LDggQEAKICAgICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIi9EZXZpY2VSR0JcbiIsTWF4VGV4dEV4dGVudCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgIlsgL0luZGV4ZWQgL0RldmljZVJHQiAlbHUgJWx1IDAgUiBdXG4iLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgaW1hZ2UtPmNvbG9ycy0xLCh1bnNpZ25lZCBsb25nKSBvYmplY3QrMyk7CisgICAgICAgICAgICAiWyAvSW5kZXhlZCAvRGV2aWNlUkdCICUuMjBnICUuMjBnIDAgUiBdXG4iLChkb3VibGUpIGltYWdlLT5jb2xvcnMtCisgICAgICAgICAgICAxLChkb3VibGUpIG9iamVjdCszKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKICAgICAvKgpAQCAtMTg5MSw3ICsxODk0LDcgQEAKICAgICBpZiAodGlsZV9pbWFnZSA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgIFRocm93V3JpdGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvcixpbWFnZS0+ZXhjZXB0aW9uLnJlYXNvbik7CiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwpAQCAtMTkzOSw4ICsxOTQyLDggQEAKICAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvRGVjb2RlUGFybXMgWyA8PCAiCi0gICAgICAgICAgIi9LICVzIC9CbGFja0lzMSBmYWxzZSAvQ29sdW1ucyAlbHUgL1Jvd3MgJWx1ID4+IF1cbiIsQ0NJVFRQYXJhbSwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgdGlsZV9pbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgdGlsZV9pbWFnZS0+cm93cyk7CisgICAgICAgICAgIi9LICVzIC9CbGFja0lzMSBmYWxzZSAvQ29sdW1ucyAlLjIwZyAvUm93cyAlLjIwZyA+PiBdXG4iLENDSVRUUGFyYW0sCisgICAgICAgICAgKGRvdWJsZSkgdGlsZV9pbWFnZS0+Y29sdW1ucywoZG91YmxlKSB0aWxlX2ltYWdlLT5yb3dzKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBkZWZhdWx0OgpAQCAtMTk1MSwyMSArMTk1NCwyMSBAQAogICAgICAgfQogICAgIH0KICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1dpZHRoICVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSB0aWxlX2ltYWdlLT5jb2x1bW5zKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvV2lkdGggJS4yMGdcbiIsKGRvdWJsZSkKKyAgICAgIHRpbGVfaW1hZ2UtPmNvbHVtbnMpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvSGVpZ2h0ICVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSB0aWxlX2ltYWdlLT5yb3dzKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvSGVpZ2h0ICUuMjBnXG4iLChkb3VibGUpCisgICAgICB0aWxlX2ltYWdlLT5yb3dzKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0NvbG9yU3BhY2UgJWx1IDAgUlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QtMSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0NvbG9yU3BhY2UgJS4yMGcgMCBSXG4iLAorICAgICAgKGRvdWJsZSkgb2JqZWN0LTEpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvQml0c1BlckNvbXBvbmVudCAlZFxuIiwKICAgICAgIChjb21wcmVzc2lvbiA9PSBGYXhDb21wcmVzc2lvbikgfHwgKGNvbXByZXNzaW9uID09IEdyb3VwNENvbXByZXNzaW9uKSA/CiAgICAgICAxIDogOCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJWx1IDAgUlxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlLjIwZyAwIFJcbiIsCisgICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdHJlYW1cbiIpOwpAQCAtMjI2MiwxNSArMjI2NSwxNCBAQAogICAgICAgV3JpdGUgTGVuZ3RoIG9iamVjdC4KICAgICAqLwogICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgIG9iamVjdCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdVxuIiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBvZmZzZXQpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIG9mZnNldCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsImVuZG9ialxuIik7CiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgaWYgKChpbWFnZS0+c3RvcmFnZV9jbGFzcyAhPSBEaXJlY3RDbGFzcykgJiYgKGltYWdlLT5jb2xvcnMgPD0gMjU2KSAmJgpAQCAtMjI4Miw4ICsyMjg0LDggQEAKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwogICAgICAgICBpZiAoY29tcHJlc3Npb24gPT0gTm9Db21wcmVzc2lvbikKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUgXVxuIik7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJWx1IDAgUlxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgb2JqZWN0KzEpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvTGVuZ3RoICUuMjBnIDAgUlxuIiwKKyAgICAgICAgICAoZG91YmxlKSBvYmplY3QrMSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPj5cbiIpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJzdHJlYW1cbiIpOwpAQCAtMjMxNiwxMCArMjMxOCwxMCBAQAogICAgICAgV3JpdGUgTGVuZ3RoIG9iamVjdC4KICAgICAqLwogICAgIHhyZWZbb2JqZWN0KytdPVRlbGxCbG9iKGltYWdlKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgMCBvYmpcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgMCBvYmpcbiIsKGRvdWJsZSkKICAgICAgIG9iamVjdCk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdVxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKQogICAgICAgb2Zmc2V0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiZW5kb2JqXG4iKTsKQEAgLTIzMjcsNyArMjMyOSw3IEBACiAgICAgICBXcml0ZSBzb2Z0bWFzayBvYmplY3QuCiAgICAgKi8KICAgICB4cmVmW29iamVjdCsrXT1UZWxsQmxvYihpbWFnZSk7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnIDAgb2JqXG4iLChkb3VibGUpCiAgICAgICBvYmplY3QpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI8PFxuIik7CkBAIC0yMzM3LDggKzIzMzksOCBAQAogICAgICAgewogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvVHlwZSAvWE9iamVjdFxuIik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9TdWJ0eXBlIC9JbWFnZVxuIik7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9OYW1lIC9NYSVsdVxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnNjZW5lKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL05hbWUgL01hJS4yMGdcbiIsCisgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnNjZW5lKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICBzd2l0Y2ggKGNvbXByZXNzaW9uKQogICAgICAgICB7CkBAIC0yMzY3LDE5ICsyMzY5LDE5IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1dpZHRoICVsdVxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvV2lkdGggJS4yMGdcbiIsCisgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9IZWlnaHQgJWx1XG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9IZWlnaHQgJS4yMGdcbiIsCisgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIi9Db2xvclNwYWNlIC9EZXZpY2VHcmF5XG4iKTsKICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0JpdHNQZXJDb21wb25lbnQgJWRcbiIsCiAgICAgICAgICAgKGNvbXByZXNzaW9uID09IEZheENvbXByZXNzaW9uKSB8fCAoY29tcHJlc3Npb24gPT0gR3JvdXA0Q29tcHJlc3Npb24pCiAgICAgICAgICAgPyAxIDogOCk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0xlbmd0aCAlbHUgMCBSXG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBvYmplY3QrMSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9MZW5ndGggJS4yMGcgMCBSXG4iLAorICAgICAgICAgIChkb3VibGUpIG9iamVjdCsxKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCI+PlxuIik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsInN0cmVhbVxuIik7CkBAIC0yNDY2LDExICsyNDY4LDEwIEBACiAgICAgICBXcml0ZSBMZW5ndGggb2JqZWN0LgogICAgICovCiAgICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAwIG9ialxuIiwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgICAgb2JqZWN0KTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1XG4iLCh1bnNpZ25lZCBsb25nKQotICAgICAgb2Zmc2V0KTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKSBvZmZzZXQpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJlbmRvYmpcbiIpOwogICAgIGlmIChHZXROZXh0SW1hZ2VJbkxpc3QoaW1hZ2UpID09IChJbWFnZSAqKSBOVUxMKQpAQCAtMjQ4Niw3ICsyNDg3LDcgQEAKICAgKi8KICAgeHJlZltvYmplY3QrK109VGVsbEJsb2IoaW1hZ2UpOwogICBpbmZvX2lkPW9iamVjdDsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1IDAgb2JqXG4iLCh1bnNpZ25lZCBsb25nKQorICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAwIG9ialxuIiwoZG91YmxlKQogICAgIG9iamVjdCk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiPDxcbiIpOwpAQCAtMjUxNiw3ICsyNTE3LDcgQEAKICAgKi8KICAgb2Zmc2V0PVRlbGxCbG9iKGltYWdlKS14cmVmWzBdKzEwOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJ4cmVmXG4iKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiMCAlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIjAgJS4yMGdcbiIsKGRvdWJsZSkKICAgICBvYmplY3QrMSk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiMDAwMDAwMDAwMCA2NTUzNSBmIFxuIik7CkBAIC0yNTI4LDE5ICsyNTI5LDE4IEBACiAgIH0KICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwidHJhaWxlclxuIik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIjw8XG4iKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1NpemUgJWx1XG4iLCh1bnNpZ25lZCBsb25nKQorICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvU2l6ZSAlLjIwZ1xuIiwoZG91YmxlKQogICAgIG9iamVjdCsxKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIvSW5mbyAlbHUgMCBSXG4iLAotICAgICh1bnNpZ25lZCBsb25nKSBpbmZvX2lkKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL0luZm8gJS4yMGcgMCBSXG4iLChkb3VibGUpCisgICAgaW5mb19pZCk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiL1Jvb3QgJWx1IDAgUlxuIiwKLSAgICAodW5zaWduZWQgbG9uZykgcm9vdF9pZCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIi9Sb290ICUuMjBnIDAgUlxuIiwoZG91YmxlKQorICAgIHJvb3RfaWQpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIj4+XG4iKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwic3RhcnR4cmVmXG4iKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1XG4iLAotICAgICh1bnNpZ25lZCBsb25nKSBvZmZzZXQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKSBvZmZzZXQpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiUlRU9GXG4iKTsKICAgeHJlZj0oTWFnaWNrT2Zmc2V0VHlwZSAqKSBSZWxpbnF1aXNoTWFnaWNrTWVtb3J5KHhyZWYpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL3BpY3QuYyBiL2NvZGVycy9waWN0LmMKaW5kZXggYTQyYjg3Yy4uMjJkOGI2ZSAxMDA2NDQKLS0tIGEvY29kZXJzL3BpY3QuYworKysgYi9jb2RlcnMvcGljdC5jCkBAIC0xMzgwLDkgKzEzODAsOSBAQAogICAgICAgICByZWFkX2luZm89RGVzdHJveUltYWdlSW5mbyhyZWFkX2luZm8pOwogICAgICAgICBpZiAodGlsZV9pbWFnZSA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgTWFnaWNrTWF4KGltYWdlLT5jb2x1bW5zLHRpbGVfaW1hZ2UtPmNvbHVtbnMpLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBNYWdpY2tNYXgoaW1hZ2UtPnJvd3MsdGlsZV9pbWFnZS0+cm93cykpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiUuMjBneCUuMjBnIiwKKyAgICAgICAgICAoZG91YmxlKSBNYWdpY2tNYXgoaW1hZ2UtPmNvbHVtbnMsdGlsZV9pbWFnZS0+Y29sdW1ucyksCisgICAgICAgICAgKGRvdWJsZSkgTWFnaWNrTWF4KGltYWdlLT5yb3dzLHRpbGVfaW1hZ2UtPnJvd3MpKTsKICAgICAgICAgKHZvaWQpIFNldEltYWdlRXh0ZW50KGltYWdlLAogICAgICAgICAgIE1hZ2lja01heChpbWFnZS0+Y29sdW1ucyx0aWxlX2ltYWdlLT5jb2x1bW5zKSwKICAgICAgICAgICBNYWdpY2tNYXgoaW1hZ2UtPnJvd3MsdGlsZV9pbWFnZS0+cm93cykpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL3BuZy5jIGIvY29kZXJzL3BuZy5jCmluZGV4IDBiYTc4NTYuLjZlMjU3NjUgMTAwNjQ0Ci0tLSBhL2NvZGVycy9wbmcuYworKysgYi9jb2RlcnMvcG5nLmMKQEAgLTU0OSw4ICs1NDksOCBAQAogICBhc3NlcnQoaW1hZ2UtPnNpZ25hdHVyZSA9PSBNYWdpY2tTaWduYXR1cmUpOwogICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgIiAgICBDb21wcmVzc0NvbG9yTWFwVHJhbnNGaXJzdCAlcyAoJWx1IGNvbG9ycykiLGltYWdlLT5maWxlbmFtZSwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sb3JzKTsKKyAgICAgICIgICAgQ29tcHJlc3NDb2xvck1hcFRyYW5zRmlyc3QgJXMgKCUuMjBnIGNvbG9ycykiLGltYWdlLT5maWxlbmFtZSwKKyAgICAgIChkb3VibGUpIGltYWdlLT5jb2xvcnMpOwogICBpZiAoaW1hZ2UtPnN0b3JhZ2VfY2xhc3MgIT0gUHNldWRvQ2xhc3MgfHwgaW1hZ2UtPmNvbG9ycyA+IDI1NiB8fAogICAgICAgaW1hZ2UtPmNvbG9ycyA8IDIpCiAgICAgewpAQCAtMTA1NSw4ICsxMDU1LDggQEAKIHsKICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAiICBXcml0aW5nICVjJWMlYyVjIGNodW5rLCBsZW5ndGg6ICVsdSIsCi0gICAgICB0eXBlWzBdLHR5cGVbMV0sdHlwZVsyXSx0eXBlWzNdLCh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgIiAgV3JpdGluZyAlYyVjJWMlYyBjaHVuaywgbGVuZ3RoOiAlLjIwZyIsCisgICAgICB0eXBlWzBdLHR5cGVbMV0sdHlwZVsyXSx0eXBlWzNdLChkb3VibGUpIGxlbmd0aCk7CiB9CiAjZW5kaWYgLyogUE5HX0xJQlBOR19WRVIgPiAxMDAxMSAqLwogCkBAIC0xMTc4LDggKzExNzgsOCBAQAogICAgICAgICAgICAgbXNnW01heFRleHRFeHRlbnRdOwogCiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtc2csTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICJFeHBlY3RlZCAlbHUgYnl0ZXM7IGZvdW5kICVsdSBieXRlcyIsKHVuc2lnbmVkIGxvbmcpIGxlbmd0aCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGVjayk7CisgICAgICAgICAgICAiRXhwZWN0ZWQgJS4yMGcgYnl0ZXM7IGZvdW5kICUuMjBnIGJ5dGVzIiwoZG91YmxlKSBsZW5ndGgsCisgICAgICAgICAgICAoZG91YmxlKSBjaGVjayk7CiAgICAgICAgICAgcG5nX3dhcm5pbmcocG5nX3B0cixtc2cpOwogICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCJSZWFkIEV4Y2VwdGlvbiIpOwogICAgICAgICB9CkBAIC0xODk0LDggKzE4OTQsOCBAQAogICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICB7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBQTkcgd2lkdGg6ICVsdSwgaGVpZ2h0OiAlbHUiLAotICAgICAgICAodW5zaWduZWQgbG9uZykgcGluZ193aWR0aCwgKHVuc2lnbmVkIGxvbmcpIHBpbmdfaGVpZ2h0KTsKKyAgICAgICAgIiAgICBQTkcgd2lkdGg6ICUuMjBnLCBoZWlnaHQ6ICUuMjBnIiwKKyAgICAgICAgKGRvdWJsZSkgcGluZ193aWR0aCwgKGRvdWJsZSkgcGluZ19oZWlnaHQpOwogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICIgICAgUE5HIGNvbG9yX3R5cGU6ICVkLCBiaXRfZGVwdGg6ICVkIiwKICAgICAgICAgcGluZ19jb2xvcl90eXBlLCBwaW5nX2JpdF9kZXB0aCk7CkBAIC0yMDE1LDggKzIwMTUsOCBAQAogICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgIGlmIChpbWFnZS0+cGFnZS54IHx8IGltYWdlLT5wYWdlLnkpCiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAiICAgIFJlYWRpbmcgUE5HIG9GRnMgY2h1bms6IHg6ICVsZCwgeTogJWxkLiIsKGxvbmcpIGltYWdlLT5wYWdlLngsCi0gICAgICAgICAgICAobG9uZykgaW1hZ2UtPnBhZ2UueSk7CisgICAgICAgICAgICAiICAgIFJlYWRpbmcgUE5HIG9GRnMgY2h1bms6IHg6ICUuMjBnLCB5OiAlLjIwZy4iLChkb3VibGUpCisgICAgICAgICAgICBpbWFnZS0+cGFnZS54LChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAgIH0KICNlbmRpZgogI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQpAQCAtMjA1NSw4ICsyMDU1LDggQEAKICAgICAgICAgfQogICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICIgICAgUmVhZGluZyBQTkcgcEhZcyBjaHVuazogeHJlczogJWx1LCB5cmVzOiAlbHUsIHVuaXRzOiAlZC4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB4X3Jlc29sdXRpb24sKHVuc2lnbmVkIGxvbmcpIHlfcmVzb2x1dGlvbix1bml0X3R5cGUpOworICAgICAgICAgICIgICAgUmVhZGluZyBQTkcgcEhZcyBjaHVuazogeHJlczogJS4yMGcsIHlyZXM6ICUuMjBnLCB1bml0czogJWQuIiwKKyAgICAgICAgICAoZG91YmxlKSB4X3Jlc29sdXRpb24sKGRvdWJsZSkgeV9yZXNvbHV0aW9uLHVuaXRfdHlwZSk7CiAgICAgfQogI2VuZGlmCiAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBpbmcscGluZ19pbmZvLFBOR19JTkZPX1BMVEUpKQpAQCAtMjE4MCw5ICsyMTgwLDEwIEBACiAKICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICAgIGltYWdlLT5iYWNrZ3JvdW5kX2NvbG9yPSglZCwlZCwlZCkuIiwKLSAgICAgICAgICAgICAgaW1hZ2UtPmJhY2tncm91bmRfY29sb3IucmVkLAotICAgICAgICAgICAgICBpbWFnZS0+YmFja2dyb3VuZF9jb2xvci5ncmVlbixpbWFnZS0+YmFja2dyb3VuZF9jb2xvci5ibHVlKTsKKyAgICAgICAgICAgICAgIiAgICBpbWFnZS0+YmFja2dyb3VuZF9jb2xvcj0oJS4yMGcsJS4yMGcsJS4yMGcpLiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5iYWNrZ3JvdW5kX2NvbG9yLnJlZCwKKyAgICAgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmJhY2tncm91bmRfY29sb3IuZ3JlZW4sCisgICAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5iYWNrZ3JvdW5kX2NvbG9yLmJsdWUpOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCkBAIC0yMzQ5LDcgKzIzNTAsNyBAQAogICAgIHsKICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiICAgIFNraXBwaW5nIFBORyBpbWFnZSBkYXRhIGZvciBzY2VuZSAlbGQiLChsb25nKQorICAgICAgICAgICIgICAgU2tpcHBpbmcgUE5HIGltYWdlIGRhdGEgZm9yIHNjZW5lICUuMjBnIiwoZG91YmxlKQogICAgICAgICAgIG1uZ19pbmZvLT5zY2VuZXNfZm91bmQtMSk7CiAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcGluZywmcGluZ19pbmZvLCZlbmRfaW5mbyk7CiAjaWYgZGVmaW5lZChQTkdfU0VUSk1QX05PVF9USFJFQURfU0FGRSkKQEAgLTMyNzcsOCArMzI3OCw4IEBACiAKICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICBSZWFkaW5nIEpORyBjaHVuayB0eXBlICVjJWMlYyVjLCBsZW5ndGg6ICVsdSIsCi0gICAgICAgIHR5cGVbMF0sdHlwZVsxXSx0eXBlWzJdLHR5cGVbM10sKHVuc2lnbmVkIGxvbmcpIGxlbmd0aCk7CisgICAgICAgICIgIFJlYWRpbmcgSk5HIGNodW5rIHR5cGUgJWMlYyVjJWMsIGxlbmd0aDogJS4yMGciLAorICAgICAgICB0eXBlWzBdLHR5cGVbMV0sdHlwZVsyXSx0eXBlWzNdLChkb3VibGUpIGxlbmd0aCk7CiAKICAgICBpZiAobGVuZ3RoID4gUE5HX1VJTlRfMzFfTUFYIHx8IGNvdW50ID09IDApCiAgICAgICBUaHJvd1JlYWRlckV4Y2VwdGlvbihDb3JydXB0SW1hZ2VFcnJvciwiQ29ycnVwdEltYWdlIik7CkBAIC00MDg3LDggKzQwODgsOCBAQAogCiAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAiICBSZWFkaW5nIE1ORyBjaHVuayB0eXBlICVjJWMlYyVjLCBsZW5ndGg6ICVsdSIsCi0gICAgICAgICAgIHR5cGVbMF0sdHlwZVsxXSx0eXBlWzJdLHR5cGVbM10sKHVuc2lnbmVkIGxvbmcpIGxlbmd0aCk7CisgICAgICAgICAgICIgIFJlYWRpbmcgTU5HIGNodW5rIHR5cGUgJWMlYyVjJWMsIGxlbmd0aDogJS4yMGciLAorICAgICAgICAgICB0eXBlWzBdLHR5cGVbMV0sdHlwZVsyXSx0eXBlWzNdLChkb3VibGUpIGxlbmd0aCk7CiAKICAgICAgICAgaWYgKGxlbmd0aCA+IFBOR19VSU5UXzMxX01BWCkKICAgICAgICAgICBzdGF0dXM9TWFnaWNrRmFsc2U7CkBAIC00MTQ3LDkgKzQxNDgsOSBAQAogICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICIgIE1ORyB3aWR0aDogJWx1IiwodW5zaWduZWQgbG9uZykgbW5nX2luZm8tPm1uZ193aWR0aCk7CisgICAgICAgICAgICAgICAgICAiICBNTkcgd2lkdGg6ICUuMjBnIiwoZG91YmxlKSBtbmdfaW5mby0+bW5nX3dpZHRoKTsKICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICIgIE1ORyBoZWlnaHQ6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIG1uZ19pbmZvLT5tbmdfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICIgIE1ORyBoZWlnaHQ6ICUuMjBnIiwoZG91YmxlKSBtbmdfaW5mby0+bW5nX2hlaWdodCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHArPTg7CiAgICAgICAgICAgICBtbmdfaW5mby0+dGlja3NfcGVyX3NlY29uZD0oc2l6ZV90KSBtbmdfZ2V0X2xvbmcocCk7CkBAIC00MTg5LDggKzQxOTAsOCBAQAogICAgICAgICAgICAgaWYgKChtbmdfaW5mby0+bW5nX3dpZHRoID4gNjU1MzVMKSB8fAogICAgICAgICAgICAgICAgIChtbmdfaW5mby0+bW5nX2hlaWdodCA+IDY1NTM1TCkpCiAgICAgICAgICAgICAgIFRocm93UmVhZGVyRXhjZXB0aW9uKEltYWdlRXJyb3IsIldpZHRoT3JIZWlnaHRFeGNlZWRzTGltaXQiKTsKLSAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1KzArMCIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBtbmdfaW5mby0+bW5nX3dpZHRoLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgICAgICIlLjIwZ3glLjIwZyswKzAiLChkb3VibGUpIG1uZ19pbmZvLT5tbmdfd2lkdGgsKGRvdWJsZSkKICAgICAgICAgICAgICAgbW5nX2luZm8tPm1uZ19oZWlnaHQpOwogICAgICAgICAgICAgbW5nX2luZm8tPmZyYW1lLmxlZnQ9MDsKICAgICAgICAgICAgIG1uZ19pbmZvLT5mcmFtZS5yaWdodD0oc3NpemVfdCkgbW5nX2luZm8tPm1uZ193aWR0aDsKQEAgLTQyMjUsOSArNDIyNiw5IEBACiAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgICAgICAgICAiICAgIHJlcGVhdD0lZCIscmVwZWF0KTsKICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICIgICAgZmluYWxfZGVsYXk9JWxkIiwobG9uZykgZmluYWxfZGVsYXkpOworICAgICAgICAgICAgICAgICAgIiAgICBmaW5hbF9kZWxheT0lLjIwZyIsKGRvdWJsZSkgZmluYWxfZGVsYXkpOwogICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgIiAgICBpbWFnZS0+aXRlcmF0aW9ucz0lbGQiLChsb25nKSBpbWFnZS0+aXRlcmF0aW9ucyk7CisgICAgICAgICAgICAgICAgICAiICAgIGltYWdlLT5pdGVyYXRpb25zPSUuMjBnIiwoZG91YmxlKSBpbWFnZS0+aXRlcmF0aW9ucyk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNodW5rPSh1bnNpZ25lZCBjaGFyICopIFJlbGlucXVpc2hNYWdpY2tNZW1vcnkoY2h1bmspOwogICAgICAgICAgICAgY29udGludWU7CkBAIC00Mjc4LDEwICs0Mjc5LDEwIEBACiAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICIgIHhfb2ZmWyVkXTogJWx1IixvYmplY3RfaWQsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgIiAgeF9vZmZbJWRdOiAlLjIwZyIsb2JqZWN0X2lkLChkb3VibGUpCiAgICAgICAgICAgICAgICAgICAgICAgbW5nX2luZm8tPnhfb2ZmW29iamVjdF9pZF0pOwogICAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAiICB5X29mZlslZF06ICVsdSIsb2JqZWN0X2lkLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAgICAgICAgICAgICAgICIgIHlfb2ZmWyVkXTogJS4yMGciLG9iamVjdF9pZCwoZG91YmxlKQogICAgICAgICAgICAgICAgICAgICAgIG1uZ19pbmZvLT55X29mZltvYmplY3RfaWRdKTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQpAQCAtNDUwNCw3ICs0NTA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHArPTQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBGcmFtaW5nX2RlbGF5PSVsZCIsKGxvbmcpIGZyYW1lX2RlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEZyYW1pbmdfZGVsYXk9JS4yMGciLChkb3VibGUpIGZyYW1lX2RlbGF5KTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VfdGltZW91dCkKICAgICAgICAgICAgICAgICAgICAgICB7CkBAIC00NTE5LDcgKzQ1MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcCs9NDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEZyYW1pbmdfdGltZW91dD0lbGQiLChsb25nKSBmcmFtZV90aW1lb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEZyYW1pbmdfdGltZW91dD0lLjIwZyIsKGRvdWJsZSkgZnJhbWVfdGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlX2NsaXBwaW5nKQogICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTQ1MjgsOSArNDUyOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19mYj1mYjsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEZyYW1lX2NsaXBwaW5nOiBMPSVsZCBSPSVsZCBUPSVsZCBCPSVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGZiLmxlZnQsKGxvbmcpIGZiLnJpZ2h0LChsb25nKSBmYi50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGZiLmJvdHRvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBGcmFtZV9jbGlwcGluZzogTD0lLjIwZyBSPSUuMjBnIFQ9JS4yMGcgQj0lLjIwZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgZmIubGVmdCwoZG91YmxlKSBmYi5yaWdodCwoZG91YmxlKSBmYi50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgZmIuYm90dG9tKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VfY2xpcHBpbmcgPT0gMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9mYj1mYjsKICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00NTQ4LDggKzQ1NDksOCBAQAogI2lmIGRlZmluZWQoTU5HX0lOU0VSVF9MQVlFUlMpCiAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgIiAgIHN1YmZyYW1lX3dpZHRoPSVsdSwgc3ViZnJhbWVfaGVpZ2h0PSVsdSIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgICAgc3ViZnJhbWVfd2lkdGgsKHVuc2lnbmVkIGxvbmcpIHN1YmZyYW1lX2hlaWdodCk7CisgICAgICAgICAgICAgICAgIiAgIHN1YmZyYW1lX3dpZHRoPSUuMjBnLCBzdWJmcmFtZV9oZWlnaHQ9JS4yMGciLChkb3VibGUpCisgICAgICAgICAgICAgICAgc3ViZnJhbWVfd2lkdGgsKGRvdWJsZSkgc3ViZnJhbWVfaGVpZ2h0KTsKICAgICAgICAgICAgIGlmIChpbnNlcnRfbGF5ZXJzICYmIChtbmdfaW5mby0+ZnJhbWluZ19tb2RlID09IDQpICYmCiAgICAgICAgICAgICAgICAgKHN1YmZyYW1lX3dpZHRoKSAmJiAoc3ViZnJhbWVfaGVpZ2h0KSkKICAgICAgICAgICAgICAgewpAQCAtNDU4OCw5ICs0NTg5LDkgQEAKICAgICAgICAgICAgICAgICAodm9pZCkgU2V0SW1hZ2VCYWNrZ3JvdW5kQ29sb3IoaW1hZ2UpOwogICAgICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICIgIEluc2VydGVkIGJhY2tncm91bmQgbGF5ZXIsIEw9JWxkLCBSPSVsZCwgVD0lbGQsIEI9JWxkIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcpIG1uZ19pbmZvLT5jbGlwLmxlZnQsKGxvbmcpIG1uZ19pbmZvLT5jbGlwLnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAobG9uZykgbW5nX2luZm8tPmNsaXAudG9wLChsb25nKSBtbmdfaW5mby0+Y2xpcC5ib3R0b20pOworICAgICAgICAgICAgICAgICAgICAiICBJbnNlcnRlZCBiYWNrZ3JvdW5kIGxheWVyLCBMPSUuMjBnLCBSPSUuMjBnIFQ9JS4yMGcsIEI9JS4yMGciLAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBtbmdfaW5mby0+Y2xpcC5sZWZ0LChkb3VibGUpIG1uZ19pbmZvLT5jbGlwLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBtbmdfaW5mby0+Y2xpcC50b3AsKGRvdWJsZSkgbW5nX2luZm8tPmNsaXAuYm90dG9tKTsKICAgICAgICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgICAgICBjaHVuaz0odW5zaWduZWQgY2hhciAqKSBSZWxpbnF1aXNoTWFnaWNrTWVtb3J5KGNodW5rKTsKQEAgLTQ3MDUsOCArNDcwNiw4IEBACiAgICAgICAgICAgICBsb29wX2l0ZXJzPW1uZ19nZXRfbG9uZygmY2h1bmtbMV0pOwogICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICIgIExPT1AgbGV2ZWwgJWxkICBoYXMgJWxkIGl0ZXJhdGlvbnMgIiwobG9uZykgbG9vcF9sZXZlbCwKLSAgICAgICAgICAgICAgICAobG9uZykgbG9vcF9pdGVycyk7CisgICAgICAgICAgICAgICAgIiAgTE9PUCBsZXZlbCAlLjIwZyBoYXMgJS4yMGcgaXRlcmF0aW9ucyAiLChkb3VibGUpIGxvb3BfbGV2ZWwsCisgICAgICAgICAgICAgICAgKGRvdWJsZSkgbG9vcF9pdGVycyk7CiAgICAgICAgICAgICBpZiAobG9vcF9pdGVycyA9PSAwKQogICAgICAgICAgICAgICBza2lwcGluZ19sb29wPWxvb3BfbGV2ZWw7CiAgICAgICAgICAgICBlbHNlCkBAIC00NzQwLDggKzQ3NDEsOCBAQAogICAgICAgICAgICAgICAgICAgICBtbmdfaW5mby0+bG9vcF9pdGVyYXRpb25bbG9vcF9sZXZlbF0rKzsKICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiICBFTkRMOiBMT09QIGxldmVsICVsZCAgaGFzICVsZCByZW1haW5pbmcgaXRlcmF0aW9ucyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGxvb3BfbGV2ZWwsKGxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAiICBFTkRMOiBMT09QIGxldmVsICUuMjBnIGhhcyAlLjIwZyByZW1haW5pbmcgaXRlcmF0aW9ucyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgbG9vcF9sZXZlbCwoZG91YmxlKQogICAgICAgICAgICAgICAgICAgICAgICAgbW5nX2luZm8tPmxvb3BfY291bnRbbG9vcF9sZXZlbF0pOwogICAgICAgICAgICAgICAgICAgICBpZiAobW5nX2luZm8tPmxvb3BfY291bnRbbG9vcF9sZXZlbF0gIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICB7CkBAIC01MDcwLDkgKzUwNzEsOCBAQAogICAgICAgICAgICAgICAgICh2b2lkKSBTZXRJbWFnZUJhY2tncm91bmRDb2xvcihpbWFnZSk7CiAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIiAgSW5zZXJ0ZWQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBsYXllciwgVz0lbHVkLCBIPSVsdWQiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbW5nX2luZm8tPm1uZ193aWR0aCwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgICAgICAgICAgbW5nX2luZm8tPm1uZ19oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAiICBJbnNlcnRlZCB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIGxheWVyLCBXPSUuMjBnLCBIPSUuMjBnIiwKKyAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgbW5nX2luZm8tPm1uZ193aWR0aCwoZG91YmxlKSBtbmdfaW5mby0+bW5nX2hlaWdodCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIC8qCkBAIC01MTE4LDkgKzUxMTgsOSBAQAogICAgICAgICAgICAgKHZvaWQpIFNldEltYWdlQmFja2dyb3VuZENvbG9yKGltYWdlKTsKICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAiICBJbnNlcnRlZCBiYWNrZ3JvdW5kIGxheWVyLCBMPSVsZCwgUj0lbGQsIFQ9JWxkLCBCPSVsZCIsCi0gICAgICAgICAgICAgICAgKGxvbmcpIG1uZ19pbmZvLT5jbGlwLmxlZnQsKGxvbmcpIG1uZ19pbmZvLT5jbGlwLnJpZ2h0LAotICAgICAgICAgICAgICAgIChsb25nKSBtbmdfaW5mby0+Y2xpcC50b3AsKGxvbmcpIG1uZ19pbmZvLT5jbGlwLmJvdHRvbSk7CisgICAgICAgICAgICAgICAgIiAgSW5zZXJ0ZWQgYmFja2dyb3VuZCBsYXllciwgTD0lLjIwZywgUj0lLjIwZyBUPSUuMjBnLCBCPSUuMjBnIiwKKyAgICAgICAgICAgICAgICAoZG91YmxlKSBtbmdfaW5mby0+Y2xpcC5sZWZ0LChkb3VibGUpIG1uZ19pbmZvLT5jbGlwLnJpZ2h0LAorICAgICAgICAgICAgICAgIChkb3VibGUpIG1uZ19pbmZvLT5jbGlwLnRvcCwoZG91YmxlKSBtbmdfaW5mby0+Y2xpcC5ib3R0b20pOwogICAgICAgICAgIH0KICNlbmRpZiAvKiBNTkdfSU5TRVJUX0xBWUVSUyAqLwogICAgICAgICBmaXJzdF9tbmdfb2JqZWN0PU1hZ2lja0ZhbHNlOwpAQCAtNTM1NCw4ICs1MzU0LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICIgICAgTWFnbmlmeSB0aGUgcm93cyB0byAlbHUiLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZS0+cm93cyk7CisgICAgICAgICAgICAgICAgICAgICIgICAgTWFnbmlmeSB0aGUgcm93cyB0byAlLjIwZyIsKGRvdWJsZSkgbGFyZ2VfaW1hZ2UtPnJvd3MpOwogICAgICAgICAgICAgICAgIG09KHNzaXplX3QpIG1uZ19pbmZvLT5tYWduX210OwogICAgICAgICAgICAgICAgIHl5PTA7CiAgICAgICAgICAgICAgICAgbGVuZ3RoPShzaXplX3QpIGltYWdlLT5jb2x1bW5zOwpAQCAtNTQ4Nyw4ICs1NDg2LDcgQEAKICAgICAgICAgICAgICAgICAvKiBtYWduaWZ5IHRoZSBjb2x1bW5zICovCiAgICAgICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIiAgICBNYWduaWZ5IHRoZSBjb2x1bW5zIHRvICVsdSIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgICAgICAgIGltYWdlLT5jb2x1bW5zKTsKKyAgICAgICAgICAgICAgICAgICAgIiAgICBNYWduaWZ5IHRoZSBjb2x1bW5zIHRvICUuMjBnIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucyk7CiAKICAgICAgICAgICAgICAgICBmb3IgKHk9MDsgeSA8IChzc2l6ZV90KSBpbWFnZS0+cm93czsgeSsrKQogICAgICAgICAgICAgICAgIHsKQEAgLTU4ODAsOCArNTg3OCw4IEBACiAgIGltYWdlLT5kZWxheT1maW5hbF9kZWxheTsKICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgaW1hZ2UtPmRlbGF5PSVsdSwgZmluYWxfZGVsYXk9JWx1IiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlbGF5LAotICAgICAgICAodW5zaWduZWQgbG9uZykgZmluYWxfZGVsYXkpOworICAgICAgICAiICBpbWFnZS0+ZGVsYXk9JS4yMGcsIGZpbmFsX2RlbGF5PSUuMjBnIiwoZG91YmxlKSBpbWFnZS0+ZGVsYXksCisgICAgICAgIChkb3VibGUpIGZpbmFsX2RlbGF5KTsKICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgewogICAgICAgaW50CkBAIC01ODkyLDEzICs1ODkwLDEyIEBACiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgIiAgQmVmb3JlIGNvYWxlc2NlOiIpOwogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgICAgc2NlbmUgMCBkZWxheT0lbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVsYXkpOworICAgICAgICAiICAgIHNjZW5lIDAgZGVsYXk9JS4yMGciLChkb3VibGUpIGltYWdlLT5kZWxheSk7CiAgICAgICB3aGlsZSAoR2V0TmV4dEltYWdlSW5MaXN0KGltYWdlKSAhPSAoSW1hZ2UgKikgTlVMTCkKICAgICAgIHsKICAgICAgICAgaW1hZ2U9R2V0TmV4dEltYWdlSW5MaXN0KGltYWdlKTsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgICBzY2VuZSAlbGQgZGVsYXk9JWx1IiwobG9uZykgc2NlbmUrKywodW5zaWduZWQgbG9uZykKLSAgICAgICAgICBpbWFnZS0+ZGVsYXkpOworICAgICAgICAgICIgICAgc2NlbmUgJS4yMGcgZGVsYXk9JS4yMGciLChkb3VibGUpIHNjZW5lKyssKGRvdWJsZSkgaW1hZ2UtPmRlbGF5KTsKICAgICAgIH0KICAgICB9CiAKQEAgLTU5NTksMTQgKzU5NTYsMTQgQEAKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAiICBBZnRlciBjb2FsZXNjZToiKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIHNjZW5lIDAgZGVsYXk9JWx1IGRpc3Bvc2U9JWxkIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlbGF5LAotICAgICAgICAobG9uZykgaW1hZ2UtPmRpc3Bvc2UpOworICAgICAgICAiICAgIHNjZW5lIDAgZGVsYXk9JS4yMGcgZGlzcG9zZT0lLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPmRlbGF5LAorICAgICAgICAoZG91YmxlKSBpbWFnZS0+ZGlzcG9zZSk7CiAgICAgICB3aGlsZSAoR2V0TmV4dEltYWdlSW5MaXN0KGltYWdlKSAhPSAoSW1hZ2UgKikgTlVMTCkKICAgICAgIHsKICAgICAgICAgaW1hZ2U9R2V0TmV4dEltYWdlSW5MaXN0KGltYWdlKTsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgICBzY2VuZSAlbGQgZGVsYXk9JWx1IGRpc3Bvc2U9JWxkIiwobG9uZykgc2NlbmUrKywKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlbGF5LChsb25nKSBpbWFnZS0+ZGlzcG9zZSk7CisgICAgICAgICAgIiAgICBzY2VuZSAlLjIwZyBkZWxheT0lLjIwZyBkaXNwb3NlPSUuMjBnIiwoZG91YmxlKSBzY2VuZSsrLAorICAgICAgICAgIChkb3VibGUpIGltYWdlLT5kZWxheSwoZG91YmxlKSBpbWFnZS0+ZGlzcG9zZSk7CiAgICAgICB9CiAgICB9CiAgIGltYWdlPUdldEZpcnN0SW1hZ2VJbkxpc3QoaW1hZ2UpOwpAQCAtNjI4NCw4ICs2MjgxLDggQEAKIAogICAgaWYgKGltYWdlX2luZm8tPnZlcmJvc2UpCiAgICAgIHsKLSAgICAgKHZvaWQpIHByaW50Zigid3JpdGluZyByYXcgcHJvZmlsZTogdHlwZT0lcywgbGVuZ3RoPSVsdVxuIiwKLSAgICAgICAoY2hhciAqKSBwcm9maWxlX3R5cGUsIGxlbmd0aCk7CisgICAgICh2b2lkKSBwcmludGYoIndyaXRpbmcgcmF3IHByb2ZpbGU6IHR5cGU9JXMsIGxlbmd0aD0lLjIwZ1xuIiwKKyAgICAgICAoY2hhciAqKSBwcm9maWxlX3R5cGUsIChkb3VibGUpIGxlbmd0aCk7CiAgICAgIH0KICAgIHRleHQ9KHBuZ190ZXh0cCkgcG5nX21hbGxvYyhwaW5nLChwbmdfdWludF8zMikgc2l6ZW9mKHBuZ190ZXh0KSk7CiAgICBkZXNjcmlwdGlvbl9sZW5ndGg9KHBuZ191aW50XzMyKSBzdHJsZW4oKGNvbnN0IGNoYXIgKikgcHJvZmlsZV9kZXNjcmlwdGlvbik7CkBAIC02NTU3LDE1ICs2NTU0LDE1IEBACiAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgIHsKICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgICAgd2lkdGg9JWx1IiwodW5zaWduZWQgbG9uZykgcGluZ193aWR0aCk7CisgICAgICAgICIgICAgd2lkdGg9JS4yMGciLChkb3VibGUpIHBpbmdfd2lkdGgpOwogICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBoZWlnaHQ9JWx1IiwodW5zaWduZWQgbG9uZykgcGluZ19oZWlnaHQpOworICAgICAgICAiICAgIGhlaWdodD0lLjIwZyIsKGRvdWJsZSkgcGluZ19oZWlnaHQpOwogICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBpbWFnZV9tYXR0ZT0lbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+bWF0dGUpOworICAgICAgICAiICAgIGltYWdlX21hdHRlPSUuMjBnIiwoZG91YmxlKSBpbWFnZS0+bWF0dGUpOwogICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBpbWFnZV9kZXB0aD0lbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVwdGgpOworICAgICAgICAiICAgIGltYWdlX2RlcHRoPSUuMjBnIiwoZG91YmxlKSBpbWFnZS0+ZGVwdGgpOwogICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICByZXF1ZXN0ZWQgUE5HIGltYWdlX2RlcHRoPSVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZXB0aCk7CisgICAgICAgICIgICAgcmVxdWVzdGVkIFBORyBpbWFnZV9kZXB0aD0lLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPmRlcHRoKTsKICAgICB9CiAgIHNhdmVfaW1hZ2VfZGVwdGg9aW1hZ2VfZGVwdGg7CiAgIHBpbmdfYml0X2RlcHRoPShwbmdfYnl0ZSkgc2F2ZV9pbWFnZV9kZXB0aDsKQEAgLTY2ODIsNyArNjY3OSw3IEBACiAgICAgICAgICAgICAgICh2b2lkKSBTeW5jSW1hZ2UoaW1hZ2UpOwogICAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICIgICAgQ29sb3JzIHF1YW50aXplZCB0byAlbGQiLCh1bnNpZ25lZCBsb25nKSBudW1iZXJfY29sb3JzKTsKKyAgICAgICAgICAgICAgICAgICIgICAgQ29sb3JzIHF1YW50aXplZCB0byAlLjIwZyIsKGRvdWJsZSkgbnVtYmVyX2NvbG9ycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKG1hdHRlKQogICAgICAgICAgICAgcG5nX3NldF9pbnZhbGlkKHBpbmcscGluZ19pbmZvLFBOR19JTkZPX3RSTlMpOwpAQCAtNjg4Nyw3ICs2ODg0LDcgQEAKICAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgIiAgICBOdW1iZXIgb2YgY29sb3JzOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZV9jb2xvcnMpOworICAgICAgICAgICAgICAgICIgICAgTnVtYmVyIG9mIGNvbG9yczogJS4yMGciLChkb3VibGUpIGltYWdlX2NvbG9ycyk7CiAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKICAgICAgICAgICAgICAgICAiICAgIFRlbnRhdGl2ZSBQTkcgYml0IGRlcHRoOiAlZCIscGluZ19iaXRfZGVwdGgpOwogICAgICAgICAgICAgIH0KQEAgLTY5MDMsNyArNjkwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBDb2xvcnMgaW5jcmVhc2VkIHRvICVsdSIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIENvbG9ycyBpbmNyZWFzZWQgdG8gJS4yMGciLChkb3VibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9jb2xvcnMpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CkBAIC02OTE0LDEzICs2OTExLDEzIEBACiAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgIHsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIFRlbnRhdGl2ZSBQTkcgY29sb3IgdHlwZTogJWQiLHBpbmdfY29sb3JfdHlwZSk7CisgICAgICAgICIgICAgVGVudGF0aXZlIFBORyBjb2xvciB0eXBlOiAlLjIwZyIsKGRvdWJsZSkgcGluZ19jb2xvcl90eXBlKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgIGltYWdlX2luZm8tPnR5cGU6ICVkIixpbWFnZV9pbmZvLT50eXBlKTsKKyAgICAgICAgIiAgICBpbWFnZV9pbmZvLT50eXBlOiAlLjIwZyIsKGRvdWJsZSkgaW1hZ2VfaW5mby0+dHlwZSk7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBpbWFnZV9kZXB0aDogJWx1IiwodW5zaWduZWQgbG9uZykgaW1hZ2VfZGVwdGgpOworICAgICAgICAiICAgIGltYWdlX2RlcHRoOiAlLjIwZyIsKGRvdWJsZSkgaW1hZ2VfZGVwdGgpOwogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgICAgcGluZ19iaXRfZGVwdGg6ICVkIixwaW5nX2JpdF9kZXB0aCk7CisgICAgICAgICIgICAgcGluZ19iaXRfZGVwdGg6ICUuMjBnIiwoZG91YmxlKSBwaW5nX2JpdF9kZXB0aCk7CiAgICAgfQogCiAgIGlmIChtYXR0ZSAmJiAobW5nX2luZm8tPm9wdGltaXplIHx8IG1uZ19pbmZvLT5Jc1BhbGV0dGUpKQpAQCAtNzYzNSw4ICs3NjMyLDcgQEAKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAiICBXcml0aW5nIFBORyBpbWFnZSBkYXRhIik7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBBbGxvY2F0aW5nICVsdSBieXRlcyBvZiBtZW1vcnkgZm9yIHBpeGVscyIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgIHJvd2J5dGVzKTsKKyAgICAgICAgIiAgICBBbGxvY2F0aW5nICUuMjBnIGJ5dGVzIG9mIG1lbW9yeSBmb3IgcGl4ZWxzIiwoZG91YmxlKSByb3dieXRlcyk7CiAgICAgfQogICBwbmdfcGl4ZWxzPSh1bnNpZ25lZCBjaGFyICopIEFjcXVpcmVRdWFudHVtTWVtb3J5KHJvd2J5dGVzLAogICAgIHNpemVvZigqcG5nX3BpeGVscykpOwpAQCAtNzg3Miw5ICs3ODY4LDkgQEAKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAiICBXcm90ZSBQTkcgaW1hZ2UgZGF0YSIpOwogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgICAgV2lkdGg6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIHBpbmdfd2lkdGgpOworICAgICAgICAiICAgIFdpZHRoOiAlLjIwZyIsKGRvdWJsZSkgcGluZ193aWR0aCk7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBIZWlnaHQ6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIHBpbmdfaGVpZ2h0KTsKKyAgICAgICAgIiAgICBIZWlnaHQ6ICUuMjBnIiwoZG91YmxlKSBwaW5nX2hlaWdodCk7CiAgICAgICBpZiAobW5nX2luZm8tPndyaXRlX3BuZ19kZXB0aCkKICAgICAgICAgewogICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLApAQCAtODM4NCw4ICs4MzgwLDggQEAKICAgICAgICAgICBqbmdfYWxwaGFfc2FtcGxlX2RlcHRoPTg7CiAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgU3VjY2Vzc2Z1bGx5IHJlYWQganBlZ19pbWFnZSBpbnRvIGEgYmxvYiwgbGVuZ3RoPSVsdS4iLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgIiAgU3VjY2Vzc2Z1bGx5IHJlYWQganBlZ19pbWFnZSBpbnRvIGEgYmxvYiwgbGVuZ3RoPSUuMjBnLiIsCisgICAgICAgICAgICAgIChkb3VibGUpIGxlbmd0aCk7CiAKICAgICAgICAgfQogICAgICAgLyogRGVzdHJveSBKUEVHIGltYWdlIGFuZCBpbWFnZV9pbmZvICovCkBAIC04NjA5LDcgKzg2MDUsNyBAQAogICAgICAgICAgIC8qIFdyaXRlIElEQVQgY2h1bmsgaGVhZGVyICovCiAgICAgICAgICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgV3JpdGUgSURBVCBjaHVua3MgZnJvbSBibG9iLCBsZW5ndGg9JWx1LiIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICIgIFdyaXRlIElEQVQgY2h1bmtzIGZyb20gYmxvYiwgbGVuZ3RoPSUuMjBnLiIsKGRvdWJsZSkKICAgICAgICAgICAgICAgbGVuZ3RoKTsKIAogICAgICAgICAgIC8qIENvcHkgSURBVCBjaHVua3MgKi8KQEAgLTg2MzIsOCArODYyOCw4IEBACiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAobG9nZ2luZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAiICAgIFNraXBwaW5nICVjJWMlYyVjIGNodW5rLCBsZW5ndGg9JWx1LiIsCi0gICAgICAgICAgICAgICAgICAgICoocCksKihwKzEpLCoocCsyKSwqKHArMyksKHVuc2lnbmVkIGxvbmcpIGxlbik7CisgICAgICAgICAgICAgICAgICAgICIgICAgU2tpcHBpbmcgJWMlYyVjJWMgY2h1bmssIGxlbmd0aD0lLjIwZy4iLAorICAgICAgICAgICAgICAgICAgICAqKHApLCoocCsxKSwqKHArMiksKihwKzMpLChkb3VibGUpIGxlbik7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHArPSg4K2xlbik7CiAgICAgICAgICAgfQpAQCAtODY0Myw3ICs4NjM5LDcgQEAKICAgICAgICAgICAvKiBXcml0ZSBKREFBIGNodW5rIGhlYWRlciAqLwogICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICIgIFdyaXRlIEpEQUEgY2h1bmssIGxlbmd0aD0lbHUuIiwodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgIiAgV3JpdGUgSkRBQSBjaHVuaywgbGVuZ3RoPSUuMjBnLiIsKGRvdWJsZSkgbGVuZ3RoKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iTVNCVUxvbmcoaW1hZ2UsKHNpemVfdCkgbGVuZ3RoKTsKICAgICAgICAgICBQTkdUeXBlKGNodW5rLG1uZ19KREFBKTsKICAgICAgICAgICBMb2dQTkdDaHVuaygoaW50KSBsb2dnaW5nLG1uZ19KREFBLGxlbmd0aCk7CkBAIC04NjgyLDggKzg2NzgsOCBAQAogCiAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgIiAgQ3JlYXRlZCBqcGVnX2ltYWdlLCAlbHUgeCAlbHUuIiwodW5zaWduZWQgbG9uZykganBlZ19pbWFnZS0+Y29sdW1ucywKLSAgICAgICh1bnNpZ25lZCBsb25nKSBqcGVnX2ltYWdlLT5yb3dzKTsKKyAgICAgICIgIENyZWF0ZWQganBlZ19pbWFnZSwgJS4yMGcgeCAlLjIwZy4iLChkb3VibGUpIGpwZWdfaW1hZ2UtPmNvbHVtbnMsCisgICAgICAoZG91YmxlKSBqcGVnX2ltYWdlLT5yb3dzKTsKIAogICBpZiAoam5nX2NvbG9yX3R5cGUgPT0gOCB8fCBqbmdfY29sb3JfdHlwZSA9PSAxMikKICAgICBqcGVnX2ltYWdlX2luZm8tPnR5cGU9R3JheXNjYWxlVHlwZTsKQEAgLTg2OTcsMTEgKzg2OTMsMTEgQEAKICAgaWYgKGxvZ2dpbmcgIT0gTWFnaWNrRmFsc2UpCiAgICAgewogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgIFN1Y2Nlc3NmdWxseSByZWFkIGpwZWdfaW1hZ2UgaW50byBhIGJsb2IsIGxlbmd0aD0lbHUuIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxlbmd0aCk7CisgICAgICAgICIgIFN1Y2Nlc3NmdWxseSByZWFkIGpwZWdfaW1hZ2UgaW50byBhIGJsb2IsIGxlbmd0aD0lLjIwZy4iLAorICAgICAgICAoZG91YmxlKSBsZW5ndGgpOwogCiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgV3JpdGUgSkRBVCBjaHVuaywgbGVuZ3RoPSVsdS4iLCh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgICAiICBXcml0ZSBKREFUIGNodW5rLCBsZW5ndGg9JS4yMGcuIiwoZG91YmxlKSBsZW5ndGgpOwogICAgIH0KICAgLyogV3JpdGUgSkRBVCBjaHVuayhzKSAqLwogICAodm9pZCkgV3JpdGVCbG9iTVNCVUxvbmcoaW1hZ2UsKHNpemVfdCkgbGVuZ3RoKTsKQEAgLTg5NDEsNyArODkzNyw3IEBACiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAgICIgICAgT3B0aW1pemU6IEZBTFNFIik7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgICBJbWFnZV9pbmZvIGRlcHRoOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZV9pbmZvLT5kZXB0aCk7CisgICAgICAgICIgICAgSW1hZ2VfaW5mbyBkZXB0aDogJS4yMGciLChkb3VibGUpIGltYWdlX2luZm8tPmRlcHRoKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAogICAgICAgICAiICAgIFR5cGU6ICVkIixpbWFnZV9pbmZvLT50eXBlKTsKIApAQCAtODk0OSw5ICs4OTQ1LDkgQEAKICAgICAgIGZvciAocD1pbWFnZTsgcCAhPSAoSW1hZ2UgKikgTlVMTDsgcD1HZXROZXh0SW1hZ2VJbkxpc3QocCkpCiAgICAgICB7CiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICIgICAgU2NlbmU6ICVsdSIsKHVuc2lnbmVkIGxvbmcpIHNjZW5lKyspOworICAgICAgICAgICIgICAgU2NlbmU6ICUuMjBnIiwoZG91YmxlKSBzY2VuZSsrKTsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgICAgIEltYWdlIGRlcHRoOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBwLT5kZXB0aCk7CisgICAgICAgICAgIiAgICAgIEltYWdlIGRlcHRoOiAlLjIwZyIsKGRvdWJsZSkgcC0+ZGVwdGgpOwogICAgICAgICBpZiAocC0+bWF0dGUpCiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgICAiICAgICAgTWF0dGU6IFRydWUiKTsKQEAgLTg5NjYsNyArODk2Miw3IEBACiAgICAgICAgICAgICAiICAgICAgU3RvcmFnZSBjbGFzczogRGlyZWN0Q2xhc3MiKTsKICAgICAgICAgaWYgKHAtPmNvbG9ycykKICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICIgICAgICBOdW1iZXIgb2YgY29sb3JzOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBwLT5jb2xvcnMpOworICAgICAgICAgICAgIiAgICAgIE51bWJlciBvZiBjb2xvcnM6ICUuMjBnIiwoZG91YmxlKSBwLT5jb2xvcnMpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCiAgICAgICAgICAgICAiICAgICAgTnVtYmVyIG9mIGNvbG9yczogdW5zcGVjaWZpZWQiKTsKQEAgLTkyOTksMTUgKzkyOTUsMTQgQEAKICAgICAgICAgIGlmIChsb2dnaW5nICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAiICAgICBURVJNIGRlbGF5OiAlbHUiLAotICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChtbmdfaW5mby0+dGlja3NfcGVyX3NlY29uZCoKLSAgICAgICAgICAgICAgICAgIGZpbmFsX2RlbGF5L01hZ2lja01heChpbWFnZS0+dGlja3NfcGVyX3NlY29uZCwxKSkpOworICAgICAgICAgICAgICAgIiAgICAgVEVSTSBkZWxheTogJS4yMGciLChkb3VibGUpIChtbmdfaW5mby0+dGlja3NfcGVyX3NlY29uZCoKKyAgICAgICAgICAgICAgZmluYWxfZGVsYXkvTWFnaWNrTWF4KGltYWdlLT50aWNrc19wZXJfc2Vjb25kLDEpKSk7CiAgICAgICAgICAgICAgaWYgKGltYWdlLT5pdGVyYXRpb25zID09IDApCiAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgIiAgICAgVEVSTSBpdGVyYXRpb25zOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBQTkdfVUlOVF8zMV9NQVgpOworICAgICAgICAgICAgICAgICAiICAgICBURVJNIGl0ZXJhdGlvbnM6ICUuMjBnIiwoZG91YmxlKSBQTkdfVUlOVF8zMV9NQVgpOwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAiICAgICBJbWFnZSBpdGVyYXRpb25zOiAlbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+aXRlcmF0aW9ucyk7CisgICAgICAgICAgICAgICAgICIgICAgIEltYWdlIGl0ZXJhdGlvbnM6ICUuMjBnIiwoZG91YmxlKSBpbWFnZS0+aXRlcmF0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2IoaW1hZ2UsMTQsY2h1bmspOwogICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYk1TQlVMb25nKGltYWdlLGNyYzMyKDAsY2h1bmssMTQpKTsKZGlmZiAtLWdpdCBhL2NvZGVycy9wbm0uYyBiL2NvZGVycy9wbm0uYwppbmRleCA5MzEzYjcyLi45MWQ2N2YzIDEwMDY0NAotLS0gYS9jb2RlcnMvcG5tLmMKKysrIGIvY29kZXJzL3BubS5jCkBAIC0xNTcwLDggKzE1NzAsOCBAQAogICAgICAgewogICAgICAgICBpZiAoaW1hZ2UtPmNvbG9yc3BhY2UgIT0gUkdCQ29sb3JzcGFjZSkKICAgICAgICAgICAodm9pZCkgVHJhbnNmb3JtSW1hZ2VDb2xvcnNwYWNlKGltYWdlLFJHQkNvbG9yc3BhY2UpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgJWx1XG4iLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAlLjIwZ1xuIiwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgIH0KICAgICBlbHNlCkBAIC0xNTgzLDggKzE1ODMsOCBAQAogICAgICAgICAgIFBBTSBoZWFkZXIuCiAgICAgICAgICovCiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgIldJRFRIICVsdVxuSEVJR0hUICVsdVxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgICAiV0lEVEggJS4yMGdcbkhFSUdIVCAlLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5yb3dzKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICBxdWFudHVtX3R5cGU9R2V0UXVhbnR1bVR5cGUoaW1hZ2UsJmltYWdlLT5leGNlcHRpb24pOwogICAgICAgICBzd2l0Y2ggKHF1YW50dW1fdHlwZSkKQEAgLTE2MjEsNyArMTYyMSw3IEBACiAgICAgICAgIGlmIChpbWFnZS0+ZGVwdGggPiAxNikKICAgICAgICAgICBpbWFnZS0+ZGVwdGg9MTY7CiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgIkRFUFRIICVsdVxuTUFYVkFMICVsdVxuIiwodW5zaWduZWQgbG9uZykgcGFja2V0X3NpemUsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgIkRFUFRIICUuMjBnXG5NQVhWQUwgJS4yMGdcbiIsKGRvdWJsZSkgcGFja2V0X3NpemUsKGRvdWJsZSkKICAgICAgICAgICBHZXRRdWFudHVtUmFuZ2UoaW1hZ2UtPmRlcHRoKSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiVFVQTFRZUEUgJXNcbkVOREhEUlxuIiwKQEAgLTE4NTMsNyArMTg1Myw3IEBACiAgICAgICAgICovCiAgICAgICAgIGlmIChpbWFnZS0+ZGVwdGggPiA4KQogICAgICAgICAgIGltYWdlLT5kZXB0aD0xNjsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1XG4iLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKQogICAgICAgICAgIEdldFF1YW50dW1SYW5nZShpbWFnZS0+ZGVwdGgpKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICBxdWFudHVtX2luZm89QWNxdWlyZVF1YW50dW1JbmZvKChjb25zdCBJbWFnZUluZm8gKikgTlVMTCxpbWFnZSk7CkBAIC0xOTM2LDcgKzE5MzYsNyBAQAogICAgICAgICAqLwogICAgICAgICBpZiAoaW1hZ2UtPmRlcHRoID4gOCkKICAgICAgICAgICBpbWFnZS0+ZGVwdGg9MTY7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdVxuIiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsKGRvdWJsZSkKICAgICAgICAgICBHZXRRdWFudHVtUmFuZ2UoaW1hZ2UtPmRlcHRoKSk7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgcXVhbnR1bV9pbmZvPUFjcXVpcmVRdWFudHVtSW5mbygoY29uc3QgSW1hZ2VJbmZvICopIE5VTEwsaW1hZ2UpOwpkaWZmIC0tZ2l0IGEvY29kZXJzL3BzLmMgYi9jb2RlcnMvcHMuYwppbmRleCBjZGQwOTg4Li44NmNjODU5IDEwMDY0NAotLS0gYS9jb2RlcnMvcHMuYworKysgYi9jb2RlcnMvcHMuYwpAQCAtNjIyLDggKzYyMiw4IEBACiAgICAgICAgIC8qCiAgICAgICAgICAgTm90ZSBzcG90IG5hbWVzLgogICAgICAgICAqLwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHByb3BlcnR5LE1heFRleHRFeHRlbnQsInBzOlNwb3RDb2xvci0lbHUiLAotICAgICAgICAgIHNwb3Rjb2xvcisrKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwcm9wZXJ0eSxNYXhUZXh0RXh0ZW50LCJwczpTcG90Q29sb3ItJS4yMGciLAorICAgICAgICAgIChkb3VibGUpIChzcG90Y29sb3IrKykpOwogICAgICAgICBmb3IgKHA9Y29tbWFuZDsgKnAgIT0gJ1wwJzsgcCsrKQogICAgICAgICAgIGlmIChpc3NwYWNlKChpbnQpICh1bnNpZ25lZCBjaGFyKSAqcCkgIT0gMCkKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzMxLDggKzczMSw4IEBACiAgIHBhZ2Uud2lkdGg9KHNpemVfdCkgZmxvb3IocGFnZS53aWR0aCppbWFnZS0+eF9yZXNvbHV0aW9uL2RlbHRhLngrMC41KTsKICAgcGFnZS5oZWlnaHQ9KHNpemVfdCkgZmxvb3IocGFnZS5oZWlnaHQqaW1hZ2UtPnlfcmVzb2x1dGlvbi9kZWx0YS55KwogICAgIDAuNSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcob3B0aW9ucyxNYXhUZXh0RXh0ZW50LCItZyVsdXglbHUgIiwKLSAgICAodW5zaWduZWQgbG9uZykgcGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgcGFnZS5oZWlnaHQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG9wdGlvbnMsTWF4VGV4dEV4dGVudCwiLWclLjIwZ3glLjIwZyAiLChkb3VibGUpCisgICAgcGFnZS53aWR0aCwoZG91YmxlKSBwYWdlLmhlaWdodCk7CiAgIHJlYWRfaW5mbz1DbG9uZUltYWdlSW5mbyhpbWFnZV9pbmZvKTsKICAgKnJlYWRfaW5mby0+bWFnaWNrPSdcMCc7CiAgIGlmIChyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMgIT0gMCkKQEAgLTc0MCw4ICs3NDAsOCBAQAogICAgICAgY2hhcgogICAgICAgICBwYWdlc1tNYXhUZXh0RXh0ZW50XTsKIAotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlcyxNYXhUZXh0RXh0ZW50LCItZEZpcnN0UGFnZT0lbHUgIgotICAgICAgICAiLWRMYXN0UGFnZT0lbHUiLCh1bnNpZ25lZCBsb25nKSByZWFkX2luZm8tPnNjZW5lKzEsKHVuc2lnbmVkIGxvbmcpCisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VzLE1heFRleHRFeHRlbnQsIi1kRmlyc3RQYWdlPSUuMjBnICIKKyAgICAgICAgIi1kTGFzdFBhZ2U9JS4yMGciLChkb3VibGUpIHJlYWRfaW5mby0+c2NlbmUrMSwoZG91YmxlKQogICAgICAgICAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKICAgICAgICh2b2lkKSBDb25jYXRlbmF0ZU1hZ2lja1N0cmluZyhvcHRpb25zLHBhZ2VzLE1heFRleHRFeHRlbnQpOwogICAgICAgcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzPTA7CkBAIC0xNDI0LDE1ICsxNDI0LDE1IEBACiAgICAgICAgIHJlc29sdXRpb24ueT0oc2l6ZV90KSAoMTAwLjAqMi41NCpyZXNvbHV0aW9uLnkrMC41KS8xMDAuMDsKICAgICAgIH0KICAgICBTZXRHZW9tZXRyeShpbWFnZSwmZ2VvbWV0cnkpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyIsCisgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgaWYgKGltYWdlX2luZm8tPnBhZ2UgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksaW1hZ2VfaW5mby0+cGFnZSxNYXhUZXh0RXh0ZW50KTsKICAgICBlbHNlCiAgICAgICBpZiAoKGltYWdlLT5wYWdlLndpZHRoICE9IDApICYmIChpbWFnZS0+cGFnZS5oZWlnaHQgIT0gMCkpCi0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2UuaGVpZ2h0LAotICAgICAgICAgIChsb25nKSBpbWFnZS0+cGFnZS54LChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBneCUrLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPnBhZ2Uud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICBpbWFnZS0+cGFnZS5oZWlnaHQsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueCwoZG91YmxlKSBpbWFnZS0+cGFnZS55KTsKICAgICAgIGVsc2UKICAgICAgICAgaWYgKChpbWFnZS0+Z3Jhdml0eSAhPSBVbmRlZmluZWRHcmF2aXR5KSAmJgogICAgICAgICAgICAgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQUyIpID09IDApKQpAQCAtMTQ5MCw5ICsxNDkwLDggQEAKICAgICAgICAgZWxzZQogICAgICAgICAgIHsKICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICIlJSUlQm91bmRpbmdCb3g6ICVsZCAlbGQgJWxkICVsZFxuIiwobG9uZykgY2VpbChib3VuZHMueDEtMC41KSwKLSAgICAgICAgICAgICAgKGxvbmcpIGNlaWwoYm91bmRzLnkxLTAuNSksKGxvbmcpIGZsb29yKGJvdW5kcy54MiswLjUpLChsb25nKQotICAgICAgICAgICAgICBmbG9vcihib3VuZHMueTIrMC41KSk7CisgICAgICAgICAgICAgICIlJSUlQm91bmRpbmdCb3g6ICUuMjBnICUuMjBnICUuMjBnICUuMjBnXG4iLGNlaWwoYm91bmRzLngxLTAuNSksCisgICAgICAgICAgICAgIGNlaWwoYm91bmRzLnkxLTAuNSksZmxvb3IoYm91bmRzLngyKzAuNSksZmxvb3IoYm91bmRzLnkyKzAuNSkpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKICAgICAgICAgICAgICAgIiUlJSVIaVJlc0JvdW5kaW5nQm94OiAlZyAlZyAlZyAlZ1xuIixib3VuZHMueDEsCkBAIC0xNTA2LDggKzE1MDUsNyBAQAogICAgICAgICAgICAgICBFbWJlZCBQaG90b3Nob3AgcHJvZmlsZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgICAiJSVCZWdpblBob3Rvc2hvcDogJWx1IiwodW5zaWduZWQgbG9uZykgR2V0U3RyaW5nSW5mb0xlbmd0aCgKLSAgICAgICAgICAgICAgcHJvZmlsZSkpOworICAgICAgICAgICAgICAiJSVCZWdpblBob3Rvc2hvcDogJS4yMGciLChkb3VibGUpIEdldFN0cmluZ0luZm9MZW5ndGgocHJvZmlsZSkpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICAgZm9yIChpPTA7IGkgPCAoc3NpemVfdCkgR2V0U3RyaW5nSW5mb0xlbmd0aChwcm9maWxlKTsgaSsrKQogICAgICAgICAgICAgewpAQCAtMTUyNyw3ICsxNTI1LDcgQEAKICAgICAgICAgICAgICovCiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCJcbiViZWdpbl94bWxfY29kZVxuIik7CiAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgICAgIlxuJSViZWdpbl94bWxfcGFja2V0OiAlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICAiXG4lJWJlZ2luX3htbF9wYWNrZXQ6ICUuMjBnXG4iLChkb3VibGUpCiAgICAgICAgICAgICAgICBHZXRTdHJpbmdJbmZvTGVuZ3RoKHByb2ZpbGUpKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIEdldFN0cmluZ0luZm9MZW5ndGgocHJvZmlsZSk7IGkrKykKQEAgLTE1NDksOSArMTU0Nyw5IEBACiAgICAgICAgICAgICAqLwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVPcmllbnRhdGlvbjogUG9ydHJhaXRcbiIpOwogICAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiJSVQYWdlT3JkZXI6IEFzY2VuZFxuIik7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZXM6ICVsdVxuIiwKLSAgICAgICAgICAgICAgaW1hZ2VfaW5mby0+YWRqb2luICE9IE1hZ2lja0ZhbHNlID8gKHNpemVfdCkKLSAgICAgICAgICAgICAgR2V0SW1hZ2VMaXN0TGVuZ3RoKGltYWdlKSA6IDFVTCk7CisgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZXM6ICUuMjBnXG4iLAorICAgICAgICAgICAgICBpbWFnZV9pbmZvLT5hZGpvaW4gIT0gTWFnaWNrRmFsc2UgPyAoZG91YmxlKQorICAgICAgICAgICAgICBHZXRJbWFnZUxpc3RMZW5ndGgoaW1hZ2UpIDogMS4wKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiUlRW5kQ29tbWVudHNcbiIpOwpAQCAtMTU4MywxMCArMTU4MSwxMCBAQAogICAgICAgICAgICAgICBEdW1wIGltYWdlIGFzIGJpdG1hcC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgICAiJSUlJUJlZ2luUHJldmlldzogJWx1ICVsdSAlbHUgJWx1XG4lJSAgIiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgICAgcHJldmlld19pbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgcHJldmlld19pbWFnZS0+cm93cywxVUwsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAoKCgocHJldmlld19pbWFnZS0+Y29sdW1ucys3KSA+PiAzKSoKLSAgICAgICAgICAgICAgcHJldmlld19pbWFnZS0+cm93cyszNSkvMzYpKTsKKyAgICAgICAgICAgICAgIiUlJSVCZWdpblByZXZpZXc6ICUuMjBnICUuMjBnICUuMjBnICUuMjBnXG4lJSAgIiwoZG91YmxlKQorICAgICAgICAgICAgICBwcmV2aWV3X2ltYWdlLT5jb2x1bW5zLChkb3VibGUpIHByZXZpZXdfaW1hZ2UtPnJvd3MsMS4wLAorICAgICAgICAgICAgICAoZG91YmxlKSAoKCgocHJldmlld19pbWFnZS0+Y29sdW1ucys3KSA+PiAzKSpwcmV2aWV3X2ltYWdlLT5yb3dzKworICAgICAgICAgICAgICAzNSkvMzYpKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAgIHE9cGl4ZWxzOwogICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKQEAgLTE2NjgsMTIgKzE2NjYsMTIgQEAKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwifSBiaW5kIGRlZlxuIik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiUlRW5kUHJvbG9nXG4iKTsKICAgICAgIH0KLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZTogIDEgJWx1XG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIHBhZ2UrKyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJSUlJVBhZ2U6ICAxICUuMjBnXG4iLAorICAgICAgKGRvdWJsZSkgKHBhZ2UrKykpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgIiUlJSVQYWdlQm91bmRpbmdCb3g6ICVsZCAlbGQgJWxkICVsZFxuIiwobG9uZykgZ2VvbWV0cnkueCwobG9uZykKLSAgICAgIGdlb21ldHJ5LnksZ2VvbWV0cnkueCsobG9uZykgZ2VvbWV0cnkud2lkdGgsZ2VvbWV0cnkueSsobG9uZykKKyAgICAgICIlJSUlUGFnZUJvdW5kaW5nQm94OiAlLjIwZyAlLjIwZyAlLjIwZyAlLjIwZ1xuIiwoZG91YmxlKSBnZW9tZXRyeS54LAorICAgICAgKGRvdWJsZSkgZ2VvbWV0cnkueSxnZW9tZXRyeS54Kyhkb3VibGUpIGdlb21ldHJ5LndpZHRoLGdlb21ldHJ5LnkrKGRvdWJsZSkKICAgICAgIChnZW9tZXRyeS5oZWlnaHQrdGV4dF9zaXplKSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIGlmICgoZG91YmxlKSBnZW9tZXRyeS54IDwgYm91bmRzLngxKQpAQCAtMTY5Myw4ICsxNjkxLDggQEAKICAgICAvKgogICAgICAgT3V0cHV0IGltYWdlIGRhdGEuCiAgICAgKi8KLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbGQgJWxkXG4lZyAlZ1xuJWdcbiIsCi0gICAgICAobG9uZykgZ2VvbWV0cnkueCwobG9uZykgZ2VvbWV0cnkueSxzY2FsZS54LHNjYWxlLnkscG9pbnRzaXplKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAlLjIwZ1xuJWcgJWdcbiVnXG4iLAorICAgICAgKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSBnZW9tZXRyeS55LHNjYWxlLngsc2NhbGUueSxwb2ludHNpemUpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBsYWJlbHM9KGNoYXIgKiopIE5VTEw7CiAgICAgdmFsdWU9R2V0SW1hZ2VQcm9wZXJ0eShpbWFnZSwibGFiZWwiKTsKQEAgLTE3MjcsOCArMTcyNSw4IEBACiAgICAgICAgICAgICAgIER1bXAgaW1hZ2UgYXMgZ3JheXNjYWxlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICIlbHUgJWx1XG4xXG4xXG4xXG44XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgICAgICAgIiUuMjBnICUuMjBnXG4xXG4xXG4xXG44XG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpCisgICAgICAgICAgICAgIGltYWdlLT5yb3dzKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAgIHE9cGl4ZWxzOwogICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKQEAgLTE3NzYsOCArMTc3NCw4IEBACiAgICAgICAgICAgICAgIER1bXAgaW1hZ2UgYXMgYml0bWFwLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICIlbHUgJWx1XG4xXG4xXG4xXG4xXG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgICAgICAgIiUuMjBnICUuMjBnXG4xXG4xXG4xXG4xXG4iLChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpCisgICAgICAgICAgICAgIGltYWdlLT5yb3dzKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAgIHE9cGl4ZWxzOwogICAgICAgICAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKQEAgLTE4NDMsOCArMTg0MSw4IEBACiAgICAgICAgICAgLyoKICAgICAgICAgICAgIER1bXAgRGlyZWN0Q2xhc3MgaW1hZ2UuCiAgICAgICAgICAgKi8KLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgJWx1XG4wXG4lZFxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsCisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcgJS4yMGdcbjBcbiVkXG4iLAorICAgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MsCiAgICAgICAgICAgICBpbWFnZV9pbmZvLT5jb21wcmVzc2lvbiA9PSBSTEVDb21wcmVzc2lvbiA/IDEgOiAwKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgc3dpdGNoIChpbWFnZV9pbmZvLT5jb21wcmVzc2lvbikKQEAgLTE5NjgsMTUgKzE5NjYsMTUgQEAKICAgICAgICAgICAvKgogICAgICAgICAgICAgRHVtcCBQc2V1ZG9DbGFzcyBpbWFnZS4KICAgICAgICAgICAqLwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAlbHVcbiVkXG4lZFxuMFxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsCi0gICAgICAgICAgICBpbWFnZS0+c3RvcmFnZV9jbGFzcyA9PSBQc2V1ZG9DbGFzcyA/IDEgOiAwLAorICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCisgICAgICAgICAgICAiJS4yMGcgJS4yMGdcbiVkXG4lZFxuMFxuIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKQorICAgICAgICAgICAgaW1hZ2UtPnJvd3MsaW1hZ2UtPnN0b3JhZ2VfY2xhc3MgPT0gUHNldWRvQ2xhc3MgPyAxIDogMCwKICAgICAgICAgICAgIGltYWdlX2luZm8tPmNvbXByZXNzaW9uID09IFJMRUNvbXByZXNzaW9uID8gMSA6IDApOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAvKgogICAgICAgICAgICAgRHVtcCBudW1iZXIgb2YgY29sb3JzIGFuZCBjb2xvcm1hcC4KICAgICAgICAgICAqLwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdVxuIiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZ1xuIiwoZG91YmxlKQogICAgICAgICAgICAgaW1hZ2UtPmNvbG9ycyk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIGltYWdlLT5jb2xvcnM7IGkrKykKQEAgLTIxMDYsOSArMjEwNCw4IEBACiAgIGlmIChwYWdlID4gMikKICAgICB7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAiJSUlJUJvdW5kaW5nQm94OiAlbGQgJWxkICVsZCAlbGRcbiIsKGxvbmcpIGNlaWwoYm91bmRzLngxLTAuNSksCi0gICAgICAgIChsb25nKSBjZWlsKGJvdW5kcy55MS0wLjUpLChsb25nKSBmbG9vcihib3VuZHMueDIrMC41KSwobG9uZykKLSAgICAgICAgZmxvb3IoYm91bmRzLnkyKzAuNSkpOworICAgICAgICAiJSUlJUJvdW5kaW5nQm94OiAlLjIwZyAlLjIwZyAlLjIwZyAlLjIwZ1xuIixjZWlsKGJvdW5kcy54MS0wLjUpLAorICAgICAgICBjZWlsKGJvdW5kcy55MS0wLjUpLGZsb29yKGJvdW5kcy54MiswLjUpLGZsb29yKGJvdW5kcy55MiswLjUpKTsKICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCiAgICAgICAgICIlJSUlSGlSZXNCb3VuZGluZ0JveDogJWcgJWcgJWcgJWdcbiIsYm91bmRzLngxLGJvdW5kcy55MSwKZGlmZiAtLWdpdCBhL2NvZGVycy9wczIuYyBiL2NvZGVycy9wczIuYwppbmRleCBlNzVjNTQ4Li44MzM1MWQwIDEwMDY0NAotLS0gYS9jb2RlcnMvcHMyLmMKKysrIGIvY29kZXJzL3BzMi5jCkBAIC01MTUsMTUgKzUxNSwxNSBAQAogICAgICAgICByZXNvbHV0aW9uLnk9KHNpemVfdCkgKDEwMC4wKjIuNTQqcmVzb2x1dGlvbi55KzAuNSkvMTAwLjA7CiAgICAgICB9CiAgICAgU2V0R2VvbWV0cnkoaW1hZ2UsJmdlb21ldHJ5KTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJWx1eCVsdSIsCi0gICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGciLAorICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgIGlmIChpbWFnZV9pbmZvLT5wYWdlICE9IChjaGFyICopIE5VTEwpCiAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LGltYWdlX2luZm8tPnBhZ2UsTWF4VGV4dEV4dGVudCk7CiAgICAgZWxzZQogICAgICAgaWYgKChpbWFnZS0+cGFnZS53aWR0aCAhPSAwKSAmJiAoaW1hZ2UtPnBhZ2UuaGVpZ2h0ICE9IDApKQotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2Uud2lkdGgsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLmhlaWdodCwKLSAgICAgICAgICAobG9uZykgaW1hZ2UtPnBhZ2UueCwobG9uZykgaW1hZ2UtPnBhZ2UueSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZyUrLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPnBhZ2Uud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICBpbWFnZS0+cGFnZS5oZWlnaHQsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueCwoZG91YmxlKSBpbWFnZS0+cGFnZS55KTsKICAgICAgIGVsc2UKICAgICAgICAgaWYgKChpbWFnZS0+Z3Jhdml0eSAhPSBVbmRlZmluZWRHcmF2aXR5KSAmJgogICAgICAgICAgICAgKExvY2FsZUNvbXBhcmUoaW1hZ2VfaW5mby0+bWFnaWNrLCJQUyIpID09IDApKQpAQCAtNTgxLDkgKzU4MSw4IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICB7CiAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgICAiJSUlJUJvdW5kaW5nQm94OiAlbGQgJWxkICVsZCAlbGRcbiIsKGxvbmcpIGNlaWwoYm91bmRzLngxLTAuNSksCi0gICAgICAgICAgICAgIChsb25nKSBjZWlsKGJvdW5kcy55MS0wLjUpLChsb25nKSBmbG9vcihib3VuZHMueDIrMC41KSwobG9uZykKLSAgICAgICAgICAgICAgZmxvb3IoYm91bmRzLnkyKzAuNSkpOworICAgICAgICAgICAgICAiJSUlJUJvdW5kaW5nQm94OiAlLjIwZyAlLjIwZyAlLjIwZyAlLjIwZ1xuIixjZWlsKGJvdW5kcy54MS0wLjUpLAorICAgICAgICAgICAgICBjZWlsKGJvdW5kcy55MS0wLjUpLGZsb29yKGJvdW5kcy54MiswLjUpLGZsb29yKGJvdW5kcy55MiswLjUpKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCiAgICAgICAgICAgICAgICIlJSUlSGlSZXNCb3VuZGluZ0JveDogJWcgJWcgJWcgJWdcbiIsYm91bmRzLngxLApAQCAtNjA0LDggKzYwMyw4IEBACiAgICAgICAgICAgICBpZiAoaW1hZ2VfaW5mby0+YWRqb2luID09IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhidWZmZXIsIiUlUGFnZXM6IDFcbiIsTWF4VGV4dEV4dGVudCk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUlJSVQYWdlczogJWx1XG4iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBHZXRJbWFnZUxpc3RMZW5ndGgoaW1hZ2UpKTsKKyAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICAgICAiJSUlJVBhZ2VzOiAlLjIwZ1xuIiwoZG91YmxlKSBHZXRJbWFnZUxpc3RMZW5ndGgoaW1hZ2UpKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICB9CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiUlRW5kQ29tbWVudHNcbiIpOwpAQCAtNjcyLDEyICs2NzEsMTIgQEAKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwifSBiaW5kIGRlZlxuIik7CiAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiUlRW5kUHJvbG9nXG4iKTsKICAgICAgIH0KLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZTogIDEgJWx1XG4iLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIHBhZ2UrKyk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJSUlJVBhZ2U6ICAxICUuMjBnXG4iLAorICAgICAgKGRvdWJsZSkgcGFnZSsrKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICIlJSUlUGFnZUJvdW5kaW5nQm94OiAlbGQgJWxkICVsZCAlbGRcbiIsKGxvbmcpIGdlb21ldHJ5LngsKGxvbmcpCi0gICAgICBnZW9tZXRyeS55LCBnZW9tZXRyeS54Kyhsb25nKSBnZW9tZXRyeS53aWR0aCxnZW9tZXRyeS55Kyhsb25nKQorICAgICAgIiUlJSVQYWdlQm91bmRpbmdCb3g6ICUuMjBnICUuMjBnICUuMjBnICUuMjBnXG4iLChkb3VibGUpIGdlb21ldHJ5LngsCisgICAgICAoZG91YmxlKSBnZW9tZXRyeS55LGdlb21ldHJ5LngrKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsZ2VvbWV0cnkueSsoZG91YmxlKQogICAgICAgKGdlb21ldHJ5LmhlaWdodCt0ZXh0X3NpemUpKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgaWYgKChkb3VibGUpIGdlb21ldHJ5LnggPCBib3VuZHMueDEpCkBAIC03MDMsOCArNzAyLDggQEAKICAgICAvKgogICAgICAgT3V0cHV0IGltYWdlIGRhdGEuCiAgICAgKi8KLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbGQgJWxkXG4lZyAlZ1xuJWdcbiIsCi0gICAgICAobG9uZykgZ2VvbWV0cnkueCwobG9uZykgZ2VvbWV0cnkueSxzY2FsZS54LHNjYWxlLnkscG9pbnRzaXplKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAlLjIwZ1xuJWcgJWdcbiVnXG4iLAorICAgICAgKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSBnZW9tZXRyeS55LHNjYWxlLngsc2NhbGUueSxwb2ludHNpemUpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICBsYWJlbHM9KGNoYXIgKiopIE5VTEw7CiAgICAgdmFsdWU9R2V0SW1hZ2VQcm9wZXJ0eShpbWFnZSwibGFiZWwiKTsKQEAgLTcyOCw4ICs3MjcsOCBAQAogICAgICAgICAoKGltYWdlX2luZm8tPnR5cGUgIT0gVHJ1ZUNvbG9yVHlwZSkgJiYKICAgICAgICAgIChJc0dyYXlJbWFnZShpbWFnZSwmaW1hZ2UtPmV4Y2VwdGlvbikgIT0gTWFnaWNrRmFsc2UpKSkKICAgICAgIHsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1ICVsdVxuMVxuJWRcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywoaW50KQorICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAlLjIwZ1xuMVxuJWRcbiIsCisgICAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MsKGludCkKICAgICAgICAgICAoaW1hZ2UtPmNvbG9yc3BhY2UgPT0gQ01ZS0NvbG9yc3BhY2UpKTsKICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlZFxuIiwKQEAgLTgyNiw3ICs4MjUsOCBAQAogICAgICAgICAgICAgICAgICAgU2NhbGVRdWFudHVtVG9DaGFyKFBpeGVsSW50ZW5zaXR5VG9RdWFudHVtKHApKSk7CiAgICAgICAgICAgICAgICAgcCsrOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHByb2dyZXNzPVNldEltYWdlUHJvZ3Jlc3MoaW1hZ2UsU2F2ZUltYWdlVGFnLChNYWdpY2tPZmZzZXRUeXBlKSB5LGltYWdlLT5yb3dzKTsKKyAgICAgICAgICAgICAgcHJvZ3Jlc3M9U2V0SW1hZ2VQcm9ncmVzcyhpbWFnZSxTYXZlSW1hZ2VUYWcsKE1hZ2lja09mZnNldFR5cGUpCisgICAgICAgICAgICAgICAgeSxpbWFnZS0+cm93cyk7CiAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTgzOSw4ICs4MzksOCBAQAogICAgICAgaWYgKChpbWFnZS0+c3RvcmFnZV9jbGFzcyA9PSBEaXJlY3RDbGFzcykgfHwgKGltYWdlLT5jb2xvcnMgPiAyNTYpIHx8CiAgICAgICAgICAgKGNvbXByZXNzaW9uID09IEpQRUdDb21wcmVzc2lvbikgfHwgKGltYWdlLT5tYXR0ZSAhPSBNYWdpY2tGYWxzZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHUgJWx1XG4wXG4lZFxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsKGludCkKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyAlLjIwZ1xuMFxuJWRcbiIsCisgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cywoaW50KQogICAgICAgICAgICAgKGltYWdlLT5jb2xvcnNwYWNlID09IENNWUtDb2xvcnNwYWNlKSk7CiAgICAgICAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVkXG4iLApAQCAtOTc5LDE0ICs5NzksMTQgQEAKICAgICAgICAgICAvKgogICAgICAgICAgICAgRHVtcCBudW1iZXIgb2YgY29sb3JzIGFuZCBjb2xvcm1hcC4KICAgICAgICAgICAqLwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsdSAlbHVcbjFcbiVkXG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywoaW50KQorICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4xXG4lZFxuIiwKKyAgICAgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzLChpbnQpCiAgICAgICAgICAgICAoaW1hZ2UtPmNvbG9yc3BhY2UgPT0gQ01ZS0NvbG9yc3BhY2UpKTsKICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWRcbiIsCiAgICAgICAgICAgICAoaW50KSAoY29tcHJlc3Npb24gPT0gTm9Db21wcmVzc2lvbikpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsKGRvdWJsZSkKICAgICAgICAgICAgIGltYWdlLT5jb2xvcnMpOwogICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBpbWFnZS0+Y29sb3JzOyBpKyspCkBAIC0xMDk1LDkgKzEwOTUsOCBAQAogICBpZiAocGFnZSA+IDEpCiAgICAgewogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgIiUlJSVCb3VuZGluZ0JveDogJWxkICVsZCAlbGQgJWxkXG4iLChsb25nKSBjZWlsKGJvdW5kcy54MS0wLjUpLAotICAgICAgICAobG9uZykgY2VpbChib3VuZHMueTEtMC41KSwobG9uZykgZmxvb3IoYm91bmRzLngyKzAuNSksKGxvbmcpCi0gICAgICAgIGZsb29yKGJvdW5kcy55MiswLjUpKTsKKyAgICAgICAgIiUlJSVCb3VuZGluZ0JveDogJS4yMGcgJS4yMGcgJS4yMGcgJS4yMGdcbiIsY2VpbChib3VuZHMueDEtMC41KSwKKyAgICAgICAgY2VpbChib3VuZHMueTEtMC41KSxmbG9vcihib3VuZHMueDIrMC41KSxmbG9vcihib3VuZHMueTIrMC41KSk7CiAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICAgICAiJSUlJUhpUmVzQm91bmRpbmdCb3g6ICVnICVnICVnICVnXG4iLGJvdW5kcy54MSxib3VuZHMueTEsCmRpZmYgLS1naXQgYS9jb2RlcnMvcHMzLmMgYi9jb2RlcnMvcHMzLmMKaW5kZXggYmQ3MjBmOC4uZjE1MDhiZiAxMDA2NDQKLS0tIGEvY29kZXJzL3BzMy5jCisrKyBiL2NvZGVycy9wczMuYwpAQCAtNDc4LDM3ICs0NzgsMzcgQEAKICAgICBkZWZhdWx0OgogICAgIHsKICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICJjdXJyZW50ZmlsZSAlbHUgJWx1ICJQUzNfTm9Db21wcmVzc2lvbiIgQnl0ZVN0cmVhbURlY29kZUZpbHRlclxuIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAgICJjdXJyZW50ZmlsZSAlLjIwZyAlLjIwZyAiUFMzX05vQ29tcHJlc3Npb24iIEJ5dGVTdHJlYW1EZWNvZGVGaWx0ZXJcbiIsCisgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIEZheENvbXByZXNzaW9uOgogICAgIGNhc2UgR3JvdXA0Q29tcHJlc3Npb246CiAgICAgewogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgImN1cnJlbnRmaWxlICVsdSAlbHUgIlBTM19GYXhDb21wcmVzc2lvbiIgQnl0ZVN0cmVhbURlY29kZUZpbHRlclxuIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAgICJjdXJyZW50ZmlsZSAlLjIwZyAlLjIwZyAiUFMzX0ZheENvbXByZXNzaW9uIiBCeXRlU3RyZWFtRGVjb2RlRmlsdGVyXG4iLAorICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBMWldDb21wcmVzc2lvbjoKICAgICB7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAotICAgICAgICAiY3VycmVudGZpbGUgJWx1ICVsdSAiUFMzX0xaV0NvbXByZXNzaW9uIiBCeXRlU3RyZWFtRGVjb2RlRmlsdGVyXG4iLAotICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgImN1cnJlbnRmaWxlICUuMjBnICUuMjBnICJQUzNfTFpXQ29tcHJlc3Npb24iIEJ5dGVTdHJlYW1EZWNvZGVGaWx0ZXJcbiIsCisgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIFJMRUNvbXByZXNzaW9uOgogICAgIHsKICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAgICJjdXJyZW50ZmlsZSAlbHUgJWx1ICJQUzNfUkxFQ29tcHJlc3Npb24iIEJ5dGVTdHJlYW1EZWNvZGVGaWx0ZXJcbiIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgICAiY3VycmVudGZpbGUgJS4yMGcgJS4yMGcgIlBTM19STEVDb21wcmVzc2lvbiIgQnl0ZVN0cmVhbURlY29kZUZpbHRlclxuIiwKKyAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgWmlwQ29tcHJlc3Npb246CiAgICAgewogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgImN1cnJlbnRmaWxlICVsdSAlbHUgIlBTM19aaXBDb21wcmVzc2lvbiIgQnl0ZVN0cmVhbURlY29kZUZpbHRlclxuIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAgICJjdXJyZW50ZmlsZSAlLjIwZyAlLjIwZyAiUFMzX1ppcENvbXByZXNzaW9uIiBCeXRlU3RyZWFtRGVjb2RlRmlsdGVyXG4iLAorICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KQEAgLTkzOSwxNSArOTM5LDE1IEBACiAgICAgICAgIHJlc29sdXRpb24ueT0oc2l6ZV90KSAoMTAwLjAqMi41NCpyZXNvbHV0aW9uLnkrMC41KS8xMDAuMDsKICAgICAgIH0KICAgICBTZXRHZW9tZXRyeShpbWFnZSwmZ2VvbWV0cnkpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwKLSAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyIsCisgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKSBpbWFnZS0+cm93cyk7CiAgICAgaWYgKGltYWdlX2luZm8tPnBhZ2UgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKHBhZ2VfZ2VvbWV0cnksaW1hZ2VfaW5mby0+cGFnZSxNYXhUZXh0RXh0ZW50KTsKICAgICBlbHNlCiAgICAgICBpZiAoKGltYWdlLT5wYWdlLndpZHRoICE9IDApICYmIChpbWFnZS0+cGFnZS5oZWlnaHQgIT0gMCkpCi0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocGFnZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2UuaGVpZ2h0LAotICAgICAgICAgIChsb25nKSBpbWFnZS0+cGFnZS54LChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhwYWdlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBnJSsuMjBnIiwoZG91YmxlKSBpbWFnZS0+cGFnZS53aWR0aCwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKSBpbWFnZS0+cGFnZS54LChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAgICAgZWxzZQogICAgICAgICBpZiAoKGltYWdlLT5ncmF2aXR5ICE9IFVuZGVmaW5lZEdyYXZpdHkpICYmCiAgICAgICAgICAgICAoTG9jYWxlQ29tcGFyZShpbWFnZV9pbmZvLT5tYWdpY2ssIlBTIikgPT0gMCkpCkBAIC0xMDQ1LDggKzEwNDUsOCBAQAogICAgICAgICAgICAgaWYgKGltYWdlX2luZm8tPmFkam9pbiA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcoYnVmZmVyLCIlJVBhZ2VzOiAxXG4iLE1heFRleHRFeHRlbnQpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZXM6ICVsdVxuIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgR2V0SW1hZ2VMaXN0TGVuZ3RoKGltYWdlKSk7CisgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCisgICAgICAgICAgICAgICAgIiUlJSVQYWdlczogJS4yMGdcbiIsKGRvdWJsZSkgR2V0SW1hZ2VMaXN0TGVuZ3RoKGltYWdlKSk7CiAgICAgICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgICAgfQogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIlJUVuZENvbW1lbnRzXG4iKTsKQEAgLTEwODYsMTYgKzEwODYsMTYgQEAKICAgICAgICAgfQogICAgICAgICAodm9pZClXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsIiUlRW5kUHJvbG9nXG4iKTsKICAgICAgIH0KLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlJSUlUGFnZTogMSAlbHVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgcGFnZSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJSUlJVBhZ2U6IDEgJS4yMGdcbiIsCisgICAgICAoZG91YmxlKSBwYWdlKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgLyoKICAgICAgIFBhZ2UgYm91bmRpbmcgYm94LgogICAgICovCiAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKLSAgICAgICIlJSUlUGFnZUJvdW5kaW5nQm94OiAlbGQgJWxkICVsZCAlbGRcbiIsKGxvbmcpIGdlb21ldHJ5LngsKGxvbmcpCi0gICAgICAgZ2VvbWV0cnkueSxnZW9tZXRyeS54Kyhsb25nKSBnZW9tZXRyeS53aWR0aCxnZW9tZXRyeS55Kyhsb25nKQotICAgICAgIChnZW9tZXRyeS5oZWlnaHQrdGV4dF9zaXplKSk7CisgICAgICAiJSUlJVBhZ2VCb3VuZGluZ0JveDogJS4yMGcgJS4yMGcgJS4yMGcgJS4yMGdcbiIsKGRvdWJsZSkgZ2VvbWV0cnkueCwKKyAgICAgICAoZG91YmxlKSBnZW9tZXRyeS55LGdlb21ldHJ5LngrKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsZ2VvbWV0cnkueSsKKyAgICAgICAoZG91YmxlKSAoZ2VvbWV0cnkuaGVpZ2h0K3RleHRfc2l6ZSkpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAvKgogICAgICAgUGFnZSBwcm9jZXNzIGNvbG9ycyBpZiBub3QgUkdCLgpAQCAtMTE2Nyw4ICsxMTY3LDggQEAKICAgICAvKgogICAgICAgVHJhbnNsYXRlLCBzY2FsZSwgYW5kIGZvbnQgcG9pbnQgc2l6ZS4KICAgICAqLwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsZCAlbGRcbiVnICVnXG4lZ1xuIiwKLSAgICAgIChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55LHNjYWxlLngsc2NhbGUueSxwb2ludHNpemUpOworICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4lZyAlZ1xuJWdcbiIsCisgICAgICAoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5Lnksc2NhbGUueCxzY2FsZS55LHBvaW50c2l6ZSk7CiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAgIC8qCiAgICAgICBPdXRwdXQgbGFiZWxzLgpAQCAtMTIxNSw4ICsxMjE1LDggQEAKICAgICAvKgogICAgICAgSW1hZ2UgY29sdW1ucywgcm93cywgYW5kIGNvbG9yIHNwYWNlLgogICAgICovCi0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJWx1ICVsdVxuJXNcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzLAorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnICUuMjBnXG4lc1xuIiwKKyAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzLAogICAgICAgaW1hZ2UtPmNvbG9yc3BhY2UgPT0gQ01ZS0NvbG9yc3BhY2UgPyBQUzNfQ01ZS0NvbG9yc3BhY2UgOgogICAgICAgUFMzX1JHQkNvbG9yc3BhY2UpOwogICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKQEAgLTE0NzEsOCArMTQ3MSw4IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICBOdW1iZXIgb2YgY29sb3JzIGluIGNvbG9yIG1hcC4KICAgICAgICAgICAgICovCi0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sb3JzKTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLAorICAgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+Y29sb3JzKTsKICAgICAgICAgICAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgIENvbG9yIG1hcCAtIHVuY29tcHJlc3NlZC4KZGlmZiAtLWdpdCBhL2NvZGVycy9wc2QuYyBiL2NvZGVycy9wc2QuYwppbmRleCA4MTY3ODAyLi43MjI3MjM4IDEwMDY0NAotLS0gYS9jb2RlcnMvcHNkLmMKKysrIGIvY29kZXJzL3BzZC5jCkBAIC03NzQsMTAgKzc3NCwxMCBAQAogICBwc2RfaW5mby5tb2RlPVJlYWRCbG9iTVNCU2hvcnQoaW1hZ2UpOwogICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgIiAgSW1hZ2UgaXMgJWx1IHggJWx1IHdpdGggY2hhbm5lbHM9JWx1LCBkZXB0aD0lbHUsIG1vZGU9JXMiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIHBzZF9pbmZvLmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIHBzZF9pbmZvLnJvd3MsCi0gICAgICAodW5zaWduZWQgbG9uZykgcHNkX2luZm8uY2hhbm5lbHMsKHVuc2lnbmVkIGxvbmcpIHBzZF9pbmZvLmRlcHRoLAotICAgICAgTW9kZVRvU3RyaW5nKChQU0RJbWFnZVR5cGUpIHBzZF9pbmZvLm1vZGUpKTsKKyAgICAgICIgIEltYWdlIGlzICUuMjBnIHggJS4yMGcgd2l0aCBjaGFubmVscz0lLjIwZywgZGVwdGg9JS4yMGcsIG1vZGU9JXMiLAorICAgICAgKGRvdWJsZSkgcHNkX2luZm8uY29sdW1ucywoZG91YmxlKSBwc2RfaW5mby5yb3dzLChkb3VibGUpCisgICAgICBwc2RfaW5mby5jaGFubmVscywoZG91YmxlKSBwc2RfaW5mby5kZXB0aCxNb2RlVG9TdHJpbmcoKFBTREltYWdlVHlwZSkKKyAgICAgIHBzZF9pbmZvLm1vZGUpKTsKICAgLyoKICAgICBJbml0aWFsaXplIGltYWdlLgogICAqLwpAQCAtODYzLDcgKzg2Myw3IEBACiAgICAgICAqLwogICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgIiAgcmVhZGluZyBpbWFnZSByZXNvdXJjZSBibG9ja3MgLSAlbHUgYnl0ZXMiLCh1bnNpZ25lZCBsb25nKSBsZW5ndGgpOworICAgICAgICAgICIgIHJlYWRpbmcgaW1hZ2UgcmVzb3VyY2UgYmxvY2tzIC0gJS4yMGcgYnl0ZXMiLChkb3VibGUpIGxlbmd0aCk7CiAgICAgICBibG9ja3M9KHVuc2lnbmVkIGNoYXIgKikgQWNxdWlyZVF1YW50dW1NZW1vcnkoKHNpemVfdCkgbGVuZ3RoLAogICAgICAgICBzaXplb2YoKmJsb2NrcykpOwogICAgICAgaWYgKGJsb2NrcyA9PSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQpAQCAtOTM2LDcgKzkzNiw3IEBACiAgICAgICAgICAgbnVtYmVyX2xheWVycz0oc2hvcnQpIFJlYWRCbG9iTVNCU2hvcnQoaW1hZ2UpOwogICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgIiAgaW1hZ2UgY29udGFpbnMgJWxkIGxheWVycyIsKGxvbmcpIG51bWJlcl9sYXllcnMpOworICAgICAgICAgICAgICAiICBpbWFnZSBjb250YWlucyAlLjIwZyBsYXllcnMiLChkb3VibGUpIG51bWJlcl9sYXllcnMpOwogICAgICAgICAgIGlmIChudW1iZXJfbGF5ZXJzIDwgMCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgLyoKQEAgLTk2Myw3ICs5NjMsNyBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICIgIHJlYWRpbmcgbGF5ZXIgIyVsZCIsKGxvbmcpIGkrMSk7CisgICAgICAgICAgICAgICAgIiAgcmVhZGluZyBsYXllciAjJS4yMGciLChkb3VibGUpIGkrMSk7CiAgICAgICAgICAgICBsYXllcl9pbmZvW2ldLnBhZ2UueT0oc3NpemVfdCkgUmVhZEJsb2JNU0JMb25nKGltYWdlKTsKICAgICAgICAgICAgIGxheWVyX2luZm9baV0ucGFnZS54PShzc2l6ZV90KSBSZWFkQmxvYk1TQkxvbmcoaW1hZ2UpOwogICAgICAgICAgICAgbGF5ZXJfaW5mb1tpXS5wYWdlLmhlaWdodD0oc2l6ZV90KQpAQCAtOTc5LDEwICs5NzksMTAgQEAKICAgICAgICAgICAgICAgVGhyb3dSZWFkZXJFeGNlcHRpb24oQ29ycnVwdEltYWdlRXJyb3IsIk1heGltdW1DaGFubmVsc0V4Y2VlZGVkIik7CiAgICAgICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAiICAgIG9mZnNldCglbGQsJWxkKSwgc2l6ZSglbGQsJWxkKSwgY2hhbm5lbHM9JWxkIiwKLSAgICAgICAgICAgICAgICAobG9uZykgbGF5ZXJfaW5mb1tpXS5wYWdlLngsKGxvbmcpIGxheWVyX2luZm9baV0ucGFnZS55LAotICAgICAgICAgICAgICAgIChsb25nKSBsYXllcl9pbmZvW2ldLnBhZ2UuaGVpZ2h0LChsb25nKQotICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0ucGFnZS53aWR0aCwobG9uZykgbGF5ZXJfaW5mb1tpXS5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgIiAgICBvZmZzZXQoJS4yMGcsJS4yMGcpLCBzaXplKCUuMjBnLCUuMjBnKSwgY2hhbm5lbHM9JS4yMGciLAorICAgICAgICAgICAgICAgIChkb3VibGUpIGxheWVyX2luZm9baV0ucGFnZS54LChkb3VibGUpIGxheWVyX2luZm9baV0ucGFnZS55LAorICAgICAgICAgICAgICAgIChkb3VibGUpIGxheWVyX2luZm9baV0ucGFnZS5oZWlnaHQsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICBsYXllcl9pbmZvW2ldLnBhZ2Uud2lkdGgsKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5jaGFubmVscyk7CiAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IChzc2l6ZV90KSBsYXllcl9pbmZvW2ldLmNoYW5uZWxzOyBqKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0uY2hhbm5lbF9pbmZvW2pdLnR5cGU9KHNob3J0KQpAQCAtOTkxLDkgKzk5MSw5IEBACiAgICAgICAgICAgICAgICAgR2V0UFNEU2l6ZSgmcHNkX2luZm8saW1hZ2UpOwogICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgIiAgICBjaGFubmVsWyVsZF06IHR5cGU9JWxkLCBzaXplPSVsZCIsKGxvbmcpIGosCi0gICAgICAgICAgICAgICAgICAobG9uZykgbGF5ZXJfaW5mb1tpXS5jaGFubmVsX2luZm9bal0udHlwZSwKLSAgICAgICAgICAgICAgICAgIChsb25nKSBsYXllcl9pbmZvW2ldLmNoYW5uZWxfaW5mb1tqXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICIgICAgY2hhbm5lbFslLjIwZ106IHR5cGU9JS4yMGcsIHNpemU9JS4yMGciLChkb3VibGUpIGosCisgICAgICAgICAgICAgICAgICAoZG91YmxlKSBsYXllcl9pbmZvW2ldLmNoYW5uZWxfaW5mb1tqXS50eXBlLAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5jaGFubmVsX2luZm9bal0uc2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb3VudD1SZWFkQmxvYihpbWFnZSw0LCh1bnNpZ25lZCBjaGFyICopIHR5cGUpOwogICAgICAgICAgICAgaWYgKChjb3VudCA9PSAwKSB8fCAoTG9jYWxlTkNvbXBhcmUodHlwZSwiOEJJTSIsNCkgIT0gMCkpCkBAIC0xMDExLDggKzEwMTEsOCBAQAogICAgICAgICAgICAgbGF5ZXJfaW5mb1tpXS52aXNpYmxlPSEobGF5ZXJfaW5mb1tpXS5mbGFncyAmIDB4MDIpOwogICAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgIiAgIGJsZW5kPSUuNHMsIG9wYWNpdHk9JWx1LCBjbGlwcGluZz0lcywgZmxhZ3M9JWQsIHZpc2libGU9JXMiLAotICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0uYmxlbmRrZXksKGxvbmcpIGxheWVyX2luZm9baV0ub3BhY2l0eSwKKyAgICAgICAgICAgICAgICAiICAgYmxlbmQ9JS40cywgb3BhY2l0eT0lLjIwZywgY2xpcHBpbmc9JXMsIGZsYWdzPSVkLCB2aXNpYmxlPSVzIiwKKyAgICAgICAgICAgICAgICBsYXllcl9pbmZvW2ldLmJsZW5ka2V5LChkb3VibGUpIGxheWVyX2luZm9baV0ub3BhY2l0eSwKICAgICAgICAgICAgICAgICBsYXllcl9pbmZvW2ldLmNsaXBwaW5nID8gInRydWUiIDogImZhbHNlIixsYXllcl9pbmZvW2ldLmZsYWdzLAogICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0udmlzaWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgICAgICAgICAgKHZvaWQpIFJlYWRCbG9iQnl0ZShpbWFnZSk7ICAvKiBmaWxsZXIgKi8KQEAgLTEwNDEsMTAgKzEwNDEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9pbmZvW2ldLm1hc2sud2lkdGgrPTQyOTQ5NjcyOTVVTDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBsYXllciBtYXNrOiBvZmZzZXQoJWxkLCVsZCksIHNpemUoJWxkLCVsZCksIGxlbmd0aD0lbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGxheWVyX2luZm9baV0ubWFzay54LChsb25nKSBsYXllcl9pbmZvW2ldLm1hc2sueSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBsYXllcl9pbmZvW2ldLm1hc2sud2lkdGgsKGxvbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9pbmZvW2ldLm1hc2suaGVpZ2h0LChsb25nKSBsZW5ndGgtMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGxheWVyIG1hc2s6IG9mZnNldCglLjIwZywlLjIwZyksIHNpemUoJS4yMGcsJS4yMGcpLCBsZW5ndGg9JS4yMGciLAorICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5tYXNrLngsKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5tYXNrLnksCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBsYXllcl9pbmZvW2ldLm1hc2sud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2luZm9baV0ubWFzay5oZWlnaHQsKGRvdWJsZSkgbGVuZ3RoLTE2KTsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICBTa2lwIG92ZXIgdGhlIHJlc3Qgb2YgdGhlIGxheWVyIG1hc2sgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGxheWVyIGJsZW5kaW5nIHJhbmdlczogbGVuZ3RoPSVsZCIsKGxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbGF5ZXIgYmxlbmRpbmcgcmFuZ2VzOiBsZW5ndGg9JS4yMGciLChkb3VibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgIFdlIHJlYWQgaXQsIGJ1dCBkb24ndCB1c2UgaXQuLi4KQEAgLTExMTEsOCArMTExMSw4IEBACiAgICAgICAgICAgICAgIHsKICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgYWRqdXN0bWVudCBsYXllciBrZXk6ICUuNHMsIGRhdGEgbGVuZ3RoPSVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxrZXksIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGFkanVzdG1lbnQgbGF5ZXIga2V5OiAlLjRzLCBkYXRhIGxlbmd0aD0lLjIwZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxrZXksIChkb3VibGUpIGxlbmd0aCk7CiAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICBpZiAoIGxlbmd0aCApIHsKQEAgLTExMjksNyArMTEyOSw3IEBACiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICAgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICIgICAgICB1bnN1cHBvcnRlZCBkYXRhOiBsZW5ndGg9JWxkIiwobG9uZykKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgIHVuc3VwcG9ydGVkIGRhdGE6IGxlbmd0aD0lLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICAgICAgICAgICAgKHNpemUtY29tYmluZWRsZW5ndGgpKTsKICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IChzc2l6ZV90KSAoc2l6ZS1jb21iaW5lZGxlbmd0aCk7IGorKykKICAgICAgICAgICAgICAgICAgICh2b2lkKSBSZWFkQmxvYkJ5dGUoaW1hZ2UpOwpAQCAtMTE0NSw3ICsxMTQ1LDcgQEAKICAgICAgICAgICAgICAgICAgIGxheWVyX2luZm9bal0uaW1hZ2U9RGVzdHJveUltYWdlKGxheWVyX2luZm9bal0uaW1hZ2UpOwogICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIiAgYWxsb2NhdGlvbiBvZiBpbWFnZSBmb3IgbGF5ZXIgJWxkIGZhaWxlZCIsKGxvbmcpIGkpOworICAgICAgICAgICAgICAgICAgICAiICBhbGxvY2F0aW9uIG9mIGltYWdlIGZvciBsYXllciAlLjIwZyBmYWlsZWQiLChkb3VibGUpIGkpOwogICAgICAgICAgICAgICAgIFRocm93UmVhZGVyRXhjZXB0aW9uKFJlc291cmNlTGltaXRFcnJvciwKICAgICAgICAgICAgICAgICAgICJNZW1vcnlBbGxvY2F0aW9uRmFpbGVkIik7CiAgICAgICAgICAgICAgIH0KQEAgLTExNjksMTQgKzExNjksMTQgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgIFNldCB1cCBzb21lIGhpZGRlbiBhdHRyaWJ1dGVzIGZvciBmb2xrcyB0aGF0IG5lZWQgdGhlbS4KICAgICAgICAgICAgICovCi0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJWxkIiwKLSAgICAgICAgICAgICAgKGxvbmcpIGxheWVyX2luZm9baV0ucGFnZS54KTsKKyAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LCIlLjIwZ2xkIiwKKyAgICAgICAgICAgICAgKGRvdWJsZSkgbGF5ZXJfaW5mb1tpXS5wYWdlLngpOwogICAgICAgICAgICAgKHZvaWQpIFNldEltYWdlQXJ0aWZhY3QobGF5ZXJfaW5mb1tpXS5pbWFnZSwicHNkOmxheWVyLngiLG1lc3NhZ2UpOwotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsIiVsZCIsCi0gICAgICAgICAgICAgIChsb25nKSBsYXllcl9pbmZvW2ldLnBhZ2UueSk7CisgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJS4yMGciLAorICAgICAgICAgICAgICAoZG91YmxlKSBsYXllcl9pbmZvW2ldLnBhZ2UueSk7CiAgICAgICAgICAgICAodm9pZCkgU2V0SW1hZ2VBcnRpZmFjdChsYXllcl9pbmZvW2ldLmltYWdlLCJwc2Q6bGF5ZXIueSIsbWVzc2FnZSk7Ci0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJWx1IiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxheWVyX2luZm9baV0ub3BhY2l0eSk7CisgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiJS4yMGciLAorICAgICAgICAgICAgICAoZG91YmxlKSBsYXllcl9pbmZvW2ldLm9wYWNpdHkpOwogICAgICAgICAgICAgKHZvaWQpIFNldEltYWdlQXJ0aWZhY3QobGF5ZXJfaW5mb1tpXS5pbWFnZSwicHNkOmxheWVyLm9wYWNpdHkiLAogICAgICAgICAgICAgICBtZXNzYWdlKTsKICAgICAgICAgICAgICh2b2lkKSBTZXRJbWFnZVByb3BlcnR5KGxheWVyX2luZm9baV0uaW1hZ2UsImxhYmVsIiwoY2hhciAqKQpAQCAtMTE5MiwxMiArMTE5MiwxMiBAQAogICAgICAgICB7CiAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICAgICAiICByZWFkaW5nIGRhdGEgZm9yIGxheWVyICVsZCIsKGxvbmcpIGkpOworICAgICAgICAgICAgICAiICByZWFkaW5nIGRhdGEgZm9yIGxheWVyICUuMjBnIiwoZG91YmxlKSBpKTsKICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgKHNzaXplX3QpIGxheWVyX2luZm9baV0uY2hhbm5lbHM7IGorKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAgICAgICAgICIgICAgcmVhZGluZyBkYXRhIGZvciBjaGFubmVsICVsZCIsKGxvbmcpIGopOworICAgICAgICAgICAgICAgICAgIiAgICByZWFkaW5nIGRhdGEgZm9yIGNoYW5uZWwgJS4yMGciLChkb3VibGUpIGopOwogI2lmICAgICAxCiAgICAgICAgICAgICAgIGlmIChsYXllcl9pbmZvW2ldLmNoYW5uZWxfaW5mb1tqXS5zaXplIDw9ICgyKmxheWVyX2luZm9baV0uaW1hZ2UtPnJvd3MpKQogICAgICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2NvZGVycy9zdmcuYyBiL2NvZGVycy9zdmcuYwppbmRleCA3ZTUzM2FlLi43ODRkOTdjIDEwMDY0NAotLS0gYS9jb2RlcnMvc3ZnLmMKKysrIGIvY29kZXJzL3N2Zy5jCkBAIC0yMTE2LDggKzIxMTYsOCBAQAogICAgICAgICAgICAgc3ZnX2luZm8tPnZpZXdfYm94PXN2Z19pbmZvLT5ib3VuZHM7CiAgICAgICAgICAgc3ZnX2luZm8tPndpZHRoPShzaXplX3QpIGZsb29yKHN2Z19pbmZvLT5ib3VuZHMud2lkdGgrMC41KTsKICAgICAgICAgICBzdmdfaW5mby0+aGVpZ2h0PShzaXplX3QpIGZsb29yKHN2Z19pbmZvLT5ib3VuZHMuaGVpZ2h0KzAuNSk7Ci0gICAgICAgICAgTVZHUHJpbnRmKHN2Z19pbmZvLT5maWxlLCJ2aWV3Ym94IDAgMCAlbHUgJWx1XG4iLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgc3ZnX2luZm8tPndpZHRoLCh1bnNpZ25lZCBsb25nKSBzdmdfaW5mby0+aGVpZ2h0KTsKKyAgICAgICAgICBNVkdQcmludGYoc3ZnX2luZm8tPmZpbGUsInZpZXdib3ggMCAwICUuMjBnICUuMjBnXG4iLChkb3VibGUpCisgICAgICAgICAgICBzdmdfaW5mby0+d2lkdGgsKGRvdWJsZSkgc3ZnX2luZm8tPmhlaWdodCk7CiAgICAgICAgICAgc3g9KGRvdWJsZSkgc3ZnX2luZm8tPndpZHRoL3N2Z19pbmZvLT52aWV3X2JveC53aWR0aDsKICAgICAgICAgICBzeT0oZG91YmxlKSBzdmdfaW5mby0+aGVpZ2h0L3N2Z19pbmZvLT52aWV3X2JveC5oZWlnaHQ7CiAgICAgICAgICAgTVZHUHJpbnRmKHN2Z19pbmZvLT5maWxlLCJhZmZpbmUgJWcgMCAwICVnIDAuMCAwLjBcbiIsc3gsc3kpOwpAQCAtMjQxMSw3ICsyNDExLDcgQEAKICAgICBSZWNlaXZpbmcgc29tZSBjaGFyYWN0ZXJzIGZyb20gdGhlIHBhcnNlci4KICAgKi8KICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgIiAgU0FYLmNoYXJhY3RlcnMoJXMsJWx1KSIsYywodW5zaWduZWQgbG9uZykgbGVuZ3RoKTsKKyAgICAiICBTQVguY2hhcmFjdGVycyglcywlLjIwZykiLGMsKGRvdWJsZSkgbGVuZ3RoKTsKICAgc3ZnX2luZm89KFNWR0luZm8gKikgY29udGV4dDsKICAgaWYgKHN2Z19pbmZvLT50ZXh0ICE9IChjaGFyICopIE5VTEwpCiAgICAgc3ZnX2luZm8tPnRleHQ9KGNoYXIgKikgUmVzaXplUXVhbnR1bU1lbW9yeShzdmdfaW5mby0+dGV4dCwKQEAgLTMzMjAsOCArMzMyMCw4IEBACiAgICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwKICAgICAgICIgIFwiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGRcIj5cbiIpOwogICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LAotICAgICAgIjxzdmcgd2lkdGg9XCIlbHVcIiBoZWlnaHQ9XCIlbHVcIj5cbiIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICI8c3ZnIHdpZHRoPVwiJS4yMGdcIiBoZWlnaHQ9XCIlLjIwZ1wiPlxuIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywKKyAgICAgIChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLG1lc3NhZ2UpOwogICAgIEdldE1hZ2lja1BpeGVsUGFja2V0KGltYWdlLCZwaXhlbCk7CiAgICAgZm9yICh5PTA7IHkgPCAoc3NpemVfdCkgaW1hZ2UtPnJvd3M7IHkrKykKQEAgLTMzMzYsOCArMzMzNiw4IEBACiAgICAgICAgICh2b2lkKSBRdWVyeU1hZ2lja0NvbG9ybmFtZShpbWFnZSwmcGl4ZWwsU1ZHQ29tcGxpYW5jZSx0dXBsZSwKICAgICAgICAgICAmaW1hZ2UtPmV4Y2VwdGlvbik7CiAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICIgIDxjaXJjbGUgY3g9XCIlbGRcIiBjeT1cIiVsZFwiIHI9XCIxXCIgZmlsbD1cIiVzXCIvPlxuIiwobG9uZykgeCwKLSAgICAgICAgICAobG9uZykgeSx0dXBsZSk7CisgICAgICAgICAgIiAgPGNpcmNsZSBjeD1cIiUuMjBnXCIgY3k9XCIlLjIwZ1wiIHI9XCIxXCIgZmlsbD1cIiVzXCIvPlxuIiwKKyAgICAgICAgICAoZG91YmxlKSB4LChkb3VibGUpIHksdHVwbGUpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLG1lc3NhZ2UpOwogICAgICAgICBwKys7CiAgICAgICB9CkBAIC0zNDMyLDggKzM0MzIsOCBAQAogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLAogICAgICIgIFwiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGRcIj5cbiIpOwogICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwKLSAgICAiPHN2ZyB3aWR0aD1cIiVsdVwiIGhlaWdodD1cIiVsdVwiPlxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsCi0gICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAiPHN2ZyB3aWR0aD1cIiUuMjBnXCIgaGVpZ2h0PVwiJS4yMGdcIj5cbiIsKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkKKyAgICBpbWFnZS0+cm93cyk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsbWVzc2FnZSk7CiAgIC8qCiAgICAgQWxsb2NhdGUgcHJpbWl0aXZlIGluZm8gbWVtb3J5LgpkaWZmIC0tZ2l0IGEvY29kZXJzL3RpZmYuYyBiL2NvZGVycy90aWZmLmMKaW5kZXggZDAyOTgwNi4uNDhmOGI4YSAxMDA2NDQKLS0tIGEvY29kZXJzL3RpZmYuYworKysgYi9jb2RlcnMvdGlmZi5jCkBAIC05MjcsOCArOTI3LDggQEAKICAgICBpbWFnZS0+cm93cz0oc2l6ZV90KSBoZWlnaHQ7CiAgICAgaW1hZ2UtPmRlcHRoPShzaXplX3QpIGJpdHNfcGVyX3NhbXBsZTsKICAgICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQotICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIkltYWdlIGRlcHRoOiAlbHUiLAotICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlcHRoKTsKKyAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDb2RlckV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCJJbWFnZSBkZXB0aDogJS4yMGciLAorICAgICAgICAoZG91YmxlKSBpbWFnZS0+ZGVwdGgpOwogICAgIGxzYl9maXJzdD0xOwogICAgIGltYWdlLT5lbmRpYW49TVNCRW5kaWFuOwogICAgIGlmICgoaW50KSAoKihjaGFyICopICZsc2JfZmlyc3QpICE9IDApCmRpZmYgLS1naXQgYS9jb2RlcnMvdHRmLmMgYi9jb2RlcnMvdHRmLmMKaW5kZXggZTNlNDg5Yi4uNTQ5Nzk1ZSAxMDA2NDQKLS0tIGEvY29kZXJzL3R0Zi5jCisrKyBiL2NvZGVycy90dGYuYwpAQCAtMjQ5LDExICsyNDksMTEgQEAKICAgZHJhd19pbmZvPUNsb25lRHJhd0luZm8oaW1hZ2VfaW5mbywoRHJhd0luZm8gKikgTlVMTCk7CiAgIGRyYXdfaW5mby0+Zm9udD1BY3F1aXJlU3RyaW5nKGltYWdlLT5maWxlbmFtZSk7CiAgIENvbmNhdGVuYXRlU3RyaW5nKCZkcmF3X2luZm8tPnByaW1pdGl2ZSwicHVzaCBncmFwaGljLWNvbnRleHRcbiIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIgdmlld2JveCAwIDAgJWx1ICVsdVxuIiwKLSAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiIHZpZXdib3ggMCAwICUuMjBnICUuMjBnXG4iLAorICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgQ29uY2F0ZW5hdGVTdHJpbmcoJmRyYXdfaW5mby0+cHJpbWl0aXZlLGJ1ZmZlcik7CiAgIENvbmNhdGVuYXRlU3RyaW5nKCZkcmF3X2luZm8tPnByaW1pdGl2ZSwiIGZvbnQtc2l6ZSAxOFxuIik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiB0ZXh0IDEwLCVsZCAnIiwobG9uZykgeSk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiB0ZXh0IDEwLCUuMjBnICciLChkb3VibGUpIHkpOwogICBDb25jYXRlbmF0ZVN0cmluZygmZHJhd19pbmZvLT5wcmltaXRpdmUsYnVmZmVyKTsKICAgdGV4dD1Fc2NhcGVTdHJpbmcoVGV4dCwnIicpOwogICBDb25jYXRlbmF0ZVN0cmluZygmZHJhd19pbmZvLT5wcmltaXRpdmUsdGV4dCk7CkBAIC0yNjUsMTMgKzI2NSwxNCBAQAogICB7CiAgICAgeSs9aSsxMjsKICAgICBDb25jYXRlbmF0ZVN0cmluZygmZHJhd19pbmZvLT5wcmltaXRpdmUsIiBmb250LXNpemUgMThcbiIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiB0ZXh0IDEwLCVsZCAnJWxkJ1xuIiwKLSAgICAgIChsb25nKSB5LChsb25nKSBpKTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIgdGV4dCAxMCwlLjIwZyAnJS4yMGcnXG4iLAorICAgICAgKGRvdWJsZSkgeSwoZG91YmxlKSBpKTsKICAgICBDb25jYXRlbmF0ZVN0cmluZygmZHJhd19pbmZvLT5wcmltaXRpdmUsYnVmZmVyKTsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIgZm9udC1zaXplICVsZFxuIiwobG9uZykgaSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiIGZvbnQtc2l6ZSAlLjIwZ1xuIiwKKyAgICAgIChkb3VibGUpIGkpOwogICAgIENvbmNhdGVuYXRlU3RyaW5nKCZkcmF3X2luZm8tPnByaW1pdGl2ZSxidWZmZXIpOwotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiB0ZXh0IDUwLCVsZCAiCi0gICAgICAiJ1RoYXQgd2hpY2ggZG9lcyBub3QgZGVzdHJveSBtZSwgb25seSBtYWtlcyBtZSBzdHJvbmdlci4nXG4iLChsb25nKSB5KTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIgdGV4dCA1MCwlLjIwZyAiCisgICAgICAiJ1RoYXQgd2hpY2ggZG9lcyBub3QgZGVzdHJveSBtZSwgb25seSBtYWtlcyBtZSBzdHJvbmdlci4nXG4iLChkb3VibGUpIHkpOwogICAgIENvbmNhdGVuYXRlU3RyaW5nKCZkcmF3X2luZm8tPnByaW1pdGl2ZSxidWZmZXIpOwogICAgIGlmIChpID49IDI0KQogICAgICAgaSs9NjsKZGlmZiAtLWdpdCBhL2NvZGVycy90eHQuYyBiL2NvZGVycy90eHQuYwppbmRleCA2ZWMxYTZlLi42NDQ4ZGJjIDEwMDY0NAotLS0gYS9jb2RlcnMvdHh0LmMKKysrIGIvY29kZXJzL3R4dC5jCkBAIC02NTksOCArNjU5LDggQEAKICAgICBpZiAoaW1hZ2UtPm1hdHRlICE9IE1hZ2lja0ZhbHNlKQogICAgICAgKHZvaWQpIENvbmNhdGVuYXRlTWFnaWNrU3RyaW5nKGNvbG9yc3BhY2UsImEiLE1heFRleHRFeHRlbnQpOwogICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCi0gICAgICAiIyBJbWFnZU1hZ2ljayBwaXhlbCBlbnVtZXJhdGlvbjogJWx1LCVsdSwlbHUsJXNcbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsKHVuc2lnbmVkIGxvbmcpCisgICAgICAiIyBJbWFnZU1hZ2ljayBwaXhlbCBlbnVtZXJhdGlvbjogJS4yMGcsJS4yMGcsJS4yMGcsJXNcbiIsKGRvdWJsZSkKKyAgICAgIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzLChkb3VibGUpCiAgICAgICBHZXRRdWFudHVtUmFuZ2UoaW1hZ2UtPmRlcHRoKSxjb2xvcnNwYWNlKTsKICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgR2V0TWFnaWNrUGl4ZWxQYWNrZXQoaW1hZ2UsJnBpeGVsKTsKQEAgLTY3Miw4ICs2NzIsOCBAQAogICAgICAgaW5kZXhlcz1HZXRWaXJ0dWFsSW5kZXhRdWV1ZShpbWFnZSk7CiAgICAgICBmb3IgKHg9MDsgeCA8IChzc2l6ZV90KSBpbWFnZS0+Y29sdW1uczsgeCsrKQogICAgICAgewotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlbGQsJWxkOiAiLChsb25nKSB4LAotICAgICAgICAgIChsb25nKSB5KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiJS4yMGcsJS4yMGc6ICIsKGRvdWJsZSkKKyAgICAgICAgICB4LChkb3VibGUpIHkpOwogICAgICAgICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgICAgICAgIFNldE1hZ2lja1BpeGVsUGFja2V0KGltYWdlLHAsaW5kZXhlcyt4LCZwaXhlbCk7CiAgICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKHR1cGxlLCIoIixNYXhUZXh0RXh0ZW50KTsKZGlmZiAtLWdpdCBhL2NvZGVycy92aWNhci5jIGIvY29kZXJzL3ZpY2FyLmMKaW5kZXggZmY5OTE2NS4uNTRmMWRjZCAxMDA2NDQKLS0tIGEvY29kZXJzL3ZpY2FyLmMKKysrIGIvY29kZXJzL3ZpY2FyLmMKQEAgLTQ2MiwxMCArNDYyLDEwIEBACiAgICovCiAgICh2b2lkKSBSZXNldE1hZ2lja01lbW9yeShoZWFkZXIsJyAnLE1heFRleHRFeHRlbnQpOwogICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGhlYWRlcixNYXhUZXh0RXh0ZW50LAotICAgICJMQkxTSVpFPSVsdSBGT1JNQVQ9J0JZVEUnIFRZUEU9J0lNQUdFJyBCVUZTSVpFPTIwMDAwIERJTT0yIEVPTD0wICIKLSAgICAiUkVDU0laRT0lbHUgT1JHPSdCU1EnIE5MPSVsdSBOUz0lbHUgTkI9MSBOMT0wIE4yPTAgTjM9MCBOND0wIE5CQj0wICIKLSAgICAiTkxCPTAgVEFTSz0nSW1hZ2VNYWdpY2snIiwodW5zaWduZWQgbG9uZykgTWF4VGV4dEV4dGVudCwodW5zaWduZWQgbG9uZykKLSAgICBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zKTsKKyAgICAiTEJMU0laRT0lLjIwZyBGT1JNQVQ9J0JZVEUnIFRZUEU9J0lNQUdFJyBCVUZTSVpFPTIwMDAwIERJTT0yIEVPTD0wICIKKyAgICAiUkVDU0laRT0lLjIwZyBPUkc9J0JTUScgTkw9JS4yMGcgTlM9JS4yMGcgTkI9MSBOMT0wIE4yPTAgTjM9MCBOND0wIE5CQj0wICIKKyAgICAiTkxCPTAgVEFTSz0nSW1hZ2VNYWdpY2snIiwoZG91YmxlKSBNYXhUZXh0RXh0ZW50LChkb3VibGUpIGltYWdlLT5jb2x1bW5zLAorICAgIChkb3VibGUpIGltYWdlLT5yb3dzLChkb3VibGUpIGltYWdlLT5jb2x1bW5zKTsKICAgKHZvaWQpIFdyaXRlQmxvYihpbWFnZSxNYXhUZXh0RXh0ZW50LCh1bnNpZ25lZCBjaGFyICopIGhlYWRlcik7CiAgIC8qCiAgICAgV3JpdGUgVklDQVIgcGl4ZWxzLgpkaWZmIC0tZ2l0IGEvY29kZXJzL3ZpZC5jIGIvY29kZXJzL3ZpZC5jCmluZGV4IDIxNWYwOGUuLjZkNTk0MTMgMTAwNjQ0Ci0tLSBhL2NvZGVycy92aWQuYworKysgYi9jb2RlcnMvdmlkLmMKQEAgLTE3NCw4ICsxNzQsOSBAQAogICAgICh2b2lkKSBTZXRJbWFnZVByb3BlcnR5KG5leHRfaW1hZ2UsImxhYmVsIixsYWJlbCk7CiAgICAgbGFiZWw9RGVzdHJveVN0cmluZyhsYWJlbCk7CiAgICAgaWYgKGltYWdlX2luZm8tPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQotICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksImdlb21ldHJ5OiAlbHV4JWx1IiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG5leHRfaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIG5leHRfaW1hZ2UtPnJvd3MpOworICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KENvZGVyRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCisgICAgICAgICJnZW9tZXRyeTogJS4yMGd4JS4yMGciLChkb3VibGUpIG5leHRfaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkKKyAgICAgICAgbmV4dF9pbWFnZS0+cm93cyk7CiAgICAgU2V0R2VvbWV0cnkobmV4dF9pbWFnZSwmZ2VvbWV0cnkpOwogICAgICh2b2lkKSBQYXJzZU1ldGFHZW9tZXRyeShyZWFkX2luZm8tPnNpemUsJmdlb21ldHJ5LngsJmdlb21ldHJ5LnksCiAgICAgICAmZ2VvbWV0cnkud2lkdGgsJmdlb21ldHJ5LmhlaWdodCk7CkBAIC0xODgsOCArMTg5LDggQEAKICAgICAgIH0KICAgICBpZiAoaW1hZ2VfaW5mby0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ29kZXJFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgInRodW1ibmFpbCBnZW9tZXRyeTogJWx1eCVsdSIsKHVuc2lnbmVkIGxvbmcpIG5leHRfaW1hZ2UtPmNvbHVtbnMsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBuZXh0X2ltYWdlLT5yb3dzKTsKKyAgICAgICAgInRodW1ibmFpbCBnZW9tZXRyeTogJS4yMGd4JS4yMGciLChkb3VibGUpIG5leHRfaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkKKyAgICAgICAgbmV4dF9pbWFnZS0+cm93cyk7CiAgICAgQXBwZW5kSW1hZ2VUb0xpc3QoJmltYWdlcyxuZXh0X2ltYWdlKTsKICAgICBzdGF0dXM9U2V0SW1hZ2VQcm9ncmVzcyhpbWFnZXMsTG9hZEltYWdlc1RhZyxpLG51bWJlcl9maWxlcyk7CiAgICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKZGlmZiAtLWdpdCBhL2NvZGVycy93cGcuYyBiL2NvZGVycy93cGcuYwppbmRleCBkZDFlNTE3Li5jOWI0YTY0IDEwMDY0NAotLS0gYS9jb2RlcnMvd3BnLmMKKysrIGIvY29kZXJzL3dwZy5jCkBAIC01OTcsOCArNTk3LDggQEAKICAgICAgICAgICBpZih4IT0wKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAodm9pZCkgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblVuc3VwcG9ydGVkIFdQRzIgdW5hbGlnbmVkIHRva2VuIFJTVCB4PSVsdSwgcGxlYXNlIHJlcG9ydCFcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCh1bnNpZ25lZCBsb25nKSB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuVW5zdXBwb3J0ZWQgV1BHMiB1bmFsaWduZWQgdG9rZW4gUlNUIHg9JS4yMGcsIHBsZWFzZSByZXBvcnQhXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwoZG91YmxlKSB4KTsKICAgICAgICAgICAgICAgcmV0dXJuKC0zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9jb2RlcnMveGJtLmMgYi9jb2RlcnMveGJtLmMKaW5kZXggNGFlZjFmYy4uZTk0ZjJkOSAxMDA2NDQKLS0tIGEvY29kZXJzL3hibS5jCisrKyBiL2NvZGVycy94Ym0uYwpAQCAtNTE2LDExICs1MTYsMTEgQEAKICAgICBXcml0ZSBYIGJpdG1hcCBoZWFkZXIuCiAgICovCiAgIEdldFBhdGhDb21wb25lbnQoaW1hZ2UtPmZpbGVuYW1lLEJhc2VQYXRoLGJhc2VuYW1lKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiI2RlZmluZSAlc193aWR0aCAlbHVcbiIsCi0gICAgYmFzZW5hbWUsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiI2RlZmluZSAlc193aWR0aCAlLjIwZ1xuIiwKKyAgICBiYXNlbmFtZSwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucyk7CiAgICh2b2lkKSBXcml0ZUJsb2IoaW1hZ2Usc3RybGVuKGJ1ZmZlciksKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwiI2RlZmluZSAlc19oZWlnaHQgJWx1XG4iLAotICAgIGJhc2VuYW1lLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiNkZWZpbmUgJXNfaGVpZ2h0ICUuMjBnXG4iLAorICAgIGJhc2VuYW1lLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgKHZvaWQpIFdyaXRlQmxvYihpbWFnZSxzdHJsZW4oYnVmZmVyKSwodW5zaWduZWQgY2hhciAqKSBidWZmZXIpOwogICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LAogICAgICJzdGF0aWMgY2hhciAlc19iaXRzW10gPSB7XG4iLGJhc2VuYW1lKTsKZGlmZiAtLWdpdCBhL2NvZGVycy94cG0uYyBiL2NvZGVycy94cG0uYwppbmRleCBhM2JjMzgzLi45NGExNjA3IDEwMDY0NAotLS0gYS9jb2RlcnMveHBtLmMKKysrIGIvY29kZXJzL3hwbS5jCkBAIC03NDIsOSArNzQyLDkgQEAKICAgICAic3RhdGljIGNoYXIgKiVzW10gPSB7XG4iLGJhc2VuYW1lKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLCIvKiBjb2x1bW5zIHJvd3MgY29sb3JzIGNoYXJzLXBlci1waXhlbCAqL1xuIik7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIlwiJWx1ICVsdSAlbHUgJWx1XCIsXG4iLAotICAgICh1bnNpZ25lZCBsb25nKSBwaWNvbi0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgcGljb24tPnJvd3MsKHVuc2lnbmVkIGxvbmcpCi0gICAgY29sb3JzLCh1bnNpZ25lZCBsb25nKSBjaGFyYWN0ZXJzX3Blcl9waXhlbCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsCisgICAgIlwiJS4yMGcgJS4yMGcgJS4yMGcgJS4yMGdcIixcbiIsKGRvdWJsZSkgcGljb24tPmNvbHVtbnMsKGRvdWJsZSkKKyAgICBwaWNvbi0+cm93cywoZG91YmxlKSBjb2xvcnMsKGRvdWJsZSkgY2hhcmFjdGVyc19wZXJfcGl4ZWwpOwogICAodm9pZCkgV3JpdGVCbG9iU3RyaW5nKGltYWdlLGJ1ZmZlcik7CiAgIEdldE1hZ2lja1BpeGVsUGFja2V0KGltYWdlLCZwaXhlbCk7CiAgIGZvciAoaT0wOyBpIDwgKHNzaXplX3QpIGNvbG9yczsgaSsrKQpAQCAtOTc1LDkgKzk3NSw5IEBACiAgICAgInN0YXRpYyBjaGFyIColc1tdID0ge1xuIixiYXNlbmFtZSk7CiAgICh2b2lkKSBXcml0ZUJsb2JTdHJpbmcoaW1hZ2UsYnVmZmVyKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSwiLyogY29sdW1ucyByb3dzIGNvbG9ycyBjaGFycy1wZXItcGl4ZWwgKi9cbiIpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCJcIiVsdSAlbHUgJWx1ICVsdVwiLFxuIiwKLSAgICAodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzLCh1bnNpZ25lZCBsb25nKQotICAgIGltYWdlLT5jb2xvcnMsKHVuc2lnbmVkIGxvbmcpIGNoYXJhY3RlcnNfcGVyX3BpeGVsKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhidWZmZXIsTWF4VGV4dEV4dGVudCwKKyAgICAiXCIlLjIwZyAlLjIwZyAlLjIwZyAlLjIwZyBcIixcbiIsKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkKKyAgICBpbWFnZS0+cm93cywoZG91YmxlKSBpbWFnZS0+Y29sb3JzLChkb3VibGUpIGNoYXJhY3RlcnNfcGVyX3BpeGVsKTsKICAgKHZvaWQpIFdyaXRlQmxvYlN0cmluZyhpbWFnZSxidWZmZXIpOwogICBHZXRNYWdpY2tQaXhlbFBhY2tldChpbWFnZSwmcGl4ZWwpOwogICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBpbWFnZS0+Y29sb3JzOyBpKyspCmRpZmYgLS1naXQgYS9jb2RlcnMveHBzLmMgYi9jb2RlcnMveHBzLmMKaW5kZXggMzQ5M2I4Ni4uZWFhNmM1NyAxMDA2NDQKLS0tIGEvY29kZXJzL3hwcy5jCisrKyBiL2NvZGVycy94cHMuYwpAQCAtMjYzLDggKzI2Myw4IEBACiAgICAgKHZvaWQpIFBhcnNlQWJzb2x1dGVHZW9tZXRyeShQU1BhZ2VHZW9tZXRyeSwmcGFnZSk7CiAgIGlmIChpbWFnZV9pbmZvLT5wYWdlICE9IChjaGFyICopIE5VTEwpCiAgICAgKHZvaWQpIFBhcnNlQWJzb2x1dGVHZW9tZXRyeShpbWFnZV9pbmZvLT5wYWdlLCZwYWdlKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwKLSAgICAodW5zaWduZWQgbG9uZykgcGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgcGFnZS5oZWlnaHQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiUuMjBneCUuMjBnIiwoZG91YmxlKQorICAgIHBhZ2Uud2lkdGgsKGRvdWJsZSkgcGFnZS5oZWlnaHQpOwogICBpZiAoaW1hZ2VfaW5mby0+bW9ub2Nocm9tZSAhPSBNYWdpY2tGYWxzZSkKICAgICBkZWxlZ2F0ZV9pbmZvPUdldERlbGVnYXRlSW5mbygieHBzOm1vbm8iLChjaGFyICopIE5VTEwsZXhjZXB0aW9uKTsKICAgZWxzZQpAQCAtMjgyLDIwICsyODIsMjAgQEAKICAgcGFnZS53aWR0aD0oc2l6ZV90KSBmbG9vcihwYWdlLndpZHRoKmltYWdlLT55X3Jlc29sdXRpb24vZGVsdGEueCswLjUpOwogICBwYWdlLmhlaWdodD0oc2l6ZV90KSBmbG9vcihwYWdlLmhlaWdodCppbWFnZS0+eV9yZXNvbHV0aW9uL2RlbHRhLnkrCiAgICAgMC41KTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1nJWx1eCVsdSAiLAotICAgICh1bnNpZ25lZCBsb25nKSBwYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBwYWdlLmhlaWdodCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcob3B0aW9ucyxNYXhUZXh0RXh0ZW50LCItZyUuMjBneCUuMjBnICIsKGRvdWJsZSkKKyAgICBwYWdlLndpZHRoLChkb3VibGUpIHBhZ2UuaGVpZ2h0KTsKICAgaW1hZ2U9RGVzdHJveUltYWdlKGltYWdlKTsKICAgcmVhZF9pbmZvPUNsb25lSW1hZ2VJbmZvKGltYWdlX2luZm8pOwogICAqcmVhZF9pbmZvLT5tYWdpY2s9J1wwJzsKICAgaWYgKHJlYWRfaW5mby0+bnVtYmVyX3NjZW5lcyAhPSAwKQogICAgIHsKICAgICAgIGlmIChyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMgIT0gMSkKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsIi1kTGFzdFBhZ2U9JWx1IiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgKHJlYWRfaW5mby0+c2NlbmUrcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzKSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcob3B0aW9ucyxNYXhUZXh0RXh0ZW50LCItZExhc3RQYWdlPSUuMjBnIiwKKyAgICAgICAgICAoZG91YmxlKSAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKICAgICAgIGVsc2UKICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhvcHRpb25zLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgIi1kRmlyc3RQYWdlPSVsdSAtZExhc3RQYWdlPSVsdSIsKHVuc2lnbmVkIGxvbmcpIHJlYWRfaW5mby0+c2NlbmUrMSwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgKHJlYWRfaW5mby0+c2NlbmUrcmVhZF9pbmZvLT5udW1iZXJfc2NlbmVzKSk7CisgICAgICAgICAgIi1kRmlyc3RQYWdlPSUuMjBnIC1kTGFzdFBhZ2U9JS4yMGciLChkb3VibGUpIHJlYWRfaW5mby0+c2NlbmUrMSwKKyAgICAgICAgICAoZG91YmxlKSAocmVhZF9pbmZvLT5zY2VuZStyZWFkX2luZm8tPm51bWJlcl9zY2VuZXMpKTsKICAgICAgIHJlYWRfaW5mby0+bnVtYmVyX3NjZW5lcz0wOwogICAgICAgaWYgKHJlYWRfaW5mby0+c2NlbmVzICE9IChjaGFyICopIE5VTEwpCiAgICAgICAgICpyZWFkX2luZm8tPnNjZW5lcz0nXDAnOwpkaWZmIC0tZ2l0IGEvbWFnaWNrL2FuaW1hdGUuYyBiL21hZ2ljay9hbmltYXRlLmMKaW5kZXggNmRkODAxZi4uOGI2NmVjNSAxMDA2NDQKLS0tIGEvbWFnaWNrL2FuaW1hdGUuYworKysgYi9tYWdpY2svYW5pbWF0ZS5jCkBAIC05NjUsMTIgKzk2NSwxMiBAQAogICBpZiAoZGlzcGxheV9pbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgewogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiSW1hZ2U6ICVzWyVsdV0gJWx1eCVsdSAiLGltYWdlX2xpc3RbMF0tPmZpbGVuYW1lLAotICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2VfbGlzdFswXS0+c2NlbmUsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgIGltYWdlX2xpc3RbMF0tPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlX2xpc3RbMF0tPnJvd3MpOworICAgICAgICAiSW1hZ2U6ICVzWyUuMjBnXSAlLjIwZ3glLjIwZyAiLGltYWdlX2xpc3RbMF0tPmZpbGVuYW1lLChkb3VibGUpCisgICAgICAgIGltYWdlX2xpc3RbMF0tPnNjZW5lLChkb3VibGUpIGltYWdlX2xpc3RbMF0tPmNvbHVtbnMsKGRvdWJsZSkKKyAgICAgICAgaW1hZ2VfbGlzdFswXS0+cm93cyk7CiAgICAgICBpZiAoaW1hZ2VfbGlzdFswXS0+Y29sb3JzICE9IDApCi0gICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChYMTFFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJWx1YyAiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZV9saXN0WzBdLT5jb2xvcnMpOworICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoWDExRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiUuMjBnYyAiLChkb3VibGUpCisgICAgICAgICAgaW1hZ2VfbGlzdFswXS0+Y29sb3JzKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChYMTFFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJXMiLAogICAgICAgICBpbWFnZV9saXN0WzBdLT5tYWdpY2spOwogICAgIH0KQEAgLTEwODgsMTEgKzEwODgsMTEgQEAKICAgICBpZiAoZGlzcGxheV9pbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgICB7CiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChYMTFFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgICAiSW1hZ2U6IFslbHVdICVzICV1eCV1ICIsKHVuc2lnbmVkIGxvbmcpIGltYWdlX2xpc3Rbc2NlbmVdLT5zY2VuZSwKLSAgICAgICAgICBpbWFnZV9saXN0W3NjZW5lXS0+ZmlsZW5hbWUsY29sdW1ucyxyb3dzKTsKKyAgICAgICAgICAiSW1hZ2U6IFslLjIwZ10gJXMgJS4yMGd4JS4yMGcgIiwoZG91YmxlKSBpbWFnZV9saXN0W3NjZW5lXS0+c2NlbmUsCisgICAgICAgICAgaW1hZ2VfbGlzdFtzY2VuZV0tPmZpbGVuYW1lLChkb3VibGUpIGNvbHVtbnMsKGRvdWJsZSkgcm93cyk7CiAgICAgICAgIGlmIChpbWFnZV9saXN0W3NjZW5lXS0+Y29sb3JzICE9IDApCi0gICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlbHVjICIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2VfbGlzdFtzY2VuZV0tPmNvbG9ycyk7CisgICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlLjIwZ2MgIiwoZG91YmxlKQorICAgICAgICAgICAgaW1hZ2VfbGlzdFtzY2VuZV0tPmNvbG9ycyk7CiAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChYMTFFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJXMiLAogICAgICAgICAgIGltYWdlX2xpc3Rbc2NlbmVdLT5tYWdpY2spOwogICAgICAgfQpAQCAtMTUzNSwxMiArMTUzNSwxMiBAQAogICBpZiAoZGlzcGxheV9pbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgewogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiSW1hZ2U6ICVzWyVsdV0gJWx1eCVsdSAiLGRpc3BsYXlfaW1hZ2UtPmZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKQotICAgICAgICBkaXNwbGF5X2ltYWdlLT5zY2VuZSwodW5zaWduZWQgbG9uZykgZGlzcGxheV9pbWFnZS0+Y29sdW1ucywKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGRpc3BsYXlfaW1hZ2UtPnJvd3MpOworICAgICAgICAiSW1hZ2U6ICVzWyUuMjBnXSAlLjIwZ3glLjIwZyAiLGRpc3BsYXlfaW1hZ2UtPmZpbGVuYW1lLChkb3VibGUpCisgICAgICAgIGRpc3BsYXlfaW1hZ2UtPnNjZW5lLChkb3VibGUpIGRpc3BsYXlfaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkKKyAgICAgICAgZGlzcGxheV9pbWFnZS0+cm93cyk7CiAgICAgICBpZiAoZGlzcGxheV9pbWFnZS0+Y29sb3JzICE9IDApCi0gICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChYMTFFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJWx1YyAiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBkaXNwbGF5X2ltYWdlLT5jb2xvcnMpOworICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoWDExRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiUuMjBnYyAiLChkb3VibGUpCisgICAgICAgICAgZGlzcGxheV9pbWFnZS0+Y29sb3JzKTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChYMTFFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJXMiLAogICAgICAgICBkaXNwbGF5X2ltYWdlLT5tYWdpY2spOwogICAgIH0KQEAgLTE2NTYsOCArMTY1Niw4IEBACiAgICAgICAqLwogICAgICAgR2V0UGF0aENvbXBvbmVudChkaXNwbGF5X2ltYWdlLT5tYWdpY2tfZmlsZW5hbWUsVGFpbFBhdGgsZmlsZW5hbWUpOwogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh3aW5kb3dzLT5pbWFnZS5uYW1lLE1heFRleHRFeHRlbnQsCi0gICAgICAgICIlczogJXNbJWx1IG9mICVsdV0iLE1hZ2lja1BhY2thZ2VOYW1lLGZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKQotICAgICAgICBkaXNwbGF5X2ltYWdlLT5zY2VuZSwodW5zaWduZWQgbG9uZykgbnVtYmVyX3NjZW5lcyk7CisgICAgICAgICIlczogJXNbJS4yMGcgb2YgJS4yMGddIixNYWdpY2tQYWNrYWdlTmFtZSxmaWxlbmFtZSwoZG91YmxlKQorICAgICAgICBkaXNwbGF5X2ltYWdlLT5zY2VuZSwoZG91YmxlKSBudW1iZXJfc2NlbmVzKTsKICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKHdpbmRvd3MtPmltYWdlLmljb25fbmFtZSxmaWxlbmFtZSxNYXhUZXh0RXh0ZW50KTsKICAgICB9CiAgIGlmIChyZXNvdXJjZV9pbmZvLT5pbW11dGFibGUgIT0gTWFnaWNrRmFsc2UpCkBAIC0xOTM1LDExICsxOTM1LDExIEBACiAgICAgaWYgKGltYWdlX2xpc3Rbc2NlbmVdLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAgIHsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICJJbWFnZTogWyVsdV0gJXMgJXV4JXUgIiwodW5zaWduZWQgbG9uZykgaW1hZ2VfbGlzdFtzY2VuZV0tPnNjZW5lLAotICAgICAgICAgIGltYWdlX2xpc3Rbc2NlbmVdLT5maWxlbmFtZSxjb2x1bW5zLHJvd3MpOworICAgICAgICAgICJJbWFnZTogWyUuMjBnXSAlcyAlLjIwZ3glLjIwZyAiLChkb3VibGUpIGltYWdlX2xpc3Rbc2NlbmVdLT5zY2VuZSwKKyAgICAgICAgICBpbWFnZV9saXN0W3NjZW5lXS0+ZmlsZW5hbWUsKGRvdWJsZSkgY29sdW1ucywoZG91YmxlKSByb3dzKTsKICAgICAgICAgaWYgKGltYWdlX2xpc3Rbc2NlbmVdLT5jb2xvcnMgIT0gMCkKLSAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoWDExRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVsdWMgIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZV9saXN0W3NjZW5lXS0+Y29sb3JzKTsKKyAgICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoWDExRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiUuMjBnYyAiLChkb3VibGUpCisgICAgICAgICAgICBpbWFnZV9saXN0W3NjZW5lXS0+Y29sb3JzKTsKICAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsCiAgICAgICAgICAgaW1hZ2VfbGlzdFtzY2VuZV0tPm1hZ2ljayk7CiAgICAgICB9CkBAIC0xOTYzLDggKzE5NjMsOCBAQAogICAgICAgICB3aGlsZSAoKHAgPiBpbWFnZV9saXN0W3NjZW5lXS0+bWFnaWNrX2ZpbGVuYW1lKSAmJiAoKihwLTEpICE9ICcvJykpCiAgICAgICAgICAgcC0tOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHdpbmRvd3MtPmltYWdlLm5hbWUsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAiJXM6ICVzWyVsdSBvZiAlbHVdIixNYWdpY2tQYWNrYWdlTmFtZSxwLCh1bnNpZ25lZCBsb25nKSBzY2VuZSsxLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBudW1iZXJfc2NlbmVzKTsKKyAgICAgICAgICAiJXM6ICVzWyUuMjBnIG9mICUuMjBnXSIsTWFnaWNrUGFja2FnZU5hbWUscCwoZG91YmxlKSBzY2VuZSsxLAorICAgICAgICAgIChkb3VibGUpIG51bWJlcl9zY2VuZXMpOwogICAgICAgfQogICAgIHN0YXR1cz1YU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZ3aW5kb3dzLT5pbWFnZS5uYW1lLDEsJndpbmRvd19uYW1lKTsKICAgICBpZiAoc3RhdHVzICE9IFN1Y2Nlc3MpCkBAIC0yMDgyLDggKzIwODIsOCBAQAogICAgICAgICAgICAgICB3aGlsZSAoKHAgPiBpbWFnZV9saXN0W3NjZW5lXS0+ZmlsZW5hbWUpICYmICgqKHAtMSkgIT0gJy8nKSkKICAgICAgICAgICAgICAgICBwLS07CiAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcod2luZG93cy0+aW1hZ2UubmFtZSxNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgICAgICIlczogJXNbJWx1IG9mICVsdV0iLE1hZ2lja1BhY2thZ2VOYW1lLHAsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgICAgc2NlbmUrMSwodW5zaWduZWQgbG9uZykgbnVtYmVyX3NjZW5lcyk7CisgICAgICAgICAgICAgICAgIiVzOiAlc1slLjIwZyBvZiAlLjIwZ10iLE1hZ2lja1BhY2thZ2VOYW1lLHAsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICBzY2VuZSsxLChkb3VibGUpIG51bWJlcl9zY2VuZXMpOwogICAgICAgICAgICAgICBpZiAocmVzb3VyY2VfaW5mby0+dGl0bGUgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBjaGFyCkBAIC0yOTMxLDggKzI5MzEsOCBAQAogICAgICAgLyoKICAgICAgICAgUmVxdWVzdCBKUEVHIHF1YWxpdHkgZnJvbSB1c2VyLgogICAgICAgKi8KLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcocXVhbGl0eSxNYXhUZXh0RXh0ZW50LCIlbHUiLAotICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2VfaW5mby0+cXVhbGl0eSk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHF1YWxpdHksTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCisgICAgICAgIGltYWdlX2luZm8tPnF1YWxpdHkpOwogICAgICAgc3RhdHVzPVhEaWFsb2dXaWRnZXQoZGlzcGxheSx3aW5kb3dzLCJTYXZlIiwiRW50ZXIgSlBFRyBxdWFsaXR5OiIsCiAgICAgICAgIHF1YWxpdHkpOwogICAgICAgaWYgKCpxdWFsaXR5ID09ICdcMCcpCmRpZmYgLS1naXQgYS9tYWdpY2svYW5ub3RhdGUuYyBiL21hZ2ljay9hbm5vdGF0ZS5jCmluZGV4IDBmOGRjODQuLjJhMzU5MDIgMTAwNjQ0Ci0tLSBhL21hZ2ljay9hbm5vdGF0ZS5jCisrKyBiL21hZ2ljay9hbm5vdGF0ZS5jCkBAIC0zOTUsNyArMzk1LDcgQEAKICAgICAgICAgdW5kZXJjb2xvcl9pbmZvLT5hZmZpbmUudHg9b2Zmc2V0LngtZHJhd19pbmZvLT5hZmZpbmUucnkqbWV0cmljcy5hc2NlbnQ7CiAgICAgICAgIHVuZGVyY29sb3JfaW5mby0+YWZmaW5lLnR5PW9mZnNldC55LWRyYXdfaW5mby0+YWZmaW5lLnN5Km1ldHJpY3MuYXNjZW50OwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHByaW1pdGl2ZSxNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICJyZWN0YW5nbGUgMCwwICVnLCVsdSIsbWV0cmljcy5vcmlnaW4ueCwodW5zaWduZWQgbG9uZykgaGVpZ2h0KTsKKyAgICAgICAgICAicmVjdGFuZ2xlIDAsMCAlZywlLjIwZyIsbWV0cmljcy5vcmlnaW4ueCwoZG91YmxlKSBoZWlnaHQpOwogICAgICAgICAodm9pZCkgQ2xvbmVTdHJpbmcoJnVuZGVyY29sb3JfaW5mby0+cHJpbWl0aXZlLHByaW1pdGl2ZSk7CiAgICAgICAgICh2b2lkKSBEcmF3SW1hZ2UoaW1hZ2UsdW5kZXJjb2xvcl9pbmZvKTsKICAgICAgICAgKHZvaWQpIERlc3Ryb3lEcmF3SW5mbyh1bmRlcmNvbG9yX2luZm8pOwpAQCAtMTYyMSw4ICsxNjIxLDggQEAKICAgdGV4dD1EZXN0cm95U3RyaW5nKHRleHQpOwogICAodm9pZCkgZnByaW50ZihmaWxlLCJzaG93cGFnZVxuIik7CiAgICh2b2lkKSBmY2xvc2UoZmlsZSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJWxkeCVsZCswKzAhIiwobG9uZykKLSAgICBmbG9vcihleHRlbnQueCswLjUpLChsb25nKSBmbG9vcihleHRlbnQueSswLjUpKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyswKzAhIiwKKyAgICBmbG9vcihleHRlbnQueCswLjUpLGZsb29yKGV4dGVudC55KzAuNSkpOwogICBhbm5vdGF0ZV9pbmZvPUFjcXVpcmVJbWFnZUluZm8oKTsKICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhhbm5vdGF0ZV9pbmZvLT5maWxlbmFtZSxNYXhUZXh0RXh0ZW50LCJwczolcyIsCiAgICAgZmlsZW5hbWUpOwpAQCAtMTY2NCw5ICsxNjY0LDkgQEAKICAgICAgICAgRXhwYW5kQWZmaW5lKCZkcmF3X2luZm8tPmFmZmluZSkqZHJhd19pbmZvLT5wb2ludHNpemUrMC41KTsKICAgICAgIGNyb3BfaW5mby55PShzc2l6ZV90KSBjZWlsKChyZXNvbHV0aW9uLnkvRGVmYXVsdFJlc29sdXRpb24pKmV4dGVudC55LzguMC0KICAgICAgICAgMC41KTsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNyb3BfaW5mby53aWR0aCwodW5zaWduZWQgbG9uZykgY3JvcF9pbmZvLmhlaWdodCwKLSAgICAgICAgKGxvbmcpIGNyb3BfaW5mby54LChsb25nKSBjcm9wX2luZm8ueSk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsCisgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIGNyb3BfaW5mby53aWR0aCwoZG91YmxlKQorICAgICAgICBjcm9wX2luZm8uaGVpZ2h0LChkb3VibGUpIGNyb3BfaW5mby54LChkb3VibGUpIGNyb3BfaW5mby55KTsKICAgICAgICh2b2lkKSBUcmFuc2Zvcm1JbWFnZSgmYW5ub3RhdGVfaW1hZ2UsZ2VvbWV0cnksKGNoYXIgKikgTlVMTCk7CiAgICAgfQogICBtZXRyaWNzLT5waXhlbHNfcGVyX2VtLng9KHJlc29sdXRpb24ueS9EZWZhdWx0UmVzb2x1dGlvbikqCkBAIC0xOTU3LDggKzE5NTcsOCBAQAogICAgICAgICAgIGF0YW4yKGRyYXdfaW5mby0+YWZmaW5lLnJ4LGRyYXdfaW5mby0+YWZmaW5lLnN4KTsKICAgICB9CiAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYW5ub3RhdGVfaW5mby5nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LAotICAgICIlbHV4JWx1KyVsZCslbGQiLCh1bnNpZ25lZCBsb25nKSB3aWR0aCwodW5zaWduZWQgbG9uZykgaGVpZ2h0LChsb25nKQotICAgIGNlaWwob2Zmc2V0LT54LTAuNSksKGxvbmcpIGNlaWwob2Zmc2V0LT55LW1ldHJpY3MtPmFzY2VudC1tZXRyaWNzLT5kZXNjZW50KworICAgICIlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIHdpZHRoLChkb3VibGUpIGhlaWdodCwKKyAgICBjZWlsKG9mZnNldC0+eC0wLjUpLGNlaWwob2Zmc2V0LT55LW1ldHJpY3MtPmFzY2VudC1tZXRyaWNzLT5kZXNjZW50KwogICAgIGRyYXdfaW5mby0+aW50ZXJsaW5lX3NwYWNpbmctMC41KSk7CiAgIHBpeGVsLnBlbl9jb2xvci5yZWQ9U2NhbGVRdWFudHVtVG9TaG9ydChkcmF3X2luZm8tPmZpbGwucmVkKTsKICAgcGl4ZWwucGVuX2NvbG9yLmdyZWVuPVNjYWxlUXVhbnR1bVRvU2hvcnQoZHJhd19pbmZvLT5maWxsLmdyZWVuKTsKZGlmZiAtLWdpdCBhL21hZ2ljay9hdHRyaWJ1dGUuYyBiL21hZ2ljay9hdHRyaWJ1dGUuYwppbmRleCBiZDg1ZWU0Li5lMjI3OGIwIDEwMDY0NAotLS0gYS9tYWdpY2svYXR0cmlidXRlLmMKKysrIGIvbWFnaWNrL2F0dHJpYnV0ZS5jCkBAIC0yNzQsOCArMjc0LDE3IEBACiAlCiAqLwogCi1NYWdpY2tFeHBvcnQgc2l6ZV90IEdldEltYWdlRGVwdGgoY29uc3QgSW1hZ2UgKmltYWdlLAotICBFeGNlcHRpb25JbmZvICpleGNlcHRpb24pCitzdGF0aWMgaW5saW5lIFF1YW50dW1BbnkgR2V0UGl4ZWxEZXB0aChjb25zdCBRdWFudHVtIHBpeGVsLAorICBjb25zdCBRdWFudHVtQW55IHNjYWxlKQoreworI2lmICFkZWZpbmVkKE1BR0lDS0NPUkVfSERSSV9TVVBQT1JUKQorICByZXR1cm4oKFF1YW50dW1BbnkpIChzY2FsZSoocGl4ZWwvc2NhbGUpKSk7CisjZWxzZQorICByZXR1cm4oKFF1YW50dW1BbnkpIChzY2FsZSoocGl4ZWwvc2NhbGUpKzAuNSkpOworI2VuZGlmCit9CisKK01hZ2lja0V4cG9ydCBzaXplX3QgR2V0SW1hZ2VEZXB0aChjb25zdCBJbWFnZSAqaW1hZ2UsRXhjZXB0aW9uSW5mbyAqZXhjZXB0aW9uKQogewogICByZXR1cm4oR2V0SW1hZ2VDaGFubmVsRGVwdGgoaW1hZ2UsQWxsQ2hhbm5lbHMsZXhjZXB0aW9uKSk7CiB9CkBAIC0zMzgsMTkgKzM0NywxOSBAQAogICAgICAgICAgICAgc3RhdHVzOwogCiAgICAgICAgICAgUXVhbnR1bUFueQotICAgICAgICAgICAgcmFuZ2U7CisgICAgICAgICAgICBzY2FsZTsKIAogICAgICAgICAgIHN0YXR1cz0wOwotICAgICAgICAgIHJhbmdlPUdldFF1YW50dW1SYW5nZShjdXJyZW50X2RlcHRoW2lkXSk7CisgICAgICAgICAgc2NhbGU9MTsKKyAgICAgICAgICBpZiAoZGVwdGggPCBRdWFudHVtRGVwdGgpCisgICAgICAgICAgICBzY2FsZT1RdWFudHVtUmFuZ2UvKChRdWFudHVtQW55KSBRdWFudHVtUmFuZ2UgPj4gKFF1YW50dW1EZXB0aC0KKyAgICAgICAgICAgICAgY3VycmVudF9kZXB0aFtpZF0pKTsKICAgICAgICAgICBpZiAoKGNoYW5uZWwgJiBSZWRDaGFubmVsKSAhPSAwKQotICAgICAgICAgICAgc3RhdHVzfD1wLT5yZWQgIT0gU2NhbGVBbnlUb1F1YW50dW0oU2NhbGVRdWFudHVtVG9BbnkocC0+cmVkLAotICAgICAgICAgICAgICByYW5nZSkscmFuZ2UpOworICAgICAgICAgICAgc3RhdHVzfD0oUXVhbnR1bUFueSkgcC0+cmVkICE9IEdldFBpeGVsRGVwdGgocC0+cmVkLHNjYWxlKTsKICAgICAgICAgICBpZiAoKGNoYW5uZWwgJiBHcmVlbkNoYW5uZWwpICE9IDApCi0gICAgICAgICAgICBzdGF0dXN8PXAtPmdyZWVuICE9IFNjYWxlQW55VG9RdWFudHVtKFNjYWxlUXVhbnR1bVRvQW55KHAtPmdyZWVuLAotICAgICAgICAgICAgICByYW5nZSkscmFuZ2UpOworICAgICAgICAgICAgc3RhdHVzfD0oUXVhbnR1bUFueSkgcC0+Z3JlZW4gIT0gR2V0UGl4ZWxEZXB0aChwLT5ncmVlbixzY2FsZSk7CiAgICAgICAgICAgaWYgKChjaGFubmVsICYgQmx1ZUNoYW5uZWwpICE9IDApCi0gICAgICAgICAgICBzdGF0dXN8PXAtPmJsdWUgIT0gU2NhbGVBbnlUb1F1YW50dW0oU2NhbGVRdWFudHVtVG9BbnkocC0+Ymx1ZSwKLSAgICAgICAgICAgICAgcmFuZ2UpLHJhbmdlKTsKKyAgICAgICAgICAgIHN0YXR1c3w9KFF1YW50dW1BbnkpIHAtPmJsdWUgIT0gR2V0UGl4ZWxEZXB0aChwLT5ibHVlLHNjYWxlKTsKICAgICAgICAgICBpZiAoc3RhdHVzID09IDApCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjdXJyZW50X2RlcHRoW2lkXSsrOwpAQCAtMzk1LDI2ICs0MDQsMjQgQEAKICAgICAgICAgICBzdGF0dXM7CiAKICAgICAgICAgUXVhbnR1bUFueQotICAgICAgICAgIHJhbmdlOworICAgICAgICAgIHNjYWxlOwogCiAgICAgICAgIHN0YXR1cz0wOwotICAgICAgICByYW5nZT1HZXRRdWFudHVtUmFuZ2UoY3VycmVudF9kZXB0aFtpZF0pOworICAgICAgICBzY2FsZT0xOworICAgICAgICBpZiAoZGVwdGggPCBRdWFudHVtRGVwdGgpCisgICAgICAgICAgc2NhbGU9UXVhbnR1bVJhbmdlLygoUXVhbnR1bUFueSkgUXVhbnR1bVJhbmdlID4+IChRdWFudHVtRGVwdGgtCisgICAgICAgICAgICBjdXJyZW50X2RlcHRoW2lkXSkpOwogICAgICAgICBpZiAoKGNoYW5uZWwgJiBSZWRDaGFubmVsKSAhPSAwKQotICAgICAgICAgIHN0YXR1c3w9cC0+cmVkICE9IFNjYWxlQW55VG9RdWFudHVtKFNjYWxlUXVhbnR1bVRvQW55KHAtPnJlZCxyYW5nZSksCi0gICAgICAgICAgICByYW5nZSk7CisgICAgICAgICAgc3RhdHVzfD0oUXVhbnR1bUFueSkgcC0+cmVkICE9IEdldFBpeGVsRGVwdGgocC0+cmVkLHNjYWxlKTsKICAgICAgICAgaWYgKChjaGFubmVsICYgR3JlZW5DaGFubmVsKSAhPSAwKQotICAgICAgICAgIHN0YXR1c3w9cC0+Z3JlZW4gIT0gU2NhbGVBbnlUb1F1YW50dW0oU2NhbGVRdWFudHVtVG9BbnkocC0+Z3JlZW4sCi0gICAgICAgICAgICByYW5nZSkscmFuZ2UpOworICAgICAgICAgIHN0YXR1c3w9KFF1YW50dW1BbnkpIHAtPmdyZWVuICE9IEdldFBpeGVsRGVwdGgocC0+Z3JlZW4sc2NhbGUpOwogICAgICAgICBpZiAoKGNoYW5uZWwgJiBCbHVlQ2hhbm5lbCkgIT0gMCkKLSAgICAgICAgICBzdGF0dXN8PXAtPmJsdWUgIT0gU2NhbGVBbnlUb1F1YW50dW0oU2NhbGVRdWFudHVtVG9BbnkocC0+Ymx1ZSxyYW5nZSksCi0gICAgICAgICAgICByYW5nZSk7CisgICAgICAgICAgc3RhdHVzfD0oUXVhbnR1bUFueSkgcC0+Ymx1ZSAhPSBHZXRQaXhlbERlcHRoKHAtPmJsdWUsc2NhbGUpOwogICAgICAgICBpZiAoKChjaGFubmVsICYgT3BhY2l0eUNoYW5uZWwpICE9IDApICYmIChpbWFnZS0+bWF0dGUgIT0gTWFnaWNrRmFsc2UpKQotICAgICAgICAgIHN0YXR1c3w9cC0+b3BhY2l0eSAhPSBTY2FsZUFueVRvUXVhbnR1bShTY2FsZVF1YW50dW1Ub0FueShwLT5vcGFjaXR5LAotICAgICAgICAgICAgcmFuZ2UpLHJhbmdlKTsKKyAgICAgICAgICBzdGF0dXN8PShRdWFudHVtQW55KSBwLT5vcGFjaXR5ICE9IEdldFBpeGVsRGVwdGgocC0+b3BhY2l0eSxzY2FsZSk7CiAgICAgICAgIGlmICgoKGNoYW5uZWwgJiBJbmRleENoYW5uZWwpICE9IDApICYmCiAgICAgICAgICAgICAoaW1hZ2UtPmNvbG9yc3BhY2UgPT0gQ01ZS0NvbG9yc3BhY2UpKQotICAgICAgICAgIHN0YXR1c3w9aW5kZXhlc1t4XSAhPSBTY2FsZUFueVRvUXVhbnR1bShTY2FsZVF1YW50dW1Ub0FueShpbmRleGVzW3hdLAotICAgICAgICAgICAgcmFuZ2UpLHJhbmdlKTsKKyAgICAgICAgICBzdGF0dXN8PShRdWFudHVtQW55KSBpbmRleGVzW3hdICE9IEdldFBpeGVsRGVwdGgoaW5kZXhlc1t4XSxzY2FsZSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkKICAgICAgICAgICBicmVhazsKICAgICAgICAgY3VycmVudF9kZXB0aFtpZF0rKzsKQEAgLTgxNSw2ICs4MjIsMTIgQEAKICUKICovCiAKK3N0YXRpYyBpbmxpbmUgUXVhbnR1bSBTZXRQaXhlbERlcHRoKGNvbnN0IFF1YW50dW0gcGl4ZWwsCisgIGNvbnN0IFF1YW50dW1Bbnkgc2NhbGUpCit7CisgIHJldHVybigoUXVhbnR1bSkgKHNjYWxlKihwaXhlbC9zY2FsZSkpKTsKK30KKwogTWFnaWNrRXhwb3J0IE1hZ2lja0Jvb2xlYW5UeXBlIFNldEltYWdlRGVwdGgoSW1hZ2UgKmltYWdlLAogICBjb25zdCBzaXplX3QgZGVwdGgpCiB7CkBAIC04MzcsNyArODUwLDcgQEAKICAgICBzdGF0dXM7CiAKICAgUXVhbnR1bUFueQotICAgIHJhbmdlOworICAgIHNjYWxlOwogCiAgIGFzc2VydChpbWFnZSAhPSAoSW1hZ2UgKikgTlVMTCk7CiAgIGlmIChpbWFnZS0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCkBAIC04NTMsNyArODY2LDkgQEAKICAgICBTY2FsZSBwaXhlbHMgdG8gZGVzaXJlZCBkZXB0aC4KICAgKi8KICAgc3RhdHVzPU1hZ2lja1RydWU7Ci0gIHJhbmdlPUdldFF1YW50dW1SYW5nZShkZXB0aCk7CisgIHNjYWxlPTE7CisgIGlmIChkZXB0aCA8IFF1YW50dW1EZXB0aCkKKyAgICBzY2FsZT1RdWFudHVtUmFuZ2UvKChRdWFudHVtQW55KSBRdWFudHVtUmFuZ2UgPj4gKFF1YW50dW1EZXB0aC1kZXB0aCkpOwogICBleGNlcHRpb249KCZpbWFnZS0+ZXhjZXB0aW9uKTsKICAgaW1hZ2Vfdmlldz1BY3F1aXJlQ2FjaGVWaWV3KGltYWdlKTsKICNpZiBkZWZpbmVkKE1BR0lDS0NPUkVfT1BFTk1QX1NVUFBPUlQpCkBAIC04ODMsMTYgKzg5OCwxNiBAQAogICAgIGZvciAoeD0wOyB4IDwgKHNzaXplX3QpIGltYWdlLT5jb2x1bW5zOyB4KyspCiAgICAgewogICAgICAgaWYgKChjaGFubmVsICYgUmVkQ2hhbm5lbCkgIT0gMCkKLSAgICAgICAgcS0+cmVkPVNjYWxlQW55VG9RdWFudHVtKFNjYWxlUXVhbnR1bVRvQW55KHEtPnJlZCxyYW5nZSkscmFuZ2UpOworICAgICAgICBxLT5yZWQ9U2V0UGl4ZWxEZXB0aChxLT5yZWQsc2NhbGUpOwogICAgICAgaWYgKChjaGFubmVsICYgR3JlZW5DaGFubmVsKSAhPSAwKQotICAgICAgICBxLT5ncmVlbj1TY2FsZUFueVRvUXVhbnR1bShTY2FsZVF1YW50dW1Ub0FueShxLT5ncmVlbixyYW5nZSkscmFuZ2UpOworICAgICAgICBxLT5ncmVlbj1TZXRQaXhlbERlcHRoKHEtPmdyZWVuLHNjYWxlKTsKICAgICAgIGlmICgoY2hhbm5lbCAmIEJsdWVDaGFubmVsKSAhPSAwKQotICAgICAgICBxLT5ibHVlPVNjYWxlQW55VG9RdWFudHVtKFNjYWxlUXVhbnR1bVRvQW55KHEtPmJsdWUscmFuZ2UpLHJhbmdlKTsKKyAgICAgICAgcS0+Z3JlZW49U2V0UGl4ZWxEZXB0aChxLT5ibHVlLHNjYWxlKTsKICAgICAgIGlmICgoKGNoYW5uZWwgJiBPcGFjaXR5Q2hhbm5lbCkgIT0gMCkgJiYgKGltYWdlLT5tYXR0ZSAhPSBNYWdpY2tGYWxzZSkpCi0gICAgICAgIHEtPm9wYWNpdHk9U2NhbGVBbnlUb1F1YW50dW0oU2NhbGVRdWFudHVtVG9BbnkocS0+b3BhY2l0eSxyYW5nZSkscmFuZ2UpOworICAgICAgICBxLT5vcGFjaXR5PVNldFBpeGVsRGVwdGgocS0+b3BhY2l0eSxzY2FsZSk7CiAgICAgICBpZiAoKChjaGFubmVsICYgSW5kZXhDaGFubmVsKSAhPSAwKSAmJgogICAgICAgICAgIChpbWFnZS0+Y29sb3JzcGFjZSA9PSBDTVlLQ29sb3JzcGFjZSkpCi0gICAgICAgIGluZGV4ZXNbeF09U2NhbGVBbnlUb1F1YW50dW0oU2NhbGVRdWFudHVtVG9BbnkoaW5kZXhlc1t4XSxyYW5nZSkscmFuZ2UpOworICAgICAgICBpbmRleGVzW3hdPVNldFBpeGVsRGVwdGgoaW5kZXhlc1t4XSxzY2FsZSk7CiAgICAgICBxKys7CiAgICAgfQogICAgIGlmIChTeW5jQ2FjaGVWaWV3QXV0aGVudGljUGl4ZWxzKGltYWdlX3ZpZXcsZXhjZXB0aW9uKSA9PSBNYWdpY2tGYWxzZSkKQEAgLTkyMSwxNCArOTM2LDEzIEBACiAgICAgICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBpbWFnZS0+Y29sb3JzOyBpKyspCiAgICAgICB7CiAgICAgICAgIGlmICgoY2hhbm5lbCAmIFJlZENoYW5uZWwpICE9IDApCi0gICAgICAgICAgcC0+cmVkPVNjYWxlQW55VG9RdWFudHVtKFNjYWxlUXVhbnR1bVRvQW55KHAtPnJlZCxyYW5nZSkscmFuZ2UpOworICAgICAgICAgIHAtPnJlZD1TZXRQaXhlbERlcHRoKHAtPnJlZCxzY2FsZSk7CiAgICAgICAgIGlmICgoY2hhbm5lbCAmIEdyZWVuQ2hhbm5lbCkgIT0gMCkKLSAgICAgICAgICBwLT5ncmVlbj1TY2FsZUFueVRvUXVhbnR1bShTY2FsZVF1YW50dW1Ub0FueShwLT5ncmVlbixyYW5nZSkscmFuZ2UpOworICAgICAgICAgIHAtPmdyZWVuPVNldFBpeGVsRGVwdGgocC0+Z3JlZW4sc2NhbGUpOwogICAgICAgICBpZiAoKGNoYW5uZWwgJiBCbHVlQ2hhbm5lbCkgIT0gMCkKLSAgICAgICAgICBwLT5ibHVlPVNjYWxlQW55VG9RdWFudHVtKFNjYWxlUXVhbnR1bVRvQW55KHAtPmJsdWUscmFuZ2UpLHJhbmdlKTsKKyAgICAgICAgICBwLT5ibHVlPVNldFBpeGVsRGVwdGgocC0+Ymx1ZSxzY2FsZSk7CiAgICAgICAgIGlmICgoY2hhbm5lbCAmIE9wYWNpdHlDaGFubmVsKSAhPSAwKQotICAgICAgICAgIHAtPm9wYWNpdHk9U2NhbGVBbnlUb1F1YW50dW0oU2NhbGVRdWFudHVtVG9BbnkocC0+b3BhY2l0eSxyYW5nZSksCi0gICAgICAgICAgICByYW5nZSk7CisgICAgICAgICAgcC0+b3BhY2l0eT1TZXRQaXhlbERlcHRoKHAtPm9wYWNpdHksc2NhbGUpOwogICAgICAgICBwKys7CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWFnaWNrL2Jsb2IuYyBiL21hZ2ljay9ibG9iLmMKaW5kZXggOGYwMjI0Yi4uYjAyZDkzOCAxMDA2NDQKLS0tIGEvbWFnaWNrL2Jsb2IuYworKysgYi9tYWdpY2svYmxvYi5jCkBAIC0yMzUwLDExICsyMzUwLDExIEBACiAgICAgICAgICAgICAgIEdldFBhdGhDb21wb25lbnQoaW1hZ2UtPmZpbGVuYW1lLFJvb3RQYXRoLHBhdGgpOwogICAgICAgICAgICAgICBHZXRQYXRoQ29tcG9uZW50KGltYWdlLT5maWxlbmFtZSxFeHRlbnNpb25QYXRoLGV4dGVuc2lvbik7CiAgICAgICAgICAgICAgIGlmICgqZXh0ZW5zaW9uID09ICdcMCcpCi0gICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmaWxlbmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lbHUiLAotICAgICAgICAgICAgICAgICAgcGF0aCwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnNjZW5lKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZpbGVuYW1lLE1heFRleHRFeHRlbnQsIiVzLSUuMjBnIiwKKyAgICAgICAgICAgICAgICAgIHBhdGgsKGRvdWJsZSkgaW1hZ2UtPnNjZW5lKTsKICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZmlsZW5hbWUsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgICAgICIlcy0lbHUuJXMiLHBhdGgsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5zY2VuZSxleHRlbnNpb24pOworICAgICAgICAgICAgICAgICAgIiVzLSUuMjBnLiVzIixwYXRoLChkb3VibGUpIGltYWdlLT5zY2VuZSxleHRlbnNpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICh2b2lkKSBDb3B5TWFnaWNrU3RyaW5nKGltYWdlLT5maWxlbmFtZSxmaWxlbmFtZSxNYXhUZXh0RXh0ZW50KTsKICNpZiBkZWZpbmVkKG1hY2ludG9zaCkKQEAgLTI0MTYsNyArMjQxNiw3IEBACiAgICAgICAgICAgICAgICAgICBjb3VudD1mcmVhZChtYWdpY2ssMSxzaXplb2YobWFnaWNrKSxpbWFnZS0+YmxvYi0+ZmlsZSk7CiAgICAgICAgICAgICAgICAgICAodm9pZCkgcmV3aW5kKGltYWdlLT5ibG9iLT5maWxlKTsKICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChCbG9iRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAiICByZWFkICVsdSBtYWdpYyBoZWFkZXIgYnl0ZXMiLCh1bnNpZ25lZCBsb25nKSBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAiICByZWFkICUuMjBnIG1hZ2ljIGhlYWRlciBieXRlcyIsKGRvdWJsZSkgY291bnQpOwogI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9aTElCX0RFTEVHQVRFKQogICAgICAgICAgICAgICAgICAgaWYgKCgoaW50KSBtYWdpY2tbMF0gPT0gMHgxRikgJiYgKChpbnQpIG1hZ2lja1sxXSA9PSAweDhCKSAmJgogICAgICAgICAgICAgICAgICAgICAgICgoaW50KSBtYWdpY2tbMl0gPT0gMHgwOCkpCmRpZmYgLS1naXQgYS9tYWdpY2svY2FjaGUuYyBiL21hZ2ljay9jYWNoZS5jCmluZGV4IDhjMDk2ODkuLjcxMTA3ODAgMTAwNjQ0Ci0tLSBhL21hZ2ljay9jYWNoZS5jCisrKyBiL21hZ2ljay9jYWNoZS5jCkBAIC00MDc3LDggKzQwNzcsOCBAQAogICBjYWNoZV9pbmZvPShDYWNoZUluZm8gKikgaW1hZ2UtPmNhY2hlOwogICBzb3VyY2VfaW5mbz0oKmNhY2hlX2luZm8pOwogICBzb3VyY2VfaW5mby5maWxlPSgtMSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY2FjaGVfaW5mby0+ZmlsZW5hbWUsTWF4VGV4dEV4dGVudCwiJXNbJWx1XSIsCi0gICAgaW1hZ2UtPmZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKSBHZXRJbWFnZUluZGV4SW5MaXN0KGltYWdlKSk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY2FjaGVfaW5mby0+ZmlsZW5hbWUsTWF4VGV4dEV4dGVudCwiJXNbJS4yMGddIiwKKyAgICBpbWFnZS0+ZmlsZW5hbWUsKGRvdWJsZSkgR2V0SW1hZ2VJbmRleEluTGlzdChpbWFnZSkpOwogICBjYWNoZV9pbmZvLT5tb2RlPW1vZGU7CiAgIGNhY2hlX2luZm8tPnJvd3M9aW1hZ2UtPnJvd3M7CiAgIGNhY2hlX2luZm8tPmNvbHVtbnM9aW1hZ2UtPmNvbHVtbnM7CkBAIC00MTI1LDEwICs0MTI1LDEwIEBACiAgICAgICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU2l6ZShjYWNoZV9pbmZvLT5sZW5ndGgsTWFnaWNrVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LAotICAgICAgICAgICAgICAgICAgICAib3BlbiAlcyAoJXMgbWVtb3J5LCAlbHV4JWx1ICVzQikiLGNhY2hlX2luZm8tPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAib3BlbiAlcyAoJXMgbWVtb3J5LCAlLjIwZ3glLjIwZyAlc0IpIixjYWNoZV9pbmZvLT5maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgY2FjaGVfaW5mby0+bWFwcGVkICE9IE1hZ2lja0ZhbHNlID8gImFub255bW91cyIgOiAiaGVhcCIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjYWNoZV9pbmZvLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgICAgICAgICBjYWNoZV9pbmZvLT5yb3dzLGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIGNhY2hlX2luZm8tPmNvbHVtbnMsKGRvdWJsZSkgY2FjaGVfaW5mby0+cm93cywKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsCiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQyMTksMTAgKzQyMTksMTAgQEAKICAgICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTaXplKGNhY2hlX2luZm8tPmxlbmd0aCxNYWdpY2tUcnVlLAogICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOwogICAgICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgICAgICAgICAgICJvcGVuICVzICglc1slZF0sIG1lbW9yeS1tYXBwZWQsICVsdXglbHUgJXNCKSIsCisgICAgICAgICAgICAgICAgICAgICJvcGVuICVzICglc1slZF0sIG1lbW9yeS1tYXBwZWQsICUuMjBneCUuMjBnICVzQikiLAogICAgICAgICAgICAgICAgICAgICBjYWNoZV9pbmZvLT5maWxlbmFtZSxjYWNoZV9pbmZvLT5jYWNoZV9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVfaW5mby0+ZmlsZSwodW5zaWduZWQgbG9uZykgY2FjaGVfaW5mby0+Y29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNhY2hlX2luZm8tPnJvd3MsZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVfaW5mby0+ZmlsZSwoZG91YmxlKSBjYWNoZV9pbmZvLT5jb2x1bW5zLChkb3VibGUpCisgICAgICAgICAgICAgICAgICAgIGNhY2hlX2luZm8tPnJvd3MsZm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsCiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQyNDAsOSArNDI0MCw5IEBACiAgICAgewogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1NpemUoY2FjaGVfaW5mby0+bGVuZ3RoLE1hZ2lja0ZhbHNlLGZvcm1hdCk7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgIm9wZW4gJXMgKCVzWyVkXSwgZGlzaywgJWx1eCVsdSAlc0IpIixjYWNoZV9pbmZvLT5maWxlbmFtZSwKLSAgICAgICAgY2FjaGVfaW5mby0+Y2FjaGVfZmlsZW5hbWUsY2FjaGVfaW5mby0+ZmlsZSwodW5zaWduZWQgbG9uZykKLSAgICAgICAgY2FjaGVfaW5mby0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgY2FjaGVfaW5mby0+cm93cyxmb3JtYXQpOworICAgICAgICAib3BlbiAlcyAoJXNbJWRdLCBkaXNrLCAlLjIwZ3glLjIwZyAlc0IpIixjYWNoZV9pbmZvLT5maWxlbmFtZSwKKyAgICAgICAgY2FjaGVfaW5mby0+Y2FjaGVfZmlsZW5hbWUsY2FjaGVfaW5mby0+ZmlsZSwoZG91YmxlKQorICAgICAgICBjYWNoZV9pbmZvLT5jb2x1bW5zLChkb3VibGUpIGNhY2hlX2luZm8tPnJvd3MsZm9ybWF0KTsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsbWVzc2FnZSk7CiAgICAgfQogICByZXR1cm4oTWFnaWNrVHJ1ZSk7CkBAIC00NzMzLDEwICs0NzMzLDEwIEBACiAgIH0KICAgaWYgKChjYWNoZV9pbmZvLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkgJiYKICAgICAgIChRdWFudHVtVGljaygoTWFnaWNrT2Zmc2V0VHlwZSkgbmV4dXNfaW5mby0+cmVnaW9uLnksY2FjaGVfaW5mby0+cm93cykgIT0gTWFnaWNrRmFsc2UpKQotICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlc1slbHV4JWx1JStsZCUrbGRdIiwKLSAgICAgIGNhY2hlX2luZm8tPmZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKSBuZXh1c19pbmZvLT5yZWdpb24ud2lkdGgsCi0gICAgICAodW5zaWduZWQgbG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLmhlaWdodCwobG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLngsCi0gICAgICAobG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLnkpOworICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAorICAgICAgIiVzWyUuMjBneCUuMjBnJSsuMjBneCUrLjIwZ10iLGNhY2hlX2luZm8tPmZpbGVuYW1lLChkb3VibGUpCisgICAgICBuZXh1c19pbmZvLT5yZWdpb24ud2lkdGgsKGRvdWJsZSkgbmV4dXNfaW5mby0+cmVnaW9uLmhlaWdodCwoZG91YmxlKQorICAgICAgbmV4dXNfaW5mby0+cmVnaW9uLngsKGRvdWJsZSkgbmV4dXNfaW5mby0+cmVnaW9uLnkpOwogICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiB9CiAMCkBAIC00ODY0LDEwICs0ODY0LDEwIEBACiAgIH0KICAgaWYgKChjYWNoZV9pbmZvLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkgJiYKICAgICAgIChRdWFudHVtVGljaygoTWFnaWNrT2Zmc2V0VHlwZSkgbmV4dXNfaW5mby0+cmVnaW9uLnksY2FjaGVfaW5mby0+cm93cykgIT0gTWFnaWNrRmFsc2UpKQotICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlc1slbHV4JWx1JStsZCUrbGRdIiwKLSAgICAgIGNhY2hlX2luZm8tPmZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKSBuZXh1c19pbmZvLT5yZWdpb24ud2lkdGgsCi0gICAgICAodW5zaWduZWQgbG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLmhlaWdodCwobG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLngsCi0gICAgICAobG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLnkpOworICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAorICAgICAgIiVzWyUuMjBneCUuMjBnJSsuMjBneCUrLjIwZ10iLGNhY2hlX2luZm8tPmZpbGVuYW1lLChkb3VibGUpCisgICAgICBuZXh1c19pbmZvLT5yZWdpb24ud2lkdGgsKGRvdWJsZSkgbmV4dXNfaW5mby0+cmVnaW9uLmhlaWdodCwoZG91YmxlKQorICAgICAgbmV4dXNfaW5mby0+cmVnaW9uLngsKGRvdWJsZSkgbmV4dXNfaW5mby0+cmVnaW9uLnkpOwogICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiB9CiAMCkBAIC01NDQ5LDEwICs1NDQ5LDEwIEBACiAgIH0KICAgaWYgKChjYWNoZV9pbmZvLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkgJiYKICAgICAgIChRdWFudHVtVGljaygoTWFnaWNrT2Zmc2V0VHlwZSkgbmV4dXNfaW5mby0+cmVnaW9uLnksY2FjaGVfaW5mby0+cm93cykgIT0gTWFnaWNrRmFsc2UpKQotICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlc1slbHV4JWx1JStsZCUrbGRdIiwKLSAgICAgIGNhY2hlX2luZm8tPmZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKSBuZXh1c19pbmZvLT5yZWdpb24ud2lkdGgsCi0gICAgICAodW5zaWduZWQgbG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLmhlaWdodCwobG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLngsCi0gICAgICAobG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLnkpOworICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChDYWNoZUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAorICAgICAgIiVzWyUuMjBneCUuMjBnJSsuMjBneCUrLjIwZ10iLGNhY2hlX2luZm8tPmZpbGVuYW1lLChkb3VibGUpCisgICAgICBuZXh1c19pbmZvLT5yZWdpb24ud2lkdGgsKGRvdWJsZSkgbmV4dXNfaW5mby0+cmVnaW9uLmhlaWdodCwoZG91YmxlKQorICAgICAgbmV4dXNfaW5mby0+cmVnaW9uLngsKGRvdWJsZSkgbmV4dXNfaW5mby0+cmVnaW9uLnkpOwogICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiB9CiAMCkBAIC01NTgwLDkgKzU1ODAsOSBAQAogICB9CiAgIGlmICgoY2FjaGVfaW5mby0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpICYmCiAgICAgICAoUXVhbnR1bVRpY2soKE1hZ2lja09mZnNldFR5cGUpIG5leHVzX2luZm8tPnJlZ2lvbi55LGNhY2hlX2luZm8tPnJvd3MpICE9IE1hZ2lja0ZhbHNlKSkKLSAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ2FjaGVFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJXNbJWx1eCVsdSUrbGQlK2xkXSIsCi0gICAgICBjYWNoZV9pbmZvLT5maWxlbmFtZSwodW5zaWduZWQgbG9uZykgbmV4dXNfaW5mby0+cmVnaW9uLndpZHRoLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIG5leHVzX2luZm8tPnJlZ2lvbi5oZWlnaHQsKGxvbmcpIG5leHVzX2luZm8tPnJlZ2lvbi54LAotICAgICAgKGxvbmcpIG5leHVzX2luZm8tPnJlZ2lvbi55KTsKKyAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoQ2FjaGVFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKKyAgICAgICIlc1slLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGddIixjYWNoZV9pbmZvLT5maWxlbmFtZSwoZG91YmxlKQorICAgICAgbmV4dXNfaW5mby0+cmVnaW9uLndpZHRoLChkb3VibGUpIG5leHVzX2luZm8tPnJlZ2lvbi5oZWlnaHQsKGRvdWJsZSkKKyAgICAgIG5leHVzX2luZm8tPnJlZ2lvbi54LChkb3VibGUpIG5leHVzX2luZm8tPnJlZ2lvbi55KTsKICAgcmV0dXJuKE1hZ2lja1RydWUpOwogfQpkaWZmIC0tZ2l0IGEvbWFnaWNrL2RlcHJlY2F0ZS5jIGIvbWFnaWNrL2RlcHJlY2F0ZS5jCmluZGV4IDRmNzQ0ZmQuLjFmNWNmZDUgMTAwNjQ0Ci0tLSBhL21hZ2ljay9kZXByZWNhdGUuYworKysgYi9tYWdpY2svZGVwcmVjYXRlLmMKQEAgLTE0ODksNyArMTQ4OSw3IEBACiAgIGNoYXIKICAgICBrZXlbTWF4VGV4dEV4dGVudF07CiAKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhrZXksTWF4VGV4dEV4dGVudCwiJWxkXG4iLChsb25nKSBpZCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoa2V5LE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIGlkKTsKICAgcmV0dXJuKERlbGV0ZUltYWdlUmVnaXN0cnkoa2V5KSk7CiB9CiAMCkBAIC0yNjM4LDcgKzI2MzgsNyBAQAogCiAgICp0eXBlPVVuZGVmaW5lZFJlZ2lzdHJ5VHlwZTsKICAgKmxlbmd0aD0wOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGtleSxNYXhUZXh0RXh0ZW50LCIlbGRcbiIsKGxvbmcpIGlkKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhrZXksTWF4VGV4dEV4dGVudCwiJS4yMGdcbiIsKGRvdWJsZSkgaWQpOwogICBibG9iPSh2b2lkICopIEdldEltYWdlUmVnaXN0cnkoSW1hZ2VSZWdpc3RyeVR5cGUsa2V5LGV4Y2VwdGlvbik7CiAgIGlmIChibG9iICE9ICh2b2lkICopIE5VTEwpCiAgICAgcmV0dXJuKGJsb2IpOwpAQCAtNTk4Nyw3ICs1OTg3LDcgQEAKICAgc3RhdGljIHNzaXplX3QKICAgICBpZCA9IDA7CiAKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhrZXksTWF4VGV4dEV4dGVudCwiJWxkXG4iLChsb25nKSBpZCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoa2V5LE1heFRleHRFeHRlbnQsIiUuMjBnXG4iLChkb3VibGUpIGlkKTsKICAgc3RhdHVzPVNldEltYWdlUmVnaXN0cnkodHlwZSxrZXksYmxvYixleGNlcHRpb24pOwogICBpZiAoc3RhdHVzID09IE1hZ2lja0ZhbHNlKQogICAgIHJldHVybigtMSk7CmRpZmYgLS1naXQgYS9tYWdpY2svZGlzcGxheS5jIGIvbWFnaWNrL2Rpc3BsYXkuYwppbmRleCA5NmQyZmFlLi43YTVkZjYxIDEwMDY0NAotLS0gYS9tYWdpY2svZGlzcGxheS5jCisrKyBiL21hZ2ljay9kaXNwbGF5LmMKQEAgLTMwODAsOSArMzA4MCw5IEBACiAgICAgICAgICovCiAgICAgICAgIGlmICh3aW5kb3dzLT5pbmZvLm1hcHBlZCA9PSBNYWdpY2tGYWxzZSkKICAgICAgICAgICAodm9pZCkgWE1hcFdpbmRvdyhkaXNwbGF5LHdpbmRvd3MtPmluZm8uaWQpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwiICVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNob3BfaW5mby53aWR0aCwodW5zaWduZWQgbG9uZykgY2hvcF9pbmZvLmhlaWdodCwKLSAgICAgICAgICAobG9uZykgY2hvcF9pbmZvLngsKGxvbmcpIGNob3BfaW5mby55KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgIiAlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIGNob3BfaW5mby53aWR0aCwoZG91YmxlKQorICAgICAgICAgIGNob3BfaW5mby5oZWlnaHQsKGRvdWJsZSkgY2hvcF9pbmZvLngsKGRvdWJsZSkgY2hvcF9pbmZvLnkpOwogICAgICAgICBYSW5mb1dpZGdldChkaXNwbGF5LHdpbmRvd3MsdGV4dCk7CiAgICAgICAgIFhIaWdobGlnaHRMaW5lKGRpc3BsYXksd2luZG93cy0+aW1hZ2UuaWQsCiAgICAgICAgICAgd2luZG93cy0+aW1hZ2UuaGlnaGxpZ2h0X2NvbnRleHQsJnNlZ21lbnRfaW5mbyk7CkBAIC00MzcwLDkgKzQzNzAsOCBAQAogICBoZWlnaHQ9KHVuc2lnbmVkIGludCkgd2luZG93cy0+aW1hZ2Uud2luZG93X2NoYW5nZXMuaGVpZ2h0OwogICBpZiAoaW1hZ2UtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChYMTFFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICJDb25maWd1cmUgSW1hZ2U6ICVkeCVkPT4lbHV4JWx1Iix3aW5kb3dzLT5pbWFnZS54aW1hZ2UtPndpZHRoLAotICAgICAgd2luZG93cy0+aW1hZ2UueGltYWdlLT5oZWlnaHQsKHVuc2lnbmVkIGxvbmcpIHdpZHRoLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIGhlaWdodCk7CisgICAgICAiQ29uZmlndXJlIEltYWdlOiAlZHglZD0+JS4yMGd4JS4yMGciLHdpbmRvd3MtPmltYWdlLnhpbWFnZS0+d2lkdGgsCisgICAgICB3aW5kb3dzLT5pbWFnZS54aW1hZ2UtPmhlaWdodCwoZG91YmxlKSB3aWR0aCwoZG91YmxlKSBoZWlnaHQpOwogICBpZiAoKHdpZHRoKmhlaWdodCkgPT0gMCkKICAgICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiAgIHg9MDsKQEAgLTQ4MjYsOSArNDgyNSw5IEBACiAgICAgICAgICAgKi8KICAgICAgICAgICBpZiAod2luZG93cy0+aW5mby5tYXBwZWQgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAodm9pZCkgWE1hcFdpbmRvdyhkaXNwbGF5LHdpbmRvd3MtPmluZm8uaWQpOwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LCIgJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjcm9wX2luZm8ud2lkdGgsKHVuc2lnbmVkIGxvbmcpIGNyb3BfaW5mby5oZWlnaHQsCi0gICAgICAgICAgICAobG9uZykgY3JvcF9pbmZvLngsKGxvbmcpIGNyb3BfaW5mby55KTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICIgJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwoZG91YmxlKSBjcm9wX2luZm8ud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICAgIGNyb3BfaW5mby5oZWlnaHQsKGRvdWJsZSkgY3JvcF9pbmZvLngsKGRvdWJsZSkgY3JvcF9pbmZvLnkpOwogICAgICAgICAgIFhJbmZvV2lkZ2V0KGRpc3BsYXksd2luZG93cyx0ZXh0KTsKICAgICAgICAgICBYSGlnaGxpZ2h0UmVjdGFuZ2xlKGRpc3BsYXksd2luZG93cy0+aW1hZ2UuaWQsCiAgICAgICAgICAgICB3aW5kb3dzLT5pbWFnZS5oaWdobGlnaHRfY29udGV4dCwmaGlnaGxpZ2h0X2luZm8pOwpAQCAtNDkxOSw5ICs0OTE4LDkgQEAKICAgICAgICAgICAvKgogICAgICAgICAgICAgRGlzcGxheSBwb2ludGVyIHBvc2l0aW9uLgogICAgICAgICAgICovCi0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsIiAlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNyb3BfaW5mby53aWR0aCwodW5zaWduZWQgbG9uZykgY3JvcF9pbmZvLmhlaWdodCwKLSAgICAgICAgICAgIChsb25nKSBjcm9wX2luZm8ueCwobG9uZykgY3JvcF9pbmZvLnkpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICAgIiAlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIGNyb3BfaW5mby53aWR0aCwoZG91YmxlKQorICAgICAgICAgICAgY3JvcF9pbmZvLmhlaWdodCwoZG91YmxlKSBjcm9wX2luZm8ueCwoZG91YmxlKSBjcm9wX2luZm8ueSk7CiAgICAgICAgICAgWEluZm9XaWRnZXQoZGlzcGxheSx3aW5kb3dzLHRleHQpOwogICAgICAgICB9CiAgICAgICBoaWdobGlnaHRfaW5mbz1jcm9wX2luZm87CkBAIC01MjAzLDkgKzUyMDIsOSBAQAogICAgICAgICAgIC8qCiAgICAgICAgICAgICBTZXQgcHJpbWFyeSBzZWxlY3Rpb24uCiAgICAgICAgICAgKi8KLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwiJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjcm9wX2luZm8ud2lkdGgsKHVuc2lnbmVkIGxvbmcpIGNyb3BfaW5mby5oZWlnaHQsCi0gICAgICAgICAgICAobG9uZykgY3JvcF9pbmZvLngsKGxvbmcpIGNyb3BfaW5mby55KTsKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIGNyb3BfaW5mby53aWR0aCwoZG91YmxlKQorICAgICAgICAgICAgY3JvcF9pbmZvLmhlaWdodCwoZG91YmxlKSBjcm9wX2luZm8ueCwoZG91YmxlKSBjcm9wX2luZm8ueSk7CiAgICAgICAgICAgcmVxdWVzdD0oJihldmVudC54c2VsZWN0aW9ucmVxdWVzdCkpOwogICAgICAgICAgICh2b2lkKSBYQ2hhbmdlUHJvcGVydHkocmVxdWVzdC0+ZGlzcGxheSxyZXF1ZXN0LT5yZXF1ZXN0b3IsCiAgICAgICAgICAgICByZXF1ZXN0LT5wcm9wZXJ0eSxyZXF1ZXN0LT50YXJnZXQsOCxQcm9wTW9kZVJlcGxhY2UsCkBAIC01OTA4LDEwICs1OTA3LDEwIEBACiAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgRGlzcGxheSBpbmZvIGFuZCBkcmF3IGRyYXdpbmcgcmVjdGFuZ2xlLgogICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwiICVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHJlY3RhbmdsZV9pbmZvLndpZHRoLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgICAgICAgIHJlY3RhbmdsZV9pbmZvLmhlaWdodCwobG9uZykgcmVjdGFuZ2xlX2luZm8ueCwKLSAgICAgICAgICAgICAgICAobG9uZykgcmVjdGFuZ2xlX2luZm8ueSk7CisgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICAgICAgICIgJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwoZG91YmxlKSByZWN0YW5nbGVfaW5mby53aWR0aCwKKyAgICAgICAgICAgICAgICAoZG91YmxlKSByZWN0YW5nbGVfaW5mby5oZWlnaHQsKGRvdWJsZSkgcmVjdGFuZ2xlX2luZm8ueCwKKyAgICAgICAgICAgICAgICAoZG91YmxlKSByZWN0YW5nbGVfaW5mby55KTsKICAgICAgICAgICAgICAgWEluZm9XaWRnZXQoZGlzcGxheSx3aW5kb3dzLHRleHQpOwogICAgICAgICAgICAgICBYSGlnaGxpZ2h0UmVjdGFuZ2xlKGRpc3BsYXksd2luZG93cy0+aW1hZ2UuaWQsCiAgICAgICAgICAgICAgICAgd2luZG93cy0+aW1hZ2UuaGlnaGxpZ2h0X2NvbnRleHQsJnJlY3RhbmdsZV9pbmZvKTsKQEAgLTU5MzIsMTAgKzU5MzEsMTAgQEAKICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICBEaXNwbGF5IGluZm8gYW5kIGRyYXcgZHJhd2luZyByZWN0YW5nbGUuCiAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LCIgJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgcmVjdGFuZ2xlX2luZm8ud2lkdGgsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgICAgcmVjdGFuZ2xlX2luZm8uaGVpZ2h0LChsb25nKSByZWN0YW5nbGVfaW5mby54LChsb25nKQotICAgICAgICAgICAgICAgIHJlY3RhbmdsZV9pbmZvLnkpOworICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRleHQsTWF4VGV4dEV4dGVudCwKKyAgICAgICAgICAgICAgICAiICUuMjBneCUuMjBnJSsuMjBneCUrLjIwZyIsKGRvdWJsZSkgcmVjdGFuZ2xlX2luZm8ud2lkdGgsCisgICAgICAgICAgICAgICAgKGRvdWJsZSkgcmVjdGFuZ2xlX2luZm8uaGVpZ2h0LChkb3VibGUpIHJlY3RhbmdsZV9pbmZvLngsCisgICAgICAgICAgICAgICAgKGRvdWJsZSkgcmVjdGFuZ2xlX2luZm8ueSk7CiAgICAgICAgICAgICAgIFhJbmZvV2lkZ2V0KGRpc3BsYXksd2luZG93cyx0ZXh0KTsKICAgICAgICAgICAgICAgWEhpZ2hsaWdodEVsbGlwc2UoZGlzcGxheSx3aW5kb3dzLT5pbWFnZS5pZCwKICAgICAgICAgICAgICAgICB3aW5kb3dzLT5pbWFnZS5oaWdobGlnaHRfY29udGV4dCwmcmVjdGFuZ2xlX2luZm8pOwpAQCAtNzMwNiw4ICs3MzA1LDggQEAKICAgICAgIGhlaWdodD0oc2l6ZV90KSB3aW5kb3dzLT5pbWFnZS54aW1hZ2UtPmhlaWdodDsKICAgICAgIHg9MDsKICAgICAgIHk9MDsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJWx1eCVsdSswKzAiLAotICAgICAgICAodW5zaWduZWQgbG9uZykgd2lkdGgsKHVuc2lnbmVkIGxvbmcpIGhlaWdodCk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiUuMjBneCUuMjBnKzArMCIsCisgICAgICAgIChkb3VibGUpIHdpZHRoLChkb3VibGUpIGhlaWdodCk7CiAgICAgICBzdGF0dXM9WERpYWxvZ1dpZGdldChkaXNwbGF5LHdpbmRvd3MsIlJlc2l6ZSIsCiAgICAgICAgICJFbnRlciByZXNpemUgZ2VvbWV0cnkgKGUuZy4gNjQweDQ4MCwgMjAwJSk6IixnZW9tZXRyeSk7CiAgICAgICBpZiAoKmdlb21ldHJ5ID09ICdcMCcpCkBAIC0xMTMyMiw5ICsxMTMyMSw5IEBACiAgICAgICAgICAgKi8KICAgICAgICAgICBpZiAod2luZG93cy0+aW5mby5tYXBwZWQgPT0gTWFnaWNrRmFsc2UpCiAgICAgICAgICAgICAodm9pZCkgWE1hcFdpbmRvdyhkaXNwbGF5LHdpbmRvd3MtPmluZm8uaWQpOwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LCIgJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSByb2lfaW5mby53aWR0aCwodW5zaWduZWQgbG9uZykgcm9pX2luZm8uaGVpZ2h0LAotICAgICAgICAgICAgKGxvbmcpIHJvaV9pbmZvLngsKGxvbmcpIHJvaV9pbmZvLnkpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICAgIiAlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIHJvaV9pbmZvLndpZHRoLChkb3VibGUpCisgICAgICAgICAgICByb2lfaW5mby5oZWlnaHQsKGRvdWJsZSkgcm9pX2luZm8ueCwoZG91YmxlKSByb2lfaW5mby55KTsKICAgICAgICAgICBYSW5mb1dpZGdldChkaXNwbGF5LHdpbmRvd3MsdGV4dCk7CiAgICAgICAgICAgWEhpZ2hsaWdodFJlY3RhbmdsZShkaXNwbGF5LHdpbmRvd3MtPmltYWdlLmlkLAogICAgICAgICAgICAgd2luZG93cy0+aW1hZ2UuaGlnaGxpZ2h0X2NvbnRleHQsJmhpZ2hsaWdodF9pbmZvKTsKQEAgLTExNDE4LDkgKzExNDE3LDkgQEAKICAgICAgICAgICAvKgogICAgICAgICAgICAgRGlzcGxheSBwb2ludGVyIHBvc2l0aW9uLgogICAgICAgICAgICovCi0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsIiAlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHJvaV9pbmZvLndpZHRoLCh1bnNpZ25lZCBsb25nKSByb2lfaW5mby5oZWlnaHQsCi0gICAgICAgICAgICAobG9uZykgcm9pX2luZm8ueCwobG9uZykgcm9pX2luZm8ueSk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgICAiICUuMjBneCUuMjBnJSsuMjBneCUrLjIwZyIsKGRvdWJsZSkgcm9pX2luZm8ud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICAgIHJvaV9pbmZvLmhlaWdodCwoZG91YmxlKSByb2lfaW5mby54LChkb3VibGUpIHJvaV9pbmZvLnkpOwogICAgICAgICAgIFhJbmZvV2lkZ2V0KGRpc3BsYXksd2luZG93cyx0ZXh0KTsKICAgICAgICAgfQogICAgICAgaGlnaGxpZ2h0X2luZm89cm9pX2luZm87CkBAIC0xMTc1OCw5ICsxMTc1Nyw5IEBACiAgICAgICAgICAgLyoKICAgICAgICAgICAgIFNldCBwcmltYXJ5IHNlbGVjdGlvbi4KICAgICAgICAgICAqLwotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1JStsZCUrbGQiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHJvaV9pbmZvLndpZHRoLCh1bnNpZ25lZCBsb25nKSByb2lfaW5mby5oZWlnaHQsCi0gICAgICAgICAgICAobG9uZykgcm9pX2luZm8ueCwobG9uZykgcm9pX2luZm8ueSk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LE1heFRleHRFeHRlbnQsCisgICAgICAgICAgICAiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwoZG91YmxlKSByb2lfaW5mby53aWR0aCwoZG91YmxlKQorICAgICAgICAgICAgcm9pX2luZm8uaGVpZ2h0LChkb3VibGUpIHJvaV9pbmZvLngsKGRvdWJsZSkgcm9pX2luZm8ueSk7CiAgICAgICAgICAgcmVxdWVzdD0oJihldmVudC54c2VsZWN0aW9ucmVxdWVzdCkpOwogICAgICAgICAgICh2b2lkKSBYQ2hhbmdlUHJvcGVydHkocmVxdWVzdC0+ZGlzcGxheSxyZXF1ZXN0LT5yZXF1ZXN0b3IsCiAgICAgICAgICAgICByZXF1ZXN0LT5wcm9wZXJ0eSxyZXF1ZXN0LT50YXJnZXQsOCxQcm9wTW9kZVJlcGxhY2UsCkBAIC0xMjQwMyw3ICsxMjQwMiw3IEBACiAgICAgICAvKgogICAgICAgICBSZXF1ZXN0IEpQRUcgcXVhbGl0eSBmcm9tIHVzZXIuCiAgICAgICAqLwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhxdWFsaXR5LE1heFRleHRFeHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHF1YWxpdHksTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCiAgICAgICAgIGltYWdlLT5xdWFsaXR5KTsKICAgICAgIHN0YXR1cz1YRGlhbG9nV2lkZ2V0KGRpc3BsYXksd2luZG93cywiU2F2ZSIsIkVudGVyIEpQRUcgcXVhbGl0eToiLAogICAgICAgICBxdWFsaXR5KTsKQEAgLTEyNzgwLDEwICsxMjc3OSw5IEBACiAgICAgICAvKgogICAgICAgICBEaXNwbGF5IGluZm8gb24gY3JvcHBpbmcgcmVjdGFuZ2xlLgogICAgICAgKi8KLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LCIgJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNyb3BfaW5mby0+d2lkdGgsKHVuc2lnbmVkIGxvbmcpIGNyb3BfaW5mby0+aGVpZ2h0LAotICAgICAgICAobG9uZykgY3JvcF9pbmZvLT54LAotICAgICAgICAobG9uZykgY3JvcF9pbmZvLT55KTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGV4dCxNYXhUZXh0RXh0ZW50LCIgJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwKKyAgICAgICAgKGRvdWJsZSkgY3JvcF9pbmZvLT53aWR0aCwoZG91YmxlKSBjcm9wX2luZm8tPmhlaWdodCwoZG91YmxlKQorICAgICAgICBjcm9wX2luZm8tPngsKGRvdWJsZSkgY3JvcF9pbmZvLT55KTsKICAgICAgIFhJbmZvV2lkZ2V0KGRpc3BsYXksd2luZG93cyx0ZXh0KTsKICAgICB9CiAgIC8qCkBAIC0xMzczNSwxMSArMTM3MzMsMTEgQEAKICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICB7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoWDExRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICJJbWFnZTogJXNbJWx1XSAlbHV4JWx1ICIsaW1hZ2UtPmZpbGVuYW1lLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgaW1hZ2UtPnJvd3MpOworICAgICAgICAiSW1hZ2U6ICVzWyUuMjBnXSAlLjIwZ3glLjIwZyAiLGltYWdlLT5maWxlbmFtZSwoZG91YmxlKSBpbWFnZS0+c2NlbmUsCisgICAgICAgIChkb3VibGUpIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgIGlmIChpbWFnZS0+Y29sb3JzICE9IDApCi0gICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChYMTFFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJWx1YyAiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sb3JzKTsKKyAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlLjIwZ2MgIiwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5jb2xvcnMpOwogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsaW1hZ2UtPm1hZ2ljayk7CiAgICAgfQogICAvKgpAQCAtMTQzODMsMTIgKzE0MzgxLDEyIEBACiAgIGlmIChkaXNwbGF5X2ltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICB7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoWDExRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICJJbWFnZTogJXNbJWx1XSAlbHV4JWx1ICIsZGlzcGxheV9pbWFnZS0+ZmlsZW5hbWUsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBkaXNwbGF5X2ltYWdlLT5zY2VuZSwodW5zaWduZWQgbG9uZykKLSAgICAgICAgZGlzcGxheV9pbWFnZS0+Y29sdW1ucywodW5zaWduZWQgbG9uZykgZGlzcGxheV9pbWFnZS0+cm93cyk7CisgICAgICAgICJJbWFnZTogJXNbJS4yMGddICUuMjBneCUuMjBnICIsZGlzcGxheV9pbWFnZS0+ZmlsZW5hbWUsCisgICAgICAgIChkb3VibGUpIGRpc3BsYXlfaW1hZ2UtPnNjZW5lLChkb3VibGUpIGRpc3BsYXlfaW1hZ2UtPmNvbHVtbnMsCisgICAgICAgIChkb3VibGUpIGRpc3BsYXlfaW1hZ2UtPnJvd3MpOwogICAgICAgaWYgKGRpc3BsYXlfaW1hZ2UtPmNvbG9ycyAhPSAwKQotICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoWDExRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVsdWMgIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgZGlzcGxheV9pbWFnZS0+Y29sb3JzKTsKKyAgICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFgxMUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlLjIwZ2MgIiwoZG91YmxlKQorICAgICAgICAgIGRpc3BsYXlfaW1hZ2UtPmNvbG9ycyk7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoWDExRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIiwKICAgICAgICAgZGlzcGxheV9pbWFnZS0+bWFnaWNrKTsKICAgICB9CkBAIC0xNDUwOSw5ICsxNDUwNyw4IEBACiAgICAgICAgICAgIiVzOiAlcyIsTWFnaWNrUGFja2FnZU5hbWUsZmlsZW5hbWUpOwogICAgICAgZWxzZQogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHdpbmRvd3MtPmltYWdlLm5hbWUsTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAiJXM6ICVzWyVsdSBvZiAlbHVdIixNYWdpY2tQYWNrYWdlTmFtZSxmaWxlbmFtZSwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICBkaXNwbGF5X2ltYWdlLT5zY2VuZSwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICBHZXRJbWFnZUxpc3RMZW5ndGgoZGlzcGxheV9pbWFnZSkpOworICAgICAgICAgICIlczogJXNbJS4yMGcgb2YgJS4yMGddIixNYWdpY2tQYWNrYWdlTmFtZSxmaWxlbmFtZSwoZG91YmxlKQorICAgICAgICAgIGRpc3BsYXlfaW1hZ2UtPnNjZW5lLChkb3VibGUpIEdldEltYWdlTGlzdExlbmd0aChkaXNwbGF5X2ltYWdlKSk7CiAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyh3aW5kb3dzLT5pbWFnZS5pY29uX25hbWUsZmlsZW5hbWUsTWF4VGV4dEV4dGVudCk7CiAgICAgfQogICBpZiAocmVzb3VyY2VfaW5mby0+aW1tdXRhYmxlKQpkaWZmIC0tZ2l0IGEvbWFnaWNrL2Rpc3RvcnQuYyBiL21hZ2ljay9kaXN0b3J0LmMKaW5kZXggN2VlNWY3OS4uNWIzYjdkMiAxMDA2NDQKLS0tIGEvbWFnaWNrL2Rpc3RvcnQuYworKysgYi9tYWdpY2svZGlzdG9ydC5jCkBAIC0zODUsOCArMzg1LDggQEAKICAgICAgIH0KICAgICAgIGlmICggbnVtYmVyX2FyZ3VtZW50cyA8IDEraSpjcF9zaXplICkgewogICAgICAgICAodm9pZCkgVGhyb3dNYWdpY2tFeGNlcHRpb24oZXhjZXB0aW9uLEdldE1hZ2lja01vZHVsZSgpLE9wdGlvbkVycm9yLAotICAgICAgICAgICAgICAgIkludmFsaWRBcmd1bWVudCIsICIlcyA6ICdyZXF1aXJlIGF0IGxlYXN0ICVsZCBDUHMnIiwKLSAgICAgICAgICAgICAgICJQb2x5bm9taWFsIiwgKGxvbmcpIGkpOworICAgICAgICAgICAgICAgIkludmFsaWRBcmd1bWVudCIsICIlcyA6ICdyZXF1aXJlIGF0IGxlYXN0ICUuMjBnIENQcyciLAorICAgICAgICAgICAgICAgIlBvbHlub21pYWwiLCAoZG91YmxlKSBpKTsKICAgICAgICAgcmV0dXJuKChkb3VibGUgKikgTlVMTCk7CiAgICAgICB9CiAgICAgICBicmVhazsKQEAgLTQ2Myw4ICs0NjMsOCBAQAogICAgICAgaWYgKCBudW1iZXJfYXJndW1lbnRzJWNwX3NpemUgIT0gMCB8fAogICAgICAgICAgICBudW1iZXJfYXJndW1lbnRzIDwgY3Bfc2l6ZSApIHsKICAgICAgICAgKHZvaWQpIFRocm93TWFnaWNrRXhjZXB0aW9uKGV4Y2VwdGlvbixHZXRNYWdpY2tNb2R1bGUoKSxPcHRpb25FcnJvciwKLSAgICAgICAgICAgICAgICJJbnZhbGlkQXJndW1lbnQiLCAiJXMgOiAncmVxdWlyZSBhdCBsZWFzdCAlbGQgQ1BzJyIsCi0gICAgICAgICAgICAgICAiQWZmaW5lIiwgMUwpOworICAgICAgICAgICAgICAgIkludmFsaWRBcmd1bWVudCIsICIlcyA6ICdyZXF1aXJlIGF0IGxlYXN0ICUuMjBnIENQcyciLAorICAgICAgICAgICAgICAgIkFmZmluZSIsIDEuMCk7CiAgICAgICAgIGNvZWZmPShkb3VibGUgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShjb2VmZik7CiAgICAgICAgIHJldHVybigoZG91YmxlICopIE5VTEwpOwogICAgICAgfQpAQCAtNzQwLDggKzc0MCw4IEBACiAgICAgICBpZiAoIG51bWJlcl9hcmd1bWVudHMlY3Bfc2l6ZSAhPSAwIHx8CiAgICAgICAgICAgIG51bWJlcl9hcmd1bWVudHMgPCBjcF9zaXplKjQgKSB7CiAgICAgICAgICh2b2lkKSBUaHJvd01hZ2lja0V4Y2VwdGlvbihleGNlcHRpb24sR2V0TWFnaWNrTW9kdWxlKCksT3B0aW9uRXJyb3IsCi0gICAgICAgICAgICAgICJJbnZhbGlkQXJndW1lbnQiLCAiJXMgOiAncmVxdWlyZSBhdCBsZWFzdCAlbGQgQ1BzJyIsCi0gICAgICAgICAgICAgIE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrRGlzdG9ydE9wdGlvbnMsICptZXRob2QpLCA0TCk7CisgICAgICAgICAgICAgICJJbnZhbGlkQXJndW1lbnQiLCAiJXMgOiAncmVxdWlyZSBhdCBsZWFzdCAlLjIwZyBDUHMnIiwKKyAgICAgICAgICAgICAgTWFnaWNrT3B0aW9uVG9NbmVtb25pYyhNYWdpY2tEaXN0b3J0T3B0aW9ucywgKm1ldGhvZCksIDQuMCk7CiAgICAgICAgIGNvZWZmPShkb3VibGUgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShjb2VmZik7CiAgICAgICAgIHJldHVybigoZG91YmxlICopIE5VTEwpOwogICAgICAgfQpAQCAtODU2LDggKzg1Niw4IEBACiAgICAgICBpZiAoIG51bWJlcl9hcmd1bWVudHMlY3Bfc2l6ZSAhPSAwIHx8CiAgICAgICAgICAgIG51bWJlcl9hcmd1bWVudHMgPCBjcF9zaXplKjQgKSB7CiAgICAgICAgICh2b2lkKSBUaHJvd01hZ2lja0V4Y2VwdGlvbihleGNlcHRpb24sR2V0TWFnaWNrTW9kdWxlKCksT3B0aW9uRXJyb3IsCi0gICAgICAgICAgICAgICJJbnZhbGlkQXJndW1lbnQiLCAiJXMgOiAncmVxdWlyZSBhdCBsZWFzdCAlbGQgQ1BzJyIsCi0gICAgICAgICAgICAgIE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrRGlzdG9ydE9wdGlvbnMsICptZXRob2QpLCA0TCk7CisgICAgICAgICAgICAgICJJbnZhbGlkQXJndW1lbnQiLCAiJXMgOiAncmVxdWlyZSBhdCBsZWFzdCAlLjIwZyBDUHMnIiwKKyAgICAgICAgICAgICAgTWFnaWNrT3B0aW9uVG9NbmVtb25pYyhNYWdpY2tEaXN0b3J0T3B0aW9ucywgKm1ldGhvZCksIDQuMCk7CiAgICAgICAgIGNvZWZmPShkb3VibGUgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShjb2VmZik7CiAgICAgICAgIHJldHVybigoZG91YmxlICopIE5VTEwpOwogICAgICAgfQpAQCAtMTI5OCw4ICsxMjk4LDggQEAKICAgICAgIGlmICggbnVtYmVyX2FyZ3VtZW50cyVjcF9zaXplICE9IDAgfHwKICAgICAgICAgICAgbnVtYmVyX2FyZ3VtZW50cyA8IGNwX3NpemUgKSB7CiAgICAgICAgICh2b2lkKSBUaHJvd01hZ2lja0V4Y2VwdGlvbihleGNlcHRpb24sR2V0TWFnaWNrTW9kdWxlKCksT3B0aW9uRXJyb3IsCi0gICAgICAgICAgICAgICJJbnZhbGlkQXJndW1lbnQiLCAiJXMgOiAncmVxdWlyZSBhdCBsZWFzdCAlbGQgQ1BzJyIsCi0gICAgICAgICAgICAgIE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrRGlzdG9ydE9wdGlvbnMsICptZXRob2QpLCAxTCk7CisgICAgICAgICAgICAgICJJbnZhbGlkQXJndW1lbnQiLCAiJXMgOiAncmVxdWlyZSBhdCBsZWFzdCAlLjIwZyBDUHMnIiwKKyAgICAgICAgICAgICAgTWFnaWNrT3B0aW9uVG9NbmVtb25pYyhNYWdpY2tEaXN0b3J0T3B0aW9ucywgKm1ldGhvZCksIDEuMCk7CiAgICAgICAgIGNvZWZmPShkb3VibGUgKikgUmVsaW5xdWlzaE1hZ2lja01lbW9yeShjb2VmZik7CiAgICAgICAgIHJldHVybigoZG91YmxlICopIE5VTEwpOwogICAgICAgfQpAQCAtMTY1MCw5ICsxNjUwLDkgQEAKIAogICAgIC8qIFNldCBkZXN0aW5hdGlvbiBpbWFnZSBzaXplIGFuZCB2aXJ0dWFsIG9mZnNldCAqLwogICAgIGlmICggYmVzdGZpdCB8fCB2aWV3cG9ydF9naXZlbiApIHsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoaW1hZ2VfZ2VuLCBNYXhUZXh0RXh0ZW50LCIgIC1zaXplICVsdXglbHUgIgotICAgICAgICAiLXBhZ2UgJStsZCUrbGQgeGM6ICtpbnNlcnQgXFxcbiIsKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LndpZHRoLAotICAgICAgICAodW5zaWduZWQgbG9uZykgZ2VvbWV0cnkuaGVpZ2h0LChsb25nKSBnZW9tZXRyeS54LChsb25nKSBnZW9tZXRyeS55KTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoaW1hZ2VfZ2VuLCBNYXhUZXh0RXh0ZW50LCIgIC1zaXplICUuMjBneCUuMjBnICIKKyAgICAgICAgIi1wYWdlICUrLjIwZ3glKy4yMGcgeGM6ICtpbnNlcnQgXFxcbiIsKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsCisgICAgICAgIChkb3VibGUpIGdlb21ldHJ5LmhlaWdodCwoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5LnkpOwogICAgICAgbG9va3VwPSJ2LnB7IHh4LXYucGFnZS54LS41LCB5eS12LnBhZ2UueC0uNSB9IjsKICAgICB9CiAgICAgZWxzZSB7CkBAIC0xODExLDcgKzE4MTEsNyBAQAogICAgICAgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFyYyBEaXN0b3J0LCBJbnRlcm5hbCBDb2VmZmljaWVudHM6XG4iKTsKICAgICAgICAgZm9yICggaT0wOyBpPDU7IGkrKyApCi0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIGMlbGQgPSAlK2xmXG4iLCAobG9uZykgaSwgY29lZmZbaV0pOworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBjJS4yMGcgPSAlK2xmXG4iLCAoZG91YmxlKSBpLCBjb2VmZltpXSk7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQXJjIERpc3RvcnQsIEZYIEVxdWl2ZWxlbnQ6XG4iKTsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGltYWdlX2dlbik7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAtZnggJ2lpPWkrcGFnZS54OyBqaj1qK3BhZ2UueTtcbiIpOwpAQCAtMTgyOSw3ICsxODI5LDcgQEAKICAgICAgIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQb2xhciBEaXN0b3J0LCBJbnRlcm5hbCBDb2VmZmljZW50c1xuIik7CiAgICAgICAgIGZvciAoIGk9MDsgaTw4OyBpKysgKQotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBjJWxkID0gJStsZlxuIiwgKGxvbmcpIGksIGNvZWZmW2ldKTsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgYyUuMjBnID0gJStsZlxuIiwgKGRvdWJsZSkgaSwgY29lZmZbaV0pOwogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBvbGFyIERpc3RvcnQsIEZYIEVxdWl2ZWxlbnQ6XG4iKTsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGltYWdlX2dlbik7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAtZnggJ2lpPWkrcGFnZS54JStsZjsgamo9aitwYWdlLnklK2xmO1xuIiwKQEAgLTE4NDgsNyArMTg0OCw3IEBACiAgICAgICB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRGVQb2xhciBEaXN0b3J0LCBJbnRlcm5hbCBDb2VmZmljZW50c1xuIik7CiAgICAgICAgIGZvciAoIGk9MDsgaTw4OyBpKysgKQotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBjJWxkID0gJStsZlxuIiwgKGxvbmcpIGksIGNvZWZmW2ldKTsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgYyUuMjBnID0gJStsZlxuIiwgKGRvdWJsZSkgaSwgY29lZmZbaV0pOwogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRlUG9sYXIgRGlzdG9ydCwgRlggRXF1aXZlbGVudDpcbiIpOwogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaW1hZ2VfZ2VuKTsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIC1meCAnYWE9KGkrLjUpKiVsZiAlK2xmO1xuIiwgY29lZmZbNl0sIC1jb2VmZls0XSApOwpkaWZmIC0tZ2l0IGEvbWFnaWNrL2RyYXcuYyBiL21hZ2ljay9kcmF3LmMKaW5kZXggM2U2OWU3ZC4uMjZmZDNlZiAxMDA2NDQKLS0tIGEvbWFnaWNrL2RyYXcuYworKysgYi9tYWdpY2svZHJhdy5jCkBAIC00MTYsOCArNDE2LDggQEAKICAgcD1wb2x5Z29uX2luZm8tPmVkZ2VzOwogICBmb3IgKGk9MDsgaSA8IChzc2l6ZV90KSBwb2x5Z29uX2luZm8tPm51bWJlcl9lZGdlczsgaSsrKQogICB7Ci0gICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KERyYXdFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiICAgICAgZWRnZSAlbHU6IiwKLSAgICAgKHVuc2lnbmVkIGxvbmcpIGkpOworICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChEcmF3RXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiAgICAgIGVkZ2UgJS4yMGc6IiwKKyAgICAgIChkb3VibGUpIGkpOwogICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChEcmF3RXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiAgICAgIGRpcmVjdGlvbjogJXMiLAogICAgICAgcC0+ZGlyZWN0aW9uICE9IE1hZ2lja0ZhbHNlID8gImRvd24iIDogInVwIik7CiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KERyYXdFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiICAgICAgZ2hvc3RsaW5lOiAlcyIsCkBAIC0yNDIyLDkgKzI0MjIsOCBAQAogICAgICAgICAgICAgICAgICh2b2lkKSBTZXRJbWFnZUFydGlmYWN0KGltYWdlLGtleSx0b2tlbik7CiAgICAgICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhrZXksTWF4VGV4dEV4dGVudCwiJXMtZ2VvbWV0cnkiLG5hbWUpOwogICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgICAgICIlbHV4JWx1JStsZCUrbGQiLCh1bnNpZ25lZCBsb25nKSBib3VuZHMud2lkdGgsCi0gICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYm91bmRzLmhlaWdodCwobG9uZykgYm91bmRzLngsCi0gICAgICAgICAgICAgICAgICAobG9uZykgYm91bmRzLnkpOworICAgICAgICAgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBneCUrLjIwZyIsKGRvdWJsZSkgYm91bmRzLndpZHRoLChkb3VibGUpCisgICAgICAgICAgICAgICAgICBib3VuZHMuaGVpZ2h0LChkb3VibGUpIGJvdW5kcy54LChkb3VibGUpIGJvdW5kcy55KTsKICAgICAgICAgICAgICAgICAodm9pZCkgU2V0SW1hZ2VBcnRpZmFjdChpbWFnZSxrZXksZ2VvbWV0cnkpOwogICAgICAgICAgICAgICAgIEdldE1hZ2lja1Rva2VuKHEsJnEsdG9rZW4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDA2MCwzNCArNDA1OSwzNCBAQAogICAgIGNhc2UgUG9pbnRQcmltaXRpdmU6CiAgICAgewogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KERyYXdFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIlBvaW50UHJpbWl0aXZlICVsZCwlbGQgJXMiLChsb25nKSB4LChsb25nKSB5LAorICAgICAgICAiUG9pbnRQcmltaXRpdmUgJS4yMGcsJS4yMGcgJXMiLChkb3VibGUpIHgsKGRvdWJsZSkgeSwKICAgICAgICAgbWV0aG9kc1twcmltaXRpdmVfaW5mby0+bWV0aG9kXSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNhc2UgQ29sb3JQcmltaXRpdmU6CiAgICAgewogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KERyYXdFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIkNvbG9yUHJpbWl0aXZlICVsZCwlbGQgJXMiLChsb25nKSB4LChsb25nKSB5LAorICAgICAgICAiQ29sb3JQcmltaXRpdmUgJS4yMGcsJS4yMGcgJXMiLChkb3VibGUpIHgsKGRvdWJsZSkgeSwKICAgICAgICAgbWV0aG9kc1twcmltaXRpdmVfaW5mby0+bWV0aG9kXSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNhc2UgTWF0dGVQcmltaXRpdmU6CiAgICAgewogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KERyYXdFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIk1hdHRlUHJpbWl0aXZlICVsZCwlbGQgJXMiLChsb25nKSB4LChsb25nKSB5LAorICAgICAgICAiTWF0dGVQcmltaXRpdmUgJS4yMGcsJS4yMGcgJXMiLChkb3VibGUpIHgsKGRvdWJsZSkgeSwKICAgICAgICAgbWV0aG9kc1twcmltaXRpdmVfaW5mby0+bWV0aG9kXSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNhc2UgVGV4dFByaW1pdGl2ZToKICAgICB7CiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoRHJhd0V2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiVGV4dFByaW1pdGl2ZSAlbGQsJWxkIiwobG9uZykgeCwobG9uZykgeSk7CisgICAgICAgICJUZXh0UHJpbWl0aXZlICUuMjBnLCUuMjBnIiwoZG91YmxlKSB4LChkb3VibGUpIHkpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjYXNlIEltYWdlUHJpbWl0aXZlOgogICAgIHsKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChEcmF3RXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICJJbWFnZVByaW1pdGl2ZSAlbGQsJWxkIiwobG9uZykgeCwobG9uZykgeSk7CisgICAgICAgICJJbWFnZVByaW1pdGl2ZSAlLjIwZywlLjIwZyIsKGRvdWJsZSkgeCwoZG91YmxlKSB5KTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgZGVmYXVsdDoKQEAgLTQxMDQsMjggKzQxMDMsMjggQEAKICAgICAgIHsKICAgICAgICAgY29vcmRpbmF0ZXM9KHNzaXplX3QpIHByaW1pdGl2ZV9pbmZvW2ldLmNvb3JkaW5hdGVzOwogICAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoRHJhd0V2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAgICIgICAgYmVnaW4gb3BlbiAoJWxkKSIsKGxvbmcpIGNvb3JkaW5hdGVzKTsKKyAgICAgICAgICAiICAgIGJlZ2luIG9wZW4gKCUuMjBnKSIsKGRvdWJsZSkgY29vcmRpbmF0ZXMpOwogICAgICAgICBwPXBvaW50OwogICAgICAgfQogICAgIHBvaW50PXByaW1pdGl2ZV9pbmZvW2ldLnBvaW50OwogICAgIGlmICgoZmFicyhxLngtcG9pbnQueCkgPiBNYWdpY2tFcHNpbG9uKSB8fAogICAgICAgICAoZmFicyhxLnktcG9pbnQueSkgPiBNYWdpY2tFcHNpbG9uKSkKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChEcmF3RXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgICAgICAlbGQ6ICUuMThnLCUuMThnIiwobG9uZykgY29vcmRpbmF0ZXMscG9pbnQueCxwb2ludC55KTsKKyAgICAgICAgIiAgICAgICUuMjBnOiAlLjE4ZywlLjE4ZyIsKGRvdWJsZSkgY29vcmRpbmF0ZXMscG9pbnQueCxwb2ludC55KTsKICAgICBlbHNlCiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoRHJhd0V2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICAgICAgJWxkOiAlZywlZyAoZHVwbGljYXRlKSIsKGxvbmcpIGNvb3JkaW5hdGVzLHBvaW50LngscG9pbnQueSk7CisgICAgICAgICIgICAgICAlLjIwZzogJWcsJWcgKGR1cGxpY2F0ZSkiLChkb3VibGUpIGNvb3JkaW5hdGVzLHBvaW50LngscG9pbnQueSk7CiAgICAgcT1wb2ludDsKICAgICBjb29yZGluYXRlcy0tOwogICAgIGlmIChjb29yZGluYXRlcyA+IDApCiAgICAgICBjb250aW51ZTsKICAgICBpZiAoKGZhYnMocC54LXBvaW50LngpID4gTWFnaWNrRXBzaWxvbikgfHwKICAgICAgICAgKGZhYnMocC55LXBvaW50LnkpID4gTWFnaWNrRXBzaWxvbikpCi0gICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoRHJhd0V2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIgICAgZW5kIGxhc3QgKCVsZCkiLAotICAgICAgICAobG9uZykgY29vcmRpbmF0ZXMpOworICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KERyYXdFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiICAgIGVuZCBsYXN0ICglLjIwZykiLAorICAgICAgICAoZG91YmxlKSBjb29yZGluYXRlcyk7CiAgICAgZWxzZQotICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KERyYXdFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiICAgIGVuZCBvcGVuICglbGQpIiwKLSAgICAgICAgKGxvbmcpIGNvb3JkaW5hdGVzKTsKKyAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChEcmF3RXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiAgICBlbmQgb3BlbiAoJS4yMGcpIiwKKyAgICAgICAgKGRvdWJsZSkgY29vcmRpbmF0ZXMpOwogICB9CiB9CiAKQEAgLTQ0ODIsOSArNDQ4MSw4IEBACiAgICAgICBnZW9tZXRyeS54PXg7CiAgICAgICBnZW9tZXRyeS55PXk7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGNvbXBvc2l0ZV9nZW9tZXRyeSxNYXhUZXh0RXh0ZW50LAotICAgICAgICAiJWx1eCVsdSUrbGQlK2xkIiwodW5zaWduZWQgbG9uZykgY29tcG9zaXRlX2ltYWdlLT5jb2x1bW5zLAotICAgICAgICAodW5zaWduZWQgbG9uZykgY29tcG9zaXRlX2ltYWdlLT5yb3dzLChsb25nKSBnZW9tZXRyeS54LChsb25nKQotICAgICAgICBnZW9tZXRyeS55KTsKKyAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBneCUrLjIwZyIsKGRvdWJsZSkgY29tcG9zaXRlX2ltYWdlLT5jb2x1bW5zLChkb3VibGUpCisgICAgICAgIGNvbXBvc2l0ZV9pbWFnZS0+cm93cywoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5LnkpOwogICAgICAgKHZvaWQpIFBhcnNlR3Jhdml0eUdlb21ldHJ5KGltYWdlLGNvbXBvc2l0ZV9nZW9tZXRyeSwmZ2VvbWV0cnksCiAgICAgICAgICZpbWFnZS0+ZXhjZXB0aW9uKTsKICAgICAgIGFmZmluZT1kcmF3X2luZm8tPmFmZmluZTsKZGlmZiAtLWdpdCBhL21hZ2ljay9lZmZlY3QuYyBiL21hZ2ljay9lZmZlY3QuYwppbmRleCA2N2E4YjkwLi41NmQ4NmQ3IDEwMDY0NAotLS0gYS9tYWdpY2svZWZmZWN0LmMKKysrIGIvbWFnaWNrL2VmZmVjdC5jCkBAIC04NzgsMTMgKzg3OCwxMyBAQAogICAgICAgICAqazsKIAogICAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFRyYW5zZm9ybUV2ZW50LEdldE1hZ2lja01vZHVsZSgpLAotICAgICAgICAiICBCbHVySW1hZ2Ugd2l0aCAlbHUga2VybmVsOiIsKHVuc2lnbmVkIGxvbmcpIHdpZHRoKTsKKyAgICAgICAgIiAgQmx1ckltYWdlIHdpdGggJS4yMGcga2VybmVsOiIsKGRvdWJsZSkgd2lkdGgpOwogICAgICAgbWVzc2FnZT1BY3F1aXJlU3RyaW5nKCIiKTsKICAgICAgIGs9a2VybmVsOwogICAgICAgZm9yIChpPTA7IGkgPCAoc3NpemVfdCkgd2lkdGg7IGkrKykKICAgICAgIHsKICAgICAgICAgKm1lc3NhZ2U9J1wwJzsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmb3JtYXQsTWF4VGV4dEV4dGVudCwiJWxkOiAiLChsb25nKSBpKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmb3JtYXQsTWF4VGV4dEV4dGVudCwiJS4yMGc6ICIsKGRvdWJsZSkgaSk7CiAgICAgICAgICh2b2lkKSBDb25jYXRlbmF0ZVN0cmluZygmbWVzc2FnZSxmb3JtYXQpOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZvcm1hdCxNYXhUZXh0RXh0ZW50LCIlZyAiLCprKyspOwogICAgICAgICAodm9pZCkgQ29uY2F0ZW5hdGVTdHJpbmcoJm1lc3NhZ2UsZm9ybWF0KTsKQEAgLTEzODAsMTQgKzEzODAsMTQgQEAKICAgICAgICAgKms7CiAKICAgICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChUcmFuc2Zvcm1FdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwKLSAgICAgICAgIiAgQ29udm9sdmVJbWFnZSB3aXRoICVsdXglbHUga2VybmVsOiIsKHVuc2lnbmVkIGxvbmcpIHdpZHRoLAotICAgICAgICAodW5zaWduZWQgbG9uZykgd2lkdGgpOworICAgICAgICAiICBDb252b2x2ZUltYWdlIHdpdGggJS4yMGd4JS4yMGcga2VybmVsOiIsKGRvdWJsZSkgd2lkdGgsKGRvdWJsZSkKKyAgICAgICAgd2lkdGgpOwogICAgICAgbWVzc2FnZT1BY3F1aXJlU3RyaW5nKCIiKTsKICAgICAgIGs9a2VybmVsOwogICAgICAgZm9yICh2PTA7IHYgPCAoc3NpemVfdCkgd2lkdGg7IHYrKykKICAgICAgIHsKICAgICAgICAgKm1lc3NhZ2U9J1wwJzsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmb3JtYXQsTWF4VGV4dEV4dGVudCwiJWxkOiAiLChsb25nKSB2KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmb3JtYXQsTWF4VGV4dEV4dGVudCwiJS4yMGc6ICIsKGRvdWJsZSkgdik7CiAgICAgICAgICh2b2lkKSBDb25jYXRlbmF0ZVN0cmluZygmbWVzc2FnZSxmb3JtYXQpOwogICAgICAgICBmb3IgKHU9MDsgdSA8IChzc2l6ZV90KSB3aWR0aDsgdSsrKQogICAgICAgICB7CkBAIC0yMjI2LDE0ICsyMjI2LDE0IEBACiAgICAgICAgICprOwogCiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoVHJhbnNmb3JtRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgIEZpbHRlckltYWdlIHdpdGggJWxkeCVsZCBrZXJuZWw6IiwodW5zaWduZWQgbG9uZykga2VybmVsLT53aWR0aCwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGtlcm5lbC0+aGVpZ2h0KTsKKyAgICAgICAgIiAgRmlsdGVySW1hZ2Ugd2l0aCAlLjIwZ3glLjIwZyBrZXJuZWw6IiwoZG91YmxlKSBrZXJuZWwtPndpZHRoLChkb3VibGUpCisgICAgICAgIGtlcm5lbC0+aGVpZ2h0KTsKICAgICAgIG1lc3NhZ2U9QWNxdWlyZVN0cmluZygiIik7CiAgICAgICBrPWtlcm5lbC0+dmFsdWVzOwogICAgICAgZm9yICh2PTA7IHYgPCAoc3NpemVfdCkga2VybmVsLT5oZWlnaHQ7IHYrKykKICAgICAgIHsKICAgICAgICAgKm1lc3NhZ2U9J1wwJzsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmb3JtYXQsTWF4VGV4dEV4dGVudCwiJWxkOiAiLChsb25nKSB2KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhmb3JtYXQsTWF4VGV4dEV4dGVudCwiJS4yMGc6ICIsKGRvdWJsZSkgdik7CiAgICAgICAgICh2b2lkKSBDb25jYXRlbmF0ZVN0cmluZygmbWVzc2FnZSxmb3JtYXQpOwogICAgICAgICBmb3IgKHU9MDsgdSA8IChzc2l6ZV90KSBrZXJuZWwtPndpZHRoOyB1KyspCiAgICAgICAgIHsKQEAgLTM0NzEsOCArMzQ3MSw4IEBACiAgICAgICAgIHg9KHNzaXplX3QpICgoaSsxKSp0aHVtYm5haWwtPmNvbHVtbnMpL051bWJlclRpbGVzOwogICAgICAgICB5PShzc2l6ZV90KSAoKGkrMSkqdGh1bWJuYWlsLT5yb3dzKS9OdW1iZXJUaWxlczsKICAgICAgICAgcHJldmlld19pbWFnZT1Sb2xsSW1hZ2UodGh1bWJuYWlsLHgseSxleGNlcHRpb24pOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGxhYmVsLE1heFRleHRFeHRlbnQsInJvbGwgJWxkeCVsZCIsKGxvbmcpIHgsCi0gICAgICAgICAgKGxvbmcpIHkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGxhYmVsLE1heFRleHRFeHRlbnQsInJvbGwgJSsuMjBneCUrLjIwZyIsCisgICAgICAgICAgKGRvdWJsZSkgeCwoZG91YmxlKSB5KTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIEh1ZVByZXZpZXc6CkBAIC0zNTI0LDggKzM1MjQsOCBAQAogICAgICAgICBpZiAocHJldmlld19pbWFnZSAhPSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICBmb3IgKHg9MDsgeCA8IGk7IHgrKykKICAgICAgICAgICAgICh2b2lkKSBDb250cmFzdEltYWdlKHByZXZpZXdfaW1hZ2UsTWFnaWNrVHJ1ZSk7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobGFiZWwsTWF4VGV4dEV4dGVudCwiY29udHJhc3QgKCVsZCkiLChsb25nKQotICAgICAgICAgIGkrMSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobGFiZWwsTWF4VGV4dEV4dGVudCwiY29udHJhc3QgKCUuMjBnKSIsCisgICAgICAgICAgKGRvdWJsZSkgaSsxKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIER1bGxQcmV2aWV3OgpAQCAtMzUzNSw4ICszNTM1LDggQEAKICAgICAgICAgICBicmVhazsKICAgICAgICAgZm9yICh4PTA7IHggPCBpOyB4KyspCiAgICAgICAgICAgKHZvaWQpIENvbnRyYXN0SW1hZ2UocHJldmlld19pbWFnZSxNYWdpY2tGYWxzZSk7Ci0gICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobGFiZWwsTWF4VGV4dEV4dGVudCwiK2NvbnRyYXN0ICglbGQpIiwKLSAgICAgICAgICAobG9uZykgaSsxKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhsYWJlbCxNYXhUZXh0RXh0ZW50LCIrY29udHJhc3QgKCUuMjBnKSIsCisgICAgICAgICAgKGRvdWJsZSkgaSsxKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIEdyYXlzY2FsZVByZXZpZXc6CkBAIC0zNTQ5LDcgKzM1NDksNyBAQAogICAgICAgICBxdWFudGl6ZV9pbmZvLmNvbG9yc3BhY2U9R1JBWUNvbG9yc3BhY2U7CiAgICAgICAgICh2b2lkKSBRdWFudGl6ZUltYWdlKCZxdWFudGl6ZV9pbmZvLHByZXZpZXdfaW1hZ2UpOwogICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGxhYmVsLE1heFRleHRFeHRlbnQsCi0gICAgICAgICAgIi1jb2xvcnNwYWNlIGdyYXkgLWNvbG9ycyAlbHUiLCh1bnNpZ25lZCBsb25nKSBjb2xvcnMpOworICAgICAgICAgICItY29sb3JzcGFjZSBncmF5IC1jb2xvcnMgJS4yMGciLChkb3VibGUpIGNvbG9ycyk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBRdWFudGl6ZVByZXZpZXc6CkBAIC0zNTYwLDggKzM1NjAsOCBAQAogICAgICAgICBjb2xvcnM8PD0xOwogICAgICAgICBxdWFudGl6ZV9pbmZvLm51bWJlcl9jb2xvcnM9Y29sb3JzOwogICAgICAgICAodm9pZCkgUXVhbnRpemVJbWFnZSgmcXVhbnRpemVfaW5mbyxwcmV2aWV3X2ltYWdlKTsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhsYWJlbCxNYXhUZXh0RXh0ZW50LCJjb2xvcnMgJWx1IiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZykgY29sb3JzKTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhsYWJlbCxNYXhUZXh0RXh0ZW50LCJjb2xvcnMgJS4yMGciLChkb3VibGUpCisgICAgICAgICAgY29sb3JzKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIERlc3BlY2tsZVByZXZpZXc6CkBAIC0zNTc3LDggKzM1NzcsOCBAQAogICAgICAgICBwcmV2aWV3X2ltYWdlPURlc3BlY2tsZUltYWdlKHRodW1ibmFpbCxleGNlcHRpb24pOwogICAgICAgICBpZiAocHJldmlld19pbWFnZSA9PSAoSW1hZ2UgKikgTlVMTCkKICAgICAgICAgICBicmVhazsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhsYWJlbCxNYXhUZXh0RXh0ZW50LCJkZXNwZWNrbGUgKCVsZCkiLChsb25nKQotICAgICAgICAgIGkrMSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobGFiZWwsTWF4VGV4dEV4dGVudCwiZGVzcGVja2xlICglLjIwZykiLAorICAgICAgICAgIChkb3VibGUpIGkrMSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBSZWR1Y2VOb2lzZVByZXZpZXc6CkBAIC0zNjk5LDkgKzM2OTksOSBAQAogICAgICAgICBnZW9tZXRyeS54PWkvMjsKICAgICAgICAgZ2VvbWV0cnkueT1pLzI7CiAgICAgICAgICh2b2lkKSBSYWlzZUltYWdlKHByZXZpZXdfaW1hZ2UsJmdlb21ldHJ5LE1hZ2lja1RydWUpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGxhYmVsLE1heFRleHRFeHRlbnQsInJhaXNlICVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGdlb21ldHJ5LndpZHRoLCh1bnNpZ25lZCBsb25nKSBnZW9tZXRyeS5oZWlnaHQsCi0gICAgICAgICAgKGxvbmcpIGdlb21ldHJ5LngsKGxvbmcpIGdlb21ldHJ5LnkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGxhYmVsLE1heFRleHRFeHRlbnQsCisgICAgICAgICAgInJhaXNlICUuMjBneCUuMjBnJSsuMjBneCUrLjIwZyIsKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsKGRvdWJsZSkKKyAgICAgICAgICBnZW9tZXRyeS5oZWlnaHQsKGRvdWJsZSkgZ2VvbWV0cnkueCwoZG91YmxlKSBnZW9tZXRyeS55KTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIFNlZ21lbnRQcmV2aWV3OgpAQCAtMzc2Nyw4ICszNzY3LDggQEAKICAgICAgICAgaWYgKHByZXZpZXdfaW1hZ2UgPT0gKEltYWdlICopIE5VTEwpCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIHByZXZpZXdfaW5mby0+cXVhbGl0eT0oc2l6ZV90KSBwZXJjZW50YWdlOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZhY3RvcixNYXhUZXh0RXh0ZW50LCIlbHUiLAotICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBwcmV2aWV3X2luZm8tPnF1YWxpdHkpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZhY3RvcixNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgICBwcmV2aWV3X2luZm8tPnF1YWxpdHkpOwogICAgICAgICBmaWxlPUFjcXVpcmVVbmlxdWVGaWxlUmVzb3VyY2UoZmlsZW5hbWUpOwogICAgICAgICBpZiAoZmlsZSAhPSAtMSkKICAgICAgICAgICBmaWxlPWNsb3NlKGZpbGUpLTE7CkBAIC0zODAwLDggKzM4MDAsOCBAQAogICAgICAgICAgICAgICAicXVhbGl0eSAlc1xuJWdrYiAiLGZhY3RvciwoZG91YmxlKSAoKE1hZ2lja09mZnNldFR5cGUpCiAgICAgICAgICAgICAgIEdldEJsb2JTaXplKHByZXZpZXdfaW1hZ2UpKS8xMDI0LjApOwogICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobGFiZWwsTWF4VGV4dEV4dGVudCwicXVhbGl0eSAlc1xuJWx1YiAiLAotICAgICAgICAgICAgICBmYWN0b3IsKHVuc2lnbmVkIGxvbmcpIEdldEJsb2JTaXplKHRodW1ibmFpbCkpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhsYWJlbCxNYXhUZXh0RXh0ZW50LCJxdWFsaXR5ICVzXG4lLjIwZ2IgIiwKKyAgICAgICAgICAgICAgZmFjdG9yLChkb3VibGUpIEdldEJsb2JTaXplKHRodW1ibmFpbCkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CkBAIC00NTE2LDE0ICs0NTE2LDE0IEBACiAgICAgICAgICprOwogCiAgICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoVHJhbnNmb3JtRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksCi0gICAgICAgICIgIFNlbGVjdGl2ZUJsdXJJbWFnZSB3aXRoICVsdXglbHUga2VybmVsOiIsKHVuc2lnbmVkIGxvbmcpIHdpZHRoLAotICAgICAgICAodW5zaWduZWQgbG9uZykgd2lkdGgpOworICAgICAgICAiICBTZWxlY3RpdmVCbHVySW1hZ2Ugd2l0aCAlLjIwZ3glLjIwZyBrZXJuZWw6IiwoZG91YmxlKSB3aWR0aCwoZG91YmxlKQorICAgICAgICB3aWR0aCk7CiAgICAgICBtZXNzYWdlPUFjcXVpcmVTdHJpbmcoIiIpOwogICAgICAgaz1rZXJuZWw7CiAgICAgICBmb3IgKHY9MDsgdiA8IChzc2l6ZV90KSB3aWR0aDsgdisrKQogICAgICAgewogICAgICAgICAqbWVzc2FnZT0nXDAnOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZvcm1hdCxNYXhUZXh0RXh0ZW50LCIlbGQ6ICIsKGxvbmcpIHYpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZvcm1hdCxNYXhUZXh0RXh0ZW50LCIlLjIwZzogIiwoZG91YmxlKSB2KTsKICAgICAgICAgKHZvaWQpIENvbmNhdGVuYXRlU3RyaW5nKCZtZXNzYWdlLGZvcm1hdCk7CiAgICAgICAgIGZvciAodT0wOyB1IDwgKHNzaXplX3QpIHdpZHRoOyB1KyspCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL21hZ2ljay9leGNlcHRpb24uYyBiL21hZ2ljay9leGNlcHRpb24uYwppbmRleCAxOGUwOWEzLi40ZWQxODU3IDEwMDY0NAotLS0gYS9tYWdpY2svZXhjZXB0aW9uLmMKKysrIGIvbWFnaWNrL2V4Y2VwdGlvbi5jCkBAIC05ODEsOCArOTgxLDggQEAKICAgICB0eXBlPSJlcnJvciI7CiAgIGlmIChzZXZlcml0eSA+PSBGYXRhbEVycm9yRXhjZXB0aW9uKQogICAgIHR5cGU9ImZhdGFsIjsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsIiVzIEAgJXMvJXMvJXMvJWx1IixyZWFzb24sCi0gICAgdHlwZSxwYXRoLGZ1bmN0aW9uLCh1bnNpZ25lZCBsb25nKSBsaW5lKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtZXNzYWdlLE1heFRleHRFeHRlbnQsIiVzIEAgJXMvJXMvJXMvJS4yMGciLHJlYXNvbiwKKyAgICB0eXBlLHBhdGgsZnVuY3Rpb24sKGRvdWJsZSkgbGluZSk7CiAgICh2b2lkKSBUaHJvd0V4Y2VwdGlvbihleGNlcHRpb24sc2V2ZXJpdHksbWVzc2FnZSwoY2hhciAqKSBOVUxMKTsKICAgcmV0dXJuKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9tYWdpY2svZnguYyBiL21hZ2ljay9meC5jCmluZGV4IGZhNjRjZjEuLjRkMGIzM2IgMTAwNjQ0Ci0tLSBhL21hZ2ljay9meC5jCisrKyBiL21hZ2ljay9meC5jCkBAIC05MTksNyArOTE5LDcgQEAKICAgICAgIGZvciAodj0wOyB2IDwgNjsgdisrKQogICAgICAgewogICAgICAgICAqbWVzc2FnZT0nXDAnOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZvcm1hdCxNYXhUZXh0RXh0ZW50LCIlbGQ6ICIsKGxvbmcpIHYpOworICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZvcm1hdCxNYXhUZXh0RXh0ZW50LCIlLjIwZzogIiwoZG91YmxlKSB2KTsKICAgICAgICAgKHZvaWQpIENvbmNhdGVuYXRlU3RyaW5nKCZtZXNzYWdlLGZvcm1hdCk7CiAgICAgICAgIGZvciAodT0wOyB1IDwgNjsgdSsrKQogICAgICAgICB7CkBAIC0xMTUzLDggKzExNTMsOCBAQAogICAgICAgY2FzZSAnayc6IGNoYW5uZWw9QmxhY2tDaGFubmVsOyBicmVhazsKICAgICAgIGRlZmF1bHQ6IGJyZWFrOwogICAgIH0KLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhrZXksTWF4VGV4dEV4dGVudCwiJXAuJWxkLiVzIiwodm9pZCAqKSBpbWFnZSwKLSAgICAobG9uZykgY2hhbm5lbCxzeW1ib2wpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGtleSxNYXhUZXh0RXh0ZW50LCIlcC4lLjIwZy4lcyIsKHZvaWQgKikgaW1hZ2UsCisgICAgKGRvdWJsZSkgY2hhbm5lbCxzeW1ib2wpOwogICB2YWx1ZT0oY29uc3QgY2hhciAqKSBHZXRWYWx1ZUZyb21TcGxheVRyZWUoZnhfaW5mby0+c3ltYm9scyxrZXkpOwogICBpZiAodmFsdWUgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKICAgICByZXR1cm4oUXVhbnR1bVNjYWxlKlN0cmluZ1RvRG91YmxlKHZhbHVlKSk7CkBAIC0xMTY1LDggKzExNjUsOCBAQAogICAgICAgICBkZXB0aDsKIAogICAgICAgZGVwdGg9R2V0SW1hZ2VDaGFubmVsRGVwdGgoaW1hZ2UsY2hhbm5lbCxleGNlcHRpb24pOwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhzdGF0aXN0aWMsTWF4VGV4dEV4dGVudCwiJWx1IiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGRlcHRoKTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoc3RhdGlzdGljLE1heFRleHRFeHRlbnQsIiUuMjBnIiwoZG91YmxlKQorICAgICAgICBkZXB0aCk7CiAgICAgfQogICBpZiAoTG9jYWxlTkNvbXBhcmUoc3ltYm9sLCJrdXJ0b3NpcyIsOCkgPT0gMCkKICAgICB7CkBAIC0yNDE5LDkgKzI0MTksOSBAQAogICAgICAgICAgIGlmIChzdHJsZW4oc3ViZXhwcmVzc2lvbikgPiAxKQogICAgICAgICAgICAgc3ViZXhwcmVzc2lvbltzdHJsZW4oc3ViZXhwcmVzc2lvbiktMV09J1wwJzsKICAgICAgICAgICBpZiAoZnhfaW5mby0+ZmlsZSAhPSAoRklMRSAqKSBOVUxMKQotICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoZnhfaW5mby0+ZmlsZSwiJXNbJWxkLCVsZF0uJXM6ICVzPSUuKmdcbiIsCi0gICAgICAgICAgICAgIGZ4X2luZm8tPmltYWdlcy0+ZmlsZW5hbWUsKGxvbmcpIHgsKGxvbmcpIHksdHlwZSxzdWJleHByZXNzaW9uLAotICAgICAgICAgICAgICBHZXRNYWdpY2tQcmVjaXNpb24oKSwoZG91YmxlKSBhbHBoYSk7CisgICAgICAgICAgICAodm9pZCkgZnByaW50ZihmeF9pbmZvLT5maWxlLCIlc1slLjIwZywlLjIwZ10uJXM6ICVzPSUuKmdcbiIsCisgICAgICAgICAgICAgIGZ4X2luZm8tPmltYWdlcy0+ZmlsZW5hbWUsKGRvdWJsZSkgeCwoZG91YmxlKSB5LHR5cGUsCisgICAgICAgICAgICAgIHN1YmV4cHJlc3Npb24sR2V0TWFnaWNrUHJlY2lzaW9uKCksKGRvdWJsZSkgYWxwaGEpOwogICAgICAgICAgIHJldHVybigwLjApOwogICAgICAgICB9CiAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21hZ2ljay9pZGVudGlmeS5jIGIvbWFnaWNrL2lkZW50aWZ5LmMKaW5kZXggZThlZjgyNi4uNWI0ZjhlMyAxMDA2NDQKLS0tIGEvbWFnaWNrL2lkZW50aWZ5LmMKKysrIGIvbWFnaWNrL2lkZW50aWZ5LmMKQEAgLTMyMSwyMiArMzIxLDIxIEBACiAgICAgICAgICAgIChpbWFnZS0+c2NlbmUgPT0gMCkpCiAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiVzICIsaW1hZ2UtPmZpbGVuYW1lKTsKICAgICAgIGVsc2UKLSAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJXNbJWx1XSAiLGltYWdlLT5maWxlbmFtZSwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICBpbWFnZS0+c2NlbmUpOworICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIlc1slLjIwZ10gIixpbWFnZS0+ZmlsZW5hbWUsKGRvdWJsZSkgaW1hZ2UtPnNjZW5lKTsKICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiVzICIsaW1hZ2UtPm1hZ2ljayk7CiAgICAgICBpZiAoKGltYWdlLT5tYWdpY2tfY29sdW1ucyAhPSAwKSB8fCAoaW1hZ2UtPm1hZ2lja19yb3dzICE9IDApKQogICAgICAgICBpZiAoKGltYWdlLT5tYWdpY2tfY29sdW1ucyAhPSBpbWFnZS0+Y29sdW1ucykgfHwKICAgICAgICAgICAgIChpbWFnZS0+bWFnaWNrX3Jvd3MgIT0gaW1hZ2UtPnJvd3MpKQotICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiVsdXglbHU9PiIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5tYWdpY2tfY29sdW1ucywKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBpbWFnZS0+bWFnaWNrX3Jvd3MpOwotICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJWx1eCVsdSAiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sdW1ucywKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIlLjIwZ3glLjIwZz0+IiwoZG91YmxlKSBpbWFnZS0+bWFnaWNrX2NvbHVtbnMsCisgICAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+bWFnaWNrX3Jvd3MpOworICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJS4yMGd4JS4yMGcgIiwoZG91YmxlKSBpbWFnZS0+Y29sdW1ucywoZG91YmxlKQorICAgICAgICBpbWFnZS0+cm93cyk7CiAgICAgICBpZiAoKGltYWdlLT5wYWdlLndpZHRoICE9IDApIHx8IChpbWFnZS0+cGFnZS5oZWlnaHQgIT0gMCkgfHwKICAgICAgICAgICAoaW1hZ2UtPnBhZ2UueCAhPSAwKSB8fCAoaW1hZ2UtPnBhZ2UueSAhPSAwKSkKLSAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJWx1eCVsdSUrbGQlK2xkICIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgaW1hZ2UtPnBhZ2Uud2lkdGgsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLmhlaWdodCwobG9uZykKLSAgICAgICAgICBpbWFnZS0+cGFnZS54LChsb25nKSBpbWFnZS0+cGFnZS55KTsKLSAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiVsdS1iaXQgIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlcHRoKTsKKyAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnICIsKGRvdWJsZSkKKyAgICAgICAgICBpbWFnZS0+cGFnZS53aWR0aCwoZG91YmxlKSBpbWFnZS0+cGFnZS5oZWlnaHQsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueCwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiUuMjBnLWJpdCAiLChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgICBpZiAoaW1hZ2UtPnR5cGUgIT0gVW5kZWZpbmVkVHlwZSkKICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJXMgIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKE1hZ2lja1R5cGVPcHRpb25zLAogICAgICAgICAgIChzc2l6ZV90KSBpbWFnZS0+dHlwZSkpOwpAQCAtMzUxLDEzICszNTAsMTIgQEAKICAgICAgICAgfQogICAgICAgZWxzZQogICAgICAgICBpZiAoaW1hZ2UtPnRvdGFsX2NvbG9ycyA8PSBpbWFnZS0+Y29sb3JzKQotICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIlBzZXVkb0NsYXNzICVsdWMgIiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgIGltYWdlLT5jb2xvcnMpOworICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIlBzZXVkb0NsYXNzICUuMjBnYyAiLChkb3VibGUpIGltYWdlLT5jb2xvcnMpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiUHNldWRvQ2xhc3MgJWx1PT4lbHVjICIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICBpbWFnZS0+dG90YWxfY29sb3JzLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+Y29sb3JzKTsKKyAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCJQc2V1ZG9DbGFzcyAlLjIwZz0+JS4yMGdjICIsKGRvdWJsZSkKKyAgICAgICAgICAgIGltYWdlLT50b3RhbF9jb2xvcnMsKGRvdWJsZSkgaW1hZ2UtPmNvbG9ycyk7CiAgICAgICBpZiAoaW1hZ2UtPmVycm9yLm1lYW5fZXJyb3JfcGVyX3BpeGVsICE9IDAuMCkKLSAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJWxkLyVmLyVmZGIgIiwobG9uZykKKyAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJS4yMGcvJWYvJWZkYiAiLChkb3VibGUpCiAgICAgICAgICAgKGltYWdlLT5lcnJvci5tZWFuX2Vycm9yX3Blcl9waXhlbCswLjUpLAogICAgICAgICAgIGltYWdlLT5lcnJvci5ub3JtYWxpemVkX21lYW5fZXJyb3IsCiAgICAgICAgICAgaW1hZ2UtPmVycm9yLm5vcm1hbGl6ZWRfbWF4aW11bV9lcnJvcik7CkBAIC0zNjYsOSArMzY0LDkgQEAKICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU2l6ZShHZXRCbG9iU2l6ZShpbWFnZSksTWFnaWNrRmFsc2UsZm9ybWF0KTsKICAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIlc0IgIixmb3JtYXQpOwogICAgICAgICB9Ci0gICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIlMC4zZnUgJWxkOiUwMmxkLiUwM2xkIix1c2VyX3RpbWUsKGxvbmcpCi0gICAgICAgIChlbGFwc2VkX3RpbWUvNjAuMCksKGxvbmcpIGZsb29yKGZtb2QoZWxhcHNlZF90aW1lLDYwLjApKSwKLSAgICAgICAgKGxvbmcpICgxMDAwLjAqKGVsYXBzZWRfdGltZS1mbG9vcihlbGFwc2VkX3RpbWUpKSkpOworICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiJTAuM2Z1ICUuMjBnOiUwMmcuJTAzZyIsdXNlcl90aW1lLChkb3VibGUpCisgICAgICAgIChlbGFwc2VkX3RpbWUvNjAuMCksZmxvb3IoZm1vZChlbGFwc2VkX3RpbWUsNjAuMCkpLAorICAgICAgICAoZG91YmxlKSAoMTAwMC4wKihlbGFwc2VkX3RpbWUtZmxvb3IoZWxhcHNlZF90aW1lKSkpKTsKICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIlxuIik7CiAgICAgICAodm9pZCkgZmZsdXNoKGZpbGUpOwogICAgICAgcmV0dXJuKGZlcnJvcihmaWxlKSAhPSAwID8gTWFnaWNrRmFsc2UgOiBNYWdpY2tUcnVlKTsKQEAgLTQwMSwxNCArMzk5LDE0IEBACiAgICAgICBHZXRNYWdpY2tEZXNjcmlwdGlvbihtYWdpY2tfaW5mbykpOwogICAodm9pZCkgZnByaW50ZihmaWxlLCIgIENsYXNzOiAlc1xuIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKE1hZ2lja0NsYXNzT3B0aW9ucywKICAgICAoc3NpemVfdCkgaW1hZ2UtPnN0b3JhZ2VfY2xhc3MpKTsKLSAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBHZW9tZXRyeTogJWx1eCVsdSUrbGQlK2xkXG4iLCh1bnNpZ25lZCBsb25nKQotICAgIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cywobG9uZykgaW1hZ2UtPnRpbGVfb2Zmc2V0LngsCi0gICAgKGxvbmcpIGltYWdlLT50aWxlX29mZnNldC55KTsKKyAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBHZW9tZXRyeTogJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnXG4iLChkb3VibGUpCisgICAgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MsKGRvdWJsZSkgaW1hZ2UtPnRpbGVfb2Zmc2V0LngsKGRvdWJsZSkKKyAgICBpbWFnZS0+dGlsZV9vZmZzZXQueSk7CiAgIGlmICgoaW1hZ2UtPm1hZ2lja19jb2x1bW5zICE9IDApIHx8IChpbWFnZS0+bWFnaWNrX3Jvd3MgIT0gMCkpCiAgICAgaWYgKChpbWFnZS0+bWFnaWNrX2NvbHVtbnMgIT0gaW1hZ2UtPmNvbHVtbnMpIHx8CiAgICAgICAgIChpbWFnZS0+bWFnaWNrX3Jvd3MgIT0gaW1hZ2UtPnJvd3MpKQotICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBCYXNlIGdlb21ldHJ5OiAlbHV4JWx1XG4iLCh1bnNpZ25lZCBsb25nKQotICAgICAgICBpbWFnZS0+bWFnaWNrX2NvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5tYWdpY2tfcm93cyk7CisgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIEJhc2UgZ2VvbWV0cnk6ICUuMjBneCUuMjBnXG4iLChkb3VibGUpCisgICAgICAgIGltYWdlLT5tYWdpY2tfY29sdW1ucywoZG91YmxlKSBpbWFnZS0+bWFnaWNrX3Jvd3MpOwogICBpZiAoKGltYWdlLT54X3Jlc29sdXRpb24gIT0gMC4wKSAmJiAoaW1hZ2UtPnlfcmVzb2x1dGlvbiAhPSAwLjApKQogICAgIHsKICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgUmVzb2x1dGlvbjogJWd4JWdcbiIsaW1hZ2UtPnhfcmVzb2x1dGlvbiwKQEAgLTQ0OCwxMCArNDQ2LDEwIEBACiAgICAgICAgIH0KICAgICAgIGRlcHRoPUdldEltYWdlRGVwdGgoaW1hZ2UsJmltYWdlLT5leGNlcHRpb24pOwogICAgICAgaWYgKGltYWdlLT5kZXB0aCA9PSBkZXB0aCkKLSAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBEZXB0aDogJWx1LWJpdFxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlcHRoKTsKKyAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBEZXB0aDogJS4yMGctYml0XG4iLChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgICBlbHNlCi0gICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgRGVwdGg6ICVsdS8lbHUtYml0XG4iLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgIGltYWdlLT5kZXB0aCwodW5zaWduZWQgbG9uZykgZGVwdGgpOworICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIERlcHRoOiAlLjIwZy8lLjIwZy1iaXRcbiIsKGRvdWJsZSkKKyAgICAgICAgICBpbWFnZS0+ZGVwdGgsKGRvdWJsZSkgZGVwdGgpOwogICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBDaGFubmVsIGRlcHRoOlxuIik7CiAgICAgICBpZiAoSXNHcmF5SW1hZ2UoaW1hZ2UsJmltYWdlLT5leGNlcHRpb24pICE9IE1hZ2lja0ZhbHNlKQogICAgICAgICBjb2xvcnNwYWNlPUdSQVlDb2xvcnNwYWNlOwpAQCAtNDYwLDQyICs0NTgsMzYgQEAKICAgICAgICAgY2FzZSBSR0JDb2xvcnNwYWNlOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIHJlZDogJWx1LWJpdFxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX3N0YXRpc3RpY3NbUmVkQ2hhbm5lbF0uZGVwdGgpOwotICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgICBncmVlbjogJWx1LWJpdFxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX3N0YXRpc3RpY3NbR3JlZW5DaGFubmVsXS5kZXB0aCk7Ci0gICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIGJsdWU6ICVsdS1iaXRcbiIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgY2hhbm5lbF9zdGF0aXN0aWNzW0JsdWVDaGFubmVsXS5kZXB0aCk7Ci0gICAgICAgICAgaWYgKGltYWdlLT5tYXR0ZSAhPSBNYWdpY2tGYWxzZSkKLSAgICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgICBhbHBoYTogJWx1LWJpdFxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoYW5uZWxfc3RhdGlzdGljc1tPcGFjaXR5Q2hhbm5lbF0uZGVwdGgpOworICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgICByZWQ6ICUuMjBnLWJpdFxuIiwoZG91YmxlKQorICAgICAgICAgICAgY2hhbm5lbF9zdGF0aXN0aWNzW1JlZENoYW5uZWxdLmRlcHRoKTsKKyAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgZ3JlZW46ICUuMjBnLWJpdFxuIiwoZG91YmxlKQorICAgICAgICAgICAgY2hhbm5lbF9zdGF0aXN0aWNzW0dyZWVuQ2hhbm5lbF0uZGVwdGgpOworICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgICBibHVlOiAlLjIwZy1iaXRcbiIsKGRvdWJsZSkKKyAgICAgICAgICAgIGNoYW5uZWxfc3RhdGlzdGljc1tCbHVlQ2hhbm5lbF0uZGVwdGgpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQ01ZS0NvbG9yc3BhY2U6CiAgICAgICAgIHsKLSAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgY3lhbjogJWx1LWJpdFxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX3N0YXRpc3RpY3NbQ3lhbkNoYW5uZWxdLmRlcHRoKTsKLSAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgbWFnZW50YTogJWx1LWJpdFxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX3N0YXRpc3RpY3NbTWFnZW50YUNoYW5uZWxdLmRlcHRoKTsKLSAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgeWVsbG93OiAlbHUtYml0XG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoYW5uZWxfc3RhdGlzdGljc1tZZWxsb3dDaGFubmVsXS5kZXB0aCk7Ci0gICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIGJsYWNrOiAlbHUtYml0XG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoYW5uZWxfc3RhdGlzdGljc1tCbGFja0NoYW5uZWxdLmRlcHRoKTsKLSAgICAgICAgICBpZiAoaW1hZ2UtPm1hdHRlICE9IE1hZ2lja0ZhbHNlKQotICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIGFscGhhOiAlbHUtYml0XG4iLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgY2hhbm5lbF9zdGF0aXN0aWNzW09wYWNpdHlDaGFubmVsXS5kZXB0aCk7CisgICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIGN5YW46ICUuMjBnLWJpdFxuIiwoZG91YmxlKQorICAgICAgICAgICAgY2hhbm5lbF9zdGF0aXN0aWNzW0N5YW5DaGFubmVsXS5kZXB0aCk7CisgICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIG1hZ2VudGE6ICUuMjBnLWJpdFxuIiwoZG91YmxlKQorICAgICAgICAgICAgY2hhbm5lbF9zdGF0aXN0aWNzW01hZ2VudGFDaGFubmVsXS5kZXB0aCk7CisgICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIHllbGxvdzogJS4yMGctYml0XG4iLChkb3VibGUpCisgICAgICAgICAgICBjaGFubmVsX3N0YXRpc3RpY3NbWWVsbG93Q2hhbm5lbF0uZGVwdGgpOworICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgICBibGFjazogJS4yMGctYml0XG4iLChkb3VibGUpCisgICAgICAgICAgICBjaGFubmVsX3N0YXRpc3RpY3NbQmxhY2tDaGFubmVsXS5kZXB0aCk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBHUkFZQ29sb3JzcGFjZToKICAgICAgICAgewotICAgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgICBncmF5OiAlbHUtYml0XG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoYW5uZWxfc3RhdGlzdGljc1tHcmF5Q2hhbm5lbF0uZGVwdGgpOwotICAgICAgICAgIGlmIChpbWFnZS0+bWF0dGUgIT0gTWFnaWNrRmFsc2UpCi0gICAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgYWxwaGE6ICVsdS1iaXRcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX3N0YXRpc3RpY3NbT3BhY2l0eUNoYW5uZWxdLmRlcHRoKTsKKyAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgZ3JheTogJS4yMGctYml0XG4iLChkb3VibGUpCisgICAgICAgICAgICBjaGFubmVsX3N0YXRpc3RpY3NbR3JheUNoYW5uZWxdLmRlcHRoKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQorICAgICAgaWYgKGltYWdlLT5tYXR0ZSAhPSBNYWdpY2tGYWxzZSkKKyAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIGFscGhhOiAlLjIwZy1iaXRcbiIsKGRvdWJsZSkKKyAgICAgICAgICBjaGFubmVsX3N0YXRpc3RpY3NbT3BhY2l0eUNoYW5uZWxdLmRlcHRoKTsKICAgICAgIHNjYWxlPTE7CiAgICAgICBpZiAoaW1hZ2UtPmRlcHRoIDw9IE1BR0lDS0NPUkVfUVVBTlRVTV9ERVBUSCkKICAgICAgICAgc2NhbGU9UXVhbnR1bVJhbmdlLygoc2l6ZV90KSBRdWFudHVtUmFuZ2UgPj4gKChzaXplX3QpCkBAIC02MzUsNyArNjI3LDcgQEAKICAgICAgIGFydGlmYWN0PUdldEltYWdlQXJ0aWZhY3QoaW1hZ2UsImlkZW50aWZ5OnVuaXF1ZS1jb2xvcnMiKTsKICAgICAgIGlmICgoYXJ0aWZhY3QgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkgJiYKICAgICAgICAgICAoSXNNYWdpY2tUcnVlKGFydGlmYWN0KSAhPSBNYWdpY2tGYWxzZSkpCi0gICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgQ29sb3JzOiAlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgQ29sb3JzOiAlLjIwZ1xuIiwoZG91YmxlKQogICAgICAgICAgIEdldE51bWJlckNvbG9ycyhpbWFnZSwoRklMRSAqKSBOVUxMLCZpbWFnZS0+ZXhjZXB0aW9uKSk7CiAgICAgICBpZiAoSXNIaXN0b2dyYW1JbWFnZShpbWFnZSwmaW1hZ2UtPmV4Y2VwdGlvbikgIT0gTWFnaWNrRmFsc2UpCiAgICAgICAgIHsKQEAgLTY0NSw3ICs2MzcsNyBAQAogICAgIH0KICAgaWYgKGltYWdlLT5zdG9yYWdlX2NsYXNzID09IFBzZXVkb0NsYXNzKQogICAgIHsKLSAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgQ29sb3JtYXA6ICVsdVxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmNvbG9ycyk7CisgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIENvbG9ybWFwOiAlLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+Y29sb3JzKTsKICAgICAgIGlmIChpbWFnZS0+Y29sb3JzIDw9IDEwMjQpCiAgICAgICAgIHsKICAgICAgICAgICBjaGFyCkBAIC03MjQsOSArNzE2LDkgQEAKICAgICAgICAgaW1hZ2UtPmNocm9tYXRpY2l0eS53aGl0ZV9wb2ludC54LGltYWdlLT5jaHJvbWF0aWNpdHkud2hpdGVfcG9pbnQueSk7CiAgICAgfQogICBpZiAoKGltYWdlLT5leHRyYWN0X2luZm8ud2lkdGgqaW1hZ2UtPmV4dHJhY3RfaW5mby5oZWlnaHQpICE9IDApCi0gICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBUaWxlIGdlb21ldHJ5OiAlbHV4JWx1JStsZCUrbGRcbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICBpbWFnZS0+ZXh0cmFjdF9pbmZvLndpZHRoLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZXh0cmFjdF9pbmZvLmhlaWdodCwKLSAgICAgIChsb25nKSBpbWFnZS0+ZXh0cmFjdF9pbmZvLngsKGxvbmcpIGltYWdlLT5leHRyYWN0X2luZm8ueSk7CisgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBUaWxlIGdlb21ldHJ5OiAlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGdcbiIsKGRvdWJsZSkKKyAgICAgIGltYWdlLT5leHRyYWN0X2luZm8ud2lkdGgsKGRvdWJsZSkgaW1hZ2UtPmV4dHJhY3RfaW5mby5oZWlnaHQsKGRvdWJsZSkKKyAgICAgIGltYWdlLT5leHRyYWN0X2luZm8ueCwoZG91YmxlKSBpbWFnZS0+ZXh0cmFjdF9pbmZvLnkpOwogICAodm9pZCkgZnByaW50ZihmaWxlLCIgIEludGVybGFjZTogJXNcbiIsTWFnaWNrT3B0aW9uVG9NbmVtb25pYygKICAgICBNYWdpY2tJbnRlcmxhY2VPcHRpb25zLChzc2l6ZV90KSBpbWFnZS0+aW50ZXJsYWNlKSk7CiAgICh2b2lkKSBRdWVyeUNvbG9ybmFtZShpbWFnZSwmaW1hZ2UtPmJhY2tncm91bmRfY29sb3IsU1ZHQ29tcGxpYW5jZSxjb2xvciwKQEAgLTc0NSwzMCArNzM3LDI5IEBACiAgICAgTWFnaWNrQ29tcG9zZU9wdGlvbnMsKHNzaXplX3QpIGltYWdlLT5jb21wb3NlKSk7CiAgIGlmICgoaW1hZ2UtPnBhZ2Uud2lkdGggIT0gMCkgfHwgKGltYWdlLT5wYWdlLmhlaWdodCAhPSAwKSB8fAogICAgICAgKGltYWdlLT5wYWdlLnggIT0gMCkgfHwgKGltYWdlLT5wYWdlLnkgIT0gMCkpCi0gICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBQYWdlIGdlb21ldHJ5OiAlbHV4JWx1JStsZCUrbGRcbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICBpbWFnZS0+cGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgaW1hZ2UtPnBhZ2UuaGVpZ2h0LChsb25nKQotICAgICAgaW1hZ2UtPnBhZ2UueCwobG9uZykgaW1hZ2UtPnBhZ2UueSk7CisgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBQYWdlIGdlb21ldHJ5OiAlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGdcbiIsKGRvdWJsZSkKKyAgICAgIGltYWdlLT5wYWdlLndpZHRoLChkb3VibGUpIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKQorICAgICAgaW1hZ2UtPnBhZ2UueCwoZG91YmxlKSBpbWFnZS0+cGFnZS55KTsKICAgaWYgKChpbWFnZS0+cGFnZS54ICE9IDApIHx8IChpbWFnZS0+cGFnZS55ICE9IDApKQotICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgT3JpZ2luIGdlb21ldHJ5OiAlK2xkJStsZFxuIiwobG9uZykgaW1hZ2UtPnBhZ2UueCwKLSAgICAgIChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIE9yaWdpbiBnZW9tZXRyeTogJSsuMjBneCUrLjIwZ1xuIiwoZG91YmxlKQorICAgICAgaW1hZ2UtPnBhZ2UueCwoZG91YmxlKSBpbWFnZS0+cGFnZS55KTsKICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBEaXNwb3NlOiAlc1xuIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKAogICAgIE1hZ2lja0Rpc3Bvc2VPcHRpb25zLChzc2l6ZV90KSBpbWFnZS0+ZGlzcG9zZSkpOwogICBpZiAoaW1hZ2UtPmRlbGF5ICE9IDApCi0gICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBEZWxheTogJWx1eCVsZFxuIiwodW5zaWduZWQgbG9uZykgaW1hZ2UtPmRlbGF5LAotICAgICAgKGxvbmcpIGltYWdlLT50aWNrc19wZXJfc2Vjb25kKTsKKyAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIERlbGF5OiAlLjIwZ3glLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+ZGVsYXksCisgICAgICAoZG91YmxlKSBpbWFnZS0+dGlja3NfcGVyX3NlY29uZCk7CiAgIGlmIChpbWFnZS0+aXRlcmF0aW9ucyAhPSAxKQotICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgSXRlcmF0aW9uczogJWx1XG4iLCh1bnNpZ25lZCBsb25nKQotICAgICAgaW1hZ2UtPml0ZXJhdGlvbnMpOworICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgSXRlcmF0aW9uczogJS4yMGdcbiIsKGRvdWJsZSkgaW1hZ2UtPml0ZXJhdGlvbnMpOwogICBpZiAoKGltYWdlLT5uZXh0ICE9IChJbWFnZSAqKSBOVUxMKSB8fCAoaW1hZ2UtPnByZXZpb3VzICE9IChJbWFnZSAqKSBOVUxMKSkKLSAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIFNjZW5lOiAlbHUgb2YgJWx1XG4iLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+c2NlbmUsCi0gICAgICAodW5zaWduZWQgbG9uZykgR2V0SW1hZ2VMaXN0TGVuZ3RoKGltYWdlKSk7CisgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBTY2VuZTogJS4yMGcgb2YgJS4yMGdcbiIsKGRvdWJsZSkgaW1hZ2UtPnNjZW5lLAorICAgICAgKGRvdWJsZSkgR2V0SW1hZ2VMaXN0TGVuZ3RoKGltYWdlKSk7CiAgIGVsc2UKICAgICBpZiAoaW1hZ2UtPnNjZW5lICE9IDApCi0gICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIFNjZW5lOiAlbHVcbiIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5zY2VuZSk7CisgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIFNjZW5lOiAlLjIwZ1xuIiwoZG91YmxlKSBpbWFnZS0+c2NlbmUpOwogICAodm9pZCkgZnByaW50ZihmaWxlLCIgIENvbXByZXNzaW9uOiAlc1xuIixNYWdpY2tPcHRpb25Ub01uZW1vbmljKAogICAgIE1hZ2lja0NvbXByZXNzT3B0aW9ucywoc3NpemVfdCkgaW1hZ2UtPmNvbXByZXNzaW9uKSk7CiAgIGlmIChpbWFnZS0+cXVhbGl0eSAhPSBVbmRlZmluZWRDb21wcmVzc2lvblF1YWxpdHkpCi0gICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBRdWFsaXR5OiAlbHVcbiIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5xdWFsaXR5KTsKKyAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIFF1YWxpdHk6ICUuMjBnXG4iLChkb3VibGUpIGltYWdlLT5xdWFsaXR5KTsKICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBPcmllbnRhdGlvbjogJXNcbiIsTWFnaWNrT3B0aW9uVG9NbmVtb25pYygKICAgICBNYWdpY2tPcmllbnRhdGlvbk9wdGlvbnMsKHNzaXplX3QpIGltYWdlLT5vcmllbnRhdGlvbikpOwogICBpZiAoaW1hZ2UtPm1vbnRhZ2UgIT0gKGNoYXIgKikgTlVMTCkKQEAgLTgxMCw4ICs4MDEsOCBAQAogICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiXG4iKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KLSAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICVsdXglbHUgJXNcbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgdGlsZS0+bWFnaWNrX2NvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIHRpbGUtPm1hZ2lja19yb3dzLHRpbGUtPm1hZ2ljayk7CisgICAgICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAlLjIwZ3glLjIwZyAlc1xuIiwoZG91YmxlKSB0aWxlLT5tYWdpY2tfY29sdW1ucywKKyAgICAgICAgICAoZG91YmxlKSB0aWxlLT5tYWdpY2tfcm93cyx0aWxlLT5tYWdpY2spOwogICAgICAgICAodm9pZCkgU2lnbmF0dXJlSW1hZ2UodGlsZSk7CiAgICAgICAgIFJlc2V0SW1hZ2VQcm9wZXJ0eUl0ZXJhdG9yKHRpbGUpOwogICAgICAgICBwcm9wZXJ0eT1HZXROZXh0SW1hZ2VQcm9wZXJ0eSh0aWxlKTsKQEAgLTg3Nyw3ICs4NjgsNyBAQAogICAgICAgICBwcm9maWxlPUdldEltYWdlUHJvZmlsZShpbWFnZSxuYW1lKTsKICAgICAgICAgaWYgKHByb2ZpbGUgPT0gKFN0cmluZ0luZm8gKikgTlVMTCkKICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIFByb2ZpbGUtJXM6ICVsdSBieXRlc1xuIixuYW1lLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgUHJvZmlsZS0lczogJS4yMGcgYnl0ZXNcbiIsbmFtZSwoZG91YmxlKQogICAgICAgICAgIEdldFN0cmluZ0luZm9MZW5ndGgocHJvZmlsZSkpOwogI2lmIGRlZmluZWQoTUFHSUNLQ09SRV9MQ01TX0RFTEVHQVRFKQogICAgICAgICBpZiAoKExvY2FsZUNvbXBhcmUobmFtZSwiaWNjIikgPT0gMCkgfHwKQEAgLTEwMDQsNyArOTk1LDggQEAKICAgICAgICAgICAgICAgICBjYXNlIDIxOTogdGFnPSJDdXN0b20gRmllbGQgMjAiOyBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OiB0YWc9InVua25vd24iOyBicmVhazsKICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgICAlc1slbGQsJWxkXTogIix0YWcsZGF0YXNldCxyZWNvcmQpOworICAgICAgICAgICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgICAgICAlc1slLjIwZywlLjIwZ106ICIsdGFnLChkb3VibGUpCisgICAgICAgICAgICAgICAgZGF0YXNldCwoZG91YmxlKSByZWNvcmQpOwogICAgICAgICAgICAgICBsZW5ndGg9KHNpemVfdCkgKEdldFN0cmluZ0luZm9EYXR1bShwcm9maWxlKVtpKytdIDw8IDgpOwogICAgICAgICAgICAgICBsZW5ndGh8PUdldFN0cmluZ0luZm9EYXR1bShwcm9maWxlKVtpKytdOwogICAgICAgICAgICAgICBhdHRyaWJ1dGU9KGNoYXIgKikgTlVMTDsKQEAgLTEwOTEsOCArMTA4Myw4IEBACiAgICAgZWxhcHNlZF90aW1lKzAuNSksTWFnaWNrRmFsc2UsZm9ybWF0KTsKICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBQaXhlbHMgcGVyIHNlY29uZDogJXNcbiIsZm9ybWF0KTsKICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICBVc2VyIHRpbWU6ICUwLjNmdVxuIix1c2VyX3RpbWUpOwotICAodm9pZCkgZnByaW50ZihmaWxlLCIgIEVsYXBzZWQgdGltZTogJWxkOiUwMmxkLiUwM2xkXG4iLChsb25nKQotICAgIChlbGFwc2VkX3RpbWUvNjAuMCksKGxvbmcpIGNlaWwoZm1vZChlbGFwc2VkX3RpbWUsNjAuMCkpLChsb25nKQorICAodm9pZCkgZnByaW50ZihmaWxlLCIgIEVsYXBzZWQgdGltZTogJS4yMGc6JTAyZy4lMDNnXG4iLChkb3VibGUpCisgICAgKGVsYXBzZWRfdGltZS82MC4wKSxjZWlsKGZtb2QoZWxhcHNlZF90aW1lLDYwLjApKSwoZG91YmxlKQogICAgICgxMDAwLjAqKGVsYXBzZWRfdGltZS1mbG9vcihlbGFwc2VkX3RpbWUpKSkpOwogICAodm9pZCkgZnByaW50ZihmaWxlLCIgIFZlcnNpb246ICVzXG4iLEdldE1hZ2lja1ZlcnNpb24oKHNpemVfdCAqKQogICAgIE5VTEwpKTsKZGlmZiAtLWdpdCBhL21hZ2ljay9sYXllci5jIGIvbWFnaWNrL2xheWVyLmMKaW5kZXggNTlmOTYzMS4uNzlhOGQ1NCAxMDA2NDQKLS0tIGEvbWFnaWNrL2xheWVyLmMKKysrIGIvbWFnaWNrL2xheWVyLmMKQEAgLTEyNjMsOCArMTI2Myw5IEBACiAgIHdoaWxlICggbmV4dCAhPSAoY29uc3QgSW1hZ2UgKikgTlVMTCApCiAgIHsKICNpZiAwIC8qICBGb3IgZGVidWdpbmcgKi8KLSAgICBwcmludGYoImltYWdlICVsZCA6LSAlZCAgJWxkeCVsZCUrbGQlK2xkXG4iLCBpLCBkaXNwb3NhbHNbaV0sCi0gICAgICAgICAgIGJvdW5kc1tpXS53aWR0aCwgYm91bmRzW2ldLmhlaWdodCwgYm91bmRzW2ldLngsIGJvdW5kc1tpXS55ICk7CisgICAgcHJpbnRmKCJpbWFnZSAlLjIwZyA6LSAlLjIwZyAgJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnXG4iLCAoZG91YmxlKSBpLAorICAgICAgKGRvdWJsZSkgZGlzcG9zYWxzW2ldLChkb3VibGUpIGJvdW5kc1tpXS53aWR0aCwoZG91YmxlKQorICAgICAgYm91bmRzW2ldLmhlaWdodCwoZG91YmxlKSBib3VuZHNbaV0ueCwoZG91YmxlKSBib3VuZHNbaV0ueSApOwogI2VuZGlmCiAgICAgcHJldl9pbWFnZT1DbG9uZUltYWdlKG5leHQsMCwwLE1hZ2lja1RydWUsZXhjZXB0aW9uKTsKICAgICBpZiAocHJldl9pbWFnZSA9PSAoSW1hZ2UgKikgTlVMTCkKZGlmZiAtLWdpdCBhL21hZ2ljay9sb2cuYyBiL21hZ2ljay9sb2cuYwppbmRleCA5Njk5NjQ1Li5mMmZjMTAxIDEwMDY0NAotLS0gYS9tYWdpY2svbG9nLmMKKysrIGIvbWFnaWNrL2xvZy5jCkBAIC04MzEsMjAgKzgzMSwxOSBAQAogICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0ZXh0LGV4dGVudCwKICAgICAgICAgIjxlbnRyeT5cbiIKICAgICAgICAgIiAgPHRpbWVzdGFtcD4lczwvdGltZXN0YW1wPlxuIgotICAgICAgICAiICA8ZWxhcHNlZC10aW1lPiVsZDolMDJsZC4lMDNsZDwvZWxhcHNlZC10aW1lPlxuIgorICAgICAgICAiICA8ZWxhcHNlZC10aW1lPiUuMjBnOiUwMmcuJTAzZzwvZWxhcHNlZC10aW1lPlxuIgogICAgICAgICAiICA8dXNlci10aW1lPiUwLjNmPC91c2VyLXRpbWU+XG4iCi0gICAgICAgICIgIDxwcm9jZXNzLWlkPiVsZDwvcHJvY2Vzcy1pZD5cbiIKLSAgICAgICAgIiAgPHRocmVhZC1pZD4lbHU8L3RocmVhZC1pZD5cbiIKKyAgICAgICAgIiAgPHByb2Nlc3MtaWQ+JS4yMGc8L3Byb2Nlc3MtaWQ+XG4iCisgICAgICAgICIgIDx0aHJlYWQtaWQ+JS4yMGc8L3RocmVhZC1pZD5cbiIKICAgICAgICAgIiAgPG1vZHVsZT4lczwvbW9kdWxlPlxuIgogICAgICAgICAiICA8ZnVuY3Rpb24+JXM8L2Z1bmN0aW9uPlxuIgotICAgICAgICAiICA8bGluZT4lbHU8L2xpbmU+XG4iCisgICAgICAgICIgIDxsaW5lPiUuMjBnPC9saW5lPlxuIgogICAgICAgICAiICA8ZG9tYWluPiVzPC9kb21haW4+XG4iCiAgICAgICAgICIgIDxldmVudD4lczwvZXZlbnQ+XG4iCi0gICAgICAgICI8L2VudHJ5PiIsdGltZXN0YW1wLChsb25nKSAoZWxhcHNlZF90aW1lLzYwLjApLChsb25nKQotICAgICAgICBmbG9vcihmbW9kKGVsYXBzZWRfdGltZSw2MC4wKSksKGxvbmcpICgxMDAwLjAqKGVsYXBzZWRfdGltZS0KLSAgICAgICAgZmxvb3IoZWxhcHNlZF90aW1lKSkrMC41KSx1c2VyX3RpbWUsKGxvbmcpIGdldHBpZCgpLAotICAgICAgICAodW5zaWduZWQgbG9uZykgR2V0TWFnaWNrVGhyZWFkU2lnbmF0dXJlKCksbW9kdWxlLGZ1bmN0aW9uLAotICAgICAgICAodW5zaWduZWQgbG9uZykgbGluZSwgZG9tYWluLGV2ZW50KTsKKyAgICAgICAgIjwvZW50cnk+Iix0aW1lc3RhbXAsKGRvdWJsZSkgKGVsYXBzZWRfdGltZS82MC4wKSwKKyAgICAgICAgZmxvb3IoZm1vZChlbGFwc2VkX3RpbWUsNjAuMCkpLChkb3VibGUpICgxMDAwLjAqKGVsYXBzZWRfdGltZS0KKyAgICAgICAgZmxvb3IoZWxhcHNlZF90aW1lKSkrMC41KSx1c2VyX3RpbWUsKGRvdWJsZSkgZ2V0cGlkKCksKGRvdWJsZSkKKyAgICAgICAgR2V0TWFnaWNrVGhyZWFkU2lnbmF0dXJlKCksbW9kdWxlLGZ1bmN0aW9uLChkb3VibGUpIGxpbmUsZG9tYWluLGV2ZW50KTsKICAgICAgIHJldHVybih0ZXh0KTsKICAgICB9CiAgIC8qCkBAIC05MzEsMTMgKzkzMCwxMyBAQAogICAgICAgICAgICAgcSsrOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgKGxvZ19pbmZvLT5nZW5lcmF0aW9uICUgbG9nX2luZm8tPmdlbmVyYXRpb25zKSk7CisgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGciLChkb3VibGUpIChsb2dfaW5mby0+Z2VuZXJhdGlvbiAlCisgICAgICAgICAgbG9nX2luZm8tPmdlbmVyYXRpb25zKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSAnbCc6CiAgICAgICB7Ci0gICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJWx1IiwodW5zaWduZWQgbG9uZykgbGluZSk7CisgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGciLChkb3VibGUpIGxpbmUpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ20nOgpAQCAtOTYxLDE0ICs5NjAsMTQgQEAKICAgICAgIH0KICAgICAgIGNhc2UgJ3AnOgogICAgICAgewotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsZCIsKGxvbmcpIGdldHBpZCgpKTsKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkgZ2V0cGlkKCkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ3InOgogICAgICAgewotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsZDolMDJsZC4lMDNsZCIsKGxvbmcpCi0gICAgICAgICAgKGVsYXBzZWRfdGltZS82MC4wKSwobG9uZykgZmxvb3IoZm1vZChlbGFwc2VkX3RpbWUsNjAuMCkpLAotICAgICAgICAgIChsb25nKSAoMTAwMC4wKihlbGFwc2VkX3RpbWUtZmxvb3IoZWxhcHNlZF90aW1lKSkrMC41KSk7CisgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGc6JTAyZy4lMDNnIiwoZG91YmxlKQorICAgICAgICAgIChlbGFwc2VkX3RpbWUvNjAuMCksZmxvb3IoZm1vZChlbGFwc2VkX3RpbWUsNjAuMCkpLChkb3VibGUpCisgICAgICAgICAgKDEwMDAuMCooZWxhcHNlZF90aW1lLWZsb29yKGVsYXBzZWRfdGltZSkpKzAuNSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ3QnOgpAQCAtMTA2OCw4ICsxMDY3LDggQEAKICAgICAgICAgICAgIHErKzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KLSAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgIChsb2dfaW5mby0+Z2VuZXJhdGlvbiAlIGxvZ19pbmZvLT5nZW5lcmF0aW9ucykpOworICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiUuMjBnIiwoZG91YmxlKSAobG9nX2luZm8tPmdlbmVyYXRpb24gJQorICAgICAgICAgIGxvZ19pbmZvLT5nZW5lcmF0aW9ucykpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ24nOgpAQCAtMTA3OSw3ICsxMDc4LDcgQEAKICAgICAgIH0KICAgICAgIGNhc2UgJ3AnOgogICAgICAgewotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsZCIsKGxvbmcpIGdldHBpZCgpKTsKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkgZ2V0cGlkKCkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ3YnOgpkaWZmIC0tZ2l0IGEvbWFnaWNrL2xvZy5oIGIvbWFnaWNrL2xvZy5oCmluZGV4IGE0N2M1NWYuLjUyY2I4YmMgMTAwNjQ0Ci0tLSBhL21hZ2ljay9sb2cuaAorKysgYi9tYWdpY2svbG9nLmgKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJtYWdpY2svZXhjZXB0aW9uLmgiCiAKICNpZiAhZGVmaW5lZChHZXRNYWdpY2tNb2R1bGUpCi0jIGRlZmluZSBHZXRNYWdpY2tNb2R1bGUoKSAgX19GSUxFX18sX19mdW5jX18sKHVuc2lnbmVkIGxvbmcpIF9fTElORV9fCisjIGRlZmluZSBHZXRNYWdpY2tNb2R1bGUoKSAgX19GSUxFX18sX19mdW5jX18sKHNpemVfdCkgX19MSU5FX18KICNlbmRpZgogCiAjZGVmaW5lIE1hZ2lja0xvZ0ZpbGVuYW1lICAibG9nLnhtbCIKZGlmZiAtLWdpdCBhL21hZ2ljay9tb250YWdlLmMgYi9tYWdpY2svbW9udGFnZS5jCmluZGV4IDkzYzVkNTUuLmRlNWQxMWMgMTAwNjQ0Ci0tLSBhL21hZ2ljay9tb250YWdlLmMKKysrIGIvbWFnaWNrL21vbnRhZ2UuYwpAQCAtNjYwLDEyICs2NjAsMTIgQEAKICAgICAgIEdldE1vbnRhZ2VHZW9tZXRyeShtb250YWdlX2luZm8tPnRpbGUsbnVtYmVyX2ltYWdlcywmeF9vZmZzZXQsJnlfb2Zmc2V0LAogICAgICAgICAmc2Fucywmc2Fucyk7CiAgICAgeV9vZmZzZXQrPShzc2l6ZV90KSB0aXRsZV9vZmZzZXQ7Ci0gICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtb250YWdlLT5tb250YWdlLE1heFRleHRFeHRlbnQsIiVsZHglbGQlK2xkJStsZCIsCi0gICAgICAobG9uZykgKGV4dHJhY3RfaW5mby53aWR0aCsoZXh0cmFjdF9pbmZvLngrYm9yZGVyX3dpZHRoKSoyKSwKLSAgICAgIChsb25nKSAoZXh0cmFjdF9pbmZvLmhlaWdodCsoZXh0cmFjdF9pbmZvLnkrYm9yZGVyX3dpZHRoKSoyKwotICAgICAgKGxvbmcpICgobWV0cmljcy5hc2NlbnQtbWV0cmljcy5kZXNjZW50KzQpKm51bWJlcl9saW5lcysKLSAgICAgIChtb250YWdlX2luZm8tPnNoYWRvdyAhPSBNYWdpY2tGYWxzZSA/IDQgOiAwKSkpLChsb25nKSB4X29mZnNldCwKLSAgICAgIChsb25nKSB5X29mZnNldCk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhtb250YWdlLT5tb250YWdlLE1heFRleHRFeHRlbnQsCisgICAgICAiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwoZG91YmxlKSAoZXh0cmFjdF9pbmZvLndpZHRoKworICAgICAgKGV4dHJhY3RfaW5mby54K2JvcmRlcl93aWR0aCkqMiksKGRvdWJsZSkgKGV4dHJhY3RfaW5mby5oZWlnaHQrCisgICAgICAoZXh0cmFjdF9pbmZvLnkrYm9yZGVyX3dpZHRoKSoyKyhkb3VibGUpICgobWV0cmljcy5hc2NlbnQtCisgICAgICBtZXRyaWNzLmRlc2NlbnQrNCkqbnVtYmVyX2xpbmVzKyhtb250YWdlX2luZm8tPnNoYWRvdyAhPSBNYWdpY2tGYWxzZSA/IDQgOgorICAgICAgMCkpKSwoZG91YmxlKSB4X29mZnNldCwoZG91YmxlKSB5X29mZnNldCk7CiAgICAgKm1vbnRhZ2UtPmRpcmVjdG9yeT0nXDAnOwogICAgIHRpbGU9MDsKICAgICB3aGlsZSAodGlsZSA8IE1hZ2lja01pbigoc3NpemVfdCkgdGlsZXNfcGVyX3BhZ2UsKHNzaXplX3QpIG51bWJlcl9pbWFnZXMpKQpAQCAtNjk3LDkgKzY5Nyw5IEBACiAgICAgICAgIGNsb25lX2luZm8tPmdyYXZpdHk9Q2VudGVyR3Jhdml0eTsKICAgICAgICAgY2xvbmVfaW5mby0+cG9pbnRzaXplKj0yLjA7CiAgICAgICAgICh2b2lkKSBHZXRUeXBlTWV0cmljcyhpbWFnZV9saXN0WzBdLGNsb25lX2luZm8sJm1ldHJpY3MpOwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkJStsZCIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG1vbnRhZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIChtZXRyaWNzLmFzY2VudC0KLSAgICAgICAgICBtZXRyaWNzLmRlc2NlbnQpLDBMLChsb25nKSBleHRyYWN0X2luZm8ueSs0KTsKKyAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LAorICAgICAgICAgICIlLjIwZ3glLjIwZyUrLjIwZ3glKy4yMGciLChkb3VibGUpIG1vbnRhZ2UtPmNvbHVtbnMsKGRvdWJsZSkKKyAgICAgICAgICAobWV0cmljcy5hc2NlbnQtbWV0cmljcy5kZXNjZW50KSwwLjAsKGRvdWJsZSkgZXh0cmFjdF9pbmZvLnkrNCk7CiAgICAgICAgICh2b2lkKSBDbG9uZVN0cmluZygmY2xvbmVfaW5mby0+Z2VvbWV0cnksZ2VvbWV0cnkpOwogICAgICAgICAodm9pZCkgQ2xvbmVTdHJpbmcoJmNsb25lX2luZm8tPnRleHQsdGl0bGUpOwogICAgICAgICAodm9pZCkgQW5ub3RhdGVJbWFnZShtb250YWdlLGNsb25lX2luZm8pOwpAQCAtNzY2LDggKzc2Niw4IEBACiAgICAgICB0aWxlX2ltYWdlLT5ncmF2aXR5PW1vbnRhZ2VfaW5mby0+Z3Jhdml0eTsKICAgICAgIGlmIChpbWFnZS0+Z3Jhdml0eSAhPSBVbmRlZmluZWRHcmF2aXR5KQogICAgICAgICB0aWxlX2ltYWdlLT5ncmF2aXR5PWltYWdlLT5ncmF2aXR5OwotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh0aWxlX2dlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUrMCswIiwKLSAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHRpbGVfZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGcrMCswIiwKKyAgICAgICAgKGRvdWJsZSkgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICAgZmxhZ3M9UGFyc2VHcmF2aXR5R2VvbWV0cnkodGlsZV9pbWFnZSx0aWxlX2dlb21ldHJ5LCZnZW9tZXRyeSxleGNlcHRpb24pOwogICAgICAgeD0oc3NpemVfdCkgKGdlb21ldHJ5LngrYm9yZGVyX3dpZHRoKTsKICAgICAgIHk9KHNzaXplX3QpIChnZW9tZXRyeS55K2JvcmRlcl93aWR0aCk7CkBAIC04MzQsMTMgKzgzNCwxMyBAQAogICAgICAgICAgICAgICAgIEFubm90YXRlIGNvbXBvc2l0ZSB0aWxlIHdpdGggbGFiZWwuCiAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwKLSAgICAgICAgICAgICAgICAiJWx1eCVsdSUrbGQlK2xkIiwodW5zaWduZWQgbG9uZykgKChtb250YWdlX2luZm8tPmZyYW1lID8KLSAgICAgICAgICAgICAgICBpbWFnZS0+Y29sdW1ucyA6IHdpZHRoKS0yKmJvcmRlcl93aWR0aCksKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgICAgIiUuMjBneCUuMjBnJSsuMjBneCUrLjIwZyIsKGRvdWJsZSkgKChtb250YWdlX2luZm8tPmZyYW1lID8KKyAgICAgICAgICAgICAgICBpbWFnZS0+Y29sdW1ucyA6IHdpZHRoKS0yKmJvcmRlcl93aWR0aCksKGRvdWJsZSkKICAgICAgICAgICAgICAgICAobWV0cmljcy5hc2NlbnQtbWV0cmljcy5kZXNjZW50KzQpKk11bHRpbGluZUNlbnN1cyh2YWx1ZSksCi0gICAgICAgICAgICAgICAgKGxvbmcpICh4X29mZnNldCtib3JkZXJfd2lkdGgpLChsb25nKSAoKG1vbnRhZ2VfaW5mby0+ZnJhbWUgPwotICAgICAgICAgICAgICAgIHlfb2Zmc2V0K2hlaWdodCtib3JkZXJfd2lkdGgrNCA6IHlfb2Zmc2V0K2V4dHJhY3RfaW5mby5oZWlnaHQrCi0gICAgICAgICAgICAgICAgYm9yZGVyX3dpZHRoKyhtb250YWdlX2luZm8tPnNoYWRvdyAhPSBNYWdpY2tGYWxzZSA/IDQgOiAwKSkrCi0gICAgICAgICAgICAgICAgYmV2ZWxfd2lkdGgpKTsKKyAgICAgICAgICAgICAgICAoZG91YmxlKSAoeF9vZmZzZXQrYm9yZGVyX3dpZHRoKSwoZG91YmxlKQorICAgICAgICAgICAgICAgICgobW9udGFnZV9pbmZvLT5mcmFtZSA/IHlfb2Zmc2V0K2hlaWdodCtib3JkZXJfd2lkdGgrNCA6CisgICAgICAgICAgICAgICAgeV9vZmZzZXQrZXh0cmFjdF9pbmZvLmhlaWdodCtib3JkZXJfd2lkdGgrCisgICAgICAgICAgICAgICAgKG1vbnRhZ2VfaW5mby0+c2hhZG93ICE9IE1hZ2lja0ZhbHNlID8gNCA6IDApKStiZXZlbF93aWR0aCkpOwogICAgICAgICAgICAgICAodm9pZCkgQ2xvbmVTdHJpbmcoJmRyYXdfaW5mby0+Z2VvbWV0cnksZ2VvbWV0cnkpOwogICAgICAgICAgICAgICAodm9pZCkgQ2xvbmVTdHJpbmcoJmRyYXdfaW5mby0+dGV4dCx2YWx1ZSk7CiAgICAgICAgICAgICAgICh2b2lkKSBBbm5vdGF0ZUltYWdlKG1vbnRhZ2UsZHJhd19pbmZvKTsKZGlmZiAtLWdpdCBhL21hZ2ljay9tb3JwaG9sb2d5LmMgYi9tYWdpY2svbW9ycGhvbG9neS5jCmluZGV4IDVkNTQ0NTAuLjA0ZGJjMWMgMTAwNjQ0Ci0tLSBhL21hZ2ljay9tb3JwaG9sb2d5LmMKKysrIGIvbWFnaWNrL21vcnBob2xvZ3kuYwpAQCAtNDk5LDcgKzQ5OSw3IEBACiAKICAgICAgIC8qIEVycm9yIGhhbmRsaW5nIC0tIHRoaXMgaXMgbm90IHByb3BlciBlcnJvciBoYW5kbGluZyEgKi8KICAgICAgIGlmICggbmV3X2tlcm5lbCA9PSAoS2VybmVsSW5mbyAqKSBOVUxMICkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSBrZXJuZWwgbnVtYmVyICMlbHVcbiIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIGtlcm5lbCBudW1iZXIgIyUuMjBnXG4iLChkb3VibGUpCiAgICAgICAgICAga2VybmVsX251bWJlcik7CiAgICAgICAgIGlmICgga2VybmVsICE9IChLZXJuZWxJbmZvICopIE5VTEwgKQogICAgICAgICAgIGtlcm5lbD1EZXN0cm95S2VybmVsSW5mbyhrZXJuZWwpOwpAQCAtMjkwOCwxMyArMjkwOCwxMyBAQAogICAgICAgICAvKiBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIGNvbXBvdW5kIG9wZXJhdGlvbnMgKi8KICAgICAgICAgaWYgKCB2ZXJib3NlID09IE1hZ2lja1RydWUgKSB7CiAgICAgICAgICAgaWYgKCBzdGFnZV9saW1pdCA+IDEgKQotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2X2luZm8sIE1heFRleHRFeHRlbnQsICIlczolbHUuJWx1IC0+ICIsCi0gICAgICAgICAgICAgTWFnaWNrT3B0aW9uVG9NbmVtb25pYyhNYWdpY2tNb3JwaG9sb2d5T3B0aW9ucywgbWV0aG9kKSwKLSAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbWV0aG9kX2xvb3AsKHVuc2lnbmVkIGxvbmcpIHN0YWdlX2xvb3ApOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2X2luZm8sTWF4VGV4dEV4dGVudCwiJXM6JS4yMGcuJS4yMGcgLT4gIiwKKyAgICAgICAgICAgICBNYWdpY2tPcHRpb25Ub01uZW1vbmljKE1hZ2lja01vcnBob2xvZ3lPcHRpb25zLG1ldGhvZCksKGRvdWJsZSkKKyAgICAgICAgICAgICBtZXRob2RfbG9vcCwoZG91YmxlKSBzdGFnZV9sb29wKTsKICAgICAgICAgICBlbHNlIGlmICggcHJpbWF0aXZlICE9IG1ldGhvZCApCi0gICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZfaW5mbywgTWF4VGV4dEV4dGVudCwgIiVzOiVsdSAtPiAiLAotICAgICAgICAgICAgICAgTWFnaWNrT3B0aW9uVG9NbmVtb25pYyhNYWdpY2tNb3JwaG9sb2d5T3B0aW9ucywgbWV0aG9kKSwKLSAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBtZXRob2RfbG9vcCk7CisgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZfaW5mbywgTWF4VGV4dEV4dGVudCwgIiVzOiUuMjBnIC0+ICIsCisgICAgICAgICAgICAgIE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrTW9ycGhvbG9neU9wdGlvbnMsIG1ldGhvZCksKGRvdWJsZSkKKyAgICAgICAgICAgICAgbWV0aG9kX2xvb3ApOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHZfaW5mb1swXSA9ICdcMCc7CiAgICAgICAgIH0KQEAgLTI5NDksMTEgKzI5NDksMTEgQEAKICAgICAgICAgICBpZiAoIHZlcmJvc2UgPT0gTWFnaWNrVHJ1ZSApIHsKICAgICAgICAgICAgIGlmICgga2VybmVsX2xvb3AgPiAxICkKICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOyAvKiBhZGQgZW5kLW9mLWxpbmUgZnJvbSBwcmV2aW91cyAqLwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyVzJXM6JWx1LiVsdSAjJWx1ID0+IENoYW5nZWQgJWx1Iiwgdl9pbmZvLAotICAgICAgICAgICAgICAgIE1hZ2lja09wdGlvblRvTW5lbW9uaWMoTWFnaWNrTW9ycGhvbG9neU9wdGlvbnMsIHByaW1hdGl2ZSksCi0gICAgICAgICAgICAgICAgICggdGhpc19rZXJuZWwgPT0gcmZsdF9rZXJuZWwgKSA/ICIqIiA6ICIiLAotICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG1ldGhvZF9sb29wK2tlcm5lbF9sb29wLTEsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgICAgICBrZXJuZWxfbnVtYmVyLCh1bnNpZ25lZCBsb25nKSBjb3VudCwodW5zaWduZWQgbG9uZykgY2hhbmdlZCk7CisgICAgICAgICAgICAodm9pZCkgZnByaW50ZihzdGRlcnIsICIlcyVzJXM6JS4yMGcuJS4yMGcgIyUuMjBnID0+IENoYW5nZWQgJS4yMGciLAorICAgICAgICAgICAgICB2X2luZm8sTWFnaWNrT3B0aW9uVG9NbmVtb25pYyhNYWdpY2tNb3JwaG9sb2d5T3B0aW9ucywKKyAgICAgICAgICAgICAgcHJpbWF0aXZlKSwodGhpc19rZXJuZWwgPT0gcmZsdF9rZXJuZWwgKSA/ICIqIiA6ICIiLAorICAgICAgICAgICAgICAoZG91YmxlKSAobWV0aG9kX2xvb3Ara2VybmVsX2xvb3AtMSksKGRvdWJsZSkga2VybmVsX251bWJlciwKKyAgICAgICAgICAgICAgKGRvdWJsZSkgY291bnQsKGRvdWJsZSkgY2hhbmdlZCk7CiAgICAgICAgICAgfQogICAgICAgICAgIC8qIHByZXBhcmUgbmV4dCBsb29wICovCiAgICAgICAgICAgeyBJbWFnZSAqdG1wID0gd29ya19pbWFnZTsgICAvKiBzd2FwIGltYWdlcyBmb3IgaXRlcmF0aW9uICovCkBAIC0yOTY2LDcgKzI5NjYsNyBAQAogICAgICAgICB9IC8qIEVuZCBMb29wIDQ6IEl0ZXJhdGUgdGhlIGtlcm5lbCB3aXRoIHByaW1hdGl2ZSAqLwogCiAgICAgICAgIGlmICggdmVyYm9zZSA9PSBNYWdpY2tUcnVlICYmIGtlcm5lbF9jaGFuZ2VkICE9IGNoYW5nZWQgKQotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgVG90YWwgJWx1IiwodW5zaWduZWQgbG9uZykga2VybmVsX2NoYW5nZWQpOworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgVG90YWwgJS4yMGciLChkb3VibGUpIGtlcm5lbF9jaGFuZ2VkKTsKICAgICAgICAgaWYgKCB2ZXJib3NlID09IE1hZ2lja1RydWUgJiYgc3RhZ2VfbG9vcCA8IHN0YWdlX2xpbWl0ICkKICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7IC8qIGFkZCBlbmQtb2YtbGluZSBiZWZvcmUgbG9vcGluZyAqLwogCmRpZmYgLS1naXQgYS9tYWdpY2svcHJvcGVydHkuYyBiL21hZ2ljay9wcm9wZXJ0eS5jCmluZGV4IDRlZGI3YzkuLjY0NmVkNTggMTAwNjQ0Ci0tLSBhL21hZ2ljay9wcm9wZXJ0eS5jCisrKyBiL21hZ2ljay9wcm9wZXJ0eS5jCkBAIC0xMzEyLDEzICsxMzEyLDEzIEBACiAgICAgICAgICAgICBjYXNlIEVYSUZfRk1UX0JZVEU6CiAgICAgICAgICAgICBjYXNlIEVYSUZfRk1UX1VOREVGSU5FRDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRVhJRk11bHRpcGxlVmFsdWVzKDEsIiVsdSIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAgIEVYSUZNdWx0aXBsZVZhbHVlcygxLCIlLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICAgICAgICAoKih1bnNpZ25lZCBjaGFyICopIHAxKSk7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBFWElGX0ZNVF9TQllURToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRVhJRk11bHRpcGxlVmFsdWVzKDEsIiVsZCIsKGxvbmcpICgqKHNpZ25lZCBjaGFyICopIHAxKSk7CisgICAgICAgICAgICAgIEVYSUZNdWx0aXBsZVZhbHVlcygxLCIlLjIwZyIsKGRvdWJsZSkgKCooc2lnbmVkIGNoYXIgKikgcDEpKTsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIEVYSUZfRk1UX1NTSE9SVDoKQEAgLTEzMzMsMjUgKzEzMzMsMjcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgRVhJRl9GTVRfVUxPTkc6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVYSUZNdWx0aXBsZVZhbHVlcyg0LCIlbHUiLChsb25nKSBSZWFkUHJvcGVydHlMb25nKGVuZGlhbixwMSkpOworICAgICAgICAgICAgICBFWElGTXVsdGlwbGVWYWx1ZXMoNCwiJS4yMGciLChkb3VibGUpCisgICAgICAgICAgICAgICAgUmVhZFByb3BlcnR5TG9uZyhlbmRpYW4scDEpKTsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIEVYSUZfRk1UX1NMT05HOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICBFWElGTXVsdGlwbGVWYWx1ZXMoNCwiJWxkIiwobG9uZykgUmVhZFByb3BlcnR5TG9uZyhlbmRpYW4scDEpKTsKKyAgICAgICAgICAgICAgRVhJRk11bHRpcGxlVmFsdWVzKDQsIiUuMjBnIiwoZG91YmxlKQorICAgICAgICAgICAgICAgIFJlYWRQcm9wZXJ0eUxvbmcoZW5kaWFuLHAxKSk7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBFWElGX0ZNVF9VUkFUSU9OQUw6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVYSUZNdWx0aXBsZUZyYWN0aW9ucyg4LCIlbGQvJWxkIiwobG9uZykKLSAgICAgICAgICAgICAgICBSZWFkUHJvcGVydHlMb25nKGVuZGlhbixwMSksKGxvbmcpCisgICAgICAgICAgICAgIEVYSUZNdWx0aXBsZUZyYWN0aW9ucyg4LCIlLjIwZy8lLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICBSZWFkUHJvcGVydHlMb25nKGVuZGlhbixwMSksKGRvdWJsZSkKICAgICAgICAgICAgICAgICBSZWFkUHJvcGVydHlMb25nKGVuZGlhbixwMSs0KSk7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBFWElGX0ZNVF9TUkFUSU9OQUw6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVYSUZNdWx0aXBsZUZyYWN0aW9ucyg4LCIlbGQvJWxkIiwobG9uZykKLSAgICAgICAgICAgICAgICBSZWFkUHJvcGVydHlMb25nKGVuZGlhbixwMSksKGxvbmcpCisgICAgICAgICAgICAgIEVYSUZNdWx0aXBsZUZyYWN0aW9ucyg4LCIlLjIwZy8lLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICBSZWFkUHJvcGVydHlMb25nKGVuZGlhbixwMSksKGRvdWJsZSkKICAgICAgICAgICAgICAgICBSZWFkUHJvcGVydHlMb25nKGVuZGlhbixwMSs0KSk7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTgwNiw4ICsxODA4LDcgQEAKICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiaXNvLTg4NTktMVwiPz5cbiIpOwogICAodm9pZCkgQ29uY2F0ZW5hdGVTdHJpbmcoJnBhdGgsbWVzc2FnZSk7CiAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobWVzc2FnZSxNYXhUZXh0RXh0ZW50LAotICAgICI8c3ZnIHdpZHRoPVwiJWx1XCIgaGVpZ2h0PVwiJWx1XCI+XG4iLCh1bnNpZ25lZCBsb25nKSBjb2x1bW5zLAotICAgICh1bnNpZ25lZCBsb25nKSByb3dzKTsKKyAgICAiPHN2ZyB3aWR0aD1cIiUuMjBnXCIgaGVpZ2h0PVwiJS4yMGdcIj5cbiIsKGRvdWJsZSkgY29sdW1ucywoZG91YmxlKSByb3dzKTsKICAgKHZvaWQpIENvbmNhdGVuYXRlU3RyaW5nKCZwYXRoLG1lc3NhZ2UpOwogICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKG1lc3NhZ2UsTWF4VGV4dEV4dGVudCwiPGc+XG4iKTsKICAgKHZvaWQpIENvbmNhdGVuYXRlU3RyaW5nKCZwYXRoLG1lc3NhZ2UpOwpAQCAtMjE5OSw3ICsyMjAwLDcgQEAKICAgICB7CiAgICAgICBpZiAoTG9jYWxlTkNvbXBhcmUoImRlcHRoIixwcm9wZXJ0eSw1KSA9PSAwKQogICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCiAgICAgICAgICAgICBpbWFnZS0+ZGVwdGgpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMjM1LDggKzIyMzYsOCBAQAogICAgIHsKICAgICAgIGlmIChMb2NhbGVOQ29tcGFyZSgiaGVpZ2h0Iixwcm9wZXJ0eSw2KSA9PSAwKQogICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlbHUiLAotICAgICAgICAgICAgaW1hZ2UtPm1hZ2lja19yb3dzICE9IDAgPyBpbWFnZS0+bWFnaWNrX3Jvd3MgOiAyNTZVTCk7CisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsCisgICAgICAgICAgICBpbWFnZS0+bWFnaWNrX3Jvd3MgIT0gMCA/IChkb3VibGUpIGltYWdlLT5tYWdpY2tfcm93cyA6IDI1Ni4wKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgYnJlYWs7CkBAIC0yMzQwLDcgKzIzNDEsNyBAQAogICAgICAgICAgIHA9aW1hZ2U7CiAgICAgICAgICAgZm9yIChwYWdlPTE7IEdldFByZXZpb3VzSW1hZ2VJbkxpc3QocCkgIT0gKEltYWdlICopIE5VTEw7IHBhZ2UrKykKICAgICAgICAgICAgIHA9R2V0UHJldmlvdXNJbWFnZUluTGlzdChwKTsKLSAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZhbHVlLE1heFRleHRFeHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICAgIHBhZ2UpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMzU5LDE3ICsyMzYwLDE3IEBACiAgICAgICAgIH0KICAgICAgIGlmIChMb2NhbGVOQ29tcGFyZSgic2NlbmVzIixwcm9wZXJ0eSw2KSA9PSAwKQogICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlbHUiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIEdldEltYWdlTGlzdExlbmd0aChpbWFnZSkpOworICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCisgICAgICAgICAgICBHZXRJbWFnZUxpc3RMZW5ndGgoaW1hZ2UpKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgaWYgKExvY2FsZU5Db21wYXJlKCJzY2VuZSIscHJvcGVydHksNSkgPT0gMCkKICAgICAgICAgewotICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJWx1IiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZhbHVlLE1heFRleHRFeHRlbnQsIiUuMjBnIiwoZG91YmxlKQogICAgICAgICAgICAgaW1hZ2UtPnNjZW5lKTsKICAgICAgICAgICBpZiAoaW1hZ2VfaW5mby0+bnVtYmVyX3NjZW5lcyAhPSAwKQotICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlbHUiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaW1hZ2VfaW5mby0+c2NlbmUpOworICAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgICAgICAgaW1hZ2VfaW5mby0+c2NlbmUpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICBpZiAoTG9jYWxlTkNvbXBhcmUoInNrZXduZXNzIixwcm9wZXJ0eSw4KSA9PSAwKQpAQCAtMjQxMyw3ICsyNDE0LDcgQEAKICAgICB7CiAgICAgICBpZiAoTG9jYWxlTkNvbXBhcmUoIndpZHRoIixwcm9wZXJ0eSw1KSA9PSAwKQogICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpIAogICAgICAgICAgICAgKGltYWdlLT5tYWdpY2tfY29sdW1ucyAhPSAwID8gaW1hZ2UtPm1hZ2lja19jb2x1bW5zIDogMjU2KSk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI2MTcsNyArMjYxOCw3IEBACiAgICAgICAgIC8qCiAgICAgICAgICAgRmlsZSBzaXplLgogICAgICAgICAqLwotICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZvcm1hdCxNYXhUZXh0RXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZvcm1hdCxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICBpbWFnZS0+ZXh0ZW50KTsKICAgICAgICAgaWYgKGltYWdlLT5leHRlbnQgIT0gKE1hZ2lja1NpemVUeXBlKSAoKHNpemVfdCkgaW1hZ2UtPmV4dGVudCkpCiAgICAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1NpemUoaW1hZ2UtPmV4dGVudCxNYWdpY2tGYWxzZSxmb3JtYXQpOwpAQCAtMjcwMyw5ICsyNzA0LDkgQEAKICAgICAgICAgLyoKICAgICAgICAgICBJbWFnZSBnZW9tZXRyeS4KICAgICAgICAgKi8KLSAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlbHV4JWx1JStsZCUrbGQiLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgIGltYWdlLT5wYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS5oZWlnaHQsKGxvbmcpCi0gICAgICAgICAgaW1hZ2UtPnBhZ2UueCwobG9uZykgaW1hZ2UtPnBhZ2UueSk7CisgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5wYWdlLndpZHRoLChkb3VibGUpIGltYWdlLT5wYWdlLmhlaWdodCwoZG91YmxlKQorICAgICAgICAgIGltYWdlLT5wYWdlLngsKGRvdWJsZSkgaW1hZ2UtPnBhZ2UueSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSAnaCc6CkBAIC0yNzEzLDcgKzI3MTQsNyBAQAogICAgICAgICAvKgogICAgICAgICAgIEltYWdlIGhlaWdodC4KICAgICAgICAgKi8KLSAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKQorICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiUuMjBnIiwoZG91YmxlKQogICAgICAgICAgIChpbWFnZS0+cm93cyAhPSAwID8gaW1hZ2UtPnJvd3MgOiBpbWFnZS0+bWFnaWNrX3Jvd3MpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0yNzMwLDcgKzI3MzEsNyBAQAogICAgICAgICAvKgogICAgICAgICAgIE51bWJlciBvZiB1bmlxdWUgY29sb3JzLgogICAgICAgICAqLwotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGciLChkb3VibGUpCiAgICAgICAgICAgR2V0TnVtYmVyQ29sb3JzKGltYWdlLChGSUxFICopIE5VTEwsJmltYWdlLT5leGNlcHRpb24pKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0yNzc2LDcgKzI3NzcsNyBAQAogICAgICAgICAvKgogICAgICAgICAgIE51bWJlciBvZiBpbWFnZXMgaW4gdGhlIGxpc3QuCiAgICAgICAgICovCi0gICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJWx1IiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICBHZXRJbWFnZUxpc3RMZW5ndGgoaW1hZ2UpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0yODAyLDcgKzI4MDMsNyBAQAogICAgICAgICBwPWltYWdlOwogICAgICAgICBmb3IgKHBhZ2U9MTsgR2V0UHJldmlvdXNJbWFnZUluTGlzdChwKSAhPSAoSW1hZ2UgKikgTlVMTDsgcGFnZSsrKQogICAgICAgICAgIHA9R2V0UHJldmlvdXNJbWFnZUluTGlzdChwKTsKLSAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkgcGFnZSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSAncSc6CkBAIC0yODEwLDcgKzI4MTEsNyBAQAogICAgICAgICAvKgogICAgICAgICAgIEltYWdlIGRlcHRoLgogICAgICAgICAqLwotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZXB0aCk7CisgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGciLChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSAncic6CkBAIC0yODM2LDEwICsyODM3LDkgQEAKICAgICAgICAgICBJbWFnZSBzY2VuZSBudW1iZXIuCiAgICAgICAgICovCiAgICAgICAgIGlmICh0ZXh0X2luZm8tPm51bWJlcl9zY2VuZXMgPT0gMCkKLSAgICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5zY2VuZSk7CisgICAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPnNjZW5lKTsKICAgICAgICAgZWxzZQotICAgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJWx1IiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICAgIHRleHRfaW5mby0+c2NlbmUpOworICAgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGciLChkb3VibGUpIHRleHRfaW5mby0+c2NlbmUpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ3UnOgpAQCAtMjg1Niw3ICsyODU2LDcgQEAKICAgICAgICAgLyoKICAgICAgICAgICBJbWFnZSB3aWR0aC4KICAgICAgICAgKi8KLSAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKQorICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiUuMjBnIiwoZG91YmxlKQogICAgICAgICAgIChpbWFnZS0+Y29sdW1ucyAhPSAwID8gaW1hZ2UtPmNvbHVtbnMgOiBpbWFnZS0+bWFnaWNrX2NvbHVtbnMpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0yODg1LDcgKzI4ODUsNyBAQAogICAgICAgICAvKgogICAgICAgICAgIEltYWdlIGRlcHRoLgogICAgICAgICAqLwotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5kZXB0aCk7CisgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGciLChkb3VibGUpIGltYWdlLT5kZXB0aCk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSAnQSc6CkBAIC0yOTE3LDEzICsyOTE3LDEzIEBACiAgICAgICB9CiAgICAgICBjYXNlICdHJzoKICAgICAgIHsKLSAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlbHV4JWx1IiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgICBpbWFnZS0+bWFnaWNrX2NvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5tYWdpY2tfcm93cyk7CisgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGd4JS4yMGciLChkb3VibGUpCisgICAgICAgICAgaW1hZ2UtPm1hZ2lja19jb2x1bW5zLChkb3VibGUpIGltYWdlLT5tYWdpY2tfcm93cyk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSAnSCc6CiAgICAgICB7Ci0gICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJWx1IiwodW5zaWduZWQgbG9uZykKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICAgICAgICBpbWFnZS0+cGFnZS5oZWlnaHQpOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTI5MzUsMTMgKzI5MzUsMTMgQEAKICAgICAgIH0KICAgICAgIGNhc2UgJ1AnOgogICAgICAgewotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsdXglbHUiLCh1bnNpZ25lZCBsb25nKQotICAgICAgICAgIGltYWdlLT5wYWdlLndpZHRoLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cGFnZS5oZWlnaHQpOworICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiUuMjBneCUuMjBnIiwoZG91YmxlKSBpbWFnZS0+cGFnZS53aWR0aCwKKyAgICAgICAgICAoZG91YmxlKSBpbWFnZS0+cGFnZS5oZWlnaHQpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ1EnOgogICAgICAgewotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5xdWFsaXR5KTsKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPnF1YWxpdHkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ1MnOgpAQCAtMjk1MiwyOCArMjk1MiwyOCBAQAogICAgICAgICBpZiAodGV4dF9pbmZvLT5udW1iZXJfc2NlbmVzID09IDApCiAgICAgICAgICAgcSs9Q29weU1hZ2lja1N0cmluZyhxLCIyMTQ3NDgzNjQ3IixleHRlbnQpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKQorICAgICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLGV4dGVudCwiJS4yMGciLChkb3VibGUpCiAgICAgICAgICAgICAodGV4dF9pbmZvLT5zY2VuZSt0ZXh0X2luZm8tPm51bWJlcl9zY2VuZXMpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlICdUJzoKICAgICAgIHsKLSAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+ZGVsYXkpOworICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiUuMjBnIiwoZG91YmxlKSBpbWFnZS0+ZGVsYXkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ1cnOgogICAgICAgewotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5wYWdlLndpZHRoKTsKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkgaW1hZ2UtPnBhZ2Uud2lkdGgpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ1gnOgogICAgICAgewotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiUrbGQiLChsb25nKSBpbWFnZS0+cGFnZS54KTsKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlKy4yMGciLChkb3VibGUpIGltYWdlLT5wYWdlLngpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ1knOgogICAgICAgewotICAgICAgICBxKz1Gb3JtYXRNYWdpY2tTdHJpbmcocSxleHRlbnQsIiUrbGQiLChsb25nKSBpbWFnZS0+cGFnZS55KTsKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsZXh0ZW50LCIlKy4yMGciLChkb3VibGUpIGltYWdlLT5wYWdlLnkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgJ1onOgpAQCAtMzExMSw4ICszMTExLDkgQEAKICAgICAgICAgICBJbWFnZSBib3VuZGluZyBib3guCiAgICAgICAgICovCiAgICAgICAgIHBhZ2U9R2V0SW1hZ2VCb3VuZGluZ0JveChpbWFnZSwmaW1hZ2UtPmV4Y2VwdGlvbik7Ci0gICAgICAgIHErPUZvcm1hdE1hZ2lja1N0cmluZyhxLE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkJStsZCIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgICAgcGFnZS53aWR0aCwodW5zaWduZWQgbG9uZykgcGFnZS5oZWlnaHQsKGxvbmcpIHBhZ2UueCwobG9uZykgcGFnZS55KTsKKyAgICAgICAgcSs9Rm9ybWF0TWFnaWNrU3RyaW5nKHEsTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwKKyAgICAgICAgICAoZG91YmxlKSBwYWdlLndpZHRoLChkb3VibGUpIHBhZ2UuaGVpZ2h0LChkb3VibGUpIHBhZ2UueCwoZG91YmxlKQorICAgICAgICAgIHBhZ2UueSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSAnIyc6CmRpZmYgLS1naXQgYS9tYWdpY2svcmVzaXplLmMgYi9tYWdpY2svcmVzaXplLmMKaW5kZXggY2JlYzRhNy4uZDE4NDY1ZSAxMDA2NDQKLS0tIGEvbWFnaWNrL3Jlc2l6ZS5jCisrKyBiL21hZ2ljay9yZXNpemUuYwpAQCAtNzk3LDcgKzc5Nyw3IEBACiAgICAgICAgIE91dHB1dCBmaWx0ZXIgZ3JhcGggLS0gZm9yIGdyYXBoaW5nIGZpbHRlciByZXN1bHQuCiAgICAgICAqLwogICAgICAgc3VwcG9ydD1HZXRSZXNpemVGaWx0ZXJTdXBwb3J0KHJlc2l6ZV9maWx0ZXIpOwotICAgICAgKHZvaWQpIHByaW50ZigiIyBzdXBwb3J0ID0gJWxnXG4iLHN1cHBvcnQpOworICAgICAgKHZvaWQpIHByaW50ZigiIyBzdXBwb3J0ID0gJWdcbiIsc3VwcG9ydCk7CiAgICAgICBmb3IgKHg9MC4wOyB4IDw9IHN1cHBvcnQ7IHgrPTAuMDFmKQogICAgICAgICAodm9pZCkgcHJpbnRmKCIlNS4ybGZcdCVsZlxuIix4LChkb3VibGUpIEdldFJlc2l6ZUZpbHRlcldlaWdodCgKICAgICAgICAgICByZXNpemVfZmlsdGVyLHgpKTsKQEAgLTMwMDQsMTEgKzMwMDQsMTEgQEAKICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcodmFsdWUsaW1hZ2UtPm1hZ2lja19maWxlbmFtZSxNYXhUZXh0RXh0ZW50KTsKICAgaWYgKEdldFBhdGhBdHRyaWJ1dGVzKGltYWdlLT5maWxlbmFtZSwmYXR0cmlidXRlcykgIT0gTWFnaWNrRmFsc2UpCiAgICAgewotICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlbGQiLChsb25nKQorICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICAgICAgYXR0cmlidXRlcy5zdF9tdGltZSk7CiAgICAgICAodm9pZCkgU2V0SW1hZ2VQcm9wZXJ0eSh0aHVtYm5haWxfaW1hZ2UsIlRodW1iOjpNVGltZSIsdmFsdWUpOwogICAgIH0KLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlbGQiLChsb25nKQorICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZhbHVlLE1heFRleHRFeHRlbnQsIiUuMjBnIiwoZG91YmxlKQogICAgIGF0dHJpYnV0ZXMuc3RfbXRpbWUpOwogICAodm9pZCkgRm9ybWF0TWFnaWNrU2l6ZShHZXRCbG9iU2l6ZShpbWFnZSksTWFnaWNrRmFsc2UsdmFsdWUpOwogICAodm9pZCkgQ29uY2F0ZW5hdGVNYWdpY2tTdHJpbmcodmFsdWUsIkIiLE1heFRleHRFeHRlbnQpOwpAQCAtMzAxOCwxNCArMzAxOCwxNCBAQAogICAodm9pZCkgU2V0SW1hZ2VQcm9wZXJ0eSh0aHVtYm5haWxfaW1hZ2UsIlRodW1iOjpNaW1ldHlwZSIsdmFsdWUpOwogICAodm9pZCkgU2V0SW1hZ2VQcm9wZXJ0eSh0aHVtYm5haWxfaW1hZ2UsInNvZnR3YXJlIiwKICAgICBHZXRNYWdpY2tWZXJzaW9uKCZ2ZXJzaW9uKSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJWx1IiwKLSAgICAgKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5tYWdpY2tfY29sdW1ucyk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCisgICAgaW1hZ2UtPm1hZ2lja19jb2x1bW5zKTsKICAgKHZvaWQpIFNldEltYWdlUHJvcGVydHkodGh1bWJuYWlsX2ltYWdlLCJUaHVtYjo6SW1hZ2U6OldpZHRoIix2YWx1ZSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJWx1IiwodW5zaWduZWQgbG9uZykKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh2YWx1ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICBpbWFnZS0+bWFnaWNrX3Jvd3MpOwogICAodm9pZCkgU2V0SW1hZ2VQcm9wZXJ0eSh0aHVtYm5haWxfaW1hZ2UsIlRodW1iOjpJbWFnZTo6aGVpZ2h0Iix2YWx1ZSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJWx1IiwKLSAgICAodW5zaWduZWQgbG9uZykgR2V0SW1hZ2VMaXN0TGVuZ3RoKGltYWdlKSk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCisgICAgR2V0SW1hZ2VMaXN0TGVuZ3RoKGltYWdlKSk7CiAgICh2b2lkKSBTZXRJbWFnZVByb3BlcnR5KHRodW1ibmFpbF9pbWFnZSwiVGh1bWI6OkRvY3VtZW50OjpQYWdlcyIsdmFsdWUpOwogICByZXR1cm4odGh1bWJuYWlsX2ltYWdlKTsKIH0KZGlmZiAtLWdpdCBhL21hZ2ljay9yZXNvdXJjZS5jIGIvbWFnaWNrL3Jlc291cmNlLmMKaW5kZXggY2IzYTEwZC4uZWQxOGI5YSAxMDA2NDQKLS0tIGEvbWFnaWNrL3Jlc291cmNlLmMKKysrIGIvbWFnaWNrL3Jlc291cmNlLmMKQEAgLTY3OCwxNSArNjc4LDE1IEBACiAgICh2b2lkKSBGb3JtYXRNYWdpY2tTaXplKHJlc291cmNlX2luZm8uZGlza19saW1pdCxNYWdpY2tGYWxzZSxkaXNrX2xpbWl0KTsKICAgKHZvaWQpIENvcHlNYWdpY2tTdHJpbmcodGltZV9saW1pdCwidW5saW1pdGVkIixNYXhUZXh0RXh0ZW50KTsKICAgaWYgKHJlc291cmNlX2luZm8udGltZV9saW1pdCAhPSBNYWdpY2tSZXNvdXJjZUluZmluaXR5KQotICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGltZV9saW1pdCxNYXhUZXh0RXh0ZW50LCIlbHUiLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodGltZV9saW1pdCxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICAgIHJlc291cmNlX2luZm8udGltZV9saW1pdCk7CiAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIkZpbGUgICAgICAgICBBcmVhICAgICAgIE1lbW9yeSAgICAgICAgICBNYXAiCiAgICAgIiAgICAgICAgIERpc2sgICAgVGhyZWFkICAgICAgICAgVGltZVxuIik7CiAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICh2b2lkKSBmcHJpbnRmKGZpbGUsIiU0bHUgICUxMHNCICAlMTBzQiAgJTEwc0IgICUxMHNCICAgICU2bHUgICUxMXNcbiIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIHJlc291cmNlX2luZm8uZmlsZV9saW1pdCxhcmVhX2xpbWl0LG1lbW9yeV9saW1pdCxtYXBfbGltaXQsCi0gICAgZGlza19saW1pdCwodW5zaWduZWQgbG9uZykgcmVzb3VyY2VfaW5mby50aHJlYWRfbGltaXQsdGltZV9saW1pdCk7CisgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiU0ZyAgJTEwc0IgICUxMHNCICAlMTBzQiAgJTEwc0IgICAgJTZnICAlMTFzXG4iLChkb3VibGUpCisgICAgcmVzb3VyY2VfaW5mby5maWxlX2xpbWl0LGFyZWFfbGltaXQsbWVtb3J5X2xpbWl0LG1hcF9saW1pdCxkaXNrX2xpbWl0LAorICAgIChkb3VibGUpIHJlc291cmNlX2luZm8udGhyZWFkX2xpbWl0LHRpbWVfbGltaXQpOwogICAodm9pZCkgZmZsdXNoKGZpbGUpOwogICBVbmxvY2tTZW1hcGhvcmVJbmZvKHJlc291cmNlX3NlbWFwaG9yZSk7CiAgIHJldHVybihNYWdpY2tUcnVlKTsKZGlmZiAtLWdpdCBhL21hZ2ljay9zZWdtZW50LmMgYi9tYWdpY2svc2VnbWVudC5jCmluZGV4IDhiYzAyNTMuLmQ3ZmQzMGUgMTAwNjQ0Ci0tLSBhL21hZ2ljay9zZWdtZW50LmMKKysrIGIvbWFnaWNrL3NlZ21lbnQuYwpAQCAtNDUxLDE2ICs0NTEsMTYgQEAKICAgICAgICAgY2x1c3Rlcl90aHJlc2hvbGQpOwogICAgICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCJcdFdlaWdodGluZyBFeHBvbmVudCA9ICVnXG4iLChkb3VibGUpCiAgICAgICAgIHdlaWdodGluZ19leHBvbmVudCk7Ci0gICAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsIlx0VG90YWwgTnVtYmVyIG9mIENsdXN0ZXJzID0gJWx1XG5cbiIsCi0gICAgICAgICh1bnNpZ25lZCBsb25nKSBudW1iZXJfY2x1c3RlcnMpOworICAgICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCJcdFRvdGFsIE51bWJlciBvZiBDbHVzdGVycyA9ICUuMjBnXG5cbiIsKGRvdWJsZSkKKyAgICAgICAgbnVtYmVyX2NsdXN0ZXJzKTsKICAgICAgIC8qCiAgICAgICAgIFByaW50IHRoZSB0b3RhbCBudW1iZXIgb2YgcG9pbnRzIHBlciBjbHVzdGVyLgogICAgICAgKi8KICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiXG5cbk51bWJlciBvZiBWZWN0b3JzIFBlciBDbHVzdGVyXG4iKTsKICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CiAgICAgICBmb3IgKGNsdXN0ZXI9aGVhZDsgY2x1c3RlciAhPSAoQ2x1c3RlciAqKSBOVUxMOyBjbHVzdGVyPWNsdXN0ZXItPm5leHQpCi0gICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiQ2x1c3RlciAjJWxkID0gJWxkXG4iLChsb25nKSBjbHVzdGVyLT5pZCwKLSAgICAgICAgICAobG9uZykgY2x1c3Rlci0+Y291bnQpOworICAgICAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsIkNsdXN0ZXIgIyUuMjBnID0gJS4yMGdcbiIsKGRvdWJsZSkgY2x1c3Rlci0+aWQsCisgICAgICAgICAgKGRvdWJsZSkgY2x1c3Rlci0+Y291bnQpOwogICAgICAgLyoKICAgICAgICAgUHJpbnQgdGhlIGNsdXN0ZXIgZXh0ZW50cy4KICAgICAgICovCkBAIC00NjksMTEgKzQ2OSwxMSBAQAogICAgICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCI9PT09PT09PT09PT09PT09Iik7CiAgICAgICBmb3IgKGNsdXN0ZXI9aGVhZDsgY2x1c3RlciAhPSAoQ2x1c3RlciAqKSBOVUxMOyBjbHVzdGVyPWNsdXN0ZXItPm5leHQpCiAgICAgICB7Ci0gICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiXG5cbkNsdXN0ZXIgIyVsZFxuXG4iLChsb25nKSBjbHVzdGVyLT5pZCk7Ci0gICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiJWxkLSVsZCAgJWxkLSVsZCAgJWxkLSVsZFxuIiwobG9uZykKLSAgICAgICAgICBjbHVzdGVyLT5yZWQubGVmdCwobG9uZykgY2x1c3Rlci0+cmVkLnJpZ2h0LChsb25nKQotICAgICAgICAgIGNsdXN0ZXItPmdyZWVuLmxlZnQsKGxvbmcpIGNsdXN0ZXItPmdyZWVuLnJpZ2h0LChsb25nKQotICAgICAgICAgIGNsdXN0ZXItPmJsdWUubGVmdCwobG9uZykgY2x1c3Rlci0+Ymx1ZS5yaWdodCk7CisgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiXG5cbkNsdXN0ZXIgIyUuMjBnXG5cbiIsKGRvdWJsZSkgY2x1c3Rlci0+aWQpOworICAgICAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsIiUuMjBnLSUuMjBnICAlLjIwZy0lLjIwZyAgJS4yMGctJS4yMGdcbiIsKGRvdWJsZSkKKyAgICAgICAgICBjbHVzdGVyLT5yZWQubGVmdCwoZG91YmxlKSBjbHVzdGVyLT5yZWQucmlnaHQsKGRvdWJsZSkKKyAgICAgICAgICBjbHVzdGVyLT5ncmVlbi5sZWZ0LChkb3VibGUpIGNsdXN0ZXItPmdyZWVuLnJpZ2h0LChkb3VibGUpCisgICAgICAgICAgY2x1c3Rlci0+Ymx1ZS5sZWZ0LChkb3VibGUpIGNsdXN0ZXItPmJsdWUucmlnaHQpOwogICAgICAgfQogICAgICAgLyoKICAgICAgICAgUHJpbnQgdGhlIGNsdXN0ZXIgY2VudGVyIHZhbHVlcy4KQEAgLTQ4Myw3ICs0ODMsNyBAQAogICAgICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCI9PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICAgIGZvciAoY2x1c3Rlcj1oZWFkOyBjbHVzdGVyICE9IChDbHVzdGVyICopIE5VTEw7IGNsdXN0ZXI9Y2x1c3Rlci0+bmV4dCkKICAgICAgIHsKLSAgICAgICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCJcblxuQ2x1c3RlciAjJWxkXG5cbiIsKGxvbmcpIGNsdXN0ZXItPmlkKTsKKyAgICAgICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCJcblxuQ2x1c3RlciAjJS4yMGdcblxuIiwoZG91YmxlKSBjbHVzdGVyLT5pZCk7CiAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiJWcgICVnICAlZ1xuIiwoZG91YmxlKQogICAgICAgICAgIGNsdXN0ZXItPnJlZC5jZW50ZXIsKGRvdWJsZSkgY2x1c3Rlci0+Z3JlZW4uY2VudGVyLChkb3VibGUpCiAgICAgICAgICAgY2x1c3Rlci0+Ymx1ZS5jZW50ZXIpOwpkaWZmIC0tZ2l0IGEvbWFnaWNrL3NoZWFyLmMgYi9tYWdpY2svc2hlYXIuYwppbmRleCA5ZDU2MGU4Li4wNmZkYzRkIDEwMDY0NAotLS0gYS9tYWdpY2svc2hlYXIuYworKysgYi9tYWdpY2svc2hlYXIuYwpAQCAtOTc4LDggKzk3OCw4IEBACiAgIG1lZGlhbl9pbWFnZT1EZXN0cm95SW1hZ2UobWVkaWFuX2ltYWdlKTsKICAgaWYgKGltYWdlLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoVHJhbnNmb3JtRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiAgRGVza2V3IGdlb21ldHJ5OiAiCi0gICAgICAiJWx1eCVsdSUrbGQlK2xkIiwodW5zaWduZWQgbG9uZykgZ2VvbWV0cnkud2lkdGgsKHVuc2lnbmVkIGxvbmcpCi0gICAgICBnZW9tZXRyeS5oZWlnaHQsKGxvbmcpIGdlb21ldHJ5LngsKGxvbmcpIGdlb21ldHJ5LnkpOworICAgICAgIiUuMjBneCUuMjBnJSsuMjBneCUrLjIwZyIsKGRvdWJsZSkgZ2VvbWV0cnkud2lkdGgsKGRvdWJsZSkKKyAgICAgIGdlb21ldHJ5LmhlaWdodCwoZG91YmxlKSBnZW9tZXRyeS54LChkb3VibGUpIGdlb21ldHJ5LnkpOwogICBjcm9wX2ltYWdlPUNyb3BJbWFnZShkZXNrZXdfaW1hZ2UsJmdlb21ldHJ5LGV4Y2VwdGlvbik7CiAgIGRlc2tld19pbWFnZT1EZXN0cm95SW1hZ2UoZGVza2V3X2ltYWdlKTsKICAgcmV0dXJuKGNyb3BfaW1hZ2UpOwpkaWZmIC0tZ2l0IGEvbWFnaWNrL3RocmVzaG9sZC5jIGIvbWFnaWNrL3RocmVzaG9sZC5jCmluZGV4IGQzOTJhYjQuLmI5MTFmYWQgMTAwNjQ0Ci0tLSBhL21hZ2ljay90aHJlc2hvbGQuYworKysgYi9tYWdpY2svdGhyZXNob2xkLmMKQEAgLTEwMjcsOCArMTAyNyw4IEBACiAgICAgICB9CiAgICAgICBpZiAoIG1hcC0+bGV2ZWxzW2ldIDwgMCB8fCBtYXAtPmxldmVsc1tpXSA+IG1hcC0+ZGl2aXNvciApIHsKICAgICAgICAgKHZvaWQpIFRocm93TWFnaWNrRXhjZXB0aW9uKGV4Y2VwdGlvbixHZXRNYWdpY2tNb2R1bGUoKSxPcHRpb25FcnJvciwKLSAgICAgICAgICAiWG1sSW52YWxpZENvbnRlbnQiLCAiPGxldmVsPiAlbGQgb3V0IG9mIHJhbmdlLCBtYXAgXCIlc1wiIiwKLSAgICAgICAgICAobG9uZykgbWFwLT5sZXZlbHNbaV0sbWFwX2lkKTsKKyAgICAgICAgICAiWG1sSW52YWxpZENvbnRlbnQiLCAiPGxldmVsPiAlLjIwZyBvdXQgb2YgcmFuZ2UsIG1hcCBcIiVzXCIiLAorICAgICAgICAgIChkb3VibGUpIG1hcC0+bGV2ZWxzW2ldLG1hcF9pZCk7CiAgICAgICAgIHRocmVzaG9sZHMgPSBEZXN0cm95WE1MVHJlZSh0aHJlc2hvbGRzKTsKICAgICAgICAgbWFwID0gRGVzdHJveVRocmVzaG9sZE1hcChtYXApOwogICAgICAgICByZXR1cm4obWFwKTsKQEAgLTE0NjEsNyArMTQ2MSw3IEBACiAjZW5kaWYKIAogI2lmIDAKLXByaW50ZigiREVCVUcgbGV2ZWxzICByPSVsZCBnPSVsZCBiPSVsZCBhPSVsZCBpPSVsZFxuIiwKK3ByaW50ZigiREVCVUcgbGV2ZWxzICByPSV1IGc9JXUgYj0ldSBhPSV1IGk9JXVcbiIsCiAgICAgIGxldmVscy5yZWQsIGxldmVscy5ncmVlbiwgbGV2ZWxzLmJsdWUsIGxldmVscy5vcGFjaXR5LCBsZXZlbHMuaW5kZXgpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21hZ2ljay90eXBlLmMgYi9tYWdpY2svdHlwZS5jCmluZGV4IGM3NzljODQuLjRjMzY4MDQgMTAwNjQ0Ci0tLSBhL21hZ2ljay90eXBlLmMKKysrIGIvbWFnaWNrL3R5cGUuYwpAQCAtODY2LDggKzg2Niw4IEBACiAgICAgZ2x5cGhzPSJ1bmtub3duIjsKICAgICBpZiAodHlwZV9pbmZvW2ldLT5nbHlwaHMgIT0gKGNoYXIgKikgTlVMTCkKICAgICAgIGdseXBocz10eXBlX2luZm9baV0tPmdseXBoczsKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHdlaWdodCxNYXhUZXh0RXh0ZW50LCIlbHUiLAotICAgICAgKHVuc2lnbmVkIGxvbmcpIHR5cGVfaW5mb1tpXS0+d2VpZ2h0KTsKKyAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHdlaWdodCxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKKyAgICAgIHR5cGVfaW5mb1tpXS0+d2VpZ2h0KTsKICAgICAodm9pZCkgZnByaW50ZihmaWxlLCIgIEZvbnQ6ICVzXG4iLG5hbWUpOwogICAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgICBmYW1pbHk6ICVzXG4iLGZhbWlseSk7CiAgICAgKHZvaWQpIGZwcmludGYoZmlsZSwiICAgIHN0eWxlOiAlc1xuIixzdHlsZSk7CmRpZmYgLS1naXQgYS9tYWdpY2svdXRpbGl0eS5jIGIvbWFnaWNrL3V0aWxpdHkuYwppbmRleCBkYWNhYmMzLi43MGNkMThhIDEwMDY0NAotLS0gYS9tYWdpY2svdXRpbGl0eS5jCisrKyBiL21hZ2ljay91dGlsaXR5LmMKQEAgLTk0MCwxMyArOTQwLDEzIEBACiAgICAgc3NpemVfdAogICAgICAgY291bnQ7CiAKLSAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGxpbmtfcGF0aCxNYXhUZXh0RXh0ZW50LCIvcHJvYy8lbGQvZXhlIiwKLSAgICAgIChsb25nKSBnZXRwaWQoKSk7CisgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhsaW5rX3BhdGgsTWF4VGV4dEV4dGVudCwiL3Byb2MvJS4yMGcvZXhlIiwKKyAgICAgIChkb3VibGUpIGdldHBpZCgpKTsKICAgICBjb3VudD1yZWFkbGluayhsaW5rX3BhdGgsZXhlY3V0aW9uX3BhdGgsUEFUSF9NQVgpOwogICAgIGlmIChjb3VudCA9PSAtMSkKICAgICAgIHsKLSAgICAgICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhsaW5rX3BhdGgsTWF4VGV4dEV4dGVudCwiL3Byb2MvJWxkL2ZpbGUiLAotICAgICAgICAgIChsb25nKSBnZXRwaWQoKSk7CisgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcobGlua19wYXRoLE1heFRleHRFeHRlbnQsIi9wcm9jLyUuMjBnL2ZpbGUiLAorICAgICAgICAgIChkb3VibGUpIGdldHBpZCgpKTsKICAgICAgICAgY291bnQ9cmVhZGxpbmsobGlua19wYXRoLGV4ZWN1dGlvbl9wYXRoLFBBVEhfTUFYKTsKICAgICAgIH0KICAgICBpZiAoKGNvdW50ID4gMCkgJiYgKGNvdW50IDw9IChzc2l6ZV90KSBQQVRIX01BWCkpCmRpZmYgLS1naXQgYS9tYWdpY2sveHdpbmRvdy5jIGIvbWFnaWNrL3h3aW5kb3cuYwppbmRleCA1NTU0Yzc0Li5iYTBlZTJjIDEwMDY0NAotLS0gYS9tYWdpY2sveHdpbmRvdy5jCisrKyBiL21hZ2ljay94d2luZG93LmMKQEAgLTIwNDQsOSArMjA0NCw4IEBACiAgICAgdW5kb19pbWFnZT1HZXRQcmV2aW91c0ltYWdlSW5MaXN0KHVuZG9faW1hZ2UpOwogICB9CiAgICh2b2lkKSBmcHJpbnRmKGZpbGUsIlVuZG8gRWRpdCBDYWNoZVxuICBsZXZlbHM6ICV1XG4iLGxldmVscyk7Ci0gICh2b2lkKSBmcHJpbnRmKGZpbGUsIiAgYnl0ZXM6ICVsdW1iXG4iLCh1bnNpZ25lZCBsb25nKQotICAgICgoYnl0ZXMrKDEgPDwgMTkpKSA+PiAyMCkpOwotICAodm9pZCkgZnByaW50ZihmaWxlLCIgIGxpbWl0OiAlbHVtYlxuXG4iLCh1bnNpZ25lZCBsb25nKQorICAodm9pZCkgZnByaW50ZihmaWxlLCIgIGJ5dGVzOiAlLjIwZ21iXG4iLChkb3VibGUpICgoYnl0ZXMrKDEgPDwgMTkpKSA+PiAyMCkpOworICAodm9pZCkgZnByaW50ZihmaWxlLCIgIGxpbWl0OiAlLjIwZ21iXG5cbiIsKGRvdWJsZSkKICAgICByZXNvdXJjZV9pbmZvLT51bmRvX2NhY2hlKTsKICAgLyoKICAgICBXcml0ZSBpbmZvIGFib3V0IHRoZSBpbWFnZSB0byBhIGZpbGUuCkBAIC01ODY1LDggKzU4NjQsOCBAQAogICAgICAgICByZXNvdXJjZV9pbmZvLT5pbWFnZV9pbmZvLT50ZXh0dXJlICE9IChjaGFyICopIE5VTEwgPwogICAgICAgICByZXNvdXJjZV9pbmZvLT5pbWFnZV9pbmZvLT50ZXh0dXJlIDogInBhdHRlcm46Y2hlY2tlcmJvYXJkIiwKICAgICAgICAgTWF4VGV4dEV4dGVudCk7Ci0gICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHNpemUsTWF4VGV4dEV4dGVudCwiJWx1eCVsdSIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgIGltYWdlLT5jb2x1bW5zLCh1bnNpZ25lZCBsb25nKSBpbWFnZS0+cm93cyk7CisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHNpemUsTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGciLChkb3VibGUpCisgICAgICAgIGltYWdlLT5jb2x1bW5zLChkb3VibGUpIGltYWdlLT5yb3dzKTsKICAgICAgIGltYWdlX2luZm8tPnNpemU9Q29uc3RhbnRTdHJpbmcoc2l6ZSk7CiAgICAgICBwYXR0ZXJuPVJlYWRJbWFnZShpbWFnZV9pbmZvLCZpbWFnZS0+ZXhjZXB0aW9uKTsKICAgICAgIGltYWdlX2luZm89RGVzdHJveUltYWdlSW5mbyhpbWFnZV9pbmZvKTsKQEAgLTY0NzgsOCArNjQ3Nyw4IEBACiAgICAgICAgIHJlc291cmNlX2luZm8tPmltYWdlX2luZm8tPnRleHR1cmUgIT0gKGNoYXIgKikgTlVMTCA/CiAgICAgICAgIHJlc291cmNlX2luZm8tPmltYWdlX2luZm8tPnRleHR1cmUgOiAicGF0dGVybjpjaGVja2VyYm9hcmQiLAogICAgICAgICBNYXhUZXh0RXh0ZW50KTsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoc2l6ZSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgaW1hZ2UtPmNvbHVtbnMsKHVuc2lnbmVkIGxvbmcpIGltYWdlLT5yb3dzKTsKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoc2l6ZSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgaW1hZ2UtPmNvbHVtbnMsKGRvdWJsZSkgaW1hZ2UtPnJvd3MpOwogICAgICAgaW1hZ2VfaW5mby0+c2l6ZT1Db25zdGFudFN0cmluZyhzaXplKTsKICAgICAgIHBhdHRlcm49UmVhZEltYWdlKGltYWdlX2luZm8sJmltYWdlLT5leGNlcHRpb24pOwogICAgICAgaW1hZ2VfaW5mbz1EZXN0cm95SW1hZ2VJbmZvKGltYWdlX2luZm8pOwpAQCAtNzA5Niw3ICs3MDk1LDcgQEAKICAgICAgIHdoaWxlICgoMSA8PCBpKSA8PSAoaW50KSBtYWduaWZ5KQogICAgICAgICBpKys7CiAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHdpbmRvd3MtPm1hZ25pZnkubmFtZSxNYXhUZXh0RXh0ZW50LAotICAgICAgICAiTWFnbmlmeSAlbHVYIiwodW5zaWduZWQgbG9uZykgaSk7CisgICAgICAgICJNYWduaWZ5ICUuMjBnWCIsKGRvdWJsZSkgaSk7CiAgICAgICBzdGF0dXM9WFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmd2luZG93cy0+bWFnbmlmeS5uYW1lLDEsJndpbmRvd19uYW1lKTsKICAgICAgIGlmIChzdGF0dXMgIT0gRmFsc2UpCiAgICAgICAgIHsKQEAgLTkyNjYsNyArOTI2NSw3IEBACiAgIHZhbHVlPXJlc291cmNlX2luZm8tPmdhbW1hX2NvcnJlY3QgPyAiVHJ1ZSIgOiAiRmFsc2UiOwogICBYcm1QdXRTdHJpbmdSZXNvdXJjZSgmcHJlZmVyZW5jZXNfZGF0YWJhc2Usc3BlY2lmaWVyLChjaGFyICopIHZhbHVlKTsKICAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhzcGVjaWZpZXIsTWF4VGV4dEV4dGVudCwiJXMudW5kb0NhY2hlIixjbGllbnRfbmFtZSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY2FjaGUsTWF4VGV4dEV4dGVudCwiJWx1IiwodW5zaWduZWQgbG9uZykKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhjYWNoZSxNYXhUZXh0RXh0ZW50LCIlLjIwZyIsKGRvdWJsZSkKICAgICByZXNvdXJjZV9pbmZvLT51bmRvX2NhY2hlKTsKICAgWHJtUHV0U3RyaW5nUmVzb3VyY2UoJnByZWZlcmVuY2VzX2RhdGFiYXNlLHNwZWNpZmllcixjYWNoZSk7CiAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoc3BlY2lmaWVyLE1heFRleHRFeHRlbnQsIiVzLnVzZVBpeG1hcCIsY2xpZW50X25hbWUpOwpkaWZmIC0tZ2l0IGEvd2FuZC9jb21wYXJlLmMgYi93YW5kL2NvbXBhcmUuYwppbmRleCA0MGJlNWVkLi5jYWFiZWI0IDEwMDY0NAotLS0gYS93YW5kL2NvbXBhcmUuYworKysgYi93YW5kL2NvbXBhcmUuYwpAQCAtOTg0LDggKzk4NCw4IEBACiAgICAgICAgICAgICAgICAgKGRvdWJsZSkgZGlzdG9ydGlvbik7CiAgICAgICAgICAgICAgIGlmICgocmVjb25zdHJ1Y3RfaW1hZ2UtPmNvbHVtbnMgIT0gaW1hZ2UtPmNvbHVtbnMpIHx8CiAgICAgICAgICAgICAgICAgICAocmVjb25zdHJ1Y3RfaW1hZ2UtPnJvd3MgIT0gaW1hZ2UtPnJvd3MpKQotICAgICAgICAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwiIEAgJWxkLCVsZCIsKGxvbmcpCi0gICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX2ltYWdlLT5wYWdlLngsKGxvbmcpIGRpZmZlcmVuY2VfaW1hZ2UtPnBhZ2UueSk7CisgICAgICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLCIgQCAlLjIwZywlLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfaW1hZ2UtPnBhZ2UueCwoZG91YmxlKSBkaWZmZXJlbmNlX2ltYWdlLT5wYWdlLnkpOwogICAgICAgICAgICAgICAodm9pZCkgZnByaW50ZihzdGRlcnIsIlxuIik7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtOTk1LDggKzk5NSw4IEBACiAgICAgICAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwiJWciLGRpc3RvcnRpb24pOwogICAgICAgICAgICAgICBpZiAoKHJlY29uc3RydWN0X2ltYWdlLT5jb2x1bW5zICE9IGltYWdlLT5jb2x1bW5zKSB8fAogICAgICAgICAgICAgICAgICAgKHJlY29uc3RydWN0X2ltYWdlLT5yb3dzICE9IGltYWdlLT5yb3dzKSkKLSAgICAgICAgICAgICAgICAodm9pZCkgZnByaW50ZihzdGRlcnIsIiBAICVsZCwlbGQiLChsb25nKQotICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV9pbWFnZS0+cGFnZS54LChsb25nKSBkaWZmZXJlbmNlX2ltYWdlLT5wYWdlLnkpOworICAgICAgICAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwiIEAgJS4yMGcsJS4yMGciLChkb3VibGUpCisgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX2ltYWdlLT5wYWdlLngsKGRvdWJsZSkgZGlmZmVyZW5jZV9pbWFnZS0+cGFnZS55KTsKICAgICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLCJcbiIpOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTEwMDcsOCArMTAwNyw4IEBACiAgICAgICAgICAgICAgICAgaW1hZ2UtPmVycm9yLm5vcm1hbGl6ZWRfbWF4aW11bV9lcnJvcik7CiAgICAgICAgICAgICAgIGlmICgocmVjb25zdHJ1Y3RfaW1hZ2UtPmNvbHVtbnMgIT0gaW1hZ2UtPmNvbHVtbnMpIHx8CiAgICAgICAgICAgICAgICAgICAocmVjb25zdHJ1Y3RfaW1hZ2UtPnJvd3MgIT0gaW1hZ2UtPnJvd3MpKQotICAgICAgICAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwiIEAgJWxkLCVsZCIsKGxvbmcpCi0gICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX2ltYWdlLT5wYWdlLngsKGxvbmcpIGRpZmZlcmVuY2VfaW1hZ2UtPnBhZ2UueSk7CisgICAgICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLCIgQCAlLjIwZywlLjIwZyIsKGRvdWJsZSkKKyAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfaW1hZ2UtPnBhZ2UueCwoZG91YmxlKSBkaWZmZXJlbmNlX2ltYWdlLT5wYWdlLnkpOwogICAgICAgICAgICAgICAodm9pZCkgZnByaW50ZihzdGRlcnIsIlxuIik7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTAyNiw4ICsxMDI2LDggQEAKICAgICAgICAgICAodm9pZCkgZnByaW50ZihzdGRlcnIsIkltYWdlOiAlc1xuIixpbWFnZS0+ZmlsZW5hbWUpOwogICAgICAgICAgIGlmICgocmVjb25zdHJ1Y3RfaW1hZ2UtPmNvbHVtbnMgIT0gaW1hZ2UtPmNvbHVtbnMpIHx8CiAgICAgICAgICAgICAgIChyZWNvbnN0cnVjdF9pbWFnZS0+cm93cyAhPSBpbWFnZS0+cm93cykpCi0gICAgICAgICAgICAodm9pZCkgZnByaW50ZihzdGRlcnIsIk9mZnNldDogJWxkLCVsZFxuIiwobG9uZykKLSAgICAgICAgICAgICAgZGlmZmVyZW5jZV9pbWFnZS0+cGFnZS54LChsb25nKSBkaWZmZXJlbmNlX2ltYWdlLT5wYWdlLnkpOworICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLCJPZmZzZXQ6ICUuMjBnLCUuMjBnXG4iLChkb3VibGUpCisgICAgICAgICAgICAgIGRpZmZlcmVuY2VfaW1hZ2UtPnBhZ2UueCwoZG91YmxlKSBkaWZmZXJlbmNlX2ltYWdlLT5wYWdlLnkpOwogICAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwiICBDaGFubmVsIGRpc3RvcnRpb246ICVzXG4iLAogICAgICAgICAgICAgTWFnaWNrT3B0aW9uVG9NbmVtb25pYyhNYWdpY2tNZXRyaWNPcHRpb25zLChzc2l6ZV90KSBtZXRyaWMpKTsKICAgICAgICAgICBzd2l0Y2ggKG1ldHJpYykKZGlmZiAtLWdpdCBhL3dhbmQvZGVwcmVjYXRlLmMgYi93YW5kL2RlcHJlY2F0ZS5jCmluZGV4IGJhNmU1MzMuLmMxN2U1OTQgMTAwNjQ0Ci0tLSBhL3dhbmQvZGVwcmVjYXRlLmMKKysrIGIvd2FuZC9kZXByZWNhdGUuYwpAQCAtOTYsOCArOTYsOCBAQAogICAgICAgaW1hZ2VzLT5maWxlbmFtZSk7CiAgICh2b2lkKSBSZXNldE1hZ2lja01lbW9yeShjbG9uZV93YW5kLDAsc2l6ZW9mKCpjbG9uZV93YW5kKSk7CiAgIGNsb25lX3dhbmQtPmlkPUFjcXVpcmVXYW5kSWQoKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhjbG9uZV93YW5kLT5uYW1lLE1heFRleHRFeHRlbnQsIiVzLSVsdSIsCi0gICAgTWFnaWNrV2FuZElkLCh1bnNpZ25lZCBsb25nKSBjbG9uZV93YW5kLT5pZCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY2xvbmVfd2FuZC0+bmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lLjIwZyIsCisgICAgTWFnaWNrV2FuZElkLChkb3VibGUpIGNsb25lX3dhbmQtPmlkKTsKICAgY2xvbmVfd2FuZC0+ZXhjZXB0aW9uPUFjcXVpcmVFeGNlcHRpb25JbmZvKCk7CiAgIEluaGVyaXRFeGNlcHRpb24oY2xvbmVfd2FuZC0+ZXhjZXB0aW9uLHdhbmQtPmV4Y2VwdGlvbik7CiAgIGNsb25lX3dhbmQtPmltYWdlX2luZm89Q2xvbmVJbWFnZUluZm8od2FuZC0+aW1hZ2VfaW5mbyk7CmRpZmYgLS1naXQgYS93YW5kL2RyYXdpbmctd2FuZC5jIGIvd2FuZC9kcmF3aW5nLXdhbmQuYwppbmRleCA2YmU5ODczLi44ZWFhMDZmIDEwMDY0NAotLS0gYS93YW5kL2RyYXdpbmctd2FuZC5jCisrKyBiL3dhbmQvZHJhd2luZy13YW5kLmMKQEAgLTU2Miw4ICs1NjIsOCBAQAogICAgICAgIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiLEdldEV4Y2VwdGlvbk1lc3NhZ2UoZXJybm8pKTsKICAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KGNsb25lX3dhbmQsMCxzaXplb2YoKmNsb25lX3dhbmQpKTsKICAgY2xvbmVfd2FuZC0+aWQ9QWNxdWlyZVdhbmRJZCgpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGNsb25lX3dhbmQtPm5hbWUsTWF4VGV4dEV4dGVudCwiRHJhd2luZ1dhbmQtJWx1IiwKLSAgICAodW5zaWduZWQgbG9uZykgY2xvbmVfd2FuZC0+aWQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGNsb25lX3dhbmQtPm5hbWUsTWF4VGV4dEV4dGVudCwiRHJhd2luZ1dhbmQtJS4yMGciLAorICAgIChkb3VibGUpIGNsb25lX3dhbmQtPmlkKTsKICAgY2xvbmVfd2FuZC0+ZXhjZXB0aW9uPUFjcXVpcmVFeGNlcHRpb25JbmZvKCk7CiAgIEluaGVyaXRFeGNlcHRpb24oY2xvbmVfd2FuZC0+ZXhjZXB0aW9uLHdhbmQtPmV4Y2VwdGlvbik7CiAgIGNsb25lX3dhbmQtPm12Zz1BY3F1aXJlU3RyaW5nKHdhbmQtPm12Zyk7CkBAIC0xMDMzLDcgKzEwMzMsNyBAQAogICAgICAgY2hhcgogICAgICAgICBidWZmZXJbTWF4VGV4dEV4dGVudF07CiAKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoYnVmZmVyLE1heFRleHRFeHRlbnQsIiVsZCBieXRlcyIsCisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGJ1ZmZlcixNYXhUZXh0RXh0ZW50LCIlLjIwZyBieXRlcyIsKGRvdWJsZSkKICAgICAgICAgKDRMKmJsb2JfbGVuZ3RoLzNMKzRMKSk7CiAgICAgICBUaHJvd0RyYXdFeGNlcHRpb24oUmVzb3VyY2VMaW1pdFdhcm5pbmcsIk1lbW9yeUFsbG9jYXRpb25GYWlsZWQiLAogICAgICAgICB3YW5kLT5uYW1lKTsKQEAgLTI0NzEsNyArMjQ3MSw3IEBACiAgIGNoaWxkPUFkZENoaWxkVG9YTUxUcmVlKHhtbF9pbmZvLCJmb250LXdlaWdodCIsMCk7CiAgIGlmIChjaGlsZCAhPSAoWE1MVHJlZUluZm8gKikgTlVMTCkKICAgICB7Ci0gICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZhbHVlLE1heFRleHRFeHRlbnQsIiVsdSIsKHVuc2lnbmVkIGxvbmcpCisgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHZhbHVlLE1heFRleHRFeHRlbnQsIiUuMjBnIiwoZG91YmxlKQogICAgICAgICBDdXJyZW50Q29udGV4dC0+d2VpZ2h0KTsKICAgICAgICh2b2lkKSBTZXRYTUxUcmVlQ29udGVudChjaGlsZCx2YWx1ZSk7CiAgICAgfQpAQCAtMjU0NCw3ICsyNTQ0LDcgQEAKICAgY2hpbGQ9QWRkQ2hpbGRUb1hNTFRyZWUoeG1sX2luZm8sInN0cm9rZS1taXRlcmxpbWl0IiwwKTsKICAgaWYgKGNoaWxkICE9IChYTUxUcmVlSW5mbyAqKSBOVUxMKQogICAgIHsKLSAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJWx1IiwodW5zaWduZWQgbG9uZykKKyAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcodmFsdWUsTWF4VGV4dEV4dGVudCwiJS4yMGciLChkb3VibGUpCiAgICAgICAgIEN1cnJlbnRDb250ZXh0LT5taXRlcmxpbWl0KTsKICAgICAgICh2b2lkKSBTZXRYTUxUcmVlQ29udGVudChjaGlsZCx2YWx1ZSk7CiAgICAgfQpAQCAtNDAyNywxMCArNDAyNyw5IEBACiAgICAgfQogICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGtleSxNYXhUZXh0RXh0ZW50LCIlcyIsd2FuZC0+cGF0dGVybl9pZCk7CiAgICh2b2lkKSBTZXRJbWFnZUFydGlmYWN0KHdhbmQtPmltYWdlLGtleSx3YW5kLT5tdmcrd2FuZC0+cGF0dGVybl9vZmZzZXQpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkJStsZCIsCi0gICAgKHVuc2lnbmVkIGxvbmcpIHdhbmQtPnBhdHRlcm5fYm91bmRzLndpZHRoLCh1bnNpZ25lZCBsb25nKQotICAgIHdhbmQtPnBhdHRlcm5fYm91bmRzLmhlaWdodCwobG9uZykgd2FuZC0+cGF0dGVybl9ib3VuZHMueCwKLSAgICAobG9uZykgd2FuZC0+cGF0dGVybl9ib3VuZHMueSk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwKKyAgICAoZG91YmxlKSB3YW5kLT5wYXR0ZXJuX2JvdW5kcy53aWR0aCwoZG91YmxlKSB3YW5kLT5wYXR0ZXJuX2JvdW5kcy5oZWlnaHQsCisgICAgKGRvdWJsZSkgd2FuZC0+cGF0dGVybl9ib3VuZHMueCwoZG91YmxlKSB3YW5kLT5wYXR0ZXJuX2JvdW5kcy55KTsKICAgKHZvaWQpIFNldEltYWdlQXJ0aWZhY3Qod2FuZC0+aW1hZ2Usa2V5LGdlb21ldHJ5KTsKICAgd2FuZC0+cGF0dGVybl9pZD1EZXN0cm95U3RyaW5nKHdhbmQtPnBhdHRlcm5faWQpOwogICB3YW5kLT5wYXR0ZXJuX29mZnNldD0wOwpAQCAtNTEyNSw3ICs1MTI0LDcgQEAKICAgICAgIChDdXJyZW50Q29udGV4dC0+d2VpZ2h0ICE9IGZvbnRfd2VpZ2h0KSkKICAgICB7CiAgICAgICBDdXJyZW50Q29udGV4dC0+d2VpZ2h0PWZvbnRfd2VpZ2h0OwotICAgICAgKHZvaWQpIE12Z1ByaW50Zih3YW5kLCJmb250LXdlaWdodCAlbHVcbiIsKHVuc2lnbmVkIGxvbmcpIGZvbnRfd2VpZ2h0KTsKKyAgICAgICh2b2lkKSBNdmdQcmludGYod2FuZCwiZm9udC13ZWlnaHQgJS4yMGdcbiIsKGRvdWJsZSkgZm9udF93ZWlnaHQpOwogICAgIH0KIH0KIAwKQEAgLTU2MTAsOCArNTYwOSw3IEBACiAgIGlmIChDdXJyZW50Q29udGV4dC0+bWl0ZXJsaW1pdCAhPSBtaXRlcmxpbWl0KQogICAgIHsKICAgICAgIEN1cnJlbnRDb250ZXh0LT5taXRlcmxpbWl0PW1pdGVybGltaXQ7Ci0gICAgICAodm9pZCkgTXZnUHJpbnRmKHdhbmQsInN0cm9rZS1taXRlcmxpbWl0ICVsdVxuIiwodW5zaWduZWQgbG9uZykKLSAgICAgICAgbWl0ZXJsaW1pdCk7CisgICAgICAodm9pZCkgTXZnUHJpbnRmKHdhbmQsInN0cm9rZS1taXRlcmxpbWl0ICUuMjBnXG4iLChkb3VibGUpIG1pdGVybGltaXQpOwogICAgIH0KIH0KIAwKQEAgLTY1MTAsOCArNjUwOCw4IEBACiAgIGFzc2VydCh3YW5kLT5zaWduYXR1cmUgPT0gV2FuZFNpZ25hdHVyZSk7CiAgIGlmICh3YW5kLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoV2FuZEV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsd2FuZC0+bmFtZSk7Ci0gICh2b2lkKSBNdmdQcmludGYod2FuZCwidmlld2JveCAlbGQgJWxkICVsZCAlbGRcbiIsKGxvbmcpIHgxLChsb25nKSB5MSwKLSAgICAobG9uZykgeDIsKGxvbmcpIHkyKTsKKyAgKHZvaWQpIE12Z1ByaW50Zih3YW5kLCJ2aWV3Ym94ICUuMjBnICUuMjBnICUuMjBnICUuMjBnXG4iLChkb3VibGUpIHgxLAorICAgIChkb3VibGUpIHkxLChkb3VibGUpIHgyLChkb3VibGUpIHkyKTsKIH0KIAwKIC8qCkBAIC02NTg2LDggKzY1ODQsOCBAQAogICAgICAgR2V0RXhjZXB0aW9uTWVzc2FnZShlcnJubykpOwogICAodm9pZCkgUmVzZXRNYWdpY2tNZW1vcnkod2FuZCwwLHNpemVvZigqd2FuZCkpOwogICB3YW5kLT5pZD1BY3F1aXJlV2FuZElkKCk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcod2FuZC0+bmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lbHUiLERyYXdpbmdXYW5kSWQsCi0gICAgKHVuc2lnbmVkIGxvbmcpIHdhbmQtPmlkKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh3YW5kLT5uYW1lLE1heFRleHRFeHRlbnQsIiVzLSUuMjBnIixEcmF3aW5nV2FuZElkLAorICAgIChkb3VibGUpIHdhbmQtPmlkKTsKICAgaWYgKHdhbmQtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChXYW5kRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIix3YW5kLT5uYW1lKTsKICAgd2FuZC0+bXZnPShjaGFyICopIE5VTEw7CmRpZmYgLS1naXQgYS93YW5kL21hZ2ljay1pbWFnZS5jIGIvd2FuZC9tYWdpY2staW1hZ2UuYwppbmRleCBkMTY3MTY2Li4zMTUxZGJhIDEwMDY0NAotLS0gYS93YW5kL21hZ2ljay1pbWFnZS5jCisrKyBiL3dhbmQvbWFnaWNrLWltYWdlLmMKQEAgLTEwNSw4ICsxMDUsOCBAQAogICAgICAgaW1hZ2VzLT5maWxlbmFtZSk7CiAgICh2b2lkKSBSZXNldE1hZ2lja01lbW9yeShjbG9uZV93YW5kLDAsc2l6ZW9mKCpjbG9uZV93YW5kKSk7CiAgIGNsb25lX3dhbmQtPmlkPUFjcXVpcmVXYW5kSWQoKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhjbG9uZV93YW5kLT5uYW1lLE1heFRleHRFeHRlbnQsIiVzLSVsdSIsCi0gICAgTWFnaWNrV2FuZElkLCh1bnNpZ25lZCBsb25nKSBjbG9uZV93YW5kLT5pZCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY2xvbmVfd2FuZC0+bmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lLjIwZyIsCisgICAgTWFnaWNrV2FuZElkLChkb3VibGUpIGNsb25lX3dhbmQtPmlkKTsKICAgY2xvbmVfd2FuZC0+ZXhjZXB0aW9uPUFjcXVpcmVFeGNlcHRpb25JbmZvKCk7CiAgIEluaGVyaXRFeGNlcHRpb24oY2xvbmVfd2FuZC0+ZXhjZXB0aW9uLHdhbmQtPmV4Y2VwdGlvbik7CiAgIGNsb25lX3dhbmQtPmltYWdlX2luZm89Q2xvbmVJbWFnZUluZm8od2FuZC0+aW1hZ2VfaW5mbyk7CmRpZmYgLS1naXQgYS93YW5kL21hZ2ljay1wcm9wZXJ0eS5jIGIvd2FuZC9tYWdpY2stcHJvcGVydHkuYwppbmRleCAwZWJmZGIwLi5iNmQ3OWYzIDEwMDY0NAotLS0gYS93YW5kL21hZ2ljay1wcm9wZXJ0eS5jCisrKyBiL3dhbmQvbWFnaWNrLXByb3BlcnR5LmMKQEAgLTI1MDMsOCArMjUwMyw4IEBACiAgIGFzc2VydCh3YW5kLT5zaWduYXR1cmUgPT0gV2FuZFNpZ25hdHVyZSk7CiAgIGlmICh3YW5kLT5kZWJ1ZyAhPSBNYWdpY2tGYWxzZSkKICAgICAodm9pZCkgTG9nTWFnaWNrRXZlbnQoV2FuZEV2ZW50LEdldE1hZ2lja01vZHVsZSgpLCIlcyIsd2FuZC0+bmFtZSk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJWx1eCVsdSUrbGQlK2xkIiwKLSAgICAodW5zaWduZWQgbG9uZykgd2lkdGgsKHVuc2lnbmVkIGxvbmcpIGhlaWdodCwobG9uZykgeCwobG9uZykgeSk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZ2VvbWV0cnksTWF4VGV4dEV4dGVudCwiJS4yMGd4JS4yMGclKy4yMGd4JSsuMjBnIiwKKyAgICAoZG91YmxlKSB3aWR0aCwoZG91YmxlKSBoZWlnaHQsKGRvdWJsZSkgeCwoZG91YmxlKSB5KTsKICAgKHZvaWQpIENsb25lU3RyaW5nKCZ3YW5kLT5pbWFnZV9pbmZvLT5wYWdlLGdlb21ldHJ5KTsKICAgcmV0dXJuKE1hZ2lja1RydWUpOwogfQpAQCAtMjgwNiw4ICsyODA2LDggQEAKICAgYXNzZXJ0KHdhbmQtPnNpZ25hdHVyZSA9PSBXYW5kU2lnbmF0dXJlKTsKICAgaWYgKHdhbmQtPmRlYnVnICE9IE1hZ2lja0ZhbHNlKQogICAgICh2b2lkKSBMb2dNYWdpY2tFdmVudChXYW5kRXZlbnQsR2V0TWFnaWNrTW9kdWxlKCksIiVzIix3YW5kLT5uYW1lKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlbHV4JWx1IiwodW5zaWduZWQgbG9uZykKLSAgICBjb2x1bW5zLCh1bnNpZ25lZCBsb25nKSByb3dzKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyIsKGRvdWJsZSkKKyAgICBjb2x1bW5zLChkb3VibGUpIHJvd3MpOwogICAodm9pZCkgQ2xvbmVTdHJpbmcoJndhbmQtPmltYWdlX2luZm8tPnNpemUsZ2VvbWV0cnkpOwogICByZXR1cm4oTWFnaWNrVHJ1ZSk7CiB9CkBAIC0yODUzLDggKzI4NTMsOCBAQAogICBhc3NlcnQod2FuZC0+c2lnbmF0dXJlID09IFdhbmRTaWduYXR1cmUpOwogICBpZiAod2FuZC0+ZGVidWcgIT0gTWFnaWNrRmFsc2UpCiAgICAgKHZvaWQpIExvZ01hZ2lja0V2ZW50KFdhbmRFdmVudCxHZXRNYWdpY2tNb2R1bGUoKSwiJXMiLHdhbmQtPm5hbWUpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGdlb21ldHJ5LE1heFRleHRFeHRlbnQsIiVsdXglbHUlK2xkIiwKLSAgICAodW5zaWduZWQgbG9uZykgY29sdW1ucywodW5zaWduZWQgbG9uZykgcm93cywobG9uZykgb2Zmc2V0KTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhnZW9tZXRyeSxNYXhUZXh0RXh0ZW50LCIlLjIwZ3glLjIwZyUrLjIwZyIsCisgICAgKGRvdWJsZSkgY29sdW1ucywoZG91YmxlKSByb3dzLChkb3VibGUpIG9mZnNldCk7CiAgICh2b2lkKSBDbG9uZVN0cmluZygmd2FuZC0+aW1hZ2VfaW5mby0+c2l6ZSxnZW9tZXRyeSk7CiAgIHJldHVybihNYWdpY2tUcnVlKTsKIH0KZGlmZiAtLWdpdCBhL3dhbmQvbWFnaWNrLXdhbmQuYyBiL3dhbmQvbWFnaWNrLXdhbmQuYwppbmRleCBhMTg2ZWQzLi5lYTllZTg2IDEwMDY0NAotLS0gYS93YW5kL21hZ2ljay13YW5kLmMKKysrIGIvd2FuZC9tYWdpY2std2FuZC5jCkBAIC0xMzUsOCArMTM1LDggQEAKICAgICAgIHdhbmQtPm5hbWUpOwogICAodm9pZCkgUmVzZXRNYWdpY2tNZW1vcnkoY2xvbmVfd2FuZCwwLHNpemVvZigqY2xvbmVfd2FuZCkpOwogICBjbG9uZV93YW5kLT5pZD1BY3F1aXJlV2FuZElkKCk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY2xvbmVfd2FuZC0+bmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lbHUiLAotICAgIE1hZ2lja1dhbmRJZCwodW5zaWduZWQgbG9uZykgY2xvbmVfd2FuZC0+aWQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGNsb25lX3dhbmQtPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJS4yMGciLAorICAgIE1hZ2lja1dhbmRJZCwoZG91YmxlKSBjbG9uZV93YW5kLT5pZCk7CiAgIGNsb25lX3dhbmQtPmV4Y2VwdGlvbj1BY3F1aXJlRXhjZXB0aW9uSW5mbygpOwogICBJbmhlcml0RXhjZXB0aW9uKGNsb25lX3dhbmQtPmV4Y2VwdGlvbix3YW5kLT5leGNlcHRpb24pOwogICBjbG9uZV93YW5kLT5pbWFnZV9pbmZvPUNsb25lSW1hZ2VJbmZvKHdhbmQtPmltYWdlX2luZm8pOwpAQCAtMTAzNCw4ICsxMDM0LDggQEAKICAgICAgIEdldEV4Y2VwdGlvbk1lc3NhZ2UoZXJybm8pKTsKICAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KHdhbmQsMCxzaXplb2YoKndhbmQpKTsKICAgd2FuZC0+aWQ9QWNxdWlyZVdhbmRJZCgpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHdhbmQtPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJWx1IixNYWdpY2tXYW5kSWQsCi0gICAgKHVuc2lnbmVkIGxvbmcpIHdhbmQtPmlkKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyh3YW5kLT5uYW1lLE1heFRleHRFeHRlbnQsIiVzLSUuMjBnIixNYWdpY2tXYW5kSWQsCisgICAgKGRvdWJsZSkgd2FuZC0+aWQpOwogICB3YW5kLT5leGNlcHRpb249QWNxdWlyZUV4Y2VwdGlvbkluZm8oKTsKICAgd2FuZC0+aW1hZ2VfaW5mbz1BY3F1aXJlSW1hZ2VJbmZvKCk7CiAgIHdhbmQtPnF1YW50aXplX2luZm89Q2xvbmVRdWFudGl6ZUluZm8oKFF1YW50aXplSW5mbyAqKSBOVUxMKTsKZGlmZiAtLWdpdCBhL3dhbmQvbW9ncmlmeS5jIGIvd2FuZC9tb2dyaWZ5LmMKaW5kZXggMzg3NDMxNy4uNmE0MjBjNyAxMDA2NDQKLS0tIGEvd2FuZC9tb2dyaWZ5LmMKKysrIGIvd2FuZC9tb2dyaWZ5LmMKQEAgLTIyMCwxMCArMjIwLDEwIEBACiAgICAgICBlbGFwc2VkX3RpbWU9R2V0RWxhcHNlZFRpbWUodGltZXIpOwogICAgICAgdXNlcl90aW1lPUdldFVzZXJUaW1lKHRpbWVyKTsKICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgIlBlcmZvcm1hbmNlOiAlbHVpICVnaXBzICUwLjNmdSAlbGQ6JTAybGQuJTAzbGRcbiIsKHVuc2lnbmVkIGxvbmcpCi0gICAgICAgIGl0ZXJhdGlvbnMsMS4wKml0ZXJhdGlvbnMvZWxhcHNlZF90aW1lLHVzZXJfdGltZSwobG9uZykKLSAgICAgICAgKGVsYXBzZWRfdGltZS82MC4wKSwobG9uZykgZmxvb3IoZm1vZChlbGFwc2VkX3RpbWUsNjAuMCkpLAotICAgICAgICAobG9uZykgKDEwMDAuMCooZWxhcHNlZF90aW1lLWZsb29yKGVsYXBzZWRfdGltZSkpKSk7CisgICAgICAgICJQZXJmb3JtYW5jZTogJS4yMGdpICVnaXBzICUwLjNmdSAlLjIwZzolMDJnLiUwM2dcbiIsKGRvdWJsZSkKKyAgICAgICAgaXRlcmF0aW9ucywxLjAqaXRlcmF0aW9ucy9lbGFwc2VkX3RpbWUsdXNlcl90aW1lLChkb3VibGUpCisgICAgICAgIChlbGFwc2VkX3RpbWUvNjAuMCksZmxvb3IoZm1vZChlbGFwc2VkX3RpbWUsNjAuMCkpLChkb3VibGUpCisgICAgICAgICgxMDAwLjAqKGVsYXBzZWRfdGltZS1mbG9vcihlbGFwc2VkX3RpbWUpKSkpOwogICAgIH0KICAgdGltZXI9RGVzdHJveVRpbWVySW5mbyh0aW1lcik7CiAgIHJldHVybihzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvd2FuZC9tb250YWdlLmMgYi93YW5kL21vbnRhZ2UuYwppbmRleCAzM2YzMjE5Li5iZjk4ZGYyIDEwMDY0NAotLS0gYS93YW5kL21vbnRhZ2UuYworKysgYi93YW5kL21vbnRhZ2UuYwpAQCAtNDA3LDggKzQwNyw4IEBACiAgICAgICAgICAgICAgICh2b2lkKSBJbnRlcnByZXRJbWFnZUZpbGVuYW1lKGltYWdlX2luZm8sKEltYWdlICopIE5VTEwsCiAgICAgICAgICAgICAgICAgaW1hZ2VfaW5mby0+ZmlsZW5hbWUsKGludCkgc2NlbmUsZmlsZW5hbWUpOwogICAgICAgICAgICAgICBpZiAoTG9jYWxlQ29tcGFyZShmaWxlbmFtZSxpbWFnZV9pbmZvLT5maWxlbmFtZSkgPT0gMCkKLSAgICAgICAgICAgICAgICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGZpbGVuYW1lLE1heFRleHRFeHRlbnQsIiVzLiVsdSIsCi0gICAgICAgICAgICAgICAgICBpbWFnZV9pbmZvLT5maWxlbmFtZSwodW5zaWduZWQgbG9uZykgc2NlbmUpOworICAgICAgICAgICAgICAgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoZmlsZW5hbWUsTWF4VGV4dEV4dGVudCwiJXMuJS4yMGciLAorICAgICAgICAgICAgICAgICAgaW1hZ2VfaW5mby0+ZmlsZW5hbWUsKGRvdWJsZSkgc2NlbmUpOwogICAgICAgICAgICAgICAodm9pZCkgQ29weU1hZ2lja1N0cmluZyhpbWFnZV9pbmZvLT5maWxlbmFtZSxmaWxlbmFtZSwKICAgICAgICAgICAgICAgICBNYXhUZXh0RXh0ZW50KTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3dhbmQvcGl4ZWwtaXRlcmF0b3IuYyBiL3dhbmQvcGl4ZWwtaXRlcmF0b3IuYwppbmRleCAzYThmMDBlLi4xYTY4Y2ZhIDEwMDY0NAotLS0gYS93YW5kL3BpeGVsLWl0ZXJhdG9yLmMKKysrIGIvd2FuZC9waXhlbC1pdGVyYXRvci5jCkBAIC0xNjksOCArMTY5LDggQEAKICAgICAgIGl0ZXJhdG9yLT5uYW1lKTsKICAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KGNsb25lX2l0ZXJhdG9yLDAsc2l6ZW9mKCpjbG9uZV9pdGVyYXRvcikpOwogICBjbG9uZV9pdGVyYXRvci0+aWQ9QWNxdWlyZVdhbmRJZCgpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGNsb25lX2l0ZXJhdG9yLT5uYW1lLE1heFRleHRFeHRlbnQsIiVzLSVsdSIsCi0gICAgUGl4ZWxJdGVyYXRvcklkLCh1bnNpZ25lZCBsb25nKSBjbG9uZV9pdGVyYXRvci0+aWQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGNsb25lX2l0ZXJhdG9yLT5uYW1lLE1heFRleHRFeHRlbnQsIiVzLSUuMjBnIiwKKyAgICBQaXhlbEl0ZXJhdG9ySWQsKGRvdWJsZSkgY2xvbmVfaXRlcmF0b3ItPmlkKTsKICAgY2xvbmVfaXRlcmF0b3ItPmV4Y2VwdGlvbj1BY3F1aXJlRXhjZXB0aW9uSW5mbygpOwogICBJbmhlcml0RXhjZXB0aW9uKGNsb25lX2l0ZXJhdG9yLT5leGNlcHRpb24saXRlcmF0b3ItPmV4Y2VwdGlvbik7CiAgIGNsb25lX2l0ZXJhdG9yLT52aWV3PUNsb25lQ2FjaGVWaWV3KGl0ZXJhdG9yLT52aWV3KTsKQEAgLTMxOSw4ICszMTksOCBAQAogICAgICAgR2V0RXhjZXB0aW9uTWVzc2FnZShlcnJubykpOwogICAodm9pZCkgUmVzZXRNYWdpY2tNZW1vcnkoaXRlcmF0b3IsMCxzaXplb2YoKml0ZXJhdG9yKSk7CiAgIGl0ZXJhdG9yLT5pZD1BY3F1aXJlV2FuZElkKCk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoaXRlcmF0b3ItPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJWx1IiwKLSAgICBQaXhlbEl0ZXJhdG9ySWQsKHVuc2lnbmVkIGxvbmcpIGl0ZXJhdG9yLT5pZCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoaXRlcmF0b3ItPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJS4yMGciLAorICAgIFBpeGVsSXRlcmF0b3JJZCwoZG91YmxlKSBpdGVyYXRvci0+aWQpOwogICBpdGVyYXRvci0+ZXhjZXB0aW9uPUFjcXVpcmVFeGNlcHRpb25JbmZvKCk7CiAgIGl0ZXJhdG9yLT52aWV3PXZpZXc7CiAgIFNldEdlb21ldHJ5KGltYWdlLCZpdGVyYXRvci0+cmVnaW9uKTsKQEAgLTQzNCw4ICs0MzQsOCBAQAogICAgICAgd2FuZC0+bmFtZSk7CiAgICh2b2lkKSBSZXNldE1hZ2lja01lbW9yeShpdGVyYXRvciwwLHNpemVvZigqaXRlcmF0b3IpKTsKICAgaXRlcmF0b3ItPmlkPUFjcXVpcmVXYW5kSWQoKTsKLSAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhpdGVyYXRvci0+bmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lbHUiLAotICAgIFBpeGVsSXRlcmF0b3JJZCwodW5zaWduZWQgbG9uZykgaXRlcmF0b3ItPmlkKTsKKyAgKHZvaWQpIEZvcm1hdE1hZ2lja1N0cmluZyhpdGVyYXRvci0+bmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lLjIwZyIsCisgICAgUGl4ZWxJdGVyYXRvcklkLChkb3VibGUpIGl0ZXJhdG9yLT5pZCk7CiAgIGl0ZXJhdG9yLT5leGNlcHRpb249QWNxdWlyZUV4Y2VwdGlvbkluZm8oKTsKICAgaXRlcmF0b3ItPnZpZXc9dmlldzsKICAgU2V0R2VvbWV0cnkoaW1hZ2UsJml0ZXJhdG9yLT5yZWdpb24pOwpkaWZmIC0tZ2l0IGEvd2FuZC9waXhlbC12aWV3LmMgYi93YW5kL3BpeGVsLXZpZXcuYwppbmRleCA5M2ZmNWZiLi5jNjM2MjliIDEwMDY0NAotLS0gYS93YW5kL3BpeGVsLXZpZXcuYworKysgYi93YW5kL3BpeGVsLXZpZXcuYwpAQCAtMTMzLDggKzEzMyw4IEBACiAgICAgICBwaXhlbF92aWV3LT5uYW1lKTsKICAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KGNsb25lX3ZpZXcsMCxzaXplb2YoKmNsb25lX3ZpZXcpKTsKICAgY2xvbmVfdmlldy0+aWQ9QWNxdWlyZVdhbmRJZCgpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGNsb25lX3ZpZXctPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJWx1IixQaXhlbFZpZXdJZCwKLSAgICAodW5zaWduZWQgbG9uZykgY2xvbmVfdmlldy0+aWQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKGNsb25lX3ZpZXctPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJS4yMGciLAorICAgIFBpeGVsVmlld0lkLChkb3VibGUpIGNsb25lX3ZpZXctPmlkKTsKICAgY2xvbmVfdmlldy0+ZXhjZXB0aW9uPUFjcXVpcmVFeGNlcHRpb25JbmZvKCk7CiAgIEluaGVyaXRFeGNlcHRpb24oY2xvbmVfdmlldy0+ZXhjZXB0aW9uLHBpeGVsX3ZpZXctPmV4Y2VwdGlvbik7CiAgIGNsb25lX3ZpZXctPnZpZXc9Q2xvbmVDYWNoZVZpZXcocGl4ZWxfdmlldy0+dmlldyk7CkBAIC04NDgsOCArODQ4LDggQEAKICAgICAgIEdldEV4Y2VwdGlvbk1lc3NhZ2UoZXJybm8pKTsKICAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KHBpeGVsX3ZpZXcsMCxzaXplb2YoKnBpeGVsX3ZpZXcpKTsKICAgcGl4ZWxfdmlldy0+aWQ9QWNxdWlyZVdhbmRJZCgpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBpeGVsX3ZpZXctPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJWx1IiwKLSAgICBQaXhlbFZpZXdJZCwodW5zaWduZWQgbG9uZykgcGl4ZWxfdmlldy0+aWQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBpeGVsX3ZpZXctPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJS4yMGciLAorICAgIFBpeGVsVmlld0lkLChkb3VibGUpIHBpeGVsX3ZpZXctPmlkKTsKICAgcGl4ZWxfdmlldy0+ZXhjZXB0aW9uPUFjcXVpcmVFeGNlcHRpb25JbmZvKCk7CiAgIHBpeGVsX3ZpZXctPndhbmQ9d2FuZDsKICAgcGl4ZWxfdmlldy0+dmlldz1BY3F1aXJlQ2FjaGVWaWV3KHBpeGVsX3ZpZXctPndhbmQtPmltYWdlcyk7CkBAIC05MDcsOCArOTA3LDggQEAKICAgICAgIEdldEV4Y2VwdGlvbk1lc3NhZ2UoZXJybm8pKTsKICAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KHBpeGVsX3ZpZXcsMCxzaXplb2YoKnBpeGVsX3ZpZXcpKTsKICAgcGl4ZWxfdmlldy0+aWQ9QWNxdWlyZVdhbmRJZCgpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBpeGVsX3ZpZXctPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJWx1IiwKLSAgICBQaXhlbFZpZXdJZCwodW5zaWduZWQgbG9uZykgcGl4ZWxfdmlldy0+aWQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHBpeGVsX3ZpZXctPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJS4yMGciLAorICAgIFBpeGVsVmlld0lkLChkb3VibGUpIHBpeGVsX3ZpZXctPmlkKTsKICAgcGl4ZWxfdmlldy0+ZXhjZXB0aW9uPUFjcXVpcmVFeGNlcHRpb25JbmZvKCk7CiAgIHBpeGVsX3ZpZXctPnZpZXc9QWNxdWlyZUNhY2hlVmlldyhwaXhlbF92aWV3LT53YW5kLT5pbWFnZXMpOwogICBwaXhlbF92aWV3LT53YW5kPXdhbmQ7CmRpZmYgLS1naXQgYS93YW5kL3BpeGVsLXdhbmQuYyBiL3dhbmQvcGl4ZWwtd2FuZC5jCmluZGV4IDFiOTJiY2YuLjg2MjcwNGUgMTAwNjQ0Ci0tLSBhL3dhbmQvcGl4ZWwtd2FuZC5jCisrKyBiL3dhbmQvcGl4ZWwtd2FuZC5jCkBAIC0xNTQsOCArMTU0LDggQEAKICAgICAgIHdhbmQtPm5hbWUpOwogICAodm9pZCkgUmVzZXRNYWdpY2tNZW1vcnkoY2xvbmVfd2FuZCwwLHNpemVvZigqY2xvbmVfd2FuZCkpOwogICBjbG9uZV93YW5kLT5pZD1BY3F1aXJlV2FuZElkKCk7Ci0gICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY2xvbmVfd2FuZC0+bmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lbHUiLFBpeGVsV2FuZElkLAotICAgICh1bnNpZ25lZCBsb25nKSBjbG9uZV93YW5kLT5pZCk7CisgICh2b2lkKSBGb3JtYXRNYWdpY2tTdHJpbmcoY2xvbmVfd2FuZC0+bmFtZSxNYXhUZXh0RXh0ZW50LCIlcy0lLjIwZyIsCisgICAgUGl4ZWxXYW5kSWQsKGRvdWJsZSkgY2xvbmVfd2FuZC0+aWQpOwogICBjbG9uZV93YW5kLT5leGNlcHRpb249QWNxdWlyZUV4Y2VwdGlvbkluZm8oKTsKICAgSW5oZXJpdEV4Y2VwdGlvbihjbG9uZV93YW5kLT5leGNlcHRpb24sd2FuZC0+ZXhjZXB0aW9uKTsKICAgY2xvbmVfd2FuZC0+cGl4ZWw9d2FuZC0+cGl4ZWw7CkBAIC00MDYsOCArNDA2LDggQEAKICAgICAgIEdldEV4Y2VwdGlvbk1lc3NhZ2UoZXJybm8pKTsKICAgKHZvaWQpIFJlc2V0TWFnaWNrTWVtb3J5KHdhbmQsMCxzaXplb2YoKndhbmQpKTsKICAgd2FuZC0+aWQ9QWNxdWlyZVdhbmRJZCgpOwotICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHdhbmQtPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJWx1IixQaXhlbFdhbmRJZCwKLSAgICAodW5zaWduZWQgbG9uZykgd2FuZC0+aWQpOworICAodm9pZCkgRm9ybWF0TWFnaWNrU3RyaW5nKHdhbmQtPm5hbWUsTWF4VGV4dEV4dGVudCwiJXMtJS4yMGciLFBpeGVsV2FuZElkLAorICAgIChkb3VibGUpIHdhbmQtPmlkKTsKICAgd2FuZC0+ZXhjZXB0aW9uPUFjcXVpcmVFeGNlcHRpb25JbmZvKCk7CiAgIEdldE1hZ2lja1BpeGVsUGFja2V0KChJbWFnZSAqKSBOVUxMLCZ3YW5kLT5waXhlbCk7CiAgIHdhbmQtPmRlYnVnPUlzRXZlbnRMb2dnaW5nKCk7CmRpZmYgLS1naXQgYS93YW5kL3dhbmR0ZXN0LmMgYi93YW5kL3dhbmR0ZXN0LmMKaW5kZXggMjUzNWIwYi4uOWFjNTVjNyAxMDA2NDQKLS0tIGEvd2FuZC93YW5kdGVzdC5jCisrKyBiL3dhbmQvd2FuZHRlc3QuYwpAQCAtNDQ3LDE4ICs0NDcsMTggQEAKICAgaWYgKHN0YXR1cyA9PSBNYWdpY2tGYWxzZSkKICAgICBUaHJvd0FQSUV4Y2VwdGlvbihtYWdpY2tfd2FuZCk7CiAgIGlmIChNYWdpY2tHZXROdW1iZXJJbWFnZXMobWFnaWNrX3dhbmQpICE9IDUpCi0gICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLCJyZWFkICVsdSBpbWFnZXM7IGV4cGVjdGVkIDVcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZykgTWFnaWNrR2V0TnVtYmVySW1hZ2VzKG1hZ2lja193YW5kKSk7CisgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLCJyZWFkICUuMjBnIGltYWdlczsgZXhwZWN0ZWQgNVxuIiwKKyAgICAgIChkb3VibGUpIE1hZ2lja0dldE51bWJlckltYWdlcyhtYWdpY2tfd2FuZCkpOwogICAodm9pZCkgZnByaW50ZihzdGRvdXQsIkl0ZXJhdGUgZm9yd2FyZC4uLlxuIik7CiAgIE1hZ2lja1Jlc2V0SXRlcmF0b3IobWFnaWNrX3dhbmQpOwogICB3aGlsZSAoTWFnaWNrTmV4dEltYWdlKG1hZ2lja193YW5kKSAhPSBNYWdpY2tGYWxzZSkKLSAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsImluZGV4ICVsZCBzY2VuZSAlbHVcbiIsKGxvbmcpCi0gICAgICBNYWdpY2tHZXRJdGVyYXRvckluZGV4KG1hZ2lja193YW5kKSwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsImluZGV4ICUuMjBnIHNjZW5lICUuMjBnXG4iLChkb3VibGUpCisgICAgICBNYWdpY2tHZXRJdGVyYXRvckluZGV4KG1hZ2lja193YW5kKSwoZG91YmxlKQogICAgICAgTWFnaWNrR2V0SW1hZ2VTY2VuZShtYWdpY2tfd2FuZCkpOwogICAodm9pZCkgZnByaW50ZihzdGRvdXQsIkl0ZXJhdGUgcmV2ZXJzZS4uLlxuIik7CiAgIHdoaWxlIChNYWdpY2tQcmV2aW91c0ltYWdlKG1hZ2lja193YW5kKSAhPSBNYWdpY2tGYWxzZSkKLSAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsImluZGV4ICVsZCBzY2VuZSAlbHVcbiIsKGxvbmcpCi0gICAgICBNYWdpY2tHZXRJdGVyYXRvckluZGV4KG1hZ2lja193YW5kKSwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsImluZGV4ICUuMjBnIHNjZW5lICUuMjBnXG4iLChkb3VibGUpCisgICAgICBNYWdpY2tHZXRJdGVyYXRvckluZGV4KG1hZ2lja193YW5kKSwoZG91YmxlKQogICAgICAgTWFnaWNrR2V0SW1hZ2VTY2VuZShtYWdpY2tfd2FuZCkpOwogICAodm9pZCkgZnByaW50ZihzdGRvdXQsIlJlbW92ZSBzY2VuZSAxLi4uXG4iKTsKICAgKHZvaWQpIE1hZ2lja1NldEl0ZXJhdG9ySW5kZXgobWFnaWNrX3dhbmQsMSk7CkBAIC00NjgsOCArNDY4LDggQEAKICAgICBUaHJvd0FQSUV4Y2VwdGlvbihtYWdpY2tfd2FuZCk7CiAgIE1hZ2lja1Jlc2V0SXRlcmF0b3IobWFnaWNrX3dhbmQpOwogICB3aGlsZSAoTWFnaWNrTmV4dEltYWdlKG1hZ2lja193YW5kKSAhPSBNYWdpY2tGYWxzZSkKLSAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsImluZGV4ICVsZCBzY2VuZSAlbHVcbiIsKGxvbmcpCi0gICAgICBNYWdpY2tHZXRJdGVyYXRvckluZGV4KG1hZ2lja193YW5kKSwodW5zaWduZWQgbG9uZykKKyAgICAodm9pZCkgZnByaW50ZihzdGRvdXQsImluZGV4ICUuMjBnIHNjZW5lICUuMjBnXG4iLChkb3VibGUpCisgICAgICBNYWdpY2tHZXRJdGVyYXRvckluZGV4KG1hZ2lja193YW5kKSwoZG91YmxlKQogICAgICAgTWFnaWNrR2V0SW1hZ2VTY2VuZShtYWdpY2tfd2FuZCkpOwogICAodm9pZCkgZnByaW50ZihzdGRvdXQsIkluc2VydCBzY2VuZSAxIGJhY2sgaW4gc2VxdWVuY2UuLi5cbiIpOwogICAodm9pZCkgTWFnaWNrU2V0SXRlcmF0b3JJbmRleChtYWdpY2tfd2FuZCwwKTsKQEAgLTQ3OCw4ICs0NzgsOCBAQAogICAgIFRocm93QVBJRXhjZXB0aW9uKG1hZ2lja193YW5kKTsKICAgTWFnaWNrUmVzZXRJdGVyYXRvcihtYWdpY2tfd2FuZCk7CiAgIHdoaWxlIChNYWdpY2tOZXh0SW1hZ2UobWFnaWNrX3dhbmQpICE9IE1hZ2lja0ZhbHNlKQotICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiaW5kZXggJWxkIHNjZW5lICVsdVxuIiwobG9uZykKLSAgICAgIE1hZ2lja0dldEl0ZXJhdG9ySW5kZXgobWFnaWNrX3dhbmQpLCh1bnNpZ25lZCBsb25nKQorICAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiaW5kZXggJS4yMGcgc2NlbmUgJS4yMGdcbiIsKGRvdWJsZSkKKyAgICAgIE1hZ2lja0dldEl0ZXJhdG9ySW5kZXgobWFnaWNrX3dhbmQpLChkb3VibGUpCiAgICAgICBNYWdpY2tHZXRJbWFnZVNjZW5lKG1hZ2lja193YW5kKSk7CiAgICh2b2lkKSBmcHJpbnRmKHN0ZG91dCwiU2V0IHNjZW5lIDIgdG8gc2NlbmUgMS4uLlxuIik7CiAgICh2b2lkKSBNYWdpY2tTZXRJdGVyYXRvckluZGV4KG1hZ2lja193YW5kLDIpOwpAQCAtNDg5LDggKzQ4OSw4IEBACiAgICAgVGhyb3dBUElFeGNlcHRpb24obWFnaWNrX3dhbmQpOwogICBNYWdpY2tSZXNldEl0ZXJhdG9yKG1hZ2lja193YW5kKTsKICAgd2hpbGUgKE1hZ2lja05leHRJbWFnZShtYWdpY2tfd2FuZCkgIT0gTWFnaWNrRmFsc2UpCi0gICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCJpbmRleCAlbGQgc2NlbmUgJWx1XG4iLChsb25nKQotICAgICAgTWFnaWNrR2V0SXRlcmF0b3JJbmRleChtYWdpY2tfd2FuZCksKHVuc2lnbmVkIGxvbmcpCisgICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCJpbmRleCAlLjIwZyBzY2VuZSAlLjIwZ1xuIiwoZG91YmxlKQorICAgICAgTWFnaWNrR2V0SXRlcmF0b3JJbmRleChtYWdpY2tfd2FuZCksKGRvdWJsZSkKICAgICAgIE1hZ2lja0dldEltYWdlU2NlbmUobWFnaWNrX3dhbmQpKTsKICAgKHZvaWQpIGZwcmludGYoc3Rkb3V0LCJBcHBseSBpbWFnZSBwcm9jZXNzaW5nIG9wdGlvbnMuLi5cbiIpOwogICBzdGF0dXM9TWFnaWNrQ3JvcEltYWdlKG1hZ2lja193YW5kLDYwLDYwLDEwLDEwKTsK