IyAtKi1NYWtlZmlsZS0qLSB0byBidWlsZCBHTlUgbWFrZSBvbiBWTVMKIwojIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKIyAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBNYWtlLgojCiMgR05VIE1ha2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKIyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEdOVSBNYWtlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQojIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCiMgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCiMgR05VIE1ha2U7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KCiMgVk1TIGV4dGVuc2lvbnMgZnJvbSBHTlUgTWFrZSAzLjYwIGltcG9ydGVkIGJ5CiMgIEtsYXVzIEvkbXBmIChra2FlbXBmQHJtaS5kZSkKIyBNb2RpZmllZCBmb3IgdmVyc2lvbiAzLjc4LjEgYnkgSGFydG11dC5CZWNrZXJAY29tcGFxLmNvbS4KIyBNb2RpZmllZCBmb3IgdmVyc2lvbiAzLjgwIGJ5IHppbnNlckBkZWN1cy5kZQojIE1vZGlmaWVkIGZvciB2ZXJzaW9uIDMuODEgYnkgSGFydG11dCBCZWNrZXIKCkNDID0gY2MKQ1AgPSBjb3B5CgolLm9iajogJS5jCgkkKENDKSAkKENGTEFHUykvb2JqPSRAICQ8CiMKIwlNYWtlZmlsZSBmb3IgR05VIE1ha2UKIwoKaWZlcSAoJChDQyksY2MpCkNGTEFHUyA9ICQoZGVmaW5lcykgL2luY2x1ZGU9KFtdLFsuZ2xvYl0pL3ByZWZpeD0oYWxsLGV4Y2VwdD0oZ2xvYixnbG9iZnJlZSkpL3N0YW5kYXJkPXJlbGF4ZWQvd2Fybj0oZGlzYWJsZT1xdWVzdGNvbXBhcmUpCmVsc2UKQ0ZMQUdTID0gJChkZWZpbmVzKSAvaW5jbHVkZT0oW10sWy5nbG9iXSkKZW5kaWYKI0xERkxBR1MgPSAvZGViCkxERkxBR1MgPQoKaWZlcSAoJChDQyksY2MpCmRlZmluZXMgPSAvZGVmaW5lPSgidW5saW5rPXJlbW92ZSIsIkhBVkVfQ09ORklHX0giLCJWTVMiLCJhbGxvY2F0ZWRfdmFyaWFibGVfZXhwYW5kX2Zvcl9maWxlPWFsbG9jX3Zhcl9leHBhbmRfZm9yX2ZpbGUiKQplbHNlCmlmZXEgKCQoQVJDSCksVkFYKQpkZWZpbmVzID0gL2RlZmluZT0oIkhBVkVfQ09ORklHX0giLCJHQ0NfSVNfTkFUSVZFIiwiVkFYIikKZWxzZQpkZWZpbmVzID0gL2RlZmluZT0oIkhBVkVfQ09ORklHX0giLCJHQ0NfSVNfTkFUSVZFIikKZW5kaWYKZW5kaWYKCkxPQURfQVZHID0gL2RlZmluZT0iTk9fTERBViIKCiMgSWYgeW91IGRvbid0IHdhbnQgYXJjaGl2ZSBzdXBwb3J0LCBjb21tZW50IHRoZXNlIG91dC4KQVJDSElWRVMgPSAsYXIub2JqLGFyc2Nhbi5vYmoKQVJDSElWRVNfU1JDID0gYXIuYyBhcnNjYW4uYwoKIyBJZiB5b3VyIHN5c3RlbSBuZWVkcyBleHRyYSBsaWJyYXJpZXMgbG9hZGVkIGluLCBkZWZpbmUgdGhlbSBoZXJlLgojIFN5c3RlbSBWIHByb2JhYmx5IG5lZWQgLWxQVyBmb3IgYWxsb2NhLgojIGlmIG9uIHZheCwgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZQojTE9BRExJQkVTID0gLGMub3B0L29wdAppZmVxICgkKENDKSxjYykKI0xPQURMSUJFUyA9LHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKQ1JUMCA9CmVsc2UKTE9BRExJQkVTID0sZ251X2NjX2xpYnJhcnk6bGliZ2NjLm9sYi9saWIKZW5kaWYKCiMgSWYgeW91ciBzeXN0ZW0gZG9lc24ndCBoYXZlIGFsbG9jYSwgb3IgdGhlIG9uZSBwcm92aWRlZCBpcyBiYWQsCiMgZ2V0IGl0IGZyb20gdGhlIEVtYWNzIGRpc3RyaWJ1dGlvbiBhbmQgZGVmaW5lIHRoZXNlLgojQUxMT0NBID0gLGFsbG9jYS5vYmoKI0FMTE9DQVNSQyA9IGFsbG9jYS5jCgojIElmIHRoZXJlIGFyZSByZW1vdGUgZXhlY3V0aW9uIGZhY2lsaXRpZXMgZGVmaW5lZCwKIyBlbmFibGUgdGhlbSB3aXRoIHN3aXRjaGVzIGhlcmUgKHNlZSByZW1vdGUtKi5jKS4KUkVNT1RFID0KCiMgQW55IGV4dHJhIG9iamVjdCBmaWxlcyB5b3VyIHN5c3RlbSBuZWVkcy4KZXh0cmFzID0gLHNpZ25hbWUub2JqLHJlbW90ZS1zdHViLm9iaix2bXNmdW5jdGlvbnMub2JqLHZtc2lmeS5vYmoKIyxkaXJlY3Rvcnkub2JqCiMgYXMgYW4gYWx0ZXJuYXRpdmU6Cmdsb2IgPSAsWy5nbG9iXWdsb2Iub2JqLFsuZ2xvYl1mbm1hdGNoLm9iagpnZXRvcHQgPSAsZ2V0b3B0Lm9iaixnZXRvcHQxLm9iagojIERpcmVjdG9yeSB0byBpbnN0YWxsIGBtYWtlJyBpbi4KYmluZGlyID0gW10KIyBEaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgbWFuIHBhZ2UgaW4uCm1hbmRpciA9IFtdCiMgTnVtYmVyIHRvIHB1dCBvbiB0aGUgbWFuIHBhZ2UgZmlsZW5hbWUuCm1hbmV4dCA9IDEKCm9ianMgPSBjb21tYW5kcy5vYmosam9iLm9iaixkaXIub2JqLGZpbGUub2JqLG1pc2Mub2JqLGhhc2gub2JqLFwKICAgICAgIG1haW4ub2JqLHJlYWQub2JqLHJlbWFrZS5vYmoscnVsZS5vYmosaW1wbGljaXQub2JqLFwKICAgICAgIGRlZmF1bHQub2JqLHZhcmlhYmxlLm9iaixleHBhbmQub2JqLGZ1bmN0aW9uLm9iaixzdHJjYWNoZS5vYmosXAogICAgICAgdnBhdGgub2JqLHZlcnNpb24ub2JqJChBUkNISVZFUykkKEFMTE9DQSkkKGV4dHJhcykkKGdldG9wdCkkKGdsb2IpCnNyY3MgPSBjb21tYW5kcy5jIGpvYi5jIGRpci5jIGZpbGUuYyBtaXNjLmMgIGhhc2guYyBcCgltYWluLmMgcmVhZC5jIHJlbWFrZS5jIHJ1bGUuYyBpbXBsaWNpdC5jIFwKCWRlZmF1bHQuYyB2YXJpYWJsZS5jIGV4cGFuZC5jIGZ1bmN0aW9uLmMgc3RyY2FjaGUuYyBcCgl2cGF0aC5jIHZlcnNpb24uYyB2bXNmdW5jdGlvbnMuYyB2bXNpZnkuYyAkKEFSQ0hJVkVTX1NSQykgJChBTExPQ0FTUkMpIFwKCWNvbW1hbmRzLmggZGVwLmggZmlsZWRlZi5oIGpvYi5oIG1ha2UuaCBydWxlLmggdmFyaWFibGUuaAoKCi5QSE9OWTogYWxsIGRvYwphbGw6IGNvbmZpZy5oIG1ha2UuZXhlCgpkb2M6IG1ha2UuaW5mbyBtYWtlLmR2aQoKCm1ha2UuZXhlOiAkKG9ianMpCgkkKExEKSQoTERGTEFHUykvZXhlPSRAICReJChMT0FETElCRVMpJChDUlQwKQoKLlBIT05ZOiBjbGVhbiByZWFsY2xlYW4KY2xlYW46CgkkJCBwdXJnZSBbLi4uXQoJLSQoUk0pIG1ha2UuZXhlOywqLm9iajsKCS0kKFJNKSBbLmdsb2JdKi5vYmo7CgojIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGRlcGVuZGVuY2llcy4KY29tbWFuZHMub2JqOiBjb21tYW5kcy5jIG1ha2UuaCBkZXAuaCBjb21tYW5kcy5oIGZpbGVkZWYuaCB2YXJpYWJsZS5oIGpvYi5oCmpvYi5vYmo6IGpvYi5jIHZtc2pvYnMuYyBtYWtlLmggY29tbWFuZHMuaCBqb2IuaCBmaWxlZGVmLmggdmFyaWFibGUuaApkaXIub2JqOiBkaXIuYyBtYWtlLmgKZmlsZS5vYmo6IGZpbGUuYyBtYWtlLmggY29tbWFuZHMuaCBkZXAuaCBmaWxlZGVmLmggdmFyaWFibGUuaAptaXNjLm9iajogbWlzYy5jIG1ha2UuaCBkZXAuaApoYXNoLm9iajogaGFzaC5jIG1ha2UuaCBoYXNoLmgKc3RyY2FjaGUub2JqOiBzdHJjYWNoZS5jIG1ha2UuaCBoYXNoLmgKbWFpbi5vYmo6IG1haW4uYyBtYWtlLmggY29tbWFuZHMuaCBkZXAuaCBmaWxlZGVmLmggdmFyaWFibGUuaCBqb2IuaApyZWFkLm9iajogcmVhZC5jIG1ha2UuaCBjb21tYW5kcy5oIGRlcC5oIGZpbGVkZWYuaCB2YXJpYWJsZS5oCnJlbWFrZS5vYmo6IHJlbWFrZS5jIG1ha2UuaCBjb21tYW5kcy5oIGpvYi5oIGRlcC5oIGZpbGVkZWYuaApydWxlLm9iajogcnVsZS5jIG1ha2UuaCBjb21tYW5kcy5oIGRlcC5oIGZpbGVkZWYuaCB2YXJpYWJsZS5oIHJ1bGUuaAppbXBsaWNpdC5vYmo6IGltcGxpY2l0LmMgbWFrZS5oIHJ1bGUuaCBkZXAuaCBmaWxlZGVmLmgKZGVmYXVsdC5vYmo6IGRlZmF1bHQuYyBtYWtlLmggcnVsZS5oIGRlcC5oIGZpbGVkZWYuaCBjb21tYW5kcy5oIHZhcmlhYmxlLmgKdmFyaWFibGUub2JqOiB2YXJpYWJsZS5jIG1ha2UuaCBjb21tYW5kcy5oIHZhcmlhYmxlLmggZGVwLmggZmlsZWRlZi5oCmV4cGFuZC5vYmo6IGV4cGFuZC5jIG1ha2UuaCBjb21tYW5kcy5oIGZpbGVkZWYuaCB2YXJpYWJsZS5oCmZ1bmN0aW9uLm9iajogZnVuY3Rpb24uYyBtYWtlLmggdmFyaWFibGUuaCBkZXAuaCBjb21tYW5kcy5oIGpvYi5oCnZwYXRoLm9iajogdnBhdGguYyBtYWtlLmggZmlsZWRlZi5oIHZhcmlhYmxlLmgKdmVyc2lvbi5vYmo6IHZlcnNpb24uYyBjb25maWcuaAphcnNjYW4ub2JqOiBhcnNjYW4uYwphci5vYmo6IGFyLmMgbWFrZS5oIGZpbGVkZWYuaApzaWduYW1lLm9iajogc2lnbmFtZS5jCnJlbW90ZS1zdHViLm9iajogcmVtb3RlLXN0dWIuYwpbLmdsb2JdZ2xvYi5vYmo6IFsuZ2xvYl1nbG9iLmMKWy5nbG9iXWZubWF0Y2gub2JqOiBbLmdsb2JdZm5tYXRjaC5jCmdldG9wdC5vYmo6IGdldG9wdC5jCmdldG9wdDEub2JqOiBnZXRvcHQxLmMKdm1zZnVuY3Rpb25zLm9iajogdm1zZnVuY3Rpb25zLmMgbWFrZS5oIHZtc2Rpci5oCnZtc2lmeS5vYmo6IHZtc2lmeS5jIG1ha2UuaAoKY29uZmlnLmg6IGNvbmZpZy5oLXZtcwoJJChDUCkgJDwgJEAK