ZGlmZiAtLWdpdCBhL2NvbnZlcnNhdGlvbml0ZW1kZWxlZ2F0ZS5jcHAgYi9jb252ZXJzYXRpb25pdGVtZGVsZWdhdGUuY3BwCmluZGV4IDhkZTlhZGIuLmY1MzI2ZjQgMTAwNjQ0Ci0tLSBhL2NvbnZlcnNhdGlvbml0ZW1kZWxlZ2F0ZS5jcHAKKysrIGIvY29udmVyc2F0aW9uaXRlbWRlbGVnYXRlLmNwcApAQCAtNjEsMTYgKzYxLDIxIEBACiAKICAgICAvLyBPbmUgZG9lcyBub3Qgc2ltcGx5IGtlZXAgdGhlIGhpZ2hsaWdodGVkIHN0YXRlIGRyYXduIHdoZW4gdGhlIGNvbnRleHQKICAgICAvLyBtZW51IGlzIG9wZW6FCisgICAgUUNvbG9yIHByZXNlbmNlQm9yZGVyQ29sb3IgPSBRdDo6d2hpdGU7CiAgICAgYXV0byByb3dIaWdobGlnaHQgPSBoaWdobGlnaHRNYXBfLmZpbmQoaW5kZXgucm93KCkpOwogICAgIGlmIChzZWxlY3RlZCkgewogICAgICAgIHBhaW50ZXItPmZpbGxSZWN0KG9wdGlvbi5yZWN0LCBSaW5nVGhlbWU6OnNtYXJ0bGlzdFNlbGVjdGlvbl8pOworICAgICAgIHByZXNlbmNlQm9yZGVyQ29sb3IgPSBSaW5nVGhlbWU6OnNtYXJ0bGlzdFNlbGVjdGlvbl87CiAgICAgfSBlbHNlIGlmIChyb3dIaWdobGlnaHQgIT0gaGlnaGxpZ2h0TWFwXy5lbmQoKSAmJiAoKnJvd0hpZ2hsaWdodCkuc2Vjb25kKSB7CiAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3Qob3B0aW9uLnJlY3QsIFJpbmdUaGVtZTo6c21hcnRsaXN0SGlnaGxpZ2h0Xyk7CisgICAgICAgcHJlc2VuY2VCb3JkZXJDb2xvciA9IFJpbmdUaGVtZTo6c21hcnRsaXN0SGlnaGxpZ2h0XzsKICAgICB9CiAgICAgYXV0byBjb252VWlkID0gaW5kZXguZGF0YShzdGF0aWNfY2FzdDxpbnQ+KFNtYXJ0TGlzdE1vZGVsOjpSb2xlOjpVSUQpKS52YWx1ZTxRU3RyaW5nPigpLnRvU3RkU3RyaW5nKCk7CiAgICAgYXV0byBjb252ZXJzYXRpb24gPSBVdGlsczo6Z2V0Q29udmVyc2F0aW9uRnJvbVVpZChjb252VWlkLCAqTFJDSW5zdGFuY2U6OmdldEN1cnJlbnRDb252ZXJzYXRpb25Nb2RlbCgpKTsKICAgICBpZiAoTFJDSW5zdGFuY2U6OmdldEN1cnJlbnRDYWxsTW9kZWwoKS0+aGFzQ2FsbChjb252ZXJzYXRpb24tPmNhbGxJZCkpIHsKLSAgICAgICAgYXV0byBjb2xvciA9IFFDb2xvcihSaW5nVGhlbWU6OmJsdWVfLmxpZ2h0ZXIoMTgwKSk7IGNvbG9yLnNldEFscGhhKDEyOCk7CisgICAgICAgIGF1dG8gY29sb3IgPSBRQ29sb3IoUmluZ1RoZW1lOjpibHVlXy5saWdodGVyKDE4MCkpOworICAgICAgICBwcmVzZW5jZUJvcmRlckNvbG9yID0gY29sb3I7CisgICAgICAgIGNvbG9yLnNldEFscGhhKDEyOCk7CiAgICAgICAgIHBhaW50ZXItPmZpbGxSZWN0KG9wdGlvbi5yZWN0LCBjb2xvcik7CiAgICAgfQogCkBAIC05OCw3ICsxMDMsNyBAQAogICAgICAgICBRUGFpbnRlclBhdGggZWxsaXBzZTsKICAgICAgICAgcXJlYWwgZWxsaXBzZUhlaWdodCA9IHNpemVJbWFnZV8gLyA2OwogICAgICAgICBxcmVhbCBlbGxpcHNlV2lkdGggPSBlbGxpcHNlSGVpZ2h0OwotICAgICAgICBRUG9pbnRGIGVsbGlwc2VDZW50ZXIocmVjdEF2YXRhci5yaWdodCgpIC0gZWxsaXBzZVdpZHRoLCByZWN0QXZhdGFyLnRvcCgpICsgZWxsaXBzZUhlaWdodCArIDEpOworICAgICAgICBRUG9pbnRGIGVsbGlwc2VDZW50ZXIocmVjdEF2YXRhci5yaWdodCgpIC0gZWxsaXBzZVdpZHRoICsgMSwgcmVjdEF2YXRhci50b3AoKSArIGVsbGlwc2VIZWlnaHQgKyAxKTsKICAgICAgICAgUVJlY3QgZWxsaXBzZVJlY3QoZWxsaXBzZUNlbnRlci54KCkgLSBlbGxpcHNlV2lkdGgsIGVsbGlwc2VDZW50ZXIueSgpIC0gZWxsaXBzZUhlaWdodCwKICAgICAgICAgICAgIGVsbGlwc2VXaWR0aCAqIDIsIGVsbGlwc2VIZWlnaHQgKiAyKTsKICAgICAgICAgZWxsaXBzZS5hZGRSb3VuZGVkUmVjdChlbGxpcHNlUmVjdCwgZWxsaXBzZVdpZHRoLCBlbGxpcHNlSGVpZ2h0KTsKQEAgLTExNiwxMiArMTIxLDEyIEBACiAgICAgaWYgKGluZGV4LmRhdGEoc3RhdGljX2Nhc3Q8aW50PihTbWFydExpc3RNb2RlbDo6Um9sZTo6UHJlc2VuY2UpKS52YWx1ZTxib29sPigpKSB7CiAgICAgICAgIHFyZWFsIHJhZGl1cyA9IHNpemVJbWFnZV8gLyA2OwogICAgICAgICBRUGFpbnRlclBhdGggb3V0ZXJDaXJjbGUsIGlubmVyQ2lyY2xlOwotICAgICAgICBRUG9pbnRGIGNlbnRlcihyZWN0QXZhdGFyLnJpZ2h0KCkgLSByYWRpdXMsIChyZWN0QXZhdGFyLmJvdHRvbSgpIC0gcmFkaXVzKSArIDEpOworICAgICAgICBRUG9pbnRGIGNlbnRlcihyZWN0QXZhdGFyLnJpZ2h0KCkgLSByYWRpdXMgKyAyLCAocmVjdEF2YXRhci5ib3R0b20oKSAtIHJhZGl1cykgKyAxICsgMik7CiAgICAgICAgIHFyZWFsIG91dGVyQ1JhZGl1cyA9IHJhZGl1czsKICAgICAgICAgcXJlYWwgaW5uZXJDUmFkaXVzID0gb3V0ZXJDUmFkaXVzICogMC43NTsKICAgICAgICAgb3V0ZXJDaXJjbGUuYWRkRWxsaXBzZShjZW50ZXIsIG91dGVyQ1JhZGl1cywgb3V0ZXJDUmFkaXVzKTsKICAgICAgICAgaW5uZXJDaXJjbGUuYWRkRWxsaXBzZShjZW50ZXIsIGlubmVyQ1JhZGl1cywgaW5uZXJDUmFkaXVzKTsKLSAgICAgICAgcGFpbnRlci0+ZmlsbFBhdGgob3V0ZXJDaXJjbGUsIFF0Ojp3aGl0ZSk7CisgICAgICAgIHBhaW50ZXItPmZpbGxQYXRoKG91dGVyQ2lyY2xlLCBwcmVzZW5jZUJvcmRlckNvbG9yKTsKICAgICAgICAgcGFpbnRlci0+ZmlsbFBhdGgoaW5uZXJDaXJjbGUsIFJpbmdUaGVtZTo6cHJlc2VuY2VHcmVlbl8pOwogICAgIH0KIApAQCAtMjY0LDYgKzI2OSwxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludGVyYWN0aW9uU3RyID0gUVN0cmluZzo6ZnJvbVVjczQoJmVtb2ppbGVzcy5hdCgwKSwgZW1vamlsZXNzLnNpemUoKSk7CisgICAgICAgICAgICAvLyByZW1vdmUgZXZlcnl0aGluIGFmdGVyICdjYWxsJworICAgICAgICAgICAgYXV0byBpbmRleE9mQ2FsbFN0ciA9IGludGVyYWN0aW9uU3RyLmxhc3RJbmRleE9mKFFTdHJpbmcoImNhbGwiKSwgLTEsIFF0OjpDYXNlSW5zZW5zaXRpdmUpOworICAgICAgICAgICAgaWYgKGluZGV4T2ZDYWxsU3RyICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25TdHIgPSBpbnRlcmFjdGlvblN0ci5sZWZ0KGluZGV4T2ZDYWxsU3RyICsgNCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBRRm9udCBlbW9qaU1zZ0ZvbnQoUVN0cmluZ0xpdGVyYWwoIlNlZ29lIFVJIEVtb2ppIikpOwogICAgICAgICAgICAgZW1vamlNc2dGb250LnNldEl0YWxpYyhmYWxzZSk7Cg==