ZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQppbmRleCA5NTAxZjUzLi5jMTFjODJlIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CkBAIC0xLDggKzEsNyBAQAotIy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiAjIHB5c3FsaXRlMi90ZXN0L3VzZXJmdW5jdGlvbnMucHk6IHRlc3RzIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZAogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVzLgogIwotIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSMOkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogIwpAQCAtMTU4LDYgKzE1Nyw3IEBACiAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNibG9iIiwgMSwgZnVuY19pc2Jsb2IpCiAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNsb25nbG9uZyIsIDEsIGZ1bmNfaXNsb25nbG9uZykKICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJzcGFtIiwgLTEsIGZ1bmMpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHQgdGV4dCkiKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCkBAIC0yNzYsMTggKzI3NiwzNiBAQAogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMikKIAorICAgICMgUmVnYXJkaW5nIGRldGVybWluaXN0aWMgZnVuY3Rpb25zOgorICAgICMKKyAgICAjIEJldHdlZW4gMy44LjMgYW5kIDMuMTUuMCwgZGV0ZXJtaW5pc3RpYyBmdW5jdGlvbnMgd2VyZSBvbmx5IHVzZWQgdG8KKyAgICAjIG9wdGltaXplIGlubmVyIGxvb3BzLCBzbyBmb3IgdGhvc2UgdmVyc2lvbnMgd2UgY2FuIG9ubHkgdGVzdCBpZiB0aGUKKyAgICAjIHNxbGl0ZSBtYWNoaW5lcnkgaGFzIGZhY3RvcmVkIG91dCBhIGNhbGwgb3Igbm90LiBGcm9tIDMuMTUuMCBhbmQgb253YXJkLAorICAgICMgZGV0ZXJtaW5pc3RpYyBmdW5jdGlvbnMgd2VyZSBwZXJtaXR0ZWQgaW4gV0hFUkUgY2xhdXNlcyBvZiBwYXJ0aWFsCisgICAgIyBpbmRpY2VzLCB3aGljaCBhbGxvd3MgdGVzdGluZyBiYXNlZCBvbiBzeW50YXgsIGlzby4gdGhlIHF1ZXJ5IG9wdGltaXplci4KKyAgICBAdW5pdHRlc3Quc2tpcElmKHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDgsIDMpLCAiUmVxdWlyZXMgU1FMaXRlIDMuOC4zIG9yIGhpZ2hlciIpCiAgICAgZGVmIENoZWNrRnVuY05vbkRldGVybWluaXN0aWMoc2VsZik6CiAgICAgICAgIG1vY2sgPSB1bml0dGVzdC5tb2NrLk1vY2socmV0dXJuX3ZhbHVlPU5vbmUpCi0gICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiZGV0ZXJtaW5pc3RpYyIsIDAsIG1vY2ssIGRldGVybWluaXN0aWM9RmFsc2UpCi0gICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBkZXRlcm1pbmlzdGljKCkgPSBkZXRlcm1pbmlzdGljKCkiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2suY2FsbF9jb3VudCwgMikKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJub25kZXRlcm1pbmlzdGljIiwgMCwgbW9jaywgZGV0ZXJtaW5pc3RpYz1GYWxzZSkKKyAgICAgICAgaWYgc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPCAoMywgMTUsIDApOgorICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IG5vbmRldGVybWluaXN0aWMoKSA9IG5vbmRldGVybWluaXN0aWMoKSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2suY2FsbF9jb3VudCwgMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgorICAgICAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSBpbmRleCB0IG9uIHRlc3QodCkgd2hlcmUgbm9uZGV0ZXJtaW5pc3RpYygpIGlzIG5vdCBudWxsIikKIAotICAgIEB1bml0dGVzdC5za2lwSWYoc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPCAoMywgOCwgMyksICJkZXRlcm1pbmlzdGljIHBhcmFtZXRlciBub3Qgc3VwcG9ydGVkIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDgsIDMpLCAiUmVxdWlyZXMgU1FMaXRlIDMuOC4zIG9yIGhpZ2hlciIpCiAgICAgZGVmIENoZWNrRnVuY0RldGVybWluaXN0aWMoc2VsZik6CiAgICAgICAgIG1vY2sgPSB1bml0dGVzdC5tb2NrLk1vY2socmV0dXJuX3ZhbHVlPU5vbmUpCiAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiZGV0ZXJtaW5pc3RpYyIsIDAsIG1vY2ssIGRldGVybWluaXN0aWM9VHJ1ZSkKLSAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGRldGVybWluaXN0aWMoKSA9IGRldGVybWluaXN0aWMoKSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9jay5jYWxsX2NvdW50LCAxKQorICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAxNSwgMCk6CisgICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgZGV0ZXJtaW5pc3RpYygpID0gZGV0ZXJtaW5pc3RpYygpIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9jay5jYWxsX2NvdW50LCAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSBpbmRleCB0IG9uIHRlc3QodCkgd2hlcmUgZGV0ZXJtaW5pc3RpYygpIGlzIG5vdCBudWxsIikKKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlVuZXhwZWN0ZWQgZmFpbHVyZSB3aGlsZSBjcmVhdGluZyBwYXJ0aWFsIGluZGV4IikKIAogICAgIEB1bml0dGVzdC5za2lwSWYoc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPj0gKDMsIDgsIDMpLCAiU1FMaXRlIDwgMy44LjMgbmVlZGVkIikKICAgICBkZWYgQ2hlY2tGdW5jRGV0ZXJtaW5pc3RpY05vdFN1cHBvcnRlZChzZWxmKToK