LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBTQU0gU29mdHdhcmUgUGFja2FnZSBMaWNlbnNlDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEF0bWVsIENvcnBvcmF0aW9uDQogKg0KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqDQogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICoNCiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93Lg0KICoNCiAqIEF0bWVsJ3MgbmFtZSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAqDQogKiBESVNDTEFJTUVSOiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRQ0KICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLA0KICogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwNCiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCg0KLyoqDQogKiBcZmlsZQ0KICoNCiAqIEltcGxlbWVudGF0aW9uIG9mIG1lbW9yaWVzIGNvbmZpZ3VyYXRpb24gb24gYm9hcmQuDQogKg0KICovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgIEhlYWRlcnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAiYm9hcmQuaCINCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqIFxicmllZiBDb25maWd1cmVzIHRoZSBFQkkgZm9yIE5hbmRGbGFzaCBhY2Nlc3MuDQogKi8NCmV4dGVybiB2b2lkIEJPQVJEX0NvbmZpZ3VyZU5hbmRGbGFzaCggU21jKiBwU21jICkNCnsNCiAgICAvKiBFbmFibGUgcGVyaXBoZXJhbCBjbG9jayAqLw0KICAgIFBNQ19FbmFibGVQZXJpcGhlcmFsKCBJRF9TTUMgKSA7DQoNCiAgICAvKiBOQ1MwIGlzIGFzc2lnbmVkIHRvIGEgTkFORCBGbGFzaCAoTkFORE9FIGFuZCBOQU5XRSB1c2VkIGZvciBOQ1MwKSAqLw0KICAgIC8vIE1BVFJJWC0+TUFUUklYX1NGUls1XSA9IDE7DQoNCiAgICBwU21jLT5TTUNfQ1NfTlVNQkVSWzBdLlNNQ19TRVRVUCA9IA0KICAgICAgICAgIFNNQ19TRVRVUF9OV0VfU0VUVVAoMCkNCiAgICAgICAgfCBTTUNfU0VUVVBfTkNTX1dSX1NFVFVQKDEpDQogICAgICAgIHwgU01DX1NFVFVQX05SRF9TRVRVUCgwKQ0KICAgICAgICB8IFNNQ19TRVRVUF9OQ1NfUkRfU0VUVVAoMSk7DQoNCiAgICBwU21jLT5TTUNfQ1NfTlVNQkVSWzBdLlNNQ19QVUxTRSA9IA0KICAgICAgICAgIFNNQ19QVUxTRV9OV0VfUFVMU0UoMikNCiAgICAgICAgfCBTTUNfUFVMU0VfTkNTX1dSX1BVTFNFKDMpDQogICAgICAgIHwgU01DX1BVTFNFX05SRF9QVUxTRSg0KQ0KICAgICAgICB8IFNNQ19QVUxTRV9OQ1NfUkRfUFVMU0UoNCk7DQoNCiAgICBwU21jLT5TTUNfQ1NfTlVNQkVSWzBdLlNNQ19DWUNMRSA9IA0KICAgICAgICAgIFNNQ19DWUNMRV9OV0VfQ1lDTEUoNCkNCiAgICAgICAgfCBTTUNfQ1lDTEVfTlJEX0NZQ0xFKDcpOw0KDQogICAgcFNtYy0+U01DX0NTX05VTUJFUlswXS5TTUNfTU9ERSA9IA0KICAgICAgICAgIFNNQ19NT0RFX1JFQURfTU9ERQ0KICAgICAgICB8IFNNQ19NT0RFX1dSSVRFX01PREU7DQp9DQoNCi8qKg0KICogXGJyaWVmIENvbmZpZ3VyZXMgdGhlIEVCSSBmb3IgJU5vckZsYXNoIGFjY2Vzcy4NCiAqLw0KZXh0ZXJuIHZvaWQgQk9BUkRfQ29uZmlndXJlTm9yRmxhc2goIFNtYyogcFNtYyApDQp7DQogICAgLyogRW5hYmxlIHBlcmlwaGVyYWwgY2xvY2sgKi8NCiAgICBQTUNfRW5hYmxlUGVyaXBoZXJhbCggSURfU01DICkgOw0KDQogICAgLyogQ29uZmlndXJlIFNNQywgTkNTMCBpcyBhc3NpZ25lZCB0byBhIG5vcmZsYXNoICovDQogICAgcFNtYy0+U01DX0NTX05VTUJFUlswXS5TTUNfU0VUVVAgPSANCiAgICAgICAgICBTTUNfU0VUVVBfTldFX1NFVFVQKDIpDQogICAgICAgIHwgU01DX1NFVFVQX05DU19XUl9TRVRVUCgwKQ0KICAgICAgICB8IFNNQ19TRVRVUF9OUkRfU0VUVVAoMCkNCiAgICAgICAgfCBTTUNfU0VUVVBfTkNTX1JEX1NFVFVQKDApOw0KDQogICAgcFNtYy0+U01DX0NTX05VTUJFUlswXS5TTUNfUFVMU0UgPSANCiAgICAgICAgICBTTUNfUFVMU0VfTldFX1BVTFNFKDYpDQogICAgICAgIHwgU01DX1BVTFNFX05DU19XUl9QVUxTRSgweEEpDQogICAgICAgIHwgU01DX1BVTFNFX05SRF9QVUxTRSgweEEpDQogICAgICAgIHwgU01DX1BVTFNFX05DU19SRF9QVUxTRSgweEEpOw0KDQogICAgcFNtYy0+U01DX0NTX05VTUJFUlswXS5TTUNfQ1lDTEUgPSANCiAgICAgICAgICBTTUNfQ1lDTEVfTldFX0NZQ0xFKDB4QSkNCiAgICAgICAgfCBTTUNfQ1lDTEVfTlJEX0NZQ0xFKDB4QSk7DQoNCiAgICBwU21jLT5TTUNfQ1NfTlVNQkVSWzBdLlNNQ19NT0RFICA9IA0KICAgICAgICAgIFNNQ19NT0RFX1JFQURfTU9ERQ0KICAgICAgICB8IFNNQ19NT0RFX1dSSVRFX01PREUNCiAgICAgICAgfCBTTUNfTU9ERV9FWE5XX01PREVfRElTQUJMRUQNCiAgICAgICAgfCBTTUNfTU9ERV9UREZfQ1lDTEVTKDB4MSk7DQp9DQoNCi8qKg0KICogXGJyaWVmIEFuIGFjY3VyYXRlIG9uZS10by1vbmUgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkgYmV0d2VlbiBQU1JBTSBhbmQgU01DIHdhdmVmb3JtcyBmb3INCiAqICAgYSBjb21wbGV0ZSBTTUMgY29uZmlndXJhdGlvbi4NCiAqICBcbm90ZSBUaGUgc3lzdGVtIGlzIHJ1bm5pbmcgYXQgNDggTUh6IGZvciB0aGUgRUJJIEJ1cy4NCiAqICAgICAgICBQbGVhc2UgcmVmZXIgdG8gdGhlICJBQyBDaGFyYWN0ZXJpc3RpY3MiIHNlY3Rpb24gb2YgdGhlIGN1c3RvbWVyIHByb2R1Y3QgZGF0YXNoZWV0Lg0KICovDQpleHRlcm4gdm9pZCBCT0FSRF9Db25maWd1cmVQU1JBTSggU21jKiBwU21jICkNCnsNCiAgICB1aW50MzJfdCBkd1RtcCA7DQoNCiAgICAvKiBFbmFibGUgcGVyaXBoZXJhbCBjbG9jayAqLw0KICAgIFBNQ19FbmFibGVQZXJpcGhlcmFsKCBJRF9TTUMgKSA7DQoNCiAgICAvKiBDb25maWd1cmUgU01DLCBOQ1MxIGlzIGFzc2lnbmVkIHRvIGEgZXh0ZXJuYWwgUFNSQU0gKi8NCiAgICAvKioNCiAgICAgKiBQU1JBTSBJUzY2V1Y1MTIxNkJMTA0KICAgICAqIDU1IG5zIEFjY2VzcyB0aW1lDQogICAgICogdGRvZSA9IDI1IG5zIG1heA0KICAgICAqIFNNQzEgKHRpbWluZyBTQU0zUyByZWFkIG1vZGUgU01DKSA9IDIxIG5zIG9mIHNldHVwDQogICAgICogMjEgKyA1NSA9IDc2IG5zID0+IGF0IGxlYXN0IDUgY3ljbGVzIGF0IDY0IE1Ieg0KICAgICAqIFdyaXRlIHB1bHNlIHdpZHRoIG1pbmltdW0gPSA0NSBucyAoUFNSQU0pDQogICAgICovDQogICAgcFNtYy0+U01DX0NTX05VTUJFUlsxXS5TTUNfU0VUVVAgPSANCiAgICAgICAgICBTTUNfU0VUVVBfTldFX1NFVFVQKCAxICkNCiAgICAgICAgfCBTTUNfU0VUVVBfTkNTX1dSX1NFVFVQKCAwICkNCiAgICAgICAgfCBTTUNfU0VUVVBfTlJEX1NFVFVQKCAyICkNCiAgICAgICAgfCBTTUNfU0VUVVBfTkNTX1JEX1NFVFVQKCAwICkgOw0KDQogICAgcFNtYy0+U01DX0NTX05VTUJFUlsxXS5TTUNfUFVMU0UgPSANCiAgICAgICAgICBTTUNfUFVMU0VfTldFX1BVTFNFKCAzICkNCiAgICAgICAgfCBTTUNfUFVMU0VfTkNTX1dSX1BVTFNFKCA0ICkNCiAgICAgICAgfCBTTUNfUFVMU0VfTlJEX1BVTFNFKCAzICkNCiAgICAgICAgfCBTTUNfUFVMU0VfTkNTX1JEX1BVTFNFKCA1ICkgOw0KDQogICAgLyogTldFX0NZQ0xFOiAgICAgVGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSB3cml0ZSBjeWNsZS4NCiAgICAgICBOV0VfQ1lDTEUgPSBOV0VfU0VUVVAgKyBOV0VfUFVMU0UgKyBOV0VfSE9MRA0KICAgICAgID0gTkNTX1dSX1NFVFVQICsgTkNTX1dSX1BVTFNFICsgTkNTX1dSX0hPTEQNCiAgICAgICAodFdDKSBXcml0ZSBDeWNsZSBUaW1lIG1pbi4gNzBucw0KTlJEX0NZQ0xFOiAgICAgVGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSByZWFkIGN5Y2xlLg0KTlJEX0NZQ0xFID0gTlJEX1NFVFVQICsgTlJEX1BVTFNFICsgTlJEX0hPTEQNCj0gTkNTX1JEX1NFVFVQICsgTkNTX1JEX1BVTFNFICsgTkNTX1JEX0hPTEQNCih0UkMpIFJlYWQgQ3ljbGUgVGltZSBtaW4uIDcwbnMuICovDQogICAgcFNtYy0+U01DX0NTX05VTUJFUlsxXS5TTUNfQ1lDTEUgPSANCiAgICAgICAgICBTTUNfQ1lDTEVfTldFX0NZQ0xFKCA0ICkNCiAgICAgICAgfCBTTUNfQ1lDTEVfTlJEX0NZQ0xFKCA1ICkgOw0KDQogICAgZHdUbXAgPSBTTUMtPlNNQ19DU19OVU1CRVJbMF0uU01DX01PREU7DQogICAgcFNtYy0+U01DX0NTX05VTUJFUlsxXS5TTUNfTU9ERSAgPSBkd1RtcA0KICAgICAgICB8IFNNQ19NT0RFX1JFQURfTU9ERQ0KICAgICAgICB8IFNNQ19NT0RFX1dSSVRFX01PREU7DQp9DQoNCg0KdWludDMyX3QgRXh0UkFNX1ZhbGlkYXRpb24odWludDMyX3QgYmFzZUFkZHIsIHVpbnQzMl90IHNpemUpDQp7DQogICAgdWludDMyX3QgaTsNCiAgICB1aW50MzJfdCAqcHRyID0gKHVpbnQzMl90ICopIGJhc2VBZGRyOw0KDQogICAgZm9yIChpID0gMDsgaSA8IHNpemUgPDwgMjsgKytpKSB7DQoNCiAgICAgICAgaWYgKGkgJiAxKSB7DQogICAgICAgICAgICBwdHJbaV0gPSAweDU1QUE1NUFBIHwgKDEgPDwgaSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBwdHJbaV0gPSAweEFBNTVBQTU1IHwgKDEgPDwgaSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgIHNpemUgPDwgMjsgKytpKSB7DQogICAgICAgIGlmIChpICYgMSkgew0KICAgICAgICAgICAgaWYgKHB0cltpXSAhPSAoMHg1NUFBNTVBQSB8ICgxIDw8IGkpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgaWYgKHB0cltpXSAhPSAoMHhBQTU1QUE1NSB8ICgxIDw8IGkpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiAxOw0KfQ0KDQoNCiNkZWZpbmUgU0RSQU1fQkEwICgxIDw8IDIwKQ0KI2RlZmluZSBTRFJBTV9CQTEgKDEgPDwgMjEpDQoNCi8qKg0KICogXGJyaWVmIENvbmZpZ3VyZXMgdGhlIEVCSSBmb3IgU2RyYW0gKElTNDJTMTYxMDBFLTdCKSBhY2Nlc3MuDQogKi8NCg0KDQp2b2lkIEJPQVJEX0NvbmZpZ3VyZVNkcmFtKCB2b2lkICkNCnsNCiAgICBjb25zdCBQaW4gcGluc1NkcmFtW10gPSB7Qk9BUkRfU0RSQU1fUElOU307DQogICAgdm9sYXRpbGUgdWludDMyX3QgaTsNCiAgICB2b2xhdGlsZSB1aW50OF90ICpwU2RyYW0gPSAodWludDhfdCAqKSBTRFJBTV9DU19BRERSOw0KDQogICAgLyogQ29uZmlndXJlIFBJTyAqLw0KICAgIFBJT19Db25maWd1cmUocGluc1NkcmFtLCBQSU9fTElTVFNJWkUocGluc1NkcmFtKSk7DQogICAgUE1DX0VuYWJsZVBlcmlwaGVyYWwoSURfU0RSQU1DKTsNCiAgICAqKCh1aW50MzJfdCAqKTB4NDAwODgxMjQpID0gMHgxMDsNCg0KICAgIC8qIDEuIFNEUkFNIGZlYXR1cmVzIG11c3QgYmUgc2V0IGluIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOiBhc3luY2hyb25vdXMgdGltaW5ncyAoVFJDLCBUUkFTLCBldGMuKSwgbnVtYmVyDQogICAgICAgb2YgY29sdW1ucywgcm93cywgQ0FTIGxhdGVuY3ksIGFuZCB0aGUgZGF0YSBidXMgd2lkdGguICovDQogICAgU0RSQU1DLT5TRFJBTUNfQ1IgPSANCiAgICAgICAgICBTRFJBTUNfQ1JfTkNfQ09MOCAgICAvLyA4IGNvbHVtbiBiaXRzIA0KICAgICAgICB8IFNEUkFNQ19DUl9OUl9ST1cxMSAgIC8vIDEyIHJvdyBiaXRzICg0SykNCiAgICAgICAgfCBTRFJBTUNfQ1JfQ0FTX0xBVEVOQ1kzICAgICAgICAgICAgICAvLyBDQVMgTGF0ZW5jeSAyDQogICAgICAgIHwgU0RSQU1DX0NSX05CX0JBTksyICAgICAgICAgICAgICAgICAgLy8gMiBiYW5rcw0KICAgICAgICB8IFNEUkFNQ19DUl9EQlcgICAgICAgICAgICAgICAgICAgICAgIC8vIDE2IGJpdA0KICAgICAgICB8IFNEUkFNQ19DUl9UV1IoMikNCiAgICAgICAgfCBTRFJBTUNfQ1JfVFJDX1RSRkMoOSkgLy8gNjNucyAgIG1pbg0KICAgICAgICB8IFNEUkFNQ19DUl9UUlAoMykgLy8gQ29tbWFuZCBwZXJpb2QgKFBSRSB0byBBQ1QpIDIxIG5zIG1pbg0KICAgICAgICB8IFNEUkFNQ19DUl9UUkNEKDMpIC8vIEFjdGl2ZSBDb21tYW5kIHRvIHJlYWQvV3JpdGUgQ29tbWFuZCBkZWxheSB0aW1lIDIxbnMgbWluIA0KICAgICAgICB8IFNEUkFNQ19DUl9UUkFTKDYpIC8vIENvbW1hbmQgcGVyaW9kIChBQ1QgdG8gUFJFKSAgNDJucyBtaW4gDQogICAgICAgIHwgU0RSQU1DX0NSX1RYU1IoMTBVKTsgLy9FeGl0IHNlbGYtcmVmcmVzaCB0byBhY3RpdmUgdGltZSAgNzBucyBNaW4NCg0KICAgIC8qIDIuIEZvciBtb2JpbGUgU0RSQU0sIHRlbXBlcmF0dXJlLWNvbXBlbnNhdGVkIHNlbGYgcmVmcmVzaCAoVENTUiksIGRyaXZlIHN0cmVuZ3RoIChEUykgYW5kIHBhcnRpYWwgYXJyYXkNCiAgICAgICBzZWxmIHJlZnJlc2ggKFBBU1IpIG11c3QgYmUgc2V0IGluIHRoZSBMb3cgUG93ZXIgUmVnaXN0ZXIuICovDQoNCiAgICAvKiAzLiBUaGUgU0RSQU0gbWVtb3J5IHR5cGUgbXVzdCBiZSBzZXQgaW4gdGhlIE1lbW9yeSBEZXZpY2UgUmVnaXN0ZXIuKi8NCiAgICBTRFJBTUMtPlNEUkFNQ19NRFIgPSBTRFJBTUNfTURSX01EX1NEUkFNOw0KDQogICAgLyogNC4gQSBtaW5pbXVtIHBhdXNlIG9mIDIwMCCmzHMgaXMgcHJvdmlkZWQgdG8gcHJlY2VkZSBhbnkgc2lnbmFsIHRvZ2dsZS4qLw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKyk7DQoNCiAgICAvKiA1LiAoMSlBIE5PUCBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgU0RSQU0gZGV2aWNlcy4gVGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IE1vZGUgdG8gMSBpbiB0aGUgTW9kZQ0KICAgICAgIFJlZ2lzdGVyIGFuZCBwZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIGFueSBTRFJBTSBhZGRyZXNzLiovDQogICAgU0RSQU1DLT5TRFJBTUNfTVIgPSBTRFJBTUNfTVJfTU9ERV9OT1A7DQogICAgKnBTZHJhbSA9IDA7DQogICAgZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKTsNCiAgICAvKiA2LiBBbiBBbGwgQmFua3MgUHJlY2hhcmdlIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBTRFJBTSBkZXZpY2VzLiBUaGUgYXBwbGljYXRpb24gbXVzdCBzZXQgTW9kZSB0byAyIGluDQogICAgICAgdGhlIE1vZGUgUmVnaXN0ZXIgYW5kIHBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8gYW55IFNEUkFNIGFkZHJlc3MuICovDQogICAgU0RSQU1DLT5TRFJBTUNfTVIgPSBTRFJBTUNfTVJfTU9ERV9BTExCQU5LU19QUkVDSEFSR0U7DQogICAgKnBTZHJhbSA9IDA7DQogICAgZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKTsNCiAgICAvKiA3LiBFaWdodCBhdXRvLXJlZnJlc2ggKENCUikgY3ljbGVzIGFyZSBwcm92aWRlZC4gVGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IHRoZSBNb2RlIHRvIDQgaW4gdGhlIE1vZGUgUmVnaXN0ZXINCiAgICAgICBhbmQgcGVyZm9ybSBhIHdyaXRlIGFjY2VzcyB0byBhbnkgU0RSQU0gbG9jYXRpb24gZWlnaHQgdGltZXMuKi8NCiAgICBmb3IgKGkgPSAwIDsgaTwgODsgaSsrKSB7DQogICAgICAgIFNEUkFNQy0+U0RSQU1DX01SID0gU0RSQU1DX01SX01PREVfQVVUT19SRUZSRVNIOw0KICAgICAgICAqcFNkcmFtID0gMDsNCiAgICB9DQogICAgZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKTsNCiAgICAvKjguIEEgTW9kZSBSZWdpc3RlciBzZXQgKE1SUykgY3ljbGUgaXMgaXNzdWVkIHRvIHByb2dyYW0gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIFNEUkFNIGRldmljZXMsIGluIHBhcnRpY3VsYXINCiAgICAgIENBUyBsYXRlbmN5IGFuZCBidXJzdCBsZW5ndGguIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCBNb2RlIHRvIDMgaW4gdGhlIE1vZGUgUmVnaXN0ZXIgYW5kIHBlcmZvcm0gYSB3cml0ZQ0KICAgICAgYWNjZXNzIHRvIHRoZSBTRFJBTS4gVGhlIHdyaXRlIGFkZHJlc3MgbXVzdCBiZSBjaG9zZW4gc28gdGhhdCBCQVsxOjBdIGFyZSBzZXQgdG8gMC4gRm9yIGV4YW1wbGUsIHdpdGggYQ0KICAgICAgMTYtYml0IDEyOCBNQiBTRFJBTSAoMTIgcm93cywgOSBjb2x1bW5zLCA0IGJhbmtzKSBiYW5rIGFkZHJlc3MsIHRoZSBTRFJBTSB3cml0ZSBhY2Nlc3Mgc2hvdWxkIGJlDQogICAgICBkb25lIGF0IHRoZSBhZGRyZXNzIDB4NzAwMDAwMDAuKi8NCiAgICBTRFJBTUMtPlNEUkFNQ19NUiA9IFNEUkFNQ19NUl9NT0RFX0xPQURfTU9ERVJFRzsNCiAgICAqcFNkcmFtID0gMDsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKyk7DQogICAgLyo5LiBGb3IgbW9iaWxlIFNEUkFNIGluaXRpYWxpemF0aW9uLCBhbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUykgY3ljbGUgaXMgaXNzdWVkIHRvIHByb2dyYW0gdGhlDQogICAgICBTRFJBTSBwYXJhbWV0ZXJzIChUQ1NSLCBQQVNSLCBEUykuIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCBNb2RlIHRvIDUgaW4gdGhlIE1vZGUgUmVnaXN0ZXIgYW5kDQogICAgICBwZXJmb3JtIGEgd3JpdGUgYWNjZXNzIHRvIHRoZSBTRFJBTS4gVGhlIHdyaXRlIGFkZHJlc3MgbXVzdCBiZSBjaG9zZW4gc28gdGhhdCBCQVsxXSBvciBCQVswXSBhcmUgc2V0IHRvIDEuDQogICAgICBGb3IgZXhhbXBsZSwgd2l0aCBhIDE2LWJpdCAxMjggTUIgU0RSQU0sICgxMiByb3dzLCA5IGNvbHVtbnMsIDQgYmFua3MpIGJhbmsgYWRkcmVzcyB0aGUgU0RSQU0gd3JpdGUNCiAgICAgIGFjY2VzcyBzaG91bGQgYmUgZG9uZSBhdCB0aGUgYWRkcmVzcyAweDcwODAwMDAwIG9yIDB4NzA0MDAwMDAuICovDQogICAgLy9TRFJBTUMtPlNEUkFNQ19NUiA9IFNEUkFNQ19NUl9NT0RFX0VYVF9MT0FEX01PREVSRUc7DQogICAgLy8gKigodWludDhfdCAqKShwU2RyYW0gKyBTRFJBTV9CQTApKSA9IDA7DQoNCiAgICAvKiAxMC4gVGhlIGFwcGxpY2F0aW9uIG11c3QgZ28gaW50byBOb3JtYWwgTW9kZSwgc2V0dGluZyBNb2RlIHRvIDAgaW4gdGhlIE1vZGUgUmVnaXN0ZXIgYW5kIHBlcmZvcm1pbmcgYSB3cml0ZQ0KICAgICAgIGFjY2VzcyBhdCBhbnkgbG9jYXRpb24gaW4gdGhlIFNEUkFNLiAqLw0KICAgIFNEUkFNQy0+U0RSQU1DX01SID0gU0RSQU1DX01SX01PREVfTk9STUFMOw0KICAgICpwU2RyYW0gPSAwOw0KICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKyk7DQogICAgLyogMTEuIFdyaXRlIHRoZSByZWZyZXNoIHJhdGUgaW50byB0aGUgY291bnQgZmllbGQgaW4gdGhlIFNEUkFNQyBSZWZyZXNoIFRpbWVyIHJlZ2lzdGVyLiAoUmVmcmVzaCByYXRlID0gZGVsYXkNCiAgICAgICBiZXR3ZWVuIHJlZnJlc2ggY3ljbGVzKS4gVGhlIFNEUkFNIGRldmljZSByZXF1aXJlcyBhIHJlZnJlc2ggZXZlcnkgMTUuNjI1IKbMcyBvciA3LjgxIKbMcy4gV2l0aCBhIDEwMCBNSHoNCiAgICAgICBmcmVxdWVuY3ksIHRoZSBSZWZyZXNoIFRpbWVyIENvdW50ZXIgUmVnaXN0ZXIgbXVzdCBiZSBzZXQgd2l0aCB0aGUgdmFsdWUgMTU2MigxNS42MjUgpsxzIHggMTAwIE1Ieikgb3INCiAgICAgICA3ODEoNy44MSCmzHMgeCAxMDAgTUh6KS4gKi8NCiAgICAvLyBGb3IgSVM0MlMxNjEwMEUsIDIwNDggcmVmcmVzaCBjeWNsZSBldmVyeSAzMm1zLCBldmVyeSAxNS42MjUgpsxzDQogICAgU0RSQU1DLT5TRFJBTUNfVFIgPSAyMDExOyAvLzE1NjI7DQogICAgU0RSQU1DLT5TRFJBTUNfQ1IxIHw9IDE8PDg7DQogICAgLyogQWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHRoZSBTRFJBTSBkZXZpY2VzIGFyZSBmdWxseSBmdW5jdGlvbmFsLiAqLw0KfQ0K