IyAtKi1NYWtlZmlsZS0qLSB0byBidWlsZCBHTlUgbWFrZSBvbiBWTVMKIwojIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBNYWtlLgojCiMgR05VIE1ha2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKIyB2ZXJzaW9uLgojCiMgR05VIE1ha2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCiMgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKIyBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAojIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KCiMgVk1TIGV4dGVuc2lvbnMgZnJvbSBHTlUgTWFrZSAzLjYwIGltcG9ydGVkIGJ5CiMgIEtsYXVzIEvkbXBmIChra2FlbXBmQHJtaS5kZSkKIyBNb2RpZmllZCBmb3IgdmVyc2lvbiAzLjc4LjEgYnkgSGFydG11dC5CZWNrZXJAY29tcGFxLmNvbS4KIyBNb2RpZmllZCBmb3IgdmVyc2lvbiAzLjgwIGJ5IHppbnNlckBkZWN1cy5kZQojIE1vZGlmaWVkIGZvciB2ZXJzaW9ucyAzLjgxLCAzLjk5LjkwIGJ5IEhhcnRtdXQgQmVja2VyCgpDQyA9IGNjCkNQID0gY29weQoKJS5vYmo6ICUuYwoJJChDQykgJChDRkxBR1MpL29iaj0kQCAkPAojCiMJTWFrZWZpbGUgZm9yIEdOVSBNYWtlCiMKCmlmZXEgKCQoQ0MpLGNjKQpDRkxBR1MgPSAkKGRlZmluZXMpIC9pbmNsdWRlPShbXSxbLmdsb2JdKS9wcmVmaXg9KGFsbCxleGNlcHQ9KGdsb2IsZ2xvYmZyZWUpKS9zdGFuZGFyZD1yZWxheGVkL3dhcm49KGRpc2FibGU9cXVlc3Rjb21wYXJlKQplbHNlCkNGTEFHUyA9ICQoZGVmaW5lcykgL2luY2x1ZGU9KFtdLFsuZ2xvYl0pCmVuZGlmCiNMREZMQUdTID0gL2RlYgpMREZMQUdTID0KCmlmZXEgKCQoQ0MpLGNjKQpkZWZpbmVzID0gL2RlZmluZT0oInVubGluaz1yZW1vdmUiLCJIQVZFX0NPTkZJR19IIiwiVk1TIiwiYWxsb2NhdGVkX3ZhcmlhYmxlX2V4cGFuZF9mb3JfZmlsZT1hbGxvY192YXJfZXhwYW5kX2Zvcl9maWxlIikKZWxzZQppZmVxICgkKEFSQ0gpLFZBWCkKZGVmaW5lcyA9IC9kZWZpbmU9KCJIQVZFX0NPTkZJR19IIiwiR0NDX0lTX05BVElWRSIsIlZBWCIpCmVsc2UKZGVmaW5lcyA9IC9kZWZpbmU9KCJIQVZFX0NPTkZJR19IIiwiR0NDX0lTX05BVElWRSIpCmVuZGlmCmVuZGlmCgpMT0FEX0FWRyA9IC9kZWZpbmU9Ik5PX0xEQVYiCgojIElmIHlvdSBkb24ndCB3YW50IGFyY2hpdmUgc3VwcG9ydCwgY29tbWVudCB0aGVzZSBvdXQuCkFSQ0hJVkVTID0gLGFyLm9iaixhcnNjYW4ub2JqCkFSQ0hJVkVTX1NSQyA9IGFyLmMgYXJzY2FuLmMKCiMgSWYgeW91ciBzeXN0ZW0gbmVlZHMgZXh0cmEgbGlicmFyaWVzIGxvYWRlZCBpbiwgZGVmaW5lIHRoZW0gaGVyZS4KIyBTeXN0ZW0gViBwcm9iYWJseSBuZWVkIC1sUFcgZm9yIGFsbG9jYS4KIyBpZiBvbiB2YXgsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUKI0xPQURMSUJFUyA9ICxjLm9wdC9vcHQKaWZlcSAoJChDQyksY2MpCiNMT0FETElCRVMgPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCkNSVDAgPQplbHNlCkxPQURMSUJFUyA9LGdudV9jY19saWJyYXJ5OmxpYmdjYy5vbGIvbGliCmVuZGlmCgojIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBhbGxvY2EsIG9yIHRoZSBvbmUgcHJvdmlkZWQgaXMgYmFkLAojIGdldCBpdCBmcm9tIHRoZSBFbWFjcyBkaXN0cmlidXRpb24gYW5kIGRlZmluZSB0aGVzZS4KI0FMTE9DQSA9ICxhbGxvY2Eub2JqCiNBTExPQ0FTUkMgPSBhbGxvY2EuYwoKIyBJZiB0aGVyZSBhcmUgcmVtb3RlIGV4ZWN1dGlvbiBmYWNpbGl0aWVzIGRlZmluZWQsCiMgZW5hYmxlIHRoZW0gd2l0aCBzd2l0Y2hlcyBoZXJlIChzZWUgcmVtb3RlLSouYykuClJFTU9URSA9CgojIEFueSBleHRyYSBvYmplY3QgZmlsZXMgeW91ciBzeXN0ZW0gbmVlZHMuCmV4dHJhcyA9ICxzaWduYW1lLm9iaixyZW1vdGUtc3R1Yi5vYmosdm1zZnVuY3Rpb25zLm9iaix2bXNpZnkub2JqCiMsZGlyZWN0b3J5Lm9iagojIGFzIGFuIGFsdGVybmF0aXZlOgpnbG9iID0gLFsuZ2xvYl1nbG9iLm9iaixbLmdsb2JdZm5tYXRjaC5vYmoKZ2V0b3B0ID0gLGdldG9wdC5vYmosZ2V0b3B0MS5vYmoKIyBEaXJlY3RvcnkgdG8gaW5zdGFsbCAnbWFrZScgaW4uCmJpbmRpciA9IFtdCiMgRGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIG1hbiBwYWdlIGluLgptYW5kaXIgPSBbXQojIE51bWJlciB0byBwdXQgb24gdGhlIG1hbiBwYWdlIGZpbGVuYW1lLgptYW5leHQgPSAxCgpndWlsZSA9ICxndWlsZS5vYmoKCm9ianMgPSBjb21tYW5kcy5vYmosam9iLm9iaixvdXRwdXQub2JqLGRpci5vYmosZmlsZS5vYmosbWlzYy5vYmosaGFzaC5vYmosXAogICAgICAgbG9hZC5vYmosbWFpbi5vYmoscmVhZC5vYmoscmVtYWtlLm9iaixydWxlLm9iaixpbXBsaWNpdC5vYmosXAogICAgICAgZGVmYXVsdC5vYmosdmFyaWFibGUub2JqLGV4cGFuZC5vYmosZnVuY3Rpb24ub2JqLHN0cmNhY2hlLm9iaixcCiAgICAgICB2cGF0aC5vYmosdmVyc2lvbi5vYmokKGd1aWxlKVwKICAgICAgICQoQVJDSElWRVMpJChBTExPQ0EpJChleHRyYXMpJChnZXRvcHQpJChnbG9iKQoKc3JjcyA9IGNvbW1hbmRzLmMgam9iLmMgb3V0cHV0LmMgZGlyLmMgZmlsZS5jIG1pc2MuYyBndWlsZS5jIGhhc2guYyBcCglsb2FkLmMgbWFpbi5jIHJlYWQuYyByZW1ha2UuYyBydWxlLmMgaW1wbGljaXQuYyBcCglkZWZhdWx0LmMgdmFyaWFibGUuYyBleHBhbmQuYyBmdW5jdGlvbi5jIHN0cmNhY2hlLmMgXAoJdnBhdGguYyB2ZXJzaW9uLmMgdm1zZnVuY3Rpb25zLmMgdm1zaWZ5LmMgJChBUkNISVZFU19TUkMpICQoQUxMT0NBU1JDKSBcCgljb21tYW5kcy5oIGRlcC5oIGZpbGVkZWYuaCBqb2IuaCBvdXRwdXQuaCBtYWtlaW50LmggcnVsZS5oIHZhcmlhYmxlLmgKCgouUEhPTlk6IGFsbCBkb2MKYWxsOiBjb25maWcuaCBtYWtlLmV4ZQoKZG9jOiBtYWtlLmluZm8gbWFrZS5kdmkKCgptYWtlLmV4ZTogJChvYmpzKQoJJChMRCkkKExERkxBR1MpL2V4ZT0kQCAkXiQoTE9BRExJQkVTKSQoQ1JUMCkKCi5QSE9OWTogY2xlYW4gcmVhbGNsZWFuCmNsZWFuOgoJLXB1cmdlIFsuLi5dCgktJChSTSkgbWFrZS5leGU7LCoub2JqOwoJLSQoUk0pIFsuZ2xvYl0qLm9iajsKCmFyLm9iajogYXIuYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBmaWxlZGVmLmggaGFzaC5oIGRlcC5oIFwKICAgICBbLmdsb2JdZm5tYXRjaC5oCmFyc2Nhbi5vYmo6IGFyc2Nhbi5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oCmNvbW1hbmRzLm9iajogY29tbWFuZHMuYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBmaWxlZGVmLmggXAogICAgIGhhc2guaCBkZXAuaCB2YXJpYWJsZS5oIGpvYi5oIG91dHB1dC5oIGNvbW1hbmRzLmgKZGVmYXVsdC5vYmo6IGRlZmF1bHQuYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBmaWxlZGVmLmggXAogICAgIGhhc2guaCB2YXJpYWJsZS5oIHJ1bGUuaCBkZXAuaCBqb2IuaCBvdXRwdXQuaCBjb21tYW5kcy5oCmRpci5vYmo6IGRpci5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oIGhhc2guaCBmaWxlZGVmLmggXAogICAgIGRlcC5oIFsuZ2xvYl1nbG9iLmgKZXhwYW5kLm9iajogZXhwYW5kLmMgbWFrZWludC5oIGNvbmZpZy5oIGdudW1ha2UuaCBnZXR0ZXh0LmggZmlsZWRlZi5oIFwKICAgICBoYXNoLmggam9iLmggb3V0cHV0LmggY29tbWFuZHMuaCB2YXJpYWJsZS5oIHJ1bGUuaApmaWxlLm9iajogZmlsZS5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oIGZpbGVkZWYuaCBoYXNoLmggXAogICAgIGRlcC5oIGpvYi5oIG91dHB1dC5oIGNvbW1hbmRzLmggdmFyaWFibGUuaCBkZWJ1Zy5oClsuZ2xvYl1mbm1hdGNoLm9iajogWy5nbG9iXWZubWF0Y2guYyBjb25maWcuaCBbLmdsb2JdZm5tYXRjaC5oCmZ1bmN0aW9uLm9iajogZnVuY3Rpb24uYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBmaWxlZGVmLmggXAogICAgIGhhc2guaCB2YXJpYWJsZS5oIGRlcC5oIGpvYi5oIG91dHB1dC5oIGNvbW1hbmRzLmggZGVidWcuaApnZXRvcHQub2JqOiBnZXRvcHQuYyBjb25maWcuaCBnZXR0ZXh0LmggZ2V0b3B0LmgKZ2V0b3B0MS5vYmo6IGdldG9wdDEuYyBjb25maWcuaCBnZXRvcHQuaApbLmdsb2JdZ2xvYi5vYmo6IFsuZ2xvYl1nbG9iLmMgY29uZmlnLmggWy5nbG9iXWZubWF0Y2guaCBbLmdsb2JdZ2xvYi5oCmd1aWxlLm9iajogZ3VpbGUuYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaApoYXNoLm9iajogaGFzaC5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oIGhhc2guaAppbXBsaWNpdC5vYmo6IGltcGxpY2l0LmMgbWFrZWludC5oIGNvbmZpZy5oIGdudW1ha2UuaCBnZXR0ZXh0LmggZmlsZWRlZi5oIFwKICAgICBoYXNoLmggcnVsZS5oIGRlcC5oIGRlYnVnLmggdmFyaWFibGUuaCBqb2IuaCBvdXRwdXQuaCBjb21tYW5kcy5oCmpvYi5vYmo6IGpvYi5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oIGpvYi5oIG91dHB1dC5oIGRlYnVnLmggXAogICAgIGZpbGVkZWYuaCBoYXNoLmggY29tbWFuZHMuaCB2YXJpYWJsZS5oIGRlYnVnLmggdm1zam9icy5jCmxvYWQub2JqOiBsb2FkLmMgbWFrZWludC5oIGNvbmZpZy5oIGdudW1ha2UuaCBnZXR0ZXh0LmgKbWFpbi5vYmo6IG1haW4uYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBmaWxlZGVmLmggaGFzaC5oIFwKICAgICBkZXAuaCB2YXJpYWJsZS5oIGpvYi5oIG91dHB1dC5oIGNvbW1hbmRzLmggcnVsZS5oIGRlYnVnLmggZ2V0b3B0LmgKbWlzYy5vYmo6IG1pc2MuYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBmaWxlZGVmLmggaGFzaC5oIFwKICAgICBkZXAuaCBkZWJ1Zy5oCm91dHB1dC5vYmo6IG91dHB1dC5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oIGpvYi5oIG91dHB1dC5oCnJlYWQub2JqOiByZWFkLmMgbWFrZWludC5oIGNvbmZpZy5oIGdudW1ha2UuaCBnZXR0ZXh0LmggWy5nbG9iXWdsb2IuaCBcCiAgICAgZmlsZWRlZi5oIGhhc2guaCBkZXAuaCBqb2IuaCBvdXRwdXQuaCBjb21tYW5kcy5oIHZhcmlhYmxlLmggcnVsZS5oIFwKICAgICBkZWJ1Zy5oCnJlbWFrZS5vYmo6IHJlbWFrZS5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oIGZpbGVkZWYuaCBcCiAgICAgaGFzaC5oIGpvYi5oIG91dHB1dC5oIGNvbW1hbmRzLmggZGVwLmggdmFyaWFibGUuaCBkZWJ1Zy5oCnJlbW90ZS1zdHViLm9iajogcmVtb3RlLXN0dWIuYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBcCiAgICAgZmlsZWRlZi5oIGhhc2guaCBqb2IuaCBvdXRwdXQuaCBjb21tYW5kcy5oCnJ1bGUub2JqOiBydWxlLmMgbWFrZWludC5oIGNvbmZpZy5oIGdudW1ha2UuaCBnZXR0ZXh0LmggZmlsZWRlZi5oIGhhc2guaCBcCiAgICAgZGVwLmggam9iLmggb3V0cHV0LmggY29tbWFuZHMuaCB2YXJpYWJsZS5oIHJ1bGUuaApzaWduYW1lLm9iajogc2lnbmFtZS5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oCnN0cmNhY2hlLm9iajogc3RyY2FjaGUuYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBoYXNoLmgKdmFyaWFibGUub2JqOiB2YXJpYWJsZS5jIG1ha2VpbnQuaCBjb25maWcuaCBnbnVtYWtlLmggZ2V0dGV4dC5oIGZpbGVkZWYuaCBcCiAgICAgaGFzaC5oIGRlcC5oIGpvYi5oIG91dHB1dC5oIGNvbW1hbmRzLmggdmFyaWFibGUuaCBydWxlLmgKdmVyc2lvbi5vYmo6IHZlcnNpb24uYyBjb25maWcuaAp2bXNmdW5jdGlvbnMub2JqOiB2bXNmdW5jdGlvbnMuYyBtYWtlaW50LmggY29uZmlnLmggZ251bWFrZS5oIGdldHRleHQuaCBcCiAgICAgZGVidWcuaCBqb2IuaCBvdXRwdXQuaCB2bXNkaXIuaAp2bXNpZnkub2JqOiB2bXNpZnkuYwp2cGF0aC5vYmo6IHZwYXRoLmMgbWFrZWludC5oIGNvbmZpZy5oIGdudW1ha2UuaCBnZXR0ZXh0LmggZmlsZWRlZi5oIGhhc2guaCBcCiAgICAgdmFyaWFibGUuaAoKY29uZmlnLmg6IGNvbmZpZy5oLXZtcwoJJChDUCkgJDwgJEAK