ZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzk4Lzk4MDJlNmFjYjYzZWEzNzNmNTQ5YTg4YWUwNmZjYjZlM2NkZGU1ZmYuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85ODAyZTZhY2I2M2VhMzczZjU0OWE4OGFlMDZmY2I2ZTNjZGRlNWZmLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiODFhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85ODAyZTZhY2I2M2VhMzczZjU0OWE4OGFlMDZmY2I2ZTNjZGRlNWZmLnN2bi1iYXNlCkBAIC0wLDAgKzEsMTExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICAgSVRVLVQgRy43MjIuMSAoMjAwNS0wNSkgLSBGaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBmb3IgbWFpbiBib2R5IGFuZCBBbm5leCBDCisqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCisqKiAgICAgKFNpbXBsZSByZXBhY2thZ2luZzsgbm8gY2hhbmdlIGZyb20gMjAwNS0wNSBSZWxlYXNlIDIuMCBjb2RlKQorKioKKyoqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKyoqCisqKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEZpbGVuYW1lOiAgICBkZWNvZGVyLmMgICAgCisKKyAgUHVycG9zZTogICAgIENvbnRhaW5zIGZpbGVzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBHLjcyMi4xIEFubmV4IEMgZGVjb2RlcgorCQkKKyAgRGVzaWduIE5vdGVzOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAidGFibGVzLmgiCisjaW5jbHVkZSAiaHVmZl9kZWYuaCIKKyNpbmNsdWRlICJjb3VudC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgZGVjb2RlcgorCisgU3ludGF4OiAgICAgIHZvaWQgZGVjb2RlcihCaXRfT2JqICpiaXRvYmosICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZF9PYmogKnJhbmRvYmosICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX21sdF9jb2VmcywgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwX21hZ19zaGlmdCwgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwX29sZF9tYWdfc2hpZnQsICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpvbGRfZGVjb2Rlcl9tbHRfY29lZnMsICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGZyYW1lX2Vycm9yX2ZsYWcpICAgICAgCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpbnB1dHM6ICAgIEJpdF9PYmogKmJpdG9iagorICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRfT2JqICpyYW5kb2JqCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwX29sZF9tYWdfc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm9sZF9kZWNvZGVyX21sdF9jb2VmcworICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBmcmFtZV9lcnJvcl9mbGFnCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBvdXRwdXRzOiAgIFdvcmQxNiAqZGVjb2Rlcl9tbHRfY29lZnMsICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcF9tYWdfc2hpZnQsICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAKKworIERlc2NyaXB0aW9uOiBEZWNvZGVzIHRoZSBvdXRfd29yZHMgaW50byBtbHQgY29lZnMgdXNpbmcgRy43MjIuMSBBbm5leCBDCisKKyBEZXNpZ24gTm90ZXM6CisgCisgV01PUFM6ICAgICA3a0h6IHwgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuODQgICAgIHwgICAgMC45NAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjkwICAgICB8ICAgIDEuMDAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKKwkJCQkKKyAgICAgICAgICAgMTRrSHogfCAgIDI0a2JpdCAgICB8ICAgIDMya2JpdCAgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAxLjMxICAgICB8ICAgIDEuNTYgICAgICAgIHwgICAgIDEuODggICAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgMS41OSAgICAgfCAgICAxLjgwICAgICAgICB8ICAgICAxLjk4ICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorCQkJCQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkZWNvZGVyKEJpdF9PYmogKmJpdG9iaiwKKyAgICAgICAgICAgICBSYW5kX09iaiAqcmFuZG9iaiwKKyAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCisJICAgICAgICAgV29yZDE2ICpkZWNvZGVyX21sdF9jb2VmcywKKwkgICAgICAgICBXb3JkMTYgKnBfbWFnX3NoaWZ0LAorICAgICAgICAgICAgIFdvcmQxNiAqcF9vbGRfbWFnX3NoaWZ0LAorICAgICAgICAgICAgIFdvcmQxNiAqb2xkX2RlY29kZXJfbWx0X2NvZWZzLAorICAgICAgICAgICAgIFdvcmQxNiBmcmFtZV9lcnJvcl9mbGFnKQoreworCisKKyAgICBXb3JkMTYgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdOworICAgIFdvcmQxNiAgZGVjb2Rlcl9wb3dlcl9jYXRlZ29yaWVzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CisgICAgV29yZDE2ICBkZWNvZGVyX2NhdGVnb3J5X2JhbGFuY2VzW01BWF9OVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9QT1NTSUJJTElUSUVTLTFdOworICAgIFVXb3JkMTYgY2F0ZWdvcml6YXRpb25fY29udHJvbDsKKyAgICBXb3JkMTYgIGRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbltNQVhfTlVNQkVSX09GX1JFR0lPTlNdOworICAgIFdvcmQxNiAgaTsKKworICAgIFdvcmQxNiAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0czsKKyAgICBXb3JkMTYgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXM7CisgICAgV29yZDE2ICBudW1iZXJfb2ZfY29lZnM7CisgICAgV29yZDE2ICBudW1iZXJfb2ZfdmFsaWRfY29lZnM7CisgICAgCisgICAgCisgICAgdGVzdCgpOworICAgIGlmIChudW1iZXJfb2ZfcmVnaW9ucz09TlVNQkVSX09GX1JFR0lPTlMpCisgICAgeworICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzID0gTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfQklUUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMgPSBOVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9QT1NTSUJJTElUSUVTOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgbnVtYmVyX29mX2NvZWZzID0gRENUX0xFTkdUSDsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIG51bWJlcl9vZl92YWxpZF9jb2VmcyA9IE5VTUJFUl9PRl9WQUxJRF9DT0VGUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMgPSBNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfQklUUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMgPSBNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIG51bWJlcl9vZl9jb2VmcyA9IE1BWF9EQ1RfTEVOR1RIOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgbnVtYmVyX29mX3ZhbGlkX2NvZWZzID0gTUFYX05VTUJFUl9PRl9WQUxJRF9DT0VGUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorCisgICAgdGVzdCgpOworICAgIGlmIChmcmFtZV9lcnJvcl9mbGFnID09IDApIAorICAgIHsKKworICAgICAgICAvKiBjb252ZXJ0IHRoZSBiaXRzIHRvIGFic29sdXRlIHJlZ2lvbiBwb3dlciBpbmRleCBhbmQgZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uICovCisgICAgICAgIAorICAgICAgICBkZWNvZGVfZW52ZWxvcGUoYml0b2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb24sCisJCSAgICAgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCisJCSAgICAgICAgICAgICAgICBwX21hZ19zaGlmdCk7CisKKyAgICAgICAgLyogZmlsbCB0aGUgY2F0ZWdvcml6YXRpb25fY29udHJvbCB3aXRoIE5VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX0JJVFMgKi8KKyAgICAgICAgY2F0ZWdvcml6YXRpb25fY29udHJvbCA9IDA7CisgICAgICAgIGZvciAoaT0wOyBpPG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHM7IGkrKykgCisgICAgICAgIHsKKyAgICAgICAgCWdldF9uZXh0X2JpdChiaXRvYmopOworICAgICAgICAJY2F0ZWdvcml6YXRpb25fY29udHJvbCA9IHNobF9ub2NoZWNrKGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsMSk7CisgICAgICAgIAljYXRlZ29yaXphdGlvbl9jb250cm9sID0gYWRkKGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsYml0b2JqLT5uZXh0X2JpdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCA9IHN1YihiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQsbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0cyk7CisKKyAgICAgICAgLyogb2J0YWluIGRlY29kZXIgcG93ZXIgY2F0ZWdvcmllcyBhbmQgY2F0ZWdvcnkgYmFsYW5jZXMgKi8KKyAgICAgICAgLyogYmFzZWQgb24gdGhlIGFic29sdXRlIHJlZ2lvbiBwb3dlciBpbmRleCAgICAgICAgICAgICAgKi8KKyAgICAgICAgY2F0ZWdvcml6ZShiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQsCisJICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMsCisJICAgICAgICAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKKwkgICAgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCisJICAgICAgICAgICAgICAgZGVjb2Rlcl9wb3dlcl9jYXRlZ29yaWVzLAorCSAgICAgICAgICAgICAgIGRlY29kZXJfY2F0ZWdvcnlfYmFsYW5jZXMpOworCisgICAgICAgIC8qIHBlcmZvcm0gYWRqdXN0bWFlbnRzIHRvIHRoZSBwb3dlciBjYXRlZ29yaWVzIGFuZCBjYXRlZ29yeSBiYWxhbmNlcyBiYXNlZCBvbiB0aGUgY2F0IGNvbnRyb2wgKi8KKyAgICAgICAgcmF0ZV9hZGp1c3RfY2F0ZWdvcmllcyhjYXRlZ29yaXphdGlvbl9jb250cm9sLAorCQkJICAgICAgICAgICAgICAgICAgIGRlY29kZXJfcG93ZXJfY2F0ZWdvcmllcywKKwkJCSAgICAgICAgICAgICAgICAgICBkZWNvZGVyX2NhdGVnb3J5X2JhbGFuY2VzKTsKKworICAgICAgICAvKiBkZWNvZGUgdGhlIHF1YW50aXplZCBiaXRzIGludG8gbWx0IGNvZWZzICovCisgICAgICAgIGRlY29kZV92ZWN0b3JfcXVhbnRpemVkX21sdF9pbmRpY2VzKGJpdG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbiwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9wb3dlcl9jYXRlZ29yaWVzLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX21sdF9jb2Vmcyk7CisKKyAgICAgICAgLyogdGVzdCBmb3IgZnJhbWUgZXJyb3JzICovCisgICAgICAgIHRlc3RfNF9mcmFtZV9lcnJvcnMoYml0b2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lX2Vycm9yX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcml6YXRpb25fY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgpOworICAgIH0KKworICAgIC8qIHBlcmZvcm0gZXJyb3IgaGFuZGxpbmcgb3BlcmF0aW9ucyAqLworICAgIGVycm9yX2hhbmRsaW5nKG51bWJlcl9vZl9jb2VmcywKKyAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfdmFsaWRfY29lZnMsCisgICAgICAgICAgICAgICAgICAgJmZyYW1lX2Vycm9yX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9tbHRfY29lZnMsCisgICAgICAgICAgICAgICAgICAgb2xkX2RlY29kZXJfbWx0X2NvZWZzLAorICAgICAgICAgICAgICAgICAgIHBfbWFnX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgIHBfb2xkX21hZ19zaGlmdCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiAgICBkZWNvZGVfZW52ZWxvcGUKKworIFN5bnRheDogICAgICB2b2lkIGRlY29kZV9lbnZlbG9wZShCaXRfT2JqICpiaXRvYmosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKmRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbiwgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LCAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpwX21hZ19zaGlmdCkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpbnB1dHM6ICAgQml0X09iaiAqYml0b2JqCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bWJlcl9vZl9yZWdpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBvdXRwdXRzOiAgV29yZDE2ICAqZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKnBfbWFnX3NoaWZ0CisgICAgICAgICAgICAgIAorIAorIERlc2NyaXB0aW9uOiBSZWNvdmVyIGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXggZnJvbSBjb2RlIGJpdHMKKworIERlc2lnbiBOb3RlczoKKyAKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAgMC4wNCAgICAgfCAgICAwLjA0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAgMC4wNSAgICAgfCAgICAwLjA1CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCQkJCQorICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgIDMya2JpdCAgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgIDAuMDggICAgIHwgICAgMC4wOCAgICAgICAgfCAgICAgMC4wOCAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgIDAuMTAgICAgIHwgICAgMC4xMCAgICAgICAgfCAgICAgMC4xMCAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisJCQkJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGRlY29kZV9lbnZlbG9wZShCaXRfT2JqICpiaXRvYmosCisgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uLAorCQkgICAgICAgICAgICAgV29yZDE2ICAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAorCQkgICAgICAgICAgICAgV29yZDE2ICAqcF9tYWdfc2hpZnQpCisgICAgIAoreworICAgIFdvcmQxNiByZWdpb247CisgICAgV29yZDE2IGk7CisgICAgV29yZDE2IGluZGV4OworICAgIFdvcmQxNiBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4W01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CisgICAgV29yZDE2IG1heF9pbmRleDsKKyAgICAKKyAgICBXb3JkMTYgdGVtcDsKKyAgICBXb3JkMTYgdGVtcDE7CisgICAgV29yZDE2IHRlbXAyOworICAgIFdvcmQzMiBhY2NhOworCisgICAgaW5kZXggPSAwOworICAgIG1vdmUxNigpOworCisgICAgLyogZ2V0IDUgYml0cyBmcm9tIHRoZSBjdXJyZW50IGNvZGUgd29yZCAqLworICAgIGZvciAoaT0wOyBpPDU7IGkrKykgCisgICAgeworICAgICAgICBnZXRfbmV4dF9iaXQoYml0b2JqKTsKKyAgICAgICAgaW5kZXggPSBzaGxfbm9jaGVjayhpbmRleCwxKTsKKyAgICAgICAgaW5kZXggPSBhZGQoaW5kZXgsYml0b2JqLT5uZXh0X2JpdCk7CisgICAgfQorICAgIGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCA9IHN1YihiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQsNSk7CisKKyAgICAvKiBFU0ZfQURKVVNUTUVOVF9UT19STVNfSU5ERVggY29tcGVuc2F0ZXMgZm9yIHRoZSBjdXJyZW50ICg5LzMwLzk2KQorICAgICAgICBJTUxUIGJlaW5nIHNjYWxlZCB0byBoaWdoIGJ5IHRoZSBuaW50aCBwb3dlciBvZiBzcXJ0KDIpLiAqLworICAgIGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbMF0gPSBzdWIoaW5kZXgsRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYKTsKKyAgICBtb3ZlMTYoKTsKKworICAgIC8qIG9idGFpbiBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4ICovCisgICAgZm9yIChyZWdpb249MTsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykgCisgICAgeworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICBkbyAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0X25leHRfYml0KGJpdG9iaik7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBpZiAoYml0b2JqLT5uZXh0X2JpdCA9PSAwKQorICAgICAgICAgICAgeworCSAgICAgICAgICAgIGluZGV4ID0gZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9kZWNvZGVyX3RyZWVbcmVnaW9uXVtpbmRleF1bMF07CisgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJICAgICAgICAgICAgaW5kZXggPSBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2RlY29kZXJfdHJlZVtyZWdpb25dW2luZGV4XVsxXTsKKyAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCA9IHN1YihiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQsMSk7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgIH0gd2hpbGUgKGluZGV4ID4gMCk7CisgICAgICAgIAorICAgICAgICBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSBuZWdhdGUoaW5kZXgpOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisKKyAgICAvKiBSZWNvbnN0cnVjdCBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbXSBmcm9tIGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbXS4gKi8KKyAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbMF0gPSBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4WzBdOworICAgIG1vdmUxNigpOworICAgIGZvciAocmVnaW9uPTE7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAorICAgIHsKKyAgICAgICAgYWNjYSA9IExfYWRkKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb24tMV0sZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dKTsKKyAgICAgICAgYWNjYSA9IExfYWRkKGFjY2EsRFJQX0RJRkZfTUlOKTsKKyAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSBleHRyYWN0X2woYWNjYSk7ICAgICAgICAKKyAgICB9CisKKyAgICAvKiBSZWNvbnN0cnVjdCBkZWNvZGVyX3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb25bXSBmcm9tIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtdLiAqLworICAgIC8qIERFQlVHISEhISAtIFRoaXMgaW50ZWdlciBtZXRob2Qgam9pbnRseSBjb21wdXRlcyB0aGUgbWFnX3NoaWZ0CisgICAgICAgYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb25zIGFscmVhZHkgbWFnX3NoaWZ0IGNvbXBlbnNhdGVkLiBJdAorICAgICAgIHJlbGllcyBvbiBSRUdJT05fUE9XRVJfU1RFUFNJWkVfREIgYmVpbmcgZXhhY3RseSAzLjAxMDI5OTk1NyBkYgorICAgICAgIG9yIGEgc3F1YXJlIHJvb3Qgb2YgMiBjaG5hZ2UgaW4gc3RhbmRhcmQgZGV2aWF0aW9uLiBJZgorICAgICAgIFJFR0lPTl9QT1dFUl9TVEVQU0laRV9EQiBjaGFuZ2VzLCB0aGlzIHNvZnR3YXJlIG11c3QgYmUKKyAgICAgICByZXdvcmtlZC4gKi8KKworICAgIHRlbXAgPSAwOworICAgIG1vdmUxNigpOworICAgIG1heF9pbmRleCA9IDA7CisgICAgbW92ZTE2KCk7CisgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykgCisgICAgeworICAgICAgICBhY2NhID0gTF9hZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sUkVHSU9OX1BPV0VSX1RBQkxFX05VTV9ORUdBVElWRVMpOworICAgICAgICBpID0gZXh0cmFjdF9sKGFjY2EpOworICAgICAgICAKKyAgICAgICAgdGVtcDEgPSBzdWIoaSxtYXhfaW5kZXgpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmICh0ZW1wMSA+IDApIAorICAgICAgICB7CisgICAgICAgICAgICBtYXhfaW5kZXggPSBpOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCA9IGFkZCh0ZW1wLGludF9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uX3RhYmxlW2ldKTsKKyAgICB9CisgICAgaSA9IDk7CisgICAgbW92ZTE2KCk7CisKKyAgICB0ZW1wMSA9IHN1Yih0ZW1wLDgpOworICAgIHRlbXAyID0gc3ViKG1heF9pbmRleCwyOCk7CisgICAgdGVzdCgpOworICAgIHRlc3QoKTsKKyAgICBsb2dpYzE2KCk7CisgICAgdGVzdCgpOworICAgIGxvZ2ljMTYoKTsKKyAgICB3aGlsZSAoKGkgPj0gMCkgJiYgKCh0ZW1wMSA+PSAwKSB8fCAodGVtcDIgPiAwKSkpIAorICAgIHsKKyAgICAgICAgaSA9IHN1YihpLDEpOworICAgICAgICB0ZW1wID0gc2hyX25vY2hlY2sodGVtcCwxKTsKKyAgICAgICAgbWF4X2luZGV4ID0gc3ViKG1heF9pbmRleCwyKTsKKyAgICAgICAgdGVtcDEgPSBzdWIodGVtcCw4KTsKKyAgICAgICAgdGVtcDIgPSBzdWIobWF4X2luZGV4LDI4KTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGxvZ2ljMTYoKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBsb2dpYzE2KCk7CisgICAgfQorICAgIAorICAgICpwX21hZ19zaGlmdCA9IGk7CisgICAgbW92ZTE2KCk7CisgICAgCisgICAgLyogcG9pbnRlciBhcml0aG1ldGljICovCisgICAgdGVtcCA9IChXb3JkMTYgKShSRUdJT05fUE9XRVJfVEFCTEVfTlVNX05FR0FUSVZFUyArICgqcF9tYWdfc2hpZnQgKiAyKSk7CisgICAgCisgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykgCisgICAgeworICAgICAgICBhY2NhID0gTF9hZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sdGVtcCk7CisgICAgICAgIGkgPSBleHRyYWN0X2woYWNjYSk7CisgICAgICAgIGRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbltyZWdpb25dID0gaW50X3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb25fdGFibGVbaV07CisgICAgICAgIG1vdmUxNigpOworICAgIH0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgICByYXRlX2FkanVzdF9jYXRlZ29yaWVzCisKKyBTeW50YXg6ICAgICAgIHZvaWQgcmF0ZV9hZGp1c3RfY2F0ZWdvcmllcyhXb3JkMTYgY2F0ZWdvcml6YXRpb25fY29udHJvbCwgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmRlY29kZXJfcG93ZXJfY2F0ZWdvcmllcywgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmRlY29kZXJfY2F0ZWdvcnlfYmFsYW5jZXMpICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgaW5wdXRzOiAgICBXb3JkMTYgY2F0ZWdvcml6YXRpb25fY29udHJvbCwgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZGVjb2Rlcl9jYXRlZ29yeV9iYWxhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIG91dHB1dHM6ICAgV29yZDE2IGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZGVjb2Rlcl9wb3dlcl9jYXRlZ29yaWVzLAorIAorIERlc2NyaXB0aW9uOiAgQWRqdXN0IHRoZSBwb3dlciBjYXRlZ29yaWVzIGJhc2VkIG9uIHRoZSBjYXRlZ29yaXphdGlvbiBjb250cm9sCisKKyBEZXNpZ24gTm90ZXM6CisgCisgV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wMCAgICAgIHwgICAgMC4wMAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCisgICAgICAgICAgICBNQVggIHwgICAgMC4wMCAgICAgIHwgICAgMC4wMAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKKwkJCQkKKyAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMDAgICAgICB8ICAgIDAuMDAgICAgICAgIHwgICAgIDAuMDAgICAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTUFYICB8ICAgIDAuMDEgICAgICB8ICAgIDAuMDEgICAgICAgIHwgICAgIDAuMDEgICAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorCQkJCQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCByYXRlX2FkanVzdF9jYXRlZ29yaWVzKFdvcmQxNiBjYXRlZ29yaXphdGlvbl9jb250cm9sLAorCQkJICAgICAgICAgICAgICAgIFdvcmQxNiAqZGVjb2Rlcl9wb3dlcl9jYXRlZ29yaWVzLAorCQkJICAgICAgICAgICAgICAgIFdvcmQxNiAqZGVjb2Rlcl9jYXRlZ29yeV9iYWxhbmNlcykKK3sKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMTYgcmVnaW9uOworICAgIAorICAgIGkgPSAwOworICAgIG1vdmUxNigpOworCisgICAgdGVzdCgpOworICAgIHdoaWxlIChjYXRlZ29yaXphdGlvbl9jb250cm9sID4gMCkgCisgICAgeworICAgICAgICByZWdpb24gPSBkZWNvZGVyX2NhdGVnb3J5X2JhbGFuY2VzW2krK107CisgICAgICAgIG1vdmUxNigpOworICAgICAgICBkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSA9IGFkZChkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSwxKTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wgPSBzdWIoY2F0ZWdvcml6YXRpb25fY29udHJvbCwxKTsKKyAgICB9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiAgICBkZWNvZGVfdmVjdG9yX3F1YW50aXplZF9tbHRfaW5kaWNlcworCisgU3ludGF4OiAgICAgIHZvaWQgZGVjb2RlX3ZlY3Rvcl9xdWFudGl6ZWRfbWx0X2luZGljZXMoQml0X09iaiAgKmJpdG9iaiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRfT2JqICpyYW5kb2JqLCAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgIG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWNvZGVyX3JlZ2lvbl9zdGFuZGFyZF9kZXZpYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMsICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWNvZGVyX21sdF9jb2VmcykgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpbnB1dHM6ICAgIEJpdF9PYmogICpiaXRvYmogICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kX09iaiAqcmFuZG9iagorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgIG51bWJlcl9vZl9yZWdpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgKmRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAgIG91dHB1dHM6ICAgV29yZDE2ICAgKmRlY29kZXJfbWx0X2NvZWZzCisgICAgICAgICAgICAgCisKKyBEZXNjcmlwdGlvbjogRGVjb2RlIE1MVCBjb2VmZmljaWVudHMKKworIERlc2lnbiBOb3RlczoKKyAKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjYwICAgICAgfCAgICAwLjcyCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjY3ICAgICAgfCAgICAwLjc2CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCQkJCQorICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgIDMya2JpdCAgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC43NyAgICAgIHwgICAgMC45OCAgICAgICAgfCAgICAgMS4yOCAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBNQVggIHwgICAgMS4wNSAgICAgIHwgICAgMS4xOCAgICAgICAgfCAgICAgMS4zNiAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisJCQkJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGRlY29kZV92ZWN0b3JfcXVhbnRpemVkX21sdF9pbmRpY2VzKEJpdF9PYmogICpiaXRvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRfT2JqICpyYW5kb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgKmRlY29kZXJfcmVnaW9uX3N0YW5kYXJkX2RldmlhdGlvbiwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgKmRlY29kZXJfcG93ZXJfY2F0ZWdvcmllcywKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgKmRlY29kZXJfbWx0X2NvZWZzKQoreworICAgIFdvcmQxNiBzdGFuZGFyZF9kZXZpYXRpb247CisgICAgV29yZDE2ICpkZWNvZGVyX21sdF9wdHI7CisgICAgV29yZDE2IGRlY29kZXJfbWx0X3ZhbHVlOworICAgIFdvcmQxNiBub2lmaWxscG9zOworICAgIFdvcmQxNiBub2lmaWxsbmVnOworICAgIFdvcmQxNiBub2lzZV9maWxsX2ZhY3RvclszXSA9IHs1NzkzLDgxOTIsMjMxNzB9OworICAgIFdvcmQxNiByZWdpb247CisgICAgV29yZDE2IGNhdGVnb3J5OworICAgIFdvcmQxNiBqLG47CisgICAgV29yZDE2IGtbTUFYX1ZFQ1RPUl9ESU1FTlNJT05dOworICAgIFdvcmQxNiB2ZWNfZGltOworICAgIFdvcmQxNiBudW1fdmVjczsKKyAgICBXb3JkMTYgaW5kZXg7CisgICAgV29yZDE2IGJpdD0wOworICAgIFdvcmQxNiBzaWduc19pbmRleD0wOworICAgIFdvcmQxNiBudW1fc2lnbl9iaXRzOworICAgIFdvcmQxNiByYW5fb3V0X29mX2JpdHNfZmxhZzsKKyAgICBXb3JkMTYgKmRlY29kZXJfdGFibGVfcHRyOworICAgIFdvcmQxNiByYW5kb21fd29yZDsKKyAgICAKKyAgICBXb3JkMTYgdGVtcDE7CisgICAgV29yZDE2IHRlbXA7CisgICAgV29yZDMyIGFjY2E7CisKKyAgICByYW5fb3V0X29mX2JpdHNfZmxhZyA9IDA7CisgICAgbW92ZTE2KCk7CisKKyAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKSAKKyAgICB7CisgICAgICAgIGNhdGVnb3J5ID0gKFdvcmQxNilkZWNvZGVyX3Bvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIGFjY2EgPSBMX211bHQwKHJlZ2lvbixSRUdJT05fU0laRSk7CisgICAgICAgIGluZGV4ID0gZXh0cmFjdF9sKGFjY2EpOworICAgICAgICBkZWNvZGVyX21sdF9wdHIgPSAmZGVjb2Rlcl9tbHRfY29lZnNbaW5kZXhdOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgc3RhbmRhcmRfZGV2aWF0aW9uID0gZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uW3JlZ2lvbl07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgdGVtcCA9IHN1YihjYXRlZ29yeSw3KTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCB0aGUgcHJvcGVyIHRhYmxlIG9mIGRlY29kZXIgdGFibGVzLCB2ZWNfZGltLCBhbmQgbnVtX3ZlY3MgZm9yIHRoZSBjYXQgKi8KKyAgICAgICAgICAgIGRlY29kZXJfdGFibGVfcHRyID0gKFdvcmQxNiAqKSB0YWJsZV9vZl9kZWNvZGVyX3RhYmxlc1tjYXRlZ29yeV07CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIHZlY19kaW0gPSB2ZWN0b3JfZGltZW5zaW9uW2NhdGVnb3J5XTsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgbnVtX3ZlY3MgPSBudW1iZXJfb2ZfdmVjdG9yc1tjYXRlZ29yeV07CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChuPTA7IG48bnVtX3ZlY3M7IG4rKykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIGdldCBpbmRleCAqLworICAgICAgICAgICAgICAgIGRvIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0IDw9IDApIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5fb3V0X29mX2JpdHNfZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkgICAgICAgICAgICB9CisgICAgCisgICAgCSAgICAgICAgICAgIGdldF9uZXh0X2JpdChiaXRvYmopOworCSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYml0b2JqLT5uZXh0X2JpdCA9PSAwKQorCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc2hsX25vY2hlY2soaW5kZXgsMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChXb3JkMTYpKihkZWNvZGVyX3RhYmxlX3B0ciArIHRlbXApOworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgZWxzZQorCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc2hsX25vY2hlY2soaW5kZXgsMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChXb3JkMTYpKihkZWNvZGVyX3RhYmxlX3B0ciArIHRlbXAgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgIGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCA9IHN1YihiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQsMSk7CisgICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKKwkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChpbmRleCA+IDApOworCSAgCisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmIChyYW5fb3V0X29mX2JpdHNfZmxhZyAhPSAwKQorCSAgICAgICAgICAgICAgICBicmVhazsKKwkgIAorICAgICAgICAgICAgICAgIGluZGV4ID0gbmVnYXRlKGluZGV4KTsKKwkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBjb252ZXJ0IGluZGV4IGludG8gYXJyYXkgdXNlZCB0byBhY2Nlc3MgdGhlIGNlbnRyb2lkIHRhYmxlICovCisgICAgICAgICAgICAgICAgLyogZ2V0IHRoZSBudW1iZXIgb2Ygc2lnbiBiaXRzIGluIHRoZSBpbmRleCAqLworICAgICAgICAgICAgICAgIG51bV9zaWduX2JpdHMgPSBpbmRleF90b19hcnJheShpbmRleCxrLGNhdGVnb3J5KTsKKworCSAgICAgICAgICAgIHRlbXAgPSBzdWIoYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0LG51bV9zaWduX2JpdHMpOworICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA+PSAwKSAKKyAgICAgICAgICAgICAgICB7CisKKwkgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVtX3NpZ25fYml0cyAhPSAwKSAKKyAgICAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgc2lnbnNfaW5kZXggPSAwOworCSAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajxudW1fc2lnbl9iaXRzOyBqKyspIAorICAgICAgICAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgIGdldF9uZXh0X2JpdChiaXRvYmopOworICAgICAgIAkJICAgICAgICAgICAgICAgIHNpZ25zX2luZGV4ID0gc2hsX25vY2hlY2soc2lnbnNfaW5kZXgsMSk7CisJCSAgICAgICAgICAgICAgICAgICAgc2lnbnNfaW5kZXggPSBhZGQoc2lnbnNfaW5kZXgsYml0b2JqLT5uZXh0X2JpdCk7CisJCSAgICAgICAgICAgICAgICAgICAgYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0ID0gc3ViKGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCwxKTsKKwkgICAgICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIobnVtX3NpZ25fYml0cywxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA9IHNobF9ub2NoZWNrKDEsKHRlbXApKTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8dmVjX2RpbTsgaisrKSAKKyAgICAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgYWNjYSA9IExfbXVsdDAoc3RhbmRhcmRfZGV2aWF0aW9uLG1sdF9xdWFudF9jZW50cm9pZFtjYXRlZ29yeV1ba1tqXV0pOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxMik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX21sdF92YWx1ZSA9IGV4dHJhY3RfbChhY2NhKTsKKwkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJfbWx0X3ZhbHVlICE9IDApIAorICAgICAgICAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ25zX2luZGV4ICYgYml0KSA9PSAwKQorCQkgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX21sdF92YWx1ZSA9IG5lZ2F0ZShkZWNvZGVyX21sdF92YWx1ZSk7CisJCSAgICAgICAgICAgICAgICAgICAgYml0ID0gc2hyX25vY2hlY2soYml0LDEpOworCSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKmRlY29kZXJfbWx0X3B0cisrID0gZGVjb2Rlcl9tbHRfdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgcmFuX291dF9vZl9iaXRzX2ZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKwkgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgcmFuIG91dCBvZiBiaXRzIGR1cmluZyBkZWNvZGluZyBkbyBub2lzZSBmaWxsIGZvciByZW1haW5pbmcgcmVnaW9ucy4gKi8KKyAgICAgICAgICAgIC8qIERFQlVHISEgLSBGb3Igbm93IGFsc28gcmVkbyBhbGwgb2YgbGFzdCByZWdpb24gd2l0aCBhbGwgbm9pc2UgZmlsbC4gKi8KKyAgICAgICAgCXRlc3QoKTsKKyAgICAgICAgICAgIGlmIChyYW5fb3V0X29mX2JpdHNfZmxhZyAhPSAwKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICB0ZW1wID0gYWRkKHJlZ2lvbiwxKTsKKyAgICAgICAgICAgICAgICBmb3IgKGo9dGVtcDsgajxudW1iZXJfb2ZfcmVnaW9uczsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9wb3dlcl9jYXRlZ29yaWVzW2pdID0gNzsKKyAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgIGNhdGVnb3J5ID0gNzsKKyAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCSAgICBkZWNvZGVyX21sdF9wdHIgPSAmZGVjb2Rlcl9tbHRfY29lZnNbcmVnaW9uKlJFR0lPTl9TSVpFXTsKKyAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCX0KKyAgICAgICAgfQorCisgICAgICAgIHRlbXAgPSBzdWIoY2F0ZWdvcnksNSk7CisgICAgICAgIHRlbXAxID0gc3ViKGNhdGVnb3J5LDYpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgbG9naWMxNigpOworICAgICAgICBpZiAoKHRlbXAgPT0gMCkgfHwgKHRlbXAxID09IDApKQorICAgICAgICB7CisgCisJICAgICAgICBkZWNvZGVyX21sdF9wdHIgPSAmZGVjb2Rlcl9tbHRfY29lZnNbcmVnaW9uKlJFR0lPTl9TSVpFXTsKKwkgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgbm9pZmlsbHBvcyA9IG11bHQoc3RhbmRhcmRfZGV2aWF0aW9uLG5vaXNlX2ZpbGxfZmFjdG9yW2NhdGVnb3J5IC0gNV0pOworICAgICAgICAgICAgbm9pZmlsbG5lZyA9IG5lZ2F0ZShub2lmaWxscG9zKTsKKworCSAgICAgICAgcmFuZG9tX3dvcmQgPSBnZXRfcmFuZChyYW5kb2JqKTsKKworCSAgICAgICAgZm9yIChqPTA7IGo8MTA7IGorKykgCisgICAgICAgICAgICB7CisJICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICgqZGVjb2Rlcl9tbHRfcHRyID09IDApIAorICAgICAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgbG9naWMxNigpOworICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocmFuZG9tX3dvcmQgJiAxKSA9PSAwKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBub2lmaWxsbmVnOworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IG5vaWZpbGxwb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICAqZGVjb2Rlcl9tbHRfcHRyID0gdGVtcDE7CisgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOworCSAgICAgICAgICAgICAgICByYW5kb21fd29yZCA9IHNocl9ub2NoZWNrKHJhbmRvbV93b3JkLDEpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAvKiBwb2ludGVyIGFyaXRobWV0aWMgKi8KKyAgICAgICAgICAgICAgICBkZWNvZGVyX21sdF9wdHIrKzsKKwkgICAgICAgIH0KKwkgICAgICAgIHJhbmRvbV93b3JkID0gZ2V0X3JhbmQocmFuZG9iaik7CisJICAgICAgICBmb3IgKGo9MDsgajwxMDsgaisrKSAKKyAgICAgICAgICAgIHsKKwkgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgaWYgKCpkZWNvZGVyX21sdF9wdHIgPT0gMCkgCisgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBsb2dpYzE2KCk7CisgICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyYW5kb21fd29yZCAmIDEpID09IDApIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IG5vaWZpbGxuZWc7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gbm9pZmlsbHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgICpkZWNvZGVyX21sdF9wdHIgPSB0ZW1wMTsKKyAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisJICAgICAgICAgICAgICAgIHJhbmRvbV93b3JkICA9IHNocl9ub2NoZWNrKHJhbmRvbV93b3JkLDEpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAvKiBwb2ludGVyIGFyaXRobWV0aWMgKi8KKyAgICAgICAgICAgICAgICBkZWNvZGVyX21sdF9wdHIrKzsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIChjYXRlZ29yeSA9PSA3KSAqLworICAgICAgICB0ZW1wMSA9IHN1YihjYXRlZ29yeSw3KTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcDEgPT0gMCkKKyAgICAgICAgeworCSAgICAgICAgaW5kZXggPSBzdWIoY2F0ZWdvcnksNSk7CisgICAgICAgICAgICBub2lmaWxscG9zID0gbXVsdChzdGFuZGFyZF9kZXZpYXRpb24sbm9pc2VfZmlsbF9mYWN0b3JbaW5kZXhdKTsKKwkgICAgICAgIG5vaWZpbGxuZWcgPSBuZWdhdGUobm9pZmlsbHBvcyk7CisKKyAgICAgICAgICAgIHJhbmRvbV93b3JkID0gZ2V0X3JhbmQocmFuZG9iaik7CisgICAgICAgICAgICBmb3IgKGo9MDsgajwxMDsgaisrKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dpYzE2KCk7CisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICgocmFuZG9tX3dvcmQgJiAxKSA9PSAwKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gbm9pZmlsbG5lZzsKKyAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gbm9pZmlsbHBvczsKKyAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpkZWNvZGVyX21sdF9wdHIrKyA9IHRlbXAxOworICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgICAgIHJhbmRvbV93b3JkID0gc2hyX25vY2hlY2socmFuZG9tX3dvcmQsMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYW5kb21fd29yZCA9IGdldF9yYW5kKHJhbmRvYmopOworICAgICAgICAgICAgZm9yIChqPTA7IGo8MTA7IGorKykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9naWMxNigpOworICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJhbmRvbV93b3JkICYgMSkgPT0gMCkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IG5vaWZpbGxuZWc7CisgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IG5vaWZpbGxwb3M7CisgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAqZGVjb2Rlcl9tbHRfcHRyKysgPSB0ZW1wMTsKKyAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgICAgICByYW5kb21fd29yZCA9IHNocl9ub2NoZWNrKHJhbmRvbV93b3JkLDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdGVzdCgpOworICAgIGlmIChyYW5fb3V0X29mX2JpdHNfZmxhZykKKyAgICAgICAgYml0b2JqLT5udW1iZXJfb2ZfYml0c19sZWZ0ID0gc3ViKGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdCwxKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGluZGV4X3RvX2FycmF5IAorCisgU3ludGF4OiAgICAgIG51bWJlcl9vZl9ub25femVybyA9IGluZGV4X3RvX2FycmF5KFdvcmQxNiBpbmRleCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhcnJheVtNQVhfVkVDVE9SX0RJTUVOU0lPTl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjYXRlZ29yeSkKKworICAgICAgICAgICAgICAgIGlucHV0czogIFdvcmQxNiBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvdXRwdXRzOiBXb3JkMTYgYXJyYXlbTUFYX1ZFQ1RPUl9ESU1FTlNJT05dIC0gdXNlZCBpbiBkZWNvZGVyIHRvIGFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sdF9xdWFudF9jZW50cm9pZCB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9ub25femVybyAgICAgICAgICAtIG51bWJlciBvZiBub24gemVybyBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBhcnJheQorIAorIERlc2NyaXB0aW9uOiBDb21wdXRlcyBhbiBhcnJheSBvZiBzaWduIGJpdHMgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZSBjYXRlZ29yeSB2ZWN0b3IKKyAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNpZ24gYml0cyBhbmQgdGhlIGFycmF5CisKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAgMC4wMCAgICAgfCAgICAgMC4wMAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCisgICAgICAgICAgICBNQVggIHwgICAgIDAuMDAgICAgIHwgICAgIDAuMDAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCisKKyAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgICAwLjAwICAgICB8ICAgICAwLjAwICAgICAgIHwgICAgICAwLjAwICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAgMC4wMCAgICAgfCAgICAgMC4wMCAgICAgICB8ICAgICAgMC4wMCAgIAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgaW5kZXhfdG9fYXJyYXkoV29yZDE2IGluZGV4LFdvcmQxNiAqYXJyYXksV29yZDE2IGNhdGVnb3J5KQoreworICAgIFdvcmQxNiBqLHEscDsKKyAgICBXb3JkMTYgbnVtYmVyX29mX25vbl96ZXJvOworICAgIFdvcmQxNiBtYXhfYmluX3BsdXNfb25lOworICAgIFdvcmQxNiBpbnZlcnNlX29mX21heF9iaW5fcGx1c19vbmU7CisgICAgV29yZDE2IHRlbXA7CisKKyAgICBudW1iZXJfb2Zfbm9uX3plcm8gPSAwOworICAgIG1vdmUxNigpOworCisgICAgcCA9IGluZGV4OworICAgIG1vdmUxNigpOworCisgICAgbWF4X2Jpbl9wbHVzX29uZSA9IGFkZChtYXhfYmluW2NhdGVnb3J5XSwxKTsKKyAgICBpbnZlcnNlX29mX21heF9iaW5fcGx1c19vbmUgPSBtYXhfYmluX3BsdXNfb25lX2ludmVyc2VbY2F0ZWdvcnldOworICAgIG1vdmUxNigpOworCisgICAgdGVtcCA9IHN1Yih2ZWN0b3JfZGltZW5zaW9uW2NhdGVnb3J5XSwxKTsKKyAgICBmb3IgKGo9dGVtcDsgaj49MDsgai0tKSAKKyAgICB7CisgICAgICAgIHEgPSBtdWx0KHAsaW52ZXJzZV9vZl9tYXhfYmluX3BsdXNfb25lKTsKKwkJdGVtcCA9IGV4dHJhY3RfbChMX211bHQwKHEsbWF4X2Jpbl9wbHVzX29uZSkpOworICAgICAgICBhcnJheVtqXSA9IHN1YihwLHRlbXApOworICAgICAgICBtb3ZlMTYoKTsKKworICAgICAgICBwID0gcTsKKyAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgdGVtcCA9IGFycmF5W2pdOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcCAhPSAwKSAKKyAgICAgICAgICAgIG51bWJlcl9vZl9ub25femVybyA9IGFkZChudW1iZXJfb2Zfbm9uX3plcm8sMSk7CisgICAgfQorICAgIHJldHVybihudW1iZXJfb2Zfbm9uX3plcm8pOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiAgICAgdGVzdF80X2ZyYW1lX2Vycm9ycworCisgU3ludGF4OiAgICAgICB2b2lkIHRlc3RfNF9mcmFtZV9lcnJvcnMoQml0X09iaiAqYml0b2JqLCAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmZyYW1lX2Vycm9yX2ZsYWcsICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjYXRlZ29yaXphdGlvbl9jb250cm9sLCAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCkgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgaW5wdXRzOiAgIGJpdF9vYmoKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9lcnJvcl9mbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcml6YXRpb25fY29udHJvbAorICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleAorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIG91dHB1dHM6ICBmcmFtZV9lcnJvcl9mbGFnCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIAorIERlc2NyaXB0aW9uOiAgVGVzdHMgZm9yIGVycm9yIGNvbmRpdGlvbnMgYW5kIHNldHMgdGhlIGZyYW1lX2Vycm9yX2ZsYWcgYWNjb3JkaW5nbHkgCisKKyBEZXNpZ24gTm90ZXM6CisgCisgV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wMSAgICAgIHwgICAgIDAuMDEKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuMDQgICAgICB8ICAgICAwLjA4CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCQkJCQorICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgIDMya2JpdCAgICAgIHwgICAgIDQ4a2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wMSAgICAgIHwgICAgIDAuMDEgICAgICAgfCAgICAgIDAuMDEgICAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTUFYICB8ICAgIDAuMDIgICAgICB8ICAgICAwLjA2ICAgICAgIHwgICAgICAwLjA4ICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKwkJCQkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGVzdF80X2ZyYW1lX2Vycm9ycyhCaXRfT2JqICpiaXRvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZnJhbWVfZXJyb3JfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2F0ZWdvcml6YXRpb25fY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCkKK3sKKyAgICBXb3JkMTYgcmVnaW9uOworICAgIFdvcmQxNiBpOworICAgIFdvcmQxNiB0ZW1wOworICAgIFdvcmQzMiBhY2NhOworICAgIFdvcmQzMiBhY2NiOworICAgIAorICAgIC8qIFRlc3QgZm9yIGJpdCBzdHJlYW0gZXJyb3JzLiAqLworCisgICAgdGVzdCgpOworICAgIGlmIChiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQgPiAwKSAKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPGJpdG9iai0+bnVtYmVyX29mX2JpdHNfbGVmdDsgaSsrKSAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0X25leHRfYml0KGJpdG9iaik7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBpZiAoYml0b2JqLT5uZXh0X2JpdCA9PSAwKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqZnJhbWVfZXJyb3JfZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0JCisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICB0ZW1wID0gc3ViKGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsc3ViKG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsMSkpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmICh0ZW1wIDwgMCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIGlmIChiaXRvYmotPm51bWJlcl9vZl9iaXRzX2xlZnQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpmcmFtZV9lcnJvcl9mbGFnIHw9IDI7CisgICAgICAgICAgICAgICAgbG9naWMxNigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2tzIHRvIGVuc3VyZSB0aGF0IGFic19yZWdpb25fcG93ZXJfaW5kZXggaXMgd2l0aGluIHJhbmdlICovCisgICAgLyogdGhlIGVycm9yIGZsYWcgaXMgc2V0IGlmIGl0IGlzIG91dCBvZiByYW5nZSAqLworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspIAorICAgIHsKKyAgICAgICAgLyogIHRoZSBuZXh0IHR3byBsaW5lcyBvZiBjb21tZW50cyB3ZXJlIG1vZGlmaWVkIGluIHJlbGVhc2UgMS4yCisJICAgKiAgdG8gY29ycmVjdCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJhbmdlIG9mIAorCSAgICogIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtdIHRvIGJlIHRlc3RlZCBpbiB0aGUgbmV4dAorCSAgICogIDkgbGluZXMgb2YgY29kZS4KKwkgICAqLworCSAgLyogIGlmICgoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPiAzMSkgfHwKKyAgICAgICAgICAgIChhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA8IC04KSAqLworCisgICAgICAgIGFjY2EgPSBMX2FkZChhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSxFU0ZfQURKVVNUTUVOVF9UT19STVNfSU5ERVgpOworICAgICAgICBhY2NiID0gTF9zdWIoYWNjYSwzMSk7CisgICAgICAgIGFjY2EgPSBMX2FkZChhY2NhLDgpOworICAgICAgICB0ZXN0KCk7CisKKyAgICAgICAgLyogdGhlIG5leHQgbGluZSB3YXMgbW9kaWZlZCBpbiByZWxlYXNlIDEuMiB0bworCSAgICogY29ycmVjdCBtaXNzIHR5cGVkIGNvZGUgYW5kIGVycm9yIGNoZWNraW5nLgorCSAgICovCisgICAgICAgIGlmICgoYWNjYiA+IDApIHx8IChhY2NhIDwgMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmcmFtZV9lcnJvcl9mbGFnIHw9IDQ7CisgICAgICAgICAgICBsb2dpYzE2KCk7CisgICAgICAgIH0KKyAgICB9CisKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgZXJyb3JfaGFuZGxpbmcKKworIFN5bnRheDogICAgICB2b2lkIGVycm9yX2hhbmRsaW5nKFdvcmQxNiBudW1iZXJfb2ZfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl92YWxpZF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmZyYW1lX2Vycm9yX2ZsYWcsICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmRlY29kZXJfbWx0X2NvZWZzLCAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm9sZF9kZWNvZGVyX21sdF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfbWFnX3NoaWZ0LCAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfb2xkX21hZ19zaGlmdCkgICAgICAKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlucHV0czogIG51bWJlcl9vZl9jb2VmcworICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfdmFsaWRfY29lZnMKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZXJyb3JfZmxhZworICAgICAgICAgICAgICAgICAgICAgICBvbGRfZGVjb2Rlcl9tbHRfY29lZnMKKyAgICAgICAgICAgICAgICAgICAgICAgcF9vbGRfbWFnX3NoaWZ0CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgb3V0cHV0czogZGVjb2Rlcl9tbHRfY29lZnMKKyAgICAgICAgICAgICAgICAgICAgICAgb2xkX2RlY29kZXJfbWx0X2NvZWZzCisgICAgICAgICAgICAgICAgICAgICAgIHBfbWFnX3NoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgIHBfb2xkX21hZ19zaGlmdAorIAorICAgICAgIAorCisgRGVzY3JpcHRpb246IElmIGJvdGggdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIGZyYW1lcyBhcmUgZXJyb3JlZCwgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHNldCB0aGUgbWx0IGNvZWZmaWNpZW50cyB0byAwLiBJZiBvbmx5IHRoZSBjdXJyZW50IGZyYW1lICAgICAgICAgCisgICAgICAgICAgICAgIGlzIGVycm9yZWQsIHRoZW4gcmVwZWF0IHRoZSBwcmV2aW91cyBmcmFtZSdzIG1sdCBjb2VmZmljaWVudHMuICAgCisgICAgCisgRGVzaWduIE5vdGVzOgorIAorIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgIDMya2JpdAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMDIgICAgICB8ICAgICAwLjAyCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjAzICAgICAgfCAgICAgMC4wMworICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKKwkJCQkKKyAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMDMgICAgICB8ICAgICAwLjAzICAgICAgIHwgICAgIDAuMDMgICAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTUFYICB8ICAgIDAuMDMgICAgICB8ICAgICAwLjAzICAgICAgIHwgICAgIDAuMDYgICAKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorCQkJCQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBlcnJvcl9oYW5kbGluZyhXb3JkMTYgbnVtYmVyX29mX2NvZWZzLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3ZhbGlkX2NvZWZzLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmZyYW1lX2Vycm9yX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZGVjb2Rlcl9tbHRfY29lZnMsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqb2xkX2RlY29kZXJfbWx0X2NvZWZzLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfbWFnX3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfb2xkX21hZ19zaGlmdCkKK3sKKyAgICBXb3JkMTYgaTsKKworICAgIHRlc3QoKTsKKyAgICBpZiAoKmZyYW1lX2Vycm9yX2ZsYWcgIT0gMCkgCisgICAgeworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfdmFsaWRfY29lZnM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGVjb2Rlcl9tbHRfY29lZnNbaV0gPSBvbGRfZGVjb2Rlcl9tbHRfY29lZnNbaV07CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfdmFsaWRfY29lZnM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgb2xkX2RlY29kZXJfbWx0X2NvZWZzW2ldID0gMDsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAqcF9tYWdfc2hpZnQgPSAqcF9vbGRfbWFnX3NoaWZ0OworICAgICAgICBtb3ZlMTYoKTsKKworICAgICAgICAqcF9vbGRfbWFnX3NoaWZ0ID0gMDsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICAvKiBTdG9yZSBpbiBjYXNlIG5leHQgZnJhbWUgaXMgZXJyb3JlZC4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl92YWxpZF9jb2VmczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBvbGRfZGVjb2Rlcl9tbHRfY29lZnNbaV0gPSBkZWNvZGVyX21sdF9jb2Vmc1tpXTsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgIAorICAgICAgICAqcF9vbGRfbWFnX3NoaWZ0ID0gKnBfbWFnX3NoaWZ0OworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisKKworICAgIC8qIFplcm8gb3V0IHRoZSB1cHBlciAxLzggb2YgdGhlIHNwZWN0cnVtLiAqLworICAgIGZvciAoaSA9IG51bWJlcl9vZl92YWxpZF9jb2VmczsgaSA8IG51bWJlcl9vZl9jb2VmczsgaSsrKQorICAgIHsKKyAgICAgICAgZGVjb2Rlcl9tbHRfY29lZnNbaV0gPSAwOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGdldF9uZXh0X2JpdAorCisgU3ludGF4OiAgICAgIHZvaWQgZ2V0X25leHRfYml0KEJpdF9PYmogKmJpdG9iaikKKyAKKyBEZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgbmV4dCBiaXQgaW4gdGhlIGN1cnJlbnQgd29yZCBpbnNpZGUgdGhlIGJpdCBvYmplY3QKKyAKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0ICAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwICAgICAgICB8ICAgICAwLjAwICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwICAgICAgICB8ICAgICAwLjAwICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ2V0X25leHRfYml0KEJpdF9PYmogKmJpdG9iaikKK3sKKyAgICBXb3JkMTYgdGVtcDsKKworICAgIHRlc3QoKTsKKyAgICBpZiAoYml0b2JqLT5jb2RlX2JpdF9jb3VudCA9PSAwKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgYml0b2JqLT5jdXJyZW50X3dvcmQgPSAqYml0b2JqLT5jb2RlX3dvcmRfcHRyKys7IAorICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgYml0b2JqLT5jb2RlX2JpdF9jb3VudCA9IDE2OyAgICAgICAgICAgCisgICAgICAgIG1vdmUxNigpOworICAgIH0KKyAgICBiaXRvYmotPmNvZGVfYml0X2NvdW50ID0gc3ViKGJpdG9iai0+Y29kZV9iaXRfY291bnQsMSk7CisgICAgdGVtcCA9IHNocl9ub2NoZWNrKGJpdG9iai0+Y3VycmVudF93b3JkLGJpdG9iai0+Y29kZV9iaXRfY291bnQpOworICAgIGxvZ2ljMTYoKTsKKyAgICBiaXRvYmotPm5leHRfYml0ID0gKFdvcmQxNiApKHRlbXAgJiAxKTsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgZ2V0X3JhbmQKKworIFN5bnRheDogICAgICBXb3JkMTYgZ2V0X3JhbmQoUmFuZF9PYmogKnJhbmRvYmopCisgCisgRGVzY3JpcHRpb246IFJldHVybnMgYSByYW5kb20gV29yZDE2IGJhc2VkIG9uIHRoZSBzZWVkcyBpbnNpZGUgdGhlIHJhbmQgb2JqZWN0ICAKKyAKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgMzJrYml0ICAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwICAgICAgICB8ICAgICAwLjAwICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjAwICAgICAgfCAgICAwLjAwICAgICAgICB8ICAgICAwLjAwICAgCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBnZXRfcmFuZChSYW5kX09iaiAqcmFuZG9iaikKK3sKKyAgICBXb3JkMTYgcmFuZG9tX3dvcmQ7CisgICAgV29yZDMyIGFjY2E7CisKKyAgICBhY2NhID0gTF9hZGQocmFuZG9iai0+c2VlZDAscmFuZG9iai0+c2VlZDMpOyAKKyAgICByYW5kb21fd29yZCA9IGV4dHJhY3RfbChhY2NhKTsKKyAgICAKKyAgICBsb2dpYzE2KCk7CisgICAgdGVzdCgpOworCWlmICgocmFuZG9tX3dvcmQgJiAzMjc2OEwpICE9IDApCisgICAgICAgIHJhbmRvbV93b3JkID0gYWRkKHJhbmRvbV93b3JkLDEpOworICAgIAorICAgIHJhbmRvYmotPnNlZWQzID0gcmFuZG9iai0+c2VlZDI7CisgICAgbW92ZTE2KCk7CisgICAgcmFuZG9iai0+c2VlZDIgPSByYW5kb2JqLT5zZWVkMTsKKyAgICBtb3ZlMTYoKTsKKyAgICByYW5kb2JqLT5zZWVkMSA9IHJhbmRvYmotPnNlZWQwOworICAgIG1vdmUxNigpOworICAgIHJhbmRvYmotPnNlZWQwID0gcmFuZG9tX3dvcmQ7CisgICAgbW92ZTE2KCk7CisKKyAgICByZXR1cm4ocmFuZG9tX3dvcmQpOworfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvOTgvOTg4OGRiZjU0YTUxNWQ5ZmRiOWQ3NGJkODk2MzM2Mzk3YjgwZWJhZi5zdm4tYmFzZSBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzk4Lzk4ODhkYmY1NGE1MTVkOWZkYjlkNzRiZDg5NjMzNjM5N2I4MGViYWYuc3ZuLWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4YzFiZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzk4Lzk4ODhkYmY1NGE1MTVkOWZkYjlkNzRiZDg5NjMzNjM5N2I4MGViYWYuc3ZuLWJhc2UKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uLy4uL3BvcnRhdWRpby9zcmMvaG9zdGFwaS9jb3JlYXVkaW8vcGFfbWFjX2NvcmVfdXRpbGl0aWVzLmMiCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85ODk4ZjU1N2VjMjk2MDExM2ViOGVmMmVkMWFjZTQzOTk4ZGQyODU4LnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvOTgvOTg5OGY1NTdlYzI5NjAxMTNlYjhlZjJlZDFhY2U0Mzk5OGRkMjg1OC5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzdiMTRhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvOTgvOTg5OGY1NTdlYzI5NjAxMTNlYjhlZjJlZDFhY2U0Mzk5OGRkMjg1OC5zdm4tYmFzZQpAQCAtMCwwICsxLDI5NSBAQAorLyogJElkJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZGVmaW5lIFRISVNfRklMRSAgICJvc190aW1lc3RhbXBfd2luMzIuYyIKKworCisjaWYgMQorIyAgIGRlZmluZSBUUkFDRV8oeCkJICAgIFBKX0xPRygzLHgpCisjZWxzZQorIyAgIGRlZmluZSBUUkFDRV8oeCkJICAgIDsKKyNlbmRpZgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZiBkZWZpbmVkKFBKX1RJTUVTVEFNUF9VU0VfUkRUU0MpICYmIFBKX1RJTUVTVEFNUF9VU0VfUkRUU0MhPTAgJiYgXAorICAgIGRlZmluZWQoUEpfTV9JMzg2KSAmJiBQSl9NX0kzODYgIT0gMCAmJiBcCisgICAgZGVmaW5lZChQSl9IQVNfUEVOVElVTSkgJiYgUEpfSEFTX1BFTlRJVU0hPTAgJiYgXAorICAgIGRlZmluZWQoX01TQ19WRVIpCisKKy8qCisgKiBVc2UgcmR0c2MgdG8gZ2V0IHRoZSBPUyB0aW1lc3RhbXAuCisgKi8KK3N0YXRpYyBMT05HIENwdU1oejsKK3N0YXRpYyBwal9pbnQ2NF90IENwdUh6OworIAorc3RhdGljIHBqX3N0YXR1c190IEdldENwdUh6KHZvaWQpCit7CisgICAgSEtFWSBrZXk7CisgICAgTE9ORyByYzsKKyAgICBEV09SRCBzaXplOworCisjaWYgZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgJiYgUEpfV0lOMzJfV0lOQ0UhPTAKKyAgICByYyA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsCisJCSAgICAgIEwiSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTeXN0ZW1cXENlbnRyYWxQcm9jZXNzb3JcXDAiLAorCQkgICAgICAwLCAwLCAma2V5KTsKKyNlbHNlCisgICAgcmMgPSBSZWdPcGVuS2V5KCBIS0VZX0xPQ0FMX01BQ0hJTkUsCisJCSAgICAgIkhBUkRXQVJFXFxERVNDUklQVElPTlxcU3lzdGVtXFxDZW50cmFsUHJvY2Vzc29yXFwwIiwKKwkJICAgICAma2V5KTsKKyNlbmRpZgorCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisKKyAgICBzaXplID0gc2l6ZW9mKENwdU1oeik7CisgICAgcmMgPSBSZWdRdWVyeVZhbHVlRXgoa2V5LCAifk1IeiIsIE5VTEwsIE5VTEwsIChCWVRFKikmQ3B1TWh6LCAmc2l6ZSk7CisgICAgUmVnQ2xvc2VLZXkoa2V5KTsKKworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKSB7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisgICAgfQorCisgICAgQ3B1SHogPSBDcHVNaHo7CisgICAgQ3B1SHogPSBDcHVIeiAqIDEwMDAwMDA7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogX19pbnQ2NCBpcyBuaWNlbHkgcmV0dXJuZWQgaW4gRURYOkVBWCAqLworX19kZWNsc3BlYyhuYWtlZCkgX19pbnQ2NCByZHRzYygpIAoreworICAgIF9fYXNtIAorICAgIHsKKwlSRFRTQworCVJFVAorICAgIH0KK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdHMpCit7CisgICAgdHMtPnU2NCA9IHJkdHNjKCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKHBqX3RpbWVzdGFtcCAqZnJlcSkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoQ3B1SHogPT0gMCkgeworCXN0YXR1cyA9IEdldENwdUh6KCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGZyZXEtPnU2NCA9IENwdUh6OworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZWxpZiBkZWZpbmVkKFBKX1RJTUVTVEFNUF9XSU4zMl9VU0VfU0FGRV9RUEMpICYmIFwKKyAgICAgICAgIFBKX1RJTUVTVEFNUF9XSU4zMl9VU0VfU0FGRV9RUEMhPTAKKworLyogVXNlIHNhZmUgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIuCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBzb21lIHByb3RlY3Rpb24gYWdhaW5zdCBidWcgaW4gS0IgUTI3NDMyMzoKKyAqICAgUGVyZm9ybWFuY2UgY291bnRlciB2YWx1ZSBtYXkgdW5leHBlY3RlZGx5IGxlYXAgZm9yd2FyZAorICogICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPUtCO0VOLVVTO1EyNzQzMjMKKyAqCisgKiBUSElTIFNIT1VMRCBOT1QgQkUgVVNFRCBZRVQgQVMgSVQgRE9FU04nVCBIQU5ETEUgU1lTVEVNIFRJTUUKKyAqIENIQU5HRS4KKyAqLworCitzdGF0aWMgcGpfdGltZXN0YW1wIGdfdHNfZnJlcTsKK3N0YXRpYyBwal90aW1lc3RhbXAgZ190c19iYXNlOworc3RhdGljIHBqX2ludDY0X3QgICBnX3RpbWVfYmFzZTsKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdHMpCit7CisgICAgZW51bSB7IE1BWF9SRVRSWSA9IDEwIH07CisgICAgdW5zaWduZWQgaTsKKworCisgICAgLyogcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZS4KKyAgICAgKiBUaGlzIGlzIGRvbmUgd2hlbiBhcHBsaWNhdGlvbiBjYWxsZWQgcGpfaW5pdCgpLgorICAgICAqLworICAgIHBqX2Fzc2VydChnX3RzX2ZyZXEudTY0ICE9IDApOworCisgICAgLyogUmV0cnkgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKSB1bnRpbCB3ZSdyZSBzdXJlIHRoYXQgdGhlCisgICAgICogdmFsdWUgcmV0dXJuZWQgbWFrZXMgc2Vuc2UuCisgICAgICovCisgICAgaSA9IDA7CisgICAgZG8geworCUxBUkdFX0lOVEVHRVIgdmFsOworCXBqX2ludDY0X3QgY291bnRlcjY0LCB0aW1lNjQsIGRpZmY7CisJcGpfdGltZV92YWwgdGltZV9ub3c7CisKKwkvKiBSZXRyaWV2ZSB0aGUgY291bnRlciAqLworCWlmICghUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnZhbCkpCisJICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisJLyogUmVnYXJkbGVzcyBvZiB0aGUgZ29vZG5lc3Mgb2YgdGhlIHZhbHVlLCB3ZSBzaG91bGQgcHV0CisJICogdGhlIGNvdW50ZXIgaGVyZSwgYmVjYXVzZSBub3JtYWxseSBhcHBsaWNhdGlvbiB3b3VsZG4ndAorCSAqIGNoZWNrIHRoZSBlcnJvciByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwl0cy0+dTY0ID0gdmFsLlF1YWRQYXJ0OworCisJLyogUmV0cmlldmUgdGltZSAqLworCXBqX2dldHRpbWVvZmRheSgmdGltZV9ub3cpOworCisJLyogR2V0IHRoZSBjb3VudGVyIGVsYXBzZWQgdGltZSBpbiBtaWxpc2Vjb25kcyAqLworCWNvdW50ZXI2NCA9ICh2YWwuUXVhZFBhcnQgLSBnX3RzX2Jhc2UudTY0KSAqIDEwMDAgLyBnX3RzX2ZyZXEudTY0OworCQorCS8qIEdldCB0aGUgdGltZSBlbGFwc2VkIGluIG1pbGlzZWNvbmRzLiAKKwkgKiBXZSBkb24ndCB3YW50IHRvIHVzZSBQSl9USU1FX1ZBTF9NU0VDKCkgc2luY2UgaXQncyB1c2luZworCSAqIDMyYml0IGNhbGN1bGF0aW9uLCB3aGljaCBsaW1pdHMgdGhlIG1heGltdW0gZWxhcHNlZCB0aW1lCisJICogdG8gYXJvdW5kIDQ5IGRheXMgb25seS4KKwkgKi8KKwl0aW1lNjQgPSB0aW1lX25vdy5zZWM7CisJdGltZTY0ID0gdGltZTY0ICogMTAwMCArIHRpbWVfbm93Lm1zZWM7CisJLy90aW1lNjQgPSBHZXRUaWNrQ291bnQoKTsKKworCS8qIEl0J3MgZ29vZCBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBjbG9ja3MgYXJlIHdpdGhpbgorCSAqIHNvbWUgY29tcGlsZSB0aW1lIGNvbnN0YW50IChkZWZhdWx0OiAyMG1zLCB3aGljaCB0byBhbGxvdworCSAqIGNvbnRleHQgc3dpdGNoIGhhcHBlbiBiZXR3ZWVuIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIGFuZAorCSAqIHBqX2dldHRpbWVvZmRheSgpKS4KKwkgKi8KKwlkaWZmID0gKHRpbWU2NCAtIGdfdGltZV9iYXNlKSAtIGNvdW50ZXI2NDsKKwlpZiAoZGlmZiA+PSAtMjAgJiYgZGlmZiA8PSAyMCkgeworCSAgICAvKiBJdCdzIGdvb2QgKi8KKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfQorCisJKytpOworCisgICAgfSB3aGlsZSAoaSA8IE1BWF9SRVRSWSk7CisKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIlF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIHJldHVybmVkIGJhZCB2YWx1ZSIpKTsKKyAgICByZXR1cm4gUEpfRVRJTUVET1VUOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9wZXJmb3JtYW5jZV9jb3VudGVyKHZvaWQpCit7CisgICAgTEFSR0VfSU5URUdFUiB2YWw7CisgICAgcGpfdGltZV92YWwgdGltZV9iYXNlOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIEdldCB0aGUgZnJlcXVlbmN5ICovCisgICAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZ2YWwpKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgZ190c19mcmVxLnU2NCA9IHZhbC5RdWFkUGFydDsKKworICAgIC8qIEdldCB0aGUgYmFzZSB0aW1lc3RhbXAgKi8KKyAgICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZ2YWwpKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgZ190c19iYXNlLnU2NCA9IHZhbC5RdWFkUGFydDsKKworCisgICAgLyogR2V0IHRoZSBiYXNlIHRpbWUgKi8KKyAgICBzdGF0dXMgPSBwal9nZXR0aW1lb2ZkYXkoJnRpbWVfYmFzZSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICAvKiBDb252ZXJ0IHRpbWUgYmFzZSB0byA2NGJpdCB2YWx1ZSBpbiBtc2VjICovCisgICAgZ190aW1lX2Jhc2UgPSB0aW1lX2Jhc2Uuc2VjOworICAgIGdfdGltZV9iYXNlICA9IGdfdGltZV9iYXNlICogMTAwMCArIHRpbWVfYmFzZS5tc2VjOworICAgIC8vZ190aW1lX2Jhc2UgPSBHZXRUaWNrQ291bnQoKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldF90aW1lc3RhbXBfZnJlcShwal90aW1lc3RhbXAgKmZyZXEpCit7CisgICAgaWYgKGdfdHNfZnJlcS51NjQgPT0gMCkgeworCWVudW0geyBNQVhfUkVQRUFUID0gMTAgfTsKKwl1bnNpZ25lZCBpOworCXBqX3N0YXR1c190IHN0YXR1czsKKworCS8qIE1ha2UgdW5lbGxlZ2FudCBjb21waWxlciBoYXBweSAqLworCXN0YXR1cyA9IDA7CisKKwkvKiBSZXBlYXQgaW5pdGlhbGl6aW5nIHBlcmZvcm1hbmNlIGNvdW50ZXIgdW50aWwgd2UncmUgc3VyZQorCSAqIHRoZSBiYXNlIHRpbWluZyBpcyBjb3JyZWN0LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzeXN0ZW0KKwkgKiByZXR1cm5zIGJhZCBjb3VudGVyIGR1cmluZyB0aGlzIGluaXRpYWxpemF0aW9uIQorCSAqLworCWZvciAoaT0wOyBpPE1BWF9SRVBFQVQ7ICsraSkgeworCisJICAgIHBqX3RpbWVzdGFtcCBkdW1teTsKKworCSAgICAvKiBJbml0IGJhc2UgdGltZSAqLworCSAgICBzdGF0dXMgPSBpbml0X3BlcmZvcm1hbmNlX2NvdW50ZXIoKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJICAgIC8qIFRyeSB0aGUgYmFzZSB0aW1lICovCisJICAgIHN0YXR1cyA9IHBqX2dldF90aW1lc3RhbXAoJmR1bW15KTsKKwkgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgZnJlcS0+dTY0ID0gZ190c19mcmVxLnU2NDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2Vsc2UKKworLyoKKyAqIFVzZSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciBhbmQgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeS4KKyAqIFRoaXMgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgb24gV2luZG93cy4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdHMpCit7CisgICAgTEFSR0VfSU5URUdFUiB2YWw7CisKKyAgICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZ2YWwpKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgdHMtPnU2NCA9IHZhbC5RdWFkUGFydDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wX2ZyZXEocGpfdGltZXN0YW1wICpmcmVxKQoreworICAgIExBUkdFX0lOVEVHRVIgdmFsOworCisgICAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZ2YWwpKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgZnJlcS0+dTY0ID0gdmFsLlF1YWRQYXJ0OworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKyNlbmRpZgkvKiBQSl9USU1FU1RBTVBfVVNFX1JEVFNDICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzk4Lzk4YzJiZjg2ODkwOTcwODJkMGUxNzEzOTViOWNiOTEyMzYyNTgxZjMuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85OGMyYmY4Njg5MDk3MDgyZDBlMTcxMzk1YjljYjkxMjM2MjU4MWYzLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MmEyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85OGMyYmY4Njg5MDk3MDgyZDBlMTcxMzk1YjljYjkxMjM2MjU4MWYzLnN2bi1iYXNlCkBAIC0wLDAgKzEsMTA3IEBACisvKiAkSWQkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKworI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitleHRlcm4gaW50IHBhcmFtX2VjaG9fc29ja190eXBlOworZXh0ZXJuIGNvbnN0IGNoYXIgKnBhcmFtX2VjaG9fc2VydmVyOworZXh0ZXJuIGludCBwYXJhbV9lY2hvX3BvcnQ7CisKKworLy8jaWYgZGVmaW5lZChQSl9XSU4zMikgJiYgUEpfV0lOMzIhPTAKKyNpZiAwCisjaW5jbHVkZSA8d2luZG93cy5oPgorc3RhdGljIHZvaWQgYm9vc3Qodm9pZCkKK3sKKyAgICBTZXRQcmlvcml0eUNsYXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIFJFQUxUSU1FX1BSSU9SSVRZX0NMQVNTKTsKK30KKyNlbHNlCisjZGVmaW5lIGJvb3N0KCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQSl9TVU5PUykgJiYgUEpfU1VOT1MhPTAKKyNpbmNsdWRlIDxzaWduYWwuaD4KK3N0YXRpYyB2b2lkIGluaXRfc2lnbmFscygpCit7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisKKyAgICBtZW1zZXQoJmFjdCwgMCwgc2l6ZW9mKGFjdCkpOworICAgIGFjdC5zYV9oYW5kbGVyID0gU0lHX0lHTjsKKworICAgIHNpZ2FjdGlvbihTSUdBTFJNLCAmYWN0LCBOVUxMKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgaW5pdF9zaWduYWxzKCkKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCByYzsKKyAgICBpbnQgaW50ZXJyYWN0aXZlID0gMDsKKworICAgIGJvb3N0KCk7CisgICAgaW5pdF9zaWduYWxzKCk7CisKKyAgICB3aGlsZSAoYXJnYyA+IDEpIHsKKyAgICAgICAgY2hhciAqYXJnID0gYXJndlstLWFyZ2NdOworCisJaWYgKCphcmc9PSctJyAmJiAqKGFyZysxKT09J2knKSB7CisJICAgIGludGVycmFjdGl2ZSA9IDE7CisKKwl9IGVsc2UgaWYgKCphcmc9PSctJyAmJiAqKGFyZysxKT09J3AnKSB7CisgICAgICAgICAgICBwal9zdHJfdCBwb3J0ID0gcGpfc3RyKGFyZ3ZbLS1hcmdjXSk7CisKKyAgICAgICAgICAgIHBhcmFtX2VjaG9fcG9ydCA9IHBqX3N0cnRvdWwoJnBvcnQpOworCisgICAgICAgIH0gZWxzZSBpZiAoKmFyZz09Jy0nICYmICooYXJnKzEpPT0ncycpIHsKKyAgICAgICAgICAgIHBhcmFtX2VjaG9fc2VydmVyID0gYXJndlstLWFyZ2NdOworCisgICAgICAgIH0gZWxzZSBpZiAoKmFyZz09Jy0nICYmICooYXJnKzEpPT0ndCcpIHsKKyAgICAgICAgICAgIHBqX3N0cl90IHR5cGUgPSBwal9zdHIoYXJndlstLWFyZ2NdKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBqX3N0cmljbXAyKCZ0eXBlLCAidGNwIik9PTApCisgICAgICAgICAgICAgICAgcGFyYW1fZWNob19zb2NrX3R5cGUgPSBwal9TT0NLX1NUUkVBTSgpOworICAgICAgICAgICAgZWxzZSBpZiAocGpfc3RyaWNtcDIoJnR5cGUsICJ1ZHAiKT09MCkKKyAgICAgICAgICAgICAgICBwYXJhbV9lY2hvX3NvY2tfdHlwZSA9IHBqX1NPQ0tfREdSQU0oKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFBKX0xPRygzLCgiIiwgImVycm9yOiB1bmtub3duIHNvY2tldCB0eXBlICVzIiwgdHlwZS5wdHIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJjID0gdGVzdF9tYWluKCk7CisKKyAgICBpZiAoaW50ZXJyYWN0aXZlKSB7CisJY2hhciBzWzEwXTsKKwlwdXRzKCIiKTsKKwlwdXRzKCJQcmVzcyA8RU5URVI+IHRvIGV4aXQiKTsKKwlpZiAoIWZnZXRzKHMsIHNpemVvZihzKSwgc3RkaW4pKQorCSAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85OGQ4NzA1YWI2MDJiNDIzNTk2M2YyYjFhNjExZDIwMDJjNjFjMTBkLnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvOTgvOThkODcwNWFiNjAyYjQyMzU5NjNmMmIxYTYxMWQyMDAyYzYxYzEwZC5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTk5OGIxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvOTgvOThkODcwNWFiNjAyYjQyMzU5NjNmMmIxYTYxMWQyMDAyYzYxYzEwZC5zdm4tYmFzZQpAQCAtMCwwICsxLDE5MCBAQAorLyogJElkJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8cGpsaWIuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvaGlnaF9wcmVjaXNpb24uaD4KKworCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpsaWJfc29ja19wZXJmX3Rlc3QgVGVzdDogU29ja2V0IFBlcmZvcm1hbmNlCisgKgorICogVGVzdCB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIHNvY2tldCBjb21tdW5pY2F0aW9uLiBUaGlzIHdpbGwgcGVyZm9ybQorICogc2ltcGxlIHByb2R1Y2VyLWNvbnN1bWVyIHR5cGUgb2YgdGVzdCwgd2hlcmUgd2UgY2FsY3VsYXRlIGhvdyBsb25nCisgKiBkb2VzIGl0IHRha2UgdG8gc2VuZCBjZXJ0YWluIG51bWJlciBvZiBwYWNrZXRzIGZyb20gcHJvZHVjZXIgdG8KKyAqIGNvbnN1bWVyLgorICoKKyAqIFRoaXMgZmlsZSBpcyA8Yj5wamxpYi10ZXN0L3NvY2tfcGVyZi5jPC9iPgorICoKKyAqIFxpbmNsdWRlIHBqbGliLXRlc3Qvc29ja19wZXJmLmMKKyAqLworCisjaWYgSU5DTFVERV9TT0NLX1BFUkZfVEVTVAorCisvKgorICogc29ja19wcm9kdWNlcl9jb25zdW1lcigpCisgKgorICogU2ltcGxlIHByb2R1Y2VyLWNvbnN1bWVyIGJlbmNobWFya2luZy4gU2VuZCBsb29wIG51bWJlciBvZgorICogYnVmX3NpemUgc2l6ZSBwYWNrZXRzIGFzIGZhc3QgYXMgcG9zc2libGUuCisgKi8KK3N0YXRpYyBpbnQgc29ja19wcm9kdWNlcl9jb25zdW1lcihpbnQgc29ja190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NpemVfdCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb29wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqcF9iYW5kd2lkdGgpCit7CisgICAgcGpfc29ja190IGNvbnN1bWVyLCBwcm9kdWNlcjsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgY2hhciAqb3V0Z29pbmdfYnVmZmVyLCAqaW5jb21pbmdfYnVmZmVyOworICAgIHBqX3RpbWVzdGFtcCBzdGFydCwgc3RvcDsKKyAgICB1bnNpZ25lZCBpOworICAgIHBqX2hpZ2hwcmVjX3QgZWxhcHNlZCwgYmFuZHdpZHRoOworICAgIHBqX2hpZ2hwcmVjX3QgdG90YWxfcmVjZWl2ZWQ7CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyAgICAvKiBDcmVhdGUgcG9vbC4gKi8KKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCBOVUxMLCA0MDk2LCA0MDk2LCBOVUxMKTsKKyAgICBpZiAoIXBvb2wpCisgICAgICAgIHJldHVybiAtMTA7CisKKyAgICAvKiBDcmVhdGUgcHJvZHVjZXItY29uc3VtZXIgcGFpci4gKi8KKyAgICByYyA9IGFwcF9zb2NrZXRwYWlyKHBqX0FGX0lORVQoKSwgc29ja190eXBlLCAwLCAmY29uc3VtZXIsICZwcm9kdWNlcik7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3I6IGNyZWF0ZSBzb2NrZXQgcGFpciIsIHJjKTsKKyAgICAgICAgcmV0dXJuIC0yMDsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYnVmZmVycy4gKi8KKyAgICBvdXRnb2luZ19idWZmZXIgPSAoY2hhciopIHBqX3Bvb2xfYWxsb2MocG9vbCwgYnVmX3NpemUpOworICAgIGluY29taW5nX2J1ZmZlciA9IChjaGFyKikgcGpfcG9vbF9hbGxvYyhwb29sLCBidWZfc2l6ZSk7CisKKyAgICAvKiBTdGFydCBsb29wLiAqLworICAgIHBqX2dldF90aW1lc3RhbXAoJnN0YXJ0KTsKKyAgICB0b3RhbF9yZWNlaXZlZCA9IDA7CisgICAgZm9yIChpPTA7IGk8bG9vcDsgKytpKSB7CisgICAgICAgIHBqX3NzaXplX3Qgc2VudCwgcGFydF9yZWNlaXZlZCwgcmVjZWl2ZWQ7CisJcGpfdGltZV92YWwgZGVsYXk7CisKKyAgICAgICAgc2VudCA9IGJ1Zl9zaXplOworICAgICAgICByYyA9IHBqX3NvY2tfc2VuZChwcm9kdWNlciwgb3V0Z29pbmdfYnVmZmVyLCAmc2VudCwgMCk7CisgICAgICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTIHx8IHNlbnQgIT0gKHBqX3NzaXplX3QpYnVmX3NpemUpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBzZW5kKCkiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLTYxOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVwZWF0IHJlY3YoKSB1bnRpbCBhbGwgZGF0YSBpcyBwYXJ0X3JlY2VpdmVkLgorICAgICAgICAgKiBUaGlzIGFwcGxpZXMgb25seSBmb3Igbm9uLVVEUCBvZiBjb3Vyc2UsIHNpbmNlIGZvciBVRFAKKyAgICAgICAgICogd2Ugd291bGQgZXhwZWN0IGFsbCBkYXRhIHRvIGJlIHBhcnRfcmVjZWl2ZWQgaW4gb25lIHBhY2tldC4KKyAgICAgICAgICovCisgICAgICAgIHJlY2VpdmVkID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcGFydF9yZWNlaXZlZCA9IGJ1Zl9zaXplLXJlY2VpdmVkOworCSAgICByYyA9IHBqX3NvY2tfcmVjdihjb25zdW1lciwgaW5jb21pbmdfYnVmZmVyK3JlY2VpdmVkLCAKKwkJCSAgICAgICZwYXJ0X3JlY2VpdmVkLCAwKTsKKwkgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgICAgIGFwcF9wZXJyb3IoIi4uLnJlY3YgZXJyb3IiLCByYyk7CisJICAgICAgICByZXR1cm4gLTcwOworCSAgICB9CisgICAgICAgICAgICBpZiAocGFydF9yZWNlaXZlZCA8PSAwKSB7CisgICAgICAgICAgICAgICAgUEpfTE9HKDMsKCIiLCAiLi4uZXJyb3I6IHNvY2tldCBoYXMgY2xvc2VkIChwYXJ0X3JlY2VpdmVkPSVkKSEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X3JlY2VpdmVkKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC03MzsKKyAgICAgICAgICAgIH0KKwkgICAgaWYgKChwal9zaXplX3QpcGFydF9yZWNlaXZlZCAhPSBidWZfc2l6ZS1yZWNlaXZlZCkgeworICAgICAgICAgICAgICAgIGlmIChzb2NrX3R5cGUgIT0gcGpfU09DS19TVFJFQU0oKSkgeworCSAgICAgICAgICAgIFBKX0xPRygzLCgiIiwgIi4uLmVycm9yOiBleHBlY3RpbmcgJXUgYnl0ZXMsIGdvdCAldSBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZS1yZWNlaXZlZCwgcGFydF9yZWNlaXZlZCkpOworCSAgICAgICAgICAgIHJldHVybiAtNzY7CisgICAgICAgICAgICAgICAgfQorCSAgICB9CisgICAgICAgICAgICByZWNlaXZlZCArPSBwYXJ0X3JlY2VpdmVkOworICAgICAgICB9IHdoaWxlICgocGpfc2l6ZV90KXJlY2VpdmVkIDwgYnVmX3NpemUpOworCisJdG90YWxfcmVjZWl2ZWQgKz0gcmVjZWl2ZWQ7CisKKwkvKiBTdG9wIHRlc3QgaWYgaXQncyBiZWVuIHJ1bm5pZ24gZm9yIG1vcmUgdGhhbiAxMCBzZWNzLiAqLworCXBqX2dldF90aW1lc3RhbXAoJnN0b3ApOworCWRlbGF5ID0gcGpfZWxhcHNlZF90aW1lKCZzdGFydCwgJnN0b3ApOworCWlmIChkZWxheS5zZWMgPiAxMCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogU3RvcCB0aW1lci4gKi8KKyAgICBwal9nZXRfdGltZXN0YW1wKCZzdG9wKTsKKworICAgIGVsYXBzZWQgPSBwal9lbGFwc2VkX3VzZWMoJnN0YXJ0LCAmc3RvcCk7CisKKyAgICAvKiBiYW5kd2lkdGggPSB0b3RhbF9yZWNlaXZlZCAqIDEwMDAgLyBlbGFwc2VkICovCisgICAgYmFuZHdpZHRoID0gdG90YWxfcmVjZWl2ZWQ7CisgICAgcGpfaGlnaHByZWNfbXVsKGJhbmR3aWR0aCwgMTAwMCk7CisgICAgcGpfaGlnaHByZWNfZGl2KGJhbmR3aWR0aCwgZWxhcHNlZCk7CisgICAgCisgICAgKnBfYmFuZHdpZHRoID0gKHBqX3VpbnQzMl90KWJhbmR3aWR0aDsKKworICAgIC8qIENsb3NlIHNvY2tldHMuICovCisgICAgcGpfc29ja19jbG9zZShjb25zdW1lcik7CisgICAgcGpfc29ja19jbG9zZShwcm9kdWNlcik7CisKKyAgICAvKiBEb25lICovCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzb2NrX3BlcmZfdGVzdCgpCisgKgorICogTWFpbiB0ZXN0IGVudHJ5LgorICovCitpbnQgc29ja19wZXJmX3Rlc3Qodm9pZCkKK3sKKyAgICBlbnVtIHsgTE9PUCA9IDY0ICogMTAyNCB9OworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBiYW5kd2lkdGg7CisKKyAgICBQSl9MT0coMywoIiIsICIuLi5iZW5jaG1hcmtpbmcgc29ja2V0ICIKKyAgICAgICAgICAgICAgICAgICIoMiBzb2NrZXRzLCBwYWNrZXQ9NTEyLCBzaW5nbGUgdGhyZWFkZWQpOiIpKTsKKworICAgIC8qIERpc2FibGUgdGhpcyB0ZXN0IG9uIFN5bWJpYW4gc2luY2UgVURQIGNvbm5lY3QoKS9zZW5kKCkgZmFpbGVkCisgICAgICogd2l0aCBTNjAgM3JkIGVkaXRpb24gKGluY2x1ZGluZyBNUjIpLgorICAgICAqIFNlZSBodHRwOi8vd3d3LnBqc2lwLm9yZy90cmFjL3RpY2tldC8yNjQKKyAgICAgKi8gICAgCisjaWYgIWRlZmluZWQoUEpfU1lNQklBTikgfHwgUEpfU1lNQklBTj09MAorICAgIC8qIEJlbmNobWFya2luZyBVRFAgKi8KKyAgICByYyA9IHNvY2tfcHJvZHVjZXJfY29uc3VtZXIocGpfU09DS19ER1JBTSgpLCA1MTIsIExPT1AsICZiYW5kd2lkdGgpOworICAgIGlmIChyYyAhPSAwKSByZXR1cm4gcmM7CisgICAgUEpfTE9HKDMsKCIiLCAiLi4uLmJhbmR3aWR0aCBVRFAgPSAlZCBLQi9zIiwgYmFuZHdpZHRoKSk7CisjZW5kaWYKKworICAgIC8qIEJlbmNobWFya2luZyBUQ1AgKi8KKyAgICByYyA9IHNvY2tfcHJvZHVjZXJfY29uc3VtZXIocGpfU09DS19TVFJFQU0oKSwgNTEyLCBMT09QLCAmYmFuZHdpZHRoKTsKKyAgICBpZiAocmMgIT0gMCkgcmV0dXJuIHJjOworICAgIFBKX0xPRygzLCgiIiwgIi4uLi5iYW5kd2lkdGggVENQID0gJWQgS0IvcyIsIGJhbmR3aWR0aCkpOworCisgICAgcmV0dXJuIHJjOworfQorCisKKyNlbHNlCisvKiBUbyBwcmV2ZW50IHdhcm5pbmcgYWJvdXQgInRyYW5zbGF0aW9uIHVuaXQgaXMgZW1wdHkiCisgKiB3aGVuIHRoaXMgdGVzdCBpcyBkaXNhYmxlZC4gCisgKi8KK2ludCBkdW1teV9zb2NrX3BlcmZfdGVzdDsKKyNlbmRpZiAgLyogSU5DTFVERV9TT0NLX1BFUkZfVEVTVCAqLworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzk4Lzk4ZWQ2NTVkYTY4NWQ1NmVmNGI2NGEzNjQyZjE4MzY1NjhkMzBmNmEuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85OGVkNjU1ZGE2ODVkNTZlZjRiNjRhMzY0MmYxODM2NTY4ZDMwZjZhLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzhmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85OGVkNjU1ZGE2ODVkNTZlZjRiNjRhMzY0MmYxODM2NTY4ZDMwZjZhLnN2bi1iYXNlCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi8uLi9wb3J0YXVkaW8vc3JjL2hvc3RhcGkvYWxzYS9wYV9saW51eF9hbHNhLmMiCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS85OC85OGVmNjQ4ZmY3ZjAwNjNlMWVkODhkOGFkYjlhYzk3MTQ0NGM0M2UzLnN2bi1iYXNlIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvOTgvOThlZjY0OGZmN2YwMDYzZTFlZDg4ZDhhZGI5YWM5NzE0NDRjNDNlMy5zdm4tYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U2NDgxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkLy5zdm4vcHJpc3RpbmUvOTgvOThlZjY0OGZmN2YwMDYzZTFlZDg4ZDhhZGI5YWM5NzE0NDRjNDNlMy5zdm4tYmFzZQpAQCAtMCwwICsxLDM0MyBAQAorIyAkSWQkCisjCitmcm9tIHNvY2tldCBpbXBvcnQgKgoraW1wb3J0IHJlCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgdGltZQoraW1wb3J0IHN5cworaW1wb3J0IGluY19jZmcgYXMgY2ZnCitmcm9tIHNlbGVjdCBpbXBvcnQgKgorCisjIFNJUCByZXF1ZXN0IHRlbXBsYXRlCityZXFfdGVtcGwgPSBcCisiIiIkTUVUSE9EICRUQVJHRVRfVVJJIFNJUC8yLjBccgorVmlhOiBTSVAvMi4wL1VEUCAkTE9DQUxfSVA6JExPQ0FMX1BPUlQ7cnBvcnQ7YnJhbmNoPXo5aEc0YkskQlJBTkNIXHIKK01heC1Gb3J3YXJkczogNzBccgorRnJvbTogPHNpcDpjYWxsZXJAcGpzaXAub3JnPiRGUk9NX1RBR1xyCitUbzogPCRUQVJHRVRfVVJJPiRUT19UQUdccgorQ29udGFjdDogPHNpcDokTE9DQUxfSVA6JExPQ0FMX1BPUlQ7dHJhbnNwb3J0PXVkcD5ccgorQ2FsbC1JRDogJENBTExfSURAcGpzaXAub3JnXHIKK0NTZXE6ICRDU0VRICRNRVRIT0RccgorQWxsb3c6IFBSQUNLLCBJTlZJVEUsIEFDSywgQllFLCBDQU5DRUwsIFVQREFURSwgUkVGRVJccgorU3VwcG9ydGVkOiByZXBsYWNlcywgMTAwcmVsLCBub3JlZmVyc3ViXHIKK1VzZXItQWdlbnQ6IHBqc2lwLm9yZyBQeXRob24gdGVzdGVyXHIKK0NvbnRlbnQtTGVuZ3RoOiAkQ09OVEVOVF9MRU5HVEhccgorJFNJUF9IRUFERVJTIiIiCisKKworZGVmIGlzX3JlcXVlc3QobXNnKToKKwlyZXR1cm4gbXNnLnNwbGl0KCIgIiwgMSlbMF0gIT0gIlNJUC8yLjAiCisJCitkZWYgaXNfcmVzcG9uc2UobXNnKToKKwlyZXR1cm4gbXNnLnNwbGl0KCIgIiwgMSlbMF0gPT0gIlNJUC8yLjAiCisKK2RlZiBnZXRfY29kZShtc2cpOgorCWlmIG1zZz09IiI6CisJCXJldHVybiAwCisJcmV0dXJuIGludChtc2cuc3BsaXQoIiAiLCAyKVsxXSkKKworZGVmIGdldF90YWcobXNnLCBoZHI9IlRvIik6CisJcGF0ID0gIl4iICsgaGRyICsgIjouKiIKKwlyZXN1bHQgPSByZS5zZWFyY2gocGF0LCBtc2csIHJlLk0gfCByZS5JKQorCWlmIHJlc3VsdD09Tm9uZToKKwkJcmV0dXJuICIiCisJbGluZSA9IHJlc3VsdC5ncm91cCgpCisJI3ByaW50ICJsaW5lPSIsIGxpbmUKKwl0YWdzID0gbGluZS5zcGxpdCgiO3RhZz0iKQorCWlmIGxlbih0YWdzKT4xOgorCQlyZXR1cm4gdGFnc1sxXQorCXJldHVybiAiIgorCSNyZXR1cm4gcmUuc3BsaXQoIls7JiBdIiwgcykKKworZGVmIGdldF9oZWFkZXIobXNnLCBobmFtZSk6CisJaGVhZGVycyA9IG1zZy5zcGxpdGxpbmVzKCkKKwlmb3IgaGRyIGluIGhlYWRlcnM6CisJCWhmaWVsZHMgPSBoZHIuc3BsaXQoIjogIiwgMikKKwkJaWYgaGZpZWxkc1swXT09aG5hbWU6CisJCQlyZXR1cm4gaGZpZWxkc1sxXQorCXJldHVybiBOb25lCisKK2NsYXNzIERpYWxvZzoKKwlzb2NrID0gTm9uZQorCWRzdF9hZGRyID0gIiIKKwlkc3RfcG9ydCA9IDUwNjAKKwlsb2NhbF9pcCA9ICIiCisJbG9jYWxfcG9ydCA9IDAKKwl0Y3AgPSBGYWxzZQorCWNhbGxfaWQgPSBzdHIocmFuZG9tLnJhbmRvbSgpKQorCWNzZXEgPSAwCisJbG9jYWxfdGFnID0gIjt0YWc9IiArIHN0cihyYW5kb20ucmFuZG9tKCkpCisJcmVtX3RhZyA9ICIiCisJbGFzdF9yZXNwX2NvZGUgPSAwCisJaW52X2JyYW5jaCA9ICIiCisJdHJhY2VfZW5hYmxlZCA9IFRydWUKKwlsYXN0X3JlcXVlc3QgPSAiIgorCWRlZiBfX2luaXRfXyhzZWxmLCBkc3RfYWRkciwgZHN0X3BvcnQ9NTA2MCwgdGNwPUZhbHNlLCB0cmFjZT1UcnVlLCBsb2NhbF9wb3J0PTApOgorCQlzZWxmLmRzdF9hZGRyID0gZHN0X2FkZHIKKwkJc2VsZi5kc3RfcG9ydCA9IGRzdF9wb3J0CisJCXNlbGYudGNwID0gdGNwCisJCXNlbGYudHJhY2VfZW5hYmxlZCA9IHRyYWNlCisJCWlmIHRjcD09VHJ1ZToKKwkJCXNlbGYuc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSkKKwkJCXNlbGYuc29jay5jb25uZWN0KGRzdF9hZGRyLCBkc3RfcG9ydCkKKwkJZWxzZToKKwkJCXNlbGYuc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNKQorCQkJc2VsZi5zb2NrLmJpbmQoKCIxMjcuMC4wLjEiLCBsb2NhbF9wb3J0KSkKKwkJCisJCXNlbGYubG9jYWxfaXAsIHNlbGYubG9jYWxfcG9ydCA9IHNlbGYuc29jay5nZXRzb2NrbmFtZSgpCisJCXNlbGYudHJhY2UoIkRpYWxvZyBzb2NrZXQgYm91bmQgdG8gIiArIHNlbGYubG9jYWxfaXAgKyAiOiIgKyBzdHIoc2VsZi5sb2NhbF9wb3J0KSkKKworCWRlZiB0cmFjZShzZWxmLCB0eHQpOgorCQlpZiBzZWxmLnRyYWNlX2VuYWJsZWQ6CisJCQlwcmludCBzdHIodGltZS5zdHJmdGltZSgiJUg6JU06JVMgIikpICsgdHh0CisKKwlkZWYgdXBkYXRlX2ZpZWxkcyhzZWxmLCBtc2cpOgorCQlpZiBzZWxmLnRjcDoKKwkJCXRyYW5zcG9ydF9wYXJhbSA9ICI7dHJhbnNwb3J0PXRjcCIKKwkJZWxzZToKKwkJCXRyYW5zcG9ydF9wYXJhbSA9ICIiCisJCW1zZyA9IG1zZy5yZXBsYWNlKCIkVEFSR0VUX1VSSSIsICJzaXA6IitzZWxmLmRzdF9hZGRyKyI6IitzdHIoc2VsZi5kc3RfcG9ydCkgKyB0cmFuc3BvcnRfcGFyYW0pCisJCW1zZyA9IG1zZy5yZXBsYWNlKCIkTE9DQUxfSVAiLCBzZWxmLmxvY2FsX2lwKQorCQltc2cgPSBtc2cucmVwbGFjZSgiJExPQ0FMX1BPUlQiLCBzdHIoc2VsZi5sb2NhbF9wb3J0KSkKKwkJbXNnID0gbXNnLnJlcGxhY2UoIiRGUk9NX1RBRyIsIHNlbGYubG9jYWxfdGFnKQorCQltc2cgPSBtc2cucmVwbGFjZSgiJFRPX1RBRyIsIHNlbGYucmVtX3RhZykKKwkJbXNnID0gbXNnLnJlcGxhY2UoIiRDQUxMX0lEIiwgc2VsZi5jYWxsX2lkKQorCQltc2cgPSBtc2cucmVwbGFjZSgiJENTRVEiLCBzdHIoc2VsZi5jc2VxKSkKKwkJYnJhbmNoPXN0cihyYW5kb20ucmFuZG9tKCkpCisJCW1zZyA9IG1zZy5yZXBsYWNlKCIkQlJBTkNIIiwgYnJhbmNoKQorCQlyZXR1cm4gbXNnCisKKwlkZWYgY3JlYXRlX3JlcShzZWxmLCBtZXRob2QsIHNkcCwgYnJhbmNoPSIiLCBleHRyYV9oZWFkZXJzPSIiLCBib2R5PSIiKToKKwkJaWYgYnJhbmNoPT0iIjoKKwkJCXNlbGYuY3NlcSA9IHNlbGYuY3NlcSArIDEKKwkJbXNnID0gcmVxX3RlbXBsCisJCW1zZyA9IG1zZy5yZXBsYWNlKCIkTUVUSE9EIiwgbWV0aG9kKQorCQltc2cgPSBtc2cucmVwbGFjZSgiJFNJUF9IRUFERVJTIiwgZXh0cmFfaGVhZGVycykKKwkJaWYgYnJhbmNoPT0iIjoKKwkJCWJyYW5jaD1zdHIocmFuZG9tLnJhbmRvbSgpKQorCQltc2cgPSBtc2cucmVwbGFjZSgiJEJSQU5DSCIsIGJyYW5jaCkKKwkJaWYgc2RwIT0iIjoKKwkJCW1zZyA9IG1zZy5yZXBsYWNlKCIkQ09OVEVOVF9MRU5HVEgiLCBzdHIobGVuKHNkcCkpKQorCQkJbXNnID0gbXNnICsgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc2RwXHJcbiIKKwkJCW1zZyA9IG1zZyArICJcclxuIgorCQkJbXNnID0gbXNnICsgc2RwCisJCWVsaWYgYm9keSE9IiI6CisJCQltc2cgPSBtc2cucmVwbGFjZSgiJENPTlRFTlRfTEVOR1RIIiwgc3RyKGxlbihib2R5KSkpCisJCQltc2cgPSBtc2cgKyAiXHJcbiIKKwkJCW1zZyA9IG1zZyArIGJvZHkKKwkJZWxzZToKKwkJCW1zZyA9IG1zZy5yZXBsYWNlKCIkQ09OVEVOVF9MRU5HVEgiLCAiMCIpCisJCXJldHVybiBzZWxmLnVwZGF0ZV9maWVsZHMobXNnKQorCisJZGVmIGNyZWF0ZV9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCBjb2RlLCByZWFzb24sIHRvX3RhZz0iIik6CisJCXJlc3BvbnNlID0gIlNJUC8yLjAgIiArIHN0cihjb2RlKSArICIgIiArIHJlYXNvbiArICJcclxuIgorCQlsaW5lcyA9IHJlcXVlc3Quc3BsaXRsaW5lcygpCisJCWZvciBsaW5lIGluIGxpbmVzOgorCQkJaGRyID0gbGluZS5zcGxpdCgiOiIsIDEpWzBdCisJCQlpZiBoZHIgaW4gWyJWaWEiLCAiRnJvbSIsICJUbyIsICJDU2VxIiwgIkNhbGwtSUQiXToKKwkJCQlpZiBoZHI9PSJUbyIgYW5kIHRvX3RhZyE9IiI6CisJCQkJCWxpbmUgPSBsaW5lICsgIjt0YWc9IiArIHRvX3RhZworCQkJCWVsaWYgaGRyPT0iVmlhIjoKKwkJCQkJbGluZSA9IGxpbmUgKyAiO3JlY2VpdmVkPTEyNy4wLjAuMSIKKwkJCQlyZXNwb25zZSA9IHJlc3BvbnNlICsgbGluZSArICJcclxuIgorCQlyZXR1cm4gcmVzcG9uc2UKKworCWRlZiBjcmVhdGVfaW52aXRlKHNlbGYsIHNkcCwgZXh0cmFfaGVhZGVycz0iIiwgYm9keT0iIik6CisJCXNlbGYuaW52X2JyYW5jaCA9IHN0cihyYW5kb20ucmFuZG9tKCkpCisJCXJldHVybiBzZWxmLmNyZWF0ZV9yZXEoIklOVklURSIsIHNkcCwgYnJhbmNoPXNlbGYuaW52X2JyYW5jaCwgZXh0cmFfaGVhZGVycz1leHRyYV9oZWFkZXJzLCBib2R5PWJvZHkpCisKKwlkZWYgY3JlYXRlX2FjayhzZWxmLCBzZHA9IiIsIGV4dHJhX2hlYWRlcnM9IiIpOgorCQlyZXR1cm4gc2VsZi5jcmVhdGVfcmVxKCJBQ0siLCBzZHAsIGV4dHJhX2hlYWRlcnM9ZXh0cmFfaGVhZGVycywgYnJhbmNoPXNlbGYuaW52X2JyYW5jaCkKKworCWRlZiBjcmVhdGVfYnllKHNlbGYsIGV4dHJhX2hlYWRlcnM9IiIpOgorCQlyZXR1cm4gc2VsZi5jcmVhdGVfcmVxKCJCWUUiLCAiIiwgZXh0cmFfaGVhZGVycykKKworCWRlZiBzZW5kX21zZyhzZWxmLCBtc2csIGRzdF9hZGRyPU5vbmUpOgorCQlpZiAoaXNfcmVxdWVzdChtc2cpKToKKwkJCXNlbGYubGFzdF9yZXF1ZXN0ID0gbXNnLnNwbGl0KCIgIiwgMSlbMF0KKwkJaWYgbm90IGRzdF9hZGRyOgorCQkJZHN0X2FkZHIgPSAoc2VsZi5kc3RfYWRkciwgc2VsZi5kc3RfcG9ydCkKKwkJc2VsZi50cmFjZSgiPT09PT09PT09PT09PT0gVFggTVNHIHRvICIgKyBzdHIoZHN0X2FkZHIpICsgIiA9PT09PT09PT09PT09IFxuIiArIG1zZykKKwkJc2VsZi5zb2NrLnNlbmR0byhtc2csIDAsIGRzdF9hZGRyKQorCisJZGVmIHdhaXRfbXNnX2Zyb20oc2VsZiwgdGltZW91dCk6CisJCWVuZHRpbWUgPSB0aW1lLnRpbWUoKSArIHRpbWVvdXQKKwkJbXNnID0gIiIKKwkJc3JjX2FkZHIgPSBOb25lCisJCXdoaWxlIHRpbWUudGltZSgpIDwgZW5kdGltZToKKwkJCXJlYWRzZXQgPSBzZWxlY3QoW3NlbGYuc29ja10sIFtdLCBbXSwgMSkKKwkJCWlmIGxlbihyZWFkc2V0WzBdKSA8IDEgb3Igbm90IHNlbGYuc29jayBpbiByZWFkc2V0WzBdOgorCQkJCWlmIGxlbihyZWFkc2V0WzBdKSA8IDE6CisJCQkJCXByaW50ICJzZWxlY3QoKSB0aW1lb3V0ICh3aWxsIHdhaXQgZm9yICIgKyBzdHIoaW50KGVuZHRpbWUgLSB0aW1lLnRpbWUoKSkpICsgIm1vcmUgc2VjcykiCisJCQkJZWxpZiBub3Qgc2VsZi5zb2NrIGluIHJlYWRzZXRbMF06CisJCQkJCXByaW50ICJzZWxlY3QoKSBhbGllbiBzb2NrZXQiCisJCQkJZWxzZToKKwkJCQkJcHJpbnQgInNlbGVjdCBvdGhlciBlcnJvciIKKwkJCQljb250aW51ZQorCQkJdHJ5OgorCQkJCW1zZywgc3JjX2FkZHIgPSBzZWxmLnNvY2sucmVjdmZyb20oNDA5NikKKwkJCQlicmVhaworCQkJZXhjZXB0OgorCQkJCXByaW50ICJyZWN2KCkgZXhjZXB0aW9uOiAiLCBzeXMuZXhjX2luZm8oKVswXQorCQkJCWNvbnRpbnVlCisKKwkJaWYgbXNnPT0iIjoKKwkJCXJldHVybiAiIiwgTm9uZQorCQlpZiBzZWxmLmxhc3RfcmVxdWVzdD09IklOVklURSIgYW5kIHNlbGYucmVtX3RhZz09IiI6CisJCQlzZWxmLnJlbV90YWcgPSBnZXRfdGFnKG1zZywgIlRvIikKKwkJCXNlbGYucmVtX3RhZyA9IHNlbGYucmVtX3RhZy5yc3RyaXAoIlxyXG47IikKKwkJCWlmIHNlbGYucmVtX3RhZyAhPSAiIjoKKwkJCQlzZWxmLnJlbV90YWcgPSAiO3RhZz0iICsgc2VsZi5yZW1fdGFnCisJCQlzZWxmLnRyYWNlKCI9PT0gcmVtX3RhZzoiICsgc2VsZi5yZW1fdGFnKQorCQlzZWxmLnRyYWNlKCI9PT09PT09PT09PSBSWCBNU0cgZnJvbSAiICsgc3RyKHNyY19hZGRyKSArICAiID09PT09PT09PT09XG4iICsgbXNnKQorCQlyZXR1cm4gKG1zZywgc3JjX2FkZHIpCisJCisJZGVmIHdhaXRfbXNnKHNlbGYsIHRpbWVvdXQpOgorCQlyZXR1cm4gc2VsZi53YWl0X21zZ19mcm9tKHRpbWVvdXQpWzBdCisJCQorCSMgU2VuZCByZXF1ZXN0IGFuZCB3YWl0IGZvciBmaW5hbCByZXNwb25zZQorCWRlZiBzZW5kX3JlcXVlc3Rfd2FpdChzZWxmLCBtc2csIHRpbWVvdXQpOgorCQl0MSA9IDEuMAorCQllbmR0aW1lID0gdGltZS50aW1lKCkgKyB0aW1lb3V0CisJCXJlc3AgPSAiIgorCQljb2RlID0gMAorCQlmb3IgaSBpbiByYW5nZSgwLDUpOgorCQkJc2VsZi5zZW5kX21zZyhtc2cpCisJCQlyZXNwID0gc2VsZi53YWl0X21zZyh0MSkKKwkJCWlmIHJlc3AhPSIiIGFuZCBpc19yZXNwb25zZShyZXNwKToKKwkJCQljb2RlID0gZ2V0X2NvZGUocmVzcCkKKwkJCQlicmVhaworCQlsYXN0X3Jlc3AgPSByZXNwCisJCXdoaWxlIGNvZGUgPCAyMDAgYW5kIHRpbWUudGltZSgpIDwgZW5kdGltZToKKwkJCXJlc3AgPSBzZWxmLndhaXRfbXNnKGVuZHRpbWUgLSB0aW1lLnRpbWUoKSkKKwkJCWlmIHJlc3AgIT0gIiIgYW5kIGlzX3Jlc3BvbnNlKHJlc3ApOgorCQkJCWNvZGUgPSBnZXRfY29kZShyZXNwKQorCQkJCWxhc3RfcmVzcCA9IHJlc3AKKwkJCWVsaWYgcmVzcD09IiI6CisJCQkJYnJlYWsKKwkJcmV0dXJuIGxhc3RfcmVzcAorCQorCWRlZiBoYW5ndXAoc2VsZiwgbGFzdF9jb2RlPTApOgorCQlzZWxmLnRyYWNlKCI9PT09PT0gaGFuZ3VwID09PT09IikKKwkJaWYgbGFzdF9jb2RlIT0wOgorCQkJc2VsZi5sYXN0X3Jlc3BfY29kZSA9IGxhc3RfY29kZQorCQlpZiBzZWxmLmxhc3RfcmVzcF9jb2RlPjAgYW5kIHNlbGYubGFzdF9yZXNwX2NvZGU8MjAwOgorCQkJbXNnID0gc2VsZi5jcmVhdGVfcmVxKCJDQU5DRUwiLCAiIiwgYnJhbmNoPXNlbGYuaW52X2JyYW5jaCwgZXh0cmFfaGVhZGVycz0iIikKKwkJCXNlbGYuc2VuZF9yZXF1ZXN0X3dhaXQobXNnLCA1KQorCQkJbXNnID0gc2VsZi5jcmVhdGVfYWNrKCkKKwkJCXNlbGYuc2VuZF9tc2cobXNnKQorCQllbGlmIHNlbGYubGFzdF9yZXNwX2NvZGU+PTIwMCBhbmQgc2VsZi5sYXN0X3Jlc3BfY29kZTwzMDA6CisJCQltc2cgPSBzZWxmLmNyZWF0ZV9hY2soKQorCQkJc2VsZi5zZW5kX21zZyhtc2cpCisJCQltc2cgPSBzZWxmLmNyZWF0ZV9ieWUoKQorCQkJc2VsZi5zZW5kX3JlcXVlc3Rfd2FpdChtc2csIDUpCisJCWVsc2U6CisJCQltc2cgPSBzZWxmLmNyZWF0ZV9hY2soKQorCQkJc2VsZi5zZW5kX21zZyhtc2cpCisKKworY2xhc3MgU2VuZHRvQ2ZnOgorCSMgVGVzdCBuYW1lCisJbmFtZSA9ICIiCisJIyBwanN1YSBJbnN0YW5jZVBhcmFtCisJaW5zdF9wYXJhbSA9IE5vbmUKKwkjIENvbXBsZXRlIElOVklURSBtZXNzYWdlLiBJZiB0aGlzIGlzIG5vdCBlbXB0eSwgdGhlbiB0aGlzCisJIyBtZXNzYWdlIHdpbGwgYmUgc2VudCBpbnN0ZWFkIGFuZCB0aGUgInNkcCIgYW5kICJleHRyYV9oZWFkZXJzIgorCSMgc2V0dGluZ3Mgd2lsbCBiZSBpZ25vcmVkLgorCWNvbXBsZXRlX21zZyA9ICIiCisJIyBJbml0aWFsIFNEUAorCXNkcCA9ICIiCisJIyBFeHRyYSBoZWFkZXJzIHRvIGFkZCB0byByZXF1ZXN0CisJZXh0cmFfaGVhZGVycyA9ICIiCisJIyBFeHBlY3RlZCBjb2RlCisJcmVzcF9jb2RlID0gMAorCSMgVXNlIFRDUD8KKwl1c2VfdGNwID0gRmFsc2UKKwkjIExpc3Qgb2YgUkUgcGF0dGVybnMgdGhhdCBtdXN0IGV4aXN0IGluIHJlc3BvbnNlCisJcmVzcF9pbmNsdWRlID0gW10KKwkjIExpc3Qgb2YgUkUgcGF0dGVybnMgdGhhdCBtdXN0IE5PVCBleGlzdCBpbiByZXNwb25zZQorCXJlc3BfZXhjbHVkZSA9IFtdCisJIyBGdWxsIChub24tU0RQKSBib2R5CisJYm9keSA9ICIiCisJIyBDb25zdHJ1Y3RvcgorCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwanN1YV9hcmdzLCBzZHAsIHJlc3BfY29kZSwgCisJCSAgICAgcmVzcF9pbmM9W10sIHJlc3BfZXhjPVtdLCB1c2VfdGNwPUZhbHNlLAorCQkgICAgIGV4dHJhX2hlYWRlcnM9IiIsIGJvZHk9IiIsIGNvbXBsZXRlX21zZz0iIiwKKwkJICAgICBlbmFibGVfYnVmZmVyID0gRmFsc2UpOgorCSAJc2VsZi5jb21wbGV0ZV9tc2cgPSBjb21wbGV0ZV9tc2cKKwkJc2VsZi5zZHAgPSBzZHAKKwkJc2VsZi5yZXNwX2NvZGUgPSByZXNwX2NvZGUKKwkJc2VsZi5yZXNwX2luY2x1ZGUgPSByZXNwX2luYworCQlzZWxmLnJlc3BfZXhjbHVkZSA9IHJlc3BfZXhjCisJCXNlbGYudXNlX3RjcCA9IHVzZV90Y3AKKwkJc2VsZi5leHRyYV9oZWFkZXJzID0gZXh0cmFfaGVhZGVycworCQlzZWxmLmJvZHkgPSBib2R5CisJCXNlbGYuaW5zdF9wYXJhbSA9IGNmZy5JbnN0YW5jZVBhcmFtKCJwanN1YSIsIHBqc3VhX2FyZ3MpCisJCXNlbGYuaW5zdF9wYXJhbS5lbmFibGVfYnVmZmVyID0gZW5hYmxlX2J1ZmZlciAKKworCitjbGFzcyBSZWN2ZnJvbVRyYW5zYWN0aW9uOgorCSMgVGhlIHRlc3QgdGl0bGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KKwl0aXRsZSA9ICIiCisJIyBPcHRpbmFsIGxpc3Qgb2YgcGpzdWEgY29tbWFuZCBhbmQgb3B0aW9uYWwgZXhwZWN0IHBhdHRlcm5zIAorCSMgdG8gYmUgaW52b2tlZCB0byBtYWtlIHBqc3VhIHNlbmQgYSByZXF1ZXN0CisJIyBTYW1wbGU6CisJIwkodG8gbWFrZSBjYWxsIGFuZCB3YWl0IGZvciBJTlZJVEUgdG8gYmUgc2VudCkKKwkjCWNtZHMgPSBbIFsibSJdLCBbInNpcDoxMjcuMC4wLjEiLCAiSU5WSVRFIHNpcDoiXSAgXQorCWNtZHMgPSBbXQorCSMgQ2hlY2sgaWYgdGhlIENTZXEgbXVzdCBiZSBncmVhdGVyIHRoYW4gbGFzdCBDc2VxPworCWNoZWNrX2NzZXEgPSBUcnVlCisJIyBMaXN0IG9mIFJFIHBhdHRlcm5zIHRoYXQgbXVzdCBleGlzdHMgaW4gaW5jb21pbmcgcmVxdWVzdAorCWluY2x1ZGUgPSBbXQorCSMgTGlzdCBvZiBSRSBwYXR0ZXJucyB0aGF0IE1VU1QgTk9UIGV4aXN0IGluIGluY29taW5nIHJlcXVlc3QKKwlleGNsdWRlID0gW10KKwkjIFJlc3BvbnNlIGNvZGUgdG8gc2VuZAorCXJlc3BfY29kZSA9IDAKKwkjIEFkZGl0aW9uYWwgbGlzdCBvZiBoZWFkZXJzIHRvIGJlIHNlbnQgb24gdGhlIHJlc3BvbnNlCisJIyBOb3RlOiBubyBuZWVkIHRvIGFkZCBDUkxGIG9uIHRoZSBoZWFkZXIKKwlyZXNwX2hkciA9IFtdCisJIyBNZXNzYWdlIGJvZHkuIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgdG9vLgorCSMgU2FtcGxlOgorCSMJYm9keSA9ICIiIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc2RwXHJcbgorCSMJXHJcbgorCSMJdj0wXHJcbgorCSMJLi4uCisJIwkiIiIKKwlib2R5ID0gTm9uZQorCSMgUGF0dGVybiB0byBiZSBleHBlY3RlZCBvbiBwanN1YSB3aGVuIHJlY2VpdmluZyB0aGUgcmVzcG9uc2UKKwlleHBlY3QgPSAiIgorCQorCWRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgcmVzcF9jb2RlLCBjaGVja19jc2VxPVRydWUsCisJCQlpbmNsdWRlPVtdLCBleGNsdWRlPVtdLCBjbWRzPVtdLCByZXNwX2hkcj1bXSwgcmVzcF9ib2R5PU5vbmUsIGV4cGVjdD0iIik6CisJCXNlbGYudGl0bGUgPSB0aXRsZQorCQlzZWxmLmNtZHMgPSBjbWRzCisJCXNlbGYuaW5jbHVkZSA9IGluY2x1ZGUKKwkJc2VsZi5leGNsdWRlID0gZXhjbHVkZQorCQlzZWxmLnJlc3BfY29kZSA9IHJlc3BfY29kZQorCQlzZWxmLnJlc3BfaGRyID0gcmVzcF9oZHIKKwkJc2VsZi5ib2R5ID0gcmVzcF9ib2R5CisJCXNlbGYuZXhwZWN0ID0gZXhwZWN0CisJCQkKKworY2xhc3MgUmVjdmZyb21DZmc6CisJIyBUZXN0IG5hbWUKKwluYW1lID0gIiIKKwkjIHBqc3VhIEluc3RhbmNlUGFyYW0KKwlpbnN0X3BhcmFtID0gTm9uZQorCSMgTGlzdCBvZiBSZWN2ZnJvbVRyYW5zYWN0aW9uCisJdHJhbnNhY3Rpb24gPSBOb25lCisJIyBVc2UgVENQPworCXRjcCA9IEZhbHNlCisKKwkjIE5vdGU6CisJIyAgQW55ICIkUE9SVCIgc3RyaW5nIGluIHRoZSBwanN1YV9hcmdzIHdpbGwgYmUgcmVwbGFjZWQKKwkjICBieSBzZXJ2ZXIgcG9ydAorCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwanN1YV9hcmdzLCB0cmFuc2FjdGlvbiwgdGNwPUZhbHNlKToKKwkJc2VsZi5uYW1lID0gbmFtZQorCQlzZWxmLmluc3RfcGFyYW0gPSBjZmcuSW5zdGFuY2VQYXJhbSgicGpzdWEiLCBwanN1YV9hcmdzKQorCQlzZWxmLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24KKwkJc2VsZi50Y3A9dGNwCisKKworCisK