LyoKICogRElTUERJQi5kbGwKICogCiAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbiAod2l0aCBzb21lIGhlbHAgZnJvbSBNYXJjdXMgTWVpc3NuZXIpCiAqCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAiZGlzcGRpYi5oIgojaW5jbHVkZSAidmdhLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgoKc3RhdGljIGludCBkaXNwZGliX211bHRpID0gMDsKCnN0YXRpYyBXT1JEIERJU1BESUJfQmVnaW4oV09SRCB3RmxhZ3MpCnsKICAgIHVuc2lnbmVkIFhyZXMsWXJlcyxEZXB0aDsKCiAgICBzd2l0Y2god0ZsYWdzJkRJU1BMQVlESUJfTU9ERSkgewogICAgICAgIGNhc2UgRElTUExBWURJQl9NT0RFX0RFRkFVTFQ6CiAgICAgICAgICAgIC8qIEZJWE1FOiBpcyB0aGlzIHN1cHBvc2VkIHRvIGF1dG9kZXRlY3Q/ICovCiAgICAgICAgY2FzZSBESVNQTEFZRElCX01PREVfMzIweDIwMHg4OgogICAgICAgICAgICBYcmVzPTMyMDsgWXJlcz0yMDA7IERlcHRoPTg7IGJyZWFrOwogICAgICAgIGNhc2UgRElTUExBWURJQl9NT0RFXzMyMHgyNDB4ODoKICAgICAgICAgICAgWHJlcz0zMjA7IFlyZXM9MjQwOyBEZXB0aD04OyBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gRElTUExBWURJQl9OT1RTVVBQT1JURUQ7CiAgICB9CiAgICBpZiAoVkdBX1NldE1vZGUoWHJlcyxZcmVzLERlcHRoKSkgcmV0dXJuIERJU1BMQVlESUJfTk9UU1VQUE9SVEVEOwogICAgcmV0dXJuIERJU1BMQVlESUJfTk9FUlJPUjsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9FbmQodm9pZCkKewogICAgVkdBX0V4aXQoKTsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9QYWxldHRlKExQQklUTUFQSU5GTyBscGJpKQp7CiAgICBWR0FfU2V0UXVhZFBhbGV0dGUobHBiaS0+Ym1pQ29sb3JzLDAsMjU2KTsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9TaG93KExQQklUTUFQSU5GT0hFQURFUiBscGJpLExQU1RSIGxwQml0cyxXT1JEIHVGbGFncykKewogICAgaW50IFhvZnMsWW9mcyxXaWR0aD1scGJpLT5iaVdpZHRoLEhlaWdodD1scGJpLT5iaUhlaWdodCxEZWx0YTsKICAgIHVuc2lnbmVkIFBpdGNoPShXaWR0aCszKSZ+MyxzUGl0Y2gsc1dpZHRoLHNIZWlnaHQ7CiAgICBMUFNUUiBzdXJmID0gRE9TTUVNX01hcERvc1RvTGluZWFyKDB4YTAwMDApOwoKICAgIGlmIChWR0FfR2V0TW9kZSgmc0hlaWdodCwmc1dpZHRoLE5VTEwpKSByZXR1cm47CiAgICBzUGl0Y2g9MzIwOwoKICAgIERlbHRhPShIZWlnaHQ8MCkqMi0xOwogICAgSGVpZ2h0Kj0tRGVsdGE7IFBpdGNoKj1EZWx0YTsKCiAgICBpZiAodUZsYWdzJkRJU1BMQVlESUJfTk9DRU5URVIpIHsKICAgICAgICBYb2ZzPTA7IFlvZnM9MDsKICAgIH0gZWxzZSB7CiAgICAgICAgWG9mcz0oc1dpZHRoLVdpZHRoKS8yOwogICAgICAgIFlvZnM9KHNIZWlnaHQtSGVpZ2h0KS8yOwogICAgfQogICAgc3VyZiArPSAoWW9mcypzUGl0Y2gpK1hvZnM7CiAgICBpZiAoUGl0Y2g8MCkgbHBCaXRzLT1QaXRjaCooSGVpZ2h0LTEpOwogICAgZm9yICg7IEhlaWdodDsgSGVpZ2h0LS0sbHBCaXRzKz1QaXRjaCxzdXJmKz1zUGl0Y2gpIHsKICAgICAgICBtZW1jcHkoc3VyZixscEJpdHMsV2lkdGgpOwogICAgfQoKICAgIFZHQV9Qb2xsKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRGlzcGxheURpYgkoRElTUERJQi4xKQogKgogKiAgRGlzYWJsZXMgR0RJIGFuZCB0YWtlcyBvdmVyIHRoZSBWR0Egc2NyZWVuIHRvIHNob3cgRElCcyBpbiBmdWxsIHNjcmVlbi4KICoKICogRkxBR1MKICoKICogIERJU1BMQVlESUJfTk9QQUxFVFRFOiBkb24ndCBjaGFuZ2UgcGFsZXR0ZQogKiAgRElTUExBWURJQl9OT0NFTlRFUjogZG9uJ3QgY2VudGVyIGJpdG1hcAogKiAgRElTUExBWURJQl9OT1dBSVQ6IGRvbid0IHdhaXQgKGZvciBrZXlwcmVzcykgYmVmb3JlIHJldHVybmluZwogKiAgRElTUExBWURJQl9CRUdJTjogc3RhcnQgb2YgbXVsdGlwbGUgY2FsbHMgKGRvZXMgbm90IHJlc3RvcmUgdGhlIHNjcmVlbikKICogIERJU1BMQVlESUJfRU5EOiBlbmQgb2YgbXVsdGlwbGUgY2FsbHMgKHJlc3RvcmVzIHRoZSBzY3JlZW4pCiAqICBESVNQTEFZRElCX01PREVfREVGQVVMVDogZGVmYXVsdCBkaXNwbGF5IG1vZGUKICogIERJU1BMQVlESUJfTU9ERV8zMjB4MjAweDg6IFN0YW5kYXJkIFZHQSAzMjB4MjAwIDI1NiBjb2xvcnMKICogIERJU1BMQVlESUJfTU9ERV8zMjB4MjQweDg6IFR3ZWFrZWQgVkdBIDMyMHgyNDAgMjU2IGNvbG9ycwogKgogKiBSRVRVUk5TCiAqCiAqICBESVNQTEFZRElCX05PRVJST1I6IHN1Y2Nlc3MKICogIERJU1BMQVlESUJfTk9UU1VQUE9SVEVEOiBmdW5jdGlvbiBub3Qgc3VwcG9ydGVkCiAqICBESVNQTEFZRElCX0lOVkFMSURESUI6IG51bGwgb3IgaW52YWxpZCBESUIgaGVhZGVyCiAqICBESVNQTEFZRElCX0lOVkFMSURGT1JNQVQ6IGludmFsaWQgRElCIGZvcm1hdAogKiAgRElTUExBWURJQl9JTlZBTElEVEFTSzogbm90IGNhbGxlZCBmcm9tIGN1cnJlbnQgdGFzawogKgogKiBCVUdTCiAqCiAqICBXYWl0aW5nIGZvciBrZXlwcmVzc2VzIGlzIG5vdCBpbXBsZW1lbnRlZC4KICovCldPUkQgV0lOQVBJIERpc3BsYXlEaWIoCgkJTFBCSVRNQVBJTkZPIGxwYmksIC8qIERJQiBoZWFkZXIgd2l0aCByZXNvbHV0aW9uIGFuZCBwYWxldHRlICovCgkJTFBTVFIgbHBCaXRzLCAvKiBCaXRtYXAgYml0cyB0byBzaG93ICovCgkJV09SRCB3RmxhZ3MKCSkKewogICAgV09SRCByZXQ7CgogICAgaWYgKHdGbGFncyZESVNQTEFZRElCX0VORCkgewogICAgICAgIGlmIChkaXNwZGliX211bHRpKSBESVNQRElCX0VuZCgpOwogICAgICAgIGRpc3BkaWJfbXVsdGkgPSAwOwogICAgICAgIHJldHVybiBESVNQTEFZRElCX05PRVJST1I7CiAgICB9CiAgICBpZiAoIWRpc3BkaWJfbXVsdGkpIHsKICAgICAgICByZXQ9RElTUERJQl9CZWdpbih3RmxhZ3MpOwogICAgICAgIGlmIChyZXQpIHJldHVybiByZXQ7CiAgICB9CiAgICBpZiAod0ZsYWdzJkRJU1BMQVlESUJfQkVHSU4pIGRpc3BkaWJfbXVsdGkgPSAxOwogICAgaWYgKCEod0ZsYWdzJkRJU1BMQVlESUJfTk9QQUxFVFRFKSkgewogICAgICAgIERJU1BESUJfUGFsZXR0ZShscGJpKTsKICAgIH0KICAgIC8qIEZJWE1FOiBub3Qgc3VyZSBpZiBpdCdzIHZhbGlkIHRvIGRyYXcgaW1hZ2VzIGluIERJU1BMQVlESUJfQkVHSU4sIHNvLi4uICovCiAgICBpZiAobHBCaXRzKSB7CiAgICAgICAgRElTUERJQl9TaG93KCYobHBiaS0+Ym1pSGVhZGVyKSxscEJpdHMsd0ZsYWdzKTsKICAgIH0KICAgIGlmICghKHdGbGFncyZESVNQTEFZRElCX05PV0FJVCkpIHsKICAgICAgICBGSVhNRShkZHJhdywid2FpdCBub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgfQogICAgaWYgKCFkaXNwZGliX211bHRpKSBESVNQRElCX0VuZCgpOwogICAgcmV0dXJuIERJU1BMQVlESUJfTk9FUlJPUjsKfQo=