ZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icAppbmRleCBhOWZhZDU1Li5mYWRlNmM1IDEwMDY0NAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0xMDIsMTEgKzEwMiw3IEBACiAgICAgICAgICJzaWduX3ZpcnRfYXBleC5weSIsCiAgICAgXSwKICAgICB2ZXJzaW9uOiB7Ci0gICAgICAgIHB5MjogewotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCi0gICAgICAgIH0sCiAgICAgICAgIHB5MzogewotICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCkBAIC0xNzAsMTEgKzE2Niw3IEBACiAgICAgICAgICJyZXBsYWNlX2J5dGVzLnB5IiwKICAgICBdLAogICAgIHZlcnNpb246IHsKLSAgICAgICAgcHkyOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKICAgICAgICAgcHkzOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKZGlmZiAtLWdpdCBhL2FwZXgvcHJvZHVjdF9wYWNrYWdlcy5tayBiL2FwZXgvcHJvZHVjdF9wYWNrYWdlcy5tawppbmRleCBlYzI5NWY1Li41YmMwMDQ0IDEwMDY0NAotLS0gYS9hcGV4L3Byb2R1Y3RfcGFja2FnZXMubWsKKysrIGIvYXBleC9wcm9kdWN0X3BhY2thZ2VzLm1rCkBAIC0zMiw0ICszMiw0IEBACiAKIFBST0RVQ1RfU1lTVEVNX0VYVF9QUk9QRVJUSUVTIDo9IHJvLmNvbmZpZy5pc29sYXRlZF9jb21waWxhdGlvbl9lbmFibGVkPXRydWUKIAotUFJPRFVDVF9TWVNURU1fRlNWRVJJVFlfR0VORVJBVEVfTUVUQURBVEEgOj0gdHJ1ZQorUFJPRFVDVF9GU1ZFUklUWV9HRU5FUkFURV9NRVRBREFUQSA6PSB0cnVlCmRpZmYgLS1naXQgYS9hdm1kL0FuZHJvaWQuYnAgYi9hdm1kL0FuZHJvaWQuYnAKaW5kZXggZGM2YTg5Ni4uNmQ5MWI1OSAxMDA2NDQKLS0tIGEvYXZtZC9BbmRyb2lkLmJwCisrKyBiL2F2bWQvQW5kcm9pZC5icApAQCAtMTEsNiArMTEsNyBAQAogICAgIHJ1c3RsaWJzOiBbCiAgICAgICAgICJsaWJzZXJkZSIsCiAgICAgICAgICJsaWJhcGV4dXRpbF9ydXN0IiwgLy8gVE9ETyhiLzIzOTQxMzQxNik6IFJlbW92ZSB0aGlzIGFmdGVyIGFkZGluZyBoZXgKKyAgICAgICAgImxpYmFwa3ZlcmlmeSIsCiAgICAgXSwKIH0KIApAQCAtNDAsNiArNDEsOSBAQAogICAgIG5hbWU6ICJhdm1kdG9vbF90ZXN0cyIsCiAgICAgc3JjczogWyJ0ZXN0cy8qX3Rlc3QucnMiXSwKICAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYnRlbXBmaWxlIiwKKyAgICBdLAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCiAgICAgZGF0YV9iaW5zOiBbImF2bWR0b29sIl0sCiAgICAgZGF0YTogWyJ0ZXN0cy9kYXRhLyoiXSwKZGlmZiAtLWdpdCBhL2F2bWQvc3JjL2F2bWQucnMgYi9hdm1kL3NyYy9hdm1kLnJzCmluZGV4IDUwY2RmZGYuLjA1ZmMyMDEgMTAwNjQ0Ci0tLSBhL2F2bWQvc3JjL2F2bWQucnMKKysrIGIvYXZtZC9zcmMvYXZtZC5ycwpAQCAtMTksNiArMTksNyBAQAogICAgIHZlYzo6VmVjLAogfTsKIHVzZSBhcGV4dXRpbDo6dG9faGV4X3N0cmluZzsKK3VzZSBhcGt2ZXJpZnk6OlNpZ25hdHVyZUFsZ29yaXRobUlEOwogdXNlIGNvcmU6OmZtdDsKIHVzZSBzZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJpYWxpemV9OwogCkBAIC0xMjAsNyArMTIxLDcgQEAKICAgICAvLy8gSXQgc2hvdWxkIGJlIG9uZSBvZiB0aGUgYWxnb3JpdGhtcyBpbiB0aGUgW2xpc3RdW10uCiAgICAgLy8vCiAgICAgLy8vIFtsaXN0XTogaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vc2VjdXJpdHkvYXBrc2lnbmluZy92MiNzaWduYXR1cmUtYWxnb3JpdGhtLWlkcwotICAgIHB1YiBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiB1MzIsCisgICAgcHViIHNpZ25hdHVyZV9hbGdvcml0aG1faWQ6IFNpZ25hdHVyZUFsZ29yaXRobUlELAogICAgIC8vLyBEaWdlc3Qgb2YgdGhlIEFQSydzIHYzIHNpZ25pbmcgYmxvY2suIFRPRE86IGZpeAogICAgIHB1YiBhcGtfZGlnZXN0OiBWZWM8dTg+LAogfQpAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgICAgIHdyaXRlbG4hKGYsICIgIEFQSyBkZXNjcmlwdG9yOiIpPzsKICAgICAgICAgd3JpdGVsbiEoZiwgIiAgICBuYW1lc3BhY2U6ICAgICAgICAgICAgIHt9Iiwgc2VsZi5yZXNvdXJjZS5uYW1lc3BhY2UpPzsKICAgICAgICAgd3JpdGVsbiEoZiwgIiAgICBuYW1lOiAgICAgICAgICAgICAgICAgIHt9Iiwgc2VsZi5yZXNvdXJjZS5uYW1lKT87Ci0gICAgICAgIHdyaXRlbG4hKGYsICIgICAgU2lnbmluZyBhbGdvcml0aG0gSUQ6ICB7OiN4fSIsIHNlbGYuc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk/OworICAgICAgICB3cml0ZWxuIShmLCAiICAgIFNpZ25pbmcgYWxnb3JpdGhtIElEOiAgezojMDR4fSIsIHNlbGYuc2lnbmF0dXJlX2FsZ29yaXRobV9pZC50b191MzIoKSk/OwogICAgICAgICB3cml0ZWxuIShmLCAiICAgIEFQSyBkaWdlc3Q6ICAgICAgICAgICAge30iLCB0b19oZXhfc3RyaW5nKCZzZWxmLmFwa19kaWdlc3QpKT87CiAgICAgICAgIE9rKCgpKQogICAgIH0KZGlmZiAtLWdpdCBhL2F2bWQvdGVzdHMvYXZtZHRvb2xfdGVzdC5ycyBiL2F2bWQvdGVzdHMvYXZtZHRvb2xfdGVzdC5ycwppbmRleCBkOTNjYjZmLi40NjQ3ZjA2IDEwMDY0NAotLS0gYS9hdm1kL3Rlc3RzL2F2bWR0b29sX3Rlc3QucnMKKysrIGIvYXZtZC90ZXN0cy9hdm1kdG9vbF90ZXN0LnJzCkBAIC0xNiwxOSArMTYsNTAgQEAKIAogdXNlIHN0ZDo6ZnM7CiB1c2Ugc3RkOjpwcm9jZXNzOjpDb21tYW5kOwordXNlIHRlbXBmaWxlOjpUZW1wRGlyOwogCiAjW3Rlc3RdCiBmbiB0ZXN0X2R1bXAoKSB7Ci0gICAgLy8gdGVzdC5hdm1kIGlzIGdlbmVyYXRlZCB3aXRoCi0gICAgLy8gYGBgCi0gICAgLy8gYXZtZHRvb2wgY3JlYXRlIC90bXAvdGVzdC5hbXZkIFwKLSAgICAvLyAtLWFwZXgtcGF5bG9hZCBtaWNyb2Ryb2lkIHZibWV0YSAuL2xpYnMvYXBleHV0aWwvdGVzdHMvZGF0YS90ZXN0LmFwZXggXAotICAgIC8vIC0tYXBrIG1pY3JvZHJvaWRfbWFuYWdlciBhcGsgXAotICAgIC8vIC4vbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni00MDk2LmFwayBcCi0gICAgLy8gLS1hcGsgbWljcm9kcm9pZF9tYW5hZ2VyIGV4dHJhLWFwayAuL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFwawotICAgIC8vYGBgCi0gICAgbGV0IG91dHB1dCA9Ci0gICAgICAgIENvbW1hbmQ6Om5ldygiLi9hdm1kdG9vbCIpLmFyZ3MoWyJkdW1wIiwgInRlc3RzL2RhdGEvdGVzdC5hdm1kIl0pLm91dHB1dCgpLnVud3JhcCgpOworICAgIGxldCBmaWxlbmFtZSA9ICJ0ZXN0cy9kYXRhL3Rlc3QuYXZtZCI7CisgICAgYXNzZXJ0ISgKKyAgICAgICAgZnM6Om1ldGFkYXRhKGZpbGVuYW1lKS5pc19vaygpLAorICAgICAgICAiRmlsZSAne30nIGRvZXMgbm90IGV4aXN0LiBZb3UgY2FuIHJlLWNyZWF0ZSBpdCB3aXRoOgorICAgIGF2bWR0b29sIGNyZWF0ZSB7fSBcXAorICAgIC0tYXBleC1wYXlsb2FkIG1pY3JvZHJvaWQgdmJtZXRhIHRlc3RzL2RhdGEvdGVzdC5hcGV4IFxcCisgICAgLS1hcGsgbWljcm9kcm9pZF9tYW5hZ2VyIGFwayBcXAorICAgIHRlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsgXFwKKyAgICAtLWFwayBtaWNyb2Ryb2lkX21hbmFnZXIgZXh0cmEtYXBrIHRlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFwayIsCisgICAgICAgIGZpbGVuYW1lLAorICAgICAgICBmaWxlbmFtZQorICAgICk7CisgICAgbGV0IG91dHB1dCA9IENvbW1hbmQ6Om5ldygiLi9hdm1kdG9vbCIpLmFyZ3MoWyJkdW1wIiwgZmlsZW5hbWVdKS5vdXRwdXQoKS51bndyYXAoKTsKICAgICBhc3NlcnQhKG91dHB1dC5zdGF0dXMuc3VjY2VzcygpKTsKICAgICBhc3NlcnRfZXEhKG91dHB1dC5zdGRvdXQsIGZzOjpyZWFkKCJ0ZXN0cy9kYXRhL3Rlc3QuYXZtZC5kdW1wIikudW53cmFwKCkpOwogfQorCisjW3Rlc3RdCitmbiB0ZXN0X2NyZWF0ZSgpIHsKKyAgICBsZXQgdGVzdF9kaXIgPSBUZW1wRGlyOjpuZXcoKS51bndyYXAoKTsKKyAgICBsZXQgdGVzdF9maWxlX3BhdGggPSB0ZXN0X2Rpci5wYXRoKCkuam9pbigidG1wX3Rlc3QuYW12ZCIpOworICAgIGxldCBvdXRwdXQgPSBDb21tYW5kOjpuZXcoIi4vYXZtZHRvb2wiKQorICAgICAgICAuYXJncyhbCisgICAgICAgICAgICAiY3JlYXRlIiwKKyAgICAgICAgICAgIHRlc3RfZmlsZV9wYXRoLnRvX3N0cigpLnVud3JhcCgpLAorICAgICAgICAgICAgIi0tYXBleC1wYXlsb2FkIiwKKyAgICAgICAgICAgICJtaWNyb2Ryb2lkIiwKKyAgICAgICAgICAgICJ2Ym1ldGEiLAorICAgICAgICAgICAgInRlc3RzL2RhdGEvdGVzdC5hcGV4IiwKKyAgICAgICAgICAgICItLWFwayIsCisgICAgICAgICAgICAibWljcm9kcm9pZF9tYW5hZ2VyIiwKKyAgICAgICAgICAgICJhcGsiLAorICAgICAgICAgICAgInRlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsiLAorICAgICAgICAgICAgIi0tYXBrIiwKKyAgICAgICAgICAgICJtaWNyb2Ryb2lkX21hbmFnZXIiLAorICAgICAgICAgICAgImV4dHJhLWFwayIsCisgICAgICAgICAgICAidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtc3RhbXAuYXBrIiwKKyAgICAgICAgXSkKKyAgICAgICAgLm91dHB1dCgpCisgICAgICAgIC51bndyYXAoKTsKKyAgICBhc3NlcnQhKG91dHB1dC5zdGF0dXMuc3VjY2VzcygpKTsKKyAgICBhc3NlcnRfZXEhKGZzOjpyZWFkKHRlc3RfZmlsZV9wYXRoKS51bndyYXAoKSwgZnM6OnJlYWQoInRlc3RzL2RhdGEvdGVzdC5hdm1kIikudW53cmFwKCkpOworfQpkaWZmIC0tZ2l0IGEvYXZtZC90ZXN0cy9kYXRhL3Rlc3QuYXBleCBiL2F2bWQvdGVzdHMvZGF0YS90ZXN0LmFwZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3OTM2NQotLS0gL2Rldi9udWxsCisrKyBiL2F2bWQvdGVzdHMvZGF0YS90ZXN0LmFwZXgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXZtZC90ZXN0cy9kYXRhL3Rlc3QuYXZtZCBiL2F2bWQvdGVzdHMvZGF0YS90ZXN0LmF2bWQKaW5kZXggNTJlNjM0Zi4uZTU2NzEyNSAxMDA2NDQKLS0tIGEvYXZtZC90ZXN0cy9kYXRhL3Rlc3QuYXZtZAorKysgYi9hdm1kL3Rlc3RzL2RhdGEvdGVzdC5hdm1kCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2F2bWQvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni00MDk2LmFwayBiL2F2bWQvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni00MDk2LmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzkzOTFjCi0tLSAvZGV2L251bGwKKysrIGIvYXZtZC90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTQwOTYuYXBrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2F2bWQvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtc3RhbXAuYXBrIGIvYXZtZC90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2NTIxNAotLS0gL2Rldi9udWxsCisrKyBiL2F2bWQvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtc3RhbXAuYXBrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbXBvcy9iZW5jaG1hcmsvQW5kcm9pZC5icCBiL2NvbXBvcy9iZW5jaG1hcmsvQW5kcm9pZC5icAppbmRleCAzN2FmODdlLi4zZDQ2YTM5IDEwMDY0NAotLS0gYS9jb21wb3MvYmVuY2htYXJrL0FuZHJvaWQuYnAKKysrIGIvY29tcG9zL2JlbmNobWFyay9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiw3IEBACiAgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bm5lciIsCiAgICAgICAgICJhbmRyb2lkeC50ZXN0LmV4dC5qdW5pdCIsCiAgICAgICAgICJNaWNyb2Ryb2lkRGV2aWNlVGVzdEhlbHBlciIsCisgICAgICAgICJNaWNyb2Ryb2lkVGVzdEhlbHBlciIsCiAgICAgICAgICJ0cnV0aC1wcmVidWlsdCIsCiAgICAgXSwKICAgICBwbGF0Zm9ybV9hcGlzOiB0cnVlLApkaWZmIC0tZ2l0IGEvY29tcG9zL2JlbmNobWFyay9zcmMvamF2YS9jb20vYW5kcm9pZC9jb21wb3MvYmVuY2htYXJrL0NvbXBvc0JlbmNobWFyay5qYXZhIGIvY29tcG9zL2JlbmNobWFyay9zcmMvamF2YS9jb20vYW5kcm9pZC9jb21wb3MvYmVuY2htYXJrL0NvbXBvc0JlbmNobWFyay5qYXZhCmluZGV4IDIxYjJlY2QuLjk5NmQzMmEgMTAwNjQ0Ci0tLSBhL2NvbXBvcy9iZW5jaG1hcmsvc3JjL2phdmEvY29tL2FuZHJvaWQvY29tcG9zL2JlbmNobWFyay9Db21wb3NCZW5jaG1hcmsuamF2YQorKysgYi9jb21wb3MvYmVuY2htYXJrL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2NvbXBvcy9iZW5jaG1hcmsvQ29tcG9zQmVuY2htYXJrLmphdmEKQEAgLTI2LDggKzI2LDExIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgY29tLmFuZHJvaWQubWljcm9kcm9pZC50ZXN0LmNvbW1vbi5NZXRyaWNzUHJvY2Vzc29yOworaW1wb3J0IGNvbS5hbmRyb2lkLm1pY3JvZHJvaWQudGVzdC5jb21tb24uUHJvY2Vzc1V0aWw7CiBpbXBvcnQgY29tLmFuZHJvaWQubWljcm9kcm9pZC50ZXN0LmRldmljZS5NaWNyb2Ryb2lkRGV2aWNlVGVzdEJhc2U7CiAKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC00MCwxMSArNDMsMTUgQEAKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCi0KIEBSdW5XaXRoKEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBDb21wb3NCZW5jaG1hcmsgZXh0ZW5kcyBNaWNyb2Ryb2lkRGV2aWNlVGVzdEJhc2UgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29tcG9zQmVuY2htYXJrIjsKQEAgLTUzLDEwMCArNjAsMTA2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE5BTk9TX0lOX1NFQyA9IDFfMDAwXzAwMF8wMDAuMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUUklDX1BSRUZJWCA9ICJhdmZfcGVyZi9jb21wb3MvIjsKIAorICAgIHByaXZhdGUgZmluYWwgTWV0cmljc1Byb2Nlc3NvciBtTWV0cmljc1Byb2Nlc3NvciA9IG5ldyBNZXRyaWNzUHJvY2Vzc29yKE1FVFJJQ19QUkVGSVgpOworCiAgICAgcHJpdmF0ZSBJbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbjsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKICAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpLmFkb3B0U2hlbGxQZXJtaXNzaW9uSWRlbnRpdHkoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcmVwb3J0TWV0cmljKFN0cmluZyBuYW1lLCBTdHJpbmcgdW5pdCwgZG91YmxlW10gdmFsdWVzKSB7Ci0gICAgICAgIGRvdWJsZSBzdW0gPSAwOwotICAgICAgICBkb3VibGUgc3F1YXJlU3VtID0gMDsKLSAgICAgICAgZG91YmxlIG1pbiA9IERvdWJsZS5NQVhfVkFMVUU7Ci0gICAgICAgIGRvdWJsZSBtYXggPSBEb3VibGUuTUlOX1ZBTFVFOwotCi0gICAgICAgIGZvciAoZG91YmxlIHZhbCA6IHZhbHVlcykgewotICAgICAgICAgICAgc3VtICs9IHZhbDsKLSAgICAgICAgICAgIHNxdWFyZVN1bSArPSB2YWwgKiB2YWw7Ci0gICAgICAgICAgICBtaW4gPSB2YWwgPCBtaW4gPyB2YWwgOiBtaW47Ci0gICAgICAgICAgICBtYXggPSB2YWwgPiBtYXggPyB2YWwgOiBtYXg7Ci0gICAgICAgIH0KLQotICAgICAgICBkb3VibGUgYXZlcmFnZSA9IHN1bSAvIHZhbHVlcy5sZW5ndGg7Ci0gICAgICAgIGRvdWJsZSB2YXJpYW5jZSA9IHNxdWFyZVN1bSAvIHZhbHVlcy5sZW5ndGggLSBhdmVyYWdlICogYXZlcmFnZTsKLSAgICAgICAgZG91YmxlIHN0ZGV2ID0gTWF0aC5zcXJ0KHZhcmlhbmNlKTsKLQotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0RG91YmxlKE1FVFJJQ19QUkVGSVggKyBuYW1lICsgIl9hdmVyYWdlXyIgKyB1bml0LCBhdmVyYWdlKTsKLSAgICAgICAgYnVuZGxlLnB1dERvdWJsZShNRVRSSUNfUFJFRklYICsgbmFtZSArICJfbWluXyIgKyB1bml0LCBtaW4pOwotICAgICAgICBidW5kbGUucHV0RG91YmxlKE1FVFJJQ19QUkVGSVggKyBuYW1lICsgIl9tYXhfIiArIHVuaXQsIG1heCk7Ci0gICAgICAgIGJ1bmRsZS5wdXREb3VibGUoTUVUUklDX1BSRUZJWCArIG5hbWUgKyAiX3N0ZGV2XyIgKyB1bml0LCBzdGRldik7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZFN0YXR1cygwLCBidW5kbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZXhlY3V0ZUNvbW1hbmRCbG9ja2luZyhTdHJpbmcgY29tbWFuZCkgewotICAgICAgICB0cnkgKAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VWlBdXRvbWF0aW9uKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kKSk7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCi0gICAgICAgICkgewotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLSAgICAgICAgICAgIGludCBsZW5ndGg7Ci0gICAgICAgICAgICB3aGlsZSAoKGxlbmd0aCA9IGlzLnJlYWQoYnVmKSkgPj0gMCkgewotICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGV4ZWN1dGluZzogIiArIGNvbW1hbmQsIGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kKQotICAgICAgICAgICAgdGhyb3dzICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCi0gICAgICAgICAgICAgICAgLmFkb3B0U2hlbGxQZXJtaXNzaW9uSWRlbnRpdHkoKTsKLSAgICAgICAgYnl0ZVtdIG91dHB1dCA9IGV4ZWN1dGVDb21tYW5kQmxvY2tpbmcoY29tbWFuZCk7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpCi0gICAgICAgICAgICAgICAgLmRyb3BTaGVsbFBlcm1pc3Npb25JZGVudGl0eSgpOwotCi0gICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBydW4gdGhlIGNvbW1hbmQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gbmV3IFN0cmluZyhvdXRwdXQsICJVVEYtOCIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiR2V0IHN0ZG91dCA6ICIgKyBzdGRvdXQpOwotICAgICAgICAgICAgcmV0dXJuIHN0ZG91dDsKLSAgICAgICAgfQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCkuZHJvcFNoZWxsUGVybWlzc2lvbklkZW50aXR5KCk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3Vlc3RDb21waWxlVGltZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBhc3N1bWUoKS53aXRoTWVzc2FnZSgiU2tpcCBvbiBDRjsgdG9vIHNsb3ciKS50aGF0KGlzQ3V0dGxlZmlzaCgpKS5pc0ZhbHNlKCk7CisgICAgcHVibGljIHZvaWQgdGVzdEhvc3RDb21waWxlVGltZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICIvYXBleC9jb20uYW5kcm9pZC5hcnQvYmluL29kcmVmcmVzaCAtLWZvcmNlLWNvbXBpbGUiOwogCi0gICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gIi9hcGV4L2NvbS5hbmRyb2lkLmNvbXBvcy9iaW4vY29tcG9zZF9jbWQgdGVzdC1jb21waWxlIjsKLQotICAgICAgICBkb3VibGVbXSBjb21waWxlVGltZSA9IG5ldyBkb3VibGVbUk9VTkRfQ09VTlRdOworICAgICAgICBmaW5hbCBMaXN0PERvdWJsZT4gY29tcGlsZVRpbWVzID0gbmV3IEFycmF5TGlzdDw+KFJPVU5EX0NPVU5UKTsKKyAgICAgICAgLy8gVGhlIG1hcHBpbmcgaXMgPG1lbW9yeSBtZXRyaWNzIG5hbWU+IC0+IDxhbGwgcm91bmRzIHZhbHVlIGxpc3Q+LgorICAgICAgICAvLyBFWCA6IHBzcyAtPiBbMTAsIDIwLCAzMCwgLi4uLi4uLi5dCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8TG9uZz4+IHByb2Nlc3NNZW1vcnkgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAgICAgZm9yIChpbnQgcm91bmQgPSAwOyByb3VuZCA8IFJPVU5EX0NPVU5UOyArK3JvdW5kKSB7CisKKyAgICAgICAgICAgIEdldE1ldHJpY3NSdW5uYWJsZSBnZXRNZXRyaWNzUnVubmFibGUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgR2V0TWV0cmljc1J1bm5hYmxlKCJkZXgyb2F0NjQiLCBwcm9jZXNzTWVtb3J5KTsKKyAgICAgICAgICAgIFRocmVhZCB0aHJlYWRHZXRNZXRyaWNzID0gbmV3IFRocmVhZChnZXRNZXRyaWNzUnVubmFibGUpOworCisgICAgICAgICAgICB0aHJlYWRHZXRNZXRyaWNzLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFRpbWVzdGFtcCBiZWZvcmVDb21waWxlTGF0ZXN0VGltZSA9IGdldExhdGVzdERleDJvYXRTdWNjZXNzVGltZSgpOworICAgICAgICAgICAgTG9uZyBjb21waWxlU3RhcnRUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgICAgICBleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKKyAgICAgICAgICAgIExvbmcgY29tcGlsZUVuZFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgICAgIFRpbWVzdGFtcCBhZnRlckNvbXBpbGVMYXRlc3RUaW1lID0gZ2V0TGF0ZXN0RGV4Mm9hdFN1Y2Nlc3NUaW1lKCk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoYWZ0ZXJDb21waWxlTGF0ZXN0VGltZSAhPSBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIGJlZm9yZUNvbXBpbGVMYXRlc3RUaW1lID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBiZWZvcmVDb21waWxlTGF0ZXN0VGltZS5iZWZvcmUoYWZ0ZXJDb21waWxlTGF0ZXN0VGltZSkpOworCisgICAgICAgICAgICBkb3VibGUgZWxhcHNlZFNlYyA9IChjb21waWxlRW5kVGltZSAtIGNvbXBpbGVTdGFydFRpbWUpIC8gTkFOT1NfSU5fU0VDOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ29tcGlsZSB0aW1lIGluIGhvc3QgdG9vayAiICsgZWxhcHNlZFNlYyArICJzIik7CisgICAgICAgICAgICBnZXRNZXRyaWNzUnVubmFibGUuc3RvcCgpOworCisgICAgICAgICAgICBMb2cuaShUQUcsICJXYWl0cyBmb3IgdGhyZWFkIGZpbmlzaCIpOworICAgICAgICAgICAgdGhyZWFkR2V0TWV0cmljcy5qb2luKCk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJUaHJlYWQgaXMgZmluaXNoIik7CisKKyAgICAgICAgICAgIGNvbXBpbGVUaW1lcy5hZGQoZWxhcHNlZFNlYyk7CisgICAgICAgIH0KKworICAgICAgICByZXBvcnRNZXRyaWMoImhvc3RfY29tcGlsZV90aW1lIiwgInMiLCBjb21waWxlVGltZXMpOworCisgICAgICAgIHJlcG9ydEFnZ3JlZ2F0ZWRNZXRyaWMocHJvY2Vzc01lbW9yeSwgImhvc3RfY29tcGlsZV9kZXgyb2F0NjRfIiwgImtCIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3Vlc3RDb21waWxlVGltZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3N1bWUoKS53aXRoTWVzc2FnZSgiU2tpcCBvbiBDRjsgdG9vIHNsb3ciKS50aGF0KGlzQ3V0dGxlZmlzaCgpKS5pc0ZhbHNlKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gIi9hcGV4L2NvbS5hbmRyb2lkLmNvbXBvcy9iaW4vY29tcG9zZF9jbWQgdGVzdC1jb21waWxlIjsKKworICAgICAgICBmaW5hbCBMaXN0PERvdWJsZT4gY29tcGlsZVRpbWVzID0gbmV3IEFycmF5TGlzdDw+KFJPVU5EX0NPVU5UKTsKKyAgICAgICAgLy8gVGhlIG1hcHBpbmcgaXMgPG1lbW9yeSBtZXRyaWNzIG5hbWU+IC0+IDxhbGwgcm91bmRzIHZhbHVlIGxpc3Q+LgorICAgICAgICAvLyBFWCA6IHBzcyAtPiBbMTAsIDIwLCAzMCwgLi4uLi4uLi5dCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8TG9uZz4+IHByb2Nlc3NNZW1vcnkgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgZm9yIChpbnQgcm91bmQgPSAwOyByb3VuZCA8IFJPVU5EX0NPVU5UOyArK3JvdW5kKSB7CisKKyAgICAgICAgICAgIEdldE1ldHJpY3NSdW5uYWJsZSBnZXRNZXRyaWNzUnVubmFibGUgPSBuZXcgR2V0TWV0cmljc1J1bm5hYmxlKCJjcm9zdm0iLCBwcm9jZXNzTWVtb3J5KTsKKyAgICAgICAgICAgIFRocmVhZCB0aHJlYWRHZXRNZXRyaWNzID0gbmV3IFRocmVhZChnZXRNZXRyaWNzUnVubmFibGUpOworCisgICAgICAgICAgICB0aHJlYWRHZXRNZXRyaWNzLnN0YXJ0KCk7CisKICAgICAgICAgICAgIExvbmcgY29tcGlsZVN0YXJ0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwogICAgICAgICAgICAgTG9uZyBjb21waWxlRW5kVGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOwotCiAgICAgICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIkFsbCBPayIpOwogICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG91dHB1dCk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1hdGNoZXIuZmluZCgpKTsKKyAgICAgICAgICAgIGRvdWJsZSBlbGFwc2VkU2VjID0gKGNvbXBpbGVFbmRUaW1lIC0gY29tcGlsZVN0YXJ0VGltZSkgLyBOQU5PU19JTl9TRUM7CisgICAgICAgICAgICBMb2cuaShUQUcsICJDb21waWxlIHRpbWUgaW4gZ3Vlc3QgdG9vayAiICsgZWxhcHNlZFNlYyArICJzIik7CisgICAgICAgICAgICBnZXRNZXRyaWNzUnVubmFibGUuc3RvcCgpOwogCi0gICAgICAgICAgICBjb21waWxlVGltZVtyb3VuZF0gPSAoY29tcGlsZUVuZFRpbWUgLSBjb21waWxlU3RhcnRUaW1lKSAvIE5BTk9TX0lOX1NFQzsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIldhaXRzIGZvciB0aHJlYWQgZmluaXNoIik7CisgICAgICAgICAgICB0aHJlYWRHZXRNZXRyaWNzLmpvaW4oKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlRocmVhZCBpcyBmaW5pc2giKTsKKworICAgICAgICAgICAgY29tcGlsZVRpbWVzLmFkZChlbGFwc2VkU2VjKTsKICAgICAgICAgfQogCi0gICAgICAgIHJlcG9ydE1ldHJpYygiZ3Vlc3RfY29tcGlsZV90aW1lIiwgInMiLCBjb21waWxlVGltZSk7CisgICAgICAgIHJlcG9ydE1ldHJpYygiZ3Vlc3RfY29tcGlsZV90aW1lIiwgInMiLCBjb21waWxlVGltZXMpOworCisgICAgICAgIHJlcG9ydEFnZ3JlZ2F0ZWRNZXRyaWMocHJvY2Vzc01lbW9yeSwgImd1ZXN0X2NvbXBpbGVfY3Jvc3ZtXyIsICJrQiIpOwogICAgIH0KIAogICAgIHByaXZhdGUgVGltZXN0YW1wIGdldExhdGVzdERleDJvYXRTdWNjZXNzVGltZSgpCi0gICAgICAgICAgICB0aHJvd3MgIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24gewotCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBjb21tYW5kID0gImxvZ2NhdCAtZCAtZSBkZXgyb2F0IjsKICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwogICAgICAgICBTdHJpbmcgbGF0ZXN0VGltZSA9IG51bGw7CkBAIC0xNzAsMjkgKzE4MywxMDYgQEAKICAgICAgICAgcmV0dXJuIHRpbWVTdGFtcERhdGU7CiAgICAgfQogCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9zdENvbXBpbGVUaW1lKCkKLSAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICIvYXBleC9jb20uYW5kcm9pZC5hcnQvYmluL29kcmVmcmVzaCAtLWZvcmNlLWNvbXBpbGUiOwotCi0gICAgICAgIGRvdWJsZVtdIGNvbXBpbGVUaW1lID0gbmV3IGRvdWJsZVtST1VORF9DT1VOVF07Ci0KLSAgICAgICAgZm9yIChpbnQgcm91bmQgPSAwOyByb3VuZCA8IFJPVU5EX0NPVU5UOyArK3JvdW5kKSB7Ci0gICAgICAgICAgICBUaW1lc3RhbXAgYmVmb3JlQ29tcGlsZUxhdGVzdFRpbWUgPSBnZXRMYXRlc3REZXgyb2F0U3VjY2Vzc1RpbWUoKTsKLSAgICAgICAgICAgIExvbmcgY29tcGlsZVN0YXJ0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOwotICAgICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotICAgICAgICAgICAgTG9uZyBjb21waWxlRW5kVGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOwotICAgICAgICAgICAgVGltZXN0YW1wIGFmdGVyQ29tcGlsZUxhdGVzdFRpbWUgPSBnZXRMYXRlc3REZXgyb2F0U3VjY2Vzc1RpbWUoKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZnRlckNvbXBpbGVMYXRlc3RUaW1lICE9IG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZWZvcmVDb21waWxlTGF0ZXN0VGltZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IGJlZm9yZUNvbXBpbGVMYXRlc3RUaW1lLmJlZm9yZShhZnRlckNvbXBpbGVMYXRlc3RUaW1lKSk7Ci0KLSAgICAgICAgICAgIGNvbXBpbGVUaW1lW3JvdW5kXSA9IChjb21waWxlRW5kVGltZSAtIGNvbXBpbGVTdGFydFRpbWUpIC8gTkFOT1NfSU5fU0VDOworICAgIHByaXZhdGUgdm9pZCByZXBvcnRNZXRyaWMoU3RyaW5nIG5hbWUsIFN0cmluZyB1bml0LCBMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+IHZhbHVlcykgeworICAgICAgICBMb2cuZChUQUcsICJSZXBvcnQgbWV0cmljICIgKyBuYW1lICsgIigiICsgdW5pdCArICIpIDogIiArIHZhbHVlcy50b1N0cmluZygpKTsKKyAgICAgICAgTWFwPFN0cmluZywgRG91YmxlPiBzdGF0cyA9IG1NZXRyaWNzUHJvY2Vzc29yLmNvbXB1dGVTdGF0cyh2YWx1ZXMsIG5hbWUsIHVuaXQpOworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERvdWJsZT4gZW50cnkgOiBzdGF0cy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBidW5kbGUucHV0RG91YmxlKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICAgICAgfQotCi0gICAgICAgIHJlcG9ydE1ldHJpYygiaG9zdF9jb21waWxlX3RpbWUiLCAicyIsIGNvbXBpbGVUaW1lKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi5zZW5kU3RhdHVzKDAsIGJ1bmRsZSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydEFnZ3JlZ2F0ZWRNZXRyaWMoCisgICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PExvbmc+PiBwcm9jZXNzTWVtb3J5LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdW5pdCkgeworICAgICAgICBwcm9jZXNzTWVtb3J5LmZvckVhY2goKGssIHYpIC0+IHJlcG9ydE1ldHJpYyhwcmVmaXggKyBrLCB1bml0LCB2KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gZXhlY3V0ZUNvbW1hbmRCbG9ja2luZyhTdHJpbmcgY29tbWFuZCkgeworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKS5leGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQpKTsKKyAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gaXMucmVhZChidWYpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgZXhlY3V0aW5nOiAiICsgY29tbWFuZCwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gb3V0cHV0ID0gZXhlY3V0ZUNvbW1hbmRCbG9ja2luZyhjb21tYW5kKTsKKworICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBydW4gdGhlIGNvbW1hbmQuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBzdGRvdXQgPSBuZXcgU3RyaW5nKG91dHB1dCwgIlVURi04Iik7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiR2V0IHN0ZG91dCA6ICIgKyBzdGRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGRvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgZXhlY3V0aW5nOiAiICsgY29tbWFuZCArICIgLCBFeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgR2V0TWV0cmljc1J1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUHJvY2Vzc05hbWU7CisgICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxMb25nPj4gbVByb2Nlc3NNZW1vcnk7CisgICAgICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtU3RvcCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgICAgICBHZXRNZXRyaWNzUnVubmFibGUoU3RyaW5nIHByb2Nlc3NOYW1lLCBNYXA8U3RyaW5nLCBMaXN0PExvbmc+PiBwcm9jZXNzTWVtb3J5KSB7CisgICAgICAgICAgICB0aGlzLm1Qcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lOworICAgICAgICAgICAgdGhpcy5tUHJvY2Vzc01lbW9yeSA9IHByb2Nlc3NNZW1vcnk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICBtU3RvcC5zZXQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB3aGlsZSAoIW1TdG9wLmdldCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvY2Vzc01lbW9yeShtUHJvY2Vzc05hbWUsIG1Qcm9jZXNzTWVtb3J5KTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkdldCBleGNlcHRpb24gOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm9jZXNzTWVtb3J5KFN0cmluZyBwcm9jZXNzTmFtZSwgTWFwPFN0cmluZywgTGlzdDxMb25nPj4gcHJvY2Vzc01lbW9yeSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IHByb2Nlc3MgOgorICAgICAgICAgICAgICAgIFByb2Nlc3NVdGlsLmdldFByb2Nlc3NNYXAodGhpczo6ZXhlY3V0ZUNvbW1hbmQpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGludCBwSWQgPSBwcm9jZXNzLmdldEtleSgpOworICAgICAgICAgICAgU3RyaW5nIHBOYW1lID0gcHJvY2Vzcy5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHBOYW1lLmVxdWFsc0lnbm9yZUNhc2UocHJvY2Vzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBzdGF0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NVdGlsLmdldFByb2Nlc3NTbWFwc1JvbGx1cChwSWQsIHRoaXM6OmV4ZWN1dGVDb21tYW5kKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0IHJ1bm5pbmcgcHJvY2VzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbWV0cmljcyA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RhdC5nZXRLZXkoKS50b0xvd2VyQ2FzZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICctJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGF0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXB1dGVJZkFic2VudChzdGF0LmdldEtleSgpLnRvTG93ZXJDYXNlKCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChzdGF0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmFsaWIvc3JjL2FuZHJvaWQvc3lzdGVtL3ZpcnR1YWxtYWNoaW5lL1ZpcnR1YWxNYWNoaW5lLmphdmEgYi9qYXZhbGliL3NyYy9hbmRyb2lkL3N5c3RlbS92aXJ0dWFsbWFjaGluZS9WaXJ0dWFsTWFjaGluZS5qYXZhCmluZGV4IDgyOGFjOWYuLmFlODRjMDggMTAwNjQ0Ci0tLSBhL2phdmFsaWIvc3JjL2FuZHJvaWQvc3lzdGVtL3ZpcnR1YWxtYWNoaW5lL1ZpcnR1YWxNYWNoaW5lLmphdmEKKysrIGIvamF2YWxpYi9zcmMvYW5kcm9pZC9zeXN0ZW0vdmlydHVhbG1hY2hpbmUvVmlydHVhbE1hY2hpbmUuamF2YQpAQCAtNDUsMTEgKzQ1LDE1IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZUFscmVhZHlFeGlzdHNFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwpAQCAtNjUsNiArNjksMTEgQEAKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBWaXJ0dWFsTWFjaGluZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENvbnRleHQsIE1hcDxTdHJpbmcsIFdlYWtSZWZlcmVuY2U8VmlydHVhbE1hY2hpbmU+Pj4gc0luc3RhbmNlcyA9CisgICAgICAgICAgICBuZXcgV2Vha0hhc2hNYXA8PigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNJbnN0YW5jZXNMb2NrID0gbmV3IE9iamVjdCgpOworCiAgICAgLyoqIE5hbWUgb2YgdGhlIGRpcmVjdG9yeSB1bmRlciB0aGUgZmlsZXMgZGlyZWN0b3J5IHdoZXJlIGFsbCBWTXMgY3JlYXRlZCBmb3IgdGhlIGFwcCBleGlzdC4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk1fRElSID0gInZtIjsKIApAQCAtMTU5LDYgKzE2OCw4IEBACiAKICAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBtRXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKIAorICAgIEBOb25OdWxsIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKwogICAgIHN0YXRpYyB7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgidmlydHVhbG1hY2hpbmVfam5pIik7CiAgICAgfQpAQCAtMTY2LDYgKzE3Nyw3IEBACiAgICAgcHJpdmF0ZSBWaXJ0dWFsTWFjaGluZSgKICAgICAgICAgICAgIEBOb25OdWxsIENvbnRleHQgY29udGV4dCwgQE5vbk51bGwgU3RyaW5nIG5hbWUsIEBOb25OdWxsIFZpcnR1YWxNYWNoaW5lQ29uZmlnIGNvbmZpZykKICAgICAgICAgICAgIHRocm93cyBWaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVBhY2thZ2VOYW1lID0gY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOwogICAgICAgICBtTmFtZSA9IG5hbWU7CiAgICAgICAgIG1Db25maWcgPSBjb25maWc7CkBAIC0yMzEsNiArMjQzLDE4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgVmlydHVhbE1hY2hpbmVFeGNlcHRpb24oImZhaWxlZCB0byBjcmVhdGUgaW5zdGFuY2UgcGFydGl0aW9uIiwgZSk7CiAgICAgICAgIH0KIAorICAgICAgICBzeW5jaHJvbml6ZWQgKHNJbnN0YW5jZXNMb2NrKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBXZWFrUmVmZXJlbmNlPFZpcnR1YWxNYWNoaW5lPj4gaW5zdGFuY2VzTWFwOworICAgICAgICAgICAgaWYgKHNJbnN0YW5jZXMuY29udGFpbnNLZXkoY29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZXNNYXAgPSBzSW5zdGFuY2VzLmdldChjb250ZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VzTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgIHNJbnN0YW5jZXMucHV0KGNvbnRleHQsIGluc3RhbmNlc01hcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluc3RhbmNlc01hcC5wdXQobmFtZSwgbmV3IFdlYWtSZWZlcmVuY2U8Pih2bSkpOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIHZtOwogICAgIH0KIApAQCAtMjQ5LDcgKzI3MywyMyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFZpcnR1YWxNYWNoaW5lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAKLSAgICAgICAgVmlydHVhbE1hY2hpbmUgdm0gPSBuZXcgVmlydHVhbE1hY2hpbmUoY29udGV4dCwgbmFtZSwgY29uZmlnKTsKKyAgICAgICAgVmlydHVhbE1hY2hpbmUgdm07CisgICAgICAgIHN5bmNocm9uaXplZCAoc0luc3RhbmNlc0xvY2spIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFdlYWtSZWZlcmVuY2U8VmlydHVhbE1hY2hpbmU+PiBpbnN0YW5jZXNNYXA7CisgICAgICAgICAgICBpZiAoc0luc3RhbmNlcy5jb250YWluc0tleShjb250ZXh0KSkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlc01hcCA9IHNJbnN0YW5jZXMuZ2V0KGNvbnRleHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZXNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlcy5wdXQoY29udGV4dCwgaW5zdGFuY2VzTWFwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluc3RhbmNlc01hcC5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgICAgIHZtID0gaW5zdGFuY2VzTWFwLmdldChuYW1lKS5nZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdm0gPSBuZXcgVmlydHVhbE1hY2hpbmUoY29udGV4dCwgbmFtZSwgY29uZmlnKTsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZXNNYXAucHV0KG5hbWUsIG5ldyBXZWFrUmVmZXJlbmNlPD4odm0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIC8vIElmIGNvbmZpZyBmaWxlIGV4aXN0cywgYnV0IHRoZSBpbnN0YW5jZSBpbWFnZSBmaWxlIGRvZXNuJ3QsIGl0IG1lYW5zIHRoYXQgdGhlIFZNIGlzCiAgICAgICAgIC8vIGNvcnJ1cHRlZC4gVGhhdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBjYXNlIHRoYXQgdGhlIFZNIGRvZXNuJ3QgZXhpc3QuIFRocm93IGFuIGV4Y2VwdGlvbgpAQCAtNTQ0LDYgKzU4NCwxMSBAQAogICAgICAgICBtSW5zdGFuY2VGaWxlUGF0aC5kZWxldGUoKTsKICAgICAgICAgbUlkc2lnRmlsZVBhdGguZGVsZXRlKCk7CiAgICAgICAgIHZtUm9vdERpci5kZWxldGUoKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNJbnN0YW5jZXNMb2NrKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBXZWFrUmVmZXJlbmNlPFZpcnR1YWxNYWNoaW5lPj4gaW5zdGFuY2VzTWFwID0gc0luc3RhbmNlcy5nZXQobUNvbnRleHQpOworICAgICAgICAgICAgaWYgKGluc3RhbmNlc01hcCAhPSBudWxsKSBpbnN0YW5jZXNNYXAucmVtb3ZlKG1OYW1lKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbGlicy9hcGt2ZXJpZnkvQW5kcm9pZC5icCBiL2xpYnMvYXBrdmVyaWZ5L0FuZHJvaWQuYnAKaW5kZXggNTBkN2E2MC4uNzgxOTJkMiAxMDA2NDQKLS0tIGEvbGlicy9hcGt2ZXJpZnkvQW5kcm9pZC5icAorKysgYi9saWJzL2Fwa3ZlcmlmeS9BbmRyb2lkLmJwCkBAIC0xMyw5ICsxMywxMiBAQAogICAgICAgICAibGliYnl0ZW9yZGVyIiwKICAgICAgICAgImxpYmJ5dGVzIiwKICAgICAgICAgImxpYmxvZ19ydXN0IiwKKyAgICAgICAgImxpYm51bV90cmFpdHMiLAogICAgICAgICAibGlib3BlbnNzbCIsCisgICAgICAgICJsaWJzZXJkZSIsCiAgICAgICAgICJsaWJ6aXAiLAogICAgIF0sCisgICAgcHJvY19tYWNyb3M6IFsibGlibnVtX2Rlcml2ZSJdLAogfQogCiBydXN0X2xpYnJhcnkgewpkaWZmIC0tZ2l0IGEvbGlicy9hcGt2ZXJpZnkvc3JjL2FsZ29yaXRobXMucnMgYi9saWJzL2Fwa3ZlcmlmeS9zcmMvYWxnb3JpdGhtcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjJkZjNiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvc3JjL2FsZ29yaXRobXMucnMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgQWxnb3JpdGhtcyB1c2VkIGZvciBBUEsgU2lnbmF0dXJlIFNjaGVtZS4KKwordXNlIGFueWhvdzo6e2Vuc3VyZSwgUmVzdWx0fTsKK3VzZSBudW1fZGVyaXZlOjp7RnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmV9OwordXNlIG51bV90cmFpdHM6OlRvUHJpbWl0aXZlOwordXNlIG9wZW5zc2w6Omhhc2g6Ok1lc3NhZ2VEaWdlc3Q7Cit1c2Ugb3BlbnNzbDo6cGtleTo6e3NlbGYsIFBLZXl9OwordXNlIG9wZW5zc2w6OnJzYTo6UGFkZGluZzsKK3VzZSBvcGVuc3NsOjpzaWduOjpWZXJpZmllcjsKK3VzZSBzZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJpYWxpemV9OworCisvLy8gW1NpZ25hdHVyZSBBbGdvcml0aG0gSURzXTogaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZG9jcy9zZWN1cml0eS9hcGtzaWduaW5nL3YyI3NpZ25hdHVyZS1hbGdvcml0aG0taWRzCisvLy8gW1NpZ25hdHVyZUFsZ29yaXRobS5qYXZhXTogKHRvb2xzL2Fwa3NpZy9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2Fwa3NpZy9pbnRlcm5hbC9hcGsvU2lnbmF0dXJlQWxnb3JpdGhtLmphdmEpCisvLy8KKy8vLyBTb21lIG9mIHRoZSBhbGdvcml0aG1zIGFyZSBub3QgaW1wbGVtZW50ZWQuIFNlZSBiLzE5NzA1Mjk4MS4KKyNbZGVyaXZlKFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUsIENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSwgRnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmUpXQorI1tyZXByKHUzMildCitwdWIgZW51bSBTaWduYXR1cmVBbGdvcml0aG1JRCB7CisgICAgLy8vIFJTQVNTQS1QU1Mgd2l0aCBTSEEyLTI1NiBkaWdlc3QsIFNIQTItMjU2IE1HRjEsIDMyIGJ5dGVzIG9mIHNhbHQsIHRyYWlsZXI6IDB4YmMsIGNvbnRlbnQKKyAgICAvLy8gZGlnZXN0ZWQgdXNpbmcgU0hBMi0yNTYgaW4gMSBNQiBjaHVua3MuCisgICAgUnNhUHNzV2l0aFNoYTI1NiA9IDB4MDEwMSwKKworICAgIC8vLyBSU0FTU0EtUFNTIHdpdGggU0hBMi01MTIgZGlnZXN0LCBTSEEyLTUxMiBNR0YxLCA2NCBieXRlcyBvZiBzYWx0LCB0cmFpbGVyOiAweGJjLCBjb250ZW50CisgICAgLy8vIGRpZ2VzdGVkIHVzaW5nIFNIQTItNTEyIGluIDEgTUIgY2h1bmtzLgorICAgIFJzYVBzc1dpdGhTaGE1MTIgPSAweDAxMDIsCisKKyAgICAvLy8gUlNBU1NBLVBLQ1MxLXYxXzUgd2l0aCBTSEEyLTI1NiBkaWdlc3QsIGNvbnRlbnQgZGlnZXN0ZWQgdXNpbmcgU0hBMi0yNTYgaW4gMSBNQiBjaHVua3MuCisgICAgUnNhUGtjczFWMTVXaXRoU2hhMjU2ID0gMHgwMTAzLAorCisgICAgLy8vIFJTQVNTQS1QS0NTMS12MV81IHdpdGggU0hBMi01MTIgZGlnZXN0LCBjb250ZW50IGRpZ2VzdGVkIHVzaW5nIFNIQTItNTEyIGluIDEgTUIgY2h1bmtzLgorICAgIFJzYVBrY3MxVjE1V2l0aFNoYTUxMiA9IDB4MDEwNCwKKworICAgIC8vLyBFQ0RTQSB3aXRoIFNIQTItMjU2IGRpZ2VzdCwgY29udGVudCBkaWdlc3RlZCB1c2luZyBTSEEyLTI1NiBpbiAxIE1CIGNodW5rcy4KKyAgICBFY2RzYVdpdGhTaGEyNTYgPSAweDAyMDEsCisKKyAgICAvLy8gRUNEU0Egd2l0aCBTSEEyLTUxMiBkaWdlc3QsIGNvbnRlbnQgZGlnZXN0ZWQgdXNpbmcgU0hBMi01MTIgaW4gMSBNQiBjaHVua3MuCisgICAgRWNkc2FXaXRoU2hhNTEyID0gMHgwMjAyLAorCisgICAgLy8vIERTQSB3aXRoIFNIQTItMjU2IGRpZ2VzdCwgY29udGVudCBkaWdlc3RlZCB1c2luZyBTSEEyLTI1NiBpbiAxIE1CIGNodW5rcy4KKyAgICAvLy8gU2lnbmluZyBpcyBkb25lIGRldGVybWluaXN0aWNhbGx5IGFjY29yZGluZyB0byBSRkMgNjk3OS4KKyAgICBEc2FXaXRoU2hhMjU2ID0gMHgwMzAxLAorCisgICAgLy8vIFJTQVNTQS1QS0NTMS12MV81IHdpdGggU0hBMi0yNTYgZGlnZXN0LCBjb250ZW50IGRpZ2VzdGVkIHVzaW5nIFNIQTItMjU2IGluIDQgS0IKKyAgICAvLy8gY2h1bmtzLCBpbiB0aGUgc2FtZSB3YXkgZnN2ZXJpdHkgb3BlcmF0ZXMuIFRoaXMgZGlnZXN0IGFuZCB0aGUgY29udGVudCBsZW5ndGgKKyAgICAvLy8gKGJlZm9yZSBkaWdlc3Rpb24sIDggYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbikgY29uc3RydWN0IHRoZSBmaW5hbCBkaWdlc3QuCisgICAgVmVyaXR5UnNhUGtjczFWMTVXaXRoU2hhMjU2ID0gMHgwNDIxLAorCisgICAgLy8vIEVDRFNBIHdpdGggU0hBMi0yNTYgZGlnZXN0LCBjb250ZW50IGRpZ2VzdGVkIHVzaW5nIFNIQTItMjU2IGluIDQgS0IgY2h1bmtzLCBpbiB0aGUKKyAgICAvLy8gc2FtZSB3YXkgZnN2ZXJpdHkgb3BlcmF0ZXMuIFRoaXMgZGlnZXN0IGFuZCB0aGUgY29udGVudCBsZW5ndGggKGJlZm9yZSBkaWdlc3Rpb24sCisgICAgLy8vIDggYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbikgY29uc3RydWN0IHRoZSBmaW5hbCBkaWdlc3QuCisgICAgVmVyaXR5RWNkc2FXaXRoU2hhMjU2ID0gMHgwNDIzLAorCisgICAgLy8vIERTQSB3aXRoIFNIQTItMjU2IGRpZ2VzdCwgY29udGVudCBkaWdlc3RlZCB1c2luZyBTSEEyLTI1NiBpbiA0IEtCIGNodW5rcywgaW4gdGhlCisgICAgLy8vIHNhbWUgd2F5IGZzdmVyaXR5IG9wZXJhdGVzLiBUaGlzIGRpZ2VzdCBhbmQgdGhlIGNvbnRlbnQgbGVuZ3RoIChiZWZvcmUgZGlnZXN0aW9uLAorICAgIC8vLyA4IGJ5dGVzIGluIGxpdHRsZSBlbmRpYW4pIGNvbnN0cnVjdCB0aGUgZmluYWwgZGlnZXN0LgorICAgIFZlcml0eURzYVdpdGhTaGEyNTYgPSAweDA0MjUsCit9CisKK2ltcGwgRGVmYXVsdCBmb3IgU2lnbmF0dXJlQWxnb3JpdGhtSUQgeworICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKKyAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkRzYVdpdGhTaGEyNTYKKyAgICB9Cit9CisKK2ltcGwgU2lnbmF0dXJlQWxnb3JpdGhtSUQgeworICAgIC8vLyBDb252ZXJ0cyB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBJRCB0byB0aGUgY29ycmVzcG9uZGluZyB1MzIuCisgICAgcHViIGZuIHRvX3UzMigmc2VsZikgLT4gdTMyIHsKKyAgICAgICAgVG9QcmltaXRpdmU6OnRvX3UzMihzZWxmKS5leHBlY3QoIlVuc3VwcG9ydGVkIGFsZ29yaXRobSBmb3IgdG9fdTMyLiIpCisgICAgfQorCisgICAgcHViKGNyYXRlKSBmbiBuZXdfdmVyaWZpZXI8J2E+KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgcHVibGljX2tleTogJidhIFBLZXk8cGtleTo6UHVibGljPiwKKyAgICApIC0+IFJlc3VsdDxWZXJpZmllcjwnYT4+IHsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICFtYXRjaGVzISgKKyAgICAgICAgICAgICAgICBzZWxmLAorICAgICAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpEc2FXaXRoU2hhMjU2IHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlZlcml0eURzYVdpdGhTaGEyNTYKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAiVE9ETyhiLzE5NzA1Mjk4MSk6IEFsZ29yaXRobSAnezo/fScgaXMgbm90IGltcGxlbWVudGVkLiIsCisgICAgICAgICAgICBzZWxmCisgICAgICAgICk7CisgICAgICAgIGVuc3VyZSEocHVibGljX2tleS5pZCgpID09IHNlbGYucGtleV9pZCgpLCAiUHVibGljIGtleSBoYXMgdGhlIHdyb25nIElEIik7CisgICAgICAgIGxldCBtdXQgdmVyaWZpZXIgPSBWZXJpZmllcjo6bmV3KHNlbGYubmV3X21lc3NhZ2VfZGlnZXN0KCksIHB1YmxpY19rZXkpPzsKKyAgICAgICAgaWYgcHVibGljX2tleS5pZCgpID09IHBrZXk6OklkOjpSU0EgeworICAgICAgICAgICAgdmVyaWZpZXIuc2V0X3JzYV9wYWRkaW5nKHNlbGYucnNhX3BhZGRpbmcoKSk/OworICAgICAgICB9CisgICAgICAgIE9rKHZlcmlmaWVyKQorICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpZ2VzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtCisgICAgLy8vIGFjY29yZGluZyB0byB0aGUgc3BlYyBbU2lnbmF0dXJlIEFsZ29yaXRobSBJRHNdLgorICAgIHB1YihjcmF0ZSkgZm4gbmV3X21lc3NhZ2VfZGlnZXN0KCZzZWxmKSAtPiBNZXNzYWdlRGlnZXN0IHsKKyAgICAgICAgbWF0Y2ggc2VsZiB7CisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUHNzV2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpFY2RzYVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkRzYVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlZlcml0eVJzYVBrY3MxVjE1V2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6VmVyaXR5RWNkc2FXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpWZXJpdHlEc2FXaXRoU2hhMjU2ID0+IE1lc3NhZ2VEaWdlc3Q6OnNoYTI1NigpLAorICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBzc1dpdGhTaGE1MTIKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTUxMgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6RWNkc2FXaXRoU2hhNTEyID0+IE1lc3NhZ2VEaWdlc3Q6OnNoYTUxMigpLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcGtleV9pZCgmc2VsZikgLT4gcGtleTo6SWQgeworICAgICAgICBtYXRjaCBzZWxmIHsKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQc3NXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQc3NXaXRoU2hhNTEyCisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQa2NzMVYxNVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTUxMgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6VmVyaXR5UnNhUGtjczFWMTVXaXRoU2hhMjU2ID0+IHBrZXk6OklkOjpSU0EsCisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6RWNkc2FXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpFY2RzYVdpdGhTaGE1MTIKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlZlcml0eUVjZHNhV2l0aFNoYTI1NiA9PiBwa2V5OjpJZDo6RUMsCisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6RHNhV2l0aFNoYTI1NiB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpWZXJpdHlEc2FXaXRoU2hhMjU2ID0+IHsKKyAgICAgICAgICAgICAgICBwa2V5OjpJZDo6RFNBCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByc2FfcGFkZGluZygmc2VsZikgLT4gUGFkZGluZyB7CisgICAgICAgIG1hdGNoIHNlbGYgeworICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBzc1dpdGhTaGEyNTYgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUHNzV2l0aFNoYTUxMiA9PiB7CisgICAgICAgICAgICAgICAgUGFkZGluZzo6UEtDUzFfUFNTCisgICAgICAgICAgICB9CisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpWZXJpdHlSc2FQa2NzMVYxNVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTUxMiA9PiBQYWRkaW5nOjpQS0NTMSwKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpFY2RzYVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkVjZHNhV2l0aFNoYTUxMgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6VmVyaXR5RWNkc2FXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpEc2FXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpWZXJpdHlEc2FXaXRoU2hhMjU2ID0+IFBhZGRpbmc6Ok5PTkUsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWIoY3JhdGUpIGZuIHRvX2NvbnRlbnRfZGlnZXN0X2FsZ29yaXRobSgmc2VsZikgLT4gQ29udGVudERpZ2VzdEFsZ29yaXRobSB7CisgICAgICAgIG1hdGNoIHNlbGYgeworICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBzc1dpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6RWNkc2FXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpEc2FXaXRoU2hhMjU2ID0+IENvbnRlbnREaWdlc3RBbGdvcml0aG06OkNodW5rZWRTaGEyNTYsCisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUHNzV2l0aFNoYTUxMgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhNTEyCisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpFY2RzYVdpdGhTaGE1MTIgPT4gQ29udGVudERpZ2VzdEFsZ29yaXRobTo6Q2h1bmtlZFNoYTUxMiwKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpWZXJpdHlSc2FQa2NzMVYxNVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlZlcml0eUVjZHNhV2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6VmVyaXR5RHNhV2l0aFNoYTI1NiA9PiB7CisgICAgICAgICAgICAgICAgQ29udGVudERpZ2VzdEFsZ29yaXRobTo6VmVyaXR5Q2h1bmtlZFNoYTI1NgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhlIHJhbmsgb2YgdGhlIGNvbnRlbnQgZGlnZXN0IGFsZ29yaXRobSBpbiB0aGlzIGVudW0gaXMgdXNlZCB0byBoZWxwIHBpY2sKKy8vLyB2NCBhcGsgZGlnZXN0LgorLy8vIEFjY29yZGluZyB0byBBUEsgU2lnbmF0dXJlIFNjaGVtZSB2NCwgW2FwayBkaWdlc3RdIGlzIHRoZSBmaXJzdCBhdmFpbGFibGUKKy8vLyBjb250ZW50IGRpZ2VzdCBvZiB0aGUgaGlnaGVzdCByYW5rIChyYW5rIE4pLgorLy8vCisvLy8gVGhpcyByYW5rIHdhcyBhbHNvIHVzZWQgZm9yIHN0ZXAgM2Egb2YgdGhlIHYzIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uCisvLy8KKy8vLyBbYXBrIGRpZ2VzdF06IGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RvY3Mvc2VjdXJpdHkvZmVhdHVyZXMvYXBrc2lnbmluZy92NCNhcGstZGlnZXN0CisvLy8gW3YzIHZlcmlmaWNhdGlvbl06IGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RvY3Mvc2VjdXJpdHkvYXBrc2lnbmluZy92MyN2My12ZXJpZmljYXRpb24KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgUGFydGlhbEVxLCBFcSwgUGFydGlhbE9yZCwgT3JkKV0KK3B1YihjcmF0ZSkgZW51bSBDb250ZW50RGlnZXN0QWxnb3JpdGhtIHsKKyAgICBDaHVua2VkU2hhMjU2ID0gMSwKKyAgICBWZXJpdHlDaHVua2VkU2hhMjU2LAorICAgIENodW5rZWRTaGE1MTIsCit9CmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS9zcmMvYnl0ZXNfZXh0LnJzIGIvbGlicy9hcGt2ZXJpZnkvc3JjL2J5dGVzX2V4dC5ycwppbmRleCAyMmEzMDg1Li44ZmIzNmVlIDEwMDY0NAotLS0gYS9saWJzL2Fwa3ZlcmlmeS9zcmMvYnl0ZXNfZXh0LnJzCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy9ieXRlc19leHQucnMKQEAgLTE2LDcgKzE2LDcgQEAKIAogLy8hIFByb3ZpZGVzIGV4dGVuc2lvbiBtZXRob2RzIEJ5dGVzOjpyZWFkPFQ+KCksIHdoaWNoIGNhbGxzIGJhY2sgUmVhZEZyb21CeXRlczo6cmVhZF9mcm9tX2J5dGUoKQogCi11c2UgYW55aG93Ojp7YmFpbCwgUmVzdWx0fTsKK3VzZSBhbnlob3c6OntlbnN1cmUsIFJlc3VsdH07CiB1c2UgYnl0ZXM6OntCdWYsIEJ5dGVzfTsKIHVzZSBzdGQ6Om9wczo6RGVyZWY7CiAKQEAgLTc5LDIwICs3OSwxOCBAQAogfQogCiBmbiByZWFkX2xlbmd0aF9wcmVmaXhlZF9zbGljZShidWY6ICZtdXQgQnl0ZXMpIC0+IFJlc3VsdDxCeXRlcz4gewotICAgIGlmIGJ1Zi5yZW1haW5pbmcoKSA8IDQgewotICAgICAgICBiYWlsISgKLSAgICAgICAgICAgICJSZW1haW5pbmcgYnVmZmVyIHRvbyBzaG9ydCB0byBjb250YWluIGxlbmd0aCBvZiBsZW5ndGgtcHJlZml4ZWQgZmllbGQuIFJlbWFpbmluZzoge30iLAotICAgICAgICAgICAgYnVmLnJlbWFpbmluZygpCi0gICAgICAgICk7Ci0gICAgfQorICAgIGVuc3VyZSEoCisgICAgICAgIGJ1Zi5yZW1haW5pbmcoKSA+PSA0LAorICAgICAgICAiUmVtYWluaW5nIGJ1ZmZlciB0b28gc2hvcnQgdG8gY29udGFpbiBsZW5ndGggb2YgbGVuZ3RoLXByZWZpeGVkIGZpZWxkLiBSZW1haW5pbmc6IHt9IiwKKyAgICAgICAgYnVmLnJlbWFpbmluZygpCisgICAgKTsKICAgICBsZXQgbGVuID0gYnVmLmdldF91MzJfbGUoKSBhcyB1c2l6ZTsKLSAgICBpZiBsZW4gPiBidWYucmVtYWluaW5nKCkgewotICAgICAgICBiYWlsISgKLSAgICAgICAgICAgICJsZW5ndGgtcHJlZml4ZWQgZmllbGQgbG9uZ2VyIHRoYW4gcmVtYWluaW5nIGJ1ZmZlci4gRmllbGQgbGVuZ3RoOiB7fSwgcmVtYWluaW5nOiB7fSIsCi0gICAgICAgICAgICBsZW4sCi0gICAgICAgICAgICBidWYucmVtYWluaW5nKCkKLSAgICAgICAgKTsKLSAgICB9CisgICAgZW5zdXJlISgKKyAgICAgICAgYnVmLnJlbWFpbmluZygpID49IGxlbiwKKyAgICAgICAgImxlbmd0aC1wcmVmaXhlZCBmaWVsZCBsb25nZXIgdGhhbiByZW1haW5pbmcgYnVmZmVyLiBGaWVsZCBsZW5ndGg6IHt9LCByZW1haW5pbmc6IHt9IiwKKyAgICAgICAgbGVuLAorICAgICAgICBidWYucmVtYWluaW5nKCkKKyAgICApOwogICAgIE9rKGJ1Zi5zcGxpdF90byhsZW4pKQogfQogCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS9zcmMvbGliLnJzIGIvbGlicy9hcGt2ZXJpZnkvc3JjL2xpYi5ycwppbmRleCBjNWFhOWU1Li4wODRhOTEwIDEwMDY0NAotLS0gYS9saWJzL2Fwa3ZlcmlmeS9zcmMvbGliLnJzCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy9saWIucnMKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8hIFZlcmlmaWVzIEFQSy9BUEVYIHNpZ25pbmcgd2l0aCB2Mi92MyBzY2hlbWUKIAorbW9kIGFsZ29yaXRobXM7CiBtb2QgYnl0ZXNfZXh0OwogbW9kIHNpZ3V0aWw7CiAjW2FsbG93KGRlYWRfY29kZSldCkBAIC0yMyw1ICsyNCw2IEBACiBtb2QgdjM7CiBtb2QgemlwdXRpbDsKIAotLy8gVE9ETyhqb295dW5nKSBmYWxsYmFjayB0byB2MiB3aGVuIHYzIG5vdCBmb3VuZAorLy8gVE9ETyhiLzE5NzA1Mjk4MSkgZmFsbGJhY2sgdG8gdjIgd2hlbiB2MyBub3QgZm91bmQKK3B1YiB1c2UgYWxnb3JpdGhtczo6U2lnbmF0dXJlQWxnb3JpdGhtSUQ7CiBwdWIgdXNlIHYzOjp7Z2V0X3B1YmxpY19rZXlfZGVyLCBwaWNrX3Y0X2Fwa19kaWdlc3QsIHZlcmlmeX07CmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS9zcmMvc2lndXRpbC5ycyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy9zaWd1dGlsLnJzCmluZGV4IDZhN2NlMzIuLmJmYTUxYzEgMTAwNjQ0Ci0tLSBhL2xpYnMvYXBrdmVyaWZ5L3NyYy9zaWd1dGlsLnJzCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy9zaWd1dGlsLnJzCkBAIC0xNiwzOCArMTYsMjIgQEAKIAogLy8hIFV0aWxpdGllcyBmb3IgU2lnbmF0dXJlIFZlcmlmaWNhdGlvbgogCi11c2UgYW55aG93Ojp7YW55aG93LCBiYWlsLCBlbnN1cmUsIEVycm9yLCBSZXN1bHR9OwordXNlIGFueWhvdzo6e2FueWhvdywgZW5zdXJlLCBFcnJvciwgUmVzdWx0fTsKIHVzZSBieXRlb3JkZXI6OntMaXR0bGVFbmRpYW4sIFJlYWRCeXRlc0V4dH07CiB1c2UgYnl0ZXM6OntCdWYsIEJ1Zk11dCwgQnl0ZXMsIEJ5dGVzTXV0fTsKIHVzZSBvcGVuc3NsOjpoYXNoOjp7RGlnZXN0Qnl0ZXMsIEhhc2hlciwgTWVzc2FnZURpZ2VzdH07CiB1c2Ugc3RkOjpjbXA6Om1pbjsKIHVzZSBzdGQ6OmlvOjp7c2VsZiwgQ3Vyc29yLCBFcnJvcktpbmQsIFJlYWQsIFNlZWssIFNlZWtGcm9tLCBUYWtlfTsKIAordXNlIGNyYXRlOjphbGdvcml0aG1zOjpTaWduYXR1cmVBbGdvcml0aG1JRDsKIHVzZSBjcmF0ZTo6emlwdXRpbDo6e3NldF9jZW50cmFsX2RpcmVjdG9yeV9vZmZzZXQsIHppcF9zZWN0aW9uc307CiAKIGNvbnN0IEFQS19TSUdfQkxPQ0tfTUlOX1NJWkU6IHUzMiA9IDMyOwogY29uc3QgQVBLX1NJR19CTE9DS19NQUdJQzogdTEyOCA9IDB4MzIzNDIwNmI2MzZmNmM0MjIwNjc2OTUzMjA0YjUwNDE7CiAKLS8vIFRPRE8oam9veXVuZyk6IGludHJvZHVjZSB0eXBlCi1wdWIgY29uc3QgU0lHTkFUVVJFX1JTQV9QU1NfV0lUSF9TSEEyNTY6IHUzMiA9IDB4MDEwMTsKLXB1YiBjb25zdCBTSUdOQVRVUkVfUlNBX1BTU19XSVRIX1NIQTUxMjogdTMyID0gMHgwMTAyOwotcHViIGNvbnN0IFNJR05BVFVSRV9SU0FfUEtDUzFfVjFfNV9XSVRIX1NIQTI1NjogdTMyID0gMHgwMTAzOwotcHViIGNvbnN0IFNJR05BVFVSRV9SU0FfUEtDUzFfVjFfNV9XSVRIX1NIQTUxMjogdTMyID0gMHgwMTA0OwotcHViIGNvbnN0IFNJR05BVFVSRV9FQ0RTQV9XSVRIX1NIQTI1NjogdTMyID0gMHgwMjAxOwotcHViIGNvbnN0IFNJR05BVFVSRV9FQ0RTQV9XSVRIX1NIQTUxMjogdTMyID0gMHgwMjAyOwotcHViIGNvbnN0IFNJR05BVFVSRV9EU0FfV0lUSF9TSEEyNTY6IHUzMiA9IDB4MDMwMTsKLXB1YiBjb25zdCBTSUdOQVRVUkVfVkVSSVRZX1JTQV9QS0NTMV9WMV81X1dJVEhfU0hBMjU2OiB1MzIgPSAweDA0MjE7Ci1wdWIgY29uc3QgU0lHTkFUVVJFX1ZFUklUWV9FQ0RTQV9XSVRIX1NIQTI1NjogdTMyID0gMHgwNDIzOwotcHViIGNvbnN0IFNJR05BVFVSRV9WRVJJVFlfRFNBX1dJVEhfU0hBMjU2OiB1MzIgPSAweDA0MjU7Ci0KLS8vIFRPRE8oam9veXVuZyk6IGludHJvZHVjZSB0eXBlCi1jb25zdCBDT05URU5UX0RJR0VTVF9DSFVOS0VEX1NIQTI1NjogdTMyID0gMTsKLWNvbnN0IENPTlRFTlRfRElHRVNUX0NIVU5LRURfU0hBNTEyOiB1MzIgPSAyOwotY29uc3QgQ09OVEVOVF9ESUdFU1RfVkVSSVRZX0NIVU5LRURfU0hBMjU2OiB1MzIgPSAzOwotI1thbGxvdyh1bnVzZWQpXQotY29uc3QgQ09OVEVOVF9ESUdFU1RfU0hBMjU2OiB1MzIgPSA0OwotCiBjb25zdCBDSFVOS19TSVpFX0JZVEVTOiB1NjQgPSAxMDI0ICogMTAyNDsKK2NvbnN0IENIVU5LX0hFQURFUl9UT1A6ICZbdThdID0gJlsweDVhXTsKK2NvbnN0IENIVU5LX0hFQURFUl9NSUQ6ICZbdThdID0gJlsweGE1XTsKIAogLy8vIFRoZSBbQVBLIHN0cnVjdHVyZV0gaGFzIGZvdXIgbWFqb3Igc2VjdGlvbnM6CiAvLy8KQEAgLTk2LDkgKzgwLDExIEBACiAgICAgLy8vICAgIGNodW5rcyAobGl0dGxlLWVuZGlhbiB1aW50MzIpLCBhbmQgdGhlIGNvbmNhdGVuYXRpb24gb2YgZGlnZXN0cyBvZiB0aGUgY2h1bmtzIGluIHRoZQogICAgIC8vLyAgICBvcmRlciB0aGUgY2h1bmtzIGFwcGVhciBpbiB0aGUgQVBLLgogICAgIC8vLyAoc2VlIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL3NlY3VyaXR5L2Fwa3NpZ25pbmcvdjIjaW50ZWdyaXR5LXByb3RlY3RlZC1jb250ZW50cykKLSAgICBwdWIgZm4gY29tcHV0ZV9kaWdlc3QoJm11dCBzZWxmLCBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiB1MzIpIC0+IFJlc3VsdDxWZWM8dTg+PiB7Ci0gICAgICAgIGxldCBkaWdlc3RlciA9IERpZ2VzdGVyOjpuZXcoc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk/OwotCisgICAgcHViKGNyYXRlKSBmbiBjb21wdXRlX2RpZ2VzdCgKKyAgICAgICAgJm11dCBzZWxmLAorICAgICAgICBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiBTaWduYXR1cmVBbGdvcml0aG1JRCwKKyAgICApIC0+IFJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBkaWdlc3RlciA9IERpZ2VzdGVyIHsgbWVzc2FnZV9kaWdlc3Q6IHNpZ25hdHVyZV9hbGdvcml0aG1faWQubmV3X21lc3NhZ2VfZGlnZXN0KCkgfTsKICAgICAgICAgbGV0IG11dCBkaWdlc3RzX29mX2NodW5rcyA9IEJ5dGVzTXV0OjpuZXcoKTsKICAgICAgICAgbGV0IG11dCBjaHVua19jb3VudCA9IDB1MzI7CiAgICAgICAgIGxldCBtdXQgY2h1bmsgPSB2ZWMhWzB1ODsgQ0hVTktfU0laRV9CWVRFUyBhcyB1c2l6ZV07CkBAIC0xNjMsMzAgKzE0OSwxMyBAQAogfQogCiBzdHJ1Y3QgRGlnZXN0ZXIgewotICAgIGFsZ29yaXRobTogTWVzc2FnZURpZ2VzdCwKKyAgICBtZXNzYWdlX2RpZ2VzdDogTWVzc2FnZURpZ2VzdCwKIH0KIAotY29uc3QgQ0hVTktfSEVBREVSX1RPUDogJlt1OF0gPSAmWzB4NWFdOwotY29uc3QgQ0hVTktfSEVBREVSX01JRDogJlt1OF0gPSAmWzB4YTVdOwotCiBpbXBsIERpZ2VzdGVyIHsKLSAgICBmbiBuZXcoc2lnbmF0dXJlX2FsZ29yaXRobV9pZDogdTMyKSAtPiBSZXN1bHQ8RGlnZXN0ZXI+IHsKLSAgICAgICAgbGV0IGRpZ2VzdF9hbGdvcml0aG1faWQgPSB0b19jb250ZW50X2RpZ2VzdF9hbGdvcml0aG0oc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk/OwotICAgICAgICBsZXQgYWxnb3JpdGhtID0gbWF0Y2ggZGlnZXN0X2FsZ29yaXRobV9pZCB7Ci0gICAgICAgICAgICBDT05URU5UX0RJR0VTVF9DSFVOS0VEX1NIQTI1NiA9PiBNZXNzYWdlRGlnZXN0OjpzaGEyNTYoKSwKLSAgICAgICAgICAgIENPTlRFTlRfRElHRVNUX0NIVU5LRURfU0hBNTEyID0+IE1lc3NhZ2VEaWdlc3Q6OnNoYTUxMigpLAotICAgICAgICAgICAgLy8gVE9ETyhqb295dW5nKTogaW1wbGVtZW50Ci0gICAgICAgICAgICBDT05URU5UX0RJR0VTVF9WRVJJVFlfQ0hVTktFRF9TSEEyNTYgPT4gewotICAgICAgICAgICAgICAgIGJhaWwhKCJUT0RPKGIvMTkwMzQzODQyKTogQ09OVEVOVF9ESUdFU1RfVkVSSVRZX0NIVU5LRURfU0hBMjU2OiBub3QgaW1wbGVtZW50ZWQiKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgXyA9PiBiYWlsISgiVW5rbm93biBkaWdlc3QgYWxnb3JpdGhtOiB7fSIsIGRpZ2VzdF9hbGdvcml0aG1faWQpLAotICAgICAgICB9OwotICAgICAgICBPayhEaWdlc3RlciB7IGFsZ29yaXRobSB9KQotICAgIH0KLQogICAgIC8vIHYyL3YzIGRpZ2VzdHMgYXJlIGNvbXB1dGVkIGFmdGVyIHByZXBlbmRpbmcgImhlYWRlciIgYnl0ZSBhbmQgInNpemUiIGluZm8uCiAgICAgZm4gZGlnZXN0KCZzZWxmLCBkYXRhOiAmW3U4XSwgaGVhZGVyOiAmW3U4XSwgc2l6ZTogdTMyKSAtPiBSZXN1bHQ8RGlnZXN0Qnl0ZXM+IHsKLSAgICAgICAgbGV0IG11dCBoYXNoZXIgPSBIYXNoZXI6Om5ldyhzZWxmLmFsZ29yaXRobSk/OworICAgICAgICBsZXQgbXV0IGhhc2hlciA9IEhhc2hlcjo6bmV3KHNlbGYubWVzc2FnZV9kaWdlc3QpPzsKICAgICAgICAgaGFzaGVyLnVwZGF0ZShoZWFkZXIpPzsKICAgICAgICAgaGFzaGVyLnVwZGF0ZSgmc2l6ZS50b19sZV9ieXRlcygpKT87CiAgICAgICAgIGhhc2hlci51cGRhdGUoZGF0YSk/OwpAQCAtMjU5LDU1ICsyMjgsNiBAQAogICAgIEVycihFcnJvcjo6bmV3KGlvOjpFcnJvcjo6ZnJvbShFcnJvcktpbmQ6Ok5vdEZvdW5kKSkuY29udGV4dChjb250ZXh0KSkKIH0KIAotcHViIGZuIGlzX3N1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtKGFsZ29yaXRobV9pZDogdTMyKSAtPiBib29sIHsKLSAgICBtYXRjaGVzISgKLSAgICAgICAgYWxnb3JpdGhtX2lkLAotICAgICAgICBTSUdOQVRVUkVfUlNBX1BTU19XSVRIX1NIQTI1NgotICAgICAgICAgICAgfCBTSUdOQVRVUkVfUlNBX1BTU19XSVRIX1NIQTUxMgotICAgICAgICAgICAgfCBTSUdOQVRVUkVfUlNBX1BLQ1MxX1YxXzVfV0lUSF9TSEEyNTYKLSAgICAgICAgICAgIHwgU0lHTkFUVVJFX1JTQV9QS0NTMV9WMV81X1dJVEhfU0hBNTEyCi0gICAgICAgICAgICB8IFNJR05BVFVSRV9FQ0RTQV9XSVRIX1NIQTI1NgotICAgICAgICAgICAgfCBTSUdOQVRVUkVfRUNEU0FfV0lUSF9TSEE1MTIKLSAgICAgICAgICAgIHwgU0lHTkFUVVJFX0RTQV9XSVRIX1NIQTI1NgotICAgICAgICAgICAgfCBTSUdOQVRVUkVfVkVSSVRZX1JTQV9QS0NTMV9WMV81X1dJVEhfU0hBMjU2Ci0gICAgICAgICAgICB8IFNJR05BVFVSRV9WRVJJVFlfRUNEU0FfV0lUSF9TSEEyNTYKLSAgICAgICAgICAgIHwgU0lHTkFUVVJFX1ZFUklUWV9EU0FfV0lUSF9TSEEyNTYKLSAgICApCi19Ci0KLWZuIHRvX2NvbnRlbnRfZGlnZXN0X2FsZ29yaXRobShhbGdvcml0aG1faWQ6IHUzMikgLT4gUmVzdWx0PHUzMj4gewotICAgIG1hdGNoIGFsZ29yaXRobV9pZCB7Ci0gICAgICAgIFNJR05BVFVSRV9SU0FfUFNTX1dJVEhfU0hBMjU2Ci0gICAgICAgIHwgU0lHTkFUVVJFX1JTQV9QS0NTMV9WMV81X1dJVEhfU0hBMjU2Ci0gICAgICAgIHwgU0lHTkFUVVJFX0VDRFNBX1dJVEhfU0hBMjU2Ci0gICAgICAgIHwgU0lHTkFUVVJFX0RTQV9XSVRIX1NIQTI1NiA9PiBPayhDT05URU5UX0RJR0VTVF9DSFVOS0VEX1NIQTI1NiksCi0gICAgICAgIFNJR05BVFVSRV9SU0FfUFNTX1dJVEhfU0hBNTEyCi0gICAgICAgIHwgU0lHTkFUVVJFX1JTQV9QS0NTMV9WMV81X1dJVEhfU0hBNTEyCi0gICAgICAgIHwgU0lHTkFUVVJFX0VDRFNBX1dJVEhfU0hBNTEyID0+IE9rKENPTlRFTlRfRElHRVNUX0NIVU5LRURfU0hBNTEyKSwKLSAgICAgICAgU0lHTkFUVVJFX1ZFUklUWV9SU0FfUEtDUzFfVjFfNV9XSVRIX1NIQTI1NgotICAgICAgICB8IFNJR05BVFVSRV9WRVJJVFlfRUNEU0FfV0lUSF9TSEEyNTYKLSAgICAgICAgfCBTSUdOQVRVUkVfVkVSSVRZX0RTQV9XSVRIX1NIQTI1NiA9PiBPayhDT05URU5UX0RJR0VTVF9WRVJJVFlfQ0hVTktFRF9TSEEyNTYpLAotICAgICAgICBfID0+IGJhaWwhKCJVbmtub3duIHNpZ25hdHVyZSBhbGdvcml0aG06IHt9IiwgYWxnb3JpdGhtX2lkKSwKLSAgICB9Ci19Ci0KLS8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGhlbHAgcGljayB2NCBhcGsgZGlnZXN0LiBBY2NvcmRpbmcgdG8gQVBLIFNpZ25hdHVyZQotLy8vIFNjaGVtZSB2NCwgYXBrIGRpZ2VzdCBpcyB0aGUgZmlyc3QgYXZhaWxhYmxlIGNvbnRlbnQgZGlnZXN0IG9mIHRoZSBoaWdoZXN0Ci0vLy8gcmFuayAocmFuayBOKS4KLS8vLwotLy8vIFRoaXMgcmFuayB3YXMgYWxzbyB1c2VkIGZvciBzdGVwIDNhIG9mIHRoZSB2MyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLgotLy8vCi0vLy8gW3YzIHZlcmlmaWNhdGlvbl06IGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RvY3Mvc2VjdXJpdHkvYXBrc2lnbmluZy92MyN2My12ZXJpZmljYXRpb24KLXB1YiBmbiBnZXRfc2lnbmF0dXJlX2FsZ29yaXRobV9yYW5rKGFsZ286IHUzMikgLT4gUmVzdWx0PHUzMj4gewotICAgIGxldCBjb250ZW50X2RpZ2VzdCA9IHRvX2NvbnRlbnRfZGlnZXN0X2FsZ29yaXRobShhbGdvKT87Ci0gICAgbWF0Y2ggY29udGVudF9kaWdlc3QgewotICAgICAgICBDT05URU5UX0RJR0VTVF9DSFVOS0VEX1NIQTI1NiA9PiBPaygwKSwKLSAgICAgICAgQ09OVEVOVF9ESUdFU1RfVkVSSVRZX0NIVU5LRURfU0hBMjU2ID0+IE9rKDEpLAotICAgICAgICBDT05URU5UX0RJR0VTVF9DSFVOS0VEX1NIQTUxMiA9PiBPaygyKSwKLSAgICAgICAgXyA9PiBiYWlsISgiVW5rbm93biBkaWdlc3QgYWxnb3JpdGhtOiB7fSIsIGNvbnRlbnRfZGlnZXN0KSwKLSAgICB9Ci19Ci0KICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7CkBAIC0zNTQsNyArMjc0LDcgQEAKICAgICBmbiB0ZXN0X2Fwa19kaWdlc3QoKSB7CiAgICAgICAgIGxldCBhcGtfZmlsZSA9IEZpbGU6Om9wZW4oInRlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMTAyNC5hcGsiKS51bndyYXAoKTsKICAgICAgICAgbGV0IG11dCBhcGtfc2VjdGlvbnMgPSBBcGtTZWN0aW9uczo6bmV3KGFwa19maWxlKS51bndyYXAoKTsKLSAgICAgICAgbGV0IGRpZ2VzdCA9IGFwa19zZWN0aW9ucy5jb21wdXRlX2RpZ2VzdChTSUdOQVRVUkVfRFNBX1dJVEhfU0hBMjU2KS51bndyYXAoKTsKKyAgICAgICAgbGV0IGRpZ2VzdCA9IGFwa19zZWN0aW9ucy5jb21wdXRlX2RpZ2VzdChTaWduYXR1cmVBbGdvcml0aG1JRDo6RHNhV2l0aFNoYTI1NikudW53cmFwKCk7CiAgICAgICAgIGFzc2VydF9lcSEoCiAgICAgICAgICAgICAiMERGMjQyNkVBMzNBRURBRjQ5NUQ4OEU1QkUwQzZBMTY2M0ZGMEE4MUM1RUQxMkQ1QjI5MjlBRTRCNDMwMEYyRiIsCiAgICAgICAgICAgICB0b19oZXhfc3RyaW5nKCZkaWdlc3RbLi5dKQpkaWZmIC0tZ2l0IGEvbGlicy9hcGt2ZXJpZnkvc3JjL3YzLnJzIGIvbGlicy9hcGt2ZXJpZnkvc3JjL3YzLnJzCmluZGV4IGQ0MjliYTEuLjBmZTJmMmIgMTAwNjQ0Ci0tLSBhL2xpYnMvYXBrdmVyaWZ5L3NyYy92My5ycworKysgYi9saWJzL2Fwa3ZlcmlmeS9zcmMvdjMucnMKQEAgLTE4LDI0ICsxOCwyMyBAQAogLy8hCiAvLyEgW3YzIHZlcmlmaWNhdGlvbl06IGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL3NlY3VyaXR5L2Fwa3NpZ25pbmcvdjMjdmVyaWZpY2F0aW9uCiAKLXVzZSBhbnlob3c6Onthbnlob3csIGJhaWwsIGVuc3VyZSwgQ29udGV4dCwgUmVzdWx0fTsKK3VzZSBhbnlob3c6OntlbnN1cmUsIENvbnRleHQsIFJlc3VsdH07CiB1c2UgYnl0ZXM6OkJ5dGVzOwotdXNlIG9wZW5zc2w6Omhhc2g6Ok1lc3NhZ2VEaWdlc3Q7Cit1c2UgbnVtX3RyYWl0czo6RnJvbVByaW1pdGl2ZTsKIHVzZSBvcGVuc3NsOjpwa2V5Ojp7c2VsZiwgUEtleX07Ci11c2Ugb3BlbnNzbDo6cnNhOjpQYWRkaW5nOwotdXNlIG9wZW5zc2w6OnNpZ246OlZlcmlmaWVyOwogdXNlIG9wZW5zc2w6Ong1MDk6Olg1MDk7CiB1c2Ugc3RkOjpmczo6RmlsZTsKIHVzZSBzdGQ6OmlvOjp7UmVhZCwgU2Vla307CiB1c2Ugc3RkOjpvcHM6OlJhbmdlOwogdXNlIHN0ZDo6cGF0aDo6UGF0aDsKIAordXNlIGNyYXRlOjphbGdvcml0aG1zOjpTaWduYXR1cmVBbGdvcml0aG1JRDsKIHVzZSBjcmF0ZTo6Ynl0ZXNfZXh0Ojp7Qnl0ZXNFeHQsIExlbmd0aFByZWZpeGVkLCBSZWFkRnJvbUJ5dGVzfTsKIHVzZSBjcmF0ZTo6c2lndXRpbDo6KjsKIAogcHViIGNvbnN0IEFQS19TSUdOQVRVUkVfU0NIRU1FX1YzX0JMT0NLX0lEOiB1MzIgPSAweGYwNTM2OGMwOwogCi0vLyBUT0RPKGpvb3l1bmcpOiBnZXQgInJvLmJ1aWxkLnZlcnNpb24uc2RrIgorLy8gVE9ETyhiLzE5MDM0Mzg0Mik6IGdldCAicm8uYnVpbGQudmVyc2lvbi5zZGsiCiBjb25zdCBTREtfSU5UOiB1MzIgPSAzMTsKIAogdHlwZSBTaWduZXJzID0gTGVuZ3RoUHJlZml4ZWQ8VmVjPExlbmd0aFByZWZpeGVkPFNpZ25lcj4+PjsKQEAgLTcxLDYgKzcwLDcgQEAKIAogI1tkZXJpdmUoRGVidWcpXQogc3RydWN0IFNpZ25hdHVyZSB7CisgICAgLy8vIFRPRE8oYi8yNDYyNTQzNTUpOiBDaGFuZ2UgdGhlIHR5cGUgb2Ygc2lnbmF0dXJlX2FsZ29yaXRobV9pZCB0byBTaWduYXR1cmVBbGdvcml0aG1JRAogICAgIHNpZ25hdHVyZV9hbGdvcml0aG1faWQ6IHUzMiwKICAgICBzaWduYXR1cmU6IExlbmd0aFByZWZpeGVkPEJ5dGVzPiwKIH0KQEAgLTg1LDkgKzg1LDkgQEAKIAogLy8vIFZlcmlmaWVzIEFQSyBTaWduYXR1cmUgU2NoZW1lIHYzIHNpZ25hdHVyZXMgb2YgdGhlIHByb3ZpZGVkIEFQSyBhbmQgcmV0dXJucyB0aGUgcHVibGljIGtleQogLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmVyIGluIERFUiBmb3JtYXQuCi1wdWIgZm4gdmVyaWZ5PFA6IEFzUmVmPFBhdGg+PihwYXRoOiBQKSAtPiBSZXN1bHQ8Qm94PFt1OF0+PiB7Ci0gICAgbGV0IGYgPSBGaWxlOjpvcGVuKHBhdGguYXNfcmVmKCkpPzsKLSAgICBsZXQgbXV0IHNlY3Rpb25zID0gQXBrU2VjdGlvbnM6Om5ldyhmKT87CitwdWIgZm4gdmVyaWZ5PFA6IEFzUmVmPFBhdGg+PihhcGtfcGF0aDogUCkgLT4gUmVzdWx0PEJveDxbdThdPj4geworICAgIGxldCBhcGsgPSBGaWxlOjpvcGVuKGFwa19wYXRoLmFzX3JlZigpKT87CisgICAgbGV0IG11dCBzZWN0aW9ucyA9IEFwa1NlY3Rpb25zOjpuZXcoYXBrKT87CiAgICAgZmluZF9zaWduZXJfYW5kX3RoZW4oJm11dCBzZWN0aW9ucywgfChzaWduZXIsIHNlY3Rpb25zKXwgc2lnbmVyLnZlcmlmeShzZWN0aW9ucykpCiB9CiAKQEAgLTEwNSwyMSArMTA1LDIwIEBACiAgICAgbGV0IHN1cHBvcnRlZCA9IHNpZ25lcnMuaXRlcigpLmZpbHRlcih8c3wgcy5zZGtfcmFuZ2UoKS5jb250YWlucygmU0RLX0lOVCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCk7CiAKICAgICAvLyB0aGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUKLSAgICBpZiBzdXBwb3J0ZWQubGVuKCkgIT0gMSB7Ci0gICAgICAgIGJhaWwhKAotICAgICAgICAgICAgIkFQSyBTaWduYXR1cmUgU2NoZW1lIFYzIG9ubHkgc3VwcG9ydHMgb25lIHNpZ25lcjoge30gc2lnbmVycyBmb3VuZC4iLAotICAgICAgICAgICAgc3VwcG9ydGVkLmxlbigpCi0gICAgICAgICkKLSAgICB9CisgICAgZW5zdXJlISgKKyAgICAgICAgc3VwcG9ydGVkLmxlbigpID09IDEsCisgICAgICAgICJBUEsgU2lnbmF0dXJlIFNjaGVtZSBWMyBvbmx5IHN1cHBvcnRzIG9uZSBzaWduZXI6IHt9IHNpZ25lcnMgZm91bmQuIiwKKyAgICAgICAgc3VwcG9ydGVkLmxlbigpCisgICAgKTsKIAogICAgIC8vIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uCiAgICAgZigoc3VwcG9ydGVkWzBdLCBzZWN0aW9ucykpCiB9CiAKIC8vLyBHZXRzIHRoZSBwdWJsaWMga2V5IChpbiBERVIgZm9ybWF0KSB0aGF0IHdhcyB1c2VkIHRvIHNpZ24gdGhlIGdpdmVuIEFQSy9BUEVYIGZpbGUKLXB1YiBmbiBnZXRfcHVibGljX2tleV9kZXI8UDogQXNSZWY8UGF0aD4+KHBhdGg6IFApIC0+IFJlc3VsdDxCb3g8W3U4XT4+IHsKLSAgICBsZXQgZiA9IEZpbGU6Om9wZW4ocGF0aC5hc19yZWYoKSk/OwotICAgIGxldCBtdXQgc2VjdGlvbnMgPSBBcGtTZWN0aW9uczo6bmV3KGYpPzsKK3B1YiBmbiBnZXRfcHVibGljX2tleV9kZXI8UDogQXNSZWY8UGF0aD4+KGFwa19wYXRoOiBQKSAtPiBSZXN1bHQ8Qm94PFt1OF0+PiB7CisgICAgbGV0IGFwayA9IEZpbGU6Om9wZW4oYXBrX3BhdGguYXNfcmVmKCkpPzsKKyAgICBsZXQgbXV0IHNlY3Rpb25zID0gQXBrU2VjdGlvbnM6Om5ldyhhcGspPzsKICAgICBmaW5kX3NpZ25lcl9hbmRfdGhlbigmbXV0IHNlY3Rpb25zLCB8KHNpZ25lciwgXyl8IHsKICAgICAgICAgT2soc2lnbmVyLnB1YmxpY19rZXkudG9fdmVjKCkuaW50b19ib3hlZF9zbGljZSgpKQogICAgIH0pCkBAIC0xMjgsNyArMTI3LDcgQEAKIC8vLyBHZXRzIHRoZSB2NCBbYXBrX2RpZ2VzdF0uCiAvLy8KIC8vLyBbYXBrX2RpZ2VzdF06IGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RvY3Mvc2VjdXJpdHkvYXBrc2lnbmluZy92NCNhcGstZGlnZXN0Ci1wdWIgZm4gcGlja192NF9hcGtfZGlnZXN0PFI6IFJlYWQgKyBTZWVrPihhcGs6IFIpIC0+IFJlc3VsdDwodTMyLCBCb3g8W3U4XT4pPiB7CitwdWIgZm4gcGlja192NF9hcGtfZGlnZXN0PFI6IFJlYWQgKyBTZWVrPihhcGs6IFIpIC0+IFJlc3VsdDwoU2lnbmF0dXJlQWxnb3JpdGhtSUQsIEJveDxbdThdPik+IHsKICAgICBsZXQgbXV0IHNlY3Rpb25zID0gQXBrU2VjdGlvbnM6Om5ldyhhcGspPzsKICAgICBsZXQgbXV0IGJsb2NrID0gc2VjdGlvbnMuZmluZF9zaWduYXR1cmUoQVBLX1NJR05BVFVSRV9TQ0hFTUVfVjNfQkxPQ0tfSUQpPzsKICAgICBsZXQgc2lnbmVycyA9IGJsb2NrLnJlYWQ6OjxTaWduZXJzPigpPzsKQEAgLTE0MywyMCArMTQyLDI3IEBACiAgICAgICAgIE9rKHNlbGYKICAgICAgICAgICAgIC5zaWduYXR1cmVzCiAgICAgICAgICAgICAuaXRlcigpCi0gICAgICAgICAgICAuZmlsdGVyKHxzaWd8IGlzX3N1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtKHNpZy5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKSkKLSAgICAgICAgICAgIC5tYXhfYnlfa2V5KHxzaWd8IGdldF9zaWduYXR1cmVfYWxnb3JpdGhtX3Jhbmsoc2lnLnNpZ25hdHVyZV9hbGdvcml0aG1faWQpLnVud3JhcCgpKQotICAgICAgICAgICAgLm9rX29yX2Vsc2UofHwgYW55aG93ISgiTm8gc3VwcG9ydGVkIHNpZ25hdHVyZXMgZm91bmQiKSk/KQorICAgICAgICAgICAgLmZpbHRlcih8c2lnfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6ZnJvbV91MzIoc2lnLnNpZ25hdHVyZV9hbGdvcml0aG1faWQpLmlzX3NvbWUoKSkKKyAgICAgICAgICAgIC5tYXhfYnlfa2V5KHxzaWd8IHsKKyAgICAgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6ZnJvbV91MzIoc2lnLnNpZ25hdHVyZV9hbGdvcml0aG1faWQpCisgICAgICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgICAgICAudG9fY29udGVudF9kaWdlc3RfYWxnb3JpdGhtKCkKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuY29udGV4dCgiTm8gc3VwcG9ydGVkIHNpZ25hdHVyZXMgZm91bmQiKT8pCiAgICAgfQogCi0gICAgZm4gcGlja192NF9hcGtfZGlnZXN0KCZzZWxmKSAtPiBSZXN1bHQ8KHUzMiwgQm94PFt1OF0+KT4geworICAgIGZuIHBpY2tfdjRfYXBrX2RpZ2VzdCgmc2VsZikgLT4gUmVzdWx0PChTaWduYXR1cmVBbGdvcml0aG1JRCwgQm94PFt1OF0+KT4gewogICAgICAgICBsZXQgc3Ryb25nZXN0ID0gc2VsZi5zdHJvbmdlc3Rfc2lnbmF0dXJlKCk/OwogICAgICAgICBsZXQgc2lnbmVkX2RhdGE6IFNpZ25lZERhdGEgPSBzZWxmLnNpZ25lZF9kYXRhLnNsaWNlKC4uKS5yZWFkKCk/OwogICAgICAgICBsZXQgZGlnZXN0ID0gc2lnbmVkX2RhdGEKICAgICAgICAgICAgIC5kaWdlc3RzCiAgICAgICAgICAgICAuaXRlcigpCiAgICAgICAgICAgICAuZmluZCh8JmRpZ3wgZGlnLnNpZ25hdHVyZV9hbGdvcml0aG1faWQgPT0gc3Ryb25nZXN0LnNpZ25hdHVyZV9hbGdvcml0aG1faWQpCi0gICAgICAgICAgICAub2tfb3JfZWxzZSh8fCBhbnlob3chKCJEaWdlc3Qgbm90IGZvdW5kIikpPzsKLSAgICAgICAgT2soKGRpZ2VzdC5zaWduYXR1cmVfYWxnb3JpdGhtX2lkLCBkaWdlc3QuZGlnZXN0LmFzX3JlZigpLnRvX3ZlYygpLmludG9fYm94ZWRfc2xpY2UoKSkpCisgICAgICAgICAgICAuY29udGV4dCgiRGlnZXN0IG5vdCBmb3VuZCIpPzsKKyAgICAgICAgLy8gVE9ETyhiLzI0NjI1NDM1NSk6IFJlbW92ZSB0aGlzIGNvbnZlcnNpb24gb25jZSBEaWdlc3QgY29udGFpbnMgdGhlIGVudW0gU2lnbmF0dXJlQWxnb3JpdGhtSUQKKyAgICAgICAgbGV0IHNpZ25hdHVyZV9hbGdvcml0aG1faWQgPSBTaWduYXR1cmVBbGdvcml0aG1JRDo6ZnJvbV91MzIoZGlnZXN0LnNpZ25hdHVyZV9hbGdvcml0aG1faWQpCisgICAgICAgICAgICAuY29udGV4dCgiVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIik/OworICAgICAgICBPaygoc2lnbmF0dXJlX2FsZ29yaXRobV9pZCwgZGlnZXN0LmRpZ2VzdC5hc19yZWYoKS50b192ZWMoKS5pbnRvX2JveGVkX3NsaWNlKCkpKQogICAgIH0KIAogICAgIC8vLyBUaGUgc3RlcHMgaW4gdGhpcyBtZXRob2QgaW1wbGVtZW50cyBBUEsgU2lnbmF0dXJlIFNjaGVtZSB2MyB2ZXJpZmljYXRpb24gc3RlcCAzLgpAQCAtMTc0LDIwICsxODAsMjAgQEAKIAogICAgICAgICAvLyAzLiBWZXJpZnkgdGhlIG1pbiBhbmQgbWF4IFNESyB2ZXJzaW9ucyBpbiB0aGUgc2lnbmVkIGRhdGEgbWF0Y2ggdGhvc2Ugc3BlY2lmaWVkIGZvciB0aGUKICAgICAgICAgLy8gICAgc2lnbmVyLgotICAgICAgICBpZiBzZWxmLnNka19yYW5nZSgpICE9IHNpZ25lZF9kYXRhLnNka19yYW5nZSgpIHsKLSAgICAgICAgICAgIGJhaWwhKCJTREsgdmVyc2lvbnMgbWlzbWF0Y2ggYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIGluIHYzIHNpZ25lciBibG9jay4iKTsKLSAgICAgICAgfQorICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgc2VsZi5zZGtfcmFuZ2UoKSA9PSBzaWduZWRfZGF0YS5zZGtfcmFuZ2UoKSwKKyAgICAgICAgICAgICJTREsgdmVyc2lvbnMgbWlzbWF0Y2ggYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIGluIHYzIHNpZ25lciBibG9jay4iCisgICAgICAgICk7CiAKICAgICAgICAgLy8gNC4gVmVyaWZ5IHRoYXQgdGhlIG9yZGVyZWQgbGlzdCBvZiBzaWduYXR1cmUgYWxnb3JpdGhtIElEcyBpbiBkaWdlc3RzIGFuZCBzaWduYXR1cmVzIGlzCiAgICAgICAgIC8vICAgIGlkZW50aWNhbC4gKFRoaXMgaXMgdG8gcHJldmVudCBzaWduYXR1cmUgc3RyaXBwaW5nL2FkZGl0aW9uLikKLSAgICAgICAgaWYgIXNlbGYKLSAgICAgICAgICAgIC5zaWduYXR1cmVzCi0gICAgICAgICAgICAuaXRlcigpCi0gICAgICAgICAgICAubWFwKHxzaWd8IHNpZy5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKQotICAgICAgICAgICAgLmVxKHNpZ25lZF9kYXRhLmRpZ2VzdHMuaXRlcigpLm1hcCh8ZGlnfCBkaWcuc2lnbmF0dXJlX2FsZ29yaXRobV9pZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhaWwhKCJTaWduYXR1cmUgYWxnb3JpdGhtcyBkb24ndCBtYXRjaCBiZXR3ZWVuIGRpZ2VzdHMgYW5kIHNpZ25hdHVyZXMgcmVjb3JkcyIpOwotICAgICAgICB9CisgICAgICAgIGVuc3VyZSEoCisgICAgICAgICAgICBzZWxmLnNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAgICAgLm1hcCh8c2lnfCBzaWcuc2lnbmF0dXJlX2FsZ29yaXRobV9pZCkKKyAgICAgICAgICAgICAgICAuZXEoc2lnbmVkX2RhdGEuZGlnZXN0cy5pdGVyKCkubWFwKHxkaWd8IGRpZy5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKSksCisgICAgICAgICAgICAiU2lnbmF0dXJlIGFsZ29yaXRobXMgZG9uJ3QgbWF0Y2ggYmV0d2VlbiBkaWdlc3RzIGFuZCBzaWduYXR1cmVzIHJlY29yZHMiCisgICAgICAgICk7CiAKICAgICAgICAgLy8gNS4gQ29tcHV0ZSB0aGUgZGlnZXN0IG9mIEFQSyBjb250ZW50cyB1c2luZyB0aGUgc2FtZSBkaWdlc3QgYWxnb3JpdGhtIGFzIHRoZSBkaWdlc3QKICAgICAgICAgLy8gICAgYWxnb3JpdGhtIHVzZWQgYnkgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0uCkBAIC0xOTYsNjMgKzIwMiw0NSBAQAogICAgICAgICAgICAgLml0ZXIoKQogICAgICAgICAgICAgLmZpbmQofCZkaWd8IGRpZy5zaWduYXR1cmVfYWxnb3JpdGhtX2lkID09IHN0cm9uZ2VzdC5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKQogICAgICAgICAgICAgLnVud3JhcCgpOyAvLyBvayB0byB1bndyYXAgc2luY2Ugd2UgY2hlY2sgaWYgdHdvIGxpc3RzIGFyZSB0aGUgc2FtZSBhYm92ZQotICAgICAgICBsZXQgY29tcHV0ZWQgPSBzZWN0aW9ucy5jb21wdXRlX2RpZ2VzdChkaWdlc3Quc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk/OworICAgICAgICBsZXQgY29tcHV0ZWQgPSBzZWN0aW9ucy5jb21wdXRlX2RpZ2VzdCgKKyAgICAgICAgICAgIC8vIFRPRE8oYi8yNDYyNTQzNTUpOiBSZW1vdmVzIHRoZSBjb252ZXJzaW9uIG9uY2UgRGlnZXN0IGNvbnRhaW5zIHRoZSBlbnVtCisgICAgICAgICAgICAvLyBTaWduYXR1cmVBbGdvcml0aG1JRC4KKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpmcm9tX3UzMihkaWdlc3Quc2lnbmF0dXJlX2FsZ29yaXRobV9pZCkKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIik/LAorICAgICAgICApPzsKIAogICAgICAgICAvLyA2LiBWZXJpZnkgdGhhdCB0aGUgY29tcHV0ZWQgZGlnZXN0IGlzIGlkZW50aWNhbCB0byB0aGUgY29ycmVzcG9uZGluZyBkaWdlc3QgZnJvbSBkaWdlc3RzLgotICAgICAgICBpZiBjb21wdXRlZCAhPSBkaWdlc3QuZGlnZXN0LmFzX3JlZigpIHsKLSAgICAgICAgICAgIGJhaWwhKAotICAgICAgICAgICAgICAgICJEaWdlc3QgbWlzbWF0Y2g6IGNvbXB1dGVkPXs6P30gdnMgZXhwZWN0ZWQ9ezo/fSIsCi0gICAgICAgICAgICAgICAgdG9faGV4X3N0cmluZygmY29tcHV0ZWQpLAotICAgICAgICAgICAgICAgIHRvX2hleF9zdHJpbmcoJmRpZ2VzdC5kaWdlc3QpLAotICAgICAgICAgICAgKTsKLSAgICAgICAgfQorICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgY29tcHV0ZWQgPT0gZGlnZXN0LmRpZ2VzdC5hc19yZWYoKSwKKyAgICAgICAgICAgICJEaWdlc3QgbWlzbWF0Y2g6IGNvbXB1dGVkPXs6P30gdnMgZXhwZWN0ZWQ9ezo/fSIsCisgICAgICAgICAgICB0b19oZXhfc3RyaW5nKCZjb21wdXRlZCksCisgICAgICAgICAgICB0b19oZXhfc3RyaW5nKCZkaWdlc3QuZGlnZXN0KSwKKyAgICAgICAgKTsKIAogICAgICAgICAvLyA3LiBWZXJpZnkgdGhhdCBwdWJsaWMga2V5IG9mIHRoZSBmaXJzdCBjZXJ0aWZpY2F0ZSBvZiBjZXJ0aWZpY2F0ZXMgaXMgaWRlbnRpY2FsCiAgICAgICAgIC8vICAgIHRvIHB1YmxpYyBrZXkuCiAgICAgICAgIGxldCBjZXJ0ID0gc2lnbmVkX2RhdGEuY2VydGlmaWNhdGVzLmZpcnN0KCkuY29udGV4dCgiTm8gY2VydGlmaWNhdGVzIGxpc3RlZCIpPzsKICAgICAgICAgbGV0IGNlcnQgPSBYNTA5Ojpmcm9tX2RlcihjZXJ0LmFzX3JlZigpKT87Ci0gICAgICAgIGlmICFjZXJ0LnB1YmxpY19rZXkoKT8ucHVibGljX2VxKCZwdWJsaWNfa2V5KSB7Ci0gICAgICAgICAgICBiYWlsISgiUHVibGljIGtleSBtaXNtYXRjaCBiZXR3ZWVuIGNlcnRpZmljYXRlIGFuZCBzaWduYXR1cmUgcmVjb3JkIik7Ci0gICAgICAgIH0KKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGNlcnQucHVibGljX2tleSgpPy5wdWJsaWNfZXEoJnB1YmxpY19rZXkpLAorICAgICAgICAgICAgIlB1YmxpYyBrZXkgbWlzbWF0Y2ggYmV0d2VlbiBjZXJ0aWZpY2F0ZSBhbmQgc2lnbmF0dXJlIHJlY29yZCIKKyAgICAgICAgKTsKIAotICAgICAgICAvLyBUT0RPKGpvb3l1bmcpIDguIElmIHRoZSBwcm9vZi1vZi1yb3RhdGlvbiBhdHRyaWJ1dGUgZXhpc3RzIGZvciB0aGUgc2lnbmVyIHZlcmlmeSB0aGF0IHRoZSBzdHJ1Y3QgaXMgdmFsaWQgYW5kIHRoaXMgc2lnbmVyIGlzIHRoZSBsYXN0IGNlcnRpZmljYXRlIGluIHRoZSBsaXN0LgorICAgICAgICAvLyBUT0RPKGIvMjQ1OTE0MTA0KQorICAgICAgICAvLyA4LiBJZiB0aGUgcHJvb2Ytb2Ytcm90YXRpb24gYXR0cmlidXRlIGV4aXN0cyBmb3IgdGhlIHNpZ25lciB2ZXJpZnkgdGhhdCB0aGUKKyAgICAgICAgLy8gc3RydWN0IGlzIHZhbGlkIGFuZCB0aGlzIHNpZ25lciBpcyB0aGUgbGFzdCBjZXJ0aWZpY2F0ZSBpbiB0aGUgbGlzdC4KICAgICAgICAgT2soc2VsZi5wdWJsaWNfa2V5LnRvX3ZlYygpLmludG9fYm94ZWRfc2xpY2UoKSkKICAgICB9CiB9CiAKLWZuIHZlcmlmeV9zaWduZWRfZGF0YShkYXRhOiAmQnl0ZXMsIHNpZ25hdHVyZTogJlNpZ25hdHVyZSwga2V5OiAmUEtleTxwa2V5OjpQdWJsaWM+KSAtPiBSZXN1bHQ8KCk+IHsKLSAgICBsZXQgKHBrZXlfaWQsIHBhZGRpbmcsIGRpZ2VzdCkgPSBtYXRjaCBzaWduYXR1cmUuc2lnbmF0dXJlX2FsZ29yaXRobV9pZCB7Ci0gICAgICAgIFNJR05BVFVSRV9SU0FfUFNTX1dJVEhfU0hBMjU2ID0+IHsKLSAgICAgICAgICAgIChwa2V5OjpJZDo6UlNBLCBQYWRkaW5nOjpQS0NTMV9QU1MsIE1lc3NhZ2VEaWdlc3Q6OnNoYTI1NigpKQotICAgICAgICB9Ci0gICAgICAgIFNJR05BVFVSRV9SU0FfUFNTX1dJVEhfU0hBNTEyID0+IHsKLSAgICAgICAgICAgIChwa2V5OjpJZDo6UlNBLCBQYWRkaW5nOjpQS0NTMV9QU1MsIE1lc3NhZ2VEaWdlc3Q6OnNoYTUxMigpKQotICAgICAgICB9Ci0gICAgICAgIFNJR05BVFVSRV9SU0FfUEtDUzFfVjFfNV9XSVRIX1NIQTI1NiB8IFNJR05BVFVSRV9WRVJJVFlfUlNBX1BLQ1MxX1YxXzVfV0lUSF9TSEEyNTYgPT4gewotICAgICAgICAgICAgKHBrZXk6OklkOjpSU0EsIFBhZGRpbmc6OlBLQ1MxLCBNZXNzYWdlRGlnZXN0OjpzaGEyNTYoKSkKLSAgICAgICAgfQotICAgICAgICBTSUdOQVRVUkVfUlNBX1BLQ1MxX1YxXzVfV0lUSF9TSEE1MTIgPT4gewotICAgICAgICAgICAgKHBrZXk6OklkOjpSU0EsIFBhZGRpbmc6OlBLQ1MxLCBNZXNzYWdlRGlnZXN0OjpzaGE1MTIoKSkKLSAgICAgICAgfQotICAgICAgICBTSUdOQVRVUkVfRUNEU0FfV0lUSF9TSEEyNTYgfCBTSUdOQVRVUkVfVkVSSVRZX0VDRFNBX1dJVEhfU0hBMjU2ID0+IHsKLSAgICAgICAgICAgIChwa2V5OjpJZDo6RUMsIFBhZGRpbmc6Ok5PTkUsIE1lc3NhZ2VEaWdlc3Q6OnNoYTI1NigpKQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oYi8xOTAzNDM4NDIpIG5vdCBpbXBsZW1lbnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtCi0gICAgICAgIFNJR05BVFVSRV9FQ0RTQV9XSVRIX1NIQTUxMgotICAgICAgICB8IFNJR05BVFVSRV9EU0FfV0lUSF9TSEEyNTYKLSAgICAgICAgfCBTSUdOQVRVUkVfVkVSSVRZX0RTQV9XSVRIX1NIQTI1NiA9PiB7Ci0gICAgICAgICAgICBiYWlsISgKLSAgICAgICAgICAgICAgICAiVE9ETyhiLzE5MDM0Mzg0Mikgbm90IGltcGxlbWVudGVkIHNpZ25hdHVyZSBhbGdvcml0aG06IHs6I3h9IiwKLSAgICAgICAgICAgICAgICBzaWduYXR1cmUuc2lnbmF0dXJlX2FsZ29yaXRobV9pZAotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBfID0+IGJhaWwhKCJVbnN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtOiB7OiN4fSIsIHNpZ25hdHVyZS5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKSwKLSAgICB9OwotICAgIGVuc3VyZSEoa2V5LmlkKCkgPT0gcGtleV9pZCwgIlB1YmxpYyBrZXkgaGFzIHRoZSB3cm9uZyBJRCIpOwotICAgIGxldCBtdXQgdmVyaWZpZXIgPSBWZXJpZmllcjo6bmV3KGRpZ2VzdCwga2V5KT87Ci0gICAgaWYgcGtleV9pZCA9PSBwa2V5OjpJZDo6UlNBIHsKLSAgICAgICAgdmVyaWZpZXIuc2V0X3JzYV9wYWRkaW5nKHBhZGRpbmcpPzsKLSAgICB9CitmbiB2ZXJpZnlfc2lnbmVkX2RhdGEoCisgICAgZGF0YTogJkJ5dGVzLAorICAgIHNpZ25hdHVyZTogJlNpZ25hdHVyZSwKKyAgICBwdWJsaWNfa2V5OiAmUEtleTxwa2V5OjpQdWJsaWM+LAorKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IHZlcmlmaWVyID0gU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OmZyb21fdTMyKHNpZ25hdHVyZS5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKQorICAgICAgICAuY29udGV4dCgiVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIik/CisgICAgICAgIC5uZXdfdmVyaWZpZXIocHVibGljX2tleSk/OwogICAgIHZlcmlmaWVyLnVwZGF0ZShkYXRhKT87CiAgICAgbGV0IHZlcmlmaWVkID0gdmVyaWZpZXIudmVyaWZ5KCZzaWduYXR1cmUuc2lnbmF0dXJlKT87CiAgICAgZW5zdXJlISh2ZXJpZmllZCwgIlNpZ25hdHVyZSBpcyBpbnZhbGlkICIpOwpAQCAtMjYwLDcgKzI0OCw3IEBACiB9CiAKIC8vIFJlYWRGcm9tQnl0ZXMgaW1wbGVtZW50YXRpb25zCi0vLyBUT0RPKGpvb3l1bmcpOiBhZGQgZGVyaXZlIG1hY3JvOiAjW2Rlcml2ZShSZWFkRnJvbUJ5dGVzKV0KKy8vIFRPRE8oYi8xOTAzNDM4NDIpOiBhZGQgZGVyaXZlIG1hY3JvOiAjW2Rlcml2ZShSZWFkRnJvbUJ5dGVzKV0KIAogaW1wbCBSZWFkRnJvbUJ5dGVzIGZvciBTaWduZXIgewogICAgIGZuIHJlYWRfZnJvbV9ieXRlcyhidWY6ICZtdXQgQnl0ZXMpIC0+IFJlc3VsdDxTZWxmPiB7CkBAIC0zMDIsMzYgKzI5MCwzIEBACiBwdWIoY3JhdGUpIGZuIHRvX2hleF9zdHJpbmcoYnVmOiAmW3U4XSkgLT4gU3RyaW5nIHsKICAgICBidWYuaXRlcigpLm1hcCh8YnwgZm9ybWF0ISgiezowMlh9IiwgYikpLmNvbGxlY3QoKQogfQotCi0jW2NmZyh0ZXN0KV0KLW1vZCB0ZXN0cyB7Ci0gICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBzdGQ6OmZzOjpGaWxlOwotCi0gICAgI1t0ZXN0XQotICAgIGZuIHRlc3RfcGlja192NF9hcGtfZGlnZXN0X29ubHlfd2l0aF92M19kc2Ffc2hhMjU2KCkgewotICAgICAgICBjaGVja192NF9hcGtfZGlnZXN0KAotICAgICAgICAgICAgInRlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMTAyNC5hcGsiLAotICAgICAgICAgICAgU0lHTkFUVVJFX0RTQV9XSVRIX1NIQTI1NiwKLSAgICAgICAgICAgICIwREYyNDI2RUEzM0FFREFGNDk1RDg4RTVCRTBDNkExNjYzRkYwQTgxQzVFRDEyRDVCMjkyOUFFNEI0MzAwRjJGIiwKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9waWNrX3Y0X2Fwa19kaWdlc3Rfb25seV93aXRoX3YzX3BrY3MxX3NoYTUxMigpIHsKLSAgICAgICAgY2hlY2tfdjRfYXBrX2RpZ2VzdCgKLSAgICAgICAgICAgICJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTEwMjQuYXBrIiwKLSAgICAgICAgICAgIFNJR05BVFVSRV9SU0FfUEtDUzFfVjFfNV9XSVRIX1NIQTUxMiwKLSAgICAgICAgICAgICI5QjlBRTAyREE2MEIxODk5OUJGNTQxNzkwRjAwRDM4MDAwNkZERjA2NTVDM0M0ODJBQTBCQjBBRjE3Q0Y3QTQyXAotICAgICAgICAgICAgIEVDRjU2Qjk3MzUxODU0NkM5MDgwQjJGRUY4MzAyN0U4OTVFRDI4ODJCRkM4OEVBMTk3OTBCQkFCMjlBRjUzQjMiLAotICAgICAgICApOwotICAgIH0KLQotICAgIGZuIGNoZWNrX3Y0X2Fwa19kaWdlc3QoYXBrX2ZpbGVuYW1lOiAmc3RyLCBleHBlY3RlZF9hbGdvcml0aG06IHUzMiwgZXhwZWN0ZWRfZGlnZXN0OiAmc3RyKSB7Ci0gICAgICAgIGxldCBhcGtfZmlsZSA9IEZpbGU6Om9wZW4oYXBrX2ZpbGVuYW1lKS51bndyYXAoKTsKLSAgICAgICAgbGV0IChzaWduYXR1cmVfYWxnb3JpdGhtX2lkLCBhcGtfZGlnZXN0KSA9IHBpY2tfdjRfYXBrX2RpZ2VzdChhcGtfZmlsZSkudW53cmFwKCk7Ci0KLSAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZF9hbGdvcml0aG0sIHNpZ25hdHVyZV9hbGdvcml0aG1faWQpOwotICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkX2RpZ2VzdCwgdG9faGV4X3N0cmluZyhhcGtfZGlnZXN0LmFzX3JlZigpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9hcGt2ZXJpZnkvc3JjL3ppcHV0aWwucnMgYi9saWJzL2Fwa3ZlcmlmeS9zcmMvemlwdXRpbC5ycwppbmRleCA4YmFkZmYyLi5lYjI4MjZhIDEwMDY0NAotLS0gYS9saWJzL2Fwa3ZlcmlmeS9zcmMvemlwdXRpbC5ycworKysgYi9saWJzL2Fwa3ZlcmlmeS9zcmMvemlwdXRpbC5ycwpAQCAtMTYsNyArMTYsNyBAQAogCiAvLyEgVXRpbGl0aWVzIGZvciB6aXAgaGFuZGxpbmcgb2YgQVBLIGZpbGVzLgogCi11c2UgYW55aG93Ojp7YmFpbCwgUmVzdWx0fTsKK3VzZSBhbnlob3c6OntlbnN1cmUsIFJlc3VsdH07CiB1c2UgYnl0ZXM6OntCdWYsIEJ1Zk11dH07CiB1c2Ugc3RkOjppbzo6e1JlYWQsIFNlZWssIFNlZWtGcm9tfTsKIHVzZSB6aXA6OlppcEFyY2hpdmU7CkBAIC00MSwyNSArNDEsMjYgQEAKICAgICAvLyBvcGVuIGEgemlwIHRvIHBhcnNlIEVPQ0QKICAgICBsZXQgYXJjaGl2ZSA9IFppcEFyY2hpdmU6Om5ldyhyZWFkZXIpPzsKICAgICBsZXQgZW9jZF9zaXplID0gYXJjaGl2ZS5jb21tZW50KCkubGVuKCkgKyBFT0NEX1NJWkVfV0lUSE9VVF9DT01NRU5UOwotICAgIGlmIGFyY2hpdmUub2Zmc2V0KCkgIT0gMCB7Ci0gICAgICAgIGJhaWwhKCJJbnZhbGlkIFpJUDogb2Zmc2V0IHNob3VsZCBiZSAwLCBidXQge30uIiwgYXJjaGl2ZS5vZmZzZXQoKSk7Ci0gICAgfQorICAgIGVuc3VyZSEoYXJjaGl2ZS5vZmZzZXQoKSA9PSAwLCAiSW52YWxpZCBaSVA6IG9mZnNldCBzaG91bGQgYmUgMCwgYnV0IHt9LiIsIGFyY2hpdmUub2Zmc2V0KCkpOwogICAgIC8vIHJldHJpZXZlIHJlYWRlciBiYWNrCiAgICAgcmVhZGVyID0gYXJjaGl2ZS5pbnRvX2lubmVyKCk7CiAgICAgLy8gdGhlIGN1cnJlbnQgcG9zaXRpb24gc2hvdWxkIHBvaW50IEVPQ0Qgb2Zmc2V0CiAgICAgbGV0IGVvY2Rfb2Zmc2V0ID0gcmVhZGVyLnNlZWsoU2Vla0Zyb206OkN1cnJlbnQoMCkpPyBhcyB1MzI7CiAgICAgbGV0IG11dCBlb2NkID0gdmVjIVswdTg7IGVvY2Rfc2l6ZSBhcyB1c2l6ZV07CiAgICAgcmVhZGVyLnJlYWRfZXhhY3QoJm11dCBlb2NkKT87Ci0gICAgaWYgKCZlb2NkWzAuLl0pLmdldF91MzJfbGUoKSAhPSBFT0NEX1NJR05BVFVSRSB7Ci0gICAgICAgIGJhaWwhKCJJbnZhbGlkIFpJUDogWmlwQXJjaGl2ZTo6bmV3KCkgc2hvdWxkIHBvaW50IEVPQ0QgYWZ0ZXIgcmVhZGluZy4iKTsKLSAgICB9CisgICAgZW5zdXJlISgKKyAgICAgICAgKCZlb2NkWzAuLl0pLmdldF91MzJfbGUoKSA9PSBFT0NEX1NJR05BVFVSRSwKKyAgICAgICAgIkludmFsaWQgWklQOiBaaXBBcmNoaXZlOjpuZXcoKSBzaG91bGQgcG9pbnQgRU9DRCBhZnRlciByZWFkaW5nLiIKKyAgICApOwogICAgIGxldCAoY2VudHJhbF9kaXJlY3Rvcnlfc2l6ZSwgY2VudHJhbF9kaXJlY3Rvcnlfb2Zmc2V0KSA9IGdldF9jZW50cmFsX2RpcmVjdG9yeSgmZW9jZCk/OwotICAgIGlmIGNlbnRyYWxfZGlyZWN0b3J5X29mZnNldCA9PSBaSVA2NF9NQVJLIHx8IGNlbnRyYWxfZGlyZWN0b3J5X3NpemUgPT0gWklQNjRfTUFSSyB7Ci0gICAgICAgIGJhaWwhKCJVbnN1cHBvcnRlZCBaSVA6IFpJUDY0IGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotICAgIGlmIGNlbnRyYWxfZGlyZWN0b3J5X29mZnNldCArIGNlbnRyYWxfZGlyZWN0b3J5X3NpemUgIT0gZW9jZF9vZmZzZXQgewotICAgICAgICBiYWlsISgiSW52YWxpZCBaSVA6IEVPQ0Qgc2hvdWxkIGZvbGxvdyBDRCB3aXRoIG5vIGV4dHJhIGRhdGEgb3Igb3ZlcmxhcC4iKTsKLSAgICB9CisgICAgZW5zdXJlISgKKyAgICAgICAgY2VudHJhbF9kaXJlY3Rvcnlfb2Zmc2V0ICE9IFpJUDY0X01BUksgJiYgY2VudHJhbF9kaXJlY3Rvcnlfc2l6ZSAhPSBaSVA2NF9NQVJLLAorICAgICAgICAiVW5zdXBwb3J0ZWQgWklQOiBaSVA2NCBpcyBub3Qgc3VwcG9ydGVkLiIKKyAgICApOworICAgIGVuc3VyZSEoCisgICAgICAgIGNlbnRyYWxfZGlyZWN0b3J5X29mZnNldCArIGNlbnRyYWxfZGlyZWN0b3J5X3NpemUgPT0gZW9jZF9vZmZzZXQsCisgICAgICAgICJJbnZhbGlkIFpJUDogRU9DRCBzaG91bGQgZm9sbG93IENEIHdpdGggbm8gZXh0cmEgZGF0YSBvciBvdmVybGFwLiIKKyAgICApOwogCiAgICAgT2soKAogICAgICAgICByZWFkZXIsCkBAIC03Myw5ICs3NCw3IEBACiB9CiAKIGZuIGdldF9jZW50cmFsX2RpcmVjdG9yeShidWY6ICZbdThdKSAtPiBSZXN1bHQ8KHUzMiwgdTMyKT4gewotICAgIGlmIGJ1Zi5sZW4oKSA8IEVPQ0RfU0laRV9XSVRIT1VUX0NPTU1FTlQgewotICAgICAgICBiYWlsISgiSW52YWxpZCBFT0NEIHNpemU6IHt9IiwgYnVmLmxlbigpKTsKLSAgICB9CisgICAgZW5zdXJlIShidWYubGVuKCkgPj0gRU9DRF9TSVpFX1dJVEhPVVRfQ09NTUVOVCwgIkludmFsaWQgRU9DRCBzaXplOiB7fSIsIGJ1Zi5sZW4oKSk7CiAgICAgbGV0IG11dCBidWYgPSAmYnVmW0VPQ0RfQ0VOVFJBTF9ESVJFQ1RPUllfU0laRV9GSUVMRF9PRkZTRVQuLl07CiAgICAgbGV0IHNpemUgPSBidWYuZ2V0X3UzMl9sZSgpOwogICAgIGxldCBvZmZzZXQgPSBidWYuZ2V0X3UzMl9sZSgpOwpAQCAtODQsOSArODMsNyBAQAogCiAvLy8gVXBkYXRlIEVPQ0QncyBjZW50cmFsX2RpcmVjdG9yeV9vZmZzZXQgZmllbGQuCiBwdWIgZm4gc2V0X2NlbnRyYWxfZGlyZWN0b3J5X29mZnNldChidWY6ICZtdXQgW3U4XSwgdmFsdWU6IHUzMikgLT4gUmVzdWx0PCgpPiB7Ci0gICAgaWYgYnVmLmxlbigpIDwgRU9DRF9TSVpFX1dJVEhPVVRfQ09NTUVOVCB7Ci0gICAgICAgIGJhaWwhKCJJbnZhbGlkIEVPQ0Qgc2l6ZToge30iLCBidWYubGVuKCkpOwotICAgIH0KKyAgICBlbnN1cmUhKGJ1Zi5sZW4oKSA+PSBFT0NEX1NJWkVfV0lUSE9VVF9DT01NRU5ULCAiSW52YWxpZCBFT0NEIHNpemU6IHt9IiwgYnVmLmxlbigpKTsKICAgICAoJm11dCBidWZbRU9DRF9DRU5UUkFMX0RJUkVDVE9SWV9PRkZTRVRfRklFTERfT0ZGU0VULi5dKS5wdXRfdTMyX2xlKHZhbHVlKTsKICAgICBPaygoKSkKIH0KZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2Fwa3ZlcmlmeV90ZXN0LnJzIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvYXBrdmVyaWZ5X3Rlc3QucnMKaW5kZXggYTY3NGFkNy4uNWJkOTAxZCAxMDA2NDQKLS0tIGEvbGlicy9hcGt2ZXJpZnkvdGVzdHMvYXBrdmVyaWZ5X3Rlc3QucnMKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvYXBrdmVyaWZ5X3Rlc3QucnMKQEAgLTE0LDggKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi11c2UgYXBrdmVyaWZ5Ojp7dGVzdGluZzo6YXNzZXJ0X2NvbnRhaW5zLCB2ZXJpZnl9OwotdXNlIHN0ZDo6bWF0Y2hlczsKK3VzZSBhcGt2ZXJpZnk6OnsKKyAgICBnZXRfcHVibGljX2tleV9kZXIsIHBpY2tfdjRfYXBrX2RpZ2VzdCwgdGVzdGluZzo6YXNzZXJ0X2NvbnRhaW5zLCB2ZXJpZnksIFNpZ25hdHVyZUFsZ29yaXRobUlELAorfTsKK3VzZSBzdGQ6OntmcywgbWF0Y2hlcywgcGF0aDo6UGF0aH07CiAKIGNvbnN0IEtFWV9OQU1FU19EU0E6ICZbJnN0cl0gPSAmWyIxMDI0IiwgIjIwNDgiLCAiMzA3MiJdOwogY29uc3QgS0VZX05BTUVTX0VDRFNBOiAmWyZzdHJdID0gJlsicDI1NiIsICJwMzg0IiwgInA1MjEiXTsKQEAgLTI1LDcgKzI3LDcgQEAKIGZuIHRlc3RfdmVyaWZ5X3RydW5jYXRlZF9jZCgpIHsKICAgICB1c2UgemlwOjpyZXN1bHQ6OlppcEVycm9yOwogICAgIGxldCByZXMgPSB2ZXJpZnkoInRlc3RzL2RhdGEvdjItb25seS10cnVuY2F0ZWQtY2QuYXBrIik7Ci0gICAgLy8gVE9ETyhqb295dW5nKTogY29uc2lkZXIgbWFraW5nIGEgaGVscGVyIGZvciBlcnIgYXNzZXJ0aW9uCisgICAgLy8gVE9ETyhiLzE5MDM0Mzg0Mik6IGNvbnNpZGVyIG1ha2luZyBhIGhlbHBlciBmb3IgZXJyIGFzc2VydGlvbgogICAgIGFzc2VydCEobWF0Y2hlcyEoCiAgICAgICAgIHJlcy51bndyYXBfZXJyKCkucm9vdF9jYXVzZSgpLmRvd25jYXN0X3JlZjo6PFppcEVycm9yPigpLnVud3JhcCgpLAogICAgICAgICBaaXBFcnJvcjo6SW52YWxpZEFyY2hpdmUoXyksCkBAIC0zMyw2MiArMzUsNzAgQEAKIH0KIAogI1t0ZXN0XQotZm4gdGVzdF92ZXJpZnlfdjMoKSB7Ci0gICAgYXNzZXJ0ISh2ZXJpZnkoInRlc3RzL2RhdGEvdGVzdC5hcGV4IikuaXNfb2soKSk7CitmbiBhcGV4X3NpZ25lZF93aXRoX3YzX3JzYV9wa2NzMV9zaGE1MTJfaXNfdmFsaWQoKSB7CisgICAgdmFsaWRhdGVfYXBrKCJ0ZXN0cy9kYXRhL3Rlc3QuYXBleCIsIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQa2NzMVYxNVdpdGhTaGE1MTIpOwogfQogCi0vLyBUT0RPKGIvMTkwMzQzODQyKQogI1t0ZXN0XQogZm4gdGVzdF92ZXJpZnlfdjNfZHNhX3NoYTI1NigpIHsKICAgICBmb3Iga2V5X25hbWUgaW4gS0VZX05BTUVTX0RTQS5pdGVyKCkgewogICAgICAgICBsZXQgcmVzID0gdmVyaWZ5KGZvcm1hdCEoInRlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYte30uYXBrIiwga2V5X25hbWUpKTsKICAgICAgICAgYXNzZXJ0IShyZXMuaXNfZXJyKCkpOwotICAgICAgICBhc3NlcnRfY29udGFpbnMoCi0gICAgICAgICAgICAmcmVzLnVud3JhcF9lcnIoKS50b19zdHJpbmcoKSwKLSAgICAgICAgICAgICJUT0RPKGIvMTkwMzQzODQyKSBub3QgaW1wbGVtZW50ZWQgc2lnbmF0dXJlIGFsZ29yaXRobSIsCisgICAgICAgIGFzc2VydF9jb250YWlucygmcmVzLnVud3JhcF9lcnIoKS50b19zdHJpbmcoKSwgIm5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KK30KKworLy8vIFRPRE8oYi8xOTcwNTI5ODEpOiBEU0EgYWxnb3JpdGhtIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgorI1t0ZXN0XQorZm4gYXBrc19zaWduZWRfd2l0aF92M19kc2Ffc2hhMjU2X2hhdmVfdmFsaWRfYXBrX2RpZ2VzdCgpIHsKKyAgICBmb3Iga2V5X25hbWUgaW4gS0VZX05BTUVTX0RTQS5pdGVyKCkgeworICAgICAgICB2YWxpZGF0ZV9hcGtfZGlnZXN0KAorICAgICAgICAgICAgZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZHNhLXNoYTI1Ni17fS5hcGsiLCBrZXlfbmFtZSksCisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6RHNhV2l0aFNoYTI1NiwKICAgICAgICAgKTsKICAgICB9CiB9CiAKICNbdGVzdF0KLWZuIHRlc3RfdmVyaWZ5X3YzX2VjZHNhX3NoYTI1NigpIHsKK2ZuIGFwa3Nfc2lnbmVkX3dpdGhfdjNfZWNkc2Ffc2hhMjU2X2FyZV92YWxpZCgpIHsKICAgICBmb3Iga2V5X25hbWUgaW4gS0VZX05BTUVTX0VDRFNBLml0ZXIoKSB7Ci0gICAgICAgIGFzc2VydCEodmVyaWZ5KGZvcm1hdCEoInRlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni17fS5hcGsiLCBrZXlfbmFtZSkpLmlzX29rKCkpOworICAgICAgICB2YWxpZGF0ZV9hcGsoCisgICAgICAgICAgICBmb3JtYXQhKCJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYte30uYXBrIiwga2V5X25hbWUpLAorICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkVjZHNhV2l0aFNoYTI1NiwKKyAgICAgICAgKTsKICAgICB9CiB9CiAKLS8vIFRPRE8oYi8xOTAzNDM4NDIpCiAjW3Rlc3RdCi1mbiB0ZXN0X3ZlcmlmeV92M19lY2RzYV9zaGE1MTIoKSB7CitmbiBhcGtzX3NpZ25lZF93aXRoX3YzX2VjZHNhX3NoYTUxMl9hcmVfdmFsaWQoKSB7CiAgICAgZm9yIGtleV9uYW1lIGluIEtFWV9OQU1FU19FQ0RTQS5pdGVyKCkgewotICAgICAgICBsZXQgcmVzID0gdmVyaWZ5KGZvcm1hdCEoInRlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi17fS5hcGsiLCBrZXlfbmFtZSkpOwotICAgICAgICBhc3NlcnQhKHJlcy5pc19lcnIoKSk7Ci0gICAgICAgIGFzc2VydF9jb250YWlucygKLSAgICAgICAgICAgICZyZXMudW53cmFwX2VycigpLnRvX3N0cmluZygpLAotICAgICAgICAgICAgIlRPRE8oYi8xOTAzNDM4NDIpIG5vdCBpbXBsZW1lbnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtIiwKKyAgICAgICAgdmFsaWRhdGVfYXBrKAorICAgICAgICAgICAgZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXt9LmFwayIsIGtleV9uYW1lKSwKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpFY2RzYVdpdGhTaGE1MTIsCiAgICAgICAgICk7CiAgICAgfQogfQogCiAjW3Rlc3RdCi1mbiB0ZXN0X3ZlcmlmeV92M19yc2Ffc2hhMjU2KCkgeworZm4gYXBrc19zaWduZWRfd2l0aF92M19yc2FfcGtjczFfc2hhMjU2X2FyZV92YWxpZCgpIHsKICAgICBmb3Iga2V5X25hbWUgaW4gS0VZX05BTUVTX1JTQS5pdGVyKCkgewotICAgICAgICBhc3NlcnQhKAotICAgICAgICAgICAgdmVyaWZ5KGZvcm1hdCEoInRlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYte30uYXBrIiwga2V5X25hbWUpKS5pc19vaygpCisgICAgICAgIHZhbGlkYXRlX2FwaygKKyAgICAgICAgICAgIGZvcm1hdCEoInRlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYte30uYXBrIiwga2V5X25hbWUpLAorICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTI1NiwKICAgICAgICAgKTsKICAgICB9CiB9CiAKICNbdGVzdF0KLWZuIHRlc3RfdmVyaWZ5X3YzX3JzYV9zaGE1MTIoKSB7CitmbiBhcGtzX3NpZ25lZF93aXRoX3YzX3JzYV9wa2NzMV9zaGE1MTJfYXJlX3ZhbGlkKCkgewogICAgIGZvciBrZXlfbmFtZSBpbiBLRVlfTkFNRVNfUlNBLml0ZXIoKSB7Ci0gICAgICAgIGFzc2VydCEoCi0gICAgICAgICAgICB2ZXJpZnkoZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi17fS5hcGsiLCBrZXlfbmFtZSkpLmlzX29rKCkKKyAgICAgICAgdmFsaWRhdGVfYXBrKAorICAgICAgICAgICAgZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi17fS5hcGsiLCBrZXlfbmFtZSksCisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhNTEyLAogICAgICAgICApOwogICAgIH0KIH0KIAotLy8gVE9ETyhiLzE5MDM0Mzg0MikKICNbdGVzdF0KIGZuIHRlc3RfdmVyaWZ5X3YzX3NpZ19kb2VzX25vdF92ZXJpZnkoKSB7CiAgICAgbGV0IHBhdGhfbGlzdCA9IFsKQEAgLTEwMSwxMyArMTExLDExIEBACiAgICAgICAgIGFzc2VydCEocmVzLmlzX2VycigpKTsKICAgICAgICAgbGV0IGVycm9yX21zZyA9ICZyZXMudW53cmFwX2VycigpLnRvX3N0cmluZygpOwogICAgICAgICBhc3NlcnQhKAotICAgICAgICAgICAgZXJyb3JfbXNnLmNvbnRhaW5zKCJTaWduYXR1cmUgaXMgaW52YWxpZCIpCi0gICAgICAgICAgICAgICAgfHwgZXJyb3JfbXNnLmNvbnRhaW5zKCJUT0RPKGIvMTkwMzQzODQyKSBub3QgaW1wbGVtZW50ZWQgc2lnbmF0dXJlIGFsZ29yaXRobSIpCisgICAgICAgICAgICBlcnJvcl9tc2cuY29udGFpbnMoIlNpZ25hdHVyZSBpcyBpbnZhbGlkIikgfHwgZXJyb3JfbXNnLmNvbnRhaW5zKCJub3QgaW1wbGVtZW50ZWQiKQogICAgICAgICApOwogICAgIH0KIH0KIAotLy8gVE9ETyhiLzE5MDM0Mzg0MikKICNbdGVzdF0KIGZuIHRlc3RfdmVyaWZ5X3YzX2RpZ2VzdF9taXNtYXRjaCgpIHsKICAgICBsZXQgcGF0aF9saXN0ID0gWwpAQCAtMTE4LDEwICsxMjYsNyBAQAogICAgICAgICBsZXQgcmVzID0gdmVyaWZ5KHBhdGgpOwogICAgICAgICBhc3NlcnQhKHJlcy5pc19lcnIoKSk7CiAgICAgICAgIGxldCBlcnJvcl9tc2cgPSAmcmVzLnVud3JhcF9lcnIoKS50b19zdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0ISgKLSAgICAgICAgICAgIGVycm9yX21zZy5jb250YWlucygiRGlnZXN0IG1pc21hdGNoIikKLSAgICAgICAgICAgICAgICB8fCBlcnJvcl9tc2cuY29udGFpbnMoIlRPRE8oYi8xOTAzNDM4NDIpIG5vdCBpbXBsZW1lbnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtIikKLSAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0IShlcnJvcl9tc2cuY29udGFpbnMoIkRpZ2VzdCBtaXNtYXRjaCIpIHx8IGVycm9yX21zZy5jb250YWlucygibm90IGltcGxlbWVudGVkIikpOwogICAgIH0KIH0KIApAQCAtMTgyLDIxICsxODcsODggQEAKIH0KIAogI1t0ZXN0XQotZm4gdGVzdF92ZXJpZnlfdjNfdW5rbm93bl9hZGRpdGlvbmFsX2F0dHIoKSB7Ci0gICAgYXNzZXJ0ISh2ZXJpZnkoInRlc3RzL2RhdGEvdjMtb25seS11bmtub3duLWFkZGl0aW9uYWwtYXR0ci5hcGsiKS5pc19vaygpKTsKK2ZuIGFwa19zaWduZWRfd2l0aF92M191bmtub3duX2FkZGl0aW9uYWxfYXR0cl9pc192YWxpZCgpIHsKKyAgICB2YWxpZGF0ZV9hcGsoCisgICAgICAgICJ0ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1hZGRpdGlvbmFsLWF0dHIuYXBrIiwKKyAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTI1NiwKKyAgICApOwogfQogCiAjW3Rlc3RdCi1mbiB0ZXN0X3ZlcmlmeV92M191bmtub3duX3BhaXJfaW5fYXBrX3NpZ19ibG9jaygpIHsKLSAgICBhc3NlcnQhKHZlcmlmeSgidGVzdHMvZGF0YS92My1vbmx5LXVua25vd24tcGFpci1pbi1hcGstc2lnLWJsb2NrLmFwayIpLmlzX29rKCkpOworZm4gYXBrX3NpZ25lZF93aXRoX3YzX3Vua25vd25fcGFpcl9pbl9hcGtfc2lnX2Jsb2NrX2lzX3ZhbGlkKCkgeworICAgIHZhbGlkYXRlX2FwaygKKyAgICAgICAgInRlc3RzL2RhdGEvdjMtb25seS11bmtub3duLXBhaXItaW4tYXBrLXNpZy1ibG9jay5hcGsiLAorICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhMjU2LAorICAgICk7CiB9CiAKICNbdGVzdF0KLWZuIHRlc3RfdmVyaWZ5X3YzX2lnbm9yYWJsZV91bnN1cHBvcnRlZF9zaWdfYWxncygpIHsKLSAgICBhc3NlcnQhKHZlcmlmeSgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtaWdub3JhYmxlLXVuc3VwcG9ydGVkLXNpZy1hbGdzLmFwayIpLmlzX29rKCkpOworZm4gYXBrX3NpZ25lZF93aXRoX3YzX2lnbm9yYWJsZV91bnN1cHBvcnRlZF9zaWdfYWxnc19pc192YWxpZCgpIHsKKyAgICB2YWxpZGF0ZV9hcGsoCisgICAgICAgICJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1pZ25vcmFibGUtdW5zdXBwb3J0ZWQtc2lnLWFsZ3MuYXBrIiwKKyAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTI1NiwKKyAgICApOwogfQogCiAjW3Rlc3RdCi1mbiB0ZXN0X3ZlcmlmeV92M19zdGFtcCgpIHsKLSAgICBhc3NlcnQhKHZlcmlmeSgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtc3RhbXAuYXBrIikuaXNfb2soKSk7CitmbiBhcGtfc2lnbmVkX3dpdGhfdjNfc3RhbXBfaXNfdmFsaWQoKSB7CisgICAgdmFsaWRhdGVfYXBrKCJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsiLCBTaWduYXR1cmVBbGdvcml0aG1JRDo6RWNkc2FXaXRoU2hhMjU2KTsKK30KKworZm4gdmFsaWRhdGVfYXBrPFA6IEFzUmVmPFBhdGg+PihhcGtfcGF0aDogUCwgZXhwZWN0ZWRfYWxnb3JpdGhtX2lkOiBTaWduYXR1cmVBbGdvcml0aG1JRCkgeworICAgIHZhbGlkYXRlX2Fwa19wdWJsaWNfa2V5KCZhcGtfcGF0aCk7CisgICAgdmFsaWRhdGVfYXBrX2RpZ2VzdCgmYXBrX3BhdGgsIGV4cGVjdGVkX2FsZ29yaXRobV9pZCk7Cit9CisKKy8vLyBWYWxpZGF0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIHB1YmxpYyBrZXlzIGFyZSBlcXVhbDoKKy8vLyAqIHB1YmxpYyBrZXkgZnJvbSB2ZXJpZmljYXRpb24KKy8vLyAqIHB1YmxpYyBrZXkgZXh0cmFjdGVkIGZyb20gYXBrIHdpdGhvdXQgdmVyaWZpY2F0aW9uCisvLy8gKiBleHBlY3RlZCBwdWJsaWMga2V5IGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgLmRlciBmaWxlCitmbiB2YWxpZGF0ZV9hcGtfcHVibGljX2tleTxQOiBBc1JlZjxQYXRoPj4oYXBrX3BhdGg6IFApIHsKKyAgICBsZXQgcHVibGljX2tleV9mcm9tX3ZlcmlmaWNhdGlvbiA9IHZlcmlmeSgmYXBrX3BhdGgpOworICAgIGxldCBwdWJsaWNfa2V5X2Zyb21fdmVyaWZpY2F0aW9uID0KKyAgICAgICAgcHVibGljX2tleV9mcm9tX3ZlcmlmaWNhdGlvbi5leHBlY3QoIkVycm9yIGluIHZlcmlmaWNhdGlvbiByZXN1bHQiKTsKKworICAgIGxldCBleHBlY3RlZF9wdWJsaWNfa2V5X3BhdGggPSBmb3JtYXQhKCJ7fS5kZXIiLCBhcGtfcGF0aC5hc19yZWYoKS50b19zdHIoKS51bndyYXAoKSk7CisgICAgYXNzZXJ0X2J5dGVzX2VxX3RvX2RhdGFfaW5fZmlsZSgmcHVibGljX2tleV9mcm9tX3ZlcmlmaWNhdGlvbiwgZXhwZWN0ZWRfcHVibGljX2tleV9wYXRoKTsKKworICAgIGxldCBwdWJsaWNfa2V5X2Zyb21fYXBrID0gZ2V0X3B1YmxpY19rZXlfZGVyKCZhcGtfcGF0aCk7CisgICAgbGV0IHB1YmxpY19rZXlfZnJvbV9hcGsgPQorICAgICAgICBwdWJsaWNfa2V5X2Zyb21fYXBrLmV4cGVjdCgiRXJyb3Igd2hlbiBleHRyYWN0aW5nIHB1YmxpYyBrZXkgZnJvbSBhcGsiKTsKKyAgICBhc3NlcnRfZXEhKAorICAgICAgICBwdWJsaWNfa2V5X2Zyb21fdmVyaWZpY2F0aW9uLCBwdWJsaWNfa2V5X2Zyb21fYXBrLAorICAgICAgICAiUHVibGljIGtleSBleHRyYWN0ZWQgZGlyZWN0bHkgZnJvbSBhcGsgZG9lcyBub3QgbWF0Y2ggdGhlIHB1YmxpYyBrZXkgZnJvbSB2ZXJpZmljYXRpb24uIgorICAgICk7Cit9CisKKy8vLyBWYWxpZGF0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGFwa19kaWdlc3QgYXJlIGVxdWFsOgorLy8vICogYXBrX2RpZ2VzdCBkaXJlY3RseSBleHRyYWN0ZWQgZnJvbSBhcGsgd2l0aG91dCBjb21wdXRhdGlvbgorLy8vICogZXhwZWN0ZWQgYXBrIGRpZ2VzdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIC5hcGtfZGlnZXN0IGZpbGUKK2ZuIHZhbGlkYXRlX2Fwa19kaWdlc3Q8UDogQXNSZWY8UGF0aD4+KGFwa19wYXRoOiBQLCBleHBlY3RlZF9hbGdvcml0aG1faWQ6IFNpZ25hdHVyZUFsZ29yaXRobUlEKSB7CisgICAgbGV0IGFwayA9IGZzOjpGaWxlOjpvcGVuKCZhcGtfcGF0aCkuZXhwZWN0KCJVbmFibGVkIHRvIG9wZW4gYXBrIGZpbGUiKTsKKworICAgIGxldCAoc2lnbmF0dXJlX2FsZ29yaXRobV9pZCwgZGlnZXN0X2Zyb21fYXBrKSA9CisgICAgICAgIHBpY2tfdjRfYXBrX2RpZ2VzdChhcGspLmV4cGVjdCgiRXJyb3Igd2hlbiBleHRyYWN0aW5nIGFwayBkaWdlc3QuIik7CisKKyAgICBhc3NlcnRfZXEhKGV4cGVjdGVkX2FsZ29yaXRobV9pZCwgc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk7CisgICAgbGV0IGV4cGVjdGVkX2RpZ2VzdF9wYXRoID0gZm9ybWF0ISgie30uYXBrX2RpZ2VzdCIsIGFwa19wYXRoLmFzX3JlZigpLnRvX3N0cigpLnVud3JhcCgpKTsKKyAgICBhc3NlcnRfYnl0ZXNfZXFfdG9fZGF0YV9pbl9maWxlKCZkaWdlc3RfZnJvbV9hcGssIGV4cGVjdGVkX2RpZ2VzdF9wYXRoKTsKK30KKworZm4gYXNzZXJ0X2J5dGVzX2VxX3RvX2RhdGFfaW5fZmlsZTxQOiBBc1JlZjxQYXRoPiArIHN0ZDo6Zm10OjpEaXNwbGF5PigKKyAgICBieXRlc19kYXRhOiAmW3U4XSwKKyAgICBleHBlY3RlZF9kYXRhX3BhdGg6IFAsCispIHsKKyAgICBhc3NlcnQhKAorICAgICAgICBmczo6bWV0YWRhdGEoJmV4cGVjdGVkX2RhdGFfcGF0aCkuaXNfb2soKSwKKyAgICAgICAgIkZpbGUgZG9lcyBub3QgZXhpc3QuIFlvdSBjYW4gcmUtY3JlYXRlIGl0IHdpdGg6XG4kIGVjaG8gLWVuIHt9ID4ge31cbiIsCisgICAgICAgIGJ5dGVzX2RhdGEuaXRlcigpLm1hcCh8YnwgZm9ybWF0ISgiXFxcXHh7OjAyeH0iLCBiKSkuY29sbGVjdDo6PFN0cmluZz4oKSwKKyAgICAgICAgZXhwZWN0ZWRfZGF0YV9wYXRoCisgICAgKTsKKyAgICBsZXQgZXhwZWN0ZWRfZGF0YSA9IGZzOjpyZWFkKCZleHBlY3RlZF9kYXRhX3BhdGgpLnVud3JhcCgpOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIGV4cGVjdGVkX2RhdGEsIGJ5dGVzX2RhdGEsCisgICAgICAgICJBY3R1YWwgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgZGF0YSBmcm9tOiB7fSIsCisgICAgICAgIGV4cGVjdGVkX2RhdGFfcGF0aAorICAgICk7CiB9CmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL1JFQURNRS5tZCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvUkVBRE1FLm1kCmluZGV4IDc1NTY5MjEuLjdiYTVkOGUgMTAwNjQ0Ci0tLSBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvUkVBRE1FLm1kCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvUkVBRE1FLm1kCkBAIC0xLDYgKzEsMTAgQEAKKyMgQWJvdXQgdGVzdCBkYXRhCisKKyMjIC5hcGsKKwogdGVzdC5hcGV4IGlzIGNvcGllZCBmcm9tIEFEQkQgYXBleCBidWlsdCBpbiBBT1NQLgogCi1gYGBzaAorYGBgYmFzaAogJCBhcGtzaWduZXIgdmVyaWZ5IC12IHRlc3QuYXBleAogVmVyaWZpZXMKIFZlcmlmaWVkIHVzaW5nIHYxIHNjaGVtZSAoSkFSIHNpZ25pbmcpOiBmYWxzZQpAQCAtMTEsNCArMTUsMjAgQEAKIE51bWJlciBvZiBzaWduZXJzOiAxCiBgYGAKIAotQVBLIGZpbGVzIGFyZSBjb3BpZWQgZnJvbSB0b29scy9hcGtzaWcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9hbmRyb2lkL2Fwa3NpZy8uCitBUEsgZmlsZXMgYXJlIGNvcGllZCBmcm9tIFt0b29scy9hcGtzaWcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9hbmRyb2lkL2Fwa3NpZy9dKGh0dHBzOi8vY3MuYW5kcm9pZC5jb20vYW5kcm9pZC9wbGF0Zm9ybS9zdXBlcnByb2plY3QvKy9tYXN0ZXI6dG9vbHMvYXBrc2lnL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vYW5kcm9pZC9hcGtzaWcvO2w9MTtkcmM9YzJhOGRhMTkxM2Q3ZmIzNTliMDIzYmYyMDBlMzFkNzVmZjIyYTVjMykuCisKKyMjIC5kZXIKKworYC5kZXJgIGZpbGVzIGNvbnRhaW4gdGhlIGV4cGVjdGVkIHB1YmxpYyBrZXlzLiBXaGVuIHZhbGlkYXRpbmcgdGhlIHB1YmxpYyBrZXlzIGluIHRlc3RzLCBpZiB0aGUgY29ycmVzcG9uZGluZyBgLmRlcmAgZmlsZSBpcyBtaXNzaW5nLCB0aGVyZSB3aWxsIGJlIHNvbWUgdGV4dCBhcyBmb2xsb3dzIGluIHRoZSBmYWlsdXJlIG1lc3NhZ2U6CisKK2BgYGJhc2gKKyQgZWNobyAtZW4gXFx4MzBcXHg1OVxceDMwXFx4MTNcXHgwNlxceDA3XFx4MmFcXHg4NlxceDQ4XFx4Y2VcXHgzZFxceDAyXFx4MDFcXHgwNlxceDA4XFx4MmFcXHg4NlxceDQ4XFx4Y2VcXHgzZFxceDAzXFx4MDFcXHgwN1xceDAzXFx4NDJcXHgwMFxceDA0XFx4YTZcXHg1ZlxceDExXFx4M2RcXHgyMlxceGNiXFx4NDlcXHgxM1xceDkwXFx4ODNcXHgwN1xceGFjXFx4MzFcXHhlZVxceDJiXFx4YTBcXHhlOVxceDEzXFx4OGJcXHg3OFxceDVmXFx4YWNcXHg2NVxceDM2XFx4ZDFcXHg0ZVxceGEyXFx4Y2VcXHg5MFxceGQyXFx4YjRcXHhiZlxceGUxXFx4OTRcXHhiNVxceDBjXFx4ZGNcXHg4ZVxceDE2XFx4OWZcXHg1NFxceGE3XFx4M2FcXHg5OVxceDFlXFx4ZjBcXHhmYVxceDc2XFx4MzJcXHg5OFxceDI1XFx4YmVcXHgwN1xceDhjXFx4YzdcXHg4MlxceDc0XFx4MDdcXHgwM1xceGRhXFx4NDRcXHhiNFxceGQ3XFx4ZWIgPiB0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsuZGVyCitgYGAKKworWW91IGp1c3QgbmVlZCB0byBleGVjdXRlIHRoaXMgY29tbWFuZCBpbiB0aGUgZm9sZGVyIGBsaWJzL2Fwa3ZlcmlmeWAgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgYC5kZXJgIGZpbGUuIEFmdGVyIGl0LCB5b3UgY2FuIHJ1biB0aGUgdGVzdCBhZ2FpbiwgYW5kIHRoZSB0ZXN0IHdpbGwgcGFzcy4KKworT3RoZXJ3aXNlLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBjb21tYW5kIGBhcGtzaWduZXIgdmVyaWZ5IC0tbWluLXNkay12ZXJzaW9uIDI0IC0tcHJpbnQtY2VydHMtcGVtIHRlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFwa2AgdG8gZ2V0IHRoZSBwdWJsaWMga2V5IGluIGAucGVtYCBmb3JtYXQgYW5kIHRoZW4gY29udmVydCBpdCB0byBgLmRlcmAgd2l0aCBvcGVuc3NsLgorCisjIyAuYXBrX2RpZ2VzdAorCitgLmFwa19kaWdlc3RgIGZpbGVzIGNvbnRhaW4gdGhlIGV4cGVjdGVkIFthcGtfZGlnZXN0XShodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kb2NzL3NlY3VyaXR5L2ZlYXR1cmVzL2Fwa3NpZ25pbmcvdjQjYXBrLWRpZ2VzdCkuIFRoZXkgYXJlIGdlbmVyYXRlZCB0aGUgc2FtZSB3YXkgYXMgYC5kZXJgIHdoZW4gdmFsaWRhdGluZyB0aGUgYXBrX2RpZ2VzdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3Rlc3QuYXBleC5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS90ZXN0LmFwZXguYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE3MzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS90ZXN0LmFwZXguYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3Rlc3QuYXBleC5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3Rlc3QuYXBleC5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlYjFlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdGVzdC5hcGV4LmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1hZGRpdGlvbmFsLWF0dHIuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1hZGRpdGlvbmFsLWF0dHIuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLWFkZGl0aW9uYWwtYXR0ci5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1hZGRpdGlvbmFsLWF0dHIuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLWFkZGl0aW9uYWwtYXR0ci5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NTM1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1hZGRpdGlvbmFsLWF0dHIuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1wYWlyLWluLWFway1zaWctYmxvY2suYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1wYWlyLWluLWFway1zaWctYmxvY2suYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLXBhaXItaW4tYXBrLXNpZy1ibG9jay5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1wYWlyLWluLWFway1zaWctYmxvY2suYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLXBhaXItaW4tYXBrLXNpZy1ibG9jay5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYWZkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1wYWlyLWluLWFway1zaWctYmxvY2suYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1kc2Etc2hhMjU2LTEwMjQuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1kc2Etc2hhMjU2LTEwMjQuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMTAyNC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1kc2Etc2hhMjU2LTIwNDguYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1kc2Etc2hhMjU2LTIwNDguYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMjA0OC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1kc2Etc2hhMjU2LTMwNzIuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1kc2Etc2hhMjU2LTMwNzIuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMzA3Mi5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDI1Ni5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wMjU2LmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWVjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDI1Ni5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDI1Ni5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXAyNTYuYXBrLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTkyN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXAyNTYuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDM4NC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wMzg0LmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWVjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDM4NC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDM4NC5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXAzODQuYXBrLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJhZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXAzODQuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDUyMS5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wNTIxLmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWVjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDUyMS5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDUyMS5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXA1MjEuYXBrLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjhmOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXA1MjEuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDI1Ni5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wMjU2LmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTFiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDI1Ni5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDI1Ni5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXAyNTYuYXBrLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTkyN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXAyNTYuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDM4NC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wMzg0LmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTFiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDM4NC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDM4NC5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXAzODQuYXBrLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJhZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXAzODQuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDUyMS5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wNTIxLmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTFiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDUyMS5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDUyMS5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXA1MjEuYXBrLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjhmOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXA1MjEuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1pZ25vcmFibGUtdW5zdXBwb3J0ZWQtc2lnLWFsZ3MuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1pZ25vcmFibGUtdW5zdXBwb3J0ZWQtc2lnLWFsZ3MuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWlnbm9yYWJsZS11bnN1cHBvcnRlZC1zaWctYWxncy5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1pZ25vcmFibGUtdW5zdXBwb3J0ZWQtc2lnLWFsZ3MuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWlnbm9yYWJsZS11bnN1cHBvcnRlZC1zaWctYWxncy5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGM1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1pZ25vcmFibGUtdW5zdXBwb3J0ZWQtc2lnLWFsZ3MuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTEwMjQuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTEwMjQuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTAyNC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTEwMjQuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTAyNC5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYWZkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTEwMjQuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTE2Mzg0LmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0xNjM4NC5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0xNjM4NC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTE2Mzg0LmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTE2Mzg0LmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhYmRjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTYzODQuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTIwNDguYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTIwNDguYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTIwNDguYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGM1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTIwNDguYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTMwNzIuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTMwNzIuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMzA3Mi5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTMwNzIuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMzA3Mi5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzBmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTMwNzIuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTQwOTYuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTQwOTYuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTQwOTYuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTY0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTQwOTYuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTgxOTIuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTgxOTIuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtODE5Mi5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTgxOTIuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtODE5Mi5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTVlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTgxOTIuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTEwMjQuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTEwMjQuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTAyNC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTEwMjQuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTAyNC5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYWZkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTEwMjQuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTE2Mzg0LmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0xNjM4NC5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUxYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0xNjM4NC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTE2Mzg0LmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTE2Mzg0LmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhYmRjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTYzODQuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTIwNDguYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTIwNDguYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMjA0OC5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTIwNDguYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMjA0OC5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGM1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTIwNDguYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTMwNzIuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTMwNzIuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMzA3Mi5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTMwNzIuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMzA3Mi5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzBmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTMwNzIuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTQwOTYuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTQwOTYuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItNDA5Ni5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTQwOTYuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItNDA5Ni5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTY0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTQwOTYuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTgxOTIuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTgxOTIuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItODE5Mi5hcGsuYXBrX2RpZ2VzdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTgxOTIuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItODE5Mi5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTVlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTgxOTIuYXBrLmRlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOWMyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsuYXBrX2RpZ2VzdApAQCAtMCwwICsxIEBACitia7ZHwAiXF6f/pS/Y6EX5QD1eJ/elqHUuR7M0X7gvXApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTI3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvaWRzaWcvc3JjL2Fwa3NpZ3Y0LnJzIGIvbGlicy9pZHNpZy9zcmMvYXBrc2lndjQucnMKaW5kZXggZjhjYTE4NC4uYzFiNjQ5NSAxMDA2NDQKLS0tIGEvbGlicy9pZHNpZy9zcmMvYXBrc2lndjQucnMKKysrIGIvbGlicy9pZHNpZy9zcmMvYXBrc2lndjQucnMKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiB1c2UgYW55aG93Ojp7YW55aG93LCBiYWlsLCBDb250ZXh0LCBSZXN1bHR9OwotdXNlIGFwa3ZlcmlmeTo6cGlja192NF9hcGtfZGlnZXN0OwordXNlIGFwa3ZlcmlmeTo6e3BpY2tfdjRfYXBrX2RpZ2VzdCwgU2lnbmF0dXJlQWxnb3JpdGhtSUR9OwogdXNlIGJ5dGVvcmRlcjo6e0xpdHRsZUVuZGlhbiwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKIHVzZSBudW1fZGVyaXZlOjp7RnJvbVByaW1pdGl2ZSwgVG9QcmltaXRpdmV9OwogdXNlIG51bV90cmFpdHM6OntGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZX07CkBAIC02OSw3ICs2OSw3IEBACiAgICAgLy8vIFB1YmxpYyBrZXkgb2YgdGhlIHNpZ25lciBpbiBBU04uMSBERVIgZm9ybS4gVGhpcyBtdXN0IG1hdGNoIHRoZSBgeDUwOV9jZXJ0aWZpY2F0ZWAgZmllbGQuCiAgICAgcHViIHB1YmxpY19rZXk6IEJveDxbdThdPiwKICAgICAvLy8gU2lnbmF0dXJlIGFsZ29yaXRobSB1c2VkIHRvIHNpZ24gdGhpcyBmaWxlLgotICAgIHB1YiBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiBTaWduYXR1cmVBbGdvcml0aG1JZCwKKyAgICBwdWIgc2lnbmF0dXJlX2FsZ29yaXRobV9pZDogU2lnbmF0dXJlQWxnb3JpdGhtSUQsCiAgICAgLy8vIFRoZSBzaWduYXR1cmUgb2YgdGhpcyBmaWxlLgogICAgIHB1YiBzaWduYXR1cmU6IEJveDxbdThdPiwKIH0KQEAgLTExNCw0MCArMTE0LDYgQEAKICAgICB9CiB9CiAKLS8vLyBTaWduYXR1cmUgYWxnb3JpdGhtIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGlkc2lnIGZpbGUKLSNbZGVyaXZlKERlYnVnLCBQYXJ0aWFsRXEsIEVxLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSldCi0jW2FsbG93KG5vbl9jYW1lbF9jYXNlX3R5cGVzKV0KLSNbcmVwcih1MzIpXQotcHViIGVudW0gU2lnbmF0dXJlQWxnb3JpdGhtSWQgewotICAgIC8vLyBSU0FTU0EtUFNTIHdpdGggU0hBMi0yNTYgZGlnZXN0LCBTSEEyLTI1NiBNR0YxLCAzMiBieXRlcyBvZiBzYWx0LCB0cmFpbGVyOiAweGJjCi0gICAgUlNBU1NBX1BTU19TSEEyXzI1NiA9IDB4MDEwMSwKLSAgICAvLy8gUlNBU1NBLVBTUyB3aXRoIFNIQTItNTEyIGRpZ2VzdCwgU0hBMi01MTIgTUdGMSwgNjQgYnl0ZXMgb2Ygc2FsdCwgdHJhaWxlcjogMHhiYwotICAgIFJTQVNTQV9QU1NfU0hBMl81MTIgPSAweDAxMDIsCi0gICAgLy8vIFJTQVNTQS1QS0NTMS12MV81IHdpdGggU0hBMi0yNTYgZGlnZXN0LgotICAgIFJTQVNTQV9QS0NTMV9TSEEyXzI1NiA9IDB4MDEwMywKLSAgICAvLy8gUlNBU1NBLVBLQ1MxLXYxXzUgd2l0aCBTSEEyLTUxMiBkaWdlc3QuCi0gICAgUlNBU1NBX1BLQ1MxX1NIQTJfNTEyID0gMHgwMTA0LAotICAgIC8vLyBFQ0RTQSB3aXRoIFNIQTItMjU2IGRpZ2VzdC4KLSAgICBFQ0RTQV9TSEEyXzI1NiA9IDB4MDIwMSwKLSAgICAvLy8gRUNEU0Egd2l0aCBTSEEyLTUxMiBkaWdlc3QuCi0gICAgRUNEU0FfU0hBMl81MTIgPSAweDAyMDIsCi0gICAgLy8vIERTQSB3aXRoIFNIQTItMjU2IGRpZ2VzdAotICAgIERTQV9TSEEyXzI1NiA9IDB4MDMwMSwKLX0KLQotaW1wbCBTaWduYXR1cmVBbGdvcml0aG1JZCB7Ci0gICAgZm4gZnJvbSh2YWw6IHUzMikgLT4gUmVzdWx0PFNpZ25hdHVyZUFsZ29yaXRobUlkPiB7Ci0gICAgICAgIFNlbGY6OmZyb21fdTMyKHZhbCkKLSAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgZm9ybWF0ISgiezojMDZ4fSBpcyBhbiB1bnN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtIiwgdmFsKSkKLSAgICB9Ci19Ci0KLWltcGwgRGVmYXVsdCBmb3IgU2lnbmF0dXJlQWxnb3JpdGhtSWQgewotICAgIGZuIGRlZmF1bHQoKSAtPiBTZWxmIHsKLSAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSWQ6OkRTQV9TSEEyXzI1NgotICAgIH0KLX0KLQogaW1wbDxSOiBSZWFkICsgU2Vlaz4gVjRTaWduYXR1cmU8Uj4gewogICAgIC8vLyBDb25zdW1lcyBhIHN0cmVhbSBmb3IgYW4gaWRzaWcgZmlsZSBpbnRvIGEgYFY0U2lnbmF0dXJlYCBzdHJ1Y3QuCiAgICAgcHViIGZuIGZyb20obXV0IHI6IFIpIC0+IFJlc3VsdDxWNFNpZ25hdHVyZTxSPj4gewpAQCAtMTkzLDggKzE1OSw3IEBACiAKICAgICAgICAgYXBrLnNlZWsoU2Vla0Zyb206OlN0YXJ0KHN0YXJ0KSk/OwogICAgICAgICBsZXQgKHNpZ25hdHVyZV9hbGdvcml0aG1faWQsIGFwa19kaWdlc3QpID0gcGlja192NF9hcGtfZGlnZXN0KGFwayk/OwotICAgICAgICByZXQuc2lnbmluZ19pbmZvLnNpZ25hdHVyZV9hbGdvcml0aG1faWQgPQotICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSWQ6OmZyb20oc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk/OworICAgICAgICByZXQuc2lnbmluZ19pbmZvLnNpZ25hdHVyZV9hbGdvcml0aG1faWQgPSBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOwogICAgICAgICByZXQuc2lnbmluZ19pbmZvLmFwa19kaWdlc3QgPSBhcGtfZGlnZXN0OwogICAgICAgICAvLyBUT0RPKGppeW9uZyk6IGFkZCBhIHNpZ25hdHVyZSB0byB0aGUgc2lnbmluZ19pbmZvIHN0cnVjdAogCkBAIC0yNzYsNyArMjQxLDggQEAKICAgICAgICAgICAgIHg1MDlfY2VydGlmaWNhdGU6IHJlYWRfc2l6ZWRfYXJyYXkoJm11dCByKT8sCiAgICAgICAgICAgICBhZGRpdGlvbmFsX2RhdGE6IHJlYWRfc2l6ZWRfYXJyYXkoJm11dCByKT8sCiAgICAgICAgICAgICBwdWJsaWNfa2V5OiByZWFkX3NpemVkX2FycmF5KCZtdXQgcik/LAotICAgICAgICAgICAgc2lnbmF0dXJlX2FsZ29yaXRobV9pZDogU2lnbmF0dXJlQWxnb3JpdGhtSWQ6OmZyb20oci5yZWFkX3UzMjo6PExpdHRsZUVuZGlhbj4oKT8pPywKKyAgICAgICAgICAgIHNpZ25hdHVyZV9hbGdvcml0aG1faWQ6IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpmcm9tX3UzMihyLnJlYWRfdTMyOjo8TGl0dGxlRW5kaWFuPigpPykKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiVW5zdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobSIpPywKICAgICAgICAgICAgIHNpZ25hdHVyZTogcmVhZF9zaXplZF9hcnJheSgmbXV0IHIpPywKICAgICAgICAgfSkKICAgICB9CkBAIC0yOTEsNyArMjU3LDcgQEAKICAgICAgICAgd3JpdGVfc2l6ZWRfYXJyYXkoJm11dCB3LCAmc2VsZi54NTA5X2NlcnRpZmljYXRlKT87CiAgICAgICAgIHdyaXRlX3NpemVkX2FycmF5KCZtdXQgdywgJnNlbGYuYWRkaXRpb25hbF9kYXRhKT87CiAgICAgICAgIHdyaXRlX3NpemVkX2FycmF5KCZtdXQgdywgJnNlbGYucHVibGljX2tleSk/OwotICAgICAgICB3LndyaXRlX3UzMjo6PExpdHRsZUVuZGlhbj4oc2VsZi5zaWduYXR1cmVfYWxnb3JpdGhtX2lkLnRvX3UzMigpLnVud3JhcCgpKT87CisgICAgICAgIHcud3JpdGVfdTMyOjo8TGl0dGxlRW5kaWFuPihzZWxmLnNpZ25hdHVyZV9hbGdvcml0aG1faWQudG9fdTMyKCkpPzsKICAgICAgICAgd3JpdGVfc2l6ZWRfYXJyYXkoJm11dCB3LCAmc2VsZi5zaWduYXR1cmUpPzsKIAogICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHNpemUgb2Ygc2lnbmluZ19pbmZvLCBhbmQgd3JpdGUgaXQgaW4gZnJvbnQgb2YgdGhlIHN0cnVjdCB3aGVyZSB0aGUgdmFsdWUKQEAgLTM1OCw3ICszMjQsNyBAQAogICAgICAgICAgICAgICAgICAgIGE4NTg1YzM4ZDdmNjU0ODM1ZWIyMTlhZTllMTc2YjQ0ZTg2ZGNiMjMxNTNlM2Q5ZDYiLAogICAgICAgICAgICAgaGV4c3RyaW5nX2Zyb20oc2kuc2lnbmF0dXJlLmFzX3JlZigpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRfZXEhKFNpZ25hdHVyZUFsZ29yaXRobUlkOjpEU0FfU0hBMl8yNTYsIHNpLnNpZ25hdHVyZV9hbGdvcml0aG1faWQpOworICAgICAgICBhc3NlcnRfZXEhKFNpZ25hdHVyZUFsZ29yaXRobUlEOjpEc2FXaXRoU2hhMjU2LCBzaS5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKTsKIAogICAgICAgICBhc3NlcnRfZXEhKDM2ODY0LCBwYXJzZWQubWVya2xlX3RyZWVfc2l6ZSk7CiAgICAgICAgIGFzc2VydF9lcSEoMjI1MSwgcGFyc2VkLm1lcmtsZV90cmVlX29mZnNldCk7CmRpZmYgLS1naXQgYS9taWNyb2Ryb2lkL0FuZHJvaWQuYnAgYi9taWNyb2Ryb2lkL0FuZHJvaWQuYnAKaW5kZXggMjgxNDE2Yi4uMTk4M2U3MCAxMDA2NDQKLS0tIGEvbWljcm9kcm9pZC9BbmRyb2lkLmJwCisrKyBiL21pY3JvZHJvaWQvQW5kcm9pZC5icApAQCAtNTcsOCArNTcsNiBAQAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlic3RkYysrIiwKLSAgICAgICAgImxvZ2NhdC5taWNyb2Ryb2lkIiwKLSAgICAgICAgImxvZ2QubWljcm9kcm9pZCIsCiAgICAgICAgICJzZWNpbGMiLAogCiAgICAgICAgIC8vICJjb20uYW5kcm9pZC5hZGJkIiByZXF1aXJlcyB0aGVzZSwKZGlmZiAtLWdpdCBhL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5hcHBfZGVidWdnYWJsZSBiL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5hcHBfZGVidWdnYWJsZQppbmRleCAwZDg1MTg2Li42ZTY2MzcxIDEwMDY0NAotLS0gYS9taWNyb2Ryb2lkL2Jvb3Rjb25maWcuYXBwX2RlYnVnZ2FibGUKKysrIGIvbWljcm9kcm9pZC9ib290Y29uZmlnLmFwcF9kZWJ1Z2dhYmxlCkBAIC0xMyw3ICsxMywzIEBACiAKICMgQURCIGlzIHN1cHBvcnRlZCBidXQgcm9vdGluZyBpcyBwcm9oaWJpdGVkLgogYW5kcm9pZGJvb3QuYWRiLmVuYWJsZWQ9MQotCi0jIGxvZ2QgaXMgZW5hYmxlZAotIyBUT0RPKGIvMjAwOTE0NTY0KSBGaWx0ZXIgb25seSB0aGUgbG9nIGZyb20gdGhlIGFwcAotYW5kcm9pZGJvb3QubG9nZC5lbmFibGVkPTEKZGlmZiAtLWdpdCBhL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5mdWxsX2RlYnVnZ2FibGUgYi9taWNyb2Ryb2lkL2Jvb3Rjb25maWcuZnVsbF9kZWJ1Z2dhYmxlCmluZGV4IDBiZGQ4MTAuLjU4MzA2MGIgMTAwNjQ0Ci0tLSBhL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5mdWxsX2RlYnVnZ2FibGUKKysrIGIvbWljcm9kcm9pZC9ib290Y29uZmlnLmZ1bGxfZGVidWdnYWJsZQpAQCAtMTIsNiArMTIsMyBAQAogIyByby5hZGIuc2VjdXJlIGlzIHN0aWxsIDAgKHNlZSBidWlsZC5wcm9wKSB3aGljaCBtZWFucyB0aGF0IGFkYmQgaXMgc3RhcnRlZAogIyB1bnJvb3RlZCBieSBkZWZhdWx0LiBUbyByb290LCBkZXZlbG9wZXIgc2hvdWxkIGV4cGxpY2l0bHkgZXhlY3V0ZSBgYWRiIHJvb3RgLgogYW5kcm9pZGJvb3QuYWRiLmVuYWJsZWQ9MQotCi0jIGxvZ2QgaXMgZW5hYmxlZAotYW5kcm9pZGJvb3QubG9nZC5lbmFibGVkPTEKZGlmZiAtLWdpdCBhL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5ub3JtYWwgYi9taWNyb2Ryb2lkL2Jvb3Rjb25maWcubm9ybWFsCmluZGV4IGVhODMyODcuLmVjODVmMGQgMTAwNjQ0Ci0tLSBhL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5ub3JtYWwKKysrIGIvbWljcm9kcm9pZC9ib290Y29uZmlnLm5vcm1hbApAQCAtMTIsNiArMTIsMyBAQAogCiAjIEFEQiBpcyBub3QgZW5hYmxlZC4KIGFuZHJvaWRib290LmFkYi5lbmFibGVkPTAKLQotIyBsb2dkIGlzIG5vdCBlbmFibGVkCi1hbmRyb2lkYm9vdC5sb2dkLmVuYWJsZWQ9MApkaWZmIC0tZ2l0IGEvbWljcm9kcm9pZC9pbml0LnJjIGIvbWljcm9kcm9pZC9pbml0LnJjCmluZGV4IDQyYWE5ODMuLmNkNzMzMmIgMTAwNjQ0Ci0tLSBhL21pY3JvZHJvaWQvaW5pdC5yYworKysgYi9taWNyb2Ryb2lkL2luaXQucmMKQEAgLTE3LDYgKzE3LDE0IEBACiAKICAgICBzdGFydCB1ZXZlbnRkCiAKKyMgSWYgVk0gaXMgZGVidWdnYWJsZSwgc2VuZCBsb2dzIHRvIG91dHNpZGUgb3QgdGhlIFZNIHZpYSB0aGUgc2VyaWFsIGNvbnNvbGUuCisjIElmIG5vbi1kZWJ1Z2dhYmxlLCBsb2dzIGFyZSBpbnRlcm5hbGx5IGNvbnN1bWVkIGF0IC9kZXYvbnVsbAorb24gZWFybHktaW5pdCAmJiBwcm9wZXJ0eTpyby5ib290Lm1pY3JvZHJvaWQuYXBwX2RlYnVnZ2FibGU9MQorICAgIHNldHByb3Agcm8ubG9nLmZpbGVfbG9nZ2VyLnBhdGggL2Rldi9odmMyCisKK29uIGVhcmx5LWluaXQgJiYgcHJvcGVydHk6cm8uYm9vdC5taWNyb2Ryb2lkLmFwcF9kZWJ1Z2dhYmxlPTAKKyAgICBzZXRwcm9wIHJvLmxvZy5maWxlX2xvZ2dlci5wYXRoIC9kZXYvbnVsbAorCiBvbiBpbml0CiAgICAgIyBNb3VudCBiaW5kZXJmcwogICAgIG1rZGlyIC9kZXYvYmluZGVyZnMKQEAgLTYyLDEyICs3MCw2IEBACiAgICAgc3RhcnQgdmVuZG9yLmRpY2UtbWljcm9kcm9pZAogICAgIHN0YXJ0IGRpY2VkCiAKLW9uIGluaXQgJiYgcHJvcGVydHk6cm8uYm9vdC5sb2dkLmVuYWJsZWQ9MQotICAgICMgU3RhcnQgbG9nZCBiZWZvcmUgYW55IG90aGVyIHNlcnZpY2VzIHJ1biB0byBlbnN1cmUgd2UgY2FwdHVyZSBhbGwgb2YgdGhlaXIgbG9ncy4KLSAgICAjIFRPRE8oYi8yMTc3OTYyMjkpIHNldCBmaWx0ZXJzcGVjIGlmIGRlYnVnX2xldmVsIGlzIGFwcF9vbmx5Ci0gICAgc3RhcnQgbG9nZAotICAgIHN0YXJ0IHNlcmlhbGxvZ2dpbmcKLQogb24gaW5pdAogICAgIG1rZGlyIC9tbnQvYXBrIDA3NTUgc3lzdGVtIHN5c3RlbQogICAgIG1rZGlyIC9tbnQvZXh0cmEtYXBrIDA3NTUgcm9vdCByb290CkBAIC05OSwxMCArMTAxLDYgQEAKIG9uIGluaXQgJiYgcHJvcGVydHk6cm8uYm9vdC5hZGIuZW5hYmxlZD0xCiAgICAgc3RhcnQgYWRiZAogCi1vbiBsb2FkX3BlcnNpc3RfcHJvcHNfYWN0aW9uICYmIHByb3BlcnR5OnJvLmJvb3QubG9nZC5lbmFibGVkPTEKLSAgICBzdGFydCBsb2dkCi0gICAgc3RhcnQgbG9nZC1yZWluaXQKLQogIyBNb3VudCBmaWxlc3lzdGVtcyBhbmQgc3RhcnQgY29yZSBzeXN0ZW0gc2VydmljZXMuCiBvbiBsYXRlLWluaXQKICAgICB0cmlnZ2VyIGVhcmx5LWZzCkBAIC0yMDYsMTMgKzIwNCwzIEBACiAgICAgc2VjbGFiZWwgdTpyOnNoZWxsOnMwCiAgICAgc2V0ZW52IEhPU1ROQU1FIGNvbnNvbGUKIAotc2VydmljZSBzZXJpYWxsb2dnaW5nIC9zeXN0ZW0vYmluL2xvZ2NhdCAtYiBhbGwgLXYgdGhyZWFkdGltZSAtZiAvZGV2L2h2YzIgKjpWCi0gICAgZGlzYWJsZWQKLSAgICB1c2VyIGxvZ2QKLSAgICBncm91cCByb290IGxvZ2QKLQotb24gZnMKLSAgICB3cml0ZSAvZGV2L2V2ZW50LWxvZy10YWdzICIjIGNvbnRlbnQgb3duZWQgYnkgbG9nZAotIgotICAgIGNob3duIGxvZ2QgbG9nZCAvZGV2L2V2ZW50LWxvZy10YWdzCi0gICAgY2htb2QgMDY0NCAvZGV2L2V2ZW50LWxvZy10YWdzCmRpZmYgLS1naXQgYS9taWNyb2Ryb2lkL3VldmVudGQucmMgYi9taWNyb2Ryb2lkL3VldmVudGQucmMKaW5kZXggMzQwYTFmNy4uZmMxNjVjOCAxMDA2NDQKLS0tIGEvbWljcm9kcm9pZC91ZXZlbnRkLnJjCisrKyBiL21pY3JvZHJvaWQvdWV2ZW50ZC5yYwpAQCAtMjYsNiArMjYsNiBAQAogL2Rldi90dHkwICAgICAgICAgICAgICAgICAwNjYwICAgcm9vdCAgICAgICBzeXN0ZW0KIAogIyBWaXJ0dWFsIGNvbnNvbGUgZm9yIGxvZ2NhdAotL2Rldi9odmMyICAgICAgICAgICAgICAgICAwNjYwICAgbG9nZCAgICAgICBsb2dkCisvZGV2L2h2YzIgICAgICAgICAgICAgICAgIDA2NjYgICBzeXN0ZW0gICAgIHN5c3RlbQogCiAvZGV2L29wZW4tZGljZTAgICAgICAgICAgIDA2NjAgICBkaWNlZCAgICAgIGRpY2VkCmRpZmYgLS1naXQgYS90ZXN0cy9iZW5jaG1hcmtfaG9zdHNpZGUvamF2YS9hbmRyb2lkL2F2Zi90ZXN0L0FWRkhvc3RUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvYmVuY2htYXJrX2hvc3RzaWRlL2phdmEvYW5kcm9pZC9hdmYvdGVzdC9BVkZIb3N0VGVzdENhc2UuamF2YQppbmRleCBlZWFkYWUxLi5lNWVlZTI3IDEwMDY0NAotLS0gYS90ZXN0cy9iZW5jaG1hcmtfaG9zdHNpZGUvamF2YS9hbmRyb2lkL2F2Zi90ZXN0L0FWRkhvc3RUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3RzL2JlbmNobWFya19ob3N0c2lkZS9qYXZhL2FuZHJvaWQvYXZmL3Rlc3QvQVZGSG9zdFRlc3RDYXNlLmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CkBAIC01Niw2ICs1NywxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fU0VSVkVSX0NPTVBJTEVSX0ZJTFRFUl9QUk9QX05BTUUgPQogICAgICAgICAgICAgImRhbHZpay52bS5zeXN0ZW1zZXJ2ZXJjb21waWxlcmZpbHRlciI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVExPQURFUl9USU1FX1BST1BfTkFNRSA9ICJyby5ib290LmJvb3R0aW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVExPQURFUl9QUkVGSVggPSAiYm9vdGxvYWRlci0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09UTE9BREVSX1RJTUUgPSAiYm9vdGxvYWRlcl90aW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVExPQURFUl9QSEFTRV9TVyA9ICJTVyI7CisKICAgICAvKiogQm9vdCB0aW1lIHRlc3QgcmVsYXRlZCB2YXJpYWJsZXMgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVJTlNUQUxMX0FQRVhfUkVUUllfSU5URVJWQUxfTVMgPSA1ICogMTAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVJTlNUQUxMX0FQRVhfVElNRU9VVF9TRUMgPSAxNTsKQEAgLTg5LDcyICs5NSwxMjQgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCb290RW5hYmxlQW5kRGlzYWJsZVBLVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2tpcElmUEtWTVN0YXR1c1N3aXRjaE5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIExpc3Q8RG91YmxlPiBib290V2l0aFBLVk1FbmFibGVUaW1lID0gbmV3IEFycmF5TGlzdDw+KFJPVU5EX0NPVU5UKTsKLSAgICAgICAgTGlzdDxEb3VibGU+IGJvb3RXaXRob3V0UEtWTUVuYWJsZVRpbWUgPSBuZXcgQXJyYXlMaXN0PD4oUk9VTkRfQ09VTlQpOwotCi0gICAgICAgIGZvciAoaW50IHJvdW5kID0gMDsgcm91bmQgPCBST1VORF9DT1VOVDsgKytyb3VuZCkgewotCi0gICAgICAgICAgICBzZXRQS1ZNU3RhdHVzV2l0aFJlYm9vdFRvQm9vdGxvYWRlcih0cnVlKTsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLSAgICAgICAgICAgIHJlYm9vdEZyb21Cb290bG9hZGVyQW5kV2FpdEJvb3RDb21wbGV0ZWQoKTsKLSAgICAgICAgICAgIGxvbmcgZWxhcHNlZFdpdGhQS1ZNRW5hYmxlID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKLSAgICAgICAgICAgIGRvdWJsZSBlbGFwc2VkU2VjID0gZWxhcHNlZFdpdGhQS1ZNRW5hYmxlIC8gTkFOT1NfSU5fU0VDOwotICAgICAgICAgICAgYm9vdFdpdGhQS1ZNRW5hYmxlVGltZS5hZGQoZWxhcHNlZFNlYyk7Ci0gICAgICAgICAgICBDTG9nLmkoIkJvb3QgdGltZSB3aXRoIFBLVk0gZW5hYmxlIHRvb2sgIiArIGVsYXBzZWRTZWMgKyAicyIpOwotCi0gICAgICAgICAgICBzZXRQS1ZNU3RhdHVzV2l0aFJlYm9vdFRvQm9vdGxvYWRlcihmYWxzZSk7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwotICAgICAgICAgICAgcmVib290RnJvbUJvb3Rsb2FkZXJBbmRXYWl0Qm9vdENvbXBsZXRlZCgpOwotICAgICAgICAgICAgbG9uZyBlbGFwc2VkV2l0aG91dFBLVk1FbmFibGUgPSBTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0OwotICAgICAgICAgICAgZWxhcHNlZFNlYyA9IGVsYXBzZWRXaXRob3V0UEtWTUVuYWJsZSAvIE5BTk9TX0lOX1NFQzsKLSAgICAgICAgICAgIGJvb3RXaXRob3V0UEtWTUVuYWJsZVRpbWUuYWRkKGVsYXBzZWRTZWMpOwotICAgICAgICAgICAgQ0xvZy5pKCJCb290IHRpbWUgd2l0aCBQS1ZNIGRpc2FibGUgdG9vayAiICsgZWxhcHNlZFNlYyArICJzIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXBvcnRNZXRyaWMoYm9vdFdpdGhQS1ZNRW5hYmxlVGltZSwgImJvb3RfdGltZV93aXRoX3Brdm1fZW5hYmxlIiwgInMiKTsKLSAgICAgICAgcmVwb3J0TWV0cmljKGJvb3RXaXRob3V0UEtWTUVuYWJsZVRpbWUsICJib290X3RpbWVfd2l0aF9wa3ZtX2Rpc2FibGUiLCAicyIpOworICAgIHB1YmxpYyB2b2lkIHRlc3RCb290RW5hYmxlUEtWTSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVEaXNhYmxlUEtWTVRlc3RIZWxwZXIodHJ1ZSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vdFdpdGhBbmRXaXRob3V0Q29tcE9TKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc3VtZUZhbHNlKGlzQ3V0dGxlZmlzaCgpKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vdERpc2FibGVQS1ZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZURpc2FibGVQS1ZNVGVzdEhlbHBlcihmYWxzZSk7CisgICAgfQogCi0gICAgICAgIExpc3Q8RG91YmxlPiBib290V2l0aENvbXBPc1RpbWUgPSBuZXcgQXJyYXlMaXN0PD4oUk9VTkRfQ09VTlQpOwotICAgICAgICBMaXN0PERvdWJsZT4gYm9vdFdpdGhvdXRDb21wT3NUaW1lID0gbmV3IEFycmF5TGlzdDw+KFJPVU5EX0NPVU5UKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCb290V2l0aENvbXBPUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb21wb3NUZXN0SGVscGVyKHRydWUpOworICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb3RXaXRob3V0Q29tcE9TKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbXBvc1Rlc3RIZWxwZXIoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCb290bG9hZGVyVGltZUluZm8oTWFwPFN0cmluZywgTGlzdDxEb3VibGU+PiBib290bG9hZGVyVGltZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBib290TG9hZGVyVmFsID0gZ2V0RGV2aWNlKCkuZ2V0UHJvcGVydHkoQk9PVExPQURFUl9USU1FX1BST1BfTkFNRSk7CisgICAgICAgIC8vIFNhbXBsZSBPdXRwdXQgOiAxQkxMOjg5LDFCTEU6NTkwLDJCTEw6MCwyQkxFOjEzNDQsU1c6NjczNCxLTDoxMTkzCisgICAgICAgIGlmIChib290TG9hZGVyVmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGJvb3RMb2FkZXJQaGFzZXMgPSBib290TG9hZGVyVmFsLnNwbGl0KCIsIik7CisgICAgICAgICAgICBkb3VibGUgYm9vdExvYWRlclRvdGFsVGltZSA9IDBkOworICAgICAgICAgICAgZm9yIChTdHJpbmcgYm9vdExvYWRlclBoYXNlIDogYm9vdExvYWRlclBoYXNlcykgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGJvb3RLZXlWYWwgPSBib290TG9hZGVyUGhhc2Uuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gU3RyaW5nLmZvcm1hdCgiJXMlcyIsIEJPT1RMT0FERVJfUFJFRklYLCBib290S2V5VmFsWzBdKTsKKworICAgICAgICAgICAgICAgIGJvb3Rsb2FkZXJUaW1lLmNvbXB1dGVJZkFic2VudChrZXksCisgICAgICAgICAgICAgICAgICAgICAgICBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQoRG91YmxlLnBhcnNlRG91YmxlKGJvb3RLZXlWYWxbMV0pKTsKKyAgICAgICAgICAgICAgICAvLyBTVyBpcyB0aGUgdGltZSBzcGVudCBvbiB0aGUgd2FybmluZyBzY3JlZW4uIFNvIGlnbm9yZSBpdCBpbgorICAgICAgICAgICAgICAgIC8vIGZpbmFsIGJvb3QgdGltZSBjYWxjdWxhdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAoQk9PVExPQURFUl9QSEFTRV9TVy5lcXVhbHNJZ25vcmVDYXNlKGJvb3RLZXlWYWxbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib290TG9hZGVyVG90YWxUaW1lICs9IERvdWJsZS5wYXJzZURvdWJsZShib290S2V5VmFsWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb3Rsb2FkZXJUaW1lLmNvbXB1dGVJZkFic2VudChCT09UTE9BREVSX1RJTUUsCisgICAgICAgICAgICAgICAgICAgIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZChib290TG9hZGVyVG90YWxUaW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRG91YmxlIGdldERtZXNnQm9vdFRpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBDb21tYW5kUnVubmVyIGFuZHJvaWQgPSBuZXcgQ29tbWFuZFJ1bm5lcihnZXREZXZpY2UoKSk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBhbmRyb2lkLnJ1bigiZG1lc2ciKTsKKyAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXFsoLiopXFxdLipzeXMuYm9vdF9jb21wbGV0ZWQ9MS4qIik7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiByZXN1bHQuc3BsaXQoIltcclxuXSsiKSkgeworICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGxpbmUpOworICAgICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKG1hdGNoZXIuZ3JvdXAoMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgYm9vdCB0aW1lIGluZm8uIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZURpc2FibGVQS1ZNVGVzdEhlbHBlcihib29sZWFuIGlzRW5hYmxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2tpcElmUEtWTVN0YXR1c1N3aXRjaE5vdFN1cHBvcnRlZCgpOworCisgICAgICAgIExpc3Q8RG91YmxlPiBib290RG1lc2dUaW1lID0gbmV3IEFycmF5TGlzdDw+KFJPVU5EX0NPVU5UKTsKKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxEb3VibGU+PiBib290bG9hZGVyVGltZSA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICBzZXRQS1ZNU3RhdHVzV2l0aFJlYm9vdFRvQm9vdGxvYWRlcihpc0VuYWJsZSk7CisgICAgICAgIHJlYm9vdEZyb21Cb290bG9hZGVyQW5kV2FpdEJvb3RDb21wbGV0ZWQoKTsKICAgICAgICAgZm9yIChpbnQgcm91bmQgPSAwOyByb3VuZCA8IFJPVU5EX0NPVU5UOyArK3JvdW5kKSB7Ci0KLSAgICAgICAgICAgIC8vIEJvb3QgdGltZSB3aXRoIGNvbXBpbGF0aW9uIE9TIHRlc3QuCi0gICAgICAgICAgICByZUluc3RhbGxBcGV4KFJFSU5TVEFMTF9BUEVYX1RJTUVPVVRfU0VDKTsKLSAgICAgICAgICAgIGNvbXBpbGVTdGFnZWRBcGV4KENPTVBJTEVfU1RBR0VEX0FQRVhfVElNRU9VVF9TRUMpOwogICAgICAgICAgICAgZ2V0RGV2aWNlKCkubm9uQmxvY2tpbmdSZWJvb3QoKTsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICAgICAgICAgIHdhaXRGb3JCb290Q29tcGxldGVkKCk7Ci0gICAgICAgICAgICBsb25nIGVsYXBzZWRXaXRoQ29tcE9TID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKLSAgICAgICAgICAgIGRvdWJsZSBlbGFwc2VkU2VjID0gZWxhcHNlZFdpdGhDb21wT1MgLyBOQU5PU19JTl9TRUM7Ci0gICAgICAgICAgICBib290V2l0aENvbXBPc1RpbWUuYWRkKGVsYXBzZWRTZWMpOwotICAgICAgICAgICAgQ0xvZy5pKCJCb290IHRpbWUgd2l0aCBjb21waWxhdGlvbiBPUyB0b29rICIgKyBlbGFwc2VkU2VjICsgInMiKTsKIAotICAgICAgICAgICAgLy8gQm9vdCB0aW1lIHdpdGhvdXQgY29tcGlsYXRpb24gT1MgdGVzdC4KLSAgICAgICAgICAgIHJlSW5zdGFsbEFwZXgoUkVJTlNUQUxMX0FQRVhfVElNRU9VVF9TRUMpOwotICAgICAgICAgICAgZ2V0RGV2aWNlKCkubm9uQmxvY2tpbmdSZWJvb3QoKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgICAgICAgICB3YWl0Rm9yQm9vdENvbXBsZXRlZCgpOwotICAgICAgICAgICAgbG9uZyBlbGFwc2VkV2l0aG91dENvbXBPUyA9IFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBlbGFwc2VkU2VjID0gZWxhcHNlZFdpdGhvdXRDb21wT1MgLyBOQU5PU19JTl9TRUM7Ci0gICAgICAgICAgICBib290V2l0aG91dENvbXBPc1RpbWUuYWRkKGVsYXBzZWRTZWMpOwotICAgICAgICAgICAgQ0xvZy5pKCJCb290IHRpbWUgd2l0aG91dCBjb21waWxhdGlvbiBPUyB0b29rICIgKyBlbGFwc2VkU2VjICsgInMiKTsKKyAgICAgICAgICAgIHVwZGF0ZUJvb3Rsb2FkZXJUaW1lSW5mbyhib290bG9hZGVyVGltZSk7CisKKyAgICAgICAgICAgIGRvdWJsZSBlbGFwc2VkU2VjID0gZ2V0RG1lc2dCb290VGltZSgpOworICAgICAgICAgICAgYm9vdERtZXNnVGltZS5hZGQoZWxhcHNlZFNlYyk7CiAgICAgICAgIH0KIAotICAgICAgICByZXBvcnRNZXRyaWMoYm9vdFdpdGhDb21wT3NUaW1lLCAiYm9vdF90aW1lX3dpdGhfY29tcG9zIiwgInMiKTsKLSAgICAgICAgcmVwb3J0TWV0cmljKGJvb3RXaXRob3V0Q29tcE9zVGltZSwgImJvb3RfdGltZV93aXRob3V0X2NvbXBvcyIsICJzIik7CisgICAgICAgIFN0cmluZyBzdWZmaXggPSAiIjsKKyAgICAgICAgaWYgKGlzRW5hYmxlKSB7CisgICAgICAgICAgICBzdWZmaXggPSAiZW5hYmxlIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1ZmZpeCA9ICJkaXNhYmxlIjsKKyAgICAgICAgfQorCisgICAgICAgIHJlcG9ydE1ldHJpYyhib290RG1lc2dUaW1lLCAiZG1lc2dfYm9vdF90aW1lX3dpdGhfcGt2bV8iICsgc3VmZml4LCAicyIpOworICAgICAgICByZXBvcnRBZ2dyZWdhdGVkTWV0cmljcyhib290bG9hZGVyVGltZSwKKyAgICAgICAgICAgICAgICAiYm9vdGxvYWRlcl90aW1lX3dpdGhfcGt2bV8iICsgc3VmZml4LCAibXMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29tcG9zVGVzdEhlbHBlcihib29sZWFuIGlzV2l0aENvbXBvcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc3VtZUZhbHNlKCJTa2lwIG9uIENGOyB0b28gc2xvdyIsIGlzQ3V0dGxlZmlzaCgpKTsKKworICAgICAgICBMaXN0PERvdWJsZT4gYm9vdERtZXNnVGltZSA9IG5ldyBBcnJheUxpc3Q8PihST1VORF9DT1VOVCk7CisKKyAgICAgICAgZm9yIChpbnQgcm91bmQgPSAwOyByb3VuZCA8IFJPVU5EX0NPVU5UOyArK3JvdW5kKSB7CisgICAgICAgICAgICByZUluc3RhbGxBcGV4KFJFSU5TVEFMTF9BUEVYX1RJTUVPVVRfU0VDKTsKKyAgICAgICAgICAgIGlmIChpc1dpdGhDb21wb3MpIHsKKyAgICAgICAgICAgICAgICBjb21waWxlU3RhZ2VkQXBleChDT01QSUxFX1NUQUdFRF9BUEVYX1RJTUVPVVRfU0VDKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldERldmljZSgpLm5vbkJsb2NraW5nUmVib290KCk7CisgICAgICAgICAgICB3YWl0Rm9yQm9vdENvbXBsZXRlZCgpOworCisgICAgICAgICAgICBkb3VibGUgZWxhcHNlZFNlYyA9IGdldERtZXNnQm9vdFRpbWUoKTsKKyAgICAgICAgICAgIGJvb3REbWVzZ1RpbWUuYWRkKGVsYXBzZWRTZWMpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHN1ZmZpeCA9ICIiOworICAgICAgICBpZiAoaXNXaXRoQ29tcG9zKSB7CisgICAgICAgICAgICBzdWZmaXggPSAid2l0aF9jb21wb3MiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VmZml4ID0gIndpdGhvdXRfY29tcG9zIjsKKyAgICAgICAgfQorCisgICAgICAgIHJlcG9ydE1ldHJpYyhib290RG1lc2dUaW1lLCAiZG1lc2dfYm9vdF90aW1lXyIgKyBzdWZmaXgsICJzIik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNraXBJZlBLVk1TdGF0dXNTd2l0Y2hOb3RTdXBwb3J0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzdW1lRmFsc2UoaXNDdXR0bGVmaXNoKCkpOworICAgICAgICBhc3N1bWVGYWxzZSgiU2tpcCBvbiBDRjsgY2FuJ3QgcmVib290IHRvIGJvb3Rsb2FkZXIiLCBpc0N1dHRsZWZpc2goKSk7CiAKICAgICAgICAgaWYgKCFnZXREZXZpY2UoKS5pc1N0YXRlQm9vdGxvYWRlck9yRmFzdGJvb3RkKCkpIHsKICAgICAgICAgICAgIGdldERldmljZSgpLnJlYm9vdEludG9Cb290bG9hZGVyKCk7CkBAIC0xNzEsMTIgKzIyOSwyMiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXBvcnRNZXRyaWMoTGlzdDxEb3VibGU+IGRhdGEsIFN0cmluZyBuYW1lLCBTdHJpbmcgdW5pdCkgeworICAgICAgICBDTG9nLmQoIlJlcG9ydCBtZXRyaWMgIiArIG5hbWUgKyAiKCIgKyB1bml0ICsgIikgOiAiICsgZGF0YS50b1N0cmluZygpKTsKICAgICAgICAgTWFwPFN0cmluZywgRG91YmxlPiBzdGF0cyA9IG1NZXRyaWNzUHJvY2Vzc29yLmNvbXB1dGVTdGF0cyhkYXRhLCBuYW1lLCB1bml0KTsKICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEb3VibGU+IGVudHJ5IDogc3RhdHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgQ0xvZy5kKCJBZGQgdGVzdCBtZXRyaWNzICIgKyBlbnRyeS5nZXRLZXkoKSArICIgOiAiICsgZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKICAgICAgICAgICAgIG1NZXRyaWNzLmFkZFRlc3RNZXRyaWMoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0QWdncmVnYXRlZE1ldHJpY3MoTWFwPFN0cmluZywgTGlzdDxEb3VibGU+PiBib290bG9hZGVyVGltZSwKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1bml0KSB7CisKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PERvdWJsZT4+IGVudHJ5IDogYm9vdGxvYWRlclRpbWUuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcmVwb3J0TWV0cmljKGVudHJ5LmdldFZhbHVlKCksIHByZWZpeCArICJfIiArIGVudHJ5LmdldEtleSgpLCB1bml0KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzZXRQS1ZNU3RhdHVzV2l0aFJlYm9vdFRvQm9vdGxvYWRlcihib29sZWFuIGlzRW5hYmxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAoIWdldERldmljZSgpLmlzU3RhdGVCb290bG9hZGVyT3JGYXN0Ym9vdGQoKSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvaGVscGVyL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9jb21tb24vTWV0cmljc1Byb2Nlc3Nvci5qYXZhIGIvdGVzdHMvaGVscGVyL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9jb21tb24vTWV0cmljc1Byb2Nlc3Nvci5qYXZhCmluZGV4IGMxMmIwN2QuLjQxNTM0ZjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2hlbHBlci9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvY29tbW9uL01ldHJpY3NQcm9jZXNzb3IuamF2YQorKysgYi90ZXN0cy9oZWxwZXIvc3JjL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L2NvbW1vbi9NZXRyaWNzUHJvY2Vzc29yLmphdmEKQEAgLTMzLDE4ICszMywyMSBAQAogICAgICAqIGEge0BsaW5rIE1hcH0gd2l0aCB0aGUgY29ycmVzcG9uZGluZyBrZXlzIGVxdWFsIHRvIFttUHJlZml4ICsgbmFtZSArCiAgICAgICogX1ttaW58bWF4fGF2ZXJhZ2V8c3RkZXZdXyArIHVuaXRdLgogICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBEb3VibGU+IGNvbXB1dGVTdGF0cyhMaXN0PERvdWJsZT4gbWV0cmljcywgU3RyaW5nIG5hbWUsIFN0cmluZyB1bml0KSB7CisgICAgcHVibGljIE1hcDxTdHJpbmcsIERvdWJsZT4gY29tcHV0ZVN0YXRzKExpc3Q8PyBleHRlbmRzIE51bWJlcj4gbWV0cmljcywgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBTdHJpbmcgdW5pdCkgewogICAgICAgICBkb3VibGUgc3VtID0gMDsKICAgICAgICAgZG91YmxlIG1pbiA9IERvdWJsZS5NQVhfVkFMVUU7CiAgICAgICAgIGRvdWJsZSBtYXggPSBEb3VibGUuTUlOX1ZBTFVFOwotICAgICAgICBmb3IgKGRvdWJsZSBkIDogbWV0cmljcykgeworICAgICAgICBmb3IgKE51bWJlciBtZXRyaWMgOiBtZXRyaWNzKSB7CisgICAgICAgICAgICBkb3VibGUgZCA9IG1ldHJpYy5kb3VibGVWYWx1ZSgpOwogICAgICAgICAgICAgc3VtICs9IGQ7CiAgICAgICAgICAgICBpZiAobWluID4gZCkgbWluID0gZDsKICAgICAgICAgICAgIGlmIChtYXggPCBkKSBtYXggPSBkOwogICAgICAgICB9CiAgICAgICAgIGRvdWJsZSBhdmcgPSBzdW0gLyBtZXRyaWNzLnNpemUoKTsKICAgICAgICAgZG91YmxlIHNxU3VtID0gMDsKLSAgICAgICAgZm9yIChkb3VibGUgZCA6IG1ldHJpY3MpIHsKKyAgICAgICAgZm9yIChOdW1iZXIgbWV0cmljIDogbWV0cmljcykgeworICAgICAgICAgICAgZG91YmxlIGQgPSBtZXRyaWMuZG91YmxlVmFsdWUoKTsKICAgICAgICAgICAgIHNxU3VtICs9IChkIC0gYXZnKSAqIChkIC0gYXZnKTsKICAgICAgICAgfQogICAgICAgICBkb3VibGUgc3RkRGV2ID0gTWF0aC5zcXJ0KHNxU3VtIC8gKG1ldHJpY3Muc2l6ZSgpIC0gMSkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvaGVscGVyL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9jb21tb24vUHJvY2Vzc1V0aWwuamF2YSBiL3Rlc3RzL2hlbHBlci9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvY29tbW9uL1Byb2Nlc3NVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhYWQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2hlbHBlci9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvY29tbW9uL1Byb2Nlc3NVdGlsLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWljcm9kcm9pZC50ZXN0LmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKKy8qKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHByb2Nlc3MgdXRpbGl0eSBmb3IgYm90aCBkZXZpY2UgdGVzdHMgYW5kIGhvc3QgdGVzdHMuICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJvY2Vzc1V0aWwgeworCisgICAgLyoqIEdldHMgbWV0cmljcyBrZXkgYW5kIHZhbHVlcyBtYXBwaW5nIG9mIHNwZWNpZmllZCBwcm9jZXNzIGlkICovCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBMb25nPiBnZXRQcm9jZXNzU21hcHNSb2xsdXAoCisgICAgICAgICAgICBpbnQgcGlkLCBGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4gc2hlbGxFeGVjdXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSAiL3Byb2MvIiArIHBpZCArICIvc21hcHNfcm9sbHVwIjsKKyAgICAgICAgcmV0dXJuIHBhcnNlTWVtb3J5SW5mbyhza2lwRmlyc3RMaW5lKHNoZWxsRXhlY3V0b3IuYXBwbHkoImNhdCAiICsgcGF0aCArICIgfHwgdHJ1ZSIpKSk7CisgICAgfQorCisgICAgLyoqIEdldHMgcHJvY2VzcyBpZCBhbmQgcHJvY2VzcyBuYW1lIG1hcHBpbmcgb2YgdGhlIGRldmljZSAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwPEludGVnZXIsIFN0cmluZz4gZ2V0UHJvY2Vzc01hcChGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4gc2hlbGxFeGVjdXRvcikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHByb2Nlc3NNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHBzIDogc2tpcEZpcnN0TGluZShzaGVsbEV4ZWN1dG9yLmFwcGx5KCJwcyAtQW8gUElELE5BTUUiKSkuc3BsaXQoIlxuIikpIHsKKyAgICAgICAgICAgIC8vIEVhY2ggbGluZSBpcyAnPHBpZD4gPG5hbWU+Jy4KKyAgICAgICAgICAgIC8vIEVYIDogMTE0MjQgZGV4Mm9hdDY0CisgICAgICAgICAgICBwcyA9IHBzLnRyaW0oKTsKKyAgICAgICAgICAgIGlmIChwcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3BhY2UgPSBwcy5pbmRleE9mKCIgIik7CisgICAgICAgICAgICBTdHJpbmcgcE5hbWUgPSBwcy5zdWJzdHJpbmcoc3BhY2UgKyAxKTsKKyAgICAgICAgICAgIGludCBwSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHBzLnN1YnN0cmluZygwLCBzcGFjZSkpOworICAgICAgICAgICAgcHJvY2Vzc01hcC5wdXQocElkLCBwTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvY2Vzc01hcDsKKyAgICB9CisKKyAgICAvLyBUbyBlbnN1cmVzIHRoYXQgb25seSBvbmUgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgYSB0aW1lLgorICAgIHByaXZhdGUgUHJvY2Vzc1V0aWwoKSB7fQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTG9uZz4gcGFyc2VNZW1vcnlJbmZvKFN0cmluZyBmaWxlKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIExvbmc+IHN0YXRzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogZmlsZS5zcGxpdCgiW1xyXG5dKyIpKSB7CisgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CisgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFYWNoIGxpbmUgaXMgJzxtZXRyaWNzPjogICAgICAgIDxudW1iZXI+IGtCJy4KKyAgICAgICAgICAgIC8vIEVYIDogUHNzX0Fub246ICAgICAgICA3MDcxMiBrQgorICAgICAgICAgICAgaWYgKGxpbmUuZW5kc1dpdGgoIiBrQiIpKSBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGgoKSAtIDMpOworCisgICAgICAgICAgICBTdHJpbmdbXSBlbGVtcyA9IGxpbmUuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgIHN0YXRzLnB1dChlbGVtc1swXS50cmltKCksIExvbmcucGFyc2VMb25nKGVsZW1zWzFdLnRyaW0oKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2tpcEZpcnN0TGluZShTdHJpbmcgc3RyKSB7CisgICAgICAgIGludCBpbmRleCA9IHN0ci5pbmRleE9mKCJcbiIpOworICAgICAgICByZXR1cm4gKGluZGV4IDwgMCkgPyAiIiA6IHN0ci5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9oZWxwZXIvc3JjL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L2RldmljZS9NaWNyb2Ryb2lkRGV2aWNlVGVzdEJhc2UuamF2YSBiL3Rlc3RzL2hlbHBlci9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvZGV2aWNlL01pY3JvZHJvaWREZXZpY2VUZXN0QmFzZS5qYXZhCmluZGV4IGU1YmM0NWEuLmEwNzczMWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2hlbHBlci9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvZGV2aWNlL01pY3JvZHJvaWREZXZpY2VUZXN0QmFzZS5qYXZhCisrKyBiL3Rlc3RzL2hlbHBlci9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvZGV2aWNlL01pY3JvZHJvaWREZXZpY2VUZXN0QmFzZS5qYXZhCkBAIC0yMTAsOSArMjEwLDcgQEAKIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmb3JjZVN0b3AoVmlydHVhbE1hY2hpbmUgdm0pIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdm0uY2xlYXJDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgIHZtLnN0b3AoKTsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CiAgICAgICAgICAgICB9IGNhdGNoIChWaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICB9CkBAIC0yMzMsNiArMjMxLDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIEBDYWxsU3VwZXIKICAgICAgICAgcHVibGljIHZvaWQgb25EaWVkKFZpcnR1YWxNYWNoaW5lIHZtLCBpbnQgcmVhc29uKSB7CisgICAgICAgICAgICB2bS5jbGVhckNhbGxiYWNrKCk7CiAgICAgICAgICAgICBtRXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvaG9zdHNpZGUvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvTWljcm9kcm9pZFRlc3RDYXNlLmphdmEgYi90ZXN0cy9ob3N0c2lkZS9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9NaWNyb2Ryb2lkVGVzdENhc2UuamF2YQppbmRleCBkMDE2YTY3Li42OTIxOGE4IDEwMDY0NAotLS0gYS90ZXN0cy9ob3N0c2lkZS9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9NaWNyb2Ryb2lkVGVzdENhc2UuamF2YQorKysgYi90ZXN0cy9ob3N0c2lkZS9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9NaWNyb2Ryb2lkVGVzdENhc2UuamF2YQpAQCAtNzA4LDYgKzcwOCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gVE9ETyhiLzYxODQ1NDgpOiB0byBiZSByZXBsYWNlZCBieSBQcm9jZXNzVXRpbAorICAgIC8qKgorICAgICogQGRlcHJlY2F0ZWQgdXNlIFByb2Nlc3NVdGlsIGluc3RlYWQuCisgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByaXZhdGUgTWFwPFN0cmluZywgTG9uZz4gcGFyc2VNZW1JbmZvKFN0cmluZyBmaWxlKSB7CiAgICAgICAgIE1hcDxTdHJpbmcsIExvbmc+IHN0YXRzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBmaWxlLmxpbmVzKCkuZm9yRWFjaChsaW5lIC0+IHsKQEAgLTcyMCwxMSArNzI1LDIxIEBACiAgICAgICAgIHJldHVybiBzdGF0czsKICAgICB9CiAKKyAgICAvLyBUT0RPKGIvNjE4NDU0OCk6IHRvIGJlIHJlcGxhY2VkIGJ5IFByb2Nlc3NVdGlsCisgICAgLyoqCisgICAgKiBAZGVwcmVjYXRlZCB1c2UgUHJvY2Vzc1V0aWwgaW5zdGVhZC4KKyAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJpdmF0ZSBTdHJpbmcgc2tpcEZpcnN0TGluZShTdHJpbmcgc3RyKSB7CiAgICAgICAgIGludCBpbmRleCA9IHN0ci5pbmRleE9mKCJcbiIpOwogICAgICAgICByZXR1cm4gKGluZGV4IDwgMCkgPyAiIiA6IHN0ci5zdWJzdHJpbmcoaW5kZXggKyAxKTsKICAgICB9CiAKKyAgICAvLyBUT0RPKGIvNjE4NDU0OCk6IHRvIGJlIHJlcGxhY2VkIGJ5IFByb2Nlc3NVdGlsCisgICAgLyoqCisgICAgKiBAZGVwcmVjYXRlZCB1c2UgUHJvY2Vzc1V0aWwgaW5zdGVhZC4KKyAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NJbmZvPiBnZXRSdW5uaW5nUHJvY2Vzc2VzTGlzdCgpIHsKICAgICAgICAgTGlzdDxQcm9jZXNzSW5mbz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc0luZm8+KCk7CiAgICAgICAgIHNraXBGaXJzdExpbmUocnVuT25NaWNyb2Ryb2lkKCJwcyIsICItQW8iLCAiUElELE5BTUUiKSkubGluZXMoKS5mb3JFYWNoKHBzIC0+IHsKQEAgLTczOSwxMCArNzU0LDIwIEBACiAgICAgICAgIHJldHVybiBsaXN0OwogICAgIH0KIAorICAgIC8vIFRPRE8oYi82MTg0NTQ4KTogdG8gYmUgcmVwbGFjZWQgYnkgUHJvY2Vzc1V0aWwKKyAgICAvKioKKyAgICAqIEBkZXByZWNhdGVkIHVzZSBQcm9jZXNzVXRpbCBpbnN0ZWFkLgorICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExvbmc+IGdldFByb2NNZW1JbmZvKCkgewogICAgICAgICByZXR1cm4gcGFyc2VNZW1JbmZvKHJ1bk9uTWljcm9kcm9pZCgiY2F0IiwgIi9wcm9jL21lbWluZm8iKSk7CiAgICAgfQogCisgICAgLy8gVE9ETyhiLzYxODQ1NDgpOiB0byBiZSByZXBsYWNlZCBieSBQcm9jZXNzVXRpbAorICAgIC8qKgorICAgICogQGRlcHJlY2F0ZWQgdXNlIFByb2Nlc3NVdGlsIGluc3RlYWQuCisgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByaXZhdGUgTWFwPFN0cmluZywgTG9uZz4gZ2V0UHJvY1NtYXBzUm9sbHVwKGludCBwaWQpIHsKICAgICAgICAgU3RyaW5nIHBhdGggPSAiL3Byb2MvIiArIHBpZCArICIvc21hcHNfcm9sbHVwIjsKICAgICAgICAgcmV0dXJuICBwYXJzZU1lbUluZm8oc2tpcEZpcnN0TGluZShydW5Pbk1pY3JvZHJvaWQoImNhdCIsIHBhdGgsICJ8fCIsICJ0cnVlIikpKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RhcGsvc3JjL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L01pY3JvZHJvaWRUZXN0cy5qYXZhIGIvdGVzdHMvdGVzdGFway9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvTWljcm9kcm9pZFRlc3RzLmphdmEKaW5kZXggYjkyYTUyNi4uYzIwNjBjYiAxMDA2NDQKLS0tIGEvdGVzdHMvdGVzdGFway9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvTWljcm9kcm9pZFRlc3RzLmphdmEKKysrIGIvdGVzdHMvdGVzdGFway9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvTWljcm9kcm9pZFRlc3RzLmphdmEKQEAgLTIwNiwzOSArMjA2LDI3IEBACiAKICAgICAgICAgVmlydHVhbE1hY2hpbmVDb25maWcuQnVpbGRlciBidWlsZGVyID0gbUlubmVyLm5ld1ZtQ29uZmlnQnVpbGRlcigiYXNzZXRzL3ZtX2NvbmZpZy5qc29uIik7CiAgICAgICAgIFZpcnR1YWxNYWNoaW5lQ29uZmlnIG5vcm1hbENvbmZpZyA9IGJ1aWxkZXIuZGVidWdMZXZlbChEZWJ1Z0xldmVsLk5PTkUpLmJ1aWxkKCk7Ci0gICAgICAgIFZpcnR1YWxNYWNoaW5lIHZtID0gbUlubmVyLmZvcmNlQ3JlYXRlTmV3VmlydHVhbE1hY2hpbmUoInRlc3Rfdm0iLCBub3JtYWxDb25maWcpOwotICAgICAgICBWbUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPQotICAgICAgICAgICAgICAgIG5ldyBWbUV2ZW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBheWxvYWRSZWFkeShWaXJ0dWFsTWFjaGluZSB2bSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VTdG9wKHZtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIGxpc3RlbmVyLnJ1blRvRmluaXNoKFRBRywgdm0pOworICAgICAgICBtSW5uZXIuZm9yY2VDcmVhdGVOZXdWaXJ0dWFsTWFjaGluZSgidGVzdF92bSIsIG5vcm1hbENvbmZpZyk7CisgICAgICAgIGFzc2VydFRoYXQodHJ5Qm9vdFZtKFRBRywgInRlc3Rfdm0iKS5wYXlsb2FkU3RhcnRlZCkuaXNUcnVlKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIHJ1biB0aGUgVk0gYWdhaW4gd2l0aCB0aGUgcHJldmlvdXMgaW5zdGFuY2UuaW1nCisgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgbm8gY2hhbmdlcyBvbiBjb25maWcgZG9uJ3QgaW52YWxpZGF0ZSB0aGUgaWRlbnRpdHksIHRvIGNvbXBhcmUKKyAgICAgICAgLy8gdGhlIHJlc3VsdCB3aXRoIHRoZSBiZWxvdyAiZGlmZmVyZW50IGRlYnVnIGxldmVsIiB0ZXN0LgorICAgICAgICBGaWxlIHZtUm9vdCA9IG5ldyBGaWxlKGdldENvbnRleHQoKS5nZXRGaWxlc0RpcigpLCAidm0iKTsKKyAgICAgICAgRmlsZSB2bUluc3RhbmNlID0gbmV3IEZpbGUobmV3IEZpbGUodm1Sb290LCAidGVzdF92bSIpLCAiaW5zdGFuY2UuaW1nIik7CisgICAgICAgIEZpbGUgdm1JbnN0YW5jZUJhY2t1cCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImluc3RhbmNlIiwgIi5pbWciKTsKKyAgICAgICAgRmlsZXMuY29weSh2bUluc3RhbmNlLnRvUGF0aCgpLCB2bUluc3RhbmNlQmFja3VwLnRvUGF0aCgpLCBSRVBMQUNFX0VYSVNUSU5HKTsKKyAgICAgICAgbUlubmVyLmZvcmNlQ3JlYXRlTmV3VmlydHVhbE1hY2hpbmUoInRlc3Rfdm0iLCBub3JtYWxDb25maWcpOworICAgICAgICBGaWxlcy5jb3B5KHZtSW5zdGFuY2VCYWNrdXAudG9QYXRoKCksIHZtSW5zdGFuY2UudG9QYXRoKCksIFJFUExBQ0VfRVhJU1RJTkcpOworICAgICAgICBhc3NlcnRUaGF0KHRyeUJvb3RWbShUQUcsICJ0ZXN0X3ZtIikucGF5bG9hZFN0YXJ0ZWQpLmlzVHJ1ZSgpOwogCiAgICAgICAgIC8vIExhdW5jaCB0aGUgc2FtZSBWTSB3aXRoIGRpZmZlcmVudCBkZWJ1ZyBsZXZlbC4gVGhlIEphdmEgQVBJIHByb2hpYml0cyB0aGlzICh0aGFua2Z1bGx5KS4KLSAgICAgICAgLy8gRm9yIHRlc3RpbmcsIHdlIGRvIHRoYXQgYnkgY3JlYXRpbmcgYW5vdGhlciBWTSB3aXRoIGRlYnVnIGxldmVsLCBhbmQgY29weSB0aGUgY29uZmlnIGZpbGUKLSAgICAgICAgLy8gZnJvbSB0aGUgbmV3IFZNIGRpcmVjdG9yeSB0byB0aGUgb2xkIFZNIGRpcmVjdG9yeS4KKyAgICAgICAgLy8gRm9yIHRlc3RpbmcsIHdlIGRvIHRoYXQgYnkgY3JlYXRpbmcgYSBuZXcgVk0gd2l0aCBkZWJ1ZyBsZXZlbCwgYW5kIGNvcHkgdGhlIG9sZCBpbnN0YW5jZQorICAgICAgICAvLyBpbWFnZSB0byB0aGUgbmV3IFZNIGluc3RhbmNlIGltYWdlLgogICAgICAgICBWaXJ0dWFsTWFjaGluZUNvbmZpZyBkZWJ1Z0NvbmZpZyA9IGJ1aWxkZXIuZGVidWdMZXZlbChEZWJ1Z0xldmVsLkZVTEwpLmJ1aWxkKCk7Ci0gICAgICAgIFZpcnR1YWxNYWNoaW5lIG5ld1ZtID0gbUlubmVyLmZvcmNlQ3JlYXRlTmV3VmlydHVhbE1hY2hpbmUoInRlc3RfZGVidWdfdm0iLCBkZWJ1Z0NvbmZpZyk7Ci0gICAgICAgIEZpbGUgdm1Sb290ID0gbmV3IEZpbGUoZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCksICJ2bSIpOwotICAgICAgICBGaWxlIG5ld1ZtQ29uZmlnID0gbmV3IEZpbGUobmV3IEZpbGUodm1Sb290LCAidGVzdF9kZWJ1Z192bSIpLCAiY29uZmlnLnhtbCIpOwotICAgICAgICBGaWxlIG9sZFZtQ29uZmlnID0gbmV3IEZpbGUobmV3IEZpbGUodm1Sb290LCAidGVzdF92bSIpLCAiY29uZmlnLnhtbCIpOwotICAgICAgICBGaWxlcy5jb3B5KG5ld1ZtQ29uZmlnLnRvUGF0aCgpLCBvbGRWbUNvbmZpZy50b1BhdGgoKSwgUkVQTEFDRV9FWElTVElORyk7Ci0gICAgICAgIG5ld1ZtLmRlbGV0ZSgpOwotICAgICAgICAvLyByZS1sb2FkIHdpdGggdGhlIGNvcGllZC1pbiBjb25maWcgZmlsZS4KLSAgICAgICAgdm0gPSBtSW5uZXIuZ2V0VmlydHVhbE1hY2hpbmVNYW5hZ2VyKCkuZ2V0KCJ0ZXN0X3ZtIik7Ci0gICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPEJvb2xlYW4+IHBheWxvYWRTdGFydGVkID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKLSAgICAgICAgbGlzdGVuZXIgPQotICAgICAgICAgICAgICAgIG5ldyBWbUV2ZW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBheWxvYWRTdGFydGVkKFZpcnR1YWxNYWNoaW5lIHZtLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBzdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTdGFydGVkLmNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VTdG9wKHZtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIGxpc3RlbmVyLnJ1blRvRmluaXNoKFRBRywgdm0pOwotICAgICAgICBhc3NlcnRUaGF0KHBheWxvYWRTdGFydGVkLmdldE5vdyhmYWxzZSkpLmlzRmFsc2UoKTsKKyAgICAgICAgbUlubmVyLmZvcmNlQ3JlYXRlTmV3VmlydHVhbE1hY2hpbmUoInRlc3Rfdm0iLCBkZWJ1Z0NvbmZpZyk7CisgICAgICAgIEZpbGVzLmNvcHkodm1JbnN0YW5jZUJhY2t1cC50b1BhdGgoKSwgdm1JbnN0YW5jZS50b1BhdGgoKSwgUkVQTEFDRV9FWElTVElORyk7CisgICAgICAgIGFzc2VydFRoYXQodHJ5Qm9vdFZtKFRBRywgInRlc3Rfdm0iKS5wYXlsb2FkU3RhcnRlZCkuaXNGYWxzZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgVm1DZGlzIHsKQEAgLTUxNiw0ICs1MDQsMjEgQEAKICAgICAgICAgYXNzZXJ0VGhhdChib290UmVzdWx0LmRlYXRoUmVhc29uKS5pc0VxdWFsVG8oCiAgICAgICAgICAgICAgICAgVmlydHVhbE1hY2hpbmVDYWxsYmFjay5ERUFUSF9SRUFTT05fTUlDUk9EUk9JRF9JTlZBTElEX1BBWUxPQURfQ09ORklHKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNhbWVJbnN0YW5jZXNTaGFyZVRoZVNhbWVWbU9iamVjdCgpCisgICAgICAgICAgICB0aHJvd3MgVmlydHVhbE1hY2hpbmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFZpcnR1YWxNYWNoaW5lQ29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgICAgICAgICAgbUlubmVyLm5ld1ZtQ29uZmlnQnVpbGRlcigiYXNzZXRzL3ZtX2NvbmZpZy5qc29uIik7CisgICAgICAgIFZpcnR1YWxNYWNoaW5lQ29uZmlnIG5vcm1hbENvbmZpZyA9IGJ1aWxkZXIuZGVidWdMZXZlbChEZWJ1Z0xldmVsLk5PTkUpLmJ1aWxkKCk7CisgICAgICAgIFZpcnR1YWxNYWNoaW5lIHZtID0gbUlubmVyLmZvcmNlQ3JlYXRlTmV3VmlydHVhbE1hY2hpbmUoInRlc3Rfdm0iLCBub3JtYWxDb25maWcpOworICAgICAgICBWaXJ0dWFsTWFjaGluZSB2bTIgPSBtSW5uZXIuZ2V0VmlydHVhbE1hY2hpbmVNYW5hZ2VyKCkuZ2V0KCJ0ZXN0X3ZtIik7CisgICAgICAgIGFzc2VydFRoYXQodm0pLmlzRXF1YWxUbyh2bTIpOworCisgICAgICAgIFZpcnR1YWxNYWNoaW5lIG5ld1ZtID0gbUlubmVyLmZvcmNlQ3JlYXRlTmV3VmlydHVhbE1hY2hpbmUoInRlc3Rfdm0iLCBub3JtYWxDb25maWcpOworICAgICAgICBWaXJ0dWFsTWFjaGluZSBuZXdWbTIgPSBtSW5uZXIuZ2V0VmlydHVhbE1hY2hpbmVNYW5hZ2VyKCkuZ2V0KCJ0ZXN0X3ZtIik7CisgICAgICAgIGFzc2VydFRoYXQobmV3Vm0pLmlzRXF1YWxUbyhuZXdWbTIpOworCisgICAgICAgIGFzc2VydFRoYXQodm0pLmlzTm90RXF1YWxUbyhuZXdWbSk7CisgICAgfQogfQo=