ZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3OTc1YwotLS0gL2Rldi9udWxsCisrKyBiL01FVEFEQVRBCkBAIC0wLDAgKzEsMyBAQAordGhpcmRfcGFydHkgeworICBsaWNlbnNlX3R5cGU6IE5PVElDRQorfQpkaWZmIC0tZ2l0IGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCmluZGV4IDIzMjBmZDcuLjFmMDVkMmUgMTAwNjQ0Ci0tLSBhL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgorKysgYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KQEAgLTEsNCArMSw3IEBACiB7CiAgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAotICAidmVyc2lvbiI6IDMwMDAwMDAwMAorICAidmVyc2lvbiI6IDMwMDAwMDAwMCwKKyAgInJlcXVpcmVOYXRpdmVMaWJzIjogWworICAgICI6c3BoYWwiCisgIF0KIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCA2ODk2OWNmLi5lOTVjOTFjIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcAppbmRleCBjMjkyMzNjLi5hMWNmMzU1IDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggZGM3Zjg4YS4uMDlhMzMzYiAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icApAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY29tcGlsZV9tdWx0aWxpYjogInByZWZlcjMyIiwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggYjU4ZWJlMi4uNDE5MjUwYyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC03NDMsNyArNzQzLDcgQEAKICAgICAvLyBObyB3YXkgdG8gZ2V0IHBhY2thZ2UgbmFtZSBmcm9tIG5hdGl2ZS4KICAgICAvLyBTZW5kIGEgemVybyBsZW5ndGggcGFja2FnZSBuYW1lIGFuZCBsZXQgY2FtZXJhIHNlcnZpY2UgZmlndXJlIGl0IG91dCBmcm9tIFVJRAogICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPSBjcy0+Y29ubmVjdERldmljZSgKLSAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQpLCBTdHJpbmcxNigiIiksIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwKKyAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQpLCBTdHJpbmcxNigiIiksIHt9LAogICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsIC8qb3V0Ki8mZGV2aWNlUmVtb3RlKTsKIAogICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAppbmRleCAwNzJiYjAyLi5hODQwYmQxIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCkBAIC0zNiw2ICszNiw3IEBACiAjaWZuZGVmIF9OREtfQ0FNRVJBX01FVEFEQVRBX0gKICNkZWZpbmUgX05ES19DQU1FUkFfTUVUQURBVEFfSAogCisjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCA4Y2NkZWQyLi5lZWUwNWZmIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTM3OCw3ICszNzgsNyBAQAogICAgICAgICBzcDxUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MobmV3IFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3MoKSk7CiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlOwogICAgICAgICByZXMgPSBzZXJ2aWNlLT5jb25uZWN0RGV2aWNlKGNhbGxiYWNrcywgY2FtZXJhSWQsIFN0cmluZzE2KCJtZWVlZWVlZWVlISIpLAotICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsCisgICAgICAgICAgICAgICAge30sIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mZGV2aWNlKTsKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgZGV2aWNlLmdldCgpKTsKQEAgLTQyMSw3ICs0MjEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoIm9wZW5OZXdEZXZpY2UiKTsKICAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IHNlcnZpY2UtPmNvbm5lY3REZXZpY2UoY2FsbGJhY2tzLCBkZXZpY2VJZCwgU3RyaW5nMTYoIm1lZWVlZWVlZWUhIiksCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsCisgICAgICAgICAgICAgICAgICAgIHt9LCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwKICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZkZXZpY2UpOwogICAgICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAppbmRleCA3M2YxMWE0Li5jMGE1ZTNiIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKQEAgLTMwOSw3ICszMDksNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqIERSTSBmcmFtZXdvcmsuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KICAgICAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAppbmRleCAxODM3YTExLi5hNTQ1OTQxIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqIERSTSBmcmFtZXdvcmsuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KICAgICAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0FuZHJvaWQuYnAgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggYjY4ZTZjMi4uZmNkMjkxZiAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5icApAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY29tcGlsZV9tdWx0aWxpYjogInByZWZlcjMyIiwKIAogICAgIGluaXRfcmM6IFsiZHJtc2VydmVyLnJjIl0sCiB9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oCmluZGV4IDM4NTg2NzUuLjhjODc4M2IgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oCkBAIC0yMzAsNyArMjMwLDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKiBEUk0gZnJhbWV3b3JrLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCiAgICAgICogQHJldHVybiBzdGF0dXNfdApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCmluZGV4IGI2MmRkYjkuLmViNWIwZjYgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKQEAgLTI1Miw4ICsyNTIsNyBAQAogCiAvKioKICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldCBidXQgZG9lcyBub3RoaW5nIGZvcgotICogRm9yd2FyZCBMb2NrIEVuZ2luZS4KKyAqIERSTSBmcmFtZXdvcmsuIERvZXMgbm90aGluZyBmb3IgRm9yd2FyZCBMb2NrIEVuZ2luZS4KICAqCiAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgogICogQHJldHVybiBzdGF0dXNfdApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwKaW5kZXggOGY5NWNkMi4uYzFkNWIzZCAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCkBAIC00ODgsNyArNDg4LDcgQEAKIDxwIGNsYXNzPU1zb0JvZHlUZXh0PjxiPk5vdGU6PC9iPiBUaGUga2V5LWVuY3J5cHRpb24ga2V5IG11c3QgYmUgdW5pcXVlIHRvIGVhY2gKIGRldmljZTsgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBmaWxlcyBmb3J3YXJkIGxvY2uWcHJvdGVjdGVkLiBJZGVhbGx5LCBpdCBzaG91bGQKIGJlIGRlcml2ZWQgZnJvbSBzZWNyZXQgaGFyZHdhcmUgcGFyYW1ldGVycywgYnV0IGF0IHRoZSB2ZXJ5IGxlYXN0IGl0IHNob3VsZCBiZQotcGVyc2lzdGVudCBmcm9tIG9uZSBtYXN0ZXIgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgorcGVyc2lzdGVudCBmcm9tIG9uZSBmYWN0b3J5IHJlc2V0IHRvIHRoZSBuZXh0LjwvcD4KIAogPGRpdiBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7cGFkZGluZzoxLjBwdCA0LjBwdCAxLjBwdCA0LjBwdDsKIGJhY2tncm91bmQ6I0YyRjJGMic+CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcAppbmRleCA1MjkyNzA1Li5lMzEzOTVkIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKQEAgLTY2LDcgKzY2LDcgQEAKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAgICAgTWVkaWFSZXNvdXJjZVBhcmNlbCByZXNvdXJjZXsKICAgICAgICAgICAgIFR5cGU6OmtEcm1TZXNzaW9uLCBTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlLAotICAgICAgICAgICAgdG9TdGRWZWM8aW50OF90PihzZXNzaW9uSWQpLCB2YWx1ZX07CisgICAgICAgICAgICB0b1N0ZFZlYzw+KHNlc3Npb25JZCksIHZhbHVlfTsKICAgICByZXNvdXJjZXMucHVzaF9iYWNrKHJlc291cmNlKTsKICAgICByZXR1cm4gcmVzb3VyY2VzOwogfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKaW5kZXggY2I2OWY5MS4uNDY2ZTU3MSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCkBAIC02Miw4ICs2Miw4IEBACiAgICAgfQogICAgIEFMT0dWKCJkZXNjcmlwdG9yX3NpemU9JXp1IiwgY29udGFpbmVyLmRlc2NyaXB0b3Jfc2l6ZSgpKTsKIAotICAgIC8vIFNhbml0eSBjaGVjayB0byB2ZXJpZnkgdGhhdCB0aGUgQnJvYWRjYXN0RW5jcnlwdG9yIGlzIHNlbmRpbmcgYSBwcm9wZXJseQotICAgIC8vIGZvcm1lZCBFY21Db250YWluZXIuIElmIGl0IGNvbnRhaW5zIHR3byBFY21zLCB0aGUgaWRzIHNob3VsZCBoYXZlIGRpZmZlcmVudAorICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIEJyb2FkY2FzdEVuY3J5cHRvciBpcyBzZW5kaW5nIGEgcHJvcGVybHkgZm9ybWVkCisgICAgLy8gRWNtQ29udGFpbmVyLiBJZiBpdCBjb250YWlucyB0d28gRWNtcywgdGhlIGlkcyBzaG91bGQgaGF2ZSBkaWZmZXJlbnQKICAgICAvLyBwYXJpdHkgKG9uZSBvZGQsIG9uZSBldmVuKS4gVGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBhZmZlY3QgZGVjcnlwdGlvbgogICAgIC8vIGJ1dCBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdpdGggRWNtIGdlbmVyYXRpb24uCiAgICAgaWYgKGNvbnRhaW5lci5kZXNjcmlwdG9yX3NpemUoKSA9PSAyKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmggYi9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKaW5kZXggODY2ZWRhYy4uYTM4YWE5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCisrKyBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaApAQCAtMzE4LDcgKzMxOCw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCmRpZmYgLS1naXQgYS9tZWRpYS9PV05FUlMgYi9tZWRpYS9PV05FUlMKaW5kZXggMWFmYzI1My4uYmQ4M2FkOSAxMDA2NDQKLS0tIGEvbWVkaWEvT1dORVJTCisrKyBiL21lZGlhL09XTkVSUwpAQCAtOCw3ICs4LDYgQEAKIGh1bmdhQGdvb2dsZS5jb20KIGppYWJpbkBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQogbWFyY29uZUBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcAppbmRleCAxNzk2ODE5Li5kOGNjMjg1IDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKQEAgLTIxNSw3ICsyMTUsNyBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpzZXRUcmVibGVUZXN0aW5nT3ZlcnJpZGUodHJ1ZSk7CiAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKaW5kZXggNjhiNjk5Mi4uYjQwODM4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcApAQCAtMjE1LDcgKzIxNSw3IEBACiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgYW5kcm9pZDo6aGFyZHdhcmU6OmRldGFpbHM6OnNldFRyZWJsZVRlc3RpbmdPdmVycmlkZSh0cnVlKTsKICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CiAgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKaW5kZXggYzcwNDZjYi4uOWJhM2I2OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCkBAIC01MDYsMzAgKzUwNiwyOCBAQAogfQogCiBzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAogICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0gICAgdWludDhfdCogZHN0U3RhcnQgPSBkc3Q7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICAgIH0KIAotICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7CiAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIAotICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwogICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgICB9CiB9CiAKQEAgLTU5NiwxNiArNTk0LDEyIEBACiAgICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7Ci0gICAgc2l6ZV90IGRzdFlTaXplID0gZHN0WVN0cmlkZSAqIGhlaWdodDsKLSAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOwotICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7Ci0gICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKQEAgLTY5Niw3ICs2OTAsOSBAQAogICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwKICAgICAgICAgICAoaW50KSooaW50NjRfdCopaW1nLT51c2VyX3ByaXYpOwogCi0gICAgdWludDhfdCogZHN0ID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCogZHN0WSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIGRzdFUgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90KiBkc3RWID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CiAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfWV07CiAgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVV07CiAgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVl07CkBAIC03MTAsMTMgKzcwNiwxNCBAQAogICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKIAogICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0KQEAgLTcyNSw3ICs3MjIsNyBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKICAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgIGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsCiAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcAppbmRleCBkN2I5ZTEyLi4zYWZkNjcwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcApAQCAtMzQsNyArMzQsMTEgQEAKIGNvbnN0ZXhwciBzaXplX3Qga01pbklucHV0QnVmZmVyU2l6ZSA9IDIgKiAxMDI0ICogMTAyNDsKIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciI7CiBjb25zdGV4cHIgdWludDMyX3Qga0RlZmF1bHRPdXRwdXREZWxheSA9IDg7Ci1jb25zdGV4cHIgdWludDMyX3Qga01heE91dHB1dERlbGF5ID0gMTY7CisvKiBhdmMgc3BlY2lmaWNhdGlvbiBhbGxvd3MgZm9yIGEgbWF4aW11bSBkZWxheSBvZiAxNiBmcmFtZXMuCisgICBBcyBzb2Z0IGF2YyBkZWNvZGVyIHN1cHBvcnRzIGludGVybGFjZWQsIHRoaXMgZGVsYXkgd291bGQgYmUgMzIgZmllbGRzLgorICAgQW5kIGF2YyBkZWNvZGVyIGltcGxlbWVudGF0aW9uIGhhcyBhbiBhZGRpdGlvbmFsIGRlbGF5IG9mIDIgZGVjb2RlIGNhbGxzLgorICAgU28gdG90YWwgbWF4aW11bSBvdXRwdXQgZGVsYXkgaXMgMzQgKi8KK2NvbnN0ZXhwciB1aW50MzJfdCBrTWF4T3V0cHV0RGVsYXkgPSAzNDsKIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluSW5wdXRCeXRlcyA9IDQ7CiB9ICAvLyBuYW1lc3BhY2UKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCmluZGV4IGQ2MDI1ZGUuLmExN2IwNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiBTaW1wbGVQbGF5ZXI6OlNpbXBsZVBsYXllcigpCiAgICAgOiBtTGlzdGVuZXIobmV3IExpc3RlbmVyKHRoaXMpKSwKLSAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBEdW1teVByb2R1Y2VyTGlzdGVuZXIpLAorICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IFN0dWJQcm9kdWNlckxpc3RlbmVyKSwKICAgICAgIG1MaW5lYXJQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKICAgICAgIG1Db21wb3NlckNsaWVudChuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50KSB7CiAgICAgQ0hFQ0tfRVEobUNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icAppbmRleCAzZWRlNjhjLi4wMTAxYjFhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCkBAIC03LDYgKzcsOCBAQAogCiAgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAogCisgICAgc3RhdGljX2xpYnM6IFsiY29kZWNzX2c3MTFkZWMiXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLURBTEFXIiwKICAgICBdLApAQCAtMjAsNCArMjIsNiBAQAogICAgIF0sCiAKICAgICBzcmNzOiBbIkMyU29mdEc3MTFEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJjb2RlY3NfZzcxMWRlYyJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKaW5kZXggNGZmMDc5My4uN2Y5YzM0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgogI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+Ci0KKyNpbmNsdWRlIDxnNzExRGVjLmg+CiAjaW5jbHVkZSAiQzJTb2Z0RzcxMURlYy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yMjQsNTMgKzIyNCw2IEBACiAgICAgcmV0dXJuIEMyX09LOwogfQogCi0jaWZkZWYgQUxBVwotdm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVBTGF3KAotICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7Ci0gICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKLSAgICAgICAgaW5TaXplLS07Ci0gICAgICAgIGludDMyX3QgeCA9ICppbisrOwotCi0gICAgICAgIGludDMyX3QgaXggPSB4IF4gMHg1NTsKLSAgICAgICAgaXggJj0gMHg3ZjsKLQotICAgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OwotICAgICAgICBpbnQzMl90IG1hbnQgPSBpeCAmIDB4MGY7Ci0KLSAgICAgICAgaWYgKGlleHAgPiAwKSB7Ci0gICAgICAgICAgICBtYW50ICs9IDE2OwotICAgICAgICB9Ci0KLSAgICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKLQotICAgICAgICBpZiAoaWV4cCA+IDEpIHsKLSAgICAgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0KysgPSAoeCA+IDEyNykgPyBtYW50IDogLW1hbnQ7Ci0gICAgfQotfQotI2Vsc2UKLXZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlTUxhdygKLSAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgewotICAgIHdoaWxlIChpblNpemUgPiAwKSB7Ci0gICAgICAgIGluU2l6ZS0tOwotICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKLQotICAgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7Ci0gICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OwotICAgICAgICBpbnQzMl90IHNlZ21lbnQgPSBleHBvbmVudCArIDE7Ci0gICAgICAgIG1hbnRpc3NhICY9IDB4MGY7Ci0KLSAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OwotCi0gICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOwotCi0gICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOwotICAgIH0KLX0KLSNlbmRpZgotCiBjbGFzcyBDMlNvZnRHNzExRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgewogcHVibGljOgogICAgIEMyU29mdEc3MTFEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCmluZGV4IDIzZThmZmMuLmY5Mzg0MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCkBAIC00NSwxMiArNDUsNiBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CiAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwogCi0jaWZkZWYgQUxBVwotICAgIHZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKLSNlbHNlCi0gICAgdm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOwotI2VuZGlmCi0KICAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHNzExRGVjKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCmluZGV4IGNmN2MzNzAuLjIyNzNlNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcApAQCAtNDY3LDMyICs0NjcsMjggQEAKICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICB1aW50OF90ICpjb25zdCBkc3RTdGFydCA9IGRzdDsKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKIAogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgbWVtY3B5KGRzdCwgc3JjWSwgd2lkdGgpOworICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7CiAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgfQogCi0gIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIpOworICAgIG1lbWNweShkc3RWLCBzcmNWLCB3aWR0aCAvIDIpOwogICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKICAgfQogCi0gIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggLyAyKTsKICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgIH0KIH0KIApAQCAtNTY0LDE1ICs1NjAsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCi0gICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsCi0gICAgY29uc3QgdWludDE2X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwKLSAgICBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKKyAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAogICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7Ci0gIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7Ci0gIHNpemVfdCBkc3RVVlNpemUgPSBkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDI7Ci0gIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7Ci0gIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOwogCiAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKQEAgLTY3NiwxMCArNjY4LDEzIEBACiAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCksIG91dCBmcmFtZWluZGV4ICVkIiwgYmxvY2stPndpZHRoKCksCiAgICAgICAgIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LCAoaW50KWJ1ZmZlci0+dXNlcl9wcml2YXRlX2RhdGEpOwogCi0gIHVpbnQ4X3QgKmRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgdWludDhfdCAqZHN0WSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgdWludDhfdCAqZHN0VSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgdWludDhfdCAqZHN0ViA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBidWZmZXItPnN0cmlkZVswXTsKICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBidWZmZXItPnN0cmlkZVsxXTsKICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBidWZmZXItPnN0cmlkZVsyXTsKKwogICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB3Vmlldy5sYXlvdXQoKTsKICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CiAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKQEAgLTY5MSwyMCArNjg2LDI0IEBACiAKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7CiAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCi0gICAgICAgICAgKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsCisgICAgICAgICAgKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAogICAgICAgICAgIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICB9IGVsc2UgewotICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgIH0KICAgfSBlbHNlIHsKICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzBdOwogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMV07CiAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVsyXTsKLSAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZShkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUoZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgIH0KICAgZmluaXNoV29yayhidWZmZXItPnVzZXJfcHJpdmF0ZV9kYXRhLCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKICAgYmxvY2sgPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCmluZGV4IDJiMjA5ZmUuLmVkZDI3M2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKQEAgLTE5LDEwICsxOSw3IEBACiAKICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogCi0KLWV4dGVybiAiQyIgewotICAgICNpbmNsdWRlICJnc20uaCIKLX0KKyNpbmNsdWRlICJnc20uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCmluZGV4IDYxYjI4NmMuLjEzY2MwZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCkBAIC00NjQsMzQgKzQ2NCwzNCBAQAogLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQogICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCiBzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIHVpbnQ4X3QgKnNyYywKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHVpbnQzMl90IHdpZHRoLAogICAgICAgICB1aW50MzJfdCBoZWlnaHQpIHsKICAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSBzcmNZU3RyaWRlIC8gMjsKICAgICB1aW50OF90ICpzcmNTdGFydCA9IHNyYzsKLSAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKwogICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24oaGVpZ2h0LCAxNik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgICBtZW1jcHkoZHN0WSwgc3JjLCB3aWR0aCk7CiAgICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICAgIH0KKwogICAgIC8qIFUgYnVmZmVyICovCiAgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZTsKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBtZW1jcHkoZHN0VSwgc3JjLCB3aWR0aCAvIDIpOwogICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgICB9CisKICAgICAvKiBWIGJ1ZmZlciAqLwogICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGUgKiA1IC8gNDsKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFYsIHNyYywgd2lkdGggLyAyKTsKICAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogfQogCkBAIC02NzIsMTEgKzY3MiwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyWSA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclUgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJWID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKwogICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB3Vmlldy5sYXlvdXQoKTsKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CiAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKICAgICAgICAgKHZvaWQpY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyWSwKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJZLCBvdXRwdXRCdWZmZXJVLCBvdXRwdXRCdWZmZXJWLAogICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSwKICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwgbVdpZHRoLCBtSGVpZ2h0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKaW5kZXggM2VlZjFlMy4uOTEyMzhlOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKQEAgLTYzMSwzMSArNjMxLDMwIEBACiB9CiAKIHN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLSAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7CiAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKICAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogCi0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwogICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgICB9CisKIH0KIAogc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCkBAIC03MjEsMTYgKzcyMCwxMiBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIodWludDhfdCAqZHN0LAorc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OwotICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7Ci0gICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKLSAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOwotICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CkBAIC04MjMsNyArODE4LDEwIEBACiAgICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwKICAgICAgICAgICAgKChjMl9jbnRyNjRfdCAqKWltZy0+dXNlcl9wcml2KS0+cGVla2xsKCkpOwogCi0gICAgdWludDhfdCAqZHN0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKmRzdFkgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqZHN0VSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICpkc3RWID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCiAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CiAgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CiAgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CkBAIC04NDIsMTggKzg0MCwxOCBAQAogICAgICAgICAgICAgY29uc3RleHByIHNpemVfdCBrSGVpZ2h0ID0gNjQ7CiAgICAgICAgICAgICBmb3IgKDsgaSA8IG1IZWlnaHQ7IGkgKz0ga0hlaWdodCkgewogICAgICAgICAgICAgICAgIHF1ZXVlLT5lbnRyaWVzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIFtkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICBbZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLCBkc3RZU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbVdpZHRoLCBoZWlnaHQgPSBzdGQ6Om1pbihtSGVpZ2h0IC0gaSwga0hlaWdodCldIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgLyAyICoga0hlaWdodDsKICAgICAgICAgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGUgLyAyICogKGtIZWlnaHQgLyAyKTsKICAgICAgICAgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGUgLyAyICogKGtIZWlnaHQgLyAyKTsKLSAgICAgICAgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZSAqIGtIZWlnaHQ7CisgICAgICAgICAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlICoga0hlaWdodDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBxdWV1ZS0+bnVtUGVuZGluZyk7CiAgICAgICAgICAgICBxdWV1ZS0+bnVtUGVuZGluZyA9IHF1ZXVlLT5lbnRyaWVzLnNpemUoKTsKQEAgLTg2Miw4ICs4NjAsOSBAQAogICAgICAgICAgICAgICAgIHF1ZXVlLndhaXRGb3JDb25kaXRpb24ocXVldWUtPmNvbmQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgfQpAQCAtODcxLDggKzg3MCwxMCBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOworCiAgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCiAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKaW5kZXggY2UxYzlhYy4uMzNmYWZhNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCkBAIC0yMSw2ICsyMSwxMCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogeworICAgICAgICBjaGVja19hbGxfYXBpczogdHJ1ZSwKKyAgICB9LAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKaW5kZXggYTE2YjEwNi4uMzc4MGE1YSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCkBAIC01Miw2ICs1Miw5IEBACiAgICAgLy8gZGlyZWN0bHkgaW4gdGhlIG1haW4gZGV2aWNlIG1hbmlmZXN0LnhtbCBmaWxlIG9yIHZpYSB2aW50Zl9mcmFnbWVudHMuCiAgICAgLy8gKFJlbW92ZSB0aGUgbGluZSBiZWxvdyBpZiB0aGUgZW50cnkgaXMgYWxyZWFkeSBpbiB0aGUgbWFpbiBtYW5pZmVzdC4pCiAgICAgdmludGZfZnJhZ21lbnRzOiBbIm1hbmlmZXN0X21lZGlhX2MyX1YxXzFfZGVmYXVsdC54bWwiXSwKKworICAgIC8vIFJlbW92ZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHRoaXMgbW9kdWxlLgorICAgIGVuYWJsZWQ6IGZhbHNlLAogfQogCiAvLyBzZWNjb21wIHBvbGljeSBmaWxlLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcAppbmRleCAxOTcyZDNmLi43M2IzODU3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApAQCAtMTgxNiwxNSArMTgxNiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBhbGwgaW5mbyBpbnRvIG91dHB1dC1zdHJlYW0gIzAgZG9tYWluCiAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5QXNTdHJlYW0oKmluZm8sIHRydWUgLyogb3V0cHV0ICovLCBzdHJlYW0pKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrIDogYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gYmxvY2tzID0gYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpOworICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm93IG9ubHkgZG8gdGhlIGZpcnN0IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIGlmICghYmxvY2tzLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJnb3Qgb3V0cHV0IGJ1ZmZlciB3aXRoIGNyb3AgJXUsJXUrJXUsJXUgYW5kIHNpemUgJXUsJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkubGVmdCwgYmxvY2suY3JvcCgpLnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA9IGJsb2Nrc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0KHN0cmVhbSwgYmxvY2suY3JvcCgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBibG9jay5jcm9wKCkud2lkdGgsIGJsb2NrLmNyb3AoKS5oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBmb3Igbm93IG9ubHkgZG8gdGhlIGZpcnN0IGJsb2NrCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CiAgICAgICAgICAgICAgICAgfQpAQCAtMTgzNiw3ICsxODM5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBjb3B5IHN0YW5kYXJkIGluZm9zIHRvIGdyYXBoaWMgYnVmZmVycyBpZiBub3QgYWxyZWFkeSBwcmVzZW50IChvdGhlcndpc2UsIHdlCiAgICAgICAgICAgICAgICAgLy8gbWF5IG92ZXJ3cml0ZSB0aGUgYWN0dWFsIGludGVybWVkaWF0ZSB2YWx1ZSB3aXRoIGEgZmluYWwgdmFsdWUpCiAgICAgICAgICAgICAgICAgc3RyZWFtID0gMDsKLSAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN0ZEdmeEluZm9zID0geworICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBDMlBhcmFtOjpJbmRleCBzdGRHZnhJbmZvc1tdID0gewogICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKaW5kZXggNTljZDMxMy4uMmQ2NmRmMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcApAQCAtNzgsNyArNzgsNyBAQAogICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKICAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCiAgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pOwotICAgIEVudW0zIGUzOworICAgIEVudW0zIGUzKEludmFsaWQpOwogICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcihlMyk7CiAKICAgICAvLyB1cHBlciBjYXNlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmZjYwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJjb2RlY3NfZzcxMWRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFEZWNBbGF3LmNwcCIsCisgICAgICAgICJnNzExRGVjTWxhdy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyJdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWMuaCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzU3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWMuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBHNzExX0RFQ19IXworI2RlZmluZSBHNzExX0RFQ19IXworCisvKioKKyAqIEBmaWxlIGc3MTFEZWMuaAorICogQGJyaWVmIGc3MTEgRGVjb2RlciBBUEk6IERlY29kZUFMYXcgYW5kIERlY29kZU1MYXcKKyAqLworCisvKiogRGVjb2RlcyBpbnB1dCBieXRlcyBvZiBzaXplIGluU2l6ZSBhY2NvcmRpbmcgdG8gQUxBVworICoKKyAqIEBwYXJhbSBbaW5dIG91dCA8dHQ+aW50MTZfdCo8L3R0Pjogb3V0cHV0IGJ1ZmZlciB0byBiZSBmaWxsZWQgd2l0aCBkZWNvZGVkIGJ5dGVzLgorICogQHBhcmFtIFtpbl0gaW4gPHR0PmNvbnN0IHVpbnQ4X3QqPC90dD46IGlucHV0IGJ1ZmZlciBjb250YWluaW5nIGJ5dGVzIHRvIGJlIGRlY29kZWQuCisgKiBAcGFyYW0gW2luXSBpblNpemUgPHR0PnNpemVfdDwvdHQ+OiBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KK3ZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKworLyoqIERlY29kZXMgaW5wdXQgYnl0ZXMgb2Ygc2l6ZSBpblNpemUgYWNjb3JkaW5nIHRvIE1MQVcKKyAqCisgKiBAcGFyYW0gW2luXSBvdXQgPHR0PmludDE2X3QqPC90dD46IG91dHB1dCBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggZGVjb2RlZCBieXRlcy4KKyAqIEBwYXJhbSBbaW5dIGluIDx0dD5jb25zdCB1aW50OF90KjwvdHQ+OiBpbnB1dCBidWZmZXIgY29udGFpbmluZyBieXRlcyB0byBiZSBkZWNvZGVkLgorICogQHBhcmFtIFtpbl0gaW5TaXplIDx0dD5zaXplX3Q8L3R0Pjogc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLgorICovCit2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisKKyNlbmRpZiAgLy8gRzcxMV9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNBbGF3LmNwcCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY0FsYXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MWE3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNBbGF3LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICBpZiAob3V0ICE9IG51bGxwdHIgJiYgaW4gIT0gbnVsbHB0cikgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICBpblNpemUtLTsKKyAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7CisgICAgICBpeCAmPSAweDdmOworCisgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OworICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOworCisgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgbWFudCArPSAxNjsKKyAgICAgIH0KKworICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKKworICAgICAgaWYgKGlleHAgPiAxKSB7CisgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7CisgICAgICB9CisKKyAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY01sYXcuY3BwIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjTWxhdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyY2FlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY01sYXcuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgRGVjb2RlTUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgIGlmIChvdXQgIT0gbnVsbHB0ciAmJiBpbiAhPSBudWxscHRyKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgIGluU2l6ZS0tOworICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgIGludDMyX3QgbWFudGlzc2EgPSB+eDsKKyAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OworICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOworICAgICAgbWFudGlzc2EgJj0gMHgwZjsKKworICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OworCisgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKKworICAgICAgKm91dCsrID0gKHggPCAweDgwKSA/IC1hYnMgOiBhYnM7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNWVmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworY2NfZnV6eiB7CisgICAgbmFtZTogImc3MTFhbGF3X2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImNvZGVjc19nNzExZGVjIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURBTEFXIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImc3MTFtbGF3X2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImNvZGVjc19nNzExZGVjIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWMzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDkgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9nNzExZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEc3MTEgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitHNzExIHN1cHBvcnRzIHR3byB0eXBlcyBvZiBkZWNvZGluZzoKKzEuIERlY29kZUFMYXcKKzIuIERlY29kZU1MYXcKKworVGhlc2UgdHdvIGRlY29kZXIgQVBJJ3MgYXJlIGZ1enplZCBzZXBhcmF0ZWx5IHVzaW5nIGc3MTFhbGF3X2RlY19mdXp6ZXIgYW5kCitnNzExbWxhd19kZWNfZnV6emVyIHJlc3BlY3RpdmVseS4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIGFzIGV4cGVjdGVkIGJ5IGRlY29kZXIgQVBJLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBnNzExYWxhd19kZWNfZnV6emVyIGFuZCBnNzExbWxhd19kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBnNzExYWxhd19kZWNfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBnNzExbWxhd19kZWNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZzcxMSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9nNzExYWxhd19kZWNfZnV6emVyL2c3MTFhbGF3X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2c3MTFtbGF3X2RlY19mdXp6ZXIvZzcxMW1sYXdfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9nNzExYWxhd19kZWNfZnV6emVyL2c3MTFhbGF3X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2c3MTFtbGF3X2RlY19mdXp6ZXIvZzcxMW1sYXdfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvZzcxMV9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9nNzExX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZmJjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvZzcxMV9kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImc3MTFEZWMuaCIKKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpID0gZGVmYXVsdDsKKyAgdm9pZCBkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworfTsKKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplID0gc2l6ZW9mKGludDE2X3QpICogc2l6ZTsKKyAgaW50MTZfdCAqb3V0ID0gbmV3IGludDE2X3Rbb3V0cHV0QnVmZmVyU2l6ZV07CisgIGlmICghb3V0KSB7CisgICAgcmV0dXJuOworICB9CisjaWZkZWYgQUxBVworICBEZWNvZGVBTGF3KG91dCwgZGF0YSwgc2l6ZSk7CisjZWxzZQorICBEZWNvZGVNTGF3KG91dCwgZGF0YSwgc2l6ZSk7CisjZW5kaWYKKyAgZGVsZXRlW10gb3V0OworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY29kZWMtPmRlY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgZGVsZXRlIGNvZGVjOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icAppbmRleCA3YzRlNjJmLi5mOWFiZmUzIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCkBAIC0yMSw3ICsyMSw2IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhbmRrIzI5IiwKICAgICBdLAogCiAgICAgLy8gZXh0cmFjdG9ycyBhcmUgc3VwcG9zZWQgdG8gd29yayBvbiBRKDI5KQpAQCAtMzksNiArMzgsMjEgQEAKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYm1lZGlhbmRrIzI5IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGhvc3Q6IHsKKyAgICAgICAgICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgICAgICAgICAibGlibWVkaWFuZGtfZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAibGlibWVkaWFfbmRrZm9ybWF0cHJpdiIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA2MGQzYWUxLi5jMDM2YmI1IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTEwLDQgKzEwLDExIEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCmluZGV4IDQ5Yzk1NjcuLjQ0MDA2NWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icApAQCAtOCw0ICs4LDEwIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAppbmRleCA4MjZjMWEwLi4yNTkzMDAwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtMjEsNCArMjEsMTIgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDZmODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImV4dHJhY3Rvci1mdXp6ZXJiYXNlLWRlZmF1bHRzIiwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGtfZm9ybWF0IiwKKyAgICAgICAgImxpYm1lZGlhX25ka2Zvcm1hdHByaXYiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyYmFzZS1kZWZhdWx0cyJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmV4dHJhY3RvcmZ1enplcmJhc2UiLAorICAgIF0sCisKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibXBlZzItZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXBlZzIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgICAgICJsaWJtcGVnMmV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJleHRyYWN0b3JmdXp6ZXJiYXNlIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyYmFzZS1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiRXh0cmFjdG9yRnV6emVyQmFzZS5jcHAiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDRfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXA0IiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgICAgICAibGlibXA0ZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1wNF9leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAid2F2X2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIndhdl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3dhdiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJmaWZvIiwKKyAgICAgICAgImxpYndhdmV4dHJhY3RvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImFtcl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL2FtciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJta3ZfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbWt2IiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYndlYm0iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYm1rdmV4dHJhY3RvciIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1rdl9leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm9nZ19leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL29nZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnZvcmJpc2lkZWMiLAorICAgICAgICAibGlib2dnZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm9nZ19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXBlZzJwc19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJtcGVnMi1leHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnMl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURNUEVHMlBTIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1wZWcycHNfZXh0cmFjdG9yX2Z1enplci5kaWN0IiwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1wZWcydHNfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsibXBlZzItZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAibXBlZzJfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibXBlZzJ0c19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXAzX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1wM19leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL21wMyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJmaWZvIiwKKyAgICAgICAgImxpYm1wM2V4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhYWNfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvYWFjIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiZmxhY19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvZmxhYyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAibGliZmxhY2V4dHJhY3RvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogImZsYWNfZXh0cmFjdG9yX2Z1enplci5kaWN0IiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9FeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9FeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU4NDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0V4dHJhY3RvckZ1enplckJhc2UuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJFeHRyYWN0b3JGdXp6ZXJCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworYm9vbCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpzZXREYXRhU291cmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1CdWZmZXJTb3VyY2UgPSBuZXcgQnVmZmVyU291cmNlKGRhdGEsIHNpemUpOworICBtRGF0YVNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGF0YVNvdXJjZSo+KG1CdWZmZXJTb3VyY2UuZ2V0KCkpOworICBpZiAoIW1EYXRhU291cmNlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OmdldEV4dHJhY3RvckRlZigpIHsKKyAgZmxvYXQgY29uZmlkZW5jZTsKKyAgdm9pZCogbWV0YSA9IG51bGxwdHI7CisgIEZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CisKKyAgRXh0cmFjdG9yRGVmIGV4dHJhY3RvckRlZiA9IEdFVEVYVFJBQ1RPUkRFRigpOworICBpZiAoZXh0cmFjdG9yRGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSkgeworICAgIGV4dHJhY3RvckRlZi51LnYyLnNuaWZmKG1EYXRhU291cmNlLT53cmFwKCksICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhKTsKKyAgfSBlbHNlIGlmIChleHRyYWN0b3JEZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgZXh0cmFjdG9yRGVmLnUudjMuc25pZmYobURhdGFTb3VyY2UtPndyYXAoKSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEpOworICB9CisKKyAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgZnJlZU1ldGEobWV0YSk7CisgIH0KK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpleHRyYWN0VHJhY2tzKCkgeworICBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgIGlmICghYnVmZmVyR3JvdXApIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgIE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2sodHJhY2tJbmRleCk7CisgICAgaWYgKCF0cmFjaykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGV4dHJhY3RUcmFjayh0cmFjaywgYnVmZmVyR3JvdXApOworICAgIGRlbGV0ZSB0cmFjazsKKyAgfQorICBkZWxldGUgYnVmZmVyR3JvdXA7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6ZXh0cmFjdFRyYWNrKE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrLCBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCkgeworICBDTWVkaWFUcmFjayogY1RyYWNrID0gd3JhcCh0cmFjayk7CisgIGlmICghY1RyYWNrKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gY1RyYWNrLT5zdGFydCh0cmFjaywgYnVmZmVyR3JvdXAtPndyYXAoKSk7CisgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgZnJlZShjVHJhY2spOworICAgIHJldHVybjsKKyAgfQorCisgIGRvIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciogYnVmZmVyID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgIH0gd2hpbGUgKHN0YXR1cyA9PSBBTUVESUFfT0spOworCisgIGNUcmFjay0+c3RvcCh0cmFjayk7CisgIGZyZWUoY1RyYWNrKTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpnZXRUcmFja3NNZXRhZGF0YSgpIHsKKyAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgIHVpbnQzMl90IGZsYWdzID0gTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGE7CisKKyAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgIG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoZm9ybWF0LCB0cmFja0luZGV4LCBmbGFncyk7CisgIH0KKworICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6Z2V0TWV0YWRhdGEoKSB7CisgIEFNZWRpYUZvcm1hdCogZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YShmb3JtYXQpOworICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6c2V0RGF0YVNvdXJjZUZsYWdzKHVpbnQzMl90IGZsYWdzKSB7CisgIG1CdWZmZXJTb3VyY2UtPnNldEZsYWdzKGZsYWdzKTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpzZWVrQW5kRXh0cmFjdFRyYWNrcygpIHsKKyAgTWVkaWFCdWZmZXJHcm91cCogYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICBpZiAoIWJ1ZmZlckdyb3VwKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICBNZWRpYVRyYWNrSGVscGVyKiB0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrSW5kZXgpOworICAgIGlmICghdHJhY2spIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdCogdHJhY2tNZXRhRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24gPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGE7CisgICAgbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0cmFja01ldGFEYXRhLCB0cmFja0luZGV4LCBmbGFncyk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZ0cmFja0R1cmF0aW9uKTsKKworICAgIHNlZWtBbmRFeHRyYWN0VHJhY2sodHJhY2ssIGJ1ZmZlckdyb3VwLCB0cmFja0R1cmF0aW9uKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrTWV0YURhdGEpOworICAgIGRlbGV0ZSB0cmFjazsKKyAgfQorICBkZWxldGUgYnVmZmVyR3JvdXA7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6c2Vla0FuZEV4dHJhY3RUcmFjayhNZWRpYVRyYWNrSGVscGVyKiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24pIHsKKyAgQ01lZGlhVHJhY2sqIGNUcmFjayA9IHdyYXAodHJhY2spOworICBpZiAoIWNUcmFjaykgeworICAgIHJldHVybjsKKyAgfQorCisgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOworICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgIGZyZWUoY1RyYWNrKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQzMl90IHNlZWtDb3VudCA9IDA7CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHNlZWtUb1RpbWVTdGFtcDsKKyAgd2hpbGUgKHNlZWtDb3VudCA8PSBrRnV6emVyTWF4U2Vla1BvaW50c0NvdW50KSB7CisgICAgLyogVGhpcyBlbnN1cmVzIGtGdXp6ZXJNYXhTZWVrUG9pbnRzQ291bnQgc2VlayBwb2ludHMgYXJlIHdpdGhpbiB0aGUgY2xpcER1cmF0aW9uIGFuZCAxIHNlZWsKKyAgICAgKiBwb2ludCBpcyBvdXRzaWRlIG9mIHRoZSBjbGlwRHVyYXRpb24uCisgICAgICovCisgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAoc2Vla0NvdW50ICogdHJhY2tEdXJhdGlvbikgLyAoa0Z1enplck1heFNlZWtQb2ludHNDb3VudCAtIDEpOworICAgIHNlZWtUb1RpbWVTdGFtcC5wdXNoX2JhY2sodGltZVN0YW1wKTsKKyAgICBzZWVrQ291bnQrKzsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzZWVrT3B0aW9uczsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DKTsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKTsKKworICBmb3IgKHVpbnQzMl90IHNlZWtPcHRpb24gOiBzZWVrT3B0aW9ucykgeworICAgIGZvciAoaW50NjRfdCBzZWVrUHRzIDogc2Vla1RvVGltZVN0YW1wKSB7CisgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyogb3B0aW9ucyA9CisgICAgICAgICAgbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKHNlZWtPcHRpb24sIHNlZWtQdHMpOworICAgICAgTWVkaWFCdWZmZXJIZWxwZXIqIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICB0cmFjay0+cmVhZCgmYnVmZmVyLCBvcHRpb25zKTsKKyAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICB9CisgICAgICBkZWxldGUgb3B0aW9uczsKKyAgICB9CisgIH0KKworICBjVHJhY2stPnN0b3AodHJhY2spOworICBmcmVlKGNUcmFjayk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6cHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNldERhdGFTb3VyY2UoZGF0YSwgc2l6ZSkpIHsKKyAgICBpZiAoY3JlYXRlRXh0cmFjdG9yKCkpIHsKKyAgICAgIGdldEV4dHJhY3RvckRlZigpOworICAgICAgZ2V0TWV0YWRhdGEoKTsKKyAgICAgIGV4dHJhY3RUcmFja3MoKTsKKyAgICAgIGdldFRyYWNrc01ldGFkYXRhKCk7CisgICAgICBzZWVrQW5kRXh0cmFjdFRyYWNrcygpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL1JFQURNRS5tZCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyM2I1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9SRUFETUUubWQKQEAgLTAsMCArMSwzMjYgQEAKKyMgRnV6emVyIGZvciBleHRyYWN0b3JzCisKKyMjIFRhYmxlIG9mIGNvbnRlbnRzCisrIFtsaWJleHRyYWN0b3JmdXp6ZXJiYXNlXSgjRXh0cmFjdG9yRnV6emVyQmFzZSkKKysgW2xpYm1wNGV4dHJhY3Rvcl0oI21wNEV4dHJhY3RvckZ1enplcikKKysgW2xpYndhdmV4dHJhY3Rvcl0oI3dhdkV4dHJhY3RvckZ1enplcikKKysgW2xpYmFtcmV4dHJhY3Rvcl0oI2FtckV4dHJhY3RvckZ1enplcikKKysgW2xpYm1rdmV4dHJhY3Rvcl0oI21rdkV4dHJhY3RvckZ1enplcikKKysgW2xpYm9nZ2V4dHJhY3Rvcl0oI29nZ0V4dHJhY3RvckZ1enplcikKKysgW2xpYm1wZWcyZXh0cmFjdG9yXSgjbXBlZzJFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJtcDNleHRyYWN0b3JdKCNtcDNFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJhYWNleHRyYWN0b3JdKCNhYWNFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJmbGFjZXh0cmFjdG9yXSgjZmxhY0V4dHJhY3RvcikKKworIyA8YSBuYW1lPSJFeHRyYWN0b3JGdXp6ZXJCYXNlIj48L2E+IEZ1enplciBmb3IgbGliZXh0cmFjdG9yZnV6emVyYmFzZQorQWxsIHRoZSBleHRyYWN0b3JzIGhhdmUgYSBjb21tb24gQVBJIC0gY3JlYXRpbmcgYSBkYXRhIHNvdXJjZSwgZXh0cmFjdGlvbgorb2YgYWxsIHRoZSB0cmFja3MsIGV0Yy4gVGhlc2UgY29tbW9uIEFQSXMgaGF2ZSBiZWVuIGFic3RyYWN0ZWQgaW4gYSBiYXNlIGNsYXNzCitjYWxsZWQgYEV4dHJhY3RvckZ1enplckJhc2VgIHRvIGVuc3VyZSBjb2RlIGlzIHJldXNlZCBiZXR3ZWVuIGZ1enplciBwbHVnaW5zLgorCitBZGRpdGlvbmFsbHksIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBhbHNvIGhhcyBzdXBwb3J0IGZvciBtZW1vcnkgYmFzZWQgYnVmZmVyCitgQnVmZmVyU291cmNlYCBzaW5jZSB0aGUgZnV6emluZyBlbmdpbmUgZmVlZHMgZGF0YSB1c2luZyBtZW1vcnkgYnVmZmVycyBhbmQKK3VzYWdlIG9mIHN0YW5kYXJkIGRhdGEgc291cmNlIG9iamVjdHMgbGlrZSBGaWxlU291cmNlLCBIVFRQU291cmNlLCBldGMuIGlzCitub3QgZmVhc2libGUuCisKKyMgPGEgbmFtZT0ibXA0RXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlibXA0ZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNUDQgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNUDQgZXh0cmFjdG9yIGNsYXNzLgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGUgKGRpY3Rpb25hcnkgZmlsZSkgaXMgY3JlYXRlZCBmb3IgTVA0IHRvIGVuc3VyZSB0aGF0IHRoZSByZXF1aXJlZCBNUDQKK2F0b21zIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQgYXMgYSByYW5nZSBvZiBNUDQgYXRvbXMgd2lsbCBiZQorcHJlc2VudCBpbiB0aGUgaW5wdXQgZGF0YS4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcDRfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXA0X2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBNUDQgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0id2F2RXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlid2F2ZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBXQVYgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBXQVYgZXh0cmFjdG9yIGNsYXNzLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIHdhdl9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSB3YXZfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIHdhdiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC93YXZfZXh0cmFjdG9yX2Z1enplci93YXZfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJhbXJFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJhbXJleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFNUiBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIEFNUiBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBBTVIgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGFtcl9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhbXJfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIEFNUiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hbXJfZXh0cmFjdG9yX2Z1enplci9hbXJfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJta3ZFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJta3ZleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1LViBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIE1LViBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBNS1YgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIGVsZW1lbnQKK0lEJ3MgYXJlIHByZXNlbnQgaW4gZXZlcnkgaW5wdXQgZmlsZSB0aGF0IGdvZXMgdG8gdGhlIGZ1enplci4KK1RoaXMgZW5zdXJlcyB0aGF0IGxhcmdlciBjb2RlIGdldHMgY292ZXJlZC4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBta3ZfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWt2X2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBta3YgZmlsZXMgdG8gdGhhdCBmb2xkZXIuCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21rdl9leHRyYWN0b3JfZnV6emVyL21rdl9leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im9nZ0V4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm9nZ2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgT0dHIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgT0dHIGV4dHJhY3RvciBvYmplY3QuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBPR0cgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG9nZ19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBvZ2dfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG9nZyBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0ibXBlZzJFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJtcGVnMmV4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbnMgZm9yIE1QRUcyLVBTIGFuZCBNUEVHMi1UUyBleHRyYWN0b3IgdXNlIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnQgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNUEVHMi1QUyBvciBNUEVHMi1UUyBleHRyYWN0b3IKK29iamVjdCByZXNwZWN0aXZlbHkuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZXMgKGRpY3Rpb25hcnkgZmlsZXMpIGFyZSBjcmVhdGVkIGZvciBNUEVHMi1QUyBhbmQgTVBFRzItVFMgdG8gZW5zdXJlIHRoYXQgdGhlCityZXF1aXJlZCBzdGFydCBieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisjIyMjIyBPdGhlciBjb25zaWRlcmF0aW9ucworVHdvIGZ1enplciBiaW5hcmllcyAtIG1wZWcycHNfZXh0cmFjdG9yX2Z1enplciBhbmQgbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIGFyZQorZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIGZsYWcgLSBgTVBFRzJQU2AKKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIgYW5kIG1wZWcydHNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXBlZzJwc19leHRyYWN0b3JfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBtcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBtcGVnMiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIvbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im1wM0V4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm1wM2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgTVAzIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgTVAzIGV4dHJhY3RvciBjbGFzcy4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcDNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXAzX2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBtcDMgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0iYWFjRXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGliYWFjZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBBQUMgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBBQUMgZXh0cmFjdG9yIGNsYXNzLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGFhY19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhYWNfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIGFhYyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hYWNfZXh0cmFjdG9yX2Z1enplci9hYWNfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJmbGFjRXh0cmFjdG9yIj48L2E+IEZ1enplciBmb3IgbGliZmxhY2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgRkxBQyBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIEZMQUMgZXh0cmFjdG9yIG9iamVjdC4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIEZMQUMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGZsYWNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgZmxhY19leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZmxhYyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIvZmxhY19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hYWNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTZjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBBYWNFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBBYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5BYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgQWFjRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgQUFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpLCAwKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBBYWNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBBYWNFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWUxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiQU1SRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBBbXJFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBBbXJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5BbXJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgQW1yRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgQU1SRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBBbXJFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBBbXJFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2Ftcl9leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1NzI2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlCitrdzE9IiMhQU1SIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzM0ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJGTEFDRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBGbGFjRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgRmxhY0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfkZsYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgRmxhY0V4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IEZMQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIEZsYWNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBGbGFjRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhZDQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDMgQEAKKyMgU3RhcnQgY29kZSAoYnl0ZXMgMC0zKQorIyBUaGUgYmVsb3cgNCBieXRlcyBjb3JyZXNwb25kIHRvICJmTGFDIiBpbiBBU0NJSQora3cxPSJceDY2XHg0Q1x4NjFceDQzIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2luY2x1ZGUvRXh0cmFjdG9yRnV6emVyQmFzZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2luY2x1ZGUvRXh0cmFjdG9yRnV6emVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmExYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvaW5jbHVkZS9FeHRyYWN0b3JGdXp6ZXJCYXNlLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaWZuZGVmIF9fRVhUUkFDVE9SX0ZVWlpFUl9CQVNFX0hfXworI2RlZmluZSBfX0VYVFJBQ1RPUl9GVVpaRVJfQkFTRV9IX18KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2V4dGVybiAiQyIgeworYW5kcm9pZDo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpOworfQorCitjb25zdGV4cHIgaW50MzJfdCBrRnV6emVyTWF4U2Vla1BvaW50c0NvdW50ID0gNTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIEV4dHJhY3RvckZ1enplckJhc2UoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkV4dHJhY3RvckZ1enplckJhc2UoKSB7CisgICAgaWYgKG1FeHRyYWN0b3IpIHsKKyAgICAgIGRlbGV0ZSBtRXh0cmFjdG9yOworICAgICAgbUV4dHJhY3RvciA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtQnVmZmVyU291cmNlKSB7CisgICAgICBtQnVmZmVyU291cmNlLmNsZWFyKCk7CisgICAgICBtQnVmZmVyU291cmNlID0gbnVsbHB0cjsKKyAgICB9CisgIH0KKworICAvKiogRnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBtZWRpYSBleHRyYWN0b3IgY29tcG9uZW50LgorICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgKi8KKyAgdmlydHVhbCBib29sIGNyZWF0ZUV4dHJhY3RvcigpID0gMDsKKworICAvKiogUGFyZW50IGNsYXNzIGZ1bmN0aW9ucyB0byBiZSByZXVzZWQgYnkgZGVyaXZlZCBjbGFzcy4KKyAgICAqIFRoZXNlIGFyZSBjb21tb24gZm9yIGFsbCBtZWRpYSBleHRyYWN0b3IgY29tcG9uZW50cy4KKyAgICAqLworICBib29sIHNldERhdGFTb3VyY2UoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgIHZvaWQgZ2V0RXh0cmFjdG9yRGVmKCk7CisKKyAgdm9pZCBleHRyYWN0VHJhY2tzKCk7CisKKyAgdm9pZCBnZXRNZXRhZGF0YSgpOworCisgIHZvaWQgZ2V0VHJhY2tzTWV0YWRhdGEoKTsKKworICB2b2lkIHNldERhdGFTb3VyY2VGbGFncyh1aW50MzJfdCBmbGFncyk7CisKKyAgdm9pZCBzZWVrQW5kRXh0cmFjdFRyYWNrcygpOworCisgIHZvaWQgcHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgcHJvdGVjdGVkOgorICBjbGFzcyBCdWZmZXJTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisgICBwdWJsaWM6CisgICAgQnVmZmVyU291cmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIDogbURhdGEoZGF0YSksIG1MZW5ndGgobGVuZ3RoKSB7fQorICAgIHZpcnR1YWwgfkJ1ZmZlclNvdXJjZSgpIHsgbURhdGEgPSBudWxscHRyOyB9CisKKyAgICB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKSB7IG1GbGFncyA9IGZsYWdzOyB9CisKKyAgICB1aW50MzJfdCBmbGFncygpIHsgcmV0dXJuIG1GbGFnczsgfQorCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gbURhdGEgIT0gbnVsbHB0ciA/IE9LIDogTk9fSU5JVDsgfQorCisgICAgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICBpZiAoIW1EYXRhKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgfQorCisgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgaWYgKChvZmZzZXQgPj0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4obUxlbmd0aCkpIHx8IChvZmZzZXQgPCAwKSkgeworICAgICAgICByZXR1cm4gMDsgIC8vIHJlYWQgYmV5b25kIGJvdW5kcy4KKyAgICAgIH0KKyAgICAgIHNpemVfdCBudW1BdmFpbGFibGUgPSBtTGVuZ3RoIC0gc3RhdGljX2Nhc3Q8c2l6ZV90PihvZmZzZXQpOworICAgICAgaWYgKHNpemUgPiBudW1BdmFpbGFibGUpIHsKKyAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCogc2l6ZSkgeworICAgICAgaWYgKCFtRGF0YSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgIH0KKworICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4obUxlbmd0aCk7CisgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3NpemVfdCByZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgIHZvaWQqIHJlc3VsdCA9IG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgc2l6ZSk7CisgICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGxwdHIgPyBzaXplIDogMDsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90KiBtRGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IG1MZW5ndGggPSAwOworICAgIE11dGV4IG1Mb2NrOworICAgIHVpbnQzMl90IG1GbGFncyA9IDA7CisKKyAgIHByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQnVmZmVyU291cmNlKTsKKyAgfTsKKworICBzcDxCdWZmZXJTb3VyY2U+IG1CdWZmZXJTb3VyY2U7CisgIERhdGFTb3VyY2UqIG1EYXRhU291cmNlID0gbnVsbHB0cjsKKyAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqIG1FeHRyYWN0b3IgPSBudWxscHRyOworCisgIHZpcnR1YWwgdm9pZCBleHRyYWN0VHJhY2soTWVkaWFUcmFja0hlbHBlciogdHJhY2ssIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwKTsKKyAgdmlydHVhbCB2b2lkIHNlZWtBbmRFeHRyYWN0VHJhY2soTWVkaWFUcmFja0hlbHBlciogdHJhY2ssIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfX0VYVFJBQ1RPUl9GVVpaRVJfQkFTRV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWI5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTWF0cm9za2FFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1LVkV4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIE1LVkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfk1LVkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNS1ZFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBNYXRyb3NrYUV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTUtWRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTUtWRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODE1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDI0NCBAQAorIyBFbGVtZW50cyBJRCdzCitrdzE9Ilx4NDJceDg2Igora3cyPSJceDQyXHhGNyIKK2t3Mz0iXHg0Mlx4RjIiCitrdzQ9Ilx4NDJceEYzIgora3c1PSJceDQyXHg4NyIKK2t3Nj0iXHg0Mlx4ODUiCitrdzc9Ilx4MThceDUzXHg4MFx4NjciCitrdzg9Ilx4MTFceDREXHg5Qlx4NzQiCitrdzk9Ilx4NERceEJCIgora3cxMD0iXHg1M1x4QUIiCitrdzExPSJceDUzXHhBQyIKK2t3MTI9Ilx4MTVceDQ5XHhBOVx4NjYiCitrdzEzPSJceDczXHhBNCIKK2t3MTQ9Ilx4NzNceDg0Igora3cxNT0iXHgzQ1x4QjlceDIzIgora3cxNj0iXHgzQ1x4ODNceEFCIgora3cxNz0iXHgzQ1x4QjlceDIzIgora3cxOD0iXHgzRVx4ODNceEJCIgora3cxOT0iXHg0NFx4NDQiCitrdzIwPSJceDY5XHgyNCIKK2t3MjE9Ilx4NjlceEZDIgora3cyMj0iXHg2OVx4QkYiCitrdzIzPSJceDY5XHhBNSIKK2t3MjQ9Ilx4MkFceEQ3XHhCMSIKK2t3MjU9Ilx4NDRceDg5Igora3cyNj0iXHg0NFx4NjEiCitrdzI3PSJceDdCXHhBOSIKK2t3Mjg9Ilx4NERceDgwIgora3cyOT0iXHg1N1x4NDEiCitrdzMwPSJceDFGXHg0M1x4QjZceDc1Igora3czMT0iXHhFNyIKK2t3MzI9Ilx4NThceDU0Igora3czMz0iXHg1OFx4RDciCitrdzM0PSJceEE3Igora3czNT0iXHhBQiIKK2t3MzY9Ilx4QTMiCitrdzM3PSJceEEwIgora3czOD0iXHhBMSIKK2t3Mzk9Ilx4QTIiCitrdzQwPSJceDc1XHhBMSIKK2t3NDE9Ilx4MkFceEQ3XHhCMSIKK2t3NDI9Ilx4QTYiCitrdzQzPSJceEVFIgora3c0ND0iXHhBNSIKK2t3NDU9Ilx4OUEiCitrdzQ2PSJceEZBIgora3c0Nz0iXHhGQiIKK2t3NDg9Ilx4RkQiCitrdzQ5PSJceEE0Igora3c1MD0iXHg3NVx4QTIiCitrdzUxPSJceDhFIgora3c1Mj0iXHhFOCIKK2t3NTM9Ilx4Q0MiCitrdzU0PSJceENEIgora3c1NT0iXHhDQiIKK2t3NTY9Ilx4Q0UiCitrdzU3PSJceENGIgora3c1OD0iXHhDOCIKK2t3NTk9Ilx4QzkiCitrdzYwPSJceENBIgora3c2MT0iXHhBRiIKK2t3NjI9Ilx4MTZceDU0XHhBRVx4NkIiCitrdzYzPSJceEFFIgora3c2ND0iXHhENyIKK2t3NjU9Ilx4NzNceEM1Igora3c2Nj0iXHg4MyIKK2t3Njc9Ilx4QjkiCitrdzY4PSJceDg4Igora3c2OT0iXHg1NVx4QUEiCitrdzcwPSJceDlDIgora3c3MT0iXHg2RFx4RTciCitrdzcyPSJceDZEXHhGOCIKK2t3NzM9Ilx4MjNceEUzXHg4MyIKK2t3NzQ9Ilx4MjNceDRFXHg3QSIKK2t3NzU9Ilx4MjNceDMxXHg0RiIKK2t3NzY9Ilx4NTNceDdGIgora3c3Nz0iXHg1NVx4RUUiCitrdzc4PSJceDUzXHg2RSIKK2t3Nzk9Ilx4MjJceEI1XHg5QyIKK2t3ODA9Ilx4MjJceEI1XHg5RCIKK2t3ODE9Ilx4ODYiCitrdzgyPSJceDYzXHhBMiIKK2t3ODM9Ilx4MjVceDg2XHg4OCIKK2t3ODQ9Ilx4MjZceEIyXHg0MCIKK2t3ODU9Ilx4QUEiCitrdzg2PSJceDZGXHhBQiIKK2t3ODc9Ilx4NTZceEFBIgora3c4OD0iXHg1Nlx4QkIiCitrdzg5PSJceDY2XHgyNCIKK2t3OTA9Ilx4NjZceEZDIgora3c5MT0iXHg2Nlx4QkYiCitrdzkyPSJceEUwIgora3c5Mz0iXHg5QSIKK2t3OTQ9Ilx4OUQiCitrdzk1PSJceDUzXHhCOCIKK2t3OTY9Ilx4NTNceEMwIgora3c5Nz0iXHg1M1x4QjkiCitrdzk4PSJceEIwIgora3c5OT0iXHhCQSIKK2t3MTAwPSJceDU0XHhBQSIKK2t3MTAxPSJceDU0XHhCQiIKK2t3MTAyPSJceDU0XHhDQyIKK2t3MTAzPSJceDU0XHhERCIKK2t3MTA0PSJceDU0XHhCMCIKK2t3MTA1PSJceDU0XHhCQSIKK2t3MTA2PSJceDU0XHhCMiIKK2t3MTA3PSJceDU0XHhCMyIKK2t3MTA4PSJceDJFXHhCNVx4MjQiCitrdzEwOT0iXHgyRlx4QjVceDIzIgora3cxMTA9Ilx4MjNceDgzXHhFMyIKK2t3MTExPSJceDU1XHhCMCIKK2t3MTEyPSJceDU1XHhCMSIKK2t3MTEzPSJceDU1XHhCMiIKK2t3MTE0PSJceDU1XHhCMyIKK2t3MTE1PSJceDU1XHhCNCIKK2t3MTE2PSJceDU1XHhCNSIKK2t3MTE3PSJceDU1XHhCNiIKK2t3MTE4PSJceDU1XHhCNyIKK2t3MTE5PSJceDU1XHhCOCIKK2t3MTIwPSJceDU1XHhCOSIKK2t3MTIxPSJceDU1XHhCQSIKK2t3MTIyPSJceDU1XHhCQiIKK2t3MTIzPSJceDU1XHhCQyIKK2t3MTI0PSJceDU1XHhCRCIKK2t3MTI1PSJceDU1XHhEMCIKK2t3MTI2PSJceDU1XHhEMSIKK2t3MTI3PSJceDU1XHhEMiIKK2t3MTI4PSJceDU1XHhEMyIKK2t3MTI5PSJceDU1XHhENCIKK2t3MTMwPSJceDU1XHhENSIKK2t3MTMxPSJceDU1XHhENiIKK2t3MTMyPSJceDU1XHhENyIKK2t3MTMzPSJceDU1XHhEOCIKK2t3MTM0PSJceDU1XHhEOSIKK2t3MTM1PSJceDU1XHhEQSIKK2t3MTM2PSJceDc2XHg3MCIKK2t3MTM3PSJceDc2XHg3MSIKK2t3MTM4PSJceDc2XHg3MiIKK2t3MTM5PSJceDc2XHg3MyIKK2t3MTQwPSJceDc2XHg3NCIKK2t3MTQxPSJceDc2XHg3NSIKK2t3MTQyPSJceEUxIgora3cxNDM9Ilx4QjUiCitrdzE0ND0iXHg3OFx4QjUiCitrdzE0NT0iXHg5RiIKK2t3MTQ2PSJceDdEXHg3QiIKK2t3MTQ3PSJceDYyXHg2NCIKK2t3MTQ4PSJceEUyIgora3cxNDk9Ilx4RTMiCitrdzE1MD0iXHhFNCIKK2t3MTUxPSJceEU1Igora3cxNTI9Ilx4RTYiCitrdzE1Mz0iXHhFOSIKK2t3MTU0PSJceEVEIgora3cxNTU9Ilx4QzAiCitrdzE1Nj0iXHhDMSIKK2t3MTU3PSJceEM2Igora3cxNTg9Ilx4QzciCitrdzE1OT0iXHhDNCIKK2t3MTYwPSJceDZEXHg4MCIKK2t3MTYxPSJceDYyXHg0MCIKK2t3MTYyPSJceDUwXHgzMSIKK2t3MTYzPSJceDUwXHgzMiIKK2t3MTY0PSJceDUwXHgzMyIKK2t3MTY1PSJceDUwXHgzNCIKK2t3MTY2PSJceDUwXHgzNSIKK2t3MTY3PSJceDQyXHg1NCIKK2t3MTY4PSJceDQyXHg1NSIKK2t3MTY5PSJceDQ3XHhFMSIKK2t3MTcwPSJceDQ3XHhFMiIKK2t3MTcxPSJceDQ3XHhFNyIKK2t3MTcyPSJceDQ3XHhFOCIKK2t3MTczPSJceDQ3XHhFMyIKK2t3MTc0PSJceDQ3XHhFNCIKK2t3MTc1PSJceDQ3XHhFNSIKK2t3MTc2PSJceDQ3XHhFNiIKK2t3MTc3PSJceDFDXHg1M1x4QkJceDZCIgora3cxNzg9Ilx4QkIiCitrdzE3OT0iXHhCMyIKK2t3MTgwPSJceEI3Igora3cxODE9Ilx4RjciCitrdzE4Mj0iXHhGMSIKK2t3MTgzPSJceEYwIgora3cxODQ9Ilx4QjIiCitrdzE4NT0iXHg1M1x4NzgiCitrdzE4Nj0iXHhFQSIKK2t3MTg3PSJceERCIgora3cxODg9Ilx4OTYiCitrdzE4OT0iXHg5NyIKK2t3MTkwPSJceDUzXHg1RiIKK2t3MTkxPSJceEVCIgora3cxOTI9Ilx4MTlceDQxXHhBNFx4NjkiCitrdzE5Mz0iXHg0Nlx4N0UiCitrdzE5ND0iXHg0Nlx4NkUiCitrdzE5NT0iXHg0Nlx4NjAiCitrdzE5Nj0iXHg0Nlx4NUMiCitrdzE5Nz0iXHg0Nlx4QUUiCitrdzE5OD0iXHg0Nlx4NzUiCitrdzE5OT0iXHg0Nlx4NjEiCitrdzIwMD0iXHg0Nlx4NjIiCitrdzIwMT0iXHgxMFx4NDNceEE3XHg3MCIKK2t3MjAyPSJceDQ1XHhCOSIKK2t3MjAzPSJceDQ1XHhCQyIKK2t3MjA0PSJceDQ1XHhCRCIKK2t3MjA1PSJceDQ1XHhEQiIKK2t3MjA2PSJceDQ1XHhERCIKK2t3MjA3PSJceEI2Igora3cyMDg9Ilx4NzNceEM0Igora3cyMDk9Ilx4NTZceDU0Igora3cyMTA9Ilx4OTEiCitrdzIxMT0iXHg5MiIKK2t3MjEyPSJceDk4Igora3cyMTM9Ilx4NDVceDk4Igora3cyMTQ9Ilx4NkVceDY3Igora3cyMTU9Ilx4NkVceEJDIgora3cyMTY9Ilx4NjNceEMzIgora3cyMTc9Ilx4OEYiCitrdzIxOD0iXHg4OSIKK2t3MjE5PSJceDgwIgora3cyMjA9Ilx4ODUiCitrdzIyMT0iXHg0M1x4N0MiCitrdzIyMj0iXHg0M1x4N0QiCitrdzIyMz0iXHg0M1x4N0UiCitrdzIyND0iXHg2OVx4NDQiCitrdzIyNT0iXHg2OVx4NTUiCitrdzIyNj0iXHg0NVx4MEQiCitrdzIyNz0iXHg2OVx4MTEiCitrdzIyOD0iXHg2OVx4MjIiCitrdzIyOT0iXHg2OVx4MzMiCitrdzIzMD0iXHgxMlx4NTRceEMzXHg2NyIKK2t3MjMxPSJceDczXHg3MyIKK2t3MjMyPSJceDYzXHhDMCIKK2t3MjMzPSJceDY4XHhDQSIKK2t3MjM0PSJceDYzXHhDQSIKK2t3MjM1PSJceDYzXHhDNSIKK2t3MjM2PSJceDYzXHhDOSIKK2t3MjM3PSJceDY3XHhDOCIKK2t3MjM4PSJceDQ1XHhBMyIKK2t3MjM5PSJceDQ0XHg3QSIKK2t3MjQwPSJceDQ0XHg3QiIKK2t3MjQxPSJceDQ0XHg4NCIKK2t3MjQyPSJceDQ0XHg4NyIKK2t3MjQzPSJceDQ0XHg4NSIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDdjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTVAzRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNcDNFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBNcDNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NcDNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgTXAzRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgTVAzRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpLCBudWxscHRyKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNcDNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBNcDNFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDM1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTVA0RXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgTVA0RXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+TVA0RXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIE1QNEV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IE1QRUc0RXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgc2V0RGF0YVNvdXJjZUZsYWdzKERhdGFTb3VyY2VCYXNlOjprV2FudHNQcmVmZXRjaGluZyB8IERhdGFTb3VyY2VCYXNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTVA0RXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTVA0RXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODM2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDI0OCBAQAorIyBNUDQgQXRvbXMvQm94ZXMKK2t3MT0iZnR5cCIKK2t3Mj0iZnJlZSIKK2t3Mz0ibWRhdCIKK2t3ND0ibW9vdiIKK2t3NT0ibXZoZCIKK2t3Nj0idHJhayIKK2t3Nz0idGtoZCIKK2t3OD0iZWR0cyIKK2t3OT0iZWxzdCIKK2t3MTA9Im1kaWEiCitrdzExPSJtZGhkIgora3cxMj0iaGRsciIKK2t3MTM9Im1pbmYiCitrdzE0PSJ2bWhkIgora3cxNT0iZGluZiIKK2t3MTY9ImRyZWYiCitrdzE3PSJ1cmwgIgora3cxOD0ic3RibCIKK2t3MTk9InN0c2QiCitrdzIwPSJhdmMxIgora3cyMT0iYXZjQyIKK2t3MjI9InN0dHMiCitrdzIzPSJzdHNzIgora3cyND0iY3R0cyIKK2t3MjU9InN0c2MiCitrdzI2PSJzdHN6Igora3cyNz0ic3RjbyIKK2t3Mjg9Im1wNGEiCitrdzI5PSJlc2RzIgora3czMD0idWR0YSIKK2t3MzE9Im1ldGEiCitrdzMyPSJpbHN0Igora3czMz0ic2FtciIKK2t3MzQ9InNhd2IiCitrdzM1PSJlYy0zIgora3czNj0ibXA0diIKK2t3Mzc9InMyNjMiCitrdzM4PSJoMjYzIgora3czOT0iSDI2MyIKK2t3NDA9ImF2YzEiCitrdzQxPSJodmMxIgora3c0Mj0iaGV2MSIKK2t3NDM9ImFjLTQiCitrdzQ0PSJPcHVzIgora3c0NT0idHdvcyIKK2t3NDY9InNvd3QiCitrdzQ3PSJhbGFjIgora3c0OD0iZkxhQyIKK2t3NDk9ImF2MDEiCitrdzUwPSIubXAzIgora3c1MT0ia2V5cyIKK2t3NTI9ImNwcnQiCitrdzUzPSJjb3ZyIgora3c1ND0ibXZleCIKK2t3NTU9Im1vb2YiCitrdzU2PSJ0cmFmIgora3c1Nz0ibWZyYSIKK2t3NTg9InNpbmYiCitrdzU5PSJzY2hpIgora3c2MD0id2F2ZSIKK2t3NjE9InNjaG0iCitrdzYyPSJjYmMxIgora3c2Mz0iY2JjcyIKK2t3NjQ9ImNlbmMiCitrdzY1PSJjZW5zIgora3c2Nj0iZnJtYSIKK2t3Njc9InRlbmMiCitrdzY4PSJ0cmVmIgora3c2OT0idGhtYiIKK2t3NzA9InBzc2giCitrdzcxPSJtZXR0Igora3c3Mj0iZW5jYSIKK2t3NzM9ImVuY3YiCitrdzc0PSJjbzY0Igora3c3NT0ic3R6MiIKK2t3NzY9Ilx4QTl4eXoiCitrdzc3PSJidHJ0Igora3c3OD0iaHZjQyIKK2t3Nzk9ImF2MUMiCitrdzgwPSJkMjYzIgora3c4MT0iaWxvYyIKK2t3ODI9ImlpbmYiCitrdzgzPSJpcHJwIgora3c4ND0icGl0bSIKK2t3ODU9ImlkYXQiCitrdzg2PSJpcmVmIgora3c4Nz0iaXBybyIKK2t3ODg9Im1lYW4iCitrdzg5PSJuYW1lIgora3c5MD0iZGF0YSIKK2t3OTE9Im1laGQiCitrdzkyPSJ0ZXh0Igora3c5Mz0ic2J0bCIKK2t3OTQ9InRyZXgiCitrdzk1PSJ0eDNnIgora3c5Nj0iY29sciIKK2t3OTc9InRpdGwiCitrdzk4PSJwZXJmIgora3c5OT0iYXV0aCIKK2t3MTAwPSJnbnJlIgora3cxMDE9ImFsYm0iCitrdzEwMj0ieXJyYyIKK2t3MTAzPSJJRDMyIgora3cxMDQ9Ii0tLS0iCitrdzEwNT0ic2lkeCIKK2t3MTA2PSJhYy0zIgora3cxMDc9InF0ICAiCitrdzEwOD0ibWlmMSIKK2t3MTA5PSJoZWljIgora3cxMTA9ImRhYzQiCitrdzExMT0iZGVjMyIKK2t3MTEyPSJkYWMzIgora3cxMTM9Ilx4QTlhbGIiCitrdzExND0iXHhBOUFSVCIKK2t3MTE1PSJhQVJUIgora3cxMTY9Ilx4QTlkYXkiCitrdzExNz0iXHhBOW5hbSIKK2t3MTE4PSJceEE5d3J0Igora3cxMTk9Ilx4QTlnZW4iCitrdzEyMD0iY3BpbCIKK2t3MTIxPSJ0cmtuIgora3cxMjI9ImRpc2siCitrdzEyMz0ibmNseCIKK2t3MTI0PSJuY2xjIgora3cxMjU9InRmaGQiCitrdzEyNj0idHJ1biIKK2t3MTI3PSJzYWl6Igora3cxMjg9InNhaW8iCitrdzEyOT0ic2VuYyIKK2t3MTMwPSJpc29tIgora3cxMzE9ImlzbzIiCitrdzEzMj0iM2dwNCIKK2t3MTMzPSJtcDQxIgora3cxMzQ9Im1wNDIiCitrdzEzNT0iZGFzaCIKK2t3MTM2PSJudnIxIgora3cxMzc9Ik1TTlYiCitrdzEzOD0id21mICIKK2t3MTM5PSIzZzJhIgora3cxNDA9IjNnMmIiCitrdzE0MT0ibXNmMSIKK2t3MTQyPSJoZXZjIgora3cxNDM9InBkaW4iCitrdzE0ND0idHJnciIKK2t3MTQ1PSJzbWhkIgora3cxNDY9ImhtaGQiCitrdzE0Nz0ibm1oZCIKK2t3MTQ4PSJjc2xnIgora3cxNDk9InN0c2giCitrdzE1MD0icGFkYiIKK2t3MTUxPSJzdGRwIgora3cxNTI9InNkdHAiCitrdzE1Mz0ic2JncCIKK2t3MTU0PSJzZ3BkIgora3cxNTU9InN1YnMiCitrdzE1Nj0ibGV2YSIKK2t3MTU3PSJtZmhkIgora3cxNTg9InRmZHQiCitrdzE1OT0idGZyYSIKK2t3MTYwPSJtZnJvIgora3cxNjE9InNraXAiCitrdzE2Mj0idHNlbCIKK2t3MTYzPSJzdHJrIgora3cxNjQ9InN0cmkiCitrdzE2NT0ic3RyZCIKK2t3MTY2PSJ4bWwgIgora3cxNjc9ImJ4bWwiCitrdzE2OD0iZmlpbiIKK2t3MTY5PSJwYWVuIgora3cxNzA9ImZpcmUiCitrdzE3MT0iZnBhciIKK2t3MTcyPSJmZWNyIgora3cxNzM9InNlZ3IiCitrdzE3ND0iZ2l0biIKK2t3MTc1PSJtZWNvIgora3cxNzY9Im1lcmUiCitrdzE3Nz0ic3R5cCIKK2t3MTc4PSJzc2l4Igora3cxNzk9InByZnQiCitrdzE4MD0iaGludCIKK2t3MTgxPSJjZHNjIgora3cxODI9ImhpbmQiCitrdzE4Mz0idmRlcCIKK2t3MTg0PSJ2cGx4Igora3cxODU9Im1zcmMiCitrdzE4Nj0idXJuICIKK2t3MTg3PSJlbmN0Igora3cxODg9ImVuY3MiCitrdzE4OT0icmluZiIKK2t3MTkwPSJzcnBwIgora3cxOTE9InN0c2ciCitrdzE5Mj0ic3R2aSIKK2t3MTkzPSJ0aW1zIgora3cxOTQ9InRzcm8iCitrdzE5NT0ic25ybyIKK2t3MTk2PSJydHAgIgora3cxOTc9InNydHAiCitrdzE5OD0icnRwbyIKK2t3MTk5PSJobnRpIgora3cyMDA9InNkcCAiCitrdzIwMT0idHJweSIKK2t3MjAyPSJudW1wIgora3cyMDM9InRweWwiCitrdzIwND0idG90bCIKK2t3MjA1PSJucGNrIgora3cyMDY9InRwYXkiCitrdzIwNz0ibWF4ciIKK2t3MjA4PSJkbWVkIgora3cyMDk9ImRpbW0iCitrdzIxMD0iZHJlcCIKK2t3MjExPSJ0bWluIgora3cyMTI9InRtYXgiCitrdzIxMz0icG1heCIKK2t3MjE0PSJkbWF4Igora3cyMTU9InBheXQiCitrdzIxNj0iZmRwICIKK2t3MjE3PSJmZHNhIgora3cyMTg9ImZkcGEiCitrdzIxOT0iZXh0ciIKK2t3MjIwPSJmZWNpIgora3cyMjE9InJtMnQiCitrdzIyMj0ic20ydCIKK2t3MjIzPSJ0UEFUIgora3cyMjQ9InRQTVQiCitrdzIyNT0idE9EICIKK2t3MjI2PSJ0c3RpIgora3cyMjc9ImlzdG0iCitrdzIyOD0icG0ydCIKK2t3MjI5PSJycnRwIgora3cyMzA9InJzc3IiCitrdzIzMT0icnNjciIKK2t3MjMyPSJyc3JwIgora3cyMzM9InJzc3IiCitrdzIzND0iY2NpZCIKK2t3MjM1PSJzcm9jIgora3cyMzY9InBydHAiCitrdzIzNz0icm9sbCIKK2t3MjM4PSJyYXNoIgora3cyMzk9ImFsc3QiCitrdzI0MD0icmFwICIKK2t3MjQxPSJ0ZWxlIgora3cyNDI9Im1wNzEiCitrdzI0Mz0iaXNvMyIKK2t3MjQ0PSJpc280Igora3cyNDU9ImlzbzUiCitrdzI0Nj0icmVzdiIKK2t3MjQ3PSJpc282IgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGVmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpZmRlZiBNUEVHMlBTCisjaW5jbHVkZSAiTVBFRzJQU0V4dHJhY3Rvci5oIgorI2Vsc2UKKyNpbmNsdWRlICJNUEVHMlRTRXh0cmFjdG9yLmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1QRUcyRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgTVBFRzJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NUEVHMkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNUEVHMkV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworI2lmZGVmIE1QRUcyUFMKKyAgbUV4dHJhY3RvciA9IG5ldyBNUEVHMlBTRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyNlbHNlCisgIG1FeHRyYWN0b3IgPSBuZXcgTVBFRzJUU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisjZW5kaWYKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNUEVHMkV4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IE1QRUcyRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkMzkwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDIgQEAKKyMgU3RhcnQgY29kZSAoYnl0ZXMgMC0zKQora3cxPSJceDAwXHgwMFx4MDFceEJBIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcydHNfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcydHNfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmExZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGJ5dGUKK2t3MT0iXHg0NyIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmZjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiT2dnRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBPR0dFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBPR0dFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5PR0dFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgT0dHRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgT2dnRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBPR0dFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBPR0dFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL29nZ19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyZmMzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMyBAQAorIyBTdGFydCBjb2RlKGJ5dGVzIDAtMykKKyMgVGhlIGJlbG93IDQgYnl0ZXMgY29ycmVzcG9uZCB0byAiT2dnUyIgaW4gQVNDSUkKK2t3MT0iXHg0Rlx4NjdceDY3XHg1MyIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy93YXZfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvd2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTFlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvd2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiV0FWRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyB3YXZFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICB3YXZFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH53YXZFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgd2F2RXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICB3YXZFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyB3YXZFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCmluZGV4IDdhZDhjYzEuLjMzMGQ0ZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icApAQCAtMjEsNCArMjEsMTIgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKaW5kZXggYjg4ZTRlOC4uZmQ2YThjNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMTg4OCwxMyArMTg4OCwxMiBAQAogCiAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdDb3VudCgpOyBpKyspIHsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2RpbmcgKmVuY29kaW5nID0gdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0J5SW5kZXgoaSk7Ci0gICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkNvdW50KCk7IGorKykgeworICAgICAgICBpZiAoZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpID4gMCkgewogICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2Rpbmc6OkNvbnRlbnRFbmNyeXB0aW9uICplbmNyeXB0aW9uOwotICAgICAgICAgICAgZW5jcnlwdGlvbiA9IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQnlJbmRleChqKTsKKyAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoMCk7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKHRyYWNrSW5mby0+bU1ldGEsCiAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKICAgICAgICAgICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0Q29tcHJlc3Npb25Db3VudCgpOyBqKyspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCmluZGV4IDEwMmFjODEuLjdkNzA1NDggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icApAQCAtMTMsNCArMTMsMTEgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAppbmRleCBlNDhlMWI3Li5hZmEwNTVmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKQEAgLTE2LDQgKzE2LDEyIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAppbmRleCAwNzczMzg3Li4yNTk5YzJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKQEAgLTU0NiwxMSArNTQ2LDExIEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiSW1hZ2UgaXRlbSBpZCAlZCB1c2VzIHRodW1ibmFpbCBpdGVtIGlkICVkIiwgbVJlZnNbaV0sIG1JdGVtSWQpOwotICAgICAgICAgICAgSW1hZ2VJdGVtICZtYXN0ZXJJbWFnZSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOwotICAgICAgICAgICAgaWYgKCFtYXN0ZXJJbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEltYWdlSXRlbSAmaW1hZ2VJdGVtID0gaXRlbUlkVG9JdGVtTWFwLmVkaXRWYWx1ZUF0KGl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAoIWltYWdlSXRlbS50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiYWxyZWFkeSBoYXMgdGh1bWJuYWlscyEiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hc3RlckltYWdlLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOworICAgICAgICAgICAgaW1hZ2VJdGVtLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTkyOSw3ICs5MjksNyBAQAogCiBzdGF0dXNfdCBJcGNvQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKICAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotICAgIC8vIHB1c2ggZHVtbXkgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKKyAgICAvLyBwdXNoIGEgcGxhY2Vob2xkZXIgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKICAgICBtSXRlbVByb3BlcnRpZXMtPnB1c2hfYmFjayhuZXcgSXRlbVByb3BlcnR5KCkpOwogICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOwogfQpAQCAtMTYxNCwxNyArMTYxNCwxNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHVpbnQzMl90IG1hc3Rlckl0ZW1JbmRleCA9IG1EaXNwbGF5YWJsZXNbaW1hZ2VJbmRleF07CisgICAgdWludDMyX3QgaW1hZ2VJdGVtSW5kZXggPSBtRGlzcGxheWFibGVzW2ltYWdlSW5kZXhdOwogCi0gICAgY29uc3QgSW1hZ2VJdGVtICZtYXN0ZXJJbWFnZSA9IG1JdGVtSWRUb0l0ZW1NYXBbbWFzdGVySXRlbUluZGV4XTsKLSAgICBpZiAobWFzdGVySW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7Ci0gICAgICAgICppdGVtSW5kZXggPSBtYXN0ZXJJdGVtSW5kZXg7CisgICAgY29uc3QgSW1hZ2VJdGVtICZpbWFnZUl0ZW0gPSBtSXRlbUlkVG9JdGVtTWFwW2ltYWdlSXRlbUluZGV4XTsKKyAgICBpZiAoaW1hZ2VJdGVtLnRodW1ibmFpbHMuZW1wdHkoKSkgeworICAgICAgICAqaXRlbUluZGV4ID0gaW1hZ2VJdGVtSW5kZXg7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzc2l6ZV90IHRodW1iSXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KG1hc3RlckltYWdlLnRodW1ibmFpbHNbMF0pOworICAgIHNzaXplX3QgdGh1bWJJdGVtSW5kZXggPSBtSXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkoaW1hZ2VJdGVtLnRodW1ibmFpbHNbMF0pOwogICAgIGlmICh0aHVtYkl0ZW1JbmRleCA8IDApIHsKLSAgICAgICAgLy8gRG8gbm90IHJldHVybiB0aGUgbWFzdGVyIGltYWdlIGluIHRoaXMgY2FzZSwgZmFpbCBpdCBzbyB0aGF0IHRoZQorICAgICAgICAvLyBEbyBub3QgcmV0dXJuIHRoZSBpbWFnZSBpdGVtIGluIHRoaXMgY2FzZSwgZmFpbCBpdCBzbyB0aGF0IHRoZQogICAgICAgICAvLyB0aHVtYm5haWwgZXh0cmFjdGlvbiBjb2RlIGtub3dzIHdlIHJlYWxseSBkb24ndCBoYXZlIGl0LgogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTk3NmEyYi4uNjViYTM4MgotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0zNzIsNiArMzcyLDggQEAKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDOwogICAgICAgICBjYXNlIEZPVVJDQygiYXYwMSIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKKyAgICAgICAgY2FzZSBGT1VSQ0MoInZwMDkiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiAgICAgICAgIGNhc2UgRk9VUkNDKCIubXAzIik6CiAgICAgICAgIGNhc2UgMHg2RDczMDA1NTogLy8gIm1zIFUiIG1wMyBhdWRpbwogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7CkBAIC0xMTQ5LDcgKzExNTEsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygibW9vdiIpKSB7CiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBSZXR1cm4gYSBkdW1teSBlcnJvci4KKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGdlbmVyaWMgZXJyb3IuCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTc4Nyw3ICsxNzg5LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgLy8gd2UgY2FuIGdldCBkYXRhX3JlZl9pbmRleCB2YWx1ZSBmcm9tIFUxNl9BVCgmYnVmZmVyWzZdKQogICAgICAgICAgICAgdWludDE2X3QgdmVyc2lvbiA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKICAgICAgICAgICAgIHVpbnQzMl90IG51bV9jaGFubmVscyA9IFUxNl9BVCgmYnVmZmVyWzE2XSk7CiAKQEAgLTE5NzIsNiArMTk3NCw3IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJkdmgxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJkYXYxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ2cDA5Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzc4XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgewpAQCAtMTk4NCw3ICsxOTg3LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgLy8gd2UgY2FuIGdldCBkYXRhX3JlZl9pbmRleCB2YWx1ZSBmcm9tIFUxNl9BVCgmYnVmZmVyWzZdKQogICAgICAgICAgICAgdWludDE2X3Qgd2lkdGggPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMThdKTsKICAgICAgICAgICAgIHVpbnQxNl90IGhlaWdodCA9IFUxNl9BVCgmYnVmZmVyWzYgKyAyMF0pOwogCkBAIC0yNDM0LDYgKzI0MzcsOCBAQAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygidnBjQyIpOgogICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKQEAgLTM0MDcsNyArMzQxMiw3IEBACiAgICAgfQogCiAgICAgLy8gc2tpcAotICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKKyAgICBici5za2lwQml0cygzKTsgLy8gYnNtb2QKIAogICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKICAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7CkBAIC0zNzE4LDE5ICszNzIzLDE4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50NjRfdCBjdGltZSBfX3VudXNlZCwgbXRpbWUgX191bnVzZWQsIGR1cmF0aW9uIF9fdW51c2VkOwogICAgIGludDMyX3QgaWQ7CiAKICAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgIGN0aW1lID0gVTY0X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBtdGltZSA9IFU2NF9BVCgmYnVmZmVyWzEyXSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgY3RpbWUgdmFsdWUgZnJvbSBVNjRfQVQoJmJ1ZmZlcls0XSkKKyAgICAgICAgLy8gd2UgY2FuIGdldCBtdGltZSB2YWx1ZSBmcm9tIFU2NF9BVCgmYnVmZmVyWzEyXSkKICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOwotICAgICAgICBkdXJhdGlvbiA9IFU2NF9BVCgmYnVmZmVyWzI4XSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgZHVyYXRpb24gdmFsdWUgZnJvbSBVNjRfQVQoJmJ1ZmZlclsyOF0pCiAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgY3RpbWUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIG10aW1lID0gVTMyX0FUKCZidWZmZXJbOF0pOworICAgICAgICAvLyB3ZSBjYW4gZ2V0IGN0aW1lIHZhbHVlIGZyb20gVTMyX0FUKCZidWZmZXJbNF0pCisgICAgICAgIC8vIHdlIGNhbiBnZXQgbXRpbWUgdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlcls4XSkKICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsxMl0pOwotICAgICAgICBkdXJhdGlvbiA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgZHVyYXRpb24gdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlclsyMF0pCiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KQEAgLTQzMzcsNiArNDM0MSwxOCBAQAogICAgICAgICBpZiAoc2l6ZSA8IDUgfHwgcHRyWzBdICE9IDB4ODEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpKSB7CisgICAgICAgIHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIGlmIChzaXplIDwgNSB8fCBwdHJbMF0gIT0gMHgwMSkgeyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBBTE9HVigidHJhY2stPmVsc3Rfc2hpZnRfc3RhcnRfdGlja3MgOiUiIFBSSXU2NCwgdHJhY2stPmVsc3Rfc2hpZnRfc3RhcnRfdGlja3MpOwpAQCAtNDM5MSw2ICs0NDA3LDEwIEBACiAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CkBAIC00NjM4LDE4ICs0NjU4LDE3IEBACiAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YmwgMS4xMwogICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZSBfX3VudXNlZDsKICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxNSkgewogICAgICAgICAgICAgaWYgKGNzZF9zaXplIDwgOCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDI0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOworICAgICAgICAgICAgYnIuc2tpcEJpdHMoMjQpOyAvLyBleHRTYW1wbGVSYXRlCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZXh0RnJlcUluZGV4ID09IDEzIHx8IGV4dEZyZXFJbmRleCA9PSAxNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHRTYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtleHRGcmVxSW5kZXhdOworICAgICAgICAgICAgLy9leHRTYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtleHRGcmVxSW5kZXhdOwogICAgICAgICB9CiAgICAgICAgIC8vVE9ETzogc2F2ZSB0aGUgZXh0ZW5zaW9uIHNhbXBsaW5nIHJhdGUgdmFsdWUgaW4gbWV0YSBkYXRhID0+CiAgICAgICAgIC8vICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKQEAgLTQ2OTIsMTMgKzQ3MTEsMTMgQEAKICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX1NDQUwgfHwKICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7CiAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDIpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lTGVuZ3RoRmxhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICBici5za2lwQml0cygxKTsgLy8gZnJhbWVMZW5ndGhGbGFnCiAKICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVwZW5kc09uQ29yZUNvZGVyID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlciApIHsKICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgX191bnVzZWQgPSBici5nZXRCaXRzKDE0KTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxNCk7IC8vIGNvcmVDb2RlckRlbGF5CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgZXh0ZW5zaW9uRmxhZyA9IC0xOwpAQCAtNDczMCw2NCArNDc0OSw2NCBAQAogICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMzIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBFbGVtZW50SW5zdGFuY2VUYWcgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHJvZmlsZSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMik7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gRWxlbWVudEluc3RhbmNlVGFnCisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMik7IC8vIFByb2ZpbGUKKyAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gU2FtcGxpbmdGcmVxdWVuY3lJbmRleAogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtRnJvbnRDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtU2lkZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUxmZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoMik7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Bc3NvY0RhdGFFbGVtZW50cyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMyk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1WYWxpZENjRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDMpOyAvLyBOdW1Bc3NvY0RhdGFFbGVtZW50cworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBOdW1WYWxpZENjRWxlbWVudHMKIAogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIE1vbm9NaXhkb3duRWxlbWVudE51bWJlcgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoU3RlcmVvTWl4ZG93blByZXNlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMykgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDIpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFBzZXVkb1N1cnJvdW5kRW5hYmxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMik7IC8vIE1hdHJpeE1peGRvd25JbmRleAorICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cygxKTsgLy8gUHNldWRvU3Vycm91bmRFbmFibGUKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gRnJvbnRFbGVtZW50VGFnU2VsZWN0CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEZyb250RWxlbWVudElzQ3BlID8gMiA6IDE7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIFNpZGVFbGVtZW50VGFnU2VsZWN0CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gQmFja0VsZW1lbnRUYWdTZWxlY3QKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gQmFja0VsZW1lbnRJc0NwZSA/IDIgOiAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IGNoYW5uZWxzTnVtOwogCiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTGZlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBMZmVFbGVtZW50VGFnU2VsZWN0CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsc051bSA9ICVkIiwgY2hhbm5lbHNOdW0pOwpAQCAtNTc2Niw3ICs1Nzg1LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gYXBwbHkgc29tZSBzYW5pdHkgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCisgICAgICAgIC8vIGFwcGx5IHNvbWUgcXVpY2sgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCiAgICAgICAgIC8vCiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heFRydW5TYW1wbGVDb3VudCA9IDEwMDAwOwogICAgICAgICBpZiAoc2FtcGxlQ291bnQgPiBrTWF4VHJ1blNhbXBsZUNvdW50KSB7CkBAIC02NzEzLDYgKzY3MzIsNyBAQAogICAgICAgICBGT1VSQ0MoImh2YzEiKSwKICAgICAgICAgRk9VUkNDKCJoZXYxIiksCiAgICAgICAgIEZPVVJDQygiYXYwMSIpLAorICAgICAgICBGT1VSQ0MoInZwMDkiKSwKICAgICAgICAgRk9VUkNDKCIzZ3A0IiksCiAgICAgICAgIEZPVVJDQygibXA0MSIpLAogICAgICAgICBGT1VSQ0MoIm1wNDIiKSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCBiYzg2MzJjLi40YzI1MzE0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsMTYgQEAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtcGVnMmV4dHJhY3RvciIsCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgYW5kcm9pZDogeworICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGlidm5ka3N1cHBvcnQjMjkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCkBAIC0xMiwxNCArMjIsMTMgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjZ3JvdXByYyMyOSIsCi0gICAgICAgICJsaWJ2bmRrc3VwcG9ydCMyOSIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTM3LDcgKzQ2LDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9ub2NyeXB0byIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggN2FlZDY4My4uNTc5MDY1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC0yMCw0ICsyMCwxMSBAQAogICAgICAgICAibGlidm9yYmlzaWRlYyIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkVGVzdC54bWwKaW5kZXggNmJiMmM4YS4uZmM4MTUyYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkVGVzdC54bWwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkVGVzdC54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iRXh0cmFjdG9yVW5pdFRlc3QtPi9kYXRhL2xvY2FsL3RtcC9FeHRyYWN0b3JVbml0VGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCi0gICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9leHRyYWN0b3IuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9leHRyYWN0b3ItMS40LnppcD91bnppcD10cnVlIgogICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9FeHRyYWN0b3JVbml0VGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKaW5kZXggNTE4MTY2ZS4uZDkxZmZmYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKQEAgLTIwLDggKzIwLDEwIEBACiAKICNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KIAogI2luY2x1ZGUgImFhYy9BQUNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJhbXIvQU1SRXh0cmFjdG9yLmgiCkBAIC00MywxMSArNDUsNzYgQEAKICNkZWZpbmUgT1VUUFVUX0RVTVBfRklMRSAiL2RhdGEvbG9jYWwvdG1wL2V4dHJhY3Rvck91dHB1dCIKIAogY29uc3RleHByIGludDMyX3Qga01heENvdW50ID0gMTA7Ci1jb25zdGV4cHIgaW50MzJfdCBrT3B1c1NlZWtQcmVSb2xsVXMgPSA4MDAwMDsgIC8vIDgwIG1zOworY29uc3RleHByIGludDMyX3Qga0F1ZGlvRGVmYXVsdFNhbXBsZUR1cmF0aW9uID0gMjAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAvLyAyMG1zCitjb25zdGV4cHIgaW50MzJfdCBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzID0gMiAqIGtBdWRpb0RlZmF1bHRTYW1wbGVEdXJhdGlvbjsgIC8vIDQwIG1zOworY29uc3RleHByIGludDMyX3Qga1JhbmRvbVNlZWQgPSA3MDA7Citjb25zdGV4cHIgaW50MzJfdCBrVW5kZWZpbmVkID0gLTE7CisKK2VudW0gaW5wdXRJRCB7CisgICAgLy8gYXVkaW8gc3RyZWFtcworICAgIEFBQ18xLAorICAgIEFNUl9OQl8xLAorICAgIEFNUl9XQl8xLAorICAgIEZMQUNfMSwKKyAgICBHU01fMSwKKyAgICBNSURJXzEsCisgICAgTVAzXzEsCisgICAgT1BVU18xLAorICAgIFZPUkJJU18xLAorICAgIC8vIHZpZGVvIHN0cmVhbXMKKyAgICBIRVZDXzEsCisgICAgSEVWQ18yLAorICAgIE1QRUcyX1BTXzEsCisgICAgTVBFRzJfVFNfMSwKKyAgICBNUEVHNF8xLAorICAgIFZQOV8xLAorICAgIFVOS05PV05fSUQsCit9OworCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCitzdGF0aWMgY29uc3Qgc3RydWN0IElucHV0RGF0YSB7CisgICAgaW5wdXRJRCBpbnBJZDsKKyAgICBzdHJpbmcgbWltZTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlOworICAgIGludDMyX3QgZmlyc3RQYXJhbTsKKyAgICBpbnQzMl90IHNlY29uZFBhcmFtOworICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICBpbnQzMl90IGZyYW1lUmF0ZTsKK30ga0lucHV0RGF0YVtdID0geworICAgICAgICB7QUFDXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgInRlc3RfbW9ub180NDEwMEh6X2FhYy5hYWMiLCA0NDEwMCwgMSwgQUFDT2JqZWN0TEMsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge0FNUl9OQl8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJiYmJfbW9ub184a0h6X2Ftcm5iLmFtciIsIDgwMDAsIDEsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge0FNUl9XQl8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJiYmJfbW9ub18xNmtIel9hbXJ3Yi5hbXIiLCAxNjAwMCwgMSwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7RkxBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsICJiYmJfc3RlcmVvXzQ4a0h6X2ZsYWMuZmxhYyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtHU01fMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00sICJ0ZXN0X21vbm9fOGtIel9nc20ud2F2IiwgODAwMCwgMSwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7TUlESV8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsICJtaWRpX2EubWlkIiwgMjIwNTAsIDIsIGtVbmRlZmluZWQsIGtVbmRlZmluZWR9LAorICAgICAgICB7TVAzXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJiYmJfc3RlcmVvXzQ4a0h6X21wMy5tcDMiLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7T1BVU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAidGVzdF9zdGVyZW9fNDhrSHpfb3B1cy5vcHVzIiwgNDgwMDAsIDIsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge1ZPUkJJU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJiYmJfc3RlcmVvXzQ4a0h6X3ZvcmJpcy5vZ2ciLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorCisgICAgICAgIC8vIFRlc3QgKGIvMTUxNjc3MjY0KSBmb3IgTVA0IGV4dHJhY3RvcgorICAgICAgICB7SEVWQ18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCAiY3Jvd2RfNTA4eDI0MF8yNWZwc19oZXZjLm1wNCIsIDUwOCwgMjQwLAorICAgICAgICAgSEVWQ1Byb2ZpbGVNYWluLCAyNX0sCisgICAgICAgIHtIRVZDXzIsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgInRlc3QzLmhlaWMiLCA4MjAsIDQ2MCwga1VuZGVmaW5lZCwga1VuZGVmaW5lZH0sCisgICAgICAgIHtNUEVHMl9QU18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiwgMTQ0LCAxMzYsCisgICAgICAgICBNUEVHMlByb2ZpbGVNYWluLCAxMn0sCisgICAgICAgIHtNUEVHMl9UU18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwgImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi50cyIsIDM1MiwgMjg4LAorICAgICAgICAgTVBFRzJQcm9maWxlTWFpbiwgMzB9LAorICAgICAgICB7TVBFRzRfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJiYmJfY2lmXzc2OGticHNfMzBmcHNfbXBlZzQubWt2IiwgMzUyLCAyODgsCisgICAgICAgICBNUEVHNFByb2ZpbGVTaW1wbGUsIDMwfSwKKyAgICAgICAge1ZQOV8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksICJiYmJfMzQweDI4MF8zMGZwc192cDkud2VibSIsIDM0MCwgMjgwLCBWUDlQcm9maWxlMCwgMzB9LAorfTsKIAogc3RhdGljIEV4dHJhY3RvclVuaXRUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOwogCi1jbGFzcyBFeHRyYWN0b3JVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIHN0cmluZz4+IHsKK2NsYXNzIEV4dHJhY3RvclVuaXRUZXN0IHsKICAgcHVibGljOgogICAgIEV4dHJhY3RvclVuaXRUZXN0KCkgOiBtSW5wdXRGcChudWxscHRyKSwgbURhdGFTb3VyY2UobnVsbHB0ciksIG1FeHRyYWN0b3IobnVsbHB0cikge30KIApAQCAtNjYsMTYgKzEzMywyOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIHZvaWQgc2V0dXBFeHRyYWN0b3Ioc3RyaW5nIHdyaXRlckZvcm1hdCkgewogICAgICAgICBtRXh0cmFjdG9yTmFtZSA9IHVua25vd25fY29tcDsKICAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CiAKICAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGFuZGFyZEV4dHJhY3RvcnM+IG1hcEV4dHJhY3RvciA9IHsKLSAgICAgICAgICAgICAgICB7ImFhYyIsIEFBQ30sICAgICB7ImFtciIsIEFNUn0sICAgICAgICAgeyJtcDMiLCBNUDN9LCAgICAgICAgeyJvZ2ciLCBPR0d9LAotICAgICAgICAgICAgICAgIHsid2F2IiwgV0FWfSwgICAgIHsibWt2IiwgTUtWfSwgICAgICAgICB7ImZsYWMiLCBGTEFDfSwgICAgICB7Im1pZGkiLCBNSURJfSwKLSAgICAgICAgICAgICAgICB7Im1wZWc0IiwgTVBFRzR9LCB7Im1wZWcydHMiLCBNUEVHMlRTfSwgeyJtcGVnMnBzIiwgTVBFRzJQU319OworICAgICAgICAgICAgICAgIHsiYWFjIiwgQUFDfSwKKyAgICAgICAgICAgICAgICB7ImFtciIsIEFNUn0sCisgICAgICAgICAgICAgICAgeyJmbGFjIiwgRkxBQ30sCisgICAgICAgICAgICAgICAgeyJtaWQiLCBNSURJfSwKKyAgICAgICAgICAgICAgICB7Im1pZGkiLCBNSURJfSwKKyAgICAgICAgICAgICAgICB7Im1rdiIsIE1LVn0sCisgICAgICAgICAgICAgICAgeyJtcDMiLCBNUDN9LAorICAgICAgICAgICAgICAgIHsibXA0IiwgTVBFRzR9LAorICAgICAgICAgICAgICAgIHsibXBlZzJwcyIsIE1QRUcyUFN9LAorICAgICAgICAgICAgICAgIHsibXBlZzJ0cyIsIE1QRUcyVFN9LAorICAgICAgICAgICAgICAgIHsibXBlZzQiLCBNUEVHNH0sCisgICAgICAgICAgICAgICAgeyJtcGciLCBNUEVHMlBTfSwKKyAgICAgICAgICAgICAgICB7Im9nZyIsIE9HR30sCisgICAgICAgICAgICAgICAgeyJvcHVzIiwgT0dHfSwKKyAgICAgICAgICAgICAgICB7InRzIiwgTVBFRzJUU30sCisgICAgICAgICAgICAgICAgeyJ3YXYiLCBXQVZ9LAorICAgICAgICAgICAgICAgIHsid2VibSIsIE1LVn19OwogICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQotICAgICAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKICAgICAgICAgaWYgKG1hcEV4dHJhY3Rvci5maW5kKHdyaXRlckZvcm1hdCkgIT0gbWFwRXh0cmFjdG9yLmVuZCgpKSB7CiAgICAgICAgICAgICBtRXh0cmFjdG9yTmFtZSA9IG1hcEV4dHJhY3Rvci5hdCh3cml0ZXJGb3JtYXQpOwogICAgICAgICB9CkBAIC0xMTIsNiArMTkyLDM5IEBACiAgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgKm1FeHRyYWN0b3I7CiB9OwogCitjbGFzcyBFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdAorICAgIDogcHVibGljIEV4dHJhY3RvclVuaXRUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcgLyogY29udGFpbmVyICovLCBzdHJpbmcgLyogSW5wdXRGaWxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIG51bVRyYWNrcyAqLywgYm9vbCAvKiBzZWVrU3VwcG9ydGVkICovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHN0cmluZywgaW50MzJfdCwgYm9vbD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgbUNvbnRhaW5lciA9IGdldDwwPihwYXJhbXMpOworICAgICAgICBtTnVtVHJhY2tzID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgICAgIHNldHVwRXh0cmFjdG9yKG1Db250YWluZXIpOworICAgIH0KKyAgICBzdHJpbmcgbUNvbnRhaW5lcjsKKyAgICBpbnQzMl90IG1OdW1UcmFja3M7Cit9OworCitjbGFzcyBDb25maWdQYXJhbVRlc3QgOiBwdWJsaWMgRXh0cmFjdG9yVW5pdFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBpbnB1dElEPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cEV4dHJhY3RvcihHZXRQYXJhbSgpLmZpcnN0KTsgfQorCisgICAgc3RydWN0IGNvbmZpZ0Zvcm1hdCB7CisgICAgICAgIHN0cmluZyBtaW1lOworICAgICAgICBpbnQzMl90IHdpZHRoOworICAgICAgICBpbnQzMl90IGhlaWdodDsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgaW50MzJfdCBwcm9maWxlOworICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZTsKKyAgICB9OworCisgICAgdm9pZCBnZXRGaWxlUHJvcGVydGllcyhpbnB1dElEIGlucHV0SWQsIHN0cmluZyAmaW5wdXRGaWxlLCBjb25maWdGb3JtYXQgJmNvbmZpZ1BhcmFtKTsKK307CisKIGludDMyX3QgRXh0cmFjdG9yVW5pdFRlc3Q6OnNldERhdGFTb3VyY2Uoc3RyaW5nIGlucHV0RmlsZU5hbWUpIHsKICAgICBtSW5wdXRGcCA9IGZvcGVuKGlucHV0RmlsZU5hbWUuY19zdHIoKSwgInJiIik7CiAgICAgaWYgKCFtSW5wdXRGcCkgewpAQCAtMTY4LDYgKzI4MSw3NSBAQAogICAgIHJldHVybiAwOwogfQogCit2b2lkIENvbmZpZ1BhcmFtVGVzdDo6Z2V0RmlsZVByb3BlcnRpZXMoaW5wdXRJRCBpbnB1dElkLCBzdHJpbmcgJmlucHV0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdGb3JtYXQgJmNvbmZpZ1BhcmFtKSB7CisgICAgaW50MzJfdCBpbnB1dERhdGFTaXplID0gc2l6ZW9mKGtJbnB1dERhdGEpIC8gc2l6ZW9mKGtJbnB1dERhdGFbMF0pOworICAgIGludDMyX3QgaW5wdXRJZHggPSAwOworICAgIGZvciAoOyBpbnB1dElkeCA8IGlucHV0RGF0YVNpemU7IGlucHV0SWR4KyspIHsKKyAgICAgICAgaWYgKGlucHV0SWQgPT0ga0lucHV0RGF0YVtpbnB1dElkeF0uaW5wSWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbnB1dElkeCA9PSBpbnB1dERhdGFTaXplKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXRGaWxlICs9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmlucHV0RmlsZTsKKyAgICBjb25maWdQYXJhbS5taW1lID0ga0lucHV0RGF0YVtpbnB1dElkeF0ubWltZTsKKyAgICBzaXplX3QgZm91bmQgPSBjb25maWdQYXJhbS5taW1lLmZpbmQoImF1ZGlvLyIpOworICAgIC8vIENoZWNrIGlmICdhdWRpby8nIGlzIHByZXNlbnQgaW4gdGhlIGJlZ2luaW5pZyBvZiB0aGUgbWltZSB0eXBlCisgICAgaWYgKGZvdW5kID09IDApIHsKKyAgICAgICAgY29uZmlnUGFyYW0uc2FtcGxlUmF0ZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmZpcnN0UGFyYW07CisgICAgICAgIGNvbmZpZ1BhcmFtLmNoYW5uZWxDb3VudCA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLnNlY29uZFBhcmFtOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbmZpZ1BhcmFtLndpZHRoID0ga0lucHV0RGF0YVtpbnB1dElkeF0uZmlyc3RQYXJhbTsKKyAgICAgICAgY29uZmlnUGFyYW0uaGVpZ2h0ID0ga0lucHV0RGF0YVtpbnB1dElkeF0uc2Vjb25kUGFyYW07CisgICAgfQorICAgIGNvbmZpZ1BhcmFtLnByb2ZpbGUgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5wcm9maWxlOworICAgIGNvbmZpZ1BhcmFtLmZyYW1lUmF0ZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmZyYW1lUmF0ZTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgcmFuZG9tU2Vla1Rlc3QoTWVkaWFUcmFja0hlbHBlciAqdHJhY2ssIGludDY0X3QgY2xpcER1cmF0aW9uKSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIGludDMyX3Qgc2Vla0NvdW50ID0gMDsKKyAgICBib29sIGhhc1RpbWVzdGFtcCA9IGZhbHNlOworICAgIHZlY3RvcjxpbnQ2NF90PiBzZWVrVG9UaW1lU3RhbXA7CisgICAgc3RyaW5nIHNlZWtQdHNTdHJpbmc7CisKKyAgICBzcmFuZChrUmFuZG9tU2VlZCk7CisgICAgd2hpbGUgKHNlZWtDb3VudCA8IGtNYXhDb3VudCkgeworICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcCA9ICgoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYKSAqIGNsaXBEdXJhdGlvbjsKKyAgICAgICAgc2Vla1RvVGltZVN0YW1wLnB1c2hfYmFjayh0aW1lU3RhbXApOworICAgICAgICBzZWVrUHRzU3RyaW5nLmFwcGVuZCh0b19zdHJpbmcodGltZVN0YW1wKSk7CisgICAgICAgIHNlZWtQdHNTdHJpbmcuYXBwZW5kKCIsICIpOworICAgICAgICBzZWVrQ291bnQrKzsKKyAgICB9CisKKyAgICBmb3IgKGludDY0X3Qgc2Vla1B0cyA6IHNlZWtUb1RpbWVTdGFtcCkgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IG5ldyBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucygKKyAgICAgICAgICAgICAgICBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLLCBzZWVrUHRzKTsKKyAgICAgICAgQVNTRVJUX05FKG9wdGlvbnMsIG51bGxwdHIpIDw8ICJDYW5ub3QgY3JlYXRlIHJlYWQgb3B0aW9uIjsKKworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlciwgb3B0aW9ucyk7CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YURhdGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAwOworICAgICAgICAgICAgaGFzVGltZXN0YW1wID0gQU1lZGlhRm9ybWF0X2dldEludDY0KG1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZ0aW1lU3RhbXApOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFzVGltZXN0YW1wKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBzZXQgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gc2FtcGxlIjsKKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoYWJzKHRpbWVTdGFtcCAtIHNlZWtQdHMpLCBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzKQorICAgICAgICAgICAgICAgICAgICA8PCAiU2VlayB1bnN1Y2Nlc3NmdWwuIEV4cGVjdGVkIHRpbWVzdGFtcCByYW5nZSBbIgorICAgICAgICAgICAgICAgICAgICA8PCBzZWVrUHRzIC0ga1JhbmRvbVNlZWtUb2xlcmFuY2VVcyA8PCAiLCAiIDw8IHNlZWtQdHMgKyBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzCisgICAgICAgICAgICAgICAgICAgIDw8ICJdICIKKyAgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkICIgPDwgdGltZVN0YW1wIDw8ICIsIGxpc3Qgb2YgaW5wdXQgc2VlayB0aW1lc3RhbXBzIFsiCisgICAgICAgICAgICAgICAgICAgIDw8IHNlZWtQdHNTdHJpbmcgPDwgIl0iOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBvcHRpb25zOworICAgIH0KK30KKwogdm9pZCBnZXRTZWVrYWJsZVBvaW50cyh2ZWN0b3I8aW50NjRfdD4gJnNlZWthYmxlUG9pbnRzLCBNZWRpYVRyYWNrSGVscGVyICp0cmFjaykgewogICAgIGludDMyX3Qgc3RhdHVzID0gMDsKICAgICBpZiAoIXNlZWthYmxlUG9pbnRzLmVtcHR5KCkpIHsKQEAgLTE5MCwyMCArMzcyLDIxIEBACiAgICAgfQogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIENyZWF0ZUV4dHJhY3RvclRlc3QpIHsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgQ3JlYXRlRXh0cmFjdG9yVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAogICAgIEFMT0dWKCJDaGVja3MgaWYgYSB2YWxpZCBleHRyYWN0b3IgaXMgY3JlYXRlZCBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlIik7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CiAKLSAgICBBU1NFUlRfRVEoc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKSwgMCkKLSAgICAgICAgICAgIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKLSAgICBBU1NFUlRfRVEoY3JlYXRlRXh0cmFjdG9yKCksIDApCi0gICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCi0gICAgLy8gQSB2YWxpZCBleHRyYWN0b3IgaW5zdGFjZSBzaG91bGQgcmV0dXJuIHN1Y2Nlc3MgZm9yIGZvbGxvd2luZyBjYWxscwotICAgIEFTU0VSVF9HVChtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpLCAwKTsKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CiAKICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CkBAIC0yMTIsMjAgKzM5NSwyMSBAQAogICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBFeHRyYWN0b3JUZXN0KSB7CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIEV4dHJhY3RvclRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAKLSAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlIiwgR2V0UGFyYW0oKS5maXJzdC5jX3N0cigpKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgZm9yIGEgZ2l2ZW4gaW5wdXQgZmlsZSIsIG1Db250YWluZXIuY19zdHIoKSk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKIAogICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CiAKICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgewogICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGlkeCk7CkBAIC0yNjIsMjAgKzQ0NiwyMSBAQAogICAgIH0KIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBNZXRhRGF0YUNvbXBhcmlzb25UZXN0KSB7CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIE1ldGFEYXRhQ29tcGFyaXNvblRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAKICAgICBBTE9HVigiVmFsaWRhdGVzIEV4dHJhY3RvcidzIG1ldGEgZGF0YSBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlIik7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CiAKICAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBmaW5kIGFueSB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOwogCiAgICAgQU1lZGlhRm9ybWF0ICpleHRyYWN0b3JGb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgQVNTRVJUX05FKGV4dHJhY3RvckZvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOwpAQCAtMzM3LDIwICs1MjIsMjEgQEAKICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGV4dHJhY3RvckZvcm1hdCk7CiB9CiAKLVRFU1RfUChFeHRyYWN0b3JVbml0VGVzdCwgTXVsdGlwbGVTdGFydFN0b3BUZXN0KSB7CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIE11bHRpcGxlU3RhcnRTdG9wVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAotICAgIEFMT0dWKCJUZXN0ICVzIGV4dHJhY3RvciBmb3IgbXVsdGlwbGUgc3RhcnQgYW5kIHN0b3AgY2FsbHMiLCBHZXRQYXJhbSgpLmZpcnN0LmNfc3RyKCkpOwotICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HVigiVGVzdCAlcyBleHRyYWN0b3IgZm9yIG11bHRpcGxlIHN0YXJ0IGFuZCBzdG9wIGNhbGxzIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOwogCiAgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIC8vIHN0YXJ0L3N0b3AgdGhlIHRyYWNrcyBtdWx0aXBsZSB0aW1lcwogICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CkBAIC0zNzksMjcgKzU2NSwyOCBAQAogICAgIH0KIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBTZWVrVGVzdCkgewotICAgIC8vIEJvdGggRmxhYyBhbmQgV2F2IGV4dHJhY3RvciBjYW4gZ2l2ZSBzYW1wbGVzIGZyb20gYW55IHB0cyBhbmQgbWFyayB0aGUgZ2l2ZW4gc2FtcGxlIGFzCi0gICAgLy8gc3luYyBmcmFtZS4gU28sIHRoaXMgc2VlayB0ZXN0IGlzIG5vdCBhcHBsaWNhYmxlIHRvIEZMQUMgYW5kIFdBViBleHRyYWN0b3JzCi0gICAgaWYgKG1EaXNhYmxlVGVzdCB8fCBtRXh0cmFjdG9yTmFtZSA9PSBGTEFDIHx8IG1FeHRyYWN0b3JOYW1lID09IFdBVikgcmV0dXJuOworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBTZWVrVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAotICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGJlaGF2aW91ciBmb3IgZGlmZmVyZW50IHNlZWsgbW9kZXMiLCBHZXRQYXJhbSgpLmZpcnN0LmNfc3RyKCkpOwotICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBiZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBzZWVrIG1vZGVzIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOwogCiAgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIHVpbnQzMl90IHNlZWtGbGFnID0gbUV4dHJhY3Rvci0+ZmxhZ3MoKTsKLSAgICBpZiAoIShzZWVrRmxhZyAmIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjpDQU5fU0VFSykpIHsKLSAgICAgICAgY291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZC4gIiA8PCBHZXRQYXJhbSgpLmZpcnN0Ci0gICAgICAgICAgICAgPDwgIiBFeHRyYWN0b3IgZG9lc24ndCBzdXBwb3J0IHNlZWtcbiI7CisgICAgYm9vbCBzZWVrU3VwcG9ydGVkID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIGJvb2wgc2Vla2FibGUgPSBzZWVrRmxhZyAmIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjpDQU5fU0VFSzsKKyAgICBpZiAoIXNlZWthYmxlKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShzZWVrU3VwcG9ydGVkKSA8PCBtQ29udGFpbmVyIDw8ICJFeHRyYWN0b3IgaXMgZXhwZWN0ZWQgdG8gc3VwcG9ydCBzZWVrICI7CisgICAgICAgIGNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQuICIgPDwgbUNvbnRhaW5lciA8PCAiIEV4dHJhY3RvciBkb2Vzbid0IHN1cHBvcnQgc2Vla1xuIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNDE1LDE5ICs2MDIsNzMgQEAKICAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOwogICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKICAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7Ci0gICAgICAgIGdldFNlZWthYmxlUG9pbnRzKHNlZWthYmxlUG9pbnRzLCB0cmFjayk7Ci0gICAgICAgIEFTU0VSVF9HVChzZWVrYWJsZVBvaW50cy5zaXplKCksIDApCi0gICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgc2Vla2FibGUgcG9pbnRzIGZvciAiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgIiBleHRyYWN0b3IiOworCisgICAgICAgIC8vIEZvciBGbGFjLCBXYXYgYW5kIE1pZGkgZXh0cmFjdG9yLCBhbGwgc2FtcGxlcyBhcmUgc2VlayBwb2ludHMuCisgICAgICAgIC8vIFdlIGNhbm5vdCBjcmVhdGUgbGlzdCBvZiBhbGwgc2Vla2FibGUgcG9pbnRzIGZvciB0aGVzZS4KKyAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIHdlIHBhc3MgYSBzZWVrVG9UaW1lU3RhbXAgYmV0d2VlbiB0d28gc2VlayBwb2ludHMsIHdlIG1heQorICAgICAgICAvLyBlbmQgdXAgZ2V0dGluZyB0aGUgdGltZXN0YW1wIG9mIG5leHQgc2FtcGxlIGFzIGEgc2Vla2FibGUgdGltZXN0YW1wLgorICAgICAgICAvLyBUaGlzIHRpbWVzdGFtcCBtYXkvbWF5IG5vdCBiZSBhIHBhcnQgb2YgdGhlIHNlZWthYmxlIHBvaW50IHZlY3RvciB0aGVyZWJ5IGZhaWxpbmcgdGhlCisgICAgICAgIC8vIHRlc3QuIFNvIHdlIHRlc3QgdGhlc2UgZXh0cmFjdG9ycyB1c2luZyByYW5kb20gc2VlayB0ZXN0LgorICAgICAgICBpZiAobUV4dHJhY3Rvck5hbWUgPT0gRkxBQyB8fCBtRXh0cmFjdG9yTmFtZSA9PSBXQVYgfHwgbUV4dHJhY3Rvck5hbWUgPT0gTUlESSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgICAgICBBU1NFUlRfTkUodHJhY2tNZXRhLCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodHJhY2tNZXRhLCBpZHgsIDEpOworICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFja01ldGFEYXRhIjsKKworICAgICAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb24gPSAwOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvbik7CisgICAgICAgICAgICBBU1NFUlRfR1QoY2xpcER1cmF0aW9uLCAwKSA8PCAiSW52YWxpZCBjbGlwIGR1cmF0aW9uICI7CisgICAgICAgICAgICByYW5kb21TZWVrVGVzdCh0cmFjaywgY2xpcER1cmF0aW9uKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tNZXRhKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja0Zvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICAgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIGZvcm1hdCI7CiAgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5nZXRGb3JtYXQodHJhY2tGb3JtYXQpOwogICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIG1ldGEgZGF0YSI7CiAKLSAgICAgICAgYm9vbCBpc09wdXMgPSBmYWxzZTsKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7Ci0gICAgICAgIGlmICghc3RyY21wKG1pbWUsICJhdWRpby9vcHVzIikpIGlzT3B1cyA9IHRydWU7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IG1pbWUiOworCisgICAgICAgIC8vIEltYWdlIGZvcm1hdHMgYXJlIG5vdCBleHBlY3RlZCB0byBiZSBzZWVrYWJsZQorICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgImltYWdlLyIsIDYpKSBjb250aW51ZTsKKworICAgICAgICAvLyBSZXF1ZXN0IHNlZWthYmxlIHBvaW50cyBmb3IgcmVtYWluaW5nIGV4dHJhY3RvcnMgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBzZWVrCisgICAgICAgIC8vIGFjY3VyYWN5IGZvciB0aGUgZXh0cmFjdG9ycy4gRGVwZW5kaW5nIG9uIFNFRUsgTW9kZSwgd2UgZXhwZWN0IHRoZSBleHRyYWN0b3JzIHRvIHJldHVybgorICAgICAgICAvLyB0aGUgZXhwZWN0ZWQgc3luYyBmcmFtZS4gV2UgZG9uJ3QgcHJlZmVyIHJhbmRvbSBzZWVrIHRlc3QgZm9yIHRoZXNlIGV4dHJhY3RvcnMgYmVjYXVzZQorICAgICAgICAvLyB0aGV5IGFyZW4ndCBleHBlY3RlZCB0byBzZWVrIHRvIHJhbmRvbSBzYW1wbGVzLiBNUDQgZm9yIGluc3RhbmNlIGNhbiBzZWVrIHRvCisgICAgICAgIC8vIG5leHQvcHJldmlvdXMgc3luYyBmcmFtZXMgYnV0IG5vdCB0byBzYW1wbGVzIGJldHdlZW4gdHdvIHN5bmMgZnJhbWVzLgorICAgICAgICBnZXRTZWVrYWJsZVBvaW50cyhzZWVrYWJsZVBvaW50cywgdHJhY2spOworICAgICAgICBBU1NFUlRfR1Qoc2Vla2FibGVQb2ludHMuc2l6ZSgpLCAwKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IHNlZWthYmxlIHBvaW50cyBmb3IgIiA8PCBtQ29udGFpbmVyIDw8ICIgZXh0cmFjdG9yIjsKKworICAgICAgICBib29sIGlzT3B1cyA9IGZhbHNlOworICAgICAgICBpbnQ2NF90IG9wdXNTZWVrUHJlUm9sbFVzID0gMDsKKyAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgImF1ZGlvL29wdXMiKSkgeworICAgICAgICAgICAgaXNPcHVzID0gdHJ1ZTsKKyAgICAgICAgICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gMDsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFja0Zvcm1hdCwgImNzZC0yIiwgJnNlZWtQcmVSb2xsQnVmLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBzZWVrUHJlUm9sbEJ1ZlNpemUgPSAwOworICAgICAgICAgICAgICAgIHZvaWQgKmNzZEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBudWxscHRyOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2tGb3JtYXQsICJjc2QtMCIsICZjc2RCdWZmZXIsICZzaXplKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUoY3NkQnVmZmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKCh1aW50OF90ICopY3NkQnVmZmVyLCBzaXplLCAmb3B1c0hlYWRCdWYsICZvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWYsICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX05FKHNlZWtQcmVSb2xsQnVmLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCB0cmFjayBmb3JtYXQuIFNlZWtQcmVSb2xsIGluZm8gbWlzc2luZyBmb3IgT3B1cyBmaWxlIjsKKyAgICAgICAgICAgIG9wdXNTZWVrUHJlUm9sbFVzID0gKigoaW50NjRfdCAqKXNlZWtQcmVSb2xsQnVmKTsKKyAgICAgICAgfQogICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKIAogICAgICAgICBpbnQzMl90IHNlZWtJZHggPSAwOwpAQCAtNDQ4LDcgKzY4OSw3IEBACiAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdG9yIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gKHNlZWtQdHMgLSBzZWVrUHJlUm9sbFVzKS4KICAgICAgICAgICAgICAgICAvLyBTbyB3ZSBhZGQgdGhlIHByZVJvbGwgdmFsdWUgdG8gdGhlIHRpbWVTdGFtcCB3ZSB3YW50IHRvIHNlZWsgdG8uCiAgICAgICAgICAgICAgICAgaWYgKGlzT3B1cykgewotICAgICAgICAgICAgICAgICAgICBzZWVrVG9UaW1lU3RhbXAgKz0ga09wdXNTZWVrUHJlUm9sbFVzOworICAgICAgICAgICAgICAgICAgICBzZWVrVG9UaW1lU3RhbXAgKz0gb3B1c1NlZWtQcmVSb2xsVXM7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBuZXcgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMoCkBAIC00OTYsMjQgKzczNyw1MTcgQEAKICAgICBzZWVrYWJsZVBvaW50cy5jbGVhcigpOwogfQogCi0vLyBUT0RPOiAoYi8xNDUzMzIxODUpCi0vLyBBZGQgTUlESSBpbnB1dHMKLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChFeHRyYWN0b3JVbml0VGVzdEFsbCwgRXh0cmFjdG9yVW5pdFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJhYWMiLCAibG91ZHNvZnRhYWMuYWFjIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCAidGVzdGFtci5hbXIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtciIsICJhbXJ3Yi53YXYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsICJqb2huX2NhZ2Uub2dnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ3YXYiLCAibW9ub3Rlc3Rnc20ud2F2IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMnRzIiwgInNlZ21lbnQwMDAwMDEudHMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImZsYWMiLCAic2luZXN3ZWVwZmxhYy5mbGFjIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJvZ2ciLCAidGVzdG9wdXMub3B1cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgInNpbmVzd2VlcHZvcmJpcy5ta3YiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgInNpbmVzd2VlcG9nZ21wNC5tcDQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wMyIsICJzaW5lc3dlZXBtcDNsYW1lLm1wMyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1rdiIsICJzd2lybF8xNDR4MTM2X3ZwOC53ZWJtIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMnBzIiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsICJzd2lybF8xMzJ4MTMwX21wZWc0Lm1wNCIpKSk7CisvLyBUZXN0cyB0aGUgZXh0cmFjdG9ycyBmb3Igc2VlayBiZXlvbmQgcmFuZ2UgOiAoMCwgQ2xpcER1cmF0aW9uKQorVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBNb25rZXlTZWVrVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICAvLyBUT0RPKGIvMTU1NjMwNzc4KTogRW5hYmxlIHRlc3QgZm9yIHdhdiBleHRyYWN0b3JzCisgICAgaWYgKG1FeHRyYWN0b3JOYW1lID09IFdBVikgcmV0dXJuOworCisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgYmVoYXZpb3VyIGZvciBpbnZhbGlkIHNlZWsgcG9pbnRzIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICB1aW50MzJfdCBzZWVrRmxhZyA9IG1FeHRyYWN0b3ItPmZsYWdzKCk7CisgICAgYm9vbCBzZWVrU3VwcG9ydGVkID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIGJvb2wgc2Vla2FibGUgPSBzZWVrRmxhZyAmIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjpDQU5fU0VFSzsKKyAgICBpZiAoIXNlZWthYmxlKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShzZWVrU3VwcG9ydGVkKSA8PCBtQ29udGFpbmVyIDw8ICJFeHRyYWN0b3IgaXMgZXhwZWN0ZWQgdG8gc3VwcG9ydCBzZWVrICI7CisgICAgICAgIGNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQuICIgPDwgbUNvbnRhaW5lciA8PCAiIEV4dHJhY3RvciBkb2Vzbid0IHN1cHBvcnQgc2Vla1xuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaWR4KTsKKyAgICAgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCBpZHg7CisKKyAgICAgICAgQ01lZGlhVHJhY2sgKmNUcmFjayA9IHdyYXAodHJhY2spOworICAgICAgICBBU1NFUlRfTkUoY1RyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayB3cmFwcGVyIGZvciBpbmRleCAiIDw8IGlkeDsKKworICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOworICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHRyYWNrIjsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKHRyYWNrTWV0YSwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOworCisgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhLCBpZHgsIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFja01ldGFEYXRhIjsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgbWltZSI7CisKKyAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb24gPSAwOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmY2xpcER1cmF0aW9uKTsKKyAgICAgICAgLy8gSW1hZ2UgZm9ybWF0cyBhcmUgbm90IGV4cGVjdGVkIHRvIGhhdmUgZHVyYXRpb24gaW5mb3JtYXRpb24KKyAgICAgICAgQVNTRVJUX1RSVUUoY2xpcER1cmF0aW9uID4gMCB8fCAhc3RybmNtcChtaW1lLCAiaW1hZ2UvIiwgNikpIDw8ICJJbnZhbGlkIGNsaXAgZHVyYXRpb24gIjsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja01ldGEpOworCisgICAgICAgIGludDY0X3Qgc2Vla1RvVGltZVN0YW1wVXNbXSA9IHstY2xpcER1cmF0aW9uLCBjbGlwRHVyYXRpb24gLyAyLCBjbGlwRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwRHVyYXRpb24gKiAyfTsKKyAgICAgICAgZm9yIChpbnQzMl90IG1vZGUgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgICAgICAgICAgbW9kZSA8PSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q7IG1vZGUrKykgeworICAgICAgICAgICAgZm9yIChpbnQ2NF90IHNlZWtUaW1lVXMgOiBzZWVrVG9UaW1lU3RhbXBVcykgeworICAgICAgICAgICAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zICpvcHRpb25zID0gbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUssIHNlZWtUaW1lVXMpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShvcHRpb25zLCBudWxscHRyKSA8PCAiQ2Fubm90IGNyZWF0ZSByZWFkIG9wdGlvbiI7CisKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGFEYXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lU3RhbXA7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAmdGltZVN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNlZWtlZCB0byB0aW1lc3RhbXAgOiAlbGxkLCByZXF1ZXN0ZWQgOiAlbGxkIiwgKGxvbmcgbG9uZyl0aW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2Vla1RpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0b3AodHJhY2spOworICAgICAgICBBU1NFUlRfRVEoT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisgICAgICAgIGRlbGV0ZSBidWZmZXJHcm91cDsKKyAgICAgICAgZGVsZXRlIHRyYWNrOworICAgIH0KK30KKworLy8gVGVzdHMgZXh0cmFjdG9ycyBmb3IgaW52YWxpZCB0cmFja3MKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgU2FuaXR5VGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICAvLyBUT0RPKGIvMTU1NjI2OTQ2KTogRW5hYmxlIHRlc3QgZm9yIE1QRUcyIFRTL1BTIGV4dHJhY3RvcnMKKyAgICBpZiAobUV4dHJhY3Rvck5hbWUgPT0gTVBFRzJUUyB8fCBtRXh0cmFjdG9yTmFtZSA9PSBNUEVHMlBTKSByZXR1cm47CisKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBiZWhhdmlvdXIgZm9yIGludmFsaWQgdHJhY2tzIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICBpbnQzMl90IHRyYWNrSWR4W10gPSB7LTEsIG51bVRyYWNrc307CisgICAgZm9yIChpbnQzMl90IGlkeCA6IHRyYWNrSWR4KSB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaWR4KTsKKyAgICAgICAgQVNTRVJUX0VRKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCBpZHggPDwgIlxuIjsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKGV4dHJhY3RvckZvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOworCisgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICAgICAgZXh0cmFjdG9yRm9ybWF0LCBpZHgsIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKKyAgICAgICAgQVNTRVJUX05FKE9LLCBzdGF0dXMpIDw8ICJnZXRUcmFja01ldGFEYXRhIHNob3VsZCByZXR1cm4gZXJyb3IgZm9yIGludmFsaWQgaW5kZXggIiA8PCBpZHg7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZXh0cmFjdG9yRm9ybWF0KTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBFeHRyYWN0b3IncyBnZXRUcmFja01ldGFEYXRhIGZvciBudWxsIGZvcm1hdAorICAgIEFNZWRpYUZvcm1hdCAqbWVkaWFGb3JtYXQgPSBudWxscHRyOworICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEobWVkaWFGb3JtYXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CisgICAgQVNTRVJUX05FKE9LLCBzdGF0dXMpIDw8ICJnZXRUcmFja01ldGFEYXRhIHNob3VsZCByZXR1cm4gZXJyb3IgZm9yIG51bGwgTWVkaWEgZm9ybWF0IjsKK30KKworLy8gVGhpcyB0ZXN0IHZhbGlkYXRlcyBjb25maWcgcGFyYW1zIGZvciBhIGdpdmVuIGlucHV0IGZpbGUuCisvLyBGb3IgdGhpcyB0ZXN0IHdlIG9ubHkgdGFrZSBzaW5nbGUgdHJhY2sgZmlsZXMgc2luY2UgdGhlIGZvY3VzIG9mIHRoaXMgdGVzdCBpcworLy8gdG8gdmFsaWRhdGUgdGhlIGZpbGUgcHJvcGVydGllcyByZXBvcnRlZCBieSBFeHRyYWN0b3IgYW5kIG5vdCBtdWx0aS10cmFjayBiZWhhdmlvcgorVEVTVF9QKENvbmZpZ1BhcmFtVGVzdCwgQ29uZmlnUGFyYW1WYWxpZGF0aW9uKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgc3RyaW5nIGNvbnRhaW5lciA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgZm9yIGlucHV0J3MgZmlsZSBwcm9wZXJ0aWVzIiwgY29udGFpbmVyLmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgaW5wdXRJRCBpbnB1dEZpbGVJZCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGNvbmZpZ0Zvcm1hdCBjb25maWdQYXJhbTsKKyAgICBnZXRGaWxlUHJvcGVydGllcyhpbnB1dEZpbGVJZCwgaW5wdXRGaWxlTmFtZSwgY29uZmlnUGFyYW0pOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IgIiA8PCBjb250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IgIiA8PCBjb250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKworICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soMCk7CisgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggMCI7CisKKyAgICBBTWVkaWFGb3JtYXQgKnRyYWNrRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBmb3JtYXQiOworCisgICAgc3RhdHVzID0gdHJhY2stPmdldEZvcm1hdCh0cmFja0Zvcm1hdCk7CisgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBtZXRhIGRhdGEiOworCisgICAgY29uc3QgY2hhciAqdHJhY2tNaW1lOworICAgIGJvb2wgdmFsdWVGb3VuZCA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJnRyYWNrTWltZSk7CisgICAgQVNTRVJUX1RSVUUodmFsdWVGb3VuZCkgPDwgIk1pbWUgdHlwZSBub3Qgc2V0IGJ5IGV4dHJhY3RvciI7CisgICAgQVNTRVJUX1NUUkVRKGNvbmZpZ1BhcmFtLm1pbWUuY19zdHIoKSwgdHJhY2tNaW1lKSA8PCAiSW52YWxpZCB0cmFjayBmb3JtYXQiOworCisgICAgaWYgKCFzdHJuY21wKHRyYWNrTWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIGludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB0cmFja0NoYW5uZWxDb3VudDsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tDaGFubmVsQ291bnQpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmdHJhY2tTYW1wbGVSYXRlKSk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5zYW1wbGVSYXRlLCB0cmFja1NhbXBsZVJhdGUpIDw8ICJTYW1wbGVSYXRlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5jaGFubmVsQ291bnQsIHRyYWNrQ2hhbm5lbENvdW50KSA8PCAiQ2hhbm5lbENvdW50IG5vdCBhcyBleHBlY3RlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB0cmFja1dpZHRoLCB0cmFja0hlaWdodDsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmdHJhY2tXaWR0aCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmdHJhY2tIZWlnaHQpKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLndpZHRoLCB0cmFja1dpZHRoKSA8PCAiV2lkdGggbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLmhlaWdodCwgdHJhY2tIZWlnaHQpIDw8ICJIZWlnaHQgbm90IGFzIGV4cGVjdGVkIjsKKworICAgICAgICBpZiAoY29uZmlnUGFyYW0uZnJhbWVSYXRlICE9IGtVbmRlZmluZWQpIHsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0uZnJhbWVSYXRlLCBmcmFtZVJhdGUpIDw8ICJmcmFtZVJhdGUgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB2YWxpZGF0ZSB0aGUgcHJvZmlsZSBmb3IgdGhlIGlucHV0IGNsaXAKKyAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgaWYgKGNvbmZpZ1BhcmFtLnByb2ZpbGUgIT0ga1VuZGVmaW5lZCkgeworICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsICZwcm9maWxlKSkgeworICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLnByb2ZpbGUsIHByb2ZpbGUpIDw8ICJwcm9maWxlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIH0gZWxzZSBpZiAobUV4dHJhY3Rvck5hbWUgPT0gQUFDICYmCisgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5wcm9maWxlLCBwcm9maWxlKSA8PCAicHJvZmlsZSBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJwcm9maWxlIG5vdCByZXR1cm5lZCBpbiBleHRyYWN0b3IiOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlIHRyYWNrOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tGb3JtYXQpOworfQorCitjbGFzcyBFeHRyYWN0b3JDb21wYXJpc29uCisgICAgOiBwdWJsaWMgRXh0cmFjdG9yVW5pdFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nIC8qIElucHV0RmlsZTAgKi8sIHN0cmluZyAvKiBJbnB1dEZpbGUxICovPj4geworICBwdWJsaWM6CisgICAgfkV4dHJhY3RvckNvbXBhcmlzb24oKSB7CisgICAgICAgIGZvciAoaW50OF90ICpleHRyYWN0b3JPcCA6IG1FeHRyYWN0b3JPdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChleHRyYWN0b3JPcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZnJlZShleHRyYWN0b3JPcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ4X3QgKm1FeHRyYWN0b3JPdXRwdXRbMl17fTsKKyAgICBzaXplX3QgbUV4dHJhY3Rvck91cHV0U2l6ZVsyXXt9OworfTsKKworc2l6ZV90IGFsbG9jYXRlT3V0cHV0QnVmZmVycyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgQU1lZGlhRm9ybWF0ICpleHRyYWN0b3JGb3JtYXQpIHsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDB1OworICAgIC8vIGFsbG9jYXRpbmcgdGhlIGJ1ZmZlciBzaXplIGFzIHNhbXBsZVJhdGUgKiBjaGFubmVsQ291bnQgKiBjbGlwRHVyYXRpb24gc2luY2UKKyAgICAvLyBzb21lIGV4dHJhY3RvcnMgbGlrZSBmbGFjLCBtaWRpIGFuZCB3YXYgZGVjb2RlcyB0aGUgZmlsZS4gVGhlc2UgZXh0cmFjdG9ycworICAgIC8vIGFkdmVydGlzZSB0aGUgbWltZSB0eXBlIGFzIHJhdy4KKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKSB7CisgICAgICAgIGludDY0X3QgY2xpcER1cmF0aW9uVXMgPSAtMTsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAtMTsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gLTE7CisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBwbGUgPSAtMTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsQ291bnQpIHx8IGNoYW5uZWxDb3VudCA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsQ291bnQgZm9yIGlucHV0IGZpbGUgOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKSB8fAorICAgICAgICAgICAgc2FtcGxlUmF0ZSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzYW1wbGVSYXRlIGZvciBpbnB1dCBmaWxlIDogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmY2xpcER1cmF0aW9uVXMpIHx8CisgICAgICAgICAgICBjbGlwRHVyYXRpb25VcyA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjbGlwIGR1cmF0aW9uIGZvciBpbnB1dCBmaWxlIDogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpdHNQZXJTYW1wcGxlKSB8fCBiaXRzUGVyU2FtcHBsZSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBiaXRzIHBlciBzYW1wbGUgZm9yIGlucHV0IGZpbGUgOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJTaXplID0gYml0c1BlclNhbXBwbGUgKiBjaGFubmVsQ291bnQgKiBzYW1wbGVSYXRlICogKGNsaXBEdXJhdGlvblVzIC8gMTAwMDAwMCArIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBnZXQgZmlsZSBwcm9wZXJ0aWVzIGZvcjogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyU2l6ZTsKK30KKworLy8gQ29tcGFyZSBvdXRwdXQgb2YgdHdvIGV4dHJhY3RvcnMgZm9yIGlkZW50aWNhbCBjb250ZW50CitURVNUX1AoRXh0cmFjdG9yQ29tcGFyaXNvbiwgRXh0cmFjdG9yQ29tcGFyaXNvblRlc3QpIHsKKyAgICB2ZWN0b3I8c3RyaW5nPiBpbnB1dEZpbGVOYW1lcyA9IHtHZXRQYXJhbSgpLmZpcnN0LCBHZXRQYXJhbSgpLnNlY29uZH07CisgICAgc2l6ZV90IGV4dHJhY3RlZE91dHB1dFNpemVbMl17fTsKKyAgICBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdFsyXXt9OworICAgIGludDMyX3Qgc3RhdHVzID0gT0s7CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgaW5wdXRGaWxlTmFtZXMuc2l6ZSgpOyBpZHgrKykgeworICAgICAgICBzdHJpbmcgY29udGFpbmVyRm9ybWF0ID0gaW5wdXRGaWxlTmFtZXNbaWR4XS5zdWJzdHIoaW5wdXRGaWxlTmFtZXNbaWR4XS5maW5kKCIuIikgKyAxKTsKKyAgICAgICAgc2V0dXBFeHRyYWN0b3IoY29udGFpbmVyRm9ybWF0KTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgeworICAgICAgICAgICAgQUxPR1YoIlVua25vd24gZXh0cmFjdG9yICVzLiBTa2lwcGluZyB0aGUgdGVzdCIsIGNvbnRhaW5lckZvcm1hdC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGZvciAlcyIsIGNvbnRhaW5lckZvcm1hdC5jX3N0cigpLAorICAgICAgICAgICAgICBpbnB1dEZpbGVOYW1lc1tpZHhdLmNfc3RyKCkpOworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgaW5wdXRGaWxlTmFtZXNbaWR4XTsKKworICAgICAgICBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBjb250YWluZXJGb3JtYXQgPDwgImV4dHJhY3RvciI7CisKKyAgICAgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciAiIDw8IGNvbnRhaW5lckZvcm1hdCA8PCAiIGV4dHJhY3RvciI7CisKKyAgICAgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgICAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCAxKSA8PCAiVGhpcyB0ZXN0IGV4cGVjdHMgaW5wdXRzIHdpdGggb25lIHRyYWNrIG9ubHkiOworCisgICAgICAgIGludDMyX3QgdHJhY2tJZHggPSAwOworICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrSWR4KTsKKyAgICAgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCB0cmFja0lkeDsKKworICAgICAgICBleHRyYWN0b3JGb3JtYXRbaWR4XSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKGV4dHJhY3RvckZvcm1hdFtpZHhdLCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisKKyAgICAgICAgc3RhdHVzID0gdHJhY2stPmdldEZvcm1hdChleHRyYWN0b3JGb3JtYXRbaWR4XSk7CisgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgbWV0YSBkYXRhIjsKKworICAgICAgICBDTWVkaWFUcmFjayAqY1RyYWNrID0gd3JhcCh0cmFjayk7CisgICAgICAgIEFTU0VSVF9ORShjVHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIHdyYXBwZXIgZm9yIGluZGV4ICIgPDwgdHJhY2tJZHg7CisKKyAgICAgICAgbUV4dHJhY3Rvck91cHV0U2l6ZVtpZHhdID0gYWxsb2NhdGVPdXRwdXRCdWZmZXJzKGlucHV0RmlsZU5hbWUsIGV4dHJhY3RvckZvcm1hdFtpZHhdKTsKKyAgICAgICAgQVNTRVJUX0dUKG1FeHRyYWN0b3JPdXB1dFNpemVbaWR4XSwgMHUpIDw8ICIgSW52YWxpZCBzaXplIGZvciBvdXRwdXQgYnVmZmVycyI7CisKKyAgICAgICAgbUV4dHJhY3Rvck91dHB1dFtpZHhdID0gKGludDhfdCAqKWNhbGxvYygxLCBtRXh0cmFjdG9yT3VwdXRTaXplW2lkeF0pOworICAgICAgICBBU1NFUlRfTkUobUV4dHJhY3Rvck91dHB1dFtpZHhdLCBudWxscHRyKQorICAgICAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB3cml0aW5nIGV4dHJhY3RvcidzIG91dHB1dCI7CisKKyAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7CisKKyAgICAgICAgaW50MzJfdCBvZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAoc3RhdHVzICE9IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5yZWFkKCZidWZmZXIpOworICAgICAgICAgICAgQUxPR1YoInRyYWNrLT5yZWFkIFN0YXR1cyA9ICVkIGJ1ZmZlciAlcCIsIHN0YXR1cywgYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTEUob2Zmc2V0ICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgbUV4dHJhY3Rvck91cHV0U2l6ZVtpZHhdKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk1lbW9yeSBvdmVyZmxvdy4gRXh0cmFjdGVkIG91dHB1dCBzaXplIG1vcmUgdGhhbiBleHBlY3RlZCI7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkobUV4dHJhY3Rvck91dHB1dFtpZHhdICsgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgZXh0cmFjdGVkT3V0cHV0U2l6ZVtpZHhdICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdG9wKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworCisgICAgICAgIGZjbG9zZShtSW5wdXRGcCk7CisgICAgICAgIGRlbGV0ZSBidWZmZXJHcm91cDsKKyAgICAgICAgZGVsZXRlIHRyYWNrOworICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICBkZWxldGUgbUV4dHJhY3RvcjsKKyAgICAgICAgbUlucHV0RnAgPSBudWxscHRyOworICAgICAgICBtRXh0cmFjdG9yID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBDb21wYXJlIHRoZSBtZXRhIGRhdGEgZnJvbSBib3RoIHRoZSBleHRyYWN0b3JzCisgICAgY29uc3QgY2hhciAqbWltZVsyXTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVswXSk7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWVbMV0pOworICAgIEFTU0VSVF9TVFJFUShtaW1lWzBdLCBtaW1lWzFdKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyBmb3JtYXQiOworCisgICAgaWYgKCFzdHJuY21wKG1pbWVbMF0sICJhdWRpby8iLCA2KSkgeworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDAsIGNoYW5uZWxDb3VudDE7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTAsIHNhbXBsZVJhdGUxOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzBdLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbENvdW50MCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzBdLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUwKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsQ291bnQxKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlUmF0ZTEpKTsKKyAgICAgICAgQVNTRVJUX0VRKGNoYW5uZWxDb3VudDAsIGNoYW5uZWxDb3VudDEpIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGV4dHJhY3RvcidzIGNoYW5uZWxDb3VudCI7CisgICAgICAgIEFTU0VSVF9FUShzYW1wbGVSYXRlMCwgc2FtcGxlUmF0ZTEpIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGV4dHJhY3RvcidzIHNhbXBsZVJhdGUiOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWltZVswXSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgwLCBoZWlnaHQwOworICAgICAgICBpbnQzMl90IHdpZHRoMSwgaGVpZ2h0MTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJndpZHRoMCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzBdLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJmhlaWdodDApKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFsxXSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJndpZHRoMSkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJmhlaWdodDEpKTsKKyAgICAgICAgQVNTRVJUX0VRKHdpZHRoMCwgd2lkdGgxKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyB3aWR0aCI7CisgICAgICAgIEFTU0VSVF9FUShoZWlnaHQwLCBoZWlnaHQxKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyBoZWlnaHQiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiSW52YWxpZCBtaW1lIHR5cGUgIiA8PCBtaW1lWzBdOworICAgIH0KKworICAgIGZvciAoQU1lZGlhRm9ybWF0ICpleEZvcm1hdCA6IGV4dHJhY3RvckZvcm1hdCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGV4Rm9ybWF0KTsKKyAgICB9CisKKyAgICAvLyBDb21wYXJlIHRoZSBleHRyYWN0ZWQgb3V0cHV0cyBvZiBib3RoIGV4dHJhY3RvcgorICAgIEFTU0VSVF9FUShleHRyYWN0ZWRPdXRwdXRTaXplWzBdLCBleHRyYWN0ZWRPdXRwdXRTaXplWzFdKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvcidzIG91dHB1dCBzaXplIGRvZXNuJ3QgbWF0Y2ggYmV0d2VlbiAiIDw8IGlucHV0RmlsZU5hbWVzWzBdIDw8ICJhbmQgIgorICAgICAgICAgICAgPDwgaW5wdXRGaWxlTmFtZXNbMV0gPDwgIiBleHRyYWN0b3JzIjsKKyAgICBzdGF0dXMgPSBtZW1jbXAobUV4dHJhY3Rvck91dHB1dFswXSwgbUV4dHJhY3Rvck91dHB1dFsxXSwgZXh0cmFjdGVkT3V0cHV0U2l6ZVswXSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RlZCBjb250ZW50IG1pc21hdGNoIGJldHdlZW4gIiA8PCBpbnB1dEZpbGVOYW1lc1swXSA8PCAiYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbnB1dEZpbGVOYW1lc1sxXSA8PCAiIGV4dHJhY3RvcnMiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEV4dHJhY3RvckNvbXBhcmlzb25BbGwsIEV4dHJhY3RvckNvbXBhcmlzb24sCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl92cDkubXA0IiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ2aWRlb180ODB4MzYwX21wNF92cDlfMzMza2Jwc18yNWZwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzQ4MHgzNjBfd2VibV92cDlfMzMza2Jwc18yNWZwcy53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidmlkZW9fMTI4MHg3MjBfYXYxX2hkcl9zdGF0aWNfM21icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xMjgweDcyMF9hdjFfaGRyX3N0YXRpY18zbWJwcy53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC4zZ3AiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X2F2Yy5ta3YiLCAic3dpcmxfMTQ0eDEzNl9hdmMubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF81MDh4MjQwXzI1ZnBzX2hldmMubXA0IiwiY3Jvd2RfNTA4eDI0MF8yNWZwc19oZXZjLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi50cyIpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibG91ZHNvZnRhYWMuYWFjIiwgImxvdWRzb2Z0YWFjLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcGZsYWNta3YubWt2IiwgInNpbmVzd2VlcGZsYWNtcDQubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwbXAzbGFtZS5tcDMiLCAic2luZXN3ZWVwbXAzbGFtZS5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBvZ2dtcDQubXA0IiwgInNpbmVzd2VlcG9nZy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubXA0IiwgInNpbmVzd2VlcHZvcmJpcy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubWt2IiwgInNpbmVzd2VlcHZvcmJpcy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0b3B1cy5ta3YiLCAidGVzdG9wdXMubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidGVzdG9wdXMubXA0IiwgInRlc3RvcHVzLm9wdXMiKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImxvdWRzb2Z0YWFjLmFhYyIsICJsb3Vkc29mdGFhYy5hYWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0YW1yLmFtciIsICJ0ZXN0YW1yLmFtciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcGZsYWMuZmxhYyIsICJzaW5lc3dlZXBmbGFjLmZsYWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtaWRpX2EubWlkIiwgIm1pZGlfYS5taWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubWt2IiwgInNpbmVzd2VlcHZvcmJpcy5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBtcDNsYW1lLm1wMyIsICJzaW5lc3dlZXBtcDNsYW1lLm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcG9nZ21wNC5tcDQiLCAic2luZXN3ZWVwb2dnbXA0Lm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInRlc3RvcHVzLm9wdXMiLCAidGVzdG9wdXMub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImpvaG5fY2FnZS5vZ2ciLCAiam9obl9jYWdlLm9nZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1vbm90ZXN0Z3NtLndhdiIsICJtb25vdGVzdGdzbS53YXYiKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X3ZwOC53ZWJtIiwgInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQ29uZmlnUGFyYW1UZXN0QWxsLCBDb25maWdQYXJhbVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJhYWMiLCBBQUNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCBBTVJfTkJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCBBTVJfV0JfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJmbGFjIiwgRkxBQ18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndhdiIsIEdTTV8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1pZGkiLCBNSURJXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXAzIiwgTVAzXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigib2dnIiwgT1BVU18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsIFZPUkJJU18xKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCBIRVZDXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCBIRVZDXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJwcyIsIE1QRUcyX1BTXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJ0cyIsIE1QRUcyX1RTXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgTVBFRzRfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCBWUDlfMSkpKTsKKworLy8gVmFsaWRhdGUgZXh0cmFjdG9ycyBmb3IgY29udGFpbmVyIGZvcm1hdCwgaW5wdXQgZmlsZSwgbm8uIG9mIHRyYWNrcyBhbmQgc3VwcG9ydHMgc2VlayBmbGFnCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEV4dHJhY3RvclVuaXRUZXN0QWxsLCBFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYWFjIiwgImxvdWRzb2Z0YWFjLmFhYyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtciIsICJ0ZXN0YW1yLmFtciIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtciIsICJhbXJ3Yi53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJmbGFjIiwgInNpbmVzd2VlcGZsYWMuZmxhYyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1pZGkiLCAibWlkaV9hLm1pZCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzaW5lc3dlZXB2b3JiaXMubWt2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgInNpbmVzd2VlcG1wM2xhbWUubWt2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgImxvdWRzb2Z0YWFjLm1rdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wMyIsICJzaW5lc3dlZXBtcDNsYW1lLm1wMyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wMyIsICJpZDN0ZXN0MTAubXAzIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJ0cyIsICJzZWdtZW50MDAwMDAxLnRzIiwgMiwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcydHMiLCAidGVzdGFjM3RzLnRzIiwgMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcydHMiLCAidGVzdGFjNHRzLnRzIiwgMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcydHMiLCAidGVzdGVhYzN0cy50cyIsIDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJhdWRpb19hYWNfbW9ub183MGtic180NDEwMGh6Lm1wNCIsIDIsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgIm11bHRpMF9hYzQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAibm9pc2VfNmNoXzQ0a2h6X2FvdDVfZHJfc2JyX3NpZzJfbXA0Lm00YSIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcGFsYWMubW92IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic2luZXN3ZWVwZmxhY21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzaW5lc3dlZXBtNGEubTRhIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic2luZXN3ZWVwb2dnbXA0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcG9wdXNtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAidGVzdGFjM21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJ0ZXN0ZWFjM21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCAiam9obl9jYWdlLm9nZyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsICJ0ZXN0b3B1cy5vcHVzIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgInNpbmVzd2VlcG9nZ2FsYnVtYXJ0Lm9nZyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJsb3Vkc29mdHdhdi53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAibW9ub3Rlc3Rnc20ud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgIm5vaXNlXzVjaF80NGtoel9hb3QyX3dhdmUud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgInNpbmUxa2h6bTQwZGJfYWxhdy53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAic2luZTFraHptNDBkYl9mMzJsZS53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAic2luZTFraHptNDBkYl9tdWxhdy53YXYiLCAxLCB0cnVlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzd2lybF8xNDR4MTM2X2F2Yy5ta3YiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAid2l0aG91dGN1ZXMubWt2IiwgMiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAic3dpcmxfMTQ0eDEzNl92cDgud2VibSIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcycHMiLCAic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciLCAxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJwcyIsICJwcm9ncmFtc3RyZWFtLm1wZWciLCAyLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAiY29sb3JfMTc2eDE0NF9idDYwMV81MjVfbHJfc2RyX2gyNjQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAiaGVpZndyaXRlcl9pbnB1dC5oZWljIiwgNCwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInBzc2h0ZXN0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAidGVzdHZpZGVvLjNncCIsIDQsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInRlc3R2aWRlb193aXRoXzJfdGltZWR0ZXh0X3RyYWNrcy4zZ3AiLCA0LCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc18xMTAyNWh6XyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhZGF0YV9neXJvX2NvbXBsaWFudC4zZ3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJtcGVnNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTkyMHgxMDgwX21wNF9tcGVnMl8xMjAwMGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb180ODB4MzYwX21wNF9oZXZjXzY1MGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoubXA0IiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAibXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzQ4MHgzNjBfbXA0X2gyNjRfMTM1MGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHpfZGFzaC5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMiwgdHJ1ZSkpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgZ0VudiA9IG5ldyBFeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCmluZGV4IDY5NTM4YjYuLmNmZjA5Y2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCkBAIC0yMiw3ICsyMiw3IEBACiBhZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L0V4dHJhY3RvclVuaXRUZXN0L0V4dHJhY3RvclVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KIGBgYAogCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9leHRyYWN0b3IuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLTEuNC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCiAKIGBgYAogYWRiIHB1c2ggZXh0cmFjdG9yIC9kYXRhL2xvY2FsL3RtcC8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IDVkMzhhODEuLjg1ZDRjY2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtMTksNCArMTksMTEgQEAKICAgICAgICAgImxpYmZpZm8iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9PV05FUlMtY29kZWNzIGIvbWVkaWEvamFuaXRvcnMvT1dORVJTLWNvZGVjcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjAxMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamFuaXRvcnMvT1dORVJTLWNvZGVjcwpAQCAtMCwwICsxLDUgQEAKKyMgZ2Vycml0IG93bmVyL2FwcHJvdmVycyBmb3IgdGhlIGFjdHVhbCBzb2Z0d2FyZSBjb2RlYyBsaWJyYXJpZXMKKyMgZGlmZmVyZW50aWF0ZWQgZnJvbSBwbHVnaW5zIGNvbm5lY3RpbmcgdGhvc2UgY29kZWNzIHRvIGVpdGhlciBvbXggb3IgY29kZWMyIGluZnJhc3RydWN0dXJlCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9SRUFETUUgYi9tZWRpYS9qYW5pdG9ycy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiOGUwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phbml0b3JzL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK0EgY29sbGVjdGlvbiBvZiBPV05FUlMgZmlsZXMgdGhhdCB3ZSByZWZlcmVuY2UgZnJvbSBvdGhlciBwcm9qZWN0cywKK3N1Y2ggYXMgdGhlIHNvZnR3YXJlIGNvZGVjcyBpbiBkaXJlY3RvcmllcyBsaWtlIGV4dGVybmFsL2xpYmF2Yy4KK1RoaXMgaXMgdG8gc2ltcGxpZnkgb3VyIG93bmVyL2FwcHJvdmVyIG1hbmFnZW1lbnQgYWNyb3NzIHRoZSBtdWx0aXBsZQorcHJvamVjdHMgcmVsYXRlZCB0byBtZWRpYS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9kdW1teS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvZHVtbXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWY3ZTM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9kdW1teS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qKgotICogRHVtbXkgZmlsZSBuZWVkZWQgdG8gZ2V0IEFuZHJvaWQgU3R1ZGlvIHRvIHNjYW4gdGhpcyBmb2xkZXIuCi0gKi8KLQotaW50IGdfRG9Ob3RVc2VUaGlzVmFyaWFibGUgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL3VudXNlZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvdW51c2VkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTUyMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL3VudXNlZC5jcHAKQEAgLTAsMCArMSw1IEBACisvKioKKyAqIFVudXNlZCBmaWxlIHJlcXVpcmVkIHRvIGdldCBBbmRyb2lkIFN0dWRpbyB0byBzY2FuIHRoaXMgZm9sZGVyLgorICovCisKK2ludCBnX0RvTm90VXNlVGhpc1ZhcmlhYmxlID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAppbmRleCBhNDdmMTg5Li43YWFmOTA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC0yOSw2ICsyOSw4IEBACiAjaWZuZGVmIEFBVURJT19BQVVESU9fSAogI2RlZmluZSBBQVVESU9fQUFVRElPX0gKIAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKaW5kZXggNGVjMzhjNS4uMzkyN2Y1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCkBAIC0yNiw3ICsyNiw3IEBACiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCi0vLyBBcmJpdHJhcnkgbGltaXRzIGZvciBzYW5pdHkgY2hlY2tzLiBUT0RPIHJlbW92ZSBhZnRlciBkZWJ1Z2dpbmcuCisvLyBBcmJpdHJhcnkgbGltaXRzIGZvciByYW5nZSBjaGVja3MuCiAjZGVmaW5lIE1BWF9TSEFSRURfTUVNT1JJRVMgKDMyKQogI2RlZmluZSBNQVhfTU1BUF9PRkZTRVRfQllURVMgKDMyICogMTAyNCAqIDgpCiAjZGVmaW5lIE1BWF9NTUFQX1NJWkVfQllURVMgKDMyICogMTAyNCAqIDgpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCmluZGV4IGVkYTQ2YWUuLjk3MjkzMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OwogCiAgICAgLyoqCi0gICAgICogRHVtbXkgcHJvY2Vzc29yLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgorICAgICAqIERvIG5vdGhpbmcuIFRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSBtZXRob2QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKICAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKaW5kZXggZDJlNDgwNS4uODJlYjc3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDBjNDBjYmIuLmU4ZTFhMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTIgQEAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcAppbmRleCAxZWU2OTMwLi5mZjRiYTA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1BdHRyaWJ1dGVzLnRhZ3MpOworICAgICAgICBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYoc3RkOjpzdHJpbmcobUF0dHJpYnV0ZXMudGFncykpOwogICAgIH0KICAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obVN0cmVhbVR5cGUpKTsKICAgICBwYXJjZWwtPndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihtR3JvdXBJZCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCmluZGV4IDNlYWQ2Y2IuLjczYjk2YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKQEAgLTM2LDY0ICszNiwxMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1Qcm9iZShmYWxzZSksIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCisgICAgOiBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQogewogfQogCi0KLUF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKLSAgICAgICAgICAgICAgICBib29sIHByb2JlCi0gICAgICAgICAgICAgICAgKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVByb2JlKGZhbHNlKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKLXsKLSAgICBBdXRvTXV0ZXggbG9jayhtQ29uc3RydWN0TG9jayk7Ci0gICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlKTsKLX0KLQotQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKLSAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAotICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUKLSAgICAgICAgICAgICAgICApCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtUHJvYmUoZmFsc2UpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQotewotICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKLSAgICBlZmZlY3RfdXVpZF90ICpwVHlwZSA9IE5VTEw7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGVmZmVjdF91dWlkX3QgKnBVdWlkID0gTlVMTDsKLQotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciBzdHJpbmdcbiAtIHR5cGU6ICVzXG4gLSB1dWlkOiAlcyIsIHR5cGVTdHIsIHV1aWRTdHIpOwotCi0gICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcFR5cGUgPSAmdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHBVdWlkID0gJnV1aWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtQ29uc3RydWN0TG9jayk7Ci0gICAgbVN0YXR1cyA9IHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSwgcHJvYmUpOwotfQotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCiAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LApAQCAtMTk0LDYgKzE0MCwzNCBAQAogICAgIHJldHVybiBtU3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAorICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUpCit7CisgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgIGVmZmVjdF91dWlkX3QgKnBUeXBlID0gbnVsbHB0cjsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgZWZmZWN0X3V1aWRfdCAqcFV1aWQgPSBudWxscHRyOworCisgICAgQUxPR1YoIkF1ZGlvRWZmZWN0OjpzZXQgc3RyaW5nXG4gLSB0eXBlOiAlc1xuIC0gdXVpZDogJXMiLAorICAgICAgICAgICAgdHlwZVN0ciA/IHR5cGVTdHIgOiAibnVsbHB0ciIsIHV1aWRTdHIgPyB1dWlkU3RyIDogIm51bGxwdHIiKTsKKworICAgIGlmIChzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHBUeXBlID0gJnR5cGU7CisgICAgfQorICAgIGlmIChzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHBVdWlkID0gJnV1aWQ7CisgICAgfQorCisgICAgcmV0dXJuIHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSwgcHJvYmUpOworfQorCiAKIEF1ZGlvRWZmZWN0Ojp+QXVkaW9FZmZlY3QoKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCmluZGV4IGRmNDdkZWYuLjUwOWUwNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKQEAgLTEwOTIsNyArMTA5Miw3IEBACiAgICAgfQogCiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKLSAgICAgICAgLy8gc2FuaXR5LWNoZWNrLiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCisgICAgICAgIC8vIFZhbGlkYXRpb24uIHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCiAgICAgICAgIEFMT0dFKCIlcyglZCkgKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CkBAIC0xMzE5LDcgKzEzMTksNyBAQAogICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3QgcmVhZFNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCisgICAgICAgIC8vIFZhbGlkYXRlIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3QocmVhZFNpemUpIDwgMCB8fCByZWFkU2l6ZSA+IHJlcVNpemUpIHsKICAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6ICBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCA2MzU3ZGE0Li5mNjIxYWE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC01ODEsNyArNTgxLDggQEAKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDogewogICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duIG91dHB1dCEgJWQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duICVzISAlZCIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IDMyMTI5ZjAuLjgwN2FhMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0xOTM2LDcgKzE5MzYsNyBAQAogICAgIH0KIAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7Ci0gICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAorICAgICAgICAvLyBWYWxpZGF0aW9uOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgogICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXp1ICglemQpIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwpAQCAtMjMyNiw3ICsyMzI2LDcgQEAKICAgICAgICAgICAgICAgICBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCB3cml0dGVuU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKKyAgICAgICAgLy8gVmFsaWRhdGUgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdCh3cml0dGVuU2l6ZSkgPCAwIHx8IHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHdyaXR0ZW5TaXplKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDE2ZDIyMzIuLjZkNzlhYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgLy8gV2hpdGVsaXN0IG9mIHJlbGV2YW50IGV2ZW50cyB0byB0cmlnZ2VyIGxvZyBtZXJnaW5nLgorICAgIC8vIExpc3Qgb2YgcmVsZXZhbnQgZXZlbnRzIHRoYXQgdHJpZ2dlciBsb2cgbWVyZ2luZy4KICAgICAvLyBMb2cgbWVyZ2luZyBzaG91bGQgYWN0aXZhdGUgZHVyaW5nIGF1ZGlvIGFjdGl2aXR5IG9mIGFueSBraW5kLiBUaGlzIGFyZSBjb25zaWRlcmVkIHRoZQogICAgIC8vIG1vc3QgcmVsZXZhbnQgZXZlbnRzLgogICAgIC8vIFRPRE8gc2hvdWxkIHNlbGVjdCBtb3JlIHdpc2VseSB0aGUgaXRlbXMgZnJvbSB0aGUgbGlzdApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCmluZGV4IDQ4MmI5ZmIuLjAzNGQxNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUworKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKQEAgLTEsMyArMSw0IEBACiBna2FzdGVuQGdvb2dsZS5jb20KK2h1bmdhQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCmluZGV4IGNiNzYyNTIuLjNkNGJiNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKQEAgLTMzOSwxNiArMzM5LDIxIEBACiAgICAgICoKICAgICAgKiBvcFBhY2thZ2VOYW1lOiAgICAgIFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KICAgICAgKi8KLSAgICBBdWRpb0VmZmVjdChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CisgICAgZXhwbGljaXQgQXVkaW9FZmZlY3QoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCisgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9FZmZlY3QgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgorICAgICAqIFRoZSBlZmZlY3QgZW5naW5lIGlzIGFsc28gZGVzdHJveWVkIGlmIHRoaXMgQXVkaW9FZmZlY3Qgd2FzIHRoZSBsYXN0IGNvbnRyb2xsaW5nCisgICAgICogdGhlIGVuZ2luZS4KKyAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH5BdWRpb0VmZmVjdCgpOwogCi0gICAgLyogQ29uc3RydWN0b3IuCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhbiB1bmluaXRpYWxpemVkIEF1ZGlvRWZmZWN0LgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKgogICAgICAqIHR5cGU6ICB0eXBlIG9mIGVmZmVjdCBjcmVhdGVkOiBjYW4gYmUgbnVsbCBpZiB1dWlkIGlzIHNwZWNpZmllZC4gVGhpcyBjb3JyZXNwb25kcyB0bwogICAgICAqICAgICAgICB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdC4KLSAgICAgKiBvcFBhY2thZ2VOYW1lOiAgVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgogICAgICAqIHV1aWQ6ICBVdWlkIG9mIGVmZmVjdCBjcmVhdGVkOiBjYW4gYmUgbnVsbCBpZiB0eXBlIGlzIHNwZWNpZmllZC4gVGhpcyB1dWlkIGNvcnJlc3BvbmRzIHRvCiAgICAgICogICAgICAgIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KICAgICAgKiBwcmlvcml0eTogICAgcmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQpAQCAtMzU2LDcgKzM2MSw3IEBACiAgICAgICogICAgICBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgogICAgICAqIGNiZjogICAgICAgICBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiAoc2VlIGVmZmVjdF9jYWxsYmFja190KQogICAgICAqIHVzZXI6ICAgICAgICBwb2ludGVyIHRvIGNvbnRleHQgZm9yIHVzZSBieSB0aGUgY2FsbGJhY2sgcmVjZWl2ZXIuCi0gICAgICogc2Vzc2lvbklEOiAgIGF1ZGlvIHNlc3Npb24gdGhpcyBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0by4KKyAgICAgKiBzZXNzaW9uSWQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLgogICAgICAqICAgICAgSWYgZXF1YWwgdG8gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCiAgICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gIE90aGVyd2lzZSwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKICAgICAgKiAgICAgIChBdWRpb1RyYWNrIG9yIE1lZGlhUExheWVyKSB3aXRoaW4gdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KQEAgLTM2OSw0NiArMzc0LDEzIEBACiAgICAgICogICAgICAgIEluIHRoaXMgbW9kZSwgbm8gSUVmZmVjdCBpbnRlcmZhY2UgdG8gQXVkaW9GbGluZ2VyIGlzIGNyZWF0ZWQgYW5kIGFsbCBhY3Rpb25zCiAgICAgICogICAgICAgIGJlc2lkZXMgZ2V0dGVycyBpbXBsZW1lbnRlZCBpbiBjbGllbnQgQXVkaW9FZmZlY3Qgb2JqZWN0IGFyZSBubyBvcHMKICAgICAgKiAgICAgICAgYWZ0ZXIgZWZmZWN0IGNyZWF0aW9uLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogIC0gTk9fRVJST1Igb3IgQUxSRUFEWV9FWElTVFM6IHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KKyAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogQXVkaW9FZmZlY3QgaXMgYWxyZWFkeSBpbml0aWFsaXplZAorICAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIKKyAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBmbGluZ2VyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAogICAgICAqLwotCi0gICAgQXVkaW9FZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkID0gTlVMTCwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKLSAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAotICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCi0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKLSAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fSwKLSAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UpOwotCi0gICAgLyogQ29uc3RydWN0b3IuCi0gICAgICogICAgICBTYW1lIGFzIGFib3ZlIGJ1dCB3aXRoIHR5cGUgYW5kIHV1aWQgc3BlY2lmaWVkIGJ5IGNoYXJhY3RlciBzdHJpbmdzCi0gICAgICovCi0gICAgQXVkaW9FZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAotICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UpOwotCi0gICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9FZmZlY3QgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgotICAgICAqIFRoZSBlZmZlY3QgZW5naW5lIGlzIGFsc28gZGVzdHJveWVkIGlmIHRoaXMgQXVkaW9FZmZlY3Qgd2FzIHRoZSBsYXN0IGNvbnRyb2xsaW5nCi0gICAgICogdGhlIGVuZ2luZS4KLSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH5BdWRpb0VmZmVjdCgpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbiB1bmluaXRpYWxpemVkIEF1ZGlvRWZmZWN0LgotICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6Ci0gICAgKiAgLSBOT19FUlJPUiBvciBBTFJFQURZX0VYSVNUUzogc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgotICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IEF1ZGlvRWZmZWN0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKLSAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIKLSAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIGZsaW5nZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCi0gICAgKiAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCkBAIC00MTgsNiArMzkwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UpOworICAgIC8qCisgICAgICogU2FtZSBhcyBhYm92ZSBidXQgd2l0aCB0eXBlIGFuZCB1dWlkIHNwZWNpZmllZCBieSBjaGFyYWN0ZXIgc3RyaW5ncy4KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb0VmZmVjdC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQKICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvRWZmZWN0IEFQSS4KQEAgLTU0NywyMSArNTMxLDIwIEBACiAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4UHJlUHJvY2Vzc2luZyA9IDEwOwogCiBwcm90ZWN0ZWQ6Ci0gICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkOyAgICAgICAgICAgLy8gZW5hYmxlIHN0YXRlCi0gICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7ICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtUHJpb3JpdHk7ICAgICAgICAgIC8vIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbAotICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtU3RhdHVzOyAgICAgICAgICAgIC8vIGVmZmVjdCBzdGF0dXMKLSAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVByb2JlOyAgICAgICAgICAgICAvLyBlZmZlY3QgY3JlYXRlZCBpbiBwcm9iZSBtb2RlOiBhbGwgY29tbWFuZHMKKyAgICAgY29uc3QgU3RyaW5nMTYgICAgICAgICAgbU9wUGFja2FnZU5hbWU7ICAgICAvLyBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCisgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gZW5hYmxlIHN0YXRlCisgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVg7IC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVByaW9yaXR5ID0gMDsgICAgICAvLyBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2wKKyAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7ICAvLyBlZmZlY3Qgc3RhdHVzCisgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Qcm9iZSA9IGZhbHNlOyAgICAgLy8gZWZmZWN0IGNyZWF0ZWQgaW4gcHJvYmUgbW9kZTogYWxsIGNvbW1hbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIG5vIG9wcyBiZWNhdXNlIG1JRWZmZWN0IGlzIE5VTEwKLSAgICAgZWZmZWN0X2NhbGxiYWNrX3QgICAgICAgbUNiZjsgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3Igc3RhdHVzLCBjb250cm9sIGFuZAorICAgICBlZmZlY3RfY2FsbGJhY2tfdCAgICAgICBtQ2JmID0gbnVsbHB0cjsgICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBzdGF0dXMsIGNvbnRyb2wgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGNoYW5nZXMgbm90aWZpY2F0aW9ucwotICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtVXNlckRhdGE7ICAgICAgICAgIC8vIGNsaWVudCBjb250ZXh0IGZvciBjYWxsYmFjayBmdW5jdGlvbgotICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICAgICBtRGVzY3JpcHRvcjsgICAgICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCi0gICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1JZDsgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHdpZGUgdW5pcXVlIGVmZmVjdCBlbmdpbmUgaW5zdGFuY2UgSUQKKyAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhID0gbnVsbHB0cjsvLyBjbGllbnQgY29udGV4dCBmb3IgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAgICAgbURlc2NyaXB0b3IgPSB7fTsgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtSWQgPSAtMTsgICAgICAgICAgIC8vIHN5c3RlbSB3aWRlIHVuaXF1ZSBlZmZlY3QgZW5naW5lIGluc3RhbmNlIElECiAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAgICAgLy8gTXV0ZXggZm9yIG1FbmFibGVkIGFjY2VzcwotICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtQ29uc3RydWN0TG9jazsgICAgIC8vIE11dGV4IGZvciBpbnRlZ3JhbGl0eSBjb25zdHJ1Y3Rpb24KIAotICAgICBTdHJpbmcxNiAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZTsgICAgIC8vIFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KIAogICAgICAvLyBJRWZmZWN0Q2xpZW50CiAgICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKTsKQEAgLTU4NiwyMiArNTY5LDEyIEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSB7CiAgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEdvdCB0aGUgbUNvbnN0cnVjdExvY2sgbWVhbnMgdGhlIGNvbnN0cnVjdGlvbiBvZiBBdWRpb0VmZmVjdAotICAgICAgICAgICAgICAgICAgICAvLyBoYXMgZmluaXNoZWQsIHdlIHNob3VsZCByZWxlYXNlIHRoZSBtQ29uc3RydWN0TG9jayBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2soZWZmZWN0LT5tQ29uc3RydWN0TG9jayk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29udHJvbFN0YXR1c0NoYW5nZWQoY29udHJvbEdyYW50ZWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgewogICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBHb3QgdGhlIG1Db25zdHJ1Y3RMb2NrIG1lYW5zIHRoZSBjb25zdHJ1Y3Rpb24gb2YgQXVkaW9FZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGZpbmlzaGVkLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUgbUNvbnN0cnVjdExvY2sgaW1tZWRpYXRlbHkuCi0gICAgICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKGVmZmVjdC0+bUNvbnN0cnVjdExvY2spOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3QtPmVuYWJsZVN0YXR1c0NoYW5nZWQoZW5hYmxlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYxMiwxMSArNTg1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKSB7CiAgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEdvdCB0aGUgbUNvbnN0cnVjdExvY2sgbWVhbnMgdGhlIGNvbnN0cnVjdGlvbiBvZiBBdWRpb0VmZmVjdAotICAgICAgICAgICAgICAgICAgICAvLyBoYXMgZmluaXNoZWQsIHdlIHNob3VsZCByZWxlYXNlIHRoZSBtQ29uc3RydWN0TG9jayBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2soZWZmZWN0LT5tQ29uc3RydWN0TG9jayk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29tbWFuZEV4ZWN1dGVkKAogICAgICAgICAgICAgICAgICAgICBjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKICAgICAgICAgICAgIH0KQEAgLTYyNiwxMSArNTk0LDYgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKICAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gR290IHRoZSBtQ29uc3RydWN0TG9jayBtZWFucyB0aGUgY29uc3RydWN0aW9uIG9mIEF1ZGlvRWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhcyBmaW5pc2hlZCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIG1Db25zdHJ1Y3RMb2NrIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhlZmZlY3QtPm1Db25zdHJ1Y3RMb2NrKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWZmZWN0LT5iaW5kZXJEaWVkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY0NCw3ICs2MDcsNyBAQAogICAgIHNwPElFZmZlY3Q+ICAgICAgICAgICAgIG1JRWZmZWN0OyAgICAgICAgICAgLy8gSUVmZmVjdCBiaW5kZXIgaW50ZXJmYWNlCiAgICAgc3A8RWZmZWN0Q2xpZW50PiAgICAgICAgbUlFZmZlY3RDbGllbnQ7ICAgICAvLyBJRWZmZWN0Q2xpZW50IGltcGxlbWVudGF0aW9uCiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7ICAgICAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZwotICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqICAgIG1DYmxrOyAgICAgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKKyAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiAgICBtQ2JsayA9IG51bGxwdHI7ICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZCA9IChwaWRfdCktMTsKICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkID0gKHVpZF90KS0xOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggNTQ4YjA4MC4uYThlNmMzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDEyIEBACiAgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXJfaGVhZGVycyIsCiAgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCmluZGV4IDNkYmUzN2QuLmU5YjU4OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcApAQCAtMjIsNiArMjIsOSBAQAogI2luY2x1ZGUgPG1lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8cmVnZXg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRGV2aWNlRGVzY3JpcHRvckJhc2U6OkRldmljZURlc2NyaXB0b3JCYXNlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSA6CkBAIC0zNCw2ICszNywzMSBAQAogewogfQogCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgU1VQUFJFU1NFRCA9ICJTVVBQUkVTU0VEIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnJlZ2V4IE1BQ19BRERSRVNTX1JFR0VYKCIoWzAtOWEtZkEtRl17Mn06KXs1fVswLTlhLWZBLUZdezJ9Iik7CisKK2Jvb2wgaXNBZGRyZXNzU2Vuc2l0aXZlKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSB7CisgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goYWRkcmVzcywgTUFDX0FERFJFU1NfUkVHRVgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNvY2thZGRyX3N0b3JhZ2Ugc3M0OworICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVCwgYWRkcmVzcy5jX3N0cigpLCAmc3M0KSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc29ja2FkZHJfc3RvcmFnZSBzczY7CisgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgYWRkcmVzcy5jX3N0cigpLCAmc3M2KSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZQorCiBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6RGV2aWNlRGVzY3JpcHRvckJhc2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIpIDoKICAgICAgICAgQXVkaW9Qb3J0KCIiLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLAogICAgICAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlQWRkci5tVHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CkBAIC00Myw2ICs3MSwxMiBAQAogICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MuZW1wdHkoKSAmJiBhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShtRGV2aWNlVHlwZUFkZHIubVR5cGUpKSB7CiAgICAgICAgIG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzcyA9ICIwIjsKICAgICB9CisgICAgbUlzQWRkcmVzc1NlbnNpdGl2ZSA9IGlzQWRkcmVzc1NlbnNpdGl2ZShtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MpOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjpzZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSB7CisgICAgbURldmljZVR5cGVBZGRyLm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBtSXNBZGRyZXNzU2Vuc2l0aXZlID0gaXNBZGRyZXNzU2Vuc2l0aXZlKGFkZHJlc3MpOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTEzMCwxMCArMTY0LDE1IEBACiAgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgc3BhY2VzLCB2ZXJib3NlKTsKIH0KIAotc3RkOjpzdHJpbmcgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvU3RyaW5nKCkgY29uc3QKK3N0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3JCYXNlOjp0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSBjb25zdAogewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07Ci0gICAgc3N0cmVhbSA8PCAidHlwZToweCIgPDwgc3RkOjpoZXggPDwgdHlwZSgpIDw8ICIsQDoiIDw8IG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzczsKKyAgICBzc3RyZWFtIDw8ICJ0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCB0eXBlKCk7CisgICAgLy8gSVAgYW5kIE1BQyBhZGRyZXNzIGFyZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIFRoZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2lsbCBiZSBzdXBwcmVzc2VkCisgICAgLy8gaXMgYGluY2x1ZGVTZW5zaXRpdmVJbmZvYCBpcyBmYWxzZS4KKyAgICBzc3RyZWFtIDw8ICIsQDoiCisgICAgICAgICAgICA8PCAoIWluY2x1ZGVTZW5zaXRpdmVJbmZvICYmIG1Jc0FkZHJlc3NTZW5zaXRpdmUgPyBTVVBQUkVTU0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MpOwogICAgIHJldHVybiBzc3RyZWFtLnN0cigpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaAppbmRleCBhZjA0NzIxLi5jMTQzYzdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmgKQEAgLTQyLDcgKzQyLDcgQEAKIAogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyLm1UeXBlOyB9CiAgICAgc3RkOjpzdHJpbmcgYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzczsgfQotICAgIHZvaWQgc2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgeyBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MgPSBhZGRyZXNzOyB9CisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKTsKICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBnZXREZXZpY2VUeXBlQWRkcigpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkcjsgfQogCiAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCkBAIC02MSw3ICs2MSwxNCBAQAogICAgIHZvaWQgZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dHJhSW5mbyA9IG51bGxwdHIsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogICAgIHZvaWQgbG9nKCkgY29uc3Q7Ci0gICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyB0byBkZXNjcmliZSB0aGUgRGV2aWNlRGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlU2Vuc2l0aXZlSW5mbyBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB3aGVuIGl0IGlzIHRydWUuCisgICAgICogQHJldHVybiBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBEZXZpY2VEZXNjcmlwdG9yLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8gPSBmYWxzZSkgY29uc3Q7CiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIG90aGVyKSBjb25zdDsKIApAQCAtNzAsNiArNzcsNyBAQAogCiBwcm90ZWN0ZWQ6CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBtRGV2aWNlVHlwZUFkZHI7CisgICAgYm9vbCBtSXNBZGRyZXNzU2Vuc2l0aXZlOwogICAgIHVpbnQzMl90IG1FbmNhcHN1bGF0aW9uTW9kZXMgPSAwOwogICAgIHVpbnQzMl90IG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTCmluZGV4IDE0NTZhYjYuLjcxYjE3ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUworKysgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKQEAgLTEsMiArMSBAQAota3JvY2FyZEBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKaW5kZXggNWZkMzkxMi4uZjZhNTU0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAppbmRleCBlYzU2YjAwLi4xYWFjZmQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKQEAgLTYzNiw3ICs2MzUsNyBAQAogICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0ID0gYy5tTCA8PCBjLm1TaGlmdDsKICAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKHBoYXNlSW5jcmVtZW50ICogKHVpbnQ2NF90KW91dEZyYW1lQ291bnQgKyBwaGFzZUZyYWN0aW9uKQogICAgICAgICAgICAgLyBwaGFzZVdyYXBMaW1pdDsKLSAgICAvLyBzYW5pdHkgY2hlY2sgdGhhdCBpbkZyYW1lQ291bnQgaXMgaW4gc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIHJhbmdlLgorICAgIC8vIHZhbGlkYXRlIHRoYXQgaW5GcmFtZUNvdW50IGlzIGluIHNpZ25lZCAzMiBiaXQgaW50ZWdlciByYW5nZS4KICAgICBBTE9HX0FTU0VSVCgwIDw9IGluRnJhbWVDb3VudCAmJiBpbkZyYW1lQ291bnQgPCAoMVUgPDwgMzEpKTsKIAogICAgIC8vQUxPR1YoImluRnJhbWVDb3VudDolZCAgb3V0RnJhbWVDb3VudDolZCIKQEAgLTY0Niw3ICs2NDUsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgLy8gdGhlIGZvbGxvd2luZyBsb2dpYyBpcyBhIGJpdCBjb252b2x1dGVkIHRvIGtlZXAgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wCiAgICAgLy8gYXMgdGlnaHQgYXMgcG9zc2libGUgd2l0aCByZWdpc3RlciBhbGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCmluZGV4IDliNzBhMWMuLjFmY2ZmY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTM4MSw3ICszODEsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgaWYgKExPQ0tFRCkgewogICAgICAgICAvLyBsb2NrZWQgcG9seXBoYXNlIChubyBpbnRlcnBvbGF0aW9uKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCA1YTAzYTBkLi5mMmMzODZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCiAgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKICAgICAvLyB0byBnZW5lcmF0ZSBmYXIgbGVzcyBlZmZpY2llbnQgY29kZS4KLSAgICAvLyBBbHdheXMgc2FuaXR5IGNoZWNrIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCisgICAgLy8gQWx3YXlzIHZhbGlkYXRlIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCiAKICAgICAvLyBjb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgY29lZmZpY2llbnQgb24gdGhlIHBvc2l0aXZlIHNpZGUgYW5kCiAgICAgLy8gbmVnYXRpdmUgc2lkZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCmluZGV4IDRiNzU0OWYuLmU3MWE3ZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAorKysgYi9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwppbmRleCA3ZjlhZTgxLi5iNzgzMmVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUworKysgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwpAQCAtMSw0ICsxLDMgQEAKIGh1bmdhQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQogcmFnb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYwppbmRleCBmY2VmMzZmLi5lMjM1MzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogICAgICAgIH0KICAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1YkVudHJ5ID0gKHN1Yl9lZmZlY3RfZW50cnlfdCopZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtLT5vYmplY3Q7CiAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc3ViRWZmZWN0RGVzYyA9IChlZmZlY3RfZGVzY3JpcHRvcl90Kikoc3ViRW50cnktPm9iamVjdCk7Ci0gICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIHN0dWIgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZwogICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb2RpbmcKICAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IHdpdGggUHJveHkgVVVJRAogICAgICAgIC8vIGNoZWNrIGZvciBTdyBkZXNjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKaW5kZXggNTA1YmU3Yy4uMzBhOTAwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsaXN0UHVzaChlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MuZ2V0KCksIHN1YkVmZmVjdExpc3QpOwogCi0gICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCisgICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBzdHViIGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKICAgICAgICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsIHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCBrZWVwIHRoZSBQcm94eSBVVUlECiAgICAgICAgICAgICAqZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjID0gKnN3RWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDY1MDhiNzMuLjQxNzBiM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpZm5kZWYgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KICNkZWZpbmUgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KIAotI2RlZmluZSBEQ19GTE9BVF9TVEVQICAgMC4wMDAwMDAyMzg0ZjsKKyNkZWZpbmUgRENfRkxPQVRfU1RFUCAgIDAuMDAwMDAwMjM4NGYKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY3NGMyNDYuLmFlYTc3MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icApAQCAtNDQsNiArNDQsMzYgQEAKIH0KIAogY2NfdGVzdCB7CisgICAgbmFtZTogInJldmVyYl90ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIiCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlicmV2ZXJid3JhcHBlciIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInJldmVyYl90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKICAgICBuYW1lOiAic25yIiwKICAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHNfcmV2ZXJiLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWE5NzJkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHNfcmV2ZXJiLnNoCkBAIC0wLDAgKzEsODcgQEAKKyMhL2Jpbi9iYXNoCisjCisjIHJldmVyYiB0ZXN0CisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9yZXZUZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyByZXZlcmIiCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCisKK0VfVkFMPTEKK2NtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3JldmVyYl90ZXN0L2FybS9yZXZlcmJfdGVzdCAkdGVzdGRpciIKKworZnNfYXJyPSgKKyAgICA4MDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDMyMDAwCisgICAgNDQxMDAKKyAgICA0ODAwMAorICAgIDg4MjAwCisgICAgOTYwMDAKKyAgICAxNzY0MDAKKyAgICAxOTIwMDAKKykKKworIyBydW4gcmV2ZXJiIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgc3RlcmVvIGNoYW5uZWwKKyMgcGFpci4KK2Vycm9yX2NvdW50PTAKK2ZvciBjbWQgaW4gIiR7Y21kc1tAXX0iCitkbworICAgICRjbWQKKyAgICBmb3IgcHJlc2V0X3ZhbCBpbiB7MC4uNn0KKyAgICBkbworICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgICAgIGRvCisgICAgICAgICAgICBmb3IgY2hNYXNrIGluIHsxLi4yMn0KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsIExEX0xJQlJBUllfUEFUSD0vc3lzdGVtL3ZlbmRvci9saWIvc291bmRmeCAkdGVzdGRpci9yZXZlcmJfdGVzdCBcCisgICAgICAgICAgICAgICAgICAgIC0taW5wdXQgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgIC0tY2hNYXNrICRjaE1hc2sgLS1mcyAkZnMgLS1wcmVzZXQgJHByZXNldF92YWwKKworICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImVycm9yOiAkc2hlbGxfcmV0IgorICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIChmaXJzdCAyIGNoYW5uZWxzKS4KKyAgICAgICAgICAgICAgICBpZiBbWyAiJGNoTWFzayIgLWd0IDEgXV0KKyAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzFfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3CisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAjIGNtcCByZXR1cm5zIEVYSVRfRkFJTFVSRSBvbiBtaXNtYXRjaC4KKyAgICAgICAgICAgICAgICBzaGVsbF9yZXQ9JD8KKyAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBlY2hvICJlcnJvcjogJHNoZWxsX3JldCIKKyAgICAgICAgICAgICAgICAgICAgKCgrK2Vycm9yX2NvdW50KSkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICBkb25lCisgICAgZG9uZQorZG9uZQorCithZGIgc2hlbGwgcm0gLXIgJHRlc3RkaXIKK2VjaG8gIiRlcnJvcl9jb3VudCBlcnJvcnMiCitleGl0ICRlcnJvcl9jb3VudApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvcmV2ZXJiX3Rlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvcmV2ZXJiX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Y2YzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9yZXZlcmJfdGVzdC5jcHAKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkVmZmVjdFJldmVyYi5oIgorCisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKKworLy8gR2xvYmFsIFZhcmlhYmxlcworZW51bSBSZXZlcmJQYXJhbXMgeworICBBUkdfSEVMUCA9IDEsCisgIEFSR19JTlBVVCwKKyAgQVJHX09VVFBVVCwKKyAgQVJHX0ZTLAorICBBUkdfQ0hfTUFTSywKKyAgQVJHX1BSRVNFVCwKKyAgQVJHX0FVWCwKKyAgQVJHX01PTk9fTU9ERSwKKyAgQVJHX0ZJTEVfQ0gsCit9OworCitjb25zdCBlZmZlY3RfdXVpZF90IGtSZXZlcmJVdWlkc1tdID0geworICAgIHsweDE3MmNkZjAwLAorICAgICAweGEzYmMsCisgICAgIDB4MTFkZiwKKyAgICAgMHhhNzJmLAorICAgICB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gcHJlc2V0LWluc2VydCBtb2RlCisgICAgezB4ZjI5YTE0MDAsCisgICAgIDB4YTNiYiwKKyAgICAgMHgxMWRmLAorICAgICAweDhkZGMsCisgICAgIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBwcmVzZXQtYXV4IG1vZGUKK307CisKKy8vIHN0cnVjdHVyZXMKK3N0cnVjdCByZXZlcmJDb25maWdQYXJhbXNfdCB7CisgIGludCBmQ2hhbm5lbHMgPSAyOworICBpbnQgbW9ub01vZGUgPSBmYWxzZTsKKyAgaW50IGZyYW1lTGVuZ3RoID0gMjU2OworICBpbnQgcHJlc2V0ID0gMDsKKyAgaW50IG5yQ2hhbm5lbHMgPSAyOworICBpbnQgc2FtcGxlUmF0ZSA9IDQ4MDAwOworICBpbnQgYXV4aWxpYXJ5ID0gMDsKKyAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworfTsKKworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtSZXZlcmJDb25maWdDaE1hc2tbXSA9IHsKKyAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgICgxIDw8IDQpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgKDEgPDwgNSkgLSAxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgICgxIDw8IDYpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAorICAgICgxIDw8IDcpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgKDEgPDwgOCkgLSAxLAorfTsKKworY29uc3RleHByIGludCBrUmV2ZXJiQ29uZmlnQ2hNYXNrQ291bnQgPSBzdGQ6OnNpemUoa1JldmVyYkNvbmZpZ0NoTWFzayk7CisKK2ludCByZXZlcmJDcmVhdGVFZmZlY3QoZWZmZWN0X2hhbmRsZV90ICpwRWZmZWN0SGFuZGxlLCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcsIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpb0lkLCBpbnQgYXV4RmxhZykgeworICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoJmtSZXZlcmJVdWlkc1thdXhGbGFnXSwgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICBzdGF0dXMgIT0gMCkgeworICAgIEFMT0dFKCJSZXZlcmIgY3JlYXRlIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBpbnQgcmVwbHkgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLCBwQ29uZmlnLAorICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgIHJldHVybiByZXBseTsKK30KKworaW50IHJldmVyYlNldENvbmZpZ1BhcmFtKHVpbnQzMl90IHBhcmFtVHlwZSwgdWludDMyX3QgcGFyYW1WYWx1ZSwgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSkgeworICBpbnQgcmVwbHkgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICB1aW50MzJfdCBwYXJhbURhdGFbMl0gPSB7cGFyYW1UeXBlLCBwYXJhbVZhbHVlfTsKKyAgZWZmZWN0X3BhcmFtX3QgKmVmZmVjdFBhcmFtID0KKyAgICAgIChlZmZlY3RfcGFyYW1fdCAqKW1hbGxvYyhzaXplb2YoKmVmZmVjdFBhcmFtKSArIHNpemVvZihwYXJhbURhdGEpKTsKKyAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnBhcmFtRGF0YVswXSwgc2l6ZW9mKHBhcmFtRGF0YSkpOworICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgZWZmZWN0UGFyYW0tPnZzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVsxXSk7CisgIGludCBzdGF0dXMgPQorICAgICAgKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YocGFyYW1EYXRhKSwgZWZmZWN0UGFyYW0sICZyZXBseVNpemUsICZyZXBseSk7CisgIGZyZWUoZWZmZWN0UGFyYW0pOworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICBBTE9HRSgiUmV2ZXJiIHNldCBjb25maWcgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisgIHJldHVybiByZXBseTsKK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlIG9wdGlvbnMgYXJlLCAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1pbnB1dCA8aW5wdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIC0tb3V0cHV0IDxvdXRwdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICAtLWhlbHAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgcHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1jaE1hc2sgPGNoYW5uZWxfbWFzaz5cbiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNiAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOworICBwcmludGYoIlxuICAgICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICA5ICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTIgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA1IGNoOiAoMSA8PCA1KSAtIDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNSAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxOCAtIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDIxIC0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mcyA8c2FtcGxpbmdfZnJlcT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDQ4MDAwLiIpOworICBwcmludGYoIlxuICAgICAtLXByZXNldCA8cHJlc2V0X3ZhbHVlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gTm9uZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxIC0gU21hbGwgUm9vbSIpOworICBwcmludGYoIlxuICAgICAgICAgICAyIC0gTWVkaXVtIFJvb20iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMyAtIExhcmdlIFJvb20iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNCAtIE1lZGl1bSBIYWxsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDUgLSBMYXJnZSBIYWxsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDYgLSBQbGF0ZSIpOworICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mY2ggPGZpbGVfY2hhbm5lbHM+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIG51bWJlciBvZiBjaGFubmVscyBpbiBpbnB1dCBmaWxlICgxIHRocm91Z2ggOCksIGRlZmF1bHQgMSIpOworICBwcmludGYoIlxuICAgICAtLU0iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgTW9ubyBtb2RlIChmb3JjZSBhbGwgaW5wdXQgYXVkaW8gY2hhbm5lbHMgdG8gYmUgaWRlbnRpY2FsKSIpOworICBwcmludGYoIlxuICAgICAtLWF1eCA8YXV4aWxpYXJ5X2ZsYWc+ICIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gSW5zZXJ0IE1vZGUgb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAtIGF1eGlsaWFyeSBNb2RlIG9uIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgcmV2ZXJiQ29uZmlnUGFyYW1zX3QgcmV2Q29uZmlnUGFyYW1ze307ICAvLyBkZWZhdWx0IGluaXRpYWxpemUKKyAgY29uc3QgY2hhciAqaW5wdXRGaWxlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqb3V0cHV0RmlsZSA9IG51bGxwdHI7CisKKyAgY29uc3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0geworICAgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIG51bGxwdHIsIEFSR19IRUxQfSwKKyAgICAgIHsiaW5wdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0lOUFVUfSwKKyAgICAgIHsib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19PVVRQVVR9LAorICAgICAgeyJmcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRlN9LAorICAgICAgeyJjaE1hc2siLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0NIX01BU0t9LAorICAgICAgeyJwcmVzZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX1BSRVNFVH0sCisgICAgICB7ImF1eCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQVVYfSwKKyAgICAgIHsiTSIsIG5vX2FyZ3VtZW50LCAmcmV2Q29uZmlnUGFyYW1zLm1vbm9Nb2RlLCB0cnVlfSwKKyAgICAgIHsiZmNoIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19GSUxFX0NIfSwKKyAgICAgIHtudWxscHRyLCAwLCBudWxscHRyLCAwfSwKKyAgfTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnN0IGludCBvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCAoY2hhciAqY29uc3QgKilhcmd2LCAiaTpvOiIsIGxvbmdfb3B0cywgbnVsbHB0cik7CisgICAgaWYgKG9wdCA9PSAtMSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAob3B0KSB7CisgICAgICBjYXNlIEFSR19IRUxQOgorICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CisgICAgICBjYXNlIEFSR19JTlBVVDogeworICAgICAgICBpbnB1dEZpbGUgPSAoY2hhciAqKW9wdGFyZzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19PVVRQVVQ6IHsKKyAgICAgICAgb3V0cHV0RmlsZSA9IChjaGFyICopb3B0YXJnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX0ZTOiB7CisgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5zYW1wbGVSYXRlID0gYXRvaShvcHRhcmcpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX0NIX01BU0s6IHsKKyAgICAgICAgaW50IGNoTWFza0lkeCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgaWYgKGNoTWFza0lkeCA8IDAgb3IgY2hNYXNrSWR4ID4ga1JldmVyYkNvbmZpZ0NoTWFza0NvdW50KSB7CisgICAgICAgICAgQUxPR0UoIkNoYW5uZWwgTWFzayBpbmRleCBub3QgaW4gY29ycmVjdCByYW5nZVxuIik7CisgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmNoTWFzayA9IGtSZXZlcmJDb25maWdDaE1hc2tbY2hNYXNrSWR4XTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19QUkVTRVQ6IHsKKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLnByZXNldCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19BVVg6IHsKKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmF1eGlsaWFyeSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19NT05PX01PREU6IHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19GSUxFX0NIOiB7CisgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGlucHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIGlucHV0IGZpbGVzXG4iKTsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGlucHV0RnAoZm9wZW4oaW5wdXRGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisKKyAgaWYgKGlucHV0RnAgPT0gbnVsbHB0cikgeworICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBpbnB1dEZpbGUpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBpZiAob3V0cHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIG91dHB1dCBmaWxlc1xuIik7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBvdXRwdXRGcChmb3BlbihvdXRwdXRGaWxlLCAid2IiKSwgJmZjbG9zZSk7CisKKyAgaWYgKG91dHB1dEZwID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dHB1dEZpbGUpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBpbnQzMl90IHNlc3Npb25JZCA9IDE7CisgIGludDMyX3QgaW9JZCA9IDE7CisgIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUgPSBudWxscHRyOworICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSByZXZDb25maWdQYXJhbXMuc2FtcGxlUmF0ZTsKKyAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHJldkNvbmZpZ1BhcmFtcy5jaE1hc2s7CisgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICByZXZlcmJDcmVhdGVFZmZlY3QoJmVmZmVjdEhhbmRsZSwgJmNvbmZpZywgc2Vzc2lvbklkLCBpb0lkLCByZXZDb25maWdQYXJhbXMuYXV4aWxpYXJ5KTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIGludCByZXBseSA9IDA7CisgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICgqZWZmZWN0SGFuZGxlKS0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICBpZiAocmVwbHkgIT0gMCkgeworICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIGlmIChpbnQgc3RhdHVzID0gcmV2ZXJiU2V0Q29uZmlnUGFyYW0oUkVWRVJCX1BBUkFNX1BSRVNFVCwgKHVpbnQzMl90KXJldkNvbmZpZ1BhcmFtcy5wcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlKTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkludmFsaWQgcmV2ZXJiIHByZXNldC4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIHJldkNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHJldkNvbmZpZ1BhcmFtcy5jaE1hc2spOworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcmV2Q29uZmlnUGFyYW1zLm5yQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHJldkNvbmZpZ1BhcmFtcy5mcmFtZUxlbmd0aDsKKyNpZmRlZiBCWVBBU1NfRVhFQworICBjb25zdCBpbnQgZnJhbWVTaXplID0gKGludCljaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOworI2VuZGlmCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHM7CisgIGNvbnN0IGludCBpb0ZyYW1lU2l6ZSA9IGlvQ2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsKKyAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOworICAvKgorICAgKiBNb25vIGlucHV0IHdpbGwgYmUgY29udmVydGVkIHRvIDIgY2hhbm5lbHMgaW50ZXJuYWxseSBpbiB0aGUgcHJvY2VzcyBjYWxsCisgICAqIGJ5IGNvcHlpbmcgdGhlIHNhbWUgZGF0YSBpbnRvIHRoZSBzZWNvbmQgY2hhbm5lbC4KKyAgICogSGVuY2Ugd2hlbiBjaGFubmVsQ291bnQgaXMgMSwgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGZvcgorICAgKiAyIGNoYW5uZWxzLiBUaGUgbWVtQWxsb2NDaENvdW50IHRha2VzIGNhcmUgb2YgYWxsb2NhdGlvbiBvZiBzdWZmaWNpZW50CisgICAqIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBidWZmZXIuCisgICAqLworICBjb25zdCBpbnQgbWVtQWxsb2NDaENvdW50ID0gKGNoYW5uZWxDb3VudCA9PSAxID8gMiA6IGNoYW5uZWxDb3VudCk7CisKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogbWVtQWxsb2NDaENvdW50KTsKKworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGlucHV0RnAuZ2V0KCkpID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdEluLmRhdGEoKSwgaW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAvLyBNb25vIG1vZGUgd2lsbCByZXBsaWNhdGUgdGhlIGZpcnN0IGNoYW5uZWwgdG8gYWxsIG90aGVyIGNoYW5uZWxzLgorICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgYXVkaW8gY2hhbm5lbHMgYXJlIGlkZW50aWNhbC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcKKyAgICAvLyBCYXNzIEJvb3N0LCB3aGljaCBleHRyYWN0cyBhIG1vbm8gc2lnbmFsIGZvciBwcm9jZXNzaW5nLgorICAgIGlmIChyZXZDb25maWdQYXJhbXMubW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7CisgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgIHN0ZDo6ZmlsbChmcCArIDEsIGZwICsgY2hhbm5lbENvdW50LCAqZnApOyAgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19idWZmZXJfdCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyOworICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lTGVuZ3RoOworICAgIGlucHV0QnVmZmVyLmYzMiA9IGZsb2F0SW4uZGF0YSgpOworICAgIG91dHB1dEJ1ZmZlci5mMzIgPSBmbG9hdE91dC5kYXRhKCk7CisjaWZuZGVmIEJZUEFTU19FWEVDCisgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlLCAmaW5wdXRCdWZmZXIsICZvdXRwdXRCdWZmZXIpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIlxuRXJyb3I6IFByb2Nlc3MgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorI2Vsc2UKKyAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOworI2VuZGlmCisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dC5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGNoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICB9CisgICAgKHZvaWQpZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgb3V0cHV0RnAuZ2V0KCkpOworICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgfQorCisgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkF1ZGlvIFByZXByb2Nlc3NpbmcgcmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisKKyAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKaW5kZXggYzg3NjM1Zi4uMTZjZDBhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKQEAgLTgsMTIgKzgsNiBAQAogCiAgICAgc3JjczogWyJQcmVQcm9jZXNzaW5nLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC93ZWJydGMiLAotICAgICAgICAiZXh0ZXJuYWwvd2VicnRjL3dlYnJ0Yy9tb2R1bGVzL2luY2x1ZGUiLAotICAgICAgICAiZXh0ZXJuYWwvd2VicnRjL3dlYnJ0Yy9tb2R1bGVzL2F1ZGlvX3Byb2Nlc3NpbmcvaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJ3ZWJydGNfYXVkaW9fcHJlcHJvY2Vzc2luZyIsCiAgICAgICAgICJsaWJzcGVleHJlc2FtcGxlciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKaW5kZXggNWZhYjViZS4uYzdhZmUyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApAQCAtMTI0MCw5ICsxMjQwLDkgQEAKICAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnMxNiwKICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiwKICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYgKyBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNPdXQgLSBmcikgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtbW92ZShzZXNzaW9uLT5vdXRCdWYsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiArIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzT3V0IC0gZnIpICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc091dCAtPSBmcjsKICAgICAgICAgICAgIGZyYW1lc1dyICs9IGZyOwogICAgICAgICB9CkBAIC0xMzAzLDkgKzEzMDMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPmRhdGFfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJPdXQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPmluQnVmLAotICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNJbiAtIGZySW4pICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtbW92ZShzZXNzaW9uLT5pbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYgKyBmckluICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNJbiAtIGZySW4pICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzSW4gLT0gZnJJbjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lQ291bnQgLSBzZXNzaW9uLT5mcmFtZXNJbjsKQEAgLTEzODEsOSArMTM4MSw5IEBACiAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnMxNiArIGZyYW1lc1dyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYsCiAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgbWVtY3B5KHNlc3Npb24tPm91dEJ1ZiwKLSAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNPdXQgLSBmcikgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBtZW1tb3ZlKHNlc3Npb24tPm91dEJ1ZiwKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYgKyBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzT3V0IC0gZnIpICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0IC09IGZyOwogICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKz0gZnI7CiAKQEAgLTE4MzcsOSArMTgzNyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkZyYW1lLT5kYXRhXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZCdWYsCi0gICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNSZXYgLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIG1lbW1vdmUoc2Vzc2lvbi0+cmV2QnVmLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZCdWYgKyBmckluICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNSZXYgLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiAtPSBmckluOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVDb3VudCAtIHNlc3Npb24tPmZyYW1lc1JldjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIGF1ZGlvIHByZXByb2Nlc3NpbmcgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsiUHJlUHJvY2Vzc2luZ1Rlc3QuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wcmVwcm9jZXNzaW5nIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYndlYnJ0Y19hdWRpb19wcmVwcm9jZXNzaW5nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFdFQlJUQ19QT1NJWCIsCisgICAgICAgICItZnZpc2liaWxpdHk9ZGVmYXVsdCIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL1ByZVByb2Nlc3NpbmdUZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4MWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KKyNpbmNsdWRlIDxhdWRpb19wcm9jZXNzaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bW9kdWxlX2NvbW1vbl90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgaW1wb3J0ZWQKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHR5cGVzIG9mIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKK2VudW0gUHJlUHJvY0lkIHsKKyAgUFJFUFJPQ19BR0MsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCisgIFBSRVBST0NfQUVDLCAgLy8gQWNvdXN0aWMgRWNobyBDYW5jZWxlcgorICBQUkVQUk9DX05TLCAgIC8vIE5vaXNlIFN1cHByZXNzb3IKKyAgUFJFUFJPQ19OVU1fRUZGRUNUUworfTsKKworZW51bSBQcmVQcm9jUGFyYW1zIHsKKyAgQVJHX0hFTFAgPSAxLAorICBBUkdfSU5QVVQsCisgIEFSR19PVVRQVVQsCisgIEFSR19GQVIsCisgIEFSR19GUywKKyAgQVJHX0NIX01BU0ssCisgIEFSR19BR0NfVEdUX0xWTCwKKyAgQVJHX0FHQ19DT01QX0xWTCwKKyAgQVJHX0FFQ19ERUxBWSwKKyAgQVJHX05TX0xWTCwKK307CisKK3N0cnVjdCBwcmVQcm9jQ29uZmlnUGFyYW1zX3QgeworICBpbnQgc2FtcGxpbmdGcmVxID0gMTYwMDA7CisgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTzsKKyAgaW50IG5zTGV2ZWwgPSAwOyAgICAgICAgIC8vIGEgdmFsdWUgYmV0d2VlbiAwLTMKKyAgaW50IGFnY1RhcmdldExldmVsID0gMzsgIC8vIGluIGRCCisgIGludCBhZ2NDb21wTGV2ZWwgPSA5OyAgICAvLyBpbiBkQgorICBpbnQgYWVjRGVsYXkgPSAwOyAgICAgICAgLy8gaW4gbXMKK307CisKK2NvbnN0IGVmZmVjdF91dWlkX3Qga1ByZVByb2NVdWlkc1tQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsKKyAgICB7MHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIGFnYyB1dWlkCisgICAgezB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBhZWMgdXVpZAorICAgIHsweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gbnMgIHV1aWQKK307CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrUHJlUHJvY0NvbmZpZ0NoTWFza1tdID0geworICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICBBVURJT19DSEFOTkVMX0lOX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9JTl82LAorICAgIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTywKKyAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PLAorICAgIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PLAorfTsKKworY29uc3RleHByIGludCBrUHJlUHJvY0NvbmZpZ0NoTWFza0NvdW50ID0gc3RkOjpzaXplKGtQcmVQcm9jQ29uZmlnQ2hNYXNrKTsKKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlIG9wdGlvbnMgYXJlLCAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1pbnB1dCA8aW5wdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIC0tb3V0cHV0IDxvdXRwdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICAtLWhlbHAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mcyA8c2FtcGxpbmdfZnJlcT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDE2MDAwLiIpOworICBwcmludGYoIlxuICAgICAtY2hfbWFzayA8Y2hhbm5lbF9tYXNrPlxuIik7CisgIHByaW50ZigiXG4gICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfSU5fTU9OTyIpOworICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIpOworICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9JTl82Iik7CisgIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDYgIC0gQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgOCAgLSBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDkgIC0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTyIpOworICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PICIpOworICBwcmludGYoIlxuICAgICAgICAgMTEgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTyAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtLWZhciA8ZmFyZW5kX2ZpbGU+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIFBhdGggdG8gZmFyLWVuZCBmaWxlIG5lZWRlZCBmb3IgZWNobyBjYW5jZWxsYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1hZWMiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVjaG8gQ2FuY2VsbGF0aW9uLCBkZWZhdWx0IGRpc2FibGVkIik7CisgIHByaW50ZigiXG4gICAgIC0tbnMiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIE5vaXNlIFN1cHByZXNzaW9uLCBkZWZhdWx0IGRpc2FibGVkIik7CisgIHByaW50ZigiXG4gICAgIC0tYWdjIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBHYWluIENvbnRyb2wsIGRlZmF1bHQgZGlzYWJsZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1uc19sdmwgPG5zX2xldmVsPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBOb2lzZSBTdXBwcmVzc2lvbiBsZXZlbCBpbiBkQiwgZGVmYXVsdCB2YWx1ZSAwZEIiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1hZ2NfdGd0X2x2bCA8dGFyZ2V0X2xldmVsPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBBR0MgVGFyZ2V0IExldmVsIGluIGRCLCBkZWZhdWx0IHZhbHVlIDNkQiIpOworICBwcmludGYoIlxuICAgICAtLWFnY19jb21wX2x2bCA8Y29tcF9sZXZlbD4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQUdDIENvbXAgTGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgOWRCIik7CisgIHByaW50ZigiXG4gICAgIC0tYWVjX2RlbGF5IDxkZWxheT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQUVDIGRlbGF5IHZhbHVlIGluIG1zLCBkZWZhdWx0IHZhbHVlIDBtcyIpOworICBwcmludGYoIlxuIik7Cit9CisKK2NvbnN0ZXhwciBmbG9hdCBrVGVuTWlsbGlTZWNWYWwgPSAwLjAxOworCitpbnQgcHJlUHJvY0NyZWF0ZUVmZmVjdChlZmZlY3RfaGFuZGxlX3QgKnBFZmZlY3RIYW5kbGUsIHVpbnQzMl90IGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcsIGludCBzZXNzaW9uSWQsIGludCBpb0lkKSB7CisgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdCgma1ByZVByb2NVdWlkc1tlZmZlY3RUeXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICBzdGF0dXMgIT0gMCkgeworICAgIEFMT0dFKCJBdWRpbyBQcmVwcm9jZXNzaW5nIGNyZWF0ZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgaW50IHJlcGx5ID0gMDsKKyAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgaWYgKGVmZmVjdFR5cGUgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywKKyAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgIH0KKyAgKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgIC0+Y29tbWFuZCgqcEVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywKKyAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCBwcmVQcm9jU2V0Q29uZmlnUGFyYW0odWludDMyX3QgcGFyYW1UeXBlLCB1aW50MzJfdCBwYXJhbVZhbHVlLCBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlKSB7CisgIGludCByZXBseSA9IDA7CisgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHtwYXJhbVR5cGUsIHBhcmFtVmFsdWV9OworICBlZmZlY3RfcGFyYW1fdCAqZWZmZWN0UGFyYW0gPQorICAgICAgKGVmZmVjdF9wYXJhbV90ICopbWFsbG9jKHNpemVvZigqZWZmZWN0UGFyYW0pICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICBtZW1jcHkoJmVmZmVjdFBhcmFtLT5kYXRhWzBdLCAmcGFyYW1EYXRhWzBdLCBzaXplb2YocGFyYW1EYXRhKSk7CisgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMF0pOworICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICBmcmVlKGVmZmVjdFBhcmFtKTsKKyAgcmV0dXJuIHJlcGx5OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjID09IDEpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBjb25zdCBjaGFyICppbnB1dEZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRwdXRGaWxlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqZmFyRmlsZSA9IG51bGxwdHI7CisgIGludCBlZmZlY3RFbltQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHswfTsKKworICBjb25zdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7CisgICAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0hFTFB9LAorICAgICAgeyJpbnB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfSU5QVVR9LAorICAgICAgeyJvdXRwdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX09VVFBVVH0sCisgICAgICB7ImZhciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRkFSfSwKKyAgICAgIHsiZnMiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0ZTfSwKKyAgICAgIHsiY2hfbWFzayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQ0hfTUFTS30sCisgICAgICB7ImFnY190Z3RfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0NfVEdUX0xWTH0sCisgICAgICB7ImFnY19jb21wX2x2bCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUdDX0NPTVBfTFZMfSwKKyAgICAgIHsiYWVjX2RlbGF5IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BRUNfREVMQVl9LAorICAgICAgeyJuc19sdmwiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX05TX0xWTH0sCisgICAgICB7ImFlYyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19BRUNdLCAxfSwKKyAgICAgIHsiYWdjIiwgbm9fYXJndW1lbnQsICZlZmZlY3RFbltQUkVQUk9DX0FHQ10sIDF9LAorICAgICAgeyJucyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19OU10sIDF9LAorICAgICAge251bGxwdHIsIDAsIG51bGxwdHIsIDB9LAorICB9OworICBzdHJ1Y3QgcHJlUHJvY0NvbmZpZ1BhcmFtc190IHByZVByb2NDZmdQYXJhbXMge307CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb25zdCBpbnQgb3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgKGNoYXIgKmNvbnN0ICopYXJndiwgImk6bzoiLCBsb25nX29wdHMsIG51bGxwdHIpOworICAgIGlmIChvcHQgPT0gLTEpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgY2FzZSBBUkdfSEVMUDoKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgQVJHX0lOUFVUOiB7CisgICAgICAgIGlucHV0RmlsZSA9IChjaGFyICopb3B0YXJnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX09VVFBVVDogeworICAgICAgICBvdXRwdXRGaWxlID0gKGNoYXIgKilvcHRhcmc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfRkFSOiB7CisgICAgICAgIGZhckZpbGUgPSAoY2hhciAqKW9wdGFyZzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19GUzogeworICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19DSF9NQVNLOiB7CisgICAgICAgIGludCBjaE1hc2tJZHggPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGlmIChjaE1hc2tJZHggPCAwIG9yIGNoTWFza0lkeCA+IGtQcmVQcm9jQ29uZmlnQ2hNYXNrQ291bnQpIHsKKyAgICAgICAgICBBTE9HRSgiQ2hhbm5lbCBNYXNrIGluZGV4IG5vdCBpbiBjb3JyZWN0IHJhbmdlXG4iKTsKKyAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLmNoTWFzayA9IGtQcmVQcm9jQ29uZmlnQ2hNYXNrW2NoTWFza0lkeF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfQUdDX1RHVF9MVkw6IHsKKyAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2NUYXJnZXRMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19BR0NfQ09NUF9MVkw6IHsKKyAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2NDb21wTGV2ZWwgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfQUVDX0RFTEFZOiB7CisgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWVjRGVsYXkgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfTlNfTFZMOiB7CisgICAgICAgIHByZVByb2NDZmdQYXJhbXMubnNMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiRXJyb3I6IG1pc3NpbmcgaW5wdXQgZmlsZVxuIik7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGlucHV0RnAoZm9wZW4oaW5wdXRGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgIGlmIChpbnB1dEZwID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgaW5wdXRGaWxlKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBmYXJGcChmb3BlbihmYXJGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gb3V0cHV0RnAoZm9wZW4ob3V0cHV0RmlsZSwgIndiIiksICZmY2xvc2UpOworICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19BRUNdKSB7CisgICAgaWYgKGZhckZpbGUgPT0gbnVsbHB0cikgeworICAgICAgQUxPR0UoIkZhciBlbmQgc2lnbmFsIGZpbGUgcmVxdWlyZWQgZm9yIGVjaG8gY2FuY2VsbGF0aW9uIFxuIik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoZmFyRnAgPT0gbnVsbHB0cikgeworICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIGZhciBlbmQgc3RyZWFtIGZpbGUgJXNcbiIsIGZhckZpbGUpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgc3RydWN0IHN0YXQgc3RhdElucHV0LCBzdGF0RmFyOworICAgICh2b2lkKWZzdGF0KGZpbGVubyhpbnB1dEZwLmdldCgpKSwgJnN0YXRJbnB1dCk7CisgICAgKHZvaWQpZnN0YXQoZmlsZW5vKGZhckZwLmdldCgpKSwgJnN0YXRGYXIpOworICAgIGlmIChzdGF0SW5wdXQuc3Rfc2l6ZSAhPSBzdGF0RmFyLnN0X3NpemUpIHsKKyAgICAgIEFMT0dFKCJOZWFyIGFuZCBmYXIgZW5kIHNpZ25hbHMgYXJlIG9mIGRpZmZlcmVudCBzaXplcyIpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgaWYgKG91dHB1dEZpbGUgIT0gbnVsbHB0ciAmJiBvdXRwdXRGcCA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRwdXRGaWxlKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgaW50MzJfdCBzZXNzaW9uSWQgPSAxOworICBpbnQzMl90IGlvSWQgPSAxOworICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlW1BSRVBST0NfTlVNX0VGRkVDVFNdID0ge251bGxwdHJ9OworICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcTsKKyAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHByZVByb2NDZmdQYXJhbXMuY2hNYXNrOworICBjb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworICAvLyBDcmVhdGUgYWxsIHRoZSBlZmZlY3QgaGFuZGxlcworICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY0NyZWF0ZUVmZmVjdCgmZWZmZWN0SGFuZGxlW2ldLCBpLCAmY29uZmlnLCBzZXNzaW9uSWQsIGlvSWQpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgaWYgKGVmZmVjdEVuW2ldID09IDEpIHsKKyAgICAgIGludCByZXBseSA9IDA7CisgICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgICAgKCplZmZlY3RIYW5kbGVbaV0pCisgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZVtpXSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICBpZiAocmVwbHkgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ29tbWFuZCBlbmFibGUgY2FsbCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmVwbHkpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFNldCBDb25maWcgUGFyYW1zIG9mIHRoZSBlZmZlY3RzCisgIGlmIChlZmZlY3RFbltQUkVQUk9DX0FHQ10pIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBR0NfUEFSQU1fVEFSR0VUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFnY1RhcmdldExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQ10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgQUdDIFRhcmdldCBMZXZlbC4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUdDX1BBUkFNX0NPTVBfR0FJTiwgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMuYWdjQ29tcExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQ10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgQUdDIENvbXAgR2Fpbi4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19OU10pIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShOU19QQVJBTV9MRVZFTCwgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMubnNMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19OU10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgTm9pc2UgU3VwcHJlc3Npb24gbGV2ZWwgRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorCisgIC8vIFByb2Nlc3MgQ2FsbAorICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSAoaW50KShwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcSAqIGtUZW5NaWxsaVNlY1ZhbCk7CisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHByZVByb2NDZmdQYXJhbXMuY2hNYXNrKTsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBpb0NoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIGlvQ2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gZmFySW4oZnJhbWVMZW5ndGggKiBpb0NoYW5uZWxDb3VudCk7CisgICAgc2l6ZV90IHNhbXBsZXNSZWFkID0gZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGlucHV0RnAuZ2V0KCkpOworICAgIGlmIChzYW1wbGVzUmVhZCA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYXVkaW9fYnVmZmVyX3QgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlcjsKKyAgICBhdWRpb19idWZmZXJfdCBmYXJJbkJ1ZmZlcnt9OworICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCA9IHNhbXBsZXNSZWFkOworICAgIGlucHV0QnVmZmVyLnMxNiA9IGluLmRhdGEoKTsKKyAgICBvdXRwdXRCdWZmZXIuczE2ID0gb3V0LmRhdGEoKTsKKworICAgIGlmIChmYXJGcCAhPSBudWxscHRyKSB7CisgICAgICBzYW1wbGVzUmVhZCA9IGZyZWFkKGZhckluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmYXJGcC5nZXQoKSk7CisgICAgICBpZiAoc2FtcGxlc1JlYWQgPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZhckluQnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICAgIGZhckluQnVmZmVyLnMxNiA9IGZhckluLmRhdGEoKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgaWYgKGVmZmVjdEVuW2ldID09IDEpIHsKKyAgICAgICAgaWYgKGkgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAgICAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgICBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUVDX1BBUkFNX0VDSE9fREVMQVksICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FFQ10pOworICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoInByZVByb2NTZXRDb25maWdQYXJhbSByZXR1cm5lZCBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAoKmVmZmVjdEhhbmRsZVtpXSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlW2ldLCAmaW5wdXRCdWZmZXIsICZvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyBpID0gJWQgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgaSwgc3RhdHVzKTsKKyAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnByb2Nlc3NfcmV2ZXJzZShlZmZlY3RIYW5kbGVbaV0sICZmYXJJbkJ1ZmZlciwgJm91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyByZXZlcnNlIGkgPSAlZCByZXR1cm5lZCB3aXRoIGVycm9yICVkXG4iLCBpLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG91dHB1dEZwICE9IG51bGxwdHIpIHsKKyAgICAgIHNpemVfdCBzYW1wbGVzV3JpdHRlbiA9CisgICAgICAgICAgZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCwgb3V0cHV0RnAuZ2V0KCkpOworICAgICAgaWYgKHNhbXBsZXNXcml0dGVuICE9IG91dHB1dEJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgIEFMT0dFKCJcbkVycm9yOiBPdXRwdXQgZmlsZSB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOworICB9CisgIC8vIFJlbGVhc2UgYWxsIHRoZSBlZmZlY3QgaGFuZGxlcyBjcmVhdGVkCisgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdChlZmZlY3RIYW5kbGVbaV0pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkF1ZGlvIFByZXByb2Nlc3NpbmcgcmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvRWZmZWN0UHJveHkuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKaW5kZXggNDJlNDRmMC4uYzAxMGQ2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyBUaGlzIGlzIGEgZHVtbXkgcHJveHkgZGVzY3JpcHRvciBqdXN0IHRvIHJldHVybiB0byBGYWN0b3J5IGR1cmluZyB0aGUgaW5pdGlhbAorLy8gVGhpcyBpcyBhIHN0dWIgcHJveHkgZGVzY3JpcHRvciBqdXN0IHRvIHJldHVybiB0byBGYWN0b3J5IGR1cmluZyB0aGUgaW5pdGlhbAogLy8gR2V0RGVzY3JpcHRvciBjYWxsLiBMYXRlciBpbiB0aGUgZmFjdG9yeSwgaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUKIC8vIFNXIHN1YiBlZmZlY3QgZGVzY3JpcHRvcgogLy8gcHJveHkgVVVJRCBhZjhkYTdlMC0yY2ExLTExZTMtYjcxZC0wMDAyYTVkNWM1MWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IDNmZDNmYzMuLjFjYWVlMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsMjIgQEAKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorfQorCiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJsaWJtZWRpYV9vbXhfYWlkbCIsCiAgICAgc3JjczogWwpAQCAtMjAzLDcgKzIxOSw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIApAQCAtMjIwLDYgKzIzNiwxNCBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtMzA5LDExICszMzMsMTMgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJqbmlfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgICAgICAiam5pX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMzcyLDMgKzM5OCwzNiBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9uZGtmb3JtYXRwcml2IiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTmRrTWVkaWFGb3JtYXRQcml2LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUVycm9yUHJpdi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCmluZGV4IDA5MzZhOTkuLmZlODZkMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwCkBAIC0zNSw3ICszNSw3IEBACiAgICAgdGhpcy0+dmFsdWUgPSB2YWx1ZTsKIH0KIAotTWVkaWFSZXNvdXJjZTo6TWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKSB7CitNZWRpYVJlc291cmNlOjpNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKSB7CiAgICAgdGhpcy0+dHlwZSA9IHR5cGU7CiAgICAgdGhpcy0+c3ViVHlwZSA9IFN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU7CiAgICAgdGhpcy0+aWQgPSBpZDsKQEAgLTY2LDExICs2NiwxMSBAQAogfQogCiAvL3N0YXRpYwotTWVkaWFSZXNvdXJjZSBNZWRpYVJlc291cmNlOjpEcm1TZXNzaW9uUmVzb3VyY2UoY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpIHsKK01lZGlhUmVzb3VyY2UgTWVkaWFSZXNvdXJjZTo6RHJtU2Vzc2lvblJlc291cmNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSkgewogICAgIHJldHVybiBNZWRpYVJlc291cmNlKFR5cGU6OmtEcm1TZXNzaW9uLCBpZCwgdmFsdWUpOwogfQogCi1zdGF0aWMgU3RyaW5nOCBieXRlc1RvSGV4U3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPGludDhfdD4gJmJ5dGVzKSB7CitzdGF0aWMgU3RyaW5nOCBieXRlc1RvSGV4U3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZieXRlcykgewogICAgIFN0cmluZzggc3RyOwogICAgIGZvciAoYXV0byAmYiA6IGJ5dGVzKSB7CiAgICAgICAgIHN0ci5hcHBlbmRGb3JtYXQoIiUwMngiLCBiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggZTcxZWEyYy4uZGEyNzJlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTE4LDggKzE4LDkgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWlkaUlvV3JhcHBlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcAppbmRleCAzYTlmYjhiLi43OTgzMTg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKQEAgLTI0LDggKzI0LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAKLSNpbmNsdWRlIDxqbmkuaD4KLQogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKaW5kZXggZTczNjJjMS4uNDkyN2QyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKQEAgLTM1LDEzICszNSwxMyBAQAogICAgIE1lZGlhUmVzb3VyY2UoKSA9IGRlbGV0ZTsKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgaW50NjRfdCB2YWx1ZSk7CiAgICAgTWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIFN1YlR5cGUgc3ViVHlwZSwgaW50NjRfdCB2YWx1ZSk7Ci0gICAgTWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKTsKKyAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKTsKIAogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIGJvb2wgdmlkZW8pOwogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIEdyYXBoaWNNZW1vcnlSZXNvdXJjZShpbnQ2NF90IHZhbHVlKTsKICAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBDcHVCb29zdFJlc291cmNlKCk7CiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgVmlkZW9CYXR0ZXJ5UmVzb3VyY2UoKTsKLSAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBEcm1TZXNzaW9uUmVzb3VyY2UoY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpOworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIERybVNlc3Npb25SZXNvdXJjZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpOwogfTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhNZWRpYVJlc291cmNlOjpUeXBlIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IDZmY2JjN2IuLmI0NmM5OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icApAQCAtMyw2ICszLDEyIEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeSB7CkBAIC0yNyw0ICszMywxMCBAQAogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCiAgICAgY2xhbmc6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggNjM4MmNlNC4uNzA1OTU5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTU3LDYgKzU3LDggQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VDSE9fQ0FOQ0VMTEVSKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpLAogICAgIC8vIFNUVUIgbXVzdCBiZSBhZnRlciBERUZBVUxULCBzbyB0aGUgbGF0dGVyIGlzIHBpY2tlZCB1cCBieSB0b1N0cmluZyBmaXJzdC4KICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TVFVCKSwKQEAgLTk2LDYgKzk4LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREVGQVVMVCksCiAgICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fU1RVQiksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTUyZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAic3lzdGVtL21lZGlhL2F1ZGlvL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvY2FtZXJhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICBdLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL1N0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL1N0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE3ZWYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgorCisjaW5jbHVkZSAiU3RhZ2VmcmlnaHRSZWNvcmRlci5oIgorCisjZGVmaW5lIE9VVFBVVF9JTkZPX0ZJTEVfTkFNRSAiL2RhdGEvbG9jYWwvdG1wL3N0ZnJlY29yZGVyX2F1ZGlvLmluZm8iCisjZGVmaW5lIE9VVFBVVF9GSUxFX05BTUVfQVVESU8gIi9kYXRhL2xvY2FsL3RtcC9zdGZyZWNvcmRlcl9hdWRpby5yYXciCisKK2NvbnN0IGJvb2wga0RlYnVnID0gZmFsc2U7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4TG9vcENvdW50ID0gMTA7Citjb25zdGV4cHIgaW50MzJfdCBrQ2xpcER1cmF0aW9uSW5TZWMgPSA0OworY29uc3RleHByIGludDMyX3Qga1BhdXNlVGltZUluU2VjID0gMjsKKy8vIFRvbGVyYW5jZSB2YWx1ZSBmb3IgZXh0cmFjdGVkIGNsaXBkdXJhdGlvbiBpcyBtYXhpbXVtIDEwJSBvZiB0b3RhbCBjbGlwZHVyYXRpb24KK2NvbnN0ZXhwciBpbnQzMl90IGtUb2xlcmFuY2VWYWx1ZUluVXMgPSBrQ2xpcER1cmF0aW9uSW5TZWMgKiAxMDAwMDA7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBTdGFnZWZyaWdodFJlY29yZGVyVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnBhaXI8b3V0cHV0X2Zvcm1hdCwgYXVkaW9fZW5jb2Rlcj4+IHsKKyAgcHVibGljOgorICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0KCkgOiBtU3RmUmVjb3JkZXIobnVsbHB0ciksIG1PdXRwdXRBdWRpb0ZwKG51bGxwdHIpIHsKKyAgICAgICAgbUV4cGVjdGVkRHVyYXRpb25Jbk1zID0gMDsKKyAgICAgICAgbUV4cGVjdGVkUGF1c2VJbk1zID0gMDsKKyAgICB9CisKKyAgICB+U3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QoKSB7CisgICAgICAgIGlmIChtU3RmUmVjb3JkZXIpIGZyZWUobVN0ZlJlY29yZGVyKTsKKyAgICAgICAgaWYgKG1PdXRwdXRBdWRpb0ZwKSBmY2xvc2UobU91dHB1dEF1ZGlvRnApOworICAgIH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1TdGZSZWNvcmRlciA9IG5ldyBTdGFnZWZyaWdodFJlY29yZGVyKFN0cmluZzE2KExPR19UQUcpKTsKKyAgICAgICAgQVNTRVJUX05FKG1TdGZSZWNvcmRlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgdGhlIGluc3RhbmNlIG9mIHJlY29yZGVyIjsKKworICAgICAgICBtT3V0cHV0QXVkaW9GcCA9IGZvcGVuKE9VVFBVVF9GSUxFX05BTUVfQVVESU8sICJ3YiIpOworICAgICAgICBBU1NFUlRfTkUobU91dHB1dEF1ZGlvRnAsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTyA8PCAiIGZvciBzdGFnZWZyaWdodCByZWNvcmRlciI7CisKKyAgICAgICAgaW50MzJfdCBmZCA9IGZpbGVubyhtT3V0cHV0QXVkaW9GcCk7CisgICAgICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgb3V0cHV0IGZpbGUgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c2V0T3V0cHV0RmlsZShmZCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHNldCB0aGUgb3V0cHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBzdGFnZWZyaWdodCByZWNvcmRlciI7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1PdXRwdXRBdWRpb0ZwKSB7CisgICAgICAgICAgICBmY2xvc2UobU91dHB1dEF1ZGlvRnApOworICAgICAgICAgICAgbU91dHB1dEF1ZGlvRnAgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmICgha0RlYnVnKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YXR1cyA9IHJlbW92ZShPVVRQVVRfRklMRV9OQU1FX0FVRElPKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJVbmFibGUgdG8gZGVsZXRlIHRoZSBvdXRwdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU87CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQob3V0cHV0X2Zvcm1hdCBvdXRwdXRGb3JtYXQsIGF1ZGlvX2VuY29kZXIgZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCk7CisgICAgdm9pZCByZWNvcmRNZWRpYShib29sIGlzUGF1c2VkID0gZmFsc2UsIGludDMyX3QgbnVtU3RhcnQgPSAwLCBpbnQzMl90IG51bVBhdXNlID0gMCk7CisgICAgdm9pZCBkdW1wSW5mbygpOworICAgIHZvaWQgc2V0dXBFeHRyYWN0b3IoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIGludDMyX3QgJnRyYWNrQ291bnQpOworICAgIHZvaWQgdmFsaWRhdGVPdXRwdXQoKTsKKworICAgIE1lZGlhUmVjb3JkZXJCYXNlICptU3RmUmVjb3JkZXI7CisgICAgRklMRSAqbU91dHB1dEF1ZGlvRnA7CisgICAgZG91YmxlIG1FeHBlY3RlZER1cmF0aW9uSW5NczsKKyAgICBkb3VibGUgbUV4cGVjdGVkUGF1c2VJbk1zOworfTsKKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6c2V0QXVkaW9SZWNvcmRlckZvcm1hdChvdXRwdXRfZm9ybWF0IG91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZW5jb2RlciBlbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c2V0QXVkaW9Tb3VyY2UoYXVkaW9Tb3VyY2UpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHNldCB0aGUgYXVkaW8gc291cmNlOiAiIDw8IGF1ZGlvU291cmNlOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zZXRPdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzZXQgdGhlIG91dHB1dCBmb3JtYXQ6ICIgPDwgb3V0cHV0Rm9ybWF0OworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zZXRBdWRpb0VuY29kZXIoZW5jb2Rlcik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc2V0IHRoZSBhdWRpbyBlbmNvZGVyOiAiIDw8IGVuY29kZXI7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3Q6OnJlY29yZE1lZGlhKGJvb2wgaXNQYXVzZSwgaW50MzJfdCBudW1TdGFydCwgaW50MzJfdCBudW1QYXVzZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+aW5pdCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgc3RhZ2VmcmlnaHQgcmVjb3JkZXIiOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5wcmVwYXJlKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gcHJlYXByZSB0aGUgcmVvcmRlciI7CisKKyAgICAvLyBmaXJzdCBzdGFydCBzaG91bGQgc3VjY2VlZC4KKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHJlY29yZGVyIjsKKworICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwgbnVtU3RhcnQ7IGNvdW50KyspIHsKKyAgICAgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdGFydCgpOworICAgIH0KKworICAgIGF1dG8gdFN0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgLy8gUmVjb3JkaW5nIG1lZGlhIGZvciA0IHNlY3MKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoa0NsaXBEdXJhdGlvbkluU2VjKSk7CisgICAgYXV0byB0RW5kID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgbUV4cGVjdGVkRHVyYXRpb25Jbk1zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4odEVuZCAtIHRTdGFydCkuY291bnQoKTsKKworICAgIGlmIChpc1BhdXNlKSB7CisgICAgICAgIC8vIGZpcnN0IHBhdXNlIHNob3VsZCBzdWNjZWVkLgorICAgICAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnBhdXNlKCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHBhdXNlIHRoZSByZWNvcmRlciI7CisKKyAgICAgICAgdFN0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgICAgIC8vIFBhdXNlZCByZWNvcmRlciBmb3IgMiBzZWNzCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyhrUGF1c2VUaW1lSW5TZWMpKTsKKworICAgICAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IG51bVBhdXNlOyBjb3VudCsrKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnBhdXNlKCk7CisgICAgICAgIH0KKworICAgICAgICB0RW5kID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgICAgIG1FeHBlY3RlZFBhdXNlSW5NcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+KHRFbmQgLSB0U3RhcnQpLmNvdW50KCk7CisKKyAgICAgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5yZXN1bWUoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gcmVzdW1lIHRoZSByZWNvcmRlciI7CisKKyAgICAgICAgYXV0byB0U3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAgICAgLy8gUmVjb3JkaW5nIG1lZGlhIGZvciA0IHNlY3MKKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGtDbGlwRHVyYXRpb25JblNlYykpOworICAgICAgICBhdXRvIHRFbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAgICAgbUV4cGVjdGVkRHVyYXRpb25Jbk1zICs9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+KHRFbmQgLSB0U3RhcnQpLmNvdW50KCk7CisgICAgfQorICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHJlY29yZGVyIjsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6ZHVtcEluZm8oKSB7CisgICAgRklMRSAqZHVtcE91dHB1dCA9IGZvcGVuKE9VVFBVVF9JTkZPX0ZJTEVfTkFNRSwgIndiIik7CisgICAgaW50MzJfdCBkdW1wRmQgPSBmaWxlbm8oZHVtcE91dHB1dCk7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+ZHVtcChkdW1wRmQsIGFyZ3MpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIGR1bXAgdGhlIGluZm8gZm9yIHRoZSByZWNvcmRlciI7CisgICAgZmNsb3NlKGR1bXBPdXRwdXQpOworfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0OjpzZXR1cEV4dHJhY3RvcihBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwgaW50MzJfdCAmdHJhY2tDb3VudCkgeworICAgIGludDMyX3QgZmQgPSBvcGVuKE9VVFBVVF9GSUxFX05BTUVfQVVESU8sIE9fUkRPTkxZKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiByZWNvcmRlcidzIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgPDwgIiB0byB2YWxpZGF0ZSI7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50MzJfdCBzdGF0dXMgPSBmc3RhdChmZCwgJmJ1Zik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGV4dHJhY3RvciI7CisKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBBU1NFUlRfR1QoZmlsZVNpemUsIDApIDw8ICJTaXplIG9mIGlucHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRvIGV4dHJhY3RvciBjYW5ub3QgYmUgemVybyI7CisgICAgQUxPR1YoIlNpemUgb2YgaW5wdXQgZmlsZSB0byBleHRyYWN0b3I6ICV6dSIsIGZpbGVTaXplKTsKKworICAgIHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoZXh0cmFjdG9yLCBmZCwgMCwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UgZm9yIGV4dHJhY3RvciI7CisKKyAgICB0cmFja0NvdW50ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoZXh0cmFjdG9yKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRyYWNrcyByZXBvcnRlZCBieSBleHRyYWN0b3IgOiAlZCIsIHRyYWNrQ291bnQpOworfQorCisvLyBWYWxpZGF0ZSByZWNvZGVyJ3Mgb3V0cHV0IHVzaW5nIGV4dHJhY3Rvcgordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6dmFsaWRhdGVPdXRwdXQoKSB7CisgICAgaW50MzJfdCB0cmFja0NvdW50ID0gLTE7CisgICAgQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgQVNTRVJUX05FKGV4dHJhY3RvciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXR1cEV4dHJhY3RvcihleHRyYWN0b3IsIHRyYWNrQ291bnQpKTsKKyAgICBBU1NFUlRfRVEodHJhY2tDb3VudCwgMSkgPDwgIkV4cGVjdGVkIDEgdHJhY2ssIHNhdyAiIDw8IHRyYWNrQ291bnQ7CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgdHJhY2tDb3VudDsgaWR4KyspIHsKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKGV4dHJhY3RvciwgaWR4KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQoZXh0cmFjdG9yLCBpZHgpOworICAgICAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiVHJhY2sgZm9ybWF0IGlzIE5VTEwiOworICAgICAgICBBTE9HSSgiVHJhY2sgZm9ybWF0ID0gJXMiLCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoZm9ybWF0KSk7CisKKyAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb25VczsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvblVzKTsKKyAgICAgICAgaW50MzJfdCBkaWZmID0gYWJzKChtRXhwZWN0ZWREdXJhdGlvbkluTXMgKiAxMDAwKSAtIGNsaXBEdXJhdGlvblVzKTsKKyAgICAgICAgQVNTRVJUX0xFKGRpZmYsIGtUb2xlcmFuY2VWYWx1ZUluVXMpCisgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkIGR1cmF0aW9uOiAiIDw8IChtRXhwZWN0ZWREdXJhdGlvbkluTXMgKiAxMDAwKQorICAgICAgICAgICAgICAgIDw8ICIgQWN0dWFsIGR1cmF0aW9uOiAiIDw8IGNsaXBEdXJhdGlvblVzIDw8ICIgRGlmZmVyZW5jZTogIiA8PCBkaWZmCisgICAgICAgICAgICAgICAgPDwgIiBEaWZmZXJlbmNlIGlzIGV4cGVjdGVkIHRvIGJlIGxlc3MgdGhhbiB0b2xlcmFuY2UgdmFsdWU6ICIgPDwga1RvbGVyYW5jZVZhbHVlSW5VczsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lID0gbnVsbHB0cjsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgICAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cikgPDwgIlRyYWNrIG1pbWUgaXMgTlVMTCI7CisgICAgICAgIEFMT0dJKCJUcmFjayBtaW1lID0gJXMiLCBtaW1lKTsKKworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgYml0UmF0ZTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KTsKKyAgICAgICAgQUxPR0koIkNoYW5uZWwgY291bnQgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yOiAlZCIsIGNoYW5uZWxDb3VudCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKTsKKyAgICAgICAgQUxPR0koIlNhbXBsZSBSYXRlIHJlcG9ydGVkIGJ5IGV4dHJhY3RvcjogJWQiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdFJhdGUpOworICAgICAgICBBTE9HSSgiQml0IFJhdGUgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yOiAlZCIsIGJpdFJhdGUpOworICAgIH0KK30KKworVEVTVF9GKFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LCBSZWNvcmRpbmdBdWRpb1Nhbml0eVRlc3QpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRBdWRpb1JlY29yZGVyRm9ybWF0KE9VVFBVVF9GT1JNQVRfREVGQVVMVCwgQVVESU9fRU5DT0RFUl9ERUZBVUxUKSk7CisKKyAgICBpbnQzMl90IG1heEFtcGxpdHVkZSA9IC0xOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+Z2V0TWF4QW1wbGl0dWRlKCZtYXhBbXBsaXR1ZGUpOworICAgIEFTU0VSVF9FUShtYXhBbXBsaXR1ZGUsIDApIDw8ICJJbnZhbGlkIHZhbHVlIG9mIG1heCBhbXBsaXR1ZGUiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVjb3JkTWVkaWEoKSk7CisKKyAgICAvLyBWZXJpZnkgZ2V0TWV0cmljcygpIGJlaGF2aW9yCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPmdldE1ldHJpY3MoJnBhcmNlbCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBwYXJjZWwgZnJvbSBnZXRNZXRyaWNzIjsKKyAgICBBTE9HVigiU2l6ZSBvZiB0aGUgUGFyY2VsIHJldHVybmVkIGJ5IGdldE1ldHJpY3M6ICV6dSIsIHBhcmNlbC5kYXRhU2l6ZSgpKTsKKyAgICBBU1NFUlRfR1QocGFyY2VsLmRhdGFTaXplKCksIDApIDw8ICJQYXJjZWwgc2l6ZSByZXBvcnRzIGVtcHR5IHJlY29yZCI7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodmFsaWRhdGVPdXRwdXQoKSk7CisgICAgaWYgKGtEZWJ1ZykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkdW1wSW5mbygpKTsKKyAgICB9Cit9CisKK1RFU1RfUChTdGFnZWZyaWdodFJlY29yZGVyVGVzdCwgTXVsdGlGb3JtYXRBdWRpb1JlY29yZFRlc3QpIHsKKyAgICBvdXRwdXRfZm9ybWF0IG91dHB1dEZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYXVkaW9fZW5jb2RlciBhdWRpb0VuY29kZXIgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRBdWRpb1JlY29yZGVyRm9ybWF0KG91dHB1dEZvcm1hdCwgYXVkaW9FbmNvZGVyKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVjb3JkTWVkaWEoKSk7CisgICAgLy8gVE9ETyhiLzE2MTY4Nzc2MSkKKyAgICAvLyBTa2lwIGZvciBBTVItTkIvV0Igb3V0cHV0IGZvcm1hdAorICAgIGlmICghKG91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQiB8fCBvdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IpKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHZhbGlkYXRlT3V0cHV0KCkpOworICAgIH0KKyAgICBpZiAoa0RlYnVnKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGR1bXBJbmZvKCkpOworICAgIH0KK30KKworVEVTVF9GKFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LCBHZXRBY3RpdmVNaWNyb3Bob25lc1Rlc3QpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQoT1VUUFVUX0ZPUk1BVF9ERUZBVUxULCBBVURJT19FTkNPREVSX0RFRkFVTFQsIEFVRElPX1NPVVJDRV9NSUMpKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+aW5pdCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiSW5pdCBmYWlsZWQgZm9yIHN0YWdlZnJpZ2h0IHJlY29yZGVyIjsKKworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+cHJlcGFyZSgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHByZWFwcmUgdGhlIHJlb3JkZXIiOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdGFydCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSByZWNvcmRlciI7CisKKyAgICAvLyBSZWNvcmQgbWVkaWEgZm9yIDQgc2VjcworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyhrQ2xpcER1cmF0aW9uSW5TZWMpKTsKKworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gYWN0aXZlTWljcm9waG9uZXN7fTsKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPmdldEFjdGl2ZU1pY3JvcGhvbmVzKCZhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gZ2V0IEFjdGl2ZSBNaWNyb3Bob25lcyI7CisgICAgQVNTRVJUX0dUKGFjdGl2ZU1pY3JvcGhvbmVzLnNpemUoKSwgMCkgPDwgIk5vIGFjdGl2ZSBtaWNyb3Bob25lcyBhcmUgZm91bmQiOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgcmVjb3JkZXIiOworICAgIGlmIChrRGVidWcpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZHVtcEluZm8oKSk7CisgICAgfQorfQorCitURVNUX0YoU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QsIE11bHRpU3RhcnRQYXVzZVRlc3QpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRBdWRpb1JlY29yZGVyRm9ybWF0KE9VVFBVVF9GT1JNQVRfREVGQVVMVCwgQVVESU9fRU5DT0RFUl9ERUZBVUxUKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVjb3JkTWVkaWEodHJ1ZSwga01heExvb3BDb3VudCwga01heExvb3BDb3VudCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHZhbGlkYXRlT3V0cHV0KCkpOworICAgIGlmIChrRGVidWcpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZHVtcEluZm8oKSk7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0QWxsLCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoc3RkOjptYWtlX3BhaXIoT1VUUFVUX0ZPUk1BVF9BTVJfTkIsIEFVRElPX0VOQ09ERVJfQU1SX05CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoT1VUUFVUX0ZPUk1BVF9BTVJfV0IsIEFVRElPX0VOQ09ERVJfQU1SX1dCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoT1VUUFVUX0ZPUk1BVF9BQUNfQURUUywgQVVESU9fRU5DT0RFUl9BQUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihPVVRQVVRfRk9STUFUX09HRywgQVVESU9fRU5DT0RFUl9PUFVTKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCmluZGV4IDA0MzE5NzYuLjU0ZGMwOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCkBAIC0yMyw3ICsyMyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIFBpcGUgaXMgbXVsdGktdGhyZWFkIHNhZmUgZm9yIHJlYWRlcnMgKHNlZSBQaXBlUmVhZGVyKSwgYnV0IHNhZmUgZm9yIG9ubHkgYSBzaW5nbGUgd3JpdGVyIHRocmVhZC4KLS8vIEl0IGNhbm5vdCBVTkRFUlJVTiBvbiB3cml0ZSwgdW5sZXNzIHdlIGFsbG93IGRlc2lnbmF0aW9uIG9mIGEgbWFzdGVyIHJlYWRlciB0aGF0IHByb3ZpZGVzIHRoZQorLy8gSXQgY2Fubm90IFVOREVSUlVOIG9uIHdyaXRlLCB1bmxlc3Mgd2UgYWxsb3cgZGVzaWduYXRpb24gb2YgYSBwcmltYXJ5IHJlYWRlciB0aGF0IHByb3ZpZGVzIHRoZQogLy8gdGltZS1iYXNlLiBSZWFkZXJzIGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZCBkeW5hbWljYWxseSwgYW5kIGl0J3MgT0sgdG8gaGF2ZSBubyByZWFkZXJzLgogY2xhc3MgUGlwZSA6IHB1YmxpYyBOQkFJT19TaW5rIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggNjNhYjY1NC4uNWE4ZDJmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC04ODcsNyArODg3LDcgQEAKIAogICAgICAgICAgICAgc3A8RGF0YUNvbnZlcnRlcj4gY29udmVydGVyID0gbUNvbnZlcnRlcltwb3J0SW5kZXhdOwogICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBhc3N1bWUgc2FuZSBjb252ZXJzaW9ucyBvZiBtYXggNDoxLCBzbyByZXN1bHQgZml0cyBpbiBpbnQzMgorICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UgYXNzdW1lIGNvbnZlcnNpb25zIG9mIG1heCA0OjEsIHNvIHJlc3VsdCBmaXRzIGluIGludDMyCiAgICAgICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpIHsKICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlclNpemUgPSBjb252ZXJ0ZXItPnNvdXJjZVNpemUoYnVmU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI2MDIsMTUgKzI2MDIsMTUgQEAKICAgICB1bnNpZ25lZCBpbnQgbnVtTGF5ZXJzID0gMDsKICAgICB1bnNpZ25lZCBpbnQgbnVtQkxheWVycyA9IDA7CiAgICAgaW50IHRhZ3M7Ci0gICAgY2hhciBkdW1teTsKKyAgICBjaGFyIHRtcDsKICAgICBPTVhfVklERU9fQU5EUk9JRF9URU1QT1JBTExBWUVSSU5HUEFUVEVSTlRZUEUgcGF0dGVybiA9CiAgICAgICAgIE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5Ob25lOwotICAgIGlmIChzc2NhbmYodHNTY2hlbWEuY19zdHIoKSwgIndlYnJ0Yy52cDguJXUtbGF5ZXIlYyIsICZudW1MYXllcnMsICZkdW1teSkgPT0gMQorICAgIGlmIChzc2NhbmYodHNTY2hlbWEuY19zdHIoKSwgIndlYnJ0Yy52cDguJXUtbGF5ZXIlYyIsICZudW1MYXllcnMsICZ0bXApID09IDEKICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDApIHsKICAgICAgICAgcGF0dGVybiA9IE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5XZWJSVEM7CiAgICAgfSBlbHNlIGlmICgodGFncyA9IHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAiYW5kcm9pZC5nZW5lcmljLiV1JWMldSVjIiwKLSAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJmR1bW15LCAmbnVtQkxheWVycywgJmR1bW15KSkKLSAgICAgICAgICAgICYmICh0YWdzID09IDEgfHwgKHRhZ3MgPT0gMyAmJiBkdW1teSA9PSAnKycpKQorICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmdG1wLCAmbnVtQkxheWVycywgJnRtcCkpCisgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgdG1wID09ICcrJykpCiAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwICYmIG51bUxheWVycyA8IFVJTlQzMl9NQVggLSBudW1CTGF5ZXJzKSB7CiAgICAgICAgIG51bUxheWVycyArPSBudW1CTGF5ZXJzOwogICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybkFuZHJvaWQ7CkBAIC00NzU3LDE1ICs0NzU3LDE1IEBACiAgICAgICAgIHVuc2lnbmVkIGludCBudW1MYXllcnMgPSAwOwogICAgICAgICB1bnNpZ25lZCBpbnQgbnVtQkxheWVycyA9IDA7CiAgICAgICAgIGludCB0YWdzOwotICAgICAgICBjaGFyIGR1bW15OwotICAgICAgICBpZiAoc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmZHVtbXkpID09IDEKKyAgICAgICAgY2hhciB0bXA7CisgICAgICAgIGlmIChzc2NhbmYodHNTY2hlbWEuY19zdHIoKSwgIndlYnJ0Yy52cDguJXUtbGF5ZXIlYyIsICZudW1MYXllcnMsICZ0bXApID09IDEKICAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwKSB7CiAgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOwogICAgICAgICAgICAgdHNUeXBlID0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybldlYlJUQzsKICAgICAgICAgICAgIHRzTGF5ZXJzID0gbnVtTGF5ZXJzOwogICAgICAgICB9IGVsc2UgaWYgKCh0YWdzID0gc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJmR1bW15LCAmbnVtQkxheWVycywgJmR1bW15KSkKLSAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZ0bXAsICZudW1CTGF5ZXJzLCAmdG1wKSkKKyAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgdG1wID09ICcrJykpCiAgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCAmJiBudW1MYXllcnMgPCBVSU5UMzJfTUFYIC0gbnVtQkxheWVycykgewogICAgICAgICAgICAgcGF0dGVybiA9IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQzsKICAgICAgICAgICAgIC8vIFZQWCBkb2VzIG5vdCBoYXZlIGEgY29uY2VwdCBvZiBCLWZyYW1lcywgc28ganVzdCBjb3VudCBhbGwgbGF5ZXJzCkBAIC03NjMxLDggKzc2MzEsOCBAQAogICAgICAgICBtSW5wdXRGb3JtYXQtPnNldEludDY0KCJhbmRyb2lkLl9zdG9wLXRpbWUtb2Zmc2V0LXVzIiwgc3RvcFRpbWVPZmZzZXRVcyk7CiAgICAgfQogCi0gICAgaW50MzJfdCBkdW1teTsKLSAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoInJlcXVlc3Qtc3luYyIsICZkdW1teSkpIHsKKyAgICBpbnQzMl90IHRtcDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoInJlcXVlc3Qtc3luYyIsICZ0bXApKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcXVlc3RJRFJGcmFtZSgpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IDNiY2NiN2IuLmMxODBlZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtOCw2ICs4LDEyIEBACiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICBdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7CkBAIC0zNCw2ICs0MCwxMiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIKICAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKQEAgLTU4LDkgKzcwLDE4IEBACiAgICAgfSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYW5kayJdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKwogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCkBAIC0xMzIsOCArMTUzLDEwIEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTE1MCw2ICsxNzMsMTggQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgfSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgICAgICBsaW51eDogeworICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1ERElTQUJMRV9BVURJT19TWVNURU1fT0ZGTE9BRCIsCisgICAgICAgICAgICBdLAorICAgICAgICB9CisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKaW5kZXggYjM0NzQ1My4uMGU0ZWFlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCisjZGVmaW5lIFVOVVNFRF9QQVJBTSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtIZXZjTmFsVW5pdFR5cGVzWzVdID0gewpAQCAtMzc2LDcgKzM3OCw3IEBACiB9CiAKIHN0YXR1c190IEhldmNQYXJhbWV0ZXJTZXRzOjpwYXJzZVBwcygKLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSBfX3VudXNlZCwgc2l6ZV90IHNpemUgX191bnVzZWQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSBVTlVTRURfUEFSQU0sIHNpemVfdCBzaXplIFVOVVNFRF9QQVJBTSkgewogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKaW5kZXggYzZlNzUzZC4uN2M5ODFiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCkBAIC01OSw3ICs1OSw3IEBACiAgICAgICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4OwogICAgICAgICAgICAgbWVkaWFFeFNlcnZpY2UtPm1ha2VFeHRyYWN0b3IoCiAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUlEYXRhU291cmNlRnJvbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgbWltZSA/IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KG1pbWUpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgbWltZSA/IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KG1pbWUpIDogc3RkOjpudWxsb3B0LAogICAgICAgICAgICAgICAgICAgICAmZXgpOwogICAgICAgICAgICAgcmV0dXJuIGV4OwogICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT1dORVJTIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTM4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PV05FUlMKQEAgLTAsMCArMSw3IEBACitzZXQgbm9wYXJlbnQKK2NoekBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggYTFlNGQ0My4uZDY3ODc0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMTEzNSw3ICsxMTM1LDcgQEAKICAgICAgICAgLy8gYXNzZXJ0aW9uLCBsZXQncyBiZSBsZW5pZW50IGZvciBub3cuLi4KICAgICAgICAgLy8gQ0hFQ0soKHB0cls0XSA+PiAyKSA9PSAweDNmKTsgIC8vIHJlc2VydmVkCiAKLSAgICAgICAgc2l6ZV90IGxlbmd0aFNpemUgX191bnVzZWQgPSAxICsgKHB0cls0XSAmIDMpOworICAgICAgICAvLyB3ZSBjYW4gZ2V0IGxlbmd0aFNpemUgdmFsdWUgZnJvbSAxICsgKHB0cls0XSAmIDMpCiAKICAgICAgICAgLy8gY29tbWVudGVkIG91dCBjaGVjayBiZWxvdyBhcyBIMjY0X1FWR0FfNTAwX05PX0FVRElPLjNncAogICAgICAgICAvLyB2aW9sYXRlcyBpdC4uLgpAQCAtMjE3OCw3ICsyMTc4LDExIEBACiAgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZworI2lmZGVmIERJU0FCTEVfQVVESU9fU1lTVEVNX09GRkxPQUQKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOworI2VuZGlmCiB9CiAKIEhMU1RpbWU6OkhMU1RpbWUoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtZXRhKSA6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKaW5kZXggMTY4ZDE0MC4uMTU3Y2FiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscwogCi0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKICAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgewogICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKICAgICAgICAgICAgIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQogICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQogCi0gICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICAvLyB2YWxpZGF0aW9uIGNoZWNrIGFnYWluCiAgICAgICAgIGlmIChuZXdIZWF2eSA9PSAxKSB7CiAgICAgICAgICAgICBuZXdCb29zdEZhY3Rvcj0xMjc7IC8vIG5vdCByZWFsbHkgbmVlZGVkIGFzIHRoZSBzYW1lIHdvdWxkIGJlIGRvbmUgYnkgdGhlIGRlY29kZXIgYW55d2F5CiAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTllNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgQW1yLW5iIERlY29kZXIgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iQW1ybmJEZWNvZGVyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0Ftcm5iRGVjb2RlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9SRUFETUUubWQKaW5kZXggNjJlMTNhZS4uZTkwNzNlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kCkBAIC0yMiwxMyArMjIsMTggQEAKIGFkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KIGBgYAogCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9kcml2ZS9mb2xkZXJzLzEzY000dEFhVkZybXItekdGcWFBekZCYktzNzVwbm05YikuIFB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCi1Eb3dubG9hZCBhbXItbmIgZm9sZGVyIGFuZCBwdXNoIGFsbCB0aGUgZmlsZXMgaW4gdGhpcyBmb2xkZXIgdG8gL2RhdGEvbG9jYWwvdG1wLyBvbiB0aGUgZGV2aWNlLgorVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY29kZXJUZXN0LnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKwogYGBgCi1hZGIgcHVzaCBhbXItbmIvLiAvZGF0YS9sb2NhbC90bXAvCithZGIgcHVzaCBBbXJuYkRlY29kZXJUZXN0UmVzLy4gL2RhdGEvbG9jYWwvdG1wLwogYGBgCiAKIHVzYWdlOiBBbXJuYkRlY29kZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgogYGBgCi1hZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0Ftcm5iRGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wLworYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBBbXJuYkRlY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKIGBgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwCmluZGV4IGY4ZGE1ODkuLjA4YTVjMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNDc1LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAKQEAgLTExMDYsNyArMTEwNiw3IEBACiAgICAgLy8gdGhlIHJlYWwsIHF1YW50aXplZCBnYWlucykKICAgICBnY19wcmVkKHByZWRfc3QsIE1SNDc1LCBzZjFfY29kZV9ub3NoYXJwLAogICAgICAgICAgICAgJnNmMV9leHBfZ2NvZGUwLCAmc2YxX2ZyYWNfZ2NvZGUwLAotICAgICAgICAgICAgJnNmMF9leHBfZ2NvZGUwLCAmc2YwX2djb2RlMCk7IC8vIGxhc3QgdHdvIGFyZ3MgYXJlIGR1bW15CisgICAgICAgICAgICAmc2YwX2V4cF9nY29kZTAsICZzZjBfZ2NvZGUwKTsgLy8gbGFzdCB0d28gYXJncyBhcmUgdW51c2VkCiAgICAgc2YxX2djb2RlMCA9IGV4dHJhY3RfbChQb3cyKDE0LCBzZjFfZnJhY19nY29kZTApKTsKIAogICAgIHRtcCA9IGFkZCAodG1wLCAyKTsKQEAgLTE0MjYsNyArMTQyNiw3IEBACiAgICAgICAgdGhlIHJlYWwsIHF1YW50aXplZCBnYWlucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgZ2NfcHJlZChwcmVkX3N0LCBNUjQ3NSwgc2YxX2NvZGVfbm9zaGFycCwKICAgICAgICAgICAgICZzZjFfZXhwX2djb2RlMCwgJnNmMV9mcmFjX2djb2RlMCwKLSAgICAgICAgICAgICZzZjBfZXhwX2djb2RlMCwgJnNmMF9nY29kZTAsIC8qIGR1bW15IGFyZ3MgKi8KKyAgICAgICAgICAgICZzZjBfZXhwX2djb2RlMCwgJnNmMF9nY29kZTAsIC8qIHVudXNlZCBhcmdzICovCiAgICAgICAgICAgICBwT3ZlcmZsb3cpOwogCiAgICAgc2YxX2djb2RlMCA9IChXb3JkMTYpKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCwgcE92ZXJmbG93KSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggNTRkZTFjYy4uYzFlYWE1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMzQsNCArMzQsMTAgQEAKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICB9LAogICAgIH0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvYW1ybmJfZGVjX2Z1enplci5jcHAKaW5kZXggZDRlN2U1Yy4uYzdhNzM3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL2Ftcm5iX2RlY19mdXp6ZXIuY3BwCkBAIC0yNiw4ICsyNiwxMCBAQAogY29uc3RleHByIGludDMyX3Qga0JpdHNQZXJTYW1wbGUgPSAxNjsKIGNvbnN0ZXhwciBpbnQzMl90IGtPdXRwdXRCdWZmZXJTaXplID0ga1NhbXBsZXNQZXJGcmFtZSAqIGtCaXRzUGVyU2FtcGxlIC8gODsKIGNvbnN0IGJpdHN0cmVhbV9mb3JtYXQga0JpdFN0cmVhbUZvcm1hdHNbMl0gPSB7TUlNRV9JRVRGLCBJRjJ9OwotY29uc3QgaW50MzJfdCBrTG9jYWxXbWZEZWNCeXRlc1BlckZyYW1lWzhdID0gezEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMX07Ci1jb25zdCBpbnQzMl90IGtMb2NhbElmMkRlY0J5dGVzUGVyRnJhbWVbOF0gPSB7MTMsIDE0LCAxNiwgMTgsIDE5LCAyMSwgMjYsIDMxfTsKK2NvbnN0IGludDMyX3Qga0xvY2FsV21mRGVjQnl0ZXNQZXJGcmFtZVsxNl0gPSB7MTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAgNiwgIDUsICA1LCAgMCwgIDAsICAwLCAgMH07Citjb25zdCBpbnQzMl90IGtMb2NhbElmMkRlY0J5dGVzUGVyRnJhbWVbMTZdID0gezEzLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDI2LCAzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsIDE0LCAxNiwgMTgsIDE5LCAyMSwgMjYsIDMxfTsKIAogY2xhc3MgQ29kZWMgewogIHB1YmxpYzoKQEAgLTUyLDcgKzU0LDcgQEAKICAgICBiaXRzdHJlYW1fZm9ybWF0IGJpdHNyZWFtRm9ybWF0ID0ga0JpdFN0cmVhbUZvcm1hdHNbYml0XTsKICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IDA7CiAgICAgLyogRmluZCBmcmFtZSB0eXBlICovCi0gICAgRnJhbWVfVHlwZV8zR1BQIGZyYW1lVHlwZSA9IHN0YXRpY19jYXN0PEZyYW1lX1R5cGVfM0dQUD4oKG1vZGUgPj4gMykgJiAweDA3KTsKKyAgICBGcmFtZV9UeXBlXzNHUFAgZnJhbWVUeXBlID0gc3RhdGljX2Nhc3Q8RnJhbWVfVHlwZV8zR1BQPigobW9kZSA+PiAzKSAmIDB4MGYpOwogICAgICsrZGF0YTsKICAgICAtLXNpemU7CiAgICAgaWYgKGJpdCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9BbmRyb2lkLmJwCmluZGV4IDQ2Zjc3ZTMuLjcxMDZhMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTMyLDQgKzMyLDEwIEBACiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaAppbmRleCBlZjg2OTE1Li5kNTg4NWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCkBAIC0yMCw5ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCi1leHRlcm4gIkMiIHsKICNpbmNsdWRlICJnc20uaCIKLX0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNDMwMzU2NS4uN2EzM2M1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icApAQCAtNiwyMyArNiwxOCBAQAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibG9nIl0sCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAiLAogICAgICAgICAic3JjL2JpdHN0cmVhbS5jcHAiLAogICAgICAgICAic3JjL2Jsb2NrX2lkY3QuY3BwIiwKICAgICAgICAgInNyYy9jYWxfZGNfc2NhbGVyLmNwcCIsCi0gICAgICAgICJzcmMvY2h2cl9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9jaHZfZmlsdGVyLmNwcCIsCiAgICAgICAgICJzcmMvY29tYmluZWRfZGVjb2RlLmNwcCIsCiAgICAgICAgICJzcmMvY29uY2VhbC5jcHAiLAogICAgICAgICAic3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAiLAogICAgICAgICAic3JjL2RjYWNfcHJlZGljdGlvbi5jcHAiLAogICAgICAgICAic3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcCIsCi0gICAgICAgICJzcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAiLAotICAgICAgICAic3JjL2RlcmluZ2luZ19sdW1hLmNwcCIsCi0gICAgICAgICJzcmMvZmluZF9taW5fbWF4LmNwcCIsCiAgICAgICAgICJzcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcCIsCiAgICAgICAgICJzcmMvZ2V0X3ByZWRfb3V0c2lkZS5jcHAiLAogICAgICAgICAic3JjL2lkY3QuY3BwIiwKQEAgLTMxLDkgKzI2LDYgQEAKICAgICAgICAgInNyYy9tYl91dGlscy5jcHAiLAogICAgICAgICAic3JjL3BhY2tldF91dGlsLmNwcCIsCiAgICAgICAgICJzcmMvcG9zdF9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9wb3N0X3Byb2Nfc2VtYXBob3JlLmNwcCIsCi0gICAgICAgICJzcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAiLAotICAgICAgICAic3JjL3BwX3NlbWFwaG9yZV9sdW1hLmNwcCIsCiAgICAgICAgICJzcmMvcHZkZWNfYXBpLmNwcCIsCiAgICAgICAgICJzcmMvc2NhbGluZ190YWIuY3BwIiwKICAgICAgICAgInNyYy92bGNfZGVjb2RlLmNwcCIsCkBAIC00MywxMSArMzUsNiBAQAogICAgICAgICAic3JjL3ppZ3phZ190YWIuY3BwIiwKICAgICBdLAogCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiCi0gICAgXSwKLQogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIApAQCAtNjMsNiArNTAsMTIgQEAKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oCmluZGV4IDFmNDA0Y2UuLjA2YWVlMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL21wNGRlY19hcGkuaApAQCAtNDIsMTMgKzQyLDYgQEAKICNkZWZpbmUgT1NDTF9FWFBPUlRfUkVGIC8qIGVtcHR5ICovCiAjZW5kaWYKIAotLyogZmxhZyBmb3IgcG9zdC1wcm9jZXNzaW5nICA0LzI1LzAwICovCi0KLSNpZmRlZiBERUNfTk9QT1NUUFJPQwotI3VuZGVmIFBWX1BPU1RQUk9DX09OICAgLyogZW5hYmxlIGNvbXBpbGF0aW9uIG9mIHBvc3QtcHJvY2Vzc2luZyBjb2RlICovCi0jZWxzZQotI2RlZmluZSBQVl9QT1NUUFJPQ19PTgotI2VuZGlmCiAKICNkZWZpbmUgUFZfTk9fUE9TVF9QUk9DIDAKICNkZWZpbmUgUFZfREVCTE9DSyAxCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2FkYXB0aXZlX3Ntb290aF9ub19tbXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjc2MWViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2FkYXB0aXZlX3Ntb290aF9ub19tbXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotCi0gRGVzY3JpcHRpb246IFNlcGFyYXRlZCBtb2R1bGVzIGludG8gb25lIGZ1bmN0aW9uIHBlciBmaWxlIGFuZCBwdXQgaW50bwotICAgIG5ldyB0ZW1wbGF0ZS4KLQotIERlc2NyaXB0aW9uOiBPcHRpbWl6aW5nIEMgY29kZSBhbmQgYWRkaW5nIGNvbW1lbnRzLiAgQWxzbyBjaGFuZ2luZyB2YXJpYWJsZQotICAgIG5hbWVzIHRvIG1ha2UgdGhlbSBtb3JlIG1lYW5pbmdmdWwuCi0KLSBXaG86ICAgICAgICAgICAgICAgICAgIERhdGU6Ci0gRGVzY3JpcHRpb246Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLQotICAgIFJlY19ZID0gcG9pbnRlciB0byAwdGggcG9zaXRpb24gaW4gYnVmZmVyIGNvbnRhaW5pbmcgbHVtaW5hbmNlIHZhbHVlcwotICAgICAgICBvZiB0eXBlIHVpbnQ4LgotICAgIHlfc3RhcnQgPSB2YWx1ZSBvZiB5IGNvb3JkaW5hdGUgb2YgdHlwZSBpbnQgdGhhdCBzcGVjaWZpZXMgdGhlIGZpcnN0Ci0gICAgICAgIHJvdyBvZiBwaXhlbHMgdG8gYmUgdXNlZCBpbiB0aGUgZmlsdGVyIGFsZ29yaXRobS4KLSAgICB4X3N0YXJ0ID0gdmFsdWUgb2YgeCBjb29yZGluYXRlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZSBmaXJzdAotICAgICAgICBjb2x1bW4gb2YgcGl4ZWxzIHRvIGJlIHVzZWQgaW4gdGhlIGZpbHRlciBhbGdvcml0aG0uCi0gICAgeV9ibGtfc3RhcnQgPSB2YWx1ZSBvZiB0aGUgeSBjb29yZGluYXRlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZQotICAgICAgICByb3cgb2YgcGl4ZWxzIHdoaWNoIGNvbnRhaW5zIHRoZSBzdGFydCBvZiBhIGJsb2NrLiBUaGUgcm93Ci0gICAgICAgIHNwZWNpZmllZCBieSB5X2Jsa19zdGFydCtCTEtfU0laRSBpcyB0aGUgbGFzdCByb3cgb2YgcGl4ZWxzCi0gICAgICAgIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGZpbHRlciBhbGdvcml0aG0uCi0gICAgeF9ibGtfc3RhcnQgPSB2YWx1ZSBvZiB0aGUgeCBjb29yZGluYXRlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZQotICAgICAgICBjb2x1bW4gb2YgcGl4ZWxzIHdoaWNoIGNvbnRhaW5zIHRoZSBzdGFydCBvZiBhIGJsb2NrLiAgVGhlCi0gICAgICAgIGNvbHVtbiBzcGVjaWZpZWQgYnkgeF9ibGtfc3RhcnQrQkxLX1NJWkUgaXMgdGhlIGxhc3QgY29sdW1uIG9mCi0gICAgICAgIHBpeGVscyB0aGF0IGFyZSB1c2VkIGluIHRoZSBmaWx0ZXIgYWxnb3JpdGhtLgotICAgIHRociA9IHZhbHVlIG9mIHR5cGUgaW50IHRoYXQgaXMgY29tcGFyZWQgdG8gdGhlIGVsZW1lbnRzIGluIFJlY19ZIHRvCi0gICAgICAgIGRldGVybWluZSBpZiBhIHBhcnRpY3VsYXIgdmFsdWUgaW4gUmVjX1kgd2lsbCBiZSBtb2RpZmllZCBieQotICAgICAgICB0aGUgZmlsdGVyIG9yIG5vdAotICAgIHdpZHRoID0gdmFsdWUgb2YgdHlwZSBpbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBkaXNwbGF5Ci0gICAgICAgIGluIHBpeGVscyAob3IgcGVscywgZXF1aXZhbGVudGx5KS4KLSAgICBtYXhfZGlmZiA9IHZhbHVlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZSB2YWx1ZSB0aGF0IG1heSBiZSBhZGRlZAotICAgICAgICBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHBpeGVsIGluIFJlY19ZIHRoYXQgaXMgYmVpbmcgZmlsdGVyZWQKLSAgICAgICAgaWYgdGhlIGZpbHRlciBhbGdvcml0aG0gZGVjaWRlcyB0byBjaGFuZ2UgdGhhdCBwYXJ0aWN1bGFyCi0gICAgICAgIHBpeGVsJ3MgbHVtaW5hbmNlIHZhbHVlLgotCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIEJ1ZmZlciBwb2ludGVkIHRvIGJ5IFJlY19ZIGlzIG1vZGlmaWVkIHdpdGggdGhlIGZpbHRlcmVkCi0gICAgbHVtaW5hbmNlIHZhbHVlcy4KLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBhIG1vdGlvbiBjb21wZW5zYXRlZCBub2lzZSBmaWx0ZXIgdXNpbmcgYWRhcHRpdmUKLSB3ZWlnaHRlZCBhdmVyYWdpbmcgb2YgbHVtaW5hbmNlIHZhbHVlcy4gICpSZWNfWSBjb250YWlucyB0aGUgbHVtaW5hbmNlIHZhbHVlcwotIHRoYXQgYXJlIGJlaW5nIGZpbHRlcmVkLgotCi0gVGhlIHBpY3R1cmUgYmVsb3cgZGVwaWN0cyBhIDN4MyBncm91cCBvZiBwaXhlbCBsdW1pbmFuY2UgdmFsdWVzLiAgVGhlICJ1IiwgImMiLAotIGFuZCAibCIgc3RhbmQgZm9yICJ1cHBlciIsICJjZW50ZXIiIGFuZCAibG93ZXIiLCByZXNwZWN0aXZlbHkuICBUaGUgbG9jYXRpb24KLSBvZiBwZWxjMCBpcyBzcGVjaWZpZWQgYnkgeF9zdGFydCBhbmQgeV9zdGFydCBpbiB0aGUgMS1EIGFycmF5ICJSZWNfWSIgYXMKLSBmb2xsb3dzIChhc3N1bWluZyB4X3N0YXJ0PTApOgotCi0gbG9jYXRpb24gb2YgcGVsYzAgPSBbKHlfc3RhcnQrMSkgKiB3aWR0aF0gKyB4X3N0YXJ0Ci0KLSBNb3ZpbmcgdXAgb3IgZG93biAxIHJvdyAobW92aW5nIGZyb20gcGVsdTIgdG8gcGVsYzIsIGZvciBleGFtcGxlKSBpcyBkb25lIGJ5Ci0gaW5jcmVtZW50aW5nIG9yIGRlY3JlbWVudGluZyAid2lkdGgiIGVsZW1lbnRzIHdpdGhpbiBSZWNfWS4KLQotIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdXBwZXIgbGVmdCBoYW5kIGNvcm5lciBvZiBhIGJsb2NrIChub3QgdGhlIGdyb3VwIG9mCi0gOSBwaXhlbHMgZGVwaWN0ZWQgaW4gdGhlIGZpZ3VyZSBiZWxvdykgaXMgc3BlY2lmaWVkIGJ5Ci0gKHlfYmxrX3N0YXJ0LCB4X2Jsa19zdGFydCkuICBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYmxvY2sgaXMgQkxLU0laRS4KLSAoeV9zdGFydCx4X3N0YXJ0KSBtYXkgYmUgc3BlY2lmaWVkIGluZGVwZW5kZW50bHkgb2YgKHlfYmxrX3N0YXJ0LCB4X2Jsa19zdGFydCkuCi0KLSAgICAoeV9zdGFydCx4X3N0YXJ0KQotIC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgfCAgIHwgICB8ICAgfCAgIHwKLSAgICB8ICAgWCAgIHwgcGVsdTEgfCBwZWx1MiB8Ci0gICAgfCBwZWx1MCB8ICAgfCAgIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB8ICAgfCAgIHwgICB8Ci0gICAgfCBwZWxjMCB8IHBlbGMxIHwgcGVsYzIgfAotICAgIHwgICB8ICAgfCAgIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB8ICAgfCAgIHwgICB8Ci0gICAgfCBwZWxsMCB8IHBlbGwxIHwgcGVsbDIgfAotICAgIHwgICB8ICAgfCAgIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIFRoZSBmaWx0ZXJpbmcgb2YgdGhlIGx1bWluYW5jZSB2YWx1ZXMgaXMgYWNoaWV2ZWQgYnkgY29tcGFyaW5nIHRoZSA5Ci0gbHVtaW5hbmNlIHZhbHVlcyB0byBhIHRocmVzaG9sZCB2YWx1ZSAoInRociIpIGFuZCB0aGVuIGNoYW5naW5nIHRoZQotIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSBpZiBhbGwgb2YgdGhlIHZhbHVlcyBhcmUgYWJvdmUgb3IgYWxsIG9mIHRoZSB2YWx1ZXMKLSBhcmUgYmVsb3cgdGhlIHRocmVzaG9sZC4gIFRoZSBhbW91bnQgdGhhdCB0aGUgbHVtaW5hbmNlIHZhbHVlIGlzIGNoYW5nZWQKLSBkZXBlbmRzIG9uIGEgd2VpZ2h0ZWQgc3VtIG9mIHRoZSA5IGx1bWluYW5jZSB2YWx1ZXMuIFRoZSBwb3NpdGlvbiBvZiBQZWxjMQotIGlzIHRoZW4gYWR2YW5jZWQgdG8gdGhlIHJpZ2h0IGJ5IG9uZSAoYXMgd2VsbCBhcyBhbGwgb2YgdGhlIHN1cnJvdW5kaW5nIHBpeGVscykKLSBhbmQgdGhlIHNhbWUgY2FsY3VsYXRpb24gaXMgcGVyZm9ybWVkIGFnYWluIGZvciB0aGUgbHVtaW5hbmNlIHZhbHVlIG9mIHRoZSBuZXcKLSBQZWxjMS4gVGhpcyBjb250aW51ZXMgcm93LXdpc2UgdW50aWwgcGl4ZWxzIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgYmxvY2sgYXJlCi0gZmlsdGVyZWQuCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVRVUlSRU1FTlRTCi0KLSBOb25lLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0KLSAuLlxjb3JlbGlic1xkZWNvZGVyXGNvbW1vblxzcmNccG9zdF9wcm9jLmMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUFNFVURPLUNPREUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVTT1VSQ0VTIFVTRUQKLSAgIFdoZW4gdGhlIGNvZGUgaXMgd3JpdHRlbiBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yIHRoZQotICAgICB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLSBTVEFDSyBVU0FHRTogW3N0YWNrIGNvdW50IGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUgdG8gcmVwcmVzZW50Ci0gICAgICAgICAgc3RhY2sgdXNhZ2UgZm9yIGVhY2ggc3Vicm91dGluZSBjYWxsZWRdCi0KLSAgICAgd2hlcmU6IFtzdGFjayB1c2FnZSB2YXJpYWJsZV0gPSBzdGFjayB1c2FnZSBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCi0KLSBEQVRBIE1FTU9SWSBVU0VEOiB4IHdvcmRzCi0KLSBQUk9HUkFNIE1FTU9SWSBVU0VEOiB4IHdvcmRzCi0KLSBDTE9DSyBDWUNMRVM6IFtjeWNsZSBjb3VudCBlcXVhdGlvbiBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlCi0gICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKLSAgICAgICAgICAgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbY3ljbGUgY291bnQgdmFyaWFibGVdID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLSNpbmNsdWRlICAgICJtcDRkZWYuaCIKLQotI2RlZmluZSBPU0NMX0RJU0FCTEVfV0FSTklOR19DT05WX1BPU1NJQkxFX0xPU1NfT0ZfREFUQQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEFkYXB0aXZlU21vb3RoX05vTU1YKAotICAgIHVpbnQ4ICpSZWNfWSwgICAgICAgLyogaS9vICAqLwotICAgIGludCB5X3N0YXJ0LCAgICAgICAgLyogaSAgICAqLwotICAgIGludCB4X3N0YXJ0LCAgICAgICAgLyogaSAgICAqLwotICAgIGludCB5X2Jsa19zdGFydCwgICAgLyogaSAgICAqLwotICAgIGludCB4X2Jsa19zdGFydCwgICAgLyogaSAgICAqLwotICAgIGludCB0aHIsICAgICAgICAvKiBpICAgICovCi0gICAgaW50IHdpZHRoLCAgICAgIC8qIGkgICAgKi8KLSAgICBpbnQgbWF4X2RpZmYgICAgICAgIC8qIGkgICAgKi8KLSkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgIHNpZ25fdlsxNV07Ci0gICAgaW50IHN1bV92WzE1XTsKLSAgICBpbnQgKnN1bV9WX3B0cjsKLSAgICBpbnQgKnNpZ25fVl9wdHI7Ci0gICAgdWludDggcGVsdTsKLSAgICB1aW50OCBwZWxjOwotICAgIHVpbnQ4IHBlbGw7Ci0gICAgdWludDggKnBlbHA7Ci0gICAgdWludDggb2xkcm93WzE1XTsKLSAgICBpbnQgIHN1bTsKLSAgICBpbnQgc3VtMTsKLSAgICB1aW50OCAqUmVjX1lfcHRyOwotICAgIGludDMyICBhZGRyX3Y7Ci0gICAgaW50IHJvd19jbnRyOwotICAgIGludCBjb2xfY250cjsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogIGZpcnN0IHJvdwotICAgICovCi0gICAgYWRkcl92ID0gKGludDMyKSh5X3N0YXJ0ICsgMSkgKiB3aWR0aDsgIC8qIHkgY29vcmQgb2YgMXN0IGVsZW1lbnQgaW4gdGhlIHJvdyAgLwotICAgICAgICAgICAgICAgICAgICAgL2NvbnRhaW5pbmcgcGVsYyBwaXhlbCAvICAgICAqLwotICAgIFJlY19ZX3B0ciA9ICZSZWNfWVthZGRyX3YgKyB4X3N0YXJ0XTsgIC8qIGluaXRpYWxpemluZyBwb2ludGVyIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvICBwZWxjMCBwb3NpdGlvbiAgKi8KLSAgICBzdW1fVl9wdHIgPSAmc3VtX3ZbMF07ICAvKiBpbml0aWFsaXppbmcgcG9pbnRlciB0byAwdGggZWxlbWVudCBvZiBhcnJheQotICAgICAgICAgICAgICAgIC8gICB0aGF0IHdpbGwgY29udGFpbiB3ZWlnaHRlZCBzdW1zIG9mIHBpeGVsCi0gICAgICAgICAgICAgICAgLyAgIGx1bWluYW5jZSB2YWx1ZXMgKi8KLSAgICBzaWduX1ZfcHRyID0gJnNpZ25fdlswXTsgIC8qICBpbml0aWFsaXppbmcgcG9pbnRlciB0byAwdGggZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgLyAgIGFycmF5IHRoYXQgd2lsbCBjb250YWluIHN1bXMgdGhhdCBpbmRpY2F0ZQotICAgICAgICAgICAgICAgICAgLyAgICBob3cgbWFueSBvZiB0aGUgOSBwaXhlbHMgYXJlIGFib3ZlIG9yIGJlbG93Ci0gICAgICAgICAgICAgICAgICAvICAgIHRoZSB0aHJlc2hvbGQgdmFsdWUgKHRocikgICAgKi8KLSAgICBwZWxwID0gJm9sZHJvd1swXTsgIC8qIGluaXRpYWxpemluZyBwb2ludGVyIHRvIHRoZSAwdGggZWxlbWVudCBvZiBhcnJheQotICAgICAgICAgICAgICAgIC8gICAgdGhhdCB3aWxsIGNvbnRhaW4gY3VycmVudCB2YWx1ZXMgb2YgcGVsYyB0aGF0Ci0gICAgICAgICAgICAgICAgLyAgIGFyZSBzYXZlZCBhbmQgdXNlZCBhcyB2YWx1ZXMgb2YgcGVsdSB3aGVuIHRoZQotICAgICAgICAgICAgICAgIC8gICBuZXh0IHJvdyBvZiBwaXhlbHMgYXJlIGZpbHRlcmVkICovCi0KLSAgICBwZWx1ID0gKihSZWNfWV9wdHIgLSB3aWR0aCk7ICAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsdTAgdG8gcGVsdSAgKi8KLSAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7IC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxjMCB0byBwZWxjIGFuZAotICAgICAgICAgICAgICAgICAgICAgLyAgc3RvcmluZyB0aGlzIHZhbHVlIGluIHBlbHAgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgIC8gICB3aWxsIGJlIHVzZWQgYXMgdmFsdWUgb2YgcGVsdTAgd2hlbgotICAgICAgICAgICAgICAgICAgICAgLyAgbmV4dCByb3cgaXMgZmlsdGVyZWQgKi8KLSAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7ICAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsbDAgdG8gcGVsbCAqLwotICAgIFJlY19ZX3B0cisrOyAvKiBhZHZhbmNpbmcgcG9pbnRlciBmcm9tIHBlbGMwIHRvIHBlbGMxICovCi0gICAgKnN1bV9WX3B0cisrID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsgIC8qIHdlaWdodGVkIHN1bSBvZiBwZWx1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvICBwZWxjMCBhbmQgcGVsbDAgICovCi0gICAgLyogc3VtIG9mIDAncyBhbmQgMSdzICgwIGlmIHBpeGVsIHZhbHVlIGlzIGJlbG93IHRociwgMSBpZiB2YWx1ZQotICAgIC9pcyBhYm92ZSB0aHIpICAqLwotICAgICpzaWduX1ZfcHRyKysgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArIElOREVYKHBlbGwsIHRocik7Ci0KLQotICAgIHBlbHUgPSAqKFJlY19ZX3B0ciAtIHdpZHRoKTsgIC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWx1MSB0byBwZWx1ICovCi0gICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOyAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsYzEgdG8gcGVsYyBhbmQKLSAgICAgICAgICAgICAgICAgICAgIC8gIHN0b3JpbmcgdGhpcyB2YWx1ZSBpbiBwZWxwIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAvICB3aWxsIGJlIHVzZWQgYXMgdGhlIHZhbHVlIG9mIHBlbHUxIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgIC8gIG5leHQgcm93IGlzIGZpbHRlcmVkICovCi0gICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGwxIHRvIHBlbGwgKi8KLSAgICBSZWNfWV9wdHIrKzsgIC8qIGFkdmFuY2luZyBwb2ludGVyIGZyb20gcGVsYzEgdG8gcGVsYzIgKi8KLSAgICAqc3VtX1ZfcHRyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOyAvKiB3ZWlnaHRlZCBzdW0gb2YgcGVsdTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAvIHBlbGMxIGFuZCBwZWxsMSAgKi8KLSAgICAvKiBzdW0gb2YgMCdzIGFuZCAxJ3MgKDAgaWYgcGl4ZWwgdmFsdWUgaXMgYmVsb3cgdGhyLCAxIGlmIHZhbHVlCi0gICAgL2lzIGFib3ZlIHRocikgICovCi0gICAgKnNpZ25fVl9wdHIrKyA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsgSU5ERVgocGVsbCwgdGhyKTsKLQotICAgIC8qIFRoZSBsb29wIGJlbG93IHBlcmZvcm1zIHRoZSBmaWx0ZXJpbmcgZm9yIHRoZSBmaXJzdCByb3cgb2YKLSAgICAvICAgcGl4ZWxzIGluIHRoZSByZWdpb24uICBJdCBzdGVwcyBhY3Jvc3MgdGhlIHJlbWFpbmluZyBwaXhlbHMgaW4KLSAgICAvICAgdGhlIHJvdyBhbmQgYWx0ZXJzIHRoZSBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEgaWYgbmVjZXNzYXJ5LAotICAgIC8gICBkZXBlbmRpbmcgb24gdGhlIGx1bWluYW5jZSB2YWx1ZXMgb2YgdGhlIGFkamFjZW50IHBpeGVscyovCi0KLSAgICBmb3IgKGNvbF9jbnRyID0gKHhfYmxrX3N0YXJ0ICsgQkxLU0laRSAtIDEpIC0geF9zdGFydDsgY29sX2NudHIgPiAwOyBjb2xfY250ci0tKQotICAgIHsKLSAgICAgICAgcGVsdSA9ICooUmVjX1lfcHRyIC0gd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbHUyIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvICAgcGVsdSAqLwotICAgICAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7IC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxjMiB0byBwZWxjCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyBhbmQgc3RvcmluZyB0aGlzIHZhbHVlIGluIHBlbHAKLSAgICAgICAgICAgICAgICAgICAgICAgICAvIHdoaWNoIHdpbGwgYmUgdXNlZCAgIGFzIHZhbHVlIG9mIHBlbHUyCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyB3aGVuIG5leHQgcm93IGlzIGZpbHRlcmVkICovCi0gICAgICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGwyIHRvIHBlbGwgKi8KLQotICAgICAgICAvKiB3ZWlnaHRlZCBzdW0gb2YgcGVsdTEsIHBlbGMxIGFuZCBwZWxsMSAgKi8KLSAgICAgICAgKnN1bV9WX3B0ciA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgIC8qIHN1bSBvZiAwJ3MgYW5kIDEncyAoMCBpZiBwaXhlbCB2YWx1ZSBpcyBiZWxvdyB0aHIsCi0gICAgICAgIC8xIGlmIHZhbHVlIGlzIGFib3ZlIHRocikgICovCi0gICAgICAgICpzaWduX1ZfcHRyID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKwotICAgICAgICAgICAgICAgICAgICAgIElOREVYKHBlbGwsIHRocik7Ci0gICAgICAgIC8qIHRoZSB2YWx1ZSBvZiBzdW0xIGluZGljYXRlcyBob3cgbWFueSBvZiB0aGUgOSBwaXhlbHMnCi0gICAgICAgIC9sdW1pbmFuY2UgdmFsdWVzIGFyZSBhYm92ZSBvciBlcXVhbCB0byB0aHIgKi8KLSAgICAgICAgc3VtMSA9ICooc2lnbl9WX3B0ciAtIDIpICsgKihzaWduX1ZfcHRyIC0gMSkgKyAqc2lnbl9WX3B0cjsKLQotICAgICAgICAvKiBhbHRlciB0aGUgbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlmIGFsbCA5IGx1bWluYW5jZSB2YWx1ZXMKLSAgICAgICAgL2FyZSBhYm92ZSBvciBlcXVhbCB0byB0aHIgb3IgaWYgYWxsIDkgdmFsdWVzIGFyZSBiZWxvdyB0aHIgKi8KLSAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHN1bSBpcyBhIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIDkgcGl4ZWwgbHVtaW5hbmNlCi0gICAgICAgICAgICAvdmFsdWVzICAgKi8KLSAgICAgICAgICAgIHN1bSA9ICgqKHN1bV9WX3B0ciAtIDIpICsgKCooc3VtX1ZfcHRyIC0gMSkgPDwgMSkgKwotICAgICAgICAgICAgICAgICAgICpzdW1fVl9wdHIgKyA4KSA+PiA0OwotCi0gICAgICAgICAgICBSZWNfWV9wdHItLTsgIC8qIG1vdmUgcG9pbnRlciBiYWNrIHRvIHBlbGMxICAqLwotICAgICAgICAgICAgLyogSWYgbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlzIGxhcmdlciB0aGFuCi0gICAgICAgICAgICAvIHN1bSBieSBtb3JlIHRoYW4gbWF4X2RpZmYsIHRoZW4gc3VicmFjdCBtYXhfZGlmZgotICAgICAgICAgICAgLyBmcm9tIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSovCi0gICAgICAgICAgICBpZiAoKGludCkoKlJlY19ZX3B0ciAtIHN1bSkgPiBtYXhfZGlmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdW0gPSAqUmVjX1lfcHRyIC0gbWF4X2RpZmY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBJZiBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEgaXMgc21hbGxlciB0aGFuCi0gICAgICAgICAgICAvIHN1bSBieSBtb3JlIHRoYW4gbWF4X2RpZmYsIHRoZW4gYWRkIG1heF9kaWZmCi0gICAgICAgICAgICAvIHRvIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSovCi0gICAgICAgICAgICBlbHNlIGlmICgoaW50KSgqUmVjX1lfcHRyIC0gc3VtKSA8IC1tYXhfZGlmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdW0gPSAqUmVjX1lfcHRyICsgbWF4X2RpZmY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqUmVjX1lfcHRyKysgPSBzdW07IC8qIGFzc2lnbiB2YWx1ZSBvZiBzdW0gdG8gcGVsYzEKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWR2YW5jZSBwb2ludGVyIHRvIHBlbGMyICovCi0gICAgICAgIH0KLSAgICAgICAgUmVjX1lfcHRyKys7IC8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXcgdmFsdWUgb2YgcGVsYzIKLSAgICAgICAgICAgICAgICAgLyAgIG9sZCBwZWxjMiBpcyBub3cgdHJlYXRlZCBhcyBwZWxjMSovCi0gICAgICAgIHN1bV9WX3B0cisrOyAvKiBwb2ludGVyIGlzIGFkdmFuY2VkIHNvIG5leHQgd2VpZ2h0ZWQgc3VtIG1heQotICAgICAgICAgICAgICAgICAvICBiZSBzYXZlZCAqLwotICAgICAgICBzaWduX1ZfcHRyKys7IC8qIHBvaW50ZXIgaXMgYWR2YW5jZWQgc28gbmV4dCBzdW0gb2YgMCdzIGFuZAotICAgICAgICAgICAgICAgICAgLyAxJ3MgbWF5IGJlIHNhdmVkICAqLwotICAgIH0KLQotICAgIC8qIFRoZSBuZXN0ZWQgbG9vcHMgYmVsb3cgcGVyZm9ybSB0aGUgZmlsdGVyaW5nIGZvciB0aGUgcmVtYWluaW5nIHJvd3MgKi8KLQotICAgIGFkZHJfdiA9ICh5X3N0YXJ0ICsgMikgKiB3aWR0aDsgIC8qIGFkdmFuY2UgYWRkcl92IHRvIHRoZSBuZXh0IHJvdwotICAgICAgICAgICAgICAgICAgICAgLyAgIChjb3JyZXNwb25kaW5nIHRvIHBlbGwwKSovCi0gICAgLyogVGhlIG91dGVyIGxvb3Agc3RlcHMgdGhyb3VnaHQgdGhlIHJvd3MuICAgKi8KLSAgICBmb3IgKHJvd19jbnRyID0gKHlfYmxrX3N0YXJ0ICsgQkxLU0laRSkgLSAoeV9zdGFydCArIDIpOyByb3dfY250ciA+IDA7IHJvd19jbnRyLS0pCi0gICAgewotICAgICAgICBSZWNfWV9wdHIgPSAmUmVjX1lbYWRkcl92ICsgeF9zdGFydF07IC8qIGFkdmFuY2UgcG9pbnRlciB0bwotICAgICAgICAgICAgL3RoZSBvbGQgcGVsbDAsIHdoaWNoIGhhcyBiZWNvbWUgdGhlIG5ldyBwZWxjMCAqLwotICAgICAgICBhZGRyX3YgKz0gd2lkdGg7ICAvKiBtb3ZlIGFkZHJfdiBkb3duIDEgcm93ICovCi0gICAgICAgIHN1bV9WX3B0ciA9ICZzdW1fdlswXTsgIC8qIHJlLWluaXRpYWxpemluZyBwb2ludGVyICovCi0gICAgICAgIHNpZ25fVl9wdHIgPSAmc2lnbl92WzBdOyAgLyogcmUtaW5pdGlsYWl6aW5nIHBvaW50ZXIgKi8KLSAgICAgICAgcGVscCA9ICZvbGRyb3dbMF07IC8qIHJlLWluaXRpYWxpemluZyBwb2ludGVyICovCi0KLSAgICAgICAgcGVsdSA9ICpwZWxwOyAvKiBzZXR0aW5nIHBlbHUwIHRvIG9sZCB2YWx1ZSBvZiBwZWxjMCAqLwotICAgICAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7Ci0gICAgICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsKLSAgICAgICAgUmVjX1lfcHRyKys7Ci0gICAgICAgICpzdW1fVl9wdHIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICpzaWduX1ZfcHRyKysgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBJTkRFWChwZWxsLCB0aHIpOwotCi0gICAgICAgIHBlbHUgPSAqcGVscDsgLyogc2V0dGluZyBwZWx1MSB0byBvbGQgdmFsdWUgb2YgcGVsYzEgKi8KLSAgICAgICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOwotICAgICAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7Ci0gICAgICAgIFJlY19ZX3B0cisrOwotICAgICAgICAqc3VtX1ZfcHRyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAqc2lnbl9WX3B0cisrID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKwotICAgICAgICAgICAgICAgICAgICAgICAgSU5ERVgocGVsbCwgdGhyKTsKLSAgICAgICAgLyogVGhlIGlubmVyIGxvb3Agc3RlcHMgdGhyb3VnaCB0aGUgY29sdW1ucyAqLwotICAgICAgICBmb3IgKGNvbF9jbnRyID0gKHhfYmxrX3N0YXJ0ICsgQkxLU0laRSAtIDEpIC0geF9zdGFydDsgY29sX2NudHIgPiAwOyBjb2xfY250ci0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwZWx1ID0gKnBlbHA7IC8qIHNldHRpbmcgcGVsdTIgdG8gb2xkIHZhbHVlIG9mIHBlbGMyICovCi0gICAgICAgICAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7Ci0gICAgICAgICAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7Ci0KLSAgICAgICAgICAgICpzdW1fVl9wdHIgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgKnNpZ25fVl9wdHIgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOREVYKHBlbGwsIHRocik7Ci0KLSAgICAgICAgICAgIHN1bTEgPSAqKHNpZ25fVl9wdHIgLSAyKSArICooc2lnbl9WX3B0ciAtIDEpICsgKnNpZ25fVl9wdHI7Ci0gICAgICAgICAgICAvKiB0aGUgImlmIiBzdGF0ZW1lbnQgYmVsb3cgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBpbgotICAgICAgICAgICAgLyB0aGUgZmlyc3QgbG9vcCAqLwotICAgICAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VtID0gKCooc3VtX1ZfcHRyIC0gMikgKyAoKihzdW1fVl9wdHIgLSAxKSA8PCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICpzdW1fVl9wdHIgKyA4KSA+PiA0OwotCi0gICAgICAgICAgICAgICAgUmVjX1lfcHRyLS07Ci0gICAgICAgICAgICAgICAgaWYgKChpbnQpKCpSZWNfWV9wdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdW0gPSAqUmVjX1lfcHRyIC0gbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKChpbnQpKCpSZWNfWV9wdHIgLSBzdW0pIDwgLW1heF9kaWZmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VtID0gKlJlY19ZX3B0ciArIG1heF9kaWZmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqUmVjX1lfcHRyKysgPSAodWludDgpIHN1bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJlY19ZX3B0cisrOwotICAgICAgICAgICAgc3VtX1ZfcHRyKys7Ci0gICAgICAgICAgICBzaWduX1ZfcHRyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCmluZGV4IDNkMTAwODYuLmJjNzA4ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCkBAIC01MDYsNiArNTA2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBGdW5jdGlvbiBDb2RlIEZPUiBpZGN0cm93CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdHJvdygKICAgICBpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoCiApCkBAIC04MjgsNiArODI5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBGdW5jdGlvbiBDb2RlIEZPUiBpZGN0Y29sCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdGNvbCgKICAgICBpbnQxNiAqYmxrCiApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZfZmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Nodl9maWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTkzYjQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Nodl9maWx0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIFtpbnB1dF92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgaW5wdXQgdG8gbW9kdWxlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgc3RvcmUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIGJ1ZmZlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHN0b3JlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2dsb2JhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBidWZmZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbZ2xvYmFsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBPdXRwdXRzOgotICAgIFtyZXR1cm5fdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgZGF0YS9wb2ludGVyIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICBieSBtb2R1bGUsIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgW3ZhcmlhYmxlX2Jmcl9wdHJdIHBvaW50cyB0byB0aGUgW2Rlc2NyaWJlIHdoZXJlIHRoZQotICAgICAgdmFyaWFibGVfYmZyX3B0ciBwb2ludHMgdG8sIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFt2YXJpYWJsZV9iZnJdIGNvbnRlbnRzIGFyZSBbZGVzY3JpYmUgdGhlIG5ldyBjb250ZW50cyBvZgotICAgICAgdmFyaWFibGVfYmZyXQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gICBGb3IgZmFzdCBEZWJsb2NrIGZpbHRlcmluZwotICAgTmV3ZXIgdmVyc2lvbiAobWFjcm9ibG9jayBiYXNlZCBwcm9jZXNzaW5nKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMKLQotIFtMaXN0IHJlcXVpcmVtZW50cyB0byBiZSBzYXRpc2ZpZWQgYnkgdGhpcyBtb2R1bGUuXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0KLSBbTGlzdCBhbGwgcmVmZXJlbmNlcyB1c2VkIGluIGRlc2lnbmluZyB0aGlzIG1vZHVsZS5dCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFU09VUkNFUyBVU0VECi0gICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAotICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0gREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQotICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCi0gICAgICAgICAgIGNhbGxlZF0KLQotICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQotICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09OVl9QT1NTSUJMRV9MT1NTX09GX0RBVEEKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vI2RlZmluZSBGSUxURVJfTEVOXzgKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEZ1bmN0aW9uIHByb3RvdHlwZSA6IHZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlciggICB1aW50OCAqcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcF9tb2QpCi0gICAgUGFyYW1ldGVycyAgOgotICAgICAgICByZWMgICAgIDogICBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIGZyYW1lIGJ1ZmZlci4KLSAgICAgICAgd2lkdGggICA6ICAgd2lkdGggb2YgZGVjb2RlZCBmcmFtZS4KLSAgICAgICAgaGVpZ2h0ICA6ICAgaGVpZ2h0IG9mIGRlY29kZWQgZnJhbWUKLSAgICAgICAgUVBfc3RvcmU6ICAgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgUVAgY29ycmVzcG9uZGluZyB0byB0aGUgZGVjb2RlZCBmcmFtZS4KLSAgICAgICAgICAgICAgICAgICAgSXQgaGFkIG9ubHkgb25lIHZhbHVlIGZvciBlYWNoIE1CLgotICAgICAgICBjaHIgICAgIDogICBsdW1hIG9yIGNvbG9yIGluZGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPT0gMCBsdW1hCi0gICAgICAgICAgICAgICAgICAgID09IDEgY29sb3IKLSAgICAgICAgcHBfbW9kICA6ICAgVGhlIHNlbXBob3JlIHVzZWQgZm9yIGRlYmxvY2tpbmcKLQotICAgIFJlbWFyayAgICAgIDogICBUaGUgZnVuY3Rpb24gZG8gdGhlIGRlYmxvY2tpbmcgb24gZGVjb2RlZCBmcmFtZXMuCi0gICAgICAgICAgICAgICAgICAgIEZpcnN0IGJhc2VkIG9uIHRoZSBzZW1hcGhvcmUgaW5mby4sIGl0IGlzIGRpdmlkZWQgaW50byBoYXJkIGFuZCBzb2Z0IGZpbHRlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgVG8gZGlmZmVyZW50aWF0ZSByZWFsIGFuZCBmYWtlIGVkZ2UsIGl0IHRoZW4gY2hlY2sgdGhlIGRpZmZlcmVuY2Ugd2l0aCBRUCB0bwotICAgICAgICAgICAgICAgICAgICBkZWNpZGUgd2hldGhlciB0byBkbyB0aGUgZmlsdGVyaW5nIG9yIG5vdC4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIoCi0gICAgdWludDggKnJlYywKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50IGNociwKLSAgICB1aW50OCAqcHBfbW9kKQotewotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCBiciwgYmMsIG1iciwgbWJjOwotICAgIGludCBRUCA9IDE7Ci0gICAgdWludDggKnB0ciwgKnB0cl9lOwotICAgIGludCBwcF93LCBwcF9oOwotICAgIGludCBicndpZHRoOwotCi0gICAgaW50IGpWYWwwLCBqVmFsMSwgalZhbDI7Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBwcF93ID0gKHdpZHRoID4+IDMpOwotICAgIHBwX2ggPSAoaGVpZ2h0ID4+IDMpOwotCi0gICAgZm9yIChtYnIgPSAwOyBtYnIgPCBwcF9oOyBtYnIgKz0gMikgICAgICAgICAvKiByb3cgb2YgYmxvY2tzICovCi0gICAgewotICAgICAgICBicndpZHRoID0gbWJyICogcHBfdzsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzIGFib3ZlIGN1cnJlbnQgYmxvY2sgcm93ICovCi0gICAgICAgIGZvciAobWJjID0gMDsgbWJjIDwgcHBfdzsgbWJjICs9IDIpICAgICAvKiBjb2wgb2YgYmxvY2tzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY2hyKQotICAgICAgICAgICAgICAgIFFQID0gUVBfc3RvcmVbKGJyd2lkdGg+PjIpICsgKG1iYz4+MSldOyAvKiBRUCBpcyBwZXIgTUIgYmFzZWQgdmFsdWUgKi8KLQotICAgICAgICAgICAgLyoqKioqKioqKiBmb3IgZWFjaCBibG9jayAqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogSG9yaXouIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnIgKyAxOyBiciA8IG1iciArIDM7IGJyKyspICAvKiAyeDIgYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OyAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBhYm92ZSAmIGxlZnQgY3VycmVudCBibG9jayByb3cgKi8KLSAgICAgICAgICAgICAgICAvKiB0aGUgcHJvZmlsZSBvbiBBUk05MjBUIHNob3dzIHNlcGFyYXRlIHRoZXNlIHR3byBib3VuZGFyeSBjaGVjayBpcyBmYXN0ZXIgdGhhbiBjb21iaW5lIHRoZW0gKi8KLSAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oKSAgICAgICAgICAgICAgICAgIC8qIGJvdW5kYXJ5IDogZG9uJ3QgZG8gaXQgb24gdGhlIGxvd2VzdCByb3cgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChiYyA9IG1iYzsgYmMgPCBtYmMgKyAyOyBiYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA8IHBwX3cpICAgICAgICAgICAgICAvKiBib3VuZGFyeSA6IGRvbid0IGRvIGl0IG9uIHRoZSBtb3N0IHJpZ2h0IGNvbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gYnJ3aWR0aCArIGJjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpICAgIFFQID0gUVBfc3RvcmVbalZhbDBdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2UgPSBwdHIgKyA4OyAgICAgICAgLyogcG9pbnRlciB0byB3aGVyZSB0aGUgbG9vcCBlbmRzICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChwcF9tb2RbalZhbDBdJjB4MDIpKSAmJiAoKHBwX21vZFtqVmFsMC1wcF93XSYweDAyKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIb3JpeiBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gd2lkdGgpOyAgICAgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoalZhbDIgPiAwKSAmJiAoalZhbDIgPCAoUVAgPDwgMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGpWYWwyIDwgMCkgJiYgKGpWYWwyID4gLShRUCA8PCAxKSkpKSAvKiAoRC1DKSBjb21wYXJlZCB3aXRoIDJRUCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpZmZlcmVudGlhdGUgYmV0d2VlbiByZWFsIGFuZCBmYWtlIGVkZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICgoalZhbDAgKyBqVmFsMSkgPj4gMSk7ICAgICAvKiAoRCtDKS8yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsgICAgLyogIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHVpbnQ4KShqVmFsMCk7ICAgICAgICAgIC8qICBEICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gKHdpZHRoIDw8IDEpKTsgICAgICAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIHdpZHRoKTsgICAgICAgICAvKiBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgIC8qIEUtQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyAzKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qICBzdG9yZSBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBzdG9yZSBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDMgLSBqVmFsMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpKSA9ICh1aW50OClqVmFsMDsgICAgICAgLyogIHN0b3JlIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIHN0b3JlIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpOyAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAod2lkdGggPDwgMSkpOyAgICAgIC8qIEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgICAgICAvKiAoRi1BKSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArICh3aWR0aCA8PCAxKSkgPSAodWludDgpKGpWYWwxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCAtPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAod2lkdGggPDwgMSkpID0gKHVpbnQ4KShqVmFsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGEzXzAgPiAyUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytwdHIgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAvKiBIb3JpeiBzb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gd2lkdGgpOyAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAvKiBDLUIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoalZhbDIgPiAwKSAmJiAoalZhbDIgPCAoUVApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVApKSkpIC8qIChDLUIpIGNvbXBhcmVkIHdpdGggUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKChqVmFsMCArIGpWYWwxKSA+PiAxKTsgICAgIC8qIChCK0MpLzIgY2Fubm90IG92ZXJmbG93OyBjZWlsKCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOyAgICAvKiBCID0gKEIrQykvMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSAodWludDgpalZhbDA7ICAgICAgICAgICAgLyogQyA9IChCK0MpLzIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAod2lkdGggPDwgMSkpOyAgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgd2lkdGgpOyAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgIC8qIEQtQSAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpKSA9ICh1aW50OClqVmFsMDsgICAgICAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHRyIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogU29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICAgICAgICAgfS8qYmMqLwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogVmVydC4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2gpCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmMgKyAxOyBiYyA8IG1iYyArIDM7IGJjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjIDwgcHBfdykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgKHdpZHRoIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwLTFdJjB4MDEpKSAmJiAoKHBwX21vZFtqVmFsMF0mMHgwMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVydCBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAxKTsgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgLyogRC1DICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9IChqVmFsMCArIGpWYWwxKSA+PiAxOyAgIC8qIChDK0QpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyICAgICAgICA9ICAgalZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSAgPSAgIGpWYWwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDEpOyAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAyKTsgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgLyogRS1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDIpOyAgICAgLyogRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAzKTsgICAgIC8qIEEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgLyogZW5kIG9mIHZlciBoYXJkIGZpbGV0ZXJpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAvKiBWZXJ0IHNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKnB0cjsgICAgICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMSk7ICAgICAgICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGpWYWwyIDwgMCkgJiYgKGpWYWwyID4gLShRUCkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKGpWYWwwICsgalZhbDEgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBqVmFsMTsgICAgICAgICAgIC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDEpID0galZhbDE7ICAgICAvKiBCICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgMSk7ICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIDIpOyAgICAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0gKGpWYWwxIC0galZhbDApOyAgICAgICAgLyogRC0gQSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoKGpWYWwyKSArIDcpID4+IDMpOyAgICAgIC8qIEQgLT0gKEQtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKChqVmFsMikgKyA3KSA+PiAzKTsgICAgICAvKiBBICs9IChELUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSAoalZhbDIpKSA+PiAzKTsgICAgICAvKiBEIC09IChELUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0gKGpWYWwyKSkgPj4gMyk7ICAgICAgLyogQSArPSAoRC1BKS84ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBTb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGJvdW5kYXJ5Ki8KLSAgICAgICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLXZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKAotICAgIHVpbnQ4ICpyZWMsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCBjaHIsCi0gICAgdWludDggKnBwX21vZCkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgYnIsIGJjLCBtYnIsIG1iYzsKLSAgICBpbnQgUVAgPSAxOwotICAgIHVpbnQ4ICpwdHIsICpwdHJfZTsKLSAgICBpbnQgcHBfdywgcHBfaDsKLSAgICBpbnQgYnJ3aWR0aDsKLQotICAgIGludCBqVmFsMCwgalZhbDEsIGpWYWwyOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcHBfdyA9ICh3aWR0aCA+PiAzKTsKLSAgICBwcF9oID0gKGhlaWdodCA+PiAzKTsKLQotICAgIGZvciAobWJyID0gMDsgbWJyIDwgcHBfaDsgbWJyICs9IDIpICAgICAgICAgLyogcm93IG9mIGJsb2NrcyAqLwotICAgIHsKLSAgICAgICAgYnJ3aWR0aCA9IG1iciAqIHBwX3c7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBhYm92ZSBjdXJyZW50IGJsb2NrIHJvdyAqLwotICAgICAgICBmb3IgKG1iYyA9IDA7IG1iYyA8IHBwX3c7IG1iYyArPSAyKSAgICAgLyogY29sIG9mIGJsb2NrcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNocikKLSAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlWyhicndpZHRoPj4yKSArIChtYmM+PjEpXTsgLyogUVAgaXMgcGVyIE1CIGJhc2VkIHZhbHVlICovCi0KLSAgICAgICAgICAgIC8qKioqKioqKiogZm9yIGVhY2ggYmxvY2sgKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIEhvcml6LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyICsgMTsgYnIgPCBtYnIgKyAzOyBicisrKSAgLyogMngyIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyd2lkdGggKz0gcHBfdzsgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgYWJvdmUgJiBsZWZ0IGN1cnJlbnQgYmxvY2sgcm93ICovCi0gICAgICAgICAgICAgICAgLyogdGhlIHByb2ZpbGUgb24gQVJNOTIwVCBzaG93cyBzZXBhcmF0ZSB0aGVzZSB0d28gYm91bmRhcnkgY2hlY2sgaXMgZmFzdGVyIHRoYW4gY29tYmluZSB0aGVtICovCi0gICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCkgICAgICAgICAgICAgICAgICAvKiBib3VuZGFyeSA6IGRvbid0IGRvIGl0IG9uIHRoZSBsb3dlc3Qgcm93IGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKiBjaGVjayBib3VuZGFyeSBmb3IgZGVibG9ja2luZyAqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmMgPCBwcF93KSAgICAgICAgICAgICAgLyogYm91bmRhcnkgOiBkb24ndCBkbyBpdCBvbiB0aGUgbW9zdCByaWdodCBjb2wgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgODsgICAgICAgIC8qIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGxvb3AgZW5kcyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwXSYweDAyKSkgJiYgKChwcF9tb2RbalZhbDAtcHBfd10mMHgwMikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSG9yaXogSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIHdpZHRoKTsgICAgIC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKnB0cjsgICAgICAgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkgLyogKEQtQykgY29tcGFyZWQgd2l0aCAyUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcmVhbCBhbmQgZmFrZSBlZGdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAoKGpWYWwwICsgalZhbDEpID4+IDEpOyAgICAgLyogKEQrQykvMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7ICAgIC8qICBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh1aW50OCkoalZhbDApOyAgICAgICAgICAvKiAgRCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSk7ICAgICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyB3aWR0aCk7ICAgICAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAvKiBFLUIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgMykgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiAgc3RvcmUgQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogc3RvcmUgRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qICBzdG9yZSBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBzdG9yZSBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKTsgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgKHdpZHRoIDw8IDEpKTsgICAgICAvKiBGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAod2lkdGggPDwgMSkpID0gKHVpbnQ4KShqVmFsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgKHdpZHRoIDw8IDEpKSA9ICh1aW50OCkoalZhbDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBhM18wID4gMlFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHRyIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICAgICAgICAgfS8qYmMqLwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogVmVydC4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2gpCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmMgKyAxOyBiYyA8IG1iYyArIDM7IGJjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjIDwgcHBfdykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgKHdpZHRoIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwLTFdJjB4MDEpKSAmJiAoKHBwX21vZFtqVmFsMF0mMHgwMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVydCBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAxKTsgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgLyogRC1DICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9IChqVmFsMCArIGpWYWwxKSA+PiAxOyAgIC8qIChDK0QpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyICAgICAgICA9ICAgalZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSAgPSAgIGpWYWwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDEpOyAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAyKTsgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgLyogRS1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDIpOyAgICAgLyogRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAzKTsgICAgIC8qIEEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgLyogZW5kIG9mIHZlciBoYXJkIGZpbGV0ZXJpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGJvdW5kYXJ5Ki8KLSAgICAgICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2h2cl9maWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2h2cl9maWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTVjZjcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NodnJfZmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0KLXZvaWQgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIoCi0gICAgdWludDggKnJlYywKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50IGNociwKLSAgICB1aW50OCAqcHBfbW9kKQotewotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCBpbmRleCwgY291bnRlcjsKLSAgICBpbnQgYnIsIGJjLCBpbmNyLCBtYnIsIG1iYzsKLSAgICBpbnQgUVAgPSAxOwotICAgIGludCB2WzVdOwotICAgIHVpbnQ4ICpwdHIsICpwdHJfYywgKnB0cl9uOwotICAgIGludCB3MSwgdzIsIHczLCB3NDsKLSAgICBpbnQgcHBfdywgcHBfaCwgYnJ3aWR0aDsKLSAgICBpbnQgc3VtLCBkZWx0YTsKLSAgICBpbnQgYTNfMCwgYTNfMSwgYTNfMiwgQTNfMDsKLSAgICAvKiBmb3IgRGVyaW5naW5nIFRocmVzaG9sZCBhcHByb2FjaCAoTVBFRzQpKi8KLSAgICBpbnQgbWF4X2RpZmYsIHRocmVzLCB2MCwgaDAsIG1pbl9ibGssIG1heF9ibGs7Ci0gICAgaW50IGNudGhmbGFnOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBDYWxjdWxhdGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaW4gYmxvY2tzIChkaXZpZGUgYnkgOCkgKi8KLSAgICBwcF93ID0gKHdpZHRoID4+IDMpOwotICAgIHBwX2ggPSAoaGVpZ2h0ID4+IDMpOwotCi0gICAgLyogU2V0IHVwIHZhcmlvdXMgdmFsdWVzIG5lZWRlZCBmb3IgdXBkYXRpbmcgcG9pbnRlcnMgaW50byByZWMgKi8KLSAgICB3MSA9IHdpZHRoOyAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gbmV4dCByb3cgaW4gcGl4ZWxzICovCi0gICAgdzIgPSB3aWR0aCA8PCAxOyAgICAgICAgLyogT2Zmc2V0IHRvIHR3byByb3dzIGluIHBpeGVscyAqLwotICAgIHczID0gdzEgKyB3MjsgICAgICAgICAgIC8qIE9mZnNldCB0byB0aHJlZSByb3dzIGluIHBpeGVscyAqLwotICAgIHc0ID0gdzIgPDwgMTsgICAgICAgICAgIC8qIE9mZnNldCB0byBmb3VyIHJvd3MgaW4gcGl4ZWxzICovCi0gICAgaW5jciA9IHdpZHRoIC0gQkxLU0laRTsgLyogT2Zmc2V0IHRvIG5leHQgcm93IGFmdGVyIHByb2Nlc3NpbmcgYmxvY2sgKi8KLQotICAgIC8qIFdvcmsgdGhyb3VnaCB0aGUgYXJlYSBob3J0aXpvbnRhbGx5IGJ5IHR3byByb3dzIHBlciBzdGVwICovCi0gICAgZm9yIChtYnIgPSAwOyBtYnIgPCBwcF9oOyBtYnIgKz0gMikKLSAgICB7Ci0gICAgICAgIC8qIGJyd2lkdGggY29udGFpbnMgdGhlIGJsb2NrIG51bWJlciBvZiB0aGUgbGVmdG1vc3QgYmxvY2sKLSAgICAgICAgICogb2YgdGhlIGN1cnJlbnQgcm93ICovCi0gICAgICAgIGJyd2lkdGggPSBtYnIgKiBwcF93OwotCi0gICAgICAgIC8qIFdvcmsgdGhyb3VnaCB0aGUgYXJlYSB2ZXJ0aWNhbGx5IGJ5IHR3byBjb2x1bW5zIHBlciBzdGVwICovCi0gICAgICAgIGZvciAobWJjID0gMDsgbWJjIDwgcHBfdzsgbWJjICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGx1bWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgKiBxdWFudGl6YXRpb24gcGFyYW1lbnRlci4gT25lIHBhcmFtZXRlciBwZXIgbWFjcm9ibG9jayAqLwotICAgICAgICAgICAgaWYgKCFjaHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogYnJ3aWR0aC80IGlzIHRoZSBtYWNyb2Jsb2NrIG51bWJlciBhbmQgbWJjLzIgaXMgdGhlIG1hY3JvYmxvY2sgY29sIG51bWJlciovCi0gICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVsoYnJ3aWR0aD4+MikgKyAobWJjPj4xKV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogSG9yaXouIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIFByb2Nlc3MgZm91ciBibG9ja3MgZm9yIHRoZSBmaWx0ZXJpbmcgICAgICAgICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIHJvd3Mgb2YgYmxvY2tzICovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyICsgMTsgYnIgPCBtYnIgKyAzOyBicisrKSAgICAvKiBiciBpcyB0aGUgcm93IGNvdW50ZXIgaW4gYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2V0IGJyd2lkdGggdG8gdGhlIGZpcnN0IChsZWZ0bW9zdCkgYmxvY2sgbnVtYmVyIG9mIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICAgICAgICAgIC8qIGJyd2lkdGggaXMgdXNlZCBhcyBhbiBpbmRleCB3aGVuIGNvdW50aW5nIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgIGJyd2lkdGggKz0gcHBfdzsKLQotICAgICAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gY29sdW1ucyBvZiBibG9ja3MgaW4gdGhlIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykgICAgLyogYmMgaXMgdGhlIGNvbHVtbiBjb3VudGVyIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqKioqKiBjaGVjayBib3VuZGFyeSBmb3IgZGVibG9ja2luZyAqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgaWYgdGhlIHJvdyBhbmQgY29sdW1uIGNvdW50ZXJzIGFyZSB3aXRoaW4gdGhlIGFyZWEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCAmJiBiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcHRyIHRvIHRoZSBmaXJzdCBwaXhlbCBvZiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHNlY29uZCByb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICogYnJ3aWR0aCAqIDY0IGlzIHRoZSBwaXhlbCByb3cgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGJjICogOCBpcyB0aGUgcGl4ZWwgY29sdW1uIG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gdGhlIGN1cnJlbnQgYmxvY2sgb2YgdGhlIHNlY29uZCByb3cgY291bnRpbmcgaW4gYmxvY2tzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGJyd2lkdGggKyBiYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIGRhdGEgaXMgY2hyb21pbmFuY2UgaW5mbywgZ2V0IHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBxdWFudGl6YXRpb24gcGFyYW1lbnRlci4gT25lIHBhcmFtZXRlciBwZXIgYmxvY2suICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQID0gUVBfc3RvcmVbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGhhcmQgaG9yaXpvbnRhbCBmaWx0ZXIgaWYgc2VtYXBob3JlIGZvciBob3Jpem9udGFsIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBzZXQgZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCBibG9jayBpbW1lZGlhdGVseSBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2luZGV4XSYweDAyKSAhPSAwKSAmJiAoKHBwX21vZFtpbmRleC1wcF93XSYweDAyKSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgICAvKiBIYXJkIGZpbHRlciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IEhvcnpIZmxhZyAoYml0IDQpIGluIHRoZSBwcF9tb2QgbG9jYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcF9tb2RbaW5kZXgtcHBfd10gfD0gMHgxMDsgLyogIDQvMjYvMDAgcmV1c2UgcHBfbW9kIGZvciBIb3J6SGZsYWcqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGFjcm9zcyB0aGUgOCBwaXhlbHMgb2YgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IEJMS1NJWkU7IGluZGV4ID4gMDsgaW5kZXgtLSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBwaXhlbCBhbmQgdGhlIHBpeGVsIGFib3ZlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzAgPSAqcHRyIC0gKihwdHIgLSB3MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIEtUaEggdGhyZXNob2xkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCB3aXRoaW4gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIsIGFwcGx5IGhhcmQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTNfMCA+IEtUaEggfHwgYTNfMCA8IC1LVGhIKSAmJiBhM18wPFFQICYmIGEzXzA+IC1RUCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgPSBwdHIgLSB3MzsgICAvKiBQb2ludHMgdG8gcGl4ZWwgdGhyZWUgcm93cyBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gPSBwdHIgKyB3MTsgICAvKiBQb2ludHMgdG8gcGl4ZWwgb25lIHJvdyBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlswXSA9IChpbnQpKCoocHRyX2MgLSB3MykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsxXSA9IChpbnQpKCoocHRyX2MgLSB3MikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsyXSA9IChpbnQpKCoocHRyX2MgLSB3MSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlszXSA9IChpbnQpKCpwdHJfYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzRdID0gKGludCkoKihwdHJfYyArIHcxKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHZbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICpwdHJfYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgdzIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIHczKSk7ICAvKiBDdXJyZW50IHBpeGVsICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKHN1bSArICpwdHJfYyArIDQpID4+IDM7ICAgLyogQXZlcmFnZSBwaXhlbCB2YWx1ZXMgd2l0aCByb3VuZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHJfYykgPSAodWludDgpIGRlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHBvaW50ZXIgZG93biBvbmUgcm93IG9mIHBpeGVscyAocG9pbnRzIHRvIHBpeGVsIHR3byByb3dzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhYm92ZSBjdXJyZW50IHBpeGVsKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgKz0gdzE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCA1OyBjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VidHJhY3Qgb2ZmIGhpZ2hlc3QgcGl4ZWwgYW5kIGFkZCBpbiBwaXhlbCBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHN1bSAtIHZbY291bnRlcl0gKyAqcHRyX247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXZlcmFnZSB0aGUgcGl4ZWwgdmFsdWVzIHdpdGggcm91bmRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHJfYyA9ICh1aW50OCkoZGVsdGEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXJzIHRvIG5leHQgcGl4ZWwgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgKz0gdzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gKz0gdzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXIgdG8gbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgLyogc29mdCBmaWx0ZXIqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgSG9yekhmbGFnIChiaXQgNCkgaW4gdGhlIHBwX21vZCBsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX21vZFtpbmRleC1wcF93XSAmPSAweGVmOyAvKiByZXNldCAxMTEwLDExMTEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHRoZSBwaXhlbCBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wID0gKihwdHIpIC0gKihwdHIgLSB3MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIEtUaCB0aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvZnQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTNfMCA+IEtUaCB8fCBhM18wIDwgLUtUaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIHdlaWdodGVkIGRpZmZlcmVuY2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wICs9ICgoKihwdHIgLSB3MikgLSAqKHB0ciArIHcxKSkgPDwgMSkgKyAoYTNfMCA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgc3VtIGlzIGxlc3MgdGhhbiB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUyhhM18wKSA8IChRUCA8PCAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xID0gKihwdHIgLSB3MikgLSAqKHB0ciAtIHczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xICs9ICgoKihwdHIgLSB3NCkgLSAqKHB0ciAtIHcxKSkgPDwgMSkgKyAoYTNfMSA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzIgID0gKihwdHIgKyB3MikgLSAqKHB0ciArIHcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18yICs9ICgoKihwdHIpIC0gKihwdHIgKyB3MykpIDw8IDEpICsgKGEzXzIgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gUFZfQUJTKGEzXzApIC0gUFZfTUlOKFBWX0FCUyhhM18xKSwgUFZfQUJTKGEzXzIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgKz0gQTNfMCA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gKEEzXzAgKyAzMikgPj4gNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gLUEzXzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9ICgqKHB0ciAtIHcxKSAtICoocHRyKSkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSBBM18wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUFZfTUFYKEEzXzAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFBWX01BWChBM18wLCBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIHcxKSA9ICh1aW50OCkoKihwdHIgLSB3MSkgLSBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyKSA9ICh1aW50OCkoKihwdHIpICsgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyp0aHJlc2hvbGQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBwb2ludGVyIHRvIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogU29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICB9LyogYm91bmRhcnkgY2hlY2tpbmcqLwotICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgIH0vKmJyKi8KLSAgICAgICAgICAgIGJyd2lkdGggLT0gKHBwX3cgPDwgMSk7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKiBWZXJ0LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogUHJvY2VzcyBmb3VyIGJsb2NrcyBmb3IgdGhlIGZpbHRlcmluZyAgICAgICAgKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gcm93cyBvZiBibG9ja3MgKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykgICAgICAvKiBiciBpcyB0aGUgcm93IGNvdW50ZXIgaW4gYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChiYyA9IG1iYyArIDE7IGJjIDwgbWJjICsgMzsgYmMrKykgIC8qIGJjIGlzIHRoZSBjb2x1bW4gY291bnRlciBpbiBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGlmIHRoZSByb3cgYW5kIGNvbHVtbiBjb3VudGVycyBhcmUgd2l0aGluIHRoZSBhcmVhICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2ggJiYgYmMgPCBwcF93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHB0ciB0byB0aGUgZmlyc3QgcGl4ZWwgb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGJyd2lkdGggKiA2NCBpcyB0aGUgcGl4ZWwgcm93IG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgKiBiYyAqIDggaXMgdGhlIHBpeGVsIGNvbHVtbiBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIHRoZSBjdXJyZW50IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93IGNvdW50aW5nIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBicndpZHRoICsgYmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGNocm9taW5hbmNlIGluZm8sIGdldCB0aGUgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBoYXJkIHZlcnRpY2FsIGZpbHRlciBpZiBzZW1hcGhvcmUgZm9yIHZlcnRpY2FsIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBzZXQgZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCBibG9jayBpbW1lZGlhdGVseSBsZWZ0IG9mIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChwcF9tb2RbaW5kZXgtMV0mMHgwMSkgIT0gMCkgJiYgKChwcF9tb2RbaW5kZXhdJjB4MDEpICE9IDApKQotICAgICAgICAgICAgICAgICAgICAgICAgeyAgIC8qIEhhcmQgZmlsdGVyICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgVmVydEhmbGFnIChiaXQgNSkgaW4gdGhlIHBwX21vZCBsb2NhdGlvbiBvZiBwcmV2aW91cyBibG9jayovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfbW9kW2luZGV4LTFdIHw9IDB4MjA7IC8qICA0LzI2LzAwIHJldXNlIHBwX21vZCBmb3IgVmVydEhmbGFnKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBhY3Jvc3MgdGhlIDggcGl4ZWxzIG9mIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgdGhlIHBpeGVsIHRvIGxlZnQgb2YgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCA9ICpwdHIgLSAqKHB0ciAtIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBLVGhIIHRocmVzaG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgd2l0aGluIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLCBhcHBseSBoYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEzXzAgPiBLVGhIIHx8IGEzXzAgPCAtS1RoSCkgJiYgYTNfMDxRUCAmJiBhM18wPiAtUVApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jID0gcHRyIC0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uID0gcHRyICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMF0gPSAoaW50KSgqKHB0cl9jIC0gMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsxXSA9IChpbnQpKCoocHRyX2MgLSAyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzJdID0gKGludCkoKihwdHJfYyAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbM10gPSAoaW50KSgqcHRyX2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdls0XSA9IChpbnQpKCoocHRyX2MgKyAxKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHZbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICpwdHJfYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgMykpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHJfYykgPSAodWludDgpIGRlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHBvaW50ZXIgZG93biBvbmUgcGl4ZWwgdG8gdGhlIHJpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfYyArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDU7IGNvdW50ZXIrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWJ0cmFjdCBvZmYgaGlnaGVzdCBwaXhlbCBhbmQgYWRkIGluIHBpeGVsIGJlbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtID0gc3VtIC0gdltjb3VudGVyXSArICpwdHJfbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdmVyYWdlIHRoZSBwaXhlbCB2YWx1ZXMgd2l0aCByb3VuZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKHN1bSArICpwdHJfYyArIDQpID4+IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cl9jID0gKHVpbnQ4KShkZWx0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlcnMgdG8gbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlcnMgdG8gbmV4dCBwaXhlbCByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogaW5kZXgqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBzb2Z0IGZpbHRlciovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciBWZXJ0SGZsYWcgKGJpdCA1KSBpbiB0aGUgcHBfbW9kIGxvY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfbW9kW2luZGV4LTFdICY9IDB4ZGY7IC8qIHJlc2V0IDExMDEsMTExMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHRoZSBwaXhlbCBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wID0gKihwdHIpIC0gKihwdHIgLSAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgbWFnbml0dWRlIG9mIHRoZSBkaWZmZXJlbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgS1RoIHRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXBwbHkgc29mdCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhM18wID4gS1RoIHx8IGEzXzAgPCAtS1RoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2Ygd2VpZ2h0ZWQgZGlmZmVyZW5jZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzAgKz0gKCgqKHB0ciAtIDIpIC0gKihwdHIgKyAxKSkgPDwgMSkgKyAoYTNfMCA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgc3VtIGlzIGxlc3MgdGhhbiB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUyhhM18wKSA8IChRUCA8PCAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xID0gKihwdHIgLSAyKSAtICoocHRyIC0gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSArPSAoKCoocHRyIC0gNCkgLSAqKHB0ciAtIDEpKSA8PCAxKSArIChhM18xIDw8IDIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMiAgPSAqKHB0ciArIDIpIC0gKihwdHIgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18yICs9ICgoKihwdHIpIC0gKihwdHIgKyAzKSkgPDwgMSkgKyAoYTNfMiA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSBQVl9BQlMoYTNfMCkgLSBQVl9NSU4oUFZfQUJTKGEzXzEpLCBQVl9BQlMoYTNfMikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCArPSBBM18wIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSAoQTNfMCArIDMyKSA+PiA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYTNfMCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSAtQTNfMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKCoocHRyIC0gMSkgLSAqKHB0cikpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gQTNfMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFBWX01BWChBM18wLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBQVl9NQVgoQTNfMCwgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSA9ICh1aW50OCkoKihwdHIgLSAxKSAtIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIpID0gKHVpbnQ4KSgqKHB0cikgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKnRocmVzaG9sZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyppbmRleCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIFNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgfSAvKiBib3VuZGFyeSovCi0gICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlciB0byBuZXh0IHJvdyBvZiBwaXhlbHMgKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIERlcmluZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBQcm9jZXNzIGZvdXIgYmxvY2tzIGZvciB0aGUgZmlsdGVyaW5nICAgICAgICAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogTG9vcCBvdmVyIHR3byByb3dzIG9mIGJsb2NrcyAqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gY29sdW1ucyBvZiBibG9ja3MgaW4gdGhlIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgaWYgdGhlIHJvdyBhbmQgY29sdW1uIGNvdW50ZXJzIGFyZSB3aXRoaW4gdGhlIGFyZWEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCAmJiBiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gdGhlIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYnJ3aWR0aCArIGJjOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGRlcmluZ2luZyBpZiBzZW1hcGhvcmUgZm9yIGRlcmluZ2luZyAoYml0LTMgb2YgcHBfbW9kKQotICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgc2V0IGZvciB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcF9tb2RbaW5kZXhdJjB4MDQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgcHJvY2VzcyBkZXJpbmdpbmcgaWYgb24gYW4gZWRnZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiciA+IDAgJiYgYmMgPiAwICYmIGJyIDwgcHBfaCAtIDEgJiYgYmMgPCBwcF93IC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNudGhmbGFnID0gd2VpZ2h0ZWQgYXZlcmFnZSBvZiBIb3J6SGZsYWcgb2YgY3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb25lIGFib3ZlLCBwcmV2aW91cyBibG9ja3MqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9ICgocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHBfbW9kW2luZGV4XSA+PiAxKSAmIDB4MTApKSA+PiA0OyAvKiA0LzI2LzAwKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyB0aGUgZGVyaW5naW5nIGlmIGRlY2lzaW9uIGZsYWdzIGluZGljYXRlIGl0J3MgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnRoZmxhZyA8IDMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGNocm9taW5hbmNlIGluZm8sIGdldCB0aGUgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGFtb3VudCB0byBjaGFuZ2UgbHVtaW5hbmNlIGlmIGl0IG5lZWRzIHRvIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VkIG9uIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmID0gKFFQID4+IDIpICsgNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHBvaW50ZXIgdG8gZmlyc3QgcGl4ZWwgb2YgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiBwaXhlbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHBpeGVsIHJhbmdlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBERVJJTkdfVEhSLCBzbW9vdGggdGhlIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYXhfYmxrIC0gbWluX2JsaykgPj0gREVSSU5HX1RIUikgLypzbW9vdGggOHg4IHJlZ2lvbiovCi0jaWZuZGVmIE5vTU1YCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc21vb3RoIGFsbCBwaXhlbHMgaW4gdGhlIGJsb2NrKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWChwdHIsIHdpZHRoLCB0aHJlcywgbWF4X2RpZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXR1cCB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHJlZ2lvbiB0byBzbW9vdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MCA9IChiciA8PCAzKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDAgPSAoYmMgPDwgMykgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzbW9vdGggOHg4IHJlZ2lvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgocmVjLCB2MCwgaDAsIHYwICsgMSwgaDAgKyAxLCB0aHJlcywgd2lkdGgsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LypjbnRoZmxhZyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmRlcmluZyBicj09MSBvciBiYz09MSAoYm91bmRhcnkgYmxvY2spKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgIC8qIFByb2Nlc3MgdGhlIGJvdW5kYXJ5IGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVjaWRlIHRvIHBlcmZvcm0gZGVibG9ja2luZyBiYXNlZCBvbiB0aGUgc2VtYXBob3JlIGZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrcyBpbiBlYWNoIGNhc2UuIEEgY2VydGFpbiBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGFyZCBmaWx0ZXJpbmcgZmxhZ3MgaGF2ZSB0byBiZSBzZXQgaW4gb3JkZXIgdG8gc2lnbmFsIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHNtb290aGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPiAwICYmIGJyIDwgcHBfaCAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApKSA+PiA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gKChwcF9tb2RbaW5kZXhdICYgMHgxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXhdID4+IDEpICYgMHgxMCkpID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmMgPiAwICYmIGJjIDwgcHBfdyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiciA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleF0gPj4gMSkgJiAweDEwKSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9ICgocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleF0gPj4gMSkgJiAweDEwKSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGF0IHRoZSBjb3JuZXIgZG8gZGVmYXVsdCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIHRoZSBkZXJpbmdpbmcgaWYgZGVjaXNpb24gZmxhZ3MgaW5kaWNhdGUgaXQncyBuZWNlc3NhcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNudGhmbGFnIDwgMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBjaHJvbWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGFtb3VudCB0byBjaGFuZ2UgbHVtaW5hbmNlIGlmIGl0IG5lZWRzIHRvIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VkIG9uIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmID0gKFFQID4+IDIpICsgNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHBvaW50ZXIgdG8gZmlyc3QgcGl4ZWwgb2YgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiBwaXhlbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldHVwIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgcmVnaW9uIHRvIHNtb290aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBnb2luZyB0byBiZSBhIDR4NCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYwID0gKGJyIDw8IDMpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgwID0gKGJjIDw8IDMpICsgMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgcGl4ZWwgcmFuZ2UgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIERFUklOR19USFIsIHNtb290aCB0aGUgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heF9ibGsgLSBtaW5fYmxrKSA+PSBERVJJTkdfVEhSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNtb290aCA0eDQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgocmVjLCB2MCwgaDAsIHYwIC0gMywgaDAgLSAzLCB0aHJlcywgd2lkdGgsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qY250aGZsYWcqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogYnI9PTAsIGJjPT0wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8qIGRlcmluZyovCi0gICAgICAgICAgICAgICAgICAgIH0gLypib3VuZGFyeSBjb25kaXRpb24qLwotICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuIDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAKaW5kZXggNjQ5OTIzMy4uNzJjYmU4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb21iaW5lZF9kZWNvZGUuY3BwCkBAIC01NDQsMzAgKzU0NCwxMiBAQAogICAgIGludDE2IERDX2NvZWZmOwogICAgIFBWX1NUQVRVUyBzdGF0dXM7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIC8qIHBvc3QtcHJvY2Vzc2luZyAqLwotICAgIHVpbnQ4ICpwcF9tb2RbNl07Ci0gICAgaW50IFRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7Ci0gICAgaW50IE1CX2luX3dpZHRoID0gdmlkZW8tPm5NQlBlclJvdzsKLSNlbmRpZgogICAgIGludCB5X3BvcyA9IHZpZGVvLT5tYm51bV9yb3c7CiAgICAgaW50IHhfcG9zID0gdmlkZW8tPm1ibnVtX2NvbDsKICAgICBpbnQzMiBvZmZzZXQgPSAoaW50MzIpKHlfcG9zIDw8IDQpICogd2lkdGggKyAoeF9wb3MgPDwgNCk7CiAKICAgICAvKiBEZWNvZGUgZWFjaCA4LWJ5LTggYmxvY2tzLiBjb21wIDAgfiAzIGFyZSBsdW1pbmFuY2UgYmxvY2tzLCA0IH4gNSAqLwogICAgIC8qICBhcmUgY2hyb21pbmFuY2UgYmxvY2tzLiAgIDA0LzAzLzIwMDAuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgewotICAgICAgICAvKiogcG9zdC1wcm9jZXNzaW5nICoqKi8KLSAgICAgICAgcHBfbW9kWzBdID0gdmlkZW8tPnBzdHByY1R5cEN1ciArICh5X3BvcyA8PCAxKSAqIChNQl9pbl93aWR0aCA8PCAxKSArICh4X3BvcyA8PCAxKTsKLSAgICAgICAgcHBfbW9kWzFdID0gcHBfbW9kWzBdICsgMTsKLSAgICAgICAgcHBfbW9kWzJdID0gcHBfbW9kWzBdICsgKE1CX2luX3dpZHRoIDw8IDEpOwotICAgICAgICBwcF9tb2RbM10gPSBwcF9tb2RbMl0gKyAxOwotICAgICAgICBwcF9tb2RbNF0gPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKFRvdGFsTUIgPDwgMikgKyBtYm51bTsKLSAgICAgICAgcHBfbW9kWzVdID0gcHBfbW9kWzRdICsgVG90YWxNQjsKLSAgICB9Ci0jZW5kaWYKIAogICAgIC8qICBvc2NsX21lbXNldChtYmxvY2stPmJsb2NrLCAwLCBzaXplb2YodHlwZU1CU3RvcmUpKTsgICAgQXVnIDksMjAwNSAqLwogCkBAIC02NDUsMTAgKzYyNyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBub19jb2VmZltjb21wXSA9IG5jb2VmZnNbY29tcF07CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9ICh1aW50OCkgUG9zdFByb2NTZW1hcGhvcmUoZGF0YUJsb2NrKTsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIE1CbG9ja0lEQ1QodmlkZW8pOwogICAgIH0KQEAgLTY3NywyMCArNjU1LDYgQEAKICAgICAgICAgICAgICAgICBCbG9ja0lEQ1QoY19jb21wICsgKGNvbXAmMikqKHdpZHRoIDw8IDIpICsgOCooY29tcCYxKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgKGNvbXAmMikqNjQgKyA4Kihjb21wJjEpLCBtYmxvY2stPmJsb2NrW2NvbXBdLCB3aWR0aCwgbmNvZWZmc1tjb21wXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sIG1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSgobmNvZWZmc1tjb21wXSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwotICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gMDsKLSNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTcwNywyMCArNjcxLDYgQEAKICAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNTYsIG1ibG9jay0+YmxvY2tbNF0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNF0sIG1ibG9jay0+Yml0bWFwcm93WzRdKTsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzRdID0gKHVpbnQ4KSgobmNvZWZmc1s0XSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNF0gPSAwOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgKCpEQylbNV0gPSBtaWRfZ3JheTsKICAgICAgICAgaWYgKENCUCAmIDEpCkBAIC03MzEsMjAgKzY4MSw2IEBACiAgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjY0LCBtYmxvY2stPmJsb2NrWzVdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzVdLAogICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCBtYmxvY2stPmJpdG1hcHJvd1s1XSk7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzVdID0gMDsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIHZpZGVvLT5RUE1CW21ibnVtXSA9IFFQOyAgLyogcmVzdG9yZSB0aGUgUVAgdmFsdWVzICBBTk5FWF9UKi8KICNlbHNlCkBAIC03NTksMjAgKzY5NSw2IEBACiAgICAgICAgICAgICAgICAgQmxvY2tJRENUKGNfY29tcCArIChjb21wJjIpKih3aWR0aCA8PCAyKSArIDgqKGNvbXAmMSksIG1ibG9jay0+cHJlZF9ibG9jayArIChjb21wJjIpKjY0ICsgOCooY29tcCYxKSwgbWJsb2NrLT5ibG9ja1tjb21wXSwgd2lkdGgsIG5jb2VmZnNbY29tcF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCBtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9ICh1aW50OCkoKG5jb2VmZnNbY29tcF0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KLSAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9IDA7Ci0jZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03ODUsMjAgKzcwNywxMSBAQAogICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI1NiwgbWJsb2NrLT5ibG9ja1s0XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s0XSwKICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgbWJsb2NrLT5iaXRtYXByb3dbNF0pOwogCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNF0gPSAodWludDgpKChuY29lZmZzWzRdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs0XSA9IDA7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OwogICAgICAgICBpZiAoQ0JQICYgMSkKQEAgLTgwOSwyMCArNzIyLDExIEBACiAgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjY0LCBtYmxvY2stPmJsb2NrWzVdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzVdLAogICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCBtYmxvY2stPmJpdG1hcHJvd1s1XSk7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwogICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzVdID0gMDsKLSNlbmRpZgogI2VuZGlmICAvLyBQVl9BTk5FWF9JSktUX1NVUFBPUlQKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kYXRhcGFydF9kZWNvZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcAppbmRleCAwMGRiMDRiLi42MDcxZjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kYXRhcGFydF9kZWNvZGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAKQEAgLTYzNSwyOSArNjM1LDkgQEAKICAgICBpbnQgUVBfdG1wID0gUVA7CiAKICAgICBpbnQgeV9wb3MgPSB2aWRlby0+bWJudW1fcm93OwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgdWludDggKnBwX21vZFs2XTsKLSAgICBpbnQgVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgTUJfaW5fd2lkdGggPSB2aWRlby0+bk1CUGVyUm93OwotI2VuZGlmCiAKIAogCi0gICAgLyoqKioqCi0gICAgKiAgICAgRGVjb2Rpbmcgb2YgdGhlIDYgYmxvY2tzIChkZXBlbmRpbmcgb24gdHJhbnNwYXJlbnQgcGF0dGVybikKLSAgICAqKioqKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgIHsKLSAgICAgICAgLyoqIHBvc3QtcHJvY2Vzc2luZyAqKiovCi0gICAgICAgIHBwX21vZFswXSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyAoeV9wb3MgPDwgMSkgKiAoTUJfaW5fd2lkdGggPDwgMSkgKyAoeF9wb3MgPDwgMSk7Ci0gICAgICAgIHBwX21vZFsxXSA9IHBwX21vZFswXSArIDE7Ci0gICAgICAgIHBwX21vZFsyXSA9IHBwX21vZFswXSArIChNQl9pbl93aWR0aCA8PCAxKTsKLSAgICAgICAgcHBfbW9kWzNdID0gcHBfbW9kWzJdICsgMTsKLSAgICAgICAgcHBfbW9kWzRdID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChUb3RhbE1CIDw8IDIpICsgbWJudW07Ci0gICAgICAgIHBwX21vZFs1XSA9IHBwX21vZFs0XSArIFRvdGFsTUI7Ci0gICAgfQotI2VuZGlmCiAKICAgICAvKiAgb3NjbF9tZW1zZXQobWJsb2NrLT5ibG9jaywgMCwgc2l6ZW9mKHR5cGVNQlN0b3JlKSk7ICAgIEF1ZyA5LDIwMDUgKi8KIApAQCAtNjk4LDEwICs2NzgsNiBAQAogICAgICAgICAgICAgLyogIG1vZGlmaWVkIHRvIG5ldyBzZW1hcGhvcmUgZm9yIHBvc3QtcHJvYyAqLwogICAgICAgICAgICAgLy8gRnV0dXJlIHdvcms6OiBjYW4gYmUgY29tYmluZWQgaW4gdGhlIGRlcXVhbnQgZnVuY3Rpb24KICAgICAgICAgICAgIC8vIEB0b2RvIERlYmxvY2tpbmcgU2VtYXBob3JlIGZvciBJTlRSQSBibG9jawotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSBQb3N0UHJvY1NlbWFwaG9yZShkYXRhQmxvY2spOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgTUJsb2NrSURDVCh2aWRlbyk7CiAgICAgfQpAQCAtNzM4LDEwICs3MTQsNiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiAgQHRvZG8gRGVibG9ja2luZyBTZW1hcGhvcmUgZm9yIElOVFJBIGJsb2NrLCBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSgobmNvZWZmc1tjb21wXSA+IDMpID8gNCA6IDApOwotI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICAoKkRDKVs0XSA9IG1pZF9ncmF5OwpAQCAtNzYwLDEwICs3MzIsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBuY29lZmZzWzRdID0gMDsKICAgICAgICAgfQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgKnBwX21vZFs0XSA9ICh1aW50OCkoKG5jb2VmZnNbNF0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OwogICAgICAgICBpZiAoQ0JQICYgMSkKICAgICAgICAgewpAQCAtNzgwLDEwICs3NDgsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBuY29lZmZzWzVdID0gMDsKICAgICAgICAgfQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfY2hyb21hLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3NzliMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfY2hyb21hLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0KLXZvaWQgRGVyaW5naW5nX0Nocm9tYSgKLSAgICB1aW50OCAqUmVjX0MsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCwKLSAgICB1aW50OCAqcHBfbW9kCi0pCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCB0aHJlczsKLSAgICBpbnQgdl9ibGssIGhfYmxrOwotICAgIGludCBtYXhfZGlmZjsKLSAgICBpbnQgdl9wZWwsIGhfcGVsOwotICAgIGludCBtYXhfYmxrLCBtaW5fYmxrOwotICAgIGludCB2MCwgaDA7Ci0gICAgdWludDggKnB0cjsKLSAgICBpbnQgc3VtLCBzdW0xLCBpbmNyOwotICAgIGludDMyIGFkZHJfdjsKLSAgICBpbnQgc2lnbl92WzEwXSwgc3VtX3ZbMTBdOwotICAgIGludCAqcHRyMiwgKnB0cjM7Ci0gICAgdWludDggcGVsdSwgcGVsYywgcGVsbDsKLSAgICBpbmNyID0gd2lkdGggLSBCTEtTSVpFOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBjaHJvbWluYW5jZSAqLwotICAgIC8qIERvIHRoZSBmaXJzdCBsaW5lICg3IHBpeGVscyBhdCBhIHRpbWUgPT4gRG9uJ3QgdXNlIE1NWCkqLwotICAgIGZvciAoaF9ibGsgPSAwOyBoX2JsayA8IHdpZHRoOyBoX2JsayArPSBCTEtTSVpFKQotICAgIHsKLSAgICAgICAgbWF4X2RpZmYgPSAoUVBfc3RvcmVbaF9ibGs+PjNdID4+IDIpICsgNDsKLSAgICAgICAgcHRyID0gJlJlY19DW2hfYmxrXTsKLSAgICAgICAgbWF4X2JsayA9IG1pbl9ibGsgPSAqcHRyOwotICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCB3aWR0aCk7Ci0gICAgICAgIGgwID0gKChoX2JsayAtIDEpID49IDEpID8gKGhfYmxrIC0gMSkgOiAxOwotCi0gICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLQotICAgICAgICAgICAgZm9yICh2X3BlbCA9IDE7IHZfcGVsIDwgQkxLU0laRSAtIDE7IHZfcGVsKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkcl92ID0gKGludDMyKXZfcGVsICogd2lkdGg7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DW2FkZHJfdiArIGgwIC0gMV07Ci0gICAgICAgICAgICAgICAgcHRyMiA9ICZzdW1fdlswXTsKLSAgICAgICAgICAgICAgICBwdHIzID0gJnNpZ25fdlswXTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaF9wZWwgPSBoMDsgaF9wZWwgPCBoX2JsayArIEJMS1NJWkUgLSAxOyBoX3BlbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVsdSA9ICoocHRyIC0gd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICpwdHIyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgICAgICAgICAgICAgKnB0cjMgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3VtMSA9ICoocHRyMyAtIDIpICsgKihwdHIzIC0gMSkgKyAqcHRyMzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICgqKHB0cjIgLSAyKSArICgqKHB0cjIgLSAxKSA8PCAxKSArICpwdHIyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHRyLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUFZfQUJTKCpwdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSA+ICpwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgLSBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9ICh1aW50OCkgc3VtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICAgICBwdHIyKys7Ci0gICAgICAgICAgICAgICAgICAgIHB0cjMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHZfYmxrID0gQkxLU0laRTsgdl9ibGsgPCBoZWlnaHQ7IHZfYmxrICs9IEJMS1NJWkUpCi0gICAgewotICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgLyogRG8gdGhlIGZpcnN0IGJsb2NrIChwaXhlbHM9NyA9PiBObyBNTVgpICovCi0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMil2X2Jsayp3aWR0aCk+PjMpKT4+M10gPj4gMikgKyA0OwotICAgICAgICBwdHIgPSAmUmVjX0NbKGludDMyKXZfYmxrICogd2lkdGhdOwotICAgICAgICBtYXhfYmxrID0gbWluX2JsayA9ICpwdHI7Ci0gICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGZvciAodl9wZWwgPSB2MDsgdl9wZWwgPCB2X2JsayArIEJMS1NJWkUgLSAxOyB2X3BlbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZHJfdiA9IHZfcGVsICogd2lkdGg7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DW2FkZHJfdl07Ci0gICAgICAgICAgICAgICAgcHRyMiA9ICZzdW1fdlswXTsKLSAgICAgICAgICAgICAgICBwdHIzID0gJnNpZ25fdlswXTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaF9wZWwgPSAxOyBoX3BlbCA8IEJMS1NJWkUgLSAxOyBoX3BlbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVsdSA9ICoocHRyIC0gd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICpwdHIyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgICAgICAgICAgICAgKnB0cjMgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3VtMSA9ICoocHRyMyAtIDIpICsgKihwdHIzIC0gMSkgKyAqcHRyMzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICgqKHB0cjIgLSAyKSArICgqKHB0cjIgLSAxKSA8PCAxKSArICpwdHIyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHRyLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUFZfQUJTKCpwdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSA+ICpwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgLSBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9ICh1aW50OCkgc3VtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICAgICBwdHIyKys7Ci0gICAgICAgICAgICAgICAgICAgIHB0cjMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIERvIHRoZSByZXN0IGluIE1NWCAqLwotICAgICAgICBmb3IgKGhfYmxrID0gQkxLU0laRTsgaF9ibGsgPCB3aWR0aDsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChwcF9tb2RbKHZfYmxrLzgpKih3aWR0aC84KStoX2Jsay84XSYweDQpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4X2RpZmYgPSAoUVBfc3RvcmVbKCgoKGludDMyKXZfYmxrKndpZHRoKT4+MykraF9ibGspPj4zXSA+PiAyKSArIDQ7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DWyhpbnQzMil2X2JsayAqIHdpZHRoICsgaF9ibGtdOwotICAgICAgICAgICAgICAgIG1heF9ibGsgPSBtaW5fYmxrID0gKnB0cjsKLSAgICAgICAgICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLSAgICAgICAgICAgICAgICBoMCA9IGhfYmxrIC0gMTsKLQotICAgICAgICAgICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotI2lmZGVmIE5vTU1YCi0gICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKFJlY19DLCB2MCwgaDAsIHZfYmxrLCBoX2JsaywgdGhyZXMsIHdpZHRoLCBtYXhfZGlmZik7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWCgmUmVjX0NbKGludDMyKXYwKndpZHRoK2gwXSwgd2lkdGgsIHRocmVzLCBtYXhfZGlmZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlcmluZ2luZ19sdW1hLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlcmluZ2luZ19sdW1hLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NzRiNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfbHVtYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi12b2lkIERlcmluZ2luZ19MdW1hKAotICAgIHVpbnQ4ICpSZWNfWSwKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50LAotICAgIHVpbnQ4ICpwcF9tb2QpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCB0aHJlc1s0XSwgcmFuZ2VbNF0sIG1heF9yYW5nZV9ibGssIG1heF90aHJlc19ibGs7Ci0gICAgaW50IE1CX1YsIE1CX0gsIEJMS19WLCBCTEtfSDsKLSAgICBpbnQgdl9ibGssIGhfYmxrOwotICAgIGludCBtYXhfZGlmZjsKLSAgICBpbnQgbWF4X2JsaywgbWluX2JsazsKLSAgICBpbnQgdjAsIGgwOwotICAgIHVpbnQ4ICpwdHI7Ci0gICAgaW50IHRociwgYmxrcywgaW5jcjsKLSAgICBpbnQgbWJfaW5keCwgYmxrX2luZHg7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGluY3IgPSB3aWR0aCAtIEJMS1NJWkU7Ci0KLSAgICAvKiBEZXJpbmcgdGhlIGZpcnN0IGxpbmUgb2YgbWFjcm8gYmxvY2tzICovCi0gICAgZm9yIChNQl9IID0gMDsgTUJfSCA8IHdpZHRoOyBNQl9IICs9IE1CU0laRSkKLSAgICB7Ci0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWyhNQl9IKT4+NF0gPj4gMikgKyA0OwotCi0gICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgYmxrcyA9IDA7Ci0KLSAgICAgICAgZm9yIChCTEtfViA9IDA7IEJMS19WIDwgTUJTSVpFOyBCTEtfViArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEJMS19IID0gMDsgQkxLX0ggPCBNQlNJWkU7IEJMS19IICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19ZWyhpbnQzMikoQkxLX1YpICogd2lkdGggKyBNQl9IICsgQkxLX0hdOwotICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgIHJhbmdlW2Jsa3NdID0gbWF4X2JsayAtIG1pbl9ibGs7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc10gPj0gbWF4X3JhbmdlX2JsaykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1heF9yYW5nZV9ibGsgPSByYW5nZVtibGtzXTsKLSAgICAgICAgICAgICAgICAgICAgbWF4X3RocmVzX2JsayA9IHRocmVzW2Jsa3NdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBibGtzID0gMDsKLSAgICAgICAgZm9yICh2X2JsayA9IDA7IHZfYmxrIDwgTUJTSVpFOyB2X2JsayArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICB2MCA9ICgodl9ibGsgLSAxKSA+PSAxKSA/ICh2X2JsayAtIDEpIDogMTsKLSAgICAgICAgICAgIGZvciAoaF9ibGsgPSBNQl9IOyBoX2JsayA8IE1CX0ggKyBNQlNJWkU7IGhfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaDAgPSAoKGhfYmxrIC0gMSkgPj0gMSkgPyAoaF9ibGsgLSAxKSA6IDE7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZmxhdCByZWdpb24gYWRqYWNlbnQgdG8gbm9uLWZsYXQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdPDMyICYmIG1heF9yYW5nZV9ibGsgPj0gNjQpCi0gICAgICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gbWF4X3RocmVzX2JsazsKLQotICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgKGJsb2NraW5lc3MgYW5ub3lpbmcgYXQgREMgZG9taW5hbnQgcmVnaW9uKSAqLwotICAgICAgICAgICAgICAgIGlmIChtYXhfcmFuZ2VfYmxrID49IDE2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc21vb3RoaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHRociA9IHRocmVzW2Jsa3NdOwotCi0gICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKFJlY19ZLCB2MCwgaDAsIHZfYmxrLCBoX2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyLCB3aWR0aCwgbWF4X2RpZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9IC8qIGJsb2NrIGxldmVsIChMdW1pbmFuY2UpICovCi0gICAgICAgIH0KLSAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLQotCi0gICAgLyogRG8gdGhlIHJlc3Qgb2YgdGhlIG1hY3JvLWJsb2NrLWxpbmVzICovCi0gICAgZm9yIChNQl9WID0gTUJTSVpFOyBNQl9WIDwgaGVpZ2h0OyBNQl9WICs9IE1CU0laRSkKLSAgICB7Ci0gICAgICAgIC8qIEZpcnN0IG1hY3JvLWJsb2NrICovCi0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMilNQl9WKndpZHRoKT4+NCkpPj40XSA+PiAyKSArIDQ7Ci0gICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgYmxrcyA9IDA7Ci0gICAgICAgIGZvciAoQkxLX1YgPSAwOyBCTEtfViA8IE1CU0laRTsgQkxLX1YgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChCTEtfSCA9IDA7IEJMS19IIDwgTUJTSVpFOyBCTEtfSCArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfWVsoaW50MzIpKE1CX1YgKyBCTEtfVikgKiB3aWR0aCArIEJMS19IXTsKLSAgICAgICAgICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLSAgICAgICAgICAgICAgICB0aHJlc1tibGtzXSA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0gICAgICAgICAgICAgICAgcmFuZ2VbYmxrc10gPSBtYXhfYmxrIC0gbWluX2JsazsKLQotICAgICAgICAgICAgICAgIGlmIChyYW5nZVtibGtzXSA+PSBtYXhfcmFuZ2VfYmxrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4X3JhbmdlX2JsayA9IHJhbmdlW2Jsa3NdOwotICAgICAgICAgICAgICAgICAgICBtYXhfdGhyZXNfYmxrID0gdGhyZXNbYmxrc107Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJsa3MgPSAwOwotICAgICAgICBmb3IgKHZfYmxrID0gTUJfVjsgdl9ibGsgPCBNQl9WICsgTUJTSVpFOyB2X2JsayArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgICAgIGZvciAoaF9ibGsgPSAwOyBoX2JsayA8IE1CU0laRTsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoMCA9ICgoaF9ibGsgLSAxKSA+PSAxKSA/IChoX2JsayAtIDEpIDogMTsKLQotICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBmbGF0IHJlZ2lvbiBhZGphY2VudCB0byBub24tZmxhdCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc108MzIgJiYgbWF4X3JhbmdlX2JsayA+PSA2NCkKLSAgICAgICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSBtYXhfdGhyZXNfYmxrOwotCi0gICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAoYmxvY2tpbmVzcyBhbm5veWluZyBhdCBEQyBkb21pbmFudCByZWdpb24pICovCi0gICAgICAgICAgICAgICAgaWYgKG1heF9yYW5nZV9ibGsgPj0gMTYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdGl2ZSBzbW9vdGhpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgdGhyID0gdGhyZXNbYmxrc107Ci0KLSAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgoUmVjX1ksIHYwLCBoMCwgdl9ibGssIGhfYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHIsIHdpZHRoLCBtYXhfZGlmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKiBibG9jayBsZXZlbCAoTHVtaW5hbmNlKSAqLwotCi0gICAgICAgIC8qIFJlc3Qgb2YgdGhlIG1hY3JvLWJsb2NrcyAqLwotICAgICAgICBmb3IgKE1CX0ggPSBNQlNJWkU7IE1CX0ggPCB3aWR0aDsgTUJfSCArPSBNQlNJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMilNQl9WKndpZHRoKT4+NCkrTUJfSCk+PjRdID4+IDIpICsgNDsKLQotICAgICAgICAgICAgLyogdGhyZXNob2xkIGRldGVybWluYXRpb24gKi8KLSAgICAgICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgICAgIGJsa3MgPSAwOwotCi0gICAgICAgICAgICBtYl9pbmR4ID0gKE1CX1YgLyA4KSAqICh3aWR0aCAvIDgpICsgTUJfSCAvIDg7Ci0gICAgICAgICAgICBmb3IgKEJMS19WID0gMDsgQkxLX1YgPCBNQlNJWkU7IEJMS19WICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChCTEtfSCA9IDA7IEJMS19IIDwgTUJTSVpFOyBCTEtfSCArPSBCTEtTSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmxrX2luZHggPSBtYl9pbmR4ICsgKEJMS19WIC8gOCkgKiB3aWR0aCAvIDggKyBCTEtfSCAvIDg7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBiYXNlZCBvbiBwcF9tb2Qgb25seSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBwX21vZFtibGtfaW5keF0mMHg0KSAhPSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAmUmVjX1lbKGludDMyKShNQl9WICsgQkxLX1YpICogd2lkdGggKyBNQl9IICsgQkxLX0hdOwotICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJlc1tibGtzXSA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZVtibGtzXSA9IG1heF9ibGsgLSBtaW5fYmxrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc10gPj0gbWF4X3JhbmdlX2JsaykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcmFuZ2VfYmxrID0gcmFuZ2VbYmxrc107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RocmVzX2JsayA9IHRocmVzW2Jsa3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJsa3MgPSAwOwotICAgICAgICAgICAgZm9yICh2X2JsayA9IE1CX1Y7IHZfYmxrIDwgTUJfViArIE1CU0laRTsgdl9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgICAgICAgICBtYl9pbmR4ID0gKHZfYmxrIC8gOCkgKiAod2lkdGggLyA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGhfYmxrID0gTUJfSDsgaF9ibGsgPCBNQl9IICsgTUJTSVpFOyBoX2JsayArPSBCTEtTSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaDAgPSBoX2JsayAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGJsa19pbmR4ID0gbWJfaW5keCArIGhfYmxrIC8gODsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcF9tb2RbYmxrX2luZHhdJjB4NCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGZsYXQgcmVnaW9uIGFkamFjZW50IHRvIG5vbi1mbGF0IHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdPDMyICYmIG1heF9yYW5nZV9ibGsgPj0gNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSBtYXhfdGhyZXNfYmxrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZGVibG9ja2luZwotICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NraW5lc3MgYW5ub3lpbmcgYXQgREMgZG9taW5hbnQgcmVnaW9uKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heF9yYW5nZV9ibGsgPj0gMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc21vb3RoaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyID0gdGhyZXNbYmxrc107Ci0jaWZkZWYgTm9NTVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGl2ZVNtb290aF9Ob01NWChSZWNfWSwgdjAsIGgwLCB2X2JsaywgaF9ibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyLCB3aWR0aCwgbWF4X2RpZmYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWCgmUmVjX1lbdjAqd2lkdGgraDBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCB0aHIsIG1heF9kaWZmKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8qIGJsb2NrIGxldmVsIChMdW1pbmFuY2UpICovCi0gICAgICAgIH0gLyogbWFjcm9ibG9jayBsZXZlbCAqLwotICAgIH0gLyogbWFjcm9ibG9jayBsZXZlbCAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZmluZF9taW5fbWF4LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzg4YTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZmluZF9taW5fbWF4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBpbnB1dF9wdHIgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB2YWx1ZXMgb2YgdHlwZSBVQ2hhcgotICAgICAgICAgICAgaW4gYSAyRCBibG9jayBvZiBkYXRhLgotICAgIG1pbl9wdHIgPSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHR5cGUgSW50IHRvIGJlIGZvdW5kIGluIGEKLSAgICAgICAgICBzcXVhcmUgYmxvY2sgb2Ygc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotICAgIG1heF9wdHIgPSBwb2ludGVyIHRvIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHR5cGUgSW50IHRvIGJlIGZvdW5kIGluIGEKLSAgICAgICAgICBzcXVhcmUgYmxvY2sgb2Ygc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotICAgIGluY3IgPSB2YWx1ZSBvZiB0eXBlIEludCByZXByZXNlbnRpbmcgdGhlIHdpZHRoIG9mIDJEIGJsb2NrIG9mIGRhdGEuCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIG1pbl9wdHIgcG9pbnRzIHRvIHRoZSBmb3VuZCBtaW5pbXVtIHZhbHVlIGluIHRoZSBzcXVhcmUgYmxvY2sgb2YKLSAgICBzaXplIEJMS1NJWkUgY29udGFpbmVkIGluIDJEIGJsb2NrIG9mIGRhdGEuCi0KLSAgICBtYXhfcHRyIHBvaW50cyB0byB0aGUgZm91bmQgbWF4aW11bSB2YWx1ZSBpbiB0aGUgc3F1YXJlIGJsb2NrIG9mCi0gICAgc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbWF4aW11bSBhbmQgdGhlIG1pbmltdW0gdmFsdWVzIGluIGEgc3F1YXJlIGJsb2NrIG9mCi0gZGF0YSBvZiBzaXplIEJMS1NJWkUgKiBCTEtTSVpFLiBUaGUgZGF0YSBpcyBjb250YWluZWQgaW4gdGhlIGJ1ZmZlciB3aGljaAotIHJlcHJlc2VudHMgYSAyRCBibG9jayBvZiBkYXRhIHRoYXQgaXMgbGFyZ2VyIHRoYW4gQkxLU0laRSAqIEJMS1NJWkUuCi0gVGhpcyBpcyBpbGx1c3RyYXRlZCBiZWxvdy4KLQotICAgIG1lbSBsb2MgeCArIDAwaCAtPiBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgMTBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyAyMGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDMwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgNDBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA1MGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDYwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgNzBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA4MGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDkwaCAtPiBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgQTBoIC0+IG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8KLSAgICBtZW0gbG9jIHggKyBCMGggLT4gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbwotCi1Gb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzLCB0aGUgZGlhZ3JhbSBhc3N1bWVzIHRoYXQgQkxLU0laRSBpcyBlcXVhbCB0byA4Ci1idXQgdGhpcyBpcyBub3QgYSByZXF1aXJlbWVudC4gSW4gdGhpcyBkaWFncmFtLCB0aGUgYnVmZmVyIHN0YXJ0cyBhdAotbG9jYXRpb24geCBidXQgdGhlIGlucHV0IHBvaW50ZXIsIGlucHV0X3B0ciwgcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbgotd291bGQgYmUgdGhlIGZpcnN0IHJvdyBvZiBkYXRhIHRvIGJlIHNlYXJjaGVkIHdoaWNoIGlzIGF0IHggKyAxNWguIFRoZQotdmFsdWUgb2YgaW5jciBwYXNzZWQgb250byB0aGlzIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGFtb3VudCB0aGUgaW5wdXRfcHRyCi1uZWVkcyB0byBiZSBpbmNyZW1lbnRlZCB0byBwb2ludCB0byB0aGUgbmV4dCByb3cgb2YgZGF0YS4KLQotVGhpcyBmdW5jdGlvbiBjb21wYXJlcyBlYWNoIHZhbHVlIGluIGEgcm93IHRvIHRoZSBjdXJyZW50IG1heGltdW0gYW5kCi1taW5pbXVtLiBBZnRlciBlYWNoIHJvdywgaW5wdXRfcHRyIGlzIGluY3JlbWVudGVkIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJvdy4KLVRoaXMgaXMgcmVwZWF0ZWQgdW50aWwgYWxsIHJvd3MgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gV2hlbiB0aGUgc2VhcmNoIGlzCi1jb21wbGV0ZSB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBtaW5fcHRyIGNvbnRhaW5zIHRoZSBtaW5pbXVtIHZhbHVlCi1mb3VuZCBhbmQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgbWF4X3B0ciBjb250YWlucyB0aGUgbWF4aW11bSB2YWx1ZSBmb3VuZC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkICBGaW5kTWF4TWluKAotICAgIHVpbnQ4ICppbnB1dF9wdHIsCi0gICAgaW50ICptaW5fcHRyLAotICAgIGludCAqbWF4X3B0ciwKLSAgICBpbnQgaW5jcikKLXsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdWludCAgICBpLCBqOwotICAgIGludCBtaW4sIG1heDsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgbWF4ID0gbWluID0gKmlucHV0X3B0cjsKLSAgICAvKiAgaW5jciA9IGluY3IgLSBCTEtTSVpFOyAqLyAgIC8qICAwOS8wNi8yMDAxLCBhbHJlYWR5IHBhc3NlZCBpbiBhcyB3aWR0aCAtIEJMS1NJWkUgKi8KLQotICAgIGZvciAoaSA9IEJMS1NJWkU7IGkgPiAwOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBCTEtTSVpFOyBqID4gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKmlucHV0X3B0ciA+IG1heCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXggPSAqaW5wdXRfcHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKmlucHV0X3B0ciA8IG1pbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW4gPSAqaW5wdXRfcHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXRfcHRyICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXQgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdyovCi0gICAgICAgIGlucHV0X3B0ciArPSBpbmNyOwotICAgIH0KLQotICAgICptYXhfcHRyID0gbWF4OwotICAgICptaW5fcHRyID0gbWluOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcAppbmRleCBmMzVjZTRmLi4wYmE0OTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwCkBAIC05NCw2ICs5NCw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3cyKGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1OwpAQCAtMTgyLDYgKzE4Myw3IEBACiAgICAgcmV0dXJuIDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93MyhpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CkBAIC0yOTEsNiArMjkzLDcgQEAKIH0KIAogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3c0KGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTM2OCw2ICszNzEsNyBAQAogICAgIHJldHVybiA7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdGNvbDQoaW50MTYgKmJsaykKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtNDQ1LDYgKzQ0OSw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3cyX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1LCB0ZW1wOwpAQCAtNTAyLDYgKzUwNyw3IEBACiAgICAgcmV0dXJuIDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93M19pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoKQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHRlbXA7CkBAIC01NzUsNiArNTgxLDcgQEAKICAgICByZXR1cm4gOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3c0X2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcAppbmRleCA4Nzc3MjNkLi43OTc2MGY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl9tb3Rpb25fY29tcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwCkBAIC0xNTQsMTQgKzE1NCw2IEBACiAgICAgaW50IHhwcmVkLCB5cHJlZDsKICAgICBpbnQgeHN1bTsKICAgICBpbnQgcm91bmQxOwotI2lmZGVmIFBWX1BPU1RQUk9DX09OIC8vIDIvMTQvMjAwMSAgICAgIAotICAgIC8qIFRvdGFsIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlIFZPTCAqLwotICAgIGludDMyIHNpemUgPSAoaW50MzIpIHZpZGVvLT5uVG90YWxNQiA8PCA4OwotICAgIHVpbnQ4ICpwcF9kZWNfeSwgKnBwX2RlY191OwotICAgIGludCBsbFs0XTsKLSAgICBpbnQgdG1wID0gMDsKLSAgICB1aW50OCBtc2tfZGVibG9jayA9IDA7Ci0jZW5kaWYKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNDA0LDQzICszOTYsNiBAQAogICAgIC8qIENhbGwgZnVuY3Rpb24gdG8gc2V0IGRlLWJsb2NraW5nIGFuZCBkZS1yaW5naW5nICovCiAgICAgLyogICBzZW1hcGhvcmVzIGZvciBsdW1pbmFuY2UgICAgICAgICAgICAgICAgICAgICAgKi8KIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgewotICAgICAgICBpZiAobW9kZSZJTlRFUl8xVk1BU0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBwX2RlY195ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIGltdjsKLSAgICAgICAgICAgIGxsWzBdID0gMTsKLSAgICAgICAgICAgIGxsWzFdID0gbXZ3aWR0aCAtIDE7Ci0gICAgICAgICAgICBsbFsyXSA9IDE7Ci0gICAgICAgICAgICBsbFszXSA9IC1tdndpZHRoIC0gMTsKLSAgICAgICAgICAgIG1za19kZWJsb2NrID0gcHBfc2VtYXBob3JlX2x1bWEoeHByZWQsIHlwcmVkLCBwcF9kZWNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnBzdHByY1R5cFBydiwgbGwsICZ0bXAsIHB4WzBdLCBweVswXSwgbXZ3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgICAgIHBwX2RlY191ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAgICAgKChpbXYgKyAoeHBvcyA+PiAzKSkgPj4gMik7Ci0KLSAgICAgICAgICAgIHBwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIoeHByZWQsIHlwcmVkLCBwcF9kZWNfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnBzdHByY1R5cFBydiwgZHgsIGR5LCBtdndpZHRoLCBoZWlnaHQsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCwgbXNrX2RlYmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogUG9zdC1wcm9jZXNzaW5nIG1vZGUgKE1CTV9JTlRFUjgpICovCi0gICAgICAgICAgICAvKiBkZWJsb2NraW5nIGFuZCBkZXJpbmdpbmcpICovCi0gICAgICAgICAgICBwcF9kZWNfeSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyBpbXY7Ci0gICAgICAgICAgICAqcHBfZGVjX3kgPSA0OwotICAgICAgICAgICAgKihwcF9kZWNfeSArIDEpID0gNDsKLSAgICAgICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoKSA9IDQ7Ci0gICAgICAgICAgICAqKHBwX2RlY195ICsgbXZ3aWR0aCArIDEpID0gNDsKLSAgICAgICAgICAgIHBwX2RlY191ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAgICAgKChpbXYgKyAoeHBvcyA+PiAzKSkgPj4gMik7Ci0gICAgICAgICAgICAqcHBfZGVjX3UgPSA0OwotICAgICAgICAgICAgcHBfZGVjX3Vbc2l6ZT4+OF0gPSA0OwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCiAKIAogICAgIC8qIHhwcmVkIGFuZCB5cHJlZCBjYWxjdWxhdGlvbiBmb3IgQ2hyb21pbmFuY2UgaXMgKi8KQEAgLTU2NiwxMyArNTIxLDYgQEAKICAgICBQSVhFTCAqY3ZfY29tcCwgKmN2X3ByZXY7CiAgICAgaW50IHdpZHRoLCB3aWR0aF91djsKICAgICBpbnQzMiBvZmZzZXQ7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04gLy8gMi8xNC8yMDAxICAgICAgCi0gICAgaW50IGltdjsKLSAgICBpbnQzMiBzaXplID0gKGludDMyKSB2aWRlby0+blRvdGFsTUIgPDwgODsKLSAgICB1aW50OCAqcHBfZGVjX3ksICpwcF9kZWNfdTsKLSAgICB1aW50OCAqcHBfcHJldjE7Ci0gICAgaW50IG12d2lkdGggPSB2aWRlby0+bk1CUGVyUm93IDw8IDE7Ci0jZW5kaWYKIAogICAgIHdpZHRoID0gdmlkZW8tPndpZHRoOwogICAgIHdpZHRoX3V2ICA9IHdpZHRoID4+IDE7CkBAIC02MDksMjggKzU1Nyw2IEBACiAgICAgUHV0U0tJUFBFRF9CKGN2X2NvbXAsIGN2X3ByZXYsIHdpZHRoX3V2KTsKIAogICAgIC8qICAxMC8yNC8yMDAwIHBvc3RfcHJvY2Vzc2luZyBzZW1hcGhvcmUgZ2VuZXJhdGlvbiAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OIC8vIDIvMTQvMjAwMQotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgIHsKLSAgICAgICAgaW12ID0gKG9mZnNldCA+PiA2KSAtICh4cG9zID4+IDYpICsgKHhwb3MgPj4gMyk7Ci0gICAgICAgIC8qIFBvc3QtcHJvY2Vzc2luZyBtb2RlIChjb3B5IHByZXZpb3VzIE1CKSAqLwotICAgICAgICBwcF9wcmV2MSA9IHZpZGVvLT5wc3RwcmNUeXBQcnYgKyBpbXY7Ci0gICAgICAgIHBwX2RlY195ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIGltdjsKLSAgICAgICAgKnBwX2RlY195ID0gKnBwX3ByZXYxOwotICAgICAgICAqKHBwX2RlY195ICsgMSkgPSAqKHBwX3ByZXYxICsgMSk7Ci0gICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoKSA9ICoocHBfcHJldjEgKyBtdndpZHRoKTsKLSAgICAgICAgKihwcF9kZWNfeSArIG12d2lkdGggKyAxKSA9ICoocHBfcHJldjEgKyBtdndpZHRoICsgMSk7Ci0KLSAgICAgICAgLyogY2hyb21pbmFuY2UgKi8KLSAgICAgICAgLyo0Kk1CX2luX3dpZHRoKk1CX2luX2hlaWdodCovCi0gICAgICAgIHBwX3ByZXYxID0gdmlkZW8tPnBzdHByY1R5cFBydiArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAoKGltdiArICh4cG9zID4+IDMpKSA+PiAyKTsKLSAgICAgICAgcHBfZGVjX3UgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHNpemUgPj4gNikgKwotICAgICAgICAgICAgICAgICAgICgoaW12ICsgKHhwb3MgPj4gMykpID4+IDIpOwotICAgICAgICAqcHBfZGVjX3UgPSAqcHBfcHJldjE7Ci0gICAgICAgIHBwX2RlY191W3NpemU+PjhdID0gcHBfcHJldjFbc2l6ZT4+OF07Ci0gICAgfQotI2VuZGlmCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oCmluZGV4IDljZDRlZGMuLmNlNmY5YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWNfbGliLmgKQEAgLTE3MCwzNyArMTcwLDYgQEAKIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgIC8qIGRlZmluZWQgaW4gcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICB2b2lkIHBwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIoCi0gICAgICAgIGludCB4cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIGludCB5cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICAgKnBwX2RlY191LCAgLyogaS9vICovCi0gICAgICAgIHVpbnQ4ICAgKnBzdHByY1R5cFBydiwgIC8qIGkgKi8KLSAgICAgICAgaW50IGR4LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgZHksICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAvKiBpICovCi0gICAgICAgIGludCBoZWlnaHQsICAgICAvKiBpICovCi0gICAgICAgIGludDMyICAgc2l6ZSwgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZfbG9jLCAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgIG1za19kZWJsb2NrIC8qIGkgKi8KLSAgICApOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBwcF9zZW1hcGhvcmVfbHVtYS5jICovCi0gICAgdWludDggcHBfc2VtYXBob3JlX2x1bWEoCi0gICAgICAgIGludCB4cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIGludCB5cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICAgKnBwX2RlY195LCAgLyogaS9vICovCi0gICAgICAgIHVpbnQ4ICAgKnBzdHByY1R5cFBydiwgIC8qIGkgKi8KLSAgICAgICAgaW50ICpsbCwgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50ICptdl9sb2MsICAgIC8qIGkvbyAqLwotICAgICAgICBpbnQgZHgsICAgICAvKiBpICovCi0gICAgICAgIGludCBkeSwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12d2lkdGgsICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHdpZHRoLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGhlaWdodCAgICAgIC8qIGkgKi8KLSAgICApOwotI2VuZGlmCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgLyogZGVmaW5lZCBpbiBnZXRfcHJlZF9hZHZfbWJfYWRkLmMgKi8KICAgICBpbnQgR2V0UHJlZEFkdmFuY2VkTUIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAKaW5kZXggYjM2MDUwYy4uMzdhMDNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfZmlsdGVyLmNwcApAQCAtMjQsMTUyICsyNCw2IEBACiBjb25zdCBzdGF0aWMgaW50IFNUUkVOR1RIX3RhYltdID0gezAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTJ9OwogI2VuZGlmCiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBQb3N0RmlsdGVyKAotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8sCi0gICAgaW50IGZpbHRlcl90eXBlLAotICAgIHVpbnQ4ICpvdXRwdXQpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQ4ICpwcF9tb2Q7Ci0gICAgaW50MTYgKlFQX3N0b3JlOwotICAgIGludCBjb21iaW5lZF93aXRoX2RlYmxvY2tfZmlsdGVyOwotICAgIGludCBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgICBpbnQzMiBzaXplOwotICAgIGludCBzb2Z0RGVibG9ja2luZzsKLSAgICB1aW50OCAqZGVjb2RlZEZyYW1lID0gdmlkZW8tPnZpZGVvRGVjQ29udHJvbHMtPm91dHB1dEZyYW1lOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgd2lkdGggPSB2aWRlby0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gdmlkZW8tPmhlaWdodDsKLSAgICBzaXplID0gKGludDMyKXdpZHRoICogaGVpZ2h0OwotCi0gICAgb3NjbF9tZW1jcHkob3V0cHV0LCBkZWNvZGVkRnJhbWUsIHNpemUpOwotICAgIG9zY2xfbWVtY3B5KG91dHB1dCArIHNpemUsIGRlY29kZWRGcmFtZSArIHNpemUsIChzaXplID4+IDIpKTsKLSAgICBvc2NsX21lbWNweShvdXRwdXQgKyBzaXplICsgKHNpemUgPj4gMiksIGRlY29kZWRGcmFtZSArIHNpemUgKyAoc2l6ZSA+PiAyKSwgKHNpemUgPj4gMikpOwotCi0gICAgaWYgKGZpbHRlcl90eXBlID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIFRoZSBzb2Z0RGVjb2RpbmcgY3V0b2ZmIGNvcnJlc3BvbmRzIHRvIH45MzAwMCBicHMgZm9yIFFDSUYgMTVmcHMgY2xpcCAgKi8KLSAgICBpZiAoUFZHZXREZWNCaXRyYXRlKHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzKSA+ICgxMDAqdmlkZW8tPmZyYW1lUmF0ZSooc2l6ZSA+PiAxMikpKSAgLy8gTUNfc29mRGVibG9jawotICAgICAgICBzb2Z0RGVibG9ja2luZyA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgc29mdERlYmxvY2tpbmcgPSBUUlVFOwotCi0gICAgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlciA9IGZpbHRlcl90eXBlICYgUFZfREVCTE9DSzsKLSAgICBRUF9zdG9yZSA9IHZpZGVvLT5RUE1COwotCi0gICAgLyogTHVtYSAqLwotICAgIHBwX21vZCA9IHZpZGVvLT5wc3RwcmNUeXBDdXI7Ci0KLSAgICBpZiAoKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykgJiYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKSkKLSAgICB7Ci0gICAgICAgIENvbWJpbmVkSG9yelZlcnRSaW5nRmlsdGVyKG91dHB1dCwgd2lkdGgsIGhlaWdodCwgUVBfc3RvcmUsIDAsIHBwX21vZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzb2Z0RGVibG9ja2luZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyKG91dHB1dCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXJfTm9Tb2Z0RGVibG9ja2luZyhvdXRwdXQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykKLSAgICAgICAgewotICAgICAgICAgICAgRGVyaW5naW5nX0x1bWEob3V0cHV0LCB3aWR0aCwgaGVpZ2h0LCBRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENocm9tYSAqLwotCi0gICAgcHBfbW9kICs9IChuVG90YWxNQiA8PCAyKTsKLSAgICBvdXRwdXQgKz0gc2l6ZTsKLQotICAgIGlmICgoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKSAmJiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpKQotICAgIHsKLSAgICAgICAgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNvZnREZWJsb2NraW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXJpbmdpbmdfQ2hyb21hKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcF9tb2QgKz0gblRvdGFsTUI7Ci0gICAgb3V0cHV0ICs9IChzaXplID4+IDIpOwotCi0gICAgaWYgKChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spICYmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykpCi0gICAgewotICAgICAgICBDb21iaW5lZEhvcnpWZXJ0UmluZ0ZpbHRlcihvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLCAoaW50KShoZWlnaHQgPj4gMSksIFFQX3N0b3JlLCAoaW50KSAxLCBwcF9tb2QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc29mdERlYmxvY2tpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcihvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyX05vU29mdERlYmxvY2tpbmcob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlcmluZ2luZ19DaHJvbWEob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlciwgcHBfbW9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qICBzd2FwIGN1cnJlbnQgcHBfbW9kIHRvIHByZXZfZnJhbWUgcHBfbW9kICovCi0gICAgcHBfbW9kID0gdmlkZW8tPnBzdHByY1R5cEN1cjsKLSAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gdmlkZW8tPnBzdHByY1R5cFBydjsKLSAgICB2aWRlby0+cHN0cHJjVHlwUHJ2ID0gcHBfbW9kOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgogCiAKICNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvY19zZW1hcGhvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jX3NlbWFwaG9yZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmM2YmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jX3NlbWFwaG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgcV9ibG9jayA9IHBvaW50ZXIgdG8gYnVmZmVyIG9mIGludmVyc2UgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgb2YgdHlwZQotICAgICAgICAgICAgICBpbnQgZm9yIGludHJhLVZPUCBtb2RlIG9yIGJ1ZmZlciBvZiByZXNpZHVhbCBkYXRhIG9mIHR5cGUgaW50Ci0gICAgICAgICAgICAgIGZvciBpbnRlci1WT1AgbW9kZQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBwb3N0bW9kZSA9IHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgd2l0aCB0aGUgdmVydGljYWwgZGVibG9ja2luZywKLSAgICAgICAgICAgICAgIGhvcml6b250YWwgZGVibG9ja2luZywgYW5kIGRlcmluZ2luZyBiaXRzIHNldCB1cCBhY2NvcmRpbmdseQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBwb3N0bW9kZSBzZW1hcGhvcmUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZQotIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHFfYmxvY2suIFRoZSBmdW5jdGlvbiBzdGFydHMgb3V0IHdpdGggdGhlIGFzc3VtcHRpb24KLSB0aGF0IGFsbCBlbnRyaWVzIG9mIHFfYmxvY2ssIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGVudHJ5IChxX2Jsb2NrWzBdKSwgYXJlCi0gemVyby4gVGhpcyBjYXNlIGNhbiBpbmR1Y2UgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYmxvY2tpbmcgYXJ0aWZhY3RzLAotIHRoZXJlZm9yZSwgYm90aCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkZWJsb2NraW5nIGJpdHMgYXJlIGVuYWJsZWQuCi0KLSBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRlc3RlZCB3aGVuIHNldHRpbmcgdXAgdGhlIGhvcml6b250YWwvdmVydGljYWwKLSBkZWJsb2NraW5nIGFuZCBkZXJpbmdpbmcgYml0czoKLSAxLiBXaGVuIG9ubHkgdGhlIGVsZW1lbnRzIG9mIHRoZSB0b3Agcm93IG9mIHRoZSBCX1NJWkUgeCBCX1NJWkUgYmxvY2sKLSAgICAocV9ibG9ja1tuXSwgbiA9IDAsLi4uLCBCX1NJWkUtMSkgYXJlIG5vbi16ZXJvLCB2ZXJ0aWNhbCBibG9ja2luZyBhcnRpZmFjdHMKLSAgICBtYXkgcmVzdWx0LCB0aGVyZWZvcmUsIG9ubHkgdGhlIHZlcnRpY2FsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQuCi0gICAgT3RoZXJ3aXNlLCB0aGUgdmVydGljYWwgZGVibG9ja2luZyBiaXQgaXMgZGlzYWJsZWQuCi0gMi4gV2hlbiBvbmx5IHRoZSBlbGVtZW50cyBvZiB0aGUgZmFyIGxlZnQgY29sdW1uIG9mIHRoZSBCX1NJWkUgeCBCX1NJWkUgYmxvY2sKLSAgICAocV9ibG9ja1tuKkJfU0laRV0sIG4gPSAwLCAuLi4sIEJfU0laRS0xKSBhcmUgbm9uLXplcm8sIGhvcml6b250YWwgYmxvY2tpbmcKLSAgICBhcnRpZmFjdHMgbWF5IHJlc3VsdCwgdGhlcmVmb3JlLCBvbmx5IHRoZSBob3Jpem9udGFsIGRlYmxvY2tpbmcgYml0IGlzCi0gICAgZW5hYmxlZC4gT3RoZXJ3aXNlLCB0aGUgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGJpdCBpcyBkaXNhYmxlZC4KLSAzLiBJZiBhbnkgbm9uLXplcm8gZWxlbWVudHMgZXhpc3QgaW4gcG9zaXRpb25zIG90aGVyIHRoYW4gcV9ibG9ja1swXSwKLSAgICBxX2Jsb2NrWzFdLCBvciBxX2Jsb2NrW0JfU0laRV0sIHRoZSBkZXJpbmdpbmcgYml0IGlzIGVuYWJsZWQuIE90aGVyd2lzZSwKLSAgICBpdCBpcyBkaXNhYmxlZC4KLQotIFRoZSAzIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgcG9zdG1vZGUgZGVmaW5lcyB2ZXJ0aWNhbCBvciBob3Jpem9udGFsCi0gZGVibG9ja2luZyBhbmQgZGVyaW5naW5nLgotCi0gVGhlIHZhbGlkIHZhbHVlcyBhcmUgc2hvd24gYmVsb3c6Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgIHwgRW5hYmxlZCB8IERpc2FibGVkIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCBWZXJ0aWNhbCBEZWJsb2NraW5nIChCaXQgIzApICAgfCAgICAxICAgIHwgICAgIDAgICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8IEhvcml6b250YWwgRGVibG9ja2luZyAoQml0ICMxKSB8ICAgIDEgICAgfCAgICAgMCAgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgRGVyaW5naW5nIChCaXQgIzIpICAgICAgICAgICAgIHwgICAgMSAgICB8ICAgICAwICAgIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBQb3N0UHJvY1NlbWFwaG9yZSgKLSAgICBpbnQxNiAqcV9ibG9jaykKLXsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50IGksIGo7Ci0KLSAgICAvKiBTZXQgZGVmYXVsdCB2YWx1ZSB0byB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGVuYWJsZWQgKi8KLSAgICAvKiBJbml0aWFsIGFzc3VtcHRpb24gaXMgdGhhdCBvbmx5IHFfYmxvY2tbMF0gZWxlbWVudCBpcyBub24temVybywgKi8KLSAgICAvKiB0aGVyZWZvcmUsIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGRlYmxvY2tpbmcgYml0cyBhcmUgc2V0IHRvIDEgKi8KLSAgICBpbnQgcG9zdG1vZGUgPSAweDM7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIFZlcnRpY2FsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQgd2hlbiBvbmx5IHRoZSBlbnRpcmUgdG9wIHJvdyBvZiAgICovCi0gICAgLyogdGhlIEJfU0laRSB4IEJfU0laRSBibG9jaywgaS5lLiwgcV9ibG9ja1tuXSwgbiA9IDAsLi4uLCBCX1NJWkUtMSwgICAgKi8KLSAgICAvKiBhcmUgbm9uLXplcm8uIFNpbmNlIGluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IGFsbCBlbGVtZW50cywgZXhjZXB0ICAqLwotICAgIC8qIHFfYmxvY2tbMF0sIGlzIHplcm8sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGUgICovCi0gICAgLyogdG9wIHJvdyB0byAgZGV0ZXJtaW5lIGlmIGFsbCBvciBzb21lIGFyZSBub24temVyby4gICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAocV9ibG9ja1sxXSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgcV9ibG9ja1swXSBhbmQgcV9ibG9ja1sxXSBhcmUgbm9uLXplcm8sIHdoaWxlICovCi0gICAgICAgIC8qIHFfYmxvY2tbbl0sIG4gPSAyLC4uLiwgQl9TSVpFLTEsIGFyZSB6ZXJvLiBUaGVyZWZvcmUsIHdlICAgICAqLwotICAgICAgICAvKiBuZWVkIHRvIGRpc2FibGUgdmVydGljYWwgZGVibG9ja2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcG9zdG1vZGUgJj0gMHhFOwotICAgIH0KLQotICAgIGZvciAoaSA9IDI7IGkgPCBCX1NJWkU7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChxX2Jsb2NrW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBxX2Jsb2NrW25dLCBuID0gMiwuLi4sIEJfU0laRS0xLCBhcmUgbm9uLXplcm8uKi8KLSAgICAgICAgICAgIC8qIElmIGFueSBvZiB0aGVtIHR1cm4gb3V0IHRvIGJlIG5vbi16ZXJvLCB3ZSBuZWVkIHRvICAgICAqLwotICAgICAgICAgICAgLyogZGlzYWJsZSB2ZXJ0aWNhbCBkZWJsb2NraW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3N0bW9kZSAmPSAweEU7Ci0KLSAgICAgICAgICAgIC8qIERlcmluZ2luZyBpcyBlbmFibGVkIGlmIGFueSBub256ZXJvIGVsZW1lbnRzIGV4aXN0IGluICovCi0gICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgLyogcV9ibG9ja1tCX1NJWkVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBvc3Rtb2RlIHw9IDB4NDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBIb3Jpem9udGFsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQgd2hlbiBvbmx5IHRoZSBlbnRpcmUgZmFyICovCi0gICAgLyogbGVmdCBjb2x1bW4sIGkuZS4sIHFfYmxvY2tbbipCX1NJWkVdLCBuID0gMCwgLi4uLCBCX1NJWkUtMSwgICAqLwotICAgIC8qIGFyZSBub24temVyby4gU2luY2UgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgYWxsIGVsZW1lbnRzLCAgKi8KLSAgICAvKiBleGNlcHQgcV9ibG9ja1swXSwgaXMgemVybywgd2UgbmVlZCB0byBjaGVjayB0aGUgcmVtYWluaW5nICAgICovCi0gICAgLyogZWxlbWVudHMgaW4gdGhlIGZhciBsZWZ0IGNvbHVtbiB0byBkZXRlcm1pbmUgaWYgYWxsIG9yIHNvbWUgICAqLwotICAgIC8qIGFyZSBub24temVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAocV9ibG9ja1tCX1NJWkVdKQotICAgIHsKLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgb25seSBxX2Jsb2NrWzBdIGFuZCBxX2Jsb2NrW0JfU0laRV0gYXJlIG5vbi16ZXJvLCAqLwotICAgICAgICAvKiB3aGlsZSBxX2Jsb2NrW24qQl9TSVpFXSwgbiA9IDIsIDMsLi4uLCBCX1NJWkUtMSwgYXJlIHplcm8uICAgICAgICovCi0gICAgICAgIC8qIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBkaXNhYmxlIGhvcml6b250YWwgZGVibG9ja2luZy4gICAgICAgICAgICAgKi8KLSAgICAgICAgcG9zdG1vZGUgJj0gMHhEOwotICAgIH0KLQotICAgIGZvciAoaSA9IDE2OyBpIDwgTkNPRUZGX0JMT0NLOyBpICs9IEJfU0laRSkKLSAgICB7Ci0gICAgICAgIGlmIChxX2Jsb2NrW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBxX2Jsb2NrW25dLCBuID0gMipCX1NJWkUsLi4uLChCX1NJWkUtMSkqQl9TSVpFLCAgKi8KLSAgICAgICAgICAgIC8qIGFyZSBub24temVyby4gSWYgYW55IG9mIHRoZW0gdHVybiBvdXQgdG8gYmUgbm9uLXplcm8sICAgICAqLwotICAgICAgICAgICAgLyogd2UgbmVlZCB0byBkaXNhYmxlIGhvcml6b250YWwgZGVibG9ja2luZy4gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3N0bW9kZSAmPSAweEQ7Ci0KLSAgICAgICAgICAgIC8qIERlcmluZ2luZyBpcyBlbmFibGVkIGlmIGFueSBub256ZXJvIGVsZW1lbnRzIGV4aXN0IGluICovCi0gICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgLyogcV9ibG9ja1tCX1NJWkVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBvc3Rtb2RlIHw9IDB4NDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBdCB0aGlzIHBvaW50LCBvbmx5IHRoZSBmaXJzdCByb3cgYW5kIGZhciBsZWZ0IGNvbHVtbiBlbGVtZW50cyAqLwotICAgIC8qIGhhdmUgYmVlbiB0ZXN0ZWQuIElmIGRlcmluZ2luZyBiaXQgaXMgc3RpbGwgbm90IHNldCBhdCB0aGlzICAgICovCi0gICAgLyogcG9pbnQsIGNoZWNrIHRoZSByZXN0IG9mIHFfYmxvY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50cyAgKi8KLSAgICAvKiBhcmUgbm9uLXplcm8uIElmIGFsbCBlbGVtZW50cywgYmVzaWRlcyBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdLCAqLwotICAgIC8qIG9yIHFfYmxvY2tbQl9TSVpFXSBhcmUgbm9uLXplcm8sIGRlcmluZ2luZyBiaXQgbXVzdCBiZSBzZXQgICAgICovCi0gICAgaWYgKChwb3N0bW9kZSAmIDB4NCkgPT0gMCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBCX1NJWkU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IEJfU0laRTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChxX2Jsb2NrWyhpPDwzKStqXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHFfYmxvY2tbMF0gYW5kIGFub3RoZXIgcV9ibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50IGFyZSBub24temVybywgdGhlcmVmb3JlLCB3ZSBuZWVkIHRvICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBkZWJsb2NraW5nICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBvc3Rtb2RlICY9IDB4QzsKLQotICAgICAgICAgICAgICAgICAgICAvKiBEZXJpbmdpbmcgaXMgZW5hYmxlZCBpZiBhbnkgbm9uemVybyBlbGVtZW50cyBleGlzdCBpbiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAvKiBxX2Jsb2NrW0JfU0laRV0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwb3N0bW9kZSB8PSAweDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogU2V0IG91dGVyIEZPUiBsb29wIGNvdW50IHRvIEJfU0laRSB0byBnZXQgb3V0IG9mICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG91dGVyIEZPUiBsb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpID0gQl9TSVpFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEdldCBvdXQgb2YgaW5uZXIgRk9SIGxvb3AgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybiAocG9zdG1vZGUpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjAyMjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgeHByZWQgPSB4LWF4aXMgY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2sgdXNlZCBmb3IgcHJlZGljdGlvbiAoaW50KQotICAgIHlwcmVkID0geS1heGlzIGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrIHVzZWQgZm9yIHByZWRpY3Rpb24gKGludCkKLSAgICBwcF9kZWNfdSA9IHBvaW50ZXIgdG8gdGhlIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgZm9yIGNocm9taW5hbmNlCi0gICAgICAgICAgICAgICAodWludDgpCi0gICAgcHN0cHJjVHlwUHJ2ID0gcG9pbnRlciB0aGUgcHJldmlvdXMgZnJhbWUncyBwb3N0IHByb2Nlc3NpbmcgdHlwZQotICAgICAgICAgICAgICAgICAgICh1aW50OCkKLSAgICBkeCA9IGhvcml6b250YWwgY29tcG9uZW50IG9mIHRoZSBtb3Rpb24gdmVjdG9yIChpbnQpCi0gICAgZHkgPSB2ZXJ0aWNhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3IgKGludCkKLSAgICBtdndpZHRoID0gbnVtYmVyIG9mIGJsb2NrcyBwZXIgcm93IGluIHRoZSBsdW1pbmFuY2UgVk9QIChpbnQpCi0gICAgaGVpZ2h0ID0gbHVtaW5hbmNlIFZPUCBoZWlnaHQgaW4gcGl4ZWxzIChpbnQpCi0gICAgc2l6ZSA9IHRvdGFsIG51bWJlciBvZiBwaXhlbCBpbiB0aGUgY3VycmVudCBsdW1pbmFuY2UgVk9QIChpbnQpCi0gICAgbXZfbG9jID0gZmxhZyBpbmRpY2F0aW5nIGxvY2F0aW9uIG9mIHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQKLSAgICAgICAgICh4LHkpIHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbHVtaW5hbmNlIE1CIChpbnQpOwotICAgICAgICAgMCAtPiBpbnNpZGUgTUIsIDEgLT4gb3V0c2lkZSBNQgotICAgIG1za19kZWJsb2NrID0gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcGVyZm9ybSBkZWJsb2NraW5nCi0gICAgICAgICAgICAgIChtc2tfZGVibG9jayA9IDApIG9yIG5vdCAobXNrX2RlYmxvY2sgPSAxKSAodWludDgpCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIHBwX2RlY191IGNvbnRlbnRzIGFyZSB0aGUgdXBkYXRlZCBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZGF0YQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbnMgcGVyZm9ybXMgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBwcm9jZXNzaW5nCi0gYWZ0ZXIgY2hyb21pbmFuY2UgcHJlZGljdGlvbiBpbiBpbnRlcmZyYW1lIHByb2Nlc3NpbmcgbW9kZS4KLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19hcGkuaCIKLSNpbmNsdWRlICAgICJtcDRkZWYuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGVU5DVElPTiBDT0RFCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdm9pZCBwcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfdSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCBkeCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGR5LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZ3aWR0aCwgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0LCAgICAgLyogaSAqLwotICAgICAgICBpbnQzMiAgIHNpemUsICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12X2xvYywgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICBtc2tfZGVibG9jayAvKiBpICovCi0gICAgKQotICAgIHsKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGludCBtbXZ5LCBtbXZ4LCBubXZ5LCBubXZ4OwotICAgICAgICB1aW50OCAqcHBfcHJldjEsICpwcF9wcmV2MiwgKnBwX3ByZXYzLCAqcHBfcHJldjQ7Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgICAgIC8qIDA5LzI4LzIwMDAsIG1vZGlmeSBzZW1hcGhvcmUgcHJvcGFnYXRpb24gdG8gKi8KLSAgICAgICAgLyogYWNjb21tb2RhdGUgc21hcnQgaW5kZXhpbmcgKi8KLSAgICAgICAgbW12eCA9IHhwcmVkID4+IDQ7ICAvKiBibG9jayB4IGNvb3IgKi8KLSAgICAgICAgbm12eCA9IG1tdng7Ci0KLSAgICAgICAgbW12eSA9IHlwcmVkID4+IDQ7ICAvKiBibG9jayB5IGNvb3IgKi8KLSAgICAgICAgbm12eSA9IG1tdnk7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgTVYgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgaWYgKG12X2xvYyA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQZXJmb3JtIGJvdW5kYXJ5IGNoZWNrICovCi0gICAgICAgICAgICBpZiAobm12eCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChubXZ4ID4gbXZ3aWR0aCAtIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eCA9IG12d2lkdGggLSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobm12eSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChubXZ5ID4gKGhlaWdodCA+PiA0KSAtIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eSA9IChoZWlnaHQgPj4gNCkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRlIHBvaW50ZXIgdG8gZmlyc3QgY2hyb21pbmFuY2UgYiBzZW1hcGhvcmVzIGluICAgICAgICovCi0gICAgICAgIC8qIHBzdHByY1R5cFBydiwgaS5lLiwgZmlyc3QgY2hyb21pbmFuY2UgYiBzZW1hcGhvcmUgaXMgaW4gICAgICAqLwotICAgICAgICAvKiAocHN0cHJjVHlwUHJ2ICsgKHNpemU+PjYpKS4gICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBTaW5jZSB0b3RhbCBudW1iZXIgb2YgY2hyb21pbmFuY2UgYmxvY2tzIHBlciByb3cgaW4gYSBWT1AgICAgKi8KLSAgICAgICAgLyogaXMgaGFsZiBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGx1bWluYW5jZSBibG9ja3MgcGVyIHJvdyBpbiBhICovCi0gICAgICAgIC8qIFZPUCwgd2UgdXNlIChtdndpZHRoID4+IDEpIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHJvdyBvZmZzZXQuICAqLwotICAgICAgICBwcF9wcmV2MSA9IHBzdHByY1R5cFBydiArIChzaXplID4+IDYpICsgbm12eCArIG5tdnkgKiAobXZ3aWR0aCA+PiAxKSA7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgTVYgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotICAgICAgICAvKiAgMS81LzAxLCBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBvdXQgb2YgYm91bmQgKi8KLSAgICAgICAgaWYgKCgoZHkmMHhGKSAhPSAwKSAmJiAobW12eSArIDEgPCAoaGVpZ2h0ID4+IDQpIC0gMSkpCi0gICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgcHBfcHJldjEgYmxvY2sgKi8KLSAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyAobXZ3aWR0aCA+PiAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0gICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogIDEvNS8wMSwgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ28gb3V0IG9mIGJvdW5kICovCi0gICAgICAgIGlmICgoKGR4JjB4RikgIT0gMCkgJiYgKG1tdnggKyAxIDwgKG12d2lkdGggPj4gMSkgLSAxKSkKLSAgICAgICAgeyAgIC8qIGR4IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgIC8qIHBwX3ByZXYyIGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgcHBfcHJldjEgYmxvY2sgKi8KLSAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjEgKyAxOwotCi0gICAgICAgICAgICAvKiBwcF9wcmV2NCBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mIHRoZSBibG9jayAqLwotICAgICAgICAgICAgLyogYmVsb3cgcHBfcHJldjEgYmxvY2sgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjMgKyAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgIC8qIGR4IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBZHZhbmNlIG9mZnNldCB0byBsb2NhdGlvbiBvZiBmaXJzdCBDaHJvbWluYW5jZSBSIHNlbWFwaG9yZSBpbiAqLwotICAgICAgICAvKiBwc3RwcmNUeXBQcnYuIFNpbmNlIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGEgQ2hyb21pbmFuY2UgVk9QICAqLwotICAgICAgICAvKiBpcyAobnVtYmVyIG9mIHBpeGVscyBpbiBMdW1pbmFuY2UgVk9QLzQpLCBhbmQgdGhlcmUgYXJlIDY0ICAgICAqLwotICAgICAgICAvKiBwaXhlbHMgaW4gYW4gOHg4IENocm9taW5hbmNlIGJsb2NrLCB0aGUgb2Zmc2V0IGNhbiBiZSAgICAgICovCi0gICAgICAgIC8qIGNhbGN1bGF0ZWQgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICBtdl9sb2MgPSAobnVtYmVyIG9mIHBpeGVscyBpbiBMdW1pbmFuY2UgVk9QLyg0KjY0KSkgICAqLwotICAgICAgICAvKiAgICAgICAgID0gc2l6ZS8yNTYgPSBzaXplPj44ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgbXZfbG9jID0gKHNpemUgPj4gOCk7Ci0KLSAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYXRpb24gZm9yIGRlYmxvY2tpbmcgKi8KLSAgICAgICAgaWYgKG1za19kZWJsb2NrID09IDApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogRGVibG9ja2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIENocm9taW5hbmNlICovCi0gICAgICAgICAgICAvKiBiIHNlbWFwaG9yZXMgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgKihwcF9kZWNfdSkgPSAwOwotCi0gICAgICAgICAgICAvKiBBZHZhbmNlIG9mZnNldCB0byBwb2ludCB0byBDaHJvbWluYW5jZSByIHNlbWFwaG9yZXMgKi8KLSAgICAgICAgICAgIHBwX2RlY191ICs9IG12X2xvYzsKLQotICAgICAgICAgICAgLyogRGVibG9ja2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIENocm9taW5hbmNlICovCi0gICAgICAgICAgICAvKiByIHNlbWFwaG9yZXMgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgKihwcF9kZWNfdSkgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgQ2hyb21pbmFuY2UgQiBibG9jayAqLwotICAgICAgICAgICAgaWYgKCgqKHBwX2RlY191KSY0KSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICoocHBfZGVjX3UpIHw9ICgoKihwcF9wcmV2MSkgfCAqKHBwX3ByZXYyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXYzKSB8ICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkdmFuY2Ugb2Zmc2V0IHRvIHBvaW50IHRvIENocm9taW5hbmNlIHIgc2VtYXBob3JlcyAqLwotICAgICAgICAgICAgcHBfZGVjX3UgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjEgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjIgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjMgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjQgKz0gbXZfbG9jOwotCi0gICAgICAgICAgICAvKiBEZXJpbmdpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGZvciBDaHJvbWluYW5jZSBSICovCi0gICAgICAgICAgICBpZiAoKCoocHBfZGVjX3UpJjQpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKihwcF9kZWNfdSkgfD0gKCgqKHBwX3ByZXYxKSB8ICoocHBfcHJldjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjMpIHwgKihwcF9wcmV2NCkpICYgMHg0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfbHVtYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfbHVtYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYTFlYmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2x1bWEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIHhwcmVkID0geC1heGlzIGNvb3JkaW5hdGUgb2YgdGhlIE1CIHVzZWQgZm9yIHByZWRpY3Rpb24gKGludCkKLSAgICB5cHJlZCA9IHktYXhpcyBjb29yZGluYXRlIG9mIHRoZSBNQiB1c2VkIGZvciBwcmVkaWN0aW9uIChpbnQpCi0gICAgcHBfZGVjX3kgPSBwb2ludGVyIHRvIHRoZSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIGZvciBjdXJyZW50Ci0gICAgICAgICAgIGx1bWluYW5jZSBmcmFtZSAodWludDgpCi0gICAgcHN0cHJjVHlwUHJ2ID0gcG9pbnRlciB0aGUgcHJldmlvdXMgZnJhbWUncyBwb3N0IHByb2Nlc3NpbmcgdHlwZQotICAgICAgICAgICAgICAgICAgICh1aW50OCkKLSAgICBsbCA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAoaW50KQotICAgIG12X2xvYyA9IGZsYWcgaW5kaWNhdGluZyBsb2NhdGlvbiBvZiB0aGUgbW90aW9uIGNvbXBlbnNhdGVkCi0gICAgICAgICAoeCx5KSBwb3NpdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGx1bWluYW5jZSBNQiAoaW50KTsKLSAgICAgICAgIDAgLT4gaW5zaWRlIE1CLCAxIC0+IG91dHNpZGUgTUIKLSAgICBkeCA9IGhvcml6b250YWwgY29tcG9uZW50IG9mIHRoZSBtb3Rpb24gdmVjdG9yIChpbnQpCi0gICAgZHkgPSB2ZXJ0aWNhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3IgKGludCkKLSAgICBtdndpZHRoID0gbnVtYmVyIG9mIGJsb2NrcyBwZXIgcm93IChpbnQpCi0gICAgd2lkdGggPSBsdW1pbmFuY2UgVk9QIHdpZHRoIGluIHBpeGVscyAoaW50KQotICAgIGhlaWdodCA9IGx1bWluYW5jZSBWT1AgaGVpZ2h0IGluIHBpeGVscyAoaW50KQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBtc2tfZGVibG9jayA9IGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBkZWJsb2NraW5nIGlzIHRvIGJlCi0gICAgICAgICAgICAgIHBlcmZvcm1lZCAobXNrX2RlYmxvY2sgPSAwKSBvciBub3QgKG1za19kZWJsb2NrID0KLSAgICAgICAgICAgICAgMSkgKHVpbnQ4KQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgcHBfZGVjX3kgY29udGVudHMgYXJlIHRoZSB1cGRhdGVkIHNlbWFwb2hvcmUgcHJvcGFnYXRpb24gZGF0YQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbnMgcGVyZm9ybXMgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBwcm9jZXNzaW5nCi0gYWZ0ZXIgbHVtaW5hbmNlIHByZWRpY3Rpb24uCi0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfYXBpLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRlVOQ1RJT04gQ09ERQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQ4IHBwX3NlbWFwaG9yZV9sdW1hKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfeSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCAqbGwsICAgICAgICAvKiBpICovCi0gICAgICAgIGludCAqbXZfbG9jLCAgICAvKiBpL28gKi8KLSAgICAgICAgaW50IGR4LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgZHksICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCi0gICAgICAgIGludCBoZWlnaHQgICAgICAvKiBpICovCi0gICAgKQotICAgIHsKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGludCBraywgbW12eSwgbW12eCwgbm12eCwgbm12eTsKLSAgICAgICAgdWludDggICAqcHBfcHJldjEsICpwcF9wcmV2MiwgKnBwX3ByZXYzLCAqcHBfcHJldjQ7Ci0gICAgICAgIHVpbnQ4ICAgbXNrX2RlYmxvY2sgPSAwOyAgICAgICAgLyogIDExLzMvMDAgKi8KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIC8qIEludGVyZnJhbWUgUHJvY2Vzc2luZyAtIDEgTVYgcGVyIE1CICovCi0KLSAgICAgICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipNQl9TSVpFKSkgJiYgeXByZWQgPj0gMCAmJgotICAgICAgICAgICAgICAgIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqTUJfU0laRSkpKQotICAgICAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAvKiAgMTAvMjQvMjAwMCBwb3N0X3Byb2Nlc3Npbmcgc2VtYXBob3JlICovCi0gICAgICAgICAgICAvKiBnZW5lcmF0aW9uICovCi0KLSAgICAgICAgICAgIC8qICAxMC8yMy8yMDAwIG5vIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICptdl9sb2MgPSAwOwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeCBjb29yZGluYXRlLiBEaXZpZGUgYnkgMTYgaXMgZm9yICAqLwotICAgICAgICAgICAgLyogY29udmVydGluZyBoYWxmLXBpeGVsIHJlc29sdXRpb24gdG8gYmxvY2sgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1tdnggPSB4cHJlZCA+PiA0OwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeSBjb29yZGluYXRlLiBEaXZpZGUgYnkgMTYgaXMgZm9yICovCi0gICAgICAgICAgICAvKiBjb252ZXJ0aW5nIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbiB0byBibG9jayAgICAgICAgICovCi0gICAgICAgICAgICBtbXZ5ID0geXByZWQgPj4gNDsKLQotICAgICAgICAgICAgLyogRmluZCBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIGxvY2F0aW9uIGZvciBibG9jayAqLwotICAgICAgICAgICAgLyogdXNlZCBmb3IgcHJlZGljdGlvbiwgaS5lLiwgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIHBwX3ByZXYxID0gJnBzdHByY1R5cFBydlttbXZ5Km12d2lkdGhdW21tdnhdICAgICAgKi8KLSAgICAgICAgICAgIHBwX3ByZXYxID0gcHN0cHJjVHlwUHJ2ICsgbW12eCArIG1tdnkgKiBtdndpZHRoOwotCi0gICAgICAgICAgICAvKiBDaGVjayBpZiBNViBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0gICAgICAgICAgICBpZiAoKGR4JjB4RikgIT0gMCkKLSAgICAgICAgICAgIHsgICAvKiBkeCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjIgaXMgdGhlIGJsb2NrIHRvIHRoZSByaWdodCBvZiAqLwotICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxICsgMTsKLQotICAgICAgICAgICAgICAgIGlmICgoZHkmMHhGKSAhPSAwKQotICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSBibG9jayAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgbXZ3aWR0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2NCBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mICovCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjMgYmxvY2suICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjMgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeyAgIC8qIGR4IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGR5JjB4RikgIT0gMCkKLSAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2suICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MSArIG12d2lkdGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjE7Ci0gICAgICAgICAgICAgICAgICAgIG1za19kZWJsb2NrID0gMHgzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFBlcmZvcm0gcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgZWFjaCAqLwotICAgICAgICAgICAgLyogb2YgdGhlIDQgYmxvY2tzIGluIGEgTUIuICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoa2sgPSAwOyBrayA8IDQ7IGtrKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICgoKihwcF9kZWNfeSkgJiA0KSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKihwcF9kZWNfeSkgfD0gKCgqKHBwX3ByZXYxKSB8ICoocHBfcHJldjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXYzKSB8ICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERlYmxvY2tpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uICovCi0gICAgICAgICAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYXRpb24gZm9yIGRlYmxvY2tpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAobXNrX2RlYmxvY2sgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICoocHBfZGVjX3kpID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcF9kZWNfeSArPSBsbFtra107Ci0gICAgICAgICAgICAgICAgcHBfcHJldjEgKz0gbGxba2tdOwotICAgICAgICAgICAgICAgIHBwX3ByZXYyICs9IGxsW2trXTsKLSAgICAgICAgICAgICAgICBwcF9wcmV2MyArPSBsbFtra107Ci0gICAgICAgICAgICAgICAgcHBfcHJldjQgKz0gbGxba2tdOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAvKiAgMTAvMjQvMjAwMCBwb3N0X3Byb2Nlc3Npbmcgc2VtYXBob3JlICovCi0gICAgICAgICAgICAvKiBnZW5lcmF0aW9uICovCi0KLSAgICAgICAgICAgIC8qICAxMC8yMy8yMDAwIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICptdl9sb2MgPSAxOwotCi0gICAgICAgICAgICAvKiBQZXJmb3JtIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIGVhY2ggKi8KLSAgICAgICAgICAgIC8qIG9mIHRoZSA0IGJsb2NrcyBpbiBhIE1CLiAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKGtrID0gMDsga2sgPCA0OyBraysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBibG9jayB4IGNvb3JkaW5hdGUgYW5kIHJvdW5kICg/KS4gICovCi0gICAgICAgICAgICAgICAgLyogRGl2aWRlIGJ5IDE2IGlzIGZvciBjb252ZXJ0aW5nIGhhbGYtcGl4ZWwgICAgKi8KLSAgICAgICAgICAgICAgICAvKiByZXNvbHV0aW9uIHRvIGJsb2NrLiAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1tdnggPSAoeHByZWQgKyAoKGtrICYgMSkgPDwgMykpID4+IDQ7Ci0gICAgICAgICAgICAgICAgbm12eCA9IG1tdng7Ci0KLSAgICAgICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeSBjb29yZGluYXRlIGFuZCByb3VuZCAoPykuICAqLwotICAgICAgICAgICAgICAgIC8qIERpdmlkZSBieSAxNiBpcyBmb3IgY29udmVydGluZyBoYWxmLXBpeGVsICAgICovCi0gICAgICAgICAgICAgICAgLyogcmVzb2x1dGlvbiB0byBibG9jay4gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBtbXZ5ID0gKHlwcmVkICsgKChrayAmIDIpIDw8IDIpKSA+PiA0OwotICAgICAgICAgICAgICAgIG5tdnkgPSBtbXZ5OwotCi0gICAgICAgICAgICAgICAgLyogUGVyZm9ybSBib3VuZGFyeSBjaGVja2luZyAqLwotICAgICAgICAgICAgICAgIGlmIChubXZ4IDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5tdnggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChubXZ4ID4gbXZ3aWR0aCAtIDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBubXZ4ID0gbXZ3aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5tdnkgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbm12eSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5tdnkgPiAoaGVpZ2h0ID4+IDMpIC0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5tdnkgPSAoaGVpZ2h0ID4+IDMpIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBGaW5kIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgbG9jYXRpb24gZm9yIGJsb2NrICovCi0gICAgICAgICAgICAgICAgLyogdXNlZCBmb3IgcHJlZGljdGlvbiwgaS5lLiwgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSA9ICZwc3RwcmNUeXBQcnZbbm12eSptdndpZHRoXVtubXZ4XSAgICAgICovCi0gICAgICAgICAgICAgICAgcHBfcHJldjEgPSBwc3RwcmNUeXBQcnYgKyBubXZ4ICsgbm12eSAqIG12d2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB4IGNvbXBvbmVudCBvZiBNViBpcyBhIG11bHRpcGxlIG9mIDE2ICAgICovCi0gICAgICAgICAgICAgICAgLyogYW5kIGNoZWNrIGlmIGJsb2NrIHggY29vcmRpbmF0ZSBpcyBvdXQgb2YgYm91bmRzICAqLwotICAgICAgICAgICAgICAgIGlmICgoKGR4JjB4RikgIT0gMCkgJiYgKG1tdnggKyAxIDwgbXZ3aWR0aCAtIDEpKQotICAgICAgICAgICAgICAgIHsgICAvKiBkeCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiBhbmQgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHggY29vcmRpbmF0ZSBpcyB3aXRoaW4gdGhlIGJvdW5kcyAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MiBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MSArIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgeSBjb21wb25lbnQgb2YgTVYgaXMgYSBtdWx0aXBsZSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvZiAxNiBhbmQgY2hlY2sgaWYgYmxvY2sgeSBjb29yZGluYXRlIGlzICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG91dCBvZiBib3VuZHMgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoZHkmMHhGKSAhPSAwKSAmJiAobW12eSArIDEgPCAoaGVpZ2h0ID4+IDMpIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiBhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBibG9jayB5IGNvb3JkaW5hdGUgaXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2l0aGluIHRoZSBib3VuZHMgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2sgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyBtdndpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgcHJlZGljdGlvbiBhcmUgZnJvbSBkaWZmZXJlbnQgYmxvY2tzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2tfZGVibG9jayA9IDB4MzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogeSBjb29yZGluYXRlIGlzIG91dCBvZiBib3VuZHMgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXY0IGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjMgYmxvY2suICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2NCA9IHBwX3ByZXYzICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAvKiBkeCBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayB4ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNvb3JkaW5hdGUgaXMgb3V0IG9mIGJvdW5kcyAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHkgY29tcG9uZW50IG9mIE1WIGlzIGEgbXVsdGlwbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogb2YgMTYgYW5kIGNoZWNrIGlmIGJsb2NrIHkgY29vcmRpbmF0ZSBpcyAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvdXQgb2YgYm91bmRzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKGR5JjB4RikgIT0gMCkgJiYgKG1tdnkgKyAxIDwgKGhlaWdodCA+PiAzKSAtIDEpKQotICAgICAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYmxvY2sgeSBjb29yZGluYXRlIGlzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgYm91bmRzICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrLiAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgbXZ3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogeSBjb29yZGluYXRlIGlzIG91dCBvZiBib3VuZHMgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICgoKihwcF9kZWNfeSkmNCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICoocHBfZGVjX3kpIHw9ICgoKihwcF9wcmV2MSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjIpIHwgKihwcF9wcmV2MykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERlYmxvY2tpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uICovCi0gICAgICAgICAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYT0gKi8KLSAgICAgICAgICAgICAgICAvKiB0aW9uIGZvciBkZWJsb2NraW5nICovCi0gICAgICAgICAgICAgICAgaWYgKG1za19kZWJsb2NrID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKHBwX2RlY195KSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHBfZGVjX3kgKz0gbGxba2tdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIHJldHVybiAobXNrX2RlYmxvY2spOwotICAgIH0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCmluZGV4IDljMGZjZmEuLmIwODI4ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApAQCAtNTEyLDYwICs1MTIsNiBAQAogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKE1PVCkgKiA4ICogblRvdGFsTUIpOwogI2VuZGlmCiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIC8qIEFsbG9jYXRpbmcgc3BhY2UgZm9yIHBvc3QtcHJvY2Vzc2luZyBNb2RlICovCi0jaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKLSAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gSU1FTV9wc3RwcmNUeXBDdXI7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIDYpOwotICAgIGlmICh2aWRlby0+cHN0cHJjVHlwQ3VyID09IE5VTEwpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnBzdHByY1R5cEN1ciwgMCwgNCpuVG90YWxNQiArIDIqblRvdGFsTUIpOwotICAgIH0KLQotICAgIHZpZGVvLT5wc3RwcmNUeXBQcnYgPSBJTUVNX3BzdHByY1R5cFBydjsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogNik7Ci0gICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBQcnYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHN0cHJjVHlwUHJ2LCAwLCBuVG90YWxNQio2KTsKLSAgICB9Ci0KLSNlbHNlCi0gICAgaWYgKG5Ub3RhbE1CID4gSU5UMzJfTUFYIC8gNikgewotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgfQotICAgIHZpZGVvLT5wc3RwcmNUeXBDdXIgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiA2KTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogNik7Ci0gICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBDdXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHN0cHJjVHlwQ3VyLCAwLCA0Km5Ub3RhbE1CICsgMipuVG90YWxNQik7Ci0gICAgfQotCi0gICAgdmlkZW8tPnBzdHByY1R5cFBydiA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIDYpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiA2KTsKLSAgICBpZiAodmlkZW8tPnBzdHByY1R5cFBydiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wc3RwcmNUeXBQcnYsIDAsIG5Ub3RhbE1CKjYpOwotICAgIH0KLQotI2VuZGlmCi0KLSNlbmRpZgogCiAgICAgLyogaW5pdGlhbGl6ZSB0aGUgZGVjb2RlciBsaWJyYXJ5ICovCiAgICAgdmlkZW8tPnByZXZWb3AtPnByZWRpY3Rpb25UeXBlID0gSV9WT1A7CkBAIC02MzEsMTAgKzU3Nyw2IEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICBpZiAodmlkZW8pCiAgICAgewotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIHZpZGVvLT5wc3RwcmNUeXBDdXIgPSBOVUxMOwotICAgICAgICB2aWRlby0+cHN0cHJjVHlwUHJ2ID0gTlVMTDsKLSNlbmRpZgogCiAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnICAgICAgID0gTlVMTDsKICAgICAgICAgdmlkZW8tPnNsaWNlTm8gICAgICAgICAgPSBOVUxMOwpAQCAtNjk5LDEwICs2NDEsNiBAQAogCiAgICAgaWYgKHZpZGVvKQogICAgIHsKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICBpZiAodmlkZW8tPnBzdHByY1R5cEN1cikgb3NjbF9mcmVlKHZpZGVvLT5wc3RwcmNUeXBDdXIpOwotICAgICAgICBpZiAodmlkZW8tPnBzdHByY1R5cFBydikgb3NjbF9mcmVlKHZpZGVvLT5wc3RwcmNUeXBQcnYpOwotI2VuZGlmCiAgICAgICAgIGlmICh2aWRlby0+cHJlZERDKSBvc2NsX2ZyZWUodmlkZW8tPnByZWREQyk7CiAgICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSBOVUxMOwogICAgICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCkgb3NjbF9mcmVlKHZpZGVvLT5wcmVkRENBQ19jb2wpOwpAQCAtODMwLDcgKzc2OCwxMCBAQAogT1NDTF9FWFBPUlRfUkVGIHZvaWQgUFZTZXRQb3N0UHJvY1R5cGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50IG1vZGUpCiB7CiAgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIHZpZGVvLT5wb3N0RmlsdGVyVHlwZSA9IG1vZGU7CisgICAgaWYgKG1vZGUgIT0gMCkgeworICAgICAgICBBTE9HRSgiUG9zdCBwcm9jZXNzaW5nIGZpbHRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICAgdmlkZW8tPnBvc3RGaWx0ZXJUeXBlID0gMDsKIH0KIAogCkBAIC0xNjIxLDQzICsxNTYyLDggQEAKIHZvaWQgUFZEZWNQb3N0UHJvY2VzcyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqb3V0cHV0WVVWKQogewogICAgIHVpbnQ4ICpvdXRwdXRCdWZmZXI7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIGludDMyIHRtcHZhcjsKLSAgICBpZiAob3V0cHV0WVVWKQotICAgIHsKLSAgICAgICAgb3V0cHV0QnVmZmVyID0gb3V0cHV0WVVWOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSBkZWNDdHJsLT5vdXRwdXRGcmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUpCi0gICAgewotICAgICAgICAvKiBQb3N0LXByb2Nlc3NpbmcsICAqLwotICAgICAgICBQb3N0RmlsdGVyKHZpZGVvLCB2aWRlby0+cG9zdEZpbHRlclR5cGUsIG91dHB1dEJ1ZmZlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChvdXRwdXRZVVYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgZGVjb2RlZCBmcmFtZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAgICAgICAgIHRtcHZhciA9IChpbnQzMil2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0OwotICAgICAgICAgICAgb3NjbF9tZW1jcHkob3V0cHV0QnVmZmVyLCBkZWNDdHJsLT5vdXRwdXRGcmFtZSwgdG1wdmFyKjMgLyAyKTsgICAgICAgICAgIC8qICAzLzMvMDEgKi8KLSAgICAgICAgfQotICAgIH0KLSNlbHNlCiAgICAgb3V0cHV0QnVmZmVyID0gZGVjQ3RybC0+b3V0cHV0RnJhbWU7CiAgICAgb3V0cHV0WVVWOwotI2VuZGlmCiAgICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSBvdXRwdXRCdWZmZXI7CiAgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmM3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcGVnNF9kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgICAgICItRE1QRUc0IiwKKyAgICBdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiaDI2M19kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhNGY2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTcgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1QRUc0L0gyNjMgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGVzIChkaWN0aW9uYXJ5IGZpbGVzKSBhcmUgY3JlYXRlZCBmb3IgTVBFRzQgYW5kIEgyNjMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgZGVjb2RlciBkb2VzIG5vdCByZWplY3QgYW55IGlucHV0IGZpbGUgaW4gdGhlIGZpcnN0IGNoZWNrCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBjb2RlYyB1c2luZyBhIGxvb3AuCisgKiBJZiB0aGUgZGVjb2RlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKKyAgIGluIHRoZSBkZWNvZGUgY2FsbC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgMSBieXRlIHNvIHRoYXQgdGhlIGZ1enplcgorICAgY2FuIHByb2NlZWQgdG8gZmVlZCB0aGUgbmV4dCBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLCBtYWxmb3JtZWQsIGV0YykKK2FuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlIGNoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIyMjIE90aGVyIGNvbnNpZGVyYXRpb25zCisgKiBUd28gZnV6emVyIGJpbmFyaWVzIC0gbXBlZzRfZGVjX2Z1enplciBhbmQgaDI2M19kZWNfZnV6emVyIGFyZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlCisgICBvZiBhIGZsYWcgLSAnTVBFRzQnCisgKiBUaGUgbnVtYmVyIG9mIGRlY29kZSBjYWxscyBhcmUga2VwdCB0byBhIG1heGltdW0gb2YgMTAwIHNvIHRoYXQgdGhlIGZ1enplciBkb2VzIG5vdCB0aW1lb3V0LgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcGVnNF9kZWNfZnV6emVyIGFuZCBoMjYzX2RlY19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcGVnNF9kZWNfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBoMjYzX2RlY19mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBNUEVHNCBvciBIMjYzIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21wZWc0X2RlY19mdXp6ZXIvbXBlZzRfZGVjX2Z1enplciBDT1JQVVNfRElSCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvaDI2M19kZWNfZnV6emVyL2gyNjNfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9tcGVnNF9kZWNfZnV6emVyL21wZWc0X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2gyNjNfZGVjX2Z1enplci9oMjYzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9oMjYzX2RlY19mdXp6ZXIuZGljdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxZDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGNvZGUgKGJ5dGVzIDAtMykKK2t3MT0iXHgwMFx4MDBceDgwXHgwMiIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9kZWNfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyNDFhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlIChieXRlcyAwLTMpCitrdzE9Ilx4MDBceDAwXHgwMVx4QjAiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyYzgyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorI2RlZmluZSBNUEVHNF9NQVhfV0lEVEggMTkyMAorI2RlZmluZSBNUEVHNF9NQVhfSEVJR0hUIDEwODAKKyNkZWZpbmUgSDI2M19NQVhfV0lEVEggMzUyCisjZGVmaW5lIEgyNjNfTUFYX0hFSUdIVCAyODgKKyNkZWZpbmUgREVGQVVMVF9XSURUSCAzNTIKKyNkZWZpbmUgREVGQVVMVF9IRUlHSFQgMjg4CisKK2NvbnN0ZXhwciBzaXplX3Qga01heE51bURlY29kZUNhbGxzID0gMTAwOworY29uc3RleHByIHVpbnQ4X3Qga051bU91dHB1dEJ1ZmZlcnMgPSAyOworY29uc3RleHByIGludCBrTGF5ZXIgPSAxOworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworLyogPT0gY2VpbChudW0gLyBkZW4pICogZGVuLiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBhbGlnbm1lbnQgbXVzdCBiZSBwb3NpdGl2ZSBwb3dlciBvZiAyICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBzdGF0aWMgY29uc3QgVCBhbGlnbihjb25zdCBUICZudW0sIGNvbnN0IFUgJmRlbikgeworICByZXR1cm4gKG51bSArIChUKShkZW4gLSAxKSkgJiAoVCkgfihkZW4gLSAxKTsKK30KKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpIHsgZGVJbml0RGVjb2RlcigpOyB9CisgIGJvb2wgaW5pdERlY29kZXIoKTsKKyAgYm9vbCBhbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSk7CisgIHZvaWQgZnJlZU91dHB1dEJ1ZmZlcigpOworICB2b2lkIGhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworIHByaXZhdGU6CisgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGUgPSBudWxscHRyOworICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgYm9vbCBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworI2lmZGVmIE1QRUc0CisgIE1QNERlY29kaW5nTW9kZSBtSW5wdXRNb2RlID0gTVBFRzRfTU9ERTsKKyAgc2l6ZV90IG1NYXhXaWR0aCA9IE1QRUc0X01BWF9XSURUSDsKKyAgc2l6ZV90IG1NYXhIZWlnaHQgPSBNUEVHNF9NQVhfSEVJR0hUOworI2Vsc2UKKyAgTVA0RGVjb2RpbmdNb2RlIG1JbnB1dE1vZGUgPSBIMjYzX01PREU7CisgIHNpemVfdCBtTWF4V2lkdGggPSBIMjYzX01BWF9XSURUSDsKKyAgc2l6ZV90IG1NYXhIZWlnaHQgPSBIMjYzX01BWF9IRUlHSFQ7CisjZW5kaWYKKyAgdWludDMyX3QgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICB1aW50MzJfdCBtV2lkdGggPSBERUZBVUxUX1dJRFRIOworICB1aW50MzJfdCBtSGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7Cit9OworCitib29sIENvZGVjOjppbml0RGVjb2RlcigpIHsKKyAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOworICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1EZWNIYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVjOjphbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSkgeworICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYWxsb2Mob3V0cHV0QnVmZmVyU2l6ZSkpOworICAgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWM6OmZyZWVPdXRwdXRCdWZmZXIoKSB7CisgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgIH0KKyAgfQorfQorCit2b2lkIENvZGVjOjpoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCkgeworICBpbnQzMl90IGRpc3BXaWR0aCwgZGlzcEhlaWdodDsKKyAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgJmRpc3BXaWR0aCwgJmRpc3BIZWlnaHQpOworCisgIGludDMyX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKKyAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsICZidWZXaWR0aCwgJmJ1ZkhlaWdodCk7CisKKyAgaWYgKGRpc3BXaWR0aCAhPSBtV2lkdGggfHwgZGlzcEhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgbVdpZHRoID0gZGlzcFdpZHRoOworICAgIG1IZWlnaHQgPSBkaXNwSGVpZ2h0OworICB9Cit9CisKK3ZvaWQgQ29kZWM6OmRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSA9IGFsaWduKG1NYXhXaWR0aCwgMTYpICogYWxpZ24obU1heEhlaWdodCwgMTYpICogMyAvIDI7CisgIHVpbnQ4X3QgKnN0YXJ0X2NvZGUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSk7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IHZvbEluZm9bXSA9IHsweDAwLCAweDAwLCAweDAxLCAweEIwfTsKKyAgYm9vbCB2b2xIZWFkZXIgPSBtZW1jbXAoc3RhcnRfY29kZSwgdm9sSW5mbywgNCkgPT0gMDsKKyAgaWYgKHZvbEhlYWRlcikgeworICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgfQorCisgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgdWludDhfdCAqdm9sRGF0YVsxXXt9OworICAgIGludDMyX3Qgdm9sU2l6ZSA9IDA7CisKKyAgICBpZiAodm9sSGVhZGVyKSB7IC8qIHJlbW92ZWQgc29tZSBjb2RlYyBjb25maWcgcGFydCAqLworICAgICAgdm9sRGF0YVswXSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKTsKKyAgICAgIHZvbFNpemUgPSBzaXplOworICAgIH0KKworICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUsIHZvbERhdGEsICZ2b2xTaXplLCBrTGF5ZXIsIG1NYXhXaWR0aCwgbU1heEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb2RlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1EZWNIYW5kbGUpOworICAgIGlmIChtSW5wdXRNb2RlICE9IGFjdHVhbE1vZGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKKyAgfQorICBzaXplX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICBpZiAob3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWFsbG9jT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlclNpemUpKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCBudW1EZWNvZGVDYWxscyA9IDA7CisgIHdoaWxlICgoc2l6ZSA+IDApICYmIChudW1EZWNvZGVDYWxscyA8IGtNYXhOdW1EZWNvZGVDYWxscykpIHsKKyAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICBQVlNldFJlZmVyZW5jZVlVVihtRGVjSGFuZGxlLCBtT3V0cHV0QnVmZmVyWzFdKTsKKyAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhlYWRlciBjb250YWlucyBuZXcgaW5mbywgZS5nLiwgd2lkdGgvaGVpZ2h0LCBldGMuCisgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKyAgICB1aW50MzJfdCB1c2VFeHRUaW1lc3RhbXAgPSAobnVtRGVjb2RlQ2FsbHMgPT0gMCk7CisgICAgaW50MzJfdCB0ZW1wU2l6ZSA9IChpbnQzMl90KXNpemU7CisgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgaWYgKFBWRGVjb2RlVm9wSGVhZGVyKG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0ZW1wU2l6ZSwgJmhlYWRlcl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlRXh0VGltZXN0YW1wLCBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCk7CisKKyAgICBQVkRlY29kZVZvcEJvZHkobURlY0hhbmRsZSwgJnRlbXBTaXplKTsKKyAgICB1aW50MzJfdCBieXRlc0NvbnN1bWVkID0gMTsKKyAgICBpZiAoc2l6ZSA+IHRlbXBTaXplKSB7CisgICAgICBieXRlc0NvbnN1bWVkID0gc2l6ZSAtIHRlbXBTaXplOworICAgIH0KKyAgICBkYXRhICs9IGJ5dGVzQ29uc3VtZWQ7CisgICAgc2l6ZSAtPSBieXRlc0NvbnN1bWVkOworICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgKytudW1EZWNvZGVDYWxsczsKKyAgfQorICBmcmVlT3V0cHV0QnVmZmVyKCk7Cit9CisKK3ZvaWQgQ29kZWM6OmRlSW5pdERlY29kZXIoKSB7CisgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgZGVsZXRlIG1EZWNIYW5kbGU7CisgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgZnJlZU91dHB1dEJ1ZmZlcigpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgNCkgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGNvZGVjLT5pbml0RGVjb2RlcigpKSB7CisgICAgY29kZWMtPmRlY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCmluZGV4IDk2MTA2ZjEuLjMxNmQ2M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKQEAgLTMsNiArMyw3IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAKKyAgICBob3N0X3N1cHBvcnRlZDp0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9wdm1wM19ub3JtYWxpemUuY3BwIiwKICAgICAgICAgInNyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwIiwKQEAgLTczLDYgKzc0LDEyIEBACiAgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmYTFlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDNfZGVjX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibXAzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGQ1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X21wM2RlYyBkZWNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBtcDMgZGVjb2RlciBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKKworVGhpcyBmdXp6ZXIgbWFrZXMgdXNlIG9mIHRoZSBmb2xsb3dpbmcgY29uZmlnIHBhcmFtZXRlcnM6CisxLiBFcXVhbGl6ZXIgdHlwZSAocGFyYW1ldGVyIG5hbWU6IGBlcXVhbGl6ZXJUeXBlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBlcXVhbGl6ZXJUeXBlYCB8IDAuIGBmbGF0IGAgMS4gYGJhc3NfYm9vc3QgYCAyLiBgcm9jayBgIDMuIGBwb3AgYCA0LiBgamF6eiBgIDUuIGBjbGFzc2ljYWwgYCA2LiBgdGFsayBgIDcuIGBmbGF0XyBgIHwgQml0cyAwLCAxIGFuZCAyIG9mIGZpcnN0IGJ5dGUgb2YgaW5wdXQgc3RyZWFtIHwKK3wgYGNyY0VuYWJsZWRgIHwgMC4gYGZhbHNlIGAgMS4gYHRydWUgYHwgQml0IDAgb2Ygc2Vjb25kIGJ5dGUgb2YgaW5wdXQgc3RyZWFtIHwKKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIHVzaW5nIGEgbG9vcC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgdGhlIG51bWJlcgorICAgb2YgYnl0ZXMgdXNlZCBieSB0aGUgZGVjb2Rlci4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgMSBieXRlCisgICB0aWxsIGl0IHJlYWNoZXMgYSB2YWxpZCBmcmFtZSBvciBlbmQgb2Ygc3RyZWFtLgorCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wM19kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcDNfZGVjX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1wMyBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXAzX2RlY19mdXp6ZXIvbXAzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvbXAzX2RlY19mdXp6ZXIvbXAzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvbXAzX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvbXAzX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0N2M4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2Z1enplci9tcDNfZGVjX2Z1enplci5jcHAKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8cHZtcDNkZWNvZGVyX2FwaS5oPgorCitjb25zdGV4cHIgaW50IGtNYXhGcmFtZVNhbXBsZXMgPSA0NjA4OworY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSAyOworY29uc3RleHByIGVfZXF1YWxpemF0aW9uIGtFcXVhbGl6ZXJUeXBlc1tdID0ge2ZsYXQsIGJhc3NfYm9vc3QsIHJvY2ssIHBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXp6LCBjbGFzc2ljYWwsICB0YWxrLCBmbGF0X307CisKK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLCB1aW50MzJfdCAqb3V0X251bV9zYW1wbGVzID0gbnVsbHB0cikgeworICAqZnJhbWVfc2l6ZSA9IDA7CisgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgaWYgKG91dF9jaGFubmVscykgKm91dF9jaGFubmVscyA9IDA7CisgIGlmIChvdXRfYml0cmF0ZSkgKm91dF9iaXRyYXRlID0gMDsKKyAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDA7CisKKyAgaWYgKChoZWFkZXIgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgIGlmICh2ZXJzaW9uID09IDB4MDEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgIGlmIChsYXllciA9PSAweDAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHs0NDEwMCwgNDgwMDAsIDMyMDAwfTsKKyAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgIH0KKworICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7CisKKyAgaWYgKGxheWVyID09IDMpIHsgIC8vIGxheWVyIEkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9IHszMiwgIDY0LCAgOTYsICAxMjgsIDE2MCwgMTkyLCAyMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4fTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHszMiwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsICAxMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2fTsKKworICAgIGludCBiaXRyYXRlID0KKyAgICAgICAgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXSA6IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgIH0KKyAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OworICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAzODQ7CisgICAgfQorICB9IGVsc2UgeyAgLy8gbGF5ZXIgSUkgb3IgSUlJCisgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9IHszMiwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsICAxMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODR9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPSB7MzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjB9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0gezgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MH07CisgICAgaW50IGJpdHJhdGU7CisgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgYml0cmF0ZSA9CisgICAgICAgICAgKGxheWVyID09IDIgLyogTDIgKi8pID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXSA6IGtCaXRyYXRlVjFMM1tiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIFYyIChvciAyLjUpCisgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICB9CisKKyAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICB9IGVsc2UgeyAgLy8gVjIgb3IgVjIuNQorICAgICAgc2l6ZV90IHRtcCA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDcyMDAwIDogMTQ0MDAwOworICAgICAgKmZyYW1lX3NpemUgPSB0bXAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgfQorICB9CisKKyAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgfQorCisgIGlmIChvdXRfY2hhbm5lbHMpIHsKKyAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgVTMyX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBib29sIGNoZWNrSGVhZGVyKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUpIHsKKyAgc2l6ZV90IGZyYW1lU2l6ZTsKKyAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKyAgYm9vbCBpc1ZhbGlkQnVmZmVyID0gZmFsc2U7CisKKyAgd2hpbGUgKHRvdGFsSW5TaXplICsgNCA8IGluU2l6ZSkgeworICAgIGlzVmFsaWRCdWZmZXIgPSB0cnVlOworICAgIHVpbnQzMl90IHZhbCA9IFUzMl9BVChoZWFkZXIgKyB0b3RhbEluU2l6ZSk7CisgICAgaWYgKCFwYXJzZU1wM0hlYWRlcih2YWwsICZmcmFtZVNpemUsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRvdGFsSW5TaXplICs9IGZyYW1lU2l6ZTsKKyAgfQorCisgIHJldHVybiAoaXNWYWxpZEJ1ZmZlcik7Cit9CisKK2NsYXNzIENvZGVjIHsKKyBwdWJsaWM6CisgIENvZGVjKCkgPSBkZWZhdWx0OworICB+Q29kZWMoKSB7IGRlSW5pdERlY29kZXIoKTsgfQorCisgIGJvb2wgaW5pdERlY29kZXIoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXModWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworIHByaXZhdGU6CisgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZyA9IG51bGxwdHI7CisgIHZvaWQgKm1EZWNvZGVyQnVmID0gbnVsbHB0cjsKK307CisKK2Jvb2wgQ29kZWM6OmluaXREZWNvZGVyKCkgeworICBtQ29uZmlnID0gbmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbHt9OworICBpZiAoIW1Db25maWcpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc2l6ZV90IGRlY29kZXJCdWZTaXplID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhkZWNvZGVyQnVmU2l6ZSk7CisgIGlmICghbURlY29kZXJCdWYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1EZWNvZGVyQnVmLCAweDAsIGRlY29kZXJCdWZTaXplKTsKKyAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHVpbnQ4X3QgZXF1YWxpemVyVHlwZVZhbHVlID0gKGRhdGFbMF0gJiAweDcpOworICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0ga0VxdWFsaXplclR5cGVzW2VxdWFsaXplclR5cGVWYWx1ZV07CisgIG1Db25maWctPmNyY0VuYWJsZWQgPSBkYXRhWzFdICYgMHgxOworCisgIHdoaWxlIChzaXplID4gMCkgeworICAgIGJvb2wgc3RhdHVzID0gY2hlY2tIZWFkZXIoZGF0YSwgc2l6ZSk7CisgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgIHNpemUtLTsKKyAgICAgIGRhdGErKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBzaXplX3Qgb3V0QnVmU2l6ZSA9IGtNYXhGcmFtZVNhbXBsZXMgKiBrTWF4Q2hhbm5lbHM7CisgICAgc2l6ZV90IHVzZWRCeXRlcyA9IDA7CisgICAgaW50MTZfdCBvdXRwdXRCdWZbb3V0QnVmU2l6ZV07CisgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gc2l6ZTsKKyAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKyAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBkYXRhOworICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSBvdXRwdXRCdWY7CisgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gb3V0QnVmU2l6ZSAvIHNpemVvZihpbnQxNl90KTsKKworICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKKyAgICBkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBpZiAoZGVjb2RlckVyciAhPSBOT19ERUNPRElOR19FUlJPUikgeworICAgICAgc2l6ZS0tOworICAgICAgZGF0YSsrOworICAgIH0gZWxzZSB7CisgICAgICB1c2VkQnl0ZXMgPSBzdGQ6Om1pbigoaW50MzJfdClzaXplLCBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGgpOworICAgICAgc2l6ZSAtPSB1c2VkQnl0ZXM7CisgICAgICBkYXRhICs9IHVzZWRCeXRlczsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb2RlYzo6ZGVJbml0RGVjb2RlcigpIHsKKyAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICB9CisgIGRlbGV0ZSBtQ29uZmlnOworICBtQ29uZmlnID0gbnVsbHB0cjsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sCmluZGV4IDY1NzExNjIuLmRkMmVlZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX3N3LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwKQEAgLTI5NSwxMiArMjk1LDEyIEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmhldmMuZW5jb2RlciIgdHlwZT0idmlkZW8vaGV2YyIgdmFyaWFudD0iIXNsb3ctY3B1Ij4KLSAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDMgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iOTYweDU0NCIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjUxMng1MTIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTgxNjAiIC8+IDwhLS0gbWF4IDk2MHg1NDQgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtNDA5NiIgLz4gPCEtLSBtYXggNTEyeDUxMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTIyODgwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImZyYW1lLXJhdGUiIHJhbmdlPSIxLTEyMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjAiIC8+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCAzMmIyMDc1Li5iNjMzNTNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTIsNiArMiw3IEBACiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAiRkxBQ0RlY29kZXIuY3BwIiwKQEAgLTMzLDYgKzM0LDEzIEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAppbmRleCBjZWYwYmM2Li5mNWU5NTMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCkBAIC00MzMsNyArNDMzLDcgQEAKICAgICAgICAgICAgIGlmIChtQnVmZmVyID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyRGF0YVNpemUgPSAwOwogICAgICAgICAgICAgICAgIG1CdWZmZXJMZW4gPSAwOwotICAgICAgICAgICAgICAgIEFMT0dFKCJkZWNvZGVPbmVGcmFtZTogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5wdXQgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZERhdGFUb0J1ZmZlcjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5wdXQgYnVmZmVyIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1CdWZmZXJMZW4gPSBtQnVmZmVyRGF0YVNpemUgKyBpbkJ1ZmZlckxlbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCmluZGV4IDhhN2MzZWIuLjBhNGU1OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgcy5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHdyaXRlKGZkLCBzLnN0cmluZygpLCBzLnNpemUoKSk7CisgICAgKHZvaWQpd3JpdGUoZmQsIHMuc3RyaW5nKCksIHMuc2l6ZSgpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCmluZGV4IDRiZDE4NmMuLjg3MjJlMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcApAQCAtMzg3LDEwICszODcsMTQgQEAKICAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKIAogICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICB2YXNwcmludGYoJmJ1ZmZlciwgZm9ybWF0LCBhcCk7CisgICAgaW50IGJ1ZmZlclNpemUgPSB2YXNwcmludGYoJmJ1ZmZlciwgZm9ybWF0LCBhcCk7CiAKICAgICB2YV9lbmQoYXApOwogCisgICAgaWYoYnVmZmVyU2l6ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIEFTdHJpbmcoKTsKKyAgICB9CisKICAgICBBU3RyaW5nIHJlc3VsdChidWZmZXIpOwogCiAgICAgZnJlZShidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IGY0NDBlMDAuLmViZjEwMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDcgQEAKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLApAQCAtMjUsNyArMjYsNiBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLApAQCAtODYsNiArODYsOSBAQAogICAgICAgICAgICAgICAgICItRE5PX0lNRU1PUlkiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKICAgICB9LAogCiAgICAgY2xhbmc6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5jcHAKaW5kZXggZjUzZDJjOS4uOWQ2ODg3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcApAQCAtNTU5LDExICs1NTksOSBAQAogICAgIENIRUNLX05FKHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24sCiAgICAgICAgICAgICAgMHgyMXUgLyogRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZSAqLyk7CiAKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgX191bnVzZWQ7Ci0gICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5IF9fdW51c2VkOwogICAgIGlmIChici5nZXRCaXRzKDEpKSB7Ci0gICAgICAgIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvL3ZpZGVvX29iamVjdF9sYXllcl92ZXJpZAorICAgICAgICBici5za2lwQml0cygzKTsgLy92aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkKICAgICB9CiAgICAgdW5zaWduZWQgYXNwZWN0X3JhdGlvX2luZm8gPSBici5nZXRCaXRzKDQpOwogICAgIGlmIChhc3BlY3RfcmF0aW9faW5mbyA9PSAweDBmIC8qIGV4dGVuZGVkIFBBUiAqLykgewpAQCAtNjIyLDcgKzYyMCw3IEBACiAgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCA9IGJyLmdldEJpdHMoMTMpOwogICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAogCi0gICAgdW5zaWduZWQgaW50ZXJsYWNlZCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CisgICAgYnIuc2tpcEJpdHMoMSk7IC8vIGludGVybGFjZWQKIAogICAgICp3aWR0aCA9IHZpZGVvX29iamVjdF9sYXllcl93aWR0aDsKICAgICAqaGVpZ2h0ID0gdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodDsKQEAgLTY2OCw3ICs2NjYsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdW5zaWduZWQgcHJvdGVjdGlvbiBfX3VudXNlZCA9IChoZWFkZXIgPj4gMTYpICYgMTsKKyAgICAvLyB3ZSBjYW4gZ2V0IHByb3RlY3Rpb24gdmFsdWUgZnJvbSAoaGVhZGVyID4+IDE2KSAmIDEKIAogICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKaW5kZXggYWIxN2EwMi4uZTRiOTliZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKQEAgLTE0OCw3ICsxNDgsOCBAQAogICAgIHN0YXRpYyBjaGFyICpHZXREZWJ1Z05hbWUoY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICBpbmxpbmUgc3RhdGljIGJvb2wgaXNFeHBlcmltZW50RW5hYmxlZCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgX191bnVzZWQgLyogbm9ubnVsbCAqLywgYm9vbCBhbGxvdyBfX3VudXNlZCA9IHRydWUpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgLyogbm9ubnVsbCAqLywKKyAgICAgICAgICAgIGJvb2wgYWxsb3cgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSB0cnVlKSB7CiAjaWZkZWYgRU5BQkxFX1NUQUdFRlJJR0hUX0VYUEVSSU1FTlRTCiAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJsZWdhY3ktYWRhcHRpdmUiKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldEV4cGVyaW1lbnRGbGFnKGFsbG93LCBuYW1lLCAyLCAxKTsgLy8gZXZlcnkgb3RoZXIgZGF5CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oCmluZGV4IGFmNmIzNTcuLjNiNjQ2ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oCkBAIC02Myw3ICs2Myw3IEBACiAKIHRlbXBsYXRlPGNsYXNzIFQ+CiB2b2lkIEVOU1VSRV9VTlNJR05FRF9UWVBFKCkgewotICAgIFQgVFlQRV9NVVNUX0JFX1VOU0lHTkVEWyhUKS0xIDwgMCA/IC0xIDogMF0gX191bnVzZWQ7CisgICAgVCBUWVBFX01VU1RfQkVfVU5TSUdORURbKFQpLTEgPCAwID8gLTEgOiAwXSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKIH0KIAogLy8gbmVlZGxlIGlzIGluIHJhbmdlIFtoYXlTdGFydCwgaGF5U3RhcnQgKyBoYXlTaXplKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOGE3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19BVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWM6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIEFWQ1V0aWxzVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IEFWQ1V0aWxzVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fQVZDX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1VuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2E4NTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1VuaXRUZXN0LmNwcApAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQVZDVXRpbHNVbml0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlICJtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaCIKKyNpbmNsdWRlICJtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oIgorCisjaW5jbHVkZSAiQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaCIKKworY29uc3RleHByIHNpemVfdCBrU21hbGxCdWZmZXJTaXplID0gMjsKK2NvbnN0ZXhwciB1aW50OF90IGtTUFNtYXNrID0gMHgxZjsKK2NvbnN0ZXhwciB1aW50OF90IGtTUFNTdGFydENvZGUgPSAweDA3OworY29uc3RleHByIHVpbnQ4X3Qga0NvbmZpZ1ZlcnNpb24gPSAweDAxOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIEFWQ1V0aWxzVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgTXBlZ0F1ZGlvVW5pdFRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qYXVkaW9IZWFkZXIqLyB1aW50MzJfdCwgLypmcmFtZVNpemUqLyBpbnQzMl90LCAvKnNhbXBsZVJhdGUqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAvKm51bUNoYW5uZWxzKi8gaW50MzJfdCwgLypiaXRSYXRlKi8gaW50MzJfdCwgLypudW1TYW1wbGVzKi8gaW50MzJfdD4+IHt9OworCitjbGFzcyBWT0xEaW1lbnNpb25UZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTwvKmZpbGVOYW1lKi8gc3RyaW5nLCAvKnZvbFdpZHRoKi8gaW50MzJfdCwgLyp2b2xIZWlnaHQqLyBpbnQzMl90Pj4ge307CisKK2NsYXNzIEFWQ1V0aWxzIHsKKyAgcHVibGljOgorICAgIGJvb2wgU2V0VXBBVkNVdGlscyhzdHJpbmcgZmlsZU5hbWUsIHN0cmluZyBpbmZvRmlsZU5hbWUpIHsKKyAgICAgICAgbUlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZmlsZU5hbWU7CisgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBpZiAoIW1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbUluZm9GaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBpbmZvRmlsZU5hbWU7CisgICAgICAgIG1JbmZvRmlsZVN0cmVhbS5vcGVuKG1JbmZvRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgaWYgKCFtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB+QVZDVXRpbHMoKSB7CisgICAgICAgIGlmIChtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgbUlucHV0RmlsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgbUluZm9GaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgfQorCisgICAgc3RyaW5nIG1JbnB1dEZpbGU7CisgICAgc3RyaW5nIG1JbmZvRmlsZTsKKworICAgIGlmc3RyZWFtIG1JbnB1dEZpbGVTdHJlYW07CisgICAgaWZzdHJlYW0gbUluZm9GaWxlU3RyZWFtOworfTsKKworY2xhc3MgQVZDRGltZW5zaW9uVGVzdAorICAgIDogcHVibGljIEFWQ1V0aWxzLAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LypmaWxlTmFtZSovIHN0cmluZywgLyppbmZvRmlsZU5hbWUqLyBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIC8qYXZjV2lkdGgqLyBzaXplX3QsIC8qYXZjSGVpZ2h0Ki8gc2l6ZV90LCAvKm51bWJlck9mTkFMVW5pdHMqLyBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHN0cmluZywgc2l6ZV90LCBzaXplX3QsIHNpemVfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGZpbGVOYW1lID0gZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIHN0cmluZyBpbmZvRmlsZU5hbWUgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgQVZDVXRpbHM6OlNldFVwQVZDVXRpbHMoZmlsZU5hbWUsIGluZm9GaWxlTmFtZSk7CisKKyAgICAgICAgbUZyYW1lV2lkdGggPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lSGVpZ2h0ID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgICAgIG1OYWxVbml0c0V4cGVjdGVkID0gZ2V0PDQ+KHBhcmFtcyk7CisgICAgfQorCisgICAgc2l6ZV90IG1GcmFtZVdpZHRoOworICAgIHNpemVfdCBtRnJhbWVIZWlnaHQ7CisgICAgaW50MzJfdCBtTmFsVW5pdHNFeHBlY3RlZDsKK307CisKK2NsYXNzIEF2Y2NCb3hUZXN0IDogcHVibGljIEFWQ0RpbWVuc2lvblRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBBVkNEaW1lbnNpb25UZXN0OjpTZXRVcCgpOyB9Cit9OworCitjbGFzcyBBVkNGcmFtZVRlc3QKKyAgICA6IHB1YmxpYyBBVkNVdGlscywKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjwvKmZpbGVOYW1lKi8gc3RyaW5nLCAvKmluZm9GaWxlTmFtZSovIHN0cmluZz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RyaW5nIGZpbGVOYW1lID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICAgICAgc3RyaW5nIGluZm9GaWxlTmFtZSA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgICAgICBBVkNVdGlsczo6U2V0VXBBVkNVdGlscyhmaWxlTmFtZSwgaW5mb0ZpbGVOYW1lKTsKKyAgICB9Cit9OworCitURVNUX1AoTXBlZ0F1ZGlvVW5pdFRlc3QsIEF1ZGlvUHJvZmlsZVRlc3QpIHsKKyAgICB0dXBsZTx1aW50MzJfdCwgc2l6ZV90LCBpbnQsIGludCwgaW50LCBpbnQ+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgdWludDMyX3QgaGVhZGVyID0gZ2V0PDA+KHBhcmFtcyk7CisKKyAgICBzaXplX3QgYXVkaW9GcmFtZVNpemUgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9TYW1wbGVSYXRlID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgaW50IGF1ZGlvTnVtQ2hhbm5lbHMgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9CaXRSYXRlID0gZ2V0PDQ+KHBhcmFtcyk7CisgICAgaW50IGF1ZGlvTnVtU2FtcGxlcyA9IGdldDw1PihwYXJhbXMpOworCisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7CisgICAgaW50IHNhbXBsZVJhdGUgPSAwOworICAgIGludCBudW1DaGFubmVscyA9IDA7CisgICAgaW50IGJpdFJhdGUgPSAwOworICAgIGludCBudW1TYW1wbGVzID0gMDsKKworICAgIGJvb2wgc3RhdHVzID0gR2V0TVBFR0F1ZGlvRnJhbWVTaXplKGhlYWRlciwgJmZyYW1lU2l6ZSwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bVNhbXBsZXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgQXVkaW8gcHJvcGVydGllcyI7CisKKyAgICBBU1NFUlRfRVEoZnJhbWVTaXplLCBhdWRpb0ZyYW1lU2l6ZSkgPDwgIldyb25nIGZyYW1lIHNpemUgZm91bmQiOworCisgICAgQVNTRVJUX0VRKHNhbXBsZVJhdGUsIGF1ZGlvU2FtcGxlUmF0ZSkgPDwgIldyb25nIHNhbXBsZSByYXRlIGZvdW5kIjsKKworICAgIEFTU0VSVF9FUShudW1DaGFubmVscywgYXVkaW9OdW1DaGFubmVscykgPDwgIldyb25nIG51bWJlciBvZiBjaGFubmVscyBmb3VuZCI7CisKKyAgICBBU1NFUlRfRVEoYml0UmF0ZSwgYXVkaW9CaXRSYXRlKSA8PCAiV3JvbmcgYml0IHJhdGUgZm91bmQiOworCisgICAgQVNTRVJUX0VRKG51bVNhbXBsZXMsIGF1ZGlvTnVtU2FtcGxlcykgPDwgIldyb25nIG51bWJlciBvZiBzYW1wbGVzIGZvdW5kIjsKK30KKworVEVTVF9QKFZPTERpbWVuc2lvblRlc3QsIERpbWVuc2lvblRlc3QpIHsKKyAgICB0dXBsZTxzdHJpbmcsIGludDMyX3QsIGludDMyX3Q+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgaWZzdHJlYW0gaW5wdXRGaWxlU3RyZWFtOworICAgIGlucHV0RmlsZVN0cmVhbS5vcGVuKGlucHV0RmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICBBU1NFUlRfVFJVRShpbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSA8PCAiRmFpbGVkIHRvIG9wZW46ICIgPDwgaW5wdXRGaWxlOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludDhfdCBlcnIgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICBBU1NFUlRfRVEoZXJyLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBBU1NFUlRfTkUoZmlsZVNpemUsIDApIDw8ICJJbnZhbGlkIGZpbGUgc2l6ZSBmb3VuZCI7CisKKyAgICBjb25zdCB1aW50OF90ICp2b2xCdWZmZXIgPSBuZXcgdWludDhfdFtmaWxlU2l6ZV07CisgICAgQVNTRVJUX05FKHZvbEJ1ZmZlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBWT0wgYnVmZmVyIG9mIHNpemU6ICIgPDwgZmlsZVNpemU7CisKKyAgICBpbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKSh2b2xCdWZmZXIpLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKGlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgZmlsZVNpemUpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBpbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICBpbnQzMl90IHdpZHRoID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgaW50MzJfdCBoZWlnaHQgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBpbnQzMl90IHZvbFdpZHRoID0gLTE7CisgICAgaW50MzJfdCB2b2xIZWlnaHQgPSAtMTsKKworICAgIGJvb2wgc3RhdHVzID0gRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKHZvbEJ1ZmZlciwgZmlsZVNpemUsICZ2b2xXaWR0aCwgJnZvbEhlaWdodCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgVk9MIGRpbWVuc2lvbnMgZnJvbSBmdW5jdGlvbjogRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKCkiOworCisgICAgQVNTRVJUX0VRKHZvbFdpZHRoLCB3aWR0aCkgPDwgIkV4cGVjdGVkIHdpZHRoOiAiIDw8IHdpZHRoIDw8ICJGb3VuZDogIiA8PCB2b2xXaWR0aDsKKworICAgIEFTU0VSVF9FUSh2b2xIZWlnaHQsIGhlaWdodCkgPDwgIkV4cGVjdGVkIGhlaWdodDogIiA8PCBoZWlnaHQgPDwgIkZvdW5kOiAiIDw8IHZvbEhlaWdodDsKKworICAgIGRlbGV0ZVtdIHZvbEJ1ZmZlcjsKK30KKworVEVTVF9QKEFWQ0RpbWVuc2lvblRlc3QsIERpbWVuc2lvblRlc3QpIHsKKyAgICBpbnQzMl90IG51bU5hbFVuaXRzID0gMDsKKyAgICBpbnQzMl90IGF2Y1dpZHRoID0gLTE7CisgICAgaW50MzJfdCBhdmNIZWlnaHQgPSAtMTsKKyAgICBzdHJpbmcgbGluZTsKKyAgICBzdHJpbmcgdHlwZTsKKyAgICBzaXplX3QgY2h1bmtMZW5ndGg7CisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdHlwZSA+PiBjaHVua0xlbmd0aDsKKyAgICAgICAgQVNTRVJUX0dUKGNodW5rTGVuZ3RoLCAwKSA8PCAiTGVuZ3RoIG9mIHRoZSBkYXRhIGNodW5rIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBuZXcgdWludDhfdFtjaHVua0xlbmd0aF07CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgY2h1bmtMZW5ndGg7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7CisgICAgICAgIHNpemVfdCBuYWxTaXplOworCisgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKWRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGNodW5rTGVuZ3RoKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICAgICAgc2l6ZV90IHNtYWxsQnVmZmVyU2l6ZSA9IGtTbWFsbEJ1ZmZlclNpemU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNhbml0eURhdGEgPSBuZXcgdWludDhfdFtzbWFsbEJ1ZmZlclNpemVdOworICAgICAgICBtZW1jcHkoKHZvaWQgKilzYW5pdHlEYXRhLCAodm9pZCAqKWRhdGEsIHNtYWxsQnVmZmVyU2l6ZSk7CisKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0TmV4dE5BTFVuaXQoJnNhbml0eURhdGEsICZzbWFsbEJ1ZmZlclNpemUsICZuYWxTdGFydCwgJm5hbFNpemUsIHRydWUpOworICAgICAgICBBU1NFUlRfRVEocmVzdWx0LCAtRUFHQUlOKSA8PCAiSW52YWxpZCByZXN1bHQgZm91bmQgd2hlbiB3cm9uZyBOQUwgdW5pdCBwYXNzZWQiOworCisgICAgICAgIHdoaWxlICghZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZjaHVua0xlbmd0aCwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgIG51bU5hbFVuaXRzKys7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIFNQUworICAgICAgICAgICAgaWYgKChuYWxTdGFydFswXSAmIGtTUFNtYXNrKSAhPSBrU1BTU3RhcnRDb2RlKSBjb250aW51ZTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKG5hbFNpemUgPiAwKSA8PCAiTkFMIHVuaXQgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gc3BzQnVmZmVyID0gbmV3IEFCdWZmZXIobmFsU2l6ZSk7CisgICAgICAgICAgICBBU1NFUlRfTkUoc3BzQnVmZmVyLCBudWxscHRyKSA8PCAiQUJ1ZmZlciByZXR1cm5lZCBudWxsIGZvciBzaXplOiAiIDw8IG5hbFNpemU7CisKKyAgICAgICAgICAgIG1lbWNweShzcHNCdWZmZXItPmRhdGEoKSwgbmFsU3RhcnQsIG5hbFNpemUpOworICAgICAgICAgICAgRmluZEFWQ0RpbWVuc2lvbnMoc3BzQnVmZmVyLCAmYXZjV2lkdGgsICZhdmNIZWlnaHQpOworICAgICAgICAgICAgc3BzQnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoYXZjV2lkdGgsIG1GcmFtZVdpZHRoKQorICAgICAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgd2lkdGg6ICIgPDwgbUZyYW1lV2lkdGggPDwgIkZvdW5kOiAiIDw8IGF2Y1dpZHRoOworCisgICAgICAgICAgICBBU1NFUlRfRVEoYXZjSGVpZ2h0LCBtRnJhbWVIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBoZWlnaHQ6ICIgPDwgbUZyYW1lSGVpZ2h0IDw8ICJGb3VuZDogIiA8PCBhdmNIZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gZGF0YTsKKyAgICB9CisgICAgaWYgKG1OYWxVbml0c0V4cGVjdGVkIDwgMCkgeworICAgICAgICBBU1NFUlRfR1QobnVtTmFsVW5pdHMsIDApIDw8ICJGYWlsZWQgdG8gZmluZCBhbiBOQUwgVW5pdCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKG51bU5hbFVuaXRzLCBtTmFsVW5pdHNFeHBlY3RlZCkKKyAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgbnVtYmVyIG9mIE5BTCB1bml0czogIiA8PCBtTmFsVW5pdHNFeHBlY3RlZAorICAgICAgICAgICAgICAgIDw8ICIgZm91bmQ6ICIgPDwgbnVtTmFsVW5pdHM7CisgICAgfQorfQorCitURVNUX1AoQXZjY0JveFRlc3QsIEF2Y2NCb3hWYWxpZGF0aW9uVGVzdCkgeworICAgIGludDMyX3QgYXZjV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IGF2Y0hlaWdodCA9IC0xOworICAgIGludDMyX3QgYWNjZXNzVW5pdExlbmd0aCA9IDA7CisgICAgaW50MzJfdCBwcm9maWxlID0gLTE7CisgICAgaW50MzJfdCBsZXZlbCA9IC0xOworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0eXBlOworICAgIHNpemVfdCBjaHVua0xlbmd0aDsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0eXBlID4+IGNodW5rTGVuZ3RoOworCisgICAgICAgIGlmICh0eXBlLmNvbXBhcmUoIlNQUyIpICYmIHR5cGUuY29tcGFyZSgiUFBTIikpIGNvbnRpbnVlOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgdGhlIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyI7CisKKyAgICAgICAgYWNjZXNzVW5pdExlbmd0aCArPSBjaHVua0xlbmd0aDsKKworICAgICAgICBpZiAoIXR5cGUuY29tcGFyZSgiU1BTIikpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBuZXcgdWludDhfdFtjaHVua0xlbmd0aF07CisgICAgICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBkYXRhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGNodW5rTGVuZ3RoOworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICAgICAgICAgIHNpemVfdCBuYWxTaXplOworCisgICAgICAgICAgICBtSW5wdXRGaWxlU3RyZWFtLnJlYWQoKGNoYXIgKilkYXRhLCAodWludDMyX3QpY2h1bmtMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGNodW5rTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBtSW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpOworCisgICAgICAgICAgICB3aGlsZSAoIWdldE5leHROQUxVbml0KCZkYXRhLCAmY2h1bmtMZW5ndGgsICZuYWxTdGFydCwgJm5hbFNpemUsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBTUFMKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShuYWxTaXplID4gMCAmJiAobmFsU3RhcnRbMF0gJiBrU1BTbWFzaykgPT0ga1NQU1N0YXJ0Q29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IFNQUyI7CisKKyAgICAgICAgICAgICAgICBBU1NFUlRfR0UobmFsU2l6ZSwgNCkgPDwgIlNQUyBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDQiOworCisgICAgICAgICAgICAgICAgcHJvZmlsZSA9IG5hbFN0YXJ0WzFdOworICAgICAgICAgICAgICAgIGxldmVsID0gbmFsU3RhcnRbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGVbXSBkYXRhOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgKmFjY2Vzc1VuaXREYXRhID0gbmV3IHVpbnQ4X3RbYWNjZXNzVW5pdExlbmd0aF07CisgICAgQVNTRVJUX05FKGFjY2Vzc1VuaXREYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGFjY2Vzc1VuaXRMZW5ndGg7CisKKyAgICBtSW5wdXRGaWxlU3RyZWFtLnNlZWtnKDAsIGlvczo6YmVnKTsKKyAgICBtSW5wdXRGaWxlU3RyZWFtLnJlYWQoKGNoYXIgKilhY2Nlc3NVbml0RGF0YSwgYWNjZXNzVW5pdExlbmd0aCk7CisgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGFjY2Vzc1VuaXRMZW5ndGgpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBtSW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpOworCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKGFjY2Vzc1VuaXRMZW5ndGgpOworICAgIEFTU0VSVF9ORShhY2Nlc3NVbml0LCBudWxscHRyKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgYW4gYW5kcm9pZCBkYXRhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGFjY2Vzc1VuaXRMZW5ndGg7CisKKyAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0RGF0YSwgYWNjZXNzVW5pdExlbmd0aCk7CisgICAgc3A8QUJ1ZmZlcj4gY3NkRGF0YUJ1ZmZlciA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShhY2Nlc3NVbml0LCAmYXZjV2lkdGgsICZhdmNIZWlnaHQpOworICAgIEFTU0VSVF9ORShjc2REYXRhQnVmZmVyLCBudWxscHRyKSA8PCAiTm8gZGF0YSByZXR1cm5lZCBmcm9tIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgpIjsKKworICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpIDw8ICJFeHBlY3RlZCB3aWR0aDogIiA8PCBtRnJhbWVXaWR0aCA8PCAiRm91bmQ6ICIgPDwgYXZjV2lkdGg7CisKKyAgICBBU1NFUlRfRVEoYXZjSGVpZ2h0LCBtRnJhbWVIZWlnaHQpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgaGVpZ2h0OiAiIDw8IG1GcmFtZUhlaWdodCA8PCAiRm91bmQ6ICIgPDwgYXZjSGVpZ2h0OworCisgICAgdWludDhfdCAqY3NkRGF0YSA9IGNzZERhdGFCdWZmZXItPmRhdGEoKTsKKyAgICBBU1NFUlRfRVEoKmNzZERhdGEsIGtDb25maWdWZXJzaW9uKSA8PCAiSW52YWxpZCBjb25maWd1cmF0aW9uIHZlcnNpb24iOworCisgICAgQVNTRVJUX0dFKGNzZERhdGFCdWZmZXItPnNpemUoKSwgNCkgPDwgIkNTRCBkYXRhIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNCI7CisKKyAgICBBU1NFUlRfRVEoKihjc2REYXRhICsgMSksIHByb2ZpbGUpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgQVZDIHByb2ZpbGU6ICIgPDwgcHJvZmlsZSA8PCAiIGZvdW5kOiAiIDw8ICooY3NkRGF0YSArIDEpOworCisgICAgQVNTRVJUX0VRKCooY3NkRGF0YSArIDMpLCBsZXZlbCkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBBVkMgbGV2ZWw6ICIgPDwgbGV2ZWwgPDwgIiBmb3VuZDogIiA8PCAqKGNzZERhdGEgKyAzKTsKKyAgICBjc2REYXRhQnVmZmVyLmNsZWFyKCk7CisgICAgZGVsZXRlW10gYWNjZXNzVW5pdERhdGE7CisgICAgYWNjZXNzVW5pdC5jbGVhcigpOworfQorCitURVNUX1AoQVZDRnJhbWVUZXN0LCBGcmFtZVRlc3QpIHsKKyAgICBzdHJpbmcgbGluZTsKKyAgICBzdHJpbmcgdHlwZTsKKyAgICBzaXplX3QgY2h1bmtMZW5ndGg7CisgICAgaW50MzJfdCBmcmFtZUxheWVySUQ7CisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICB1aW50MzJfdCBsYXllcklEID0gMDsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSBzdHJpbmdMaW5lKGxpbmUpOworICAgICAgICBzdHJpbmdMaW5lID4+IHR5cGUgPj4gY2h1bmtMZW5ndGggPj4gZnJhbWVMYXllcklEOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgdGhlIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyI7CisKKyAgICAgICAgY2hhciAqZGF0YSA9IG5ldyBjaGFyW2NodW5rTGVuZ3RoXTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGlvbiBkYXRhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGNodW5rTGVuZ3RoOworCisgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZChkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgIEFTU0VSVF9FUShtSW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpLCBjaHVua0xlbmd0aCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBtSW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpOworCisgICAgICAgIGlmICghdHlwZS5jb21wYXJlKCJJRFIiKSkgeworICAgICAgICAgICAgYm9vbCBpc0lEUiA9IElzSURSKCh1aW50OF90ICopZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXNJRFIpOworCisgICAgICAgICAgICBsYXllcklEID0gRmluZEFWQ0xheWVySWQoKHVpbnQ4X3QgKilkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEobGF5ZXJJRCwgZnJhbWVMYXllcklEKSA8PCAiV3JvbmcgbGF5ZXIgSUQgZm91bmQiOworICAgICAgICB9IGVsc2UgaWYgKCF0eXBlLmNvbXBhcmUoIlAiKSB8fCAhdHlwZS5jb21wYXJlKCJCIikpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoYWNjZXNzVW5pdCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgYWNjZXNzIFVuaXQiOworCisgICAgICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBib29sIGlzUmVmZXJlbmNlRnJhbWUgPSBJc0FWQ1JlZmVyZW5jZUZyYW1lKGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXNSZWZlcmVuY2VGcmFtZSk7CisKKyAgICAgICAgICAgIGFjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGxheWVySUQgPSBGaW5kQVZDTGF5ZXJJZCgodWludDhfdCAqKWRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShsYXllcklELCBmcmFtZUxheWVySUQpIDw8ICJXcm9uZyBsYXllciBJRCBmb3VuZCI7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gZGF0YTsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBVkNVdGlsc1Rlc3RBbGwsIE1wZWdBdWRpb1VuaXRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoMHhGRkZCOTIwNCwgNDE4LCA0NDEwMCwgMiwgMTI4LCAxMTUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDB4RkZGQjc2MDQsIDI4OSwgNDgwMDAsIDIsIDk2LCAxMTUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDB4RkZGRTU2MDQsIDE2NCwgNDgwMDAsIDIsIDE2MCwgMzg0KSkpOworCisvLyBJbmZvIEZpbGUgY29udGFpbnMgdGhlIHR5cGUgYW5kIGxlbmd0aCBmb3IgZWFjaCBjaHVuay9mcmFtZQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBBVkNVdGlsc1Rlc3RBbGwsIEFWQ0RpbWVuc2lvblRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF84eDhwNTBmMzJfMjAwa2Jwc19icC5pbmZvIiwgOCwgOCwgMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfNjQweDM2MHAyNGYzMDBfMTAwMGticHNfYnAuaW5mbyIsIDY0MCwgMzYwLCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmluZm8iLCAxMjgwLCA3MjAsIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzE5MjB4MTA4MHA1MGYzMDBfMTIwMDBrYnBzX2JwLmluZm8iLCAxOTIwLCAxMDgwLCAxNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8zODQweDIxNjBwNjBmMzAwXzY4MDAwa2Jwc19icC5pbmZvIiwgMzg0MCwgMjE2MCwgMTQpKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEFWQ1V0aWxzVGVzdEFsbCwgQXZjY0JveFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF84eDhwNTBmMzJfMjAwa2Jwc19icC5pbmZvIiwgOCwgOCwgMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xMjgweDcyMHAzMGYzMDBfNTAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5pbmZvIiwgMTI4MCwgNzIwLCAxMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MHA1MGYzMDBfMTIwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5pbmZvIiwgMTkyMCwgMTA4MCwgMTQpKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQVZDVXRpbHNUZXN0QWxsLCBWT0xEaW1lbnNpb25UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoInZvbERhdGFfNzIwXzQ4MCIsIDcyMCwgNDgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ2b2xEYXRhXzEyODBfNzIwIiwgMTI4MCwgNzIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ2b2xEYXRhXzE5MjBfMTA4MCIsIDE5MjAsIDEwODApKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSwgbGVuZ3RoIGFuZCBsYXllciBJRCBmb3IgZWFjaCBjaHVuay9mcmFtZQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEFWQ1V0aWxzVGVzdEFsbCwgQVZDRnJhbWVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmluZm8iKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IEFWQ1V0aWxzVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDBlNDgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQVZDVXRpbHNVbml0VGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBVkNVdGlsc1VuaXRUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA4OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIEFWQyBVdGlscyB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iQVZDVXRpbHNVbml0VGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQVZDVXRpbHNVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNVbml0VGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvQVZDVXRpbHNVbml0VGVzdC8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkFWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9BVkNVdGlsc1VuaXRUZXN0LyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWQ3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQVZDVXRpbHMgVGVzdAorVGhlIEFWQyBVdGlsaXR5IFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIGF2Y191dGlscyBsaWJyYXJpeSBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQVZDVXRpbHNVbml0VGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BVkNVdGlsc1VuaXRUZXN0L0FWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BVkNVdGlsc1VuaXRUZXN0L0FWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIEFWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBBVkNVdGlsc1VuaXRUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEFWQ1V0aWxzVW5pdFRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZjIxNTdjOS4uNDVlODFlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icApAQCAtMjUsMyArMjUsMzEgQEAKICAgICAgICAgIlV0aWxzX3Rlc3QuY3BwIiwKICAgICBdLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWV0YURhdGFCYXNlVW5pdFRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDEgPSAxOTIwOworY29uc3RleHByIGludDMyX3Qga0hlaWdodDEgPSAxMDgwOworY29uc3RleHByIGludDMyX3Qga1dpZHRoMiA9IDEyODA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MiA9IDkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDMgPSA3MjA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MyA9IDQ4MDsKK2NvbnN0ZXhwciBpbnQzMl90IGtQcm9maWxlID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtMZXZlbCA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBrUGxhdGZvcm1WYWx1ZSA9IDE7CisKKy8vIFJlY3RhbmdsZSBtYXJnaW5zCitjb25zdGV4cHIgaW50MzJfdCBrTGVmdCA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtUb3AgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmlnaHQgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrQm90dG9tID0gMTAwOworCitjb25zdGV4cHIgaW50NjRfdCBrRHVyYXRpb25VcyA9IDYwMDAwMDAwOworCitjb25zdGV4cHIgZmxvYXQga0NhcHR1cmVSYXRlID0gMzAuMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZXRhRGF0YUJhc2VVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ3JlYXRlTWV0YURhdGFCYXNlVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgLy8gVGVzdGluZyBjb3B5IGNvbnN0cnVjdG9yCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YUNvcHkgPSBtZXRhRGF0YTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGFDb3B5LCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEgY29weSI7CisKKyAgICBkZWxldGUgbWV0YURhdGE7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgU2V0QW5kRmluZERhdGFUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBTZXR0aW5nIHRoZSBkaWZmZXJlbnQga2V5LXZhbHVlIHBhaXIgdHlwZSBmb3IgZmlyc3QgdGltZSwgb3ZlcndyaXRlCisgICAgLy8gZXhwZWN0ZWQgdG8gYmUgZmFsc2UKKyAgICBib29sIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlNSU1FVHlwZSwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBrUHJvZmlsZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5VmlkZW9Qcm9maWxlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwga0xldmVsKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb0xldmVsLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwga0R1cmF0aW9uVXMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUR1cmF0aW9uLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCBrQ2FwdHVyZVJhdGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNhcHR1cmVGcmFtZXJhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBjb25zdCBpbnQzMl90ICpwbGF0Zm9ybSA9ICZrUGxhdGZvcm1WYWx1ZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAodm9pZCAqKXBsYXRmb3JtKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlQbGF0Zm9ybVByaXZhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGtMZWZ0LCBrVG9wLCBrUmlnaHQsIGtCb3R0b20pOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNyb3BSZWN0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgLy8gRHVtcCB0byBsb2cgZm9yIHJlZmVyZW5jZQorICAgIG1ldGFEYXRhLT5kdW1wVG9Mb2coKTsKKworICAgIC8vIEZpbmQgdGhlIGRhdGEgd2hpY2ggd2FzIHNldAorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlNSU1FVHlwZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSA8PCAiSW5jb3JyZWN0IG1pbWUgdHlwZSByZXR1cm5lZCI7CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHByb2ZpbGUsIGxldmVsOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlXaWR0aCBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEod2lkdGgsIGtXaWR0aDEpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2Ygd2lkdGggcmV0dXJuZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5SGVpZ2h0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShoZWlnaHQsIGtIZWlnaHQxKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGhlaWdodCByZXR1cm5lZCI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZwcm9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5VmlkZW9Qcm9maWxlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShwcm9maWxlLCBrUHJvZmlsZSkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBwcm9maWxlIHJldHVybmVkIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZsZXZlbCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVZpZGVvTGV2ZWwga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGxldmVsLCBrTGV2ZWwpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgbGV2ZWwgcmV0dXJuZWQiOworCisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5RHVyYXRpb24ga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGR1cmF0aW9uLCBrRHVyYXRpb25VcykgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBkdXJhdGlvbiByZXR1cm5lZCI7CisKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmZyYW1lUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNhcHR1cmVGcmFtZXJhdGUga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGZyYW1lUmF0ZSwga0NhcHR1cmVSYXRlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGNhcHR1cmVGcmFtZVJhdGUgcmV0dXJuZWQiOworCisgICAgaW50MzJfdCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRSZWN0KGtLZXlDcm9wUmVjdCwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNyb3BSZWN0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShsZWZ0LCBrTGVmdCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBsZWZ0IG1hcmdpbiByZXR1cm5lZCI7CisgICAgQVNTRVJUX0VRKHRvcCwga1RvcCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiB0b3AgbWFyZ2luIHJldHVybmVkIjsKKyAgICBBU1NFUlRfRVEocmlnaHQsIGtSaWdodCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiByaWdodCBtYXJnaW4gcmV0dXJuZWQiOworICAgIEFTU0VSVF9FUShib3R0b20sIGtCb3R0b20pIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgYm90dG9tIG1hcmdpbiByZXR1cm5lZCI7CisKKyAgICB2b2lkICpwbGF0Zm9ybVZhbHVlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kUG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAmcGxhdGZvcm1WYWx1ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVBsYXRmb3JtUHJpdmF0ZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEocGxhdGZvcm1WYWx1ZSwgJmtQbGF0Zm9ybVZhbHVlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIHBvaW50ZXIgcmV0dXJuZWQiOworCisgICAgLy8gQ2hlY2sgZm9yIHRoZSBrZXkgd2hpY2ggaXMgbm90IGFkZGVkIHRvIG1ldGFkYXRhCisgICAgaW50MzJfdCBhbmdsZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJmFuZ2xlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiVmFsdWUgZm9yIGFuIGludmFsaWQga2V5IGlzIHJldHVybmVkIHdoZW4gdGhlIGtleSBpcyBub3Qgc2V0IjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIE92ZXJXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBzZXQvc2V0L3JlYWQgdG8gY2hlY2sgZmlyc3Qgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleU1JTUVUeXBlIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gQ2hlY2sgdGhlIHZhbHVlCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleU1JTUVUeXBlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9TVFJFUShtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSA8PCAiTWltZSB2YWx1ZSBpcyBub3Qgb3ZlcndyaXR0ZW4iOworCisgICAgLy8gc2V0L3NldC9zZXQvcmVhZCB0byBjaGVjayBzZWNvbmQgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlXaWR0aCBhZ2Fpbiwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIHRydWUiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0Mik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiU2V0dGluZyBrS2V5SGVpZ2h0IGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gT3ZlcndyaXRlIHRoZSB2YWx1ZSBhZ2FpbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleVdpZHRoIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlIZWlnaHQgYWdhaW4sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSB0cnVlIjsKKyAgICAvLyBDaGVjayB0aGUgdmFsdWUKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVdpZHRoIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUSh3aWR0aCwga1dpZHRoMykgPDwgIlZhbHVlIG9mIHdpZHRoIGlzIG5vdCBvdmVyd3JpdHRlbiI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlIZWlnaHQga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGhlaWdodCwga0hlaWdodDMpIDw8ICJWYWx1ZSBvZiBoZWlnaHQgaXMgbm90IG92ZXJ3cml0dGVuIjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIFJlbW92ZUtleVRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIk1ldGFEYXRhIGRvZXMgbm90IGhhdmUgdGhlIG1pbWUga2V5IjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBrS2V5TUlNRVR5cGUga2V5IjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNZXRhRGF0YSBoYXMgbWltZSBrZXkgYWZ0ZXIgcmVtb3ZpbmcgaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFJlbW92ZSB0aGUgbm9uIGV4aXN0aW5nIGtleQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiUmVtb3ZlZCB0aGUgbm9uIGV4aXN0aW5nIGtleSI7CisKKyAgICAvLyBDaGVjayBvdmVyd3JpdGluZyB0aGUgcmVtb3ZlZCBrZXkKKyAgICBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJPdmVyd3JpdGUgc2hvdWxkIGJlIGZhbHNlIHNpbmNlIHRoZSBrZXkgd2FzIHJlbW92ZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICAvLyBDbGVhciB3aG9sZSBtZXRhZGF0YQorICAgIG1ldGFEYXRhLT5jbGVhcigpOworCisgICAgLy8gQ2hlY2sgZmluZGluZyBrZXkgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWV0YURhdGEgZm91bmQga0tleVdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5V2lkdGgpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIHdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIG1pbWUga2V5IGFmdGVyIGNsZWFyaW5nIGFsbCB0aGUgaXRlbXMgaW4gaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIENoZWNrIHJlbW92aW5nIGtleSBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+cmVtb3ZlKGtLZXlNSU1FVHlwZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIlJlbW92ZWQgdGhlIGtleSwgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhIjsKKworICAgIC8vIENoZWNraW5nIHNldCBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ29udmVydFRvU3RyaW5nVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgU3RyaW5nOCBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0VRKGluZm8ubGVuZ3RoKCksIDApIDw8ICJFbXB0eSBNZXRhRGF0YSBsZW5ndGggaXMgbm9uLXplcm86ICIgPDwgaW5mby5sZW5ndGgoKTsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlIZWlnaHQsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGtQcm9maWxlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb1Byb2ZpbGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBrTGV2ZWwpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVZpZGVvTGV2ZWwsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0dUKGluZm8ubGVuZ3RoKCksIDApIDw8ICJNZXRhRGF0YSBjb250YWlucyBubyBpbmZvcm1hdGlvbiI7CisKKyAgICAvLyBEdW1wIHRvIGxvZyBmb3IgcmVmZXJlbmNlCisgICAgbWV0YURhdGEtPmR1bXBUb0xvZygpOworCisgICAgLy8gQ2xlYXIgd2hvbGUgbWV0YWRhdGEKKyAgICBtZXRhRGF0YS0+Y2xlYXIoKTsKKworICAgIGluZm8gPSBtZXRhRGF0YS0+dG9TdHJpbmcoKTsKKyAgICBBU1NFUlRfRVEoaW5mby5sZW5ndGgoKSwgMCkgPDwgIk1ldGFEYXRhIGxlbmd0aCBpcyBub24temVybyBhZnRlciBjbGVhcmluZyBpdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmZvLmxlbmd0aCgpOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMjUxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIk9wdXNIZWFkZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk9wdXNIZWFkZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWUxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBvcHVzIGhlYWRlciB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXIuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWM5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3QuY3BwCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPcHVzSGVhZGVyVGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvT3B1c091dHB1dCIKKworLy8gT3B1cyBpbiBXZWJNIGlzIGEgd2VsbC1rbm93biwgeWV0IHVuZGVyLWRvY3VtZW50ZWQsIGZvcm1hdC4gVGhlIGNvZGVjIHByaXZhdGUgZGF0YQorLy8gb2YgdGhlIHRyYWNrIGlzIGFuIE9wdXMgT2dnIGhlYWRlciAoaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc4NDUjc2VjdGlvbi01LjEpCisvLyBjaGFubmVsIG1hcHBpbmcgb2Zmc2V0IGluIG9wdXMgaGVhZGVyCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0gMjE7Citjb25zdGV4cHIgc2l6ZV90IGtNYXhPcHVzSGVhZGVyU2l6ZSA9IDEwMDsKKy8vIEFPUFVTSERSICsgQU9QVVNIRFJMZW5ndGggKworLy8gKDggKyA4ICkgKworLy8gSGVhZGVyKGNzZCkgKyBudW1fc3RyZWFtcyArIG51bV9jb3VwbGVkICsgMQorLy8gKDE5ICsgMSArIDEgKyAxKSArCisvLyBBT1BVU0RMWSArIEFPUFVTRExZTGVuZ3RoICsgREVMQVkgKyBBT1BVU1BSTCArIEFPUFVTUFJMTGVuZ3RoICsgUFJMCisvLyAoOCArIDggKyA4ICsgOCArIDggKyA4KQorLy8gPSA4NgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxNYXBPZmZzZXQgPSA4NjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKK2NvbnN0ZXhwciB1aW50NjRfdCBrT3B1c1NlZWtQcmVyb2xsTnMgPSA4MDAwMDAwMDsKK2NvbnN0ZXhwciBpbnQ2NF90IGtOc2VjUGVyU2VjID0gMTAwMDAwMDAwMGxsOworCisvLyBPcHVzIHVzZXMgVm9yYmlzIGNoYW5uZWwgbWFwcGluZywgYW5kIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcgc3BlY2lmaWVzCisvLyBtYXBwaW5ncyBmb3IgdXAgdG8gOCBjaGFubmVscy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXJ0IG9mIHRoZSBWb3JiaXMgSQorLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly93d3cueGlwaC5vcmcvdm9yYmlzL2RvYy9Wb3JiaXNfSV9zcGVjLmh0bWwKK2NvbnN0ZXhwciBpbnQga01heENoYW5uZWxzID0gODsKK2NvbnN0ZXhwciB1aW50OF90IGtPcHVzQ2hhbm5lbE1hcFtrTWF4Q2hhbm5lbHNdW2tNYXhDaGFubmVsc10gPSB7CisgICAgICAgIHswfSwKKyAgICAgICAgezAsIDF9LAorICAgICAgICB7MCwgMiwgMX0sCisgICAgICAgIHswLCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDN9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNX0sCisgICAgICAgIHswLCA0LCAxLCAyLCAzLCA1LCA2fSwKKyAgICAgICAgezAsIDYsIDEsIDIsIDMsIDQsIDUsIDd9LAorfTsKKworc3RhdGljIE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBPcHVzSGVhZGVyVGVzdCB7CisgIHB1YmxpYzoKKyAgICBPcHVzSGVhZGVyVGVzdCgpIDogbUlucHV0QnVmZmVyKG51bGxwdHIpIHt9CisKKyAgICB+T3B1c0hlYWRlclRlc3QoKSB7CisgICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07CisgICAgdWludDhfdCAqbUlucHV0QnVmZmVyOworfTsKKworY2xhc3MgT3B1c0hlYWRlclBhcnNlVGVzdCA6IHB1YmxpYyBPcHVzSGVhZGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8c3RyaW5nIC8qIElucHV0RmlsZU5hbWUgKi8sIGludDMyX3QgLyogQ2hhbm5lbENvdW50ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKiBpc0hlYWRlclZhbGlkICovLCBib29sIC8qIGlzQ29kZWNEZWxheVZhbGlkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKiBpc1NlZWtQcmVSb2xsVmFsaWQgKi8sIGJvb2wgLyogaXNJbnB1dFZhbGlkICovPj4geworfTsKKworY2xhc3MgT3B1c0hlYWRlcldyaXRlVGVzdAorICAgIDogcHVibGljIE9wdXNIZWFkZXJUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxpbnQzMl90IC8qIENoYW5uZWxDb3VudCAqLywgaW50MzJfdCAvKiBza2lwU2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIC8qIHJlZmVyZW5jZUZpbGUgKi8+PiB7fTsKKworVEVTVF9QKE9wdXNIZWFkZXJXcml0ZVRlc3QsIFdyaXRlVGVzdCkgeworICAgIHR1cGxlPGludDMyX3QsIGludDMyX3QsIHN0cmluZz4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBPcHVzSGVhZGVyIHdyaXR0ZW5IZWFkZXI7CisgICAgbWVtc2V0KCZ3cml0dGVuSGVhZGVyLCAwLCBzaXplb2Yod3JpdHRlbkhlYWRlcikpOworICAgIGludDMyX3QgY2hhbm5lbHMgPSBnZXQ8MD4ocGFyYW1zKTsKKyAgICB3cml0dGVuSGVhZGVyLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgd3JpdHRlbkhlYWRlci5udW1fc3RyZWFtcyA9IGNoYW5uZWxzOworICAgIHdyaXR0ZW5IZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChjaGFubmVscyA+IDgpID8gMjU1IDogKGNoYW5uZWxzID4gMikpOworICAgIGludDMyX3Qgc2tpcFNhbXBsZXMgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICBzdHJpbmcgcmVmZXJlbmNlRmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwyPihwYXJhbXMpOworICAgIHdyaXR0ZW5IZWFkZXIuc2tpcF9zYW1wbGVzID0gc2tpcFNhbXBsZXM7CisgICAgdWludDY0X3QgY29kZWNEZWxheU5zID0gc2tpcFNhbXBsZXMgKiBrTnNlY1BlclNlYyAvIGtPcHVzU2FtcGxlUmF0ZTsKKyAgICB1aW50OF90IGhlYWRlckRhdGFba01heE9wdXNIZWFkZXJTaXplXTsKKyAgICBpbnQzMl90IGhlYWRlclNpemUgPSBXcml0ZU9wdXNIZWFkZXJzKHdyaXR0ZW5IZWFkZXIsIGtPcHVzU2FtcGxlUmF0ZSwgaGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXJEYXRhKSwgY29kZWNEZWxheU5zLCBrT3B1c1NlZWtQcmVyb2xsTnMpOworICAgIEFTU0VSVF9HVChoZWFkZXJTaXplLCAwKSA8PCAiZmFpbGVkIHRvIGdlbmVyYXRlIE9wdXMgaGVhZGVyIjsKKyAgICBBU1NFUlRfTEUoaGVhZGVyU2l6ZSwga01heE9wdXNIZWFkZXJTaXplKQorICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIHdyaXR0ZW4uIEhlYWRlciBzaXplIGNhbid0IGV4Y2VlZCBrTWF4T3B1c0hlYWRlclNpemUiOworCisgICAgb2ZzdHJlYW0gb3N0cm07CisgICAgb3N0cm0ub3BlbihPVVRQVVRfRklMRV9OQU1FLCBvZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfVFJVRShvc3RybS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUU7CisgICAgb3N0cm0ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KGhlYWRlckRhdGEpLCBoZWFkZXJTaXplKTsKKyAgICBvc3RybS5jbG9zZSgpOworCisgICAgbUVsZVN0cmVhbS5vcGVuKHJlZmVyZW5jZUZpbGVOYW1lLCBpZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiByZWZlcmVuY2VGaWxlTmFtZSAiIDw8IGdldDwyPihwYXJhbXMpOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludDMyX3Qgc3RhdFN0YXR1cyA9IHN0YXQocmVmZXJlbmNlRmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgQVNTRVJUX0VRKHN0YXRTdGF0dXMsIDApIDw8ICJVbmFibGUgdG8gZ2V0IGZpbGUgcHJvcGVydGllcyI7CisKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBtSW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZSk7CisgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkluc3VmZmljaWVudCBtZW1vcnkuIE1hbGxvYyBmYWlsZWQgZm9yIHNpemUgIiA8PCBmaWxlU2l6ZTsKKworICAgIG1FbGVTdHJlYW0ucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4obUlucHV0QnVmZmVyKSwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBmaWxlU2l6ZSkgPDwgIm1FbGVTdHJlYW0uZ2NvdW50KCkgIT0gYnl0ZXNDb3VudCI7CisKKyAgICBBU1NFUlRfRVEoZmlsZVNpemUsIGhlYWRlclNpemUpCisgICAgICAgICAgICA8PCAiTWlzbWF0Y2ggaW4gc2l6ZSBiZXR3ZWVuIGhlYWRlciBnZW5lcmF0ZWQgYW5kIHJlZmVyZW5jZSBoZWFkZXIiOworICAgIGludDMyX3QgbWF0Y2ggPSBtZW1jbXAocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KG1JbnB1dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIgKj4oaGVhZGVyRGF0YSksIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEobWF0Y2gsIDApIDw8ICJPcHVzIGhlYWRlciBkb2VzIG5vdCBtYXRjaCByZWZlcmVuY2UgZmlsZTogIiA8PCByZWZlcmVuY2VGaWxlTmFtZTsKKworICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBudWxscHRyOworICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBudWxscHRyOworICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gbnVsbHB0cjsKKyAgICBib29sIHN0YXR1cyA9IEdldE9wdXNIZWFkZXJCdWZmZXJzKGhlYWRlckRhdGEsIGhlYWRlclNpemUsICZvcHVzSGVhZEJ1ZiwgJm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmLCAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkVuY291bnRlcmVkIGVycm9yIGluIEdldE9wdXNIZWFkZXJCdWZmZXJzIjsKKworICAgIHVpbnQ2NF90IHZhbHVlID0gKigodWludDY0X3QgKiljb2RlY0RlbGF5QnVmKTsKKyAgICBBU1NFUlRfRVEodmFsdWUsIGNvZGVjRGVsYXlOcyk7CisKKyAgICB2YWx1ZSA9ICooKHVpbnQ2NF90ICopc2Vla1ByZVJvbGxCdWYpOworICAgIEFTU0VSVF9FUSh2YWx1ZSwga09wdXNTZWVrUHJlcm9sbE5zKTsKKworICAgIE9wdXNIZWFkZXIgcGFyc2VkSGVhZGVyOworICAgIHN0YXR1cyA9IFBhcnNlT3B1c0hlYWRlcigodWludDhfdCAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUsICZwYXJzZWRIZWFkZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIFBhcnNpbmcgT3B1cyBIZWFkZXIuIjsKKworICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLmNoYW5uZWxzLCBwYXJzZWRIZWFkZXIuY2hhbm5lbHMpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWwgY291bnRzIjsKKworICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLnNraXBfc2FtcGxlcywgcGFyc2VkSGVhZGVyLnNraXBfc2FtcGxlcykKKyAgICAgICAgICAgIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIG5vIG9mIHNraXBTYW1wbGVzIHdyaXR0ZW4gIgorICAgICAgICAgICAgICAgImFuZCBubyBvZiBza2lwU2FtcGxlcyBnb3QgYWZ0ZXIgcGFyc2luZyI7CisKKyAgICBBU1NFUlRfRVEod3JpdHRlbkhlYWRlci5jaGFubmVsX21hcHBpbmcsIHBhcnNlZEhlYWRlci5jaGFubmVsX21hcHBpbmcpCisgICAgICAgICAgICA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBjaGFubmVsTWFwcGluZyB3cml0dGVuICIKKyAgICAgICAgICAgICAgICJhbmQgY2hhbm5lbE1hcHBpbmcgZ290IGFmdGVyIHBhcnNpbmciOworCisgICAgaWYgKHBhcnNlZEhlYWRlci5jaGFubmVsX21hcHBpbmcpIHsKKyAgICAgICAgQVNTRVJUX0dUKHBhcnNlZEhlYWRlci5jaGFubmVscywgMik7CisgICAgICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLm51bV9zdHJlYW1zLCBwYXJzZWRIZWFkZXIubnVtX3N0cmVhbXMpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gTWlzbWF0Y2ggYmV0d2VlbiBjaGFubmVsIGNvdW50cyI7CisKKyAgICAgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIubnVtX2NvdXBsZWQsIHBhcnNlZEhlYWRlci5udW1fY291cGxlZCkKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWwgY291bnRzIjsKKworICAgICAgICBBU1NFUlRfRVEocGFyc2VkSGVhZGVyLm51bV9jb3VwbGVkICsgcGFyc2VkSGVhZGVyLm51bV9zdHJlYW1zLCBwYXJzZWRIZWFkZXIuY2hhbm5lbHMpOworCisgICAgICAgIEFTU0VSVF9MRShwYXJzZWRIZWFkZXIubnVtX2NvdXBsZWQsIHBhcnNlZEhlYWRlci5udW1fc3RyZWFtcykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBOdW1iZXIgb2YgY291cGxlZCBzdHJlYW1zIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICJudW1iZXIgIgorICAgICAgICAgICAgICAgICAgICJvZiBzdHJlYW1zLiI7CisKKyAgICAgICAgQVNTRVJUX0VRKGhlYWRlclNpemUsIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcE9mZnNldCArIHdyaXR0ZW5IZWFkZXIuY2hhbm5lbHMpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIHdyaXR0ZW4uIEhlYWRlciBzaXplIHNob3VsZCBiZSBlcXVhbCB0byA4NiArICIKKyAgICAgICAgICAgICAgICAgICAid3JpdHRlbkhlYWRlci5jaGFubmVscyI7CisKKyAgICAgICAgdWludDhfdCBtYXBwZWRDaGFubmVsTnVtYmVyOworICAgICAgICBmb3IgKGludDMyX3QgY2hhbm5lbE51bWJlciA9IDA7IGNoYW5uZWxOdW1iZXIgPCBjaGFubmVsczsgY2hhbm5lbE51bWJlcisrKSB7CisgICAgICAgICAgICBtYXBwZWRDaGFubmVsTnVtYmVyID0gKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4ob3B1c0hlYWRCdWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgY2hhbm5lbE51bWJlcik7CisgICAgICAgICAgICBBU1NFUlRfTFQobWFwcGVkQ2hhbm5lbE51bWJlciwgY2hhbm5lbHMpIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIENoYW5uZWwgbWFwcGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGNoYW5uZWwgY291bnQuIjsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG1hcHBlZENoYW5uZWxOdW1iZXIsIGtPcHVzQ2hhbm5lbE1hcFtjaGFubmVscyAtIDFdW2NoYW5uZWxOdW1iZXJdKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBDaGFubmVsIG1hcHBpbmcgaXMgbm90IGFzIHBlciBzcGVjaWZpY2F0aW9uLiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTEUocGFyc2VkSGVhZGVyLmNoYW5uZWxzLCAyKTsKKyAgICB9Cit9CisKK1RFU1RfUChPcHVzSGVhZGVyUGFyc2VUZXN0LCBQYXJzZVRlc3QpIHsKKyAgICB0dXBsZTxzdHJpbmcsIGludDMyX3QsIGJvb2wsIGJvb2wsIGJvb2wsIGJvb2w+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwwPihwYXJhbXMpOworICAgIG1FbGVTdHJlYW0ub3BlbihpbnB1dEZpbGVOYW1lLCBpZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiBpbnB1dGZpbGUgIiA8PCBnZXQ8MD4ocGFyYW1zKTsKKyAgICBib29sIGlzSGVhZGVyVmFsaWQgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBib29sIGlzQ29kZWNEZWxheVZhbGlkID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgYm9vbCBpc1NlZWtQcmVSb2xsVmFsaWQgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICBib29sIGlzSW5wdXRWYWxpZCA9IGdldDw1PihwYXJhbXMpOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXQoaW5wdXRGaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBtSW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZSk7CisgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkluc3VmZmljaWVudCBtZW1vcnkuIE1hbGxvYyBmYWlsZWQgZm9yIHNpemUgIiA8PCBmaWxlU2l6ZTsKKworICAgIG1FbGVTdHJlYW0ucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4obUlucHV0QnVmZmVyKSwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBmaWxlU2l6ZSkgPDwgIm1FbGVTdHJlYW0uZ2NvdW50KCkgIT0gYnl0ZXNDb3VudCI7CisKKyAgICBPcHVzSGVhZGVyIGhlYWRlcjsKKyAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgIHNpemVfdCBzZWVrUHJlUm9sbEJ1ZlNpemUgPSAwOworICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gbnVsbHB0cjsKKyAgICB2b2lkICpjb2RlY0RlbGF5QnVmID0gbnVsbHB0cjsKKyAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IG51bGxwdHI7CisgICAgYm9vbCBzdGF0dXMgPSBHZXRPcHVzSGVhZGVyQnVmZmVycyhtSW5wdXRCdWZmZXIsIGZpbGVTaXplLCAmb3B1c0hlYWRCdWYsICZvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNEZWxheUJ1ZiwgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vla1ByZVJvbGxCdWZTaXplKTsKKyAgICBpZiAoIWlzSGVhZGVyVmFsaWQpIHsKKyAgICAgICAgQVNTRVJUX0VRKG9wdXNIZWFkQnVmLCBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTkUob3B1c0hlYWRCdWYsIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAoIWlzQ29kZWNEZWxheVZhbGlkKSB7CisgICAgICAgIEFTU0VSVF9FUShjb2RlY0RlbGF5QnVmLCBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTkUoY29kZWNEZWxheUJ1ZiwgbnVsbHB0cik7CisgICAgfQorICAgIGlmICghaXNTZWVrUHJlUm9sbFZhbGlkKSB7CisgICAgICAgIEFTU0VSVF9FUShzZWVrUHJlUm9sbEJ1ZiwgbnVsbHB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05FKHNlZWtQcmVSb2xsQnVmLCBudWxscHRyKTsKKyAgICB9CisgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGlzSW5wdXRWYWxpZCkgPDwgIkdldE9wdXNIZWFkZXJCdWZmZXJzIGZhaWxlZCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBQYXJzZU9wdXNIZWFkZXIoKHVpbnQ4X3QgKilvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplLCAmaGVhZGVyKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaXNJbnB1dFZhbGlkKSA8PCAiUGFyc2Ugb3B1cyBoZWFkZXIgZGlkbid0IGZhaWwgZm9yIGludmFsaWQgaW5wdXQiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShpc0lucHV0VmFsaWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBjaGFubmVscyA9IGdldDwxPihwYXJhbXMpOworICAgIEFTU0VSVF9FUShoZWFkZXIuY2hhbm5lbHMsIGNoYW5uZWxzKSA8PCAiUGFyc2VyIHJldHVybmVkIGludmFsaWQgY2hhbm5lbCBjb3VudCI7CisgICAgQVNTRVJUX0xFKGhlYWRlci5jaGFubmVscywga01heENoYW5uZWxzKTsKKworICAgIEFTU0VSVF9MRShoZWFkZXIubnVtX2NvdXBsZWQsIGhlYWRlci5udW1fc3RyZWFtcykKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE51bWJlciBvZiBjb3VwbGVkIHN0cmVhbXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBudW1iZXIgIgorICAgICAgICAgICAgICAgIm9mIHN0cmVhbXMuIjsKKworICAgIEFTU0VSVF9FUShoZWFkZXIubnVtX2NvdXBsZWQgKyBoZWFkZXIubnVtX3N0cmVhbXMsIGhlYWRlci5jaGFubmVscyk7CisKKyAgICBpZiAoaGVhZGVyLmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICB1aW50OF90IG1hcHBlZENoYW5uZWxOdW1iZXI7CisgICAgICAgIGZvciAoaW50MzJfdCBjaGFubmVsTnVtYmVyID0gMDsgY2hhbm5lbE51bWJlciA8IGNoYW5uZWxzOyBjaGFubmVsTnVtYmVyKyspIHsKKyAgICAgICAgICAgIG1hcHBlZENoYW5uZWxOdW1iZXIgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihvcHVzSGVhZEJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBjaGFubmVsTnVtYmVyKTsKKyAgICAgICAgICAgIEFTU0VSVF9MVChtYXBwZWRDaGFubmVsTnVtYmVyLCBjaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyLiBDaGFubmVsIG1hcHBpbmcgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBjaGFubmVsIGNvdW50LiI7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShtYXBwZWRDaGFubmVsTnVtYmVyLCBrT3B1c0NoYW5uZWxNYXBbY2hhbm5lbHMgLSAxXVtjaGFubmVsTnVtYmVyXSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gQ2hhbm5lbCBtYXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhcyBwZXIgc3BlY2lmaWNhdGlvbi4iOworICAgICAgICB9CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIE9wdXNIZWFkZXJUZXN0QWxsLCBPcHVzSGVhZGVyV3JpdGVUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKDEsIDMxMiwgIm91dHB1dF9jaGFubmVsc18xc2tpcFNhbXBsZXNfMzEyLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgyLCAzMTIsICJvdXRwdXRfY2hhbm5lbHNfMnNraXBTYW1wbGVzXzMxMi5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNSwgMzEyLCAib3V0cHV0X2NoYW5uZWxzXzVza2lwU2FtcGxlc18zMTIub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDYsIDMxMiwgIm91dHB1dF9jaGFubmVsc182c2tpcFNhbXBsZXNfMzEyLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgxLCAwLCAib3V0cHV0X2NoYW5uZWxzXzFza2lwU2FtcGxlc18wLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgyLCAwLCAib3V0cHV0X2NoYW5uZWxzXzJza2lwU2FtcGxlc18wLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg1LCAwLCAib3V0cHV0X2NoYW5uZWxzXzVza2lwU2FtcGxlc18wLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg2LCAwLCAib3V0cHV0X2NoYW5uZWxzXzZza2lwU2FtcGxlc18wLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgxLCA2MjQsICJvdXRwdXRfY2hhbm5lbHNfMXNraXBTYW1wbGVzXzYyNC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMiwgNjI0LCAib3V0cHV0X2NoYW5uZWxzXzJza2lwU2FtcGxlc182MjQub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDUsIDYyNCwgIm91dHB1dF9jaGFubmVsc181c2tpcFNhbXBsZXNfNjI0Lm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg2LCA2MjQsICJvdXRwdXRfY2hhbm5lbHNfNnNraXBTYW1wbGVzXzYyNC5vcHVzIikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBPcHVzSGVhZGVyVGVzdEFsbCwgT3B1c0hlYWRlclBhcnNlVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX3ZhbGlkX3NpemU4M0Iub3B1cyIsIDIsIHRydWUsIHRydWUsIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF92YWxpZF9zaXplODhCLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI1Y2hfdmFsaWQub3B1cyIsIDUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNmNoX3ZhbGlkLm9wdXMiLCA2LCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjFjaF92YWxpZC5vcHVzIiwgMSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfdmFsaWQub3B1cyIsIDIsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfc2l6ZS5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX3N0cmVhbXMub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI1Y2hfaW52YWxpZF9jaGFubmVsbWFwcGluZy5vcHVzIiwgNSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNWNoX2ludmFsaWRfY291cGxlZHN0cmVhbXMub3B1cyIsIDUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjZjaF9pbnZhbGlkX2NoYW5uZWxtYXBwaW5nLm9wdXMiLCA2LCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI5Y2hfaW52YWxpZF9jaGFubmVscy5vcHVzIiwgOSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlci5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlcmxlbmd0aF8xNi5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlcmxlbmd0aF8yNTYub3B1cyIsIDIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfaW52YWxpZF9zaXplLm9wdXMiLCAyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfY2hhbm5lbG1hcHBpbmdfMC5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2NvdXBsZWRzdHJlYW1zLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVybGVuZ3RoLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVyU2l6ZTEub3B1cyIsIDMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9oZWFkZXJTaXplMi5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2hlYWRlclNpemUzLm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfbm9kZWxheS5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX25vcHJlcm9sbC5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR0QoIk9wdXMgSGVhZGVyIFRlc3QgUmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE2M2MzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX09QVVNfSEVBREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fT1BVU19IRUFERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX09QVVNfSEVBREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjBjODI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgT3B1cyBIZWFkZXIKK1RoZSBPcHVzSGVhZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBPUFVTIGhlYWRlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIE9wdXNIZWFkZXJUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L09wdXNIZWFkZXJUZXN0L09wdXNIZWFkZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvT3B1c0hlYWRlclRlc3QvT3B1c0hlYWRlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlci56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggT3B1c0hlYWRlciAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE9wdXNIZWFkZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBPcHVzSGVhZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVHlwZVRyYWl0c190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVHlwZVRyYWl0c190ZXN0LmNwcAppbmRleCAxZTIwNDlkLi5kNTM4M2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1R5cGVUcmFpdHNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9UeXBlVHJhaXRzX3Rlc3QuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAgICAgZW51bSBJQSA6IGludDMyX3QgeyB9OwogfTsKIAotLy8gPT09PT09PT09PT0gYmFzaWMgc2FuaXR5IHRlc3RzIGZvciB0eXBlLXN1cHBvcnQgdGVtcGxhdGVzCisvLyA9PT09PT09PT09PSBiYXNpYyB0ZXN0cyBmb3IgdHlwZS1zdXBwb3J0IHRlbXBsYXRlcwogVEVTVF9GKFR5cGVUcmFpdHNUZXN0LCBTdGF0aWNUZXN0cykgewogCiAgICAgLy8gPT09PT09PT09PT09IGlzX2ludGVncmFsX29yX2VudW0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3ZjQwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQ29sb3JVdGlsc1Rlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQ29sb3JVdGlsc1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0NvbG9yVXRpbHNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9Db2xvclV0aWxzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MDJiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9Db2xvclV0aWxzVGVzdC5jcHAKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvbG9yVXRpbHNUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworY29uc3Qgc2l6ZV90IGtIRFJCdWZmZXJTaXplID0gMjU7Citjb25zdCB1aW50MTZfdCBrSERSSW5mb1Rlc3RWYWx1ZTEgPSA0MjA7Citjb25zdCB1aW50MTZfdCBrSERSSW5mb1Rlc3RWYWx1ZTIgPSA0MjA2OTsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3R5cGVkZWYgQ29sb3JBc3BlY3RzIENBOworCitjbGFzcyBDb2xvclJhbmdlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08LyogQ29sb3JSYW5nZSAqLyBDQTo6UmFuZ2U+IHsKKyAgcHVibGljOgorICAgIENvbG9yUmFuZ2VUZXN0KCkgeyBtUmFuZ2UgPSBHZXRQYXJhbSgpOyB9OworCisgICAgQ0E6OlJhbmdlIG1SYW5nZTsKK307CisKK2NsYXNzIENvbG9yVHJhbnNmZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwvKiBDb2xvclRyYW5zZmVyICovIENBOjpUcmFuc2Zlcj4geworICBwdWJsaWM6CisgICAgQ29sb3JUcmFuc2ZlclRlc3QoKSB7IG1UcmFuc2ZlciA9IEdldFBhcmFtKCk7IH07CisKKyAgICBDQTo6VHJhbnNmZXIgbVRyYW5zZmVyOworfTsKKworY2xhc3MgQ29sb3JTdGFuZGFyZFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcz4+IHsKKyAgcHVibGljOgorICAgIENvbG9yU3RhbmRhcmRUZXN0KCkgeworICAgICAgICBtUHJpbWFyaWVzID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICAgICAgbU1hdHJpeENvZWZmcyA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIH07CisKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworfTsKKworY2xhc3MgSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgKi8gQ0E6OlRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhbmRhcmQgKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgKi8gaW50MzJfdD4+IHsKKyAgcHVibGljOgorICAgIElzb1RvUGxhdGZvcm1Bc3BlY3RzVGVzdCgpIHsKKyAgICAgICAgbVByaW1hcmllcyA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgICAgICBtVHJhbnNmZXIgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbU1hdHJpeENvZWZmcyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtUGxhdGZvcm1TdGFuZGFyZCA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgICAgICBtUGxhdGZvcm1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpOworICAgIH07CisKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6OlRyYW5zZmVyIG1UcmFuc2ZlcjsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7CisgICAgaW50MzJfdCBtUGxhdGZvcm1TdGFuZGFyZDsKKyAgICBpbnQzMl90IG1QbGF0Zm9ybVRyYW5zZmVyOworfTsKKworY2xhc3MgQ29sb3JBc3BlY3RzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp0dXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW1hcmllcyAqLyBDQTo6UHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JUcmFuc2ZlciAqLyBDQTo6VHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yUmFuZ2UgKi8gQ0E6OlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JTdGFuZGFyZCAqLyBDQTo6U3RhbmRhcmQ+PiB7CisgIHB1YmxpYzoKKyAgICBDb2xvckFzcGVjdHNUZXN0KCkgeworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1SYW5nZSA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgICAgICBtU3RhbmRhcmQgPSBzdGQ6OmdldDw0PihHZXRQYXJhbSgpKTsKKyAgICB9OworCisgICAgQ0E6OlByaW1hcmllcyBtUHJpbWFyaWVzOworICAgIENBOjpUcmFuc2ZlciBtVHJhbnNmZXI7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworICAgIENBOjpSYW5nZSBtUmFuZ2U7CisgICAgQ0E6OlN0YW5kYXJkIG1TdGFuZGFyZDsKK307CisKK2NsYXNzIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpZHRoICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGVpZ2h0ICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbWFyaWVzICovIENBOjpQcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4Q29lZmZzICovIENBOjpNYXRyaXhDb2VmZnM+PiB7CisgIHB1YmxpYzoKKyAgICBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCgpIHsKKyAgICAgICAgbVdpZHRoID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1IZWlnaHQgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVByaW1hcmllcyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworfTsKKworY2xhc3MgRGF0YVNwYWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp0dXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yUmFuZ2UgKi8gQ0E6OlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbWFyaWVzICovIENBOjpQcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xvclRyYW5zZmVyICovIENBOjpUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdjBfYW5kcm9pZF9kYXRhc3BhY2UgKi8gYW5kcm9pZF9kYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmRyb2lkX2RhdGFzcGFjZSAqLyBhbmRyb2lkX2RhdGFzcGFjZT4+IHsKKyAgcHVibGljOgorICAgIERhdGFTcGFjZVRlc3QoKSB7CisgICAgICAgIG1SYW5nZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1EYXRhU3BhY2VWMCA9IHN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpOworICAgICAgICBtRGF0YVNwYWNlID0gc3RkOjpnZXQ8NT4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIENBOjpSYW5nZSBtUmFuZ2U7CisgICAgQ0E6OlByaW1hcmllcyBtUHJpbWFyaWVzOworICAgIENBOjpUcmFuc2ZlciBtVHJhbnNmZXI7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2VWMDsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtRGF0YVNwYWNlOworfTsKKworVEVTVF9QKENvbG9yUmFuZ2VUZXN0LCBXcmFwQ29sb3JSYW5nZVRlc3QpIHsKKyAgICBpbnQzMl90IHJhbmdlID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclJhbmdlKG1SYW5nZSk7CisgICAgQ0E6OlJhbmdlIHVud3JhcHBlZFJhbmdlOworICAgIHN0YXR1c190IHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKHJhbmdlLCAmdW53cmFwcGVkUmFuZ2UpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAidW53cmFwcGluZyBDb2xvckFzcGVjdHMgZnJvbSBDb2xvclJhbmdlIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKHVud3JhcHBlZFJhbmdlLCBtUmFuZ2UpIDw8ICJSZXR1cm5lZCBDb2xvclJhbmdlIGRvZXNuJ3QgbWF0Y2giOworICAgIEFMT0dWKCJ0b1N0cmluZyB0ZXN0OiBSYW5nZTogJXMiLCBhc1N0cmluZyhtUmFuZ2UsICJkZWZhdWx0IikpOworfQorCitURVNUX1AoQ29sb3JUcmFuc2ZlclRlc3QsIFdyYXBDb2xvclRyYW5zZmVyVGVzdCkgeworICAgIGludDMyX3QgdHJhbnNmZXIgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yVHJhbnNmZXIobVRyYW5zZmVyKTsKKyAgICBDQTo6VHJhbnNmZXIgdW53cmFwcGVkVHJhbnNmZXI7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIodHJhbnNmZXIsICZ1bndyYXBwZWRUcmFuc2Zlcik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIENvbG9yQXNwZWN0cyBmcm9tIENvbG9yVHJhbnNmZXIgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEodW53cmFwcGVkVHJhbnNmZXIsIG1UcmFuc2ZlcikgPDwgIlJldHVybmVkIENvbG9yVHJhbnNmZXIgZG9lc24ndCBtYXRjaCI7CisgICAgQUxPR1YoInRvU3RyaW5nIHRlc3Q6IFRyYW5zZmVyOiAlcyIsIGFzU3RyaW5nKG1UcmFuc2ZlciwgImRlZmF1bHQiKSk7Cit9CisKK1RFU1RfUChDb2xvclN0YW5kYXJkVGVzdCwgV3JhcENvbG9yU3RhbmRhcmRUZXN0KSB7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZChtUHJpbWFyaWVzLCBtTWF0cml4Q29lZmZzKTsKKyAgICBDQTo6UHJpbWFyaWVzIHVud3JhcHBlZFByaW1hcmllczsKKyAgICBDQTo6TWF0cml4Q29lZmZzIHVud3JhcHBlZE1hdHJpeENvZWZmczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZChzdGFuZGFyZCwgJnVud3JhcHBlZFByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW53cmFwcGVkTWF0cml4Q29lZmZzKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgInVud3JhcHBpbmcgQ29sb3JBc3BlY3RzIGZyb20gQ29sb3JTdGFuZGFyZCBmYWlsZWQiOworICAgIEVYUEVDVF9FUSh1bndyYXBwZWRQcmltYXJpZXMsIG1QcmltYXJpZXMpIDw8ICJSZXR1cm5lZCBwcmltYXJpZXMgZG9lc24ndCBtYXRjaCI7CisgICAgRVhQRUNUX0VRKHVud3JhcHBlZE1hdHJpeENvZWZmcywgbU1hdHJpeENvZWZmcykgPDwgIlJldHVybmVkICBtYXRyaXhDb2VmZnMgZG9lc24ndCBtYXRjaCI7Cit9CisKK1RFU1RfUChDb2xvckFzcGVjdHNUZXN0LCBQbGF0Zm9ybUFzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IHJhbmdlID0gLTE7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IC0xOworICAgIGludDMyX3QgdHJhbnNmZXIgPSAtMTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhhc3BlY3RzLCAmcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiQ29udmVyc2lvbiBvZiBDb2xvckFzcGVjdHMgdG8gUGxhdGZvcm1Bc3BlY3RzIGZhaWxlZCI7CisKKyAgICBDQSByZXR1cm5lZEFzcGVjdHM7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydFBsYXRmb3JtQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMocmFuZ2UsIHN0YW5kYXJkLCB0cmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZEFzcGVjdHMpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiQ29udmVyc2lvbiBvZiBQbGF0Zm9ybUFzcGVjdHMgdG8gQ29sb3JBc3BlY3RzIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKQorICAgICAgICAgICAgPDwgInJhbmdlIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gUGxhdGZvcm1Bc3BlY3RzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1QcmltYXJpZXMsIGFzcGVjdHMubVByaW1hcmllcykKKyAgICAgICAgICAgIDw8ICJwcmltYXJpZXMgbWlzbWF0Y2ggZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBQbGF0Zm9ybUFzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpCisgICAgICAgICAgICA8PCAibWF0cml4Q29lZmZzIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gUGxhdGZvcm1Bc3BlY3RzIjsKK30KKworVEVTVF9QKENvbG9yQXNwZWN0c1Rlc3QsIElzb0FzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IHByaW1hcmllcyA9IC0xOworICAgIGludDMyX3QgY29sb3JUcmFuc2ZlciA9IC0xOworICAgIGludDMyX3QgbWF0cml4Q29lZmZzID0gLTE7CisgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoYXNwZWN0cywgJnByaW1hcmllcywgJmNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRyaXhDb2VmZnMsICZmdWxsUmFuZ2UpOworCisgICAgQ0EgcmV0dXJuZWRBc3BlY3RzOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhwcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsIG1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFJhbmdlLCByZXR1cm5lZEFzcGVjdHMpOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVJhbmdlLCBhc3BlY3RzLm1SYW5nZSkKKyAgICAgICAgICAgIDw8ICJyYW5nZSBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgYXNwZWN0cy5tTWF0cml4Q29lZmZzKQorICAgICAgICAgICAgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworfQorCitURVNUX1AoSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0LCBJc29Bc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IGlzb1ByaW1hcmllcyA9IC0xOworICAgIGludDMyX3QgaXNvVHJhbnNmZXIgPSAtMTsKKyAgICBpbnQzMl90IGlzb01hdHJpeENvZWZmcyA9IC0xOworICAgIGJvb2wgZnVsbHJhbmdlID0gZmFsc2U7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKGFzcGVjdHMsICZpc29QcmltYXJpZXMsICZpc29UcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzb01hdHJpeENvZWZmcywgJmZ1bGxyYW5nZSk7CisKKyAgICBpbnQzMl90IHJhbmdlID0gLTE7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IC0xOworICAgIGludDMyX3QgdHJhbnNmZXIgPSAtMTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoaXNvUHJpbWFyaWVzLCBpc29UcmFuc2ZlciwgaXNvTWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscmFuZ2UsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIGlmIChmdWxscmFuZ2UpIHsKKyAgICAgICAgRVhQRUNUX0VRKHJhbmdlLCBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUZ1bGwpCisgICAgICAgICAgICAgICAgPDwgInJhbmdlIGluY29ycmVjdCBjb252ZXJ0aW5nIHRvIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgfQorICAgIEVYUEVDVF9FUShzdGFuZGFyZCwgbVBsYXRmb3JtU3RhbmRhcmQpIDw8ICJzdGFuZGFyZCBpbmNvcnJlY3QgY29udmVydGluZyB0byBQbGF0Zm9ybUFzcGVjdHMiOworICAgIEVYUEVDVF9FUSh0cmFuc2ZlciwgbVBsYXRmb3JtVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBpbmNvcnJlY3QgY29udmVydGluZyB0byBQbGF0Zm9ybUFzcGVjdHMiOworfQorCitURVNUX1AoQ29sb3JBc3BlY3RzVGVzdCwgUGFja0NvbG9yQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKyAgICB1aW50MzJfdCBwYWNrZWRDb2xvckFzcGVjdHMgPSBDb2xvclV0aWxzOjpwYWNrVG9VMzIoYXNwZWN0cyk7CisKKyAgICBDQSB1bnBhY2tlZEFzcGVjdHMgPSBDb2xvclV0aWxzOjp1bnBhY2tUb0NvbG9yQXNwZWN0cyhwYWNrZWRDb2xvckFzcGVjdHMpOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVJhbmdlLCBtUmFuZ2UpIDw8ICJyYW5nZSBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVByaW1hcmllcywgbVByaW1hcmllcykgPDwgInByaW1hcmllcyBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVRyYW5zZmVyLCBtVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubU1hdHJpeENvZWZmcywgbU1hdHJpeENvZWZmcykKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2ggYWZ0ZXIgdW5wYWNraW5nIjsKKyAgICBBTE9HVigidG9TdHJpbmcgdGVzdDogU3RhbmRhcmQ6ICVzIiwgYXNTdHJpbmcobVN0YW5kYXJkLCAiZGVmYXVsdCIpKTsKK30KKworVEVTVF9QKERlZmF1bHRDb2xvckFzcGVjdHNUZXN0LCBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBDQTo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisKKyAgICBDb2xvclV0aWxzOjpzZXREZWZhdWx0Q29kZWNDb2xvckFzcGVjdHNJZk5lZWRlZChhc3BlY3RzLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1SYW5nZSwgQ0E6OlJhbmdlTGltaXRlZCkgPDwgInJhbmdlIG5vdCBzZXQgdG8gZGVmYXVsdCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVByaW1hcmllcywgbVByaW1hcmllcykgPDwgInByaW1hcmllcyBub3Qgc2V0IHRvIGRlZmF1bHQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1NYXRyaXhDb2VmZnMsIG1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbm90IHNldCB0byBkZWZhdWx0IjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tVHJhbnNmZXIsIENBOjpUcmFuc2ZlclNNUFRFMTcwTSkgPDwgInRyYW5zZmVyIG5vdCBzZXQgdG8gZGVmYXVsdCI7Cit9CisKK1RFU1RfUChEYXRhU3BhY2VUZXN0LCBEYXRhU3BhY2VUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgZmFsc2UpOworICAgIEVYUEVDVF9FUShkYXRhU3BhY2UsIG1EYXRhU3BhY2UpIDw8ICJSZXR1cm5lZCBpbmNvcnJlY3QgZGF0YXNwYWNlIjsKKworICAgIGJvb2wgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydERhdGFTcGFjZVRvVjAoZGF0YVNwYWNlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJSZXR1cm5lZCB2MCBkYXRhc3BhY2UgaXMgbm90IGFzcGVjdC1vbmx5IjsKKyAgICBFWFBFQ1RfRVEoZGF0YVNwYWNlLCBtRGF0YVNwYWNlVjApIDw8ICJSZXR1cm5lZCBpbmNvcnJlY3QgdjAgZGF0YXNwYWNlIjsKK30KKworVEVTVChDb2xvclV0aWxzVW5pdFRlc3QsIEFzcGVjdHNDaGFuZ2VkVGVzdCkgeworICAgIENBIG9yaWdBc3BlY3RzOworICAgIG9yaWdBc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VGdWxsOworICAgIG9yaWdBc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81OworICAgIG9yaWdBc3BlY3RzLm1UcmFuc2ZlciA9IENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXI7CisgICAgb3JpZ0FzcGVjdHMubU1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzU7CisKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUZ1bGw7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNTsKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNTsKKworICAgIGJvb2wgc3RhdHVzID0gQ29sb3JVdGlsczo6Y2hlY2tJZkFzcGVjdHNDaGFuZ2VkQW5kVW5zcGVjaWZ5VGhlbShhc3BlY3RzLCBvcmlnQXNwZWN0cyk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OmNoZWNrSWZBc3BlY3RzQ2hhbmdlZEFuZFVuc3BlY2lmeVRoZW0oYXNwZWN0cywgb3JpZ0FzcGVjdHMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlVW5zcGVjaWZpZWQpIDw8ICJyYW5nZSBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VGdWxsOworCisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQjsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckFzcGVjdHMgY29tcGFyaXNvbiBjaGVjayBmYWlsZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgInRyYW5zZmVyIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcjsKKworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMDsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzLCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckFzcGVjdHMgY29tcGFyaXNvbiBjaGVjayBmYWlsZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7CisKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME07CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Y2hlY2tJZkFzcGVjdHNDaGFuZ2VkQW5kVW5zcGVjaWZ5VGhlbShhc3BlY3RzLCBvcmlnQXNwZWN0cywgdHJ1ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JBc3BlY3RzIGNvbXBhcmlzb24gY2hlY2sgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJwcmltYXJpZXMgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4VW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAibWF0cml4Q29lZmZzIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgQ29sb3JDb25maWdGcm9tRm9ybWF0VGVzdCkgeworICAgIGludCByYW5nZSA9IC0xOworICAgIGludCBzdGFuZGFyZCA9IC0xOworICAgIGludCB0cmFuc2ZlciA9IC0xOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KGZvcm1hdCwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX0VRKHJhbmdlIHwgc3RhbmRhcmQgfCB0cmFuc2ZlciwgMCkgPDwgImNvbG9yIGNvbmZpZyBkaWRuJ3QgZGVmYXVsdCB0byAwIjsKKworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1JBTkdFLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpOworICAgIENvbG9yVXRpbHM6OmdldENvbG9yQ29uZmlnRnJvbUZvcm1hdChmb3JtYXQsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9FUShyYW5nZSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHN0YW5kYXJkLCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpIDw8ICJzdGFuZGFyZCBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKSA8PCAidHJhbnNmZXIgbWlzbWF0Y2giOworCisgICAgcmFuZ2UgPSBzdGFuZGFyZCA9IHRyYW5zZmVyID0gLTE7CisgICAgc3A8QU1lc3NhZ2U+IGNvcHlGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoY29weUZvcm1hdCwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQU1lc3NhZ2UiOworICAgIENvbG9yVXRpbHM6OmNvcHlDb2xvckNvbmZpZyhmb3JtYXQsIGNvcHlGb3JtYXQpOworICAgIGJvb2wgc3RhdHVzID0gY29weUZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9SQU5HRSwgJnJhbmdlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckNvbmZpZyByYW5nZSBlbnRyeSBtaXNzaW5nIjsKKyAgICBzdGF0dXMgPSBjb3B5Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmc3RhbmRhcmQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQ29uZmlnIHN0YW5kYXJkIGVudHJ5IG1pc3NpbmciOworICAgIHN0YXR1cyA9IGNvcHlGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZ0cmFuc2Zlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JDb25maWcgdHJhbnNmZXIgZW50cnkgbWlzc2luZyI7CisgICAgRVhQRUNUX0VRKHJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCkgPDwgInJhbmdlIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEoc3RhbmRhcmQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSkgPDwgInN0YW5kYXJkIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaGQiOworCisgICAgcmFuZ2UgPSBzdGFuZGFyZCA9IHRyYW5zZmVyID0gLTE7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KGNvcHlGb3JtYXQsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9FUShyYW5nZSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHN0YW5kYXJkLCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpIDw8ICJzdGFuZGFyZCBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKSA8PCAidHJhbnNmZXIgbWlzbWF0Y2giOworfQorCitURVNUX1AoQ29sb3JBc3BlY3RzVGVzdCwgRm9ybWF0VGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIEFNZXNzYWdlIjsKKyAgICBDb2xvclV0aWxzOjpzZXRDb2xvckFzcGVjdHNJbnRvRm9ybWF0KGFzcGVjdHMsIGZvcm1hdCwgdHJ1ZSk7CisKKyAgICBDQSByZXR1cm5lZEFzcGVjdHM7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChmb3JtYXQsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKSA8PCAicmFuZ2UgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgYXNwZWN0cy5tVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2giOworCisgICAgYXNwZWN0cy5tUmFuZ2UgPSBtUmFuZ2U7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gbVByaW1hcmllczsKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IG1UcmFuc2ZlcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBtTWF0cml4Q29lZmZzOworICAgIENvbG9yVXRpbHM6OnNldENvbG9yQXNwZWN0c0ludG9Gb3JtYXQoYXNwZWN0cywgZm9ybWF0KTsKKworICAgIG1lbXNldCgmcmV0dXJuZWRBc3BlY3RzLCAwLCBzaXplb2YocmV0dXJuZWRBc3BlY3RzKSk7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChmb3JtYXQsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKSA8PCAicmFuZ2UgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgYXNwZWN0cy5tVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2giOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgSERSU3RhdGljSW5mb1Rlc3QpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQU1lc3NhZ2UiOworCisgICAgSERSU3RhdGljSW5mbyByZXR1cm5lZEluZm9IRFI7CisgICAgYm9vbCBzdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZyZXR1cm5lZEluZm9IRFIpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJIRFIgaW5mbyBzaG91bGQgYmUgYWJzZW50IGluIGVtcHR5IGZvcm1hdCI7CisKKyAgICBIRFJTdGF0aWNJbmZvIGluZm9IRFI7CisgICAgaW5mb0hEUi5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIGluZm9IRFIuc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0ga0hEUkluZm9UZXN0VmFsdWUxOworICAgIGluZm9IRFIuc1R5cGUxLm1SLnggPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubVIueSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBpbmZvSERSLnNUeXBlMS5tRy54ID0ga0hEUkluZm9UZXN0VmFsdWUxOworICAgIGluZm9IRFIuc1R5cGUxLm1HLnkgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubUIueCA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tQi55ID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIGluZm9IRFIuc1R5cGUxLm1XLnggPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubVcueSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChpbmZvSERSLCBmb3JtYXQpOworCisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmcmV0dXJuZWRJbmZvSERSKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IEhEUiBpbmZvIGZyb20gZm9ybWF0IjsKKyAgICBBU1NFUlRfRVEoMCwgbWVtY21wKCZyZXR1cm5lZEluZm9IRFIsICZpbmZvSERSLCBzaXplb2YoaW5mb0hEUikpKSA8PCAiIEhEUlN0YXRpY0luZm8gbWlzbWF0Y2giOworCisgICAgQU1lZGlhRm9ybWF0ICptZWRpYUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUobWVkaWFGb3JtYXQsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIEFNZWRpYUZvcm1hdCI7CisgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoaW5mb0hEUiwgbWVkaWFGb3JtYXQpOworICAgIG1lbXNldCgmcmV0dXJuZWRJbmZvSERSLCAwLCBzaXplb2YocmV0dXJuZWRJbmZvSERSKSk7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobWVkaWFGb3JtYXQtPm1Gb3JtYXQsICZyZXR1cm5lZEluZm9IRFIpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobWVkaWFGb3JtYXQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgSERSIGluZm8gZnJvbSBtZWRpYSBmb3JtYXQiOworICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAoJnJldHVybmVkSW5mb0hEUiwgJmluZm9IRFIsIHNpemVvZihpbmZvSERSKSkpIDw8ICIgSERSU3RhdGljSW5mbyBtaXNtYXRjaCI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBTYW5pdHlUZXN0KSB7CisgICAgQ0E6OlByaW1hcmllcyB1bm1hcHBlZFByaW1hcmllcyA9IChDQTo6UHJpbWFyaWVzKShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNPdGhlciArIDEpOworICAgIENBOjpNYXRyaXhDb2VmZnMgdW5tYXBwZWRNYXRyaXhDb2VmZnMgPSAoQ0E6Ok1hdHJpeENvZWZmcykoQ0E6Ok1hdHJpeE90aGVyICsgMSk7CisgICAgaW50MzJfdCBjb2xvclN0YW5kYXJkID0KKyAgICAgICAgICAgIENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZCh1bm1hcHBlZFByaW1hcmllcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCB1bnNwZWNpZmllZCBleHBlY3RlZCI7CisgICAgY29sb3JTdGFuZGFyZCA9CisgICAgICAgICAgICBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQoQ0E6OlByaW1hcmllc090aGVyLCB1bm1hcHBlZE1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX0VRKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiU3RhbmRhcmQgdW5zcGVjaWZpZWQgZXhwZWN0ZWQiOworICAgIGNvbG9yU3RhbmRhcmQgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQoQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeEJUMjAyMCk7CisgICAgRVhQRUNUX0dFKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRXh0ZW5kZWRTdGFydCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCBncmVhdGVyIHRoYW4gZXh0ZW5kZWQgc3RhcnQgZXhwZWN0ZWQiOworICAgIHVubWFwcGVkUHJpbWFyaWVzID0gKENBOjpQcmltYXJpZXMpKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCArIDEpOworICAgIHVubWFwcGVkTWF0cml4Q29lZmZzID0gKENBOjpNYXRyaXhDb2VmZnMpKENBOjpNYXRyaXhCVDIwMjBDb25zdGFudCArIDEpOworICAgIGNvbG9yU3RhbmRhcmQgPQorICAgICAgICAgICAgQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHVubWFwcGVkUHJpbWFyaWVzLCB1bm1hcHBlZE1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX0dFKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRXh0ZW5kZWRTdGFydCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCBncmVhdGVyIHRoYW4gZXh0ZW5kZWQgc3RhcnQgZXhwZWN0ZWQiOworCisgICAgQ0EgYXNwZWN0czsKKyAgICBpbnQzMl90IGNvbG9yUmFuZ2UgPSAtMTsKKyAgICBjb2xvclN0YW5kYXJkID0gLTE7CisgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gKENBOjpQcmltYXJpZXMpKENBOjpQcmltYXJpZXM6OlByaW1hcmllc090aGVyICsgMSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICBhc3BlY3RzLCAmY29sb3JSYW5nZSwgJmNvbG9yU3RhbmRhcmQsICZjb2xvclRyYW5zZmVyKTsKKyAgICBFWFBFQ1RfTkUoc3RhdHVzLCBPSykgPDwgImludmFsaWQgY29sb3JBc3BlY3RzIHZhbHVlIGFjY2VwdGVkIjsKKworICAgIGludDMyX3QgY29sb3JQcmltYXJpZXMgPSAtMTsKKyAgICBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgaW50MzJfdCBjb2xvck1hdHJpeENvZWZmcyA9IC0xOworICAgIGJvb2wgZnVsbFJhbmdlID0gZmFsc2U7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc090aGVyOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyT3RoZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeE90aGVyOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvSXNvQXNwZWN0cyhhc3BlY3RzLCAmY29sb3JQcmltYXJpZXMsICZjb2xvclRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JNYXRyaXhDb2VmZnMsICZmdWxsUmFuZ2UpOworICAgIENBIHJldHVybmVkQXNwZWN0czsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoY29sb3JQcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWF0cml4Q29lZmZzLCBmdWxsUmFuZ2UsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgUHJpbWFyaWVzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgVHJhbnNmZXIiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIE1hdHJpeENvZWZmcyI7CisKKyAgICAvLyBpbnZhbGlkIHZhbHVlcywgb3RoZXIgdmFsdWUgZXF1YWxzIDB4RkYKKyAgICBjb2xvclByaW1hcmllcyA9IENBOjpQcmltYXJpZXNPdGhlcjsKKyAgICBjb2xvclRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyT3RoZXI7CisgICAgY29sb3JNYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4T3RoZXI7CisgICAgZnVsbFJhbmdlID0gZmFsc2U7CisgICAgbWVtc2V0KCZyZXR1cm5lZEFzcGVjdHMsIDAsIHNpemVvZihyZXR1cm5lZEFzcGVjdHMpKTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoY29sb3JQcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWF0cml4Q29lZmZzLCBmdWxsUmFuZ2UsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgUHJpbWFyaWVzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgVHJhbnNmZXIiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIE1hdHJpeENvZWZmcyI7CisKKyAgICBDQTo6UHJpbWFyaWVzIHByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhVbnNwZWNpZmllZDsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZChDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFZlbmRvclN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJpZXMsICZtYXRyaXhDb2VmZnMpOworICAgIEVYUEVDVF9FUShzdGF0dXMsIE9LKSA8PCAidW53cmFwcGluZyBhc3BlY3RzIGZyb20gY29sb3Igc3RhbmRhcmQgZmFpbGVkIjsKKworICAgIHByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBtYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yU3RhbmRhcmQoCisgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFZlbmRvclN0YXJ0ICogNCwgJnByaW1hcmllcywgJm1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX05FKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIGFzcGVjdHMgZnJvbSBjb2xvciBzdGFuZGFyZCBmYWlsZWQiOworCisgICAgY29sb3JSYW5nZSA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JSYW5nZSgoQ0E6OlJhbmdlKShDQTo6UmFuZ2VPdGhlciArIDEpKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JSYW5nZSwgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZCkgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIGNvbG9yIHJhbmdlIjsKKworICAgIENBOjpSYW5nZSByYW5nZTsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JSYW5nZSgKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclJhbmdlVmVuZG9yU3RhcnQgKyBDQTo6UmFuZ2VPdGhlciArIDEsICZyYW5nZSk7CisgICAgRVhQRUNUX05FKHN0YXR1cywgT0spIDw8ICJpbnZhbGlkIHJhbmdlIHZhbHVlIGFjY2VwdGVkIjsKKyAgICBFWFBFQ1RfRVEocmFuZ2UsIENBOjpSYW5nZU90aGVyKSA8PCAicmV0dXJuZWQgdW5leHBlY3RlZCByYW5nZSB2YWx1ZSI7CisKKyAgICBjb2xvclRyYW5zZmVyID0KKyAgICAgICAgICAgIENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JUcmFuc2ZlcigoQ0E6OlRyYW5zZmVyKShDQTo6VHJhbnNmZXJPdGhlciArIDEpKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JUcmFuc2ZlciwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBjb2xvciB0cmFuc2ZlciI7CisKKyAgICBDQTo6VHJhbnNmZXIgdHJhbnNmZXI7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIoCisgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclZlbmRvclN0YXJ0ICsgQ0E6OlRyYW5zZmVyT3RoZXIgKyAxLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9ORShzdGF0dXMsIE9LKSA8PCAiaW52YWxpZCB0cmFuc2ZlciB2YWx1ZSBhY2NlcHRlZCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXJPdGhlcikgPDwgImV4cGVjdGVkIG90aGVyIGNvbG9yIHRyYW5zZmVyIjsKK30KKworVEVTVChDb2xvclV0aWxzVW5pdFRlc3QsIEhEUkluZm9TYW5pdHlUZXN0KSB7CisgICAgSERSU3RhdGljSW5mbyBoZHJJbmZvOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisKKyAgICBib29sIGJvb2xTdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZoZHJJbmZvKTsKKyAgICBFWFBFQ1RfRkFMU0UoYm9vbFN0YXR1cykgPDwgIkhEUlN0YXRpY0luZm8gc2hvdWxkIG5vdCBiZSBwcmVzZW50IjsKKworICAgIHNwPEFCdWZmZXI+IGludmFsaWRTaXplSERSSW5mb0J1ZmZlciA9IG5ldyBBQnVmZmVyKGtIRFJCdWZmZXJTaXplIC0gMSk7CisgICAgQVNTRVJUX05FKGludmFsaWRTaXplSERSSW5mb0J1ZmZlciwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQUJ1ZmZlciI7CisgICAgZm9ybWF0LT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgaW52YWxpZFNpemVIRFJJbmZvQnVmZmVyKTsKKyAgICBtZW1zZXQoJmhkckluZm8sIDAsIHNpemVvZihoZHJJbmZvKSk7CisgICAgYm9vbFN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmhkckluZm8pOworICAgIEVYUEVDVF9GQUxTRShib29sU3RhdHVzKSA8PCAiaW5jb3JyZWN0IEhEUlN0YXRpY0luZm8gYnVmZmVyIGFjY2VwdGVkIjsKKworICAgIHNwPEFCdWZmZXI+IGludmFsaWRIRFJJbmZvQnVmZmVyID0gbmV3IEFCdWZmZXIoa0hEUkJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9ORShpbnZhbGlkSERSSW5mb0J1ZmZlciwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQUJ1ZmZlciI7CisgICAgdWludDhfdCAqZGF0YSA9IGludmFsaWRIRFJJbmZvQnVmZmVyLT5kYXRhKCk7CisgICAgKmRhdGEgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEgKyAxOworICAgIGZvcm1hdC0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIGludmFsaWRIRFJJbmZvQnVmZmVyKTsKKyAgICBtZW1zZXQoJmhkckluZm8sIDAsIHNpemVvZihoZHJJbmZvKSk7CisgICAgYm9vbFN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmhkckluZm8pOworICAgIEVYUEVDVF9GQUxTRShib29sU3RhdHVzKSA8PCAiaW5jb3JyZWN0IEhEUlN0YXRpY0luZm8gYnVmZmVyIGFjY2VwdGVkIjsKKworICAgIENBIGFzcGVjdHM7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfUkFOR0UsIENvbG9yVXRpbHM6OmtDb2xvclJhbmdlVmVuZG9yU3RhcnQgKyBDQTo6UmFuZ2VPdGhlciArIDEpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1RSQU5TRkVSLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKTsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGZvcm1hdCwgYXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVJhbmdlLCBDQTo6UmFuZ2VPdGhlcikgPDwgInVuZXhwZWN0ZWQgcmFuZ2UiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgRGF0YVNwYWNlU2FuaXR5VGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBDQTo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUpOworICAgIEVYUEVDVF9FUShkYXRhU3BhY2UsIDApIDw8ICJleHBlY3RlZCBpbnZhbGlkIGRhdGFzcGFjZSI7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhCVDIwMjBDb25zdGFudDsKKyAgICBkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSk7CisgICAgRVhQRUNUX05FKGRhdGFTcGFjZSwgMCkgPDwgInVuZXhwZWN0ZWQgdmFsdWUiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQ29sb3JVdGlsc1VuaXRUZXN0LCBDb2xvclJhbmdlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yUmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpSYW5nZTo6UmFuZ2VVbnNwZWNpZmllZCwgQ0E6OlJhbmdlOjpSYW5nZU90aGVyKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yVHJhbnNmZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3JUcmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNSR0IsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyR2FtbWEyMiwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckdhbW1hMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1QyMDg0LCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVySExHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMjQwTSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2Zlclh2WUNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckJUMTM2MSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNUNDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2Zlck90aGVyKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQ29sb3JVdGlsc1VuaXRUZXN0LCBDb2xvclN0YW5kYXJkVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUHJpbWFyaWVzLCBNYXRyaXhDb2VmZnMKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhVbnNwZWNpZmllZCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjApLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0dlbmVyaWNGaWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yQXNwZWN0c1Rlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIFByaW1hcmllcywgQ29sb3JUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCBDb2xvclJhbmdlLCBDb2xvclN0YW5kYXJkCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFVuc3BlY2lmaWVkLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRVbnNwZWNpZmllZCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJHYW1tYTIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJHYW1tYTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME0sIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ0NzBNKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1QyMDg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjAsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVySExHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDYwMV81MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDQ3MF82TSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNHZW5lcmljRmlsbSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNjAxXzYyNSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIElzb1RvUGxhdGZvcm1Bc3BlY3RzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUHJpbWFyaWVzLCBUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCBTdGFuZGFyZCwgVHJhbnNmZXIKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkLCBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkLCBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNzA5XzUsIENBOjpUcmFuc2ZlckxpbmVhciwgQ0E6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDksIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyTGluZWFyKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNjI1LCBDQTo6VHJhbnNmZXJTUkdCLCBDQTo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyU1JHQiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDYwMV82XzYyNSwgQ0E6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjVfVW5hZGp1c3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTTVBURV8xNzBNKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LCBDQTo6VHJhbnNmZXJHYW1tYTIyLCBDQTo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyR2FtbWEyMiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6OlRyYW5zZmVyR2FtbWEyOCwgQ0E6Ok1hdHJpeFNNUFRFMjQwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjVfVW5hZGp1c3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJHYW1tYTI4KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUMjAyMCwgQ0E6OlRyYW5zZmVyU1QyMDg0LCBDQTo6TWF0cml4QlQyMDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUMjAyMCwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTVDIwODQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXJITEcsIENBOjpNYXRyaXhCVDIwMjBDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDIwMjBDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJITEcpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ0NzBfNk0sIENBOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDQTo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ0NzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0dlbmVyaWNGaWxtLCBDQTo6VHJhbnNmZXJMaW5lYXIsIENBOjpNYXRyaXhCVDIwMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRmlsbSwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJMaW5lYXIpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQ29sb3JVdGlsc1VuaXRUZXN0LCBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gV2lkdGgsIEhlaWdodCwgUHJpbWFyaWVzLCBNYXRyaXhDb2VmZnMKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoMzg0MCwgMzg0MCwgQ0E6OlByaW1hcmllc0JUMjAyMCwgQ0E6Ok1hdHJpeEJUMjAyMCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKDcyMCwgNTc2LCBDQTo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsIENBOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoNDgwLCAzNjAsIENBOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSg0ODAsIDE5MjAsIENBOjpQcmltYXJpZXNCVDcwOV81LCBDQTo6TWF0cml4QlQ3MDlfNSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIERhdGFTcGFjZVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIENvbG9yUmFuZ2UsIFByaW1hcmllcywgQ29sb3JUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCB2MF9hbmRyb2lkX2RhdGFzcGFjZSwKKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkX2RhdGFzcGFjZQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNSR0IsIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfU1JHQiwgSEFMX0RBVEFTUEFDRV9TUkdCKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ3MDksIEhBTF9EQVRBU1BBQ0VfQlQ3MDkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9TUkdCX0xJTkVBUiwgSEFMX0RBVEFTUEFDRV9TUkdCX0xJTkVBUiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzYyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV82MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfSkZJRiwgSEFMX0RBVEFTUEFDRV9KRklGKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNDcwXzZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzYyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV82MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV82MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNjI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDcwOSwgSEFMX0RBVEFTUEFDRV9CVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ3MDksIEhBTF9EQVRBU1BBQ0VfQlQ3MDkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNjI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzYyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSkpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggZGIzN2ZlOS4uZTM0NTA0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTUsNyArNSw5IEBACiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKQEAgLTE5LDYgKzIxLDEyIEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmluZGV4IDZjNjY5N2QuLmQ2ZWE0NzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iSUQzVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0lEM1Rlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC0xLjEuemlwP3VuemlwPXRydWUiCiAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0lEM1Rlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9JRDNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwCmluZGV4IGNkNWNkOWUuLjhkYjgzY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwCkBAIC01MSw3ICs1MSw3IEBACiAgICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKICAgICAgICAgU3RyaW5nOCBpZDsKICAgICAgICAgaXQuZ2V0SUQoJmlkKTsKLSAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKSA8PCAiTm8gSUQgdGFnIGZvdW5kISBcbiI7CisgICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCkgPDwgIkZvdW5kIGFuIElEMyB0YWcgb2YgMCBzaXplIjsKICAgICAgICAgQUxPR1YoIkZvdW5kIElEIHRhZzogJXNcbiIsIFN0cmluZzgoaWQpLmNfc3RyKCkpOwogICAgICAgICBpdC5uZXh0KCk7CiAgICAgfQpAQCAtNjYsOCArNjYsOCBAQAogICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKGZpbGUtPndyYXAoKSk7CiAgICAgSUQzIHRhZygmaGVscGVyKTsKICAgICBBU1NFUlRfVFJVRSh0YWcuaXNWYWxpZCgpKSA8PCAiTm8gdmFsaWQgSUQzIHRhZyBmb3VuZCBmb3IgIiA8PCBwYXRoLmNfc3RyKCkgPDwgIlxuIjsKLSAgICBBU1NFUlRfVFJVRSh0YWcudmVyc2lvbigpID49IHZlcnNpb25OdW1iZXIpCi0gICAgICAgICAgICA8PCAiRXhwZWN0ZWQgdmVyc2lvbjogIiA8PCB0YWcudmVyc2lvbigpIDw8ICIgRm91bmQgdmVyc2lvbjogIiA8PCB2ZXJzaW9uTnVtYmVyOworICAgIEFTU0VSVF9FUSh0YWcudmVyc2lvbigpLCB2ZXJzaW9uTnVtYmVyKQorICAgICAgICAgICAgPDwgIkZvdW5kIHZlcnNpb246ICIgPDwgdGFnLnZlcnNpb24oKSA8PCAiIEV4cGVjdGVkIHZlcnNpb246ICIgPDwgdmVyc2lvbk51bWJlcjsKIH0KIAogVEVTVF9QKElEM3RleHRUYWdUZXN0LCBUZXh0VGFnVGVzdCkgewpAQCAtODEsMTcgKzgxLDM0IEBACiAgICAgQVNTRVJUX1RSVUUodGFnLmlzVmFsaWQoKSkgPDwgIk5vIHZhbGlkIElEMyB0YWcgZm91bmQgZm9yICIgPDwgcGF0aC5jX3N0cigpIDw8ICJcbiI7CiAgICAgaW50IGNvdW50VGV4dEZyYW1lcyA9IDA7CiAgICAgSUQzOjpJdGVyYXRvciBpdCh0YWcsIG51bGxwdHIpOwotICAgIHdoaWxlICghaXQuZG9uZSgpKSB7Ci0gICAgICAgIFN0cmluZzggaWQ7Ci0gICAgICAgIGl0LmdldElEKCZpZCk7Ci0gICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCk7Ci0gICAgICAgIGlmIChpZFswXSA9PSAnVCcpIHsKLSAgICAgICAgICAgIFN0cmluZzggdGV4dDsKLSAgICAgICAgICAgIGNvdW50VGV4dEZyYW1lcysrOwotICAgICAgICAgICAgaXQuZ2V0U3RyaW5nKCZ0ZXh0KTsKLSAgICAgICAgICAgIEFMT0dWKCJGb3VuZCB0ZXh0IGZyYW1lICVzIDogJXMgXG4iLCBpZC5zdHJpbmcoKSwgdGV4dC5zdHJpbmcoKSk7CisgICAgaWYgKHRhZy52ZXJzaW9uKCkgIT0gSUQzOjpJRDNfVjEgJiYgdGFnLnZlcnNpb24oKSAhPSBJRDM6OklEM19WMV8xKSB7CisgICAgICAgIHdoaWxlICghaXQuZG9uZSgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGlkOworICAgICAgICAgICAgaXQuZ2V0SUQoJmlkKTsKKyAgICAgICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCkgPDwgIkZvdW5kIGFuIElEMyB0YWcgb2YgMCBzaXplIjsKKyAgICAgICAgICAgIGlmIChpZFswXSA9PSAnVCcpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHRleHQ7CisgICAgICAgICAgICAgICAgY291bnRUZXh0RnJhbWVzKys7CisgICAgICAgICAgICAgICAgaXQuZ2V0U3RyaW5nKCZ0ZXh0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiRm91bmQgdGV4dCBmcmFtZSAlcyA6ICVzIFxuIiwgaWQuc3RyaW5nKCksIHRleHQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXQubmV4dCgpOwogICAgICAgICB9Ci0gICAgICAgIGl0Lm5leHQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICAgICAgU3RyaW5nOCBpZDsKKyAgICAgICAgICAgIFN0cmluZzggdGV4dDsKKyAgICAgICAgICAgIGl0LmdldElEKCZpZCk7CisgICAgICAgICAgICBBU1NFUlRfR1QoaWQubGVuZ3RoKCksIDApIDw8ICJGb3VuZCBhbiBJRDMgdGFnIG9mIDAgc2l6ZSI7CisgICAgICAgICAgICBpdC5nZXRTdHJpbmcoJnRleHQpOworICAgICAgICAgICAgLy8gaWYgdGhlIHRhZyBoYXMgYSB2YWx1ZQorICAgICAgICAgICAgaWYgKHN0cmNtcCh0ZXh0LnN0cmluZygpLCAiIikpIHsKKyAgICAgICAgICAgICAgICBjb3VudFRleHRGcmFtZXMrKzsKKyAgICAgICAgICAgICAgICBBTE9HVigiSUQ6ICVzXG4iLCBpZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiVGV4dCBzdHJpbmc6ICVzXG4iLCB0ZXh0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl0Lm5leHQoKTsKKyAgICAgICAgfQogICAgIH0KICAgICBBU1NFUlRfRVEoY291bnRUZXh0RnJhbWVzLCBudW1UZXh0RnJhbWVzKQogICAgICAgICAgICAgPDwgIkV4cGVjdGVkICIgPDwgbnVtVGV4dEZyYW1lcyA8PCAiIHRleHQgZnJhbWVzLCBmb3VuZCAiIDw8IGNvdW50VGV4dEZyYW1lczsKQEAgLTExNCw3ICsxMzEsNyBAQAogICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGFsYnVtIGFydDogc2l6ZSA9ICV6dSBtaW1lID0gJXMgXG4iLCBkYXRhU2l6ZSwgbWltZS5zdHJpbmcoKSk7CiAgICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJFeHBlY3RlZCBhbGJ1bSBhcnQsIGZvdW5kIG5vbmUhIiA8PCBwYXRoOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkV4cGVjdGVkIGFsYnVtIGFydCwgZm91bmQgbm9uZSEgIiA8PCBwYXRoOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFTU0VSVF9FUShkYXRhLCBudWxscHRyKSA8PCAiRm91bmQgYWxidW0gYXJ0IHdoZW4gZXhwZWN0ZWQgbm9uZSEiOwogICAgIH0KQEAgLTEzNyw3ICsxNTQsNyBAQAogICAgIHdoaWxlICghaXQuZG9uZSgpKSB7CiAgICAgICAgIFN0cmluZzggaWQ7CiAgICAgICAgIGl0LmdldElEKCZpZCk7Ci0gICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCk7CisgICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCkgPDwgIkZvdW5kIGFuIElEMyB0YWcgb2YgMCBzaXplIjsKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhZyBpcyBhbiAiQVBJQy9QSUMiIHRhZy4KICAgICAgICAgaWYgKFN0cmluZzgoaWQpID09ICJBUElDIiB8fCBTdHJpbmc4KGlkKSA9PSAiUElDIikgewogICAgICAgICAgICAgY291bnQrKzsKQEAgLTE1MCw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIGhleGR1bXAoZGF0YSwgZGF0YVNpemUgPiAxMjggPyAxMjggOiBkYXRhU2l6ZSk7CiAjZW5kaWYKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRXhwZWN0ZWQgYWxidW0gYXJ0LCBmb3VuZCBub25lISIgPDwgcGF0aDsKKyAgICAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRXhwZWN0ZWQgYWxidW0gYXJ0LCBmb3VuZCBub25lISAiIDw8IHBhdGg7CiAgICAgICAgIH0KICAgICAgICAgaXQubmV4dCgpOwogICAgIH0KQEAgLTE1OSw1NiArMTc2LDY3IEBACiB9CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChpZDNUZXN0QWxsLCBJRDN0YWdUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjX21vcmVUZXh0RnJhbWVzLm1wMyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygiYmJiXzFzZWNfdjIzLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMnNlY192MjQubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMnNlY18yX2ltYWdlLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8yc2VjX2xhcmdlU2l6ZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMXNlY192MjNfM3RhZ3MubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzFzZWNfdjFfNXRhZ3MubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkT25lRnJhbWUubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkQWxsRnJhbWVzLm1wMyIpKTsKIAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAogICAgICAgICBpZDNUZXN0QWxsLCBJRDN2ZXJzaW9uVGVzdCwKLSAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjX21vcmVUZXh0RnJhbWVzLm1wMyIsIDQpKSk7CisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzFzZWNfdjIzLm1wMyIsIElEMzo6SUQzX1YyXzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwgSUQzOjpJRDNfVjJfMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLCBJRDM6OklEM19WMl8zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjQubXAzIiwgSUQzOjpJRDNfVjJfNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLCBJRDM6OklEM19WMl80KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18yX2ltYWdlLm1wMyIsIElEMzo6SUQzX1YyXzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX2xhcmdlU2l6ZS5tcDMiLCBJRDM6OklEM19WMl80KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MjNfM3RhZ3MubXAzIiwgSUQzOjpJRDNfVjJfMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfdjFfNXRhZ3MubXAzIiwgSUQzOjpJRDNfVjFfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfdjFfM3RhZ3MubXAzIiwgSUQzOjpJRDNfVjFfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkT25lRnJhbWUubXAzIiwgSUQzOjpJRDNfVjJfNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkQWxsRnJhbWVzLm1wMyIsIElEMzo6SUQzX1YyXzQpKSk7CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKICAgICAgICAgaWQzVGVzdEFsbCwgSUQzdGV4dFRhZ1Rlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18xX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18yX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMV9pbWFnZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMl9pbWFnZS5tcDMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfbGFyZ2VTaXplLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY19tb3JlVGV4dEZyYW1lcy5tcDMiLCA1KSkpOworICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YyMy5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY18yX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0Lm1wMyIsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY19sYXJnZVNpemUubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MjNfM3RhZ3MubXAzIiwgMyksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV81dGFncy5tcDMiLCA1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YxXzN0YWdzLm1wMyIsIDMpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0X3Vuc3luY2hyb25pemVkT25lRnJhbWUubXAzIiwgMyksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjRfdW5zeW5jaHJvbml6ZWRBbGxGcmFtZXMubXAzIiwgMykpKTsKIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAotICAgICAgICBpZDNUZXN0QWxsLCBJRDNhbGJ1bUFydFRlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgdHJ1ZSkpKTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChpZDNUZXN0QWxsLCBJRDNhbGJ1bUFydFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfMXNlY192MjMubXAzIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzJfaW1hZ2UubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjQubXAzIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY19sYXJnZVNpemUubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV81dGFncy5tcDMiLCBmYWxzZSkpKTsKIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAotICAgICAgICBpZDNUZXN0QWxsLCBJRDNtdWx0aUFsYnVtQXJ0VGVzdCwKLSAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18xX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18yX2ltYWdlLm1wMyIsIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgMykpKTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChpZDNUZXN0QWxsLCBJRDNtdWx0aUFsYnVtQXJ0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl8xc2VjX3YyMy5tcDMiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX3YyNC5tcDMiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzFfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18xX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY19sYXJnZVNpemUubXAzIiwgMykpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgZ0VudiA9IG5ldyBJRDNUZXN0RW52aXJvbm1lbnQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAppbmRleCBmYmIyZDBjLi41ZDY5N2Y3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCkBAIC0xLDEyICsxLDExIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBbm90aGVyUGFja2V0U291cmNlLmNwcCIsCiAgICAgICAgICJBVFNQYXJzZXIuY3BwIiwKICAgICAgICAgIkNhc01hbmFnZXIuY3BwIiwKICAgICAgICAgIkVTUXVldWUuY3BwIiwKLSAgICAgICAgIkhsc1NhbXBsZURlY3J5cHRvci5jcHAiLAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTI4LDcgKzI3LDYgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLApAQCAtMzYsOSArMzQsMTAgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCkBAIC00OCw0ICs0NywzOSBAQAogICAgIF0sCiAKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfZGVmYXVsdHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREVOQUJMRV9DUllQVE8iLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJIbHNTYW1wbGVEZWNyeXB0b3IuY3BwIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9ub2NyeXB0byIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCA0YmIyMWZhLi44MDFkYmExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KIAotI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisjaWZkZWYgRU5BQkxFX0NSWVBUTwogI2luY2x1ZGUgIkhsc1NhbXBsZURlY3J5cHRvci5oIgogI2VuZGlmCiAKQEAgLTU1LDEwICs1NSwxMCBAQAogICAgIC8vIENyZWF0ZSB0aGUgZGVjcnlwdG9yIGFueXdheSBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSB1c2UtY2FzZSB1bmxlc3Mga2V5IGlzIHByb3ZpZGVkCiAgICAgLy8gV29uJ3QgZGVjcnlwdCBpZiBrZXkgaW5mbyBub3QgYXZhaWxhYmxlIChlLmcuLCBzY2FubmVyL2V4dHJhY3RvciBqdXN0IHBhcnNpbmcgdHMgZmlsZXMpCiAgICAgbVNhbXBsZURlY3J5cHRvciA9IGlzU2FtcGxlRW5jcnlwdGVkKCkgPwotI2lmZGVmIF9fQU5EUk9JRF9BUEVYX18KLSAgICAgICAgbmV3IFNhbXBsZURlY3J5cHRvcgotI2Vsc2UKKyNpZmRlZiBFTkFCTEVfQ1JZUFRPCiAgICAgICAgIG5ldyBIbHNTYW1wbGVEZWNyeXB0b3IKKyNlbHNlCisgICAgICAgIG5ldyBTYW1wbGVEZWNyeXB0b3IKICNlbmRpZgogICAgICAgICA6IE5VTEw7CiB9CkBAIC0xNzIsMjkgKzE3MiwyNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICB1bnNpZ25lZCBic21vZCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICBiaXRzLnNraXBCaXRzKDMpOyAvLyBic21vZAogICAgIHVuc2lnbmVkIGFjbW9kID0gYml0cy5nZXRCaXRzKDMpOwotICAgIHVuc2lnbmVkIGNtaXhsZXYgX191bnVzZWQgPSAwOwotICAgIHVuc2lnbmVkIHN1cm1peGxldiBfX3VudXNlZCA9IDA7Ci0gICAgdW5zaWduZWQgZHN1cm1vZCBfX3VudXNlZCA9IDA7CiAKICAgICBpZiAoKGFjbW9kICYgMSkgPiAwICYmIGFjbW9kICE9IDEpIHsKICAgICAgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGNtaXhsZXYgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vY21peGxldgogICAgIH0KICAgICBpZiAoKGFjbW9kICYgNCkgPiAwKSB7CiAgICAgICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBzdXJtaXhsZXYgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vc3VybWl4bGV2CiAgICAgfQogICAgIGlmIChhY21vZCA9PSAyKSB7CiAgICAgICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBkc3VybW9kID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvL2RzdXJtb2QKICAgICB9CiAKICAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMSkgewpAQCAtMjY5LDcgKzI2Niw3IEBACiAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlMltmc2NvZDJdOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlW2ZzY29kXTsKLSAgICAgICAgdW5zaWduZWQgbnVtYmxrc2NvZCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICAgICAgYml0cy5za2lwQml0cygyKTsgLy8gbnVtYmxrc2NvZAogICAgIH0KIAogICAgIHVuc2lnbmVkIGFjbW9kID0gYml0cy5nZXRCaXRzKDMpOwpAQCAtMTA4Nyw3ICsxMDg0LDcgQEAKICAgICB9CiAgICAgdW5zaWduZWQgbnVtQVVzID0gYml0cy5nZXRCaXRzKDgpOwogICAgIGJpdHMuc2tpcEJpdHMoOCk7Ci0gICAgdW5zaWduZWQgcXVhbnRpemF0aW9uX3dvcmRfbGVuZ3RoIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDIpOworICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vIHF1YW50aXphdGlvbl93b3JkX2xlbmd0aAogICAgIHVuc2lnbmVkIGF1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGJpdHMuZ2V0Qml0cygzKTsKICAgICB1bnNpZ25lZCBudW1fY2hhbm5lbHMgPSBiaXRzLmdldEJpdHMoMyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0ODMyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0eworICAgIG5hbWU6ICJNcGVnMnRzVW5pdFRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTXBlZzJ0c1VuaXRUZXN0LmNwcCIKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzLyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzEyOTRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTXBlZzJ0cyB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTXBlZzJ0c1VuaXRUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wZWcydHNVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL01wZWcydHNVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXBlZzJ0c1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzIzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTXBlZzJ0c1VuaXRUZXN0IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgIm1wZWcydHMvQVRTUGFyc2VyLmgiCisjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCisKKyNpbmNsdWRlICJNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oIgorCitjb25zdGV4cHIgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7Citjb25zdGV4cHIgdWludDE2X3Qga1BJRE1hc2sgPSAweDFGRkY7CisvLyBNYXggdmFsdWUgb2YgUElEIHdoaWNoIGlzIGFsc28gdXNlZCBmb3IgTnVsbCBwYWNrZXRzCitjb25zdGV4cHIgdWludDE2X3Qga1BJRE1heFZhbHVlID0gODE5MTsKK2NvbnN0ZXhwciB1aW50OF90IGtUU1N5bmNCeXRlID0gMHg0NzsKK2NvbnN0ZXhwciB1aW50OF90IGtWaWRlb1ByZXNlbnQgPSAweDAxOworY29uc3RleHByIHVpbnQ4X3Qga0F1ZGlvUHJlc2VudCA9IDB4MDI7Citjb25zdGV4cHIgdWludDhfdCBrTWV0YURhdGFQcmVzZW50ID0gMHgwNDsKKworc3RhdGljIE1wZWcydHNVbml0VGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1wZWcydHNVbml0VGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZyA6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qc291cmNlVHlwZSovIGNoYXIsIC8qbnVtU291cmNlKi8gdWludDE2X3Q+PiB7CisgIHB1YmxpYzoKKyAgICBNcGVnMnRzVW5pdFRlc3QoKQorICAgICAgICA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSwgbVNvdXJjZShudWxscHRyKSwgbUZwSW5wdXQobnVsbHB0ciksIG1QYXJzZXIobnVsbHB0cikge30KKworICAgIH5NcGVnMnRzVW5pdFRlc3QoKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIGZyZWUobUlucHV0QnVmZmVyKTsKKyAgICAgICAgaWYgKG1GcElucHV0KSBmY2xvc2UobUZwSW5wdXQpOworICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgICAgIG1OdW1EYXRhU291cmNlID0gMDsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBjaGFyLCB1aW50MTZfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgY2hhciBzb3VyY2VUeXBlID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIC8qIG1Tb3VyY2VUeXBlID0gMGIgeCB4IHggeCB4IE0gQSBWCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgfCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhICBhdWRpbyAgdmlkZW8gKi8KKyAgICAgICAgbU1lZGlhVHlwZSA9IChzb3VyY2VUeXBlICYgMHgwNyk7CisgICAgICAgIG1OdW1EYXRhU291cmNlID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwwPihwYXJhbXMpOworICAgICAgICBtRnBJbnB1dCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICAgICAgQVNTRVJUX05FKG1GcElucHV0LCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpbnQ4X3QgZXJyID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBsb25nIGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIG1Ub3RhbFBhY2tldHMgPSBmaWxlU2l6ZSAvIGtUU1BhY2tldFNpemU7CisgICAgICAgIGludDMyX3QgZmQgPSBmaWxlbm8obUZwSW5wdXQpOworICAgICAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciI7CisKKyAgICAgICAgbVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGR1cChmZCksIDAsIGJ1Zi5zdF9zaXplKTsKKyAgICAgICAgQVNTRVJUX05FKG1Tb3VyY2UsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBkYXRhIHNvdXJjZSEiOworCisgICAgICAgIG1QYXJzZXIgPSBuZXcgQVRTUGFyc2VyKCk7CisgICAgICAgIEFTU0VSVF9ORShtUGFyc2VyLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBBVFMgcGFyc2VyISI7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGtUU1BhY2tldFNpemUpOworICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVFMgcGFja2V0ISI7CisgICAgfQorCisgICAgdWludDY0X3QgbU9mZnNldDsKKyAgICB1aW50NjRfdCBtVG90YWxQYWNrZXRzOworICAgIHVpbnQxNl90IG1OdW1EYXRhU291cmNlOworCisgICAgaW50OF90IG1NZWRpYVR5cGU7CisKKyAgICB1aW50OF90ICptSW5wdXRCdWZmZXI7CisgICAgc3RyaW5nIG1JbnB1dEZpbGU7CisgICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKKyAgICBGSUxFICptRnBJbnB1dDsKKyAgICBBVFNQYXJzZXIgKm1QYXJzZXI7Cit9OworCitURVNUX1AoTXBlZzJ0c1VuaXRUZXN0LCBNZWRpYUluZm9UZXN0KSB7CisgICAgYm9vbCB2aWRlb0ZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBhdWRpb0ZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBtZXRhRGF0YUZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBzeW5jUG9pbnRQcmVzZW50ID0gZmFsc2U7CisKKyAgICBpbnQxNl90IHRvdGFsRGF0YVNvdXJjZSA9IDA7CisgICAgaW50MzJfdCB2YWwzMiA9IDA7CisgICAgdWludDhfdCBudW1EYXRhU291cmNlID0gMDsKKyAgICB1aW50OF90IHBhY2tldFtrVFNQYWNrZXRTaXplXTsKKyAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZCA9IC0xOworCisgICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgZXZlbnQobU9mZnNldCk7CisgICAgc3RhdGljIGNvbnN0IEFUU1BhcnNlcjo6U291cmNlVHlwZSBtZWRpYVR5cGVbXSA9IHtBVFNQYXJzZXI6OlZJREVPLCBBVFNQYXJzZXI6OkFVRElPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpNRVRBLCBBVFNQYXJzZXI6Ok5VTV9TT1VSQ0VfVFlQRVN9OworICAgIGNvbnN0IHVpbnQzMl90IG5NZWRpYVR5cGVzID0gc2l6ZW9mKG1lZGlhVHlwZSkgLyBzaXplb2YobWVkaWFUeXBlWzBdKTsKKworICAgIHdoaWxlICgobnVtQnl0ZXNSZWFkID0gbVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSkpID09IGtUU1BhY2tldFNpemUpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUocGFja2V0WzBdID09IGtUU1N5bmNCeXRlKSA8PCAiU3luYyBieXRlIGVycm9yISI7CisKKyAgICAgICAgLy8gcGlkIGlzIDEzIGJpdHMKKyAgICAgICAgdWludDE2X3QgcGlkID0gKHBhY2tldFsxXSArIChwYWNrZXRbMl0gPDwgOCkpICYga1BJRE1hc2s7CisgICAgICAgIEFTU0VSVF9UUlVFKHBpZCA8PSBrUElETWF4VmFsdWUpIDw8ICJJbnZhbGlkIFBJRDogIiA8PCBwaWQ7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSwgJmV2ZW50KTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKSA8PCAiVW5hYmxlIHRvIGZlZWQgVFMgcGFja2V0ISI7CisKKyAgICAgICAgbU9mZnNldCArPSBudW1CeXRlc1JlYWQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbk1lZGlhVHlwZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1QYXJzZXItPmhhc1NvdXJjZShtZWRpYVR5cGVbaV0pKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtZWRpYVR5cGVbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlZJREVPOgorICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVFNQYXJzZXI6OkFVRElPOgorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVFNQYXJzZXI6Ok1FVEE6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFUU1BhcnNlcjo6TlVNX1NPVVJDRV9UWVBFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bURhdGFTb3VyY2UgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvRm91bmQgJiYgYXVkaW9Gb3VuZCAmJiBtZXRhRGF0YUZvdW5kICYmIChudW1EYXRhU291cmNlID09IDMpKSBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5NZWRpYVR5cGVzOyBpKyspIHsKKyAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIGN1cnJlbnRNZWRpYVR5cGUgPSBtZWRpYVR5cGVbaV07CisgICAgICAgIGlmIChtUGFyc2VyLT5oYXNTb3VyY2UoY3VycmVudE1lZGlhVHlwZSkpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5oYXNSZXR1cm5lZERhdGEoKSkgeworICAgICAgICAgICAgICAgIHN5bmNQb2ludFByZXNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHN5bmNQYWNrZXRTb3VyY2UgPSBldmVudC5nZXRNZWRpYVNvdXJjZSgpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShzeW5jUGFja2V0U291cmNlLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNhbm5vdCBnZXQgc3luYyBzb3VyY2UgZm9yIG1lZGlhIHR5cGU6ICIgPDwgY3VycmVudE1lZGlhVHlwZTsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHN5bmNQYWNrZXRTb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKSA8PCAiRXJyb3IgcmV0dXJuZWQgd2hpbGUgc3RhcnRpbmchIjsKKworICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBzeW5jUGFja2V0U291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGdldCB0aGUgZm9ybWF0IG9mIHRoZSBzb3VyY2UgcGFja2V0ISI7CisKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZjsKKyAgICAgICAgICAgICAgICBzeW5jUGFja2V0U291cmNlLT5yZWFkKCZidWYsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShidWYsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gcmVhZCBzeW5jIHBhY2tldCBzb3VyY2UgZGF0YSI7CisKKyAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJmluTWV0YSA9IGJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgYm9vbCBzdGF0dXMgPSBpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCB0cnVlKSA8PCAiU3luYyBmcmFtZSBrZXkgaXMgbm90IHNldCI7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIGZhbHNlKSA8PCAiSW52YWxpZCBwYWNrZXQsIGZvdW5kIHNjcmFtYmxlZCBwYWNrZXRzISI7CisKKyAgICAgICAgICAgICAgICBlcnIgPSBzeW5jUGFja2V0U291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKSA8PCAiRXJyb3IgcmV0dXJuZWQgd2hpbGUgc3RvcHBpbmchIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYXJzZXItPmdldFNvdXJjZShjdXJyZW50TWVkaWFUeXBlKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShwYWNrZXRTb3VyY2UsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDYW5ub3QgZ2V0IHNvdXJjZSBmb3IgbWVkaWEgdHlwZTogIiA8PCBjdXJyZW50TWVkaWFUeXBlOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYWNrZXRTb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJFcnJvciByZXR1cm5lZCB3aGlsZSBzdGFydGluZyEiOworICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHBhY2tldFNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGdldCB0aGUgZm9ybWF0IG9mIHRoZSBwYWNrZXQhIjsKKworICAgICAgICAgICAgZXJyID0gcGFja2V0U291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJFcnJvciByZXR1cm5lZCB3aGlsZSBzdG9wcGluZyEiOworICAgICAgICB9CisgICAgfQorCisgICAgQVNTRVJUX0VRKHZpZGVvRm91bmQsIGJvb2wobU1lZGlhVHlwZSAmIGtWaWRlb1ByZXNlbnQpKSA8PCAiTm8gVmlkZW8gcGFja2V0cyBmb3VuZCEiOworICAgIEFTU0VSVF9FUShhdWRpb0ZvdW5kLCBib29sKG1NZWRpYVR5cGUgJiBrQXVkaW9QcmVzZW50KSkgPDwgIk5vIEF1ZGlvIHBhY2tldHMgZm91bmQhIjsKKyAgICBBU1NFUlRfRVEobWV0YURhdGFGb3VuZCwgYm9vbChtTWVkaWFUeXBlICYga01ldGFEYXRhUHJlc2VudCkpIDw8ICJObyBtZXRhIGRhdGEgZm91bmQhIjsKKworICAgIGlmICh2aWRlb0ZvdW5kIHx8IGF1ZGlvRm91bmQpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoc3luY1BvaW50UHJlc2VudCkgPDwgIk5vIHN5bmMgcG9pbnRzIGZvdW5kIGZvciBhdWRpby92aWRlbyI7CisgICAgfQorCisgICAgaWYgKHZpZGVvRm91bmQpIHRvdGFsRGF0YVNvdXJjZSArPSAxOworICAgIGlmIChhdWRpb0ZvdW5kKSB0b3RhbERhdGFTb3VyY2UgKz0gMTsKKyAgICBpZiAobWV0YURhdGFGb3VuZCkgdG90YWxEYXRhU291cmNlICs9IDE7CisKKyAgICBBU1NFUlRfVFJVRSh0b3RhbERhdGFTb3VyY2UgPT0gbU51bURhdGFTb3VyY2UpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgIiA8PCBtTnVtRGF0YVNvdXJjZSA8PCAiIGRhdGEgc291cmNlcywgZm91bmQgIiA8PCB0b3RhbERhdGFTb3VyY2U7CisgICAgaWYgKG51bURhdGFTb3VyY2UgPT0gMykgeworICAgICAgICBBU1NFUlRfRVEobnVtRGF0YVNvdXJjZSwgbU51bURhdGFTb3VyY2UpCisgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkICIgPDwgbU51bURhdGFTb3VyY2UgPDwgIiBkYXRhIHNvdXJjZXMsIGZvdW5kICIgPDwgdG90YWxEYXRhU291cmNlOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBpbmZvVGVzdCwgTXBlZzJ0c1VuaXRUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsIDB4MDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzZWdtZW50MDAwMDAxLnRzIiwgMHgwMywgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy50cyIsIDB4MDIsIDEpKSk7CisKK2ludDMyX3QgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IE1wZWcydHNVbml0VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgdWludDhfdCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIk1wZWcydHNVbml0IFRlc3QgUmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDFkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01QRUcyVFNfVU5JVF9URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX01QRUcyVFNfVU5JVF9URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19NUEVHMlRTX1VOSVRfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzN2NlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzggQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBNcGVnMlRTIFVuaXQgVGVzdCA6CitUaGUgTXBlZzJUUyBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJyYXJpZXMgcHJlc2VudCBpbiBNcGVnMlRTLgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbW1tIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0LworYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCisKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9NcGVnMnRzVW5pdFRlc3QvTXBlZzJ0c1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L01wZWcydHNVbml0VGVzdC9NcGVnMnRzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC56aXAgKS4KK0Rvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBNcGVnMnRzVW5pdFRlc3RSZXMvLiAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE1wZWcydHNVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9NcGVnMnRzVW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01wZWcydHNVbml0VGVzdFJlcy8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgTXBlZzJ0c1VuaXRUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCmluZGV4IGVlZjljZTMuLmViMTUwMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmg+CkBAIC00MSwyMSArNDEsMjEgQEAKIGNvbnN0ZXhwciBzaXplX3Qga01heE5vZGVJbnN0YW5jZXMgPSAoMSA8PCAxNik7CiAKIE9teDo6T214KCkgOgotICAgIG1NYXN0ZXIobmV3IE9NWE1hc3RlcigpKSwKKyAgICBtU3RvcmUobmV3IE9NWFN0b3JlKCkpLAogICAgIG1QYXJzZXIoKSB7CiAgICAgKHZvaWQpbVBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKCk7CiAgICAgKHZvaWQpbVBhcnNlci5wYXJzZVhtbFBhdGgobVBhcnNlci5kZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOwogfQogCiBPbXg6On5PbXgoKSB7Ci0gICAgZGVsZXRlIG1NYXN0ZXI7CisgICAgZGVsZXRlIG1TdG9yZTsKIH0KIAogUmV0dXJuPHZvaWQ+IE9teDo6bGlzdE5vZGVzKGxpc3ROb2Rlc19jYiBfaGlkbF9jYikgewogICAgIHN0ZDo6bGlzdDw6OmFuZHJvaWQ6OklPTVg6OkNvbXBvbmVudEluZm8+IGxpc3Q7CiAgICAgY2hhciBjb21wb25lbnROYW1lWzI1Nl07CiAgICAgZm9yIChPTVhfVTMyIGluZGV4ID0gMDsKLSAgICAgICAgICAgIG1NYXN0ZXItPmVudW1lcmF0ZUNvbXBvbmVudHMoCisgICAgICAgICAgICBtU3RvcmUtPmVudW1lcmF0ZUNvbXBvbmVudHMoCiAgICAgICAgICAgICBjb21wb25lbnROYW1lLCBzaXplb2YoY29tcG9uZW50TmFtZSksIGluZGV4KSA9PSBPTVhfRXJyb3JOb25lOwogICAgICAgICAgICAgKytpbmRleCkgewogICAgICAgICBsaXN0LnB1c2hfYmFjayg6OmFuZHJvaWQ6OklPTVg6OkNvbXBvbmVudEluZm8oKSk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIGluZm8ubU5hbWUgPSBjb21wb25lbnROYW1lOwogICAgICAgICA6OmFuZHJvaWQ6OlZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzg+IHJvbGVzOwogICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9Ci0gICAgICAgICAgICAgICAgbU1hc3Rlci0+Z2V0Um9sZXNPZkNvbXBvbmVudChjb21wb25lbnROYW1lLCAmcm9sZXMpOworICAgICAgICAgICAgICAgIG1TdG9yZS0+Z2V0Um9sZXNPZkNvbXBvbmVudChjb21wb25lbnROYW1lLCAmcm9sZXMpOwogICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKICAgICAgICAgICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IHJvbGVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgaW5mby5tUm9sZXMucHVzaF9iYWNrKHJvbGVzW2ldKTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgIHRoaXMsIG5ldyBMV09teE9ic2VydmVyKG9ic2VydmVyKSwgbmFtZS5jX3N0cigpKTsKIAogICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqaGFuZGxlOwotICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9IG1NYXN0ZXItPm1ha2VDb21wb25lbnRJbnN0YW5jZSgKKyAgICAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBtU3RvcmUtPm1ha2VDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksICZPTVhOb2RlSW5zdGFuY2U6OmtDYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZ2V0KCksICZoYW5kbGUpOwogCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0Vycm9yTm9uZTsKICAgICBpZiAoaW5zdGFuY2UtPmhhbmRsZSgpICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbU1hc3Rlci0+ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICBlcnIgPSBtU3RvcmUtPmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQ09NUE9ORU5UVFlQRSo+KGluc3RhbmNlLT5oYW5kbGUoKSkpOwogICAgIH0KICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCmluZGV4IDY3ZjQ3OGUuLmI1YzExNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCkBAIC01NCw2ICs1NCwyNCBAQAogICAgICAgICB9KTsKICAgICB9CiAKKyAgICBpZiAoIW5vZGVzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBhbnlOb2RlID0gbm9kZXMuY2JlZ2luKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBmaXJzdCA9IGFueU5vZGUtPmNiZWdpbigpOworICAgICAgICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGFueU5vZGUtPmNlbmQoKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA6IG5vZGVzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQxID0gZmlyc3Q7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdDIgPSBuYW1lLmNiZWdpbigpOworICAgICAgICAgICAgICAgICAgICBpdDEgIT0gbGFzdCAmJiBpdDIgIT0gbmFtZS5jZW5kKCkgJiYgdG9sb3dlcigqaXQxKSA9PSB0b2xvd2VyKCppdDIpOworICAgICAgICAgICAgICAgICAgICArK2l0MSwgKytpdDIpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3QgPSBpdDE7CisgICAgICAgIH0KKyAgICAgICAgbVByZWZpeCA9IHN0ZDo6c3RyaW5nKGZpcnN0LCBsYXN0KTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJvbXggY29tbW9uIHByZWZpeDogJyIgPDwgbVByZWZpeC5jX3N0cigpIDw8ICInIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coSU5GTykgPDwgIm9teCBjb21tb24gcHJlZml4OiBubyBub2RlcyI7CisgICAgfQorCiAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyOwogICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKHhtbE5hbWVzLCBzZWFyY2hEaXJzKTsKICAgICBpZiAocHJvZmlsaW5nUmVzdWx0c1htbFBhdGggIT0gbnVsbHB0cikgewpAQCAtMTEyLDggKzEzMCw2IEBACiAgICAgICAgIG1Sb2xlTGlzdFtpXSA9IHN0ZDo6bW92ZShyb2xlKTsKICAgICAgICAgKytpOwogICAgIH0KLQotICAgIG1QcmVmaXggPSBwYXJzZXIuZ2V0Q29tbW9uUHJlZml4KCk7CiB9CiAKIE9teFN0b3JlOjp+T214U3RvcmUoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCmluZGV4IDc4YjRmMTkuLjdjMzcyY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCkBAIC03LDcgKzcsNyBAQAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIk9NWE1hc3Rlci5jcHAiLAorICAgICAgICAiT01YU3RvcmUuY3BwIiwKICAgICAgICAgIk9NWE5vZGVJbnN0YW5jZS5jcHAiLAogICAgICAgICAiT01YVXRpbHMuY3BwIiwKICAgICAgICAgIk9teEdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggYWM0MjM3My4uYmViZDUxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCmluZGV4IDA5NGIxZjUuLmU4ZmVlNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKQEAgLTE1LDExICsxNSwxMSBAQAogICovCiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiT01YTWFzdGVyIgorI2RlZmluZSBMT0dfVEFHICJPTVhTdG9yZSIKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIApAQCAtMzAsNyArMzAsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLU9NWE1hc3Rlcjo6T01YTWFzdGVyKCkgeworT01YU3RvcmU6Ok9NWFN0b3JlKCkgewogCiAgICAgcGlkX3QgcGlkID0gZ2V0cGlkKCk7CiAgICAgY2hhciBmaWxlbmFtZVsyMF07CkBAIC01NSwxOSArNTUsMTkgQEAKICAgICBhZGRQbGF0Zm9ybVBsdWdpbigpOwogfQogCi1PTVhNYXN0ZXI6On5PTVhNYXN0ZXIoKSB7CitPTVhTdG9yZTo6fk9NWFN0b3JlKCkgewogICAgIGNsZWFyUGx1Z2lucygpOwogfQogCi12b2lkIE9NWE1hc3Rlcjo6YWRkVmVuZG9yUGx1Z2luKCkgewordm9pZCBPTVhTdG9yZTo6YWRkVmVuZG9yUGx1Z2luKCkgewogICAgIGFkZFBsdWdpbigibGlic3RhZ2VmcmlnaHRody5zbyIpOwogfQogCi12b2lkIE9NWE1hc3Rlcjo6YWRkUGxhdGZvcm1QbHVnaW4oKSB7Cit2b2lkIE9NWFN0b3JlOjphZGRQbGF0Zm9ybVBsdWdpbigpIHsKICAgICBhZGRQbHVnaW4oImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXhfcGx1Z2luLnNvIik7CiB9CiAKLXZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSkgewordm9pZCBPTVhTdG9yZTo6YWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpIHsKICAgICBpZiAoOjphbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgidmVuZG9yLm1lZGlhLm9teCIsIGludDY0X3QoMSkpID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTk5LDcgKzk5LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKSB7Cit2b2lkIE9NWFN0b3JlOjphZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIE9NWF9VMzIgaW5kZXggPSAwOwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgfQogfQogCi12b2lkIE9NWE1hc3Rlcjo6Y2xlYXJQbHVnaW5zKCkgewordm9pZCBPTVhTdG9yZTo6Y2xlYXJQbHVnaW5zKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBtUGx1Z2luQnlDb21wb25lbnROYW1lLmNsZWFyKCk7CkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICBtUGx1Z2lucy5jbGVhcigpOwogfQogCi1PTVhfRVJST1JUWVBFIE9NWE1hc3Rlcjo6bWFrZUNvbXBvbmVudEluc3RhbmNlKAorT01YX0VSUk9SVFlQRSBPTVhTdG9yZTo6bWFrZUNvbXBvbmVudEluc3RhbmNlKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKQEAgLTE3Nyw3ICsxNzcsNyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLU9NWF9FUlJPUlRZUEUgT01YTWFzdGVyOjpkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCitPTVhfRVJST1JUWVBFIE9NWFN0b3JlOjpkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCiAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC0xOTMsNyArMTkzLDcgQEAKICAgICByZXR1cm4gcGx1Z2luLT5kZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50KTsKIH0KIAotT01YX0VSUk9SVFlQRSBPTVhNYXN0ZXI6OmVudW1lcmF0ZUNvbXBvbmVudHMoCitPTVhfRVJST1JUWVBFIE9NWFN0b3JlOjplbnVtZXJhdGVDb21wb25lbnRzKAogICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCiAgICAgICAgIHNpemVfdCBzaXplLAogICAgICAgICBPTVhfVTMyIGluZGV4KSB7CkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKIH0KIAotT01YX0VSUk9SVFlQRSBPTVhNYXN0ZXI6OmdldFJvbGVzT2ZDb21wb25lbnQoCitPTVhfRVJST1JUWVBFIE9NWFN0b3JlOjpnZXRSb2xlc09mQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICBWZWN0b3I8U3RyaW5nOD4gKnJvbGVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCmluZGV4IDFiODQ5M2EuLmQ2ZDI4MGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcApAQCAtMzU0LDcgKzM1NCw3IEBACiAgICAgRGVzY3JpYmVDb2xvckZvcm1hdDJQYXJhbXMgZGVzY3JpYmVQYXJhbXM7CiAgICAgSW5pdE9NWFBhcmFtcygmZGVzY3JpYmVQYXJhbXMpOwogICAgIGRlc2NyaWJlUGFyYW1zLmVDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSljb2xvckZvcm1hdDsKLSAgICAvLyByZWFzb25hYmxlIGR1bW15IHZhbHVlcworICAgIC8vIHJlYXNvbmFibGUgaW5pdGlhbCB2YWx1ZXMgKHRoYXQgd2lsbCBiZSBvdmVyd3JpdHRlbikKICAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVXaWR0aCA9IDEyODsKICAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVIZWlnaHQgPSAxMjg7CiAgICAgZGVzY3JpYmVQYXJhbXMublN0cmlkZSA9IDEyODsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCmluZGV4IDVhNDZiMjYuLjg0YWU1MTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaApAQCAtMjcsNyArMjcsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBPTVhNYXN0ZXI7CitzdHJ1Y3QgT01YU3RvcmU7CiBzdHJ1Y3QgT01YTm9kZUluc3RhbmNlOwogCiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtNTEsNyArNTEsNyBAQAogdXNpbmcgOjphbmRyb2lkOjpzcDsKIHVzaW5nIDo6YW5kcm9pZDo6d3A7CiAKLXVzaW5nIDo6YW5kcm9pZDo6T01YTWFzdGVyOwordXNpbmcgOjphbmRyb2lkOjpPTVhTdG9yZTsKIHVzaW5nIDo6YW5kcm9pZDo6T01YTm9kZUluc3RhbmNlOwogCiBzdHJ1Y3QgT214IDogcHVibGljIElPbXgsIHB1YmxpYyBoaWRsX2RlYXRoX3JlY2lwaWVudCB7CkBAIC03Myw3ICs3Myw3IEBACiAgICAgc3RhdHVzX3QgZnJlZU5vZGUoc3A8T01YTm9kZUluc3RhbmNlPiBjb25zdCYgaW5zdGFuY2UpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgT01YTWFzdGVyKiBtTWFzdGVyOworICAgIE9NWFN0b3JlKiBtU3RvcmU7CiAgICAgTXV0ZXggbUxvY2s7CiAgICAgS2V5ZWRWZWN0b3I8d3A8SUJhc2U+LCBzcDxPTVhOb2RlSW5zdGFuY2U+ID4gbUxpdmVOb2RlczsKICAgICBLZXllZFZlY3RvcjxPTVhOb2RlSW5zdGFuY2UqLCB3cDxJQmFzZT4gPiBtTm9kZTJPYnNlcnZlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCBhNzYxZWY2Li41ZjMyYzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCkBAIC0zMyw3ICszMyw3IEBACiBjbGFzcyBHcmFwaGljQnVmZmVyOwogY2xhc3MgSU9NWEJ1ZmZlclNvdXJjZTsKIGNsYXNzIElPTVhPYnNlcnZlcjsKLXN0cnVjdCBPTVhNYXN0ZXI7CitzdHJ1Y3QgT01YU3RvcmU7CiBjbGFzcyBPTVhCdWZmZXI7CiB1c2luZyBJSGlkbE1lbW9yeSA9IGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKIHVzaW5nIGhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6T214OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaAppbmRleCA5M2VhZWYxLi41ZDZjM2VkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKQEAgLTE0LDkgKzE0LDkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgT01YX01BU1RFUl9IXworI2lmbmRlZiBPTVhfU1RPUkVfSF8KIAotI2RlZmluZSBPTVhfTUFTVEVSX0hfCisjZGVmaW5lIE9NWF9TVE9SRV9IXwogCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvT01YUGx1Z2luQmFzZS5oPgogCkBAIC0yNyw5ICsyNyw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE9NWE1hc3RlciA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKLSAgICBPTVhNYXN0ZXIoKTsKLSAgICB2aXJ0dWFsIH5PTVhNYXN0ZXIoKTsKK3N0cnVjdCBPTVhTdG9yZSA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKKyAgICBPTVhTdG9yZSgpOworICAgIHZpcnR1YWwgfk9NWFN0b3JlKCk7CiAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKQEAgLTY2LDEwICs2NiwxMCBAQAogICAgIHZvaWQgYWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbik7CiAgICAgdm9pZCBjbGVhclBsdWdpbnMoKTsKIAotICAgIE9NWE1hc3Rlcihjb25zdCBPTVhNYXN0ZXIgJik7Ci0gICAgT01YTWFzdGVyICZvcGVyYXRvcj0oY29uc3QgT01YTWFzdGVyICYpOworICAgIE9NWFN0b3JlKGNvbnN0IE9NWFN0b3JlICYpOworICAgIE9NWFN0b3JlICZvcGVyYXRvcj0oY29uc3QgT01YU3RvcmUgJik7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIE9NWF9NQVNURVJfSF8KKyNlbmRpZiAgLy8gT01YX1NUT1JFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggYmI2NmY0Yy4uYzMzYmYzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMzI5LDYgKzMyOSw3IEBACiAgICAgbVBhc3MuY2xlYXIoKTsKICAgICBtQXV0aFR5cGUgPSBOT05FOwogICAgIG1Ob25jZS5jbGVhcigpOworICAgIG1SZWFsbS5jbGVhcigpOwogCiAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogfQpAQCAtOTExLDYgKzkxMiwxNCBAQAogICAgICAgICBDSEVDS19HRShqLCAwKTsKIAogICAgICAgICBtTm9uY2Uuc2V0VG8odmFsdWUsIGkgKyA3LCBqIC0gaSAtIDcpOworCisgICAgICAgIGkgPSB2YWx1ZS5maW5kKCJyZWFsbT0iKTsKKyAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7CisgICAgICAgIENIRUNLX0VRKHZhbHVlLmNfc3RyKClbaSArIDZdLCAnXCInKTsKKyAgICAgICAgaiA9IHZhbHVlLmZpbmQoIlwiIiwgaSArIDcpOworICAgICAgICBDSEVDS19HRShqLCAwKTsKKworICAgICAgICBtUmVhbG0uc2V0VG8odmFsdWUsIGkgKyA3LCBqIC0gaSAtIDcpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwpAQCAtOTkzLDcgKzEwMDIsNyBAQAogICAgIEFTdHJpbmcgQTE7CiAgICAgQTEuYXBwZW5kKG1Vc2VyKTsKICAgICBBMS5hcHBlbmQoIjoiKTsKLSAgICBBMS5hcHBlbmQoIlN0cmVhbWluZyBTZXJ2ZXIiKTsKKyAgICBBMS5hcHBlbmQobVJlYWxtKTsKICAgICBBMS5hcHBlbmQoIjoiKTsKICAgICBBMS5hcHBlbmQobVBhc3MpOwogCkBAIC0xMDI5LDYgKzEwMzgsOSBAQAogICAgIGZyYWdtZW50LmFwcGVuZCgiXCIsICIpOwogICAgIGZyYWdtZW50LmFwcGVuZCgicmVzcG9uc2U9XCIiKTsKICAgICBmcmFnbWVudC5hcHBlbmQoZGlnZXN0KTsKKyAgICBmcmFnbWVudC5hcHBlbmQoIlwiLCAiKTsKKyAgICBmcmFnbWVudC5hcHBlbmQoInJlYWxtPVwiIik7CisgICAgZnJhZ21lbnQuYXBwZW5kKG1SZWFsbSk7CiAgICAgZnJhZ21lbnQuYXBwZW5kKCJcIiIpOwogICAgIGZyYWdtZW50LmFwcGVuZCgiXHJcbiIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaAppbmRleCA1NmI2MDRkLi43Y2RkNGMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKQEAgLTg0LDYgKzg0LDcgQEAKICAgICBBU3RyaW5nIG1Vc2VyLCBtUGFzczsKICAgICBBdXRoVHlwZSBtQXV0aFR5cGU7CiAgICAgQVN0cmluZyBtTm9uY2U7CisgICAgQVN0cmluZyBtUmVhbG07CiAgICAgaW50IG1Tb2NrZXQ7CiAgICAgaW50MzJfdCBtQ29ubmVjdGlvbklEOwogICAgIGludDMyX3QgbU5leHRDU2VxOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCmluZGV4IGNjMzZiNzguLmMwNTNiZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkMWE2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkVTRFNUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkVTRFNUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGZiYzdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIEVTRFMgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iRVNEU1Rlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iRVNEU1Rlc3QtPi9kYXRhL2xvY2FsL3RtcC9FU0RTVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdFJlcy0xLjAuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iRVNEU1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9FU0RTVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFlMDBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdC5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkVTRFNUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8RVNEUy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCisjaW5jbHVkZSAiRVNEU1Rlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIEVTRFNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitzdHJ1Y3QgRVNEU1BhcmFtcyB7CisgICAgY29uc3QgY2hhciAqaW5wdXRGaWxlOworICAgIGludDMyX3Qgb2JqZWN0VHlwZUluZGljYXRpb247CisgICAgY29uc3QgY2hhciAqY29kZWNTcGVjaWZpY0luZm9EYXRhOworICAgIGludDMyX3QgY29kZWNTcGVjaWZpY0luZm9EYXRhU2l6ZTsKKyAgICBpbnQzMl90IGJpdHJhdGVNYXg7CisgICAgaW50MzJfdCBiaXRyYXRlQXZnOworfTsKKworY2xhc3MgRVNEU1VuaXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXRGaWxlICovIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2JqZWN0VHlwZUluZGljYXRpb24gKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZWNTcGVjaWZpY0luZm9EYXRhICovIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZWNTcGVjaWZpY0luZm9EYXRhU2l6ZSAqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXRyYXRlTWF4ICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdHJhdGVBdmcgKi8gaW50MzJfdD4+IHsKKyAgcHVibGljOgorICAgIEVTRFNVbml0VGVzdCgpIDogbUVTRFNEYXRhKG51bGxwdHIpIHsKKyAgICAgICAgbUVTRFNQYXJhbXMuaW5wdXRGaWxlID0gZ2V0PDA+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5vYmplY3RUeXBlSW5kaWNhdGlvbiA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbUVTRFNQYXJhbXMuY29kZWNTcGVjaWZpY0luZm9EYXRhID0gZ2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5jb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5iaXRyYXRlTWF4ID0gZ2V0PDQ+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5iaXRyYXRlQXZnID0gZ2V0PDU+KEdldFBhcmFtKCkpOworICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtRGF0YVNvdXJjZSkgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1JbnB1dEZwKSB7CisgICAgICAgICAgICBmY2xvc2UobUlucHV0RnApOworICAgICAgICAgICAgbUlucHV0RnAgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWFkRVNEU0RhdGEoKSk7IH0KKyAgICBjb25zdCB2b2lkICptRVNEU0RhdGE7CisgICAgc2l6ZV90IG1FU0RTU2l6ZTsKKyAgICBFU0RTUGFyYW1zIG1FU0RTUGFyYW1zOworCisgIHByaXZhdGU6CisgICAgdm9pZCByZWFkRVNEU0RhdGEoKSB7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIG1FU0RTUGFyYW1zLmlucHV0RmlsZTsKKyAgICAgICAgbUlucHV0RnAgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiIik7CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRGcCwgbnVsbHB0cikgPDwgIkZpbGUgb3BlbiBmYWlsZWQgZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworICAgICAgICBpbnQzMl90IGZkID0gZmlsZW5vKG1JbnB1dEZwKTsKKyAgICAgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmlsZSBkZXNjcmlwdG9yIGludmFsaWQgZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZTogIiA8PCBtRVNEU1BhcmFtcy5pbnB1dEZpbGU7CisgICAgICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworCisgICAgICAgIG1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZHVwKGZkKSwgMCwgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUobURhdGFTb3VyY2UsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG1EYXRhU291cmNlKTsKKyAgICAgICAgaWYgKGV4dHJhY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJVbmFibGUgdG8gY3JlYXRlIGV4dHJhY3RvciBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbnVtVHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgICAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiTm8gdHJhY2tzIGluIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworICAgICAgICBBU1NFUlRfVFJVRShlc2RzRGF0YVByZXNlbnQobnVtVHJhY2tzLCBleHRyYWN0b3IpKQorICAgICAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gZmluZCBlc2RzIGluIGFueSB0cmFjayBpbiBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKyAgICB9CisKKyAgICBib29sIGVzZHNEYXRhUHJlc2VudChzaXplX3QgbnVtVHJhY2tzLCBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvcikgeworICAgICAgICBib29sIGZvdW5kRVNEUyA9IGZhbHNlOworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgICAgICAgICAgaWYgKHRyYWNrTWV0YSAhPSBudWxscHRyICYmCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZtRVNEU0RhdGEsICZtRVNEU1NpemUpKSB7CisgICAgICAgICAgICAgICAgdHJhY2tNZXRhLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGZvdW5kRVNEUyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvdW5kRVNEUzsKKyAgICB9CisKKyAgICBGSUxFICptSW5wdXRGcDsKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKK307CisKK1RFU1RfUChFU0RTVW5pdFRlc3QsIEludmFsaWREYXRhVGVzdCkgeworICAgIHZvaWQgKmludmFsaWREYXRhID0gY2FsbG9jKG1FU0RTU2l6ZSwgMSk7CisgICAgQVNTRVJUX05FKGludmFsaWREYXRhLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSI7CisgICAgRVNEUyBlc2RzKGludmFsaWREYXRhLCBtRVNEU1NpemUpOworICAgIGZyZWUoaW52YWxpZERhdGEpOworICAgIEFTU0VSVF9ORShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgImludmFsaWQgRVNEUyBkYXRhIGFjY2VwdGVkIjsKK30KKworVEVTVChFU0RTU2FuaXR5VW5pdFRlc3QsIENvbnN0cnVjdG9yU2FuaXR5VGVzdCkgeworICAgIHZvaWQgKmludmFsaWREYXRhID0gbWFsbG9jKDEpOworICAgIEFTU0VSVF9ORShpbnZhbGlkRGF0YSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiOworICAgIEVTRFMgZXNkc196ZXJvKGludmFsaWREYXRhLCAwKTsKKyAgICBmcmVlKGludmFsaWREYXRhKTsKKyAgICBBU1NFUlRfTkUoZXNkc196ZXJvLkluaXRDaGVjaygpLCBPSykgPDwgImludmFsaWQgRVNEUyBkYXRhIGFjY2VwdGVkIjsKKworICAgIEVTRFMgZXNkc19udWxsKE5VTEwsIDApOworICAgIEFTU0VSVF9ORShlc2RzX251bGwuSW5pdENoZWNrKCksIE9LKSA8PCAiaW52YWxpZCBFU0RTIGRhdGEgYWNjZXB0ZWQiOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBDcmVhdGVBbmREZXN0cm95VGVzdCkgeworICAgIEVTRFMgZXNkcyhtRVNEU0RhdGEsIG1FU0RTU2l6ZSk7CisgICAgQVNTRVJUX0VRKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiRVNEUyBkYXRhIGludmFsaWQiOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBPYmplY3RUeXBlSW5kaWNhdGlvblRlc3QpIHsKKyAgICBFU0RTIGVzZHMobUVTRFNEYXRhLCBtRVNEU1NpemUpOworICAgIEFTU0VSVF9FUShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgIkVTRFMgZGF0YSBpbnZhbGlkIjsKKyAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOworICAgIHN0YXR1c190IHN0YXR1cyA9IGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkVTRFMgb2JqZWN0VHlwZUluZGljYXRpb24gZGF0YSBpbnZhbGlkIjsKKyAgICBBU1NFUlRfRVEob2JqZWN0VHlwZUluZGljYXRpb24sIG1FU0RTUGFyYW1zLm9iamVjdFR5cGVJbmRpY2F0aW9uKQorICAgICAgICAgICAgPDwgIkVTRFMgb2JqZWN0VHlwZUluZGljYXRpb24gZGF0YSBkb2Vzbid0IG1hdGNoIjsKK30KKworVEVTVF9QKEVTRFNVbml0VGVzdCwgQ29kZWNTcGVjaWZpY0luZm9UZXN0KSB7CisgICAgRVNEUyBlc2RzKG1FU0RTRGF0YSwgbUVTRFNTaXplKTsKKyAgICBBU1NFUlRfRVEoZXNkcy5Jbml0Q2hlY2soKSwgT0spIDw8ICJFU0RTIGRhdGEgaW52YWxpZCI7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGNvbnN0IHZvaWQgKmNvZGVjU3BlY2lmaWNJbmZvOworICAgIHNpemVfdCBjb2RlY1NwZWNpZmljSW5mb1NpemU7CisgICAgc3RhdHVzID0gZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY29kZWNTcGVjaWZpY0luZm8sICZjb2RlY1NwZWNpZmljSW5mb1NpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRVNEUyBnZXRDb2RlY1NwZWNpZmljSW5mbyBkYXRhIGludmFsaWQiOworICAgIEFTU0VSVF9FUShtRVNEU1BhcmFtcy5jb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplLCBjb2RlY1NwZWNpZmljSW5mb1NpemUpCisgICAgICAgICAgICA8PCAiQ29kZWNTcGVjaWZpY0luZm8gZGF0YSBkb2Vzbid0IG1hdGNoIjsKKyAgICBzdGF0dXMgPSBtZW1jbXAoY29kZWNTcGVjaWZpY0luZm8sIG1FU0RTUGFyYW1zLmNvZGVjU3BlY2lmaWNJbmZvRGF0YSwgY29kZWNTcGVjaWZpY0luZm9TaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiQ29kZWNTcGVjaWZpY0luZm8gZGF0YSBkb2Vzbid0IG1hdGNoIjsKK30KKworVEVTVF9QKEVTRFNVbml0VGVzdCwgR2V0Qml0cmF0ZVRlc3QpIHsKKyAgICBFU0RTIGVzZHMobUVTRFNEYXRhLCBtRVNEU1NpemUpOworICAgIEFTU0VSVF9FUShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgIkVTRFMgZGF0YSBpbnZhbGlkIjsKKyAgICB1aW50MzJfdCBiaXRyYXRlTWF4OworICAgIHVpbnQzMl90IGJpdHJhdGVBdmc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZXNkcy5nZXRCaXRSYXRlKCZiaXRyYXRlTWF4LCAmYml0cmF0ZUF2Zyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJFU0RTIGJpdFJhdGUgZGF0YSBpbnZhbGlkIjsKKyAgICBBU1NFUlRfRVEoYml0cmF0ZU1heCwgbUVTRFNQYXJhbXMuYml0cmF0ZU1heCkgPDwgIkVTRFMgYml0cmF0ZU1heCBkb2Vzbid0IG1hdGNoIjsKKyAgICBBU1NFUlRfRVEoYml0cmF0ZUF2ZywgbUVTRFNQYXJhbXMuYml0cmF0ZUF2ZykgPDwgIkVTRFMgYml0cmF0ZUF2ZyBkb2Vzbid0IG1hdGNoIjsKKyAgICBBU1NFUlRfTEUoYml0cmF0ZUF2ZywgYml0cmF0ZU1heCkgPDwgIkVTRFMgYml0cmF0ZU1heCBpcyBsZXNzIHRoYW4gYml0cmF0ZUF2ZyI7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgRVNEU1VuaXRUZXN0QWxsLCBFU0RTVW5pdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIElucHV0RmlsZSwgT2JqZWN0VHlwZUluZGljYXRpb24sIENvZGVjU3BlY2lmaWNJbmZvRGF0YSwKKyAgICAgICAgICAgICAgICAvLyBDb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplLCBCaXRyYXRlTWF4LCBCaXRyYXRlQXZnCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgidmlkZW9fMTc2eDE0NF8zZ3BfaDI2M181NmticHNfMTJmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzIyMDUwaHouM2dwIiwgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgxM1x4OTAiLCAyLCAxMzEwNzIsIDApLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZpZGVvXzEyODB4NzIwX21wNF9tcGVnMl8zMDAwa2Jwc18zMGZwc19hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAxXHhCM1x4NTBceDAyXHhEMFx4MzVceEZGXHhGRlx4RTFceEEwXHgwMFx4MDBceDAxXHhCNVx4MTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg2QVx4MDBceDAxXHgwMFx4MDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIsIDM0MTU0NTIsIDM0MTU0NTIpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZpZGVvXzE3NngxNDRfM2dwX2gyNjNfNTZrYnBzXzI1ZnBzX2FhY19tb25vXzI0a2Jwc18xMTAyNWh6LjNncCIsIDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MTVceDA4IiwgMiwgMjQ1NzYsIDApKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIC8vIE1lZGlhRXh0cmFjdG9yIG5lZWRzIGJpbmRlciB0aHJlYWQgcG9vbAorICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBnRW52ID0gbmV3IEVTRFNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EyMzAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19FU0RTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fRVNEU19URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBFU0RTVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgRVNEU1Rlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBFU0RTVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fRVNEU19URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBmYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEVTRFMgVW5pdCBUZXN0IDoKK1RoZSBFU0RTIFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIEVTRFMgY2xhc3MgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBFU0RTVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9FU0RTVGVzdC9FU0RTVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L0VTRFNUZXN0L0VTRFNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9FU0RTVGVzdFJlcy0xLjAuemlwKQorRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIEVTRFNUZXN0UmVzIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogRVNEU1Rlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvRVNEU1Rlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBFU0RTVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZiOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiSEVWQ1V0aWxzVW5pdFRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiSEVWQ1V0aWxzVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjg1MGEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIEhFVkMgVXRpbHMgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IkhFVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJIRVZDVXRpbHNVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0hFVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0hFVkNVdGlscy9IRVZDVXRpbHNVbml0VGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJIRVZDVXRpbHNVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0hFVkNVdGlsc1VuaXRUZXN0LyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ4MWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0hFVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19IRVZDX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IEhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX0hFVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0YTA0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIZXZjVXRpbGl0eVRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSAiaW5jbHVkZS9IZXZjVXRpbHMuaCIKKworI2luY2x1ZGUgIkhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gbWF4IHNpemUgb2YgaHZjYyBib3ggaXMgMiBLQgorY29uc3RleHByIHVpbnQzMl90IGtIdmNjQm94TWF4U2l6ZSA9IDIwNDg7Citjb25zdGV4cHIgdWludDMyX3Qga0h2Y2NCb3hNaW5TaXplID0gMjA7Citjb25zdGV4cHIgdWludDMyX3Qga1ZQU0NvZGUgPSAzMjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrU1BTQ29kZSA9IDMzOworY29uc3RleHByIHVpbnQzMl90IGtQUFNDb2RlID0gMzQ7Citjb25zdGV4cHIgdWludDMyX3Qga05BTFNpemVMZW5ndGggPSAyOworCitzdGF0aWMgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgSEVWQ1V0aWxzVW5pdFRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qaW5mb0ZpbGVOYW1lKi8gc3RyaW5nLCAvKm51bVZQU05hbHMqLyBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgIC8qbnVtU1BTTmFscyovIHNpemVfdCwgLypudW1QUFNOYWxzKi8gc2l6ZV90LCAvKmZyYW1lUmF0ZSovIGludDE2X3QsCisgICAgICAgICAgICAgICAgICAgIC8qaXNIZHIqLyBib29sPj4geworICBwdWJsaWM6CisgICAgfkhFVkNVdGlsc1VuaXRUZXN0KCkgeworICAgICAgICBpZiAobU1lZGlhRmlsZVN0cmVhbS5pc19vcGVuKCkpIG1NZWRpYUZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgaWYgKG1JbmZvRmlsZVN0cmVhbS5pc19vcGVuKCkpIG1JbmZvRmlsZVN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBzdHJpbmcsIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsIGludDE2X3QsIGJvb2w+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIHN0cmluZyBpbnB1dE1lZGlhRmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1NZWRpYUZpbGVTdHJlYW0ub3BlbihpbnB1dE1lZGlhRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobU1lZGlhRmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbiBtZWRpYSBmaWxlOiAiIDw8IGlucHV0TWVkaWFGaWxlOworCisgICAgICAgIHN0cmluZyBpbnB1dEluZm9GaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUluZm9GaWxlU3RyZWFtLm9wZW4oaW5wdXRJbmZvRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIGluZm8gZmlsZTogIiA8PCBpbnB1dEluZm9GaWxlOworCisgICAgICAgIG1OdW1WUFNOYWxzID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgICAgIG1OdW1TUFNOYWxzID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgICAgIG1OdW1QUFNOYWxzID0gZ2V0PDQ+KHBhcmFtcyk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBnZXQ8NT4ocGFyYW1zKTsKKyAgICAgICAgbUlzSERSID0gZ2V0PDY+KHBhcmFtcyk7CisgICAgfQorCisgICAgc2l6ZV90IG1OdW1WUFNOYWxzOworICAgIHNpemVfdCBtTnVtU1BTTmFsczsKKyAgICBzaXplX3QgbU51bVBQU05hbHM7CisgICAgaW50MTZfdCBtRnJhbWVSYXRlOworICAgIGJvb2wgbUlzSERSOworICAgIGlmc3RyZWFtIG1NZWRpYUZpbGVTdHJlYW07CisgICAgaWZzdHJlYW0gbUluZm9GaWxlU3RyZWFtOworfTsKKworVEVTVF9QKEhFVkNVdGlsc1VuaXRUZXN0LCBOQUxVbml0VGVzdCkgeworICAgIEhldmNQYXJhbWV0ZXJTZXRzIGhldmNQYXJhbXM7CisKKyAgICBzdHJpbmcgbGluZTsKKyAgICBpbnQzMl90IGluZGV4ID0gMDsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICBzdHJpbmcgdHlwZTsKKyAgICAgICAgaW50MzJfdCBjaHVua0xlbmd0aDsKKworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdHlwZSA+PiBjaHVua0xlbmd0aDsKKyAgICAgICAgQVNTRVJUX0dUKGNodW5rTGVuZ3RoLCAwKSA8PCAiTGVuZ3RoIG9mIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisKKyAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyICopbWFsbG9jKGNodW5rTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBjaHVua0xlbmd0aDsKKworICAgICAgICBtTWVkaWFGaWxlU3RyZWFtLnJlYWQoZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEobU1lZGlhRmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZpbGUsIGJ5dGVzIHJlYWQ6ICIgPDwgbU1lZGlhRmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgICAgICAvLyBBIHZhbGlkIHN0YXJ0Y29kZSBjb25zaXN0cyBvZiBhdCBsZWFzdCB0d28gMHgwMCBieXRlcyBmb2xsb3dlZCBieSAweDAxLgorICAgICAgICBpbnQzMl90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoOyBvZmZzZXQgKyAyIDwgY2h1bmtMZW5ndGg7ICsrb2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXQgKyAyXSA9PSAweDAxICYmIGRhdGFbb2Zmc2V0ICsgMV0gPT0gMHgwMCAmJiBkYXRhW29mZnNldF0gPT0gMHgwMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAzOworICAgICAgICBBU1NFUlRfTEUob2Zmc2V0LCBjaHVua0xlbmd0aCkgPDwgIk5BTCB1bml0IG9mZnNldCBtdXN0IG5vdCBleGNlZWQgdGhlIGNodW5rIGxlbmd0aCI7CisKKyAgICAgICAgdWludDhfdCAqbmFsVW5pdCA9ICh1aW50OF90ICopKGRhdGEgKyBvZmZzZXQpOworICAgICAgICBzaXplX3QgbmFsVW5pdExlbmd0aCA9IGNodW5rTGVuZ3RoIC0gb2Zmc2V0OworCisgICAgICAgIC8vIEFkZCBOQUwgdW5pdHMgb25seSBpZiB0aGV5J3JlIG9mIHR5cGU6IFZQUy9TUFMvUFBTL1NFSQorICAgICAgICBpZiAoISgodHlwZS5jb21wYXJlKCJWUFMiKSAmJiB0eXBlLmNvbXBhcmUoIlNQUyIpICYmIHR5cGUuY29tcGFyZSgiUFBTIikgJiYKKyAgICAgICAgICAgICAgIHR5cGUuY29tcGFyZSgiU0VJIikpKSkgeworICAgICAgICAgICAgZXJyID0gaGV2Y1BhcmFtcy5hZGROYWxVbml0KG5hbFVuaXQsIG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFkZCBOQUwgVW5pdCB0eXBlOiAiIDw8IHR5cGUgPDwgIiBTaXplOiAiIDw8IG5hbFVuaXRMZW5ndGg7CisKKyAgICAgICAgICAgIHNpemVfdCBzaXplTmFsVW5pdCA9IGhldmNQYXJhbXMuZ2V0U2l6ZShpbmRleCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoc2l6ZU5hbFVuaXQsIG5hbFVuaXRMZW5ndGgpIDw8ICJJbnZhbGlkIHNpemUgcmV0dXJuZWQgZm9yIE5BTDogIiA8PCB0eXBlOworCisgICAgICAgICAgICB1aW50OF90ICpkZXN0aW5hdGlvbiA9ICh1aW50OF90ICopbWFsbG9jKG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX05FKGRlc3RpbmF0aW9uLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBvZiBzaXplOiAiIDw8IG5hbFVuaXRMZW5ndGg7CisKKyAgICAgICAgICAgIGJvb2wgc3RhdHVzID0gaGV2Y1BhcmFtcy53cml0ZShpbmRleCwgZGVzdGluYXRpb24sIG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiVW5hYmxlIHRvIHdyaXRlIE5BTCBVbml0IGRhdGEiOworCisgICAgICAgICAgICBmcmVlKGRlc3RpbmF0aW9uKTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBoZXZjUGFyYW1zLmFkZE5hbFVuaXQobmFsVW5pdCwgbmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJJbnZhbGlkIE5BTCBVbml0IGFkZGVkLCB0eXBlOiAiIDw8IHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShkYXRhKTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtWUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1WUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFZQUyBOQUwgVW5pdHMiOworCisgICAgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtTUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1TUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFNQUyBOQUwgVW5pdHMiOworCisgICAgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtQUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1QUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFBQUyBOQUwgVW5pdHMiOworCisgICAgSGV2Y1BhcmFtZXRlclNldHM6OkluZm8gaW5mbyA9IGhldmNQYXJhbXMuZ2V0SW5mbygpOworICAgIEFTU0VSVF9FUShpbmZvICYgSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvSXNIZHIsCisgICAgICAgICAgICAgIChtSXNIRFIgPyBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9Jc0hkciA6IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb05vbmUpKQorICAgICAgICAgICAgPDwgIldyb25nIGluZm8gYWJvdXQgSERSIjsKKworICAgIEFTU0VSVF9FUShpbmZvICYgSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvSGFzQ29sb3JEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgKG1Jc0hEUiA/IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb0hhc0NvbG9yRGVzY3JpcHRpb24gOiBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9Ob25lKSkKKyAgICAgICAgICAgIDw8ICJXcm9uZyBpbmZvIGFib3V0IGNvbG9yIGRlc2NyaXB0aW9uIjsKKworICAgIC8vIGFuIEhFVkMgZmlsZSBzdGFydHMgd2l0aCBWUFMsIFNQUyBhbmQgUFBTIE5BTCB1bml0cyBpbiBzZXF1ZW5jZS4KKyAgICB1aW50OF90IHR5cGVOYWxVbml0ID0gaGV2Y1BhcmFtcy5nZXRUeXBlKDApOworICAgIEFTU0VSVF9FUSh0eXBlTmFsVW5pdCwga0hldmNOYWxVbml0VHlwZVZwcykKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBOQUwgdHlwZTogMzIoVlBTKSwgZm91bmQ6ICIgPDwgdHlwZU5hbFVuaXQ7CisKKyAgICB0eXBlTmFsVW5pdCA9IGhldmNQYXJhbXMuZ2V0VHlwZSgxKTsKKyAgICBBU1NFUlRfRVEodHlwZU5hbFVuaXQsIGtIZXZjTmFsVW5pdFR5cGVTcHMpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgTkFMIHR5cGU6IDMzKFNQUyksIGZvdW5kOiAiIDw8IHR5cGVOYWxVbml0OworCisgICAgdHlwZU5hbFVuaXQgPSBoZXZjUGFyYW1zLmdldFR5cGUoMik7CisgICAgQVNTRVJUX0VRKHR5cGVOYWxVbml0LCBrSGV2Y05hbFVuaXRUeXBlUHBzKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkIE5BTCB0eXBlOiAzNChQUFMpLCBmb3VuZDogIiA8PCB0eXBlTmFsVW5pdDsKKworICAgIHNpemVfdCBodmNjQm94U2l6ZSA9IGtIdmNjQm94TWF4U2l6ZTsKKyAgICB1aW50OF90ICpodmNjID0gKHVpbnQ4X3QgKiltYWxsb2Moa0h2Y2NCb3hNYXhTaXplKTsKKyAgICBBU1NFUlRfTkUoaHZjYywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGh2Y2MgYnVmZmVyIG9mIHNpemU6ICIgPDwga0h2Y2NCb3hNYXhTaXplOworCisgICAgZXJyID0gaGV2Y1BhcmFtcy5tYWtlSHZjYyhodmNjLCAmaHZjY0JveFNpemUsIGtOQUxTaXplTGVuZ3RoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJVbmFibGUgdG8gY3JlYXRlIGh2Y2MgYm94IjsKKworICAgIEFTU0VSVF9HVChodmNjQm94U2l6ZSwga0h2Y2NCb3hNaW5TaXplKQorICAgICAgICAgICAgPDwgIkh2Y2MgYm94IHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gIiA8PCBrSHZjY0JveE1pblNpemU7CisKKyAgICBpbnQxNl90IGZyYW1lUmF0ZSA9IGh2Y2Nba0h2Y2NCb3hNaW5TaXplIC0gMV0gfCAoaHZjY1trSHZjY0JveE1pblNpemVdIDw8IDgpOworICAgIGlmIChmcmFtZVJhdGUgIT0gbUZyYW1lUmF0ZSkKKyAgICAgICAgY291dCA8PCAiWyAgIFdBUk4gICBdIEV4cGVjdGVkIGZyYW1lIHJhdGU6ICIgPDwgbUZyYW1lUmF0ZSA8PCAiIEZvdW5kOiAiIDw8IGZyYW1lUmF0ZQorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmcmVlKGh2Y2MpOworfQorCisvLyBJbmZvIEZpbGUgY29udGFpbnMgdGhlIHR5cGUgYW5kIGxlbmd0aCBmb3IgZWFjaCBjaHVuay9mcmFtZQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBIRVZDVXRpbHNVbml0VGVzdEFsbCwgSEVWQ1V0aWxzVW5pdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzM4NDB4MjE2MHA1MGYzMDBfMzI1MDBrYnBzLmhldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8zODQweDIxNjBwNTBmMzAwXzMyNTAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgNTAsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDI0ZjMwMF80NTAwa2Jwcy5oZXZjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTkyMHgxMDgwcDI0ZjMwMF80NTAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgMjQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTI4MHg3MjBwMjRmMzAwXzMwMDBrYnBzLmhldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xMjgweDcyMHAyNGYzMDBfMzAwMGticHMuaW5mbyIsIDEsIDEsIDEsIDI0LCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzUwMGticHMuaGV2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzY0MHgzNjBwMjRmMzAwXzUwMGticHMuaW5mbyIsIDEsIDEsIDEsIDI0LCBmYWxzZSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBIRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBlOTljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEhFVkMgVXRpbHMgVGVzdAorVGhlIEhFVkMgVXRpbGl0eSBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBIZXZjVXRpbHMgbGlicmFyeSBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEhFVkNVdGlsc1VuaXRUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0hFVkNVdGlsc1VuaXRUZXN0L0hFVkNVdGlsc1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvSEVWQ1V0aWxzVW5pdFRlc3QvSEVWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0hFVkNVdGlscy9IRVZDVXRpbHNVbml0VGVzdC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggSEVWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBIRVZDVXRpbHNVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9IRVZDVXRpbHNVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEhFVkNVdGlsc1VuaXRUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODMwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNZXRhRGF0YVV0aWxzVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNZXRhRGF0YVV0aWxzVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ5N2YzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1ldGFEYXRhVXRpbHMgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTWV0YURhdGFVdGlsc1Rlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1ldGFEYXRhVXRpbHNUZXN0LT4vZGF0YS9sb2NhbC90bXAvTWV0YURhdGFVdGlsc1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3RSZXMtMS4wLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNZXRhRGF0YVV0aWxzVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDVmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0LmNwcApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGFVdGlsc1Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPEVTRFMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisKKyNpbmNsdWRlICJNZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50LmgiCisKK2NvbnN0ZXhwciB1aW50OF90IGtBZHRzQ3NkU2l6ZSA9IDc7CisvLyBmcm9tIEFBQyBzcGVjczogaHR0cHM6Ly93d3cuaXNvLm9yZy9zdGFuZGFyZC80MzM0NS5odG1sCitjb25zdGV4cHIgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7OTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDB9OworY29uc3RleHByIHVpbnQ4X3Qga01heFNhbXBsaW5nRnJlcUluZGV4ID0gc2l6ZW9mKGtTYW1wbGluZ0ZyZXEpIC8gc2l6ZW9mKGtTYW1wbGluZ0ZyZXFbMF0pOworCitzdGF0aWMgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNZXRhRGF0YVZhbGlkYXRlIHsKKyAgcHVibGljOgorICAgIE1ldGFEYXRhVmFsaWRhdGUoKSA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSB7fQorCisgICAgfk1ldGFEYXRhVmFsaWRhdGUoKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1JbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFNldFVwTWV0YURhdGFWYWxpZGF0ZShzdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpbnQ4X3QgZXJyID0gc3RhdChmaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgMCkgPDwgIkZhaWxlZCB0byBnZXQgZmlsZSBpbmZvcm1hdGlvbiBmb3IgZmlsZTogIiA8PCBmaWxlTmFtZTsKKworICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIEZJTEUgKmlucHV0RmlsZVB0ciA9IGZvcGVuKGZpbGVOYW1lLmNfc3RyKCksICJyYisiKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0RmlsZVB0ciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgZmlsZU5hbWU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyID0gbmV3IHVpbnQ4X3RbbUlucHV0QnVmZmVyU2l6ZV07CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgb2Ygc2l6ZTogIiA8PCBtSW5wdXRCdWZmZXJTaXplOworCisgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPQorICAgICAgICAgICAgICAgIGZyZWFkKChjaGFyICopbUlucHV0QnVmZmVyLCBzaXplb2YodWludDhfdCksIG1JbnB1dEJ1ZmZlclNpemUsIGlucHV0RmlsZVB0cik7CisgICAgICAgIEFTU0VSVF9FUShudW1CeXRlcywgbUlucHV0QnVmZmVyU2l6ZSkgPDwgbnVtQnl0ZXMgPDwgIiBvZiAiIDw8IG1JbnB1dEJ1ZmZlclNpemUgPDwgIiByZWFkIjsKKworICAgICAgICBmY2xvc2UoaW5wdXRGaWxlUHRyKTsKKyAgICB9CisKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICptSW5wdXRCdWZmZXI7Cit9OworCitjbGFzcyBBdmNDU0RUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlPHN0cmluZyAvKmlucHV0RmlsZSovLCBzaXplX3QgLyphdmNXaWR0aCovLCBzaXplX3QgLyphdmNIZWlnaHQqLz4+IHsKKyAgcHVibGljOgorICAgIEF2Y0NTRFRlc3QoKSA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSB7fQorCisgICAgfkF2Y0NTRFRlc3QoKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1JbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHNpemVfdCwgc2l6ZV90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lV2lkdGggPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lSGVpZ2h0ID0gZ2V0PDI+KHBhcmFtcyk7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpbnQ4X3QgZXJyID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIEZJTEUgKmlucHV0RmlsZVB0ciA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIrIik7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEZpbGVQdHIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBtSW5wdXRCdWZmZXIgPSBuZXcgdWludDhfdFttSW5wdXRCdWZmZXJTaXplXTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IG1JbnB1dEJ1ZmZlclNpemU7CisKKyAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9CisgICAgICAgICAgICAgICAgZnJlYWQoKGNoYXIgKiltSW5wdXRCdWZmZXIsIHNpemVvZih1aW50OF90KSwgbUlucHV0QnVmZmVyU2l6ZSwgaW5wdXRGaWxlUHRyKTsKKyAgICAgICAgQVNTRVJUX0VRKG51bUJ5dGVzLCBtSW5wdXRCdWZmZXJTaXplKSA8PCBudW1CeXRlcyA8PCAiIG9mICIgPDwgbUlucHV0QnVmZmVyU2l6ZSA8PCAiIHJlYWQiOworCisgICAgICAgIGZjbG9zZShpbnB1dEZpbGVQdHIpOworICAgIH0KKworICAgIHNpemVfdCBtRnJhbWVXaWR0aDsKKyAgICBzaXplX3QgbUZyYW1lSGVpZ2h0OworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJTaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKK307CisKK2NsYXNzIEF2Y0NTRFZhbGlkYXRlVGVzdCA6IHB1YmxpYyBNZXRhRGF0YVZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdHJpbmcgLyppbnB1dEZpbGUqLz4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldFVwTWV0YURhdGFWYWxpZGF0ZShpbnB1dEZpbGUpKTsKKyAgICB9Cit9OworCitjbGFzcyBBYWNDU0RUZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHVpbnQzMl90IC8qcHJvZmlsZSovLCB1aW50MzJfdCAvKnNhbXBsaW5nRnJlcUluZGV4Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qY2hhbm5lbENvbmZpZyovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTx1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBtQWFjUHJvZmlsZSA9IGdldDwwPihwYXJhbXMpOworICAgICAgICBtQWFjU2FtcGxpbmdGcmVxSW5kZXggPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUFhY0NoYW5uZWxDb25maWcgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtQWFjUHJvZmlsZTsKKyAgICB1aW50MzJfdCBtQWFjU2FtcGxpbmdGcmVxSW5kZXg7CisgICAgdWludDMyX3QgbUFhY0NoYW5uZWxDb25maWc7Cit9OworCitjbGFzcyBBYWNBRFRTVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8c3RyaW5nIC8qYWR0c0ZpbGUqLywgdWludDMyX3QgLypjaGFubmVsQ291bnQqLywgdWludDMyX3QgLypzYW1wbGVSYXRlKi8+PiB7CisgIHB1YmxpYzoKKyAgICBBYWNBRFRTVGVzdCgpIDogbUlucHV0QnVmZmVyKG51bGxwdHIpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHN0cmluZywgdWludDMyX3QsIHVpbnQzMl90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgZmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwwPihwYXJhbXMpOworICAgICAgICBtQWFjQ2hhbm5lbENvdW50ID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIG1BYWNTYW1wbGVSYXRlID0gZ2V0PDI+KHBhcmFtcyk7CisKKyAgICAgICAgRklMRSAqZmlsZVB0ciA9IGZvcGVuKGZpbGVOYW1lLmNfc3RyKCksICJyIik7CisgICAgICAgIEFTU0VSVF9ORShmaWxlUHRyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBmaWxlTmFtZTsKKworICAgICAgICBtSW5wdXRCdWZmZXIgPSBuZXcgdWludDhfdFtrQWR0c0NzZFNpemVdOworICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGEgbWVtb3J5IG9mIHNpemU6ICIgPDwga0FkdHNDc2RTaXplOworCisgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBmcmVhZCgodm9pZCAqKW1JbnB1dEJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpLCBrQWR0c0NzZFNpemUsIGZpbGVQdHIpOworICAgICAgICBBU1NFUlRfRVEobnVtQnl0ZXMsIGtBZHRzQ3NkU2l6ZSkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBudW1CeXRlczsKKworICAgICAgICBmY2xvc2UoZmlsZVB0cik7CisgICAgfQorICAgIGludDMyX3QgbUFhY0NoYW5uZWxDb3VudDsKKyAgICBpbnQzMl90IG1BYWNTYW1wbGVSYXRlOworICAgIGNvbnN0IHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKK307CisKK2NsYXNzIEFhY0NTRFZhbGlkYXRlVGVzdCA6IHB1YmxpYyBNZXRhRGF0YVZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdHJpbmcgLyppbnB1dEZpbGUqLz4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldFVwTWV0YURhdGFWYWxpZGF0ZShpbnB1dEZpbGUpKTsKKyAgICB9Cit9OworCitjbGFzcyBWb3JiaXNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZyAvKmZpbGVOYW1lKi8sIHN0cmluZyAvKmluZm9GaWxlKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIHN0cmluZyBpbnB1dE1lZGlhRmlsZSA9IGdFbnYtPmdldFJlcygpICsgcGFyYW1zLmZpcnN0OworICAgICAgICBtSW5wdXRGaWxlU3RyZWFtLm9wZW4oaW5wdXRNZWRpYUZpbGUsIGlmc3RyZWFtOjppbik7CisgICAgICAgIEFTU0VSVF9UUlVFKG1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSA8PCAiRmFpbGVkIHRvIG9wZW4gZGF0YSBmaWxlOiAiIDw8IGlucHV0TWVkaWFGaWxlOworCisgICAgICAgIHN0cmluZyBpbnB1dEluZm9GaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBwYXJhbXMuc2Vjb25kOworICAgICAgICBtSW5mb0ZpbGVTdHJlYW0ub3BlbihpbnB1dEluZm9GaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBBU1NFUlRfVFJVRShtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIGRhdGEgZmlsZTogIiA8PCBpbnB1dEluZm9GaWxlOworICAgICAgICBBU1NFUlRfRkFMU0UoaW5wdXRJbmZvRmlsZS5lbXB0eSgpKSA8PCAiRW1wdHkgaW5mbyBmaWxlOiAiIDw8IGlucHV0SW5mb0ZpbGU7CisgICAgfQorCisgICAgflZvcmJpc1Rlc3QoKSB7CisgICAgICAgIGlmIChtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgbUlucHV0RmlsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgbUluZm9GaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgfQorCisgICAgaWZzdHJlYW0gbUlucHV0RmlsZVN0cmVhbTsKKyAgICBpZnN0cmVhbSBtSW5mb0ZpbGVTdHJlYW07Cit9OworCitURVNUX1AoQXZjQ1NEVGVzdCwgQXZjQ1NEVmFsaWRhdGlvblRlc3QpIHsKKyAgICBBTWVkaWFGb3JtYXQgKmNzZERhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQVNTRVJUX05FKGNzZERhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFNZWRpYSBmb3JtYXQiOworCisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoY3NkRGF0YSwgbUlucHV0QnVmZmVyLCBtSW5wdXRCdWZmZXJTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gbWFrZSBBVkMgQ1NEIGZyb20gQU1lZGlhRm9ybWF0IjsKKworICAgIGludDMyX3QgYXZjV2lkdGggPSAtMTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJmF2Y1dpZHRoKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGF2YyB3aWR0aCI7CisgICAgQVNTRVJUX0VRKGF2Y1dpZHRoLCBtRnJhbWVXaWR0aCk7CisKKyAgICBpbnQzMl90IGF2Y0hlaWdodCA9IC0xOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJmF2Y0hlaWdodCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBhdmMgaGVpZ2h0IjsKKyAgICBBU1NFUlRfRVEoYXZjSGVpZ2h0LCBtRnJhbWVIZWlnaHQpOworCisgICAgY29uc3QgY2hhciAqbWltZVR5cGUgPSAiIjsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBtaW1lIHR5cGUiOworICAgIEFTU0VSVF9TVFJFUShtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBNZXRhRGF0YSBCYXNlIjsKKworICAgIHN0YXR1cyA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbWV0YURhdGEsIG1JbnB1dEJ1ZmZlciwgbUlucHV0QnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQVZDIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisKKyAgICBhdmNXaWR0aCA9IC0xOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmYXZjV2lkdGgpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBmaW5kIHRoZSB3aWR0aCI7CisgICAgQVNTRVJUX0VRKGF2Y1dpZHRoLCBtRnJhbWVXaWR0aCk7CisKKyAgICBhdmNIZWlnaHQgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZhdmNIZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBmaW5kIHRoZSBoZWlnaHQiOworICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCk7CisKKyAgICB2b2lkICpjc2RBTWVkaWFGb3JtYXRCdWZmZXIgPSBudWxscHRyOworICAgIHNpemVfdCBjc2RBTWVkaWFGb3JtYXRTaXplOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmY3NkQU1lZGlhRm9ybWF0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNzZEFNZWRpYUZvcm1hdFNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIENTRCBmcm9tIEFNZWRpYUZvcm1hdCI7CisgICAgQVNTRVJUX05FKGNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwgbnVsbHB0cikgPDwgIkludmFsaWQgQ1NEIGZyb20gQU1lZGlhRm9ybWF0IjsKKworICAgIGNvbnN0IHZvaWQgKmNzZE1ldGFEYXRhQmFzZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgc2l6ZV90IGNzZE1ldGFEYXRhQmFzZVNpemUgPSAwOworICAgIHVpbnQzMl90IG1lZGlhVHlwZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZtZWRpYVR5cGUsICZjc2RNZXRhRGF0YUJhc2VCdWZmZXIsICZjc2RNZXRhRGF0YUJhc2VTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworICAgIEFTU0VSVF9ORShjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnZhbGlkIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisgICAgQVNTRVJUX0dUKGNzZE1ldGFEYXRhQmFzZVNpemUsIDApIDw8ICJDU0Qgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKyAgICBBU1NFUlRfRVEoY3NkTWV0YURhdGFCYXNlU2l6ZSwgY3NkQU1lZGlhRm9ybWF0U2l6ZSkKKyAgICAgICAgICAgIDw8ICJDU0Qgc2l6ZSBvZiBNZXRhRGF0YSB0eXBlIGFuZCBBTWVkaWFGb3JtYXQgdHlwZSBtdXN0IGJlIHNhbWUiOworCisgICAgaW50MzJfdCByZXN1bHQgPSBtZW1jbXAoY3NkQU1lZGlhRm9ybWF0QnVmZmVyLCBjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIGNzZEFNZWRpYUZvcm1hdFNpemUpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIDApIDw8ICJDU0QgZnJvbSBBTWVkaWFGb3JtYXQgYW5kIE1ldGFEYXRhQmFzZSBkbyBub3QgbWF0Y2giOworCisgICAgZGVsZXRlIG1ldGFEYXRhOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoY3NkRGF0YSk7Cit9CisKK1RFU1RfUChBdmNDU0RWYWxpZGF0ZVRlc3QsIEF2Y1ZhbGlkYXRlVGVzdCkgeworICAgIEFNZWRpYUZvcm1hdCAqY3NkRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUoY3NkRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgQU1lZGlhIGZvcm1hdCI7CisKKyAgICBib29sIHN0YXR1cyA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShjc2REYXRhLCBtSW5wdXRCdWZmZXIsIG1JbnB1dEJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEgd2l0aCBBTWVkaWFGb3JtYXQgc3VjY2VlZHMgd2l0aCBpbnZhbGlkIGRhdGEiOworCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIE1ldGFEYXRhIEJhc2UiOworCisgICAgc3RhdHVzID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUlucHV0QnVmZmVyLCBtSW5wdXRCdWZmZXJTaXplKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhIHdpdGggTWV0YURhdGFCYXNlIHN1Y2NlZWRzIHdpdGggaW52YWxpZCBkYXRhIjsKK30KKworVEVTVF9QKEFhY0NTRFRlc3QsIEFhY0NTRFZhbGlkYXRpb25UZXN0KSB7CisgICAgQU1lZGlhRm9ybWF0ICpjc2REYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORShjc2REYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBBTWVkaWEgZm9ybWF0IjsKKworICAgIEFTU0VSVF9HRShtQWFjU2FtcGxpbmdGcmVxSW5kZXgsIDApOworICAgIEFTU0VSVF9MVChtQWFjU2FtcGxpbmdGcmVxSW5kZXgsIGtNYXhTYW1wbGluZ0ZyZXFJbmRleCk7CisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoY3NkRGF0YSwgbUFhY1Byb2ZpbGUsIG1BYWNTYW1wbGluZ0ZyZXFJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWFjQ2hhbm5lbENvbmZpZyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQUFDIENTRCBmcm9tIEFNZWRpYUZvcm1hdCI7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAtMTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgc2FtcGxlIHJhdGUiOworICAgIEFTU0VSVF9FUShrU2FtcGxpbmdGcmVxW21BYWNTYW1wbGluZ0ZyZXFJbmRleF0sIHNhbXBsZVJhdGUpOworCisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAtMTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGNoYW5uZWwgY291bnQiOworICAgIEFTU0VSVF9FUShjaGFubmVsQ291bnQsIG1BYWNDaGFubmVsQ29uZmlnKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlID0gIiI7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lVHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWltZSB0eXBlIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgTWV0YURhdGEgQmFzZSI7CisKKyAgICBzdGF0dXMgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtQWFjUHJvZmlsZSwgbUFhY1NhbXBsaW5nRnJlcUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWFjQ2hhbm5lbENvbmZpZyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQUFDIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisKKyAgICBzYW1wbGVSYXRlID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgc2FtcGxpbmcgcmF0ZSI7CisgICAgQVNTRVJUX0VRKGtTYW1wbGluZ0ZyZXFbbUFhY1NhbXBsaW5nRnJlcUluZGV4XSwgc2FtcGxlUmF0ZSk7CisKKyAgICBjaGFubmVsQ291bnQgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZjaGFubmVsQ291bnQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBjb3VudCI7CisgICAgQVNTRVJUX0VRKGNoYW5uZWxDb3VudCwgbUFhY0NoYW5uZWxDb25maWcpOworCisgICAgbWltZVR5cGUgPSAiIjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgbWltZSB0eXBlIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICB2b2lkICpjc2RBTWVkaWFGb3JtYXRCdWZmZXIgPSBudWxscHRyOworICAgIHNpemVfdCBjc2RBTWVkaWFGb3JtYXRTaXplID0gMDsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZjc2RBTWVkaWFGb3JtYXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3NkQU1lZGlhRm9ybWF0U2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgQU1lZGlhRm9ybWF0IENTRCI7CisgICAgQVNTRVJUX0dUKGNzZEFNZWRpYUZvcm1hdFNpemUsIDApIDw8ICJDU0Qgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKyAgICBBU1NFUlRfTkUoY3NkQU1lZGlhRm9ybWF0QnVmZmVyLCBudWxscHRyKSA8PCAiSW52YWxpZCBDU0QgZm91bmQiOworCisgICAgY29uc3Qgdm9pZCAqY3NkTWV0YURhdGFCYXNlQnVmZmVyOworICAgIHNpemVfdCBjc2RNZXRhRGF0YUJhc2VTaXplID0gMDsKKyAgICB1aW50MzJfdCBtZWRpYVR5cGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmbWVkaWFUeXBlLCAmY3NkTWV0YURhdGFCYXNlQnVmZmVyLCAmY3NkTWV0YURhdGFCYXNlU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgRVNEUyBkYXRhIGZyb20gTWV0YURhdGFCYXNlIjsKKyAgICBBU1NFUlRfR1QoY3NkTWV0YURhdGFCYXNlU2l6ZSwgMCkgPDwgIkNTRCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOworCisgICAgRVNEUyBlc2RzKGNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgY3NkTWV0YURhdGFCYXNlU2l6ZSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY3NkTWV0YURhdGFCYXNlQnVmZmVyLCAmY3NkTWV0YURhdGFCYXNlU2l6ZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgKHN0YXR1c190KU9LKSA8PCAiRmFpbGVkIHRvIGdldCBDU0QgZnJvbSBFU0RTIGRhdGEiOworICAgIEFTU0VSVF9ORShjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnZhbGlkIENTRCBmb3VuZCI7CisgICAgQVNTRVJUX0VRKGNzZEFNZWRpYUZvcm1hdFNpemUsIGNzZE1ldGFEYXRhQmFzZVNpemUpCisgICAgICAgICAgICA8PCAiQ1NEIHNpemUgZG8gbm90IG1hdGNoIGJldHdlZW4gQU1lZGlhRm9ybWF0IHR5cGUgYW5kIE1ldGFEYXRhQmFzZSB0eXBlIjsKKworICAgIGludDMyX3QgbWVtY21wUmVzdWx0ID0KKyAgICAgICAgICAgIG1lbWNtcChjc2RBTWVkaWFGb3JtYXRCdWZmZXIsIGNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgY3NkQU1lZGlhRm9ybWF0U2l6ZSk7CisgICAgQVNTRVJUX0VRKG1lbWNtcFJlc3VsdCwgMCkgPDwgIkFNZWRpYUZvcm1hdCBhbmQgTWV0YURhdGFCYXNlIENTRHMgZG8gbm90IG1hdGNoIjsKKworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoY3NkRGF0YSk7CisgICAgZGVsZXRlIG1ldGFEYXRhOworfQorCitURVNUX1AoQWFjQURUU1Rlc3QsIEFhY0FEVFNWYWxpZGF0aW9uVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtSW5wdXRCdWZmZXIsIGtBZHRzQ3NkU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQUFDIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBzYW1wbGluZyByYXRlIjsKKyAgICBBU1NFUlRfRVEoc2FtcGxlUmF0ZSwgbUFhY1NhbXBsZVJhdGUpOworCisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZjaGFubmVsQ291bnQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBjb3VudCI7CisgICAgQVNTRVJUX0VRKGNoYW5uZWxDb3VudCwgbUFhY0NoYW5uZWxDb3VudCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lVHlwZSA9ICIiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lVHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBtaW1lIHR5cGUiOworICAgIEFTU0VSVF9TVFJFUShtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIGRlbGV0ZSBtZXRhRGF0YTsKK30KKworVEVTVF9QKEFhY0NTRFZhbGlkYXRlVGVzdCwgQWFjSW52YWxpZElucHV0VGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtSW5wdXRCdWZmZXIsIGtBZHRzQ3NkU2l6ZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIk1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSBzdWNjZWVkcyB3aXRoIGludmFsaWQgZGF0YSI7Cit9CisKK1RFU1RfUChWb3JiaXNUZXN0LCBWb3JiaXNDb21tZW50VGVzdCkgeworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0YWc7CisgICAgc3RyaW5nIGtleTsKKyAgICBzdHJpbmcgdmFsdWU7CisgICAgc2l6ZV90IGNvbW1lbnRMZW5ndGg7CisgICAgYm9vbCBzdGF0dXM7CisKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0YWcgPj4ga2V5ID4+IHZhbHVlID4+IGNvbW1lbnRMZW5ndGg7CisgICAgICAgIEFTU0VSVF9HVChjb21tZW50TGVuZ3RoLCAwKSA8PCAiVm9yYmlzIGNvbW1lbnQgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKworICAgICAgICBzdHJpbmcgY29tbWVudDsKKyAgICAgICAgc3RyaW5nIGRhdGFMaW5lOworCisgICAgICAgIGdldGxpbmUobUlucHV0RmlsZVN0cmVhbSwgZGF0YUxpbmUpOworICAgICAgICBpc3RyaW5nc3RyZWFtIGRhdGFTdHJpbmdMaW5lKGRhdGFMaW5lKTsKKyAgICAgICAgZGF0YVN0cmluZ0xpbmUgPj4gY29tbWVudDsKKworICAgICAgICBjaGFyICpidWZmZXIgPSBzdHJuZHVwKGNvbW1lbnQuY19zdHIoKSwgY29tbWVudExlbmd0aCk7CisgICAgICAgIEFTU0VSVF9ORShidWZmZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemU6ICIgPDwgY29tbWVudExlbmd0aDsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBU1NFUlRfTkUoZmlsZU1ldGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFNZWRpYSBmb3JtYXQiOworCisgICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudChmaWxlTWV0YSwgYnVmZmVyLCBjb21tZW50TGVuZ3RoKTsKKyAgICAgICAgZnJlZShidWZmZXIpOworCisgICAgICAgIGlmICghc3RybmNhc2VjbXAodGFnLmNfc3RyKCksICJBTkRST0lEX0hBUFRJQyIsIHNpemVvZih0YWcpKSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsRXhwZWN0ZWQgPSBzdG9pKHZhbHVlKTsKKyAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbEZvdW5kID0gLTE7CisgICAgICAgICAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZmlsZU1ldGEsIGtleS5jX3N0cigpLCAmbnVtQ2hhbm5lbEZvdW5kKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGNoYW5uZWwgY291bnQiOworICAgICAgICAgICAgQVNTRVJUX0VRKG51bUNoYW5uZWxFeHBlY3RlZCwgbnVtQ2hhbm5lbEZvdW5kKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAodGFnLmNfc3RyKCksICJBTkRST0lEX0xPT1AiLCBzaXplb2YodGFnKSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgbG9vcEV4cGVjdGVkID0gIXZhbHVlLmNvbXBhcmUoInRydWUiKTsKKyAgICAgICAgICAgIGludDMyX3QgbG9vcEZvdW5kID0gLTE7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmaWxlTWV0YSwgImxvb3AiLCAmbG9vcEZvdW5kKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGxvb3AgY291bnQiOworICAgICAgICAgICAgQVNTRVJUX0VRKGxvb3BFeHBlY3RlZCwgbG9vcEZvdW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZ1ZhbHVlID0gIiI7CisgICAgICAgICAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZpbGVNZXRhLCBrZXkuY19zdHIoKSwgJnRhZ1ZhbHVlKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIHRhZyB2YWx1ZSI7CisgICAgICAgICAgICBBU1NFUlRfU1RSRVEodmFsdWUuY19zdHIoKSwgdGFnVmFsdWUpOworICAgICAgICB9CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZmlsZU1ldGEpOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBdmNDU0RUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoInNwc19wcHNfdXNlcmRhdGEuaDI2NCIsIDgsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInNwc191c2VyZGF0YV9wcHMuaDI2NCIsIDgsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInNwc19wcHNfc3BzX3Bwcy5oMjY0IiwgOCwgOCkpKTsKKworLy8gVE9ETyhiLzE1ODA2NzY5MSk6IEFkZCBpbnZhbGlkIHRlc3QgdmVjdG9ycyB3aXRoIGluY29tcGxldGUgUFBTIG9yIG5vIFBQUworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBdmNDU0RWYWxpZGF0ZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoInNwc19wcHNfb25seV9zdGFydGNvZGUuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwc19pbmNvbXBsZXRlX3Bwcy5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTU4MDY3NjkxKSAic3BzX3Bwc19pbmNvbXBsZXRlLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5kb21kYXRhLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xNTgwNjc2OTEpICJzcHMuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwcy5oMjY0IikpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWV0YURhdGFVdGlsc1Rlc3RBbGwsIEFhY0NTRFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZShBQUNPYmplY3RNYWluLCAxLCAxKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWV0YURhdGFVdGlsc1Rlc3RBbGwsIEFhY0FEVFNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImxvdWRzb2Z0YWFjYWR0cyIsIDEsIDQ0MTAwKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWV0YURhdGFVdGlsc1Rlc3RBbGwsIEFhY0NTRFZhbGlkYXRlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygibG91ZHNvZnRhYWNhZHRzX2ludmFsaWRoZWFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3Vkc29mdGFhY2FkdHNfaW52YWxpZHByb2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3Vkc29mdGFhY2FkdHNfaW52YWxpZGNoYW5uZWxjb25maWciKSk7CisKKy8vIFRPRE8oYi8xNTc5NzQ1MDgpIEFkZCB0ZXN0IHZlY3RvciBmb3Igdm9yYmlzIHRodW1ibmFpbCB0YWcKKy8vIEluZm8gZmlsZSBjb250YWlucyBUQUcsIEtleSwgVmFsdWUgYW5kIHNpemUgb2YgdGhlIHZvcmJpcyBjb21tZW50CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBWb3JiaXNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoInZvcmJpc2NvbW1lbnRfc2ludGVsLmRhdCIsICJ2b3JiaXNjb21tZW50X3NpbnRlbC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidm9yYmlzY29tbWVudF9hbGJ1bS5kYXQiLCAidm9yYmlzY29tbWVudF9hbGJ1bS5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidm9yYmlzY29tbWVudF9sb29wLmRhdCIsICJ2b3JiaXNjb21tZW50X2xvb3AuaW5mbyIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjQyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01FVEFEQVRBX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fTUVUQURBVEFfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBNZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fTUVUQURBVEFfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2MmEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzkgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBNZXRhRGF0YVV0aWxzIFRlc3QKK1RoZSBNZXRhRGF0YVV0aWxzIFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIGxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMgbGlicmFyeSBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIE1ldGFEYXRhVXRpbHNUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L01ldGFEYXRhVXRpbHNUZXN0L01ldGFEYXRhVXRpbHNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvTWV0YURhdGFVdGlsc1Rlc3QvTWV0YURhdGFVdGlsc1Rlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0UmVzLTEuMC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggTWV0YURhdGFVdGlsc1Rlc3RSZXMtMS4wIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogTWV0YURhdGFVdGlsc1Rlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvTWV0YURhdGFVdGlsc1Rlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0UmVzLTEuMC8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgTWV0YURhdGFVdGlsc1Rlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwCmluZGV4IDdlMTY5Y2IuLmI1ZDQ1M2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwCkBAIC0yOCwxMyArMjgsMTUgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCi0gICAgICAgICJsaWJkYXRhc291cmNlIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICAgICAgImxpYm9nZyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sCmluZGV4IGQ4MzE1NTUuLmNjODkwZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWRUZXN0LnhtbApAQCAtMTksMTIgKzE5LDEzIEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IndyaXRlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyLnppcD91bnppcD10cnVlIgotICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdFJlcy0xLjEuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL1dyaXRlclRlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0id3JpdGVyVGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3RSZXMvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1DIHRydWUiIC8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9SRUFETUUubWQKaW5kZXggYWUwNzkxNy4uMGU1NGNhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kCkBAIC0xOSwxMyArMTksMTggQEAKIAogYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC93cml0ZXJUZXN0L3dyaXRlclRlc3QgL2RhdGEvbG9jYWwvdG1wLwogCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL3dyaXRlclRlc3RSZXMuemlwKS4KK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdFJlcy0xLjEuemlwKS4KIERvd25sb2FkIGFuZCBleHRyYWN0IHRoZSBmb2xkZXIuIFB1c2ggYWxsIHRoZSBmaWxlcyBpbiB0aGlzIGZvbGRlciB0byAvZGF0YS9sb2NhbC90bXAvIG9uIHRoZSBkZXZpY2UuCiBgYGAKLWFkYiBwdXNoIHdyaXRlclRlc3RSZXMgL2RhdGEvbG9jYWwvdG1wLworYWRiIHB1c2ggV3JpdGVyVGVzdFJlcy0xLjEvLiAvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8KIGBgYAogCi11c2FnZTogd3JpdGVyVGVzdCAtUCBcPHBhdGhfdG9fcmVzX2ZvbGRlclw+Cit1c2FnZTogd3JpdGVyVGVzdCAtUCBcPHBhdGhfdG9fcmVzX2ZvbGRlclw+IC1DIDxyZW1vdmVfb3V0cHV0X2ZpbGU+CiBgYGAKLWFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvd3JpdGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL1dyaXRlclRlc3RSZXMvIC1DIHRydWUKK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3Qgd3JpdGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCiBgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJMaXN0ZW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlckxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmMGE3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdSSVRFUl9MSVNURU5FUl9IXworI2RlZmluZSBXUklURVJfTElTVEVORVJfSF8KKworI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgV3JpdGVyTGlzdGVuZXIgOiBwdWJsaWMgQm5NZWRpYVJlY29yZGVyQ2xpZW50IHsKKyAgcHVibGljOgorICAgIFdyaXRlckxpc3RlbmVyKCkgOiBtU2lnbmFsZWRTaXplKGZhbHNlKSwgbVNpZ25hbGVkRHVyYXRpb24oZmFsc2UpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDMyX3QgbXNnLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgeworICAgICAgICBBTE9HVigibXNnIDogJWQsIGV4dDEgOiAlZCwgZXh0MiA6ICVkIiwgbXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgaWYgKGV4dDEgPT0gTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCkgeworICAgICAgICAgICAgbVNpZ25hbGVkU2l6ZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoZXh0MSA9PSBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9EVVJBVElPTl9SRUFDSEVEKSB7CisgICAgICAgICAgICBtU2lnbmFsZWREdXJhdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2xhdGlsZSBib29sIG1TaWduYWxlZFNpemU7CisgICAgdm9sYXRpbGUgYm9vbCBtU2lnbmFsZWREdXJhdGlvbjsKK307CisKKyNlbmRpZiAgLy8gV1JJVEVSX0xJU1RFTkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAKaW5kZXggZmYwNjNlMy4uZDE3MGU3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcApAQCAtMTgsOSArMTgsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAiV3JpdGVyVGVzdCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMzksMTggKzQzLDQwIEBACiAKICNkZWZpbmUgT1VUUFVUX0ZJTEVfTkFNRSAiL2RhdGEvbG9jYWwvdG1wL3dyaXRlci5vdXQiCiAKKy8vIFN0dHMgdmFsdWVzIHdpdGhpbiAwLjFtcygxMDB1cykgZGlmZmVyZW5jZSBhcmUgZnVkZ2VkIHRvIHNhdmUgdG9vCisvLyBtYW55IHN0dHMgZW50cmllcyBpbiBNUEVHNFdyaXRlci4KK2NvbnN0ZXhwciBpbnQzMl90IGtNcGVnNE11eFRvbGVyYW5jZVRpbWVVcyA9IDEwMDsKKy8vIFRvbGVyYW5jZSB2YWx1ZSBmb3Igb3RoZXIgd3JpdGVycworY29uc3RleHByIGludDMyX3Qga011eFRvbGVyYW5jZVRpbWVVcyA9IDE7CisKIHN0YXRpYyBXcml0ZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOwogCi1zdHJ1Y3QgY29uZmlnRm9ybWF0IHsKLSAgICBjaGFyIG1pbWVbMTI4XTsKLSAgICBpbnQzMl90IHdpZHRoOwotICAgIGludDMyX3QgaGVpZ2h0OwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKK2VudW0gaW5wdXRJZCB7CisgICAgLy8gYXVkaW8gc3RyZWFtcworICAgIEFBQ18xLAorICAgIEFBQ19BRFRTXzEsCisgICAgQU1SX05CXzEsCisgICAgQU1SX1dCXzEsCisgICAgRkxBQ18xLAorICAgIE9QVVNfMSwKKyAgICBWT1JCSVNfMSwKKyAgICAvLyB2aWRlbyBzdHJlYW1zCisgICAgQVYxXzEsCisgICAgQVZDXzEsCisgICAgSDI2M18xLAorICAgIEhFVkNfMSwKKyAgICBNUEVHNF8xLAorICAgIFZQOF8xLAorICAgIFZQOV8xLAorICAgIC8vIGhlaWYgc3RyZWFtCisgICAgSEVJQ18xLAorICAgIFVOVVNFRF9JRCwKKyAgICBVTktOT1dOX0lELAogfTsKIAogLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwogc3RhdGljIGNvbnN0IHN0cnVjdCBJbnB1dERhdGEgeworICAgIGlucHV0SWQgaW5wSWQ7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBzdHJpbmcgaW5wdXRGaWxlOwogICAgIHN0cmluZyBpbmZvOwpAQCAtNTgsNjUgKzg0LDczIEBACiAgICAgaW50MzJfdCBzZWNvbmRQYXJhbTsKICAgICBib29sIGlzQXVkaW87CiB9IGtJbnB1dERhdGFbXSA9IHsKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLAotICAgICAgICAgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FBQywgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLAotICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMsICJNcHNfMl9jMl9mcjFfU2MxX0RjMl8weDAzX3Jhdy5hZHRzIiwKKyAgICAgICAge0FBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJhdWRpb19hYWNfc3RlcmVvXzhrYnBzXzExMDI1aHouYWFjIiwKKyAgICAgICAgICJhdWRpb19hYWNfc3RlcmVvXzhrYnBzXzExMDI1aHouaW5mbyIsIDExMDI1LCAyLCB0cnVlfSwKKyAgICAgICAge0FBQ19BRFRTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTLCAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuYWR0cyIsCiAgICAgICAgICAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLAorICAgICAgICB7QU1SX05CXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLAogICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyIsIDgwMDAsIDEsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsCisgICAgICAgIHtBTVJfV0JfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsCiAgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIiwgMTYwMDAsIDEsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyIsCi0gICAgICAgICAiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwKKyAgICAgICAge0ZMQUNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQywgImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyIsCiAgICAgICAgICAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fVlA5LCAiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwKLSAgICAgICAgICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCIsCi0gICAgICAgICAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IiwKLSAgICAgICAgICJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsICJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsCi0gICAgICAgICAiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fQVYxLCAiYmJiX2F2MV8xNzZfMTQ0LmF2MSIsICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMiLAorICAgICAgICB7T1BVU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIiwKKyAgICAgICAgICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCisgICAgICAgIHtWT1JCSVNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAiYmJiX3ZvcmJpc18xY2hfNjRrYnBzXzE2a0h6LnZvcmJpcyIsCisgICAgICAgICAiYmJiX3ZvcmJpc18xY2hfNjRrYnBzXzE2a0h6LmluZm8iLCAxNjAwMCwgMSwgdHJ1ZX0sCisKKyAgICAgICAge0FWMV8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsICJiYmJfYXYxXzE3Nl8xNDQuYXYxIiwgImJiYl9hdjFfMTc2XzE0NC5pbmZvIiwgMTc2LCAxNDQsCisgICAgICAgICBmYWxzZX0sCisgICAgICAgIHtBVkNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiYmJiX2F2Y18zNTJ4Mjg4Xzc2OGticHNfMzBmcHMuYXZjIiwKKyAgICAgICAgICJiYmJfYXZjXzM1MngyODhfNzY4a2Jwc18zMGZwcy5pbmZvIiwgMzUyLCAyODgsIGZhbHNlfSwKKyAgICAgICAge0gyNjNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIiwKICAgICAgICAgICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyIsIDM1MiwgMjg4LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IiwKKyAgICAgICAge0hFVkNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgImJiYl9oZXZjXzM0MHgyODBfNzY4a2Jwc18zMGZwcy5oZXZjIiwKKyAgICAgICAgICJiYmJfaGV2Y18zNDB4MjgwXzc2OGticHNfMzBmcHMuaW5mbyIsIDM0MCwgMjgwLCBmYWxzZX0sCisgICAgICAgIHtNUEVHNF8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IiwKICAgICAgICAgICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8iLCAzNTIsIDI4OCwgZmFsc2V9LAorICAgICAgICB7VlA4XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCIsCisgICAgICAgICAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCisgICAgICAgIHtWUDlfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LCAiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwKKyAgICAgICAgICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKKworICAgICAgICB7SEVJQ18xLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsICJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsCisgICAgICAgICAiYmJiX2hlaWNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAogfTsKIAotY2xhc3MgV3JpdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIGludDMyX3Q+PiB7CitjbGFzcyBXcml0ZXJUZXN0IHsKICAgcHVibGljOgotICAgIFdyaXRlclRlc3QoKSA6IG1Xcml0ZXIobnVsbHB0ciksIG1GaWxlTWV0YShudWxscHRyKSwgbUN1cnJlbnRUcmFjayhudWxscHRyKSB7fQorICAgIFdyaXRlclRlc3QoKSA6IG1Xcml0ZXIobnVsbHB0ciksIG1GaWxlTWV0YShudWxscHRyKSB7fQogCiAgICAgfldyaXRlclRlc3QoKSB7Ci0gICAgICAgIGlmIChtV3JpdGVyKSB7Ci0gICAgICAgICAgICBtV3JpdGVyLmNsZWFyKCk7Ci0gICAgICAgICAgICBtV3JpdGVyID0gbnVsbHB0cjsKLSAgICAgICAgfQogICAgICAgICBpZiAobUZpbGVNZXRhKSB7CiAgICAgICAgICAgICBtRmlsZU1ldGEuY2xlYXIoKTsKICAgICAgICAgICAgIG1GaWxlTWV0YSA9IG51bGxwdHI7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50VHJhY2spIHsKLSAgICAgICAgICAgIG1DdXJyZW50VHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIG1DdXJyZW50VHJhY2sgPSBudWxscHRyOworICAgICAgICBpZiAobVdyaXRlcikgeworICAgICAgICAgICAgbVdyaXRlci5jbGVhcigpOworICAgICAgICAgICAgbVdyaXRlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdFbnYtPmNsZWFuVXAoKSkgcmVtb3ZlKE9VVFBVVF9GSUxFX05BTUUpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBrTWF4VHJhY2tDb3VudDsgaWR4KyspIHsKKyAgICAgICAgICAgIG1CdWZmZXJJbmZvW2lkeF0uY2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0pIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0tPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1JbnB1dFN0cmVhbVtpZHhdLmlzX29wZW4oKSkgbUlucHV0U3RyZWFtW2lkeF0uY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgbU51bUNzZHMgPSAwOwotICAgICAgICBtSW5wdXRGcmFtZUlkID0gMDsKKyAgICB2b2lkIHNldHVwV3JpdGVyVHlwZShzdHJpbmcgd3JpdGVyRm9ybWF0KSB7CiAgICAgICAgIG1Xcml0ZXJOYW1lID0gdW5rbm93bl9jb21wOwogICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKLQogICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0YW5kYXJkV3JpdGVycz4gbWFwV3JpdGVyID0gewogICAgICAgICAgICAgICAgIHsib2dnIiwgT0dHfSwgICAgIHsiYWFjIiwgQUFDfSwgICAgICB7ImFhY19hZHRzIiwgQUFDX0FEVFN9LCB7IndlYm0iLCBXRUJNfSwKICAgICAgICAgICAgICAgICB7Im1wZWc0IiwgTVBFRzR9LCB7ImFtcm5iIiwgQU1SX05CfSwgeyJhbXJ3YiIsIEFNUl9XQn0sICAgICAgeyJtcGVnMlRzIiwgTVBFRzJUU319OwogICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQotICAgICAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKICAgICAgICAgaWYgKG1hcFdyaXRlci5maW5kKHdyaXRlckZvcm1hdCkgIT0gbWFwV3JpdGVyLmVuZCgpKSB7CiAgICAgICAgICAgICBtV3JpdGVyTmFtZSA9IG1hcFdyaXRlci5hdCh3cml0ZXJGb3JtYXQpOwogICAgICAgICB9CkBAIC0xMjYsMTYgKzE2MCwxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgICAgICBtQnVmZmVySW5mby5jbGVhcigpOwotICAgICAgICBpZiAobUlucHV0U3RyZWFtLmlzX29wZW4oKSkgbUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBnZXRJbnB1dEJ1ZmZlckluZm8oc3RyaW5nIGlucHV0RmlsZU5hbWUsIHN0cmluZyBpbnB1dEluZm8pOworICAgIHZvaWQgZ2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvLCBpbnQzMl90IGlkeCA9IDApOwogCiAgICAgaW50MzJfdCBjcmVhdGVXcml0ZXIoaW50MzJfdCBmZCk7CiAKLSAgICBpbnQzMl90IGFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMpOworICAgIGludDMyX3QgYWRkV3JpdGVyU291cmNlKGJvb2wgaXNBdWRpbywgY29uZmlnRm9ybWF0IHBhcmFtcywgaW50MzJfdCBpZHggPSAwKTsKKworICAgIHZvaWQgc2V0dXBFeHRyYWN0b3IoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIHN0cmluZyBpbnB1dEZpbGVOYW1lLCBpbnQzMl90ICZ0cmFja0NvdW50KTsKKworICAgIHZvaWQgZXh0cmFjdChBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uZmlnRm9ybWF0ICZwYXJhbXMsIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywKKyAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyLCBzaXplX3QgYnVmU2l6ZSwgc2l6ZV90ICpieXRlc0V4dHJhY3RlZCwgaW50MzJfdCBpZHgpOworCisgICAgdm9pZCBjb21wYXJlUGFyYW1zKGNvbmZpZ0Zvcm1hdCBzcmNQYXJhbSwgY29uZmlnRm9ybWF0IGRzdFBhcmFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gZHN0QnVmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCk7CiAKICAgICBlbnVtIHN0YW5kYXJkV3JpdGVycyB7CiAgICAgICAgIE9HRywKQEAgLTE1MiwzMiArMTg5LDQyIEBACiAgICAgc3RhbmRhcmRXcml0ZXJzIG1Xcml0ZXJOYW1lOwogICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyOwogICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7Ci0gICAgc3A8TWVkaWFBZGFwdGVyPiBtQ3VycmVudFRyYWNrOworICAgIHNwPE1lZGlhQWRhcHRlcj4gbUN1cnJlbnRUcmFja1trTWF4VHJhY2tDb3VudF17fTsKIAogICAgIGJvb2wgbURpc2FibGVUZXN0OwotICAgIGludDMyX3QgbU51bUNzZHM7Ci0gICAgaW50MzJfdCBtSW5wdXRGcmFtZUlkOwotICAgIGlmc3RyZWFtIG1JbnB1dFN0cmVhbTsKLSAgICB2ZWN0b3I8QnVmZmVySW5mbz4gbUJ1ZmZlckluZm87CisgICAgaW50MzJfdCBtTnVtQ3Nkc1trTWF4VHJhY2tDb3VudF17fTsKKyAgICBpbnQzMl90IG1JbnB1dEZyYW1lSWRba01heFRyYWNrQ291bnRde307CisgICAgaWZzdHJlYW0gbUlucHV0U3RyZWFtW2tNYXhUcmFja0NvdW50XXt9OworICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVySW5mb1trTWF4VHJhY2tDb3VudF07CiB9OwogCi12b2lkIFdyaXRlclRlc3Q6OmdldElucHV0QnVmZmVySW5mbyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgc3RyaW5nIGlucHV0SW5mbykgeworY2xhc3MgV3JpdGVGdW5jdGlvbmFsaXR5VGVzdAorICAgIDogcHVibGljIFdyaXRlclRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHN0cmluZyAvKiB3cml0ZXJGb3JtYXQqLywgaW5wdXRJZCAvKiBpbnB1dElkMCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dElkIC8qIGlucHV0SWQxKi8sIGZsb2F0IC8qIEJ1ZmZlckludGVydmFsKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwV3JpdGVyVHlwZShnZXQ8MD4oR2V0UGFyYW0oKSkpOyB9Cit9OworCit2b2lkIFdyaXRlclRlc3Q6OmdldElucHV0QnVmZmVySW5mbyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgc3RyaW5nIGlucHV0SW5mbywgaW50MzJfdCBpZHgpIHsKICAgICBzdGQ6Omlmc3RyZWFtIGVsZUluZm87CiAgICAgZWxlSW5mby5vcGVuKGlucHV0SW5mby5jX3N0cigpKTsKICAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOwogICAgIGludDMyX3QgYnl0ZXNDb3VudCA9IDA7CiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgIGludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICBpbnQzMl90IG51bUNzZHMgPSAwOwogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOwogICAgICAgICBlbGVJbmZvID4+IGZsYWdzOwogICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKLSAgICAgICAgbUJ1ZmZlckluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7Ci0gICAgICAgIGlmIChmbGFncyA9PSBDT0RFQ19DT05GSUdfRkxBRykgbU51bUNzZHMrKzsKKyAgICAgICAgbUJ1ZmZlckluZm9baWR4XS5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgaWYgKGZsYWdzID09IENPREVDX0NPTkZJR19GTEFHKSBudW1Dc2RzKys7CiAgICAgfQogICAgIGVsZUluZm8uY2xvc2UoKTsKLSAgICBtSW5wdXRTdHJlYW0ub3BlbihpbnB1dEZpbGVOYW1lLmNfc3RyKCksIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7Ci0gICAgQVNTRVJUX0VRKG1JbnB1dFN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIG1OdW1Dc2RzW2lkeF0gPSBudW1Dc2RzOworICAgIG1JbnB1dFN0cmVhbVtpZHhdLm9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtSW5wdXRTdHJlYW1baWR4XS5pc19vcGVuKCksIHRydWUpOwogfQogCiBpbnQzMl90IFdyaXRlclRlc3Q6OmNyZWF0ZVdyaXRlcihpbnQzMl90IGZkKSB7CkBAIC0yMjMsMTAgKzI3MCwxMCBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQzMl90IFdyaXRlclRlc3Q6OmFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMpIHsKLSAgICBpZiAobUlucHV0RnJhbWVJZCkgcmV0dXJuIC0xOworaW50MzJfdCBXcml0ZXJUZXN0OjphZGRXcml0ZXJTb3VyY2UoYm9vbCBpc0F1ZGlvLCBjb25maWdGb3JtYXQgcGFyYW1zLCBpbnQzMl90IGlkeCkgeworICAgIGlmIChtSW5wdXRGcmFtZUlkW2lkeF0pIHJldHVybiAtMTsKICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotICAgIGlmIChtSW5wdXRTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgaWYgKG1JbnB1dFN0cmVhbVtpZHhdLmlzX29wZW4oKSkgewogICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIHBhcmFtcy5taW1lKTsKICAgICAgICAgaWYgKGlzQXVkaW8pIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMuY2hhbm5lbENvdW50KTsKQEAgLTIzNSwyNSArMjgyLDM0IEBACiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHBhcmFtcy53aWR0aCk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBwYXJhbXMuaGVpZ2h0KTsKICAgICAgICAgfQotCi0gICAgICAgIGludDMyX3Qgc3RhdHVzID0KLSAgICAgICAgICAgICAgICB3cml0ZUhlYWRlckJ1ZmZlcnMobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgZm9ybWF0LCBtTnVtQ3Nkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIC0xOworICAgICAgICBpZiAobU51bUNzZHNbaWR4XSkgeworICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSB3cml0ZUhlYWRlckJ1ZmZlcnMobUlucHV0U3RyZWFtW2lkeF0sIG1CdWZmZXJJbmZvW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkW2lkeF0sIGZvcm1hdCwgbU51bUNzZHNbaWR4XSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KKwogICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKGZvcm1hdCwgdHJhY2tNZXRhKTsKLSAgICBtQ3VycmVudFRyYWNrID0gbmV3IE1lZGlhQWRhcHRlcih0cmFja01ldGEpOwotICAgIGlmIChtQ3VycmVudFRyYWNrID09IG51bGxwdHIpIHsKKyAgICBtQ3VycmVudFRyYWNrW2lkeF0gPSBuZXcgTWVkaWFBZGFwdGVyKHRyYWNrTWV0YSk7CisgICAgaWYgKG1DdXJyZW50VHJhY2tbaWR4XSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJNZWRpYUFkYXB0ZXIgcmV0dXJuZWQgbnVsbHB0ciIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IG1Xcml0ZXItPmFkZFNvdXJjZShtQ3VycmVudFRyYWNrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtV3JpdGVyLT5hZGRTb3VyY2UobUN1cnJlbnRUcmFja1tpZHhdKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCiB2b2lkIGdldEZpbGVEZXRhaWxzKHN0cmluZyAmaW5wdXRGaWxlUGF0aCwgc3RyaW5nICZpbmZvLCBjb25maWdGb3JtYXQgJnBhcmFtcywgYm9vbCAmaXNBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JbmRleCA9IDApIHsKLSAgICBpZiAoc3RyZWFtSW5kZXggPj0gc2l6ZW9mKGtJbnB1dERhdGEpIC8gc2l6ZW9mKGtJbnB1dERhdGFbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0SWQgaW5wSWQpIHsKKyAgICBpbnQzMl90IGlucHV0RGF0YVNpemUgPSBzaXplb2Yoa0lucHV0RGF0YSkgLyBzaXplb2Yoa0lucHV0RGF0YVswXSk7CisgICAgaW50MzJfdCBzdHJlYW1JbmRleCA9IDA7CisgICAgZm9yICg7IHN0cmVhbUluZGV4IDwgaW5wdXREYXRhU2l6ZTsgc3RyZWFtSW5kZXgrKykgeworICAgICAgICBpZiAoaW5wSWQgPT0ga0lucHV0RGF0YVtzdHJlYW1JbmRleF0uaW5wSWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1JbmRleCA9PSBpbnB1dERhdGFTaXplKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaW5wdXRGaWxlUGF0aCArPSBrSW5wdXREYXRhW3N0cmVhbUluZGV4XS5pbnB1dEZpbGU7CkBAIC0yNzAsNyArMzI2LDE0NyBAQAogICAgIHJldHVybjsKIH0KIAotVEVTVF9QKFdyaXRlclRlc3QsIENyZWF0ZVdyaXRlclRlc3QpIHsKK3ZvaWQgV3JpdGVyVGVzdDo6c2V0dXBFeHRyYWN0b3IoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIHN0cmluZyBpbnB1dEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZ0cmFja0NvdW50KSB7CisgICAgQUxPR1YoIklucHV0IGZpbGUgZm9yIGV4dHJhY3RvcjogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworCisgICAgaW50MzJfdCBmZCA9IG9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCBPX1JET05MWSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gd3JpdGVyJ3Mgb3V0cHV0IGZpbGUgdG8gdmFsaWRhdGUiOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGludDMyX3Qgc3RhdHVzID0gZnN0YXQoZmQsICZidWYpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZSBmb3IgZXh0cmFjdG9yIjsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIEFMT0dWKCJTaXplIG9mIGlucHV0IGZpbGUgdG8gZXh0cmFjdG9yOiAlenUiLCBmaWxlU2l6ZSk7CisKKyAgICBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKGV4dHJhY3RvciwgZmQsIDAsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlIGZvciBleHRyYWN0b3IiOworCisgICAgdHJhY2tDb3VudCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KGV4dHJhY3Rvcik7CisgICAgQVNTRVJUX0dUKHRyYWNrQ291bnQsIDApIDw8ICJObyB0cmFja3MgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yIjsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRyYWNrcyByZXBvcnRlZCBieSBleHRyYWN0b3IgOiAlZCIsIHRyYWNrQ291bnQpOworICAgIHJldHVybjsKK30KKwordm9pZCBXcml0ZXJUZXN0OjpleHRyYWN0KEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25maWdGb3JtYXQgJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sIHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpieXRlc0V4dHJhY3RlZCwgaW50MzJfdCBpZHgpIHsKKyAgICBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2soZXh0cmFjdG9yLCBpZHgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KGV4dHJhY3RvciwgaWR4KTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiVHJhY2sgZm9ybWF0IGlzIE5VTEwiOworICAgIEFMT0dJKCJUcmFjayBmb3JtYXQgPSAlcyIsIEFNZWRpYUZvcm1hdF90b1N0cmluZyhmb3JtYXQpKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBudWxscHRyOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cikgPDwgIlRyYWNrIG1pbWUgaXMgTlVMTCI7CisgICAgQUxPR0koIlRyYWNrIG1pbWUgPSAlcyIsIG1pbWUpOworICAgIHN0cmxjcHkocGFyYW1zLm1pbWUsIG1pbWUsIGtNaW1lU2l6ZSk7CisKKyAgICBpZiAoIXN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJnBhcmFtcy5jaGFubmVsQ291bnQpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgZGlkIG5vdCByZXBvcnQgY2hhbm5lbCBjb3VudCI7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZwYXJhbXMuc2FtcGxlUmF0ZSkpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBkaWQgbm90IHJlcG9ydCBzYW1wbGUgcmF0ZSI7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikgfHwgIXN0cm5jbXAobWltZSwgImltYWdlLyIsIDYpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZwYXJhbXMud2lkdGgpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgZGlkIG5vdCByZXBvcnQgd2lkdGgiOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJnBhcmFtcy5oZWlnaHQpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgZGlkIG5vdCByZXBvcnQgaGVpZ2h0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkludmFsaWQgbWltZSAiIDw8IG1pbWU7CisgICAgfQorCisgICAgaW50MzJfdCBidWZmZXJPZmZzZXQgPSAwOworICAgIC8vIEdldCBDU0QgZGF0YQorICAgIGludCBpbmRleCA9IDA7CisgICAgdm9pZCAqY3NkQnVmOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGNzZEJ1ZiA9IG51bGxwdHI7CisgICAgICAgIGNoYXIgY3NkTmFtZVsxNl07CisgICAgICAgIHNucHJpbnRmKGNzZE5hbWUsIDE2LCAiY3NkLSVkIiwgaW5kZXgpOworICAgICAgICBzaXplX3QgY3NkU2l6ZSA9IDA7CisgICAgICAgIGJvb2wgY3NkRm91bmQgPSBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgY3NkTmFtZSwgJmNzZEJ1ZiwgJmNzZFNpemUpOworICAgICAgICBpZiAoIWNzZEZvdW5kIHx8ICFjc2RCdWYgfHwgIWNzZFNpemUpIGJyZWFrOworCisgICAgICAgIGJ1ZmZlckluZm8ucHVzaF9iYWNrKHtzdGF0aWNfY2FzdDxpbnQzMl90Pihjc2RTaXplKSwgQ09ERUNfQ09ORklHX0ZMQUcsIDB9KTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlck9mZnNldCwgY3NkQnVmLCBjc2RTaXplKTsKKyAgICAgICAgYnVmZmVyT2Zmc2V0ICs9IGNzZFNpemU7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorCisgICAgLy8gR2V0IGZyYW1lIGRhdGEKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBzc2l6ZV90IHNhbXBsZVNpemUgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShleHRyYWN0b3IpOworICAgICAgICBpZiAoc2FtcGxlU2l6ZSA8IDApIGJyZWFrOworCisgICAgICAgIHVpbnQ4X3QgKnNhbXBsZUJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKHNhbXBsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUoc2FtcGxlQnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgb2Ygc2l6ZSAiIDw8IHNhbXBsZVNpemU7CisKKyAgICAgICAgaW50IGJ5dGVzUmVhZCA9IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShleHRyYWN0b3IsIHNhbXBsZUJ1ZmZlciwgc2FtcGxlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShieXRlc1JlYWQsIHNhbXBsZVNpemUpCisgICAgICAgICAgICAgICAgPDwgIk51bWJlciBvZiBieXRlcyBleHRyYWN0ZWQgZG9lcyBub3QgbWF0Y2ggd2l0aCBzYW1wbGUgc2l6ZSI7CisgICAgICAgIGludDY0X3QgcHRzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUoZXh0cmFjdG9yKTsKKyAgICAgICAgdWludDMyX3QgZmxhZyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhleHRyYWN0b3IpOworCisgICAgICAgIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykgeworICAgICAgICAgICAgLy8gUmVtb3ZpbmcgNCBieXRlcyBvZiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgZnJvbSBzYW1wbGUgc2l6ZQorICAgICAgICAgICAgYnl0ZXNSZWFkID0gYnl0ZXNSZWFkIC0gNDsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9MRShidWZmZXJPZmZzZXQgKyBieXRlc1JlYWQsIGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgPDwgIlNpemUgb2YgdGhlIGJ1ZmZlciBpcyBpbnN1ZmZpY2llbnQgdG8gc3RvcmUgdGhlIGV4dHJhY3RlZCBkYXRhIjsKKyAgICAgICAgYnVmZmVySW5mby5wdXNoX2JhY2soe2J5dGVzUmVhZCwgZmxhZywgcHRzfSk7CisgICAgICAgIG1lbWNweShidWZmZXIgKyBidWZmZXJPZmZzZXQsIHNhbXBsZUJ1ZmZlciwgYnl0ZXNSZWFkKTsKKyAgICAgICAgYnVmZmVyT2Zmc2V0ICs9IGJ5dGVzUmVhZDsKKworICAgICAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShleHRyYWN0b3IpOworICAgICAgICBmcmVlKHNhbXBsZUJ1ZmZlcik7CisgICAgfQorICAgICpieXRlc0V4dHJhY3RlZCA9IGJ1ZmZlck9mZnNldDsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgV3JpdGVyVGVzdDo6Y29tcGFyZVBhcmFtcyhjb25maWdGb3JtYXQgc3JjUGFyYW0sIGNvbmZpZ0Zvcm1hdCBkc3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8QnVmZmVySW5mbz4gZHN0QnVmSW5mbywgaW50MzJfdCBpbmRleCkgeworICAgIEFTU0VSVF9TVFJFUShzcmNQYXJhbS5taW1lLCBkc3RQYXJhbS5taW1lKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBtaW1lIHR5cGUgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBtaW1lIHR5cGUiOworCisgICAgaWYgKCFzdHJuY21wKHNyY1BhcmFtLm1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBBU1NFUlRfRVEoc3JjUGFyYW0uY2hhbm5lbENvdW50LCBkc3RQYXJhbS5jaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBjaGFubmVsIGNvdW50IGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgY2hhbm5lbCBjb3VudCI7CisgICAgICAgIEFTU0VSVF9FUShzcmNQYXJhbS5zYW1wbGVSYXRlLCBkc3RQYXJhbS5zYW1wbGVSYXRlKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgc2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBzYW1wbGUgcmF0ZSI7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChzcmNQYXJhbS5taW1lLCAidmlkZW8vIiwgNikgfHwgIXN0cm5jbXAoc3JjUGFyYW0ubWltZSwgImltYWdlLyIsIDYpKSB7CisgICAgICAgIEFTU0VSVF9FUShzcmNQYXJhbS53aWR0aCwgZHN0UGFyYW0ud2lkdGgpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCB3aWR0aCBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IHdpZHRoIjsKKyAgICAgICAgQVNTRVJUX0VRKHNyY1BhcmFtLmhlaWdodCwgZHN0UGFyYW0uaGVpZ2h0KQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgaGVpZ2h0IGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgaGVpZ2h0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkludmFsaWQgbWltZSB0eXBlIiA8PCBzcmNQYXJhbS5taW1lOworICAgIH0KKworICAgIGludDMyX3QgdG9sZXJhbmNlVmFsdWVVcyA9IGtNdXhUb2xlcmFuY2VUaW1lVXM7CisgICAgaWYgKG1Xcml0ZXJOYW1lID09IE1QRUc0KSB7CisgICAgICAgIHRvbGVyYW5jZVZhbHVlVXMgPSBrTXBlZzRNdXhUb2xlcmFuY2VUaW1lVXM7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRzdEJ1ZkluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX0VRKG1CdWZmZXJJbmZvW2luZGV4XVtpXS5zaXplLCBkc3RCdWZJbmZvW2ldLnNpemUpCisgICAgICAgICAgICAgICAgPDwgIklucHV0IHNpemUgIiA8PCBtQnVmZmVySW5mb1tpbmRleF1baV0uc2l6ZSA8PCAiIG1pc21hdGNoZWQgd2l0aCBleHRyYWN0ZWQgc2l6ZSAiCisgICAgICAgICAgICAgICAgPDwgZHN0QnVmSW5mb1tpXS5zaXplOworICAgICAgICBBU1NFUlRfRVEobUJ1ZmZlckluZm9baW5kZXhdW2ldLmZsYWdzLCBkc3RCdWZJbmZvW2ldLmZsYWdzKQorICAgICAgICAgICAgICAgIDw8ICJJbnB1dCBmbGFnICIgPDwgbUJ1ZmZlckluZm9baW5kZXhdW2ldLmZsYWdzCisgICAgICAgICAgICAgICAgPDwgIiBtaXNtYXRjaGVkIHdpdGggZXh0cmFjdGVkIHNpemUgIiA8PCBkc3RCdWZJbmZvW2ldLmZsYWdzOworICAgICAgICBBU1NFUlRfTEUoYWJzKG1CdWZmZXJJbmZvW2luZGV4XVtpXS50aW1lVXMgLSBkc3RCdWZJbmZvW2ldLnRpbWVVcyksIHRvbGVyYW5jZVZhbHVlVXMpCisgICAgICAgICAgICAgICAgPDwgIkRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnaW5hbCB0aW1lc3RhbXAgIiA8PCBtQnVmZmVySW5mb1tpbmRleF1baV0udGltZVVzCisgICAgICAgICAgICAgICAgPDwgIiBhbmQgZXh0cmFjdGVkIHRpbWVzdGFtcCAiIDw8IGRzdEJ1ZkluZm9baV0udGltZVVzCisgICAgICAgICAgICAgICAgPDwgImlzIGdyZWF0ZXIgdGhhbiB0b2xlcmFuY2UgdmFsdWUgPSAiIDw8IHRvbGVyYW5jZVZhbHVlVXMgPDwgIiBtaWNybyBzZWNvbmRzIjsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgQ3JlYXRlV3JpdGVyVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKICAgICBBTE9HVigiVGVzdHMgdGhlIGNyZWF0aW9uIG9mIHdyaXRlcnMiKTsKIApAQCAtMjgxLDE0ICs0NzcsMTQgQEAKIAogICAgIC8vIENyZWF0aW5nIHdyaXRlciB3aXRoaW4gYSB0ZXN0IHNjb3BlLiBEZXN0cnVjdG9yIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdGVzdCBlbmRzCiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgY3JlYXRlV3JpdGVyKGZkKSkKLSAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG91dHB1dCBmb3JtYXQ6IiA8PCBnZXQ8MD4oR2V0UGFyYW0oKSk7CiB9CiAKLVRFU1RfUChXcml0ZXJUZXN0LCBXcml0ZXJUZXN0KSB7CitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgV3JpdGVyVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKICAgICBBTE9HVigiQ2hlY2tzIGlmIGZvciBhIGdpdmVuIGlucHV0LCBhIHZhbGlkIG11eGVkIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCBvciBub3QiKTsKIAotICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOwogICAgIGludDMyX3QgZmQgPQogICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKQEAgLTI5NywzNSArNDkzLDExMCBAQAogICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IHdyaXRlckZvcm1hdDsKIAotICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKLSAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7Ci0gICAgY29uZmlnRm9ybWF0IHBhcmFtOwotICAgIGJvb2wgaXNBdWRpbzsKLSAgICBpbnQzMl90IGlucHV0RmlsZUlkeCA9IEdldFBhcmFtKCkuc2Vjb25kOwotICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wdXRGaWxlSWR4KTsKLSAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworICAgIGlucHV0SWQgaW5wSWRbXSA9IHtnZXQ8MT4oR2V0UGFyYW0oKSksIGdldDwyPihHZXRQYXJhbSgpKX07CisgICAgQVNTRVJUX05FKGlucElkWzBdLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKIAotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOwotICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSk7Ci0gICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICJXcml0ZXIiOworICAgIGludDMyX3QgbnVtVHJhY2tzID0gMTsKKyAgICBpZiAoaW5wSWRbMV0gIT0gVU5VU0VEX0lEKSB7CisgICAgICAgIG51bVRyYWNrcysrOworICAgIH0KKworICAgIHNpemVfdCBmaWxlU2l6ZVtudW1UcmFja3NdOworICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbVtudW1UcmFja3NdOworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICAgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgICAgICBib29sIGlzQXVkaW87CisgICAgICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbVtpZHhdLCBpc0F1ZGlvLCBpbnBJZFtpZHhdKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1cyA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGU6IiA8PCBpbnB1dEZpbGU7CisgICAgICAgIGZpbGVTaXplW2lkeF0gPSBidWYuc3Rfc2l6ZTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8sIGlkeCkpOworICAgICAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW1baWR4XSwgaWR4KTsKKyAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICJXcml0ZXIiOworICAgIH0KIAogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVySW5mby5zaXplKCkpOwotICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7Ci0gICAgbUN1cnJlbnRUcmFjay0+c3RvcCgpOworICAgIGZsb2F0IGludGVydmFsID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIEFTU0VSVF9MRShpbnRlcnZhbCwgMS4wZikgPDwgIkJ1ZmZlciBpbnRlcnZhbCBpbnZhbGlkLiBTaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEuMCI7CiAKKyAgICBzaXplX3QgcmFuZ2UgPSAwOworICAgIGludDMyX3QgbG9vcENvdW50ID0gMDsKKyAgICBpbnQzMl90IG9mZnNldFtrTWF4VHJhY2tDb3VudF17fTsKKyAgICB3aGlsZSAobG9vcENvdW50IDwgY2VpbCgxLjAgLyBpbnRlcnZhbCkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgICAgIHJhbmdlID0gbUJ1ZmZlckluZm9baWR4XS5zaXplKCkgKiBpbnRlcnZhbDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtW2lkeF0sIG1CdWZmZXJJbmZvW2lkeF0sIG1JbnB1dEZyYW1lSWRbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLCBvZmZzZXRbaWR4XSwgcmFuZ2UpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKKyAgICAgICAgICAgIG9mZnNldFtpZHhdICs9IHJhbmdlOworICAgICAgICB9CisgICAgICAgIGxvb3BDb3VudCsrOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwga01heFRyYWNrQ291bnQ7IGlkeCsrKSB7CisgICAgICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0pIHsKKyAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XS0+c3RvcCgpOworICAgICAgICB9CisgICAgfQogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKICAgICBjbG9zZShmZCk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgb3V0cHV0IG11eGVkIGZpbGUgY3JlYXRlZCBieSB3cml0ZXIKKyAgICAvLyBUT0RPKGIvMTQ2NDIzMDIyKTogU2tpcCB2YWxpZGF0aW5nIG91dHB1dCBmb3Igd2VibSB3cml0ZXIKKyAgICAvLyBUT0RPKGIvMTQ2NDIxMDE4KTogU2tpcCB2YWxpZGF0aW5nIG91dHB1dCBmb3Igb2dnIHdyaXRlcgorICAgIGlmIChtV3JpdGVyTmFtZSAhPSBPR0cgJiYgbVdyaXRlck5hbWUgIT0gV0VCTSkgeworICAgICAgICBjb25maWdGb3JtYXQgZXh0cmFjdG9yUGFyYW1zW251bVRyYWNrc107CisgICAgICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBleHRyYWN0b3JCdWZmZXJJbmZvW251bVRyYWNrc107CisgICAgICAgIGludDMyX3QgdHJhY2tDb3VudCA9IC0xOworCisgICAgICAgIEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gQU1lZGlhRXh0cmFjdG9yX25ldygpOworICAgICAgICBBU1NFUlRfTkUoZXh0cmFjdG9yLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBleHRyYWN0b3IiOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXR1cEV4dHJhY3RvcihleHRyYWN0b3IsIG91dHB1dEZpbGUsIHRyYWNrQ291bnQpKTsKKyAgICAgICAgQVNTRVJUX0VRKHRyYWNrQ291bnQsIG51bVRyYWNrcykKKyAgICAgICAgICAgICAgICA8PCAiVHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IG51bWJlciBvZiB0cmFja3MiOworCisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgICAgICBjaGFyICppbnB1dEJ1ZmZlciA9IChjaGFyICopbWFsbG9jKGZpbGVTaXplW2lkeF0pOworICAgICAgICAgICAgQVNTRVJUX05FKGlucHV0QnVmZmVyLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgb2Ygc2l6ZSAiIDw8IGZpbGVTaXplW2lkeF07CisgICAgICAgICAgICBtSW5wdXRTdHJlYW1baWR4XS5zZWVrZygwLCBtSW5wdXRTdHJlYW1baWR4XS5iZWcpOworICAgICAgICAgICAgbUlucHV0U3RyZWFtW2lkeF0ucmVhZChpbnB1dEJ1ZmZlciwgZmlsZVNpemVbaWR4XSk7CisgICAgICAgICAgICBBU1NFUlRfRVEobUlucHV0U3RyZWFtW2lkeF0uZ2NvdW50KCksIGZpbGVTaXplW2lkeF0pOworCisgICAgICAgICAgICB1aW50OF90ICpleHRyYWN0ZWRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZVtpZHhdKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShleHRyYWN0ZWRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplICIgPDwgZmlsZVNpemVbaWR4XTsKKyAgICAgICAgICAgIHNpemVfdCBieXRlc0V4dHJhY3RlZCA9IDA7CisKKyAgICAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGV4dHJhY3QoZXh0cmFjdG9yLCBleHRyYWN0b3JQYXJhbXNbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yQnVmZmVySW5mb1tpZHhdLCBleHRyYWN0ZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplW2lkeF0sICZieXRlc0V4dHJhY3RlZCwgaWR4KSk7CisgICAgICAgICAgICBBU1NFUlRfR1QoYnl0ZXNFeHRyYWN0ZWQsIDApIDw8ICJUb3RhbCBieXRlcyBleHRyYWN0ZWQgYnkgZXh0cmFjdG9yIGNhbm5vdCBiZSB6ZXJvIjsKKworICAgICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQYXJhbXMocGFyYW1baWR4XSwgZXh0cmFjdG9yUGFyYW1zW2lkeF0sIGV4dHJhY3RvckJ1ZmZlckluZm9baWR4XSwgaWR4KSk7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShtZW1jbXAoZXh0cmFjdGVkQnVmZmVyLCAodWludDhfdCAqKWlucHV0QnVmZmVyLCBieXRlc0V4dHJhY3RlZCksIDApCisgICAgICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgYml0IHN0cmVhbSBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IGJpdCBzdHJlYW0iOworCisgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIGZyZWUoZXh0cmFjdGVkQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKGV4dHJhY3Rvcik7CisgICAgfQogfQogCi1URVNUX1AoV3JpdGVyVGVzdCwgUGF1c2VXcml0ZXJUZXN0KSB7CitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgUGF1c2VXcml0ZXJUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogICAgIEFMT0dWKCJWYWxpZGF0ZXMgdGhlIHBhdXNlKCkgYXBpIG9mIHdyaXRlcnMiKTsKIAotICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOwogICAgIGludDMyX3QgZmQgPQogICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKQEAgLTMzOCw4ICs2MDksMTAgQEAKICAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CiAgICAgY29uZmlnRm9ybWF0IHBhcmFtOwogICAgIGJvb2wgaXNBdWRpbzsKLSAgICBpbnQzMl90IGlucHV0RmlsZUlkeCA9IEdldFBhcmFtKCkuc2Vjb25kOwotICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wdXRGaWxlSWR4KTsKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOwogCiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CkBAIC0zNDgsOCArNjIxLDggQEAKIAogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVySW5mby5zaXplKCkgLyA0KTsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCAwLCBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0KTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwogCiAgICAgYm9vbCBpc1BhdXNlZCA9IGZhbHNlOwpAQCAtMzU5LDI2ICs2MzIsMjYgQEAKICAgICAgICAgaXNQYXVzZWQgPSB0cnVlOwogICAgIH0KICAgICAvLyBJbiB0aGUgcGF1c2Ugc3RhdGUsIHdyaXRlcnMgc2hvdWxkbid0IHdyaXRlIGFueXRoaW5nLiBUZXN0aW5nIHRoZSB3cml0ZXJzIGZvciB0aGUgc2FtZQotICAgIGludDMyX3QgbnVtRnJhbWVzUGF1c2VkID0gbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNDsKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbnVtRnJhbWVzUGF1c2VkLCBpc1BhdXNlZCk7CisgICAgaW50MzJfdCBudW1GcmFtZXNQYXVzZWQgPSBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0OworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIG1JbnB1dEZyYW1lSWRbMF0sIG51bUZyYW1lc1BhdXNlZCwgaXNQYXVzZWQpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKICAgICBpZiAoaXNQYXVzZWQpIHsKICAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKICAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKICAgICB9Ci0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWQsIG1CdWZmZXJJbmZvLnNpemUoKSk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgbUlucHV0RnJhbWVJZFswXSwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwotICAgIG1DdXJyZW50VHJhY2stPnN0b3AoKTsKKyAgICBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CiAKICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHdyaXRlciI7CiAgICAgY2xvc2UoZmQpOwogfQogCi1URVNUX1AoV3JpdGVyVGVzdCwgTXVsdGlTdGFydFN0b3BQYXVzZVRlc3QpIHsKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBNdWx0aVN0YXJ0U3RvcFBhdXNlVGVzdCkgewogICAgIC8vIFRPRE86IChiLzE0NDgyMTgwNCkKICAgICAvLyBFbmFibGUgdGhlIHRlc3QgZm9yIE1QRTJUUyB3cml0ZXIKICAgICBpZiAobURpc2FibGVUZXN0IHx8IG1Xcml0ZXJOYW1lID09IHN0YW5kYXJkV3JpdGVyczo6TVBFRzJUUykgcmV0dXJuOwpAQCAtMzg5LDcgKzY2Miw3IEBACiAgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwogICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CiAKLSAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOwogICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKICAgICBBU1NFUlRfRVEoc3RhdHVzLCAoc3RhdHVzX3QpT0spIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IHdyaXRlckZvcm1hdDsKIApAQCAtMzk3LDggKzY3MCwxMCBAQAogICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKICAgICBjb25maWdGb3JtYXQgcGFyYW07CiAgICAgYm9vbCBpc0F1ZGlvOwotICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gR2V0UGFyYW0oKS5zZWNvbmQ7Ci0gICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOwogICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CiAKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKQEAgLTQxNSw4ICs2OTAsOCBAQAogICAgICAgICBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOwogICAgIH0KIAotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJJbmZvLnNpemUoKSAvIDQpOworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIDAsIG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKICAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IGtNYXhDb3VudDsgY291bnQrKykgewpAQCAtNDI1LDIwICs3MDAsMjAgQEAKICAgICB9CiAKICAgICBtV3JpdGVyLT5wYXVzZSgpOwotICAgIGludDMyX3QgbnVtRnJhbWVzUGF1c2VkID0gbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNDsKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkLCBudW1GcmFtZXNQYXVzZWQsIHRydWUpOworICAgIGludDMyX3QgbnVtRnJhbWVzUGF1c2VkID0gbUJ1ZmZlckluZm9bMF0uc2l6ZSgpIC8gNDsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCBtSW5wdXRGcmFtZUlkWzBdLCBudW1GcmFtZXNQYXVzZWQsIHRydWUpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKICAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IGtNYXhDb3VudDsgY291bnQrKykgewogICAgICAgICBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOwogICAgIH0KIAotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWQsIG1CdWZmZXJJbmZvLnNpemUoKSk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgbUlucHV0RnJhbWVJZFswXSwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwogCi0gICAgbUN1cnJlbnRUcmFjay0+c3RvcCgpOworICAgIG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKIAogICAgIC8vIGZpcnN0IHN0b3Agc2hvdWxkIHN1Y2NlZWQuCiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOwpAQCAtNDUxLDE5ICs3MjYsMzgwIEBACiAgICAgY2xvc2UoZmQpOwogfQogCitjbGFzcyBXcml0ZXJWYWxpZGl0eVRlc3QKKyAgICA6IHB1YmxpYyBXcml0ZXJUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8c3RyaW5nIC8qIHdyaXRlckZvcm1hdCovLCBpbnB1dElkIC8qIGlucHV0SWQwKi8sIGJvb2wgLyogYWRkU291cmNlRmFpbCovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cFdyaXRlclR5cGUoZ2V0PDA+KEdldFBhcmFtKCkpKTsgfQorfTsKKworVEVTVF9QKFdyaXRlclZhbGlkaXR5VGVzdCwgSW52YWxpZElucHV0VGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiVmFsaWRhdGVzIHdyaXRlcidzIGJlaGF2aW9yIGZvciBpbnZhbGlkIGlucHV0cyIpOworCisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIGJvb2wgYWRkU291cmNlRmFpbEV4cGVjdGVkID0gZ2V0PDI+KEdldFBhcmFtKCkpOworCisgICAgLy8gVGVzdCB3cml0ZXJzIGZvciBpbnZhbGlkIEZEIHZhbHVlCisgICAgaW50MzJfdCBmZCA9IC0xOworICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGVXcml0ZXIgZmFpbGVkIGZvciBpbnZhbGlkIEZELCB0aGlzIGlzIGV4cGVjdGVkIGJlaGF2aW9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB3cml0ZXIgd2FzIGNyZWF0ZWQgZm9yIGludmFsaWQgZmQsIHRlc3QgaXQgZnVydGhlci4KKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKKyAgICBib29sIGlzQXVkaW87CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoYWRkU291cmNlRmFpbEV4cGVjdGVkKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIiOworICAgICAgICBBTE9HVigiYWRkV3JpdGVyU291cmNlIGZhaWxlZCBmb3IgaW52YWxpZCBGRCwgdGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gc3RhcnQgdGhlIHdyaXRlciB3aXRoIHZhbGlkIGFyZ3VtZW50IGJ1dCBpbnZhbGlkIEZECisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKyAgICBBU1NFUlRfTkUoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJXcml0ZXIgZGlkIG5vdCBmYWlsIGZvciBpbnZhbGlkIEZEIjsKKworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIDAsIG1CdWZmZXJJbmZvWzBdLnNpemUoKSk7CisgICAgQVNTRVJUX05FKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiV3JpdGVyIGRpZCBub3QgcmVwb3J0IGVycm9yIGZvciBpbnZhbGlkIEZEIjsKKworICAgIHN0YXR1cyA9IG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIjsKK30KKworVEVTVF9QKFdyaXRlclZhbGlkaXR5VGVzdCwgTWFsRm9ybWVkRGF0YVRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgLy8gRW5hYmxlIHRlc3QgZm9yIE9nZyB3cml0ZXIKKyAgICBBU1NFUlRfTkUobVdyaXRlck5hbWUsIE9HRykgPDwgIlRPRE8oYi8xNjAxMDU2NDYpIjsKKyAgICBBTE9HVigiVGVzdCB3cml0ZXIgZm9yIG1hbGZvcm1lZCBpbnB1dHMiKTsKKworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBib29sIGFkZFNvdXJjZUZhaWxFeHBlY3RlZCA9IGdldDwyPihHZXRQYXJhbSgpKTsKKyAgICBpbnQzMl90IGZkID0KKyAgICAgICAgICAgIG9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgKHN0YXR1c190KU9LKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIG91dHB1dCBmb3JtYXQiOworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CisgICAgLy8gUmVtb3ZlIENTRCBkYXRhIGZyb20gaW5wdXQKKyAgICBtTnVtQ3Nkc1swXSA9IDA7CisgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGFkZFNvdXJjZUZhaWxFeHBlY3RlZCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIjsKKyAgICAgICAgQUxPR1YoIiVzIHdyaXRlciBmYWlsZWQgdG8gYWRkU291cmNlIGFmdGVyIHJlbW92aW5nIENTRCBmcm9tIGlucHV0Iiwgd3JpdGVyRm9ybWF0LmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJDb3VsZCBub3Qgc3RhcnQgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIndyaXRlciI7CisKKyAgICAvLyBTa2lwIGZpcnN0IGZldyBmcmFtZXMuIFRoZXNlIG1heSBjb250YWluIHN5bmMgZnJhbWVzIGFsc28uCisgICAgaW50MzJfdCBmcmFtZUlEID0gbUlucHV0RnJhbWVJZFswXSArIG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQ7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBmcmFtZUlELCBtQ3VycmVudFRyYWNrWzBdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisKKyAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgc3RhdHVzID0gbVdyaXRlci0+ZHVtcChmZCwgYXJncyk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGR1bXAgc3RhdGlzdGljcyBmcm9tIHdyaXRlciI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIiOworICAgIGNsb3NlKGZkKTsKK30KKworLy8gVGhpcyB0ZXN0IGlzIHNwZWNpZmljIHRvIE1QRUc0V3JpdGVyIHRvIHRlc3QgbW9yZSBBUElzCitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgTXBlZzRXcml0ZXJUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGlmIChtV3JpdGVyTmFtZSAhPSBzdGFuZGFyZFdyaXRlcnM6Ok1QRUc0KSByZXR1cm47CisgICAgQUxPR1YoIlRlc3QgTVBFRzQgd3JpdGVyIHNwZWNpZmljIEFQSXMiKTsKKworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgaW50MzJfdCBmZCA9CisgICAgICAgICAgICBvcGVuKE9VVFBVVF9GSUxFX05BTUUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIChzdGF0dXNfdClPSykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBtcGVnNCBvdXRwdXQgZm9ybWF0IjsKKworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgIGJvb2wgaXNBdWRpbzsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CisgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOworICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yIG1wZWc0IFdyaXRlciI7CisKKyAgICAvLyBzaWduYWwgbWV0YSBkYXRhIGZvciB0aGUgd3JpdGVyCisgICAgc3A8TVBFRzRXcml0ZXI+IG1wNHdyaXRlciA9IHN0YXRpY19jYXN0PE1QRUc0V3JpdGVyICo+KG1Xcml0ZXIuZ2V0KCkpOworICAgIHN0YXR1cyA9IG1wNHdyaXRlci0+c2V0SW50ZXJsZWF2ZUR1cmF0aW9uKGtEZWZhdWx0SW50ZXJsZWF2ZUR1cmF0aW9uKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJzZXRJbnRlcmxlYXZlRHVyYXRpb24gZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1wNHdyaXRlci0+c2V0R2VvRGF0YShrRGVmYXVsdExhdGl0dWRleDEwMDAwLCBrRGVmYXVsdExvbmdpdHVkZXgxMDAwMCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAic2V0R2VvRGF0YSBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbXA0d3JpdGVyLT5zZXRDYXB0dXJlUmF0ZShrRGVmYXVsdEZQUyk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAic2V0Q2FwdHVyZVJhdGUgZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiQ291bGQgbm90IHN0YXJ0IHRoZSB3cml0ZXIiOworCisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgMCwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJtcGVnNCB3cml0ZXIgZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB3cml0ZXIiOworICAgIG1wNHdyaXRlci5jbGVhcigpOworICAgIGNsb3NlKGZkKTsKK30KKworY2xhc3MgTGlzdGVuZXJUZXN0CisgICAgOiBwdWJsaWMgV3JpdGVyVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8CisgICAgICAgICAgICAgIHN0cmluZyAvKiB3cml0ZXJGb3JtYXQqLywgaW5wdXRJZCAvKiBpbnB1dElkMCovLCBpbnB1dElkIC8qIGlucHV0SWQxKi8sCisgICAgICAgICAgICAgIGZsb2F0IC8qIEZpbGVTaXplTGltaXQqLywgZmxvYXQgLyogRmlsZUR1cmF0aW9uTGltaXQqLywgZmxvYXQgLyogQnVmZmVySW50ZXJ2YWwqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBXcml0ZXJUeXBlKGdldDwwPihHZXRQYXJhbSgpKSk7IH0KK307CisKK1RFU1RfUChMaXN0ZW5lclRlc3QsIFNldE1heEZpbGVMaW1pdHNUZXN0KSB7CisgICAgLy8gVE9ETyhiLzE1MTg5MjQxNCk6IEVuYWJsZSB0ZXN0IGZvciBvdGhlciB3cml0ZXJzCisgICAgaWYgKG1EaXNhYmxlVGVzdCB8fCBtV3JpdGVyTmFtZSAhPSBNUEVHNCkgcmV0dXJuOworICAgIEFMT0dWKCJWYWxpZGF0ZXMgd3JpdGVyIHdoZW4gbWF4IGZpbGUgbGltaXRzIGFyZSBzZXQiKTsKKworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OworCisgICAgaW5wdXRJZCBpbnBJZFtdID0ge2dldDwxPihHZXRQYXJhbSgpKSwgZ2V0PDI+KEdldFBhcmFtKCkpfTsKKyAgICBBU1NFUlRfTkUoaW5wSWRbMF0sIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgc2l6ZV90IGlucHV0RmlsZVNpemUgPSAwOworICAgIGludDY0X3QgbGFzdEZyYW1lVGltZVN0YW1wVXMgPSBJTlRfTUFYOworICAgIGludDMyX3QgbnVtVHJhY2tzID0gMTsKKyAgICBpZiAoaW5wSWRbMV0gIT0gVU5VU0VEX0lEKSB7CisgICAgICAgIG51bVRyYWNrcysrOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICAgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgICAgICBib29sIGlzQXVkaW87CisgICAgICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWRbaWR4XSk7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBpZHgpKTsKKyAgICAgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtLCBpZHgpOworICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIldyaXRlciI7CisKKyAgICAgICAgLy8gUmVhZCBmaWxlIHByb3BlcnRpZXMKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHN0YXR1cyk7CisKKyAgICAgICAgaW5wdXRGaWxlU2l6ZSArPSBidWYuc3Rfc2l6ZTsKKyAgICAgICAgaWYgKGxhc3RGcmFtZVRpbWVTdGFtcFVzID4gbUJ1ZmZlckluZm9baWR4XVttQnVmZmVySW5mb1tpZHhdLnNpemUoKSAtIDFdLnRpbWVVcykgeworICAgICAgICAgICAgbGFzdEZyYW1lVGltZVN0YW1wVXMgPSBtQnVmZmVySW5mb1tpZHhdW21CdWZmZXJJbmZvW2lkeF0uc2l6ZSgpIC0gMV0udGltZVVzOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgZmlsZVNpemVMaW1pdCA9IGdldDwzPihHZXRQYXJhbSgpKTsKKyAgICBmbG9hdCBmaWxlRHVyYXRpb25MaW1pdCA9IGdldDw0PihHZXRQYXJhbSgpKTsKKyAgICBpbnQ2NF90IG1heEZpbGVTaXplID0gMDsKKyAgICBpbnQ2NF90IG1heEZpbGVEdXJhdGlvbiA9IDA7CisgICAgaWYgKGZpbGVTaXplTGltaXQgPiAwKSB7CisgICAgICAgIG1heEZpbGVTaXplID0gKGludDY0X3QpKGZpbGVTaXplTGltaXQgKiBpbnB1dEZpbGVTaXplKTsKKyAgICAgICAgbVdyaXRlci0+c2V0TWF4RmlsZVNpemUobWF4RmlsZVNpemUpOworICAgIH0KKyAgICBpZiAoZmlsZUR1cmF0aW9uTGltaXQgPiAwKSB7CisgICAgICAgIG1heEZpbGVEdXJhdGlvbiA9IChpbnQ2NF90KShmaWxlRHVyYXRpb25MaW1pdCAqIGxhc3RGcmFtZVRpbWVTdGFtcFVzKTsKKyAgICAgICAgbVdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKG1heEZpbGVEdXJhdGlvbik7CisgICAgfQorCisgICAgc3A8V3JpdGVyTGlzdGVuZXI+IGxpc3RlbmVyID0gbmV3IFdyaXRlckxpc3RlbmVyKCk7CisgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKSA8PCAidW5hYmxlIHRvIGFsbG9jYXRlIGxpc3RlbmVyIjsKKworICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cyk7CisKKyAgICBmbG9hdCBpbnRlcnZhbCA9IGdldDw1PihHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfTEUoaW50ZXJ2YWwsIDEuMGYpIDw8ICJCdWZmZXIgaW50ZXJ2YWwgaW52YWxpZC4gU2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLjAiOworCisgICAgc2l6ZV90IHJhbmdlID0gMDsKKyAgICBpbnQzMl90IGxvb3BDb3VudCA9IDA7CisgICAgaW50MzJfdCBvZmZzZXRba01heFRyYWNrQ291bnRde307CisgICAgd2hpbGUgKGxvb3BDb3VudCA8IGNlaWwoMS4wIC8gaW50ZXJ2YWwpKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgICAgICByYW5nZSA9IG1CdWZmZXJJbmZvW2lkeF0uc2l6ZSgpICogaW50ZXJ2YWw7CisgICAgICAgICAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVtpZHhdLCBtQnVmZmVySW5mb1tpZHhdLCBtSW5wdXRGcmFtZUlkW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XSwgb2Zmc2V0W2lkeF0sIHJhbmdlLCBmYWxzZSwgbGlzdGVuZXIpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKKyAgICAgICAgICAgIG9mZnNldFtpZHhdICs9IHJhbmdlOworICAgICAgICB9CisgICAgICAgIGxvb3BDb3VudCsrOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKG1Xcml0ZXItPnJlYWNoZWRFT1MoKSkgPDwgIkVPUyBub3Qgc2lnbmFsbGVkLiI7CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwga01heFRyYWNrQ291bnQ7IGlkeCsrKSB7CisgICAgICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0pIHsKKyAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XS0+c3RvcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB3cml0ZXIiOworICAgIGNsb3NlKGZkKTsKKworICAgIGlmIChtYXhGaWxlU2l6ZSA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShsaXN0ZW5lci0+bVNpZ25hbGVkU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtYXhGaWxlRHVyYXRpb24gPD0gMCkgeworICAgICAgICBBU1NFUlRfRkFMU0UobGlzdGVuZXItPm1TaWduYWxlZER1cmF0aW9uKTsKKyAgICB9IGVsc2UgaWYgKG1heEZpbGVTaXplID4gMCAmJiBtYXhGaWxlRHVyYXRpb24gPD0gMCkgeworICAgICAgICBBU1NFUlRfVFJVRShsaXN0ZW5lci0+bVNpZ25hbGVkU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtYXhGaWxlRHVyYXRpb24gPiAwICYmIG1heEZpbGVTaXplIDw9IDApIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobGlzdGVuZXItPm1TaWduYWxlZER1cmF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShsaXN0ZW5lci0+bVNpZ25hbGVkU2l6ZSB8fCBsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24pOworICAgIH0KKworICAgIGlmIChtYXhGaWxlU2l6ZSA+IDApIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXMgPSBzdGF0KG91dHB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUSgwLCBzdGF0dXMpOworICAgICAgICBBU1NFUlRfTEUoYnVmLnN0X3NpemUsIG1heEZpbGVTaXplKTsKKyAgICB9Cit9CisKKy8vIFRPRE86IChiLzE1MDkyMzM4NykKKy8vIEFkZCBXRUJNIGlucHV0CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTGlzdGVuZXJUZXN0QWxsLCBMaXN0ZW5lclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiYWFjIiwgQUFDXzEsIFVOVVNFRF9JRCwgMC42LCAwLjcsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcm5iIiwgQU1SX05CXzEsIFVOVVNFRF9JRCwgMC4yLCAwLjYsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcndiIiwgQU1SX1dCXzEsIFVOVVNFRF9JRCwgMC41LCAwLjUsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjIsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIFVOVVNFRF9JRCwgMC40LCAwLjMsIDAuMjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIFVOVVNFRF9JRCwgMC4zLCAxLCAwLjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsIE9QVVNfMSwgVU5VU0VEX0lELCAwLjcsIDAuMywgMSkpKTsKKwogLy8gVE9ETzogKGIvMTQ0NDc2MTY0KQogLy8gQWRkIEFBQ19BRFRTLCBGTEFDLCBBVjEgaW5wdXQKLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChXcml0ZXJUZXN0QWxsLCBXcml0ZXJUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigib2dnIiwgMCksIG1ha2VfcGFpcigid2VibSIsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYWFjIiwgMSksIG1ha2VfcGFpcigibXBlZzQiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtcm5iIiwgMyksIG1ha2VfcGFpcigiYW1yd2IiLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndlYm0iLCA1KSwgbWFrZV9wYWlyKCJ3ZWJtIiwgNyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ3ZWJtIiwgOCksIG1ha2VfcGFpcigibXBlZzQiLCA5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgMTApLCBtYWtlX3BhaXIoIm1wZWc0IiwgMTIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAxMyksIG1ha2VfcGFpcigibXBlZzJUcyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJUcyIsIDkpKSk7CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIFdyaXRlclRlc3RBbGwsIFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFhYyIsIEFBQ18xLCBVTlVTRURfSUQsIDEpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1ybmIiLCBBTVJfTkJfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJ3YiIsIEFNUl9XQl8xLCBVTlVTRURfSUQsIDEpLAorCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE0NDkwMjAxOCk6IEVuYWJsZSB0ZXN0IGZvciBtcGVnMnRzCisgICAgICAgICAgICAgICAgLy8gbWFrZV90dXBsZSgibXBlZzJUcyIsIEFBQ18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIC8vIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBVkNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTU2MzU1ODU3KTogQWRkIG11bHRpdHJhY2sgZm9yIG1wZWcydHMKKyAgICAgICAgICAgICAgICAvLyBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgQUFDXzEsIEFWQ18xLCAwLjUwKSwKKyAgICAgICAgICAgICAgICAvLyBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgQVZDXzEsIEFBQ18xLCAwLjI1KSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBTVJfTkJfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9XQl8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQVZDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIMjYzXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRUlDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRVZDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBNUEVHNF8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIEFWQ18xLCAwLjI1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFWQ18xLCBBQUNfMSwgMC43NSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBTVJfV0JfMSwgQUFDXzEsIDAuNzUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSEVWQ18xLCBBTVJfV0JfMSwgMC4yNSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIMjYzXzEsIEFNUl9OQl8xLCAwLjUwKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIE1QRUc0XzEsIEFBQ18xLCAwLjc1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9OQl8xLCBBTVJfV0JfMSwgMC4yNSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIMjYzXzEsIEFNUl9OQl8xLCAwLjUwKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIE1QRUc0XzEsIEhFVkNfMSwgMC43NSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCBPUFVTXzEsIFVOVVNFRF9JRCwgMSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgT1BVU18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWT1JCSVNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA4XzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOV8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDhfMSwgT1BVU18xLCAwLjUwKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVk9SQklTXzEsIFZQOF8xLCAwLjI1KSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIFdyaXRlclZhbGlkaXR5VGVzdCwgV3JpdGVyVmFsaWRpdHlUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhYWMiLCBBQUNfMSwgdHJ1ZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJuYiIsIEFNUl9OQl8xLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJ3YiIsIEFNUl9XQl8xLCB0cnVlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9OQl8xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBVkNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSDI2M18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRUlDXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFVkNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgTVBFRzRfMSwgZmFsc2UpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgT1BVU18xLCB0cnVlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBPUFVTXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVk9SQklTXzEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDhfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDlfMSwgZmFsc2UpKSk7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICBnRW52ID0gbmV3IFdyaXRlclRlc3RFbnZpcm9ubWVudCgpOwogICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOwogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oCmluZGV4IDk5ZTY4NmYuLjdkYTBhNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0RW52aXJvbm1lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdEVudmlyb25tZW50LmgKQEAgLTI1LDcgKzI1LDcgQEAKIAogY2xhc3MgV3JpdGVyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgewogICBwdWJsaWM6Ci0gICAgV3JpdGVyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorICAgIFdyaXRlclRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIiksIGRlbGV0ZU91dHB1dCh0cnVlKSB7fQogCiAgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwpAQCAtMzQsMTYgKzM0LDIxIEBACiAKICAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CiAKKyAgICBib29sIGNsZWFuVXAoKSBjb25zdCB7IHJldHVybiBkZWxldGVPdXRwdXQ7IH0KKwogICBwcml2YXRlOgogICAgIHN0cmluZyByZXM7CisgICAgYm9vbCBkZWxldGVPdXRwdXQ7CiB9OwogCiBpbnQgV3JpdGVyVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiY2xlYW5VcCIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnQyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMCwgMH19OwogCiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOkM6Iiwgb3B0aW9ucywgJmluZGV4KTsKICAgICAgICAgaWYgKGMgPT0gLTEpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC01Miw2ICs1NywxMSBAQAogICAgICAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZU91dHB1dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTYyLDcgKzcyLDggQEAKICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgogICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKICAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgotICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIgorICAgICAgICAgICAgICAgICItQywgZGVmYXVsdDp0cnVlLiBEZWxldGUgb3V0cHV0IGZpbGUgYWZ0ZXIgdGVzdCBjb21wbGV0ZXNcbiIsCiAgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOwogICAgICAgICByZXR1cm4gMjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5jcHAKaW5kZXggZjI0Y2NiNi4uYTMwNDNmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmNwcApAQCAtMjQsOSArMjQsMTYgQEAKIAogaW50MzJfdCBzZW5kQnVmZmVyc1RvV3JpdGVyKGlmc3RyZWFtICZpbnB1dFN0cmVhbSwgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJmlucHV0RnJhbWVJZCwgc3A8TWVkaWFBZGFwdGVyPiAmY3VycmVudFRyYWNrLCBpbnQzMl90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBib29sIGlzUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgYm9vbCBpc1BhdXNlZCwgc3A8V3JpdGVyTGlzdGVuZXI+IGxpc3RlbmVyKSB7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGlucHV0RnJhbWVJZCA+PSAoaW50KWJ1ZmZlckluZm8uc2l6ZSgpIHx8IGlucHV0RnJhbWVJZCA+PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24gfHwgbGlzdGVuZXItPm1TaWduYWxlZFNpemUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiTWF4IEZpbGUgbGltaXQgcmVhY2hlZC4gTm8gbW9yZSBidWZmZXJzIHdpbGwgYmUgc2VudCB0byB0aGUgd3JpdGVyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IHNpemUgPSBidWZmZXJJbmZvW2lucHV0RnJhbWVJZF0uc2l6ZTsKICAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyICopbWFsbG9jKHNpemUpOwogICAgICAgICBpZiAoIWRhdGEpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oCmluZGV4IGNkZDYyNDYuLjZiNDU2ZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuaApAQCAtMjcsMTMgKzI3LDE5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuaD4KIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOworI2luY2x1ZGUgIldyaXRlckxpc3RlbmVyLmgiCiAKICNkZWZpbmUgQ09ERUNfQ09ORklHX0ZMQUcgMzIKIAorY29uc3RleHByIHVpbnQzMl90IGtNYXhUcmFja0NvdW50ID0gMjsKIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4Q1NEU3RybGVuID0gMTY7CiBjb25zdGV4cHIgdWludDMyX3Qga01heENvdW50ID0gMjA7Citjb25zdGV4cHIgaW50MzJfdCBrTWltZVNpemUgPSAxMjg7Citjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdEludGVybGVhdmVEdXJhdGlvbiA9IDA7CisvLyBHZW9kYXRhIGlzIHNldCBhY2NvcmRpbmcgdG8gSVNPLTY3MDkgc3RhbmRhcmQuCitjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdExhdGl0dWRleDEwMDAwID0gNTAwMDAwOworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRMb25naXR1ZGV4MTAwMDAgPSAxMDAwMDAwOworY29uc3RleHByIGZsb2F0IGtEZWZhdWx0RlBTID0gMzAuMGY7CiAKIHN0cnVjdCBCdWZmZXJJbmZvIHsKICAgICBpbnQzMl90IHNpemU7CkBAIC00MSw5ICs0NywxOCBAQAogICAgIGludDY0X3QgdGltZVVzOwogfTsKIAorc3RydWN0IGNvbmZpZ0Zvcm1hdCB7CisgICAgY2hhciBtaW1lW2tNaW1lU2l6ZV07CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7Cit9OworCiBpbnQzMl90IHNlbmRCdWZmZXJzVG9Xcml0ZXIoaWZzdHJlYW0gJmlucHV0U3RyZWFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmaW5wdXRGcmFtZUlkLCBzcDxNZWRpYUFkYXB0ZXI+ICZjdXJyZW50VHJhY2ssIGludDMyX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2UsIGJvb2wgaXNQYXVzZWQgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgYm9vbCBpc1BhdXNlZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFdyaXRlckxpc3RlbmVyPiBsaXN0ZW5lciA9IG51bGxwdHIpOwogCiBpbnQzMl90IHdyaXRlSGVhZGVyQnVmZmVycyhpZnN0cmVhbSAmaW5wdXRTdHJlYW0sIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJmlucHV0RnJhbWVJZCwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGludDMyX3QgbnVtQ3Nkcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmY4ODkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlRpbWVkVGV4dFVuaXRUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlRpbWVkVGV4dFVuaXRUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NTRlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIFRpbWVkVGV4dCB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3NzRiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDQwIEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgVGltZWRUZXh0IFVuaXQgVGVzdCA6CitUaGUgVGltZWRUZXh0IFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIFRleHREZXNjcmlwdGlvbiBjbGFzcyBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIFRpbWVkVGV4dFVuaXRUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L1RpbWVkVGV4dFVuaXRUZXN0L1RpbWVkVGV4dFVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvVGltZWRUZXh0VW5pdFRlc3QvVGltZWRUZXh0VW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC56aXApLgorRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIFRpbWVkVGV4dFVuaXRUZXN0UmVzLy4gL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBUaW1lZFRleHRVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3RSZXMvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IFRpbWVkVGV4dFVuaXRUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjI4MGMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19USU1FRFRFWFRfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19USU1FRFRFWFRfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgVGltZWRUZXh0VGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgVGltZWRUZXh0VGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX1RJTUVEVEVYVF9URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWFlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC5jcHAKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlRpbWVkVGV4dFVuaXRUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKworI2luY2x1ZGUgInRpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgiCisKKyNpbmNsdWRlICJUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQuaCIKKworY29uc3RleHByIGludDMyX3Qga1N0YXJ0VGltZU1zID0gMTAwMDA7CisKK2VudW0geworICAgIC8vIFRoZXNlIGtleXMgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlIGtleXMgaW4KKyAgICAvLyBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgKKyAgICBLRVlfRElTUExBWV9GTEFHUyA9IDEsCisgICAgS0VZX1NUWUxFX0ZMQUdTID0gMiwKKyAgICBLRVlfQkFDS0dST1VORF9DT0xPUl9SR0JBID0gMywKKyAgICBLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEgPSA0LAorICAgIEtFWV9TQ1JPTExfREVMQVkgPSA1LAorICAgIEtFWV9XUkFQX1RFWFQgPSA2LAorICAgIEtFWV9TVEFSVF9USU1FID0gNywKKyAgICBLRVlfU1RSVUNUX0JMSU5LSU5HX1RFWFRfTElTVCA9IDgsCisgICAgS0VZX1NUUlVDVF9GT05UX0xJU1QgPSA5LAorICAgIEtFWV9TVFJVQ1RfSElHSExJR0hUX0xJU1QgPSAxMCwKKyAgICBLRVlfU1RSVUNUX0hZUEVSX1RFWFRfTElTVCA9IDExLAorICAgIEtFWV9TVFJVQ1RfS0FSQU9LRV9MSVNUID0gMTIsCisgICAgS0VZX1NUUlVDVF9TVFlMRV9MSVNUID0gMTMsCisgICAgS0VZX1NUUlVDVF9URVhUX1BPUyA9IDE0LAorICAgIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTiA9IDE1LAorICAgIEtFWV9TVFJVQ1RfVEVYVCA9IDE2LAorCisgICAgS0VZX0dMT0JBTF9TRVRUSU5HID0gMTAxLAorICAgIEtFWV9MT0NBTF9TRVRUSU5HID0gMTAyLAorICAgIEtFWV9TVEFSVF9DSEFSID0gMTAzLAorICAgIEtFWV9FTkRfQ0hBUiA9IDEwNCwKKyAgICBLRVlfRk9OVF9JRCA9IDEwNSwKKyAgICBLRVlfRk9OVF9TSVpFID0gMTA2LAorICAgIEtFWV9URVhUX0NPTE9SX1JHQkEgPSAxMDcsCit9OworCitzdHJ1Y3QgRm9udEluZm8geworICAgIGludDMyX3QgZGlzcGxheUZsYWcgPSAtMTsKKyAgICBpbnQzMl90IGhvcml6b250YWxKdXN0aWZpY2F0aW9uID0gLTE7CisgICAgaW50MzJfdCB2ZXJ0aWNhbEp1c3RpZmljYXRpb24gPSAtMTsKKyAgICBpbnQzMl90IHJnYmFCYWNrZ3JvdW5kID0gLTE7CisgICAgaW50MzJfdCBsZWZ0UG9zID0gLTE7CisgICAgaW50MzJfdCB0b3BQb3MgPSAtMTsKKyAgICBpbnQzMl90IGJvdHRvbVBvcyA9IC0xOworICAgIGludDMyX3QgcmlnaHRQb3MgPSAtMTsKKyAgICBpbnQzMl90IHN0YXJ0Y2hhciA9IC0xOworICAgIGludDMyX3QgZW5kQ2hhciA9IC0xOworICAgIGludDMyX3QgZm9udElkID0gLTE7CisgICAgaW50MzJfdCBmYWNlU3R5bGUgPSAtMTsKKyAgICBpbnQzMl90IGZvbnRTaXplID0gLTE7CisgICAgaW50MzJfdCByZ2JhVGV4dCA9IC0xOworICAgIGludDMyX3QgZW50cnlDb3VudCA9IC0xOworfTsKKworc3RydWN0IEZvbnRSZWNvcmQgeworICAgIGludDMyX3QgZm9udElEID0gLTE7CisgICAgaW50MzJfdCBmb250TmFtZUxlbmd0aCA9IC0xOworICAgIGNvbnN0IHVpbnQ4X3QgKmZvbnQgPSBudWxscHRyOworfTsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBUaW1lZFRleHRVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08LypmaWxlbmFtZSovIHN0cmluZz4geworICBwdWJsaWM6CisgICAgVGltZWRUZXh0VW5pdFRlc3QoKXt9OworCisgICAgflRpbWVkVGV4dFVuaXRUZXN0KCkgeworICAgICAgICBpZiAobUVsZVN0cmVhbSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCk7CisgICAgICAgIG1FbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgR2V0UGFyYW0oKTsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXQobUlucHV0RmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZTogIiA8PCBHZXRQYXJhbSgpOworICAgICAgICBtRmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICAgICAgQUxPR0koIlNpemUgb2YgdGhlIGlucHV0IGZpbGUgJXMgPSAlenUiLCBHZXRQYXJhbSgpLmNfc3RyKCksIG1GaWxlU2l6ZSk7CisgICAgfQorCisgICAgc3RyaW5nIG1JbnB1dEZpbGVOYW1lOworICAgIHNpemVfdCBtRmlsZVNpemU7CisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKK307CisKK2NsYXNzIFNSVERlc2NyaXB0aW9uVGVzdCA6IHB1YmxpYyBUaW1lZFRleHRVbml0VGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IFRpbWVkVGV4dFVuaXRUZXN0OjpTZXRVcCgpOyB9Cit9OworCitjbGFzcyBUZXh0M0dQUERlc2NyaXB0aW9uVGVzdCA6IHB1YmxpYyBUaW1lZFRleHRVbml0VGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IFRpbWVkVGV4dFVuaXRUZXN0OjpTZXRVcCgpOyB9Cit9OworCitURVNUX1AoU1JURGVzY3JpcHRpb25UZXN0LCBleHRyYWN0U1JURGVzY3JpcHRpb25UZXN0KSB7CisgICAgY2hhciBkYXRhW21GaWxlU2l6ZV07CisgICAgbUVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIG1GaWxlU2l6ZSk7CisKKyAgICBQYXJjZWwgcGFyY2VsOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6Ok9VVF9PRl9CQU5EX1RFWFRfU1JUIHwgVGV4dERlc2NyaXB0aW9uczo6TE9DQUxfREVTQ1JJUFRJT05TOworICAgIHN0YXR1c190IHN0YXR1cyA9IFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKChjb25zdCB1aW50OF90ICopZGF0YSwgbUZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcsIGtTdGFydFRpbWVNcywgJnBhcmNlbCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImdldFBhcmNlbE9mRGVzY3JpcHRpb25zIHJldHVybmVkIGVycm9yIjsKKyAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgUGFyY2VsOiAlenUiLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgQVNTRVJUX0dUKHBhcmNlbC5kYXRhU2l6ZSgpLCAwKSA8PCAiUGFyY2VsIGlzIGVtcHR5IjsKKworICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgaW50MzJfdCBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0xPQ0FMX1NFVFRJTkcpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQga2V5IjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RBUlRfVElNRSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBzdGFydCB0aW1lIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwga1N0YXJ0VGltZU1zKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHRpbWluZ3MiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9TVFJVQ1RfVEVYVCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBzdHJ1Y3QgdGV4dCBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIG1GaWxlU2l6ZSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB0ZXh0IGRhdGEiOworICAgIGludDMyX3QgZmlsZVNpemUgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGZpbGVTaXplLCBtRmlsZVNpemUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgZmlsZSBzaXplIHZhbHVlIjsKKyAgICB1aW50OF90IHRtcERhdGFbZmlsZVNpemVdOworICAgIHN0YXR1cyA9IHBhcmNlbC5yZWFkKCh2b2lkICopdG1wRGF0YSwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gcmVhZCB0aGUgZGF0YSBmcm9tIHBhcmNlbCI7CisgICAgLy8gVG8gbWFrZSBzdXJlIGVuZCBvZiBwYXJjZWwgaXMgcmVhY2hlZAorICAgIEFTU0VSVF9FUShwYXJjZWwuZGF0YUF2YWlsKCksIDApIDw8ICJQYXJjZWwgaGFzIHNvbWUgZGF0YSBsZWZ0IHRvIHJlYWQiOworfQorCisvLyBUaGlzIHRlc3QgdXNlcyB0aGUgcHJvcGVydGllcyBvZiB0eDNnIGJveCBtZW50aW9uZWQgaW4gM0dQUCBUaW1lZCBUZXh0IEZvcm1hdAorLy8gU3BlY2lmaWNhdGlvbiM6IDI2LjI0NSAvIFNlY3Rpb246IDUuMTYoU2FtcGxlIERlc2NyaXB0aW9uIEZvcm1hdCkKKy8vIGh0dHBzOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzI2X3Nlcmllcy8yNi4yNDUvCisKK1RFU1RfUChUZXh0M0dQUERlc2NyaXB0aW9uVGVzdCwgVGV4dDNHUFBHbG9iYWxEZXNjcmlwdGlvblRlc3QpIHsKKyAgICBjaGFyIGRhdGFbbUZpbGVTaXplXTsKKyAgICBtRWxlU3RyZWFtLnJlYWQoZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5nY291bnQoKSwgbUZpbGVTaXplKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnRtcERhdGEgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgaW50MzJfdCByZW1haW5pbmcgPSBtRmlsZVNpemU7CisgICAgRm9udEluZm8gZm9udEluZm87CisgICAgdmVjdG9yPEZvbnRSZWNvcmQ+IGZvbnRSZWNvcmRFbnRyaWVzOworCisgICAgLy8gU2tpcHBpbmcgdGhlIGJ5dGVzIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2Ygc3ViYm94KHR4M2cpCisgICAgdG1wRGF0YSArPSAxNjsKKyAgICByZW1haW5pbmcgLT0gMTY7CisKKyAgICBmb250SW5mby5kaXNwbGF5RmxhZyA9IFUzMl9BVCh0bXBEYXRhKTsKKyAgICBBTE9HSSgiRGlzcGxheSBmbGFnOiAlZCIsIGZvbnRJbmZvLmRpc3BsYXlGbGFnKTsKKyAgICBmb250SW5mby5ob3Jpem9udGFsSnVzdGlmaWNhdGlvbiA9IHRtcERhdGFbNF07CisgICAgQUxPR0koIkhvcml6b250YWwgSnVzdGlmaWNhdGlvbjogJWQiLCBmb250SW5mby5ob3Jpem9udGFsSnVzdGlmaWNhdGlvbik7CisgICAgZm9udEluZm8udmVydGljYWxKdXN0aWZpY2F0aW9uID0gdG1wRGF0YVs1XTsKKyAgICBBTE9HSSgiVmVydGljYWwgSnVzdGlmaWNhdGlvbjogJWQiLCBmb250SW5mby52ZXJ0aWNhbEp1c3RpZmljYXRpb24pOworICAgIGZvbnRJbmZvLnJnYmFCYWNrZ3JvdW5kID0KKyAgICAgICAgICAgICoodG1wRGF0YSArIDYpIDw8IDI0IHwgKih0bXBEYXRhICsgNykgPDwgMTYgfCAqKHRtcERhdGEgKyA4KSA8PCA4IHwgKih0bXBEYXRhICsgOSk7CisgICAgQUxPR0koInJnYmEgdmFsdWUgb2YgYmFja2dyb3VuZDogJWQiLCBmb250SW5mby5yZ2JhQmFja2dyb3VuZCk7CisKKyAgICB0bXBEYXRhICs9IDEwOworICAgIHJlbWFpbmluZyAtPSAxMDsKKworICAgIGlmIChyZW1haW5pbmcgPj0gOCkgeworICAgICAgICBmb250SW5mby5sZWZ0UG9zID0gVTE2X0FUKHRtcERhdGEpOworICAgICAgICBBTE9HSSgiTGVmdDogJWQiLCBmb250SW5mby5sZWZ0UG9zKTsKKyAgICAgICAgZm9udEluZm8udG9wUG9zID0gVTE2X0FUKHRtcERhdGEgKyAyKTsKKyAgICAgICAgQUxPR0koIlRvcDogJWQiLCBmb250SW5mby50b3BQb3MpOworICAgICAgICBmb250SW5mby5ib3R0b21Qb3MgPSBVMTZfQVQodG1wRGF0YSArIDQpOworICAgICAgICBBTE9HSSgiQm90dG9tOiAlZCIsIGZvbnRJbmZvLmJvdHRvbVBvcyk7CisgICAgICAgIGZvbnRJbmZvLnJpZ2h0UG9zID0gVTE2X0FUKHRtcERhdGEgKyA2KTsKKyAgICAgICAgQUxPR0koIlJpZ2h0OiAlZCIsIGZvbnRJbmZvLnJpZ2h0UG9zKTsKKworICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgIHJlbWFpbmluZyAtPSA4OworCisgICAgICAgIGlmIChyZW1haW5pbmcgPj0gMTIpIHsKKyAgICAgICAgICAgIGZvbnRJbmZvLnN0YXJ0Y2hhciA9IFUxNl9BVCh0bXBEYXRhKTsKKyAgICAgICAgICAgIEFMT0dJKCJTdGFydCBjaGFyYWN0ZXI6ICVkIiwgZm9udEluZm8uc3RhcnRjaGFyKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmVuZENoYXIgPSBVMTZfQVQodG1wRGF0YSArIDIpOworICAgICAgICAgICAgQUxPR0koIkVuZCBjaGFyYWN0ZXI6ICVkIiwgZm9udEluZm8uZW5kQ2hhcik7CisgICAgICAgICAgICBmb250SW5mby5mb250SWQgPSBVMTZfQVQodG1wRGF0YSArIDQpOworICAgICAgICAgICAgQUxPR0koIlZhbHVlIG9mIGZvbnQgSWRlbnRpZmllcjogJWQiLCBmb250SW5mby5mb250SWQpOworICAgICAgICAgICAgZm9udEluZm8uZmFjZVN0eWxlID0gKih0bXBEYXRhICsgNik7CisgICAgICAgICAgICBBTE9HSSgiRmFjZSBzdHlsZSBmbGFnIDogJWQiLCBmb250SW5mby5mYWNlU3R5bGUpOworICAgICAgICAgICAgZm9udEluZm8uZm9udFNpemUgPSAqKHRtcERhdGEgKyA3KTsKKyAgICAgICAgICAgIEFMT0dJKCJTaXplIG9mIHRoZSBmb250OiAlZCIsIGZvbnRJbmZvLmZvbnRTaXplKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLnJnYmFUZXh0ID0gKih0bXBEYXRhICsgOCkgPDwgMjQgfCAqKHRtcERhdGEgKyA5KSA8PCAxNiB8ICoodG1wRGF0YSArIDEwKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0bXBEYXRhICsgMTEpOworICAgICAgICAgICAgQUxPR0koInJnYmEgdmFsdWUgb2YgdGhlIHRleHQ6ICVkIiwgZm9udEluZm8ucmdiYVRleHQpOworCisgICAgICAgICAgICB0bXBEYXRhICs9IDEyOworICAgICAgICAgICAgcmVtYWluaW5nIC09IDEyOworCisgICAgICAgICAgICBpZiAocmVtYWluaW5nID49IDEwKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcHBpbmcgdGhlIGJ5dGVzIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2Ygc3ViYm94KGZ0YWIpCisgICAgICAgICAgICAgICAgZm9udEluZm8uZW50cnlDb3VudCA9IFUxNl9BVCh0bXBEYXRhICsgOCk7CisgICAgICAgICAgICAgICAgQUxPR0koIlZhbHVlIG9mIGVudHJ5IGNvdW50OiAlZCIsIGZvbnRJbmZvLmVudHJ5Q291bnQpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSAxMDsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gMTA7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBmb250SW5mby5lbnRyeUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRlbXBGb250SUQgPSBVMTZfQVQodG1wRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJGb250IElkOiAlZCIsIHRlbXBGb250SUQpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRlbXBGb250TmFtZUxlbmd0aCA9ICoodG1wRGF0YSArIDIpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiTGVuZ3RoIG9mIGZvbnQgbmFtZTogJWQiLCB0ZW1wRm9udE5hbWVMZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IHRlbXBGb250TmFtZUxlbmd0aCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRtcEZvbnQgPSB0bXBEYXRhOworICAgICAgICAgICAgICAgICAgICBjaGFyICp0bXBGb250TmFtZSA9IHN0cm5kdXAoKGNvbnN0IGNoYXIgKil0bXBGb250LCB0ZW1wRm9udE5hbWVMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTkUodG1wRm9udE5hbWUsIG51bGxwdHIpIDw8ICJGb250IE5hbWUgaXMgbnVsbCI7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJGb250TmFtZSA9ICVzIiwgdG1wRm9udE5hbWUpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHRtcEZvbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wRGF0YSArPSB0ZW1wRm9udE5hbWVMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSB0ZW1wRm9udE5hbWVMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGZvbnRSZWNvcmRFbnRyaWVzLnB1c2hfYmFjayh7dGVtcEZvbnRJRCwgdGVtcEZvbnROYW1lTGVuZ3RoLCB0bXBGb250fSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpJTl9CQU5EX1RFWFRfM0dQUCB8IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBtRmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZywga1N0YXJ0VGltZU1zLCAmcGFyY2VsKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiZ2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMgcmV0dXJuZWQgZXJyb3IiOworICAgIEFMT0dJKCJTaXplIG9mIHRoZSBQYXJjZWw6ICV6dSIsIHBhcmNlbC5kYXRhU2l6ZSgpKTsKKyAgICBBU1NFUlRfR1QocGFyY2VsLmRhdGFTaXplKCksIDApIDw8ICJQYXJjZWwgaXMgZW1wdHkiOworCisgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBpbnQzMl90IGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfR0xPQkFMX1NFVFRJTkcpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQga2V5IjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRElTUExBWV9GTEFHUykgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBESVNQTEFZIEZMQUdTIEtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZGlzcGxheUZsYWcpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGRpc3BsYXkgZmxhZyI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9KVVNUSUZJQ0FUSU9OKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBKVVNUSUZJQ0FUSU9OIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24pCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIEhvcml6b250YWwganVzdGlmaWNhdGlvbiI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8udmVydGljYWxKdXN0aWZpY2F0aW9uKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBWZXJ0aWNhbCBqdXN0aWZpY2F0aW9uIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfQkFDS0dST1VORF9DT0xPUl9SR0JBKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEJBQ0tHUk9VTkQgQ09MT1Iga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5yZ2JhQmFja2dyb3VuZCkKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgcmdiYSBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIjsKKworICAgIGlmIChwYXJjZWwuZGF0YUF2YWlsKCkgPT0gMCkgeworICAgICAgICBBTE9HVigiQ29tcGxldGVkIHJlYWRpbmcgdGhlIHBhcmNlbCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9TVFJVQ1RfVEVYVF9QT1MpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RSVUNUIFRFWFQgUE9TSVRJT04ga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5sZWZ0UG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnRvcFBvcykKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgcmdiYSBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5ib3R0b21Qb3MpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ucmlnaHRQb3MpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisKKyAgICBpZiAocGFyY2VsLmRhdGFBdmFpbCgpID09IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbXBsZXRlZCByZWFkaW5nIHRoZSBwYXJjZWwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1NUWUxFX0xJU1QpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RSVUNUIFNUWUxFIExJU1Qga2V5IjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RBUlRfQ0hBUikgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBTVEFSVCBDSEFSIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uc3RhcnRjaGFyKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBzdGFydCBjaGFyYWN0ZXIiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9FTkRfQ0hBUikgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBFTkQgQ0hBUiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmVuZENoYXIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZW5kIGNoYXJhY3RlciI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0ZPTlRfSUQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRk9OVCBJRCBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmZvbnRJZCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBmb250IElkIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RZTEVfRkxBR1MpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RZTEUgRkxBR1Mga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5mYWNlU3R5bGUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2Ygc3R5bGUgZmxhZ3MiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9GT05UX1NJWkUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRk9OVCBTSVpFIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZm9udFNpemUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBzaXplIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfVEVYVF9DT0xPUl9SR0JBKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFRFWFQgQ09MT1IgUkdCQSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnJnYmFUZXh0KSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgdGV4dCBjb2xvciB2YWx1ZSI7CisKKyAgICBpZiAocGFyY2VsLmRhdGFBdmFpbCgpID09IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbXBsZXRlZCByZWFkaW5nIHRoZSBwYXJjZWwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX0ZPTlRfTElTVCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBTVFJVQ1QgRk9OVCBMSVNUIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZW50cnlDb3VudCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBlbnRyeSBjb3VudCI7CisgICAgQVNTRVJUX0VRKGZvbnRJbmZvLmVudHJ5Q291bnQsIGZvbnRSZWNvcmRFbnRyaWVzLnNpemUoKSkKKyAgICAgICAgICAgIDw8ICJBcnJheSBzaXplIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIG51bWJlciBvZiBlbnRyaWVzIjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBmb250SW5mby5lbnRyeUNvdW50OyBpKyspIHsKKyAgICAgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udFJlY29yZEVudHJpZXNbaV0uZm9udElEKQorICAgICAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBJZCI7CisgICAgICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKQorICAgICAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBuYW1lIGxlbmd0aCI7CisgICAgICAgIHVpbnQ4X3QgZm9udE5hbWVbZm9udFJlY29yZEVudHJpZXNbaV0uZm9udE5hbWVMZW5ndGhdOworICAgICAgICAvLyB3cml0dGVuIHdpdGggd3JpdGVCeXRlQXJyYXkoKSB3cml0ZXMgY291bnQsIHRoZW4gdGhlIGFjdHVhbCBkYXRhCisgICAgICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgc3RhdHVzID0gcGFyY2VsLnJlYWQoKHZvaWQgKilmb250TmFtZSwgZm9udFJlY29yZEVudHJpZXNbaV0uZm9udE5hbWVMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIHJlYWQgdGhlIGZvbnQgbmFtZSBmcm9tIHBhcmNlbCI7CisgICAgICAgIEFTU0VSVF9FUShtZW1jbXAoZm9udE5hbWUsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnQsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgIDApCisgICAgICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBmb250IjsKKyAgICB9CisgICAgLy8gVG8gbWFrZSBzdXJlIGVuZCBvZiBwYXJjZWwgaXMgcmVhY2hlZAorICAgIEFTU0VSVF9FUShwYXJjZWwuZGF0YUF2YWlsKCksIDApIDw8ICJQYXJjZWwgaGFzIHNvbWUgZGF0YSBsZWZ0IHRvIHJlYWQiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoVGltZWRUZXh0VW5pdFRlc3RBbGwsIFNSVERlc2NyaXB0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoInNhbXBsZVRlc3QxLnNydCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgic2FtcGxlVGVzdDIuc3J0IikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFRpbWVkVGV4dFVuaXRUZXN0QWxsLCBUZXh0M0dQUERlc2NyaXB0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoInR4M2dCb3gxIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ0eDNnQm94MiIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgVGltZWRUZXh0VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCmluZGV4IGEyMzIxNTAuLjNiZTVlNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcApAQCAtMTUyNSw3ICsxNTI1LDcgQEAKICAgICAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhBdHRyaWJ1dGV7InJhbmsiLCByYW5rfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBub2RlTGlzdC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3JkZXIpLCBzdGQ6Om1vdmUobm9kZUluZm8pKSk7CisgICAgICAgICAgICAgICAgICAgIG9yZGVyLCBzdGQ6Om1vdmUobm9kZUluZm8pKSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk3Yzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlhNTFBhcnNlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiWE1MUGFyc2VyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGRhdGE6IFsiOnhtbHBhcnNlcnRlc3RfdGVzdF9maWxlcyIsXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAieG1scGFyc2VydGVzdF90ZXN0X2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbCIsCisgICAgICAgICJ0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMWIxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgeG1sIHBhcnNlciB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJYTUxQYXJzZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Im1lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sLT4vZGF0YS9sb2NhbC90bXAvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Im1lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iWE1MUGFyc2VyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL1hNTFBhcnNlclRlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IlhNTFBhcnNlclRlc3QiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzYzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwzMyBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIFhNTCBQYXJzZXIKK1RoZSBYTUxQYXJzZXIgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIFhNTFBhcnNlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIFhNTFBhcnNlclRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvWE1MUGFyc2VyVGVzdC9YTUxQYXJzZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvWE1MUGFyc2VyVGVzdC9YTUxQYXJzZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogWE1MUGFyc2VyVGVzdAorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL1hNTFBhcnNlclRlc3QKK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgWE1MUGFyc2VyVGVzdAorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZGQzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0LmNwcApAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiWE1MUGFyc2VyVGVzdCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSAiWE1MUGFyc2VyVGVzdEVudmlyb25tZW50LmgiCisKKyNkZWZpbmUgWE1MX0ZJTEVfTkFNRSAibWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3N0cnVjdCBDb2RlY1Byb3BlcnRpZXMgeworICAgIHN0cmluZyBjb2RlY05hbWU7CisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyBjb2RlY1Byb3A7Cit9OworCitzdHJ1Y3QgUm9sZVByb3BlcnRpZXMgeworICAgIHN0cmluZyByb2xlTmFtZTsKKyAgICBzdHJpbmcgdHlwZU5hbWU7CisgICAgc3RyaW5nIGNvZGVjTmFtZTsKKyAgICBib29sIGlzRW5jb2RlcjsKKyAgICBzaXplX3Qgb3JkZXI7CisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBhdHRyaWJ1dGVNYXA7Cit9OworCitjbGFzcyBYTUxQYXJzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIH5YTUxQYXJzZVRlc3QoKSB7CisgICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBtSW5wdXREYXRhVmVjdG9yLmNsZWFyKCk7CisgICAgICAgIG1JbnB1dFJvbGVWZWN0b3IuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldFVwRGF0YWJhc2UoKTsgfQorCisgICAgdm9pZCBzZXRVcERhdGFiYXNlKCk7CisKKyAgICB2b2lkIHNldENvZGVjUHJvcGVydGllcyhzdHJpbmcgY29kZWNOYW1lLCBib29sIGlzRW5jb2RlciwgaW50MzJfdCBvcmRlciwgc2V0PHN0cmluZz4gcXVpcmtTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHN0cmluZz4gZG9tYWluU2V0LCBzZXQ8c3RyaW5nPiB2YXJpYW50U2V0LCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBkb21haW4sIHZlY3RvcjxzdHJpbmc+IGFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJhbmspOworCisgICAgdm9pZCBzZXRSb2xlUHJvcGVydGllcyhzdHJpbmcgcm9sZU5hbWUsIGJvb2wgaXNFbmNvZGVyLCBpbnQzMl90IG9yZGVyLCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29kZWNOYW1lLCB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IGRvbWFpbik7CisKKyAgICB2b2lkIHNldFNlcnZpY2VBdHRyaWJ1dGUobWFwPHN0cmluZywgc3RyaW5nPiBzZXJ2aWNlQXR0cmlidXRlTmFtZVZhbHVlUGFpcik7CisKKyAgICB2b2lkIHByaW50Q29kZWNNYXAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjIG1jb2RlYyk7CisKKyAgICB2b2lkIGNoZWNrUm9sZU1hcChpbnQzMl90IGluZGV4LCBib29sIGlzRW5jb2Rlciwgc3RyaW5nIHR5cGVOYW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gYXR0ck1hcCk7CisKKyAgICBib29sIGNvbXBhcmVNYXAoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiAmbGhzLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+ICZyaHMpOworCisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBtUGFyc2VyOworICAgIHZlY3RvcjxDb2RlY1Byb3BlcnRpZXM+IG1JbnB1dERhdGFWZWN0b3I7CisgICAgdmVjdG9yPFJvbGVQcm9wZXJ0aWVzPiBtSW5wdXRSb2xlVmVjdG9yOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcDsKK307CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpzZXRVcERhdGFiYXNlKCkgeworICAgIC8vIFRoZSB2YWx1ZXMgc2V0IGJlbG93IGFyZSBzcGVjaWZpYyB0byB0ZXN0IHZlY3RvciB0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbAorICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDEuZGVjb2RlciIsIGZhbHNlLCAxLCB7ImF0dHJpYnV0ZTo6ZGlzYWJsZWQiLCAicXVpcms6OnF1aXJrMSJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7InRlbGVwaG9ueSJ9LCB7fSwgImF1ZGlvL21wZWciLCB7fSwgeyJhbGlhczEuZGVjb2RlciJ9LCAiNCIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0Mi5kZWNvZGVyIiwgZmFsc2UsIDIsIHsicXVpcms6OnF1aXJrMSJ9LCB7fSwge30sICJhdWRpby8zZ3BwIiwge30sIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3QzLmRlY29kZXIiLCBmYWxzZSwgMywge30sIHt9LCB7fSwgImF1ZGlvL2Ftci13YiIsCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMSIsICJmZWF0dXJlMVZhbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUyIiwgIjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMyIsICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q0LmRlY29kZXIiLCBmYWxzZSwgNCwge30sIHt9LCB7fSwgImF1ZGlvL2ZsYWMiLAorICAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTEiLCAiZmVhdHVyZTFWYWwiKX0sIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q1LmRlY29kZXIiLCBmYWxzZSwgNSwgeyJhdHRyaWJ1dGU6OmF0dHJpYnV0ZVF1aXJrMSJ9LCB7fSwge30sCisgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9nNzExLW1sYXciLCB7fSwge30sICIiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDYuZGVjb2RlciIsIGZhbHNlLCA2LCB7fSwge30sIHsidmFyaWFudDEiLCAidmFyaWFudDIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL21wNGEtbGF0bSIsCisgICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDE6Ojp2YXJpYW50MUxpbWl0MS1yYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFudDFMaW1pdDFNaW4tdmFyaWFudDFMaW1pdDFNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50MTo6OnZhcmlhbnQxTGltaXQyLXJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYW50MUxpbWl0Mkxvdy12YXJpYW50MUxpbWl0MkhpZ2giKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50Mjo6OnZhcmlhbnQyTGltaXQxIiwgInZhcmlhbnQyTGltaXQxVmFsdWUiKX0sCisgICAgICAgICAgICAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoCisgICAgICAgICAgICAidGVzdDcuZGVjb2RlciIsIGZhbHNlLCA3LCB7fSwge30sIHt9LCAiYXVkaW8vdm9yYmlzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oIi1taW4tbGltaXQxIiwgImxpbWl0MU1pbiIpLAorICAgICAgICAgICAgICAgICAgICAvKnBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDEtaW4iLCAibGltaXQxSW4iKSwqLworICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQyLXJhbmdlIiwgImxpbWl0Mk1pbi1saW1pdDJNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0Mi1zY2FsZSIsICJsaW1pdDJTY2FsZSIpLAorICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLWRlZmF1bHQiLCAibGltaXQzVmFsMyIpLAorICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLXJhbmdlcyIsICJsaW1pdDNWYWwxLGxpbWl0M1ZhbDIsbGltaXQzVmFsMyIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q4LmVuY29kZXIiLCB0cnVlLCA4LCB7fSwge30sIHt9LCAiYXVkaW8vb3B1cyIsCisgICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigibWF4LWxpbWl0MSIsICJsaW1pdDFNYXgiKX0sIHt9LCAiIik7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5tcDMiLCBmYWxzZSwgMSwgImF1ZGlvL21wZWciLCAidGVzdDEuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJhdHRyaWJ1dGU6OmRpc2FibGVkIiwgInByZXNlbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInJhbmsiLCAiNCIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5hbXJuYiIsIGZhbHNlLCAyLCAiYXVkaW8vM2dwcCIsICJ0ZXN0Mi5kZWNvZGVyIiwge30pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2RlY29kZXIuYW1yd2IiLCBmYWxzZSwgMywgImF1ZGlvL2Ftci13YiIsICJ0ZXN0My5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTEiLCAiZmVhdHVyZTFWYWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTIiLCAiMCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMyIsICIwIil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpby9mbGFjIiwgZmFsc2UsIDQsICJhdWRpby9mbGFjIiwgInRlc3Q0LmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMSIsICJmZWF0dXJlMVZhbCIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsIGZhbHNlLCA1LCAiYXVkaW8vZzcxMS1tbGF3IiwgInRlc3Q1LmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiYXR0cmlidXRlOjphdHRyaWJ1dGVRdWlyazEiLCAicHJlc2VudCIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5hYWMiLCBmYWxzZSwgNiwgImF1ZGlvL21wNGEtbGF0bSIsICJ0ZXN0Ni5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQxOjo6dmFyaWFudDFMaW1pdDEtcmFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFudDFMaW1pdDFNaW4tdmFyaWFudDFMaW1pdDFNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQxOjo6dmFyaWFudDFMaW1pdDItcmFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFudDFMaW1pdDJMb3ctdmFyaWFudDFMaW1pdDJIaWdoIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50Mjo6OnZhcmlhbnQyTGltaXQxIiwgInZhcmlhbnQyTGltaXQxVmFsdWUiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgZmFsc2UsIDcsICJhdWRpby92b3JiaXMiLCAidGVzdDcuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCItbWluLWxpbWl0MSIsICJsaW1pdDFNaW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgLypwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQxLWluIiwgImxpbWl0MUluIiksKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0Mi1yYW5nZSIsICJsaW1pdDJNaW4tbGltaXQyTWF4IiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDItc2NhbGUiLCAibGltaXQyU2NhbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0My1kZWZhdWx0IiwgImxpbWl0M1ZhbDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0My1yYW5nZXMiLCAibGltaXQzVmFsMSxsaW1pdDNWYWwyLGxpbWl0M1ZhbDMiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2VuY29kZXIub3B1cyIsIHRydWUsIDgsICJhdWRpby9vcHVzIiwgInRlc3Q4LmVuY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigibWF4LWxpbWl0MSIsICJsaW1pdDFNYXgiKX0pOworCisgICAgc2V0U2VydmljZUF0dHJpYnV0ZSgKKyAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiZG9tYWluLXRlbGVwaG9ueSIsICIwIiksIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJkb21haW4tdHYiLCAiMCIpLAorICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJzZXR0aW5nMiIsICIwIiksIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50LXZhcmlhbnQxIiwgIjAiKX0pOworfQorCitib29sIFhNTFBhcnNlVGVzdDo6Y29tcGFyZU1hcChjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+ICZsaHMsIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJnJocykgeworICAgIHJldHVybiBsaHMuc2l6ZSgpID09IHJocy5zaXplKCkgJiYgZXF1YWwobGhzLmJlZ2luKCksIGxocy5lbmQoKSwgcmhzLmJlZ2luKCkpOworfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6c2V0Q29kZWNQcm9wZXJ0aWVzKHN0cmluZyBjb2RlY05hbWUsIGJvb2wgaXNFbmNvZGVyLCBpbnQzMl90IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiBxdWlya1NldCwgc2V0PHN0cmluZz4gZG9tYWluU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiB2YXJpYW50U2V0LCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gZG9tYWluLCB2ZWN0b3I8c3RyaW5nPiBhbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmFuaykgeworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gQXR0cmlidXRlTWFwREI7CisgICAgZm9yIChjb25zdCBhdXRvICZBdHRyU3RyIDogZG9tYWluKSB7CisgICAgICAgIEF0dHJpYnV0ZU1hcERCLmluc2VydChBdHRyU3RyKTsKKyAgICB9CisgICAgbWFwPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4gVHlwZU1hcERhdGFCYXNlOworICAgIFR5cGVNYXBEYXRhQmFzZS5pbnNlcnQoCisgICAgICAgICAgICBwYWlyPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4odHlwZU5hbWUsIEF0dHJpYnV0ZU1hcERCKSk7CisgICAgQ29kZWNQcm9wZXJ0aWVzIGNvZGVjUHJvcGVydHk7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY05hbWUgPSBjb2RlY05hbWU7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLm9yZGVyID0gb3JkZXI7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AucXVpcmtTZXQgPSBxdWlya1NldDsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5kb21haW5TZXQgPSBkb21haW5TZXQ7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AudmFyaWFudFNldCA9IHZhcmlhbnRTZXQ7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AudHlwZU1hcCA9IFR5cGVNYXBEYXRhQmFzZTsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5hbGlhc2VzID0gYWxpYXNlczsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5yYW5rID0gcmFuazsKKyAgICBtSW5wdXREYXRhVmVjdG9yLnB1c2hfYmFjayhjb2RlY1Byb3BlcnR5KTsKK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OnNldFJvbGVQcm9wZXJ0aWVzKHN0cmluZyByb2xlTmFtZSwgYm9vbCBpc0VuY29kZXIsIGludDMyX3Qgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGVOYW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gYXR0cmlidXRlTmFtZVZhbHVlUGFpcikgeworICAgIHN0cnVjdCBSb2xlUHJvcGVydGllcyByb2xlUHJvcGVydHk7CisgICAgcm9sZVByb3BlcnR5LnJvbGVOYW1lID0gcm9sZU5hbWU7CisgICAgcm9sZVByb3BlcnR5LnR5cGVOYW1lID0gdHlwZU5hbWU7CisgICAgcm9sZVByb3BlcnR5LmNvZGVjTmFtZSA9IGNvZGVjTmFtZTsKKyAgICByb2xlUHJvcGVydHkuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIHJvbGVQcm9wZXJ0eS5vcmRlciA9IG9yZGVyOworICAgIHJvbGVQcm9wZXJ0eS5hdHRyaWJ1dGVNYXAgPSBhdHRyaWJ1dGVOYW1lVmFsdWVQYWlyOworICAgIG1JbnB1dFJvbGVWZWN0b3IucHVzaF9iYWNrKHJvbGVQcm9wZXJ0eSk7Cit9CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpzZXRTZXJ2aWNlQXR0cmlidXRlKG1hcDxzdHJpbmcsIHN0cmluZz4gc2VydmljZUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXIpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNlcnZpY2VBdHRyU3RyIDogc2VydmljZUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXIpIHsKKyAgICAgICAgbUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcC5pbnNlcnQoc2VydmljZUF0dHJTdHIpOworICAgIH0KK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OnByaW50Q29kZWNNYXAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjIG1jb2RlYykgeworICAgIGNvbnN0IHN0cmluZyAmbmFtZSA9IG1jb2RlYy5maXJzdDsKKyAgICBBTE9HVigiY29kZWMgbmFtZSA9ICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJnByb3BlcnRpZXMgPSBtY29kZWMuc2Vjb25kOworICAgIGJvb2wgaXNFbmNvZGVyID0gcHJvcGVydGllcy5pc0VuY29kZXI7CisgICAgQUxPR1YoImlzRW5jb2RlciA9ICVkXG4iLCBpc0VuY29kZXIpOworICAgIHNpemVfdCBvcmRlciA9IHByb3BlcnRpZXMub3JkZXI7CisgICAgQUxPR1YoIm9yZGVyID0gJXp1XG4iLCBvcmRlcik7CisgICAgc3RyaW5nIHJhbmsgPSBwcm9wZXJ0aWVzLnJhbms7CisgICAgQUxPR1YoInJhbmsgPSAlc1xuIiwgcmFuay5jX3N0cigpKTsKKworICAgIGZvciAoYXV0byAmaXRyUXVpcmtTZXQgOiBwcm9wZXJ0aWVzLnF1aXJrU2V0KSB7CisgICAgICAgIEFMT0dWKCJxdWlya1NldD0gJXMiLCBpdHJRdWlya1NldC5jX3N0cigpKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gJml0ckRvbWFpblNldCA6IHByb3BlcnRpZXMuZG9tYWluU2V0KSB7CisgICAgICAgIEFMT0dWKCJkb21haW5TZXQ9ICVzIiwgaXRyRG9tYWluU2V0LmNfc3RyKCkpOworICAgIH0KKworICAgIGZvciAoYXV0byAmaXRyVmFyaWFudFNldCA6IHByb3BlcnRpZXMudmFyaWFudFNldCkgeworICAgICAgICBBTE9HVigidmFyaWFudFNldD0gJXMiLCBpdHJWYXJpYW50U2V0LmNfc3RyKCkpOworICAgIH0KKworICAgIG1hcDxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+IFR5cGVNYXAgPSBwcm9wZXJ0aWVzLnR5cGVNYXA7CisgICAgQUxPR1YoIlRoZSBUeXBlTWFwIGlzIDoiKTsKKworICAgIGZvciAoYXV0byAmaXRyVHlwZU1hcCA6IFR5cGVNYXApIHsKKyAgICAgICAgQUxPR1YoIml0clR5cGVNYXAtPmZpcnN0XHQlc1x0IiwgaXRyVHlwZU1hcC5maXJzdC5jX3N0cigpKTsKKworICAgICAgICBmb3IgKGF1dG8gJml0ckF0dHJpYnV0ZU1hcCA6IGl0clR5cGVNYXAuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HVigiQXR0cmlidXRlTWFwLT5maXJzdCA9ICVzIiwgaXRyQXR0cmlidXRlTWFwLmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR1YoIkF0dHJpYnV0ZU1hcC0+c2Vjb25kID0gJXMiLCBpdHJBdHRyaWJ1dGVNYXAuc2Vjb25kLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6Y2hlY2tSb2xlTWFwKGludDMyX3QgaW5kZXgsIGJvb2wgaXNFbmNvZGVyLCBzdHJpbmcgdHlwZU5hbWUsIHN0cmluZyBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gQXR0cmlidXRlUGFpck1hcCkgeworICAgIEFTU0VSVF9FUShpc0VuY29kZXIsIG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLmlzRW5jb2RlcikKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIFJvbGVNYXAgZGF0YS4gSXNFbmNvZGVyIG1pc21hdGNoIjsKKyAgICBBU1NFUlRfRVEodHlwZU5hbWUsIG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLnR5cGVOYW1lKQorICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiB0eXBlTmFtZSBtaXNtYXRjaCI7CisgICAgQVNTRVJUX0VRKGNvZGVjTmFtZSwgbUlucHV0Um9sZVZlY3Rvci5hdChpbmRleCkuY29kZWNOYW1lKQorICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBjb2RlY05hbWUgbWlzbWF0Y2giOworCisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+Pjo6aXRlcmF0b3IgaXRyX2F0dHJpYnV0ZU1hcERCID0KKyAgICAgICAgICAgIChtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS5hdHRyaWJ1dGVNYXApLmJlZ2luKCk7CisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+Pjo6aXRlcmF0b3IgaXRyX2F0dHJpYnV0ZU1hcCA9IEF0dHJpYnV0ZVBhaXJNYXAuYmVnaW4oKTsKKyAgICBmb3IgKDsgaXRyX2F0dHJpYnV0ZU1hcCAhPSBBdHRyaWJ1dGVQYWlyTWFwLmVuZCgpICYmCisgICAgICAgICAgIGl0cl9hdHRyaWJ1dGVNYXBEQiAhPSBtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS5hdHRyaWJ1dGVNYXAuZW5kKCk7CisgICAgICAgICArK2l0cl9hdHRyaWJ1dGVNYXAsICsraXRyX2F0dHJpYnV0ZU1hcERCKSB7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVOYW1lID0gaXRyX2F0dHJpYnV0ZU1hcC0+Zmlyc3Q7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVOYW1lREIgPSBpdHJfYXR0cmlidXRlTWFwREItPmZpcnN0OworICAgICAgICBzdHJpbmcgYXR0cmlidXRldmFsdWUgPSBpdHJfYXR0cmlidXRlTWFwLT5zZWNvbmQ7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVWYWx1ZURCID0gaXRyX2F0dHJpYnV0ZU1hcERCLT5zZWNvbmQ7CisgICAgICAgIEFTU0VSVF9FUShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lREIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBBdHRyaWJ1dGUgbmFtZSBtaXNtYXRjaFx0IiA8PCBhdHRyaWJ1dGVOYW1lIDw8ICIgIT0gIgorICAgICAgICAgICAgICAgIDw8ICJhdHRyaWJ1dGVOYW1lREIiOworICAgICAgICBBU1NFUlRfRVEoYXR0cmlidXRldmFsdWUsIGF0dHJpYnV0ZVZhbHVlREIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBBdHRyaWJ1dGUgdmFsdWUgbWlzbWF0Y2hcdCIgPDwgYXR0cmlidXRldmFsdWUgPDwgIiAhPSAiCisgICAgICAgICAgICAgICAgPDwgImF0dHJpYnV0ZVZhbHVlREIiOworICAgIH0KK30KKworVEVTVF9GKFhNTFBhcnNlVGVzdCwgQ29kZWNNYXBQYXJzZVRlc3QpIHsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgWE1MX0ZJTEVfTkFNRTsKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5wdXRmaWxlICIgPDwgaW5wdXRGaWxlTmFtZTsKKworICAgIG1QYXJzZXIucGFyc2VYbWxQYXRoKGlucHV0RmlsZU5hbWUpOworICAgIGZvciAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjICZtY29kZWMgOiBtUGFyc2VyLmdldENvZGVjTWFwKCkpIHsKKyAgICAgICAgcHJpbnRDb2RlY01hcChtY29kZWMpOworICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzID0gbWNvZGVjLnNlY29uZDsKKyAgICAgICAgaW50MzJfdCBpbmRleCA9IHByb3BlcnRpZXMub3JkZXIgLSAxOworICAgICAgICBBU1NFUlRfR0UoaW5kZXgsIDApIDw8ICJJbnZhbGlkIG9yZGVyIjsKKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjTmFtZSwgbWNvZGVjLmZpcnN0LmNfc3RyKCkpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gY29kZWNOYW1lIG1pc21hdGNoIjsKKyAgICAgICAgQVNTRVJUX0VRKHByb3BlcnRpZXMuaXNFbmNvZGVyLCBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3AuaXNFbmNvZGVyKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIGlzRW5jb2RlciBtaXNtYXRjaCI7CisgICAgICAgIEFTU0VSVF9FUShwcm9wZXJ0aWVzLm9yZGVyLCBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3Aub3JkZXIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gb3JkZXIgbWlzbWF0Y2giOworCisgICAgICAgIHNldDxzdHJpbmc+IHF1aXJrU2V0REIgPSBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3AucXVpcmtTZXQ7CisgICAgICAgIHNldDxzdHJpbmc+IHF1aXJrU2V0ID0gcHJvcGVydGllcy5xdWlya1NldDsKKyAgICAgICAgc2V0PHN0cmluZz4gcXVpcmtEaWZmZXJlbmNlOworICAgICAgICBzZXRfZGlmZmVyZW5jZShxdWlya1NldERCLmJlZ2luKCksIHF1aXJrU2V0REIuZW5kKCksIHF1aXJrU2V0LmJlZ2luKCksIHF1aXJrU2V0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlcihxdWlya0RpZmZlcmVuY2UsIHF1aXJrRGlmZmVyZW5jZS5lbmQoKSkpOworICAgICAgICBBU1NFUlRfRVEocXVpcmtEaWZmZXJlbmNlLnNpemUoKSwgMCkgPDwgIkNvZGVjTWFwOnF1aXJrIG1pc21hdGNoIjsKKworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPiBUeXBlTWFwREIgPQorICAgICAgICAgICAgICAgIG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC50eXBlTWFwOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPiBUeXBlTWFwID0gcHJvcGVydGllcy50eXBlTWFwOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPjo6aXRlcmF0b3IgaXRyX1R5cGVNYXBEQiA9IFR5cGVNYXBEQi5iZWdpbigpOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPjo6aXRlcmF0b3IgaXRyX1R5cGVNYXAgPSBUeXBlTWFwLmJlZ2luKCk7CisKKyAgICAgICAgQVNTRVJUX0VRKFR5cGVNYXBEQi5zaXplKCksIFR5cGVNYXAuc2l6ZSgpKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIFR5cGVtYXAgc2l6ZSBtaXNtYXRjaCI7CisKKyAgICAgICAgZm9yICg7IGl0cl9UeXBlTWFwICE9IFR5cGVNYXAuZW5kKCkgJiYgaXRyX1R5cGVNYXBEQiAhPSBUeXBlTWFwREIuZW5kKCk7CisgICAgICAgICAgICAgKytpdHJfVHlwZU1hcCwgKytpdHJfVHlwZU1hcERCKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoaXRyX1R5cGVNYXAtPmZpcnN0LCBpdHJfVHlwZU1hcERCLT5maXJzdCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gdHlwZSBtaXNtYXRjaCI7CisgICAgICAgICAgICBib29sIGZsYWcgPSBjb21wYXJlTWFwKGl0cl9UeXBlTWFwLT5zZWNvbmQsIGl0cl9UeXBlTWFwREItPnNlY29uZCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmbGFnKSA8PCAidHlwZU1hcCBtaXNtYXRjaCI7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC5yYW5rLCBwcm9wZXJ0aWVzLnJhbmspCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gcmFuayBtaXNtYXRjaCI7CisgICAgfQorfQorCitURVNUX0YoWE1MUGFyc2VUZXN0LCBSb2xlTWFwUGFyc2VUZXN0KSB7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIFhNTF9GSUxFX05BTUU7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGlucHV0RmlsZU5hbWU7CisKKyAgICBtUGFyc2VyLnBhcnNlWG1sUGF0aChpbnB1dEZpbGVOYW1lKTsKKworICAgIGZvciAoYXV0byAmbVJvbGUgOiBtUGFyc2VyLmdldFJvbGVNYXAoKSkgeworICAgICAgICB0eXBlZGVmIHBhaXI8c3RyaW5nLCBzdHJpbmc+IEF0dHJpYnV0ZTsKKyAgICAgICAgY29uc3Qgc3RyaW5nICZyb2xlTmFtZSA9IG1Sb2xlLmZpcnN0OworICAgICAgICBBTE9HVigiUm9sZSBtYXA6bmFtZSA9ICVzXG4iLCByb2xlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OlJvbGVQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzID0gbVJvbGUuc2Vjb25kOworICAgICAgICBzdHJpbmcgdHlwZSA9IHByb3BlcnRpZXMudHlwZTsKKyAgICAgICAgQUxPR1YoIlJvbGUgbWFwOiB0eXBlID0gJXNcbiIsIHR5cGUuY19zdHIoKSk7CisKKyAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBwcm9wZXJ0aWVzLmlzRW5jb2RlcjsKKyAgICAgICAgQUxPR1YoIlJvbGUgbWFwOiBpc0VuY29kZXIgPSAlZFxuIiwgaXNFbmNvZGVyKTsKKworICAgICAgICBtdWx0aW1hcDxzaXplX3QsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbz4gbm9kZUxpc3QgPSBwcm9wZXJ0aWVzLm5vZGVMaXN0OworICAgICAgICBtdWx0aW1hcDxzaXplX3QsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbz46Oml0ZXJhdG9yIGl0cl9Ob2RlOworICAgICAgICBBTE9HVigiXG5UaGUgbXVsdGltYXAgbm9kZUxpc3QgaXMgOiBcbiIpOworICAgICAgICBmb3IgKGl0cl9Ob2RlID0gbm9kZUxpc3QuYmVnaW4oKTsgaXRyX05vZGUgIT0gbm9kZUxpc3QuZW5kKCk7ICsraXRyX05vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJpdHJfTm9kZS0+Zmlyc3Q9T1JERVI9XHQlenVcdCIsIGl0cl9Ob2RlLT5maXJzdCk7CisgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gaXRyX05vZGUtPmZpcnN0IC0gMTsKKyAgICAgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbyBub2RlUHRyID0gaXRyX05vZGUtPnNlY29uZDsKKyAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDppdHJfTm9kZS0+c2Vjb25kLm5hbWUgPSAlc1xuIiwgbm9kZVB0ci5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgdmVjdG9yPEF0dHJpYnV0ZT4gYXR0ckxpc3QgPSBub2RlUHRyLmF0dHJpYnV0ZUxpc3Q7CisgICAgICAgICAgICBmb3IgKGF1dG8gYXR0ck5hbWVWYWx1ZUxpc3QgPSBhdHRyTGlzdC5iZWdpbigpOyBhdHRyTmFtZVZhbHVlTGlzdCAhPSBhdHRyTGlzdC5lbmQoKTsKKyAgICAgICAgICAgICAgICAgKythdHRyTmFtZVZhbHVlTGlzdCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDpub2RlUHRyLmF0dHJpYnV0ZUxpc3QtPmZpcnN0ID0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVWYWx1ZUxpc3QtPmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDpub2RlUHRyLmF0dHJpYnV0ZUxpc3QtPnNlY29uZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lVmFsdWVMaXN0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja1JvbGVNYXAoaW5kZXgsIGlzRW5jb2RlciwgcHJvcGVydGllcy50eXBlLCBub2RlUHRyLm5hbWUuY19zdHIoKSwgYXR0ckxpc3QpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoWE1MUGFyc2VUZXN0LCBTZXJ2aWNlQXR0cmlidXRlTWFwUGFyc2VUZXN0KSB7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIFhNTF9GSUxFX05BTUU7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGlucHV0RmlsZU5hbWU7CisKKyAgICBtUGFyc2VyLnBhcnNlWG1sUGF0aChpbnB1dEZpbGVOYW1lKTsKKyAgICBjb25zdCBhdXRvIHNlcnZpY2VBdHRyaWJ1dGVNYXAgPSBtUGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZVBhaXIgOiBzZXJ2aWNlQXR0cmlidXRlTWFwKSB7CisgICAgICAgIEFMT0dWKCJzZXJ2aWNlQXR0cmlidXRlLmtleSA9ICVzIFx0IHNlcnZpY2VBdHRyaWJ1dGUudmFsdWUgPSAlcyIsCisgICAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXIuZmlyc3QuY19zdHIoKSwgYXR0cmlidXRlUGFpci5zZWNvbmQuY19zdHIoKSk7CisgICAgfQorICAgIGJvb2wgZmxhZyA9IGNvbXBhcmVNYXAobUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcCwgc2VydmljZUF0dHJpYnV0ZU1hcCk7CisgICAgQVNTRVJUX1RSVUUoZmxhZykgPDwgIlNlcnZpY2VNYXBQYXJzZVRlc3Q6IHR5cGVNYXAgbWlzbWF0Y2giOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR0QoIlhNTCBQYXJzZXIgVGVzdCBSZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvWE1MUGFyc2VyVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhMDllNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fWE1MX1BBUlNFUl9URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX1hNTF9QQVJTRVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX1hNTF9QQVJTRVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyOTlkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sCkBAIC0wLDAgKzEsODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFJFRkVSRU5DRSA6IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QgLS0+Cis8SW5jbHVkZWQ+CisgICAgPFNldHRpbmdzPgorICAgICAgICA8RG9tYWluIG5hbWU9InRlbGVwaG9ueSIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgICAgIDxEb21haW4gbmFtZT0idHYiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgICAgICA8VmFyaWFudCBuYW1lPSJ2YXJpYW50MSIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgICAgIDxTZXR0aW5nIG5hbWU9InNldHRpbmcxIiB2YWx1ZT0ic2V0dGluZ1ZhbHVlMSIgdXBkYXRlPSJ0cnVlIiAvPgorICAgICAgICA8U2V0dGluZyBuYW1lPSJzZXR0aW5nMiIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgPC9TZXR0aW5ncz4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIGVuYWJsZWQsIGRvbWFpbiwgcmFuayBhbmQgdXBkYXRlIHByb3BlcnRpZXMgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3QxLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wZWciIHVwZGF0ZT0iZmFsc2UiIGRvbWFpbj0idGVsZXBob255IiBlbmFibGVkPSJmYWxzZSIgcmFuaz0iNCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iYWxpYXMxLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8UXVpcmsgbmFtZT0icXVpcmsxIiB2YWx1ZT0icXVpcmsxVmFsdWUiLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIFF1aXJrIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0Mi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIiBlbmFibGVkPSJ0cnVlIiA+CisgICAgICAgICAgICA8UXVpcmsgbmFtZT0icXVpcmsxIiB2YWx1ZT0icXVpcmsxVmFsdWUiLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIEZlYXR1cmUgLS0+CisgICAgICAgIDwhLS0gZmVhdHVyZTIgdGFrZXMgdmFsdWUgMCAoZmVhdHVyZSB3aXRoIHNhbWUgbmFtZSB0YWtlcyBsb3dlciBmZWF0dXJlJ3MgdmFsdWUpIC0tPgorICAgICAgICA8IS0tIGZlYXR1cmUzIGdpdmVzIHZhbHVlIGFzIDAgc2luY2UgaXQncyBvcHRpb25hbCAtLT4KKyAgICAgICAgPCEtLSBvcHRpb25hbD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIGlzIG5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uLiAtLT4KKyAgICAgICAgPCEtLSBvcHRpb25hbD0iZmFsc2UiIHJlcXVpcmVkPSJmYWxzZSIgaXMgbm90IGEgdmFsaWQgY29tYmluYXRpb24uIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0My5kZWNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiID4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUxIiB2YWx1ZT0iZmVhdHVyZTFWYWwiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMiIgdmFsdWU9ImZlYXR1cmUyVmFsIi8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMiIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUzIiBvcHRpb25hbD0idHJ1ZSIgcmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgVHlwZSAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDQuZGVjb2RlciI+CisgICAgICAgICAgICA8VHlwZSBuYW1lPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMSIgdmFsdWU9ImZlYXR1cmUxVmFsIiAvPgorICAgICAgICAgICAgPC9UeXBlPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgQXR0cmlidXRlIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0NS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciID4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlUXVpcmsxIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgVmFyaWFudCAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDYuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIiB2YXJpYW50PSJ2YXJpYW50MSx2YXJpYW50MiIgPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0idmFyaWFudDEiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJ2YXJpYW50MUxpbWl0MSIgbWluPSJ2YXJpYW50MUxpbWl0MU1pbiIgbWF4PSJ2YXJpYW50MUxpbWl0MU1heCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0idmFyaWFudDFMaW1pdDIiIHJhbmdlPSJ2YXJpYW50MUxpbWl0Mkxvdy12YXJpYW50MUxpbWl0MkhpZ2giIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJ2YXJpYW50MiI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InZhcmlhbnQyTGltaXQxIiB2YWx1ZT0idmFyaWFudDJMaW1pdDFWYWx1ZSIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIExpbWl0IC0tPgorICAgICAgICA8IS0tICdpbicgaXMgcHJlc2VudCBpbiB4c2QgZmlsZSBidXQgbm90IGhhbmRsZWQgaW4gTWVkaWFDb2RlY3NYbWxQYXJzZXIgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyIgPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MSIgaW49ImxpbWl0MUluIiBtaW49ImxpbWl0MU1pbiIvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MiIgbWluPSJsaW1pdDJNaW4iIG1heD0ibGltaXQyTWF4IiBzY2FsZT0ibGltaXQyU2NhbGUiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ibGltaXQzIiByYW5nZXM9ImxpbWl0M1ZhbDEsbGltaXQzVmFsMixsaW1pdDNWYWwzIiBkZWZhdWx0PSJsaW1pdDNWYWwzIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q4LmVuY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MSIgbWF4PSJsaW1pdDFNYXgiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0VuY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODY0Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sCkBAIC0wLDAgKzEsNCBAQAorPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBJbmNsdWRlIC0tPgorPE1lZGlhQ29kZWNzPgorICAgIDxJbmNsdWRlIGhyZWY9Im1lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sIiAvPgorPC9NZWRpYUNvZGVjcz4KZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCmluZGV4IGFmY2E3YzQuLjhkNWM3N2YgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icApAQCAtMzQsOCArMzQsMTAgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIiLAogICAgIF0sCiAKLSAgICAvLyBiYWNrIHRvIDMyLWJpdCwgYi8xMjY1MDI2MTMKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIC8vIG1lZGlhc2VydmVyIGhhcyBvbmx5IGJlZW4gdmVyaWZpZWQgb24gMzItYml0LCBzZWUgYi8xMjY1MDI2MTMKKyAgICAvLyB1c2UgInByZWZlcjMyIiB0byAqb25seSogZW5hYmxlIDY0LWJpdCBidWlsZHMgb24gNjQtYml0LW9ubHkgbHVuY2gKKyAgICAvLyB0YXJnZXRzLCB3aGljaCBhbGxvd3MgdGhlbSB0byByZWFjaCAnYm9vdF9jb21wbGV0ZScuCisgICAgY29tcGlsZV9tdWx0aWxpYjogInByZWZlcjMyIiwKIAogICAgIGluaXRfcmM6IFsibWVkaWFzZXJ2ZXIucmMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAppbmRleCBiZDZhNmM2Li5jOGI0YTAzIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcApAQCAtMTE0LDExICsxMTQsMTEgQEAKIHZvaWQgTXRwRmZzSGFuZGxlOjphZHZpc2UoaW50IGZkKSB7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE5VTV9JT19CVUZTOyBpKyspIHsKICAgICAgICAgaWYgKHBvc2l4X21hZHZpc2UobUlvYnVmW2ldLmJ1ZnMuZGF0YSgpLCBNQVhfRklMRV9DSFVOS19TSVpFLAotICAgICAgICAgICAgICAgIFBPU0lYX01BRFZfU0VRVUVOVElBTCB8IFBPU0lYX01BRFZfV0lMTE5FRUQpIDwgMCkKKyAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKSAhPSAwKQogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtYWR2aXNlIjsKICAgICB9CiAgICAgaWYgKHBvc2l4X2ZhZHZpc2UoZmQsIDAsIDAsCi0gICAgICAgICAgICAgICAgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFIHwgUE9TSVhfRkFEVl9XSUxMTkVFRCkgPCAwKQorICAgICAgICAgICAgICAgIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSB8IFBPU0lYX0ZBRFZfV0lMTE5FRUQpICE9IDApCiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmFkdmlzZSI7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggNDM5ODliYi4uMzc1OThmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTQzLDcgKzQzLDEzIEBACiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICBdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXQorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTc5LDYgKzg1LDcgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImpuaV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhZHJtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAogICAgIF0sCkBAIC0xMDYsNiArMTEzLDggQEAKICAgICAgICAgImxpYm5hdGl2ZWhlbHBlciIsCiAgICAgXSwKIAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsiam5pX2hlYWRlcnMiXSwKKwogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtMTk1LDMgKzIwNCw0MSBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvIiwKICAgICBdLAogfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYm1lZGlhbmRrX2Zvcm1hdCIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAppbmRleCBhYjBjYjYzLi44NjgwNjQxIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTI2LDkgKzI2LDYgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KLQotI2luY2x1ZGUgPGpuaS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCmluZGV4IDhmYjZhODcuLjgwZDVkNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKQEAgLTExNCwxMiArMTE0LDEyIEBACiAgICAgICAgIGludDMyX3QgYWN0aW9uQ29kZSwKICAgICAgICAgY29uc3QgY2hhciAqZGV0YWlsKTsKIAotc3RydWN0IEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIHsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIHsKICAgICAgIEFNZWRpYUNvZGVjT25Bc3luY0lucHV0QXZhaWxhYmxlICBvbkFzeW5jSW5wdXRBdmFpbGFibGU7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNPdXRwdXRBdmFpbGFibGUgb25Bc3luY091dHB1dEF2YWlsYWJsZTsKICAgICAgIEFNZWRpYUNvZGVjT25Bc3luY0Zvcm1hdENoYW5nZWQgICBvbkFzeW5jRm9ybWF0Q2hhbmdlZDsKICAgICAgIEFNZWRpYUNvZGVjT25Bc3luY0Vycm9yICAgICAgICAgICBvbkFzeW5jRXJyb3I7Ci19OworfSBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjazsKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAppbmRleCAxNDMxOWM0Li5hMWNkOWUzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTM2LDYgKzM2LDcgQEAKICNpZm5kZWYgX05ES19NRURJQV9FWFRSQUNUT1JfSAogI2RlZmluZSBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICiAKKyNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCmluZGV4IDQ5ZDhiNGEuLjYzNzFkZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaApAQCAtMzYsOSArMzYsMjQgQEAKICNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfSAogI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9ICiAKKyNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpZm5kZWYgX19BTkRST0lEX18KKy8vIFZhbHVlIGNvcGllZCBmcm9tICdiaW9uaWMvbGliYy9pbmNsdWRlL2FuZHJvaWQvYXBpLWxldmVsLmgnIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgb24KKy8vIG5vbiBBbmRyb2lkIHN5c3RlbXMuIEl0IGlzIHNldCB0byAxMDAwMCB3aGljaCBpcyBzYW1lIGFzIF9fQU5EUk9JRF9BUElfRlVUVVJFX18gdmFsdWUuCisjaWZuZGVmIF9fQU5EUk9JRF9BUElfXworI2RlZmluZSBfX0FORFJPSURfQVBJX18gMTAwMDAKKyNlbmRpZgorCisvLyBWYWx1ZSBjb3BpZWQgZnJvbSAnYmlvbmljL2xpYmMvaW5jbHVkZS9hbmRyb2lkL3ZlcnNpb25pbmcuaCcgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbgorLy8gbm9uIEFuZHJvaWQgc3lzdGVtcworI2lmbmRlZiBfX0lOVFJPRFVDRURfSU4KKyNkZWZpbmUgX19JTlRST0RVQ0VEX0lOKGFwaV9sZXZlbCkKKyNlbmRpZgorI2VuZGlmCisKICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCiAKIF9fQkVHSU5fREVDTFMKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5qYXZhCmluZGV4IDQ4ZTE0MjIuLjQyMDI3MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmphdmEKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5Lk5hdGl2ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5TdGF0czsKIAoraW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC01Nyw0MCArNTgsODcgQEAKIHB1YmxpYyBjbGFzcyBFbmNvZGVyVGVzdCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29udGV4dCBtQ29udGV4dCA9CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1GaWxlRGlyUGF0aCA9IG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiLyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1JbnB1dEZpbGVQYXRoID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmlucHV0X2ZpbGVfcGF0aCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1PdXRwdXRGaWxlUGF0aCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5vdXRwdXRfZmlsZV9wYXRoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbVN0YXRzRmlsZSA9CiAgICAgICAgICAgICBtQ29udGV4dC5nZXRFeHRlcm5hbEZpbGVzRGlyKG51bGwpICsgIi9FbmNvZGVyLiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuY3N2IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVuY29kZXJUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBFUl9URVNUX1RJTUVPVVRfTVMgPSAxMjAwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gV1JJVEVfT1VUUFVUID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQRVJfVEVTVF9USU1FT1VUX01TID0gMTIwMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFID0gMjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9NSU5fQklUX1JBVEUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX1ZJREVPX0JJVF9SQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9NSU5fVklERU9fQklUX1JBVEUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFID0gMTI4MDAwIC8qIDEyOCBLYnBzICovOworICAgIHByaXZhdGUgc3RhdGljIGludCBtQ29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG1EZWNvZGVkRmlsZVFjaWY7CisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBtRGVjb2RlZEZpbGVGdWxsSGQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBtRGVjb2RlZEZpbGVBdWRpbzsKICAgICBwcml2YXRlIFN0cmluZyBtSW5wdXRGaWxlOworICAgIHByaXZhdGUgU3RyaW5nIG1NaW1lOworICAgIHByaXZhdGUgaW50IG1CaXRSYXRlOworICAgIHByaXZhdGUgaW50IG1JRnJhbWVJbnRlcnZhbDsKKyAgICBwcml2YXRlIGludCBtV2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgbUhlaWdodDsKKyAgICBwcml2YXRlIGludCBtUHJvZmlsZTsKKyAgICBwcml2YXRlIGludCBtTGV2ZWw7CisgICAgcHJpdmF0ZSBpbnQgbVNhbXBsZVJhdGU7CisgICAgcHJpdmF0ZSBpbnQgbU51bUNoYW5uZWw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9GVUxMSERfSU5QVVQgPSAiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX1FDSUZfSU5QVVQgPSAiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfQVVESU9fSU5QVVQgPSAiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c18zMHNlYy53ZWJtIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX0ZVTExIRF9VTlBBQ0tFRCA9ICJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS55dXYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfUUNJRl9VTlBBQ0tFRCA9ICJjcm93ZF8xNzZ4MTQ0XzI1ZnBzXzYwMDBrYnBzX21wZWc0Lnl1diI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9BVURJT19VTlBBQ0tFRCA9ICJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzMwc2VjLnJhdyI7CiAKICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCiAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBpbnB1dEZpbGVzKCkgewogICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXXsKICAgICAgICAgICAgICAgICAvLyBBdWRpbyBUZXN0Ci0gICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19hYWNfMzBzZWMubXA0In0sCi0gICAgICAgICAgICAgICAgeyJiYmJfODAwMGh6XzFjaF84a2Jwc19hbXJuYl8zMHNlYy4zZ3AifSwKLSAgICAgICAgICAgICAgICB7ImJiYl8xNjAwMGh6XzFjaF85a2Jwc19hbXJ3Yl8zMHNlYy4zZ3AifSwKLSAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF82MDBrYnBzX2ZsYWNfMzBzZWMubXA0In0sCi0gICAgICAgICAgICAgICAgeyJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzMwc2VjLndlYm0ifSwKKyAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXJzOiBGaWxlbmFtZSwgbWltZVR5cGUsIGJpdHJhdGUsIHdpZHRoLCBoZWlnaHQsIGlGcmFtZUludGVydmFsLAorICAgICAgICAgICAgICAgIC8vIHByb2ZpbGUsIGxldmVsLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICB7REVDT0RFX0FVRElPX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BQUMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NDEwMCwgMn0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fQU1SX05CLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgODAwMCwgMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fQU1SX1dCLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTYwMDAsIDF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0ZMQUMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NDEwMCwgMn0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fT1BVUywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQ4MDAwLCAyfSwKKwogICAgICAgICAgICAgICAgIC8vIFZpZGVvIFRlc3QKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzY3MDBrYnBzX2gyNjQudHMifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1rdiJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX3ZwOS53ZWJtIn0sCi0gICAgICAgICAgICAgICAgeyJjcm93ZF8xNzZ4MTQ0XzI1ZnBzXzYwMDBrYnBzX21wZWc0Lm1wNCJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19oMjYzLjNncCJ9fSk7CisgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyczogRmlsZW5hbWUsIG1pbWVUeXBlLCBiaXRyYXRlLCB3aWR0aCwgaGVpZ2h0LCBpRnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAvLyBwcm9maWxlLCBsZXZlbCwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAge0RFQ09ERV9GVUxMSERfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX1ZQOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX1ZJREVPX0JJVF9SQVRFLCAxOTIwLCAxMDgwLCAxLCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9GVUxMSERfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX1ZJREVPX0JJVF9SQVRFLCAxOTIwLCAxMDgwLCAxLCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9GVUxMSERfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSwgMTkyMCwgMTA4MCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfRlVMTEhEX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19WUDksCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSwgMTkyMCwgMTA4MCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfUUNJRl9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fTVBFRzQsIEVOQ09ERV9NSU5fVklERU9fQklUX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAxNzYsIDE0NCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfUUNJRl9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fSDI2MywgRU5DT0RFX01JTl9WSURFT19CSVRfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE3NiwgMTQ0LCAxLCAtMSwgLTEsIC0xLCAtMX19KTsKICAgICB9CiAKLSAgICBwdWJsaWMgRW5jb2RlclRlc3QoU3RyaW5nIGlucHV0RmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5tSW5wdXRGaWxlID0gaW5wdXRGaWxlTmFtZTsKKyAgICBwdWJsaWMgRW5jb2RlclRlc3QoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgbWltZSwgaW50IGJpdHJhdGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lSW50ZXJ2YWwsIGludCBwcm9maWxlLCBpbnQgbGV2ZWwsIGludCBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50KSB7CisgICAgICAgIHRoaXMubUlucHV0RmlsZSA9IGZpbGVuYW1lOworICAgICAgICB0aGlzLm1NaW1lID0gbWltZTsKKyAgICAgICAgdGhpcy5tQml0UmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIHRoaXMubUlGcmFtZUludGVydmFsID0gZnJhbWVJbnRlcnZhbDsKKyAgICAgICAgdGhpcy5tV2lkdGggPSB3aWR0aDsKKyAgICAgICAgdGhpcy5tSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB0aGlzLm1Qcm9maWxlID0gcHJvZmlsZTsKKyAgICAgICAgdGhpcy5tTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgdGhpcy5tU2FtcGxlUmF0ZSA9IHNhbXBsZXJhdGU7CisgICAgICAgIHRoaXMubU51bUNoYW5uZWwgPSBjaGFubmVsQ291bnQ7CiAgICAgfQogCiAgICAgQEJlZm9yZUNsYXNzCkBAIC0xMDEsMzMgKzE0OSwzNiBAQAogICAgICAgICBMb2cuZChUQUcsICJTYXZpbmcgQmVuY2htYXJrIHJlc3VsdHMgaW46ICIgKyBtU3RhdHNGaWxlKTsKICAgICB9CiAKLSAgICBAVGVzdCh0aW1lb3V0ID0gUEVSX1RFU1RfVElNRU9VVF9NUykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgc3RhdHVzOwotICAgICAgICBpbnQgZnJhbWVTaXplOwotICAgICAgICAvL1BhcmFtZXRlcnMgZm9yIHZpZGVvCi0gICAgICAgIGludCB3aWR0aCA9IDA7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBpbnQgcHJvZmlsZSA9IDA7Ci0gICAgICAgIGludCBsZXZlbCA9IDA7Ci0gICAgICAgIGludCBmcmFtZVJhdGUgPSAwOworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmVwYXJlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCi0gICAgICAgIC8vUGFyYW1ldGVycyBmb3IgYXVkaW8KLSAgICAgICAgaW50IGJpdFJhdGUgPSAwOwotICAgICAgICBpbnQgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgICAgIGludCBudW1DaGFubmVscyA9IDA7Ci0gICAgICAgIEZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUobUlucHV0RmlsZVBhdGggKyBtSW5wdXRGaWxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgIiArIG1JbnB1dEZpbGUgKyAiIGluIGRpcmVjdG9yeSAiICsgbUlucHV0RmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgaW5wdXRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgbURlY29kZWRGaWxlRnVsbEhkID0gbmV3IEZpbGUobUZpbGVEaXJQYXRoICsgREVDT0RFX0ZVTExIRF9VTlBBQ0tFRCk7CisgICAgICAgIGludCBzdGF0dXMgPSBkZWNvZGVGaWxlKG1JbnB1dEZpbGVQYXRoICsgREVDT0RFX0ZVTExIRF9JTlBVVCwgbURlY29kZWRGaWxlRnVsbEhkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZWNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMsIDAsIHN0YXR1cyk7CisKKyAgICAgICAgbURlY29kZWRGaWxlUWNpZiA9IG5ldyBGaWxlKG1GaWxlRGlyUGF0aCArIERFQ09ERV9RQ0lGX1VOUEFDS0VEKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlRmlsZShtSW5wdXRGaWxlUGF0aCArIERFQ09ERV9RQ0lGX0lOUFVULCBtRGVjb2RlZEZpbGVRY2lmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZWNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMsIDAsIHN0YXR1cyk7CisKKyAgICAgICAgbURlY29kZWRGaWxlQXVkaW8gPSBuZXcgRmlsZShtRmlsZURpclBhdGggKyBERUNPREVfQVVESU9fVU5QQUNLRUQpOworICAgICAgICBzdGF0dXMgPSBkZWNvZGVGaWxlKG1JbnB1dEZpbGVQYXRoICsgREVDT0RFX0FVRElPX0lOUFVULCBtRGVjb2RlZEZpbGVBdWRpbyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVjb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzLCAwLCBzdGF0dXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBkZWNvZGVGaWxlKFN0cmluZyBpbnB1dEZpbGVOYW1lLCBGaWxlIG91dHB1dERlY29kZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBzdGF0dXMgPSAtMTsKKyAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShpbnB1dEZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAiICsgaW5wdXRGaWxlTmFtZSwgaW5wdXRGaWxlLmV4aXN0cygpKTsKICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKTsKICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmlsZURlc2NyaXB0b3IgPSBmaWxlSW5wdXQuZ2V0RkQoKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBkZWNvZGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXREZWNvZGVGaWxlKTsKKwogICAgICAgICBFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IEV4dHJhY3RvcigpOwogICAgICAgICBpbnQgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci5zZXRVcEV4dHJhY3RvcihmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4dHJhY3Rpb24gZmFpbGVkLiBObyB0cmFja3MgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlLCAodHJhY2tDb3VudCA+IDApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0cmFjdGlvbiBmYWlsZWQuIE5vIHRyYWNrcyBmb3IgdGhlIGdpdmVuIGlucHV0IGZpbGUiLCAodHJhY2tDb3VudCA+IDApKTsKICAgICAgICAgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+IGlucHV0QnVmZmVyID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIEFycmF5TGlzdDxNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGZyYW1lSW5mbyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKGludCBjdXJyZW50VHJhY2sgPSAwOyBjdXJyZW50VHJhY2sgPCB0cmFja0NvdW50OyBjdXJyZW50VHJhY2srKykgewotICAgICAgICAgICAgaW50IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CiAgICAgICAgICAgICBleHRyYWN0b3Iuc2VsZWN0RXh0cmFjdG9yVHJhY2soY3VycmVudFRyYWNrKTsKICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4dHJhY3Rvci5nZXRGb3JtYXQoY3VycmVudFRyYWNrKTsKICAgICAgICAgICAgIC8vIEdldCBzYW1wbGVzIGZyb20gZXh0cmFjdG9yCkBAIC0xNDYsMTYzICsxOTcsMTM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5mby5wcmVzZW50YXRpb25UaW1lVXMgKyAiIHNpemUgPSAiICsgYnVmSW5mby5zaXplKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlIChzYW1wbGVTaXplID4gMCk7Ci0gICAgICAgICAgICBpbnQgdGlkID0gYW5kcm9pZC5vcy5Qcm9jZXNzLm15VGlkKCk7Ci0gICAgICAgICAgICBGaWxlIGRlY29kZWRGaWxlID0gbmV3IEZpbGUobUNvbnRleHQuZ2V0RmlsZXNEaXIoKSArICIvZGVjb2Rlcl8iICsgdGlkICsgIi5vdXQiKTsKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZGVjb2RlT3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVjb2RlZEZpbGUpOwogICAgICAgICAgICAgRGVjb2RlciBkZWNvZGVyID0gbmV3IERlY29kZXIoKTsKICAgICAgICAgICAgIGRlY29kZXIuc2V0dXBEZWNvZGVyKGRlY29kZU91dHB1dFN0cmVhbSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBkZWNvZGVyLmRlY29kZShpbnB1dEJ1ZmZlciwgZnJhbWVJbmZvLCBmYWxzZSwgZm9ybWF0LCAiIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlLCAwLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwogICAgICAgICAgICAgTWVkaWFGb3JtYXQgZGVjb2RlckZvcm1hdCA9IGRlY29kZXIuZ2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBpZiAoZGVjb2RlckZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFUKSkgeworICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCA9IGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFUKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlY29kZXIuZGVJbml0Q29kZWMoKTsKICAgICAgICAgICAgIGV4dHJhY3Rvci51bnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7CiAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5jbGVhcigpOwogICAgICAgICAgICAgZnJhbWVJbmZvLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAoZGVjb2RlT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZWNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1pbWUsIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gc3VpdGFibGUgY29kZWNzIGZvdW5kIGZvciBmaWxlOiAiICsgbUlucHV0RmlsZSArICIgdHJhY2sgOiAiICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrICsgIiBtaW1lOiAiICsgbWltZSwgKG1lZGlhQ29kZWNzLnNpemUoKSA+IDApKTsKLSAgICAgICAgICAgIEJvb2xlYW5bXSBlbmNvZGVNb2RlID0ge3RydWUsIGZhbHNlfTsKLSAgICAgICAgICAgIC8qIEVuY29kaW5nIHRoZSBkZWNvZGVyJ3Mgb3V0cHV0ICovCi0gICAgICAgICAgICBmb3IgKEJvb2xlYW4gYXN5bmNNb2RlIDogZW5jb2RlTW9kZSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvZGVjTmFtZSA6IG1lZGlhQ29kZWNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZW5jb2RlT3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFdSSVRFX09VVFBVVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRFbmNvZGVGaWxlID0gbmV3IEZpbGUobU91dHB1dEZpbGVQYXRoICsgImVuY29kZXIub3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0RW5jb2RlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGV4aXN0aW5nIGZpbGUiICsgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RW5jb2RlRmlsZS5kZWxldGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gY3JlYXRlIGZpbGUgdG8gd3JpdGUgZW5jb2RlciBvdXRwdXQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFbmNvZGVGaWxlLnRvU3RyaW5nKCksIG91dEVuY29kZUZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEVuY29kZUZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgcmF3RmlsZSA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiL2RlY29kZXJfIiArIHRpZCArICIub3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBvcGVuIGZpbGUgdG8gd3JpdGUgZGVjb2RlZCBvdXRwdXQiLCByYXdGaWxlLmV4aXN0cygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQYXRoIG9mIGRlY29kZWQgaW5wdXQgZmlsZTogIiArIHJhd0ZpbGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGVsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmF3RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9XSURUSCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSEVJR0hUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZVJhdGUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0UmF0ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuY29udGFpbnMoInZpZGVvLzNncHAiKSB8fCBtaW1lLmNvbnRhaW5zKCJ2aWRlby9tcDR2LWVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IEVOQ09ERV9NSU5fQklUX1JBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTEVWRUwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCA9IGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfU0FNUExFX1JBVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ0hBTk5FTF9DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLypTZXR1cCBFbmNvZGUgRm9ybWF0Ki8KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZW5jb2RlRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gd2lkdGggKiBoZWlnaHQgKiAzIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KG1pbWUsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIGJpdFJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUsIHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0xFVkVMLCBsZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSV9GUkFNRV9JTlRFUlZBTCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0lOUFVUX1NJWkUsIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFULCBjb2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVBdWRpb0Zvcm1hdChtaW1lLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIGJpdFJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gNDA5NjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBFbmNvZGVyIGVuY29kZXIgPSBuZXcgRW5jb2RlcigpOwotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnNldHVwRW5jb2RlcihlbmNvZGVPdXRwdXRTdHJlYW0sIGVsZVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVuY29kZXIuZW5jb2RlKGNvZGVjTmFtZSwgZW5jb2RlRm9ybWF0LCBtaW1lLCBmcmFtZVJhdGUsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBhc3luY01vZGUpOwotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLmRlSW5pdEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZW5jb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgIiArICJmaWxlOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiICsgbUlucHV0RmlsZSwgMCwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5kdW1wU3RhdGlzdGljcyhtSW5wdXRGaWxlLCBjb2RlY05hbWUsIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IuZ2V0Q2xpcER1cmF0aW9uKCksIG1TdGF0c0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJFbmNvZGluZyBjb21wbGV0ZSBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUgKyAiIHdpdGggY29kZWM6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZm9yIGFTeW5jTW9kZSA9ICIgKyBhc3luY01vZGUpOwotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnJlc2V0RW5jb2RlcigpOwotICAgICAgICAgICAgICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZU91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9DbGVhbnVwIHRlbXBvcmFyeSBpbnB1dCBmaWxlCi0gICAgICAgICAgICBpZiAoZGVjb2RlZEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBkZWNvZGVkIGZpbGUiICsgZGVjb2RlZEZpbGUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRGaWxlLmRlbGV0ZSgpKTsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBleHRyYWN0b3IuZGVpbml0RXh0cmFjdG9yKCk7CiAgICAgICAgIGZpbGVJbnB1dC5jbG9zZSgpOworICAgICAgICBkZWNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICBAVGVzdCh0aW1lb3V0ID0gUEVSX1RFU1RfVElNRU9VVF9NUykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlRW5jb2RlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKG1JbnB1dEZpbGVQYXRoICsgbUlucHV0RmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kICIgKyBtSW5wdXRGaWxlICsgIiBpbiBkaXJlY3RvcnkgIiArIG1JbnB1dEZpbGVQYXRoLAotICAgICAgICAgICAgICAgIGlucHV0RmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIGludCB0aWQgPSBhbmRyb2lkLm9zLlByb2Nlc3MubXlUaWQoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1EZWNvZGVkRmlsZSA9IG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiL2RlY29kZXJfIiArIHRpZCArICIub3V0IjsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKTsKLSAgICAgICAgRmlsZURlc2NyaXB0b3IgZmlsZURlc2NyaXB0b3IgPSBmaWxlSW5wdXQuZ2V0RkQoKTsKLSAgICAgICAgRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3IoKTsKLSAgICAgICAgaW50IHRyYWNrQ291bnQgPSBleHRyYWN0b3Iuc2V0VXBFeHRyYWN0b3IoZmlsZURlc2NyaXB0b3IpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHRyYWN0aW9uIGZhaWxlZC4gTm8gdHJhY2tzIGZvciBmaWxlOiAiLCB0cmFja0NvdW50ID4gMCk7Ci0gICAgICAgIGZvciAoaW50IGN1cnJlbnRUcmFjayA9IDA7IGN1cnJlbnRUcmFjayA8IHRyYWNrQ291bnQ7IGN1cnJlbnRUcmFjaysrKSB7Ci0gICAgICAgICAgICBleHRyYWN0b3Iuc2VsZWN0RXh0cmFjdG9yVHJhY2soY3VycmVudFRyYWNrKTsKLSAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4dHJhY3Rvci5nZXRGb3JtYXQoY3VycmVudFRyYWNrKTsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1pbWUsIHRydWUpOwotICAgICAgICAgICAgLy8gRW5jb2RpbmcgdGhlIGRlY29kZXIncyBvdXRwdXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBpbnQgZnJhbWVTaXplOworCisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1lZGlhQ29kZWNzID0gQ29kZWNVdGlscy5zZWxlY3RDb2RlY3MobU1pbWUsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBzdWl0YWJsZSBjb2RlY3MgZm91bmQgZm9yIG1pbWV0eXBlOiAiICsgbU1pbWUsIChtZWRpYUNvZGVjcy5zaXplKCkgPiAwKSk7CisgICAgICAgIEJvb2xlYW5bXSBlbmNvZGVNb2RlID0ge3RydWUsIGZhbHNlfTsKKyAgICAgICAgLy8gRW5jb2RpbmcgdGhlIGRlY29kZWQgaW5wdXQgZmlsZQorICAgICAgICBmb3IgKEJvb2xlYW4gYXN5bmNNb2RlIDogZW5jb2RlTW9kZSkgewogICAgICAgICAgICAgZm9yIChTdHJpbmcgY29kZWNOYW1lIDogbWVkaWFDb2RlY3MpIHsKLSAgICAgICAgICAgICAgICBOYXRpdmUgbmF0aXZlRW5jb2RlciA9IG5ldyBOYXRpdmUoKTsKLSAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gbmF0aXZlRW5jb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgLkVuY29kZShtSW5wdXRGaWxlUGF0aCwgbUlucHV0RmlsZSwgbURlY29kZWRGaWxlLCBtU3RhdHNGaWxlLCBjb2RlY05hbWUpOworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZW5jb2RlT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoV1JJVEVfT1VUUFVUKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgb3V0RW5jb2RlRmlsZSA9IG5ldyBGaWxlKG1PdXRwdXRGaWxlUGF0aCArICJlbmNvZGVyLm91dCIpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0RW5jb2RlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZXhpc3RpbmcgZmlsZSIgKyBvdXRFbmNvZGVGaWxlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEVuY29kZUZpbGUuZGVsZXRlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBjcmVhdGUgZmlsZSB0byB3cml0ZSBlbmNvZGVyIG91dHB1dDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLCBvdXRFbmNvZGVGaWxlLmNyZWF0ZU5ld0ZpbGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEVuY29kZUZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGaWxlIHJhd0ZpbGUgPSBuZXcgRmlsZShtRmlsZURpclBhdGggKyBtSW5wdXRGaWxlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3Qgb3BlbiBkZWNvZGVkIGlucHV0IGZpbGUiLCByYXdGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUGF0aCBvZiBkZWNvZGVkIGlucHV0IGZpbGU6ICIgKyByYXdGaWxlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZWxlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyYXdGaWxlKTsKKyAgICAgICAgICAgICAgICAvLyBTZXR1cCBFbmNvZGUgRm9ybWF0CisgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZW5jb2RlRm9ybWF0OworICAgICAgICAgICAgICAgIGlmIChtTWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KG1NaW1lLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSwgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JX0ZSQU1FX0lOVEVSVkFMLCBtSUZyYW1lSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIG1CaXRSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qcm9maWxlICE9IC0xICYmIG1MZXZlbCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUsIG1Qcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MRVZFTCwgbUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDQwOTY7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZUF1ZGlvRm9ybWF0KG1NaW1lLCBtU2FtcGxlUmF0ZSwgbU51bUNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIG1CaXRSYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRW5jb2RlciBlbmNvZGVyID0gbmV3IEVuY29kZXIoKTsKKyAgICAgICAgICAgICAgICBlbmNvZGVyLnNldHVwRW5jb2RlcihlbmNvZGVPdXRwdXRTdHJlYW0sIGVsZVN0cmVhbSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZW5jb2Rlci5lbmNvZGUoY29kZWNOYW1lLCBlbmNvZGVGb3JtYXQsIG1NaW1lLCBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIGZyYW1lU2l6ZSwgYXN5bmNNb2RlKTsKKyAgICAgICAgICAgICAgICBlbmNvZGVyLmRlSW5pdEVuY29kZXIoKTsKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05hbWUgKyAiIGVuY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yICIgKyAiZmlsZToiICsgIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RmlsZSwgMCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZW5jb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgIiArICJtaW1lOiIgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWltZSwgMCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRSZWZlcmVuY2U7CisgICAgICAgICAgICAgICAgbG9uZyBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGlmIChtTWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RmlsZSArICJfIiArIG1XaWR0aCArICJ4IiArIG1IZWlnaHQgKyAiXyIgKyBtQml0UmF0ZSArICJicHMiOworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0gKCgoZWxlU3RyZWFtLmdldENoYW5uZWwoKS5zaXplKCkgKyBmcmFtZVNpemUgLSAxKSAvIGZyYW1lU2l6ZSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEUpICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSA9IG1JbnB1dEZpbGUgKyAiXyIgKyBtU2FtcGxlUmF0ZSArICJoel8iICsgbU51bUNoYW5uZWwgKyAiY2hfIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJhdGUgKyAiYnBzIjsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZVN0cmVhbS5nZXRDaGFubmVsKCkuc2l6ZSgpIC8gKG1TYW1wbGVSYXRlICogbU51bUNoYW5uZWwpKSAqIDEwMDAwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuY29kZXIuZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGNvZGVjTmFtZSwgKGFzeW5jTW9kZSA/ICJhc3luYyIgOiAic3luYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcywgbVN0YXRzRmlsZSk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW5jb2RpbmcgY29tcGxldGUgZm9yIG1pbWU6ICIgKyBtTWltZSArICIgd2l0aCBjb2RlYzogIiArIGNvZGVjTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBhU3luY01vZGUgPSAiICsgYXN5bmNNb2RlKTsKKyAgICAgICAgICAgICAgICBlbmNvZGVyLnJlc2V0RW5jb2RlcigpOworICAgICAgICAgICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGlmIChlbmNvZGVPdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgRmlsZSBkZWNvZGVkRmlsZSA9IG5ldyBGaWxlKG1EZWNvZGVkRmlsZSk7Ci0gICAgICAgIC8vIENsZWFudXAgdGVtcG9yYXJ5IGlucHV0IGZpbGUKLSAgICAgICAgaWYgKGRlY29kZWRGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gZGVsZXRlIC0gIiArIG1EZWNvZGVkRmlsZSwgZGVjb2RlZEZpbGUuZGVsZXRlKCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgLSAiICsgbURlY29kZWRGaWxlKTsKKyAgICB9CisKKyAgICBAVGVzdCh0aW1lb3V0ID0gUEVSX1RFU1RfVElNRU9VVF9NUykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlRW5jb2RlcigpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbWVkaWFDb2RlY3MgPSBDb2RlY1V0aWxzLnNlbGVjdENvZGVjcyhtTWltZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIk5vIHN1aXRhYmxlIGNvZGVjcyBmb3VuZCBmb3IgbWltZXR5cGU6ICIgKyBtTWltZSwgKG1lZGlhQ29kZWNzLnNpemUoKSA+IDApKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY29kZWNOYW1lIDogbWVkaWFDb2RlY3MpIHsKKyAgICAgICAgICAgIE5hdGl2ZSBuYXRpdmVFbmNvZGVyID0gbmV3IE5hdGl2ZSgpOworICAgICAgICAgICAgaW50IHN0YXR1cyA9IG5hdGl2ZUVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgLkVuY29kZShtRmlsZURpclBhdGgsIG1JbnB1dEZpbGUsIG1TdGF0c0ZpbGUsIGNvZGVjTmFtZSwgbU1pbWUsIG1CaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCwgbUlGcmFtZUludGVydmFsLCBtV2lkdGgsIG1IZWlnaHQsIG1Qcm9maWxlLCBtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1OdW1DaGFubmVsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb2RlY05hbWUgKyAiIGVuY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yICIgKyAibWltZToiICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgbU1pbWUsIDAsIHN0YXR1cyk7CiAgICAgICAgIH0KLSAgICAgICAgZmlsZUlucHV0LmNsb3NlKCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGVjb2RlZEZpbGVzKCkgeworICAgICAgICBpZiAobURlY29kZWRGaWxlRnVsbEhkLmV4aXN0cygpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlRnVsbEhkLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkRmlsZUZ1bGxIZC5kZWxldGUoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlRnVsbEhkLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtRGVjb2RlZEZpbGVRY2lmLmV4aXN0cygpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlUWNpZi50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZEZpbGVRY2lmLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVRY2lmLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtRGVjb2RlZEZpbGVBdWRpby5leGlzdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZUF1ZGlvLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkRmlsZUF1ZGlvLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVBdWRpby50b1N0cmluZygpKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvTmF0aXZlRW5jb2Rlci5jcHAKaW5kZXggMTI3N2M4Yi4uMmY2NThlMyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvTmF0aXZlRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvTmF0aXZlRW5jb2Rlci5jcHAKQEAgLTMwLDE4OSArMzAsODEgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogCiBjb25zdGV4cHIgaW50MzJfdCBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFID0gMjU7Ci1jb25zdGV4cHIgaW50MzJfdCBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSA9IDEyODAwMCAvKiAxMjggS2JwcyAqLzsKLWNvbnN0ZXhwciBpbnQzMl90IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87Ci1jb25zdGV4cHIgaW50MzJfdCBFTkNPREVfTUlOX0JJVF9SQVRFID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOwogCiBleHRlcm4gIkMiIEpOSUVYUE9SVCBpbnQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX21lZGlhX2JlbmNobWFya19saWJyYXJ5X05hdGl2ZV9FbmNvZGUoCi0gICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgakZpbGVQYXRoLCBqc3RyaW5nIGpGaWxlTmFtZSwganN0cmluZyBqT3V0RmlsZVBhdGgsCi0gICAgICAgIGpzdHJpbmcgalN0YXRzRmlsZSwganN0cmluZyBqQ29kZWNOYW1lKSB7CisgICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgakZpbGVQYXRoLCBqc3RyaW5nIGpGaWxlTmFtZSwganN0cmluZyBqU3RhdHNGaWxlLAorICAgICAgICBqc3RyaW5nIGpDb2RlY05hbWUsIGpzdHJpbmcgak1pbWUsIGppbnQgakJpdFJhdGUsIGppbnQgakNvbG9yRm9ybWF0LCBqaW50IGpGcmFtZUludGVydmFsLAorICAgICAgICBqaW50IGpXaWR0aCwgamludCBqSGVpZ2h0LCBqaW50IGpQcm9maWxlLCBqaW50IGpMZXZlbCwgamludCBqU2FtcGxlUmF0ZSwKKyAgICAgICAgamludCBqTnVtQ2hhbm5lbHMpIHsKKyAgICBVTlVTRUQodGhpeik7CiAgICAgY29uc3QgY2hhciAqZmlsZVBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpGaWxlUGF0aCwgbnVsbHB0cik7CiAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgbnVsbHB0cik7Ci0gICAgc3RyaW5nIHNGaWxlUGF0aCA9IHN0cmluZyhmaWxlUGF0aCkgKyBzdHJpbmcoZmlsZU5hbWUpOwotICAgIFVOVVNFRCh0aGl6KTsKLSAgICBGSUxFICppbnB1dEZwID0gZm9wZW4oc0ZpbGVQYXRoLmNfc3RyKCksICJyYiIpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgZmlsZU5hbWUpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlUGF0aCwgZmlsZVBhdGgpOwotICAgIGlmICghaW5wdXRGcCkgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZyIpOworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBzdHJpbmcoZmlsZVBhdGgpICsgc3RyaW5nKGZpbGVOYW1lKTsKKyAgICBjb25zdCBjaGFyICpjb2RlY05hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpDb2RlY05hbWUsIG51bGxwdHIpOworICAgIHN0cmluZyBzQ29kZWNOYW1lID0gc3RyaW5nKGNvZGVjTmFtZSk7CisgICAgY29uc3QgY2hhciAqbWltZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoak1pbWUsIG51bGxwdHIpOworCisgICAgaWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZSwgaWZzdHJlYW06OmJpbmFyeSB8IGlmc3RyZWFtOjphdGUpOworICAgIGlmICghZWxlU3RyZWFtLmlzX29wZW4oKSkgeworICAgICAgICBBTE9HRSgiJXMgLSBGaWxlIGZhaWxlZCB0byBvcGVuIGZvciByZWFkaW5nISIsIGZpbGVOYW1lKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBmaWxlTmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBEZWNvZGVyICpkZWNvZGVyID0gbmV3IERlY29kZXIoKTsKLSAgICBFeHRyYWN0b3IgKmV4dHJhY3RvciA9IGRlY29kZXItPmdldEV4dHJhY3RvcigpOwotICAgIGlmICghZXh0cmFjdG9yKSB7Ci0gICAgICAgIEFMT0dFKCJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgYm9vbCBhc3luY01vZGVbMl0gPSB7dHJ1ZSwgZmFsc2V9OworICAgIGZvciAoYm9vbCBtb2RlIDogYXN5bmNNb2RlKSB7CisgICAgICAgIHNpemVfdCBlbGVTaXplID0gZWxlU3RyZWFtLnRlbGxnKCk7CisgICAgICAgIGVsZVN0cmVhbS5zZWVrZygwLCBpZnN0cmVhbTo6YmVnKTsKIAotICAgIC8vIFJlYWQgZmlsZSBwcm9wZXJ0aWVzCi0gICAgc3RydWN0IHN0YXQgYnVmOwotICAgIHN0YXQoc0ZpbGVQYXRoLmNfc3RyKCksICZidWYpOwotICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOwotICAgIGlmIChmaWxlU2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJGaWxlIHNpemUgZ3JlYXRlciB0aGFuIG1heGltdW0gYnVmZmVyIHNpemUiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQzMl90IGZkID0gZmlsZW5vKGlucHV0RnApOwotICAgIGludDMyX3QgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci0+aW5pdEV4dHJhY3RvcihmZCwgZmlsZVNpemUpOwotICAgIGlmICh0cmFja0NvdW50IDw9IDApIHsKLSAgICAgICAgQUxPR0UoImluaXRFeHRyYWN0b3IgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgICAgIC8vIFNldCBlbmNvZGVyIHBhcmFtcworICAgICAgICBlbmNQYXJhbWV0ZXIgZW5jUGFyYW1zOworICAgICAgICBlbmNQYXJhbXMud2lkdGggPSBqV2lkdGg7CisgICAgICAgIGVuY1BhcmFtcy5oZWlnaHQgPSBqSGVpZ2h0OworICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGpCaXRSYXRlOworICAgICAgICBlbmNQYXJhbXMuaUZyYW1lSW50ZXJ2YWwgPSBqRnJhbWVJbnRlcnZhbDsKKyAgICAgICAgZW5jUGFyYW1zLnNhbXBsZVJhdGUgPSBqU2FtcGxlUmF0ZTsKKyAgICAgICAgZW5jUGFyYW1zLm51bUNoYW5uZWxzID0gak51bUNoYW5uZWxzOworICAgICAgICBlbmNQYXJhbXMuZnJhbWVSYXRlID0gRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURTsKKyAgICAgICAgZW5jUGFyYW1zLmNvbG9yRm9ybWF0ID0gakNvbG9yRm9ybWF0OworICAgICAgICBlbmNQYXJhbXMucHJvZmlsZSA9IGpQcm9maWxlOworICAgICAgICBlbmNQYXJhbXMubGV2ZWwgPSBqTGV2ZWw7CiAKLSAgICBmb3IgKGludCBjdXJUcmFjayA9IDA7IGN1clRyYWNrIDwgdHJhY2tDb3VudDsgY3VyVHJhY2srKykgewotICAgICAgICBpbnQzMl90IHN0YXR1cyA9IGV4dHJhY3Rvci0+c2V0dXBUcmFja0Zvcm1hdChjdXJUcmFjayk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYWNrIEZvcm1hdCBpbnZhbGlkIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCAqaW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZSk7Ci0gICAgICAgIGlmICghaW5wdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJbnN1ZmZpY2llbnQgbWVtb3J5Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gZnJhbWVJbmZvOwotICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbzsKLSAgICAgICAgdWludDMyX3QgaW5wdXRCdWZmZXJPZmZzZXQgPSAwOwotCi0gICAgICAgIC8vIEdldCBmcmFtZSBkYXRhCi0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBleHRyYWN0b3ItPmdldEZyYW1lU2FtcGxlKGluZm8pOwotICAgICAgICAgICAgaWYgKHN0YXR1cyB8fCAhaW5mby5zaXplKSBicmVhazsKLSAgICAgICAgICAgIC8vIGNvcHkgdGhlIG1ldGEgZGF0YSBhbmQgYnVmZmVyIHRvIGJlIHBhc3NlZCB0byBkZWNvZGVyCi0gICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJPZmZzZXQgKyBpbmZvLnNpemUgPiBrTWF4QnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNZW1vcnkgYWxsb2NhdGVkIG5vdCBzdWZmaWNpZW50Iik7Ci0gICAgICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KGlucHV0QnVmZmVyICsgaW5wdXRCdWZmZXJPZmZzZXQsIGV4dHJhY3Rvci0+Z2V0RnJhbWVCdWYoKSwgaW5mby5zaXplKTsKLSAgICAgICAgICAgIGZyYW1lSW5mby5wdXNoX2JhY2soaW5mbyk7Ci0gICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldCArPSBpbmZvLnNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKLSAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RmlsZVBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpPdXRGaWxlUGF0aCwgbnVsbHB0cik7Ci0gICAgICAgIEZJTEUgKm91dEZwID0gZm9wZW4ob3V0cHV0RmlsZVBhdGgsICJ3YiIpOwotICAgICAgICBpZiAob3V0RnAgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzIC0gRmlsZSBmYWlsZWQgdG8gb3BlbiBmb3Igd3JpdGluZyEiLCBvdXRwdXRGaWxlUGF0aCk7Ci0gICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBkZWNvZGVyLT5zZXR1cERlY29kZXIoKTsKLSAgICAgICAgc3RhdHVzID0gZGVjb2Rlci0+ZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGRlY05hbWUsIGZhbHNlIC8qYXN5bmNNb2RlICovLCBvdXRGcCk7CisgICAgICAgIEVuY29kZXIgKmVuY29kZXIgPSBuZXcgRW5jb2RlcigpOworICAgICAgICBlbmNvZGVyLT5zZXR1cEVuY29kZXIoKTsKKyAgICAgICAgYXV0byBzdGF0dXMgPSBlbmNvZGVyLT5lbmNvZGUoc0NvZGVjTmFtZSwgZWxlU3RyZWFtLCBlbGVTaXplLCBtb2RlLCBlbmNQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihtaW1lKSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRGVjb2RlIHJldHVybmVkIGVycm9yIik7Ci0gICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGVyIHJldHVybmVkIGVycm9yIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLQotICAgICAgICBBTWVkaWFGb3JtYXQgKmRlY29kZXJGb3JtYXQgPSBkZWNvZGVyLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBleHRyYWN0b3ItPmdldEZvcm1hdCgpOwotICAgICAgICBpZiAoaW5wdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwotICAgICAgICAgICAgaW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICBBTE9HVigiRW5jb2RpbmcgY29tcGxldGUgd2l0aCBjb2RlYyAlcyBmb3IgYXN5bmNNb2RlID0gJWQiLCBzQ29kZWNOYW1lLmNfc3RyKCksIG1vZGUpOworICAgICAgICBlbmNvZGVyLT5kZUluaXRDb2RlYygpOworICAgICAgICBjb25zdCBjaGFyICpzdGF0c0ZpbGUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIG51bGxwdHIpOworICAgICAgICBzdHJpbmcgaW5wdXRSZWZlcmVuY2U7CisgICAgICAgIGludDY0X3QgY2xpcER1cmF0aW9uVXM7CisgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgICAgIGlucHV0UmVmZXJlbmNlID0gc3RyaW5nKGZpbGVOYW1lKSArICJfIiArIHRvX3N0cmluZyhqV2lkdGgpICsgIngiICsgdG9fc3RyaW5nKGpIZWlnaHQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl8iICsgdG9fc3RyaW5nKGpCaXRSYXRlKSArICJicHMiOworICAgICAgICAgICAgaW50MzJfdCBmcmFtZVNpemUgPSBqV2lkdGggKiBqSGVpZ2h0ICogMyAvIDI7CisgICAgICAgICAgICBjbGlwRHVyYXRpb25VcyA9CisgICAgICAgICAgICAgICAgICAgICgoKGVsZVNpemUgKyBmcmFtZVNpemUgLSAxKSAvIGZyYW1lU2l6ZSkgLyBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFKSAqIDEwMDAwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSA9IHN0cmluZyhmaWxlTmFtZSkgKyAiXyIgKyB0b19zdHJpbmcoalNhbXBsZVJhdGUpICsgImh6XyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zdHJpbmcoak51bUNoYW5uZWxzKSArICJjaF8iICsgdG9fc3RyaW5nKGpCaXRSYXRlKSArICJicHMiOworICAgICAgICAgICAgY2xpcER1cmF0aW9uVXMgPSAoZWxlU2l6ZSAvIChqU2FtcGxlUmF0ZSAqIGpOdW1DaGFubmVscykpICogMTAwMDAwMDsKICAgICAgICAgfQotICAgICAgICBjb25zdCBjaGFyICptaW1lID0gbnVsbHB0cjsKLSAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOwotICAgICAgICBpZiAoIW1pbWUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWZzdHJlYW0gZWxlU3RyZWFtOwotICAgICAgICBlbGVTdHJlYW0ub3BlbihvdXRwdXRGaWxlUGF0aCwgaWZzdHJlYW06OmJpbmFyeSB8IGlmc3RyZWFtOjphdGUpOwotICAgICAgICBpZiAoIWVsZVN0cmVhbS5pc19vcGVuKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyAtIEZpbGUgZmFpbGVkIHRvIG9wZW4gZm9yIHJlYWRpbmchIiwgb3V0cHV0RmlsZVBhdGgpOwotICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak91dEZpbGVQYXRoLCBvdXRwdXRGaWxlUGF0aCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgY2hhciAqY29kZWNOYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqQ29kZWNOYW1lLCBOVUxMKTsKLSAgICAgICAgY29uc3QgY2hhciAqaW5wdXRSZWZlcmVuY2UgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgbnVsbHB0cik7Ci0gICAgICAgIHN0cmluZyBzQ29kZWNOYW1lID0gc3RyaW5nKGNvZGVjTmFtZSk7Ci0gICAgICAgIHN0cmluZyBzSW5wdXRSZWZlcmVuY2UgPSBzdHJpbmcoaW5wdXRSZWZlcmVuY2UpOwotCi0gICAgICAgIGJvb2wgYXN5bmNNb2RlWzJdID0ge3RydWUsIGZhbHNlfTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgIHNpemVfdCBlbGVTaXplID0gZWxlU3RyZWFtLnRlbGxnKCk7Ci0gICAgICAgICAgICBlbGVTdHJlYW0uc2Vla2coMCwgaWZzdHJlYW06OmJlZyk7Ci0KLSAgICAgICAgICAgIC8vIEdldCBlbmNvZGVyIHBhcmFtcwotICAgICAgICAgICAgZW5jUGFyYW1ldGVyIGVuY1BhcmFtczsKLSAgICAgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmZW5jUGFyYW1zLndpZHRoKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJmVuY1BhcmFtcy5oZWlnaHQpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgJmVuY1BhcmFtcy5mcmFtZVJhdGUpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsICZlbmNQYXJhbXMuYml0cmF0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuY1BhcmFtcy5iaXRyYXRlIDw9IDAgfHwgZW5jUGFyYW1zLmZyYW1lUmF0ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5mcmFtZVJhdGUgPSBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCAidmlkZW8vM2dwcCIpIHx8ICFzdHJjbXAobWltZSwgInZpZGVvL21wNHYtZXMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBFTkNPREVfTUlOX0JJVF9SQVRFIC8qIDYwMCBLYnBzICovOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBFTkNPREVfREVGQVVMVF9CSVRfUkFURSAvKiA4IE1icHMgKi87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCAmZW5jUGFyYW1zLnByb2ZpbGUpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsICZlbmNQYXJhbXMubGV2ZWwpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihkZWNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5jb2xvckZvcm1hdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZlbmNQYXJhbXMuc2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jUGFyYW1zLm51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW5jb2RlciAqZW5jb2RlciA9IG5ldyBFbmNvZGVyKCk7Ci0gICAgICAgICAgICBlbmNvZGVyLT5zZXR1cEVuY29kZXIoKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGVuY29kZXItPmVuY29kZShzQ29kZWNOYW1lLCBlbGVTdHJlYW0sIGVsZVNpemUsIGFzeW5jTW9kZVtpXSwgZW5jUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWltZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvZGVyIHJldHVybmVkIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkVuY29kaW5nIGNvbXBsZXRlIHdpdGggY29kZWMgJXMgZm9yIGFzeW5jTW9kZSA9ICVkIiwgc0NvZGVjTmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgYXN5bmNNb2RlW2ldKTsKLSAgICAgICAgICAgIGVuY29kZXItPmRlSW5pdENvZGVjKCk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpzdGF0c0ZpbGUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIG51bGxwdHIpOwotICAgICAgICAgICAgZW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3Moc0lucHV0UmVmZXJlbmNlLCBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpLCBzQ29kZWNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzeW5jTW9kZVtpXSA/ICJhc3luYyIgOiAic3luYyIpLCBzdGF0c0ZpbGUpOwotICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoalN0YXRzRmlsZSwgc3RhdHNGaWxlKTsKLSAgICAgICAgICAgIGVuY29kZXItPnJlc2V0RW5jb2RlcigpOwotICAgICAgICAgICAgZGVsZXRlIGVuY29kZXI7Ci0gICAgICAgICAgICBlbmNvZGVyID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgaWYgKG91dEZwKSB7Ci0gICAgICAgICAgICBmY2xvc2Uob3V0RnApOwotICAgICAgICAgICAgb3V0RnAgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgaW5wdXRSZWZlcmVuY2UpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqQ29kZWNOYW1lLCBjb2RlY05hbWUpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqT3V0RmlsZVBhdGgsIG91dHB1dEZpbGVQYXRoKTsKLSAgICAgICAgaWYgKGZvcm1hdCkgewotICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOwotICAgICAgICAgICAgZm9ybWF0ID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVjb2RlckZvcm1hdCkgewotICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShkZWNvZGVyRm9ybWF0KTsKLSAgICAgICAgICAgIGRlY29kZXJGb3JtYXQgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGRlY29kZXItPmRlSW5pdENvZGVjKCk7Ci0gICAgICAgIGRlY29kZXItPnJlc2V0RGVjb2RlcigpOworICAgICAgICBlbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgY2xpcER1cmF0aW9uVXMsIHNDb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlID8gImFzeW5jIiA6ICJzeW5jIiksIHN0YXRzRmlsZSk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIHN0YXRzRmlsZSk7CisgICAgICAgIGVuY29kZXItPnJlc2V0RW5jb2RlcigpOworICAgICAgICBkZWxldGUgZW5jb2RlcjsKKyAgICAgICAgZW5jb2RlciA9IG51bGxwdHI7CiAgICAgfQotICAgIGlmIChpbnB1dEZwKSB7Ci0gICAgICAgIGZjbG9zZShpbnB1dEZwKTsKLSAgICAgICAgaW5wdXRGcCA9IG51bGxwdHI7Ci0gICAgfQotICAgIGV4dHJhY3Rvci0+ZGVJbml0RXh0cmFjdG9yKCk7Ci0gICAgZGVsZXRlIGRlY29kZXI7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVQYXRoLCBmaWxlUGF0aCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBmaWxlTmFtZSk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak1pbWUsIG1pbWUpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpDb2RlY05hbWUsIGNvZGVjTmFtZSk7CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0VuY29kZXIuamF2YQppbmRleCA0NWU1NTc0Li43NTRjZDhlIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9FbmNvZGVyLmphdmEKQEAgLTE3NSwxMCArMTc1LDEwIEBACiAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEBOb25OdWxsIE1lZGlhQ29kZWMgbWVkaWFDb2RlYywgQE5vbk51bGwgQ29kZWNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBtZWRpYUNvZGVjLnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgbWVkaWFDb2RlYy5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvZGVjRXJyb3I6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb2RlYyBFcnJvcjogIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsgbUxvY2subm90aWZ5KCk7IH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9OYXRpdmUuamF2YSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9OYXRpdmUuamF2YQppbmRleCAzOGI2MDhhLi4zZTM5NjljIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L05hdGl2ZS5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAgICAgcHVibGljIG5hdGl2ZSBpbnQgRGVjb2RlKFN0cmluZyBpbnB1dEZpbGVQYXRoLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSwgU3RyaW5nIHN0YXRzRmlsZSwKICAgICAgICAgICAgIFN0cmluZyBjb2RlY05hbWUsIGJvb2xlYW4gYXN5bmNNb2RlKTsKIAotICAgIHB1YmxpYyBuYXRpdmUgaW50IEVuY29kZShTdHJpbmcgaW5wdXRGaWxlUGF0aCwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIFN0cmluZyBvdXRwdXRGaWxlUGF0aCwKLSAgICAgICAgICAgIFN0cmluZyBzdGF0c0ZpbGUsIFN0cmluZyBjb2RlY05hbWUpOworICAgIHB1YmxpYyBuYXRpdmUgaW50IEVuY29kZShTdHJpbmcgaW5wdXRGaWxlUGF0aCwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIFN0cmluZyBzdGF0c0ZpbGUsCisgICAgICAgICAgICBTdHJpbmcgY29kZWNOYW1lLCBTdHJpbmcgbWltZSwgaW50IGJpdFJhdGUsIGludCBjb2xvckZvcm1hdCwgaW50IGZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwcm9maWxlLCBpbnQgbGV2ZWwsIGludCBzYW1wbGVSYXRlLCBpbnQgbnVtQ2hhbm5lbCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS5tZAppbmRleCAwNWZiZTZmLi4wNDdjMjg5IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9SRUFETUUubWQKQEAgLTEsNyArMSw3IEBACiAjIEJlbmNobWFyayB0ZXN0cwogCiBCZW5jaG1hcmsgYXBwIGFuYWx5c2VzIHRoZSB0aW1lIHRha2VuIGJ5IE1lZGlhQ29kZWMsIE1lZGlhRXh0cmFjdG9yIGFuZCBNZWRpYU11eGVyIGZvciBnaXZlbiBzZXQgb2YgaW5wdXRzLiBJdCBpcyB1c2VkIHRvIGJlbmNobWFyayB0aGVzZSBtb2R1bGVzIG9uIGFuZHJvaWQgZGV2aWNlcy4KLUJlbmNobWFyayByZXN1bHRzIGFyZSBlbWl0dGVkIHRvIGxvZ2NhdC4KK0JlbmNobWFyayByZXN1bHRzIGFyZSBwdWJsaXNoZWQgYXMgYSBDU1YgcmVwb3J0LgogCiBUaGlzIHBhZ2UgZGVzY3JpYmVzIHN0ZXBzIHRvIHJ1biB0aGUgTkRLIGFuZCBTREsgbGF5ZXIgdGVzdC4KIApAQCAtMTAsMzUgKzEwLDQ5IEBACiBtbW0gZnJhbWV3b3Jrcy9hdi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvCiBgYGAKIAotIyBOREsKLQotVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIG5hdGl2ZSBsYXllciwgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLVRoZSBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC8KLQotYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC8qIC9kYXRhL2xvY2FsL3RtcC8KLQotRWcuIGFkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvZXh0cmFjdG9yVGVzdC9leHRyYWN0b3JUZXN0IC9kYXRhL2xvY2FsL3RtcC8KLQotVG8gcnVuIHRoZSBiaW5hcnksIGZvbGxvdyB0aGUgY29tbWFuZHMgbWVudGlvbmVkIGJlbG93IHVuZGVyIGVhY2ggbW9kdWxlLgotCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9vcGVuP2lkPTFnaE1yMTdCQko3bjBwcWJtN29SRWlUTl9NTmVtSlVxeSkKKyMgUmVzb3VyY2VzCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrLnppcCkKIAogRG93bmxvYWQgdGhlIE1lZGlhQmVuY2htYXJrLnppcCBmaWxlLCB1bnppcCBhbmQgcHVzaCBpdCB0byAvZGF0YS9sb2NhbC90bXAvIG9uIHRoZSBkZXZpY2UuCiAKIGBgYAogdW56aXAgTWVkaWFCZW5jaG1hcmsuemlwCi1hZGIgcHVzaCBNZWRpYUJlbmNobWFyayAvZGF0YS9sb2NhbC90bXAKK2FkYiBwdXNoIE1lZGlhQmVuY2htYXJrIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKIAorVGhlIHJlc291cmNlIGZpbGVzIGFyZSBhc3N1bWVkIHRvIGJlIGF0IC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvLiBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBsb2NhdGlvbiwgYnV0IHlvdSBoYXZlIHRvIG1vZGlmeSB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHJlcGxhY2UgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8gd2l0aCB3aGVyZXZlciB5b3UgY2hvc2UgdG8gcHV0IHRoZSBmaWxlcy4KKworIyBOREsgQ0xJIFRlc3RzCitOb3RlOiBbQmVuY2htYXJrIEFwcGxpY2F0aW9uXSgjQmVuY2htYXJrQXBwbGljYXRpb24pIG5vdyBzdXBwb3J0cyBwcm9maWxpbmcgYm90aCBTREsgYW5kIE5ESyBBUElzIGFuZCB0aGF0IGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGJlbmNobWFyayBjb2RlY3MKKworVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIG5hdGl2ZSBsYXllciwgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6CisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCisKK2FkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvKiAvZGF0YS9sb2NhbC90bXAvLiBGb3IgZXhhbXBsZQorCitgYGAKK2FkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvZXh0cmFjdG9yVGVzdC9leHRyYWN0b3JUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCisKK2FkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0LyogL2RhdGEvbG9jYWwvdG1wLy4gRm9yIGV4YW1wbGUKKworYGBgCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdC9leHRyYWN0b3JUZXN0L2V4dHJhY3RvclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHJ1biB0aGUgYmluYXJ5LCBmb2xsb3cgdGhlIGNvbW1hbmRzIG1lbnRpb25lZCBiZWxvdyB1bmRlciBlYWNoIG1vZHVsZS4KKwogIyMgRXh0cmFjdG9yCiAKIFRoZSB0ZXN0IGV4dHJhY3RzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBleHRyYWN0b3JzIGF2YWlsYWJsZSBpbiBOREsuCiAKLVRoZSByZXNvdXJjZSBmaWxlcyBhcmUgYXNzdW1lZCB0byBiZSBhdCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLy4gWW91IGNhbiB1c2UgYSBkaWZmZXJlbnQgbG9jYXRpb24sIGJ1dCB5b3UgaGF2ZSB0byBtb2RpZnkgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB0byByZXBsYWNlIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvIHdpdGggd2hlcmV2ZXIgeW91IGNob3NlIHRvIHB1dCB0aGUgZmlsZXMuCi0KLVRoZSBwYXRoIHRvIHRoZXNlIGZpbGVzIG9uIHRoZSBkZXZpY2UgaXMgcmVxdWlyZWQgdG8gYmUgZ2l2ZW4gZm9yIHRoZSB0ZXN0LgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvZXh0cmFjdG9yVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCkBAIC00Nyw4ICs2MSw2IEBACiAKIFRoZSB0ZXN0IGRlY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBkZWNvZGVycyBhdmFpbGFibGUgaW4gTkRLLgogCi1TZXR1cCBzdGVwcyBhcmUgc2FtZSBhcyBleHRyYWN0b3IuCi0KIGBgYAogYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9kZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCkBAIC01Nyw4ICs2OSw2IEBACiAKIFRoZSB0ZXN0IG11eGVzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBtdXhlcnMgYXZhaWxhYmxlIGluIE5ESy4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgZXh0cmFjdG9yLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvbXV4ZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKQEAgLTY3LDU1ICs3Nyw4MiBAQAogCiBUaGUgdGVzdCBlbmNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZW5jb2RlcnMgYXZhaWxhYmxlIGluIE5ESy4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgZXh0cmFjdG9yLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvZW5jb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYAogCi0jIFNESworIyA8YSBuYW1lPSJCZW5jaG1hcmtBcHBsaWNhdGlvbiI+PC9hPiBCZW5jaG1hcmsgQXBwbGljYXRpb24KK1RvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBTREsgYW5kIE5ESyBBUElzLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKK0JlbmNobWFyayBBcHBsaWNhdGlvbiBjYW4gYmUgcnVuIGluIHR3byB3YXlzLgogCi1UbyBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBvZiB0aGUgU0RLIEFQSXMsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorIyMgU3RlcHMgdG8gcnVuIHdpdGggYXRlc3QKK05vdGUgdGhhdCBhdGVzdCBjb21tYW5kIHdpbGwgaW5zdGFsbCBCZW5jaG1hcmsgYXBwbGljYXRpb24gYW5kIHB1c2ggdGhlIHJlcXVpcmVkIHRlc3QgZmlsZXMgdG8gdGhlIGRldmljZSBhcyB3ZWxsLgorCitGb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kCitgYGAKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cyAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKKworRm9yIHJ1bm5pbmcgdGhlIHRlc3RzIGluZGl2aWR1YWxseSwgcnVuIHRoZSBmb2xsb3dpbmcgYXRlc3QgY29tbWFuZHM6CisKK2BgYAorYXRlc3QgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkV4dHJhY3RvclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYXRlc3QgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkRlY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5NdXhlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYXRlc3QgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkVuY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYAorCisjIyBTdGVwcyB0byBydW4gd2l0aG91dCBhdGVzdAogCiBUaGUgYXBrIHdpbGwgYmUgY3JlYXRlZCBhdCB0aGUgZm9sbG93aW5nIHBhdGg6Ci0kT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtNjQvCiAKLVRvIGdldCB0aGUgcmVzb3JjZSBmaWxlcyBmb3IgdGhlIHRlc3QgZm9sbG93IGluc3RydWN0aW9ucyBnaXZlbiBpbiBbTkRLXSgjTkRLKQorVGhlIDY0LWJpdCBhcGsgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6CiskT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtNjQvCiAKIEZvciBpbnN0YWxsaW5nIHRoZSBhcGssIHJ1biB0aGUgY29tbWFuZDoKIGBgYAogYWRiIGluc3RhbGwgLWYgLXIgJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybTY0L01lZGlhQmVuY2htYXJrVGVzdC5hcGsKIGBgYAogCi1Gb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBydW4gdGhlIGNvbW1hbmQ6CitUaGUgMzItYml0IGFwayB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDoKKyRPVVQvdGVzdGNhc2VzL01lZGlhQmVuY2htYXJrVGVzdC9hcm0vCisKK0ZvciBpbnN0YWxsaW5nIHRoZSBhcGssIHJ1biB0aGUgY29tbWFuZDoKK2BgYAorYWRiIGluc3RhbGwgLWYgLXIgJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybS9NZWRpYUJlbmNobWFya1Rlc3QuYXBrCitgYGAKKworVG8gZ2V0IHRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhlIHRlc3QgZm9sbG93IGluc3RydWN0aW9ucyBnaXZlbiBpbiBbUmVzb3VyY2VzXSgjUmVzb3VyY2VzKQorCitGb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kCiBgYGAKIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1yIC1lIHBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIGBgYAogCiAjIyBFeHRyYWN0b3IKIAotVGhlIHRlc3QgZXh0cmFjdHMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGV4dHJhY3RvcnMgYXZhaWxhYmxlIGluIFNESy4KK1RoZSB0ZXN0IGV4dHJhY3RzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBleHRyYWN0b3JzIGF2YWlsYWJsZSBpbiBTREsgYW5kIE5ESy4KIGBgYAogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJ2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5FeHRyYWN0b3JUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKIAogIyMgRGVjb2RlcgogCi1UaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZGVjb2RlcnMgYXZhaWxhYmxlIGluIFNESy4KK1RoZSB0ZXN0IGRlY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBkZWNvZGVycyBhdmFpbGFibGUgaW4gU0RLIGFuZCBOREsuCiBgYGAKIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1yIC1lIGNsYXNzICdjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuRGVjb2RlclRlc3QnIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIGBgYAogCiAjIyBNdXhlcgogCi1UaGUgdGVzdCBtdXhlcyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyBkaWZmZXJlbnQgd3JpdGVycyBhdmFpbGFibGUgaW4gU0RLLgorVGhlIHRlc3QgbXV4ZXMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgZGlmZmVyZW50IHdyaXRlcnMgYXZhaWxhYmxlIGluIFNESyBhbmQgTkRLLgogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLk11eGVyVGVzdCcgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogYGBgCiAKICMjIEVuY29kZXIKIAotVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBTREsuCitUaGUgdGVzdCBlbmNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZW5jb2RlcnMgYXZhaWxhYmxlIGluIFNESyBhbmQgTkRLLgogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkVuY29kZXJUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKQEAgLTEyNCwyNCArMTYxLDI3IEBACiBUbyBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBvZiB0aGUgY29kZWMyIGxheWVyLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKIAogVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKwogVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LwogCiBUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KIGFkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3Q2NC8qIC9kYXRhL2xvY2FsL3RtcC8KLUVnLiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0NjQvQzJEZWNvZGVyVGVzdC9DMkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdDY0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKIAogVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgogYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdC8qIC9kYXRhL2xvY2FsL3RtcC8KLUVnLiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKK2FkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3QvQzJEZWNvZGVyVGVzdC9DMkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAogCi1UbyBnZXQgdGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGUgdGVzdCBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGdpdmVuIGluIFtOREtdKCNOREspCitUbyBnZXQgdGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGUgdGVzdCBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGdpdmVuIGluIFtSZXNvdXJjZXNdKCNSZXNvdXJjZXMpCiAKICMjIEMyIERlY29kZXIKIAogVGhlIHRlc3QgZGVjb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGNvZGVjMiBkZWNvZGVycyBhdmFpbGFibGUgaW4gZGV2aWNlLgogCi1TZXR1cCBzdGVwcyBhcmUgc2FtZSBhcyBbZXh0cmFjdG9yXSgjZXh0cmFjdG9yKS4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0MyRGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYApAQCAtMTQ5LDggKzE4OSw5NSBAQAogCiBUaGUgdGVzdCBlbmNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgY29kZWMyIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBkZXZpY2UuCiAKLVNldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIFtleHRyYWN0b3JdKCNleHRyYWN0b3IpLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQzJFbmNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCisKKyMgQW5hbHlzaXMKKworVGhlIGJlbmNobWFyayByZXN1bHRzIGFyZSBzdG9yZWQgaW4gYSBDU1YgZmlsZSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgYW5hbHlzaXMuIFRoZXNlIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiBmb2xsb3dpbmcgZm9ybWF0OgorPGFwcCBkaXJlY3Rvcnk+Lzxtb2R1bGVfbmFtZT4uPHRpbWVzdGFtcD4uY3N2CisKK05vdGU6IFRoaXMgdGltZXN0YW1wIGlzIGluIG5hbm8gc2Vjb25kcyBhbmQgd2lsbCBjaGFuZ2UgYmFzZWQgb24gY3VycmVudCBzeXN0ZW0gdGltZS4KKworVG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIENTViBmaWxlLCBsb29rIGZvciB0aGUgcGF0aCBpbiBsb2dzLiBFeGFtcGxlIGxvZyBiZWxvdyAtCisKK2BgYAorY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrIEQvRGVjb2RlclRlc3Q6IFNhdmluZyBCZW5jaG1hcmsgcmVzdWx0cyBpbjogL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2ZpbGVzL0RlY29kZXIuMTU4NzczMjM5NTM4Ny5jc3YKK2BgYAorCitUaGlzIGZpbGUgY2FuIGJlIHB1bGxlZCBmcm9tIHRoZSBkZXZpY2UgdXNpbmcgImFkYiBwdWxsIiBjb21tYW5kLgorYGBgCithZGIgcHVsbCAvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvZmlsZXMvRGVjb2Rlci4xNTg3NzMyMzk1Mzg3LmNzdiAuL0RlY29kZXIuMTU4NzczMjM5NTM4Ny5jc3YKK2BgYAorCisjIyBDU1YgQ29sdW1ucworCitGb2xsb3dpbmcgY29sdW1ucyBhcmUgYXZhaWxhYmxlIGluIENTVi4KKworTm90ZTogQWxsIHRpbWUgdmFsdWVzIGFyZSBpbiBuYW5vIHNlY29uZHMKKworMS4gKipjdXJyZW50VGltZSoqIDogVGhlIHRpbWUgcmVjb3JkZWQgYXQgdGhlIGNyZWF0aW9uIG9mIHRoZSBzdGF0cy4gVGhpcyBtYXkgYmUgdXNlZCB0byBlc3RpbWF0ZSB0aW1lIGJldHdlZW4gY29uc2VjdXRpdmUgdGVzdCBjbGlwcy4KKworMi4gKipmaWxlTmFtZSoqOiBUaGUgZmlsZSBiZWluZyB1c2VkIGFzIGFuIGlucHV0IGZvciB0aGUgYmVuY2htYXJrIHRlc3QuCisKKzMuICoqb3BlcmF0aW9uKio6IFRoZSBjdXJyZW50IG9wZXJhdGlvbiBvbiB0aGUgaW5wdXQgdGVzdCB2ZWN0b3IgaS5lLiBFeHRyYWN0L011eC9FbmNvZGUvRGVjb2RlLgorCis0LiAqKk5ESy9TREsqKjogVGhlIHRhcmdldCBBUElzIGkuZS4gQU1lZGlhIHZzIE1lZGlhIGNhbGxzIGZvciB0aGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZC4KKworNS4gKipzeW5jL2FzeW5jKio6IFRoaXMgaXMgc3BlY2lmaWMgdG8gTWVkaWFDb2RlYyBvYmplY3RzIChpLmUuIEVuY29kZXIgYW5kIERlY29kZXIpLiBJdCBzcGVjaWZpZXMgdGhlIG1vZGUgaW4gd2hpY2ggTWVkaWFDb2RlYyBBUElzIGFyZSB3b3JraW5nLiBGb3IgYXN5bmMgbW9kZSwgY2FsbGJhY2tzIGFyZSBzZXQuIEZvciBzeW5jIG1vZGUsIHdlIGhhdmUgdG8gcG9sbCB0aGUgZGVxdWV1ZUJ1ZmZlciBBUElzIHRvIHF1ZXVlIGFuZCBkZXF1ZXVlIGlucHV0IG91dHB1dCBidWZmZXJzIHJlc3BlY3RpdmVseS4KKworNi4gKipzZXR1cFRpbWUqKjogVGhlIHRpbWUgdGFrZW4gdG8gc2V0IHVwIHRoZSBNZWRpYUV4dHJhY3Rvci9NdXhlci9Db2RlYyBpbnN0YW5jZS4KKworICAgICogTWVkaWFDb2RlYzogaW5jbHVkZXMgc2V0dGluZyBhc3luYy9zeW5jIG1vZGUsIGNvbmZpZ3VyaW5nIHdpdGggYSBmb3JtYXQgYW5kIGNvZGVjLnN0YXJ0CisKKyAgICAqIE1lZGlhRXh0cmFjdG9yOiBpbmNsdWRlcyBBTWVkaWFFeHRyYWN0b3JfbmV3IGFuZCBzZXREYXRhU291cmNlLgorCisgICAgKiBNZWRpYU11eGVyOiBpbmNsdWRlcyBjcmVhdGluZyB0aGUgb2JqZWN0LCBhZGRpbmcgdHJhY2ssIGFuZCBzdGFydGluZyB0aGUgbXV4ZXIuCisKKzcuICoqZGVzdHJveVRpbWUqKjogVGhlIHRpbWUgdGFrZW4gdG8gc3RvcCBhbmQgY2xvc2UgTWVkaWFFeHRyYWN0b3IvTXV4ZXIvQ29kZWMgaW5zdGFuY2UuCisKKzguICoqbWluaW11bVRpbWUqKjogVGhlIG1pbmltdW0gdGltZSB0YWtlbiB0byBleHRyYWN0L211eC9lbmNvZGUvZGVjb2RlIGEgZnJhbWUuCisKKzkuICoqbWF4aW11bVRpbWUqKjogVGhlIG1heGltdW0gdGltZSB0YWtlbiB0byBleHRyYWN0L211eC9lbmNvZGUvZGVjb2RlIGEgZnJhbWUuCisKKzEwLiAqKmF2ZXJhZ2VUaW1lKio6IEF2ZXJhZ2UgdGltZSB0YWtlbiB0byBleHRyYWN0L211eC9lbmNvZGUvZGVjb2RlIHBlciBmcmFtZS4KKworICAgICogTWVkaWFDb2RlYzogY29tcHV0ZWQgYXMgdGhlIHRvdGFsIHRpbWUgdGFrZW4gdG8gZW5jb2RlL2RlY29kZSBhbGwgZnJhbWVzIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBmcmFtZXMgZW5jb2RlZC9kZWNvZGVkLgorCisgICAgKiBNZWRpYUV4dHJhY3RvcjogY29tcHV0ZWQgYXMgdGhlIHRvdGFsIHRpbWUgdGFrZW4gdG8gZXh0cmFjdCBhbGwgZnJhbWVzIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBmcmFtZXMgZXh0cmFjdGVkLgorCisgICAgKiBNZWRpYU11eGVyOiBjb21wdXRlZCBhcyB0aGUgdG90YWwgdGltZSB0YWtlbiB0byBtdXggYWxsIGZyYW1lcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIG11eGVkLgorCisxMS4gKip0aW1lVG9Qcm9jZXNzMVNlY0NvbnRlbnQqKjogVGhlIHRpbWUgcmVxdWlyZWQgdG8gcHJvY2VzcyBvbmUgc2Vjb25kIHdvcnRoIGlucHV0IGRhdGEuCisKKzEyLiAqKnRvdGFsQnl0ZXNQcm9jZXNzZWRQZXJTZWMqKjogVGhlIG51bWJlciBvZiBieXRlcyBleHRyYWN0ZWQvbXV4ZWQvZGVjb2RlZC9lbmNvZGVkIHBlciBzZWNvbmQuCisKKzEzLiAqKnRpbWVUb0ZpcnN0RnJhbWUqKjogVGhlIHRpbWUgdGFrZW4gdG8gcmVjZWl2ZSB0aGUgZmlyc3Qgb3V0cHV0IGZyYW1lLgorCisxNC4gKip0b3RhbFNpemVJbkJ5dGVzKio6IFRoZSB0b3RhbCBvdXRwdXQgc2l6ZSBvZiB0aGUgb3BlcmF0aW9uIChpbiBieXRlcykuCisKKzE1LiAqKnRvdGFsVGltZSoqOiBUaGUgdGltZSB0YWtlbiB0byBwZXJmb3JtIHRoZSBjb21wbGV0ZSBvcGVyYXRpb24gKGkuZS4gRXh0cmFjdC9NdXgvRGVjb2RlL0VuY29kZSkgZm9yIHJlc3BlY3RpdmUgdGVzdCB2ZWN0b3IuCisKKworIyMgTXV4ZXIKKzEuICoqY29tcG9uZW50TmFtZSoqOiBUaGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgTWVkaWEgZmlsZS4gRm9sbG93aW5nIG11eGVycyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDoKKyAgICAgKiBPZ2csIFdlYm0sIDNncHAsIGFuZCBtcDQuCisKKyMjIERlY29kZXIKKzEuICoqY29tcG9uZW50TmFtZSoqOiBJbmNsdWRlcyBhbGwgc3VwcG9ydGVkIGNvZGVjcyBvbiB0aGUgZGV2aWNlLiBBbGlhc2VkIGNvbXBvbmVudHMgYXJlIHNraXBwZWQuCisgICAgKiAgIFZpZGVvOiBIMjYzLCBIMjY0LCBIMjY1LCBWUHgsIE1wZWc0LCBNcGVnMiwgQVYxCisgICAgKiAgIEF1ZGlvOiBBQUMsIEZsYWMsIE9wdXMsIE1QMywgVm9yYmlzLCBHU00sIEFNUi1OQi9XQgorCisjIyBFbmNvZGVyCisxLiAqKmNvbXBvbmVudE5hbWUqKjogSW5jbHVkZXMgYWxsIHN1cHBvcnRlZCBjb2RlY3Mgb24gdGhlIGRldmljZS4gQWxpYXNlZCBjb21wb25lbnRzIGFyZSBza2lwcGVkLgorICAgICogICBWaWRlbzogSDI2MywgSDI2NCwgSDI2NSwgVlB4LCBNcGVnNAorICAgICogICBBdWRpbzogQUFDLCBGbGFjLCBPcHVzLCBBTVItTkIvV0IKKworIyMgQ29tbW9uIEZhaWx1cmVzCitPbiBzb21lIGRldmljZXMsIGlmIGEgY29kZWMgaXNuJ3Qgc3VwcG9ydGVkIHNvbWUgdGVzdHMgbWF5IHJlcG9ydCBhIGZhaWx1cmUgbGlrZSAiY29kZWMgbm90IGZvdW5kIGZvciIKKworRm9yIGV4YW1wbGU6IE9uIG1vYmlsZSBkZXZpY2VzIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXBlZzIgZGVjb2RlciwgZm9sbG93aW5nIGZhaWx1cmUgaXMgb2JzZXJ2ZWQ6CitgYGAKK1VuYWJsZSB0byBjcmVhdGUgY29kZWMgYnkgbWltZTogdmlkZW8vbXBlZzIKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwCmluZGV4IDIwYTE0NjguLjQ2YzRhN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5jcHAKQEAgLTE1Niw5ICsxNTYsMTEgQEAKICAgICBtU3RhdHMtPnNldERlSW5pdFRpbWUodGltZVRha2VuKTsKIH0KIAotdm9pZCBDMkRlY29kZXI6OmR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzKSB7Cit2b2lkIEMyRGVjb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0c0ZpbGUpIHsKICAgICBzdHJpbmcgb3BlcmF0aW9uID0gImMyZGVjb2RlIjsKLSAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIGR1cmF0aW9uVXMpOworICAgIHN0cmluZyBtb2RlID0gImFzeW5jIjsKKyAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIGR1cmF0aW9uVXMsIGNvbXBvbmVudE5hbWUsIG1vZGUsIHN0YXRzRmlsZSk7CiB9CiAKIHZvaWQgQzJEZWNvZGVyOjpyZXNldERlY29kZXIoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaAppbmRleCA0YTNlYjk2Li5mYjM1YTY2IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5oCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmgKQEAgLTMxLDcgKzMxLDggQEAKIAogICAgIHZvaWQgZGVJbml0Q29kZWMoKTsKIAotICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMpOworICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSk7CiAKICAgICB2b2lkIHJlc2V0RGVjb2RlcigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAKaW5kZXggMzM0MjllZi4uNmE1MGQ0MCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmNwcApAQCAtMjUxLDkgKzI1MSwxMSBAQAogICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZSh0aW1lVGFrZW4pOwogfQogCi12b2lkIEMyRW5jb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMpIHsKK3ZvaWQgQzJFbmNvZGVyOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSkgewogICAgIHN0cmluZyBvcGVyYXRpb24gPSAiYzJlbmNvZGUiOwotICAgIG1TdGF0cy0+ZHVtcFN0YXRpc3RpY3Mob3BlcmF0aW9uLCBpbnB1dFJlZmVyZW5jZSwgZHVyYXRpb25Vcyk7CisgICAgc3RyaW5nIG1vZGUgPSAiYXN5bmMiOworICAgIG1TdGF0cy0+ZHVtcFN0YXRpc3RpY3Mob3BlcmF0aW9uLCBpbnB1dFJlZmVyZW5jZSwgZHVyYXRpb25VcywgY29tcG9uZW50TmFtZSwgbW9kZSwgc3RhdHNGaWxlKTsKIH0KIAogdm9pZCBDMkVuY29kZXI6OnJlc2V0RW5jb2RlcigpIHsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5oCmluZGV4IGE0Y2EwOTcuLjdhMDIxZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmgKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuaApAQCAtNDQsNyArNDQsOCBAQAogCiAgICAgdm9pZCBkZUluaXRDb2RlYygpOwogCi0gICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcyk7CisgICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdHNGaWxlKTsKIAogICAgIHZvaWQgcmVzZXRFbmNvZGVyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuY3BwCmluZGV4IDI2ZmIxYjkuLjE1YzQ3OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmNwcApAQCAtMjAzLDEzICsyMDMsMTMgQEAKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIG1QYXJhbXMud2lkdGgpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIG1QYXJhbXMuaGVpZ2h0KTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgbVBhcmFtcy5mcmFtZVJhdGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMLCBtUGFyYW1zLmlGcmFtZUludGVydmFsKTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIG1QYXJhbXMuYml0cmF0ZSk7Ci0gICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwsIDEpOwotICAgICAgICBpZiAobVBhcmFtcy5wcm9maWxlICYmIG1QYXJhbXMubGV2ZWwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULCBtUGFyYW1zLmNvbG9yRm9ybWF0KTsKKyAgICAgICAgaWYgKG1QYXJhbXMucHJvZmlsZSAhPSAtMSAmJiBtUGFyYW1zLmxldmVsICE9IC0xKSB7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCBtUGFyYW1zLnByb2ZpbGUpOwogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsIG1QYXJhbXMubGV2ZWwpOwogICAgICAgICB9Ci0gICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwgbVBhcmFtcy5jb2xvckZvcm1hdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1QYXJhbXMuc2FtcGxlUmF0ZSk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1QYXJhbXMubnVtQ2hhbm5lbHMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaAppbmRleCA1YWQxNDJiLi4zMjQzMTdjIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaApAQCAtMjMsMTAgKzIzLDExIEBACiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8dGhyZWFkPgogCi0jaW5jbHVkZSAibWVkaWEvTmRrSW1hZ2UuaCIKICNpbmNsdWRlICJCZW5jaG1hcmtDb21tb24uaCIKICNpbmNsdWRlICJTdGF0cy5oIgogCisvLyBjb25zdGFudCBub3QgZGVmaW5lZCBpbiBOREsgYXBpCitjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSA9IDB4N0Y0MjA4ODg7CiAKIHN0cnVjdCBlbmNQYXJhbWV0ZXIgewogICAgIGludDMyX3QgYml0cmF0ZSA9IC0xOwpAQCAtMzgsOSArMzksMTAgQEAKICAgICBpbnQzMl90IHdpZHRoID0gMDsKICAgICBpbnQzMl90IGhlaWdodCA9IDA7CiAgICAgaW50MzJfdCBmcmFtZVJhdGUgPSAtMTsKLSAgICBpbnQzMl90IHByb2ZpbGUgPSAwOwotICAgIGludDMyX3QgbGV2ZWwgPSAwOwotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OworICAgIGludDMyX3QgaUZyYW1lSW50ZXJ2YWwgPSAwOworICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOworICAgIGludDMyX3QgbGV2ZWwgPSAtMTsKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CiB9OwogCiBjbGFzcyBFbmNvZGVyIDogcHVibGljIENhbGxCYWNrSGFuZGxlIHsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9CZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9CZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaAppbmRleCBhZTJlZWUxLi40ZWRiMDQ4IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0JlbmNobWFya1Rlc3RFbnZpcm9ubWVudC5oCkBAIC0yNSw3ICsyNSw5IEBACiAKIGNsYXNzIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKICAgcHVibGljOgotICAgIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvc2RjYXJkL21lZGlhLyIpIHt9CisgICAgQmVuY2htYXJrVGVzdEVudmlyb25tZW50KCkKKyAgICAgICAgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvIiksCisgICAgICAgICAgc3RhdHNGaWxlKCIvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzL3N0YXRzLmNzdiIpIHt9CiAKICAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudAogICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKQEAgLTM0LDggKzM2LDE1IEBACiAKICAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CiAKKyAgICB2b2lkIHNldFN0YXRzRmlsZShjb25zdCBzdHJpbmcgbW9kdWxlKSB7IHN0YXRzRmlsZSA9IGdldFJlcygpICsgbW9kdWxlOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0U3RhdHNGaWxlKCkgY29uc3QgeyByZXR1cm4gc3RhdHNGaWxlOyB9CisKKyAgICBib29sIHdyaXRlU3RhdHNIZWFkZXIoKTsKKwogICBwcml2YXRlOgogICAgIHN0cmluZyByZXM7CisgICAgc3RyaW5nIHN0YXRzRmlsZTsKIH07CiAKIGludCBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKQEAgLTcwLDQgKzc5LDI2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qKgorICogV3JpdGVzIHRoZSBzdGF0cyBoZWFkZXIgdG8gYSBmaWxlCisgKiA8cD4KKyAqIFxwYXJhbSBzdGF0c0ZpbGUgICAgZmlsZSB3aGVyZSB0aGUgc3RhdHMgZGF0YSBpcyB0byBiZSB3cml0dGVuCisgKiovCitib29sIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudDo6d3JpdGVTdGF0c0hlYWRlcigpIHsKKyAgICBjaGFyIHN0YXRzSGVhZGVyW10gPQorICAgICAgICAiY3VycmVudFRpbWUsIGZpbGVOYW1lLCBvcGVyYXRpb24sIGNvbXBvbmVudE5hbWUsIE5ESy9TREssIHN5bmMvYXN5bmMsIHNldHVwVGltZSwgIgorICAgICAgICAiZGVzdHJveVRpbWUsIG1pbmltdW1UaW1lLCBtYXhpbXVtVGltZSwgYXZlcmFnZVRpbWUsIHRpbWVUb1Byb2Nlc3MxU2VjQ29udGVudCwgIgorICAgICAgICAidG90YWxCeXRlc1Byb2Nlc3NlZFBlclNlYywgdGltZVRvRmlyc3RGcmFtZSwgdG90YWxTaXplSW5CeXRlcywgdG90YWxUaW1lXG4iOworICAgIEZJTEUgKmZwU3RhdHMgPSBmb3BlbihzdGF0c0ZpbGUuY19zdHIoKSwgInciKTsKKyAgICBpZighZnBTdGF0cykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludDMyX3QgbnVtQnl0ZXMgPSBmd3JpdGUoc3RhdHNIZWFkZXIsIHNpemVvZihjaGFyKSwgc2l6ZW9mKHN0YXRzSGVhZGVyKSwgZnBTdGF0cyk7CisgICAgZmNsb3NlKGZwU3RhdHMpOworICAgIGlmKG51bUJ5dGVzICE9IHNpemVvZihzdGF0c0hlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogI2VuZGlmICAvLyBfX0JFTkNITUFSS19URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRGVjb2RlclRlc3QuY3BwCmluZGV4IGRlZGM3NDMuLjg1ZGNiYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJEZWNvZGVyVGVzdC5jcHAKQEAgLTEzNiw3ICsxMzYsOCBAQAogICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5kZUluaXRDb2RlYygpOwogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGV4dHJhY3Rvci0+Z2V0Q2xpcER1cmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIDogJXMiLCBjb2RlY05hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgbURlY29kZXItPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCBkdXJhdGlvblVzLCBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKICAgICAgICAgICAgICAgICBtRGVjb2Rlci0+cmVzZXREZWNvZGVyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE3OCw2ICsxNzksOSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiQzJEZWNvZGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKICAgICAgICAgQUxPR1YoIkMyIERlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJFbmNvZGVyVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJFbmNvZGVyVGVzdC5jcHAKaW5kZXggOThlYjE3YS4uYjE4ZDg1NiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkVuY29kZXJUZXN0LmNwcApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzdHJpbmcgZGVjTmFtZSA9ICIiOwotICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiZGVjb2RlLm91dCI7CisgICAgICAgIHN0cmluZyBvdXRwdXRGaWxlTmFtZSA9ICIvZGF0YS9sb2NhbC90bXAvZGVjb2RlLm91dCI7CiAgICAgICAgIEZJTEUgKm91dEZwID0gZm9wZW4ob3V0cHV0RmlsZU5hbWUuY19zdHIoKSwgIndiIik7CiAgICAgICAgIEFTU0VSVF9ORShvdXRGcCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlIiA8PCBvdXRwdXRGaWxlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGR1bXBpbmcgZGVjb2RlcidzIG91dHB1dCI7CkBAIC0xNDAsNyArMTQwLDggQEAKICAgICAgICAgICAgICAgICBtRW5jb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJjb2RlYyA6ICVzIiwgY29kZWNOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBtRW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgZHVyYXRpb25VcywgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgICAgICAgICAgbUVuY29kZXItPnJlc2V0RW5jb2RlcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xODAsNiArMTgxLDkgQEAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwogICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIkMyRW5jb2Rlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CiAgICAgICAgIEFMT0dWKCJDMiBFbmNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKaW5kZXggOWY5NmQzYi4uODFlZjAyYSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCkBAIC04NCw3ICs4NCw4IEBACiAgICAgICAgIGRlY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgIEFMT0dWKCJjb2RlYyA6ICVzIiwgY29kZWNOYW1lLmNfc3RyKCkpOwogICAgICAgICBzdHJpbmcgaW5wdXRSZWZlcmVuY2UgPSBnZXQ8MD4ocGFyYW1zKTsKLSAgICAgICAgZGVjb2Rlci0+ZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UpOworICAgICAgICBkZWNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgY29kZWNOYW1lLCAoYXN5bmNNb2RlID8gImFzeW5jIiA6ICJzeW5jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CiAgICAgICAgIGRlY29kZXItPnJlc2V0RGVjb2RlcigpOwogICAgIH0KQEAgLTE3OSw4ICsxODAsMTEgQEAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwogICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIkRlY29kZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HRCgiRGVjb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICBBTE9HVigiRGVjb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwCmluZGV4IGRjMmEyZGQuLjdlMTY4MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmNwcApAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlICJEZWNvZGVyLmgiCiAjaW5jbHVkZSAiRW5jb2Rlci5oIgogCitjb25zdGV4cHIgaW50MzJfdCBrRW5jb2RlRGVmYXVsdFZpZGVvQml0UmF0ZSA9IDgwMDAwMDAgLyogOCBNYnBzICovOworY29uc3RleHByIGludDMyX3Qga0VuY29kZU1pblZpZGVvQml0UmF0ZSA9IDYwMDAwMCAvKiA2MDAgS2JwcyAqLzsKK2NvbnN0ZXhwciBpbnQzMl90IGtFbmNvZGVEZWZhdWx0QXVkaW9CaXRSYXRlID0gMTI4MDAwIC8qIDEyOCBLYnBzICovOworCiBzdGF0aWMgQmVuY2htYXJrVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKIAogY2xhc3MgRW5jb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHN0cmluZywgc3RyaW5nLCBib29sPj4ge307CkBAIC03OCw3ICs4Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzdHJpbmcgZGVjTmFtZSA9ICIiOwotICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiZGVjb2RlLm91dCI7CisgICAgICAgIHN0cmluZyBvdXRwdXRGaWxlTmFtZSA9ICIvZGF0YS9sb2NhbC90bXAvZGVjb2RlLm91dCI7CiAgICAgICAgIEZJTEUgKm91dEZwID0gZm9wZW4ob3V0cHV0RmlsZU5hbWUuY19zdHIoKSwgIndiIik7CiAgICAgICAgIEFTU0VSVF9ORShvdXRGcCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlIiA8PCBvdXRwdXRGaWxlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGR1bXBpbmcgZGVjb2RlcidzIG91dHB1dCI7CkBAIC04Niw2ICs5MCw3IEBACiAgICAgICAgIGRlY29kZXItPnNldHVwRGVjb2RlcigpOwogICAgICAgICBzdGF0dXMgPSBkZWNvZGVyLT5kZWNvZGUoaW5wdXRCdWZmZXIsIGZyYW1lSW5mbywgZGVjTmFtZSwgZmFsc2UgLyphc3luY01vZGUgKi8sIG91dEZwKTsKICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRGVjb2RlIHJldHVybmVkIGVycm9yIDogIiA8PCBzdGF0dXM7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqZGVjb2RlckZvcm1hdCA9IGRlY29kZXItPmdldEZvcm1hdCgpOwogCiAgICAgICAgIGlmc3RyZWFtIGVsZVN0cmVhbTsKICAgICAgICAgZWxlU3RyZWFtLm9wZW4ob3V0cHV0RmlsZU5hbWUuY19zdHIoKSwgaWZzdHJlYW06OmJpbmFyeSB8IGlmc3RyZWFtOjphdGUpOwpAQCAtMTA4LDExICsxMTMsMTMgQEAKICAgICAgICAgICAgIGlmIChlbmNQYXJhbXMuYml0cmF0ZSA8PSAwIHx8IGVuY1BhcmFtcy5mcmFtZVJhdGUgPD0gMCkgewogICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5mcmFtZVJhdGUgPSAyNTsKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCAidmlkZW8vM2dwcCIpIHx8ICFzdHJjbXAobWltZSwgInZpZGVvL21wNHYtZXMiKSkgewotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IDYwMDAwMCAvKiA2MDAgS2JwcyAqLzsKKyAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBrRW5jb2RlTWluVmlkZW9CaXRSYXRlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gODAwMDAwMCAvKiA4IE1icHMgKi87CisgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0ga0VuY29kZURlZmF1bHRWaWRlb0JpdFJhdGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGRlY29kZXJGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMuY29sb3JGb3JtYXQpOwogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCAmZW5jUGFyYW1zLnByb2ZpbGUpOwogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgJmVuY1BhcmFtcy5sZXZlbCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMjAsOCArMTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jUGFyYW1zLnNhbXBsZVJhdGUpKTsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jUGFyYW1zLm51bUNoYW5uZWxzKSk7Ci0gICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5zYW1wbGVSYXRlICogZW5jUGFyYW1zLm51bUNoYW5uZWxzICogMTYgLyogYml0c1BlclNhbXBsZSAqLzsKKyAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0ga0VuY29kZURlZmF1bHRBdWRpb0JpdFJhdGU7CiAgICAgICAgIH0KIAogICAgICAgICBlbmNvZGVyLT5zZXR1cEVuY29kZXIoKTsKQEAgLTEzMyw3ICsxMzksOCBAQAogICAgICAgICBlbmNvZGVyLT5kZUluaXRDb2RlYygpOwogICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKICAgICAgICAgc3RyaW5nIGlucHV0UmVmZXJlbmNlID0gZ2V0PDA+KHBhcmFtcyk7Ci0gICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpKTsKKyAgICAgICAgZW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGV4dHJhY3Rvci0+Z2V0Q2xpcER1cmF0aW9uKCksIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzeW5jTW9kZSA/ICJhc3luYyIgOiAic3luYyIpLCBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOwogICAgICAgICBpZiAob3V0RnApIGZjbG9zZShvdXRGcCk7CiAKQEAgLTE0MSw2ICsxNDgsMTAgQEAKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKICAgICAgICAgICAgIGZvcm1hdCA9IG51bGxwdHI7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZGVjb2RlckZvcm1hdCk7CisgICAgICAgICAgICBkZWNvZGVyRm9ybWF0ID0gbnVsbHB0cjsKKyAgICAgICAgfQogICAgICAgICBlbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKICAgICAgICAgZGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CkBAIC0yMTQsOCArMjI1LDExIEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJFbmNvZGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKLSAgICAgICAgQUxPR0QoIkVuY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIkVuY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcAppbmRleCBhZDhmMWU2Li5kMTRkMTViIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCkBAIC00OCw4ICs0OCw3IEBACiAgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRXh0cmFjdGlvbiBmYWlsZWQgXG4iOwogCiAgICAgZXh0cmFjdE9iai0+ZGVJbml0RXh0cmFjdG9yKCk7Ci0KLSAgICBleHRyYWN0T2JqLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0KTsKKyAgICBleHRyYWN0T2JqLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCAiIiwgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogCiAgICAgZmNsb3NlKGlucHV0RnApOwogICAgIGRlbGV0ZSBleHRyYWN0T2JqOwpAQCAtNzksOCArNzgsMTEgQEAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwogICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIkV4dHJhY3Rvci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7Ci0gICAgICAgIEFMT0dEKCIgRXh0cmFjdG9yIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJFeHRyYWN0b3IgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL011eGVyVGVzdC5jcHAKaW5kZXggZmEyNjM1ZC4uOTkxNjQ0YiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL011eGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL011eGVyVGVzdC5jcHAKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiTXV4IGZhaWxlZCI7CiAKICAgICAgICAgbXV4ZXJPYmotPmRlSW5pdE11eGVyKCk7Ci0gICAgICAgIG11eGVyT2JqLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0ICsgIi4iICsgZm10LmNfc3RyKCkpOworICAgICAgICBtdXhlck9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCArICIuIiArIGZtdC5jX3N0cigpLCBmbXQsIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CiAgICAgICAgIGZjbG9zZShvdXRwdXRGcCk7CiAgICAgICAgIG11eGVyT2JqLT5yZXNldE11eGVyKCk7CkBAIC0xNTEsOCArMTUxLDExIEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJNdXhlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7Ci0gICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICBBTE9HVigiTXV4ZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKaW5kZXggNjdmMGVhOC4uYzM5N2YzNCAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKKysrIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKQEAgLTMxLDcgKzMxLDcgQEAKICMgNjogUGVyY2VudAogIyBEZWZhdWx0IHZhbHVlIGZvciBkYXRhIG9mIHR5cGUgaW50L2xvbmcgaXMgMiAoYnl0ZXMpLgogIwotIyBTZWUgc3lzdGVtL2NvcmUvbG9nY2F0L2V2ZW50LmxvZ3RhZ3MgZm9yIHRoZSBtYXN0ZXIgY29weSBvZiB0aGUgdGFncy4KKyMgU2VlIHN5c3RlbS9jb3JlL2xvZ2NhdC9ldmVudC5sb2d0YWdzIGZvciB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiB0aGUgdGFncy4KIAogIyA2MTAwMCAtIDYxMTk5IHJlc2VydmVkIGZvciBhdWRpb3NlcnZlcgogCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExMTIzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIiwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tYysrMmEtZXh0ZW5zaW9ucyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJiaW9uaWNfbGliY19wbGF0Zm9ybV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgLy8gRm9yIERFQlVHR0VSX1NJR05BTAorICAgICAgICAic3lzdGVtL2NvcmUvZGVidWdnZXJkL2luY2x1ZGUiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9iYXR0ZXJ5X25vdGlmaWVyIiwKKyAgICBkZWZhdWx0czogWyJsaWJtZWRpYXV0aWxzX2Z1enplcl9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfZnV6emVyX3NjaGVkdWxpbmdfcG9saWN5X3NlcnZpY2UiLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9zZXJ2aWNlX3V0aWxpdGllcyIsCisgICAgZGVmYXVsdHM6IFsibGlibWVkaWF1dGlsc19mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlNlcnZpY2VVdGlsaXRpZXNGdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfdGltZV9jaGVjayIsCisgICAgZGVmYXVsdHM6IFsibGlibWVkaWF1dGlsc19mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlRpbWVDaGVja0Z1enouY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9mdXp6ZXJzL0JhdHRlcnlOb3RpZmllckZ1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9CYXR0ZXJ5Tm90aWZpZXJGdXp6LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGIzY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9CYXR0ZXJ5Tm90aWZpZXJGdXp6LmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorI2luY2x1ZGUgIm1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmgiCisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhPcGVyYXRpb25zID0gMzA7CitzdGF0aWMgY29uc3RleHByIGludCBrTWF4U3RyaW5nTGVuZ3RoID0gNTAwOwordXNpbmcgYW5kcm9pZDo6QmF0dGVyeU5vdGlmaWVyOworCitzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgLypmbGFzaGxpZ2h0X25hbWUqLywgc3RkOjpzdHJpbmcgLypjYW1lcmFfbmFtZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IC8qdmlkZW9faWQqLywgdWlkX3QgLyphdWRpb19pZCovLCB1aWRfdCAvKmxpZ2h0X2lkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgLypjYW1lcmFfaWQqLyk+PgorICAgIG9wZXJhdGlvbnMgPSB7CisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVSZXNldFZpZGVvKCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVSZXNldEF1ZGlvKCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVSZXNldEZsYXNobGlnaHQoKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90LCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVJlc2V0Q2FtZXJhKCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QgdmlkZW9faWQsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdGFydFZpZGVvKHZpZGVvX2lkKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCB1aWRfdCB2aWRlb19pZCwgdWlkX3QsIHVpZF90LCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0b3BWaWRlbyh2aWRlb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90IGF1ZGlvX2lkLCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdGFydEF1ZGlvKGF1ZGlvX2lkKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QgYXVkaW9faWQsIHVpZF90LCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0b3BBdWRpbyhhdWRpb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nIGZsYXNobGlnaHRfbmFtZSwgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QgbGlnaHRfaWQsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OlN0cmluZzggbmFtZShmbGFzaGxpZ2h0X25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZUZsYXNobGlnaHRPbihuYW1lLCBsaWdodF9pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nIGZsYXNobGlnaHRfbmFtZSwgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QgbGlnaHRfaWQsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OlN0cmluZzggbmFtZShmbGFzaGxpZ2h0X25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZUZsYXNobGlnaHRPZmYobmFtZSwgbGlnaHRfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcgY2FtZXJhX25hbWUsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90IGNhbWVyYV9pZCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoY2FtZXJhX25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0YXJ0Q2FtZXJhKG5hbWUsIGNhbWVyYV9pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyBjYW1lcmFfbmFtZSwgdWlkX3QsIHVpZF90LCB1aWRfdCwgdWlkX3QgY2FtZXJhX2lkKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OlN0cmluZzggbmFtZShjYW1lcmFfbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RvcENhbWVyYShuYW1lLCBjYW1lcmFfaWQpOworICAgICAgICB9LAorfTsKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHN0ZDo6c3RyaW5nIGNhbWVyYV9uYW1lID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpOworICAgIHN0ZDo6c3RyaW5nIGZsYXNobGlnaHRfbmFtZSA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKTsKKyAgICB1aWRfdCB2aWRlb19pZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgIHVpZF90IGF1ZGlvX2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgdWlkX3QgbGlnaHRfaWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICB1aWRfdCBjYW1lcmFfaWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICBzaXplX3Qgb3BzX3J1biA9IDA7CisgICAgd2hpbGUgKGRhdGFfcHJvdmlkZXIucmVtYWluaW5nX2J5dGVzKCkgPiAwICYmIG9wc19ydW4rKyA8IGtNYXhPcGVyYXRpb25zKSB7CisgICAgICAgIHVpbnQ4X3Qgb3AgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgb3BlcmF0aW9ucy5zaXplKCkgLSAxKTsKKyAgICAgICAgb3BlcmF0aW9uc1tvcF0oZmxhc2hsaWdodF9uYW1lLCBjYW1lcmFfbmFtZSwgdmlkZW9faWQsIGF1ZGlvX2lkLCBsaWdodF9pZCwgY2FtZXJhX2lkKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9mdXp6ZXJzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlRnV6ei5jcHAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyMTg1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2VGdXp6LmNwcApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCYXR0ZXJ5Tm90aWZpZXJGdXp6ZXIiCisjaW5jbHVkZSA8YmluZGVyL0lCYXR0ZXJ5U3RhdHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCit1c2luZyBhbmRyb2lkOjpJQmF0dGVyeVN0YXRzOwordXNpbmcgYW5kcm9pZDo6SUJpbmRlcjsKK3VzaW5nIGFuZHJvaWQ6OklJbnRlcmZhY2U7Cit1c2luZyBhbmRyb2lkOjpJU2VydmljZU1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwordXNpbmcgYW5kcm9pZDo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6cmVxdWVzdENwdXNldEJvb3N0OwordXNpbmcgYW5kcm9pZDo6cmVxdWVzdFByaW9yaXR5Oworc3A8SUJhdHRlcnlTdGF0cz4gZ2V0QmF0dGVyeVNlcnZpY2UoKSB7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVN0YXRTZXJ2aWNlOworICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOworICAgIGlmIChzbSAhPSBudWxscHRyKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoImJhdHRlcnlzdGF0cyIpOworICAgICAgICBiYXR0ZXJ5U3RhdFNlcnZpY2UgPSBjaGVja2VkX2ludGVyZmFjZV9jYXN0PElCYXR0ZXJ5U3RhdHM+KHNtLT5jaGVja1NlcnZpY2UobmFtZSkpOworICAgICAgICBpZiAoYmF0dGVyeVN0YXRTZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCJiYXR0ZXJ5c3RhdHMgc2VydmljZSB1bmF2YWlsYWJsZSEiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiYXR0ZXJ5U3RhdFNlcnZpY2U7Cit9CitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFfcHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVN0YXRTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2UoKTsKKyAgICAvLyBUaGVyZSBpcyBzb21lIHN0YXRlIGhlcmUsIGJ1dCBpdCdzIG1vc3RseSBmb2N1c2VkIGFyb3VuZCB0aHJlYWQtc2FmZXR5LCBzbworICAgIC8vIHdlIHdvbid0IHdvcnJ5IGFib3V0IG9yZGVyLgorICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGJvb2wgaXNfZm9yX2FwcCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUJvb2woKTsKKyAgICBib29sIGFzeW5jID0gZGF0YV9wcm92aWRlci5Db25zdW1lQm9vbCgpOworICAgIHJlcXVlc3RQcmlvcml0eShnZXRwaWQoKSwgZ2V0dGlkKCksIHByaW9yaXR5LCBpc19mb3JfYXBwLCBhc3luYyk7CisgICAgLy8gVE9ETzogVmVyaWZ5IGFuZCByZS1lbmFibGUgaW4gQU9TUCAoUikuCisgICAgLy8gYm9vbCBlbmFibGUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVCb29sKCk7CisgICAgLy8gV2UgYXJlIGp1c3QgdXNpbmcgYmF0dGVyeXN0YXRzIHRvIGF2b2lkIHRoZSBuZWVkCisgICAgLy8gdG8gcmVnaXN0ZXIgYSBuZXcgc2VydmljZS4KKyAgICAvLyByZXF1ZXN0Q3B1c2V0Qm9vc3QoZW5hYmxlLCBJSW50ZXJmYWNlOjphc0JpbmRlcihiYXR0ZXJ5U3RhdFNlcnZpY2UpKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1NlcnZpY2VVdGlsaXRpZXNGdXp6LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDE0MWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oIgorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4T3BlcmF0aW9ucyA9IDUwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbiA9IDI1NjsKKworY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1enplZERhdGFQcm92aWRlciosIGFuZHJvaWQ6Ok1lZGlhUGFja2FnZU1hbmFnZXIpPj4KKyAgICBvcGVyYXRpb25zID0geworICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFfcHJvdmlkZXIsIGFuZHJvaWQ6Ok1lZGlhUGFja2FnZU1hbmFnZXIgcG0pIC0+IHZvaWQgeworICAgICAgICAgICAgdWlkX3QgdWlkID0gZGF0YV9wcm92aWRlci0+Q29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgICAgICAgICAgcG0uYWxsb3dQbGF5YmFja0NhcHR1cmUodWlkKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhX3Byb3ZpZGVyLCBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyIHBtKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIGludCBzcGFjZXMgPSBkYXRhX3Byb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50PigpOworCisgICAgICAgICAgICAvLyBEdW1wIGV2ZXJ5dGhpbmcgaW50byAvZGV2L251bGwKKyAgICAgICAgICAgIGludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fV1JPTkxZKTsKKyAgICAgICAgICAgIHBtLmR1bXAoZmQsIHNwYWNlcyk7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0sCit9OworCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFfcHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgdWlkX3QgdWlkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgcGlkX3QgcGlkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8cGlkX3Q+KCk7CisKKyAgICAvLyBUaGVyZSBpcyBub3Qgc3RhdGUgaGVyZSwgYW5kIG9yZGVyIGlzIG5vdCBzaWduaWZpY2FudCwKKyAgICAvLyBzbyB3ZSBjYW4gc2ltcGx5IGNhbGwgYWxsIG9mIHRoZSB0YXJnZXQgZnVuY3Rpb25zCisgICAgYW5kcm9pZDo6aXNTZXJ2aWNlVWlkKHVpZCk7CisgICAgYW5kcm9pZDo6aXNBdWRpb1NlcnZlclVpZCh1aWQpOworICAgIGFuZHJvaWQ6OmlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWQpOworICAgIGFuZHJvaWQ6OmlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKHVpZCk7CisgICAgc3RkOjpzdHJpbmcgcGFja2FnZU5hbWVTdHIgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbik7CisgICAgYW5kcm9pZDo6U3RyaW5nMTYgb3BQYWNrYWdlTmFtZShwYWNrYWdlTmFtZVN0ci5jX3N0cigpKTsKKyAgICBhbmRyb2lkOjpyZWNvcmRpbmdBbGxvd2VkKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkKTsKKyAgICBhbmRyb2lkOjpzdGFydFJlY29yZGluZyhvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6ZmluaXNoUmVjb3JkaW5nKG9wUGFja2FnZU5hbWUsIHVpZCk7CisgICAgYW5kcm9pZDo6Y2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6Y2FwdHVyZU1lZGlhT3V0cHV0QWxsb3dlZChwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6Y2FwdHVyZUhvdHdvcmRBbGxvd2VkKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkKTsKKyAgICBhbmRyb2lkOjptb2RpZnlQaG9uZVN0YXRlQWxsb3dlZCh1aWQsIHBpZCk7CisgICAgYW5kcm9pZDo6YnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZCh1aWQsIHBpZCk7CisgICAgYW5kcm9pZDo6c2V0dGluZ3NBbGxvd2VkKCk7CisgICAgYW5kcm9pZDo6bW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOworICAgIGFuZHJvaWQ6Om1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCk7CisgICAgYW5kcm9pZDo6ZHVtcEFsbG93ZWQoKTsKKworICAgIC8vIE1lZGlhUGFja2FnZU1hbmFnZXIgZG9lcyBoYXZlIHN0YXRlLCBzbyB3ZSBuZWVkIHRoZSBmdXp6ZXIgdG8gZGVjaWRlIG9yZGVyCisgICAgYW5kcm9pZDo6TWVkaWFQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlcjsKKyAgICBzaXplX3Qgb3BzX3J1biA9IDA7CisgICAgd2hpbGUgKGRhdGFfcHJvdmlkZXIucmVtYWluaW5nX2J5dGVzKCkgPiAwICYmIG9wc19ydW4rKyA8IGtNYXhPcGVyYXRpb25zKSB7CisgICAgICAgIHVpbnQ4X3Qgb3AgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgb3BlcmF0aW9ucy5zaXplKCkgLSAxKTsKKyAgICAgICAgb3BlcmF0aW9uc1tvcF0oJmRhdGFfcHJvdmlkZXIsIHBhY2thZ2VNYW5hZ2VyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjZiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL1RpbWVDaGVjay5oIgorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4U3RyaW5nTGVuID0gMjU2OworCisvLyBXaGlsZSBpdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byB0ZXN0IGxvbmctcnVubmluZworLy8gam9icywgaXQgc2VlbXMgdW5saWtlbHkgaXQnZCBsZWFkIHRvIHRoZSB0eXBlcyBvZiBjcmFzaGVzCisvLyB3ZSdyZSBsb29raW5nIGZvciwgYW5kIHdvdWxkIG1lYW4gYSBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiBmdXp6ZXIgdGltZS4KKy8vIFRoZXJlZm9yZSwgd2UgYXJlIHNldHRpbmcgYSBsb3cgY2FwLgorc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4VGltZW91dE1zID0gMTAwMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01pblRpbWVvdXRNcyA9IDIwMDsKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIC8vIFRoZXJlJ3MgZXNzZW50aWFsbHkgNSBvcGVyYXRpb25zIHRoYXQgd2UgY2FuIGFjY2VzcyBpbiB0aGlzIGNsYXNzCisgICAgLy8gMS4gVGhlIHRpbWUgaXQgdGFrZXMgdG8gcnVuIHRoaXMgb3BlcmF0aW9uLiBBcyBtZW50aW9uZWQgYWJvdmUsCisgICAgLy8gICAgbG9uZy1ydW5uaW5nIHRhc2tzIGFyZSBub3QgZ29vZCBmb3IgZnV6emluZywgYnV0IHRoZXJlIHdpbGwgYmUKKyAgICAvLyAgICBzb21lIGNoYW5nZSBpbiB0aGUgcnVuIHRpbWUuCisgICAgdWludDMyX3QgdGltZW91dE1zID0KKyAgICAgICAgZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluVGltZW91dE1zLCBrTWF4VGltZW91dE1zKTsKKyAgICB1aW50OF90IHBpZF9zaXplID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxwaWRfdD4gcGlkcyhwaWRfc2l6ZSk7CisgICAgZm9yIChhdXRvJiBwaWQgOiBwaWRzKSB7CisgICAgICAgIHBpZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHBpZF90PigpOworICAgIH0KKworICAgIC8vIDIuIFdlIGFsc28gaGF2ZSBzZXRBdWRpb0hhbFBpZHMsIHdoaWNoIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBwaWRzIHNldAorICAgIC8vIGFib3ZlLgorICAgIGFuZHJvaWQ6OlRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKHBpZHMpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbik7CisKKyAgICAvLyAzLiBUaGUgY29uc3RydWN0b3IsIHdoaWNoIGlzIGZ1enplZCBoZXJlOgorICAgIGFuZHJvaWQ6OlRpbWVDaGVjayB0aW1lQ2hlY2sobmFtZS5jX3N0cigpLCB0aW1lb3V0TXMpOworICAgIC8vIFdlIHdpbGwgbGVhdmUgc29tZSBidWZmZXIgdG8gYXZvaWQgc2xlZXBpbmcgdG9vIGxvbmcKKyAgICB1aW50OF90IHNsZWVwX2Ftb3VudF9tcyA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB0aW1lb3V0TXMgLyAyKTsKKworICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGNhbiBjb3ZlciB0aGUgdGltZSBvdXQgZnVuY3Rpb25hbGl0eS4KKyAgICBpZiAoc2xlZXBfYW1vdW50X21zKSB7CisgICAgICAgIGF1dG8gbXMgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHNsZWVwX2Ftb3VudF9tcyk7CisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcihtcyk7CisgICAgfQorCisgICAgLy8gNC4gRmluYWxseSwgdGhlIGRlc3RydWN0b3Igb24gdGltZWNoZWNrLiBUaGVzZSBzZWVtIHRvIGJlIHRoZSBvbmx5IGZhY3RvcnMKKyAgICAvLyBpbiBwbGF5LgorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBmMDE0MjA5Li4xOTM1Y2RlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtNjg0LDggKzY4NCw4IEBACiAKIHNwPE5CTG9nOjpXcml0ZXI+IEF1ZGlvRmxpbmdlcjo6bmV3V3JpdGVyX2woc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgLy8gSWYgdGhlcmUgaXMgbm8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbG9ncywgcmV0dXJuIGEgZHVtbXkgd3JpdGVyIHRoYXQgZG9lcyBub3RoaW5nLgotICAgIC8vIFNpbWlsYXJseSBpZiB3ZSBjYW4ndCBjb250YWN0IHRoZSBtZWRpYS5sb2cgc2VydmljZSwgYWxzbyByZXR1cm4gYSBkdW1teSB3cml0ZXIuCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbG9ncywgcmV0dXJuIGEgbm8tb3Agd3JpdGVyIHRoYXQgZG9lcyBub3RoaW5nLgorICAgIC8vIFNpbWlsYXJseSBpZiB3ZSBjYW4ndCBjb250YWN0IHRoZSBtZWRpYS5sb2cgc2VydmljZSwgYWxzbyByZXR1cm4gYSBuby1vcCB3cml0ZXIuCiAgICAgaWYgKG1Mb2dNZW1vcnlEZWFsZXIgPT0gMCB8fCBzTWVkaWFMb2dTZXJ2aWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CiAgICAgfQpAQCAtNzExLDcgKzcxMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gRXZlbiBhZnRlciBnYXJiYWdlLWNvbGxlY3RpbmcgYWxsIG9sZCB3cml0ZXJzLCB0aGVyZSBpcyBzdGlsbCBub3QgZW5vdWdoIG1lbW9yeSwKLSAgICAgICAgLy8gc28gcmV0dXJuIGEgZHVtbXkgd3JpdGVyCisgICAgICAgIC8vIHNvIHJldHVybiBhIG5vLW9wIHdyaXRlcgogICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKICAgICB9CiBzdWNjZXNzOgpAQCAtMTI4Myw5ICsxMjgzLDkgQEAKICAgICB9CiAKICAgICAvLyBOb3cgc2V0IHRoZSBtYXN0ZXIgbXV0ZSBpbiBlYWNoIHBsYXliYWNrIHRocmVhZC4gIFBsYXliYWNrIHRocmVhZHMKLSAgICAvLyBhc3NpZ25lZCB0byBIQUxzIHdoaWNoIGRvIG5vdCBoYXZlIG1hc3RlciBtdXRlIHN1cHBvcnQgd2lsbCBhcHBseSBtYXN0ZXIKLSAgICAvLyBtdXRlIGR1cmluZyB0aGUgbWl4IG9wZXJhdGlvbi4gIFRocmVhZHMgd2l0aCBIQUxzIHdoaWNoIGRvIHN1cHBvcnQgbWFzdGVyCi0gICAgLy8gbXV0ZSB3aWxsIHNpbXBseSBpZ25vcmUgdGhlIHNldHRpbmcuCisgICAgLy8gYXNzaWduZWQgdG8gSEFMcyB3aGljaCBkbyBub3QgaGF2ZSBtYXN0ZXIgbXV0ZSBzdXBwb3J0IHdpbGwgYXBwbHkgbWFzdGVyIG11dGUKKyAgICAvLyBkdXJpbmcgdGhlIG1peCBvcGVyYXRpb24uICBUaHJlYWRzIHdpdGggSEFMcyB3aGljaCBkbyBzdXBwb3J0IG1hc3RlciBtdXRlCisgICAgLy8gd2lsbCBzaW1wbHkgaWdub3JlIHRoZSBzZXR0aW5nLgogICAgIFZlY3RvcjxWb2x1bWVJbnRlcmZhY2UgKj4gdm9sdW1lSW50ZXJmYWNlcyA9IGdldEFsbFZvbHVtZUludGVyZmFjZXNfbCgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdm9sdW1lSW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICB2b2x1bWVJbnRlcmZhY2VzW2ldLT5zZXRNYXN0ZXJNdXRlKG11dGVkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCAzZGZlYjgzLi41MjliODdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0yOTIsNiArMjkyLDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFByZXZlbnQgY2FsbHMgdG8gcHJvY2VzcygpIGFuZCBvdGhlciBmdW5jdGlvbnMgb24gZWZmZWN0IGludGVyZmFjZSBmcm9tIG5vdyBvbi4KKyAgICAvLyBUaGUgZWZmZWN0IGVuZ2luZSB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBkZXN0cnVjdG9yIHdoZW4gdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBvbgorICAgIC8vIHRoaXMgb2JqZWN0IGlzIHJlbGVhc2VkIHdoaWNoIGNhbiBoYXBwZW4gYWZ0ZXIgbmV4dCBwcm9jZXNzIGlzIGNhbGxlZC4KICAgICBpZiAobUhhbmRsZXMuc2l6ZSgpID09IDAgJiYgIW1QaW5uZWQpIHsKICAgICAgICAgbVN0YXRlID0gREVTVFJPWUVEOwogICAgIH0KQEAgLTU2NSwyMCArNTY4LDYgQEAKIAogfQogCi1zc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZW1vdmVIYW5kbGVfbChFZmZlY3RIYW5kbGUgKmhhbmRsZSkKLXsKLSAgICBzc2l6ZV90IHN0YXR1cyA9IEVmZmVjdEJhc2U6OnJlbW92ZUhhbmRsZV9sKGhhbmRsZSk7Ci0KLSAgICAvLyBQcmV2ZW50IGNhbGxzIHRvIHByb2Nlc3MoKSBhbmQgb3RoZXIgZnVuY3Rpb25zIG9uIGVmZmVjdCBpbnRlcmZhY2UgZnJvbSBub3cgb24uCi0gICAgLy8gVGhlIGVmZmVjdCBlbmdpbmUgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgZGVzdHJ1Y3RvciB3aGVuIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2Ugb24KLSAgICAvLyB0aGlzIG9iamVjdCBpcyByZWxlYXNlZCB3aGljaCBjYW4gaGFwcGVuIGFmdGVyIG5leHQgcHJvY2VzcyBpcyBjYWxsZWQuCi0gICAgaWYgKHN0YXR1cyA9PSAwICYmICFtUGlubmVkKSB7Ci0gICAgICAgIG1FZmZlY3RJbnRlcmZhY2UtPmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6dXBkYXRlU3RhdGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggMjgyNjI5Ny4uMmM3OWFjNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICBzdGF0dXNfdCBhZGRIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUpOwogICAgIHNzaXplX3QgZGlzY29ubmVjdEhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSwgYm9vbCB1bnBpbklmTGFzdCk7CiAgICAgc3NpemVfdCByZW1vdmVIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUpOwotICAgIHZpcnR1YWwgc3NpemVfdCByZW1vdmVIYW5kbGVfbChFZmZlY3RIYW5kbGUgKmhhbmRsZSk7CisgICAgc3NpemVfdCByZW1vdmVIYW5kbGVfbChFZmZlY3RIYW5kbGUgKmhhbmRsZSk7CiAgICAgRWZmZWN0SGFuZGxlKiBjb250cm9sSGFuZGxlX2woKTsKICAgICBib29sIHB1cmdlSGFuZGxlcygpOwogCkBAIC0yNDAsOCArMjQwLDYgQEAKICAgICAgICAgcmV0dXJuIG1PdXRCdWZmZXIgIT0gMCA/IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1PdXRCdWZmZXItPnB0cigpKSA6IE5VTEw7CiAgICAgfQogCi0gICAgc3NpemVfdCByZW1vdmVIYW5kbGVfbChFZmZlY3RIYW5kbGUgKmhhbmRsZSkgb3ZlcnJpZGU7Ci0KICAgICBzdGF0dXNfdCAgICAgICAgIHNldERldmljZXMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRJbnB1dERldmljZShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOwogICAgIHN0YXR1c190ICAgICAgICAgc2V0Vm9sdW1lKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQsIGJvb2wgY29udHJvbGxlcik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDNlYWNjOGMuLmNkM2M3NDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0yNyw3ICsyNyw2IEBACiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTQwLDYgKzM5LDcgQEAKICNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9NaXhlci5oPgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIlR5cGVkTG9nZ2VyLmgiCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCmluZGV4IGE0MmUwOWMuLjNmMjAyODIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgogI2VuZGlmCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJGYXN0TWl4ZXJEdW1wU3RhdGUuaCIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKaW5kZXggZDAyZDllMC4uMDM0ZDE2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCkBAIC0xLDQgKzEsNCBAQAorZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KLWdrYXN0ZW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IDJhZjI3ZDguLjM4NGRkYjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CkBAIC0zNDgxLDcgKzM0ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIDUgc2Vjb25kcykuCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5MYXRlbmN5ID0gMC4sIG1heExhdGVuY3kgPSA1MDAwLjsKICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA+PSBtaW5MYXRlbmN5ICYmIGxhdGVuY3lNcyA8PSBtYXhMYXRlbmN5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibmV3IGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCJuZXcgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3V0IG9mIHJhbmdlIGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA8IG1pbkxhdGVuY3kpIGxhdGVuY3lNcyA9IG1pbkxhdGVuY3k7CkBAIC0zNTMwLDcgKzM1MzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwgaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CiAgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKQEAgLTM1MzgsNyArMzUzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgIEFMT0dWVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsIGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOwogCkBAIC02ODgxLDcgKzY4ODIsNyBAQAogICAgIHNucHJpbnRmKG1UaHJlYWROYW1lLCBrVGhyZWFkTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7CiAgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbVRocmVhZE5hbWUpOwogCi0gICAgaWYgKG1JbnB1dCAhPSBudWxscHRyICYmIG1JbnB1dC0+YXVkaW9Id0RldiAhPSBudWxscHRyKSB7CisgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0RldiAhPSBudWxscHRyKSB7CiAgICAgICAgIG1Jc01zZERldmljZSA9IHN0cmNtcCgKICAgICAgICAgICAgICAgICBtSW5wdXQtPmF1ZGlvSHdEZXYtPm1vZHVsZU5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMDsKICAgICB9CkBAIC03MzEyLDcgKzczMTMsNyBAQAogCiAgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCA9IG1QaXBlU291cmNlLT5hdmFpbGFibGVUb1JlYWQoKTsKICAgICAgICAgICAgIGlmIChhdmFpbGFibGVUb1JlYWQgPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIFBpcGVTb3VyY2UgaXMgdGhlIG1hc3RlciBjbG9jay4gIEl0IGlzIHVwIHRvIHRoZSBBdWRpb1JlY29yZCBjbGllbnQgdG8ga2VlcCB1cC4KKyAgICAgICAgICAgICAgICAvLyBQaXBlU291cmNlIGlzIHRoZSBwcmltYXJ5IGNsb2NrLiAgSXQgaXMgdXAgdG8gdGhlIEF1ZGlvUmVjb3JkIGNsaWVudCB0byBrZWVwIHVwLgogICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHNpemVfdClhdmFpbGFibGVUb1JlYWQgPiBtUGlwZUZyYW1lc1AyLAogICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgZnJhbWVzIHRvIHJlYWQgdGhhbiBmaWZvIHNpemUsICV6ZCA+ICV6dSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVUb1JlYWQsIG1QaXBlRnJhbWVzUDIpOwpAQCAtNzM3MywxMiArNzM3NCwxMiBAQAogCiAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aW1lc3RhbXBzCiAgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgIHRpbWUgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDEyNjAxNWYuLmQzNjZiYjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0xOTE4LDYgKzE5MTgsMjUgQEAKIHsKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKICAgICByZXN0YXJ0SWZEaXNhYmxlZCgpOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIFBhdGNoVHJhY2sgaGFzIGVub3VnaCBkYXRhIHRvIHdyaXRlIG9uY2UgaW4gcmVsZWFzZUJ1ZmZlcigpLgorICAgIC8vIElmIG5vdCwgcHJldmVudCBhbiB1bmRlcnJ1biBmcm9tIG9jY3VycmluZyBieSBtb3ZpbmcgdGhlIHRyYWNrIGludG8gRlNfRklMTElORzsKKyAgICAvLyB0aGlzIGxvZ2ljIGF2b2lkcyBnbGl0Y2hlcyB3aGVuIHN1c3BlbmRpbmcgQTJEUCB3aXRoIEF1ZGlvUGxheWJhY2tDYXB0dXJlLgorICAgIC8vIFRPRE86IHBlcmhhcHMgdW5kZXJydW4gYXZvaWRhbmNlIGNvdWxkIGJlIGEgdHJhY2sgcHJvcGVydHkgY2hlY2tlZCBpbiBpc1JlYWR5KCkgaW5zdGVhZC4KKyAgICBpZiAobUZpbGxpbmdVcFN0YXR1cyA9PSBGU19BQ1RJVkUKKyAgICAgICAgICAgICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkKKyAgICAgICAgICAgICYmICFpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgaWYgKHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICAgICAgdGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIHNhbXBsZVJhdGUoKQorICAgICAgICAgICAgICAgICAgICAvIHBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkoKSA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpIE5vdCBlbm91Z2ggZGF0YSwgd2FpdCBmb3IgYnVmZmVyIHRvIGZpbGwiLCBfX2Z1bmNfXywgbUlkKTsKKyAgICAgICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTElORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZXN0YXJ0SWZEaXNhYmxlZCgpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCmluZGV4IDZlZjE5YmYuLmZlYjcxZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCkBAIC04MCw3ICs4MCw3IEBACiAKIC8vIFRPRE8gUGVybWl0IGRpc2FibGluZyBvZiBsb2dnaW5nIGF0IGNvbXBpbGUtdGltZS4KIAotLy8gVE9ETyBBIG5vbi1udWxscHRyIGR1bW15IGltcGxlbWVudGF0aW9uIHRoYXQgaXMgYSBub3Agd291bGQgYmUgZmFzdGVyIHRoYW4gY2hlY2tpbmcgZm9yIG51bGxwdHIKKy8vIFRPRE8gQSBub24tbnVsbHB0ciBzdHViIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgYSBub3Agd291bGQgYmUgZmFzdGVyIHRoYW4gY2hlY2tpbmcgZm9yIG51bGxwdHIKIC8vICAgICAgaW4gdGhlIGNhc2Ugd2hlbiBsb2dnaW5nIGlzIGVuYWJsZWQgYXQgY29tcGlsZS10aW1lIGFuZCBlbmFibGVkIGF0IHJ1bnRpbWUsIGJ1dCBpdCBtaWdodCBiZQogLy8gICAgICBzbG93ZXIgdGhhbiBudWxscHRyIGNoZWNrIHdoZW4gbG9nZ2luZyBpcyBlbmFibGVkIGF0IGNvbXBpbGUtdGltZSBhbmQgZGlzYWJsZWQgYXQgcnVudGltZS4KIApAQCAtMTI5LDggKzEyOSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGV4dGVybiAiQyIgewotLy8gVE9ETyBjb25zaWRlciBhZGRpbmcgYSB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciB0bER1bW15TkJMb2dXcml0ZXIgYW5kIHRoZW4KLS8vIGluaXRpYWxpemUgYmVsb3cgdGxOQkxvZ1dyaXRlciB0byAmdGxEdW1teU5CTG9nV3JpdGVyIHRvIHJlbW92ZSB0aGUgbmVlZCB0bworLy8gVE9ETyBjb25zaWRlciBhZGRpbmcgYSB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciB0bFN0dWJOQkxvZ1dyaXRlciBhbmQgdGhlbgorLy8gaW5pdGlhbGl6ZSBiZWxvdyB0bE5CTG9nV3JpdGVyIHRvICZ0bFN0dWJOQkxvZ1dyaXRlciB0byByZW1vdmUgdGhlIG5lZWQgdG8KIC8vIGNoZWNrIGZvciBudWxscHRyIGV2ZXJ5IHRpbWUuIEFsc28gcmVkdWNlcyB0aGUgbmVlZCB0byBhZGQgYSBuZXcgbG9nZ2luZyBtYWNybyBhYm92ZQogLy8gZWFjaCB0aW1lIHdlIHdhbnQgdG8gbG9nIGEgbmV3IHR5cGUuCiBleHRlcm4gdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgKnRsTkJMb2dXcml0ZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKaW5kZXggYTg0ODNmYS4uZGE5ZDMyZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUwpAQCAtMSwzICsxLDIgQEAKIGptdHJpdmlAZ29vZ2xlLmNvbQota3JvY2FyZEBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCmluZGV4IDdjOGNlODMuLjczNmY4YjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCkBAIC0xMjYsNiArMTI2LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQ7CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQ7CkBAIC0xMzksNiArMTQwLDcgQEAKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9TUEVBS0VSOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAppbmRleCBkZDE0OTljLi4wZjliY2MxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKQEAgLTI0OCw3ICsyNDgsOSBAQAogICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKyAgICAvLyBSZXR1cm4gYSBzdHJpbmcgdG8gZGVzY3JpYmUgdGhlIERldmljZVZlY3Rvci4gVGhlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aWxsIG9ubHkgYmUKKyAgICAvLyBhZGRlZCB0byB0aGUgc3RyaW5nIGlmIGBpbmNsdWRlU2Vuc2l0aXZlSW5mb2AgaXMgdHJ1ZS4KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvID0gZmFsc2UpIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAppbmRleCBiOTYzMTIxLi40OTIyZWJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCkBAIC01MTYsNyArNTE2LDcgQEAKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzICVzXG4iLCBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOwogICAgIG1FbmFibGVkRWZmZWN0cy5kdW1wKGRzdCwgMSAvKnNwYWNlcyovLCBmYWxzZSAvKnZlcmJvc2UqLyk7CiAgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1JlY29yZCBDbGllbnRzOlxuIik7CiAgICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggZDZkNDcyYi4uYTJlMmVlYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0yNDUsNyArMjQ1LDcgQEAKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICVzXG4iLCBkZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICVzXG4iLCBkZXZpY2VzKCkudG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgR2xvYmFsIGFjdGl2ZSBjb3VudDogJXVcbiIsIG1HbG9iYWxBY3RpdmVDb3VudCk7CiAgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVJvdXRpbmdBY3Rpdml0aWVzKSB7CiAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUHJvZHVjdCBTdHJhdGVneSBpZDogJWQiLCBpdGVyLmZpcnN0KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKaW5kZXggYTI5ZTYwZS4uNjhhMzJhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKQEAgLTQwOCw3ICs0MDgsNyBAQAogICAgIH0KIH0KIAotc3RkOjpzdHJpbmcgRGV2aWNlVmVjdG9yOjp0b1N0cmluZygpIGNvbnN0CitzdGQ6OnN0cmluZyBEZXZpY2VWZWN0b3I6OnRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8pIGNvbnN0CiB7CiAgICAgaWYgKGlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4geyJBVURJT19ERVZJQ0VfTk9ORSJ9OwpAQCAtNDE4LDcgKzQxOCw3IEBACiAgICAgICAgIGlmIChkZXZpY2UgIT0gKmJlZ2luKCkpIHsKICAgICAgICAgICAgcmVzdWx0ICs9ICI7IjsKICAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZygpOworICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZyhpbmNsdWRlU2Vuc2l0aXZlSW5mbyk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQgKyAifSI7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAppbmRleCBhNzM4OGRhLi5iYzMyNDE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTY1LDYgKzY1LDEyIEBACiAgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CiAKICAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX01FRElBIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiB2b2x1bWVHcm91cD0iYXNzaXN0YW50Ij4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgorICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiIHZvbHVtZUdyb3VwPSJtdXNpYyI+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9HQU1FIi8+IDwvQXR0cmlidXRlcz4KQEAgLTcyLDEyICs3OCw2IEBACiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KLSAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiB2b2x1bWVHcm91cD0iYXNzaXN0YW50Ij4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgotICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgotICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+Ci0gICAgICAgICAgICA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKaW5kZXggYTczODhkYS4uYmMzMjQxNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTY1LDYgKzY1LDEyIEBACiAgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CiAKICAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX01FRElBIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiB2b2x1bWVHcm91cD0iYXNzaXN0YW50Ij4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgorICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiIHZvbHVtZUdyb3VwPSJtdXNpYyI+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9HQU1FIi8+IDwvQXR0cmlidXRlcz4KQEAgLTcyLDEyICs3OCw2IEBACiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KLSAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiB2b2x1bWVHcm91cD0iYXNzaXN0YW50Ij4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgotICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgotICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+Ci0gICAgICAgICAgICA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgogICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IGM1YzEzZTkuLmFlNzE5NTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgpAQCAtNDYxLDcgKzQ2MiwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCisgICAgYXV0byBtdXNpY1N0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgLy8gbXV0ZSBtZWRpYSBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0CisgICAgICAgLy8gVGhpcyBhdm9pZCBzZW5kaW5nIHRoZSBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCisgICAgICAgc2V0U3RyYXRlZ3lNdXRlKG11c2ljU3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CisgICAgfQogICAgIC8vIFRvZ2dsZSB0aGUgZGV2aWNlIHN0YXRlOiBVTkFWQUlMQUJMRSAtPiBBVkFJTEFCTEUKICAgICAvLyBUaGlzIHdpbGwgZm9yY2UgcmVhZGluZyBhZ2FpbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLApAQCAtMTc2NSw3ICsxNzc1LDggQEAKICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCBjbGllbnQtPnZvbHVtZVNvdXJjZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpLCAwIC8qZGVsYXkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dXNlSHdHYWluKCkgLypmb3JjZSovKTsKIAogICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RhcnRpbmcgYW4gb3V0cHV0IHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbgogICAgICAgICAvLyByb3V0aW5nCkBAIC01NDQ2LDYgKzU0NTcsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIERvIG5vdCByZXRyaWV2ZSBlbmdpbmUgZGV2aWNlIGZvciBvdXRwdXRzIHRocm91Z2ggTVNECisgICAgLy8gVE9ETzogc3VwcG9ydCBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIGJ5IHJlc2V0dGluZyBNU0QgcGF0Y2ggdG8gZW5naW5lIGRldmljZS4KKyAgICBpZiAob3V0cHV0RGVzYy0+ZGV2aWNlcygpID09IGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpKSB7CisgICAgICAgIHJldHVybiBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CisgICAgfQorCiAgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKICAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgogICAgIGJvb2wgYWN0aXZlOyAvLyB1bnVzZWQKQEAgLTYwMzEsNyArNjA0OCw4IEBACiAgICAgaWYgKCFJbnRlcnNlY3Rpb24oZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICB7QVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTLAogICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUsCi0gICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRH0pLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlELAorICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVR9KS5lbXB0eSgpICYmCiAgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAogICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwKICAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pKSB8fApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IDFlYzBjNWUuLmI3Mzg2MzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTEyMSw4ICsxMjEsOCBAQAogICAgICAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0cyA9IG1JbnB1dFNvdXJjZXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07Ci0gICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgU3RyaW5nMTYoImFuZHJvaWQiKSwgJmVmZmVjdC0+bVV1aWQsIC0xLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGF1ZGlvU2Vzc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KFN0cmluZzE2KCJhbmRyb2lkIikpOworICAgICAgICAgICAgZngtPnNldChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsIDAsIGF1ZGlvU2Vzc2lvbiwgaW5wdXQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiYWRkSW5wdXRFZmZlY3RzKCk6IGZhaWxlZCB0byBjcmVhdGUgRnggJXMgb24gc291cmNlICVkIiwKQEAgLTI3MCw4ICsyNzAsOCBAQAogICAgICAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0cyA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBlZmZlY3RzW2ldOwotICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsIFN0cmluZzE2KCJhbmRyb2lkIiksICZlZmZlY3QtPm1VdWlkLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbiwgb3V0cHV0KTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChTdHJpbmcxNigiYW5kcm9pZCIpKTsKKyAgICAgICAgICAgIGZ4LT5zZXQoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIDAsIDAsIDAsIGF1ZGlvU2Vzc2lvbiwgb3V0cHV0KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZE91dHB1dFNlc3Npb25FZmZlY3RzKCk6IGZhaWxlZCB0byBjcmVhdGUgRnggICVzIG9uIHNlc3Npb24gJWQiLApAQCAtOTcwLDExICs5NzAsMTEgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZUVmZmVjdHNJdGVyIDogbURldmljZUVmZmVjdHMpIHsKICAgICAgICAgY29uc3QgYXV0byYgZGV2aWNlRWZmZWN0cyA9ICBkZXZpY2VFZmZlY3RzSXRlci5zZWNvbmQ7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWZmZWN0RGVzYyA6IGRldmljZUVmZmVjdHMtPm1FZmZlY3REZXNjcmlwdG9ycy0+bUVmZmVjdHMpIHsKLSAgICAgICAgICAgIGF1dG8gZnggPSBzdGQ6Om1ha2VfdW5pcXVlPEF1ZGlvRWZmZWN0PigKLSAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9VVUlEX05VTEwsIFN0cmluZzE2KCJhbmRyb2lkIiksICZlZmZlY3REZXNjLT5tVXVpZCwgMCwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIEFVRElPX1NFU1NJT05fREVWSUNFLCBBVURJT19JT19IQU5ETEVfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJ7ZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VFZmZlY3RzLT5nZXREZXZpY2VBZGRyZXNzKCl9KTsKKyAgICAgICAgICAgIGF1dG8gZnggPSBzdGQ6Om1ha2VfdW5pcXVlPEF1ZGlvRWZmZWN0PihTdHJpbmcxNigiYW5kcm9pZCIpKTsKKyAgICAgICAgICAgIGZ4LT5zZXQoRUZGRUNUX1VVSURfTlVMTCwgJmVmZmVjdERlc2MtPm1VdWlkLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBBVURJT19TRVNTSU9OX0RFVklDRSwgQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJ7ZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUVmZmVjdHMtPmdldERldmljZUFkZHJlc3MoKX0pOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBwb3J0IHR5cGU9JWQgYWRkcmVzcz0lcyIsIF9fZnVuY19fLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCmluZGV4IGUxNzIxZWEuLmJkZGRmMDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgKQEAgLTc1LDYgKzc1LDEwIEBACiAgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQWN0aXZlUGF0Y2hlcy5maW5kKCpoYW5kbGUpOworICAgICAgICBpZiAoaXRlciAhPSBtQWN0aXZlUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICAgICAgbUFjdGl2ZVBhdGNoZXMuZXJhc2UoKmhhbmRsZSk7CisgICAgICAgIH0KICAgICAgICAgKmhhbmRsZSA9IG1OZXh0UGF0Y2hIYW5kbGUrKzsKICAgICAgICAgbUFjdGl2ZVBhdGNoZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpoYW5kbGUsICpwYXRjaCkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IGFmMWUwMWQuLmI1ZGUxYjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC04MDIsNyArODAyLDcgQEAKIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBmZWF0dXJlSWQsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgYXBpMUNhbWVyYUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgZmVhdHVyZUlkLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwgaW50IGhhbFZlcnNpb24sCiAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CkBAIC05NTgsNyArOTU4LDcgQEAKICAgICBpZiAoIShyZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PigKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+e251bGxwdHJ9LCBpZCwgY2FtZXJhSWQsCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQpLAotICAgICAgICAgICAgaW50ZXJuYWxQYWNrYWdlTmFtZSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKKyAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHt9LCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKICAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluaXRpYWxpemluZyBzaGltIG1ldGFkYXRhOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKQEAgLTE0NzYsNyArMTQ3Niw3IEBACiAgICAgU3RyaW5nOCBpZCA9IGNhbWVyYUlkSW50VG9TdHIoYXBpMUNhbWVyYUlkKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLAotICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwKKyAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLCB7fSwKICAgICAgICAgICAgIGNsaWVudFVpZCwgY2xpZW50UGlkLCBBUElfMSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7CkBAIC0xNTAzLDcgKzE1MDMsNyBAQAogICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCB7fSwgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8xLAogICAgICAgICAgICAgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7CkBAIC0xNTc4LDcgKzE1NzgsNyBAQAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIGNhbWVyYUNiLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4qIGRldmljZSkgewpAQCAtMTYxMiw3ICsxNjEyLDcgQEAKIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgewogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwpAQCAtMjcxNCw3ICsyNzE0LDcgQEAKIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Q2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWRTdHIsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwKQEAgLTI3NTEsMjQgKzI3NTEsMTggQEAKIAogQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OkJhc2ljQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgbUNhbWVyYUlkU3RyKGNhbWVyYUlkU3RyKSwgbUNhbWVyYUZhY2luZyhjYW1lcmFGYWNpbmcpLAotICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUoY2xpZW50UGFja2FnZU5hbWUpLCBtQ2xpZW50RmVhdHVyZUlkKGNsaWVudEZlYXR1cmVJZCksCiAgICAgICAgIG1DbGllbnRQaWQoY2xpZW50UGlkKSwgbUNsaWVudFVpZChjbGllbnRVaWQpLAogICAgICAgICBtU2VydmljZVBpZChzZXJ2aWNlUGlkKSwKICAgICAgICAgbURpc2Nvbm5lY3RlZChmYWxzZSksIG1VaWRJc1RydXN0ZWQoZmFsc2UpLAogICAgICAgICBtQXVkaW9SZXN0cmljdGlvbihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OkFVRElPX1JFU1RSSUNUSU9OX05PTkUpLAogICAgICAgICBtUmVtb3RlQmluZGVyKHJlbW90ZUNhbGxiYWNrKQogewotICAgIGlmIChjbGllbnRGZWF0dXJlSWQpIHsKLSAgICAgICAgbUNsaWVudEZlYXR1cmVJZCA9IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4obmV3IFN0cmluZzE2KCpjbGllbnRGZWF0dXJlSWQpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ2xpZW50RmVhdHVyZUlkID0gc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpOwotICAgIH0KLQogICAgIGlmIChzQ2FtZXJhU2VydmljZSA9PSBudWxscHRyKSB7CiAgICAgICAgIHNDYW1lcmFTZXJ2aWNlID0gY2FtZXJhU2VydmljZTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggNDMyMTIwMS4uMzVlMTNlNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgpAQCAtMTQxLDcgKzE0Miw3IEBACiAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgICBjb25uZWN0RGV2aWNlKAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4qIGRldmljZSk7CkBAIC0yOTgsNyArMjk5LDcgQEAKICAgICAgICAgQmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCkBAIC0zMTgsNyArMzE5LDcgQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHI7CiAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUZhY2luZzsKICAgICAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWU7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4gICAgICAgbUNsaWVudEZlYXR1cmVJZDsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4gICAgICAgICBtQ2xpZW50RmVhdHVyZUlkOwogICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsKICAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgICAgICBtU2VydmljZVBpZDsKQEAgLTM5MCw3ICszOTEsNyBAQAogICAgICAgICBDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKQEAgLTcyOCw3ICs3MjksNyBAQAogICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiAgICAgYmluZGVyOjpTdGF0dXMgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwogCiAgICAgLy8gTG9jayBndWFyZGluZyBjYW1lcmEgc2VydmljZSBzdGF0ZQpAQCAtMTA1Nyw3ICsxMDU4LDcgQEAKIAogICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBtYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBmZWF0dXJlSWQsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgYXBpMUNhbWVyYUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBpbnQgaGFsVmVyc2lvbiwKICAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBiMDQzYzBiLi4wOWUyYzNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIENhbWVyYTJDbGllbnQ6OkNhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhRGV2aWNlSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDAzY2E0NGEuLmY4ZGEwYjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05NCw3ICs5NCw3IEBACiAgICAgQ2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYURldmljZUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKaW5kZXggODkyOTk2Yy4uYjg2MGNlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcApAQCAtMzQsNyArMzQsNyBAQAogCiBDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQpOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggYTdlYjk2MC4uYWFjYjAwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC02OCw3ICs2OCw3IEBACiAgICAgQ2FtZXJhQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggZTM1YjQzNi4uMDIyZDY4NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtODAsNyArODAsNyBAQAogQ2FtZXJhRGV2aWNlQ2xpZW50OjpDYW1lcmFEZXZpY2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IDlkMzg3NGYuLjVjZDE2ZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtNTAsNyArNTAsNyBAQAogICAgIENhbWVyYURldmljZUNsaWVudEJhc2UoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICBDYW1lcmFEZXZpY2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgKaW5kZXggYjY3ZmNiMy4uMDM2MjFjOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaApAQCAtNDgsNyArNDgsNyBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIHNwPENvbXBvc2l0ZVN0cmVhbT4+JiBvZmZsaW5lQ29tcG9zaXRlU3RyZWFtTWFwLAogICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCkgOgogICAgICAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCAwYTQxNzc2Li42MDk2OThjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCAwNDJmNWFhLi5kNzUwNmFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtNDgsNyArNDgsNyBAQAogICAgIENhbWVyYTJDbGllbnRCYXNlKGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBhNDYxMzNlLi45ZWE5NTI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgfQogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MgPSBoeWJyaWRDYWxsYmFja3M7CiAgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IG1BaWRsSUNhbWVyYVNlcnZpY2UtPmNvbm5lY3REZXZpY2UoCi0gICAgICAgICAgICBjYWxsYmFja3MsIFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCBTdHJpbmcxNigiIiksIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwKKyAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwge30sCiAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOwogICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CiAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCmluZGV4IGM0ZWZiYWEuLjA1YmJiYzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTE1LDE4ICsxNSw2IEBACiAgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICBdLAogCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KLSAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgIH0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCmluZGV4IDBiMjVkNjIuLjAzZTFlNDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApAQCAtMzUsMjAgKzM1LDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsIiwKICAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJiaW9uaWNfbGliY19wbGF0Zm9ybV9oZWFkZXJzIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBwcm9kdWN0X3ZhcmlhYmxlczogewotICAgICAgICAgICAgICAgIG1hbGxvY19ub3Rfc3ZlbHRlOiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNjdWRvIGluY3JlYXNlcyBtZW1vcnkgZm9vdHByaW50LCBzbyBvbmx5IGVuYWJsZSBvbgotICAgICAgICAgICAgICAgICAgICAvLyBub24tc3ZlbHRlIGRldmljZXMuCi0gICAgICAgICAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbImxpYmNfc2N1ZG8iXSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICB9LAogICAgIGluaXRfcmM6IFsibWVkaWFleHRyYWN0b3IucmMiXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggOTk5MmQxYy4uNzFhNWJmZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0zOSwyMyArMzksMjMgQEAKIAogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IoCiAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJRGF0YVNvdXJjZT4mIHJlbW90ZVNvdXJjZSwKLSAgICAgICAgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAorICAgICAgICBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAogICAgICAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SU1lZGlhRXh0cmFjdG9yPiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZS5nZXQoKS0+Y19zdHIoKSk7CisgICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZSA/IG1pbWUtPmNfc3RyKCkgOiBudWxscHRyKTsKIAogICAgIHNwPERhdGFTb3VyY2U+IGxvY2FsU291cmNlID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShyZW1vdGVTb3VyY2UpOwogCiAgICAgTWVkaWFCdWZmZXI6OnVzZVNoYXJlZE1lbW9yeSgpOwogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZSgKICAgICAgICAgICAgIGxvY2FsU291cmNlLAotICAgICAgICAgICAgbWltZS5nZXQoKSA/IG1pbWUuZ2V0KCktPmNfc3RyKCkgOiBudWxscHRyKTsKKyAgICAgICAgICAgIG1pbWUgPyBtaW1lLT5jX3N0cigpIDogbnVsbHB0cik7CiAKICAgICBBTE9HVigiZXh0cmFjdG9yIHNlcnZpY2UgY3JlYXRlZCAlcCAoJXMpIiwKICAgICAgICAgICAgIGV4dHJhY3Rvci5nZXQoKSwKICAgICAgICAgICAgIGV4dHJhY3RvciA9PSBudWxscHRyID8gIiIgOiBleHRyYWN0b3ItPm5hbWUoKSk7CiAKICAgICBpZiAoZXh0cmFjdG9yICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVnaXN0ZXJNZWRpYUV4dHJhY3RvcihleHRyYWN0b3IsIGxvY2FsU291cmNlLCBtaW1lLmdldCgpID8gbWltZS5nZXQoKS0+Y19zdHIoKSA6IG51bGxwdHIpOworICAgICAgICByZWdpc3Rlck1lZGlhRXh0cmFjdG9yKGV4dHJhY3RvciwgbG9jYWxTb3VyY2UsIG1pbWUgPyBtaW1lLT5jX3N0cigpIDogbnVsbHB0cik7CiAgICAgfQogICAgICpfYWlkbF9yZXR1cm4gPSBleHRyYWN0b3I7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCAxYjQwYmY5Li4wMDgxZTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMzMsNyArMzMsNyBAQAogCiAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG1ha2VFeHRyYWN0b3IoCiAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SURhdGFTb3VyY2U+JiBzb3VyY2UsCi0gICAgICAgICAgICBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCisgICAgICAgICAgICBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAogICAgICAgICAgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklNZWRpYUV4dHJhY3Rvcj4qIF9haWRsX3JldHVybik7CiAKICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWFrZUlEYXRhU291cmNlKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKaW5kZXggZjIxNTc0Zi4uYjdiNTFhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCkBAIC0yOCw4ICsyOCw2IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKLSNpbmNsdWRlIDxiaW9uaWMvcmVzZXJ2ZWRfc2lnbmFscy5oPgotCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKICNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclNlcnZpY2UuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgpAQCAtNTAsMTAgKzQ4LDYgQEAKIAogICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKIAotICAgIC8vIERvIG5vdCBhc3Npc3QgcGxhdGZvcm0gcHJvZmlsZXJzIChyZWxldmFudCBvbmx5IG9uIGRlYnVnIGJ1aWxkcykuCi0gICAgLy8gT3RoZXJ3aXNlLCB0aGUgc2lnbmFsIGhhbmRsZXIgY2FuIHZpb2xhdGUgdGhlIHNlY2NvbXAgcG9saWN5LgotICAgIHNpZ25hbChCSU9OSUNfU0lHTkFMX1BST0ZJTEVSLCBTSUdfSUdOKTsKLQogICAgIC8vYi82MjI1NTk1OTogdGhpcyBmb3JjZXMgbGlidXRpcy5zbyB0byBkbG9wZW4gdmVuZG9yIHZlcnNpb24gb2YgbGlidXRpbHMuc28KICAgICAvL2JlZm9yZSBtaW5pamFpbCBpcyBvbi4gVGhpcyBpcyBkaXJ0eSBidXQgcmVxdWlyZWQgc2luY2Ugc29tZSBzeXNjYWxscyBzdWNoCiAgICAgLy9hcyBwcmVhZDY0IGFyZSB1c2VkIGJ5IGxpbmtlciBidXQgYXJlbid0IGFsbG93ZWQgaW4gdGhlIG1pbmlqYWlsLiBCeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKaW5kZXggYTM1MTlkNS4uMGQ1M2M1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsNCBAQAotCi0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKIAogICAgIHNyY3M6IFsKQEAgLTI1LDUgKzIzLDQgQEAKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaAppbmRleCBlZTk4MmI3Li40OWMyNDdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCkBAIC00Myw3ICs0Myw3IEBACiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYVJlc291cmNlUG9saWN5UGFyY2VsOwogCiB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6dHVwbGU8Ci0gICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUsIHN0ZDo6dmVjdG9yPGludDhfdD4+LAorICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlLCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4sCiAgICAgICAgIE1lZGlhUmVzb3VyY2VQYXJjZWw+IFJlc291cmNlTGlzdDsKIAogc3RydWN0IFJlc291cmNlSW5mbyB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKaW5kZXggYjZjNTQ4Yy4uNmIyZWY2OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icApAQCAtMywxMiArMywxMiBAQAogICAgIG5hbWU6ICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QiLAogICAgIHNyY3M6IFsiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcCJdLAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgaW5jbHVkZV9kaXJzOiBbCkBAIC0xOSwxNyArMTksMTYgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIlNlcnZpY2VMb2dfdGVzdCIsCiAgICAgc3JjczogWyJTZXJ2aWNlTG9nX3Rlc3QuY3BwIl0sCiAgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTQwLDUgKzM5LDQgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAppbmRleCAxNzM0N2E5Li44Y2YyZDYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCkBAIC00NCwxOCArNDQsNiBAQAogICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAogICAgIF0sCiAKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogewotICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgotICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQogICAgIGluaXRfcmM6IFsibWVkaWF0cmFuc2NvZGluZy5yYyJdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCmluZGV4IDAxYjFjMmUuLmYyY2YwMTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICB9CiAgICAgaW50MzJfdCBjYXBhY2l0eUluRnJhbWVzID0gbnVtQnVyc3RzICogZnJhbWVzUGVyQnVyc3Q7CiAKLSAgICAvLyBGaW5hbCBzYW5pdHkgY2hlY2suCisgICAgLy8gRmluYWwgcmFuZ2UgY2hlY2suCiAgICAgaWYgKGNhcGFjaXR5SW5GcmFtZXMgPiBNQVhfRlJBTUVTX1BFUl9CVUZGRVIpIHsKICAgICAgICAgQUxPR0UoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgY2FsYyBjYXBhY2l0eSAlZCA+IG1heCAlZCIsCiAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsIE1BWF9GUkFNRVNfUEVSX0JVRkZFUik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKaW5kZXggYzQzZWQyMi4uNzhkNDg4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlICJTaGFyZWRNZW1vcnlQcm94eS5oIgo=