Lyogc3RhdGVtZW50LmMgLSB0aGUgc3RhdGVtZW50IHR5cGUNCiAqDQogKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+DQogKg0KICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuDQogKg0KICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQNCiAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMNCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuDQogKg0KICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0DQogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQogKg0KICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlDQogKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUNCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQ0KICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLg0KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCiAqLw0KDQojaW5jbHVkZSAic3RhdGVtZW50LmgiDQojaW5jbHVkZSAiY3Vyc29yLmgiDQojaW5jbHVkZSAiY29ubmVjdGlvbi5oIg0KI2luY2x1ZGUgIm1pY3JvcHJvdG9jb2xzLmgiDQojaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIg0KI2luY2x1ZGUgInNxbGl0ZWNvbXBhdC5oIg0KDQovKiBwcm90b3R5cGVzICovDQpzdGF0aWMgaW50IHB5c3FsaXRlX2NoZWNrX3JlbWFpbmluZ19zcWwoY29uc3QgY2hhciogdGFpbCk7DQoNCnR5cGVkZWYgZW51bSB7DQogICAgTElORUNPTU1FTlRfMSwNCiAgICBJTl9MSU5FQ09NTUVOVCwNCiAgICBDT01NRU5UU1RBUlRfMSwNCiAgICBJTl9DT01NRU5ULA0KICAgIENPTU1FTlRFTkRfMSwNCiAgICBOT1JNQUwNCn0gcGFyc2VfcmVtYWluaW5nX3NxbF9zdGF0ZTsNCg0KdHlwZWRlZiBlbnVtIHsNCiAgICBUWVBFX0lOVCwNCiAgICBUWVBFX0xPTkcsDQogICAgVFlQRV9GTE9BVCwNCiAgICBUWVBFX1NUUklORywNCiAgICBUWVBFX1VOSUNPREUsDQogICAgVFlQRV9CVUZGRVIsDQogICAgVFlQRV9VTktOT1dODQp9IHBhcmFtZXRlcl90eXBlOw0KDQppbnQgcHlzcWxpdGVfc3RhdGVtZW50X2NyZWF0ZShweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIFB5T2JqZWN0KiBzcWwpDQp7DQogICAgY29uc3QgY2hhciogdGFpbDsNCiAgICBpbnQgcmM7DQogICAgUHlPYmplY3QqIHNxbF9zdHI7DQogICAgY2hhciogc3FsX2NzdHI7DQoNCiAgICBzZWxmLT5zdCA9IE5VTEw7DQogICAgc2VsZi0+aW5fdXNlID0gMDsNCg0KICAgIGlmIChQeVN0cmluZ19DaGVjayhzcWwpKSB7DQogICAgICAgIHNxbF9zdHIgPSBzcWw7DQogICAgICAgIFB5X0lOQ1JFRihzcWxfc3RyKTsNCiAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzcWwpKSB7DQogICAgICAgIHNxbF9zdHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHNxbCk7DQogICAgICAgIGlmICghc3FsX3N0cikgew0KICAgICAgICAgICAgcmMgPSBQWVNRTElURV9TUUxfV1JPTkdfVFlQRTsNCiAgICAgICAgICAgIHJldHVybiByYzsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIHJjID0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEU7DQogICAgICAgIHJldHVybiByYzsNCiAgICB9DQoNCiAgICBzZWxmLT5pbl93ZWFrcmVmbGlzdCA9IE5VTEw7DQogICAgc2VsZi0+c3FsID0gc3FsX3N0cjsNCg0KICAgIHNxbF9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoc3FsX3N0cik7DQoNCiAgICBQeV9CRUdJTl9BTExPV19USFJFQURTDQogICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoY29ubmVjdGlvbi0+ZGIsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3FsX2NzdHIsDQogICAgICAgICAgICAgICAgICAgICAgICAgLTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWlsKTsNCiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUw0KDQogICAgc2VsZi0+ZGIgPSBjb25uZWN0aW9uLT5kYjsNCg0KICAgIGlmIChyYyA9PSBTUUxJVEVfT0sgJiYgcHlzcWxpdGVfY2hlY2tfcmVtYWluaW5nX3NxbCh0YWlsKSkgew0KICAgICAgICAodm9pZClzcWxpdGUzX2ZpbmFsaXplKHNlbGYtPnN0KTsNCiAgICAgICAgc2VsZi0+c3QgPSBOVUxMOw0KICAgICAgICByYyA9IFBZU1FMSVRFX1RPT19NVUNIX1NRTDsNCiAgICB9DQoNCiAgICByZXR1cm4gcmM7DQp9DQoNCmludCBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmLCBpbnQgcG9zLCBQeU9iamVjdCogcGFyYW1ldGVyLCBpbnQgYWxsb3dfOGJpdF9jaGFycykNCnsNCiAgICBpbnQgcmMgPSBTUUxJVEVfT0s7DQogICAgbG9uZyBsb25ndmFsOw0KICAgIFBZX0xPTkdfTE9ORyBsb25nbG9uZ3ZhbDsNCiAgICBjb25zdCBjaGFyKiBidWZmZXI7DQogICAgY2hhciogc3RyaW5nOw0KICAgIFB5X3NzaXplX3QgYnVmbGVuOw0KICAgIFB5T2JqZWN0KiBzdHJpbmd2YWw7DQogICAgcGFyYW1ldGVyX3R5cGUgcGFyYW10eXBlOw0KICAgIGNoYXIqIGM7DQoNCiAgICBpZiAocGFyYW1ldGVyID09IFB5X05vbmUpIHsNCiAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfbnVsbChzZWxmLT5zdCwgcG9zKTsNCiAgICAgICAgZ290byBmaW5hbDsNCiAgICB9DQoNCiAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7DQogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfSU5UOw0KICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgew0KICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0xPTkc7DQogICAgfSBlbHNlIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgew0KICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0ZMT0FUOw0KICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7DQogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfU1RSSU5HOw0KICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgew0KICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1VOSUNPREU7DQogICAgfSBlbHNlIGlmIChQeUJ1ZmZlcl9DaGVjayhwYXJhbWV0ZXIpKSB7DQogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfQlVGRkVSOw0KICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2socGFyYW1ldGVyKSkgew0KICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0lOVDsNCiAgICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVjayhwYXJhbWV0ZXIpKSB7DQogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfTE9ORzsNCiAgICB9IGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2socGFyYW1ldGVyKSkgew0KICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0ZMT0FUOw0KICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socGFyYW1ldGVyKSkgew0KICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1NUUklORzsNCiAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhwYXJhbWV0ZXIpKSB7DQogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfVU5JQ09ERTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1VOS05PV047DQogICAgfQ0KDQogICAgaWYgKHBhcmFtdHlwZSA9PSBUWVBFX1NUUklORyAmJiAhYWxsb3dfOGJpdF9jaGFycykgew0KICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcocGFyYW1ldGVyKTsNCiAgICAgICAgZm9yIChjID0gc3RyaW5nOyAqYyAhPSAwOyBjKyspIHsNCiAgICAgICAgICAgIGlmICgqYyAmIDB4ODApIHsNCiAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIllvdSBtdXN0IG5vdCB1c2UgOC1iaXQgYnl0ZXN0cmluZ3MgdW5sZXNzIHlvdSB1c2UgYSB0ZXh0X2ZhY3RvcnkgdGhhdCBjYW4gaW50ZXJwcmV0IDgtYml0IGJ5dGVzdHJpbmdzIChsaWtlIHRleHRfZmFjdG9yeSA9IHN0cikuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBpbnN0ZWFkIGp1c3Qgc3dpdGNoIHlvdXIgYXBwbGljYXRpb24gdG8gVW5pY29kZSBzdHJpbmdzLiIpOw0KICAgICAgICAgICAgICAgIHJjID0gLTE7DQogICAgICAgICAgICAgICAgZ290byBmaW5hbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHN3aXRjaCAocGFyYW10eXBlKSB7DQogICAgICAgIGNhc2UgVFlQRV9JTlQ6DQogICAgICAgICAgICBsb25ndmFsID0gUHlJbnRfQXNMb25nKHBhcmFtZXRlcik7DQogICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCAoc3FsaXRlX2ludDY0KWxvbmd2YWwpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgVFlQRV9MT05HOg0KICAgICAgICAgICAgbG9uZ2xvbmd2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyhwYXJhbWV0ZXIpOw0KICAgICAgICAgICAgLyogaW4gdGhlIG92ZXJmbG93IGVycm9yIGNhc2UsIGxvbmdsb25ndmFsIGlzIC0xLCBhbmQgYW4gZXhjZXB0aW9uIGlzIHNldCAqLw0KICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfaW50NjQoc2VsZi0+c3QsIHBvcywgKHNxbGl0ZV9pbnQ2NClsb25nbG9uZ3ZhbCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOg0KICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfZG91YmxlKHNlbGYtPnN0LCBwb3MsIFB5RmxvYXRfQXNEb3VibGUocGFyYW1ldGVyKSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBUWVBFX1NUUklORzoNCiAgICAgICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FTX1NUUklORyhwYXJhbWV0ZXIpOw0KICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIFRZUEVfVU5JQ09ERToNCiAgICAgICAgICAgIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocGFyYW1ldGVyKTsNCiAgICAgICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCk7DQogICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF90ZXh0KHNlbGYtPnN0LCBwb3MsIHN0cmluZywgLTEsIFNRTElURV9UUkFOU0lFTlQpOw0KICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBUWVBFX0JVRkZFUjoNCiAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocGFyYW1ldGVyLCAmYnVmZmVyLCAmYnVmbGVuKSA9PSAwKSB7DQogICAgICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfYmxvYihzZWxmLT5zdCwgcG9zLCBidWZmZXIsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsNCiAgICAgICAgICAgICAgICByYyA9IC0xOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgVFlQRV9VTktOT1dOOg0KICAgICAgICAgICAgcmMgPSAtMTsNCiAgICB9DQoNCmZpbmFsOg0KICAgIHJldHVybiByYzsNCn0NCg0KLyogcmV0dXJucyAwIGlmIHRoZSBvYmplY3QgaXMgb25lIG9mIFB5dGhvbidzIGludGVybmFsIG9uZXMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIGFkYXB0ZWQgKi8NCnN0YXRpYyBpbnQgX25lZWRfYWRhcHQoUHlPYmplY3QqIG9iaikNCnsNCiAgICBpZiAocHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkKSB7DQogICAgICAgIHJldHVybiAxOw0KICAgIH0NCg0KICAgIGlmIChQeUludF9DaGVja0V4YWN0KG9iaikgfHwgUHlMb25nX0NoZWNrRXhhY3Qob2JqKSANCiAgICAgICAgICAgIHx8IFB5RmxvYXRfQ2hlY2tFeGFjdChvYmopIHx8IFB5U3RyaW5nX0NoZWNrRXhhY3Qob2JqKQ0KICAgICAgICAgICAgfHwgUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSB8fCBQeUJ1ZmZlcl9DaGVjayhvYmopKSB7DQogICAgICAgIHJldHVybiAwOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAxOw0KICAgIH0NCn0NCg0Kdm9pZCBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtZXRlcnMsIGludCBhbGxvd184Yml0X2NoYXJzKQ0Kew0KICAgIFB5T2JqZWN0KiBjdXJyZW50X3BhcmFtOw0KICAgIFB5T2JqZWN0KiBhZGFwdGVkOw0KICAgIGNvbnN0IGNoYXIqIGJpbmRpbmdfbmFtZTsNCiAgICBpbnQgaTsNCiAgICBpbnQgcmM7DQogICAgaW50IG51bV9wYXJhbXNfbmVlZGVkOw0KICAgIGludCBudW1fcGFyYW1zOw0KDQogICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUw0KICAgIG51bV9wYXJhbXNfbmVlZGVkID0gc3FsaXRlM19iaW5kX3BhcmFtZXRlcl9jb3VudChzZWxmLT5zdCk7DQogICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMNCg0KICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QocGFyYW1ldGVycykgfHwgUHlMaXN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykgfHwgKCFQeURpY3RfQ2hlY2socGFyYW1ldGVycykgJiYgUHlTZXF1ZW5jZV9DaGVjayhwYXJhbWV0ZXJzKSkpIHsNCiAgICAgICAgLyogcGFyYW1ldGVycyBwYXNzZWQgYXMgc2VxdWVuY2UgKi8NCiAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgew0KICAgICAgICAgICAgbnVtX3BhcmFtcyA9IFB5VHVwbGVfR0VUX1NJWkUocGFyYW1ldGVycyk7DQogICAgICAgIH0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsNCiAgICAgICAgICAgIG51bV9wYXJhbXMgPSBQeUxpc3RfR0VUX1NJWkUocGFyYW1ldGVycyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBudW1fcGFyYW1zID0gUHlTZXF1ZW5jZV9TaXplKHBhcmFtZXRlcnMpOw0KICAgICAgICB9DQogICAgICAgIGlmIChudW1fcGFyYW1zICE9IG51bV9wYXJhbXNfbmVlZGVkKSB7DQogICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkluY29ycmVjdCBudW1iZXIgb2YgYmluZGluZ3Mgc3VwcGxpZWQuIFRoZSBjdXJyZW50IHN0YXRlbWVudCB1c2VzICVkLCBhbmQgdGhlcmUgYXJlICVkIHN1cHBsaWVkLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcmFtc19uZWVkZWQsIG51bV9wYXJhbXMpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFyYW1zOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsNCiAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWV0ZXJzLCBpKTsNCiAgICAgICAgICAgICAgICBQeV9YSU5DUkVGKGN1cnJlbnRfcGFyYW0pOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeUxpc3RfR0VUX0lURU0ocGFyYW1ldGVycywgaSk7DQogICAgICAgICAgICAgICAgUHlfWElOQ1JFRihjdXJyZW50X3BhcmFtKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYXJhbWV0ZXJzLCBpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghY3VycmVudF9wYXJhbSkgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCFfbmVlZF9hZGFwdChjdXJyZW50X3BhcmFtKSkgew0KICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBhZGFwdGVkID0gcHlzcWxpdGVfbWljcm9wcm90b2NvbHNfYWRhcHQoY3VycmVudF9wYXJhbSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgTlVMTCk7DQogICAgICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cnJlbnRfcGFyYW0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7DQogICAgICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoc2VsZiwgaSArIDEsIGFkYXB0ZWQsIGFsbG93XzhiaXRfY2hhcnMpOw0KICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOw0KDQogICAgICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7DQogICAgICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7DQogICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9JbnRlcmZhY2VFcnJvciwgIkVycm9yIGJpbmRpbmcgcGFyYW1ldGVyICVkIC0gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZS4iLCBpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBlbHNlIGlmIChQeURpY3RfQ2hlY2socGFyYW1ldGVycykpIHsNCiAgICAgICAgLyogcGFyYW1ldGVycyBwYXNzZWQgYXMgZGljdGlvbmFyeSAqLw0KICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG51bV9wYXJhbXNfbmVlZGVkOyBpKyspIHsNCiAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMNCiAgICAgICAgICAgIGJpbmRpbmdfbmFtZSA9IHNxbGl0ZTNfYmluZF9wYXJhbWV0ZXJfbmFtZShzZWxmLT5zdCwgaSk7DQogICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUw0KICAgICAgICAgICAgaWYgKCFiaW5kaW5nX25hbWUpIHsNCiAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkJpbmRpbmcgJWQgaGFzIG5vIG5hbWUsIGJ1dCB5b3Ugc3VwcGxpZWQgYSBkaWN0aW9uYXJ5ICh3aGljaCBoYXMgb25seSBuYW1lcykuIiwgaSk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBiaW5kaW5nX25hbWUrKzsgLyogc2tpcCBmaXJzdCBjaGFyICh0aGUgY29sb24pICovDQogICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsNCiAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcocGFyYW1ldGVycywgYmluZGluZ19uYW1lKTsNCiAgICAgICAgICAgICAgICBQeV9YSU5DUkVGKGN1cnJlbnRfcGFyYW0pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcocGFyYW1ldGVycywgKGNoYXIqKWJpbmRpbmdfbmFtZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIWN1cnJlbnRfcGFyYW0pIHsNCiAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIllvdSBkaWQgbm90IHN1cHBseSBhIHZhbHVlIGZvciBiaW5kaW5nICVkLiIsIGkpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCFfbmVlZF9hZGFwdChjdXJyZW50X3BhcmFtKSkgew0KICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBhZGFwdGVkID0gcHlzcWxpdGVfbWljcm9wcm90b2NvbHNfYWRhcHQoY3VycmVudF9wYXJhbSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgTlVMTCk7DQogICAgICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cnJlbnRfcGFyYW0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7DQogICAgICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoc2VsZiwgaSwgYWRhcHRlZCwgYWxsb3dfOGJpdF9jaGFycyk7DQogICAgICAgICAgICBQeV9ERUNSRUYoYWRhcHRlZCk7DQoNCiAgICAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsNCiAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAiRXJyb3IgYmluZGluZyBwYXJhbWV0ZXIgOiVzIC0gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZS4iLCBiaW5kaW5nX25hbWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicGFyYW1ldGVycyBhcmUgb2YgdW5zdXBwb3J0ZWQgdHlwZSIpOw0KICAgIH0NCn0NCg0KaW50IHB5c3FsaXRlX3N0YXRlbWVudF9yZWNvbXBpbGUocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1zKQ0Kew0KICAgIGNvbnN0IGNoYXIqIHRhaWw7DQogICAgaW50IHJjOw0KICAgIGNoYXIqIHNxbF9jc3RyOw0KICAgIHNxbGl0ZTNfc3RtdCogbmV3X3N0Ow0KDQogICAgc3FsX2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5zcWwpOw0KDQogICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUw0KICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNxbF9jc3RyLA0KICAgICAgICAgICAgICAgICAgICAgICAgIC0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgJnRhaWwpOw0KICAgIFB5X0VORF9BTExPV19USFJFQURTDQoNCiAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7DQogICAgICAgIC8qIFRoZSBlZmZpY2llbnQgc3FsaXRlM190cmFuc2Zlcl9iaW5kaW5ncyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBTUUxpdGUNCiAgICAgICAgICogdmVyc2lvbiAzLjIuMiBvciBsYXRlci4gRm9yIG9sZGVyIFNRTGl0ZSByZWxlYXNlcywgdGhhdCBtaWdodCBub3QNCiAgICAgICAgICogZXZlbiBkZWZpbmUgU1FMSVRFX1ZFUlNJT05fTlVNQkVSLCB3ZSBkbyBpdCB0aGUgbWFudWFsIHdheS4NCiAgICAgICAgICovDQogICAgICAgICNpZmRlZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVINCiAgICAgICAgI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAyMDAyDQogICAgICAgIC8qIFRoZSBjaGVjayBmb3IgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIG5lY2Vzc2FyeSB0byBub3QgdHJpZ2dlciBhDQogICAgICAgICAqIGJ1ZyBpbiBjZXJ0YWluIFNRTGl0ZSB2ZXJzaW9ucyAoZXhwZXJpZW5jZWQgaW4gMy4yLjggYW5kIDMuMy40KS4gKi8NCiAgICAgICAgaWYgKHNxbGl0ZTNfYmluZF9wYXJhbWV0ZXJfY291bnQoc2VsZi0+c3QpID4gMCkgew0KICAgICAgICAgICAgKHZvaWQpc3FsaXRlM190cmFuc2Zlcl9iaW5kaW5ncyhzZWxmLT5zdCwgbmV3X3N0KTsNCiAgICAgICAgfQ0KICAgICAgICAjZW5kaWYNCiAgICAgICAgI2Vsc2UNCiAgICAgICAgc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVycyhzZWxmLCBwYXJhbXMpOw0KICAgICAgICAjZW5kaWYNCg0KICAgICAgICAodm9pZClzcWxpdGUzX2ZpbmFsaXplKHNlbGYtPnN0KTsNCiAgICAgICAgc2VsZi0+c3QgPSBuZXdfc3Q7DQogICAgfQ0KDQogICAgcmV0dXJuIHJjOw0KfQ0KDQppbnQgcHlzcWxpdGVfc3RhdGVtZW50X2ZpbmFsaXplKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZikNCnsNCiAgICBpbnQgcmM7DQoNCiAgICByYyA9IFNRTElURV9PSzsNCiAgICBpZiAoc2VsZi0+c3QpIHsNCiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUw0KICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOw0KICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUw0KICAgICAgICBzZWxmLT5zdCA9IE5VTEw7DQogICAgfQ0KDQogICAgc2VsZi0+aW5fdXNlID0gMDsNCg0KICAgIHJldHVybiByYzsNCn0NCg0KaW50IHB5c3FsaXRlX3N0YXRlbWVudF9yZXNldChweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYpDQp7DQogICAgaW50IHJjOw0KDQogICAgcmMgPSBTUUxJVEVfT0s7DQoNCiAgICBpZiAoc2VsZi0+aW5fdXNlICYmIHNlbGYtPnN0KSB7DQogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMNCiAgICAgICAgcmMgPSBzcWxpdGUzX3Jlc2V0KHNlbGYtPnN0KTsNCiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMNCg0KICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7DQogICAgICAgICAgICBzZWxmLT5pbl91c2UgPSAwOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIHJjOw0KfQ0KDQp2b2lkIHB5c3FsaXRlX3N0YXRlbWVudF9tYXJrX2RpcnR5KHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZikNCnsNCiAgICBzZWxmLT5pbl91c2UgPSAxOw0KfQ0KDQp2b2lkIHB5c3FsaXRlX3N0YXRlbWVudF9kZWFsbG9jKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZikNCnsNCiAgICBpbnQgcmM7DQoNCiAgICBpZiAoc2VsZi0+c3QpIHsNCiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUw0KICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOw0KICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUw0KICAgIH0NCg0KICAgIHNlbGYtPnN0ID0gTlVMTDsNCg0KICAgIFB5X1hERUNSRUYoc2VsZi0+c3FsKTsNCg0KICAgIGlmIChzZWxmLT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKSB7DQogICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0KilzZWxmKTsNCiAgICB9DQoNCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7DQp9DQoNCi8qDQogKiBDaGVja3MgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCBpbiBhbiBTUUwgc3RyaW5nIGFmdGVyIFNRTGl0ZSBjb21waWxlZCBpdC4NCiAqIFRoaXMgaXMgdXNlZCB0byBjaGVjayBpZiBzb21lYm9keSB0cmllZCB0byBleGVjdXRlIG1vcmUgdGhhbiBvbmUgU1FMIGNvbW1hbmQNCiAqIHdpdGggb25lIGV4ZWN1dGUoKS9leGVjdXRlbWFueSgpIGNvbW1hbmQsIHdoaWNoIHRoZSBEQi1BUEkgYW5kIHdlIGRvbid0DQogKiBhbGxvdy4NCiAqDQogKiBSZXR1cm5zIDEgaWYgdGhlcmUgaXMgbW9yZSBsZWZ0IHRoYW4gc2hvdWxkIGJlLiAwIGlmIG9rLg0KICovDQpzdGF0aWMgaW50IHB5c3FsaXRlX2NoZWNrX3JlbWFpbmluZ19zcWwoY29uc3QgY2hhciogdGFpbCkNCnsNCiAgICBjb25zdCBjaGFyKiBwb3MgPSB0YWlsOw0KDQogICAgcGFyc2VfcmVtYWluaW5nX3NxbF9zdGF0ZSBzdGF0ZSA9IE5PUk1BTDsNCg0KICAgIGZvciAoOzspIHsNCiAgICAgICAgc3dpdGNoICgqcG9zKSB7DQogICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgICAgICBjYXNlICctJzoNCiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7DQogICAgICAgICAgICAgICAgICAgIHN0YXRlICA9IExJTkVDT01NRU5UXzE7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBMSU5FQ09NTUVOVF8xKSB7DQogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fTElORUNPTU1FTlQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnICc6DQogICAgICAgICAgICBjYXNlICdcdCc6DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdcbic6DQogICAgICAgICAgICBjYXNlIDEzOg0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBJTl9MSU5FQ09NTUVOVCkgew0KICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IE5PUk1BTDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICcvJzoNCiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7DQogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gQ09NTUVOVFNUQVJUXzE7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5URU5EXzEpIHsNCiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBOT1JNQUw7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5UU1RBUlRfMSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICcqJzoNCiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gTElORUNPTU1FTlRfMSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IENPTU1FTlRTVEFSVF8xKSB7DQogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fQ09NTUVOVDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOX0NPTU1FTlQpIHsNCiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBDT01NRU5URU5EXzE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQ09NTUVOVEVORF8xKSB7DQogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fQ09NTUVOVDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOX0xJTkVDT01NRU5UKSB7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9DT01NRU5UKSB7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcG9zKys7DQogICAgfQ0KDQogICAgcmV0dXJuIDA7DQp9DQoNClB5VHlwZU9iamVjdCBweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlID0gew0KICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkNCiAgICAgICAgTU9EVUxFX05BTUUgIi5TdGF0ZW1lbnQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLw0KICAgICAgICBzaXplb2YocHlzcWxpdGVfU3RhdGVtZW50KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8NCiAgICAgICAgKGRlc3RydWN0b3IpcHlzcWxpdGVfc3RhdGVtZW50X2RlYWxsb2MsICAgICAgICAgLyogdHBfZGVhbGxvYyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovDQogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgIC8qIHRwX2ZsYWdzICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLw0KICAgICAgICBvZmZzZXRvZihweXNxbGl0ZV9TdGF0ZW1lbnQsIGluX3dlYWtyZWZsaXN0KSwgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLw0KICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLw0KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovDQp9Ow0KDQpleHRlcm4gaW50IHB5c3FsaXRlX3N0YXRlbWVudF9zZXR1cF90eXBlcyh2b2lkKQ0Kew0KICAgIHB5c3FsaXRlX1N0YXRlbWVudFR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7DQogICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfU3RhdGVtZW50VHlwZSk7DQp9DQo=