LyoKICogV2luZSBNZXNzYWdlIENvbXBpbGVyIGxhbmd1YWdlIGFuZCBjb2RlcGFnZSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwIEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgIndtYy5oIgojaW5jbHVkZSAibGFuZy5oIgoKCi8qCiAqIExhbmd1YWdlcyBzdXBwb3J0ZWQKICoKICogTVVTVCBiZSBzb3J0aW5nIGFzY2VuZGluZyBvbiBsYW5ndWFnZSBJRAogKi8Kc3RhdGljIGNvbnN0IGxhbmd1YWdlX3QgbGFuZ3VhZ2VzW10gPSB7CgoJezB4MDQwMiwgODY2LCAxMjUxLCAiQnVsZ2FyaWFuIiwgIkJ1bGdhcmlhIn0sCgl7MHgwNDAzLCA4NTAsIDEyNTIsICJDYXRhbGFuIiwgIlNwYWluIn0sCgl7MHgwNDA1LCA4NTIsIDEyNTAsICJDemVjaCIsICJDemVjaCBSZXB1YmxpYyJ9LAoJezB4MDQwNiwgODUwLCAxMjUyLCAiRGFuaXNoIiwgIkRlbm1hcmsifSwKCXsweDA0MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJHZXJtYW55In0sCgl7MHgwNDA4LCA3MzcsIDEyNTMsICJHcmVlayIsICJHcmVlY2UifSwKCXsweDA0MDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiVW5pdGVkIFN0YXRlcyJ9LAoJezB4MDQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCAtIFRyYWRpdGlvbmFsIFNvcnQiLCAiU3BhaW4ifSwKCXsweDA0MEIsIDg1MCwgMTI1MiwgIkZpbm5pc2giLCAiRmlubGFuZCJ9LAoJezB4MDQwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkZyYW5jZSJ9LAoJezB4MDQwRSwgODUyLCAxMjUwLCAiSHVuZ2FyaWFuIiwgIkh1bmdhcnkifSwKCXsweDA0MEYsIDg1MCwgMTI1MiwgIkljZWxhbmRpYyIsICJJY2VsYW5kIn0sCgl7MHgwNDEwLCA4NTAsIDEyNTIsICJJdGFsaWFuIiwgIkl0YWx5In0sCgl7MHgwNDExLCA5MzIsICA5MzIsICJKYXBhbmVzZSIsICJKYXBhbiJ9LAoJezB4MDQxMiwgOTQ5LCAgOTQ5LCAiS29yZWFuIiwgIktvcmVhIChzb3V0aCkifSwKCXsweDA0MTMsIDg1MCwgMTI1MiwgIkR1dGNoIiwgIk5ldGhlcmxhbmRzIn0sCgl7MHgwNDE0LCA4NTAsIDEyNTIsICJOb3J3ZWdpYW4gKEJva23lbCkiLCAiTm9yd2F5In0sCgl7MHgwNDE1LCA4NTIsIDEyNTAsICJQb2xpc2giLCAiUG9sYW5kIn0sCgl7MHgwNDE2LCA4NTAsIDEyNTIsICJQb3J0dWd1ZXNlIiwgIkJyYXppbCJ9LAoJezB4MDQxOCwgODUyLCAxMjUwLCAiUm9tYW5pYW4iLCAiUm9tYW5pYSJ9LAoJezB4MDQxOSwgODY2LCAxMjUxLCAiUnVzc2lhbiIsICJSdXNzaWEifSwKCXsweDA0MUEsIDg1MiwgMTI1MCwgIkNyb2F0aWFuIiwgIkNyb2F0aWEifSwKCXsweDA0MUIsIDg1MiwgMTI1MCwgIlNsb3ZhayIsICJTbG92YWtpYSJ9LAoJezB4MDQxQywgODUyLCAxMjUwLCAiQWxiYW5pYW4iLCAiQWxiYW5pYSJ9LAoJezB4MDQxRCwgODUwLCAxMjUyLCAiU3dlZGlzaCIsICJTd2VkZW4ifSwKCXsweDA0MUYsIDg1NywgMTI1NCwgIlR1cmtpc2giLCAiVHVya2V5In0sCgl7MHgwNDIxLCA4NTAsIDEyNTIsICJJbmRvbmVzaWFuIiwgIkluZG9uZXNpYSJ9LAoJezB4MDQyMiwgODY2LCAxMjUxLCAiVWtyYWluaWFuIiwgIlVrcmFpbmUifSwKCXsweDA0MjMsIDg2NiwgMTI1MSwgIkJlbGFydXNpYW4iLCAiQmVsYXJ1cyJ9LAoJezB4MDQyNCwgODUyLCAxMjUwLCAiU2xvdmVuZSIsICJTbG92ZW5pYSJ9LAoJezB4MDQyNSwgNzc1LCAxMjU3LCAiRXN0b25pYW4iLCAiRXN0b25pYSJ9LAoJezB4MDQyNiwgNzc1LCAxMjU3LCAiTGF0dmlhbiIsICJMYXR2aWEifSwKCXsweDA0MjcsIDc3NSwgMTI1NywgIkxpdGh1YW5pYW4iLCAiTGl0aHVhbmlhIn0sCi8qCXsweDA0MkEsICAgPywgICAgPywgIlZpZXRuYW1lc2UiLCAiVmlldG5hbSJ9LCovCgl7MHgwNDJELCA4NTAsIDEyNTIsICJCYXNxdWUiLCAiU3BhaW4ifSwKCXsweDA0MkYsIDg2NiwgMTI1MSwgIk1hY2Vkb25pYW4iLCAiRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYSJ9LAoJezB4MDQzNiwgODUwLCAxMjUyLCAiQWZyaWthYW5zIiwgIlNvdXRoIEFmcmljYSJ9LAovKgl7MHgwNDM4LCA4NTIsIDEyNTIsICJGYXJvZXNlIiwgIkZhcm9lIElzbGFuZHMifSwgRklYTUU6IE5vdCBzdXJlIGFib3V0IGNvZGVwYWdlcyAqLwoJezB4MDQzQywgNDM3LCAxMjUyLCAiSXJpc2giLCAiSXJlbGFuZCJ9LAoJezB4MDQzRSwgODUwLCAxMjUyLCAiTWFsYXkiLCAiTWFsYXlzaWEifSwKLyoJezB4MDQ4RiwgICA/LCAgICA/LCAiRXNwZXJhbnRvIiwgIjxub25lPiJ9LCovCgl7MHgwODA0LCA5MzYsICA5MzYsICJDaGluZXNlIChQZW9wbGUncyByZXB1YmxpYyBvZiBDaGluYSkiLCAiUGVvcGxlJ3MgcmVwdWJsaWMgb2YgQ2hpbmEifSwKCXsweDA4MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJTd2l0emVybGFuZCJ9LAoJezB4MDgwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJVbml0ZWQgS2luZ2RvbSJ9LAoJezB4MDgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJNZXhpY28ifSwKCXsweDA4MEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJCZWxnaXVtIn0sCgl7MHgwODEwLCA4NTAsIDEyNTIsICJJdGFsaWFuIiwgIlN3aXR6ZXJsYW5kIn0sCgl7MHgwODEzLCA4NTAsIDEyNTIsICJEdXRjaCIsICJCZWxnaXVtIn0sCgl7MHgwODE0LCA4NTAsIDEyNTIsICJOb3J3ZWdpYW4gKE55bm9yc2spIiwgIk5vcndheSJ9LAoJezB4MDgxNiwgODUwLCAxMjUyLCAiUG9ydHVndWVzZSIsICJQb3J0dWdhbCJ9LAovKgl7MHgwODFBLCAgID8sICAgID8sICJTZXJiaWFuIChsYXRpbikiLCAiWXVnb3NsYXZpYSJ9LCovCgl7MHgwODFELCA4NTAsIDEyNTIsICJTd2VkaXNoIChGaW5sYW5kKSIsICJGaW5sYW5kIn0sCgl7MHgwQzA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiQXVzdHJpYSJ9LAoJezB4MEMwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJBdXN0cmFsaWEifSwKCXsweDBDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2ggLSBJbnRlcm5hdGlvbmFsIFNvcnQiLCAiU3BhaW4ifSwKCXsweDBDMEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJDYW5hZGEifSwKCXsweDBDMUEsIDg1NSwgMTI1MSwgIlNlcmJpYW4gKEN5cmlsbGljKSIsICJTZXJiaWEifSwKCXsweDEwMDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJMdXhlbWJvdXJnIn0sCgl7MHgxMDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkNhbmFkYSJ9LAoJezB4MTAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJHdWF0ZW1hbGEifSwKCXsweDEwMEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJTd2l0emVybGFuZCJ9LAoJezB4MTQwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkxpZWNodGVuc3RlaW4ifSwKCXsweDE0MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiTmV3IFplYWxhbmQifSwKCXsweDE0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ29zdGEgUmljYSJ9LAoJezB4MTQwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkx1eGVtYm91cmcifSwKCXsweDE4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiSXJlbGFuZCJ9LAoJezB4MTgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQYW5hbWEifSwKCXsweDFDMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiU291dGggQWZyaWNhIn0sCgl7MHgxQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkRvbWluaWNhbiBSZXB1YmxpYyJ9LAoJezB4MjAwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJKYW1haWNhIn0sCgl7MHgyMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlZlbmV6dWVsYSJ9LAoJezB4MjQwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJDYXJpYmJlYW4ifSwKCXsweDI0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ29sb21iaWEifSwKCXsweDI4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQmVsaXplIn0sCgl7MHgyODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlBlcnUifSwKCXsweDJDMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiVHJpbmlkYWQgJiBUb2JhZ28ifSwKCXsweDJDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQXJnZW50aW5hIn0sCgl7MHgzMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkVjdWFkb3IifSwKCXsweDM0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ2hpbGUifSwKCXsweDM4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiVXJ1Z3VheSJ9LAoJezB4M0MwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQYXJhZ3VheSJ9LAoJezB4NDAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJCb2xpdmlhIn0sCgl7MHg0NDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkVsIFNhbHZhZG9yIn0sCgl7MHg0ODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkhvbmR1cmFzIn0sCgl7MHg0QzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIk5pY2FyYWd1YSJ9LAoJezB4NTAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQdWVydG8gUmljbyJ9Cn07CgojZGVmaW5lIE5MQU4JKHNpemVvZihsYW5ndWFnZXMpL3NpemVvZihsYW5ndWFnZXNbMF0pKQoKdm9pZCBzaG93X2xhbmd1YWdlcyh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCXByaW50ZigiIENvZGUgIHwgRE9TLWNwIHwgV0lOLWNwIHwgICBMYW5ndWFnZSAgIHwgQ291bnRyeVxuIik7CglwcmludGYoIi0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tXG4iKTsKCWZvcihpID0gMDsgaSA8IE5MQU47IGkrKykKCQlwcmludGYoIjB4JTA0eCB8ICU1ZCAgfCAlNWQgICB8ICUtMTJzIHwgJXNcbiIsCgkJCWxhbmd1YWdlc1tpXS5pZCwKCQkJbGFuZ3VhZ2VzW2ldLmRvc2NwLAoJCQlsYW5ndWFnZXNbaV0ud2luY3AsCgkJCWxhbmd1YWdlc1tpXS5uYW1lLAoJCQlsYW5ndWFnZXNbaV0uY291bnRyeSk7Cn0KCnN0YXRpYyBpbnQgbGFuZ2NtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCnsKCXJldHVybiAqKHVuc2lnbmVkICopcDEgLSAoKGxhbmd1YWdlX3QgKilwMiktPmlkOwp9Cgpjb25zdCBsYW5ndWFnZV90ICpmaW5kX2xhbmd1YWdlKHVuc2lnbmVkIGlkKQp7CglyZXR1cm4gKGNvbnN0IGxhbmd1YWdlX3QgKilic2VhcmNoKCZpZCwgbGFuZ3VhZ2VzLCBOTEFOLCBzaXplb2YobGFuZ3VhZ2VzWzBdKSwgbGFuZ2NtcCk7Cn0KCnZvaWQgc2hvd19jb2RlcGFnZXModm9pZCkKewoJdW5zaWduZWQgaTsKCWNvbnN0IHVuaW9uIGNwdGFibGUgKmNwcDsKCXByaW50ZigiQ29kZXBhZ2VzOlxuIik7Cglmb3IoaSA9IDA7IChjcHAgPSB3aW5lX2NwX2VudW1fdGFibGUoaSkpOyBpKyspCgl7CgkJcHJpbnRmKCIlLTVkICVzXG4iLCBjcHAtPmluZm8uY29kZXBhZ2UsIGNwcC0+aW5mby5uYW1lKTsKCX0KfQoKY29uc3QgdW5pb24gY3B0YWJsZSAqZmluZF9jb2RlcGFnZShpbnQgaWQpCnsKCXJldHVybiB3aW5lX2NwX2dldF90YWJsZShpZCk7Cn0K