ZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCA2NzYxNGZkLi5hNTNkY2VkIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC01LDcgKzUsNyBAQAogSW50cm9kdWN0aW9uDQogLS0tLS0tLS0tLS0tDQogDQotU3dpZnRTaGFkZXIgaXMgYSBoaWdoLXBlcmZvcm1hbmNlIENQVS1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVnVsa2FuLCBPcGVuR0wgRVMsIGFuZCBEaXJlY3QzRCA5IGdyYXBoaWNzIEFQSXM8c3VwPjE8L3N1cD48c3VwPjI8L3N1cD4uIEl0cyBnb2FsIGlzIHRvIHByb3ZpZGUgaGFyZHdhcmUgaW5kZXBlbmRlbmNlIGZvciBhZHZhbmNlZCAzRCBncmFwaGljcy4NCitTd2lmdFNoYWRlciBpcyBhIGhpZ2gtcGVyZm9ybWFuY2UgQ1BVLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBWdWxrYW4gYW5kIE9wZW5HTCBFUyBncmFwaGljcyBBUElzPHN1cD4xPC9zdXA+PHN1cD4yPC9zdXA+LiBJdHMgZ29hbCBpcyB0byBwcm92aWRlIGhhcmR3YXJlIGluZGVwZW5kZW5jZSBmb3IgYWR2YW5jZWQgM0QgZ3JhcGhpY3MuDQogDQogQnVpbGRpbmcNCiAtLS0tLS0tLQ0KQEAgLTEwOCw1ICsxMDgsNSBAQAogLS0tLS0tLS0tLQ0KIA0KIDEuIFRyYWRlbWFya3MgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4NCi0yLiBXZSBkbyBub3QgY2xhaW0gb2ZmaWNpYWwgY29uZm9ybWFuY2Ugd2l0aCB0aGUgRGlyZWN0M0QgYW5kIE9wZW5HTCBncmFwaGljcyBBUElzIGF0IHRoaXMgbW9tZW50Lg0KKzIuIFdlIGRvIG5vdCBjbGFpbSBvZmZpY2lhbCBjb25mb3JtYW5jZSB3aXRoIHRoZSBPcGVuR0wgZ3JhcGhpY3MgQVBJIGF0IHRoaXMgbW9tZW50Lg0KIDMuIFRoaXMgaXMgbm90IGFuIG9mZmljaWFsIEdvb2dsZSBwcm9kdWN0Lg0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvRGlyZWN0M0QvZDNkOC5oIGIvaW5jbHVkZS9EaXJlY3QzRC9kM2Q4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MDAyODIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9EaXJlY3QzRC9kM2Q4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjc5ICswLDAgQEAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT07DQotICoNCi0gKiAgQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqDQotICogIEZpbGU6ICAgZDNkOC5oDQotICogIENvbnRlbnQ6ICAgIERpcmVjdDNEIGluY2x1ZGUgZmlsZQ0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2lmbmRlZiBfRDNEOF9IXw0KLSNkZWZpbmUgX0QzRDhfSF8NCi0NCi0jaWZuZGVmIERJUkVDVDNEX1ZFUlNJT04NCi0jZGVmaW5lIERJUkVDVDNEX1ZFUlNJT04gICAgICAgICAweDA4MDANCi0jZW5kaWYgIC8vRElSRUNUM0RfVkVSU0lPTg0KLQ0KLS8vIGluY2x1ZGUgdGhpcyBmaWxlIGNvbnRlbnQgb25seSBpZiBjb21waWxpbmcgZm9yIERYOCBpbnRlcmZhY2VzDQotI2lmKERJUkVDVDNEX1ZFUlNJT04gPj0gMHgwODAwKQ0KLQ0KLQ0KLS8qIFRoaXMgaWRlbnRpZmllciBpcyBwYXNzZWQgdG8gRGlyZWN0M0RDcmVhdGU4IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFuDQotICogYXBwbGljYXRpb24gd2FzIGJ1aWx0IGFnYWluc3QgdGhlIGNvcnJlY3QgaGVhZGVyIGZpbGVzLiBUaGlzIG51bWJlciBpcw0KLSAqIGluY3JlbWVudGVkIHdoZW5ldmVyIGEgaGVhZGVyIChvciBvdGhlcikgY2hhbmdlIHdvdWxkIHJlcXVpcmUgYXBwbGljYXRpb25zDQotICogdG8gYmUgcmVidWlsdC4gSWYgdGhlIHZlcnNpb24gZG9lc24ndCBtYXRjaCwgRGlyZWN0M0RDcmVhdGU4IHdpbGwgZmFpbC4NCi0gKiAoVGhlIG51bWJlciBpdHNlbGYgaGFzIG5vIG1lYW5pbmcuKSovDQotDQotI2RlZmluZSBEM0RfU0RLX1ZFUlNJT04gMjIwDQotDQotDQotI2luY2x1ZGUgPHN0ZGxpYi5oPg0KLQ0KLSNkZWZpbmUgQ09NX05PX1dJTkRPV1NfSA0KLSNpbmNsdWRlIDxvYmpiYXNlLmg+DQotDQotI2luY2x1ZGUgPHdpbmRvd3MuaD4NCi0NCi0jaWYgIWRlZmluZWQoSE1PTklUT1JfREVDTEFSRUQpICYmIChXSU5WRVIgPCAweDA1MDApDQotICAgICNkZWZpbmUgSE1PTklUT1JfREVDTEFSRUQNCi0gICAgREVDTEFSRV9IQU5ETEUoSE1PTklUT1IpOw0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgRDNEQVBJIFdJTkFQSQ0KLQ0KLS8qDQotICogSW50ZXJmYWNlIElJRCdzDQotICovDQotI2lmIGRlZmluZWQoIF9XSU4zMiApICYmICFkZWZpbmVkKCBfTk9fQ09NKQ0KLQ0KLS8qIElJRF9JRGlyZWN0M0Q4ICovDQotLyogezFERDlFOERBLTFDNzctNGQ0MC1CMENGLTk4RkVGREZGOTUxMn0gKi8NCi1ERUZJTkVfR1VJRChJSURfSURpcmVjdDNEOCwgMHgxZGQ5ZThkYSwgMHgxYzc3LCAweDRkNDAsIDB4YjAsIDB4Y2YsIDB4OTgsIDB4ZmUsIDB4ZmQsIDB4ZmYsIDB4OTUsIDB4MTIpOw0KLQ0KLS8qIElJRF9JRGlyZWN0M0REZXZpY2U4ICovDQotLyogezczODVFNURGLThGRTgtNDFENS04NkI2LUQ3QjQ4NTQ3QjZDRn0gKi8NCi1ERUZJTkVfR1VJRChJSURfSURpcmVjdDNERGV2aWNlOCwgMHg3Mzg1ZTVkZiwgMHg4ZmU4LCAweDQxZDUsIDB4ODYsIDB4YjYsIDB4ZDcsIDB4YjQsIDB4ODUsIDB4NDcsIDB4YjYsIDB4Y2YpOw0KLQ0KLS8qIElJRF9JRGlyZWN0M0RSZXNvdXJjZTggKi8NCi0vKiB7MUIzNkJCN0ItMDlCNy00MTBhLUI0NDUtN0QxNDMwRDdCMzNGfSAqLw0KLURFRklORV9HVUlEKElJRF9JRGlyZWN0M0RSZXNvdXJjZTgsIDB4MWIzNmJiN2IsIDB4OWI3LCAweDQxMGEsIDB4YjQsIDB4NDUsIDB4N2QsIDB4MTQsIDB4MzAsIDB4ZDcsIDB4YjMsIDB4M2YpOw0KLQ0KLS8qIElJRF9JRGlyZWN0M0RCYXNlVGV4dHVyZTggKi8NCi0vKiB7QjQyMTFDRkEtNTFCOS00YTlmLUFCNzgtREI5OUIyQkI2NzhFfSAqLw0KLURFRklORV9HVUlEKElJRF9JRGlyZWN0M0RCYXNlVGV4dHVyZTgsIDB4YjQyMTFjZmEsIDB4NTFiOSwgMHg0YTlmLCAweGFiLCAweDc4LCAweGRiLCAweDk5LCAweGIyLCAweGJiLCAweDY3LCAweDhlKTsNCi0NCi0vKiBJSURfSURpcmVjdDNEVGV4dHVyZTggKi8NCi0vKiB7RTRDREQ1NzUtMjg2Ni00ZjAxLUIxMkUtN0VFQ0UxRUM5MzU4fSAqLw0KLURFRklORV9HVUlEKElJRF9JRGlyZWN0M0RUZXh0dXJlOCwgMHhlNGNkZDU3NSwgMHgyODY2LCAweDRmMDEsIDB4YjEsIDB4MmUsIDB4N2UsIDB4ZWMsIDB4ZTEsIDB4ZWMsIDB4OTMsIDB4NTgpOw0KLQ0KLS8qIElJRF9JRGlyZWN0M0RDdWJlVGV4dHVyZTggKi8NCi0vKiB7M0VFNUI5NjgtMkFDQS00YzM0LThCQjUtN0UwQzNEMTlCNzUwfSAqLw0KLURFRklORV9HVUlEKElJRF9JRGlyZWN0M0RDdWJlVGV4dHVyZTgsIDB4M2VlNWI5NjgsIDB4MmFjYSwgMHg0YzM0LCAweDhiLCAweGI1LCAweDdlLCAweDBjLCAweDNkLCAweDE5LCAweGI3LCAweDUwKTsNCi0NCi0vKiBJSURfSURpcmVjdDNEVm9sdW1lVGV4dHVyZTggKi8NCi0vKiB7NEI4QUFBRkEtMTQwRi00MmJhLTkxMzEtNTk3RUFGQUEyRUFEfSAqLw0KLURFRklORV9HVUlEKElJRF9JRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCwgMHg0YjhhYWFmYSwgMHgxNDBmLCAweDQyYmEsIDB4OTEsIDB4MzEsIDB4NTksIDB4N2UsIDB4YWYsIDB4YWEsIDB4MmUsIDB4YWQpOw0KLQ0KLS8qIElJRF9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICovDQotLyogezhBRUVFQUM3LTA1RjktNDRkNC1CNTkxLTAwMEIwREYxQ0I5NX0gKi8NCi1ERUZJTkVfR1VJRChJSURfSURpcmVjdDNEVmVydGV4QnVmZmVyOCwgMHg4YWVlZWFjNywgMHgwNWY5LCAweDQ0ZDQsIDB4YjUsIDB4OTEsIDB4MDAsIDB4MGIsIDB4MGQsIDB4ZjEsIDB4Y2IsIDB4OTUpOw0KLQ0KLS8qIElJRF9JRGlyZWN0M0RJbmRleEJ1ZmZlcjggKi8NCi0vKiB7MEU2ODlDOUEtMDUzRC00NGEwLTlEOTItREIwRTNENzUwRjg2fSAqLw0KLURFRklORV9HVUlEKElJRF9JRGlyZWN0M0RJbmRleEJ1ZmZlcjgsIDB4MGU2ODljOWEsIDB4MDUzZCwgMHg0NGEwLCAweDlkLCAweDkyLCAweGRiLCAweDBlLCAweDNkLCAweDc1LCAweDBmLCAweDg2KTsNCi0NCi0vKiBJSURfSURpcmVjdDNEU3VyZmFjZTggKi8NCi0vKiB7Qjk2RUVCQ0EtQjMyNi00ZWE1LTg4MkYtMkZGNUJBRTAyMUREfSAqLw0KLURFRklORV9HVUlEKElJRF9JRGlyZWN0M0RTdXJmYWNlOCwgMHhiOTZlZWJjYSwgMHhiMzI2LCAweDRlYTUsIDB4ODgsIDB4MmYsIDB4MmYsIDB4ZjUsIDB4YmEsIDB4ZTAsIDB4MjEsIDB4ZGQpOw0KLQ0KLS8qIElJRF9JRGlyZWN0M0RWb2x1bWU4ICovDQotLyoge0JENzM0OUY1LTE0RjEtNDJlNC05Qzc5LTk3MjM4MERCNDBDMH0gKi8NCi1ERUZJTkVfR1VJRChJSURfSURpcmVjdDNEVm9sdW1lOCwgMHhiZDczNDlmNSwgMHgxNGYxLCAweDQyZTQsIDB4OWMsIDB4NzksIDB4OTcsIDB4MjMsIDB4ODAsIDB4ZGIsIDB4NDAsIDB4YzApOw0KLQ0KLS8qIElJRF9JRGlyZWN0M0RTd2FwQ2hhaW44ICovDQotLyogezkyOEMwODhCLTc2QjktNEM2Qi1BNTM2LUE1OTA4NTM4NzZDRH0gKi8NCi1ERUZJTkVfR1VJRChJSURfSURpcmVjdDNEU3dhcENoYWluOCwgMHg5MjhjMDg4YiwgMHg3NmI5LCAweDRjNmIsIDB4YTUsIDB4MzYsIDB4YTUsIDB4OTAsIDB4ODUsIDB4MzgsIDB4NzYsIDB4Y2QpOw0KLQ0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLQ0KLWludGVyZmFjZSBJRGlyZWN0M0Q4Ow0KLWludGVyZmFjZSBJRGlyZWN0M0REZXZpY2U4Ow0KLQ0KLWludGVyZmFjZSBJRGlyZWN0M0RSZXNvdXJjZTg7DQotaW50ZXJmYWNlIElEaXJlY3QzREJhc2VUZXh0dXJlODsNCi1pbnRlcmZhY2UgSURpcmVjdDNEVGV4dHVyZTg7DQotaW50ZXJmYWNlIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4Ow0KLWludGVyZmFjZSBJRGlyZWN0M0RDdWJlVGV4dHVyZTg7DQotDQotaW50ZXJmYWNlIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjg7DQotaW50ZXJmYWNlIElEaXJlY3QzREluZGV4QnVmZmVyODsNCi0NCi1pbnRlcmZhY2UgSURpcmVjdDNEU3VyZmFjZTg7DQotaW50ZXJmYWNlIElEaXJlY3QzRFZvbHVtZTg7DQotDQotaW50ZXJmYWNlIElEaXJlY3QzRFN3YXBDaGFpbjg7DQotDQotI2VuZGlmDQotDQotDQotdHlwZWRlZiBpbnRlcmZhY2UgSURpcmVjdDNEOCAgICAgICAgICAgICAgICBJRGlyZWN0M0Q4Ow0KLXR5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzRERldmljZTggICAgICAgICAgSURpcmVjdDNERGV2aWNlODsNCi10eXBlZGVmIGludGVyZmFjZSBJRGlyZWN0M0RSZXNvdXJjZTggICAgICAgIElEaXJlY3QzRFJlc291cmNlODsNCi10eXBlZGVmIGludGVyZmFjZSBJRGlyZWN0M0RCYXNlVGV4dHVyZTggICAgIElEaXJlY3QzREJhc2VUZXh0dXJlODsNCi10eXBlZGVmIGludGVyZmFjZSBJRGlyZWN0M0RUZXh0dXJlOCAgICAgICAgIElEaXJlY3QzRFRleHR1cmU4Ow0KLXR5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICAgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTg7DQotdHlwZWRlZiBpbnRlcmZhY2UgSURpcmVjdDNEQ3ViZVRleHR1cmU4ICAgICBJRGlyZWN0M0RDdWJlVGV4dHVyZTg7DQotdHlwZWRlZiBpbnRlcmZhY2UgSURpcmVjdDNEVmVydGV4QnVmZmVyOCAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4Ow0KLXR5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzREluZGV4QnVmZmVyOCAgICAgSURpcmVjdDNESW5kZXhCdWZmZXI4Ow0KLXR5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzRFN1cmZhY2U4ICAgICAgICAgSURpcmVjdDNEU3VyZmFjZTg7DQotdHlwZWRlZiBpbnRlcmZhY2UgSURpcmVjdDNEVm9sdW1lOCAgICAgICAgICBJRGlyZWN0M0RWb2x1bWU4Ow0KLXR5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzRFN3YXBDaGFpbjggICAgICAgSURpcmVjdDNEU3dhcENoYWluODsNCi0NCi0jaW5jbHVkZSAiZDNkOHR5cGVzLmgiDQotI2luY2x1ZGUgImQzZDhjYXBzLmgiDQotDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotZXh0ZXJuICJDIiB7DQotI2VuZGlmDQotDQotLyoNCi0gKiBETEwgRnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgRGlyZWN0M0Q4IG9iamVjdC4gVGhpcyBvYmplY3Qgc3VwcG9ydHMNCi0gKiBlbnVtZXJhdGlvbiBhbmQgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBEaXJlY3QzRERldmljZTggb2JqZWN0cy4NCi0gKiBQYXNzIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgRDNEX1NES19WRVJTSU9OIHRvIHRoaXMgZnVuY3Rpb24sIHNvDQotICogdGhhdCB0aGUgcnVuLXRpbWUgY2FuIHZhbGlkYXRlIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB3YXMgY29tcGlsZWQNCi0gKiBhZ2FpbnN0IHRoZSByaWdodCBoZWFkZXJzLg0KLSAqLw0KLQ0KLUlEaXJlY3QzRDggKiBXSU5BUEkgRGlyZWN0M0RDcmVhdGU4KFVJTlQgU0RLVmVyc2lvbik7DQotDQotDQotLyoNCi0gKiBEaXJlY3QzRCBpbnRlcmZhY2VzDQotICovDQotDQotDQotDQotDQotDQotDQotI3VuZGVmIElOVEVSRkFDRQ0KLSNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRDgNCi0NCi1ERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNEOCwgSVVua25vd24pDQotew0KLSAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KLQ0KLSAgICAvKioqIElEaXJlY3QzRDggbWV0aG9kcyAqKiovDQotICAgIFNURE1FVEhPRChSZWdpc3RlclNvZnR3YXJlRGV2aWNlKShUSElTXyB2b2lkKiBwSW5pdGlhbGl6ZUZ1bmN0aW9uKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVJTlQsIEdldEFkYXB0ZXJDb3VudCkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldEFkYXB0ZXJJZGVudGlmaWVyKShUSElTXyBVSU5UIEFkYXB0ZXIsRFdPUkQgRmxhZ3MsRDNEQURBUFRFUl9JREVOVElGSUVSOCogcElkZW50aWZpZXIpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oVUlOVCwgR2V0QWRhcHRlck1vZGVDb3VudCkoVEhJU18gVUlOVCBBZGFwdGVyKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoRW51bUFkYXB0ZXJNb2RlcykoVEhJU18gVUlOVCBBZGFwdGVyLFVJTlQgTW9kZSxEM0RESVNQTEFZTU9ERSogcE1vZGUpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRBZGFwdGVyRGlzcGxheU1vZGUpKFRISVNfIFVJTlQgQWRhcHRlcixEM0RESVNQTEFZTU9ERSogcE1vZGUpIFBVUkU7DQotICAgIFNURE1FVEhPRChDaGVja0RldmljZVR5cGUpKFRISVNfIFVJTlQgQWRhcHRlcixEM0RERVZUWVBFIENoZWNrVHlwZSxEM0RGT1JNQVQgRGlzcGxheUZvcm1hdCxEM0RGT1JNQVQgQmFja0J1ZmZlckZvcm1hdCxCT09MIFdpbmRvd2VkKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoQ2hlY2tEZXZpY2VGb3JtYXQpKFRISVNfIFVJTlQgQWRhcHRlcixEM0RERVZUWVBFIERldmljZVR5cGUsRDNERk9STUFUIEFkYXB0ZXJGb3JtYXQsRFdPUkQgVXNhZ2UsRDNEUkVTT1VSQ0VUWVBFIFJUeXBlLEQzREZPUk1BVCBDaGVja0Zvcm1hdCkgUFVSRTsNCi0gICAgU1RETUVUSE9EKENoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKShUSElTXyBVSU5UIEFkYXB0ZXIsRDNEREVWVFlQRSBEZXZpY2VUeXBlLEQzREZPUk1BVCBTdXJmYWNlRm9ybWF0LEJPT0wgV2luZG93ZWQsRDNETVVMVElTQU1QTEVfVFlQRSBNdWx0aVNhbXBsZVR5cGUpIFBVUkU7DQotICAgIFNURE1FVEhPRChDaGVja0RlcHRoU3RlbmNpbE1hdGNoKShUSElTXyBVSU5UIEFkYXB0ZXIsRDNEREVWVFlQRSBEZXZpY2VUeXBlLEQzREZPUk1BVCBBZGFwdGVyRm9ybWF0LEQzREZPUk1BVCBSZW5kZXJUYXJnZXRGb3JtYXQsRDNERk9STUFUIERlcHRoU3RlbmNpbEZvcm1hdCkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldERldmljZUNhcHMpKFRISVNfIFVJTlQgQWRhcHRlcixEM0RERVZUWVBFIERldmljZVR5cGUsRDNEQ0FQUzgqIHBDYXBzKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKEhNT05JVE9SLCBHZXRBZGFwdGVyTW9uaXRvcikoVEhJU18gVUlOVCBBZGFwdGVyKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoQ3JlYXRlRGV2aWNlKShUSElTXyBVSU5UIEFkYXB0ZXIsRDNEREVWVFlQRSBEZXZpY2VUeXBlLEhXTkQgaEZvY3VzV2luZG93LERXT1JEIEJlaGF2aW9yRmxhZ3MsRDNEUFJFU0VOVF9QQVJBTUVURVJTKiBwUHJlc2VudGF0aW9uUGFyYW1ldGVycyxJRGlyZWN0M0REZXZpY2U4KiogcHBSZXR1cm5lZERldmljZUludGVyZmFjZSkgUFVSRTsNCi19Ow0KLQ0KLXR5cGVkZWYgc3RydWN0IElEaXJlY3QzRDggKkxQRElSRUNUM0Q4LCAqUERJUkVDVDNEODsNCi0NCi0jaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCi0jZGVmaW5lIElEaXJlY3QzRDhfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRDhfQWRkUmVmKHApIChwKS0+bHBWdGJsLT5BZGRSZWYocCkNCi0jZGVmaW5lIElEaXJlY3QzRDhfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9SZWdpc3RlclNvZnR3YXJlRGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPlJlZ2lzdGVyU29mdHdhcmVEZXZpY2UocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyQ291bnQocCkgKHApLT5scFZ0YmwtPkdldEFkYXB0ZXJDb3VudChwKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVySWRlbnRpZmllcihwLGEsYixjKSAocCktPmxwVnRibC0+R2V0QWRhcHRlcklkZW50aWZpZXIocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRDhfR2V0QWRhcHRlck1vZGVDb3VudChwLGEpIChwKS0+bHBWdGJsLT5HZXRBZGFwdGVyTW9kZUNvdW50KHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRDhfRW51bUFkYXB0ZXJNb2RlcyhwLGEsYixjKSAocCktPmxwVnRibC0+RW51bUFkYXB0ZXJNb2RlcyhwLGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyRGlzcGxheU1vZGUocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRBZGFwdGVyRGlzcGxheU1vZGUocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGV2aWNlVHlwZShwLGEsYixjLGQsZSkgKHApLT5scFZ0YmwtPkNoZWNrRGV2aWNlVHlwZShwLGEsYixjLGQsZSkNCi0jZGVmaW5lIElEaXJlY3QzRDhfQ2hlY2tEZXZpY2VGb3JtYXQocCxhLGIsYyxkLGUsZikgKHApLT5scFZ0YmwtPkNoZWNrRGV2aWNlRm9ybWF0KHAsYSxiLGMsZCxlLGYpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKHAsYSxiLGMsZCxlKSAocCktPmxwVnRibC0+Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUocCxhLGIsYyxkLGUpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGVwdGhTdGVuY2lsTWF0Y2gocCxhLGIsYyxkLGUpIChwKS0+bHBWdGJsLT5DaGVja0RlcHRoU3RlbmNpbE1hdGNoKHAsYSxiLGMsZCxlKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9HZXREZXZpY2VDYXBzKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXREZXZpY2VDYXBzKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0dldEFkYXB0ZXJNb25pdG9yKHAsYSkgKHApLT5scFZ0YmwtPkdldEFkYXB0ZXJNb25pdG9yKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRDhfQ3JlYXRlRGV2aWNlKHAsYSxiLGMsZCxlLGYpIChwKS0+bHBWdGJsLT5DcmVhdGVEZXZpY2UocCxhLGIsYyxkLGUsZikNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQotI2RlZmluZSBJRGlyZWN0M0Q4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzRDhfUmVnaXN0ZXJTb2Z0d2FyZURldmljZShwLGEpIChwKS0+UmVnaXN0ZXJTb2Z0d2FyZURldmljZShhKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyQ291bnQocCkgKHApLT5HZXRBZGFwdGVyQ291bnQoKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVySWRlbnRpZmllcihwLGEsYixjKSAocCktPkdldEFkYXB0ZXJJZGVudGlmaWVyKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyTW9kZUNvdW50KHAsYSkgKHApLT5HZXRBZGFwdGVyTW9kZUNvdW50KGEpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0VudW1BZGFwdGVyTW9kZXMocCxhLGIsYykgKHApLT5FbnVtQWRhcHRlck1vZGVzKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyRGlzcGxheU1vZGUocCxhLGIpIChwKS0+R2V0QWRhcHRlckRpc3BsYXlNb2RlKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRDhfQ2hlY2tEZXZpY2VUeXBlKHAsYSxiLGMsZCxlKSAocCktPkNoZWNrRGV2aWNlVHlwZShhLGIsYyxkLGUpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGV2aWNlRm9ybWF0KHAsYSxiLGMsZCxlLGYpIChwKS0+Q2hlY2tEZXZpY2VGb3JtYXQoYSxiLGMsZCxlLGYpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKHAsYSxiLGMsZCxlKSAocCktPkNoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKGEsYixjLGQsZSkNCi0jZGVmaW5lIElEaXJlY3QzRDhfQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChwLGEsYixjLGQsZSkgKHApLT5DaGVja0RlcHRoU3RlbmNpbE1hdGNoKGEsYixjLGQsZSkNCi0jZGVmaW5lIElEaXJlY3QzRDhfR2V0RGV2aWNlQ2FwcyhwLGEsYixjKSAocCktPkdldERldmljZUNhcHMoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0Q4X0dldEFkYXB0ZXJNb25pdG9yKHAsYSkgKHApLT5HZXRBZGFwdGVyTW9uaXRvcihhKQ0KLSNkZWZpbmUgSURpcmVjdDNEOF9DcmVhdGVEZXZpY2UocCxhLGIsYyxkLGUsZikgKHApLT5DcmVhdGVEZXZpY2UoYSxiLGMsZCxlLGYpDQotI2VuZGlmDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotI3VuZGVmIElOVEVSRkFDRQ0KLSNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRERldmljZTgNCi0NCi1ERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNERGV2aWNlOCwgSVVua25vd24pDQotew0KLSAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KLQ0KLSAgICAvKioqIElEaXJlY3QzRERldmljZTggbWV0aG9kcyAqKiovDQotICAgIFNURE1FVEhPRChUZXN0Q29vcGVyYXRpdmVMZXZlbCkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVSU5ULCBHZXRBdmFpbGFibGVUZXh0dXJlTWVtKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoUmVzb3VyY2VNYW5hZ2VyRGlzY2FyZEJ5dGVzKShUSElTXyBEV09SRCBCeXRlcykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldERpcmVjdDNEKShUSElTXyBJRGlyZWN0M0Q4KiogcHBEM0Q4KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0RGV2aWNlQ2FwcykoVEhJU18gRDNEQ0FQUzgqIHBDYXBzKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0RGlzcGxheU1vZGUpKFRISVNfIEQzRERJU1BMQVlNT0RFKiBwTW9kZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldENyZWF0aW9uUGFyYW1ldGVycykoVEhJU18gRDNEREVWSUNFX0NSRUFUSU9OX1BBUkFNRVRFUlMgKnBQYXJhbWV0ZXJzKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0Q3Vyc29yUHJvcGVydGllcykoVEhJU18gVUlOVCBYSG90U3BvdCxVSU5UIFlIb3RTcG90LElEaXJlY3QzRFN1cmZhY2U4KiBwQ3Vyc29yQml0bWFwKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKHZvaWQsIFNldEN1cnNvclBvc2l0aW9uKShUSElTXyBpbnQgWCxpbnQgWSxEV09SRCBGbGFncykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhCT09MLCBTaG93Q3Vyc29yKShUSElTXyBCT09MIGJTaG93KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoQ3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbikoVEhJU18gRDNEUFJFU0VOVF9QQVJBTUVURVJTKiBwUHJlc2VudGF0aW9uUGFyYW1ldGVycyxJRGlyZWN0M0RTd2FwQ2hhaW44KiogcFN3YXBDaGFpbikgUFVSRTsNCi0gICAgU1RETUVUSE9EKFJlc2V0KShUSElTXyBEM0RQUkVTRU5UX1BBUkFNRVRFUlMqIHBQcmVzZW50YXRpb25QYXJhbWV0ZXJzKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoUHJlc2VudCkoVEhJU18gQ09OU1QgUkVDVCogcFNvdXJjZVJlY3QsQ09OU1QgUkVDVCogcERlc3RSZWN0LEhXTkQgaERlc3RXaW5kb3dPdmVycmlkZSxDT05TVCBSR05EQVRBKiBwRGlydHlSZWdpb24pIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRCYWNrQnVmZmVyKShUSElTXyBVSU5UIEJhY2tCdWZmZXIsRDNEQkFDS0JVRkZFUl9UWVBFIFR5cGUsSURpcmVjdDNEU3VyZmFjZTgqKiBwcEJhY2tCdWZmZXIpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRSYXN0ZXJTdGF0dXMpKFRISVNfIEQzRFJBU1RFUl9TVEFUVVMqIHBSYXN0ZXJTdGF0dXMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8odm9pZCwgU2V0R2FtbWFSYW1wKShUSElTXyBEV09SRCBGbGFncyxDT05TVCBEM0RHQU1NQVJBTVAqIHBSYW1wKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKHZvaWQsIEdldEdhbW1hUmFtcCkoVEhJU18gRDNER0FNTUFSQU1QKiBwUmFtcCkgUFVSRTsNCi0gICAgU1RETUVUSE9EKENyZWF0ZVRleHR1cmUpKFRISVNfIFVJTlQgV2lkdGgsVUlOVCBIZWlnaHQsVUlOVCBMZXZlbHMsRFdPUkQgVXNhZ2UsRDNERk9STUFUIEZvcm1hdCxEM0RQT09MIFBvb2wsSURpcmVjdDNEVGV4dHVyZTgqKiBwcFRleHR1cmUpIFBVUkU7DQotICAgIFNURE1FVEhPRChDcmVhdGVWb2x1bWVUZXh0dXJlKShUSElTXyBVSU5UIFdpZHRoLFVJTlQgSGVpZ2h0LFVJTlQgRGVwdGgsVUlOVCBMZXZlbHMsRFdPUkQgVXNhZ2UsRDNERk9STUFUIEZvcm1hdCxEM0RQT09MIFBvb2wsSURpcmVjdDNEVm9sdW1lVGV4dHVyZTgqKiBwcFZvbHVtZVRleHR1cmUpIFBVUkU7DQotICAgIFNURE1FVEhPRChDcmVhdGVDdWJlVGV4dHVyZSkoVEhJU18gVUlOVCBFZGdlTGVuZ3RoLFVJTlQgTGV2ZWxzLERXT1JEIFVzYWdlLEQzREZPUk1BVCBGb3JtYXQsRDNEUE9PTCBQb29sLElEaXJlY3QzREN1YmVUZXh0dXJlOCoqIHBwQ3ViZVRleHR1cmUpIFBVUkU7DQotICAgIFNURE1FVEhPRChDcmVhdGVWZXJ0ZXhCdWZmZXIpKFRISVNfIFVJTlQgTGVuZ3RoLERXT1JEIFVzYWdlLERXT1JEIEZWRixEM0RQT09MIFBvb2wsSURpcmVjdDNEVmVydGV4QnVmZmVyOCoqIHBwVmVydGV4QnVmZmVyKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoQ3JlYXRlSW5kZXhCdWZmZXIpKFRISVNfIFVJTlQgTGVuZ3RoLERXT1JEIFVzYWdlLEQzREZPUk1BVCBGb3JtYXQsRDNEUE9PTCBQb29sLElEaXJlY3QzREluZGV4QnVmZmVyOCoqIHBwSW5kZXhCdWZmZXIpIFBVUkU7DQotICAgIFNURE1FVEhPRChDcmVhdGVSZW5kZXJUYXJnZXQpKFRISVNfIFVJTlQgV2lkdGgsVUlOVCBIZWlnaHQsRDNERk9STUFUIEZvcm1hdCxEM0RNVUxUSVNBTVBMRV9UWVBFIE11bHRpU2FtcGxlLEJPT0wgTG9ja2FibGUsSURpcmVjdDNEU3VyZmFjZTgqKiBwcFN1cmZhY2UpIFBVUkU7DQotICAgIFNURE1FVEhPRChDcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKShUSElTXyBVSU5UIFdpZHRoLFVJTlQgSGVpZ2h0LEQzREZPUk1BVCBGb3JtYXQsRDNETVVMVElTQU1QTEVfVFlQRSBNdWx0aVNhbXBsZSxJRGlyZWN0M0RTdXJmYWNlOCoqIHBwU3VyZmFjZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKENyZWF0ZUltYWdlU3VyZmFjZSkoVEhJU18gVUlOVCBXaWR0aCxVSU5UIEhlaWdodCxEM0RGT1JNQVQgRm9ybWF0LElEaXJlY3QzRFN1cmZhY2U4KiogcHBTdXJmYWNlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoQ29weVJlY3RzKShUSElTXyBJRGlyZWN0M0RTdXJmYWNlOCogcFNvdXJjZVN1cmZhY2UsQ09OU1QgUkVDVCogcFNvdXJjZVJlY3RzQXJyYXksVUlOVCBjUmVjdHMsSURpcmVjdDNEU3VyZmFjZTgqIHBEZXN0aW5hdGlvblN1cmZhY2UsQ09OU1QgUE9JTlQqIHBEZXN0UG9pbnRzQXJyYXkpIFBVUkU7DQotICAgIFNURE1FVEhPRChVcGRhdGVUZXh0dXJlKShUSElTXyBJRGlyZWN0M0RCYXNlVGV4dHVyZTgqIHBTb3VyY2VUZXh0dXJlLElEaXJlY3QzREJhc2VUZXh0dXJlOCogcERlc3RpbmF0aW9uVGV4dHVyZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldEZyb250QnVmZmVyKShUSElTXyBJRGlyZWN0M0RTdXJmYWNlOCogcERlc3RTdXJmYWNlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0UmVuZGVyVGFyZ2V0KShUSElTXyBJRGlyZWN0M0RTdXJmYWNlOCogcFJlbmRlclRhcmdldCxJRGlyZWN0M0RTdXJmYWNlOCogcE5ld1pTdGVuY2lsKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0UmVuZGVyVGFyZ2V0KShUSElTXyBJRGlyZWN0M0RTdXJmYWNlOCoqIHBwUmVuZGVyVGFyZ2V0KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0RGVwdGhTdGVuY2lsU3VyZmFjZSkoVEhJU18gSURpcmVjdDNEU3VyZmFjZTgqKiBwcFpTdGVuY2lsU3VyZmFjZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEJlZ2luU2NlbmUpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRChFbmRTY2VuZSkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EKENsZWFyKShUSElTXyBEV09SRCBDb3VudCxDT05TVCBEM0RSRUNUKiBwUmVjdHMsRFdPUkQgRmxhZ3MsRDNEQ09MT1IgQ29sb3IsZmxvYXQgWixEV09SRCBTdGVuY2lsKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0VHJhbnNmb3JtKShUSElTXyBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgU3RhdGUsQ09OU1QgRDNETUFUUklYKiBwTWF0cml4KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0VHJhbnNmb3JtKShUSElTXyBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgU3RhdGUsRDNETUFUUklYKiBwTWF0cml4KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoTXVsdGlwbHlUcmFuc2Zvcm0pKFRISVNfIEQzRFRSQU5TRk9STVNUQVRFVFlQRSxDT05TVCBEM0RNQVRSSVgqKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0Vmlld3BvcnQpKFRISVNfIENPTlNUIEQzRFZJRVdQT1JUOCogcFZpZXdwb3J0KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0Vmlld3BvcnQpKFRISVNfIEQzRFZJRVdQT1JUOCogcFZpZXdwb3J0KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0TWF0ZXJpYWwpKFRISVNfIENPTlNUIEQzRE1BVEVSSUFMOCogcE1hdGVyaWFsKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0TWF0ZXJpYWwpKFRISVNfIEQzRE1BVEVSSUFMOCogcE1hdGVyaWFsKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0TGlnaHQpKFRISVNfIERXT1JEIEluZGV4LENPTlNUIEQzRExJR0hUOCopIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRMaWdodCkoVEhJU18gRFdPUkQgSW5kZXgsRDNETElHSFQ4KikgUFVSRTsNCi0gICAgU1RETUVUSE9EKExpZ2h0RW5hYmxlKShUSElTXyBEV09SRCBJbmRleCxCT09MIEVuYWJsZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldExpZ2h0RW5hYmxlKShUSElTXyBEV09SRCBJbmRleCxCT09MKiBwRW5hYmxlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0Q2xpcFBsYW5lKShUSElTXyBEV09SRCBJbmRleCxDT05TVCBmbG9hdCogcFBsYW5lKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0Q2xpcFBsYW5lKShUSElTXyBEV09SRCBJbmRleCxmbG9hdCogcFBsYW5lKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0UmVuZGVyU3RhdGUpKFRISVNfIEQzRFJFTkRFUlNUQVRFVFlQRSBTdGF0ZSxEV09SRCBWYWx1ZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldFJlbmRlclN0YXRlKShUSElTXyBEM0RSRU5ERVJTVEFURVRZUEUgU3RhdGUsRFdPUkQqIHBWYWx1ZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEJlZ2luU3RhdGVCbG9jaykoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEVuZFN0YXRlQmxvY2spKFRISVNfIERXT1JEKiBwVG9rZW4pIFBVUkU7DQotICAgIFNURE1FVEhPRChBcHBseVN0YXRlQmxvY2spKFRISVNfIERXT1JEIFRva2VuKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoQ2FwdHVyZVN0YXRlQmxvY2spKFRISVNfIERXT1JEIFRva2VuKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoRGVsZXRlU3RhdGVCbG9jaykoVEhJU18gRFdPUkQgVG9rZW4pIFBVUkU7DQotICAgIFNURE1FVEhPRChDcmVhdGVTdGF0ZUJsb2NrKShUSElTXyBEM0RTVEFURUJMT0NLVFlQRSBUeXBlLERXT1JEKiBwVG9rZW4pIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRDbGlwU3RhdHVzKShUSElTXyBDT05TVCBEM0RDTElQU1RBVFVTOCogcENsaXBTdGF0dXMpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRDbGlwU3RhdHVzKShUSElTXyBEM0RDTElQU1RBVFVTOCogcENsaXBTdGF0dXMpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRUZXh0dXJlKShUSElTXyBEV09SRCBTdGFnZSxJRGlyZWN0M0RCYXNlVGV4dHVyZTgqKiBwcFRleHR1cmUpIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRUZXh0dXJlKShUSElTXyBEV09SRCBTdGFnZSxJRGlyZWN0M0RCYXNlVGV4dHVyZTgqIHBUZXh0dXJlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0VGV4dHVyZVN0YWdlU3RhdGUpKFRISVNfIERXT1JEIFN0YWdlLEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSBUeXBlLERXT1JEKiBwVmFsdWUpIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRUZXh0dXJlU3RhZ2VTdGF0ZSkoVEhJU18gRFdPUkQgU3RhZ2UsRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIFR5cGUsRFdPUkQgVmFsdWUpIFBVUkU7DQotICAgIFNURE1FVEhPRChWYWxpZGF0ZURldmljZSkoVEhJU18gRFdPUkQqIHBOdW1QYXNzZXMpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRJbmZvKShUSElTXyBEV09SRCBEZXZJbmZvSUQsdm9pZCogcERldkluZm9TdHJ1Y3QsRFdPUkQgRGV2SW5mb1N0cnVjdFNpemUpIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRQYWxldHRlRW50cmllcykoVEhJU18gVUlOVCBQYWxldHRlTnVtYmVyLENPTlNUIFBBTEVUVEVFTlRSWSogcEVudHJpZXMpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRQYWxldHRlRW50cmllcykoVEhJU18gVUlOVCBQYWxldHRlTnVtYmVyLFBBTEVUVEVFTlRSWSogcEVudHJpZXMpIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUpKFRISVNfIFVJTlQgUGFsZXR0ZU51bWJlcikgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSkoVEhJU18gVUlOVCAqUGFsZXR0ZU51bWJlcikgUFVSRTsNCi0gICAgU1RETUVUSE9EKERyYXdQcmltaXRpdmUpKFRISVNfIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSxVSU5UIFN0YXJ0VmVydGV4LFVJTlQgUHJpbWl0aXZlQ291bnQpIFBVUkU7DQotICAgIFNURE1FVEhPRChEcmF3SW5kZXhlZFByaW1pdGl2ZSkoVEhJU18gRDNEUFJJTUlUSVZFVFlQRSxVSU5UIG1pbkluZGV4LFVJTlQgTnVtVmVydGljZXMsVUlOVCBzdGFydEluZGV4LFVJTlQgcHJpbUNvdW50KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoRHJhd1ByaW1pdGl2ZVVQKShUSElTXyBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsVUlOVCBQcmltaXRpdmVDb3VudCxDT05TVCB2b2lkKiBwVmVydGV4U3RyZWFtWmVyb0RhdGEsVUlOVCBWZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoRHJhd0luZGV4ZWRQcmltaXRpdmVVUCkoVEhJU18gRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLFVJTlQgTWluVmVydGV4SW5kZXgsVUlOVCBOdW1WZXJ0ZXhJbmRpY2VzLFVJTlQgUHJpbWl0aXZlQ291bnQsQ09OU1Qgdm9pZCogcEluZGV4RGF0YSxEM0RGT1JNQVQgSW5kZXhEYXRhRm9ybWF0LENPTlNUIHZvaWQqIHBWZXJ0ZXhTdHJlYW1aZXJvRGF0YSxVSU5UIFZlcnRleFN0cmVhbVplcm9TdHJpZGUpIFBVUkU7DQotICAgIFNURE1FVEhPRChQcm9jZXNzVmVydGljZXMpKFRISVNfIFVJTlQgU3JjU3RhcnRJbmRleCxVSU5UIERlc3RJbmRleCxVSU5UIFZlcnRleENvdW50LElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgqIHBEZXN0QnVmZmVyLERXT1JEIEZsYWdzKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoQ3JlYXRlVmVydGV4U2hhZGVyKShUSElTXyBDT05TVCBEV09SRCogcERlY2xhcmF0aW9uLENPTlNUIERXT1JEKiBwRnVuY3Rpb24sRFdPUkQqIHBIYW5kbGUsRFdPUkQgVXNhZ2UpIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRWZXJ0ZXhTaGFkZXIpKFRISVNfIERXT1JEIEhhbmRsZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldFZlcnRleFNoYWRlcikoVEhJU18gRFdPUkQqIHBIYW5kbGUpIFBVUkU7DQotICAgIFNURE1FVEhPRChEZWxldGVWZXJ0ZXhTaGFkZXIpKFRISVNfIERXT1JEIEhhbmRsZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKFNldFZlcnRleFNoYWRlckNvbnN0YW50KShUSElTXyBEV09SRCBSZWdpc3RlcixDT05TVCB2b2lkKiBwQ29uc3RhbnREYXRhLERXT1JEIENvbnN0YW50Q291bnQpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCkoVEhJU18gRFdPUkQgUmVnaXN0ZXIsdm9pZCogcENvbnN0YW50RGF0YSxEV09SRCBDb25zdGFudENvdW50KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0VmVydGV4U2hhZGVyRGVjbGFyYXRpb24pKFRISVNfIERXT1JEIEhhbmRsZSx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRWZXJ0ZXhTaGFkZXJGdW5jdGlvbikoVEhJU18gRFdPUkQgSGFuZGxlLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKFNldFN0cmVhbVNvdXJjZSkoVEhJU18gVUlOVCBTdHJlYW1OdW1iZXIsSURpcmVjdDNEVmVydGV4QnVmZmVyOCogcFN0cmVhbURhdGEsVUlOVCBTdHJpZGUpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRTdHJlYW1Tb3VyY2UpKFRISVNfIFVJTlQgU3RyZWFtTnVtYmVyLElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgqKiBwcFN0cmVhbURhdGEsVUlOVCogcFN0cmlkZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKFNldEluZGljZXMpKFRISVNfIElEaXJlY3QzREluZGV4QnVmZmVyOCogcEluZGV4RGF0YSxVSU5UIEJhc2VWZXJ0ZXhJbmRleCkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldEluZGljZXMpKFRISVNfIElEaXJlY3QzREluZGV4QnVmZmVyOCoqIHBwSW5kZXhEYXRhLFVJTlQqIHBCYXNlVmVydGV4SW5kZXgpIFBVUkU7DQotICAgIFNURE1FVEhPRChDcmVhdGVQaXhlbFNoYWRlcikoVEhJU18gQ09OU1QgRFdPUkQqIHBGdW5jdGlvbixEV09SRCogcEhhbmRsZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKFNldFBpeGVsU2hhZGVyKShUSElTXyBEV09SRCBIYW5kbGUpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRQaXhlbFNoYWRlcikoVEhJU18gRFdPUkQqIHBIYW5kbGUpIFBVUkU7DQotICAgIFNURE1FVEhPRChEZWxldGVQaXhlbFNoYWRlcikoVEhJU18gRFdPUkQgSGFuZGxlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0UGl4ZWxTaGFkZXJDb25zdGFudCkoVEhJU18gRFdPUkQgUmVnaXN0ZXIsQ09OU1Qgdm9pZCogcENvbnN0YW50RGF0YSxEV09SRCBDb25zdGFudENvdW50KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0UGl4ZWxTaGFkZXJDb25zdGFudCkoVEhJU18gRFdPUkQgUmVnaXN0ZXIsdm9pZCogcENvbnN0YW50RGF0YSxEV09SRCBDb25zdGFudENvdW50KSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0UGl4ZWxTaGFkZXJGdW5jdGlvbikoVEhJU18gRFdPUkQgSGFuZGxlLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKERyYXdSZWN0UGF0Y2gpKFRISVNfIFVJTlQgSGFuZGxlLENPTlNUIGZsb2F0KiBwTnVtU2VncyxDT05TVCBEM0RSRUNUUEFUQ0hfSU5GTyogcFJlY3RQYXRjaEluZm8pIFBVUkU7DQotICAgIFNURE1FVEhPRChEcmF3VHJpUGF0Y2gpKFRISVNfIFVJTlQgSGFuZGxlLENPTlNUIGZsb2F0KiBwTnVtU2VncyxDT05TVCBEM0RUUklQQVRDSF9JTkZPKiBwVHJpUGF0Y2hJbmZvKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoRGVsZXRlUGF0Y2gpKFRISVNfIFVJTlQgSGFuZGxlKSBQVVJFOw0KLX07DQotDQotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNERGV2aWNlOCAqTFBESVJFQ1QzRERFVklDRTgsICpQRElSRUNUM0RERVZJQ0U4Ow0KLQ0KLSNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9BZGRSZWYocCkgKHApLT5scFZ0YmwtPkFkZFJlZihwKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Rlc3RDb29wZXJhdGl2ZUxldmVsKHApIChwKS0+bHBWdGJsLT5UZXN0Q29vcGVyYXRpdmVMZXZlbChwKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRBdmFpbGFibGVUZXh0dXJlTWVtKHApIChwKS0+bHBWdGJsLT5HZXRBdmFpbGFibGVUZXh0dXJlTWVtKHApDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Jlc291cmNlTWFuYWdlckRpc2NhcmRCeXRlcyhwLGEpIChwKS0+bHBWdGJsLT5SZXNvdXJjZU1hbmFnZXJEaXNjYXJkQnl0ZXMocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXREaXJlY3QzRChwLGEpIChwKS0+bHBWdGJsLT5HZXREaXJlY3QzRChwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldERldmljZUNhcHMocCxhKSAocCktPmxwVnRibC0+R2V0RGV2aWNlQ2FwcyhwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldERpc3BsYXlNb2RlKHAsYSkgKHApLT5scFZ0YmwtPkdldERpc3BsYXlNb2RlKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0Q3JlYXRpb25QYXJhbWV0ZXJzKHAsYSkgKHApLT5scFZ0YmwtPkdldENyZWF0aW9uUGFyYW1ldGVycyhwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldEN1cnNvclByb3BlcnRpZXMocCxhLGIsYykgKHApLT5scFZ0YmwtPlNldEN1cnNvclByb3BlcnRpZXMocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0Q3Vyc29yUG9zaXRpb24ocCxhLGIsYykgKHApLT5scFZ0YmwtPlNldEN1cnNvclBvc2l0aW9uKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Nob3dDdXJzb3IocCxhKSAocCktPmxwVnRibC0+U2hvd0N1cnNvcihwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4ocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9SZXNldChwLGEpIChwKS0+bHBWdGJsLT5SZXNldChwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1ByZXNlbnQocCxhLGIsYyxkKSAocCktPmxwVnRibC0+UHJlc2VudChwLGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEJhY2tCdWZmZXIocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldEJhY2tCdWZmZXIocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0UmFzdGVyU3RhdHVzKHAsYSkgKHApLT5scFZ0YmwtPkdldFJhc3RlclN0YXR1cyhwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldEdhbW1hUmFtcChwLGEsYikgKHApLT5scFZ0YmwtPlNldEdhbW1hUmFtcChwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0R2FtbWFSYW1wKHAsYSkgKHApLT5scFZ0YmwtPkdldEdhbW1hUmFtcChwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZVRleHR1cmUocCxhLGIsYyxkLGUsZixnKSAocCktPmxwVnRibC0+Q3JlYXRlVGV4dHVyZShwLGEsYixjLGQsZSxmLGcpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZVZvbHVtZVRleHR1cmUocCxhLGIsYyxkLGUsZixnLGgpIChwKS0+bHBWdGJsLT5DcmVhdGVWb2x1bWVUZXh0dXJlKHAsYSxiLGMsZCxlLGYsZyxoKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVDdWJlVGV4dHVyZShwLGEsYixjLGQsZSxmKSAocCktPmxwVnRibC0+Q3JlYXRlQ3ViZVRleHR1cmUocCxhLGIsYyxkLGUsZikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlVmVydGV4QnVmZmVyKHAsYSxiLGMsZCxlKSAocCktPmxwVnRibC0+Q3JlYXRlVmVydGV4QnVmZmVyKHAsYSxiLGMsZCxlKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVJbmRleEJ1ZmZlcihwLGEsYixjLGQsZSkgKHApLT5scFZ0YmwtPkNyZWF0ZUluZGV4QnVmZmVyKHAsYSxiLGMsZCxlKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVSZW5kZXJUYXJnZXQocCxhLGIsYyxkLGUsZikgKHApLT5scFZ0YmwtPkNyZWF0ZVJlbmRlclRhcmdldChwLGEsYixjLGQsZSxmKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKHAsYSxiLGMsZCxlKSAocCktPmxwVnRibC0+Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZShwLGEsYixjLGQsZSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlSW1hZ2VTdXJmYWNlKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPkNyZWF0ZUltYWdlU3VyZmFjZShwLGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NvcHlSZWN0cyhwLGEsYixjLGQsZSkgKHApLT5scFZ0YmwtPkNvcHlSZWN0cyhwLGEsYixjLGQsZSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfVXBkYXRlVGV4dHVyZShwLGEsYikgKHApLT5scFZ0YmwtPlVwZGF0ZVRleHR1cmUocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEZyb250QnVmZmVyKHAsYSkgKHApLT5scFZ0YmwtPkdldEZyb250QnVmZmVyKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0UmVuZGVyVGFyZ2V0KHAsYSxiKSAocCktPmxwVnRibC0+U2V0UmVuZGVyVGFyZ2V0KHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRSZW5kZXJUYXJnZXQocCxhKSAocCktPmxwVnRibC0+R2V0UmVuZGVyVGFyZ2V0KHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0RGVwdGhTdGVuY2lsU3VyZmFjZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXB0aFN0ZW5jaWxTdXJmYWNlKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQmVnaW5TY2VuZShwKSAocCktPmxwVnRibC0+QmVnaW5TY2VuZShwKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9FbmRTY2VuZShwKSAocCktPmxwVnRibC0+RW5kU2NlbmUocCkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ2xlYXIocCxhLGIsYyxkLGUsZikgKHApLT5scFZ0YmwtPkNsZWFyKHAsYSxiLGMsZCxlLGYpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFRyYW5zZm9ybShwLGEsYikgKHApLT5scFZ0YmwtPlNldFRyYW5zZm9ybShwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0VHJhbnNmb3JtKHAsYSxiKSAocCktPmxwVnRibC0+R2V0VHJhbnNmb3JtKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9NdWx0aXBseVRyYW5zZm9ybShwLGEsYikgKHApLT5scFZ0YmwtPk11bHRpcGx5VHJhbnNmb3JtKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWaWV3cG9ydChwLGEpIChwKS0+bHBWdGJsLT5TZXRWaWV3cG9ydChwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFZpZXdwb3J0KHAsYSkgKHApLT5scFZ0YmwtPkdldFZpZXdwb3J0KHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0TWF0ZXJpYWwocCxhKSAocCktPmxwVnRibC0+U2V0TWF0ZXJpYWwocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRNYXRlcmlhbChwLGEpIChwKS0+bHBWdGJsLT5HZXRNYXRlcmlhbChwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldExpZ2h0KHAsYSxiKSAocCktPmxwVnRibC0+U2V0TGlnaHQocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldExpZ2h0KHAsYSxiKSAocCktPmxwVnRibC0+R2V0TGlnaHQocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0xpZ2h0RW5hYmxlKHAsYSxiKSAocCktPmxwVnRibC0+TGlnaHRFbmFibGUocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldExpZ2h0RW5hYmxlKHAsYSxiKSAocCktPmxwVnRibC0+R2V0TGlnaHRFbmFibGUocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldENsaXBQbGFuZShwLGEsYikgKHApLT5scFZ0YmwtPlNldENsaXBQbGFuZShwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0Q2xpcFBsYW5lKHAsYSxiKSAocCktPmxwVnRibC0+R2V0Q2xpcFBsYW5lKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRSZW5kZXJTdGF0ZShwLGEsYikgKHApLT5scFZ0YmwtPlNldFJlbmRlclN0YXRlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRSZW5kZXJTdGF0ZShwLGEsYikgKHApLT5scFZ0YmwtPkdldFJlbmRlclN0YXRlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9CZWdpblN0YXRlQmxvY2socCkgKHApLT5scFZ0YmwtPkJlZ2luU3RhdGVCbG9jayhwKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9FbmRTdGF0ZUJsb2NrKHAsYSkgKHApLT5scFZ0YmwtPkVuZFN0YXRlQmxvY2socCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9BcHBseVN0YXRlQmxvY2socCxhKSAocCktPmxwVnRibC0+QXBwbHlTdGF0ZUJsb2NrKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ2FwdHVyZVN0YXRlQmxvY2socCxhKSAocCktPmxwVnRibC0+Q2FwdHVyZVN0YXRlQmxvY2socCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EZWxldGVTdGF0ZUJsb2NrKHAsYSkgKHApLT5scFZ0YmwtPkRlbGV0ZVN0YXRlQmxvY2socCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVTdGF0ZUJsb2NrKHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlU3RhdGVCbG9jayhwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0Q2xpcFN0YXR1cyhwLGEpIChwKS0+bHBWdGJsLT5TZXRDbGlwU3RhdHVzKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0Q2xpcFN0YXR1cyhwLGEpIChwKS0+bHBWdGJsLT5HZXRDbGlwU3RhdHVzKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0VGV4dHVyZShwLGEsYikgKHApLT5scFZ0YmwtPkdldFRleHR1cmUocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFRleHR1cmUocCxhLGIpIChwKS0+bHBWdGJsLT5TZXRUZXh0dXJlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRUZXh0dXJlU3RhZ2VTdGF0ZShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0VGV4dHVyZVN0YWdlU3RhdGUocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0VGV4dHVyZVN0YWdlU3RhdGUocCxhLGIsYykgKHApLT5scFZ0YmwtPlNldFRleHR1cmVTdGFnZVN0YXRlKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1ZhbGlkYXRlRGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPlZhbGlkYXRlRGV2aWNlKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0SW5mbyhwLGEsYixjKSAocCktPmxwVnRibC0+R2V0SW5mbyhwLGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQYWxldHRlRW50cmllcyhwLGEsYikgKHApLT5scFZ0YmwtPlNldFBhbGV0dGVFbnRyaWVzKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRQYWxldHRlRW50cmllcyhwLGEsYikgKHApLT5scFZ0YmwtPkdldFBhbGV0dGVFbnRyaWVzKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUocCxhKSAocCktPmxwVnRibC0+U2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHAsYSkgKHApLT5scFZ0YmwtPkdldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdQcmltaXRpdmUocCxhLGIsYykgKHApLT5scFZ0YmwtPkRyYXdQcmltaXRpdmUocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfRHJhd0luZGV4ZWRQcmltaXRpdmUocCxhLGIsYyxkLGUpIChwKS0+bHBWdGJsLT5EcmF3SW5kZXhlZFByaW1pdGl2ZShwLGEsYixjLGQsZSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfRHJhd1ByaW1pdGl2ZVVQKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPkRyYXdQcmltaXRpdmVVUChwLGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAocCxhLGIsYyxkLGUsZixnLGgpIChwKS0+bHBWdGJsLT5EcmF3SW5kZXhlZFByaW1pdGl2ZVVQKHAsYSxiLGMsZCxlLGYsZyxoKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9Qcm9jZXNzVmVydGljZXMocCxhLGIsYyxkLGUpIChwKS0+bHBWdGJsLT5Qcm9jZXNzVmVydGljZXMocCxhLGIsYyxkLGUpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZVZlcnRleFNoYWRlcihwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5DcmVhdGVWZXJ0ZXhTaGFkZXIocCxhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWZXJ0ZXhTaGFkZXIocCxhKSAocCktPmxwVnRibC0+U2V0VmVydGV4U2hhZGVyKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0VmVydGV4U2hhZGVyKHAsYSkgKHApLT5scFZ0YmwtPkdldFZlcnRleFNoYWRlcihwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RlbGV0ZVZlcnRleFNoYWRlcihwLGEpIChwKS0+bHBWdGJsLT5EZWxldGVWZXJ0ZXhTaGFkZXIocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudChwLGEsYixjKSAocCktPmxwVnRibC0+U2V0VmVydGV4U2hhZGVyQ29uc3RhbnQocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0VmVydGV4U2hhZGVyQ29uc3RhbnQocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFZlcnRleFNoYWRlckNvbnN0YW50KHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFZlcnRleFNoYWRlckRlY2xhcmF0aW9uKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXRWZXJ0ZXhTaGFkZXJEZWNsYXJhdGlvbihwLGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXJGdW5jdGlvbihwLGEsYixjKSAocCktPmxwVnRibC0+R2V0VmVydGV4U2hhZGVyRnVuY3Rpb24ocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0U3RyZWFtU291cmNlKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5TZXRTdHJlYW1Tb3VyY2UocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0U3RyZWFtU291cmNlKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXRTdHJlYW1Tb3VyY2UocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0SW5kaWNlcyhwLGEsYikgKHApLT5scFZ0YmwtPlNldEluZGljZXMocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEluZGljZXMocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRJbmRpY2VzKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVQaXhlbFNoYWRlcihwLGEsYikgKHApLT5scFZ0YmwtPkNyZWF0ZVBpeGVsU2hhZGVyKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQaXhlbFNoYWRlcihwLGEpIChwKS0+bHBWdGJsLT5TZXRQaXhlbFNoYWRlcihwLGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFBpeGVsU2hhZGVyKHAsYSkgKHApLT5scFZ0YmwtPkdldFBpeGVsU2hhZGVyKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfRGVsZXRlUGl4ZWxTaGFkZXIocCxhKSAocCktPmxwVnRibC0+RGVsZXRlUGl4ZWxTaGFkZXIocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQaXhlbFNoYWRlckNvbnN0YW50KHAsYSxiLGMpIChwKS0+bHBWdGJsLT5TZXRQaXhlbFNoYWRlckNvbnN0YW50KHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFBpeGVsU2hhZGVyQ29uc3RhbnQocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFBpeGVsU2hhZGVyQ29uc3RhbnQocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0UGl4ZWxTaGFkZXJGdW5jdGlvbihwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UGl4ZWxTaGFkZXJGdW5jdGlvbihwLGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EcmF3UmVjdFBhdGNoKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5EcmF3UmVjdFBhdGNoKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdUcmlQYXRjaChwLGEsYixjKSAocCktPmxwVnRibC0+RHJhd1RyaVBhdGNoKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RlbGV0ZVBhdGNoKHAsYSkgKHApLT5scFZ0YmwtPkRlbGV0ZVBhdGNoKHAsYSkNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfVGVzdENvb3BlcmF0aXZlTGV2ZWwocCkgKHApLT5UZXN0Q29vcGVyYXRpdmVMZXZlbCgpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEF2YWlsYWJsZVRleHR1cmVNZW0ocCkgKHApLT5HZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfUmVzb3VyY2VNYW5hZ2VyRGlzY2FyZEJ5dGVzKHAsYSkgKHApLT5SZXNvdXJjZU1hbmFnZXJEaXNjYXJkQnl0ZXMoYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0RGlyZWN0M0QocCxhKSAocCktPkdldERpcmVjdDNEKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldERldmljZUNhcHMocCxhKSAocCktPkdldERldmljZUNhcHMoYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0RGlzcGxheU1vZGUocCxhKSAocCktPkdldERpc3BsYXlNb2RlKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldENyZWF0aW9uUGFyYW1ldGVycyhwLGEpIChwKS0+R2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldEN1cnNvclByb3BlcnRpZXMocCxhLGIsYykgKHApLT5TZXRDdXJzb3JQcm9wZXJ0aWVzKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRDdXJzb3JQb3NpdGlvbihwLGEsYixjKSAocCktPlNldEN1cnNvclBvc2l0aW9uKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TaG93Q3Vyc29yKHAsYSkgKHApLT5TaG93Q3Vyc29yKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4ocCxhLGIpIChwKS0+Q3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbihhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Jlc2V0KHAsYSkgKHApLT5SZXNldChhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9QcmVzZW50KHAsYSxiLGMsZCkgKHApLT5QcmVzZW50KGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEJhY2tCdWZmZXIocCxhLGIsYykgKHApLT5HZXRCYWNrQnVmZmVyKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRSYXN0ZXJTdGF0dXMocCxhKSAocCktPkdldFJhc3RlclN0YXR1cyhhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRHYW1tYVJhbXAocCxhLGIpIChwKS0+U2V0R2FtbWFSYW1wKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0R2FtbWFSYW1wKHAsYSkgKHApLT5HZXRHYW1tYVJhbXAoYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlVGV4dHVyZShwLGEsYixjLGQsZSxmLGcpIChwKS0+Q3JlYXRlVGV4dHVyZShhLGIsYyxkLGUsZixnKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVWb2x1bWVUZXh0dXJlKHAsYSxiLGMsZCxlLGYsZyxoKSAocCktPkNyZWF0ZVZvbHVtZVRleHR1cmUoYSxiLGMsZCxlLGYsZyxoKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVDdWJlVGV4dHVyZShwLGEsYixjLGQsZSxmKSAocCktPkNyZWF0ZUN1YmVUZXh0dXJlKGEsYixjLGQsZSxmKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVWZXJ0ZXhCdWZmZXIocCxhLGIsYyxkLGUpIChwKS0+Q3JlYXRlVmVydGV4QnVmZmVyKGEsYixjLGQsZSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlSW5kZXhCdWZmZXIocCxhLGIsYyxkLGUpIChwKS0+Q3JlYXRlSW5kZXhCdWZmZXIoYSxiLGMsZCxlKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVSZW5kZXJUYXJnZXQocCxhLGIsYyxkLGUsZikgKHApLT5DcmVhdGVSZW5kZXJUYXJnZXQoYSxiLGMsZCxlLGYpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UocCxhLGIsYyxkLGUpIChwKS0+Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZShhLGIsYyxkLGUpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZUltYWdlU3VyZmFjZShwLGEsYixjLGQpIChwKS0+Q3JlYXRlSW1hZ2VTdXJmYWNlKGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NvcHlSZWN0cyhwLGEsYixjLGQsZSkgKHApLT5Db3B5UmVjdHMoYSxiLGMsZCxlKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9VcGRhdGVUZXh0dXJlKHAsYSxiKSAocCktPlVwZGF0ZVRleHR1cmUoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRGcm9udEJ1ZmZlcihwLGEpIChwKS0+R2V0RnJvbnRCdWZmZXIoYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0UmVuZGVyVGFyZ2V0KHAsYSxiKSAocCktPlNldFJlbmRlclRhcmdldChhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFJlbmRlclRhcmdldChwLGEpIChwKS0+R2V0UmVuZGVyVGFyZ2V0KGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldERlcHRoU3RlbmNpbFN1cmZhY2UocCxhKSAocCktPkdldERlcHRoU3RlbmNpbFN1cmZhY2UoYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQmVnaW5TY2VuZShwKSAocCktPkJlZ2luU2NlbmUoKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9FbmRTY2VuZShwKSAocCktPkVuZFNjZW5lKCkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ2xlYXIocCxhLGIsYyxkLGUsZikgKHApLT5DbGVhcihhLGIsYyxkLGUsZikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0VHJhbnNmb3JtKHAsYSxiKSAocCktPlNldFRyYW5zZm9ybShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFRyYW5zZm9ybShwLGEsYikgKHApLT5HZXRUcmFuc2Zvcm0oYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9NdWx0aXBseVRyYW5zZm9ybShwLGEsYikgKHApLT5NdWx0aXBseVRyYW5zZm9ybShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFZpZXdwb3J0KHAsYSkgKHApLT5TZXRWaWV3cG9ydChhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWaWV3cG9ydChwLGEpIChwKS0+R2V0Vmlld3BvcnQoYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0TWF0ZXJpYWwocCxhKSAocCktPlNldE1hdGVyaWFsKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldE1hdGVyaWFsKHAsYSkgKHApLT5HZXRNYXRlcmlhbChhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRMaWdodChwLGEsYikgKHApLT5TZXRMaWdodChhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldExpZ2h0KHAsYSxiKSAocCktPkdldExpZ2h0KGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfTGlnaHRFbmFibGUocCxhLGIpIChwKS0+TGlnaHRFbmFibGUoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRMaWdodEVuYWJsZShwLGEsYikgKHApLT5HZXRMaWdodEVuYWJsZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldENsaXBQbGFuZShwLGEsYikgKHApLT5TZXRDbGlwUGxhbmUoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRDbGlwUGxhbmUocCxhLGIpIChwKS0+R2V0Q2xpcFBsYW5lKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0UmVuZGVyU3RhdGUocCxhLGIpIChwKS0+U2V0UmVuZGVyU3RhdGUoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRSZW5kZXJTdGF0ZShwLGEsYikgKHApLT5HZXRSZW5kZXJTdGF0ZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0JlZ2luU3RhdGVCbG9jayhwKSAocCktPkJlZ2luU3RhdGVCbG9jaygpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0VuZFN0YXRlQmxvY2socCxhKSAocCktPkVuZFN0YXRlQmxvY2soYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQXBwbHlTdGF0ZUJsb2NrKHAsYSkgKHApLT5BcHBseVN0YXRlQmxvY2soYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ2FwdHVyZVN0YXRlQmxvY2socCxhKSAocCktPkNhcHR1cmVTdGF0ZUJsb2NrKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RlbGV0ZVN0YXRlQmxvY2socCxhKSAocCktPkRlbGV0ZVN0YXRlQmxvY2soYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlU3RhdGVCbG9jayhwLGEsYikgKHApLT5DcmVhdGVTdGF0ZUJsb2NrKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0Q2xpcFN0YXR1cyhwLGEpIChwKS0+U2V0Q2xpcFN0YXR1cyhhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRDbGlwU3RhdHVzKHAsYSkgKHApLT5HZXRDbGlwU3RhdHVzKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFRleHR1cmUocCxhLGIpIChwKS0+R2V0VGV4dHVyZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFRleHR1cmUocCxhLGIpIChwKS0+U2V0VGV4dHVyZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFRleHR1cmVTdGFnZVN0YXRlKHAsYSxiLGMpIChwKS0+R2V0VGV4dHVyZVN0YWdlU3RhdGUoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFRleHR1cmVTdGFnZVN0YXRlKHAsYSxiLGMpIChwKS0+U2V0VGV4dHVyZVN0YWdlU3RhdGUoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1ZhbGlkYXRlRGV2aWNlKHAsYSkgKHApLT5WYWxpZGF0ZURldmljZShhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRJbmZvKHAsYSxiLGMpIChwKS0+R2V0SW5mbyhhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0UGFsZXR0ZUVudHJpZXMocCxhLGIpIChwKS0+U2V0UGFsZXR0ZUVudHJpZXMoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRQYWxldHRlRW50cmllcyhwLGEsYikgKHApLT5HZXRQYWxldHRlRW50cmllcyhhLGIpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZShwLGEpIChwKS0+U2V0Q3VycmVudFRleHR1cmVQYWxldHRlKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZShwLGEpIChwKS0+R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdQcmltaXRpdmUocCxhLGIsYykgKHApLT5EcmF3UHJpbWl0aXZlKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EcmF3SW5kZXhlZFByaW1pdGl2ZShwLGEsYixjLGQsZSkgKHApLT5EcmF3SW5kZXhlZFByaW1pdGl2ZShhLGIsYyxkLGUpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdQcmltaXRpdmVVUChwLGEsYixjLGQpIChwKS0+RHJhd1ByaW1pdGl2ZVVQKGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAocCxhLGIsYyxkLGUsZixnLGgpIChwKS0+RHJhd0luZGV4ZWRQcmltaXRpdmVVUChhLGIsYyxkLGUsZixnLGgpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Byb2Nlc3NWZXJ0aWNlcyhwLGEsYixjLGQsZSkgKHApLT5Qcm9jZXNzVmVydGljZXMoYSxiLGMsZCxlKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVWZXJ0ZXhTaGFkZXIocCxhLGIsYyxkKSAocCktPkNyZWF0ZVZlcnRleFNoYWRlcihhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWZXJ0ZXhTaGFkZXIocCxhKSAocCktPlNldFZlcnRleFNoYWRlcihhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXIocCxhKSAocCktPkdldFZlcnRleFNoYWRlcihhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EZWxldGVWZXJ0ZXhTaGFkZXIocCxhKSAocCktPkRlbGV0ZVZlcnRleFNoYWRlcihhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudChwLGEsYixjKSAocCktPlNldFZlcnRleFNoYWRlckNvbnN0YW50KGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXJDb25zdGFudChwLGEsYixjKSAocCktPkdldFZlcnRleFNoYWRlckNvbnN0YW50KGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXJEZWNsYXJhdGlvbihwLGEsYixjKSAocCktPkdldFZlcnRleFNoYWRlckRlY2xhcmF0aW9uKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXJGdW5jdGlvbihwLGEsYixjKSAocCktPkdldFZlcnRleFNoYWRlckZ1bmN0aW9uKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRTdHJlYW1Tb3VyY2UocCxhLGIsYykgKHApLT5TZXRTdHJlYW1Tb3VyY2UoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFN0cmVhbVNvdXJjZShwLGEsYixjKSAocCktPkdldFN0cmVhbVNvdXJjZShhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0SW5kaWNlcyhwLGEsYikgKHApLT5TZXRJbmRpY2VzKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0SW5kaWNlcyhwLGEsYikgKHApLT5HZXRJbmRpY2VzKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlUGl4ZWxTaGFkZXIocCxhLGIpIChwKS0+Q3JlYXRlUGl4ZWxTaGFkZXIoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQaXhlbFNoYWRlcihwLGEpIChwKS0+U2V0UGl4ZWxTaGFkZXIoYSkNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0UGl4ZWxTaGFkZXIocCxhKSAocCktPkdldFBpeGVsU2hhZGVyKGEpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RlbGV0ZVBpeGVsU2hhZGVyKHAsYSkgKHApLT5EZWxldGVQaXhlbFNoYWRlcihhKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQaXhlbFNoYWRlckNvbnN0YW50KHAsYSxiLGMpIChwKS0+U2V0UGl4ZWxTaGFkZXJDb25zdGFudChhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0UGl4ZWxTaGFkZXJDb25zdGFudChwLGEsYixjKSAocCktPkdldFBpeGVsU2hhZGVyQ29uc3RhbnQoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFBpeGVsU2hhZGVyRnVuY3Rpb24ocCxhLGIsYykgKHApLT5HZXRQaXhlbFNoYWRlckZ1bmN0aW9uKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EcmF3UmVjdFBhdGNoKHAsYSxiLGMpIChwKS0+RHJhd1JlY3RQYXRjaChhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRERldmljZThfRHJhd1RyaVBhdGNoKHAsYSxiLGMpIChwKS0+RHJhd1RyaVBhdGNoKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EZWxldGVQYXRjaChwLGEpIChwKS0+RGVsZXRlUGF0Y2goYSkNCi0jZW5kaWYNCi0NCi0NCi0NCi0jdW5kZWYgSU5URVJGQUNFDQotI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNEU3dhcENoYWluOA0KLQ0KLURFQ0xBUkVfSU5URVJGQUNFXyhJRGlyZWN0M0RTd2FwQ2hhaW44LCBJVW5rbm93bikNCi17DQotICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovDQotICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHZPYmopIFBVUkU7DQotICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpKFRISVMpIFBVUkU7DQotDQotICAgIC8qKiogSURpcmVjdDNEU3dhcENoYWluOCBtZXRob2RzICoqKi8NCi0gICAgU1RETUVUSE9EKFByZXNlbnQpKFRISVNfIENPTlNUIFJFQ1QqIHBTb3VyY2VSZWN0LENPTlNUIFJFQ1QqIHBEZXN0UmVjdCxIV05EIGhEZXN0V2luZG93T3ZlcnJpZGUsQ09OU1QgUkdOREFUQSogcERpcnR5UmVnaW9uKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0QmFja0J1ZmZlcikoVEhJU18gVUlOVCBCYWNrQnVmZmVyLEQzREJBQ0tCVUZGRVJfVFlQRSBUeXBlLElEaXJlY3QzRFN1cmZhY2U4KiogcHBCYWNrQnVmZmVyKSBQVVJFOw0KLX07DQotDQotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEU3dhcENoYWluOCAqTFBESVJFQ1QzRFNXQVBDSEFJTjgsICpQRElSRUNUM0RTV0FQQ0hBSU44Ow0KLQ0KLSNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9BZGRSZWYocCkgKHApLT5scFZ0YmwtPkFkZFJlZihwKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApDQotI2RlZmluZSBJRGlyZWN0M0RTd2FwQ2hhaW44X1ByZXNlbnQocCxhLGIsYyxkKSAocCktPmxwVnRibC0+UHJlc2VudChwLGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0RTd2FwQ2hhaW44X0dldEJhY2tCdWZmZXIocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldEJhY2tCdWZmZXIocCxhLGIsYykNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RTd2FwQ2hhaW44X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQotI2RlZmluZSBJRGlyZWN0M0RTd2FwQ2hhaW44X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzRFN3YXBDaGFpbjhfUHJlc2VudChwLGEsYixjLGQpIChwKS0+UHJlc2VudChhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9HZXRCYWNrQnVmZmVyKHAsYSxiLGMpIChwKS0+R2V0QmFja0J1ZmZlcihhLGIsYykNCi0jZW5kaWYNCi0NCi0NCi0NCi0jdW5kZWYgSU5URVJGQUNFDQotI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNEUmVzb3VyY2U4DQotDQotREVDTEFSRV9JTlRFUkZBQ0VfKElEaXJlY3QzRFJlc291cmNlOCwgSVVua25vd24pDQotew0KLSAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KLQ0KLSAgICAvKioqIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzICoqKi8NCi0gICAgU1RETUVUSE9EKEdldERldmljZSkoVEhJU18gSURpcmVjdDNERGV2aWNlOCoqIHBwRGV2aWNlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCxDT05TVCB2b2lkKiBwRGF0YSxEV09SRCBTaXplT2ZEYXRhLERXT1JEIEZsYWdzKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQotICAgIFNURE1FVEhPRChGcmVlUHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCkgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgU2V0UHJpb3JpdHkpKFRISVNfIERXT1JEIFByaW9yaXR5TmV3KSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQcmlvcml0eSkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyh2b2lkLCBQcmVMb2FkKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKEQzRFJFU09VUkNFVFlQRSwgR2V0VHlwZSkoVEhJUykgUFVSRTsNCi19Ow0KLQ0KLXR5cGVkZWYgc3RydWN0IElEaXJlY3QzRFJlc291cmNlOCAqTFBESVJFQ1QzRFJFU09VUkNFOCwgKlBESVJFQ1QzRFJFU09VUkNFODsNCi0NCi0jaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQotI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KLSNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X0dldERldmljZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXZpY2UocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UHJpdmF0ZURhdGEocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPmxwVnRibC0+RnJlZVByaXZhdGVEYXRhKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfR2V0UHJpb3JpdHkocCkgKHApLT5scFZ0YmwtPkdldFByaW9yaXR5KHApDQotI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfUHJlTG9hZChwKSAocCktPmxwVnRibC0+UHJlTG9hZChwKQ0KLSNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPlF1ZXJ5SW50ZXJmYWNlKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9BZGRSZWYocCkgKHApLT5BZGRSZWYoKQ0KLSNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9HZXREZXZpY2UocCxhKSAocCktPkdldERldmljZShhKQ0KLSNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5TZXRQcml2YXRlRGF0YShhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfRnJlZVByaXZhdGVEYXRhKHAsYSkgKHApLT5GcmVlUHJpdmF0ZURhdGEoYSkNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+U2V0UHJpb3JpdHkoYSkNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9HZXRQcmlvcml0eShwKSAocCktPkdldFByaW9yaXR5KCkNCi0jZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9QcmVMb2FkKHApIChwKS0+UHJlTG9hZCgpDQotI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfR2V0VHlwZShwKSAocCktPkdldFR5cGUoKQ0KLSNlbmRpZg0KLQ0KLQ0KLQ0KLQ0KLSN1bmRlZiBJTlRFUkZBQ0UNCi0jZGVmaW5lIElOVEVSRkFDRSBJRGlyZWN0M0RCYXNlVGV4dHVyZTgNCi0NCi1ERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNEQmFzZVRleHR1cmU4LCBJRGlyZWN0M0RSZXNvdXJjZTgpDQotew0KLSAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KLQ0KLSAgICAvKioqIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzICoqKi8NCi0gICAgU1RETUVUSE9EKEdldERldmljZSkoVEhJU18gSURpcmVjdDNERGV2aWNlOCoqIHBwRGV2aWNlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCxDT05TVCB2b2lkKiBwRGF0YSxEV09SRCBTaXplT2ZEYXRhLERXT1JEIEZsYWdzKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQotICAgIFNURE1FVEhPRChGcmVlUHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCkgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgU2V0UHJpb3JpdHkpKFRISVNfIERXT1JEIFByaW9yaXR5TmV3KSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQcmlvcml0eSkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyh2b2lkLCBQcmVMb2FkKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKEQzRFJFU09VUkNFVFlQRSwgR2V0VHlwZSkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgU2V0TE9EKShUSElTXyBEV09SRCBMT0ROZXcpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldExPRCkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgR2V0TGV2ZWxDb3VudCkoVEhJUykgUFVSRTsNCi19Ow0KLQ0KLXR5cGVkZWYgc3RydWN0IElEaXJlY3QzREJhc2VUZXh0dXJlOCAqTFBESVJFQ1QzREJBU0VURVhUVVJFOCwgKlBESVJFQ1QzREJBU0VURVhUVVJFODsNCi0NCi0jaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQotI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0dldERldmljZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXZpY2UocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UHJpdmF0ZURhdGEocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPmxwVnRibC0+RnJlZVByaXZhdGVEYXRhKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfR2V0UHJpb3JpdHkocCkgKHApLT5scFZ0YmwtPkdldFByaW9yaXR5KHApDQotI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfUHJlTG9hZChwKSAocCktPmxwVnRibC0+UHJlTG9hZChwKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9TZXRMT0QocCxhKSAocCktPmxwVnRibC0+U2V0TE9EKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXRMT0QocCkgKHApLT5scFZ0YmwtPkdldExPRChwKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0dldExldmVsQ291bnQocCkgKHApLT5scFZ0YmwtPkdldExldmVsQ291bnQocCkNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPlF1ZXJ5SW50ZXJmYWNlKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9BZGRSZWYocCkgKHApLT5BZGRSZWYoKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXREZXZpY2UocCxhKSAocCktPkdldERldmljZShhKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5TZXRQcml2YXRlRGF0YShhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfRnJlZVByaXZhdGVEYXRhKHAsYSkgKHApLT5GcmVlUHJpdmF0ZURhdGEoYSkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+U2V0UHJpb3JpdHkoYSkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXRQcmlvcml0eShwKSAocCktPkdldFByaW9yaXR5KCkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9QcmVMb2FkKHApIChwKS0+UHJlTG9hZCgpDQotI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfR2V0VHlwZShwKSAocCktPkdldFR5cGUoKQ0KLSNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1NldExPRChwLGEpIChwKS0+U2V0TE9EKGEpDQotI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfR2V0TE9EKHApIChwKS0+R2V0TE9EKCkNCi0jZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXRMZXZlbENvdW50KHApIChwKS0+R2V0TGV2ZWxDb3VudCgpDQotI2VuZGlmDQotDQotDQotDQotDQotDQotI3VuZGVmIElOVEVSRkFDRQ0KLSNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRFRleHR1cmU4DQotDQotREVDTEFSRV9JTlRFUkZBQ0VfKElEaXJlY3QzRFRleHR1cmU4LCBJRGlyZWN0M0RCYXNlVGV4dHVyZTgpDQotew0KLSAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KLQ0KLSAgICAvKioqIElEaXJlY3QzREJhc2VUZXh0dXJlOCBtZXRob2RzICoqKi8NCi0gICAgU1RETUVUSE9EKEdldERldmljZSkoVEhJU18gSURpcmVjdDNERGV2aWNlOCoqIHBwRGV2aWNlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCxDT05TVCB2b2lkKiBwRGF0YSxEV09SRCBTaXplT2ZEYXRhLERXT1JEIEZsYWdzKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQotICAgIFNURE1FVEhPRChGcmVlUHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCkgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgU2V0UHJpb3JpdHkpKFRISVNfIERXT1JEIFByaW9yaXR5TmV3KSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQcmlvcml0eSkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyh2b2lkLCBQcmVMb2FkKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKEQzRFJFU09VUkNFVFlQRSwgR2V0VHlwZSkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgU2V0TE9EKShUSElTXyBEV09SRCBMT0ROZXcpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldExPRCkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgR2V0TGV2ZWxDb3VudCkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldExldmVsRGVzYykoVEhJU18gVUlOVCBMZXZlbCxEM0RTVVJGQUNFX0RFU0MgKnBEZXNjKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0U3VyZmFjZUxldmVsKShUSElTXyBVSU5UIExldmVsLElEaXJlY3QzRFN1cmZhY2U4KiogcHBTdXJmYWNlTGV2ZWwpIFBVUkU7DQotICAgIFNURE1FVEhPRChMb2NrUmVjdCkoVEhJU18gVUlOVCBMZXZlbCxEM0RMT0NLRURfUkVDVCogcExvY2tlZFJlY3QsQ09OU1QgUkVDVCogcFJlY3QsRFdPUkQgRmxhZ3MpIFBVUkU7DQotICAgIFNURE1FVEhPRChVbmxvY2tSZWN0KShUSElTXyBVSU5UIExldmVsKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoQWRkRGlydHlSZWN0KShUSElTXyBDT05TVCBSRUNUKiBwRGlydHlSZWN0KSBQVVJFOw0KLX07DQotDQotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVGV4dHVyZTggKkxQRElSRUNUM0RURVhUVVJFOCwgKlBESVJFQ1QzRFRFWFRVUkU4Ow0KLQ0KLSNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXREZXZpY2UocCxhKSAocCktPmxwVnRibC0+R2V0RGV2aWNlKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXRQcml2YXRlRGF0YShwLGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfRnJlZVByaXZhdGVEYXRhKHAsYSkgKHApLT5scFZ0YmwtPkZyZWVQcml2YXRlRGF0YShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXRQcmlvcml0eShwKSAocCktPmxwVnRibC0+R2V0UHJpb3JpdHkocCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1ByZUxvYWQocCkgKHApLT5scFZ0YmwtPlByZUxvYWQocCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1NldExPRChwLGEpIChwKS0+bHBWdGJsLT5TZXRMT0QocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfR2V0TE9EKHApIChwKS0+bHBWdGJsLT5HZXRMT0QocCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldExldmVsQ291bnQocCkgKHApLT5scFZ0YmwtPkdldExldmVsQ291bnQocCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldExldmVsRGVzYyhwLGEsYikgKHApLT5scFZ0YmwtPkdldExldmVsRGVzYyhwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFN1cmZhY2VMZXZlbChwLGEsYikgKHApLT5scFZ0YmwtPkdldFN1cmZhY2VMZXZlbChwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0xvY2tSZWN0KHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPkxvY2tSZWN0KHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1VubG9ja1JlY3QocCxhKSAocCktPmxwVnRibC0+VW5sb2NrUmVjdChwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9BZGREaXJ0eVJlY3QocCxhKSAocCktPmxwVnRibC0+QWRkRGlydHlSZWN0KHAsYSkNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+UXVlcnlJbnRlcmZhY2UoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfQWRkUmVmKHApIChwKS0+QWRkUmVmKCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldERldmljZShwLGEpIChwKS0+R2V0RGV2aWNlKGEpDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIChwKS0+U2V0UHJpdmF0ZURhdGEoYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPkZyZWVQcml2YXRlRGF0YShhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfU2V0UHJpb3JpdHkocCxhKSAocCktPlNldFByaW9yaXR5KGEpDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXRQcmlvcml0eShwKSAocCktPkdldFByaW9yaXR5KCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1ByZUxvYWQocCkgKHApLT5QcmVMb2FkKCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFR5cGUocCkgKHApLT5HZXRUeXBlKCkNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1NldExPRChwLGEpIChwKS0+U2V0TE9EKGEpDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXRMT0QocCkgKHApLT5HZXRMT0QoKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfR2V0TGV2ZWxDb3VudChwKSAocCktPkdldExldmVsQ291bnQoKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfR2V0TGV2ZWxEZXNjKHAsYSxiKSAocCktPkdldExldmVsRGVzYyhhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXRTdXJmYWNlTGV2ZWwocCxhLGIpIChwKS0+R2V0U3VyZmFjZUxldmVsKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0xvY2tSZWN0KHAsYSxiLGMsZCkgKHApLT5Mb2NrUmVjdChhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfVW5sb2NrUmVjdChwLGEpIChwKS0+VW5sb2NrUmVjdChhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfQWRkRGlydHlSZWN0KHAsYSkgKHApLT5BZGREaXJ0eVJlY3QoYSkNCi0jZW5kaWYNCi0NCi0NCi0NCi0NCi0NCi0jdW5kZWYgSU5URVJGQUNFDQotI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTgNCi0NCi1ERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNEVm9sdW1lVGV4dHVyZTgsIElEaXJlY3QzREJhc2VUZXh0dXJlOCkNCi17DQotICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovDQotICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHZPYmopIFBVUkU7DQotICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpKFRISVMpIFBVUkU7DQotDQotICAgIC8qKiogSURpcmVjdDNEQmFzZVRleHR1cmU4IG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoR2V0RGV2aWNlKShUSElTXyBJRGlyZWN0M0REZXZpY2U4KiogcHBEZXZpY2UpIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLENPTlNUIHZvaWQqIHBEYXRhLERXT1JEIFNpemVPZkRhdGEsRFdPUkQgRmxhZ3MpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEZyZWVQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKERXT1JELCBTZXRQcmlvcml0eSkoVEhJU18gRFdPUkQgUHJpb3JpdHlOZXcpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldFByaW9yaXR5KShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKHZvaWQsIFByZUxvYWQpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oRDNEUkVTT1VSQ0VUWVBFLCBHZXRUeXBlKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKERXT1JELCBTZXRMT0QpKFRISVNfIERXT1JEIExPRE5ldykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgR2V0TE9EKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKERXT1JELCBHZXRMZXZlbENvdW50KShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0TGV2ZWxEZXNjKShUSElTXyBVSU5UIExldmVsLEQzRFZPTFVNRV9ERVNDICpwRGVzYykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldFZvbHVtZUxldmVsKShUSElTXyBVSU5UIExldmVsLElEaXJlY3QzRFZvbHVtZTgqKiBwcFZvbHVtZUxldmVsKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoTG9ja0JveCkoVEhJU18gVUlOVCBMZXZlbCxEM0RMT0NLRURfQk9YKiBwTG9ja2VkVm9sdW1lLENPTlNUIEQzREJPWCogcEJveCxEV09SRCBGbGFncykgUFVSRTsNCi0gICAgU1RETUVUSE9EKFVubG9ja0JveCkoVEhJU18gVUlOVCBMZXZlbCkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEFkZERpcnR5Qm94KShUSElTXyBDT05TVCBEM0RCT1gqIHBEaXJ0eUJveCkgUFVSRTsNCi19Ow0KLQ0KLXR5cGVkZWYgc3RydWN0IElEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICpMUERJUkVDVDNEVk9MVU1FVEVYVFVSRTgsICpQRElSRUNUM0RWT0xVTUVURVhUVVJFODsNCi0NCi0jaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9BZGRSZWYocCkgKHApLT5scFZ0YmwtPkFkZFJlZihwKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0RGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPkdldERldmljZShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UHJpdmF0ZURhdGEocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+bHBWdGJsLT5GcmVlUHJpdmF0ZURhdGEocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfU2V0UHJpb3JpdHkocCxhKSAocCktPmxwVnRibC0+U2V0UHJpb3JpdHkocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0UHJpb3JpdHkocCkgKHApLT5scFZ0YmwtPkdldFByaW9yaXR5KHApDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9QcmVMb2FkKHApIChwKS0+bHBWdGJsLT5QcmVMb2FkKHApDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRUeXBlKHApIChwKS0+bHBWdGJsLT5HZXRUeXBlKHApDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9TZXRMT0QocCxhKSAocCktPmxwVnRibC0+U2V0TE9EKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0dldExPRChwKSAocCktPmxwVnRibC0+R2V0TE9EKHApDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRMZXZlbENvdW50KHApIChwKS0+bHBWdGJsLT5HZXRMZXZlbENvdW50KHApDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRMZXZlbERlc2MocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRMZXZlbERlc2MocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRWb2x1bWVMZXZlbChwLGEsYikgKHApLT5scFZ0YmwtPkdldFZvbHVtZUxldmVsKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfTG9ja0JveChwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5Mb2NrQm94KHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X1VubG9ja0JveChwLGEpIChwKS0+bHBWdGJsLT5VbmxvY2tCb3gocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfQWRkRGlydHlCb3gocCxhKSAocCktPmxwVnRibC0+QWRkRGlydHlCb3gocCxhKQ0KLSNlbHNlDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9BZGRSZWYocCkgKHApLT5BZGRSZWYoKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfUmVsZWFzZShwKSAocCktPlJlbGVhc2UoKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0RGV2aWNlKHAsYSkgKHApLT5HZXREZXZpY2UoYSkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5TZXRQcml2YXRlRGF0YShhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5HZXRQcml2YXRlRGF0YShhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+RnJlZVByaXZhdGVEYXRhKGEpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+U2V0UHJpb3JpdHkoYSkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0dldFByaW9yaXR5KHApIChwKS0+R2V0UHJpb3JpdHkoKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfUHJlTG9hZChwKSAocCktPlByZUxvYWQoKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0VHlwZShwKSAocCktPkdldFR5cGUoKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfU2V0TE9EKHAsYSkgKHApLT5TZXRMT0QoYSkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0dldExPRChwKSAocCktPkdldExPRCgpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRMZXZlbENvdW50KHApIChwKS0+R2V0TGV2ZWxDb3VudCgpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRMZXZlbERlc2MocCxhLGIpIChwKS0+R2V0TGV2ZWxEZXNjKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0dldFZvbHVtZUxldmVsKHAsYSxiKSAocCktPkdldFZvbHVtZUxldmVsKGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0xvY2tCb3gocCxhLGIsYyxkKSAocCktPkxvY2tCb3goYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X1VubG9ja0JveChwLGEpIChwKS0+VW5sb2NrQm94KGEpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9BZGREaXJ0eUJveChwLGEpIChwKS0+QWRkRGlydHlCb3goYSkNCi0jZW5kaWYNCi0NCi0NCi0NCi0NCi0NCi0jdW5kZWYgSU5URVJGQUNFDQotI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNEQ3ViZVRleHR1cmU4DQotDQotREVDTEFSRV9JTlRFUkZBQ0VfKElEaXJlY3QzREN1YmVUZXh0dXJlOCwgSURpcmVjdDNEQmFzZVRleHR1cmU4KQ0KLXsNCi0gICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8NCi0gICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iaikgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsNCi0NCi0gICAgLyoqKiBJRGlyZWN0M0RCYXNlVGV4dHVyZTggbWV0aG9kcyAqKiovDQotICAgIFNURE1FVEhPRChHZXREZXZpY2UpKFRISVNfIElEaXJlY3QzRERldmljZTgqKiBwcERldmljZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKFNldFByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQsQ09OU1Qgdm9pZCogcERhdGEsRFdPUkQgU2l6ZU9mRGF0YSxEV09SRCBGbGFncykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldFByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQsdm9pZCogcERhdGEsRFdPUkQqIHBTaXplT2ZEYXRhKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoRnJlZVByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oRFdPUkQsIFNldFByaW9yaXR5KShUSElTXyBEV09SRCBQcmlvcml0eU5ldykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgR2V0UHJpb3JpdHkpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8odm9pZCwgUHJlTG9hZCkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEM0RSRVNPVVJDRVRZUEUsIEdldFR5cGUpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oRFdPUkQsIFNldExPRCkoVEhJU18gRFdPUkQgTE9ETmV3KSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKERXT1JELCBHZXRMT0QpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldExldmVsQ291bnQpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRMZXZlbERlc2MpKFRISVNfIFVJTlQgTGV2ZWwsRDNEU1VSRkFDRV9ERVNDICpwRGVzYykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldEN1YmVNYXBTdXJmYWNlKShUSElTXyBEM0RDVUJFTUFQX0ZBQ0VTIEZhY2VUeXBlLFVJTlQgTGV2ZWwsSURpcmVjdDNEU3VyZmFjZTgqKiBwcEN1YmVNYXBTdXJmYWNlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoTG9ja1JlY3QpKFRISVNfIEQzRENVQkVNQVBfRkFDRVMgRmFjZVR5cGUsVUlOVCBMZXZlbCxEM0RMT0NLRURfUkVDVCogcExvY2tlZFJlY3QsQ09OU1QgUkVDVCogcFJlY3QsRFdPUkQgRmxhZ3MpIFBVUkU7DQotICAgIFNURE1FVEhPRChVbmxvY2tSZWN0KShUSElTXyBEM0RDVUJFTUFQX0ZBQ0VTIEZhY2VUeXBlLFVJTlQgTGV2ZWwpIFBVUkU7DQotICAgIFNURE1FVEhPRChBZGREaXJ0eVJlY3QpKFRISVNfIEQzRENVQkVNQVBfRkFDRVMgRmFjZVR5cGUsQ09OU1QgUkVDVCogcERpcnR5UmVjdCkgUFVSRTsNCi19Ow0KLQ0KLXR5cGVkZWYgc3RydWN0IElEaXJlY3QzREN1YmVUZXh0dXJlOCAqTFBESVJFQ1QzRENVQkVURVhUVVJFOCwgKlBESVJFQ1QzRENVQkVURVhUVVJFODsNCi0NCi0jaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldERldmljZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXZpY2UocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UHJpdmF0ZURhdGEocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPmxwVnRibC0+RnJlZVByaXZhdGVEYXRhKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0UHJpb3JpdHkocCkgKHApLT5scFZ0YmwtPkdldFByaW9yaXR5KHApDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfUHJlTG9hZChwKSAocCktPmxwVnRibC0+UHJlTG9hZChwKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9TZXRMT0QocCxhKSAocCktPmxwVnRibC0+U2V0TE9EKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9HZXRMT0QocCkgKHApLT5scFZ0YmwtPkdldExPRChwKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldExldmVsQ291bnQocCkgKHApLT5scFZ0YmwtPkdldExldmVsQ291bnQocCkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9HZXRMZXZlbERlc2MocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRMZXZlbERlc2MocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0Q3ViZU1hcFN1cmZhY2UocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldEN1YmVNYXBTdXJmYWNlKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfTG9ja1JlY3QocCxhLGIsYyxkLGUpIChwKS0+bHBWdGJsLT5Mb2NrUmVjdChwLGEsYixjLGQsZSkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9VbmxvY2tSZWN0KHAsYSxiKSAocCktPmxwVnRibC0+VW5sb2NrUmVjdChwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9BZGREaXJ0eVJlY3QocCxhLGIpIChwKS0+bHBWdGJsLT5BZGREaXJ0eVJlY3QocCxhLGIpDQotI2Vsc2UNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfQWRkUmVmKHApIChwKS0+QWRkUmVmKCkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9SZWxlYXNlKHApIChwKS0+UmVsZWFzZSgpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0RGV2aWNlKHAsYSkgKHApLT5HZXREZXZpY2UoYSkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIChwKS0+U2V0UHJpdmF0ZURhdGEoYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPkdldFByaXZhdGVEYXRhKGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+RnJlZVByaXZhdGVEYXRhKGEpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfU2V0UHJpb3JpdHkocCxhKSAocCktPlNldFByaW9yaXR5KGEpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0UHJpb3JpdHkocCkgKHApLT5HZXRQcmlvcml0eSgpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfUHJlTG9hZChwKSAocCktPlByZUxvYWQoKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldFR5cGUocCkgKHApLT5HZXRUeXBlKCkNCi0jZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9TZXRMT0QocCxhKSAocCktPlNldExPRChhKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldExPRChwKSAocCktPkdldExPRCgpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0TGV2ZWxDb3VudChwKSAocCktPkdldExldmVsQ291bnQoKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldExldmVsRGVzYyhwLGEsYikgKHApLT5HZXRMZXZlbERlc2MoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldEN1YmVNYXBTdXJmYWNlKHAsYSxiLGMpIChwKS0+R2V0Q3ViZU1hcFN1cmZhY2UoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfTG9ja1JlY3QocCxhLGIsYyxkLGUpIChwKS0+TG9ja1JlY3QoYSxiLGMsZCxlKQ0KLSNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X1VubG9ja1JlY3QocCxhLGIpIChwKS0+VW5sb2NrUmVjdChhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfQWRkRGlydHlSZWN0KHAsYSxiKSAocCktPkFkZERpcnR5UmVjdChhLGIpDQotI2VuZGlmDQotDQotDQotDQotDQotI3VuZGVmIElOVEVSRkFDRQ0KLSNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgNCi0NCi1ERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNEVmVydGV4QnVmZmVyOCwgSURpcmVjdDNEUmVzb3VyY2U4KQ0KLXsNCi0gICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8NCi0gICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iaikgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsNCi0NCi0gICAgLyoqKiBJRGlyZWN0M0RSZXNvdXJjZTggbWV0aG9kcyAqKiovDQotICAgIFNURE1FVEhPRChHZXREZXZpY2UpKFRISVNfIElEaXJlY3QzRERldmljZTgqKiBwcERldmljZSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKFNldFByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQsQ09OU1Qgdm9pZCogcERhdGEsRFdPUkQgU2l6ZU9mRGF0YSxEV09SRCBGbGFncykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldFByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQsdm9pZCogcERhdGEsRFdPUkQqIHBTaXplT2ZEYXRhKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoRnJlZVByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oRFdPUkQsIFNldFByaW9yaXR5KShUSElTXyBEV09SRCBQcmlvcml0eU5ldykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgR2V0UHJpb3JpdHkpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8odm9pZCwgUHJlTG9hZCkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEM0RSRVNPVVJDRVRZUEUsIEdldFR5cGUpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRChMb2NrKShUSElTXyBVSU5UIE9mZnNldFRvTG9jayxVSU5UIFNpemVUb0xvY2ssQllURSoqIHBwYkRhdGEsRFdPUkQgRmxhZ3MpIFBVUkU7DQotICAgIFNURE1FVEhPRChVbmxvY2spKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXREZXNjKShUSElTXyBEM0RWRVJURVhCVUZGRVJfREVTQyAqcERlc2MpIFBVUkU7DQotfTsNCi0NCi10eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICpMUERJUkVDVDNEVkVSVEVYQlVGRkVSOCwgKlBESVJFQ1QzRFZFUlRFWEJVRkZFUjg7DQotDQotI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKENJTlRFUkZBQ0UpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1JlbGVhc2UocCkgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0RGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPkdldERldmljZShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFByaXZhdGVEYXRhKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+bHBWdGJsLT5GcmVlUHJpdmF0ZURhdGEocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0dldFByaW9yaXR5KHApIChwKS0+bHBWdGJsLT5HZXRQcmlvcml0eShwKQ0KLSNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9QcmVMb2FkKHApIChwKS0+bHBWdGJsLT5QcmVMb2FkKHApDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfTG9jayhwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5Mb2NrKHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfVW5sb2NrKHApIChwKS0+bHBWdGJsLT5VbmxvY2socCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0RGVzYyhwLGEpIChwKS0+bHBWdGJsLT5HZXREZXNjKHAsYSkNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0RGV2aWNlKHAsYSkgKHApLT5HZXREZXZpY2UoYSkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPlNldFByaXZhdGVEYXRhKGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+RnJlZVByaXZhdGVEYXRhKGEpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1NldFByaW9yaXR5KHAsYSkgKHApLT5TZXRQcmlvcml0eShhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9HZXRQcmlvcml0eShwKSAocCktPkdldFByaW9yaXR5KCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfUHJlTG9hZChwKSAocCktPlByZUxvYWQoKQ0KLSNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9HZXRUeXBlKHApIChwKS0+R2V0VHlwZSgpDQotI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0xvY2socCxhLGIsYyxkKSAocCktPkxvY2soYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfVW5sb2NrKHApIChwKS0+VW5sb2NrKCkNCi0jZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0RGVzYyhwLGEpIChwKS0+R2V0RGVzYyhhKQ0KLSNlbmRpZg0KLQ0KLQ0KLQ0KLQ0KLSN1bmRlZiBJTlRFUkZBQ0UNCi0jZGVmaW5lIElOVEVSRkFDRSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjgNCi0NCi1ERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNESW5kZXhCdWZmZXI4LCBJRGlyZWN0M0RSZXNvdXJjZTgpDQotew0KLSAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KLQ0KLSAgICAvKioqIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzICoqKi8NCi0gICAgU1RETUVUSE9EKEdldERldmljZSkoVEhJU18gSURpcmVjdDNERGV2aWNlOCoqIHBwRGV2aWNlKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoU2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCxDT05TVCB2b2lkKiBwRGF0YSxEV09SRCBTaXplT2ZEYXRhLERXT1JEIEZsYWdzKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQotICAgIFNURE1FVEhPRChGcmVlUHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCkgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhEV09SRCwgU2V0UHJpb3JpdHkpKFRISVNfIERXT1JEIFByaW9yaXR5TmV3KSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQcmlvcml0eSkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyh2b2lkLCBQcmVMb2FkKShUSElTKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKEQzRFJFU09VUkNFVFlQRSwgR2V0VHlwZSkoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EKExvY2spKFRISVNfIFVJTlQgT2Zmc2V0VG9Mb2NrLFVJTlQgU2l6ZVRvTG9jayxCWVRFKiogcHBiRGF0YSxEV09SRCBGbGFncykgUFVSRTsNCi0gICAgU1RETUVUSE9EKFVubG9jaykoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EKEdldERlc2MpKFRISVNfIEQzRElOREVYQlVGRkVSX0RFU0MgKnBEZXNjKSBQVVJFOw0KLX07DQotDQotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNESW5kZXhCdWZmZXI4ICpMUERJUkVDVDNESU5ERVhCVUZGRVI4LCAqUERJUkVDVDNESU5ERVhCVUZGRVI4Ow0KLQ0KLSNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfQWRkUmVmKHApIChwKS0+bHBWdGJsLT5BZGRSZWYocCkNCi0jZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfR2V0RGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPkdldERldmljZShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPmxwVnRibC0+U2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXRQcml2YXRlRGF0YShwLGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+bHBWdGJsLT5GcmVlUHJpdmF0ZURhdGEocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1NldFByaW9yaXR5KHAsYSkgKHApLT5scFZ0YmwtPlNldFByaW9yaXR5KHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9HZXRQcmlvcml0eShwKSAocCktPmxwVnRibC0+R2V0UHJpb3JpdHkocCkNCi0jZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9QcmVMb2FkKHApIChwKS0+bHBWdGJsLT5QcmVMb2FkKHApDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfR2V0VHlwZShwKSAocCktPmxwVnRibC0+R2V0VHlwZShwKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0xvY2socCxhLGIsYyxkKSAocCktPmxwVnRibC0+TG9jayhwLGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfVW5sb2NrKHApIChwKS0+bHBWdGJsLT5VbmxvY2socCkNCi0jZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9HZXREZXNjKHAsYSkgKHApLT5scFZ0YmwtPkdldERlc2MocCxhKQ0KLSNlbHNlDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+UXVlcnlJbnRlcmZhY2UoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfUmVsZWFzZShwKSAocCktPlJlbGVhc2UoKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0dldERldmljZShwLGEpIChwKS0+R2V0RGV2aWNlKGEpDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPlNldFByaXZhdGVEYXRhKGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5HZXRQcml2YXRlRGF0YShhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPkZyZWVQcml2YXRlRGF0YShhKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1NldFByaW9yaXR5KHAsYSkgKHApLT5TZXRQcmlvcml0eShhKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0dldFByaW9yaXR5KHApIChwKS0+R2V0UHJpb3JpdHkoKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1ByZUxvYWQocCkgKHApLT5QcmVMb2FkKCkNCi0jZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9HZXRUeXBlKHApIChwKS0+R2V0VHlwZSgpDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfTG9jayhwLGEsYixjLGQpIChwKS0+TG9jayhhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1VubG9jayhwKSAocCktPlVubG9jaygpDQotI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfR2V0RGVzYyhwLGEpIChwKS0+R2V0RGVzYyhhKQ0KLSNlbmRpZg0KLQ0KLQ0KLQ0KLQ0KLSN1bmRlZiBJTlRFUkZBQ0UNCi0jZGVmaW5lIElOVEVSRkFDRSBJRGlyZWN0M0RTdXJmYWNlOA0KLQ0KLURFQ0xBUkVfSU5URVJGQUNFXyhJRGlyZWN0M0RTdXJmYWNlOCwgSVVua25vd24pDQotew0KLSAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KLSAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KLQ0KLSAgICAvKioqIElEaXJlY3QzRFN1cmZhY2U4IG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoR2V0RGV2aWNlKShUSElTXyBJRGlyZWN0M0REZXZpY2U4KiogcHBEZXZpY2UpIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLENPTlNUIHZvaWQqIHBEYXRhLERXT1JEIFNpemVPZkRhdGEsRFdPUkQgRmxhZ3MpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEZyZWVQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0Q29udGFpbmVyKShUSElTXyBSRUZJSUQgcmlpZCx2b2lkKiogcHBDb250YWluZXIpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXREZXNjKShUSElTXyBEM0RTVVJGQUNFX0RFU0MgKnBEZXNjKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoTG9ja1JlY3QpKFRISVNfIEQzRExPQ0tFRF9SRUNUKiBwTG9ja2VkUmVjdCxDT05TVCBSRUNUKiBwUmVjdCxEV09SRCBGbGFncykgUFVSRTsNCi0gICAgU1RETUVUSE9EKFVubG9ja1JlY3QpKFRISVMpIFBVUkU7DQotfTsNCi0NCi10eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RTdXJmYWNlOCAqTFBESVJFQ1QzRFNVUkZBQ0U4LCAqUERJUkVDVDNEU1VSRkFDRTg7DQotDQotI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKENJTlRFUkZBQ0UpDQotI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfQWRkUmVmKHApIChwKS0+bHBWdGJsLT5BZGRSZWYocCkNCi0jZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X1JlbGVhc2UocCkgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkNCi0jZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldERldmljZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXZpY2UocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPmxwVnRibC0+U2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFByaXZhdGVEYXRhKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPmxwVnRibC0+RnJlZVByaXZhdGVEYXRhKHAsYSkNCi0jZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldENvbnRhaW5lcihwLGEsYikgKHApLT5scFZ0YmwtPkdldENvbnRhaW5lcihwLGEsYikNCi0jZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldERlc2MocCxhKSAocCktPmxwVnRibC0+R2V0RGVzYyhwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9Mb2NrUmVjdChwLGEsYixjKSAocCktPmxwVnRibC0+TG9ja1JlY3QocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X1VubG9ja1JlY3QocCkgKHApLT5scFZ0YmwtPlVubG9ja1JlY3QocCkNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+UXVlcnlJbnRlcmZhY2UoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfQWRkUmVmKHApIChwKS0+QWRkUmVmKCkNCi0jZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldERldmljZShwLGEpIChwKS0+R2V0RGV2aWNlKGEpDQotI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIChwKS0+U2V0UHJpdmF0ZURhdGEoYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPkZyZWVQcml2YXRlRGF0YShhKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfR2V0Q29udGFpbmVyKHAsYSxiKSAocCktPkdldENvbnRhaW5lcihhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9HZXREZXNjKHAsYSkgKHApLT5HZXREZXNjKGEpDQotI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9Mb2NrUmVjdChwLGEsYixjKSAocCktPkxvY2tSZWN0KGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfVW5sb2NrUmVjdChwKSAocCktPlVubG9ja1JlY3QoKQ0KLSNlbmRpZg0KLQ0KLQ0KLQ0KLQ0KLSN1bmRlZiBJTlRFUkZBQ0UNCi0jZGVmaW5lIElOVEVSRkFDRSBJRGlyZWN0M0RWb2x1bWU4DQotDQotREVDTEFSRV9JTlRFUkZBQ0VfKElEaXJlY3QzRFZvbHVtZTgsIElVbmtub3duKQ0KLXsNCi0gICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8NCi0gICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iaikgUFVSRTsNCi0gICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpKFRISVMpIFBVUkU7DQotICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsNCi0NCi0gICAgLyoqKiBJRGlyZWN0M0RWb2x1bWU4IG1ldGhvZHMgKioqLw0KLSAgICBTVERNRVRIT0QoR2V0RGV2aWNlKShUSElTXyBJRGlyZWN0M0REZXZpY2U4KiogcHBEZXZpY2UpIFBVUkU7DQotICAgIFNURE1FVEhPRChTZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLENPTlNUIHZvaWQqIHBEYXRhLERXT1JEIFNpemVPZkRhdGEsRFdPUkQgRmxhZ3MpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCi0gICAgU1RETUVUSE9EKEZyZWVQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkKSBQVVJFOw0KLSAgICBTVERNRVRIT0QoR2V0Q29udGFpbmVyKShUSElTXyBSRUZJSUQgcmlpZCx2b2lkKiogcHBDb250YWluZXIpIFBVUkU7DQotICAgIFNURE1FVEhPRChHZXREZXNjKShUSElTXyBEM0RWT0xVTUVfREVTQyAqcERlc2MpIFBVUkU7DQotICAgIFNURE1FVEhPRChMb2NrQm94KShUSElTXyBEM0RMT0NLRURfQk9YICogcExvY2tlZFZvbHVtZSxDT05TVCBEM0RCT1gqIHBCb3gsRFdPUkQgRmxhZ3MpIFBVUkU7DQotICAgIFNURE1FVEhPRChVbmxvY2tCb3gpKFRISVMpIFBVUkU7DQotfTsNCi0NCi10eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWb2x1bWU4ICpMUERJUkVDVDNEVk9MVU1FOCwgKlBESVJFQ1QzRFZPTFVNRTg7DQotDQotI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKENJTlRFUkZBQ0UpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X1JlbGVhc2UocCkgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfR2V0RGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPkdldERldmljZShwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFByaXZhdGVEYXRhKHAsYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+bHBWdGJsLT5GcmVlUHJpdmF0ZURhdGEocCxhKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lOF9HZXRDb250YWluZXIocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRDb250YWluZXIocCxhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0dldERlc2MocCxhKSAocCktPmxwVnRibC0+R2V0RGVzYyhwLGEpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0xvY2tCb3gocCxhLGIsYykgKHApLT5scFZ0YmwtPkxvY2tCb3gocCxhLGIsYykNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfVW5sb2NrQm94KHApIChwKS0+bHBWdGJsLT5VbmxvY2tCb3gocCkNCi0jZWxzZQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfR2V0RGV2aWNlKHAsYSkgKHApLT5HZXREZXZpY2UoYSkNCi0jZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPlNldFByaXZhdGVEYXRhKGEsYixjLGQpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+RnJlZVByaXZhdGVEYXRhKGEpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0dldENvbnRhaW5lcihwLGEsYikgKHApLT5HZXRDb250YWluZXIoYSxiKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lOF9HZXREZXNjKHAsYSkgKHApLT5HZXREZXNjKGEpDQotI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0xvY2tCb3gocCxhLGIsYykgKHApLT5Mb2NrQm94KGEsYixjKQ0KLSNkZWZpbmUgSURpcmVjdDNEVm9sdW1lOF9VbmxvY2tCb3gocCkgKHApLT5VbmxvY2tCb3goKQ0KLSNlbmRpZg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRmxhZ3MgZm9yIFNldFByaXZhdGVEYXRhIG1ldGhvZCBvbiBhbGwgRDNEOCBpbnRlcmZhY2VzDQotICoNCi0gKiBUaGUgcGFzc2VkIHBvaW50ZXIgaXMgYW4gSVVua25vd24gcHRyLiBUaGUgU2l6ZU9mRGF0YSBhcmd1bWVudCB0byBTZXRQcml2YXRlRGF0YQ0KLSAqIG11c3QgYmUgc2V0IHRvIHNpemVvZihJVW5rbm93biopLiBEaXJlY3QzRCB3aWxsIGNhbGwgQWRkUmVmIHRocm91Z2ggdGhpcw0KLSAqIHBvaW50ZXIgYW5kIFJlbGVhc2Ugd2hlbiB0aGUgcHJpdmF0ZSBkYXRhIGlzIGRlc3Ryb3llZC4gVGhlIGRhdGEgd2lsbCBiZQ0KLSAqIGRlc3Ryb3llZCB3aGVuIGFub3RoZXIgU2V0UHJpdmF0ZURhdGEgd2l0aCB0aGUgc2FtZSBHVUlEIGlzIHNldCwgd2hlbg0KLSAqIEZyZWVQcml2YXRlRGF0YSBpcyBjYWxsZWQsIG9yIHdoZW4gdGhlIEQzRDggb2JqZWN0IGlzIGZyZWVkLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNkZWZpbmUgRDNEU1BEX0lVTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKg0KLSAqIFBhcmFtZXRlciBmb3IgSURpcmVjdDNEOCBFbnVtIGFuZCBHZXRDYXBzOCBmdW5jdGlvbnMgdG8gZ2V0IHRoZSBpbmZvIGZvcg0KLSAqIHRoZSBjdXJyZW50IG1vZGUgb25seS4NCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNkZWZpbmUgRDNEQ1VSUkVOVF9ESVNQTEFZX01PREUgICAgICAgICAgICAgICAgIDB4MDBFRkZGRkZMDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKg0KLSAqIEZsYWdzIGZvciBJRGlyZWN0M0Q4OjpDcmVhdGVEZXZpY2UncyBCZWhhdmlvckZsYWdzDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jZGVmaW5lIEQzRENSRUFURV9GUFVfUFJFU0VSVkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTA0KLSNkZWZpbmUgRDNEQ1JFQVRFX01VTFRJVEhSRUFERUQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMDQotDQotI2RlZmluZSBEM0RDUkVBVEVfUFVSRURFVklDRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwNCi0jZGVmaW5lIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HICAgICAweDAwMDAwMDIwTA0KLSNkZWZpbmUgRDNEQ1JFQVRFX0hBUkRXQVJFX1ZFUlRFWFBST0NFU1NJTkcgICAgIDB4MDAwMDAwNDBMDQotI2RlZmluZSBEM0RDUkVBVEVfTUlYRURfVkVSVEVYUFJPQ0VTU0lORyAgICAgICAgMHgwMDAwMDA4MEwNCi0NCi0jZGVmaW5lIEQzRENSRUFURV9ESVNBQkxFX0RSSVZFUl9NQU5BR0VNRU5UICAgICAweDAwMDAwMTAwTA0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICoNCi0gKiBQYXJhbWV0ZXIgZm9yIElEaXJlY3QzRDg6OkNyZWF0ZURldmljZSdzIGlBZGFwdGVyDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jZGVmaW5lIEQzREFEQVBURVJfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgIDANCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqDQotICogRmxhZ3MgZm9yIElEaXJlY3QzRDg6OkVudW1BZGFwdGVycw0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2RlZmluZSBEM0RFTlVNX05PX1dIUUxfTEVWRUwgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqDQotICogTWF4aW11bSBudW1iZXIgb2YgYmFjay1idWZmZXJzIHN1cHBvcnRlZCBpbiBEWDgNCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNkZWZpbmUgRDNEUFJFU0VOVF9CQUNLX0JVRkZFUlNfTUFYICAgICAgICAgICAgIDNMDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKg0KLSAqIEZsYWdzIGZvciBJRGlyZWN0M0REZXZpY2U4OjpTZXRHYW1tYVJhbXANCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNkZWZpbmUgRDNEU0dSX05PX0NBTElCUkFUSU9OICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwNCi0jZGVmaW5lIEQzRFNHUl9DQUxJQlJBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKg0KLSAqIEZsYWdzIGZvciBJRGlyZWN0M0REZXZpY2U4OjpTZXRDdXJzb3JQb3NpdGlvbg0KLSAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2RlZmluZSBEM0RDVVJTT1JfSU1NRURJQVRFX1VQREFURSAgICAgICAgICAgICAweDAwMDAwMDAxTA0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICoNCi0gKiBGbGFncyBmb3IgRHJhd1ByaW1pdGl2ZS9EcmF3SW5kZXhlZFByaW1pdGl2ZQ0KLSAqICAgQWxzbyB2YWxpZCBmb3IgQmVnaW4vQmVnaW5JbmRleGVkDQotICogICBBbHNvIHZhbGlkIGZvciBWZXJ0ZXhCdWZmZXI6OkNyZWF0ZVZlcnRleEJ1ZmZlcg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLS8qDQotICogIERpcmVjdERyYXcgZXJyb3IgY29kZXMNCi0gKi8NCi0jZGVmaW5lIF9GQUNEM0QgIDB4ODc2DQotI2RlZmluZSBNQUtFX0QzREhSRVNVTFQoIGNvZGUgKSAgTUFLRV9IUkVTVUxUKCAxLCBfRkFDRDNELCBjb2RlICkNCi0NCi0vKg0KLSAqIERpcmVjdDNEIEVycm9ycw0KLSAqLw0KLSNkZWZpbmUgRDNEX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU19PSw0KLQ0KLSNkZWZpbmUgRDNERVJSX1dST05HVEVYVFVSRUZPUk1BVCAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDcyKQ0KLSNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEQ09MT1JPUEVSQVRJT04gICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDczKQ0KLSNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEQ09MT1JBUkcgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc0KQ0KLSNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEQUxQSEFPUEVSQVRJT04gICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc1KQ0KLSNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEQUxQSEFBUkcgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc2KQ0KLSNkZWZpbmUgRDNERVJSX1RPT01BTllPUEVSQVRJT05TICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc3KQ0KLSNkZWZpbmUgRDNERVJSX0NPTkZMSUNUSU5HVEVYVFVSRUZJTFRFUiAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc4KQ0KLSNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVERkFDVE9SVkFMVUUgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc5KQ0KLSNkZWZpbmUgRDNERVJSX0NPTkZMSUNUSU5HUkVOREVSU1RBVEUgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDgxKQ0KLSNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEVEVYVFVSRUZJTFRFUiAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDgyKQ0KLSNkZWZpbmUgRDNERVJSX0NPTkZMSUNUSU5HVEVYVFVSRVBBTEVUVEUgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDg2KQ0KLSNkZWZpbmUgRDNERVJSX0RSSVZFUklOVEVSTkFMRVJST1IgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDg3KQ0KLQ0KLSNkZWZpbmUgRDNERVJSX05PVEZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTUwKQ0KLSNkZWZpbmUgRDNERVJSX01PUkVEQVRBICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTUxKQ0KLSNkZWZpbmUgRDNERVJSX0RFVklDRUxPU1QgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTUyKQ0KLSNkZWZpbmUgRDNERVJSX0RFVklDRU5PVFJFU0VUICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTUzKQ0KLSNkZWZpbmUgRDNERVJSX05PVEFWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTU0KQ0KLSNkZWZpbmUgRDNERVJSX09VVE9GVklERU9NRU1PUlkgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgzODApDQotI2RlZmluZSBEM0RFUlJfSU5WQUxJRERFVklDRSAgICAgICAgICAgICAgICAgICAgTUFLRV9EM0RIUkVTVUxUKDIxNTUpDQotI2RlZmluZSBEM0RFUlJfSU5WQUxJRENBTEwgICAgICAgICAgICAgICAgICAgICAgTUFLRV9EM0RIUkVTVUxUKDIxNTYpDQotI2RlZmluZSBEM0RFUlJfRFJJVkVSSU5WQUxJRENBTEwgICAgICAgICAgICAgICAgTUFLRV9EM0RIUkVTVUxUKDIxNTcpDQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfTsNCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogKERJUkVDVDNEX1ZFUlNJT04gPj0gMHgwODAwKSAqLw0KLSNlbmRpZiAvKiBfRDNEX0hfICovDQotDQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9EaXJlY3QzRC9kM2Q4Y2Fwcy5oIGIvaW5jbHVkZS9EaXJlY3QzRC9kM2Q4Y2Fwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTdkYzExLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvRGlyZWN0M0QvZDNkOGNhcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ow0KLSAqDQotICogIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKg0KLSAqICBGaWxlOiAgICAgICBkM2Q4Y2Fwcy5oDQotICogIENvbnRlbnQ6ICAgIERpcmVjdDNEIGNhcGFiaWxpdGllcyBpbmNsdWRlIGZpbGUNCi0gKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2lmbmRlZiBfRDNEOENBUFNfSA0KLSNkZWZpbmUgX0QzRDhDQVBTX0gNCi0NCi0jaWZuZGVmIERJUkVDVDNEX1ZFUlNJT04NCi0jZGVmaW5lIERJUkVDVDNEX1ZFUlNJT04gICAgICAgICAweDA4MDANCi0jZW5kaWYgIC8vRElSRUNUM0RfVkVSU0lPTg0KLQ0KLS8vIGluY2x1ZGUgdGhpcyBmaWxlIGNvbnRlbnQgb25seSBpZiBjb21waWxpbmcgZm9yIERYOCBpbnRlcmZhY2VzDQotI2lmKERJUkVDVDNEX1ZFUlNJT04gPj0gMHgwODAwKQ0KLQ0KLSNpZiBkZWZpbmVkKF9YODZfKSB8fCBkZWZpbmVkKF9JQTY0XykNCi0jcHJhZ21hIHBhY2soNCkNCi0jZW5kaWYNCi0NCi10eXBlZGVmIHN0cnVjdCBfRDNEQ0FQUzgNCi17DQotICAgIC8qIERldmljZSBJbmZvICovDQotICAgIEQzRERFVlRZUEUgIERldmljZVR5cGU7DQotICAgIFVJTlQgICAgQWRhcHRlck9yZGluYWw7DQotDQotICAgIC8qIENhcHMgZnJvbSBEWDcgRHJhdyAqLw0KLSAgICBEV09SRCAgIENhcHM7DQotICAgIERXT1JEICAgQ2FwczI7DQotICAgIERXT1JEICAgQ2FwczM7DQotICAgIERXT1JEICAgUHJlc2VudGF0aW9uSW50ZXJ2YWxzOw0KLQ0KLSAgICAvKiBDdXJzb3IgQ2FwcyAqLw0KLSAgICBEV09SRCAgIEN1cnNvckNhcHM7DQotDQotICAgIC8qIDNEIERldmljZSBDYXBzICovDQotICAgIERXT1JEICAgRGV2Q2FwczsNCi0NCi0gICAgRFdPUkQgICBQcmltaXRpdmVNaXNjQ2FwczsNCi0gICAgRFdPUkQgICBSYXN0ZXJDYXBzOw0KLSAgICBEV09SRCAgIFpDbXBDYXBzOw0KLSAgICBEV09SRCAgIFNyY0JsZW5kQ2FwczsNCi0gICAgRFdPUkQgICBEZXN0QmxlbmRDYXBzOw0KLSAgICBEV09SRCAgIEFscGhhQ21wQ2FwczsNCi0gICAgRFdPUkQgICBTaGFkZUNhcHM7DQotICAgIERXT1JEICAgVGV4dHVyZUNhcHM7DQotICAgIERXT1JEICAgVGV4dHVyZUZpbHRlckNhcHM7ICAgICAgICAgIC8vIEQzRFBURklMVEVSQ0FQUyBmb3IgSURpcmVjdDNEVGV4dHVyZTgncw0KLSAgICBEV09SRCAgIEN1YmVUZXh0dXJlRmlsdGVyQ2FwczsgICAgICAvLyBEM0RQVEZJTFRFUkNBUFMgZm9yIElEaXJlY3QzREN1YmVUZXh0dXJlOCdzDQotICAgIERXT1JEICAgVm9sdW1lVGV4dHVyZUZpbHRlckNhcHM7ICAgIC8vIEQzRFBURklMVEVSQ0FQUyBmb3IgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTgncw0KLSAgICBEV09SRCAgIFRleHR1cmVBZGRyZXNzQ2FwczsgICAgICAgICAvLyBEM0RQVEFERFJFU1NDQVBTIGZvciBJRGlyZWN0M0RUZXh0dXJlOCdzDQotICAgIERXT1JEICAgVm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzOyAgIC8vIEQzRFBUQUREUkVTU0NBUFMgZm9yIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4J3MNCi0NCi0gICAgRFdPUkQgICBMaW5lQ2FwczsgICAgICAgICAgICAgICAgICAgLy8gRDNETElORUNBUFMNCi0NCi0gICAgRFdPUkQgICBNYXhUZXh0dXJlV2lkdGgsIE1heFRleHR1cmVIZWlnaHQ7DQotICAgIERXT1JEICAgTWF4Vm9sdW1lRXh0ZW50Ow0KLQ0KLSAgICBEV09SRCAgIE1heFRleHR1cmVSZXBlYXQ7DQotICAgIERXT1JEICAgTWF4VGV4dHVyZUFzcGVjdFJhdGlvOw0KLSAgICBEV09SRCAgIE1heEFuaXNvdHJvcHk7DQotICAgIGZsb2F0ICAgTWF4VmVydGV4VzsNCi0NCi0gICAgZmxvYXQgICBHdWFyZEJhbmRMZWZ0Ow0KLSAgICBmbG9hdCAgIEd1YXJkQmFuZFRvcDsNCi0gICAgZmxvYXQgICBHdWFyZEJhbmRSaWdodDsNCi0gICAgZmxvYXQgICBHdWFyZEJhbmRCb3R0b207DQotDQotICAgIGZsb2F0ICAgRXh0ZW50c0FkanVzdDsNCi0gICAgRFdPUkQgICBTdGVuY2lsQ2FwczsNCi0NCi0gICAgRFdPUkQgICBGVkZDYXBzOw0KLSAgICBEV09SRCAgIFRleHR1cmVPcENhcHM7DQotICAgIERXT1JEICAgTWF4VGV4dHVyZUJsZW5kU3RhZ2VzOw0KLSAgICBEV09SRCAgIE1heFNpbXVsdGFuZW91c1RleHR1cmVzOw0KLQ0KLSAgICBEV09SRCAgIFZlcnRleFByb2Nlc3NpbmdDYXBzOw0KLSAgICBEV09SRCAgIE1heEFjdGl2ZUxpZ2h0czsNCi0gICAgRFdPUkQgICBNYXhVc2VyQ2xpcFBsYW5lczsNCi0gICAgRFdPUkQgICBNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzOw0KLSAgICBEV09SRCAgIE1heFZlcnRleEJsZW5kTWF0cml4SW5kZXg7DQotDQotICAgIGZsb2F0ICAgTWF4UG9pbnRTaXplOw0KLQ0KLSAgICBEV09SRCAgIE1heFByaW1pdGl2ZUNvdW50OyAgICAgICAgICAvLyBtYXggbnVtYmVyIG9mIHByaW1pdGl2ZXMgcGVyIERyYXdQcmltaXRpdmUgY2FsbA0KLSAgICBEV09SRCAgIE1heFZlcnRleEluZGV4Ow0KLSAgICBEV09SRCAgIE1heFN0cmVhbXM7DQotICAgIERXT1JEICAgTWF4U3RyZWFtU3RyaWRlOyAgICAgICAgICAgIC8vIG1heCBzdHJpZGUgZm9yIFNldFN0cmVhbVNvdXJjZQ0KLQ0KLSAgICBEV09SRCAgIFZlcnRleFNoYWRlclZlcnNpb247DQotICAgIERXT1JEICAgTWF4VmVydGV4U2hhZGVyQ29uc3Q7ICAgICAgIC8vIG51bWJlciBvZiB2ZXJ0ZXggc2hhZGVyIGNvbnN0YW50IHJlZ2lzdGVycw0KLQ0KLSAgICBEV09SRCAgIFBpeGVsU2hhZGVyVmVyc2lvbjsNCi0gICAgZmxvYXQgICBNYXhQaXhlbFNoYWRlclZhbHVlOyAgICAgICAgLy8gbWF4IHZhbHVlIG9mIHBpeGVsIHNoYWRlciBhcml0aG1ldGljIGNvbXBvbmVudA0KLQ0KLX0gRDNEQ0FQUzg7DQotDQotLy8NCi0vLyBCSVQgREVGSU5FUyBGT1IgRDNEQ0FQUzggRFdPUkQgTUVNQkVSUw0KLS8vDQotDQotLy8NCi0vLyBDYXBzDQotLy8NCi0jZGVmaW5lIEQzRENBUFNfUkVBRF9TQ0FOTElORSAgICAgICAgICAgMHgwMDAyMDAwMEwNCi0NCi0vLw0KLS8vIENhcHMyDQotLy8NCi0jZGVmaW5lIEQzRENBUFMyX05PMkREVVJJTkczRFNDRU5FICAgICAgMHgwMDAwMDAwMkwNCi0jZGVmaW5lIEQzRENBUFMyX0ZVTExTQ1JFRU5HQU1NQSAgICAgICAgMHgwMDAyMDAwMEwNCi0jZGVmaW5lIEQzRENBUFMyX0NBTlJFTkRFUldJTkRPV0VEICAgICAgMHgwMDA4MDAwMEwNCi0jZGVmaW5lIEQzRENBUFMyX0NBTkNBTElCUkFURUdBTU1BICAgICAgMHgwMDEwMDAwMEwNCi0jZGVmaW5lIEQzRENBUFMyX1JFU0VSVkVEICAgICAgICAgICAgICAgMHgwMjAwMDAwMEwNCi0jZGVmaW5lIEQzRENBUFMyX0NBTk1BTkFHRVJFU09VUkNFICAgICAgMHgxMDAwMDAwMEwNCi0jZGVmaW5lIEQzRENBUFMyX0RZTkFNSUNURVhUVVJFUyAgICAgICAgMHgyMDAwMDAwMEwNCi0NCi0vLw0KLS8vIENhcHMzDQotLy8NCi0jZGVmaW5lIEQzRENBUFMzX1JFU0VSVkVEICAgICAgICAgICAgICAgMHg4MDAwMDAxZkwNCi0NCi0vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgZGV2aWNlIGNhbiByZXNwZWN0IHRoZSBBTFBIQUJMRU5ERU5BQkxFIHJlbmRlciBzdGF0ZQ0KLS8vIHdoZW4gZnVsbHNjcmVlbiB3aGlsZSB1c2luZyB0aGUgRkxJUCBvciBESVNDQVJEIHN3YXAgZWZmZWN0Lg0KLS8vIENPUFkgYW5kIENPUFlWU1lOQyBzd2FwIGVmZmVjdHMgd29yayB3aGV0aGVyIG9yIG5vdCB0aGlzIGZsYWcgaXMgc2V0Lg0KLSNkZWZpbmUgRDNEQ0FQUzNfQUxQSEFfRlVMTFNDUkVFTl9GTElQX09SX0RJU0NBUkQgICAweDAwMDAwMDIwTA0KLQ0KLS8vDQotLy8gUHJlc2VudGF0aW9uSW50ZXJ2YWxzDQotLy8NCi0jZGVmaW5lIEQzRFBSRVNFTlRfSU5URVJWQUxfREVGQVVMVCAgICAgMHgwMDAwMDAwMEwNCi0jZGVmaW5lIEQzRFBSRVNFTlRfSU5URVJWQUxfT05FICAgICAgICAgMHgwMDAwMDAwMUwNCi0jZGVmaW5lIEQzRFBSRVNFTlRfSU5URVJWQUxfVFdPICAgICAgICAgMHgwMDAwMDAwMkwNCi0jZGVmaW5lIEQzRFBSRVNFTlRfSU5URVJWQUxfVEhSRUUgICAgICAgMHgwMDAwMDAwNEwNCi0jZGVmaW5lIEQzRFBSRVNFTlRfSU5URVJWQUxfRk9VUiAgICAgICAgMHgwMDAwMDAwOEwNCi0jZGVmaW5lIEQzRFBSRVNFTlRfSU5URVJWQUxfSU1NRURJQVRFICAgMHg4MDAwMDAwMEwNCi0NCi0vLw0KLS8vIEN1cnNvckNhcHMNCi0vLw0KLS8vIERyaXZlciBzdXBwb3J0cyBIVyBjb2xvciBjdXJzb3IgaW4gYXQgbGVhc3QgaGktcmVzIG1vZGVzKGhlaWdodCA+PTQwMCkNCi0jZGVmaW5lIEQzRENVUlNPUkNBUFNfQ09MT1IgICAgICAgICAgICAgMHgwMDAwMDAwMUwNCi0vLyBEcml2ZXIgc3VwcG9ydHMgSFcgY3Vyc29yIGFsc28gaW4gbG93LXJlcyBtb2RlcyhoZWlnaHQgPCA0MDApDQotI2RlZmluZSBEM0RDVVJTT1JDQVBTX0xPV1JFUyAgICAgICAgICAgIDB4MDAwMDAwMDJMDQotDQotLy8NCi0vLyBEZXZDYXBzDQotLy8NCi0jZGVmaW5lIEQzRERFVkNBUFNfRVhFQ1VURVNZU1RFTU1FTU9SWSAgMHgwMDAwMDAxMEwgLyogRGV2aWNlIGNhbiB1c2UgZXhlY3V0ZSBidWZmZXJzIGZyb20gc3lzdGVtIG1lbW9yeSAqLw0KLSNkZWZpbmUgRDNEREVWQ0FQU19FWEVDVVRFVklERU9NRU1PUlkgICAweDAwMDAwMDIwTCAvKiBEZXZpY2UgY2FuIHVzZSBleGVjdXRlIGJ1ZmZlcnMgZnJvbSB2aWRlbyBtZW1vcnkgKi8NCi0jZGVmaW5lIEQzRERFVkNBUFNfVExWRVJURVhTWVNURU1NRU1PUlkgMHgwMDAwMDA0MEwgLyogRGV2aWNlIGNhbiB1c2UgVEwgYnVmZmVycyBmcm9tIHN5c3RlbSBtZW1vcnkgKi8NCi0jZGVmaW5lIEQzRERFVkNBUFNfVExWRVJURVhWSURFT01FTU9SWSAgMHgwMDAwMDA4MEwgLyogRGV2aWNlIGNhbiB1c2UgVEwgYnVmZmVycyBmcm9tIHZpZGVvIG1lbW9yeSAqLw0KLSNkZWZpbmUgRDNEREVWQ0FQU19URVhUVVJFU1lTVEVNTUVNT1JZICAweDAwMDAwMTAwTCAvKiBEZXZpY2UgY2FuIHRleHR1cmUgZnJvbSBzeXN0ZW0gbWVtb3J5ICovDQotI2RlZmluZSBEM0RERVZDQVBTX1RFWFRVUkVWSURFT01FTU9SWSAgIDB4MDAwMDAyMDBMIC8qIERldmljZSBjYW4gdGV4dHVyZSBmcm9tIGRldmljZSBtZW1vcnkgKi8NCi0jZGVmaW5lIEQzRERFVkNBUFNfRFJBV1BSSU1UTFZFUlRFWCAgICAgMHgwMDAwMDQwMEwgLyogRGV2aWNlIGNhbiBkcmF3IFRMVkVSVEVYIHByaW1pdGl2ZXMgKi8NCi0jZGVmaW5lIEQzRERFVkNBUFNfQ0FOUkVOREVSQUZURVJGTElQICAgMHgwMDAwMDgwMEwgLyogRGV2aWNlIGNhbiByZW5kZXIgd2l0aG91dCB3YWl0aW5nIGZvciBmbGlwIHRvIGNvbXBsZXRlICovDQotI2RlZmluZSBEM0RERVZDQVBTX1RFWFRVUkVOT05MT0NBTFZJRE1FTSAweDAwMDAxMDAwTCAvKiBEZXZpY2UgY2FuIHRleHR1cmUgZnJvbSBub25sb2NhbCB2aWRlbyBtZW1vcnkgKi8NCi0jZGVmaW5lIEQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyICAgICAgMHgwMDAwMjAwMEwgLyogRGV2aWNlIGNhbiBzdXBwb3J0IERyYXdQcmltaXRpdmVzMiAqLw0KLSNkZWZpbmUgRDNEREVWQ0FQU19TRVBBUkFURVRFWFRVUkVNRU1PUklFUyAweDAwMDA0MDAwTCAvKiBEZXZpY2UgaXMgdGV4dHVyaW5nIGZyb20gc2VwYXJhdGUgbWVtb3J5IHBvb2xzICovDQotI2RlZmluZSBEM0RERVZDQVBTX0RSQVdQUklNSVRJVkVTMkVYICAgIDB4MDAwMDgwMDBMIC8qIERldmljZSBjYW4gc3VwcG9ydCBFeHRlbmRlZCBEcmF3UHJpbWl0aXZlczIgaS5lLiBEWDcgY29tcGxpYW50IGRyaXZlciovDQotI2RlZmluZSBEM0RERVZDQVBTX0hXVFJBTlNGT1JNQU5ETElHSFQgIDB4MDAwMTAwMDBMIC8qIERldmljZSBjYW4gc3VwcG9ydCB0cmFuc2Zvcm1hdGlvbiBhbmQgbGlnaHRpbmcgaW4gaGFyZHdhcmUgYW5kIERSQVdQUklNSVRJVkVTMkVYIG11c3QgYmUgYWxzbyAqLw0KLSNkZWZpbmUgRDNEREVWQ0FQU19DQU5CTFRTWVNUT05PTkxPQ0FMICAweDAwMDIwMDAwTCAvKiBEZXZpY2Ugc3VwcG9ydHMgYSBUZXggQmx0IGZyb20gc3lzdGVtIG1lbW9yeSB0byBub24tbG9jYWwgdmlkbWVtICovDQotI2RlZmluZSBEM0RERVZDQVBTX0hXUkFTVEVSSVpBVElPTiAgICAgIDB4MDAwODAwMDBMIC8qIERldmljZSBoYXMgSFcgYWNjZWxlcmF0aW9uIGZvciByYXN0ZXJpemF0aW9uICovDQotI2RlZmluZSBEM0RERVZDQVBTX1BVUkVERVZJQ0UgICAgICAgICAgIDB4MDAxMDAwMDBMIC8qIERldmljZSBzdXBwb3J0cyBEM0RDUkVBVEVfUFVSRURFVklDRSAqLw0KLSNkZWZpbmUgRDNEREVWQ0FQU19RVUlOVElDUlRQQVRDSEVTICAgICAweDAwMjAwMDAwTCAvKiBEZXZpY2Ugc3VwcG9ydHMgcXVpbnRpYyBCZXppZXJzIGFuZCBCU3BsaW5lcyAqLw0KLSNkZWZpbmUgRDNEREVWQ0FQU19SVFBBVENIRVMgICAgICAgICAgICAweDAwNDAwMDAwTCAvKiBEZXZpY2Ugc3VwcG9ydHMgUmVjdCBhbmQgVHJpIHBhdGNoZXMgKi8NCi0jZGVmaW5lIEQzRERFVkNBUFNfUlRQQVRDSEhBTkRMRVpFUk8gICAgMHgwMDgwMDAwMEwgLyogSW5kaWNhdGVzIHRoYXQgUlQgUGF0Y2hlcyBtYXkgYmUgZHJhd24gZWZmaWNpZW50bHkgdXNpbmcgaGFuZGxlIDAgKi8NCi0jZGVmaW5lIEQzRERFVkNBUFNfTlBBVENIRVMgICAgICAgICAgICAgMHgwMTAwMDAwMEwgLyogRGV2aWNlIHN1cHBvcnRzIE4tUGF0Y2hlcyAqLw0KLQ0KLS8vDQotLy8gUHJpbWl0aXZlTWlzY0NhcHMNCi0vLw0KLSNkZWZpbmUgRDNEUE1JU0NDQVBTX01BU0taICAgICAgICAgICAgICAweDAwMDAwMDAyTA0KLSNkZWZpbmUgRDNEUE1JU0NDQVBTX0xJTkVQQVRURVJOUkVQICAgICAweDAwMDAwMDA0TA0KLSNkZWZpbmUgRDNEUE1JU0NDQVBTX0NVTExOT05FICAgICAgICAgICAweDAwMDAwMDEwTA0KLSNkZWZpbmUgRDNEUE1JU0NDQVBTX0NVTExDVyAgICAgICAgICAgICAweDAwMDAwMDIwTA0KLSNkZWZpbmUgRDNEUE1JU0NDQVBTX0NVTExDQ1cgICAgICAgICAgICAweDAwMDAwMDQwTA0KLSNkZWZpbmUgRDNEUE1JU0NDQVBTX0NPTE9SV1JJVEVFTkFCTEUgICAweDAwMDAwMDgwTA0KLSNkZWZpbmUgRDNEUE1JU0NDQVBTX0NMSVBQTEFORVNDQUxFRFBPSU5UUyAweDAwMDAwMTAwTCAvKiBEZXZpY2UgY29ycmVjdGx5IGNsaXBzIHNjYWxlZCBwb2ludHMgdG8gY2xpcCBwbGFuZXMgKi8NCi0jZGVmaW5lIEQzRFBNSVNDQ0FQU19DTElQVExWRVJUUyAgICAgICAgMHgwMDAwMDIwMEwgLyogZGV2aWNlIHdpbGwgY2xpcCBwb3N0LXRyYW5zZm9ybWVkIHZlcnRleCBwcmltaXRpdmVzICovDQotI2RlZmluZSBEM0RQTUlTQ0NBUFNfVFNTQVJHVEVNUCAgICAgICAgIDB4MDAwMDA0MDBMIC8qIGRldmljZSBzdXBwb3J0cyBEM0RUQV9URU1QIGZvciB0ZW1wb3JhcnkgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEQzRFBNSVNDQ0FQU19CTEVORE9QICAgICAgICAgICAgMHgwMDAwMDgwMEwgLyogZGV2aWNlIHN1cHBvcnRzIEQzRFJTX0JMRU5ET1AgKi8NCi0jZGVmaW5lIEQzRFBNSVNDQ0FQU19OVUxMUkVGRVJFTkNFICAgICAgMHgwMDAwMTAwMEwgLyogUmVmZXJlbmNlIERldmljZSB0aGF0IGRvZXNudCByZW5kZXIgKi8NCi0NCi0vLw0KLS8vIExpbmVDYXBzDQotLy8NCi0jZGVmaW5lIEQzRExJTkVDQVBTX1RFWFRVUkUgICAgICAgICAgICAgMHgwMDAwMDAwMUwNCi0jZGVmaW5lIEQzRExJTkVDQVBTX1pURVNUICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwNCi0jZGVmaW5lIEQzRExJTkVDQVBTX0JMRU5EICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwNCi0jZGVmaW5lIEQzRExJTkVDQVBTX0FMUEhBQ01QICAgICAgICAgICAgMHgwMDAwMDAwOEwNCi0jZGVmaW5lIEQzRExJTkVDQVBTX0ZPRyAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwNCi0NCi0vLw0KLS8vIFJhc3RlckNhcHMNCi0vLw0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfRElUSEVSICAgICAgICAgICAweDAwMDAwMDAxTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfUEFUICAgICAgICAgICAgICAweDAwMDAwMDA4TA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfWlRFU1QgICAgICAgICAgICAweDAwMDAwMDEwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfRk9HVkVSVEVYICAgICAgICAweDAwMDAwMDgwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfRk9HVEFCTEUgICAgICAgICAweDAwMDAwMTAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfQU5USUFMSUFTRURHRVMgICAweDAwMDAxMDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfTUlQTUFQTE9EQklBUyAgICAweDAwMDAyMDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfWkJJQVMgICAgICAgICAgICAweDAwMDA0MDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfWkJVRkZFUkxFU1NIU1IgICAweDAwMDA4MDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfRk9HUkFOR0UgICAgICAgICAweDAwMDEwMDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfQU5JU09UUk9QWSAgICAgICAweDAwMDIwMDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfV0JVRkZFUiAgICAgICAgICAweDAwMDQwMDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfV0ZPRyAgICAgICAgICAgICAweDAwMTAwMDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfWkZPRyAgICAgICAgICAgICAweDAwMjAwMDAwTA0KLSNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfQ09MT1JQRVJTUEVDVElWRSAweDAwNDAwMDAwTCAvKiBEZXZpY2UgaXRlcmF0ZXMgY29sb3JzIHBlcnNwZWN0aXZlIGNvcnJlY3QgKi8NCi0jZGVmaW5lIEQzRFBSQVNURVJDQVBTX1NUUkVUQ0hCTFRNVUxUSVNBTVBMRSAgMHgwMDgwMDAwMEwNCi0NCi0vLw0KLS8vIFpDbXBDYXBzLCBBbHBoYUNtcENhcHMNCi0vLw0KLSNkZWZpbmUgRDNEUENNUENBUFNfTkVWRVIgICAgICAgICAgICAgICAweDAwMDAwMDAxTA0KLSNkZWZpbmUgRDNEUENNUENBUFNfTEVTUyAgICAgICAgICAgICAgICAweDAwMDAwMDAyTA0KLSNkZWZpbmUgRDNEUENNUENBUFNfRVFVQUwgICAgICAgICAgICAgICAweDAwMDAwMDA0TA0KLSNkZWZpbmUgRDNEUENNUENBUFNfTEVTU0VRVUFMICAgICAgICAgICAweDAwMDAwMDA4TA0KLSNkZWZpbmUgRDNEUENNUENBUFNfR1JFQVRFUiAgICAgICAgICAgICAweDAwMDAwMDEwTA0KLSNkZWZpbmUgRDNEUENNUENBUFNfTk9URVFVQUwgICAgICAgICAgICAweDAwMDAwMDIwTA0KLSNkZWZpbmUgRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMICAgICAgICAweDAwMDAwMDQwTA0KLSNkZWZpbmUgRDNEUENNUENBUFNfQUxXQVlTICAgICAgICAgICAgICAweDAwMDAwMDgwTA0KLQ0KLS8vDQotLy8gU291cmNlQmxlbmRDYXBzLCBEZXN0QmxlbmRDYXBzDQotLy8NCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfWkVSTyAgICAgICAgICAgICAgMHgwMDAwMDAwMUwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfT05FICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfU1JDQ09MT1IgICAgICAgICAgMHgwMDAwMDAwNEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfSU5WU1JDQ09MT1IgICAgICAgMHgwMDAwMDAwOEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfU1JDQUxQSEEgICAgICAgICAgMHgwMDAwMDAxMEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfSU5WU1JDQUxQSEEgICAgICAgMHgwMDAwMDAyMEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfREVTVEFMUEhBICAgICAgICAgMHgwMDAwMDA0MEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfSU5WREVTVEFMUEhBICAgICAgMHgwMDAwMDA4MEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfREVTVENPTE9SICAgICAgICAgMHgwMDAwMDEwMEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfSU5WREVTVENPTE9SICAgICAgMHgwMDAwMDIwMEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfU1JDQUxQSEFTQVQgICAgICAgMHgwMDAwMDQwMEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfQk9USFNSQ0FMUEhBICAgICAgMHgwMDAwMDgwMEwNCi0jZGVmaW5lIEQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBICAgMHgwMDAwMTAwMEwNCi0NCi0vLw0KLS8vIFNoYWRlQ2Fwcw0KLS8vDQotI2RlZmluZSBEM0RQU0hBREVDQVBTX0NPTE9SR09VUkFVRFJHQiAgICAgICAweDAwMDAwMDA4TA0KLSNkZWZpbmUgRDNEUFNIQURFQ0FQU19TUEVDVUxBUkdPVVJBVURSR0IgICAgMHgwMDAwMDIwMEwNCi0jZGVmaW5lIEQzRFBTSEFERUNBUFNfQUxQSEFHT1VSQVVEQkxFTkQgICAgIDB4MDAwMDQwMDBMDQotI2RlZmluZSBEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgICAgICAgICAgICAweDAwMDgwMDAwTA0KLQ0KLS8vDQotLy8gVGV4dHVyZUNhcHMNCi0vLw0KLSNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFICAgICAgICAgMHgwMDAwMDAwMUwgLyogUGVyc3BlY3RpdmUtY29ycmVjdCB0ZXh0dXJpbmcgaXMgc3VwcG9ydGVkICovDQotI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfUE9XMiAgICAgICAgICAgICAgICAweDAwMDAwMDAyTCAvKiBQb3dlci1vZi0yIHRleHR1cmUgZGltZW5zaW9ucyBhcmUgcmVxdWlyZWQgLSBhcHBsaWVzIHRvIG5vbi1DdWJlL1ZvbHVtZSB0ZXh0dXJlcyBvbmx5LiAqLw0KLSNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX0FMUEhBICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwgLyogQWxwaGEgaW4gdGV4dHVyZSBwaXhlbHMgaXMgc3VwcG9ydGVkICovDQotI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfU1FVQVJFT05MWSAgICAgICAgICAweDAwMDAwMDIwTCAvKiBPbmx5IHNxdWFyZSB0ZXh0dXJlcyBhcmUgc3VwcG9ydGVkICovDQotI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfVEVYUkVQRUFUTk9UU0NBTEVEQllTSVpFIDB4MDAwMDAwNDBMIC8qIFRleHR1cmUgaW5kaWNlcyBhcmUgbm90IHNjYWxlZCBieSB0aGUgdGV4dHVyZSBzaXplIHByaW9yIHRvIGludGVycG9sYXRpb24gKi8NCi0jZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19BTFBIQVBBTEVUVEUgICAgICAgIDB4MDAwMDAwODBMIC8qIERldmljZSBjYW4gZHJhdyBhbHBoYSBmcm9tIHRleHR1cmUgcGFsZXR0ZXMgKi8NCi0vLyBEZXZpY2UgY2FuIHVzZSBub24tUE9XMiB0ZXh0dXJlcyBpZjoNCi0vLyAgMSkgRDNEVEVYVFVSRV9BRERSRVNTIGlzIHNldCB0byBDTEFNUCBmb3IgdGhpcyB0ZXh0dXJlJ3Mgc3RhZ2UNCi0vLyAgMikgRDNEUlNfV1JBUChOKSBpcyB6ZXJvIGZvciB0aGlzIHRleHR1cmUncyBjb29yZGluYXRlcw0KLS8vICAzKSBtaXAgbWFwcGluZyBpcyBub3QgZW5hYmxlZCAodXNlIG1hZ25pZmljYXRpb24gZmlsdGVyIG9ubHkpDQotI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfTk9OUE9XMkNPTkRJVElPTkFMICAweDAwMDAwMTAwTA0KLSNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX1BST0pFQ1RFRCAgICAgICAgICAgMHgwMDAwMDQwMEwgLyogRGV2aWNlIGNhbiBkbyBEM0RUVEZGX1BST0pFQ1RFRCAqLw0KLSNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVAgICAgICAgICAgICAgMHgwMDAwMDgwMEwgLyogRGV2aWNlIGNhbiBkbyBjdWJlbWFwIHRleHR1cmVzICovDQotI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQICAgICAgICAgICAweDAwMDAyMDAwTCAvKiBEZXZpY2UgY2FuIGRvIHZvbHVtZSB0ZXh0dXJlcyAqLw0KLSNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX01JUE1BUCAgICAgICAgICAgICAgMHgwMDAwNDAwMEwgLyogRGV2aWNlIGNhbiBkbyBtaXBtYXBwZWQgdGV4dHVyZXMgKi8NCi0jZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19NSVBWT0xVTUVNQVAgICAgICAgIDB4MDAwMDgwMDBMIC8qIERldmljZSBjYW4gZG8gbWlwbWFwcGVkIHZvbHVtZSB0ZXh0dXJlcyAqLw0KLSNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX01JUENVQkVNQVAgICAgICAgICAgMHgwMDAxMDAwMEwgLyogRGV2aWNlIGNhbiBkbyBtaXBtYXBwZWQgY3ViZSBtYXBzICovDQotI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfQ1VCRU1BUF9QT1cyICAgICAgICAweDAwMDIwMDAwTCAvKiBEZXZpY2UgcmVxdWlyZXMgdGhhdCBjdWJlbWFwcyBiZSBwb3dlci1vZi0yIGRpbWVuc2lvbiAqLw0KLSNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX1ZPTFVNRU1BUF9QT1cyICAgICAgMHgwMDA0MDAwMEwgLyogRGV2aWNlIHJlcXVpcmVzIHRoYXQgdm9sdW1lIG1hcHMgYmUgcG93ZXItb2YtMiBkaW1lbnNpb24gKi8NCi0NCi0vLw0KLS8vIFRleHR1cmVGaWx0ZXJDYXBzDQotLy8NCi0jZGVmaW5lIEQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgICAgICAgICAgIDB4MDAwMDAxMDBMIC8qIE1pbiBGaWx0ZXIgKi8NCi0jZGVmaW5lIEQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSICAgICAgICAgIDB4MDAwMDAyMDBMDQotI2RlZmluZSBEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDICAgICAweDAwMDAwNDAwTA0KLSNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVCAgICAgICAgICAgMHgwMDAxMDAwMEwgLyogTWlwIEZpbHRlciAqLw0KLSNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVIgICAgICAgICAgMHgwMDAyMDAwMEwNCi0jZGVmaW5lIEQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgICAgICAgICAgIDB4MDEwMDAwMDBMIC8qIE1hZyBGaWx0ZXIgKi8NCi0jZGVmaW5lIEQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSICAgICAgICAgIDB4MDIwMDAwMDBMDQotI2RlZmluZSBEM0RQVEZJTFRFUkNBUFNfTUFHRkFOSVNPVFJPUElDICAgICAweDA0MDAwMDAwTA0KLSNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01BR0ZBRkxBVENVQklDICAgICAgMHgwODAwMDAwMEwNCi0jZGVmaW5lIEQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5DVUJJQyAgIDB4MTAwMDAwMDBMDQotDQotLy8NCi0vLyBUZXh0dXJlQWRkcmVzc0NhcHMNCi0vLw0KLSNkZWZpbmUgRDNEUFRBRERSRVNTQ0FQU19XUkFQICAgICAgICAgICAweDAwMDAwMDAxTA0KLSNkZWZpbmUgRDNEUFRBRERSRVNTQ0FQU19NSVJST1IgICAgICAgICAweDAwMDAwMDAyTA0KLSNkZWZpbmUgRDNEUFRBRERSRVNTQ0FQU19DTEFNUCAgICAgICAgICAweDAwMDAwMDA0TA0KLSNkZWZpbmUgRDNEUFRBRERSRVNTQ0FQU19CT1JERVIgICAgICAgICAweDAwMDAwMDA4TA0KLSNkZWZpbmUgRDNEUFRBRERSRVNTQ0FQU19JTkRFUEVOREVOVFVWICAweDAwMDAwMDEwTA0KLSNkZWZpbmUgRDNEUFRBRERSRVNTQ0FQU19NSVJST1JPTkNFICAgICAweDAwMDAwMDIwTA0KLQ0KLS8vDQotLy8gU3RlbmNpbENhcHMNCi0vLw0KLSNkZWZpbmUgRDNEU1RFTkNJTENBUFNfS0VFUCAgICAgICAgICAgICAweDAwMDAwMDAxTA0KLSNkZWZpbmUgRDNEU1RFTkNJTENBUFNfWkVSTyAgICAgICAgICAgICAweDAwMDAwMDAyTA0KLSNkZWZpbmUgRDNEU1RFTkNJTENBUFNfUkVQTEFDRSAgICAgICAgICAweDAwMDAwMDA0TA0KLSNkZWZpbmUgRDNEU1RFTkNJTENBUFNfSU5DUlNBVCAgICAgICAgICAweDAwMDAwMDA4TA0KLSNkZWZpbmUgRDNEU1RFTkNJTENBUFNfREVDUlNBVCAgICAgICAgICAweDAwMDAwMDEwTA0KLSNkZWZpbmUgRDNEU1RFTkNJTENBUFNfSU5WRVJUICAgICAgICAgICAweDAwMDAwMDIwTA0KLSNkZWZpbmUgRDNEU1RFTkNJTENBUFNfSU5DUiAgICAgICAgICAgICAweDAwMDAwMDQwTA0KLSNkZWZpbmUgRDNEU1RFTkNJTENBUFNfREVDUiAgICAgICAgICAgICAweDAwMDAwMDgwTA0KLQ0KLS8vDQotLy8gVGV4dHVyZU9wQ2Fwcw0KLS8vDQotI2RlZmluZSBEM0RURVhPUENBUFNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19TRUxFQ1RBUkcxICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTA0KLSNkZWZpbmUgRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMDQotI2RlZmluZSBEM0RURVhPUENBUFNfTU9EVUxBVEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19NT0RVTEFURTJYICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTA0KLSNkZWZpbmUgRDNEVEVYT1BDQVBTX01PRFVMQVRFNFggICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBMDQotI2RlZmluZSBEM0RURVhPUENBUFNfQUREICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19BRERTSUdORUQgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwTA0KLSNkZWZpbmUgRDNEVEVYT1BDQVBTX0FERFNJR05FRDJYICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMDQotI2RlZmluZSBEM0RURVhPUENBUFNfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19BRERTTU9PVEggICAgICAgICAgICAgICAgICAweDAwMDAwNDAwTA0KLSNkZWZpbmUgRDNEVEVYT1BDQVBTX0JMRU5ERElGRlVTRUFMUEhBICAgICAgICAgIDB4MDAwMDA4MDBMDQotI2RlZmluZSBEM0RURVhPUENBUFNfQkxFTkRURVhUVVJFQUxQSEEgICAgICAgICAgMHgwMDAwMTAwMEwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19CTEVOREZBQ1RPUkFMUEhBICAgICAgICAgICAweDAwMDAyMDAwTA0KLSNkZWZpbmUgRDNEVEVYT1BDQVBTX0JMRU5EVEVYVFVSRUFMUEhBUE0gICAgICAgIDB4MDAwMDQwMDBMDQotI2RlZmluZSBEM0RURVhPUENBUFNfQkxFTkRDVVJSRU5UQUxQSEEgICAgICAgICAgMHgwMDAwODAwMEwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19QUkVNT0RVTEFURSAgICAgICAgICAgICAgICAweDAwMDEwMDAwTA0KLSNkZWZpbmUgRDNEVEVYT1BDQVBTX01PRFVMQVRFQUxQSEFfQUREQ09MT1IgICAgIDB4MDAwMjAwMDBMDQotI2RlZmluZSBEM0RURVhPUENBUFNfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSAgICAgMHgwMDA0MDAwMEwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SICAweDAwMDgwMDAwTA0KLSNkZWZpbmUgRDNEVEVYT1BDQVBTX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEEgIDB4MDAxMDAwMDBMDQotI2RlZmluZSBEM0RURVhPUENBUFNfQlVNUEVOVk1BUCAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMEwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQTFVNSU5BTkNFICAgICAgICAweDAwNDAwMDAwTA0KLSNkZWZpbmUgRDNEVEVYT1BDQVBTX0RPVFBST0RVQ1QzICAgICAgICAgICAgICAgIDB4MDA4MDAwMDBMDQotI2RlZmluZSBEM0RURVhPUENBUFNfTVVMVElQTFlBREQgICAgICAgICAgICAgICAgMHgwMTAwMDAwMEwNCi0jZGVmaW5lIEQzRFRFWE9QQ0FQU19MRVJQICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTA0KLQ0KLS8vDQotLy8gRlZGQ2Fwcw0KLS8vDQotI2RlZmluZSBEM0RGVkZDQVBTX1RFWENPT1JEQ09VTlRNQVNLICAgIDB4MDAwMGZmZmZMIC8qIG1hc2sgZm9yIHRleHR1cmUgY29vcmRpbmF0ZSBjb3VudCBmaWVsZCAqLw0KLSNkZWZpbmUgRDNERlZGQ0FQU19ET05PVFNUUklQRUxFTUVOVFMgICAweDAwMDgwMDAwTCAvKiBEZXZpY2UgcHJlZmVycyB0aGF0IHZlcnRleCBlbGVtZW50cyBub3QgYmUgc3RyaXBwZWQgKi8NCi0jZGVmaW5lIEQzREZWRkNBUFNfUFNJWkUgICAgICAgICAgICAgICAgMHgwMDEwMDAwMEwgLyogRGV2aWNlIGNhbiByZWNlaXZlIHBvaW50IHNpemUgKi8NCi0NCi0vLw0KLS8vIFZlcnRleFByb2Nlc3NpbmdDYXBzDQotLy8NCi0jZGVmaW5lIEQzRFZUWFBDQVBTX1RFWEdFTiAgICAgICAgICAgICAgMHgwMDAwMDAwMUwgLyogZGV2aWNlIGNhbiBkbyB0ZXhnZW4gKi8NCi0jZGVmaW5lIEQzRFZUWFBDQVBTX01BVEVSSUFMU09VUkNFNyAgICAgMHgwMDAwMDAwMkwgLyogZGV2aWNlIGNhbiBkbyBEWDctbGV2ZWwgY29sb3JtYXRlcmlhbHNvdXJjZSBvcHMgKi8NCi0jZGVmaW5lIEQzRFZUWFBDQVBTX0RJUkVDVElPTkFMTElHSFRTICAgMHgwMDAwMDAwOEwgLyogZGV2aWNlIGNhbiBkbyBkaXJlY3Rpb25hbCBsaWdodHMgKi8NCi0jZGVmaW5lIEQzRFZUWFBDQVBTX1BPU0lUSU9OQUxMSUdIVFMgICAgMHgwMDAwMDAxMEwgLyogZGV2aWNlIGNhbiBkbyBwb3NpdGlvbmFsIGxpZ2h0cyAoaW5jbHVkZXMgcG9pbnQgYW5kIHNwb3QpICovDQotI2RlZmluZSBEM0RWVFhQQ0FQU19MT0NBTFZJRVdFUiAgICAgICAgIDB4MDAwMDAwMjBMIC8qIGRldmljZSBjYW4gZG8gbG9jYWwgdmlld2VyICovDQotI2RlZmluZSBEM0RWVFhQQ0FQU19UV0VFTklORyAgICAgICAgICAgIDB4MDAwMDAwNDBMIC8qIGRldmljZSBjYW4gZG8gdmVydGV4IHR3ZWVuaW5nICovDQotI2RlZmluZSBEM0RWVFhQQ0FQU19OT19WU0RUX1VCWVRFNCAgICAgIDB4MDAwMDAwODBMIC8qIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IEQzRFZTRFRfVUJZVEU0ICovDQotDQotI3ByYWdtYSBwYWNrKCkNCi0NCi0jZW5kaWYgLyogKERJUkVDVDNEX1ZFUlNJT04gPj0gMHgwODAwKSAqLw0KLSNlbmRpZiAvKiBfRDNEOENBUFNfSF8gKi8NCi0NCmRpZmYgLS1naXQgYS9pbmNsdWRlL0RpcmVjdDNEL2QzZDh0eXBlcy5oIGIvaW5jbHVkZS9EaXJlY3QzRC9kM2Q4dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMzc2Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL0RpcmVjdDNEL2QzZDh0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4NCArMCwwIEBACi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ow0KLSAqDQotICogIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKg0KLSAqICBGaWxlOiAgICAgICBkM2Q4dHlwZXMuaA0KLSAqICBDb250ZW50OiAgICBEaXJlY3QzRCBjYXBhYmlsaXRpZXMgaW5jbHVkZSBmaWxlDQotICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNpZm5kZWYgX0QzRDhUWVBFU19IXw0KLSNkZWZpbmUgX0QzRDhUWVBFU19IXw0KLQ0KLSNpZm5kZWYgRElSRUNUM0RfVkVSU0lPTg0KLSNkZWZpbmUgRElSRUNUM0RfVkVSU0lPTiAgICAgICAgIDB4MDgwMA0KLSNlbmRpZiAgLy9ESVJFQ1QzRF9WRVJTSU9ODQotDQotLy8gaW5jbHVkZSB0aGlzIGZpbGUgY29udGVudCBvbmx5IGlmIGNvbXBpbGluZyBmb3IgRFg4IGludGVyZmFjZXMNCi0jaWYoRElSRUNUM0RfVkVSU0lPTiA+PSAweDA4MDApDQotDQotI2luY2x1ZGUgPGZsb2F0Lmg+DQotDQotI2lmIF9NU0NfVkVSID49IDEyMDANCi0jcHJhZ21hIHdhcm5pbmcocHVzaCkNCi0jZW5kaWYNCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjAxKSAvLyBhbm9ueW1vdXMgdW5pb25zIHdhcm5pbmcNCi0jaWYgZGVmaW5lZChfWDg2XykgfHwgZGVmaW5lZChfSUE2NF8pDQotI3ByYWdtYSBwYWNrKDQpDQotI2VuZGlmDQotDQotLy8gRDNEQ09MT1IgaXMgZXF1aXZhbGVudCB0byBEM0RGTVRfQThSOEc4QjgNCi0jaWZuZGVmIEQzRENPTE9SX0RFRklORUQNCi10eXBlZGVmIERXT1JEIEQzRENPTE9SOw0KLSNkZWZpbmUgRDNEQ09MT1JfREVGSU5FRA0KLSNlbmRpZg0KLQ0KLS8vIG1hcHMgdW5zaWduZWQgOCBiaXRzL2NoYW5uZWwgdG8gRDNEQ09MT1INCi0jZGVmaW5lIEQzRENPTE9SX0FSR0IoYSxyLGcsYikgXA0KLSAgICAoKEQzRENPTE9SKSgoKChhKSYweGZmKTw8MjQpfCgoKHIpJjB4ZmYpPDwxNil8KCgoZykmMHhmZik8PDgpfCgoYikmMHhmZikpKQ0KLSNkZWZpbmUgRDNEQ09MT1JfUkdCQShyLGcsYixhKSBEM0RDT0xPUl9BUkdCKGEscixnLGIpDQotI2RlZmluZSBEM0RDT0xPUl9YUkdCKHIsZyxiKSAgIEQzRENPTE9SX0FSR0IoMHhmZixyLGcsYikNCi0NCi0vLyBtYXBzIGZsb2F0aW5nIHBvaW50IGNoYW5uZWxzICgwLmYgdG8gMS5mIHJhbmdlKSB0byBEM0RDT0xPUg0KLSNkZWZpbmUgRDNEQ09MT1JfQ09MT1JWQUxVRShyLGcsYixhKSBcDQotICAgIEQzRENPTE9SX1JHQkEoKERXT1JEKSgocikqMjU1LmYpLChEV09SRCkoKGcpKjI1NS5mKSwoRFdPUkQpKChiKSoyNTUuZiksKERXT1JEKSgoYSkqMjU1LmYpKQ0KLQ0KLQ0KLSNpZm5kZWYgRDNEVkVDVE9SX0RFRklORUQNCi10eXBlZGVmIHN0cnVjdCBfRDNEVkVDVE9SIHsNCi0gICAgZmxvYXQgeDsNCi0gICAgZmxvYXQgeTsNCi0gICAgZmxvYXQgejsNCi19IEQzRFZFQ1RPUjsNCi0jZGVmaW5lIEQzRFZFQ1RPUl9ERUZJTkVEDQotI2VuZGlmDQotDQotI2lmbmRlZiBEM0RDT0xPUlZBTFVFX0RFRklORUQNCi10eXBlZGVmIHN0cnVjdCBfRDNEQ09MT1JWQUxVRSB7DQotICAgIGZsb2F0IHI7DQotICAgIGZsb2F0IGc7DQotICAgIGZsb2F0IGI7DQotICAgIGZsb2F0IGE7DQotfSBEM0RDT0xPUlZBTFVFOw0KLSNkZWZpbmUgRDNEQ09MT1JWQUxVRV9ERUZJTkVEDQotI2VuZGlmDQotDQotI2lmbmRlZiBEM0RSRUNUX0RFRklORUQNCi10eXBlZGVmIHN0cnVjdCBfRDNEUkVDVCB7DQotICAgIExPTkcgeDE7DQotICAgIExPTkcgeTE7DQotICAgIExPTkcgeDI7DQotICAgIExPTkcgeTI7DQotfSBEM0RSRUNUOw0KLSNkZWZpbmUgRDNEUkVDVF9ERUZJTkVEDQotI2VuZGlmDQotDQotI2lmbmRlZiBEM0RNQVRSSVhfREVGSU5FRA0KLXR5cGVkZWYgc3RydWN0IF9EM0RNQVRSSVggew0KLSAgICB1bmlvbiB7DQotICAgICAgICBzdHJ1Y3Qgew0KLSAgICAgICAgICAgIGZsb2F0ICAgICAgICBfMTEsIF8xMiwgXzEzLCBfMTQ7DQotICAgICAgICAgICAgZmxvYXQgICAgICAgIF8yMSwgXzIyLCBfMjMsIF8yNDsNCi0gICAgICAgICAgICBmbG9hdCAgICAgICAgXzMxLCBfMzIsIF8zMywgXzM0Ow0KLSAgICAgICAgICAgIGZsb2F0ICAgICAgICBfNDEsIF80MiwgXzQzLCBfNDQ7DQotDQotICAgICAgICB9Ow0KLSAgICAgICAgZmxvYXQgbVs0XVs0XTsNCi0gICAgfTsNCi19IEQzRE1BVFJJWDsNCi0jZGVmaW5lIEQzRE1BVFJJWF9ERUZJTkVEDQotI2VuZGlmDQotDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRFZJRVdQT1JUOCB7DQotICAgIERXT1JEICAgICAgIFg7DQotICAgIERXT1JEICAgICAgIFk7ICAgICAgICAgICAgLyogVmlld3BvcnQgVG9wIGxlZnQgKi8NCi0gICAgRFdPUkQgICAgICAgV2lkdGg7DQotICAgIERXT1JEICAgICAgIEhlaWdodDsgICAgICAgLyogVmlld3BvcnQgRGltZW5zaW9ucyAqLw0KLSAgICBmbG9hdCAgICAgICBNaW5aOyAgICAgICAgIC8qIE1pbi9tYXggb2YgY2xpcCBWb2x1bWUgKi8NCi0gICAgZmxvYXQgICAgICAgTWF4WjsNCi19IEQzRFZJRVdQT1JUODsNCi0NCi0vKg0KLSAqIFZhbHVlcyBmb3IgY2xpcCBmaWVsZHMuDQotICovDQotDQotLy8gTWF4IG51bWJlciBvZiB1c2VyIGNsaXBwaW5nIHBsYW5lcywgc3VwcG9ydGVkIGluIEQzRC4NCi0jZGVmaW5lIEQzRE1BWFVTRVJDTElQUExBTkVTIDMyDQotDQotLy8gVGhlc2UgYml0cyBjb3VsZCBiZSBPUmVkIHRvZ2V0aGVyIHRvIHVzZSB3aXRoIEQzRFJTX0NMSVBQTEFORUVOQUJMRQ0KLS8vDQotI2RlZmluZSBEM0RDTElQUExBTkUwICgxIDw8IDApDQotI2RlZmluZSBEM0RDTElQUExBTkUxICgxIDw8IDEpDQotI2RlZmluZSBEM0RDTElQUExBTkUyICgxIDw8IDIpDQotI2RlZmluZSBEM0RDTElQUExBTkUzICgxIDw8IDMpDQotI2RlZmluZSBEM0RDTElQUExBTkU0ICgxIDw8IDQpDQotI2RlZmluZSBEM0RDTElQUExBTkU1ICgxIDw8IDUpDQotDQotLy8gVGhlIGZvbGxvd2luZyBiaXRzIGFyZSB1c2VkIGluIHRoZSBDbGlwVW5pb24gYW5kIENsaXBJbnRlcnNlY3Rpb24NCi0vLyBtZW1iZXJzIG9mIHRoZSBEM0RDTElQU1RBVFVTOA0KLS8vDQotDQotI2RlZmluZSBEM0RDU19MRUZUICAgICAgICAweDAwMDAwMDAxTA0KLSNkZWZpbmUgRDNEQ1NfUklHSFQgICAgICAgMHgwMDAwMDAwMkwNCi0jZGVmaW5lIEQzRENTX1RPUCAgICAgICAgIDB4MDAwMDAwMDRMDQotI2RlZmluZSBEM0RDU19CT1RUT00gICAgICAweDAwMDAwMDA4TA0KLSNkZWZpbmUgRDNEQ1NfRlJPTlQgICAgICAgMHgwMDAwMDAxMEwNCi0jZGVmaW5lIEQzRENTX0JBQ0sgICAgICAgIDB4MDAwMDAwMjBMDQotI2RlZmluZSBEM0RDU19QTEFORTAgICAgICAweDAwMDAwMDQwTA0KLSNkZWZpbmUgRDNEQ1NfUExBTkUxICAgICAgMHgwMDAwMDA4MEwNCi0jZGVmaW5lIEQzRENTX1BMQU5FMiAgICAgIDB4MDAwMDAxMDBMDQotI2RlZmluZSBEM0RDU19QTEFORTMgICAgICAweDAwMDAwMjAwTA0KLSNkZWZpbmUgRDNEQ1NfUExBTkU0ICAgICAgMHgwMDAwMDQwMEwNCi0jZGVmaW5lIEQzRENTX1BMQU5FNSAgICAgIDB4MDAwMDA4MDBMDQotDQotI2RlZmluZSBEM0RDU19BTEwgKEQzRENTX0xFRlQgICB8IFwNCi0gICAgICAgICAgICAgICAgICAgRDNEQ1NfUklHSFQgIHwgXA0KLSAgICAgICAgICAgICAgICAgICBEM0RDU19UT1AgICAgfCBcDQotICAgICAgICAgICAgICAgICAgIEQzRENTX0JPVFRPTSB8IFwNCi0gICAgICAgICAgICAgICAgICAgRDNEQ1NfRlJPTlQgIHwgXA0KLSAgICAgICAgICAgICAgICAgICBEM0RDU19CQUNLICAgfCBcDQotICAgICAgICAgICAgICAgICAgIEQzRENTX1BMQU5FMCB8IFwNCi0gICAgICAgICAgICAgICAgICAgRDNEQ1NfUExBTkUxIHwgXA0KLSAgICAgICAgICAgICAgICAgICBEM0RDU19QTEFORTIgfCBcDQotICAgICAgICAgICAgICAgICAgIEQzRENTX1BMQU5FMyB8IFwNCi0gICAgICAgICAgICAgICAgICAgRDNEQ1NfUExBTkU0IHwgXA0KLSAgICAgICAgICAgICAgICAgICBEM0RDU19QTEFORTUpDQotDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRENMSVBTVEFUVVM4IHsNCi0gICAgRFdPUkQgQ2xpcFVuaW9uOw0KLSAgICBEV09SRCBDbGlwSW50ZXJzZWN0aW9uOw0KLX0gRDNEQ0xJUFNUQVRVUzg7DQotDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRE1BVEVSSUFMOCB7DQotICAgIEQzRENPTE9SVkFMVUUgICBEaWZmdXNlOyAgICAgICAgLyogRGlmZnVzZSBjb2xvciBSR0JBICovDQotICAgIEQzRENPTE9SVkFMVUUgICBBbWJpZW50OyAgICAgICAgLyogQW1iaWVudCBjb2xvciBSR0IgKi8NCi0gICAgRDNEQ09MT1JWQUxVRSAgIFNwZWN1bGFyOyAgICAgICAvKiBTcGVjdWxhciAnc2hpbmluZXNzJyAqLw0KLSAgICBEM0RDT0xPUlZBTFVFICAgRW1pc3NpdmU7ICAgICAgIC8qIEVtaXNzaXZlIGNvbG9yIFJHQiAqLw0KLSAgICBmbG9hdCAgICAgICAgICAgUG93ZXI7ICAgICAgICAgIC8qIFNoYXJwbmVzcyBpZiBzcGVjdWxhciBoaWdobGlnaHQgKi8NCi19IEQzRE1BVEVSSUFMODsNCi0NCi10eXBlZGVmIGVudW0gX0QzRExJR0hUVFlQRSB7DQotICAgIEQzRExJR0hUX1BPSU5UICAgICAgICAgID0gMSwNCi0gICAgRDNETElHSFRfU1BPVCAgICAgICAgICAgPSAyLA0KLSAgICBEM0RMSUdIVF9ESVJFQ1RJT05BTCAgICA9IDMsDQotICAgIEQzRExJR0hUX0ZPUkNFX0RXT1JEICAgID0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLw0KLX0gRDNETElHSFRUWVBFOw0KLQ0KLXR5cGVkZWYgc3RydWN0IF9EM0RMSUdIVDggew0KLSAgICBEM0RMSUdIVFRZUEUgICAgVHlwZTsgICAgICAgICAgICAvKiBUeXBlIG9mIGxpZ2h0IHNvdXJjZSAqLw0KLSAgICBEM0RDT0xPUlZBTFVFICAgRGlmZnVzZTsgICAgICAgICAvKiBEaWZmdXNlIGNvbG9yIG9mIGxpZ2h0ICovDQotICAgIEQzRENPTE9SVkFMVUUgICBTcGVjdWxhcjsgICAgICAgIC8qIFNwZWN1bGFyIGNvbG9yIG9mIGxpZ2h0ICovDQotICAgIEQzRENPTE9SVkFMVUUgICBBbWJpZW50OyAgICAgICAgIC8qIEFtYmllbnQgY29sb3Igb2YgbGlnaHQgKi8NCi0gICAgRDNEVkVDVE9SICAgICAgIFBvc2l0aW9uOyAgICAgICAgIC8qIFBvc2l0aW9uIGluIHdvcmxkIHNwYWNlICovDQotICAgIEQzRFZFQ1RPUiAgICAgICBEaXJlY3Rpb247ICAgICAgICAvKiBEaXJlY3Rpb24gaW4gd29ybGQgc3BhY2UgKi8NCi0gICAgZmxvYXQgICAgICAgICAgIFJhbmdlOyAgICAgICAgICAgIC8qIEN1dG9mZiByYW5nZSAqLw0KLSAgICBmbG9hdCAgICAgICAgICAgRmFsbG9mZjsgICAgICAgICAgLyogRmFsbG9mZiAqLw0KLSAgICBmbG9hdCAgICAgICAgICAgQXR0ZW51YXRpb24wOyAgICAgLyogQ29uc3RhbnQgYXR0ZW51YXRpb24gKi8NCi0gICAgZmxvYXQgICAgICAgICAgIEF0dGVudWF0aW9uMTsgICAgIC8qIExpbmVhciBhdHRlbnVhdGlvbiAqLw0KLSAgICBmbG9hdCAgICAgICAgICAgQXR0ZW51YXRpb24yOyAgICAgLyogUXVhZHJhdGljIGF0dGVudWF0aW9uICovDQotICAgIGZsb2F0ICAgICAgICAgICBUaGV0YTsgICAgICAgICAgICAvKiBJbm5lciBhbmdsZSBvZiBzcG90bGlnaHQgY29uZSAqLw0KLSAgICBmbG9hdCAgICAgICAgICAgUGhpOyAgICAgICAgICAgICAgLyogT3V0ZXIgYW5nbGUgb2Ygc3BvdGxpZ2h0IGNvbmUgKi8NCi19IEQzRExJR0hUODsNCi0NCi0vKg0KLSAqIE9wdGlvbnMgZm9yIGNsZWFyaW5nDQotICovDQotI2RlZmluZSBEM0RDTEVBUl9UQVJHRVQgICAgICAgICAgICAweDAwMDAwMDAxbCAgLyogQ2xlYXIgdGFyZ2V0IHN1cmZhY2UgKi8NCi0jZGVmaW5lIEQzRENMRUFSX1pCVUZGRVIgICAgICAgICAgIDB4MDAwMDAwMDJsICAvKiBDbGVhciB0YXJnZXQgeiBidWZmZXIgKi8NCi0jZGVmaW5lIEQzRENMRUFSX1NURU5DSUwgICAgICAgICAgIDB4MDAwMDAwMDRsICAvKiBDbGVhciBzdGVuY2lsIHBsYW5lcyAqLw0KLQ0KLS8qDQotICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHRoZSByZW5kZXJpbmcgc3RhdGVzDQotICovDQotDQotdHlwZWRlZiBlbnVtIF9EM0RTSEFERU1PREUgew0KLSAgICBEM0RTSEFERV9GTEFUICAgICAgICAgICAgICAgPSAxLA0KLSAgICBEM0RTSEFERV9HT1VSQVVEICAgICAgICAgICAgPSAyLA0KLSAgICBEM0RTSEFERV9QSE9ORyAgICAgICAgICAgICAgPSAzLA0KLSAgICBEM0RTSEFERV9GT1JDRV9EV09SRCAgICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQotfSBEM0RTSEFERU1PREU7DQotDQotdHlwZWRlZiBlbnVtIF9EM0RGSUxMTU9ERSB7DQotICAgIEQzREZJTExfUE9JTlQgICAgICAgICAgICAgICA9IDEsDQotICAgIEQzREZJTExfV0lSRUZSQU1FICAgICAgICAgICA9IDIsDQotICAgIEQzREZJTExfU09MSUQgICAgICAgICAgICAgICA9IDMsDQotICAgIEQzREZJTExfRk9SQ0VfRFdPUkQgICAgICAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCi19IEQzREZJTExNT0RFOw0KLQ0KLXR5cGVkZWYgc3RydWN0IF9EM0RMSU5FUEFUVEVSTiB7DQotICAgIFdPUkQgICAgd1JlcGVhdEZhY3RvcjsNCi0gICAgV09SRCAgICB3TGluZVBhdHRlcm47DQotfSBEM0RMSU5FUEFUVEVSTjsNCi0NCi10eXBlZGVmIGVudW0gX0QzREJMRU5EIHsNCi0gICAgRDNEQkxFTkRfWkVSTyAgICAgICAgICAgICAgID0gMSwNCi0gICAgRDNEQkxFTkRfT05FICAgICAgICAgICAgICAgID0gMiwNCi0gICAgRDNEQkxFTkRfU1JDQ09MT1IgICAgICAgICAgID0gMywNCi0gICAgRDNEQkxFTkRfSU5WU1JDQ09MT1IgICAgICAgID0gNCwNCi0gICAgRDNEQkxFTkRfU1JDQUxQSEEgICAgICAgICAgID0gNSwNCi0gICAgRDNEQkxFTkRfSU5WU1JDQUxQSEEgICAgICAgID0gNiwNCi0gICAgRDNEQkxFTkRfREVTVEFMUEhBICAgICAgICAgID0gNywNCi0gICAgRDNEQkxFTkRfSU5WREVTVEFMUEhBICAgICAgID0gOCwNCi0gICAgRDNEQkxFTkRfREVTVENPTE9SICAgICAgICAgID0gOSwNCi0gICAgRDNEQkxFTkRfSU5WREVTVENPTE9SICAgICAgID0gMTAsDQotICAgIEQzREJMRU5EX1NSQ0FMUEhBU0FUICAgICAgICA9IDExLA0KLSAgICBEM0RCTEVORF9CT1RIU1JDQUxQSEEgICAgICAgPSAxMiwNCi0gICAgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBICAgID0gMTMsDQotICAgIEQzREJMRU5EX0ZPUkNFX0RXT1JEICAgICAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCi19IEQzREJMRU5EOw0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEQkxFTkRPUCB7DQotICAgIEQzREJMRU5ET1BfQUREICAgICAgICAgICAgICA9IDEsDQotICAgIEQzREJMRU5ET1BfU1VCVFJBQ1QgICAgICAgICA9IDIsDQotICAgIEQzREJMRU5ET1BfUkVWU1VCVFJBQ1QgICAgICA9IDMsDQotICAgIEQzREJMRU5ET1BfTUlOICAgICAgICAgICAgICA9IDQsDQotICAgIEQzREJMRU5ET1BfTUFYICAgICAgICAgICAgICA9IDUsDQotICAgIEQzREJMRU5ET1BfRk9SQ0VfRFdPUkQgICAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCi19IEQzREJMRU5ET1A7DQotDQotdHlwZWRlZiBlbnVtIF9EM0RURVhUVVJFQUREUkVTUyB7DQotICAgIEQzRFRBRERSRVNTX1dSQVAgICAgICAgICAgICA9IDEsDQotICAgIEQzRFRBRERSRVNTX01JUlJPUiAgICAgICAgICA9IDIsDQotICAgIEQzRFRBRERSRVNTX0NMQU1QICAgICAgICAgICA9IDMsDQotICAgIEQzRFRBRERSRVNTX0JPUkRFUiAgICAgICAgICA9IDQsDQotICAgIEQzRFRBRERSRVNTX01JUlJPUk9OQ0UgICAgICA9IDUsDQotICAgIEQzRFRBRERSRVNTX0ZPUkNFX0RXT1JEICAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCi19IEQzRFRFWFRVUkVBRERSRVNTOw0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEQ1VMTCB7DQotICAgIEQzRENVTExfTk9ORSAgICAgICAgICAgICAgICA9IDEsDQotICAgIEQzRENVTExfQ1cgICAgICAgICAgICAgICAgICA9IDIsDQotICAgIEQzRENVTExfQ0NXICAgICAgICAgICAgICAgICA9IDMsDQotICAgIEQzRENVTExfRk9SQ0VfRFdPUkQgICAgICAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCi19IEQzRENVTEw7DQotDQotdHlwZWRlZiBlbnVtIF9EM0RDTVBGVU5DIHsNCi0gICAgRDNEQ01QX05FVkVSICAgICAgICAgICAgICAgID0gMSwNCi0gICAgRDNEQ01QX0xFU1MgICAgICAgICAgICAgICAgID0gMiwNCi0gICAgRDNEQ01QX0VRVUFMICAgICAgICAgICAgICAgID0gMywNCi0gICAgRDNEQ01QX0xFU1NFUVVBTCAgICAgICAgICAgID0gNCwNCi0gICAgRDNEQ01QX0dSRUFURVIgICAgICAgICAgICAgID0gNSwNCi0gICAgRDNEQ01QX05PVEVRVUFMICAgICAgICAgICAgID0gNiwNCi0gICAgRDNEQ01QX0dSRUFURVJFUVVBTCAgICAgICAgID0gNywNCi0gICAgRDNEQ01QX0FMV0FZUyAgICAgICAgICAgICAgID0gOCwNCi0gICAgRDNEQ01QX0ZPUkNFX0RXT1JEICAgICAgICAgID0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLw0KLX0gRDNEQ01QRlVOQzsNCi0NCi10eXBlZGVmIGVudW0gX0QzRFNURU5DSUxPUCB7DQotICAgIEQzRFNURU5DSUxPUF9LRUVQICAgICAgICAgICA9IDEsDQotICAgIEQzRFNURU5DSUxPUF9aRVJPICAgICAgICAgICA9IDIsDQotICAgIEQzRFNURU5DSUxPUF9SRVBMQUNFICAgICAgICA9IDMsDQotICAgIEQzRFNURU5DSUxPUF9JTkNSU0FUICAgICAgICA9IDQsDQotICAgIEQzRFNURU5DSUxPUF9ERUNSU0FUICAgICAgICA9IDUsDQotICAgIEQzRFNURU5DSUxPUF9JTlZFUlQgICAgICAgICA9IDYsDQotICAgIEQzRFNURU5DSUxPUF9JTkNSICAgICAgICAgICA9IDcsDQotICAgIEQzRFNURU5DSUxPUF9ERUNSICAgICAgICAgICA9IDgsDQotICAgIEQzRFNURU5DSUxPUF9GT1JDRV9EV09SRCAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCi19IEQzRFNURU5DSUxPUDsNCi0NCi10eXBlZGVmIGVudW0gX0QzREZPR01PREUgew0KLSAgICBEM0RGT0dfTk9ORSAgICAgICAgICAgICAgICAgPSAwLA0KLSAgICBEM0RGT0dfRVhQICAgICAgICAgICAgICAgICAgPSAxLA0KLSAgICBEM0RGT0dfRVhQMiAgICAgICAgICAgICAgICAgPSAyLA0KLSAgICBEM0RGT0dfTElORUFSICAgICAgICAgICAgICAgPSAzLA0KLSAgICBEM0RGT0dfRk9SQ0VfRFdPUkQgICAgICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQotfSBEM0RGT0dNT0RFOw0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEWkJVRkZFUlRZUEUgew0KLSAgICBEM0RaQl9GQUxTRSAgICAgICAgICAgICAgICAgPSAwLA0KLSAgICBEM0RaQl9UUlVFICAgICAgICAgICAgICAgICAgPSAxLCAvLyBaIGJ1ZmZlcmluZw0KLSAgICBEM0RaQl9VU0VXICAgICAgICAgICAgICAgICAgPSAyLCAvLyBXIGJ1ZmZlcmluZw0KLSAgICBEM0RaQl9GT1JDRV9EV09SRCAgICAgICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQotfSBEM0RaQlVGRkVSVFlQRTsNCi0NCi0vLyBQcmltaXRpdmVzIHN1cHBvcnRlZCBieSBkcmF3LXByaW1pdGl2ZSBBUEkNCi10eXBlZGVmIGVudW0gX0QzRFBSSU1JVElWRVRZUEUgew0KLSAgICBEM0RQVF9QT0lOVExJU1QgICAgICAgICAgICAgPSAxLA0KLSAgICBEM0RQVF9MSU5FTElTVCAgICAgICAgICAgICAgPSAyLA0KLSAgICBEM0RQVF9MSU5FU1RSSVAgICAgICAgICAgICAgPSAzLA0KLSAgICBEM0RQVF9UUklBTkdMRUxJU1QgICAgICAgICAgPSA0LA0KLSAgICBEM0RQVF9UUklBTkdMRVNUUklQICAgICAgICAgPSA1LA0KLSAgICBEM0RQVF9UUklBTkdMRUZBTiAgICAgICAgICAgPSA2LA0KLSAgICBEM0RQVF9GT1JDRV9EV09SRCAgICAgICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQotfSBEM0RQUklNSVRJVkVUWVBFOw0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHsNCi0gICAgRDNEVFNfVklFVyAgICAgICAgICA9IDIsDQotICAgIEQzRFRTX1BST0pFQ1RJT04gICAgPSAzLA0KLSAgICBEM0RUU19URVhUVVJFMCAgICAgID0gMTYsDQotICAgIEQzRFRTX1RFWFRVUkUxICAgICAgPSAxNywNCi0gICAgRDNEVFNfVEVYVFVSRTIgICAgICA9IDE4LA0KLSAgICBEM0RUU19URVhUVVJFMyAgICAgID0gMTksDQotICAgIEQzRFRTX1RFWFRVUkU0ICAgICAgPSAyMCwNCi0gICAgRDNEVFNfVEVYVFVSRTUgICAgICA9IDIxLA0KLSAgICBEM0RUU19URVhUVVJFNiAgICAgID0gMjIsDQotICAgIEQzRFRTX1RFWFRVUkU3ICAgICAgPSAyMywNCi0gICAgRDNEVFNfRk9SQ0VfRFdPUkQgICAgID0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLw0KLX0gRDNEVFJBTlNGT1JNU1RBVEVUWVBFOw0KLQ0KLSNkZWZpbmUgRDNEVFNfV09STERNQVRSSVgoaW5kZXgpIChEM0RUUkFOU0ZPUk1TVEFURVRZUEUpKGluZGV4ICsgMjU2KQ0KLSNkZWZpbmUgRDNEVFNfV09STEQgIEQzRFRTX1dPUkxETUFUUklYKDApDQotI2RlZmluZSBEM0RUU19XT1JMRDEgRDNEVFNfV09STERNQVRSSVgoMSkNCi0jZGVmaW5lIEQzRFRTX1dPUkxEMiBEM0RUU19XT1JMRE1BVFJJWCgyKQ0KLSNkZWZpbmUgRDNEVFNfV09STEQzIEQzRFRTX1dPUkxETUFUUklYKDMpDQotDQotdHlwZWRlZiBlbnVtIF9EM0RSRU5ERVJTVEFURVRZUEUgew0KLSAgICBEM0RSU19aRU5BQkxFICAgICAgICAgICAgICAgICAgID0gNywgICAgLyogRDNEWkJVRkZFUlRZUEUgKG9yIFRSVUUvRkFMU0UgZm9yIGxlZ2FjeSkgKi8NCi0gICAgRDNEUlNfRklMTE1PREUgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qIEQzREZJTExNT0RFICovDQotICAgIEQzRFJTX1NIQURFTU9ERSAgICAgICAgICAgICAgICAgPSA5LCAgICAvKiBEM0RTSEFERU1PREUgKi8NCi0gICAgRDNEUlNfTElORVBBVFRFUk4gICAgICAgICAgICAgICA9IDEwLCAgIC8qIEQzRExJTkVQQVRURVJOICovDQotICAgIEQzRFJTX1pXUklURUVOQUJMRSAgICAgICAgICAgICAgPSAxNCwgICAvKiBUUlVFIHRvIGVuYWJsZSB6IHdyaXRlcyAqLw0KLSAgICBEM0RSU19BTFBIQVRFU1RFTkFCTEUgICAgICAgICAgID0gMTUsICAgLyogVFJVRSB0byBlbmFibGUgYWxwaGEgdGVzdHMgKi8NCi0gICAgRDNEUlNfTEFTVFBJWEVMICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qIFRSVUUgZm9yIGxhc3QtcGl4ZWwgb24gbGluZXMgKi8NCi0gICAgRDNEUlNfU1JDQkxFTkQgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qIEQzREJMRU5EICovDQotICAgIEQzRFJTX0RFU1RCTEVORCAgICAgICAgICAgICAgICAgPSAyMCwgICAvKiBEM0RCTEVORCAqLw0KLSAgICBEM0RSU19DVUxMTU9ERSAgICAgICAgICAgICAgICAgID0gMjIsICAgLyogRDNEQ1VMTCAqLw0KLSAgICBEM0RSU19aRlVOQyAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyogRDNEQ01QRlVOQyAqLw0KLSAgICBEM0RSU19BTFBIQVJFRiAgICAgICAgICAgICAgICAgID0gMjQsICAgLyogRDNERklYRUQgKi8NCi0gICAgRDNEUlNfQUxQSEFGVU5DICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qIEQzRENNUEZVTkMgKi8NCi0gICAgRDNEUlNfRElUSEVSRU5BQkxFICAgICAgICAgICAgICA9IDI2LCAgIC8qIFRSVUUgdG8gZW5hYmxlIGRpdGhlcmluZyAqLw0KLSAgICBEM0RSU19BTFBIQUJMRU5ERU5BQkxFICAgICAgICAgID0gMjcsICAgLyogVFJVRSB0byBlbmFibGUgYWxwaGEgYmxlbmRpbmcgKi8NCi0gICAgRDNEUlNfRk9HRU5BQkxFICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qIFRSVUUgdG8gZW5hYmxlIGZvZyBibGVuZGluZyAqLw0KLSAgICBEM0RSU19TUEVDVUxBUkVOQUJMRSAgICAgICAgICAgID0gMjksICAgLyogVFJVRSB0byBlbmFibGUgc3BlY3VsYXIgKi8NCi0gICAgRDNEUlNfWlZJU0lCTEUgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qIFRSVUUgdG8gZW5hYmxlIHogY2hlY2tpbmcgKi8NCi0gICAgRDNEUlNfRk9HQ09MT1IgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qIEQzRENPTE9SICovDQotICAgIEQzRFJTX0ZPR1RBQkxFTU9ERSAgICAgICAgICAgICAgPSAzNSwgICAvKiBEM0RGT0dNT0RFICovDQotICAgIEQzRFJTX0ZPR1NUQVJUICAgICAgICAgICAgICAgICAgPSAzNiwgICAvKiBGb2cgc3RhcnQgKGZvciBib3RoIHZlcnRleCBhbmQgcGl4ZWwgZm9nKSAqLw0KLSAgICBEM0RSU19GT0dFTkQgICAgICAgICAgICAgICAgICAgID0gMzcsICAgLyogRm9nIGVuZCAgICAgICovDQotICAgIEQzRFJTX0ZPR0RFTlNJVFkgICAgICAgICAgICAgICAgPSAzOCwgICAvKiBGb2cgZGVuc2l0eSAgKi8NCi0gICAgRDNEUlNfRURHRUFOVElBTElBUyAgICAgICAgICAgICA9IDQwLCAgIC8qIFRSVUUgdG8gZW5hYmxlIGVkZ2UgYW50aWFsaWFzaW5nICovDQotICAgIEQzRFJTX1pCSUFTICAgICAgICAgICAgICAgICAgICAgPSA0NywgICAvKiBMT05HIFogYmlhcyAqLw0KLSAgICBEM0RSU19SQU5HRUZPR0VOQUJMRSAgICAgICAgICAgID0gNDgsICAgLyogRW5hYmxlcyByYW5nZS1iYXNlZCBmb2cgKi8NCi0gICAgRDNEUlNfU1RFTkNJTEVOQUJMRSAgICAgICAgICAgICA9IDUyLCAgIC8qIEJPT0wgZW5hYmxlL2Rpc2FibGUgc3RlbmNpbGluZyAqLw0KLSAgICBEM0RSU19TVEVOQ0lMRkFJTCAgICAgICAgICAgICAgID0gNTMsICAgLyogRDNEU1RFTkNJTE9QIHRvIGRvIGlmIHN0ZW5jaWwgdGVzdCBmYWlscyAqLw0KLSAgICBEM0RSU19TVEVOQ0lMWkZBSUwgICAgICAgICAgICAgID0gNTQsICAgLyogRDNEU1RFTkNJTE9QIHRvIGRvIGlmIHN0ZW5jaWwgdGVzdCBwYXNzZXMgYW5kIFogdGVzdCBmYWlscyAqLw0KLSAgICBEM0RSU19TVEVOQ0lMUEFTUyAgICAgICAgICAgICAgID0gNTUsICAgLyogRDNEU1RFTkNJTE9QIHRvIGRvIGlmIGJvdGggc3RlbmNpbCBhbmQgWiB0ZXN0cyBwYXNzICovDQotICAgIEQzRFJTX1NURU5DSUxGVU5DICAgICAgICAgICAgICAgPSA1NiwgICAvKiBEM0RDTVBGVU5DIGZuLiAgU3RlbmNpbCBUZXN0IHBhc3NlcyBpZiAoKHJlZiAmIG1hc2spIHN0ZW5jaWxmbiAoc3RlbmNpbCAmIG1hc2spKSBpcyB0cnVlICovDQotICAgIEQzRFJTX1NURU5DSUxSRUYgICAgICAgICAgICAgICAgPSA1NywgICAvKiBSZWZlcmVuY2UgdmFsdWUgdXNlZCBpbiBzdGVuY2lsIHRlc3QgKi8NCi0gICAgRDNEUlNfU1RFTkNJTE1BU0sgICAgICAgICAgICAgICA9IDU4LCAgIC8qIE1hc2sgdmFsdWUgdXNlZCBpbiBzdGVuY2lsIHRlc3QgKi8NCi0gICAgRDNEUlNfU1RFTkNJTFdSSVRFTUFTSyAgICAgICAgICA9IDU5LCAgIC8qIFdyaXRlIG1hc2sgYXBwbGllZCB0byB2YWx1ZXMgd3JpdHRlbiB0byBzdGVuY2lsIGJ1ZmZlciAqLw0KLSAgICBEM0RSU19URVhUVVJFRkFDVE9SICAgICAgICAgICAgID0gNjAsICAgLyogRDNEQ09MT1IgdXNlZCBmb3IgbXVsdGktdGV4dHVyZSBibGVuZCAqLw0KLSAgICBEM0RSU19XUkFQMCAgICAgICAgICAgICAgICAgICAgID0gMTI4LCAgLyogd3JhcCBmb3IgMXN0IHRleHR1cmUgY29vcmQuIHNldCAqLw0KLSAgICBEM0RSU19XUkFQMSAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgLyogd3JhcCBmb3IgMm5kIHRleHR1cmUgY29vcmQuIHNldCAqLw0KLSAgICBEM0RSU19XUkFQMiAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgLyogd3JhcCBmb3IgM3JkIHRleHR1cmUgY29vcmQuIHNldCAqLw0KLSAgICBEM0RSU19XUkFQMyAgICAgICAgICAgICAgICAgICAgID0gMTMxLCAgLyogd3JhcCBmb3IgNHRoIHRleHR1cmUgY29vcmQuIHNldCAqLw0KLSAgICBEM0RSU19XUkFQNCAgICAgICAgICAgICAgICAgICAgID0gMTMyLCAgLyogd3JhcCBmb3IgNXRoIHRleHR1cmUgY29vcmQuIHNldCAqLw0KLSAgICBEM0RSU19XUkFQNSAgICAgICAgICAgICAgICAgICAgID0gMTMzLCAgLyogd3JhcCBmb3IgNnRoIHRleHR1cmUgY29vcmQuIHNldCAqLw0KLSAgICBEM0RSU19XUkFQNiAgICAgICAgICAgICAgICAgICAgID0gMTM0LCAgLyogd3JhcCBmb3IgN3RoIHRleHR1cmUgY29vcmQuIHNldCAqLw0KLSAgICBEM0RSU19XUkFQNyAgICAgICAgICAgICAgICAgICAgID0gMTM1LCAgLyogd3JhcCBmb3IgOHRoIHRleHR1cmUgY29vcmQuIHNldCAqLw0KLSAgICBEM0RSU19DTElQUElORyAgICAgICAgICAgICAgICAgID0gMTM2LA0KLSAgICBEM0RSU19MSUdIVElORyAgICAgICAgICAgICAgICAgID0gMTM3LA0KLSAgICBEM0RSU19BTUJJRU5UICAgICAgICAgICAgICAgICAgID0gMTM5LA0KLSAgICBEM0RSU19GT0dWRVJURVhNT0RFICAgICAgICAgICAgID0gMTQwLA0KLSAgICBEM0RSU19DT0xPUlZFUlRFWCAgICAgICAgICAgICAgID0gMTQxLA0KLSAgICBEM0RSU19MT0NBTFZJRVdFUiAgICAgICAgICAgICAgID0gMTQyLA0KLSAgICBEM0RSU19OT1JNQUxJWkVOT1JNQUxTICAgICAgICAgID0gMTQzLA0KLSAgICBEM0RSU19ESUZGVVNFTUFURVJJQUxTT1VSQ0UgICAgID0gMTQ1LA0KLSAgICBEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFICAgID0gMTQ2LA0KLSAgICBEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0UgICAgID0gMTQ3LA0KLSAgICBEM0RSU19FTUlTU0lWRU1BVEVSSUFMU09VUkNFICAgID0gMTQ4LA0KLSAgICBEM0RSU19WRVJURVhCTEVORCAgICAgICAgICAgICAgID0gMTUxLA0KLSAgICBEM0RSU19DTElQUExBTkVFTkFCTEUgICAgICAgICAgID0gMTUyLA0KLSAgICBEM0RSU19TT0ZUV0FSRVZFUlRFWFBST0NFU1NJTkcgID0gMTUzLA0KLSAgICBEM0RSU19QT0lOVFNJWkUgICAgICAgICAgICAgICAgID0gMTU0LCAgIC8qIGZsb2F0IHBvaW50IHNpemUgKi8NCi0gICAgRDNEUlNfUE9JTlRTSVpFX01JTiAgICAgICAgICAgICA9IDE1NSwgICAvKiBmbG9hdCBwb2ludCBzaXplIG1pbiB0aHJlc2hvbGQgKi8NCi0gICAgRDNEUlNfUE9JTlRTUFJJVEVFTkFCTEUgICAgICAgICA9IDE1NiwgICAvKiBCT09MIHBvaW50IHRleHR1cmUgY29vcmQgY29udHJvbCAqLw0KLSAgICBEM0RSU19QT0lOVFNDQUxFRU5BQkxFICAgICAgICAgID0gMTU3LCAgIC8qIEJPT0wgcG9pbnQgc2l6ZSBzY2FsZSBlbmFibGUgKi8NCi0gICAgRDNEUlNfUE9JTlRTQ0FMRV9BICAgICAgICAgICAgICA9IDE1OCwgICAvKiBmbG9hdCBwb2ludCBhdHRlbnVhdGlvbiBBIHZhbHVlICovDQotICAgIEQzRFJTX1BPSU5UU0NBTEVfQiAgICAgICAgICAgICAgPSAxNTksICAgLyogZmxvYXQgcG9pbnQgYXR0ZW51YXRpb24gQiB2YWx1ZSAqLw0KLSAgICBEM0RSU19QT0lOVFNDQUxFX0MgICAgICAgICAgICAgID0gMTYwLCAgIC8qIGZsb2F0IHBvaW50IGF0dGVudWF0aW9uIEMgdmFsdWUgKi8NCi0gICAgRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVMgICAgICA9IDE2MSwgIC8vIEJPT0wgLSBzZXQgdG8gZG8gRlNBQSB3aXRoIG11bHRpc2FtcGxlIGJ1ZmZlcg0KLSAgICBEM0RSU19NVUxUSVNBTVBMRU1BU0sgICAgICAgICAgID0gMTYyLCAgLy8gRFdPUkQgLSBwZXItc2FtcGxlIGVuYWJsZS9kaXNhYmxlDQotICAgIEQzRFJTX1BBVENIRURHRVNUWUxFICAgICAgICAgICAgPSAxNjMsICAvLyBTZXRzIHdoZXRoZXIgcGF0Y2ggZWRnZXMgd2lsbCB1c2UgZmxvYXQgc3R5bGUgdGVzc2VsbGF0aW9uDQotICAgIEQzRFJTX1BBVENIU0VHTUVOVFMgICAgICAgICAgICAgPSAxNjQsICAvLyBOdW1iZXIgb2Ygc2VnbWVudHMgcGVyIGVkZ2Ugd2hlbiBkcmF3aW5nIHBhdGNoZXMNCi0gICAgRDNEUlNfREVCVUdNT05JVE9SVE9LRU4gICAgICAgICA9IDE2NSwgIC8vIERFQlVHIE9OTFkgLSB0b2tlbiB0byBkZWJ1ZyBtb25pdG9yDQotICAgIEQzRFJTX1BPSU5UU0laRV9NQVggICAgICAgICAgICAgPSAxNjYsICAgLyogZmxvYXQgcG9pbnQgc2l6ZSBtYXggdGhyZXNob2xkICovDQotICAgIEQzRFJTX0lOREVYRURWRVJURVhCTEVOREVOQUJMRSAgPSAxNjcsDQotICAgIEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUgICAgICAgICAgPSAxNjgsICAvLyBwZXItY2hhbm5lbCB3cml0ZSBlbmFibGUNCi0gICAgRDNEUlNfVFdFRU5GQUNUT1IgICAgICAgICAgICAgICA9IDE3MCwgICAvLyBmbG9hdCB0d2VlbiBmYWN0b3INCi0gICAgRDNEUlNfQkxFTkRPUCAgICAgICAgICAgICAgICAgICA9IDE3MSwgICAvLyBEM0RCTEVORE9QIHNldHRpbmcNCi0gICAgRDNEUlNfUE9TSVRJT05PUkRFUiAgICAgICAgICAgICA9IDE3MiwgICAvLyBOUGF0Y2ggcG9zaXRpb24gaW50ZXJwb2xhdGlvbiBvcmRlci4gRDNET1JERVJfTElORUFSIG9yIEQzRE9SREVSX0NVQklDIChkZWZhdWx0KQ0KLSAgICBEM0RSU19OT1JNQUxPUkRFUiAgICAgICAgICAgICAgID0gMTczLCAgIC8vIE5QYXRjaCBub3JtYWwgaW50ZXJwb2xhdGlvbiBvcmRlci4gRDNET1JERVJfTElORUFSIChkZWZhdWx0KSBvciBEM0RPUkRFUl9RVUFEUkFUSUMNCi0NCi0gICAgRDNEUlNfRk9SQ0VfRFdPUkQgICAgICAgICAgICAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCi19IEQzRFJFTkRFUlNUQVRFVFlQRTsNCi0NCi0vLyBWYWx1ZXMgZm9yIG1hdGVyaWFsIHNvdXJjZQ0KLXR5cGVkZWYgZW51bSBfRDNETUFURVJJQUxDT0xPUlNPVVJDRQ0KLXsNCi0gICAgRDNETUNTX01BVEVSSUFMICAgICAgICAgPSAwLCAgICAgICAgICAgIC8vIENvbG9yIGZyb20gbWF0ZXJpYWwgaXMgdXNlZA0KLSAgICBEM0RNQ1NfQ09MT1IxICAgICAgICAgICA9IDEsICAgICAgICAgICAgLy8gRGlmZnVzZSB2ZXJ0ZXggY29sb3IgaXMgdXNlZA0KLSAgICBEM0RNQ1NfQ09MT1IyICAgICAgICAgICA9IDIsICAgICAgICAgICAgLy8gU3BlY3VsYXIgdmVydGV4IGNvbG9yIGlzIHVzZWQNCi0gICAgRDNETUNTX0ZPUkNFX0RXT1JEICAgICAgPSAweDdmZmZmZmZmLCAgIC8vIGZvcmNlIDMyLWJpdCBzaXplIGVudW0NCi19IEQzRE1BVEVSSUFMQ09MT1JTT1VSQ0U7DQotDQotLy8gQmlhcyB0byBhcHBseSB0byB0aGUgdGV4dHVyZSBjb29yZGluYXRlIHNldCB0byBhcHBseSBhIHdyYXAgdG8uDQotI2RlZmluZSBEM0RSRU5ERVJTVEFURV9XUkFQQklBUyAgICAgICAgICAgICAgICAgMTI4VUwNCi0NCi0vKiBGbGFncyB0byBjb25zdHJ1Y3QgdGhlIFdSQVAgcmVuZGVyIHN0YXRlcyAqLw0KLSNkZWZpbmUgRDNEV1JBUF9VICAgMHgwMDAwMDAwMUwNCi0jZGVmaW5lIEQzRFdSQVBfViAgIDB4MDAwMDAwMDJMDQotI2RlZmluZSBEM0RXUkFQX1cgICAweDAwMDAwMDA0TA0KLQ0KLS8qIEZsYWdzIHRvIGNvbnN0cnVjdCB0aGUgV1JBUCByZW5kZXIgc3RhdGVzIGZvciAxRCB0aHJ1IDREIHRleHR1cmUgY29vcmRpbmF0ZXMgKi8NCi0jZGVmaW5lIEQzRFdSQVBDT09SRF8wICAgMHgwMDAwMDAwMUwgICAgLy8gc2FtZSBhcyBEM0RXUkFQX1UNCi0jZGVmaW5lIEQzRFdSQVBDT09SRF8xICAgMHgwMDAwMDAwMkwgICAgLy8gc2FtZSBhcyBEM0RXUkFQX1YNCi0jZGVmaW5lIEQzRFdSQVBDT09SRF8yICAgMHgwMDAwMDAwNEwgICAgLy8gc2FtZSBhcyBEM0RXUkFQX1cNCi0jZGVmaW5lIEQzRFdSQVBDT09SRF8zICAgMHgwMDAwMDAwOEwNCi0NCi0vKiBGbGFncyB0byBjb25zdHJ1Y3QgRDNEUlNfQ09MT1JXUklURUVOQUJMRSAqLw0KLSNkZWZpbmUgRDNEQ09MT1JXUklURUVOQUJMRV9SRUQgICAgICgxTDw8MCkNCi0jZGVmaW5lIEQzRENPTE9SV1JJVEVFTkFCTEVfR1JFRU4gICAoMUw8PDEpDQotI2RlZmluZSBEM0RDT0xPUldSSVRFRU5BQkxFX0JMVUUgICAgKDFMPDwyKQ0KLSNkZWZpbmUgRDNEQ09MT1JXUklURUVOQUJMRV9BTFBIQSAgICgxTDw8MykNCi0NCi0vKg0KLSAqIFN0YXRlIGVudW1lcmFudHMgZm9yIHBlci1zdGFnZSB0ZXh0dXJlIHByb2Nlc3NpbmcuDQotICovDQotdHlwZWRlZiBlbnVtIF9EM0RURVhUVVJFU1RBR0VTVEFURVRZUEUNCi17DQotICAgIEQzRFRTU19DT0xPUk9QICAgICAgICA9ICAxLCAvKiBEM0RURVhUVVJFT1AgLSBwZXItc3RhZ2UgYmxlbmRpbmcgY29udHJvbHMgZm9yIGNvbG9yIGNoYW5uZWxzICovDQotICAgIEQzRFRTU19DT0xPUkFSRzEgICAgICA9ICAyLCAvKiBEM0RUQV8qICh0ZXh0dXJlIGFyZykgKi8NCi0gICAgRDNEVFNTX0NPTE9SQVJHMiAgICAgID0gIDMsIC8qIEQzRFRBXyogKHRleHR1cmUgYXJnKSAqLw0KLSAgICBEM0RUU1NfQUxQSEFPUCAgICAgICAgPSAgNCwgLyogRDNEVEVYVFVSRU9QIC0gcGVyLXN0YWdlIGJsZW5kaW5nIGNvbnRyb2xzIGZvciBhbHBoYSBjaGFubmVsICovDQotICAgIEQzRFRTU19BTFBIQUFSRzEgICAgICA9ICA1LCAvKiBEM0RUQV8qICh0ZXh0dXJlIGFyZykgKi8NCi0gICAgRDNEVFNTX0FMUEhBQVJHMiAgICAgID0gIDYsIC8qIEQzRFRBXyogKHRleHR1cmUgYXJnKSAqLw0KLSAgICBEM0RUU1NfQlVNUEVOVk1BVDAwICAgPSAgNywgLyogZmxvYXQgKGJ1bXAgbWFwcGluZyBtYXRyaXgpICovDQotICAgIEQzRFRTU19CVU1QRU5WTUFUMDEgICA9ICA4LCAvKiBmbG9hdCAoYnVtcCBtYXBwaW5nIG1hdHJpeCkgKi8NCi0gICAgRDNEVFNTX0JVTVBFTlZNQVQxMCAgID0gIDksIC8qIGZsb2F0IChidW1wIG1hcHBpbmcgbWF0cml4KSAqLw0KLSAgICBEM0RUU1NfQlVNUEVOVk1BVDExICAgPSAxMCwgLyogZmxvYXQgKGJ1bXAgbWFwcGluZyBtYXRyaXgpICovDQotICAgIEQzRFRTU19URVhDT09SRElOREVYICA9IDExLCAvKiBpZGVudGlmaWVzIHdoaWNoIHNldCBvZiB0ZXh0dXJlIGNvb3JkaW5hdGVzIGluZGV4IHRoaXMgdGV4dHVyZSAqLw0KLSAgICBEM0RUU1NfQUREUkVTU1UgICAgICAgPSAxMywgLyogRDNEVEVYVFVSRUFERFJFU1MgZm9yIFUgY29vcmRpbmF0ZSAqLw0KLSAgICBEM0RUU1NfQUREUkVTU1YgICAgICAgPSAxNCwgLyogRDNEVEVYVFVSRUFERFJFU1MgZm9yIFYgY29vcmRpbmF0ZSAqLw0KLSAgICBEM0RUU1NfQk9SREVSQ09MT1IgICAgPSAxNSwgLyogRDNEQ09MT1IgKi8NCi0gICAgRDNEVFNTX01BR0ZJTFRFUiAgICAgID0gMTYsIC8qIEQzRFRFWFRVUkVGSUxURVIgZmlsdGVyIHRvIHVzZSBmb3IgbWFnbmlmaWNhdGlvbiAqLw0KLSAgICBEM0RUU1NfTUlORklMVEVSICAgICAgPSAxNywgLyogRDNEVEVYVFVSRUZJTFRFUiBmaWx0ZXIgdG8gdXNlIGZvciBtaW5pZmljYXRpb24gKi8NCi0gICAgRDNEVFNTX01JUEZJTFRFUiAgICAgID0gMTgsIC8qIEQzRFRFWFRVUkVGSUxURVIgZmlsdGVyIHRvIHVzZSBiZXR3ZWVuIG1pcG1hcHMgZHVyaW5nIG1pbmlmaWNhdGlvbiAqLw0KLSAgICBEM0RUU1NfTUlQTUFQTE9EQklBUyAgPSAxOSwgLyogZmxvYXQgTWlwbWFwIExPRCBiaWFzICovDQotICAgIEQzRFRTU19NQVhNSVBMRVZFTCAgICA9IDIwLCAvKiBEV09SRCAwLi4obi0xKSBMT0QgaW5kZXggb2YgbGFyZ2VzdCBtYXAgdG8gdXNlICgwID09IGxhcmdlc3QpICovDQotICAgIEQzRFRTU19NQVhBTklTT1RST1BZICA9IDIxLCAvKiBEV09SRCBtYXhpbXVtIGFuaXNvdHJvcHkgKi8NCi0gICAgRDNEVFNTX0JVTVBFTlZMU0NBTEUgID0gMjIsIC8qIGZsb2F0IHNjYWxlIGZvciBidW1wIG1hcCBsdW1pbmFuY2UgKi8NCi0gICAgRDNEVFNTX0JVTVBFTlZMT0ZGU0VUID0gMjMsIC8qIGZsb2F0IG9mZnNldCBmb3IgYnVtcCBtYXAgbHVtaW5hbmNlICovDQotICAgIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgPSAyNCwgLyogRDNEVEVYVFVSRVRSQU5TRk9STUZMQUdTIGNvbnRyb2xzIHRleHR1cmUgdHJhbnNmb3JtICovDQotICAgIEQzRFRTU19BRERSRVNTVyAgICAgICA9IDI1LCAvKiBEM0RURVhUVVJFQUREUkVTUyBmb3IgVyBjb29yZGluYXRlICovDQotICAgIEQzRFRTU19DT0xPUkFSRzAgICAgICA9IDI2LCAvKiBEM0RUQV8qIHRoaXJkIGFyZyBmb3IgdHJpYWRpYyBvcHMgKi8NCi0gICAgRDNEVFNTX0FMUEhBQVJHMCAgICAgID0gMjcsIC8qIEQzRFRBXyogdGhpcmQgYXJnIGZvciB0cmlhZGljIG9wcyAqLw0KLSAgICBEM0RUU1NfUkVTVUxUQVJHICAgICAgPSAyOCwgLyogRDNEVEFfKiBhcmcgZm9yIHJlc3VsdCAoQ1VSUkVOVCBvciBURU1QKSAqLw0KLSAgICBEM0RUU1NfRk9SQ0VfRFdPUkQgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCi19IEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRTsNCi0NCi0vLyBWYWx1ZXMsIHVzZWQgd2l0aCBEM0RUU1NfVEVYQ09PUkRJTkRFWCwgdG8gc3BlY2lmeSB0aGF0IHRoZSB2ZXJ0ZXggZGF0YShwb3NpdGlvbg0KLS8vIGFuZCBub3JtYWwgaW4gdGhlIGNhbWVyYSBzcGFjZSkgc2hvdWxkIGJlIHRha2VuIGFzIHRleHR1cmUgY29vcmRpbmF0ZXMNCi0vLyBMb3cgMTYgYml0cyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRleHR1cmUgY29vcmRpbmF0ZSBpbmRleCwgdG8gdGFrZSB0aGUgV1JBUCBtb2RlIGZyb20NCi0vLw0KLSNkZWZpbmUgRDNEVFNTX1RDSV9QQVNTVEhSVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMA0KLSNkZWZpbmUgRDNEVFNTX1RDSV9DQU1FUkFTUEFDRU5PUk1BTCAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMA0KLSNkZWZpbmUgRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVBPU0lUSU9OICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMA0KLSNkZWZpbmUgRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVJFRkxFQ1RJT05WRUNUT1IgICAgICAgICAgMHgwMDAzMDAwMA0KLQ0KLS8qDQotICogRW51bWVyYXRpb25zIGZvciBDT0xPUk9QIGFuZCBBTFBIQU9QIHRleHR1cmUgYmxlbmRpbmcgb3BlcmF0aW9ucyBzZXQgaW4NCi0gKiB0ZXh0dXJlIHByb2Nlc3Npbmcgc3RhZ2UgY29udHJvbHMgaW4gRDNEVFNTLg0KLSAqLw0KLXR5cGVkZWYgZW51bSBfRDNEVEVYVFVSRU9QDQotew0KLSAgICAvLyBDb250cm9sDQotICAgIEQzRFRPUF9ESVNBQkxFICAgICAgICAgICAgICA9IDEsICAgICAgLy8gZGlzYWJsZXMgc3RhZ2UNCi0gICAgRDNEVE9QX1NFTEVDVEFSRzEgICAgICAgICAgID0gMiwgICAgICAvLyB0aGUgZGVmYXVsdA0KLSAgICBEM0RUT1BfU0VMRUNUQVJHMiAgICAgICAgICAgPSAzLA0KLQ0KLSAgICAvLyBNb2R1bGF0ZQ0KLSAgICBEM0RUT1BfTU9EVUxBVEUgICAgICAgICAgICAgPSA0LCAgICAgIC8vIG11bHRpcGx5IGFyZ3MgdG9nZXRoZXINCi0gICAgRDNEVE9QX01PRFVMQVRFMlggICAgICAgICAgID0gNSwgICAgICAvLyBtdWx0aXBseSBhbmQgIDEgYml0DQotICAgIEQzRFRPUF9NT0RVTEFURTRYICAgICAgICAgICA9IDYsICAgICAgLy8gbXVsdGlwbHkgYW5kICAyIGJpdHMNCi0NCi0gICAgLy8gQWRkDQotICAgIEQzRFRPUF9BREQgICAgICAgICAgICAgICAgICA9ICA3LCAgIC8vIGFkZCBhcmd1bWVudHMgdG9nZXRoZXINCi0gICAgRDNEVE9QX0FERFNJR05FRCAgICAgICAgICAgID0gIDgsICAgLy8gYWRkIHdpdGggLTAuNSBiaWFzDQotICAgIEQzRFRPUF9BRERTSUdORUQyWCAgICAgICAgICA9ICA5LCAgIC8vIGFzIGFib3ZlIGJ1dCBsZWZ0ICAxIGJpdA0KLSAgICBEM0RUT1BfU1VCVFJBQ1QgICAgICAgICAgICAgPSAxMCwgICAvLyBBcmcxIC0gQXJnMiwgd2l0aCBubyBzYXR1cmF0aW9uDQotICAgIEQzRFRPUF9BRERTTU9PVEggICAgICAgICAgICA9IDExLCAgIC8vIGFkZCAyIGFyZ3MsIHN1YnRyYWN0IHByb2R1Y3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXJnMSArIEFyZzIgLSBBcmcxKkFyZzINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPSBBcmcxICsgKDEtQXJnMSkqQXJnMg0KLQ0KLSAgICAvLyBMaW5lYXIgYWxwaGEgYmxlbmQ6IEFyZzEqKEFscGhhKSArIEFyZzIqKDEtQWxwaGEpDQotICAgIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQSAgICA9IDEyLCAvLyBpdGVyYXRlZCBhbHBoYQ0KLSAgICBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEEgICAgPSAxMywgLy8gdGV4dHVyZSBhbHBoYQ0KLSAgICBEM0RUT1BfQkxFTkRGQUNUT1JBTFBIQSAgICAgPSAxNCwgLy8gYWxwaGEgZnJvbSBEM0RSU19URVhUVVJFRkFDVE9SDQotDQotICAgIC8vIExpbmVhciBhbHBoYSBibGVuZCB3aXRoIHByZS1tdWx0aXBsaWVkIGFyZzEgaW5wdXQ6IEFyZzEgKyBBcmcyKigxLUFscGhhKQ0KLSAgICBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTSAgPSAxNSwgLy8gdGV4dHVyZSBhbHBoYQ0KLSAgICBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEEgICAgPSAxNiwgLy8gYnkgYWxwaGEgb2YgY3VycmVudCBjb2xvcg0KLQ0KLSAgICAvLyBTcGVjdWxhciBtYXBwaW5nDQotICAgIEQzRFRPUF9QUkVNT0RVTEFURSAgICAgICAgICAgID0gMTcsICAgICAvLyBtb2R1bGF0ZSB3aXRoIG5leHQgdGV4dHVyZSBiZWZvcmUgdXNlDQotICAgIEQzRFRPUF9NT0RVTEFURUFMUEhBX0FERENPTE9SID0gMTgsICAgICAvLyBBcmcxLlJHQiArIEFyZzEuQSpBcmcyLlJHQg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ09MT1JPUCBvbmx5DQotICAgIEQzRFRPUF9NT0RVTEFURUNPTE9SX0FEREFMUEhBID0gMTksICAgICAvLyBBcmcxLlJHQipBcmcyLlJHQiArIEFyZzEuQQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ09MT1JPUCBvbmx5DQotICAgIEQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SID0gMjAsICAvLyAoMS1BcmcxLkEpKkFyZzIuUkdCICsgQXJnMS5SR0INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENPTE9ST1Agb25seQ0KLSAgICBEM0RUT1BfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSA9IDIxLCAgLy8gKDEtQXJnMS5SR0IpKkFyZzIuUkdCICsgQXJnMS5BDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDT0xPUk9QIG9ubHkNCi0NCi0gICAgLy8gQnVtcCBtYXBwaW5nDQotICAgIEQzRFRPUF9CVU1QRU5WTUFQICAgICAgICAgICA9IDIyLCAvLyBwZXIgcGl4ZWwgZW52IG1hcCBwZXJ0dXJiYXRpb24NCi0gICAgRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0UgID0gMjMsIC8vIHdpdGggbHVtaW5hbmNlIGNoYW5uZWwNCi0NCi0gICAgLy8gVGhpcyBjYW4gZG8gZWl0aGVyIGRpZmZ1c2Ugb3Igc3BlY3VsYXIgYnVtcCBtYXBwaW5nIHdpdGggY29ycmVjdCBpbnB1dC4NCi0gICAgLy8gUGVyZm9ybXMgdGhlIGZ1bmN0aW9uIChBcmcxLlIqQXJnMi5SICsgQXJnMS5HKkFyZzIuRyArIEFyZzEuQipBcmcyLkIpDQotICAgIC8vIHdoZXJlIGVhY2ggY29tcG9uZW50IGhhcyBiZWVuIHNjYWxlZCBhbmQgb2Zmc2V0IHRvIG1ha2UgaXQgc2lnbmVkLg0KLSAgICAvLyBUaGUgcmVzdWx0IGlzIHJlcGxpY2F0ZWQgaW50byBhbGwgZm91ciAoaW5jbHVkaW5nIGFscGhhKSBjaGFubmVscy4NCi0gICAgLy8gVGhpcyBpcyBhIHZhbGlkIENPTE9ST1Agb25seS4NCi0gICAgRDNEVE9QX0RPVFBST0RVQ1QzICAgICAgICAgID0gMjQsDQotDQotICAgIC8vIFRyaWFkaWMgb3BzDQotICAgIEQzRFRPUF9NVUxUSVBMWUFERCAgICAgICAgICA9IDI1LCAvLyBBcmcwICsgQXJnMSpBcmcyDQotICAgIEQzRFRPUF9MRVJQICAgICAgICAgICAgICAgICA9IDI2LCAvLyAoQXJnMCkqQXJnMSArICgxLUFyZzApKkFyZzINCi0NCi0gICAgRDNEVE9QX0ZPUkNFX0RXT1JEID0gMHg3ZmZmZmZmZiwNCi19IEQzRFRFWFRVUkVPUDsNCi0NCi0vKg0KLSAqIFZhbHVlcyBmb3IgQ09MT1JBUkcwLDEsMiwgQUxQSEFBUkcwLDEsMiwgYW5kIFJFU1VMVEFSRyB0ZXh0dXJlIGJsZW5kaW5nDQotICogb3BlcmF0aW9ucyBzZXQgaW4gdGV4dHVyZSBwcm9jZXNzaW5nIHN0YWdlIGNvbnRyb2xzIGluIEQzRFJFTkRFUlNUQVRFLg0KLSAqLw0KLSNkZWZpbmUgRDNEVEFfU0VMRUNUTUFTSyAgICAgICAgMHgwMDAwMDAwZiAgLy8gbWFzayBmb3IgYXJnIHNlbGVjdG9yDQotI2RlZmluZSBEM0RUQV9ESUZGVVNFICAgICAgICAgICAweDAwMDAwMDAwICAvLyBzZWxlY3QgZGlmZnVzZSBjb2xvciAocmVhZCBvbmx5KQ0KLSNkZWZpbmUgRDNEVEFfQ1VSUkVOVCAgICAgICAgICAgMHgwMDAwMDAwMSAgLy8gc2VsZWN0IHN0YWdlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIChyZWFkL3dyaXRlKQ0KLSNkZWZpbmUgRDNEVEFfVEVYVFVSRSAgICAgICAgICAgMHgwMDAwMDAwMiAgLy8gc2VsZWN0IHRleHR1cmUgY29sb3IgKHJlYWQgb25seSkNCi0jZGVmaW5lIEQzRFRBX1RGQUNUT1IgICAgICAgICAgIDB4MDAwMDAwMDMgIC8vIHNlbGVjdCBEM0RSU19URVhUVVJFRkFDVE9SIChyZWFkIG9ubHkpDQotI2RlZmluZSBEM0RUQV9TUEVDVUxBUiAgICAgICAgICAweDAwMDAwMDA0ICAvLyBzZWxlY3Qgc3BlY3VsYXIgY29sb3IgKHJlYWQgb25seSkNCi0jZGVmaW5lIEQzRFRBX1RFTVAgICAgICAgICAgICAgIDB4MDAwMDAwMDUgIC8vIHNlbGVjdCB0ZW1wb3JhcnkgcmVnaXN0ZXIgY29sb3IgKHJlYWQvd3JpdGUpDQotI2RlZmluZSBEM0RUQV9DT01QTEVNRU5UICAgICAgICAweDAwMDAwMDEwICAvLyB0YWtlIDEuMCAtIHggKHJlYWQgbW9kaWZpZXIpDQotI2RlZmluZSBEM0RUQV9BTFBIQVJFUExJQ0FURSAgICAweDAwMDAwMDIwICAvLyByZXBsaWNhdGUgYWxwaGEgdG8gY29sb3IgY29tcG9uZW50cyAocmVhZCBtb2RpZmllcikNCi0NCi0vLw0KLS8vIFZhbHVlcyBmb3IgRDNEVFNTXyoqKkZJTFRFUiB0ZXh0dXJlIHN0YWdlIHN0YXRlcw0KLS8vDQotdHlwZWRlZiBlbnVtIF9EM0RURVhUVVJFRklMVEVSVFlQRQ0KLXsNCi0gICAgRDNEVEVYRl9OT05FICAgICAgICAgICAgPSAwLCAgICAvLyBmaWx0ZXJpbmcgZGlzYWJsZWQgKHZhbGlkIGZvciBtaXAgZmlsdGVyIG9ubHkpDQotICAgIEQzRFRFWEZfUE9JTlQgICAgICAgICAgID0gMSwgICAgLy8gbmVhcmVzdA0KLSAgICBEM0RURVhGX0xJTkVBUiAgICAgICAgICA9IDIsICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uDQotICAgIEQzRFRFWEZfQU5JU09UUk9QSUMgICAgID0gMywgICAgLy8gYW5pc290cm9waWMNCi0gICAgRDNEVEVYRl9GTEFUQ1VCSUMgICAgICAgPSA0LCAgICAvLyBjdWJpYw0KLSAgICBEM0RURVhGX0dBVVNTSUFOQ1VCSUMgICA9IDUsICAgIC8vIGRpZmZlcmVudCBjdWJpYyBrZXJuZWwNCi0gICAgRDNEVEVYRl9GT1JDRV9EV09SRCAgICAgPSAweDdmZmZmZmZmLCAgIC8vIGZvcmNlIDMyLWJpdCBzaXplIGVudW0NCi19IEQzRFRFWFRVUkVGSUxURVJUWVBFOw0KLQ0KLS8qIEJpdHMgZm9yIEZsYWdzIGluIFByb2Nlc3NWZXJ0aWNlcyBjYWxsICovDQotDQotI2RlZmluZSBEM0RQVl9ET05PVENPUFlEQVRBICAgICAoMSA8PCAwKQ0KLQ0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIEZsZXhpYmxlIHZlcnRleCBmb3JtYXQgYml0cw0KLS8vDQotI2RlZmluZSBEM0RGVkZfUkVTRVJWRUQwICAgICAgICAweDAwMQ0KLSNkZWZpbmUgRDNERlZGX1BPU0lUSU9OX01BU0sgICAgMHgwMEUNCi0jZGVmaW5lIEQzREZWRl9YWVogICAgICAgICAgICAgIDB4MDAyDQotI2RlZmluZSBEM0RGVkZfWFlaUkhXICAgICAgICAgICAweDAwNA0KLSNkZWZpbmUgRDNERlZGX1hZWkIxICAgICAgICAgICAgMHgwMDYNCi0jZGVmaW5lIEQzREZWRl9YWVpCMiAgICAgICAgICAgIDB4MDA4DQotI2RlZmluZSBEM0RGVkZfWFlaQjMgICAgICAgICAgICAweDAwYQ0KLSNkZWZpbmUgRDNERlZGX1hZWkI0ICAgICAgICAgICAgMHgwMGMNCi0jZGVmaW5lIEQzREZWRl9YWVpCNSAgICAgICAgICAgIDB4MDBlDQotDQotI2RlZmluZSBEM0RGVkZfTk9STUFMICAgICAgICAgICAweDAxMA0KLSNkZWZpbmUgRDNERlZGX1BTSVpFICAgICAgICAgICAgMHgwMjANCi0jZGVmaW5lIEQzREZWRl9ESUZGVVNFICAgICAgICAgIDB4MDQwDQotI2RlZmluZSBEM0RGVkZfU1BFQ1VMQVIgICAgICAgICAweDA4MA0KLQ0KLSNkZWZpbmUgRDNERlZGX1RFWENPVU5UX01BU0sgICAgMHhmMDANCi0jZGVmaW5lIEQzREZWRl9URVhDT1VOVF9TSElGVCAgIDgNCi0jZGVmaW5lIEQzREZWRl9URVgwICAgICAgICAgICAgIDB4MDAwDQotI2RlZmluZSBEM0RGVkZfVEVYMSAgICAgICAgICAgICAweDEwMA0KLSNkZWZpbmUgRDNERlZGX1RFWDIgICAgICAgICAgICAgMHgyMDANCi0jZGVmaW5lIEQzREZWRl9URVgzICAgICAgICAgICAgIDB4MzAwDQotI2RlZmluZSBEM0RGVkZfVEVYNCAgICAgICAgICAgICAweDQwMA0KLSNkZWZpbmUgRDNERlZGX1RFWDUgICAgICAgICAgICAgMHg1MDANCi0jZGVmaW5lIEQzREZWRl9URVg2ICAgICAgICAgICAgIDB4NjAwDQotI2RlZmluZSBEM0RGVkZfVEVYNyAgICAgICAgICAgICAweDcwMA0KLSNkZWZpbmUgRDNERlZGX1RFWDggICAgICAgICAgICAgMHg4MDANCi0NCi0jZGVmaW5lIEQzREZWRl9MQVNUQkVUQV9VQllURTQgIDB4MTAwMA0KLQ0KLSNkZWZpbmUgRDNERlZGX1JFU0VSVkVEMiAgICAgICAgMHhFMDAwICAvLyA0IHJlc2VydmVkIGJpdHMNCi0NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIFZlcnRleCBTaGFkZXJzDQotLy8NCi0NCi0vKg0KLQ0KLVZlcnRleCBTaGFkZXIgRGVjbGFyYXRpb24NCi0NCi1UaGUgZGVjbGFyYXRpb24gcG9ydGlvbiBvZiBhIHZlcnRleCBzaGFkZXIgZGVmaW5lcyB0aGUgc3RhdGljIGV4dGVybmFsDQotaW50ZXJmYWNlIG9mIHRoZSBzaGFkZXIuICBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIGRlY2xhcmF0aW9uIGluY2x1ZGVzOg0KLQ0KLS0gQXNzaWdubWVudHMgb2YgdmVydGV4IHNoYWRlciBpbnB1dCByZWdpc3RlcnMgdG8gZGF0YSBzdHJlYW1zLiAgVGhlc2UNCi1hc3NpZ25tZW50cyBiaW5kIGEgc3BlY2lmaWMgdmVydGV4IHJlZ2lzdGVyIHRvIGEgc2luZ2xlIGNvbXBvbmVudCB3aXRoaW4gYQ0KLXZlcnRleCBzdHJlYW0uICBBIHZlcnRleCBzdHJlYW0gZWxlbWVudCBpcyBpZGVudGlmaWVkIGJ5IGEgYnl0ZSBvZmZzZXQNCi13aXRoaW4gdGhlIHN0cmVhbSBhbmQgYSB0eXBlLiAgVGhlIHR5cGUgc3BlY2lmaWVzIHRoZSBhcml0aG1ldGljIGRhdGEgdHlwZQ0KLXBsdXMgdGhlIGRpbWVuc2lvbmFsaXR5ICgxLCAyLCAzLCBvciA0IHZhbHVlcykuICBTdHJlYW0gZGF0YSB3aGljaCBpcw0KLWxlc3MgdGhhbiA0IHZhbHVlcyBhcmUgYWx3YXlzIGV4cGFuZGVkIG91dCB0byA0IHZhbHVlcyB3aXRoIHplcm8gb3IgbW9yZQ0KLTAuRiB2YWx1ZXMgYW5kIG9uZSAxLkYgdmFsdWUuDQotDQotLSBBc3NpZ25tZW50IG9mIHZlcnRleCBzaGFkZXIgaW5wdXQgcmVnaXN0ZXJzIHRvIGltcGxpY2l0IGRhdGEgZnJvbSB0aGUNCi1wcmltaXRpdmUgdGVzc2VsbGF0b3IuICBUaGlzIGNvbnRyb2xzIHRoZSBsb2FkaW5nIG9mIHZlcnRleCBkYXRhIHdoaWNoIGlzDQotbm90IGxvYWRlZCBmcm9tIGEgc3RyZWFtLCBidXQgcmF0aGVyIGlzIGdlbmVyYXRlZCBkdXJpbmcgcHJpbWl0aXZlDQotdGVzc2VsbGF0aW9uIHByaW9yIHRvIHRoZSB2ZXJ0ZXggc2hhZGVyLg0KLQ0KLS0gTG9hZGluZyBkYXRhIGludG8gdGhlIGNvbnN0YW50IG1lbW9yeSBhdCB0aGUgdGltZSBhIHNoYWRlciBpcyBzZXQgYXMgdGhlDQotY3VycmVudCBzaGFkZXIuICBFYWNoIHRva2VuIHNwZWNpZmllcyB2YWx1ZXMgZm9yIG9uZSBvciBtb3JlIGNvbnRpZ3VvdXMgNA0KLURXT1JEIGNvbnN0YW50IHJlZ2lzdGVycy4gIFRoaXMgYWxsb3dzIHRoZSBzaGFkZXIgdG8gdXBkYXRlIGFuIGFyYml0cmFyeQ0KLXN1YnNldCBvZiB0aGUgY29uc3RhbnQgbWVtb3J5LCBvdmVyd3JpdGluZyB0aGUgZGV2aWNlIHN0YXRlICh3aGljaA0KLWNvbnRhaW5zIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgY29uc3RhbnQgbWVtb3J5KS4gIE5vdGUgdGhhdCB0aGVzZQ0KLXZhbHVlcyBjYW4gYmUgc3Vic2VxdWVudGx5IG92ZXJ3cml0dGVuIChiZXR3ZWVuIERyYXdQcmltaXRpdmUgY2FsbHMpDQotZHVyaW5nIHRoZSB0aW1lIGEgc2hhZGVyIGlzIGJvdW5kIHRvIGEgZGV2aWNlIHZpYSB0aGUNCi1TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCBtZXRob2QuDQotDQotDQotRGVjbGFyYXRpb24gYXJyYXlzIGFyZSBzaW5nbGUtZGltZW5zaW9uYWwgYXJyYXlzIG9mIERXT1JEcyBjb21wb3NlZCBvZg0KLW11bHRpcGxlIHRva2VucyBlYWNoIG9mIHdoaWNoIGlzIG9uZSBvciBtb3JlIERXT1JEcy4gIFRoZSBzaW5nbGUtRFdPUkQNCi10b2tlbiB2YWx1ZSAweEZGRkZGRkZGIGlzIGEgc3BlY2lhbCB0b2tlbiB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlDQotZGVjbGFyYXRpb24gYXJyYXkuICBUaGUgc2luZ2xlIERXT1JEIHRva2VuIHZhbHVlIDB4MDAwMDAwMDAgaXMgYSBOT1AgdG9rZW4NCi13aXRoIGlzIGlnbm9yZWQgZHVyaW5nIHRoZSBkZWNsYXJhdGlvbiBwYXJzaW5nLiAgTm90ZSB0aGF0IDB4MDAwMDAwMDAgaXMgYQ0KLXZhbGlkIHZhbHVlIGZvciBEV09SRHMgZm9sbG93aW5nIHRoZSBmaXJzdCBEV09SRCBmb3IgbXVsdGlwbGUgd29yZCB0b2tlbnMuDQotDQotWzMxOjI5XSBUb2tlblR5cGUNCi0gICAgMHgwIC0gTk9QIChyZXF1aXJlcyBhbGwgRFdPUkQgYml0cyB0byBiZSB6ZXJvKQ0KLSAgICAweDEgLSBzdHJlYW0gc2VsZWN0b3INCi0gICAgMHgyIC0gc3RyZWFtIGRhdGEgZGVmaW5pdGlvbiAobWFwIHRvIHZlcnRleCBpbnB1dCBtZW1vcnkpDQotICAgIDB4MyAtIHZlcnRleCBpbnB1dCBtZW1vcnkgZnJvbSB0ZXNzZWxsYXRvcg0KLSAgICAweDQgLSBjb25zdGFudCBtZW1vcnkgZnJvbSBzaGFkZXINCi0gICAgMHg1IC0gZXh0ZW5zaW9uDQotICAgIDB4NiAtIHJlc2VydmVkDQotICAgIDB4NyAtIGVuZC1vZi1hcnJheSAocmVxdWlyZXMgYWxsIERXT1JEIGJpdHMgdG8gYmUgMSkNCi0NCi1OT1AgVG9rZW4gKHNpbmdsZSBEV09SRCB0b2tlbikNCi0gICAgWzMxOjI5XSAweDANCi0gICAgWzI4OjAwXSAweDANCi0NCi1TdHJlYW0gU2VsZWN0b3IgKHNpbmdsZSBEV09SRCB0b2tlbikNCi0gICAgWzMxOjI5XSAweDENCi0gICAgWzI4XSAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgdGVzc2VsbGF0b3Igc3RyZWFtDQotICAgIFsyNzowNF0gMHgwDQotICAgIFswMzowMF0gc3RyZWFtIHNlbGVjdG9yICgwLi4xNSkNCi0NCi1TdHJlYW0gRGF0YSBEZWZpbml0aW9uIChzaW5nbGUgRFdPUkQgdG9rZW4pDQotICAgIFZlcnRleCBJbnB1dCBSZWdpc3RlciBMb2FkDQotICAgICAgWzMxOjI5XSAweDINCi0gICAgICBbMjhdICAgIDB4MA0KLSAgICAgIFsyNzoyMF0gMHgwDQotICAgICAgWzE5OjE2XSB0eXBlIChkaW1lbnNpb25hbGl0eSBhbmQgZGF0YSB0eXBlKQ0KLSAgICAgIFsxNTowNF0gMHgwDQotICAgICAgWzAzOjAwXSB2ZXJ0ZXggcmVnaXN0ZXIgYWRkcmVzcyAoMC4uMTUpDQotICAgIERhdGEgU2tpcCAobm8gcmVnaXN0ZXIgbG9hZCkNCi0gICAgICBbMzE6MjldIDB4Mg0KLSAgICAgIFsyOF0gICAgMHgxDQotICAgICAgWzI3OjIwXSAweDANCi0gICAgICBbMTk6MTZdIGNvdW50IG9mIERXT1JEUyB0byBza2lwIG92ZXIgKDAuLjE1KQ0KLSAgICAgIFsxNTowMF0gMHgwDQotICAgIFZlcnRleCBJbnB1dCBNZW1vcnkgZnJvbSBUZXNzZWxsYXRvciBEYXRhIChzaW5nbGUgRFdPUkQgdG9rZW4pDQotICAgICAgWzMxOjI5XSAweDMNCi0gICAgICBbMjhdICAgIGluZGljYXRlcyB3aGV0aGVyIGRhdGEgaXMgbm9ybWFscyBvciB1L3YNCi0gICAgICBbMjc6MjRdIDB4MA0KLSAgICAgIFsyMzoyMF0gdmVydGV4IHJlZ2lzdGVyIGFkZHJlc3MgKDAuLjE1KQ0KLSAgICAgIFsxOToxNl0gdHlwZSAoZGltZW5zaW9uYWxpdHkpDQotICAgICAgWzE1OjA0XSAweDANCi0gICAgICBbMDM6MDBdIHZlcnRleCByZWdpc3RlciBhZGRyZXNzICgwLi4xNSkNCi0NCi1Db25zdGFudCBNZW1vcnkgZnJvbSBTaGFkZXIgKG11bHRpcGxlIERXT1JEIHRva2VuKQ0KLSAgICBbMzE6MjldIDB4NA0KLSAgICBbMjg6MjVdIGNvdW50IG9mIDQqRFdPUkQgY29uc3RhbnRzIHRvIGxvYWQgKDAuLjE1KQ0KLSAgICBbMjQ6MDddIDB4MA0KLSAgICBbMDY6MDBdIGNvbnN0YW50IG1lbW9yeSBhZGRyZXNzICgwLi45NSkNCi0NCi1FeHRlbnNpb24gVG9rZW4gKHNpbmdsZSBvciBtdWx0aXBsZSBEV09SRCB0b2tlbikNCi0gICAgWzMxOjI5XSAweDUNCi0gICAgWzI4OjI0XSBjb3VudCBvZiBhZGRpdGlvbmFsIERXT1JEcyBpbiB0b2tlbiAoMC4uMzEpDQotICAgIFsyMzowMF0gZXh0ZW5zaW9uLXNwZWNpZmljIGluZm9ybWF0aW9uDQotDQotRW5kLW9mLWFycmF5IHRva2VuIChzaW5nbGUgRFdPUkQgdG9rZW4pDQotICAgIFszMToyOV0gMHg3DQotICAgIFsyODowMF0gMHgxZmZmZmZmZg0KLQ0KLVRoZSBzdHJlYW0gc2VsZWN0b3IgdG9rZW4gbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGNvbnRpZ3VvdXMgc2V0IG9mIHN0cmVhbSBkYXRhIGRlZmluaXRpb24gdG9rZW5zLiAgVGhpcyB0b2tlbiBzZXF1ZW5jZSBmdWxseSBkZWZpbmVzIHRoYXQgc3RyZWFtLCBpbmNsdWRpbmcgdGhlIHNldCBvZiBlbGVtZW50cyB3aXRoaW4gdGhlIHN0cmVhbSwgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBlbGVtZW50cyBhcHBlYXIsIHRoZSB0eXBlIG9mIGVhY2ggZWxlbWVudCwgYW5kIHRoZSB2ZXJ0ZXggcmVnaXN0ZXIgaW50byB3aGljaCB0byBsb2FkIGFuIGVsZW1lbnQuDQotU3RyZWFtcyBhcmUgYWxsb3dlZCB0byBpbmNsdWRlIGRhdGEgd2hpY2ggaXMgbm90IGxvYWRlZCBpbnRvIGEgdmVydGV4IHJlZ2lzdGVyLCB0aHVzIGFsbG93aW5nIGRhdGEgd2hpY2ggaXMgbm90IHVzZWQgZm9yIHRoaXMgc2hhZGVyIHRvIGV4aXN0IGluIHRoZSB2ZXJ0ZXggc3RyZWFtLiAgVGhpcyBza2lwcGVkIGRhdGEgaXMgZGVmaW5lZCBvbmx5IGJ5IGEgY291bnQgb2YgRFdPUkRzIHRvIHNraXAgb3Zlciwgc2luY2UgdGhlIHR5cGUgaW5mb3JtYXRpb24gaXMgaXJyZWxldmFudC4NCi1UaGUgdG9rZW4gc2VxdWVuY2U6DQotU3RyZWFtIFNlbGVjdDogc3RyZWFtPTANCi1TdHJlYW0gRGF0YSBEZWZpbml0aW9uIChMb2FkKTogdHlwZT1GTE9BVDM7IHJlZ2lzdGVyPTMNCi1TdHJlYW0gRGF0YSBEZWZpbml0aW9uIChMb2FkKTogdHlwZT1GTE9BVDM7IHJlZ2lzdGVyPTQNCi1TdHJlYW0gRGF0YSBEZWZpbml0aW9uIChTa2lwKTogY291bnQ9Mg0KLVN0cmVhbSBEYXRhIERlZmluaXRpb24gKExvYWQpOiB0eXBlPUZMT0FUMjsgcmVnaXN0ZXI9Nw0KLQ0KLWRlZmluZXMgc3RyZWFtIHplcm8gdG8gY29uc2lzdCBvZiA0IGVsZW1lbnRzLCAzIG9mIHdoaWNoIGFyZSBsb2FkZWQgaW50byByZWdpc3RlcnMgYW5kIHRoZSBmb3VydGggc2tpcHBlZCBvdmVyLiAgUmVnaXN0ZXIgMyBpcyBsb2FkZWQgd2l0aCB0aGUgZmlyc3QgdGhyZWUgRFdPUkRzIGluIGVhY2ggdmVydGV4IGludGVycHJldGVkIGFzIEZMT0FUIGRhdGEuICBSZWdpc3RlciA0IGlzIGxvYWRlZCB3aXRoIHRoZSA0dGgsIDV0aCwgYW5kIDZ0aCBEV09SRHMgaW50ZXJwcmV0ZWQgYXMgRkxPQVQgZGF0YS4gIFRoZSBuZXh0IHR3byBEV09SRHMgKDd0aCBhbmQgOHRoKSBhcmUgc2tpcHBlZCBvdmVyIGFuZCBub3QgbG9hZGVkIGludG8gYW55IHZlcnRleCBpbnB1dCByZWdpc3Rlci4gICBSZWdpc3RlciA3IGlzIGxvYWRlZCB3aXRoIHRoZSA5dGggYW5kIDEwdGggRFdPUkRTIGludGVycHJldGVkIGFzIEZMT0FUIGRhdGEuDQotUGxhY2luZyBvZiB0b2tlbnMgb3RoZXIgdGhhbiBOT1BzIGJldHdlZW4gdGhlIFN0cmVhbSBTZWxlY3RvciBhbmQgU3RyZWFtIERhdGEgRGVmaW5pdGlvbiB0b2tlbnMgaXMgZGlzYWxsb3dlZC4NCi0NCi0qLw0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEVlNEX1RPS0VOVFlQRQ0KLXsNCi0gICAgRDNEVlNEX1RPS0VOX05PUCAgICAgICAgPSAwLCAgICAvLyBOT1Agb3IgZXh0ZW5zaW9uDQotICAgIEQzRFZTRF9UT0tFTl9TVFJFQU0sICAgICAgICAgICAgLy8gc3RyZWFtIHNlbGVjdG9yDQotICAgIEQzRFZTRF9UT0tFTl9TVFJFQU1EQVRBLCAgICAgICAgLy8gc3RyZWFtIGRhdGEgZGVmaW5pdGlvbiAobWFwIHRvIHZlcnRleCBpbnB1dCBtZW1vcnkpDQotICAgIEQzRFZTRF9UT0tFTl9URVNTRUxMQVRPUiwgICAgICAgLy8gdmVydGV4IGlucHV0IG1lbW9yeSBmcm9tIHRlc3NlbGxhdG9yDQotICAgIEQzRFZTRF9UT0tFTl9DT05TVE1FTSwgICAgICAgICAgLy8gY29uc3RhbnQgbWVtb3J5IGZyb20gc2hhZGVyDQotICAgIEQzRFZTRF9UT0tFTl9FWFQsICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uDQotICAgIEQzRFZTRF9UT0tFTl9FTkQgPSA3LCAgICAgICAgICAgLy8gZW5kLW9mLWFycmF5IChyZXF1aXJlcyBhbGwgRFdPUkQgYml0cyB0byBiZSAxKQ0KLSAgICBEM0RWU0RfRk9SQ0VfRFdPUkQgPSAweDdmZmZmZmZmLC8vIGZvcmNlIDMyLWJpdCBzaXplIGVudW0NCi19IEQzRFZTRF9UT0tFTlRZUEU7DQotDQotI2RlZmluZSBEM0RWU0RfVE9LRU5UWVBFU0hJRlQgICAyOQ0KLSNkZWZpbmUgRDNEVlNEX1RPS0VOVFlQRU1BU0sgICAgKDcgPDwgRDNEVlNEX1RPS0VOVFlQRVNISUZUKQ0KLQ0KLSNkZWZpbmUgRDNEVlNEX1NUUkVBTU5VTUJFUlNISUZUIDANCi0jZGVmaW5lIEQzRFZTRF9TVFJFQU1OVU1CRVJNQVNLICgweEYgPDwgRDNEVlNEX1NUUkVBTU5VTUJFUlNISUZUKQ0KLQ0KLSNkZWZpbmUgRDNEVlNEX0RBVEFMT0FEVFlQRVNISUZUIDI4DQotI2RlZmluZSBEM0RWU0RfREFUQUxPQURUWVBFTUFTSyAoMHgxIDw8IEQzRFZTRF9EQVRBTE9BRFRZUEVTSElGVCkNCi0NCi0jZGVmaW5lIEQzRFZTRF9EQVRBVFlQRVNISUZUIDE2DQotI2RlZmluZSBEM0RWU0RfREFUQVRZUEVNQVNLICgweEYgPDwgRDNEVlNEX0RBVEFUWVBFU0hJRlQpDQotDQotI2RlZmluZSBEM0RWU0RfU0tJUENPVU5UU0hJRlQgMTYNCi0jZGVmaW5lIEQzRFZTRF9TS0lQQ09VTlRNQVNLICgweEYgPDwgRDNEVlNEX1NLSVBDT1VOVFNISUZUKQ0KLQ0KLSNkZWZpbmUgRDNEVlNEX1ZFUlRFWFJFR1NISUZUIDANCi0jZGVmaW5lIEQzRFZTRF9WRVJURVhSRUdNQVNLICgweDFGIDw8IEQzRFZTRF9WRVJURVhSRUdTSElGVCkNCi0NCi0jZGVmaW5lIEQzRFZTRF9WRVJURVhSRUdJTlNISUZUIDIwDQotI2RlZmluZSBEM0RWU0RfVkVSVEVYUkVHSU5NQVNLICgweEYgPDwgRDNEVlNEX1ZFUlRFWFJFR0lOU0hJRlQpDQotDQotI2RlZmluZSBEM0RWU0RfQ09OU1RDT1VOVFNISUZUIDI1DQotI2RlZmluZSBEM0RWU0RfQ09OU1RDT1VOVE1BU0sgKDB4RiA8PCBEM0RWU0RfQ09OU1RDT1VOVFNISUZUKQ0KLQ0KLSNkZWZpbmUgRDNEVlNEX0NPTlNUQUREUkVTU1NISUZUIDANCi0jZGVmaW5lIEQzRFZTRF9DT05TVEFERFJFU1NNQVNLICgweDdGIDw8IEQzRFZTRF9DT05TVEFERFJFU1NTSElGVCkNCi0NCi0jZGVmaW5lIEQzRFZTRF9DT05TVFJTU0hJRlQgMTYNCi0jZGVmaW5lIEQzRFZTRF9DT05TVFJTTUFTSyAoMHgxRkZGIDw8IEQzRFZTRF9DT05TVFJTU0hJRlQpDQotDQotI2RlZmluZSBEM0RWU0RfRVhUQ09VTlRTSElGVCAyNA0KLSNkZWZpbmUgRDNEVlNEX0VYVENPVU5UTUFTSyAoMHgxRiA8PCBEM0RWU0RfRVhUQ09VTlRTSElGVCkNCi0NCi0jZGVmaW5lIEQzRFZTRF9FWFRJTkZPU0hJRlQgMA0KLSNkZWZpbmUgRDNEVlNEX0VYVElORk9NQVNLICgweEZGRkZGRiA8PCBEM0RWU0RfRVhUSU5GT1NISUZUKQ0KLQ0KLSNkZWZpbmUgRDNEVlNEX01BS0VUT0tFTlRZUEUodG9rZW5UeXBlKSAoKHRva2VuVHlwZSA8PCBEM0RWU0RfVE9LRU5UWVBFU0hJRlQpICYgRDNEVlNEX1RPS0VOVFlQRU1BU0spDQotDQotLy8gbWFjcm9zIGZvciBnZW5lcmF0aW9uIG9mIENyZWF0ZVZlcnRleFNoYWRlciBEZWNsYXJhdGlvbiB0b2tlbiBhcnJheQ0KLQ0KLS8vIFNldCBjdXJyZW50IHN0cmVhbQ0KLS8vIF9TdHJlYW1OdW1iZXIgWzAuLihNYXhTdHJlYW1zLTEpXSBzdHJlYW0gdG8gZ2V0IGRhdGEgZnJvbQ0KLS8vDQotI2RlZmluZSBEM0RWU0RfU1RSRUFNKCBfU3RyZWFtTnVtYmVyICkgXA0KLSAgICAoRDNEVlNEX01BS0VUT0tFTlRZUEUoRDNEVlNEX1RPS0VOX1NUUkVBTSkgfCAoX1N0cmVhbU51bWJlcikpDQotDQotLy8gU2V0IHRlc3NlbGxhdG9yIHN0cmVhbQ0KLS8vDQotI2RlZmluZSBEM0RWU0RfU1RSRUFNVEVTU1NISUZUIDI4DQotI2RlZmluZSBEM0RWU0RfU1RSRUFNVEVTU01BU0sgKDEgPDwgRDNEVlNEX1NUUkVBTVRFU1NTSElGVCkNCi0jZGVmaW5lIEQzRFZTRF9TVFJFQU1fVEVTUyggKSBcDQotICAgIChEM0RWU0RfTUFLRVRPS0VOVFlQRShEM0RWU0RfVE9LRU5fU1RSRUFNKSB8IChEM0RWU0RfU1RSRUFNVEVTU01BU0spKQ0KLQ0KLS8vIGJpbmQgc2luZ2xlIHZlcnRleCByZWdpc3RlciB0byB2ZXJ0ZXggZWxlbWVudCBmcm9tIHZlcnRleCBzdHJlYW0NCi0vLw0KLS8vIF9WZXJ0ZXhSZWdpc3RlciBbMC4uMTVdIGFkZHJlc3Mgb2YgdGhlIHZlcnRleCByZWdpc3Rlcg0KLS8vIF9UeXBlIFtEM0RWU0RUXypdIGRpbWVuc2lvbmFsaXR5IGFuZCBhcml0aG1ldGljIGRhdGEgdHlwZQ0KLQ0KLSNkZWZpbmUgRDNEVlNEX1JFRyggX1ZlcnRleFJlZ2lzdGVyLCBfVHlwZSApIFwNCi0gICAgKEQzRFZTRF9NQUtFVE9LRU5UWVBFKEQzRFZTRF9UT0tFTl9TVFJFQU1EQVRBKSB8ICAgICAgICAgICAgXA0KLSAgICAgKChfVHlwZSkgPDwgRDNEVlNEX0RBVEFUWVBFU0hJRlQpIHwgKF9WZXJ0ZXhSZWdpc3RlcikpDQotDQotLy8gU2tpcCBfRFdPUkRDb3VudCBEV09SRHMgaW4gdmVydGV4DQotLy8NCi0jZGVmaW5lIEQzRFZTRF9TS0lQKCBfRFdPUkRDb3VudCApIFwNCi0gICAgKEQzRFZTRF9NQUtFVE9LRU5UWVBFKEQzRFZTRF9UT0tFTl9TVFJFQU1EQVRBKSB8IDB4MTAwMDAwMDAgfCBcDQotICAgICAoKF9EV09SRENvdW50KSA8PCBEM0RWU0RfU0tJUENPVU5UU0hJRlQpKQ0KLQ0KLS8vIGxvYWQgZGF0YSBpbnRvIHZlcnRleCBzaGFkZXIgY29uc3RhbnQgbWVtb3J5DQotLy8NCi0vLyBfQ29uc3RhbnRBZGRyZXNzIFswLi45NV0gLSBhZGRyZXNzIG9mIGNvbnN0YW50IGFycmF5IHRvIGJlZ2luIGZpbGxpbmcgZGF0YQ0KLS8vIF9Db3VudCBbMC4uMTVdIC0gbnVtYmVyIG9mIGNvbnN0YW50IHZlY3RvcnMgdG8gbG9hZCAoNCBEV09SRHMgZWFjaCkNCi0vLyBmb2xsb3dlZCBieSA0Kl9Db3VudCBEV09SRFMgb2YgZGF0YQ0KLS8vDQotI2RlZmluZSBEM0RWU0RfQ09OU1QoIF9Db25zdGFudEFkZHJlc3MsIF9Db3VudCApIFwNCi0gICAgKEQzRFZTRF9NQUtFVE9LRU5UWVBFKEQzRFZTRF9UT0tFTl9DT05TVE1FTSkgfCBcDQotICAgICAoKF9Db3VudCkgPDwgRDNEVlNEX0NPTlNUQ09VTlRTSElGVCkgfCAoX0NvbnN0YW50QWRkcmVzcykpDQotDQotLy8gZW5hYmxlIHRlc3NlbGxhdG9yIGdlbmVyYXRlZCBub3JtYWxzDQotLy8NCi0vLyBfVmVydGV4UmVnaXN0ZXJJbiAgWzAuLjE1XSBhZGRyZXNzIG9mIHZlcnRleCByZWdpc3RlciB3aG9zZSBpbnB1dCBzdHJlYW0NCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgaW4gbm9ybWFsIGNvbXB1dGF0aW9uDQotLy8gX1ZlcnRleFJlZ2lzdGVyT3V0IFswLi4xNV0gYWRkcmVzcyBvZiB2ZXJ0ZXggcmVnaXN0ZXIgdG8gb3V0cHV0IHRoZSBub3JtYWwgdG8NCi0vLw0KLSNkZWZpbmUgRDNEVlNEX1RFU1NOT1JNQUwoIF9WZXJ0ZXhSZWdpc3RlckluLCBfVmVydGV4UmVnaXN0ZXJPdXQgKSBcDQotICAgIChEM0RWU0RfTUFLRVRPS0VOVFlQRShEM0RWU0RfVE9LRU5fVEVTU0VMTEFUT1IpIHwgXA0KLSAgICAgKChfVmVydGV4UmVnaXN0ZXJJbikgPDwgRDNEVlNEX1ZFUlRFWFJFR0lOU0hJRlQpIHwgXA0KLSAgICAgKCgweDAyKSA8PCBEM0RWU0RfREFUQVRZUEVTSElGVCkgfCAoX1ZlcnRleFJlZ2lzdGVyT3V0KSkNCi0NCi0vLyBlbmFibGUgdGVzc2VsbGF0b3IgZ2VuZXJhdGVkIHN1cmZhY2UgcGFyYW1ldGVycw0KLS8vDQotLy8gX1ZlcnRleFJlZ2lzdGVyIFswLi4xNV0gYWRkcmVzcyBvZiB2ZXJ0ZXggcmVnaXN0ZXIgdG8gb3V0cHV0IHBhcmFtZXRlcnMNCi0vLw0KLSNkZWZpbmUgRDNEVlNEX1RFU1NVViggX1ZlcnRleFJlZ2lzdGVyICkgXA0KLSAgICAoRDNEVlNEX01BS0VUT0tFTlRZUEUoRDNEVlNEX1RPS0VOX1RFU1NFTExBVE9SKSB8IDB4MTAwMDAwMDAgfCBcDQotICAgICAoKDB4MDEpIDw8IEQzRFZTRF9EQVRBVFlQRVNISUZUKSB8IChfVmVydGV4UmVnaXN0ZXIpKQ0KLQ0KLS8vIEdlbmVyYXRlcyBFTkQgdG9rZW4NCi0vLw0KLSNkZWZpbmUgRDNEVlNEX0VORCgpIDB4RkZGRkZGRkYNCi0NCi0vLyBHZW5lcmF0ZXMgTk9QIHRva2VuDQotI2RlZmluZSBEM0RWU0RfTk9QKCkgMHgwMDAwMDAwMA0KLQ0KLS8vIGJpdCBkZWNsYXJhdGlvbnMgZm9yIF9UeXBlIGZpZWxkcw0KLSNkZWZpbmUgRDNEVlNEVF9GTE9BVDEgICAgICAweDAwICAgIC8vIDFEIGZsb2F0IGV4cGFuZGVkIHRvICh2YWx1ZSwgMC4sIDAuLCAxLikNCi0jZGVmaW5lIEQzRFZTRFRfRkxPQVQyICAgICAgMHgwMSAgICAvLyAyRCBmbG9hdCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCAwLiwgMS4pDQotI2RlZmluZSBEM0RWU0RUX0ZMT0FUMyAgICAgIDB4MDIgICAgLy8gM0QgZmxvYXQgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgdmFsdWUsIDEuKQ0KLSNkZWZpbmUgRDNEVlNEVF9GTE9BVDQgICAgICAweDAzICAgIC8vIDREIGZsb2F0DQotI2RlZmluZSBEM0RWU0RUX0QzRENPTE9SICAgIDB4MDQgICAgLy8gNEQgcGFja2VkIHVuc2lnbmVkIGJ5dGVzIG1hcHBlZCB0byAwLiB0byAxLiByYW5nZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElucHV0IGlzIGluIEQzRENPTE9SIGZvcm1hdCAoQVJHQikgZXhwYW5kZWQgdG8gKFIsIEcsIEIsIEEpDQotI2RlZmluZSBEM0RWU0RUX1VCWVRFNCAgICAgIDB4MDUgICAgLy8gNEQgdW5zaWduZWQgYnl0ZQ0KLSNkZWZpbmUgRDNEVlNEVF9TSE9SVDIgICAgICAweDA2ICAgIC8vIDJEIHNpZ25lZCBzaG9ydCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCAwLiwgMS4pDQotI2RlZmluZSBEM0RWU0RUX1NIT1JUNCAgICAgIDB4MDcgICAgLy8gNEQgc2lnbmVkIHNob3J0DQotDQotLy8gYXNzaWdubWVudHMgb2YgdmVydGV4IGlucHV0IHJlZ2lzdGVycyBmb3IgZml4ZWQgZnVuY3Rpb24gdmVydGV4IHNoYWRlcg0KLS8vDQotI2RlZmluZSBEM0RWU0RFX1BPU0lUSU9OICAgICAgICAwDQotI2RlZmluZSBEM0RWU0RFX0JMRU5EV0VJR0hUICAgICAxDQotI2RlZmluZSBEM0RWU0RFX0JMRU5ESU5ESUNFUyAgICAyDQotI2RlZmluZSBEM0RWU0RFX05PUk1BTCAgICAgICAgICAzDQotI2RlZmluZSBEM0RWU0RFX1BTSVpFICAgICAgICAgICA0DQotI2RlZmluZSBEM0RWU0RFX0RJRkZVU0UgICAgICAgICA1DQotI2RlZmluZSBEM0RWU0RFX1NQRUNVTEFSICAgICAgICA2DQotI2RlZmluZSBEM0RWU0RFX1RFWENPT1JEMCAgICAgICA3DQotI2RlZmluZSBEM0RWU0RFX1RFWENPT1JEMSAgICAgICA4DQotI2RlZmluZSBEM0RWU0RFX1RFWENPT1JEMiAgICAgICA5DQotI2RlZmluZSBEM0RWU0RFX1RFWENPT1JEMyAgICAgICAxMA0KLSNkZWZpbmUgRDNEVlNERV9URVhDT09SRDQgICAgICAgMTENCi0jZGVmaW5lIEQzRFZTREVfVEVYQ09PUkQ1ICAgICAgIDEyDQotI2RlZmluZSBEM0RWU0RFX1RFWENPT1JENiAgICAgICAxMw0KLSNkZWZpbmUgRDNEVlNERV9URVhDT09SRDcgICAgICAgMTQNCi0jZGVmaW5lIEQzRFZTREVfUE9TSVRJT04yICAgICAgIDE1DQotI2RlZmluZSBEM0RWU0RFX05PUk1BTDIgICAgICAgICAxNg0KLQ0KLS8vIE1heGltdW0gc3VwcG9ydGVkIG51bWJlciBvZiB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cw0KLSNkZWZpbmUgRDNERFBfTUFYVEVYQ09PUkQgICA4DQotDQotDQotLy8NCi0vLyBJbnN0cnVjdGlvbiBUb2tlbiBCaXQgRGVmaW5pdGlvbnMNCi0vLw0KLSNkZWZpbmUgRDNEU0lfT1BDT0RFX01BU0sgICAgICAgMHgwMDAwRkZGRg0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEU0hBREVSX0lOU1RSVUNUSU9OX09QQ09ERV9UWVBFDQotew0KLSAgICBEM0RTSU9fTk9QICAgICAgICAgID0gMCwgICAgLy8gUFMvVlMNCi0gICAgRDNEU0lPX01PViAgICAgICAgICAsICAgICAgIC8vIFBTL1ZTDQotICAgIEQzRFNJT19BREQgICAgICAgICAgLCAgICAgICAvLyBQUy9WUw0KLSAgICBEM0RTSU9fU1VCICAgICAgICAgICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX01BRCAgICAgICAgICAsICAgICAgIC8vIFBTL1ZTDQotICAgIEQzRFNJT19NVUwgICAgICAgICAgLCAgICAgICAvLyBQUy9WUw0KLSAgICBEM0RTSU9fUkNQICAgICAgICAgICwgICAgICAgLy8gVlMNCi0gICAgRDNEU0lPX1JTUSAgICAgICAgICAsICAgICAgIC8vIFZTDQotICAgIEQzRFNJT19EUDMgICAgICAgICAgLCAgICAgICAvLyBQUy9WUw0KLSAgICBEM0RTSU9fRFA0ICAgICAgICAgICwgICAgICAgLy8gUFMvVlMNCi0gICAgRDNEU0lPX01JTiAgICAgICAgICAsICAgICAgIC8vIFZTDQotICAgIEQzRFNJT19NQVggICAgICAgICAgLCAgICAgICAvLyBWUw0KLSAgICBEM0RTSU9fU0xUICAgICAgICAgICwgICAgICAgLy8gVlMNCi0gICAgRDNEU0lPX1NHRSAgICAgICAgICAsICAgICAgIC8vIFZTDQotICAgIEQzRFNJT19FWFAgICAgICAgICAgLCAgICAgICAvLyBWUw0KLSAgICBEM0RTSU9fTE9HICAgICAgICAgICwgICAgICAgLy8gVlMNCi0gICAgRDNEU0lPX0xJVCAgICAgICAgICAsICAgICAgIC8vIFZTDQotICAgIEQzRFNJT19EU1QgICAgICAgICAgLCAgICAgICAvLyBWUw0KLSAgICBEM0RTSU9fTFJQICAgICAgICAgICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX0ZSQyAgICAgICAgICAsICAgICAgIC8vIFZTDQotICAgIEQzRFNJT19NNHg0ICAgICAgICAgLCAgICAgICAvLyBWUw0KLSAgICBEM0RTSU9fTTR4MyAgICAgICAgICwgICAgICAgLy8gVlMNCi0gICAgRDNEU0lPX00zeDQgICAgICAgICAsICAgICAgIC8vIFZTDQotICAgIEQzRFNJT19NM3gzICAgICAgICAgLCAgICAgICAvLyBWUw0KLSAgICBEM0RTSU9fTTN4MiAgICAgICAgICwgICAgICAgLy8gVlMNCi0NCi0gICAgRDNEU0lPX1RFWENPT1JEICAgICA9IDY0LCAgIC8vIFBTDQotICAgIEQzRFNJT19URVhLSUxMICAgICAgLCAgICAgICAvLyBQUw0KLSAgICBEM0RTSU9fVEVYICAgICAgICAgICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX1RFWEJFTSAgICAgICAsICAgICAgIC8vIFBTDQotICAgIEQzRFNJT19URVhCRU1MICAgICAgLCAgICAgICAvLyBQUw0KLSAgICBEM0RTSU9fVEVYUkVHMkFSICAgICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX1RFWFJFRzJHQiAgICAsICAgICAgIC8vIFBTDQotICAgIEQzRFNJT19URVhNM3gyUEFEICAgLCAgICAgICAvLyBQUw0KLSAgICBEM0RTSU9fVEVYTTN4MlRFWCAgICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX1RFWE0zeDNQQUQgICAsICAgICAgIC8vIFBTDQotICAgIEQzRFNJT19URVhNM3gzVEVYICAgLCAgICAgICAvLyBQUw0KLSAgICBEM0RTSU9fVEVYTTN4M0RJRkYgICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX1RFWE0zeDNTUEVDICAsICAgICAgIC8vIFBTDQotICAgIEQzRFNJT19URVhNM3gzVlNQRUMgLCAgICAgICAvLyBQUw0KLSAgICBEM0RTSU9fRVhQUCAgICAgICAgICwgICAgICAgLy8gVlMNCi0gICAgRDNEU0lPX0xPR1AgICAgICAgICAsICAgICAgIC8vIFZTDQotICAgIEQzRFNJT19DTkQgICAgICAgICAgLCAgICAgICAvLyBQUw0KLSAgICBEM0RTSU9fREVGICAgICAgICAgICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX1RFWFJFRzJSR0IgICAsICAgICAgIC8vIFBTDQotICAgIEQzRFNJT19URVhEUDNURVggICAgLCAgICAgICAvLyBQUw0KLSAgICBEM0RTSU9fVEVYTTN4MkRFUFRIICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX1RFWERQMyAgICAgICAsICAgICAgIC8vIFBTDQotICAgIEQzRFNJT19URVhNM3gzICAgICAgLCAgICAgICAvLyBQUw0KLSAgICBEM0RTSU9fVEVYREVQVEggICAgICwgICAgICAgLy8gUFMNCi0gICAgRDNEU0lPX0NNUCAgICAgICAgICAsICAgICAgIC8vIFBTDQotICAgIEQzRFNJT19CRU0gICAgICAgICAgLCAgICAgICAvLyBQUw0KLQ0KLSAgICBEM0RTSU9fUEhBU0UgICAgICAgID0gMHhGRkZELA0KLSAgICBEM0RTSU9fQ09NTUVOVCAgICAgID0gMHhGRkZFLA0KLSAgICBEM0RTSU9fRU5EICAgICAgICAgID0gMHhGRkZGLA0KLQ0KLSAgICBEM0RTSU9fRk9SQ0VfRFdPUkQgID0gMHg3ZmZmZmZmZiwgICAvLyBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtDQotfSBEM0RTSEFERVJfSU5TVFJVQ1RJT05fT1BDT0RFX1RZUEU7DQotDQotLy8NCi0vLyBDby1Jc3N1ZSBJbnN0cnVjdGlvbiBNb2RpZmllciAtIGlmIHNldCB0aGVuIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgdG8gYmUNCi0vLyBpc3N1ZWQgaW4gcGFyYWxsZWwgd2l0aCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24ocykgZm9yIHdoaWNoIHRoaXMgYml0DQotLy8gaXMgbm90IHNldC4NCi0vLw0KLSNkZWZpbmUgRDNEU0lfQ09JU1NVRSAgICAgICAgICAgMHg0MDAwMDAwMA0KLQ0KLS8vDQotLy8gUGFyYW1ldGVyIFRva2VuIEJpdCBEZWZpbml0aW9ucw0KLS8vDQotI2RlZmluZSBEM0RTUF9SRUdOVU1fTUFTSyAgICAgICAweDAwMDAxRkZGDQotDQotLy8gZGVzdGluYXRpb24gcGFyYW1ldGVyIHdyaXRlIG1hc2sNCi0jZGVmaW5lIEQzRFNQX1dSSVRFTUFTS18wICAgICAgIDB4MDAwMTAwMDAgIC8vIENvbXBvbmVudCAwIChYO1JlZCkNCi0jZGVmaW5lIEQzRFNQX1dSSVRFTUFTS18xICAgICAgIDB4MDAwMjAwMDAgIC8vIENvbXBvbmVudCAxIChZO0dyZWVuKQ0KLSNkZWZpbmUgRDNEU1BfV1JJVEVNQVNLXzIgICAgICAgMHgwMDA0MDAwMCAgLy8gQ29tcG9uZW50IDIgKFo7Qmx1ZSkNCi0jZGVmaW5lIEQzRFNQX1dSSVRFTUFTS18zICAgICAgIDB4MDAwODAwMDAgIC8vIENvbXBvbmVudCAzIChXO0FscGhhKQ0KLSNkZWZpbmUgRDNEU1BfV1JJVEVNQVNLX0FMTCAgICAgMHgwMDBGMDAwMCAgLy8gQWxsIENvbXBvbmVudHMNCi0NCi0vLyBkZXN0aW5hdGlvbiBwYXJhbWV0ZXIgbW9kaWZpZXJzDQotI2RlZmluZSBEM0RTUF9EU1RNT0RfU0hJRlQgICAgICAyMA0KLSNkZWZpbmUgRDNEU1BfRFNUTU9EX01BU0sgICAgICAgMHgwMEYwMDAwMA0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEU0hBREVSX1BBUkFNX0RTVE1PRF9UWVBFDQotew0KLSAgICBEM0RTUERNX05PTkUgICAgPSAwPDxEM0RTUF9EU1RNT0RfU0hJRlQsIC8vIG5vcA0KLSAgICBEM0RTUERNX1NBVFVSQVRFPSAxPDxEM0RTUF9EU1RNT0RfU0hJRlQsIC8vIGNsYW1wIHRvIDAuIHRvIDEuIHJhbmdlDQotICAgIEQzRFNQRE1fRk9SQ0VfRFdPUkQgID0gMHg3ZmZmZmZmZiwgICAgICAvLyBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtDQotfSBEM0RTSEFERVJfUEFSQU1fRFNUTU9EX1RZUEU7DQotDQotLy8gZGVzdGluYXRpb24gcGFyYW1ldGVyIA0KLSNkZWZpbmUgRDNEU1BfRFNUU0hJRlRfU0hJRlQgICAgMjQNCi0jZGVmaW5lIEQzRFNQX0RTVFNISUZUX01BU0sgICAgIDB4MEYwMDAwMDANCi0NCi0vLyBkZXN0aW5hdGlvbi9zb3VyY2UgcGFyYW1ldGVyIHJlZ2lzdGVyIHR5cGUNCi0jZGVmaW5lIEQzRFNQX1JFR1RZUEVfU0hJRlQgICAgIDI4DQotI2RlZmluZSBEM0RTUF9SRUdUWVBFX01BU0sgICAgICAweDcwMDAwMDAwDQotDQotdHlwZWRlZiBlbnVtIF9EM0RTSEFERVJfUEFSQU1fUkVHSVNURVJfVFlQRQ0KLXsNCi0gICAgRDNEU1BSX1RFTVAgICAgID0gMDw8RDNEU1BfUkVHVFlQRV9TSElGVCwgLy8gVGVtcG9yYXJ5IFJlZ2lzdGVyIEZpbGUNCi0gICAgRDNEU1BSX0lOUFVUICAgID0gMTw8RDNEU1BfUkVHVFlQRV9TSElGVCwgLy8gSW5wdXQgUmVnaXN0ZXIgRmlsZQ0KLSAgICBEM0RTUFJfQ09OU1QgICAgPSAyPDxEM0RTUF9SRUdUWVBFX1NISUZULCAvLyBDb25zdGFudCBSZWdpc3RlciBGaWxlDQotICAgIEQzRFNQUl9BRERSICAgICA9IDM8PEQzRFNQX1JFR1RZUEVfU0hJRlQsIC8vIEFkZHJlc3MgUmVnaXN0ZXIgKFZTKQ0KLSAgICBEM0RTUFJfVEVYVFVSRSAgPSAzPDxEM0RTUF9SRUdUWVBFX1NISUZULCAvLyBUZXh0dXJlIFJlZ2lzdGVyIEZpbGUgKFBTKQ0KLSAgICBEM0RTUFJfUkFTVE9VVCAgPSA0PDxEM0RTUF9SRUdUWVBFX1NISUZULCAvLyBSYXN0ZXJpemVyIFJlZ2lzdGVyIEZpbGUNCi0gICAgRDNEU1BSX0FUVFJPVVQgID0gNTw8RDNEU1BfUkVHVFlQRV9TSElGVCwgLy8gQXR0cmlidXRlIE91dHB1dCBSZWdpc3RlciBGaWxlDQotICAgIEQzRFNQUl9URVhDUkRPVVQ9IDY8PEQzRFNQX1JFR1RZUEVfU0hJRlQsIC8vIFRleHR1cmUgQ29vcmRpbmF0ZSBPdXRwdXQgUmVnaXN0ZXIgRmlsZQ0KLSAgICBEM0RTUFJfRk9SQ0VfRFdPUkQgID0gMHg3ZmZmZmZmZiwgICAgICAgICAvLyBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtDQotfSBEM0RTSEFERVJfUEFSQU1fUkVHSVNURVJfVFlQRTsNCi0NCi0vLyBSZWdpc3RlciBvZmZzZXRzIGluIHRoZSBSYXN0ZXJpemVyIFJlZ2lzdGVyIEZpbGUNCi0vLw0KLXR5cGVkZWYgZW51bSBfRDNEVlNfUkFTVE9VVF9PRkZTRVRTDQotew0KLSAgICBEM0RTUk9fUE9TSVRJT04gPSAwLA0KLSAgICBEM0RTUk9fRk9HLA0KLSAgICBEM0RTUk9fUE9JTlRfU0laRSwNCi0gICAgRDNEU1JPX0ZPUkNFX0RXT1JEICA9IDB4N2ZmZmZmZmYsICAgICAgICAgLy8gZm9yY2UgMzItYml0IHNpemUgZW51bQ0KLX0gRDNEVlNfUkFTVE9VVF9PRkZTRVRTOw0KLQ0KLS8vIFNvdXJjZSBvcGVyYW5kIGFkZHJlc3NpbmcgbW9kZXMNCi0NCi0jZGVmaW5lIEQzRFZTX0FERFJFU1NNT0RFX1NISUZUIDEzDQotI2RlZmluZSBEM0RWU19BRERSRVNTTU9ERV9NQVNLICAoMSA8PCBEM0RWU19BRERSRVNTTU9ERV9TSElGVCkNCi0NCi10eXBlZGVmIGVudW0gX0QzRFZTX0FERFJFU1NNT0RFX1RZUEUNCi17DQotICAgIEQzRFZTX0FERFJNT0RFX0FCU09MVVRFICA9ICgwIDw8IEQzRFZTX0FERFJFU1NNT0RFX1NISUZUKSwNCi0gICAgRDNEVlNfQUREUk1PREVfUkVMQVRJVkUgID0gKDEgPDwgRDNEVlNfQUREUkVTU01PREVfU0hJRlQpLCAgIC8vIFJlbGF0aXZlIHRvIHJlZ2lzdGVyIEEwDQotICAgIEQzRFZTX0FERFJNT0RFX0ZPUkNFX0RXT1JEID0gMHg3ZmZmZmZmZiwgLy8gZm9yY2UgMzItYml0IHNpemUgZW51bQ0KLX0gRDNEVlNfQUREUkVTU01PREVfVFlQRTsNCi0NCi0vLyBTb3VyY2Ugb3BlcmFuZCBzd2l6emxlIGRlZmluaXRpb25zDQotLy8NCi0jZGVmaW5lIEQzRFZTX1NXSVpaTEVfU0hJRlQgICAgIDE2DQotI2RlZmluZSBEM0RWU19TV0laWkxFX01BU0sgICAgICAweDAwRkYwMDAwDQotDQotLy8gVGhlIGZvbGxvd2luZyBiaXRzIGRlZmluZSB3aGVyZSB0byB0YWtlIGNvbXBvbmVudCBYIGZyb206DQotDQotI2RlZmluZSBEM0RWU19YX1ggICAgICAgKDAgPDwgRDNEVlNfU1dJWlpMRV9TSElGVCkNCi0jZGVmaW5lIEQzRFZTX1hfWSAgICAgICAoMSA8PCBEM0RWU19TV0laWkxFX1NISUZUKQ0KLSNkZWZpbmUgRDNEVlNfWF9aICAgICAgICgyIDw8IEQzRFZTX1NXSVpaTEVfU0hJRlQpDQotI2RlZmluZSBEM0RWU19YX1cgICAgICAgKDMgPDwgRDNEVlNfU1dJWlpMRV9TSElGVCkNCi0NCi0vLyBUaGUgZm9sbG93aW5nIGJpdHMgZGVmaW5lIHdoZXJlIHRvIHRha2UgY29tcG9uZW50IFkgZnJvbToNCi0NCi0jZGVmaW5lIEQzRFZTX1lfWCAgICAgICAoMCA8PCAoRDNEVlNfU1dJWlpMRV9TSElGVCArIDIpKQ0KLSNkZWZpbmUgRDNEVlNfWV9ZICAgICAgICgxIDw8IChEM0RWU19TV0laWkxFX1NISUZUICsgMikpDQotI2RlZmluZSBEM0RWU19ZX1ogICAgICAgKDIgPDwgKEQzRFZTX1NXSVpaTEVfU0hJRlQgKyAyKSkNCi0jZGVmaW5lIEQzRFZTX1lfVyAgICAgICAoMyA8PCAoRDNEVlNfU1dJWlpMRV9TSElGVCArIDIpKQ0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgYml0cyBkZWZpbmUgd2hlcmUgdG8gdGFrZSBjb21wb25lbnQgWiBmcm9tOg0KLQ0KLSNkZWZpbmUgRDNEVlNfWl9YICAgICAgICgwIDw8IChEM0RWU19TV0laWkxFX1NISUZUICsgNCkpDQotI2RlZmluZSBEM0RWU19aX1kgICAgICAgKDEgPDwgKEQzRFZTX1NXSVpaTEVfU0hJRlQgKyA0KSkNCi0jZGVmaW5lIEQzRFZTX1pfWiAgICAgICAoMiA8PCAoRDNEVlNfU1dJWlpMRV9TSElGVCArIDQpKQ0KLSNkZWZpbmUgRDNEVlNfWl9XICAgICAgICgzIDw8IChEM0RWU19TV0laWkxFX1NISUZUICsgNCkpDQotDQotLy8gVGhlIGZvbGxvd2luZyBiaXRzIGRlZmluZSB3aGVyZSB0byB0YWtlIGNvbXBvbmVudCBXIGZyb206DQotDQotI2RlZmluZSBEM0RWU19XX1ggICAgICAgKDAgPDwgKEQzRFZTX1NXSVpaTEVfU0hJRlQgKyA2KSkNCi0jZGVmaW5lIEQzRFZTX1dfWSAgICAgICAoMSA8PCAoRDNEVlNfU1dJWlpMRV9TSElGVCArIDYpKQ0KLSNkZWZpbmUgRDNEVlNfV19aICAgICAgICgyIDw8IChEM0RWU19TV0laWkxFX1NISUZUICsgNikpDQotI2RlZmluZSBEM0RWU19XX1cgICAgICAgKDMgPDwgKEQzRFZTX1NXSVpaTEVfU0hJRlQgKyA2KSkNCi0NCi0vLyBWYWx1ZSB3aGVuIHRoZXJlIGlzIG5vIHN3aXp6bGUgKFggaXMgdGFrZW4gZnJvbSBYLCBZIGlzIHRha2VuIGZyb20gWSwNCi0vLyBaIGlzIHRha2VuIGZyb20gWiwgVyBpcyB0YWtlbiBmcm9tIFcNCi0vLw0KLSNkZWZpbmUgRDNEVlNfTk9TV0laWkxFIChEM0RWU19YX1ggfCBEM0RWU19ZX1kgfCBEM0RWU19aX1ogfCBEM0RWU19XX1cpDQotDQotLy8gc291cmNlIHBhcmFtZXRlciBzd2l6emxlDQotI2RlZmluZSBEM0RTUF9TV0laWkxFX1NISUZUICAgICAxNg0KLSNkZWZpbmUgRDNEU1BfU1dJWlpMRV9NQVNLICAgICAgMHgwMEZGMDAwMA0KLQ0KLSNkZWZpbmUgRDNEU1BfTk9TV0laWkxFIFwNCi0gICAgKCAoMCA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDApKSB8IFwNCi0gICAgICAoMSA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDIpKSB8IFwNCi0gICAgICAoMiA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDQpKSB8IFwNCi0gICAgICAoMyA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDYpKSApDQotDQotLy8gcGl4ZWwtc2hhZGVyIHN3aXp6bGUgb3BzDQotI2RlZmluZSBEM0RTUF9SRVBMSUNBVEVSRUQgXA0KLSAgICAoICgwIDw8IChEM0RTUF9TV0laWkxFX1NISUZUICsgMCkpIHwgXA0KLSAgICAgICgwIDw8IChEM0RTUF9TV0laWkxFX1NISUZUICsgMikpIHwgXA0KLSAgICAgICgwIDw8IChEM0RTUF9TV0laWkxFX1NISUZUICsgNCkpIHwgXA0KLSAgICAgICgwIDw8IChEM0RTUF9TV0laWkxFX1NISUZUICsgNikpICkNCi0NCi0jZGVmaW5lIEQzRFNQX1JFUExJQ0FURUdSRUVOIFwNCi0gICAgKCAoMSA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDApKSB8IFwNCi0gICAgICAoMSA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDIpKSB8IFwNCi0gICAgICAoMSA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDQpKSB8IFwNCi0gICAgICAoMSA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDYpKSApDQotDQotI2RlZmluZSBEM0RTUF9SRVBMSUNBVEVCTFVFIFwNCi0gICAgKCAoMiA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDApKSB8IFwNCi0gICAgICAoMiA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDIpKSB8IFwNCi0gICAgICAoMiA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDQpKSB8IFwNCi0gICAgICAoMiA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDYpKSApDQotDQotI2RlZmluZSBEM0RTUF9SRVBMSUNBVEVBTFBIQSBcDQotICAgICggKDMgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyAwKSkgfCBcDQotICAgICAgKDMgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyAyKSkgfCBcDQotICAgICAgKDMgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyA0KSkgfCBcDQotICAgICAgKDMgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyA2KSkgKQ0KLQ0KLS8vIHNvdXJjZSBwYXJhbWV0ZXIgbW9kaWZpZXJzDQotI2RlZmluZSBEM0RTUF9TUkNNT0RfU0hJRlQgICAgICAyNA0KLSNkZWZpbmUgRDNEU1BfU1JDTU9EX01BU0sgICAgICAgMHgwRjAwMDAwMA0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEU0hBREVSX1BBUkFNX1NSQ01PRF9UWVBFDQotew0KLSAgICBEM0RTUFNNX05PTkUgICAgPSAwPDxEM0RTUF9TUkNNT0RfU0hJRlQsIC8vIG5vcA0KLSAgICBEM0RTUFNNX05FRyAgICAgPSAxPDxEM0RTUF9TUkNNT0RfU0hJRlQsIC8vIG5lZ2F0ZQ0KLSAgICBEM0RTUFNNX0JJQVMgICAgPSAyPDxEM0RTUF9TUkNNT0RfU0hJRlQsIC8vIGJpYXMNCi0gICAgRDNEU1BTTV9CSUFTTkVHID0gMzw8RDNEU1BfU1JDTU9EX1NISUZULCAvLyBiaWFzIGFuZCBuZWdhdGUNCi0gICAgRDNEU1BTTV9TSUdOICAgID0gNDw8RDNEU1BfU1JDTU9EX1NISUZULCAvLyBzaWduDQotICAgIEQzRFNQU01fU0lHTk5FRyA9IDU8PEQzRFNQX1NSQ01PRF9TSElGVCwgLy8gc2lnbiBhbmQgbmVnYXRlDQotICAgIEQzRFNQU01fQ09NUCAgICA9IDY8PEQzRFNQX1NSQ01PRF9TSElGVCwgLy8gY29tcGxlbWVudA0KLSAgICBEM0RTUFNNX1gyICAgICAgPSA3PDxEM0RTUF9TUkNNT0RfU0hJRlQsIC8vICoyDQotICAgIEQzRFNQU01fWDJORUcgICA9IDg8PEQzRFNQX1NSQ01PRF9TSElGVCwgLy8gKjIgYW5kIG5lZ2F0ZQ0KLSAgICBEM0RTUFNNX0RaICAgICAgPSA5PDxEM0RTUF9TUkNNT0RfU0hJRlQsIC8vIGRpdmlkZSB0aHJvdWdoIGJ5IHogY29tcG9uZW50IA0KLSAgICBEM0RTUFNNX0RXICAgICAgPSAxMDw8RDNEU1BfU1JDTU9EX1NISUZULCAvLyBkaXZpZGUgdGhyb3VnaCBieSB3IGNvbXBvbmVudA0KLSAgICBEM0RTUFNNX0ZPUkNFX0RXT1JEID0gMHg3ZmZmZmZmZiwgICAgICAgIC8vIGZvcmNlIDMyLWJpdCBzaXplIGVudW0NCi19IEQzRFNIQURFUl9QQVJBTV9TUkNNT0RfVFlQRTsNCi0NCi0vLyBwaXhlbCBzaGFkZXIgdmVyc2lvbiB0b2tlbg0KLSNkZWZpbmUgRDNEUFNfVkVSU0lPTihfTWFqb3IsX01pbm9yKSAoMHhGRkZGMDAwMHwoKF9NYWpvcik8PDgpfChfTWlub3IpKQ0KLQ0KLS8vIHZlcnRleCBzaGFkZXIgdmVyc2lvbiB0b2tlbg0KLSNkZWZpbmUgRDNEVlNfVkVSU0lPTihfTWFqb3IsX01pbm9yKSAoMHhGRkZFMDAwMHwoKF9NYWpvcik8PDgpfChfTWlub3IpKQ0KLQ0KLS8vIGV4dHJhY3QgbWFqb3IvbWlub3IgZnJvbSB2ZXJzaW9uIGNhcA0KLSNkZWZpbmUgRDNEU0hBREVSX1ZFUlNJT05fTUFKT1IoX1ZlcnNpb24pICgoKF9WZXJzaW9uKT4+OCkmMHhGRikNCi0jZGVmaW5lIEQzRFNIQURFUl9WRVJTSU9OX01JTk9SKF9WZXJzaW9uKSAoKChfVmVyc2lvbik+PjApJjB4RkYpDQotDQotLy8gZGVzdGluYXRpb24vc291cmNlIHBhcmFtZXRlciByZWdpc3RlciB0eXBlDQotI2RlZmluZSBEM0RTSV9DT01NRU5UU0laRV9TSElGVCAgICAgMTYNCi0jZGVmaW5lIEQzRFNJX0NPTU1FTlRTSVpFX01BU0sgICAgICAweDdGRkYwMDAwDQotI2RlZmluZSBEM0RTSEFERVJfQ09NTUVOVChfRFdvcmRTaXplKSBcDQotICAgICgoKChfRFdvcmRTaXplKTw8RDNEU0lfQ09NTUVOVFNJWkVfU0hJRlQpJkQzRFNJX0NPTU1FTlRTSVpFX01BU0spfEQzRFNJT19DT01NRU5UKQ0KLQ0KLS8vIHBpeGVsL3ZlcnRleCBzaGFkZXIgZW5kIHRva2VuDQotI2RlZmluZSBEM0RQU19FTkQoKSAgMHgwMDAwRkZGRg0KLSNkZWZpbmUgRDNEVlNfRU5EKCkgIDB4MDAwMEZGRkYNCi0NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8vIEhpZ2ggb3JkZXIgc3VyZmFjZXMNCi0vLw0KLXR5cGVkZWYgZW51bSBfRDNEQkFTSVNUWVBFDQotew0KLSAgIEQzREJBU0lTX0JFWklFUiAgICAgID0gMCwNCi0gICBEM0RCQVNJU19CU1BMSU5FICAgICA9IDEsDQotICAgRDNEQkFTSVNfSU5URVJQT0xBVEUgPSAyLA0KLSAgIEQzREJBU0lTX0ZPUkNFX0RXT1JEID0gMHg3ZmZmZmZmZiwNCi19IEQzREJBU0lTVFlQRTsNCi0NCi10eXBlZGVmIGVudW0gX0QzRE9SREVSVFlQRQ0KLXsNCi0gICBEM0RPUkRFUl9MSU5FQVIgICAgICA9IDEsDQotICAgRDNET1JERVJfUVVBRFJBVElDICAgPSAyLA0KLSAgIEQzRE9SREVSX0NVQklDICAgICAgID0gMywNCi0gICBEM0RPUkRFUl9RVUlOVElDICAgICA9IDUsDQotICAgRDNET1JERVJfRk9SQ0VfRFdPUkQgPSAweDdmZmZmZmZmLA0KLX0gRDNET1JERVJUWVBFOw0KLQ0KLXR5cGVkZWYgZW51bSBfRDNEUEFUQ0hFREdFU1RZTEUNCi17DQotICAgRDNEUEFUQ0hFREdFX0RJU0NSRVRFICAgID0gMCwNCi0gICBEM0RQQVRDSEVER0VfQ09OVElOVU9VUyAgPSAxLA0KLSAgIEQzRFBBVENIRURHRV9GT1JDRV9EV09SRCA9IDB4N2ZmZmZmZmYsDQotfSBEM0RQQVRDSEVER0VTVFlMRTsNCi0NCi10eXBlZGVmIGVudW0gX0QzRFNUQVRFQkxPQ0tUWVBFDQotew0KLSAgICBEM0RTQlRfQUxMICAgICAgICAgICA9IDEsIC8vIGNhcHR1cmUgYWxsIHN0YXRlDQotICAgIEQzRFNCVF9QSVhFTFNUQVRFICAgID0gMiwgLy8gY2FwdHVyZSBwaXhlbCBzdGF0ZQ0KLSAgICBEM0RTQlRfVkVSVEVYU1RBVEUgICA9IDMsIC8vIGNhcHR1cmUgdmVydGV4IHN0YXRlDQotICAgIEQzRFNCVF9GT1JDRV9EV09SRCAgID0gMHg3ZmZmZmZmZiwNCi19IEQzRFNUQVRFQkxPQ0tUWVBFOw0KLQ0KLS8vIFRoZSBEM0RWRVJURVhCTEVOREZMQUdTIHR5cGUgaXMgdXNlZCB3aXRoIEQzRFJTX1ZFUlRFWEJMRU5EIHN0YXRlLg0KLS8vDQotdHlwZWRlZiBlbnVtIF9EM0RWRVJURVhCTEVOREZMQUdTDQotew0KLSAgICBEM0RWQkZfRElTQUJMRSAgPSAwLCAgICAgLy8gRGlzYWJsZSB2ZXJ0ZXggYmxlbmRpbmcNCi0gICAgRDNEVkJGXzFXRUlHSFRTID0gMSwgICAgIC8vIDIgbWF0cml4IGJsZW5kaW5nDQotICAgIEQzRFZCRl8yV0VJR0hUUyA9IDIsICAgICAvLyAzIG1hdHJpeCBibGVuZGluZw0KLSAgICBEM0RWQkZfM1dFSUdIVFMgPSAzLCAgICAgLy8gNCBtYXRyaXggYmxlbmRpbmcNCi0gICAgRDNEVkJGX1RXRUVOSU5HID0gMjU1LCAgIC8vIGJsZW5kaW5nIHVzaW5nIEQzRFJTX1RXRUVORkFDVE9SDQotICAgIEQzRFZCRl8wV0VJR0hUUyA9IDI1NiwgICAvLyBvbmUgbWF0cml4IGlzIHVzZWQgd2l0aCB3ZWlnaHQgMS4wDQotICAgIEQzRFZCRl9GT1JDRV9EV09SRCA9IDB4N2ZmZmZmZmYsIC8vIGZvcmNlIDMyLWJpdCBzaXplIGVudW0NCi19IEQzRFZFUlRFWEJMRU5ERkxBR1M7DQotDQotdHlwZWRlZiBlbnVtIF9EM0RURVhUVVJFVFJBTlNGT1JNRkxBR1Mgew0KLSAgICBEM0RUVEZGX0RJU0FCTEUgICAgICAgICA9IDAsICAgIC8vIHRleHR1cmUgY29vcmRpbmF0ZXMgYXJlIHBhc3NlZCBkaXJlY3RseQ0KLSAgICBEM0RUVEZGX0NPVU5UMSAgICAgICAgICA9IDEsICAgIC8vIHJhc3Rlcml6ZXIgc2hvdWxkIGV4cGVjdCAxLUQgdGV4dHVyZSBjb29yZHMNCi0gICAgRDNEVFRGRl9DT1VOVDIgICAgICAgICAgPSAyLCAgICAvLyByYXN0ZXJpemVyIHNob3VsZCBleHBlY3QgMi1EIHRleHR1cmUgY29vcmRzDQotICAgIEQzRFRURkZfQ09VTlQzICAgICAgICAgID0gMywgICAgLy8gcmFzdGVyaXplciBzaG91bGQgZXhwZWN0IDMtRCB0ZXh0dXJlIGNvb3Jkcw0KLSAgICBEM0RUVEZGX0NPVU5UNCAgICAgICAgICA9IDQsICAgIC8vIHJhc3Rlcml6ZXIgc2hvdWxkIGV4cGVjdCA0LUQgdGV4dHVyZSBjb29yZHMNCi0gICAgRDNEVFRGRl9QUk9KRUNURUQgICAgICAgPSAyNTYsICAvLyB0ZXhjb29yZHMgdG8gYmUgZGl2aWRlZCBieSBDT1VOVHRoIGVsZW1lbnQNCi0gICAgRDNEVFRGRl9GT1JDRV9EV09SRCAgICAgPSAweDdmZmZmZmZmLA0KLX0gRDNEVEVYVFVSRVRSQU5TRk9STUZMQUdTOw0KLQ0KLS8vIE1hY3JvcyB0byBzZXQgdGV4dHVyZSBjb29yZGluYXRlIGZvcm1hdCBiaXRzIGluIHRoZSBGVkYgaWQNCi0NCi0jZGVmaW5lIEQzREZWRl9URVhUVVJFRk9STUFUMiAwICAgICAgICAgLy8gVHdvIGZsb2F0aW5nIHBvaW50IHZhbHVlcw0KLSNkZWZpbmUgRDNERlZGX1RFWFRVUkVGT1JNQVQxIDMgICAgICAgICAvLyBPbmUgZmxvYXRpbmcgcG9pbnQgdmFsdWUNCi0jZGVmaW5lIEQzREZWRl9URVhUVVJFRk9STUFUMyAxICAgICAgICAgLy8gVGhyZWUgZmxvYXRpbmcgcG9pbnQgdmFsdWVzDQotI2RlZmluZSBEM0RGVkZfVEVYVFVSRUZPUk1BVDQgMiAgICAgICAgIC8vIEZvdXIgZmxvYXRpbmcgcG9pbnQgdmFsdWVzDQotDQotI2RlZmluZSBEM0RGVkZfVEVYQ09PUkRTSVpFMyhDb29yZEluZGV4KSAoRDNERlZGX1RFWFRVUkVGT1JNQVQzIDw8IChDb29yZEluZGV4KjIgKyAxNikpDQotI2RlZmluZSBEM0RGVkZfVEVYQ09PUkRTSVpFMihDb29yZEluZGV4KSAoRDNERlZGX1RFWFRVUkVGT1JNQVQyKQ0KLSNkZWZpbmUgRDNERlZGX1RFWENPT1JEU0laRTQoQ29vcmRJbmRleCkgKEQzREZWRl9URVhUVVJFRk9STUFUNCA8PCAoQ29vcmRJbmRleCoyICsgMTYpKQ0KLSNkZWZpbmUgRDNERlZGX1RFWENPT1JEU0laRTEoQ29vcmRJbmRleCkgKEQzREZWRl9URVhUVVJFRk9STUFUMSA8PCAoQ29vcmRJbmRleCoyICsgMTYpKQ0KLQ0KLQ0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotLyogRGlyZWN0M0Q4IERldmljZSB0eXBlcyAqLw0KLXR5cGVkZWYgZW51bSBfRDNEREVWVFlQRQ0KLXsNCi0gICAgRDNEREVWVFlQRV9IQUwgICAgICAgICA9IDEsDQotICAgIEQzRERFVlRZUEVfUkVGICAgICAgICAgPSAyLA0KLSAgICBEM0RERVZUWVBFX1NXICAgICAgICAgID0gMywNCi0NCi0gICAgRDNEREVWVFlQRV9GT1JDRV9EV09SRCAgPSAweDdmZmZmZmZmDQotfSBEM0RERVZUWVBFOw0KLQ0KLS8qIE11bHRpLVNhbXBsZSBidWZmZXIgdHlwZXMgKi8NCi10eXBlZGVmIGVudW0gX0QzRE1VTFRJU0FNUExFX1RZUEUNCi17DQotICAgIEQzRE1VTFRJU0FNUExFX05PTkUgICAgICAgICAgICA9ICAwLA0KLSAgICBEM0RNVUxUSVNBTVBMRV8yX1NBTVBMRVMgICAgICAgPSAgMiwNCi0gICAgRDNETVVMVElTQU1QTEVfM19TQU1QTEVTICAgICAgID0gIDMsDQotICAgIEQzRE1VTFRJU0FNUExFXzRfU0FNUExFUyAgICAgICA9ICA0LA0KLSAgICBEM0RNVUxUSVNBTVBMRV81X1NBTVBMRVMgICAgICAgPSAgNSwNCi0gICAgRDNETVVMVElTQU1QTEVfNl9TQU1QTEVTICAgICAgID0gIDYsDQotICAgIEQzRE1VTFRJU0FNUExFXzdfU0FNUExFUyAgICAgICA9ICA3LA0KLSAgICBEM0RNVUxUSVNBTVBMRV84X1NBTVBMRVMgICAgICAgPSAgOCwNCi0gICAgRDNETVVMVElTQU1QTEVfOV9TQU1QTEVTICAgICAgID0gIDksDQotICAgIEQzRE1VTFRJU0FNUExFXzEwX1NBTVBMRVMgICAgICA9IDEwLA0KLSAgICBEM0RNVUxUSVNBTVBMRV8xMV9TQU1QTEVTICAgICAgPSAxMSwNCi0gICAgRDNETVVMVElTQU1QTEVfMTJfU0FNUExFUyAgICAgID0gMTIsDQotICAgIEQzRE1VTFRJU0FNUExFXzEzX1NBTVBMRVMgICAgICA9IDEzLA0KLSAgICBEM0RNVUxUSVNBTVBMRV8xNF9TQU1QTEVTICAgICAgPSAxNCwNCi0gICAgRDNETVVMVElTQU1QTEVfMTVfU0FNUExFUyAgICAgID0gMTUsDQotICAgIEQzRE1VTFRJU0FNUExFXzE2X1NBTVBMRVMgICAgICA9IDE2LA0KLQ0KLSAgICBEM0RNVUxUSVNBTVBMRV9GT1JDRV9EV09SRCAgICAgPSAweDdmZmZmZmZmDQotfSBEM0RNVUxUSVNBTVBMRV9UWVBFOw0KLQ0KLS8qIEZvcm1hdHMNCi0gKiBNb3N0IG9mIHRoZXNlIG5hbWVzIGhhdmUgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uOg0KLSAqICAgICAgQSA9IEFscGhhDQotICogICAgICBSID0gUmVkDQotICogICAgICBHID0gR3JlZW4NCi0gKiAgICAgIEIgPSBCbHVlDQotICogICAgICBYID0gVW51c2VkIEJpdHMNCi0gKiAgICAgIFAgPSBQYWxldHRlDQotICogICAgICBMID0gTHVtaW5hbmNlDQotICogICAgICBVID0gZFUgY29vcmRpbmF0ZSBmb3IgQnVtcE1hcA0KLSAqICAgICAgViA9IGRWIGNvb3JkaW5hdGUgZm9yIEJ1bXBNYXANCi0gKiAgICAgIFMgPSBTdGVuY2lsDQotICogICAgICBEID0gRGVwdGggKGUuZy4gWiBvciBXIGJ1ZmZlcikNCi0gKg0KLSAqICAgICAgRnVydGhlciwgdGhlIG9yZGVyIG9mIHRoZSBwaWVjZXMgYXJlIGZyb20gTVNCIGZpcnN0OyBoZW5jZQ0KLSAqICAgICAgRDNERk1UX0E4TDggaW5kaWNhdGVzIHRoYXQgdGhlIGhpZ2ggYnl0ZSBvZiB0aGlzIHR3byBieXRlDQotICogICAgICBmb3JtYXQgaXMgYWxwaGEuDQotICoNCi0gKiAgICAgIEQxNiBpbmRpY2F0ZXM6DQotICogICAgICAgICAgIC0gQW4gaW50ZWdlciAxNi1iaXQgdmFsdWUuDQotICogICAgICAgICAgIC0gQW4gYXBwLWxvY2thYmxlIHN1cmZhY2UuDQotICoNCi0gKiAgICAgIEFsbCBEZXB0aC9TdGVuY2lsIGZvcm1hdHMgZXhjZXB0IEQzREZNVF9EMTZfTE9DS0FCTEUgaW5kaWNhdGU6DQotICogICAgICAgICAgLSBubyBwYXJ0aWN1bGFyIGJpdCBvcmRlcmluZyBwZXIgcGl4ZWwsIGFuZA0KLSAqICAgICAgICAgIC0gYXJlIG5vdCBhcHAgbG9ja2FibGUsIGFuZA0KLSAqICAgICAgICAgIC0gdGhlIGRyaXZlciBpcyBhbGxvd2VkIHRvIGNvbnN1bWUgbW9yZSB0aGFuIHRoZSBpbmRpY2F0ZWQNCi0gKiAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIHBlciBEZXB0aCBjaGFubmVsIChidXQgbm90IFN0ZW5jaWwgY2hhbm5lbCkuDQotICovDQotI2lmbmRlZiBNQUtFRk9VUkNDDQotICAgICNkZWZpbmUgTUFLRUZPVVJDQyhjaDAsIGNoMSwgY2gyLCBjaDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAoKERXT1JEKShCWVRFKShjaDApIHwgKChEV09SRCkoQllURSkoY2gxKSA8PCA4KSB8ICAgICAgIFwNCi0gICAgICAgICAgICAgICAgKChEV09SRCkoQllURSkoY2gyKSA8PCAxNikgfCAoKERXT1JEKShCWVRFKShjaDMpIDw8IDI0ICkpDQotI2VuZGlmIC8qIGRlZmluZWQoTUFLRUZPVVJDQykgKi8NCi0NCi0NCi10eXBlZGVmIGVudW0gX0QzREZPUk1BVA0KLXsNCi0gICAgRDNERk1UX1VOS05PV04gICAgICAgICAgICAgID0gIDAsDQotDQotICAgIEQzREZNVF9SOEc4QjggICAgICAgICAgICAgICA9IDIwLA0KLSAgICBEM0RGTVRfQThSOEc4QjggICAgICAgICAgICAgPSAyMSwNCi0gICAgRDNERk1UX1g4UjhHOEI4ICAgICAgICAgICAgID0gMjIsDQotICAgIEQzREZNVF9SNUc2QjUgICAgICAgICAgICAgICA9IDIzLA0KLSAgICBEM0RGTVRfWDFSNUc1QjUgICAgICAgICAgICAgPSAyNCwNCi0gICAgRDNERk1UX0ExUjVHNUI1ICAgICAgICAgICAgID0gMjUsDQotICAgIEQzREZNVF9BNFI0RzRCNCAgICAgICAgICAgICA9IDI2LA0KLSAgICBEM0RGTVRfUjNHM0IyICAgICAgICAgICAgICAgPSAyNywNCi0gICAgRDNERk1UX0E4ICAgICAgICAgICAgICAgICAgID0gMjgsDQotICAgIEQzREZNVF9BOFIzRzNCMiAgICAgICAgICAgICA9IDI5LA0KLSAgICBEM0RGTVRfWDRSNEc0QjQgICAgICAgICAgICAgPSAzMCwNCi0gICAgRDNERk1UX0EyQjEwRzEwUjEwICAgICAgICAgID0gMzEsDQotICAgIEQzREZNVF9HMTZSMTYgICAgICAgICAgICAgICA9IDM0LA0KLQ0KLSAgICBEM0RGTVRfQThQOCAgICAgICAgICAgICAgICAgPSA0MCwNCi0gICAgRDNERk1UX1A4ICAgICAgICAgICAgICAgICAgID0gNDEsDQotDQotICAgIEQzREZNVF9MOCAgICAgICAgICAgICAgICAgICA9IDUwLA0KLSAgICBEM0RGTVRfQThMOCAgICAgICAgICAgICAgICAgPSA1MSwNCi0gICAgRDNERk1UX0E0TDQgICAgICAgICAgICAgICAgID0gNTIsDQotDQotICAgIEQzREZNVF9WOFU4ICAgICAgICAgICAgICAgICA9IDYwLA0KLSAgICBEM0RGTVRfTDZWNVU1ICAgICAgICAgICAgICAgPSA2MSwNCi0gICAgRDNERk1UX1g4TDhWOFU4ICAgICAgICAgICAgID0gNjIsDQotICAgIEQzREZNVF9ROFc4VjhVOCAgICAgICAgICAgICA9IDYzLA0KLSAgICBEM0RGTVRfVjE2VTE2ICAgICAgICAgICAgICAgPSA2NCwNCi0gICAgRDNERk1UX1cxMVYxMVUxMCAgICAgICAgICAgID0gNjUsDQotICAgIEQzREZNVF9BMlcxMFYxMFUxMCAgICAgICAgICA9IDY3LA0KLQ0KLSAgICBEM0RGTVRfVVlWWSAgICAgICAgICAgICAgICAgPSBNQUtFRk9VUkNDKCdVJywgJ1knLCAnVicsICdZJyksDQotICAgIEQzREZNVF9ZVVkyICAgICAgICAgICAgICAgICA9IE1BS0VGT1VSQ0MoJ1knLCAnVScsICdZJywgJzInKSwNCi0gICAgRDNERk1UX0RYVDEgICAgICAgICAgICAgICAgID0gTUFLRUZPVVJDQygnRCcsICdYJywgJ1QnLCAnMScpLA0KLSAgICBEM0RGTVRfRFhUMiAgICAgICAgICAgICAgICAgPSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICcyJyksDQotICAgIEQzREZNVF9EWFQzICAgICAgICAgICAgICAgICA9IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzMnKSwNCi0gICAgRDNERk1UX0RYVDQgICAgICAgICAgICAgICAgID0gTUFLRUZPVVJDQygnRCcsICdYJywgJ1QnLCAnNCcpLA0KLSAgICBEM0RGTVRfRFhUNSAgICAgICAgICAgICAgICAgPSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICc1JyksDQotDQotICAgIEQzREZNVF9EMTZfTE9DS0FCTEUgICAgICAgICA9IDcwLA0KLSAgICBEM0RGTVRfRDMyICAgICAgICAgICAgICAgICAgPSA3MSwNCi0gICAgRDNERk1UX0QxNVMxICAgICAgICAgICAgICAgID0gNzMsDQotICAgIEQzREZNVF9EMjRTOCAgICAgICAgICAgICAgICA9IDc1LA0KLSAgICBEM0RGTVRfRDE2ICAgICAgICAgICAgICAgICAgPSA4MCwNCi0gICAgRDNERk1UX0QyNFg4ICAgICAgICAgICAgICAgID0gNzcsDQotICAgIEQzREZNVF9EMjRYNFM0ICAgICAgICAgICAgICA9IDc5LA0KLQ0KLQ0KLSAgICBEM0RGTVRfVkVSVEVYREFUQSAgICAgICAgICAgPTEwMCwNCi0gICAgRDNERk1UX0lOREVYMTYgICAgICAgICAgICAgID0xMDEsDQotICAgIEQzREZNVF9JTkRFWDMyICAgICAgICAgICAgICA9MTAyLA0KLQ0KLSAgICBEM0RGTVRfRk9SQ0VfRFdPUkQgICAgICAgICAgPTB4N2ZmZmZmZmYNCi19IEQzREZPUk1BVDsNCi0NCi0vKiBEaXNwbGF5IE1vZGVzICovDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRERJU1BMQVlNT0RFDQotew0KLSAgICBVSU5UICAgICAgICAgICAgV2lkdGg7DQotICAgIFVJTlQgICAgICAgICAgICBIZWlnaHQ7DQotICAgIFVJTlQgICAgICAgICAgICBSZWZyZXNoUmF0ZTsNCi0gICAgRDNERk9STUFUICAgICAgIEZvcm1hdDsNCi19IEQzRERJU1BMQVlNT0RFOw0KLQ0KLS8qIENyZWF0aW9uIFBhcmFtZXRlcnMgKi8NCi10eXBlZGVmIHN0cnVjdCBfRDNEREVWSUNFX0NSRUFUSU9OX1BBUkFNRVRFUlMNCi17DQotICAgIFVJTlQgICAgICAgICAgICBBZGFwdGVyT3JkaW5hbDsNCi0gICAgRDNEREVWVFlQRSAgICAgIERldmljZVR5cGU7DQotICAgIEhXTkQgICAgICAgICAgICBoRm9jdXNXaW5kb3c7DQotICAgIERXT1JEICAgICAgICAgICBCZWhhdmlvckZsYWdzOw0KLX0gRDNEREVWSUNFX0NSRUFUSU9OX1BBUkFNRVRFUlM7DQotDQotDQotLyogU3dhcEVmZmVjdHMgKi8NCi10eXBlZGVmIGVudW0gX0QzRFNXQVBFRkZFQ1QNCi17DQotICAgIEQzRFNXQVBFRkZFQ1RfRElTQ0FSRCAgICAgICAgICAgPSAxLA0KLSAgICBEM0RTV0FQRUZGRUNUX0ZMSVAgICAgICAgICAgICAgID0gMiwNCi0gICAgRDNEU1dBUEVGRkVDVF9DT1BZICAgICAgICAgICAgICA9IDMsDQotICAgIEQzRFNXQVBFRkZFQ1RfQ09QWV9WU1lOQyAgICAgICAgPSA0LA0KLQ0KLSAgICBEM0RTV0FQRUZGRUNUX0ZPUkNFX0RXT1JEICAgICAgID0gMHg3ZmZmZmZmZg0KLX0gRDNEU1dBUEVGRkVDVDsNCi0NCi0vKiBQb29sIHR5cGVzICovDQotdHlwZWRlZiBlbnVtIF9EM0RQT09MIHsNCi0gICAgRDNEUE9PTF9ERUZBVUxUICAgICAgICAgICAgICAgICA9IDAsDQotICAgIEQzRFBPT0xfTUFOQUdFRCAgICAgICAgICAgICAgICAgPSAxLA0KLSAgICBEM0RQT09MX1NZU1RFTU1FTSAgICAgICAgICAgICAgID0gMiwNCi0gICAgRDNEUE9PTF9TQ1JBVENIICAgICAgICAgICAgICAgICA9IDMsDQotDQotICAgIEQzRFBPT0xfRk9SQ0VfRFdPUkQgICAgICAgICAgICAgPSAweDdmZmZmZmZmDQotfSBEM0RQT09MOw0KLQ0KLQ0KLS8qIFJlZnJlc2hSYXRlIHByZS1kZWZpbmVzICovDQotI2RlZmluZSBEM0RQUkVTRU5UX1JBVEVfREVGQVVMVCAgICAgICAgIDB4MDAwMDAwMDANCi0jZGVmaW5lIEQzRFBSRVNFTlRfUkFURV9VTkxJTUlURUQgICAgICAgMHg3ZmZmZmZmZg0KLQ0KLQ0KLS8qIFJlc2l6ZSBPcHRpb25hbCBQYXJhbWV0ZXJzICovDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRFBSRVNFTlRfUEFSQU1FVEVSU18NCi17DQotICAgIFVJTlQgICAgICAgICAgICAgICAgQmFja0J1ZmZlcldpZHRoOw0KLSAgICBVSU5UICAgICAgICAgICAgICAgIEJhY2tCdWZmZXJIZWlnaHQ7DQotICAgIEQzREZPUk1BVCAgICAgICAgICAgQmFja0J1ZmZlckZvcm1hdDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBCYWNrQnVmZmVyQ291bnQ7DQotDQotICAgIEQzRE1VTFRJU0FNUExFX1RZUEUgTXVsdGlTYW1wbGVUeXBlOw0KLQ0KLSAgICBEM0RTV0FQRUZGRUNUICAgICAgIFN3YXBFZmZlY3Q7DQotICAgIEhXTkQgICAgICAgICAgICAgICAgaERldmljZVdpbmRvdzsNCi0gICAgQk9PTCAgICAgICAgICAgICAgICBXaW5kb3dlZDsNCi0gICAgQk9PTCAgICAgICAgICAgICAgICBFbmFibGVBdXRvRGVwdGhTdGVuY2lsOw0KLSAgICBEM0RGT1JNQVQgICAgICAgICAgIEF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQ7DQotICAgIERXT1JEICAgICAgICAgICAgICAgRmxhZ3M7DQotDQotICAgIC8qIEZvbGxvd2luZyBlbGVtZW50cyBtdXN0IGJlIHplcm8gZm9yIFdpbmRvd2VkIG1vZGUgKi8NCi0gICAgVUlOVCAgICAgICAgICAgICAgICBGdWxsU2NyZWVuX1JlZnJlc2hSYXRlSW5IejsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBGdWxsU2NyZWVuX1ByZXNlbnRhdGlvbkludGVydmFsOw0KLQ0KLX0gRDNEUFJFU0VOVF9QQVJBTUVURVJTOw0KLQ0KLS8vIFZhbHVlcyBmb3IgRDNEUFJFU0VOVF9QQVJBTUVURVJTLkZsYWdzDQotDQotI2RlZmluZSBEM0RQUkVTRU5URkxBR19MT0NLQUJMRV9CQUNLQlVGRkVSICAweDAwMDAwMDAxDQotDQotDQotLyogR2FtbWEgUmFtcDogU2FtZSBhcyBEWDcgKi8NCi0NCi10eXBlZGVmIHN0cnVjdCBfRDNER0FNTUFSQU1QDQotew0KLSAgICBXT1JEICAgICAgICAgICAgICAgIHJlZCAgWzI1Nl07DQotICAgIFdPUkQgICAgICAgICAgICAgICAgZ3JlZW5bMjU2XTsNCi0gICAgV09SRCAgICAgICAgICAgICAgICBibHVlIFsyNTZdOw0KLX0gRDNER0FNTUFSQU1QOw0KLQ0KLS8qIEJhY2sgYnVmZmVyIHR5cGVzICovDQotdHlwZWRlZiBlbnVtIF9EM0RCQUNLQlVGRkVSX1RZUEUNCi17DQotICAgIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PICAgICAgICAgPSAwLA0KLSAgICBEM0RCQUNLQlVGRkVSX1RZUEVfTEVGVCAgICAgICAgID0gMSwNCi0gICAgRDNEQkFDS0JVRkZFUl9UWVBFX1JJR0hUICAgICAgICA9IDIsDQotDQotICAgIEQzREJBQ0tCVUZGRVJfVFlQRV9GT1JDRV9EV09SRCAgPSAweDdmZmZmZmZmDQotfSBEM0RCQUNLQlVGRkVSX1RZUEU7DQotDQotDQotLyogVHlwZXMgKi8NCi10eXBlZGVmIGVudW0gX0QzRFJFU09VUkNFVFlQRSB7DQotICAgIEQzRFJUWVBFX1NVUkZBQ0UgICAgICAgICAgICAgICAgPSAgMSwNCi0gICAgRDNEUlRZUEVfVk9MVU1FICAgICAgICAgICAgICAgICA9ICAyLA0KLSAgICBEM0RSVFlQRV9URVhUVVJFICAgICAgICAgICAgICAgID0gIDMsDQotICAgIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkUgICAgICAgICAgPSAgNCwNCi0gICAgRDNEUlRZUEVfQ1VCRVRFWFRVUkUgICAgICAgICAgICA9ICA1LA0KLSAgICBEM0RSVFlQRV9WRVJURVhCVUZGRVIgICAgICAgICAgID0gIDYsDQotICAgIEQzRFJUWVBFX0lOREVYQlVGRkVSICAgICAgICAgICAgPSAgNywNCi0NCi0NCi0gICAgRDNEUlRZUEVfRk9SQ0VfRFdPUkQgICAgICAgICAgICA9IDB4N2ZmZmZmZmYNCi19IEQzRFJFU09VUkNFVFlQRTsNCi0NCi0vKiBVc2FnZXMgKi8NCi0jZGVmaW5lIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCAgICAgICAoMHgwMDAwMDAwMUwpDQotI2RlZmluZSBEM0RVU0FHRV9ERVBUSFNURU5DSUwgICAgICAgKDB4MDAwMDAwMDJMKQ0KLQ0KLS8qIFVzYWdlcyBmb3IgVmVydGV4L0luZGV4IGJ1ZmZlcnMgKi8NCi0jZGVmaW5lIEQzRFVTQUdFX1dSSVRFT05MWSAgICAgICAgICAoMHgwMDAwMDAwOEwpDQotI2RlZmluZSBEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkcgKDB4MDAwMDAwMTBMKQ0KLSNkZWZpbmUgRDNEVVNBR0VfRE9OT1RDTElQICAgICAgICAgICgweDAwMDAwMDIwTCkNCi0jZGVmaW5lIEQzRFVTQUdFX1BPSU5UUyAgICAgICAgICAgICAoMHgwMDAwMDA0MEwpDQotI2RlZmluZSBEM0RVU0FHRV9SVFBBVENIRVMgICAgICAgICAgKDB4MDAwMDAwODBMKQ0KLSNkZWZpbmUgRDNEVVNBR0VfTlBBVENIRVMgICAgICAgICAgICgweDAwMDAwMTAwTCkNCi0jZGVmaW5lIEQzRFVTQUdFX0RZTkFNSUMgICAgICAgICAgICAoMHgwMDAwMDIwMEwpDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotLyogQ3ViZU1hcCBGYWNlIGlkZW50aWZpZXJzICovDQotdHlwZWRlZiBlbnVtIF9EM0RDVUJFTUFQX0ZBQ0VTDQotew0KLSAgICBEM0RDVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWCAgICAgPSAwLA0KLSAgICBEM0RDVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWCAgICAgPSAxLA0KLSAgICBEM0RDVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWSAgICAgPSAyLA0KLSAgICBEM0RDVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWSAgICAgPSAzLA0KLSAgICBEM0RDVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWiAgICAgPSA0LA0KLSAgICBEM0RDVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWiAgICAgPSA1LA0KLQ0KLSAgICBEM0RDVUJFTUFQX0ZBQ0VfRk9SQ0VfRFdPUkQgICAgPSAweDdmZmZmZmZmDQotfSBEM0RDVUJFTUFQX0ZBQ0VTOw0KLQ0KLQ0KLS8qIExvY2sgZmxhZ3MgKi8NCi0NCi0jZGVmaW5lIEQzRExPQ0tfUkVBRE9OTFkgICAgICAgICAgIDB4MDAwMDAwMTBMDQotI2RlZmluZSBEM0RMT0NLX0RJU0NBUkQgICAgICAgICAgICAgMHgwMDAwMjAwMEwNCi0jZGVmaW5lIEQzRExPQ0tfTk9PVkVSV1JJVEUgICAgICAgIDB4MDAwMDEwMDBMDQotI2RlZmluZSBEM0RMT0NLX05PU1lTTE9DSyAgICAgICAgICAweDAwMDAwODAwTA0KLQ0KLSNkZWZpbmUgRDNETE9DS19OT19ESVJUWV9VUERBVEUgICAgIDB4MDAwMDgwMDBMDQotDQotDQotDQotDQotDQotDQotLyogVmVydGV4IEJ1ZmZlciBEZXNjcmlwdGlvbiAqLw0KLXR5cGVkZWYgc3RydWN0IF9EM0RWRVJURVhCVUZGRVJfREVTQw0KLXsNCi0gICAgRDNERk9STUFUICAgICAgICAgICBGb3JtYXQ7DQotICAgIEQzRFJFU09VUkNFVFlQRSAgICAgVHlwZTsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICBVc2FnZTsNCi0gICAgRDNEUE9PTCAgICAgICAgICAgICBQb29sOw0KLSAgICBVSU5UICAgICAgICAgICAgICAgIFNpemU7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgRlZGOw0KLQ0KLX0gRDNEVkVSVEVYQlVGRkVSX0RFU0M7DQotDQotLyogSW5kZXggQnVmZmVyIERlc2NyaXB0aW9uICovDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRElOREVYQlVGRkVSX0RFU0MNCi17DQotICAgIEQzREZPUk1BVCAgICAgICAgICAgRm9ybWF0Ow0KLSAgICBEM0RSRVNPVVJDRVRZUEUgICAgIFR5cGU7DQotICAgIERXT1JEICAgICAgICAgICAgICAgVXNhZ2U7DQotICAgIEQzRFBPT0wgICAgICAgICAgICAgUG9vbDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBTaXplOw0KLX0gRDNESU5ERVhCVUZGRVJfREVTQzsNCi0NCi0NCi0vKiBTdXJmYWNlIERlc2NyaXB0aW9uICovDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRFNVUkZBQ0VfREVTQw0KLXsNCi0gICAgRDNERk9STUFUICAgICAgICAgICBGb3JtYXQ7DQotICAgIEQzRFJFU09VUkNFVFlQRSAgICAgVHlwZTsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICBVc2FnZTsNCi0gICAgRDNEUE9PTCAgICAgICAgICAgICBQb29sOw0KLSAgICBVSU5UICAgICAgICAgICAgICAgIFNpemU7DQotDQotICAgIEQzRE1VTFRJU0FNUExFX1RZUEUgTXVsdGlTYW1wbGVUeXBlOw0KLSAgICBVSU5UICAgICAgICAgICAgICAgIFdpZHRoOw0KLSAgICBVSU5UICAgICAgICAgICAgICAgIEhlaWdodDsNCi19IEQzRFNVUkZBQ0VfREVTQzsNCi0NCi10eXBlZGVmIHN0cnVjdCBfRDNEVk9MVU1FX0RFU0MNCi17DQotICAgIEQzREZPUk1BVCAgICAgICAgICAgRm9ybWF0Ow0KLSAgICBEM0RSRVNPVVJDRVRZUEUgICAgIFR5cGU7DQotICAgIERXT1JEICAgICAgICAgICAgICAgVXNhZ2U7DQotICAgIEQzRFBPT0wgICAgICAgICAgICAgUG9vbDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBTaXplOw0KLQ0KLSAgICBVSU5UICAgICAgICAgICAgICAgIFdpZHRoOw0KLSAgICBVSU5UICAgICAgICAgICAgICAgIEhlaWdodDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBEZXB0aDsNCi19IEQzRFZPTFVNRV9ERVNDOw0KLQ0KLS8qIFN0cnVjdHVyZSBmb3IgTG9ja1JlY3QgKi8NCi10eXBlZGVmIHN0cnVjdCBfRDNETE9DS0VEX1JFQ1QNCi17DQotICAgIElOVCAgICAgICAgICAgICAgICAgUGl0Y2g7DQotICAgIHZvaWQqICAgICAgICAgICAgICAgcEJpdHM7DQotfSBEM0RMT0NLRURfUkVDVDsNCi0NCi0vKiBTdHJ1Y3R1cmVzIGZvciBMb2NrQm94ICovDQotdHlwZWRlZiBzdHJ1Y3QgX0QzREJPWA0KLXsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBMZWZ0Ow0KLSAgICBVSU5UICAgICAgICAgICAgICAgIFRvcDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBSaWdodDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBCb3R0b207DQotICAgIFVJTlQgICAgICAgICAgICAgICAgRnJvbnQ7DQotICAgIFVJTlQgICAgICAgICAgICAgICAgQmFjazsNCi19IEQzREJPWDsNCi0NCi10eXBlZGVmIHN0cnVjdCBfRDNETE9DS0VEX0JPWA0KLXsNCi0gICAgSU5UICAgICAgICAgICAgICAgICBSb3dQaXRjaDsNCi0gICAgSU5UICAgICAgICAgICAgICAgICBTbGljZVBpdGNoOw0KLSAgICB2b2lkKiAgICAgICAgICAgICAgIHBCaXRzOw0KLX0gRDNETE9DS0VEX0JPWDsNCi0NCi0vKiBTdHJ1Y3R1cmVzIGZvciBMb2NrUmFuZ2UgKi8NCi10eXBlZGVmIHN0cnVjdCBfRDNEUkFOR0UNCi17DQotICAgIFVJTlQgICAgICAgICAgICAgICAgT2Zmc2V0Ow0KLSAgICBVSU5UICAgICAgICAgICAgICAgIFNpemU7DQotfSBEM0RSQU5HRTsNCi0NCi0vKiBTdHJ1Y3R1cmVzIGZvciBoaWdoIG9yZGVyIHByaW1pdGl2ZXMgKi8NCi10eXBlZGVmIHN0cnVjdCBfRDNEUkVDVFBBVENIX0lORk8NCi17DQotICAgIFVJTlQgICAgICAgICAgICAgICAgU3RhcnRWZXJ0ZXhPZmZzZXRXaWR0aDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBTdGFydFZlcnRleE9mZnNldEhlaWdodDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBXaWR0aDsNCi0gICAgVUlOVCAgICAgICAgICAgICAgICBIZWlnaHQ7DQotICAgIFVJTlQgICAgICAgICAgICAgICAgU3RyaWRlOw0KLSAgICBEM0RCQVNJU1RZUEUgICAgICAgIEJhc2lzOw0KLSAgICBEM0RPUkRFUlRZUEUgICAgICAgIE9yZGVyOw0KLX0gRDNEUkVDVFBBVENIX0lORk87DQotDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRFRSSVBBVENIX0lORk8NCi17DQotICAgIFVJTlQgICAgICAgICAgICAgICAgU3RhcnRWZXJ0ZXhPZmZzZXQ7DQotICAgIFVJTlQgICAgICAgICAgICAgICAgTnVtVmVydGljZXM7DQotICAgIEQzREJBU0lTVFlQRSAgICAgICAgQmFzaXM7DQotICAgIEQzRE9SREVSVFlQRSAgICAgICAgT3JkZXI7DQotfSBEM0RUUklQQVRDSF9JTkZPOw0KLQ0KLS8qIEFkYXB0ZXIgSWRlbnRpZmllciAqLw0KLQ0KLSNkZWZpbmUgTUFYX0RFVklDRV9JREVOVElGSUVSX1NUUklORyAgICAgICAgNTEyDQotdHlwZWRlZiBzdHJ1Y3QgX0QzREFEQVBURVJfSURFTlRJRklFUjgNCi17DQotICAgIGNoYXIgICAgICAgICAgICBEcml2ZXJbTUFYX0RFVklDRV9JREVOVElGSUVSX1NUUklOR107DQotICAgIGNoYXIgICAgICAgICAgICBEZXNjcmlwdGlvbltNQVhfREVWSUNFX0lERU5USUZJRVJfU1RSSU5HXTsNCi0NCi0jaWZkZWYgX1dJTjMyDQotICAgIExBUkdFX0lOVEVHRVIgICBEcml2ZXJWZXJzaW9uOyAgICAgICAgICAgIC8qIERlZmluZWQgZm9yIDMyIGJpdCBjb21wb25lbnRzICovDQotI2Vsc2UNCi0gICAgRFdPUkQgICAgICAgICAgIERyaXZlclZlcnNpb25Mb3dQYXJ0OyAgICAgLyogRGVmaW5lZCBmb3IgMTYgYml0IGRyaXZlciBjb21wb25lbnRzICovDQotICAgIERXT1JEICAgICAgICAgICBEcml2ZXJWZXJzaW9uSGlnaFBhcnQ7DQotI2VuZGlmDQotDQotICAgIERXT1JEICAgICAgICAgICBWZW5kb3JJZDsNCi0gICAgRFdPUkQgICAgICAgICAgIERldmljZUlkOw0KLSAgICBEV09SRCAgICAgICAgICAgU3ViU3lzSWQ7DQotICAgIERXT1JEICAgICAgICAgICBSZXZpc2lvbjsNCi0NCi0gICAgR1VJRCAgICAgICAgICAgIERldmljZUlkZW50aWZpZXI7DQotDQotICAgIERXT1JEICAgICAgICAgICBXSFFMTGV2ZWw7DQotDQotfSBEM0RBREFQVEVSX0lERU5USUZJRVI4Ow0KLQ0KLQ0KLS8qIFJhc3RlciBTdGF0dXMgc3RydWN0dXJlIHJldHVybmVkIGJ5IEdldFJhc3RlclN0YXR1cyAqLw0KLXR5cGVkZWYgc3RydWN0IF9EM0RSQVNURVJfU1RBVFVTDQotew0KLSAgICBCT09MICAgICAgICAgICAgSW5WQmxhbms7DQotICAgIFVJTlQgICAgICAgICAgICBTY2FuTGluZTsNCi19IEQzRFJBU1RFUl9TVEFUVVM7DQotDQotDQotDQotLyogRGVidWcgbW9uaXRvciB0b2tlbnMgKERFQlVHIG9ubHkpDQotDQotICAgTm90ZSB0aGF0IGlmIEQzRFJTX0RFQlVHTU9OSVRPUlRPS0VOIGlzIHNldCwgdGhlIGNhbGwgaXMgdHJlYXRlZCBhcw0KLSAgIHBhc3NpbmcgYSB0b2tlbiB0byB0aGUgZGVidWcgbW9uaXRvci4gIEZvciBleGFtcGxlLCBpZiwgYWZ0ZXIgcGFzc2luZw0KLSAgIEQzRERNVF9FTkFCTEUvRElTQUJMRSB0byBEM0RSU19ERUJVR01PTklUT1JUT0tFTiBvdGhlciB0b2tlbiB2YWx1ZXMNCi0gICBhcmUgcGFzc2VkIGluLCB0aGUgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZSBvZiB0aGUgZGVidWcNCi0gICBtb25pdG9yIHdpbGwgc3RpbGwgcGVyc2lzdC4NCi0NCi0gICBUaGUgZGVidWcgbW9uaXRvciBkZWZhdWx0cyB0byBlbmFibGVkLg0KLQ0KLSAgIENhbGxpbmcgR2V0UmVuZGVyU3RhdGUgb24gRDNEUlNfREVCVUdNT05JVE9SVE9LRU4gaXMgbm90IG9mIGFueSB1c2UuDQotKi8NCi10eXBlZGVmIGVudW0gX0QzRERFQlVHTU9OSVRPUlRPS0VOUyB7DQotICAgIEQzRERNVF9FTkFCTEUgICAgICAgICAgICA9IDAsICAgIC8vIGVuYWJsZSBkZWJ1ZyBtb25pdG9yDQotICAgIEQzRERNVF9ESVNBQkxFICAgICAgICAgICA9IDEsICAgIC8vIGRpc2FibGUgZGVidWcgbW9uaXRvcg0KLSAgICBEM0RETVRfRk9SQ0VfRFdPUkQgICAgID0gMHg3ZmZmZmZmZiwNCi19IEQzRERFQlVHTU9OSVRPUlRPS0VOUzsNCi0NCi0vLyBHZXRJbmZvIElEcw0KLQ0KLSNkZWZpbmUgRDNEREVWSU5GT0lEX1JFU09VUkNFTUFOQUdFUiAgICA1ICAgICAgICAgICAvKiBVc2VkIHdpdGggRDNEREVWSU5GT19SRVNPVVJDRU1BTkFHRVIgKi8NCi0jZGVmaW5lIEQzRERFVklORk9JRF9WRVJURVhTVEFUUyAgICAgICAgNiAgICAgICAgICAgLyogVXNlZCB3aXRoIEQzRERFVklORk9fRDNEVkVSVEVYU1RBVFMgKi8NCi0NCi10eXBlZGVmIHN0cnVjdCBfRDNEUkVTT1VSQ0VTVEFUUw0KLXsNCi0vLyBEYXRhIGNvbGxlY3RlZCBzaW5jZSBsYXN0IFByZXNlbnQoKQ0KLSAgICBCT09MICAgIGJUaHJhc2hpbmc7ICAgICAgICAgICAgIC8qIGluZGljYXRlcyBpZiB0aHJhc2hpbmcgKi8NCi0gICAgRFdPUkQgICBBcHByb3hCeXRlc0Rvd25sb2FkZWQ7ICAvKiBBcHByb3hpbWF0ZSBudW1iZXIgb2YgYnl0ZXMgZG93bmxvYWRlZCBieSByZXNvdXJjZSBtYW5hZ2VyICovDQotICAgIERXT1JEICAgTnVtRXZpY3RzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG9iamVjdHMgZXZpY3RlZCAqLw0KLSAgICBEV09SRCAgIE51bVZpZENyZWF0ZXM7ICAgICAgICAgIC8qIG51bWJlciBvZiBvYmplY3RzIGNyZWF0ZWQgaW4gdmlkZW8gbWVtb3J5ICovDQotICAgIERXT1JEICAgTGFzdFByaTsgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgb2YgbGFzdCBvYmplY3QgZXZpY3RlZCAqLw0KLSAgICBEV09SRCAgIE51bVVzZWQ7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBvYmplY3RzIHNldCB0byB0aGUgZGV2aWNlICovDQotICAgIERXT1JEICAgTnVtVXNlZEluVmlkTWVtOyAgICAgICAgLyogbnVtYmVyIG9mIG9iamVjdHMgc2V0IHRvIHRoZSBkZXZpY2UsIHdoaWNoIGFyZSBhbHJlYWR5IGluIHZpZGVvIG1lbW9yeSAqLw0KLS8vIFBlcnNpc3RlbnQgZGF0YQ0KLSAgICBEV09SRCAgIFdvcmtpbmdTZXQ7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBvYmplY3RzIGluIHZpZGVvIG1lbW9yeSAqLw0KLSAgICBEV09SRCAgIFdvcmtpbmdTZXRCeXRlczsgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBpbiB2aWRlbyBtZW1vcnkgKi8NCi0gICAgRFdPUkQgICBUb3RhbE1hbmFnZWQ7ICAgICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgbWFuYWdlZCBvYmplY3RzICovDQotICAgIERXT1JEICAgVG90YWxCeXRlczsgICAgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG9mIG1hbmFnZWQgb2JqZWN0cyAqLw0KLX0gRDNEUkVTT1VSQ0VTVEFUUzsNCi0NCi0jZGVmaW5lIEQzRFJUWVBFQ09VTlQgKEQzRFJUWVBFX0lOREVYQlVGRkVSKzEpDQotDQotdHlwZWRlZiBzdHJ1Y3QgX0QzRERFVklORk9fUkVTT1VSQ0VNQU5BR0VSDQotew0KLSAgICBEM0RSRVNPVVJDRVNUQVRTICAgIHN0YXRzW0QzRFJUWVBFQ09VTlRdOw0KLX0gRDNEREVWSU5GT19SRVNPVVJDRU1BTkFHRVIsICpMUEQzRERFVklORk9fUkVTT1VSQ0VNQU5BR0VSOw0KLQ0KLXR5cGVkZWYgc3RydWN0IF9EM0RERVZJTkZPX0QzRFZFUlRFWFNUQVRTDQotew0KLSAgICBEV09SRCAgIE51bVJlbmRlcmVkVHJpYW5nbGVzOyAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgdHJpYW5nbGVzIHRoYXQgYXJlIG5vdCBjbGlwcGVkIGluIHRoaXMgZnJhbWUgKi8NCi0gICAgRFdPUkQgICBOdW1FeHRyYUNsaXBwaW5nVHJpYW5nbGVzOyAgLyogTnVtYmVyIG9mIG5ldyB0cmlhbmdsZXMgZ2VuZXJhdGVkIGJ5IGNsaXBwaW5nICovDQotfSBEM0RERVZJTkZPX0QzRFZFUlRFWFNUQVRTLCAqTFBEM0RERVZJTkZPX0QzRFZFUlRFWFNUQVRTOw0KLQ0KLQ0KLSNwcmFnbWEgcGFjaygpDQotI2lmIF9NU0NfVkVSID49IDEyMDANCi0jcHJhZ21hIHdhcm5pbmcocG9wKQ0KLSNlbHNlDQotI3ByYWdtYSB3YXJuaW5nKGRlZmF1bHQ6NDIwMSkNCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogKERJUkVDVDNEX1ZFUlNJT04gPj0gMHgwODAwKSAqLw0KLSNlbmRpZiAvKiBfRDNEOFRZUEVTKFApX0hfICovDQotDQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvQ2FwYWJpbGl0aWVzLmNwcCBiL3NyYy9EM0Q4L0NhcGFiaWxpdGllcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2Q2OGUuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvQ2FwYWJpbGl0aWVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiQ2FwYWJpbGl0aWVzLmhwcCIKLQotI2luY2x1ZGUgIk1haW4vQ29uZmlnLmhwcCIKLQotbmFtZXNwYWNlIEQzRDgKLXsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMiA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQzMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0UzggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMTYgPSB0cnVlOwotCi0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UjVHNkI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6WDFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UjNHM0IyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSM0czQjIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI4RzhCOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlA4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UDggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJCMTBHMTBSMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQxID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDMgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQ0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMNlY1VTUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOEw4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlE4VzhWOFU4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6VjE2VTE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJXMTBWMTBVMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0TDQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOEw4ID0gdHJ1ZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSNUc2QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlgxUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlIzRzNCMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSM0czQjIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSOEc4QjggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpYOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UDggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFA4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMkIxMEcxMFIxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMyA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDZWNVU1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpYOEw4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UThXOFY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlYxNlUxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJXMTBWMTBVMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Okw4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBNEw0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOEw4ID0gdHJ1ZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6WDFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkExUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjNHM0IyID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QThSM0czQjIgPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QThSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6WDhCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTJCMTBHMTBSMTAgPSB0cnVlOwotCi0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDMyID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0UzggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRYOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQxNiA9IGZhbHNlOwotCi0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjVHNkI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjNHM0IyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThSM0czQjIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlI4RzhCOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlA4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UDggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJCMTBHMTBSMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQxID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDMgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQ0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMNlY1VTUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOEw4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlE4VzhWOFU4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjE2VTE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJXMTBWMTBVMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE0TDQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOEw4ID0gdHJ1ZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI1RzZCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlgxUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzRzNCMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4UjNHM0IyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSOEc4QjggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpQOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFA4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkcxNlIxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQzID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpWOFU4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6TDZWNVU1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhMOFY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpROFc4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlYxNlUxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyVzEwVjEwVTEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6TDggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBNEw0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThMOCA9IHRydWU7Ci0KLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMiA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QThCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMiA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFM4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0WDggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMTYgPSBmYWxzZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlI1RzZCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlgxUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlIzRzNCMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UjNHM0IyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6WDRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSOEc4QjggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QThCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpQOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFA4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkcxNlIxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUMSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQzID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpWOFU4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6TDZWNVU1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhMOFY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpROFc4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlYxNlUxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyVzEwVjEwVTEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6TDggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNEw0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QThMOCA9IHRydWU7Ci0KLQl1bnNpZ25lZCBpbnQgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCA0KTsKLQl1bnNpZ25lZCBpbnQgdmVydGV4U2hhZGVyVmVyc2lvbiA9IEQzRFZTX1ZFUlNJT04oMSwgMSk7Ci0KLQl1bnNpZ25lZCBpbnQgdGV4dHVyZU1lbW9yeSA9IDI1NiAqIDEwMjQgKiAxMDI0OwotCXVuc2lnbmVkIGludCBtYXhBbmlzb3Ryb3B5ID0gMTY7Ci19CmRpZmYgLS1naXQgYS9zcmMvRDNEOC9DYXBhYmlsaXRpZXMuaHBwIGIvc3JjL0QzRDgvQ2FwYWJpbGl0aWVzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4MGUzOC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9DYXBhYmlsaXRpZXMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOF9DYXBhYmlsaXRpZXNfaHBwCi0jZGVmaW5lIEQzRDhfQ2FwYWJpbGl0aWVzX2hwcAotCi0jaW5jbHVkZSA8ZDNkOC5oPgotCi1uYW1lc3BhY2UgRDNEOAotewotCXN0cnVjdCBDYXBhYmlsaXRpZXMKLQl7Ci0JCXN0cnVjdCBTdXJmYWNlCi0JCXsKLQkJCXN0cnVjdCBSZW5kZXJUYXJnZXQKLQkJCXsKLQkJCQlzdGF0aWMgYm9vbCBSOEc4Qjg7Ci0JCQkJc3RhdGljIGJvb2wgUjVHNkI1OwotCQkJCXN0YXRpYyBib29sIFgxUjVHNUI1OwotCQkJCXN0YXRpYyBib29sIEExUjVHNUI1OwotCQkJCXN0YXRpYyBib29sIEE0UjRHNEI0OwotCQkJCXN0YXRpYyBib29sIFIzRzNCMjsKLQkJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsKLQkJCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsKLQkJCQlzdGF0aWMgYm9vbCBBOFI4RzhCODsKLQkJCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsKLQkJCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsKLQkJCQlzdGF0aWMgYm9vbCBYOEI4RzhSODsKLQkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQkJc3RhdGljIGJvb2wgRzE2UjE2OwotCQkJCXN0YXRpYyBib29sIEEyQjEwRzEwUjEwOwotCQkJfTsKLQotCQkJc3RydWN0IERlcHRoU3RlbmNpbAotCQkJewotCQkJCXN0YXRpYyBib29sIEQzMjsKLQkJCQlzdGF0aWMgYm9vbCBEMjRTODsKLQkJCQlzdGF0aWMgYm9vbCBEMjRYODsKLQkJCQlzdGF0aWMgYm9vbCBEMTY7Ci0JCQl9OwotCi0JCQlzdGF0aWMgYm9vbCBBODsKLQkJCXN0YXRpYyBib29sIFI1RzZCNTsKLQkJCXN0YXRpYyBib29sIFgxUjVHNUI1OwotCQkJc3RhdGljIGJvb2wgQTFSNUc1QjU7Ci0JCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKLQkJCXN0YXRpYyBib29sIFIzRzNCMjsKLQkJCXN0YXRpYyBib29sIEE4UjNHM0IyOwotCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7Ci0JCQlzdGF0aWMgYm9vbCBSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsKLQkJCXN0YXRpYyBib29sIEE4UjhHOEI4OwotCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7Ci0JCQlzdGF0aWMgYm9vbCBYOEI4RzhSODsKLQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFA4OwotCQkJc3RhdGljIGJvb2wgQThQODsKLQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIEcxNlIxNjsKLQkJCXN0YXRpYyBib29sIEEyQjEwRzEwUjEwOwotCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBEWFQxOwotCQkJc3RhdGljIGJvb2wgRFhUMjsKLQkJCXN0YXRpYyBib29sIERYVDM7Ci0JCQlzdGF0aWMgYm9vbCBEWFQ0OwotCQkJc3RhdGljIGJvb2wgRFhUNTsKLQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBMNlY1VTU7Ci0JCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsKLQkJCXN0YXRpYyBib29sIFE4VzhWOFU4OwotCQkJc3RhdGljIGJvb2wgVjE2VTE2OwotCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7Ci0JCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgTDg7Ci0JCQlzdGF0aWMgYm9vbCBBNEw0OwotCQkJc3RhdGljIGJvb2wgQThMODsKLQkJfTsKLQotCQlzdHJ1Y3QgVm9sdW1lCi0JCXsKLQkJCXN0YXRpYyBib29sIEE4OwotCQkJc3RhdGljIGJvb2wgUjVHNkI1OwotCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7Ci0JCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKLQkJCXN0YXRpYyBib29sIEE0UjRHNEI0OwotCQkJc3RhdGljIGJvb2wgUjNHM0IyOwotCQkJc3RhdGljIGJvb2wgQThSM0czQjI7Ci0JCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsKLQkJCXN0YXRpYyBib29sIFI4RzhCODsKLQkJCXN0YXRpYyBib29sIFg4UjhHOEI4OwotCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsKLQkJCXN0YXRpYyBib29sIFg4QjhHOFI4OwotCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgUDg7Ci0JCQlzdGF0aWMgYm9vbCBBOFA4OwotCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgRzE2UjE2OwotCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7Ci0JCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIERYVDE7Ci0JCQlzdGF0aWMgYm9vbCBEWFQyOwotCQkJc3RhdGljIGJvb2wgRFhUMzsKLQkJCXN0YXRpYyBib29sIERYVDQ7Ci0JCQlzdGF0aWMgYm9vbCBEWFQ1OwotCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgVjhVODsKLQkJCXN0YXRpYyBib29sIEw2VjVVNTsKLQkJCXN0YXRpYyBib29sIFg4TDhWOFU4OwotCQkJc3RhdGljIGJvb2wgUThXOFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBWMTZVMTY7Ci0JCQlzdGF0aWMgYm9vbCBBMlcxMFYxMFUxMDsKLQkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBMODsKLQkJCXN0YXRpYyBib29sIEE0TDQ7Ci0JCQlzdGF0aWMgYm9vbCBBOEw4OwotCQl9OwotCi0JCXN0cnVjdCBDdWJlTWFwCi0JCXsKLQkJCXN0cnVjdCBSZW5kZXJUYXJnZXQKLQkJCXsKLQkJCQlzdGF0aWMgYm9vbCBSOEc4Qjg7Ci0JCQkJc3RhdGljIGJvb2wgUjVHNkI1OwotCQkJCXN0YXRpYyBib29sIFgxUjVHNUI1OwotCQkJCXN0YXRpYyBib29sIEExUjVHNUI1OwotCQkJCXN0YXRpYyBib29sIEE0UjRHNEI0OwotCQkJCXN0YXRpYyBib29sIFIzRzNCMjsKLQkJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsKLQkJCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsKLQkJCQlzdGF0aWMgYm9vbCBBOFI4RzhCODsKLQkJCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsKLQkJCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsKLQkJCQlzdGF0aWMgYm9vbCBYOEI4RzhSODsKLQkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQkJc3RhdGljIGJvb2wgRzE2UjE2OwotCQkJCXN0YXRpYyBib29sIEEyQjEwRzEwUjEwOwotCQkJfTsKLQotCQkJc3RydWN0IERlcHRoU3RlbmNpbAotCQkJewotCQkJCXN0YXRpYyBib29sIEQzMjsKLQkJCQlzdGF0aWMgYm9vbCBEMjRTODsKLQkJCQlzdGF0aWMgYm9vbCBEMjRYODsKLQkJCQlzdGF0aWMgYm9vbCBEMTY7Ci0JCQl9OwotCi0JCQlzdGF0aWMgYm9vbCBBODsKLQkJCXN0YXRpYyBib29sIFI1RzZCNTsKLQkJCXN0YXRpYyBib29sIFgxUjVHNUI1OwotCQkJc3RhdGljIGJvb2wgQTFSNUc1QjU7Ci0JCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKLQkJCXN0YXRpYyBib29sIFIzRzNCMjsKLQkJCXN0YXRpYyBib29sIEE4UjNHM0IyOwotCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7Ci0JCQlzdGF0aWMgYm9vbCBSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsKLQkJCXN0YXRpYyBib29sIEE4UjhHOEI4OwotCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7Ci0JCQlzdGF0aWMgYm9vbCBYOEI4RzhSODsKLQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFA4OwotCQkJc3RhdGljIGJvb2wgQThQODsKLQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIEcxNlIxNjsKLQkJCXN0YXRpYyBib29sIEEyQjEwRzEwUjEwOwotCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBEWFQxOwotCQkJc3RhdGljIGJvb2wgRFhUMjsKLQkJCXN0YXRpYyBib29sIERYVDM7Ci0JCQlzdGF0aWMgYm9vbCBEWFQ0OwotCQkJc3RhdGljIGJvb2wgRFhUNTsKLQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBMNlY1VTU7Ci0JCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsKLQkJCXN0YXRpYyBib29sIFE4VzhWOFU4OwotCQkJc3RhdGljIGJvb2wgVjE2VTE2OwotCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7Ci0JCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgTDg7Ci0JCQlzdGF0aWMgYm9vbCBBNEw0OwotCQkJc3RhdGljIGJvb2wgQThMODsKLQkJfTsKLQotCQlzdHJ1Y3QgVm9sdW1lVGV4dHVyZQotCQl7Ci0JCQlzdGF0aWMgYm9vbCBBODsKLQkJCXN0YXRpYyBib29sIFI1RzZCNTsKLQkJCXN0YXRpYyBib29sIFgxUjVHNUI1OwotCQkJc3RhdGljIGJvb2wgQTFSNUc1QjU7Ci0JCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKLQkJCXN0YXRpYyBib29sIFIzRzNCMjsKLQkJCXN0YXRpYyBib29sIEE4UjNHM0IyOwotCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7Ci0JCQlzdGF0aWMgYm9vbCBSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsKLQkJCXN0YXRpYyBib29sIEE4UjhHOEI4OwotCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7Ci0JCQlzdGF0aWMgYm9vbCBYOEI4RzhSODsKLQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFA4OwotCQkJc3RhdGljIGJvb2wgQThQODsKLQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIEcxNlIxNjsKLQkJCXN0YXRpYyBib29sIEEyQjEwRzEwUjEwOwotCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBEWFQxOwotCQkJc3RhdGljIGJvb2wgRFhUMjsKLQkJCXN0YXRpYyBib29sIERYVDM7Ci0JCQlzdGF0aWMgYm9vbCBEWFQ0OwotCQkJc3RhdGljIGJvb2wgRFhUNTsKLQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBMNlY1VTU7Ci0JCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsKLQkJCXN0YXRpYyBib29sIFE4VzhWOFU4OwotCQkJc3RhdGljIGJvb2wgVjE2VTE2OwotCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7Ci0JCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgTDg7Ci0JCQlzdGF0aWMgYm9vbCBBNEw0OwotCQkJc3RhdGljIGJvb2wgQThMODsKLQkJfTsKLQotCQlzdHJ1Y3QgVGV4dHVyZQotCQl7Ci0JCQlzdHJ1Y3QgUmVuZGVyVGFyZ2V0Ci0JCQl7Ci0JCQkJc3RhdGljIGJvb2wgUjhHOEI4OwotCQkJCXN0YXRpYyBib29sIFI1RzZCNTsKLQkJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKLQkJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKLQkJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKLQkJCQlzdGF0aWMgYm9vbCBSM0czQjI7Ci0JCQkJc3RhdGljIGJvb2wgQThSM0czQjI7Ci0JCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7Ci0JCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7Ci0JCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7Ci0JCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7Ci0JCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7Ci0JCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJCXN0YXRpYyBib29sIEcxNlIxNjsKLQkJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKLQkJCX07Ci0KLQkJCXN0cnVjdCBEZXB0aFN0ZW5jaWwKLQkJCXsKLQkJCQlzdGF0aWMgYm9vbCBEMzI7Ci0JCQkJc3RhdGljIGJvb2wgRDI0Uzg7Ci0JCQkJc3RhdGljIGJvb2wgRDI0WDg7Ci0JCQkJc3RhdGljIGJvb2wgRDE2OwotCQkJfTsKLQotCQkJc3RhdGljIGJvb2wgQTg7Ci0JCQlzdGF0aWMgYm9vbCBSNUc2QjU7Ci0JCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKLQkJCXN0YXRpYyBib29sIEExUjVHNUI1OwotCQkJc3RhdGljIGJvb2wgQTRSNEc0QjQ7Ci0JCQlzdGF0aWMgYm9vbCBSM0czQjI7Ci0JCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsKLQkJCXN0YXRpYyBib29sIFg0UjRHNEI0OwotCQkJc3RhdGljIGJvb2wgUjhHOEI4OwotCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBBOFI4RzhCODsKLQkJCXN0YXRpYyBib29sIEE4QjhHOFI4OwotCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7Ci0JCQkvLyBQYWxldHRlZCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBQODsKLQkJCXN0YXRpYyBib29sIEE4UDg7Ci0JCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBHMTZSMTY7Ci0JCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKLQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgRFhUMTsKLQkJCXN0YXRpYyBib29sIERYVDI7Ci0JCQlzdGF0aWMgYm9vbCBEWFQzOwotCQkJc3RhdGljIGJvb2wgRFhUNDsKLQkJCXN0YXRpYyBib29sIERYVDU7Ci0JCQkvLyBCdW1wIG1hcCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBWOFU4OwotCQkJc3RhdGljIGJvb2wgTDZWNVU1OwotCQkJc3RhdGljIGJvb2wgWDhMOFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBROFc4VjhVODsKLQkJCXN0YXRpYyBib29sIFYxNlUxNjsKLQkJCXN0YXRpYyBib29sIEEyVzEwVjEwVTEwOwotCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIEw4OwotCQkJc3RhdGljIGJvb2wgQTRMNDsKLQkJCXN0YXRpYyBib29sIEE4TDg7Ci0JCX07Ci0JfTsKLQotCWV4dGVybiB1bnNpZ25lZCBpbnQgcGl4ZWxTaGFkZXJWZXJzaW9uOwotCWV4dGVybiB1bnNpZ25lZCBpbnQgdmVydGV4U2hhZGVyVmVyc2lvbjsKLQotCWV4dGVybiB1bnNpZ25lZCBpbnQgdGV4dHVyZU1lbW9yeTsKLQlleHRlcm4gdW5zaWduZWQgaW50IG1heEFuaXNvdHJvcHk7Ci19Ci0KLSNlbmRpZiAgIC8vIEQzRDhfQ2FwYWJpbGl0aWVzX2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRDNEOC5jcHAgYi9zcmMvRDNEOC9EM0Q4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3ZTQ4Yi4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EM0Q4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0Q4LmhwcCIKLQotI2luY2x1ZGUgInJlc291cmNlLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1leHRlcm4gIkMiCi17Ci0JSElOU1RBTkNFIGRsbEluc3RhbmNlOwotCi0JaW50CV9fc3RkY2FsbCBEbGxNYWluKEhJTlNUQU5DRQlpbnN0YW5jZSwgdW5zaWduZWQgbG9uZwlyZWFzb24sCXZvaWQgKnJlc2VydmVkKQotCXsKLQkJZGxsSW5zdGFuY2UJPSBpbnN0YW5jZTsKLQotCQlzd2l0Y2gocmVhc29uKQotCQl7Ci0JCWNhc2UgRExMX1BST0NFU1NfREVUQUNIOgotCQkJYnJlYWs7Ci0JCWNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgotCQkJRGlzYWJsZVRocmVhZExpYnJhcnlDYWxscyhpbnN0YW5jZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBETExfVEhSRUFEX0FUVEFDSDoKLQkJCWJyZWFrOwotCQljYXNlIERMTF9USFJFQURfREVUQUNIOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JSURpcmVjdDNEOCAqX19zdGRjYWxsIERpcmVjdDNEQ3JlYXRlOCh1bnNpZ25lZCBpbnQgdmVyc2lvbikKLQl7Ci0JCS8vIEQzRF9TREtfVkVSU0lPTiBjaGVjawotCQlpZih2ZXJzaW9uICE9IDEyMCAmJiAgIC8vIDguMAotCQkgICB2ZXJzaW9uICE9IDIyMCkgICAgIC8vIDguMQotCQl7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkKLQkJI2lmbmRlZiBOREVCVUcKLQkJCUZJTEUgKmZpbGUgPSBmb3BlbigiZGVidWcudHh0IiwgInciKTsgICAvLyBDbGVhciBkZWJ1ZyBsb2cKLQkJCWZjbG9zZShmaWxlKTsKLQkJI2VuZGlmCi0KLQkJSURpcmVjdDNEOCAqZGV2aWNlID0gbmV3IEQzRDg6OkRpcmVjdDNEOCh2ZXJzaW9uLCBkbGxJbnN0YW5jZSk7Ci0KLQkJaWYoZGV2aWNlKQotCQl7Ci0JCQlkZXZpY2UtPkFkZFJlZigpOwotCQl9Ci0KLQkJcmV0dXJuIGRldmljZTsKLQl9Ci0KLQlpbnQgX19zdGRjYWxsIENoZWNrRnVsbHNjcmVlbigpICAgLy8gRklYTUU6IF9fY2RlY2wgb3IgX19zdGRjYWxsPwotCXsKLQkJI2lmbmRlZiBOREVCVUcKLQkJLy8JQVNTRVJUKGZhbHNlKTsgICAvLyBGSVhNRQotCQkjZW5kaWYKLQotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0gICAgdm9pZCBfX2NkZWNsIERlYnVnU2V0TXV0ZShsb25nIG11dGUpICAgLy8gRklYTUU6IFJldHVybiB0eXBlCi0JewotCS8vCUFTU0VSVChmYWxzZSk7ICAgLy8gRklYTUUKLQl9Ci0KLSAgICBpbnQgX19zdGRjYWxsIFZhbGlkYXRlUGl4ZWxTaGFkZXIobG9uZyAqc2hhZGVyLCBpbnQgeCwgaW50IHksIGludCB6KSAgIC8vIEZJWE1FOiBfX2NkZWNsIG9yIF9fc3RkY2FsbD8gICAvLyBGSVhNRTogQXJndW1lbnQgbWVhbmluZ3MKLQl7Ci0JLy8JQVNTRVJUKGZhbHNlKTsgICAvLyBGSVhNRQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotICAgIGludCBfX3N0ZGNhbGwgVmFsaWRhdGVWZXJ0ZXhTaGFkZXIobG9uZyAqc2hhZGVyLCBpbnQgeCwgaW50IHksIGludCB6KSAgIC8vIEZJWE1FOiBfX2NkZWNsIG9yIF9fc3RkY2FsbD8gICAvLyBGSVhNRTogQXJndW1lbnQgbWVhbmluZ3MKLQl7Ci0JLy8JQVNTRVJUKGZhbHNlKTsgICAvLyBGSVhNRQotCi0JCXJldHVybiBUUlVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0QzRDgucmMgYi9zcmMvRDNEOC9EM0Q4LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBhM2Y3Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0QzRDgucmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0LgotLy8KLSNpbmNsdWRlICJyZXNvdXJjZTEuaCIKLQotI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLgotLy8KLSNpbmNsdWRlICJXaW5kb3dzLmgiCi0jaW5jbHVkZSAiLi4vQ29tbW9uL1ZlcnNpb24uaCIKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykgcmVzb3VyY2VzCi0KLSNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkKLUxBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTCi0jcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQotCi0jaWZkZWYgQVBTVFVESU9fSU5WT0tFRAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBURVhUSU5DTFVERQotLy8KLQotMSBURVhUSU5DTFVERSAKLUJFR0lOCi0gICAgInJlc291cmNlMS5oXDAiCi1FTkQKLQotMiBURVhUSU5DTFVERSAKLUJFR0lOCi0gICAgIiNpbmNsdWRlICIiYWZ4cmVzLmgiIlxyXG4iCi0gICAgIiNpbmNsdWRlICIiLi4vQ29tbW9uL1ZlcnNpb24uaCIiXDAiCi1FTkQKLQotMyBURVhUSU5DTFVERSAKLUJFR0lOCi0gICAgIlwwIgotRU5ECi0KLSNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBWZXJzaW9uCi0vLwotCi1WU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KLSBGSUxFVkVSU0lPTiBNQUpPUl9WRVJTSU9OLE1JTk9SX1ZFUlNJT04sQlVJTERfVkVSU0lPTixCVUlMRF9SRVZJU0lPTgotIFBST0RVQ1RWRVJTSU9OIE1BSk9SX1ZFUlNJT04sTUlOT1JfVkVSU0lPTixCVUlMRF9WRVJTSU9OLEJVSUxEX1JFVklTSU9OCi0gRklMRUZMQUdTTUFTSyAweDFmTAotI2lmZGVmIF9ERUJVRwotIEZJTEVGTEFHUyAweDlMCi0jZWxzZQotIEZJTEVGTEFHUyAweDhMCi0jZW5kaWYKLSBGSUxFT1MgMHg0TAotIEZJTEVUWVBFIDB4MkwKLSBGSUxFU1VCVFlQRSAweDBMCi1CRUdJTgotICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKLSAgICBCRUdJTgotICAgICAgICBCTE9DSyAiMDQwOTA0YjAiCi0gICAgICAgIEJFR0lOCi0JCQlWQUxVRSAiQ29tcGFueU5hbWUiLCAiR29vZ2xlIEluYy4iCi0gICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIlN3aWZ0U2hhZGVyIERpcmVjdDNEIDggUmVuZGVyZXIiCi0gICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCBWRVJTSU9OX1NUUklORwotICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJEM0Q4IgotCQkJVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoQykgMjAxNiBHb29nbGUgSW5jLiIKLSAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImQzZDguZGxsIgotICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsIFJFVklTSU9OX1NUUklORwotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlN3aWZ0U2hhZGVyIERpcmVjdDNEIDggUmVuZGVyZXIiCi0gICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCBWRVJTSU9OX1NUUklORwotICAgICAgICBFTkQKLSAgICBFTkQKLSAgICBCTE9DSyAiVmFyRmlsZUluZm8iCi0gICAgQkVHSU4KLSAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKLSAgICBFTkQKLUVORAotCi0jZW5kaWYgICAgLy8gRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykgcmVzb3VyY2VzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RlYnVnLmNwcCBiL3NyYy9EM0Q4L0RlYnVnLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkZWVkYy4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EZWJ1Zy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0vLw0KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0vLw0KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLS8vDQotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSNpbmNsdWRlICJEZWJ1Zy5ocHAiDQotDQotaW50IFRyYWNlOjppbmRlbnQgPSAwOw0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RlYnVnLmhwcCBiL3NyYy9EM0Q4L0RlYnVnLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwYzg2Yy4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EZWJ1Zy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEZWJ1Z19ocHAKLSNkZWZpbmUgRGVidWdfaHBwCi0KLSNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotCSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2VuZGlmCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPGQzZDguaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGd1aWRkZWYuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZSBBUFBFTkQoeCwgeSkgeCAjIyB5Ci0jZGVmaW5lIE1BQ1JPX0FQUEVORCh4LCB5KSBBUFBFTkQoeCwgeSkKLSNkZWZpbmUgVU5JUVVFX0lERU5USUZJRVIocHJlZml4KSBNQUNST19BUFBFTkQocHJlZml4LCBfX0NPVU5URVJfXykKLQotc3RydWN0IFRyYWNlCi17Ci0JVHJhY2UoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JewotCQlpZihmYWxzZSkKLQkJewotCQkJRklMRSAqZmlsZSA9IGZvcGVuKCJkZWJ1Zy50eHQiLCAiYSIpOwotCi0JCQlpZihmaWxlKQotCQkJewotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgZnByaW50ZihmaWxlLCAiICIpOwotCi0JCQkJdmFfbGlzdCB2YXJhcmc7Ci0JCQkJdmFfc3RhcnQodmFyYXJnLCBmb3JtYXQpOwotCQkJCXZmcHJpbnRmKGZpbGUsIGZvcm1hdCwgdmFyYXJnKTsKLQkJCQl2YV9lbmQodmFyYXJnKTsKLQotCQkJCWZjbG9zZShmaWxlKTsKLQkJCX0KLQkJfQotCi0JCWluZGVudCsrOwotCX0KLQotCX5UcmFjZSgpCi0JewotCQlpbmRlbnQtLTsKLQl9Ci0KLQlzdGF0aWMgaW50IGluZGVudDsKLX07Ci0KLSNpZm5kZWYgTkRFQlVHCi0JI2RlZmluZSBUUkFDRShmb3JtYXQsIC4uLikgVHJhY2UgVU5JUVVFX0lERU5USUZJRVIoX3RyYWNlcl8pKCJbMHglMC44WF0lcygiZm9ybWF0IilcbiIsIHRoaXMsIF9fRlVOQ1RJT05fXywgX19WQV9BUkdTX18pCi0JI2RlZmluZSBHVFJBQ0UoZm9ybWF0LCAuLi4pIFRyYWNlKCIlcygiZm9ybWF0IilcbiIsIF9fRlVOQ1RJT05fXywgX19WQV9BUkdTX18pCi0jZWxzZQotCSNkZWZpbmUgVFJBQ0UoLi4uKSAoKHZvaWQpMCkKLQkjZGVmaW5lIEdUUkFDRSguLi4pICgodm9pZCkwKQotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0JI2RlZmluZSBBU1NFUlQoZXhwcmVzc2lvbikge2lmKCEoZXhwcmVzc2lvbikpIFRyYWNlKCJcdCEgQXNzZXJ0IGZhaWxlZCBpbiAlcyglZCk6ICIjZXhwcmVzc2lvbiJcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBhc3NlcnQoZXhwcmVzc2lvbik7fQotI2Vsc2UKLQkjZGVmaW5lIEFTU0VSVCBhc3NlcnQKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotCSNkZWZpbmUgVU5JTVBMRU1FTlRFRCgpIHtUcmFjZSgiXHQhIFVuaW1wbGVtZW50ZWQ6ICVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IEFTU0VSVChmYWxzZSk7fQotI2Vsc2UKLQkjZGVmaW5lIFVOSU1QTEVNRU5URUQoKSAoKHZvaWQpMCkKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotCSNkZWZpbmUgTk9JTlRFUkZBQ0UoaWlkKSBfTk9JTlRFUkZBQ0UoX19GVU5DVElPTl9fLCBpaWQpCi0KLQlpbmxpbmUgbG9uZyBfTk9JTlRFUkZBQ0UoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IElJRCAmaWlkKQotCXsKLQkJVHJhY2UoIlx0ISBObyBpbnRlcmZhY2UgezB4JTAuOFgsIDB4JTAuNFgsIDB4JTAuNFgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlh9IGZvciAlc1xuIiwgaWlkLkRhdGExLCBpaWQuRGF0YTIsIGlpZC5EYXRhMywgaWlkLkRhdGE0WzBdLCBpaWQuRGF0YTRbMV0sIGlpZC5EYXRhNFsyXSwgaWlkLkRhdGE0WzNdLCBpaWQuRGF0YTRbNF0sIGlpZC5EYXRhNFs1XSwgaWlkLkRhdGE0WzZdLCBpaWQuRGF0YTRbN10sIGZ1bmN0aW9uKTsKLQotCQlyZXR1cm4gRV9OT0lOVEVSRkFDRTsKLQl9Ci0jZWxzZQotCSNkZWZpbmUgTk9JTlRFUkZBQ0UoaWlkKSBFX05PSU5URVJGQUNFCi0jZW5kaWYKLQotI2lmbmRlZiBOREVCVUcKLQlpbmxpbmUgbG9uZyBJTlZBTElEQ0FMTCgpCi0JewotCQlUcmFjZSgiXHQhIEQzREVSUl9JTlZBTElEQ0FMTFxuIik7Ci0KLQkJcmV0dXJuIEQzREVSUl9JTlZBTElEQ0FMTDsKLQl9Ci0jZWxzZQotCSNkZWZpbmUgSU5WQUxJRENBTEwoKSBEM0RFUlJfSU5WQUxJRENBTEwKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotCWlubGluZSBsb25nIE9VVE9GTUVNT1JZKCkKLQl7Ci0JCVRyYWNlKCJcdCEgRV9PVVRPRk1FTU9SWVxuIik7Ci0KLQkJcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0JfQotI2Vsc2UKLQkjZGVmaW5lIE9VVE9GTUVNT1JZKCkgRV9PVVRPRk1FTU9SWQotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0JaW5saW5lIGxvbmcgT1VUT0ZWSURFT01FTU9SWSgpCi0JewotCQlUcmFjZSgiXHQhIEQzREVSUl9PVVRPRlZJREVPTUVNT1JZXG4iKTsKLQotCQlyZXR1cm4gRDNERVJSX09VVE9GVklERU9NRU1PUlk7Ci0JfQotI2Vsc2UKLQkjZGVmaW5lIE9VVE9GVklERU9NRU1PUlkoKSBEM0RFUlJfT1VUT0ZWSURFT01FTU9SWQotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0JaW5saW5lIGxvbmcgTk9UQVZBSUxBQkxFKCkKLQl7Ci0JCVRyYWNlKCJcdCEgRDNERVJSX05PVEFWQUlMQUJMRVxuIik7Ci0KLQkJcmV0dXJuIEQzREVSUl9OT1RBVkFJTEFCTEU7Ci0JfQotI2Vsc2UKLQkjZGVmaW5lIE5PVEFWQUlMQUJMRSgpIEQzREVSUl9OT1RBVkFJTEFCTEUKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotCWlubGluZSBsb25nIE5PVEZPVU5EKCkKLQl7Ci0JCVRyYWNlKCJcdCEgRDNERVJSX05PVEZPVU5EXG4iKTsKLQotCQlyZXR1cm4gRDNERVJSX05PVEZPVU5EOwotCX0KLSNlbHNlCi0JI2RlZmluZSBOT1RGT1VORCgpIEQzREVSUl9OT1RGT1VORAotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0JaW5saW5lIGxvbmcgTU9SRURBVEEoKQotCXsKLQkJVHJhY2UoIlx0ISBEM0RFUlJfTU9SRURBVEFcbiIpOwotCi0JCXJldHVybiBEM0RFUlJfTU9SRURBVEE7Ci0JfQotI2Vsc2UKLQkjZGVmaW5lIE1PUkVEQVRBKCkgRDNERVJSX01PUkVEQVRBCi0jZW5kaWYKLQotI2lmbmRlZiBOREVCVUcKLQlpbmxpbmUgbG9uZyBGQUlMKCkKLQl7Ci0JCVRyYWNlKCJcdCEgRV9GQUlMXG4iKTsKLQotCQlyZXR1cm4gRV9GQUlMOwotCX0KLSNlbHNlCi0JI2RlZmluZSBGQUlMKCkgRV9GQUlMCi0jZW5kaWYKLQotI2VuZGlmICAgLy8gRGVidWdfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRDguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0Q4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjZTAyMC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzRDguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0Q4LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOC5ocHAiCi0jaW5jbHVkZSAiQ2FwYWJpbGl0aWVzLmhwcCIKLSNpbmNsdWRlICJDb25maWd1cmF0b3IuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLSNpbmNsdWRlICJDUFVJRC5ocHAiCi0jaW5jbHVkZSAiVmVyc2lvbi5oIgotI2luY2x1ZGUgIkNvbmZpZy5ocHAiCi0KLSNkZWZpbmUgQ09NUElMRV9NVUxUSU1PTl9TVFVCUwotI2luY2x1ZGUgPG11bHRpbW9uLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JRGlyZWN0M0Q4OjpEaXJlY3QzRDgoaW50IHZlcnNpb24sIGNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZSkgOiB2ZXJzaW9uKHZlcnNpb24pLCBpbnN0YW5jZShpbnN0YW5jZSkKLQl7Ci0JCWRpc3BsYXlNb2RlID0gMDsKLQkJbnVtRGlzcGxheU1vZGVzID0gMDsKLQotCQlERVZNT0RFIGRldm1vZGU7Ci0JCWRldm1vZGUuZG1TaXplID0gc2l6ZW9mKERFVk1PREUpOwotCi0JCS8vIENvdW50IG51bWJlciBvZiBkaXNwbGF5IG1vZGVzCi0JCXdoaWxlKEVudW1EaXNwbGF5U2V0dGluZ3MoMCwgbnVtRGlzcGxheU1vZGVzLCAmZGV2bW9kZSkpCi0JCXsKLQkJCW51bURpc3BsYXlNb2RlcysrOwotCQl9Ci0KLQkJZGlzcGxheU1vZGUgPSBuZXcgREVWTU9ERVtudW1EaXNwbGF5TW9kZXNdOwotCi0JCS8vIFN0b3JlIGRpc3BsYXkgbW9kZXMgaW5mb3JtYXRpb24KLQkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQotCQl7Ci0JCQlkaXNwbGF5TW9kZVtpXS5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7Ci0JCQlFbnVtRGlzcGxheVNldHRpbmdzKDAsIGksICZkaXNwbGF5TW9kZVtpXSk7Ci0JCX0KLQotCQlkM2Q4TGliID0gMDsKLQkJZDNkOCA9IDA7Ci0KLQkJc3c6OkNvbmZpZ3VyYXRvciBpbmkoIlN3aWZ0U2hhZGVyLmluaSIpOwotCi0JCWludCBwcyA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiUGl4ZWxTaGFkZXJWZXJzaW9uIiwgMTQpOwotCQlpbnQgdnMgPSBpbmkuZ2V0SW50ZWdlcigiQ2FwYWJpbGl0aWVzIiwgIlZlcnRleFNoYWRlclZlcnNpb24iLCAxMSk7Ci0KLQkJICAgICBpZihwcyA9PSAgMCkgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigwLCAwKTsKLQkJZWxzZSBpZihwcyA8PSAxMSkgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCAxKTsKLQkJZWxzZSBpZihwcyA8PSAxMikgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCAyKTsKLQkJZWxzZSBpZihwcyA8PSAxMykgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCAzKTsKLQkJZWxzZSAgICAgICAgICAgICAgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCA0KTsKLQotCQkgICAgIGlmKHZzID09ICAwKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gRDNEVlNfVkVSU0lPTigwLCAwKTsKLQkJZWxzZSAgICAgICAgICAgICAgdmVydGV4U2hhZGVyVmVyc2lvbiA9IEQzRFZTX1ZFUlNJT04oMSwgMSk7Ci0KLQkJdGV4dHVyZU1lbW9yeSA9IDEwMjQgKiAxMDI0ICogaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJUZXh0dXJlTWVtb3J5IiwgMjU2KTsKLQl9Ci0KLQlEaXJlY3QzRDg6On5EaXJlY3QzRDgoKQotCXsKLQkJZGVsZXRlW10gZGlzcGxheU1vZGU7Ci0JCWRpc3BsYXlNb2RlID0gMDsKLQotCQlpZihkM2Q4KQotCQl7Ci0JCQlkM2Q4LT5SZWxlYXNlKCk7Ci0JCQlkM2Q4ID0gMDsKLQkJfQotCi0JCWlmKGQzZDhMaWIpCi0JCXsKLQkJCUZyZWVMaWJyYXJ5KGQzZDhMaWIpOwotCQkJZDNkOExpYiA9IDA7Ci0JCX0KLQl9Ci0KLQlsb25nIERpcmVjdDNEODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoaWlkID09IElJRF9JRGlyZWN0M0Q4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSVVua25vd24pCi0JCXsKLQkJCUFkZFJlZigpOwotCQkJKm9iamVjdCA9IHRoaXM7Ci0KLQkJCXJldHVybiBTX09LOwotCQl9Ci0KLQkJKm9iamVjdCA9IDA7Ci0KLQkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRDg6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0Q4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0Q4OjpDaGVja0RlcHRoU3RlbmNpbE1hdGNoKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBEM0RGT1JNQVQgZGVwdGhTdGVuY2lsRm9ybWF0KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCi0JCXsKLQkJCWxvYWRTeXN0ZW1EM0Q4KCk7Ci0KLQkJCWlmKGQzZDgpCi0JCQl7Ci0JCQkJcmV0dXJuIGQzZDgtPkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2goYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiBDaGVja0RlcHRoU3RlbmNpbE1hdGNoKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBhZGFwdGVyRm9ybWF0LCByZW5kZXJUYXJnZXRGb3JtYXQsIGRlcHRoU3RlbmNpbEZvcm1hdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOyAgIC8vIEFueSBmb3JtYXQgY29tYmluYXRpb24gaXMgb2sKLQl9Ci0KLQlsb25nIERpcmVjdDNEODo6Q2hlY2tEZXZpY2VGb3JtYXQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzRFJFU09VUkNFVFlQRSByZXNvdXJjZVR5cGUsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQgPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RSRVNPVVJDRVRZUEUgcmVzb3VyY2VUeXBlID0gJWQsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOwotCi0JCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCi0JCXsKLQkJCWxvYWRTeXN0ZW1EM0Q4KCk7Ci0KLQkJCWlmKGQzZDgpCi0JCQl7Ci0JCQkJcmV0dXJuIGQzZDgtPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKLQkJCX0KLQkJfQotCi0JCXN3aXRjaChyZXNvdXJjZVR5cGUpCi0JCXsKLQkJY2FzZSBEM0RSVFlQRV9TVVJGQUNFOgotCQkJaWYodXNhZ2UgJiBEM0RVU0FHRV9SRU5ERVJUQVJHRVQpCi0JCQl7Ci0JCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQotCQkJCXsKLQkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDhSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6RzE2UjE2KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTJCMTBHMTBSMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKHVzYWdlICYgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKQotCQkJewotCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0QyNFM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0UzgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0WDg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRYOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCi0JCQkJewotCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlgxUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9QODoJCQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4UDg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThQOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJCMTBHMTBSMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0RYVDM6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRFhUNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQ1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9WOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Okw2VjVVNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4TDhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpROFc4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpWMTZVMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEyVzEwVjEwVTEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9MODoJCQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTRMNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJCX0KLQkJCX0KLQkJY2FzZSBEM0RSVFlQRV9WT0xVTUU6Ci0JCQlzd2l0Y2goY2hlY2tGb3JtYXQpCi0JCQl7Ci0JCQljYXNlIEQzREZNVF9BODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDFSNUc1QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkExUjVHNUI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBNFI0RzRCNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYNFI0RzRCNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKLQkJCWNhc2UgRDNERk1UX1A4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFA4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9EWFQxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDEpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQyKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0RYVDM6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMykJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9EWFQ0OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDQpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRFhUNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQ1KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKLQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjhVOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYOEw4VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UThXOFY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkEyVzEwVjEwVTEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJY2FzZSBEM0RGTVRfTDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Okw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTRMNCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOEw4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQl9Ci0JCWNhc2UgRDNEUlRZUEVfQ1VCRVRFWFRVUkU6Ci0JCQlpZih1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKLQkJCXsKLQkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCi0JCQkJewotCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpCi0JCQl7Ci0JCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQotCQkJCXsKLQkJCQljYXNlIEQzREZNVF9EMzI6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMzIpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQyNFg4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0QxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQljYXNlIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkU6Ci0JCQlzd2l0Y2goY2hlY2tGb3JtYXQpCi0JCQl7Ci0JCQljYXNlIEQzREZNVF9BODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI1RzZCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBNFI0RzRCNCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9SM0czQjI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYNFI0RzRCNCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOFI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkvLyBQYWxldHRlZCBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9QODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlA4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFA4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFA4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkcxNlIxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyQjEwRzEwUjEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9EWFQxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQxKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9EWFQyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQyKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9EWFQzOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQzKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9EWFQ0OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQ0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9EWFQ1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQ1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkvLyBCdW1wIG1hcCBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9WOFU4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Okw2VjVVNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEw4VjhVOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpROFc4VjhVOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlYxNlUxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyVzEwVjEwVTEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKLQkJCWNhc2UgRDNERk1UX0w4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6TDgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE0TDQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4TDgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfQotCQljYXNlIEQzRFJUWVBFX1RFWFRVUkU6Ci0JCQlpZih1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKLQkJCXsKLQkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCi0JCQkJewotCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpCi0JCQl7Ci0JCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQotCQkJCXsKLQkJCQljYXNlIEQzREZNVF9EMzI6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMzIpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0QxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQljYXNlIEQzRFJUWVBFX1ZFUlRFWEJVRkZFUjoKLQkJCWlmKGNoZWNrRm9ybWF0ID09IEQzREZNVF9WRVJURVhEQVRBKQotCQkJewotCQkJCXJldHVybiBEM0RfT0s7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfQotCQljYXNlIEQzRFJUWVBFX0lOREVYQlVGRkVSOgotCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQotCQkJewotCQkJY2FzZSBEM0RGTVRfSU5ERVgxNjoKLQkJCWNhc2UgRDNERk1UX0lOREVYMzI6Ci0JCQkJcmV0dXJuIEQzRF9PSzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJfQotCX0KLQotCWxvbmcgRGlyZWN0M0Q4OjpDaGVja0RldmljZU11bHRpU2FtcGxlVHlwZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgc3VyZmFjZUZvcm1hdCwgaW50IHdpbmRvd2VkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQotCQl7Ci0JCQlsb2FkU3lzdGVtRDNEOCgpOwotCi0JCQlpZihkM2Q4KQotCQkJewotCQkJCXJldHVybiBkM2Q4LT5DaGVja0RldmljZU11bHRpU2FtcGxlVHlwZShhZGFwdGVyLCBkZXZpY2VUeXBlLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIHN1cmZhY2VGb3JtYXQsIHdpbmRvd2VkLCBtdWx0aVNhbXBsZVR5cGUpOwotCQkJfQotCQl9Ci0KLQkJaWYoYWRhcHRlciA+PSBHZXRBZGFwdGVyQ291bnQoKSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZihtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfTk9ORSB8fAotCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfMl9TQU1QTEVTIHx8Ci0JCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV80X1NBTVBMRVMgfHwKLQkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzhfU0FNUExFUyB8fAotCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfMTZfU0FNUExFUykKLQkJewotCQkJaWYoc3VyZmFjZUZvcm1hdCAhPSBEM0RGTVRfVU5LTk9XTikKLQkJCXsKLQkJCQlyZXR1cm4gRDNEX09LOwkKLQkJCX0KLQkJfQotCi0JCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEODo6Q2hlY2tEZXZpY2VUeXBlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGNoZWNrVHlwZSwgRDNERk9STUFUIGRpc3BsYXlGb3JtYXQsIEQzREZPUk1BVCBiYWNrQnVmZmVyRm9ybWF0LCBpbnQgd2luZG93ZWQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoY2hlY2tUeXBlICE9IEQzRERFVlRZUEVfSEFMKQotCQl7Ci0JCQlsb2FkU3lzdGVtRDNEOCgpOwotCi0JCQlpZihkM2Q4KQotCQkJewotCQkJCXJldHVybiBkM2Q4LT5DaGVja0RldmljZVR5cGUoYWRhcHRlciwgY2hlY2tUeXBlLCBkaXNwbGF5Rm9ybWF0LCBiYWNrQnVmZmVyRm9ybWF0LCB3aW5kb3dlZCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIENoZWNrRGV2aWNlVHlwZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsgICAvLyBUT0RPCi0JfQotCi0JbG9uZyBEaXJlY3QzRDg6OkNyZWF0ZURldmljZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBIV05EIGZvY3VzV2luZG93LCB1bnNpZ25lZCBsb25nIGJlaGF2aW9yRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRERldmljZTggKipyZXR1cm5lZERldmljZUludGVyZmFjZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQotCQl7Ci0JCQlsb2FkU3lzdGVtRDNEOCgpOwotCi0JCQlpZihkM2Q4KQotCQkJewotCQkJCXJldHVybiBkM2Q4LT5DcmVhdGVEZXZpY2UoYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIENyZWF0ZURldmljZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZighZm9jdXNXaW5kb3cgfHwgIXByZXNlbnRQYXJhbWV0ZXJzIHx8ICFyZXR1cm5lZERldmljZUludGVyZmFjZSkKLQkJewotCQkJKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gTlVMTDsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXN3OjpDUFVJRDo6c3VwcG9ydHNTU0UoKSkKLQkJewotCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQl9Ci0KLQkJKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gbmV3IERpcmVjdDNERGV2aWNlOChpbnN0YW5jZSwgdGhpcywgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzKTsKLQotCQlpZigqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCi0JCXsKLQkJCSgqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpLT5BZGRSZWYoKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDg6OkVudW1BZGFwdGVyTW9kZXModW5zaWduZWQgaW50IGFkYXB0ZXIsIHVuc2lnbmVkIGludCBpbmRleCwgRDNERElTUExBWU1PREUgKm1vZGUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoYWRhcHRlciAhPSBEM0RBREFQVEVSX0RFRkFVTFQgfHwgIW1vZGUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQotCQl7Ci0JCQlpZihpbmRleC0tID09IDApCi0JCQl7Ci0JCQkJbW9kZS0+V2lkdGggPSBkaXNwbGF5TW9kZVtpXS5kbVBlbHNXaWR0aDsKLQkJCQltb2RlLT5IZWlnaHQgPSBkaXNwbGF5TW9kZVtpXS5kbVBlbHNIZWlnaHQ7Ci0JCQkJbW9kZS0+UmVmcmVzaFJhdGUgPSBkaXNwbGF5TW9kZVtpXS5kbURpc3BsYXlGcmVxdWVuY3k7Ci0KLQkJCQlkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPSAzMjsgICAvLyBGSVhNRQotCi0JCQkJc3dpdGNoKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCkKLQkJCQl7Ci0JCQkJY2FzZSA0OgotCQkJCQltb2RlLT5Gb3JtYXQgPSBEM0RGTVRfQTRMNDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA4OgotCQkJCQltb2RlLT5Gb3JtYXQgPSBEM0RGTVRfUDg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTY6Ci0JCQkJCW1vZGUtPkZvcm1hdCA9IEQzREZNVF9SNUc2QjU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjQ6Ci0JCQkJCW1vZGUtPkZvcm1hdCA9IEQzREZNVF9SOEc4Qjg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzI6Ci0JCQkJCW1vZGUtPkZvcm1hdCA9IEQzREZNVF9YOFI4RzhCODsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gRDNEX09LOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JfQotCi0JdW5zaWduZWQgaW50IERpcmVjdDNEODo6R2V0QWRhcHRlckNvdW50KCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gMTsgICAvLyBTd2lmdFNoYWRlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGRpc3BsYXkgYWRhcHRlcnMKLQl9Ci0KLQlsb25nIERpcmVjdDNEODo6R2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCB8fCAhbW9kZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlIREMgZGV2aWNlQ29udGV4dCA9IEdldERDKDApOwotCQkJCi0JCW1vZGUtPldpZHRoID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIEhPUlpSRVMpOwotCQltb2RlLT5IZWlnaHQgPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgVkVSVFJFUyk7Ci0JCW1vZGUtPlJlZnJlc2hSYXRlID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIFZSRUZSRVNIKTsKLQkJdW5zaWduZWQgaW50IGJwcCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBCSVRTUElYRUwpOwotCi0JCVJlbGVhc2VEQygwLCBkZXZpY2VDb250ZXh0KTsKLQotCQlicHAgPSAzMjsgICAvLyBGSVhNRQotCi0JCXN3aXRjaChicHApCi0JCXsKLQkJY2FzZSAzMjogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1g4UjhHOEI4OyBicmVhazsKLQkJY2FzZSAyNDogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1I4RzhCODsgYnJlYWs7Ci0JCWNhc2UgMTY6IG1vZGUtPkZvcm1hdCA9IEQzREZNVF9SNUc2QjU7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJQVNTRVJUKGZhbHNlKTsgICAvLyBVbmV4cGVjdGVkIGRpc3BsYXkgbW9kZSBjb2xvciBkZXB0aAotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEODo6R2V0QWRhcHRlcklkZW50aWZpZXIodW5zaWduZWQgaW50IGFkYXB0ZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIEQzREFEQVBURVJfSURFTlRJRklFUjggKmlkZW50aWZpZXIpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWlkZW50aWZpZXIpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0JCi0JCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSAnc3cnOwotCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMzsKLQkJdW5zaWduZWQgc2hvcnQgc3ViVmVyc2lvbiA9IDA7Ci0JCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uID0gQlVJTERfUkVWSVNJT047Ci0JCUdVSUQgZ3VpZCA9IHsweDAwMDAwMDAwLCAweDAwMDAsIDB4MDAwMCwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9fTsKLQotCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247Ci0JCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uTG93UGFydCA9IHN1YlZlcnNpb24gPDwgMTYgfCByZXZpc2lvbjsKLQkJc3RyY3B5KGlkZW50aWZpZXItPkRyaXZlciwgIlN3aWZ0U2hhZGVyIik7Ci0JCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIkdvb2dsZSBTd2lmdFNoYWRlciAzRCBSZW5kZXJlciIpOwotCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDA7Ci0JCWlkZW50aWZpZXItPkRldmljZUlkID0gMDsKLQkJaWRlbnRpZmllci0+U3ViU3lzSWQgPSAwOwotCQlpZGVudGlmaWVyLT5SZXZpc2lvbiA9IDA7Ci0JCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOwotCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAwOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JdW5zaWduZWQgaW50IERpcmVjdDNEODo6R2V0QWRhcHRlck1vZGVDb3VudCh1bnNpZ25lZCBpbnQgYWRhcHRlcikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCkKLQkJewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlyZXR1cm4gbnVtRGlzcGxheU1vZGVzOwotCX0KLQotCUhNT05JVE9SIERpcmVjdDNEODo6R2V0QWRhcHRlck1vbml0b3IodW5zaWduZWQgaW50IGFkYXB0ZXIpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJUE9JTlQgcG9pbnQgPSB7MCwgMH07Ci0KLQkJcmV0dXJuIE1vbml0b3JGcm9tUG9pbnQocG9pbnQsIE1PTklUT1JfREVGQVVMVFRPUFJJTUFSWSk7ICAgLy8gRklYTUU6IElnbm9yZXMgYWRhcHRlciBwYXJhbWV0ZXIKLQl9Ci0KLQlsb25nIERpcmVjdDNEODo6R2V0RGV2aWNlQ2Fwcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RDQVBTOCAqY2FwYWJpbGl0aWVzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCi0JCXsKLQkJCWxvYWRTeXN0ZW1EM0Q4KCk7Ci0KLQkJCWlmKGQzZDgpCi0JCQl7Ci0JCQkJcmV0dXJuIGQzZDgtPkdldERldmljZUNhcHMoYWRhcHRlciwgZGV2aWNlVHlwZSwgY2FwYWJpbGl0aWVzKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gR2V0RGV2aWNlQ2FwcyhhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgY2FwYWJpbGl0aWVzKTsKLQkJCX0KLQkJfQotCi0JCWlmKCFjYXBhYmlsaXRpZXMpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRDNEQ0FQUzggY2FwczsKLQkJWmVyb01lbW9yeSgmY2Fwcywgc2l6ZW9mKEQzRENBUFM4KSk7Ci0KLQkJLy8gRGV2aWNlIGluZm8KLQkJY2Fwcy5EZXZpY2VUeXBlID0gRDNEREVWVFlQRV9IQUw7Ci0JCWNhcHMuQWRhcHRlck9yZGluYWwgPSBEM0RBREFQVEVSX0RFRkFVTFQ7Ci0KLQkJLy8gQ2FwcyBmcm9tIERYNwotCQljYXBzLkNhcHMgPQkwOwkvLwlEM0RDQVBTX1JFQURfU0NBTkxJTkUKLQotCQljYXBzLkNhcHMyID0JLy8JRDNEQ0FQUzJfQ0FOQ0FMSUJSQVRFR0FNTUEgfAkvLyBUaGUgc3lzdGVtIGhhcyBhIGNhbGlicmF0b3IgaW5zdGFsbGVkIHRoYXQgY2FuIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBnYW1tYSByYW1wIHNvIHRoYXQgdGhlIHJlc3VsdCBpcyBpZGVudGljYWwgb24gYWxsIHN5c3RlbXMgdGhhdCBoYXZlIGEgY2FsaWJyYXRvci4gVG8gaW52b2tlIHRoZSBjYWxpYnJhdG9yIHdoZW4gc2V0dGluZyBuZXcgZ2FtbWEgbGV2ZWxzLCB1c2UgdGhlIEQzRFNHUl9DQUxJQlJBVEUgZmxhZyB3aGVuIGNhbGxpbmcgSURpcmVjdDNERGV2aWNlODo6U2V0R2FtbWFSYW1wLiBDYWxpYnJhdGluZyBnYW1tYSByYW1wcyBpbmN1cnMgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZnJlcXVlbnRseS4gIAotCQkJCQkJCUQzRENBUFMyX0NBTlJFTkRFUldJTkRPV0VEIHwJLy8gVGhlIGRyaXZlciBpcyBjYXBhYmxlIG9mIHJlbmRlcmluZyBpbiB3aW5kb3dlZCBtb2RlLiAKLQkJCQkJCQlEM0RDQVBTMl9DQU5NQU5BR0VSRVNPVVJDRSB8CS8vIFRoZSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBtYW5hZ2luZyByZXNvdXJjZXMuIE9uIHN1Y2ggZHJpdmVycywgRDNEUE9PTF9NQU5BR0VEIHJlc291cmNlcyB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIGRyaXZlci4gVG8gaGF2ZSBNaWNyb3NvZnSuIERpcmVjdDNEriBvdmVycmlkZSB0aGUgZHJpdmVyIHNvIHRoYXQgRGlyZWN0M0QgbWFuYWdlcyByZXNvdXJjZXMsIHVzZSB0aGUgRDNEQ1JFQVRFX0RJU0FCTEVfRFJJVkVSX01BTkFHRU1FTlQgZmxhZyB3aGVuIGNhbGxpbmcgSURpcmVjdDNEODo6Q3JlYXRlRGV2aWNlLiAKLQkJCQkJCQlEM0RDQVBTMl9EWU5BTUlDVEVYVFVSRVMgfAkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBkeW5hbWljIHRleHR1cmVzLiAKLQkJCQkJCQlEM0RDQVBTMl9GVUxMU0NSRUVOR0FNTUE7CQkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIGR5bmFtaWMgZ2FtbWEgcmFtcCBhZGp1c3RtZW50IGluIGZ1bGwtc2NyZWVuIG1vZGUuCi0JCQkJCQkvLwlEM0RDQVBTMl9OTzJERFVSSU5HM0RTQ0VORTsJCS8vIFdoZW4gdGhlIEQzRENBUFMyX05PMkREVVJJTkczRFNDRU5FIGNhcGFiaWxpdHkgaXMgc2V0IGJ5IHRoZSBkcml2ZXIsIGl0IG1lYW5zIHRoYXQgMi1EIG9wZXJhdGlvbnMgY2Fubm90IGJlIHBlcmZvcm1lZCBiZXR3ZWVuIGNhbGxzIHRvIElEaXJlY3QzRERldmljZTg6OkJlZ2luU2NlbmUgYW5kIElEaXJlY3QzRERldmljZTg6OkVuZFNjZW5lLiAKLQotCQljYXBzLkNhcHMzID0gRDNEQ0FQUzNfQUxQSEFfRlVMTFNDUkVFTl9GTElQX09SX0RJU0NBUkQ7ICAgLy9UaGUgZGV2aWNlIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoIHRoZSBEM0RSU19BTFBIQUJMRU5ERU5BQkxFIHJlbmRlciBzdGF0ZSB3aGVuIGEgZnVsbC1zY3JlZW4gYXBwbGljYXRpb24gdXNlcyBEM0RTV0FQRUZGRUNUX0ZMSVAgb3IgRDNEUlNfU1dBUEVGRkVDVF9ESVNDQVJELiBEM0RSU19BTFBIQUJMRU5ERU5BQkxFIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gdXNpbmcgRDNEU1dBUEVGRkVDVF9DT1BZIGFuZCBEM0RTV0FQRUZGRUNUX0NPUFlTWU5DCi0KLQkJY2Fwcy5QcmVzZW50YXRpb25JbnRlcnZhbHMgPQkJRDNEUFJFU0VOVF9JTlRFUlZBTF9JTU1FRElBVEUgfAotCQkJCQkJCQkJCQlEM0RQUkVTRU5UX0lOVEVSVkFMX09ORTsKLQkJCQkJCQkJCQkvLwlEM0RQUkVTRU5UX0lOVEVSVkFMX1RXTzsKLQkJCQkJCQkJCQkvLwlEM0RQUkVTRU5UX0lOVEVSVkFMX1RIUkVFOwotCQkJCQkJCQkJCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfRk9VUjsKLQotCQkvLyBDdXJzb3IgY2FwcwotCQljYXBzLkN1cnNvckNhcHMgPQlEM0RDVVJTT1JDQVBTX0NPTE9SCXwJLy8gQSBmdWxsLWNvbG9yIGN1cnNvciBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuIFNwZWNpZmljYWxseSwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBkcml2ZXIgc3VwcG9ydHMgYXQgbGVhc3QgYSBoYXJkd2FyZSBjb2xvciBjdXJzb3IgaW4gaGlnaC1yZXNvbHV0aW9uIG1vZGVzICh3aXRoIHNjYW4gbGluZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDQwMCkuIAotCQkJCQkJCUQzRENVUlNPUkNBUFNfTE9XUkVTOwkvLyBBIGZ1bGwtY29sb3IgY3Vyc29yIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZS4gU3BlY2lmaWNhbGx5LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyBhIGhhcmR3YXJlIGNvbG9yIGN1cnNvciBpbiBib3RoIGhpZ2gtcmVzb2x1dGlvbiBhbmQgbG93LXJlc29sdXRpb24gbW9kZXMgKHdpdGggc2NhbiBsaW5lcyBsZXNzIHRoYW4gNDAwKS4gCi0KLQkJLy8gM0QgRGV2aWNlIGNhcHMKLQkJY2Fwcy5EZXZDYXBzID0JCUQzRERFVkNBUFNfQ0FOQkxUU1lTVE9OT05MT0NBTCB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgYmxpdHMgZnJvbSBzeXN0ZW0tbWVtb3J5IHRleHR1cmVzIHRvIG5vbmxvY2FsIHZpZGVvLW1lbW9yeSB0ZXh0dXJlcy4gCi0JCQkJCQkJRDNEREVWQ0FQU19DQU5SRU5ERVJBRlRFUkZMSVAgfAkJCS8vIERldmljZSBjYW4gcXVldWUgcmVuZGVyaW5nIGNvbW1hbmRzIGFmdGVyIGEgcGFnZSBmbGlwLiBBcHBsaWNhdGlvbnMgZG8gbm90IGNoYW5nZSB0aGVpciBiZWhhdmlvciBpZiB0aGlzIGZsYWcgaXMgc2V0OyB0aGlzIGNhcGFiaWxpdHkgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGlzIHJlbGF0aXZlbHkgZmFzdC4gCi0JCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzIgfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBEcmF3UHJpbWl0aXZlczIuCi0JCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzJFWCB8CQkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IGV4dGVuZGVkIERyYXdQcmltaXRpdmVzMjsgdGhhdCBpcywgdGhpcyBpcyBhIERpcmVjdFggNy4wLWNvbXBsaWFudCBkcml2ZXIuCi0JCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTVRMVkVSVEVYIHwJCQkvLyBEZXZpY2UgZXhwb3J0cyBhbiBJRGlyZWN0M0REZXZpY2U4OjpEcmF3UHJpbWl0aXZlLWF3YXJlIGhhcmR3YXJlIGFic3RyYWN0aW9uIGxheWVyIChIQUwpLiAKLQkJCQkJCS8vCUQzRERFVkNBUFNfRVhFQ1VURVNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHVzZSBleGVjdXRlIGJ1ZmZlcnMgZnJvbSBzeXN0ZW0gbWVtb3J5LgotCQkJCQkJLy8JRDNEREVWQ0FQU19FWEVDVVRFVklERU9NRU1PUlkgfAkJCS8vIERldmljZSBjYW4gdXNlIGV4ZWN1dGUgYnVmZmVycyBmcm9tIHZpZGVvIG1lbW9yeS4gCi0JCQkJCQkJRDNEREVWQ0FQU19IV1JBU1RFUklaQVRJT04gfAkJCS8vIERldmljZSBoYXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGZvciBzY2VuZSByYXN0ZXJpemF0aW9uLiAKLQkJCQkJCQlEM0RERVZDQVBTX0hXVFJBTlNGT1JNQU5ETElHSFQgfAkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IHRyYW5zZm9ybWF0aW9uIGFuZCBsaWdodGluZyBpbiBoYXJkd2FyZS4gCi0JCQkJCQkvLwlEM0RERVZDQVBTX05QQVRDSEVTIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBOIHBhdGNoZXMuIAotCQkJCQkJCUQzRERFVkNBUFNfUFVSRURFVklDRSB8CQkJCQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgcmFzdGVyaXphdGlvbiwgdHJhbnNmb3JtLCBsaWdodGluZywgYW5kIHNoYWRpbmcgaW4gaGFyZHdhcmUuIAotCQkJCQkJLy8JRDNEREVWQ0FQU19RVUlOVElDUlRQQVRDSEVTIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcXVpbnRpYyBC6XppZXIgY3VydmVzIGFuZCBCLXNwbGluZXMuIAotCQkJCQkJLy8JRDNEREVWQ0FQU19SVFBBVENIRVMgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHJlY3Rhbmd1bGFyIGFuZCB0cmlhbmd1bGFyIHBhdGNoZXMuIAotCQkJCQkJCUQzRERFVkNBUFNfUlRQQVRDSEhBTkRMRVpFUk8gfAkJCS8vIFdoZW4gdGhpcyBkZXZpY2UgY2FwYWJpbGl0eSBpcyBzZXQsIHRoZSBoYXJkd2FyZSBhcmNoaXRlY3R1cmUgZG9lcyBub3QgcmVxdWlyZSBjYWNoaW5nIG9mIGFueSBpbmZvcm1hdGlvbiBhbmQgdW5jYWNoZWQgcGF0Y2hlcyAoaGFuZGxlIHplcm8pIHdpbGwgYmUgZHJhd24gYXMgZWZmaWNpZW50bHkgYXMgY2FjaGVkIG9uZXMuIE5vdGUgdGhhdCBzZXR0aW5nIEQzRERFVkNBUFNfUlRQQVRDSEhBTkRMRVpFUk8gZG9lcyBub3QgbWVhbiB0aGF0IGEgcGF0Y2ggd2l0aCBoYW5kbGUgemVybyBjYW4gYmUgZHJhd24uIEEgaGFuZGxlLXplcm8gcGF0Y2ggY2FuIGFsd2F5cyBiZSBkcmF3biB3aGV0aGVyIHRoaXMgY2FwIGlzIHNldCBvciBub3QuIAotCQkJCQkJLy8JRDNEREVWQ0FQU19TRVBBUkFURVRFWFRVUkVNRU1PUklFUyB8CS8vIERldmljZSBpcyB0ZXh0dXJpbmcgZnJvbSBzZXBhcmF0ZSBtZW1vcnkgcG9vbHMuIAotCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRU5PTkxPQ0FMVklETUVNIHwJCS8vIERldmljZSBjYW4gcmV0cmlldmUgdGV4dHVyZXMgZnJvbSBub24tbG9jYWwgdmlkZW8gbWVtb3J5LiAKLQkJCQkJCQlEM0RERVZDQVBTX1RFWFRVUkVTWVNURU1NRU1PUlkgfAkJLy8gRGV2aWNlIGNhbiByZXRyaWV2ZSB0ZXh0dXJlcyBmcm9tIHN5c3RlbSBtZW1vcnkuIAotCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZIHwJCQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gZGV2aWNlIG1lbW9yeS4gCi0JCQkJCQkJRDNEREVWQ0FQU19UTFZFUlRFWFNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHVzZSBidWZmZXJzIGZyb20gc3lzdGVtIG1lbW9yeSBmb3IgdHJhbnNmb3JtZWQgYW5kIGxpdCB2ZXJ0aWNlcy4gCi0JCQkJCQkJRDNEREVWQ0FQU19UTFZFUlRFWFZJREVPTUVNT1JZOwkJCS8vIERldmljZSBjYW4gdXNlIGJ1ZmZlcnMgZnJvbSB2aWRlbyBtZW1vcnkgZm9yIHRyYW5zZm9ybWVkIGFuZCBsaXQgdmVydGljZXMuCi0KLQkJY2Fwcy5QcmltaXRpdmVNaXNjQ2FwcyA9IAkJRDNEUE1JU0NDQVBTX0JMRU5ET1AgfCAJCQkJCS8vIERldmljZSBzdXBwb3J0cyB0aGUgYWxwaGEtYmxlbmRpbmcgb3BlcmF0aW9ucyBkZWZpbmVkIGluIHRoZSBEM0RCTEVORE9QIGVudW1lcmF0ZWQgdHlwZS4gCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NMSVBQTEFORVNDQUxFRFBPSU5UUyB8CS8vIERldmljZSBjb3JyZWN0bHkgY2xpcHMgc2NhbGVkIHBvaW50cyBvZiBzaXplIGdyZWF0ZXIgdGhhbiAxLjAgdG8gdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcy4gCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NMSVBUTFZFUlRTIHwJCQkJLy8gRGV2aWNlIGNsaXBzIHBvc3QtdHJhbnNmb3JtZWQgdmVydGV4IHByaW1pdGl2ZXMuIAotCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DT0xPUldSSVRFRU5BQkxFIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLWNoYW5uZWwgd3JpdGVzIGZvciB0aGUgcmVuZGVyIHRhcmdldCBjb2xvciBidWZmZXIgdGhyb3VnaCB0aGUgRDNEUlNfQ09MT1JXUklURUVOQUJMRSBzdGF0ZS4gCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NVTExDQ1cgfAkJCQkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBjb3VudGVyY2xvY2t3aXNlIGN1bGxpbmcgdGhyb3VnaCB0aGUgRDNEUlNfQ1VMTE1PREUgc3RhdGUuIChUaGlzIGFwcGxpZXMgb25seSB0byB0cmlhbmdsZSBwcmltaXRpdmVzLikgVGhpcyBmbGFnIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX0NDVyBtZW1iZXIgb2YgdGhlIEQzRENVTEwgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ1VMTENXIHwJCQkJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgY2xvY2t3aXNlIHRyaWFuZ2xlIGN1bGxpbmcgdGhyb3VnaCB0aGUgRDNEUlNfQ1VMTE1PREUgc3RhdGUuIChUaGlzIGFwcGxpZXMgb25seSB0byB0cmlhbmdsZSBwcmltaXRpdmVzLikgVGhpcyBmbGFnIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX0NXIG1lbWJlciBvZiB0aGUgRDNEQ1VMTCBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DVUxMTk9ORSB8CQkJCQkvLyBUaGUgZHJpdmVyIGRvZXMgbm90IHBlcmZvcm0gdHJpYW5nbGUgY3VsbGluZy4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9OT05FIG1lbWJlciBvZiB0aGUgRDNEQ1VMTCBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJLy8JRDNEUE1JU0NDQVBTX0xJTkVQQVRURVJOUkVQCXwJCQkvLyBUaGUgZHJpdmVyIGNhbiBoYW5kbGUgdmFsdWVzIG90aGVyIHRoYW4gMSBpbiB0aGUgd1JlcGVhdEZhY3RvciBtZW1iZXIgb2YgdGhlIEQzRExJTkVQQVRURVJOIHN0cnVjdHVyZS4gKFRoaXMgYXBwbGllcyBvbmx5IHRvIGxpbmUtZHJhd2luZyBwcmltaXRpdmVzLikgCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX01BU0taIHwJCQkJCS8vIERldmljZSBjYW4gZW5hYmxlIGFuZCBkaXNhYmxlIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwdGggYnVmZmVyIG9uIHBpeGVsIG9wZXJhdGlvbnMuIAotCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19UU1NBUkdURU1QOwkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgRDNEVEFfVEVNUCBmb3IgdGVtcG9yYXJ5IHJlZ2lzdGVyLgotCi0JCWNhcHMuUmFzdGVyQ2FwcyA9CQlEM0RQUkFTVEVSQ0FQU19BTklTT1RST1BZIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFuaXNvdHJvcGljIGZpbHRlcmluZy4gCi0JCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfQU5USUFMSUFTRURHRVMgfAkJCS8vIERldmljZSBjYW4gYW50aWFsaWFzIGxpbmVzIGZvcm1pbmcgdGhlIGNvbnZleCBvdXRsaW5lIG9mIG9iamVjdHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgRDNEUlNfRURHRUFOVElBTElBUy4KLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfQ09MT1JQRVJTUEVDVElWRSB8CQkvLyBEZXZpY2UgaXRlcmF0ZXMgY29sb3JzIHBlcnNwZWN0aXZlIGNvcnJlY3RseS4gCi0JCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfRElUSEVSIHwJCQkJCS8vIERldmljZSBjYW4gZGl0aGVyIHRvIGltcHJvdmUgY29sb3IgcmVzb2x1dGlvbi4gCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX1pCSUFTIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBsZWdhY3kgZGVwdGggYmlhcy4gRm9yIHRydWUgZGVwdGggYmlhcywgc2VlIEQzRFBSQVNURVJDQVBTX1NMT1BFU0NBTEVERVBUSEJJQVMuCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX0ZPR1JBTkdFIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHJhbmdlLWJhc2VkIGZvZy4gSW4gcmFuZ2UtYmFzZWQgZm9nLCB0aGUgZGlzdGFuY2Ugb2YgYW4gb2JqZWN0IGZyb20gdGhlIHZpZXdlciBpcyB1c2VkIHRvIGNvbXB1dGUgZm9nIGVmZmVjdHMsIG5vdCB0aGUgZGVwdGggb2YgdGhlIG9iamVjdCAodGhhdCBpcywgdGhlIHotY29vcmRpbmF0ZSkgaW4gdGhlIHNjZW5lLiAKLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HVEFCTEUgfAkJCQkvLyBEZXZpY2UgY2FsY3VsYXRlcyB0aGUgZm9nIHZhbHVlIGJ5IHJlZmVycmluZyB0byBhIGxvb2t1cCB0YWJsZSBjb250YWluaW5nIGZvZyB2YWx1ZXMgdGhhdCBhcmUgaW5kZXhlZCB0byB0aGUgZGVwdGggb2YgYSBnaXZlbiBwaXhlbC4gCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX0ZPR1ZFUlRFWCB8CQkJCS8vIERldmljZSBjYWxjdWxhdGVzIHRoZSBmb2cgdmFsdWUgZHVyaW5nIHRoZSBsaWdodGluZyBvcGVyYXRpb24gYW5kIGludGVycG9sYXRlcyB0aGUgZm9nIHZhbHVlIGR1cmluZyByYXN0ZXJpemF0aW9uLiAKLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfTUlQTUFQTE9EQklBUyB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIGxldmVsIG9mIGRldGFpbCAoTE9EKSBiaWFzIGFkanVzdG1lbnRzLiBUaGVzZSBiaWFzIGFkanVzdG1lbnRzIGVuYWJsZSBhbiBhcHBsaWNhdGlvbiB0byBtYWtlIGEgbWlwbWFwIGFwcGVhciBjcmlzcGVyIG9yIGxlc3Mgc2hhcnAgdGhhbiBpdCBub3JtYWxseSB3b3VsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgTE9EIGJpYXMgaW4gbWlwbWFwcywgc2VlIEQzRFNBTVBfTUlQTUFQTE9EQklBUy4KLQkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19QQVQgfAkJCQkJLy8gVGhlIGRyaXZlciBjYW4gcGVyZm9ybSBwYXR0ZXJuZWQgZHJhd2luZyBsaW5lcyBvciBmaWxscyB3aXRoIEQzRFJTX0xJTkVQQVRURVJOIGZvciB0aGUgcHJpbWl0aXZlIGJlaW5nIHF1ZXJpZWQuIAotCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX1NUUkVUQ0hCTFRNVUxUSVNBTVBMRSB8CS8vIERldmljZSBwcm92aWRlcyBsaW1pdGVkIG11bHRpc2FtcGxlIHN1cHBvcnQgdGhyb3VnaCBhIHN0cmV0Y2gtYmx0IGltcGxlbWVudGF0aW9uLiBXaGVuIHRoaXMgY2FwYWJpbGl0eSBpcyBzZXQsIEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTIGNhbm5vdCBiZSB0dXJuZWQgb24gYW5kIG9mZiBpbiB0aGUgbWlkZGxlIG9mIGEgc2NlbmUuIE11bHRpc2FtcGxlIG1hc2tpbmcgY2Fubm90IGJlIHBlcmZvcm1lZCBpZiB0aGlzIGZsYWcgaXMgc2V0LiAKLQkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19XQlVGRkVSIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGRlcHRoIGJ1ZmZlcmluZyB1c2luZyB3LiAKLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfV0ZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdy1iYXNlZCBmb2cuIFctYmFzZWQgZm9nIGlzIHVzZWQgd2hlbiBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IGlzIHNwZWNpZmllZCwgYnV0IGFmZmluZSBwcm9qZWN0aW9ucyBzdGlsbCB1c2Ugei1iYXNlZCBmb2cuIFRoZSBzeXN0ZW0gY29uc2lkZXJzIGEgcHJvamVjdGlvbiBtYXRyaXggdGhhdCBjb250YWlucyBhIG5vbnplcm8gdmFsdWUgaW4gdGhlIFszXVs0XSBlbGVtZW50IHRvIGJlIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXguIAotCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19aQklBUyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgei1iaWFzIHZhbHVlcy4gVGhlc2UgYXJlIGludGVnZXIgdmFsdWVzIGFzc2lnbmVkIHRvIHBvbHlnb25zIHRoYXQgYWxsb3cgcGh5c2ljYWxseSBjb3BsYW5hciBwb2x5Z29ucyB0byBhcHBlYXIgc2VwYXJhdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgRDNEUlNfWkJJQVMuIAotCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX1pCVUZGRVJMRVNTSFNSIHwJCQkvLyBEZXZpY2UgY2FuIHBlcmZvcm0gaGlkZGVuLXN1cmZhY2UgcmVtb3ZhbCAoSFNSKSB3aXRob3V0IHJlcXVpcmluZyB0aGUgYXBwbGljYXRpb24gdG8gc29ydCBwb2x5Z29ucyBhbmQgd2l0aG91dCByZXF1aXJpbmcgdGhlIGFsbG9jYXRpb24gb2YgYSBkZXB0aC1idWZmZXIuIFRoaXMgbGVhdmVzIG1vcmUgdmlkZW8gbWVtb3J5IGZvciB0ZXh0dXJlcy4gVGhlIG1ldGhvZCB1c2VkIHRvIHBlcmZvcm0gSFNSIGlzIGhhcmR3YXJlLWRlcGVuZGVudCBhbmQgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLiBaLWJ1ZmZlcmxlc3MgSFNSIGlzIHBlcmZvcm1lZCBpZiBubyBkZXB0aC1idWZmZXIgc3VyZmFjZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbmRlcmluZy10YXJnZXQgc3VyZmFjZSBhbmQgdGhlIGRlcHRoLWJ1ZmZlciBjb21wYXJpc29uIHRlc3QgaXMgZW5hYmxlZCAodGhhdCBpcywgd2hlbiB0aGUgc3RhdGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBEM0RSU19aRU5BQkxFIGVudW1lcmF0aW9uIGNvbnN0YW50IGlzIHNldCB0byBUUlVFKS4KLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfWkZPRzsJCQkJCS8vIERldmljZSBzdXBwb3J0cyB6LWJhc2VkIGZvZy4gCi0JCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfWlRFU1Q7CQkJCQkvLyBEZXZpY2UgY2FuIHBlcmZvcm0gei10ZXN0IG9wZXJhdGlvbnMuIFRoaXMgZWZmZWN0aXZlbHkgcmVuZGVycyBhIHByaW1pdGl2ZSBhbmQgaW5kaWNhdGVzIHdoZXRoZXIgYW55IHogcGl4ZWxzIGhhdmUgYmVlbiByZW5kZXJlZC4KLQotCQljYXBzLlpDbXBDYXBzID0JCUQzRFBDTVBDQVBTX0FMV0FZUyB8CQkvLyBBbHdheXMgcGFzcyB0aGUgei10ZXN0LiAKLQkJCQkJCQlEM0RQQ01QQ0FQU19FUVVBTCB8CQkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBlcXVhbHMgdGhlIGN1cnJlbnQgei4gCi0JCQkJCQkJRDNEUENNUENBUFNfR1JFQVRFUiB8CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB6LiAKLQkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB6LiAKLQkJCQkJCQlEM0RQQ01QQ0FQU19MRVNTIHwJCQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCB6LiAKLQkJCQkJCQlEM0RQQ01QQ0FQU19MRVNTRVFVQUwgfAkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgei4gCi0JCQkJCQkJRDNEUENNUENBUFNfTkVWRVIgfAkJCS8vIEFsd2F5cyBmYWlsIHRoZSB6LXRlc3QuIAotCQkJCQkJCUQzRFBDTVBDQVBTX05PVEVRVUFMOwkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBkb2VzIG5vdCBlcXVhbCB0aGUgY3VycmVudCB6LgotCi0JCWNhcHMuU3JjQmxlbmRDYXBzID0JCUQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBIHwJLy8gU291cmNlIGJsZW5kIGZhY3RvciBpcyAoMS1BcywxLUFzLDEtQXMsMS1BcykgYW5kIGRlc3RpbmF0aW9uIGJsZW5kIGZhY3RvciBpcyAoQXMsQXMsQXMsQXMpOyB0aGUgZGVzdGluYXRpb24gYmxlbmQgc2VsZWN0aW9uIGlzIG92ZXJyaWRkZW4uIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSB8CS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEQzREJMRU5EX0JPVEhTUkNBTFBIQSBibGVuZCBtb2RlLiAoVGhpcyBibGVuZCBtb2RlIGlzIG9ic29sZXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEQzREJMRU5ELikgCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVEFMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQWQsIEFkLCBBZCwgQWQpLiAKLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChSZCwgR2QsIEJkLCBBZCkuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BZCwgMS1BZCwgMS1BZCwgMS1BZCkuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1SZCwgMS1HZCwgMS1CZCwgMS1BZCkuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BcywgMS1BcywgMS1BcywgMS1BcykuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1ScywgMS1HcywgMS1CcywgMS1BcykuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX09ORSB8CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMSwgMSwgMSwgMSkuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQXMsIEFzLCBBcywgQXMpLiAKLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKGYsIGYsIGYsIDEpOyBmID0gbWluKEFzLCAxLUFkKS4gCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChScywgR3MsIEJzLCBBcykuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1pFUk87CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMCwgMCwgMCwgMCkuCi0KLQkJY2Fwcy5EZXN0QmxlbmRDYXBzID0gCUQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBIHwJLy8gU291cmNlIGJsZW5kIGZhY3RvciBpcyAoMS1BcywxLUFzLDEtQXMsMS1BcykgYW5kIGRlc3RpbmF0aW9uIGJsZW5kIGZhY3RvciBpcyAoQXMsQXMsQXMsQXMpOyB0aGUgZGVzdGluYXRpb24gYmxlbmQgc2VsZWN0aW9uIGlzIG92ZXJyaWRkZW4uIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSB8CS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEQzREJMRU5EX0JPVEhTUkNBTFBIQSBibGVuZCBtb2RlLiAoVGhpcyBibGVuZCBtb2RlIGlzIG9ic29sZXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEQzREJMRU5ELikgCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVEFMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQWQsIEFkLCBBZCwgQWQpLiAKLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChSZCwgR2QsIEJkLCBBZCkuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BZCwgMS1BZCwgMS1BZCwgMS1BZCkuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1SZCwgMS1HZCwgMS1CZCwgMS1BZCkuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BcywgMS1BcywgMS1BcywgMS1BcykuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1ScywgMS1HcywgMS1CcywgMS1BcykuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX09ORSB8CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMSwgMSwgMSwgMSkuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQXMsIEFzLCBBcywgQXMpLiAKLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKGYsIGYsIGYsIDEpOyBmID0gbWluKEFzLCAxLUFkKS4gCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChScywgR3MsIEJzLCBBcykuIAotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1pFUk87CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMCwgMCwgMCwgMCkuCi0KLQkJY2Fwcy5BbHBoYUNtcENhcHMgPSBEM0RQQ01QQ0FQU19BTFdBWVMgfAkJLy8gQWx3YXlzIHBhc3MgdGhlIGFwaGEtdGVzdC4gCi0JCQkJCQkJRDNEUENNUENBUFNfRVFVQUwgfAkJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgZXF1YWxzIHRoZSBjdXJyZW50IGFwaGEuIAotCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVIgfAkJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgYXBoYS4gCi0JCQkJCQkJRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMIHwJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgYXBoYS4gCi0JCQkJCQkJRDNEUENNUENBUFNfTEVTUyB8CQkJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYXBoYS4gCi0JCQkJCQkJRDNEUENNUENBUFNfTEVTU0VRVUFMIHwJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGFwaGEuIAotCQkJCQkJCUQzRFBDTVBDQVBTX05FVkVSIHwJCQkvLyBBbHdheXMgZmFpbCB0aGUgYXBoYS10ZXN0LiAKLQkJCQkJCQlEM0RQQ01QQ0FQU19OT1RFUVVBTDsJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgZG9lcyBub3QgZXF1YWwgdGhlIGN1cnJlbnQgYXBoYS4KLQotCQljYXBzLlNoYWRlQ2FwcyA9CUQzRFBTSEFERUNBUFNfQUxQSEFHT1VSQVVEQkxFTkQgfAkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgYW4gYWxwaGEgY29tcG9uZW50IGZvciBHb3VyYXVkLWJsZW5kZWQgdHJhbnNwYXJlbmN5ICh0aGUgRDNEU0hBREVfR09VUkFVRCBzdGF0ZSBmb3IgdGhlIEQzRFNIQURFTU9ERSBlbnVtZXJhdGVkIHR5cGUpLiBJbiB0aGlzIG1vZGUsIHRoZSBhbHBoYSBjb2xvciBjb21wb25lbnQgb2YgYSBwcmltaXRpdmUgaXMgcHJvdmlkZWQgYXQgdmVydGljZXMgYW5kIGludGVycG9sYXRlZCBhY3Jvc3MgYSBmYWNlIGFsb25nIHdpdGggdGhlIG90aGVyIGNvbG9yIGNvbXBvbmVudHMuIAotCQkJCQkJCUQzRFBTSEFERUNBUFNfQ09MT1JHT1VSQVVEUkdCIHwJCS8vIERldmljZSBjYW4gc3VwcG9ydCBjb2xvcmVkIEdvdXJhdWQgc2hhZGluZyBpbiB0aGUgUkdCIGNvbG9yIG1vZGVsLiBJbiB0aGlzIG1vZGUsIHRoZSBjb2xvciBjb21wb25lbnQgZm9yIGEgcHJpbWl0aXZlIGlzIHByb3ZpZGVkIGF0IHZlcnRpY2VzIGFuZCBpbnRlcnBvbGF0ZWQgYWNyb3NzIGEgZmFjZSBhbG9uZyB3aXRoIHRoZSBvdGhlciBjb2xvciBjb21wb25lbnRzLiBJbiB0aGUgUkdCIGxpZ2h0aW5nIG1vZGVsLCB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgY29tcG9uZW50cyBhcmUgaW50ZXJwb2xhdGVkLiAKLQkJCQkJCQlEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBmb2cgaW4gdGhlIEdvdXJhdWQgc2hhZGluZyBtb2RlLiAKLQkJCQkJCQlEM0RQU0hBREVDQVBTX1NQRUNVTEFSR09VUkFVRFJHQjsJLy8gRGV2aWNlIHN1cHBvcnRzIEdvdXJhdWQgc2hhZGluZyBvZiBzcGVjdWxhciBoaWdobGlnaHRzLgotCi0JCWNhcHMuVGV4dHVyZUNhcHMgPQkJRDNEUFRFWFRVUkVDQVBTX0FMUEhBIHwJCQkJCQkvLyBBbHBoYSBpbiB0ZXh0dXJlIHBpeGVscyBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfQUxQSEFQQUxFVFRFIHwJCQkJLy8gRGV2aWNlIGNhbiBkcmF3IGFscGhhIGZyb20gdGV4dHVyZSBwYWxldHRlcy4gCi0JCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19DVUJFTUFQIHwJCQkJCS8vIFN1cHBvcnRzIGN1YmUgdGV4dHVyZXMuCi0JCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVBfUE9XMiB8CQkJCS8vIERldmljZSByZXF1aXJlcyB0aGF0IGN1YmUgdGV4dHVyZSBtYXBzIGhhdmUgZGltZW5zaW9ucyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gCi0JCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19NSVBDVUJFTUFQIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIG1pcG1hcHBlZCBjdWJlIHRleHR1cmVzLiAKLQkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUE1BUCB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbWlwbWFwcGVkIHRleHR1cmVzLiAKLQkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUFZPTFVNRU1BUCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgdm9sdW1lIHRleHR1cmVzLiAKLQkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfTk9OUE9XMkNPTkRJVElPTkFMIHwJCS8vIENvbmRpdGlvbmFsbHkgc3VwcG9ydHMgdGhlIHVzZSBvZiAyLUQgdGV4dHVyZXMgd2l0aCBkaW1lbnNpb25zIHRoYXQgYXJlIG5vdCBwb3dlcnMgb2YgdHdvLiBBIGRldmljZSB0aGF0IGV4cG9zZXMgdGhpcyBjYXBhYmlsaXR5IGNhbiB1c2Ugc3VjaCBhIHRleHR1cmUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGFyZSBtZXQuLi4KLQkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHwJCQkJLy8gUGVyc3BlY3RpdmUgY29ycmVjdGlvbiB0ZXh0dXJpbmcgaXMgc3VwcG9ydGVkLgotCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19QT1cyIHwJCQkJCQkvLyBBbGwgdGV4dHVyZXMgbXVzdCBoYXZlIHdpZHRocyBhbmQgaGVpZ2h0cyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gVGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBlaXRoZXIgY3ViZSB0ZXh0dXJlcyBvciB2b2x1bWUgdGV4dHVyZXMuCi0JCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19QUk9KRUNURUQgfAkJCQkJLy8gU3VwcG9ydHMgdGhlIEQzRFRURkZfUFJPSkVDVEVEIHRleHR1cmUgdHJhbnNmb3JtYXRpb24gZmxhZy4gV2hlbiBhcHBsaWVkLCB0aGUgZGV2aWNlIGRpdmlkZXMgdHJhbnNmb3JtZWQgdGV4dHVyZSBjb29yZGluYXRlcyBieSB0aGUgbGFzdCB0ZXh0dXJlIGNvb3JkaW5hdGUuIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBwcmVzZW50LCB0aGVuIHRoZSBwcm9qZWN0aXZlIGRpdmlkZSBvY2N1cnMgcGVyIHBpeGVsLiBJZiB0aGlzIGNhcGFiaWxpdHkgaXMgbm90IHByZXNlbnQsIGJ1dCB0aGUgcHJvamVjdGl2ZSBkaXZpZGUgbmVlZHMgdG8gb2NjdXIgYW55d2F5LCB0aGVuIGl0IGlzIHBlcmZvcm1lZCBvbiBhIHBlci12ZXJ0ZXggYmFzaXMgYnkgdGhlIERpcmVjdDNEIHJ1bnRpbWUuIAotCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19TUVVBUkVPTkxZIHwJCQkJLy8gQWxsIHRleHR1cmVzIG11c3QgYmUgc3F1YXJlLiAKLQkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1RFWFJFUEVBVE5PVFNDQUxFREJZU0laRSB8CS8vIFRleHR1cmUgaW5kaWNlcyBhcmUgbm90IHNjYWxlZCBieSB0aGUgdGV4dHVyZSBzaXplIHByaW9yIHRvIGludGVycG9sYXRpb24uCi0JCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19WT0xVTUVNQVA7CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdm9sdW1lIHRleHR1cmVzLgotCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19WT0xVTUVNQVBfUE9XMjsJCQkJLy8gRGV2aWNlIHJlcXVpcmVzIHRoYXQgdm9sdW1lIHRleHR1cmUgbWFwcyBoYXZlIGRpbWVuc2lvbnMgc3BlY2lmaWVkIGFzIHBvd2VycyBvZiB0d28uIAotCi0JCWNhcHMuVGV4dHVyZUZpbHRlckNhcHMgPQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkFGTEFUQ1VCSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGZsYXQgY3ViaWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgZmxhdCBjdWJpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9GTEFUQ1VCSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTkNVQklDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHRoZSBwZXItc3RhZ2UgR2F1c3NpYW4gY3ViaWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgR2F1c3NpYW4gY3ViaWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfR0FVU1NJQU5DVUJJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCi0JCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgbGluZWFyIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgbGluZWFyIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQ7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQotCQljYXBzLkN1YmVUZXh0dXJlRmlsdGVyQ2FwcyA9CS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQUZMQVRDVUJJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgZmxhdCBjdWJpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBmbGF0IGN1YmljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0ZMQVRDVUJJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5DVUJJQyB8CS8vIERldmljZSBzdXBwb3J0cyB0aGUgcGVyLXN0YWdlIEdhdXNzaWFuIGN1YmljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIEdhdXNzaWFuIGN1YmljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0dBVVNTSUFOQ1VCSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGxpbmVhciBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGxpbmVhciBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCi0JCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UOwkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIHBvaW50LXNhbXBsZSBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCi0JCQkJCQkJCQkKLQkJY2Fwcy5Wb2x1bWVUZXh0dXJlRmlsdGVyQ2FwcyA9IAkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkFGTEFUQ1VCSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGZsYXQgY3ViaWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgZmxhdCBjdWJpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9GTEFUQ1VCSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOQ1VCSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgdGhlIHBlci1zdGFnZSBHYXVzc2lhbiBjdWJpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBHYXVzc2lhbiBjdWJpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9HQVVTU0lBTkNVQklDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCi0JCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVDsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBwb2ludC1zYW1wbGUgbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAotCQkJCQkJCQkJCi0JCWNhcHMuVGV4dHVyZUFkZHJlc3NDYXBzID0JRDNEUFRBRERSRVNTQ0FQU19CT1JERVIgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXR0aW5nIGNvb3JkaW5hdGVzIG91dHNpZGUgdGhlIHJhbmdlIFswLjAsIDEuMF0gdG8gdGhlIGJvcmRlciBjb2xvciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEM0RTQU1QX0JPUkRFUkNPTE9SIHRleHR1cmUtc3RhZ2Ugc3RhdGUuIAotCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19DTEFNUCB8CQkJLy8gRGV2aWNlIGNhbiBjbGFtcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuIAotCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19JTkRFUEVOREVOVFVWIHwJLy8gRGV2aWNlIGNhbiBzZXBhcmF0ZSB0aGUgdGV4dHVyZS1hZGRyZXNzaW5nIG1vZGVzIG9mIHRoZSB1IGFuZCB2IGNvb3JkaW5hdGVzIG9mIHRoZSB0ZXh0dXJlLiBUaGlzIGFiaWxpdHkgY29ycmVzcG9uZHMgdG8gdGhlIEQzRFNBTVBfQUREUkVTU1UgYW5kIEQzRFNBTVBfQUREUkVTU1YgcmVuZGVyLXN0YXRlIHZhbHVlcy4gCi0JCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUiB8CQkJLy8gRGV2aWNlIGNhbiBtaXJyb3IgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKLQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9ST05DRSB8CQkvLyBEZXZpY2UgY2FuIHRha2UgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGUgKHRodXMsIG1pcnJvcmluZyBhcm91bmQgMCkgYW5kIHRoZW4gY2xhbXAgdG8gdGhlIG1heGltdW0gdmFsdWUuIAotCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19XUkFQOwkJCQkvLyBEZXZpY2UgY2FuIHdyYXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLgotCi0JCWNhcHMuVm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzID0JRDNEUFRBRERSRVNTQ0FQU19CT1JERVIgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXR0aW5nIGNvb3JkaW5hdGVzIG91dHNpZGUgdGhlIHJhbmdlIFswLjAsIDEuMF0gdG8gdGhlIGJvcmRlciBjb2xvciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEM0RTQU1QX0JPUkRFUkNPTE9SIHRleHR1cmUtc3RhZ2Ugc3RhdGUuIAotCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgfAkJCS8vIERldmljZSBjYW4gY2xhbXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKLQkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgfAkvLyBEZXZpY2UgY2FuIHNlcGFyYXRlIHRoZSB0ZXh0dXJlLWFkZHJlc3NpbmcgbW9kZXMgb2YgdGhlIHUgYW5kIHYgY29vcmRpbmF0ZXMgb2YgdGhlIHRleHR1cmUuIFRoaXMgYWJpbGl0eSBjb3JyZXNwb25kcyB0byB0aGUgRDNEU0FNUF9BRERSRVNTVSBhbmQgRDNEU0FNUF9BRERSRVNTViByZW5kZXItc3RhdGUgdmFsdWVzLiAKLQkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUiB8CQkJLy8gRGV2aWNlIGNhbiBtaXJyb3IgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKLQkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0UgfAkJLy8gRGV2aWNlIGNhbiB0YWtlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBjb29yZGluYXRlICh0aHVzLCBtaXJyb3JpbmcgYXJvdW5kIDApIGFuZCB0aGVuIGNsYW1wIHRvIHRoZSBtYXhpbXVtIHZhbHVlLiAKLQkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX1dSQVA7CQkJCS8vIERldmljZSBjYW4gd3JhcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuCi0KLQkJY2Fwcy5MaW5lQ2FwcyA9IEQzRExJTkVDQVBTX0FMUEhBQ01QIHwJLy8gU3VwcG9ydHMgYWxwaGEtdGVzdCBjb21wYXJpc29ucy4gCi0JCQkJCQlEM0RMSU5FQ0FQU19CTEVORCB8CQkvLyBTdXBwb3J0cyBzb3VyY2UtYmxlbmRpbmcuIAotCQkJCQkJRDNETElORUNBUFNfRk9HIHwJCS8vIFN1cHBvcnRzIGZvZy4gCi0JCQkJCQlEM0RMSU5FQ0FQU19URVhUVVJFIHwJLy8gU3VwcG9ydHMgdGV4dHVyZS1tYXBwaW5nLiAKLQkJCQkJCUQzRExJTkVDQVBTX1pURVNUOwkJLy8gU3VwcG9ydHMgei1idWZmZXIgY29tcGFyaXNvbnMuCi0JCQotCQljYXBzLk1heFRleHR1cmVXaWR0aCA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7Ci0JCWNhcHMuTWF4VGV4dHVyZUhlaWdodCA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7Ci0JCWNhcHMuTWF4Vm9sdW1lRXh0ZW50ID0gMSA8PCAoc3c6Ok1JUE1BUF9MRVZFTFMgLSAxKTsKLQkJY2Fwcy5NYXhUZXh0dXJlUmVwZWF0ID0gODE5MjsKLQkJY2Fwcy5NYXhUZXh0dXJlQXNwZWN0UmF0aW8gPSAxIDw8IChzdzo6TUlQTUFQX0xFVkVMUyAtIDEpOwotCQljYXBzLk1heEFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5OwotCQljYXBzLk1heFZlcnRleFcgPSAxZSswMTA7Ci0KLQkJY2Fwcy5HdWFyZEJhbmRMZWZ0ID0gLTFlKzAwODsKLQkJY2Fwcy5HdWFyZEJhbmRUb3AgPSAtMWUrMDA4OwotCQljYXBzLkd1YXJkQmFuZFJpZ2h0ID0gMWUrMDA4OwotCQljYXBzLkd1YXJkQmFuZEJvdHRvbSA9IDFlKzAwODsKLQotCQljYXBzLkV4dGVudHNBZGp1c3QgPSAwOwotCi0JCWNhcHMuU3RlbmNpbENhcHMgPQkJRDNEU1RFTkNJTENBUFNfS0VFUCB8CQkvLyBEbyBub3QgdXBkYXRlIHRoZSBlbnRyeSBpbiB0aGUgc3RlbmNpbCBidWZmZXIuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuIAotCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19aRVJPIHwJCS8vIFNldCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkgdG8gMC4gCi0JCQkJCQkJCUQzRFNURU5DSUxDQVBTX1JFUExBQ0UgfAkvLyBSZXBsYWNlIHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSB3aXRoIHJlZmVyZW5jZSB2YWx1ZS4gCi0JCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOQ1JTQVQgfAkvLyBJbmNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCBjbGFtcGluZyB0byB0aGUgbWF4aW11bSB2YWx1ZS4gIAotCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19ERUNSU0FUIHwJLy8gRGVjcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgY2xhbXBpbmcgdG8gemVyby4gCi0JCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOVkVSVCB8CQkvLyBJbnZlcnQgdGhlIGJpdHMgaW4gdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LiAKLQkJCQkJCQkJRDNEU1RFTkNJTENBUFNfSU5DUiB8CQkvLyBJbmNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCB3cmFwcGluZyB0byB6ZXJvIGlmIHRoZSBuZXcgdmFsdWUgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZS4gIAotCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19ERUNSOwkJLy8gRGVjcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgd3JhcHBpbmcgdG8gdGhlIG1heGltdW0gdmFsdWUgaWYgdGhlIG5ldyB2YWx1ZSBpcyBsZXNzIHRoYW4gemVyby4gCi0JCQotCQljYXBzLkZWRkNhcHMgPQkJRDNERlZGQ0FQU19ET05PVFNUUklQRUxFTUVOVFMgfAkJLy8gSXQgaXMgcHJlZmVyYWJsZSB0aGF0IHZlcnRleCBlbGVtZW50cyBub3QgYmUgc3RyaXBwZWQuIFRoYXQgaXMsIGlmIHRoZSB2ZXJ0ZXggZm9ybWF0IGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB1c2VkIHdpdGggdGhlIGN1cnJlbnQgcmVuZGVyIHN0YXRlcywgdGhlcmUgaXMgbm8gbmVlZCB0byByZWdlbmVyYXRlIHRoZSB2ZXJ0aWNlcy4gSWYgdGhpcyBjYXBhYmlsaXR5IGZsYWcgaXMgbm90IHByZXNlbnQsIHN0cmlwcGluZyBleHRyYW5lb3VzIGVsZW1lbnRzIGZyb20gdGhlIHZlcnRleCBmb3JtYXQgcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlLiAKLQkJCQkJCQlEM0RGVkZDQVBTX1BTSVpFIHwJCQkJCS8vIFBvaW50IHNpemUgaXMgZGV0ZXJtaW5lZCBieSBlaXRoZXIgdGhlIHJlbmRlciBzdGF0ZSBvciB0aGUgdmVydGV4IGRhdGEuCi0JCQkJCQkvLwlEM0RGVkZDQVBTX1RFWENPT1JEQ09VTlRNQVNLIHwJCS8vIE1hc2tzIHRoZSBsb3cgV09SRCBvZiBGVkZDYXBzLiBUaGVzZSBiaXRzLCBjYXN0IHRvIHRoZSBXT1JEIGRhdGEgdHlwZSwgZGVzY3JpYmUgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyB0aGF0IHRoZSBkZXZpY2UgY2FuIHNpbXVsdGFuZW91c2x5IHVzZSBmb3IgbXVsdGlwbGUgdGV4dHVyZSBibGVuZGluZy4gKFlvdSBjYW4gdXNlIHVwIHRvIGVpZ2h0IHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIGZvciBhbnkgdmVydGV4LCBidXQgdGhlIGRldmljZSBjYW4gYmxlbmQgdXNpbmcgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cy4pIAotCQkJCQkJCTg7Ci0KLQkJY2Fwcy5UZXh0dXJlT3BDYXBzID0JRDNEVEVYT1BDQVBTX0FERCB8CQkJCQkJCS8vIFRoZSBEM0RUT1BfQUREIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19BRERTSUdORUQgfAkJCQkJLy8gVGhlIEQzRFRPUF9BRERTSUdORUQgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0FERFNJR05FRDJYIHwJCQkJCS8vIFRoZSBEM0RUT1BfQUREU0lHTkVEMlggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0FERFNNT09USCB8CQkJCQkvLyBUaGUgRDNEVE9QX0FERFNNT09USCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRDVVJSRU5UQUxQSEEgfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5ERElGRlVTRUFMUEhBIHwJCQkvLyBUaGUgRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVOREZBQ1RPUkFMUEhBIHwJCQkJLy8gVGhlIEQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRURVhUVVJFQUxQSEFQTSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQIHwJCQkJCS8vIFRoZSBEM0RUT1BfQlVNUEVOVk1BUCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfQlVNUEVOVk1BUExVTUlOQU5DRSB8CQkJLy8gVGhlIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19ESVNBQkxFIHwJCQkJCQkvLyBUaGUgRDNEVE9QX0RJU0FCTEUgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0RPVFBST0RVQ1QzIHwJCQkJCS8vIFRoZSBEM0RUT1BfRE9UUFJPRFVDVDMgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0xFUlAgfAkJCQkJCQkvLyBUaGUgRDNEVE9QX0xFUlAgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKLQkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFIHwJCQkJCQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURTJYIHwJCQkJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEUyWCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEU0WCB8CQkJCQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFNFggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKLQkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFQUxQSEFfQUREQ09MT1IgfAkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUFMUEhBX0FERENPTE9SIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUNPTE9SX0FEREFMUEhBIHwJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB8CS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSB8CS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfTVVMVElQTFlBREQgfAkJCQkJLy8gVGhlIEQzRFRPUF9NVUxUSVBMWUFERCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfUFJFTU9EVUxBVEUgfAkJCQkJLy8gVGhlIEQzRFRPUF9QUkVNT0RVTEFURSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAotCQkJCQkJCQlEM0RURVhPUENBUFNfU0VMRUNUQVJHMSB8CQkJCQkvLyBUaGUgRDNEVE9QX1NFTEVDVEFSRzEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKLQkJCQkJCQkJRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzIgfAkJCQkJLy8gVGhlIEQzRFRPUF9TRUxFQ1RBUkcyIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19TVUJUUkFDVDsJCQkJCQkvLyBUaGUgRDNEVE9QX1NVQlRSQUNUIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCi0KLQkJY2Fwcy5NYXhUZXh0dXJlQmxlbmRTdGFnZXMgPSA4OwotCQljYXBzLk1heFNpbXVsdGFuZW91c1RleHR1cmVzID0gODsKLQotCQljYXBzLlZlcnRleFByb2Nlc3NpbmdDYXBzID0JCUQzRFZUWFBDQVBTX0RJUkVDVElPTkFMTElHSFRTIHwJCQkvLyBEZXZpY2UgY2FuIGRvIGRpcmVjdGlvbmFsIGxpZ2h0cy4gCi0JCQkJCQkJCQkJRDNEVlRYUENBUFNfTE9DQUxWSUVXRVIgfAkJCQkvLyBEZXZpY2UgY2FuIGRvIGxvY2FsIHZpZXdlci4gCi0JCQkJCQkJCQkJRDNEVlRYUENBUFNfTUFURVJJQUxTT1VSQ0U3CXwJCQkvLyBEZXZpY2UgY2FuIGRvIE1pY3Jvc29mdK4gRGlyZWN0WK4gNy4wIGNvbG9ybWF0ZXJpYWxzb3VyY2Ugb3BlcmF0aW9ucy4gCi0JCQkJCQkJCQkJRDNEVlRYUENBUFNfUE9TSVRJT05BTExJR0hUUyB8CQkJLy8gRGV2aWNlIGNhbiBkbyBwb3NpdGlvbmFsIGxpZ2h0cyAoaW5jbHVkZXMgcG9pbnQgYW5kIHNwb3QpLiAKLQkJCQkJCQkJCQlEM0RWVFhQQ0FQU19URVhHRU4gfAkJCQkJLy8gRGV2aWNlIGNhbiBkbyB0ZXhnZW4uIAotCQkJCQkJCQkJCUQzRFZUWFBDQVBTX1RXRUVOSU5HOwkJCQkJLy8gRGV2aWNlIGNhbiBkbyB2ZXJ0ZXggdHdlZW5pbmcuIAotCQkJCQkJCQkJLy8JRDNEVlRYUENBUFNfTk9fVlNEVF9VQllURTQ7CQkJCS8vIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBEM0RWU0RUX1VCWVRFNCB2ZXJ0ZXggZGVjbGFyYXRpb24gdHlwZS4gIAotCi0JCWNhcHMuTWF4QWN0aXZlTGlnaHRzID0gODsJCQkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBsaWdodHMgdGhhdCBjYW4gYmUgYWN0aXZlIHNpbXVsdGFuZW91c2x5LiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtaWdodCB2YXJ5IGFjcm9zcyBEaXJlY3QzRERldmljZSBvYmplY3RzIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCB0byBJRGlyZWN0M0Q4OjpDcmVhdGVEZXZpY2UuCi0JCWNhcHMuTWF4VXNlckNsaXBQbGFuZXMgPSA2OwkJCQkJCS8vIE1heGltdW0gbnVtYmVyIG9mIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMgc3VwcG9ydGVkLiBUaGlzIG1lbWJlciBjYW4gcmFuZ2UgZnJvbSAwIHRocm91Z2ggRDNETUFYVVNFUkNMSVBQTEFORVMuIEZvciBhIGdpdmVuIHBoeXNpY2FsIGRldmljZSwgdGhpcyBjYXBhYmlsaXR5IG1heSB2YXJ5IGFjcm9zcyBEaXJlY3QzRERldmljZSBvYmplY3RzIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCB0byBJRGlyZWN0M0Q4OjpDcmVhdGVEZXZpY2UuIAotCQljYXBzLk1heFZlcnRleEJsZW5kTWF0cmljZXMgPSA0OwkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBtYXRyaWNlcyB0aGF0IHRoaXMgZGV2aWNlIGNhbiBhcHBseSB3aGVuIHBlcmZvcm1pbmcgbXVsdGltYXRyaXggdmVydGV4IGJsZW5kaW5nLiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtYXkgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEODo6Q3JlYXRlRGV2aWNlLiAKLQkJY2Fwcy5NYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4ID0gMTE7CQkJLy8gRFdPUkQgdmFsdWUgdGhhdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbWF0cml4IGluZGV4IHRoYXQgY2FuIGJlIGluZGV4ZWQgaW50byB1c2luZyB0aGUgcGVyLXZlcnRleCBpbmRpY2VzLiBUaGUgbnVtYmVyIG9mIG1hdHJpY2VzIGlzIE1heFZlcnRleEJsZW5kTWF0cml4SW5kZXggKyAxLCB3aGljaCBpcyB0aGUgc2l6ZSBvZiB0aGUgbWF0cml4IHBhbGV0dGUuIElmIG5vcm1hbHMgYXJlIHByZXNlbnQgaW4gdGhlIHZlcnRleCBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgYmxlbmRlZCBmb3IgbGlnaHRpbmcsIHRoZW4gdGhlIG51bWJlciBvZiBtYXRyaWNlcyBpcyBoYWxmIHRoZSBudW1iZXIgc3BlY2lmaWVkIGJ5IHRoaXMgY2FwYWJpbGl0eSBmbGFnLiBJZiBNYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4IGlzIHNldCB0byB6ZXJvLCB0aGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgaW5kZXhlZCB2ZXJ0ZXggYmxlbmRpbmcuIElmIHRoaXMgdmFsdWUgaXMgbm90IHplcm8gdGhlbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcyBpcyB6ZXJvIHRocm91Z2ggTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleC4KLQkJY2Fwcy5NYXhQb2ludFNpemUgPSA4MTkyLjBmOwkJCQkJLy8gTWF4aW11bSBzaXplIG9mIGEgcG9pbnQgcHJpbWl0aXZlLiBJZiBzZXQgdG8gMS4wZiB0aGVuIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHBvaW50IHNpemUgY29udHJvbC4gVGhlIHJhbmdlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLjBmLgotCQljYXBzLk1heFByaW1pdGl2ZUNvdW50ID0gMSA8PCAyMTsJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgcHJpbWl0aXZlcyBmb3IgZWFjaCBJRGlyZWN0M0REZXZpY2U4OjpEcmF3UHJpbWl0aXZlIGNhbGwuIE5vdGUgdGhhdCB3aGVuIERpcmVjdDNEIGlzIHdvcmtpbmcgd2l0aCBhIERpcmVjdFggNi4wIG9yIERpcmVjdFggNy4wIGRyaXZlciwgdGhpcyBmaWVsZCBpcyBzZXQgdG8gMHhGRkZGLiBUaGlzIG1lYW5zIHRoYXQgbm90IG9ubHkgdGhlIG51bWJlciBvZiBwcmltaXRpdmVzIGJ1dCBhbHNvIHRoZSBudW1iZXIgb2YgdmVydGljZXMgaXMgbGltaXRlZCBieSB0aGlzIHZhbHVlLgotCQljYXBzLk1heFZlcnRleEluZGV4ID0gMSA8PCAyNDsJCQkJCS8vIE1heGltdW0gc2l6ZSBvZiBpbmRpY2VzIHN1cHBvcnRlZCBmb3IgaGFyZHdhcmUgdmVydGV4IHByb2Nlc3NpbmcuIEl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSAzMi1iaXQgaW5kZXggYnVmZmVycyBieSBzcGVjaWZ5aW5nIEQzREZNVF9JTkRFWDMyOyBob3dldmVyLCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byByZW5kZXIgd2l0aCB0aGUgaW5kZXggYnVmZmVyIHVubGVzcyB0aGlzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAweDAwMDBGRkZGLgotCQljYXBzLk1heFN0cmVhbXMgPSAxNjsJCQkJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBkYXRhIHN0cmVhbXMgZm9yIElEaXJlY3QzRERldmljZTg6OlNldFN0cmVhbVNvdXJjZS4gVGhlIHZhbGlkIHJhbmdlIGlzIDEgdG8gMTYuIE5vdGUgdGhhdCBpZiB0aGlzIHZhbHVlIGlzIDAsIHRoZW4gdGhlIGRyaXZlciBpcyBub3QgYSBEaXJlY3RYIDkuMCBkcml2ZXIuCi0JCWNhcHMuTWF4U3RyZWFtU3RyaWRlID0gNjU1MzY7CQkJCQkvLyBNYXhpbXVtIHN0cmlkZSBmb3IgSURpcmVjdDNERGV2aWNlODo6U2V0U3RyZWFtU291cmNlLgotCQljYXBzLlZlcnRleFNoYWRlclZlcnNpb24gPSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uOwkvLyBUd28gbnVtYmVycyB0aGF0IHJlcHJlc2VudCB0aGUgdmVydGV4IHNoYWRlciBtYWluIGFuZCBzdWIgdmVyc2lvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkIGZvciBlYWNoIHZlcnRleCBzaGFkZXIgdmVyc2lvbiwgc2VlIFZlcnNpb24gMV94LCBWZXJzaW9uIDJfMCwgVmVyc2lvbiAyXzAgRXh0ZW5kZWQsIG9yIFZlcnNpb24gM18wLgotCQljYXBzLk1heFZlcnRleFNoYWRlckNvbnN0ID0gMjU2OwkJCQkvLyBUaGUgbnVtYmVyIG9mIHZlcnRleCBzaGFkZXIgUmVnaXN0ZXJzIHRoYXQgYXJlIHJlc2VydmVkIGZvciBjb25zdGFudHMuCi0JCWNhcHMuUGl4ZWxTaGFkZXJWZXJzaW9uID0gcGl4ZWxTaGFkZXJWZXJzaW9uOwkvLyBUd28gbnVtYmVycyB0aGF0IHJlcHJlc2VudCB0aGUgcGl4ZWwgc2hhZGVyIG1haW4gYW5kIHN1YiB2ZXJzaW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgZm9yIGVhY2ggcGl4ZWwgc2hhZGVyIHZlcnNpb24sIHNlZSBWZXJzaW9uIDFfeCwgVmVyc2lvbiAyXzAsIFZlcnNpb24gMl8wIEV4dGVuZGVkLCBvciBWZXJzaW9uIDNfMC4KLQkJY2Fwcy5NYXhQaXhlbFNoYWRlclZhbHVlID0gOC4wOwotCQkKLQkJKmNhcGFiaWxpdGllcyA9IGNhcHM7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEODo6UmVnaXN0ZXJTb2Z0d2FyZURldmljZSh2b2lkICppbml0aWFsaXplRnVuY3Rpb24pCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJbG9hZFN5c3RlbUQzRDgoKTsKLQotCQlpZihkM2Q4KQotCQl7Ci0JCQlyZXR1cm4gZDNkOC0+UmVnaXN0ZXJTb2Z0d2FyZURldmljZShpbml0aWFsaXplRnVuY3Rpb24pOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEODo6bG9hZFN5c3RlbUQzRDgoKQotCXsKLQkJaWYoZDNkOCkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2hhciBkM2Q4UGF0aFtNQVhfUEFUSCArIDE2XTsKLQkJR2V0U3lzdGVtRGlyZWN0b3J5KGQzZDhQYXRoLCBNQVhfUEFUSCk7Ci0JCXN0cmNhdChkM2Q4UGF0aCwgIlxcZDNkOC5kbGwiKTsKLQkJZDNkOExpYiA9IExvYWRMaWJyYXJ5KGQzZDhQYXRoKTsKLQotCQlpZihkM2Q4TGliKQotCQl7Ci0JCQl0eXBlZGVmIElEaXJlY3QzRDgqIChfX3N0ZGNhbGwgKkRJUkVDVDNEQ1JFQVRFOCkodW5zaWduZWQgaW50KTsKLQkJCURJUkVDVDNEQ1JFQVRFOCBkaXJlY3QzRENyZWF0ZTggPSAoRElSRUNUM0RDUkVBVEU4KUdldFByb2NBZGRyZXNzKGQzZDhMaWIsICJEaXJlY3QzRENyZWF0ZTgiKTsKLQkJCWQzZDggPSBkaXJlY3QzRENyZWF0ZTgoRDNEX1NES19WRVJTSU9OKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRDguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzUxNGEzLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEOC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDhfRGlyZWN0M0Q4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNEOF9ocHAKLQotI2luY2x1ZGUgIlVua25vd24uaHBwIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxpbml0Z3VpZC5oPgotI2luY2x1ZGUgPGQzZDguaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzRERldmljZTg7Ci0KLQljbGFzcyBEaXJlY3QzRDggOiBwdWJsaWMgSURpcmVjdDNEOCwgcHJvdGVjdGVkIFVua25vd24KLQl7Ci0JcHVibGljOgotCQlEaXJlY3QzRDgoaW50IHZlcnNpb24sIGNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZSk7Ci0KLQkJfkRpcmVjdDNEOCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRDggbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBDaGVja0RlcHRoU3RlbmNpbE1hdGNoKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBEM0RGT1JNQVQgZGVwdGhTdGVuY2lsRm9ybWF0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VGb3JtYXQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXBhdGVyRm9ybWF0LCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgRDNERk9STUFUIGNoZWNrRm9ybWF0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQsIGludCB3aW5kb3dlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDaGVja0RldmljZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgY2hlY2tUeXBlLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCwgRDNERk9STUFUIGJhY2tCdWZmZXJGb3JtYXQsIGludCB3aW5kb3dlZCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZURldmljZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBIV05EIGZvY3VzV2luZG93LCB1bnNpZ25lZCBsb25nIGJlaGF2aW9yRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRERldmljZTggKipyZXR1cm5lZERldmljZUludGVyZmFjZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEVudW1BZGFwdGVyTW9kZXModW5zaWduZWQgaW50IGFkYXB0ZXIsIHVuc2lnbmVkIGludCBpbmRleCwgRDNERElTUExBWU1PREUgKm1vZGUpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBpbnQgX19zdGRjYWxsIEdldEFkYXB0ZXJDb3VudCgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRBZGFwdGVyRGlzcGxheU1vZGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERJU1BMQVlNT0RFICptb2RlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0QWRhcHRlcklkZW50aWZpZXIodW5zaWduZWQgaW50IGFkYXB0ZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIEQzREFEQVBURVJfSURFTlRJRklFUjggKmlkZW50aWZpZXIpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBpbnQgX19zdGRjYWxsIEdldEFkYXB0ZXJNb2RlQ291bnQodW5zaWduZWQgaW50IGFkYXB0ZXIpIG92ZXJyaWRlOwotCQlITU9OSVRPUiBfX3N0ZGNhbGwgR2V0QWRhcHRlck1vbml0b3IodW5zaWduZWQgaW50IGFkYXB0ZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2VDYXBzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzRENBUFM4ICpjYXBzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgUmVnaXN0ZXJTb2Z0d2FyZURldmljZSh2b2lkICppbml0aWFsaXplRnVuY3Rpb24pIG92ZXJyaWRlOwotCi0JcHJpdmF0ZToKLQkJdm9pZCBsb2FkU3lzdGVtRDNEOCgpOwotCi0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJY29uc3QgaW50IHZlcnNpb247Ci0JCWNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZTsKLQotCQlERVZNT0RFICpkaXNwbGF5TW9kZTsKLQkJaW50IG51bURpc3BsYXlNb2RlczsKLQotCQkvLyBSZWFsIEQzRDggbGlicmFyeSBhbmQgSURpcmVjdDNEOCBvYmplY3QKLQkJSE1PRFVMRSBkM2Q4TGliOwotCQlJRGlyZWN0M0Q4ICpkM2Q4OwotCX07Ci19Ci0KLSNlbmRpZiAgIC8vIEQzRDhfRGlyZWN0M0Q4X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RCYXNlVGV4dHVyZTguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0RCYXNlVGV4dHVyZTguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTFhYTc2Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEQmFzZVRleHR1cmU4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwIgotCi0jaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotbmFtZXNwYWNlIEQzRDgKLXsKLQlEaXJlY3QzREJhc2VUZXh0dXJlODo6RGlyZWN0M0RCYXNlVGV4dHVyZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSkgOiBEaXJlY3QzRFJlc291cmNlOChkZXZpY2UsIHR5cGUsIDApLCBsZXZlbHMobGV2ZWxzKSwgdXNhZ2UodXNhZ2UpCi0JewotCQlmaWx0ZXJUeXBlID0gRDNEVEVYRl9MSU5FQVI7Ci0JCUxPRCA9IDA7Ci0KLQkJcmVzb3VyY2UgPSBuZXcgc3c6OlJlc291cmNlKDApOwotCX0KLQotCURpcmVjdDNEQmFzZVRleHR1cmU4Ojp+RGlyZWN0M0RCYXNlVGV4dHVyZTgoKQotCXsKLQkJcmVzb3VyY2UtPmRlc3RydWN0KCk7Ci0JfQotCQotCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEQmFzZVRleHR1cmU4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSVVua25vd24pCi0JCXsKLQkJCUFkZFJlZigpOwotCQkJKm9iamVjdCA9IHRoaXM7Ci0KLQkJCXJldHVybiBTX09LOwotCQl9Ci0KLQkJKm9iamVjdCA9IDA7Ci0KLQkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlODo6QWRkUmVmKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEQmFzZVRleHR1cmU4OjpQcmVMb2FkKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlEaXJlY3QzRFJlc291cmNlODo6UHJlTG9hZCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkdldERldmljZShkZXZpY2UpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0UHJpb3JpdHkoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0UHJpb3JpdHkoKTsKLQl9Ci0KLQlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFR5cGUoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0VHlwZSgpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldExldmVsQ291bnQoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBsZXZlbHM7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0TE9EKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gTE9EOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlMT0QgPSBuZXdMT0Q7Ci0KLQkJcmV0dXJuIDA7ICAgLy8gVE9ETwotCX0KLQotCXN3OjpSZXNvdXJjZSAqRGlyZWN0M0RCYXNlVGV4dHVyZTg6OmdldFJlc291cmNlKCkgY29uc3QKLQl7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU4OjpnZXRJbnRlcm5hbExldmVsQ291bnQoKQotCXsKLQkJcmV0dXJuIGxldmVsczsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzREJhc2VUZXh0dXJlOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzREJhc2VUZXh0dXJlOC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzgwYjUuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q4X0RpcmVjdDNEQmFzZVRleHR1cmU4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNEQmFzZVRleHR1cmU4X2hwcAotCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTguaHBwIgotCi0jaW5jbHVkZSA8ZDNkOC5oPgotCi1uYW1lc3BhY2Ugc3cKLXsKLQljbGFzcyBSZXNvdXJjZTsKLX0KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzREJhc2VUZXh0dXJlOCA6IHB1YmxpYyBJRGlyZWN0M0RCYXNlVGV4dHVyZTgsIHB1YmxpYyBEaXJlY3QzRFJlc291cmNlOAotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEQmFzZVRleHR1cmU4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpOwotCi0JCX5EaXJlY3QzREJhc2VUZXh0dXJlOCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKSBvdmVycmlkZTsKLQkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEQmFzZVRleHR1cmU4IG1ldGhvZHMKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKSBvdmVycmlkZTsKLQotCQkvLyBJbnRlbmFsIG1ldGhvZHMKLQkJc3c6OlJlc291cmNlICpnZXRSZXNvdXJjZSgpIGNvbnN0OwotCQl1bnNpZ25lZCBsb25nIGdldEludGVybmFsTGV2ZWxDb3VudCgpOwotCi0JcHJvdGVjdGVkOgotCQkvLyBDcmVhdGlvbiBwYXJhbXRlcnMKLQkJdW5zaWduZWQgbG9uZyBsZXZlbHM7ICAgLy8gUmVjYWxjdWxhdGVkIHdoZW4gMAotCQljb25zdCB1bnNpZ25lZCBsb25nIHVzYWdlOwotCi0JCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2U7Ci0KLQlwcml2YXRlOgotCQlEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXJUeXBlOwotCQl1bnNpZ25lZCBsb25nIExPRDsKLQl9OwotfQotCi0jZW5kaWYgLy8gRDNEOF9EaXJlY3QzREJhc2VUZXh0dXJlOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEQ3ViZVRleHR1cmU4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEQ3ViZVRleHR1cmU4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyYjliNS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzREN1YmVUZXh0dXJlOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEQ3ViZVRleHR1cmU4LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTguaHBwIgotI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQlEaXJlY3QzREN1YmVUZXh0dXJlODo6RGlyZWN0M0RDdWJlVGV4dHVyZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIHVuc2lnbmVkIGludCBlZGdlTGVuZ3RoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RCYXNlVGV4dHVyZTgoZGV2aWNlLCBEM0RSVFlQRV9DVUJFVEVYVFVSRSwgbGV2ZWxzLCB1c2FnZSksIGVkZ2VMZW5ndGgoZWRnZUxlbmd0aCksIGZvcm1hdChmb3JtYXQpLCBwb29sKHBvb2wpCi0JewotCQlpZihsZXZlbHMgPT0gMCkKLQkJewotCQkJdGhpcy0+bGV2ZWxzID0gc3c6OmxvZzIoc3c6Om1heCgoaW50KWVkZ2VMZW5ndGgsIDEpKSArIDE7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQotCQl7Ci0JCQlpbnQgd2lkdGggPSBlZGdlTGVuZ3RoOwotCQkJaW50IGhlaWdodCA9IGVkZ2VMZW5ndGg7Ci0KLQkJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQotCQkJewotCQkJCWlmKGxldmVsIDwgdGhpcy0+bGV2ZWxzKQotCQkJCXsKLQkJCQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSA9IG5ldyBEaXJlY3QzRFN1cmZhY2U4KGRldmljZSwgdGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwb29sLCBEM0RNVUxUSVNBTVBMRV9OT05FLCB0cnVlLCB1c2FnZSk7Ci0JCQkJCXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0tPmJpbmQoKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSA9IDA7Ci0JCQkJfQotCi0JCQkJd2lkdGggPSBzdzo6bWF4KDEsIHdpZHRoIC8gMik7Ci0JCQkJaGVpZ2h0ID0gc3c6Om1heCgxLCBoZWlnaHQgLyAyKTsKLQkJCX0KLQkJfQotCX0KLQotCURpcmVjdDNEQ3ViZVRleHR1cmU4Ojp+RGlyZWN0M0RDdWJlVGV4dHVyZTgoKQotCXsKLQkJZm9yKHVuc2lnbmVkIGludCBmYWNlID0gMDsgZmFjZSA8IDY7IGZhY2UrKykKLQkJewotCQkJZm9yKGludCBsZXZlbCA9IDA7IGxldmVsIDwgc3c6Ok1JUE1BUF9MRVZFTFM7IGxldmVsKyspCi0JCQl7Ci0JCQkJaWYoc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSkKLQkJCQl7Ci0JCQkJCXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0tPnVuYmluZCgpOwotCQkJCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzREN1YmVUZXh0dXJlOCB8fAotCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzREJhc2VUZXh0dXJlOCB8fAotCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOCB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpBZGRSZWYoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzREN1YmVUZXh0dXJlODo6UHJlTG9hZCgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlByZUxvYWQoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlODo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXREZXZpY2UoZGV2aWNlKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkdldFByaW9yaXR5KCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFByaW9yaXR5KCk7Ci0JfQotCi0JRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpHZXRUeXBlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFR5cGUoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpHZXRMZXZlbENvdW50KCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldExldmVsQ291bnQoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpHZXRMT0QoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0TE9EKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlODo6U2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6U2V0TE9EKG5ld0xPRCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlODo6QWRkRGlydHlSZWN0KEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgY29uc3QgUkVDVCAqZGlydHlSZWN0KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JLy8JVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlODo6R2V0Q3ViZU1hcFN1cmZhY2UoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwgLCBJRGlyZWN0M0RTdXJmYWNlOCAqKmN1YmVNYXBTdXJmYWNlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCSpjdWJlTWFwU3VyZmFjZSA9IDA7ICAgLy8gRklYTUU6IFZlcmlmeQotCi0JCWlmKGZhY2UgPj0gNiB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXS0+QWRkUmVmKCk7Ci0JCSpjdWJlTWFwU3VyZmFjZSA9IHN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF07Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RTVVJGQUNFX0RFU0MgKmRlc2NyaXB0aW9uKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXNjcmlwdGlvbiB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFswXVtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJc3VyZmFjZUxldmVsWzBdW2xldmVsXS0+R2V0RGVzYyhkZXNjcmlwdGlvbik7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpMb2NrUmVjdChEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCwgRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QsIGNvbnN0IFJFQ1QgKnJlY3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWxvY2tlZFJlY3QgfHwgZmFjZSA+PSA2IHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdLT5Mb2NrUmVjdChsb2NrZWRSZWN0LCByZWN0LCBmbGFncyk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpVbmxvY2tSZWN0KEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGZhY2UgPj0gNiB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0tPlVubG9ja1JlY3QoKTsKLQl9Ci0KLQlEaXJlY3QzRFN1cmZhY2U4ICpEaXJlY3QzREN1YmVUZXh0dXJlODo6Z2V0SW50ZXJuYWxDdWJlTWFwU3VyZmFjZShEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCkKLQl7Ci0JCXJldHVybiBzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEQ3ViZVRleHR1cmU4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEQ3ViZVRleHR1cmU4LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzYWZhZi4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzREN1YmVUZXh0dXJlOC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDhfRGlyZWN0M0RDdWJlVGV4dHVyZThfaHBwCi0jZGVmaW5lIEQzRDhfRGlyZWN0M0RDdWJlVGV4dHVyZThfaHBwCi0KLSNpbmNsdWRlICJEaXJlY3QzREJhc2VUZXh0dXJlOC5ocHAiCi0KLSNpbmNsdWRlICJDb25maWcuaHBwIgotCi0jaW5jbHVkZSA8ZDNkOC5oPgotCi1uYW1lc3BhY2UgRDNEOAotewotCWNsYXNzIERpcmVjdDNEU3VyZmFjZTg7Ci0KLQljbGFzcyBEaXJlY3QzREN1YmVUZXh0dXJlOCA6IHB1YmxpYyBJRGlyZWN0M0RDdWJlVGV4dHVyZTgsIHB1YmxpYyBEaXJlY3QzREJhc2VUZXh0dXJlOAotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEQ3ViZVRleHR1cmU4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKLQotCQl+RGlyZWN0M0RDdWJlVGV4dHVyZTgoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTggbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpIG92ZXJyaWRlOwotCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCkgb3ZlcnJpZGU7Ci0JCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzREJhc2VUZXh0dXJlIG1ldGhvZHMKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RDdWJlVGV4dHVyZTggbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBBZGREaXJ0eVJlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCBjb25zdCBSRUNUICpkaXJ0eVJlY3QpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRDdWJlTWFwU3VyZmFjZShEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCAsIElEaXJlY3QzRFN1cmZhY2U4ICoqY3ViZU1hcFN1cmZhY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RTVVJGQUNFX0RFU0MgKmRlc2NyaXB0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgTG9ja1JlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRExPQ0tFRF9SRUNUICpsb2NrZWRSZWN0LCBjb25zdCBSRUNUICpyZWN0LCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrUmVjdChEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQlEaXJlY3QzRFN1cmZhY2U4ICpnZXRJbnRlcm5hbEN1YmVNYXBTdXJmYWNlKEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsKTsKLQotCXByaXZhdGU6Ci0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJY29uc3QgdW5zaWduZWQgaW50IGVkZ2VMZW5ndGg7Ci0JCWNvbnN0IEQzREZPUk1BVCBmb3JtYXQ7Ci0JCWNvbnN0IEQzRFBPT0wgcG9vbDsKLQotCQlEaXJlY3QzRFN1cmZhY2U4ICpzdXJmYWNlTGV2ZWxbNl1bc3c6Ok1JUE1BUF9MRVZFTFNdOwotCX07Ci19Ci0KLSNlbmRpZiAvLyBEM0Q4X0RpcmVjdDNEOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNERGV2aWNlOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRERldmljZTguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTBhNDYzLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNERGV2aWNlOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTguaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0Q4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzREluZGV4QnVmZmVyOC5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFRleHR1cmU4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZVRleHR1cmU4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzREN1YmVUZXh0dXJlOC5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RTd2FwQ2hhaW44LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFBpeGVsU2hhZGVyOC5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZTguaHBwIgotCi0jaW5jbHVkZSAiRGVidWcuaHBwIgotI2luY2x1ZGUgIkNhcGFiaWxpdGllcy5ocHAiCi0jaW5jbHVkZSAiUmVuZGVyZXIuaHBwIgotI2luY2x1ZGUgIkNvbmZpZy5ocHAiCi0jaW5jbHVkZSAiRnJhbWVCdWZmZXIuaHBwIgotI2luY2x1ZGUgIkNsaXBwZXIuaHBwIgotI2luY2x1ZGUgIkNvbmZpZ3VyYXRvci5ocHAiCi0jaW5jbHVkZSAiVGltZXIuaHBwIgotI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1ib29sIGxvY2FsU2hhZGVyQ29uc3RhbnRzID0gZmFsc2U7Ci0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JaW5saW5lIHVuc2lnbmVkIGxvbmcgRnRvRFcoZmxvYXQgZikgICAvLyBGSVhNRTogRGVwcmVjYXRlCi0JewotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcmKWY7Ci0JfQotCi0JRGlyZWN0M0REZXZpY2U4OjpEaXJlY3QzRERldmljZTgoY29uc3QgSElOU1RBTkNFIGluc3RhbmNlLCBEaXJlY3QzRDggKmQzZDgsIHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3VyRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpIDogaW5zdGFuY2UoaW5zdGFuY2UpLCBkM2Q4KGQzZDgpLCBhZGFwdGVyKGFkYXB0ZXIpLCBkZXZpY2VUeXBlKGRldmljZVR5cGUpLCBmb2N1c1dpbmRvdyhmb2N1c1dpbmRvdyksIGJlaGF2aW91ckZsYWdzKGJlaGF2aW91ckZsYWdzKSwgcHJlc2VudFBhcmFtZXRlcnMoKnByZXNlbnRQYXJhbWV0ZXJzKQotCXsKLQkJaW5pdCA9IHRydWU7Ci0JCXJlY29yZFN0YXRlID0gZmFsc2U7Ci0KLQkJZDNkOC0+QWRkUmVmKCk7Ci0KLQkJY29udGV4dCA9IG5ldyBzdzo6Q29udGV4dCgpOwotCQlyZW5kZXJlciA9IG5ldyBzdzo6UmVuZGVyZXIoY29udGV4dCwgc3c6OkRpcmVjdDNELCBmYWxzZSk7Ci0KLQkJc3dhcENoYWluLnB1c2hfYmFjaygwKTsKLQkJZGVwdGhTdGVuY2lsID0gMDsKLQkJcmVuZGVyVGFyZ2V0ID0gMDsKLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCQl0ZXh0dXJlW2ldID0gMDsKLQkJfQotCi0JCWN1cnNvciA9IDA7Ci0JCXVuc2lnbmVkIGNoYXIgb25lWzMyICogMzIgLyBzaXplb2YodW5zaWduZWQgY2hhcildOwotCQltZW1zZXQob25lLCAweEZGRkZGRkZGLCBzaXplb2Yob25lKSk7Ci0JCXVuc2lnbmVkIGNoYXIgemVyb1szMiAqIDMyIC8gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpXSA9IHswfTsKLQkJbnVsbEN1cnNvciA9IENyZWF0ZUN1cnNvcihpbnN0YW5jZSwgMCwgMCwgMzIsIDMyLCBvbmUsIHplcm8pOwotCQl3aW4zMkN1cnNvciA9IEdldEN1cnNvcigpOwotCi0JCVJlc2V0KHByZXNlbnRQYXJhbWV0ZXJzKTsKLQotCQlwaXhlbFNoYWRlci5wdXNoX2JhY2soMCk7ICAgLy8gcGl4ZWxTaGFkZXJbMF0gPSAwCi0JCXZlcnRleFNoYWRlci5wdXNoX2JhY2soMCk7ICAgLy8gdmVydGV4U2hhZGVyWzBdID0gMAotCQl2ZXJ0ZXhTaGFkZXJIYW5kbGUgPSAwOwotCQlwaXhlbFNoYWRlckhhbmRsZSA9IDA7Ci0KLQkJbGlnaHRzRGlydHkgPSB0cnVlOwotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQotCQl7Ci0JCQlkYXRhU3RyZWFtW2ldID0gMDsKLQkJCXN0cmVhbVN0cmlkZVtpXSA9IDA7Ci0JCX0KLQotCQlpbmRleERhdGEgPSAwOwotCQliYXNlVmVydGV4SW5kZXggPSAwOwotCQlkZWNsYXJhdGlvbiA9IDA7Ci0JCUZWRiA9IDA7Ci0KLQkJRDNETUFURVJJQUw4IG1hdGVyaWFsOwotCi0JCW1hdGVyaWFsLkRpZmZ1c2UuciA9IDEuMGY7Ci0JCW1hdGVyaWFsLkRpZmZ1c2UuZyA9IDEuMGY7Ci0JCW1hdGVyaWFsLkRpZmZ1c2UuYiA9IDEuMGY7Ci0JCW1hdGVyaWFsLkRpZmZ1c2UuYSA9IDAuMGY7Ci0JCW1hdGVyaWFsLkFtYmllbnQuciA9IDAuMGY7Ci0JCW1hdGVyaWFsLkFtYmllbnQuZyA9IDAuMGY7Ci0JCW1hdGVyaWFsLkFtYmllbnQuYiA9IDAuMGY7Ci0JCW1hdGVyaWFsLkFtYmllbnQuYSA9IDAuMGY7Ci0JCW1hdGVyaWFsLkVtaXNzaXZlLnIgPSAwLjBmOwotCQltYXRlcmlhbC5FbWlzc2l2ZS5nID0gMC4wZjsKLQkJbWF0ZXJpYWwuRW1pc3NpdmUuYiA9IDAuMGY7Ci0JCW1hdGVyaWFsLkVtaXNzaXZlLmEgPSAwLjBmOwotCQltYXRlcmlhbC5TcGVjdWxhci5yID0gMC4wZjsKLQkJbWF0ZXJpYWwuU3BlY3VsYXIuZyA9IDAuMGY7Ci0JCW1hdGVyaWFsLlNwZWN1bGFyLmIgPSAwLjBmOwotCQltYXRlcmlhbC5TcGVjdWxhci5hID0gMC4wZjsKLQkJbWF0ZXJpYWwuUG93ZXIgPSAwLjBmOwotCi0JCVNldE1hdGVyaWFsKCZtYXRlcmlhbCk7Ci0KLQkJRDNETUFUUklYIGlkZW50aXR5ID0gezEsIDAsIDAsIDAsCi0JCQkgICAgICAgICAgICAgICAgICAwLCAxLCAwLCAwLAotCQkJCQkJCSAgMCwgMCwgMSwgMCwKLQkJCQkJCQkgIDAsIDAsIDAsIDF9OwotCi0JCVNldFRyYW5zZm9ybShEM0RUU19WSUVXLCAmaWRlbnRpdHkpOwotCQlTZXRUcmFuc2Zvcm0oRDNEVFNfUFJPSkVDVElPTiwgJmlkZW50aXR5KTsKLQkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUwLCAmaWRlbnRpdHkpOwotCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTEsICZpZGVudGl0eSk7Ci0JCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFMiwgJmlkZW50aXR5KTsKLQkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUzLCAmaWRlbnRpdHkpOwotCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTQsICZpZGVudGl0eSk7Ci0JCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFNSwgJmlkZW50aXR5KTsKLQkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU2LCAmaWRlbnRpdHkpOwotCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTcsICZpZGVudGl0eSk7Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCi0JCXsKLQkJCVNldFRyYW5zZm9ybShEM0RUU19XT1JMRE1BVFJJWChpKSwgJmlkZW50aXR5KTsKLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCWZsb2F0IHplcm9bNF0gPSB7MCwgMCwgMCwgMH07Ci0KLQkJCVNldFBpeGVsU2hhZGVyQ29uc3RhbnQoaSwgemVybywgMSk7Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCXsKLQkJCWZsb2F0IHplcm9bNF0gPSB7MCwgMCwgMCwgMH07Ci0KLQkJCVNldFZlcnRleFNoYWRlckNvbnN0YW50KGksIHplcm8sIDEpOwotCQl9Ci0KLQkJaW5pdCA9IGZhbHNlOwotCi0JCWlmKCEoYmVoYXZpb3VyRmxhZ3MgJiBEM0RDUkVBVEVfRlBVX1BSRVNFUlZFKSkKLQkJewotCQkJY29uZmlndXJlRlBVKCk7Ci0JCX0KLQl9Ci0KLQlEaXJlY3QzRERldmljZTg6On5EaXJlY3QzRERldmljZTgoKQotCXsKLQkJZGVsZXRlIHJlbmRlcmVyOwotCQlyZW5kZXJlciA9IDA7Ci0JCWRlbGV0ZSBjb250ZXh0OwotCQljb250ZXh0ID0gMDsKLQotCQlkM2Q4LT5SZWxlYXNlKCk7Ci0JCWQzZDggPSAwOwotCi0JCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzd2FwQ2hhaW4uc2l6ZSgpOyBpKyspCi0JCXsKLQkJCWlmKHN3YXBDaGFpbltpXSkKLQkJCXsKLQkJCQlzd2FwQ2hhaW5baV0tPnVuYmluZCgpOwotCQkJCXN3YXBDaGFpbltpXSA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlpZihkZXB0aFN0ZW5jaWwpCi0JCXsKLQkJCWRlcHRoU3RlbmNpbC0+dW5iaW5kKCk7Ci0JCQlkZXB0aFN0ZW5jaWwgPSAwOwotCQl9Ci0KLQkJaWYocmVuZGVyVGFyZ2V0KQotCQl7Ci0JCQlyZW5kZXJUYXJnZXQtPnVuYmluZCgpOwotCQkJcmVuZGVyVGFyZ2V0ID0gMDsKLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCWlmKHRleHR1cmVbaV0pCi0JCQl7Ci0JCQkJdGV4dHVyZVtpXS0+dW5iaW5kKCk7Ci0JCQkJdGV4dHVyZVtpXSA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJewotCQkJaWYoZGF0YVN0cmVhbVtpXSkKLQkJCXsKLQkJCQlkYXRhU3RyZWFtW2ldLT51bmJpbmQoKTsKLQkJCQlkYXRhU3RyZWFtW2ldID0gMDsKLQkJCX0KLQkJfQotCi0JCWlmKGluZGV4RGF0YSkKLQkJewotCQkJaW5kZXhEYXRhLT51bmJpbmQoKTsKLQkJCWluZGV4RGF0YSA9IDA7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGl4ZWxTaGFkZXIuc2l6ZSgpOyBpKyspCi0JCXsKLQkJCWlmKHBpeGVsU2hhZGVyW2ldKQotCQkJewotCQkJCXBpeGVsU2hhZGVyW2ldLT51bmJpbmQoKTsKLQkJCQlwaXhlbFNoYWRlcltpXSA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdmVydGV4U2hhZGVyLnNpemUoKTsgaSsrKQotCQl7Ci0JCQlpZih2ZXJ0ZXhTaGFkZXJbaV0pCi0JCQl7Ci0JCQkJdmVydGV4U2hhZGVyW2ldLT51bmJpbmQoKTsKLQkJCQl2ZXJ0ZXhTaGFkZXJbaV0gPSAwOwotCQkJfQotCQl9Ci0KLQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0YXRlUmVjb3JkZXIuc2l6ZSgpOyBpKyspCi0JCXsKLQkJCWlmKHN0YXRlUmVjb3JkZXJbaV0pCi0JCQl7Ci0JCQkJc3RhdGVSZWNvcmRlcltpXS0+dW5iaW5kKCk7Ci0JCQkJc3RhdGVSZWNvcmRlcltpXSA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlwYWxldHRlLmNsZWFyKCk7Ci0KLQkJZGVsZXRlIGN1cnNvcjsKLQkJRGVzdHJveUN1cnNvcihudWxsQ3Vyc29yKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoaWlkID09IElJRF9JRGlyZWN0M0REZXZpY2U4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSVVua25vd24pCi0JCXsKLQkJCUFkZFJlZigpOwotCQkJKm9iamVjdCA9IHRoaXM7Ci0KLQkJCXJldHVybiBTX09LOwotCQl9Ci0KLQkJKm9iamVjdCA9IDA7Ci0KLQkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRERldmljZTg6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0REZXZpY2U4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpBcHBseVN0YXRlQmxvY2sodW5zaWduZWQgbG9uZyB0b2tlbikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlzdGF0ZVJlY29yZGVyW3Rva2VuXS0+QXBwbHkoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpCZWdpblNjZW5lKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpCZWdpblN0YXRlQmxvY2soKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJlY29yZFN0YXRlID0gdHJ1ZTsKLQkJRGlyZWN0M0RTdGF0ZUJsb2NrOCAqc3RhdGVCbG9jayA9IG5ldyBEaXJlY3QzRFN0YXRlQmxvY2s4KHRoaXMsIChEM0RTVEFURUJMT0NLVFlQRSkwKTsKLQkJc3RhdGVCbG9jay0+YmluZCgpOwotCQlzdGF0ZVJlY29yZGVyLnB1c2hfYmFjayhzdGF0ZUJsb2NrKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpDYXB0dXJlU3RhdGVCbG9jayh1bnNpZ25lZCBsb25nIHRva2VuKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXN0YXRlUmVjb3JkZXJbdG9rZW5dLT5DYXB0dXJlKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6Q2xlYXIodW5zaWduZWQgbG9uZyBjb3VudCwgY29uc3QgRDNEUkVDVCAqcmVjdHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgY29sb3IsIGZsb2F0IHosIHVuc2lnbmVkIGxvbmcgc3RlbmNpbCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGNvdW50ID0gJWQsIGNvbnN0IEQzRFJFQ1QgKnJlY3RzID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyBmbGFncyA9IDB4JTAuOFgsIHVuc2lnbmVkIGxvbmcgY29sb3IgPSAweCUwLjhYLCBmbG9hdCB6ID0gJWYsIHVuc2lnbmVkIGxvbmcgc3RlbmNpbCA9ICVkIiwgY291bnQsIHJlY3RzLCBmbGFncywgY29sb3IsIHosIHN0ZW5jaWwpOwotCi0JCWlmKCFyZWN0cyAmJiBjb3VudCAhPSAwKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKGZsYWdzICYgKEQzRENMRUFSX1pCVUZGRVIgfCBEM0RDTEVBUl9TVEVOQ0lMKSAmJiAhZGVwdGhTdGVuY2lsKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKGZsYWdzICYgRDNEQ0xFQVJfU1RFTkNJTCkgICAvLyBDaGVjayBmb3Igc3RlbmNpbCBjb21wb25lbnQKLQkJewotCQkJRDNEU1VSRkFDRV9ERVNDIGRlc2NyaXB0aW9uOwotCQkJZGVwdGhTdGVuY2lsLT5HZXREZXNjKCZkZXNjcmlwdGlvbik7Ci0KLQkJCXN3aXRjaChkZXNjcmlwdGlvbi5Gb3JtYXQpCi0JCQl7Ci0JCQljYXNlIEQzREZNVF9EMTVTMToKLQkJCWNhc2UgRDNERk1UX0QyNFM4OgotCQkJY2FzZSBEM0RGTVRfRDI0WDg6Ci0JCQljYXNlIEQzREZNVF9EMjRYNFM0OgotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RGTVRfRDE2X0xPQ0tBQkxFOgotCQkJY2FzZSBEM0RGTVRfRDMyOgotCQkJY2FzZSBEM0RGTVRfRDE2OgotCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJaWYoIXJlY3RzKQotCQl7Ci0JCQljb3VudCA9IDE7Ci0KLQkJCUQzRFJFQ1QgcmVjdDsKLQkJCXJlY3QueDEgPSB2aWV3cG9ydC5YOwotCQkJcmVjdC54MiA9IHZpZXdwb3J0LlggKyB2aWV3cG9ydC5XaWR0aDsKLQkJCXJlY3QueTEgPSB2aWV3cG9ydC5ZOwotCQkJcmVjdC55MiA9IHZpZXdwb3J0LlkgKyB2aWV3cG9ydC5IZWlnaHQ7Ci0KLQkJCXJlY3RzID0gJnJlY3Q7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJewotCQkJc3c6OlJlY3QgY2xlYXJSZWN0KHJlY3RzW2ldLngxLCByZWN0c1tpXS55MSwgcmVjdHNbaV0ueDIsIHJlY3RzW2ldLnkyKTsKLQotCQkJY2xlYXJSZWN0LmNsaXAodmlld3BvcnQuWCwgdmlld3BvcnQuWSwgdmlld3BvcnQuWCArIHZpZXdwb3J0LldpZHRoLCB2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0KTsKLQotCQkJaWYoZmxhZ3MgJiBEM0RDTEVBUl9UQVJHRVQpCi0JCQl7Ci0JCQkJaWYocmVuZGVyVGFyZ2V0KQotCQkJCXsKLQkJCQkJRDNEU1VSRkFDRV9ERVNDIGRlc2NyaXB0aW9uOwotCQkJCQlyZW5kZXJUYXJnZXQtPkdldERlc2MoJmRlc2NyaXB0aW9uKTsKLQotCQkJCQlmbG9hdCByZ2JhWzRdOwotCQkJCQlyZ2JhWzBdID0gKGZsb2F0KShjb2xvciAmIDB4MDBGRjAwMDApIC8gMHgwMEZGMDAwMDsKLQkJCQkJcmdiYVsxXSA9IChmbG9hdCkoY29sb3IgJiAweDAwMDBGRjAwKSAvIDB4MDAwMEZGMDA7Ci0JCQkJCXJnYmFbMl0gPSAoZmxvYXQpKGNvbG9yICYgMHgwMDAwMDBGRikgLyAweDAwMDAwMEZGOwotCQkJCQlyZ2JhWzNdID0gKGZsb2F0KShjb2xvciAmIDB4RkYwMDAwMDApIC8gMHhGRjAwMDAwMDsKLQotCQkJCQlyZW5kZXJlci0+Y2xlYXIocmdiYSwgc3c6OkZPUk1BVF9BMzJCMzJHMzJSMzJGLCByZW5kZXJUYXJnZXQsIGNsZWFyUmVjdCwgMHhGKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKGZsYWdzICYgRDNEQ0xFQVJfWkJVRkZFUikKLQkJCXsKLQkJCQl6ID0gc3c6OmNsYW1wMDEoeik7Ci0JCQkJZGVwdGhTdGVuY2lsLT5jbGVhckRlcHRoKHosIGNsZWFyUmVjdC54MCwgY2xlYXJSZWN0LnkwLCBjbGVhclJlY3Qud2lkdGgoKSwgY2xlYXJSZWN0LmhlaWdodCgpKTsKLQkJCX0KLQotCQkJaWYoZmxhZ3MgJiBEM0RDTEVBUl9TVEVOQ0lMKQotCQkJewotCQkJCWRlcHRoU3RlbmNpbC0+Y2xlYXJTdGVuY2lsKHN0ZW5jaWwsIDB4RkYsIGNsZWFyUmVjdC54MCwgY2xlYXJSZWN0LnkwLCBjbGVhclJlY3Qud2lkdGgoKSwgY2xlYXJSZWN0LmhlaWdodCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkNvcHlSZWN0cyhJRGlyZWN0M0RTdXJmYWNlOCAqc291cmNlU3VyZmFjZSwgY29uc3QgUkVDVCAqc291cmNlUmVjdHNBcnJheSwgdW5zaWduZWQgaW50IHJlY3RzLCBJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdGluYXRpb25TdXJmYWNlLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50c0FycmF5KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFzb3VyY2VTdXJmYWNlIHx8ICFkZXN0aW5hdGlvblN1cmZhY2UpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoc291cmNlUmVjdHNBcnJheSAmJiByZWN0cyA9PSAwIHx8ICFzb3VyY2VSZWN0c0FycmF5ICYmIHJlY3RzID4gMCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7ICAgLy8gRklYTUU6IFZlcmlmeSBSRUYgYmVoYXZpb3VyCi0JCX0KLQotCQlEM0RTVVJGQUNFX0RFU0Mgc291cmNlRGVzY3JpcHRpb247Ci0JCUQzRFNVUkZBQ0VfREVTQyBkZXN0RGVzY3JpcHRpb247Ci0KLQkJc291cmNlU3VyZmFjZS0+R2V0RGVzYygmc291cmNlRGVzY3JpcHRpb24pOwotCQlkZXN0aW5hdGlvblN1cmZhY2UtPkdldERlc2MoJmRlc3REZXNjcmlwdGlvbik7Ci0KLQkJaWYoc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ICE9IGRlc3REZXNjcmlwdGlvbi5Gb3JtYXQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaW50IHNXaWR0aCA9IHNvdXJjZURlc2NyaXB0aW9uLldpZHRoOwotCQlpbnQgc0hlaWdodCA9IHNvdXJjZURlc2NyaXB0aW9uLkhlaWdodDsKLQkJaW50IGRXaWR0aCA9IGRlc3REZXNjcmlwdGlvbi5XaWR0aDsKLQkJaW50IGRIZWlnaHQgPSBkZXN0RGVzY3JpcHRpb24uSGVpZ2h0OwotCi0JCVJFQ1Qgc1JlY3QgPSB7MCwgMCwgc1dpZHRoLCBzSGVpZ2h0fTsKLQkJUE9JTlQgZFBvaW50ID0gezAsIDB9OwotCi0JCWlmKCFzb3VyY2VSZWN0c0FycmF5IHx8ICFkZXN0UG9pbnRzQXJyYXkpCi0JCXsKLQkJCXNvdXJjZVJlY3RzQXJyYXkgPSAmc1JlY3Q7Ci0JCQlkZXN0UG9pbnRzQXJyYXkgPSAmZFBvaW50OwotCi0JCQlyZWN0cyA9IDE7Ci0JCX0KLQotCQlpbnQgYnBwID0gOCAqIERpcmVjdDNEU3VyZmFjZTg6OmJ5dGVzKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCk7Ci0KLQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHJlY3RzOyBpKyspCi0JCXsKLQkJCWNvbnN0IFJFQ1QgJnNSZWN0ID0gc291cmNlUmVjdHNBcnJheVtpXTsKLQkJCWNvbnN0IFBPSU5UICZkUG9pbnQgPSBkZXN0UG9pbnRzQXJyYXlbaV07Ci0KLQkJCWludCByV2lkdGggPSBzUmVjdC5yaWdodCAtIHNSZWN0LmxlZnQ7Ci0JCQlpbnQgckhlaWdodCA9IHNSZWN0LmJvdHRvbSAtIHNSZWN0LnRvcDsKLQotCQkJUkVDVCBkUmVjdDsKLQotCQkJZFJlY3QudG9wID0gZFBvaW50Lnk7Ci0JCQlkUmVjdC5sZWZ0ID0gZFBvaW50Lng7Ci0JCQlkUmVjdC5ib3R0b20gPSBkUG9pbnQueSArIHJIZWlnaHQ7Ci0JCQlkUmVjdC5yaWdodCA9IGRQb2ludC54ICsgcldpZHRoOwotCi0JCQlEM0RMT0NLRURfUkVDVCBzb3VyY2VMb2NrOwotCQkJRDNETE9DS0VEX1JFQ1QgZGVzdExvY2s7Ci0KLQkJCXNvdXJjZVN1cmZhY2UtPkxvY2tSZWN0KCZzb3VyY2VMb2NrLCAmc1JlY3QsIEQzRExPQ0tfUkVBRE9OTFkpOwotCQkJZGVzdGluYXRpb25TdXJmYWNlLT5Mb2NrUmVjdCgmZGVzdExvY2ssICZkUmVjdCwgRDNETE9DS19ESVNDQVJEKTsKLQotCQkJZm9yKGludCB5ID0gMDsgeSA8IHJIZWlnaHQ7IHkrKykKLQkJCXsKLQkJCQlzd2l0Y2goc291cmNlRGVzY3JpcHRpb24uRm9ybWF0KQotCQkJCXsKLQkJCQljYXNlIEQzREZNVF9EWFQxOgotCQkJCWNhc2UgRDNERk1UX0RYVDI6Ci0JCQkJY2FzZSBEM0RGTVRfRFhUMzoKLQkJCQljYXNlIEQzREZNVF9EWFQ0OgotCQkJCWNhc2UgRDNERk1UX0RYVDU6Ci0JCQkJCW1lbWNweShkZXN0TG9jay5wQml0cywgc291cmNlTG9jay5wQml0cywgcldpZHRoICogYnBwIC8gOCk7Ci0JCQkJCXkgKz0gMzsgICAvLyBBZHZhbmNlIGZvdXIgbGluZXMgYXQgb25jZQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQltZW1jcHkoZGVzdExvY2sucEJpdHMsIHNvdXJjZUxvY2sucEJpdHMsIHJXaWR0aCAqIGJwcCAvIDgpOwotCQkJCX0KLQotCQkJCShjaGFyKiYpc291cmNlTG9jay5wQml0cyArPSBzb3VyY2VMb2NrLlBpdGNoOwotCQkJCShjaGFyKiYpZGVzdExvY2sucEJpdHMgKz0gZGVzdExvY2suUGl0Y2g7Ci0JCQl9Ci0KLQkJCXNvdXJjZVN1cmZhY2UtPlVubG9ja1JlY3QoKTsKLQkJCWRlc3RpbmF0aW9uU3VyZmFjZS0+VW5sb2NrUmVjdCgpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbihEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzLCBJRGlyZWN0M0RTd2FwQ2hhaW44ICoqc3dhcENoYWluKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCSpzd2FwQ2hhaW4gPSAwOwotCi0JCWlmKCFwcmVzZW50UGFyYW1ldGVycyB8fCAhc3dhcENoYWluKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPiAzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsgICAvLyBNYXhpbXVtIG9mIHRocmVlIGJhY2sgYnVmZmVycwotCQl9Ci0KLQkJaWYocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudCA9PSAwKQotCQl7Ci0JCQlwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckNvdW50ID0gMTsKLQkJfQotCi0JCUQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50ID0gKnByZXNlbnRQYXJhbWV0ZXJzOwotCi0JCSpzd2FwQ2hhaW4gPSBuZXcgRGlyZWN0M0RTd2FwQ2hhaW44KHRoaXMsICZwcmVzZW50KTsKLQotCQlpZighKnN3YXBDaGFpbikKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICpzd2FwQ2hhaW47Ci0KLQkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7Ci0JCX0KLQotCQl0aGlzLT5zd2FwQ2hhaW4ucHVzaF9iYWNrKHN0YXRpY19jYXN0PERpcmVjdDNEU3dhcENoYWluOCo+KCpzd2FwQ2hhaW4pKTsKLQotCQkoKnN3YXBDaGFpbiktPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkNyZWF0ZUN1YmVUZXh0dXJlKHVuc2lnbmVkIGludCBlZGdlTGVuZ3RoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzREN1YmVUZXh0dXJlOCAqKmN1YmVUZXh0dXJlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCSpjdWJlVGV4dHVyZSA9IDA7Ci0KLQkJaWYoZWRnZUxlbmd0aCA9PSAwIHx8IGQzZDgtPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgdXNhZ2UsIEQzRFJUWVBFX0NVQkVURVhUVVJFLCBmb3JtYXQpICE9IEQzRF9PSykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqY3ViZVRleHR1cmUgPSBuZXcgRGlyZWN0M0RDdWJlVGV4dHVyZTgodGhpcywgZWRnZUxlbmd0aCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sKTsKLQotCQlpZighKmN1YmVUZXh0dXJlKQotCQl7Ci0JCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKLQkJfQotCi0JCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQotCQl7Ci0JCQlkZWxldGUgKmN1YmVUZXh0dXJlOwotCi0JCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOwotCQl9Ci0KLQkJKCpjdWJlVGV4dHVyZSktPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkNyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCBJRGlyZWN0M0RTdXJmYWNlOCAqKnN1cmZhY2UpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJKnN1cmZhY2UgPSAwOwotCi0JCWlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZDNkOC0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCBEM0RVU0FHRV9ERVBUSFNURU5DSUwsIEQzRFJUWVBFX1NVUkZBQ0UsIGZvcm1hdCkgIT0gRDNEX09LIHx8IGhlaWdodCA+IHN3OjpPVVRMSU5FX1JFU09MVVRJT04pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnN1cmZhY2UgPSBuZXcgRGlyZWN0M0RTdXJmYWNlOCh0aGlzLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEQzRFBPT0xfREVGQVVMVCwgbXVsdGlTYW1wbGUsIGZvcm1hdCA9PSBEM0RGTVRfRDE2X0xPQ0tBQkxFLCBEM0RVU0FHRV9ERVBUSFNURU5DSUwpOwotCi0JCWlmKCEqc3VyZmFjZSkKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICpzdXJmYWNlOwotCi0JCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOwotCQl9Ci0KLQkJKCpzdXJmYWNlKS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlSW1hZ2VTdXJmYWNlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgSURpcmVjdDNEU3VyZmFjZTggKipzdXJmYWNlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCSpzdXJmYWNlID0gMDsKLQotCQlpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwIHx8IGQzZDgtPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgMCwgRDNEUlRZUEVfU1VSRkFDRSwgZm9ybWF0KSAhPSBEM0RfT0spCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnN1cmZhY2UgPSBuZXcgRGlyZWN0M0RTdXJmYWNlOCh0aGlzLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEQzRFBPT0xfU1lTVEVNTUVNLCBEM0RNVUxUSVNBTVBMRV9OT05FLCB0cnVlLCAwKTsKLQotCQlpZighKnN1cmZhY2UpCi0JCXsKLQkJCXJldHVybiBPVVRPRk1FTU9SWSgpOwotCQl9Ci0KLQkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCi0JCXsKLQkJCWRlbGV0ZSAqc3VyZmFjZTsKLQotCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKLQkJfQotCi0JCSgqc3VyZmFjZSktPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkNyZWF0ZUluZGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNESW5kZXhCdWZmZXI4ICoqaW5kZXhCdWZmZXIpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJKmluZGV4QnVmZmVyID0gbmV3IERpcmVjdDNESW5kZXhCdWZmZXI4KHRoaXMsIGxlbmd0aCwgdXNhZ2UsIGZvcm1hdCwgcG9vbCk7Ci0KLQkJaWYoISppbmRleEJ1ZmZlcikKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICppbmRleEJ1ZmZlcjsKLQotCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKLQkJfQotCi0JCSgqaW5kZXhCdWZmZXIpLT5BZGRSZWYoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpDcmVhdGVQaXhlbFNoYWRlcihjb25zdCB1bnNpZ25lZCBsb25nICpmdW5jdGlvbiwgdW5zaWduZWQgbG9uZyAqaGFuZGxlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFmdW5jdGlvbiB8fCAhaGFuZGxlIHx8IGZ1bmN0aW9uWzBdID4gcGl4ZWxTaGFkZXJWZXJzaW9uKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXVuc2lnbmVkIGludCBpbmRleDsKLQotCQlmb3IoaW5kZXggPSAxOyBpbmRleCA8IHBpeGVsU2hhZGVyLnNpemUoKTsgaW5kZXgrKykgICAvLyBTa2lwIE5VTEwgaGFuZGxlCi0JCXsKLQkJCWlmKHBpeGVsU2hhZGVyW2luZGV4XSA9PSAwKQotCQkJewotCQkJCXBpeGVsU2hhZGVyW2luZGV4XSA9IG5ldyBEaXJlY3QzRFBpeGVsU2hhZGVyOCh0aGlzLCBmdW5jdGlvbik7ICAgLy8gRklYTUU6IENoZWNrIGZvciBudWxsCi0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmKGluZGV4ID09IHBpeGVsU2hhZGVyLnNpemUoKSkKLQkJewotCQkJcGl4ZWxTaGFkZXIucHVzaF9iYWNrKG5ldyBEaXJlY3QzRFBpeGVsU2hhZGVyOCh0aGlzLCBmdW5jdGlvbikpOwotCQl9Ci0KLQkJcGl4ZWxTaGFkZXJbaW5kZXhdLT5BZGRSZWYoKTsKLQotCQkqaGFuZGxlID0gaW5kZXg7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlUmVuZGVyVGFyZ2V0KHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgaW50IGxvY2thYmxlLCBJRGlyZWN0M0RTdXJmYWNlOCAqKnN1cmZhY2UpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJKnN1cmZhY2UgPSAwOwotCi0JCWlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZDNkOC0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCBEM0RVU0FHRV9SRU5ERVJUQVJHRVQsIEQzRFJUWVBFX1NVUkZBQ0UsIGZvcm1hdCkgIT0gRDNEX09LIHx8IGhlaWdodCA+IHN3OjpPVVRMSU5FX1JFU09MVVRJT04pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnN1cmZhY2UgPSBuZXcgRGlyZWN0M0RTdXJmYWNlOCh0aGlzLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEQzRFBPT0xfREVGQVVMVCwgbXVsdGlTYW1wbGUsIGxvY2thYmxlICE9IEZBTFNFLCBEM0RVU0FHRV9SRU5ERVJUQVJHRVQpOwotCi0JCWlmKCEqc3VyZmFjZSkKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICpzdXJmYWNlOwotCi0JCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOwotCQl9Ci0KLQkJKCpzdXJmYWNlKS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlU3RhdGVCbG9jayhEM0RTVEFURUJMT0NLVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nICp0b2tlbikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighdG9rZW4pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRGlyZWN0M0RTdGF0ZUJsb2NrOCAqc3RhdGVCbG9jayA9IG5ldyBEaXJlY3QzRFN0YXRlQmxvY2s4KHRoaXMsIHR5cGUpOwotCQlzdGF0ZUJsb2NrLT5iaW5kKCk7Ci0JCXN0YXRlUmVjb3JkZXIucHVzaF9iYWNrKHN0YXRlQmxvY2spOwotCQkqdG9rZW4gPSAodW5zaWduZWQgbG9uZykoc3RhdGVSZWNvcmRlci5zaXplKCkgLSAxKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpDcmVhdGVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RUZXh0dXJlOCAqKnRleHR1cmUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJKnRleHR1cmUgPSAwOwotCi0JCWlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZDNkOC0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCB1c2FnZSwgRDNEUlRZUEVfVEVYVFVSRSwgZm9ybWF0KSAhPSBEM0RfT0spCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnRleHR1cmUgPSBuZXcgRGlyZWN0M0RUZXh0dXJlOCh0aGlzLCB3aWR0aCwgaGVpZ2h0LCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wpOwotCi0JCWlmKCEqdGV4dHVyZSkKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICp0ZXh0dXJlOwotCi0JCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOwotCQl9Ci0KLQkJKCp0ZXh0dXJlKS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlVmVydGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIHVuc2lnbmVkIGxvbmcgRlZGLCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKip2ZXJ0ZXhCdWZmZXIpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJKnZlcnRleEJ1ZmZlciA9IG5ldyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjgodGhpcywgbGVuZ3RoLCB1c2FnZSwgRlZGLCBwb29sKTsKLQotCQlpZighKnZlcnRleEJ1ZmZlcikKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICp2ZXJ0ZXhCdWZmZXI7Ci0KLQkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7Ci0JCX0KLQotCQkoKnZlcnRleEJ1ZmZlciktPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkNyZWF0ZVZlcnRleFNoYWRlcihjb25zdCB1bnNpZ25lZCBsb25nICpkZWNsYXJhdGlvbiwgY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIHVuc2lnbmVkIGxvbmcgKmhhbmRsZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKLQl7Ci0JCVRSQUNFKCJjb25zdCB1bnNpZ25lZCBsb25nICpkZWNsYXJhdGlvbiA9IDB4JTAuOHAsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyAqaGFuZGxlID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkIiwgZGVjbGFyYXRpb24sIGZ1bmN0aW9uLCBoYW5kbGUsIHVzYWdlKTsKLQotCQlpZighZGVjbGFyYXRpb24gfHwgIWhhbmRsZSB8fCAoZnVuY3Rpb24gJiYgZnVuY3Rpb25bMF0gPiB2ZXJ0ZXhTaGFkZXJWZXJzaW9uKSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLQkJZm9yKGluZGV4ID0gMTsgaW5kZXggPCB2ZXJ0ZXhTaGFkZXIuc2l6ZSgpOyBpbmRleCsrKSAgIC8vIE5PVEU6IHNraXAgTlVMTCBoYW5kbGUKLQkJewotCQkJaWYodmVydGV4U2hhZGVyW2luZGV4XSA9PSAwKQotCQkJewotCQkJCXZlcnRleFNoYWRlcltpbmRleF0gPSBuZXcgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4KHRoaXMsIGRlY2xhcmF0aW9uLCBmdW5jdGlvbik7ICAgLy8gRklYTUU6IENoZWNrIGZvciBudWxsCi0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmKGluZGV4ID09IHZlcnRleFNoYWRlci5zaXplKCkpCi0JCXsKLQkJCXZlcnRleFNoYWRlci5wdXNoX2JhY2sobmV3IERpcmVjdDNEVmVydGV4U2hhZGVyOCh0aGlzLCBkZWNsYXJhdGlvbiwgZnVuY3Rpb24pKTsKLQkJfQotCi0JCXZlcnRleFNoYWRlcltpbmRleF0tPkFkZFJlZigpOwotCi0JCSpoYW5kbGUgPSAoaW5kZXggPDwgMTYpICsgMTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpDcmVhdGVWb2x1bWVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGRlcHRoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICoqdm9sdW1lVGV4dHVyZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQkqdm9sdW1lVGV4dHVyZSA9IDA7Ci0KLQkJaWYod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCB8fCBkZXB0aCA9PSAwIHx8IGQzZDgtPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgdXNhZ2UsIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkUsIGZvcm1hdCkgIT0gRDNEX09LKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp2b2x1bWVUZXh0dXJlID0gbmV3IERpcmVjdDNEVm9sdW1lVGV4dHVyZTgodGhpcywgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCk7Ci0KLQkJaWYoISp2b2x1bWVUZXh0dXJlKQotCQl7Ci0JCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKLQkJfQotCi0JCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQotCQl7Ci0JCQlkZWxldGUgKnZvbHVtZVRleHR1cmU7Ci0KLQkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7Ci0JCX0KLQotCQkoKnZvbHVtZVRleHR1cmUpLT5BZGRSZWYoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEZWxldGVQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEZWxldGVTdGF0ZUJsb2NrKHVuc2lnbmVkIGxvbmcgdG9rZW4pCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYodG9rZW4gPj0gc3RhdGVSZWNvcmRlci5zaXplKCkgfHwgIXN0YXRlUmVjb3JkZXJbdG9rZW5dKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN0YXRlUmVjb3JkZXJbdG9rZW5dLT51bmJpbmQoKTsKLQkJc3RhdGVSZWNvcmRlclt0b2tlbl0gPSAwOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkRlbGV0ZVZlcnRleFNoYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQl1bnNpZ25lZCBpbnQgaW5kZXggPSBoYW5kbGUgPj4gMTY7Ci0KLQkJaWYoaW5kZXggPj0gdmVydGV4U2hhZGVyLnNpemUoKSB8fCAhdmVydGV4U2hhZGVyW2luZGV4XSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl2ZXJ0ZXhTaGFkZXJbaW5kZXhdLT5SZWxlYXNlKCk7Ci0JCXZlcnRleFNoYWRlcltpbmRleF0gPSAwOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkRyYXdJbmRleGVkUHJpbWl0aXZlKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IG1pbkluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMsIHVuc2lnbmVkIGludCBzdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWluZGV4RGF0YSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZighYmluZERhdGEoaW5kZXhEYXRhLCBiYXNlVmVydGV4SW5kZXgpIHx8ICFwcmltaXRpdmVDb3VudCkKLQkJewotCQkJcmV0dXJuIEQzRF9PSzsKLQkJfQotCi0JCXVuc2lnbmVkIGludCBpbmRleE9mZnNldCA9IHN0YXJ0SW5kZXggKiAoaW5kZXhEYXRhLT5pczMyQml0KCkgPyA0IDogMik7ICAgLy8gRklYTUU6IERvZXNuJ3QgdGFrZSBzdHJlYW0gZnJlcXVlbmNpZXMgaW50byBhY2NvdW50Ci0KLQkJc3c6OkRyYXdUeXBlIGRyYXdUeXBlOwotCi0JCWlmKGluZGV4RGF0YS0+aXMzMkJpdCgpKQotCQl7Ci0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCWNhc2UgRDNEUFRfUE9JTlRMSVNUOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEUE9JTlRMSVNUMzI7CQlicmVhazsKLQkJCWNhc2UgRDNEUFRfTElORUxJU1Q6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURMSU5FTElTVDMyOwkJCWJyZWFrOwotCQkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURMSU5FU1RSSVAzMjsJCWJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDMyOwkJYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVAzMjsJYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVGQU4zMjsJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3dpdGNoKHR5cGUpCi0JCQl7Ci0JCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDE2OwkJYnJlYWs7Ci0JCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVETElORUxJU1QxNjsJCQlicmVhazsKLQkJCWNhc2UgRDNEUFRfTElORVNUUklQOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVETElORVNUUklQMTY7CQlicmVhazsKLQkJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRUxJU1QxNjsJCWJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMTY7CWJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMTY7CQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQVNTRVJUKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWJpbmREYXRhKGluZGV4RGF0YSwgYmFzZVZlcnRleEluZGV4KTsKLQotCQlyZW5kZXJlci0+ZHJhdyhkcmF3VHlwZSwgaW5kZXhPZmZzZXQsIHByaW1pdGl2ZUNvdW50KTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEZWxldGVQaXhlbFNoYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihoYW5kbGUgPj0gcGl4ZWxTaGFkZXIuc2l6ZSgpIHx8ICFwaXhlbFNoYWRlcltoYW5kbGVdKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXBpeGVsU2hhZGVyW2hhbmRsZV0tPlJlbGVhc2UoKTsKLQkJcGl4ZWxTaGFkZXJbaGFuZGxlXSA9IDA7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6RHJhd0luZGV4ZWRQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHR5cGUsIHVuc2lnbmVkIGludCBtaW5JbmRleCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKmluZGV4RGF0YSwgRDNERk9STUFUIGluZGV4RGF0YUZvcm1hdCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCF2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSB8fCAhaW5kZXhEYXRhKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSAobWluSW5kZXggKyBudW1WZXJ0aWNlcykgKiB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlOwotCi0JCURpcmVjdDNEVmVydGV4QnVmZmVyOCAqdmVydGV4QnVmZmVyID0gbmV3IERpcmVjdDNEVmVydGV4QnVmZmVyOCh0aGlzLCBsZW5ndGgsIDAsIDAsIEQzRFBPT0xfREVGQVVMVCk7Ci0KLQkJdW5zaWduZWQgY2hhciAqZGF0YTsKLQkJdmVydGV4QnVmZmVyLT5Mb2NrKDAsIDAsICZkYXRhLCAwKTsKLQkJbWVtY3B5KGRhdGEsIHZlcnRleFN0cmVhbVplcm9EYXRhLCBsZW5ndGgpOwotCQl2ZXJ0ZXhCdWZmZXItPlVubG9jaygpOwotCi0JCVNldFN0cmVhbVNvdXJjZSgwLCB2ZXJ0ZXhCdWZmZXIsIHZlcnRleFN0cmVhbVplcm9TdHJpZGUpOwotCi0JCXN3aXRjaCh0eXBlKQotCQl7Ci0JCWNhc2UgRDNEUFRfUE9JTlRMSVNUOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQ7CQlicmVhazsKLQkJY2FzZSBEM0RQVF9MSU5FTElTVDoJCWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICogMjsJYnJlYWs7Ci0JCWNhc2UgRDNEUFRfTElORVNUUklQOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKyAxOwlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICogMzsJYnJlYWs7Ci0JCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKyAyOwlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICsgMjsJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBU1NFUlQoZmFsc2UpOwotCQl9Ci0KLQkJbGVuZ3RoICo9IGluZGV4RGF0YUZvcm1hdCA9PSBEM0RGTVRfSU5ERVgzMiA/IDQgOiAyOwotCi0JCURpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleEJ1ZmZlciA9IG5ldyBEaXJlY3QzREluZGV4QnVmZmVyOCh0aGlzLCBsZW5ndGgsIDAsIGluZGV4RGF0YUZvcm1hdCwgRDNEUE9PTF9ERUZBVUxUKTsKLQotCQlpbmRleEJ1ZmZlci0+TG9jaygwLCAwLCAmZGF0YSwgMCk7Ci0JCW1lbWNweShkYXRhLCBpbmRleERhdGEsIGxlbmd0aCk7Ci0JCWluZGV4QnVmZmVyLT5VbmxvY2soKTsKLQotCQlTZXRJbmRpY2VzKGluZGV4QnVmZmVyLCAwKTsKLQotCQlpZighYmluZERhdGEoaW5kZXhCdWZmZXIsIDApIHx8ICFwcmltaXRpdmVDb3VudCkKLQkJewotCQkJdmVydGV4QnVmZmVyLT5SZWxlYXNlKCk7Ci0KLQkJCXJldHVybiBEM0RfT0s7Ci0JCX0KLQotCQlzdzo6RHJhd1R5cGUgZHJhd1R5cGU7Ci0KLQkJaWYoaW5kZXhEYXRhRm9ybWF0ID09IEQzREZNVF9JTkRFWDMyKQotCQl7Ci0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCWNhc2UgRDNEUFRfUE9JTlRMSVNUOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEUE9JTlRMSVNUMzI7CQlicmVhazsKLQkJCWNhc2UgRDNEUFRfTElORUxJU1Q6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURMSU5FTElTVDMyOwkJCWJyZWFrOwotCQkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURMSU5FU1RSSVAzMjsJCWJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDMyOwkJYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVAzMjsJYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVGQU4zMjsJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3dpdGNoKHR5cGUpCi0JCQl7Ci0JCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDE2OwkJYnJlYWs7Ci0JCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVETElORUxJU1QxNjsJCQlicmVhazsKLQkJCWNhc2UgRDNEUFRfTElORVNUUklQOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVETElORVNUUklQMTY7CQlicmVhazsKLQkJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRUxJU1QxNjsJCWJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMTY7CWJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMTY7CQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQVNTRVJUKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXJlbmRlcmVyLT5kcmF3KGRyYXdUeXBlLCAwLCBwcmltaXRpdmVDb3VudCk7Ci0KLQkJU2V0U3RyZWFtU291cmNlKDAsIDAsIDApOwotCQlTZXRJbmRpY2VzKDAsIDApOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkRyYXdQcmltaXRpdmUoRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVUeXBlLCB1bnNpZ25lZCBpbnQgc3RhcnRWZXJ0ZXgsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighYmluZERhdGEoMCwgc3RhcnRWZXJ0ZXgpIHx8ICFwcmltaXRpdmVDb3VudCkKLQkJewotCQkJcmV0dXJuIEQzRF9PSzsKLQkJfQotCi0JCXN3OjpEcmF3VHlwZSBkcmF3VHlwZTsKLQotCQlzd2l0Y2gocHJpbWl0aXZlVHlwZSkKLQkJewotCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfUE9JTlRMSVNUOwkJYnJlYWs7Ci0JCWNhc2UgRDNEUFRfTElORUxJU1Q6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0xJTkVMSVNUOwkJYnJlYWs7Ci0JCWNhc2UgRDNEUFRfTElORVNUUklQOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19MSU5FU1RSSVA7CQlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CWRyYXdUeXBlID0gc3c6OkRSQVdfVFJJQU5HTEVMSVNUOwlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglkcmF3VHlwZSA9IHN3OjpEUkFXX1RSSUFOR0xFU1RSSVA7CWJyZWFrOwotCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19UUklBTkdMRUZBTjsJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBU1NFUlQoZmFsc2UpOwotCQl9Ci0KLQkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIDAsIHByaW1pdGl2ZUNvdW50KTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEcmF3UHJpbWl0aXZlVVAoRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVUeXBlLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhLCB1bnNpZ25lZCBpbnQgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighdmVydGV4U3RyZWFtWmVyb0RhdGEpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJSURpcmVjdDNEVmVydGV4QnVmZmVyOCAqdmVydGV4QnVmZmVyID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJc3dpdGNoKHByaW1pdGl2ZVR5cGUpCi0JCXsKLQkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudDsJCWJyZWFrOwotCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKiAyOwlicmVhazsKLQkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDE7CWJyZWFrOwotCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKiAzOwlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDI7CWJyZWFrOwotCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKyAyOwlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUFTU0VSVChmYWxzZSk7Ci0JCX0KLQotCQlsZW5ndGggKj0gdmVydGV4U3RyZWFtWmVyb1N0cmlkZTsKLQotCQlDcmVhdGVWZXJ0ZXhCdWZmZXIobGVuZ3RoLCAwLCAwLCBEM0RQT09MX0RFRkFVTFQsICZ2ZXJ0ZXhCdWZmZXIpOwotCi0JCXVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0JCXZlcnRleEJ1ZmZlci0+TG9jaygwLCAwLCAmZGF0YSwgMCk7Ci0JCW1lbWNweShkYXRhLCB2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgbGVuZ3RoKTsKLQkJdmVydGV4QnVmZmVyLT5VbmxvY2soKTsKLQotCQlTZXRTdHJlYW1Tb3VyY2UoMCwgdmVydGV4QnVmZmVyLCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKLQotCQlpZighYmluZERhdGEoMCwgMCkgfHwgIXByaW1pdGl2ZUNvdW50KQotCQl7Ci0JCQl2ZXJ0ZXhCdWZmZXItPlJlbGVhc2UoKTsKLQotCQkJcmV0dXJuIEQzRF9PSzsKLQkJfQotCi0JCXN3OjpEcmF3VHlwZSBkcmF3VHlwZTsKLQotCQlzd2l0Y2gocHJpbWl0aXZlVHlwZSkKLQkJewotCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfUE9JTlRMSVNUOwkJYnJlYWs7Ci0JCWNhc2UgRDNEUFRfTElORUxJU1Q6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0xJTkVMSVNUOwkJYnJlYWs7Ci0JCWNhc2UgRDNEUFRfTElORVNUUklQOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19MSU5FU1RSSVA7CQlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CWRyYXdUeXBlID0gc3c6OkRSQVdfVFJJQU5HTEVMSVNUOwlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglkcmF3VHlwZSA9IHN3OjpEUkFXX1RSSUFOR0xFU1RSSVA7CWJyZWFrOwotCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19UUklBTkdMRUZBTjsJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBU1NFUlQoZmFsc2UpOwotCQl9Ci0KLQkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIDAsIHByaW1pdGl2ZUNvdW50KTsKLQotCQlTZXRTdHJlYW1Tb3VyY2UoMCwgMCwgMCk7Ci0JCXZlcnRleEJ1ZmZlci0+UmVsZWFzZSgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkRyYXdSZWN0UGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFJFQ1RQQVRDSF9JTkZPICpyZWN0UGF0Y2hJbmZvKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFudW1TZWdzIHx8ICFyZWN0UGF0Y2hJbmZvKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEcmF3VHJpUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFRSSVBBVENIX0lORk8gKnRyaVBhdGNoSW5mbykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbnVtU2VncyB8fCAhdHJpUGF0Y2hJbmZvKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpFbmRTY2VuZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6RW5kU3RhdGVCbG9jayh1bnNpZ25lZCBsb25nICp0b2tlbikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighdG9rZW4pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcmVjb3JkU3RhdGUgPSBmYWxzZTsKLQkJKnRva2VuID0gKHVuc2lnbmVkIGxvbmcpKHN0YXRlUmVjb3JkZXIuc2l6ZSgpIC0gMSk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQl1bnNpZ25lZCBpbnQgRGlyZWN0M0REZXZpY2U4OjpHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpbnQgYXZhaWxhYmxlTWVtb3J5ID0gdGV4dHVyZU1lbW9yeSAtIERpcmVjdDNEUmVzb3VyY2U4OjpnZXRNZW1vcnlVc2FnZSgpOwotCQlpZihhdmFpbGFibGVNZW1vcnkgPCAwKSBhdmFpbGFibGVNZW1vcnkgPSAwOwotCi0JCS8vIFJvdW5kIHRvIG5lYXJlc3QgTUIKLQkJcmV0dXJuIChhdmFpbGFibGVNZW1vcnkgKyAweDgwMDAwKSAmIDB4RkZGMDAwMDA7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IGluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTggKipiYWNrQnVmZmVyKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFiYWNrQnVmZmVyLyogfHwgdHlwZSAhPSBEM0RCQUNLQlVGRkVSX1RZUEVfTU9OTyovKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN3YXBDaGFpbltpbmRleF0tPkdldEJhY2tCdWZmZXIoaW5kZXgsIHR5cGUsIGJhY2tCdWZmZXIpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBmbG9hdCAqcGxhbmUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXBsYW5lIHx8IGluZGV4ID49IDYpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcGxhbmVbMF0gPSB0aGlzLT5wbGFuZVtpbmRleF1bMF07Ci0JCXBsYW5lWzFdID0gdGhpcy0+cGxhbmVbaW5kZXhdWzFdOwotCQlwbGFuZVsyXSA9IHRoaXMtPnBsYW5lW2luZGV4XVsyXTsKLQkJcGxhbmVbM10gPSB0aGlzLT5wbGFuZVtpbmRleF1bM107Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0Q2xpcFN0YXR1cyhEM0RDTElQU1RBVFVTOCAqY2xpcFN0YXR1cykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighY2xpcFN0YXR1cykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqY2xpcFN0YXR1cyA9IHRoaXMtPmNsaXBTdGF0dXM7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0Q3JlYXRpb25QYXJhbWV0ZXJzKEQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFwYXJhbWV0ZXJzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXBhcmFtZXRlcnMtPkFkYXB0ZXJPcmRpbmFsID0gYWRhcHRlcjsKLQkJcGFyYW1ldGVycy0+QmVoYXZpb3JGbGFncyA9IGJlaGF2aW91ckZsYWdzOwotCQlwYXJhbWV0ZXJzLT5EZXZpY2VUeXBlID0gZGV2aWNlVHlwZTsKLQkJcGFyYW1ldGVycy0+aEZvY3VzV2luZG93ID0gZm9jdXNXaW5kb3c7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlcikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighcGFsZXR0ZU51bWJlcikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqcGFsZXR0ZU51bWJlciA9IGN1cnJlbnRQYWxldHRlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTggKipkZXB0aFN0ZW5jaWxTdXJmYWNlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXB0aFN0ZW5jaWxTdXJmYWNlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpkZXB0aFN0ZW5jaWxTdXJmYWNlID0gZGVwdGhTdGVuY2lsOwotCi0JCWlmKGRlcHRoU3RlbmNpbCkKLQkJewotCQkJZGVwdGhTdGVuY2lsLT5BZGRSZWYoKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7ICAgLy8gRklYTUU6IFJldHVybiBOT1RGT1VORCgpIHdoZW4gbm8gZGVwdGhTdGVuY2lsPwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXREZXZpY2VDYXBzKEQzRENBUFM4ICpjYXBzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBkM2Q4LT5HZXREZXZpY2VDYXBzKEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsIGNhcHMpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXREaXJlY3QzRChJRGlyZWN0M0Q4ICoqZDNkOCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighZDNkOCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlBU1NFUlQodGhpcy0+ZDNkOCk7Ci0KLQkJKmQzZDggPSB0aGlzLT5kM2Q4OwotCQl0aGlzLT5kM2Q4LT5BZGRSZWYoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXREaXNwbGF5TW9kZShEM0RESVNQTEFZTU9ERSAqbW9kZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbW9kZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlkM2Q4LT5HZXRBZGFwdGVyRGlzcGxheU1vZGUoRDNEQURBUFRFUl9ERUZBVUxULCBtb2RlKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRGcm9udEJ1ZmZlcihJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdFN1cmZhY2UpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRlc3RTdXJmYWNlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCUQzRExPQ0tFRF9SRUNUIGRlc2NyaXB0aW9uOwotCQlkZXN0U3VyZmFjZS0+TG9ja1JlY3QoJmRlc2NyaXB0aW9uLCAwLCAwKTsKLQotCQlzd2FwQ2hhaW5bMF0tPnNjcmVlbnNob3QoZGVzY3JpcHRpb24ucEJpdHMpOwotCi0JCWRlc3RTdXJmYWNlLT5VbmxvY2tSZWN0KCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlODo6R2V0R2FtbWFSYW1wKEQzREdBTU1BUkFNUCAqcmFtcCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighcmFtcCkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3dhcENoYWluWzBdLT5nZXRHYW1tYVJhbXAoKHN3OjpHYW1tYVJhbXAqKXJhbXApOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRJbmRpY2VzKElEaXJlY3QzREluZGV4QnVmZmVyOCAqKmluZGV4RGF0YSwgdW5zaWduZWQgaW50ICpiYXNlVmVydGV4SW5kZXgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWluZGV4RGF0YSB8fCAhYmFzZVZlcnRleEluZGV4KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSppbmRleERhdGEgPSB0aGlzLT5pbmRleERhdGE7Ci0KLQkJaWYodGhpcy0+aW5kZXhEYXRhKQotCQl7Ci0JCQl0aGlzLT5pbmRleERhdGEtPkFkZFJlZigpOwotCQl9Ci0KLQkJKmJhc2VWZXJ0ZXhJbmRleCA9IHRoaXMtPmJhc2VWZXJ0ZXhJbmRleDsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRJbmZvKHVuc2lnbmVkIGxvbmcgZGV2SW5mb0lELCB2b2lkICpkZXZJbmZvU3RydWN0LCB1bnNpZ25lZCBsb25nIGRldkluZm9TdHJ1Y3RTaXplKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXZJbmZvU3RydWN0IHx8IGRldkluZm9TdHJ1Y3RTaXplID09IDApCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJc3dpdGNoKGRldkluZm9JRCkKLQkJewotCQljYXNlIDA6IHJldHVybiBFX0ZBSUw7Ci0JCWNhc2UgMTogcmV0dXJuIEVfRkFJTDsKLQkJY2FzZSAyOiByZXR1cm4gRV9GQUlMOwotCQljYXNlIDM6IHJldHVybiBFX0ZBSUw7Ci0JCWNhc2UgNDogcmV0dXJuIFNfRkFMU0U7Ci0JCWNhc2UgNTogVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FOiBEM0RERVZJTkZPSURfUkVTT1VSQ0VNQU5BR0VSCi0JCWNhc2UgNjogVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FOiBEM0RERVZJTkZPSURfRDNEVkVSVEVYU1RBVFMKLQkJY2FzZSA3OiByZXR1cm4gRV9GQUlMOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgRDNETElHSFQ4ICpsaWdodCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbGlnaHQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXRoaXMtPmxpZ2h0LmV4aXN0cyhpbmRleCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmxpZ2h0ID0gdGhpcy0+bGlnaHRbaW5kZXhdOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldExpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXggLCBpbnQgKmVuYWJsZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighZW5hYmxlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKCFsaWdodC5leGlzdHMoaW5kZXgpKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSplbmFibGUgPSBsaWdodFtpbmRleF0uZW5hYmxlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldE1hdGVyaWFsKEQzRE1BVEVSSUFMOCAqbWF0ZXJpYWwpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIW1hdGVyaWFsKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSptYXRlcmlhbCA9IHRoaXMtPm1hdGVyaWFsOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYocGFsZXR0ZU51bWJlciA+IDB4RkZGRiB8fCAhZW50cmllcykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCXsKLQkJCWVudHJpZXNbaV0gPSBwYWxldHRlW3BhbGV0dGVOdW1iZXJdLmVudHJ5W2ldOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0UGl4ZWxTaGFkZXIodW5zaWduZWQgbG9uZyAqaGFuZGxlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFoYW5kbGUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmhhbmRsZSA9IHBpeGVsU2hhZGVySGFuZGxlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFBpeGVsU2hhZGVyRnVuY3Rpb24odW5zaWduZWQgbG9uZyBoYW5kbGUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRhdGEpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnQodW5zaWduZWQgbG9uZyBzdGFydFJlZ2lzdGVyLCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGxvbmcgY291bnQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWNvbnN0YW50RGF0YSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJewotCQkJKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDBdID0gcGl4ZWxTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bMF07Ci0JCQkoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgMV0gPSBwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXTsKLQkJCSgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAyXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzJdOwotCQkJKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDNdID0gcGl4ZWxTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bM107Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRSYXN0ZXJTdGF0dXMoRDNEUkFTVEVSX1NUQVRVUyAqcmFzdGVyU3RhdHVzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFyYXN0ZXJTdGF0dXMpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXZhbHVlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp2YWx1ZSA9IHJlbmRlclN0YXRlW3N0YXRlXTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNEU3VyZmFjZTggKipyZW5kZXJUYXJnZXQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXJlbmRlclRhcmdldCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqcmVuZGVyVGFyZ2V0ID0gdGhpcy0+cmVuZGVyVGFyZ2V0OwotCQl0aGlzLT5yZW5kZXJUYXJnZXQtPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICoqc3RyZWFtRGF0YSwgdW5zaWduZWQgaW50ICpzdHJpZGUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoc3RyZWFtTnVtYmVyID49IDE2IHx8ICFzdHJlYW1EYXRhIHx8ICFzdHJpZGUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnN0cmVhbURhdGEgPSBkYXRhU3RyZWFtW3N0cmVhbU51bWJlcl07Ci0KLQkJaWYoZGF0YVN0cmVhbVtzdHJlYW1OdW1iZXJdKQotCQl7Ci0JCQlkYXRhU3RyZWFtW3N0cmVhbU51bWJlcl0tPkFkZFJlZigpOwotCQl9Ci0KLQkJKnN0cmlkZSA9IDA7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZAotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFRleHR1cmUodW5zaWduZWQgbG9uZyBzdGFnZSwgSURpcmVjdDNEQmFzZVRleHR1cmU4ICoqdGV4dHVyZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighdGV4dHVyZSB8fCBzdGFnZSA+PSA4KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp0ZXh0dXJlID0gdGhpcy0+dGV4dHVyZVtzdGFnZV07Ci0KLQkJaWYodGhpcy0+dGV4dHVyZVtzdGFnZV0pCi0JCXsKLQkJCXRoaXMtPnRleHR1cmVbc3RhZ2VdLT5BZGRSZWYoKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXZhbHVlICB8fCBzdGFnZSA8IDAgfHwgc3RhZ2UgPj0gOCB8fCBzdGF0ZSA8IDAgfHwgc3RhdGUgPiBEM0RUU1NfUkVTVUxUQVJHKSAgIC8vIEZJWE1FOiBTZXQgKnZhbHVlIHRvIDA/Ci0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnZhbHVlID0gdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3N0YXRlXTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBEM0RNQVRSSVggKm1hdHJpeCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbWF0cml4IHx8IHN0YXRlIDwgMCB8fCBzdGF0ZSA+IDUxMSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqbWF0cml4ID0gdGhpcy0+bWF0cml4W3N0YXRlXTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRWZXJ0ZXhTaGFkZXIodW5zaWduZWQgbG9uZyAqaGFuZGxlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFoYW5kbGUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmhhbmRsZSA9IHZlcnRleFNoYWRlckhhbmRsZTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCh1bnNpZ25lZCBsb25nIHN0YXJ0UmVnaXN0ZXIsIHZvaWQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgbG9uZyBjb3VudCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighY29uc3RhbnREYXRhKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQl7Ci0JCQkoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgMF0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bMF07Ci0JCQkoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgMV0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bMV07Ci0JCQkoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgMl0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bMl07Ci0JCQkoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgM10gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bM107Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRWZXJ0ZXhTaGFkZXJEZWNsYXJhdGlvbih1bnNpZ25lZCBsb25nIGhhbmRsZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighZGF0YSB8fCAhc2l6ZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0VmVydGV4U2hhZGVyRnVuY3Rpb24odW5zaWduZWQgbG9uZyBoYW5kbGUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRhdGEgfHwgIXNpemUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFZpZXdwb3J0KEQzRFZJRVdQT1JUOCAqdmlld3BvcnQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXZpZXdwb3J0KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp2aWV3cG9ydCA9IHRoaXMtPnZpZXdwb3J0OwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OkxpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCBlbmFibGUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXJlY29yZFN0YXRlKQotCQl7Ci0JCQlpZighbGlnaHQuZXhpc3RzKGluZGV4KSkgICAvLyBJbnNlcnQgZGVmYXVsdCBsaWdodAotCQkJewotCQkJCUQzRExJR0hUOCBsaWdodDsKLQotCQkJCWxpZ2h0LlR5cGUgPSBEM0RMSUdIVF9ESVJFQ1RJT05BTDsKLQkJCQlsaWdodC5EaWZmdXNlLnIgPSAxOwotCQkJCWxpZ2h0LkRpZmZ1c2UuZyA9IDE7Ci0JCQkJbGlnaHQuRGlmZnVzZS5iID0gMTsKLQkJCQlsaWdodC5EaWZmdXNlLmEgPSAwOwotCQkJCWxpZ2h0LlNwZWN1bGFyLnIgPSAwOwotCQkJCWxpZ2h0LlNwZWN1bGFyLmcgPSAwOwotCQkJCWxpZ2h0LlNwZWN1bGFyLmIgPSAwOwotCQkJCWxpZ2h0LlNwZWN1bGFyLmEgPSAwOwotCQkJCWxpZ2h0LkFtYmllbnQuciA9IDA7Ci0JCQkJbGlnaHQuQW1iaWVudC5nID0gMDsKLQkJCQlsaWdodC5BbWJpZW50LmIgPSAwOwotCQkJCWxpZ2h0LkFtYmllbnQuYSA9IDA7Ci0JCQkJbGlnaHQuUG9zaXRpb24ueCA9IDA7Ci0JCQkJbGlnaHQuUG9zaXRpb24ueSA9IDA7Ci0JCQkJbGlnaHQuUG9zaXRpb24ueiA9IDA7Ci0JCQkJbGlnaHQuRGlyZWN0aW9uLnggPSAwOwotCQkJCWxpZ2h0LkRpcmVjdGlvbi55ID0gMDsKLQkJCQlsaWdodC5EaXJlY3Rpb24ueiA9IDE7Ci0JCQkJbGlnaHQuUmFuZ2UgPSAwOwotCQkJCWxpZ2h0LkZhbGxvZmYgPSAwOwotCQkJCWxpZ2h0LkF0dGVudWF0aW9uMCA9IDA7Ci0JCQkJbGlnaHQuQXR0ZW51YXRpb24xID0gMDsKLQkJCQlsaWdodC5BdHRlbnVhdGlvbjIgPSAwOwotCQkJCWxpZ2h0LlRoZXRhID0gMDsKLQkJCQlsaWdodC5QaGkgPSAwOwotCi0JCQkJU2V0TGlnaHQoaW5kZXgsICZsaWdodCk7Ci0JCQl9Ci0KLQkJCWxpZ2h0W2luZGV4XS5lbmFibGUgPSAoZW5hYmxlICE9IEZBTFNFKTsKLQotCQkJbGlnaHRzRGlydHkgPSB0cnVlOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPmxpZ2h0RW5hYmxlKGluZGV4LCBlbmFibGUpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6TXVsdGlwbHlUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbWF0cml4KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCUQzRE1BVFJJWCAqY3VycmVudCA9ICZ0aGlzLT5tYXRyaXhbc3RhdGVdOwotCi0JCXN3OjpNYXRyaXggQyhjdXJyZW50LT5fMTEsIGN1cnJlbnQtPl8yMSwgY3VycmVudC0+XzMxLCBjdXJyZW50LT5fNDEsCi0JCSAgICAgICAgICAgICBjdXJyZW50LT5fMTIsIGN1cnJlbnQtPl8yMiwgY3VycmVudC0+XzMyLCBjdXJyZW50LT5fNDIsCi0JCSAgICAgICAgICAgICBjdXJyZW50LT5fMTMsIGN1cnJlbnQtPl8yMywgY3VycmVudC0+XzMzLCBjdXJyZW50LT5fNDMsCi0JCSAgICAgICAgICAgICBjdXJyZW50LT5fMTQsIGN1cnJlbnQtPl8yNCwgY3VycmVudC0+XzM0LCBjdXJyZW50LT5fNDQpOwotCi0JCXN3OjpNYXRyaXggTShtYXRyaXgtPl8xMSwgbWF0cml4LT5fMjEsIG1hdHJpeC0+XzMxLCBtYXRyaXgtPl80MSwKLQkJICAgICAgICAgICAgIG1hdHJpeC0+XzEyLCBtYXRyaXgtPl8yMiwgbWF0cml4LT5fMzIsIG1hdHJpeC0+XzQyLAotCQkgICAgICAgICAgICAgbWF0cml4LT5fMTMsIG1hdHJpeC0+XzIzLCBtYXRyaXgtPl8zMywgbWF0cml4LT5fNDMsCi0JCSAgICAgICAgICAgICBtYXRyaXgtPl8xNCwgbWF0cml4LT5fMjQsIG1hdHJpeC0+XzM0LCBtYXRyaXgtPl80NCk7Ci0KLQkJc3dpdGNoKHN0YXRlKQotCQl7Ci0JCWNhc2UgRDNEVFNfV09STEQ6Ci0JCQlyZW5kZXJlci0+c2V0TW9kZWxNYXRyaXgoQyAqIE0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEVFNfVklFVzoKLQkJCXJlbmRlcmVyLT5zZXRWaWV3TWF0cml4KEMgKiBNKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFRTX1BST0pFQ1RJT046Ci0JCQlyZW5kZXJlci0+c2V0UHJvamVjdGlvbk1hdHJpeChDICogTSk7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RUU19URVhUVVJFMDoKLQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDAsIEMgKiBNKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFRTX1RFWFRVUkUxOgotCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMSwgQyAqIE0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEVFNfVEVYVFVSRTI6Ci0JCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgyLCBDICogTSk7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RUU19URVhUVVJFMzoKLQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDMsIEMgKiBNKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFRTX1RFWFRVUkU0OgotCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNCwgQyAqIE0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEVFNfVEVYVFVSRTU6Ci0JCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg1LCBDICogTSk7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RUU19URVhUVVJFNjoKLQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDYsIEMgKiBNKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFRTX1RFWFRVUkU3OgotCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNywgQyAqIE0pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZihzdGF0ZSA+IDI1NiAmJiBzdGF0ZSA8IDUxMikKLQkJCXsKLQkJCQlyZW5kZXJlci0+c2V0TW9kZWxNYXRyaXgoQyAqIE0sIHN0YXRlIC0gMjU2KTsKLQkJCX0KLQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQkvLyBOT1RFOiBzb3VyY2VSZWN0IGFuZCBkZXN0UmVjdCBjYW4gYmUgbnVsbCwgZGlydHlSZWdpb24gaGFzIHRvIGJlIG51bGwKLQotCQlIV05EIHdpbmRvd0hhbmRsZSA9IHByZXNlbnRQYXJhbWV0ZXJzLmhEZXZpY2VXaW5kb3cgPyBwcmVzZW50UGFyYW1ldGVycy5oRGV2aWNlV2luZG93IDogZm9jdXNXaW5kb3c7Ci0KLQkJaWYoZGVzdFdpbmRvd092ZXJyaWRlICYmIGRlc3RXaW5kb3dPdmVycmlkZSAhPSB3aW5kb3dIYW5kbGUpCi0JCXsKLQkJCVVOSU1QTEVNRU5URUQoKTsKLQkJfQotCi0JCWlmKGRpcnR5UmVnaW9uKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN3YXBDaGFpblswXS0+UHJlc2VudChzb3VyY2VSZWN0LCBkZXN0UmVjdCwgZGVzdFdpbmRvd092ZXJyaWRlLCBkaXJ0eVJlZ2lvbik7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6UHJvY2Vzc1ZlcnRpY2VzKHVuc2lnbmVkIGludCBzcmNTdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgZGVzdEluZGV4LCB1bnNpZ25lZCBpbnQgdmVydGV4Q291bnQsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKmRlc3RCdWZmZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRlc3RCdWZmZXIpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlJlc2V0KEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXByZXNlbnRQYXJhbWV0ZXJzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKHN3YXBDaGFpblswXSkKLQkJewotCQkJc3dhcENoYWluWzBdLT51bmJpbmQoKTsKLQkJCXN3YXBDaGFpblswXSA9IDA7Ci0JCX0KLQotCQlpZihkZXB0aFN0ZW5jaWwpCi0JCXsKLQkJCWRlcHRoU3RlbmNpbC0+dW5iaW5kKCk7Ci0JCQlkZXB0aFN0ZW5jaWwgPSAwOwotCQl9Ci0KLQkJaWYocmVuZGVyVGFyZ2V0KQotCQl7Ci0JCQlyZW5kZXJUYXJnZXQtPnVuYmluZCgpOwotCQkJcmVuZGVyVGFyZ2V0ID0gMDsKLQkJfQotCi0JCUQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50ID0gKnByZXNlbnRQYXJhbWV0ZXJzOwotCi0JCWlmKCFzd2FwQ2hhaW5bMF0pCi0JCXsKLQkJCXN3YXBDaGFpblswXSA9IG5ldyBEaXJlY3QzRFN3YXBDaGFpbjgodGhpcywgJnByZXNlbnQpOwotCQkJc3dhcENoYWluWzBdLT5iaW5kKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzd2FwQ2hhaW5bMF0tPnJlc2V0KCZwcmVzZW50KTsKLQkJfQotCi0JCUhXTkQgd2luZG93SGFuZGxlID0gcHJlc2VudFBhcmFtZXRlcnMtPmhEZXZpY2VXaW5kb3cgPyBwcmVzZW50UGFyYW1ldGVycy0+aERldmljZVdpbmRvdyA6IGZvY3VzV2luZG93OwotCi0JCWludCB3aWR0aCA9IDA7Ci0JCWludCBoZWlnaHQgPSAwOwotCi0JCWlmKHByZXNlbnRQYXJhbWV0ZXJzLT5XaW5kb3dlZCAmJiAocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQgPT0gMCB8fCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoID09IDApKQotCQl7Ci0JCQlSRUNUIHJlY3RhbmdsZTsKLQkJCUdldENsaWVudFJlY3Qod2luZG93SGFuZGxlLCAmcmVjdGFuZ2xlKTsKLQotCQkJd2lkdGggPSByZWN0YW5nbGUucmlnaHQgLSByZWN0YW5nbGUubGVmdDsKLQkJCWhlaWdodCA9IHJlY3RhbmdsZS5ib3R0b20gLSByZWN0YW5nbGUudG9wOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJd2lkdGggPSBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoOwotCQkJaGVpZ2h0ID0gcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQ7Ci0JCX0KLQotCQlpZihwcmVzZW50UGFyYW1ldGVycy0+RW5hYmxlQXV0b0RlcHRoU3RlbmNpbCAhPSBGQUxTRSkKLQkJewotCQkJZGVwdGhTdGVuY2lsID0gbmV3IERpcmVjdDNEU3VyZmFjZTgodGhpcywgdGhpcywgd2lkdGgsIGhlaWdodCwgcHJlc2VudFBhcmFtZXRlcnMtPkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQsIEQzRFBPT0xfREVGQVVMVCwgcHJlc2VudFBhcmFtZXRlcnMtPk11bHRpU2FtcGxlVHlwZSwgcHJlc2VudFBhcmFtZXRlcnMtPkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQgPT0gRDNERk1UX0QxNl9MT0NLQUJMRSwgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKTsKLQkJCWRlcHRoU3RlbmNpbC0+YmluZCgpOwotCQl9Ci0KLQkJSURpcmVjdDNEU3VyZmFjZTggKnJlbmRlclRhcmdldDsKLQkJc3dhcENoYWluWzBdLT5HZXRCYWNrQnVmZmVyKDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmcmVuZGVyVGFyZ2V0KTsKLQkJU2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCwgZGVwdGhTdGVuY2lsKTsKLQkJcmVuZGVyVGFyZ2V0LT5SZWxlYXNlKCk7Ci0KLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfWkVOQUJMRSwgcHJlc2VudFBhcmFtZXRlcnMtPkVuYWJsZUF1dG9EZXB0aFN0ZW5jaWwgIT0gRkFMU0UgPyBEM0RaQl9UUlVFIDogRDNEWkJfRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GSUxMTU9ERSwgRDNERklMTF9TT0xJRCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NIQURFTU9ERSwgRDNEU0hBREVfR09VUkFVRCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1pXUklURUVOQUJMRSwgVFJVRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0FMUEhBVEVTVEVOQUJMRSwgRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19MQVNUUElYRUwsIFRSVUUpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19TUkNCTEVORCwgRDNEQkxFTkRfT05FKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfREVTVEJMRU5ELCBEM0RCTEVORF9aRVJPKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ1VMTE1PREUsIEQzRENVTExfQ0NXKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfWkZVTkMsIEQzRENNUF9MRVNTRVFVQUwpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTFBIQVJFRiwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0FMUEhBRlVOQywgRDNEQ01QX0FMV0FZUyk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0RJVEhFUkVOQUJMRSwgRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTFBIQUJMRU5ERU5BQkxFLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR0VOQUJMRSwgRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19TUEVDVUxBUkVOQUJMRSwgRkFMU0UpOwotCS8vCVNldFJlbmRlclN0YXRlKEQzRFJTX1pWSVNJQkxFLCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRk9HQ09MT1IsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dUQUJMRU1PREUsIEQzREZPR19OT05FKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRk9HU1RBUlQsIEZ0b0RXKDAuMGYpKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRk9HRU5ELCBGdG9EVygxLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR0RFTlNJVFksIEZ0b0RXKDEuMGYpKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRURHRUFOVElBTElBUywgRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19SQU5HRUZPR0VOQUJMRSwgRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19aQklBUywgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxFTkFCTEUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEZBSUwsIEQzRFNURU5DSUxPUF9LRUVQKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFpGQUlMLCBEM0RTVEVOQ0lMT1BfS0VFUCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxQQVNTLCBEM0RTVEVOQ0lMT1BfS0VFUCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxGVU5DLCBEM0RDTVBfQUxXQVlTKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFJFRiwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxNQVNLLCAweEZGRkZGRkZGKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFdSSVRFTUFTSywgMHhGRkZGRkZGRik7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1RFWFRVUkVGQUNUT1IsIDB4RkZGRkZGRkYpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMCwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVAxLCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDIsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMywgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA0LCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDUsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQNiwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA3LCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ0xJUFBJTkcsIFRSVUUpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19MSUdIVElORywgVFJVRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0FNQklFTlQsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dWRVJURVhNT0RFLCBEM0RGT0dfTk9ORSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NPTE9SVkVSVEVYLCBUUlVFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTE9DQUxWSUVXRVIsIFRSVUUpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19OT1JNQUxJWkVOT1JNQUxTLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRSwgRDNETUNTX0NPTE9SMSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19DT0xPUjIpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19NQVRFUklBTCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19NQVRFUklBTCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1ZFUlRFWEJMRU5ELCBEM0RWQkZfRElTQUJMRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NMSVBQTEFORUVOQUJMRSwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NPRlRXQVJFVkVSVEVYUFJPQ0VTU0lORywgRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkUsIEZ0b0RXKDEuMGYpKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTSVpFX01JTiwgRnRvRFcoMC4wZikpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNQUklURUVOQUJMRSwgRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFRU5BQkxFLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVfQSwgRnRvRFcoMS4wZikpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFX0IsIEZ0b0RXKDAuMGYpKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRV9DLCBGdG9EVygwLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTLCBUUlVFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTVVMVElTQU1QTEVNQVNLLCAweEZGRkZGRkZGKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUEFUQ0hFREdFU1RZTEUsIEQzRFBBVENIRURHRV9ESVNDUkVURSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0RFQlVHTU9OSVRPUlRPS0VOLCBEM0RETVRfRU5BQkxFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTSVpFX01BWCwgRnRvRFcoNjQuMGYpKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfSU5ERVhFRFZFUlRFWEJMRU5ERU5BQkxFLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUsIDB4MDAwMDAwMEYpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19UV0VFTkZBQ1RPUiwgRnRvRFcoMC4wZikpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19CTEVORE9QLCBEM0RCTEVORE9QX0FERCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPU0lUSU9OT1JERVIsIEQzRE9SREVSX0NVQklDKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTk9STUFMT1JERVIsIEQzRE9SREVSX0xJTkVBUik7Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykKLQkJewotCQkJU2V0VGV4dHVyZShpLCAwKTsKLQotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTE9ST1AsIGkgPT0gMCA/IEQzRFRPUF9NT0RVTEFURSA6IEQzRFRPUF9ESVNBQkxFKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19DT0xPUkFSRzEsIEQzRFRBX1RFWFRVUkUpOyAgIC8vIFRPRE86IEQzRFRBX0RJRkZVU0Ugd2hlbiBubyB0ZXh0dXJlIGFzc2lnbmVkCi0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQ09MT1JBUkcyLCBEM0RUQV9DVVJSRU5UKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BTFBIQU9QLCBpID09IDAgPyBEM0RUT1BfU0VMRUNUQVJHMSA6IEQzRFRPUF9ESVNBQkxFKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BTFBIQUFSRzEsIEQzRFRBX1RFWFRVUkUpOyAgIC8vIFRPRE86IEQzRFRBX0RJRkZVU0Ugd2hlbiBubyB0ZXh0dXJlIGFzc2lnbmVkCi0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQUxQSEFBUkcyLCBEM0RUQV9DVVJSRU5UKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CVU1QRU5WTUFUMDAsIEZ0b0RXKDAuMGYpKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CVU1QRU5WTUFUMDEsIEZ0b0RXKDAuMGYpKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CVU1QRU5WTUFUMTAsIEZ0b0RXKDAuMGYpKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CVU1QRU5WTUFUMTEsIEZ0b0RXKDAuMGYpKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19URVhDT09SRElOREVYLCBpKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BRERSRVNTVSwgRDNEVEFERFJFU1NfV1JBUCk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQUREUkVTU1YsIEQzRFRBRERSRVNTX1dSQVApOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0FERFJFU1NXLCBEM0RUQUREUkVTU19XUkFQKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CT1JERVJDT0xPUiwgMHgwMDAwMDAwMCk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfTUFHRklMVEVSLCBEM0RURVhGX1BPSU5UKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19NSU5GSUxURVIsIEQzRFRFWEZfUE9JTlQpOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX01JUEZJTFRFUiwgRDNEVEVYRl9OT05FKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19NSVBNQVBMT0RCSUFTLCAwKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19NQVhNSVBMRVZFTCwgMCk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfTUFYQU5JU09UUk9QWSwgMSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVkxTQ0FMRSwgRnRvRFcoMC4wZikpOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0JVTVBFTlZMT0ZGU0VULCBGdG9EVygwLjBmKSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTLCBEM0RUVEZGX0RJU0FCTEUpOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTE9SQVJHMCwgRDNEVEFfQ1VSUkVOVCk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQUxQSEFBUkcwLCBEM0RUQV9DVVJSRU5UKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19SRVNVTFRBUkcsIEQzRFRBX0NVUlJFTlQpOwotCQl9Ci0KLQkJY3VycmVudFBhbGV0dGUgPSAweEZGRkY7Ci0KLQkJZGVsZXRlIGN1cnNvcjsKLQkJc2hvd0N1cnNvciA9IGZhbHNlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlJlc291cmNlTWFuYWdlckRpc2NhcmRCeXRlcyh1bnNpZ25lZCBsb25nIGJ5dGVzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBmbG9hdCAqcGxhbmUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXBsYW5lIHx8IGluZGV4ID4gNikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZighcmVjb3JkU3RhdGUpCi0JCXsKLQkJCXRoaXMtPnBsYW5lW2luZGV4XVswXSA9IHBsYW5lWzBdOwotCQkJdGhpcy0+cGxhbmVbaW5kZXhdWzFdID0gcGxhbmVbMV07Ci0JCQl0aGlzLT5wbGFuZVtpbmRleF1bMl0gPSBwbGFuZVsyXTsKLQkJCXRoaXMtPnBsYW5lW2luZGV4XVszXSA9IHBsYW5lWzNdOwotCi0JCQlyZW5kZXJlci0+c2V0Q2xpcFBsYW5lKGluZGV4LCBwbGFuZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0Q2xpcFBsYW5lKGluZGV4LCBwbGFuZSk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRDbGlwU3RhdHVzKGNvbnN0IEQzRENMSVBTVEFUVVM4ICpjbGlwU3RhdHVzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFjbGlwU3RhdHVzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXRoaXMtPmNsaXBTdGF0dXMgPSAqY2xpcFN0YXR1czsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6U2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKHBhbGV0dGVOdW1iZXIgPiAweEZGRkYgfHwgcGFsZXR0ZS5maW5kKHBhbGV0dGVOdW1iZXIpID09IHBhbGV0dGUuZW5kKCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXJlY29yZFN0YXRlKQotCQl7Ci0JCQljdXJyZW50UGFsZXR0ZSA9IHBhbGV0dGVOdW1iZXI7Ci0KLQkJCXN3OjpTdXJmYWNlOjpzZXRUZXh0dXJlUGFsZXR0ZSgodW5zaWduZWQgaW50KikmcGFsZXR0ZVtjdXJyZW50UGFsZXR0ZV0pOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZShwYWxldHRlTnVtYmVyKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRERldmljZTg6OlNldEN1cnNvclBvc2l0aW9uKGludCB4LCBpbnQgeSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlQT0lOVCBwb2ludCA9IHt4LCB5fTsKLQkJSFdORCB3aW5kb3cgPSBmb2N1c1dpbmRvdyA/IGZvY3VzV2luZG93IDogcHJlc2VudFBhcmFtZXRlcnMuaERldmljZVdpbmRvdzsKLQkJU2NyZWVuVG9DbGllbnQod2luZG93LCAmcG9pbnQpOwotCi0JCXN3OjpGcmFtZUJ1ZmZlcjo6c2V0Q3Vyc29yUG9zaXRpb24ocG9pbnQueCwgcG9pbnQueSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldEN1cnNvclByb3BlcnRpZXModW5zaWduZWQgaW50IHgwLCB1bnNpZ25lZCBpbnQgeTAsIElEaXJlY3QzRFN1cmZhY2U4ICpjdXJzb3JCaXRtYXApCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWN1cnNvckJpdG1hcCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlEM0RTVVJGQUNFX0RFU0MgZGVzYzsKLQkJRDNETE9DS0VEX1JFQ1QgbG9jazsKLQotCQljdXJzb3JCaXRtYXAtPkdldERlc2MoJmRlc2MpOwotCQljdXJzb3JCaXRtYXAtPkxvY2tSZWN0KCZsb2NrLCAwLCAwKTsKLQotCQlkZWxldGUgY3Vyc29yOwotCQljdXJzb3IgPSBzdzo6U3VyZmFjZTo6Y3JlYXRlKDAsIGRlc2MuV2lkdGgsIGRlc2MuSGVpZ2h0LCAxLCAwLCAxLCBzdzo6Rk9STUFUX0E4UjhHOEI4LCBmYWxzZSwgZmFsc2UpOwotCi0JCXZvaWQgKmJ1ZmZlciA9IGN1cnNvci0+bG9ja0V4dGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX0RJU0NBUkQsIHN3OjpQVUJMSUMpOwotCQltZW1jcHkoYnVmZmVyLCBsb2NrLnBCaXRzLCBkZXNjLldpZHRoICogZGVzYy5IZWlnaHQgKiBzaXplb2YodW5zaWduZWQgaW50KSk7Ci0JCWN1cnNvci0+dW5sb2NrRXh0ZXJuYWwoKTsKLQotCQljdXJzb3JCaXRtYXAtPlVubG9ja1JlY3QoKTsKLQotCQlzdzo6RnJhbWVCdWZmZXI6OnNldEN1cnNvck9yaWdpbih4MCwgeTApOwotCi0JCWJpbmRDdXJzb3IoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U4OjpTZXRHYW1tYVJhbXAodW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgRDNER0FNTUFSQU1QICpyYW1wKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFyYW1wKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzd2FwQ2hhaW5bMF0tPnNldEdhbW1hUmFtcCgoc3c6OkdhbW1hUmFtcCopcmFtcCwgZmxhZ3MgJiBEM0RTR1JfQ0FMSUJSQVRFKTsKLQotCQlyZXR1cm47Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IEQzRExJR0hUOCAqbGlnaHQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWxpZ2h0KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKCFyZWNvcmRTdGF0ZSkKLQkJewotCQkJdGhpcy0+bGlnaHRbaW5kZXhdID0gKmxpZ2h0OwotCi0JCQlsaWdodHNEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0TGlnaHQoaW5kZXgsIGxpZ2h0KTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOCAqbWF0ZXJpYWwpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIW1hdGVyaWFsKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsgICAvLyBGSVhNRTogQ29ycmVjdCBiZWhhdmlvdXI/Ci0JCX0KLQotCQlpZighcmVjb3JkU3RhdGUpCi0JCXsKLQkJCXRoaXMtPm1hdGVyaWFsID0gKm1hdGVyaWFsOwotCi0JCQlyZW5kZXJlci0+c2V0TWF0ZXJpYWxBbWJpZW50KHN3OjpDb2xvcjxmbG9hdD4obWF0ZXJpYWwtPkFtYmllbnQuciwgbWF0ZXJpYWwtPkFtYmllbnQuZywgbWF0ZXJpYWwtPkFtYmllbnQuYiwgbWF0ZXJpYWwtPkFtYmllbnQuYSkpOwotCQkJcmVuZGVyZXItPnNldE1hdGVyaWFsRGlmZnVzZShzdzo6Q29sb3I8ZmxvYXQ+KG1hdGVyaWFsLT5EaWZmdXNlLnIsIG1hdGVyaWFsLT5EaWZmdXNlLmcsIG1hdGVyaWFsLT5EaWZmdXNlLmIsIG1hdGVyaWFsLT5EaWZmdXNlLmEpKTsKLQkJCXJlbmRlcmVyLT5zZXRNYXRlcmlhbEVtaXNzaW9uKHN3OjpDb2xvcjxmbG9hdD4obWF0ZXJpYWwtPkVtaXNzaXZlLnIsIG1hdGVyaWFsLT5FbWlzc2l2ZS5nLCBtYXRlcmlhbC0+RW1pc3NpdmUuYiwgbWF0ZXJpYWwtPkVtaXNzaXZlLmEpKTsKLQkJCXJlbmRlcmVyLT5zZXRNYXRlcmlhbFNoaW5pbmVzcyhtYXRlcmlhbC0+UG93ZXIpOwotCQkJcmVuZGVyZXItPnNldE1hdGVyaWFsU3BlY3VsYXIoc3c6OkNvbG9yPGZsb2F0PihtYXRlcmlhbC0+U3BlY3VsYXIuciwgbWF0ZXJpYWwtPlNwZWN1bGFyLmcsIG1hdGVyaWFsLT5TcGVjdWxhci5iLCBtYXRlcmlhbC0+U3BlY3VsYXIuYSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldE1hdGVyaWFsKG1hdGVyaWFsKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBjb25zdCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYocGFsZXR0ZU51bWJlciA+IDB4RkZGRiB8fCAhZW50cmllcykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCXsKLQkJCXBhbGV0dGVbcGFsZXR0ZU51bWJlcl0uZW50cnlbaV0gPSBlbnRyaWVzW2ldOwotCQl9Ci0KLQkJaWYocGFsZXR0ZU51bWJlciA9PSBjdXJyZW50UGFsZXR0ZSkKLQkJewotCQkJc3c6OlN1cmZhY2U6OnNldFRleHR1cmVQYWxldHRlKCh1bnNpZ25lZCBpbnQqKSZwYWxldHRlW2N1cnJlbnRQYWxldHRlXSk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRQaXhlbFNoYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighcmVjb3JkU3RhdGUpCi0JCXsKLQkJCWlmKHBpeGVsU2hhZGVyW2hhbmRsZV0pCi0JCQl7Ci0JCQkJcGl4ZWxTaGFkZXJbaGFuZGxlXS0+YmluZCgpOwotCQkJfQotCi0JCQlpZihwaXhlbFNoYWRlcltwaXhlbFNoYWRlckhhbmRsZV0pCi0JCQl7Ci0JCQkJcGl4ZWxTaGFkZXJbcGl4ZWxTaGFkZXJIYW5kbGVdLT51bmJpbmQoKTsKLQkJCX0KLQotCQkJcGl4ZWxTaGFkZXJIYW5kbGUgPSBoYW5kbGU7Ci0KLQkJCWlmKGhhbmRsZSAhPSAwKQotCQkJewotCQkJCXJlbmRlcmVyLT5zZXRQaXhlbFNoYWRlcihwaXhlbFNoYWRlcltoYW5kbGVdLT5nZXRQaXhlbFNoYWRlcigpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZW5kZXJlci0+c2V0UGl4ZWxTaGFkZXIoMCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0UGl4ZWxTaGFkZXIoaGFuZGxlKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnQodW5zaWduZWQgbG9uZyBzdGFydFJlZ2lzdGVyLCBjb25zdCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGxvbmcgY291bnQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXJlY29yZFN0YXRlKQotCQl7Ci0JCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCXsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVswXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAwXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAxXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAyXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVszXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAzXTsKLQkJCX0KLQotCQkJcmVuZGVyZXItPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHN0YXJ0UmVnaXN0ZXIsIChjb25zdCBmbG9hdCopY29uc3RhbnREYXRhLCBjb3VudCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudChzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLQl7Ci0JCVRSQUNFKCJEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUgPSAlZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICVkIiwgc3RhdGUsIHZhbHVlKTsKLQotCQlpZihzdGF0ZSA8IEQzRFJTX1pFTkFCTEUgfHwgc3RhdGUgPiBEM0RSU19OT1JNQUxPUkRFUikKLQkJewotCQkJcmV0dXJuIEQzRF9PSzsgICAvLyBGSVhNRTogV2FybmluZwotCQl9Ci0KLQkJaWYoIXJlY29yZFN0YXRlKQotCQl7Ci0JCQlpZighaW5pdCAmJiByZW5kZXJTdGF0ZVtzdGF0ZV0gPT0gdmFsdWUpCi0JCQl7Ci0JCQkJcmV0dXJuIEQzRF9PSzsKLQkJCX0KLQotCQkJcmVuZGVyU3RhdGVbc3RhdGVdID0gdmFsdWU7Ci0KLQkJCXN3aXRjaChzdGF0ZSkKLQkJCXsKLQkJCWNhc2UgRDNEUlNfWkVOQUJMRToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEWkJfVFJVRToKLQkJCQljYXNlIEQzRFpCX1VTRVc6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXB0aEJ1ZmZlckVuYWJsZSh0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RaQl9GQUxTRToKLQkJCQkJcmVuZGVyZXItPnNldERlcHRoQnVmZmVyRW5hYmxlKGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0ZJTExNT0RFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGSUxMX1BPSU5UOgotCQkJCQlyZW5kZXJlci0+c2V0RmlsbE1vZGUoc3c6OkZJTExfVkVSVEVYKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RGSUxMX1dJUkVGUkFNRToKLQkJCQkJcmVuZGVyZXItPnNldEZpbGxNb2RlKHN3OjpGSUxMX1dJUkVGUkFNRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNERklMTF9TT0xJRDoKLQkJCQkJcmVuZGVyZXItPnNldEZpbGxNb2RlKHN3OjpGSUxMX1NPTElEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NIQURFTU9ERToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEU0hBREVfRkxBVDoKLQkJCQkJcmVuZGVyZXItPnNldFNoYWRpbmdNb2RlKHN3OjpTSEFESU5HX0ZMQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNIQURFX0dPVVJBVUQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTaGFkaW5nTW9kZShzdzo6U0hBRElOR19HT1VSQVVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTSEFERV9QSE9ORzoKLQkJCQkJLy8gRklYTUU6IFVuaW1wbGVtZW50ZWQgKHNob3VsZCBzZXQgZ291cmF1ZCk/Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19MSU5FUEFUVEVSTjoKLQkJCQlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19aV1JJVEVFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldERlcHRoV3JpdGVFbmFibGUodmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19BTFBIQVRFU1RFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldEFscGhhVGVzdEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0xBU1RQSVhFTDoKLQkJCQlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TUkNCTEVORDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEQkxFTkRfWkVSTzoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9aRVJPKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfT05FKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9TUkNDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9TT1VSQ0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVlNSQ0NPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVlNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9ERVNUQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfREVTVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WREVTVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9ERVNUQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfREVTVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfSU5WREVTVENPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVkRFU1QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX1NSQ0FMUEhBU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NSQ0FMUEhBU0FUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9CT1RIU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRUFMUEhBKTsKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfREVTVEJMRU5EOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RCTEVORF9aRVJPOgotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9aRVJPKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX09ORSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfU1JDQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NPVVJDRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NPVVJDRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZTUkNBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0RFU1RBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfREVTVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVkRFU1RBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfREVTVENPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9ERVNUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVkRFU1QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX1NSQ0FMUEhBU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9TUkNBTFBIQVNBVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfQk9USFNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NPVVJDRUFMUEhBKTsKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0JPVEhJTlZTUkNBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NPVVJDRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0NVTExNT0RFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RDVUxMX05PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRDdWxsTW9kZShzdzo6Q1VMTF9OT05FLCB0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDVUxMX0NDVzoKLQkJCQkJcmVuZGVyZXItPnNldEN1bGxNb2RlKHN3OjpDVUxMX0NPVU5URVJDTE9DS1dJU0UsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENVTExfQ1c6Ci0JCQkJCXJlbmRlcmVyLT5zZXRDdWxsTW9kZShzdzo6Q1VMTF9DTE9DS1dJU0UsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfWkZVTkM6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRENNUF9ORVZFUjoKLQkJCQkJcmVuZGVyZXItPnNldERlcHRoQ29tcGFyZShzdzo6REVQVEhfTkVWRVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9MRVNTOgotCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9MRVNTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfRVFVQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX0VRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTEVTU0VRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9MRVNTRVFVQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9HUkVBVEVSOgotCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9HUkVBVEVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTk9URVFVQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX05PVEVRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfR1JFQVRFUkVRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9HUkVBVEVSRVFVQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9BTFdBWVM6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX0FMV0FZUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19BTFBIQVJFRjoKLQkJCQlyZW5kZXJlci0+c2V0QWxwaGFSZWZlcmVuY2UodmFsdWUgJiAweDAwMDAwMEZGKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQUxQSEFGVU5DOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RDTVBfTkVWRVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBbHBoYUNvbXBhcmUoc3c6OkFMUEhBX05FVkVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTEVTUzoKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfTEVTUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0VRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9FUVVBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0xFU1NFUVVBTDoKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfTEVTU0VRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfR1JFQVRFUjoKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfR1JFQVRFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX05PVEVRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9OT1RFUVVBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0dSRUFURVJFUVVBTDoKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfR1JFQVRFUkVRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfQUxXQVlTOgotCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9BTFdBWVMpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfRElUSEVSRU5BQkxFOgotCQkJLy8JaWYoIWluaXQgJiYgdmFsdWUgPT0gMSkgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FOiBVbmltcGxlbWVudGVkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0FMUEhBQkxFTkRFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldEFscGhhQmxlbmRFbmFibGUodmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19GT0dFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldEZvZ0VuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1pWSVNJQkxFOgotCQkJCWJyZWFrOyAgIC8vIE5vdCBzdXBwb3J0ZWQKLQkJCWNhc2UgRDNEUlNfRk9HQ09MT1I6Ci0JCQkJcmVuZGVyZXItPnNldEZvZ0NvbG9yKHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfRk9HVEFCTEVNT0RFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGT0dfTk9ORToKLQkJCQkJcmVuZGVyZXItPnNldFBpeGVsRm9nTW9kZShzdzo6Rk9HX05PTkUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREZPR19MSU5FQVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRQaXhlbEZvZ01vZGUoc3c6OkZPR19MSU5FQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREZPR19FWFA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRQaXhlbEZvZ01vZGUoc3c6OkZPR19FWFApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREZPR19FWFAyOgotCQkJCQlyZW5kZXJlci0+c2V0UGl4ZWxGb2dNb2RlKHN3OjpGT0dfRVhQMik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19GT0dTVEFSVDoKLQkJCQlyZW5kZXJlci0+c2V0Rm9nU3RhcnQoKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0ZPR0VORDoKLQkJCQlyZW5kZXJlci0+c2V0Rm9nRW5kKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19GT0dERU5TSVRZOgotCQkJCXJlbmRlcmVyLT5zZXRGb2dEZW5zaXR5KChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19FREdFQU5USUFMSUFTOgotCQkJCWlmKCFpbml0KSBpZih2YWx1ZSAhPSBGQUxTRSkgVU5JTVBMRU1FTlRFRCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19aQklBUzoKLQkJCQlyZW5kZXJlci0+c2V0RGVwdGhCaWFzKC0yLjBlLTZmICogdmFsdWUpOwotCQkJCXJlbmRlcmVyLT5zZXRTbG9wZURlcHRoQmlhcygwLjBmKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfUkFOR0VGT0dFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldFJhbmdlRm9nRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1BFQ1VMQVJFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldFNwZWN1bGFyRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1RFTkNJTEVOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NURU5DSUxGQUlMOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fS0VFUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1pFUk86Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX1pFUk8pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9SRVBMQUNFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9SRVBMQUNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5DUlNBVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1JTQVQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1JTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9JTlZFUlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOVkVSVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOQ1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9ERUNSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NURU5DSUxaRkFJTDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0tFRVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9LRUVQKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfWkVSTzoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX1pFUk8pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9SRVBMQUNFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fUkVQTEFDRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1JTQVQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9JTkNSU0FUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUlNBVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1JTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9JTlZFUlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9JTlZFUlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5DUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9ERUNSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NURU5DSUxQQVNTOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fS0VFUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1pFUk86Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX1pFUk8pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9SRVBMQUNFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9SRVBMQUNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5DUlNBVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1JTQVQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1JTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9JTlZFUlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOVkVSVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOQ1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9ERUNSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NURU5DSUxGVU5DOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RDTVBfTkVWRVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9ORVZFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0xFU1M6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9MRVNTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfRVFVQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9FUVVBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0xFU1NFUVVBTDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0xFU1NFUVVBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0dSRUFURVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9HUkVBVEVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTk9URVFVQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9OT1RFUVVBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0dSRUFURVJFUVVBTDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0dSRUFURVJFUVVBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0FMV0FZUzoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0FMV0FZUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TVEVOQ0lMUkVGOgotCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUmVmZXJlbmNlKHZhbHVlKTsKLQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFJlZmVyZW5jZUNDVyh2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NURU5DSUxNQVNLOgotCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsTWFzayh2YWx1ZSk7Ci0JCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxNYXNrQ0NXKHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1RFTkNJTFdSSVRFTUFTSzoKLQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFdyaXRlTWFzayh2YWx1ZSk7Ci0JCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxXcml0ZU1hc2tDQ1codmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19URVhUVVJFRkFDVE9SOgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmFjdG9yKHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDA6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDAsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDE6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDEsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDI6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDIsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDM6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDMsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDQ6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDQsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDU6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDUsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDY6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDYsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDc6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDcsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQ0xJUFBJTkc6Ci0JCQkJLy8gSWdub3JlZCwgY2xpcHBpbmcgaXMgYWx3YXlzIHBlcmZvcm1lZAotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19MSUdIVElORzoKLQkJCQlyZW5kZXJlci0+c2V0TGlnaHRpbmdFbmFibGUodmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19BTUJJRU5UOgotCQkJCXJlbmRlcmVyLT5zZXRHbG9iYWxBbWJpZW50KHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfRk9HVkVSVEVYTU9ERToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNERk9HX05PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhGb2dNb2RlKHN3OjpGT0dfTk9ORSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNERk9HX0xJTkVBUjoKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleEZvZ01vZGUoc3c6OkZPR19MSU5FQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREZPR19FWFA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhGb2dNb2RlKHN3OjpGT0dfRVhQKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RGT0dfRVhQMjoKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleEZvZ01vZGUoc3c6OkZPR19FWFAyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0NPTE9SVkVSVEVYOgotCQkJCXJlbmRlcmVyLT5zZXRDb2xvclZlcnRleEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0xPQ0FMVklFV0VSOgotCQkJCXJlbmRlcmVyLT5zZXRMb2NhbFZpZXdlcih2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX05PUk1BTElaRU5PUk1BTFM6Ci0JCQkJcmVuZGVyZXItPnNldE5vcm1hbGl6ZU5vcm1hbHModmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19ESUZGVVNFTUFURVJJQUxTT1VSQ0U6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRE1DU19NQVRFUklBTDoKLQkJCQkJcmVuZGVyZXItPnNldERpZmZ1c2VNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfTUFURVJJQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRE1DU19DT0xPUjE6Ci0JCQkJCXJlbmRlcmVyLT5zZXREaWZmdXNlTWF0ZXJpYWxTb3VyY2Uoc3c6Ok1BVEVSSUFMX0NPTE9SMSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNETUNTX0NPTE9SMjoKLQkJCQkJcmVuZGVyZXItPnNldERpZmZ1c2VNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0U6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRE1DU19NQVRFUklBTDoKLQkJCQkJcmVuZGVyZXItPnNldFNwZWN1bGFyTWF0ZXJpYWxTb3VyY2Uoc3c6Ok1BVEVSSUFMX01BVEVSSUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RNQ1NfQ09MT1IxOgotCQkJCQlyZW5kZXJlci0+c2V0U3BlY3VsYXJNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RNQ1NfQ09MT1IyOgotCQkJCQlyZW5kZXJlci0+c2V0U3BlY3VsYXJNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0FNQklFTlRNQVRFUklBTFNPVVJDRToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNETUNTX01BVEVSSUFMOgotCQkJCQlyZW5kZXJlci0+c2V0QW1iaWVudE1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9NQVRFUklBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNETUNTX0NPTE9SMToKLQkJCQkJcmVuZGVyZXItPnNldEFtYmllbnRNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RNQ1NfQ09MT1IyOgotCQkJCQlyZW5kZXJlci0+c2V0QW1iaWVudE1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNETUNTX01BVEVSSUFMOgotCQkJCQlyZW5kZXJlci0+c2V0RW1pc3NpdmVNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfTUFURVJJQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRE1DU19DT0xPUjE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRFbWlzc2l2ZU1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRE1DU19DT0xPUjI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRFbWlzc2l2ZU1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfVkVSVEVYQkxFTkQ6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRFZCRl9ESVNBQkxFOgotCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4QmxlbmRNYXRyaXhDb3VudCgwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RWQkZfMVdFSUdIVFM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhCbGVuZE1hdHJpeENvdW50KDIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFZCRl8yV0VJR0hUUzoKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleEJsZW5kTWF0cml4Q291bnQoMyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVkJGXzNXRUlHSFRTOgotCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4QmxlbmRNYXRyaXhDb3VudCg0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RWQkZfVFdFRU5JTkc6Ci0JCQkJCVVOSU1QTEVNRU5URUQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RWQkZfMFdFSUdIVFM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhCbGVuZE1hdHJpeENvdW50KDEpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQ0xJUFBMQU5FRU5BQkxFOgotCQkJCXJlbmRlcmVyLT5zZXRDbGlwRmxhZ3ModmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TT0ZUV0FSRVZFUlRFWFBST0NFU1NJTkc6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1BPSU5UU0laRToKLQkJCQlyZW5kZXJlci0+c2V0UG9pbnRTaXplKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNJWkVfTUlOOgotCQkJCXJlbmRlcmVyLT5zZXRQb2ludFNpemVNaW4oKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFOgotCQkJCXJlbmRlcmVyLT5zZXRQb2ludFNwcml0ZUVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1BPSU5UU0NBTEVFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVFbmFibGUodmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0E6Ci0JCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVBKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0I6Ci0JCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVCKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0M6Ci0JCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVDKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19NVUxUSVNBTVBMRUFOVElBTElBUzoKLQkJCS8vCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX01VTFRJU0FNUExFTUFTSzoKLQkJCQlTZXRSZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0LCBkZXB0aFN0ZW5jaWwpOyAgIC8vIFNldHMgdGhlIG11bHRpLXNhbXBsZSBtYXNrLCBpZiBtYXNrYWJsZQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QQVRDSEVER0VTVFlMRToKLQkJCS8vCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1BBVENIU0VHTUVOVFM6Ci0JCQkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfREVCVUdNT05JVE9SVE9LRU46Ci0JCQkJaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfUE9JTlRTSVpFX01BWDoKLQkJCQlyZW5kZXJlci0+c2V0UG9pbnRTaXplTWF4KChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19JTkRFWEVEVkVSVEVYQkxFTkRFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldEluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0NPTE9SV1JJVEVFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldENvbG9yV3JpdGVNYXNrKDAsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfVFdFRU5GQUNUT1I6Ci0JCQkJaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQkxFTkRPUDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEQkxFTkRPUF9BREQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9BREQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5ET1BfU1VCVFJBQ1Q6Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9TVUIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5ET1BfUkVWU1VCVFJBQ1Q6Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9JTlZTVUIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5ET1BfTUlOOgotCQkJCQlyZW5kZXJlci0+c2V0QmxlbmRPcGVyYXRpb24oc3c6OkJMRU5ET1BfTUlOKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORE9QX01BWDoKLQkJCQkJcmVuZGVyZXItPnNldEJsZW5kT3BlcmF0aW9uKHN3OjpCTEVORE9QX01BWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT1NJVElPTk9SREVSOgotCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX05PUk1BTE9SREVSOgotCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAgIC8vIHN0YXRlUmVjb3JkZXIKLQkJewotCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldFJlbmRlclN0YXRlKHN0YXRlLCB2YWx1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNEU3VyZmFjZTggKm5ld1JlbmRlclRhcmdldCwgSURpcmVjdDNEU3VyZmFjZTggKm5ld0RlcHRoU3RlbmNpbCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlEaXJlY3QzRFN1cmZhY2U4ICpyZW5kZXJUYXJnZXQgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U4Kj4obmV3UmVuZGVyVGFyZ2V0KTsKLQotCQlpZihyZW5kZXJUYXJnZXQpICAgLy8gRklYTUU6IENoZWNrIGZvciBEM0RVU0FHRV9SRU5ERVJUQVJHRVQKLQkJewotCQkJcmVuZGVyVGFyZ2V0LT5iaW5kKCk7Ci0JCX0KLQotCQlpZih0aGlzLT5yZW5kZXJUYXJnZXQpCi0JCXsKLQkJCXRoaXMtPnJlbmRlclRhcmdldC0+dW5iaW5kKCk7Ci0JCX0KLQotCQl0aGlzLT5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7Ci0KLQkJRGlyZWN0M0RTdXJmYWNlOCAqZGVwdGhTdGVuY2lsID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOCo+KG5ld0RlcHRoU3RlbmNpbCk7Ci0KLQkJaWYoZGVwdGhTdGVuY2lsKSAgIC8vIEZJWE1FOiBDaGVjayBmb3IgRDNEVVNBR0VfREVQVEhTVEVOQ0lMIGFuZCBEM0RQT09MX0RFRkFVTFQKLQkJewotCQkJZGVwdGhTdGVuY2lsLT5iaW5kKCk7Ci0JCX0KLQotCQlpZih0aGlzLT5kZXB0aFN0ZW5jaWwpCi0JCXsKLQkJCXRoaXMtPmRlcHRoU3RlbmNpbC0+dW5iaW5kKCk7Ci0JCX0KLQotCQl0aGlzLT5kZXB0aFN0ZW5jaWwgPSBkZXB0aFN0ZW5jaWw7Ci0KLQkJLy8gUmVzZXQgdmlld3BvcnQgdG8gc2l6ZSBvZiBjdXJyZW50IHJlbmRlciB0YXJnZXQKLQkJRDNEU1VSRkFDRV9ERVNDIHJlbmRlclRhcmdldERlc2M7Ci0JCXJlbmRlclRhcmdldC0+R2V0RGVzYygmcmVuZGVyVGFyZ2V0RGVzYyk7Ci0KLQkJRDNEVklFV1BPUlQ4IHZpZXdwb3J0OwotCQl2aWV3cG9ydC5YID0gMDsKLQkJdmlld3BvcnQuWSA9IDA7Ci0JCXZpZXdwb3J0LldpZHRoID0gcmVuZGVyVGFyZ2V0RGVzYy5XaWR0aDsKLQkJdmlld3BvcnQuSGVpZ2h0ID0gcmVuZGVyVGFyZ2V0RGVzYy5IZWlnaHQ7Ci0JCXZpZXdwb3J0Lk1pblogPSAwOwotCQl2aWV3cG9ydC5NYXhaID0gMTsKLQotCQlTZXRWaWV3cG9ydCgmdmlld3BvcnQpOwotCi0JCS8vIFNldCB0aGUgbXVsdGktc2FtcGxlIG1hc2ssIGlmIG1hc2thYmxlCi0JCWlmKHJlbmRlclRhcmdldERlc2MuTXVsdGlTYW1wbGVUeXBlICE9IEQzRE1VTFRJU0FNUExFX05PTkUpCi0JCXsKLQkJCXJlbmRlcmVyLT5zZXRNdWx0aVNhbXBsZU1hc2socmVuZGVyU3RhdGVbRDNEUlNfTVVMVElTQU1QTEVNQVNLXSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZW5kZXJlci0+c2V0TXVsdGlTYW1wbGVNYXNrKDB4RkZGRkZGRkYpOwotCQl9Ci0KLQkJcmVuZGVyZXItPnNldFJlbmRlclRhcmdldCgwLCByZW5kZXJUYXJnZXQpOwotCQlyZW5kZXJlci0+c2V0RGVwdGhCdWZmZXIoZGVwdGhTdGVuY2lsKTsKLQkJcmVuZGVyZXItPnNldFN0ZW5jaWxCdWZmZXIoZGVwdGhTdGVuY2lsKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgSURpcmVjdDNEVmVydGV4QnVmZmVyOCAqaVZlcnRleEJ1ZmZlciwgdW5zaWduZWQgaW50IHN0cmlkZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKnZlcnRleEJ1ZmZlciA9IHN0YXRpY19jYXN0PERpcmVjdDNEVmVydGV4QnVmZmVyOCo+KGlWZXJ0ZXhCdWZmZXIpOwotCi0JCWlmKCFyZWNvcmRTdGF0ZSkKLQkJewotCQkJaWYodmVydGV4QnVmZmVyKQotCQkJewotCQkJCXZlcnRleEJ1ZmZlci0+YmluZCgpOwotCQkJfQotCi0JCQlpZihkYXRhU3RyZWFtW3N0cmVhbV0pCi0JCQl7Ci0JCQkJZGF0YVN0cmVhbVtzdHJlYW1dLT51bmJpbmQoKTsKLQkJCQlzdHJlYW1TdHJpZGVbc3RyZWFtXSA9IDA7Ci0JCQl9Ci0KLQkJCWRhdGFTdHJlYW1bc3RyZWFtXSA9IHZlcnRleEJ1ZmZlcjsKLQkJCXN0cmVhbVN0cmlkZVtzdHJlYW1dID0gc3RyaWRlOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldFN0cmVhbVNvdXJjZShzdHJlYW0sIHZlcnRleEJ1ZmZlciwgc3RyaWRlKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFRleHR1cmUodW5zaWduZWQgbG9uZyBzdGFnZSwgSURpcmVjdDNEQmFzZVRleHR1cmU4ICppQmFzZVRleHR1cmUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoc3RhZ2UgPj0gOCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlEaXJlY3QzREJhc2VUZXh0dXJlOCAqYmFzZVRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RCYXNlVGV4dHVyZTgqPihpQmFzZVRleHR1cmUpOwotCi0JCWlmKCFyZWNvcmRTdGF0ZSkKLQkJewotCQkJaWYodGV4dHVyZVtzdGFnZV0gPT0gYmFzZVRleHR1cmUpCi0JCQl7Ci0JCQkJcmV0dXJuIEQzRF9PSzsKLQkJCX0KLQotCQkJaWYoYmFzZVRleHR1cmUpCi0JCQl7Ci0JCQkJYmFzZVRleHR1cmUtPmJpbmQoKTsKLQkJCX0KLQotCQkJaWYodGV4dHVyZVtzdGFnZV0pCi0JCQl7Ci0JCQkJdGV4dHVyZVtzdGFnZV0tPnVuYmluZCgpOwotCQkJfQotCi0JCQl0ZXh0dXJlW3N0YWdlXSA9IGJhc2VUZXh0dXJlOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldFRleHR1cmUoc3RhZ2UsIGJhc2VUZXh0dXJlKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc3RhZ2UgPSAlZCwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUgPSAlZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICVkIiwgc3RhZ2UsIHR5cGUsIHZhbHVlKTsKLQotCQlpZihzdGFnZSA+PSA4IHx8IHR5cGUgPCAwIHx8IHR5cGUgPiBEM0RUU1NfUkVTVUxUQVJHKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKCFyZWNvcmRTdGF0ZSkKLQkJewotCQkJaWYoIWluaXQgJiYgdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3R5cGVdID09IHZhbHVlKQotCQkJewotCQkJCXJldHVybiBEM0RfT0s7Ci0JCQl9Ci0KLQkJCXRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVt0eXBlXSA9IHZhbHVlOwotCi0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCWNhc2UgRDNEVFNTX0NPTE9ST1A6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRFRPUF9ESVNBQkxFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcxOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcyOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9NT0RVTEFURToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFMlg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUyWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFNFg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEU0WCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0FERDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BREQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9BRERTSUdORUQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEMlg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEMlgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9TVUJUUkFDVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9TVUJUUkFDVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0FERFNNT09USDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTTU9PVEgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORERJRkZVU0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRGQUNUT1JBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQVBNKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRDVVJSRU5UQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9QUkVNT0RVTEFURToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVBTFBIQV9BRERDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQ09MT1JfQUREQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0JVTVBFTlZNQVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0RPVFBST0RVQ1QzOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0RPVDMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9NVUxUSVBMWUFERDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NVUxUSVBMWUFERCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0xFUlA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTEVSUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQ09MT1JBUkcxOgotCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFWFRVUkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9TUEVDVUxBUjoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9TUEVDVUxBUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEVNUDoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQ09MT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRGaXJzdE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQUxQSEFSRVBMSUNBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRGaXJzdE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0NPTE9SQVJHMjoKLQkJCQlzd2l0Y2godmFsdWUgJiBEM0RUQV9TRUxFQ1RNQVNLKQotCQkJCXsKLQkJCQljYXNlIEQzRFRBX0RJRkZVU0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFWFRVUkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFWFRVUkUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RGQUNUT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9TUEVDVUxBUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEVNUDoKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVNUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCi0JCQkJc3dpdGNoKHZhbHVlICYgfkQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQUxQSEFSRVBMSUNBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQgfCBEM0RUQV9BTFBIQVJFUExJQ0FURToKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQUxQSEFPUDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEVE9QX0RJU0FCTEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9ESVNBQkxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfU0VMRUNUQVJHMToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcyOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9NT0RVTEFURTJYOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUyWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFNFg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTRYKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQUREOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEMlg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQyWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX1NVQlRSQUNUOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU1VCVFJBQ1QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9BRERTTU9PVEg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTTU9PVEgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5ERElGRlVTRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBUE0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9CTEVORENVUlJFTlRBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfUFJFTU9EVUxBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUFMUEhBX0FERENPTE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQ09MT1JfQUREQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQlVNUEVOVk1BUDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JVTVBFTlZNQVApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0RPVFBST0RVQ1QzOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfRE9UMyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01VTFRJUExZQUREOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTVVMVElQTFlBREQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9MRVJQOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTEVSUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQUxQSEFBUkcxOgotCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URVhUVVJFOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19BTFBIQUFSRzI6Ci0JCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQV9ESUZGVVNFOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ1VSUkVOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEVYVFVSRToKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URkFDVE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1NQRUNVTEFSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URU1QOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVApOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQotCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUQV9TRUxFQ1RNQVNLKQotCQkJCXsKLQkJCQljYXNlIDA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkNPTE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9BTFBIQVJFUExJQ0FURToKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0FMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UIHwgRDNEVEFfQUxQSEFSRVBMSUNBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQlVNUEVOVk1BVDAwOgotCQkJCXJlbmRlcmVyLT5zZXRCdW1wbWFwTWF0cml4KHN0YWdlLCAwLCAoZmxvYXQmKXZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0JVTVBFTlZNQVQwMToKLQkJCQlyZW5kZXJlci0+c2V0QnVtcG1hcE1hdHJpeChzdGFnZSwgMSwgKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19CVU1QRU5WTUFUMTA6Ci0JCQkJcmVuZGVyZXItPnNldEJ1bXBtYXBNYXRyaXgoc3RhZ2UsIDIsIChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQlVNUEVOVk1BVDExOgotCQkJCXJlbmRlcmVyLT5zZXRCdW1wbWFwTWF0cml4KHN0YWdlLCAzLCAoZmxvYXQmKXZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX1RFWENPT1JESU5ERVg6Ci0JCQkJcmVuZGVyZXItPnNldFRleENvb3JkSW5kZXgoc3RhZ2UsIHZhbHVlICYgMHhGRkZGKTsKLQotCQkJCXN3aXRjaCh2YWx1ZSAmIDB4RkZGRjAwMDApCi0JCQkJewotCQkJCWNhc2UgRDNEVFNTX1RDSV9QQVNTVEhSVToKLQkJCQkJcmVuZGVyZXItPnNldFRleEdlbihzdGFnZSwgc3c6OlRFWEdFTl9QQVNTVEhSVSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVFNTX1RDSV9DQU1FUkFTUEFDRU5PUk1BTDoKLQkJCQkJcmVuZGVyZXItPnNldFRleENvb3JkSW5kZXgoc3RhZ2UsIHN0YWdlKTsKLQkJCQkJcmVuZGVyZXItPnNldFRleEdlbihzdGFnZSwgc3c6OlRFWEdFTl9OT1JNQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VQT1NJVElPTjoKLQkJCQkJcmVuZGVyZXItPnNldFRleENvb3JkSW5kZXgoc3RhZ2UsIHN0YWdlKTsKLQkJCQkJcmVuZGVyZXItPnNldFRleEdlbihzdGFnZSwgc3c6OlRFWEdFTl9QT1NJVElPTik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVJFRkxFQ1RJT05WRUNUT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXhDb29yZEluZGV4KHN0YWdlLCBzdGFnZSk7Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXhHZW4oc3RhZ2UsIHN3OjpURVhHRU5fUkVGTEVDVElPTik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQUREUkVTU1U6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRFRBRERSRVNTX1dSQVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19XUkFQKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19NSVJST1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBRERSRVNTX0NMQU1QOgotCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVVKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfQ0xBTVApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBRERSRVNTX0JPUkRFUjoKLQkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVShzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKLQkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVShzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX01JUlJPUk9OQ0UpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0FERFJFU1NWOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19XUkFQOgotCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVWKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfV1JBUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9SOgotCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVWKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfTUlSUk9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19DTEFNUDoKLQkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX0NMQU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19CT1JERVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19CT1JERVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBRERSRVNTX01JUlJPUk9OQ0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19NSVJST1JPTkNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19CT1JERVJDT0xPUjoKLQkJCQlyZW5kZXJlci0+c2V0Qm9yZGVyQ29sb3Ioc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCB2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19NQUdGSUxURVI6Ci0JCQkJLy8gTk9URTogU3dpZnRTaGFkZXIgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1pbmlmaWNhdGlvbiBhbmQgbWFnbmlmaWNhdGlvbiBmaWx0ZXIKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEVEVYRl9OT05FOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpGSUxURVJfUE9JTlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRFWEZfUE9JTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkZJTFRFUl9QT0lOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9MSU5FQVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkZJTFRFUl9MSU5FQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRFWEZfQU5JU09UUk9QSUM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkZJTFRFUl9BTklTT1RST1BJQyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9GTEFUQ1VCSUM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkZJTFRFUl9MSU5FQVIpOyAgIC8vIE5PVEU6IFVuaW1wbGVtZW50ZWQsIGZhaWwgc2lsZW50bHkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0dBVVNTSUFOQ1VCSUM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkZJTFRFUl9MSU5FQVIpOyAgIC8vIE5PVEU6IFVuaW1wbGVtZW50ZWQsIGZhaWwgc2lsZW50bHkKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCQkJfTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX01JTkZJTFRFUjoKLQkJCQkvLyBOT1RFOiBTd2lmdFNoYWRlciBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbWluaWZpY2F0aW9uIGFuZCBtYWduaWZpY2F0aW9uIGZpbHRlcgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RURVhGX05PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkZJTFRFUl9QT0lOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9QT0lOVDoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX1BPSU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0xJTkVBUjoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX0xJTkVBUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9BTklTT1RST1BJQzoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX0FOSVNPVFJPUElDKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0ZMQVRDVUJJQzoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX0xJTkVBUik7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZCwgZmFpbCBzaWxlbnRseQotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRFWEZfR0FVU1NJQU5DVUJJQzoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX0xJTkVBUik7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZCwgZmFpbCBzaWxlbnRseQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJCQl9OwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfTUlQRklMVEVSOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RURVhGX05PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6TUlQTUFQX05PTkUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRFWEZfUE9JTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6TUlQTUFQX1BPSU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0xJTkVBUjoKLQkJCQkJcmVuZGVyZXItPnNldE1pcG1hcEZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpNSVBNQVBfTElORUFSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0FOSVNPVFJPUElDOgotCQkJCQlyZW5kZXJlci0+c2V0TWlwbWFwRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6Ok1JUE1BUF9MSU5FQVIpOyAgIC8vIE5PVEU6IFVuaW1wbGVtZW50ZWQsIGZhaWwgc2lsZW50bHkKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0ZMQVRDVUJJQzoKLQkJCQkJcmVuZGVyZXItPnNldE1pcG1hcEZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpNSVBNQVBfTElORUFSKTsgICAvLyBOT1RFOiBVbmltcGxlbWVudGVkLCBmYWlsIHNpbGVudGx5Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9HQVVTU0lBTkNVQklDOgotCQkJCQlyZW5kZXJlci0+c2V0TWlwbWFwRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6Ok1JUE1BUF9MSU5FQVIpOyAgIC8vIE5PVEU6IFVuaW1wbGVtZW50ZWQsIGZhaWwgc2lsZW50bHkKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCQkJfTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX01JUE1BUExPREJJQVM6Ci0JCQkJewotCQkJCQlmbG9hdCBMT0QgPSAoZmxvYXQmKXZhbHVlIC0gc3c6OmxvZzIoKGZsb2F0KWNvbnRleHQtPnJlbmRlclRhcmdldFswXS0+Z2V0U3VwZXJTYW1wbGVDb3VudCgpKTsgICAvLyBGSVhNRTogVXBkYXRlIHdoZW4gcmVuZGVyIHRhcmdldCBjaGFuZ2VzCi0JCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBMT0Qoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBMT0QpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX01BWE1JUExFVkVMOgotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfTUFYQU5JU09UUk9QWToKLQkJCQlyZW5kZXJlci0+c2V0TWF4QW5pc290cm9weShzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpjbGFtcCgodW5zaWduZWQgaW50KXZhbHVlLCAodW5zaWduZWQgaW50KTEsIG1heEFuaXNvdHJvcHkpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0JVTVBFTlZMU0NBTEU6Ci0JCQkJcmVuZGVyZXItPnNldEx1bWluYW5jZVNjYWxlKHN0YWdlLCAoZmxvYXQmKXZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0JVTVBFTlZMT0ZGU0VUOgotCQkJCXJlbmRlcmVyLT5zZXRMdW1pbmFuY2VPZmZzZXQoc3RhZ2UsIChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTOgotCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUVEZGX1BST0pFQ1RFRCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUVEZGX0RJU0FCTEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlVHJhbnNmb3JtKHN0YWdlLCAwLCAodmFsdWUgJiAgRDNEVFRGRl9QUk9KRUNURUQpID09IEQzRFRURkZfUFJPSkVDVEVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUVEZGX0NPVU5UMToKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVUcmFuc2Zvcm0oc3RhZ2UsIDEsICh2YWx1ZSAmICBEM0RUVEZGX1BST0pFQ1RFRCkgPT0gRDNEVFRGRl9QUk9KRUNURUQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRURkZfQ09VTlQyOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVRyYW5zZm9ybShzdGFnZSwgMiwgKHZhbHVlICYgIEQzRFRURkZfUFJPSkVDVEVEKSA9PSBEM0RUVEZGX1BST0pFQ1RFRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVFRGRl9DT1VOVDM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlVHJhbnNmb3JtKHN0YWdlLCAzLCAodmFsdWUgJiAgRDNEVFRGRl9QUk9KRUNURUQpID09IEQzRFRURkZfUFJPSkVDVEVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUVEZGX0NPVU5UNDoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVUcmFuc2Zvcm0oc3RhZ2UsIDQsICh2YWx1ZSAmICBEM0RUVEZGX1BST0pFQ1RFRCkgPT0gRDNEVFRGRl9QUk9KRUNURUQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0FERFJFU1NXOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19XUkFQOgotCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVXKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfV1JBUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9SOgotCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVXKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfTUlSUk9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19DTEFNUDoKLQkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVyhzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX0NMQU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19CT1JERVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19CT1JERVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBRERSRVNTX01JUlJPUk9OQ0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19NSVJST1JPTkNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19DT0xPUkFSRzA6Ci0JCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0RJRkZVU0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfU1BFQ1VMQVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVNUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEVYVFVSRToKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URkFDVE9SOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQotCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUQV9TRUxFQ1RNQVNLKQotCQkJCXsKLQkJCQljYXNlIDA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkNPTE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9BTFBIQVJFUExJQ0FURToKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0FMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UIHwgRDNEVEFfQUxQSEFSRVBMSUNBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQUxQSEFBUkcwOgotCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URVhUVVJFOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfUkVTVUxUQVJHOgotCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgRDNEVEFfQ1VSUkVOVDoKLQkJCQkJcmVuZGVyZXItPnNldERlc3RpbmF0aW9uQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OkRFU1RJTkFUSU9OX0NVUlJFTlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0aW5hdGlvbkFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpERVNUSU5BVElPTl9URU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAgIC8vIHN0YXRlUmVjb3JkZXIKLQkJewotCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCB0eXBlLCB2YWx1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbWF0cml4IHx8IHN0YXRlIDwgMCB8fCBzdGF0ZSA+IDUxMSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZighcmVjb3JkU3RhdGUpCi0JCXsKLQkJCXRoaXMtPm1hdHJpeFtzdGF0ZV0gPSAqbWF0cml4OwotCi0JCQlzdzo6TWF0cml4IE0obWF0cml4LT5fMTEsIG1hdHJpeC0+XzIxLCBtYXRyaXgtPl8zMSwgbWF0cml4LT5fNDEsCi0JCQkgICAgICAgICAgICAgbWF0cml4LT5fMTIsIG1hdHJpeC0+XzIyLCBtYXRyaXgtPl8zMiwgbWF0cml4LT5fNDIsCi0JCQkgICAgICAgICAgICAgbWF0cml4LT5fMTMsIG1hdHJpeC0+XzIzLCBtYXRyaXgtPl8zMywgbWF0cml4LT5fNDMsCi0JCQkgICAgICAgICAgICAgbWF0cml4LT5fMTQsIG1hdHJpeC0+XzI0LCBtYXRyaXgtPl8zNCwgbWF0cml4LT5fNDQpOwotCi0JCQlzd2l0Y2goc3RhdGUpCi0JCQl7Ci0JCQljYXNlIEQzRFRTX1dPUkxEOgotCQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfVklFVzoKLQkJCQlyZW5kZXJlci0+c2V0Vmlld01hdHJpeChNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfUFJPSkVDVElPTjoKLQkJCQlyZW5kZXJlci0+c2V0UHJvamVjdGlvbk1hdHJpeChNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfVEVYVFVSRTA6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMCwgTSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTX1RFWFRVUkUxOgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDEsIE0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU19URVhUVVJFMjoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgyLCBNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfVEVYVFVSRTM6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMywgTSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTX1RFWFRVUkU0OgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDQsIE0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU19URVhUVVJFNToKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg1LCBNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfVEVYVFVSRTY6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNiwgTSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTX1RFWFRVUkU3OgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDcsIE0pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZihzdGF0ZSA+IDI1NiAmJiBzdGF0ZSA8IDUxMikKLQkJCQl7Ci0JCQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChNLCBzdGF0ZSAtIDI1Nik7Ci0JCQkJfQotCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKLQkJCX0KLQkJfQotCQllbHNlICAgLy8gc3RhdGVSZWNvcmRlcgotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0VHJhbnNmb3JtKHN0YXRlLCBtYXRyaXgpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlODo6U2V0VmVydGV4U2hhZGVyKHVuc2lnbmVkIGxvbmcgaGFuZGxlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFyZWNvcmRTdGF0ZSkKLQkJewotCQkJaWYoaGFuZGxlICYgMHgwMDAwMDAwMSkKLQkJCXsKLQkJCQl1bnNpZ25lZCBpbnQgaW5kZXggPSBoYW5kbGUgPj4gMTY7Ci0KLQkJCQlpZih2ZXJ0ZXhTaGFkZXJbaW5kZXhdKQotCQkJCXsKLQkJCQkJdmVydGV4U2hhZGVyW2luZGV4XS0+YmluZCgpOwotCQkJCX0KLQotCQkJCWlmKHZlcnRleFNoYWRlclt2ZXJ0ZXhTaGFkZXJIYW5kbGUgPj4gMTZdKQotCQkJCXsKLQkJCQkJdmVydGV4U2hhZGVyW3ZlcnRleFNoYWRlckhhbmRsZSA+PiAxNl0tPnVuYmluZCgpOwotCQkJCX0KLQotCQkJCXZlcnRleFNoYWRlckhhbmRsZSA9IGhhbmRsZTsKLQotCQkJCURpcmVjdDNEVmVydGV4U2hhZGVyOCAqc2hhZGVyID0gdmVydGV4U2hhZGVyW2luZGV4XTsKLQkJCQlyZW5kZXJlci0+c2V0VmVydGV4U2hhZGVyKHNoYWRlci0+Z2V0VmVydGV4U2hhZGVyKCkpOwotCQkJCWRlY2xhcmF0aW9uID0gc2hhZGVyLT5nZXREZWNsYXJhdGlvbigpOwotCi0JCQkJRlZGID0gMDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZW5kZXJlci0+c2V0VmVydGV4U2hhZGVyKDApOwotCQkJCWRlY2xhcmF0aW9uID0gMDsKLQotCQkJCUZWRiA9IGhhbmRsZTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXIuYmFjaygpLT5zZXRWZXJ0ZXhTaGFkZXIoaGFuZGxlKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFZlcnRleFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGxvbmcgc3RhcnRSZWdpc3RlciwgY29uc3Qgdm9pZCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBsb25nIGNvdW50KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFjb25zdGFudERhdGEpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXJlY29yZFN0YXRlKQotCQl7Ci0JCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCXsKLQkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bMF0gPSAoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgMF07Ci0JCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzFdID0gKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDFdOwotCQkJCXZlcnRleFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAyXTsKLQkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bM10gPSAoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgM107Ci0JCQl9Ci0KLQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoc3RhcnRSZWdpc3RlciwgKGNvbnN0IGZsb2F0Kiljb25zdGFudERhdGEsIGNvdW50KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXIuYmFjaygpLT5zZXRWZXJ0ZXhTaGFkZXJDb25zdGFudChzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFZpZXdwb3J0KGNvbnN0IEQzRFZJRVdQT1JUOCAqdmlld3BvcnQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXZpZXdwb3J0KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKCFyZWNvcmRTdGF0ZSkKLQkJewotCQkJdGhpcy0+dmlld3BvcnQgPSAqdmlld3BvcnQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0Vmlld3BvcnQodmlld3BvcnQpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlpbnQgRGlyZWN0M0REZXZpY2U4OjpTaG93Q3Vyc29yKGludCBzaG93KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWludCBvbGRWYWx1ZSA9IHNob3dDdXJzb3IgPyBUUlVFIDogRkFMU0U7Ci0KLQkJc2hvd0N1cnNvciA9IHNob3cgIT0gRkFMU0UgJiYgY3Vyc29yOwotCi0JCWJpbmRDdXJzb3IoKTsKLQotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlRlc3RDb29wZXJhdGl2ZUxldmVsKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpVcGRhdGVUZXh0dXJlKElEaXJlY3QzREJhc2VUZXh0dXJlOCAqc291cmNlVGV4dHVyZSwgSURpcmVjdDNEQmFzZVRleHR1cmU4ICpkZXN0aW5hdGlvblRleHR1cmUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIXNvdXJjZVRleHR1cmUgfHwgIWRlc3RpbmF0aW9uVGV4dHVyZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlEM0RSRVNPVVJDRVRZUEUgdHlwZSA9IHNvdXJjZVRleHR1cmUtPkdldFR5cGUoKTsKLQotCQlpZih0eXBlICE9IGRlc3RpbmF0aW9uVGV4dHVyZS0+R2V0VHlwZSgpKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN3aXRjaCh0eXBlKQotCQl7Ci0JCWNhc2UgRDNEUlRZUEVfVEVYVFVSRToKLQkJCXsKLQkJCQlJRGlyZWN0M0RUZXh0dXJlOCAqc291cmNlOwotCQkJCUlEaXJlY3QzRFRleHR1cmU4ICpkZXN0OwotCi0JCQkJc291cmNlVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzRFRleHR1cmU4LCAodm9pZCoqKSZzb3VyY2UpOwotCQkJCWRlc3RpbmF0aW9uVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzRFRleHR1cmU4LCAodm9pZCoqKSZkZXN0KTsKLQotCQkJCUFTU0VSVChzb3VyY2UgJiYgZGVzdCk7Ci0KLQkJCQlmb3IodW5zaWduZWQgaW50IGxldmVsID0gMDsgbGV2ZWwgPCBzb3VyY2UtPkdldExldmVsQ291bnQoKSAmJiBsZXZlbCA8IGRlc3QtPkdldExldmVsQ291bnQoKTsgbGV2ZWwrKykKLQkJCQl7Ci0JCQkJCUlEaXJlY3QzRFN1cmZhY2U4ICpzb3VyY2VTdXJmYWNlOwotCQkJCQlJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdGluYXRpb25TdXJmYWNlOwotCi0JCQkJCXNvdXJjZS0+R2V0U3VyZmFjZUxldmVsKGxldmVsLCAmc291cmNlU3VyZmFjZSk7Ci0JCQkJCWRlc3QtPkdldFN1cmZhY2VMZXZlbChsZXZlbCwgJmRlc3RpbmF0aW9uU3VyZmFjZSk7Ci0KLQkJCQkJdXBkYXRlU3VyZmFjZShzb3VyY2VTdXJmYWNlLCAwLCBkZXN0aW5hdGlvblN1cmZhY2UsIDApOwotCi0JCQkJCXNvdXJjZVN1cmZhY2UtPlJlbGVhc2UoKTsKLQkJCQkJZGVzdGluYXRpb25TdXJmYWNlLT5SZWxlYXNlKCk7Ci0JCQkJfQotCi0JCQkJc291cmNlLT5SZWxlYXNlKCk7Ci0JCQkJZGVzdC0+UmVsZWFzZSgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEUlRZUEVfVk9MVU1FVEVYVFVSRToKLQkJCXsKLQkJCQlJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCAqc291cmNlOwotCQkJCUlEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICpkZXN0OwotCi0JCQkJc291cmNlVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzRFZvbHVtZVRleHR1cmU4LCAodm9pZCoqKSZzb3VyY2UpOwotCQkJCWRlc3RpbmF0aW9uVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzRFZvbHVtZVRleHR1cmU4LCAodm9pZCoqKSZkZXN0KTsKLQotCQkJCUFTU0VSVChzb3VyY2UgJiYgZGVzdCk7Ci0KLQkJCQlmb3IodW5zaWduZWQgaW50IGxldmVsID0gMDsgbGV2ZWwgPCBzb3VyY2UtPkdldExldmVsQ291bnQoKSAmJiBsZXZlbCA8IGRlc3QtPkdldExldmVsQ291bnQoKTsgbGV2ZWwrKykgICAvLyBGSVhNRTogRmFpbCB3aGVuIHNvdXJjZSB0ZXh0dXJlIGhhcyBmZXdlciBsZXZlbHMgdGhhbiB0aGUgZGVzdGluYXRpb24KLQkJCQl7Ci0JCQkJCUlEaXJlY3QzRFZvbHVtZTggKnNvdXJjZVZvbHVtZTsKLQkJCQkJSURpcmVjdDNEVm9sdW1lOCAqZGVzdGluYXRpb25Wb2x1bWU7Ci0KLQkJCQkJc291cmNlLT5HZXRWb2x1bWVMZXZlbChsZXZlbCwgJnNvdXJjZVZvbHVtZSk7Ci0JCQkJCWRlc3QtPkdldFZvbHVtZUxldmVsKGxldmVsLCAmZGVzdGluYXRpb25Wb2x1bWUpOwotCi0JCQkJCXVwZGF0ZVZvbHVtZShzb3VyY2VWb2x1bWUsIGRlc3RpbmF0aW9uVm9sdW1lKTsKLQotCQkJCQlzb3VyY2VWb2x1bWUtPlJlbGVhc2UoKTsKLQkJCQkJZGVzdGluYXRpb25Wb2x1bWUtPlJlbGVhc2UoKTsKLQkJCQl9Ci0KLQkJCQlzb3VyY2UtPlJlbGVhc2UoKTsKLQkJCQlkZXN0LT5SZWxlYXNlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RSVFlQRV9DVUJFVEVYVFVSRToKLQkJCXsKLQkJCQlJRGlyZWN0M0RDdWJlVGV4dHVyZTggKnNvdXJjZTsKLQkJCQlJRGlyZWN0M0RDdWJlVGV4dHVyZTggKmRlc3Q7Ci0KLQkJCQlzb3VyY2VUZXh0dXJlLT5RdWVyeUludGVyZmFjZShJSURfSURpcmVjdDNEQ3ViZVRleHR1cmU4LCAodm9pZCoqKSZzb3VyY2UpOwotCQkJCWRlc3RpbmF0aW9uVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzREN1YmVUZXh0dXJlOCwgKHZvaWQqKikmZGVzdCk7Ci0KLQkJCQlBU1NFUlQoc291cmNlICYmIGRlc3QpOwotCi0JCQkJZm9yKGludCBmYWNlID0gMDsgZmFjZSA8IDY7IGZhY2UrKykKLQkJCQl7Ci0JCQkJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHNvdXJjZS0+R2V0TGV2ZWxDb3VudCgpICYmIGxldmVsIDwgZGVzdC0+R2V0TGV2ZWxDb3VudCgpOyBsZXZlbCsrKQotCQkJCQl7Ci0JCQkJCQlJRGlyZWN0M0RTdXJmYWNlOCAqc291cmNlU3VyZmFjZTsKLQkJCQkJCUlEaXJlY3QzRFN1cmZhY2U4ICpkZXN0aW5hdGlvblN1cmZhY2U7Ci0KLQkJCQkJCXNvdXJjZS0+R2V0Q3ViZU1hcFN1cmZhY2UoKEQzRENVQkVNQVBfRkFDRVMpZmFjZSwgbGV2ZWwsICZzb3VyY2VTdXJmYWNlKTsKLQkJCQkJCWRlc3QtPkdldEN1YmVNYXBTdXJmYWNlKChEM0RDVUJFTUFQX0ZBQ0VTKWZhY2UsIGxldmVsLCAmZGVzdGluYXRpb25TdXJmYWNlKTsKLQotCQkJCQkJdXBkYXRlU3VyZmFjZShzb3VyY2VTdXJmYWNlLCAwLCBkZXN0aW5hdGlvblN1cmZhY2UsIDApOwotCi0JCQkJCQlzb3VyY2VTdXJmYWNlLT5SZWxlYXNlKCk7Ci0JCQkJCQlkZXN0aW5hdGlvblN1cmZhY2UtPlJlbGVhc2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXNvdXJjZS0+UmVsZWFzZSgpOwotCQkJCWRlc3QtPlJlbGVhc2UoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQVNTRVJUKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlZhbGlkYXRlRGV2aWNlKHVuc2lnbmVkIGxvbmcgKm51bVBhc3NlcykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbnVtUGFzc2VzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpudW1QYXNzZXMgPSAxOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OnVwZGF0ZVN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTggKnNvdXJjZVN1cmZhY2UsIGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIElEaXJlY3QzRFN1cmZhY2U4ICpkZXN0aW5hdGlvblN1cmZhY2UsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQpCi0JewotCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTggKnNvdXJjZVN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTggKmRlc3RpbmF0aW9uU3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQgPSAweCUwLjhwIiwgc291cmNlU3VyZmFjZSwgc291cmNlUmVjdCwgZGVzdGluYXRpb25TdXJmYWNlLCBkZXN0UG9pbnQpOwotCi0JCWlmKCFzb3VyY2VTdXJmYWNlIHx8ICFkZXN0aW5hdGlvblN1cmZhY2UpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRDNEU1VSRkFDRV9ERVNDIHNvdXJjZURlc2NyaXB0aW9uOwotCQlEM0RTVVJGQUNFX0RFU0MgZGVzdGluYXRpb25EZXNjcmlwdGlvbjsKLQotCQlzb3VyY2VTdXJmYWNlLT5HZXREZXNjKCZzb3VyY2VEZXNjcmlwdGlvbik7Ci0JCWRlc3RpbmF0aW9uU3VyZmFjZS0+R2V0RGVzYygmZGVzdGluYXRpb25EZXNjcmlwdGlvbik7Ci0KLQkJUkVDVCBzUmVjdDsKLQkJUkVDVCBkUmVjdDsKLQotCQlpZihzb3VyY2VSZWN0ICYmIGRlc3RQb2ludCkKLQkJewotCQkJc1JlY3QubGVmdCA9IHNvdXJjZVJlY3QtPmxlZnQ7Ci0JCQlzUmVjdC50b3AgPSBzb3VyY2VSZWN0LT50b3A7Ci0JCQlzUmVjdC5yaWdodCA9IHNvdXJjZVJlY3QtPnJpZ2h0OwotCQkJc1JlY3QuYm90dG9tID0gc291cmNlUmVjdC0+Ym90dG9tOwotCi0JCQlkUmVjdC5sZWZ0ID0gZGVzdFBvaW50LT54OwotCQkJZFJlY3QudG9wID0gZGVzdFBvaW50LT55OwotCQkJZFJlY3QucmlnaHQgPSBkZXN0UG9pbnQtPnggKyBzb3VyY2VSZWN0LT5yaWdodCAtIHNvdXJjZVJlY3QtPmxlZnQ7Ci0JCQlkUmVjdC5ib3R0b20gPSBkZXN0UG9pbnQtPnkgKyBzb3VyY2VSZWN0LT5ib3R0b20gLSBzb3VyY2VSZWN0LT50b3A7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzUmVjdC5sZWZ0ID0gMDsKLQkJCXNSZWN0LnRvcCA9IDA7Ci0JCQlzUmVjdC5yaWdodCA9IHNvdXJjZURlc2NyaXB0aW9uLldpZHRoOwotCQkJc1JlY3QuYm90dG9tID0gc291cmNlRGVzY3JpcHRpb24uSGVpZ2h0OwotCi0JCQlkUmVjdC5sZWZ0ID0gMDsKLQkJCWRSZWN0LnRvcCA9IDA7Ci0JCQlkUmVjdC5yaWdodCA9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uV2lkdGg7Ci0JCQlkUmVjdC5ib3R0b20gPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLkhlaWdodDsKLQkJfQotCi0JCWludCBzV2lkdGggPSBzUmVjdC5yaWdodCAtIHNSZWN0LmxlZnQ7Ci0JCWludCBzSGVpZ2h0ID0gc1JlY3QuYm90dG9tIC0gc1JlY3QudG9wOwotCi0JCWludCBkV2lkdGggPSBkUmVjdC5yaWdodCAtIGRSZWN0LmxlZnQ7Ci0JCWludCBkSGVpZ2h0ID0gZFJlY3QuYm90dG9tIC0gZFJlY3QudG9wOwotCi0JCWlmKHNvdXJjZURlc2NyaXB0aW9uLk11bHRpU2FtcGxlVHlwZSAgICAgICE9IEQzRE1VTFRJU0FNUExFX05PTkUgfHwKLQkJICAgZGVzdGluYXRpb25EZXNjcmlwdGlvbi5NdWx0aVNhbXBsZVR5cGUgIT0gRDNETVVMVElTQU1QTEVfTk9ORSB8fAotCQkvLyBzb3VyY2VEZXNjcmlwdGlvbi5Qb29sICAgICAgIT0gRDNEUE9PTF9TWVNURU1NRU0gfHwgICAvLyBGSVhNRTogQ2hlY2sgYmFjayBidWZmZXIgYW5kIGRlcHRoIGJ1ZmZlciBtZW1vcnkgcG9vbCBmbGFncwotCQkvLyBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLlBvb2wgIT0gRDNEUE9PTF9ERUZBVUxUIHx8Ci0JCSAgIHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCAhPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLkZvcm1hdCB8fAotCQkgICBzV2lkdGggICE9IGRXaWR0aCB8fAotCQkgICBzSGVpZ2h0ICE9IGRIZWlnaHQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRDNETE9DS0VEX1JFQ1Qgc291cmNlTG9jazsKLQkJRDNETE9DS0VEX1JFQ1QgZGVzdGluYXRpb25Mb2NrOwotCi0JCXNvdXJjZVN1cmZhY2UtPkxvY2tSZWN0KCZzb3VyY2VMb2NrLCAmc1JlY3QsIEQzRExPQ0tfUkVBRE9OTFkpOwotCQlkZXN0aW5hdGlvblN1cmZhY2UtPkxvY2tSZWN0KCZkZXN0aW5hdGlvbkxvY2ssICZkUmVjdCwgMCk7Ci0KLQkJdW5zaWduZWQgaW50IHdpZHRoOwotCQl1bnNpZ25lZCBpbnQgaGVpZ2h0OwotCQl1bnNpZ25lZCBpbnQgYnl0ZXM7Ci0KLQkJc3dpdGNoKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCkKLQkJewotCQljYXNlIEQzREZNVF9EWFQxOgotCQkJd2lkdGggPSAoZFdpZHRoICsgMykgLyA0OwotCQkJaGVpZ2h0ID0gKGRIZWlnaHQgKyAzKSAvIDQ7Ci0JCQlieXRlcyA9IHdpZHRoICogODsgICAvLyA2NCBiaXQgcGVyIDR4NCBibG9jawotCQkJYnJlYWs7Ci0JCWNhc2UgRDNERk1UX0RYVDI6Ci0JCWNhc2UgRDNERk1UX0RYVDM6Ci0JCWNhc2UgRDNERk1UX0RYVDQ6Ci0JCWNhc2UgRDNERk1UX0RYVDU6Ci0JCQl3aWR0aCA9IChkV2lkdGggKyAzKSAvIDQ7Ci0JCQloZWlnaHQgPSAoZEhlaWdodCArIDMpIC8gNDsKLQkJCWJ5dGVzID0gd2lkdGggKiAxNjsgICAvLyAxMjggYml0IHBlciA0eDQgYmxvY2sKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJd2lkdGggPSBkV2lkdGg7Ci0JCQloZWlnaHQgPSBkSGVpZ2h0OwotCQkJYnl0ZXMgPSB3aWR0aCAqIERpcmVjdDNEU3VyZmFjZTg6OmJ5dGVzKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCk7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCi0JCXsKLQkJCW1lbWNweShkZXN0aW5hdGlvbkxvY2sucEJpdHMsIHNvdXJjZUxvY2sucEJpdHMsIGJ5dGVzKTsKLQotCQkJKGJ5dGUqJilzb3VyY2VMb2NrLnBCaXRzICs9IHNvdXJjZUxvY2suUGl0Y2g7Ci0JCQkoYnl0ZSomKWRlc3RpbmF0aW9uTG9jay5wQml0cyArPSBkZXN0aW5hdGlvbkxvY2suUGl0Y2g7Ci0JCX0KLQotCQlzb3VyY2VTdXJmYWNlLT5VbmxvY2tSZWN0KCk7Ci0JCWRlc3RpbmF0aW9uU3VyZmFjZS0+VW5sb2NrUmVjdCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTg6OlNldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI4ICppSW5kZXhCdWZmZXIsIHVuc2lnbmVkIGludCBiYXNlVmVydGV4SW5kZXgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJRGlyZWN0M0RJbmRleEJ1ZmZlcjggKmluZGV4QnVmZmVyID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RJbmRleEJ1ZmZlcjgqPihpSW5kZXhCdWZmZXIpOwotCi0JCWlmKCFyZWNvcmRTdGF0ZSkKLQkJewotCQkJaWYoaW5kZXhCdWZmZXIpCi0JCQl7Ci0JCQkJaW5kZXhCdWZmZXItPmJpbmQoKTsKLQkJCX0KLQotCQkJaWYodGhpcy0+aW5kZXhEYXRhKQotCQkJewotCQkJCXRoaXMtPmluZGV4RGF0YS0+dW5iaW5kKCk7Ci0JCQl9Ci0KLQkJCXRoaXMtPmluZGV4RGF0YSA9IGluZGV4QnVmZmVyOwotCQkJdGhpcy0+YmFzZVZlcnRleEluZGV4ID0gYmFzZVZlcnRleEluZGV4OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldEluZGljZXMoaW5kZXhCdWZmZXIsIGJhc2VWZXJ0ZXhJbmRleCk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWludCBEaXJlY3QzRERldmljZTg6OkZWRlN0cmlkZSh1bnNpZ25lZCBsb25nIEZWRikKLQl7Ci0JCWludCBzdHJpZGUgPSAwOwotCi0JCXN3aXRjaChGVkYgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykKLQkJewotCQljYXNlIEQzREZWRl9YWVo6CXN0cmlkZSArPSAxMjsJYnJlYWs7Ci0JCWNhc2UgRDNERlZGX1hZWlJIVzoJc3RyaWRlICs9IDE2OwlicmVhazsKLQkJY2FzZSBEM0RGVkZfWFlaQjE6CXN0cmlkZSArPSAxNjsJYnJlYWs7Ci0JCWNhc2UgRDNERlZGX1hZWkIyOglzdHJpZGUgKz0gMjA7CWJyZWFrOwotCQljYXNlIEQzREZWRl9YWVpCMzoJc3RyaWRlICs9IDI0OwlicmVhazsKLQkJY2FzZSBEM0RGVkZfWFlaQjQ6CXN0cmlkZSArPSAyODsJYnJlYWs7Ci0JCWNhc2UgRDNERlZGX1hZWkI1OglzdHJpZGUgKz0gMzI7CWJyZWFrOwotCQl9Ci0KLQkJaWYoRlZGICYgRDNERlZGX05PUk1BTCkJCXN0cmlkZSArPSAxMjsKLQkJaWYoRlZGICYgRDNERlZGX1BTSVpFKQkJc3RyaWRlICs9IDQ7Ci0JCWlmKEZWRiAmIEQzREZWRl9ESUZGVVNFKQlzdHJpZGUgKz0gNDsKLQkJaWYoRlZGICYgRDNERlZGX1NQRUNVTEFSKQlzdHJpZGUgKz0gNDsKLQotCQlzd2l0Y2goKEZWRiAmIEQzREZWRl9URVhDT1VOVF9NQVNLKSA+PiBEM0RGVkZfVEVYQ09VTlRfU0hJRlQpCi0JCXsKLQkJY2FzZSA4OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDMwKSkgJSA0KTsKLQkJY2FzZSA3OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI4KSkgJSA0KTsKLQkJY2FzZSA2OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI2KSkgJSA0KTsKLQkJY2FzZSA1OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI0KSkgJSA0KTsKLQkJY2FzZSA0OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDIyKSkgJSA0KTsKLQkJY2FzZSAzOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDIwKSkgJSA0KTsKLQkJY2FzZSAyOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDE4KSkgJSA0KTsKLQkJY2FzZSAxOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDE2KSkgJSA0KTsKLQkJY2FzZSAwOiBicmVhazsKLQkJZGVmYXVsdDoKLQkJCUFTU0VSVChmYWxzZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyaWRlOwotCX0KLQotCWludCBEaXJlY3QzRERldmljZTg6OnR5cGVTdHJpZGUodW5zaWduZWQgY2hhciB0eXBlKQotCXsKLQkJc3RhdGljIGNvbnN0IGludCBMVVRbXSA9Ci0JCXsKLQkJCTQsCS8vIEQzRERFQ0xUWVBFX0ZMT0FUMSAgICA9ICAwLCAgLy8gMUQgZmxvYXQgZXhwYW5kZWQgdG8gKHZhbHVlLCAwLiwgMC4sIDEuKQotCQkJOCwJLy8gRDNEREVDTFRZUEVfRkxPQVQyICAgID0gIDEsICAvLyAyRCBmbG9hdCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCAwLiwgMS4pCi0JCQkxMiwJLy8gRDNEREVDTFRZUEVfRkxPQVQzICAgID0gIDIsICAvLyAzRCBmbG9hdCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCB2YWx1ZSwgMS4pCi0JCQkxNiwJLy8gRDNEREVDTFRZUEVfRkxPQVQ0ICAgID0gIDMsICAvLyA0RCBmbG9hdAotCQkJNCwJLy8gRDNEREVDTFRZUEVfRDNEQ09MT1IgID0gIDQsICAvLyA0RCBwYWNrZWQgdW5zaWduZWQgYnl0ZXMgbWFwcGVkIHRvIDAuIHRvIDEuIHJhbmdlLiBJbnB1dCBpcyBpbiBEM0RDT0xPUiBmb3JtYXQgKEFSR0IpIGV4cGFuZGVkIHRvIChSLCBHLCBCLCBBKQotCQkJNCwJLy8gRDNEREVDTFRZUEVfVUJZVEU0ICAgID0gIDUsICAvLyA0RCB1bnNpZ25lZCBieXRlCi0JCQk0LAkvLyBEM0RERUNMVFlQRV9TSE9SVDIgICAgPSAgNiwgIC8vIDJEIHNpZ25lZCBzaG9ydCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCAwLiwgMS4pCi0JCQk4IAkvLyBEM0RERUNMVFlQRV9TSE9SVDQgICAgPSAgNywgIC8vIDREIHNpZ25lZCBzaG9ydAotCQl9OwotCi0JCWlmKHR5cGUgPD0gNykKLQkJewotCQkJcmV0dXJuIExVVFt0eXBlXTsKLQkJfQotCQllbHNlIEFTU0VSVChmYWxzZSk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JYm9vbCBEaXJlY3QzRERldmljZTg6OmJpbmREYXRhKERpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleEJ1ZmZlciwgaW50IGJhc2UpCi0JewotCQlpZighYmluZFZpZXdwb3J0KCkpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsgICAvLyBaZXJvLWFyZWEgdGFyZ2V0IHJlZ2lvbgotCQl9Ci0KLQkJYmluZFRleHR1cmVzKCk7Ci0JCWJpbmRTdHJlYW1zKGJhc2UpOwotCQliaW5kSW5kZXhCdWZmZXIoaW5kZXhCdWZmZXIpOwotCQliaW5kTGlnaHRzKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRERldmljZTg6OmJpbmRTdHJlYW1zKGludCBiYXNlKQotCXsKLQkJcmVuZGVyZXItPnJlc2V0SW5wdXRTdHJlYW1zKChGVkYgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykgPT0gRDNERlZGX1hZWlJIVyk7Ci0KLQkJaW50IHN0cmlkZTsKLQotCQlpZighZGVjbGFyYXRpb24pICAgLy8gRml4ZWQtZnVuY3Rpb24gdmVydGV4IHBpcGVsaW5lCi0JCXsKLQkJCWNvbnN0IHZvaWQgKmJ1ZmZlciA9IDA7Ci0KLQkJCUFTU0VSVChkYXRhU3RyZWFtWzBdKTsKLQotCQkJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICpzdHJlYW0gPSBkYXRhU3RyZWFtWzBdOwotCQkJc3c6OlJlc291cmNlICpyZXNvdXJjZSA9IHN0cmVhbS0+Z2V0UmVzb3VyY2UoKTsKLQkJCWJ1ZmZlciA9IChjaGFyKilyZXNvdXJjZS0+ZGF0YSgpOwotCQkJc3RyaWRlID0gRlZGU3RyaWRlKEZWRik7Ci0KLQkJCUFTU0VSVChzdHJpZGUgPT0gc3RyZWFtU3RyaWRlWzBdKTsgICAvLyBGSVhNRQotCQkJQVNTRVJUKGJ1ZmZlciAmJiBzdHJpZGUpOwotCi0JCQkoY2hhciomKWJ1ZmZlciArPSBzdHJpZGUgKiBiYXNlOwotCi0JCQlzdzo6U3RyZWFtIGF0dHJpYnV0ZShyZXNvdXJjZSwgYnVmZmVyLCBzdHJpZGUpOwotCi0JCQlzd2l0Y2goRlZGICYgRDNERlZGX1BPU0lUSU9OX01BU0spCi0JCQl7Ci0JCQljYXNlIEQzREZWRl9YWVo6Ci0JCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvbiwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7Ci0JCQkJKGNoYXIqJilidWZmZXIgKz0gMTI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzREZWRl9YWVpSSFc6Ci0JCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvblQsIGF0dHJpYnV0ZS5kZWZpbmUoYnVmZmVyLCBzdzo6U1RSRUFNVFlQRV9GTE9BVCwgNCkpOwotCQkJCShjaGFyKiYpYnVmZmVyICs9IDE2OwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RGVkZfWFlaQjE6Ci0JCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvbiwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7Ci0JCQkJKGNoYXIqJilidWZmZXIgKz0gMTI7Ci0KLQkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kV2VpZ2h0LCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEpKTsgICAvLyBGSVhNRTogU3RyZWFtIHR5cGUgZGVwZW5kcyBvbiBpbmRleGVkIGJsZW5kaW5nIGFjdGl2ZT8KLQkJCQkoY2hhciomKWJ1ZmZlciArPSA0OwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RGVkZfWFlaQjI6Ci0JCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvbiwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7Ci0JCQkJKGNoYXIqJilidWZmZXIgKz0gMTI7Ci0KLQkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kV2VpZ2h0LCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEpKTsgICAvLyBGSVhNRTogU3RyZWFtIHR5cGUgZGVwZW5kcyBvbiBpbmRleGVkIGJsZW5kaW5nIGFjdGl2ZT8KLQkJCQkoY2hhciomKWJ1ZmZlciArPSA4OwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RGVkZfWFlaQjM6Ci0JCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvbiwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7Ci0JCQkJKGNoYXIqJilidWZmZXIgKz0gMTI7Ci0KLQkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kV2VpZ2h0LCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDIpKTsgICAvLyBGSVhNRTogU3RyZWFtIHR5cGUgZGVwZW5kcyBvbiBpbmRleGVkIGJsZW5kaW5nIGFjdGl2ZT8KLQkJCQkoY2hhciomKWJ1ZmZlciArPSAxMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNERlZGX1hZWkI0OgotCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6UG9zaXRpb24sIGF0dHJpYnV0ZS5kZWZpbmUoYnVmZmVyLCBzdzo6U1RSRUFNVFlQRV9GTE9BVCwgMykpOwotCQkJCShjaGFyKiYpYnVmZmVyICs9IDEyOwotCi0JCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpCbGVuZFdlaWdodCwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7ICAgLy8gRklYTUU6IFN0cmVhbSB0eXBlIGRlcGVuZHMgb24gaW5kZXhlZCBibGVuZGluZyBhY3RpdmU/Ci0JCQkJKGNoYXIqJilidWZmZXIgKz0gMTY7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzREZWRl9YWVpCNToKLQkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlBvc2l0aW9uLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDMpKTsKLQkJCQkoY2hhciomKWJ1ZmZlciArPSAxMjsKLQotCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6QmxlbmRXZWlnaHQsIGF0dHJpYnV0ZS5kZWZpbmUoYnVmZmVyLCBzdzo6U1RSRUFNVFlQRV9GTE9BVCwgNCkpOyAgIC8vIEZJWE1FOiBTdHJlYW0gdHlwZSBkZXBlbmRzIG9uIGluZGV4ZWQgYmxlbmRpbmcgYWN0aXZlPwotCQkJCShjaGFyKiYpYnVmZmVyICs9IDIwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZihGVkYgJiBEM0RGVkZfTEFTVEJFVEFfVUJZVEU0KQotCQkJewotCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6QmxlbmRJbmRpY2VzLCBhdHRyaWJ1dGUuZGVmaW5lKChjaGFyKiYpYnVmZmVyIC0gNCwgc3c6OlNUUkVBTVRZUEVfSU5ESUNFUywgMSkpOwotCQkJfQotCi0JCQlpZihGVkYgJiBEM0RGVkZfTk9STUFMKQotCQkJewotCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6Tm9ybWFsLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDMpKTsKLQkJCQkoY2hhciomKWJ1ZmZlciArPSAxMjsKLQkJCX0KLQotCQkJaWYoRlZGICYgRDNERlZGX1BTSVpFKQotCQkJewotCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6UG9pbnRTaXplLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEpKTsKLQkJCQkoY2hhciomKWJ1ZmZlciArPSA0OwotCQkJfQotCi0JCQlpZihGVkYgJiBEM0RGVkZfRElGRlVTRSkKLQkJCXsKLQkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkNvbG9yMCwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0NPTE9SLCA0KSk7Ci0JCQkJKGNoYXIqJilidWZmZXIgKz0gNDsKLQkJCX0KLQotCQkJaWYoRlZGICYgRDNERlZGX1NQRUNVTEFSKQotCQkJewotCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6Q29sb3IxLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfQ09MT1IsIDQpKTsKLQkJCQkoY2hhciomKWJ1ZmZlciArPSA0OwotCQkJfQotCi0JCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgODsgaSsrKQotCQkJewotCQkJCWlmKChGVkYgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgPj4gRDNERlZGX1RFWENPVU5UX1NISUZUID49IGkgKyAxKQotCQkJCXsKLQkJCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpUZXhDb29yZDAgKyBpLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEgKyAoMSArIChGVkYgPj4gKDE2ICsgaSAqIDIpKSkgJSA0KSk7Ci0JCQkJCShjaGFyKiYpYnVmZmVyICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAoMTYgKyBpICogMikpKSAlIDQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmVsZW1lbnQgPSBkZWNsYXJhdGlvbjsKLQkJCWludCBzdHJlYW0gPSAwOwotCQkJc3c6OlJlc291cmNlICpyZXNvdXJjZTsKLQkJCWNvbnN0IHZvaWQgKmJ1ZmZlciA9IDA7Ci0KLQkJCXdoaWxlKCplbGVtZW50ICE9IDB4RkZGRkZGRkYpCi0JCQl7Ci0JCQkJc3dpdGNoKCgqZWxlbWVudCAmIDB4RTAwMDAwMDApID4+IDI5KQotCQkJCXsKLQkJCQljYXNlIDA6ICAgLy8gTk9QCi0JCQkJCWlmKCplbGVtZW50ICE9IDB4MDAwMDAwMDApCi0JCQkJCXsKLQkJCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOiAgIC8vIFN0cmVhbSBzZWxlY3RvcgotCQkJCQlzdHJlYW0gPSAqZWxlbWVudCAmIDB4MDAwMDAwMEY7Ci0JCQkJCXsKLQkJCQkJCUFTU0VSVChkYXRhU3RyZWFtW3N0cmVhbV0pOyAgIC8vIEV4cGVjdGVkIGEgc3RyZWFtCi0KLQkJCQkJCURpcmVjdDNEVmVydGV4QnVmZmVyOCAqc3RyZWFtQnVmZmVyID0gKERpcmVjdDNEVmVydGV4QnVmZmVyOCopZGF0YVN0cmVhbVtzdHJlYW1dOwotCQkJCQkJcmVzb3VyY2UgPSBzdHJlYW1CdWZmZXItPmdldFJlc291cmNlKCk7Ci0JCQkJCQlidWZmZXIgPSAoY2hhciopcmVzb3VyY2UtPmRhdGEoKTsKLQotCQkJCQkJY29uc3QgdW5zaWduZWQgbG9uZyAqc3RyZWFtRWxlbWVudCA9IGVsZW1lbnQgKyAxOwotCQkJCQkJc3RyaWRlID0gMDsKLQotCQkJCQkJd2hpbGUoKCpzdHJlYW1FbGVtZW50ICYgMHhFMDAwMDAwMCkgPj4gMjkgPT0gMikgICAvLyBEYXRhIGRlZmluaXRpb24KLQkJCQkJCXsKLQkJCQkJCQlpZigqc3RyZWFtRWxlbWVudCAmIDB4MTAwMDAwMDApICAgLy8gRGF0YSBza2lwCi0JCQkJCQkJewotCQkJCQkJCQlpbnQgc2tpcCA9ICgqc3RyZWFtRWxlbWVudCAmIDB4MDAwRjAwMDApID4+IDE2OwotCi0JCQkJCQkJCXN0cmlkZSArPSA0ICogc2tpcDsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJc3RyaWRlICs9IHR5cGVTdHJpZGUoKHVuc2lnbmVkIGNoYXIpKCgqc3RyZWFtRWxlbWVudCAmIDB4MDAwRjAwMDApID4+IDE2KSk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJc3RyZWFtRWxlbWVudCsrOwotCQkJCQkJfQotCi0JCQkJCS8vCUFTU0VSVChzdHJpZGUgPT0gc3RyZWFtU3RyaWRlW3N0cmVhbV0pOyAgIC8vIEZJWE1FOiBQcm9iYWJseSBqdXN0IGlnbm9yZQotCi0JCQkJCQkoY2hhciomKWJ1ZmZlciArPSBzdHJpZGUgKiBiYXNlOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjogICAvLyBEYXRhIGRlZmluaXRpb24KLQkJCQkJaWYoKmVsZW1lbnQgJiAweDEwMDAwMDAwKSAgIC8vIERhdGEgc2tpcAotCQkJCQl7Ci0JCQkJCQlpbnQgc2tpcCA9ICgqZWxlbWVudCAmIDB4MDAwRjAwMDApID4+IDE2OwotCi0JCQkJCQkoY2hhciomKWJ1ZmZlciArPSA0ICogc2tpcDsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWludCB0eXBlID0gKCplbGVtZW50ICYgMHgwMDBGMDAwMCkgPj4gMTY7Ci0JCQkJCQlpbnQgaW5kZXggPSAoKmVsZW1lbnQgJiAweDAwMDAwMDBGKSA+PiAwOwotCi0JCQkJCQlzdzo6U3RyZWFtIGF0dHJpYnV0ZShyZXNvdXJjZSwgYnVmZmVyLCBzdHJpZGUpOwotCi0JCQkJCQlzd2l0Y2godHlwZSkKLQkJCQkJCXsKLQkJCQkJCWNhc2UgRDNEVlNEVF9GTE9BVDE6ICAgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9GTE9BVCwgMSk7IGJyZWFrOwotCQkJCQkJY2FzZSBEM0RWU0RUX0ZMT0FUMjogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAyKTsgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTRFRfRkxPQVQzOiAgIGF0dHJpYnV0ZS5kZWZpbmUoc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDMpOyBicmVhazsKLQkJCQkJCWNhc2UgRDNEVlNEVF9GTE9BVDQ6ICAgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9GTE9BVCwgNCk7IGJyZWFrOwotCQkJCQkJY2FzZSBEM0RWU0RUX0QzRENPTE9SOiBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0NPTE9SLCA0KTsgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTRFRfVUJZVEU0OiAgIGF0dHJpYnV0ZS5kZWZpbmUoc3c6OlNUUkVBTVRZUEVfQllURSwgNCk7ICBicmVhazsKLQkJCQkJCWNhc2UgRDNEVlNEVF9TSE9SVDI6ICAgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9TSE9SVCwgMik7IGJyZWFrOwotCQkJCQkJY2FzZSBEM0RWU0RUX1NIT1JUNDogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCA0KTsgYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OiAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5kZWZpbmUoc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDApOyBBU1NFUlQoZmFsc2UpOwotCQkJCQkJfQotCi0JCQkJCQlzd2l0Y2goaW5kZXgpCi0JCQkJCQl7Ci0JCQkJCQljYXNlIEQzRFZTREVfUE9TSVRJT046ICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlBvc2l0aW9uLCBhdHRyaWJ1dGUpOyAgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfQkxFTkRXRUlHSFQ6ICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kV2VpZ2h0LCBhdHRyaWJ1dGUpOyAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfQkxFTkRJTkRJQ0VTOiByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kSW5kaWNlcywgYXR0cmlidXRlKTsgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfTk9STUFMOiAgICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6Ok5vcm1hbCwgYXR0cmlidXRlKTsgICAgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfUFNJWkU6ICAgICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlBvaW50U2l6ZSwgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfRElGRlVTRTogICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkNvbG9yMCwgYXR0cmlidXRlKTsgICAgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfU1BFQ1VMQVI6ICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkNvbG9yMSwgYXR0cmlidXRlKTsgICAgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQwOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkMCwgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQxOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkMSwgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQyOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkMiwgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQzOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkMywgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQ0OiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkNCwgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQ1OiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkNSwgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQ2OiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkNiwgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQ3OiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkNywgYXR0cmlidXRlKTsgICAgYnJlYWs7Ci0JCQkJCS8vCWNhc2UgRDNEVlNERV9QT1NJVElPTjI6ICAgIHJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6UG9zaXRpb24xLCBhdHRyaWJ1dGUpOyAgICBicmVhazsKLQkJCQkJLy8JY2FzZSBEM0RWU0RFX05PUk1BTDI6ICAgICAgcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpOb3JtYWwxLCBhdHRyaWJ1dGUpOyAgICAgIGJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCQkJfQotCi0JCQkJCQkoY2hhciomKWJ1ZmZlciArPSB0eXBlU3RyaWRlKHR5cGUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzogICAvLyBUZXNzZWxhdG9yIGRhdGEKLQkJCQkJVU5JTVBMRU1FTlRFRCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6ICAgLy8gQ29uc3RhbnQgZGF0YQotCQkJCQl7Ci0JCQkJCQlpbnQgY291bnQgPSAoKmVsZW1lbnQgJiAweDFFMDAwMDAwKSA+PiAyNTsKLQkJCQkJCWludCBpbmRleCA9ICgqZWxlbWVudCAmIDB4MDAwMDAwN0YpID4+IDA7Ci0KLQkJCQkJCVNldFZlcnRleFNoYWRlckNvbnN0YW50KGluZGV4LCBlbGVtZW50ICsgMSwgY291bnQpOwotCi0JCQkJCQllbGVtZW50ICs9IDQgKiBjb3VudDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIDU6ICAgLy8gRXh0ZW5zaW9uCi0JCQkJCVVOSU1QTEVNRU5URUQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQllbGVtZW50Kys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlODo6YmluZEluZGV4QnVmZmVyKERpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleEJ1ZmZlcikKLQl7Ci0JCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2UgPSAwOwotCi0JCWlmKGluZGV4QnVmZmVyKQotCQl7Ci0JCQlyZXNvdXJjZSA9IGluZGV4QnVmZmVyLT5nZXRSZXNvdXJjZSgpOwotCQl9Ci0KLQkJcmVuZGVyZXItPnNldEluZGV4QnVmZmVyKHJlc291cmNlKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlODo6YmluZExpZ2h0cygpCi0JewotCQlpZighbGlnaHRzRGlydHkpIHJldHVybjsKLQotCQlMaWdodHM6Oml0ZXJhdG9yIGkgPSBsaWdodC5iZWdpbigpOwotCQlpbnQgYWN0aXZlID0gMDsKLQotCQkvLyBTZXQgYW5kIGVuYWJsZSByZW5kZXJlciBsaWdodHMKLQkJd2hpbGUoYWN0aXZlIDwgOCkKLQkJewotCQkJd2hpbGUoaSAhPSBsaWdodC5lbmQoKSAmJiAhaS0+c2Vjb25kLmVuYWJsZSkKLQkJCXsKLQkJCQlpKys7Ci0JCQl9Ci0KLQkJCWlmKGkgPT0gbGlnaHQuZW5kKCkpCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNvbnN0IExpZ2h0ICZsID0gaS0+c2Vjb25kOwotCi0JCQlzdzo6UG9pbnQgcG9zaXRpb24obC5Qb3NpdGlvbi54LCBsLlBvc2l0aW9uLnksIGwuUG9zaXRpb24ueik7Ci0JCQlzdzo6Q29sb3I8ZmxvYXQ+IGRpZmZ1c2UobC5EaWZmdXNlLnIsIGwuRGlmZnVzZS5nLCBsLkRpZmZ1c2UuYiwgbC5EaWZmdXNlLmEpOwotCQkJc3c6OkNvbG9yPGZsb2F0PiBzcGVjdWxhcihsLlNwZWN1bGFyLnIsIGwuU3BlY3VsYXIuZywgbC5TcGVjdWxhci5iLCBsLlNwZWN1bGFyLmEpOwotCQkJc3c6OkNvbG9yPGZsb2F0PiBhbWJpZW50KGwuQW1iaWVudC5yLCBsLkFtYmllbnQuZywgbC5BbWJpZW50LmIsIGwuQW1iaWVudC5hKTsKLQkJCXN3OjpWZWN0b3IgZGlyZWN0aW9uKGwuRGlyZWN0aW9uLngsIGwuRGlyZWN0aW9uLnksIGwuRGlyZWN0aW9uLnopOwotCi0JCQlyZW5kZXJlci0+c2V0TGlnaHREaWZmdXNlKGFjdGl2ZSwgZGlmZnVzZSk7Ci0JCQlyZW5kZXJlci0+c2V0TGlnaHRTcGVjdWxhcihhY3RpdmUsIHNwZWN1bGFyKTsKLQkJCXJlbmRlcmVyLT5zZXRMaWdodEFtYmllbnQoYWN0aXZlLCBhbWJpZW50KTsKLQotCQkJaWYobC5UeXBlID09IEQzRExJR0hUX0RJUkVDVElPTkFMKQotCQkJewotCQkJLy8JZ290byBuZXh0OyAgIC8vIEZJWE1FCi0KLQkJCQkvLyBGSVhNRTogVW5zdXBwb3J0ZWQsIG1ha2UgaXQgYSBwb3NpdGlvbmFsIGxpZ2h0IGZhciBhd2F5IHdpdGhvdXQgZmFsbG9mZgotCQkJCXJlbmRlcmVyLT5zZXRMaWdodFBvc2l0aW9uKGFjdGl2ZSwgLTEwMDAgKiBkaXJlY3Rpb24pOwotCQkJCXJlbmRlcmVyLT5zZXRMaWdodFJhbmdlKGFjdGl2ZSwgbC5SYW5nZSk7Ci0JCQkJcmVuZGVyZXItPnNldExpZ2h0QXR0ZW51YXRpb24oYWN0aXZlLCAxLCAwLCAwKTsKLQkJCX0KLQkJCWVsc2UgaWYobC5UeXBlID09IEQzRExJR0hUX1NQT1QpCi0JCQl7Ci0JCQkvLwlnb3RvIG5leHQ7ICAgLy8gRklYTUUKLQotCQkJCS8vIEZJWE1FOiBVbnN1cHBvcnRlZCwgbWFrZSBpdCBhIHBvc2l0aW9uYWwgbGlnaHQKLQkJCQlyZW5kZXJlci0+c2V0TGlnaHRQb3NpdGlvbihhY3RpdmUsIHBvc2l0aW9uKTsKLQkJCQlyZW5kZXJlci0+c2V0TGlnaHRSYW5nZShhY3RpdmUsIGwuUmFuZ2UpOwotCQkJCXJlbmRlcmVyLT5zZXRMaWdodEF0dGVudWF0aW9uKGFjdGl2ZSwgbC5BdHRlbnVhdGlvbjAsIGwuQXR0ZW51YXRpb24xLCBsLkF0dGVudWF0aW9uMik7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmVuZGVyZXItPnNldExpZ2h0UG9zaXRpb24oYWN0aXZlLCBwb3NpdGlvbik7Ci0JCQkJcmVuZGVyZXItPnNldExpZ2h0UmFuZ2UoYWN0aXZlLCBsLlJhbmdlKTsKLQkJCQlyZW5kZXJlci0+c2V0TGlnaHRBdHRlbnVhdGlvbihhY3RpdmUsIGwuQXR0ZW51YXRpb24wLCBsLkF0dGVudWF0aW9uMSwgbC5BdHRlbnVhdGlvbjIpOwotCQkJfQotCi0JCQlyZW5kZXJlci0+c2V0TGlnaHRFbmFibGUoYWN0aXZlLCB0cnVlKTsKLQotCQkJYWN0aXZlKys7Ci0KLQkvLwluZXh0OiAgIC8vIEZJWE1FCi0JCQlpKys7Ci0JCX0KLQotCQkvLyBSZW1haW5pbmcgbGlnaHRzIGFyZSBkaXNhYmxlZAotCQl3aGlsZShhY3RpdmUgPCA4KQotCQl7Ci0JCQlyZW5kZXJlci0+c2V0TGlnaHRFbmFibGUoYWN0aXZlLCBmYWxzZSk7Ci0KLQkJCWFjdGl2ZSsrOwotCQl9Ci0KLQkJbGlnaHRzRGlydHk9IGZhbHNlOwotCX0KLQotCWJvb2wgRGlyZWN0M0REZXZpY2U4OjpiaW5kVmlld3BvcnQoKQotCXsKLQkJaWYodmlld3BvcnQuV2lkdGggPT0gMCB8fCB2aWV3cG9ydC5IZWlnaHQgPT0gMCkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc3c6OlZpZXdwb3J0IHZpZXc7Ci0JCXZpZXcueDAgPSAoZmxvYXQpdmlld3BvcnQuWDsKLQkJdmlldy55MCA9IChmbG9hdCl2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0OwotCQl2aWV3LndpZHRoID0gKGZsb2F0KXZpZXdwb3J0LldpZHRoOwotCQl2aWV3LmhlaWdodCA9IC0oZmxvYXQpdmlld3BvcnQuSGVpZ2h0OwotCQl2aWV3Lm1pblogPSB2aWV3cG9ydC5NaW5aOwotCQl2aWV3Lm1heFogPSB2aWV3cG9ydC5NYXhaOwotCi0JCXJlbmRlcmVyLT5zZXRWaWV3cG9ydCh2aWV3KTsKLQotCQlzdzo6UmVjdCBzY2lzc29yOwotCQlzY2lzc29yLngwID0gdmlld3BvcnQuWDsKLQkJc2Npc3Nvci54MSA9IHZpZXdwb3J0LlggKyB2aWV3cG9ydC5XaWR0aDsKLQkJc2Npc3Nvci55MCA9IHZpZXdwb3J0Llk7Ci0JCXNjaXNzb3IueTEgPSB2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0OwotCi0JCXJlbmRlcmVyLT5zZXRTY2lzc29yKHNjaXNzb3IpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U4OjpiaW5kVGV4dHVyZXMoKQotCXsKLQkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKLQkJewotCQkJRGlyZWN0M0RCYXNlVGV4dHVyZTggKmJhc2VUZXh0dXJlID0gdGV4dHVyZVtzdGFnZV07Ci0JCQlzdzo6UmVzb3VyY2UgKnJlc291cmNlID0gMDsKLQotCQkJYm9vbCB0ZXh0dXJlVXNlZCA9IGZhbHNlOwotCi0JCQlpZihwaXhlbFNoYWRlcltwaXhlbFNoYWRlckhhbmRsZV0pCi0JCQl7Ci0JCQkJdGV4dHVyZVVzZWQgPSBwaXhlbFNoYWRlcltwaXhlbFNoYWRlckhhbmRsZV0tPmdldFBpeGVsU2hhZGVyKCktPnVzZXNTYW1wbGVyKHN0YWdlKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl0ZXh0dXJlVXNlZCA9IHRydWU7ICAgLy8gRklYTUU6IENoZWNrIGZpeGVkLWZ1bmN0aW9uIHVzZT8KLQkJCX0KLQotCQkJaWYoYmFzZVRleHR1cmUgJiYgdGV4dHVyZVVzZWQpCi0JCQl7Ci0JCQkJcmVzb3VyY2UgPSBiYXNlVGV4dHVyZS0+Z2V0UmVzb3VyY2UoKTsKLQkJCX0KLQotCQkJcmVuZGVyZXItPnNldFRleHR1cmVSZXNvdXJjZShzdGFnZSwgcmVzb3VyY2UpOwotCi0JCQlpZihiYXNlVGV4dHVyZSAmJiB0ZXh0dXJlVXNlZCkKLQkJCXsKLQkJCQlpbnQgbGV2ZWxDb3VudCA9IGJhc2VUZXh0dXJlLT5nZXRJbnRlcm5hbExldmVsQ291bnQoKTsKLQotCQkJCWludCB0ZXh0dXJlTE9EID0gYmFzZVRleHR1cmUtPkdldExPRCgpOwotCQkJCWludCBzdGFnZUxPRCA9IHRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVtEM0RUU1NfTUFYTUlQTEVWRUxdOwotCQkJCWludCBMT0QgPSB0ZXh0dXJlTE9EID4gc3RhZ2VMT0QgPyB0ZXh0dXJlTE9EIDogc3RhZ2VMT0Q7Ci0KLQkJCQlpZih0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bRDNEVFNTX01JUEZJTFRFUl0gPT0gRDNEVEVYRl9OT05FKQotCQkJCXsKLQkJCQkJTE9EID0gMDsKLQkJCQl9Ci0KLQkJCQlzd2l0Y2goYmFzZVRleHR1cmUtPkdldFR5cGUoKSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RSVFlQRV9URVhUVVJFOgotCQkJCQl7Ci0JCQkJCQlEaXJlY3QzRFRleHR1cmU4ICp0ZXh0dXJlID0gZHluYW1pY19jYXN0PERpcmVjdDNEVGV4dHVyZTgqPihiYXNlVGV4dHVyZSk7Ci0JCQkJCQlEaXJlY3QzRFN1cmZhY2U4ICpzdXJmYWNlOwotCi0JCQkJCQlmb3IoaW50IG1pcG1hcExldmVsID0gMDsgbWlwbWFwTGV2ZWwgPCBzdzo6TUlQTUFQX0xFVkVMUzsgbWlwbWFwTGV2ZWwrKykKLQkJCQkJCXsKLQkJCQkJCQlpbnQgc3VyZmFjZUxldmVsID0gbWlwbWFwTGV2ZWw7Ci0KLQkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCBMT0QpCi0JCQkJCQkJewotCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBMT0Q7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYoc3VyZmFjZUxldmVsIDwgMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1cmZhY2VMZXZlbCA9IDA7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYoc3VyZmFjZUxldmVsID49IGxldmVsQ291bnQpCi0JCQkJCQkJewotCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBsZXZlbENvdW50IC0gMTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlzdXJmYWNlID0gdGV4dHVyZS0+Z2V0SW50ZXJuYWxTdXJmYWNlTGV2ZWwoc3VyZmFjZUxldmVsKTsKLQkJCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUxldmVsKHN0YWdlLCAwLCBtaXBtYXBMZXZlbCwgc3VyZmFjZSwgc3c6OlRFWFRVUkVfMkQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEUlRZUEVfQ1VCRVRFWFRVUkU6Ci0JCQkJCWZvcihpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspCi0JCQkJCXsKLQkJCQkJCURpcmVjdDNEQ3ViZVRleHR1cmU4ICpjdWJlVGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzREN1YmVUZXh0dXJlOCo+KGJhc2VUZXh0dXJlKTsKLQkJCQkJCURpcmVjdDNEU3VyZmFjZTggKnN1cmZhY2U7Ci0KLQkJCQkJCWZvcihpbnQgbWlwbWFwTGV2ZWwgPSAwOyBtaXBtYXBMZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBtaXBtYXBMZXZlbCsrKQotCQkJCQkJewotCQkJCQkJCWludCBzdXJmYWNlTGV2ZWwgPSBtaXBtYXBMZXZlbDsKLQotCQkJCQkJCWlmKHN1cmZhY2VMZXZlbCA8IExPRCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1cmZhY2VMZXZlbCA9IExPRDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCAwKQotCQkJCQkJCXsKLQkJCQkJCQkJc3VyZmFjZUxldmVsID0gMDsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZihzdXJmYWNlTGV2ZWwgPj0gbGV2ZWxDb3VudCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1cmZhY2VMZXZlbCA9IGxldmVsQ291bnQgLSAxOwotCQkJCQkJCX0KLQotCQkJCQkJCXN1cmZhY2UgPSBjdWJlVGV4dHVyZS0+Z2V0SW50ZXJuYWxDdWJlTWFwU3VyZmFjZSgoRDNEQ1VCRU1BUF9GQUNFUylmYWNlLCBzdXJmYWNlTGV2ZWwpOwotCQkJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTGV2ZWwoc3RhZ2UsIGZhY2UsIG1pcG1hcExldmVsLCBzdXJmYWNlLCBzdzo6VEVYVFVSRV9DVUJFKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkU6Ci0JCQkJCXsKLQkJCQkJCURpcmVjdDNEVm9sdW1lVGV4dHVyZTggKnZvbHVtZVRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RWb2x1bWVUZXh0dXJlOCo+KGJhc2VUZXh0dXJlKTsKLQkJCQkJCURpcmVjdDNEVm9sdW1lOCAqdm9sdW1lOwotCi0JCQkJCQlmb3IoaW50IG1pcG1hcExldmVsID0gMDsgbWlwbWFwTGV2ZWwgPCBzdzo6TUlQTUFQX0xFVkVMUzsgbWlwbWFwTGV2ZWwrKykKLQkJCQkJCXsKLQkJCQkJCQlpbnQgc3VyZmFjZUxldmVsID0gbWlwbWFwTGV2ZWw7Ci0KLQkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCBMT0QpCi0JCQkJCQkJewotCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBMT0Q7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYoc3VyZmFjZUxldmVsIDwgMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1cmZhY2VMZXZlbCA9IDA7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYoc3VyZmFjZUxldmVsID49IGxldmVsQ291bnQpCi0JCQkJCQkJewotCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBsZXZlbENvdW50IC0gMTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQl2b2x1bWUgPSB2b2x1bWVUZXh0dXJlLT5nZXRJbnRlcm5hbFZvbHVtZUxldmVsKHN1cmZhY2VMZXZlbCk7Ci0JCQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVMZXZlbChzdGFnZSwgMCwgbWlwbWFwTGV2ZWwsIHZvbHVtZSwgc3c6OlRFWFRVUkVfM0QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCVVOSU1QTEVNRU5URUQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVMZXZlbChzdGFnZSwgMCwgMCwgMCwgc3c6OlRFWFRVUkVfTlVMTCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlODo6YmluZEN1cnNvcigpCi0JewotCQlpZihzaG93Q3Vyc29yKQotCQl7Ci0JCQlzdzo6RnJhbWVCdWZmZXI6OnNldEN1cnNvckltYWdlKGN1cnNvcik7Ci0KLQkJCUhDVVJTT1Igb2xkQ3Vyc29yID0gU2V0Q3Vyc29yKG51bGxDdXJzb3IpOwotCi0JCQlpZihvbGRDdXJzb3IgIT0gbnVsbEN1cnNvcikKLQkJCXsKLQkJCQl3aW4zMkN1cnNvciA9IG9sZEN1cnNvcjsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXN3OjpGcmFtZUJ1ZmZlcjo6c2V0Q3Vyc29ySW1hZ2UoMCk7Ci0KLQkJCWlmKEdldEN1cnNvcigpID09IG51bGxDdXJzb3IpCi0JCQl7Ci0JCQkJU2V0Q3Vyc29yKHdpbjMyQ3Vyc29yKTsKLQkJCX0KLQkJfQotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U4Ojp1cGRhdGVWb2x1bWUoSURpcmVjdDNEVm9sdW1lOCAqc291cmNlVm9sdW1lLCBJRGlyZWN0M0RWb2x1bWU4ICpkZXN0aW5hdGlvblZvbHVtZSkKLQl7Ci0JCVRSQUNFKCJJRGlyZWN0M0RWb2x1bWU4ICpzb3VyY2VWb2x1bWUgPSAweCUwLjhwLCBJRGlyZWN0M0RWb2x1bWU4ICpkZXN0aW5hdGlvblZvbHVtZSA9IDB4JTAuOHAiLCBzb3VyY2VWb2x1bWUsIGRlc3RpbmF0aW9uVm9sdW1lKTsKLQotCQlpZighc291cmNlVm9sdW1lIHx8ICFkZXN0aW5hdGlvblZvbHVtZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlEM0RWT0xVTUVfREVTQyBzb3VyY2VEZXNjcmlwdGlvbjsKLQkJRDNEVk9MVU1FX0RFU0MgZGVzdGluYXRpb25EZXNjcmlwdGlvbjsKLQotCQlzb3VyY2VWb2x1bWUtPkdldERlc2MoJnNvdXJjZURlc2NyaXB0aW9uKTsKLQkJZGVzdGluYXRpb25Wb2x1bWUtPkdldERlc2MoJmRlc3RpbmF0aW9uRGVzY3JpcHRpb24pOwotCi0JCWlmKHNvdXJjZURlc2NyaXB0aW9uLlBvb2wgICAgICAhPSBEM0RQT09MX1NZU1RFTU1FTSB8fAotCQkgICBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLlBvb2wgIT0gRDNEUE9PTF9ERUZBVUxUIHx8Ci0JCSAgIHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCAhPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLkZvcm1hdCB8fAotCQkgICBzb3VyY2VEZXNjcmlwdGlvbi5XaWR0aCAgIT0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5XaWR0aCB8fAotCQkgICBzb3VyY2VEZXNjcmlwdGlvbi5IZWlnaHQgIT0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5IZWlnaHQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRDNETE9DS0VEX0JPWCBzb3VyY2VMb2NrOwotCQlEM0RMT0NLRURfQk9YIGRlc3RpbmF0aW9uTG9jazsKLQotCQlzb3VyY2VWb2x1bWUtPkxvY2tCb3goJnNvdXJjZUxvY2ssIDAsIDApOwotCQlkZXN0aW5hdGlvblZvbHVtZS0+TG9ja0JveCgmZGVzdGluYXRpb25Mb2NrLCAwLCAwKTsKLQotCQlpZihzb3VyY2VMb2NrLlJvd1BpdGNoICE9IGRlc3RpbmF0aW9uTG9jay5Sb3dQaXRjaCB8fAotCQkgICBzb3VyY2VMb2NrLlNsaWNlUGl0Y2ggIT0gZGVzdGluYXRpb25Mb2NrLlNsaWNlUGl0Y2gpCi0JCXsKLQkJCVVOSU1QTEVNRU5URUQoKTsKLQkJfQotCi0JCW1lbWNweShkZXN0aW5hdGlvbkxvY2sucEJpdHMsIHNvdXJjZUxvY2sucEJpdHMsIHNvdXJjZUxvY2suU2xpY2VQaXRjaCAqIHNvdXJjZURlc2NyaXB0aW9uLkRlcHRoKTsKLQotCQlzb3VyY2VWb2x1bWUtPlVubG9ja0JveCgpOwotCQlkZXN0aW5hdGlvblZvbHVtZS0+VW5sb2NrQm94KCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlODo6Y29uZmlndXJlRlBVKCkKLQl7Ci0JCXVuc2lnbmVkIHNob3J0IGN3OwotCi0JCV9fYXNtCi0JCXsKLQkJCWZzdGN3IGN3Ci0JCQlhbmQgY3csIDB4RkNGQyAgIC8vIFNpbmdsZS1wcmVjaXNpb24KLQkJCW9yIGN3LCAweDAwM0YgICAgLy8gTWFzayBhbGwgZXhjZXB0aW9ucwotCQkJYW5kIGN3LCAweEYzRkYgICAvLyBSb3VuZCB0byBuZWFyZXN0Ci0JCQlmbGRjdyBjdwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0REZXZpY2U4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNERGV2aWNlOC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OWEyZDguLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0REZXZpY2U4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDhfRGlyZWN0M0REZXZpY2U4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNERGV2aWNlOF9ocHAKLQotI2luY2x1ZGUgIlVua25vd24uaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0Q4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFN0YXRlQmxvY2s4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RTd2FwQ2hhaW44LmhwcCIKLQotI2luY2x1ZGUgIlN0cmVhbS5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q4Lmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotCi1uYW1lc3BhY2Ugc3cKLXsKLQljbGFzcyBSZW5kZXJlcjsKLQljbGFzcyBDb250ZXh0OwotfQotCi1uYW1lc3BhY2UgRDNEOAotewotCWNsYXNzIERpcmVjdDNEUGl4ZWxTaGFkZXI4OwotCWNsYXNzIERpcmVjdDNEVmVydGV4U2hhZGVyODsKLQljbGFzcyBEaXJlY3QzRFN1cmZhY2U4OwotCWNsYXNzIERpcmVjdDNEVmVydGV4QnVmZmVyODsKLQljbGFzcyBEaXJlY3QzREluZGV4QnVmZmVyODsKLQotCWNsYXNzIERpcmVjdDNERGV2aWNlOCA6IHB1YmxpYyBJRGlyZWN0M0REZXZpY2U4LCBwcm90ZWN0ZWQgVW5rbm93bgotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNERGV2aWNlOChjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UsIERpcmVjdDNEOCAqZDNkOCwgdW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgdW5zaWduZWQgbG9uZyBiZWhhdmlvdXJGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyk7Ci0KLQkJfkRpcmVjdDNERGV2aWNlOCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRERldmljZTggbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBBcHBseVN0YXRlQmxvY2sodW5zaWduZWQgbG9uZyB0b2tlbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEJlZ2luU2NlbmUoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQmVnaW5TdGF0ZUJsb2NrKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENhcHR1cmVTdGF0ZUJsb2NrKHVuc2lnbmVkIGxvbmcgdG9rZW4pIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDbGVhcih1bnNpZ25lZCBsb25nIGNvdW50LCBjb25zdCBEM0RSRUNUICpyZWN0cywgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBjb2xvciwgZmxvYXQgeiwgdW5zaWduZWQgbG9uZyBzdGVuY2lsKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ29weVJlY3RzKElEaXJlY3QzRFN1cmZhY2U4ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0c0FycmF5LCB1bnNpZ25lZCBpbnQgcmVjdHMsIElEaXJlY3QzRFN1cmZhY2U4ICpkZXN0aW5hdGlvblN1cmZhY2UsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnRzQXJyYXkpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRFN3YXBDaGFpbjggKipzd2FwQ2hhaW4pIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVDdWJlVGV4dHVyZSh1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RDdWJlVGV4dHVyZTggKipjdWJlVGV4dHVyZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCBJRGlyZWN0M0RTdXJmYWNlOCAqKnN1cmZhY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVJbWFnZVN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBJRGlyZWN0M0RTdXJmYWNlOCAqKnN1cmZhY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVJbmRleEJ1ZmZlcih1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzREluZGV4QnVmZmVyOCAqKmluZGV4QnVmZmVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlUGl4ZWxTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIHVuc2lnbmVkIGxvbmcgKmhhbmRsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVJlbmRlclRhcmdldCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIGludCBsb2NrYWJsZSwgSURpcmVjdDNEU3VyZmFjZTggKipzdXJmYWNlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlU3RhdGVCbG9jayhEM0RTVEFURUJMT0NLVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nICp0b2tlbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVRleHR1cmUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFRleHR1cmU4ICoqdGV4dHVyZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVZlcnRleEJ1ZmZlcih1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCB1bnNpZ25lZCBsb25nIEZWRiwgRDNEUE9PTCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOCAqKnZlcnRleEJ1ZmZlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVZlcnRleFNoYWRlcihjb25zdCB1bnNpZ25lZCBsb25nICpkZWNsYXJhdGlvbiwgY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIHVuc2lnbmVkIGxvbmcgKmhhbmRsZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVZvbHVtZVRleHR1cmUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgZGVwdGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTggKip2b2x1bWVUZXh0dXJlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRGVsZXRlUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIERlbGV0ZVBpeGVsU2hhZGVyKHVuc2lnbmVkIGxvbmcgaGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRGVsZXRlU3RhdGVCbG9jayh1bnNpZ25lZCBsb25nIHRva2VuKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRGVsZXRlVmVydGV4U2hhZGVyKHVuc2lnbmVkIGxvbmcgaGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRHJhd0luZGV4ZWRQcmltaXRpdmUoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCB1bnNpZ25lZCBpbnQgbWluSW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0aWNlcywgdW5zaWduZWQgaW50IHN0YXJ0SW5kZXgsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIERyYXdJbmRleGVkUHJpbWl0aXZlVVAoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCB1bnNpZ25lZCBpbnQgbWluVmVydGV4SW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0ZXhJbmRpY2VzLCB1bnNpZ25lZCBpbnQgUHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKmluZGV4RGF0YSwgRDNERk9STUFUIGluZGV4RGF0YUZvcm1hdCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCBWZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRHJhd1ByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCwgdW5zaWduZWQgaW50IHByaW1pdmVDb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIERyYXdQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRHJhd1JlY3RQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlLCBjb25zdCBmbG9hdCAqbnVtU2VncywgY29uc3QgRDNEUkVDVFBBVENIX0lORk8gKnJlY3RQYXRjaEluZm8pIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBEcmF3VHJpUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFRSSVBBVENIX0lORk8gKnRyaVBhdGNoSW5mbykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEVuZFNjZW5lKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEVuZFN0YXRlQmxvY2sodW5zaWduZWQgbG9uZyAqdG9rZW4pIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBpbnQgX19zdGRjYWxsIEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0QmFja0J1ZmZlcih1bnNpZ25lZCBpbnQgaW5kZXgsIEQzREJBQ0tCVUZGRVJfVFlQRSB0eXBlLCBJRGlyZWN0M0RTdXJmYWNlOCAqKmJhY2tCdWZmZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgZmxvYXQgKnBsYW5lKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Q2xpcFN0YXR1cyhEM0RDTElQU1RBVFVTOCAqY2xpcFN0YXR1cykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldENyZWF0aW9uUGFyYW1ldGVycyhEM0RERVZJQ0VfQ1JFQVRJT05fUEFSQU1FVEVSUyAqcGFyYW1ldGVycykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgKnBhbGV0dGVOdW1iZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXB0aFN0ZW5jaWxTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U4ICoqZGVwdGhTdGVuY2lsU3VyZmFjZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERldmljZUNhcHMoRDNEQ0FQUzggKmNhcHMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREaXJlY3QzRChJRGlyZWN0M0Q4ICoqRDNEKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGlzcGxheU1vZGUoRDNERElTUExBWU1PREUgKm1vZGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRGcm9udEJ1ZmZlcihJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdFN1cmZhY2UpIG92ZXJyaWRlOwotCQl2b2lkIF9fc3RkY2FsbCBHZXRHYW1tYVJhbXAoRDNER0FNTUFSQU1QICpyYW1wKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0SW5kaWNlcyhJRGlyZWN0M0RJbmRleEJ1ZmZlcjggKippbmRleERhdGEsIHVuc2lnbmVkIGludCAqYmFzZVZlcnRleEluZGV4KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0SW5mbyh1bnNpZ25lZCBsb25nIGRldkluZm9JRCwgdm9pZCAqZGV2SW5mb1N0cnVjdCwgdW5zaWduZWQgbG9uZyBkZXZJbmZvU3RydWN0U2l6ZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRExJR0hUOCAqcCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldExpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXggLCBpbnQgKmVuYWJsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldE1hdGVyaWFsKEQzRE1BVEVSSUFMOCAqbWF0ZXJpYWwpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQYWxldHRlRW50cmllcyh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciwgUEFMRVRURUVOVFJZICplbnRyaWVzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UGl4ZWxTaGFkZXIodW5zaWduZWQgbG9uZyAqaGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UGl4ZWxTaGFkZXJGdW5jdGlvbih1bnNpZ25lZCBsb25nIGhhbmRsZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZU9mRGF0YSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFBpeGVsU2hhZGVyQ29uc3RhbnQodW5zaWduZWQgbG9uZyBzdGFydFJlZ2lzdGVyLCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGxvbmcgY29uc3RhbnRDb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFJhc3RlclN0YXR1cyhEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgU3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UmVuZGVyVGFyZ2V0KElEaXJlY3QzRFN1cmZhY2U4ICoqcmVuZGVyVGFyZ2V0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKipzdHJlYW1EYXRhLCB1bnNpZ25lZCBpbnQgKnN0cmlkZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFRleHR1cmUodW5zaWduZWQgbG9uZyBzdGFnZSwgSURpcmVjdDNEQmFzZVRleHR1cmU4ICoqdGV4dHVyZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIEQzRE1BVFJJWCAqbWF0cml4KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0VmVydGV4U2hhZGVyKHVuc2lnbmVkIGxvbmcgKmhhbmRsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFZlcnRleFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGxvbmcgc3RhcnRSZWdpc3Rlciwgdm9pZCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBsb25nIGNvbnN0YW50Q291bnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJEZWNsYXJhdGlvbih1bnNpZ25lZCBsb25nIGhhbmRsZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFZlcnRleFNoYWRlckZ1bmN0aW9uKHVuc2lnbmVkIGxvbmcgaGFuZGxlLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Vmlld3BvcnQoRDNEVklFV1BPUlQ4ICp2aWV3cG9ydCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIExpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCBlbmFibGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBNdWx0aXBseVRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgUHJlc2VudChjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgSFdORCBkZXN0V2luZG93T3ZlcnJpZGUsIGNvbnN0IFJHTkRBVEEgKmRpcnR5UmVnaW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgUHJvY2Vzc1ZlcnRpY2VzKHVuc2lnbmVkIGludCBzcmNTdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgZGVzdEluZGV4LCB1bnNpZ25lZCBpbnQgdmVydGV4Q291bnQsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKmRlc3RCdWZmZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBSZXNldChEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgUmVzb3VyY2VNYW5hZ2VyRGlzY2FyZEJ5dGVzKHVuc2lnbmVkIGxvbmcgYnl0ZXMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgZmxvYXQgKnBsYW5lKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0Q2xpcFN0YXR1cyhjb25zdCBEM0RDTElQU1RBVFVTOCAqY2xpcFN0YXR1cykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcikgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIFNldEN1cnNvclBvc2l0aW9uKGludCB4LCBpbnQgeSwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldEN1cnNvclByb3BlcnRpZXModW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5LCBJRGlyZWN0M0RTdXJmYWNlOCAqY3Vyc29yQml0bWFwKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgU2V0R2FtbWFSYW1wKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IEQzREdBTU1BUkFNUCAqcmFtcCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleERhdGEsIHVuc2lnbmVkIGludCBiYXNlVmVydGV4SW5kZXgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBEM0RMSUdIVDggKmxpZ2h0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0TWF0ZXJpYWwoY29uc3QgRDNETUFURVJJQUw4ICptYXRlcmlhbCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBjb25zdCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlcih1bnNpZ25lZCBsb25nIHNoYWRlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFBpeGVsU2hhZGVyQ29uc3RhbnQodW5zaWduZWQgbG9uZyBzdGFydFJlZ2lzdGVyLCBjb25zdCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGxvbmcgY29uc3RhbnRDb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFJlbmRlclRhcmdldChJRGlyZWN0M0RTdXJmYWNlOCAqcmVuZGVyVGFyZ2V0LCBJRGlyZWN0M0RTdXJmYWNlOCAqbmV3WlN0ZW5jaWwpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbU51bWJlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyOCAqc3RyZWFtRGF0YSwgdW5zaWduZWQgaW50IHN0cmlkZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFRleHR1cmUodW5zaWduZWQgbG9uZyBzdGFnZSwgSURpcmVjdDNEQmFzZVRleHR1cmU4ICp0ZXh0dXJlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFZlcnRleFNoYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFZlcnRleFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGxvbmcgc3RhcnRSZWdpc3RlciwgY29uc3Qgdm9pZCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBsb25nIGNvbnN0YW50Q291bnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRWaWV3cG9ydChjb25zdCBEM0RWSUVXUE9SVDggKnZpZXdwb3J0KSBvdmVycmlkZTsKLQkJaW50IF9fc3RkY2FsbCBTaG93Q3Vyc29yKGludCBzaG93KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVGVzdENvb3BlcmF0aXZlTGV2ZWwoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVXBkYXRlVGV4dHVyZShJRGlyZWN0M0RCYXNlVGV4dHVyZTggKnNvdXJjZVRleHR1cmUsIElEaXJlY3QzREJhc2VUZXh0dXJlOCAqZGVzdGluYXRpb25UZXh0dXJlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVmFsaWRhdGVEZXZpY2UodW5zaWduZWQgbG9uZyAqbnVtUGFzc2VzKSBvdmVycmlkZTsKLQotCQkvLyBJbnRlcm5hbCBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIHVwZGF0ZVN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTggKnNvdXJjZVN1cmZhY2UsIGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIElEaXJlY3QzRFN1cmZhY2U4ICpkZXN0aW5hdGlvblN1cmZhY2UsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQpOwotCi0JcHJpdmF0ZToKLQkJc3RhdGljIGludCBGVkZTdHJpZGUodW5zaWduZWQgbG9uZyBGVkYpOwotCQlzdGF0aWMgaW50IHR5cGVTdHJpZGUodW5zaWduZWQgY2hhciBzdHJlYW1UeXBlKTsKLQkJc3RhdGljIHN3OjpTdHJlYW1UeXBlIHN0cmVhbVR5cGUoaW50IHR5cGUpOwotCQlib29sIGJpbmREYXRhKERpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleEJ1ZmZlciwgaW50IGJhc2UpOwotCQl2b2lkIGJpbmRTdHJlYW1zKGludCBiYXNlKTsKLQkJdm9pZCBiaW5kSW5kZXhCdWZmZXIoRGlyZWN0M0RJbmRleEJ1ZmZlcjggKmluZGV4QnVmZmVyKTsKLQkJdm9pZCBiaW5kTGlnaHRzKCk7Ci0JCWJvb2wgYmluZFZpZXdwb3J0KCk7Ci0JCXZvaWQgYmluZFRleHR1cmVzKCk7Ci0JCXZvaWQgYmluZEN1cnNvcigpOwotCi0JCWxvbmcgdXBkYXRlVm9sdW1lKElEaXJlY3QzRFZvbHVtZTggKnNvdXJjZVZvbHVtZSwgSURpcmVjdDNEVm9sdW1lOCAqZGVzdGluYXRpb25Wb2x1bWUpOwotCQl2b2lkIGNvbmZpZ3VyZUZQVSgpOwotCi0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJY29uc3QgSElOU1RBTkNFIGluc3RhbmNlOwotCQlEaXJlY3QzRDggKmQzZDg7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCBhZGFwdGVyOwotCQljb25zdCBEM0RERVZUWVBFIGRldmljZVR5cGU7Ci0JCWNvbnN0IEhXTkQgZm9jdXNXaW5kb3c7Ci0JCWNvbnN0IHVuc2lnbmVkIGxvbmcgYmVoYXZpb3VyRmxhZ3M7Ci0JCWNvbnN0IEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50UGFyYW1ldGVyczsKLQotCQlIV05EIHdpbmRvd0hhbmRsZTsKLQotCQlEM0RWSUVXUE9SVDggdmlld3BvcnQ7Ci0JCUQzRE1BVFJJWCBtYXRyaXhbNTEyXTsKLQkJRGlyZWN0M0RCYXNlVGV4dHVyZTggKnRleHR1cmVbOF07Ci0JCUQzRE1BVEVSSUFMOCBtYXRlcmlhbDsKLQkJZmxvYXQgcGxhbmVbNl1bNF07Ci0JCUQzRENMSVBTVEFUVVM4IGNsaXBTdGF0dXM7Ci0KLQkJc3RydWN0IExpZ2h0IDogRDNETElHSFQ4Ci0JCXsKLQkJCUxpZ2h0ICZvcGVyYXRvcj0oY29uc3QgRDNETElHSFQ4ICZsaWdodCkKLQkJCXsKLQkJCQlUeXBlID0gbGlnaHQuVHlwZTsKLQkJCQlEaWZmdXNlID0gbGlnaHQuRGlmZnVzZTsKLQkJCQlTcGVjdWxhciA9IGxpZ2h0LlNwZWN1bGFyOwotCQkJCUFtYmllbnQgPSBsaWdodC5BbWJpZW50OwotCQkJCVBvc2l0aW9uID0gbGlnaHQuUG9zaXRpb247Ci0JCQkJRGlyZWN0aW9uID0gbGlnaHQuRGlyZWN0aW9uOwotCQkJCVJhbmdlID0gbGlnaHQuUmFuZ2U7Ci0JCQkJRmFsbG9mZiA9IGxpZ2h0LkZhbGxvZmY7Ci0JCQkJQXR0ZW51YXRpb24wID0gbGlnaHQuQXR0ZW51YXRpb24wOwotCQkJCUF0dGVudWF0aW9uMSA9IGxpZ2h0LkF0dGVudWF0aW9uMTsKLQkJCQlBdHRlbnVhdGlvbjIgPSBsaWdodC5BdHRlbnVhdGlvbjI7Ci0JCQkJVGhldGEgPSBsaWdodC5UaGV0YTsKLQkJCQlQaGkgPSBsaWdodC5QaGk7Ci0KLQkJCQlyZXR1cm4gKnRoaXM7Ci0JCQl9Ci0KLQkJCWJvb2wgZW5hYmxlOwotCQl9OwotCi0JCXN0cnVjdCBMaWdodHMgOiBzdGQ6Om1hcDxpbnQsIExpZ2h0PgotCQl7Ci0JCQlib29sIGV4aXN0cyhpbnQgaW5kZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIGZpbmQoaW5kZXgpICE9IGVuZCgpOwotCQkJfQotCQl9OwotCi0JCUxpZ2h0cyBsaWdodDsKLQkJYm9vbCBsaWdodHNEaXJ0eTsKLQotCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKmRhdGFTdHJlYW1bMTZdOwotCQlpbnQgc3RyZWFtU3RyaWRlWzE2XTsKLQkJRGlyZWN0M0RJbmRleEJ1ZmZlcjggKmluZGV4RGF0YTsKLQkJdW5zaWduZWQgaW50IGJhc2VWZXJ0ZXhJbmRleDsKLQotCQl1bnNpZ25lZCBsb25nIEZWRjsKLQotCQlzdGQ6OnZlY3RvcjxEaXJlY3QzRFN3YXBDaGFpbjgqPiBzd2FwQ2hhaW47Ci0KLQkJRGlyZWN0M0RTdXJmYWNlOCAqcmVuZGVyVGFyZ2V0OwotCQlEaXJlY3QzRFN1cmZhY2U4ICpkZXB0aFN0ZW5jaWw7Ci0KLQkJYm9vbCByZWNvcmRTdGF0ZTsKLQkJc3RkOjp2ZWN0b3I8RGlyZWN0M0RTdGF0ZUJsb2NrOCo+IHN0YXRlUmVjb3JkZXI7Ci0KLQkJdW5zaWduZWQgbG9uZyByZW5kZXJTdGF0ZVtEM0RSU19OT1JNQUxPUkRFUiArIDFdOwotCQl1bnNpZ25lZCBsb25nIHRleHR1cmVTdGFnZVN0YXRlWzhdW0QzRFRTU19SRVNVTFRBUkcgKyAxXTsKLQkJYm9vbCBpbml0OyAgIC8vIFRPRE86IERlcHJlY2F0ZSB3aGVuIGFsbCBzdGF0ZSBjaGFuZ2VzIGltcGxlbWVudGVkCi0KLQkJc3RkOjp2ZWN0b3I8RGlyZWN0M0RQaXhlbFNoYWRlcjgqPiBwaXhlbFNoYWRlcjsKLQkJc3RkOjp2ZWN0b3I8RGlyZWN0M0RWZXJ0ZXhTaGFkZXI4Kj4gdmVydGV4U2hhZGVyOwotCQl1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVySGFuZGxlOwotCQl1bnNpZ25lZCBsb25nIHZlcnRleFNoYWRlckhhbmRsZTsKLQkJY29uc3QgdW5zaWduZWQgbG9uZyAqZGVjbGFyYXRpb247Ci0KLQkJZmxvYXQgcGl4ZWxTaGFkZXJDb25zdGFudFs4XVs0XTsKLQkJZmxvYXQgdmVydGV4U2hhZGVyQ29uc3RhbnRbMjU2XVs0XTsKLQotCQlzdHJ1Y3QgUGFsZXR0ZQotCQl7Ci0JCQlQQUxFVFRFRU5UUlkgZW50cnlbMjU2XTsKLQkJfTsKLQotCQl1bnNpZ25lZCBpbnQgY3VycmVudFBhbGV0dGU7Ci0JCXN0ZDo6bWFwPGludCwgUGFsZXR0ZT4gcGFsZXR0ZTsKLQotCQlzdzo6Q29udGV4dCAqY29udGV4dDsKLQkJc3c6OlJlbmRlcmVyICpyZW5kZXJlcjsKLQotCQlzdzo6U3VyZmFjZSAqY3Vyc29yOwotCQlib29sIHNob3dDdXJzb3I7Ci0JCUhDVVJTT1IgbnVsbEN1cnNvcjsKLQkJSENVUlNPUiB3aW4zMkN1cnNvcjsKLQl9OwotfQotCi0jZW5kaWYgICAvLyBEM0Q4X0RpcmVjdDNERGV2aWNlOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNESW5kZXhCdWZmZXI4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNESW5kZXhCdWZmZXI4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlNTRkMi4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzREluZGV4QnVmZmVyOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNESW5kZXhCdWZmZXI4LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOC5ocHAiCi0jaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOAotewotCURpcmVjdDNESW5kZXhCdWZmZXI4OjpEaXJlY3QzREluZGV4QnVmZmVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgdW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKSA6IERpcmVjdDNEUmVzb3VyY2U4KGRldmljZSwgRDNEUlRZUEVfSU5ERVhCVUZGRVIsIGxlbmd0aCksIGxlbmd0aChsZW5ndGgpLCB1c2FnZSh1c2FnZSksIGZvcm1hdChmb3JtYXQpLCBwb29sKHBvb2wpCi0JewotCQlpbmRleEJ1ZmZlciA9IG5ldyBzdzo6UmVzb3VyY2UobGVuZ3RoICsgMTYpOwotCX0KLQotCURpcmVjdDNESW5kZXhCdWZmZXI4Ojp+RGlyZWN0M0RJbmRleEJ1ZmZlcjgoKQotCXsKLQkJaW5kZXhCdWZmZXItPmRlc3RydWN0KCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RJbmRleEJ1ZmZlcjggfHwKLQkJICAgaWlkID09IElJRF9JRGlyZWN0M0RSZXNvdXJjZTggfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6RnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpGcmVlUHJpdmF0ZURhdGEoZ3VpZCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OlByZUxvYWQoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCURpcmVjdDNEUmVzb3VyY2U4OjpQcmVMb2FkKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6U2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6U2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSwgZmxhZ3MpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OlNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpHZXRQcmlvcml0eSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpHZXRQcmlvcml0eSgpOwotCX0KLQotCUQzRFJFU09VUkNFVFlQRSBEaXJlY3QzREluZGV4QnVmZmVyODo6R2V0VHlwZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpHZXRUeXBlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6R2V0RGVzYyhEM0RJTkRFWEJVRkZFUl9ERVNDICpkZXNjcmlwdGlvbikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighZGVzY3JpcHRpb24pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJZGVzY3JpcHRpb24tPkZvcm1hdCA9IGZvcm1hdDsKLQkJZGVzY3JpcHRpb24tPlBvb2wgPSBwb29sOwotCQlkZXNjcmlwdGlvbi0+U2l6ZSA9IGxlbmd0aDsKLQkJZGVzY3JpcHRpb24tPlR5cGUgPSBHZXRUeXBlKCk7Ci0JCWRlc2NyaXB0aW9uLT5Vc2FnZSA9IHVzYWdlOwotCi0JCXJldHVybiAwOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OkxvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKG9mZnNldCA9PSAwICYmIHNpemUgPT0gMCkgICAvLyBMb2NrIHdob2xlIGJ1ZmZlcgotCQl7Ci0JCQlzaXplID0gbGVuZ3RoOwotCQl9Ci0KLQkJaWYoIWRhdGEgfHwgb2Zmc2V0ICsgc2l6ZSA+IGxlbmd0aCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlsb2NrT2Zmc2V0ID0gb2Zmc2V0OwotCQlsb2NrU2l6ZSA9IHNpemU7Ci0KLQkJKmRhdGEgPSAodW5zaWduZWQgY2hhciopaW5kZXhCdWZmZXItPmxvY2soc3c6OlBVQkxJQykgKyBvZmZzZXQ7Ci0JCWluZGV4QnVmZmVyLT51bmxvY2soKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OlVubG9jaygpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlzdzo6UmVzb3VyY2UgKkRpcmVjdDNESW5kZXhCdWZmZXI4OjpnZXRSZXNvdXJjZSgpIGNvbnN0Ci0JewkKLQkJcmV0dXJuIGluZGV4QnVmZmVyOwotCX0KLQotCWJvb2wgRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OmlzMzJCaXQoKSBjb25zdAotCXsKLQkJc3dpdGNoKGZvcm1hdCkKLQkJewotCQljYXNlIEQzREZNVF9JTkRFWDE2OgotCQkJcmV0dXJuIGZhbHNlOwotCQljYXNlIEQzREZNVF9JTkRFWDMyOgotCQkJcmV0dXJuIHRydWU7Ci0JCWRlZmF1bHQ6Ci0JCQlBU1NFUlQoZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzREluZGV4QnVmZmVyOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzREluZGV4QnVmZmVyOC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMTQxZDcuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RJbmRleEJ1ZmZlcjguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q4X0RpcmVjdDNESW5kZXhCdWZmZXI4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNESW5kZXhCdWZmZXI4X2hwcAotCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTguaHBwIgotCi0jaW5jbHVkZSA8ZDNkOC5oPgotCi1uYW1lc3BhY2Ugc3cKLXsKLQljbGFzcyBSZXNvdXJjZTsKLX0KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzREluZGV4QnVmZmVyOCA6IHB1YmxpYyBJRGlyZWN0M0RJbmRleEJ1ZmZlcjgsIHB1YmxpYyBEaXJlY3QzRFJlc291cmNlOAotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNESW5kZXhCdWZmZXI4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpOwotCi0JCX5EaXJlY3QzREluZGV4QnVmZmVyOCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKSBvdmVycmlkZTsKLQkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNESW5kZXhCdWZmZXI4IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVzYyhEM0RJTkRFWEJVRkZFUl9ERVNDICpkZXNjcmlwdGlvbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIExvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQlzdzo6UmVzb3VyY2UgKmdldFJlc291cmNlKCkgY29uc3Q7Ci0JCWJvb2wgaXMzMkJpdCgpIGNvbnN0OwotCi0JcHJpdmF0ZToKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQljb25zdCB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCQljb25zdCBsb25nIHVzYWdlOwotCQljb25zdCBEM0RGT1JNQVQgZm9ybWF0OwotCQljb25zdCBEM0RQT09MIHBvb2w7Ci0KLQkJYm9vbCBsb2NrZWQ7Ci0JCXVuc2lnbmVkIGludCBsb2NrT2Zmc2V0OwotCQl1bnNpZ25lZCBpbnQgbG9ja1NpemU7Ci0JCXVuc2lnbmVkIGNoYXIgKmxvY2tEYXRhOwotCi0JCXN3OjpSZXNvdXJjZSAqaW5kZXhCdWZmZXI7Ci0JfTsKLX0KLQotI2VuZGlmIC8vIEQzRDhfRGlyZWN0M0RJbmRleEJ1ZmZlcjhfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFBpeGVsU2hhZGVyOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFBpeGVsU2hhZGVyOC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NTdmYmMuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RQaXhlbFNoYWRlcjguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEUGl4ZWxTaGFkZXI4LmhwcCIKLQotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotbmFtZXNwYWNlIEQzRDgKLXsKLQlEaXJlY3QzRFBpeGVsU2hhZGVyODo6RGlyZWN0M0RQaXhlbFNoYWRlcjgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuKSA6IGRldmljZShkZXZpY2UpLCBwaXhlbFNoYWRlcihzaGFkZXJUb2tlbikKLQl7Ci0JCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRva2VuID0gc2hhZGVyVG9rZW47Ci0KLQkJc2l6ZSA9IDA7Ci0KLQkJd2hpbGUoc2hhZGVyVG9rZW5bc2l6ZV0gIT0gMHgwMDAwRkZGRikKLQkJewotCQkJc2l6ZSsrOwotCQl9Ci0KLQkJc2l6ZSsrOwotCi0JCXRoaXMtPnNoYWRlclRva2VuID0gbmV3IHVuc2lnbmVkIGxvbmdbc2l6ZV07Ci0JCW1lbWNweSh0aGlzLT5zaGFkZXJUb2tlbiwgc2hhZGVyVG9rZW4sIHNpemUgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCX0KLQotCURpcmVjdDNEUGl4ZWxTaGFkZXI4Ojp+RGlyZWN0M0RQaXhlbFNoYWRlcjgoKQotCXsKLQkJZGVsZXRlW10gc2hhZGVyVG9rZW47Ci0JCXNoYWRlclRva2VuID0gMDsKLQl9Ci0KLQlsb25nIERpcmVjdDNEUGl4ZWxTaGFkZXI4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlBU1NFUlQoZmFsc2UpOyAgIC8vIEludGVybmFsIG9iamVjdAotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RQaXhlbFNoYWRlcjg6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOwotCX0KLQkKLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEUGl4ZWxTaGFkZXI4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RQaXhlbFNoYWRlcjg6OkdldEZ1bmN0aW9uKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCAqc2l6ZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihkYXRhKQotCQl7Ci0JCQltZW1jcHkoZGF0YSwgc2hhZGVyVG9rZW4sIHRoaXMtPnNpemUgKiA0KTsKLQkJfQotCi0JCSpzaXplID0gdGhpcy0+c2l6ZSAqIDQ7Ci0JfQotCi0JY29uc3Qgc3c6OlBpeGVsU2hhZGVyICpEaXJlY3QzRFBpeGVsU2hhZGVyODo6Z2V0UGl4ZWxTaGFkZXIoKSBjb25zdAotCXsKLQkJcmV0dXJuICZwaXhlbFNoYWRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RQaXhlbFNoYWRlcjguaHBwIGIvc3JjL0QzRDgvRGlyZWN0M0RQaXhlbFNoYWRlcjguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY5NzI1Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEUGl4ZWxTaGFkZXI4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOF9EaXJlY3QzRFBpeGVsU2hhZGVyOF9ocHAKLSNkZWZpbmUgRDNEOF9EaXJlY3QzRFBpeGVsU2hhZGVyOF9ocHAKLQotI2luY2x1ZGUgIlBpeGVsU2hhZGVyLmhwcCIKLQotI2luY2x1ZGUgIlVua25vd24uaHBwIgotCi1uYW1lc3BhY2UgRDNEOAotewotCWNsYXNzIERpcmVjdDNERGV2aWNlODsKLQotCWNsYXNzIERpcmVjdDNEUGl4ZWxTaGFkZXI4IDogcHVibGljIFVua25vd24KLQl7Ci0JcHVibGljOgotCQlEaXJlY3QzRFBpeGVsU2hhZGVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW4pOwotCi0JCX5EaXJlY3QzRFBpeGVsU2hhZGVyOCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCXZvaWQgX19zdGRjYWxsIEdldEZ1bmN0aW9uKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCAqc2l6ZSk7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQljb25zdCBzdzo6UGl4ZWxTaGFkZXIgKmdldFBpeGVsU2hhZGVyKCkgY29uc3Q7Ci0KLQlwcml2YXRlOgotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCURpcmVjdDNERGV2aWNlOCAqY29uc3QgZGV2aWNlOwotCQl1bnNpZ25lZCBsb25nICpzaGFkZXJUb2tlbjsKLQkJdW5zaWduZWQgaW50IHNpemU7Ci0KLQkJc3c6OlBpeGVsU2hhZGVyIHBpeGVsU2hhZGVyOwotCX07Ci19Ci0KLSNlbmRpZiAgIC8vIEQzRDhfRGlyZWN0M0RQaXhlbFNoYWRlcjhfaHBwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RSZXNvdXJjZTguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0RSZXNvdXJjZTguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc0ZDgwLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEUmVzb3VyY2U4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTguaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U4LmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JdW5zaWduZWQgaW50IERpcmVjdDNEUmVzb3VyY2U4OjptZW1vcnlVc2FnZSA9IDA7Ci0KLQlEaXJlY3QzRFJlc291cmNlODo6UHJpdmF0ZURhdGE6OlByaXZhdGVEYXRhKCkKLQl7Ci0JCWRhdGEgPSAwOwotCX0KLQotCURpcmVjdDNEUmVzb3VyY2U4OjpQcml2YXRlRGF0YTo6UHJpdmF0ZURhdGEoY29uc3Qgdm9pZCAqZGF0YSwgaW50IHNpemUsIGJvb2wgbWFuYWdlZCkKLQl7Ci0JCXRoaXMtPnNpemUgPSBzaXplOwotCQl0aGlzLT5tYW5hZ2VkID0gbWFuYWdlZDsKLQotCQl0aGlzLT5kYXRhID0gKHZvaWQqKW5ldyB1bnNpZ25lZCBjaGFyW3NpemVdOwotCQltZW1jcHkodGhpcy0+ZGF0YSwgZGF0YSwgc2l6ZSk7Ci0KLQkJaWYobWFuYWdlZCkKLQkJewotCQkJKChJVW5rbm93biopZGF0YSktPkFkZFJlZigpOwotCQl9Ci0JfQotCi0JRGlyZWN0M0RSZXNvdXJjZTg6OlByaXZhdGVEYXRhICZEaXJlY3QzRFJlc291cmNlODo6UHJpdmF0ZURhdGE6Om9wZXJhdG9yPShjb25zdCBQcml2YXRlRGF0YSAmcHJpdmF0ZURhdGEpCi0JewotCQlzaXplID0gcHJpdmF0ZURhdGEuc2l6ZTsKLQkJbWFuYWdlZCA9IHByaXZhdGVEYXRhLm1hbmFnZWQ7Ci0KLQkJaWYoZGF0YSkKLQkJewotCQkJaWYobWFuYWdlZCkKLQkJCXsKLQkJCQkoKElVbmtub3duKilkYXRhKS0+UmVsZWFzZSgpOwotCQkJfQotCi0JCQlkZWxldGVbXSBkYXRhOwotCQl9Ci0KLQkJZGF0YSA9ICh2b2lkKiluZXcgdW5zaWduZWQgY2hhcltzaXplXTsKLQkJbWVtY3B5KGRhdGEsIHByaXZhdGVEYXRhLmRhdGEsIHNpemUpOwotCi0JCXJldHVybiAqdGhpczsKLQl9Ci0KLQlEaXJlY3QzRFJlc291cmNlODo6UHJpdmF0ZURhdGE6On5Qcml2YXRlRGF0YSgpCi0JewotCQlpZihkYXRhICYmIG1hbmFnZWQpCi0JCXsKLQkJCSgoSVVua25vd24qKWRhdGEpLT5SZWxlYXNlKCk7Ci0JCX0KLQotCQlkZWxldGVbXSBkYXRhOwotCQlkYXRhID0gMDsKLQl9Ci0KLQlEaXJlY3QzRFJlc291cmNlODo6RGlyZWN0M0RSZXNvdXJjZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCB1bnNpZ25lZCBpbnQgc2l6ZSkgOiBkZXZpY2UoZGV2aWNlKSwgdHlwZSh0eXBlKSwgc2l6ZShzaXplKQotCXsKLQkJcHJpb3JpdHkgPSAwOwotCi0JCW1lbW9yeVVzYWdlICs9IHNpemU7Ci0JfQotCi0JRGlyZWN0M0RSZXNvdXJjZTg6On5EaXJlY3QzRFJlc291cmNlOCgpCi0JewotCQltZW1vcnlVc2FnZSAtPSBzaXplOwotCX0KLQotCWxvbmcgRGlyZWN0M0RSZXNvdXJjZTg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSVVua25vd24pCi0JCXsKLQkJCUFkZFJlZigpOwotCQkJKm9iamVjdCA9IHRoaXM7Ci0KLQkJCXJldHVybiBTX09LOwotCQl9Ci0KLQkJKm9iamVjdCA9IDA7Ci0KLQkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFJlc291cmNlODo6QWRkUmVmKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFJlc291cmNlODo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEUmVzb3VyY2U4OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighZGV2aWNlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXRoaXMtPmRldmljZS0+QWRkUmVmKCk7Ci0JCSpkZXZpY2UgPSB0aGlzLT5kZXZpY2U7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEUmVzb3VyY2U4OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcHJpdmF0ZURhdGFbZ3VpZF0gPSBQcml2YXRlRGF0YShkYXRhLCBzaXplLCBmbGFncyA9PSBEM0RTUERfSVVOS05PV04pOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFJlc291cmNlODo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlJdGVyYXRvciByZXN1bHQgPSBwcml2YXRlRGF0YS5maW5kKGd1aWQpOwotCi0JCWlmKHJlc3VsdCA9PSBwcml2YXRlRGF0YS5lbmQoKSkKLQkJewotCQkJcmV0dXJuIE5PVEZPVU5EKCk7Ci0JCX0KLQotCQlpZihyZXN1bHQtPnNlY29uZC5zaXplID4gKnNpemUpCi0JCXsKLQkJCXJldHVybiBNT1JFREFUQSgpOwotCQl9Ci0KLQkJbWVtY3B5KGRhdGEsIHJlc3VsdC0+c2Vjb25kLmRhdGEsIHJlc3VsdC0+c2Vjb25kLnNpemUpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFJlc291cmNlODo6RnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJSXRlcmF0b3IgcmVzdWx0ID0gcHJpdmF0ZURhdGEuZmluZChndWlkKTsKLQotCQlpZihyZXN1bHQgPT0gcHJpdmF0ZURhdGEuZW5kKCkpCi0JCXsKLQkJCXJldHVybiBEM0RFUlJfTk9URk9VTkQ7Ci0JCX0KLQkJCi0JCXByaXZhdGVEYXRhLmVyYXNlKGd1aWQpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFJlc291cmNlODo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQl1bnNpZ25lZCBsb25nIG9sZFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JCXByaW9yaXR5ID0gbmV3UHJpb3JpdHk7Ci0KLQkJcmV0dXJuIG9sZFByaW9yaXR5OwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RSZXNvdXJjZTg6OkdldFByaW9yaXR5KCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gcHJpb3JpdHk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFJlc291cmNlODo6UHJlTG9hZCgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuOyAgIC8vIEZJWE1FOiBBbnl0aGluZyB0byBkbz8KLQl9Ci0KLQlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RSZXNvdXJjZTg6OkdldFR5cGUoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXVuc2lnbmVkIGludCBEaXJlY3QzRFJlc291cmNlODo6Z2V0TWVtb3J5VXNhZ2UoKQotCXsKLQkJcmV0dXJuIG1lbW9yeVVzYWdlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFJlc291cmNlOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRFJlc291cmNlOC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZWNjYzYuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RSZXNvdXJjZTguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q4X0RpcmVjdDNEUmVzb3VyY2U4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNEUmVzb3VyY2U4X2hwcAotCi0jaW5jbHVkZSAiVW5rbm93bi5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q4Lmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JY2xhc3MgRGlyZWN0M0REZXZpY2U4OwotCi0JY2xhc3MgRGlyZWN0M0RSZXNvdXJjZTggOiBwdWJsaWMgSURpcmVjdDNEUmVzb3VyY2U4LCBwdWJsaWMgVW5rbm93bgotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEUmVzb3VyY2U4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IHNpemUpOwotCi0JCX5EaXJlY3QzRFJlc291cmNlOCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKSBvdmVycmlkZTsKLQkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQlzdGF0aWMgdW5zaWduZWQgaW50IGdldE1lbW9yeVVzYWdlKCk7Ci0KLQlwcm90ZWN0ZWQ6Ci0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJRGlyZWN0M0REZXZpY2U4ICpjb25zdCBkZXZpY2U7Ci0JCWNvbnN0IEQzRFJFU09VUkNFVFlQRSB0eXBlOwotCQljb25zdCB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCXByaXZhdGU6Ci0JCXVuc2lnbmVkIGxvbmcgcHJpb3JpdHk7Ci0KLQkJc3RydWN0IFByaXZhdGVEYXRhCi0JCXsKLQkJCVByaXZhdGVEYXRhKCk7Ci0JCQlQcml2YXRlRGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQgc2l6ZSwgYm9vbCBtYW5hZ2VkKTsKLQotCQkJflByaXZhdGVEYXRhKCk7Ci0KLQkJCVByaXZhdGVEYXRhICZvcGVyYXRvcj0oY29uc3QgUHJpdmF0ZURhdGEgJnByaXZhdGVEYXRhKTsKLQotCQkJdm9pZCAqZGF0YTsKLQkJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQkJCWJvb2wgbWFuYWdlZDsgICAvLyBJVW5rbm93biBpbnRlcmZhY2UKLQkJfTsKLQotCQlzdHJ1Y3QgQ29tcGFyZUdVSUQKLQkJewotCQkJYm9vbCBvcGVyYXRvcigpKGNvbnN0IEdVSUQmIGxlZnQsIGNvbnN0IEdVSUQmIHJpZ2h0KSBjb25zdAotCQkJewotCQkJCXJldHVybiBtZW1jbXAoJmxlZnQsICZyaWdodCwgc2l6ZW9mKEdVSUQpKSA8IDA7Ci0JCQl9Ci0JCX07Ci0KLQkJdHlwZWRlZiBzdGQ6Om1hcDxHVUlELCBQcml2YXRlRGF0YSwgQ29tcGFyZUdVSUQ+IFByaXZhdGVEYXRhTWFwOwotCQl0eXBlZGVmIFByaXZhdGVEYXRhTWFwOjppdGVyYXRvciBJdGVyYXRvcjsKLQkJUHJpdmF0ZURhdGFNYXAgcHJpdmF0ZURhdGE7Ci0KLQkJc3RhdGljIHVuc2lnbmVkIGludCBtZW1vcnlVc2FnZTsKLQl9OwotfQotCi0jZW5kaWYgICAvLyBEM0Q4X0RpcmVjdDNEUmVzb3VyY2U4X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RTdGF0ZUJsb2NrOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFN0YXRlQmxvY2s4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyYzkzNS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzRFN0YXRlQmxvY2s4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RTdGF0ZUJsb2NrOC5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTguaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEQmFzZVRleHR1cmU4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFZlcnRleEJ1ZmZlcjguaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNESW5kZXhCdWZmZXI4LmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQlEaXJlY3QzRFN0YXRlQmxvY2s4OjpEaXJlY3QzRFN0YXRlQmxvY2s4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBEM0RTVEFURUJMT0NLVFlQRSB0eXBlKSA6IGRldmljZShkZXZpY2UpLCB0eXBlKHR5cGUpCi0JewotCQl2ZXJ0ZXhTaGFkZXJIYW5kbGUgPSAwOwotCQlwaXhlbFNoYWRlckhhbmRsZSA9IDA7Ci0JCWluZGV4QnVmZmVyID0gMDsKLQotCQlmb3IoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IDE2OyBzdHJlYW0rKykKLQkJewotCQkJc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyID0gMDsKLQkJfQotCi0JCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCi0JCXsKLQkJCXRleHR1cmVbc3RhZ2VdID0gMDsKLQkJfQotCi0JCWNsZWFyKCk7Ci0KLQkJaWYodHlwZSA9PSBEM0RTQlRfUElYRUxTVEFURSB8fCB0eXBlID09IEQzRFNCVF9BTEwpCi0JCXsKLQkJCWNhcHR1cmVQaXhlbFJlbmRlclN0YXRlcygpOwotCQkJY2FwdHVyZVBpeGVsVGV4dHVyZVN0YXRlcygpOwotCQkJY2FwdHVyZVBpeGVsU2hhZGVyU3RhdGVzKCk7Ci0JCX0KLQkJCi0JCWlmKHR5cGUgPT0gRDNEU0JUX1ZFUlRFWFNUQVRFIHx8IHR5cGUgPT0gRDNEU0JUX0FMTCkKLQkJewotCQkJY2FwdHVyZVZlcnRleFJlbmRlclN0YXRlcygpOwotCQkJY2FwdHVyZVZlcnRleFRleHR1cmVTdGF0ZXMoKTsKLQkJCWNhcHR1cmVMaWdodFN0YXRlcygpOwotCQkJY2FwdHVyZVZlcnRleFNoYWRlclN0YXRlcygpOwotCQl9Ci0KLQkJaWYodHlwZSA9PSBEM0RTQlRfQUxMKSAgIC8vIENhcHR1cmUgcmVtYWluaW5nIHN0YXRlcwotCQl7Ci0JCQljYXB0dXJlVGV4dHVyZXMoKTsKLQkJCWNhcHR1cmVWZXJ0ZXhUZXh0dXJlcygpOwotCQkJY2FwdHVyZURpc3BsYWNlbWVudFRleHR1cmVzKCk7Ci0JCQljYXB0dXJlVGV4dHVyZVBhbGV0dGUoKTsKLQkJCWNhcHR1cmVWZXJ0ZXhTdHJlYW1zKCk7Ci0JCQljYXB0dXJlSW5kZXhCdWZmZXIoKTsKLQkJCWNhcHR1cmVWaWV3cG9ydCgpOwotCQkJY2FwdHVyZVRyYW5zZm9ybXMoKTsKLQkJCWNhcHR1cmVUZXh0dXJlVHJhbnNmb3JtcygpOwotCQkJY2FwdHVyZUNsaXBwaW5nUGxhbmVzKCk7Ci0JCQljYXB0dXJlTWF0ZXJpYWwoKTsKLQkJfQotCX0KLQotCURpcmVjdDNEU3RhdGVCbG9jazg6On5EaXJlY3QzRFN0YXRlQmxvY2s4KCkKLQl7Ci0JCWNsZWFyKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN0YXRlQmxvY2s4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlBU1NFUlQoZmFsc2UpOyAgIC8vIEludGVybmFsIG9iamVjdAotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTdGF0ZUJsb2NrODo6QWRkUmVmKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7Ci0JfQotCQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTdGF0ZUJsb2NrODo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3RhdGVCbG9jazg6OkFwcGx5KCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZih2ZXJ0ZXhTaGFkZXJDYXB0dXJlZCkKLQkJewotCQkJZGV2aWNlLT5TZXRWZXJ0ZXhTaGFkZXIodmVydGV4U2hhZGVySGFuZGxlKTsKLQkJfQotCi0JCWlmKHBpeGVsU2hhZGVyQ2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+U2V0UGl4ZWxTaGFkZXIocGl4ZWxTaGFkZXJIYW5kbGUpOwotCQl9Ci0KLQkJaWYoaW5kZXhCdWZmZXJDYXB0dXJlZCkKLQkJewotCQkJZGV2aWNlLT5TZXRJbmRpY2VzKGluZGV4QnVmZmVyLCBiYXNlVmVydGV4SW5kZXgpOwotCQl9Ci0KLQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEUlNfTk9STUFMT1JERVIgKyAxOyBzdGF0ZSsrKQotCQl7Ci0JCQlpZihyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSkKLQkJCXsKLQkJCQlkZXZpY2UtPlNldFJlbmRlclN0YXRlKChEM0RSRU5ERVJTVEFURVRZUEUpc3RhdGUsIHJlbmRlclN0YXRlW3N0YXRlXSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQotCQl7Ci0JCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCBEM0RUU1NfUkVTVUxUQVJHICsgMTsgc3RhdGUrKykKLQkJCXsKLQkJCQlpZih0ZXh0dXJlU3RhZ2VTdGF0ZUNhcHR1cmVkW3N0YWdlXVtzdGF0ZV0pCi0JCQkJewotCQkJCQlkZXZpY2UtPlNldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCAoRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFKXN0YXRlLCB0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bc3RhdGVdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IDE2OyBzdHJlYW0rKykKLQkJewotCQkJaWYoc3RyZWFtU291cmNlQ2FwdHVyZWRbc3RyZWFtXSkKLQkJCXsKLQkJCQlkZXZpY2UtPlNldFN0cmVhbVNvdXJjZShzdHJlYW0sIHN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciwgc3RyZWFtU291cmNlW3N0cmVhbV0uc3RyaWRlKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCi0JCXsKLQkJCWlmKHRleHR1cmVDYXB0dXJlZFtzdGFnZV0pCi0JCQl7Ci0JCQkJZGV2aWNlLT5TZXRUZXh0dXJlKHN0YWdlLCB0ZXh0dXJlW3N0YWdlXSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCA1MTI7IHN0YXRlKyspCi0JCXsKLQkJCWlmKHRyYW5zZm9ybUNhcHR1cmVkW3N0YXRlXSkKLQkJCXsKLQkJCQlkZXZpY2UtPlNldFRyYW5zZm9ybSgoRDNEVFJBTlNGT1JNU1RBVEVUWVBFKXN0YXRlLCAmdHJhbnNmb3JtW3N0YXRlXSk7Ci0JCQl9Ci0JCX0KLQotCQlpZih2aWV3cG9ydENhcHR1cmVkKQotCQl7Ci0JCQlkZXZpY2UtPlNldFZpZXdwb3J0KCZ2aWV3cG9ydCk7Ci0JCX0KLQotCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKQotCQl7Ci0JCQlpZihjbGlwUGxhbmVDYXB0dXJlZFtpbmRleF0pCi0JCQl7Ci0JCQkJZGV2aWNlLT5TZXRDbGlwUGxhbmUoaW5kZXgsIGNsaXBQbGFuZVtpbmRleF0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3RhdGVCbG9jazg6OkNhcHR1cmUoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKHZlcnRleFNoYWRlckNhcHR1cmVkKQotCQl7CQkKLQkJCWRldmljZS0+R2V0VmVydGV4U2hhZGVyKCZ2ZXJ0ZXhTaGFkZXJIYW5kbGUpOwotCQl9Ci0KLQkJaWYocGl4ZWxTaGFkZXJDYXB0dXJlZCkKLQkJewkJCi0JCQlkZXZpY2UtPkdldFBpeGVsU2hhZGVyKCZwaXhlbFNoYWRlckhhbmRsZSk7Ci0JCX0KLQotCQlpZihpbmRleEJ1ZmZlckNhcHR1cmVkKQotCQl7Ci0JCQlpZihpbmRleEJ1ZmZlcikKLQkJCXsKLQkJCQlpbmRleEJ1ZmZlci0+UmVsZWFzZSgpOwotCQkJfQotCi0JCQlkZXZpY2UtPkdldEluZGljZXMocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RJbmRleEJ1ZmZlcjgqKj4oJmluZGV4QnVmZmVyKSwgJmJhc2VWZXJ0ZXhJbmRleCk7Ci0JCX0KLQotCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCBEM0RSU19OT1JNQUxPUkRFUiArIDE7IHN0YXRlKyspCi0JCXsKLQkJCWlmKHJlbmRlclN0YXRlQ2FwdHVyZWRbc3RhdGVdKQotCQkJewotCQkJCWRldmljZS0+R2V0UmVuZGVyU3RhdGUoKEQzRFJFTkRFUlNUQVRFVFlQRSlzdGF0ZSwgJnJlbmRlclN0YXRlW3N0YXRlXSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQotCQl7Ci0JCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCBEM0RUU1NfUkVTVUxUQVJHICsgMTsgc3RhdGUrKykKLQkJCXsKLQkJCQlpZih0ZXh0dXJlU3RhZ2VTdGF0ZUNhcHR1cmVkW3N0YWdlXVtzdGF0ZV0pCi0JCQkJewotCQkJCQlkZXZpY2UtPkdldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCAoRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFKXN0YXRlLCAmdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3N0YXRlXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCi0JCXsKLQkJCWlmKHN0cmVhbVNvdXJjZUNhcHR1cmVkW3N0cmVhbV0pCi0JCQl7Ci0JCQkJaWYoc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyKQotCQkJCXsKLQkJCQkJc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyLT5SZWxlYXNlKCk7Ci0JCQkJfQotCi0JCQkJZGV2aWNlLT5HZXRTdHJlYW1Tb3VyY2Uoc3RyZWFtLCByZWludGVycHJldF9jYXN0PElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgqKj4oJnN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciksICZzdHJlYW1Tb3VyY2Vbc3RyZWFtXS5zdHJpZGUpOwotCQkJfQotCQl9Ci0KLQkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKLQkJewotCQkJaWYodGV4dHVyZUNhcHR1cmVkW3N0YWdlXSkKLQkJCXsKLQkJCQlpZih0ZXh0dXJlW3N0YWdlXSkKLQkJCQl7Ci0JCQkJCXRleHR1cmVbc3RhZ2VdLT5SZWxlYXNlKCk7Ci0JCQkJfQotCi0JCQkJZGV2aWNlLT5HZXRUZXh0dXJlKHN0YWdlLCByZWludGVycHJldF9jYXN0PElEaXJlY3QzREJhc2VUZXh0dXJlOCoqPigmdGV4dHVyZVtzdGFnZV0pKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IDUxMjsgc3RhdGUrKykKLQkJewotCQkJaWYodHJhbnNmb3JtQ2FwdHVyZWRbc3RhdGVdKQotCQkJewotCQkJCWRldmljZS0+R2V0VHJhbnNmb3JtKChEM0RUUkFOU0ZPUk1TVEFURVRZUEUpc3RhdGUsICZ0cmFuc2Zvcm1bc3RhdGVdKTsKLQkJCX0KLQkJfQotCi0JCWlmKHZpZXdwb3J0Q2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+R2V0Vmlld3BvcnQoJnZpZXdwb3J0KTsKLQkJfQotCi0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4KyspCi0JCXsKLQkJCWlmKGNsaXBQbGFuZUNhcHR1cmVkW2luZGV4XSkKLQkJCXsKLQkJCQlkZXZpY2UtPkdldENsaXBQbGFuZShpbmRleCwgY2xpcFBsYW5lW2luZGV4XSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RTdGF0ZUJsb2NrODo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRldmljZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl0aGlzLT5kZXZpY2UtPkFkZFJlZigpOwotCQkqZGV2aWNlID0gdGhpcy0+ZGV2aWNlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpsaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgZW5hYmxlKQotCXsKLQkJVU5JTVBMRU1FTlRFRCgpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6c2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSkKLQl7Ci0JCWNsaXBQbGFuZUNhcHR1cmVkW2luZGV4XSA9IHRydWU7Ci0JCWNsaXBQbGFuZVtpbmRleF1bMF0gPSBwbGFuZVswXTsKLQkJY2xpcFBsYW5lW2luZGV4XVsxXSA9IHBsYW5lWzFdOwotCQljbGlwUGxhbmVbaW5kZXhdWzJdID0gcGxhbmVbMl07Ci0JCWNsaXBQbGFuZVtpbmRleF1bM10gPSBwbGFuZVszXTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcikKLQl7Ci0JCVVOSU1QTEVNRU5URUQoKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldEZWRih1bnNpZ25lZCBsb25nIEZWRikKLQl7Ci0JCVVOSU1QTEVNRU5URUQoKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldEluZGljZXMoRGlyZWN0M0RJbmRleEJ1ZmZlcjggKmluZGV4RGF0YSwgdW5zaWduZWQgaW50IGJhc2VWZXJ0ZXhJbmRleCkKLQl7Ci0JCWlmKGluZGV4RGF0YSkgaW5kZXhEYXRhLT5BZGRSZWYoKTsKLQotCQlpbmRleEJ1ZmZlckNhcHR1cmVkID0gdHJ1ZTsKLQkJaW5kZXhCdWZmZXIgPSBpbmRleERhdGE7Ci0JCXRoaXMtPmJhc2VWZXJ0ZXhJbmRleCA9IGJhc2VWZXJ0ZXhJbmRleDsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IEQzRExJR0hUOCAqbGlnaHQpCi0JewotCQlVTklNUExFTUVOVEVEKCk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRNYXRlcmlhbChjb25zdCBEM0RNQVRFUklBTDggKm1hdGVyaWFsKQotCXsKLQkJVU5JTVBMRU1FTlRFRCgpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6c2V0UGl4ZWxTaGFkZXIodW5zaWduZWQgbG9uZyBzaGFkZXJIYW5kbGUpCQkKLQl7Ci0JCXBpeGVsU2hhZGVyQ2FwdHVyZWQgPSB0cnVlOwotCQlwaXhlbFNoYWRlckhhbmRsZSA9IHNoYWRlckhhbmRsZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFBpeGVsU2hhZGVyQ29uc3RhbnQodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IHZvaWQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJVU5JTVBMRU1FTlRFRCgpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6c2V0UmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotCXsKLQkJcmVuZGVyU3RhdGVDYXB0dXJlZFtzdGF0ZV0gPSB0cnVlOwotCQlyZW5kZXJTdGF0ZVtzdGF0ZV0gPSB2YWx1ZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFNjaXNzb3JSZWN0KGNvbnN0IFJFQ1QgKnJlY3QpCi0JewotCQlVTklNUExFTUVOVEVEKCk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICpkYXRhLCB1bnNpZ25lZCBpbnQgc3RyaWRlKQotCXsKLQkJaWYoZGF0YSkgZGF0YS0+QWRkUmVmKCk7Ci0KLQkJc3RyZWFtU291cmNlQ2FwdHVyZWRbc3RyZWFtXSA9IHRydWU7Ci0JCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IGRhdGE7Ci0JCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnN0cmlkZSA9IHN0cmlkZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFRleHR1cmUodW5zaWduZWQgbG9uZyBzdGFnZSwgRGlyZWN0M0RCYXNlVGV4dHVyZTggKnRleHR1cmUpCi0JewotCQlpZih0ZXh0dXJlKSB0ZXh0dXJlLT5BZGRSZWYoKTsKLQotCQl0ZXh0dXJlQ2FwdHVyZWRbc3RhZ2VdID0gdHJ1ZTsKLQkJdGhpcy0+dGV4dHVyZVtzdGFnZV0gPSB0ZXh0dXJlOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6c2V0VGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi0JewotCQl0ZXh0dXJlU3RhZ2VTdGF0ZUNhcHR1cmVkW3N0YWdlXVt0eXBlXSA9IHRydWU7Ci0JCXRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVt0eXBlXSA9IHZhbHVlOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6c2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpCi0JewotCQl0cmFuc2Zvcm1DYXB0dXJlZFtzdGF0ZV0gPSB0cnVlOwotCQl0cmFuc2Zvcm1bc3RhdGVdID0gKm1hdHJpeDsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFZpZXdwb3J0KGNvbnN0IEQzRFZJRVdQT1JUOCAqdmlld3BvcnQpCi0JewotCQl2aWV3cG9ydENhcHR1cmVkID0gdHJ1ZTsKLQkJdGhpcy0+dmlld3BvcnQgPSAqdmlld3BvcnQ7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRWZXJ0ZXhTaGFkZXIodW5zaWduZWQgbG9uZyBzaGFkZXJIYW5kbGUpCi0JewotCQl2ZXJ0ZXhTaGFkZXJDYXB0dXJlZCA9IHRydWU7Ci0JCXZlcnRleFNoYWRlckhhbmRsZSA9IHNoYWRlckhhbmRsZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFZlcnRleFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKLQl7Ci0JCVVOSU1QTEVNRU5URUQoKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNsZWFyKCkKLQl7Ci0JCS8vIEVyYXNlIGNhcHR1cmUgZmxhZ3MKLQkJdmVydGV4U2hhZGVyQ2FwdHVyZWQgPSBmYWxzZTsKLQkJcGl4ZWxTaGFkZXJDYXB0dXJlZCA9IGZhbHNlOwotCQlpbmRleEJ1ZmZlckNhcHR1cmVkID0gZmFsc2U7Ci0KLQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEUlNfTk9STUFMT1JERVIgKyAxOyBzdGF0ZSsrKQotCQl7Ci0JCQlyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSA9IGZhbHNlOwotCQl9Ci0KLQkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKLQkJewotCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEVFNTX1JFU1VMVEFSRyArIDE7IHN0YXRlKyspCi0JCQl7Ci0JCQkJdGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bc3RhdGVdID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IDE2OyBzdHJlYW0rKykKLQkJewotCQkJc3RyZWFtU291cmNlQ2FwdHVyZWRbc3RyZWFtXSA9IGZhbHNlOwotCQl9Ci0KLQkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKLQkJewotCQkJdGV4dHVyZUNhcHR1cmVkW3N0YWdlXSA9IGZhbHNlOwotCQl9Ci0KLQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgNTEyOyBzdGF0ZSsrKQotCQl7Ci0JCQl0cmFuc2Zvcm1DYXB0dXJlZFtzdGF0ZV0gPSBmYWxzZTsKLQkJfQotCi0JCXZpZXdwb3J0Q2FwdHVyZWQgPSBmYWxzZTsKLQotCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKQotCQl7Ci0JCQljbGlwUGxhbmVDYXB0dXJlZFtpbmRleF0gPSBmYWxzZTsKLQkJfQotCi0JCS8vIFJlbGVhc2UgcmVzb3VyY2VzCi0JCXZlcnRleFNoYWRlckhhbmRsZSA9IDA7Ci0JCXBpeGVsU2hhZGVySGFuZGxlID0gMDsKLQotCQlpZihpbmRleEJ1ZmZlcikKLQkJewotCQkJaW5kZXhCdWZmZXItPlJlbGVhc2UoKTsKLQkJCWluZGV4QnVmZmVyID0gMDsKLQkJfQotCi0JCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgMTY7IHN0cmVhbSsrKQotCQl7Ci0JCQlpZihzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpCi0JCQl7Ci0JCQkJc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyLT5SZWxlYXNlKCk7Ci0JCQkJc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyID0gMDsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCi0JCXsKLQkJCWlmKHRleHR1cmVbc3RhZ2VdKQotCQkJewotCQkJCXRleHR1cmVbc3RhZ2VdLT5SZWxlYXNlKCk7Ci0JCQkJdGV4dHVyZVtzdGFnZV0gPSAwOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlUmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlKQotCXsKLQkJZGV2aWNlLT5HZXRSZW5kZXJTdGF0ZShzdGF0ZSwgJnJlbmRlclN0YXRlW3N0YXRlXSk7Ci0JCXJlbmRlclN0YXRlQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSkKLQl7Ci0JCWRldmljZS0+R2V0VGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIHR5cGUsICZ0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bdHlwZV0pOwotCQl0ZXh0dXJlU3RhZ2VTdGF0ZUNhcHR1cmVkW3N0YWdlXVt0eXBlXSA9IHRydWU7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSkKLQl7Ci0JCWRldmljZS0+R2V0VHJhbnNmb3JtKHN0YXRlLCAmdHJhbnNmb3JtW3N0YXRlXSk7Ci0JCXRyYW5zZm9ybUNhcHR1cmVkW3N0YXRlXSA9IHRydWU7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlUGl4ZWxSZW5kZXJTdGF0ZXMoKQotCXsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1pFTkFCTEUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRklMTE1PREUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU0hBREVNT0RFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1pXUklURUVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BTFBIQVRFU1RFTkFCTEUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTEFTVFBJWEVMKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NSQ0JMRU5EKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0RFU1RCTEVORCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19aRlVOQyk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BTFBIQVJFRik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BTFBIQUZVTkMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRElUSEVSRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR1NUQVJUKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0VORCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dERU5TSVRZKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfWkJJQVMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMRkFJTCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMWkZBSUwpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFBBU1MpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEZVTkMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFJFRik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMTUFTSyk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMV1JJVEVNQVNLKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1RFWFRVUkVGQUNUT1IpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDApOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDEpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDIpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDQpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDYpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDcpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ09MT1JXUklURUVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19CTEVORE9QKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVQaXhlbFRleHR1cmVTdGF0ZXMoKQotCXsKLQkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKLQkJewotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQ09MT1JPUCk7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19DT0xPUkFSRzEpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQ09MT1JBUkcyKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FMUEhBT1ApOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUxQSEFBUkcxKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FMUEhBQVJHMik7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTUFUMDApOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQlVNUEVOVk1BVDAxKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0JVTVBFTlZNQVQxMCk7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTUFUMTEpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfVEVYQ09PUkRJTkRFWCk7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTFNDQUxFKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyk7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19DT0xPUkFSRzApOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUxQSEFBUkcwKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1JFU1VMVEFSRyk7Ci0JCQotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUREUkVTU1UpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUREUkVTU1YpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUREUkVTU1cpOyAKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0JPUkRFUkNPTE9SKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX01BR0ZJTFRFUik7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19NSU5GSUxURVIpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfTUlQRklMVEVSKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX01JUE1BUExPREJJQVMpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfTUFYTUlQTEVWRUwpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfTUFYQU5JU09UUk9QWSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVQaXhlbFNoYWRlclN0YXRlcygpCi0JewotCQlwaXhlbFNoYWRlckNhcHR1cmVkID0gdHJ1ZTsKLQkJZGV2aWNlLT5HZXRQaXhlbFNoYWRlcigmcGl4ZWxTaGFkZXJIYW5kbGUpOwotCi0JCWRldmljZS0+R2V0UGl4ZWxTaGFkZXJDb25zdGFudCgwLCBwaXhlbFNoYWRlckNvbnN0YW50LCA4KTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVWZXJ0ZXhSZW5kZXJTdGF0ZXMoKQotCXsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NVTExNT0RFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0VOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dDT0xPUik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dUQUJMRU1PREUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HU1RBUlQpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HRU5EKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0RFTlNJVFkpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUkFOR0VGT0dFTkFCTEUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQU1CSUVOVCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DT0xPUlZFUlRFWCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dWRVJURVhNT0RFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NMSVBQSU5HKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0xJR0hUSU5HKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0xPQ0FMVklFV0VSKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0UpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQU1CSUVOVE1BVEVSSUFMU09VUkNFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1ZFUlRFWEJMRU5EKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NMSVBQTEFORUVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTSVpFX01JTik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNQUklURUVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVfQSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFX0IpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRV9DKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX01VTFRJU0FNUExFTUFTSyk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QQVRDSEVER0VTVFlMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkVfTUFYKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0lOREVYRURWRVJURVhCTEVOREVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19UV0VFTkZBQ1RPUik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19OT1JNQUxJWkVOT1JNQUxTKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NQRUNVTEFSRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NIQURFTU9ERSk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVmVydGV4VGV4dHVyZVN0YXRlcygpCi0JewotCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQotCQl7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19URVhDT09SRElOREVYKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyk7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVMaWdodFN0YXRlcygpCi0JewotCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAotCQl7Ci0JCQlkZXZpY2UtPkdldExpZ2h0KGluZGV4LCAmbGlnaHRbaW5kZXhdKTsKLQkJCWxpZ2h0Q2FwdHVyZWRbaW5kZXhdID0gdHJ1ZTsKLQkJfQotCi0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspICAgLy8gRklYTUU6IFN1cHBvcnQgdW5saW1pdGVkIGluZGV4Ci0JCXsKLQkJCWxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdID0gZmFsc2U7Ci0JCQlkZXZpY2UtPkdldExpZ2h0RW5hYmxlKGluZGV4LCAmbGlnaHRFbmFibGVTdGF0ZVtpbmRleF0pOwotCQkJbGlnaHRFbmFibGVDYXB0dXJlZFtpbmRleF0gPSB0cnVlOwotCQl9Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVmVydGV4U2hhZGVyU3RhdGVzKCkKLQl7Ci0JCXZlcnRleFNoYWRlckNhcHR1cmVkID0gdHJ1ZTsKLQkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXIoJnZlcnRleFNoYWRlckhhbmRsZSk7Ci0KLQkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCgwLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudFswXSwgMjU2KTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVUZXh0dXJlcygpCi0JewotCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgODsgc2FtcGxlcisrKQotCQl7Ci0JCQl0ZXh0dXJlQ2FwdHVyZWRbc2FtcGxlcl0gPSB0cnVlOwotCQkJZGV2aWNlLT5HZXRUZXh0dXJlKHNhbXBsZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8SURpcmVjdDNEQmFzZVRleHR1cmU4Kio+KCZ0ZXh0dXJlW3NhbXBsZXJdKSk7Ci0KLQkJCWlmKHRleHR1cmVbc2FtcGxlcl0pCi0JCQl7Ci0JCQkJdGV4dHVyZVtzYW1wbGVyXS0+YmluZCgpOwotCQkJCXRleHR1cmVbc2FtcGxlcl0tPlJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVZlcnRleFRleHR1cmVzKCkKLQl7Ci0JCS8vIEZJWE1FCi0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlRGlzcGxhY2VtZW50VGV4dHVyZXMoKQotCXsKLQkJLy8gRklYTUUJCi0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVGV4dHVyZVBhbGV0dGUoKQotCXsKLQkJcGFsZXR0ZU51bWJlckNhcHR1cmVkID0gdHJ1ZTsKLQkJZGV2aWNlLT5HZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUoJnBhbGV0dGVOdW1iZXIpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVZlcnRleFN0cmVhbXMoKQotCXsKLQkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCi0JCXsKLQkJCXN0cmVhbVNvdXJjZUNhcHR1cmVkW3N0cmVhbV0gPSB0cnVlOwotCQkJZGV2aWNlLT5HZXRTdHJlYW1Tb3VyY2Uoc3RyZWFtLCByZWludGVycHJldF9jYXN0PElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgqKj4oJnN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciksICAmc3RyZWFtU291cmNlW3N0cmVhbV0uc3RyaWRlKTsKLQkJCQotCQkJaWYoc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyKQotCQkJewotCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlci0+YmluZCgpOwotCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlci0+UmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlSW5kZXhCdWZmZXIoKQotCXsKLQkJaW5kZXhCdWZmZXJDYXB0dXJlZCA9IHRydWU7Ci0JCWRldmljZS0+R2V0SW5kaWNlcyhyZWludGVycHJldF9jYXN0PElEaXJlY3QzREluZGV4QnVmZmVyOCoqPigmaW5kZXhCdWZmZXIpLCAmYmFzZVZlcnRleEluZGV4KTsKLQotCQlpZihpbmRleEJ1ZmZlcikKLQkJewotCQkJaW5kZXhCdWZmZXItPmJpbmQoKTsKLQkJCWluZGV4QnVmZmVyLT5SZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVWaWV3cG9ydCgpCi0JewotCQlkZXZpY2UtPkdldFZpZXdwb3J0KCZ2aWV3cG9ydCk7Ci0JCXZpZXdwb3J0Q2FwdHVyZWQgPSB0cnVlOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVRyYW5zZm9ybXMoKQotCXsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19WSUVXKTsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19QUk9KRUNUSU9OKTsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19XT1JMRCk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVGV4dHVyZVRyYW5zZm9ybXMoKQotCXsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFMCk7Ci0JCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTEpOwotCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUyKTsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFMyk7Ci0JCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTQpOwotCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU1KTsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFNik7Ci0JCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTcpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZUNsaXBwaW5nUGxhbmVzKCkKLQl7Ci0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4KyspCi0JCXsKLQkJCWRldmljZS0+R2V0Q2xpcFBsYW5lKGluZGV4LCAoZmxvYXQqKSZjbGlwUGxhbmVbaW5kZXhdKTsKLQkJCWNsaXBQbGFuZUNhcHR1cmVkW2luZGV4XSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVNYXRlcmlhbCgpCi0JewotCQlkZXZpY2UtPkdldE1hdGVyaWFsKCZtYXRlcmlhbCk7Ci0JCW1hdGVyaWFsQ2FwdHVyZWQgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFN0YXRlQmxvY2s4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEU3RhdGVCbG9jazguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDYwMmFhLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEU3RhdGVCbG9jazguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOF9EaXJlY3QzRFN0YXRlQmxvY2s4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNEU3RhdGVCbG9jazhfaHBwCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGQzZDguaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzRERldmljZTg7Ci0JY2xhc3MgRGlyZWN0M0RCYXNlVGV4dHVyZTg7Ci0JY2xhc3MgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OwotCWNsYXNzIERpcmVjdDNESW5kZXhCdWZmZXI4OwotCi0JY2xhc3MgRGlyZWN0M0RTdGF0ZUJsb2NrOCA6IHB1YmxpYyBVbmtub3duCi0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RTdGF0ZUJsb2NrOChEaXJlY3QzRERldmljZTggKmRldmljZSwgRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSk7Ci0KLQkJfkRpcmVjdDNEU3RhdGVCbG9jazgoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQlsb25nIF9fc3RkY2FsbCBBcHBseSgpOwotCQlsb25nIF9fc3RkY2FsbCBDYXB0dXJlKCk7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKTsKLQotCQkvLyBJbnRlcm5hbCBtZXRob2RzCi0JCXZvaWQgbGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCwgaW50IGVuYWJsZSk7Ci0JCXZvaWQgc2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSk7Ci0JCXZvaWQgc2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyKTsKLQkJdm9pZCBzZXRGVkYodW5zaWduZWQgbG9uZyBGVkYpOwotCQl2b2lkIHNldEluZGljZXMoRGlyZWN0M0RJbmRleEJ1ZmZlcjggKmluZGV4RGF0YSwgdW5zaWduZWQgaW50IGJhc2VWZXJ0ZXhJbmRleCk7Ci0JCXZvaWQgc2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgRDNETElHSFQ4ICpsaWdodCk7Ci0JCXZvaWQgc2V0TWF0ZXJpYWwoY29uc3QgRDNETUFURVJJQUw4ICptYXRlcmlhbCk7Ci0JCXZvaWQgc2V0UGl4ZWxTaGFkZXIodW5zaWduZWQgbG9uZyBzaGFkZXJIYW5kbGUpOwotCQl2b2lkIHNldFBpeGVsU2hhZGVyQ29uc3RhbnQodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IHZvaWQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsKLQkJdm9pZCBzZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOwotCQl2b2lkIHNldFNjaXNzb3JSZWN0KGNvbnN0IFJFQ1QgKnJlY3QpOwotCQl2b2lkIHNldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtLCBEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKmRhdGEsIHVuc2lnbmVkIGludCBzdHJpZGUpOwotCQl2b2lkIHNldFRleHR1cmUodW5zaWduZWQgbG9uZyBzdGFnZSwgRGlyZWN0M0RCYXNlVGV4dHVyZTggKnRleHR1cmUpOwotCQl2b2lkIHNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKLQkJdm9pZCBzZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCk7Ci0JCXZvaWQgc2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ4ICp2aWV3cG9ydCk7Ci0JCXZvaWQgc2V0VmVydGV4U2hhZGVyKHVuc2lnbmVkIGxvbmcgc2hhZGVySGFuZGxlKTsKLQkJdm9pZCBzZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3Qgdm9pZCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOwotCi0JcHJpdmF0ZToKLQkJLy8gSW5kaXZpZHVhbCBzdGF0ZXMKLQkJdm9pZCBjYXB0dXJlUmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlKTsKLQkJdm9pZCBjYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUpOwotCQl2b2lkIGNhcHR1cmVUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlKTsKLQotCQkvLyBQaXhlbCBzdGF0ZXMKLQkJdm9pZCBjYXB0dXJlUGl4ZWxSZW5kZXJTdGF0ZXMoKTsKLQkJdm9pZCBjYXB0dXJlUGl4ZWxUZXh0dXJlU3RhdGVzKCk7Ci0JCXZvaWQgY2FwdHVyZVBpeGVsU2hhZGVyU3RhdGVzKCk7Ci0KLQkJLy8gVmVydGV4IHN0YXRlcwotCQl2b2lkIGNhcHR1cmVWZXJ0ZXhSZW5kZXJTdGF0ZXMoKTsKLQkJdm9pZCBjYXB0dXJlVmVydGV4VGV4dHVyZVN0YXRlcygpOwotCQl2b2lkIGNhcHR1cmVMaWdodFN0YXRlcygpOwotCQl2b2lkIGNhcHR1cmVWZXJ0ZXhTaGFkZXJTdGF0ZXMoKTsKLQotCQkvLyBBbGwgKHJlbWFpbmluZykgc3RhdGVzCi0JCXZvaWQgY2FwdHVyZVRleHR1cmVzKCk7Ci0JCXZvaWQgY2FwdHVyZVZlcnRleFRleHR1cmVzKCk7Ci0JCXZvaWQgY2FwdHVyZURpc3BsYWNlbWVudFRleHR1cmVzKCk7Ci0JCXZvaWQgY2FwdHVyZVRleHR1cmVQYWxldHRlKCk7Ci0JCXZvaWQgY2FwdHVyZVZlcnRleFN0cmVhbXMoKTsKLQkJdm9pZCBjYXB0dXJlSW5kZXhCdWZmZXIoKTsKLQkJdm9pZCBjYXB0dXJlVmlld3BvcnQoKTsKLQkJdm9pZCBjYXB0dXJlVHJhbnNmb3JtcygpOwotCQl2b2lkIGNhcHR1cmVUZXh0dXJlVHJhbnNmb3JtcygpOwotCQl2b2lkIGNhcHR1cmVDbGlwcGluZ1BsYW5lcygpOwotCQl2b2lkIGNhcHR1cmVNYXRlcmlhbCgpOwotCi0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJRGlyZWN0M0REZXZpY2U4ICpjb25zdCBkZXZpY2U7Ci0JCWNvbnN0IEQzRFNUQVRFQkxPQ0tUWVBFIHR5cGU7Ci0KLQkJLy8gU3RhdGUgZGF0YQotCQlib29sIHZlcnRleFNoYWRlckNhcHR1cmVkOwotCQl1bnNpZ25lZCBsb25nIHZlcnRleFNoYWRlckhhbmRsZTsKLQotCQlib29sIHBpeGVsU2hhZGVyQ2FwdHVyZWQ7Ci0JCXVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJIYW5kbGU7Ci0KLQkJYm9vbCBpbmRleEJ1ZmZlckNhcHR1cmVkOwotCQlEaXJlY3QzREluZGV4QnVmZmVyOCAqaW5kZXhCdWZmZXI7Ci0JCXVuc2lnbmVkIGludCBiYXNlVmVydGV4SW5kZXg7Ci0KLQkJYm9vbCByZW5kZXJTdGF0ZUNhcHR1cmVkW0QzRFJTX05PUk1BTE9SREVSICsgMV07Ci0JCXVuc2lnbmVkIGxvbmcgcmVuZGVyU3RhdGVbRDNEUlNfTk9STUFMT1JERVIgKyAxXTsKLQotCQlib29sIHRleHR1cmVTdGFnZVN0YXRlQ2FwdHVyZWRbOF1bRDNEVFNTX1JFU1VMVEFSRyArIDFdOwotCQl1bnNpZ25lZCBsb25nIHRleHR1cmVTdGFnZVN0YXRlWzhdW0QzRFRTU19SRVNVTFRBUkcgKyAxXTsKLQotCQlib29sIHN0cmVhbVNvdXJjZUNhcHR1cmVkWzE2XTsKLQkJc3RydWN0IFN0cmVhbVNvdXJjZQotCQl7Ci0JCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKnZlcnRleEJ1ZmZlcjsKLQkJCXVuc2lnbmVkIGludCBzdHJpZGU7Ci0JCX07Ci0JCVN0cmVhbVNvdXJjZSBzdHJlYW1Tb3VyY2VbMTZdOwotCi0JCWJvb2wgdGV4dHVyZUNhcHR1cmVkWzhdOwotCQlEaXJlY3QzREJhc2VUZXh0dXJlOCAqdGV4dHVyZVs4XTsKLQotCQlib29sIHRyYW5zZm9ybUNhcHR1cmVkWzUxMl07Ci0JCUQzRE1BVFJJWCB0cmFuc2Zvcm1bNTEyXTsKLQotCQlib29sIHZpZXdwb3J0Q2FwdHVyZWQ7Ci0JCUQzRFZJRVdQT1JUOCB2aWV3cG9ydDsKLQotCQlib29sIGNsaXBQbGFuZUNhcHR1cmVkWzZdOwotCQlmbG9hdCBjbGlwUGxhbmVbNl1bNF07Ci0KLQkJYm9vbCBtYXRlcmlhbENhcHR1cmVkOwotCQlEM0RNQVRFUklBTDggbWF0ZXJpYWw7Ci0KLQkJYm9vbCBsaWdodENhcHR1cmVkWzhdOyAgIC8vIEZJWE1FOiBVbmxpbWl0ZWQgaW5kZXgKLQkJRDNETElHSFQ4IGxpZ2h0WzhdOwotCi0JCWJvb2wgbGlnaHRFbmFibGVDYXB0dXJlZFs4XTsgICAvLyBGSVhNRTogVW5saW1pdGVkIGluZGV4Ci0JCWludCBsaWdodEVuYWJsZVN0YXRlWzhdOwotCi0JCWZsb2F0IHBpeGVsU2hhZGVyQ29uc3RhbnRbOF1bNF07Ci0JCWZsb2F0IHZlcnRleFNoYWRlckNvbnN0YW50WzI1Nl1bNF07Ci0KLQkJYm9vbCBzY2lzc29yUmVjdENhcHR1cmVkOwotCQlSRUNUIHNjaXNzb3JSZWN0OwotCi0JCWJvb2wgcGFsZXR0ZU51bWJlckNhcHR1cmVkOwotCQl1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcjsKLQotCQl2b2lkIGNsZWFyKCk7Ci0JfTsKLX0KLQotI2VuZGlmICAgLy8gRDNEOF9EaXJlY3QzRFN0YXRlQmxvY2s4X2hwcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEU3VyZmFjZTguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0RTdXJmYWNlOC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZDFlOTYuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RTdXJmYWNlOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTguaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1leHRlcm4gYm9vbCBxdWFkTGF5b3V0RW5hYmxlZDsKLQotbmFtZXNwYWNlIEQzRDgKLXsKLQlzdGF0aWMgc3c6OlJlc291cmNlICpnZXRQYXJlbnRSZXNvdXJjZShVbmtub3duICpjb250YWluZXIpCi0JewotCQlEaXJlY3QzREJhc2VUZXh0dXJlOCAqYmFzZVRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RCYXNlVGV4dHVyZTgqPihjb250YWluZXIpOwotCi0JCWlmKGJhc2VUZXh0dXJlKQotCQl7Ci0JCQlyZXR1cm4gYmFzZVRleHR1cmUtPmdldFJlc291cmNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpbnQgc2FtcGxlQ291bnQoRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSkKLQl7Ci0JCWlmKG11bHRpU2FtcGxlID09IEQzRE1VTFRJU0FNUExFXzJfU0FNUExFUykKLQkJewotCQkJcmV0dXJuIDI7Ci0JCX0KLQkJZWxzZSBpZihtdWx0aVNhbXBsZSA9PSBEM0RNVUxUSVNBTVBMRV80X1NBTVBMRVMpCi0JCXsKLQkJCXJldHVybiA0OwotCQl9Ci0JCWVsc2UgaWYobXVsdGlTYW1wbGUgPT0gRDNETVVMVElTQU1QTEVfOF9TQU1QTEVTKQotCQl7Ci0JCQlyZXR1cm4gODsKLQkJfQotCQllbHNlIGlmKG11bHRpU2FtcGxlID09IEQzRE1VTFRJU0FNUExFXzE2X1NBTVBMRVMpCi0JCXsKLQkJCXJldHVybiAxNjsKLQkJfQotCi0JCXJldHVybiAxOwotCX0KLQotCURpcmVjdDNEU3VyZmFjZTg6OkRpcmVjdDNEU3VyZmFjZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIFVua25vd24gKmNvbnRhaW5lciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIGJvb2wgbG9ja2FibGUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCi0JCTogU3VyZmFjZShnZXRQYXJlbnRSZXNvdXJjZShjb250YWluZXIpLCB3aWR0aCwgaGVpZ2h0LCAxLCAwLCBzYW1wbGVDb3VudChtdWx0aVNhbXBsZSksIHRyYW5zbGF0ZUZvcm1hdChmb3JtYXQpLCBsb2NrYWJsZSwgKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKSA9PSBEM0RVU0FHRV9SRU5ERVJUQVJHRVQgfHwgKHVzYWdlICYgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKSA9PSBEM0RVU0FHRV9ERVBUSFNURU5DSUwpLCBkZXZpY2UoZGV2aWNlKSwgY29udGFpbmVyKGNvbnRhaW5lciksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGZvcm1hdChmb3JtYXQpLCBwb29sKHBvb2wpLCBtdWx0aVNhbXBsZShtdWx0aVNhbXBsZSksIGxvY2thYmxlKGxvY2thYmxlKSwgdXNhZ2UodXNhZ2UpCi0JewotCQlwYXJlbnRUZXh0dXJlID0gZHluYW1pY19jYXN0PERpcmVjdDNEQmFzZVRleHR1cmU4Kj4oY29udGFpbmVyKTsKLQotCQlyZXNvdXJjZSA9IG5ldyBEaXJlY3QzRFJlc291cmNlOChkZXZpY2UsIEQzRFJUWVBFX1NVUkZBQ0UsIG1lbW9yeVVzYWdlKHdpZHRoLCBoZWlnaHQsIG11bHRpU2FtcGxlLCBmb3JtYXQpKTsKLQl9Ci0KLQlEaXJlY3QzRFN1cmZhY2U4Ojp+RGlyZWN0M0RTdXJmYWNlOCgpCi0JewotCQlyZXNvdXJjZS0+UmVsZWFzZSgpOwotCX0KLQotCXZvaWQgKkRpcmVjdDNEU3VyZmFjZTg6OmxvY2tJbnRlcm5hbChpbnQgeCwgaW50IHksIGludCB6LCBzdzo6TG9jayBsb2NrLCBzdzo6QWNjZXNzb3IgY2xpZW50KQotCXsKLQkJcmV0dXJuIFN1cmZhY2U6OmxvY2tJbnRlcm5hbCh4LCB5LCB6LCBsb2NrLCBjbGllbnQpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdXJmYWNlODo6dW5sb2NrSW50ZXJuYWwoKQotCXsKLQkJU3VyZmFjZTo6dW5sb2NrSW50ZXJuYWwoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEU3VyZmFjZTggfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3VyZmFjZTg6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYocGFyZW50VGV4dHVyZSkKLQkJewotCQkJcmV0dXJuIHBhcmVudFRleHR1cmUtPkFkZFJlZigpOwotCQl9Ci0KLQkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTdXJmYWNlODo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYocGFyZW50VGV4dHVyZSkKLQkJewotCQkJcmV0dXJuIHBhcmVudFRleHR1cmUtPlJlbGVhc2UoKTsKLQkJfQotCi0JCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN1cmZhY2U4OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gcmVzb3VyY2UtPkZyZWVQcml2YXRlRGF0YShndWlkKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIHJlc291cmNlLT5HZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gcmVzb3VyY2UtPlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTg6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiByZXNvdXJjZS0+R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN1cmZhY2U4OjpMb2NrUmVjdChEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbG9ja2VkUmVjdCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlsb2NrZWRSZWN0LT5QaXRjaCA9IGdldEV4dGVybmFsUGl0Y2hCKCk7Ci0KLQkJc3c6OkxvY2sgbG9jayA9IHN3OjpMT0NLX1JFQURXUklURTsKLQotCQlpZihmbGFncyAmIEQzRExPQ0tfRElTQ0FSRCkKLQkJewotCQkJbG9jayA9IHN3OjpMT0NLX0RJU0NBUkQ7Ci0JCX0KLQotCQlpZihmbGFncyAmIEQzRExPQ0tfUkVBRE9OTFkpCi0JCXsKLQkJCWxvY2sgPSBzdzo6TE9DS19SRUFET05MWTsKLQkJfQotCi0JCWlmKHJlY3QpCi0JCXsKLQkJCWxvY2tlZFJlY3QtPnBCaXRzID0gbG9ja0V4dGVybmFsKHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgMCwgbG9jaywgc3c6OlBVQkxJQyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlsb2NrZWRSZWN0LT5wQml0cyA9IGxvY2tFeHRlcm5hbCgwLCAwLCAwLCBsb2NrLCBzdzo6UFVCTElDKTsKLQkJfQotCi0JCXVubG9ja0V4dGVybmFsKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTg6OlVubG9ja1JlY3QoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN1cmZhY2U4OjpHZXRDb250YWluZXIoY29uc3QgSUlEICZpaWQsIHZvaWQgKipjb250YWluZXIpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWNvbnRhaW5lcikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlsb25nIHJlc3VsdCA9IHRoaXMtPmNvbnRhaW5lci0+UXVlcnlJbnRlcmZhY2UoaWlkLCBjb250YWluZXIpOwotCi0JCWlmKHJlc3VsdCA9PSBTX09LKQotCQl7Ci0JCQlyZXR1cm4gRDNEX09LOwotCQl9Ci0KLQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN1cmZhY2U4OjpHZXREZXNjKEQzRFNVUkZBQ0VfREVTQyAqZGVzYykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighZGVzYykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlkZXNjLT5Gb3JtYXQgPSBmb3JtYXQ7Ci0JCWRlc2MtPlBvb2wgPSBwb29sOwotCQlkZXNjLT5UeXBlID0gRDNEUlRZUEVfU1VSRkFDRTsKLQkJZGVzYy0+SGVpZ2h0ID0gaGVpZ2h0OwotCQlkZXNjLT5XaWR0aCA9IHdpZHRoOwotCQlkZXNjLT5TaXplID0gbWVtb3J5VXNhZ2Uod2lkdGgsIGhlaWdodCwgbXVsdGlTYW1wbGUsIGZvcm1hdCk7Ci0JCWRlc2MtPk11bHRpU2FtcGxlVHlwZSA9IG11bHRpU2FtcGxlOwotCQlkZXNjLT5Vc2FnZSA9IHVzYWdlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0Jc3c6OkZvcm1hdCBEaXJlY3QzRFN1cmZhY2U4Ojp0cmFuc2xhdGVGb3JtYXQoRDNERk9STUFUIGZvcm1hdCkKLQl7Ci0JCXN3aXRjaChmb3JtYXQpCi0JCXsKLQkJY2FzZSBEM0RGTVRfRFhUMToJCQlyZXR1cm4gc3c6OkZPUk1BVF9EWFQxOwotCQljYXNlIEQzREZNVF9EWFQyOgkJCXJldHVybiBzdzo6Rk9STUFUX0RYVDM7Ci0JCWNhc2UgRDNERk1UX0RYVDM6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRFhUMzsKLQkJY2FzZSBEM0RGTVRfRFhUNDoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EWFQ1OwotCQljYXNlIEQzREZNVF9EWFQ1OgkJCXJldHVybiBzdzo6Rk9STUFUX0RYVDU7Ci0JCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9SM0czQjI7Ci0JCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJcmV0dXJuIHN3OjpGT1JNQVRfQThSM0czQjI7Ci0JCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJcmV0dXJuIHN3OjpGT1JNQVRfWDRSNEc0QjQ7Ci0JCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJcmV0dXJuIHN3OjpGT1JNQVRfQTRSNEc0QjQ7Ci0JCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJcmV0dXJuIHN3OjpGT1JNQVRfQThSOEc4Qjg7Ci0JCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9HMTZSMTY7Ci0JCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglyZXR1cm4gc3c6OkZPUk1BVF9BMkIxMEcxMFIxMDsKLQkJY2FzZSBEM0RGTVRfUDg6CQkJCXJldHVybiBzdzo6Rk9STUFUX1A4OwotCQljYXNlIEQzREZNVF9BOFA4OgkJCXJldHVybiBzdzo6Rk9STUFUX0E4UDg7Ci0JCWNhc2UgRDNERk1UX0E4OgkJCQlyZXR1cm4gc3c6OkZPUk1BVF9BODsKLQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCXJldHVybiBzdzo6Rk9STUFUX1I1RzZCNTsKLQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlyZXR1cm4gc3c6OkZPUk1BVF9YMVI1RzVCNTsKLQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlyZXR1cm4gc3c6OkZPUk1BVF9BMVI1RzVCNTsKLQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCXJldHVybiBzdzo6Rk9STUFUX1I4RzhCODsKLQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlyZXR1cm4gc3c6OkZPUk1BVF9YOFI4RzhCODsKLQkJY2FzZSBEM0RGTVRfVjhVODoJCQlyZXR1cm4gc3c6OkZPUk1BVF9WOFU4OwotCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJcmV0dXJuIHN3OjpGT1JNQVRfTDZWNVU1OwotCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCXJldHVybiBzdzo6Rk9STUFUX1E4VzhWOFU4OwotCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCXJldHVybiBzdzo6Rk9STUFUX1g4TDhWOFU4OwotCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJcmV0dXJuIHN3OjpGT1JNQVRfQTJXMTBWMTBVMTA7Ci0JCWNhc2UgRDNERk1UX1YxNlUxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9WMTZVMTY7Ci0JCWNhc2UgRDNERk1UX0w4OgkJCQlyZXR1cm4gc3c6OkZPUk1BVF9MODsKLQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlyZXR1cm4gc3c6OkZPUk1BVF9BNEw0OwotCQljYXNlIEQzREZNVF9BOEw4OgkJCXJldHVybiBzdzo6Rk9STUFUX0E4TDg7Ci0JCWNhc2UgRDNERk1UX0QxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EMTY7Ci0JCWNhc2UgRDNERk1UX0QzMjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EMzI7Ci0JCWNhc2UgRDNERk1UX0QyNFg4OgkJCXJldHVybiBzdzo6Rk9STUFUX0QyNFg4OwotCQljYXNlIEQzREZNVF9EMjRTODoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EMjRTODsKLQkJZGVmYXVsdDoKLQkJCUFTU0VSVChmYWxzZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3c6OkZPUk1BVF9OVUxMOwotCX0KLQotCWludCBEaXJlY3QzRFN1cmZhY2U4OjpieXRlcyhEM0RGT1JNQVQgZm9ybWF0KQotCXsKLQkJcmV0dXJuIFN1cmZhY2U6OmJ5dGVzKHRyYW5zbGF0ZUZvcm1hdChmb3JtYXQpKTsKLQl9Ci0KLQl1bnNpZ25lZCBpbnQgRGlyZWN0M0RTdXJmYWNlODo6bWVtb3J5VXNhZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCBEM0RGT1JNQVQgZm9ybWF0KQotCXsKLQkJcmV0dXJuIFN1cmZhY2U6OnNpemUod2lkdGgsIGhlaWdodCwgMSwgMCwgc2FtcGxlQ291bnQobXVsdGlTYW1wbGUpLCB0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RTdXJmYWNlOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRFN1cmZhY2U4LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjZWNmMy4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzRFN1cmZhY2U4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOF9EaXJlY3QzRFN1cmZhY2U4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNEU3VyZmFjZThfaHBwCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLSNpbmNsdWRlICJTdXJmYWNlLmhwcCIKLQotI2luY2x1ZGUgPGQzZDguaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzRERldmljZTg7Ci0JY2xhc3MgRGlyZWN0M0RSZXNvdXJjZTg7Ci0JY2xhc3MgRGlyZWN0M0RCYXNlVGV4dHVyZTg7Ci0KLQljbGFzcyBEaXJlY3QzRFN1cmZhY2U4IDogcHVibGljIElEaXJlY3QzRFN1cmZhY2U4LCBwdWJsaWMgVW5rbm93biwgcHVibGljIHN3OjpTdXJmYWNlCi0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RTdXJmYWNlOChEaXJlY3QzRERldmljZTggKmRldmljZSwgVW5rbm93biAqY29udGFpbmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgYm9vbCBsb2NrYWJsZSwgdW5zaWduZWQgbG9uZyB1c2FnZSk7Ci0KLQkJfkRpcmVjdDNEU3VyZmFjZTgoKSBvdmVycmlkZTsKLQotCQkvLyBTdXJmYWNlIG1ldGhvZHMKLQkJdm9pZCAqbG9ja0ludGVybmFsKGludCB4LCBpbnQgeSwgaW50IHosIHN3OjpMb2NrIGxvY2ssIHN3OjpBY2Nlc3NvciBjbGllbnQpIG92ZXJyaWRlOwotCQl2b2lkIHVubG9ja0ludGVybmFsKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEU3VyZmFjZTggbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERlc2MoRDNEU1VSRkFDRV9ERVNDICpkZXNjKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgTG9ja1JlY3QoRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QsIGNvbnN0IFJFQ1QgKnJlY3QsIHVuc2lnbmVkIGxvbmcgRmxhZ3MpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBVbmxvY2tSZWN0KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQlzdGF0aWMgc3c6OkZvcm1hdCB0cmFuc2xhdGVGb3JtYXQoRDNERk9STUFUIGZvcm1hdCk7Ci0JCXN0YXRpYyBpbnQgYnl0ZXMoRDNERk9STUFUIGZvcm1hdCk7Ci0KLQlwcml2YXRlOgotCQlzdGF0aWMgdW5zaWduZWQgaW50IG1lbW9yeVVzYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgRDNERk9STUFUIGZvcm1hdCk7ICAgLy8gRklYTUU6IFN1cmZhY2U6OnNpemUKLQotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCURpcmVjdDNERGV2aWNlOCAqY29uc3QgZGV2aWNlOwotCQlVbmtub3duICpjb25zdCBjb250YWluZXI7Ci0JCWNvbnN0IGludCB3aWR0aDsKLQkJY29uc3QgaW50IGhlaWdodDsKLQkJY29uc3QgRDNERk9STUFUIGZvcm1hdDsKLQkJY29uc3QgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZTsKLQkJY29uc3QgRDNEUE9PTCBwb29sOwotCQljb25zdCBib29sIGxvY2thYmxlOwotCQljb25zdCB1bnNpZ25lZCBsb25nIHVzYWdlOwotCi0JCURpcmVjdDNEQmFzZVRleHR1cmU4ICpwYXJlbnRUZXh0dXJlOwotCQlEaXJlY3QzRFJlc291cmNlOCAqcmVzb3VyY2U7Ci0JfTsKLX0KLQotI2VuZGlmIC8vIEQzRDhfRGlyZWN0M0RTdXJmYWNlOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEU3dhcENoYWluOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFN3YXBDaGFpbjguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGUzYjk3Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEU3dhcENoYWluOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEU3dhcENoYWluOC5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTguaHBwIgotI2luY2x1ZGUgIkNvbmZpZy5ocHAiCi0jaW5jbHVkZSAiQ29uZmlndXJhdG9yLmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlICJGcmFtZUJ1ZmZlckRELmhwcCIKLSNpbmNsdWRlICJGcmFtZUJ1ZmZlckdESS5ocHAiCi0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JRGlyZWN0M0RTd2FwQ2hhaW44OjpEaXJlY3QzRFN3YXBDaGFpbjgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpIDogZGV2aWNlKGRldmljZSksIHByZXNlbnRQYXJhbWV0ZXJzKCpwcmVzZW50UGFyYW1ldGVycykKLQl7Ci0JCWZyYW1lQnVmZmVyID0gMDsKLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotCQl7Ci0JCQliYWNrQnVmZmVyW2ldID0gMDsKLQkJfQotCi0JCXJlc2V0KHByZXNlbnRQYXJhbWV0ZXJzKTsKLQl9Ci0KLQlEaXJlY3QzRFN3YXBDaGFpbjg6On5EaXJlY3QzRFN3YXBDaGFpbjgoKQotCXsKLQkJcmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RTd2FwQ2hhaW44OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFN3YXBDaGFpbjggfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3dhcENoYWluODo6QWRkUmVmKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjg6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjg6OlByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQkjaWYgUEVSRl9QUk9GSUxFCi0JCQlwcm9maWxlci5uZXh0RnJhbWUoKTsKLQkJI2VuZGlmCi0KLQkJaWYoIXNvdXJjZVJlY3QgJiYgIWRlc3RSZWN0KSAgIC8vIEZJWE1FOiBNb3JlIGNhc2VzPwotCQl7Ci0JCQlmcmFtZUJ1ZmZlci0+ZmxpcChkZXN0V2luZG93T3ZlcnJpZGUsIGJhY2tCdWZmZXJbMF0pOwotCQl9Ci0JCWVsc2UgICAvLyBUT0RPOiBDaGVjayBmb3IgU1dBUEVGRkVDVF9DT1BZCi0JCXsKLQkJCXN3OjpSZWN0IHNSZWN0KDAsIDAsIDAsIDApOwotCQkJc3c6OlJlY3QgZFJlY3QoMCwgMCwgMCwgMCk7Ci0KLQkJCWlmKHNvdXJjZVJlY3QpCi0JCQl7Ci0JCQkJc1JlY3QueDAgPSBzb3VyY2VSZWN0LT5sZWZ0OwotCQkJCXNSZWN0LnkwID0gc291cmNlUmVjdC0+dG9wOwotCQkJCXNSZWN0LngxID0gc291cmNlUmVjdC0+cmlnaHQ7Ci0JCQkJc1JlY3QueTEgPSBzb3VyY2VSZWN0LT5ib3R0b207Ci0JCQl9Ci0KLQkJCWlmKGRlc3RSZWN0KQotCQkJewotCQkJCWRSZWN0LngwID0gZGVzdFJlY3QtPmxlZnQ7Ci0JCQkJZFJlY3QueTAgPSBkZXN0UmVjdC0+dG9wOwotCQkJCWRSZWN0LngxID0gZGVzdFJlY3QtPnJpZ2h0OwotCQkJCWRSZWN0LnkxID0gZGVzdFJlY3QtPmJvdHRvbTsKLQkJCX0KLQotCQkJZnJhbWVCdWZmZXItPmJsaXQoZGVzdFdpbmRvd092ZXJyaWRlLCBiYWNrQnVmZmVyWzBdLCBzb3VyY2VSZWN0ID8gJnNSZWN0IDogbnVsbHB0ciwgZGVzdFJlY3QgPyAmZFJlY3QgOiBudWxscHRyKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjg6OkdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IGluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTggKipiYWNrQnVmZmVyKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFiYWNrQnVmZmVyLyogfHwgdHlwZSAhPSBEM0RCQUNLQlVGRkVSX1RZUEVfTU9OTyovKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKGluZGV4ID49IDMgfHwgdGhpcy0+YmFja0J1ZmZlcltpbmRleF0gPT0gMCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl0aGlzLT5iYWNrQnVmZmVyW2luZGV4XS0+QWRkUmVmKCk7Ci0JCSpiYWNrQnVmZmVyID0gdGhpcy0+YmFja0J1ZmZlcltpbmRleF07Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3dhcENoYWluODo6cmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykKLQl7Ci0JCXJlbGVhc2UoKTsKLQotCQl0aGlzLT5wcmVzZW50UGFyYW1ldGVycyA9ICpwcmVzZW50UGFyYW1ldGVyczsKLQotCQlBU1NFUlQocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudCA8PSAzKTsgICAvLyBNYXhpbXVtIG9mIHRocmVlIGJhY2sgYnVmZmVycwotCi0JCWlmKHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPT0gMCkKLQkJewotCQkJcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudCA9IDE7Ci0JCX0KLQotCQlEM0RERVZJQ0VfQ1JFQVRJT05fUEFSQU1FVEVSUyBjcmVhdGlvblBhcmFtZXRlcnM7Ci0JCWRldmljZS0+R2V0Q3JlYXRpb25QYXJhbWV0ZXJzKCZjcmVhdGlvblBhcmFtZXRlcnMpOwotCi0JCUhXTkQgd2luZG93SGFuZGxlID0gcHJlc2VudFBhcmFtZXRlcnMtPmhEZXZpY2VXaW5kb3cgPyBwcmVzZW50UGFyYW1ldGVycy0+aERldmljZVdpbmRvdyA6IGNyZWF0aW9uUGFyYW1ldGVycy5oRm9jdXNXaW5kb3c7Ci0KLQkJaW50IHdpZHRoID0gMDsKLQkJaW50IGhlaWdodCA9IDA7Ci0KLQkJaWYocHJlc2VudFBhcmFtZXRlcnMtPldpbmRvd2VkICYmIChwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodCA9PSAwIHx8IHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyV2lkdGggPT0gMCkpCi0JCXsKLQkJCVJFQ1QgcmVjdGFuZ2xlOwotCQkJR2V0Q2xpZW50UmVjdCh3aW5kb3dIYW5kbGUsICZyZWN0YW5nbGUpOwotCi0JCQl3aWR0aCA9IHJlY3RhbmdsZS5yaWdodCAtIHJlY3RhbmdsZS5sZWZ0OwotCQkJaGVpZ2h0ID0gcmVjdGFuZ2xlLmJvdHRvbSAtIHJlY3RhbmdsZS50b3A7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl3aWR0aCA9IHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyV2lkdGg7Ci0JCQloZWlnaHQgPSBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodDsKLQkJfQotCi0JCWZyYW1lQnVmZmVyID0gY3JlYXRlRnJhbWVCdWZmZXJXaW4od2luZG93SGFuZGxlLCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoLCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodCwgcHJlc2VudFBhcmFtZXRlcnMtPldpbmRvd2VkID09IEZBTFNFLCB0cnVlKTsKLQotCQlsb2NrYWJsZSA9IHByZXNlbnRQYXJhbWV0ZXJzLT5GbGFncyAmIEQzRFBSRVNFTlRGTEFHX0xPQ0tBQkxFX0JBQ0tCVUZGRVI7Ci0KLQkJYmFja0J1ZmZlclswXSA9IDA7Ci0JCWJhY2tCdWZmZXJbMV0gPSAwOwotCQliYWNrQnVmZmVyWzJdID0gMDsKLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgKGludClwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckNvdW50OyBpKyspCi0JCXsKLQkJCWJhY2tCdWZmZXJbaV0gPSBuZXcgRGlyZWN0M0RTdXJmYWNlOChkZXZpY2UsIHRoaXMsIHdpZHRoLCBoZWlnaHQsIHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyRm9ybWF0LCBEM0RQT09MX0RFRkFVTFQsIHByZXNlbnRQYXJhbWV0ZXJzLT5NdWx0aVNhbXBsZVR5cGUsIGxvY2thYmxlLCBEM0RVU0FHRV9SRU5ERVJUQVJHRVQpOwotCQkJYmFja0J1ZmZlcltpXS0+YmluZCgpOwotCQl9Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjg6OnJlbGVhc2UoKQotCXsKLQkJZGVsZXRlIGZyYW1lQnVmZmVyOwotCQlmcmFtZUJ1ZmZlciA9IDA7Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLQkJewotCQkJaWYoYmFja0J1ZmZlcltpXSkKLQkJCXsKLQkJCQliYWNrQnVmZmVyW2ldLT51bmJpbmQoKTsKLQkJCQliYWNrQnVmZmVyW2ldID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0RTd2FwQ2hhaW44OjpzY3JlZW5zaG90KHZvaWQgKmRlc3RCdWZmZXIpCi0JewotCQlmcmFtZUJ1ZmZlci0+c2NyZWVuc2hvdChkZXN0QnVmZmVyKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3dhcENoYWluODo6c2V0R2FtbWFSYW1wKHN3OjpHYW1tYVJhbXAgKmdhbW1hUmFtcCwgYm9vbCBjYWxpYnJhdGUpCi0JewotCQlmcmFtZUJ1ZmZlci0+c2V0R2FtbWFSYW1wKGdhbW1hUmFtcCwgY2FsaWJyYXRlKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3dhcENoYWluODo6Z2V0R2FtbWFSYW1wKHN3OjpHYW1tYVJhbXAgKmdhbW1hUmFtcCkKLQl7Ci0JCWZyYW1lQnVmZmVyLT5nZXRHYW1tYVJhbXAoZ2FtbWFSYW1wKTsKLQl9Ci0KLQl2b2lkICpEaXJlY3QzRFN3YXBDaGFpbjg6OmxvY2tCYWNrQnVmZmVyKGludCBpbmRleCkKLQl7Ci0JCXJldHVybiBiYWNrQnVmZmVyW2luZGV4XS0+bG9ja0ludGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1JFQURXUklURSwgc3c6OlBVQkxJQyk7ICAgLy8gRklYTUU6IEV4dGVybmFsCi0JfQotCi0Jdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjg6OnVubG9ja0JhY2tCdWZmZXIoaW50IGluZGV4KQotCXsKLQkJYmFja0J1ZmZlcltpbmRleF0tPnVubG9ja0ludGVybmFsKCk7ICAgLy8gRklYTUU6IEV4dGVybmFsCi0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RTd2FwQ2hhaW44LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEU3dhcENoYWluOC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDFkYmIuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RTd2FwQ2hhaW44LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOF9EaXJlY3QzRFN3YXBDaGFpbjhfaHBwCi0jZGVmaW5lIEQzRDhfRGlyZWN0M0RTd2FwQ2hhaW44X2hwcAotCi0jaW5jbHVkZSAiVW5rbm93bi5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U4LmhwcCIKLQotI2luY2x1ZGUgIkZyYW1lQnVmZmVyV2luLmhwcCIKLQotI2luY2x1ZGUgPGQzZDguaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzRFN3YXBDaGFpbjggOiBwdWJsaWMgSURpcmVjdDNEU3dhcENoYWluOCwgcHVibGljIFVua25vd24KLQl7Ci0JcHVibGljOgotCQlEaXJlY3QzRFN3YXBDaGFpbjgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpOwotCi0JCX5EaXJlY3QzRFN3YXBDaGFpbjgoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RTd2FwQ2hhaW44IG1ldGhvZHMKLQkgICAgbG9uZyBfX3N0ZGNhbGwgUHJlc2VudChjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgSFdORCBkZXN0V2luZG93T3ZlcnJpZGUsIGNvbnN0IFJHTkRBVEEgKmRpcnR5UmVnaW9uKSBvdmVycmlkZTsKLQkgICAgbG9uZyBfX3N0ZGNhbGwgR2V0QmFja0J1ZmZlcih1bnNpZ25lZCBpbnQgaW5kZXgsIEQzREJBQ0tCVUZGRVJfVFlQRSB0eXBlLCBJRGlyZWN0M0RTdXJmYWNlOCAqKmJhY2tCdWZmZXIpIG92ZXJyaWRlOwotCi0JCS8vIEludGVybmFsIG1ldGhvZHMKLQkJdm9pZCByZXNldChEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKTsKLQotCQl2b2lkIHNjcmVlbnNob3Qodm9pZCAqZGVzdEJ1ZmZlcik7Ci0JCXZvaWQgc2V0R2FtbWFSYW1wKHN3OjpHYW1tYVJhbXAgKmdhbW1hUmFtcCwgYm9vbCBjYWxpYnJhdGUpOwotCQl2b2lkIGdldEdhbW1hUmFtcChzdzo6R2FtbWFSYW1wICpnYW1tYVJhbXApOwotCi0JCXZvaWQgKmxvY2tCYWNrQnVmZmVyKGludCBpbmRleCk7Ci0JCXZvaWQgdW5sb2NrQmFja0J1ZmZlcihpbnQgaW5kZXgpOwotCi0JcHJpdmF0ZToKLQkJdm9pZCByZWxlYXNlKCk7Ci0KLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQlEaXJlY3QzRERldmljZTggKmNvbnN0IGRldmljZTsKLQkJRDNEUFJFU0VOVF9QQVJBTUVURVJTIHByZXNlbnRQYXJhbWV0ZXJzOwotCi0JCWJvb2wgbG9ja2FibGU7Ci0KLQkJc3c6OkZyYW1lQnVmZmVyV2luICpmcmFtZUJ1ZmZlcjsKLQotCXB1YmxpYzogICAvLyBGSVhNRQotCQlEaXJlY3QzRFN1cmZhY2U4ICpiYWNrQnVmZmVyWzNdOyAgIC8vIE5PVEU6IFVwIHRvIHRocmVlCi0JfTsKLX0KLQotI2VuZGlmIC8vIEQzRDhfRGlyZWN0M0RTd2FwQ2hhaW44X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RUZXh0dXJlOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFRleHR1cmU4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjZDM4NS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzRFRleHR1cmU4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RUZXh0dXJlOC5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U4LmhwcCIKLSNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCi0jaW5jbHVkZSAiRGVidWcuaHBwIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JRGlyZWN0M0RUZXh0dXJlODo6RGlyZWN0M0RUZXh0dXJlOChEaXJlY3QzRERldmljZTggKmRldmljZSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RCYXNlVGV4dHVyZTgoZGV2aWNlLCBEM0RSVFlQRV9URVhUVVJFLCBsZXZlbHMsIHVzYWdlKSwgd2lkdGgod2lkdGgpLCBoZWlnaHQoaGVpZ2h0KSwgZm9ybWF0KGZvcm1hdCksIHBvb2wocG9vbCkKLQl7Ci0JCWlmKGxldmVscyA9PSAwKQotCQl7Ci0JCQl0aGlzLT5sZXZlbHMgPSBzdzo6bG9nMihzdzo6bWF4KChpbnQpd2lkdGgsIChpbnQpaGVpZ2h0LCAxKSkgKyAxOwotCQl9Ci0KLQkJZm9yKHVuc2lnbmVkIGludCBsZXZlbCA9IDA7IGxldmVsIDwgc3c6Ok1JUE1BUF9MRVZFTFM7IGxldmVsKyspCi0JCXsKLQkJCWlmKGxldmVsIDwgdGhpcy0+bGV2ZWxzKQotCQkJewotCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0gPSBuZXcgRGlyZWN0M0RTdXJmYWNlOChkZXZpY2UsIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgcG9vbCwgRDNETVVMVElTQU1QTEVfTk9ORSwgdHJ1ZSwgdXNhZ2UpOwotCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0tPmJpbmQoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlzdXJmYWNlTGV2ZWxbbGV2ZWxdID0gMDsKLQkJCX0KLQotCQkJd2lkdGggPSBzdzo6bWF4KDEsIChpbnQpd2lkdGggLyAyKTsKLQkJCWhlaWdodCA9IHN3OjptYXgoMSwgKGludCloZWlnaHQgLyAyKTsKLQkJfQotCX0KLQotCURpcmVjdDNEVGV4dHVyZTg6On5EaXJlY3QzRFRleHR1cmU4KCkKLQl7Ci0JCWZvcihpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQotCQl7Ci0JCQlpZihzdXJmYWNlTGV2ZWxbbGV2ZWxdKQotCQkJewotCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0tPnVuYmluZCgpOwotCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0gPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFRleHR1cmU4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEQmFzZVRleHR1cmU4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSVVua25vd24pCi0JCXsKLQkJCUFkZFJlZigpOwotCQkJKm9iamVjdCA9IHRoaXM7Ci0KLQkJCXJldHVybiBTX09LOwotCQl9Ci0KLQkJKm9iamVjdCA9IDA7Ci0KLQkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTg6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RUZXh0dXJlODo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RUZXh0dXJlODo6UHJlTG9hZCgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlByZUxvYWQoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTg6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RUZXh0dXJlODo6R2V0UHJpb3JpdHkoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0UHJpb3JpdHkoKTsKLQl9Ci0KLQlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RUZXh0dXJlODo6R2V0VHlwZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRUeXBlKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpHZXRMZXZlbENvdW50KCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldExldmVsQ291bnQoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVGV4dHVyZTg6OkdldExPRCgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRMT0QoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVGV4dHVyZTg6OlNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldExPRChuZXdMT0QpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RUZXh0dXJlODo6R2V0TGV2ZWxEZXNjKHVuc2lnbmVkIGludCBsZXZlbCwgRDNEU1VSRkFDRV9ERVNDICpkZXNjcmlwdGlvbikKLQl7CQotCQlUUkFDRSgiIik7Ci0KLQkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbbGV2ZWxdKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXJldHVybiBzdXJmYWNlTGV2ZWxbbGV2ZWxdLT5HZXREZXNjKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTg6OkxvY2tSZWN0KHVuc2lnbmVkIGludCBsZXZlbCwgRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QsIGNvbnN0IFJFQ1QgKnJlY3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWxvY2tlZFJlY3QgfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbbGV2ZWxdKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXJldHVybiBzdXJmYWNlTGV2ZWxbbGV2ZWxdLT5Mb2NrUmVjdChsb2NrZWRSZWN0LCByZWN0LCBmbGFncyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpHZXRTdXJmYWNlTGV2ZWwodW5zaWduZWQgaW50IGxldmVsLCBJRGlyZWN0M0RTdXJmYWNlOCAqKnN1cmZhY2UpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJKnN1cmZhY2UgPSAwOyAgIC8vIEZJWE1FOiBWZXJpZnkKLQotCQlpZihsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJc3VyZmFjZUxldmVsW2xldmVsXS0+QWRkUmVmKCk7Ci0JCSpzdXJmYWNlID0gc3VyZmFjZUxldmVsW2xldmVsXTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0JCQotCi0JbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpVbmxvY2tSZWN0KHVuc2lnbmVkIGludCBsZXZlbCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cmZhY2VMZXZlbFtsZXZlbF0tPlVubG9ja1JlY3QoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTg6OkFkZERpcnR5UmVjdChjb25zdCBSRUNUICpkaXJ0eVJlY3QpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkvLwlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlEaXJlY3QzRFN1cmZhY2U4ICpEaXJlY3QzRFRleHR1cmU4OjpnZXRJbnRlcm5hbFN1cmZhY2VMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpCi0JewotCQlyZXR1cm4gc3VyZmFjZUxldmVsW2xldmVsXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFRleHR1cmU4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEVGV4dHVyZTguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGYzMWEzLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEVGV4dHVyZTguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q4X0RpcmVjdDNEVGV4dHVyZThfaHBwCi0jZGVmaW5lIEQzRDhfRGlyZWN0M0RUZXh0dXJlOF9ocHAKLQotI2luY2x1ZGUgIkRpcmVjdDNEQmFzZVRleHR1cmU4LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTguaHBwIgotCi0jaW5jbHVkZSAiQ29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPGQzZDguaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzRFRleHR1cmU4IDogcHVibGljIElEaXJlY3QzRFRleHR1cmU4LCBwdWJsaWMgRGlyZWN0M0RCYXNlVGV4dHVyZTgKLQl7Ci0JcHVibGljOgotCQlEaXJlY3QzRFRleHR1cmU4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCk7Ci0KLQkJfkRpcmVjdDNEVGV4dHVyZTgoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTggbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpIG92ZXJyaWRlOwotCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCkgb3ZlcnJpZGU7Ci0JCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzREJhc2VUZXh0dXJlIG1ldGhvZHMKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RUZXh0dXJlOCBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEdldExldmVsRGVzYyh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRFNVUkZBQ0VfREVTQyAqZGVzY3JpcHRpb24pIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBMb2NrUmVjdCh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRExPQ0tFRF9SRUNUICpsb2NrZWRSZWN0LCBjb25zdCBSRUNUICpyZWN0LCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0U3VyZmFjZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEU3VyZmFjZTggKipzdXJmYWNlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrUmVjdCh1bnNpZ25lZCBpbnQgbGV2ZWwpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBBZGREaXJ0eVJlY3QoY29uc3QgUkVDVCAqZGlydHlSZWN0KSBvdmVycmlkZTsKLQotCQkvLyBJbnRlcm5hbCBtZXRob2RzCi0JCURpcmVjdDNEU3VyZmFjZTggKmdldEludGVybmFsU3VyZmFjZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCk7Ci0KLQlwcml2YXRlOgotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCWNvbnN0IHVuc2lnbmVkIGludCB3aWR0aDsKLQkJY29uc3QgdW5zaWduZWQgaW50IGhlaWdodDsKLQkJY29uc3QgRDNERk9STUFUIGZvcm1hdDsKLQkJY29uc3QgRDNEUE9PTCBwb29sOwotCi0JCURpcmVjdDNEU3VyZmFjZTggKnN1cmZhY2VMZXZlbFtzdzo6TUlQTUFQX0xFVkVMU107Ci0JfTsKLX0KLQotI2VuZGlmIC8vIEQzRDhfRGlyZWN0M0RUZXh0dXJlOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4QnVmZmVyOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleEJ1ZmZlcjguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjc0OGQxLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4QnVmZmVyOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4QnVmZmVyOC5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTguaHBwIgotI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OkRpcmVjdDNEVmVydGV4QnVmZmVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgdW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgbG9uZyBGVkYsIEQzRFBPT0wgcG9vbCkgOiBEaXJlY3QzRFJlc291cmNlOChkZXZpY2UsIEQzRFJUWVBFX1ZFUlRFWEJVRkZFUiwgbGVuZ3RoKSwgbGVuZ3RoKGxlbmd0aCksIHVzYWdlKHVzYWdlKSwgRlZGKEZWRiksIHBvb2wocG9vbCkKLQl7Ci0JCWlmKEZWRikKLQkJewotCQkJdW5zaWduZWQgaW50IHN0cmlkZSA9IDA7Ci0KLQkJCXN3aXRjaChGVkYgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykKLQkJCXsKLQkJCWNhc2UgRDNERlZGX1hZWjoJc3RyaWRlICs9IDEyOwlicmVhazsKLQkJCWNhc2UgRDNERlZGX1hZWlJIVzoJc3RyaWRlICs9IDE2OwlicmVhazsKLQkJCWNhc2UgRDNERlZGX1hZWkIxOglzdHJpZGUgKz0gMTY7CWJyZWFrOwotCQkJY2FzZSBEM0RGVkZfWFlaQjI6CXN0cmlkZSArPSAyMDsJYnJlYWs7Ci0JCQljYXNlIEQzREZWRl9YWVpCMzoJc3RyaWRlICs9IDI0OwlicmVhazsKLQkJCWNhc2UgRDNERlZGX1hZWkI0OglzdHJpZGUgKz0gMjg7CWJyZWFrOwotCQkJY2FzZSBEM0RGVkZfWFlaQjU6CXN0cmlkZSArPSAzMjsJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmKEZWRiAmIEQzREZWRl9OT1JNQUwpICAgc3RyaWRlICs9IDEyOwotCQkJaWYoRlZGICYgRDNERlZGX1BTSVpFKSAgICBzdHJpZGUgKz0gNDsKLQkJCWlmKEZWRiAmIEQzREZWRl9ESUZGVVNFKSAgc3RyaWRlICs9IDQ7Ci0JCQlpZihGVkYgJiBEM0RGVkZfU1BFQ1VMQVIpIHN0cmlkZSArPSA0OwotCi0JCQlzd2l0Y2goKEZWRiAmIEQzREZWRl9URVhDT1VOVF9NQVNLKSA+PiBEM0RGVkZfVEVYQ09VTlRfU0hJRlQpCi0JCQl7Ci0JCQljYXNlIDg6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMzApKSAlIDQpOwotCQkJY2FzZSA3OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI4KSkgJSA0KTsKLQkJCWNhc2UgNjogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAyNikpICUgNCk7Ci0JCQljYXNlIDU6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMjQpKSAlIDQpOwotCQkJY2FzZSA0OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDIyKSkgJSA0KTsKLQkJCWNhc2UgMzogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAyMCkpICUgNCk7Ci0JCQljYXNlIDI6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMTgpKSAlIDQpOwotCQkJY2FzZSAxOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDE2KSkgJSA0KTsKLQkJCWNhc2UgMDogYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQl9Ci0KLQkJCUFTU0VSVChsZW5ndGggPj0gc3RyaWRlKTsgICAgICAgLy8gRklYTUUKLQkJCUFTU0VSVChsZW5ndGggJSBzdHJpZGUgPT0gMCk7ICAgLy8gRDNEIHZlcnRleCBzaXplIGNhbGN1bGF0ZWQgaW5jb3JyZWN0bHkgICAvLyBGSVhNRQotCQl9Ci0KLQkJdmVydGV4QnVmZmVyID0gbmV3IHN3OjpSZXNvdXJjZShsZW5ndGggKyAxOTIgKyAxMDI0KTsgICAvLyBOT1RFOiBBcHBsaWNhdGlvbnMgY2FuICdvdmVyc2hvb3QnIHdoaWxlIHdyaXRpbmcgdmVydGljZXMKLQl9Ci0KLQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6On5EaXJlY3QzRFZlcnRleEJ1ZmZlcjgoKQotCXsKLQkJdmVydGV4QnVmZmVyLT5kZXN0cnVjdCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFZlcnRleEJ1ZmZlcjggfHwKLQkJICAgaWlkID09IElJRF9JRGlyZWN0M0RSZXNvdXJjZTggfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6QWRkUmVmKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6RnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpGcmVlUHJpdmF0ZURhdGEoZ3VpZCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEVmVydGV4QnVmZmVyODo6UHJlTG9hZCgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJRGlyZWN0M0RSZXNvdXJjZTg6OlByZUxvYWQoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6U2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6U2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSwgZmxhZ3MpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkdldERldmljZShkZXZpY2UpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpHZXRQcmlvcml0eSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpHZXRQcmlvcml0eSgpOwotCX0KLQotCUQzRFJFU09VUkNFVFlQRSBEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OkdldFR5cGUoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0VHlwZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpMb2NrKHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihvZmZzZXQgPT0gMCAmJiBzaXplID09IDApICAgLy8gTG9jayB3aG9sZSBidWZmZXIKLQkJewotCQkJc2l6ZSA9IGxlbmd0aDsKLQkJfQotCi0JCWlmKCFkYXRhIHx8IG9mZnNldCArIHNpemUgPiBsZW5ndGgpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJbG9ja09mZnNldCA9IG9mZnNldDsKLQkJbG9ja1NpemUgPSBzaXplOwotCi0JCSpkYXRhID0gKHVuc2lnbmVkIGNoYXIqKXZlcnRleEJ1ZmZlci0+bG9jayhzdzo6UFVCTElDKSArIG9mZnNldDsKLQkJdmVydGV4QnVmZmVyLT51bmxvY2soKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpVbmxvY2soKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OkdldERlc2MoRDNEVkVSVEVYQlVGRkVSX0RFU0MgKmRlc2NyaXB0aW9uKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXNjcmlwdGlvbikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi0+RlZGID0gRlZGOwotCQlkZXNjcmlwdGlvbi0+Rm9ybWF0ID0gRDNERk1UX1ZFUlRFWERBVEE7Ci0JCWRlc2NyaXB0aW9uLT5Qb29sID0gcG9vbDsKLQkJZGVzY3JpcHRpb24tPlNpemUgPSBsZW5ndGg7Ci0JCWRlc2NyaXB0aW9uLT5UeXBlID0gRDNEUlRZUEVfVkVSVEVYQlVGRkVSOwotCQlkZXNjcmlwdGlvbi0+VXNhZ2UgPSB1c2FnZTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWludCBEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OmdldExlbmd0aCgpIGNvbnN0Ci0JewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCXN3OjpSZXNvdXJjZSAqRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpnZXRSZXNvdXJjZSgpIGNvbnN0Ci0JewotCQlyZXR1cm4gdmVydGV4QnVmZmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4QnVmZmVyOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleEJ1ZmZlcjguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE1OTk2Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4QnVmZmVyOC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDhfRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNEVmVydGV4QnVmZmVyOF9ocHAKLQotI2luY2x1ZGUgIkRpcmVjdDNEUmVzb3VyY2U4LmhwcCIKLQotI2luY2x1ZGUgPGQzZDguaD4KLQotbmFtZXNwYWNlIHN3Ci17Ci0JY2xhc3MgUmVzb3VyY2U7Ci19Ci0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JY2xhc3MgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4IDogcHVibGljIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgsIHB1YmxpYyBEaXJlY3QzRFJlc291cmNlOAotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEVmVydGV4QnVmZmVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgdW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgbG9uZyBGVkYsIEQzRFBPT0wgcG9vbCk7Ci0KLQkJfkRpcmVjdDNEVmVydGV4QnVmZmVyOCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKSBvdmVycmlkZTsKLQkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEVmVydGV4QnVmZmVyOCBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIExvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERlc2MoRDNEVkVSVEVYQlVGRkVSX0RFU0MgKmRlc2NyaXB0aW9uKSBvdmVycmlkZTsKLQotCQkvLyBJbnRlcm5hbCBtZXRob2RzCi0JCWludCBnZXRMZW5ndGgoKSBjb25zdDsKLQkJc3c6OlJlc291cmNlICpnZXRSZXNvdXJjZSgpIGNvbnN0OwotCi0JcHJpdmF0ZToKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQljb25zdCB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCQljb25zdCBsb25nIHVzYWdlOwotCQljb25zdCBsb25nIEZWRjsKLQkJY29uc3QgRDNEUE9PTCBwb29sOwotCi0JCXVuc2lnbmVkIGludCBsb2NrT2Zmc2V0OwotCQl1bnNpZ25lZCBpbnQgbG9ja1NpemU7Ci0JCXVuc2lnbmVkIGNoYXIgKmxvY2tEYXRhOwotCi0JCXN3OjpSZXNvdXJjZSAqdmVydGV4QnVmZmVyOwotCX07Ci19Ci0KLSNlbmRpZiAvLyBEM0Q4X0RpcmVjdDNEVmVydGV4QnVmZmVyOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3YWY0NC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjguaHBwIgotCi0jaW5jbHVkZSAiRGVidWcuaHBwIgotCi0jaW5jbHVkZSA8ZDNkOHR5cGVzLmg+Ci0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjg6OkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nICp2ZXJ0ZXhFbGVtZW50KSA6IGRldmljZShkZXZpY2UpCi0JewotCQlpbnQgc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQkJY29uc3QgdW5zaWduZWQgbG9uZyAqZWxlbWVudCA9IHZlcnRleEVsZW1lbnQ7Ci0KLQkJd2hpbGUoKmVsZW1lbnQgIT0gMHhGRkZGRkZGRikKLQkJewotCQkJc2l6ZSArPSBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JCQllbGVtZW50Kys7Ci0JCX0KLQotCQlkZWNsYXJhdGlvbiA9IG5ldyB1bnNpZ25lZCBsb25nW3NpemUgIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKLQkJbWVtY3B5KGRlY2xhcmF0aW9uLCB2ZXJ0ZXhFbGVtZW50LCBzaXplKTsKLQl9Ci0KLQlEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uODo6fkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244KCkKLQl7Ci0JCWRlbGV0ZVtdIGRlY2xhcmF0aW9uOwotCQlkZWNsYXJhdGlvbiA9IDA7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJQVNTRVJUKGZhbHNlKTsgICAvLyBJbnRlcm5hbCBvYmplY3QKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKLQl9Ci0JCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uODo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKLQl9Ci0KLQljb25zdCB1bnNpZ25lZCBsb25nICpEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uODo6Z2V0RGVjbGFyYXRpb24oKSBjb25zdAotCXsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2MwOGYuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q4X0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244X2hwcAotCi0jaW5jbHVkZSAiVW5rbm93bi5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q4Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JY2xhc3MgRGlyZWN0M0REZXZpY2U4OwotCi0JY2xhc3MgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjggOiBwcm90ZWN0ZWQgVW5rbm93bgotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nICp2ZXJ0ZXhFbGVtZW50cyk7Ci0KLQkJfkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQljb25zdCB1bnNpZ25lZCBsb25nICpnZXREZWNsYXJhdGlvbigpIGNvbnN0OwotCi0JcHJpdmF0ZToKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQlEaXJlY3QzRERldmljZTggKmNvbnN0IGRldmljZTsKLQkJdW5zaWduZWQgbG9uZyAqZGVjbGFyYXRpb247Ci0JfTsKLX0KLQotI2VuZGlmICAgLy8gRDNEOF9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOF9ocHAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleFNoYWRlcjguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5NjUwNy4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleFNoYWRlcjguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4U2hhZGVyOC5ocHAiCi0KLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4OjpEaXJlY3QzRFZlcnRleFNoYWRlcjgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmRlY2xhcmF0aW9uLCBjb25zdCB1bnNpZ25lZCBsb25nICpzaGFkZXJUb2tlbikgOiBkZXZpY2UoZGV2aWNlKQotCXsKLQkJaWYoc2hhZGVyVG9rZW4pCi0JCXsKLQkJCXZlcnRleFNoYWRlciA9IG5ldyBzdzo6VmVydGV4U2hhZGVyKHNoYWRlclRva2VuKTsKLQotCQkJY29uc3QgdW5zaWduZWQgbG9uZyAqdG9rZW4gPSBzaGFkZXJUb2tlbjsKLQkJCXNpemUgPSAwOwotCi0JCQl3aGlsZShzaGFkZXJUb2tlbltzaXplXSAhPSAweDAwMDBGRkZGKQotCQkJewotCQkJCXNpemUrKzsKLQkJCX0KLQotCQkJc2l6ZSsrOwotCi0JCQl0aGlzLT5zaGFkZXJUb2tlbiA9IG5ldyB1bnNpZ25lZCBsb25nW3NpemVdOwotCQkJbWVtY3B5KHRoaXMtPnNoYWRlclRva2VuLCBzaGFkZXJUb2tlbiwgc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl2ZXJ0ZXhTaGFkZXIgPSAwOwotCQkJdGhpcy0+c2hhZGVyVG9rZW4gPSAwOwotCQl9Ci0KLQkJdGhpcy0+ZGVjbGFyYXRpb24gPSBuZXcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjgoZGV2aWNlLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4Ojp+RGlyZWN0M0RWZXJ0ZXhTaGFkZXI4KCkKLQl7Ci0JCWRlbGV0ZSB2ZXJ0ZXhTaGFkZXI7Ci0JCXZlcnRleFNoYWRlciA9IDA7Ci0KLQkJZGVsZXRlW10gc2hhZGVyVG9rZW47Ci0JCXNoYWRlclRva2VuID0gMDsKLQotCQlkZWNsYXJhdGlvbi0+UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlBU1NFUlQoZmFsc2UpOyAgIC8vIEludGVybmFsIG9iamVjdAotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKLQl9Ci0JCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleFNoYWRlcjg6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7Ci0JfQotCi0JY29uc3Qgc3c6OlZlcnRleFNoYWRlciAqRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4OjpnZXRWZXJ0ZXhTaGFkZXIoKSBjb25zdAotCXsKLQkJcmV0dXJuIHZlcnRleFNoYWRlcjsKLQl9Ci0KLQljb25zdCB1bnNpZ25lZCBsb25nICpEaXJlY3QzRFZlcnRleFNoYWRlcjg6OmdldERlY2xhcmF0aW9uKCkKLQl7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi0+Z2V0RGVjbGFyYXRpb24oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4U2hhZGVyOC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OGJjYTAuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOF9EaXJlY3QzRFZlcnRleFNoYWRlcjhfaHBwCi0jZGVmaW5lIEQzRDhfRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4X2hwcAotCi0jaW5jbHVkZSAiVmVydGV4U2hhZGVyLmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5ocHAiCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzRERldmljZTg7Ci0KLQljbGFzcyBEaXJlY3QzRFZlcnRleFNoYWRlcjggOiBwdWJsaWMgVW5rbm93bgotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEVmVydGV4U2hhZGVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyAqZGVjbGFyYXRpb24sIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuKTsKLQotCQl+RGlyZWN0M0RWZXJ0ZXhTaGFkZXI4KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQljb25zdCBzdzo6VmVydGV4U2hhZGVyICpnZXRWZXJ0ZXhTaGFkZXIoKSBjb25zdDsKLQkJY29uc3QgdW5zaWduZWQgbG9uZyAqZ2V0RGVjbGFyYXRpb24oKTsKLQotCXByaXZhdGU6Ci0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJRGlyZWN0M0REZXZpY2U4ICpjb25zdCBkZXZpY2U7Ci0JCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244ICpkZWNsYXJhdGlvbjsKLQkJdW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW47Ci0JCXVuc2lnbmVkIGludCBzaXplOwotCi0JCXN3OjpWZXJ0ZXhTaGFkZXIgKnZlcnRleFNoYWRlcjsKLQl9OwotfQotCi0jZW5kaWYgICAvLyBEM0Q4X0RpcmVjdDNEVmVydGV4U2hhZGVyOF9ocHAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFZvbHVtZTguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0RWb2x1bWU4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2OTA2OC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9EaXJlY3QzRFZvbHVtZTguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZTguaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTguaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lVGV4dHVyZTguaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTguaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOAotewotCURpcmVjdDNEVm9sdW1lODo6RGlyZWN0M0RWb2x1bWU4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICpjb250YWluZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIGJvb2wgbG9ja2FibGUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCi0JCTogU3VyZmFjZShjb250YWluZXItPmdldFJlc291cmNlKCksIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCAwLCAxLCB0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KSwgbG9ja2FibGUsIGZhbHNlKSwgY29udGFpbmVyKGNvbnRhaW5lciksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGRlcHRoKGRlcHRoKSwgZm9ybWF0KGZvcm1hdCksIHBvb2wocG9vbCksIGxvY2thYmxlKGxvY2thYmxlKSwgdXNhZ2UodXNhZ2UpCi0JewotCQlyZXNvdXJjZSA9IG5ldyBEaXJlY3QzRFJlc291cmNlOChkZXZpY2UsIEQzRFJUWVBFX1ZPTFVNRSwgbWVtb3J5VXNhZ2Uod2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCkpOwotCX0KLQotCURpcmVjdDNEVm9sdW1lODo6fkRpcmVjdDNEVm9sdW1lOCgpCi0JewotCQlyZXNvdXJjZS0+UmVsZWFzZSgpOwotCX0KLQotCXZvaWQgKkRpcmVjdDNEVm9sdW1lODo6bG9ja0ludGVybmFsKGludCB4LCBpbnQgeSwgaW50IHosIHN3OjpMb2NrIGxvY2ssIHN3OjpBY2Nlc3NvciBjbGllbnQpCi0JewotCQlyZXR1cm4gU3VyZmFjZTo6bG9ja0ludGVybmFsKHgsIHksIHosIGxvY2ssIGNsaWVudCk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFZvbHVtZTg6OnVubG9ja0ludGVybmFsKCkKLQl7Ci0JCVN1cmZhY2U6OnVubG9ja0ludGVybmFsKCk7Ci0JfQotCi0JbG9uZyBfX3N0ZGNhbGwgRGlyZWN0M0RWb2x1bWU4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFZvbHVtZTggfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBEaXJlY3QzRFZvbHVtZTg6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lci0+QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgRGlyZWN0M0RWb2x1bWU4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gY29udGFpbmVyLT5SZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZTg6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiByZXNvdXJjZS0+RnJlZVByaXZhdGVEYXRhKGd1aWQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWU4OjpHZXRDb250YWluZXIoY29uc3QgSUlEICZpaWQsIHZvaWQgKipjb250YWluZXIpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWNvbnRhaW5lcikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlsb25nIHJlc3VsdCA9IHRoaXMtPmNvbnRhaW5lci0+UXVlcnlJbnRlcmZhY2UoaWlkLCBjb250YWluZXIpOwotCi0JCWlmKHJlc3VsdCA9PSBTX09LKQotCQl7Ci0JCQlyZXR1cm4gRDNEX09LOwotCQl9Ci0KLQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZTg6OkdldERlc2MoRDNEVk9MVU1FX0RFU0MgKmRlc2NyaXB0aW9uKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXNjcmlwdGlvbikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi0+Rm9ybWF0ID0gZm9ybWF0OwotCQlkZXNjcmlwdGlvbi0+VHlwZSA9IEQzRFJUWVBFX1ZPTFVNRTsKLQkJZGVzY3JpcHRpb24tPlVzYWdlID0gdXNhZ2U7Ci0JCWRlc2NyaXB0aW9uLT5Qb29sID0gcG9vbDsKLQkJZGVzY3JpcHRpb24tPldpZHRoID0gd2lkdGg7Ci0JCWRlc2NyaXB0aW9uLT5IZWlnaHQgPSBoZWlnaHQ7Ci0JCWRlc2NyaXB0aW9uLT5EZXB0aCA9IGRlcHRoOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZTg6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiByZXNvdXJjZS0+R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIHJlc291cmNlLT5HZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lODo6TG9ja0JveChEM0RMT0NLRURfQk9YICpsb2NrZWRWb2x1bWUsIGNvbnN0IEQzREJPWCAqYm94LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFsb2NrZWRWb2x1bWUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJbG9ja2VkVm9sdW1lLT5Sb3dQaXRjaCA9IHBpdGNoQihnZXRXaWR0aCgpLCAwLCBnZXRFeHRlcm5hbEZvcm1hdCgpLCBmYWxzZSk7Ci0JCWxvY2tlZFZvbHVtZS0+U2xpY2VQaXRjaCA9IHNsaWNlQihnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgMCwgZ2V0RXh0ZXJuYWxGb3JtYXQoKSwgZmFsc2UpOwotCi0JCXN3OjpMb2NrIGxvY2sgPSBzdzo6TE9DS19SRUFEV1JJVEU7Ci0KLQkJaWYoZmxhZ3MgJiBEM0RMT0NLX0RJU0NBUkQpCi0JCXsKLQkJCWxvY2sgPSBzdzo6TE9DS19ESVNDQVJEOwotCQl9Ci0KLQkJaWYoZmxhZ3MgJiBEM0RMT0NLX1JFQURPTkxZKQotCQl7Ci0JCQlsb2NrID0gc3c6OkxPQ0tfUkVBRE9OTFk7Ci0JCX0KLQotCQlpZihib3gpCi0JCXsKLQkJCWxvY2tlZFZvbHVtZS0+cEJpdHMgPSBsb2NrRXh0ZXJuYWwoYm94LT5MZWZ0LCBib3gtPlRvcCwgYm94LT5Gcm9udCwgbG9jaywgc3c6OlBVQkxJQyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlsb2NrZWRWb2x1bWUtPnBCaXRzID0gbG9ja0V4dGVybmFsKDAsIDAsIDAsIGxvY2ssIHN3OjpQVUJMSUMpOwotCQl9Ci0KLQkJdW5sb2NrRXh0ZXJuYWwoKTsKLQkJCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZTg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQkJCi0JCXJldHVybiBTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZTg6OlVubG9ja0JveCgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlzdzo6Rm9ybWF0IERpcmVjdDNEVm9sdW1lODo6dHJhbnNsYXRlRm9ybWF0KEQzREZPUk1BVCBmb3JtYXQpCi0JewotCQlyZXR1cm4gRGlyZWN0M0RTdXJmYWNlODo6dHJhbnNsYXRlRm9ybWF0KGZvcm1hdCk7Ci0JfQotCi0JdW5zaWduZWQgaW50IERpcmVjdDNEVm9sdW1lODo6bWVtb3J5VXNhZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIEQzREZPUk1BVCBmb3JtYXQpCi0JewotCQlyZXR1cm4gU3VyZmFjZTo6c2l6ZSh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgMCwgMSwgdHJhbnNsYXRlRm9ybWF0KGZvcm1hdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRFZvbHVtZTguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzVhYmEwLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lOC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDhfRGlyZWN0M0RWb2x1bWU4X2hwcAotI2RlZmluZSBEM0Q4X0RpcmVjdDNEVm9sdW1lOF9ocHAKLQotI2luY2x1ZGUgIlVua25vd24uaHBwIgotCi0jaW5jbHVkZSAiU3VyZmFjZS5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q4Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q4Ci17Ci0JY2xhc3MgRGlyZWN0M0REZXZpY2U4OwotCWNsYXNzIERpcmVjdDNEUmVzb3VyY2U4OwotCWNsYXNzIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg7Ci0KLQljbGFzcyBEaXJlY3QzRFZvbHVtZTggOiBwdWJsaWMgSURpcmVjdDNEVm9sdW1lOCwgcHVibGljIFVua25vd24sIHB1YmxpYyBzdzo6U3VyZmFjZQotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEVm9sdW1lOChEaXJlY3QzRERldmljZTggKmRldmljZSwgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCAqY29udGFpbmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBib29sIGxvY2FrYmxlLCB1bnNpZ25lZCBsb25nIHVzYWdlKTsKLQotCQl+RGlyZWN0M0RWb2x1bWU4KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gU3VyZmFjZSBtZXRob2RzCi0JCXZvaWQgKmxvY2tJbnRlcm5hbChpbnQgeCwgaW50IHksIGludCB6LCBzdzo6TG9jayBsb2NrLCBzdzo6QWNjZXNzb3IgY2xpZW50KSBvdmVycmlkZTsKLQkJdm9pZCB1bmxvY2tJbnRlcm5hbCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFZvbHVtZTggbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERlc2MoRDNEVk9MVU1FX0RFU0MgKmRlc2NyaXB0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgTG9ja0JveChEM0RMT0NLRURfQk9YICpsb2NrZWRWb2x1bWUsIGNvbnN0IEQzREJPWCAqYm94LCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrQm94KCkgb3ZlcnJpZGU7Ci0KLQlwcml2YXRlOgotCQlzdGF0aWMgc3c6OkZvcm1hdCB0cmFuc2xhdGVGb3JtYXQoRDNERk9STUFUIGZvcm1hdCk7Ci0JCXN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtb3J5VXNhZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIEQzREZPUk1BVCBmb3JtYXQpOwotCi0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCAqY29uc3QgY29udGFpbmVyOwotCQljb25zdCBpbnQgd2lkdGg7Ci0JCWNvbnN0IGludCBoZWlnaHQ7Ci0JCWNvbnN0IGludCBkZXB0aDsKLQkJY29uc3QgRDNERk9STUFUIGZvcm1hdDsKLQkJY29uc3QgRDNEUE9PTCBwb29sOwotCQljb25zdCBib29sIGxvY2thYmxlOwotCQljb25zdCB1bnNpZ25lZCBsb25nIHVzYWdlOwotCi0JCURpcmVjdDNEUmVzb3VyY2U4ICpyZXNvdXJjZTsKLQl9OwotfQotCi0jZW5kaWYgLy8gRDNEOF9EaXJlY3QzRFZvbHVtZThfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFZvbHVtZVRleHR1cmU4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjI2MmUzLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZVRleHR1cmU4LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lOC5ocHAiCi0jaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOAotewotCURpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkRpcmVjdDNEVm9sdW1lVGV4dHVyZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGRlcHRoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RCYXNlVGV4dHVyZTgoZGV2aWNlLCBEM0RSVFlQRV9WT0xVTUVURVhUVVJFLCBsZXZlbHMsIHVzYWdlKSwgd2lkdGgod2lkdGgpLCBoZWlnaHQoaGVpZ2h0KSwgZGVwdGgoZGVwdGgpLCBmb3JtYXQoZm9ybWF0KSwgcG9vbChwb29sKQotCXsKLQkJaWYobGV2ZWxzID09IDApCi0JCXsKLQkJCXRoaXMtPmxldmVscyA9IHN3Ojpsb2cyKHN3OjptYXgoKGludCl3aWR0aCwgKGludCloZWlnaHQsIChpbnQpZGVwdGgsIDEpKSArIDE7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGxldmVsID0gMDsgbGV2ZWwgPCBzdzo6TUlQTUFQX0xFVkVMUzsgbGV2ZWwrKykKLQkJewotCQkJaWYobGV2ZWwgPCB0aGlzLT5sZXZlbHMpCi0JCQl7Ci0JCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdID0gbmV3IERpcmVjdDNEVm9sdW1lOChkZXZpY2UsIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHBvb2wsIHRydWUsIHVzYWdlKTsKLQkJCQl2b2x1bWVMZXZlbFtsZXZlbF0tPmJpbmQoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl2b2x1bWVMZXZlbFtsZXZlbF0gPSAwOwotCQkJfQotCi0JCQl3aWR0aCA9IHN3OjptYXgoMSwgKGludCl3aWR0aCAvIDIpOwotCQkJaGVpZ2h0ID0gc3c6Om1heCgxLCAoaW50KWhlaWdodCAvIDIpOwotCQkJZGVwdGggPSBzdzo6bWF4KDEsIChpbnQpZGVwdGggLyAyKTsKLQkJfQotCX0KLQotCURpcmVjdDNEVm9sdW1lVGV4dHVyZTg6On5EaXJlY3QzRFZvbHVtZVRleHR1cmU4KCkKLQl7Ci0JCWZvcihpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQotCQl7Ci0JCQlpZih2b2x1bWVMZXZlbFtsZXZlbF0pCi0JCQl7Ci0JCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdLT51bmJpbmQoKTsKLQkJCQl2b2x1bWVMZXZlbFtsZXZlbF0gPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFZvbHVtZVRleHR1cmU4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEQmFzZVRleHR1cmU4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSVVua25vd24pCi0JCXsKLQkJCUFkZFJlZigpOwotCQkJKm9iamVjdCA9IHRoaXM7Ci0KLQkJCXJldHVybiBTX09LOwotCQl9Ci0KLQkJKm9iamVjdCA9IDA7Ci0KLQkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6UHJlTG9hZCgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlByZUxvYWQoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6R2V0UHJpb3JpdHkoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0UHJpb3JpdHkoKTsKLQl9Ci0KLQlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6R2V0VHlwZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRUeXBlKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpHZXRMZXZlbENvdW50KCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldExldmVsQ291bnQoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkdldExPRCgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRMT0QoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OlNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldExPRChuZXdMT0QpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6R2V0Vm9sdW1lTGV2ZWwodW5zaWduZWQgaW50IGxldmVsLCBJRGlyZWN0M0RWb2x1bWU4ICoqdm9sdW1lKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCSp2b2x1bWUgPSAwOyAgIC8vIEZJWE1FOiBWZXJpZnkKLQotCQlpZihsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXZvbHVtZUxldmVsW2xldmVsXSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl2b2x1bWVMZXZlbFtsZXZlbF0tPkFkZFJlZigpOwotCQkqdm9sdW1lID0gdm9sdW1lTGV2ZWxbbGV2ZWxdOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpMb2NrQm94KHVuc2lnbmVkIGludCBsZXZlbCwgRDNETE9DS0VEX0JPWCAqbG9ja2VkVm9sdW1lLCBjb25zdCBEM0RCT1ggKmJveCwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighbG9ja2VkVm9sdW1lIHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhdm9sdW1lTGV2ZWxbbGV2ZWxdKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXJldHVybiB2b2x1bWVMZXZlbFtsZXZlbF0tPkxvY2tCb3gobG9ja2VkVm9sdW1lLCBib3gsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OlVubG9ja0JveCh1bnNpZ25lZCBpbnQgbGV2ZWwpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICF2b2x1bWVMZXZlbFtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcmV0dXJuIHZvbHVtZUxldmVsW2xldmVsXS0+VW5sb2NrQm94KCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpBZGREaXJ0eUJveChjb25zdCBEM0RCT1ggKmRpcnR5Qm94KQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkaXJ0eUJveCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkdldExldmVsRGVzYyh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRFZPTFVNRV9ERVNDICpkZXNjcmlwdGlvbikKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlpZighZGVzY3JpcHRpb24gfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICF2b2x1bWVMZXZlbFtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJdm9sdW1lTGV2ZWxbbGV2ZWxdLT5HZXREZXNjKGRlc2NyaXB0aW9uKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCURpcmVjdDNEVm9sdW1lOCAqRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6Z2V0SW50ZXJuYWxWb2x1bWVMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpCi0JewotCQlyZXR1cm4gdm9sdW1lTGV2ZWxbbGV2ZWxdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTguaHBwIGIvc3JjL0QzRDgvRGlyZWN0M0RWb2x1bWVUZXh0dXJlOC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWMxODMuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDgvRGlyZWN0M0RWb2x1bWVUZXh0dXJlOC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDhfRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9ocHAKLSNkZWZpbmUgRDNEOF9EaXJlY3QzRFZvbHVtZVRleHR1cmU4X2hwcAotCi0jaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwIgotCi0jaW5jbHVkZSAiQ29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPGQzZDguaD4KLQotbmFtZXNwYWNlIEQzRDgKLXsKLQljbGFzcyBEaXJlY3QzRFZvbHVtZTg7Ci0KLQljbGFzcyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4IDogcHVibGljIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4LCBwdWJsaWMgRGlyZWN0M0RCYXNlVGV4dHVyZTgKLQl7Ci0JcHVibGljOgotCQlEaXJlY3QzRFZvbHVtZVRleHR1cmU4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKLQotCQl+RGlyZWN0M0RWb2x1bWVUZXh0dXJlOCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKSBvdmVycmlkZTsKLQkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEQmFzZVRleHR1cmUgbWV0aG9kcwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMZXZlbENvdW50KCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldExPRCgpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxEZXNjKHVuc2lnbmVkIGludCBsZXZlbCwgRDNEVk9MVU1FX0RFU0MgKmRlc2NyaXB0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Vm9sdW1lTGV2ZWwodW5zaWduZWQgaW50IGxldmVsLCBJRGlyZWN0M0RWb2x1bWU4ICoqdm9sdW1lKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgTG9ja0JveCh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRExPQ0tFRF9CT1ggKmxvY2tlZFZvbHVtZSwgY29uc3QgRDNEQk9YICpib3gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBVbmxvY2tCb3godW5zaWduZWQgaW50IGxldmVsKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQWRkRGlydHlCb3goY29uc3QgRDNEQk9YICpkaXJ0eUJveCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQlEaXJlY3QzRFZvbHVtZTggKmdldEludGVybmFsVm9sdW1lTGV2ZWwodW5zaWduZWQgaW50IGxldmVsKTsKLQotCXByaXZhdGU6Ci0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJY29uc3QgdW5zaWduZWQgaW50IHdpZHRoOwotCQljb25zdCB1bnNpZ25lZCBpbnQgaGVpZ2h0OwotCQljb25zdCB1bnNpZ25lZCBpbnQgZGVwdGg7Ci0JCWNvbnN0IEQzREZPUk1BVCBmb3JtYXQ7Ci0JCWNvbnN0IEQzRFBPT0wgcG9vbDsKLQotCQlEaXJlY3QzRFZvbHVtZTggKnZvbHVtZUxldmVsW3N3OjpNSVBNQVBfTEVWRUxTXTsKLQl9OwotfQotCi0jZW5kaWYgLy8gRDNEOF9EaXJlY3QzRFZvbHVtZVRleHR1cmU4X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvVW5rbm93bi5jcHAgYi9zcmMvRDNEOC9Vbmtub3duLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljZTAzZi4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9Vbmtub3duLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLQotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOAotewotCVVua25vd246OlVua25vd24oKQotCXsKLQkJcmVmZXJlbmNlQ291bnQgPSAwOwotCQliaW5kQ291bnQgPSAwOwotCX0KLQotCVVua25vd246On5Vbmtub3duKCkKLQl7Ci0JCUFTU0VSVChyZWZlcmVuY2VDb3VudCA9PSAwKTsKLQkJQVNTRVJUKGJpbmRDb3VudCA9PSAwKTsKLQl9Ci0KLQlsb25nIFVua25vd246OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJaWYoaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQkJCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgVW5rbm93bjo6QWRkUmVmKCkKLQl7Ci0JCXJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCgmcmVmZXJlbmNlQ291bnQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgVW5rbm93bjo6UmVsZWFzZSgpCi0JewotCQlpbnQgY3VycmVudCA9IHJlZmVyZW5jZUNvdW50OwotCQkKLQkJaWYocmVmZXJlbmNlQ291bnQgPiAwKQotCQl7Ci0JCQljdXJyZW50ID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJnJlZmVyZW5jZUNvdW50KTsKLQkJfQotCi0JCWlmKHJlZmVyZW5jZUNvdW50ID09IDAgJiYgYmluZENvdW50ID09IDApCi0JCXsKLQkJCWRlbGV0ZSB0aGlzOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnJlbnQ7Ci0JfQotCi0Jdm9pZCBVbmtub3duOjpiaW5kKCkKLQl7Ci0JCUludGVybG9ja2VkSW5jcmVtZW50KCZiaW5kQ291bnQpOwotCX0KLQotCXZvaWQgVW5rbm93bjo6dW5iaW5kKCkKLQl7Ci0JCUFTU0VSVChiaW5kQ291bnQgPiAwKTsKLQotCQlJbnRlcmxvY2tlZERlY3JlbWVudCgmYmluZENvdW50KTsKLQotCQlpZihyZWZlcmVuY2VDb3VudCA9PSAwICYmIGJpbmRDb3VudCA9PSAwKQotCQl7Ci0JCQlkZWxldGUgdGhpczsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9Vbmtub3duLmhwcCBiL3NyYy9EM0Q4L1Vua25vd24uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzhhMDM1Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L1Vua25vd24uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q4X1Vua25vd25faHBwCi0jZGVmaW5lIEQzRDhfVW5rbm93bl9ocHAKLQotI2luY2x1ZGUgPHVua253bi5oPgotCi1uYW1lc3BhY2UgRDNEOAotewotCWNsYXNzIFVua25vd24gOiBJVW5rbm93bgotCXsKLQlwdWJsaWM6Ci0JCVVua25vd24oKTsKLQotCQl2aXJ0dWFsIH5Vbmtub3duKCk7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQl2aXJ0dWFsIHZvaWQgYmluZCgpOwotCQl2aXJ0dWFsIHZvaWQgdW5iaW5kKCk7Ci0KLQlwcml2YXRlOgotCQl2b2xhdGlsZSBsb25nIHJlZmVyZW5jZUNvdW50OwotCQl2b2xhdGlsZSBsb25nIGJpbmRDb3VudDsKLQl9OwotfQotCi0jZW5kaWYgICAvLyBEM0Q4X1Vua25vd25faHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9kM2Q4LmRlZiBiL3NyYy9EM0Q4L2QzZDguZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg2YTc4Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q4L2QzZDguZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1MSUJSQVJZIEQzRDgKLUVYUE9SVFMKLQlDaGVja0Z1bGxzY3JlZW4JCQlAMQotICAgIERlYnVnU2V0TXV0ZQkJCUA0Ci0gICAgRGlyZWN0M0RDcmVhdGU4CQkJQDUKLSAgICBWYWxpZGF0ZVBpeGVsU2hhZGVyCQlAMgotICAgIFZhbGlkYXRlVmVydGV4U2hhZGVyCUAzCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9yZXNvdXJjZS5oIGIvc3JjL0QzRDgvcmVzb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhOWY2Yi4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9yZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy97e05PX0RFUEVOREVOQ0lFU319Ci0vLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgotLy8gVXNlZCBieSBEM0Q4LWRsbC5yYwotLy8KLSNkZWZpbmUgSUREX0RJQUxPRzEgICAgICAgICAgICAgICAgICAgICAxMDQKLSNkZWZpbmUgSUREX0RJQUxPRzIgICAgICAgICAgICAgICAgICAgICAxMDUKLSNkZWZpbmUgSURDX0NIRUNLMSAgICAgICAgICAgICAgICAgICAgICAxMDAxCi0jZGVmaW5lIElEQ19TTElERVIxICAgICAgICAgICAgICAgICAgICAgMTAwMgotI2RlZmluZSBJRENfQ0hFQ0syICAgICAgICAgICAgICAgICAgICAgIDEwMDMKLSNkZWZpbmUgSURDX1BST0dSRVNTMiAgICAgICAgICAgICAgICAgICAxMDA2Ci0jZGVmaW5lIElEQ19QUk9HUkVTUzMgICAgICAgICAgICAgICAgICAgMTAwNwotI2RlZmluZSBJRENfUFJPR1JFU1M0ICAgICAgICAgICAgICAgICAgIDEwMDgKLSNkZWZpbmUgSURDX1BST0dSRVNTNSAgICAgICAgICAgICAgICAgICAxMDA5Ci0jZGVmaW5lIElEQ19EQVRFVElNRVBJQ0tFUjEgICAgICAgICAgICAgMTAxMQotI2RlZmluZSBJRENfQ0hFQ0szICAgICAgICAgICAgICAgICAgICAgIDEwMTIKLSNkZWZpbmUgSURDX0VESVQxICAgICAgICAgICAgICAgICAgICAgICAxMDEzCi0jZGVmaW5lIElEQ19FRElUMiAgICAgICAgICAgICAgICAgICAgICAgMTAxNAotCi0vLyBOZXh0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgb2JqZWN0cwotLy8gCi0jaWZkZWYgQVBTVFVESU9fSU5WT0tFRAotI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCi0jZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTA2Ci0jZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDEKLSNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDE1Ci0jZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvcmVzb3VyY2UxLmggYi9zcmMvRDNEOC9yZXNvdXJjZTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmMzU4NC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOC9yZXNvdXJjZTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8ve3tOT19ERVBFTkRFTkNJRVN9fQotLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZS4KLS8vIFVzZWQgYnkgRDNEOC5yYwotCi0vLyBOZXh0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgb2JqZWN0cwotLy8gCi0jaWZkZWYgQVBTVFVESU9fSU5WT0tFRAotI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCi0jZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTAxCi0jZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDEKLSNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDAxCi0jZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvQ2FwYWJpbGl0aWVzLmNwcCBiL3NyYy9EM0Q5L0NhcGFiaWxpdGllcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmQ5ODMuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvQ2FwYWJpbGl0aWVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiQ2FwYWJpbGl0aWVzLmhwcCIKLQotI2luY2x1ZGUgIk1haW4vQ29uZmlnLmhwcCIKLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpOVUxMXyA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjhHOEI4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjVHNkI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSM0czQjIgPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMiA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDhSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTJSMTBHMTBCMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6RzMyUjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTMyQjMyRzMyUjMyRiA9IHRydWU7Ci0KLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMzIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQyNFM4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRYOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRGUzggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQzMkZfTE9DS0FCTEUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkRGMjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkRGMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OklOVFogPSB0cnVlOwotCi0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UjVHNkI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6WDFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UjNHM0IyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSM0czQjIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UDggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QThQOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMTZSMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMlIxMEcxMEIxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTE2QjE2RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQzID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBVEkxID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QVRJMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIxNkYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMTZSMTZGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTE2QjE2RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIzMkYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMzJSMzJGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTMyQjMyRzMyUjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMNlY1VTUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOEw4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlE4VzhWOFU4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6VjE2VTE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJXMTBWMTBVMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpRMTZXMTZWMTZVMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0TDQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOEw4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6TlZEQiA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBVE9DID0gdHJ1ZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSNUc2QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlgxUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlIzRzNCMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSM0czQjIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSOEc4QjggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpYOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UDggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFA4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMlIxMEcxMEIxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJCMTBHMTBSMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkExNkIxNkcxNlIxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMyA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QVRJMSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QVRJMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTE2QjE2RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzMyUjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTMyQjMyRzMyUjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDZWNVU1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpYOEw4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UThXOFY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlYxNlUxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJXMTBWMTBVMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlExNlcxNlYxNlUxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE0TDQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkwxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThMOCA9IHRydWU7Ci0KLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpOVUxMXyA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjhHOEI4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjVHNkI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSM0czQjIgPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMiA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6WDhSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTJSMTBHMTBCMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6RzMyUjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTMyQjMyRzMyUjMyRiA9IHRydWU7Ci0KLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMzIgPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRTOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQyNFg4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDE2ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0RlM4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkRGMjQgPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpERjE2ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6SU5UWiA9IGZhbHNlOwotCi0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjVHNkI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjNHM0IyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThSM0czQjIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlI4RzhCOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlA4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UDggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJSMTBHMTBCMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMkIxMEcxMFIxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExNkIxNkcxNlIxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDEgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMyA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQ1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QVRJMSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkFUSTIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSMTZGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExNkIxNkcxNlIxNkYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSMzJGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzMyUjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkEzMkIzMkczMlIzMkYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpWOFU4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDZWNVU1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhMOFY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpROFc4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlYxNlUxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkEyVzEwVjEwVTEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UTE2VzE2VjE2VTE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNEw0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThMOCA9IHRydWU7Ci0KLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSNUc2QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkExUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSM0czQjIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFIzRzNCMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg0UjRHNEI0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UjhHOEI4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEI4RzhSOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UDggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThQOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMTZSMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMlIxMEcxMEIxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTE2QjE2RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQzID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBVEkxID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QVRJMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIxNkYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMTZSMTZGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTE2QjE2RzE2UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzMkYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMzJSMzJGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTMyQjMyRzMyUjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMNlY1VTUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEw4VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlE4VzhWOFU4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6VjE2VTE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTJXMTBWMTBVMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpRMTZXMTZWMTZVMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE0TDQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOEw4ID0gdHJ1ZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Ok5VTExfID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMiA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QThCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMlIxMEcxMEIxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSMTZGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTZGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSMzJGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMzJCMzJHMzJSMzJGID0gdHJ1ZTsKLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0UzggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNEZTOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYyNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6SU5UWiA9IHRydWU7Ci0KLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6TlVMTF8gPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlI1RzZCNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlgxUjVHNUI1ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTFSNUc1QjUgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNFI0RzRCNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlIzRzNCMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UjNHM0IyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6WDRSNEc0QjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSOEc4QjggPSBmYWxzZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhSOEc4QjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFI4RzhCOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg4QjhHOFI4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QThCOEc4UjggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpQOCA9IGZhbHNlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFA4ID0gZmFsc2U7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkcxNlIxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyUjEwRzEwQjEwID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJCMTBHMTBSMTAgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMTZCMTZHMTZSMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQxID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUMiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDMgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQ0ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkFUSTEgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBVEkyID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UjE2RiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkcxNlIxNkYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMTZCMTZHMTZSMTZGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UjMyRiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkczMlIzMkYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMzJCMzJHMzJSMzJGID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6VjhVOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6Okw2VjVVNSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg4TDhWOFU4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UThXOFY4VTggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpWMTZVMTYgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMlcxMFYxMFUxMCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlExNlcxNlYxNlUxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6Okw4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTRMNCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkwxNiA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4TDggPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMzIgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMjRTOCA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNFg4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RDE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0RlM4ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RDMyRl9MT0NLQUJMRSA9IHRydWU7Ci0JYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRGMjQgPSB0cnVlOwotCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpERjE2ID0gdHJ1ZTsKLQlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6SU5UWiA9IHRydWU7Ci0KLQlib29sIENhcGFiaWxpdGllczo6aXNTUkdCcmVhZGFibGUoRDNERk9STUFUIGZvcm1hdCkKLQl7Ci0JCS8vIEtlZXAgaW4gc3luYyB3aXRoIFN1cmZhY2U6OmlzU1JHQnJlYWRhYmxlCi0JCXN3aXRjaChmb3JtYXQpCi0JCXsKLQkJY2FzZSBEM0RGTVRfTDg6Ci0JCWNhc2UgRDNERk1UX0E4TDg6Ci0JCWNhc2UgRDNERk1UX1I4RzhCODoKLQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6Ci0JCWNhc2UgRDNERk1UX1g4UjhHOEI4OgotCQljYXNlIEQzREZNVF9BOEI4RzhSODoKLQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6Ci0JCWNhc2UgRDNERk1UX1I1RzZCNToKLQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6Ci0JCWNhc2UgRDNERk1UX0ExUjVHNUI1OgotCQljYXNlIEQzREZNVF9BNFI0RzRCNDoKLQkJY2FzZSBEM0RGTVRfRFhUMToKLQkJY2FzZSBEM0RGTVRfRFhUMjoKLQkJY2FzZSBEM0RGTVRfRFhUMzoKLQkJY2FzZSBEM0RGTVRfRFhUNDoKLQkJY2FzZSBEM0RGTVRfRFhUNToKLQkJY2FzZSBEM0RGTVRfQVRJMToKLQkJY2FzZSBEM0RGTVRfQVRJMjoKLQkJCXJldHVybiB0cnVlOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWJvb2wgQ2FwYWJpbGl0aWVzOjppc1NSR0J3cml0YWJsZShEM0RGT1JNQVQgZm9ybWF0KQotCXsKLQkJLy8gS2VlcCBpbiBzeW5jIHdpdGggU3VyZmFjZTo6aXNTUkdCd3JpdGFibGUKLQkJc3dpdGNoKGZvcm1hdCkKLQkJewotCQljYXNlIEQzREZNVF9OVUxMOgotCQljYXNlIEQzREZNVF9BOFI4RzhCODoKLQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6Ci0JCWNhc2UgRDNERk1UX0E4QjhHOFI4OgotCQljYXNlIEQzREZNVF9YOEI4RzhSODoKLQkJY2FzZSBEM0RGTVRfUjVHNkI1OgotCQkJcmV0dXJuIHRydWU7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQl1bnNpZ25lZCBpbnQgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMywgMCk7Ci0JdW5zaWduZWQgaW50IHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigzLCAwKTsKLQotCXVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJBcmJpdHJhcnlTd2l6emxlID0gRDNEUFMyMENBUFNfQVJCSVRSQVJZU1dJWlpMRTsKLQl1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyR3JhZGllbnRJbnN0cnVjdGlvbnMgPSBEM0RQUzIwQ0FQU19HUkFESUVOVElOU1RSVUNUSU9OUzsKLQl1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyUHJlZGljYXRpb24gPSBEM0RQUzIwQ0FQU19QUkVESUNBVElPTjsKLQl1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyTm9EZXBlbmRlbnRSZWFkTGltaXQgPSBEM0RQUzIwQ0FQU19OT0RFUEVOREVOVFJFQURMSU1JVDsKLQl1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyTm9UZXhJbnN0cnVjdGlvbkxpbWl0ID0gRDNEUFMyMENBUFNfTk9URVhJTlNUUlVDVElPTkxJTUlUOwotCi0JdW5zaWduZWQgbG9uZyBwaXhlbFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gRDNEUFMyMF9NQVhfRFlOQU1JQ0ZMT1dDT05UUk9MREVQVEg7Ci0JdW5zaWduZWQgbG9uZyBwaXhlbFNoYWRlclN0YXRpY0Zsb3dDb250cm9sRGVwdGggPSBEM0RQUzIwX01BWF9TVEFUSUNGTE9XQ09OVFJPTERFUFRIOwotCi0JdW5zaWduZWQgbG9uZyB2ZXJ0ZXhTaGFkZXJQcmVkaWNhdGlvbiA9IEQzRFZTMjBDQVBTX1BSRURJQ0FUSU9OOwotCXVuc2lnbmVkIGxvbmcgdmVydGV4U2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSBEM0RWUzIwX01BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsKLQotCXVuc2lnbmVkIGludCB0ZXh0dXJlTWVtb3J5ID0gMjU2ICogMTAyNCAqIDEwMjQ7Ci0JdW5zaWduZWQgaW50IG1heEFuaXNvdHJvcHkgPSAxNjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0NhcGFiaWxpdGllcy5ocHAgYi9zcmMvRDNEOS9DYXBhYmlsaXRpZXMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2JmMTkzLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0NhcGFiaWxpdGllcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q5X0NhcGFiaWxpdGllc19ocHAKLSNkZWZpbmUgRDNEOV9DYXBhYmlsaXRpZXNfaHBwCi0KLSNpbmNsdWRlICJDb25maWcuaHBwIgotCi0jaW5jbHVkZSA8ZDNkOS5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCWVudW0KLQl7Ci0JCUQzREZNVF9BVEkxID0gTUFLRUZPVVJDQygnQScsICdUJywgJ0knLCAnMScpLAotCQlEM0RGTVRfQVRJMiA9IE1BS0VGT1VSQ0MoJ0EnLCAnVCcsICdJJywgJzInKSwKLQkJRDNERk1UX0lOU1QgPSBNQUtFRk9VUkNDKCdJJywgJ04nLCAnUycsICdUJyksCi0JCUQzREZNVF9ERjI0ID0gTUFLRUZPVVJDQygnRCcsICdGJywgJzInLCAnNCcpLAotCQlEM0RGTVRfREYxNiA9IE1BS0VGT1VSQ0MoJ0QnLCAnRicsICcxJywgJzYnKSwKLQkJRDNERk1UX05VTEwgPSBNQUtFRk9VUkNDKCdOJywgJ1UnLCAnTCcsICdMJyksCi0JCUQzREZNVF9HRVQ0ID0gTUFLRUZPVVJDQygnRycsICdFJywgJ1QnLCAnNCcpLAotCQlEM0RGTVRfR0VUMSA9IE1BS0VGT1VSQ0MoJ0cnLCAnRScsICdUJywgJzEnKSwKLQkJRDNERk1UX05WREIgPSBNQUtFRk9VUkNDKCdOJywgJ1YnLCAnRCcsICdCJyksCi0JCUQzREZNVF9BMk0xID0gTUFLRUZPVVJDQygnQScsICcyJywgJ00nLCAnMScpLAotCQlEM0RGTVRfQTJNMCA9IE1BS0VGT1VSQ0MoJ0EnLCAnMicsICdNJywgJzAnKSwKLQkJRDNERk1UX0FUT0MgPSBNQUtFRk9VUkNDKCdBJywgJ1QnLCAnTycsICdDJyksCi0JCUQzREZNVF9JTlRaID0gTUFLRUZPVVJDQygnSScsICdOJywgJ1QnLCAnWicpCi0JfTsKLQotCXN0cnVjdCBDYXBhYmlsaXRpZXMKLQl7Ci0JCXN0cnVjdCBTdXJmYWNlCi0JCXsKLQkJCXN0cnVjdCBSZW5kZXJUYXJnZXQKLQkJCXsKLQkJCQlzdGF0aWMgYm9vbCBOVUxMXzsKLQkJCQlzdGF0aWMgYm9vbCBSOEc4Qjg7Ci0JCQkJc3RhdGljIGJvb2wgUjVHNkI1OwotCQkJCXN0YXRpYyBib29sIFgxUjVHNUI1OwotCQkJCXN0YXRpYyBib29sIEExUjVHNUI1OwotCQkJCXN0YXRpYyBib29sIEE0UjRHNEI0OwotCQkJCXN0YXRpYyBib29sIFIzRzNCMjsKLQkJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsKLQkJCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsKLQkJCQlzdGF0aWMgYm9vbCBBOFI4RzhCODsKLQkJCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsKLQkJCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsKLQkJCQlzdGF0aWMgYm9vbCBYOEI4RzhSODsKLQkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQkJc3RhdGljIGJvb2wgRzE2UjE2OwotCQkJCXN0YXRpYyBib29sIEEyQjEwRzEwUjEwOwotCQkJCXN0YXRpYyBib29sIEEyUjEwRzEwQjEwOwotCQkJCXN0YXRpYyBib29sIEExNkIxNkcxNlIxNjsKLQkJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCi0JCQkJc3RhdGljIGJvb2wgUjE2RjsKLQkJCQlzdGF0aWMgYm9vbCBHMTZSMTZGOwotCQkJCXN0YXRpYyBib29sIEExNkIxNkcxNlIxNkY7Ci0JCQkJc3RhdGljIGJvb2wgUjMyRjsKLQkJCQlzdGF0aWMgYm9vbCBHMzJSMzJGOwotCQkJCXN0YXRpYyBib29sIEEzMkIzMkczMlIzMkY7Ci0JCQl9OwotCi0JCQlzdHJ1Y3QgRGVwdGhTdGVuY2lsCi0JCQl7Ci0JCQkJc3RhdGljIGJvb2wgRDMyOwotCQkJCXN0YXRpYyBib29sIEQyNFM4OwotCQkJCXN0YXRpYyBib29sIEQyNFg4OwotCQkJCXN0YXRpYyBib29sIEQxNjsKLQkJCQlzdGF0aWMgYm9vbCBEMjRGUzg7Ci0JCQkJc3RhdGljIGJvb2wgRDMyRl9MT0NLQUJMRTsKLQkJCQlzdGF0aWMgYm9vbCBERjI0OwotCQkJCXN0YXRpYyBib29sIERGMTY7Ci0JCQkJc3RhdGljIGJvb2wgSU5UWjsKLQkJCX07Ci0KLQkJCXN0YXRpYyBib29sIEE4OwotCQkJc3RhdGljIGJvb2wgUjVHNkI1OwotCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7Ci0JCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKLQkJCXN0YXRpYyBib29sIEE0UjRHNEI0OwotCQkJc3RhdGljIGJvb2wgUjNHM0IyOwotCQkJc3RhdGljIGJvb2wgQThSM0czQjI7Ci0JCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsKLQkJCXN0YXRpYyBib29sIFI4RzhCODsKLQkJCXN0YXRpYyBib29sIFg4UjhHOEI4OwotCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsKLQkJCXN0YXRpYyBib29sIFg4QjhHOFI4OwotCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgUDg7Ci0JCQlzdGF0aWMgYm9vbCBBOFA4OwotCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgRzE2UjE2OwotCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7Ci0JCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKLQkJCXN0YXRpYyBib29sIEExNkIxNkcxNlIxNjsKLQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgRFhUMTsKLQkJCXN0YXRpYyBib29sIERYVDI7Ci0JCQlzdGF0aWMgYm9vbCBEWFQzOwotCQkJc3RhdGljIGJvb2wgRFhUNDsKLQkJCXN0YXRpYyBib29sIERYVDU7Ci0JCQlzdGF0aWMgYm9vbCBBVEkxOwotCQkJc3RhdGljIGJvb2wgQVRJMjsKLQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFIxNkY7Ci0JCQlzdGF0aWMgYm9vbCBHMTZSMTZGOwotCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2RjsKLQkJCXN0YXRpYyBib29sIFIzMkY7Ci0JCQlzdGF0aWMgYm9vbCBHMzJSMzJGOwotCQkJc3RhdGljIGJvb2wgQTMyQjMyRzMyUjMyRjsKLQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBMNlY1VTU7Ci0JCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsKLQkJCXN0YXRpYyBib29sIFE4VzhWOFU4OwotCQkJc3RhdGljIGJvb2wgVjE2VTE2OwotCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7Ci0JCQlzdGF0aWMgYm9vbCBRMTZXMTZWMTZVMTY7Ci0JCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgTDg7Ci0JCQlzdGF0aWMgYm9vbCBBNEw0OwotCQkJc3RhdGljIGJvb2wgTDE2OwotCQkJc3RhdGljIGJvb2wgQThMODsKLQkJCS8vIERlcHRoIEJvdW5kcyBUZXN0Ci0JCQlzdGF0aWMgYm9vbCBOVkRCOwotCQkJLy8gVHJhbnNwYXJlbmN5IGFudGktYWxpYXNpbmcKLQkJCXN0YXRpYyBib29sIEFUT0M7Ci0JCX07Ci0KLQkJc3RydWN0IFZvbHVtZQotCQl7Ci0JCQlzdGF0aWMgYm9vbCBBODsKLQkJCXN0YXRpYyBib29sIFI1RzZCNTsKLQkJCXN0YXRpYyBib29sIFgxUjVHNUI1OwotCQkJc3RhdGljIGJvb2wgQTFSNUc1QjU7Ci0JCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKLQkJCXN0YXRpYyBib29sIFIzRzNCMjsKLQkJCXN0YXRpYyBib29sIEE4UjNHM0IyOwotCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7Ci0JCQlzdGF0aWMgYm9vbCBSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsKLQkJCXN0YXRpYyBib29sIEE4UjhHOEI4OwotCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7Ci0JCQlzdGF0aWMgYm9vbCBYOEI4RzhSODsKLQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFA4OwotCQkJc3RhdGljIGJvb2wgQThQODsKLQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIEcxNlIxNjsKLQkJCXN0YXRpYyBib29sIEEyUjEwRzEwQjEwOwotCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7Ci0JCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTY7Ci0JCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIERYVDE7Ci0JCQlzdGF0aWMgYm9vbCBEWFQyOwotCQkJc3RhdGljIGJvb2wgRFhUMzsKLQkJCXN0YXRpYyBib29sIERYVDQ7Ci0JCQlzdGF0aWMgYm9vbCBEWFQ1OwotCQkJc3RhdGljIGJvb2wgQVRJMTsKLQkJCXN0YXRpYyBib29sIEFUSTI7Ci0JCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBSMTZGOwotCQkJc3RhdGljIGJvb2wgRzE2UjE2RjsKLQkJCXN0YXRpYyBib29sIEExNkIxNkcxNlIxNkY7Ci0JCQlzdGF0aWMgYm9vbCBSMzJGOwotCQkJc3RhdGljIGJvb2wgRzMyUjMyRjsKLQkJCXN0YXRpYyBib29sIEEzMkIzMkczMlIzMkY7Ci0JCQkvLyBCdW1wIG1hcCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBWOFU4OwotCQkJc3RhdGljIGJvb2wgTDZWNVU1OwotCQkJc3RhdGljIGJvb2wgWDhMOFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBROFc4VjhVODsKLQkJCXN0YXRpYyBib29sIFYxNlUxNjsKLQkJCXN0YXRpYyBib29sIEEyVzEwVjEwVTEwOwotCQkJc3RhdGljIGJvb2wgUTE2VzE2VjE2VTE2OwotCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIEw4OwotCQkJc3RhdGljIGJvb2wgQTRMNDsKLQkJCXN0YXRpYyBib29sIEwxNjsKLQkJCXN0YXRpYyBib29sIEE4TDg7Ci0JCX07Ci0KLQkJc3RydWN0IEN1YmVNYXAKLQkJewotCQkJc3RydWN0IFJlbmRlclRhcmdldAotCQkJewotCQkJCXN0YXRpYyBib29sIE5VTExfOwotCQkJCXN0YXRpYyBib29sIFI4RzhCODsKLQkJCQlzdGF0aWMgYm9vbCBSNUc2QjU7Ci0JCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7Ci0JCQkJc3RhdGljIGJvb2wgQTFSNUc1QjU7Ci0JCQkJc3RhdGljIGJvb2wgQTRSNEc0QjQ7Ci0JCQkJc3RhdGljIGJvb2wgUjNHM0IyOwotCQkJCXN0YXRpYyBib29sIEE4UjNHM0IyOwotCQkJCXN0YXRpYyBib29sIFg0UjRHNEI0OwotCQkJCXN0YXRpYyBib29sIEE4UjhHOEI4OwotCQkJCXN0YXRpYyBib29sIFg4UjhHOEI4OwotCQkJCXN0YXRpYyBib29sIEE4QjhHOFI4OwotCQkJCXN0YXRpYyBib29sIFg4QjhHOFI4OwotCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCQlzdGF0aWMgYm9vbCBHMTZSMTY7Ci0JCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7Ci0JCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7Ci0JCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2OwotCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKLQkJCQlzdGF0aWMgYm9vbCBSMTZGOwotCQkJCXN0YXRpYyBib29sIEcxNlIxNkY7Ci0JCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2RjsKLQkJCQlzdGF0aWMgYm9vbCBSMzJGOwotCQkJCXN0YXRpYyBib29sIEczMlIzMkY7Ci0JCQkJc3RhdGljIGJvb2wgQTMyQjMyRzMyUjMyRjsKLQkJCX07Ci0KLQkJCXN0cnVjdCBEZXB0aFN0ZW5jaWwKLQkJCXsKLQkJCQlzdGF0aWMgYm9vbCBEMzI7Ci0JCQkJc3RhdGljIGJvb2wgRDI0Uzg7Ci0JCQkJc3RhdGljIGJvb2wgRDI0WDg7Ci0JCQkJc3RhdGljIGJvb2wgRDE2OwotCQkJCXN0YXRpYyBib29sIEQyNEZTODsKLQkJCQlzdGF0aWMgYm9vbCBEMzJGX0xPQ0tBQkxFOwotCQkJCXN0YXRpYyBib29sIERGMjQ7Ci0JCQkJc3RhdGljIGJvb2wgREYxNjsKLQkJCQlzdGF0aWMgYm9vbCBJTlRaOwotCQkJfTsKLQotCQkJc3RhdGljIGJvb2wgQTg7Ci0JCQlzdGF0aWMgYm9vbCBSNUc2QjU7Ci0JCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKLQkJCXN0YXRpYyBib29sIEExUjVHNUI1OwotCQkJc3RhdGljIGJvb2wgQTRSNEc0QjQ7Ci0JCQlzdGF0aWMgYm9vbCBSM0czQjI7Ci0JCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsKLQkJCXN0YXRpYyBib29sIFg0UjRHNEI0OwotCQkJc3RhdGljIGJvb2wgUjhHOEI4OwotCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBBOFI4RzhCODsKLQkJCXN0YXRpYyBib29sIEE4QjhHOFI4OwotCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7Ci0JCQkvLyBQYWxldHRlZCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBQODsKLQkJCXN0YXRpYyBib29sIEE4UDg7Ci0JCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBHMTZSMTY7Ci0JCQlzdGF0aWMgYm9vbCBBMlIxMEcxMEIxMDsKLQkJCXN0YXRpYyBib29sIEEyQjEwRzEwUjEwOwotCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2OwotCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBEWFQxOwotCQkJc3RhdGljIGJvb2wgRFhUMjsKLQkJCXN0YXRpYyBib29sIERYVDM7Ci0JCQlzdGF0aWMgYm9vbCBEWFQ0OwotCQkJc3RhdGljIGJvb2wgRFhUNTsKLQkJCXN0YXRpYyBib29sIEFUSTE7Ci0JCQlzdGF0aWMgYm9vbCBBVEkyOwotCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgUjE2RjsKLQkJCXN0YXRpYyBib29sIEcxNlIxNkY7Ci0JCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTZGOwotCQkJc3RhdGljIGJvb2wgUjMyRjsKLQkJCXN0YXRpYyBib29sIEczMlIzMkY7Ci0JCQlzdGF0aWMgYm9vbCBBMzJCMzJHMzJSMzJGOwotCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgVjhVODsKLQkJCXN0YXRpYyBib29sIEw2VjVVNTsKLQkJCXN0YXRpYyBib29sIFg4TDhWOFU4OwotCQkJc3RhdGljIGJvb2wgUThXOFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBWMTZVMTY7Ci0JCQlzdGF0aWMgYm9vbCBBMlcxMFYxMFUxMDsKLQkJCXN0YXRpYyBib29sIFExNlcxNlYxNlUxNjsKLQkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCi0JCQlzdGF0aWMgYm9vbCBMODsKLQkJCXN0YXRpYyBib29sIEE0TDQ7Ci0JCQlzdGF0aWMgYm9vbCBMMTY7Ci0JCQlzdGF0aWMgYm9vbCBBOEw4OwotCQl9OwotCi0JCXN0cnVjdCBWb2x1bWVUZXh0dXJlCi0JCXsKLQkJCXN0YXRpYyBib29sIEE4OwotCQkJc3RhdGljIGJvb2wgUjVHNkI1OwotCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7Ci0JCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKLQkJCXN0YXRpYyBib29sIEE0UjRHNEI0OwotCQkJc3RhdGljIGJvb2wgUjNHM0IyOwotCQkJc3RhdGljIGJvb2wgQThSM0czQjI7Ci0JCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsKLQkJCXN0YXRpYyBib29sIFI4RzhCODsKLQkJCXN0YXRpYyBib29sIFg4UjhHOEI4OwotCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsKLQkJCXN0YXRpYyBib29sIFg4QjhHOFI4OwotCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgUDg7Ci0JCQlzdGF0aWMgYm9vbCBBOFA4OwotCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgRzE2UjE2OwotCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7Ci0JCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKLQkJCXN0YXRpYyBib29sIEExNkIxNkcxNlIxNjsKLQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgRFhUMTsKLQkJCXN0YXRpYyBib29sIERYVDI7Ci0JCQlzdGF0aWMgYm9vbCBEWFQzOwotCQkJc3RhdGljIGJvb2wgRFhUNDsKLQkJCXN0YXRpYyBib29sIERYVDU7Ci0JCQlzdGF0aWMgYm9vbCBBVEkxOwotCQkJc3RhdGljIGJvb2wgQVRJMjsKLQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFIxNkY7Ci0JCQlzdGF0aWMgYm9vbCBHMTZSMTZGOwotCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2RjsKLQkJCXN0YXRpYyBib29sIFIzMkY7Ci0JCQlzdGF0aWMgYm9vbCBHMzJSMzJGOwotCQkJc3RhdGljIGJvb2wgQTMyQjMyRzMyUjMyRjsKLQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBMNlY1VTU7Ci0JCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsKLQkJCXN0YXRpYyBib29sIFE4VzhWOFU4OwotCQkJc3RhdGljIGJvb2wgVjE2VTE2OwotCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7Ci0JCQlzdGF0aWMgYm9vbCBRMTZXMTZWMTZVMTY7Ci0JCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgTDg7Ci0JCQlzdGF0aWMgYm9vbCBBNEw0OwotCQkJc3RhdGljIGJvb2wgTDE2OwotCQkJc3RhdGljIGJvb2wgQThMODsKLQkJfTsKLQotCQlzdHJ1Y3QgVGV4dHVyZQotCQl7Ci0JCQlzdHJ1Y3QgUmVuZGVyVGFyZ2V0Ci0JCQl7Ci0JCQkJc3RhdGljIGJvb2wgTlVMTF87Ci0JCQkJc3RhdGljIGJvb2wgUjhHOEI4OwotCQkJCXN0YXRpYyBib29sIFI1RzZCNTsKLQkJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKLQkJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKLQkJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKLQkJCQlzdGF0aWMgYm9vbCBSM0czQjI7Ci0JCQkJc3RhdGljIGJvb2wgQThSM0czQjI7Ci0JCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7Ci0JCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7Ci0JCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7Ci0JCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7Ci0JCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7Ci0JCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJCXN0YXRpYyBib29sIEcxNlIxNjsKLQkJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKLQkJCQlzdGF0aWMgYm9vbCBBMlIxMEcxMEIxMDsKLQkJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTY7Ci0JCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwotCQkJCXN0YXRpYyBib29sIFIxNkY7Ci0JCQkJc3RhdGljIGJvb2wgRzE2UjE2RjsKLQkJCQlzdGF0aWMgYm9vbCBBMTZCMTZHMTZSMTZGOwotCQkJCXN0YXRpYyBib29sIFIzMkY7Ci0JCQkJc3RhdGljIGJvb2wgRzMyUjMyRjsKLQkJCQlzdGF0aWMgYm9vbCBBMzJCMzJHMzJSMzJGOwotCQkJfTsKLQotCQkJc3RydWN0IERlcHRoU3RlbmNpbAotCQkJewotCQkJCXN0YXRpYyBib29sIEQzMjsKLQkJCQlzdGF0aWMgYm9vbCBEMjRTODsKLQkJCQlzdGF0aWMgYm9vbCBEMjRYODsKLQkJCQlzdGF0aWMgYm9vbCBEMTY7Ci0JCQkJc3RhdGljIGJvb2wgRDI0RlM4OwotCQkJCXN0YXRpYyBib29sIEQzMkZfTE9DS0FCTEU7Ci0JCQkJc3RhdGljIGJvb2wgREYyNDsKLQkJCQlzdGF0aWMgYm9vbCBERjE2OwotCQkJCXN0YXRpYyBib29sIElOVFo7Ci0JCQl9OwotCi0JCQlzdGF0aWMgYm9vbCBOVUxMXzsKLQkJCXN0YXRpYyBib29sIEE4OwotCQkJc3RhdGljIGJvb2wgUjVHNkI1OwotCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7Ci0JCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKLQkJCXN0YXRpYyBib29sIEE0UjRHNEI0OwotCQkJc3RhdGljIGJvb2wgUjNHM0IyOwotCQkJc3RhdGljIGJvb2wgQThSM0czQjI7Ci0JCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsKLQkJCXN0YXRpYyBib29sIFI4RzhCODsKLQkJCXN0YXRpYyBib29sIFg4UjhHOEI4OwotCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7Ci0JCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsKLQkJCXN0YXRpYyBib29sIFg4QjhHOFI4OwotCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgUDg7Ci0JCQlzdGF0aWMgYm9vbCBBOFA4OwotCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgRzE2UjE2OwotCQkJc3RhdGljIGJvb2wgQTJSMTBHMTBCMTA7Ci0JCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKLQkJCXN0YXRpYyBib29sIEExNkIxNkcxNlIxNjsKLQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgRFhUMTsKLQkJCXN0YXRpYyBib29sIERYVDI7Ci0JCQlzdGF0aWMgYm9vbCBEWFQzOwotCQkJc3RhdGljIGJvb2wgRFhUNDsKLQkJCXN0YXRpYyBib29sIERYVDU7Ci0JCQlzdGF0aWMgYm9vbCBBVEkxOwotCQkJc3RhdGljIGJvb2wgQVRJMjsKLQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFIxNkY7Ci0JCQlzdGF0aWMgYm9vbCBHMTZSMTZGOwotCQkJc3RhdGljIGJvb2wgQTE2QjE2RzE2UjE2RjsKLQkJCXN0YXRpYyBib29sIFIzMkY7Ci0JCQlzdGF0aWMgYm9vbCBHMzJSMzJGOwotCQkJc3RhdGljIGJvb2wgQTMyQjMyRzMyUjMyRjsKLQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIFY4VTg7Ci0JCQlzdGF0aWMgYm9vbCBMNlY1VTU7Ci0JCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsKLQkJCXN0YXRpYyBib29sIFE4VzhWOFU4OwotCQkJc3RhdGljIGJvb2wgVjE2VTE2OwotCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7Ci0JCQlzdGF0aWMgYm9vbCBRMTZXMTZWMTZVMTY7Ci0JCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJc3RhdGljIGJvb2wgTDg7Ci0JCQlzdGF0aWMgYm9vbCBBNEw0OwotCQkJc3RhdGljIGJvb2wgTDE2OwotCQkJc3RhdGljIGJvb2wgQThMODsKLQkJCS8vIERlcHRoIGZvcm1hdHMKLQkJCXN0YXRpYyBib29sIEQzMjsKLQkJCXN0YXRpYyBib29sIEQyNFM4OwotCQkJc3RhdGljIGJvb2wgRDI0WDg7Ci0JCQlzdGF0aWMgYm9vbCBEMTY7Ci0JCQlzdGF0aWMgYm9vbCBEMjRGUzg7Ci0JCQlzdGF0aWMgYm9vbCBEMzJGX0xPQ0tBQkxFOwotCQkJc3RhdGljIGJvb2wgREYyNDsKLQkJCXN0YXRpYyBib29sIERGMTY7Ci0JCQlzdGF0aWMgYm9vbCBJTlRaOwotCQl9OwotCi0JCXN0YXRpYyBib29sIGlzU1JHQnJlYWRhYmxlKEQzREZPUk1BVCBmb3JtYXQpOwotCQlzdGF0aWMgYm9vbCBpc1NSR0J3cml0YWJsZShEM0RGT1JNQVQgZm9ybWF0KTsKLQl9OwotCi0JZXh0ZXJuIHVuc2lnbmVkIGludCBwaXhlbFNoYWRlclZlcnNpb25YOwotCWV4dGVybiB1bnNpZ25lZCBpbnQgdmVydGV4U2hhZGVyVmVyc2lvblg7Ci0KLQlleHRlcm4gdW5zaWduZWQgbG9uZyBwaXhlbFNoYWRlckFyYml0cmFyeVN3aXp6bGU7Ci0JZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJHcmFkaWVudEluc3RydWN0aW9uczsKLQlleHRlcm4gdW5zaWduZWQgbG9uZyBwaXhlbFNoYWRlclByZWRpY2F0aW9uOwotCWV4dGVybiB1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyTm9EZXBlbmRlbnRSZWFkTGltaXQ7Ci0JZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJOb1RleEluc3RydWN0aW9uTGltaXQ7Ci0KLQlleHRlcm4gdW5zaWduZWQgbG9uZyBwaXhlbFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoOwotCWV4dGVybiB1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVyU3RhdGljRmxvd0NvbnRyb2xEZXB0aDsKLQotCWV4dGVybiB1bnNpZ25lZCBsb25nIHZlcnRleFNoYWRlclByZWRpY2F0aW9uOwotCWV4dGVybiB1bnNpZ25lZCBsb25nIHZlcnRleFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoOwotCi0JZXh0ZXJuIHVuc2lnbmVkIGludCB0ZXh0dXJlTWVtb3J5OwotCWV4dGVybiB1bnNpZ25lZCBpbnQgbWF4QW5pc290cm9weTsKLQotCWVudW0KLQl7Ci0JCU1BWF9WRVJURVhfU0hBREVSX0NPTlNUID0gMjU2LAotCQlNQVhfUElYRUxfU0hBREVSX0NPTlNUID0gMjI0LAotCQlNQVhfVkVSVEVYX0lOUFVUUyA9IDE2LAotCQlNQVhfVkVSVEVYX09VVFBVVFMgPSAxMiwKLQkJTUFYX1BJWEVMX0lOUFVUUyA9IDEwLAotCX07Ci0KLQkvLyBTaGFkZXIgTW9kZWwgMy4wIHJlcXVpcmVtZW50cwotCXN0YXRpY19hc3NlcnQoTUFYX1ZFUlRFWF9TSEFERVJfQ09OU1QgPj0gMjU2LCAiIik7Ci0Jc3RhdGljX2Fzc2VydChNQVhfUElYRUxfU0hBREVSX0NPTlNUID09IDIyNCwgIiIpOwotCXN0YXRpY19hc3NlcnQoTUFYX1ZFUlRFWF9JTlBVVFMgPT0gMTYsICIiKTsKLQlzdGF0aWNfYXNzZXJ0KE1BWF9WRVJURVhfT1VUUFVUUyA9PSAxMiwgIiIpOwotCXN0YXRpY19hc3NlcnQoTUFYX1BJWEVMX0lOUFVUUyA9PSAxMCwgIiIpOwotCi0JLy8gQmFjay1lbmQgbWluaW11bSByZXF1aXJlbWVudHMKLQlzdGF0aWNfYXNzZXJ0KHN3OjpWRVJURVhfVU5JRk9STV9WRUNUT1JTID49IE1BWF9WRVJURVhfU0hBREVSX0NPTlNULCAiIik7Ci0Jc3RhdGljX2Fzc2VydChzdzo6RlJBR01FTlRfVU5JRk9STV9WRUNUT1JTID49IE1BWF9QSVhFTF9TSEFERVJfQ09OU1QsICIiKTsKLQlzdGF0aWNfYXNzZXJ0KHN3OjpNQVhfVkVSVEVYX0lOUFVUUyA+PSBNQVhfVkVSVEVYX0lOUFVUUywgIiIpOwotCXN0YXRpY19hc3NlcnQoc3c6Ok1BWF9WRVJURVhfT1VUUFVUUyA+PSBNQVhfVkVSVEVYX09VVFBVVFMsICIiKTsKLQlzdGF0aWNfYXNzZXJ0KHN3OjpNQVhfRlJBR01FTlRfSU5QVVRTID49IE1BWF9QSVhFTF9JTlBVVFMsICIiKTsKLX0KLQotI2VuZGlmICAgLy8gRDNEOV9DYXBhYmlsaXRpZXNfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EM0Q5LmNwcCBiL3NyYy9EM0Q5L0QzRDkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZmNTQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0QzRDkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRDkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEOUV4LmhwcCIKLQotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgInJlc291cmNlLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCWNsYXNzIERpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOQotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOSgpOwotCi0JCXZpcnR1YWwgfkRpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOSgpOwotCi0JCXZpcnR1YWwgaW50IF9fc3RkY2FsbCBWYWxpZGF0ZVNoYWRlcihsb25nICpzaGFkZXIsIGxvbmcgKnNoYWRlcjEsIGxvbmcgKnNoYWRlcjIsIGxvbmcgKnNoYWRlcjMpOwotCQl2aXJ0dWFsIGludCBfX3N0ZGNhbGwgVmFsaWRhdGVTaGFkZXIyKGxvbmcgKnNoYWRlcik7Ci0JCXZpcnR1YWwgaW50IF9fc3RkY2FsbCBWYWxpZGF0ZVNoYWRlcjMobG9uZyAqc2hhZGVyLCBsb25nICpzaGFkZXIxLCBsb25nICpzaGFkZXIyLCBsb25nICpzaGFkZXIzKTsKLQkJdmlydHVhbCBpbnQgX19zdGRjYWxsIFZhbGlkYXRlU2hhZGVyNChsb25nICpzaGFkZXIsIGxvbmcgKnNoYWRlcjEsIGxvbmcgKnNoYWRlcjIsIGxvbmcgKnNoYWRlcjMpOwotCQl2aXJ0dWFsIGludCBfX3N0ZGNhbGwgVmFsaWRhdGVTaGFkZXI1KGxvbmcgKnNoYWRlciwgbG9uZyAqc2hhZGVyMSwgbG9uZyAqc2hhZGVyMik7Ci0JCXZpcnR1YWwgaW50IF9fc3RkY2FsbCBWYWxpZGF0ZVNoYWRlcjYobG9uZyAqc2hhZGVyLCBsb25nICpzaGFkZXIxLCBsb25nICpzaGFkZXIyLCBsb25nICpzaGFkZXIzKTsKLQl9OwotCi0JRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5OjpEaXJlY3QzRFNoYWRlclZhbGlkYXRvcjkoKQotCXsKLQl9Ci0KLQlEaXJlY3QzRFNoYWRlclZhbGlkYXRvcjk6On5EaXJlY3QzRFNoYWRlclZhbGlkYXRvcjkoKQotCXsKLQl9Ci0KLQlpbnQgX19zdGRjYWxsIERpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOTo6VmFsaWRhdGVTaGFkZXIobG9uZyAqc2hhZGVyLCBsb25nICpzaGFkZXIxLCBsb25nICpzaGFkZXIyLCBsb25nICpzaGFkZXIzKSAgIC8vIEZJWE1FCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiB0cnVlOyAgIC8vIEZJWE1FCi0JfQotCi0JaW50IF9fc3RkY2FsbCBEaXJlY3QzRFNoYWRlclZhbGlkYXRvcjk6OlZhbGlkYXRlU2hhZGVyMihsb25nICpzaGFkZXIpICAgLy8gRklYTUUKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIHRydWU7ICAgLy8gRklYTUUKLQl9Ci0KLQlpbnQgX19zdGRjYWxsIERpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOTo6VmFsaWRhdGVTaGFkZXIzKGxvbmcgKnNoYWRlciwgbG9uZyAqc2hhZGVyMSwgbG9uZyAqc2hhZGVyMiwgbG9uZyAqc2hhZGVyMykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIHRydWU7ICAgLy8gRklYTUUKLQl9Ci0KLQlpbnQgX19zdGRjYWxsIERpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOTo6VmFsaWRhdGVTaGFkZXI0KGxvbmcgKnNoYWRlciwgbG9uZyAqc2hhZGVyMSwgbG9uZyAqc2hhZGVyMiwgbG9uZyAqc2hhZGVyMykKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIHRydWU7ICAgLy8gRklYTUUKLQl9Ci0KLQlpbnQgX19zdGRjYWxsIERpcmVjdDNEU2hhZGVyVmFsaWRhdG9yOTo6VmFsaWRhdGVTaGFkZXI1KGxvbmcgKnNoYWRlciwgbG9uZyAqc2hhZGVyMSwgbG9uZyAqc2hhZGVyMikgICAvLyBGSVhNRQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gdHJ1ZTsgICAvLyBGSVhNRQotCX0KLQotCWludCBfX3N0ZGNhbGwgRGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5OjpWYWxpZGF0ZVNoYWRlcjYobG9uZyAqc2hhZGVyLCBsb25nICpzaGFkZXIxLCBsb25nICpzaGFkZXIyLCBsb25nICpzaGFkZXIzKSAgIC8vIEZJWE1FCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiB0cnVlOyAgIC8vIEZJWE1FCi0JfQotfQotCi1zdGF0aWMgSU5UX1BUUiBDQUxMQkFDSyBEZWJ1Z2dlcldhaXREaWFsb2dQcm9jKEhXTkQgaHduZCwgVUlOVCB1TXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotCVJFQ1QgcmVjdDsKLQotCXN3aXRjaCh1TXNnKQotCXsKLQljYXNlIFdNX0lOSVRESUFMT0c6Ci0JCUdldFdpbmRvd1JlY3QoR2V0RGVza3RvcFdpbmRvdygpLCAmcmVjdCk7Ci0JCVNldFdpbmRvd1Bvcyhod25kLCBIV05EX1RPUCwgcmVjdC5yaWdodCAvIDIsIHJlY3QuYm90dG9tIC8gMiwgMCwgMCwgU1dQX05PU0laRSk7Ci0JCVNldFRpbWVyKGh3bmQsIDEsIDEwMCwgTlVMTCk7Ci0JCXJldHVybiBUUlVFOwotCWNhc2UgV01fQ09NTUFORDoKLQkJaWYoTE9XT1JEKHdQYXJhbSkgPT0gSURDQU5DRUwpCi0JCXsKLQkJCUVuZERpYWxvZyhod25kLCAwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFdNX1RJTUVSOgotCQlpZihJc0RlYnVnZ2VyUHJlc2VudCgpKQotCQl7Ci0JCQlFbmREaWFsb2coaHduZCwgMCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkIFdhaXRGb3JEZWJ1Z2dlcihISU5TVEFOQ0UgaW5zdGFuY2UpCi17Ci0JaWYoIUlzRGVidWdnZXJQcmVzZW50KCkpCi0JewotCQlIUlNSQyBkaWFsb2cgPSBGaW5kUmVzb3VyY2UoaW5zdGFuY2UsIE1BS0VJTlRSRVNPVVJDRShJRERfRElBTE9HMSksIFJUX0RJQUxPRyk7Ci0JCURMR1RFTVBMQVRFICpkaWFsb2dUZW1wbGF0ZSA9IChETEdURU1QTEFURSopTG9hZFJlc291cmNlKGluc3RhbmNlLCBkaWFsb2cpOwotCQlEaWFsb2dCb3hJbmRpcmVjdChpbnN0YW5jZSwgZGlhbG9nVGVtcGxhdGUsIE5VTEwsIERlYnVnZ2VyV2FpdERpYWxvZ1Byb2MpOwotCX0KLX0KLQotdXNpbmcgbmFtZXNwYWNlIEQzRDk7Ci0KLWV4dGVybiAiQyIKLXsKLQlISU5TVEFOQ0UgZGxsSW5zdGFuY2UgPSAwOwotCi0JaW50CV9fc3RkY2FsbCBEbGxNYWluKEhJTlNUQU5DRSBpbnN0YW5jZSwgdW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKnJlc2VydmVkKQotCXsKLQkJI2lmbmRlZiBOREVCVUcKLQkJCWlmKGRsbEluc3RhbmNlID09IDApCi0JCQl7Ci0JCQkJRklMRSAqZmlsZSA9IGZvcGVuKCJkZWJ1Zy50eHQiLCAidyIpOyAgIC8vIENsZWFyIGRlYnVnIGxvZwotCQkJCWlmKGZpbGUpIGZjbG9zZShmaWxlKTsKLQkJCX0KLQkJI2VuZGlmCi0KLQkJR1RSQUNFKCJISU5TVEFOQ0UgaW5zdGFuY2UgPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nIHJlYXNvbiA9ICVkLCB2b2lkICpyZXNlcnZlZCA9IDB4JTAuOHAiLCBpbnN0YW5jZSwgcmVhc29uLCByZXNlcnZlZCk7Ci0KLQkJZGxsSW5zdGFuY2UJPSBpbnN0YW5jZTsKLQotCQlzd2l0Y2gocmVhc29uKQotCQl7Ci0JCWNhc2UgRExMX1BST0NFU1NfREVUQUNIOgotCQkJYnJlYWs7Ci0JCWNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgotCQkJI2lmbmRlZiBOREVCVUcKLQkJCQlXYWl0Rm9yRGVidWdnZXIoaW5zdGFuY2UpOwotCQkJI2VuZGlmCi0JCQlEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzKGluc3RhbmNlKTsKLQkJCWJyZWFrOwotCQljYXNlIERMTF9USFJFQURfQVRUQUNIOgotCQkJYnJlYWs7Ci0JCWNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlJRGlyZWN0M0Q5ICpfX3N0ZGNhbGwgRGlyZWN0M0RDcmVhdGU5KHVuc2lnbmVkIGludCB2ZXJzaW9uKQotCXsKLQkJR1RSQUNFKCIiKTsKLQotCQkvLyBEM0RfU0RLX1ZFUlNJT04gY2hlY2sKLQkJaWYodmVyc2lvbiAhPSAoMzEgfCAweDgwMDAwMDAwKSAmJiAvLyA5LjBhL2IgREVCVUdfSU5GTwotCQkgICB2ZXJzaW9uICE9IDMxICYmICAgICAgICAgICAgICAgIC8vIDkuMGEvYgotCQkgICB2ZXJzaW9uICE9ICgzMiB8IDB4ODAwMDAwMDApICYmIC8vIDkuMGMgREVCVUdfSU5GTwotCQkgICB2ZXJzaW9uICE9IDMyKSAgICAgICAgICAgICAgICAgIC8vIDkuMGMKLQkJewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlJRGlyZWN0M0Q5ICpkZXZpY2UgPSBuZXcgRDNEOTo6RGlyZWN0M0Q5KHZlcnNpb24sIGRsbEluc3RhbmNlKTsKLQotCQlpZihkZXZpY2UpCi0JCXsKLQkJCWRldmljZS0+QWRkUmVmKCk7Ci0JCX0KLQotCQlyZXR1cm4gZGV2aWNlOwotCX0KLQotCUhSRVNVTFQgX19zdGRjYWxsIERpcmVjdDNEQ3JlYXRlOUV4KHVuc2lnbmVkIGludCB2ZXJzaW9uLCBJRGlyZWN0M0Q5RXggKipkZXZpY2UpCi0JewotCQkvLyBEM0RfU0RLX1ZFUlNJT04gY2hlY2sKLQkJaWYodmVyc2lvbiAhPSAoMzEgfCAweDgwMDAwMDAwKSAmJiAvLyA5LjBhL2IgREVCVUdfSU5GTwotCQkgICB2ZXJzaW9uICE9IDMxICYmICAgICAgICAgICAgICAgIC8vIDkuMGEvYgotCQkgICB2ZXJzaW9uICE9ICgzMiB8IDB4ODAwMDAwMDApICYmIC8vIDkuMGMgREVCVUdfSU5GTwotCQkgICB2ZXJzaW9uICE9IDMyKSAgICAgICAgICAgICAgICAgIC8vIDkuMGMKLQkJewotCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQl9Ci0KLQkJKmRldmljZSA9IG5ldyBEM0Q5OjpEaXJlY3QzRDlFeCh2ZXJzaW9uLCBkbGxJbnN0YW5jZSk7Ci0KLQkJaWYoZGV2aWNlKQotCQl7Ci0JCQkoKmRldmljZSktPkFkZFJlZigpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWludCBfX3N0ZGNhbGwgQ2hlY2tGdWxsc2NyZWVuKCkKLQl7Ci0JCUdUUkFDRSgiIik7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpbnQgX19zdGRjYWxsIEQzRFBFUkZfQmVnaW5FdmVudChEM0RDT0xPUiBjb2xvciwgY29uc3Qgd2NoYXJfdCAqbmFtZSkKLQl7Ci0JCUdUUkFDRSgiIik7Ci0KLQkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gUElYIHVuc3VwcG9ydGVkCi0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWludCBfX3N0ZGNhbGwgRDNEUEVSRl9FbmRFdmVudCgpCi0JewotCQlHVFJBQ0UoIiIpOwotCi0JLy8JVU5JTVBMRU1FTlRFRCgpOyAgIC8vIFBJWCB1bnN1cHBvcnRlZAotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBEM0RQRVJGX0dldFN0YXR1cygpCi0JewotCQlHVFJBQ0UoIiIpOwotCi0JLy8JVU5JTVBMRU1FTlRFRCgpOyAgIC8vIFBJWCB1bnN1cHBvcnRlZAotCi0JCXJldHVybiAwOwotCX0KLQotCWludCBfX3N0ZGNhbGwgRDNEUEVSRl9RdWVyeVJlcGVhdEZyYW1lKCkKLQl7Ci0JCUdUUkFDRSgiIik7Ci0KLQkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gUElYIHVuc3VwcG9ydGVkCi0KLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXZvaWQgX19zdGRjYWxsIEQzRFBFUkZfU2V0TWFya2VyKEQzRENPTE9SIGNvbG9yLCBjb25zdCB3Y2hhcl90ICpuYW1lKQotCXsKLQkJR1RSQUNFKCIiKTsKLQotCS8vCVVOSU1QTEVNRU5URUQoKTsgICAvLyBQSVggdW5zdXBwb3J0ZWQKLQl9Ci0KLQl2b2lkIF9fc3RkY2FsbCBEM0RQRVJGX1NldE9wdGlvbnModW5zaWduZWQgbG9uZyBvcHRpb25zKQotCXsKLQkJR1RSQUNFKCIiKTsKLQotCS8vCVVOSU1QTEVNRU5URUQoKTsgICAvLyBQSVggdW5zdXBwb3J0ZWQKLQl9Ci0KLQl2b2lkIF9fc3RkY2FsbCBEM0RQRVJGX1NldFJlZ2lvbihEM0RDT0xPUiBjb2xvciwgY29uc3Qgd2NoYXJfdCAqbmFtZSkKLQl7Ci0JCUdUUkFDRSgiIik7Ci0KLQkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gUElYIHVuc3VwcG9ydGVkCi0JfQotCi0Jdm9pZCBfX2NkZWNsIERlYnVnU2V0TGV2ZWwobG9uZyBsZXZlbCkKLQl7Ci0JCUdUUkFDRSgibG9uZyBsZXZlbCA9ICVkIiwgbGV2ZWwpOwotCi0JLy8JVU5JTVBMRU1FTlRFRCgpOyAgIC8vIERlYnVnIG91dHB1dCB1bnN1cHBvcnRlZAotCX0KLQotCXZvaWQgX19jZGVjbCBEZWJ1Z1NldE11dGUobG9uZyBtdXRlKQotCXsKLQkJR1RSQUNFKCJsb25nIG11dGUgPSAlZCIsIG11dGUpOwotCi0JLy8JVU5JTVBMRU1FTlRFRCgpOyAgIC8vIERlYnVnIG91dHB1dCB1bnN1cHBvcnRlZAotCX0KLQotCXZvaWQgKl9fc3RkY2FsbCBEaXJlY3QzRFNoYWRlclZhbGlkYXRvckNyZWF0ZTkoKQotCXsKLQkJR1RSQUNFKCIiKTsKLQotCS8vCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gMDsKLQotCS8vCXJldHVybiBuZXcgRDNEOTo6RGlyZWN0M0RTaGFkZXJWYWxpZGF0b3I5KCk7Ci0JfQotCi0Jdm9pZCBfX3N0ZGNhbGwgUFNHUEVycm9yKCkKLQl7Ci0JCUdUUkFDRSgiIik7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCX0KLQotCXZvaWQgX19zdGRjYWxsIFBTR1BTYW1wbGVUZXh0dXJlKCkKLQl7Ci0JCUdUUkFDRSgiIik7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0QzRDkucmMgYi9zcmMvRDNEOS9EM0Q5LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGVhMGQwLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0QzRDkucmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgZ2VuZXJhdGVkIHJlc291cmNlIHNjcmlwdC4KLS8vCi0jaW5jbHVkZSAicmVzb3VyY2UuaCIKLQotI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLgotLy8KLSNpbmNsdWRlICJXaW5kb3dzLmgiCi0jaW5jbHVkZSAiLi4vQ29tbW9uL1ZlcnNpb24uaCIKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykgcmVzb3VyY2VzCi0KLSNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkKLUxBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTCi0jcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQotCi0jaWZkZWYgQVBTVFVESU9fSU5WT0tFRAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBURVhUSU5DTFVERQotLy8KLQotMSBURVhUSU5DTFVERQotQkVHSU4KLSAgICAicmVzb3VyY2UuaFwwIgotRU5ECi0KLTIgVEVYVElOQ0xVREUKLUJFR0lOCi0gICAgIiNpbmNsdWRlICIiYWZ4cmVzLmgiIlxyXG4iCi0gICAgIiNpbmNsdWRlICIiLi4vQ29tbW9uL1ZlcnNpb24uaCIiXDAiCi1FTkQKLQotMyBURVhUSU5DTFVERQotQkVHSU4KLSAgICAiXHJcbiIKLSAgICAiXDAiCi1FTkQKLQotI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIFZlcnNpb24KLS8vCi0KLVZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTwotIEZJTEVWRVJTSU9OIE1BSk9SX1ZFUlNJT04sTUlOT1JfVkVSU0lPTixCVUlMRF9WRVJTSU9OLEJVSUxEX1JFVklTSU9OCi0gUFJPRFVDVFZFUlNJT04gTUFKT1JfVkVSU0lPTixNSU5PUl9WRVJTSU9OLEJVSUxEX1ZFUlNJT04sQlVJTERfUkVWSVNJT04KLSBGSUxFRkxBR1NNQVNLIDB4MWZMCi0jaWZkZWYgX0RFQlVHCi0gRklMRUZMQUdTIDB4OUwKLSNlbHNlCi0gRklMRUZMQUdTIDB4OEwKLSNlbmRpZgotIEZJTEVPUyAweDRMCi0gRklMRVRZUEUgMHgyTAotIEZJTEVTVUJUWVBFIDB4MEwKLUJFR0lOCi0gICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgotICAgIEJFR0lOCi0gICAgICAgIEJMT0NLICIwNDA5MDRiMCIKLSAgICAgICAgQkVHSU4KLSAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJHb29nbGUgSW5jLiIKLSAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiU3dpZnRTaGFkZXIgRGlyZWN0M0QgOSBSZW5kZXJlciIKLSAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsIFZFUlNJT05fU1RSSU5HCi0gICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgIkQzRDkiCi0gICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDE2IEdvb2dsZSBJbmMuIgotICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiZDNkOS5kbGwiCi0gICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgUkVWSVNJT05fU1RSSU5HCi0gICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiU3dpZnRTaGFkZXIgRGlyZWN0M0QgOSBSZW5kZXJlciIKLSAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIFZFUlNJT05fU1RSSU5HCi0gICAgICAgIEVORAotICAgIEVORAotICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKLSAgICBCRUdJTgotICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTIwMAotICAgIEVORAotRU5ECi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBEaWFsb2cKLS8vCi0KLUlERF9ESUFMT0cxIERJQUxPR0VYIDAsIDAsIDEyOSwgNDcKLVNUWUxFIERTX1NFVEZPTlQgfCBEU19NT0RBTEZSQU1FIHwgRFNfRklYRURTWVMgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCi1DQVBUSU9OICJXYWl0aW5nIGZvciBkZWJ1Z2dlciIKLUZPTlQgOCwgIk1TIFNoZWxsIERsZyIsIDQwMCwgMCwgMHgxCi1CRUdJTgotICAgIFBVU0hCVVRUT04gICAgICAiQ2FuY2VsIixJRENBTkNFTCw3MiwyNiw1MCwxNAotICAgIExURVhUICAgICAgICAgICAiQXR0YWNoIGEgZGVidWdnZXIgb3IgRVNDIHRvIGNhbmNlbCIsSURDX1NUQVRJQyw3LDcsMTE1LDgKLUVORAotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gREVTSUdOSU5GTwotLy8KLQotI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKLUdVSURFTElORVMgREVTSUdOSU5GTwotQkVHSU4KLSAgICBJRERfRElBTE9HMSwgRElBTE9HCi0gICAgQkVHSU4KLSAgICAgICAgTEVGVE1BUkdJTiwgNwotICAgICAgICBSSUdIVE1BUkdJTiwgMTIyCi0gICAgICAgIFRPUE1BUkdJTiwgNwotICAgICAgICBCT1RUT01NQVJHSU4sIDQwCi0gICAgRU5ECi1FTkQKLSNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECi0KLSNlbmRpZiAgICAvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotCi0jaWZuZGVmIEFQU1RVRElPX0lOVk9LRUQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDMgcmVzb3VyY2UuCi0vLwotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jZW5kaWYgICAgLy8gbm90IEFQU1RVRElPX0lOVk9LRUQKLQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGVidWcuY3BwIGIvc3JjL0QzRDkvRGVidWcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzlmNjk3Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RlYnVnLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLWludCBUcmFjZTo6aW5kZW50ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RlYnVnLmhwcCBiL3NyYy9EM0Q5L0RlYnVnLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNGE1NS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EZWJ1Zy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEZWJ1Z19ocHAKLSNkZWZpbmUgRGVidWdfaHBwCi0KLSNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotCSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2VuZGlmCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPGQzZDkuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGd1aWRkZWYuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZSBBUFBFTkQoeCwgeSkgeCAjIyB5Ci0jZGVmaW5lIE1BQ1JPX0FQUEVORCh4LCB5KSBBUFBFTkQoeCwgeSkKLSNkZWZpbmUgVU5JUVVFX0lERU5USUZJRVIocHJlZml4KSBNQUNST19BUFBFTkQocHJlZml4LCBfX0NPVU5URVJfXykKLQotc3RydWN0IFRyYWNlCi17Ci0JVHJhY2UoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JewotCQlpZihmYWxzZSkKLQkJewotCQkJRklMRSAqZmlsZSA9IGZvcGVuKCJkZWJ1Zy50eHQiLCAiYSIpOwotCi0JCQlpZihmaWxlKQotCQkJewotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgZnByaW50ZihmaWxlLCAiICIpOwotCi0JCQkJdmFfbGlzdCB2YXJhcmc7Ci0JCQkJdmFfc3RhcnQodmFyYXJnLCBmb3JtYXQpOwotCQkJCXZmcHJpbnRmKGZpbGUsIGZvcm1hdCwgdmFyYXJnKTsKLQkJCQl2YV9lbmQodmFyYXJnKTsKLQotCQkJCWZjbG9zZShmaWxlKTsKLQkJCX0KLQkJfQotCi0JCWluZGVudCsrOwotCX0KLQotCX5UcmFjZSgpCi0JewotCQlpbmRlbnQtLTsKLQl9Ci0KLQlzdGF0aWMgaW50IGluZGVudDsKLX07Ci0KLSNpZm5kZWYgTkRFQlVHCi0JI2RlZmluZSBUUkFDRShmb3JtYXQsIC4uLikgVHJhY2UgVU5JUVVFX0lERU5USUZJRVIoX3RyYWNlcl8pKCJbMHglMC44WF0lcygiZm9ybWF0IilcbiIsIHRoaXMsIF9fRlVOQ1RJT05fXywgX19WQV9BUkdTX18pCi0JI2RlZmluZSBHVFJBQ0UoZm9ybWF0LCAuLi4pIFRyYWNlKCIlcygiZm9ybWF0IilcbiIsIF9fRlVOQ1RJT05fXywgX19WQV9BUkdTX18pCi0jZWxzZQotCSNkZWZpbmUgVFJBQ0UoLi4uKSAoKHZvaWQpMCkKLQkjZGVmaW5lIEdUUkFDRSguLi4pICgodm9pZCkwKQotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0JI2RlZmluZSBBU1NFUlQoZXhwcmVzc2lvbikge2lmKCEoZXhwcmVzc2lvbikpIFRyYWNlKCJcdCEgQXNzZXJ0IGZhaWxlZCBpbiAlcyglZCk6ICIjZXhwcmVzc2lvbiJcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBhc3NlcnQoZXhwcmVzc2lvbik7fQotI2Vsc2UKLQkjZGVmaW5lIEFTU0VSVCBhc3NlcnQKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotCSNkZWZpbmUgVU5JTVBMRU1FTlRFRCgpIHtUcmFjZSgiXHQhIFVuaW1wbGVtZW50ZWQ6ICVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IEFTU0VSVChmYWxzZSk7fQotI2Vsc2UKLQkjZGVmaW5lIFVOSU1QTEVNRU5URUQoKSAoKHZvaWQpMCkKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotCSNkZWZpbmUgTk9JTlRFUkZBQ0UoaWlkKSBfTk9JTlRFUkZBQ0UoX19GVU5DVElPTl9fLCBpaWQpCi0KLQlpbmxpbmUgbG9uZyBfTk9JTlRFUkZBQ0UoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IElJRCAmaWlkKQotCXsKLQkJVHJhY2UoIlx0ISBObyBpbnRlcmZhY2UgezB4JTAuOFgsIDB4JTAuNFgsIDB4JTAuNFgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlh9IGZvciAlc1xuIiwgaWlkLkRhdGExLCBpaWQuRGF0YTIsIGlpZC5EYXRhMywgaWlkLkRhdGE0WzBdLCBpaWQuRGF0YTRbMV0sIGlpZC5EYXRhNFsyXSwgaWlkLkRhdGE0WzNdLCBpaWQuRGF0YTRbNF0sIGlpZC5EYXRhNFs1XSwgaWlkLkRhdGE0WzZdLCBpaWQuRGF0YTRbN10sIGZ1bmN0aW9uKTsKLQotCQlyZXR1cm4gRV9OT0lOVEVSRkFDRTsKLQl9Ci0jZWxzZQotCSNkZWZpbmUgTk9JTlRFUkZBQ0UoaWlkKSBFX05PSU5URVJGQUNFCi0jZW5kaWYKLQotI2lmbmRlZiBOREVCVUcKLQlpbmxpbmUgbG9uZyBJTlZBTElEQ0FMTCgpCi0JewotCQlUcmFjZSgiXHQhIEQzREVSUl9JTlZBTElEQ0FMTFxuIik7Ci0KLQkJcmV0dXJuIEQzREVSUl9JTlZBTElEQ0FMTDsKLQl9Ci0jZWxzZQotCSNkZWZpbmUgSU5WQUxJRENBTEwoKSBEM0RFUlJfSU5WQUxJRENBTEwKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotCWlubGluZSBsb25nIE9VVE9GTUVNT1JZKCkKLQl7Ci0JCVRyYWNlKCJcdCEgRV9PVVRPRk1FTU9SWVxuIik7Ci0KLQkJcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0JfQotI2Vsc2UKLQkjZGVmaW5lIE9VVE9GTUVNT1JZKCkgRV9PVVRPRk1FTU9SWQotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0JaW5saW5lIGxvbmcgT1VUT0ZWSURFT01FTU9SWSgpCi0JewotCQlUcmFjZSgiXHQhIEQzREVSUl9PVVRPRlZJREVPTUVNT1JZXG4iKTsKLQotCQlyZXR1cm4gRDNERVJSX09VVE9GVklERU9NRU1PUlk7Ci0JfQotI2Vsc2UKLQkjZGVmaW5lIE9VVE9GVklERU9NRU1PUlkoKSBEM0RFUlJfT1VUT0ZWSURFT01FTU9SWQotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0JaW5saW5lIGxvbmcgTk9UQVZBSUxBQkxFKCkKLQl7Ci0JCVRyYWNlKCJcdCEgRDNERVJSX05PVEFWQUlMQUJMRVxuIik7Ci0KLQkJcmV0dXJuIEQzREVSUl9OT1RBVkFJTEFCTEU7Ci0JfQotI2Vsc2UKLQkjZGVmaW5lIE5PVEFWQUlMQUJMRSgpIEQzREVSUl9OT1RBVkFJTEFCTEUKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotCWlubGluZSBsb25nIE5PVEZPVU5EKCkKLQl7Ci0JCVRyYWNlKCJcdCEgRDNERVJSX05PVEZPVU5EXG4iKTsKLQotCQlyZXR1cm4gRDNERVJSX05PVEZPVU5EOwotCX0KLSNlbHNlCi0JI2RlZmluZSBOT1RGT1VORCgpIEQzREVSUl9OT1RGT1VORAotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0JaW5saW5lIGxvbmcgTU9SRURBVEEoKQotCXsKLQkJVHJhY2UoIlx0ISBEM0RFUlJfTU9SRURBVEFcbiIpOwotCi0JCXJldHVybiBEM0RFUlJfTU9SRURBVEE7Ci0JfQotI2Vsc2UKLQkjZGVmaW5lIE1PUkVEQVRBKCkgRDNERVJSX01PUkVEQVRBCi0jZW5kaWYKLQotI2lmbmRlZiBOREVCVUcKLQlpbmxpbmUgbG9uZyBGQUlMKCkKLQl7Ci0JCVRyYWNlKCJcdCEgRV9GQUlMXG4iKTsKLQotCQlyZXR1cm4gRV9GQUlMOwotCX0KLSNlbHNlCi0JI2RlZmluZSBGQUlMKCkgRV9GQUlMCi0jZW5kaWYKLQotI2VuZGlmICAgLy8gRGVidWdfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRDkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0Q5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlZDg1NS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRDkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0Q5LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiQ2FwYWJpbGl0aWVzLmhwcCIKLSNpbmNsdWRlICJDb25maWd1cmF0b3IuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLSNpbmNsdWRlICJDUFVJRC5ocHAiCi0jaW5jbHVkZSAiVmVyc2lvbi5oIgotI2luY2x1ZGUgIkNvbmZpZy5ocHAiCi0KLSNkZWZpbmUgQ09NUElMRV9NVUxUSU1PTl9TVFVCUwotI2luY2x1ZGUgPG11bHRpbW9uLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cHNhcGkuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlEaXJlY3QzRDk6OkRpcmVjdDNEOShpbnQgdmVyc2lvbiwgY29uc3QgSElOU1RBTkNFIGluc3RhbmNlKSA6IHZlcnNpb24odmVyc2lvbiksIGluc3RhbmNlKGluc3RhbmNlKQotCXsKLQkJZGlzcGxheU1vZGUgPSAwOwotCQludW1EaXNwbGF5TW9kZXMgPSAwOwotCi0JCURFVk1PREUgZGV2bW9kZTsKLQkJZGV2bW9kZS5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7Ci0KLQkJLy8gQ291bnQgbnVtYmVyIG9mIGRpc3BsYXkgbW9kZXMKLQkJd2hpbGUoRW51bURpc3BsYXlTZXR0aW5ncygwLCBudW1EaXNwbGF5TW9kZXMsICZkZXZtb2RlKSkgICAvLyBGSVhNRTogT25seSBlbnVtYXJhdGUgaW50ZXJuYWwgbW9kZXMhCi0JCXsKLQkJCW51bURpc3BsYXlNb2RlcysrOwotCQl9Ci0KLQkJZGlzcGxheU1vZGUgPSBuZXcgREVWTU9ERVtudW1EaXNwbGF5TW9kZXNdOwotCi0JCS8vIFN0b3JlIGRpc3BsYXkgbW9kZXMgaW5mb3JtYXRpb24KLQkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQotCQl7Ci0JCQlkaXNwbGF5TW9kZVtpXS5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7Ci0JCQlFbnVtRGlzcGxheVNldHRpbmdzKDAsIGksICZkaXNwbGF5TW9kZVtpXSk7Ci0JCX0KLQotCQlkM2Q5TGliID0gMDsKLQkJZDNkOSA9IDA7Ci0KLQkJc3c6OkNvbmZpZ3VyYXRvciBpbmkoIlN3aWZ0U2hhZGVyLmluaSIpOwotCi0JCWRpc2FibGVBbHBoYU1vZGUgPSBpbmkuZ2V0Qm9vbGVhbigiVGVzdGluZyIsICJEaXNhYmxlQWxwaGFNb2RlIiwgZmFsc2UpOwotCQlkaXNhYmxlMTBCaXRNb2RlID0gaW5pLmdldEJvb2xlYW4oIlRlc3RpbmciLCAiRGlzYWJsZTEwQml0TW9kZSIsIGZhbHNlKTsKLQotCQlpbnQgcHMgPSBpbmkuZ2V0SW50ZWdlcigiQ2FwYWJpbGl0aWVzIiwgIlBpeGVsU2hhZGVyVmVyc2lvbiIsIDMwKTsKLQkJaW50IHZzID0gaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJWZXJ0ZXhTaGFkZXJWZXJzaW9uIiwgMzApOwotCi0JCSAgICAgaWYocHMgPT0gIDApIHBpeGVsU2hhZGVyVmVyc2lvblggPSBEM0RQU19WRVJTSU9OKDAsIDApOwotCQllbHNlIGlmKHBzIDw9IDExKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigxLCAxKTsKLQkJZWxzZSBpZihwcyA8PSAxMikgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMSwgMik7Ci0JCWVsc2UgaWYocHMgPD0gMTMpIHBpeGVsU2hhZGVyVmVyc2lvblggPSBEM0RQU19WRVJTSU9OKDEsIDMpOwotCQllbHNlIGlmKHBzIDw9IDE0KSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigxLCA0KTsKLQkJZWxzZSBpZihwcyA8PSAyMCkgcGl4ZWxTaGFkZXJWZXJzaW9uWCA9IEQzRFBTX1ZFUlNJT04oMiwgMCk7Ci0JCWVsc2UgaWYocHMgPD0gMjEpIHBpeGVsU2hhZGVyVmVyc2lvblggPSBEM0RQU19WRVJTSU9OKDIsIDEpOwotCQllbHNlICAgICAgICAgICAgICBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigzLCAwKTsKLQotCQkgICAgIGlmKHZzID09ICAwKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uWCA9IEQzRFZTX1ZFUlNJT04oMCwgMCk7Ci0JCWVsc2UgaWYodnMgPD0gMTEpIHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigxLCAxKTsKLQkJZWxzZSBpZih2cyA8PSAyMCkgdmVydGV4U2hhZGVyVmVyc2lvblggPSBEM0RWU19WRVJTSU9OKDIsIDApOwotCQllbHNlIGlmKHZzIDw9IDIxKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uWCA9IEQzRFZTX1ZFUlNJT04oMiwgMSk7Ci0JCWVsc2UgICAgICAgICAgICAgIHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigzLCAwKTsKLQotCQlwaXhlbFNoYWRlckFyYml0cmFyeVN3aXp6bGUgPSAwOwotCQlwaXhlbFNoYWRlckdyYWRpZW50SW5zdHJ1Y3Rpb25zID0gMDsKLQkJcGl4ZWxTaGFkZXJQcmVkaWNhdGlvbiA9IDA7Ci0JCXBpeGVsU2hhZGVyTm9EZXBlbmRlbnRSZWFkTGltaXQgPSAwOwotCQlwaXhlbFNoYWRlck5vVGV4SW5zdHJ1Y3Rpb25MaW1pdCA9IDA7Ci0KLQkJcGl4ZWxTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFBTMjBfTUlOX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIOwotCQlwaXhlbFNoYWRlclN0YXRpY0Zsb3dDb250cm9sRGVwdGggPSBEM0RQUzIwX01JTl9TVEFUSUNGTE9XQ09OVFJPTERFUFRIOwotCi0JCWlmKHBzID49IDIxKQotCQl7Ci0JCQlwaXhlbFNoYWRlckFyYml0cmFyeVN3aXp6bGUgPSBEM0RQUzIwQ0FQU19BUkJJVFJBUllTV0laWkxFOwotCQkJcGl4ZWxTaGFkZXJHcmFkaWVudEluc3RydWN0aW9ucyA9IEQzRFBTMjBDQVBTX0dSQURJRU5USU5TVFJVQ1RJT05TOwotCQkJcGl4ZWxTaGFkZXJQcmVkaWNhdGlvbiA9IEQzRFBTMjBDQVBTX1BSRURJQ0FUSU9OOwotCQkJcGl4ZWxTaGFkZXJOb0RlcGVuZGVudFJlYWRMaW1pdCA9IEQzRFBTMjBDQVBTX05PREVQRU5ERU5UUkVBRExJTUlUOwotCQkJcGl4ZWxTaGFkZXJOb1RleEluc3RydWN0aW9uTGltaXQgPSBEM0RQUzIwQ0FQU19OT1RFWElOU1RSVUNUSU9OTElNSVQ7Ci0KLQkJCXBpeGVsU2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSBEM0RQUzIwX01BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsKLQkJCXBpeGVsU2hhZGVyU3RhdGljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFBTMjBfTUFYX1NUQVRJQ0ZMT1dDT05UUk9MREVQVEg7Ci0JCX0KLQotCQl2ZXJ0ZXhTaGFkZXJQcmVkaWNhdGlvbiA9IDA7Ci0JCXZlcnRleFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gMDsKLQotCQlpZih2cyA+PSAyMSkKLQkJewotCQkJdmVydGV4U2hhZGVyUHJlZGljYXRpb24gPSBEM0RWUzIwQ0FQU19QUkVESUNBVElPTjsKLQkJCXZlcnRleFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gRDNEVlMyMF9NQVhfRFlOQU1JQ0ZMT1dDT05UUk9MREVQVEg7Ci0JCX0KLQotCQl0ZXh0dXJlTWVtb3J5ID0gMTAyNCAqIDEwMjQgKiBpbmkuZ2V0SW50ZWdlcigiQ2FwYWJpbGl0aWVzIiwgIlRleHR1cmVNZW1vcnkiLCAyNTYpOwotCi0JCWludCBzaGFkb3dNYXBwaW5nID0gaW5pLmdldEludGVnZXIoIlRlc3RpbmciLCAiU2hhZG93TWFwcGluZyIsIDMpOwotCi0JCWlmKHNoYWRvd01hcHBpbmcgIT0gMiAmJiBzaGFkb3dNYXBwaW5nICE9IDMpICAgLy8gTm8gRFNUIHN1cHBvcnQKLQkJewotCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMiA9IGZhbHNlOwotCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFM4ID0gZmFsc2U7Ci0JCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0WDggPSBmYWxzZTsKLQkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMTYgPSBmYWxzZTsKLQkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRGUzggPSBmYWxzZTsKLQkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMzJGX0xPQ0tBQkxFID0gZmFsc2U7Ci0KLQkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDMyID0gZmFsc2U7Ci0JCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNFM4ID0gZmFsc2U7Ci0JCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNFg4ID0gZmFsc2U7Ci0JCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQxNiA9IGZhbHNlOwotCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMjRGUzggPSBmYWxzZTsKLQkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDMyRl9MT0NLQUJMRSA9IGZhbHNlOwotCQl9Ci0KLQkJaWYoc2hhZG93TWFwcGluZyAhPSAxICYmIHNoYWRvd01hcHBpbmcgIT0gMykgICAvLyBObyBGZXRjaDQgc3VwcG9ydAotCQl7Ci0JCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYyNCA9IGZhbHNlOwotCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkRGMTYgPSBmYWxzZTsKLQotCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpERjI0ID0gZmFsc2U7Ci0JCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRGMTYgPSBmYWxzZTsKLQkJfQotCX0KLQotCURpcmVjdDNEOTo6fkRpcmVjdDNEOSgpCi0JewotCQlkZWxldGVbXSBkaXNwbGF5TW9kZTsKLQkJZGlzcGxheU1vZGUgPSAwOwotCi0JCWlmKGQzZDkpCi0JCXsKLQkJCWQzZDktPlJlbGVhc2UoKTsKLQkJCWQzZDkgPSAwOwotCQl9Ci0KLQkJaWYoZDNkOUxpYikKLQkJewotCQkJRnJlZUxpYnJhcnkoZDNkOUxpYik7Ci0JCQlkM2Q5TGliID0gMDsKLQkJfQotCX0KLQotCWxvbmcgRGlyZWN0M0Q5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCVRSQUNFKCJjb25zdCBJSUQgJmlpZCA9IDB4JTAuOHAsIHZvaWQgKipvYmplY3QgPSAweCUwLjhwIiwgaWlkLCBvYmplY3QpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0Q5OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRDk6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0Q5OjpDaGVja0RlcHRoU3RlbmNpbE1hdGNoKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBEM0RGT1JNQVQgZGVwdGhTdGVuY2lsRm9ybWF0KQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCA9ICVkLCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0ID0gJWQsIEQzREZPUk1BVCBkZXB0aFN0ZW5jaWxGb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHJlbmRlclRhcmdldEZvcm1hdCwgZGVwdGhTdGVuY2lsRm9ybWF0KTsKLQotCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQotCQl7Ci0JCQlsb2FkU3lzdGVtRDNEOSgpOwotCi0JCQlpZihkM2Q5KQotCQkJewotCQkJCXJldHVybiBkM2Q5LT5DaGVja0RlcHRoU3RlbmNpbE1hdGNoKGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHJlbmRlclRhcmdldEZvcm1hdCwgZGVwdGhTdGVuY2lsRm9ybWF0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsgICAvLyBBbnkgZm9ybWF0IGNvbWJpbmF0aW9uIGlzIG9rCi0JfQotCi0JbG9uZyBEaXJlY3QzRDk6OkNoZWNrRGV2aWNlRm9ybWF0KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RSRVNPVVJDRVRZUEUgcmVzb3VyY2VUeXBlLCBEM0RGT1JNQVQgY2hlY2tGb3JtYXQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0ID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgRDNEUkVTT1VSQ0VUWVBFIHJlc291cmNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgY2hlY2tGb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKLQotCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQotCQl7Ci0JCQlsb2FkU3lzdGVtRDNEOSgpOwotCi0JCQlpZihkM2Q5KQotCQkJewotCQkJCXJldHVybiBkM2Q5LT5DaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBhZGFwdGVyRm9ybWF0LCB1c2FnZSwgcmVzb3VyY2VUeXBlLCBjaGVja0Zvcm1hdCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIENoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBhZGFwdGVyRm9ybWF0LCB1c2FnZSwgcmVzb3VyY2VUeXBlLCBjaGVja0Zvcm1hdCk7Ci0JCQl9Ci0JCX0KLQotCQlpZih1c2FnZSAmIEQzRFVTQUdFX1FVRVJZX1NSR0JSRUFEKQotCQl7Ci0JCQlpZighQ2FwYWJpbGl0aWVzOjppc1NSR0JyZWFkYWJsZShjaGVja0Zvcm1hdCkpCi0JCQl7Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfQotCQl9Ci0KLQkJaWYodXNhZ2UgJiBEM0RVU0FHRV9RVUVSWV9TUkdCV1JJVEUpCi0JCXsKLQkJCWlmKCFDYXBhYmlsaXRpZXM6OmlzU1JHQndyaXRhYmxlKGNoZWNrRm9ybWF0KSkKLQkJCXsKLQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBVEkgaGFjayB0byBpbmRpY2F0ZSBpbnN0YW5jaW5nIHN1cHBvcnQgb24gU00gMi4wIGhhcmR3YXJlCi0JCWlmKGNoZWNrRm9ybWF0ID09IEQzREZNVF9JTlNUICYmIHBpeGVsU2hhZGVyVmVyc2lvblggPj0gRDNEUFNfVkVSU0lPTigyLCAwKSAmJiBwaXhlbFNoYWRlclZlcnNpb25YIDwgRDNEUFNfVkVSU0lPTigzLCAwKSkKLQkJewotCQkJcmV0dXJuIEQzRF9PSzsKLQkJfQotCi0JCXN3aXRjaChyZXNvdXJjZVR5cGUpCi0JCXsKLQkJY2FzZSBEM0RSVFlQRV9TVVJGQUNFOgotCQkJaWYodXNhZ2UgJiBEM0RVU0FHRV9SRU5ERVJUQVJHRVQpCi0JCQl7Ci0JCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQotCQkJCXsKLQkJCQljYXNlIEQzREZNVF9OVUxMOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6TlVMTF8pCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjVHNkI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkExUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE0UjRHNEI0KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg0UjRHNEI0KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4QjhHOFI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMlIxMEcxMEIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNikJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSMTZGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNkYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSMzJGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkczMlIzMkYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEzMkIzMkczMlIzMkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKHVzYWdlICYgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKQotCQkJewotCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0QyNFM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0UzgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0WDg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRYOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0RlM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0RlM4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDMyRl9MT0NLQUJMRToJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMzJGX0xPQ0tBQkxFKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9ERjI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6REYyNCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9ERjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6REYxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9JTlRaOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6SU5UWikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOEI4RzhSOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBQYWxldHRlZCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfUDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFA4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMTZSMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEyUjEwRzEwQjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEyQjEwRzEwUjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMTZCMTZHMTZSMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQVRJMToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBVEkxKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0FUSTI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QVRJMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMTZSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkExNkIxNkcxNlIxNkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RzMyUjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMzJCMzJHMzJSMzJGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfVjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMNlY1VTUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOEw4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UThXOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1ExNlcxNlYxNlUxNjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UTE2VzE2VjE2VTE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0wxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMMTYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBEZXB0aCBCb3VuZHMgVGVzdAotCQkJCWNhc2UgRDNERk1UX05WREI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TlZEQikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBUcmFuc3BhcmVuY3kgYW50aS1hbGlhc2luZwotCQkJCWNhc2UgRDNERk1UX0FUT0M6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QVRPQykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQljYXNlIEQzRFJUWVBFX1ZPTFVNRToKLQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCXsKLQkJCWNhc2UgRDNERk1UX0E4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYMVI1RzVCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTFSNUc1QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE0UjRHNEI0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlIzRzNCMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg0UjRHNEI0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDhSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYOEI4RzhSOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThCOEc4UjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkvLyBQYWxldHRlZCBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9QODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQThQODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpHMTZSMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJSMTBHMTBCMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMTZCMTZHMTZSMTYpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJY2FzZSBEM0RGTVRfRFhUMToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQxKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0RYVDI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9EWFQzOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDMpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRFhUNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQ0KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0RYVDU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUNSkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BVEkxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkFUSTEpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQVRJMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBVEkyKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKLQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjE2RikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzE2UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkExNkIxNkcxNlIxNkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSMzJGKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpHMzJSMzJGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTMyQjMyRzMyUjMyRikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkvLyBCdW1wIG1hcCBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9WOFU4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlY4VTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Okw2VjVVNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDhMOFY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlE4VzhWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfUTE2VzE2VjE2VTE2OgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpRMTZXMTZWMTZVMTYpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9MODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBNEw0KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0wxNjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpMMTYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQThMODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOEw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfQotCQljYXNlIEQzRFJUWVBFX0NVQkVURVhUVVJFOgotCQkJaWYodXNhZ2UgJiBEM0RVU0FHRV9SRU5ERVJUQVJHRVQpCi0JCQl7Ci0JCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQotCQkJCXsKLQkJCQljYXNlIEQzREZNVF9OVUxMOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6TlVMTF8pCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjVHNkI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkExUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE0UjRHNEI0KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg0UjRHNEI0KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4QjhHOFI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMlIxMEcxMEIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNikJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSMTZGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNkYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSMzJGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkczMlIzMkYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkEzMkIzMkczMlIzMkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKHVzYWdlICYgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKQotCQkJewotCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0QyNFM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0UzgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0WDg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRYOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0RlM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0RlM4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDMyRl9MT0NLQUJMRToJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMzJGX0xPQ0tBQkxFKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9ERjI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6REYyNCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9ERjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6REYxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9JTlRaOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6SU5UWikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOEI4RzhSOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBQYWxldHRlZCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfUDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFA4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpHMTZSMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkEyUjEwRzEwQjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkEyQjEwRzEwUjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMTZCMTZHMTZSMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQVRJMToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBVEkxKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0FUSTI6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QVRJMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpHMTZSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExNkIxNkcxNlIxNkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzMyUjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMzJCMzJHMzJSMzJGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfVjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMNlY1VTUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOEw4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UThXOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1ExNlcxNlYxNlUxNjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UTE2VzE2VjE2VTE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0wxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMMTYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQljYXNlIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkU6Ci0JCQlzd2l0Y2goY2hlY2tGb3JtYXQpCi0JCQl7Ci0JCQljYXNlIEQzREZNVF9BODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI1RzZCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBNFI0RzRCNCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9SM0czQjI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYNFI0RzRCNCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOFI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9YOEI4RzhSODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEI4RzhSOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOEI4RzhSOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkvLyBQYWxldHRlZCBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9QODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlA4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BOFA4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFA4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkcxNlIxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyUjEwRzEwQjEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMkIxMEcxMFIxMCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkExNkIxNkcxNlIxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJY2FzZSBEM0RGTVRfRFhUMToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMykJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRFhUNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRFhUNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQVRJMToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QVRJMSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQVRJMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QVRJMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwotCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UjE2RikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRzE2UjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMTZSMTZGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMTZCMTZHMTZSMTZGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UjMyRikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpHMzJSMzJGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX0EzMkIzMkczMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMzJCMzJHMzJSMzJGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwotCQkJY2FzZSBEM0RGTVRfVjhVODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMNlY1VTUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhMOFY4VTgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UThXOFY4VTgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpWMTZVMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMlcxMFYxMFUxMCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNERk1UX1ExNlcxNlYxNlUxNjoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlExNlcxNlYxNlUxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCi0JCQljYXNlIEQzREZNVF9MODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Okw4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9BNEw0OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBNEw0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzREZNVF9MMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkwxNikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RGTVRfQThMODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThMOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQl9Ci0JCWNhc2UgRDNEUlRZUEVfVEVYVFVSRToKLQkJCWlmKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKQotCQkJewotCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGTVRfTlVMTDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Ok5VTExfKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTJSMTBHMTBCMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKLQkJCQljYXNlIEQzREZNVF9SMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6UjE2RikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTZGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6UjMyRikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMzJCMzJHMzJSMzJGKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZih1c2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKLQkJCXsKLQkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCi0JCQkJewotCQkJCWNhc2UgRDNERk1UX0QzMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EMjRTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFM4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0WDgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0QyNEZTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNEZTOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfREYyNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkRGMjQpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfREYxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkRGMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfSU5UWjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OklOVFopCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCi0JCQkJewotCQkJCWNhc2UgRDNERk1UX05VTEw6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TlVMTF8pCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYOEI4RzhSOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBQYWxldHRlZCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfUDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BOFA4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpHMTZSMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyUjEwRzEwQjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyQjEwRzEwUjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMTZCMTZHMTZSMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQVRJMToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBVEkxKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0FUSTI6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QVRJMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpHMTZSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkExNkIxNkcxNlIxNkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RzMyUjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMzJCMzJHMzJSMzJGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfVjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMNlY1VTUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYOEw4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UThXOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX1ExNlcxNlYxNlUxNjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UTE2VzE2VjE2VTE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwotCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0wxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMMTYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQkvLyBEZXB0aCBmb3JtYXRzCi0JCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQzMikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0UzgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0WDg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0WDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQxNikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfRDI0RlM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNEZTOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9EMzJGX0xPQ0tBQkxFOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMzJGX0xPQ0tBQkxFKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQljYXNlIEQzREZNVF9ERjI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRGMjQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7Ci0JCQkJY2FzZSBEM0RGTVRfREYxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpERjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwotCQkJCWNhc2UgRDNERk1UX0lOVFo6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6SU5UWikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJfQotCQljYXNlIEQzRFJUWVBFX1ZFUlRFWEJVRkZFUjoKLQkJCWlmKGNoZWNrRm9ybWF0ID09IEQzREZNVF9WRVJURVhEQVRBKQotCQkJewotCQkJCXJldHVybiBEM0RfT0s7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfQotCQljYXNlIEQzRFJUWVBFX0lOREVYQlVGRkVSOgotCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQotCQkJewotCQkJY2FzZSBEM0RGTVRfSU5ERVgxNjoKLQkJCWNhc2UgRDNERk1UX0lOREVYMzI6Ci0JCQkJcmV0dXJuIEQzRF9PSzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJfQotCX0KLQotCWxvbmcgRGlyZWN0M0Q5OjpDaGVja0RldmljZUZvcm1hdENvbnZlcnNpb24odW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHNvdXJjZUZvcm1hdCwgRDNERk9STUFUIHRhcmdldEZvcm1hdCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNERk9STUFUIHNvdXJjZUZvcm1hdCA9ICVkLCBEM0RGT1JNQVQgdGFyZ2V0Rm9ybWF0ID0gJWQiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBzb3VyY2VGb3JtYXQsIHRhcmdldEZvcm1hdCk7Ci0KLQkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKLQkJewotCQkJbG9hZFN5c3RlbUQzRDkoKTsKLQotCQkJaWYoZDNkOSkKLQkJCXsKLQkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKGFkYXB0ZXIsIGRldmljZVR5cGUsIHNvdXJjZUZvcm1hdCwgdGFyZ2V0Rm9ybWF0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBzb3VyY2VGb3JtYXQsIHRhcmdldEZvcm1hdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0Q5OjpDaGVja0RldmljZU11bHRpU2FtcGxlVHlwZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgc3VyZmFjZUZvcm1hdCwgaW50IHdpbmRvd2VkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSwgdW5zaWduZWQgbG9uZyAqcXVhbGl0eUxldmVscykKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQgPSAlZCwgaW50IHdpbmRvd2VkID0gJWQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGVUeXBlID0gJWQsIHVuc2lnbmVkIGxvbmcgKnF1YWxpdHlMZXZlbHMgPSAweCUwLjhwIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSwgcXVhbGl0eUxldmVscyk7Ci0KLQkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKLQkJewotCQkJbG9hZFN5c3RlbUQzRDkoKTsKLQotCQkJaWYoZDNkOSkKLQkJCXsKLQkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoYWRhcHRlciwgZGV2aWNlVHlwZSwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSwgcXVhbGl0eUxldmVscyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIENoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlLCBxdWFsaXR5TGV2ZWxzKTsKLQkJCX0KLQkJfQotCi0JCWlmKGFkYXB0ZXIgPj0gR2V0QWRhcHRlckNvdW50KCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYocXVhbGl0eUxldmVscykKLQkJewotCQkJaWYobXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFX05PTk1BU0tBQkxFKQotCQkJewotCQkJCSpxdWFsaXR5TGV2ZWxzID0gNDsgICAvLyAyLCA0LCA4LCAxNiBzYW1wbGVzCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJKnF1YWxpdHlMZXZlbHMgPSAxOwotCQkJfQotCQl9Ci0KLQkJaWYobXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFX05PTkUgfHwKLQkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFX05PTk1BU0tBQkxFIHx8Ci0JCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV8yX1NBTVBMRVMgfHwKLQkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzRfU0FNUExFUyB8fAotCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfOF9TQU1QTEVTIHx8Ci0JCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV8xNl9TQU1QTEVTKQotCQl7Ci0JCQlpZihDaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCwgRDNEUlRZUEVfU1VSRkFDRSwgc3VyZmFjZUZvcm1hdCkgPT0gRDNEX09LIHx8Ci0JCQkgICBDaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCwgRDNEUlRZUEVfU1VSRkFDRSwgc3VyZmFjZUZvcm1hdCkgPT0gRDNEX09LKQotCQkJewotCQkJCWlmKHN1cmZhY2VGb3JtYXQgIT0gRDNERk1UX0QzMkZfTE9DS0FCTEUgJiYgc3VyZmFjZUZvcm1hdCAhPSBEM0RGTVRfRDE2X0xPQ0tBQkxFKQotCQkJCXsKLQkJCQkJcmV0dXJuIEQzRF9PSzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDk6OkNoZWNrRGV2aWNlVHlwZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBjaGVja1R5cGUsIEQzREZPUk1BVCBkaXNwbGF5Rm9ybWF0LCBEM0RGT1JNQVQgYmFja0J1ZmZlckZvcm1hdCwgaW50IHdpbmRvd2VkKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgY2hlY2tUeXBlID0gJWQsIEQzREZPUk1BVCBkaXNwbGF5Rm9ybWF0ID0gJWQsIEQzREZPUk1BVCBiYWNrQnVmZmVyRm9ybWF0ID0gJWQsIGludCB3aW5kb3dlZCA9ICVkIiwgYWRhcHRlciwgY2hlY2tUeXBlLCBkaXNwbGF5Rm9ybWF0LCBiYWNrQnVmZmVyRm9ybWF0LCB3aW5kb3dlZCk7Ci0KLQkJaWYoY2hlY2tUeXBlICE9IEQzRERFVlRZUEVfSEFMKQotCQl7Ci0JCQlsb2FkU3lzdGVtRDNEOSgpOwotCi0JCQlpZihkM2Q5KQotCQkJewotCQkJCXJldHVybiBkM2Q5LT5DaGVja0RldmljZVR5cGUoYWRhcHRlciwgY2hlY2tUeXBlLCBkaXNwbGF5Rm9ybWF0LCBiYWNrQnVmZmVyRm9ybWF0LCB3aW5kb3dlZCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIENoZWNrRGV2aWNlVHlwZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOwotCQkJfQotCQl9Ci0KLQkJaWYoYWRhcHRlciA+PSBHZXRBZGFwdGVyQ291bnQoKSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlzd2l0Y2goZGlzcGxheUZvcm1hdCkKLQkJewotCQljYXNlIEQzREZNVF9VTktOT1dOOgotCQkJaWYod2luZG93ZWQgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfQotCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoKLQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6Ci0JCQlpZihkaXNhYmxlMTBCaXRNb2RlKQotCQkJewotCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCX0KLQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6Ci0JCWNhc2UgRDNERk1UX1I1RzZCNToKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQl9Ci0KLQkJaWYod2luZG93ZWQgIT0gRkFMU0UpCi0JCXsKLQkJCXN3aXRjaChiYWNrQnVmZmVyRm9ybWF0KQotCQkJewotCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6Ci0JCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoKLQkJCQlpZihkaXNhYmxlMTBCaXRNb2RlKQotCQkJCXsKLQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJCX0KLQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgotCQkJCWlmKGRpc2FibGVBbHBoYU1vZGUpCi0JCQkJewotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJY2FzZSBEM0RGTVRfVU5LTk9XTjoKLQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgotCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgotCQkvLwljYXNlIEQzREZNVF9YMVI1RzVCNTogICAgICAvLyBGSVhNRTogU3VwcG9ydGVkIGJ5IFJFRgotCQkvLwljYXNlIEQzREZNVF9BMVI1RzVCNTogICAgICAvLyBGSVhNRTogU3VwcG9ydGVkIGJ5IFJFRgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzd2l0Y2goYmFja0J1ZmZlckZvcm1hdCkKLQkJCXsKLQkJCWNhc2UgRDNERk1UX1VOS05PV046Ci0JCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoKLQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgotCQkJCWlmKGRpc2FibGUxMEJpdE1vZGUpCi0JCQkJewotCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQkJfQotCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6Ci0JCQkJaWYoZGlzYWJsZUFscGhhTW9kZSkKLQkJCQl7Ci0JCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCQl9Ci0JCQljYXNlIEQzREZNVF9YOFI4RzhCODoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBIV05EIGZvY3VzV2luZG93ID0gJWQsIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncyA9IDB4JTAuOFgsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwLCBJRGlyZWN0M0REZXZpY2U5ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSAweCUwLjhwIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7Ci0KLQkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKLQkJewotCQkJbG9hZFN5c3RlbUQzRDkoKTsKLQotCQkJaWYoZDNkOSkKLQkJCXsKLQkJCQlyZXR1cm4gZDNkOS0+Q3JlYXRlRGV2aWNlKGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiBDcmVhdGVEZXZpY2UoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOwotCQkJfQotCQl9Ci0KLQkJaWYoIWZvY3VzV2luZG93IHx8ICFwcmVzZW50UGFyYW1ldGVycyB8fCAhcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCi0JCXsKLQkJCSpyZXR1cm5lZERldmljZUludGVyZmFjZSA9IDA7Ci0KLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gbmV3IERpcmVjdDNERGV2aWNlOShpbnN0YW5jZSwgdGhpcywgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzKTsKLQotCQlpZigqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCi0JCXsKLQkJCSgqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpLT5BZGRSZWYoKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDk6OkVudW1BZGFwdGVyTW9kZXModW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzREZPUk1BVCBmb3JtYXQsIHVuc2lnbmVkIGludCBpbmRleCwgRDNERElTUExBWU1PREUgKm1vZGUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCB1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgRDNERElTUExBWU1PREUgKm1vZGUgPSAweCUwLjhwIiwgYWRhcHRlciwgZm9ybWF0LCBpbmRleCwgbW9kZSk7Ci0KLQkJaWYoYWRhcHRlciAhPSBEM0RBREFQVEVSX0RFRkFVTFQgfHwgIW1vZGUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJdW5zaWduZWQgaW50IGJwcCA9IDMyOwotCi0JCXN3aXRjaChmb3JtYXQpCi0JCXsKLQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlicHAgPSAxNjsgYnJlYWs7Ci0JCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglicHAgPSAzMjsgYnJlYWs7Ci0JCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJYnBwID0gMzI7IGJyZWFrOwotCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJYnBwID0gMTY7IGJyZWFrOwotCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWJwcCA9IDE2OyBicmVhazsKLQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlicHAgPSAzMjsgYnJlYWs7Ci0JCWRlZmF1bHQ6IHJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQotCQl7Ci0JCQlpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gYnBwKQotCQkJewotCQkJCWlmKGluZGV4LS0gPT0gMCkKLQkJCQl7Ci0JCQkJCW1vZGUtPldpZHRoID0gZGlzcGxheU1vZGVbaV0uZG1QZWxzV2lkdGg7Ci0JCQkJCW1vZGUtPkhlaWdodCA9IGRpc3BsYXlNb2RlW2ldLmRtUGVsc0hlaWdodDsKLQkJCQkJbW9kZS0+UmVmcmVzaFJhdGUgPSBkaXNwbGF5TW9kZVtpXS5kbURpc3BsYXlGcmVxdWVuY3k7Ci0JCQkJCW1vZGUtPkZvcm1hdCA9IGZvcm1hdDsKLQotCQkJCQlyZXR1cm4gRDNEX09LOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCX0KLQotCXVuc2lnbmVkIGludCBEaXJlY3QzRDk6OkdldEFkYXB0ZXJDb3VudCgpCi0JewotCQlUUkFDRSgidm9pZCIpOwotCi0JCXJldHVybiAxOyAgIC8vIFN3aWZ0U2hhZGVyIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgZGlzcGxheSBhZGFwdGVycwotCX0KLQotCWxvbmcgRGlyZWN0M0Q5OjpHZXRBZGFwdGVyRGlzcGxheU1vZGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERJU1BMQVlNT0RFICptb2RlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERJU1BMQVlNT0RFICptb2RlID0gMHglMC44cCIsIGFkYXB0ZXIsIG1vZGUpOwotCi0JCWlmKGFkYXB0ZXIgIT0gRDNEQURBUFRFUl9ERUZBVUxUIHx8ICFtb2RlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCUhEQyBkZXZpY2VDb250ZXh0ID0gR2V0REMoMCk7Ci0KLQkJbW9kZS0+V2lkdGggPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgSE9SWlJFUyk7Ci0JCW1vZGUtPkhlaWdodCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBWRVJUUkVTKTsKLQkJbW9kZS0+UmVmcmVzaFJhdGUgPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgVlJFRlJFU0gpOwotCQl1bnNpZ25lZCBpbnQgYnBwID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIEJJVFNQSVhFTCk7Ci0KLQkJUmVsZWFzZURDKDAsIGRldmljZUNvbnRleHQpOwotCi0JCWJwcCA9IDMyOyAgIC8vIEZJWE1FCi0KLQkJc3dpdGNoKGJwcCkKLQkJewotCQljYXNlIDMyOiBtb2RlLT5Gb3JtYXQgPSBEM0RGTVRfWDhSOEc4Qjg7IGJyZWFrOwotCQljYXNlIDI0OiBtb2RlLT5Gb3JtYXQgPSBEM0RGTVRfUjhHOEI4OyAgIGJyZWFrOwotCQljYXNlIDE2OiBtb2RlLT5Gb3JtYXQgPSBEM0RGTVRfUjVHNkI1OyAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkJQVNTRVJUKGZhbHNlKTsgICAvLyBVbmV4cGVjdGVkIGRpc3BsYXkgbW9kZSBjb2xvciBkZXB0aAotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEOTo6R2V0QWRhcHRlcklkZW50aWZpZXIodW5zaWduZWQgaW50IGFkYXB0ZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIEQzREFEQVBURVJfSURFTlRJRklFUjkgKmlkZW50aWZpZXIpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgdW5zaWduZWQgbG9uZyBmbGFncyA9IDB4JTAuOFgsIEQzREFEQVBURVJfSURFTlRJRklFUjkgKmlkZW50aWZpZXIgPSAweCUwLjhwIiwgYWRhcHRlciwgZmxhZ3MsIGlkZW50aWZpZXIpOwotCi0JCWlmKCFpZGVudGlmaWVyKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN3OjpDb25maWd1cmF0b3IgaW5pKCJTd2lmdFNoYWRlci5pbmkiKTsKLQkJaW50IGlkID0gaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJJZGVudGlmaWVyIiwgMCk7Ci0KLQkJaWYoaWQgPT0gMSkKLQkJewotCQkJdW5zaWduZWQgc2hvcnQgcHJvZHVjdCA9IDY7Ci0JCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMTQ7Ci0JCQl1bnNpZ25lZCBzaG9ydCBzdWJWZXJzaW9uID0gMTA7Ci0JCQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbiA9IDg0NDA7Ci0JCQlHVUlEIGd1aWQgPSB7MHhEN0I3MUUzRSwgMHg0MUQyLCAweDExQ0YsIHsweDk2LCAweDUzLCAweDdBLCAweDIzLCAweDAwLCAweEMyLCAweENCLCAweDM1fX07Ci0KLQkJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uSGlnaFBhcnQgPSBwcm9kdWN0IDw8IDE2IHwgdmVyc2lvbjsKLQkJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uTG93UGFydCA9IHN1YlZlcnNpb24gPDwgMTYgfCByZXZpc2lvbjsKLQkJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJudjRfZGlzcC5kbGwiKTsKLQkJCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIk5WSURJQSBHZUZvcmNlIDc5MDAgR1MiKTsKLQkJCXN0cmNweShpZGVudGlmaWVyLT5EZXZpY2VOYW1lLCAiXFxcXC5cXERJU1BMQVkxIik7Ci0JCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDB4MTBERTsKLQkJCWlkZW50aWZpZXItPkRldmljZUlkID0gMHgwMjkyOwotCQkJaWRlbnRpZmllci0+U3ViU3lzSWQgPSAweDAzNzAxMERFOwotCQkJaWRlbnRpZmllci0+UmV2aXNpb24gPSAweDAwQTE7Ci0JCQlpZGVudGlmaWVyLT5EZXZpY2VJZGVudGlmaWVyID0gZ3VpZDsKLQkJCWlkZW50aWZpZXItPldIUUxMZXZlbCA9IDE7Ci0KLQkJCXJldHVybiBEM0RfT0s7Ci0JCX0KLQkJZWxzZSBpZihpZCA9PSAyKQotCQl7Ci0JCQl1bnNpZ25lZCBzaG9ydCBwcm9kdWN0ID0gNzsKLQkJCXVuc2lnbmVkIHNob3J0IHZlcnNpb24gPSAxNDsKLQkJCXVuc2lnbmVkIHNob3J0IHN1YlZlcnNpb24gPSAxMDsKLQkJCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uID0gNDY0OwotCQkJR1VJRCBndWlkID0gezB4RDdCNzFFRTIsIDB4MzI4NSwgMHgxMUNGLCB7MHgxMSwgMHg3MiwgMHgwRCwgMHhBMiwgMHhBMSwgMHhDMiwgMHhDQSwgMHgzNX19OwotCi0JCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247Ci0JCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkxvd1BhcnQgPSBzdWJWZXJzaW9uIDw8IDE2IHwgcmV2aXNpb247Ci0JCQlzdHJjcHkoaWRlbnRpZmllci0+RHJpdmVyLCAiYXRpdW1kYWcuZGxsIik7Ci0JCQlzdHJjcHkoaWRlbnRpZmllci0+RGVzY3JpcHRpb24sICJBVEkgTW9iaWxpdHkgUmFkZW9uIFgxNjAwIik7Ci0JCQlzdHJjcHkoaWRlbnRpZmllci0+RGV2aWNlTmFtZSwgIlxcXFwuXFxESVNQTEFZMSIpOwotCQkJaWRlbnRpZmllci0+VmVuZG9ySWQgPSAweDEwMDI7Ci0JCQlpZGVudGlmaWVyLT5EZXZpY2VJZCA9IDB4NzFDNTsKLQkJCWlkZW50aWZpZXItPlN1YlN5c0lkID0gMHg4MjA3MTA3MTsKLQkJCWlkZW50aWZpZXItPlJldmlzaW9uID0gMHgwMDAwOwotCQkJaWRlbnRpZmllci0+RGV2aWNlSWRlbnRpZmllciA9IGd1aWQ7Ci0JCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAxOwotCi0JCQlyZXR1cm4gRDNEX09LOwotCQl9Ci0JCWVsc2UgaWYoaWQgPT0gMykKLQkJewotCQkJdW5zaWduZWQgc2hvcnQgcHJvZHVjdCA9IDc7Ci0JCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMTQ7Ci0JCQl1bnNpZ25lZCBzaG9ydCBzdWJWZXJzaW9uID0gMTA7Ci0JCQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbiA9IDE0Mzc7Ci0JCQlHVUlEIGd1aWQgPSB7MHhEN0I3OEU2NiwgMHg2OTQyLCAweDExQ0YsIHsweDA1LCAweDc2LCAweDAzLCAweDIyLCAweEFELCAweEMyLCAweENBLCAweDM1fX07Ci0KLQkJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uSGlnaFBhcnQgPSBwcm9kdWN0IDw8IDE2IHwgdmVyc2lvbjsKLQkJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uTG93UGFydCA9IHN1YlZlcnNpb24gPDwgMTYgfCByZXZpc2lvbjsKLQkJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJpZ2R1bWQ2NC5kbGwiKTsKLQkJCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIkludGVsIEdNQSBYMzEwMCIpOwotCQkJc3RyY3B5KGlkZW50aWZpZXItPkRldmljZU5hbWUsICJcXFxcLlxcRElTUExBWTEiKTsKLQkJCWlkZW50aWZpZXItPlZlbmRvcklkID0gMHg4MDg2OwotCQkJaWRlbnRpZmllci0+RGV2aWNlSWQgPSAweDJBMDI7Ci0JCQlpZGVudGlmaWVyLT5TdWJTeXNJZCA9IDB4MDIwOTEwMjg7Ci0JCQlpZGVudGlmaWVyLT5SZXZpc2lvbiA9IDB4MDAwQzsKLQkJCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOwotCQkJaWRlbnRpZmllci0+V0hRTExldmVsID0gMTsKLQotCQkJcmV0dXJuIEQzRF9PSzsKLQkJfQotCQllbHNlIGlmKGlkID09IDQpCi0JCXsKLQkJCWxvYWRTeXN0ZW1EM0Q5KCk7Ci0KLQkJCWlmKGQzZDkpCi0JCQl7Ci0JCQkJcmV0dXJuIGQzZDktPkdldEFkYXB0ZXJJZGVudGlmaWVyKGFkYXB0ZXIsIGZsYWdzLCBpZGVudGlmaWVyKTsKLQkJCX0KLQkJfQotCi0JCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSAnc3cnOwotCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMzsKLQkJdW5zaWduZWQgc2hvcnQgc3ViVmVyc2lvbiA9IDA7Ci0JCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uID0gQlVJTERfUkVWSVNJT047Ci0JCUdVSUQgZ3VpZCA9IHsweDAwMDAwMDAwLCAweDAwMDAsIDB4MDAwMCwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9fTsKLQotCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247Ci0JCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uTG93UGFydCA9IHN1YlZlcnNpb24gPDwgMTYgfCByZXZpc2lvbjsKLQkJc3RyY3B5KGlkZW50aWZpZXItPkRyaXZlciwgIlN3aWZ0U2hhZGVyIik7Ci0JCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIkdvb2dsZSBTd2lmdFNoYWRlciAzRCBSZW5kZXJlciIpOwotCQlzdHJjcHkoaWRlbnRpZmllci0+RGV2aWNlTmFtZSwgIlxcXFwuXFxESVNQTEFZMSIpOwotCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDA7Ci0JCWlkZW50aWZpZXItPkRldmljZUlkID0gMDsKLQkJaWRlbnRpZmllci0+U3ViU3lzSWQgPSAwOwotCQlpZGVudGlmaWVyLT5SZXZpc2lvbiA9IDA7Ci0JCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOwotCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAwOwotCi0JCWNoYXIgZXhlTmFtZVtNQVhfUEFUSCArIDFdOwotCQlpbnQgbiA9IEdldE1vZHVsZUJhc2VOYW1lKEdldEN1cnJlbnRQcm9jZXNzKCksIDAsIGV4ZU5hbWUsIE1BWF9QQVRIKTsKLQkJZXhlTmFtZVtuXSA9ICdcMCc7Ci0KLQkJaWYoc3RybmNtcChleGVOYW1lLCAiRmFsbG91dCIsIDcpID09IDApCi0JCXsKLQkJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJudjRfZGlzcC5kbGwiKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JdW5zaWduZWQgaW50IERpcmVjdDNEOTo6R2V0QWRhcHRlck1vZGVDb3VudCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERk9STUFUIGZvcm1hdCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQiLCBhZGFwdGVyLCBmb3JtYXQpOwotCi0JCWlmKGFkYXB0ZXIgIT0gRDNEQURBUFRFUl9ERUZBVUxUKQotCQl7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWludCBtb2RlQ291bnQgPSAwOwotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBudW1EaXNwbGF5TW9kZXM7IGkrKykKLQkJewotCQkJc3dpdGNoKGZvcm1hdCkKLQkJCXsKLQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgotCQkJCWlmKCFkaXNhYmxlQWxwaGFNb2RlKQotCQkJCXsKLQkJCQkJaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDMyKSBtb2RlQ291bnQrKzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzREZNVF9YOFI4RzhCODogICAgaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDMyKSBtb2RlQ291bnQrKzsgYnJlYWs7Ci0JCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoKLQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgotCQkJCWlmKCFkaXNhYmxlMTBCaXRNb2RlKQotCQkJCXsKLQkJCQkJaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDMyKSBtb2RlQ291bnQrKzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCS8vCWNhc2UgRDNERk1UX1I4RzhCODogICAgICBpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMjQpIG1vZGVDb3VudCsrOyBicmVhazsgICAvLyBOT1RFOiBEZXByZWNhdGVkIGJ5IERpcmVjdFggOQotCQkJY2FzZSBEM0RGTVRfUjVHNkI1OiAgICAgIGlmKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCA9PSAxNikgbW9kZUNvdW50Kys7IGJyZWFrOwotCQkvLwljYXNlIEQzREZNVF9YMVI1RzVCNTogICAgaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDE2KSBtb2RlQ291bnQrKzsgYnJlYWs7Ci0JCS8vCWNhc2UgRDNERk1UX0ExUjVHNUI1OiAgICBpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMTYpIG1vZGVDb3VudCsrOyBicmVhazsKLQkJLy8JZGVmYXVsdDoKLQkJLy8JCUFTU0VSVChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kZUNvdW50OwotCX0KLQotCUhNT05JVE9SIERpcmVjdDNEOTo6R2V0QWRhcHRlck1vbml0b3IodW5zaWduZWQgaW50IGFkYXB0ZXIpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCIsIGFkYXB0ZXIpOwotCi0JCVBPSU5UIHBvaW50ID0gezAsIDB9OwotCi0JCXJldHVybiBNb25pdG9yRnJvbVBvaW50KHBvaW50LCBNT05JVE9SX0RFRkFVTFRUT1BSSU1BUlkpOyAgIC8vIEZJWE1FOiBJZ25vcmVzIGFkYXB0ZXIgcGFyYW1ldGVyCi0JfQotCi0JbG9uZyBEaXJlY3QzRDk6OkdldERldmljZUNhcHModW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNEQ0FQUzkgKmNhcGFiaWxpdGllcykKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNEQ0FQUzkgKmNhcGFiaWxpdGllcyA9IDB4JTAuOHAiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBjYXBhYmlsaXRpZXMpOwotCi0JCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCi0JCXsKLQkJCWxvYWRTeXN0ZW1EM0Q5KCk7Ci0KLQkJCWlmKGQzZDkpCi0JCQl7Ci0JCQkJcmV0dXJuIGQzZDktPkdldERldmljZUNhcHMoYWRhcHRlciwgZGV2aWNlVHlwZSwgY2FwYWJpbGl0aWVzKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gR2V0RGV2aWNlQ2FwcyhhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgY2FwYWJpbGl0aWVzKTsKLQkJCX0KLQkJfQotCi0JCWlmKCFjYXBhYmlsaXRpZXMpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJdW5zaWduZWQgaW50IHBpeGVsU2hhZGVyVmVyc2lvbiA9IHBpeGVsU2hhZGVyVmVyc2lvblg7Ci0JCXVuc2lnbmVkIGludCB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gdmVydGV4U2hhZGVyVmVyc2lvblg7Ci0KLQkJaWYocGl4ZWxTaGFkZXJWZXJzaW9uID09IEQzRFBTX1ZFUlNJT04oMiwgMSkpIHBpeGVsU2hhZGVyVmVyc2lvbiA9IEQzRFBTX1ZFUlNJT04oMiwgMCk7Ci0JCWlmKHZlcnRleFNoYWRlclZlcnNpb24gPT0gRDNEVlNfVkVSU0lPTigyLCAxKSkgdmVydGV4U2hhZGVyVmVyc2lvbiA9IEQzRFZTX1ZFUlNJT04oMiwgMCk7Ci0KLQkJdW5zaWduZWQgaW50IG1heGltdW1WZXJ0ZXhTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IDA7Ci0JCXVuc2lnbmVkIGludCBtYXhpbXVtUGl4ZWxTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IDA7Ci0JCXVuc2lnbmVkIGludCBtYXhpbXVtVmVydGV4U2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gMDsKLQkJdW5zaWduZWQgaW50IG1heGltdW1QaXhlbFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IDA7Ci0KLQkJaWYodmVydGV4U2hhZGVyVmVyc2lvbiA+PSBEM0RWU19WRVJTSU9OKDEsIDApKSBtYXhpbXVtVmVydGV4U2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSAweEZGRkZGRkZGOwotCQlpZihwaXhlbFNoYWRlclZlcnNpb24gPj0gRDNEUFNfVkVSU0lPTigxLCAwKSkgbWF4aW11bVBpeGVsU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSAweEZGRkZGRkZGOwotCQlpZih2ZXJ0ZXhTaGFkZXJWZXJzaW9uID49IEQzRFZTX1ZFUlNJT04oMywgMCkpIG1heGltdW1WZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSAzMjc2ODsKLQkJaWYocGl4ZWxTaGFkZXJWZXJzaW9uID49IEQzRFBTX1ZFUlNJT04oMywgMCkpIG1heGltdW1QaXhlbFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IDMyNzY4OwotCi0JCUQzRENBUFM5IGNhcHM7Ci0JCVplcm9NZW1vcnkoJmNhcHMsIHNpemVvZihEM0RDQVBTOSkpOwotCi0JCS8vIERldmljZSBpbmZvCi0JCWNhcHMuRGV2aWNlVHlwZSA9IEQzRERFVlRZUEVfSEFMOwotCQljYXBzLkFkYXB0ZXJPcmRpbmFsID0gRDNEQURBUFRFUl9ERUZBVUxUOwotCi0JCS8vIENhcHMgZnJvbSBEWDcKLQkJY2Fwcy5DYXBzID0JRDNEQ0FQU19SRUFEX1NDQU5MSU5FOwotCi0JCWNhcHMuQ2FwczIgPQkJRDNEQ0FQUzJfQ0FOQVVUT0dFTk1JUE1BUCB8CQkvLyBUaGUgZHJpdmVyIGlzIGNhcGFibGUgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0aW5nIG1pcG1hcHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQXV0b21hdGljIEdlbmVyYXRpb24gb2YgTWlwbWFwcyAoRGlyZWN0M0QgOSkuCi0JCQkJCQkvLwlEM0RDQVBTMl9DQU5DQUxJQlJBVEVHQU1NQSB8CS8vIFRoZSBzeXN0ZW0gaGFzIGEgY2FsaWJyYXRvciBpbnN0YWxsZWQgdGhhdCBjYW4gYXV0b21hdGljYWxseSBhZGp1c3QgdGhlIGdhbW1hIHJhbXAgc28gdGhhdCB0aGUgcmVzdWx0IGlzIGlkZW50aWNhbCBvbiBhbGwgc3lzdGVtcyB0aGF0IGhhdmUgYSBjYWxpYnJhdG9yLiBUbyBpbnZva2UgdGhlIGNhbGlicmF0b3Igd2hlbiBzZXR0aW5nIG5ldyBnYW1tYSBsZXZlbHMsIHVzZSB0aGUgRDNEU0dSX0NBTElCUkFURSBmbGFnIHdoZW4gY2FsbGluZyBTZXRHYW1tYVJhbXAuIENhbGlicmF0aW5nIGdhbW1hIHJhbXBzIGluY3VycyBzb21lIHByb2Nlc3Npbmcgb3ZlcmhlYWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmcmVxdWVudGx5LgotCQkJCQkJLy8JRDNEQ0FQUzJfQ0FOU0hBUkVSRVNPVVJDRSB8CQkvLyBUaGUgZGV2aWNlIGNhbiBjcmVhdGUgc2hhcmFibGUgcmVzb3VyY2VzLiBNZXRob2RzIHRoYXQgY3JlYXRlIHJlc291cmNlcyBjYW4gc2V0IG5vbi1OVUxMIHZhbHVlcyBmb3IgdGhlaXIgcFNoYXJlZEhhbmRsZSBwYXJhbWV0ZXJzLiBEaWZmZXJlbmNlcyBiZXR3ZWVuIERpcmVjdDNEIDkgYW5kIERpcmVjdDNEIDlFeDpUaGlzIGZsYWcgaXMgYXZhaWxhYmxlIGluIERpcmVjdDNEIDlFeCBvbmx5LgotCQkJCQkJLy8JRDNEQ0FQUzJfQ0FOTUFOQUdFUkVTT1VSQ0UgfAkvLyBUaGUgZHJpdmVyIGlzIGNhcGFibGUgb2YgbWFuYWdpbmcgcmVzb3VyY2VzLiBPbiBzdWNoIGRyaXZlcnMsIEQzRFBPT0xfTUFOQUdFRCByZXNvdXJjZXMgd2lsbCBiZSBtYW5hZ2VkIGJ5IHRoZSBkcml2ZXIuIFRvIGhhdmUgRGlyZWN0M0Qgb3ZlcnJpZGUgdGhlIGRyaXZlciBzbyB0aGF0IERpcmVjdDNEIG1hbmFnZXMgcmVzb3VyY2VzLCB1c2UgdGhlIEQzRENSRUFURV9ESVNBQkxFX0RSSVZFUl9NQU5BR0VNRU5UIGZsYWcgd2hlbiBjYWxsaW5nIENyZWF0ZURldmljZS4KLQkJCQkJCQlEM0RDQVBTMl9EWU5BTUlDVEVYVFVSRVMgfCAJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgZHluYW1pYyB0ZXh0dXJlcy4KLQkJCQkJCQlEM0RDQVBTMl9GVUxMU0NSRUVOR0FNTUE7CQkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIGR5bmFtaWMgZ2FtbWEgcmFtcCBhZGp1c3RtZW50IGluIGZ1bGwtc2NyZWVuIG1vZGUuCi0KLQkJY2Fwcy5DYXBzMyA9CQlEM0RDQVBTM19BTFBIQV9GVUxMU0NSRUVOX0ZMSVBfT1JfRElTQ0FSRCB8CS8vIEluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgY2FuIHJlc3BlY3QgdGhlIEQzRFJTX0FMUEhBQkxFTkRFTkFCTEUgcmVuZGVyIHN0YXRlIGluIGZ1bGwtc2NyZWVuIG1vZGUgd2hpbGUgdXNpbmcgdGhlIEZMSVAgb3IgRElTQ0FSRCBzd2FwIGVmZmVjdC4KLQkJCQkJCQlEM0RDQVBTM19DT1BZX1RPX1ZJRE1FTSB8CQkJCQkvLyBEZXZpY2UgY2FuIGFjY2VsZXJhdGUgYSBtZW1vcnkgY29weSBmcm9tIHN5c3RlbSBtZW1vcnkgdG8gbG9jYWwgdmlkZW8gbWVtb3J5LgotCQkJCQkJCUQzRENBUFMzX0NPUFlfVE9fU1lTVEVNTUVNOwkJCQkJLy8gRGV2aWNlIGNhbiBhY2NlbGVyYXRlIGEgbWVtb3J5IGNvcHkgZnJvbSBsb2NhbCB2aWRlbyBtZW1vcnkgdG8gc3lzdGVtIG1lbW9yeS4KLQkJCQkJCS8vCUQzRENBUFMzX0xJTkVBUl9UT19TUkdCX1BSRVNFTlRBVElPTjsJCS8vIEluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgY2FuIHBlcmZvcm0gZ2FtbWEgY29ycmVjdGlvbiBmcm9tIGEgd2luZG93ZWQgYmFjayBidWZmZXIgKGNvbnRhaW5pbmcgbGluZWFyIGNvbnRlbnQpIHRvIGFuIHNSR0IgZGVza3RvcC4KLQotCQljYXBzLlByZXNlbnRhdGlvbkludGVydmFscyA9CQlEM0RQUkVTRU5UX0lOVEVSVkFMX0lNTUVESUFURSB8Ci0JCQkJCQkJCQkJCUQzRFBSRVNFTlRfSU5URVJWQUxfT05FOwotCQkJCQkJCQkJCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfVFdPOwotCQkJCQkJCQkJCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfVEhSRUU7Ci0JCQkJCQkJCQkJLy8JRDNEUFJFU0VOVF9JTlRFUlZBTF9GT1VSOwotCi0JCS8vIEN1cnNvciBjYXBzCi0JCWNhcHMuQ3Vyc29yQ2FwcyA9CUQzRENVUlNPUkNBUFNfQ09MT1IJfAkvLyBBIGZ1bGwtY29sb3IgY3Vyc29yIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZS4gU3BlY2lmaWNhbGx5LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyBhdCBsZWFzdCBhIGhhcmR3YXJlIGNvbG9yIGN1cnNvciBpbiBoaWdoLXJlc29sdXRpb24gbW9kZXMgKHdpdGggc2NhbiBsaW5lcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNDAwKS4KLQkJCQkJCQlEM0RDVVJTT1JDQVBTX0xPV1JFUzsJLy8gQSBmdWxsLWNvbG9yIGN1cnNvciBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuIFNwZWNpZmljYWxseSwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBkcml2ZXIgc3VwcG9ydHMgYSBoYXJkd2FyZSBjb2xvciBjdXJzb3IgaW4gYm90aCBoaWdoLXJlc29sdXRpb24gYW5kIGxvdy1yZXNvbHV0aW9uIG1vZGVzICh3aXRoIHNjYW4gbGluZXMgbGVzcyB0aGFuIDQwMCkuCi0KLQkJLy8gM0QgRGV2aWNlIGNhcHMKLQkJY2Fwcy5EZXZDYXBzID0JCUQzRERFVkNBUFNfQ0FOQkxUU1lTVE9OT05MT0NBTCB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgYmxpdHMgZnJvbSBzeXN0ZW0tbWVtb3J5IHRleHR1cmVzIHRvIG5vbmxvY2FsIHZpZGVvLW1lbW9yeSB0ZXh0dXJlcy4KLQkJCQkJCQlEM0RERVZDQVBTX0NBTlJFTkRFUkFGVEVSRkxJUCB8CQkJLy8gRGV2aWNlIGNhbiBxdWV1ZSByZW5kZXJpbmcgY29tbWFuZHMgYWZ0ZXIgYSBwYWdlIGZsaXAuIEFwcGxpY2F0aW9ucyBkbyBub3QgY2hhbmdlIHRoZWlyIGJlaGF2aW9yIGlmIHRoaXMgZmxhZyBpcyBzZXQ7IHRoaXMgY2FwYWJpbGl0eSBtZWFucyB0aGF0IHRoZSBkZXZpY2UgaXMgcmVsYXRpdmVseSBmYXN0LgotCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyIHwJCQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgRHJhd1ByaW1pdGl2ZXMyLgotCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyRVggfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBleHRlbmRlZCBEcmF3UHJpbWl0aXZlczI7IHRoYXQgaXMsIHRoaXMgaXMgYSBEaXJlY3RYIDcuMC1jb21wbGlhbnQgZHJpdmVyLgotCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1UTFZFUlRFWCB8CQkJLy8gRGV2aWNlIGV4cG9ydHMgYW4gSURpcmVjdDNERGV2aWNlOTo6RHJhd1ByaW1pdGl2ZS1hd2FyZSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBsYXllciAoSEFMKS4KLQkJCQkJCQlEM0RERVZDQVBTX0VYRUNVVEVTWVNURU1NRU1PUlkgfAkJLy8gRGV2aWNlIGNhbiB1c2UgZXhlY3V0ZSBidWZmZXJzIGZyb20gc3lzdGVtIG1lbW9yeS4KLQkJCQkJCQlEM0RERVZDQVBTX0VYRUNVVEVWSURFT01FTU9SWSB8CQkJLy8gRGV2aWNlIGNhbiB1c2UgZXhlY3V0ZSBidWZmZXJzIGZyb20gdmlkZW8gbWVtb3J5LgotCQkJCQkJCUQzRERFVkNBUFNfSFdSQVNURVJJWkFUSU9OIHwJCQkvLyBEZXZpY2UgaGFzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBmb3Igc2NlbmUgcmFzdGVyaXphdGlvbi4KLQkJCQkJCQlEM0RERVZDQVBTX0hXVFJBTlNGT1JNQU5ETElHSFQgfAkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IHRyYW5zZm9ybWF0aW9uIGFuZCBsaWdodGluZyBpbiBoYXJkd2FyZS4KLQkJCQkJCS8vCUQzRERFVkNBUFNfTlBBVENIRVMgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIE4gcGF0Y2hlcy4KLQkJCQkJCQlEM0RERVZDQVBTX1BVUkVERVZJQ0UgfAkJCQkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IHJhc3Rlcml6YXRpb24sIHRyYW5zZm9ybSwgbGlnaHRpbmcsIGFuZCBzaGFkaW5nIGluIGhhcmR3YXJlLgotCQkJCQkJLy8JRDNEREVWQ0FQU19RVUlOVElDUlRQQVRDSEVTIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcXVpbnRpYyBC6XppZXIgY3VydmVzIGFuZCBCLXNwbGluZXMuCi0JCQkJCQkvLwlEM0RERVZDQVBTX1JUUEFUQ0hFUyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcmVjdGFuZ3VsYXIgYW5kIHRyaWFuZ3VsYXIgcGF0Y2hlcy4KLQkJCQkJCQlEM0RERVZDQVBTX1JUUEFUQ0hIQU5ETEVaRVJPIHwJCQkvLyBXaGVuIHRoaXMgZGV2aWNlIGNhcGFiaWxpdHkgaXMgc2V0LCB0aGUgaGFyZHdhcmUgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHJlcXVpcmUgY2FjaGluZyBvZiBhbnkgaW5mb3JtYXRpb24gYW5kIHVuY2FjaGVkIHBhdGNoZXMgKGhhbmRsZSB6ZXJvKSB3aWxsIGJlIGRyYXduIGFzIGVmZmljaWVudGx5IGFzIGNhY2hlZCBvbmVzLiBOb3RlIHRoYXQgc2V0dGluZyBEM0RERVZDQVBTX1JUUEFUQ0hIQU5ETEVaRVJPIGRvZXMgbm90IG1lYW4gdGhhdCBhIHBhdGNoIHdpdGggaGFuZGxlIHplcm8gY2FuIGJlIGRyYXduLiBBIGhhbmRsZS16ZXJvIHBhdGNoIGNhbiBhbHdheXMgYmUgZHJhd24gd2hldGhlciB0aGlzIGNhcCBpcyBzZXQgb3Igbm90LgotCQkJCQkJLy8JRDNEREVWQ0FQU19TRVBBUkFURVRFWFRVUkVNRU1PUklFUyB8CS8vIERldmljZSBpcyB0ZXh0dXJpbmcgZnJvbSBzZXBhcmF0ZSBtZW1vcnkgcG9vbHMuCi0JCQkJCQkJRDNEREVWQ0FQU19URVhUVVJFTk9OTE9DQUxWSURNRU0gfAkJLy8gRGV2aWNlIGNhbiByZXRyaWV2ZSB0ZXh0dXJlcyBmcm9tIG5vbi1sb2NhbCB2aWRlbyBtZW1vcnkuCi0JCQkJCQkJRDNEREVWQ0FQU19URVhUVVJFU1lTVEVNTUVNT1JZIHwJCS8vIERldmljZSBjYW4gcmV0cmlldmUgdGV4dHVyZXMgZnJvbSBzeXN0ZW0gbWVtb3J5LgotCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZIHwJCQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gZGV2aWNlIG1lbW9yeS4KLQkJCQkJCQlEM0RERVZDQVBTX1RMVkVSVEVYU1lTVEVNTUVNT1JZIHwJCS8vIERldmljZSBjYW4gdXNlIGJ1ZmZlcnMgZnJvbSBzeXN0ZW0gbWVtb3J5IGZvciB0cmFuc2Zvcm1lZCBhbmQgbGl0IHZlcnRpY2VzLgotCQkJCQkJCUQzRERFVkNBUFNfVExWRVJURVhWSURFT01FTU9SWTsJCQkvLyBEZXZpY2UgY2FuIHVzZSBidWZmZXJzIGZyb20gdmlkZW8gbWVtb3J5IGZvciB0cmFuc2Zvcm1lZCBhbmQgbGl0IHZlcnRpY2VzLgotCi0JCWNhcHMuUHJpbWl0aXZlTWlzY0NhcHMgPSAJCUQzRFBNSVNDQ0FQU19NQVNLWiB8CQkJCQkJLy8gRGV2aWNlIGNhbiBlbmFibGUgYW5kIGRpc2FibGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBkZXB0aCBidWZmZXIgb24gcGl4ZWwgb3BlcmF0aW9ucy4KLQkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ1VMTE5PTkUgfAkJCQkJCS8vIFRoZSBkcml2ZXIgZG9lcyBub3QgcGVyZm9ybSB0cmlhbmdsZSBjdWxsaW5nLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX05PTkUgbWVtYmVyIG9mIHRoZSBEM0RDVUxMIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ1VMTENXIHwJCQkJCQkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIGNsb2Nrd2lzZSB0cmlhbmdsZSBjdWxsaW5nIHRocm91Z2ggdGhlIEQzRFJTX0NVTExNT0RFIHN0YXRlLiAoVGhpcyBhcHBsaWVzIG9ubHkgdG8gdHJpYW5nbGUgcHJpbWl0aXZlcy4pIFRoaXMgZmxhZyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9DVyBtZW1iZXIgb2YgdGhlIEQzRENVTEwgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DVUxMQ0NXIHwJCQkJCQkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIGNvdW50ZXJjbG9ja3dpc2UgY3VsbGluZyB0aHJvdWdoIHRoZSBEM0RSU19DVUxMTU9ERSBzdGF0ZS4gKFRoaXMgYXBwbGllcyBvbmx5IHRvIHRyaWFuZ2xlIHByaW1pdGl2ZXMuKSBUaGlzIGZsYWcgY29ycmVzcG9uZHMgdG8gdGhlIEQzRENVTExfQ0NXIG1lbWJlciBvZiB0aGUgRDNEQ1VMTCBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NPTE9SV1JJVEVFTkFCTEUgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLWNoYW5uZWwgd3JpdGVzIGZvciB0aGUgcmVuZGVyLXRhcmdldCBjb2xvciBidWZmZXIgdGhyb3VnaCB0aGUgRDNEUlNfQ09MT1JXUklURUVOQUJMRSBzdGF0ZS4KLQkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ0xJUFBMQU5FU0NBTEVEUE9JTlRTIHwJCS8vIERldmljZSBjb3JyZWN0bHkgY2xpcHMgc2NhbGVkIHBvaW50cyBvZiBzaXplIGdyZWF0ZXIgdGhhbiAxLjAgdG8gdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcy4KLQkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ0xJUFRMVkVSVFMgfAkJCQkJLy8gRGV2aWNlIGNsaXBzIHBvc3QtdHJhbnNmb3JtZWQgdmVydGV4IHByaW1pdGl2ZXMuIFNwZWNpZnkgRDNEVVNBR0VfRE9OT1RDTElQIHdoZW4gdGhlIHBpcGVsaW5lIHNob3VsZCBub3QgZG8gYW55IGNsaXBwaW5nLiBGb3IgdGhpcyBjYXNlLCBhZGRpdGlvbmFsIHNvZnR3YXJlIGNsaXBwaW5nIG1heSBuZWVkIHRvIGJlIHBlcmZvcm1lZCBhdCBkcmF3IHRpbWUsIHJlcXVpcmluZyB0aGUgdmVydGV4IGJ1ZmZlciB0byBiZSBpbiBzeXN0ZW0gbWVtb3J5LgotCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19UU1NBUkdURU1QIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBEM0RUQSBmb3IgdGVtcG9yYXJ5IHJlZ2lzdGVyLgotCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19CTEVORE9QIHwJCQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgYWxwaGEtYmxlbmRpbmcgb3BlcmF0aW9ucyBvdGhlciB0aGFuIEQzREJMRU5ET1BfQURELgotCQkJCQkJCQkJLy8JRDNEUE1JU0NDQVBTX05VTExSRUZFUkVOQ0UgfAkJCQkvLyBBIHJlZmVyZW5jZSBkZXZpY2UgdGhhdCBkb2VzIG5vdCByZW5kZXIuCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0lOREVQRU5ERU5UV1JJVEVNQVNLUyB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgaW5kZXBlbmRlbnQgd3JpdGUgbWFza3MgZm9yIG11bHRpcGxlIGVsZW1lbnQgdGV4dHVyZXMgb3IgbXVsdGlwbGUgcmVuZGVyIHRhcmdldHMuCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX1BFUlNUQUdFQ09OU1RBTlQgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGNvbnN0YW50cy4gU2VlIEQzRFRTU19DT05TVEFOVCBpbiBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUuCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0ZPR0FORFNQRUNVTEFSQUxQSEEgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXBhcmF0ZSBmb2cgYW5kIHNwZWN1bGFyIGFscGhhLiBNYW55IGRldmljZXMgdXNlIHRoZSBzcGVjdWxhciBhbHBoYSBjaGFubmVsIHRvIHN0b3JlIHRoZSBmb2cgZmFjdG9yLgotCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19TRVBBUkFURUFMUEhBQkxFTkQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXBhcmF0ZSBibGVuZCBzZXR0aW5ncyBmb3IgdGhlIGFscGhhIGNoYW5uZWwuCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX01SVElOREVQRU5ERU5UQklUREVQVEhTIHwJCS8vIERldmljZSBzdXBwb3J0cyBkaWZmZXJlbnQgYml0IGRlcHRocyBmb3IgbXVsdGlwbGUgcmVuZGVyIHRhcmdldHMuCi0JCQkJCQkJCQkJRDNEUE1JU0NDQVBTX01SVFBPU1RQSVhFTFNIQURFUkJMRU5ESU5HIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBvc3QtcGl4ZWwgc2hhZGVyIG9wZXJhdGlvbnMgZm9yIG11bHRpcGxlIHJlbmRlciB0YXJnZXRzLgotCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19GT0dWRVJURVhDTEFNUEVEOwkJCQkvLyBEZXZpY2UgY2xhbXBzIGZvZyBibGVuZCBmYWN0b3IgcGVyIHZlcnRleC4KLQotCQljYXBzLlJhc3RlckNhcHMgPQkJRDNEUFJBU1RFUkNBUFNfQU5JU09UUk9QWSB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcuCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX0NPTE9SUEVSU1BFQ1RJVkUgfAkJLy8gRGV2aWNlIGl0ZXJhdGVzIGNvbG9ycyBwZXJzcGVjdGl2ZSBjb3JyZWN0bHkuCi0JCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfRElUSEVSIHwJCQkJCS8vIERldmljZSBjYW4gZGl0aGVyIHRvIGltcHJvdmUgY29sb3IgcmVzb2x1dGlvbi4KLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfREVQVEhCSUFTIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGxlZ2FjeSBkZXB0aCBiaWFzLiBGb3IgdHJ1ZSBkZXB0aCBiaWFzLCBzZWUgRDNEUFJBU1RFUkNBUFNfU0xPUEVTQ0FMRURFUFRIQklBUy4KLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HUkFOR0UgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcmFuZ2UtYmFzZWQgZm9nLiBJbiByYW5nZS1iYXNlZCBmb2csIHRoZSBkaXN0YW5jZSBvZiBhbiBvYmplY3QgZnJvbSB0aGUgdmlld2VyIGlzIHVzZWQgdG8gY29tcHV0ZSBmb2cgZWZmZWN0cywgbm90IHRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0ICh0aGF0IGlzLCB0aGUgei1jb29yZGluYXRlKSBpbiB0aGUgc2NlbmUuCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX0ZPR1RBQkxFIHwJCQkJLy8gRGV2aWNlIGNhbGN1bGF0ZXMgdGhlIGZvZyB2YWx1ZSBieSByZWZlcnJpbmcgdG8gYSBsb29rdXAgdGFibGUgY29udGFpbmluZyBmb2cgdmFsdWVzIHRoYXQgYXJlIGluZGV4ZWQgdG8gdGhlIGRlcHRoIG9mIGEgZ2l2ZW4gcGl4ZWwuCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX0ZPR1ZFUlRFWCB8CQkJCS8vIERldmljZSBjYWxjdWxhdGVzIHRoZSBmb2cgdmFsdWUgZHVyaW5nIHRoZSBsaWdodGluZyBvcGVyYXRpb24gYW5kIGludGVycG9sYXRlcyB0aGUgZm9nIHZhbHVlIGR1cmluZyByYXN0ZXJpemF0aW9uLgotCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19NSVBNQVBMT0RCSUFTIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbGV2ZWwgb2YgZGV0YWlsIChMT0QpIGJpYXMgYWRqdXN0bWVudHMuIFRoZXNlIGJpYXMgYWRqdXN0bWVudHMgZW5hYmxlIGFuIGFwcGxpY2F0aW9uIHRvIG1ha2UgYSBtaXBtYXAgYXBwZWFyIGNyaXNwZXIgb3IgbGVzcyBzaGFycCB0aGFuIGl0IG5vcm1hbGx5IHdvdWxkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBMT0QgYmlhcyBpbiBtaXBtYXBzLCBzZWUgRDNEU0FNUF9NSVBNQVBMT0RCSUFTLgotCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX01VTFRJU0FNUExFX1RPR0dMRSB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgdG9nZ2xpbmcgbXVsdGlzYW1wbGluZyBvbiBhbmQgb2ZmIGJldHdlZW4gSURpcmVjdDNERGV2aWNlOTo6QmVnaW5TY2VuZSBhbmQgSURpcmVjdDNERGV2aWNlOTo6RW5kU2NlbmUgKHVzaW5nIEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTKS4KLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfU0NJU1NPUlRFU1QgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzY2lzc29yIHRlc3QuIFNlZSBTY2lzc29yIFRlc3QuCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX1NMT1BFU0NBTEVERVBUSEJJQVMgfAkvLyBEZXZpY2UgcGVyZm9ybXMgdHJ1ZSBzbG9wZS1zY2FsZSBiYXNlZCBkZXB0aCBiaWFzLiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIHRoZSBsZWdhY3kgc3R5bGUgRDNEUFJBU1RFUkNBUFNfREVQVEhCSUFTLgotCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX1dCVUZGRVIgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgZGVwdGggYnVmZmVyaW5nIHVzaW5nIHcuCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX1dGT0cgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHctYmFzZWQgZm9nLiBXLWJhc2VkIGZvZyBpcyB1c2VkIHdoZW4gYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCBpcyBzcGVjaWZpZWQsIGJ1dCBhZmZpbmUgcHJvamVjdGlvbnMgc3RpbGwgdXNlIHotYmFzZWQgZm9nLiBUaGUgc3lzdGVtIGNvbnNpZGVycyBhIHByb2plY3Rpb24gbWF0cml4IHRoYXQgY29udGFpbnMgYSBub256ZXJvIHZhbHVlIGluIHRoZSBbM11bNF0gZWxlbWVudCB0byBiZSBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4LgotCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX1pCVUZGRVJMRVNTSFNSIHwJCQkvLyBEZXZpY2UgY2FuIHBlcmZvcm0gaGlkZGVuLXN1cmZhY2UgcmVtb3ZhbCAoSFNSKSB3aXRob3V0IHJlcXVpcmluZyB0aGUgYXBwbGljYXRpb24gdG8gc29ydCBwb2x5Z29ucyBhbmQgd2l0aG91dCByZXF1aXJpbmcgdGhlIGFsbG9jYXRpb24gb2YgYSBkZXB0aC1idWZmZXIuIFRoaXMgbGVhdmVzIG1vcmUgdmlkZW8gbWVtb3J5IGZvciB0ZXh0dXJlcy4gVGhlIG1ldGhvZCB1c2VkIHRvIHBlcmZvcm0gSFNSIGlzIGhhcmR3YXJlLWRlcGVuZGVudCBhbmQgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLiBaLWJ1ZmZlcmxlc3MgSFNSIGlzIHBlcmZvcm1lZCBpZiBubyBkZXB0aC1idWZmZXIgc3VyZmFjZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbmRlcmluZy10YXJnZXQgc3VyZmFjZSBhbmQgdGhlIGRlcHRoLWJ1ZmZlciBjb21wYXJpc29uIHRlc3QgaXMgZW5hYmxlZCAodGhhdCBpcywgd2hlbiB0aGUgc3RhdGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBEM0RSU19aRU5BQkxFIGVudW1lcmF0aW9uIGNvbnN0YW50IGlzIHNldCB0byBUUlVFKS4KLQkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfWkZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgei1iYXNlZCBmb2cuCi0JCQkJCQkJCUQzRFBSQVNURVJDQVBTX1pURVNUOwkJCQkJLy8gRGV2aWNlIGNhbiBwZXJmb3JtIHotdGVzdCBvcGVyYXRpb25zLiBUaGlzIGVmZmVjdGl2ZWx5IHJlbmRlcnMgYSBwcmltaXRpdmUgYW5kIGluZGljYXRlcyB3aGV0aGVyIGFueSB6IHBpeGVscyBoYXZlIGJlZW4gcmVuZGVyZWQuCi0KLQkJY2Fwcy5aQ21wQ2FwcyA9CQlEM0RQQ01QQ0FQU19BTFdBWVMgfAkJLy8gQWx3YXlzIHBhc3MgdGhlIHotdGVzdC4KLQkJCQkJCQlEM0RQQ01QQ0FQU19FUVVBTCB8CQkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBlcXVhbHMgdGhlIGN1cnJlbnQgei4KLQkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSIHwJCS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHouCi0JCQkJCQkJRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMIHwJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgei4KLQkJCQkJCQlEM0RQQ01QQ0FQU19MRVNTIHwJCQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCB6LgotCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1NFUVVBTCB8CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB6LgotCQkJCQkJCUQzRFBDTVBDQVBTX05FVkVSIHwJCQkvLyBBbHdheXMgZmFpbCB0aGUgei10ZXN0LgotCQkJCQkJCUQzRFBDTVBDQVBTX05PVEVRVUFMOwkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBkb2VzIG5vdCBlcXVhbCB0aGUgY3VycmVudCB6LgotCi0JCWNhcHMuU3JjQmxlbmRDYXBzID0JCUQzRFBCTEVORENBUFNfQkxFTkRGQUNUT1IgfAkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBib3RoIEQzREJMRU5EX0JMRU5ERkFDVE9SIGFuZCBEM0RCTEVORF9JTlZCTEVOREZBQ1RPUi4gU2VlIEQzREJMRU5ELgotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSB8CS8vIFNvdXJjZSBibGVuZCBmYWN0b3IgaXMgKDEtQXMsMS1BcywxLUFzLDEtQXMpIGFuZCBkZXN0aW5hdGlvbiBibGVuZCBmYWN0b3IgaXMgKEFzLEFzLEFzLEFzKTsgdGhlIGRlc3RpbmF0aW9uIGJsZW5kIHNlbGVjdGlvbiBpcyBvdmVycmlkZGVuLgotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSB8CS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEQzREJMRU5EX0JPVEhTUkNBTFBIQSBibGVuZCBtb2RlLiAoVGhpcyBibGVuZCBtb2RlIGlzIG9ic29sZXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEQzREJMRU5ELikKLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChBZCwgQWQsIEFkLCBBZCkuCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVENPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoUmQsIEdkLCBCZCwgQWQpLgotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BZCwgMS1BZCwgMS1BZCwgMS1BZCkuCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WREVTVENPTE9SIHwJLy8gQmxlbmQgZmFjdG9yIGlzICgxLVJkLCAxLUdkLCAxLUJkLCAxLUFkKS4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtQXMsIDEtQXMsIDEtQXMsIDEtQXMpLgotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1ScywgMS1HcywgMS1CcywgMS1BcykuCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfT05FIHwJCQkJLy8gQmxlbmQgZmFjdG9yIGlzICgxLCAxLCAxLCAxKS4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKEFzLCBBcywgQXMsIEFzKS4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKGYsIGYsIGYsIDEpOyBmID0gbWluKEFzLCAxLUFkKS4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKFJzLCBHcywgQnMsIEFzKS4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19aRVJPOwkJCQkvLyBCbGVuZCBmYWN0b3IgaXMgKDAsIDAsIDAsIDApLgotCi0JCWNhcHMuRGVzdEJsZW5kQ2FwcyA9IAlEM0RQQkxFTkRDQVBTX0JMRU5ERkFDVE9SIHwJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgYm90aCBEM0RCTEVORF9CTEVOREZBQ1RPUiBhbmQgRDNEQkxFTkRfSU5WQkxFTkRGQUNUT1IuIFNlZSBEM0RCTEVORC4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19CT1RISU5WU1JDQUxQSEEgfAkvLyBTb3VyY2UgYmxlbmQgZmFjdG9yIGlzICgxLUFzLDEtQXMsMS1BcywxLUFzKSBhbmQgZGVzdGluYXRpb24gYmxlbmQgZmFjdG9yIGlzIChBcyxBcyxBcyxBcyk7IHRoZSBkZXN0aW5hdGlvbiBibGVuZCBzZWxlY3Rpb24gaXMgb3ZlcnJpZGRlbi4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEgfAkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIHRoZSBEM0RCTEVORF9CT1RIU1JDQUxQSEEgYmxlbmQgbW9kZS4gKFRoaXMgYmxlbmQgbW9kZSBpcyBvYnNvbGV0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBEM0RCTEVORC4pCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVEFMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQWQsIEFkLCBBZCwgQWQpLgotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0RFU1RDT0xPUiB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKFJkLCBHZCwgQmQsIEFkKS4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZERVNUQUxQSEEgfAkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtQWQsIDEtQWQsIDEtQWQsIDEtQWQpLgotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1SZCwgMS1HZCwgMS1CZCwgMS1BZCkuCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WU1JDQUxQSEEgfAkJLy8gQmxlbmQgZmFjdG9yIGlzICgxLUFzLCAxLUFzLCAxLUFzLCAxLUFzKS4KLQkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZTUkNDT0xPUiB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtUnMsIDEtR3MsIDEtQnMsIDEtQXMpLgotCQkJCQkJCQlEM0RQQkxFTkRDQVBTX09ORSB8CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMSwgMSwgMSwgMSkuCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQUxQSEEgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChBcywgQXMsIEFzLCBBcykuCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQUxQSEFTQVQgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChmLCBmLCBmLCAxKTsgZiA9IG1pbihBcywgMS1BZCkuCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChScywgR3MsIEJzLCBBcykuCi0JCQkJCQkJCUQzRFBCTEVORENBUFNfWkVSTzsJCQkJLy8gQmxlbmQgZmFjdG9yIGlzICgwLCAwLCAwLCAwKS4KLQotCQljYXBzLkFscGhhQ21wQ2FwcyA9IEQzRFBDTVBDQVBTX0FMV0FZUyB8CQkvLyBBbHdheXMgcGFzcyB0aGUgYXBoYS10ZXN0LgotCQkJCQkJCUQzRFBDTVBDQVBTX0VRVUFMIHwJCQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGVxdWFscyB0aGUgY3VycmVudCBhcGhhLgotCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVIgfAkJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgYXBoYS4KLQkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBhcGhhLgotCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1MgfAkJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGFwaGEuCi0JCQkJCQkJRDNEUENNUENBUFNfTEVTU0VRVUFMIHwJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGFwaGEuCi0JCQkJCQkJRDNEUENNUENBUFNfTkVWRVIgfAkJCS8vIEFsd2F5cyBmYWlsIHRoZSBhcGhhLXRlc3QuCi0JCQkJCQkJRDNEUENNUENBUFNfTk9URVFVQUw7CQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGRvZXMgbm90IGVxdWFsIHRoZSBjdXJyZW50IGFwaGEuCi0KLQkJY2Fwcy5TaGFkZUNhcHMgPQlEM0RQU0hBREVDQVBTX0FMUEhBR09VUkFVREJMRU5EIHwJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IGFuIGFscGhhIGNvbXBvbmVudCBmb3IgR291cmF1ZC1ibGVuZGVkIHRyYW5zcGFyZW5jeSAodGhlIEQzRFNIQURFX0dPVVJBVUQgc3RhdGUgZm9yIHRoZSBEM0RTSEFERU1PREUgZW51bWVyYXRlZCB0eXBlKS4gSW4gdGhpcyBtb2RlLCB0aGUgYWxwaGEgY29sb3IgY29tcG9uZW50IG9mIGEgcHJpbWl0aXZlIGlzIHByb3ZpZGVkIGF0IHZlcnRpY2VzIGFuZCBpbnRlcnBvbGF0ZWQgYWNyb3NzIGEgZmFjZSBhbG9uZyB3aXRoIHRoZSBvdGhlciBjb2xvciBjb21wb25lbnRzLgotCQkJCQkJCUQzRFBTSEFERUNBUFNfQ09MT1JHT1VSQVVEUkdCIHwJCS8vIERldmljZSBjYW4gc3VwcG9ydCBjb2xvcmVkIEdvdXJhdWQgc2hhZGluZyBpbiB0aGUgUkdCIGNvbG9yIG1vZGVsLiBJbiB0aGlzIG1vZGUsIHRoZSBjb2xvciBjb21wb25lbnQgZm9yIGEgcHJpbWl0aXZlIGlzIHByb3ZpZGVkIGF0IHZlcnRpY2VzIGFuZCBpbnRlcnBvbGF0ZWQgYWNyb3NzIGEgZmFjZSBhbG9uZyB3aXRoIHRoZSBvdGhlciBjb2xvciBjb21wb25lbnRzLiBJbiB0aGUgUkdCIGxpZ2h0aW5nIG1vZGVsLCB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgY29tcG9uZW50cyBhcmUgaW50ZXJwb2xhdGVkLgotCQkJCQkJCUQzRFBTSEFERUNBUFNfRk9HR09VUkFVRCB8CQkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IGZvZyBpbiB0aGUgR291cmF1ZCBzaGFkaW5nIG1vZGUuCi0JCQkJCQkJRDNEUFNIQURFQ0FQU19TUEVDVUxBUkdPVVJBVURSR0I7CS8vIERldmljZSBzdXBwb3J0cyBHb3VyYXVkIHNoYWRpbmcgb2Ygc3BlY3VsYXIgaGlnaGxpZ2h0cy4KLQotCQljYXBzLlRleHR1cmVDYXBzID0JCUQzRFBURVhUVVJFQ0FQU19BTFBIQSB8CQkJCQkJLy8gQWxwaGEgaW4gdGV4dHVyZSBwaXhlbHMgaXMgc3VwcG9ydGVkLgotCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfQUxQSEFQQUxFVFRFIHwJCQkJLy8gRGV2aWNlIGNhbiBkcmF3IGFscGhhIGZyb20gdGV4dHVyZSBwYWxldHRlcy4KLQkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVAgfAkJCQkJLy8gU3VwcG9ydHMgY3ViZSB0ZXh0dXJlcy4KLQkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfQ1VCRU1BUF9QT1cyIHwJCQkJLy8gRGV2aWNlIHJlcXVpcmVzIHRoYXQgY3ViZSB0ZXh0dXJlIG1hcHMgaGF2ZSBkaW1lbnNpb25zIHNwZWNpZmllZCBhcyBwb3dlcnMgb2YgdHdvLgotCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfTUlQQ1VCRU1BUCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgY3ViZSB0ZXh0dXJlcy4KLQkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUE1BUCB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbWlwbWFwcGVkIHRleHR1cmVzLgotCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfTUlQVk9MVU1FTUFQIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIG1pcG1hcHBlZCB2b2x1bWUgdGV4dHVyZXMuCi0JCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTCB8CQkvLyBDb25kaXRpb25hbGx5IHN1cHBvcnRzIHRoZSB1c2Ugb2YgMi1EIHRleHR1cmVzIHdpdGggZGltZW5zaW9ucyB0aGF0IGFyZSBub3QgcG93ZXJzIG9mIHR3by4gQSBkZXZpY2UgdGhhdCBleHBvc2VzIHRoaXMgY2FwYWJpbGl0eSBjYW4gdXNlIHN1Y2ggYSB0ZXh0dXJlIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBhcmUgbWV0Li4uCi0JCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX05PUFJPSkVDVEVEQlVNUEVOViB8CQkvLyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhIHByb2plY3RlZCBidW1wLWVudmlyb25tZW50IGxvb3BrdXAgb3BlcmF0aW9uIGluIHByb2dyYW1tYWJsZSBhbmQgZml4ZWQgZnVuY3Rpb24gc2hhZGVycy4KLQkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHwJCQkJLy8gUGVyc3BlY3RpdmUgY29ycmVjdGlvbiB0ZXh0dXJpbmcgaXMgc3VwcG9ydGVkLgotCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19QT1cyIHwJCQkJCQkvLyBBbGwgdGV4dHVyZXMgbXVzdCBoYXZlIHdpZHRocyBhbmQgaGVpZ2h0cyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gVGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBlaXRoZXIgY3ViZSB0ZXh0dXJlcyBvciB2b2x1bWUgdGV4dHVyZXMuCi0JCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19QUk9KRUNURUQgfAkJCQkJLy8gU3VwcG9ydHMgdGhlIEQzRFRURkZfUFJPSkVDVEVEIHRleHR1cmUgdHJhbnNmb3JtYXRpb24gZmxhZy4gV2hlbiBhcHBsaWVkLCB0aGUgZGV2aWNlIGRpdmlkZXMgdHJhbnNmb3JtZWQgdGV4dHVyZSBjb29yZGluYXRlcyBieSB0aGUgbGFzdCB0ZXh0dXJlIGNvb3JkaW5hdGUuIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBwcmVzZW50LCB0aGVuIHRoZSBwcm9qZWN0aXZlIGRpdmlkZSBvY2N1cnMgcGVyIHBpeGVsLiBJZiB0aGlzIGNhcGFiaWxpdHkgaXMgbm90IHByZXNlbnQsIGJ1dCB0aGUgcHJvamVjdGl2ZSBkaXZpZGUgbmVlZHMgdG8gb2NjdXIgYW55d2F5LCB0aGVuIGl0IGlzIHBlcmZvcm1lZCBvbiBhIHBlci12ZXJ0ZXggYmFzaXMgYnkgdGhlIERpcmVjdDNEIHJ1bnRpbWUuCi0JCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX1NRVUFSRU9OTFkgfAkJCQkvLyBBbGwgdGV4dHVyZXMgbXVzdCBiZSBzcXVhcmUuCi0JCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19URVhSRVBFQVROT1RTQ0FMRURCWVNJWkUgfAkvLyBUZXh0dXJlIGluZGljZXMgYXJlIG5vdCBzY2FsZWQgYnkgdGhlIHRleHR1cmUgc2l6ZSBwcmlvciB0byBpbnRlcnBvbGF0aW9uLgotCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQOwkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHZvbHVtZSB0ZXh0dXJlcy4KLQkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQX1BPVzI7CQkJCS8vIERldmljZSByZXF1aXJlcyB0aGF0IHZvbHVtZSB0ZXh0dXJlIG1hcHMgaGF2ZSBkaW1lbnNpb25zIHNwZWNpZmllZCBhcyBwb3dlcnMgb2YgdHdvLgotCi0JCWNhcHMuVGV4dHVyZUZpbHRlckNhcHMgPQkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRlBZUkFNSURBTFFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHB5cmFtaWRhbCBzYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcHlyYW1pZGFsIG1hZ25pZnlpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BZUkFNSURBTFFVQUQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuCi0JCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGxpbmVhciBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGxpbmVhciBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORlBZUkFNSURBTFFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHB5cmFtaWRhbCBzYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuCi0JCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4KLQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBwb2ludC1zYW1wbGUgbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVI7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCi0JCWNhcHMuQ3ViZVRleHR1cmVGaWx0ZXJDYXBzID0JCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHB5cmFtaWRhbCBtYWduaWZ5aW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QWVJBTUlEQUxRVUFEIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4KLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4KLQkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4KLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUjsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0KLQkJY2Fwcy5Wb2x1bWVUZXh0dXJlRmlsdGVyQ2FwcyA9IAkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRlBZUkFNSURBTFFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHB5cmFtaWRhbCBzYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcHlyYW1pZGFsIG1hZ25pZnlpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BZUkFNSURBTFFVQUQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLgotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGxpbmVhciBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGxpbmVhciBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLgotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLgotCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBwb2ludC1zYW1wbGUgbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGTElORUFSOwkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQotCQljYXBzLlRleHR1cmVBZGRyZXNzQ2FwcyA9CUQzRFBUQUREUkVTU0NBUFNfQk9SREVSIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgc2V0dGluZyBjb29yZGluYXRlcyBvdXRzaWRlIHRoZSByYW5nZSBbMC4wLCAxLjBdIHRvIHRoZSBib3JkZXIgY29sb3IsIGFzIHNwZWNpZmllZCBieSB0aGUgRDNEU0FNUF9CT1JERVJDT0xPUiB0ZXh0dXJlLXN0YWdlIHN0YXRlLgotCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19DTEFNUCB8CQkJLy8gRGV2aWNlIGNhbiBjbGFtcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuCi0JCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgfAkvLyBEZXZpY2UgY2FuIHNlcGFyYXRlIHRoZSB0ZXh0dXJlLWFkZHJlc3NpbmcgbW9kZXMgb2YgdGhlIHUgYW5kIHYgY29vcmRpbmF0ZXMgb2YgdGhlIHRleHR1cmUuIFRoaXMgYWJpbGl0eSBjb3JyZXNwb25kcyB0byB0aGUgRDNEU0FNUF9BRERSRVNTVSBhbmQgRDNEU0FNUF9BRERSRVNTViByZW5kZXItc3RhdGUgdmFsdWVzLgotCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19NSVJST1IgfAkJCS8vIERldmljZSBjYW4gbWlycm9yIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4KLQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9ST05DRSB8CQkvLyBEZXZpY2UgY2FuIHRha2UgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGUgKHRodXMsIG1pcnJvcmluZyBhcm91bmQgMCkgYW5kIHRoZW4gY2xhbXAgdG8gdGhlIG1heGltdW0gdmFsdWUuCi0JCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX1dSQVA7CQkJCS8vIERldmljZSBjYW4gd3JhcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuCi0KLQkJY2Fwcy5Wb2x1bWVUZXh0dXJlQWRkcmVzc0NhcHMgPQlEM0RQVEFERFJFU1NDQVBTX0JPUkRFUiB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNldHRpbmcgY29vcmRpbmF0ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAuMCwgMS4wXSB0byB0aGUgYm9yZGVyIGNvbG9yLCBhcyBzcGVjaWZpZWQgYnkgdGhlIEQzRFNBTVBfQk9SREVSQ09MT1IgdGV4dHVyZS1zdGFnZSBzdGF0ZS4KLQkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0NMQU1QIHwJCQkvLyBEZXZpY2UgY2FuIGNsYW1wIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4KLQkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgfAkvLyBEZXZpY2UgY2FuIHNlcGFyYXRlIHRoZSB0ZXh0dXJlLWFkZHJlc3NpbmcgbW9kZXMgb2YgdGhlIHUgYW5kIHYgY29vcmRpbmF0ZXMgb2YgdGhlIHRleHR1cmUuIFRoaXMgYWJpbGl0eSBjb3JyZXNwb25kcyB0byB0aGUgRDNEU0FNUF9BRERSRVNTVSBhbmQgRDNEU0FNUF9BRERSRVNTViByZW5kZXItc3RhdGUgdmFsdWVzLgotCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9SIHwJCQkvLyBEZXZpY2UgY2FuIG1pcnJvciB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuCi0JCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19NSVJST1JPTkNFIHwJCS8vIERldmljZSBjYW4gdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHRleHR1cmUgY29vcmRpbmF0ZSAodGh1cywgbWlycm9yaW5nIGFyb3VuZCAwKSBhbmQgdGhlbiBjbGFtcCB0byB0aGUgbWF4aW11bSB2YWx1ZS4KLQkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX1dSQVA7CQkJCS8vIERldmljZSBjYW4gd3JhcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuCi0KLQkJY2Fwcy5MaW5lQ2FwcyA9CQlEM0RMSU5FQ0FQU19BTFBIQUNNUCB8CS8vIFN1cHBvcnRzIGFscGhhLXRlc3QgY29tcGFyaXNvbnMuCi0JCQkJCQkvLwlEM0RMSU5FQ0FQU19BTlRJQUxJQVMgfCAvLyBBbnRpYWxpYXNlZCBsaW5lcyBhcmUgc3VwcG9ydGVkLgotCQkJCQkJCUQzRExJTkVDQVBTX0JMRU5EIHwJCS8vIFN1cHBvcnRzIHNvdXJjZS1ibGVuZGluZy4KLQkJCQkJCQlEM0RMSU5FQ0FQU19GT0cgfAkJLy8gU3VwcG9ydHMgZm9nLgotCQkJCQkJCUQzRExJTkVDQVBTX1RFWFRVUkUgfAkvLyBTdXBwb3J0cyB0ZXh0dXJlLW1hcHBpbmcuCi0JCQkJCQkJRDNETElORUNBUFNfWlRFU1Q7CQkvLyBTdXBwb3J0cyB6LWJ1ZmZlciBjb21wYXJpc29ucy4KLQotCQljYXBzLk1heFRleHR1cmVXaWR0aCA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7Ci0JCWNhcHMuTWF4VGV4dHVyZUhlaWdodCA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7Ci0JCWNhcHMuTWF4Vm9sdW1lRXh0ZW50ID0gMSA8PCAoc3c6Ok1JUE1BUF9MRVZFTFMgLSAxKTsKLQkJY2Fwcy5NYXhUZXh0dXJlUmVwZWF0ID0gODE5MjsKLQkJY2Fwcy5NYXhUZXh0dXJlQXNwZWN0UmF0aW8gPSAxIDw8IChzdzo6TUlQTUFQX0xFVkVMUyAtIDEpOwotCQljYXBzLk1heEFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5OwotCQljYXBzLk1heFZlcnRleFcgPSAxZSswMTA7Ci0KLQkJY2Fwcy5HdWFyZEJhbmRMZWZ0ID0gLTFlKzAwODsKLQkJY2Fwcy5HdWFyZEJhbmRUb3AgPSAtMWUrMDA4OwotCQljYXBzLkd1YXJkQmFuZFJpZ2h0ID0gMWUrMDA4OwotCQljYXBzLkd1YXJkQmFuZEJvdHRvbSA9IDFlKzAwODsKLQotCQljYXBzLkV4dGVudHNBZGp1c3QgPSAwOwotCi0JCWNhcHMuU3RlbmNpbENhcHMgPQkJRDNEU1RFTkNJTENBUFNfS0VFUCB8CQkvLyBEbyBub3QgdXBkYXRlIHRoZSBlbnRyeSBpbiB0aGUgc3RlbmNpbCBidWZmZXIuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0JCQkJCQkJCUQzRFNURU5DSUxDQVBTX1pFUk8gfAkJLy8gU2V0IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSB0byAwLgotCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19SRVBMQUNFIHwJLy8gUmVwbGFjZSB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkgd2l0aCByZWZlcmVuY2UgdmFsdWUuCi0JCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOQ1JTQVQgfAkvLyBJbmNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCBjbGFtcGluZyB0byB0aGUgbWF4aW11bSB2YWx1ZS4KLQkJCQkJCQkJRDNEU1RFTkNJTENBUFNfREVDUlNBVCB8CS8vIERlY3JlbWVudCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnksIGNsYW1waW5nIHRvIHplcm8uCi0JCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOVkVSVCB8CQkvLyBJbnZlcnQgdGhlIGJpdHMgaW4gdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LgotCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19JTkNSIHwJCS8vIEluY3JlbWVudCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnksIHdyYXBwaW5nIHRvIHplcm8gaWYgdGhlIG5ldyB2YWx1ZSBleGNlZWRzIHRoZSBtYXhpbXVtIHZhbHVlLgotCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19ERUNSIHwJCS8vIERlY3JlbWVudCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnksIHdyYXBwaW5nIHRvIHRoZSBtYXhpbXVtIHZhbHVlIGlmIHRoZSBuZXcgdmFsdWUgaXMgbGVzcyB0aGFuIHplcm8uCi0JCQkJCQkJCUQzRFNURU5DSUxDQVBTX1RXT1NJREVEOwkvLyBUaGUgZGV2aWNlIHN1cHBvcnRzIHR3by1zaWRlZCBzdGVuY2lsLgotCi0JCWNhcHMuRlZGQ2FwcyA9CQlEM0RGVkZDQVBTX0RPTk9UU1RSSVBFTEVNRU5UUyB8CQkvLyBJdCBpcyBwcmVmZXJhYmxlIHRoYXQgdmVydGV4IGVsZW1lbnRzIG5vdCBiZSBzdHJpcHBlZC4gVGhhdCBpcywgaWYgdGhlIHZlcnRleCBmb3JtYXQgY29udGFpbnMgZWxlbWVudHMgdGhhdCBhcmUgbm90IHVzZWQgd2l0aCB0aGUgY3VycmVudCByZW5kZXIgc3RhdGVzLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIHZlcnRpY2VzLiBJZiB0aGlzIGNhcGFiaWxpdHkgZmxhZyBpcyBub3QgcHJlc2VudCwgc3RyaXBwaW5nIGV4dHJhbmVvdXMgZWxlbWVudHMgZnJvbSB0aGUgdmVydGV4IGZvcm1hdCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UuCi0JCQkJCQkJRDNERlZGQ0FQU19QU0laRSB8CQkJCQkvLyBQb2ludCBzaXplIGlzIGRldGVybWluZWQgYnkgZWl0aGVyIHRoZSByZW5kZXIgc3RhdGUgb3IgdGhlIHZlcnRleCBkYXRhLgotCQkJCQkJLy8JRDNERlZGQ0FQU19URVhDT09SRENPVU5UTUFTSyB8CQkvLyBNYXNrcyB0aGUgbG93IFdPUkQgb2YgRlZGQ2Fwcy4gVGhlc2UgYml0cywgY2FzdCB0byB0aGUgV09SRCBkYXRhIHR5cGUsIGRlc2NyaWJlIHRoZSB0b3RhbCBudW1iZXIgb2YgdGV4dHVyZSBjb29yZGluYXRlIHNldHMgdGhhdCB0aGUgZGV2aWNlIGNhbiBzaW11bHRhbmVvdXNseSB1c2UgZm9yIG11bHRpcGxlIHRleHR1cmUgYmxlbmRpbmcuIChZb3UgY2FuIHVzZSB1cCB0byBlaWdodCB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyBmb3IgYW55IHZlcnRleCwgYnV0IHRoZSBkZXZpY2UgY2FuIGJsZW5kIHVzaW5nIG9ubHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGV4dHVyZSBjb29yZGluYXRlIHNldHMuKQotCQkJCQkJCTg7Ci0KLQkJY2Fwcy5UZXh0dXJlT3BDYXBzID0JRDNEVEVYT1BDQVBTX0FERCB8CQkJCQkJCS8vIFRoZSBEM0RUT1BfQUREIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0FERFNJR05FRCB8CQkJCQkvLyBUaGUgRDNEVE9QX0FERFNJR05FRCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19BRERTSUdORUQyWCB8CQkJCQkvLyBUaGUgRDNEVE9QX0FERFNJR05FRDJYIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0FERFNNT09USCB8CQkJCQkvLyBUaGUgRDNEVE9QX0FERFNNT09USCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORENVUlJFTlRBTFBIQSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORENVUlJFTlRBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORERJRkZVU0VBTFBIQSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVOREZBQ1RPUkFMUEhBIHwJCQkJLy8gVGhlIEQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5EVEVYVFVSRUFMUEhBIHwJCQkvLyBUaGUgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5EVEVYVFVSRUFMUEhBUE0gfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQIHwJCQkJCS8vIFRoZSBEM0RUT1BfQlVNUEVOVk1BUCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQTFVNSU5BTkNFIHwJCQkvLyBUaGUgRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0UgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotCQkJCQkJCQlEM0RURVhPUENBUFNfRElTQUJMRSB8CQkJCQkJLy8gVGhlIEQzRFRPUF9ESVNBQkxFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX0RPVFBST0RVQ1QzIHwJCQkJCS8vIFRoZSBEM0RUT1BfRE9UUFJPRFVDVDMgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotCQkJCQkJCQlEM0RURVhPUENBUFNfTEVSUCB8CQkJCQkJCS8vIFRoZSBEM0RUT1BfTEVSUCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURSB8CQkJCQkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURTJYIHwJCQkJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEUyWCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURTRYIHwJCQkJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEU0WCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUFMUEhBX0FERENPTE9SIHwJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUiB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUNPTE9SX0FEREFMUEhBIHwJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SIHwJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEEgfAkvLyBUaGUgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotCQkJCQkJCQlEM0RURVhPUENBUFNfTVVMVElQTFlBREQgfAkJCQkJLy8gVGhlIEQzRFRPUF9NVUxUSVBMWUFERCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0JCQkJCQkJCUQzRFRFWE9QQ0FQU19QUkVNT0RVTEFURSB8CQkJCQkvLyBUaGUgRDNEVE9QX1BSRU1PRFVMQVRFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzEgfAkJCQkJLy8gVGhlIEQzRFRPUF9TRUxFQ1RBUkcxIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzIgfAkJCQkJLy8gVGhlIEQzRFRPUF9TRUxFQ1RBUkcyIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLQkJCQkJCQkJRDNEVEVYT1BDQVBTX1NVQlRSQUNUOwkJCQkJCS8vIFRoZSBEM0RUT1BfU1VCVFJBQ1QgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotCi0JCWNhcHMuTWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gODsKLQkJY2Fwcy5NYXhTaW11bHRhbmVvdXNUZXh0dXJlcyA9IDg7Ci0KLQkJY2Fwcy5WZXJ0ZXhQcm9jZXNzaW5nQ2FwcyA9CQlEM0RWVFhQQ0FQU19ESVJFQ1RJT05BTExJR0hUUyB8CQkJLy8gRGV2aWNlIGNhbiBkbyBkaXJlY3Rpb25hbCBsaWdodHMuCi0JCQkJCQkJCQkJRDNEVlRYUENBUFNfTE9DQUxWSUVXRVIgfAkJCQkvLyBEZXZpY2UgY2FuIGRvIGxvY2FsIHZpZXdlci4KLQkJCQkJCQkJCQlEM0RWVFhQQ0FQU19NQVRFUklBTFNPVVJDRTcJfAkJCS8vIERldmljZSBjYW4gZG8gTWljcm9zb2Z0riBEaXJlY3RYriA3LjAgY29sb3JtYXRlcmlhbHNvdXJjZSBvcGVyYXRpb25zLgotCQkJCQkJCQkJLy8JRDNEVlRYUENBUFNfTk9fVEVYR0VOX05PTkxPQ0FMVklFV0VSIHwJLy8gRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGV4dHVyZSBnZW5lcmF0aW9uIGluIG5vbi1sb2NhbCB2aWV3ZXIgbW9kZS4KLQkJCQkJCQkJCQlEM0RWVFhQQ0FQU19QT1NJVElPTkFMTElHSFRTIHwJCQkvLyBEZXZpY2UgY2FuIGRvIHBvc2l0aW9uYWwgbGlnaHRzIChpbmNsdWRlcyBwb2ludCBhbmQgc3BvdCkuCi0JCQkJCQkJCQkJRDNEVlRYUENBUFNfVEVYR0VOIHwJCQkJCS8vIERldmljZSBjYW4gZG8gdGV4Z2VuLgotCQkJCQkJCQkJCUQzRFZUWFBDQVBTX1RFWEdFTl9TUEhFUkVNQVA7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIEQzRFRTU19UQ0lfU1BIRVJFTUFQLgotCQkJCQkJCQkJLy8JRDNEVlRYUENBUFNfVFdFRU5JTkc7CQkJCQkvLyBEZXZpY2UgY2FuIGRvIHZlcnRleCB0d2VlbmluZy4KLQotCQljYXBzLk1heEFjdGl2ZUxpZ2h0cyA9IDg7CQkJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgbGlnaHRzIHRoYXQgY2FuIGJlIGFjdGl2ZSBzaW11bHRhbmVvdXNseS4gRm9yIGEgZ2l2ZW4gcGh5c2ljYWwgZGV2aWNlLCB0aGlzIGNhcGFiaWxpdHkgbWlnaHQgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLgotCQljYXBzLk1heFVzZXJDbGlwUGxhbmVzID0gNjsJCQkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiB1c2VyLWRlZmluZWQgY2xpcHBpbmcgcGxhbmVzIHN1cHBvcnRlZC4gVGhpcyBtZW1iZXIgY2FuIHJhbmdlIGZyb20gMCB0aHJvdWdoIEQzRE1BWFVTRVJDTElQUExBTkVTLiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtYXkgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLgotCQljYXBzLk1heFZlcnRleEJsZW5kTWF0cmljZXMgPSA0OwkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBtYXRyaWNlcyB0aGF0IHRoaXMgZGV2aWNlIGNhbiBhcHBseSB3aGVuIHBlcmZvcm1pbmcgbXVsdGltYXRyaXggdmVydGV4IGJsZW5kaW5nLiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtYXkgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLgotCQljYXBzLk1heFZlcnRleEJsZW5kTWF0cml4SW5kZXggPSAxMTsJCQkvLyBEV09SRCB2YWx1ZSB0aGF0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBtYXRyaXggaW5kZXggdGhhdCBjYW4gYmUgaW5kZXhlZCBpbnRvIHVzaW5nIHRoZSBwZXItdmVydGV4IGluZGljZXMuIFRoZSBudW1iZXIgb2YgbWF0cmljZXMgaXMgTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCArIDEsIHdoaWNoIGlzIHRoZSBzaXplIG9mIHRoZSBtYXRyaXggcGFsZXR0ZS4gSWYgbm9ybWFscyBhcmUgcHJlc2VudCBpbiB0aGUgdmVydGV4IGRhdGEgdGhhdCBuZWVkcyB0byBiZSBibGVuZGVkIGZvciBsaWdodGluZywgdGhlbiB0aGUgbnVtYmVyIG9mIG1hdHJpY2VzIGlzIGhhbGYgdGhlIG51bWJlciBzcGVjaWZpZWQgYnkgdGhpcyBjYXBhYmlsaXR5IGZsYWcuIElmIE1heFZlcnRleEJsZW5kTWF0cml4SW5kZXggaXMgc2V0IHRvIHplcm8sIHRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGVkIHZlcnRleCBibGVuZGluZy4gSWYgdGhpcyB2YWx1ZSBpcyBub3QgemVybyB0aGVuIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzIGlzIHplcm8gdGhyb3VnaCBNYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4LgotCQljYXBzLk1heFBvaW50U2l6ZSA9IDgxOTIuMGY7CQkJCQkvLyBNYXhpbXVtIHNpemUgb2YgYSBwb2ludCBwcmltaXRpdmUuIElmIHNldCB0byAxLjBmIHRoZW4gZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgcG9pbnQgc2l6ZSBjb250cm9sLiBUaGUgcmFuZ2UgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuMGYuCi0JCWNhcHMuTWF4UHJpbWl0aXZlQ291bnQgPSAxIDw8IDIxOwkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBwcmltaXRpdmVzIGZvciBlYWNoIElEaXJlY3QzRERldmljZTk6OkRyYXdQcmltaXRpdmUgY2FsbC4gTm90ZSB0aGF0IHdoZW4gRGlyZWN0M0QgaXMgd29ya2luZyB3aXRoIGEgRGlyZWN0WCA2LjAgb3IgRGlyZWN0WCA3LjAgZHJpdmVyLCB0aGlzIGZpZWxkIGlzIHNldCB0byAweEZGRkYuIFRoaXMgbWVhbnMgdGhhdCBub3Qgb25seSB0aGUgbnVtYmVyIG9mIHByaW1pdGl2ZXMgYnV0IGFsc28gdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpcyBsaW1pdGVkIGJ5IHRoaXMgdmFsdWUuCi0JCWNhcHMuTWF4VmVydGV4SW5kZXggPSAxIDw8IDI0OwkJCQkJLy8gTWF4aW11bSBzaXplIG9mIGluZGljZXMgc3VwcG9ydGVkIGZvciBoYXJkd2FyZSB2ZXJ0ZXggcHJvY2Vzc2luZy4gSXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIDMyLWJpdCBpbmRleCBidWZmZXJzIGJ5IHNwZWNpZnlpbmcgRDNERk1UX0lOREVYMzI7IGhvd2V2ZXIsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlbmRlciB3aXRoIHRoZSBpbmRleCBidWZmZXIgdW5sZXNzIHRoaXMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDB4MDAwMEZGRkYuCi0JCWNhcHMuTWF4U3RyZWFtcyA9IDE2OwkJCQkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGRhdGEgc3RyZWFtcyBmb3IgSURpcmVjdDNERGV2aWNlOTo6U2V0U3RyZWFtU291cmNlLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMSB0byAxNi4gTm90ZSB0aGF0IGlmIHRoaXMgdmFsdWUgaXMgMCwgdGhlbiB0aGUgZHJpdmVyIGlzIG5vdCBhIERpcmVjdFggOS4wIGRyaXZlci4KLQkJY2Fwcy5NYXhTdHJlYW1TdHJpZGUgPSA2NTUzNjsJCQkJCS8vIE1heGltdW0gc3RyaWRlIGZvciBJRGlyZWN0M0REZXZpY2U5OjpTZXRTdHJlYW1Tb3VyY2UuCi0JCWNhcHMuVmVydGV4U2hhZGVyVmVyc2lvbiA9IHZlcnRleFNoYWRlclZlcnNpb247CS8vIFR3byBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHRoZSB2ZXJ0ZXggc2hhZGVyIG1haW4gYW5kIHN1YiB2ZXJzaW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgZm9yIGVhY2ggdmVydGV4IHNoYWRlciB2ZXJzaW9uLCBzZWUgVmVyc2lvbiAxX3gsIFZlcnNpb24gMl8wLCBWZXJzaW9uIDJfMCBFeHRlbmRlZCwgb3IgVmVyc2lvbiAzXzAuCi0JCWNhcHMuTWF4VmVydGV4U2hhZGVyQ29uc3QgPSAyNTY7CQkJCS8vIFRoZSBudW1iZXIgb2YgdmVydGV4IHNoYWRlciBSZWdpc3RlcnMgdGhhdCBhcmUgcmVzZXJ2ZWQgZm9yIGNvbnN0YW50cy4KLQkJY2Fwcy5QaXhlbFNoYWRlclZlcnNpb24gPSBwaXhlbFNoYWRlclZlcnNpb247CS8vIFR3byBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBwaXhlbCBzaGFkZXIgbWFpbiBhbmQgc3ViIHZlcnNpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBmb3IgZWFjaCBwaXhlbCBzaGFkZXIgdmVyc2lvbiwgc2VlIFZlcnNpb24gMV94LCBWZXJzaW9uIDJfMCwgVmVyc2lvbiAyXzAgRXh0ZW5kZWQsIG9yIFZlcnNpb24gM18wLgotCQljYXBzLlBpeGVsU2hhZGVyMXhNYXhWYWx1ZSA9IDguMDsJCQkJLy8gTWF4aW11bSB2YWx1ZSBvZiBwaXhlbCBzaGFkZXIgYXJpdGhtZXRpYyBjb21wb25lbnQuIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoZSBpbnRlcm5hbCByYW5nZSBvZiB2YWx1ZXMgc3VwcG9ydGVkIGZvciBwaXhlbCBjb2xvciBibGVuZGluZyBvcGVyYXRpb25zLiBXaXRoaW4gdGhlIHJhbmdlIHRoYXQgdGhleSByZXBvcnQgdG8sIGltcGxlbWVudGF0aW9ucyBtdXN0IGFsbG93IGRhdGEgdG8gcGFzcyB0aHJvdWdoIHBpeGVsIHByb2Nlc3NpbmcgdW5tb2RpZmllZCAodW5jbGFtcGVkKS4gTm9ybWFsbHksIHRoZSB2YWx1ZSBvZiB0aGlzIG1lbWJlciBpcyBhbiBhYnNvbHV0ZSB2YWx1ZS4gRm9yIGV4YW1wbGUsIGEgMS4wIGluZGljYXRlcyB0aGF0IHRoZSByYW5nZSBpcyAtMS4wIHRvIDEsIGFuZCBhbiA4LjAgaW5kaWNhdGVzIHRoYXQgdGhlIHJhbmdlIGlzIC04LjAgdG8gOC4wLiBUaGUgdmFsdWUgbXVzdCBiZSA+PSAxLjAgZm9yIGFueSBoYXJkd2FyZSB0aGF0IHN1cHBvcnRzIHBpeGVsIHNoYWRlcnMuCi0KLQkJY2Fwcy5EZXZDYXBzMiA9IC8vCUQzRERFVkNBUFMyX0FEQVBUSVZFVEVTU1JUUEFUQ0ggfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgYWRhcHRpdmUgdGVzc2VsbGF0aW9uIG9mIFJULXBhdGNoZXMKLQkJCQkJCS8vCUQzRERFVkNBUFMyX0FEQVBUSVZFVEVTU05QQVRDSCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBhZGFwdGl2ZSB0ZXNzZWxsYXRpb24gb2YgTi1wYXRjaGVzLgotCQkJCQkJCUQzRERFVkNBUFMyX0NBTl9TVFJFVENIUkVDVF9GUk9NX1RFWFRVUkVTIHwJCS8vIERldmljZSBzdXBwb3J0cyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBhIHRleHR1cmUgYXMgdGhlIHNvdXJjZS4KLQkJCQkJCS8vCUQzRERFVkNBUFMyX0RNQVBOUEFUQ0ggfAkJCQkJCS8vIERldmljZSBzdXBwb3J0cyBkaXNwbGFjZW1lbnQgbWFwcyBmb3IgTi1wYXRjaGVzLgotCQkJCQkJLy8JRDNEREVWQ0FQUzJfUFJFU0FNUExFRERNQVBOUEFUQ0ggfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcHJlc2FtcGxlZCBkaXNwbGFjZW1lbnQgbWFwcyBmb3IgTi1wYXRjaGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkaXNwbGFjZW1lbnQgbWFwcGluZywgc2VlIERpc3BsYWNlbWVudCBNYXBwaW5nLgotCQkJCQkJCUQzRERFVkNBUFMyX1NUUkVBTU9GRlNFVCB8CQkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHN0cmVhbSBvZmZzZXRzLgotCQkJCQkJCUQzRERFVkNBUFMyX1ZFUlRFWEVMRU1FTlRTQ0FOU0hBUkVTVFJFQU1PRkZTRVQ7CS8vIE11bHRpcGxlIHZlcnRleCBlbGVtZW50cyBjYW4gc2hhcmUgdGhlIHNhbWUgb2Zmc2V0IGluIGEgc3RyZWFtIGlmIEQzRERFVkNBUFMyX1ZFUlRFWEVMRU1FTlRTQ0FOU0hBUkVTVFJFQU1PRkZTRVQgaXMgc2V0IGJ5IHRoZSBkZXZpY2UgYW5kIHRoZSB2ZXJ0ZXggZGVjbGFyYXRpb24gZG9lcyBub3QgaGF2ZSBhbiBlbGVtZW50IHdpdGggRDNEREVDTFVTQUdFX1BPU0lUSU9OVDAuCi0KLQkJY2Fwcy5NYXhOcGF0Y2hUZXNzZWxsYXRpb25MZXZlbCA9IDA7CS8vIE1heGltdW0gbnVtYmVyIG9mIE4tcGF0Y2ggc3ViZGl2aXNpb24gbGV2ZWxzLiBUaGUgZHJpdmVyIHdpbGwgY2xhbXAgYXBwbGljYXRpb25zIHRvIHRoaXMgdmFsdWUsIGlmIHRoZXkgYXJlIHVzaW5nIHByZXNhbXBsZWQgZGlzcGxhY2VtZW50IG1hcHBpbmcuIFNlZSBUZXNzZWxsYXRpb24gYW5kIERpc3BsYWNlbWVudCBNYXBwaW5nLgotCQljYXBzLk1hc3RlckFkYXB0ZXJPcmRpbmFsID0gMDsJCQkvLyBUaGlzIG51bWJlciBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHRoZSBtYXN0ZXIgZm9yIHRoaXMgc3Vib3JkaW5hdGUuIFRoaXMgbnVtYmVyIGlzIHRha2VuIGZyb20gdGhlIHNhbWUgc3BhY2UgYXMgdGhlIGFkYXB0ZXIgdmFsdWVzIHBhc3NlZCB0byB0aGUgSURpcmVjdDNEOSBtZXRob2RzLgotCQljYXBzLkFkYXB0ZXJPcmRpbmFsSW5Hcm91cCA9IDA7CQkJLy8gVGhpcyBudW1iZXIgaW5kaWNhdGVzIHRoZSBvcmRlciBpbiB3aGljaCBoZWFkcyBhcmUgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIChBUEkpLiBUaGUgbWFzdGVyIGFkYXB0ZXIgYWx3YXlzIGhhcyBBZGFwdGVyT3JkaW5hbEluR3JvdXAgPSAwLiBUaGVzZSB2YWx1ZXMgZG8gbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFkYXB0ZXIgb3JkaW5hbHMgcGFzc2VkIHRvIHRoZSBJRGlyZWN0M0Q5IG1ldGhvZHMuIFRoZXkgYXBwbHkgb25seSB0byBoZWFkcyB3aXRoaW4gYSBncm91cC4KLQkJY2Fwcy5OdW1iZXJPZkFkYXB0ZXJzSW5Hcm91cCA9IDE7CQkvLyBOdW1iZXIgb2YgYWRhcHRlcnMgaW4gdGhpcyBhZGFwdGVyIGdyb3VwIChvbmx5IGlmIG1hc3RlcikuIFRoaXMgd2lsbCBiZSAxIGZvciBjb252ZW50aW9uYWwgYWRhcHRlcnMuIFRoZSB2YWx1ZSB3aWxsIGJlIGdyZWF0ZXIgdGhhbiAxIGZvciB0aGUgbWFzdGVyIGFkYXB0ZXIgb2YgYSBtdWx0aWhlYWQgY2FyZC4gVGhlIHZhbHVlIHdpbGwgYmUgMCBmb3IgYSBzdWJvcmRpbmF0ZSBhZGFwdGVyIG9mIGEgbXVsdGloZWFkIGNhcmQuIEVhY2ggY2FyZCBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBtYXN0ZXIsIGJ1dCBtYXkgaGF2ZSBtYW55IHN1Ym9yZGluYXRlcy4KLQotCQljYXBzLkRlY2xUeXBlcyA9CUQzRERUQ0FQU19VQllURTQgfAkJLy8gNC1EIHVuc2lnbmVkIGJ5dGUuCi0JCQkJCQkJRDNERFRDQVBTX1VCWVRFNE4gfAkJLy8gTm9ybWFsaXplZCwgNC1EIHVuc2lnbmVkIGJ5dGUuIEVhY2ggb2YgdGhlIGZvdXIgYnl0ZXMgaXMgbm9ybWFsaXplZCBieSBkaXZpZGluZyB0byAyNTUuMC4KLQkJCQkJCQlEM0REVENBUFNfU0hPUlQyTiB8CQkvLyBOb3JtYWxpemVkLCAyLUQgc2lnbmVkIHNob3J0LCBleHBhbmRlZCB0byAoZmlyc3QgYnl0ZS8zMjc2Ny4wLCBzZWNvbmQgYnl0ZS8zMjc2Ny4wLCAwLCAxKS4KLQkJCQkJCQlEM0REVENBUFNfU0hPUlQ0TiB8CQkvLyBOb3JtYWxpemVkLCA0LUQgc2lnbmVkIHNob3J0LCBleHBhbmRlZCB0byAoZmlyc3QgYnl0ZS8zMjc2Ny4wLCBzZWNvbmQgYnl0ZS8zMjc2Ny4wLCB0aGlyZCBieXRlLzMyNzY3LjAsIGZvdXJ0aCBieXRlLzMyNzY3LjApLgotCQkJCQkJCUQzRERUQ0FQU19VU0hPUlQyTiB8CS8vIE5vcm1hbGl6ZWQsIDItRCB1bnNpZ25lZCBzaG9ydCwgZXhwYW5kZWQgdG8gKGZpcnN0IGJ5dGUvNjU1MzUuMCwgc2Vjb25kIGJ5dGUvNjU1MzUuMCwgMCwgMSkuCi0JCQkJCQkJRDNERFRDQVBTX1VTSE9SVDROIHwJLy8gTm9ybWFsaXplZCA0LUQgdW5zaWduZWQgc2hvcnQsIGV4cGFuZGVkIHRvIChmaXJzdCBieXRlLzY1NTM1LjAsIHNlY29uZCBieXRlLzY1NTM1LjAsIHRoaXJkIGJ5dGUvNjU1MzUuMCwgZm91cnRoIGJ5dGUvNjU1MzUuMCkuCi0JCQkJCQkJRDNERFRDQVBTX1VERUMzIHwJCS8vIDMtRCB1bnNpZ25lZCAxMCAxMCAxMCBmb3JtYXQgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgdmFsdWUsIDEpLgotCQkJCQkJCUQzRERUQ0FQU19ERUMzTiB8CQkvLyAzLUQgc2lnbmVkIDEwIDEwIDEwIGZvcm1hdCBub3JtYWxpemVkIGFuZCBleHBhbmRlZCB0byAodlswXS81MTEuMCwgdlsxXS81MTEuMCwgdlsyXS81MTEuMCwgMSkuCi0JCQkJCQkJRDNERFRDQVBTX0ZMT0FUMTZfMiB8CS8vIDItRCAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KLQkJCQkJCQlEM0REVENBUFNfRkxPQVQxNl80OwkvLyA0LUQgMTYtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi0KLQkJY2Fwcy5OdW1TaW11bHRhbmVvdXNSVHMgPSA0OwkvLyBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHJlbmRlciB0YXJnZXRzLiBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IG9uZS4KLQotCQljYXBzLlN0cmV0Y2hSZWN0RmlsdGVyQ2FwcyA9IAlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCS8vIERldmljZSBzdXBwb3J0cyBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgcmVjdGFuZ2xlcy4gVGhpcyBmaWx0ZXIgdHlwZSBpcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBEM0RURVhGX1BPSU5ULgotCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgcmVjdGFuZ2xlcy4gVGhpcyBmaWx0ZXIgdHlwZSBpcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBEM0RURVhGX1BPSU5ULgotCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJLy8gRGV2aWNlIHN1cHBvcnRzIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgcmVjdGFuZ2xlcy4gVGhpcyBmaWx0ZXIgdHlwZSBpcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBEM0RURVhGX0xJTkVBUi4KLQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUjsJCS8vIERldmljZSBzdXBwb3J0cyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyByZWN0YW5nbGVzLiBUaGlzIGZpbHRlciB0eXBlIGlzIHJlcXVlc3RlZCBieSBjYWxsaW5nIElEaXJlY3QzRERldmljZTk6OlN0cmV0Y2hSZWN0IHVzaW5nIEQzRFRFWEZfTElORUFSLgotCi0JCWNhcHMuVlMyMENhcHMuQ2FwcyA9IHZlcnRleFNoYWRlclByZWRpY2F0aW9uOwkJCQkJCQkJCS8vIEluc3RydWN0aW9uIHByZWRpY2F0aW9uIGlzIHN1cHBvcnRlZC4gU2VlIHNldHBfY29tcC4KLQkJY2Fwcy5WUzIwQ2Fwcy5EeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IHZlcnRleFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoOwkvLyBUaGUgbWF4aW11bSBsZXZlbCBvZiBuZXN0aW5nIG9mIGR5bmFtaWMgZmxvdyBjb250cm9sIGluc3RydWN0aW9ucyAoYnJlYWssIGJyZWFrYywgaWZjKS4KLQkJY2Fwcy5WUzIwQ2Fwcy5OdW1UZW1wcyA9IEQzRFZTMjBfTUFYX05VTVRFTVBTOwkJCQkJCQkJCS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZW1wb3JhcnkgcmVnaXN0ZXJzIHN1cHBvcnRlZC4KLQkJY2Fwcy5WUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoID0gRDNEVlMyMF9NQVhfU1RBVElDRkxPV0NPTlRST0xERVBUSDsJCS8vIFRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3Rpbmcgb2YgdGhlIGxvb3AvcmVwIGFuZCBjYWxsL2NhbGxueiBib29sIGluc3RydWN0aW9ucy4KLQotCQljYXBzLlBTMjBDYXBzLkNhcHMgPQlwaXhlbFNoYWRlckFyYml0cmFyeVN3aXp6bGUgfAkJCQkJCS8vIEFyYml0cmFyeSBzd2l6emxpbmcgaXMgc3VwcG9ydGVkLgotCQkJCQkJCQlwaXhlbFNoYWRlckdyYWRpZW50SW5zdHJ1Y3Rpb25zIHwJCQkJCS8vIEdyYWRpZW50IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLgotCQkJCQkJCQlwaXhlbFNoYWRlclByZWRpY2F0aW9uIHwJCQkJCQkJLy8gSW5zdHJ1Y3Rpb24gcHJlZGljYXRpb24gaXMgc3VwcG9ydGVkLiBTZWUgc2V0cF9jb21wIC0gcHMuCi0JCQkJCQkJCXBpeGVsU2hhZGVyTm9EZXBlbmRlbnRSZWFkTGltaXQgfAkJCQkJLy8gVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBkZXBlbmRlbnQgcmVhZHMgcGVyIGluc3RydWN0aW9uLgotCQkJCQkJCQlwaXhlbFNoYWRlck5vVGV4SW5zdHJ1Y3Rpb25MaW1pdDsJCQkJCS8vIFRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGV4IGluc3RydWN0aW9ucy4KLQotCQljYXBzLlBTMjBDYXBzLkR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gcGl4ZWxTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aDsJCS8vIFRoZSBtYXhpbXVtIGxldmVsIG9mIG5lc3Rpbmcgb2YgZHluYW1pYyBmbG93IGNvbnRyb2wgaW5zdHJ1Y3Rpb25zIChicmVhaywgYnJlYWtjLCBpZmMpLgotCQljYXBzLlBTMjBDYXBzLk51bUluc3RydWN0aW9uU2xvdHMgPSBEM0RQUzIwX01BWF9OVU1JTlNUUlVDVElPTlNMT1RTOwkJCS8vIFRoZSBkcml2ZXIgd2lsbCBzdXBwb3J0IGF0IG1vc3QgdGhpcyBtYW55IGluc3RydWN0aW9ucy4KLQkJY2Fwcy5QUzIwQ2Fwcy5OdW1UZW1wcyA9IEQzRFBTMjBfTUFYX05VTVRFTVBTOwkJCQkJCQkJCS8vIFRoZSBkcml2ZXIgd2lsbCBzdXBwb3J0IGF0IG1vc3QgdGhpcyBtYW55IHRlbXBvcmFyeSByZWdpc3Rlci4KLQkJY2Fwcy5QUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoID0gcGl4ZWxTaGFkZXJTdGF0aWNGbG93Q29udHJvbERlcHRoOwkJLy8gVGhlIG1heGltdW0gZGVwdGggb2YgbmVzdGluZyBvZiB0aGUgbG9vcC9yZXAgYW5kIGNhbGwvY2FsbG56IGJvb2wgaW5zdHJ1Y3Rpb25zLgotCi0JCWNhcHMuVmVydGV4VGV4dHVyZUZpbHRlckNhcHMgPQkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBweXJhbWlkYWwgbWFnbmlmeWluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUFlSQU1JREFMUVVBRCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KLQkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuCi0JCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4KLQkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4KLQkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVDsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBwb2ludC1zYW1wbGUgbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCi0JCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVI7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgotCi0JCWNhcHMuTWF4VlNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gbWF4aW11bVZlcnRleFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkOwkvLyBNYXhpbXVtIG51bWJlciBvZiB2ZXJ0ZXggc2hhZGVyIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBydW4uCi0JCWNhcHMuTWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gbWF4aW11bVBpeGVsU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQ7CS8vIE1heGltdW0gbnVtYmVyIG9mIHBpeGVsIHNoYWRlciBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgcnVuLgotCQljYXBzLk1heFZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90cyA9IG1heGltdW1WZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHM7CS8vIE1heGltdW0gbnVtYmVyIG9mIHZlcnRleCBzaGFkZXIgaW5zdHJ1Y3Rpb24gc2xvdHMgc3VwcG9ydGVkLiBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzZXQgb24gdGhpcyBjYXAgaXMgMzI3NjguIERldmljZXMgdGhhdCBzdXBwb3J0IHZzXzNfMCBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCBhdCBsZWFzdCA1MTIgaW5zdHJ1Y3Rpb24gc2xvdHMuCi0JCWNhcHMuTWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBtYXhpbXVtUGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHM7CS8vIE1heGltdW0gbnVtYmVyIG9mIHBpeGVsIHNoYWRlciBpbnN0cnVjdGlvbiBzbG90cyBzdXBwb3J0ZWQuIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHNldCBvbiB0aGlzIGNhcCBpcyAzMjc2OC4gRGV2aWNlcyB0aGF0IHN1cHBvcnQgcHNfM18wIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IGF0IGxlYXN0IDUxMiBpbnN0cnVjdGlvbiBzbG90cy4KLQotCQkqY2FwYWJpbGl0aWVzID0gY2FwczsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0Q5OjpSZWdpc3RlclNvZnR3YXJlRGV2aWNlKHZvaWQgKmluaXRpYWxpemVGdW5jdGlvbikKLQl7Ci0JCVRSQUNFKCJ2b2lkICppbml0aWFsaXplRnVuY3Rpb24gPSAweCUwLjhwIiwgaW5pdGlhbGl6ZUZ1bmN0aW9uKTsKLQotCQlsb2FkU3lzdGVtRDNEOSgpOwotCi0JCWlmKGQzZDkpCi0JCXsKLQkJCXJldHVybiBkM2Q5LT5SZWdpc3RlclNvZnR3YXJlRGV2aWNlKGluaXRpYWxpemVGdW5jdGlvbik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0Q5Ojpsb2FkU3lzdGVtRDNEOSgpCi0JewotCQlpZihkM2Q5KQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljaGFyIGQzZDlQYXRoW01BWF9QQVRIICsgMTZdOwotCQlHZXRTeXN0ZW1EaXJlY3RvcnkoZDNkOVBhdGgsIE1BWF9QQVRIKTsKLQkJc3RyY2F0KGQzZDlQYXRoLCAiXFxkM2Q5LmRsbCIpOwotCQlkM2Q5TGliID0gTG9hZExpYnJhcnkoZDNkOVBhdGgpOwotCi0JCWlmKGQzZDlMaWIpCi0JCXsKLQkJCXR5cGVkZWYgSURpcmVjdDNEOSogKF9fc3RkY2FsbCAqRElSRUNUM0RDUkVBVEU5KSh1bnNpZ25lZCBpbnQpOwotCQkJRElSRUNUM0RDUkVBVEU5IGRpcmVjdDNEQ3JlYXRlOSA9IChESVJFQ1QzRENSRUFURTkpR2V0UHJvY0FkZHJlc3MoZDNkOUxpYiwgIkRpcmVjdDNEQ3JlYXRlOSIpOwotCQkJZDNkOSA9IGRpcmVjdDNEQ3JlYXRlOShEM0RfU0RLX1ZFUlNJT04pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0Q5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEOS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDlkZGEuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0Q5LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOV9EaXJlY3QzRDlfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0Q5X2hwcAotCi0jaW5jbHVkZSAiVW5rbm93bi5ocHAiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGQzZDkuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzRERldmljZTk7Ci0KLQljbGFzcyBEaXJlY3QzRDkgOiBwdWJsaWMgSURpcmVjdDNEOSwgcHVibGljIFVua25vd24KLQl7Ci0JcHVibGljOgotCQlEaXJlY3QzRDkoaW50IHZlcnNpb24sIGNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZSk7Ci0KLQkJfkRpcmVjdDNEOSgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRDkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBSZWdpc3RlclNvZnR3YXJlRGV2aWNlKHZvaWQgKmluaXRpYWxpemVGdW5jdGlvbikgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0QWRhcHRlckNvdW50KCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJJZGVudGlmaWVyKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBZGFwdGVyTW9kZUNvdW50KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRW51bUFkYXB0ZXJNb2Rlcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERk9STUFUIGZvcm1hdCwgdW5zaWduZWQgaW50IGluZGV4LCBEM0RESVNQTEFZTU9ERSAqbW9kZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJEaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERElTUExBWU1PREUgKm1vZGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDaGVja0RldmljZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgY2hlY2tUeXBlLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCwgRDNERk9STUFUIGJhY2tCdWZmZXJGb3JtYXQsIGludCB3aW5kb3dlZCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENoZWNrRGV2aWNlRm9ybWF0KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgRDNERk9STUFUIGNoZWNrRm9ybWF0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQsIGludCB3aW5kb3dlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUsIHVuc2lnbmVkIGxvbmcgKnF1YWxpdHlMZXZlbHMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDaGVja0RlcHRoU3RlbmNpbE1hdGNoKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBEM0RGT1JNQVQgZGVwdGhTdGVuY2lsRm9ybWF0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQsIEQzREZPUk1BVCB0YXJnZXRGb3JtYXQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2VDYXBzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzRENBUFM5ICpjYXBzKSBvdmVycmlkZTsKLQkJSE1PTklUT1IgX19zdGRjYWxsIEdldEFkYXB0ZXJNb25pdG9yKHVuc2lnbmVkIGludCBhZGFwdGVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlRGV2aWNlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKSBvdmVycmlkZTsKLQotCXByb3RlY3RlZDoKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQljb25zdCBpbnQgdmVyc2lvbjsKLQkJY29uc3QgSElOU1RBTkNFIGluc3RhbmNlOwotCi0JCS8vIFJlYWwgRDNEOSBsaWJyYXJ5Ci0JCUhNT0RVTEUgZDNkOUxpYjsKLQotCXByaXZhdGU6Ci0JCXZvaWQgbG9hZFN5c3RlbUQzRDkoKTsKLQotCQlERVZNT0RFICpkaXNwbGF5TW9kZTsKLQkJaW50IG51bURpc3BsYXlNb2RlczsKLQkJYm9vbCBkaXNhYmxlQWxwaGFNb2RlOyAgIC8vIERpc2FibGUgQThSOEc4QjggZGlzcGxheSBtb2RlIHN1cHBvcnQKLQkJYm9vbCBkaXNhYmxlMTBCaXRNb2RlOyAgIC8vIERpc2FibGUgQTJSMTBHMTBCMTAgZGlzcGxheSBtb2RlIHN1cHBvcnQKLQotCQkvL1JlYWwgSURpcmVjdDNEOSBvYmplY3QKLQkJSURpcmVjdDNEOSAqZDNkOTsKLQl9OwotfQotCi0jZW5kaWYgICAvLyBEM0Q5X0RpcmVjdDNEOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEOUV4LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEOUV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljNGM1Ni4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRDlFeC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEOUV4LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOUV4LmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLW5hbWVzcGFjZSBzdwotewotCWV4dGVybiBib29sIHBvc3RCbGVuZFNSR0I7Ci19Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JRGlyZWN0M0Q5RXg6OkRpcmVjdDNEOUV4KGludCB2ZXJzaW9uLCBjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UpIDogRGlyZWN0M0Q5KHZlcnNpb24sIGluc3RhbmNlKQotCXsKLQkJZDNkOWV4ID0gMDsKLQl9Ci0KLQlEaXJlY3QzRDlFeDo6fkRpcmVjdDNEOUV4KCkKLQl7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDlFeDo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlUUkFDRSgiY29uc3QgSUlEICZpaWQgPSAweCUwLjhwLCB2b2lkICoqb2JqZWN0ID0gMHglMC44cCIsIGlpZCwgb2JqZWN0KTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRDlFeCB8fAotCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRDkgfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEOUV4OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0Q5OjpBZGRSZWYoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEOUV4OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCJ2b2lkIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEOTo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0Q5RXg6OlJlZ2lzdGVyU29mdHdhcmVEZXZpY2Uodm9pZCAqaW5pdGlhbGl6ZUZ1bmN0aW9uKQotCXsKLQkJVFJBQ0UoInZvaWQgKmluaXRpYWxpemVGdW5jdGlvbiA9IDB4JTAuOHAiLCBpbml0aWFsaXplRnVuY3Rpb24pOwotCi0JCWxvYWRTeXN0ZW1EM0Q5ZXgoKTsKLQotCQlpZihkM2Q5ZXgpCi0JCXsKLQkJCXJldHVybiBkM2Q5ZXgtPlJlZ2lzdGVyU29mdHdhcmVEZXZpY2UoaW5pdGlhbGl6ZUZ1bmN0aW9uKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0JfQotCi0JdW5zaWduZWQgaW50IERpcmVjdDNEOUV4OjpHZXRBZGFwdGVyQ291bnQoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0Q5OjpHZXRBZGFwdGVyQ291bnQoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEOUV4OjpHZXRBZGFwdGVySWRlbnRpZmllcih1bnNpZ25lZCBpbnQgYWRhcHRlciwgdW5zaWduZWQgbG9uZyBmbGFncywgRDNEQURBUFRFUl9JREVOVElGSUVSOSAqaWRlbnRpZmllcikKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gMHglMC44WCwgRDNEQURBUFRFUl9JREVOVElGSUVSOSAqaWRlbnRpZmllciA9IDB4JTAuOHAiLCBhZGFwdGVyLCBmbGFncywgaWRlbnRpZmllcik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEOTo6R2V0QWRhcHRlcklkZW50aWZpZXIoYWRhcHRlciwgZmxhZ3MsIGlkZW50aWZpZXIpOwotCX0KLQotCXVuc2lnbmVkIGludCBEaXJlY3QzRDlFeDo6R2V0QWRhcHRlck1vZGVDb3VudCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERk9STUFUIGZvcm1hdCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQiLCBhZGFwdGVyLCBmb3JtYXQpOwotCi0JCXJldHVybiBEaXJlY3QzRDk6OkdldEFkYXB0ZXJNb2RlQ291bnQoYWRhcHRlciwgZm9ybWF0KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEOUV4OjpFbnVtQWRhcHRlck1vZGVzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0LCB1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRERJU1BMQVlNT0RFICptb2RlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgdW5zaWduZWQgaW50IGluZGV4ID0gJWQsIEQzRERJU1BMQVlNT0RFICptb2RlID0gMHglMC44cCIsIGFkYXB0ZXIsIGZvcm1hdCwgaW5kZXgsIG1vZGUpOwotCi0JCXJldHVybiBEaXJlY3QzRDk6OkVudW1BZGFwdGVyTW9kZXMoYWRhcHRlciwgZm9ybWF0LCBpbmRleCwgbW9kZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDlFeDo6R2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RESVNQTEFZTU9ERSAqbW9kZSA9IDB4JTAuOHAiLCBhZGFwdGVyLCBtb2RlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0Q5OjpHZXRBZGFwdGVyRGlzcGxheU1vZGUoYWRhcHRlciwgbW9kZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDlFeDo6Q2hlY2tEZXZpY2VUeXBlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGNoZWNrVHlwZSwgRDNERk9STUFUIGRpc3BsYXlGb3JtYXQsIEQzREZPUk1BVCBiYWNrQnVmZmVyRm9ybWF0LCBpbnQgd2luZG93ZWQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBjaGVja1R5cGUgPSAlZCwgRDNERk9STUFUIGRpc3BsYXlGb3JtYXQgPSAlZCwgRDNERk9STUFUIGJhY2tCdWZmZXJGb3JtYXQgPSAlZCwgaW50IHdpbmRvd2VkID0gJWQiLCBhZGFwdGVyLCBjaGVja1R5cGUsIGRpc3BsYXlGb3JtYXQsIGJhY2tCdWZmZXJGb3JtYXQsIHdpbmRvd2VkKTsKLQotCQlpZihjaGVja1R5cGUgIT0gRDNEREVWVFlQRV9IQUwpCi0JCXsKLQkJCWxvYWRTeXN0ZW1EM0Q5ZXgoKTsKLQotCQkJaWYoZDNkOWV4KQotCQkJewotCQkJCXJldHVybiBkM2Q5ZXgtPkNoZWNrRGV2aWNlVHlwZShhZGFwdGVyLCBjaGVja1R5cGUsIGRpc3BsYXlGb3JtYXQsIGJhY2tCdWZmZXJGb3JtYXQsIHdpbmRvd2VkKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VUeXBlKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBkaXNwbGF5Rm9ybWF0LCBiYWNrQnVmZmVyRm9ybWF0LCB3aW5kb3dlZCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRGlyZWN0M0Q5OjpDaGVja0RldmljZVR5cGUoYWRhcHRlciwgY2hlY2tUeXBlLCBkaXNwbGF5Rm9ybWF0LCBiYWNrQnVmZmVyRm9ybWF0LCB3aW5kb3dlZCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDlFeDo6Q2hlY2tEZXZpY2VGb3JtYXQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzRFJFU09VUkNFVFlQRSByZXNvdXJjZVR5cGUsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQgPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RSRVNPVVJDRVRZUEUgcmVzb3VyY2VUeXBlID0gJWQsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOwotCi0JCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCi0JCXsKLQkJCWxvYWRTeXN0ZW1EM0Q5ZXgoKTsKLQotCQkJaWYoZDNkOWV4KQotCQkJewotCQkJCXJldHVybiBkM2Q5ZXgtPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBEaXJlY3QzRDk6OkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEOUV4OjpDaGVja0RldmljZU11bHRpU2FtcGxlVHlwZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgc3VyZmFjZUZvcm1hdCwgaW50IHdpbmRvd2VkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSwgdW5zaWduZWQgbG9uZyAqcXVhbGl0eUxldmVscykKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQgPSAlZCwgaW50IHdpbmRvd2VkID0gJWQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGVUeXBlID0gJWQsIHVuc2lnbmVkIGxvbmcgKnF1YWxpdHlMZXZlbHMgPSAweCUwLjhwIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSwgcXVhbGl0eUxldmVscyk7Ci0KLQkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKLQkJewotCQkJbG9hZFN5c3RlbUQzRDlleCgpOwotCi0JCQlpZihkM2Q5ZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIGQzZDlleC0+Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoYWRhcHRlciwgZGV2aWNlVHlwZSwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSwgcXVhbGl0eUxldmVscyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIENoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlLCBxdWFsaXR5TGV2ZWxzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBEaXJlY3QzRDk6OkNoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKGFkYXB0ZXIsIGRldmljZVR5cGUsIHN1cmZhY2VGb3JtYXQsIHdpbmRvd2VkLCBtdWx0aVNhbXBsZVR5cGUsIHF1YWxpdHlMZXZlbHMpOwotCX0KLQotCWxvbmcgRGlyZWN0M0Q5RXg6OkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2godW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIEQzREZPUk1BVCByZW5kZXJUYXJnZXRGb3JtYXQsIEQzREZPUk1BVCBkZXB0aFN0ZW5jaWxGb3JtYXQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0ID0gJWQsIEQzREZPUk1BVCByZW5kZXJUYXJnZXRGb3JtYXQgPSAlZCwgRDNERk9STUFUIGRlcHRoU3RlbmNpbEZvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOwotCi0JCXJldHVybiBEaXJlY3QzRDk6OkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2goYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0Q5RXg6OkNoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbih1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgc291cmNlRm9ybWF0LCBEM0RGT1JNQVQgdGFyZ2V0Rm9ybWF0KQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgc291cmNlRm9ybWF0ID0gJWQsIEQzREZPUk1BVCB0YXJnZXRGb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIHNvdXJjZUZvcm1hdCwgdGFyZ2V0Rm9ybWF0KTsKLQotCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQotCQl7Ci0JCQlsb2FkU3lzdGVtRDNEOWV4KCk7Ci0KLQkJCWlmKGQzZDlleCkKLQkJCXsKLQkJCQlyZXR1cm4gZDNkOWV4LT5DaGVja0RldmljZUZvcm1hdENvbnZlcnNpb24oYWRhcHRlciwgZGV2aWNlVHlwZSwgc291cmNlRm9ybWF0LCB0YXJnZXRGb3JtYXQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiBDaGVja0RldmljZUZvcm1hdENvbnZlcnNpb24oYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIHNvdXJjZUZvcm1hdCwgdGFyZ2V0Rm9ybWF0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDlFeDo6R2V0RGV2aWNlQ2Fwcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RDQVBTOSAqY2FwYWJpbGl0aWVzKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RDQVBTOSAqY2FwYWJpbGl0aWVzID0gMHglMC44cCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGNhcGFiaWxpdGllcyk7Ci0KLQkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKLQkJewotCQkJbG9hZFN5c3RlbUQzRDlleCgpOwotCi0JCQlpZihkM2Q5ZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIGQzZDlleC0+R2V0RGV2aWNlQ2FwcyhhZGFwdGVyLCBkZXZpY2VUeXBlLCBjYXBhYmlsaXRpZXMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiBHZXREZXZpY2VDYXBzKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBjYXBhYmlsaXRpZXMpOwotCQkJfQotCQl9Ci0KLQkJbG9uZyByZXN1bHQgPSBEaXJlY3QzRDk6OkdldERldmljZUNhcHMoYWRhcHRlciwgZGV2aWNlVHlwZSwgY2FwYWJpbGl0aWVzKTsKLQotCQlpZihzdzo6cG9zdEJsZW5kU1JHQikKLQkJewotCQkJY2FwYWJpbGl0aWVzLT5QcmltaXRpdmVNaXNjQ2FwcyB8PSBEM0RQTUlTQ0NBUFNfUE9TVEJMRU5EU1JHQkNPTlZFUlQ7ICAgLy8gSW5kaWNhdGVzIGRldmljZSBjYW4gcGVyZm9ybSBjb252ZXJzaW9uIHRvIHNSR0IgYWZ0ZXIgYmxlbmRpbmcuCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUhNT05JVE9SIERpcmVjdDNEOUV4OjpHZXRBZGFwdGVyTW9uaXRvcih1bnNpZ25lZCBpbnQgYWRhcHRlcikKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkIiwgYWRhcHRlcik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEOTo6R2V0QWRhcHRlck1vbml0b3IoYWRhcHRlcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRDlFeDo6Q3JlYXRlRGV2aWNlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBIV05EIGZvY3VzV2luZG93ID0gJWQsIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncyA9IDB4JTAuOFgsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwLCBJRGlyZWN0M0REZXZpY2U5ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSAweCUwLjhwIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7Ci0KLQkJaWYoIWZvY3VzV2luZG93IHx8ICFwcmVzZW50UGFyYW1ldGVycyB8fCAhcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCi0JCXsKLQkJCSpyZXR1cm5lZERldmljZUludGVyZmFjZSA9IDA7Ci0KLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRDNERElTUExBWU1PREVFWCBmdWxsc2NyZWVuRGlzcGxheU1vZGUgPSB7MH07Ci0JCWZ1bGxzY3JlZW5EaXNwbGF5TW9kZS5TaXplID0gc2l6ZW9mKEQzRERJU1BMQVlNT0RFRVgpOwotCQlmdWxsc2NyZWVuRGlzcGxheU1vZGUuRm9ybWF0ID0gcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJGb3JtYXQ7Ci0JCWZ1bGxzY3JlZW5EaXNwbGF5TW9kZS5XaWR0aCA9IHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyV2lkdGg7Ci0JCWZ1bGxzY3JlZW5EaXNwbGF5TW9kZS5IZWlnaHQgPSBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodDsKLQkJZnVsbHNjcmVlbkRpc3BsYXlNb2RlLlJlZnJlc2hSYXRlID0gcHJlc2VudFBhcmFtZXRlcnMtPkZ1bGxTY3JlZW5fUmVmcmVzaFJhdGVJbkh6OwotCQlmdWxsc2NyZWVuRGlzcGxheU1vZGUuU2NhbkxpbmVPcmRlcmluZyA9IEQzRFNDQU5MSU5FT1JERVJJTkdfUFJPR1JFU1NJVkU7Ci0KLQkJcmV0dXJuIENyZWF0ZURldmljZUV4KGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgcHJlc2VudFBhcmFtZXRlcnMtPldpbmRvd2VkID8gMCA6ICZmdWxsc2NyZWVuRGlzcGxheU1vZGUsIChJRGlyZWN0M0REZXZpY2U5RXgqKilyZXR1cm5lZERldmljZUludGVyZmFjZSk7Ci0JfQotCi0JdW5zaWduZWQgaW50IF9fc3RkY2FsbCBEaXJlY3QzRDlFeDo6R2V0QWRhcHRlck1vZGVDb3VudEV4KHVuc2lnbmVkIGludCBhZGFwdGVyLCBjb25zdCBEM0RESVNQTEFZTU9ERUZJTFRFUiAqZmlsdGVyKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIGNvbnN0IEQzRERJU1BMQVlNT0RFRklMVEVSICpmaWx0ZXIgPSAweCUwLjhwIiwgYWRhcHRlciwgZmlsdGVyKTsKLQotCQlyZXR1cm4gRGlyZWN0M0Q5OjpHZXRBZGFwdGVyTW9kZUNvdW50KGFkYXB0ZXIsIGZpbHRlci0+Rm9ybWF0KTsgICAvLyBGSVhNRQotCX0KLQotCWxvbmcgX19zdGRjYWxsIERpcmVjdDNEOUV4OjpFbnVtQWRhcHRlck1vZGVzRXgodW5zaWduZWQgaW50IGFkYXB0ZXIsIGNvbnN0IEQzRERJU1BMQVlNT0RFRklMVEVSICpmaWx0ZXIsIHVuc2lnbmVkIGludCBpbmRleCwgRDNERElTUExBWU1PREVFWCAqbW9kZUV4KQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIGNvbnN0IEQzRERJU1BMQVlNT0RFRklMVEVSICpmaWx0ZXIgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgRDNERElTUExBWU1PREVFWCAqbW9kZUV4ID0gMHglMC44cCIsIGFkYXB0ZXIsIGZpbHRlciwgaW5kZXgsIG1vZGVFeCk7Ci0KLQkJRDNERElTUExBWU1PREUgbW9kZTsKLQotCQltb2RlLkZvcm1hdCA9IG1vZGVFeC0+Rm9ybWF0OwotCQltb2RlLldpZHRoID0gbW9kZUV4LT5XaWR0aDsKLQkJbW9kZS5IZWlnaHQgPSBtb2RlRXgtPkhlaWdodDsKLQkJbW9kZS5SZWZyZXNoUmF0ZSA9IG1vZGVFeC0+UmVmcmVzaFJhdGU7Ci0KLQkJcmV0dXJuIERpcmVjdDNEOTo6RW51bUFkYXB0ZXJNb2RlcyhhZGFwdGVyLCBmaWx0ZXItPkZvcm1hdCwgaW5kZXgsICZtb2RlKTsgICAvLyBGSVhNRQotCX0KLQotCWxvbmcgX19zdGRjYWxsIERpcmVjdDNEOUV4OjpHZXRBZGFwdGVyRGlzcGxheU1vZGVFeCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERElTUExBWU1PREVFWCAqbW9kZUV4LCBEM0RESVNQTEFZUk9UQVRJT04gKnJvdGF0aW9uKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERJU1BMQVlNT0RFRVggKm1vZGVFeCA9IDB4JTAuOHAsIEQzRERJU1BMQVlST1RBVElPTiAqcm90YXRpb24gPSAweCUwLjhwIiwgYWRhcHRlciwgbW9kZUV4LCByb3RhdGlvbik7Ci0KLQkJRDNERElTUExBWU1PREUgbW9kZTsKLQotCQltb2RlLkZvcm1hdCA9IG1vZGVFeC0+Rm9ybWF0OwotCQltb2RlLldpZHRoID0gbW9kZUV4LT5XaWR0aDsKLQkJbW9kZS5IZWlnaHQgPSBtb2RlRXgtPkhlaWdodDsKLQkJbW9kZS5SZWZyZXNoUmF0ZSA9IG1vZGVFeC0+UmVmcmVzaFJhdGU7Ci0KLQkJcmV0dXJuIEdldEFkYXB0ZXJEaXNwbGF5TW9kZShhZGFwdGVyLCAmbW9kZSk7ICAgLy8gRklYTUUKLQl9Ci0KLQlsb25nIF9fc3RkY2FsbCBEaXJlY3QzRDlFeDo6Q3JlYXRlRGV2aWNlRXgodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgRFdPUkQgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgRDNERElTUExBWU1PREVFWCAqZnVsbHNjcmVlbkRpc3BsYXlNb2RlLCBJRGlyZWN0M0REZXZpY2U5RXggKipyZXR1cm5lZERldmljZUludGVyZmFjZSkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgSFdORCBmb2N1c1dpbmRvdyA9ICVkLCBEV09SRCBiZWhhdmlvckZsYWdzID0gMHglMC44WCwgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyA9IDB4JTAuOHAsIEQzRERJU1BMQVlNT0RFRVggKmZ1bGxzY3JlZW5EaXNwbGF5TW9kZSA9IDB4JTAuOHAsIElEaXJlY3QzRERldmljZTlFeCAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gMHglMC44cCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgZnVsbHNjcmVlbkRpc3BsYXlNb2RlLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7Ci0KLQkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKLQkJewotCQkJbG9hZFN5c3RlbUQzRDlleCgpOwotCi0JCQlpZihkM2Q5ZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIGQzZDlleC0+Q3JlYXRlRGV2aWNlRXgoYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCBmdWxsc2NyZWVuRGlzcGxheU1vZGUsIHJldHVybmVkRGV2aWNlSW50ZXJmYWNlKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlDcmVhdGVEZXZpY2VFeChhZGFwdGVyLCBkZXZpY2VUeXBlLCBmb2N1c1dpbmRvdywgYmVoYXZpb3JGbGFncywgcHJlc2VudFBhcmFtZXRlcnMsIGZ1bGxzY3JlZW5EaXNwbGF5TW9kZSwgcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOwotCQkJfQotCQl9Ci0KLQkJaWYoIWZvY3VzV2luZG93IHx8ICFwcmVzZW50UGFyYW1ldGVycyB8fCAhcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCi0JCXsKLQkJCSpyZXR1cm5lZERldmljZUludGVyZmFjZSA9IDA7Ci0KLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gbmV3IERpcmVjdDNERGV2aWNlOUV4KGluc3RhbmNlLCB0aGlzLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBmb2N1c1dpbmRvdywgYmVoYXZpb3JGbGFncywgcHJlc2VudFBhcmFtZXRlcnMpOwotCi0JCWlmKCpyZXR1cm5lZERldmljZUludGVyZmFjZSkKLQkJewotCQkJKCpyZXR1cm5lZERldmljZUludGVyZmFjZSktPkFkZFJlZigpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIF9fc3RkY2FsbCBEaXJlY3QzRDlFeDo6R2V0QWRhcHRlckxVSUQodW5zaWduZWQgaW50IGFkYXB0ZXIsIExVSUQgKmx1aWQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgTFVJRCAqbHVpZCA9IDB4JTAuOHAiLCBhZGFwdGVyLCBsdWlkKTsKLQotCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCkKLQkJewotCQkJVU5JTVBMRU1FTlRFRCgpOwotCQl9Ci0KLQkJLy8gRklYTUU6IFNob3VsZCByZXR1cm4gYSBwcmVzaXN0ZW50IGlkIHVzaW5nIEFsbG9jYXRlTG9jYWxseVVuaXF1ZUlkKCkKLQkJbHVpZC0+TG93UGFydCA9IDB4MDAwMDAwMTsKLQkJbHVpZC0+SGlnaFBhcnQgPSAweDAwMDAwMDA7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEOUV4Ojpsb2FkU3lzdGVtRDNEOWV4KCkKLQl7Ci0JCWlmKGQzZDlleCkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2hhciBkM2Q5UGF0aFtNQVhfUEFUSCArIDE2XTsKLQkJR2V0U3lzdGVtRGlyZWN0b3J5KGQzZDlQYXRoLCBNQVhfUEFUSCk7Ci0JCXN0cmNhdChkM2Q5UGF0aCwgIlxcZDNkOS5kbGwiKTsKLQkJZDNkOUxpYiA9IExvYWRMaWJyYXJ5KGQzZDlQYXRoKTsKLQotCQlpZihkM2Q5TGliKQotCQl7Ci0JCQl0eXBlZGVmIElEaXJlY3QzRDlFeCogKF9fc3RkY2FsbCAqRElSRUNUM0RDUkVBVEU5RVgpKHVuc2lnbmVkIGludCwgSURpcmVjdDNEOUV4KiopOwotCQkJRElSRUNUM0RDUkVBVEU5RVggZGlyZWN0M0RDcmVhdGU5RXggPSAoRElSRUNUM0RDUkVBVEU5RVgpR2V0UHJvY0FkZHJlc3MoZDNkOUxpYiwgIkRpcmVjdDNEQ3JlYXRlOUV4Iik7Ci0JCQlkaXJlY3QzRENyZWF0ZTlFeChEM0RfU0RLX1ZFUlNJT04sICZkM2Q5ZXgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0Q5RXguaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0Q5RXguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzQ2Y2RmLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNEOUV4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOV9EaXJlY3QzRDlFeF9ocHAKLSNkZWZpbmUgRDNEOV9EaXJlY3QzRDlFeF9ocHAKLQotI2luY2x1ZGUgIkRpcmVjdDNEOS5ocHAiCi0KLS8vI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZDNkOS5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCWNsYXNzIERpcmVjdDNERGV2aWNlOTsKLQotCWNsYXNzIERpcmVjdDNEOUV4IDogcHVibGljIElEaXJlY3QzRDlFeCwgcHVibGljIERpcmVjdDNEOQotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEOUV4KGludCB2ZXJzaW9uLCBjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UpOwotCi0JCX5EaXJlY3QzRDlFeCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRDkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBSZWdpc3RlclNvZnR3YXJlRGV2aWNlKHZvaWQgKmluaXRpYWxpemVGdW5jdGlvbikgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0QWRhcHRlckNvdW50KCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJJZGVudGlmaWVyKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBZGFwdGVyTW9kZUNvdW50KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRW51bUFkYXB0ZXJNb2Rlcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERk9STUFUIGZvcm1hdCwgdW5zaWduZWQgaW50IGluZGV4LCBEM0RESVNQTEFZTU9ERSAqbW9kZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJEaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNERElTUExBWU1PREUgKm1vZGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDaGVja0RldmljZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgY2hlY2tUeXBlLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCwgRDNERk9STUFUIGJhY2tCdWZmZXJGb3JtYXQsIGludCB3aW5kb3dlZCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENoZWNrRGV2aWNlRm9ybWF0KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgRDNERk9STUFUIGNoZWNrRm9ybWF0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQsIGludCB3aW5kb3dlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUsIHVuc2lnbmVkIGxvbmcgKnF1YWxpdHlMZXZlbHMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDaGVja0RlcHRoU3RlbmNpbE1hdGNoKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBEM0RGT1JNQVQgZGVwdGhTdGVuY2lsRm9ybWF0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQsIEQzREZPUk1BVCB0YXJnZXRGb3JtYXQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2VDYXBzKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzRENBUFM5ICpjYXBzKSBvdmVycmlkZTsKLQkJSE1PTklUT1IgX19zdGRjYWxsIEdldEFkYXB0ZXJNb25pdG9yKHVuc2lnbmVkIGludCBhZGFwdGVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlRGV2aWNlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNERGV2aWNlOSAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0Q5RXggbWV0aG9kcwotCQl1bnNpZ25lZCBpbnQgX19zdGRjYWxsIEdldEFkYXB0ZXJNb2RlQ291bnRFeCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgY29uc3QgRDNERElTUExBWU1PREVGSUxURVIgKmZpbHRlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEVudW1BZGFwdGVyTW9kZXNFeCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgY29uc3QgRDNERElTUExBWU1PREVGSUxURVIgKmZpbHRlciwgdW5zaWduZWQgaW50IGluZGV4LCBEM0RESVNQTEFZTU9ERUVYICptb2RlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0QWRhcHRlckRpc3BsYXlNb2RlRXgodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERJU1BMQVlNT0RFRVggKm1vZGUsIEQzRERJU1BMQVlST1RBVElPTiAqcm90YXRpb24pIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVEZXZpY2VFeCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBIV05EIGZvY3VzV2luZG93LCBEV09SRCBiZWhhdmlvckZsYWdzLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzLCBEM0RESVNQTEFZTU9ERUVYICpmdWxsc2NyZWVuRGlzcGxheU1vZGUsIElEaXJlY3QzRERldmljZTlFeCAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0QWRhcHRlckxVSUQodW5zaWduZWQgaW50IGFkYXB0ZXIsIExVSUQgKmx1aWQpIG92ZXJyaWRlOwotCi0JcHJpdmF0ZToKLQkJdm9pZCBsb2FkU3lzdGVtRDNEOWV4KCk7Ci0KLQkJLy8gUmVhbCBJRGlyZWN0M0Q5RXggb2JqZWN0Ci0JCUlEaXJlY3QzRDlFeCAqZDNkOWV4OwotCX07Ci19Ci0KLSNlbmRpZiAgIC8vIEQzRDlfRGlyZWN0M0Q5RXhfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzREJhc2VUZXh0dXJlOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzREJhc2VUZXh0dXJlOS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NjVkOWQuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RCYXNlVGV4dHVyZTkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzREJhc2VUZXh0dXJlOS5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgotI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlEaXJlY3QzREJhc2VUZXh0dXJlOTo6RGlyZWN0M0RCYXNlVGV4dHVyZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIHVuc2lnbmVkIGxvbmcgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlKSA6IERpcmVjdDNEUmVzb3VyY2U5KGRldmljZSwgdHlwZSwgcG9vbCwgMCksIGZvcm1hdChmb3JtYXQpLCBsZXZlbHMobGV2ZWxzKSwgdXNhZ2UodXNhZ2UpCi0JewotCQlmaWx0ZXJUeXBlID0gRDNEVEVYRl9MSU5FQVI7Ci0JCUxPRCA9IDA7Ci0KLQkJcmVzb3VyY2UgPSBuZXcgc3c6OlJlc291cmNlKDApOwotCX0KLQotCURpcmVjdDNEQmFzZVRleHR1cmU5Ojp+RGlyZWN0M0RCYXNlVGV4dHVyZTkoKQotCXsKLQkJcmVzb3VyY2UtPmRlc3RydWN0KCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RCYXNlVGV4dHVyZTkgfHwKLQkJICAgaWlkID09IElJRF9JRGlyZWN0M0RSZXNvdXJjZTkgfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU5OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6RnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpGcmVlUHJpdmF0ZURhdGEoZ3VpZCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlByZUxvYWQoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCURpcmVjdDNEUmVzb3VyY2U5OjpQcmVMb2FkKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6U2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSwgZmxhZ3MpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OlNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRQcmlvcml0eSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRQcmlvcml0eSgpOwotCX0KLQotCUQzRFJFU09VUkNFVFlQRSBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0VHlwZSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRUeXBlKCk7Ci0JfQotCi0JRDNEVEVYVFVSRUZJTFRFUlRZUEUgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZih1c2FnZSAmIEQzRFVTQUdFX0FVVE9HRU5NSVBNQVApCi0JCXsKLQkJCXJldHVybiBmaWx0ZXJUeXBlOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dXJuIEQzRFRFWEZfTk9ORTsKLQkJfQotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldExldmVsQ291bnQoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKHVzYWdlICYgRDNEVVNBR0VfQVVUT0dFTk1JUE1BUCkKLQkJewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlyZXR1cm4gbGV2ZWxzOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldExPRCgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYocG9vbCAmIEQzRFBPT0xfTUFOQUdFRCkKLQkJewotCQkJcmV0dXJuIExPRDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0QXV0b0dlbkZpbHRlclR5cGUoRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyVHlwZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZih1c2FnZSAmIEQzRFVTQUdFX0FVVE9HRU5NSVBNQVApCi0JCXsKLQkJCXRoaXMtPmZpbHRlclR5cGUgPSBmaWx0ZXJUeXBlOyAgIC8vIEZJWE1FOiBDaGVjayBpZiB2YWxpZAotCQkJLy8gRklYTUU6IERpcnR5IHRoZSBtaXBtYXAgY2hhaW4KLQotCQkJcmV0dXJuIEQzRF9PSzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiBEM0RURVhGX05PTkU7Ci0JCX0KLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJdW5zaWduZWQgbG9uZyBvbGRMT0QgPSBMT0Q7Ci0JCUxPRCA9IG5ld0xPRCA8IGxldmVscyA/IG5ld0xPRCA6IGxldmVscyAtIDE7Ci0KLQkJaWYocG9vbCAmIEQzRFBPT0xfTUFOQUdFRCkKLQkJewotCQkJcmV0dXJuIG9sZExPRDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0Jdm9pZCBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2VuZXJhdGVNaXBTdWJMZXZlbHMoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCX0KLQotCXN3OjpSZXNvdXJjZSAqRGlyZWN0M0RCYXNlVGV4dHVyZTk6OmdldFJlc291cmNlKCkgY29uc3QKLQl7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU5OjpnZXRJbnRlcm5hbExldmVsQ291bnQoKSBjb25zdAotCXsKLQkJcmV0dXJuIGxldmVsczsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU5OjpnZXRVc2FnZSgpIGNvbnN0Ci0JewotCQlyZXR1cm4gdXNhZ2U7Ci0JfQotCi0JRDNERk9STUFUIERpcmVjdDNEQmFzZVRleHR1cmU5OjpnZXRGb3JtYXQoKSBjb25zdAotCXsKLQkJcmV0dXJuIGZvcm1hdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzREJhc2VUZXh0dXJlOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzREJhc2VUZXh0dXJlOS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzVhMTQuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q5X0RpcmVjdDNEQmFzZVRleHR1cmU5X2hwcAotI2RlZmluZSBEM0Q5X0RpcmVjdDNEQmFzZVRleHR1cmU5X2hwcAotCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTkuaHBwIgotCi0jaW5jbHVkZSA8ZDNkOS5oPgotCi1uYW1lc3BhY2Ugc3cKLXsKLQljbGFzcyBSZXNvdXJjZTsKLX0KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzREJhc2VUZXh0dXJlOSA6IHB1YmxpYyBJRGlyZWN0M0RCYXNlVGV4dHVyZTksIHB1YmxpYyBEaXJlY3QzRFJlc291cmNlOQotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEQmFzZVRleHR1cmU5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCB1bnNpZ25lZCBsb25nIGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSk7Ci0KLQkJfkRpcmVjdDNEQmFzZVRleHR1cmU5KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEUmVzb3VyY2U5IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpIG92ZXJyaWRlOwotCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgbWV0aG9kcwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRBdXRvR2VuRmlsdGVyVHlwZShEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXJUeXBlKSBvdmVycmlkZTsKLQkJRDNEVEVYVFVSRUZJTFRFUlRZUEUgX19zdGRjYWxsIEdldEF1dG9HZW5GaWx0ZXJUeXBlKCkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIEdlbmVyYXRlTWlwU3ViTGV2ZWxzKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZW5hbCBtZXRob2RzCi0JCXN3OjpSZXNvdXJjZSAqZ2V0UmVzb3VyY2UoKSBjb25zdDsKLQkJdW5zaWduZWQgbG9uZyBnZXRJbnRlcm5hbExldmVsQ291bnQoKSBjb25zdDsKLQkJdW5zaWduZWQgbG9uZyBnZXRVc2FnZSgpIGNvbnN0OwotCQlEM0RGT1JNQVQgZ2V0Rm9ybWF0KCkgY29uc3Q7Ci0KLQlwcm90ZWN0ZWQ6Ci0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJdW5zaWduZWQgbG9uZyBsZXZlbHM7ICAgLy8gUmVjYWxjdWxhdGVkIHdoZW4gMAotCQljb25zdCB1bnNpZ25lZCBsb25nIHVzYWdlOwotCQljb25zdCBEM0RGT1JNQVQgZm9ybWF0OwotCi0JCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2U7Ci0KLQlwcml2YXRlOgotCQlEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXJUeXBlOwotCQl1bnNpZ25lZCBsb25nIExPRDsKLQl9OwotfQotCi0jZW5kaWYgLy8gRDNEOV9EaXJlY3QzREJhc2VUZXh0dXJlOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEQ3ViZVRleHR1cmU5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEQ3ViZVRleHR1cmU5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzNDc4Ni4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzREN1YmVUZXh0dXJlOS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEQ3ViZVRleHR1cmU5LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RTdXJmYWNlOS5ocHAiCi0jaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCURpcmVjdDNEQ3ViZVRleHR1cmU5OjpEaXJlY3QzREN1YmVUZXh0dXJlOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgdW5zaWduZWQgaW50IGVkZ2VMZW5ndGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCkgOiBEaXJlY3QzREJhc2VUZXh0dXJlOShkZXZpY2UsIEQzRFJUWVBFX0NVQkVURVhUVVJFLCBmb3JtYXQsIHBvb2wsIGxldmVscywgdXNhZ2UpLCBlZGdlTGVuZ3RoKGVkZ2VMZW5ndGgpCi0JewotCQlpZihsZXZlbHMgPT0gMCkKLQkJewotCQkJdGhpcy0+bGV2ZWxzID0gc3c6OmxvZzIoc3c6Om1heCgoaW50KWVkZ2VMZW5ndGgsIDEpKSArIDE7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQotCQl7Ci0JCQlpbnQgd2lkdGggPSBlZGdlTGVuZ3RoOwotCQkJaW50IGhlaWdodCA9IGVkZ2VMZW5ndGg7Ci0KLQkJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQotCQkJewotCQkJCWlmKGxldmVsIDwgdGhpcy0+bGV2ZWxzKQotCQkJCXsKLQkJCQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSA9IG5ldyBEaXJlY3QzRFN1cmZhY2U5KGRldmljZSwgdGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwb29sLCBEM0RNVUxUSVNBTVBMRV9OT05FLCAwLCBmYWxzZSwgdXNhZ2UpOwotCQkJCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdLT5iaW5kKCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0gPSAwOwotCQkJCX0KLQotCQkJCXdpZHRoID0gc3c6Om1heCgxLCB3aWR0aCAvIDIpOwotCQkJCWhlaWdodCA9IHN3OjptYXgoMSwgaGVpZ2h0IC8gMik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlEaXJlY3QzREN1YmVUZXh0dXJlOTo6fkRpcmVjdDNEQ3ViZVRleHR1cmU5KCkKLQl7Ci0JCWZvcih1bnNpZ25lZCBpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspCi0JCXsKLQkJCWZvcihpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQotCQkJewotCQkJCWlmKHN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0pCi0JCQkJewotCQkJCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdLT51bmJpbmQoKTsKLQkJCQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSA9IDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RDdWJlVGV4dHVyZTkgfHwKLQkJICAgaWlkID09IElJRF9JRGlyZWN0M0RCYXNlVGV4dHVyZTkgfHwKLQkJICAgaWlkID09IElJRF9JRGlyZWN0M0RSZXNvdXJjZTkgfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6RnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpGcmVlUHJpdmF0ZURhdGEoZ3VpZCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OlByZUxvYWQoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCURpcmVjdDNEQmFzZVRleHR1cmU5OjpQcmVMb2FkKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6U2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSwgZmxhZ3MpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpHZXRQcmlvcml0eSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRQcmlvcml0eSgpOwotCX0KLQotCUQzRFJFU09VUkNFVFlQRSBEaXJlY3QzREN1YmVUZXh0dXJlOTo6R2V0VHlwZSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRUeXBlKCk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzREN1YmVUZXh0dXJlOTo6R2VuZXJhdGVNaXBTdWJMZXZlbHMoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCEodXNhZ2UgJiBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVzb3VyY2UtPmxvY2soc3c6OlBVQkxJQyk7Ci0KLQkJZm9yKHVuc2lnbmVkIGludCBmYWNlID0gMDsgZmFjZSA8IDY7IGZhY2UrKykKLQkJewotCQkJaWYoIXN1cmZhY2VMZXZlbFtmYWNlXVswXS0+aGFzRGlydHlDb250ZW50cygpKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGV2ZWxzIC0gMTsgaSsrKQotCQkJewotCQkJCWRldmljZS0+c3RyZXRjaFJlY3Qoc3VyZmFjZUxldmVsW2ZhY2VdW2ldLCAwLCBzdXJmYWNlTGV2ZWxbZmFjZV1baSArIDFdLCAwLCBHZXRBdXRvR2VuRmlsdGVyVHlwZSgpKTsKLQkJCX0KLQotCQkJc3VyZmFjZUxldmVsW2ZhY2VdWzBdLT5tYXJrQ29udGVudHNDbGVhbigpOwotCQl9Ci0KLQkJcmVzb3VyY2UtPnVubG9jaygpOwotCX0KLQotCUQzRFRFWFRVUkVGSUxURVJUWVBFIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpHZXRBdXRvR2VuRmlsdGVyVHlwZSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRBdXRvR2VuRmlsdGVyVHlwZSgpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OkdldExldmVsQ291bnQoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0TGV2ZWxDb3VudCgpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OkdldExPRCgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRMT0QoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpTZXRBdXRvR2VuRmlsdGVyVHlwZShEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXJUeXBlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0QXV0b0dlbkZpbHRlclR5cGUoZmlsdGVyVHlwZSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6U2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0TE9EKG5ld0xPRCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6QWRkRGlydHlSZWN0KEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgY29uc3QgUkVDVCAqZGlydHlSZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JLy8JVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6R2V0Q3ViZU1hcFN1cmZhY2UoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwsIElEaXJlY3QzRFN1cmZhY2U5ICoqY3ViZU1hcFN1cmZhY2UpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJKmN1YmVNYXBTdXJmYWNlID0gMDsKLQotCQlpZihmYWNlID49IDYgfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0tPkFkZFJlZigpOwotCQkqY3ViZU1hcFN1cmZhY2UgPSBzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlOTo6R2V0TGV2ZWxEZXNjKHVuc2lnbmVkIGludCBsZXZlbCwgRDNEU1VSRkFDRV9ERVNDICpkZXNjcmlwdGlvbikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighZGVzY3JpcHRpb24gfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbMF1bbGV2ZWxdKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXJldHVybiBzdXJmYWNlTGV2ZWxbMF1bbGV2ZWxdLT5HZXREZXNjKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU5OjpMb2NrUmVjdChEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCwgRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QsIGNvbnN0IFJFQ1QgKnJlY3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWxvY2tlZFJlY3QgfHwgZmFjZSA+PSA2IHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXS0+TG9ja1JlY3QobG9ja2VkUmVjdCwgcmVjdCwgZmxhZ3MpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTk6OlVubG9ja1JlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoZmFjZSA+PSA2IHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXS0+VW5sb2NrUmVjdCgpOwotCX0KLQotCURpcmVjdDNEU3VyZmFjZTkgKkRpcmVjdDNEQ3ViZVRleHR1cmU5OjpnZXRJbnRlcm5hbEN1YmVNYXBTdXJmYWNlKEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsKQotCXsKLQkJcmV0dXJuIHN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEQ3ViZVRleHR1cmU5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEQ3ViZVRleHR1cmU5LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkZWRkNS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzREN1YmVUZXh0dXJlOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0RDdWJlVGV4dHVyZTlfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0RDdWJlVGV4dHVyZTlfaHBwCi0KLSNpbmNsdWRlICJEaXJlY3QzREJhc2VUZXh0dXJlOS5ocHAiCi0KLSNpbmNsdWRlICJDb25maWcuaHBwIgotCi0jaW5jbHVkZSA8ZDNkOS5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCWNsYXNzIERpcmVjdDNEU3VyZmFjZTk7Ci0KLQljbGFzcyBEaXJlY3QzREN1YmVUZXh0dXJlOSA6IHB1YmxpYyBJRGlyZWN0M0RDdWJlVGV4dHVyZTksIHB1YmxpYyBEaXJlY3QzREJhc2VUZXh0dXJlOQotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEQ3ViZVRleHR1cmU5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKLQotCQl+RGlyZWN0M0RDdWJlVGV4dHVyZTkoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRQcmlvcml0eSgpIG92ZXJyaWRlOwotCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCkgb3ZlcnJpZGU7Ci0JCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzREJhc2VUZXh0dXJlOSBtZXRob2RzCi0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldExPRCgpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMZXZlbENvdW50KCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldEF1dG9HZW5GaWx0ZXJUeXBlKEQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlclR5cGUpIG92ZXJyaWRlOwotCQlEM0RURVhUVVJFRklMVEVSVFlQRSBfX3N0ZGNhbGwgR2V0QXV0b0dlbkZpbHRlclR5cGUoKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgR2VuZXJhdGVNaXBTdWJMZXZlbHMoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RDdWJlVGV4dHVyZTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RTVVJGQUNFX0RFU0MgKmRlc2NyaXB0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Q3ViZU1hcFN1cmZhY2UoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwsIElEaXJlY3QzRFN1cmZhY2U5ICoqY3ViZU1hcFN1cmZhY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBMb2NrUmVjdChEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCwgRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QsIGNvbnN0IFJFQ1QgKnJlY3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBVbmxvY2tSZWN0KEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQWRkRGlydHlSZWN0KEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgY29uc3QgUkVDVCAqZGlydHlSZWN0KSBvdmVycmlkZTsKLQotCQkvLyBJbnRlcm5hbCBtZXRob2RzCi0JCURpcmVjdDNEU3VyZmFjZTkgKmdldEludGVybmFsQ3ViZU1hcFN1cmZhY2UoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwpOwotCi0JcHJpdmF0ZToKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQljb25zdCB1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aDsKLQotCQlEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlTGV2ZWxbNl1bc3c6Ok1JUE1BUF9MRVZFTFNdOwotCX07Ci19Ci0KLSNlbmRpZiAvLyBEM0Q5X0RpcmVjdDNEOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRERldmljZTkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY5NDIwLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NDA4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0Q5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzREluZGV4QnVmZmVyOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFRleHR1cmU5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZVRleHR1cmU5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzREN1YmVUZXh0dXJlOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEU3dhcENoYWluOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RQaXhlbFNoYWRlcjkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4U2hhZGVyOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RTdGF0ZUJsb2NrOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RRdWVyeTkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lOS5ocHAiCi0KLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAiQ2FwYWJpbGl0aWVzLmhwcCIKLSNpbmNsdWRlICJNYXRoLmhwcCIKLSNpbmNsdWRlICJSZW5kZXJlci5ocHAiCi0jaW5jbHVkZSAiQ29uZmlnLmhwcCIKLSNpbmNsdWRlICJGcmFtZUJ1ZmZlci5ocHAiCi0jaW5jbHVkZSAiQ2xpcHBlci5ocHAiCi0jaW5jbHVkZSAiQ29uZmlndXJhdG9yLmhwcCIKLSNpbmNsdWRlICJUaW1lci5ocHAiCi0jaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLWJvb2wgbG9jYWxTaGFkZXJDb25zdGFudHMgPSB0cnVlOwotCi1uYW1lc3BhY2UgRDNEOQotewotCWlubGluZSB1bnNpZ25lZCBsb25nIEZ0b0RXKGZsb2F0IGYpCi0JewotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcmKWY7Ci0JfQotCi0JRGlyZWN0M0REZXZpY2U5OjpEaXJlY3QzRERldmljZTkoY29uc3QgSElOU1RBTkNFIGluc3RhbmNlLCBEaXJlY3QzRDkgKmQzZDksIHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3VyRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpIDogaW5zdGFuY2UoaW5zdGFuY2UpLCBhZGFwdGVyKGFkYXB0ZXIpLCBkM2Q5KGQzZDkpLCBkZXZpY2VUeXBlKGRldmljZVR5cGUpLCBmb2N1c1dpbmRvdyhmb2N1c1dpbmRvdyksIGJlaGF2aW91ckZsYWdzKGJlaGF2aW91ckZsYWdzKQotCXsKLQkJSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmY3JpdGljYWxTZWN0aW9uKTsKLQotCQlpbml0ID0gdHJ1ZTsKLQkJc3RhdGVSZWNvcmRlciA9IDA7Ci0KLQkJZDNkOS0+QWRkUmVmKCk7Ci0KLQkJY29udGV4dCA9IG5ldyBzdzo6Q29udGV4dCgpOwotCQlyZW5kZXJlciA9IG5ldyBzdzo6UmVuZGVyZXIoY29udGV4dCwgc3c6OkRpcmVjdDNELCBmYWxzZSk7Ci0KLQkJc3dhcENoYWluID0gMDsKLQkJZGVwdGhTdGVuY2lsID0gMDsKLQkJYXV0b0RlcHRoU3RlbmNpbCA9IDA7Ci0JCXJlbmRlclRhcmdldFswXSA9IDA7Ci0JCXJlbmRlclRhcmdldFsxXSA9IDA7Ci0JCXJlbmRlclRhcmdldFsyXSA9IDA7Ci0JCXJlbmRlclRhcmdldFszXSA9IDA7Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDE2ICsgNDsgaSsrKQotCQl7Ci0JCQl0ZXh0dXJlW2ldID0gMDsKLQkJfQotCi0JCWN1cnNvciA9IDA7Ci0KLQkJUmVzZXQocHJlc2VudFBhcmFtZXRlcnMpOwotCi0JCXBpeGVsU2hhZGVyID0gMDsKLQkJdmVydGV4U2hhZGVyID0gMDsKLQotCQlsaWdodHNEaXJ0eSA9IHRydWU7Ci0JCXBpeGVsU2hhZGVyRGlydHkgPSB0cnVlOwotCQlwaXhlbFNoYWRlckNvbnN0YW50c0JEaXJ0eSA9IDA7Ci0JCXBpeGVsU2hhZGVyQ29uc3RhbnRzRkRpcnR5ID0gMDsKLQkJcGl4ZWxTaGFkZXJDb25zdGFudHNJRGlydHkgPSAwOwotCQl2ZXJ0ZXhTaGFkZXJEaXJ0eSA9IHRydWU7Ci0JCXZlcnRleFNoYWRlckNvbnN0YW50c0JEaXJ0eSA9IDA7Ci0JCXZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eSA9IDA7Ci0JCXZlcnRleFNoYWRlckNvbnN0YW50c0lEaXJ0eSA9IDA7Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IE1BWF9WRVJURVhfSU5QVVRTOyBpKyspCi0JCXsKLQkJCWRhdGFTdHJlYW1baV0gPSAwOwotCQkJc3RyZWFtU3RyaWRlW2ldID0gMDsKLQkJCXN0cmVhbU9mZnNldFtpXSA9IDA7Ci0KLQkJCXN0cmVhbVNvdXJjZUZyZXFbaV0gPSAxOwotCQl9Ci0KLQkJaW5kZXhEYXRhID0gMDsKLQkJdmVydGV4RGVjbGFyYXRpb24gPSAwOwotCi0JCUQzRE1BVEVSSUFMOSBtYXRlcmlhbDsKLQotCQltYXRlcmlhbC5EaWZmdXNlLnIgPSAxLjBmOwotCQltYXRlcmlhbC5EaWZmdXNlLmcgPSAxLjBmOwotCQltYXRlcmlhbC5EaWZmdXNlLmIgPSAxLjBmOwotCQltYXRlcmlhbC5EaWZmdXNlLmEgPSAwLjBmOwotCQltYXRlcmlhbC5BbWJpZW50LnIgPSAwLjBmOwotCQltYXRlcmlhbC5BbWJpZW50LmcgPSAwLjBmOwotCQltYXRlcmlhbC5BbWJpZW50LmIgPSAwLjBmOwotCQltYXRlcmlhbC5BbWJpZW50LmEgPSAwLjBmOwotCQltYXRlcmlhbC5FbWlzc2l2ZS5yID0gMC4wZjsKLQkJbWF0ZXJpYWwuRW1pc3NpdmUuZyA9IDAuMGY7Ci0JCW1hdGVyaWFsLkVtaXNzaXZlLmIgPSAwLjBmOwotCQltYXRlcmlhbC5FbWlzc2l2ZS5hID0gMC4wZjsKLQkJbWF0ZXJpYWwuU3BlY3VsYXIuciA9IDAuMGY7Ci0JCW1hdGVyaWFsLlNwZWN1bGFyLmcgPSAwLjBmOwotCQltYXRlcmlhbC5TcGVjdWxhci5iID0gMC4wZjsKLQkJbWF0ZXJpYWwuU3BlY3VsYXIuYSA9IDAuMGY7Ci0JCW1hdGVyaWFsLlBvd2VyID0gMC4wZjsKLQotCQlTZXRNYXRlcmlhbCgmbWF0ZXJpYWwpOwotCi0JCUQzRE1BVFJJWCBpZGVudGl0eSA9IHsxLCAwLCAwLCAwLAotCQkgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMCwgMCwKLQkJICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsIDAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAxfTsKLQotCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVklFVywgJmlkZW50aXR5KTsKLQkJU2V0VHJhbnNmb3JtKEQzRFRTX1BST0pFQ1RJT04sICZpZGVudGl0eSk7Ci0JCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFMCwgJmlkZW50aXR5KTsKLQkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUxLCAmaWRlbnRpdHkpOwotCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTIsICZpZGVudGl0eSk7Ci0JCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFMywgJmlkZW50aXR5KTsKLQkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU0LCAmaWRlbnRpdHkpOwotCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTUsICZpZGVudGl0eSk7Ci0JCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFNiwgJmlkZW50aXR5KTsKLQkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU3LCAmaWRlbnRpdHkpOwotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKQotCQl7Ci0JCQlTZXRUcmFuc2Zvcm0oRDNEVFNfV09STERNQVRSSVgoaSksICZpZGVudGl0eSk7Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1BJWEVMX1NIQURFUl9DT05TVDsgaSsrKQotCQl7Ci0JCQlmbG9hdCB6ZXJvWzRdID0gezAsIDAsIDAsIDB9OwotCi0JCQlTZXRQaXhlbFNoYWRlckNvbnN0YW50RihpLCB6ZXJvLCAxKTsKLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBNQVhfVkVSVEVYX1NIQURFUl9DT05TVDsgaSsrKQotCQl7Ci0JCQlmbG9hdCB6ZXJvWzRdID0gezAsIDAsIDAsIDB9OwotCi0JCQlTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoaSwgemVybywgMSk7Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJewotCQkJaW50IHplcm9bNF0gPSB7MCwgMCwgMCwgMH07Ci0KLQkJCVNldFBpeGVsU2hhZGVyQ29uc3RhbnRJKGksIHplcm8sIDEpOwotCQkJU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKGksIHplcm8sIDEpOwotCQkJU2V0UGl4ZWxTaGFkZXJDb25zdGFudEIoaSwgJnplcm9bMF0sIDEpOwotCQkJU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKGksICZ6ZXJvWzBdLCAxKTsKLQkJfQotCi0JCWluaXQgPSBmYWxzZTsKLQotCQlpZighKGJlaGF2aW91ckZsYWdzICYgRDNEQ1JFQVRFX0ZQVV9QUkVTRVJWRSkpCi0JCXsKLQkJCWNvbmZpZ3VyZUZQVSgpOwotCQl9Ci0KLQkJaW5zdGFuY2luZ0VuYWJsZWQgPSBwaXhlbFNoYWRlclZlcnNpb25YID49IEQzRFBTX1ZFUlNJT04oMywgMCk7Ci0JfQotCi0JRGlyZWN0M0REZXZpY2U5Ojp+RGlyZWN0M0REZXZpY2U5KCkKLQl7Ci0JCWRlbGV0ZSByZW5kZXJlcjsKLQkJcmVuZGVyZXIgPSAwOwotCQlkZWxldGUgY29udGV4dDsKLQkJY29udGV4dCA9IDA7Ci0KLQkJZDNkOS0+UmVsZWFzZSgpOwotCQlkM2Q5ID0gMDsKLQotCQlzd2FwQ2hhaW4tPnVuYmluZCgpOwotCQlzd2FwQ2hhaW4gPSAwOwotCi0JCWlmKGRlcHRoU3RlbmNpbCkKLQkJewotCQkJZGVwdGhTdGVuY2lsLT51bmJpbmQoKTsKLQkJCWRlcHRoU3RlbmNpbCA9IDA7Ci0JCX0KLQotCQlpZihhdXRvRGVwdGhTdGVuY2lsKQotCQl7Ci0JCQlhdXRvRGVwdGhTdGVuY2lsLT51bmJpbmQoKTsKLQkJCWF1dG9EZXB0aFN0ZW5jaWwgPSAwOwotCQl9Ci0KLQkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykKLQkJewotCQkJaWYocmVuZGVyVGFyZ2V0W2luZGV4XSkKLQkJCXsKLQkJCQlyZW5kZXJUYXJnZXRbaW5kZXhdLT51bmJpbmQoKTsKLQkJCQlyZW5kZXJUYXJnZXRbaW5kZXhdID0gMDsKLQkJCX0KLQkJfQotCi0JCWlmKHZlcnRleERlY2xhcmF0aW9uKQotCQl7Ci0JCQl2ZXJ0ZXhEZWNsYXJhdGlvbi0+dW5iaW5kKCk7Ci0JCQl2ZXJ0ZXhEZWNsYXJhdGlvbiA9IDA7Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTYgKyA0OyBpKyspCi0JCXsKLQkJCWlmKHRleHR1cmVbaV0pCi0JCQl7Ci0JCQkJdGV4dHVyZVtpXS0+dW5iaW5kKCk7Ci0JCQkJdGV4dHVyZVtpXSA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1ZFUlRFWF9JTlBVVFM7IGkrKykKLQkJewotCQkJaWYoZGF0YVN0cmVhbVtpXSkKLQkJCXsKLQkJCQlkYXRhU3RyZWFtW2ldLT51bmJpbmQoKTsKLQkJCQlkYXRhU3RyZWFtW2ldID0gMDsKLQkJCX0KLQkJfQotCi0JCWlmKGluZGV4RGF0YSkKLQkJewotCQkJaW5kZXhEYXRhLT51bmJpbmQoKTsKLQkJCWluZGV4RGF0YSA9IDA7Ci0JCX0KLQotCQlpZihwaXhlbFNoYWRlcikKLQkJewotCQkJcGl4ZWxTaGFkZXItPnVuYmluZCgpOwotCQkJcGl4ZWxTaGFkZXIgPSAwOwotCQl9Ci0KLQkJaWYodmVydGV4U2hhZGVyKQotCQl7Ci0JCQl2ZXJ0ZXhTaGFkZXItPnVuYmluZCgpOwotCQkJdmVydGV4U2hhZGVyID0gMDsKLQkJfQotCi0JCWlmKHN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnVuYmluZCgpOwotCQkJc3RhdGVSZWNvcmRlciA9IDA7Ci0JCX0KLQotCQlwYWxldHRlLmNsZWFyKCk7Ci0KLQkJZGVsZXRlIGN1cnNvcjsKLQotCQlEZWxldGVDcml0aWNhbFNlY3Rpb24oJmNyaXRpY2FsU2VjdGlvbik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJjb25zdCBJSUQgJmlpZCA9IDB4JTAuOHAsIHZvaWQgKipvYmplY3QgPSAweCUwLjhwIiwgaWlkLCBvYmplY3QpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNERGV2aWNlOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0REZXZpY2U5OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRERldmljZTk6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpCZWdpblNjZW5lKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidm9pZCIpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkJlZ2luU3RhdGVCbG9jaygpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlpZihzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN0YXRlUmVjb3JkZXIgPSBuZXcgRGlyZWN0M0RTdGF0ZUJsb2NrOSh0aGlzLCAoRDNEU1RBVEVCTE9DS1RZUEUpMCk7Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCXJldHVybiBPVVRPRk1FTU9SWSgpOwotCQl9Ci0KLQkJc3RhdGVSZWNvcmRlci0+YmluZCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkNsZWFyKHVuc2lnbmVkIGxvbmcgY291bnQsIGNvbnN0IEQzRFJFQ1QgKnJlY3RzLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGNvbG9yLCBmbG9hdCB6LCB1bnNpZ25lZCBsb25nIHN0ZW5jaWwpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgY291bnQgPSAlZCwgY29uc3QgRDNEUkVDVCAqcmVjdHMgPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gMHglMC44WCwgdW5zaWduZWQgbG9uZyBjb2xvciA9IDB4JTAuOFgsIGZsb2F0IHogPSAlZiwgdW5zaWduZWQgbG9uZyBzdGVuY2lsID0gJWQiLCBjb3VudCwgcmVjdHMsIGZsYWdzLCBjb2xvciwgeiwgc3RlbmNpbCk7Ci0KLQkJaWYoIXJlY3RzICYmIGNvdW50ICE9IDApCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoZmxhZ3MgJiAoRDNEQ0xFQVJfWkJVRkZFUiB8IEQzRENMRUFSX1NURU5DSUwpICYmICFkZXB0aFN0ZW5jaWwpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoZmxhZ3MgJiBEM0RDTEVBUl9TVEVOQ0lMKSAgIC8vIENoZWNrIGZvciBzdGVuY2lsIGNvbXBvbmVudAotCQl7Ci0JCQlEM0RTVVJGQUNFX0RFU0MgZGVzY3JpcHRpb247Ci0JCQlkZXB0aFN0ZW5jaWwtPkdldERlc2MoJmRlc2NyaXB0aW9uKTsKLQotCQkJc3dpdGNoKGRlc2NyaXB0aW9uLkZvcm1hdCkKLQkJCXsKLQkJCWNhc2UgRDNERk1UX0QxNVMxOgotCQkJY2FzZSBEM0RGTVRfRDI0Uzg6Ci0JCQljYXNlIEQzREZNVF9EMjRYODoKLQkJCWNhc2UgRDNERk1UX0QyNFg0UzQ6Ci0JCQljYXNlIEQzREZNVF9EMjRGUzg6Ci0JCQljYXNlIEQzREZNVF9TOF9MT0NLQUJMRTogICAvLyBGSVhNRTogSU5WQUxJRENBTEwgd2hlbiB0cnlpbmcgdG8gY2xlYXIgZGVwdGg/Ci0JCQljYXNlIEQzREZNVF9ERjI0OgotCQkJY2FzZSBEM0RGTVRfREYxNjoKLQkJCWNhc2UgRDNERk1UX0lOVFo6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzREZNVF9EMTZfTE9DS0FCTEU6Ci0JCQljYXNlIEQzREZNVF9EMzI6Ci0JCQljYXNlIEQzREZNVF9EMTY6Ci0JCQljYXNlIEQzREZNVF9EMzJGX0xPQ0tBQkxFOgotCQkJY2FzZSBEM0RGTVRfRDMyX0xPQ0tBQkxFOgotCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJaWYoIXJlY3RzKQotCQl7Ci0JCQljb3VudCA9IDE7Ci0KLQkJCUQzRFJFQ1QgcmVjdDsKLQkJCXJlY3QueDEgPSB2aWV3cG9ydC5YOwotCQkJcmVjdC54MiA9IHZpZXdwb3J0LlggKyB2aWV3cG9ydC5XaWR0aDsKLQkJCXJlY3QueTEgPSB2aWV3cG9ydC5ZOwotCQkJcmVjdC55MiA9IHZpZXdwb3J0LlkgKyB2aWV3cG9ydC5IZWlnaHQ7Ci0KLQkJCXJlY3RzID0gJnJlY3Q7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJewotCQkJc3c6OlJlY3QgY2xlYXJSZWN0KHJlY3RzW2ldLngxLCByZWN0c1tpXS55MSwgcmVjdHNbaV0ueDIsIHJlY3RzW2ldLnkyKTsKLQotCQkJY2xlYXJSZWN0LmNsaXAodmlld3BvcnQuWCwgdmlld3BvcnQuWSwgdmlld3BvcnQuWCArIHZpZXdwb3J0LldpZHRoLCB2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0KTsKLQotCQkJaWYoc2Npc3NvckVuYWJsZSkKLQkJCXsKLQkJCQljbGVhclJlY3QuY2xpcChzY2lzc29yUmVjdC5sZWZ0LCBzY2lzc29yUmVjdC50b3AsIHNjaXNzb3JSZWN0LnJpZ2h0LCBzY2lzc29yUmVjdC5ib3R0b20pOwotCQkJfQotCi0JCQlpZihmbGFncyAmIEQzRENMRUFSX1RBUkdFVCkKLQkJCXsKLQkJCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKQotCQkJCXsKLQkJCQkJaWYocmVuZGVyVGFyZ2V0W2luZGV4XSkKLQkJCQkJewotCQkJCQkJRDNEU1VSRkFDRV9ERVNDIGRlc2NyaXB0aW9uOwotCQkJCQkJcmVuZGVyVGFyZ2V0W2luZGV4XS0+R2V0RGVzYygmZGVzY3JpcHRpb24pOwotCi0JCQkJCQlmbG9hdCByZ2JhWzRdOwotCQkJCQkJcmdiYVswXSA9IChmbG9hdCkoY29sb3IgJiAweDAwRkYwMDAwKSAvIDB4MDBGRjAwMDA7Ci0JCQkJCQlyZ2JhWzFdID0gKGZsb2F0KShjb2xvciAmIDB4MDAwMEZGMDApIC8gMHgwMDAwRkYwMDsKLQkJCQkJCXJnYmFbMl0gPSAoZmxvYXQpKGNvbG9yICYgMHgwMDAwMDBGRikgLyAweDAwMDAwMEZGOwotCQkJCQkJcmdiYVszXSA9IChmbG9hdCkoY29sb3IgJiAweEZGMDAwMDAwKSAvIDB4RkYwMDAwMDA7Ci0KLQkJCQkJCWlmKHJlbmRlclN0YXRlW0QzRFJTX1NSR0JXUklURUVOQUJMRV0gIT0gRkFMU0UgJiYgaW5kZXggPT0gMCAmJiBDYXBhYmlsaXRpZXM6OmlzU1JHQndyaXRhYmxlKGRlc2NyaXB0aW9uLkZvcm1hdCkpCi0JCQkJCQl7Ci0JCQkJCQkJcmdiYVswXSA9IHN3OjpsaW5lYXJUb1NSR0IocmdiYVswXSk7Ci0JCQkJCQkJcmdiYVsxXSA9IHN3OjpsaW5lYXJUb1NSR0IocmdiYVsxXSk7Ci0JCQkJCQkJcmdiYVsyXSA9IHN3OjpsaW5lYXJUb1NSR0IocmdiYVsyXSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJlbmRlcmVyLT5jbGVhcihyZ2JhLCBzdzo6Rk9STUFUX0EzMkIzMkczMlIzMkYsIHJlbmRlclRhcmdldFtpbmRleF0sIGNsZWFyUmVjdCwgMHhGKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYoZmxhZ3MgJiBEM0RDTEVBUl9aQlVGRkVSKQotCQkJewotCQkJCXogPSBzdzo6Y2xhbXAwMSh6KTsKLQkJCQlkZXB0aFN0ZW5jaWwtPmNsZWFyRGVwdGgoeiwgY2xlYXJSZWN0LngwLCBjbGVhclJlY3QueTAsIGNsZWFyUmVjdC53aWR0aCgpLCBjbGVhclJlY3QuaGVpZ2h0KCkpOwotCQkJfQotCi0JCQlpZihmbGFncyAmIEQzRENMRUFSX1NURU5DSUwpCi0JCQl7Ci0JCQkJZGVwdGhTdGVuY2lsLT5jbGVhclN0ZW5jaWwoc3RlbmNpbCwgMHhGRiwgY2xlYXJSZWN0LngwLCBjbGVhclJlY3QueTAsIGNsZWFyUmVjdC53aWR0aCgpLCBjbGVhclJlY3QuaGVpZ2h0KCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6Q29sb3JGaWxsKElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlLCBjb25zdCBSRUNUICpyZWN0LCBEM0RDT0xPUiBjb2xvcikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKnN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpyZWN0ID0gMHglMC44cCwgRDNEQ09MT1IgY29sb3IgPSAweCUwLjhYIiwgc3VyZmFjZSwgcmVjdCwgY29sb3IpOwotCi0JCWlmKCFzdXJmYWNlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCUQzRFNVUkZBQ0VfREVTQyBkZXNjcmlwdGlvbjsKLQotCQlzdXJmYWNlLT5HZXREZXNjKCZkZXNjcmlwdGlvbik7Ci0KLQkJaWYoZGVzY3JpcHRpb24uUG9vbCAhPSBEM0RQT09MX0RFRkFVTFQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXJlY3QpCi0JCXsKLQkJCVJFQ1QgbG9jazsKLQotCQkJbG9jay5sZWZ0ID0gMDsKLQkJCWxvY2sudG9wID0gMDsKLQkJCWxvY2sucmlnaHQgPSBkZXNjcmlwdGlvbi5XaWR0aDsKLQkJCWxvY2suYm90dG9tID0gZGVzY3JpcHRpb24uSGVpZ2h0OwotCi0JCQlyZWN0ID0gJmxvY2s7Ci0JCX0KLQotCQlzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U5Kj4oc3VyZmFjZSktPmZpbGwoY29sb3IsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50b3ApOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4oRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNEU3dhcENoYWluOSAqKnN3YXBDaGFpbikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyA9IDB4JTAuOHAsIElEaXJlY3QzRFN3YXBDaGFpbjkgKipzd2FwQ2hhaW4gPSAweCUwLjhwIiwgcHJlc2VudFBhcmFtZXRlcnMsIHN3YXBDaGFpbik7Ci0KLQkJaWYoIXN3YXBDaGFpbikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqc3dhcENoYWluID0gMDsKLQotCQlpZighcHJlc2VudFBhcmFtZXRlcnMpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudCA+IDMpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOyAgIC8vIE1heGltdW0gb2YgdGhyZWUgYmFjayBidWZmZXJzCi0JCX0KLQotCQkqc3dhcENoYWluID0gbmV3IERpcmVjdDNEU3dhcENoYWluOSh0aGlzLCBwcmVzZW50UGFyYW1ldGVycyk7Ci0KLQkJaWYoISpzd2FwQ2hhaW4pCi0JCXsKLQkJCXJldHVybiBPVVRPRk1FTU9SWSgpOwotCQl9Ci0KLQkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCi0JCXsKLQkJCWRlbGV0ZSAqc3dhcENoYWluOwotCQkJKnN3YXBDaGFpbiA9IDA7Ci0KLQkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7Ci0JCX0KLQotCQkoKnN3YXBDaGFpbiktPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZUN1YmVUZXh0dXJlKHVuc2lnbmVkIGludCBlZGdlTGVuZ3RoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzREN1YmVUZXh0dXJlOSAqKmN1YmVUZXh0dXJlLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgZWRnZUxlbmd0aCA9ICVkLCB1bnNpZ25lZCBpbnQgbGV2ZWxzID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNEQ3ViZVRleHR1cmU5ICoqY3ViZVRleHR1cmUgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIGVkZ2VMZW5ndGgsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCwgY3ViZVRleHR1cmUsIHNoYXJlZEhhbmRsZSk7Ci0KLQkJKmN1YmVUZXh0dXJlID0gMDsKLQotCQlpZihlZGdlTGVuZ3RoID09IDAgfHwgKHVzYWdlICYgRDNEVVNBR0VfQVVUT0dFTk1JUE1BUCAmJiBsZXZlbHMgPiAxKSB8fCBkM2Q5LT5DaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBEM0RGTVRfWDhSOEc4QjgsIHVzYWdlLCBEM0RSVFlQRV9DVUJFVEVYVFVSRSwgZm9ybWF0KSAhPSBEM0RfT0spCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmN1YmVUZXh0dXJlID0gbmV3IERpcmVjdDNEQ3ViZVRleHR1cmU5KHRoaXMsIGVkZ2VMZW5ndGgsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCk7Ci0KLQkJaWYoISpjdWJlVGV4dHVyZSkKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICpjdWJlVGV4dHVyZTsKLQkJCSpjdWJlVGV4dHVyZSA9IDA7Ci0KLQkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7Ci0JCX0KLQotCQkoKmN1YmVUZXh0dXJlKS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgZGlzY2FyZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgd2lkdGggPSAlZCwgdW5zaWduZWQgaW50IGhlaWdodCA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUgPSAlZCwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHkgPSAlZCwgaW50IGRpc2NhcmQgPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG11bHRpU2FtcGxlLCBtdWx0aVNhbXBsZVF1YWxpdHksIGRpc2NhcmQsIHN1cmZhY2UsIHNoYXJlZEhhbmRsZSk7Ci0KLQkJKnN1cmZhY2UgPSAwOwotCi0JCWlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZDNkOS0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCBEM0RVU0FHRV9ERVBUSFNURU5DSUwsIEQzRFJUWVBFX1NVUkZBQ0UsIGZvcm1hdCkgIT0gRDNEX09LIHx8IGhlaWdodCA+IHN3OjpPVVRMSU5FX1JFU09MVVRJT04pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJYm9vbCBsb2NrYWJsZSA9IGZhbHNlOwotCi0JCXN3aXRjaChmb3JtYXQpCi0JCXsKLQkJY2FzZSBEM0RGTVRfRDE1UzE6Ci0JCWNhc2UgRDNERk1UX0QyNFM4OgotCQljYXNlIEQzREZNVF9EMjRYODoKLQkJY2FzZSBEM0RGTVRfRDI0WDRTNDoKLQkJY2FzZSBEM0RGTVRfRDI0RlM4OgotCQljYXNlIEQzREZNVF9EMzI6Ci0JCWNhc2UgRDNERk1UX0QxNjoKLQkJY2FzZSBEM0RGTVRfREYyNDoKLQkJY2FzZSBEM0RGTVRfREYxNjoKLQkJY2FzZSBEM0RGTVRfSU5UWjoKLQkJCWxvY2thYmxlID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RGTVRfUzhfTE9DS0FCTEU6Ci0JCWNhc2UgRDNERk1UX0QxNl9MT0NLQUJMRToKLQkJY2FzZSBEM0RGTVRfRDMyRl9MT0NLQUJMRToKLQkJY2FzZSBEM0RGTVRfRDMyX0xPQ0tBQkxFOgotCQkJbG9ja2FibGUgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBU1NFUlQoZmFsc2UpOwotCQl9Ci0KLQkJKnN1cmZhY2UgPSBuZXcgRGlyZWN0M0RTdXJmYWNlOSh0aGlzLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEQzRFBPT0xfREVGQVVMVCwgbXVsdGlTYW1wbGUsIG11bHRpU2FtcGxlUXVhbGl0eSwgbG9ja2FibGUsIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCk7Ci0KLQkJaWYoISpzdXJmYWNlKQotCQl7Ci0JCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKLQkJfQotCi0JCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQotCQl7Ci0JCQlkZWxldGUgKnN1cmZhY2U7Ci0JCQkqc3VyZmFjZSA9IDA7Ci0KLQkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7Ci0JCX0KLQotCQkoKnN1cmZhY2UpLT5BZGRSZWYoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVJbmRleEJ1ZmZlcih1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzREluZGV4QnVmZmVyOSAqKmluZGV4QnVmZmVyLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGVuZ3RoID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhCdWZmZXIgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIGxlbmd0aCwgdXNhZ2UsIGZvcm1hdCwgcG9vbCwgaW5kZXhCdWZmZXIsIHNoYXJlZEhhbmRsZSk7Ci0KLQkJKmluZGV4QnVmZmVyID0gbmV3IERpcmVjdDNESW5kZXhCdWZmZXI5KHRoaXMsIGxlbmd0aCwgdXNhZ2UsIGZvcm1hdCwgcG9vbCk7Ci0KLQkJaWYoISppbmRleEJ1ZmZlcikKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICppbmRleEJ1ZmZlcjsKLQkJCSppbmRleEJ1ZmZlciA9IDA7Ci0KLQkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7Ci0JCX0KLQotCQkoKmluZGV4QnVmZmVyKS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UsIHZvaWQgKipzaGFyZWRIYW5kbGUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCB3aWR0aCA9ICVkLCB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNEUE9PTCBwb29sID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwb29sLCBzdXJmYWNlLCBzaGFyZWRIYW5kbGUpOwotCi0JCSpzdXJmYWNlID0gMDsKLQotCQlpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwIHx8IGQzZDktPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgMCwgRDNEUlRZUEVfU1VSRkFDRSwgZm9ybWF0KSAhPSBEM0RfT0spICAgLy8gRklYTUU6IEFsbG93IGFsbCBmb3JtYXRzIHN1cHBvcnRlZCBieSBydW50aW1lL1JFRgotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKHBvb2wgPT0gRDNEUE9PTF9NQU5BR0VEKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpzdXJmYWNlID0gbmV3IERpcmVjdDNEU3VyZmFjZTkodGhpcywgdGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwb29sLCBEM0RNVUxUSVNBTVBMRV9OT05FLCAwLCB0cnVlLCAwKTsKLQotCQlpZighKnN1cmZhY2UpCi0JCXsKLQkJCXJldHVybiBPVVRPRk1FTU9SWSgpOwotCQl9Ci0KLQkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCi0JCXsKLQkJCWRlbGV0ZSAqc3VyZmFjZTsKLQkJCSpzdXJmYWNlID0gMDsKLQotCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKLQkJfQotCi0JCSgqc3VyZmFjZSktPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVBpeGVsU2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKipzaGFkZXIpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoImNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uID0gMHglMC44cCwgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICoqc2hhZGVyID0gMHglMC44cCIsIGZ1bmN0aW9uLCBzaGFkZXIpOwotCi0JCWlmKCFzaGFkZXIpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnNoYWRlciA9IDA7Ci0KLQkJaWYoIXN3OjpQaXhlbFNoYWRlcjo6dmFsaWRhdGUoZnVuY3Rpb24pIHx8IGZ1bmN0aW9uWzBdID4gcGl4ZWxTaGFkZXJWZXJzaW9uWCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7ICAgLy8gU2hhZGVyIGNvbnRhaW5zIHVuc3VwcG9ydGVkIG9wZXJhdGlvbnMKLQkJfQotCi0JCSpzaGFkZXIgPSBuZXcgRGlyZWN0M0RQaXhlbFNoYWRlcjkodGhpcywgZnVuY3Rpb24pOwotCi0JCWlmKCEqc2hhZGVyKQotCQl7Ci0JCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKLQkJfQotCi0JCSgqc2hhZGVyKS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlUXVlcnkoRDNEUVVFUllUWVBFIHR5cGUsIElEaXJlY3QzRFF1ZXJ5OSAqKnF1ZXJ5KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RRVUVSWVRZUEUgdHlwZSA9ICVkLCBJRGlyZWN0M0RRdWVyeTkgKipxdWVyeSA9IDB4JTAuOHAiLCB0eXBlLCBxdWVyeSk7Ci0KLQkJaWYocXVlcnkgPT0gMCkgICAvLyBTdXBwb3J0IGNoZWNrZWQKLQkJewotCQkJc3dpdGNoKHR5cGUpCi0JCQl7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9WQ0FDSEU6CQkJCXJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9SRVNPVVJDRU1BTkFHRVI6CQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhTVEFUUzoJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9FVkVOVDoJCQkJcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNEUVVFUllUWVBFX09DQ0xVU0lPTjoJCQlyZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfVElNRVNUQU1QOgkJCXJldHVybiBEM0RfT0s7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVBESVNKT0lOVDoJcmV0dXJuIEQzRF9PSzsKLQkJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUEZSRVE6CQlyZXR1cm4gRDNEX09LOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfUElQRUxJTkVUSU1JTkdTOgkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfSU5URVJGQUNFVElNSU5HUzoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCWNhc2UgRDNEUVVFUllUWVBFX1ZFUlRFWFRJTUlOR1M6CQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9QSVhFTFRJTUlOR1M6CQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfQkFORFdJRFRIVElNSU5HUzoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCWNhc2UgRDNEUVVFUllUWVBFX0NBQ0hFVVRJTElaQVRJT046CQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQlkZWZhdWx0OgkJCQkJCQkJQVNTRVJUKGZhbHNlKTsgICByZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCWNhc2UgRDNEUVVFUllUWVBFX1ZDQUNIRToJCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9SRVNPVVJDRU1BTkFHRVI6CQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhTVEFUUzoJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9FVkVOVDoJCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9PQ0NMVVNJT046CQkJYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVA6CQkJYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVBESVNKT0lOVDoJYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVBGUkVROgkJYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9QSVBFTElORVRJTUlOR1M6CQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9JTlRFUkZBQ0VUSU1JTkdTOgkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfVkVSVEVYVElNSU5HUzoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCWNhc2UgRDNEUVVFUllUWVBFX1BJWEVMVElNSU5HUzoJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9CQU5EV0lEVEhUSU1JTkdTOgkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfQ0FDSEVVVElMSVpBVElPTjoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCWRlZmF1bHQ6CQkJCQkJCQlBU1NFUlQoZmFsc2UpOyAgIHJldHVybiBOT1RBVkFJTEFCTEUoKTsKLQkJCX0KLQotCQkJKnF1ZXJ5ID0gbmV3IERpcmVjdDNEUXVlcnk5KHRoaXMsIHR5cGUpOwotCi0JCQlpZighKnF1ZXJ5KQotCQkJewotCQkJCXJldHVybiBPVVRPRk1FTU9SWSgpOwotCQkJfQotCi0JCQkoKnF1ZXJ5KS0+QWRkUmVmKCk7Ci0KLQkJCXJldHVybiBEM0RfT0s7Ci0JCX0KLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlUmVuZGVyVGFyZ2V0KHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHksIGludCBsb2NrYWJsZSwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgd2lkdGggPSAlZCwgdW5zaWduZWQgaW50IGhlaWdodCA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUgPSAlZCwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHkgPSAlZCwgaW50IGxvY2thYmxlID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBtdWx0aVNhbXBsZSwgbXVsdGlTYW1wbGVRdWFsaXR5LCBsb2NrYWJsZSwgc3VyZmFjZSwgc2hhcmVkSGFuZGxlKTsKLQotCQkqc3VyZmFjZSA9IDA7Ci0KLQkJaWYod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCB8fCBkM2Q5LT5DaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCwgRDNEUlRZUEVfU1VSRkFDRSwgZm9ybWF0KSAhPSBEM0RfT0sgfHwgaGVpZ2h0ID4gc3c6Ok9VVExJTkVfUkVTT0xVVElPTikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqc3VyZmFjZSA9IG5ldyBEaXJlY3QzRFN1cmZhY2U5KHRoaXMsIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgRDNEUE9PTF9ERUZBVUxULCBtdWx0aVNhbXBsZSwgbXVsdGlTYW1wbGVRdWFsaXR5LCBsb2NrYWJsZSAhPSBGQUxTRSwgRDNEVVNBR0VfUkVOREVSVEFSR0VUKTsKLQotCQlpZighKnN1cmZhY2UpCi0JCXsKLQkJCXJldHVybiBPVVRPRk1FTU9SWSgpOwotCQl9Ci0KLQkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCi0JCXsKLQkJCWRlbGV0ZSAqc3VyZmFjZTsKLQkJCSpzdXJmYWNlID0gMDsKLQotCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKLQkJfQotCi0JCSgqc3VyZmFjZSktPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVN0YXRlQmxvY2soRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSwgSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RTVEFURUJMT0NLVFlQRSB0eXBlID0gJWQsIElEaXJlY3QzRFN0YXRlQmxvY2s5ICoqc3RhdGVCbG9jayA9IDB4JTAuOHAiLCB0eXBlLCBzdGF0ZUJsb2NrKTsKLQotCQkqc3RhdGVCbG9jayA9IG5ldyBEaXJlY3QzRFN0YXRlQmxvY2s5KHRoaXMsIHR5cGUpOwotCi0JCWlmKCEqc3RhdGVCbG9jaykKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQkoKnN0YXRlQmxvY2spLT5BZGRSZWYoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RUZXh0dXJlOSAqKnRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCB3aWR0aCA9ICVkLCB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gJWQsIHVuc2lnbmVkIGludCBsZXZlbHMgPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRFBPT0wgcG9vbCA9ICVkLCBJRGlyZWN0M0RUZXh0dXJlOSAqKnRleHR1cmUgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIHdpZHRoLCBoZWlnaHQsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCwgdGV4dHVyZSwgc2hhcmVkSGFuZGxlKTsKLQotCQkqdGV4dHVyZSA9IDA7Ci0KLQkJaWYod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCB8fCAodXNhZ2UgJiBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQICYmIGxldmVscyA+IDEpIHx8IGQzZDktPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgdXNhZ2UsIEQzRFJUWVBFX1RFWFRVUkUsIGZvcm1hdCkgIT0gRDNEX09LKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp0ZXh0dXJlID0gbmV3IERpcmVjdDNEVGV4dHVyZTkodGhpcywgd2lkdGgsIGhlaWdodCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sKTsKLQotCQlpZighKnRleHR1cmUpCi0JCXsKLQkJCXJldHVybiBPVVRPRk1FTU9SWSgpOwotCQl9Ci0KLQkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCi0JCXsKLQkJCWRlbGV0ZSAqdGV4dHVyZTsKLQkJCSp0ZXh0dXJlID0gMDsKLQotCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKLQkJfQotCi0JCSgqdGV4dHVyZSktPkFkZFJlZigpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVZlcnRleEJ1ZmZlcih1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCB1bnNpZ25lZCBsb25nIEZWRiwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICoqdmVydGV4QnVmZmVyLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGVuZ3RoID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgdW5zaWduZWQgbG9uZyBGVkYgPSAweCUwLjhYLCBEM0RQT09MIHBvb2wgPSAlZCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqKnZlcnRleEJ1ZmZlciA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgbGVuZ3RoLCB1c2FnZSwgRlZGLCBwb29sLCB2ZXJ0ZXhCdWZmZXIsIHNoYXJlZEhhbmRsZSk7Ci0KLQkJKnZlcnRleEJ1ZmZlciA9IG5ldyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjkodGhpcywgbGVuZ3RoLCB1c2FnZSwgRlZGLCBwb29sKTsKLQotCQlpZighKnZlcnRleEJ1ZmZlcikKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKLQkJewotCQkJZGVsZXRlICp2ZXJ0ZXhCdWZmZXI7Ci0JCQkqdmVydGV4QnVmZmVyID0gMDsKLQotCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKLQkJfQotCi0JCSgqdmVydGV4QnVmZmVyKS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlVmVydGV4RGVjbGFyYXRpb24oY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgKnZlcnRleEVsZW1lbnRzLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgKnZlcnRleEVsZW1lbnRzID0gMHglMC44cCwgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICoqZGVjbGFyYXRpb24gPSAweCUwLjhwIiwgdmVydGV4RWxlbWVudHMsIGRlY2xhcmF0aW9uKTsKLQotCQlpZighZGVjbGFyYXRpb24pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgKmVsZW1lbnQgPSB2ZXJ0ZXhFbGVtZW50czsKLQotCQl3aGlsZShlbGVtZW50LT5TdHJlYW0gIT0gMHhGRikKLQkJewotCQkJaWYoZWxlbWVudC0+VHlwZSA+IEQzRERFQ0xUWVBFX1VOVVNFRCkgICAvLyBGSVhNRTogQ2hlY2sgb3RoZXIgZmllbGRzIHRvbwotCQkJewotCQkJCXJldHVybiBGQUlMKCk7Ci0JCQl9Ci0KLQkJCWVsZW1lbnQrKzsKLQkJfQotCi0JCSpkZWNsYXJhdGlvbiA9IG5ldyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSh0aGlzLCB2ZXJ0ZXhFbGVtZW50cyk7Ci0KLQkJaWYoISpkZWNsYXJhdGlvbikKLQkJewotCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7Ci0JCX0KLQotCQkoKmRlY2xhcmF0aW9uKS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlVmVydGV4U2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJjb25zdCB1bnNpZ25lZCBsb25nICpmdW5jdGlvbiA9IDB4JTAuOHAsIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIgPSAweCUwLjhwIiwgZnVuY3Rpb24sIHNoYWRlcik7Ci0KLQkJaWYoIXNoYWRlcikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqc2hhZGVyID0gMDsKLQotCQlpZighc3c6OlZlcnRleFNoYWRlcjo6dmFsaWRhdGUoZnVuY3Rpb24pIHx8IGZ1bmN0aW9uWzBdID4gdmVydGV4U2hhZGVyVmVyc2lvblgpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOyAgIC8vIFNoYWRlciBjb250YWlucyB1bnN1cHBvcnRlZCBvcGVyYXRpb25zCi0JCX0KLQotCQkqc2hhZGVyID0gbmV3IERpcmVjdDNEVmVydGV4U2hhZGVyOSh0aGlzLCBmdW5jdGlvbik7Ci0KLQkJaWYoISpzaGFkZXIpCi0JCXsKLQkJCXJldHVybiBPVVRPRk1FTU9SWSgpOwotCQl9Ci0KLQkJKCpzaGFkZXIpLT5BZGRSZWYoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVWb2x1bWVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGRlcHRoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZvbHVtZVRleHR1cmU5ICoqdm9sdW1lVGV4dHVyZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHdpZHRoID0gJWQsIHVuc2lnbmVkIGludCBoZWlnaHQgPSAlZCwgdW5zaWduZWQgaW50IGRlcHRoID0gJWQsIHVuc2lnbmVkIGludCBsZXZlbHMgPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRFBPT0wgcG9vbCA9ICVkLCBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqKnZvbHVtZVRleHR1cmUgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIHZvbHVtZVRleHR1cmUsIHNoYXJlZEhhbmRsZSk7Ci0KLQkJKnZvbHVtZVRleHR1cmUgPSAwOwotCi0JCWlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZGVwdGggPT0gMCB8fCAodXNhZ2UgJiBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQICYmIGxldmVscyA+IDEpIHx8IGQzZDktPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgdXNhZ2UsIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkUsIGZvcm1hdCkgIT0gRDNEX09LKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp2b2x1bWVUZXh0dXJlID0gbmV3IERpcmVjdDNEVm9sdW1lVGV4dHVyZTkodGhpcywgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCk7Ci0KLQkJaWYoISp2b2x1bWVUZXh0dXJlKQotCQl7Ci0JCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKLQkJfQotCi0JCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQotCQl7Ci0JCQlkZWxldGUgKnZvbHVtZVRleHR1cmU7Ci0JCQkqdm9sdW1lVGV4dHVyZSA9IDA7Ci0KLQkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7Ci0JCX0KLQotCQkoKnZvbHVtZVRleHR1cmUpLT5BZGRSZWYoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpEZWxldGVQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaGFuZGxlID0gJWQiLCBoYW5kbGUpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpEcmF3SW5kZXhlZFByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHR5cGUsIGludCBiYXNlVmVydGV4SW5kZXgsIHVuc2lnbmVkIGludCBtaW5JbmRleCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzLCB1bnNpZ25lZCBpbnQgc3RhcnRJbmRleCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RQUklNSVRJVkVUWVBFIHR5cGUgPSAlZCwgaW50IGJhc2VWZXJ0ZXhJbmRleCA9ICVkLCB1bnNpZ25lZCBpbnQgbWluSW5kZXggPSAlZCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzID0gJWQsIHVuc2lnbmVkIGludCBzdGFydEluZGV4ID0gJWQsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCA9ICVkIiwgdHlwZSwgYmFzZVZlcnRleEluZGV4LCBtaW5JbmRleCwgbnVtVmVydGljZXMsIHN0YXJ0SW5kZXgsIHByaW1pdGl2ZUNvdW50KTsKLQotCQlpZighaW5kZXhEYXRhKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKCFiaW5kUmVzb3VyY2VzKGluZGV4RGF0YSkgfHwgIXByaW1pdGl2ZUNvdW50KQotCQl7Ci0JCQlyZXR1cm4gRDNEX09LOwotCQl9Ci0KLQkJdW5zaWduZWQgaW50IGluZGV4T2Zmc2V0ID0gc3RhcnRJbmRleCAqIChpbmRleERhdGEtPmlzMzJCaXQoKSA/IDQgOiAyKTsgICAvLyBGSVhNRTogRG9lc24ndCB0YWtlIHN0cmVhbSBmcmVxdWVuY2llcyBpbnRvIGFjY291bnQKLQotCQlzdzo6RHJhd1R5cGUgZHJhd1R5cGU7Ci0KLQkJaWYoaW5kZXhEYXRhLT5pczMyQml0KCkpCi0JCXsKLQkJCXN3aXRjaCh0eXBlKQotCQkJewotCQkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6ICAgICBkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURQT0lOVExJU1QzMjsgICAgIGJyZWFrOwotCQkJY2FzZSBEM0RQVF9MSU5FTElTVDogICAgICBkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURMSU5FTElTVDMyOyAgICAgIGJyZWFrOwotCQkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6ICAgICBkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURMSU5FU1RSSVAzMjsgICAgIGJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6ICBkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRUxJU1QzMjsgIGJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOiBkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMzI7IGJyZWFrOwotCQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjogICBkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRUZBTjMyOyAgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3dpdGNoKHR5cGUpCi0JCQl7Ci0JCQljYXNlIEQzRFBUX1BPSU5UTElTVDogICAgIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDE2OyAgICAgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX0xJTkVMSVNUOiAgICAgIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRExJTkVMSVNUMTY7ICAgICAgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX0xJTkVTVFJJUDogICAgIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRExJTkVTVFJJUDE2OyAgICAgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDogIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDE2OyAgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6IGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVAxNjsgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOiAgIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMTY7ICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZigoc3RyZWFtU291cmNlRnJlcVswXSAmIEQzRFNUUkVBTVNPVVJDRV9JTkRFWEVEREFUQSkgJiYgaW5zdGFuY2VEYXRhKCkpCi0JCXsKLQkJCWludCBpbnN0YW5jZUNvdW50ID0gKHN0cmVhbVNvdXJjZUZyZXFbMF0gJiB+RDNEU1RSRUFNU09VUkNFX0lOREVYRUREQVRBKTsKLQotCQkJZm9yKGludCBpbnN0YW5jZSA9IDA7IGluc3RhbmNlIDwgaW5zdGFuY2VDb3VudDsgaW5zdGFuY2UrKykKLQkJCXsKLQkJCQliaW5kVmVydGV4U3RyZWFtcyhiYXNlVmVydGV4SW5kZXgsIHRydWUsIGluc3RhbmNlKTsKLQkJCQlyZW5kZXJlci0+ZHJhdyhkcmF3VHlwZSwgaW5kZXhPZmZzZXQsIHByaW1pdGl2ZUNvdW50LCBpbnN0YW5jZSA9PSAwKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWJpbmRWZXJ0ZXhTdHJlYW1zKGJhc2VWZXJ0ZXhJbmRleCwgZmFsc2UsIDApOwotCQkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIGluZGV4T2Zmc2V0LCBwcmltaXRpdmVDb3VudCk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpEcmF3SW5kZXhlZFByaW1pdGl2ZVVQKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IG1pbkluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqaW5kZXhEYXRhLCBEM0RGT1JNQVQgaW5kZXhEYXRhRm9ybWF0LCBjb25zdCB2b2lkICp2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIkQzRFBSSU1JVElWRVRZUEUgdHlwZSA9ICVkLCB1bnNpZ25lZCBpbnQgbWluSW5kZXggPSAlZCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzID0gJWQsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCA9ICVkLCBjb25zdCB2b2lkICppbmRleERhdGEgPSAweCUwLjhwLCBEM0RGT1JNQVQgaW5kZXhEYXRhRm9ybWF0ID0gJWQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUgPSAlZCIsIHR5cGUsIG1pbkluZGV4LCBudW1WZXJ0aWNlcywgcHJpbWl0aXZlQ291bnQsIGluZGV4RGF0YSwgaW5kZXhEYXRhRm9ybWF0LCB2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7Ci0KLQkJaWYoIXZlcnRleFN0cmVhbVplcm9EYXRhIHx8ICFpbmRleERhdGEpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IChtaW5JbmRleCArIG51bVZlcnRpY2VzKSAqIHZlcnRleFN0cmVhbVplcm9TdHJpZGU7Ci0KLQkJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICp2ZXJ0ZXhCdWZmZXIgPSBuZXcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5KHRoaXMsIGxlbmd0aCwgMCwgMCwgRDNEUE9PTF9ERUZBVUxUKTsKLQotCQl2b2lkICpkYXRhOwotCQl2ZXJ0ZXhCdWZmZXItPkxvY2soMCwgMCwgJmRhdGEsIDApOwotCQltZW1jcHkoZGF0YSwgdmVydGV4U3RyZWFtWmVyb0RhdGEsIGxlbmd0aCk7Ci0JCXZlcnRleEJ1ZmZlci0+VW5sb2NrKCk7Ci0KLQkJU2V0U3RyZWFtU291cmNlKDAsIHZlcnRleEJ1ZmZlciwgMCwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7Ci0KLQkJc3dpdGNoKHR5cGUpCi0JCXsKLQkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudDsJCWJyZWFrOwotCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKiAyOwlicmVhazsKLQkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDE7CWJyZWFrOwotCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKiAzOwlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDI7CWJyZWFrOwotCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKyAyOwlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUFTU0VSVChmYWxzZSk7Ci0JCX0KLQotCQlsZW5ndGggKj0gaW5kZXhEYXRhRm9ybWF0ID09IEQzREZNVF9JTkRFWDMyID8gNCA6IDI7Ci0KLQkJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4QnVmZmVyID0gbmV3IERpcmVjdDNESW5kZXhCdWZmZXI5KHRoaXMsIGxlbmd0aCwgMCwgaW5kZXhEYXRhRm9ybWF0LCBEM0RQT09MX0RFRkFVTFQpOwotCi0JCWluZGV4QnVmZmVyLT5Mb2NrKDAsIDAsICZkYXRhLCAwKTsKLQkJbWVtY3B5KGRhdGEsIGluZGV4RGF0YSwgbGVuZ3RoKTsKLQkJaW5kZXhCdWZmZXItPlVubG9jaygpOwotCi0JCVNldEluZGljZXMoaW5kZXhCdWZmZXIpOwotCi0JCWlmKCFiaW5kUmVzb3VyY2VzKGluZGV4QnVmZmVyKSB8fCAhcHJpbWl0aXZlQ291bnQpCi0JCXsKLQkJCXZlcnRleEJ1ZmZlci0+UmVsZWFzZSgpOwotCi0JCQlyZXR1cm4gRDNEX09LOwotCQl9Ci0KLQkJc3c6OkRyYXdUeXBlIGRyYXdUeXBlOwotCi0JCWlmKGluZGV4RGF0YUZvcm1hdCA9PSBEM0RGTVRfSU5ERVgzMikKLQkJewotCQkJc3dpdGNoKHR5cGUpCi0JCQl7Ci0JCQljYXNlIEQzRFBUX1BPSU5UTElTVDogICAgIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDMyOyAgICAgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX0xJTkVMSVNUOiAgICAgIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRExJTkVMSVNUMzI7ICAgICAgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX0xJTkVTVFJJUDogICAgIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRExJTkVTVFJJUDMyOyAgICAgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDogIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDMyOyAgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6IGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVAzMjsgYnJlYWs7Ci0JCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOiAgIGRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMzI7ICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCWNhc2UgRDNEUFRfUE9JTlRMSVNUOiAgICAgZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEUE9JTlRMSVNUMTY7ICAgICBicmVhazsKLQkJCWNhc2UgRDNEUFRfTElORUxJU1Q6ICAgICAgZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVETElORUxJU1QxNjsgICAgICBicmVhazsKLQkJCWNhc2UgRDNEUFRfTElORVNUUklQOiAgICAgZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVETElORVNUUklQMTY7ICAgICBicmVhazsKLQkJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOiAgZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMTY7ICBicmVhazsKLQkJCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDogZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDE2OyBicmVhazsKLQkJCWNhc2UgRDNEUFRfVFJJQU5HTEVGQU46ICAgZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVGQU4xNjsgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQVNTRVJUKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWJpbmRWZXJ0ZXhTdHJlYW1zKDAsIGZhbHNlLCAwKTsKLQkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIDAsIHByaW1pdGl2ZUNvdW50KTsKLQotCQlTZXRTdHJlYW1Tb3VyY2UoMCwgMCwgMCwgMCk7Ci0JCVNldEluZGljZXMoMCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6RHJhd1ByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUgPSAlZCwgdW5zaWduZWQgaW50IHN0YXJ0VmVydGV4ID0gJWQsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCA9ICVkIiwgcHJpbWl0aXZlVHlwZSwgc3RhcnRWZXJ0ZXgsIHByaW1pdGl2ZUNvdW50KTsKLQotCQlpZighYmluZFJlc291cmNlcygwKSB8fCAhcHJpbWl0aXZlQ291bnQpCi0JCXsKLQkJCXJldHVybiBEM0RfT0s7Ci0JCX0KLQotCQlzdzo6RHJhd1R5cGUgZHJhd1R5cGU7Ci0KLQkJc3dpdGNoKHByaW1pdGl2ZVR5cGUpCi0JCXsKLQkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6ICAgICBkcmF3VHlwZSA9IHN3OjpEUkFXX1BPSU5UTElTVDsgICAgIGJyZWFrOwotCQljYXNlIEQzRFBUX0xJTkVMSVNUOiAgICAgIGRyYXdUeXBlID0gc3c6OkRSQVdfTElORUxJU1Q7ICAgICAgYnJlYWs7Ci0JCWNhc2UgRDNEUFRfTElORVNUUklQOiAgICAgZHJhd1R5cGUgPSBzdzo6RFJBV19MSU5FU1RSSVA7ICAgICBicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6ICBkcmF3VHlwZSA9IHN3OjpEUkFXX1RSSUFOR0xFTElTVDsgIGJyZWFrOwotCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6IGRyYXdUeXBlID0gc3c6OkRSQVdfVFJJQU5HTEVTVFJJUDsgYnJlYWs7Ci0JCWNhc2UgRDNEUFRfVFJJQU5HTEVGQU46ICAgZHJhd1R5cGUgPSBzdzo6RFJBV19UUklBTkdMRUZBTjsgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJCUFTU0VSVChmYWxzZSk7Ci0JCX0KLQotCQliaW5kVmVydGV4U3RyZWFtcyhzdGFydFZlcnRleCwgZmFsc2UsIDApOwotCQlyZW5kZXJlci0+ZHJhdyhkcmF3VHlwZSwgMCwgcHJpbWl0aXZlQ291bnQpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkRyYXdQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUgPSAlZCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50ID0gJWQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUgPSAlZCIsIHByaW1pdGl2ZVR5cGUsIHByaW1pdGl2ZUNvdW50LCB2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7Ci0KLQkJaWYoIXZlcnRleFN0cmVhbVplcm9EYXRhKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCUlEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKnZlcnRleEJ1ZmZlciA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCi0JCXN3aXRjaChwcmltaXRpdmVUeXBlKQotCQl7Ci0JCWNhc2UgRDNEUFRfUE9JTlRMSVNUOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQ7CQlicmVhazsKLQkJY2FzZSBEM0RQVF9MSU5FTElTVDoJCWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICogMjsJYnJlYWs7Ci0JCWNhc2UgRDNEUFRfTElORVNUUklQOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKyAxOwlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICogMzsJYnJlYWs7Ci0JCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKyAyOwlicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICsgMjsJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBU1NFUlQoZmFsc2UpOwotCQl9Ci0KLQkJbGVuZ3RoICo9IHZlcnRleFN0cmVhbVplcm9TdHJpZGU7Ci0KLQkJQ3JlYXRlVmVydGV4QnVmZmVyKGxlbmd0aCwgMCwgMCwgRDNEUE9PTF9ERUZBVUxULCAmdmVydGV4QnVmZmVyLCAwKTsKLQotCQl2b2lkICpkYXRhOwotCQl2ZXJ0ZXhCdWZmZXItPkxvY2soMCwgMCwgJmRhdGEsIDApOwotCQltZW1jcHkoZGF0YSwgdmVydGV4U3RyZWFtWmVyb0RhdGEsIGxlbmd0aCk7Ci0JCXZlcnRleEJ1ZmZlci0+VW5sb2NrKCk7Ci0KLQkJU2V0U3RyZWFtU291cmNlKDAsIHZlcnRleEJ1ZmZlciwgMCwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7Ci0KLQkJaWYoIWJpbmRSZXNvdXJjZXMoMCkgfHwgIXByaW1pdGl2ZUNvdW50KQotCQl7Ci0JCQl2ZXJ0ZXhCdWZmZXItPlJlbGVhc2UoKTsKLQotCQkJcmV0dXJuIEQzRF9PSzsKLQkJfQotCi0JCXN3OjpEcmF3VHlwZSBkcmF3VHlwZTsKLQotCQlzd2l0Y2gocHJpbWl0aXZlVHlwZSkKLQkJewotCQljYXNlIEQzRFBUX1BPSU5UTElTVDogICAgIGRyYXdUeXBlID0gc3c6OkRSQVdfUE9JTlRMSVNUOyAgICAgYnJlYWs7Ci0JCWNhc2UgRDNEUFRfTElORUxJU1Q6ICAgICAgZHJhd1R5cGUgPSBzdzo6RFJBV19MSU5FTElTVDsgICAgICBicmVhazsKLQkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6ICAgICBkcmF3VHlwZSA9IHN3OjpEUkFXX0xJTkVTVFJJUDsgICAgIGJyZWFrOwotCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDogIGRyYXdUeXBlID0gc3c6OkRSQVdfVFJJQU5HTEVMSVNUOyAgYnJlYWs7Ci0JCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDogZHJhd1R5cGUgPSBzdzo6RFJBV19UUklBTkdMRVNUUklQOyBicmVhazsKLQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjogICBkcmF3VHlwZSA9IHN3OjpEUkFXX1RSSUFOR0xFRkFOOyAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkJQVNTRVJUKGZhbHNlKTsKLQkJfQotCi0JCWJpbmRWZXJ0ZXhTdHJlYW1zKDAsIGZhbHNlLCAwKTsKLQkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIDAsIHByaW1pdGl2ZUNvdW50KTsKLQotCQlTZXRTdHJlYW1Tb3VyY2UoMCwgMCwgMCwgMCk7Ci0JCXZlcnRleEJ1ZmZlci0+UmVsZWFzZSgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkRyYXdSZWN0UGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFJFQ1RQQVRDSF9JTkZPICpyZWN0UGF0Y2hJbmZvKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaGFuZGxlID0gJWQsIGNvbnN0IGZsb2F0ICpudW1TZWdzID0gMHglMC44cCwgY29uc3QgRDNEUkVDVFBBVENIX0lORk8gKnJlY3RQYXRjaEluZm8gPSAweCUwLjhwIiwgaGFuZGxlLCBudW1TZWdzLCByZWN0UGF0Y2hJbmZvKTsKLQotCQlpZighbnVtU2VncyB8fCAhcmVjdFBhdGNoSW5mbykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6RHJhd1RyaVBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUsIGNvbnN0IGZsb2F0ICpudW1TZWdzLCBjb25zdCBEM0RUUklQQVRDSF9JTkZPICp0cmlQYXRjaEluZm8pCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCBoYW5kbGUgPSAlZCwgY29uc3QgZmxvYXQgKm51bVNlZ3MgPSAweCUwLjhwLCBjb25zdCBEM0RUUklQQVRDSF9JTkZPICp0cmlQYXRjaEluZm8gPSAweCUwLjhwIiwgaGFuZGxlLCBudW1TZWdzLCB0cmlQYXRjaEluZm8pOwotCi0JCWlmKCFudW1TZWdzIHx8ICF0cmlQYXRjaEluZm8pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkVuZFNjZW5lKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidm9pZCIpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkVuZFN0YXRlQmxvY2soSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqKnN0YXRlQmxvY2sgPSAweCUwLjhwIiwgc3RhdGVCbG9jayk7Ci0KLQkJaWYoIXN0YXRlQmxvY2spCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnN0YXRlQmxvY2sgPSAwOwotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpzdGF0ZUJsb2NrID0gc3RhdGVSZWNvcmRlcjsKLQkJc3RhdGVSZWNvcmRlci0+QWRkUmVmKCk7Ci0JCXN0YXRlUmVjb3JkZXItPnVuYmluZCgpOwotCQlzdGF0ZVJlY29yZGVyID0gMDsgICAvLyBTdG9wIHJlY29yZGluZwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkV2aWN0TWFuYWdlZFJlc291cmNlcygpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInZvaWQiKTsKLQotCQkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCXVuc2lnbmVkIGludCBEaXJlY3QzRERldmljZTk6OkdldEF2YWlsYWJsZVRleHR1cmVNZW0oKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ2b2lkIik7Ci0KLQkJaW50IGF2YWlsYWJsZU1lbW9yeSA9IHRleHR1cmVNZW1vcnkgLSBEaXJlY3QzRFJlc291cmNlOTo6Z2V0TWVtb3J5VXNhZ2UoKTsKLQkJaWYoYXZhaWxhYmxlTWVtb3J5IDwgMCkgYXZhaWxhYmxlTWVtb3J5ID0gMDsKLQotCQkvLyBSb3VuZCB0byBuZWFyZXN0IE1CCi0JCXJldHVybiAoYXZhaWxhYmxlTWVtb3J5ICsgMHg4MDAwMCkgJiAweEZGRjAwMDAwOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRCYWNrQnVmZmVyKHVuc2lnbmVkIGludCBzd2FwQ2hhaW5JbmRleCwgdW5zaWduZWQgaW50IGJhY2tCdWZmZXJJbmRleCwgRDNEQkFDS0JVRkZFUl9UWVBFIHR5cGUsIElEaXJlY3QzRFN1cmZhY2U5ICoqYmFja0J1ZmZlcikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHN3YXBDaGFpbkluZGV4ID0gJWQsIHVuc2lnbmVkIGludCBiYWNrQnVmZmVySW5kZXggPSAlZCwgRDNEQkFDS0JVRkZFUl9UWVBFIHR5cGUgPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKipiYWNrQnVmZmVyID0gMHglMC44cCIsIHN3YXBDaGFpbkluZGV4LCBiYWNrQnVmZmVySW5kZXgsIHR5cGUsIGJhY2tCdWZmZXIpOwotCi0JCWlmKHN3YXBDaGFpbkluZGV4ID49IEdldE51bWJlck9mU3dhcENoYWlucygpKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXJldHVybiBzd2FwQ2hhaW4tPkdldEJhY2tCdWZmZXIoYmFja0J1ZmZlckluZGV4LCB0eXBlLCBiYWNrQnVmZmVyKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGZsb2F0ICpwbGFuZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBmbG9hdCAqcGxhbmUgPSAweCUwLjhwIiwgaW5kZXgsIHBsYW5lKTsKLQotCQlpZighcGxhbmUgfHwgaW5kZXggPj0gNikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlwbGFuZVswXSA9IHRoaXMtPnBsYW5lW2luZGV4XVswXTsKLQkJcGxhbmVbMV0gPSB0aGlzLT5wbGFuZVtpbmRleF1bMV07Ci0JCXBsYW5lWzJdID0gdGhpcy0+cGxhbmVbaW5kZXhdWzJdOwotCQlwbGFuZVszXSA9IHRoaXMtPnBsYW5lW2luZGV4XVszXTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRDbGlwU3RhdHVzKEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cyA9IDB4JTAuOHAiLCBjbGlwU3RhdHVzKTsKLQotCQlpZighY2xpcFN0YXR1cykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqY2xpcFN0YXR1cyA9IHRoaXMtPmNsaXBTdGF0dXM7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0Q3JlYXRpb25QYXJhbWV0ZXJzKEQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RERVZJQ0VfQ1JFQVRJT05fUEFSQU1FVEVSUyAqcGFyYW1ldGVycyA9IDB4JTAuOHAiLCBwYXJhbWV0ZXJzKTsKLQotCQlpZighcGFyYW1ldGVycykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlwYXJhbWV0ZXJzLT5BZGFwdGVyT3JkaW5hbCA9IGFkYXB0ZXI7Ci0JCXBhcmFtZXRlcnMtPkJlaGF2aW9yRmxhZ3MgPSBiZWhhdmlvdXJGbGFnczsKLQkJcGFyYW1ldGVycy0+RGV2aWNlVHlwZSA9IGRldmljZVR5cGU7Ci0JCXBhcmFtZXRlcnMtPmhGb2N1c1dpbmRvdyA9IGZvY3VzV2luZG93OwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgKnBhbGV0dGVOdW1iZXIpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlciA9IDB4JTAuOHAiLCBwYWxldHRlTnVtYmVyKTsKLQotCQlpZighcGFsZXR0ZU51bWJlcikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqcGFsZXR0ZU51bWJlciA9IGN1cnJlbnRQYWxldHRlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKipkZXB0aFN0ZW5jaWxTdXJmYWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJJRGlyZWN0M0RTdXJmYWNlOSAqKmRlcHRoU3RlbmNpbFN1cmZhY2UgPSAweCUwLjhwIiwgZGVwdGhTdGVuY2lsU3VyZmFjZSk7Ci0KLQkJaWYoIWRlcHRoU3RlbmNpbFN1cmZhY2UpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmRlcHRoU3RlbmNpbFN1cmZhY2UgPSBkZXB0aFN0ZW5jaWw7Ci0KLQkJaWYoZGVwdGhTdGVuY2lsKQotCQl7Ci0JCQlkZXB0aFN0ZW5jaWwtPkFkZFJlZigpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dXJuIE5PVEZPVU5EKCk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXREZXZpY2VDYXBzKEQzRENBUFM5ICpjYXBzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RDQVBTOSAqY2FwcyA9IDB4JTAuOHAiLCBjYXBzKTsKLQotCQlyZXR1cm4gZDNkOS0+R2V0RGV2aWNlQ2FwcyhEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMLCBjYXBzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0RGlyZWN0M0QoSURpcmVjdDNEOSAqKmQzZDkpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzRDkgKipkM2Q5ID0gMHglMC44cCIsIGQzZDkpOwotCi0JCWlmKCFkM2Q5KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpkM2Q5ID0gdGhpcy0+ZDNkOTsKLQkJdGhpcy0+ZDNkOS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0RGlzcGxheU1vZGUodW5zaWduZWQgaW50IGluZGV4LCBEM0RESVNQTEFZTU9ERSAqbW9kZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IGluZGV4ID0gJWQsIEQzRERJU1BMQVlNT0RFICptb2RlID0gMHglMC44cCIsIGluZGV4LCBtb2RlKTsKLQotCQlpZihpbmRleCA+PSBHZXROdW1iZXJPZlN3YXBDaGFpbnMoKSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3dhcENoYWluLT5HZXREaXNwbGF5TW9kZShtb2RlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0RnJvbnRCdWZmZXJEYXRhKHVuc2lnbmVkIGludCBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlID0gJXAiLCBpbmRleCwgZGVzdFN1cmZhY2UpOwotCi0JCWlmKGluZGV4ID49IEdldE51bWJlck9mU3dhcENoYWlucygpKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXJldHVybiBzd2FwQ2hhaW4tPkdldEZyb250QnVmZmVyRGF0YShkZXN0U3VyZmFjZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldEZWRih1bnNpZ25lZCBsb25nICpGVkYpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgKkZWRiA9IDB4JTAuOHAiLCBGVkYpOwotCi0JCWlmKCFGVkYpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYodmVydGV4RGVjbGFyYXRpb24pCi0JCXsKLQkJCSpGVkYgPSB2ZXJ0ZXhEZWNsYXJhdGlvbi0+Z2V0RlZGKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkqRlZGID0gMDsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRERldmljZTk6OkdldEdhbW1hUmFtcCh1bnNpZ25lZCBpbnQgaW5kZXgsIEQzREdBTU1BUkFNUCAqcmFtcCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IGluZGV4ID0gJWQsIEQzREdBTU1BUkFNUCAqcmFtcCA9IDB4JTAuOHAiLCBpbmRleCwgcmFtcCk7Ci0KLQkJaWYoIXJhbXAgfHwgaW5kZXggPj0gR2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCkpCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN3YXBDaGFpbi0+Z2V0R2FtbWFSYW1wKChzdzo6R2FtbWFSYW1wKilyYW1wKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0SW5kaWNlcyhJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKippbmRleERhdGEpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzREluZGV4QnVmZmVyOSAqKmluZGV4RGF0YSA9IDB4JTAuOHAiLCBpbmRleERhdGEpOwotCi0JCWlmKCFpbmRleERhdGEpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmluZGV4RGF0YSA9IHRoaXMtPmluZGV4RGF0YTsKLQotCQlpZih0aGlzLT5pbmRleERhdGEpCi0JCXsKLQkJCXRoaXMtPmluZGV4RGF0YS0+QWRkUmVmKCk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBEM0RMSUdIVDkgKmxpZ2h0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIEQzRExJR0hUOSAqbGlnaHQgPSAweCUwLjhwIiwgaW5kZXgsIGxpZ2h0KTsKLQotCQlpZighbGlnaHQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXRoaXMtPmxpZ2h0LmV4aXN0cyhpbmRleCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmxpZ2h0ID0gdGhpcy0+bGlnaHRbaW5kZXhdOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldExpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCAqZW5hYmxlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGludCAqZW5hYmxlID0gMHglMC44cCIsIGluZGV4LCBlbmFibGUpOwotCi0JCWlmKCFlbmFibGUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIWxpZ2h0LmV4aXN0cyhpbmRleCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmVuYWJsZSA9IGxpZ2h0W2luZGV4XS5lbmFibGUgPyAxMjggOiAwOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldE1hdGVyaWFsKEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIkQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwgPSAweCUwLjhwIiwgbWF0ZXJpYWwpOwotCi0JCWlmKCFtYXRlcmlhbCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqbWF0ZXJpYWwgPSB0aGlzLT5tYXRlcmlhbDsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWZsb2F0IERpcmVjdDNERGV2aWNlOTo6R2V0TlBhdGNoTW9kZSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gMC4wZjsgICAvLyBGSVhNRTogVW5pbXBsZW1lbnRlZAotCX0KLQotCXVuc2lnbmVkIGludCBEaXJlY3QzRERldmljZTk6OkdldE51bWJlck9mU3dhcENoYWlucygpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gMTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0UGFsZXR0ZUVudHJpZXModW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIsIFBBTEVUVEVFTlRSWSAqZW50cmllcykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIgPSAlZCwgUEFMRVRURUVOVFJZICplbnRyaWVzID0gMHglMC44cCIsIHBhbGV0dGVOdW1iZXIsIGVudHJpZXMpOwotCi0JCWlmKHBhbGV0dGVOdW1iZXIgPiAweEZGRkYgfHwgIWVudHJpZXMpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQotCQl7Ci0JCQllbnRyaWVzW2ldID0gcGFsZXR0ZVtwYWxldHRlTnVtYmVyXS5lbnRyeVtpXTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFBpeGVsU2hhZGVyKElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlcikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICoqc2hhZGVyID0gMHglMC44cCIsIHNoYWRlcik7Ci0KLQkJaWYoIXNoYWRlcikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZihwaXhlbFNoYWRlcikKLQkJewotCQkJcGl4ZWxTaGFkZXItPkFkZFJlZigpOwotCQl9Ci0KLQkJKnNoYWRlciA9IHBpeGVsU2hhZGVyOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnRCKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJaWYoIWNvbnN0YW50RGF0YSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJewotCQkJY29uc3RhbnREYXRhW2ldID0gcGl4ZWxTaGFkZXJDb25zdGFudEJbc3RhcnRSZWdpc3RlciArIGldOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0UGl4ZWxTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCi0JCWlmKCFjb25zdGFudERhdGEpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCXsKLQkJCWNvbnN0YW50RGF0YVtpICogNCArIDBdID0gcGl4ZWxTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzBdOwotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMV0gPSBwaXhlbFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bMV07Ci0JCQljb25zdGFudERhdGFbaSAqIDQgKyAyXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXTsKLQkJCWNvbnN0YW50RGF0YVtpICogNCArIDNdID0gcGl4ZWxTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzNdOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0UGl4ZWxTaGFkZXJDb25zdGFudEkodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQotCQlpZighY29uc3RhbnREYXRhKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQl7Ci0JCQljb25zdGFudERhdGFbaSAqIDQgKyAwXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXTsKLQkJCWNvbnN0YW50RGF0YVtpICogNCArIDFdID0gcGl4ZWxTaGFkZXJDb25zdGFudElbc3RhcnRSZWdpc3RlciArIGldWzFdOwotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMl0gPSBwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bMl07Ci0JCQljb25zdGFudERhdGFbaSAqIDQgKyAzXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFJhc3RlclN0YXR1cyh1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRFJBU1RFUl9TVEFUVVMgKnJhc3RlclN0YXR1cykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHN3YXBDaGFpbiA9ICVkLCBEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMgPSAweCUwLjhwIiwgaW5kZXgsIHJhc3RlclN0YXR1cyk7Ci0KLQkJaWYoaW5kZXggPj0gR2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcmV0dXJuIHN3YXBDaGFpbi0+R2V0UmFzdGVyU3RhdHVzKHJhc3RlclN0YXR1cyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIkQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSA9ICVkLCB1bnNpZ25lZCBsb25nICp2YWx1ZSA9IDB4JTAuOHAiLCBzdGF0ZSwgdmFsdWUpOwotCi0JCWlmKCF2YWx1ZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqdmFsdWUgPSByZW5kZXJTdGF0ZVtzdGF0ZV07Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0UmVuZGVyVGFyZ2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIElEaXJlY3QzRFN1cmZhY2U5ICoqcmVuZGVyVGFyZ2V0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqcmVuZGVyVGFyZ2V0ID0gMHglMC44cCIsIGluZGV4LCByZW5kZXJUYXJnZXQpOwotCi0JCWlmKGluZGV4ID49IDQgfHwgIXJlbmRlclRhcmdldCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqcmVuZGVyVGFyZ2V0ID0gMDsKLQotCQlpZighdGhpcy0+cmVuZGVyVGFyZ2V0W2luZGV4XSkKLQkJewotCQkJcmV0dXJuIE5PVEZPVU5EKCk7Ci0JCX0KLQotCQkqcmVuZGVyVGFyZ2V0ID0gdGhpcy0+cmVuZGVyVGFyZ2V0W2luZGV4XTsKLQkJdGhpcy0+cmVuZGVyVGFyZ2V0W2luZGV4XS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0UmVuZGVyVGFyZ2V0RGF0YShJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzRFN1cmZhY2U5ICpyZW5kZXJUYXJnZXQgPSAweCUwLjhwLCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UgPSAweCUwLjhwIiwgcmVuZGVyVGFyZ2V0LCBkZXN0U3VyZmFjZSk7Ci0KLQkJaWYoIXJlbmRlclRhcmdldCB8fCAhZGVzdFN1cmZhY2UpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRDNEU1VSRkFDRV9ERVNDIHNvdXJjZURlc2NyaXB0aW9uOwotCQlEM0RTVVJGQUNFX0RFU0MgZGVzdGluYXRpb25EZXNjcmlwdGlvbjsKLQotCQlyZW5kZXJUYXJnZXQtPkdldERlc2MoJnNvdXJjZURlc2NyaXB0aW9uKTsKLQkJZGVzdFN1cmZhY2UtPkdldERlc2MoJmRlc3RpbmF0aW9uRGVzY3JpcHRpb24pOwotCi0JCWlmKHNvdXJjZURlc2NyaXB0aW9uLldpZHRoICAhPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLldpZHRoIHx8Ci0JCSAgIHNvdXJjZURlc2NyaXB0aW9uLkhlaWdodCAhPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLkhlaWdodCB8fAotCQkgICBzb3VyY2VEZXNjcmlwdGlvbi5Gb3JtYXQgIT0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5Gb3JtYXQgfHwKLQkJICAgc291cmNlRGVzY3JpcHRpb24uTXVsdGlTYW1wbGVUeXBlICE9IEQzRE1VTFRJU0FNUExFX05PTkUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ID09IEQzREZNVF9BOFI4RzhCOCB8fAotCQkgICBzb3VyY2VEZXNjcmlwdGlvbi5Gb3JtYXQgPT0gRDNERk1UX1g4UjhHOEI4KQotCQl7Ci0JCQlzdzo6U3VyZmFjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KHJlbmRlclRhcmdldCk7Ci0JCQlzdzo6U3VyZmFjZSAqZGVzdCA9IHN0YXRpY19jYXN0PERpcmVjdDNEU3VyZmFjZTkqPihkZXN0U3VyZmFjZSk7Ci0KLQkJCXZvaWQgKnNvdXJjZUJ1ZmZlciA9IHNvdXJjZS0+bG9ja0V4dGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1JFQURPTkxZLCBzdzo6UFVCTElDKTsKLQkJCXZvaWQgKmRlc3RCdWZmZXIgPSBkZXN0LT5sb2NrRXh0ZXJuYWwoMCwgMCwgMCwgc3c6OkxPQ0tfV1JJVEVPTkxZLCBzdzo6UFVCTElDKTsKLQotCQkJc3RhdGljIHZvaWQgKF9fY2RlY2wgKmJsaXRGdW5jdGlvbikodm9pZCAqZHN0LCB2b2lkICpzcmMpOwotCQkJc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxzdzo6Um91dGluZT4gYmxpdFJvdXRpbmU7Ci0JCQlzdGF0aWMgc3c6OkJsaXRTdGF0ZSBibGl0U3RhdGUgPSB7fTsKLQotCQkJc3c6OkJsaXRTdGF0ZSB1cGRhdGU7Ci0JCQl1cGRhdGUud2lkdGggPSBzb3VyY2VEZXNjcmlwdGlvbi5XaWR0aDsKLQkJCXVwZGF0ZS5oZWlnaHQgPSBzb3VyY2VEZXNjcmlwdGlvbi5IZWlnaHQ7Ci0JCQl1cGRhdGUuc291cmNlRm9ybWF0ID0gc3c6OkZPUk1BVF9BOFI4RzhCODsKLQkJCXVwZGF0ZS5zb3VyY2VTdHJpZGUgPSBzb3VyY2UtPmdldEV4dGVybmFsUGl0Y2hCKCk7Ci0JCQl1cGRhdGUuZGVzdEZvcm1hdCA9IHN3OjpGT1JNQVRfQThSOEc4Qjg7Ci0JCQl1cGRhdGUuZGVzdFN0cmlkZSA9IGRlc3QtPmdldEV4dGVybmFsUGl0Y2hCKCk7Ci0JCQl1cGRhdGUuY3Vyc29ySGVpZ2h0ID0gMDsKLQkJCXVwZGF0ZS5jdXJzb3JXaWR0aCA9IDA7Ci0KLQkJCWlmKG1lbWNtcCgmYmxpdFN0YXRlLCAmdXBkYXRlLCBzaXplb2Yoc3c6OkJsaXRTdGF0ZSkpICE9IDApCi0JCQl7Ci0JCQkJYmxpdFN0YXRlID0gdXBkYXRlOwotCQkJCWJsaXRSb3V0aW5lID0gc3c6OkZyYW1lQnVmZmVyOjpjb3B5Um91dGluZShibGl0U3RhdGUpOwotCQkJCWJsaXRGdW5jdGlvbiA9ICh2b2lkKF9fY2RlY2wqKSh2b2lkKiwgdm9pZCopKWJsaXRSb3V0aW5lLT5nZXRFbnRyeSgpOwotCQkJfQotCi0JCQlibGl0RnVuY3Rpb24oZGVzdEJ1ZmZlciwgc291cmNlQnVmZmVyKTsKLQotCQkJZGVzdC0+dW5sb2NrRXh0ZXJuYWwoKTsKLQkJCXNvdXJjZS0+dW5sb2NrRXh0ZXJuYWwoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiBVcGRhdGVTdXJmYWNlKHJlbmRlclRhcmdldCwgMCwgZGVzdFN1cmZhY2UsIDApOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0U2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgc2FtcGxlciwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc2FtcGxlciA9ICVkLCBEM0RTQU1QTEVSU1RBVEVUWVBFIHR5cGUgPSAlZCwgdW5zaWduZWQgbG9uZyAqdmFsdWUgPSAweCUwLjhwIiwgc2FtcGxlciwgc3RhdGUsIHZhbHVlKTsKLQotCQlpZighdmFsdWUgfHwgc3RhdGUgPCBEM0RTQU1QX0FERFJFU1NVIHx8IHN0YXRlID4gRDNEU0FNUF9ETUFQT0ZGU0VUKSAgIC8vIEZJWE1FOiBTZXQgKnZhbHVlIHRvIDA/Ci0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoKHNhbXBsZXIgPj0gMTYgJiYgc2FtcGxlciA8PSBEM0RETUFQU0FNUExFUikgfHwgc2FtcGxlciA+IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZihzYW1wbGVyID49IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCkKLQkJewotCQkJc2FtcGxlciA9IDE2ICsgKHNhbXBsZXIgLSBEM0RWRVJURVhURVhUVVJFU0FNUExFUjApOwotCQl9Ci0KLQkJKnZhbHVlID0gc2FtcGxlclN0YXRlW3NhbXBsZXJdW3N0YXRlXTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRTY2lzc29yUmVjdChSRUNUICpyZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJSRUNUICpyZWN0ID0gMHglMC44cCIsIHJlY3QpOwotCi0JCWlmKCFyZWN0KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpyZWN0ID0gc2Npc3NvclJlY3Q7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlpbnQgRGlyZWN0M0REZXZpY2U5OjpHZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ2b2lkIik7Ci0KLQkJcmV0dXJuIHNvZnR3YXJlVmVydGV4UHJvY2Vzc2luZyA/IFRSVUUgOiBGQUxTRTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKipzdHJlYW1EYXRhLCB1bnNpZ25lZCBpbnQgKm9mZnNldCwgdW5zaWduZWQgaW50ICpzdHJpZGUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIgPSAlZCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqKnN0cmVhbURhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgKm9mZnNldCA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCAqc3RyaWRlID0gMHglMC44cCIsIHN0cmVhbU51bWJlciwgc3RyZWFtRGF0YSwgb2Zmc2V0LCBzdHJpZGUpOwotCi0JCWlmKHN0cmVhbU51bWJlciA+PSAxNiB8fCAhc3RyZWFtRGF0YSB8fCAhb2Zmc2V0IHx8ICFzdHJpZGUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnN0cmVhbURhdGEgPSBkYXRhU3RyZWFtW3N0cmVhbU51bWJlcl07Ci0KLQkJaWYoZGF0YVN0cmVhbVtzdHJlYW1OdW1iZXJdKQotCQl7Ci0JCQlkYXRhU3RyZWFtW3N0cmVhbU51bWJlcl0tPkFkZFJlZigpOwotCQl9Ci0KLQkJKm9mZnNldCA9IHN0cmVhbU9mZnNldFtzdHJlYW1OdW1iZXJdOwotCQkqc3RyaWRlID0gc3RyZWFtU3RyaWRlW3N0cmVhbU51bWJlcl07Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0U3RyZWFtU291cmNlRnJlcSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCB1bnNpZ25lZCBpbnQgKmRpdmlkZXIpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIgPSAlZCwgdW5zaWduZWQgaW50ICpkaXZpZGVyID0gMHglMC44cCIsIHN0cmVhbU51bWJlciwgZGl2aWRlcik7Ci0KLQkJaWYoc3RyZWFtTnVtYmVyID49IDE2IHx8ICFkaXZpZGVyKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpkaXZpZGVyID0gc3RyZWFtU291cmNlRnJlcVtzdHJlYW1OdW1iZXJdOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFN3YXBDaGFpbih1bnNpZ25lZCBpbnQgaW5kZXgsIElEaXJlY3QzRFN3YXBDaGFpbjkgKipzd2FwQ2hhaW4pCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCBpbmRleCA9ICVkLCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluID0gMHglMC44cCIsIGluZGV4LCBzd2FwQ2hhaW4pOwotCi0JCWlmKCFzd2FwQ2hhaW4gfHwgaW5kZXggPj0gR2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnN3YXBDaGFpbiA9IHRoaXMtPnN3YXBDaGFpbjsKLQotCQlpZigqc3dhcENoYWluKQotCQl7Ci0JCQkoKnN3YXBDaGFpbiktPkFkZFJlZigpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKnRleHR1cmUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc2FtcGxlciA9ICVkLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKip0ZXh0dXJlID0gMHglMC44cCIsIHNhbXBsZXIsIHRleHR1cmUpOwotCi0JCWlmKCF0ZXh0dXJlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp0ZXh0dXJlID0gMDsKLQotCQlpZigoc2FtcGxlciA+PSAxNiAmJiBzYW1wbGVyIDw9IEQzRERNQVBTQU1QTEVSKSB8fCBzYW1wbGVyID4gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp0ZXh0dXJlID0gdGhpcy0+dGV4dHVyZVtzYW1wbGVyXTsKLQotCQlpZih0aGlzLT50ZXh0dXJlW3NhbXBsZXJdKQotCQl7Ci0JCQl0aGlzLT50ZXh0dXJlW3NhbXBsZXJdLT5BZGRSZWYoKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBzdGFnZSA9ICVkLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSA9ICVkLCB1bnNpZ25lZCBsb25nICp2YWx1ZSA9IDB4JTAuOHAiLCBzdGFnZSwgdHlwZSwgdmFsdWUpOwotCi0JCWlmKCF2YWx1ZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqdmFsdWUgPSB0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bdHlwZV07Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgRDNETUFUUklYICptYXRyaXgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIkQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSA9ICVkLCBEM0RNQVRSSVggKm1hdHJpeCA9IDB4JTAuOHAiLCBzdGF0ZSwgbWF0cml4KTsKLQotCQlpZighbWF0cml4IHx8IHN0YXRlIDwgMCB8fCBzdGF0ZSA+IDUxMSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqbWF0cml4ID0gdGhpcy0+bWF0cml4W3N0YXRlXTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpHZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICoqZGVjbGFyYXRpb24gPSAweCUwLjhwIiwgZGVjbGFyYXRpb24pOwotCi0JCWlmKCFkZWNsYXJhdGlvbikKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqZGVjbGFyYXRpb24gPSB2ZXJ0ZXhEZWNsYXJhdGlvbjsKLQotCQlpZih2ZXJ0ZXhEZWNsYXJhdGlvbikKLQkJewotCQkJdmVydGV4RGVjbGFyYXRpb24tPkFkZFJlZigpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIgPSAweCUwLjhwIiwgc2hhZGVyKTsKLQotCQlpZighc2hhZGVyKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpzaGFkZXIgPSB2ZXJ0ZXhTaGFkZXI7Ci0KLQkJaWYodmVydGV4U2hhZGVyKQotCQl7Ci0JCQl2ZXJ0ZXhTaGFkZXItPkFkZFJlZigpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJaWYoIWNvbnN0YW50RGF0YSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJewotCQkJY29uc3RhbnREYXRhW2ldID0gdmVydGV4U2hhZGVyQ29uc3RhbnRCW3N0YXJ0UmVnaXN0ZXIgKyBpXTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkdldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJaWYoIWNvbnN0YW50RGF0YSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJewotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMF0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzBdOwotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMV0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzFdOwotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMl0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzJdOwotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgM10gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzNdOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJaWYoIWNvbnN0YW50RGF0YSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJewotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMF0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbc3RhcnRSZWdpc3RlciArIGldWzBdOwotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMV0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbc3RhcnRSZWdpc3RlciArIGldWzFdOwotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgMl0gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbc3RhcnRSZWdpc3RlciArIGldWzJdOwotCQkJY29uc3RhbnREYXRhW2kgKiA0ICsgM10gPSB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbc3RhcnRSZWdpc3RlciArIGldWzNdOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6R2V0Vmlld3BvcnQoRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCA9IDB4JTAuOHAiLCB2aWV3cG9ydCk7Ci0KLQkJaWYoIXZpZXdwb3J0KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSp2aWV3cG9ydCA9IHRoaXMtPnZpZXdwb3J0OwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OkxpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCBlbmFibGUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgaW50IGVuYWJsZSA9ICVkIiwgaW5kZXgsIGVuYWJsZSk7Ci0KLQkJaWYoIWxpZ2h0LmV4aXN0cyhpbmRleCkpICAgLy8gSW5zZXJ0IGRlZmF1bHQgbGlnaHQKLQkJewotCQkJRDNETElHSFQ5IGxpZ2h0OwotCi0JCQlsaWdodC5UeXBlID0gRDNETElHSFRfRElSRUNUSU9OQUw7Ci0JCQlsaWdodC5EaWZmdXNlLnIgPSAxOwotCQkJbGlnaHQuRGlmZnVzZS5nID0gMTsKLQkJCWxpZ2h0LkRpZmZ1c2UuYiA9IDE7Ci0JCQlsaWdodC5EaWZmdXNlLmEgPSAwOwotCQkJbGlnaHQuU3BlY3VsYXIuciA9IDA7Ci0JCQlsaWdodC5TcGVjdWxhci5nID0gMDsKLQkJCWxpZ2h0LlNwZWN1bGFyLmIgPSAwOwotCQkJbGlnaHQuU3BlY3VsYXIuYSA9IDA7Ci0JCQlsaWdodC5BbWJpZW50LnIgPSAwOwotCQkJbGlnaHQuQW1iaWVudC5nID0gMDsKLQkJCWxpZ2h0LkFtYmllbnQuYiA9IDA7Ci0JCQlsaWdodC5BbWJpZW50LmEgPSAwOwotCQkJbGlnaHQuUG9zaXRpb24ueCA9IDA7Ci0JCQlsaWdodC5Qb3NpdGlvbi55ID0gMDsKLQkJCWxpZ2h0LlBvc2l0aW9uLnogPSAwOwotCQkJbGlnaHQuRGlyZWN0aW9uLnggPSAwOwotCQkJbGlnaHQuRGlyZWN0aW9uLnkgPSAwOwotCQkJbGlnaHQuRGlyZWN0aW9uLnogPSAxOwotCQkJbGlnaHQuUmFuZ2UgPSAwOwotCQkJbGlnaHQuRmFsbG9mZiA9IDA7Ci0JCQlsaWdodC5BdHRlbnVhdGlvbjAgPSAwOwotCQkJbGlnaHQuQXR0ZW51YXRpb24xID0gMDsKLQkJCWxpZ2h0LkF0dGVudWF0aW9uMiA9IDA7Ci0JCQlsaWdodC5UaGV0YSA9IDA7Ci0JCQlsaWdodC5QaGkgPSAwOwotCi0JCQl0aGlzLT5saWdodFtpbmRleF0gPSBsaWdodDsKLQkJCXRoaXMtPmxpZ2h0W2luZGV4XS5lbmFibGUgPSBmYWxzZTsKLQkJfQotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlsaWdodFtpbmRleF0uZW5hYmxlID0gKGVuYWJsZSAhPSBGQUxTRSk7Ci0KLQkJCWxpZ2h0c0RpcnR5ID0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPmxpZ2h0RW5hYmxlKGluZGV4LCBlbmFibGUpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6TXVsdGlwbHlUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlID0gJWQsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4ID0gMHglMC44cCIsIHN0YXRlLCBtYXRyaXgpOwotCi0JCWlmKCFtYXRyaXgpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRDNETUFUUklYICpjdXJyZW50ID0gJnRoaXMtPm1hdHJpeFtzdGF0ZV07Ci0KLQkJc3c6Ok1hdHJpeCBDKGN1cnJlbnQtPl8xMSwgY3VycmVudC0+XzIxLCBjdXJyZW50LT5fMzEsIGN1cnJlbnQtPl80MSwKLQkJICAgICAgICAgICAgIGN1cnJlbnQtPl8xMiwgY3VycmVudC0+XzIyLCBjdXJyZW50LT5fMzIsIGN1cnJlbnQtPl80MiwKLQkJICAgICAgICAgICAgIGN1cnJlbnQtPl8xMywgY3VycmVudC0+XzIzLCBjdXJyZW50LT5fMzMsIGN1cnJlbnQtPl80MywKLQkJICAgICAgICAgICAgIGN1cnJlbnQtPl8xNCwgY3VycmVudC0+XzI0LCBjdXJyZW50LT5fMzQsIGN1cnJlbnQtPl80NCk7Ci0KLQkJc3c6Ok1hdHJpeCBNKG1hdHJpeC0+XzExLCBtYXRyaXgtPl8yMSwgbWF0cml4LT5fMzEsIG1hdHJpeC0+XzQxLAotCQkgICAgICAgICAgICAgbWF0cml4LT5fMTIsIG1hdHJpeC0+XzIyLCBtYXRyaXgtPl8zMiwgbWF0cml4LT5fNDIsCi0JCSAgICAgICAgICAgICBtYXRyaXgtPl8xMywgbWF0cml4LT5fMjMsIG1hdHJpeC0+XzMzLCBtYXRyaXgtPl80MywKLQkJICAgICAgICAgICAgIG1hdHJpeC0+XzE0LCBtYXRyaXgtPl8yNCwgbWF0cml4LT5fMzQsIG1hdHJpeC0+XzQ0KTsKLQotCQlzd2l0Y2goc3RhdGUpCi0JCXsKLQkJY2FzZSBEM0RUU19XT1JMRDoKLQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChDICogTSk7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RUU19WSUVXOgotCQkJcmVuZGVyZXItPnNldFZpZXdNYXRyaXgoQyAqIE0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEVFNfUFJPSkVDVElPTjoKLQkJCXJlbmRlcmVyLT5zZXRQcm9qZWN0aW9uTWF0cml4KEMgKiBNKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFRTX1RFWFRVUkUwOgotCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMCwgQyAqIE0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEVFNfVEVYVFVSRTE6Ci0JCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgxLCBDICogTSk7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RUU19URVhUVVJFMjoKLQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDIsIEMgKiBNKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFRTX1RFWFRVUkUzOgotCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMywgQyAqIE0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEVFNfVEVYVFVSRTQ6Ci0JCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg0LCBDICogTSk7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RUU19URVhUVVJFNToKLQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDUsIEMgKiBNKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFRTX1RFWFRVUkU2OgotCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNiwgQyAqIE0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEVFNfVEVYVFVSRTc6Ci0JCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg3LCBDICogTSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmKHN0YXRlID4gMjU2ICYmIHN0YXRlIDwgNTEyKQotCQkJewotCQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChDICogTSwgc3RhdGUgLSAyNTYpOwotCQkJfQotCQkJZWxzZSBBU1NFUlQoZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6UHJlc2VudChjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgSFdORCBkZXN0V2luZG93T3ZlcnJpZGUsIGNvbnN0IFJHTkRBVEEgKmRpcnR5UmVnaW9uKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgY29uc3QgUkVDVCAqZGVzdFJlY3QgPSAweCUwLjhwLCBIV05EIGRlc3RXaW5kb3dPdmVycmlkZSA9ICVkLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbiA9IDB4JTAuOHAiLCBzb3VyY2VSZWN0LCBkZXN0UmVjdCwgZGVzdFdpbmRvd092ZXJyaWRlLCBkaXJ0eVJlZ2lvbik7Ci0KLQkJcmV0dXJuIHN3YXBDaGFpbi0+UHJlc2VudChzb3VyY2VSZWN0LCBkZXN0UmVjdCwgZGVzdFdpbmRvd092ZXJyaWRlLCBkaXJ0eVJlZ2lvbiwgMCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlByb2Nlc3NWZXJ0aWNlcyh1bnNpZ25lZCBpbnQgc3JjU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IGRlc3RJbmRleCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkZXN0QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3JjU3RhcnRJbmRleCA9ICVkLCB1bnNpZ25lZCBpbnQgZGVzdEluZGV4ID0gJWQsIHVuc2lnbmVkIGludCB2ZXJ0ZXhDb3VudCA9ICVkLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkZXN0QnVmZmVyID0gMHglMC44cCwgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICp2ZXJ0ZXhEZWNsYXJhdGlvbiA9IDB4JTAuOHAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAlZCIsIHNyY1N0YXJ0SW5kZXgsIGRlc3RJbmRleCwgdmVydGV4Q291bnQsIGRlc3RCdWZmZXIsIHZlcnRleERlY2xhcmF0aW9uLCBmbGFncyk7Ci0KLQkJaWYoIWRlc3RCdWZmZXIpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlJlc2V0KEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIkQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwIiwgcHJlc2VudFBhcmFtZXRlcnMpOwotCi0JCWlmKCFwcmVzZW50UGFyYW1ldGVycykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlkZXZpY2VXaW5kb3cgPSBwcmVzZW50UGFyYW1ldGVycy0+aERldmljZVdpbmRvdzsKLQotCQlpZihkZXB0aFN0ZW5jaWwpCi0JCXsKLQkJCWRlcHRoU3RlbmNpbC0+dW5iaW5kKCk7Ci0JCQlkZXB0aFN0ZW5jaWwgPSAwOwotCQl9Ci0KLQkJaWYoYXV0b0RlcHRoU3RlbmNpbCkKLQkJewotCQkJYXV0b0RlcHRoU3RlbmNpbC0+dW5iaW5kKCk7Ci0JCQlhdXRvRGVwdGhTdGVuY2lsID0gMDsKLQkJfQotCi0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCi0JCXsKLQkJCWlmKHJlbmRlclRhcmdldFtpbmRleF0pCi0JCQl7Ci0JCQkJcmVuZGVyVGFyZ2V0W2luZGV4XS0+dW5iaW5kKCk7Ci0JCQkJcmVuZGVyVGFyZ2V0W2luZGV4XSA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlpZighc3dhcENoYWluKQotCQl7Ci0JCQlzd2FwQ2hhaW4gPSBuZXcgRGlyZWN0M0RTd2FwQ2hhaW45KHRoaXMsIHByZXNlbnRQYXJhbWV0ZXJzKTsKLQkJCXN3YXBDaGFpbi0+YmluZCgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3dhcENoYWluLT5yZXNldChwcmVzZW50UGFyYW1ldGVycyk7Ci0JCX0KLQotCQlpZihwcmVzZW50UGFyYW1ldGVycy0+RW5hYmxlQXV0b0RlcHRoU3RlbmNpbCAhPSBGQUxTRSkKLQkJewotCQkJYm9vbCBsb2NrYWJsZSA9IGZhbHNlOwotCi0JCQlzd2l0Y2gocHJlc2VudFBhcmFtZXRlcnMtPkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQpCi0JCQl7Ci0JCQljYXNlIEQzREZNVF9EMTVTMToKLQkJCWNhc2UgRDNERk1UX0QyNFM4OgotCQkJY2FzZSBEM0RGTVRfRDI0WDg6Ci0JCQljYXNlIEQzREZNVF9EMjRYNFM0OgotCQkJY2FzZSBEM0RGTVRfRDI0RlM4OgotCQkJY2FzZSBEM0RGTVRfRDMyOgotCQkJY2FzZSBEM0RGTVRfRDE2OgotCQkJY2FzZSBEM0RGTVRfREYyNDoKLQkJCWNhc2UgRDNERk1UX0RGMTY6Ci0JCQljYXNlIEQzREZNVF9JTlRaOgotCQkJCWxvY2thYmxlID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzREZNVF9TOF9MT0NLQUJMRToKLQkJCWNhc2UgRDNERk1UX0QxNl9MT0NLQUJMRToKLQkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6Ci0JCQljYXNlIEQzREZNVF9EMzJfTE9DS0FCTEU6Ci0JCQkJbG9ja2FibGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCi0JCQlhdXRvRGVwdGhTdGVuY2lsID0gbmV3IERpcmVjdDNEU3VyZmFjZTkodGhpcywgdGhpcywgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJXaWR0aCwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQsIHByZXNlbnRQYXJhbWV0ZXJzLT5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0LCBEM0RQT09MX0RFRkFVTFQsIHByZXNlbnRQYXJhbWV0ZXJzLT5NdWx0aVNhbXBsZVR5cGUsIHByZXNlbnRQYXJhbWV0ZXJzLT5NdWx0aVNhbXBsZVF1YWxpdHksIGxvY2thYmxlLCBEM0RVU0FHRV9ERVBUSFNURU5DSUwpOwotCQkJYXV0b0RlcHRoU3RlbmNpbC0+YmluZCgpOwotCi0JCQlTZXREZXB0aFN0ZW5jaWxTdXJmYWNlKGF1dG9EZXB0aFN0ZW5jaWwpOwotCQl9Ci0KLQkJSURpcmVjdDNEU3VyZmFjZTkgKnJlbmRlclRhcmdldDsKLQkJc3dhcENoYWluLT5HZXRCYWNrQnVmZmVyKDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmcmVuZGVyVGFyZ2V0KTsKLQkJU2V0UmVuZGVyVGFyZ2V0KDAsIHJlbmRlclRhcmdldCk7Ci0JCXJlbmRlclRhcmdldC0+UmVsZWFzZSgpOwotCi0JCVNldFJlbmRlclRhcmdldCgxLCAwKTsKLQkJU2V0UmVuZGVyVGFyZ2V0KDIsIDApOwotCQlTZXRSZW5kZXJUYXJnZXQoMywgMCk7Ci0KLQkJc29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nID0gKGJlaGF2aW91ckZsYWdzICYgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcpID09IEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HOwotCi0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1pFTkFCTEUsIHByZXNlbnRQYXJhbWV0ZXJzLT5FbmFibGVBdXRvRGVwdGhTdGVuY2lsICE9IEZBTFNFID8gRDNEWkJfVFJVRSA6IEQzRFpCX0ZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRklMTE1PREUsIEQzREZJTExfU09MSUQpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19TSEFERU1PREUsIEQzRFNIQURFX0dPVVJBVUQpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19aV1JJVEVFTkFCTEUsIFRSVUUpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTFBIQVRFU1RFTkFCTEUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTEFTVFBJWEVMLCBUUlVFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1JDQkxFTkQsIEQzREJMRU5EX09ORSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0RFU1RCTEVORCwgRDNEQkxFTkRfWkVSTyk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NVTExNT0RFLCBEM0RDVUxMX0NDVyk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1pGVU5DLCBEM0RDTVBfTEVTU0VRVUFMKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFSRUYsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTFBIQUZVTkMsIEQzRENNUF9BTFdBWVMpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19ESVRIRVJFTkFCTEUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFCTEVOREVOQUJMRSwgRkFMU0UpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dFTkFCTEUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1BFQ1VMQVJFTkFCTEUsIEZBTFNFKTsKLQkvLwlTZXRSZW5kZXJTdGF0ZShEM0RSU19aVklTSUJMRSwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR0NPTE9SLCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRk9HVEFCTEVNT0RFLCBEM0RGT0dfTk9ORSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR1NUQVJULCBGdG9EVygwLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR0VORCwgRnRvRFcoMS4wZikpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dERU5TSVRZLCBGdG9EVygxLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1JBTkdFRk9HRU5BQkxFLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxFTkFCTEUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEZBSUwsIEQzRFNURU5DSUxPUF9LRUVQKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFpGQUlMLCBEM0RTVEVOQ0lMT1BfS0VFUCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxQQVNTLCBEM0RTVEVOQ0lMT1BfS0VFUCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxGVU5DLCBEM0RDTVBfQUxXQVlTKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFJFRiwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxNQVNLLCAweEZGRkZGRkZGKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFdSSVRFTUFTSywgMHhGRkZGRkZGRik7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1RFWFRVUkVGQUNUT1IsIDB4RkZGRkZGRkYpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMCwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVAxLCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDIsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMywgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA0LCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDUsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQNiwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA3LCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ0xJUFBJTkcsIFRSVUUpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19MSUdIVElORywgVFJVRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0FNQklFTlQsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dWRVJURVhNT0RFLCBEM0RGT0dfTk9ORSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NPTE9SVkVSVEVYLCBUUlVFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTE9DQUxWSUVXRVIsIFRSVUUpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19OT1JNQUxJWkVOT1JNQUxTLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRSwgRDNETUNTX0NPTE9SMSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19DT0xPUjIpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19NQVRFUklBTCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19NQVRFUklBTCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1ZFUlRFWEJMRU5ELCBEM0RWQkZfRElTQUJMRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NMSVBQTEFORUVOQUJMRSwgMCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0laRSwgRnRvRFcoMS4wZikpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkVfTUlOLCBGdG9EVygxLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVFTkFCTEUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRV9BLCBGdG9EVygxLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVfQiwgRnRvRFcoMC4wZikpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFX0MsIEZ0b0RXKDAuMGYpKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVMsIFRSVUUpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19NVUxUSVNBTVBMRU1BU0ssIDB4RkZGRkZGRkYpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QQVRDSEVER0VTVFlMRSwgRDNEUEFUQ0hFREdFX0RJU0NSRVRFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfREVCVUdNT05JVE9SVE9LRU4sIEQzRERNVF9FTkFCTEUpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkVfTUFYLCBGdG9EVyg2NC4wZikpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19JTkRFWEVEVkVSVEVYQkxFTkRFTkFCTEUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ09MT1JXUklURUVOQUJMRSwgMHgwMDAwMDAwRik7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1RXRUVORkFDVE9SLCBGdG9EVygwLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0JMRU5ET1AsIEQzREJMRU5ET1BfQUREKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9TSVRJT05ERUdSRUUsIEQzRERFR1JFRV9DVUJJQyk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX05PUk1BTERFR1JFRSwgRDNEREVHUkVFX0xJTkVBUik7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NDSVNTT1JURVNURU5BQkxFLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1NMT1BFU0NBTEVERVBUSEJJQVMsIEZ0b0RXKDAuMGYpKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQU5USUFMSUFTRURMSU5FRU5BQkxFLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX01JTlRFU1NFTExBVElPTkxFVkVMLCBGdG9EVygxLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX01BWFRFU1NFTExBVElPTkxFVkVMLCBGdG9EVygxLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0FEQVBUSVZFVEVTU19YLCBGdG9EVygwLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0FEQVBUSVZFVEVTU19ZLCBGdG9EVygwLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0FEQVBUSVZFVEVTU19aLCBGdG9EVygxLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0FEQVBUSVZFVEVTU19XLCBGdG9EVygwLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OLCBGQUxTRSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ0NXX1NURU5DSUxGQUlMLCBEM0RTVEVOQ0lMT1BfS0VFUCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NDV19TVEVOQ0lMWkZBSUwsIEQzRFNURU5DSUxPUF9LRUVQKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ0NXX1NURU5DSUxQQVNTLCBEM0RTVEVOQ0lMT1BfS0VFUCk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NDV19TVEVOQ0lMRlVOQywgRDNEQ01QX0FMV0FZUyk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUxLCAweDAwMDAwMDBGKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ09MT1JXUklURUVOQUJMRTIsIDB4MDAwMDAwMEYpOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19DT0xPUldSSVRFRU5BQkxFMywgMHgwMDAwMDAwRik7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX0JMRU5ERkFDVE9SLCAweEZGRkZGRkZGKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1JHQldSSVRFRU5BQkxFLCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfREVQVEhCSUFTLCBGdG9EVygwLjBmKSk7Ci0JCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA4LCAwKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDksIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTAsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTEsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTIsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTMsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTQsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTUsIDApOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEUsIEZBTFNFKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1JDQkxFTkRBTFBIQSwgRDNEQkxFTkRfT05FKTsKLQkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfREVTVEJMRU5EQUxQSEEsIEQzREJMRU5EX1pFUk8pOwotCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19CTEVORE9QQUxQSEEsIEQzREJMRU5ET1BfQUREKTsKLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQ09MT1JPUCwgaSA9PSAwID8gRDNEVE9QX01PRFVMQVRFIDogRDNEVE9QX0RJU0FCTEUpOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTE9SQVJHMSwgRDNEVEFfVEVYVFVSRSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQ09MT1JBUkcyLCBEM0RUQV9DVVJSRU5UKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BTFBIQU9QLCBpID09IDAgPyBEM0RUT1BfU0VMRUNUQVJHMSA6IEQzRFRPUF9ESVNBQkxFKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BTFBIQUFSRzEsIEQzRFRBX1RFWFRVUkUpOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0FMUEhBQVJHMiwgRDNEVEFfQ1VSUkVOVCk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVk1BVDAwLCBGdG9EVygwLjBmKSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVk1BVDAxLCBGdG9EVygwLjBmKSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVk1BVDEwLCBGdG9EVygwLjBmKSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVk1BVDExLCBGdG9EVygwLjBmKSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfVEVYQ09PUkRJTkRFWCwgaSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVkxTQ0FMRSwgRnRvRFcoMC4wZikpOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0JVTVBFTlZMT0ZGU0VULCBGdG9EVygwLjBmKSk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTLCBEM0RUVEZGX0RJU0FCTEUpOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTE9SQVJHMCwgRDNEVEFfQ1VSUkVOVCk7Ci0JCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQUxQSEFBUkcwLCBEM0RUQV9DVVJSRU5UKTsKLQkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19SRVNVTFRBUkcsIEQzRFRBX0NVUlJFTlQpOwotCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTlNUQU5ULCAweDAwMDAwMDAwKTsKLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPD0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIzOyBpID0gKGkgIT0gMTUpID8gKGkgKyAxKSA6IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCkKLQkJewotCQkJU2V0VGV4dHVyZShpLCAwKTsKLQotCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfQUREUkVTU1UsIEQzRFRBRERSRVNTX1dSQVApOwotCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfQUREUkVTU1YsIEQzRFRBRERSRVNTX1dSQVApOwotCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfQUREUkVTU1csIEQzRFRBRERSRVNTX1dSQVApOwotCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfQk9SREVSQ09MT1IsIDB4MDAwMDAwMDApOwotCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfTUFHRklMVEVSLCBEM0RURVhGX1BPSU5UKTsKLQkJCVNldFNhbXBsZXJTdGF0ZShpLCBEM0RTQU1QX01JTkZJTFRFUiwgRDNEVEVYRl9QT0lOVCk7Ci0JCQlTZXRTYW1wbGVyU3RhdGUoaSwgRDNEU0FNUF9NSVBGSUxURVIsIEQzRFRFWEZfTk9ORSk7Ci0JCQlTZXRTYW1wbGVyU3RhdGUoaSwgRDNEU0FNUF9NSVBNQVBMT0RCSUFTLCAwKTsKLQkJCVNldFNhbXBsZXJTdGF0ZShpLCBEM0RTQU1QX01BWE1JUExFVkVMLCAwKTsKLQkJCVNldFNhbXBsZXJTdGF0ZShpLCBEM0RTQU1QX01BWEFOSVNPVFJPUFksIDEpOwotCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfU1JHQlRFWFRVUkUsIDApOwotCQkJU2V0U2FtcGxlclN0YXRlKGksIEQzRFNBTVBfRUxFTUVOVElOREVYLCAwKTsKLQkJCVNldFNhbXBsZXJTdGF0ZShpLCBEM0RTQU1QX0RNQVBPRkZTRVQsIDApOwotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDY7IGkrKykKLQkJewotCQkJZmxvYXQgcGxhbmVbNF0gPSB7MCwgMCwgMCwgMH07Ci0KLQkJCVNldENsaXBQbGFuZShpLCBwbGFuZSk7Ci0JCX0KLQotCQljdXJyZW50UGFsZXR0ZSA9IDB4RkZGRjsKLQotCQlTaG93Q3Vyc29yKEZBTFNFKTsKLQkJZGVsZXRlIGN1cnNvcjsKLQkJY3Vyc29yID0gMDsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgZmxvYXQgKnBsYW5lKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGNvbnN0IGZsb2F0ICpwbGFuZSA9IDB4JTAuOHAiLCBpbmRleCwgcGxhbmUpOwotCi0JCWlmKCFwbGFuZSB8fCBpbmRleCA+PSA2KQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQl0aGlzLT5wbGFuZVtpbmRleF1bMF0gPSBwbGFuZVswXTsKLQkJCXRoaXMtPnBsYW5lW2luZGV4XVsxXSA9IHBsYW5lWzFdOwotCQkJdGhpcy0+cGxhbmVbaW5kZXhdWzJdID0gcGxhbmVbMl07Ci0JCQl0aGlzLT5wbGFuZVtpbmRleF1bM10gPSBwbGFuZVszXTsKLQotCQkJcmVuZGVyZXItPnNldENsaXBQbGFuZShpbmRleCwgcGxhbmUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci0+c2V0Q2xpcFBsYW5lKGluZGV4LCBwbGFuZSk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRDbGlwU3RhdHVzKGNvbnN0IEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJjb25zdCBEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cyA9IDB4JTAuOHAiLCBjbGlwU3RhdHVzKTsKLQotCQlpZighY2xpcFN0YXR1cykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl0aGlzLT5jbGlwU3RhdHVzID0gKmNsaXBTdGF0dXM7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIgPSAlZCIsIHBhbGV0dGVOdW1iZXIpOwotCi0JCWlmKHBhbGV0dGVOdW1iZXIgPiAweEZGRkYgfHwgcGFsZXR0ZS5maW5kKHBhbGV0dGVOdW1iZXIpID09IHBhbGV0dGUuZW5kKCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCWN1cnJlbnRQYWxldHRlID0gcGFsZXR0ZU51bWJlcjsKLQotCQkJc3c6OlN1cmZhY2U6OnNldFRleHR1cmVQYWxldHRlKCh1bnNpZ25lZCBpbnQqKSZwYWxldHRlW2N1cnJlbnRQYWxldHRlXSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLT5zZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUocGFsZXR0ZU51bWJlcik7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U5OjpTZXRDdXJzb3JQb3NpdGlvbihpbnQgeCwgaW50IHksIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoImludCB4ID0gJWQsIGludCB5ID0gJWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAweCUwLjhYIiwgeCwgeSwgZmxhZ3MpOwotCi0JCVBPSU5UIHBvaW50ID0ge3gsIHl9OwotCQlIV05EIHdpbmRvdyA9IGRldmljZVdpbmRvdyA/IGRldmljZVdpbmRvdyA6IGZvY3VzV2luZG93OwotCQlTY3JlZW5Ub0NsaWVudCh3aW5kb3csICZwb2ludCk7Ci0KLQkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JQb3NpdGlvbihwb2ludC54LCBwb2ludC55KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0Q3Vyc29yUHJvcGVydGllcyh1bnNpZ25lZCBpbnQgeDAsIHVuc2lnbmVkIGludCB5MCwgSURpcmVjdDNEU3VyZmFjZTkgKmN1cnNvckJpdG1hcCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHgwID0gJWQsIHVuc2lnbmVkIGludCB5MCA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqY3Vyc29yQml0bWFwID0gMHglMC44cCIsIHgwLCB5MCwgY3Vyc29yQml0bWFwKTsKLQotCQlpZighY3Vyc29yQml0bWFwKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN3OjpTdXJmYWNlICpjdXJzb3JTdXJmYWNlID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KGN1cnNvckJpdG1hcCk7Ci0KLQkJaW50IHdpZHRoID0gY3Vyc29yU3VyZmFjZS0+Z2V0V2lkdGgoKTsKLQkJaW50IGhlaWdodCA9IGN1cnNvclN1cmZhY2UtPmdldEhlaWdodCgpOwotCQl2b2lkICpiaXRtYXAgPSBjdXJzb3JTdXJmYWNlLT5sb2NrRXh0ZXJuYWwoMCwgMCwgMCwgc3c6OkxPQ0tfUkVBRE9OTFksIHN3OjpQVUJMSUMpOwotCi0JCWRlbGV0ZSBjdXJzb3I7Ci0JCWN1cnNvciA9IHN3OjpTdXJmYWNlOjpjcmVhdGUobnVsbHB0ciwgd2lkdGgsIGhlaWdodCwgMSwgMCwgMSwgc3c6OkZPUk1BVF9BOFI4RzhCOCwgZmFsc2UsIGZhbHNlKTsKLQotCQl2b2lkICpidWZmZXIgPSBjdXJzb3ItPmxvY2tFeHRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19ESVNDQVJELCBzdzo6UFVCTElDKTsKLQkJbWVtY3B5KGJ1ZmZlciwgYml0bWFwLCB3aWR0aCAqIGhlaWdodCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKLQkJY3Vyc29yLT51bmxvY2tFeHRlcm5hbCgpOwotCi0JCWN1cnNvclN1cmZhY2UtPnVubG9ja0V4dGVybmFsKCk7Ci0KLQkJaWYoc2hvd0N1cnNvcikKLQkJewotCQkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JJbWFnZShjdXJzb3IpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JJbWFnZShudWxscHRyKTsKLQkJfQotCi0JCXN3OjpGcmFtZUJ1ZmZlcjo6c2V0Q3Vyc29yT3JpZ2luKHgwLCB5MCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0RGVwdGhTdGVuY2lsU3VyZmFjZShJRGlyZWN0M0RTdXJmYWNlOSAqaURlcHRoU3RlbmNpbCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKm5ld0RlcHRoU3RlbmNpbCA9IDB4JTAuOHAiLCBpRGVwdGhTdGVuY2lsKTsKLQotCQlEaXJlY3QzRFN1cmZhY2U5ICpkZXB0aFN0ZW5jaWwgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U5Kj4oaURlcHRoU3RlbmNpbCk7Ci0KLQkJaWYodGhpcy0+ZGVwdGhTdGVuY2lsID09IGRlcHRoU3RlbmNpbCkKLQkJewotCQkJcmV0dXJuIEQzRF9PSzsKLQkJfQotCi0JCWlmKGRlcHRoU3RlbmNpbCkKLQkJewotCQkJZGVwdGhTdGVuY2lsLT5iaW5kKCk7Ci0JCX0KLQotCQlpZih0aGlzLT5kZXB0aFN0ZW5jaWwpCi0JCXsKLQkJCXRoaXMtPmRlcHRoU3RlbmNpbC0+dW5iaW5kKCk7Ci0JCX0KLQotCQl0aGlzLT5kZXB0aFN0ZW5jaWwgPSBkZXB0aFN0ZW5jaWw7Ci0KLQkJcmVuZGVyZXItPnNldERlcHRoQnVmZmVyKGRlcHRoU3RlbmNpbCk7Ci0JCXJlbmRlcmVyLT5zZXRTdGVuY2lsQnVmZmVyKGRlcHRoU3RlbmNpbCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0RGlhbG9nQm94TW9kZShpbnQgZW5hYmxlRGlhbG9ncykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiaW50IGVuYWJsZURpYWxvZ3MgPSAlZCIsIGVuYWJsZURpYWxvZ3MpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRGVkYodW5zaWduZWQgbG9uZyBGVkYpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgRlZGID0gMHglMC44WCIsIEZWRik7Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCWlmKEZWRiAhPSAwIHx8ICF0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbikKLQkJCXsKLQkJCQlEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4RGVjbGFyYXRpb24gPSBuZXcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkodGhpcywgRlZGKTsKLQkJCQl2ZXJ0ZXhEZWNsYXJhdGlvbi0+YmluZCgpOwotCi0JCQkJaWYodGhpcy0+dmVydGV4RGVjbGFyYXRpb24pCi0JCQkJewotCQkJCQl0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbi0+dW5iaW5kKCk7Ci0JCQkJfQotCi0JCQkJdGhpcy0+dmVydGV4RGVjbGFyYXRpb24gPSB2ZXJ0ZXhEZWNsYXJhdGlvbjsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldEZWRihGVkYpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlOTo6U2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgRDNER0FNTUFSQU1QICpyYW1wKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgdW5zaWduZWQgbG9uZyBmbGFncyA9IDB4JTAuOFgsIGNvbnN0IEQzREdBTU1BUkFNUCAqcmFtcCA9IDB4JTAuOHAiLCBpbmRleCwgZmxhZ3MsIHJhbXApOwotCi0JCWlmKCFyYW1wIHx8IGluZGV4ID49IEdldE51bWJlck9mU3dhcENoYWlucygpKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzd2FwQ2hhaW4tPnNldEdhbW1hUmFtcCgoc3c6OkdhbW1hUmFtcCopcmFtcCwgZmxhZ3MgJiBEM0RTR1JfQ0FMSUJSQVRFKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0SW5kaWNlcyhJRGlyZWN0M0RJbmRleEJ1ZmZlcjkqIGlJbmRleEJ1ZmZlcikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiSURpcmVjdDNESW5kZXhCdWZmZXI5KiBpbmRleERhdGEgPSAweCUwLjhwIiwgaUluZGV4QnVmZmVyKTsKLQotCQlEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhCdWZmZXIgPSBzdGF0aWNfY2FzdDxEaXJlY3QzREluZGV4QnVmZmVyOSo+KGlJbmRleEJ1ZmZlcik7Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCWlmKHRoaXMtPmluZGV4RGF0YSA9PSBpbmRleEJ1ZmZlcikKLQkJCXsKLQkJCQlyZXR1cm4gRDNEX09LOwotCQkJfQotCi0JCQlpZihpbmRleEJ1ZmZlcikKLQkJCXsKLQkJCQlpbmRleEJ1ZmZlci0+YmluZCgpOwotCQkJfQotCi0JCQlpZih0aGlzLT5pbmRleERhdGEpCi0JCQl7Ci0JCQkJdGhpcy0+aW5kZXhEYXRhLT51bmJpbmQoKTsKLQkJCX0KLQotCQkJdGhpcy0+aW5kZXhEYXRhID0gaW5kZXhCdWZmZXI7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLT5zZXRJbmRpY2VzKGluZGV4QnVmZmVyKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlNldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IEQzRExJR0hUOSAqbGlnaHQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgY29uc3QgRDNETElHSFQ5ICpsaWdodCA9IDB4JTAuOHAiLCBpbmRleCwgbGlnaHQpOwotCi0JCWlmKCFsaWdodCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZighc3RhdGVSZWNvcmRlcikKLQkJewotCQkJdGhpcy0+bGlnaHRbaW5kZXhdID0gKmxpZ2h0OwotCi0JCQlsaWdodHNEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLT5zZXRMaWdodChpbmRleCwgbGlnaHQpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0TWF0ZXJpYWwoY29uc3QgRDNETUFURVJJQUw5ICptYXRlcmlhbCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiY29uc3QgRDNETUFURVJJQUw5ICptYXRlcmlhbCA9IDB4JTAuOHAiLCBtYXRlcmlhbCk7Ci0KLQkJaWYoIW1hdGVyaWFsKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsgICAvLyBGSVhNRTogQ29ycmVjdCBiZWhhdmlvdXI/Ci0JCX0KLQotCQlpZighc3RhdGVSZWNvcmRlcikKLQkJewotCQkJdGhpcy0+bWF0ZXJpYWwgPSAqbWF0ZXJpYWw7Ci0KLQkJCXJlbmRlcmVyLT5zZXRNYXRlcmlhbEFtYmllbnQoc3c6OkNvbG9yPGZsb2F0PihtYXRlcmlhbC0+QW1iaWVudC5yLCBtYXRlcmlhbC0+QW1iaWVudC5nLCBtYXRlcmlhbC0+QW1iaWVudC5iLCBtYXRlcmlhbC0+QW1iaWVudC5hKSk7Ci0JCQlyZW5kZXJlci0+c2V0TWF0ZXJpYWxEaWZmdXNlKHN3OjpDb2xvcjxmbG9hdD4obWF0ZXJpYWwtPkRpZmZ1c2UuciwgbWF0ZXJpYWwtPkRpZmZ1c2UuZywgbWF0ZXJpYWwtPkRpZmZ1c2UuYiwgbWF0ZXJpYWwtPkRpZmZ1c2UuYSkpOwotCQkJcmVuZGVyZXItPnNldE1hdGVyaWFsRW1pc3Npb24oc3c6OkNvbG9yPGZsb2F0PihtYXRlcmlhbC0+RW1pc3NpdmUuciwgbWF0ZXJpYWwtPkVtaXNzaXZlLmcsIG1hdGVyaWFsLT5FbWlzc2l2ZS5iLCBtYXRlcmlhbC0+RW1pc3NpdmUuYSkpOwotCQkJcmVuZGVyZXItPnNldE1hdGVyaWFsU2hpbmluZXNzKG1hdGVyaWFsLT5Qb3dlcik7Ci0JCQlyZW5kZXJlci0+c2V0TWF0ZXJpYWxTcGVjdWxhcihzdzo6Q29sb3I8ZmxvYXQ+KG1hdGVyaWFsLT5TcGVjdWxhci5yLCBtYXRlcmlhbC0+U3BlY3VsYXIuZywgbWF0ZXJpYWwtPlNwZWN1bGFyLmIsIG1hdGVyaWFsLT5TcGVjdWxhci5hKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLT5zZXRNYXRlcmlhbChtYXRlcmlhbCk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXROUGF0Y2hNb2RlKGZsb2F0IHNlZ21lbnRzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJmbG9hdCBzZWdtZW50cyA9ICVmIiwgc2VnbWVudHMpOwotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlpZihzZWdtZW50cyA8IDEpCi0JCQl7Ci0JCQkJLy8gTk9URTogRGlzYWJsZQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVVOSU1QTEVNRU5URUQoKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldE5QYXRjaE1vZGUoc2VnbWVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0UGFsZXR0ZUVudHJpZXModW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIsIGNvbnN0IFBBTEVUVEVFTlRSWSAqZW50cmllcykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIgPSAlZCwgY29uc3QgUEFMRVRURUVOVFJZICplbnRyaWVzID0gMHglMC44cCIsIHBhbGV0dGVOdW1iZXIsIGVudHJpZXMpOwotCi0JCWlmKHBhbGV0dGVOdW1iZXIgPiAweEZGRkYgfHwgIWVudHJpZXMpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQotCQl7Ci0JCQlwYWxldHRlW3BhbGV0dGVOdW1iZXJdLmVudHJ5W2ldID0gZW50cmllc1tpXTsKLQkJfQotCi0JCWlmKHBhbGV0dGVOdW1iZXIgPT0gY3VycmVudFBhbGV0dGUpCi0JCXsKLQkJCXN3OjpTdXJmYWNlOjpzZXRUZXh0dXJlUGFsZXR0ZSgodW5zaWduZWQgaW50KikmcGFsZXR0ZVtjdXJyZW50UGFsZXR0ZV0pOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0UGl4ZWxTaGFkZXIoSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICppUGl4ZWxTaGFkZXIpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzRFBpeGVsU2hhZGVyOSAqc2hhZGVyID0gMHglMC44cCIsIGlQaXhlbFNoYWRlcik7Ci0KLQkJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnBpeGVsU2hhZGVyID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RQaXhlbFNoYWRlcjkqPihpUGl4ZWxTaGFkZXIpOwotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlpZih0aGlzLT5waXhlbFNoYWRlciA9PSBwaXhlbFNoYWRlcikKLQkJCXsKLQkJCQlyZXR1cm4gRDNEX09LOwotCQkJfQotCi0JCQlpZihwaXhlbFNoYWRlcikKLQkJCXsKLQkJCQlwaXhlbFNoYWRlci0+YmluZCgpOwotCQkJfQotCi0JCQlpZih0aGlzLT5waXhlbFNoYWRlcikKLQkJCXsKLQkJCQl0aGlzLT5waXhlbFNoYWRlci0+dW5iaW5kKCk7Ci0JCQl9Ci0KLQkJCXRoaXMtPnBpeGVsU2hhZGVyID0gcGl4ZWxTaGFkZXI7Ci0JCQlwaXhlbFNoYWRlckRpcnR5ID0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFBpeGVsU2hhZGVyKHBpeGVsU2hhZGVyKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudCAmJiBzdGFydFJlZ2lzdGVyICsgaSA8IDE2OyBpKyspCi0JCQl7Ci0JCQkJcGl4ZWxTaGFkZXJDb25zdGFudEJbc3RhcnRSZWdpc3RlciArIGldID0gY29uc3RhbnREYXRhW2ldOwotCQkJfQotCi0JCQlwaXhlbFNoYWRlckNvbnN0YW50c0JEaXJ0eSA9IHN3OjptYXgoc3RhcnRSZWdpc3RlciArIGNvdW50LCBwaXhlbFNoYWRlckNvbnN0YW50c0JEaXJ0eSk7Ci0JCQlwaXhlbFNoYWRlckRpcnR5ID0gdHJ1ZTsgICAvLyBSZWxvYWQgREVGIGNvbnN0YW50cwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEIoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRQaXhlbFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudCAmJiBzdGFydFJlZ2lzdGVyICsgaSA8IE1BWF9QSVhFTF9TSEFERVJfQ09OU1Q7IGkrKykKLQkJCXsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bMF0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAwXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bMV0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAxXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bMl0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAyXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bM10gPSBjb25zdGFudERhdGFbaSAqIDQgKyAzXTsKLQkJCX0KLQotCQkJcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHkgPSBzdzo6bWF4KHN0YXJ0UmVnaXN0ZXIgKyBjb3VudCwgcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHkpOwotCQkJcGl4ZWxTaGFkZXJEaXJ0eSA9IHRydWU7ICAgLy8gUmVsb2FkIERFRiBjb25zdGFudHMKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0UGl4ZWxTaGFkZXJDb25zdGFudEkodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQotCQlpZighc3RhdGVSZWNvcmRlcikKLQkJewotCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50ICYmIHN0YXJ0UmVnaXN0ZXIgKyBpIDwgMTY7IGkrKykKLQkJCXsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bMF0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAwXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bMV0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAxXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bMl0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAyXTsKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bM10gPSBjb25zdGFudERhdGFbaSAqIDQgKyAzXTsKLQkJCX0KLQotCQkJcGl4ZWxTaGFkZXJDb25zdGFudHNJRGlydHkgPSBzdzo6bWF4KHN0YXJ0UmVnaXN0ZXIgKyBjb3VudCwgcGl4ZWxTaGFkZXJDb25zdGFudHNJRGlydHkpOwotCQkJcGl4ZWxTaGFkZXJEaXJ0eSA9IHRydWU7ICAgLy8gUmVsb2FkIERFRiBjb25zdGFudHMKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0UmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUgPSAlZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICVkIiwgc3RhdGUsIHZhbHVlKTsKLQotCQlpZihzdGF0ZSA8IEQzRFJTX1pFTkFCTEUgfHwgc3RhdGUgPiBEM0RSU19CTEVORE9QQUxQSEEpCi0JCXsKLQkJCXJldHVybiBEM0RfT0s7ICAgLy8gRklYTUU6IFdhcm5pbmcKLQkJfQotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlpZighaW5pdCAmJiByZW5kZXJTdGF0ZVtzdGF0ZV0gPT0gdmFsdWUpCi0JCQl7Ci0JCQkJcmV0dXJuIEQzRF9PSzsKLQkJCX0KLQotCQkJcmVuZGVyU3RhdGVbc3RhdGVdID0gdmFsdWU7Ci0KLQkJCXN3aXRjaChzdGF0ZSkKLQkJCXsKLQkJCWNhc2UgRDNEUlNfWkVOQUJMRToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEWkJfVFJVRToKLQkJCQljYXNlIEQzRFpCX1VTRVc6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXB0aEJ1ZmZlckVuYWJsZSh0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RaQl9GQUxTRToKLQkJCQkJcmVuZGVyZXItPnNldERlcHRoQnVmZmVyRW5hYmxlKGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0ZJTExNT0RFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGSUxMX1BPSU5UOgotCQkJCQlyZW5kZXJlci0+c2V0RmlsbE1vZGUoc3c6OkZJTExfVkVSVEVYKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RGSUxMX1dJUkVGUkFNRToKLQkJCQkJcmVuZGVyZXItPnNldEZpbGxNb2RlKHN3OjpGSUxMX1dJUkVGUkFNRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNERklMTF9TT0xJRDoKLQkJCQkJcmVuZGVyZXItPnNldEZpbGxNb2RlKHN3OjpGSUxMX1NPTElEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NIQURFTU9ERToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEU0hBREVfRkxBVDoKLQkJCQkJcmVuZGVyZXItPnNldFNoYWRpbmdNb2RlKHN3OjpTSEFESU5HX0ZMQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNIQURFX0dPVVJBVUQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTaGFkaW5nTW9kZShzdzo6U0hBRElOR19HT1VSQVVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTSEFERV9QSE9ORzoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1pXUklURUVOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0RGVwdGhXcml0ZUVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0FMUEhBVEVTVEVOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0QWxwaGFUZXN0RW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfTEFTVFBJWEVMOgotCQkJLy8JaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsgICAvLyBGSVhNRQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TUkNCTEVORDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEQkxFTkRfWkVSTzoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9aRVJPKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfT05FKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9TUkNDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9TT1VSQ0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVlNSQ0NPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVlNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9ERVNUQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfREVTVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WREVTVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9ERVNUQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfREVTVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfSU5WREVTVENPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVkRFU1QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX1NSQ0FMUEhBU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NSQ0FMUEhBU0FUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9CT1RIU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRUFMUEhBKTsKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0JMRU5ERkFDVE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0NPTlNUQU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZCTEVOREZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZDT05TVEFOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19ERVNUQkxFTkQ6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzREJMRU5EX1pFUk86Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1pFUk8pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX09ORToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfT05FKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9TUkNDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZTUkNDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WU09VUkNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9TUkNBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVlNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfREVTVEFMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9ERVNUQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WREVTVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9ERVNUQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0RFU1QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WREVTVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEFTQVQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NSQ0FMUEhBU0FUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9CT1RIU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRUFMUEhBKTsKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0JMRU5ERkFDVE9SOgotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9DT05TVEFOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfSU5WQkxFTkRGQUNUT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVkNPTlNUQU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0NVTExNT0RFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RDVUxMX05PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRDdWxsTW9kZShzdzo6Q1VMTF9OT05FLCB0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDVUxMX0NDVzoKLQkJCQkJcmVuZGVyZXItPnNldEN1bGxNb2RlKHN3OjpDVUxMX0NPVU5URVJDTE9DS1dJU0UsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENVTExfQ1c6Ci0JCQkJCXJlbmRlcmVyLT5zZXRDdWxsTW9kZShzdzo6Q1VMTF9DTE9DS1dJU0UsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfWkZVTkM6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRENNUF9ORVZFUjoKLQkJCQkJcmVuZGVyZXItPnNldERlcHRoQ29tcGFyZShzdzo6REVQVEhfTkVWRVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9MRVNTOgotCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9MRVNTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfRVFVQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX0VRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTEVTU0VRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9MRVNTRVFVQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9HUkVBVEVSOgotCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9HUkVBVEVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTk9URVFVQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX05PVEVRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfR1JFQVRFUkVRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9HUkVBVEVSRVFVQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9BTFdBWVM6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX0FMV0FZUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19BTFBIQVJFRjoKLQkJCQlyZW5kZXJlci0+c2V0QWxwaGFSZWZlcmVuY2UodmFsdWUgJiAweDAwMDAwMEZGKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQUxQSEFGVU5DOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RDTVBfTkVWRVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBbHBoYUNvbXBhcmUoc3c6OkFMUEhBX05FVkVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTEVTUzoKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfTEVTUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0VRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9FUVVBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0xFU1NFUVVBTDoKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfTEVTU0VRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfR1JFQVRFUjoKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfR1JFQVRFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX05PVEVRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9OT1RFUVVBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0dSRUFURVJFUVVBTDoKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfR1JFQVRFUkVRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfQUxXQVlTOgotCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9BTFdBWVMpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfRElUSEVSRU5BQkxFOgotCQkJLy8JaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQUxQSEFCTEVOREVOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0QWxwaGFCbGVuZEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0ZPR0VOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0Rm9nRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfRk9HQ09MT1I6Ci0JCQkJcmVuZGVyZXItPnNldEZvZ0NvbG9yKHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfRk9HVEFCTEVNT0RFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGT0dfTk9ORToKLQkJCQkJcmVuZGVyZXItPnNldFBpeGVsRm9nTW9kZShzdzo6Rk9HX05PTkUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREZPR19MSU5FQVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRQaXhlbEZvZ01vZGUoc3c6OkZPR19MSU5FQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREZPR19FWFA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRQaXhlbEZvZ01vZGUoc3c6OkZPR19FWFApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREZPR19FWFAyOgotCQkJCQlyZW5kZXJlci0+c2V0UGl4ZWxGb2dNb2RlKHN3OjpGT0dfRVhQMik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19GT0dTVEFSVDoKLQkJCQlyZW5kZXJlci0+c2V0Rm9nU3RhcnQoKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0ZPR0VORDoKLQkJCQlyZW5kZXJlci0+c2V0Rm9nRW5kKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19GT0dERU5TSVRZOgotCQkJCXJlbmRlcmVyLT5zZXRGb2dEZW5zaXR5KChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19SQU5HRUZPR0VOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0UmFuZ2VGb2dFbmFibGUodmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TUEVDVUxBUkVOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0U3BlY3VsYXJFbmFibGUodmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TVEVOQ0lMRU5BQkxFOgotCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1RFTkNJTEZBSUw6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9LRUVQOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9LRUVQKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfWkVSTzoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fWkVSTyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1JFUExBQ0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX1JFUExBQ0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9JTkNSU0FUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUlNBVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fREVDUlNBVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOVkVSVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5WRVJUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUjoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5DUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1IpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1RFTkNJTFpGQUlMOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0tFRVApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9aRVJPOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fWkVSTyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1JFUExBQ0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9SRVBMQUNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOQ1JTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fREVDUlNBVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOVkVSVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOVkVSVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9JTkNSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUjoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1IpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1RFTkNJTFBBU1M6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9LRUVQOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9LRUVQKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfWkVSTzoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fWkVSTyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1JFUExBQ0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX1JFUExBQ0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9JTkNSU0FUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUlNBVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fREVDUlNBVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOVkVSVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5WRVJUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUjoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5DUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1IpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1RFTkNJTEZVTkM6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRENNUF9ORVZFUjoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX05FVkVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTEVTUzoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0xFU1MpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9FUVVBTDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0VRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfTEVTU0VRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmUoc3c6OlNURU5DSUxfTEVTU0VRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfR1JFQVRFUjoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0dSRUFURVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9OT1RFUVVBTDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX05PVEVRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfR1JFQVRFUkVRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmUoc3c6OlNURU5DSUxfR1JFQVRFUkVRVUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RDTVBfQUxXQVlTOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmUoc3c6OlNURU5DSUxfQUxXQVlTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NURU5DSUxSRUY6Ci0JCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxSZWZlcmVuY2UodmFsdWUpOwotCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUmVmZXJlbmNlQ0NXKHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1RFTkNJTE1BU0s6Ci0JCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxNYXNrKHZhbHVlKTsKLQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbE1hc2tDQ1codmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TVEVOQ0lMV1JJVEVNQVNLOgotCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsV3JpdGVNYXNrKHZhbHVlKTsKLQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFdyaXRlTWFza0NDVyh2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1RFWFRVUkVGQUNUT1I6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVGYWN0b3IodmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQMDoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoMCwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQMToKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoMSwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQMjoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoMiwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQMzoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoMywgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQNDoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoNCwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQNToKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoNSwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQNjoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoNiwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQNzoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoNywgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19DTElQUElORzoKLQkJCQkvLyBJZ25vcmVkLCBjbGlwcGluZyBpcyBhbHdheXMgcGVyZm9ybWVkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0xJR0hUSU5HOgotCQkJCXJlbmRlcmVyLT5zZXRMaWdodGluZ0VuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0FNQklFTlQ6Ci0JCQkJcmVuZGVyZXItPnNldEdsb2JhbEFtYmllbnQodmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19GT0dWRVJURVhNT0RFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RGT0dfTk9ORToKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleEZvZ01vZGUoc3c6OkZPR19OT05FKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RGT0dfTElORUFSOgotCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4Rm9nTW9kZShzdzo6Rk9HX0xJTkVBUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNERk9HX0VYUDoKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleEZvZ01vZGUoc3c6OkZPR19FWFApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREZPR19FWFAyOgotCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4Rm9nTW9kZShzdzo6Rk9HX0VYUDIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQ09MT1JWRVJURVg6Ci0JCQkJcmVuZGVyZXItPnNldENvbG9yVmVydGV4RW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfTE9DQUxWSUVXRVI6Ci0JCQkJcmVuZGVyZXItPnNldExvY2FsVmlld2VyKHZhbHVlICE9IEZBTFNFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfTk9STUFMSVpFTk9STUFMUzoKLQkJCQlyZW5kZXJlci0+c2V0Tm9ybWFsaXplTm9ybWFscyh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNETUNTX01BVEVSSUFMOgotCQkJCQlyZW5kZXJlci0+c2V0RGlmZnVzZU1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9NQVRFUklBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNETUNTX0NPTE9SMToKLQkJCQkJcmVuZGVyZXItPnNldERpZmZ1c2VNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RNQ1NfQ09MT1IyOgotCQkJCQlyZW5kZXJlci0+c2V0RGlmZnVzZU1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRToKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNETUNTX01BVEVSSUFMOgotCQkJCQlyZW5kZXJlci0+c2V0U3BlY3VsYXJNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfTUFURVJJQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRE1DU19DT0xPUjE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTcGVjdWxhck1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRE1DU19DT0xPUjI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTcGVjdWxhck1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQU1CSUVOVE1BVEVSSUFMU09VUkNFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RNQ1NfTUFURVJJQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBbWJpZW50TWF0ZXJpYWxTb3VyY2Uoc3c6Ok1BVEVSSUFMX01BVEVSSUFMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RNQ1NfQ09MT1IxOgotCQkJCQlyZW5kZXJlci0+c2V0QW1iaWVudE1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRE1DU19DT0xPUjI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBbWJpZW50TWF0ZXJpYWxTb3VyY2Uoc3c6Ok1BVEVSSUFMX0NPTE9SMik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19FTUlTU0lWRU1BVEVSSUFMU09VUkNFOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RNQ1NfTUFURVJJQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXRFbWlzc2l2ZU1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9NQVRFUklBTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNETUNTX0NPTE9SMToKLQkJCQkJcmVuZGVyZXItPnNldEVtaXNzaXZlTWF0ZXJpYWxTb3VyY2Uoc3c6Ok1BVEVSSUFMX0NPTE9SMSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNETUNTX0NPTE9SMjoKLQkJCQkJcmVuZGVyZXItPnNldEVtaXNzaXZlTWF0ZXJpYWxTb3VyY2Uoc3c6Ok1BVEVSSUFMX0NPTE9SMik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19WRVJURVhCTEVORDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEVkJGX0RJU0FCTEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhCbGVuZE1hdHJpeENvdW50KDApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFZCRl8xV0VJR0hUUzoKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleEJsZW5kTWF0cml4Q291bnQoMik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVkJGXzJXRUlHSFRTOgotCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4QmxlbmRNYXRyaXhDb3VudCgzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RWQkZfM1dFSUdIVFM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhCbGVuZE1hdHJpeENvdW50KDQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFZCRl9UV0VFTklORzoKLQkJCQkJVU5JTVBMRU1FTlRFRCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFZCRl8wV0VJR0hUUzoKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleEJsZW5kTWF0cml4Q291bnQoMSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19DTElQUExBTkVFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldENsaXBGbGFncyh2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1BPSU5UU0laRToKLQkJCQlpZih2YWx1ZSA9PSBEM0RGTVRfSU5TVCAmJiBwaXhlbFNoYWRlclZlcnNpb25YID49IEQzRFBTX1ZFUlNJT04oMiwgMCkpICAgLy8gQVRJIGhhY2sgdG8gZW5hYmxlIGluc3RhbmNpbmcgb24gU00gMi4wIGhhcmR3YXJlCi0JCQkJewotCQkJCQlpbnN0YW5jaW5nRW5hYmxlZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYodmFsdWUgPT0gRDNERk1UX0EyTTEpICAgLy8gQVRJIGhhY2sgdG8gZW5hYmxlIHRyYW5zcGFyZW5jeSBhbnRpLWFsaWFzaW5nCi0JCQkJewotCQkJCQlyZW5kZXJlci0+c2V0VHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nKHN3OjpUUkFOU1BBUkVOQ1lfQUxQSEFfVE9fQ09WRVJBR0UpOwotCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFUZXN0RW5hYmxlKHRydWUpOwotCQkJCX0KLQkJCQllbHNlIGlmKHZhbHVlID09IEQzREZNVF9BMk0wKSAgIC8vIEFUSSBoYWNrIHRvIGRpc2FibGUgdHJhbnNwYXJlbmN5IGFudGktYWxpYXNpbmcKLQkJCQl7Ci0JCQkJCXJlbmRlcmVyLT5zZXRUcmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcoc3c6OlRSQU5TUEFSRU5DWV9OT05FKTsKLQkJCQkJcmVuZGVyZXItPnNldEFscGhhVGVzdEVuYWJsZShmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXJlbmRlcmVyLT5zZXRQb2ludFNpemUoKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNJWkVfTUlOOgotCQkJCXJlbmRlcmVyLT5zZXRQb2ludFNpemVNaW4oKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFOgotCQkJCXJlbmRlcmVyLT5zZXRQb2ludFNwcml0ZUVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1BPSU5UU0NBTEVFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVFbmFibGUodmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0E6Ci0JCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVBKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0I6Ci0JCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVCKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0M6Ci0JCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVDKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19NVUxUSVNBTVBMRUFOVElBTElBUzoKLQkJCS8vCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX01VTFRJU0FNUExFTUFTSzoKLQkJCQlTZXRSZW5kZXJUYXJnZXQoMCwgcmVuZGVyVGFyZ2V0WzBdKTsgICAvLyBTZXRzIHRoZSBtdWx0aS1zYW1wbGUgbWFzaywgaWYgbWFza2FibGUKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfUEFUQ0hFREdFU1RZTEU6Ci0JCQkJaWYoIWluaXQpIGlmKHZhbHVlICE9IEQzRFBBVENIRURHRV9ESVNDUkVURSkgVU5JTVBMRU1FTlRFRCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19ERUJVR01PTklUT1JUT0tFTjoKLQkJCQlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT0lOVFNJWkVfTUFYOgotCQkJCXJlbmRlcmVyLT5zZXRQb2ludFNpemVNYXgoKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0lOREVYRURWRVJURVhCTEVOREVOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0SW5kZXhlZFZlcnRleEJsZW5kRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQ09MT1JXUklURUVOQUJMRToKLQkJCQlyZW5kZXJlci0+c2V0Q29sb3JXcml0ZU1hc2soMCwgdmFsdWUgJiAweDAwMDAwMDBGKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfVFdFRU5GQUNUT1I6Ci0JCQkJaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQkxFTkRPUDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEQkxFTkRPUF9BREQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9BREQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5ET1BfU1VCVFJBQ1Q6Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9TVUIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5ET1BfUkVWU1VCVFJBQ1Q6Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9JTlZTVUIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5ET1BfTUlOOgotCQkJCQlyZW5kZXJlci0+c2V0QmxlbmRPcGVyYXRpb24oc3c6OkJMRU5ET1BfTUlOKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORE9QX01BWDoKLQkJCQkJcmVuZGVyZXItPnNldEJsZW5kT3BlcmF0aW9uKHN3OjpCTEVORE9QX01BWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19QT1NJVElPTkRFR1JFRToKLQkJCQlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19OT1JNQUxERUdSRUU6Ci0JCQkJaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfU0NJU1NPUlRFU1RFTkFCTEU6Ci0JCQkJc2Npc3NvckVuYWJsZSA9ICh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NMT1BFU0NBTEVERVBUSEJJQVM6Ci0JCQkJcmVuZGVyZXItPnNldFNsb3BlRGVwdGhCaWFzKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19BTlRJQUxJQVNFRExJTkVFTkFCTEU6Ci0JCQkJaWYoIWluaXQpIGlmKHZhbHVlICE9IEZBTFNFKSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX01JTlRFU1NFTExBVElPTkxFVkVMOgotCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX01BWFRFU1NFTExBVElPTkxFVkVMOgotCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0FEQVBUSVZFVEVTU19YOgotCQkJCWlmKCFpbml0KSBpZigoZmxvYXQmKXZhbHVlICE9IDAuMGYpIFVOSU1QTEVNRU5URUQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQURBUFRJVkVURVNTX1k6Ci0JCQkJaWYodmFsdWUgPT0gRDNERk1UX0FUT0MpICAgLy8gTlZJRElBIGhhY2sgdG8gZW5hYmxlIHRyYW5zcGFyZW5jeSBhbnRpLWFsaWFzaW5nCi0JCQkJewotCQkJCQlyZW5kZXJlci0+c2V0VHJhbnNwYXJlbmN5QW50aWFsaWFzaW5nKHN3OjpUUkFOU1BBUkVOQ1lfQUxQSEFfVE9fQ09WRVJBR0UpOwotCQkJCX0KLQkJCQllbHNlIGlmKHZhbHVlID09IEQzREZNVF9VTktOT1dOKSAgIC8vIE5WSURJQSBoYWNrIHRvIGRpc2FibGUgdHJhbnNwYXJlbmN5IGFudGktYWxpYXNpbmcKLQkJCQl7Ci0JCQkJCXJlbmRlcmVyLT5zZXRUcmFuc3BhcmVuY3lBbnRpYWxpYXNpbmcoc3c6OlRSQU5TUEFSRU5DWV9OT05FKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYoIWluaXQpIGlmKChmbG9hdCYpdmFsdWUgIT0gMC4wZikgVU5JTVBMRU1FTlRFRCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQURBUFRJVkVURVNTX1o6Ci0JCQkJaWYoIWluaXQpIGlmKChmbG9hdCYpdmFsdWUgIT0gMS4wZikgVU5JTVBMRU1FTlRFRCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19BREFQVElWRVRFU1NfVzoKLQkJCQlpZighaW5pdCkgaWYoKGZsb2F0Jil2YWx1ZSAhPSAwLjBmKSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OOgotCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREU6Ci0JCQkJcmVuZGVyZXItPnNldFR3b1NpZGVkU3RlbmNpbCh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0NDV19TVEVOQ0lMRkFJTDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0tFRVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0tFRVApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9aRVJPOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coc3c6Ok9QRVJBVElPTl9aRVJPKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfUkVQTEFDRToKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uQ0NXKHN3OjpPUEVSQVRJT05fUkVQTEFDRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1JTQVQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0lOQ1JTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coc3c6Ok9QRVJBVElPTl9ERUNSU0FUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5WRVJUOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coc3c6Ok9QRVJBVElPTl9JTlZFUlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb25DQ1coc3c6Ok9QRVJBVElPTl9JTkNSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUjoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uQ0NXKHN3OjpPUEVSQVRJT05fREVDUik7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19DQ1dfU1RFTkNJTFpGQUlMOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0tFRVApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9aRVJPOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uQ0NXKHN3OjpPUEVSQVRJT05fWkVSTyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1JFUExBQ0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1coc3c6Ok9QRVJBVElPTl9SRVBMQUNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0lOQ1JTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uQ0NXKHN3OjpPUEVSQVRJT05fREVDUlNBVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOVkVSVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0lOVkVSVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb25DQ1coc3c6Ok9QRVJBVElPTl9JTkNSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUjoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0RFQ1IpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQ0NXX1NURU5DSUxQQVNTOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uQ0NXKHN3OjpPUEVSQVRJT05fS0VFUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1pFUk86Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX1pFUk8pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9SRVBMQUNFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb25DQ1coc3c6Ok9QRVJBVElPTl9SRVBMQUNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uQ0NXKHN3OjpPUEVSQVRJT05fSU5DUlNBVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1JTQVQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0RFQ1JTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9JTlZFUlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0lOVkVSVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbkNDVyhzdzo6T1BFUkFUSU9OX0lOQ1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb25DQ1coc3c6Ok9QRVJBVElPTl9ERUNSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0NDV19TVEVOQ0lMRlVOQzoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEQ01QX05FVkVSOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OlNURU5DSUxfTkVWRVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9MRVNTOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OlNURU5DSUxfTEVTUyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX0VRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OlNURU5DSUxfRVFVQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9MRVNTRVFVQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZUNDVyhzdzo6U1RFTkNJTF9MRVNTRVFVQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9HUkVBVEVSOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OlNURU5DSUxfR1JFQVRFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQ01QX05PVEVRVUFMOgotCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbENvbXBhcmVDQ1coc3c6OlNURU5DSUxfTk9URVFVQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9HUkVBVEVSRVFVQUw6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZUNDVyhzdzo6U1RFTkNJTF9HUkVBVEVSRVFVQUwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRENNUF9BTFdBWVM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZUNDVyhzdzo6U1RFTkNJTF9BTFdBWVMpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQ09MT1JXUklURUVOQUJMRTE6Ci0JCQkJcmVuZGVyZXItPnNldENvbG9yV3JpdGVNYXNrKDEsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQ09MT1JXUklURUVOQUJMRTI6Ci0JCQkJcmVuZGVyZXItPnNldENvbG9yV3JpdGVNYXNrKDIsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQ09MT1JXUklURUVOQUJMRTM6Ci0JCQkJcmVuZGVyZXItPnNldENvbG9yV3JpdGVNYXNrKDMsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQkxFTkRGQUNUT1I6Ci0JCQkJcmVuZGVyZXItPnNldEJsZW5kQ29uc3RhbnQoc3c6OkNvbG9yPGZsb2F0Pih2YWx1ZSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TUkdCV1JJVEVFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldFdyaXRlU1JHQih2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0RFUFRIQklBUzoKLQkJCQlyZW5kZXJlci0+c2V0RGVwdGhCaWFzKChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQODoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoOCwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQOToKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoOSwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQMTA6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDEwLCB2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1dSQVAxMToKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoMTEsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDEyOgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCgxMiwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19XUkFQMTM6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDEzLCB2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1dSQVAxNDoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVdyYXAoMTQsIHZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfV1JBUDE1OgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlV3JhcCgxNSwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEU6Ci0JCQkJcmVuZGVyZXItPnNldFNlcGFyYXRlQWxwaGFCbGVuZEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX1NSQ0JMRU5EQUxQSEE6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzREJMRU5EX1pFUk86Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9aRVJPKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9PTkUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX1NSQ0NPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfU09VUkNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZTUkNDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX0lOVlNPVVJDRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9TT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfREVTVEFMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfREVTVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9JTlZERVNUQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0RFU1RDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX0RFU1QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX0lOVkRFU1QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX1NSQ0FMUEhBU0FUOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfU1JDQUxQSEFTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0JPVEhTUkNBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX1NPVVJDRUFMUEhBKTsKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOwotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX1NPVVJDRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9CTEVOREZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX0NPTlNUQU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZCTEVOREZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX0lOVkNPTlNUQU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFJTX0RFU1RCTEVOREFMUEhBOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RCTEVORF9aRVJPOgotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX1pFUk8pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX09ORToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9PTkUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX1NSQ0NPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX1NPVVJDRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfSU5WU09VUkNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9TUkNBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9TT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0RFU1RBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9ERVNUQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9JTlZERVNUQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0RFU1RDT0xPUjoKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9ERVNUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfSU5WREVTVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEFTQVQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfU1JDQUxQSEFTQVQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5EX0JPVEhTUkNBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX1NPVVJDRUFMUEhBKTsKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOwotCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yQWxwaGEoc3c6OkJMRU5EX1NPVVJDRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORF9CTEVOREZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3RvckFscGhhKHN3OjpCTEVORF9DT05TVEFOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRfSU5WQkxFTkRGQUNUT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3JBbHBoYShzdzo6QkxFTkRfSU5WQ09OU1RBTlQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUlNfQkxFTkRPUEFMUEhBOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RCTEVORE9QX0FERDoKLQkJCQkJcmVuZGVyZXItPnNldEJsZW5kT3BlcmF0aW9uQWxwaGEoc3c6OkJMRU5ET1BfQUREKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RCTEVORE9QX1NVQlRSQUNUOgotCQkJCQlyZW5kZXJlci0+c2V0QmxlbmRPcGVyYXRpb25BbHBoYShzdzo6QkxFTkRPUF9TVUIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzREJMRU5ET1BfUkVWU1VCVFJBQ1Q6Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbkFscGhhKHN3OjpCTEVORE9QX0lOVlNVQik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRPUF9NSU46Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbkFscGhhKHN3OjpCTEVORE9QX01JTik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEQkxFTkRPUF9NQVg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbkFscGhhKHN3OjpCTEVORE9QX01BWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgICAvLyBzdGF0ZVJlY29yZGVyCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFJlbmRlclN0YXRlKHN0YXRlLCB2YWx1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRSZW5kZXJUYXJnZXQodW5zaWduZWQgbG9uZyBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKmlSZW5kZXJUYXJnZXQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKm5ld1JlbmRlclRhcmdldCA9IDB4JTAuOHAiLCBpbmRleCwgaVJlbmRlclRhcmdldCk7Ci0KLQkJLy8gRklYTUU6IENoZWNrIGZvciBEM0RVU0FHRV9SRU5ERVJUQVJHRVQKLQotCQlpZihpbmRleCA+PSA0IHx8IChpbmRleCA9PSAwICYmICFpUmVuZGVyVGFyZ2V0KSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlEaXJlY3QzRFN1cmZhY2U5ICpyZW5kZXJUYXJnZXQgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U5Kj4oaVJlbmRlclRhcmdldCk7Ci0KLQkJaWYocmVuZGVyVGFyZ2V0KQotCQl7Ci0JCQlyZW5kZXJUYXJnZXQtPmJpbmQoKTsKLQkJfQotCi0JCWlmKHRoaXMtPnJlbmRlclRhcmdldFtpbmRleF0pCi0JCXsKLQkJCXRoaXMtPnJlbmRlclRhcmdldFtpbmRleF0tPnVuYmluZCgpOwotCQl9Ci0KLQkJdGhpcy0+cmVuZGVyVGFyZ2V0W2luZGV4XSA9IHJlbmRlclRhcmdldDsKLQotCQlpZihyZW5kZXJUYXJnZXQgJiYgaW5kZXggPT0gMCkKLQkJewotCQkJRDNEU1VSRkFDRV9ERVNDIHJlbmRlclRhcmdldERlc2M7Ci0JCQlyZW5kZXJUYXJnZXQtPkdldERlc2MoJnJlbmRlclRhcmdldERlc2MpOwotCi0JCQkvLyBSZXNldCB2aWV3cG9ydCB0byBzaXplIG9mIGN1cnJlbnQgcmVuZGVyIHRhcmdldAotCQkJdmlld3BvcnQuWCA9IDA7Ci0JCQl2aWV3cG9ydC5ZID0gMDsKLQkJCXZpZXdwb3J0LldpZHRoID0gcmVuZGVyVGFyZ2V0RGVzYy5XaWR0aDsKLQkJCXZpZXdwb3J0LkhlaWdodCA9IHJlbmRlclRhcmdldERlc2MuSGVpZ2h0OwotCQkJdmlld3BvcnQuTWluWiA9IDA7Ci0JCQl2aWV3cG9ydC5NYXhaID0gMTsKLQotCQkJLy8gUmVzZXQgc2Npc3NvciByZWN0YW5nbGUgdG8gc2l6ZSBvZiBjdXJyZW50IHJlbmRlciB0YXJnZXQKLQkJCXNjaXNzb3JSZWN0LmxlZnQgPSAwOwotCQkJc2Npc3NvclJlY3QudG9wID0gMDsKLQkJCXNjaXNzb3JSZWN0LnJpZ2h0ID0gcmVuZGVyVGFyZ2V0RGVzYy5XaWR0aDsKLQkJCXNjaXNzb3JSZWN0LmJvdHRvbSA9IHJlbmRlclRhcmdldERlc2MuSGVpZ2h0OwotCi0JCQkvLyBTZXQgdGhlIG11bHRpLXNhbXBsZSBtYXNrLCBpZiBtYXNrYWJsZQotCQkJaWYocmVuZGVyVGFyZ2V0RGVzYy5NdWx0aVNhbXBsZVR5cGUgIT0gRDNETVVMVElTQU1QTEVfTk9ORSAmJgotCQkJICAgcmVuZGVyVGFyZ2V0RGVzYy5NdWx0aVNhbXBsZVR5cGUgIT0gRDNETVVMVElTQU1QTEVfTk9OTUFTS0FCTEUpCi0JCQl7Ci0JCQkJcmVuZGVyZXItPnNldE11bHRpU2FtcGxlTWFzayhyZW5kZXJTdGF0ZVtEM0RSU19NVUxUSVNBTVBMRU1BU0tdKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZW5kZXJlci0+c2V0TXVsdGlTYW1wbGVNYXNrKDB4RkZGRkZGRkYpOwotCQkJfQotCQl9Ci0KLQkJcmVuZGVyZXItPnNldFJlbmRlclRhcmdldChpbmRleCwgcmVuZGVyVGFyZ2V0KTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRTYW1wbGVyU3RhdGUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBEM0RTQU1QTEVSU1RBVEVUWVBFIHN0YXRlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIHNhbXBsZXIgPSAlZCwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSA9ICVkLCB1bnNpZ25lZCBsb25nIHZhbHVlID0gJWQiLCBzYW1wbGVyLCBzdGF0ZSwgdmFsdWUpOwotCi0JCWlmKHN0YXRlIDwgRDNEU0FNUF9BRERSRVNTVSB8fCBzdGF0ZSA+IEQzRFNBTVBfRE1BUE9GRlNFVCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZigoc2FtcGxlciA+PSAxNiAmJiBzYW1wbGVyIDw9IEQzRERNQVBTQU1QTEVSKSB8fCBzYW1wbGVyID4gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKHNhbXBsZXIgPj0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwKQotCQl7Ci0JCQlzYW1wbGVyID0gMTYgKyAoc2FtcGxlciAtIEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCk7Ci0JCX0KLQotCQlpZighc3RhdGVSZWNvcmRlcikKLQkJewotCQkJaWYoIWluaXQgJiYgc2FtcGxlclN0YXRlW3NhbXBsZXJdW3N0YXRlXSA9PSB2YWx1ZSkKLQkJCXsKLQkJCQlyZXR1cm4gRDNEX09LOwotCQkJfQotCi0JCQlzYW1wbGVyU3RhdGVbc2FtcGxlcl1bc3RhdGVdID0gdmFsdWU7Ci0KLQkJCXN3OjpTYW1wbGVyVHlwZSB0eXBlID0gc2FtcGxlciA8IDE2ID8gc3c6OlNBTVBMRVJfUElYRUwgOiBzdzo6U0FNUExFUl9WRVJURVg7Ci0JCQlpbnQgaW5kZXggPSBzYW1wbGVyIDwgMTYgPyBzYW1wbGVyIDogc2FtcGxlciAtIDE2OyAgIC8vIFNhbXBsZXIgaW5kZXggd2l0aGluIHR5cGUgZ3JvdXAKLQotCQkJc3dpdGNoKHN0YXRlKQotCQkJewotCQkJY2FzZSBEM0RTQU1QX0FERFJFU1NVOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19XUkFQOgotCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVVKHR5cGUsIGluZGV4LCBzdzo6QUREUkVTU0lOR19XUkFQKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX01JUlJPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfQ0xBTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0NMQU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19CT1JERVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKLQkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVSh0eXBlLCBpbmRleCwgc3c6OkFERFJFU1NJTkdfTUlSUk9ST05DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RTQU1QX0FERFJFU1NWOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19XUkFQOgotCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVWKHR5cGUsIGluZGV4LCBzdzo6QUREUkVTU0lOR19XUkFQKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX01JUlJPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfQ0xBTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0NMQU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19CT1JERVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKLQkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVih0eXBlLCBpbmRleCwgc3c6OkFERFJFU1NJTkdfTUlSUk9ST05DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RTQU1QX0FERFJFU1NXOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19XUkFQOgotCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVXKHR5cGUsIGluZGV4LCBzdzo6QUREUkVTU0lOR19XUkFQKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX01JUlJPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfQ0xBTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0NMQU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQUREUkVTU19CT1JERVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcodHlwZSwgaW5kZXgsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKLQkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVyh0eXBlLCBpbmRleCwgc3c6OkFERFJFU1NJTkdfTUlSUk9ST05DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RTQU1QX0JPUkRFUkNPTE9SOgotCQkJCXJlbmRlcmVyLT5zZXRCb3JkZXJDb2xvcih0eXBlLCBpbmRleCwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RTQU1QX01BR0ZJTFRFUjoKLQkJCQkvLyBOT1RFOiBTd2lmdFNoYWRlciBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbWluaWZpY2F0aW9uIGFuZCBtYWduaWZpY2F0aW9uIGZpbHRlcgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RURVhGX05PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6RklMVEVSX1BPSU5UKTsgICAvLyBGSVhNRTogT25seSBmb3IgbWlwbWFwIGZpbHRlcgotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRFWEZfUE9JTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6RklMVEVSX1BPSU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0xJTkVBUjoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpGSUxURVJfTElORUFSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0FOSVNPVFJPUElDOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9BTklTT1RST1BJQyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9QWVJBTUlEQUxRVUFEOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9MSU5FQVIpOyAgIC8vIEZJWE1FOiBVbmltcGxlbWVudGVkLCBmYWlsIHNpbGVudGx5Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9HQVVTU0lBTlFVQUQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6RklMVEVSX0xJTkVBUik7ICAgLy8gRklYTUU6IFVuaW1wbGVtZW50ZWQsIGZhaWwgc2lsZW50bHkKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCQkJfTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEU0FNUF9NSU5GSUxURVI6Ci0JCQkJLy8gTk9URTogU3dpZnRTaGFkZXIgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1pbmlmaWNhdGlvbiBhbmQgbWFnbmlmaWNhdGlvbiBmaWx0ZXIKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEVEVYRl9OT05FOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9QT0lOVCk7ICAgLy8gRklYTUU6IE9ubHkgZm9yIG1pcG1hcCBmaWx0ZXIKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX1BPSU5UOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9QT0lOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9MSU5FQVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6RklMVEVSX0xJTkVBUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9BTklTT1RST1BJQzoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpGSUxURVJfQU5JU09UUk9QSUMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRFWEZfUFlSQU1JREFMUVVBRDoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpGSUxURVJfTElORUFSKTsgICAvLyBGSVhNRTogVW5pbXBsZW1lbnRlZCwgZmFpbCBzaWxlbnRseQotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRFWEZfR0FVU1NJQU5RVUFEOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcih0eXBlLCBpbmRleCwgc3c6OkZJTFRFUl9MSU5FQVIpOyAgIC8vIEZJWE1FOiBVbmltcGxlbWVudGVkLCBmYWlsIHNpbGVudGx5Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQkJCX07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFNBTVBfTUlQRklMVEVSOgotCQkJCXN3aXRjaCh2YWx1ZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RURVhGX05PTkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpNSVBNQVBfTk9ORSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9QT0lOVDoKLQkJCQkJcmVuZGVyZXItPnNldE1pcG1hcEZpbHRlcih0eXBlLCBpbmRleCwgc3c6Ok1JUE1BUF9QT0lOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9MSU5FQVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpNSVBNQVBfTElORUFSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RURVhGX0FOSVNPVFJPUElDOgotCQkJCQlyZW5kZXJlci0+c2V0TWlwbWFwRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6TUlQTUFQX0xJTkVBUik7ICAgLy8gRklYTUU6IE9ubHkgZm9yIHRleHR1cmUgZmlsdGVyCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9QWVJBTUlEQUxRVUFEOgotCQkJCQlyZW5kZXJlci0+c2V0TWlwbWFwRmlsdGVyKHR5cGUsIGluZGV4LCBzdzo6TUlQTUFQX0xJTkVBUik7ICAgLy8gRklYTUU6IE9ubHkgZm9yIHRleHR1cmUgZmlsdGVyCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEVYRl9HQVVTU0lBTlFVQUQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIodHlwZSwgaW5kZXgsIHN3OjpNSVBNQVBfTElORUFSKTsgICAvLyBGSVhNRTogT25seSBmb3IgdGV4dHVyZSBmaWx0ZXIKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCQkJfTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEU0FNUF9NSVBNQVBMT0RCSUFTOgotCQkJCWlmKHZhbHVlID09IEQzREZNVF9HRVQ0KSAgIC8vIEFUSSBoYWNrIHRvIGVuYWJsZSBGZXRjaDQKLQkJCQl7Ci0JCQkJCXJlbmRlcmVyLT5zZXRHYXRoZXJFbmFibGUodHlwZSwgaW5kZXgsIHRydWUpOwotCQkJCX0KLQkJCQllbHNlIGlmKHZhbHVlID09IEQzREZNVF9HRVQxKSAgIC8vIEFUSSBoYWNrIHRvIGRpc2FibGUgRmV0Y2g0Ci0JCQkJewotCQkJCQlyZW5kZXJlci0+c2V0R2F0aGVyRW5hYmxlKHR5cGUsIGluZGV4LCBmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWZsb2F0IExPRCA9IChmbG9hdCYpdmFsdWUgLSBzdzo6bG9nMigoZmxvYXQpY29udGV4dC0+cmVuZGVyVGFyZ2V0WzBdLT5nZXRTdXBlclNhbXBsZUNvdW50KCkpOyAgIC8vIEZJWE1FOiBVcGRhdGUgd2hlbiByZW5kZXIgdGFyZ2V0IGNoYW5nZXMKLQkJCQkJcmVuZGVyZXItPnNldE1pcG1hcExPRCh0eXBlLCBpbmRleCwgTE9EKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFNBTVBfTUFYTUlQTEVWRUw6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFNBTVBfTUFYQU5JU09UUk9QWToKLQkJCQlyZW5kZXJlci0+c2V0TWF4QW5pc290cm9weSh0eXBlLCBpbmRleCwgc3c6OmNsYW1wKCh1bnNpZ25lZCBpbnQpdmFsdWUsICh1bnNpZ25lZCBpbnQpMSwgbWF4QW5pc290cm9weSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RTQU1QX1NSR0JURVhUVVJFOgotCQkJCXJlbmRlcmVyLT5zZXRSZWFkU1JHQih0eXBlLCBpbmRleCwgdmFsdWUgIT0gRkFMU0UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RTQU1QX0VMRU1FTlRJTkRFWDoKLQkJCQlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIE11bHRpLWVsZW1lbnQgdGV4dHVyZXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBtdWx0aXBsZSByZW5kZXIgdGFyZ2V0cwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RTQU1QX0RNQVBPRkZTRVQ6Ci0JCQkvLwlpZighaW5pdCkgVU5JTVBMRU1FTlRFRCgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgICAvLyBzdGF0ZVJlY29yZGVyCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFNhbXBsZXJTdGF0ZShzYW1wbGVyLCBzdGF0ZSwgdmFsdWUpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0U2Npc3NvclJlY3QoY29uc3QgUkVDVCAqcmVjdCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiY29uc3QgUkVDVCAqcmVjdCA9IDB4JTAuOHAiLCByZWN0KTsKLQotCQlpZighcmVjdCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZighc3RhdGVSZWNvcmRlcikKLQkJewotCQkJc2Npc3NvclJlY3QgPSAqcmVjdDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFNjaXNzb3JSZWN0KHJlY3QpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0U29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nKGludCBzb2Z0d2FyZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiaW50IHNvZnR3YXJlID0gJWQiLCBzb2Z0d2FyZSk7Ci0KLQkJaWYoYmVoYXZpb3VyRmxhZ3MgJiBEM0RDUkVBVEVfU09GVFdBUkVfVkVSVEVYUFJPQ0VTU0lORyAmJiBzb2Z0d2FyZSA9PSBGQUxTRSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZihiZWhhdmlvdXJGbGFncyAmIEQzRENSRUFURV9IQVJEV0FSRV9WRVJURVhQUk9DRVNTSU5HICYmIHNvZnR3YXJlID09IFRSVUUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJc29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nID0gKHNvZnR3YXJlICE9IEZBTFNFKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqaVZlcnRleEJ1ZmZlciwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHN0cmlkZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0cmVhbSA9ICVkLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IG9mZnNldCA9ICVkLCB1bnNpZ25lZCBpbnQgc3RyaWRlID0gJWQiLCBzdHJlYW0sIGlWZXJ0ZXhCdWZmZXIsIG9mZnNldCwgc3RyaWRlKTsKLQotCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKnZlcnRleEJ1ZmZlciA9IHN0YXRpY19jYXN0PERpcmVjdDNEVmVydGV4QnVmZmVyOSo+KGlWZXJ0ZXhCdWZmZXIpOwotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlpZihkYXRhU3RyZWFtW3N0cmVhbV0gPT0gdmVydGV4QnVmZmVyICYmIHN0cmVhbU9mZnNldFtzdHJlYW1dID09IG9mZnNldCAmJiBzdHJlYW1TdHJpZGVbc3RyZWFtXSA9PSBzdHJpZGUpCi0JCQl7Ci0JCQkJcmV0dXJuIEQzRF9PSzsKLQkJCX0KLQotCQkJaWYodmVydGV4QnVmZmVyKQotCQkJewotCQkJCXZlcnRleEJ1ZmZlci0+YmluZCgpOwotCQkJfQotCi0JCQlpZihkYXRhU3RyZWFtW3N0cmVhbV0pCi0JCQl7Ci0JCQkJZGF0YVN0cmVhbVtzdHJlYW1dLT51bmJpbmQoKTsKLQkJCX0KLQotCQkJZGF0YVN0cmVhbVtzdHJlYW1dID0gdmVydGV4QnVmZmVyOwotCQkJc3RyZWFtT2Zmc2V0W3N0cmVhbV0gPSBvZmZzZXQ7Ci0JCQlzdHJlYW1TdHJpZGVbc3RyZWFtXSA9IHN0cmlkZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFN0cmVhbVNvdXJjZShzdHJlYW0sIHZlcnRleEJ1ZmZlciwgb2Zmc2V0LCBzdHJpZGUpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0U3RyZWFtU291cmNlRnJlcSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCB1bnNpZ25lZCBpbnQgZGl2aWRlcikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0cmVhbU51bWJlciA9ICVkLCB1bnNpZ25lZCBpbnQgZGl2aWRlciA9ICVkIiwgc3RyZWFtTnVtYmVyLCBkaXZpZGVyKTsKLQotCQlpZighaW5zdGFuY2luZ0VuYWJsZWQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCXN0cmVhbVNvdXJjZUZyZXFbc3RyZWFtTnVtYmVyXSA9IGRpdmlkZXI7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLT5zZXRTdHJlYW1Tb3VyY2VGcmVxKHN0cmVhbU51bWJlciwgZGl2aWRlcik7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgc2FtcGxlciwgSURpcmVjdDNEQmFzZVRleHR1cmU5ICppQmFzZVRleHR1cmUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc2FtcGxlciA9ICVkLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmUgPSAweCUwLjhwIiwgc2FtcGxlciwgaUJhc2VUZXh0dXJlKTsKLQotCQlpZigoc2FtcGxlciA+PSAxNiAmJiBzYW1wbGVyIDw9IEQzRERNQVBTQU1QTEVSKSB8fCBzYW1wbGVyID4gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKHNhbXBsZXIgPj0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwKQotCQl7Ci0JCQlzYW1wbGVyID0gMTYgKyAoc2FtcGxlciAtIEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCk7Ci0JCX0KLQotCQlEaXJlY3QzREJhc2VUZXh0dXJlOSAqYmFzZVRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RCYXNlVGV4dHVyZTkqPihpQmFzZVRleHR1cmUpOwotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlpZih0ZXh0dXJlW3NhbXBsZXJdID09IGJhc2VUZXh0dXJlKQotCQkJewotCQkJCXJldHVybiBEM0RfT0s7Ci0JCQl9Ci0KLQkJCWlmKGJhc2VUZXh0dXJlKQotCQkJewotCQkJCWJhc2VUZXh0dXJlLT5iaW5kKCk7ICAgLy8gRklYTUU6IEJpbmQgaW5kaXZpZHVhbCBzdWItc3VyZmFjZXM/Ci0JCQl9Ci0KLQkJCWlmKHRleHR1cmVbc2FtcGxlcl0pCi0JCQl7Ci0JCQkJdGV4dHVyZVtzYW1wbGVyXS0+dW5iaW5kKCk7Ci0JCQl9Ci0KLQkJCXRleHR1cmVbc2FtcGxlcl0gPSBiYXNlVGV4dHVyZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFRleHR1cmUoc2FtcGxlciwgYmFzZVRleHR1cmUpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0VGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc3RhZ2UgPSAlZCwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUgPSAlZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICVkIiwgc3RhZ2UsIHR5cGUsIHZhbHVlKTsKLQotCQlpZihzdGFnZSA8IDAgfHwgc3RhZ2UgPj0gOCB8fCB0eXBlIDwgRDNEVFNTX0NPTE9ST1AgfHwgdHlwZSA+IEQzRFRTU19DT05TVEFOVCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZighc3RhdGVSZWNvcmRlcikKLQkJewotCQkJaWYoIWluaXQgJiYgdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3R5cGVdID09IHZhbHVlKQotCQkJewotCQkJCXJldHVybiBEM0RfT0s7Ci0JCQl9Ci0KLQkJCXRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVt0eXBlXSA9IHZhbHVlOwotCi0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCWNhc2UgRDNEVFNTX0NPTE9ST1A6Ci0JCQkJc3dpdGNoKHZhbHVlKQotCQkJCXsKLQkJCQljYXNlIEQzRFRPUF9ESVNBQkxFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcxOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcyOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9NT0RVTEFURToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFMlg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUyWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFNFg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEU0WCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0FERDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BREQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9BRERTSUdORUQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEMlg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEMlgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9TVUJUUkFDVDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9TVUJUUkFDVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0FERFNNT09USDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTTU9PVEgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORERJRkZVU0VBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRGQUNUT1JBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQVBNKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRDVVJSRU5UQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9QUkVNT0RVTEFURToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVBTFBIQV9BRERDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQ09MT1JfQUREQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0JVTVBFTlZNQVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0RPVFBST0RVQ1QzOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0RPVDMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9NVUxUSVBMWUFERDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NVUxUSVBMWUFERCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0xFUlA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTEVSUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQ09MT1JBUkcxOgotCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFWFRVUkU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9TUEVDVUxBUjoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9TUEVDVUxBUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEVNUDoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DT05TVEFOVDoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DT05TVEFOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCi0JCQkJc3dpdGNoKHZhbHVlICYgfkQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQgfCBEM0RUQV9BTFBIQVJFUExJQ0FURToKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19DT0xPUkFSRzI6Ci0JCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQV9ESUZGVVNFOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URVhUVVJFOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URkFDVE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URkFDVE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9TUEVDVUxBUjoKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NPTlNUQU5UOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DT05TVEFOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCi0JCQkJc3dpdGNoKHZhbHVlICYgfkQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgMDoKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQUxQSEFSRVBMSUNBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQgfCBEM0RUQV9BTFBIQVJFUExJQ0FURToKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQUxQSEFPUDoKLQkJCQlzd2l0Y2godmFsdWUpCi0JCQkJewotCQkJCWNhc2UgRDNEVE9QX0RJU0FCTEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9ESVNBQkxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfU0VMRUNUQVJHMToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NFTEVDVEFSRzEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcyOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9NT0RVTEFURTJYOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEUyWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFNFg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTRYKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQUREOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQUREU0lHTkVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQUREU0lHTkVEMlg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQyWCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX1NVQlRSQUNUOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU1VCVFJBQ1QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9BRERTTU9PVEg6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTTU9PVEgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5ERElGRlVTRUFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORFRFWFRVUkVBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVOREZBQ1RPUkFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBUE0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9CTEVORENVUlJFTlRBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EQ1VSUkVOVEFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfUFJFTU9EVUxBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9QUkVNT0RVTEFURSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUFMUEhBX0FERENPTE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQToKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQ09MT1JfQUREQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEE6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUT1BfQlVNUEVOVk1BUDoKLQkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JVTVBFTlZNQVApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUExVTUlOQU5DRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX0RPVFBST0RVQ1QzOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfRE9UMyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVE9QX01VTFRJUExZQUREOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTVVMVElQTFlBREQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRPUF9MRVJQOgotCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTEVSUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQUxQSEFBUkcxOgotCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URVhUVVJFOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DT05TVEFOVDoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19BTFBIQUFSRzI6Ci0JCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQV9ESUZGVVNFOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ1VSUkVOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEVYVFVSRToKLQkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URkFDVE9SOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1NQRUNVTEFSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URU1QOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NPTlNUQU5UOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQ09MT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQUxQSEFSRVBMSUNBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQUxQSEEpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0JVTVBFTlZNQVQwMDoKLQkJCQlyZW5kZXJlci0+c2V0QnVtcG1hcE1hdHJpeChzdGFnZSwgMCwgKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19CVU1QRU5WTUFUMDE6Ci0JCQkJcmVuZGVyZXItPnNldEJ1bXBtYXBNYXRyaXgoc3RhZ2UsIDEsIChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQlVNUEVOVk1BVDEwOgotCQkJCXJlbmRlcmVyLT5zZXRCdW1wbWFwTWF0cml4KHN0YWdlLCAyLCAoZmxvYXQmKXZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0JVTVBFTlZNQVQxMToKLQkJCQlyZW5kZXJlci0+c2V0QnVtcG1hcE1hdHJpeChzdGFnZSwgMywgKGZsb2F0Jil2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19URVhDT09SRElOREVYOgotCQkJCXJlbmRlcmVyLT5zZXRUZXhDb29yZEluZGV4KHN0YWdlLCB2YWx1ZSAmIDB4MDAwMEZGRkYpOwotCi0JCQkJc3dpdGNoKHZhbHVlICYgMHhGRkZGMDAwMCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUU1NfVENJX1BBU1NUSFJVOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6VEVYR0VOX1BBU1NUSFJVKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUU1NfVENJX0NBTUVSQVNQQUNFTk9STUFMOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4Q29vcmRJbmRleChzdGFnZSwgc3RhZ2UpOwotCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6VEVYR0VOX05PUk1BTCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVBPU0lUSU9OOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4Q29vcmRJbmRleChzdGFnZSwgc3RhZ2UpOwotCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6VEVYR0VOX1BPU0lUSU9OKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUU1NfVENJX0NBTUVSQVNQQUNFUkVGTEVDVElPTlZFQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldFRleENvb3JkSW5kZXgoc3RhZ2UsIHN0YWdlKTsKLQkJCQkJcmVuZGVyZXItPnNldFRleEdlbihzdGFnZSwgc3c6OlRFWEdFTl9SRUZMRUNUSU9OKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUU1NfVENJX1NQSEVSRU1BUDoKLQkJCQkJcmVuZGVyZXItPnNldFRleENvb3JkSW5kZXgoc3RhZ2UsIHN0YWdlKTsKLQkJCQkJcmVuZGVyZXItPnNldFRleEdlbihzdGFnZSwgc3c6OlRFWEdFTl9TUEhFUkVNQVApOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0JVTVBFTlZMU0NBTEU6Ci0JCQkJcmVuZGVyZXItPnNldEx1bWluYW5jZVNjYWxlKHN0YWdlLCAoZmxvYXQmKXZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNTX0JVTVBFTlZMT0ZGU0VUOgotCQkJCXJlbmRlcmVyLT5zZXRMdW1pbmFuY2VPZmZzZXQoc3RhZ2UsIChmbG9hdCYpdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTOgotCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUVEZGX1BST0pFQ1RFRCkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUVEZGX0RJU0FCTEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlVHJhbnNmb3JtKHN0YWdlLCAwLCAodmFsdWUgJiBEM0RUVEZGX1BST0pFQ1RFRCkgPT0gRDNEVFRGRl9QUk9KRUNURUQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRURkZfQ09VTlQxOgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVRyYW5zZm9ybShzdGFnZSwgMSwgKHZhbHVlICYgRDNEVFRGRl9QUk9KRUNURUQpID09IEQzRFRURkZfUFJPSkVDVEVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUVEZGX0NPVU5UMjoKLQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVUcmFuc2Zvcm0oc3RhZ2UsIDIsICh2YWx1ZSAmIEQzRFRURkZfUFJPSkVDVEVEKSA9PSBEM0RUVEZGX1BST0pFQ1RFRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVFRGRl9DT1VOVDM6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlVHJhbnNmb3JtKHN0YWdlLCAzLCAodmFsdWUgJiBEM0RUVEZGX1BST0pFQ1RFRCkgPT0gRDNEVFRGRl9QUk9KRUNURUQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRURkZfQ09VTlQ0OgotCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVRyYW5zZm9ybShzdGFnZSwgNCwgKHZhbHVlICYgRDNEVFRGRl9QUk9KRUNURUQpID09IEQzRFRURkZfUFJPSkVDVEVEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19DT0xPUkFSRzA6Ci0JCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0RJRkZVU0U6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfU1BFQ1VMQVI6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVNUCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEVYVFVSRToKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URkFDVE9SOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQotCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUQV9TRUxFQ1RNQVNLKQotCQkJCXsKLQkJCQljYXNlIDA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkNPTE9SKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9BTFBIQVJFUExJQ0FURToKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0FMUEhBKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UIHwgRDNEVEFfQUxQSEFSRVBMSUNBVEU6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfQUxQSEFBUkcwOgotCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9URVhUVVJFOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RUQV9DT05TVEFOVDoKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NPTlNUQU5UKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKLQkJCQl7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKLQkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgotCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCUFTU0VSVChmYWxzZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU1NfUkVTVUxUQVJHOgotCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCi0JCQkJewotCQkJCWNhc2UgRDNEVEFfQ1VSUkVOVDoKLQkJCQkJcmVuZGVyZXItPnNldERlc3RpbmF0aW9uQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OkRFU1RJTkFUSU9OX0NVUlJFTlQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRFRBX1RFTVA6Ci0JCQkJCXJlbmRlcmVyLT5zZXREZXN0aW5hdGlvbkFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpERVNUSU5BVElPTl9URU1QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJQVNTRVJUKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTU19DT05TVEFOVDoKLQkJCQlyZW5kZXJlci0+c2V0Q29uc3RhbnRDb2xvcihzdGFnZSwgdmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgICAvLyBzdGF0ZVJlY29yZGVyCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCB0eXBlLCB2YWx1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlID0gJWQsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4ID0gMHglMC44cCIsIHN0YXRlLCBtYXRyaXgpOwotCi0JCWlmKCFtYXRyaXgpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCXRoaXMtPm1hdHJpeFtzdGF0ZV0gPSAqbWF0cml4OwotCi0JCQlzdzo6TWF0cml4IE0obWF0cml4LT5fMTEsIG1hdHJpeC0+XzIxLCBtYXRyaXgtPl8zMSwgbWF0cml4LT5fNDEsCi0JCQkgICAgICAgICAgICAgbWF0cml4LT5fMTIsIG1hdHJpeC0+XzIyLCBtYXRyaXgtPl8zMiwgbWF0cml4LT5fNDIsCi0JCQkgICAgICAgICAgICAgbWF0cml4LT5fMTMsIG1hdHJpeC0+XzIzLCBtYXRyaXgtPl8zMywgbWF0cml4LT5fNDMsCi0JCQkgICAgICAgICAgICAgbWF0cml4LT5fMTQsIG1hdHJpeC0+XzI0LCBtYXRyaXgtPl8zNCwgbWF0cml4LT5fNDQpOwotCi0JCQlzd2l0Y2goc3RhdGUpCi0JCQl7Ci0JCQljYXNlIEQzRFRTX1dPUkxEOgotCQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfVklFVzoKLQkJCQlyZW5kZXJlci0+c2V0Vmlld01hdHJpeChNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfUFJPSkVDVElPTjoKLQkJCQlyZW5kZXJlci0+c2V0UHJvamVjdGlvbk1hdHJpeChNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfVEVYVFVSRTA6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMCwgTSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTX1RFWFRVUkUxOgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDEsIE0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU19URVhUVVJFMjoKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgyLCBNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfVEVYVFVSRTM6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMywgTSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTX1RFWFRVUkU0OgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDQsIE0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RUU19URVhUVVJFNToKLQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg1LCBNKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEVFNfVEVYVFVSRTY6Ci0JCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNiwgTSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFRTX1RFWFRVUkU3OgotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDcsIE0pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZihzdGF0ZSA+IDI1NiAmJiBzdGF0ZSA8IDUxMikKLQkJCQl7Ci0JCQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChNLCBzdGF0ZSAtIDI1Nik7Ci0JCQkJfQotCQkJCWVsc2UgQVNTRVJUKGZhbHNlKTsKLQkJCX0KLQkJfQotCQllbHNlICAgLy8gc3RhdGVSZWNvcmRlcgotCQl7Ci0JCQlzdGF0ZVJlY29yZGVyLT5zZXRUcmFuc2Zvcm0oc3RhdGUsIG1hdHJpeCk7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmlWZXJ0ZXhEZWNsYXJhdGlvbikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsYXJhdGlvbiA9IDB4JTAuOHAiLCBpVmVydGV4RGVjbGFyYXRpb24pOwotCi0JCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICp2ZXJ0ZXhEZWNsYXJhdGlvbiA9IHN0YXRpY19jYXN0PERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Kj4oaVZlcnRleERlY2xhcmF0aW9uKTsKLQotCQlpZighc3RhdGVSZWNvcmRlcikKLQkJewotCQkJaWYodGhpcy0+dmVydGV4RGVjbGFyYXRpb24gPT0gdmVydGV4RGVjbGFyYXRpb24pCi0JCQl7Ci0JCQkJcmV0dXJuIEQzRF9PSzsKLQkJCX0KLQotCQkJaWYodmVydGV4RGVjbGFyYXRpb24pCi0JCQl7Ci0JCQkJdmVydGV4RGVjbGFyYXRpb24tPmJpbmQoKTsKLQkJCX0KLQotCQkJaWYodGhpcy0+dmVydGV4RGVjbGFyYXRpb24pCi0JCQl7Ci0JCQkJdGhpcy0+dmVydGV4RGVjbGFyYXRpb24tPnVuYmluZCgpOwotCQkJfQotCi0JCQl0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbiA9IHZlcnRleERlY2xhcmF0aW9uOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci0+c2V0VmVydGV4RGVjbGFyYXRpb24odmVydGV4RGVjbGFyYXRpb24pOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKmlWZXJ0ZXhTaGFkZXIpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnNoYWRlciA9IDB4JTAuOHAiLCBpVmVydGV4U2hhZGVyKTsKLQotCQlEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnZlcnRleFNoYWRlciA9IHN0YXRpY19jYXN0PERpcmVjdDNEVmVydGV4U2hhZGVyOSo+KGlWZXJ0ZXhTaGFkZXIpOwotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlpZih0aGlzLT52ZXJ0ZXhTaGFkZXIgPT0gdmVydGV4U2hhZGVyKQotCQkJewotCQkJCXJldHVybiBEM0RfT0s7Ci0JCQl9Ci0KLQkJCWlmKHZlcnRleFNoYWRlcikKLQkJCXsKLQkJCQl2ZXJ0ZXhTaGFkZXItPmJpbmQoKTsKLQkJCX0KLQotCQkJaWYodGhpcy0+dmVydGV4U2hhZGVyKQotCQkJewotCQkJCXRoaXMtPnZlcnRleFNoYWRlci0+dW5iaW5kKCk7Ci0JCQl9Ci0KLQkJCXRoaXMtPnZlcnRleFNoYWRlciA9IHZlcnRleFNoYWRlcjsKLQkJCXZlcnRleFNoYWRlckRpcnR5ID0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFZlcnRleFNoYWRlcih2ZXJ0ZXhTaGFkZXIpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJaWYoIWNvbnN0YW50RGF0YSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZighc3RhdGVSZWNvcmRlcikKLQkJewotCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50ICYmIHN0YXJ0UmVnaXN0ZXIgKyBpIDwgMTY7IGkrKykKLQkJCXsKLQkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudEJbc3RhcnRSZWdpc3RlciArIGldID0gY29uc3RhbnREYXRhW2ldOwotCQkJfQotCi0JCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudHNCRGlydHkgPSBzdzo6bWF4KHN0YXJ0UmVnaXN0ZXIgKyBjb3VudCwgdmVydGV4U2hhZGVyQ29uc3RhbnRzQkRpcnR5KTsKLQkJCXZlcnRleFNoYWRlckRpcnR5ID0gdHJ1ZTsgICAvLyBSZWxvYWQgREVGIGNvbnN0YW50cwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQotCQlpZighY29uc3RhbnREYXRhKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQgJiYgc3RhcnRSZWdpc3RlciArIGkgPCBNQVhfVkVSVEVYX1NIQURFUl9DT05TVDsgaSsrKQotCQkJewotCQkJCXZlcnRleFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bMF0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAwXTsKLQkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbc3RhcnRSZWdpc3RlciArIGldWzFdID0gY29uc3RhbnREYXRhW2kgKiA0ICsgMV07Ci0JCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDJdOwotCQkJCXZlcnRleFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyICsgaV1bM10gPSBjb25zdGFudERhdGFbaSAqIDQgKyAzXTsKLQkJCX0KLQotCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRzRkRpcnR5ID0gc3c6Om1heChzdGFydFJlZ2lzdGVyICsgY291bnQsIHZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eSk7Ci0JCQl2ZXJ0ZXhTaGFkZXJEaXJ0eSA9IHRydWU7ICAgLy8gUmVsb2FkIERFRiBjb25zdGFudHMKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFZlcnRleFNoYWRlckNvbnN0YW50RihzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlNldFZlcnRleFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgY29uc3QgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCi0JCWlmKCFjb25zdGFudERhdGEpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoIXN0YXRlUmVjb3JkZXIpCi0JCXsKLQkJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudCAmJiBzdGFydFJlZ2lzdGVyICsgaSA8IDE2OyBpKyspCi0JCQl7Ci0JCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVswXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDBdOwotCQkJCXZlcnRleFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyICsgaV1bMV0gPSBjb25zdGFudERhdGFbaSAqIDQgKyAxXTsKLQkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudElbc3RhcnRSZWdpc3RlciArIGldWzJdID0gY29uc3RhbnREYXRhW2kgKiA0ICsgMl07Ci0JCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRJW3N0YXJ0UmVnaXN0ZXIgKyBpXVszXSA9IGNvbnN0YW50RGF0YVtpICogNCArIDNdOwotCQkJfQotCi0JCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudHNJRGlydHkgPSBzdzo6bWF4KHN0YXJ0UmVnaXN0ZXIgKyBjb3VudCwgdmVydGV4U2hhZGVyQ29uc3RhbnRzSURpcnR5KTsKLQkJCXZlcnRleFNoYWRlckRpcnR5ID0gdHJ1ZTsgICAvLyBSZWxvYWQgREVGIGNvbnN0YW50cwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhdGVSZWNvcmRlci0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6U2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCA9IDB4JTAuOHAiLCB2aWV3cG9ydCk7Ci0KLQkJaWYoIXZpZXdwb3J0KSAgIC8vIEZJWE1FOiBDaGVjayBpZiB2YWxpZAotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWlmKCFzdGF0ZVJlY29yZGVyKQotCQl7Ci0JCQl0aGlzLT52aWV3cG9ydCA9ICp2aWV3cG9ydDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN0YXRlUmVjb3JkZXItPnNldFZpZXdwb3J0KHZpZXdwb3J0KTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JaW50IERpcmVjdDNERGV2aWNlOTo6U2hvd0N1cnNvcihpbnQgc2hvdykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgiaW50IHNob3cgPSAlZCIsIHNob3cpOwotCi0JCWludCBvbGRWYWx1ZSA9IHNob3dDdXJzb3IgPyBUUlVFIDogRkFMU0U7Ci0JCXNob3dDdXJzb3IgPSBzaG93ICE9IEZBTFNFOwotCi0JCWlmKHNob3dDdXJzb3IpCi0JCXsKLQkJCXN3OjpGcmFtZUJ1ZmZlcjo6c2V0Q3Vyc29ySW1hZ2UoY3Vyc29yKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN3OjpGcmFtZUJ1ZmZlcjo6c2V0Q3Vyc29ySW1hZ2UoMCk7Ci0JCX0KLQotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlN0cmV0Y2hSZWN0KElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlID0gMHglMC44cCwgY29uc3QgUkVDVCAqc291cmNlUmVjdCA9IDB4JTAuOHAsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0U3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0ID0gMHglMC44cCwgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyID0gJWQiLCBzb3VyY2VTdXJmYWNlLCBzb3VyY2VSZWN0LCBkZXN0U3VyZmFjZSwgZGVzdFJlY3QsIGZpbHRlcik7Ci0KLQkJaWYoIXNvdXJjZVN1cmZhY2UgfHwgIWRlc3RTdXJmYWNlIHx8ICF2YWxpZFJlY3RhbmdsZShzb3VyY2VSZWN0LCBzb3VyY2VTdXJmYWNlKSB8fCAhdmFsaWRSZWN0YW5nbGUoZGVzdFJlY3QsIGRlc3RTdXJmYWNlKSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlEM0RTVVJGQUNFX0RFU0Mgc291cmNlRGVzY3JpcHRpb247Ci0JCUQzRFNVUkZBQ0VfREVTQyBkZXN0RGVzY3JpcHRpb247Ci0KLQkJc291cmNlU3VyZmFjZS0+R2V0RGVzYygmc291cmNlRGVzY3JpcHRpb24pOwotCQlkZXN0U3VyZmFjZS0+R2V0RGVzYygmZGVzdERlc2NyaXB0aW9uKTsKLQotCQlpZihzb3VyY2VEZXNjcmlwdGlvbi5Qb29sICE9IEQzRFBPT0xfREVGQVVMVCB8fCBkZXN0RGVzY3JpcHRpb24uUG9vbCAhPSBEM0RQT09MX0RFRkFVTFQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRGlyZWN0M0RTdXJmYWNlOSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KHNvdXJjZVN1cmZhY2UpOwotCQlEaXJlY3QzRFN1cmZhY2U5ICpkZXN0ID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KGRlc3RTdXJmYWNlKTsKLQotCQlzdHJldGNoUmVjdChzb3VyY2UsIHNvdXJjZVJlY3QsIGRlc3QsIGRlc3RSZWN0LCBmaWx0ZXIpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlRlc3RDb29wZXJhdGl2ZUxldmVsKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidm9pZCIpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlVwZGF0ZVN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UsIGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0aW5hdGlvblN1cmZhY2UsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlID0gMHglMC44cCwgY29uc3QgUkVDVCAqc291cmNlUmVjdCA9IDB4JTAuOHAsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0aW5hdGlvblN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50ID0gMHglMC44cCIsIHNvdXJjZVN1cmZhY2UsIHNvdXJjZVJlY3QsIGRlc3RpbmF0aW9uU3VyZmFjZSwgZGVzdFBvaW50KTsKLQotCQlpZighc291cmNlU3VyZmFjZSB8fCAhZGVzdGluYXRpb25TdXJmYWNlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCUQzRFNVUkZBQ0VfREVTQyBzb3VyY2VEZXNjcmlwdGlvbjsKLQkJRDNEU1VSRkFDRV9ERVNDIGRlc3RpbmF0aW9uRGVzY3JpcHRpb247Ci0KLQkJc291cmNlU3VyZmFjZS0+R2V0RGVzYygmc291cmNlRGVzY3JpcHRpb24pOwotCQlkZXN0aW5hdGlvblN1cmZhY2UtPkdldERlc2MoJmRlc3RpbmF0aW9uRGVzY3JpcHRpb24pOwotCi0JCVJFQ1Qgc1JlY3Q7Ci0JCVJFQ1QgZFJlY3Q7Ci0KLQkJaWYoc291cmNlUmVjdCkKLQkJewotCQkJc1JlY3QubGVmdCA9IHNvdXJjZVJlY3QtPmxlZnQ7Ci0JCQlzUmVjdC50b3AgPSBzb3VyY2VSZWN0LT50b3A7Ci0JCQlzUmVjdC5yaWdodCA9IHNvdXJjZVJlY3QtPnJpZ2h0OwotCQkJc1JlY3QuYm90dG9tID0gc291cmNlUmVjdC0+Ym90dG9tOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc1JlY3QubGVmdCA9IDA7Ci0JCQlzUmVjdC50b3AgPSAwOwotCQkJc1JlY3QucmlnaHQgPSBzb3VyY2VEZXNjcmlwdGlvbi5XaWR0aDsKLQkJCXNSZWN0LmJvdHRvbSA9IHNvdXJjZURlc2NyaXB0aW9uLkhlaWdodDsKLQkJfQotCi0JCWlmKGRlc3RQb2ludCkKLQkJewotCQkJZFJlY3QubGVmdCA9IGRlc3RQb2ludC0+eDsKLQkJCWRSZWN0LnRvcCA9IGRlc3RQb2ludC0+eTsKLQkJCWRSZWN0LnJpZ2h0ID0gZGVzdFBvaW50LT54ICsgc1JlY3QucmlnaHQgLSBzUmVjdC5sZWZ0OwotCQkJZFJlY3QuYm90dG9tID0gZGVzdFBvaW50LT55ICsgc1JlY3QuYm90dG9tIC0gc1JlY3QudG9wOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZFJlY3QubGVmdCA9IDA7Ci0JCQlkUmVjdC50b3AgPSAwOwotCQkJZFJlY3QucmlnaHQgPSBzUmVjdC5yaWdodCAtIHNSZWN0LmxlZnQ7Ci0JCQlkUmVjdC5ib3R0b20gPSBzUmVjdC5ib3R0b20gLSBzUmVjdC50b3A7Ci0JCX0KLQotCQlpZighdmFsaWRSZWN0YW5nbGUoJnNSZWN0LCBzb3VyY2VTdXJmYWNlKSB8fCAhdmFsaWRSZWN0YW5nbGUoJmRSZWN0LCBkZXN0aW5hdGlvblN1cmZhY2UpKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWludCBzV2lkdGggPSBzUmVjdC5yaWdodCAtIHNSZWN0LmxlZnQ7Ci0JCWludCBzSGVpZ2h0ID0gc1JlY3QuYm90dG9tIC0gc1JlY3QudG9wOwotCi0JCWludCBkV2lkdGggPSBkUmVjdC5yaWdodCAtIGRSZWN0LmxlZnQ7Ci0JCWludCBkSGVpZ2h0ID0gZFJlY3QuYm90dG9tIC0gZFJlY3QudG9wOwotCi0JCWlmKHNvdXJjZURlc2NyaXB0aW9uLk11bHRpU2FtcGxlVHlwZSAgICAgICE9IEQzRE1VTFRJU0FNUExFX05PTkUgfHwKLQkJICAgZGVzdGluYXRpb25EZXNjcmlwdGlvbi5NdWx0aVNhbXBsZVR5cGUgIT0gRDNETVVMVElTQU1QTEVfTk9ORSB8fAotCQkvLyBzb3VyY2VEZXNjcmlwdGlvbi5Qb29sICAgICAgIT0gRDNEUE9PTF9TWVNURU1NRU0gfHwgICAvLyBGSVhNRTogQ2hlY2sgYmFjayBidWZmZXIgYW5kIGRlcHRoIGJ1ZmZlciBtZW1vcnkgcG9vbCBmbGFncwotCQkvLyBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLlBvb2wgIT0gRDNEUE9PTF9ERUZBVUxUIHx8Ci0JCSAgIHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCAhPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLkZvcm1hdCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlzdzo6U3VyZmFjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOSo+KHNvdXJjZVN1cmZhY2UpOwotCQlzdzo6U3VyZmFjZSAqZGVzdCA9IHN0YXRpY19jYXN0PERpcmVjdDNEU3VyZmFjZTkqPihkZXN0aW5hdGlvblN1cmZhY2UpOwotCi0JCXVuc2lnbmVkIGNoYXIgKnNCdWZmZXIgPSAodW5zaWduZWQgY2hhciopc291cmNlLT5sb2NrRXh0ZXJuYWwoc1JlY3QubGVmdCwgc1JlY3QudG9wLCAwLCBzdzo6TE9DS19SRUFET05MWSwgc3c6OlBVQkxJQyk7Ci0JCXVuc2lnbmVkIGNoYXIgKmRCdWZmZXIgPSAodW5zaWduZWQgY2hhciopZGVzdC0+bG9ja0V4dGVybmFsKGRSZWN0LmxlZnQsIGRSZWN0LnRvcCwgMCwgc3c6OkxPQ0tfV1JJVEVPTkxZLCBzdzo6UFVCTElDKTsKLQkJaW50IHNQaXRjaCA9IHNvdXJjZS0+Z2V0RXh0ZXJuYWxQaXRjaEIoKTsKLQkJaW50IGRQaXRjaCA9IGRlc3QtPmdldEV4dGVybmFsUGl0Y2hCKCk7Ci0KLQkJdW5zaWduZWQgaW50IHdpZHRoOwotCQl1bnNpZ25lZCBpbnQgaGVpZ2h0OwotCQl1bnNpZ25lZCBpbnQgYnl0ZXM7Ci0KLQkJc3dpdGNoKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCkKLQkJewotCQljYXNlIEQzREZNVF9EWFQxOgotCQljYXNlIEQzREZNVF9BVEkxOgotCQkJd2lkdGggPSAoZFdpZHRoICsgMykgLyA0OwotCQkJaGVpZ2h0ID0gKGRIZWlnaHQgKyAzKSAvIDQ7Ci0JCQlieXRlcyA9IHdpZHRoICogODsgICAvLyA2NCBiaXQgcGVyIDR4NCBibG9jawotCQkJYnJlYWs7Ci0JCWNhc2UgRDNERk1UX0RYVDI6Ci0JCWNhc2UgRDNERk1UX0RYVDM6Ci0JCWNhc2UgRDNERk1UX0RYVDQ6Ci0JCWNhc2UgRDNERk1UX0RYVDU6Ci0JCWNhc2UgRDNERk1UX0FUSTI6Ci0JCQl3aWR0aCA9IChkV2lkdGggKyAzKSAvIDQ7Ci0JCQloZWlnaHQgPSAoZEhlaWdodCArIDMpIC8gNDsKLQkJCWJ5dGVzID0gd2lkdGggKiAxNjsgICAvLyAxMjggYml0IHBlciA0eDQgYmxvY2sKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJd2lkdGggPSBkV2lkdGg7Ci0JCQloZWlnaHQgPSBkSGVpZ2h0OwotCQkJYnl0ZXMgPSB3aWR0aCAqIERpcmVjdDNEU3VyZmFjZTk6OmJ5dGVzKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCk7Ci0JCX0KLQotCQlpZihzb3VyY2VEZXNjcmlwdGlvbi5Gb3JtYXQgPT0gRDNERk1UX0FUSTEgfHwgc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ID09IEQzREZNVF9BVEkyKQotCQl7Ci0JCQkvLyBNYWtlIHRoZSBwaXRjaCBjb3JyZXNwb25kIHRvIDQgcm93cwotCQkJc1BpdGNoICo9IDQ7Ci0JCQlkUGl0Y2ggKj0gNDsKLQkJfQotCi0JCWZvcih1bnNpZ25lZCBpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKLQkJewotCQkJbWVtY3B5KGRCdWZmZXIsIHNCdWZmZXIsIGJ5dGVzKTsKLQotCQkJc0J1ZmZlciArPSBzUGl0Y2g7Ci0JCQlkQnVmZmVyICs9IGRQaXRjaDsKLQkJfQotCi0JCXNvdXJjZS0+dW5sb2NrRXh0ZXJuYWwoKTsKLQkJZGVzdC0+dW5sb2NrRXh0ZXJuYWwoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpVcGRhdGVUZXh0dXJlKElEaXJlY3QzREJhc2VUZXh0dXJlOSAqc291cmNlVGV4dHVyZSwgSURpcmVjdDNEQmFzZVRleHR1cmU5ICpkZXN0aW5hdGlvblRleHR1cmUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzREJhc2VUZXh0dXJlOSAqc291cmNlVGV4dHVyZSA9IDB4JTAuOHAsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqZGVzdGluYXRpb25UZXh0dXJlID0gMHglMC44cCIsIHNvdXJjZVRleHR1cmUsIGRlc3RpbmF0aW9uVGV4dHVyZSk7Ci0KLQkJaWYoIXNvdXJjZVRleHR1cmUgfHwgIWRlc3RpbmF0aW9uVGV4dHVyZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkvLyBGSVhNRTogQ2hlY2sgbWVtb3J5IHBvb2xzCi0KLQkJRDNEUkVTT1VSQ0VUWVBFIHR5cGUgPSBzb3VyY2VUZXh0dXJlLT5HZXRUeXBlKCk7Ci0KLQkJaWYodHlwZSAhPSBkZXN0aW5hdGlvblRleHR1cmUtPkdldFR5cGUoKSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlzd2l0Y2godHlwZSkKLQkJewotCQljYXNlIEQzRFJUWVBFX1RFWFRVUkU6Ci0JCQl7Ci0JCQkJSURpcmVjdDNEVGV4dHVyZTkgKnNvdXJjZTsKLQkJCQlJRGlyZWN0M0RUZXh0dXJlOSAqZGVzdDsKLQotCQkJCXNvdXJjZVRleHR1cmUtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGlyZWN0M0RUZXh0dXJlOSwgKHZvaWQqKikmc291cmNlKTsKLQkJCQlkZXN0aW5hdGlvblRleHR1cmUtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGlyZWN0M0RUZXh0dXJlOSwgKHZvaWQqKikmZGVzdCk7Ci0KLQkJCQlBU1NFUlQoc291cmNlICYmIGRlc3QpOwotCi0JCQkJZm9yKHVuc2lnbmVkIGludCBsZXZlbCA9IDA7IGxldmVsIDwgc291cmNlLT5HZXRMZXZlbENvdW50KCkgJiYgbGV2ZWwgPCBkZXN0LT5HZXRMZXZlbENvdW50KCk7IGxldmVsKyspICAgLy8gRklYTUU6IEZhaWwgd2hlbiBzb3VyY2UgdGV4dHVyZSBoYXMgZmV3ZXIgbGV2ZWxzIHRoYW4gdGhlIGRlc3RpbmF0aW9uCi0JCQkJewotCQkJCQlJRGlyZWN0M0RTdXJmYWNlOSAqc291cmNlU3VyZmFjZTsKLQkJCQkJSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RpbmF0aW9uU3VyZmFjZTsKLQotCQkJCQlzb3VyY2UtPkdldFN1cmZhY2VMZXZlbChsZXZlbCwgJnNvdXJjZVN1cmZhY2UpOwotCQkJCQlkZXN0LT5HZXRTdXJmYWNlTGV2ZWwobGV2ZWwsICZkZXN0aW5hdGlvblN1cmZhY2UpOwotCi0JCQkJCVVwZGF0ZVN1cmZhY2Uoc291cmNlU3VyZmFjZSwgMCwgZGVzdGluYXRpb25TdXJmYWNlLCAwKTsKLQotCQkJCQlzb3VyY2VTdXJmYWNlLT5SZWxlYXNlKCk7Ci0JCQkJCWRlc3RpbmF0aW9uU3VyZmFjZS0+UmVsZWFzZSgpOwotCQkJCX0KLQotCQkJCXNvdXJjZS0+UmVsZWFzZSgpOwotCQkJCWRlc3QtPlJlbGVhc2UoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkU6Ci0JCQl7Ci0JCQkJSURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgKnNvdXJjZTsKLQkJCQlJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqZGVzdDsKLQotCQkJCXNvdXJjZVRleHR1cmUtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSwgKHZvaWQqKikmc291cmNlKTsKLQkJCQlkZXN0aW5hdGlvblRleHR1cmUtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSwgKHZvaWQqKikmZGVzdCk7Ci0KLQkJCQlBU1NFUlQoc291cmNlICYmIGRlc3QpOwotCi0JCQkJZm9yKHVuc2lnbmVkIGludCBsZXZlbCA9IDA7IGxldmVsIDwgc291cmNlLT5HZXRMZXZlbENvdW50KCkgJiYgbGV2ZWwgPCBkZXN0LT5HZXRMZXZlbENvdW50KCk7IGxldmVsKyspICAgLy8gRklYTUU6IEZhaWwgd2hlbiBzb3VyY2UgdGV4dHVyZSBoYXMgZmV3ZXIgbGV2ZWxzIHRoYW4gdGhlIGRlc3RpbmF0aW9uCi0JCQkJewotCQkJCQlJRGlyZWN0M0RWb2x1bWU5ICpzb3VyY2VWb2x1bWU7Ci0JCQkJCUlEaXJlY3QzRFZvbHVtZTkgKmRlc3RpbmF0aW9uVm9sdW1lOwotCi0JCQkJCXNvdXJjZS0+R2V0Vm9sdW1lTGV2ZWwobGV2ZWwsICZzb3VyY2VWb2x1bWUpOwotCQkJCQlkZXN0LT5HZXRWb2x1bWVMZXZlbChsZXZlbCwgJmRlc3RpbmF0aW9uVm9sdW1lKTsKLQotCQkJCQl1cGRhdGVWb2x1bWUoc291cmNlVm9sdW1lLCBkZXN0aW5hdGlvblZvbHVtZSk7Ci0KLQkJCQkJc291cmNlVm9sdW1lLT5SZWxlYXNlKCk7Ci0JCQkJCWRlc3RpbmF0aW9uVm9sdW1lLT5SZWxlYXNlKCk7Ci0JCQkJfQotCi0JCQkJc291cmNlLT5SZWxlYXNlKCk7Ci0JCQkJZGVzdC0+UmVsZWFzZSgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRDNEUlRZUEVfQ1VCRVRFWFRVUkU6Ci0JCQl7Ci0JCQkJSURpcmVjdDNEQ3ViZVRleHR1cmU5ICpzb3VyY2U7Ci0JCQkJSURpcmVjdDNEQ3ViZVRleHR1cmU5ICpkZXN0OwotCi0JCQkJc291cmNlVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzREN1YmVUZXh0dXJlOSwgKHZvaWQqKikmc291cmNlKTsKLQkJCQlkZXN0aW5hdGlvblRleHR1cmUtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGlyZWN0M0RDdWJlVGV4dHVyZTksICh2b2lkKiopJmRlc3QpOwotCi0JCQkJQVNTRVJUKHNvdXJjZSAmJiBkZXN0KTsKLQotCQkJCWZvcihpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspCi0JCQkJewotCQkJCQlmb3IodW5zaWduZWQgaW50IGxldmVsID0gMDsgbGV2ZWwgPCBzb3VyY2UtPkdldExldmVsQ291bnQoKSAmJiBsZXZlbCA8IGRlc3QtPkdldExldmVsQ291bnQoKTsgbGV2ZWwrKykgICAvLyBGSVhNRTogRmFpbCB3aGVuIHNvdXJjZSB0ZXh0dXJlIGhhcyBmZXdlciBsZXZlbHMgdGhhbiB0aGUgZGVzdGluYXRpb24KLQkJCQkJewotCQkJCQkJSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2U7Ci0JCQkJCQlJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdGluYXRpb25TdXJmYWNlOwotCi0JCQkJCQlzb3VyY2UtPkdldEN1YmVNYXBTdXJmYWNlKChEM0RDVUJFTUFQX0ZBQ0VTKWZhY2UsIGxldmVsLCAmc291cmNlU3VyZmFjZSk7Ci0JCQkJCQlkZXN0LT5HZXRDdWJlTWFwU3VyZmFjZSgoRDNEQ1VCRU1BUF9GQUNFUylmYWNlLCBsZXZlbCwgJmRlc3RpbmF0aW9uU3VyZmFjZSk7Ci0KLQkJCQkJCVVwZGF0ZVN1cmZhY2Uoc291cmNlU3VyZmFjZSwgMCwgZGVzdGluYXRpb25TdXJmYWNlLCAwKTsKLQotCQkJCQkJc291cmNlU3VyZmFjZS0+UmVsZWFzZSgpOwotCQkJCQkJZGVzdGluYXRpb25TdXJmYWNlLT5SZWxlYXNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzb3VyY2UtPlJlbGVhc2UoKTsKLQkJCQlkZXN0LT5SZWxlYXNlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVVOSU1QTEVNRU5URUQoKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTk6OlZhbGlkYXRlRGV2aWNlKHVuc2lnbmVkIGxvbmcgKm51bVBhc3NlcykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlUUkFDRSgidW5zaWduZWQgbG9uZyAqbnVtUGFzc2VzID0gMHglMC44cCIsIG51bVBhc3Nlcyk7Ci0KLQkJaWYoIW51bVBhc3NlcykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqbnVtUGFzc2VzID0gMTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5OjpnZXRBZGFwdGVyRGlzcGxheU1vZGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERJU1BMQVlNT0RFICptb2RlKQotCXsKLQkJcmV0dXJuIGQzZDktPkdldEFkYXB0ZXJEaXNwbGF5TW9kZShhZGFwdGVyLCBtb2RlKTsKLQl9Ci0KLQlpbnQgRGlyZWN0M0REZXZpY2U5Ojp0eXBlU3RyaWRlKHVuc2lnbmVkIGNoYXIgc3RyZWFtVHlwZSkKLQl7Ci0JCXN0YXRpYyBpbnQgTFVUW10gPQotCQl7Ci0JCQk0LAkvLyBEM0RERUNMVFlQRV9GTE9BVDEgICAgPSAgMCwgIC8vIDFEIGZsb2F0IGV4cGFuZGVkIHRvICh2YWx1ZSwgMC4sIDAuLCAxLikKLQkJCTgsCS8vIEQzRERFQ0xUWVBFX0ZMT0FUMiAgICA9ICAxLCAgLy8gMkQgZmxvYXQgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgMC4sIDEuKQotCQkJMTIsCS8vIEQzRERFQ0xUWVBFX0ZMT0FUMyAgICA9ICAyLCAgLy8gM0QgZmxvYXQgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgdmFsdWUsIDEuKQotCQkJMTYsCS8vIEQzRERFQ0xUWVBFX0ZMT0FUNCAgICA9ICAzLCAgLy8gNEQgZmxvYXQKLQkJCTQsCS8vIEQzRERFQ0xUWVBFX0QzRENPTE9SICA9ICA0LCAgLy8gNEQgcGFja2VkIHVuc2lnbmVkIGJ5dGVzIG1hcHBlZCB0byAwLiB0byAxLiByYW5nZS4gSW5wdXQgaXMgaW4gRDNEQ09MT1IgZm9ybWF0IChBUkdCKSBleHBhbmRlZCB0byAoUiwgRywgQiwgQSkKLQkJCTQsCS8vIEQzRERFQ0xUWVBFX1VCWVRFNCAgICA9ICA1LCAgLy8gNEQgdW5zaWduZWQgYnl0ZQotCQkJNCwJLy8gRDNEREVDTFRZUEVfU0hPUlQyICAgID0gIDYsICAvLyAyRCBzaWduZWQgc2hvcnQgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgMC4sIDEuKQotCQkJOCwJLy8gRDNEREVDTFRZUEVfU0hPUlQ0ICAgID0gIDcsICAvLyA0RCBzaWduZWQgc2hvcnQKLQkJCTQsCS8vIEQzRERFQ0xUWVBFX1VCWVRFNE4gICA9ICA4LCAgLy8gRWFjaCBvZiA0IGJ5dGVzIGlzIG5vcm1hbGl6ZWQgYnkgZGl2aWRpbmcgdG8gMjU1LjAKLQkJCTQsCS8vIEQzRERFQ0xUWVBFX1NIT1JUMk4gICA9ICA5LCAgLy8gMkQgc2lnbmVkIHNob3J0IG5vcm1hbGl6ZWQgKHZbMF0vMzI3NjcuMCx2WzFdLzMyNzY3LjAsMCwxKQotCQkJOCwJLy8gRDNEREVDTFRZUEVfU0hPUlQ0TiAgID0gMTAsICAvLyA0RCBzaWduZWQgc2hvcnQgbm9ybWFsaXplZCAodlswXS8zMjc2Ny4wLHZbMV0vMzI3NjcuMCx2WzJdLzMyNzY3LjAsdlszXS8zMjc2Ny4wKQotCQkJNCwJLy8gRDNEREVDTFRZUEVfVVNIT1JUMk4gID0gMTEsICAvLyAyRCB1bnNpZ25lZCBzaG9ydCBub3JtYWxpemVkICh2WzBdLzY1NTM1LjAsdlsxXS82NTUzNS4wLDAsMSkKLQkJCTgsCS8vIEQzRERFQ0xUWVBFX1VTSE9SVDROICA9IDEyLCAgLy8gNEQgdW5zaWduZWQgc2hvcnQgbm9ybWFsaXplZCAodlswXS82NTUzNS4wLHZbMV0vNjU1MzUuMCx2WzJdLzY1NTM1LjAsdlszXS82NTUzNS4wKQotCQkJNCwJLy8gRDNEREVDTFRZUEVfVURFQzMgICAgID0gMTMsICAvLyAzRCB1bnNpZ25lZCAxMCAxMCAxMCBmb3JtYXQgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgdmFsdWUsIDEpCi0JCQk0LAkvLyBEM0RERUNMVFlQRV9ERUMzTiAgICAgPSAxNCwgIC8vIDNEIHNpZ25lZCAxMCAxMCAxMCBmb3JtYXQgbm9ybWFsaXplZCBhbmQgZXhwYW5kZWQgdG8gKHZbMF0vNTExLjAsIHZbMV0vNTExLjAsIHZbMl0vNTExLjAsIDEpCi0JCQk0LAkvLyBEM0RERUNMVFlQRV9GTE9BVDE2XzIgPSAxNSwgIC8vIFR3byAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCAwLCAxKQotCQkJOCwJLy8gRDNEREVDTFRZUEVfRkxPQVQxNl80ID0gMTYsICAvLyBGb3VyIDE2LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZXMKLQkJCTAsCS8vIEQzRERFQ0xUWVBFX1VOVVNFRCAgICA9IDE3LCAgLy8gV2hlbiB0aGUgdHlwZSBmaWVsZCBpbiBhIGRlY2wgaXMgdW51c2VkLgotCQl9OwotCi0JCXJldHVybiBMVVRbc3RyZWFtVHlwZV07Ci0JfQotCi0JYm9vbCBEaXJlY3QzRERldmljZTk6Omluc3RhbmNlRGF0YSgpCi0JewotCQlBU1NFUlQodmVydGV4RGVjbGFyYXRpb24pOwotCi0JCUQzRFZFUlRFWEVMRU1FTlQ5IHZlcnRleEVsZW1lbnRbTUFYRDNEREVDTExFTkdUSCArIDFdOwotCQl1bnNpZ25lZCBpbnQgbnVtRWxlbWVudHM7Ci0JCXZlcnRleERlY2xhcmF0aW9uLT5HZXREZWNsYXJhdGlvbih2ZXJ0ZXhFbGVtZW50LCAmbnVtRWxlbWVudHMpOwotCi0JCWJvb2wgaW5zdGFuY2VEYXRhID0gZmFsc2U7Ci0KLQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bUVsZW1lbnRzIC0gMTsgaSsrKQotCQl7Ci0JCQl1bnNpZ25lZCBzaG9ydCBzdHJlYW0gPSB2ZXJ0ZXhFbGVtZW50W2ldLlN0cmVhbTsKLQotCQkJaWYoc3RyZWFtICE9IDApCi0JCQl7Ci0JCQkJaW5zdGFuY2VEYXRhID0gaW5zdGFuY2VEYXRhIHx8IChzdHJlYW1Tb3VyY2VGcmVxW3N0cmVhbV0gJiBEM0RTVFJFQU1TT1VSQ0VfSU5TVEFOQ0VEQVRBKSAhPSAwOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluc3RhbmNlRGF0YTsKLQl9Ci0KLQlib29sIERpcmVjdDNERGV2aWNlOTo6YmluZFJlc291cmNlcyhEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhCdWZmZXIpCi0JewotCQlpZighYmluZFZpZXdwb3J0KCkpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsgICAvLyBaZXJvLWFyZWEgdGFyZ2V0IHJlZ2lvbgotCQl9Ci0KLQkJYmluZFRleHR1cmVzKCk7Ci0JCWJpbmRJbmRleEJ1ZmZlcihpbmRleEJ1ZmZlcik7Ci0JCWJpbmRTaGFkZXJDb25zdGFudHMoKTsKLQkJYmluZExpZ2h0cygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U5OjpiaW5kVmVydGV4U3RyZWFtcyhpbnQgYmFzZSwgYm9vbCBpbnN0YW5jaW5nLCBpbnQgaW5zdGFuY2UpCi0JewotCQlBU1NFUlQodmVydGV4RGVjbGFyYXRpb24pOwotCi0JCXJlbmRlcmVyLT5yZXNldElucHV0U3RyZWFtcyh2ZXJ0ZXhEZWNsYXJhdGlvbi0+aXNQcmVUcmFuc2Zvcm1lZCgpKTsKLQotCQlEM0RWRVJURVhFTEVNRU5UOSB2ZXJ0ZXhFbGVtZW50W01BWEQzRERFQ0xMRU5HVEggKyAxXTsKLQkJdW5zaWduZWQgaW50IG51bUVsZW1lbnRzOwotCQl2ZXJ0ZXhEZWNsYXJhdGlvbi0+R2V0RGVjbGFyYXRpb24odmVydGV4RWxlbWVudCwgJm51bUVsZW1lbnRzKTsKLQotCQkvLyBCaW5kIHZlcnRleCBkYXRhIHN0cmVhbXMKLQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bUVsZW1lbnRzIC0gMTsgaSsrKQotCQl7Ci0JCQl1bnNpZ25lZCBzaG9ydCBzdHJlYW0gPSB2ZXJ0ZXhFbGVtZW50W2ldLlN0cmVhbTsKLQkJCXVuc2lnbmVkIHNob3J0IG9mZnNldCA9IHZlcnRleEVsZW1lbnRbaV0uT2Zmc2V0OwotCQkJdW5zaWduZWQgY2hhciB0eXBlID0gdmVydGV4RWxlbWVudFtpXS5UeXBlOwotCQkJdW5zaWduZWQgY2hhciBtZXRob2QgPSB2ZXJ0ZXhFbGVtZW50W2ldLk1ldGhvZDsKLQkJCXVuc2lnbmVkIGNoYXIgdXNhZ2UgPSB2ZXJ0ZXhFbGVtZW50W2ldLlVzYWdlOwotCQkJdW5zaWduZWQgY2hhciBpbmRleCA9IHZlcnRleEVsZW1lbnRbaV0uVXNhZ2VJbmRleDsKLQotCQkJQVNTRVJUKG1ldGhvZCA9PSBEM0RERUNMTUVUSE9EX0RFRkFVTFQpOwkvLyBGSVhNRTogVW5pbXBsZW1lbnRlZAotCi0JCQlpZighZGF0YVN0cmVhbVtzdHJlYW1dKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKnN0cmVhbUJ1ZmZlciA9IGRhdGFTdHJlYW1bc3RyZWFtXTsKLQkJCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2UgPSBzdHJlYW1CdWZmZXItPmdldFJlc291cmNlKCk7Ci0JCQljb25zdCB2b2lkICpidWZmZXIgPSAoKGNoYXIqKXJlc291cmNlLT5kYXRhKCkgKyBzdHJlYW1PZmZzZXRbc3RyZWFtXSkgKyBvZmZzZXQ7Ci0KLQkJCWludCBzdHJpZGUgPSBzdHJlYW1TdHJpZGVbc3RyZWFtXTsKLQotCQkJaWYoaW5zdGFuY2luZyAmJiBzdHJlYW1Tb3VyY2VGcmVxW3N0cmVhbV0gJiBEM0RTVFJFQU1TT1VSQ0VfSU5TVEFOQ0VEQVRBKQotCQkJewotCQkJCWludCBpbnN0YW5jZUZyZXF1ZW5jeSA9IHN0cmVhbVNvdXJjZUZyZXFbc3RyZWFtXSAmIH5EM0RTVFJFQU1TT1VSQ0VfSU5TVEFOQ0VEQVRBOwotCQkJCWJ1ZmZlciA9IChjaGFyKilidWZmZXIgKyBzdHJpZGUgKiAoaW5zdGFuY2UgLyBpbnN0YW5jZUZyZXF1ZW5jeSk7Ci0KLQkJCQlzdHJpZGUgPSAwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWJ1ZmZlciA9IChjaGFyKilidWZmZXIgKyBzdHJpZGUgKiBiYXNlOwotCQkJfQotCi0JCQlzdzo6U3RyZWFtIGF0dHJpYnV0ZShyZXNvdXJjZSwgYnVmZmVyLCBzdHJpZGUpOwotCi0JCQlzd2l0Y2godHlwZSkKLQkJCXsKLQkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQxOiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAxLCBmYWxzZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQyOiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAyLCBmYWxzZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQzOiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzLCBmYWxzZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQ0OiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCA0LCBmYWxzZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfRDNEQ09MT1I6ICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0NPTE9SLCA0LCBmYWxzZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfVUJZVEU0OiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0JZVEUsIDQsIGZhbHNlKTsgICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfU0hPUlQyOiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCAyLCBmYWxzZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfU0hPUlQ0OiAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCA0LCBmYWxzZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfVUJZVEU0TjogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0JZVEUsIDQsIHRydWUpOyAgICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfU0hPUlQyTjogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCAyLCB0cnVlKTsgICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfU0hPUlQ0TjogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCA0LCB0cnVlKTsgICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfVVNIT1JUMk46ICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1VTSE9SVCwgMiwgdHJ1ZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfVVNIT1JUNE46ICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1VTSE9SVCwgNCwgdHJ1ZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfVURFQzM6ICAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1VERUMzLCAzLCBmYWxzZSk7ICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfREVDM046ICAgICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0RFQzNOLCAzLCB0cnVlKTsgICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQxNl8yOiBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0hBTEYsIDIsIGZhbHNlKTsgICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQxNl80OiBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0hBTEYsIDQsIGZhbHNlKTsgICBicmVhazsKLQkJCWNhc2UgRDNEREVDTFRZUEVfVU5VU0VEOiAgICBhdHRyaWJ1dGUuZGVmYXVsdHMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQVNTRVJUKGZhbHNlKTsKLQkJCX0KLQotCQkJaWYodmVydGV4U2hhZGVyKQotCQkJewotCQkJCWNvbnN0IHN3OjpWZXJ0ZXhTaGFkZXIgKnNoYWRlciA9IHZlcnRleFNoYWRlci0+Z2V0VmVydGV4U2hhZGVyKCk7Ci0KLQkJCQlpZighdmVydGV4RGVjbGFyYXRpb24tPmlzUHJlVHJhbnNmb3JtZWQoKSkKLQkJCQl7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBNQVhfVkVSVEVYX0lOUFVUUzsgaSsrKQotCQkJCQl7Ci0JCQkJCQljb25zdCBzdzo6U2hhZGVyOjpTZW1hbnRpYyYgaW5wdXQgPSBzaGFkZXItPmdldElucHV0KGkpOwotCQkJCQkJaWYoKHVzYWdlID09IGlucHV0LnVzYWdlKSAmJiAoaW5kZXggPT0gaW5wdXQuaW5kZXgpKQotCQkJCQkJewotCQkJCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShpLCBhdHRyaWJ1dGUpOwotCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSAgIC8vIEJpbmQgZGlyZWN0bHkgdG8gdGhlIG91dHB1dAotCQkJCXsKLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IE1BWF9WRVJURVhfT1VUUFVUUzsgaSsrKQotCQkJCQl7Ci0JCQkJCQljb25zdCBzdzo6U2hhZGVyOjpTZW1hbnRpYyYgb3V0cHV0ID0gc2hhZGVyLT5nZXRPdXRwdXQoaSwgMCk7Ci0JCQkJCQlpZigoKHVzYWdlID09IG91dHB1dC51c2FnZSkgfHwgKHVzYWdlID09IEQzRERFQ0xVU0FHRV9QT1NJVElPTlQgJiYgb3V0cHV0LnVzYWdlID09IEQzRERFQ0xVU0FHRV9QT1NJVElPTikpICYmCi0JCQkJCQkgICAoaW5kZXggPT0gb3V0cHV0LmluZGV4KSkKLQkJCQkJCXsKLQkJCQkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oaSwgYXR0cmlidXRlKTsKLQotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXN3aXRjaCh1c2FnZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RERUNMVVNBR0VfUE9TSVRJT046ICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlBvc2l0aW9uLCBhdHRyaWJ1dGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJCWNhc2UgRDNEREVDTFVTQUdFX0JMRU5EV0VJR0hUOiAgcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpCbGVuZFdlaWdodCwgYXR0cmlidXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJCQljYXNlIEQzRERFQ0xVU0FHRV9CTEVORElORElDRVM6IHJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6QmxlbmRJbmRpY2VzLCBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0lORElDRVMsIDEpKTsgYnJlYWs7Ci0JCQkJY2FzZSBEM0RERUNMVVNBR0VfTk9STUFMOiAgICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6Ok5vcm1hbCwgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9GTE9BVCwgMykpOyAgICAgICAgIGJyZWFrOwotCQkJCWNhc2UgRDNEREVDTFVTQUdFX1BTSVpFOiAgICAgICAgcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb2ludFNpemUsIGF0dHJpYnV0ZS5kZWZpbmUoc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEpKTsgICAgICBicmVhazsKLQkJCQljYXNlIEQzRERFQ0xVU0FHRV9URVhDT09SRDogICAgIHJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6VGV4Q29vcmQwICsgaW5kZXgsIGF0dHJpYnV0ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQkJY2FzZSBEM0RERUNMVVNBR0VfVEFOR0VOVDogICAgICAvKiBJZ25vcmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJCWNhc2UgRDNEREVDTFVTQUdFX0JJTk9STUFMOiAgICAgLyogSWdub3JlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJCQljYXNlIEQzRERFQ0xVU0FHRV9URVNTRkFDVE9SOiAgIFVOSU1QTEVNRU5URUQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQkJY2FzZSBEM0RERUNMVVNBR0VfUE9TSVRJT05UOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlBvc2l0aW9uVCwgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9GTE9BVCwgNCkpOyAgICAgIGJyZWFrOwotCQkJCWNhc2UgRDNEREVDTFVTQUdFX0NPTE9SOiAgICAgICAgcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpDb2xvcjAgKyBpbmRleCwgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9DT0xPUiwgNCkpOyBicmVhazsKLQkJCQljYXNlIEQzRERFQ0xVU0FHRV9GT0c6ICAgICAgICAgIC8qIElnbm9yZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQkJY2FzZSBEM0RERUNMVVNBR0VfREVQVEg6ICAgICAgICAvKiBJZ25vcmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJCWNhc2UgRDNEREVDTFVTQUdFX1NBTVBMRTogICAgICAgVU5JTVBMRU1FTlRFRCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U5OjpiaW5kSW5kZXhCdWZmZXIoRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4QnVmZmVyKQotCXsKLQkJc3c6OlJlc291cmNlICpyZXNvdXJjZSA9IDA7Ci0KLQkJaWYoaW5kZXhCdWZmZXIpCi0JCXsKLQkJCXJlc291cmNlID0gaW5kZXhCdWZmZXItPmdldFJlc291cmNlKCk7Ci0JCX0KLQotCQlyZW5kZXJlci0+c2V0SW5kZXhCdWZmZXIocmVzb3VyY2UpOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U5OjpiaW5kU2hhZGVyQ29uc3RhbnRzKCkKLQl7Ci0JCWlmKHBpeGVsU2hhZGVyRGlydHkpCi0JCXsKLQkJCWlmKHBpeGVsU2hhZGVyKQotCQkJewotCQkJCWlmKHBpeGVsU2hhZGVyQ29uc3RhbnRzQkRpcnR5KQotCQkJCXsKLQkJCQkJcmVuZGVyZXItPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKDAsIHBpeGVsU2hhZGVyQ29uc3RhbnRCLCBwaXhlbFNoYWRlckNvbnN0YW50c0JEaXJ0eSk7Ci0JCQkJfQotCi0JCQkJaWYocGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHkpCi0JCQkJewotCQkJCQlyZW5kZXJlci0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoMCwgcGl4ZWxTaGFkZXJDb25zdGFudEZbMF0sIHBpeGVsU2hhZGVyQ29uc3RhbnRzRkRpcnR5KTsKLQkJCQl9Ci0KLQkJCQlpZihwaXhlbFNoYWRlckNvbnN0YW50c0lEaXJ0eSkKLQkJCQl7Ci0JCQkJCXJlbmRlcmVyLT5zZXRQaXhlbFNoYWRlckNvbnN0YW50SSgwLCBwaXhlbFNoYWRlckNvbnN0YW50SVswXSwgcGl4ZWxTaGFkZXJDb25zdGFudHNJRGlydHkpOwotCQkJCX0KLQotCQkJCXJlbmRlcmVyLT5zZXRQaXhlbFNoYWRlcihwaXhlbFNoYWRlci0+Z2V0UGl4ZWxTaGFkZXIoKSk7ICAgLy8gTG9hZHMgc2hhZGVyIGNvbnN0YW50cyBzZXQgd2l0aCBERUYKLQkJCQlwaXhlbFNoYWRlckNvbnN0YW50c0JEaXJ0eSA9IHBpeGVsU2hhZGVyLT5nZXRQaXhlbFNoYWRlcigpLT5kaXJ0eUNvbnN0YW50c0I7ICAgLy8gU2hhZGVyIERFRidlZCBjb25zdGFudHMgYXJlIGRpcnR5Ci0JCQkJcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHkgPSBwaXhlbFNoYWRlci0+Z2V0UGl4ZWxTaGFkZXIoKS0+ZGlydHlDb25zdGFudHNGOyAgIC8vIFNoYWRlciBERUYnZWQgY29uc3RhbnRzIGFyZSBkaXJ0eQotCQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRzSURpcnR5ID0gcGl4ZWxTaGFkZXItPmdldFBpeGVsU2hhZGVyKCktPmRpcnR5Q29uc3RhbnRzSTsgICAvLyBTaGFkZXIgREVGJ2VkIGNvbnN0YW50cyBhcmUgZGlydHkKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZW5kZXJlci0+c2V0UGl4ZWxTaGFkZXIoMCk7Ci0JCQl9Ci0KLQkJCXBpeGVsU2hhZGVyRGlydHkgPSBmYWxzZTsKLQkJfQotCi0JCWlmKHZlcnRleFNoYWRlckRpcnR5KQotCQl7Ci0JCQlpZih2ZXJ0ZXhTaGFkZXIpCi0JCQl7Ci0JCQkJaWYodmVydGV4U2hhZGVyQ29uc3RhbnRzQkRpcnR5KQotCQkJCXsKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleFNoYWRlckNvbnN0YW50QigwLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudEIsIHZlcnRleFNoYWRlckNvbnN0YW50c0JEaXJ0eSk7Ci0JCQkJfQotCi0JCQkJaWYodmVydGV4U2hhZGVyQ29uc3RhbnRzRkRpcnR5KQotCQkJCXsKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleFNoYWRlckNvbnN0YW50RigwLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbMF0sIHZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eSk7Ci0JCQkJfQotCi0JCQkJaWYodmVydGV4U2hhZGVyQ29uc3RhbnRzSURpcnR5KQotCQkJCXsKLQkJCQkJcmVuZGVyZXItPnNldFZlcnRleFNoYWRlckNvbnN0YW50SSgwLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbMF0sIHZlcnRleFNoYWRlckNvbnN0YW50c0lEaXJ0eSk7Ci0JCQkJfQotCi0JCQkJcmVuZGVyZXItPnNldFZlcnRleFNoYWRlcih2ZXJ0ZXhTaGFkZXItPmdldFZlcnRleFNoYWRlcigpKTsgICAvLyBMb2FkcyBzaGFkZXIgY29uc3RhbnRzIHNldCB3aXRoIERFRgotCQkJCXZlcnRleFNoYWRlckNvbnN0YW50c0JEaXJ0eSA9IHZlcnRleFNoYWRlci0+Z2V0VmVydGV4U2hhZGVyKCktPmRpcnR5Q29uc3RhbnRzQjsgICAvLyBTaGFkZXIgREVGJ2VkIGNvbnN0YW50cyBhcmUgZGlydHkKLQkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudHNGRGlydHkgPSB2ZXJ0ZXhTaGFkZXItPmdldFZlcnRleFNoYWRlcigpLT5kaXJ0eUNvbnN0YW50c0Y7ICAgLy8gU2hhZGVyIERFRidlZCBjb25zdGFudHMgYXJlIGRpcnR5Ci0JCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRzSURpcnR5ID0gdmVydGV4U2hhZGVyLT5nZXRWZXJ0ZXhTaGFkZXIoKS0+ZGlydHlDb25zdGFudHNJOyAgIC8vIFNoYWRlciBERUYnZWQgY29uc3RhbnRzIGFyZSBkaXJ0eQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhTaGFkZXIoMCk7Ci0JCQl9Ci0KLQkJCXZlcnRleFNoYWRlckRpcnR5ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlOTo6YmluZExpZ2h0cygpCi0JewotCQlpZighbGlnaHRzRGlydHkpIHJldHVybjsKLQotCQlMaWdodHM6Oml0ZXJhdG9yIGkgPSBsaWdodC5iZWdpbigpOwotCQlpbnQgYWN0aXZlID0gMDsKLQotCQkvLyBTZXQgYW5kIGVuYWJsZSByZW5kZXJlciBsaWdodHMKLQkJd2hpbGUoYWN0aXZlIDwgOCkKLQkJewotCQkJd2hpbGUoaSAhPSBsaWdodC5lbmQoKSAmJiAhaS0+c2Vjb25kLmVuYWJsZSkKLQkJCXsKLQkJCQlpKys7Ci0JCQl9Ci0KLQkJCWlmKGkgPT0gbGlnaHQuZW5kKCkpCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNvbnN0IExpZ2h0ICZsID0gaS0+c2Vjb25kOwotCi0JCQlzdzo6UG9pbnQgcG9zaXRpb24obC5Qb3NpdGlvbi54LCBsLlBvc2l0aW9uLnksIGwuUG9zaXRpb24ueik7Ci0JCQlzdzo6Q29sb3I8ZmxvYXQ+IGRpZmZ1c2UobC5EaWZmdXNlLnIsIGwuRGlmZnVzZS5nLCBsLkRpZmZ1c2UuYiwgbC5EaWZmdXNlLmEpOwotCQkJc3c6OkNvbG9yPGZsb2F0PiBzcGVjdWxhcihsLlNwZWN1bGFyLnIsIGwuU3BlY3VsYXIuZywgbC5TcGVjdWxhci5iLCBsLlNwZWN1bGFyLmEpOwotCQkJc3c6OkNvbG9yPGZsb2F0PiBhbWJpZW50KGwuQW1iaWVudC5yLCBsLkFtYmllbnQuZywgbC5BbWJpZW50LmIsIGwuQW1iaWVudC5hKTsKLQkJCXN3OjpWZWN0b3IgZGlyZWN0aW9uKGwuRGlyZWN0aW9uLngsIGwuRGlyZWN0aW9uLnksIGwuRGlyZWN0aW9uLnopOwotCi0JCQlyZW5kZXJlci0+c2V0TGlnaHREaWZmdXNlKGFjdGl2ZSwgZGlmZnVzZSk7Ci0JCQlyZW5kZXJlci0+c2V0TGlnaHRTcGVjdWxhcihhY3RpdmUsIHNwZWN1bGFyKTsKLQkJCXJlbmRlcmVyLT5zZXRMaWdodEFtYmllbnQoYWN0aXZlLCBhbWJpZW50KTsKLQotCQkJaWYobC5UeXBlID09IEQzRExJR0hUX0RJUkVDVElPTkFMKQotCQkJewotCQkJCS8vIEZJWE1FOiBVbnN1cHBvcnRlZCwgbWFrZSBpdCBhIHBvc2l0aW9uYWwgbGlnaHQgZmFyIGF3YXkgd2l0aG91dCBmYWxsb2ZmCi0JCQkJcmVuZGVyZXItPnNldExpZ2h0UG9zaXRpb24oYWN0aXZlLCAtMWUxMGYgKiBkaXJlY3Rpb24pOwotCQkJCXJlbmRlcmVyLT5zZXRMaWdodFJhbmdlKGFjdGl2ZSwgbC5SYW5nZSk7Ci0JCQkJcmVuZGVyZXItPnNldExpZ2h0QXR0ZW51YXRpb24oYWN0aXZlLCAxLCAwLCAwKTsKLQkJCX0KLQkJCWVsc2UgaWYobC5UeXBlID09IEQzRExJR0hUX1NQT1QpCi0JCQl7Ci0JCQkJLy8gRklYTUU6IFVuc3VwcG9ydGVkLCBtYWtlIGl0IGEgcG9zaXRpb25hbCBsaWdodAotCQkJCXJlbmRlcmVyLT5zZXRMaWdodFBvc2l0aW9uKGFjdGl2ZSwgcG9zaXRpb24pOwotCQkJCXJlbmRlcmVyLT5zZXRMaWdodFJhbmdlKGFjdGl2ZSwgbC5SYW5nZSk7Ci0JCQkJcmVuZGVyZXItPnNldExpZ2h0QXR0ZW51YXRpb24oYWN0aXZlLCBsLkF0dGVudWF0aW9uMCwgbC5BdHRlbnVhdGlvbjEsIGwuQXR0ZW51YXRpb24yKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZW5kZXJlci0+c2V0TGlnaHRQb3NpdGlvbihhY3RpdmUsIHBvc2l0aW9uKTsKLQkJCQlyZW5kZXJlci0+c2V0TGlnaHRSYW5nZShhY3RpdmUsIGwuUmFuZ2UpOwotCQkJCXJlbmRlcmVyLT5zZXRMaWdodEF0dGVudWF0aW9uKGFjdGl2ZSwgbC5BdHRlbnVhdGlvbjAsIGwuQXR0ZW51YXRpb24xLCBsLkF0dGVudWF0aW9uMik7Ci0JCQl9Ci0KLQkJCXJlbmRlcmVyLT5zZXRMaWdodEVuYWJsZShhY3RpdmUsIHRydWUpOwotCi0JCQlhY3RpdmUrKzsKLQkJCWkrKzsKLQkJfQotCi0JCS8vIFJlbWFpbmluZyBsaWdodHMgYXJlIGRpc2FibGVkCi0JCXdoaWxlKGFjdGl2ZSA8IDgpCi0JCXsKLQkJCXJlbmRlcmVyLT5zZXRMaWdodEVuYWJsZShhY3RpdmUsIGZhbHNlKTsKLQotCQkJYWN0aXZlKys7Ci0JCX0KLQotCQlsaWdodHNEaXJ0eSA9IGZhbHNlOwotCX0KLQotCWJvb2wgRGlyZWN0M0REZXZpY2U5OjpiaW5kVmlld3BvcnQoKQotCXsKLQkJaWYodmlld3BvcnQuV2lkdGggPD0gMCB8fCB2aWV3cG9ydC5IZWlnaHQgPD0gMCkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYoc2Npc3NvckVuYWJsZSkKLQkJewotCQkJaWYoc2Npc3NvclJlY3QubGVmdCA+PSBzY2lzc29yUmVjdC5yaWdodCB8fCBzY2lzc29yUmVjdC50b3AgPj0gc2Npc3NvclJlY3QuYm90dG9tKQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJc3c6OlJlY3Qgc2Npc3NvcjsKLQkJCXNjaXNzb3IueDAgPSBzY2lzc29yUmVjdC5sZWZ0OwotCQkJc2Npc3Nvci54MSA9IHNjaXNzb3JSZWN0LnJpZ2h0OwotCQkJc2Npc3Nvci55MCA9IHNjaXNzb3JSZWN0LnRvcDsKLQkJCXNjaXNzb3IueTEgPSBzY2lzc29yUmVjdC5ib3R0b207Ci0KLQkJCXJlbmRlcmVyLT5zZXRTY2lzc29yKHNjaXNzb3IpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3c6OlJlY3Qgc2Npc3NvcjsKLQkJCXNjaXNzb3IueDAgPSB2aWV3cG9ydC5YOwotCQkJc2Npc3Nvci54MSA9IHZpZXdwb3J0LlggKyB2aWV3cG9ydC5XaWR0aDsKLQkJCXNjaXNzb3IueTAgPSB2aWV3cG9ydC5ZOwotCQkJc2Npc3Nvci55MSA9IHZpZXdwb3J0LlkgKyB2aWV3cG9ydC5IZWlnaHQ7Ci0KLQkJCXJlbmRlcmVyLT5zZXRTY2lzc29yKHNjaXNzb3IpOwotCQl9Ci0KLQkJc3c6OlZpZXdwb3J0IHZpZXc7Ci0JCXZpZXcueDAgPSAoZmxvYXQpdmlld3BvcnQuWDsKLQkJdmlldy55MCA9IChmbG9hdCl2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0OwotCQl2aWV3LndpZHRoID0gKGZsb2F0KXZpZXdwb3J0LldpZHRoOwotCQl2aWV3LmhlaWdodCA9IC0oZmxvYXQpdmlld3BvcnQuSGVpZ2h0OwotCQl2aWV3Lm1pblogPSB2aWV3cG9ydC5NaW5aOwotCQl2aWV3Lm1heFogPSB2aWV3cG9ydC5NYXhaOwotCi0JCXJlbmRlcmVyLT5zZXRWaWV3cG9ydCh2aWV3KTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlOTo6YmluZFRleHR1cmVzKCkKLQl7Ci0JCWZvcihpbnQgc2FtcGxlciA9IDA7IHNhbXBsZXIgPCAxNiArIDQ7IHNhbXBsZXIrKykKLQkJewotCQkJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKmJhc2VUZXh0dXJlID0gdGV4dHVyZVtzYW1wbGVyXTsKLQotCQkJc3c6OlNhbXBsZXJUeXBlIHR5cGUgPSBzYW1wbGVyIDwgMTYgPyBzdzo6U0FNUExFUl9QSVhFTCA6IHN3OjpTQU1QTEVSX1ZFUlRFWDsKLQkJCWludCBpbmRleCA9IHNhbXBsZXIgPCAxNiA/IHNhbXBsZXIgOiBzYW1wbGVyIC0gMTY7ICAgLy8gU2FtcGxlciBpbmRleCB3aXRoaW4gdHlwZSBncm91cAotCi0JCQlib29sIHRleHR1cmVVc2VkID0gZmFsc2U7Ci0KLQkJCWlmKHR5cGUgPT0gc3c6OlNBTVBMRVJfUElYRUwgJiYgcGl4ZWxTaGFkZXIpCi0JCQl7Ci0JCQkJdGV4dHVyZVVzZWQgPSBwaXhlbFNoYWRlci0+Z2V0UGl4ZWxTaGFkZXIoKS0+dXNlc1NhbXBsZXIoaW5kZXgpOwotCQkJfQotCQkJZWxzZSBpZih0eXBlID09IHN3OjpTQU1QTEVSX1ZFUlRFWCAmJiB2ZXJ0ZXhTaGFkZXIpCi0JCQl7Ci0JCQkJdGV4dHVyZVVzZWQgPSB2ZXJ0ZXhTaGFkZXItPmdldFZlcnRleFNoYWRlcigpLT51c2VzU2FtcGxlcihpbmRleCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdGV4dHVyZVVzZWQgPSB0cnVlOyAgIC8vIEZJWE1FOiBDaGVjayBmaXhlZC1mdW5jdGlvbiB1c2U/Ci0JCQl9Ci0KLQkJCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2UgPSAwOwotCi0JCQlpZihiYXNlVGV4dHVyZSAmJiB0ZXh0dXJlVXNlZCkKLQkJCXsKLQkJCQlyZXNvdXJjZSA9IGJhc2VUZXh0dXJlLT5nZXRSZXNvdXJjZSgpOwotCQkJfQotCi0JCQlyZW5kZXJlci0+c2V0VGV4dHVyZVJlc291cmNlKHNhbXBsZXIsIHJlc291cmNlKTsKLQotCQkJaWYoYmFzZVRleHR1cmUgJiYgdGV4dHVyZVVzZWQpCi0JCQl7Ci0JCQkJYmFzZVRleHR1cmUtPkdlbmVyYXRlTWlwU3ViTGV2ZWxzKCk7Ci0JCQl9Ci0KLQkJCWlmKGJhc2VUZXh0dXJlICYmIHRleHR1cmVVc2VkKQotCQkJewotCQkJCWludCBsZXZlbENvdW50ID0gYmFzZVRleHR1cmUtPmdldEludGVybmFsTGV2ZWxDb3VudCgpOwotCi0JCQkJaW50IHRleHR1cmVMT0QgPSBiYXNlVGV4dHVyZS0+R2V0TE9EKCk7Ci0JCQkJaW50IHNhbXBsZXJMT0QgPSBzYW1wbGVyU3RhdGVbc2FtcGxlcl1bRDNEU0FNUF9NQVhNSVBMRVZFTF07Ci0JCQkJaW50IExPRCA9IHRleHR1cmVMT0QgPiBzYW1wbGVyTE9EID8gdGV4dHVyZUxPRCA6IHNhbXBsZXJMT0Q7Ci0KLQkJCQlpZihzYW1wbGVyU3RhdGVbc2FtcGxlcl1bRDNEU0FNUF9NSVBGSUxURVJdID09IEQzRFRFWEZfTk9ORSkKLQkJCQl7Ci0JCQkJCUxPRCA9IDA7Ci0JCQkJfQotCi0JCQkJc3dpdGNoKGJhc2VUZXh0dXJlLT5HZXRUeXBlKCkpCi0JCQkJewotCQkJCWNhc2UgRDNEUlRZUEVfVEVYVFVSRToKLQkJCQkJewotCQkJCQkJRGlyZWN0M0RUZXh0dXJlOSAqdGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzRFRleHR1cmU5Kj4oYmFzZVRleHR1cmUpOwotCQkJCQkJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZTsKLQotCQkJCQkJZm9yKGludCBtaXBtYXBMZXZlbCA9IDA7IG1pcG1hcExldmVsIDwgc3c6Ok1JUE1BUF9MRVZFTFM7IG1pcG1hcExldmVsKyspCi0JCQkJCQl7Ci0JCQkJCQkJaW50IHN1cmZhY2VMZXZlbCA9IG1pcG1hcExldmVsOwotCi0JCQkJCQkJaWYoc3VyZmFjZUxldmVsIDwgTE9EKQotCQkJCQkJCXsKLQkJCQkJCQkJc3VyZmFjZUxldmVsID0gTE9EOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmKHN1cmZhY2VMZXZlbCA8IDApCi0JCQkJCQkJewotCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSAwOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmKHN1cmZhY2VMZXZlbCA+PSBsZXZlbENvdW50KQotCQkJCQkJCXsKLQkJCQkJCQkJc3VyZmFjZUxldmVsID0gbGV2ZWxDb3VudCAtIDE7Ci0JCQkJCQkJfQotCi0JCQkJCQkJc3VyZmFjZSA9IHRleHR1cmUtPmdldEludGVybmFsU3VyZmFjZUxldmVsKHN1cmZhY2VMZXZlbCk7Ci0JCQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVMZXZlbChzYW1wbGVyLCAwLCBtaXBtYXBMZXZlbCwgc3VyZmFjZSwgc3c6OlRFWFRVUkVfMkQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEUlRZUEVfQ1VCRVRFWFRVUkU6Ci0JCQkJCWZvcihpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspCi0JCQkJCXsKLQkJCQkJCURpcmVjdDNEQ3ViZVRleHR1cmU5ICpjdWJlVGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzREN1YmVUZXh0dXJlOSo+KGJhc2VUZXh0dXJlKTsKLQkJCQkJCURpcmVjdDNEU3VyZmFjZTkgKnN1cmZhY2U7Ci0KLQkJCQkJCWZvcihpbnQgbWlwbWFwTGV2ZWwgPSAwOyBtaXBtYXBMZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBtaXBtYXBMZXZlbCsrKQotCQkJCQkJewotCQkJCQkJCWludCBzdXJmYWNlTGV2ZWwgPSBtaXBtYXBMZXZlbDsKLQotCQkJCQkJCWlmKHN1cmZhY2VMZXZlbCA8IExPRCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1cmZhY2VMZXZlbCA9IExPRDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCAwKQotCQkJCQkJCXsKLQkJCQkJCQkJc3VyZmFjZUxldmVsID0gMDsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZihzdXJmYWNlTGV2ZWwgPj0gbGV2ZWxDb3VudCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1cmZhY2VMZXZlbCA9IGxldmVsQ291bnQgLSAxOwotCQkJCQkJCX0KLQotCQkJCQkJCXN1cmZhY2UgPSBjdWJlVGV4dHVyZS0+Z2V0SW50ZXJuYWxDdWJlTWFwU3VyZmFjZSgoRDNEQ1VCRU1BUF9GQUNFUylmYWNlLCBzdXJmYWNlTGV2ZWwpOwotCQkJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTGV2ZWwoc2FtcGxlciwgZmFjZSwgbWlwbWFwTGV2ZWwsIHN1cmZhY2UsIHN3OjpURVhUVVJFX0NVQkUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEUlRZUEVfVk9MVU1FVEVYVFVSRToKLQkJCQkJewotCQkJCQkJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqdm9sdW1lVGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzRFZvbHVtZVRleHR1cmU5Kj4oYmFzZVRleHR1cmUpOwotCQkJCQkJRGlyZWN0M0RWb2x1bWU5ICp2b2x1bWU7Ci0KLQkJCQkJCWZvcihpbnQgbWlwbWFwTGV2ZWwgPSAwOyBtaXBtYXBMZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBtaXBtYXBMZXZlbCsrKQotCQkJCQkJewotCQkJCQkJCWludCBzdXJmYWNlTGV2ZWwgPSBtaXBtYXBMZXZlbDsKLQotCQkJCQkJCWlmKHN1cmZhY2VMZXZlbCA8IExPRCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1cmZhY2VMZXZlbCA9IExPRDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCAwKQotCQkJCQkJCXsKLQkJCQkJCQkJc3VyZmFjZUxldmVsID0gMDsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZihzdXJmYWNlTGV2ZWwgPj0gbGV2ZWxDb3VudCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1cmZhY2VMZXZlbCA9IGxldmVsQ291bnQgLSAxOwotCQkJCQkJCX0KLQotCQkJCQkJCXZvbHVtZSA9IHZvbHVtZVRleHR1cmUtPmdldEludGVybmFsVm9sdW1lTGV2ZWwoc3VyZmFjZUxldmVsKTsKLQkJCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUxldmVsKHNhbXBsZXIsIDAsIG1pcG1hcExldmVsLCB2b2x1bWUsIHN3OjpURVhUVVJFXzNEKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlVTklNUExFTUVOVEVEKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTGV2ZWwoc2FtcGxlciwgMCwgMCwgMCwgc3c6OlRFWFRVUkVfTlVMTCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlib29sIERpcmVjdDNERGV2aWNlOTo6aXNSZWNvcmRpbmcoKSBjb25zdAotCXsKLQkJcmV0dXJuIHN0YXRlUmVjb3JkZXIgIT0gMDsKLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlOTo6c2V0T2NjbHVzaW9uRW5hYmxlZChib29sIGVuYWJsZSkKLQl7Ci0JCXJlbmRlcmVyLT5zZXRPY2NsdXNpb25FbmFibGVkKGVuYWJsZSk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRERldmljZTk6OnJlbW92ZVF1ZXJ5KHN3OjpRdWVyeSAqcXVlcnkpCi0JewotCQlyZW5kZXJlci0+cmVtb3ZlUXVlcnkocXVlcnkpOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U5OjphZGRRdWVyeShzdzo6UXVlcnkgKnF1ZXJ5KQotCXsKLQkJcmVuZGVyZXItPmFkZFF1ZXJ5KHF1ZXJ5KTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNERGV2aWNlOTo6c3RyZXRjaFJlY3QoRGlyZWN0M0RTdXJmYWNlOSAqc291cmNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBEaXJlY3QzRFN1cmZhY2U5ICpkZXN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyKQotCXsKLQkJRDNEU1VSRkFDRV9ERVNDIHNvdXJjZURlc2NyaXB0aW9uOwotCQlEM0RTVVJGQUNFX0RFU0MgZGVzdERlc2NyaXB0aW9uOwotCi0JCXNvdXJjZS0+R2V0RGVzYygmc291cmNlRGVzY3JpcHRpb24pOwotCQlkZXN0LT5HZXREZXNjKCZkZXN0RGVzY3JpcHRpb24pOwotCi0JCWludCBzV2lkdGggPSBzb3VyY2UtPmdldFdpZHRoKCk7Ci0JCWludCBzSGVpZ2h0ID0gc291cmNlLT5nZXRIZWlnaHQoKTsKLQkJaW50IGRXaWR0aCA9IGRlc3QtPmdldFdpZHRoKCk7Ci0JCWludCBkSGVpZ2h0ID0gZGVzdC0+Z2V0SGVpZ2h0KCk7Ci0KLQkJc3c6OlJlY3Qgc1JlY3QoMCwgMCwgc1dpZHRoLCBzSGVpZ2h0KTsKLQkJc3c6OlJlY3QgZFJlY3QoMCwgMCwgZFdpZHRoLCBkSGVpZ2h0KTsKLQotCQlpZihzb3VyY2VSZWN0KQotCQl7Ci0JCQlzUmVjdC54MCA9IHNvdXJjZVJlY3QtPmxlZnQ7Ci0JCQlzUmVjdC55MCA9IHNvdXJjZVJlY3QtPnRvcDsKLQkJCXNSZWN0LngxID0gc291cmNlUmVjdC0+cmlnaHQ7Ci0JCQlzUmVjdC55MSA9IHNvdXJjZVJlY3QtPmJvdHRvbTsKLQkJfQotCi0JCWlmKGRlc3RSZWN0KQotCQl7Ci0JCQlkUmVjdC54MCA9IGRlc3RSZWN0LT5sZWZ0OwotCQkJZFJlY3QueTAgPSBkZXN0UmVjdC0+dG9wOwotCQkJZFJlY3QueDEgPSBkZXN0UmVjdC0+cmlnaHQ7Ci0JCQlkUmVjdC55MSA9IGRlc3RSZWN0LT5ib3R0b207Ci0JCX0KLQotCQlib29sIHNjYWxpbmcgPSAoc1JlY3QueDEgLSBzUmVjdC54MCAhPSBkUmVjdC54MSAtIGRSZWN0LngwKSB8fCAoc1JlY3QueTEgLSBzUmVjdC55MCAhPSBkUmVjdC55MSAtIGRSZWN0LnkwKTsKLQkJYm9vbCBlcXVhbEZvcm1hdHMgPSBzb3VyY2UtPmdldEludGVybmFsRm9ybWF0KCkgPT0gZGVzdC0+Z2V0SW50ZXJuYWxGb3JtYXQoKTsKLQkJYm9vbCBkZXB0aFN0ZW5jaWwgPSAoc291cmNlRGVzY3JpcHRpb24uVXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpID09IEQzRFVTQUdFX0RFUFRIU1RFTkNJTDsKLQkJYm9vbCBhbHBoYTB4RkYgPSBmYWxzZTsKLQotCQlpZigoc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ID09IEQzREZNVF9BOFI4RzhCOCAmJiBkZXN0RGVzY3JpcHRpb24uRm9ybWF0ID09IEQzREZNVF9YOFI4RzhCOCkgfHwKLQkJICAgKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCA9PSBEM0RGTVRfWDhSOEc4QjggJiYgZGVzdERlc2NyaXB0aW9uLkZvcm1hdCA9PSBEM0RGTVRfQThSOEc4QjgpKQotCQl7Ci0JCQllcXVhbEZvcm1hdHMgPSB0cnVlOwotCQkJYWxwaGEweEZGID0gdHJ1ZTsKLQkJfQotCi0JCWlmKGRlcHRoU3RlbmNpbCkgICAvLyBDb3B5IGVudGlyZWx5LCBpbnRlcm5hbGx5ICAgLy8gRklYTUU6IENoZWNrCi0JCXsKLQkJCWlmKHNvdXJjZS0+aGFzRGVwdGgoKSkKLQkJCXsKLQkJCQlieXRlICpzb3VyY2VCdWZmZXIgPSAoYnl0ZSopc291cmNlLT5sb2NrSW50ZXJuYWwoMCwgMCwgMCwgc3c6OkxPQ0tfUkVBRE9OTFksIHN3OjpQVUJMSUMpOwotCQkJCWJ5dGUgKmRlc3RCdWZmZXIgPSAoYnl0ZSopZGVzdC0+bG9ja0ludGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX0RJU0NBUkQsIHN3OjpQVUJMSUMpOwotCi0JCQkJdW5zaWduZWQgaW50IHdpZHRoID0gc291cmNlLT5nZXRXaWR0aCgpOwotCQkJCXVuc2lnbmVkIGludCBoZWlnaHQgPSBzb3VyY2UtPmdldEhlaWdodCgpOwotCQkJCXVuc2lnbmVkIGludCBwaXRjaCA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxQaXRjaEIoKTsKLQotCQkJCWZvcih1bnNpZ25lZCBpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKLQkJCQl7Ci0JCQkJCW1lbWNweShkZXN0QnVmZmVyLCBzb3VyY2VCdWZmZXIsIHBpdGNoKTsgICAvLyBGSVhNRTogT25seSBjb3B5IHdpZHRoICogYnl0ZXMKLQotCQkJCQlzb3VyY2VCdWZmZXIgKz0gcGl0Y2g7Ci0JCQkJCWRlc3RCdWZmZXIgKz0gcGl0Y2g7Ci0JCQkJfQotCi0JCQkJc291cmNlLT51bmxvY2tJbnRlcm5hbCgpOwotCQkJCWRlc3QtPnVubG9ja0ludGVybmFsKCk7Ci0JCQl9Ci0KLQkJCWlmKHNvdXJjZS0+aGFzU3RlbmNpbCgpKQotCQkJewotCQkJCWJ5dGUgKnNvdXJjZUJ1ZmZlciA9IChieXRlKilzb3VyY2UtPmxvY2tTdGVuY2lsKDAsIDAsIDAsIHN3OjpQVUJMSUMpOwotCQkJCWJ5dGUgKmRlc3RCdWZmZXIgPSAoYnl0ZSopZGVzdC0+bG9ja1N0ZW5jaWwoMCwgMCwgMCwgc3c6OlBVQkxJQyk7Ci0KLQkJCQl1bnNpZ25lZCBpbnQgd2lkdGggPSBzb3VyY2UtPmdldFdpZHRoKCk7Ci0JCQkJdW5zaWduZWQgaW50IGhlaWdodCA9IHNvdXJjZS0+Z2V0SGVpZ2h0KCk7Ci0JCQkJdW5zaWduZWQgaW50IHBpdGNoID0gc291cmNlLT5nZXRTdGVuY2lsUGl0Y2hCKCk7Ci0KLQkJCQlmb3IodW5zaWduZWQgaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCi0JCQkJewotCQkJCQltZW1jcHkoZGVzdEJ1ZmZlciwgc291cmNlQnVmZmVyLCBwaXRjaCk7ICAgLy8gRklYTUU6IE9ubHkgY29weSB3aWR0aCAqIGJ5dGVzCi0KLQkJCQkJc291cmNlQnVmZmVyICs9IHBpdGNoOwotCQkJCQlkZXN0QnVmZmVyICs9IHBpdGNoOwotCQkJCX0KLQotCQkJCXNvdXJjZS0+dW5sb2NrU3RlbmNpbCgpOwotCQkJCWRlc3QtPnVubG9ja1N0ZW5jaWwoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKCFzY2FsaW5nICYmIGVxdWFsRm9ybWF0cykKLQkJewotCQkJdW5zaWduZWQgY2hhciAqc291cmNlQnl0ZXMgPSAodW5zaWduZWQgY2hhciopc291cmNlLT5sb2NrSW50ZXJuYWwoc1JlY3QueDAsIHNSZWN0LnkwLCAwLCBzdzo6TE9DS19SRUFET05MWSwgc3c6OlBVQkxJQyk7Ci0JCQl1bnNpZ25lZCBjaGFyICpkZXN0Qnl0ZXMgPSAodW5zaWduZWQgY2hhciopZGVzdC0+bG9ja0ludGVybmFsKGRSZWN0LngwLCBkUmVjdC55MCwgMCwgc3c6OkxPQ0tfUkVBRFdSSVRFLCBzdzo6UFVCTElDKTsKLQkJCXVuc2lnbmVkIGludCBzb3VyY2VQaXRjaCA9IHNvdXJjZS0+Z2V0SW50ZXJuYWxQaXRjaEIoKTsKLQkJCXVuc2lnbmVkIGludCBkZXN0UGl0Y2ggPSBkZXN0LT5nZXRJbnRlcm5hbFBpdGNoQigpOwotCi0JCQl1bnNpZ25lZCBpbnQgd2lkdGggPSBkUmVjdC54MSAtIGRSZWN0LngwOwotCQkJdW5zaWduZWQgaW50IGhlaWdodCA9IGRSZWN0LnkxIC0gZFJlY3QueTA7Ci0JCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSB3aWR0aCAqIHN3OjpTdXJmYWNlOjpieXRlcyhzb3VyY2UtPmdldEludGVybmFsRm9ybWF0KCkpOwotCi0JCQlmb3IodW5zaWduZWQgaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCi0JCQl7Ci0JCQkJbWVtY3B5KGRlc3RCeXRlcywgc291cmNlQnl0ZXMsIGJ5dGVzKTsKLQotCQkJCWlmKGFscGhhMHhGRikKLQkJCQl7Ci0JCQkJCWZvcih1bnNpZ25lZCBpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQotCQkJCQl7Ci0JCQkJCQlkZXN0Qnl0ZXNbNCAqIHggKyAzXSA9IDB4RkY7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzb3VyY2VCeXRlcyArPSBzb3VyY2VQaXRjaDsKLQkJCQlkZXN0Qnl0ZXMgKz0gZGVzdFBpdGNoOwotCQkJfQotCi0JCQlzb3VyY2UtPnVubG9ja0ludGVybmFsKCk7Ci0JCQlkZXN0LT51bmxvY2tJbnRlcm5hbCgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3c6OlNsaWNlUmVjdEYgc1JlY3RGKChmbG9hdClzUmVjdC54MCwgKGZsb2F0KXNSZWN0LnkwLCAoZmxvYXQpc1JlY3QueDEsIChmbG9hdClzUmVjdC55MSwgMCk7Ci0JCQlyZW5kZXJlci0+YmxpdChzb3VyY2UsIHNSZWN0RiwgZGVzdCwgZFJlY3QsIGZpbHRlciA+PSBEM0RURVhGX0xJTkVBUik7Ci0JCX0KLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOTo6dXBkYXRlVm9sdW1lKElEaXJlY3QzRFZvbHVtZTkgKnNvdXJjZVZvbHVtZSwgSURpcmVjdDNEVm9sdW1lOSAqZGVzdGluYXRpb25Wb2x1bWUpCi0JewotCQlUUkFDRSgiSURpcmVjdDNEVm9sdW1lOSAqc291cmNlVm9sdW1lID0gMHglMC44cCwgSURpcmVjdDNEVm9sdW1lOSAqZGVzdGluYXRpb25Wb2x1bWUgPSAweCUwLjhwIiwgc291cmNlVm9sdW1lLCBkZXN0aW5hdGlvblZvbHVtZSk7Ci0KLQkJaWYoIXNvdXJjZVZvbHVtZSB8fCAhZGVzdGluYXRpb25Wb2x1bWUpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJRDNEVk9MVU1FX0RFU0Mgc291cmNlRGVzY3JpcHRpb247Ci0JCUQzRFZPTFVNRV9ERVNDIGRlc3RpbmF0aW9uRGVzY3JpcHRpb247Ci0KLQkJc291cmNlVm9sdW1lLT5HZXREZXNjKCZzb3VyY2VEZXNjcmlwdGlvbik7Ci0JCWRlc3RpbmF0aW9uVm9sdW1lLT5HZXREZXNjKCZkZXN0aW5hdGlvbkRlc2NyaXB0aW9uKTsKLQotCQlpZihzb3VyY2VEZXNjcmlwdGlvbi5Qb29sICAgICAgIT0gRDNEUE9PTF9TWVNURU1NRU0gfHwKLQkJICAgZGVzdGluYXRpb25EZXNjcmlwdGlvbi5Qb29sICE9IEQzRFBPT0xfREVGQVVMVCB8fAotCQkgICBzb3VyY2VEZXNjcmlwdGlvbi5Gb3JtYXQgIT0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5Gb3JtYXQgfHwKLQkJICAgc291cmNlRGVzY3JpcHRpb24uV2lkdGggICE9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uV2lkdGggfHwKLQkJICAgc291cmNlRGVzY3JpcHRpb24uSGVpZ2h0ICE9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uSGVpZ2h0IHx8Ci0JCSAgIHNvdXJjZURlc2NyaXB0aW9uLkRlcHRoICAhPSBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLkRlcHRoKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN3OjpTdXJmYWNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFZvbHVtZTkqPihzb3VyY2VWb2x1bWUpOwotCQlzdzo6U3VyZmFjZSAqZGVzdCA9IHN0YXRpY19jYXN0PERpcmVjdDNEVm9sdW1lOSo+KGRlc3RpbmF0aW9uVm9sdW1lKTsKLQotCQlpZihzb3VyY2UtPmdldEV4dGVybmFsUGl0Y2hCKCkgIT0gZGVzdC0+Z2V0RXh0ZXJuYWxQaXRjaEIoKSB8fAotCQkgICBzb3VyY2UtPmdldEV4dGVybmFsU2xpY2VCKCkgIT0gZGVzdC0+Z2V0RXh0ZXJuYWxTbGljZUIoKSkKLQkJewotCQkJVU5JTVBMRU1FTlRFRCgpOwotCQl9Ci0KLQkJdm9pZCAqc0J1ZmZlciA9IHNvdXJjZS0+bG9ja0V4dGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX1JFQURPTkxZLCBzdzo6UFVCTElDKTsKLQkJdm9pZCAqZEJ1ZmZlciA9IGRlc3QtPmxvY2tFeHRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19XUklURU9OTFksIHN3OjpQVUJMSUMpOwotCi0JCW1lbWNweShkQnVmZmVyLCBzQnVmZmVyLCBzb3VyY2UtPmdldEV4dGVybmFsU2xpY2VCKCkgKiBzb3VyY2VEZXNjcmlwdGlvbi5EZXB0aCk7Ci0KLQkJc291cmNlLT51bmxvY2tFeHRlcm5hbCgpOwotCQlkZXN0LT51bmxvY2tFeHRlcm5hbCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JYm9vbCBEaXJlY3QzRERldmljZTk6OnZhbGlkUmVjdGFuZ2xlKGNvbnN0IFJFQ1QgKnJlY3QsIElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlKQotCXsKLQkJaWYoIXJlY3QpCi0JCXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYocmVjdC0+cmlnaHQgPD0gcmVjdC0+bGVmdCB8fCByZWN0LT5ib3R0b20gPD0gcmVjdC0+dG9wKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZihyZWN0LT5sZWZ0IDwgMCB8fCByZWN0LT50b3AgPCAwKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlEM0RTVVJGQUNFX0RFU0MgZGVzY3JpcHRpb247Ci0JCXN1cmZhY2UtPkdldERlc2MoJmRlc2NyaXB0aW9uKTsKLQotCQlpZihyZWN0LT5yaWdodCA+IChpbnQpZGVzY3JpcHRpb24uV2lkdGggfHwgcmVjdC0+Ym90dG9tID4gKGludClkZXNjcmlwdGlvbi5IZWlnaHQpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U5Ojpjb25maWd1cmVGUFUoKQotCXsKLQkvLwlfY29udHJvbGZwKF9QQ18yNCwgX01DV19QQyk7ICAgICAvLyBTaW5nbGUtcHJlY2lzaW9uCi0JCV9jb250cm9sZnAoX01DV19FTSwgX01DV19FTSk7ICAgIC8vIE1hc2sgYWxsIGV4Y2VwdGlvbnMKLQkJX2NvbnRyb2xmcChfUkNfTkVBUiwgX01DV19SQyk7ICAgLy8gUm91bmQgdG8gbmVhcmVzdAotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzRERldmljZTkuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWI3ZGM0Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q5X0RpcmVjdDNERGV2aWNlOV9ocHAKLSNkZWZpbmUgRDNEOV9EaXJlY3QzRERldmljZTlfaHBwCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNEOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RTd2FwQ2hhaW45LmhwcCIKLSNpbmNsdWRlICJDYXBhYmlsaXRpZXMuaHBwIgotCi0jaW5jbHVkZSAiU3RyZWFtLmhwcCIKLQotI2luY2x1ZGUgPGQzZDkuaD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bGlzdD4KLQotbmFtZXNwYWNlIHN3Ci17Ci0JY2xhc3MgUmVuZGVyZXI7Ci0JY2xhc3MgQ29udGV4dDsKLQlzdHJ1Y3QgUXVlcnk7Ci19Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JY2xhc3MgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjk7Ci0JY2xhc3MgRGlyZWN0M0RTdGF0ZUJsb2NrOTsKLQljbGFzcyBEaXJlY3QzRFN1cmZhY2U5OwotCWNsYXNzIERpcmVjdDNEUGl4ZWxTaGFkZXI5OwotCWNsYXNzIERpcmVjdDNEVmVydGV4U2hhZGVyOTsKLQljbGFzcyBpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OwotCWNsYXNzIERpcmVjdDNEVmVydGV4QnVmZmVyOTsKLQljbGFzcyBEaXJlY3QzREluZGV4QnVmZmVyOTsKLQljbGFzcyBDcml0aWNhbFNlY3Rpb247Ci0KLQljbGFzcyBEaXJlY3QzRERldmljZTkgOiBwdWJsaWMgSURpcmVjdDNERGV2aWNlOSwgcHVibGljIFVua25vd24KLQl7Ci0JCWZyaWVuZCBDcml0aWNhbFNlY3Rpb247Ci0JCWZyaWVuZCBEaXJlY3QzRFN3YXBDaGFpbjk7Ci0KLQlwdWJsaWM6Ci0JCURpcmVjdDNERGV2aWNlOShjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UsIERpcmVjdDNEOSAqZDNkOSwgdW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgdW5zaWduZWQgbG9uZyBiZWhhdmlvdXJGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyk7Ci0KLQkJfkRpcmVjdDNERGV2aWNlOSgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRERldmljZTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBCZWdpblNjZW5lKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEJlZ2luU3RhdGVCbG9jaygpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDbGVhcih1bnNpZ25lZCBsb25nIGNvdW50LCBjb25zdCBEM0RSRUNUICpyZWN0cywgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBjb2xvciwgZmxvYXQgeiwgdW5zaWduZWQgbG9uZyBzdGVuY2lsKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ29sb3JGaWxsKElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlLCBjb25zdCBSRUNUICpyZWN0LCBEM0RDT0xPUiBjb2xvcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4oRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNEU3dhcENoYWluOSAqKnN3YXBDaGFpbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZUN1YmVUZXh0dXJlKHVuc2lnbmVkIGludCBlZGdlTGVuZ3RoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzREN1YmVUZXh0dXJlOSAqKmN1YmVUZXh0dXJlLCB2b2lkICoqc2hhcmVkSGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgZGlzY2FyZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlSW5kZXhCdWZmZXIodW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKippbmRleEJ1ZmZlciwgdm9pZCAqKnNoYXJlZEhhbmRsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlUGl4ZWxTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVF1ZXJ5KEQzRFFVRVJZVFlQRSB0eXBlLCBJRGlyZWN0M0RRdWVyeTkgKipxdWVyeSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVJlbmRlclRhcmdldCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgbG9ja2FibGUsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVN0YXRlQmxvY2soRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSwgSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVGV4dHVyZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEVGV4dHVyZTkgKip0ZXh0dXJlLCB2b2lkICoqc2hhcmVkSGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVmVydGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIHVuc2lnbmVkIGxvbmcgRlZGLCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKip2ZXJ0ZXhCdWZmZXIsIHZvaWQgKipzaGFyZWRIYW5kbGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihjb25zdCBEM0RWRVJURVhFTEVNRU5UOSAqdmVydGV4RWxlbWVudHMsIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVmVydGV4U2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVm9sdW1lVGV4dHVyZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqKnZvbHVtZVRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBEZWxldGVQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRHJhd0luZGV4ZWRQcmltaXRpdmUoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCBpbnQgYmFzZVZlcnRleEluZGV4LCB1bnNpZ25lZCBpbnQgbWluSW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0aWNlcywgdW5zaWduZWQgaW50IHN0YXJ0SW5kZXgsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIERyYXdJbmRleGVkUHJpbWl0aXZlVVAoRDNEUFJJTUlUSVZFVFlQRSB0eXBlLCB1bnNpZ25lZCBpbnQgbWluVmVydGV4SW5kZXgsIHVuc2lnbmVkIGludCBudW1WZXJ0ZXhJbmRpY2VzLCB1bnNpZ25lZCBpbnQgUHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKmluZGV4RGF0YSwgRDNERk9STUFUIGluZGV4RGF0YUZvcm1hdCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCBWZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRHJhd1ByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCwgdW5zaWduZWQgaW50IHByaW1pdmVDb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIERyYXdQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRHJhd1JlY3RQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlLCBjb25zdCBmbG9hdCAqbnVtU2VncywgY29uc3QgRDNEUkVDVFBBVENIX0lORk8gKnJlY3RQYXRjaEluZm8pIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBEcmF3VHJpUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFRSSVBBVENIX0lORk8gKnRyaVBhdGNoSW5mbykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEVuZFNjZW5lKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEVuZFN0YXRlQmxvY2soSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRXZpY3RNYW5hZ2VkUmVzb3VyY2VzKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRCYWNrQnVmZmVyKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIHVuc2lnbmVkIGludCBpbmRleCwgRDNEQkFDS0JVRkZFUl9UWVBFIHR5cGUsIElEaXJlY3QzRFN1cmZhY2U5ICoqYmFja0J1ZmZlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBmbG9hdCAqcGxhbmUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRDbGlwU3RhdHVzKEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Q3JlYXRpb25QYXJhbWV0ZXJzKEQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKipkZXB0aFN0ZW5jaWxTdXJmYWNlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlQ2FwcyhEM0RDQVBTOSAqY2Fwcykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERpcmVjdDNEKElEaXJlY3QzRDkgKipEM0QpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgc3dhcENoYWluICxEM0RESVNQTEFZTU9ERSAqbW9kZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEZyb250QnVmZmVyRGF0YSh1bnNpZ25lZCBpbnQgc3dhcENoYWluLCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRGVkYodW5zaWduZWQgbG9uZyAqRlZGKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgR2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIEQzREdBTU1BUkFNUCAqcmFtcCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhEYXRhKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgRDNETElHSFQ5ICpwKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0TGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCAsIGludCAqZW5hYmxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0TWF0ZXJpYWwoRDNETUFURVJJQUw5ICptYXRlcmlhbCkgb3ZlcnJpZGU7Ci0JCWZsb2F0IF9fc3RkY2FsbCBHZXROUGF0Y2hNb2RlKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGludCBfX3N0ZGNhbGwgR2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQaXhlbFNoYWRlcihJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKipzaGFkZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQaXhlbFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFJhc3RlclN0YXR1cyh1bnNpZ25lZCBpbnQgc3dhcENoYWluLCBEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgU3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UmVuZGVyVGFyZ2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIElEaXJlY3QzRFN1cmZhY2U5ICoqcmVuZGVyVGFyZ2V0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UmVuZGVyVGFyZ2V0RGF0YShJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRTYW1wbGVyU3RhdGUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBEM0RTQU1QTEVSU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0U2Npc3NvclJlY3QoUkVDVCAqcmVjdCkgb3ZlcnJpZGU7Ci0JCWludCBfX3N0ZGNhbGwgR2V0U29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICoqc3RyZWFtRGF0YSwgdW5zaWduZWQgaW50ICpvZmZzZXQsIHVuc2lnbmVkIGludCAqc3RyaWRlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0U3RyZWFtU291cmNlRnJlcSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCB1bnNpZ25lZCBpbnQgKmRpdmlkZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRTd2FwQ2hhaW4odW5zaWduZWQgaW50IGluZGV4LCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKnRleHR1cmUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBEM0RNQVRSSVggKm1hdHJpeCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFZlcnRleERlY2xhcmF0aW9uKElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqKmRlY2xhcmF0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFZlcnRleFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFZpZXdwb3J0KEQzRFZJRVdQT1JUOSAqdmlld3BvcnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgZW5hYmxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgTXVsdGlwbHlUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFByb2Nlc3NWZXJ0aWNlcyh1bnNpZ25lZCBpbnQgc3JjU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IGRlc3RJbmRleCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkZXN0QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgUmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBmbG9hdCAqcGxhbmUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRDbGlwU3RhdHVzKGNvbnN0IEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgU2V0Q3Vyc29yUG9zaXRpb24oaW50IHgsIGludCB5LCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0Q3Vyc29yUHJvcGVydGllcyh1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHksIElEaXJlY3QzRFN1cmZhY2U5ICpjdXJzb3JCaXRtYXApIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXREZXB0aFN0ZW5jaWxTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U5ICpuZXdEZXB0aFN0ZW5jaWwpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXREaWFsb2dCb3hNb2RlKGludCBlbmFibGVEaWFsb2dzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0RlZGKHVuc2lnbmVkIGxvbmcgRlZGKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgU2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IEQzREdBTU1BUkFNUCAqcmFtcCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI5ICppbmRleERhdGEpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBEM0RMSUdIVDkgKmxpZ2h0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0TWF0ZXJpYWwoY29uc3QgRDNETUFURVJJQUw5ICptYXRlcmlhbCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldE5QYXRjaE1vZGUoZmxvYXQgc2VnbWVudHMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQYWxldHRlRW50cmllcyh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciwgY29uc3QgUEFMRVRURUVOVFJZICplbnRyaWVzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UGl4ZWxTaGFkZXIoSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpzaGFkZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFJlbmRlclRhcmdldCh1bnNpZ25lZCBsb25nIGluZGV4LCBJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0U2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgc2FtcGxlciwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFNjaXNzb3JSZWN0KGNvbnN0IFJFQ1QgKnJlY3QpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoaW50IHNvZnR3YXJlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW0sIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzdHJpZGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCBkaXZpZGVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqdGV4dHVyZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmRlY2xhcmF0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKnNoYWRlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFZlcnRleFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCkgb3ZlcnJpZGU7Ci0JCWludCBfX3N0ZGNhbGwgU2hvd0N1cnNvcihpbnQgc2hvdykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFN0cmV0Y2hSZWN0KElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBUZXN0Q29vcGVyYXRpdmVMZXZlbCgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBVcGRhdGVTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdGluYXRpb25TdXJmYWNlLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVXBkYXRlVGV4dHVyZShJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnNvdXJjZVRleHR1cmUsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqZGVzdGluYXRpb25UZXh0dXJlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVmFsaWRhdGVEZXZpY2UodW5zaWduZWQgbG9uZyAqbnVtUGFzc2VzKSBvdmVycmlkZTsKLQotCQkvLyBJbnRlcm5hbCBtZXRob2RzCi0JCWxvbmcgZ2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSk7Ci0JCWJvb2wgaXNSZWNvcmRpbmcoKSBjb25zdDsgICAvLyBJbiBhIHN0YXRlIHJlY29yZGluZyBtb2RlCi0JCXZvaWQgc2V0T2NjbHVzaW9uRW5hYmxlZChib29sIGVuYWJsZSk7Ci0JCXZvaWQgcmVtb3ZlUXVlcnkoc3c6OlF1ZXJ5ICpxdWVyeSk7Ci0JCXZvaWQgYWRkUXVlcnkoc3c6OlF1ZXJ5ICpxdWVyeSk7Ci0JCXZvaWQgc3RyZXRjaFJlY3QoRGlyZWN0M0RTdXJmYWNlOSAqc291cmNlU3VyZmFjZSwgY29uc3QgUkVDVCAqc291cmNlUmVjdCwgRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpOwotCi0JcHJpdmF0ZToKLQkJc3RhdGljIGludCB0eXBlU3RyaWRlKHVuc2lnbmVkIGNoYXIgc3RyZWFtVHlwZSk7Ci0JCWJvb2wgaW5zdGFuY2VEYXRhKCk7Ci0JCWJvb2wgYmluZFJlc291cmNlcyhEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhCdWZmZXIpOwotCQl2b2lkIGJpbmRWZXJ0ZXhTdHJlYW1zKGludCBiYXNlLCBib29sIGluc3RhbmNpbmcsIGludCBpbnN0YW5jZSk7Ci0JCXZvaWQgYmluZEluZGV4QnVmZmVyKERpcmVjdDNESW5kZXhCdWZmZXI5ICppbmRleEJ1ZmZlcik7Ci0JCXZvaWQgYmluZFNoYWRlckNvbnN0YW50cygpOwotCQl2b2lkIGJpbmRMaWdodHMoKTsKLQkJYm9vbCBiaW5kVmlld3BvcnQoKTsgICAvLyBBbHNvIGFkanVzdHMgZm9yIHNjaXNzb3JpbmcKLQkJdm9pZCBiaW5kVGV4dHVyZXMoKTsKLQotCQlsb25nIHVwZGF0ZVZvbHVtZShJRGlyZWN0M0RWb2x1bWU5ICpzb3VyY2VWb2x1bWUsIElEaXJlY3QzRFZvbHVtZTkgKmRlc3RpbmF0aW9uVm9sdW1lKTsKLQkJYm9vbCB2YWxpZFJlY3RhbmdsZShjb25zdCBSRUNUICpyZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSk7Ci0JCXZvaWQgY29uZmlndXJlRlBVKCk7Ci0KLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQljb25zdCBISU5TVEFOQ0UgaW5zdGFuY2U7Ci0JCURpcmVjdDNEOSAqZDNkOTsKLQkJY29uc3QgdW5zaWduZWQgaW50IGFkYXB0ZXI7Ci0JCWNvbnN0IEQzRERFVlRZUEUgZGV2aWNlVHlwZTsKLQkJY29uc3QgSFdORCBmb2N1c1dpbmRvdzsKLQkJY29uc3QgdW5zaWduZWQgbG9uZyBiZWhhdmlvdXJGbGFnczsKLQotCQlIV05EIGRldmljZVdpbmRvdzsKLQotCQlEM0RWSUVXUE9SVDkgdmlld3BvcnQ7Ci0JCUQzRE1BVFJJWCBtYXRyaXhbNTEyXTsKLQkJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmVbMTYgKyA0XTsKLQkJRDNETUFURVJJQUw5IG1hdGVyaWFsOwotCQlmbG9hdCBwbGFuZVs2XVs0XTsKLQkJRDNEQ0xJUFNUQVRVUzkgY2xpcFN0YXR1czsKLQkJUkVDVCBzY2lzc29yUmVjdDsKLQkJYm9vbCBzY2lzc29yRW5hYmxlOwotCi0JCXN0cnVjdCBMaWdodCA6IEQzRExJR0hUOQotCQl7Ci0JCQlMaWdodCAmb3BlcmF0b3I9KGNvbnN0IEQzRExJR0hUOSAmbGlnaHQpCi0JCQl7Ci0JCQkJVHlwZSA9IGxpZ2h0LlR5cGU7Ci0JCQkJRGlmZnVzZSA9IGxpZ2h0LkRpZmZ1c2U7Ci0JCQkJU3BlY3VsYXIgPSBsaWdodC5TcGVjdWxhcjsKLQkJCQlBbWJpZW50ID0gbGlnaHQuQW1iaWVudDsKLQkJCQlQb3NpdGlvbiA9IGxpZ2h0LlBvc2l0aW9uOwotCQkJCURpcmVjdGlvbiA9IGxpZ2h0LkRpcmVjdGlvbjsKLQkJCQlSYW5nZSA9IGxpZ2h0LlJhbmdlOwotCQkJCUZhbGxvZmYgPSBsaWdodC5GYWxsb2ZmOwotCQkJCUF0dGVudWF0aW9uMCA9IGxpZ2h0LkF0dGVudWF0aW9uMDsKLQkJCQlBdHRlbnVhdGlvbjEgPSBsaWdodC5BdHRlbnVhdGlvbjE7Ci0JCQkJQXR0ZW51YXRpb24yID0gbGlnaHQuQXR0ZW51YXRpb24yOwotCQkJCVRoZXRhID0gbGlnaHQuVGhldGE7Ci0JCQkJUGhpID0gbGlnaHQuUGhpOwotCi0JCQkJcmV0dXJuICp0aGlzOwotCQkJfQotCi0JCQlib29sIGVuYWJsZTsKLQkJfTsKLQotCQlzdHJ1Y3QgTGlnaHRzIDogc3RkOjptYXA8aW50LCBMaWdodD4KLQkJewotCQkJYm9vbCBleGlzdHMoaW50IGluZGV4KQotCQkJewotCQkJCXJldHVybiBmaW5kKGluZGV4KSAhPSBlbmQoKTsKLQkJCX0KLQkJfTsKLQotCQlMaWdodHMgbGlnaHQ7Ci0JCWJvb2wgc29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nOwotCQlEaXJlY3QzRFBpeGVsU2hhZGVyOSAqcGl4ZWxTaGFkZXI7Ci0JCURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdmVydGV4U2hhZGVyOwotCi0JCWJvb2wgbGlnaHRzRGlydHk7Ci0JCWJvb2wgcGl4ZWxTaGFkZXJEaXJ0eTsKLQkJdW5zaWduZWQgaW50IHBpeGVsU2hhZGVyQ29uc3RhbnRzQkRpcnR5OwotCQl1bnNpZ25lZCBpbnQgcGl4ZWxTaGFkZXJDb25zdGFudHNGRGlydHk7Ci0JCXVuc2lnbmVkIGludCBwaXhlbFNoYWRlckNvbnN0YW50c0lEaXJ0eTsKLQkJYm9vbCB2ZXJ0ZXhTaGFkZXJEaXJ0eTsKLQkJdW5zaWduZWQgaW50IHZlcnRleFNoYWRlckNvbnN0YW50c0JEaXJ0eTsKLQkJdW5zaWduZWQgaW50IHZlcnRleFNoYWRlckNvbnN0YW50c0ZEaXJ0eTsKLQkJdW5zaWduZWQgaW50IHZlcnRleFNoYWRlckNvbnN0YW50c0lEaXJ0eTsKLQotCQlmbG9hdCBwaXhlbFNoYWRlckNvbnN0YW50RltNQVhfUElYRUxfU0hBREVSX0NPTlNUXVs0XTsKLQkJaW50IHBpeGVsU2hhZGVyQ29uc3RhbnRJWzE2XVs0XTsKLQkJaW50IHBpeGVsU2hhZGVyQ29uc3RhbnRCWzE2XTsKLQotCQlmbG9hdCB2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbTUFYX1ZFUlRFWF9TSEFERVJfQ09OU1RdWzRdOwotCQlpbnQgdmVydGV4U2hhZGVyQ29uc3RhbnRJWzE2XVs0XTsKLQkJaW50IHZlcnRleFNoYWRlckNvbnN0YW50QlsxNl07Ci0KLQkJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uOwotCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRhdGFTdHJlYW1bTUFYX1ZFUlRFWF9JTlBVVFNdOwotCQlpbnQgc3RyZWFtU3RyaWRlW01BWF9WRVJURVhfSU5QVVRTXTsKLQkJaW50IHN0cmVhbU9mZnNldFtNQVhfVkVSVEVYX0lOUFVUU107Ci0JCXVuc2lnbmVkIGludCBzdHJlYW1Tb3VyY2VGcmVxW01BWF9WRVJURVhfSU5QVVRTXTsKLQkJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4RGF0YTsKLQotCQlEaXJlY3QzRFN3YXBDaGFpbjkgKnN3YXBDaGFpbjsKLQkJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0WzRdOwotCQlEaXJlY3QzRFN1cmZhY2U5ICpkZXB0aFN0ZW5jaWw7Ci0JCURpcmVjdDNEU3VyZmFjZTkgKmF1dG9EZXB0aFN0ZW5jaWw7Ci0KLQkJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqc3RhdGVSZWNvcmRlcjsKLQotCQl1bnNpZ25lZCBsb25nIHJlbmRlclN0YXRlW0QzRFJTX0JMRU5ET1BBTFBIQSArIDFdOwotCQl1bnNpZ25lZCBsb25nIHRleHR1cmVTdGFnZVN0YXRlWzhdW0QzRFRTU19DT05TVEFOVCArIDFdOwotCQl1bnNpZ25lZCBsb25nIHNhbXBsZXJTdGF0ZVsxNiArIDRdW0QzRFNBTVBfRE1BUE9GRlNFVCArIDFdOwotCQlib29sIGluaXQ7Ci0KLQkJc3RydWN0IFBhbGV0dGUKLQkJewotCQkJUEFMRVRURUVOVFJZIGVudHJ5WzI1Nl07Ci0JCX07Ci0KLQkJdW5zaWduZWQgaW50IGN1cnJlbnRQYWxldHRlOwotCQlzdGQ6Om1hcDxpbnQsIFBhbGV0dGU+IHBhbGV0dGU7Ci0KLQkJc3c6OkNvbnRleHQgKmNvbnRleHQ7Ci0JCXN3OjpSZW5kZXJlciAqcmVuZGVyZXI7Ci0KLQkJYm9vbCBpbnN0YW5jaW5nRW5hYmxlZDsKLQotCQlzdzo6U3VyZmFjZSAqY3Vyc29yOwotCQlib29sIHNob3dDdXJzb3I7Ci0KLQkJQ1JJVElDQUxfU0VDVElPTiBjcml0aWNhbFNlY3Rpb247Ci0JfTsKLQotCWNsYXNzIENyaXRpY2FsU2VjdGlvbgotCXsKLQlwdWJsaWM6Ci0JCUNyaXRpY2FsU2VjdGlvbihEaXJlY3QzRERldmljZTkgKmRldmljZSkgOiBkZXZpY2UoZGV2aWNlKQotCQl7Ci0JCQlpZihkZXZpY2UtPmJlaGF2aW91ckZsYWdzICYgRDNEQ1JFQVRFX01VTFRJVEhSRUFERUQpCi0JCQl7Ci0JCQkJRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRldmljZS0+Y3JpdGljYWxTZWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JCX5Dcml0aWNhbFNlY3Rpb24oKQotCQl7Ci0JCQlpZihkZXZpY2UtPmJlaGF2aW91ckZsYWdzICYgRDNEQ1JFQVRFX01VTFRJVEhSRUFERUQpCi0JCQl7Ci0JCQkJTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRldmljZS0+Y3JpdGljYWxTZWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JcHJpdmF0ZToKLQkJRGlyZWN0M0REZXZpY2U5ICpjb25zdCBkZXZpY2U7Ci0JfTsKLX0KLQotI2VuZGlmIC8vIEQzRDlfRGlyZWN0M0REZXZpY2U5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5RXguY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5RXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDZjM2UzLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOUV4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOUV4LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNEOUV4LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzREluZGV4QnVmZmVyOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFRleHR1cmU5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZVRleHR1cmU5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzREN1YmVUZXh0dXJlOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEU3dhcENoYWluOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RQaXhlbFNoYWRlcjkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4U2hhZGVyOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RTdGF0ZUJsb2NrOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RRdWVyeTkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lOS5ocHAiCi0KLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0jaW5jbHVkZSAiUmVuZGVyZXIuaHBwIgotI2luY2x1ZGUgIkZyYW1lQnVmZmVyLmhwcCIKLSNpbmNsdWRlICJDbGlwcGVyLmhwcCIKLSNpbmNsdWRlICJDb25maWd1cmF0b3IuaHBwIgotI2luY2x1ZGUgIlRpbWVyLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCWlubGluZSB1bnNpZ25lZCBsb25nIEZ0b0RXKGZsb2F0IGYpCi0JewotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcmKWY7Ci0JfQotCi0JaW5saW5lIGZsb2F0IERXdG9GKHVuc2lnbmVkIGxvbmcgZHcpCi0JewotCQlyZXR1cm4gKGZsb2F0JilkdzsKLQl9Ci0KLQlEaXJlY3QzRERldmljZTlFeDo6RGlyZWN0M0REZXZpY2U5RXgoY29uc3QgSElOU1RBTkNFIGluc3RhbmNlLCBEaXJlY3QzRDlFeCAqZDNkOWV4LCB1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBIV05EIGZvY3VzV2luZG93LCB1bnNpZ25lZCBsb25nIGJlaGF2aW91ckZsYWdzLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKSA6IERpcmVjdDNERGV2aWNlOShpbnN0YW5jZSwgZDNkOWV4LCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBmb2N1c1dpbmRvdywgYmVoYXZpb3VyRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzKSwgZDNkOWV4KGQzZDlleCkKLQl7Ci0JfQotCi0JRGlyZWN0M0REZXZpY2U5RXg6On5EaXJlY3QzRERldmljZTlFeCgpCi0JewotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVRSQUNFKCJjb25zdCBJSUQgJmlpZCA9IDB4JTAuOHAsIHZvaWQgKipvYmplY3QgPSAweCUwLjhwIiwgaWlkLCBvYmplY3QpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNERGV2aWNlOUV4IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNERGV2aWNlOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkFkZFJlZigpCi0JewotCQlUUkFDRSgidm9pZCIpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6QmVnaW5TY2VuZSgpCi0JewotCQlUUkFDRSgidm9pZCIpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkJlZ2luU2NlbmUoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpCZWdpblN0YXRlQmxvY2soKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpCZWdpblN0YXRlQmxvY2soKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDbGVhcih1bnNpZ25lZCBsb25nIGNvdW50LCBjb25zdCBEM0RSRUNUICpyZWN0cywgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBjb2xvciwgZmxvYXQgeiwgdW5zaWduZWQgbG9uZyBzdGVuY2lsKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgY291bnQgPSAlZCwgY29uc3QgRDNEUkVDVCAqcmVjdHMgPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gMHglMC44WCwgdW5zaWduZWQgbG9uZyBjb2xvciA9IDB4JTAuOFgsIGZsb2F0IHogPSAlZiwgdW5zaWduZWQgbG9uZyBzdGVuY2lsID0gJWQiLCBjb3VudCwgcmVjdHMsIGZsYWdzLCBjb2xvciwgeiwgc3RlbmNpbCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q2xlYXIoY291bnQsIHJlY3RzLCBmbGFncywgY29sb3IsIHosIHN0ZW5jaWwpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkNvbG9yRmlsbChJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSwgY29uc3QgUkVDVCAqcmVjdCwgRDNEQ09MT1IgY29sb3IpCi0JewotCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKnN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpyZWN0ID0gMHglMC44cCwgRDNEQ09MT1IgY29sb3IgPSAweCUwLjhYIiwgc3VyZmFjZSwgcmVjdCwgY29sb3IpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNvbG9yRmlsbChzdXJmYWNlLCByZWN0LCBjb2xvcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbihEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzLCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluKQotCXsKLQkJVFJBQ0UoIkQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwLCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluID0gMHglMC44cCIsIHByZXNlbnRQYXJhbWV0ZXJzLCBzd2FwQ2hhaW4pOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4ocHJlc2VudFBhcmFtZXRlcnMsIHN3YXBDaGFpbik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlQ3ViZVRleHR1cmUodW5zaWduZWQgaW50IGVkZ2VMZW5ndGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEQ3ViZVRleHR1cmU5ICoqY3ViZVRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGVkZ2VMZW5ndGggPSAlZCwgdW5zaWduZWQgaW50IGxldmVscyA9ICVkLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNEUE9PTCBwb29sID0gJWQsIElEaXJlY3QzREN1YmVUZXh0dXJlOSAqKmN1YmVUZXh0dXJlID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCBlZGdlTGVuZ3RoLCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIGN1YmVUZXh0dXJlLCBzaGFyZWRIYW5kbGUpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZUN1YmVUZXh0dXJlKGVkZ2VMZW5ndGgsIGxldmVscywgdXNhZ2UsIGZvcm1hdCwgcG9vbCwgY3ViZVRleHR1cmUsIHNoYXJlZEhhbmRsZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgZGlzY2FyZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCB3aWR0aCA9ICVkLCB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSA9ICVkLCB1bnNpZ25lZCBsb25nIG11bHRpU2FtcGxlUXVhbGl0eSA9ICVkLCBpbnQgZGlzY2FyZCA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgbXVsdGlTYW1wbGUsIG11bHRpU2FtcGxlUXVhbGl0eSwgZGlzY2FyZCwgc3VyZmFjZSwgc2hhcmVkSGFuZGxlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgbXVsdGlTYW1wbGUsIG11bHRpU2FtcGxlUXVhbGl0eSwgZGlzY2FyZCwgc3VyZmFjZSwgc2hhcmVkSGFuZGxlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVJbmRleEJ1ZmZlcih1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzREluZGV4QnVmZmVyOSAqKmluZGV4QnVmZmVyLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBsZW5ndGggPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRFBPT0wgcG9vbCA9ICVkLCBJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKippbmRleEJ1ZmZlciA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgbGVuZ3RoLCB1c2FnZSwgZm9ybWF0LCBwb29sLCBpbmRleEJ1ZmZlciwgc2hhcmVkSGFuZGxlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVJbmRleEJ1ZmZlcihsZW5ndGgsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIGluZGV4QnVmZmVyLCBzaGFyZWRIYW5kbGUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkNyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCB3aWR0aCA9ICVkLCB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNEUE9PTCBwb29sID0gJWQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwb29sLCBzdXJmYWNlLCBzaGFyZWRIYW5kbGUpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHBvb2wsIHN1cmZhY2UsIHNoYXJlZEhhbmRsZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlUGl4ZWxTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlcikKLQl7Ci0JCVRSQUNFKCJjb25zdCB1bnNpZ25lZCBsb25nICpmdW5jdGlvbiA9IDB4JTAuOHAsIElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlciA9IDB4JTAuOHAiLCBmdW5jdGlvbiwgc2hhZGVyKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVQaXhlbFNoYWRlcihmdW5jdGlvbiwgc2hhZGVyKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVRdWVyeShEM0RRVUVSWVRZUEUgdHlwZSwgSURpcmVjdDNEUXVlcnk5ICoqcXVlcnkpCi0JewotCQlUUkFDRSgiRDNEUVVFUllUWVBFIHR5cGUgPSAlZCwgSURpcmVjdDNEUXVlcnk5ICoqcXVlcnkgPSAweCUwLjhwIiwgdHlwZSwgcXVlcnkpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVF1ZXJ5KHR5cGUsIHF1ZXJ5KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVSZW5kZXJUYXJnZXQodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCB1bnNpZ25lZCBsb25nIG11bHRpU2FtcGxlUXVhbGl0eSwgaW50IGxvY2thYmxlLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UsIHZvaWQgKipzaGFyZWRIYW5kbGUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHdpZHRoID0gJWQsIHVuc2lnbmVkIGludCBoZWlnaHQgPSAlZCwgRDNERk9STUFUIGZvcm1hdCA9ICVkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlID0gJWQsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5ID0gJWQsIGludCBsb2NrYWJsZSA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgbXVsdGlTYW1wbGUsIG11bHRpU2FtcGxlUXVhbGl0eSwgbG9ja2FibGUsIHN1cmZhY2UsIHNoYXJlZEhhbmRsZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlUmVuZGVyVGFyZ2V0KHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgbXVsdGlTYW1wbGUsIG11bHRpU2FtcGxlUXVhbGl0eSwgbG9ja2FibGUsIHN1cmZhY2UsIHNoYXJlZEhhbmRsZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlU3RhdGVCbG9jayhEM0RTVEFURUJMT0NLVFlQRSB0eXBlLCBJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqKnN0YXRlQmxvY2spCi0JewotCQlUUkFDRSgiRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSA9ICVkLCBJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqKnN0YXRlQmxvY2sgPSAweCUwLjhwIiwgdHlwZSwgc3RhdGVCbG9jayk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlU3RhdGVCbG9jayh0eXBlLCBzdGF0ZUJsb2NrKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RUZXh0dXJlOSAqKnRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHdpZHRoID0gJWQsIHVuc2lnbmVkIGludCBoZWlnaHQgPSAlZCwgdW5zaWduZWQgaW50IGxldmVscyA9ICVkLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgRDNEUE9PTCBwb29sID0gJWQsIElEaXJlY3QzRFRleHR1cmU5ICoqdGV4dHVyZSA9IDB4JTAuOHAsIHZvaWQgKipzaGFyZWRIYW5kbGUgPSAweCUwLjhwIiwgd2lkdGgsIGhlaWdodCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sLCB0ZXh0dXJlLCBzaGFyZWRIYW5kbGUpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVRleHR1cmUod2lkdGgsIGhlaWdodCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sLCB0ZXh0dXJlLCBzaGFyZWRIYW5kbGUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkNyZWF0ZVZlcnRleEJ1ZmZlcih1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCB1bnNpZ25lZCBsb25nIEZWRiwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICoqdmVydGV4QnVmZmVyLCB2b2lkICoqc2hhcmVkSGFuZGxlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBsZW5ndGggPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCB1bnNpZ25lZCBsb25nIEZWRiA9IDB4JTAuOFgsIEQzRFBPT0wgcG9vbCA9ICVkLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICoqdmVydGV4QnVmZmVyID0gMHglMC44cCwgdm9pZCAqKnNoYXJlZEhhbmRsZSA9IDB4JTAuOHAiLCBsZW5ndGgsIHVzYWdlLCBGVkYsIHBvb2wsIHZlcnRleEJ1ZmZlciwgc2hhcmVkSGFuZGxlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVWZXJ0ZXhCdWZmZXIobGVuZ3RoLCB1c2FnZSwgRlZGLCBwb29sLCB2ZXJ0ZXhCdWZmZXIsIHNoYXJlZEhhbmRsZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlVmVydGV4RGVjbGFyYXRpb24oY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgKnZlcnRleEVsZW1lbnRzLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbikKLQl7Ci0JCVRSQUNFKCJjb25zdCBEM0RWRVJURVhFTEVNRU5UOSAqdmVydGV4RWxlbWVudHMgPSAweCUwLjhwLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbiA9IDB4JTAuOHAiLCB2ZXJ0ZXhFbGVtZW50cywgZGVjbGFyYXRpb24pOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uKHZlcnRleEVsZW1lbnRzLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlVmVydGV4U2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyKQotCXsKLQkJVFJBQ0UoImNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uID0gMHglMC44cCwgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqKnNoYWRlciA9IDB4JTAuOHAiLCBmdW5jdGlvbiwgc2hhZGVyKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpDcmVhdGVWZXJ0ZXhTaGFkZXIoZnVuY3Rpb24sIHNoYWRlcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlVm9sdW1lVGV4dHVyZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqKnZvbHVtZVRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHdpZHRoID0gJWQsIHVuc2lnbmVkIGludCBoZWlnaHQgPSAlZCwgdW5zaWduZWQgaW50IGRlcHRoID0gJWQsIHVuc2lnbmVkIGludCBsZXZlbHMgPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQsIEQzRFBPT0wgcG9vbCA9ICVkLCBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqKnZvbHVtZVRleHR1cmUgPSAweCUwLjhwLCB2b2lkICoqc2hhcmVkSGFuZGxlID0gMHglMC44cCIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wsIHZvbHVtZVRleHR1cmUsIHNoYXJlZEhhbmRsZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6Q3JlYXRlVm9sdW1lVGV4dHVyZSh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sLCB2b2x1bWVUZXh0dXJlLCBzaGFyZWRIYW5kbGUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkRlbGV0ZVBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGhhbmRsZSA9ICVkIiwgaGFuZGxlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpEZWxldGVQYXRjaChoYW5kbGUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkRyYXdJbmRleGVkUHJpbWl0aXZlKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgaW50IGJhc2VWZXJ0ZXhJbmRleCwgdW5zaWduZWQgaW50IG1pbkluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMsIHVuc2lnbmVkIGludCBzdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQpCi0JewotCQlUUkFDRSgiRDNEUFJJTUlUSVZFVFlQRSB0eXBlID0gJWQsIGludCBiYXNlVmVydGV4SW5kZXggPSAlZCwgdW5zaWduZWQgaW50IG1pbkluZGV4ID0gJWQsIHVuc2lnbmVkIGludCBudW1WZXJ0aWNlcyA9ICVkLCB1bnNpZ25lZCBpbnQgc3RhcnRJbmRleCA9ICVkLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQgPSAlZCIsIHR5cGUsIGJhc2VWZXJ0ZXhJbmRleCwgbWluSW5kZXgsIG51bVZlcnRpY2VzLCBzdGFydEluZGV4LCBwcmltaXRpdmVDb3VudCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6RHJhd0luZGV4ZWRQcmltaXRpdmUodHlwZSwgYmFzZVZlcnRleEluZGV4LCBtaW5JbmRleCwgbnVtVmVydGljZXMsIHN0YXJ0SW5kZXgsIHByaW1pdGl2ZUNvdW50KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpEcmF3SW5kZXhlZFByaW1pdGl2ZVVQKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IG1pbkluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqaW5kZXhEYXRhLCBEM0RGT1JNQVQgaW5kZXhEYXRhRm9ybWF0LCBjb25zdCB2b2lkICp2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUpCi0JewotCQlUUkFDRSgiRDNEUFJJTUlUSVZFVFlQRSB0eXBlID0gJWQsIHVuc2lnbmVkIGludCBtaW5JbmRleCA9ICVkLCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMgPSAlZCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50ID0gJWQsIGNvbnN0IHZvaWQgKmluZGV4RGF0YSA9IDB4JTAuOHAsIEQzREZPUk1BVCBpbmRleERhdGFGb3JtYXQgPSAlZCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSA9ICVkIiwgdHlwZSwgbWluSW5kZXgsIG51bVZlcnRpY2VzLCBwcmltaXRpdmVDb3VudCwgaW5kZXhEYXRhLCBpbmRleERhdGFGb3JtYXQsIHZlcnRleFN0cmVhbVplcm9EYXRhLCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpEcmF3SW5kZXhlZFByaW1pdGl2ZVVQKHR5cGUsIG1pbkluZGV4LCBudW1WZXJ0aWNlcywgcHJpbWl0aXZlQ291bnQsIGluZGV4RGF0YSwgaW5kZXhEYXRhRm9ybWF0LCB2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6RHJhd1ByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50KQotCXsKLQkJVFJBQ0UoIkQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlVHlwZSA9ICVkLCB1bnNpZ25lZCBpbnQgc3RhcnRWZXJ0ZXggPSAlZCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50ID0gJWQiLCBwcmltaXRpdmVUeXBlLCBzdGFydFZlcnRleCwgcHJpbWl0aXZlQ291bnQpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkRyYXdQcmltaXRpdmUocHJpbWl0aXZlVHlwZSwgc3RhcnRWZXJ0ZXgsIHByaW1pdGl2ZUNvdW50KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpEcmF3UHJpbWl0aXZlVVAoRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVUeXBlLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhLCB1bnNpZ25lZCBpbnQgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSkKLQl7Ci0JCVRSQUNFKCJEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUgPSAlZCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50ID0gJWQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUgPSAlZCIsIHByaW1pdGl2ZVR5cGUsIHByaW1pdGl2ZUNvdW50LCB2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6RHJhd1ByaW1pdGl2ZVVQKHByaW1pdGl2ZVR5cGUsIHByaW1pdGl2ZUNvdW50LCB2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6RHJhd1JlY3RQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlLCBjb25zdCBmbG9hdCAqbnVtU2VncywgY29uc3QgRDNEUkVDVFBBVENIX0lORk8gKnJlY3RQYXRjaEluZm8pCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IGhhbmRsZSA9ICVkLCBjb25zdCBmbG9hdCAqbnVtU2VncyA9IDB4JTAuOHAsIGNvbnN0IEQzRFJFQ1RQQVRDSF9JTkZPICpyZWN0UGF0Y2hJbmZvID0gMHglMC44cCIsIGhhbmRsZSwgbnVtU2VncywgcmVjdFBhdGNoSW5mbyk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6RHJhd1JlY3RQYXRjaChoYW5kbGUsIG51bVNlZ3MsIHJlY3RQYXRjaEluZm8pOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkRyYXdUcmlQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlLCBjb25zdCBmbG9hdCAqbnVtU2VncywgY29uc3QgRDNEVFJJUEFUQ0hfSU5GTyAqdHJpUGF0Y2hJbmZvKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBoYW5kbGUgPSAlZCwgY29uc3QgZmxvYXQgKm51bVNlZ3MgPSAweCUwLjhwLCBjb25zdCBEM0RUUklQQVRDSF9JTkZPICp0cmlQYXRjaEluZm8gPSAweCUwLjhwIiwgaGFuZGxlLCBudW1TZWdzLCB0cmlQYXRjaEluZm8pOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkRyYXdUcmlQYXRjaChoYW5kbGUsIG51bVNlZ3MsIHRyaVBhdGNoSW5mbyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6RW5kU2NlbmUoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpFbmRTY2VuZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkVuZFN0YXRlQmxvY2soSURpcmVjdDNEU3RhdGVCbG9jazkgKipzdGF0ZUJsb2NrKQotCXsKLQkJVFJBQ0UoIklEaXJlY3QzRFN0YXRlQmxvY2s5ICoqc3RhdGVCbG9jayA9IDB4JTAuOHAiLCBzdGF0ZUJsb2NrKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpFbmRTdGF0ZUJsb2NrKHN0YXRlQmxvY2spOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkV2aWN0TWFuYWdlZFJlc291cmNlcygpCi0JewotCQlUUkFDRSgidm9pZCIpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkV2aWN0TWFuYWdlZFJlc291cmNlcygpOwotCX0KLQotCXVuc2lnbmVkIGludCBEaXJlY3QzRERldmljZTlFeDo6R2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpCi0JewotCQlUUkFDRSgidm9pZCIpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldEF2YWlsYWJsZVRleHR1cmVNZW0oKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRCYWNrQnVmZmVyKHVuc2lnbmVkIGludCBzd2FwQ2hhaW5JbmRleCwgdW5zaWduZWQgaW50IGJhY2tCdWZmZXJJbmRleCwgRDNEQkFDS0JVRkZFUl9UWVBFIHR5cGUsIElEaXJlY3QzRFN1cmZhY2U5ICoqYmFja0J1ZmZlcikKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3dhcENoYWluSW5kZXggPSAlZCwgdW5zaWduZWQgaW50IGJhY2tCdWZmZXJJbmRleCA9ICVkLCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqKmJhY2tCdWZmZXIgPSAweCUwLjhwIiwgc3dhcENoYWluSW5kZXgsIGJhY2tCdWZmZXJJbmRleCwgdHlwZSwgYmFja0J1ZmZlcik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0QmFja0J1ZmZlcihzd2FwQ2hhaW5JbmRleCwgYmFja0J1ZmZlckluZGV4LCB0eXBlLCBiYWNrQnVmZmVyKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgZmxvYXQgKnBsYW5lKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgZmxvYXQgKnBsYW5lID0gMHglMC44cCIsIGluZGV4LCBwbGFuZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0Q2xpcFBsYW5lKGluZGV4LCBwbGFuZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0Q2xpcFN0YXR1cyhEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cykKLQl7Ci0JCVRSQUNFKCJEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cyA9IDB4JTAuOHAiLCBjbGlwU3RhdHVzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRDbGlwU3RhdHVzKGNsaXBTdGF0dXMpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldENyZWF0aW9uUGFyYW1ldGVycyhEM0RERVZJQ0VfQ1JFQVRJT05fUEFSQU1FVEVSUyAqcGFyYW1ldGVycykKLQl7Ci0JCVRSQUNFKCJEM0RERVZJQ0VfQ1JFQVRJT05fUEFSQU1FVEVSUyAqcGFyYW1ldGVycyA9IDB4JTAuOHAiLCBwYXJhbWV0ZXJzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRDcmVhdGlvblBhcmFtZXRlcnMocGFyYW1ldGVycyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlcikKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgKnBhbGV0dGVOdW1iZXIgPSAweCUwLjhwIiwgcGFsZXR0ZU51bWJlcik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHBhbGV0dGVOdW1iZXIpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKipkZXB0aFN0ZW5jaWxTdXJmYWNlKQotCXsKLQkJVFJBQ0UoIklEaXJlY3QzRFN1cmZhY2U5ICoqZGVwdGhTdGVuY2lsU3VyZmFjZSA9IDB4JTAuOHAiLCBkZXB0aFN0ZW5jaWxTdXJmYWNlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXREZXB0aFN0ZW5jaWxTdXJmYWNlKGRlcHRoU3RlbmNpbFN1cmZhY2UpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldERldmljZUNhcHMoRDNEQ0FQUzkgKmNhcHMpCi0JewotCQlUUkFDRSgiRDNEQ0FQUzkgKmNhcHMgPSAweCUwLjhwIiwgY2Fwcyk7Ci0KLQkJcmV0dXJuIGQzZDlleC0+R2V0RGV2aWNlQ2FwcyhEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMLCBjYXBzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXREaXJlY3QzRChJRGlyZWN0M0Q5ICoqZDNkOSkKLQl7Ci0JCVRSQUNFKCJJRGlyZWN0M0Q5ICoqZDNkOSA9IDB4JTAuOHAiLCBkM2Q5KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXREaXJlY3QzRChkM2Q5KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXREaXNwbGF5TW9kZSh1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRERJU1BMQVlNT0RFICptb2RlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBpbmRleCA9ICVkLCBEM0RESVNQTEFZTU9ERSAqbW9kZSA9IDB4JTAuOHAiLCBpbmRleCwgbW9kZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0RGlzcGxheU1vZGUoaW5kZXgsIG1vZGUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldEZyb250QnVmZmVyRGF0YSh1bnNpZ25lZCBpbnQgaW5kZXgsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0U3VyZmFjZSkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlID0gJXAiLCBpbmRleCwgZGVzdFN1cmZhY2UpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldEZyb250QnVmZmVyRGF0YShpbmRleCwgZGVzdFN1cmZhY2UpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldEZWRih1bnNpZ25lZCBsb25nICpGVkYpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyAqRlZGID0gMHglMC44cCIsIEZWRik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0RlZGKEZWRik7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRERldmljZTlFeDo6R2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBpbmRleCwgRDNER0FNTUFSQU1QICpyYW1wKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBpbmRleCA9ICVkLCBEM0RHQU1NQVJBTVAgKnJhbXAgPSAweCUwLjhwIiwgaW5kZXgsIHJhbXApOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldEdhbW1hUmFtcChpbmRleCwgcmFtcCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0SW5kaWNlcyhJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKippbmRleERhdGEpCi0JewotCQlUUkFDRSgiSURpcmVjdDNESW5kZXhCdWZmZXI5ICoqaW5kZXhEYXRhID0gMHglMC44cCIsIGluZGV4RGF0YSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0SW5kaWNlcyhpbmRleERhdGEpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRExJR0hUOSAqbGlnaHQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBEM0RMSUdIVDkgKmxpZ2h0ID0gMHglMC44cCIsIGluZGV4LCBsaWdodCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0TGlnaHQoaW5kZXgsIGxpZ2h0KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgKmVuYWJsZSkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGludCAqZW5hYmxlID0gMHglMC44cCIsIGluZGV4LCBlbmFibGUpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldExpZ2h0RW5hYmxlKGluZGV4LCBlbmFibGUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldE1hdGVyaWFsKEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwpCi0JewotCQlUUkFDRSgiRDNETUFURVJJQUw5ICptYXRlcmlhbCA9IDB4JTAuOHAiLCBtYXRlcmlhbCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0TWF0ZXJpYWwobWF0ZXJpYWwpOwotCX0KLQotCWZsb2F0IERpcmVjdDNERGV2aWNlOUV4OjpHZXROUGF0Y2hNb2RlKCkKLQl7Ci0JCVRSQUNFKCJ2b2lkIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0TlBhdGNoTW9kZSgpOwotCX0KLQotCXVuc2lnbmVkIGludCBEaXJlY3QzRERldmljZTlFeDo6R2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCkKLQl7Ci0JCVRSQUNFKCJ2b2lkIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0TnVtYmVyT2ZTd2FwQ2hhaW5zKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0UGFsZXR0ZUVudHJpZXModW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIsIFBBTEVUVEVFTlRSWSAqZW50cmllcykKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciA9ICVkLCBQQUxFVFRFRU5UUlkgKmVudHJpZXMgPSAweCUwLjhwIiwgcGFsZXR0ZU51bWJlciwgZW50cmllcyk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0UGFsZXR0ZUVudHJpZXMocGFsZXR0ZU51bWJlciwgZW50cmllcyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0UGl4ZWxTaGFkZXIoSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICoqc2hhZGVyKQotCXsKLQkJVFJBQ0UoIklEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlciA9IDB4JTAuOHAiLCBzaGFkZXIpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFBpeGVsU2hhZGVyKHNoYWRlcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0UGl4ZWxTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnRCKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRQaXhlbFNoYWRlckNvbnN0YW50SShzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRSYXN0ZXJTdGF0dXModW5zaWduZWQgaW50IHN3YXBDaGFpbiwgRDNEUkFTVEVSX1NUQVRVUyAqcmFzdGVyU3RhdHVzKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzd2FwQ2hhaW4gPSAlZCwgRDNEUkFTVEVSX1NUQVRVUyAqcmFzdGVyU3RhdHVzID0gMHglMC44cCIsIHN3YXBDaGFpbiwgcmFzdGVyU3RhdHVzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRSYXN0ZXJTdGF0dXMoc3dhcENoYWluLCByYXN0ZXJTdGF0dXMpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi0JewotCQlUUkFDRSgiRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlID0gJWQsIHVuc2lnbmVkIGxvbmcgKnZhbHVlID0gMHglMC44cCIsIHN0YXRlLCB2YWx1ZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0UmVuZGVyU3RhdGUoc3RhdGUsIHZhbHVlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRSZW5kZXJUYXJnZXQodW5zaWduZWQgbG9uZyBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKipyZW5kZXJUYXJnZXQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnJlbmRlclRhcmdldCA9IDB4JTAuOHAiLCBpbmRleCwgcmVuZGVyVGFyZ2V0KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRSZW5kZXJUYXJnZXQoaW5kZXgsIHJlbmRlclRhcmdldCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0UmVuZGVyVGFyZ2V0RGF0YShJRGlyZWN0M0RTdXJmYWNlOSAqcmVuZGVyVGFyZ2V0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UpCi0JewotCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKnJlbmRlclRhcmdldCA9IDB4JTAuOHAsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0U3VyZmFjZSA9IDB4JTAuOHAiLCByZW5kZXJUYXJnZXQsIGRlc3RTdXJmYWNlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRSZW5kZXJUYXJnZXREYXRhKHJlbmRlclRhcmdldCwgZGVzdFN1cmZhY2UpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFNhbXBsZXJTdGF0ZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc2FtcGxlciA9ICVkLCBEM0RTQU1QTEVSU1RBVEVUWVBFIHR5cGUgPSAlZCwgdW5zaWduZWQgbG9uZyAqdmFsdWUgPSAweCUwLjhwIiwgc2FtcGxlciwgc3RhdGUsIHZhbHVlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRTYW1wbGVyU3RhdGUoc2FtcGxlciwgc3RhdGUsIHZhbHVlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRTY2lzc29yUmVjdChSRUNUICpyZWN0KQotCXsKLQkJVFJBQ0UoIlJFQ1QgKnJlY3QgPSAweCUwLjhwIiwgcmVjdCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0U2Npc3NvclJlY3QocmVjdCk7Ci0JfQotCi0JaW50IERpcmVjdDNERGV2aWNlOUV4OjpHZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbU51bWJlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqKnN0cmVhbURhdGEsIHVuc2lnbmVkIGludCAqb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKnN0cmlkZSkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyID0gJWQsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKipzdHJlYW1EYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50ICpvZmZzZXQgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgKnN0cmlkZSA9IDB4JTAuOHAiLCBzdHJlYW1OdW1iZXIsIHN0cmVhbURhdGEsIG9mZnNldCwgc3RyaWRlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRTdHJlYW1Tb3VyY2Uoc3RyZWFtTnVtYmVyLCBzdHJlYW1EYXRhLCBvZmZzZXQsIHN0cmlkZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0U3RyZWFtU291cmNlRnJlcSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCB1bnNpZ25lZCBpbnQgKmRpdmlkZXIpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0cmVhbU51bWJlciA9ICVkLCB1bnNpZ25lZCBpbnQgKmRpdmlkZXIgPSAweCUwLjhwIiwgc3RyZWFtTnVtYmVyLCBkaXZpZGVyKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRTdHJlYW1Tb3VyY2VGcmVxKHN0cmVhbU51bWJlciwgZGl2aWRlcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0U3dhcENoYWluKHVuc2lnbmVkIGludCBpbmRleCwgSURpcmVjdDNEU3dhcENoYWluOSAqKnN3YXBDaGFpbikKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgSURpcmVjdDNEU3dhcENoYWluOSAqKnN3YXBDaGFpbiA9IDB4JTAuOHAiLCBpbmRleCwgc3dhcENoYWluKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRTd2FwQ2hhaW4oaW5kZXgsIHN3YXBDaGFpbik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKnRleHR1cmUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBzYW1wbGVyID0gJWQsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqKnRleHR1cmUgPSAweCUwLjhwIiwgc2FtcGxlciwgdGV4dHVyZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0VGV4dHVyZShzYW1wbGVyLCB0ZXh0dXJlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBzdGFnZSA9ICVkLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSA9ICVkLCB1bnNpZ25lZCBsb25nICp2YWx1ZSA9IDB4JTAuOHAiLCBzdGFnZSwgdHlwZSwgdmFsdWUpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCB0eXBlLCB2YWx1ZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6R2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgRDNETUFUUklYICptYXRyaXgpCi0JewotCQlUUkFDRSgiRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlID0gJWQsIEQzRE1BVFJJWCAqbWF0cml4ID0gMHglMC44cCIsIHN0YXRlLCBtYXRyaXgpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFRyYW5zZm9ybShzdGF0ZSwgbWF0cml4KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbikKLQl7Ci0JCVRSQUNFKCJJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbiA9IDB4JTAuOHAiLCBkZWNsYXJhdGlvbik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0VmVydGV4RGVjbGFyYXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFZlcnRleFNoYWRlcihJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICoqc2hhZGVyKQotCXsKLQkJVFJBQ0UoIklEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIgPSAweCUwLjhwIiwgc2hhZGVyKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpHZXRWZXJ0ZXhTaGFkZXIoc2hhZGVyKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OkdldFZlcnRleFNoYWRlckNvbnN0YW50QihzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFZlcnRleFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkdldFZpZXdwb3J0KEQzRFZJRVdQT1JUOSAqdmlld3BvcnQpCi0JewotCQlUUkFDRSgiRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCA9IDB4JTAuOHAiLCB2aWV3cG9ydCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6R2V0Vmlld3BvcnQodmlld3BvcnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OkxpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCBlbmFibGUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBpbnQgZW5hYmxlID0gJWQiLCBpbmRleCwgZW5hYmxlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpMaWdodEVuYWJsZShpbmRleCwgZW5hYmxlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpNdWx0aXBseVRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KQotCXsKLQkJVFJBQ0UoIkQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSA9ICVkLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCA9IDB4JTAuOHAiLCBzdGF0ZSwgbWF0cml4KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpNdWx0aXBseVRyYW5zZm9ybShzdGF0ZSwgbWF0cml4KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpQcmVzZW50KGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBIV05EIGRlc3RXaW5kb3dPdmVycmlkZSwgY29uc3QgUkdOREFUQSAqZGlydHlSZWdpb24pCi0JewotCQlUUkFDRSgiY29uc3QgUkVDVCAqc291cmNlUmVjdCA9IDB4JTAuOHAsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0ID0gMHglMC44cCwgSFdORCBkZXN0V2luZG93T3ZlcnJpZGUgPSAlZCwgY29uc3QgUkdOREFUQSAqZGlydHlSZWdpb24gPSAweCUwLjhwIiwgc291cmNlUmVjdCwgZGVzdFJlY3QsIGRlc3RXaW5kb3dPdmVycmlkZSwgZGlydHlSZWdpb24pOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlByZXNlbnQoc291cmNlUmVjdCwgZGVzdFJlY3QsIGRlc3RXaW5kb3dPdmVycmlkZSwgZGlydHlSZWdpb24pOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlByb2Nlc3NWZXJ0aWNlcyh1bnNpZ25lZCBpbnQgc3JjU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IGRlc3RJbmRleCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkZXN0QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzcmNTdGFydEluZGV4ID0gJWQsIHVuc2lnbmVkIGludCBkZXN0SW5kZXggPSAlZCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50ID0gJWQsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRlc3RCdWZmZXIgPSAweCUwLjhwLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyBmbGFncyA9ICVkIiwgc3JjU3RhcnRJbmRleCwgZGVzdEluZGV4LCB2ZXJ0ZXhDb3VudCwgZGVzdEJ1ZmZlciwgdmVydGV4RGVjbGFyYXRpb24sIGZsYWdzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpQcm9jZXNzVmVydGljZXMoc3JjU3RhcnRJbmRleCwgZGVzdEluZGV4LCB2ZXJ0ZXhDb3VudCwgZGVzdEJ1ZmZlciwgdmVydGV4RGVjbGFyYXRpb24sIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpSZXNldChEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKQotCXsKLQkJVFJBQ0UoIkQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwIiwgcHJlc2VudFBhcmFtZXRlcnMpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlJlc2V0KHByZXNlbnRQYXJhbWV0ZXJzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRDbGlwUGxhbmUodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgZmxvYXQgKnBsYW5lKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgaW5kZXggPSAlZCwgY29uc3QgZmxvYXQgKnBsYW5lID0gMHglMC44cCIsIGluZGV4LCBwbGFuZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0Q2xpcFBsYW5lKGluZGV4LCBwbGFuZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0Q2xpcFN0YXR1cyhjb25zdCBEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cykKLQl7Ci0JCVRSQUNFKCJjb25zdCBEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cyA9IDB4JTAuOHAiLCBjbGlwU3RhdHVzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRDbGlwU3RhdHVzKGNsaXBTdGF0dXMpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcikKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciA9ICVkIiwgcGFsZXR0ZU51bWJlcik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHBhbGV0dGVOdW1iZXIpOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U5RXg6OlNldEN1cnNvclBvc2l0aW9uKGludCB4LCBpbnQgeSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCVRSQUNFKCJpbnQgeCA9ICVkLCBpbnQgeSA9ICVkLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gMHglMC44WCIsIHgsIHksIGZsYWdzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRDdXJzb3JQb3NpdGlvbih4LCB5LCBmbGFncyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0Q3Vyc29yUHJvcGVydGllcyh1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHksIElEaXJlY3QzRFN1cmZhY2U5ICpjdXJzb3JCaXRtYXApCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHggPSAlZCwgdW5zaWduZWQgaW50IHkgPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKmN1cnNvckJpdG1hcCA9IDB4JTAuOHAiLCB4LCB5LCBjdXJzb3JCaXRtYXApOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldEN1cnNvclByb3BlcnRpZXMoeCwgeSwgY3Vyc29yQml0bWFwKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXREZXB0aFN0ZW5jaWxTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U5ICppRGVwdGhTdGVuY2lsKQotCXsKLQkJVFJBQ0UoIklEaXJlY3QzRFN1cmZhY2U5ICpuZXdEZXB0aFN0ZW5jaWwgPSAweCUwLjhwIiwgaURlcHRoU3RlbmNpbCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0RGVwdGhTdGVuY2lsU3VyZmFjZShpRGVwdGhTdGVuY2lsKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXREaWFsb2dCb3hNb2RlKGludCBlbmFibGVEaWFsb2dzKQotCXsKLQkJVFJBQ0UoImludCBlbmFibGVEaWFsb2dzID0gJWQiLCBlbmFibGVEaWFsb2dzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXREaWFsb2dCb3hNb2RlKGVuYWJsZURpYWxvZ3MpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldEZWRih1bnNpZ25lZCBsb25nIEZWRikKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIEZWRiA9IDB4JTAuOFgiLCBGVkYpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldEZWRihGVkYpOwotCX0KLQotCXZvaWQgRGlyZWN0M0REZXZpY2U5RXg6OlNldEdhbW1hUmFtcCh1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IEQzREdBTU1BUkFNUCAqcmFtcCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgaW5kZXggPSAlZCwgdW5zaWduZWQgbG9uZyBmbGFncyA9IDB4JTAuOFgsIGNvbnN0IEQzREdBTU1BUkFNUCAqcmFtcCA9IDB4JTAuOHAiLCBpbmRleCwgZmxhZ3MsIHJhbXApOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldEdhbW1hUmFtcChpbmRleCwgZmxhZ3MsIHJhbXApOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI5KiBpSW5kZXhCdWZmZXIpCi0JewotCQlUUkFDRSgiSURpcmVjdDNESW5kZXhCdWZmZXI5KiBpbmRleERhdGEgPSAweCUwLjhwIiwgaUluZGV4QnVmZmVyKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRJbmRpY2VzKGlJbmRleEJ1ZmZlcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgRDNETElHSFQ5ICpsaWdodCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIGluZGV4ID0gJWQsIGNvbnN0IEQzRExJR0hUOSAqbGlnaHQgPSAweCUwLjhwIiwgaW5kZXgsIGxpZ2h0KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRMaWdodChpbmRleCwgbGlnaHQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwpCi0JewotCQlUUkFDRSgiY29uc3QgRDNETUFURVJJQUw5ICptYXRlcmlhbCA9IDB4JTAuOHAiLCBtYXRlcmlhbCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0TWF0ZXJpYWwobWF0ZXJpYWwpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldE5QYXRjaE1vZGUoZmxvYXQgc2VnbWVudHMpCi0JewotCQlUUkFDRSgiZmxvYXQgc2VnbWVudHMgPSAlZiIsIHNlZ21lbnRzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXROUGF0Y2hNb2RlKHNlZ21lbnRzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRQYWxldHRlRW50cmllcyh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciwgY29uc3QgUEFMRVRURUVOVFJZICplbnRyaWVzKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyID0gJWQsIGNvbnN0IFBBTEVUVEVFTlRSWSAqZW50cmllcyA9IDB4JTAuOHAiLCBwYWxldHRlTnVtYmVyLCBlbnRyaWVzKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRQYWxldHRlRW50cmllcyhwYWxldHRlTnVtYmVyLCBlbnRyaWVzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRQaXhlbFNoYWRlcihJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKmlQaXhlbFNoYWRlcikKLQl7Ci0JCVRSQUNFKCJJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnNoYWRlciA9IDB4JTAuOHAiLCBpUGl4ZWxTaGFkZXIpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFBpeGVsU2hhZGVyKGlQaXhlbFNoYWRlcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0UGl4ZWxTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgY29uc3QgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIgPSAlZCwgY29uc3QgaW50ICpjb25zdGFudERhdGEgPSAweCUwLjhwLCB1bnNpZ25lZCBpbnQgY291bnQgPSAlZCIsIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRQaXhlbFNoYWRlckNvbnN0YW50SShzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi0JewotCQlUUkFDRSgiRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlID0gJWQsIHVuc2lnbmVkIGxvbmcgdmFsdWUgPSAlZCIsIHN0YXRlLCB2YWx1ZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0UmVuZGVyU3RhdGUoc3RhdGUsIHZhbHVlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRSZW5kZXJUYXJnZXQodW5zaWduZWQgbG9uZyBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKmlSZW5kZXJUYXJnZXQpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBpbmRleCA9ICVkLCBJRGlyZWN0M0RTdXJmYWNlOSAqbmV3UmVuZGVyVGFyZ2V0ID0gMHglMC44cCIsIGluZGV4LCBpUmVuZGVyVGFyZ2V0KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRSZW5kZXJUYXJnZXQoaW5kZXgsIGlSZW5kZXJUYXJnZXQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFNhbXBsZXJTdGF0ZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBzYW1wbGVyID0gJWQsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUgPSAlZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICVkIiwgc2FtcGxlciwgc3RhdGUsIHZhbHVlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRTYW1wbGVyU3RhdGUoc2FtcGxlciwgc3RhdGUsIHZhbHVlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRTY2lzc29yUmVjdChjb25zdCBSRUNUICpyZWN0KQotCXsKLQkJVFJBQ0UoImNvbnN0IFJFQ1QgKnJlY3QgPSAweCUwLjhwIiwgcmVjdCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0U2Npc3NvclJlY3QocmVjdCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0U29mdHdhcmVWZXJ0ZXhQcm9jZXNzaW5nKGludCBzb2Z0d2FyZSkKLQl7Ci0JCVRSQUNFKCJpbnQgc29mdHdhcmUgPSAlZCIsIHNvZnR3YXJlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3Npbmcoc29mdHdhcmUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICppVmVydGV4QnVmZmVyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc3RyaWRlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdHJlYW0gPSAlZCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqZGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBvZmZzZXQgPSAlZCwgdW5zaWduZWQgaW50IHN0cmlkZSA9ICVkIiwgc3RyZWFtLCBpVmVydGV4QnVmZmVyLCBvZmZzZXQsIHN0cmlkZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0U3RyZWFtU291cmNlKHN0cmVhbSwgaVZlcnRleEJ1ZmZlciwgb2Zmc2V0LCBzdHJpZGUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFN0cmVhbVNvdXJjZUZyZXEodW5zaWduZWQgaW50IHN0cmVhbU51bWJlciwgdW5zaWduZWQgaW50IGRpdmlkZXIpCi0JewotCQlUUkFDRSgidW5zaWduZWQgaW50IHN0cmVhbU51bWJlciA9ICVkLCB1bnNpZ25lZCBpbnQgZGl2aWRlciA9ICVkIiwgc3RyZWFtTnVtYmVyLCBkaXZpZGVyKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRTdHJlYW1Tb3VyY2VGcmVxKHN0cmVhbU51bWJlciwgZGl2aWRlcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqaUJhc2VUZXh0dXJlKQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgc2FtcGxlciA9ICVkLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmUgPSAweCUwLjhwIiwgc2FtcGxlciwgaUJhc2VUZXh0dXJlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRUZXh0dXJlKHNhbXBsZXIsIGlCYXNlVGV4dHVyZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0VGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyBzdGFnZSA9ICVkLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSA9ICVkLCB1bnNpZ25lZCBsb25nIHZhbHVlID0gJWQiLCBzdGFnZSwgdHlwZSwgdmFsdWUpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCB0eXBlLCB2YWx1ZSk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpCi0JewotCQlUUkFDRSgiRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlID0gJWQsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4ID0gMHglMC44cCIsIHN0YXRlLCBtYXRyaXgpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlNldFRyYW5zZm9ybShzdGF0ZSwgbWF0cml4KTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmlWZXJ0ZXhEZWNsYXJhdGlvbikKLQl7Ci0JCVRSQUNFKCJJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKmRlY2xhcmF0aW9uID0gMHglMC44cCIsIGlWZXJ0ZXhEZWNsYXJhdGlvbik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4RGVjbGFyYXRpb24oaVZlcnRleERlY2xhcmF0aW9uKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpTZXRWZXJ0ZXhTaGFkZXIoSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqaVZlcnRleFNoYWRlcikKLQl7Ci0JCVRSQUNFKCJJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICpzaGFkZXIgPSAweCUwLjhwIiwgaVZlcnRleFNoYWRlcik7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4U2hhZGVyKGlWZXJ0ZXhTaGFkZXIpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFZlcnRleFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKLQl7Ci0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciA9ICVkLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSA9IDB4JTAuOHAsIHVuc2lnbmVkIGludCBjb3VudCA9ICVkIiwgc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6U2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKHN0YXJ0UmVnaXN0ZXIsIGNvbnN0YW50RGF0YSwgY291bnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJVFJBQ0UoInVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyID0gJWQsIGNvbnN0IGludCAqY29uc3RhbnREYXRhID0gMHglMC44cCwgdW5zaWduZWQgaW50IGNvdW50ID0gJWQiLCBzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6U2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCkKLQl7Ci0JCVRSQUNFKCJjb25zdCBEM0RWSUVXUE9SVDkgKnZpZXdwb3J0ID0gMHglMC44cCIsIHZpZXdwb3J0KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTZXRWaWV3cG9ydCh2aWV3cG9ydCk7Ci0JfQotCi0JaW50IERpcmVjdDNERGV2aWNlOUV4OjpTaG93Q3Vyc29yKGludCBzaG93KQotCXsKLQkJVFJBQ0UoImludCBzaG93ID0gJWQiLCBzaG93KTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTaG93Q3Vyc29yKHNob3cpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlN0cmV0Y2hSZWN0KElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpCi0JewotCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlID0gMHglMC44cCwgY29uc3QgUkVDVCAqZGVzdFJlY3QgPSAweCUwLjhwLCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIgPSAlZCIsIHNvdXJjZVN1cmZhY2UsIHNvdXJjZVJlY3QsIGRlc3RTdXJmYWNlLCBkZXN0UmVjdCwgZmlsdGVyKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdChzb3VyY2VTdXJmYWNlLCBzb3VyY2VSZWN0LCBkZXN0U3VyZmFjZSwgZGVzdFJlY3QsIGZpbHRlcik7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRERldmljZTlFeDo6VGVzdENvb3BlcmF0aXZlTGV2ZWwoKQotCXsKLQkJVFJBQ0UoInZvaWQiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0REZXZpY2U5OjpUZXN0Q29vcGVyYXRpdmVMZXZlbCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlVwZGF0ZVN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UsIGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0aW5hdGlvblN1cmZhY2UsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQpCi0JewotCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTkgKnNvdXJjZVN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RpbmF0aW9uU3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQgPSAweCUwLjhwIiwgc291cmNlU3VyZmFjZSwgc291cmNlUmVjdCwgZGVzdGluYXRpb25TdXJmYWNlLCBkZXN0UG9pbnQpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlVwZGF0ZVN1cmZhY2Uoc291cmNlU3VyZmFjZSwgc291cmNlUmVjdCwgZGVzdGluYXRpb25TdXJmYWNlLCBkZXN0UG9pbnQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0REZXZpY2U5RXg6OlVwZGF0ZVRleHR1cmUoSURpcmVjdDNEQmFzZVRleHR1cmU5ICpzb3VyY2VUZXh0dXJlLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKmRlc3RpbmF0aW9uVGV4dHVyZSkKLQl7Ci0JCVRSQUNFKCJJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnNvdXJjZVRleHR1cmUgPSAweCUwLjhwLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKmRlc3RpbmF0aW9uVGV4dHVyZSA9IDB4JTAuOHAiLCBzb3VyY2VUZXh0dXJlLCBkZXN0aW5hdGlvblRleHR1cmUpOwotCi0JCXJldHVybiBEaXJlY3QzRERldmljZTk6OlVwZGF0ZVRleHR1cmUoc291cmNlVGV4dHVyZSwgZGVzdGluYXRpb25UZXh0dXJlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNERGV2aWNlOUV4OjpWYWxpZGF0ZURldmljZSh1bnNpZ25lZCBsb25nICpudW1QYXNzZXMpCi0JewotCQlUUkFDRSgidW5zaWduZWQgbG9uZyAqbnVtUGFzc2VzID0gMHglMC44cCIsIG51bVBhc3Nlcyk7Ci0KLQkJcmV0dXJuIERpcmVjdDNERGV2aWNlOTo6VmFsaWRhdGVEZXZpY2UobnVtUGFzc2VzKTsKLQl9Ci0KLQlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpTZXRDb252b2x1dGlvbk1vbm9LZXJuZWwoVUlOVCxVSU5ULGZsb2F0ICosZmxvYXQgKikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpDb21wb3NlUmVjdHMoSURpcmVjdDNEU3VyZmFjZTkgKixJRGlyZWN0M0RTdXJmYWNlOSAqLElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKixVSU5ULElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKixEM0RDT01QT1NFUkVDVFNPUCxpbnQsaW50KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OlByZXNlbnRFeChjb25zdCBSRUNUICosY29uc3QgUkVDVCAqLEhXTkQsY29uc3QgUkdOREFUQSAqLERXT1JEKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OkdldEdQVVRocmVhZFByaW9yaXR5KElOVCAqKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OlNldEdQVVRocmVhZFByaW9yaXR5KElOVCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpXYWl0Rm9yVkJsYW5rKFVJTlQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JSFJFU1VMVCBEaXJlY3QzRERldmljZTlFeDo6Q2hlY2tSZXNvdXJjZVJlc2lkZW5jeShJRGlyZWN0M0RSZXNvdXJjZTkgKiosVUlOVDMyKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OlNldE1heGltdW1GcmFtZUxhdGVuY3koVUlOVCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpHZXRNYXhpbXVtRnJhbWVMYXRlbmN5KFVJTlQgKikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpDaGVja0RldmljZVN0YXRlKEhXTkQgZGVzdGluYXRpb25XaW5kb3cpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkvLwlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVSZW5kZXJUYXJnZXRFeChVSU5ULFVJTlQsRDNERk9STUFULEQzRE1VTFRJU0FNUExFX1RZUEUsRFdPUkQsQk9PTCxJRGlyZWN0M0RTdXJmYWNlOSAqKixIQU5ETEUgKixEV09SRCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzKTsKLQotCQlVTklNUExFTUVOVEVEKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlIUkVTVUxUIERpcmVjdDNERGV2aWNlOUV4OjpDcmVhdGVPZmZzY3JlZW5QbGFpblN1cmZhY2VFeChVSU5ULFVJTlQsRDNERk9STUFULEQzRFBPT0wsSURpcmVjdDNEU3VyZmFjZTkgKiosSEFORExFICosRFdPUkQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JSFJFU1VMVCBEaXJlY3QzRERldmljZTlFeDo6Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZUV4KFVJTlQsVUlOVCxEM0RGT1JNQVQsRDNETVVMVElTQU1QTEVfVFlQRSxEV09SRCxCT09MLElEaXJlY3QzRFN1cmZhY2U5ICoqLEhBTkRMRSAqLERXT1JEKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OlJlc2V0RXgoRDNEUFJFU0VOVF9QQVJBTUVURVJTICosRDNERElTUExBWU1PREVFWCAqKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMpOwotCi0JCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCUhSRVNVTFQgRGlyZWN0M0REZXZpY2U5RXg6OkdldERpc3BsYXlNb2RlRXgoVUlOVCxEM0RESVNQTEFZTU9ERUVYICosRDNERElTUExBWVJPVEFUSU9OICopCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcyk7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5RXguaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5RXguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTI4ZGY1Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOUV4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0REZXZpY2U5RXhfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0REZXZpY2U5RXhfaHBwCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0Q5RXguaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEU3dhcENoYWluOS5ocHAiCi0KLSNpbmNsdWRlICJTdHJlYW0uaHBwIgotCi0jaW5jbHVkZSA8ZDNkOS5oPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIHN3Ci17Ci0JY2xhc3MgUmVuZGVyZXI7Ci0JY2xhc3MgQ29udGV4dDsKLX0KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOTsKLQljbGFzcyBEaXJlY3QzRFN0YXRlQmxvY2s5OwotCWNsYXNzIERpcmVjdDNEU3VyZmFjZTk7Ci0JY2xhc3MgRGlyZWN0M0RQaXhlbFNoYWRlcjk7Ci0JY2xhc3MgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5OwotCWNsYXNzIGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjk7Ci0JY2xhc3MgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OwotCWNsYXNzIERpcmVjdDNESW5kZXhCdWZmZXI5OwotCi0JY2xhc3MgRGlyZWN0M0REZXZpY2U5RXggOiBwdWJsaWMgSURpcmVjdDNERGV2aWNlOUV4LCBwdWJsaWMgRGlyZWN0M0REZXZpY2U5Ci0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0REZXZpY2U5RXgoY29uc3QgSElOU1RBTkNFIGluc3RhbmNlLCBEaXJlY3QzRDlFeCAqZDNkOWV4LCB1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBIV05EIGZvY3VzV2luZG93LCB1bnNpZ25lZCBsb25nIGJlaGF2aW91ckZsYWdzLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKTsKLQotCQl+RGlyZWN0M0REZXZpY2U5RXgoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0REZXZpY2U5IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgVGVzdENvb3BlcmF0aXZlTGV2ZWwoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEV2aWN0TWFuYWdlZFJlc291cmNlcygpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREaXJlY3QzRChJRGlyZWN0M0Q5ICoqRDNEKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlQ2FwcyhEM0RDQVBTOSAqY2Fwcykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4gLEQzRERJU1BMQVlNT0RFICptb2RlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Q3JlYXRpb25QYXJhbWV0ZXJzKEQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0Q3Vyc29yUHJvcGVydGllcyh1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHksIElEaXJlY3QzRFN1cmZhY2U5ICpjdXJzb3JCaXRtYXApIG92ZXJyaWRlOwotCQl2b2lkIF9fc3RkY2FsbCBTZXRDdXJzb3JQb3NpdGlvbihpbnQgeCwgaW50IHksIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCQlpbnQgX19zdGRjYWxsIFNob3dDdXJzb3IoaW50IHNob3cpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRFN3YXBDaGFpbjkgKipzd2FwQ2hhaW4pIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRTd2FwQ2hhaW4odW5zaWduZWQgaW50IGluZGV4LCBJRGlyZWN0M0RTd2FwQ2hhaW45ICoqc3dhcENoYWluKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXROdW1iZXJPZlN3YXBDaGFpbnMoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgUmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IHN3YXBDaGFpbiwgdW5zaWduZWQgaW50IGluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTkgKipiYWNrQnVmZmVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UmFzdGVyU3RhdHVzKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIEQzRFJBU1RFUl9TVEFUVVMgKnJhc3RlclN0YXR1cykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldERpYWxvZ0JveE1vZGUoaW50IGVuYWJsZURpYWxvZ3MpIG92ZXJyaWRlOwotCQl2b2lkIF9fc3RkY2FsbCBTZXRHYW1tYVJhbXAodW5zaWduZWQgaW50IHN3YXBDaGFpbiwgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgRDNER0FNTUFSQU1QICpyYW1wKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgR2V0R2FtbWFSYW1wKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIEQzREdBTU1BUkFNUCAqcmFtcCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVRleHR1cmUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFRleHR1cmU5ICoqdGV4dHVyZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVZvbHVtZVRleHR1cmUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgZGVwdGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgKip2b2x1bWVUZXh0dXJlLCB2b2lkICoqc2hhcmVkSGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlQ3ViZVRleHR1cmUodW5zaWduZWQgaW50IGVkZ2VMZW5ndGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEQ3ViZVRleHR1cmU5ICoqY3ViZVRleHR1cmUsIHZvaWQgKipzaGFyZWRIYW5kbGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVWZXJ0ZXhCdWZmZXIodW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgdW5zaWduZWQgbG9uZyBGVkYsIEQzRFBPT0wsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKip2ZXJ0ZXhCdWZmZXIsIHZvaWQgKipzaGFyZWRIYW5kbGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVJbmRleEJ1ZmZlcih1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzREluZGV4QnVmZmVyOSAqKmluZGV4QnVmZmVyLCB2b2lkICoqc2hhcmVkSGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlUmVuZGVyVGFyZ2V0KHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHksIGludCBsb2NrYWJsZSwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGxvbmcgbXVsdGlTYW1wbGVRdWFsaXR5LCBpbnQgZGlzY2FyZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVXBkYXRlU3VyZmFjZShJRGlyZWN0M0RTdXJmYWNlOSAqc291cmNlU3VyZmFjZSwgY29uc3QgUkVDVCAqc291cmNlUmVjdCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RpbmF0aW9uU3VyZmFjZSwgY29uc3QgUE9JTlQgKmRlc3RQb2ludCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFVwZGF0ZVRleHR1cmUoSURpcmVjdDNEQmFzZVRleHR1cmU5ICpzb3VyY2VUZXh0dXJlLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKmRlc3RpbmF0aW9uVGV4dHVyZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFJlbmRlclRhcmdldERhdGEoSURpcmVjdDNEU3VyZmFjZTkgKnJlbmRlclRhcmdldCwgSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RnJvbnRCdWZmZXJEYXRhKHVuc2lnbmVkIGludCBzd2FwQ2hhaW4sIElEaXJlY3QzRFN1cmZhY2U5ICpkZXN0U3VyZmFjZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFN0cmV0Y2hSZWN0KElEaXJlY3QzRFN1cmZhY2U5ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UsIGNvbnN0IFJFQ1QgKmRlc3RSZWN0LCBEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDb2xvckZpbGwoSURpcmVjdDNEU3VyZmFjZTkgKnN1cmZhY2UsIGNvbnN0IFJFQ1QgKnJlY3QsIEQzRENPTE9SIGNvbG9yKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RTdXJmYWNlOSAqKnN1cmZhY2UsIHZvaWQgKipzaGFyZWRIYW5kbGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRSZW5kZXJUYXJnZXQodW5zaWduZWQgbG9uZyBpbmRleCwgSURpcmVjdDNEU3VyZmFjZTkgKnJlbmRlclRhcmdldCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFJlbmRlclRhcmdldCh1bnNpZ25lZCBsb25nIGluZGV4LCBJRGlyZWN0M0RTdXJmYWNlOSAqKnJlbmRlclRhcmdldCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKm5ld0RlcHRoU3RlbmNpbCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTkgKipkZXB0aFN0ZW5jaWxTdXJmYWNlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQmVnaW5TY2VuZSgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBFbmRTY2VuZSgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDbGVhcih1bnNpZ25lZCBsb25nIENvdW50LCBjb25zdCBEM0RSRUNUICpyZWN0cywgdW5zaWduZWQgbG9uZyBGbGFncywgdW5zaWduZWQgbG9uZyBDb2xvciwgZmxvYXQgWiwgdW5zaWduZWQgbG9uZyBTdGVuY2lsKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBEM0RNQVRSSVggKm1hdHJpeCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIE11bHRpcGx5VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRWaWV3cG9ydChjb25zdCBEM0RWSUVXUE9SVDkgKnZpZXdwb3J0KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Vmlld3BvcnQoRDNEVklFV1BPUlQ5ICp2aWV3cG9ydCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRNYXRlcmlhbChEM0RNQVRFUklBTDkgKm1hdGVyaWFsKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgRDNETElHSFQ5ICpsaWdodCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRExJR0hUOSAqbGlnaHQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgZW5hYmxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0TGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCAsIGludCAqZW5hYmxlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBmbG9hdCAqcGxhbmUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgU3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlU3RhdGVCbG9jayhEM0RTVEFURUJMT0NLVFlQRSB0eXBlLCBJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqKnN0YXRlQmxvY2spIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBCZWdpblN0YXRlQmxvY2soKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRW5kU3RhdGVCbG9jayhJRGlyZWN0M0RTdGF0ZUJsb2NrOSAqKnN0YXRlQmxvY2spIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRDbGlwU3RhdHVzKGNvbnN0IEQzRENMSVBTVEFUVVM5ICpjbGlwU3RhdHVzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Q2xpcFN0YXR1cyhEM0RDTElQU1RBVFVTOSAqY2xpcFN0YXR1cykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFRleHR1cmUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKip0ZXh0dXJlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHNhbXBsZXIsIElEaXJlY3QzREJhc2VUZXh0dXJlOSAqdGV4dHVyZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0U2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgc2FtcGxlciwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRTYW1wbGVyU3RhdGUodW5zaWduZWQgbG9uZyBzYW1wbGVyLCBEM0RTQU1QTEVSU1RBVEVUWVBFIHN0YXRlLCB1bnNpZ25lZCBsb25nIHZhbHVlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVmFsaWRhdGVEZXZpY2UodW5zaWduZWQgbG9uZyAqbnVtUGFzc2VzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UGFsZXR0ZUVudHJpZXModW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIsIGNvbnN0IFBBTEVUVEVFTlRSWSAqZW50cmllcykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50ICpwYWxldHRlTnVtYmVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0U2Npc3NvclJlY3QoY29uc3QgUkVDVCAqcmVjdCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFNjaXNzb3JSZWN0KFJFQ1QgKnJlY3QpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoaW50IHNvZnR3YXJlKSBvdmVycmlkZTsKLQkJaW50IF9fc3RkY2FsbCBHZXRTb2Z0d2FyZVZlcnRleFByb2Nlc3NpbmcoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0TlBhdGNoTW9kZShmbG9hdCBzZWdtZW50cykgb3ZlcnJpZGU7Ci0JCWZsb2F0IF9fc3RkY2FsbCBHZXROUGF0Y2hNb2RlKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIERyYXdQcmltaXRpdmUoRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVUeXBlLCB1bnNpZ25lZCBpbnQgc3RhcnRWZXJ0ZXgsIHVuc2lnbmVkIGludCBwcmltaXZlQ291bnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBEcmF3SW5kZXhlZFByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHR5cGUsIGludCBiYXNlVmVydGV4SW5kZXgsIHVuc2lnbmVkIGludCBtaW5JbmRleCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzLCB1bnNpZ25lZCBpbnQgc3RhcnRJbmRleCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRHJhd1ByaW1pdGl2ZVVQKEQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlVHlwZSwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50LCBjb25zdCB2b2lkICp2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSwgdW5zaWduZWQgaW50IHZlcnRleFN0cmVhbVplcm9TdHJpZGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBEcmF3SW5kZXhlZFByaW1pdGl2ZVVQKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IG1pblZlcnRleEluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGV4SW5kaWNlcywgdW5zaWduZWQgaW50IFByaW1pdGl2ZUNvdW50LCBjb25zdCB2b2lkICppbmRleERhdGEsIEQzREZPUk1BVCBpbmRleERhdGFGb3JtYXQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhLCB1bnNpZ25lZCBpbnQgVmVydGV4U3RyZWFtWmVyb1N0cmlkZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFByb2Nlc3NWZXJ0aWNlcyh1bnNpZ25lZCBpbnQgc3JjU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IGRlc3RJbmRleCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkZXN0QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlVmVydGV4RGVjbGFyYXRpb24oY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgKnZlcnRleEVsZW1lbnRzLCBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFZlcnRleERlY2xhcmF0aW9uKElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqZGVjbGFyYXRpb24pIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhEZWNsYXJhdGlvbihJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKipkZWNsYXJhdGlvbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldEZWRih1bnNpZ25lZCBsb25nIEZWRikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEZWRih1bnNpZ25lZCBsb25nICpGVkYpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24sIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRWZXJ0ZXhTaGFkZXIoSURpcmVjdDNEVmVydGV4U2hhZGVyOSAqc2hhZGVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0VmVydGV4U2hhZGVyKElEaXJlY3QzRFZlcnRleFNoYWRlcjkgKipzaGFkZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW0sIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKmRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzdHJpZGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbU51bWJlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqKnN0cmVhbURhdGEsIHVuc2lnbmVkIGludCAqb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKnN0cmlkZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFN0cmVhbVNvdXJjZUZyZXEodW5zaWduZWQgaW50IHN0cmVhbU51bWJlciwgdW5zaWduZWQgaW50IGRpdmlkZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCAqZGl2aWRlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI5ICppbmRleERhdGEpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRJbmRpY2VzKElEaXJlY3QzREluZGV4QnVmZmVyOSAqKmluZGV4RGF0YSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVBpeGVsU2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKipzaGFkZXIpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlcihJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnNoYWRlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFBpeGVsU2hhZGVyKElEaXJlY3QzRFBpeGVsU2hhZGVyOSAqKnNoYWRlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UGl4ZWxTaGFkZXJDb25zdGFudEkodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UGl4ZWxTaGFkZXJDb25zdGFudEYodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGZsb2F0ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UGl4ZWxTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBEcmF3UmVjdFBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUsIGNvbnN0IGZsb2F0ICpudW1TZWdzLCBjb25zdCBEM0RSRUNUUEFUQ0hfSU5GTyAqcmVjdFBhdGNoSW5mbykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIERyYXdUcmlQYXRjaCh1bnNpZ25lZCBpbnQgaGFuZGxlLCBjb25zdCBmbG9hdCAqbnVtU2VncywgY29uc3QgRDNEVFJJUEFUQ0hfSU5GTyAqdHJpUGF0Y2hJbmZvKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRGVsZXRlUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZVF1ZXJ5KEQzRFFVRVJZVFlQRSB0eXBlLCBJRGlyZWN0M0RRdWVyeTkgKipxdWVyeSkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNERGV2aWNlOUV4IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0Q29udm9sdXRpb25Nb25vS2VybmVsKFVJTlQsVUlOVCxmbG9hdCAqLGZsb2F0ICopIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDb21wb3NlUmVjdHMoSURpcmVjdDNEU3VyZmFjZTkgKixJRGlyZWN0M0RTdXJmYWNlOSAqLElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKixVSU5ULElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKixEM0RDT01QT1NFUkVDVFNPUCxpbnQsaW50KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgUHJlc2VudEV4KGNvbnN0IFJFQ1QgKixjb25zdCBSRUNUICosSFdORCxjb25zdCBSR05EQVRBICosRFdPUkQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRHUFVUaHJlYWRQcmlvcml0eShpbnQgKnByaW9yaXR5KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0R1BVVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgV2FpdEZvclZCbGFuayh1bnNpZ25lZCBpbnQgc3dhcENoYWluKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tSZXNvdXJjZVJlc2lkZW5jeShJRGlyZWN0M0RSZXNvdXJjZTkgKipyZXNvdXJjZUFycmF5LCB1bnNpZ25lZCBpbnQgbnVtUmVzb3VyY2VzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0TWF4aW11bUZyYW1lTGF0ZW5jeSh1bnNpZ25lZCBpbnQgbWF4TGF0ZW5jeSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldE1heGltdW1GcmFtZUxhdGVuY3kodW5zaWduZWQgaW50ICptYXhMYXRlbmN5KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VTdGF0ZShIV05EIGRlc3RpbmF0aW9uV2luZG93KSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlUmVuZGVyVGFyZ2V0RXgodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSwgdW5zaWduZWQgbG9uZyBtdWx0aVNhbXBsZVF1YWxpdHksIGludCBsb2NrYWJsZSwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlLCB2b2lkICoqc2hhcmVkSGFuZGxlLCB1bnNpZ25lZCBsb25nIHVzYWdlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlRXgodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIENyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2VFeCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGVUeXBlLCB1bnNpZ25lZCBsb25nIG11bHRpU2FtcGxlUXVhbGl0eSwgaW50IGRpc2NhcmQsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSwgdm9pZCAqKnNoYXJlZEhhbmRsZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFJlc2V0RXgoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgRDNERElTUExBWU1PREVFWCAqZnVsbHNjcmVlbkRpc3BsYXlNb2RlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGlzcGxheU1vZGVFeCh1bnNpZ25lZCBpbnQgc3dhcENoYWluLCBEM0RESVNQTEFZTU9ERUVYICptb2RlLCBEM0RESVNQTEFZUk9UQVRJT04gKnJvdGF0aW9uKSBvdmVycmlkZTsKLQotCXByaXZhdGU6Ci0JCURpcmVjdDNEOUV4ICpjb25zdCBkM2Q5ZXg7Ci0JfTsKLX0KLQotI2VuZGlmIC8vIEQzRDlfRGlyZWN0M0REZXZpY2U5RXhfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzREluZGV4QnVmZmVyOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzREluZGV4QnVmZmVyOS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OGVmZGYuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RJbmRleEJ1ZmZlcjkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzREluZGV4QnVmZmVyOS5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgotI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlEaXJlY3QzREluZGV4QnVmZmVyOTo6RGlyZWN0M0RJbmRleEJ1ZmZlcjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCkgOiBEaXJlY3QzRFJlc291cmNlOShkZXZpY2UsIEQzRFJUWVBFX0lOREVYQlVGRkVSLCBwb29sLCBsZW5ndGgpLCBsZW5ndGgobGVuZ3RoKSwgdXNhZ2UodXNhZ2UpLCBmb3JtYXQoZm9ybWF0KQotCXsKLQkJaW5kZXhCdWZmZXIgPSBuZXcgc3c6OlJlc291cmNlKGxlbmd0aCArIDE2KTsKLQkJbG9ja0NvdW50ID0gMDsKLQl9Ci0KLQlEaXJlY3QzREluZGV4QnVmZmVyOTo6fkRpcmVjdDNESW5kZXhCdWZmZXI5KCkKLQl7Ci0JCWluZGV4QnVmZmVyLT5kZXN0cnVjdCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNESW5kZXhCdWZmZXI5IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U5IHx8Ci0JCSAgIGlpZCA9PSBJSURfSVVua25vd24pCi0JCXsKLQkJCUFkZFJlZigpOwotCQkJKm9iamVjdCA9IHRoaXM7Ci0KLQkJCXJldHVybiBTX09LOwotCQl9Ci0KLQkJKm9iamVjdCA9IDA7Ci0KLQkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyOTo6QWRkUmVmKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNESW5kZXhCdWZmZXI5OjpQcmVMb2FkKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlEaXJlY3QzRFJlc291cmNlOTo6UHJlTG9hZCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzLT5kZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldERldmljZShkZXZpY2UpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OlNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyOTo6R2V0UHJpb3JpdHkoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0UHJpb3JpdHkoKTsKLQl9Ci0KLQlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OkdldFR5cGUoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0VHlwZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OkdldERlc2MoRDNESU5ERVhCVUZGRVJfREVTQyAqZGVzY3JpcHRpb24pCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRlc2NyaXB0aW9uKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLT5Gb3JtYXQgPSBmb3JtYXQ7Ci0JCWRlc2NyaXB0aW9uLT5Qb29sID0gcG9vbDsKLQkJZGVzY3JpcHRpb24tPlNpemUgPSBsZW5ndGg7Ci0JCWRlc2NyaXB0aW9uLT5UeXBlID0gR2V0VHlwZSgpOwotCQlkZXNjcmlwdGlvbi0+VXNhZ2UgPSB1c2FnZTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI5OjpMb2NrKHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICoqZGF0YSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZihvZmZzZXQgPT0gMCAmJiBzaXplID09IDApICAgLy8gTG9jayB3aG9sZSBidWZmZXIKLQkJewotCQkJc2l6ZSA9IGxlbmd0aDsKLQkJfQotCi0JCWlmKCFkYXRhIHx8IG9mZnNldCA+IGxlbmd0aCB8fCBvZmZzZXQgKyBzaXplID4gbGVuZ3RoKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXZvaWQgKmJ1ZmZlcjsKLQotCQlpZihmbGFncyAmIEQzRExPQ0tfRElTQ0FSRC8qICYmIHVzYWdlICYgRDNEVVNBR0VfRFlOQU1JQyovKQotCQl7Ci0JCQlpbmRleEJ1ZmZlci0+ZGVzdHJ1Y3QoKTsKLQkJCWluZGV4QnVmZmVyID0gbmV3IHN3OjpSZXNvdXJjZShsZW5ndGggKyAxNik7Ci0KLQkJCWJ1ZmZlciA9ICh2b2lkKilpbmRleEJ1ZmZlci0+ZGF0YSgpOwotCQl9Ci0JCWVsc2UgaWYoZmxhZ3MgJiBEM0RMT0NLX05PT1ZFUldSSVRFLyogJiYgdXNhZ2UgJiBEM0RVU0FHRV9EWU5BTUlDKi8pCi0JCXsKLQkJCWJ1ZmZlciA9ICh2b2lkKilpbmRleEJ1ZmZlci0+ZGF0YSgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYnVmZmVyID0gaW5kZXhCdWZmZXItPmxvY2soc3c6OlBVQkxJQyk7Ci0JCQlsb2NrQ291bnQrKzsKLQkJfQotCi0JCSpkYXRhID0gKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlciArIG9mZnNldDsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OlVubG9jaygpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYobG9ja0NvdW50ID4gMCkKLQkJewotCQkJaW5kZXhCdWZmZXItPnVubG9jaygpOwotCQkJbG9ja0NvdW50LS07Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCXN3OjpSZXNvdXJjZSAqRGlyZWN0M0RJbmRleEJ1ZmZlcjk6OmdldFJlc291cmNlKCkgY29uc3QKLQl7Ci0JCXJldHVybiBpbmRleEJ1ZmZlcjsKLQl9Ci0KLQlib29sIERpcmVjdDNESW5kZXhCdWZmZXI5OjppczMyQml0KCkgY29uc3QKLQl7Ci0JCXN3aXRjaChmb3JtYXQpCi0JCXsKLQkJY2FzZSBEM0RGTVRfSU5ERVgxNjoKLQkJCXJldHVybiBmYWxzZTsKLQkJY2FzZSBEM0RGTVRfSU5ERVgzMjoKLQkJCXJldHVybiB0cnVlOwotCQlkZWZhdWx0OgotCQkJQVNTRVJUKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzREluZGV4QnVmZmVyOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzREluZGV4QnVmZmVyOS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWU0YTkuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RJbmRleEJ1ZmZlcjkuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q5X0RpcmVjdDNESW5kZXhCdWZmZXI5X2hwcAotI2RlZmluZSBEM0Q5X0RpcmVjdDNESW5kZXhCdWZmZXI5X2hwcAotCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTkuaHBwIgotCi0jaW5jbHVkZSA8ZDNkOS5oPgotCi1uYW1lc3BhY2Ugc3cKLXsKLQljbGFzcyBSZXNvdXJjZTsKLX0KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzREluZGV4QnVmZmVyOSA6IHB1YmxpYyBJRGlyZWN0M0RJbmRleEJ1ZmZlcjksIHB1YmxpYyBEaXJlY3QzRFJlc291cmNlOQotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNESW5kZXhCdWZmZXI5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpOwotCi0JCX5EaXJlY3QzREluZGV4QnVmZmVyOSgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFJlc291cmNlOSBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKSBvdmVycmlkZTsKLQkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNESW5kZXhCdWZmZXI5IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVzYyhEM0RJTkRFWEJVRkZFUl9ERVNDICpkZXNjcmlwdGlvbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIExvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQlzdzo6UmVzb3VyY2UgKmdldFJlc291cmNlKCkgY29uc3Q7Ci0JCWJvb2wgaXMzMkJpdCgpIGNvbnN0OwotCi0JcHJpdmF0ZToKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQljb25zdCB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCQljb25zdCBsb25nIHVzYWdlOwotCQljb25zdCBEM0RGT1JNQVQgZm9ybWF0OwotCi0JCXN3OjpSZXNvdXJjZSAqaW5kZXhCdWZmZXI7Ci0JCWludCBsb2NrQ291bnQ7Ci0JfTsKLX0KLQotI2VuZGlmIC8vIEQzRDlfRGlyZWN0M0RJbmRleEJ1ZmZlcjlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFBpeGVsU2hhZGVyOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRFBpeGVsU2hhZGVyOS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNmRhYTUuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RQaXhlbFNoYWRlcjkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRFBpeGVsU2hhZGVyOS5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlEaXJlY3QzRFBpeGVsU2hhZGVyOTo6RGlyZWN0M0RQaXhlbFNoYWRlcjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuKSA6IGRldmljZShkZXZpY2UpLCBwaXhlbFNoYWRlcihzaGFkZXJUb2tlbikKLQl7Ci0JCXRva2VuQ291bnQgPSAwOwotCi0JCXdoaWxlKHNoYWRlclRva2VuW3Rva2VuQ291bnRdICE9IDB4MDAwMEZGRkYpCi0JCXsKLQkJCXRva2VuQ291bnQgKz0gc3c6OlNoYWRlcjo6c2l6ZShzaGFkZXJUb2tlblt0b2tlbkNvdW50XSwgKHVuc2lnbmVkIHNob3J0KShzaGFkZXJUb2tlblswXSAmIDB4RkZGRikpICsgMTsKLQkJfQotCi0JCXRva2VuQ291bnQgKz0gMTsKLQotCQl0aGlzLT5zaGFkZXJUb2tlbiA9IG5ldyB1bnNpZ25lZCBsb25nW3Rva2VuQ291bnRdOwotCQltZW1jcHkodGhpcy0+c2hhZGVyVG9rZW4sIHNoYWRlclRva2VuLCB0b2tlbkNvdW50ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQl9Ci0KLQlEaXJlY3QzRFBpeGVsU2hhZGVyOTo6fkRpcmVjdDNEUGl4ZWxTaGFkZXI5KCkKLQl7Ci0JCWRlbGV0ZVtdIHNoYWRlclRva2VuOwotCQlzaGFkZXJUb2tlbiA9IDA7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFBpeGVsU2hhZGVyOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RQaXhlbFNoYWRlcjkgfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEUGl4ZWxTaGFkZXI5OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEUGl4ZWxTaGFkZXI5OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RQaXhlbFNoYWRlcjk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXZpY2UpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJdGhpcy0+ZGV2aWNlLT5BZGRSZWYoKTsKLQkJKmRldmljZSA9IHRoaXMtPmRldmljZTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RQaXhlbFNoYWRlcjk6OkdldEZ1bmN0aW9uKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCAqc2l6ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighc2l6ZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZihkYXRhKQotCQl7Ci0JCQltZW1jcHkoZGF0YSwgc2hhZGVyVG9rZW4sIHRva2VuQ291bnQgKiA0KTsKLQkJfQotCi0JCSpzaXplID0gdG9rZW5Db3VudCAqIDQ7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQljb25zdCBzdzo6UGl4ZWxTaGFkZXIgKkRpcmVjdDNEUGl4ZWxTaGFkZXI5OjpnZXRQaXhlbFNoYWRlcigpIGNvbnN0Ci0JewotCQlyZXR1cm4gJnBpeGVsU2hhZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEUGl4ZWxTaGFkZXI5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEUGl4ZWxTaGFkZXI5LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlYmYwMi4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFBpeGVsU2hhZGVyOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0RQaXhlbFNoYWRlcjlfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0RQaXhlbFNoYWRlcjlfaHBwCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLQotI2luY2x1ZGUgIlBpeGVsU2hhZGVyLmhwcCIKLQotI2luY2x1ZGUgPGQzZDkuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzRERldmljZTk7Ci0KLQljbGFzcyBEaXJlY3QzRFBpeGVsU2hhZGVyOSA6IHB1YmxpYyBJRGlyZWN0M0RQaXhlbFNoYWRlcjksIHB1YmxpYyBVbmtub3duCi0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RQaXhlbFNoYWRlcjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuKTsKLQotCQl+RGlyZWN0M0RQaXhlbFNoYWRlcjkoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEZ1bmN0aW9uKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCAqc2l6ZSkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQljb25zdCBzdzo6UGl4ZWxTaGFkZXIgKmdldFBpeGVsU2hhZGVyKCkgY29uc3Q7Ci0KLQlwcml2YXRlOgotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCURpcmVjdDNERGV2aWNlOSAqY29uc3QgZGV2aWNlOwotCi0JCXVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuOwotCQlpbnQgdG9rZW5Db3VudDsKLQotCQlzdzo6UGl4ZWxTaGFkZXIgcGl4ZWxTaGFkZXI7Ci0JfTsKLX0KLQotI2VuZGlmICAgLy8gRDNEOV9EaXJlY3QzRFBpeGVsU2hhZGVyOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEUXVlcnk5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEUXVlcnk5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhM2IyZC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFF1ZXJ5OS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEUXVlcnk5LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiVGltZXIuaHBwIgotI2luY2x1ZGUgIlJlbmRlcmVyLmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlEaXJlY3QzRFF1ZXJ5OTo6RGlyZWN0M0RRdWVyeTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFFVRVJZVFlQRSB0eXBlKSA6IGRldmljZShkZXZpY2UpLCB0eXBlKHR5cGUpCi0JewotCQlpZih0eXBlID09IEQzRFFVRVJZVFlQRV9PQ0NMVVNJT04pCi0JCXsKLQkJCXF1ZXJ5ID0gbmV3IHN3OjpRdWVyeShzdzo6UXVlcnk6OkZSQUdNRU5UU19QQVNTRUQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcXVlcnkgPSAwOwotCQl9Ci0JfQotCi0JRGlyZWN0M0RRdWVyeTk6On5EaXJlY3QzRFF1ZXJ5OSgpCi0JewotCQlpZihxdWVyeSkKLQkJewotCQkJZGV2aWNlLT5yZW1vdmVRdWVyeShxdWVyeSk7Ci0KLQkJCXF1ZXJ5LT5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlsb25nIERpcmVjdDNEUXVlcnk5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFF1ZXJ5OSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RRdWVyeTk6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RRdWVyeTk6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBfX3N0ZGNhbGwgRGlyZWN0M0RRdWVyeTk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXZpY2UpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJdGhpcy0+ZGV2aWNlLT5BZGRSZWYoKTsKLQkJKmRldmljZSA9IHRoaXMtPmRldmljZTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCUQzRFFVRVJZVFlQRSBEaXJlY3QzRFF1ZXJ5OTo6R2V0VHlwZSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEUXVlcnk5OjpHZXREYXRhU2l6ZSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJc3dpdGNoKHR5cGUpCi0JCXsKLQkJY2FzZSBEM0RRVUVSWVRZUEVfVkNBQ0hFOgkJCQlyZXR1cm4gc2l6ZW9mKEQzRERFVklORk9fVkNBQ0hFKTsKLQkJY2FzZSBEM0RRVUVSWVRZUEVfUkVTT1VSQ0VNQU5BR0VSOgkJcmV0dXJuIHNpemVvZihEM0RERVZJTkZPX1JFU09VUkNFTUFOQUdFUik7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX1ZFUlRFWFNUQVRTOgkJCXJldHVybiBzaXplb2YoRDNEREVWSU5GT19EM0RWRVJURVhTVEFUUyk7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX0VWRU5UOgkJCQlyZXR1cm4gc2l6ZW9mKEJPT0wpOwotCQljYXNlIEQzRFFVRVJZVFlQRV9PQ0NMVVNJT046CQkJcmV0dXJuIHNpemVvZihEV09SRCk7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUDoJCQlyZXR1cm4gc2l6ZW9mKFVJTlQ2NCk7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUERJU0pPSU5UOglyZXR1cm4gc2l6ZW9mKEJPT0wpOwotCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVBGUkVROgkJcmV0dXJuIHNpemVvZihVSU5UNjQpOwotCQljYXNlIEQzRFFVRVJZVFlQRV9QSVBFTElORVRJTUlOR1M6CQlyZXR1cm4gc2l6ZW9mKEQzRERFVklORk9fRDNEOVBJUEVMSU5FVElNSU5HUyk7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX0lOVEVSRkFDRVRJTUlOR1M6CQlyZXR1cm4gc2l6ZW9mKEQzRERFVklORk9fRDNEOUlOVEVSRkFDRVRJTUlOR1MpOwotCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhUSU1JTkdTOgkJcmV0dXJuIHNpemVvZihEM0RERVZJTkZPX0QzRDlTVEFHRVRJTUlOR1MpOwotCQljYXNlIEQzRFFVRVJZVFlQRV9QSVhFTFRJTUlOR1M6CQkJcmV0dXJuIHNpemVvZihEM0RERVZJTkZPX0QzRDlQSVBFTElORVRJTUlOR1MpOwotCQljYXNlIEQzRFFVRVJZVFlQRV9CQU5EV0lEVEhUSU1JTkdTOgkJcmV0dXJuIHNpemVvZihEM0RERVZJTkZPX0QzRDlCQU5EV0lEVEhUSU1JTkdTKTsKLQkJY2FzZSBEM0RRVUVSWVRZUEVfQ0FDSEVVVElMSVpBVElPTjoJCXJldHVybiBzaXplb2YoRDNEREVWSU5GT19EM0Q5Q0FDSEVVVElMSVpBVElPTik7Ci0JCWRlZmF1bHQ6Ci0JCQlBU1NFUlQoZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEUXVlcnk5OjpJc3N1ZSh1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGZsYWdzICE9IEQzRElTU1VFX0JFR0lOICYmIGZsYWdzICE9IEQzRElTU1VFX0VORCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlzd2l0Y2godHlwZSkKLQkJewotCQljYXNlIEQzRFFVRVJZVFlQRV9WQ0FDSEU6CQkJCWlmKGZsYWdzICE9IEQzRElTU1VFX0VORCkgcmV0dXJuIElOVkFMSURDQUxMKCk7IGJyZWFrOwotCQljYXNlIEQzRFFVRVJZVFlQRV9SRVNPVVJDRU1BTkFHRVI6CQlpZihmbGFncyAhPSBEM0RJU1NVRV9FTkQpIHJldHVybiBJTlZBTElEQ0FMTCgpOyBicmVhazsKLQkJY2FzZSBEM0RRVUVSWVRZUEVfVkVSVEVYU1RBVFM6CQkJaWYoZmxhZ3MgIT0gRDNESVNTVUVfRU5EKSByZXR1cm4gSU5WQUxJRENBTEwoKTsgYnJlYWs7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX0VWRU5UOgotCQkJaWYoZmxhZ3MgPT0gRDNESVNTVUVfRU5EKQotCQkJewotCQkJLy8JZGV2aWNlLT5yZW5kZXJlci0+c3luY2hyb25pemUoKTsgICAvLyBGSVhNRQotCQkJfQotCQkJZWxzZSByZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFFVRVJZVFlQRV9PQ0NMVVNJT046Ci0JCQlpZihmbGFncyA9PSBEM0RJU1NVRV9CRUdJTikKLQkJCXsKLQkJCQlxdWVyeS0+YmVnaW4oKTsKLQkJCQlkZXZpY2UtPmFkZFF1ZXJ5KHF1ZXJ5KTsKLQkJCQlkZXZpY2UtPnNldE9jY2x1c2lvbkVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlICAgLy8gZmxhZ3MgPT0gRDNESVNTVUVfRU5ECi0JCQl7Ci0JCQkJcXVlcnktPmVuZCgpOwotCQkJCWRldmljZS0+cmVtb3ZlUXVlcnkocXVlcnkpOwotCQkJCWRldmljZS0+c2V0T2NjbHVzaW9uRW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RRVUVSWVRZUEVfVElNRVNUQU1QOgotCQkJaWYoZmxhZ3MgPT0gRDNESVNTVUVfRU5EKQotCQkJewotCQkJCXRpbWVzdGFtcCA9IHN3OjpUaW1lcjo6Y291bnRlcigpOwotCQkJfQotCQkJZWxzZSByZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJCWJyZWFrOwotCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVBESVNKT0lOVDoJaWYoZmxhZ3MgIT0gRDNESVNTVUVfQkVHSU4gJiYgZmxhZ3MgIT0gRDNESVNTVUVfRU5EKSByZXR1cm4gSU5WQUxJRENBTEwoKTsgYnJlYWs7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUEZSRVE6CQlpZihmbGFncyAhPSBEM0RJU1NVRV9FTkQpIHJldHVybiBJTlZBTElEQ0FMTCgpOyBicmVhazsKLQkJY2FzZSBEM0RRVUVSWVRZUEVfUElQRUxJTkVUSU1JTkdTOgkJaWYoZmxhZ3MgIT0gRDNESVNTVUVfQkVHSU4gJiYgZmxhZ3MgIT0gRDNESVNTVUVfRU5EKSByZXR1cm4gSU5WQUxJRENBTEwoKTsgYnJlYWs7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX0lOVEVSRkFDRVRJTUlOR1M6CQlpZihmbGFncyAhPSBEM0RJU1NVRV9CRUdJTiAmJiBmbGFncyAhPSBEM0RJU1NVRV9FTkQpIHJldHVybiBJTlZBTElEQ0FMTCgpOyBicmVhazsKLQkJY2FzZSBEM0RRVUVSWVRZUEVfVkVSVEVYVElNSU5HUzoJCWlmKGZsYWdzICE9IEQzRElTU1VFX0JFR0lOICYmIGZsYWdzICE9IEQzRElTU1VFX0VORCkgcmV0dXJuIElOVkFMSURDQUxMKCk7IGJyZWFrOwotCQljYXNlIEQzRFFVRVJZVFlQRV9QSVhFTFRJTUlOR1M6CQkJaWYoZmxhZ3MgIT0gRDNESVNTVUVfQkVHSU4gJiYgZmxhZ3MgIT0gRDNESVNTVUVfRU5EKSByZXR1cm4gSU5WQUxJRENBTEwoKTsgYnJlYWs7Ci0JCWNhc2UgRDNEUVVFUllUWVBFX0JBTkRXSURUSFRJTUlOR1M6CQlpZihmbGFncyAhPSBEM0RJU1NVRV9CRUdJTiAmJiBmbGFncyAhPSBEM0RJU1NVRV9FTkQpIHJldHVybiBJTlZBTElEQ0FMTCgpOyBicmVhazsKLQkJY2FzZSBEM0RRVUVSWVRZUEVfQ0FDSEVVVElMSVpBVElPTjoJCWlmKGZsYWdzICE9IEQzRElTU1VFX0JFR0lOICYmIGZsYWdzICE9IEQzRElTU1VFX0VORCkgcmV0dXJuIElOVkFMSURDQUxMKCk7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJQVNTRVJUKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFF1ZXJ5OTo6R2V0RGF0YSh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgidm9pZCAqZGF0YSA9ICVwLCB1bnNpZ25lZCBsb25nIHNpemUgPSAlZCwgdW5zaWduZWQgbG9uZyBmbGFncyA9ICVkIiwgZGF0YSwgc2l6ZSwgZmxhZ3MpOwotCi0JCWlmKHF1ZXJ5ICYmIHF1ZXJ5LT5idWlsZGluZykKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlib29sIHNpZ25hbGVkID0gIXF1ZXJ5IHx8IHF1ZXJ5LT5pc1JlYWR5KCk7Ci0KLQkJaWYoc2l6ZSAmJiBzaWduYWxlZCkKLQkJewotCQkJaWYoIWRhdGEpCi0JCQl7Ci0JCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCQl9Ci0KLQkJCS8vIEZJWE1FOiBDaGVjayBzaXplCi0KLQkJCXN3aXRjaCh0eXBlKQotCQkJewotCQkJY2FzZSBEM0RRVUVSWVRZUEVfVkNBQ0hFOgotCQkJCXsKLQkJCQkJRDNEREVWSU5GT19WQ0FDSEUgdmNhY2hlOwotCi0JCQkJCXZjYWNoZS5QYXR0ZXJuID0gJ0NBQ0gnOwotCQkJCQl2Y2FjaGUuT3B0TWV0aG9kID0gMTsgICAvLyBWZXJ0ZXgtY2FjaGUgYmFzZWQgb3B0aW1pemF0aW9uCi0JCQkJCXZjYWNoZS5DYWNoZVNpemUgPSAxNjsKLQkJCQkJdmNhY2hlLk1hZ2ljTnVtYmVyID0gODsKLQotCQkJCQkqKEQzRERFVklORk9fVkNBQ0hFKilkYXRhID0gdmNhY2hlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEUVVFUllUWVBFX1JFU09VUkNFTUFOQUdFUjoJCVVOSU1QTEVNRU5URUQoKTsgYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhTVEFUUzoJCQlVTklNUExFTUVOVEVEKCk7IGJyZWFrOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfRVZFTlQ6CQkJCSooQk9PTCopZGF0YSA9IFRSVUU7IGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUKLQkJCWNhc2UgRDNEUVVFUllUWVBFX09DQ0xVU0lPTjoKLQkJCQkqKERXT1JEKilkYXRhID0gcXVlcnktPmRhdGE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9USU1FU1RBTVA6CQkJKihVSU5UNjQqKWRhdGEgPSB0aW1lc3RhbXA7IGJyZWFrOyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVmVyaWZ5IGJlaGF2aW91cgotCQkJY2FzZSBEM0RRVUVSWVRZUEVfVElNRVNUQU1QRElTSk9JTlQ6CSooQk9PTCopZGF0YSA9IEZBTFNFOyBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFZlcmlmeSBiZWhhdmlvdXIKLQkJCWNhc2UgRDNEUVVFUllUWVBFX1RJTUVTVEFNUEZSRVE6CQkqKFVJTlQ2NCopZGF0YSA9IHN3OjpUaW1lcjo6ZnJlcXVlbmN5KCk7IGJyZWFrOyAgIC8vIEZJWE1FOiBWZXJpZnkgYmVoYXZpb3VyCi0JCQljYXNlIEQzRFFVRVJZVFlQRV9QSVBFTElORVRJTUlOR1M6CQlVTklNUExFTUVOVEVEKCk7IGJyZWFrOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfSU5URVJGQUNFVElNSU5HUzoJCVVOSU1QTEVNRU5URUQoKTsgYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9WRVJURVhUSU1JTkdTOgkJVU5JTVBMRU1FTlRFRCgpOyBicmVhazsKLQkJCWNhc2UgRDNEUVVFUllUWVBFX1BJWEVMVElNSU5HUzoJCQlVTklNUExFTUVOVEVEKCk7IGJyZWFrOwotCQkJY2FzZSBEM0RRVUVSWVRZUEVfQkFORFdJRFRIVElNSU5HUzoJCVVOSU1QTEVNRU5URUQoKTsgYnJlYWs7Ci0JCQljYXNlIEQzRFFVRVJZVFlQRV9DQUNIRVVUSUxJWkFUSU9OOgkJVU5JTVBMRU1FTlRFRCgpOyBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQVNTRVJUKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzaWduYWxlZCA/IFNfT0sgOiBTX0ZBTFNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEUXVlcnk5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEUXVlcnk5LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3NzhjZi4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFF1ZXJ5OS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0RRdWVyeTlfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0RRdWVyeTlfaHBwCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLQotI2luY2x1ZGUgIlJlbmRlcmVyLmhwcCIKLQotI2luY2x1ZGUgPGQzZDkuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzRERldmljZTk7Ci0KLQljbGFzcyBEaXJlY3QzRFF1ZXJ5OSA6IHB1YmxpYyBJRGlyZWN0M0RRdWVyeTksIHB1YmxpYyBVbmtub3duCi0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RRdWVyeTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFFVRVJZVFlQRSB0eXBlKTsKLQotCQl+RGlyZWN0M0RRdWVyeTkoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RRdWVyeTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCUQzRFFVRVJZVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXREYXRhU2l6ZSgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBJc3N1ZSh1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGF0YSh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCi0JcHJpdmF0ZToKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQlEaXJlY3QzRERldmljZTkgKmNvbnN0IGRldmljZTsKLQkJY29uc3QgRDNEUVVFUllUWVBFIHR5cGU7Ci0KLQkJLy8gVE9ETzogY3JlYXRlIGEgdW5pb24sIG9yIHN1YmNsYXNzZXMgZm9yIGVhY2ggdHlwZS4KLQkJc3c6OlF1ZXJ5ICpxdWVyeTsgICAvLyBEM0RRVUVSWVRZUEVfT0NDTFVTSU9OCi0JCVVJTlQ2NCB0aW1lc3RhbXA7ICAgLy8gRDNEUVVFUllUWVBFX1RJTUVTVEFNUAotCX07Ci19Ci0KLSNlbmRpZiAgIC8vIEQzRDlfRGlyZWN0M0RRdWVyeTlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFJlc291cmNlOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRFJlc291cmNlOS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjJlMTUuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RSZXNvdXJjZTkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRFJlc291cmNlOS5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotbmFtZXNwYWNlIEQzRDkKLXsKLQl1bnNpZ25lZCBpbnQgRGlyZWN0M0RSZXNvdXJjZTk6Om1lbW9yeVVzYWdlID0gMDsKLQotCURpcmVjdDNEUmVzb3VyY2U5OjpQcml2YXRlRGF0YTo6UHJpdmF0ZURhdGEoKQotCXsKLQkJZGF0YSA9IDA7Ci0JfQotCi0JRGlyZWN0M0RSZXNvdXJjZTk6OlByaXZhdGVEYXRhOjpQcml2YXRlRGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQgc2l6ZSwgYm9vbCBtYW5hZ2VkKQotCXsKLQkJdGhpcy0+c2l6ZSA9IHNpemU7Ci0JCXRoaXMtPm1hbmFnZWQgPSBtYW5hZ2VkOwotCi0JCXRoaXMtPmRhdGEgPSAodm9pZCopbmV3IHVuc2lnbmVkIGNoYXJbc2l6ZV07Ci0JCW1lbWNweSh0aGlzLT5kYXRhLCBkYXRhLCBzaXplKTsKLQotCQlpZihtYW5hZ2VkKQotCQl7Ci0JCQkoKElVbmtub3duKilkYXRhKS0+QWRkUmVmKCk7Ci0JCX0KLQl9Ci0KLQlEaXJlY3QzRFJlc291cmNlOTo6UHJpdmF0ZURhdGEgJkRpcmVjdDNEUmVzb3VyY2U5OjpQcml2YXRlRGF0YTo6b3BlcmF0b3I9KGNvbnN0IFByaXZhdGVEYXRhICZwcml2YXRlRGF0YSkKLQl7Ci0JCXNpemUgPSBwcml2YXRlRGF0YS5zaXplOwotCQltYW5hZ2VkID0gcHJpdmF0ZURhdGEubWFuYWdlZDsKLQotCQlpZihkYXRhKQotCQl7Ci0JCQlpZihtYW5hZ2VkKQotCQkJewotCQkJCSgoSVVua25vd24qKWRhdGEpLT5SZWxlYXNlKCk7Ci0JCQl9Ci0KLQkJCWRlbGV0ZVtdIGRhdGE7Ci0JCX0KLQotCQlkYXRhID0gKHZvaWQqKW5ldyB1bnNpZ25lZCBjaGFyW3NpemVdOwotCQltZW1jcHkoZGF0YSwgcHJpdmF0ZURhdGEuZGF0YSwgc2l6ZSk7Ci0KLQkJcmV0dXJuICp0aGlzOwotCX0KLQotCURpcmVjdDNEUmVzb3VyY2U5OjpQcml2YXRlRGF0YTo6flByaXZhdGVEYXRhKCkKLQl7Ci0JCWlmKGRhdGEgJiYgbWFuYWdlZCkKLQkJewotCQkJKChJVW5rbm93biopZGF0YSktPlJlbGVhc2UoKTsKLQkJfQotCi0JCWRlbGV0ZVtdIGRhdGE7Ci0JCWRhdGEgPSAwOwotCX0KLQotCURpcmVjdDNEUmVzb3VyY2U5OjpEaXJlY3QzRFJlc291cmNlOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgRDNEUkVTT1VSQ0VUWVBFIHR5cGUsIEQzRFBPT0wgcG9vbCwgdW5zaWduZWQgaW50IHNpemUpIDogZGV2aWNlKGRldmljZSksIHR5cGUodHlwZSksIHBvb2wocG9vbCksIHNpemUoc2l6ZSkKLQl7Ci0JCXByaW9yaXR5ID0gMDsKLQotCQlpZihwb29sID09IEQzRFBPT0xfREVGQVVMVCkKLQkJewotCQkJbWVtb3J5VXNhZ2UgKz0gc2l6ZTsKLQkJfQotCX0KLQotCURpcmVjdDNEUmVzb3VyY2U5Ojp+RGlyZWN0M0RSZXNvdXJjZTkoKQotCXsKLQkJaWYocG9vbCA9PSBEM0RQT09MX0RFRkFVTFQpCi0JCXsKLQkJCW1lbW9yeVVzYWdlIC09IHNpemU7Ci0JCX0KLQl9Ci0KLQlsb25nIERpcmVjdDNEUmVzb3VyY2U5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RSZXNvdXJjZTk6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RSZXNvdXJjZTk6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFJlc291cmNlOTo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcy0+ZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRldmljZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl0aGlzLT5kZXZpY2UtPkFkZFJlZigpOwotCQkqZGV2aWNlID0gdGhpcy0+ZGV2aWNlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFJlc291cmNlOTo6U2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXByaXZhdGVEYXRhW2d1aWRdID0gUHJpdmF0ZURhdGEoZGF0YSwgc2l6ZSwgZmxhZ3MgPT0gRDNEU1BEX0lVTktOT1dOKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJSXRlcmF0b3IgcmVzdWx0ID0gcHJpdmF0ZURhdGEuZmluZChndWlkKTsKLQotCQlpZihyZXN1bHQgPT0gcHJpdmF0ZURhdGEuZW5kKCkpCi0JCXsKLQkJCXJldHVybiBOT1RGT1VORCgpOwotCQl9Ci0KLQkJaWYocmVzdWx0LT5zZWNvbmQuc2l6ZSA+ICpzaXplKQotCQl7Ci0JCQlyZXR1cm4gTU9SRURBVEEoKTsKLQkJfQotCi0JCW1lbWNweShkYXRhLCByZXN1bHQtPnNlY29uZC5kYXRhLCByZXN1bHQtPnNlY29uZC5zaXplKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RSZXNvdXJjZTk6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCUl0ZXJhdG9yIHJlc3VsdCA9IHByaXZhdGVEYXRhLmZpbmQoZ3VpZCk7Ci0KLQkJaWYocmVzdWx0ID09IHByaXZhdGVEYXRhLmVuZCgpKQotCQl7Ci0JCQlyZXR1cm4gRDNERVJSX05PVEZPVU5EOwotCQl9Ci0KLQkJcHJpdmF0ZURhdGEuZXJhc2UoZ3VpZCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXVuc2lnbmVkIGxvbmcgb2xkUHJpb3JpdHkgPSBwcmlvcml0eTsKLQkJcHJpb3JpdHkgPSBuZXdQcmlvcml0eTsKLQotCQlyZXR1cm4gb2xkUHJpb3JpdHk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFJlc291cmNlOTo6R2V0UHJpb3JpdHkoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBwcmlvcml0eTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEUmVzb3VyY2U5OjpQcmVMb2FkKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQl9Ci0KLQlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RSZXNvdXJjZTk6OkdldFR5cGUoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXVuc2lnbmVkIGludCBEaXJlY3QzRFJlc291cmNlOTo6Z2V0TWVtb3J5VXNhZ2UoKQotCXsKLQkJcmV0dXJuIG1lbW9yeVVzYWdlOwotCX0KLQotCUQzRFBPT0wgRGlyZWN0M0RSZXNvdXJjZTk6OmdldFBvb2woKSBjb25zdAotCXsKLQkJcmV0dXJuIHBvb2w7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEUmVzb3VyY2U5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEUmVzb3VyY2U5LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0ZmExMC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFJlc291cmNlOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0RSZXNvdXJjZTlfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0RSZXNvdXJjZTlfaHBwCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLQotI2luY2x1ZGUgPGQzZDkuaD4KLQotI2luY2x1ZGUgPG1hcD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzRERldmljZTk7Ci0KLQljbGFzcyBEaXJlY3QzRFJlc291cmNlOSA6IHB1YmxpYyBJRGlyZWN0M0RSZXNvdXJjZTksIHB1YmxpYyBVbmtub3duCi0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RSZXNvdXJjZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCBEM0RQT09MIHBvb2wsIHVuc2lnbmVkIGludCBzaXplKTsKLQotCQl+RGlyZWN0M0RSZXNvdXJjZTkoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRQcmlvcml0eSgpIG92ZXJyaWRlOwotCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCkgb3ZlcnJpZGU7Ci0JCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpIG92ZXJyaWRlOwotCi0JCS8vIEludGVybmFsIG1ldGhvZHMKLQkJc3RhdGljIHVuc2lnbmVkIGludCBnZXRNZW1vcnlVc2FnZSgpOwotCQlEM0RQT09MIGdldFBvb2woKSBjb25zdDsKLQotCXByb3RlY3RlZDoKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQlEaXJlY3QzRERldmljZTkgKmNvbnN0IGRldmljZTsKLQkJY29uc3QgRDNEUkVTT1VSQ0VUWVBFIHR5cGU7Ci0JCWNvbnN0IEQzRFBPT0wgcG9vbDsKLQkJY29uc3QgdW5zaWduZWQgaW50IHNpemU7Ci0KLQlwcml2YXRlOgotCQl1bnNpZ25lZCBsb25nIHByaW9yaXR5OwotCi0JCXN0cnVjdCBQcml2YXRlRGF0YQotCQl7Ci0JCQlQcml2YXRlRGF0YSgpOwotCQkJUHJpdmF0ZURhdGEoY29uc3Qgdm9pZCAqZGF0YSwgaW50IHNpemUsIGJvb2wgbWFuYWdlZCk7Ci0KLQkJCX5Qcml2YXRlRGF0YSgpOwotCi0JCQlQcml2YXRlRGF0YSAmb3BlcmF0b3I9KGNvbnN0IFByaXZhdGVEYXRhICZwcml2YXRlRGF0YSk7Ci0KLQkJCXZvaWQgKmRhdGE7Ci0JCQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JCQlib29sIG1hbmFnZWQ7ICAgLy8gSVVua25vd24gaW50ZXJmYWNlCi0JCX07Ci0KLQkJc3RydWN0IENvbXBhcmVHVUlECi0JCXsKLQkJCWJvb2wgb3BlcmF0b3IoKShjb25zdCBHVUlEJiBsZWZ0LCBjb25zdCBHVUlEJiByaWdodCkgY29uc3QKLQkJCXsKLQkJCQlyZXR1cm4gbWVtY21wKCZsZWZ0LCAmcmlnaHQsIHNpemVvZihHVUlEKSkgPCAwOwotCQkJfQotCQl9OwotCi0JCXR5cGVkZWYgc3RkOjptYXA8R1VJRCwgUHJpdmF0ZURhdGEsIENvbXBhcmVHVUlEPiBQcml2YXRlRGF0YU1hcDsKLQkJdHlwZWRlZiBQcml2YXRlRGF0YU1hcDo6aXRlcmF0b3IgSXRlcmF0b3I7Ci0JCVByaXZhdGVEYXRhTWFwIHByaXZhdGVEYXRhOwotCi0JCXN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtb3J5VXNhZ2U7Ci0JfTsKLX0KLQotI2VuZGlmICAgLy8gRDNEOV9EaXJlY3QzRFJlc291cmNlOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEU3RhdGVCbG9jazkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RTdGF0ZUJsb2NrOS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZWUwYzUuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RTdGF0ZUJsb2NrOS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRFN0YXRlQmxvY2s5LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNESW5kZXhCdWZmZXI5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFZlcnRleEJ1ZmZlcjkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEQmFzZVRleHR1cmU5LmhwcCIKLSNpbmNsdWRlICJEaXJlY3QzRFBpeGVsU2hhZGVyOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5LmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlEaXJlY3QzRFN0YXRlQmxvY2s5OjpEaXJlY3QzRFN0YXRlQmxvY2s5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBEM0RTVEFURUJMT0NLVFlQRSB0eXBlKSA6IGRldmljZShkZXZpY2UpLCB0eXBlKHR5cGUpCi0JewotCQl2ZXJ0ZXhEZWNsYXJhdGlvbiA9IDA7Ci0KLQkJaW5kZXhCdWZmZXIgPSAwOwotCi0JCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgTUFYX1ZFUlRFWF9JTlBVVFM7IHN0cmVhbSsrKQotCQl7Ci0JCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIgPSAwOwotCQl9Ci0KLQkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8IDE2ICsgNDsgc2FtcGxlcisrKQotCQl7Ci0JCQl0ZXh0dXJlW3NhbXBsZXJdID0gMDsKLQkJfQotCi0JCXBpeGVsU2hhZGVyID0gMDsKLQkJdmVydGV4U2hhZGVyID0gMDsKLQotCQljbGVhcigpOwotCi0JCWlmKHR5cGUgPT0gRDNEU0JUX1BJWEVMU1RBVEUgfHwgdHlwZSA9PSBEM0RTQlRfQUxMKQotCQl7Ci0JCQljYXB0dXJlUGl4ZWxSZW5kZXJTdGF0ZXMoKTsKLQkJCWNhcHR1cmVQaXhlbFRleHR1cmVTdGF0ZXMoKTsKLQkJCWNhcHR1cmVQaXhlbFNhbXBsZXJTdGF0ZXMoKTsKLQkJCWNhcHR1cmVQaXhlbFNoYWRlclN0YXRlcygpOwotCQl9Ci0KLQkJaWYodHlwZSA9PSBEM0RTQlRfVkVSVEVYU1RBVEUgfHwgdHlwZSA9PSBEM0RTQlRfQUxMKQotCQl7Ci0JCQljYXB0dXJlVmVydGV4UmVuZGVyU3RhdGVzKCk7Ci0JCQljYXB0dXJlVmVydGV4U2FtcGxlclN0YXRlcygpOwotCQkJY2FwdHVyZVZlcnRleFRleHR1cmVTdGF0ZXMoKTsKLQkJCWNhcHR1cmVOUGF0Y2hNb2RlKCk7Ci0JCQljYXB0dXJlTGlnaHRTdGF0ZXMoKTsKLQkJCWNhcHR1cmVWZXJ0ZXhTaGFkZXJTdGF0ZXMoKTsKLQkJCWNhcHR1cmVTdHJlYW1Tb3VyY2VGcmVxdWVuY2llcygpOwotCQkJY2FwdHVyZUZWRigpOwotCQkJY2FwdHVyZVZlcnRleERlY2xhcmF0aW9uKCk7Ci0JCX0KLQotCQlpZih0eXBlID09IEQzRFNCVF9BTEwpICAgLy8gQ2FwdHVyZSByZW1haW5pbmcgc3RhdGVzCi0JCXsKLQkJCWNhcHR1cmVUZXh0dXJlcygpOwotCQkJY2FwdHVyZVRleHR1cmVQYWxldHRlKCk7Ci0JCQljYXB0dXJlVmVydGV4U3RyZWFtcygpOwotCQkJY2FwdHVyZUluZGV4QnVmZmVyKCk7Ci0JCQljYXB0dXJlVmlld3BvcnQoKTsKLQkJCWNhcHR1cmVTY2lzc29yUmVjdGFuZ2xlKCk7Ci0JCQljYXB0dXJlVHJhbnNmb3JtcygpOwotCQkJY2FwdHVyZVRleHR1cmVUcmFuc2Zvcm1zKCk7Ci0JCQljYXB0dXJlQ2xpcHBpbmdQbGFuZXMoKTsKLQkJCWNhcHR1cmVNYXRlcmlhbCgpOwotCQl9Ci0JfQotCi0JRGlyZWN0M0RTdGF0ZUJsb2NrOTo6fkRpcmVjdDNEU3RhdGVCbG9jazkoKQotCXsKLQkJY2xlYXIoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3RhdGVCbG9jazk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEU3RhdGVCbG9jazkgfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3RhdGVCbG9jazk6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3RhdGVCbG9jazk6OkFwcGx5KCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZihkZXZpY2UtPmlzUmVjb3JkaW5nKCkpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJaWYoZnZmQ2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+U2V0RlZGKEZWRik7Ci0JCX0KLQotCQlpZih2ZXJ0ZXhEZWNsYXJhdGlvbkNhcHR1cmVkKQotCQl7Ci0JCQlkZXZpY2UtPlNldFZlcnRleERlY2xhcmF0aW9uKHZlcnRleERlY2xhcmF0aW9uKTsKLQkJfQotCi0JCWlmKGluZGV4QnVmZmVyQ2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+U2V0SW5kaWNlcyhpbmRleEJ1ZmZlcik7Ci0JCX0KLQotCQlmb3IoaW50IHN0YXRlID0gRDNEUlNfWkVOQUJMRTsgc3RhdGUgPD0gRDNEUlNfQkxFTkRPUEFMUEhBOyBzdGF0ZSsrKQotCQl7Ci0JCQlpZihyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSkKLQkJCXsKLQkJCQlkZXZpY2UtPlNldFJlbmRlclN0YXRlKChEM0RSRU5ERVJTVEFURVRZUEUpc3RhdGUsIHJlbmRlclN0YXRlW3N0YXRlXSk7Ci0JCQl9Ci0JCX0KLQotCQlpZihuUGF0Y2hNb2RlQ2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+U2V0TlBhdGNoTW9kZShuUGF0Y2hNb2RlKTsKLQkJfQotCi0JCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCi0JCXsKLQkJCWZvcihpbnQgc3RhdGUgPSBEM0RUU1NfQ09MT1JPUDsgc3RhdGUgPD0gRDNEVFNTX0NPTlNUQU5UOyBzdGF0ZSsrKQotCQkJewotCQkJCWlmKHRleHR1cmVTdGFnZVN0YXRlQ2FwdHVyZWRbc3RhZ2VdW3N0YXRlXSkKLQkJCQl7Ci0JCQkJCWRldmljZS0+U2V0VGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIChEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUpc3RhdGUsIHRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVtzdGF0ZV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc2FtcGxlciA9IDA7IHNhbXBsZXIgPCAxNiArIDQ7IHNhbXBsZXIrKykKLQkJewotCQkJZm9yKGludCBzdGF0ZSA9IEQzRFNBTVBfQUREUkVTU1U7IHN0YXRlIDw9IEQzRFNBTVBfRE1BUE9GRlNFVDsgc3RhdGUrKykKLQkJCXsKLQkJCQlpZihzYW1wbGVyU3RhdGVDYXB0dXJlZFtzYW1wbGVyXVtzdGF0ZV0pCi0JCQkJewotCQkJCQlpbnQgaW5kZXggPSBzYW1wbGVyIDwgMTYgPyBzYW1wbGVyIDogRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwICsgKHNhbXBsZXIgLSAxNik7Ci0JCQkJCWRldmljZS0+U2V0U2FtcGxlclN0YXRlKGluZGV4LCAoRDNEU0FNUExFUlNUQVRFVFlQRSlzdGF0ZSwgc2FtcGxlclN0YXRlW3NhbXBsZXJdW3N0YXRlXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBNQVhfVkVSVEVYX0lOUFVUUzsgc3RyZWFtKyspCi0JCXsKLQkJCWlmKHN0cmVhbVNvdXJjZUNhcHR1cmVkW3N0cmVhbV0pCi0JCQl7Ci0JCQkJZGV2aWNlLT5TZXRTdHJlYW1Tb3VyY2Uoc3RyZWFtLCBzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIsIHN0cmVhbVNvdXJjZVtzdHJlYW1dLm9mZnNldCwgc3RyZWFtU291cmNlW3N0cmVhbV0uc3RyaWRlKTsKLQkJCX0KLQotCQkJaWYoc3RyZWFtU291cmNlRnJlcXVlbmN5Q2FwdHVyZWRbc3RyZWFtXSkKLQkJCXsKLQkJCQlkZXZpY2UtPlNldFN0cmVhbVNvdXJjZUZyZXEoc3RyZWFtLCBzdHJlYW1Tb3VyY2VGcmVxdWVuY3lbc3RyZWFtXSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTYgKyA0OyBzYW1wbGVyKyspCi0JCXsKLQkJCWlmKHRleHR1cmVDYXB0dXJlZFtzYW1wbGVyXSkKLQkJCXsKLQkJCQlpbnQgaW5kZXggPSBzYW1wbGVyIDwgMTYgPyBzYW1wbGVyIDogRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwICsgKHNhbXBsZXIgLSAxNik7Ci0JCQkJZGV2aWNlLT5TZXRUZXh0dXJlKGluZGV4LCB0ZXh0dXJlW3NhbXBsZXJdKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IDUxMjsgc3RhdGUrKykKLQkJewotCQkJaWYodHJhbnNmb3JtQ2FwdHVyZWRbc3RhdGVdKQotCQkJewotCQkJCWRldmljZS0+U2V0VHJhbnNmb3JtKChEM0RUUkFOU0ZPUk1TVEFURVRZUEUpc3RhdGUsICZ0cmFuc2Zvcm1bc3RhdGVdKTsKLQkJCX0KLQkJfQotCi0JCWlmKG1hdGVyaWFsQ2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+U2V0TWF0ZXJpYWwoJm1hdGVyaWFsKTsKLQkJfQotCi0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspICAgLy8gRklYTUU6IFN1cHBvcnQgdW5saW1pdGVkIGluZGV4Ci0JCXsKLQkJCWlmKGxpZ2h0Q2FwdHVyZWRbaW5kZXhdKQotCQkJewotCQkJCWRldmljZS0+U2V0TGlnaHQoaW5kZXgsICZsaWdodFtpbmRleF0pOwotCQkJfQotCQl9Ci0KLQkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgICAvLyBGSVhNRTogU3VwcG9ydCB1bmxpbWl0ZWQgaW5kZXgKLQkJewotCQkJaWYobGlnaHRFbmFibGVDYXB0dXJlZFtpbmRleF0pCi0JCQl7Ci0JCQkJZGV2aWNlLT5MaWdodEVuYWJsZShpbmRleCwgbGlnaHRFbmFibGVTdGF0ZVtpbmRleF0pOwotCQkJfQotCQl9Ci0KLQkJaWYocGl4ZWxTaGFkZXJDYXB0dXJlZCkKLQkJewotCQkJZGV2aWNlLT5TZXRQaXhlbFNoYWRlcihwaXhlbFNoYWRlcik7Ci0JCX0KLQotCQlpZih2ZXJ0ZXhTaGFkZXJDYXB0dXJlZCkKLQkJewotCQkJZGV2aWNlLT5TZXRWZXJ0ZXhTaGFkZXIodmVydGV4U2hhZGVyKTsKLQkJfQotCi0JCWlmKHZpZXdwb3J0Q2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+U2V0Vmlld3BvcnQoJnZpZXdwb3J0KTsKLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBNQVhfUElYRUxfU0hBREVSX0NPTlNUOyBpKyspCi0JCXsKLQkJCWlmKCooaW50KilwaXhlbFNoYWRlckNvbnN0YW50RltpXSAhPSAweDgwMDAwMDAwKQotCQkJewotCQkJCWRldmljZS0+U2V0UGl4ZWxTaGFkZXJDb25zdGFudEYoaSwgcGl4ZWxTaGFkZXJDb25zdGFudEZbaV0sIDEpOwotCQkJfQotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCi0JCXsKLQkJCWlmKHBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzBdICE9IDB4ODAwMDAwMDApCi0JCQl7Ci0JCQkJZGV2aWNlLT5TZXRQaXhlbFNoYWRlckNvbnN0YW50SShpLCBwaXhlbFNoYWRlckNvbnN0YW50SVtpXSwgMSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJewotCQkJaWYocGl4ZWxTaGFkZXJDb25zdGFudEJbaV0gIT0gMHg4MDAwMDAwMCkKLQkJCXsKLQkJCQlkZXZpY2UtPlNldFBpeGVsU2hhZGVyQ29uc3RhbnRCKGksICZwaXhlbFNoYWRlckNvbnN0YW50QltpXSwgMSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1ZFUlRFWF9TSEFERVJfQ09OU1Q7IGkrKykKLQkJewotCQkJaWYoKihpbnQqKXZlcnRleFNoYWRlckNvbnN0YW50RltpXSAhPSAweDgwMDAwMDAwKQotCQkJewotCQkJCWRldmljZS0+U2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKGksIHZlcnRleFNoYWRlckNvbnN0YW50RltpXSwgMSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJewotCQkJaWYodmVydGV4U2hhZGVyQ29uc3RhbnRJW2ldWzBdICE9IDB4ODAwMDAwMDApCi0JCQl7Ci0JCQkJZGV2aWNlLT5TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkoaSwgdmVydGV4U2hhZGVyQ29uc3RhbnRJW2ldLCAxKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQotCQl7Ci0JCQlpZih2ZXJ0ZXhTaGFkZXJDb25zdGFudEJbaV0gIT0gMHg4MDAwMDAwMCkKLQkJCXsKLQkJCQlkZXZpY2UtPlNldFZlcnRleFNoYWRlckNvbnN0YW50QihpLCAmdmVydGV4U2hhZGVyQ29uc3RhbnRCW2ldLCAxKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4KyspCi0JCXsKLQkJCWlmKGNsaXBQbGFuZUNhcHR1cmVkW2luZGV4XSkKLQkJCXsKLQkJCQlkZXZpY2UtPlNldENsaXBQbGFuZShpbmRleCwgY2xpcFBsYW5lW2luZGV4XSk7Ci0JCQl9Ci0JCX0KLQotCQlpZihzY2lzc29yUmVjdENhcHR1cmVkKQotCQl7Ci0JCQlkZXZpY2UtPlNldFNjaXNzb3JSZWN0KCZzY2lzc29yUmVjdCk7Ci0JCX0KLQotCQlpZihwYWxldHRlTnVtYmVyQ2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+U2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHBhbGV0dGVOdW1iZXIpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3RhdGVCbG9jazk6OkNhcHR1cmUoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGZ2ZkNhcHR1cmVkKQotCQl7Ci0JCQlkZXZpY2UtPkdldEZWRigmRlZGKTsKLQkJfQotCi0JCWlmKHZlcnRleERlY2xhcmF0aW9uQ2FwdHVyZWQpCi0JCXsKLQkJCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICp2ZXJ0ZXhEZWNsYXJhdGlvbjsKLQkJCWRldmljZS0+R2V0VmVydGV4RGVjbGFyYXRpb24ocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkqKj4oJnZlcnRleERlY2xhcmF0aW9uKSk7Ci0KLQkJCWlmKHZlcnRleERlY2xhcmF0aW9uKQotCQkJewotCQkJCXZlcnRleERlY2xhcmF0aW9uLT5iaW5kKCk7Ci0JCQkJdmVydGV4RGVjbGFyYXRpb24tPlJlbGVhc2UoKTsKLQkJCX0KLQotCQkJaWYodGhpcy0+dmVydGV4RGVjbGFyYXRpb24pCi0JCQl7Ci0JCQkJdGhpcy0+dmVydGV4RGVjbGFyYXRpb24tPnVuYmluZCgpOwotCQkJfQotCi0JCQl0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbiA9IHZlcnRleERlY2xhcmF0aW9uOwotCQl9Ci0KLQkJaWYoaW5kZXhCdWZmZXJDYXB0dXJlZCkKLQkJewotCQkJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4QnVmZmVyOwotCQkJZGV2aWNlLT5HZXRJbmRpY2VzKHJlaW50ZXJwcmV0X2Nhc3Q8SURpcmVjdDNESW5kZXhCdWZmZXI5Kio+KCZpbmRleEJ1ZmZlcikpOwotCi0JCQlpZihpbmRleEJ1ZmZlcikKLQkJCXsKLQkJCQlpbmRleEJ1ZmZlci0+YmluZCgpOwotCQkJCWluZGV4QnVmZmVyLT5SZWxlYXNlKCk7Ci0JCQl9Ci0KLQkJCWlmKHRoaXMtPmluZGV4QnVmZmVyKQotCQkJewotCQkJCXRoaXMtPmluZGV4QnVmZmVyLT51bmJpbmQoKTsKLQkJCX0KLQotCQkJdGhpcy0+aW5kZXhCdWZmZXIgPSBpbmRleEJ1ZmZlcjsKLQkJfQotCi0JCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IEQzRFJTX0JMRU5ET1BBTFBIQSArIDE7IHN0YXRlKyspCi0JCXsKLQkJCWlmKHJlbmRlclN0YXRlQ2FwdHVyZWRbc3RhdGVdKQotCQkJewotCQkJCWRldmljZS0+R2V0UmVuZGVyU3RhdGUoKEQzRFJFTkRFUlNUQVRFVFlQRSlzdGF0ZSwgJnJlbmRlclN0YXRlW3N0YXRlXSk7Ci0JCQl9Ci0JCX0KLQotCQlpZihuUGF0Y2hNb2RlQ2FwdHVyZWQpCi0JCXsKLQkJCW5QYXRjaE1vZGUgPSBkZXZpY2UtPkdldE5QYXRjaE1vZGUoKTsKLQkJfQotCi0JCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCi0JCXsKLQkJCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IEQzRFRTU19DT05TVEFOVCArIDE7IHN0YXRlKyspCi0JCQl7Ci0JCQkJaWYodGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bc3RhdGVdKQotCQkJCXsKLQkJCQkJZGV2aWNlLT5HZXRUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgKEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSlzdGF0ZSwgJnRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVtzdGF0ZV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc2FtcGxlciA9IDA7IHNhbXBsZXIgPCAxNiArIDQ7IHNhbXBsZXIrKykKLQkJewotCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEU0FNUF9ETUFQT0ZGU0VUICsgMTsgc3RhdGUrKykKLQkJCXsKLQkJCQlpZihzYW1wbGVyU3RhdGVDYXB0dXJlZFtzYW1wbGVyXVtzdGF0ZV0pCi0JCQkJewotCQkJCQlpbnQgaW5kZXggPSBzYW1wbGVyIDwgMTYgPyBzYW1wbGVyIDogRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwICsgKHNhbXBsZXIgLSAxNik7Ci0JCQkJCWRldmljZS0+R2V0U2FtcGxlclN0YXRlKGluZGV4LCAoRDNEU0FNUExFUlNUQVRFVFlQRSlzdGF0ZSwgJnNhbXBsZXJTdGF0ZVtzYW1wbGVyXVtzdGF0ZV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgTUFYX1ZFUlRFWF9JTlBVVFM7IHN0cmVhbSsrKQotCQl7Ci0JCQlpZihzdHJlYW1Tb3VyY2VDYXB0dXJlZFtzdHJlYW1dKQotCQkJewotCQkJCURpcmVjdDNEVmVydGV4QnVmZmVyOSAqdmVydGV4QnVmZmVyOwotCQkJCWRldmljZS0+R2V0U3RyZWFtU291cmNlKHN0cmVhbSwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5Kio+KCZ2ZXJ0ZXhCdWZmZXIpLCAmc3RyZWFtU291cmNlW3N0cmVhbV0ub2Zmc2V0LCAmc3RyZWFtU291cmNlW3N0cmVhbV0uc3RyaWRlKTsKLQotCQkJCWlmKHZlcnRleEJ1ZmZlcikKLQkJCQl7Ci0JCQkJCXZlcnRleEJ1ZmZlci0+YmluZCgpOwotCQkJCQl2ZXJ0ZXhCdWZmZXItPlJlbGVhc2UoKTsKLQkJCQl9Ci0KLQkJCQlpZihzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpCi0JCQkJewotCQkJCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXItPnVuYmluZCgpOwotCQkJCX0KLQotCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IHZlcnRleEJ1ZmZlcjsKLQkJCX0KLQotCQkJaWYoc3RyZWFtU291cmNlRnJlcXVlbmN5Q2FwdHVyZWRbc3RyZWFtXSkKLQkJCXsKLQkJCQlkZXZpY2UtPkdldFN0cmVhbVNvdXJjZUZyZXEoc3RyZWFtLCAmc3RyZWFtU291cmNlRnJlcXVlbmN5W3N0cmVhbV0pOwotCQkJfQotCQl9Ci0KLQkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8IDE2ICsgNDsgc2FtcGxlcisrKQotCQl7Ci0JCQlpZih0ZXh0dXJlQ2FwdHVyZWRbc2FtcGxlcl0pCi0JCQl7Ci0JCQkJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmU7Ci0JCQkJaW50IGluZGV4ID0gc2FtcGxlciA8IDE2ID8gc2FtcGxlciA6IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCArIChzYW1wbGVyIC0gMTYpOwotCQkJCWRldmljZS0+R2V0VGV4dHVyZShpbmRleCwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RCYXNlVGV4dHVyZTkqKj4oJnRleHR1cmUpKTsKLQotCQkJCWlmKHRleHR1cmUpCi0JCQkJewotCQkJCQl0ZXh0dXJlLT5iaW5kKCk7Ci0JCQkJCXRleHR1cmUtPlJlbGVhc2UoKTsKLQkJCQl9Ci0KLQkJCQlpZih0aGlzLT50ZXh0dXJlW3NhbXBsZXJdKQotCQkJCXsKLQkJCQkJdGhpcy0+dGV4dHVyZVtzYW1wbGVyXS0+dW5iaW5kKCk7Ci0JCQkJfQotCi0JCQkJdGhpcy0+dGV4dHVyZVtzYW1wbGVyXSA9IHRleHR1cmU7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCA1MTI7IHN0YXRlKyspCi0JCXsKLQkJCWlmKHRyYW5zZm9ybUNhcHR1cmVkW3N0YXRlXSkKLQkJCXsKLQkJCQlkZXZpY2UtPkdldFRyYW5zZm9ybSgoRDNEVFJBTlNGT1JNU1RBVEVUWVBFKXN0YXRlLCAmdHJhbnNmb3JtW3N0YXRlXSk7Ci0JCQl9Ci0JCX0KLQotCQlpZihtYXRlcmlhbENhcHR1cmVkKQotCQl7Ci0JCQlkZXZpY2UtPkdldE1hdGVyaWFsKCZtYXRlcmlhbCk7Ci0JCX0KLQotCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAotCQl7Ci0JCQlpZihsaWdodENhcHR1cmVkW2luZGV4XSkKLQkJCXsKLQkJCQlkZXZpY2UtPkdldExpZ2h0KGluZGV4LCAmbGlnaHRbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspICAgLy8gRklYTUU6IFN1cHBvcnQgdW5saW1pdGVkIGluZGV4Ci0JCXsKLQkJCWlmKGxpZ2h0RW5hYmxlQ2FwdHVyZWRbaW5kZXhdKQotCQkJewotCQkJCWxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdID0gZmFsc2U7Ci0JCQkJZGV2aWNlLT5HZXRMaWdodEVuYWJsZShpbmRleCwgJmxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCWlmKHBpeGVsU2hhZGVyQ2FwdHVyZWQpCi0JCXsKLQkJCURpcmVjdDNEUGl4ZWxTaGFkZXI5ICpwaXhlbFNoYWRlcjsKLQkJCWRldmljZS0+R2V0UGl4ZWxTaGFkZXIocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RQaXhlbFNoYWRlcjkqKj4oJnBpeGVsU2hhZGVyKSk7Ci0KLQkJCWlmKHBpeGVsU2hhZGVyKQotCQkJewotCQkJCXBpeGVsU2hhZGVyLT5iaW5kKCk7Ci0JCQkJcGl4ZWxTaGFkZXItPlJlbGVhc2UoKTsKLQkJCX0KLQotCQkJaWYodGhpcy0+cGl4ZWxTaGFkZXIpCi0JCQl7Ci0JCQkJdGhpcy0+cGl4ZWxTaGFkZXItPnVuYmluZCgpOwotCQkJfQotCi0JCQl0aGlzLT5waXhlbFNoYWRlciA9IHBpeGVsU2hhZGVyOwotCQl9Ci0KLQkJaWYodmVydGV4U2hhZGVyQ2FwdHVyZWQpCi0JCXsKLQkJCURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdmVydGV4U2hhZGVyOwotCQkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXIocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5Kio+KCZ2ZXJ0ZXhTaGFkZXIpKTsKLQotCQkJaWYodmVydGV4U2hhZGVyKQotCQkJewotCQkJCXZlcnRleFNoYWRlci0+YmluZCgpOwotCQkJCXZlcnRleFNoYWRlci0+UmVsZWFzZSgpOwotCQkJfQotCi0JCQlpZih0aGlzLT52ZXJ0ZXhTaGFkZXIpCi0JCQl7Ci0JCQkJdGhpcy0+dmVydGV4U2hhZGVyLT51bmJpbmQoKTsKLQkJCX0KLQotCQkJdGhpcy0+dmVydGV4U2hhZGVyID0gdmVydGV4U2hhZGVyOwotCQl9Ci0KLQkJaWYodmlld3BvcnRDYXB0dXJlZCkKLQkJewotCQkJZGV2aWNlLT5HZXRWaWV3cG9ydCgmdmlld3BvcnQpOwotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IE1BWF9QSVhFTF9TSEFERVJfQ09OU1Q7IGkrKykKLQkJewotCQkJaWYoKihpbnQqKXBpeGVsU2hhZGVyQ29uc3RhbnRGW2ldICE9IDB4ODAwMDAwMDApCi0JCQl7Ci0JCQkJZGV2aWNlLT5HZXRQaXhlbFNoYWRlckNvbnN0YW50RihpLCBwaXhlbFNoYWRlckNvbnN0YW50RltpXSwgMSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJewotCQkJaWYocGl4ZWxTaGFkZXJDb25zdGFudElbaV1bMF0gIT0gMHg4MDAwMDAwMCkKLQkJCXsKLQkJCQlkZXZpY2UtPkdldFBpeGVsU2hhZGVyQ29uc3RhbnRJKGksIHBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldLCAxKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQotCQl7Ci0JCQlpZihwaXhlbFNoYWRlckNvbnN0YW50QltpXSAhPSAweDgwMDAwMDAwKQotCQkJewotCQkJCWRldmljZS0+R2V0UGl4ZWxTaGFkZXJDb25zdGFudEIoaSwgJnBpeGVsU2hhZGVyQ29uc3RhbnRCW2ldLCAxKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBNQVhfVkVSVEVYX1NIQURFUl9DT05TVDsgaSsrKQotCQl7Ci0JCQlpZigqKGludCopdmVydGV4U2hhZGVyQ29uc3RhbnRGW2ldICE9IDB4ODAwMDAwMDApCi0JCQl7Ci0JCQkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEYoaSwgdmVydGV4U2hhZGVyQ29uc3RhbnRGW2ldLCAxKTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQotCQl7Ci0JCQlpZih2ZXJ0ZXhTaGFkZXJDb25zdGFudElbaV1bMF0gIT0gMHg4MDAwMDAwMCkKLQkJCXsKLQkJCQlkZXZpY2UtPkdldFZlcnRleFNoYWRlckNvbnN0YW50SShpLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbaV0sIDEpOwotCQkJfQotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCi0JCXsKLQkJCWlmKHZlcnRleFNoYWRlckNvbnN0YW50QltpXSAhPSAweDgwMDAwMDAwKQotCQkJewotCQkJCWRldmljZS0+R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRCKGksICZ2ZXJ0ZXhTaGFkZXJDb25zdGFudEJbaV0sIDEpOwotCQkJfQotCQl9Ci0KLQkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykKLQkJewotCQkJaWYoY2xpcFBsYW5lQ2FwdHVyZWRbaW5kZXhdKQotCQkJewotCQkJCWRldmljZS0+R2V0Q2xpcFBsYW5lKGluZGV4LCBjbGlwUGxhbmVbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCWlmKHNjaXNzb3JSZWN0Q2FwdHVyZWQpCi0JCXsKLQkJCWRldmljZS0+R2V0U2Npc3NvclJlY3QoJnNjaXNzb3JSZWN0KTsKLQkJfQotCi0JCWlmKHBhbGV0dGVOdW1iZXJDYXB0dXJlZCkKLQkJewotCQkJZGV2aWNlLT5HZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUoJnBhbGV0dGVOdW1iZXIpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3RhdGVCbG9jazk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXZpY2UpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJdGhpcy0+ZGV2aWNlLT5BZGRSZWYoKTsKLQkJKmRldmljZSA9IHRoaXMtPmRldmljZTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6bGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCwgaW50IGVuYWJsZSkKLQl7Ci0JCWlmKGluZGV4IDwgOCkKLQkJewotCQkJbGlnaHRFbmFibGVDYXB0dXJlZFtpbmRleF0gPSB0cnVlOwotCQkJbGlnaHRFbmFibGVTdGF0ZVtpbmRleF0gPSBlbmFibGU7Ci0JCX0KLQkJZWxzZSBBU1NFUlQoZmFsc2UpOyAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSkKLQl7Ci0JCWNsaXBQbGFuZUNhcHR1cmVkW2luZGV4XSA9IHRydWU7Ci0JCWNsaXBQbGFuZVtpbmRleF1bMF0gPSBwbGFuZVswXTsKLQkJY2xpcFBsYW5lW2luZGV4XVsxXSA9IHBsYW5lWzFdOwotCQljbGlwUGxhbmVbaW5kZXhdWzJdID0gcGxhbmVbMl07Ci0JCWNsaXBQbGFuZVtpbmRleF1bM10gPSBwbGFuZVszXTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcikKLQl7Ci0JCXBhbGV0dGVOdW1iZXJDYXB0dXJlZCA9IHRydWU7Ci0JCXRoaXMtPnBhbGV0dGVOdW1iZXIgPSBwYWxldHRlTnVtYmVyOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0RlZGKHVuc2lnbmVkIGxvbmcgRlZGKQotCXsKLQkJZnZmQ2FwdHVyZWQgPSB0cnVlOwotCQl0aGlzLT5GVkYgPSBGVkY7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRJbmRpY2VzKERpcmVjdDNESW5kZXhCdWZmZXI5ICppbmRleEJ1ZmZlcikKLQl7Ci0JCWlmKGluZGV4QnVmZmVyKSBpbmRleEJ1ZmZlci0+YmluZCgpOwotCQlpZih0aGlzLT5pbmRleEJ1ZmZlcikgdGhpcy0+aW5kZXhCdWZmZXItPnVuYmluZCgpOwotCi0JCWluZGV4QnVmZmVyQ2FwdHVyZWQgPSB0cnVlOwotCQl0aGlzLT5pbmRleEJ1ZmZlciA9IGluZGV4QnVmZmVyOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgRDNETElHSFQ5ICpsaWdodCkKLQl7Ci0JCWlmKGluZGV4IDwgOCkKLQkJewotCQkJbGlnaHRDYXB0dXJlZFtpbmRleF0gPSB0cnVlOwotCQkJdGhpcy0+bGlnaHRbaW5kZXhdID0gKmxpZ2h0OwotCQl9Ci0JCWVsc2UgQVNTRVJUKGZhbHNlKTsgICAvLyBGSVhNRTogU3VwcG9ydCB1bmxpbWl0ZWQgaW5kZXgKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOSAqbWF0ZXJpYWwpCi0JewotCQltYXRlcmlhbENhcHR1cmVkID0gdHJ1ZTsKLQkJdGhpcy0+bWF0ZXJpYWwgPSAqbWF0ZXJpYWw7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXROUGF0Y2hNb2RlKGZsb2F0IHNlZ21lbnRzKQotCXsKLQkJblBhdGNoTW9kZUNhcHR1cmVkID0gdHJ1ZTsKLQkJblBhdGNoTW9kZSA9IHNlZ21lbnRzOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0UGl4ZWxTaGFkZXIoRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnBpeGVsU2hhZGVyKQotCXsKLQkJaWYocGl4ZWxTaGFkZXIpIHBpeGVsU2hhZGVyLT5iaW5kKCk7Ci0JCWlmKHRoaXMtPnBpeGVsU2hhZGVyKSB0aGlzLT5waXhlbFNoYWRlci0+dW5iaW5kKCk7Ci0KLQkJcGl4ZWxTaGFkZXJDYXB0dXJlZCA9IHRydWU7Ci0JCXRoaXMtPnBpeGVsU2hhZGVyID0gcGl4ZWxTaGFkZXI7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRQaXhlbFNoYWRlckNvbnN0YW50Qih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKLQl7Ci0JCW1lbWNweSgmcGl4ZWxTaGFkZXJDb25zdGFudEJbc3RhcnRSZWdpc3Rlcl0sIGNvbnN0YW50RGF0YSwgY291bnQgKiBzaXplb2YoaW50KSk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRQaXhlbFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJbWVtY3B5KHBpeGVsU2hhZGVyQ29uc3RhbnRGW3N0YXJ0UmVnaXN0ZXJdLCBjb25zdGFudERhdGEsIGNvdW50ICogc2l6ZW9mKGZsb2F0WzRdKSk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRQaXhlbFNoYWRlckNvbnN0YW50SSh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgaW50ICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKLQl7Ci0JCW1lbWNweShwaXhlbFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyXSwgY29uc3RhbnREYXRhLCBjb3VudCAqIHNpemVvZihpbnRbNF0pKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLQl7Ci0JCXJlbmRlclN0YXRlQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKLQkJcmVuZGVyU3RhdGVbc3RhdGVdID0gdmFsdWU7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRTYW1wbGVyU3RhdGUodW5zaWduZWQgbG9uZyBpbmRleCwgRDNEU0FNUExFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLQl7Ci0JCXVuc2lnbmVkIGludCBzYW1wbGVyID0gaW5kZXggPCAxNiA/IGluZGV4IDogKGluZGV4IC0gRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwKSArIDE2OwotCi0JCWlmKHNhbXBsZXIgPj0gMTYgKyA0KQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzYW1wbGVyU3RhdGVDYXB0dXJlZFtzYW1wbGVyXVtzdGF0ZV0gPSB0cnVlOwotCQlzYW1wbGVyU3RhdGVbc2FtcGxlcl1bc3RhdGVdID0gdmFsdWU7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRTY2lzc29yUmVjdChjb25zdCBSRUNUICpyZWN0KQotCXsKLQkJc2Npc3NvclJlY3RDYXB0dXJlZCA9IHRydWU7Ci0JCXNjaXNzb3JSZWN0ID0gKnJlY3Q7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICp2ZXJ0ZXhCdWZmZXIsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzdHJpZGUpCi0JewotCQlpZih2ZXJ0ZXhCdWZmZXIpIHZlcnRleEJ1ZmZlci0+YmluZCgpOwotCQlpZihzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpIHN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlci0+dW5iaW5kKCk7Ci0KLQkJc3RyZWFtU291cmNlQ2FwdHVyZWRbc3RyZWFtXSA9IHRydWU7Ci0JCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IHZlcnRleEJ1ZmZlcjsKLQkJc3RyZWFtU291cmNlW3N0cmVhbV0ub2Zmc2V0ID0gb2Zmc2V0OwotCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS5zdHJpZGUgPSBzdHJpZGU7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCBkaXZpZGVyKQotCXsKLQkJc3RyZWFtU291cmNlRnJlcXVlbmN5Q2FwdHVyZWRbc3RyZWFtTnVtYmVyXSA9IHRydWU7Ci0JCXN0cmVhbVNvdXJjZUZyZXF1ZW5jeVtzdHJlYW1OdW1iZXJdID0gZGl2aWRlcjsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFRleHR1cmUodW5zaWduZWQgbG9uZyBpbmRleCwgRGlyZWN0M0RCYXNlVGV4dHVyZTkgKnRleHR1cmUpCi0JewotCQl1bnNpZ25lZCBpbnQgc2FtcGxlciA9IGluZGV4IDwgMTYgPyBpbmRleCA6IChpbmRleCAtIEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCkgKyAxNjsKLQotCQlpZihzYW1wbGVyID49IDE2ICsgNCkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYodGV4dHVyZSkgdGV4dHVyZS0+YmluZCgpOwotCQlpZih0aGlzLT50ZXh0dXJlW3NhbXBsZXJdKSB0aGlzLT50ZXh0dXJlW3NhbXBsZXJdLT51bmJpbmQoKTsKLQotCQl0ZXh0dXJlQ2FwdHVyZWRbc2FtcGxlcl0gPSB0cnVlOwotCQl0aGlzLT50ZXh0dXJlW3NhbXBsZXJdID0gdGV4dHVyZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotCXsKLQkJdGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bdHlwZV0gPSB0cnVlOwotCQl0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bdHlwZV0gPSB2YWx1ZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KQotCXsKLQkJdHJhbnNmb3JtQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKLQkJdHJhbnNmb3JtW3N0YXRlXSA9ICptYXRyaXg7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRWaWV3cG9ydChjb25zdCBEM0RWSUVXUE9SVDkgKnZpZXdwb3J0KQotCXsKLQkJdmlld3BvcnRDYXB0dXJlZCA9IHRydWU7Ci0JCXRoaXMtPnZpZXdwb3J0ID0gKnZpZXdwb3J0OwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0VmVydGV4RGVjbGFyYXRpb24oRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnZlcnRleERlY2xhcmF0aW9uKQotCXsKLQkJaWYodmVydGV4RGVjbGFyYXRpb24pIHZlcnRleERlY2xhcmF0aW9uLT5iaW5kKCk7Ci0JCWlmKHRoaXMtPnZlcnRleERlY2xhcmF0aW9uKSB0aGlzLT52ZXJ0ZXhEZWNsYXJhdGlvbi0+dW5iaW5kKCk7Ci0KLQkJdmVydGV4RGVjbGFyYXRpb25DYXB0dXJlZCA9IHRydWU7Ci0JCXRoaXMtPnZlcnRleERlY2xhcmF0aW9uID0gdmVydGV4RGVjbGFyYXRpb247Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRWZXJ0ZXhTaGFkZXIoRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICp2ZXJ0ZXhTaGFkZXIpCi0JewotCQlpZih2ZXJ0ZXhTaGFkZXIpIHZlcnRleFNoYWRlci0+YmluZCgpOwotCQlpZih0aGlzLT52ZXJ0ZXhTaGFkZXIpIHRoaXMtPnZlcnRleFNoYWRlci0+dW5iaW5kKCk7Ci0KLQkJdmVydGV4U2hhZGVyQ2FwdHVyZWQgPSB0cnVlOwotCQl0aGlzLT52ZXJ0ZXhTaGFkZXIgPSB2ZXJ0ZXhTaGFkZXI7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpzZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCi0JewotCQltZW1jcHkoJnZlcnRleFNoYWRlckNvbnN0YW50QltzdGFydFJlZ2lzdGVyXSwgY29uc3RhbnREYXRhLCBjb3VudCAqIHNpemVvZihpbnQpKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OnNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJbWVtY3B5KHZlcnRleFNoYWRlckNvbnN0YW50RltzdGFydFJlZ2lzdGVyXSwgY29uc3RhbnREYXRhLCBjb3VudCAqIHNpemVvZihmbG9hdFs0XSkpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQotCXsKLQkJbWVtY3B5KHZlcnRleFNoYWRlckNvbnN0YW50SVtzdGFydFJlZ2lzdGVyXSwgY29uc3RhbnREYXRhLCBjb3VudCAqIHNpemVvZihpbnRbNF0pKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNsZWFyKCkKLQl7Ci0JCS8vIEVyYXNlIGNhcHR1cmUgZmxhZ3MKLQkJZnZmQ2FwdHVyZWQgPSBmYWxzZTsKLQkJdmVydGV4RGVjbGFyYXRpb25DYXB0dXJlZCA9IGZhbHNlOwotCi0JCWluZGV4QnVmZmVyQ2FwdHVyZWQgPSBmYWxzZTsKLQotCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCBEM0RSU19CTEVORE9QQUxQSEEgKyAxOyBzdGF0ZSsrKQotCQl7Ci0JCQlyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSA9IGZhbHNlOwotCQl9Ci0KLQkJblBhdGNoTW9kZUNhcHR1cmVkID0gZmFsc2U7Ci0KLQkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKLQkJewotCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEVFNTX0NPTlNUQU5UICsgMTsgc3RhdGUrKykKLQkJCXsKLQkJCQl0ZXh0dXJlU3RhZ2VTdGF0ZUNhcHR1cmVkW3N0YWdlXVtzdGF0ZV0gPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc2FtcGxlciA9IDA7IHNhbXBsZXIgPCAxNiArIDQ7IHNhbXBsZXIrKykKLQkJewotCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEU0FNUF9ETUFQT0ZGU0VUICsgMTsgc3RhdGUrKykKLQkJCXsKLQkJCQlzYW1wbGVyU3RhdGVDYXB0dXJlZFtzYW1wbGVyXVtzdGF0ZV0gPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgTUFYX1ZFUlRFWF9JTlBVVFM7IHN0cmVhbSsrKQotCQl7Ci0JCQlzdHJlYW1Tb3VyY2VDYXB0dXJlZFtzdHJlYW1dID0gZmFsc2U7Ci0JCQlzdHJlYW1Tb3VyY2VGcmVxdWVuY3lDYXB0dXJlZFtzdHJlYW1dID0gZmFsc2U7Ci0JCX0KLQotCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTYgKyA0OyBzYW1wbGVyKyspCi0JCXsKLQkJCXRleHR1cmVDYXB0dXJlZFtzYW1wbGVyXSA9IGZhbHNlOwotCQl9Ci0KLQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgNTEyOyBzdGF0ZSsrKQotCQl7Ci0JCQl0cmFuc2Zvcm1DYXB0dXJlZFtzdGF0ZV0gPSBmYWxzZTsKLQkJfQotCi0JCW1hdGVyaWFsQ2FwdHVyZWQgPSBmYWxzZTsKLQotCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAotCQl7Ci0JCQlsaWdodENhcHR1cmVkW2luZGV4XSA9IGZhbHNlOwotCQl9Ci0KLQkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgICAvLyBGSVhNRTogU3VwcG9ydCB1bmxpbWl0ZWQgaW5kZXgKLQkJewotCQkJbGlnaHRFbmFibGVDYXB0dXJlZFtpbmRleF0gPSBmYWxzZTsKLQkJfQotCi0JCXNjaXNzb3JSZWN0Q2FwdHVyZWQgPSBmYWxzZTsKLQotCQlwaXhlbFNoYWRlckNhcHR1cmVkID0gZmFsc2U7Ci0JCXZlcnRleFNoYWRlckNhcHR1cmVkID0gZmFsc2U7Ci0KLQkJdmlld3BvcnRDYXB0dXJlZCA9IGZhbHNlOwotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBNQVhfUElYRUxfU0hBREVSX0NPTlNUOyBpKyspCi0JCXsKLQkJCShpbnQmKXBpeGVsU2hhZGVyQ29uc3RhbnRGW2ldWzBdID0gMHg4MDAwMDAwMDsKLQkJCShpbnQmKXBpeGVsU2hhZGVyQ29uc3RhbnRGW2ldWzFdID0gMHg4MDAwMDAwMDsKLQkJCShpbnQmKXBpeGVsU2hhZGVyQ29uc3RhbnRGW2ldWzJdID0gMHg4MDAwMDAwMDsKLQkJCShpbnQmKXBpeGVsU2hhZGVyQ29uc3RhbnRGW2ldWzNdID0gMHg4MDAwMDAwMDsKLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBNQVhfVkVSVEVYX1NIQURFUl9DT05TVDsgaSsrKQotCQl7Ci0JCQkoaW50Jil2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaV1bMF0gPSAweDgwMDAwMDAwOwotCQkJKGludCYpdmVydGV4U2hhZGVyQ29uc3RhbnRGW2ldWzFdID0gMHg4MDAwMDAwMDsKLQkJCShpbnQmKXZlcnRleFNoYWRlckNvbnN0YW50RltpXVsyXSA9IDB4ODAwMDAwMDA7Ci0JCQkoaW50Jil2ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaV1bM10gPSAweDgwMDAwMDAwOwotCQl9Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCi0JCXsKLQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzBdID0gMHg4MDAwMDAwMDsKLQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzFdID0gMHg4MDAwMDAwMDsKLQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzJdID0gMHg4MDAwMDAwMDsKLQkJCXBpeGVsU2hhZGVyQ29uc3RhbnRJW2ldWzNdID0gMHg4MDAwMDAwMDsKLQotCQkJcGl4ZWxTaGFkZXJDb25zdGFudEJbaV0gPSAweDgwMDAwMDAwOwotCi0JCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudElbaV1bMF0gPSAweDgwMDAwMDAwOwotCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRJW2ldWzFdID0gMHg4MDAwMDAwMDsKLQkJCXZlcnRleFNoYWRlckNvbnN0YW50SVtpXVsyXSA9IDB4ODAwMDAwMDA7Ci0JCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudElbaV1bM10gPSAweDgwMDAwMDAwOwotCi0JCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudEJbaV0gPSAweDgwMDAwMDAwOwotCQl9Ci0KLQkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykKLQkJewotCQkJY2xpcFBsYW5lQ2FwdHVyZWRbaW5kZXhdID0gZmFsc2U7Ci0JCX0KLQotCQlwYWxldHRlTnVtYmVyQ2FwdHVyZWQgPSBmYWxzZTsKLQotCQkvLyB1bmJpbmQgcmVzb3VyY2VzCi0JCWlmKHZlcnRleERlY2xhcmF0aW9uKQotCQl7Ci0JCQl2ZXJ0ZXhEZWNsYXJhdGlvbi0+dW5iaW5kKCk7Ci0JCQl2ZXJ0ZXhEZWNsYXJhdGlvbiA9IDA7Ci0JCX0KLQotCQlpZihpbmRleEJ1ZmZlcikKLQkJewotCQkJaW5kZXhCdWZmZXItPnVuYmluZCgpOwotCQkJaW5kZXhCdWZmZXIgPSAwOwotCQl9Ci0KLQkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBNQVhfVkVSVEVYX0lOUFVUUzsgc3RyZWFtKyspCi0JCXsKLQkJCWlmKHN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlcikKLQkJCXsKLQkJCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXItPnVuYmluZCgpOwotCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDwgMTYgKyA0OyBzYW1wbGVyKyspCi0JCXsKLQkJCWlmKHRleHR1cmVbc2FtcGxlcl0pCi0JCQl7Ci0JCQkJdGV4dHVyZVtzYW1wbGVyXS0+dW5iaW5kKCk7Ci0JCQkJdGV4dHVyZVtzYW1wbGVyXSA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlpZihwaXhlbFNoYWRlcikKLQkJewotCQkJcGl4ZWxTaGFkZXItPnVuYmluZCgpOwotCQkJcGl4ZWxTaGFkZXIgPSAwOwotCQl9Ci0KLQkJaWYodmVydGV4U2hhZGVyKQotCQl7Ci0JCQl2ZXJ0ZXhTaGFkZXItPnVuYmluZCgpOwotCQkJdmVydGV4U2hhZGVyID0gMDsKLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSkKLQl7Ci0JCWRldmljZS0+R2V0UmVuZGVyU3RhdGUoc3RhdGUsICZyZW5kZXJTdGF0ZVtzdGF0ZV0pOwotCQlyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSA9IHRydWU7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlU2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUpCi0JewotCQlpZihpbmRleCA8IDE2KQotCQl7Ci0JCQlkZXZpY2UtPkdldFNhbXBsZXJTdGF0ZShpbmRleCwgc3RhdGUsICZzYW1wbGVyU3RhdGVbaW5kZXhdW3N0YXRlXSk7Ci0JCQlzYW1wbGVyU3RhdGVDYXB0dXJlZFtpbmRleF1bc3RhdGVdID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmKGluZGV4ID49IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCkKLQkJewotCQkJdW5zaWduZWQgaW50IHNhbXBsZXIgPSAxNiArIChpbmRleCAtIEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMCk7Ci0KLQkJCWRldmljZS0+R2V0U2FtcGxlclN0YXRlKGluZGV4LCBzdGF0ZSwgJnNhbXBsZXJTdGF0ZVtzYW1wbGVyXVtzdGF0ZV0pOwotCQkJc2FtcGxlclN0YXRlQ2FwdHVyZWRbc2FtcGxlcl1bc3RhdGVdID0gdHJ1ZTsKLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlKQotCXsKLQkJZGV2aWNlLT5HZXRUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgdHlwZSwgJnRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVt0eXBlXSk7Ci0JCXRleHR1cmVTdGFnZVN0YXRlQ2FwdHVyZWRbc3RhZ2VdW3R5cGVdID0gdHJ1ZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlKQotCXsKLQkJZGV2aWNlLT5HZXRUcmFuc2Zvcm0oc3RhdGUsICZ0cmFuc2Zvcm1bc3RhdGVdKTsKLQkJdHJhbnNmb3JtQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVQaXhlbFJlbmRlclN0YXRlcygpCi0JewotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfWkVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GSUxMTU9ERSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TSEFERU1PREUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfWldSSVRFRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FMUEhBVEVTVEVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19MQVNUUElYRUwpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1JDQkxFTkQpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfREVTVEJMRU5EKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1pGVU5DKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FMUEhBUkVGKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FMUEhBRlVOQyk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19ESVRIRVJFTkFCTEUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HU1RBUlQpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HRU5EKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0RFTlNJVFkpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFCTEVOREVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19ERVBUSEJJQVMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMRkFJTCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMWkZBSUwpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFBBU1MpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEZVTkMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFJFRik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMTUFTSyk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TVEVOQ0lMV1JJVEVNQVNLKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1RFWFRVUkVGQUNUT1IpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDApOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDEpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDIpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDQpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDYpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDcpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDgpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDkpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDEwKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVAxMSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTIpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfV1JBUDEzKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVAxNCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19XUkFQMTUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ09MT1JXUklURUVOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19CTEVORE9QKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NDSVNTT1JURVNURU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NMT1BFU0NBTEVERVBUSEJJQVMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQU5USUFMSUFTRURMSU5FRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ0NXX1NURU5DSUxGQUlMKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NDV19TVEVOQ0lMWkZBSUwpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ0NXX1NURU5DSUxQQVNTKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NDV19TVEVOQ0lMRlVOQyk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DT0xPUldSSVRFRU5BQkxFMSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DT0xPUldSSVRFRU5BQkxFMik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DT0xPUldSSVRFRU5BQkxFMyk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19CTEVOREZBQ1RPUik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TUkdCV1JJVEVFTkFCTEUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU0VQQVJBVEVBTFBIQUJMRU5ERU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NSQ0JMRU5EQUxQSEEpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfREVTVEJMRU5EQUxQSEEpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQkxFTkRPUEFMUEhBKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVQaXhlbFRleHR1cmVTdGF0ZXMoKQotCXsKLQkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKLQkJewotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQ09MT1JPUCk7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19DT0xPUkFSRzEpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQ09MT1JBUkcyKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FMUEhBT1ApOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUxQSEFBUkcxKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FMUEhBQVJHMik7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTUFUMDApOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQlVNUEVOVk1BVDAxKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0JVTVBFTlZNQVQxMCk7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTUFUMTEpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfVEVYQ09PUkRJTkRFWCk7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTFNDQUxFKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyk7Ci0JCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19DT0xPUkFSRzApOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQUxQSEFBUkcwKTsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1JFU1VMVEFSRyk7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVQaXhlbFNhbXBsZXJTdGF0ZXMoKQotCXsKLQkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8PSBEM0RWRVJURVhURVhUVVJFU0FNUExFUjM7IHNhbXBsZXIrKykKLQkJewotCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX0FERFJFU1NVKTsKLQkJCWNhcHR1cmVTYW1wbGVyU3RhdGUoc2FtcGxlciwgRDNEU0FNUF9BRERSRVNTVik7Ci0JCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfQUREUkVTU1cpOwotCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX0JPUkRFUkNPTE9SKTsKLQkJCWNhcHR1cmVTYW1wbGVyU3RhdGUoc2FtcGxlciwgRDNEU0FNUF9NQUdGSUxURVIpOwotCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX01JTkZJTFRFUik7Ci0JCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfTUlQRklMVEVSKTsKLQkJCWNhcHR1cmVTYW1wbGVyU3RhdGUoc2FtcGxlciwgRDNEU0FNUF9NSVBNQVBMT0RCSUFTKTsKLQkJCWNhcHR1cmVTYW1wbGVyU3RhdGUoc2FtcGxlciwgRDNEU0FNUF9NQVhNSVBMRVZFTCk7Ci0JCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfTUFYQU5JU09UUk9QWSk7Ci0JCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfU1JHQlRFWFRVUkUpOwotCQkJY2FwdHVyZVNhbXBsZXJTdGF0ZShzYW1wbGVyLCBEM0RTQU1QX0VMRU1FTlRJTkRFWCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVQaXhlbFNoYWRlclN0YXRlcygpCi0JewotCQlwaXhlbFNoYWRlckNhcHR1cmVkID0gdHJ1ZTsKLQkJZGV2aWNlLT5HZXRQaXhlbFNoYWRlcihyZWludGVycHJldF9jYXN0PElEaXJlY3QzRFBpeGVsU2hhZGVyOSoqPigmcGl4ZWxTaGFkZXIpKTsKLQotCQlpZihwaXhlbFNoYWRlcikKLQkJewotCQkJcGl4ZWxTaGFkZXItPmJpbmQoKTsKLQkJCXBpeGVsU2hhZGVyLT5SZWxlYXNlKCk7Ci0JCX0KLQotCQlkZXZpY2UtPkdldFBpeGVsU2hhZGVyQ29uc3RhbnRGKDAsIHBpeGVsU2hhZGVyQ29uc3RhbnRGWzBdLCAzMik7Ci0JCWRldmljZS0+R2V0UGl4ZWxTaGFkZXJDb25zdGFudEkoMCwgcGl4ZWxTaGFkZXJDb25zdGFudElbMF0sIDE2KTsKLQkJZGV2aWNlLT5HZXRQaXhlbFNoYWRlckNvbnN0YW50QigwLCBwaXhlbFNoYWRlckNvbnN0YW50QiwgMTYpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVZlcnRleFJlbmRlclN0YXRlcygpCi0JewotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ1VMTE1PREUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0NPTE9SKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR1RBQkxFTU9ERSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dTVEFSVCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dFTkQpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HREVOU0lUWSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19SQU5HRUZPR0VOQUJMRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BTUJJRU5UKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NPTE9SVkVSVEVYKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR1ZFUlRFWE1PREUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ0xJUFBJTkcpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTElHSFRJTkcpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTE9DQUxWSUVXRVIpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0UpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRElGRlVTRU1BVEVSSUFMU09VUkNFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0UpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfVkVSVEVYQkxFTkQpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ0xJUFBMQU5FRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0laRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkVfTUlOKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVFTkFCTEUpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRV9BKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVfQik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFX0MpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVMpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTVVMVElTQU1QTEVNQVNLKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BBVENIRURHRVNUWUxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0laRV9NQVgpOwotCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfSU5ERVhFRFZFUlRFWEJMRU5ERU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1RXRUVORkFDVE9SKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPU0lUSU9OREVHUkVFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX05PUk1BTERFR1JFRSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19NSU5URVNTRUxMQVRJT05MRVZFTCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19NQVhURVNTRUxMQVRJT05MRVZFTCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BREFQVElWRVRFU1NfWCk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BREFQVElWRVRFU1NfWSk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BREFQVElWRVRFU1NfWik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BREFQVElWRVRFU1NfVyk7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTik7Ci0JCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19OT1JNQUxJWkVOT1JNQUxTKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NQRUNVTEFSRU5BQkxFKTsKLQkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NIQURFTU9ERSk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlVmVydGV4U2FtcGxlclN0YXRlcygpCi0JewotCQlmb3IoaW50IHNhbXBsZXIgPSAwOyBzYW1wbGVyIDw9IEQzRFZFUlRFWFRFWFRVUkVTQU1QTEVSMzsgc2FtcGxlcisrKQotCQl7Ci0JCQljYXB0dXJlU2FtcGxlclN0YXRlKHNhbXBsZXIsIEQzRFNBTVBfRE1BUE9GRlNFVCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVWZXJ0ZXhUZXh0dXJlU3RhdGVzKCkKLQl7Ci0JCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCi0JCXsKLQkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1RFWENPT1JESU5ERVgpOwotCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKTsKLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZU5QYXRjaE1vZGUoKQotCXsKLQkJblBhdGNoTW9kZSA9IGRldmljZS0+R2V0TlBhdGNoTW9kZSgpOwotCQluUGF0Y2hNb2RlQ2FwdHVyZWQgPSB0cnVlOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZUxpZ2h0U3RhdGVzKCkKLQl7Ci0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspICAgLy8gRklYTUU6IFN1cHBvcnQgdW5saW1pdGVkIGluZGV4Ci0JCXsKLQkJCWxvbmcgcmVzdWx0ID0gZGV2aWNlLT5HZXRMaWdodChpbmRleCwgJmxpZ2h0W2luZGV4XSk7Ci0JCQlsaWdodENhcHR1cmVkW2luZGV4XSA9IFNVQ0NFRURFRChyZXN1bHQpOwotCQl9Ci0KLQkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgICAvLyBGSVhNRTogU3VwcG9ydCB1bmxpbWl0ZWQgaW5kZXgKLQkJewotCQkJbGlnaHRFbmFibGVTdGF0ZVtpbmRleF0gPSBmYWxzZTsKLQkJCWxvbmcgcmVzdWx0ID0gZGV2aWNlLT5HZXRMaWdodEVuYWJsZShpbmRleCwgJmxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdKTsKLQkJCWxpZ2h0RW5hYmxlQ2FwdHVyZWRbaW5kZXhdID0gU1VDQ0VFREVEKHJlc3VsdCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVWZXJ0ZXhTaGFkZXJTdGF0ZXMoKQotCXsKLQkJdmVydGV4U2hhZGVyQ2FwdHVyZWQgPSB0cnVlOwotCQlkZXZpY2UtPkdldFZlcnRleFNoYWRlcihyZWludGVycHJldF9jYXN0PElEaXJlY3QzRFZlcnRleFNoYWRlcjkqKj4oJnZlcnRleFNoYWRlcikpOwotCi0JCWlmKHZlcnRleFNoYWRlcikKLQkJewotCQkJdmVydGV4U2hhZGVyLT5iaW5kKCk7Ci0JCQl2ZXJ0ZXhTaGFkZXItPlJlbGVhc2UoKTsKLQkJfQotCi0JCWRldmljZS0+R2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKDAsIHZlcnRleFNoYWRlckNvbnN0YW50RlswXSwgTUFYX1ZFUlRFWF9TSEFERVJfQ09OU1QpOwotCQlkZXZpY2UtPkdldFZlcnRleFNoYWRlckNvbnN0YW50SSgwLCB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbMF0sIDE2KTsKLQkJZGV2aWNlLT5HZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIoMCwgdmVydGV4U2hhZGVyQ29uc3RhbnRCLCAxNik7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlU3RyZWFtU291cmNlRnJlcXVlbmNpZXMoKQotCXsKLQkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBNQVhfVkVSVEVYX0lOUFVUUzsgc3RyZWFtKyspCi0JCXsKLQkJCXN0cmVhbVNvdXJjZUZyZXF1ZW5jeUNhcHR1cmVkW3N0cmVhbV0gPSB0cnVlOwotCQkJZGV2aWNlLT5HZXRTdHJlYW1Tb3VyY2VGcmVxKHN0cmVhbSwgJnN0cmVhbVNvdXJjZUZyZXF1ZW5jeVtzdHJlYW1dKTsKLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZUZWRigpCi0JewotCQlkZXZpY2UtPkdldEZWRigmRlZGKTsKLQkJZnZmQ2FwdHVyZWQgPSB0cnVlOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVZlcnRleERlY2xhcmF0aW9uKCkKLQl7Ci0JCXZlcnRleERlY2xhcmF0aW9uQ2FwdHVyZWQgPSB0cnVlOwotCQlkZXZpY2UtPkdldFZlcnRleERlY2xhcmF0aW9uKHJlaW50ZXJwcmV0X2Nhc3Q8SURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Kio+KCZ2ZXJ0ZXhEZWNsYXJhdGlvbikpOwotCi0JCWlmKHZlcnRleERlY2xhcmF0aW9uKQotCQl7Ci0JCQl2ZXJ0ZXhEZWNsYXJhdGlvbi0+YmluZCgpOwotCQkJdmVydGV4RGVjbGFyYXRpb24tPlJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVRleHR1cmVzKCkKLQl7Ci0JCWZvcihpbnQgc2FtcGxlciA9IDA7IHNhbXBsZXIgPCAxNiArIDQ7IHNhbXBsZXIrKykKLQkJewotCQkJdGV4dHVyZUNhcHR1cmVkW3NhbXBsZXJdID0gdHJ1ZTsKLQkJCWludCBpbmRleCA9IHNhbXBsZXIgPCAxNiA/IHNhbXBsZXIgOiBEM0RWRVJURVhURVhUVVJFU0FNUExFUjAgKyAoc2FtcGxlciAtIDE2KTsKLQkJCWRldmljZS0+R2V0VGV4dHVyZShpbmRleCwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RCYXNlVGV4dHVyZTkqKj4oJnRleHR1cmVbc2FtcGxlcl0pKTsKLQotCQkJaWYodGV4dHVyZVtzYW1wbGVyXSkKLQkJCXsKLQkJCQl0ZXh0dXJlW3NhbXBsZXJdLT5iaW5kKCk7Ci0JCQkJdGV4dHVyZVtzYW1wbGVyXS0+UmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlVGV4dHVyZVBhbGV0dGUoKQotCXsKLQkJcGFsZXR0ZU51bWJlckNhcHR1cmVkID0gdHJ1ZTsKLQkJZGV2aWNlLT5HZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUoJnBhbGV0dGVOdW1iZXIpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVZlcnRleFN0cmVhbXMoKQotCXsKLQkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBNQVhfVkVSVEVYX0lOUFVUUzsgc3RyZWFtKyspCi0JCXsKLQkJCXN0cmVhbVNvdXJjZUNhcHR1cmVkW3N0cmVhbV0gPSB0cnVlOwotCQkJZGV2aWNlLT5HZXRTdHJlYW1Tb3VyY2Uoc3RyZWFtLCByZWludGVycHJldF9jYXN0PElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkqKj4oJnN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciksICZzdHJlYW1Tb3VyY2Vbc3RyZWFtXS5vZmZzZXQsICZzdHJlYW1Tb3VyY2Vbc3RyZWFtXS5zdHJpZGUpOwotCi0JCQlpZihzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpCi0JCQl7Ci0JCQkJc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyLT5iaW5kKCk7Ci0JCQkJc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyLT5SZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVJbmRleEJ1ZmZlcigpCi0JewotCQlpbmRleEJ1ZmZlckNhcHR1cmVkID0gdHJ1ZTsKLQkJZGV2aWNlLT5HZXRJbmRpY2VzKHJlaW50ZXJwcmV0X2Nhc3Q8SURpcmVjdDNESW5kZXhCdWZmZXI5Kio+KCZpbmRleEJ1ZmZlcikpOwotCi0JCWlmKGluZGV4QnVmZmVyKQotCQl7Ci0JCQlpbmRleEJ1ZmZlci0+YmluZCgpOwotCQkJaW5kZXhCdWZmZXItPlJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVZpZXdwb3J0KCkKLQl7Ci0JCWRldmljZS0+R2V0Vmlld3BvcnQoJnZpZXdwb3J0KTsKLQkJdmlld3BvcnRDYXB0dXJlZCA9IHRydWU7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlU2Npc3NvclJlY3RhbmdsZSgpCi0JewotCQlkZXZpY2UtPkdldFNjaXNzb3JSZWN0KCZzY2lzc29yUmVjdCk7Ci0JCXNjaXNzb3JSZWN0Q2FwdHVyZWQgPSB0cnVlOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZVRyYW5zZm9ybXMoKQotCXsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19WSUVXKTsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19QUk9KRUNUSU9OKTsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19XT1JMRCk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s5OjpjYXB0dXJlVGV4dHVyZVRyYW5zZm9ybXMoKQotCXsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFMCk7Ci0JCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTEpOwotCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUyKTsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFMyk7Ci0JCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTQpOwotCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU1KTsKLQkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFNik7Ci0JCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTcpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrOTo6Y2FwdHVyZUNsaXBwaW5nUGxhbmVzKCkKLQl7Ci0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4KyspCi0JCXsKLQkJCWRldmljZS0+R2V0Q2xpcFBsYW5lKGluZGV4LCAoZmxvYXQqKSZjbGlwUGxhbmVbaW5kZXhdKTsKLQkJCWNsaXBQbGFuZUNhcHR1cmVkW2luZGV4XSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazk6OmNhcHR1cmVNYXRlcmlhbCgpCi0JewotCQlkZXZpY2UtPkdldE1hdGVyaWFsKCZtYXRlcmlhbCk7Ci0JCW1hdGVyaWFsQ2FwdHVyZWQgPSB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEU3RhdGVCbG9jazkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RTdGF0ZUJsb2NrOS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTk3N2QuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RTdGF0ZUJsb2NrOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q5X0RpcmVjdDNEU3RhdGVCbG9jazlfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0RTdGF0ZUJsb2NrOV9ocHAKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiVW5rbm93bi5ocHAiCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxkM2Q5Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JY2xhc3MgRGlyZWN0M0REZXZpY2U5OwotCWNsYXNzIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OwotCWNsYXNzIERpcmVjdDNESW5kZXhCdWZmZXI5OwotCWNsYXNzIERpcmVjdDNEVmVydGV4QnVmZmVyOTsKLQljbGFzcyBEaXJlY3QzREJhc2VUZXh0dXJlOTsKLQljbGFzcyBEaXJlY3QzRFBpeGVsU2hhZGVyOTsKLQljbGFzcyBEaXJlY3QzRFZlcnRleFNoYWRlcjk7Ci0KLQljbGFzcyBEaXJlY3QzRFN0YXRlQmxvY2s5IDogcHVibGljIElEaXJlY3QzRFN0YXRlQmxvY2s5LCBwdWJsaWMgVW5rbm93bgotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEU3RhdGVCbG9jazkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIEQzRFNUQVRFQkxPQ0tUWVBFIHR5cGUpOwotCi0JCX5EaXJlY3QzRFN0YXRlQmxvY2s5KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEU3RhdGVCbG9jazkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBBcHBseSgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBDYXB0dXJlKCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKSBvdmVycmlkZTsKLQotCQkvLyBJbnRlcm5hbCBtZXRob2RzCi0JCXZvaWQgbGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCwgaW50IGVuYWJsZSk7Ci0JCXZvaWQgc2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSk7Ci0JCXZvaWQgc2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyKTsKLQkJdm9pZCBzZXRGVkYodW5zaWduZWQgbG9uZyBGVkYpOwotCQl2b2lkIHNldEluZGljZXMoRGlyZWN0M0RJbmRleEJ1ZmZlcjkgKmluZGV4RGF0YSk7Ci0JCXZvaWQgc2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgRDNETElHSFQ5ICpsaWdodCk7Ci0JCXZvaWQgc2V0TWF0ZXJpYWwoY29uc3QgRDNETUFURVJJQUw5ICptYXRlcmlhbCk7Ci0JCXZvaWQgc2V0TlBhdGNoTW9kZShmbG9hdCBzZWdtZW50cyk7Ci0JCXZvaWQgc2V0UGl4ZWxTaGFkZXIoRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnNoYWRlcik7Ci0JCXZvaWQgc2V0UGl4ZWxTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOwotCQl2b2lkIHNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBmbG9hdCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOwotCQl2b2lkIHNldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCBpbnQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsKLQkJdm9pZCBzZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOwotCQl2b2lkIHNldFNhbXBsZXJTdGF0ZSh1bnNpZ25lZCBsb25nIGluZGV4LCBEM0RTQU1QTEVSU1RBVEVUWVBFIHN0YXRlLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKLQkJdm9pZCBzZXRTY2lzc29yUmVjdChjb25zdCBSRUNUICpyZWN0KTsKLQkJdm9pZCBzZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc3RyaWRlKTsKLQkJdm9pZCBzZXRTdHJlYW1Tb3VyY2VGcmVxKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIHVuc2lnbmVkIGludCBkaXZpZGVyKTsKLQkJdm9pZCBzZXRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIERpcmVjdDNEQmFzZVRleHR1cmU5ICp0ZXh0dXJlKTsKLQkJdm9pZCBzZXRUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7Ci0JCXZvaWQgc2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpOwotCQl2b2lkIHNldFZpZXdwb3J0KGNvbnN0IEQzRFZJRVdQT1JUOSAqdmlld3BvcnQpOwotCQl2b2lkIHNldFZlcnRleERlY2xhcmF0aW9uKERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsYXJhdGlvbik7Ci0JCXZvaWQgc2V0VmVydGV4U2hhZGVyKERpcmVjdDNEVmVydGV4U2hhZGVyOSAqc2hhZGVyKTsKLQkJdm9pZCBzZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOwotCQl2b2lkIHNldFZlcnRleFNoYWRlckNvbnN0YW50Rih1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3QgZmxvYXQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsKLQkJdm9pZCBzZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IGludCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpOwotCi0JcHJpdmF0ZToKLQkJLy8gSW5kaXZpZHVhbCBzdGF0ZXMKLQkJdm9pZCBjYXB0dXJlUmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlKTsKLQkJdm9pZCBjYXB0dXJlU2FtcGxlclN0YXRlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRFNBTVBMRVJTVEFURVRZUEUgc3RhdGUpOwotCQl2b2lkIGNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSk7Ci0JCXZvaWQgY2FwdHVyZVRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUpOwotCi0JCS8vIFBpeGVsIHN0YXRlcwotCQl2b2lkIGNhcHR1cmVQaXhlbFJlbmRlclN0YXRlcygpOwotCQl2b2lkIGNhcHR1cmVQaXhlbFRleHR1cmVTdGF0ZXMoKTsKLQkJdm9pZCBjYXB0dXJlUGl4ZWxTYW1wbGVyU3RhdGVzKCk7Ci0JCXZvaWQgY2FwdHVyZVBpeGVsU2hhZGVyU3RhdGVzKCk7Ci0KLQkJLy8gVmVydGV4IHN0YXRlcwotCQl2b2lkIGNhcHR1cmVWZXJ0ZXhSZW5kZXJTdGF0ZXMoKTsKLQkJdm9pZCBjYXB0dXJlVmVydGV4U2FtcGxlclN0YXRlcygpOwotCQl2b2lkIGNhcHR1cmVWZXJ0ZXhUZXh0dXJlU3RhdGVzKCk7Ci0JCXZvaWQgY2FwdHVyZU5QYXRjaE1vZGUoKTsKLQkJdm9pZCBjYXB0dXJlTGlnaHRTdGF0ZXMoKTsKLQkJdm9pZCBjYXB0dXJlVmVydGV4U2hhZGVyU3RhdGVzKCk7Ci0JCXZvaWQgY2FwdHVyZVN0cmVhbVNvdXJjZUZyZXF1ZW5jaWVzKCk7Ci0JCXZvaWQgY2FwdHVyZVZlcnRleERlY2xhcmF0aW9uKCk7Ci0JCXZvaWQgY2FwdHVyZUZWRigpOwotCi0JCS8vIEFsbCAocmVtYWluaW5nKSBzdGF0ZXMKLQkJdm9pZCBjYXB0dXJlVGV4dHVyZXMoKTsKLQkJdm9pZCBjYXB0dXJlVGV4dHVyZVBhbGV0dGUoKTsKLQkJdm9pZCBjYXB0dXJlVmVydGV4U3RyZWFtcygpOwotCQl2b2lkIGNhcHR1cmVJbmRleEJ1ZmZlcigpOwotCQl2b2lkIGNhcHR1cmVWaWV3cG9ydCgpOwotCQl2b2lkIGNhcHR1cmVTY2lzc29yUmVjdGFuZ2xlKCk7Ci0JCXZvaWQgY2FwdHVyZVRyYW5zZm9ybXMoKTsKLQkJdm9pZCBjYXB0dXJlVGV4dHVyZVRyYW5zZm9ybXMoKTsKLQkJdm9pZCBjYXB0dXJlQ2xpcHBpbmdQbGFuZXMoKTsKLQkJdm9pZCBjYXB0dXJlTWF0ZXJpYWwoKTsKLQotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCURpcmVjdDNERGV2aWNlOSAqY29uc3QgZGV2aWNlOwotCQljb25zdCBEM0RTVEFURUJMT0NLVFlQRSB0eXBlOwotCi0JCS8vIFN0YXRlIGRhdGEKLQkJYm9vbCB2ZXJ0ZXhEZWNsYXJhdGlvbkNhcHR1cmVkOwotCQlEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4RGVjbGFyYXRpb247Ci0KLQkJYm9vbCBmdmZDYXB0dXJlZDsKLQkJdW5zaWduZWQgbG9uZyBGVkY7Ci0KLQkJYm9vbCBpbmRleEJ1ZmZlckNhcHR1cmVkOwotCQlEaXJlY3QzREluZGV4QnVmZmVyOSAqaW5kZXhCdWZmZXI7Ci0KLQkJYm9vbCByZW5kZXJTdGF0ZUNhcHR1cmVkW0QzRFJTX0JMRU5ET1BBTFBIQSArIDFdOwotCQl1bnNpZ25lZCBsb25nIHJlbmRlclN0YXRlW0QzRFJTX0JMRU5ET1BBTFBIQSArIDFdOwotCi0JCWJvb2wgblBhdGNoTW9kZUNhcHR1cmVkOwotCQlmbG9hdCBuUGF0Y2hNb2RlOwotCi0JCWJvb2wgdGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFs4XVtEM0RUU1NfQ09OU1RBTlQgKyAxXTsKLQkJdW5zaWduZWQgbG9uZyB0ZXh0dXJlU3RhZ2VTdGF0ZVs4XVtEM0RUU1NfQ09OU1RBTlQgKyAxXTsKLQotCQlib29sIHNhbXBsZXJTdGF0ZUNhcHR1cmVkWzE2ICsgNF1bRDNEU0FNUF9ETUFQT0ZGU0VUICsgMV07Ci0JCXVuc2lnbmVkIGxvbmcgc2FtcGxlclN0YXRlWzE2ICsgNF1bRDNEU0FNUF9ETUFQT0ZGU0VUICsgMV07Ci0KLQkJYm9vbCBzdHJlYW1Tb3VyY2VDYXB0dXJlZFtNQVhfVkVSVEVYX0lOUFVUU107Ci0JCXN0cnVjdCBTdHJlYW1Tb3VyY2UKLQkJewotCQkJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICp2ZXJ0ZXhCdWZmZXI7Ci0JCQl1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCQkJdW5zaWduZWQgaW50IHN0cmlkZTsKLQkJfTsKLQkJU3RyZWFtU291cmNlIHN0cmVhbVNvdXJjZVtNQVhfVkVSVEVYX0lOUFVUU107Ci0KLQkJYm9vbCBzdHJlYW1Tb3VyY2VGcmVxdWVuY3lDYXB0dXJlZFtNQVhfVkVSVEVYX0lOUFVUU107Ci0JCXVuc2lnbmVkIGludCBzdHJlYW1Tb3VyY2VGcmVxdWVuY3lbTUFYX1ZFUlRFWF9JTlBVVFNdOwotCi0JCWJvb2wgdGV4dHVyZUNhcHR1cmVkWzE2ICsgNF07Ci0JCURpcmVjdDNEQmFzZVRleHR1cmU5ICp0ZXh0dXJlWzE2ICsgNF07Ci0KLQkJYm9vbCB0cmFuc2Zvcm1DYXB0dXJlZFs1MTJdOwotCQlEM0RNQVRSSVggdHJhbnNmb3JtWzUxMl07Ci0KLQkJYm9vbCBtYXRlcmlhbENhcHR1cmVkOwotCQlEM0RNQVRFUklBTDkgbWF0ZXJpYWw7Ci0KLQkJYm9vbCBsaWdodENhcHR1cmVkWzhdOyAgIC8vIEZJWE1FOiBVbmxpbWl0ZWQgaW5kZXgKLQkJRDNETElHSFQ5IGxpZ2h0WzhdOwotCi0JCWJvb2wgbGlnaHRFbmFibGVDYXB0dXJlZFs4XTsgICAvLyBGSVhNRTogVW5saW1pdGVkIGluZGV4Ci0JCWludCBsaWdodEVuYWJsZVN0YXRlWzhdOwotCi0JCWJvb2wgcGl4ZWxTaGFkZXJDYXB0dXJlZDsKLQkJRGlyZWN0M0RQaXhlbFNoYWRlcjkgKnBpeGVsU2hhZGVyOwotCi0JCWJvb2wgdmVydGV4U2hhZGVyQ2FwdHVyZWQ7Ci0JCURpcmVjdDNEVmVydGV4U2hhZGVyOSAqdmVydGV4U2hhZGVyOwotCi0JCWJvb2wgdmlld3BvcnRDYXB0dXJlZDsKLQkJRDNEVklFV1BPUlQ5IHZpZXdwb3J0OwotCi0JCWZsb2F0IHBpeGVsU2hhZGVyQ29uc3RhbnRGW01BWF9QSVhFTF9TSEFERVJfQ09OU1RdWzRdOwotCQlpbnQgcGl4ZWxTaGFkZXJDb25zdGFudElbMTZdWzRdOwotCQlpbnQgcGl4ZWxTaGFkZXJDb25zdGFudEJbMTZdOwotCi0JCWZsb2F0IHZlcnRleFNoYWRlckNvbnN0YW50RltNQVhfVkVSVEVYX1NIQURFUl9DT05TVF1bNF07Ci0JCWludCB2ZXJ0ZXhTaGFkZXJDb25zdGFudElbMTZdWzRdOwotCQlpbnQgdmVydGV4U2hhZGVyQ29uc3RhbnRCWzE2XTsKLQotCQlib29sIGNsaXBQbGFuZUNhcHR1cmVkWzZdOwotCQlmbG9hdCBjbGlwUGxhbmVbNl1bNF07Ci0KLQkJYm9vbCBzY2lzc29yUmVjdENhcHR1cmVkOwotCQlSRUNUIHNjaXNzb3JSZWN0OwotCi0JCWJvb2wgcGFsZXR0ZU51bWJlckNhcHR1cmVkOwotCQl1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcjsKLQotCQl2b2lkIGNsZWFyKCk7Ci0JfTsKLX0KLQotI2VuZGlmICAgLy8gRDNEOV9EaXJlY3QzRFN0YXRlQmxvY2s5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RTdXJmYWNlOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRFN1cmZhY2U5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmYTNhOC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFN1cmZhY2U5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RTdXJmYWNlOS5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRERldmljZTkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEQmFzZVRleHR1cmU5LmhwcCIKLSNpbmNsdWRlICJDYXBhYmlsaXRpZXMuaHBwIgotI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotZXh0ZXJuIGJvb2wgcXVhZExheW91dEVuYWJsZWQ7Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0Jc3c6OlJlc291cmNlICpnZXRQYXJlbnRSZXNvdXJjZShVbmtub3duICpjb250YWluZXIpCi0JewotCQlEaXJlY3QzREJhc2VUZXh0dXJlOSAqYmFzZVRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RCYXNlVGV4dHVyZTkqPihjb250YWluZXIpOwotCi0JCWlmKGJhc2VUZXh0dXJlKQotCQl7Ci0JCQlyZXR1cm4gYmFzZVRleHR1cmUtPmdldFJlc291cmNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpbnQgc2FtcGxlQ291bnQoRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgdW5zaWduZWQgaW50IHF1YWxpdHkpCi0JewotCQlpZihtdWx0aVNhbXBsZSA9PSBEM0RNVUxUSVNBTVBMRV9OT05NQVNLQUJMRSkKLQkJewotCQkJc3dpdGNoKHF1YWxpdHkpCi0JCQl7Ci0JCQljYXNlIDA6IHJldHVybiAyOwotCQkJY2FzZSAxOiByZXR1cm4gNDsKLQkJCWNhc2UgMjogcmV0dXJuIDg7Ci0JCQljYXNlIDM6IHJldHVybiAxNjsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG11bHRpU2FtcGxlID09IEQzRE1VTFRJU0FNUExFXzJfU0FNUExFUykKLQkJewotCQkJcmV0dXJuIDI7Ci0JCX0KLQkJZWxzZSBpZihtdWx0aVNhbXBsZSA9PSBEM0RNVUxUSVNBTVBMRV80X1NBTVBMRVMpCi0JCXsKLQkJCXJldHVybiA0OwotCQl9Ci0JCWVsc2UgaWYobXVsdGlTYW1wbGUgPT0gRDNETVVMVElTQU1QTEVfOF9TQU1QTEVTKQotCQl7Ci0JCQlyZXR1cm4gODsKLQkJfQotCQllbHNlIGlmKG11bHRpU2FtcGxlID09IEQzRE1VTFRJU0FNUExFXzE2X1NBTVBMRVMpCi0JCXsKLQkJCXJldHVybiAxNjsKLQkJfQotCi0JCXJldHVybiAxOwotCX0KLQotCWJvb2wgaXNMb2NrYWJsZShEM0RQT09MIHBvb2wsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIGJvb2wgbG9ja2FibGVPdmVycmlkZSkKLQl7Ci0JCXJldHVybiAocG9vbCAhPSBEM0RQT09MX0RFRkFVTFQpIHx8ICh1c2FnZSAmIEQzRFVTQUdFX0RZTkFNSUMpIHx8IGxvY2thYmxlT3ZlcnJpZGU7Ci0JfQotCi0JRGlyZWN0M0RTdXJmYWNlOTo6RGlyZWN0M0RTdXJmYWNlOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgVW5rbm93biAqY29udGFpbmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgdW5zaWduZWQgaW50IHF1YWxpdHksIGJvb2wgbG9ja2FibGVPdmVycmlkZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKLQkJOiBEaXJlY3QzRFJlc291cmNlOShkZXZpY2UsIEQzRFJUWVBFX1NVUkZBQ0UsIHBvb2wsIG1lbW9yeVVzYWdlKHdpZHRoLCBoZWlnaHQsIG11bHRpU2FtcGxlLCBxdWFsaXR5LCBmb3JtYXQpKSwgU3VyZmFjZShnZXRQYXJlbnRSZXNvdXJjZShjb250YWluZXIpLCB3aWR0aCwgaGVpZ2h0LCAxLCAwLCBzYW1wbGVDb3VudChtdWx0aVNhbXBsZSwgcXVhbGl0eSksIHRyYW5zbGF0ZUZvcm1hdChmb3JtYXQpLCBpc0xvY2thYmxlKHBvb2wsIHVzYWdlLCBsb2NrYWJsZU92ZXJyaWRlKSwgKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKSB8fCAodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpKSwgY29udGFpbmVyKGNvbnRhaW5lciksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGZvcm1hdChmb3JtYXQpLCBwb29sKHBvb2wpLCBtdWx0aVNhbXBsZShtdWx0aVNhbXBsZSksIHF1YWxpdHkocXVhbGl0eSksIGxvY2thYmxlKGlzTG9ja2FibGUocG9vbCwgdXNhZ2UsIGxvY2thYmxlT3ZlcnJpZGUpKSwgdXNhZ2UodXNhZ2UpCi0JewotCQlwYXJlbnRUZXh0dXJlID0gZHluYW1pY19jYXN0PERpcmVjdDNEQmFzZVRleHR1cmU5Kj4oY29udGFpbmVyKTsKLQl9Ci0KLQlEaXJlY3QzRFN1cmZhY2U5Ojp+RGlyZWN0M0RTdXJmYWNlOSgpCi0JewotCX0KLQotCXZvaWQgKkRpcmVjdDNEU3VyZmFjZTk6OmxvY2tJbnRlcm5hbChpbnQgeCwgaW50IHksIGludCB6LCBzdzo6TG9jayBsb2NrLCBzdzo6QWNjZXNzb3IgY2xpZW50KQotCXsKLQkJcmV0dXJuIFN1cmZhY2U6OmxvY2tJbnRlcm5hbCh4LCB5LCB6LCBsb2NrLCBjbGllbnQpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdXJmYWNlOTo6dW5sb2NrSW50ZXJuYWwoKQotCXsKLQkJU3VyZmFjZTo6dW5sb2NrSW50ZXJuYWwoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEU3VyZmFjZTkgfHwKLQkJICAgaWlkID09IElJRF9JRGlyZWN0M0RSZXNvdXJjZTkgfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3VyZmFjZTk6OkFkZFJlZigpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJaWYocGFyZW50VGV4dHVyZSkKLQkJewotCQkJcmV0dXJuIHBhcmVudFRleHR1cmUtPkFkZFJlZigpOwotCQl9Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpBZGRSZWYoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3VyZmFjZTk6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCWlmKHBhcmVudFRleHR1cmUpCi0JCXsKLQkJCXJldHVybiBwYXJlbnRUZXh0dXJlLT5SZWxlYXNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTk6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RTdXJmYWNlOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RTdXJmYWNlOTo6UHJlTG9hZCgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJRGlyZWN0M0RSZXNvdXJjZTk6OlByZUxvYWQoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTk6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFN1cmZhY2U5OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTdXJmYWNlOTo6R2V0UHJpb3JpdHkoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0UHJpb3JpdHkoKTsKLQl9Ci0KLQlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RTdXJmYWNlOTo6R2V0VHlwZSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRUeXBlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN1cmZhY2U5OjpHZXREQyhIREMgKmRldmljZUNvbnRleHQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRldmljZUNvbnRleHQpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN1cmZhY2U5OjpSZWxlYXNlREMoSERDIGRldmljZUNvbnRleHQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJVU5JTVBMRU1FTlRFRCgpOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN1cmZhY2U5OjpMb2NrUmVjdChEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCJEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCA9IDB4JTAuOHAsIGNvbnN0IFJFQ1QgKnJlY3QgPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gJWQiLCBsb2NrZWRSZWN0LCByZWN0LCBmbGFncyk7Ci0KLQkJaWYoIWxvY2tlZFJlY3QpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJbG9ja2VkUmVjdC0+UGl0Y2ggPSAwOwotCQlsb2NrZWRSZWN0LT5wQml0cyA9IDA7Ci0KLQkJaWYoIWxvY2thYmxlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWxvY2tlZFJlY3QtPlBpdGNoID0gZ2V0RXh0ZXJuYWxQaXRjaEIoKTsKLQotCQlzdzo6TG9jayBsb2NrID0gc3c6OkxPQ0tfUkVBRFdSSVRFOwotCi0JCWlmKGZsYWdzICYgRDNETE9DS19ESVNDQVJEKQotCQl7Ci0JCQlsb2NrID0gc3c6OkxPQ0tfRElTQ0FSRDsKLQkJfQotCi0JCWlmKGZsYWdzICYgRDNETE9DS19SRUFET05MWSkKLQkJewotCQkJbG9jayA9IHN3OjpMT0NLX1JFQURPTkxZOwotCQl9Ci0KLQkJaWYocmVjdCkKLQkJewotCQkJbG9ja2VkUmVjdC0+cEJpdHMgPSBsb2NrRXh0ZXJuYWwocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCAwLCBsb2NrLCBzdzo6UFVCTElDKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWxvY2tlZFJlY3QtPnBCaXRzID0gbG9ja0V4dGVybmFsKDAsIDAsIDAsIGxvY2ssIHN3OjpQVUJMSUMpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTk6OlVubG9ja1JlY3QoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXVubG9ja0V4dGVybmFsKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTk6OkdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighY29udGFpbmVyKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWxvbmcgcmVzdWx0ID0gdGhpcy0+Y29udGFpbmVyLT5RdWVyeUludGVyZmFjZShpaWQsIGNvbnRhaW5lcik7Ci0KLQkJaWYocmVzdWx0ID09IFNfT0spCi0JCXsKLQkJCXJldHVybiBEM0RfT0s7Ci0JCX0KLQotCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3VyZmFjZTk6OkdldERlc2MoRDNEU1VSRkFDRV9ERVNDICpkZXNjcmlwdGlvbikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighZGVzY3JpcHRpb24pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJZGVzY3JpcHRpb24tPkZvcm1hdCA9IGZvcm1hdDsKLQkJZGVzY3JpcHRpb24tPlBvb2wgPSBwb29sOwotCQlkZXNjcmlwdGlvbi0+VHlwZSA9IEQzRFJUWVBFX1NVUkZBQ0U7Ci0JCWRlc2NyaXB0aW9uLT5IZWlnaHQgPSBoZWlnaHQ7Ci0JCWRlc2NyaXB0aW9uLT5XaWR0aCA9IHdpZHRoOwotCQlkZXNjcmlwdGlvbi0+TXVsdGlTYW1wbGVUeXBlID0gbXVsdGlTYW1wbGU7Ci0JCWRlc2NyaXB0aW9uLT5NdWx0aVNhbXBsZVF1YWxpdHkgPSBxdWFsaXR5OwotCQlkZXNjcmlwdGlvbi0+VXNhZ2UgPSB1c2FnZTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCXN3OjpGb3JtYXQgRGlyZWN0M0RTdXJmYWNlOTo6dHJhbnNsYXRlRm9ybWF0KEQzREZPUk1BVCBmb3JtYXQpCi0JewotCQlzd2l0Y2goZm9ybWF0KQotCQl7Ci0JCWNhc2UgRDNERk1UX05VTEw6CQkJcmV0dXJuIHN3OjpGT1JNQVRfTlVMTDsKLQkJY2FzZSBEM0RGTVRfRFhUMToJCQlyZXR1cm4gc3c6OkZPUk1BVF9EWFQxOwotCQljYXNlIEQzREZNVF9EWFQyOgkJCXJldHVybiBzdzo6Rk9STUFUX0RYVDM7Ci0JCWNhc2UgRDNERk1UX0RYVDM6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRFhUMzsKLQkJY2FzZSBEM0RGTVRfRFhUNDoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EWFQ1OwotCQljYXNlIEQzREZNVF9EWFQ1OgkJCXJldHVybiBzdzo6Rk9STUFUX0RYVDU7Ci0JCWNhc2UgRDNERk1UX0FUSTE6CQkJcmV0dXJuIHN3OjpGT1JNQVRfQVRJMTsKLQkJY2FzZSBEM0RGTVRfQVRJMjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9BVEkyOwotCQljYXNlIEQzREZNVF9SM0czQjI6CQkJcmV0dXJuIHN3OjpGT1JNQVRfUjNHM0IyOwotCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCXJldHVybiBzdzo6Rk9STUFUX0E4UjNHM0IyOwotCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCXJldHVybiBzdzo6Rk9STUFUX1g0UjRHNEI0OwotCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCXJldHVybiBzdzo6Rk9STUFUX0E0UjRHNEI0OwotCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCXJldHVybiBzdzo6Rk9STUFUX0E4UjhHOEI4OwotCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCXJldHVybiBzdzo6Rk9STUFUX0E4QjhHOFI4OwotCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRzE2UjE2OwotCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJcmV0dXJuIHN3OjpGT1JNQVRfQTJSMTBHMTBCMTA7Ci0JCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglyZXR1cm4gc3c6OkZPUk1BVF9BMkIxMEcxMFIxMDsKLQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglyZXR1cm4gc3c6OkZPUk1BVF9BMTZCMTZHMTZSMTY7Ci0JCWNhc2UgRDNERk1UX1A4OgkJCQlyZXR1cm4gc3c6OkZPUk1BVF9QODsKLQkJY2FzZSBEM0RGTVRfQThQODoJCQlyZXR1cm4gc3c6OkZPUk1BVF9BOFA4OwotCQljYXNlIEQzREZNVF9BODoJCQkJcmV0dXJuIHN3OjpGT1JNQVRfQTg7Ci0JCWNhc2UgRDNERk1UX1I1RzZCNToJCQlyZXR1cm4gc3c6OkZPUk1BVF9SNUc2QjU7Ci0JCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJcmV0dXJuIHN3OjpGT1JNQVRfWDFSNUc1QjU7Ci0JCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJcmV0dXJuIHN3OjpGT1JNQVRfQTFSNUc1QjU7Ci0JCWNhc2UgRDNERk1UX1I4RzhCODoJCQlyZXR1cm4gc3c6OkZPUk1BVF9SOEc4Qjg7Ci0JCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJcmV0dXJuIHN3OjpGT1JNQVRfWDhSOEc4Qjg7Ci0JCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJcmV0dXJuIHN3OjpGT1JNQVRfWDhCOEc4Ujg7Ci0JCWNhc2UgRDNERk1UX1Y4VTg6CQkJcmV0dXJuIHN3OjpGT1JNQVRfVjhVODsKLQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCXJldHVybiBzdzo6Rk9STUFUX0w2VjVVNTsKLQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQlyZXR1cm4gc3c6OkZPUk1BVF9ROFc4VjhVODsKLQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlyZXR1cm4gc3c6OkZPUk1BVF9YOEw4VjhVODsKLQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CXJldHVybiBzdzo6Rk9STUFUX0EyVzEwVjEwVTEwOwotCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJcmV0dXJuIHN3OjpGT1JNQVRfVjE2VTE2OwotCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CXJldHVybiBzdzo6Rk9STUFUX1ExNlcxNlYxNlUxNjsKLQkJY2FzZSBEM0RGTVRfTDg6CQkJCXJldHVybiBzdzo6Rk9STUFUX0w4OwotCQljYXNlIEQzREZNVF9BNEw0OgkJCXJldHVybiBzdzo6Rk9STUFUX0E0TDQ7Ci0JCWNhc2UgRDNERk1UX0wxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9MMTY7Ci0JCWNhc2UgRDNERk1UX0E4TDg6CQkJcmV0dXJuIHN3OjpGT1JNQVRfQThMODsKLQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9SMTZGOwotCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJcmV0dXJuIHN3OjpGT1JNQVRfRzE2UjE2RjsKLQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJcmV0dXJuIHN3OjpGT1JNQVRfQTE2QjE2RzE2UjE2RjsKLQkJY2FzZSBEM0RGTVRfUjMyRjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9SMzJGOwotCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJcmV0dXJuIHN3OjpGT1JNQVRfRzMyUjMyRjsKLQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJcmV0dXJuIHN3OjpGT1JNQVRfQTMyQjMyRzMyUjMyRjsKLQkJY2FzZSBEM0RGTVRfRDE2OgkJCXJldHVybiBzdzo6Rk9STUFUX0QxNjsKLQkJY2FzZSBEM0RGTVRfRDMyOgkJCXJldHVybiBzdzo6Rk9STUFUX0QzMjsKLQkJY2FzZSBEM0RGTVRfRDI0WDg6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRDI0WDg7Ci0JCWNhc2UgRDNERk1UX0QyNFM4OgkJCXJldHVybiBzdzo6Rk9STUFUX0QyNFM4OwotCQljYXNlIEQzREZNVF9EMjRGUzg6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRDI0RlM4OwotCQljYXNlIEQzREZNVF9EMzJGX0xPQ0tBQkxFOglyZXR1cm4gc3c6OkZPUk1BVF9EMzJGX0xPQ0tBQkxFOwotCQljYXNlIEQzREZNVF9ERjI0OgkJCXJldHVybiBzdzo6Rk9STUFUX0RGMjRTODsKLQkJY2FzZSBEM0RGTVRfREYxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9ERjE2Uzg7Ci0JCWNhc2UgRDNERk1UX0lOVFo6CQkJcmV0dXJuIHN3OjpGT1JNQVRfSU5UWjsKLQkJZGVmYXVsdDoKLQkJCUFTU0VSVChmYWxzZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3c6OkZPUk1BVF9OVUxMOwotCX0KLQotCWludCBEaXJlY3QzRFN1cmZhY2U5OjpieXRlcyhEM0RGT1JNQVQgZm9ybWF0KQotCXsKLQkJcmV0dXJuIFN1cmZhY2U6OmJ5dGVzKHRyYW5zbGF0ZUZvcm1hdChmb3JtYXQpKTsKLQl9Ci0KLQl1bnNpZ25lZCBpbnQgRGlyZWN0M0RTdXJmYWNlOTo6bWVtb3J5VXNhZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCB1bnNpZ25lZCBpbnQgcXVhbGl0eSwgRDNERk9STUFUIGZvcm1hdCkKLQl7Ci0JCXJldHVybiBTdXJmYWNlOjpzaXplKHdpZHRoLCBoZWlnaHQsIDEsIDAsIHNhbXBsZUNvdW50KG11bHRpU2FtcGxlLCBxdWFsaXR5KSwgdHJhbnNsYXRlRm9ybWF0KGZvcm1hdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEU3VyZmFjZTkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RTdXJmYWNlOS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWY0ODEuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RTdXJmYWNlOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0RTdXJmYWNlOV9ocHAKLSNkZWZpbmUgRDNEOV9EaXJlY3QzRFN1cmZhY2U5X2hwcAotCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTkuaHBwIgotCi0jaW5jbHVkZSAiU3VyZmFjZS5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q5Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JY2xhc3MgRGlyZWN0M0RCYXNlVGV4dHVyZTk7Ci0KLQljbGFzcyBEaXJlY3QzRFN1cmZhY2U5IDogcHVibGljIElEaXJlY3QzRFN1cmZhY2U5LCBwdWJsaWMgRGlyZWN0M0RSZXNvdXJjZTksIHB1YmxpYyBzdzo6U3VyZmFjZQotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEU3VyZmFjZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIFVua25vd24gKmNvbnRhaW5lciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGludCBxdWFsaXR5LCBib29sIGxvY2thYmxlT3ZlcnJpZGUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpOwotCi0JCX5EaXJlY3QzRFN1cmZhY2U5KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gU3VyZmFjZSBtZXRob2RzCi0JCXZvaWQgKmxvY2tJbnRlcm5hbChpbnQgeCwgaW50IHksIGludCB6LCBzdzo6TG9jayBsb2NrLCBzdzo6QWNjZXNzb3IgY2xpZW50KSBvdmVycmlkZTsKLQkJdm9pZCB1bmxvY2tJbnRlcm5hbCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFJlc291cmNlOSBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKSBvdmVycmlkZTsKLQkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEU3VyZmFjZTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREQyhIREMgKmRldmljZUNvbnRleHQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBSZWxlYXNlREMoSERDIGRldmljZUNvbnRleHQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBMb2NrUmVjdChEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBGbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFVubG9ja1JlY3QoKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0Q29udGFpbmVyKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqY29udGFpbmVyKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVzYyhEM0RTVVJGQUNFX0RFU0MgKmRlc2MpIG92ZXJyaWRlOwotCi0JCS8vIEludGVybmFsIG1ldGhvZHMKLQkJc3RhdGljIHN3OjpGb3JtYXQgdHJhbnNsYXRlRm9ybWF0KEQzREZPUk1BVCBmb3JtYXQpOwotCQlzdGF0aWMgaW50IGJ5dGVzKEQzREZPUk1BVCBmb3JtYXQpOwotCi0JcHJpdmF0ZToKLQkJc3RhdGljIHVuc2lnbmVkIGludCBtZW1vcnlVc2FnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIHVuc2lnbmVkIGludCBxdWFsaXR5LCBEM0RGT1JNQVQgZm9ybWF0KTsKLQotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCVVua25vd24gKmNvbnN0IGNvbnRhaW5lcjsKLQkJY29uc3QgaW50IHdpZHRoOwotCQljb25zdCBpbnQgaGVpZ2h0OwotCQljb25zdCBEM0RGT1JNQVQgZm9ybWF0OwotCQljb25zdCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlOwotCQljb25zdCB1bnNpZ25lZCBpbnQgcXVhbGl0eTsKLQkJY29uc3QgRDNEUE9PTCBwb29sOwotCQljb25zdCBib29sIGxvY2thYmxlOwotCQljb25zdCB1bnNpZ25lZCBsb25nIHVzYWdlOwotCi0JCURpcmVjdDNEQmFzZVRleHR1cmU5ICpwYXJlbnRUZXh0dXJlOwotCX07Ci19Ci0KLSNlbmRpZiAvLyBEM0Q5X0RpcmVjdDNEU3VyZmFjZTlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFN3YXBDaGFpbjkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RTd2FwQ2hhaW45LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0NmE5Zi4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFN3YXBDaGFpbjkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRFN3YXBDaGFpbjkuaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKLSNpbmNsdWRlICJSZW5kZXJlci5ocHAiCi0jaW5jbHVkZSAiVGltZXIuaHBwIgotI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKLSNpbmNsdWRlICJDb25maWd1cmF0b3IuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgIkZyYW1lQnVmZmVyREQuaHBwIgotI2luY2x1ZGUgIkZyYW1lQnVmZmVyR0RJLmhwcCIKLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlEaXJlY3QzRFN3YXBDaGFpbjk6OkRpcmVjdDNEU3dhcENoYWluOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykgOiBkZXZpY2UoZGV2aWNlKSwgcHJlc2VudFBhcmFtZXRlcnMoKnByZXNlbnRQYXJhbWV0ZXJzKQotCXsKLQkJZnJhbWVCdWZmZXIgPSAwOwotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0JCXsKLQkJCWJhY2tCdWZmZXJbaV0gPSAwOwotCQl9Ci0KLQkJcmVzZXQocHJlc2VudFBhcmFtZXRlcnMpOwotCX0KLQotCURpcmVjdDNEU3dhcENoYWluOTo6fkRpcmVjdDNEU3dhcENoYWluOSgpCi0JewotCQlyZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEU3dhcENoYWluOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTd2FwQ2hhaW45OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3dhcENoYWluOTo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3dhcENoYWluOTo6UHJlc2VudChjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgSFdORCBkZXN0V2luZG93T3ZlcnJpZGUsIGNvbnN0IFJHTkRBVEEgKmRpcnR5UmVnaW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCSNpZiBQRVJGX1BST0ZJTEUKLQkJCXByb2ZpbGVyLm5leHRGcmFtZSgpOwotCQkjZW5kaWYKLQotCQkjaWYgUEVSRl9IVUQKLQkJCXN3OjpSZW5kZXJlciAqcmVuZGVyZXIgPSBkZXZpY2UtPnJlbmRlcmVyOwotCi0JCQlzdGF0aWMgaW50NjRfdCBmcmFtZSA9IHN3OjpUaW1lcjo6dGlja3MoKTsKLQotCQkJaW50NjRfdCBmcmFtZVRpbWUgPSBzdzo6VGltZXI6OnRpY2tzKCkgLSBmcmFtZTsKLQkJCWZyYW1lID0gc3c6OlRpbWVyOjp0aWNrcygpOwotCi0JCQlpZihmcmFtZVRpbWUgPiAwKQotCQkJewotCQkJCXVuc2lnbmVkIGludCAqZnJhbWVCdWZmZXIgPSAodW5zaWduZWQgaW50Kilsb2NrQmFja0J1ZmZlcigwKTsgICAvLyBGSVhNRTogRG9uJ3QgYXNzdW1lIEE4UjhHOEI4IG1vZGUKLQkJCQl1bnNpZ25lZCBpbnQgc3RyaWRlID0gYmFja0J1ZmZlclswXS0+Z2V0SW50ZXJuYWxQaXRjaFAoKTsKLQotCQkJCWludCB0aHJlYWQ7Ci0JCQkJZm9yKHRocmVhZCA9IDA7IHRocmVhZCA8IHJlbmRlcmVyLT5nZXRUaHJlYWRDb3VudCgpOyB0aHJlYWQrKykKLQkJCQl7Ci0JCQkJCWludDY0X3QgZHJhd1RpbWUgPSByZW5kZXJlci0+Z2V0VmVydGV4VGltZSh0aHJlYWQpICsgcmVuZGVyZXItPmdldFNldHVwVGltZSh0aHJlYWQpICsgcmVuZGVyZXItPmdldFBpeGVsVGltZSh0aHJlYWQpOwotCi0JCQkJCWludCB2ZXJ0ZXhQZXJjZW50YWdlID0gc3c6OmNsYW1wKChpbnQpKDEwMCAqIHJlbmRlcmVyLT5nZXRWZXJ0ZXhUaW1lKHRocmVhZCkgLyBmcmFtZVRpbWUpLCAwLCAxMDApOwotCQkJCQlpbnQgc2V0dXBQZXJjZW50YWdlID0gc3c6OmNsYW1wKChpbnQpKDEwMCAqIHJlbmRlcmVyLT5nZXRTZXR1cFRpbWUodGhyZWFkKSAvIGZyYW1lVGltZSksIDAsIDEwMCk7Ci0JCQkJCWludCBwaXhlbFBlcmNlbnRhZ2UgPSBzdzo6Y2xhbXAoKGludCkoMTAwICogcmVuZGVyZXItPmdldFBpeGVsVGltZSh0aHJlYWQpIC8gZnJhbWVUaW1lKSwgMCwgMTAwKTsKLQotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCi0JCQkJCXsKLQkJCQkJCWZyYW1lQnVmZmVyW3RocmVhZCAqIHN0cmlkZSArIGldID0gMHgwMDAwMDAwMDsKLQkJCQkJfQotCi0JCQkJCXVuc2lnbmVkIGludCAqYnVmZmVyID0gZnJhbWVCdWZmZXI7Ci0KLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHZlcnRleFBlcmNlbnRhZ2U7IGkrKykKLQkJCQkJewotCQkJCQkJYnVmZmVyW3RocmVhZCAqIHN0cmlkZV0gPSAweDAwMDAwMEZGOwotCQkJCQkJYnVmZmVyKys7Ci0JCQkJCX0KLQotCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgc2V0dXBQZXJjZW50YWdlOyBpKyspCi0JCQkJCXsKLQkJCQkJCWJ1ZmZlclt0aHJlYWQgKiBzdHJpZGVdID0gMHgwMDAwRkYwMDsKLQkJCQkJCWJ1ZmZlcisrOwotCQkJCQl9Ci0KLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHBpeGVsUGVyY2VudGFnZTsgaSsrKQotCQkJCQl7Ci0JCQkJCQlidWZmZXJbdGhyZWFkICogc3RyaWRlXSA9IDB4MDBGRjAwMDA7Ci0JCQkJCQlidWZmZXIrKzsKLQkJCQkJfQotCi0JCQkJCWZyYW1lQnVmZmVyW3RocmVhZCAqIHN0cmlkZSArIDEwMF0gPSAweDAwRkZGRkZGOwotCQkJCX0KLQotCQkJCWZvcihpbnQgaSA9IDA7IGkgPD0gMTAwOyBpKyspCi0JCQkJewotCQkJCQlmcmFtZUJ1ZmZlclt0aHJlYWQgKiBzdHJpZGUgKyBpXSA9IDB4MDBGRkZGRkY7Ci0JCQkJfQotCi0JCQkJdW5sb2NrQmFja0J1ZmZlcigwKTsKLQkJCX0KLQotCQkJcmVuZGVyZXItPnJlc2V0VGltZXJzKCk7Ci0JCSNlbmRpZgotCi0JCUhXTkQgd2luZG93ID0gZGVzdFdpbmRvd092ZXJyaWRlID8gZGVzdFdpbmRvd092ZXJyaWRlIDogcHJlc2VudFBhcmFtZXRlcnMuaERldmljZVdpbmRvdzsKLQotCQlQT0lOVCBwb2ludDsKLQkJR2V0Q3Vyc29yUG9zKCZwb2ludCk7Ci0JCVNjcmVlblRvQ2xpZW50KHdpbmRvdywgJnBvaW50KTsKLQotCQlmcmFtZUJ1ZmZlci0+c2V0Q3Vyc29yUG9zaXRpb24ocG9pbnQueCwgcG9pbnQueSk7Ci0KLQkJaWYoIXNvdXJjZVJlY3QgJiYgIWRlc3RSZWN0KSAgIC8vIEZJWE1FOiBNb3JlIGNhc2VzPwotCQl7Ci0JCQlmcmFtZUJ1ZmZlci0+ZmxpcCh3aW5kb3csIGJhY2tCdWZmZXJbMF0pOwotCQl9Ci0JCWVsc2UgICAvLyBGSVhNRTogQ2hlY2sgZm9yIFNXQVBFRkZFQ1RfQ09QWQotCQl7Ci0JCQlzdzo6UmVjdCBzUmVjdCgwLCAwLCAwLCAwKTsKLQkJCXN3OjpSZWN0IGRSZWN0KDAsIDAsIDAsIDApOwotCi0JCQlpZihzb3VyY2VSZWN0KQotCQkJewotCQkJCXNSZWN0LngwID0gc291cmNlUmVjdC0+bGVmdDsKLQkJCQlzUmVjdC55MCA9IHNvdXJjZVJlY3QtPnRvcDsKLQkJCQlzUmVjdC54MSA9IHNvdXJjZVJlY3QtPnJpZ2h0OwotCQkJCXNSZWN0LnkxID0gc291cmNlUmVjdC0+Ym90dG9tOwotCQkJfQotCi0JCQlpZihkZXN0UmVjdCkKLQkJCXsKLQkJCQlkUmVjdC54MCA9IGRlc3RSZWN0LT5sZWZ0OwotCQkJCWRSZWN0LnkwID0gZGVzdFJlY3QtPnRvcDsKLQkJCQlkUmVjdC54MSA9IGRlc3RSZWN0LT5yaWdodDsKLQkJCQlkUmVjdC55MSA9IGRlc3RSZWN0LT5ib3R0b207Ci0JCQl9Ci0KLQkJCWZyYW1lQnVmZmVyLT5ibGl0KHdpbmRvdywgYmFja0J1ZmZlclswXSwgc291cmNlUmVjdCA/ICZzUmVjdCA6IG51bGxwdHIsIGRlc3RSZWN0ID8gJmRSZWN0IDogbnVsbHB0cik7Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RTd2FwQ2hhaW45OjpHZXRGcm9udEJ1ZmZlckRhdGEoSURpcmVjdDNEU3VyZmFjZTkgKmRlc3RTdXJmYWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXN0U3VyZmFjZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlzdzo6U3VyZmFjZSAqZGVzdCA9IHN0YXRpY19jYXN0PERpcmVjdDNEU3VyZmFjZTkqPihkZXN0U3VyZmFjZSk7Ci0JCXZvaWQgKmJ1ZmZlciA9IGRlc3QtPmxvY2tFeHRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19XUklURU9OTFksIHN3OjpQUklWQVRFKTsKLQotCQlmcmFtZUJ1ZmZlci0+c2NyZWVuc2hvdChidWZmZXIpOwotCi0JCWRlc3QtPnVubG9ja0V4dGVybmFsKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3dhcENoYWluOTo6R2V0QmFja0J1ZmZlcih1bnNpZ25lZCBpbnQgaW5kZXgsIEQzREJBQ0tCVUZGRVJfVFlQRSB0eXBlLCBJRGlyZWN0M0RTdXJmYWNlOSAqKmJhY2tCdWZmZXIpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWJhY2tCdWZmZXIvKiB8fCB0eXBlICE9IEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PKi8pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKmJhY2tCdWZmZXIgPSAwOwotCi0JCWlmKGluZGV4ID49IDMgfHwgdGhpcy0+YmFja0J1ZmZlcltpbmRleF0gPT0gMCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQkqYmFja0J1ZmZlciA9IHRoaXMtPmJhY2tCdWZmZXJbaW5kZXhdOwotCQl0aGlzLT5iYWNrQnVmZmVyW2luZGV4XS0+QWRkUmVmKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3dhcENoYWluOTo6R2V0UmFzdGVyU3RhdHVzKEQzRFJBU1RFUl9TVEFUVVMgKnJhc3RlclN0YXR1cykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighcmFzdGVyU3RhdHVzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWJvb2wgaW5WZXJ0aWNhbEJsYW5rOwotCQl1bnNpZ25lZCBpbnQgc2NhbmxpbmU7Ci0JCWJvb2wgc3VwcG9ydGVkID0gZnJhbWVCdWZmZXItPmdldFNjYW5saW5lKGluVmVydGljYWxCbGFuaywgc2NhbmxpbmUpOwotCi0JCWlmKHN1cHBvcnRlZCkKLQkJewotCQkJcmFzdGVyU3RhdHVzLT5JblZCbGFuayA9IGluVmVydGljYWxCbGFuazsKLQkJCXJhc3RlclN0YXR1cy0+U2NhbkxpbmUgPSBzY2FubGluZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3dhcENoYWluOTo6R2V0RGlzcGxheU1vZGUoRDNERElTUExBWU1PREUgKmRpc3BsYXlNb2RlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkaXNwbGF5TW9kZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlkZXZpY2UtPmdldEFkYXB0ZXJEaXNwbGF5TW9kZShEM0RBREFQVEVSX0RFRkFVTFQsIGRpc3BsYXlNb2RlKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RTd2FwQ2hhaW45OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyh0aGlzLT5kZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighZGV2aWNlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXRoaXMtPmRldmljZS0+QWRkUmVmKCk7Ci0JCSpkZXZpY2UgPSB0aGlzLT5kZXZpY2U7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEU3dhcENoYWluOTo6R2V0UHJlc2VudFBhcmFtZXRlcnMoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighcHJlc2VudFBhcmFtZXRlcnMpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJKnByZXNlbnRQYXJhbWV0ZXJzID0gdGhpcy0+cHJlc2VudFBhcmFtZXRlcnM7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3dhcENoYWluOTo6cmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykKLQl7Ci0JCXJlbGVhc2UoKTsKLQotCQlBU1NFUlQocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudCA8PSAzKTsgICAvLyBNYXhpbXVtIG9mIHRocmVlIGJhY2sgYnVmZmVycwotCi0JCWlmKHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPT0gMCkKLQkJewotCQkJcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudCA9IDE7Ci0JCX0KLQotCQlpZihwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckZvcm1hdCA9PSBEM0RGTVRfVU5LTk9XTikKLQkJewotCQkJRDNERElTUExBWU1PREUgZGlzcGxheU1vZGU7Ci0JCQlHZXREaXNwbGF5TW9kZSgmZGlzcGxheU1vZGUpOwotCi0JCQlwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckZvcm1hdCA9IGRpc3BsYXlNb2RlLkZvcm1hdDsKLQkJfQotCi0JCUQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTIGNyZWF0aW9uUGFyYW1ldGVyczsKLQkJZGV2aWNlLT5HZXRDcmVhdGlvblBhcmFtZXRlcnMoJmNyZWF0aW9uUGFyYW1ldGVycyk7Ci0KLQkJSFdORCB3aW5kb3dIYW5kbGUgPSBwcmVzZW50UGFyYW1ldGVycy0+aERldmljZVdpbmRvdyA/IHByZXNlbnRQYXJhbWV0ZXJzLT5oRGV2aWNlV2luZG93IDogY3JlYXRpb25QYXJhbWV0ZXJzLmhGb2N1c1dpbmRvdzsKLQotCQlpZihwcmVzZW50UGFyYW1ldGVycy0+V2luZG93ZWQgJiYgKHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVySGVpZ2h0ID09IDAgfHwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJXaWR0aCA9PSAwKSkKLQkJewotCQkJUkVDVCByZWN0YW5nbGU7Ci0JCQlHZXRDbGllbnRSZWN0KHdpbmRvd0hhbmRsZSwgJnJlY3RhbmdsZSk7Ci0KLQkJCXByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyV2lkdGggPSByZWN0YW5nbGUucmlnaHQgLSByZWN0YW5nbGUubGVmdDsKLQkJCXByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVySGVpZ2h0ID0gcmVjdGFuZ2xlLmJvdHRvbSAtIHJlY3RhbmdsZS50b3A7Ci0JCX0KLQotCQlmcmFtZUJ1ZmZlciA9IGNyZWF0ZUZyYW1lQnVmZmVyV2luKHdpbmRvd0hhbmRsZSwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJXaWR0aCwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQsIHByZXNlbnRQYXJhbWV0ZXJzLT5XaW5kb3dlZCA9PSBGQUxTRSwgdHJ1ZSk7Ci0KLQkJbG9ja2FibGUgPSBwcmVzZW50UGFyYW1ldGVycy0+RmxhZ3MgJiBEM0RQUkVTRU5URkxBR19MT0NLQUJMRV9CQUNLQlVGRkVSOwotCi0JCWJhY2tCdWZmZXJbMF0gPSAwOwotCQliYWNrQnVmZmVyWzFdID0gMDsKLQkJYmFja0J1ZmZlclsyXSA9IDA7Ci0KLQkJZm9yKGludCBpID0gMDsgaSA8IChpbnQpcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudDsgaSsrKQotCQl7Ci0JCQliYWNrQnVmZmVyW2ldID0gbmV3IERpcmVjdDNEU3VyZmFjZTkoZGV2aWNlLCB0aGlzLCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoLCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckhlaWdodCwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJGb3JtYXQsIEQzRFBPT0xfREVGQVVMVCwgcHJlc2VudFBhcmFtZXRlcnMtPk11bHRpU2FtcGxlVHlwZSwgcHJlc2VudFBhcmFtZXRlcnMtPk11bHRpU2FtcGxlUXVhbGl0eSwgbG9ja2FibGUsIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCk7Ci0JCQliYWNrQnVmZmVyW2ldLT5iaW5kKCk7Ci0JCX0KLQotCQl0aGlzLT5wcmVzZW50UGFyYW1ldGVycyA9ICpwcmVzZW50UGFyYW1ldGVyczsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEU3dhcENoYWluOTo6cmVsZWFzZSgpCi0JewotCQlkZWxldGUgZnJhbWVCdWZmZXI7Ci0JCWZyYW1lQnVmZmVyID0gMDsKLQotCQlmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotCQl7Ci0JCQlpZihiYWNrQnVmZmVyW2ldKQotCQkJewotCQkJCWJhY2tCdWZmZXJbaV0tPnVuYmluZCgpOwotCQkJCWJhY2tCdWZmZXJbaV0gPSAwOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjk6OnNldEdhbW1hUmFtcChzdzo6R2FtbWFSYW1wICpnYW1tYVJhbXAsIGJvb2wgY2FsaWJyYXRlKQotCXsKLQkJZnJhbWVCdWZmZXItPnNldEdhbW1hUmFtcChnYW1tYVJhbXAsIGNhbGlicmF0ZSk7Ci0JfQotCi0Jdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjk6OmdldEdhbW1hUmFtcChzdzo6R2FtbWFSYW1wICpnYW1tYVJhbXApCi0JewotCQlmcmFtZUJ1ZmZlci0+Z2V0R2FtbWFSYW1wKGdhbW1hUmFtcCk7Ci0JfQotCi0Jdm9pZCAqRGlyZWN0M0RTd2FwQ2hhaW45Ojpsb2NrQmFja0J1ZmZlcihpbnQgaW5kZXgpCi0JewotCQlyZXR1cm4gYmFja0J1ZmZlcltpbmRleF0tPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19SRUFEV1JJVEUsIHN3OjpQVUJMSUMpOyAgIC8vIEZJWE1FOiBFeHRlcm5hbAotCX0KLQotCXZvaWQgRGlyZWN0M0RTd2FwQ2hhaW45Ojp1bmxvY2tCYWNrQnVmZmVyKGludCBpbmRleCkKLQl7Ci0JCWJhY2tCdWZmZXJbaW5kZXhdLT51bmxvY2tJbnRlcm5hbCgpOyAgIC8vIEZJWE1FOiBFeHRlcm5hbAotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEU3dhcENoYWluOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzRFN3YXBDaGFpbjkuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI2YjNlLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNEU3dhcENoYWluOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0RTd2FwQ2hhaW45X2hwcAotI2RlZmluZSBEM0Q5X0RpcmVjdDNEU3dhcENoYWluOV9ocHAKLQotI2luY2x1ZGUgIlVua25vd24uaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0RTdXJmYWNlOS5ocHAiCi0KLSNpbmNsdWRlICJGcmFtZUJ1ZmZlcldpbi5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q5Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JY2xhc3MgRGlyZWN0M0REZXZpY2U5OwotCi0JY2xhc3MgRGlyZWN0M0RTd2FwQ2hhaW45IDogcHVibGljIElEaXJlY3QzRFN3YXBDaGFpbjksIHB1YmxpYyBVbmtub3duCi0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RTd2FwQ2hhaW45KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKTsKLQotCQl+RGlyZWN0M0RTd2FwQ2hhaW45KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEU3dhcENoYWluOSBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbiwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEZyb250QnVmZmVyRGF0YShJRGlyZWN0M0RTdXJmYWNlOSAqZGVzdFN1cmZhY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRCYWNrQnVmZmVyKHVuc2lnbmVkIGludCBpbmRleCwgRDNEQkFDS0JVRkZFUl9UWVBFIHR5cGUsIElEaXJlY3QzRFN1cmZhY2U5ICoqYmFja0J1ZmZlcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFJhc3RlclN0YXR1cyhEM0RSQVNURVJfU1RBVFVTICpyYXN0ZXJTdGF0dXMpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREaXNwbGF5TW9kZShEM0RESVNQTEFZTU9ERSAqZGlzcGxheU1vZGUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFByZXNlbnRQYXJhbWV0ZXJzKEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpIG92ZXJyaWRlOwotCi0JCS8vIEludGVybmFsIG1ldGhvZHMKLQkJdm9pZCByZXNldChEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKTsKLQotCQl2b2lkIHNldEdhbW1hUmFtcChzdzo6R2FtbWFSYW1wICpnYW1tYVJhbXAsIGJvb2wgY2FsaWJyYXRlKTsKLQkJdm9pZCBnZXRHYW1tYVJhbXAoc3c6OkdhbW1hUmFtcCAqZ2FtbWFSYW1wKTsKLQotCQl2b2lkICpsb2NrQmFja0J1ZmZlcihpbnQgaW5kZXgpOwotCQl2b2lkIHVubG9ja0JhY2tCdWZmZXIoaW50IGluZGV4KTsKLQotCXByaXZhdGU6Ci0JCXZvaWQgcmVsZWFzZSgpOwotCi0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJRGlyZWN0M0REZXZpY2U5ICpjb25zdCBkZXZpY2U7Ci0JCUQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50UGFyYW1ldGVyczsKLQotCQlib29sIGxvY2thYmxlOwotCi0JCXN3OjpGcmFtZUJ1ZmZlcldpbiAqZnJhbWVCdWZmZXI7Ci0KLQlwdWJsaWM6ICAgLy8gRklYTUUKLQkJRGlyZWN0M0RTdXJmYWNlOSAqYmFja0J1ZmZlclszXTsKLQl9OwotfQotCi0jZW5kaWYgLy8gRDNEOV9EaXJlY3QzRFN3YXBDaGFpbjlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFRleHR1cmU5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVGV4dHVyZTkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzlmYmE3Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNEVGV4dHVyZTkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRFRleHR1cmU5LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RTdXJmYWNlOS5ocHAiCi0jaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCURpcmVjdDNEVGV4dHVyZTk6OkRpcmVjdDNEVGV4dHVyZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKSA6IERpcmVjdDNEQmFzZVRleHR1cmU5KGRldmljZSwgRDNEUlRZUEVfVEVYVFVSRSwgZm9ybWF0LCBwb29sLCBsZXZlbHMsIHVzYWdlKSwgd2lkdGgod2lkdGgpLCBoZWlnaHQoaGVpZ2h0KQotCXsKLQkJaWYobGV2ZWxzID09IDApCi0JCXsKLQkJCXRoaXMtPmxldmVscyA9IHN3Ojpsb2cyKHN3OjptYXgoKGludCl3aWR0aCwgKGludCloZWlnaHQsIDEpKSArIDE7Ci0JCX0KLQotCQlmb3IodW5zaWduZWQgaW50IGxldmVsID0gMDsgbGV2ZWwgPCBzdzo6TUlQTUFQX0xFVkVMUzsgbGV2ZWwrKykKLQkJewotCQkJaWYobGV2ZWwgPCB0aGlzLT5sZXZlbHMpCi0JCQl7Ci0JCQkJc3VyZmFjZUxldmVsW2xldmVsXSA9IG5ldyBEaXJlY3QzRFN1cmZhY2U5KGRldmljZSwgdGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwb29sLCBEM0RNVUxUSVNBTVBMRV9OT05FLCAwLCBmYWxzZSwgdXNhZ2UpOwotCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0tPmJpbmQoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlzdXJmYWNlTGV2ZWxbbGV2ZWxdID0gMDsKLQkJCX0KLQotCQkJd2lkdGggPSBzdzo6bWF4KDEsIChpbnQpd2lkdGggLyAyKTsKLQkJCWhlaWdodCA9IHN3OjptYXgoMSwgKGludCloZWlnaHQgLyAyKTsKLQkJfQotCX0KLQotCURpcmVjdDNEVGV4dHVyZTk6On5EaXJlY3QzRFRleHR1cmU5KCkKLQl7Ci0JCWZvcihpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQotCQl7Ci0JCQlpZihzdXJmYWNlTGV2ZWxbbGV2ZWxdKQotCQkJewotCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0tPnVuYmluZCgpOwotCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0gPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFRleHR1cmU5IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEQmFzZVRleHR1cmU5IHx8Ci0JCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U5IHx8Ci0JCSAgIGlpZCA9PSBJSURfSVVua25vd24pCi0JCXsKLQkJCUFkZFJlZigpOwotCQkJKm9iamVjdCA9IHRoaXM7Ci0KLQkJCXJldHVybiBTX09LOwotCQl9Ci0KLQkJKm9iamVjdCA9IDA7Ci0KLQkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTk6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RUZXh0dXJlOTo6UHJlTG9hZCgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlByZUxvYWQoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTk6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIklEaXJlY3QzRERldmljZTkgKipkZXZpY2UgPSAweCUwLjhwIiwgZGV2aWNlKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldERldmljZShkZXZpY2UpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5ID0gJWQiLCBuZXdQcmlvcml0eSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpHZXRQcmlvcml0eSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRQcmlvcml0eSgpOwotCX0KLQotCUQzRFJFU09VUkNFVFlQRSBEaXJlY3QzRFRleHR1cmU5OjpHZXRUeXBlKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFR5cGUoKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEVGV4dHVyZTk6OkdlbmVyYXRlTWlwU3ViTGV2ZWxzKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighKHVzYWdlICYgRDNEVVNBR0VfQVVUT0dFTk1JUE1BUCkgfHwgIXN1cmZhY2VMZXZlbFswXS0+aGFzRGlydHlDb250ZW50cygpKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXNvdXJjZS0+bG9jayhzdzo6UFVCTElDKTsKLQotCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGV2ZWxzIC0gMTsgaSsrKQotCQl7Ci0JCQlkZXZpY2UtPnN0cmV0Y2hSZWN0KHN1cmZhY2VMZXZlbFtpXSwgMCwgc3VyZmFjZUxldmVsW2kgKyAxXSwgMCwgR2V0QXV0b0dlbkZpbHRlclR5cGUoKSk7Ci0JCX0KLQotCQlzdXJmYWNlTGV2ZWxbMF0tPm1hcmtDb250ZW50c0NsZWFuKCk7Ci0KLQkJcmVzb3VyY2UtPnVubG9jaygpOwotCX0KLQotCUQzRFRFWFRVUkVGSUxURVJUWVBFIERpcmVjdDNEVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldEF1dG9HZW5GaWx0ZXJUeXBlKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU5OjpHZXRMZXZlbENvdW50KCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldExldmVsQ291bnQoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVGV4dHVyZTk6OkdldExPRCgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRMT0QoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTk6OlNldEF1dG9HZW5GaWx0ZXJUeXBlKEQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlclR5cGUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyVHlwZSA9ICVkIiwgZmlsdGVyVHlwZSk7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRBdXRvR2VuRmlsdGVyVHlwZShmaWx0ZXJUeXBlKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVGV4dHVyZTk6OlNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBsb25nIG5ld0xPRCA9ICVkIiwgbmV3TE9EKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldExPRChuZXdMT0QpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6R2V0TGV2ZWxEZXNjKHVuc2lnbmVkIGludCBsZXZlbCwgRDNEU1VSRkFDRV9ERVNDICpkZXNjcmlwdGlvbikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGV2ZWwgPSAlZCwgRDNEU1VSRkFDRV9ERVNDICpkZXNjcmlwdGlvbiA9IDB4JTAuOHAiLCBsZXZlbCwgZGVzY3JpcHRpb24pOwotCi0JCWlmKCFkZXNjcmlwdGlvbiB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cmZhY2VMZXZlbFtsZXZlbF0tPkdldERlc2MoZGVzY3JpcHRpb24pOwotCX0KLQotCWxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6TG9ja1JlY3QodW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGV2ZWwgPSAlZCwgRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QgPSAweCUwLjhwLCBjb25zdCBSRUNUICpyZWN0ID0gMHglMC44cCwgdW5zaWduZWQgbG9uZyBmbGFncyA9ICVkIiwgbGV2ZWwsIGxvY2tlZFJlY3QsIHJlY3QsIGZsYWdzKTsKLQotCQlpZighbG9ja2VkUmVjdCB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXN1cmZhY2VMZXZlbFtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cmZhY2VMZXZlbFtsZXZlbF0tPkxvY2tSZWN0KGxvY2tlZFJlY3QsIHJlY3QsIGZsYWdzKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTk6OkdldFN1cmZhY2VMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwsIElEaXJlY3QzRFN1cmZhY2U5ICoqc3VyZmFjZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCJ1bnNpZ25lZCBpbnQgbGV2ZWwgPSAlZCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlID0gMHglMC44cCIsIGxldmVsLCBzdXJmYWNlKTsKLQotCQkqc3VyZmFjZSA9IDA7Ci0KLQkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbbGV2ZWxdKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXN1cmZhY2VMZXZlbFtsZXZlbF0tPkFkZFJlZigpOwotCQkqc3VyZmFjZSA9IHN1cmZhY2VMZXZlbFtsZXZlbF07Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVGV4dHVyZTk6OlVubG9ja1JlY3QodW5zaWduZWQgaW50IGxldmVsKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoInVuc2lnbmVkIGludCBsZXZlbCA9ICVkIiwgbGV2ZWwpOwotCi0JCWlmKGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsW2xldmVsXSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VyZmFjZUxldmVsW2xldmVsXS0+VW5sb2NrUmVjdCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RUZXh0dXJlOTo6QWRkRGlydHlSZWN0KGNvbnN0IFJFQ1QgKmRpcnR5UmVjdCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCS8vCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCURpcmVjdDNEU3VyZmFjZTkgKkRpcmVjdDNEVGV4dHVyZTk6OmdldEludGVybmFsU3VyZmFjZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCkKLQl7Ci0JCXJldHVybiBzdXJmYWNlTGV2ZWxbbGV2ZWxdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEVGV4dHVyZTkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RUZXh0dXJlOS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYmJhNTMuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RUZXh0dXJlOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0RUZXh0dXJlOV9ocHAKLSNkZWZpbmUgRDNEOV9EaXJlY3QzRFRleHR1cmU5X2hwcAotCi0jaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTkuaHBwIgotCi0jaW5jbHVkZSAiQ29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPGQzZDkuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzRFN1cmZhY2U5OwotCi0JY2xhc3MgRGlyZWN0M0RUZXh0dXJlOSA6IHB1YmxpYyBJRGlyZWN0M0RUZXh0dXJlOSwgcHVibGljIERpcmVjdDNEQmFzZVRleHR1cmU5Ci0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RUZXh0dXJlOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpOwotCi0JCX5EaXJlY3QzRFRleHR1cmU5KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEUmVzb3VyY2U5IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpIG92ZXJyaWRlOwotCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RCYXNlVGV4dHVyZTkgbWV0aG9kcwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRBdXRvR2VuRmlsdGVyVHlwZShEM0RURVhUVVJFRklMVEVSVFlQRSBmaWx0ZXJUeXBlKSBvdmVycmlkZTsKLQkJRDNEVEVYVFVSRUZJTFRFUlRZUEUgX19zdGRjYWxsIEdldEF1dG9HZW5GaWx0ZXJUeXBlKCkgb3ZlcnJpZGU7Ci0JCXZvaWQgX19zdGRjYWxsIEdlbmVyYXRlTWlwU3ViTGV2ZWxzKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEVGV4dHVyZTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RTVVJGQUNFX0RFU0MgKmRlc2NyaXB0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0U3VyZmFjZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgTG9ja1JlY3QodW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFVubG9ja1JlY3QodW5zaWduZWQgaW50IGxldmVsKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgQWRkRGlydHlSZWN0KGNvbnN0IFJFQ1QgKmRpcnR5UmVjdCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQlEaXJlY3QzRFN1cmZhY2U5ICpnZXRJbnRlcm5hbFN1cmZhY2VMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpOwotCi0JcHJpdmF0ZToKLQkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycwotCQljb25zdCB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQ7Ci0KLQkJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZUxldmVsW3N3OjpNSVBNQVBfTEVWRUxTXTsKLQl9OwotfQotCi0jZW5kaWYgLy8gRDNEOV9EaXJlY3QzRFRleHR1cmU5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4QnVmZmVyOS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MmRmYjguLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCURpcmVjdDNEVmVydGV4QnVmZmVyOTo6RGlyZWN0M0RWZXJ0ZXhCdWZmZXI5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBsb25nIEZWRiwgRDNEUE9PTCBwb29sKSA6IERpcmVjdDNEUmVzb3VyY2U5KGRldmljZSwgRDNEUlRZUEVfVkVSVEVYQlVGRkVSLCBwb29sLCBsZW5ndGgpLCBsZW5ndGgobGVuZ3RoKSwgdXNhZ2UodXNhZ2UpLCBGVkYoRlZGKQotCXsKLQkJaWYoRlZGKQotCQl7Ci0JCQl1bnNpZ25lZCBpbnQgc3RyaWRlID0gMDsKLQotCQkJc3dpdGNoKEZWRiAmIEQzREZWRl9QT1NJVElPTl9NQVNLKQotCQkJewotCQkJY2FzZSBEM0RGVkZfWFlaOglzdHJpZGUgKz0gMTI7CWJyZWFrOwotCQkJY2FzZSBEM0RGVkZfWFlaUkhXOglzdHJpZGUgKz0gMTY7CWJyZWFrOwotCQkJY2FzZSBEM0RGVkZfWFlaQjE6CXN0cmlkZSArPSAxNjsJYnJlYWs7Ci0JCQljYXNlIEQzREZWRl9YWVpCMjoJc3RyaWRlICs9IDIwOwlicmVhazsKLQkJCWNhc2UgRDNERlZGX1hZWkIzOglzdHJpZGUgKz0gMjQ7CWJyZWFrOwotCQkJY2FzZSBEM0RGVkZfWFlaQjQ6CXN0cmlkZSArPSAyODsJYnJlYWs7Ci0JCQljYXNlIEQzREZWRl9YWVpCNToJc3RyaWRlICs9IDMyOwlicmVhazsKLQkJCWNhc2UgRDNERlZGX1hZWlc6ICAgc3RyaWRlICs9IDE2OyAgIGJyZWFrOwotCQkJfQotCi0JCQlpZihGVkYgJiBEM0RGVkZfTk9STUFMKSAgIHN0cmlkZSArPSAxMjsKLQkJCWlmKEZWRiAmIEQzREZWRl9QU0laRSkgICAgc3RyaWRlICs9IDQ7Ci0JCQlpZihGVkYgJiBEM0RGVkZfRElGRlVTRSkgIHN0cmlkZSArPSA0OwotCQkJaWYoRlZGICYgRDNERlZGX1NQRUNVTEFSKSBzdHJpZGUgKz0gNDsKLQotCQkJc3dpdGNoKChGVkYgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgPj4gRDNERlZGX1RFWENPVU5UX1NISUZUKQotCQkJewotCQkJY2FzZSA4OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDMwKSkgJSA0KTsKLQkJCWNhc2UgNzogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAyOCkpICUgNCk7Ci0JCQljYXNlIDY6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMjYpKSAlIDQpOwotCQkJY2FzZSA1OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI0KSkgJSA0KTsKLQkJCWNhc2UgNDogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAyMikpICUgNCk7Ci0JCQljYXNlIDM6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMjApKSAlIDQpOwotCQkJY2FzZSAyOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDE4KSkgJSA0KTsKLQkJCWNhc2UgMTogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAxNikpICUgNCk7Ci0JCQljYXNlIDA6IGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBU1NFUlQoZmFsc2UpOwotCQkJfQotCi0JCQlBU1NFUlQobGVuZ3RoID49IHN0cmlkZSk7ICAgICAgIC8vIEZJWE1FCi0JCX0KLQotCQl2ZXJ0ZXhCdWZmZXIgPSBuZXcgc3c6OlJlc291cmNlKGxlbmd0aCArIDE5MiArIDEwMjQpOyAgIC8vIE5PVEU6IEFwcGxpY2F0aW9ucyBjYW4gJ292ZXJzaG9vdCcgd2hpbGUgd3JpdGluZyB2ZXJ0aWNlcwotCQlsb2NrQ291bnQgPSAwOwotCX0KLQotCURpcmVjdDNEVmVydGV4QnVmZmVyOTo6fkRpcmVjdDNEVmVydGV4QnVmZmVyOSgpCi0JewotCQl2ZXJ0ZXhCdWZmZXItPmRlc3RydWN0KCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEVmVydGV4QnVmZmVyOSB8fAotCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6QWRkUmVmKCk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpQcmVMb2FkKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlEaXJlY3QzRFJlc291cmNlOTo6UHJlTG9hZCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzRFJlc291cmNlOTo6R2V0RGV2aWNlKGRldmljZSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OlNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7Ci0JfQotCi0JdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OkdldFByaW9yaXR5KCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTk6OkdldFByaW9yaXR5KCk7Ci0JfQotCi0JRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEVmVydGV4QnVmZmVyOTo6R2V0VHlwZSgpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U5OjpHZXRUeXBlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OkxvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKG9mZnNldCA9PSAwICYmIHNpemUgPT0gMCkgICAvLyBMb2NrIHdob2xlIGJ1ZmZlcgotCQl7Ci0JCQlzaXplID0gbGVuZ3RoOwotCQl9Ci0KLQkJaWYoIWRhdGEgfHwgb2Zmc2V0ICsgc2l6ZSA+IGxlbmd0aCkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl2b2lkICpidWZmZXI7Ci0KLQkJaWYoZmxhZ3MgJiBEM0RMT0NLX0RJU0NBUkQvKiAmJiB1c2FnZSAmIEQzRFVTQUdFX0RZTkFNSUMqLykKLQkJewotCQkJdmVydGV4QnVmZmVyLT5kZXN0cnVjdCgpOwotCQkJdmVydGV4QnVmZmVyID0gbmV3IHN3OjpSZXNvdXJjZShsZW5ndGggKyAxOTIgKyAxMDI0KTsgICAvLyBOT1RFOiBBcHBsaWNhdGlvbnMgY2FuICdvdmVyc2hvb3QnIHdoaWxlIHdyaXRpbmcgdmVydGljZXMKLQotCQkJYnVmZmVyID0gKHZvaWQqKXZlcnRleEJ1ZmZlci0+ZGF0YSgpOwotCQl9Ci0JCWVsc2UgaWYoZmxhZ3MgJiBEM0RMT0NLX05PT1ZFUldSSVRFLyogJiYgdXNhZ2UgJiBEM0RVU0FHRV9EWU5BTUlDKi8pCi0JCXsKLQkJCWJ1ZmZlciA9ICh2b2lkKil2ZXJ0ZXhCdWZmZXItPmRhdGEoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJ1ZmZlciA9IHZlcnRleEJ1ZmZlci0+bG9jayhzdzo6UFVCTElDKTsKLQkJCWxvY2tDb3VudCsrOwotCQl9Ci0KLQkJKmRhdGEgPSAodW5zaWduZWQgY2hhciopYnVmZmVyICsgb2Zmc2V0OwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OlVubG9jaygpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYobG9ja0NvdW50ID4gMCkKLQkJewotCQkJdmVydGV4QnVmZmVyLT51bmxvY2soKTsKLQkJCWxvY2tDb3VudC0tOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyOTo6R2V0RGVzYyhEM0RWRVJURVhCVUZGRVJfREVTQyAqZGVzY3JpcHRpb24pCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRlc2NyaXB0aW9uKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLT5GVkYgPSBGVkY7Ci0JCWRlc2NyaXB0aW9uLT5Gb3JtYXQgPSBEM0RGTVRfVkVSVEVYREFUQTsKLQkJZGVzY3JpcHRpb24tPlBvb2wgPSBwb29sOwotCQlkZXNjcmlwdGlvbi0+U2l6ZSA9IGxlbmd0aDsKLQkJZGVzY3JpcHRpb24tPlR5cGUgPSBEM0RSVFlQRV9WRVJURVhCVUZGRVI7Ci0JCWRlc2NyaXB0aW9uLT5Vc2FnZSA9IHVzYWdlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JaW50IERpcmVjdDNEVmVydGV4QnVmZmVyOTo6Z2V0TGVuZ3RoKCkgY29uc3QKLQl7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0Jc3c6OlJlc291cmNlICpEaXJlY3QzRFZlcnRleEJ1ZmZlcjk6OmdldFJlc291cmNlKCkgY29uc3QKLQl7Ci0JCXJldHVybiB2ZXJ0ZXhCdWZmZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4QnVmZmVyOS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDQzMWYuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOV9EaXJlY3QzRFZlcnRleEJ1ZmZlcjlfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X2hwcAotCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTkuaHBwIgotCi0jaW5jbHVkZSA8ZDNkOS5oPgotCi1uYW1lc3BhY2Ugc3cKLXsKLQljbGFzcyBSZXNvdXJjZTsKLX0KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQljbGFzcyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgOiBwdWJsaWMgSURpcmVjdDNEVmVydGV4QnVmZmVyOSwgcHVibGljIERpcmVjdDNEUmVzb3VyY2U5Ci0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBsb25nIEZWRiwgRDNEUE9PTCBwb29sKTsKLQotCQl+RGlyZWN0M0RWZXJ0ZXhCdWZmZXI5KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSVVua25vd24gbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLQkJLy8gSURpcmVjdDNEUmVzb3VyY2U5IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRQcmlvcml0eSgpIG92ZXJyaWRlOwotCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5IG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgTG9jayh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqKmRhdGEsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBVbmxvY2soKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVzYyhEM0RWRVJURVhCVUZGRVJfREVTQyAqZGVzY3JpcHRpb24pIG92ZXJyaWRlOwotCi0JCS8vIEludGVybmFsIG1ldGhvZHMKLQkJaW50IGdldExlbmd0aCgpIGNvbnN0OwotCQlzdzo6UmVzb3VyY2UgKmdldFJlc291cmNlKCkgY29uc3Q7Ci0KLQlwcml2YXRlOgotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCWNvbnN0IHVuc2lnbmVkIGludCBsZW5ndGg7Ci0JCWNvbnN0IGxvbmcgdXNhZ2U7Ci0JCWNvbnN0IGxvbmcgRlZGOwotCi0JCXN3OjpSZXNvdXJjZSAqdmVydGV4QnVmZmVyOwotCQlpbnQgbG9ja0NvdW50OwotCX07Ci19Ci0KLSNlbmRpZiAvLyBEM0Q5X0RpcmVjdDNEVmVydGV4QnVmZmVyOV9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3MThhMS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiRGVidWcuaHBwIgotCi0jaW5jbHVkZSA8ZDNkOXR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOTo6RGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIGNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5ICp2ZXJ0ZXhFbGVtZW50KSA6IGRldmljZShkZXZpY2UpCi0JewotCQlpbnQgc2l6ZSA9IHNpemVvZihEM0RWRVJURVhFTEVNRU5UOSk7Ci0JCWNvbnN0IEQzRFZFUlRFWEVMRU1FTlQ5ICplbGVtZW50ID0gdmVydGV4RWxlbWVudDsKLQkJcHJlVHJhbnNmb3JtZWQgPSBmYWxzZTsKLQotCQl3aGlsZShlbGVtZW50LT5TdHJlYW0gIT0gMHhGRikKLQkJewotCQkJaWYoZWxlbWVudC0+VXNhZ2UgPT0gRDNEREVDTFVTQUdFX1BPU0lUSU9OVCkKLQkJCXsKLQkJCQlwcmVUcmFuc2Zvcm1lZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCXNpemUgKz0gc2l6ZW9mKEQzRFZFUlRFWEVMRU1FTlQ5KTsKLQkJCWVsZW1lbnQrKzsKLQkJfQotCi0JCW51bUVsZW1lbnRzID0gc2l6ZSAvIHNpemVvZihEM0RWRVJURVhFTEVNRU5UOSk7Ci0JCXRoaXMtPnZlcnRleEVsZW1lbnQgPSBuZXcgRDNEVkVSVEVYRUxFTUVOVDlbbnVtRWxlbWVudHNdOwotCQltZW1jcHkodGhpcy0+dmVydGV4RWxlbWVudCwgdmVydGV4RWxlbWVudCwgc2l6ZSk7Ci0KLQkJRlZGID0gY29tcHV0ZUZWRigpOwotCX0KLQotCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OjpEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgdW5zaWduZWQgbG9uZyBGVkYpIDogZGV2aWNlKGRldmljZSkKLQl7Ci0JCXRoaXMtPkZWRiA9IEZWRjsKLQotCQl2ZXJ0ZXhFbGVtZW50ID0gbmV3IEQzRFZFUlRFWEVMRU1FTlQ5W01BWF9WRVJURVhfSU5QVVRTXTsKLQotCQludW1FbGVtZW50cyA9IDA7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlwcmVUcmFuc2Zvcm1lZCA9IGZhbHNlOwotCi0JCXN3aXRjaChGVkYgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykKLQkJewotCQljYXNlIDA6Ci0JCQkvLyBObyBwb3NpdGlvbiBzdHJlYW0KLQkJCWJyZWFrOwotCQljYXNlIEQzREZWRl9YWVo6Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUMzsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX1BPU0lUSU9OOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7Ci0JCQludW1FbGVtZW50cysrOwotCQkJb2Zmc2V0ICs9IDQgKiAzOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNERlZGX1hZWlJIVzoKLQkJCXByZVRyYW5zZm9ybWVkID0gdHJ1ZTsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQ0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfUE9TSVRJT05UOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7Ci0JCQludW1FbGVtZW50cysrOwotCQkJb2Zmc2V0ICs9IDQgKiA0OwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNERlZGX1hZWkIxOgotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDM7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9QT1NJVElPTjsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOwotCQkJbnVtRWxlbWVudHMrKzsKLQkJCW9mZnNldCArPSA0ICogMzsKLQotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDE7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9CTEVORFdFSUdIVDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOwotCQkJbnVtRWxlbWVudHMrKzsKLQkJCW9mZnNldCArPSA0ICogMTsKLQkJCWJyZWFrOwotCQljYXNlIEQzREZWRl9YWVpCMjoKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQzOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfUE9TSVRJT047Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKLQkJCW51bUVsZW1lbnRzKys7Ci0JCQlvZmZzZXQgKz0gNCAqIDM7Ci0KLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQyOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfQkxFTkRXRUlHSFQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKLQkJCW51bUVsZW1lbnRzKys7Ci0JCQlvZmZzZXQgKz0gNCAqIDI7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RGVkZfWFlaQjM6Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUMzsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX1BPU0lUSU9OOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7Ci0JCQludW1FbGVtZW50cysrOwotCQkJb2Zmc2V0ICs9IDQgKiAzOwotCi0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUMzsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX0JMRU5EV0VJR0hUOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IDA7Ci0JCQludW1FbGVtZW50cysrOwotCQkJb2Zmc2V0ICs9IDQgKiAzOwotCQkJYnJlYWs7Ci0JCWNhc2UgRDNERlZGX1hZWkI0OgotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDM7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9QT1NJVElPTjsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOwotCQkJbnVtRWxlbWVudHMrKzsKLQkJCW9mZnNldCArPSA0ICogMzsKLQotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9CTEVORFdFSUdIVDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOwotCQkJbnVtRWxlbWVudHMrKzsKLQkJCW9mZnNldCArPSA0ICogNDsKLQkJCWJyZWFrOwotCQljYXNlIEQzREZWRl9YWVpCNToKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQzOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfUE9TSVRJT047Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKLQkJCW51bUVsZW1lbnRzKys7Ci0JCQlvZmZzZXQgKz0gNCAqIDM7Ci0KLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQ0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfQkxFTkRXRUlHSFQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKLQkJCW51bUVsZW1lbnRzKys7Ci0JCQlvZmZzZXQgKz0gNCAqIDU7Ci0JCQlicmVhazsKLQkJY2FzZSBEM0RGVkZfWFlaVzoKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRkxPQVQ0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfUE9TSVRJT047Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMDsKLQkJCW51bUVsZW1lbnRzKys7Ci0JCQlvZmZzZXQgKz0gNCAqIDQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUFTU0VSVChmYWxzZSk7Ci0JCX0KLQotCQlpZihGVkYgJiBEM0RGVkZfTk9STUFMKQotCQl7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0ZMT0FUMzsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX05PUk1BTDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOwotCQkJbnVtRWxlbWVudHMrKzsKLQkJCW9mZnNldCArPSA0ICogMzsKLQkJfQotCi0JCWlmKEZWRiAmIEQzREZWRl9QU0laRSkKLQkJewotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uU3RyZWFtID0gMDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk9mZnNldCA9IG9mZnNldDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlR5cGUgPSBEM0RERUNMVFlQRV9GTE9BVDE7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9QU0laRTsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOwotCQkJbnVtRWxlbWVudHMrKzsKLQkJCW9mZnNldCArPSA0OwotCQl9Ci0KLQkJaWYoRlZGICYgRDNERlZGX0RJRkZVU0UpCi0JCXsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlN0cmVhbSA9IDA7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSBvZmZzZXQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfRDNEQ09MT1I7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSBEM0RERUNMTUVUSE9EX0RFRkFVTFQ7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IEQzRERFQ0xVU0FHRV9DT0xPUjsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOwotCQkJbnVtRWxlbWVudHMrKzsKLQkJCW9mZnNldCArPSA0OwotCQl9Ci0KLQkJaWYoRlZGICYgRDNERlZGX1NQRUNVTEFSKQotCQl7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IEQzRERFQ0xUWVBFX0QzRENPTE9SOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uTWV0aG9kID0gRDNEREVDTE1FVEhPRF9ERUZBVUxUOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2UgPSBEM0RERUNMVVNBR0VfQ09MT1I7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZUluZGV4ID0gMTsKLQkJCW51bUVsZW1lbnRzKys7Ci0JCQlvZmZzZXQgKz0gNDsKLQkJfQotCi0JCWludCBudW1UZXhDb29yZCA9IChGVkYgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgPj4gRDNERlZGX1RFWENPVU5UX1NISUZUOwotCQlpbnQgdGV4dHVyZUZvcm1hdHMgPSAoRlZGID4+IDE2KSAmIDB4RkZGRjsKLQotCQlzdGF0aWMgY29uc3QgaW50IHRleHR1cmVTaXplWzRdID0KLQkJewotCQkJMiAqIDQsICAgLy8gRDNERlZGX1RFWFRVUkVGT1JNQVQyCi0JCQkzICogNCwgICAvLyBEM0RGVkZfVEVYVFVSRUZPUk1BVDMKLQkJCTQgKiA0LCAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUNAotCQkJMSAqIDQgICAgLy8gRDNERlZGX1RFWFRVUkVGT1JNQVQxCi0JCX07Ci0KLQkJc3RhdGljIGNvbnN0IEQzRERFQ0xUWVBFIHRleHR1cmVUeXBlWzRdID0KLQkJewotCQkJRDNEREVDTFRZUEVfRkxPQVQyLCAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUMgotCQkJRDNEREVDTFRZUEVfRkxPQVQzLCAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUMwotCQkJRDNEREVDTFRZUEVfRkxPQVQ0LCAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUNAotCQkJRDNEREVDTFRZUEVfRkxPQVQxICAgIC8vIEQzREZWRl9URVhUVVJFRk9STUFUMQotCQl9OwotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBudW1UZXhDb29yZDsgaSsrKQotCQl7Ci0JCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAwOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uT2Zmc2V0ID0gb2Zmc2V0OwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVHlwZSA9IHRleHR1cmVUeXBlW3RleHR1cmVGb3JtYXRzICYgMHgzXTsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLk1ldGhvZCA9IEQzRERFQ0xNRVRIT0RfREVGQVVMVDsKLQkJCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlID0gRDNEREVDTFVTQUdFX1RFWENPT1JEOwotCQkJdmVydGV4RWxlbWVudFtudW1FbGVtZW50c10uVXNhZ2VJbmRleCA9IGk7Ci0JCQludW1FbGVtZW50cysrOwotCQkJb2Zmc2V0ICs9IHRleHR1cmVTaXplW3RleHR1cmVGb3JtYXRzICYgMHgzXTsKLQkJCXRleHR1cmVGb3JtYXRzID4+PSAyOwotCQl9Ci0KLQkJLy8gRDNEREVDTF9FTkQoKQotCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5TdHJlYW0gPSAweEZGOwotCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5PZmZzZXQgPSAwOwotCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5UeXBlID0gRDNEREVDTFRZUEVfVU5VU0VEOwotCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5NZXRob2QgPSAwOwotCQl2ZXJ0ZXhFbGVtZW50W251bUVsZW1lbnRzXS5Vc2FnZSA9IDA7Ci0JCXZlcnRleEVsZW1lbnRbbnVtRWxlbWVudHNdLlVzYWdlSW5kZXggPSAwOwotCQludW1FbGVtZW50cysrOwotCX0KLQotCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245Ojp+RGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkoKQotCXsKLQkJZGVsZXRlW10gdmVydGV4RWxlbWVudDsKLQkJdmVydGV4RWxlbWVudCA9IDA7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgfHwKLQkJICAgaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245OjpSZWxlYXNlKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjk6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U5ICoqZGV2aWNlKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKHRoaXMtPmRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXZpY2UpCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJdGhpcy0+ZGV2aWNlLT5BZGRSZWYoKTsKLQkJKmRldmljZSA9IHRoaXMtPmRldmljZTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjk6OkdldERlY2xhcmF0aW9uKEQzRFZFUlRFWEVMRU1FTlQ5ICpkZWNsYXJhdGlvbiwgdW5zaWduZWQgaW50ICpudW1FbGVtZW50cykKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighZGVjbGFyYXRpb24gfHwgIW51bUVsZW1lbnRzKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCSpudW1FbGVtZW50cyA9IHRoaXMtPm51bUVsZW1lbnRzOwotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCB0aGlzLT5udW1FbGVtZW50czsgaSsrKQotCQl7Ci0JCQlkZWNsYXJhdGlvbltpXSA9IHZlcnRleEVsZW1lbnRbaV07Ci0JCX0KLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjk6OmdldEZWRigpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlZGOwotCX0KLQotCWJvb2wgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjk6OmlzUHJlVHJhbnNmb3JtZWQoKSBjb25zdAotCXsKLQkJcmV0dXJuIHByZVRyYW5zZm9ybWVkOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjk6OmNvbXB1dGVGVkYoKQotCXsKLQkJdW5zaWduZWQgbG9uZyBGVkYgPSAwOwotCi0JCWludCB0ZXh0dXJlQml0cyA9IDA7Ci0JCWludCBudW1CbGVuZFdlaWdodHMgPSAwOwotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBudW1FbGVtZW50cyAtIDE7IGkrKykKLQkJewotCQkJRDNEVkVSVEVYRUxFTUVOVDkgJmVsZW1lbnQgPSB2ZXJ0ZXhFbGVtZW50W2ldOwotCi0JCQlpZihlbGVtZW50LlN0cmVhbSAhPSAwKQotCQkJewotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlzd2l0Y2goZWxlbWVudC5Vc2FnZSkKLQkJCXsKLQkJCWNhc2UgRDNEREVDTFVTQUdFX1BPU0lUSU9OOgotCQkJCWlmKGVsZW1lbnQuVHlwZSA9PSBEM0RERUNMVFlQRV9GTE9BVDMgJiYgZWxlbWVudC5Vc2FnZUluZGV4ID09IDApCi0JCQkJewotCQkJCQlGVkYgfD0gRDNERlZGX1hZWjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RERUNMVVNBR0VfUE9TSVRJT05UOgotCQkJCWlmKGVsZW1lbnQuVHlwZSA9PSBEM0RERUNMVFlQRV9GTE9BVDQgJiYgZWxlbWVudC5Vc2FnZUluZGV4ID09IDApCi0JCQkJewotCQkJCQlGVkYgfD0gRDNERlZGX1hZWlJIVzsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RERUNMVVNBR0VfQkxFTkRXRUlHSFQ6Ci0JCQkJaWYoZWxlbWVudC5UeXBlIDw9IEQzRERFQ0xUWVBFX0ZMT0FUNCAmJiBlbGVtZW50LlVzYWdlSW5kZXggPT0gMCkKLQkJCQl7Ci0JCQkJCW51bUJsZW5kV2VpZ2h0cyArPSBlbGVtZW50LlR5cGUgKyAxOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRERFQ0xVU0FHRV9CTEVORElORElDRVM6Ci0JCQkJcmV0dXJuIDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRERFQ0xVU0FHRV9OT1JNQUw6Ci0JCQkJaWYoZWxlbWVudC5UeXBlID09IEQzRERFQ0xUWVBFX0ZMT0FUMyAmJiBlbGVtZW50LlVzYWdlSW5kZXggPT0gMCkKLQkJCQl7Ci0JCQkJCUZWRiB8PSBEM0RGVkZfTk9STUFMOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEQzRERFQ0xVU0FHRV9QU0laRToKLQkJCQlpZihlbGVtZW50LlR5cGUgPT0gRDNEREVDTFRZUEVfRkxPQVQxICYmIGVsZW1lbnQuVXNhZ2VJbmRleCA9PSAwKQotCQkJCXsKLQkJCQkJRlZGIHw9IEQzREZWRl9QU0laRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBEM0RERUNMVVNBR0VfQ09MT1I6Ci0JCQkJaWYoZWxlbWVudC5UeXBlID09IEQzRERFQ0xUWVBFX0QzRENPTE9SICYmIGVsZW1lbnQuVXNhZ2VJbmRleCA8IDIpCi0JCQkJewotCQkJCQlpZihlbGVtZW50LlVzYWdlSW5kZXggPT0gMCkKLQkJCQkJewotCQkJCQkJRlZGIHw9IEQzREZWRl9ESUZGVVNFOwotCQkJCQl9Ci0JCQkJCWVsc2UgICAvLyBlbGVtZW50LlVzYWdlSW5kZXggPT0gMQotCQkJCQl7Ci0JCQkJCQlGVkYgfD0gRDNERlZGX1NQRUNVTEFSOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRDNEREVDTFVTQUdFX1RFWENPT1JEOgotCQkJCWlmKChlbGVtZW50LlR5cGUgPiBEM0RERUNMVFlQRV9GTE9BVDQpIHx8IChlbGVtZW50LlVzYWdlSW5kZXggPiA3KSkKLQkJCQl7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQotCQkJCWludCBiaXQgPSAxIDw8IGVsZW1lbnQuVXNhZ2VJbmRleDsKLQotCQkJCWlmKHRleHR1cmVCaXRzICYgYml0KQotCQkJCXsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJdGV4dHVyZUJpdHMgfD0gYml0OwotCi0JCQkJc3dpdGNoKGVsZW1lbnQuVHlwZSkKLQkJCQl7Ci0JCQkJY2FzZSBEM0RERUNMVFlQRV9GTE9BVDE6Ci0JCQkJCUZWRiB8PSBEM0RGVkZfVEVYQ09PUkRTSVpFMShlbGVtZW50LlVzYWdlSW5kZXgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEQzRERFQ0xUWVBFX0ZMT0FUMjoKLQkJCQkJRlZGIHw9IEQzREZWRl9URVhDT09SRFNJWkUyKGVsZW1lbnQuVXNhZ2VJbmRleCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRDNEREVDTFRZUEVfRkxPQVQzOgotCQkJCQlGVkYgfD0gRDNERlZGX1RFWENPT1JEU0laRTMoZWxlbWVudC5Vc2FnZUluZGV4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEM0RERUNMVFlQRV9GTE9BVDQ6Ci0JCQkJCUZWRiB8PSBEM0RGVkZfVEVYQ09PUkRTSVpFNChlbGVtZW50LlVzYWdlSW5kZXgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlib29sIGlzVHJhbnNmb3JtZWQgPSAoRlZGICYgRDNERlZGX1hZWlJIVykgIT0gMDsKLQotCQlpZihpc1RyYW5zZm9ybWVkKQotCQl7Ci0JCQlpZihudW1CbGVuZFdlaWdodHMgIT0gMCkKLQkJCXsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCQllbHNlIGlmKChGVkYgJiBEM0RGVkZfWFlaKSA9PSAwKQotCQl7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWludCBwb3NpdGlvbk1hc2sgPSBpc1RyYW5zZm9ybWVkID8gMHgyIDogMHgxOwotCi0JCWlmKG51bUJsZW5kV2VpZ2h0cykKLQkJewotCQkJcG9zaXRpb25NYXNrICs9IG51bUJsZW5kV2VpZ2h0cyArIDE7Ci0JCX0KLQotCQlpbnQgbnVtVGV4Q29vcmQgPSAwOwotCi0JCXdoaWxlKHRleHR1cmVCaXRzICYgMSkKLQkJewotCQkJdGV4dHVyZUJpdHMgPj49IDE7Ci0KLQkJCW51bVRleENvb3JkKys7Ci0JCX0KLQotCQlpZih0ZXh0dXJlQml0cykgICAvLyBGVkYgZG9lcyBub3QgYWxsb3cKLQkJewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlGVkYgfD0gRDNERlZGX1BPU0lUSU9OX01BU0sgJiAocG9zaXRpb25NYXNrIDw8IDEpOwotCQlGVkYgfD0gbnVtVGV4Q29vcmQgPDwgRDNERlZGX1RFWENPVU5UX1NISUZUOwotCi0JCXJldHVybiBGVkY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFmZDQ1Li4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgRDNEOV9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9ocHAKLSNkZWZpbmUgRDNEOV9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9ocHAKLQotI2luY2x1ZGUgIlVua25vd24uaHBwIgotCi0jaW5jbHVkZSA8ZDNkOS5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCWNsYXNzIERpcmVjdDNERGV2aWNlOTsKLQotCWNsYXNzIERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245IDogcHVibGljIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSwgcHVibGljIFVua25vd24KLQl7Ci0JcHVibGljOgotCQlEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgY29uc3QgRDNEVkVSVEVYRUxFTUVOVDkgKnZlcnRleEVsZW1lbnRzKTsKLQkJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgRlZGKTsKLQotCQl+RGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERlY2xhcmF0aW9uKEQzRFZFUlRFWEVMRU1FTlQ5ICpkZWNsYXJhdGlvbiwgdW5zaWduZWQgaW50ICpudW1FbGVtZW50cykgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQl1bnNpZ25lZCBsb25nIGdldEZWRigpIGNvbnN0OwotCQlib29sIGlzUHJlVHJhbnNmb3JtZWQoKSBjb25zdDsKLQotCXByaXZhdGU6Ci0JCXVuc2lnbmVkIGxvbmcgY29tcHV0ZUZWRigpOyAgIC8vIElmIGVxdWl2YWxlbnQgdG8gRlZGLCBlbHNlIDAKLQotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCURpcmVjdDNERGV2aWNlOSAqY29uc3QgZGV2aWNlOwotCQlEM0RWRVJURVhFTEVNRU5UOSAqdmVydGV4RWxlbWVudDsKLQotCQlpbnQgbnVtRWxlbWVudHM7Ci0JCXVuc2lnbmVkIGxvbmcgRlZGOwotCQlib29sIHByZVRyYW5zZm9ybWVkOwotCX07Ci19Ci0KLSNlbmRpZiAgIC8vIEQzRDlfRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleFNoYWRlcjkuY3BwIGIvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlM2ZjNS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleFNoYWRlcjkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJEaXJlY3QzRFZlcnRleFNoYWRlcjkuaHBwIgotCi0jaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5OjpEaXJlY3QzRFZlcnRleFNoYWRlcjkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuKSA6IGRldmljZShkZXZpY2UpLCB2ZXJ0ZXhTaGFkZXIoc2hhZGVyVG9rZW4pCi0JewotCQl0b2tlbkNvdW50ID0gMDsKLQotCQl3aGlsZShzaGFkZXJUb2tlblt0b2tlbkNvdW50XSAhPSAweDAwMDBGRkZGKQotCQl7Ci0JCQl0b2tlbkNvdW50ICs9IHN3OjpTaGFkZXI6OnNpemUoc2hhZGVyVG9rZW5bdG9rZW5Db3VudF0sICh1bnNpZ25lZCBzaG9ydCkoc2hhZGVyVG9rZW5bMF0gJiAweEZGRkYpKSArIDE7Ci0JCX0KLQotCQl0b2tlbkNvdW50ICs9IDE7Ci0KLQkJdGhpcy0+c2hhZGVyVG9rZW4gPSBuZXcgdW5zaWduZWQgbG9uZ1t0b2tlbkNvdW50XTsKLQkJbWVtY3B5KHRoaXMtPnNoYWRlclRva2VuLCBzaGFkZXJUb2tlbiwgdG9rZW5Db3VudCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JfQotCi0JRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5Ojp+RGlyZWN0M0RWZXJ0ZXhTaGFkZXI5KCkKLQl7Ci0JCWRlbGV0ZVtdIHNoYWRlclRva2VuOwotCQlzaGFkZXJUb2tlbiA9IDA7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleFNoYWRlcjk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEVmVydGV4U2hhZGVyOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5OjpBZGRSZWYoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4U2hhZGVyOTo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVmVydGV4U2hhZGVyOTo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcy0+ZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRldmljZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQl0aGlzLT5kZXZpY2UtPkFkZFJlZigpOwotCQkqZGV2aWNlID0gdGhpcy0+ZGV2aWNlOwotCi0JCXJldHVybiBEM0RfT0s7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZlcnRleFNoYWRlcjk6OkdldEZ1bmN0aW9uKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCAqc2l6ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighc2l6ZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlpZihkYXRhKQotCQl7Ci0JCQltZW1jcHkoZGF0YSwgc2hhZGVyVG9rZW4sIHRva2VuQ291bnQgKiA0KTsKLQkJfQotCi0JCSpzaXplID0gdG9rZW5Db3VudCAqIDQ7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQljb25zdCBzdzo6VmVydGV4U2hhZGVyICpEaXJlY3QzRFZlcnRleFNoYWRlcjk6OmdldFZlcnRleFNoYWRlcigpIGNvbnN0Ci0JewotCQlyZXR1cm4gJnZlcnRleFNoYWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleFNoYWRlcjkuaHBwIGIvc3JjL0QzRDkvRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjNWZiZC4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFZlcnRleFNoYWRlcjkuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q5X0RpcmVjdDNEVmVydGV4U2hhZGVyOV9ocHAKLSNkZWZpbmUgRDNEOV9EaXJlY3QzRFZlcnRleFNoYWRlcjlfaHBwCi0KLSNpbmNsdWRlICJVbmtub3duLmhwcCIKLQotI2luY2x1ZGUgIlZlcnRleFNoYWRlci5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q5Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JY2xhc3MgRGlyZWN0M0REZXZpY2U5OwotCi0JY2xhc3MgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5IDogcHVibGljIElEaXJlY3QzRFZlcnRleFNoYWRlcjksIHB1YmxpYyBVbmtub3duCi0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5KERpcmVjdDNERGV2aWNlOSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nICpzaGFkZXJUb2tlbik7Ci0KLQkJfkRpcmVjdDNEVmVydGV4U2hhZGVyOSgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFZlcnRleFNoYWRlcjkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldEZ1bmN0aW9uKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCAqc2l6ZSkgb3ZlcnJpZGU7Ci0KLQkJLy8gSW50ZXJuYWwgbWV0aG9kcwotCQljb25zdCBzdzo6VmVydGV4U2hhZGVyICpnZXRWZXJ0ZXhTaGFkZXIoKSBjb25zdDsKLQotCXByaXZhdGU6Ci0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJRGlyZWN0M0REZXZpY2U5ICpjb25zdCBkZXZpY2U7Ci0KLQkJdW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW47Ci0JCWludCB0b2tlbkNvdW50OwotCi0JCXN3OjpWZXJ0ZXhTaGFkZXIgdmVydGV4U2hhZGVyOwotCX07Ci19Ci0KLSNlbmRpZiAgIC8vIEQzRDlfRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWb2x1bWU5LmNwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lOS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQ4YTguLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvRGlyZWN0M0RWb2x1bWU5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RWb2x1bWU5LmhwcCIKLQotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiRGlyZWN0M0RSZXNvdXJjZTkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lVGV4dHVyZTkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTkuaHBwIgotI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKLSNpbmNsdWRlICJEZWJ1Zy5ocHAiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotbmFtZXNwYWNlIEQzRDkKLXsKLQlib29sIGlzTG9ja2FibGUoRDNEUE9PTCBwb29sLCB1bnNpZ25lZCBsb25nIHVzYWdlKQotCXsKLQkJcmV0dXJuIChwb29sICE9IEQzRFBPT0xfREVGQVVMVCkgfHwgKHVzYWdlICYgRDNEVVNBR0VfRFlOQU1JQyk7Ci0JfQotCi0JRGlyZWN0M0RWb2x1bWU5OjpEaXJlY3QzRFZvbHVtZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIERpcmVjdDNEVm9sdW1lVGV4dHVyZTkgKmNvbnRhaW5lciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgdW5zaWduZWQgbG9uZyB1c2FnZSkKLQkJOiBkZXZpY2UoZGV2aWNlKSwgU3VyZmFjZShjb250YWluZXItPmdldFJlc291cmNlKCksIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCAwLCAxLCB0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KSwgaXNMb2NrYWJsZShwb29sLCB1c2FnZSksIGZhbHNlKSwgY29udGFpbmVyKGNvbnRhaW5lciksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGRlcHRoKGRlcHRoKSwgZm9ybWF0KGZvcm1hdCksIHBvb2wocG9vbCksIGxvY2thYmxlKGlzTG9ja2FibGUocG9vbCwgdXNhZ2UpKSwgdXNhZ2UodXNhZ2UpCi0JewotCQlyZXNvdXJjZSA9IG5ldyBEaXJlY3QzRFJlc291cmNlOShkZXZpY2UsIEQzRFJUWVBFX1ZPTFVNRSwgcG9vbCwgbWVtb3J5VXNhZ2Uod2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCkpOwotCQlyZXNvdXJjZS0+YmluZCgpOwotCX0KLQotCURpcmVjdDNEVm9sdW1lOTo6fkRpcmVjdDNEVm9sdW1lOSgpCi0JewotCQlyZXNvdXJjZS0+dW5iaW5kKCk7Ci0JfQotCi0Jdm9pZCAqRGlyZWN0M0RWb2x1bWU5Ojpsb2NrSW50ZXJuYWwoaW50IHgsIGludCB5LCBpbnQgeiwgc3c6OkxvY2sgbG9jaywgc3c6OkFjY2Vzc29yIGNsaWVudCkKLQl7Ci0JCXJldHVybiBTdXJmYWNlOjpsb2NrSW50ZXJuYWwoeCwgeSwgeiwgbG9jaywgY2xpZW50KTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEVm9sdW1lOTo6dW5sb2NrSW50ZXJuYWwoKQotCXsKLQkJU3VyZmFjZTo6dW5sb2NrSW50ZXJuYWwoKTsKLQl9Ci0KLQlsb25nIF9fc3RkY2FsbCBEaXJlY3QzRFZvbHVtZTk6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEVm9sdW1lOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIERpcmVjdDNEVm9sdW1lOTo6QWRkUmVmKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gY29udGFpbmVyLT5BZGRSZWYoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBEaXJlY3QzRFZvbHVtZTk6OlJlbGVhc2UoKQotCXsKLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBjb250YWluZXItPlJlbGVhc2UoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lOTo6RnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIHJlc291cmNlLT5GcmVlUHJpdmF0ZURhdGEoZ3VpZCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZTk6OkdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcikKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlpZighY29udGFpbmVyKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWxvbmcgcmVzdWx0ID0gdGhpcy0+Y29udGFpbmVyLT5RdWVyeUludGVyZmFjZShpaWQsIGNvbnRhaW5lcik7Ci0KLQkJaWYocmVzdWx0ID09IFNfT0spCi0JCXsKLQkJCXJldHVybiBEM0RfT0s7Ci0JCX0KLQotCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lOTo6R2V0RGVzYyhEM0RWT0xVTUVfREVTQyAqZGVzY3JpcHRpb24pCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWRlc2NyaXB0aW9uKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLT5Gb3JtYXQgPSBmb3JtYXQ7Ci0JCWRlc2NyaXB0aW9uLT5UeXBlID0gRDNEUlRZUEVfVk9MVU1FOwotCQlkZXNjcmlwdGlvbi0+VXNhZ2UgPSB1c2FnZTsKLQkJZGVzY3JpcHRpb24tPlBvb2wgPSBwb29sOwotCQlkZXNjcmlwdGlvbi0+V2lkdGggPSB3aWR0aDsKLQkJZGVzY3JpcHRpb24tPkhlaWdodCA9IGhlaWdodDsKLQkJZGVzY3JpcHRpb24tPkRlcHRoID0gZGVwdGg7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lOTo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3ModGhpcy0+ZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIHJlc291cmNlLT5HZXREZXZpY2UoZGV2aWNlKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lOTo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gcmVzb3VyY2UtPkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWU5OjpMb2NrQm94KEQzRExPQ0tFRF9CT1ggKmxvY2tlZFZvbHVtZSwgY29uc3QgRDNEQk9YICpib3gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWxvY2tlZFZvbHVtZSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlsb2NrZWRWb2x1bWUtPlJvd1BpdGNoID0gMDsKLQkJbG9ja2VkVm9sdW1lLT5TbGljZVBpdGNoID0gMDsKLQkJbG9ja2VkVm9sdW1lLT5wQml0cyA9IDA7Ci0KLQkJaWYoIWxvY2thYmxlKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCWxvY2tlZFZvbHVtZS0+Um93UGl0Y2ggPSBnZXRFeHRlcm5hbFBpdGNoQigpOwotCQlsb2NrZWRWb2x1bWUtPlNsaWNlUGl0Y2ggPSBnZXRFeHRlcm5hbFNsaWNlQigpOwotCi0JCXN3OjpMb2NrIGxvY2sgPSBzdzo6TE9DS19SRUFEV1JJVEU7Ci0KLQkJaWYoZmxhZ3MgJiBEM0RMT0NLX0RJU0NBUkQpCi0JCXsKLQkJCWxvY2sgPSBzdzo6TE9DS19ESVNDQVJEOwotCQl9Ci0KLQkJaWYoZmxhZ3MgJiBEM0RMT0NLX1JFQURPTkxZKQotCQl7Ci0JCQlsb2NrID0gc3c6OkxPQ0tfUkVBRE9OTFk7Ci0JCX0KLQotCQlpZihib3gpCi0JCXsKLQkJCWxvY2tlZFZvbHVtZS0+cEJpdHMgPSBsb2NrRXh0ZXJuYWwoYm94LT5MZWZ0LCBib3gtPlRvcCwgYm94LT5Gcm9udCwgbG9jaywgc3c6OlBVQkxJQyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlsb2NrZWRWb2x1bWUtPnBCaXRzID0gbG9ja0V4dGVybmFsKDAsIDAsIDAsIGxvY2ssIHN3OjpQVUJMSUMpOwotCQl9Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lOTo6U2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiByZXNvdXJjZS0+U2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSwgZmxhZ3MpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWU5OjpVbmxvY2tCb3goKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXVubG9ja0V4dGVybmFsKCk7Ci0KLQkJcmV0dXJuIEQzRF9PSzsKLQl9Ci0KLQlzdzo6Rm9ybWF0IERpcmVjdDNEVm9sdW1lOTo6dHJhbnNsYXRlRm9ybWF0KEQzREZPUk1BVCBmb3JtYXQpCi0JewotCQlyZXR1cm4gRGlyZWN0M0RTdXJmYWNlOTo6dHJhbnNsYXRlRm9ybWF0KGZvcm1hdCk7Ci0JfQotCi0JdW5zaWduZWQgaW50IERpcmVjdDNEVm9sdW1lOTo6bWVtb3J5VXNhZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIEQzREZPUk1BVCBmb3JtYXQpCi0JewotCQlyZXR1cm4gU3VyZmFjZTo6c2l6ZSh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgMCwgMSwgdHJhbnNsYXRlRm9ybWF0KGZvcm1hdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lOS5ocHAgYi9zcmMvRDNEOS9EaXJlY3QzRFZvbHVtZTkuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjNmZWRkLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lOS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfRGlyZWN0M0RWb2x1bWU5X2hwcAotI2RlZmluZSBEM0Q5X0RpcmVjdDNEVm9sdW1lOV9ocHAKLQotI2luY2x1ZGUgIlVua25vd24uaHBwIgotCi0jaW5jbHVkZSAiU3VyZmFjZS5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q5Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JY2xhc3MgRGlyZWN0M0REZXZpY2U5OwotCWNsYXNzIERpcmVjdDNEUmVzb3VyY2U5OwotCWNsYXNzIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk7Ci0KLQljbGFzcyBEaXJlY3QzRFZvbHVtZTkgOiBwdWJsaWMgSURpcmVjdDNEVm9sdW1lOSwgcHVibGljIFVua25vd24sIHB1YmxpYyBzdzo6U3VyZmFjZQotCXsKLQlwdWJsaWM6Ci0JCURpcmVjdDNEVm9sdW1lOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAqY29udGFpbmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCB1bnNpZ25lZCBsb25nIHVzYWdlKTsKLQotCQl+RGlyZWN0M0RWb2x1bWU5KCkgb3ZlcnJpZGU7Ci0KLQkJLy8gU3VyZmFjZSBtZXRob2RzCi0JCXZvaWQgKmxvY2tJbnRlcm5hbChpbnQgeCwgaW50IHksIGludCB6LCBzdzo6TG9jayBsb2NrLCBzdzo6QWNjZXNzb3IgY2xpZW50KSBvdmVycmlkZTsKLQkJdm9pZCB1bmxvY2tJbnRlcm5hbCgpIG92ZXJyaWRlOwotCi0JCS8vIElVbmtub3duIG1ldGhvZHMKLQkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzRFZvbHVtZTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldERlc2MoRDNEVk9MVU1FX0RFU0MgKmRlc2NyaXB0aW9uKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTkgKipkZXZpY2UpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgTG9ja0JveChEM0RMT0NLRURfQk9YICpsb2NrZWRWb2x1bWUsIGNvbnN0IEQzREJPWCAqYm94LCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrQm94KCkgb3ZlcnJpZGU7Ci0KLQlwcml2YXRlOgotCQlzdGF0aWMgc3c6OkZvcm1hdCB0cmFuc2xhdGVGb3JtYXQoRDNERk9STUFUIGZvcm1hdCk7Ci0JCXN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtb3J5VXNhZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIEQzREZPUk1BVCBmb3JtYXQpOwotCi0JCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKLQkJRGlyZWN0M0REZXZpY2U5ICpjb25zdCBkZXZpY2U7Ci0JCURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgKmNvbnN0IGNvbnRhaW5lcjsKLQkJY29uc3QgaW50IHdpZHRoOwotCQljb25zdCBpbnQgaGVpZ2h0OwotCQljb25zdCBpbnQgZGVwdGg7Ci0JCWNvbnN0IEQzREZPUk1BVCBmb3JtYXQ7Ci0JCWNvbnN0IEQzRFBPT0wgcG9vbDsKLQkJY29uc3QgYm9vbCBsb2NrYWJsZTsKLQkJY29uc3QgdW5zaWduZWQgbG9uZyB1c2FnZTsKLQotCQlEaXJlY3QzRFJlc291cmNlOSAqcmVzb3VyY2U7Ci0JfTsKLX0KLQotI2VuZGlmIC8vIEQzRDlfRGlyZWN0M0RWb2x1bWU5X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRGlyZWN0M0RWb2x1bWVUZXh0dXJlOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRFZvbHVtZVRleHR1cmU5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwMjRkMS4uMDAwMDAwMAotLS0gYS9zcmMvRDNEOS9EaXJlY3QzRFZvbHVtZVRleHR1cmU5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiRGlyZWN0M0RWb2x1bWVUZXh0dXJlOS5ocHAiCi0KLSNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZTkuaHBwIgotI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOS5ocHAiCi0jaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgotI2luY2x1ZGUgIkRlYnVnLmhwcCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1uYW1lc3BhY2UgRDNEOQotewotCURpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkRpcmVjdDNEVm9sdW1lVGV4dHVyZTkoRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UsIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGRlcHRoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RCYXNlVGV4dHVyZTkoZGV2aWNlLCBEM0RSVFlQRV9WT0xVTUVURVhUVVJFLCBmb3JtYXQsIHBvb2wsIGxldmVscywgdXNhZ2UpLCB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBkZXB0aChkZXB0aCkKLQl7Ci0JCWlmKGxldmVscyA9PSAwKQotCQl7Ci0JCQl0aGlzLT5sZXZlbHMgPSBzdzo6bG9nMihzdzo6bWF4KChpbnQpd2lkdGgsIChpbnQpaGVpZ2h0LCAoaW50KWRlcHRoLCAxKSkgKyAxOwotCQl9Ci0KLQkJZm9yKHVuc2lnbmVkIGludCBsZXZlbCA9IDA7IGxldmVsIDwgc3c6Ok1JUE1BUF9MRVZFTFM7IGxldmVsKyspCi0JCXsKLQkJCWlmKGxldmVsIDwgdGhpcy0+bGV2ZWxzKQotCQkJewotCQkJCXZvbHVtZUxldmVsW2xldmVsXSA9IG5ldyBEaXJlY3QzRFZvbHVtZTkoZGV2aWNlLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCBwb29sLCB1c2FnZSk7Ci0JCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdLT5iaW5kKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdID0gMDsKLQkJCX0KLQotCQkJd2lkdGggPSBzdzo6bWF4KDEsIChpbnQpd2lkdGggLyAyKTsKLQkJCWhlaWdodCA9IHN3OjptYXgoMSwgKGludCloZWlnaHQgLyAyKTsKLQkJCWRlcHRoID0gc3c6Om1heCgxLCAoaW50KWRlcHRoIC8gMik7Ci0JCX0KLQl9Ci0KLQlEaXJlY3QzRFZvbHVtZVRleHR1cmU5Ojp+RGlyZWN0M0RWb2x1bWVUZXh0dXJlOSgpCi0JewotCQlmb3IoaW50IGxldmVsID0gMDsgbGV2ZWwgPCBzdzo6TUlQTUFQX0xFVkVMUzsgbGV2ZWwrKykKLQkJewotCQkJaWYodm9sdW1lTGV2ZWxbbGV2ZWxdKQotCQkJewotCQkJCXZvbHVtZUxldmVsW2xldmVsXS0+dW5iaW5kKCk7Ci0JCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSB8fAotCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzREJhc2VUZXh0dXJlOSB8fAotCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOSB8fAotCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQotCQl7Ci0JCQlBZGRSZWYoKTsKLQkJCSpvYmplY3QgPSB0aGlzOwotCi0JCQlyZXR1cm4gU19PSzsKLQkJfQotCi0JCSpvYmplY3QgPSAwOwotCi0JCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6QWRkUmVmKCkKLQl7Ci0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkFkZFJlZigpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6UmVsZWFzZSgpCi0JewotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpSZWxlYXNlKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKLQl9Ci0KLQlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKLQl9Ci0KLQl2b2lkIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OlByZUxvYWQoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCURpcmVjdDNEQmFzZVRleHR1cmU5OjpQcmVMb2FkKCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU5OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbih0aGlzLT5kZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldERldmljZShkZXZpY2UpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldFByaW9yaXR5KCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldFByaW9yaXR5KCk7Ci0JfQotCi0JRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldFR5cGUoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0VHlwZSgpOwotCX0KLQotCXZvaWQgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6R2VuZXJhdGVNaXBTdWJMZXZlbHMoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCEodXNhZ2UgJiBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQKSB8fCAhdm9sdW1lTGV2ZWxbMF0tPmhhc0RpcnR5Q29udGVudHMoKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVzb3VyY2UtPmxvY2soc3c6OlBVQkxJQyk7Ci0KLQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGxldmVscyAtIDE7IGkrKykKLQkJewotCQkJRGlyZWN0M0RWb2x1bWU5ICpzb3VyY2UgPSB2b2x1bWVMZXZlbFtpXTsKLQkJCURpcmVjdDNEVm9sdW1lOSAqZGVzdCA9IHZvbHVtZUxldmVsW2kgKyAxXTsKLQotCQkJc291cmNlLT5sb2NrSW50ZXJuYWwoMCwgMCwgMCwgc3c6OkxPQ0tfUkVBRE9OTFksIHN3OjpQVUJMSUMpOwotCQkJZGVzdC0+bG9ja0ludGVybmFsKDAsIDAsIDAsIHN3OjpMT0NLX0RJU0NBUkQsIHN3OjpQVUJMSUMpOwotCi0JCQlpbnQgc1dpZHRoID0gc291cmNlLT5nZXRXaWR0aCgpOwotCQkJaW50IHNIZWlnaHQgPSBzb3VyY2UtPmdldEhlaWdodCgpOwotCQkJaW50IHNEZXB0aCA9IHNvdXJjZS0+Z2V0RGVwdGgoKTsKLQotCQkJaW50IGRXaWR0aCA9IGRlc3QtPmdldFdpZHRoKCk7Ci0JCQlpbnQgZEhlaWdodCA9IGRlc3QtPmdldEhlaWdodCgpOwotCQkJaW50IGREZXB0aCA9IGRlc3QtPmdldERlcHRoKCk7Ci0KLQkJCUQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlciA9IEdldEF1dG9HZW5GaWx0ZXJUeXBlKCk7Ci0KLQkJCWZsb2F0IHcgPSAoZmxvYXQpc1dpZHRoIC8gKGZsb2F0KWRXaWR0aDsKLQkJCWZsb2F0IGggPSAoZmxvYXQpc0hlaWdodCAvIChmbG9hdClkSGVpZ2h0OwotCQkJZmxvYXQgZCA9IChmbG9hdClzRGVwdGggLyAoZmxvYXQpZERlcHRoOwotCi0JCQlmbG9hdCB6ID0gMC41ZiAqIGQ7Ci0KLQkJCWZvcihpbnQgayA9IDA7IGsgPCBkRGVwdGg7IGsrKykKLQkJCXsKLQkJCQlmbG9hdCB5ID0gMC41ZiAqIGg7Ci0KLQkJCQlmb3IoaW50IGogPSAwOyBqIDwgZEhlaWdodDsgaisrKQotCQkJCXsKLQkJCQkJZmxvYXQgeCA9IDAuNWYgKiB3OwotCi0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBkV2lkdGg7IGkrKykKLQkJCQkJewotCQkJCQkJZGVzdC0+Y29weUludGVybmFsKHNvdXJjZSwgaSwgaiwgaywgeCwgeSwgeiwgZmlsdGVyID4gRDNEVEVYRl9QT0lOVCk7Ci0KLQkJCQkJCXggKz0gdzsKLQkJCQkJfQotCi0JCQkJCXkgKz0gaDsKLQkJCQl9Ci0KLQkJCQl6ICs9IGQ7Ci0JCQl9Ci0KLQkJCXNvdXJjZS0+dW5sb2NrSW50ZXJuYWwoKTsKLQkJCWRlc3QtPnVubG9ja0ludGVybmFsKCk7Ci0JCX0KLQotCQl2b2x1bWVMZXZlbFswXS0+bWFya0NvbnRlbnRzQ2xlYW4oKTsKLQotCQlyZXNvdXJjZS0+dW5sb2NrKCk7Ci0JfQotCi0JRDNEVEVYVFVSRUZJTFRFUlRZUEUgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6R2V0QXV0b0dlbkZpbHRlclR5cGUoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0QXV0b0dlbkZpbHRlclR5cGUoKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OkdldExldmVsQ291bnQoKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6R2V0TGV2ZWxDb3VudCgpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6R2V0TE9EKCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OkdldExPRCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6U2V0QXV0b0dlbkZpbHRlclR5cGUoRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyVHlwZSkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTk6OlNldEF1dG9HZW5GaWx0ZXJUeXBlKGZpbHRlclR5cGUpOwotCX0KLQotCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6U2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlOTo6U2V0TE9EKG5ld0xPRCk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpHZXRWb2x1bWVMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwsIElEaXJlY3QzRFZvbHVtZTkgKip2b2x1bWUpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJKnZvbHVtZSA9IDA7Ci0KLQkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICF2b2x1bWVMZXZlbFtsZXZlbF0pCi0JCXsKLQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwotCQl9Ci0KLQkJdm9sdW1lTGV2ZWxbbGV2ZWxdLT5BZGRSZWYoKTsKLQkJKnZvbHVtZSA9IHZvbHVtZUxldmVsW2xldmVsXTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6TG9ja0JveCh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRExPQ0tFRF9CT1ggKmxvY2tlZFZvbHVtZSwgY29uc3QgRDNEQk9YICpib3gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JewotCQlDcml0aWNhbFNlY3Rpb24gY3MoZGV2aWNlKTsKLQotCQlUUkFDRSgiIik7Ci0KLQkJaWYoIWxvY2tlZFZvbHVtZSB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXZvbHVtZUxldmVsW2xldmVsXSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlyZXR1cm4gdm9sdW1lTGV2ZWxbbGV2ZWxdLT5Mb2NrQm94KGxvY2tlZFZvbHVtZSwgYm94LCBmbGFncyk7Ci0JfQotCi0JbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU5OjpVbmxvY2tCb3godW5zaWduZWQgaW50IGxldmVsKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhdm9sdW1lTGV2ZWxbbGV2ZWxdKQotCQl7Ci0JCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKLQkJfQotCi0JCXJldHVybiB2b2x1bWVMZXZlbFtsZXZlbF0tPlVubG9ja0JveCgpOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6QWRkRGlydHlCb3goY29uc3QgRDNEQk9YICpkaXJ0eUJveCkKLQl7Ci0JCUNyaXRpY2FsU2VjdGlvbiBjcyhkZXZpY2UpOwotCi0JCVRSQUNFKCIiKTsKLQotCS8vCVVOSU1QTEVNRU5URUQoKTsKLQotCQlyZXR1cm4gRDNEX09LOwotCX0KLQotCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOTo6R2V0TGV2ZWxEZXNjKHVuc2lnbmVkIGludCBsZXZlbCwgRDNEVk9MVU1FX0RFU0MgKmRlc2NyaXB0aW9uKQotCXsKLQkJQ3JpdGljYWxTZWN0aW9uIGNzKGRldmljZSk7Ci0KLQkJVFJBQ0UoIiIpOwotCi0JCWlmKCFkZXNjcmlwdGlvbiB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXZvbHVtZUxldmVsW2xldmVsXSkKLQkJewotCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7Ci0JCX0KLQotCQlyZXR1cm4gdm9sdW1lTGV2ZWxbbGV2ZWxdLT5HZXREZXNjKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlEaXJlY3QzRFZvbHVtZTkgKkRpcmVjdDNEVm9sdW1lVGV4dHVyZTk6OmdldEludGVybmFsVm9sdW1lTGV2ZWwodW5zaWduZWQgaW50IGxldmVsKQotCXsKLQkJcmV0dXJuIHZvbHVtZUxldmVsW2xldmVsXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvRDNEOS9EaXJlY3QzRFZvbHVtZVRleHR1cmU5LmhwcCBiL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTkuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzRlMDZmLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTkuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBEM0Q5X0RpcmVjdDNEVm9sdW1lVGV4dHVyZTlfaHBwCi0jZGVmaW5lIEQzRDlfRGlyZWN0M0RWb2x1bWVUZXh0dXJlOV9ocHAKLQotI2luY2x1ZGUgIkRpcmVjdDNEQmFzZVRleHR1cmU5LmhwcCIKLQotI2luY2x1ZGUgIkNvbmZpZy5ocHAiCi0KLSNpbmNsdWRlIDxkM2Q5Lmg+Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JY2xhc3MgRGlyZWN0M0RWb2x1bWU5OwotCi0JY2xhc3MgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSA6IHB1YmxpYyBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSwgcHVibGljIERpcmVjdDNEQmFzZVRleHR1cmU5Ci0JewotCXB1YmxpYzoKLQkJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOShEaXJlY3QzRERldmljZTkgKmRldmljZSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgZGVwdGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCk7Ci0KLQkJfkRpcmVjdDNEVm9sdW1lVGV4dHVyZTkoKSBvdmVycmlkZTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTkgbWV0aG9kcwotCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOSAqKmRldmljZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpIG92ZXJyaWRlOwotCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRQcmlvcml0eSgpIG92ZXJyaWRlOwotCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCkgb3ZlcnJpZGU7Ci0JCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpIG92ZXJyaWRlOwotCi0JCS8vIElEaXJlY3QzREJhc2VUZXh0dXJlOSBtZXRob2RzCi0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldExPRCgpIG92ZXJyaWRlOwotCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMZXZlbENvdW50KCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIFNldEF1dG9HZW5GaWx0ZXJUeXBlKEQzRFRFWFRVUkVGSUxURVJUWVBFIGZpbHRlclR5cGUpIG92ZXJyaWRlOwotCQlEM0RURVhUVVJFRklMVEVSVFlQRSBfX3N0ZGNhbGwgR2V0QXV0b0dlbkZpbHRlclR5cGUoKSBvdmVycmlkZTsKLQkJdm9pZCBfX3N0ZGNhbGwgR2VuZXJhdGVNaXBTdWJMZXZlbHMoKSBvdmVycmlkZTsKLQotCQkvLyBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIEdldExldmVsRGVzYyh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRFZPTFVNRV9ERVNDICpkZXNjcmlwdGlvbikgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEdldFZvbHVtZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEVm9sdW1lOSAqKnZvbHVtZSkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIExvY2tCb3godW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfQk9YICpsb2NrZWRWb2x1bWUsIGNvbnN0IEQzREJPWCAqYm94LCB1bnNpZ25lZCBsb25nIGZsYWdzKSBvdmVycmlkZTsKLQkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrQm94KHVuc2lnbmVkIGludCBsZXZlbCkgb3ZlcnJpZGU7Ci0JCWxvbmcgX19zdGRjYWxsIEFkZERpcnR5Qm94KGNvbnN0IEQzREJPWCAqZGlydHlCb3gpIG92ZXJyaWRlOwotCi0JCS8vIEludGVybmFsIG1ldGhvZHMKLQkJRGlyZWN0M0RWb2x1bWU5ICpnZXRJbnRlcm5hbFZvbHVtZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCk7Ci0KLQlwcml2YXRlOgotCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCi0JCWNvbnN0IHVuc2lnbmVkIGludCB3aWR0aDsKLQkJY29uc3QgdW5zaWduZWQgaW50IGhlaWdodDsKLQkJY29uc3QgdW5zaWduZWQgaW50IGRlcHRoOwotCi0JCURpcmVjdDNEVm9sdW1lOSAqdm9sdW1lTGV2ZWxbc3c6Ok1JUE1BUF9MRVZFTFNdOwotCX07Ci19Ci0KLSNlbmRpZiAvLyBEM0Q5X0RpcmVjdDNEVm9sdW1lVGV4dHVyZTlfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOS9Vbmtub3duLmNwcCBiL3NyYy9EM0Q5L1Vua25vd24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmM0Y2EyLi4wMDAwMDAwCi0tLSBhL3NyYy9EM0Q5L1Vua25vd24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgIlVua25vd24uaHBwIgotCi0jaW5jbHVkZSAiRGVidWcuaHBwIgotCi1uYW1lc3BhY2UgRDNEOQotewotCVVua25vd246OlVua25vd24oKQotCXsKLQkJcmVmZXJlbmNlQ291bnQgPSAwOwotCQliaW5kQ291bnQgPSAwOwotCX0KLQotCVVua25vd246On5Vbmtub3duKCkKLQl7Ci0JCUFTU0VSVChyZWZlcmVuY2VDb3VudCA9PSAwKTsKLQkJQVNTRVJUKGJpbmRDb3VudCA9PSAwKTsKLQl9Ci0KLQlsb25nIFVua25vd246OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQotCXsKLQkJaWYoaWlkID09IElJRF9JVW5rbm93bikKLQkJewotCQkJQWRkUmVmKCk7Ci0JCQkqb2JqZWN0ID0gdGhpczsKLQotCQkJcmV0dXJuIFNfT0s7Ci0JCX0KLQotCQkqb2JqZWN0ID0gMDsKLQotCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIFVua25vd246OkFkZFJlZigpCi0JewotCQlyZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnJlZmVyZW5jZUNvdW50KTsKLQl9Ci0KLQl1bnNpZ25lZCBsb25nIFVua25vd246OlJlbGVhc2UoKQotCXsKLQkJaW50IGN1cnJlbnQgPSByZWZlcmVuY2VDb3VudDsKLQotCQlpZihyZWZlcmVuY2VDb3VudCA+IDApCi0JCXsKLQkJCWN1cnJlbnQgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmcmVmZXJlbmNlQ291bnQpOwotCQl9Ci0KLQkJaWYocmVmZXJlbmNlQ291bnQgPT0gMCAmJiBiaW5kQ291bnQgPT0gMCkKLQkJewotCQkJZGVsZXRlIHRoaXM7Ci0JCX0KLQotCQlyZXR1cm4gY3VycmVudDsKLQl9Ci0KLQl2b2lkIFVua25vd246OmJpbmQoKQotCXsKLQkJSW50ZXJsb2NrZWRJbmNyZW1lbnQoJmJpbmRDb3VudCk7Ci0JfQotCi0Jdm9pZCBVbmtub3duOjp1bmJpbmQoKQotCXsKLQkJQVNTRVJUKGJpbmRDb3VudCA+IDApOwotCi0JCUludGVybG9ja2VkRGVjcmVtZW50KCZiaW5kQ291bnQpOwotCi0JCWlmKHJlZmVyZW5jZUNvdW50ID09IDAgJiYgYmluZENvdW50ID09IDApCi0JCXsKLQkJCWRlbGV0ZSB0aGlzOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L1Vua25vd24uaHBwIGIvc3JjL0QzRDkvVW5rbm93bi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NmY4ODEuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvVW5rbm93bi5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIEQzRDlfVW5rbm93bl9ocHAKLSNkZWZpbmUgRDNEOV9Vbmtub3duX2hwcAotCi0jaW5jbHVkZSA8dW5rbnduLmg+Ci0KLW5hbWVzcGFjZSBEM0Q5Ci17Ci0JY2xhc3MgVW5rbm93biA6IElVbmtub3duCi0JewotCXB1YmxpYzoKLQkJVW5rbm93bigpOwotCi0JCXZpcnR1YWwgflVua25vd24oKTsKLQotCQkvLyBJVW5rbm93biBtZXRob2RzCi0JCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KSBvdmVycmlkZTsKLQkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCkgb3ZlcnJpZGU7Ci0JCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKSBvdmVycmlkZTsKLQotCQkvLyBJbnRlcm5hbCBtZXRob2RzCi0JCXZpcnR1YWwgdm9pZCBiaW5kKCk7Ci0JCXZpcnR1YWwgdm9pZCB1bmJpbmQoKTsKLQotCXByaXZhdGU6Ci0JCXZvbGF0aWxlIGxvbmcgcmVmZXJlbmNlQ291bnQ7Ci0JCXZvbGF0aWxlIGxvbmcgYmluZENvdW50OwotCX07Ci19Ci0KLSNlbmRpZiAgIC8vIEQzRDlfVW5rbm93bl9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L2QzZDkuZGVmIGIvc3JjL0QzRDkvZDNkOS5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTQyN2MuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvZDNkOS5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MSUJSQVJZIEQzRDkKLUVYUE9SVFMKLQlEaXJlY3QzRFNoYWRlclZhbGlkYXRvckNyZWF0ZTkJQDEKLQlQU0dQRXJyb3IJCQkJCQlAMgotCVBTR1BTYW1wbGVUZXh0dXJlCQkJCUAzCi0JRDNEUEVSRl9CZWdpbkV2ZW50CQkJCUA0Ci0JRDNEUEVSRl9FbmRFdmVudAkJCQlANQotCUQzRFBFUkZfR2V0U3RhdHVzCQkJCUA2Ci0JRDNEUEVSRl9RdWVyeVJlcGVhdEZyYW1lCQlANwotCUQzRFBFUkZfU2V0TWFya2VyCQkJCUA4Ci0JRDNEUEVSRl9TZXRPcHRpb25zCQkJCUA5Ci0JRDNEUEVSRl9TZXRSZWdpb24JCQkJQDEwCi0JRGVidWdTZXRMZXZlbAkJCQkJQDExCi0JRGVidWdTZXRNdXRlCQkJCQlAMTIKLQlEaXJlY3QzRENyZWF0ZTkJCQkJCUAxMwotCURpcmVjdDNEQ3JlYXRlOUV4CQkJCUAxNApkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvcmVzb3VyY2UuaCBiL3NyYy9EM0Q5L3Jlc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Nzk2MDAuLjAwMDAwMDAKLS0tIGEvc3JjL0QzRDkvcmVzb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8ve3tOT19ERVBFTkRFTkNJRVN9fQotLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZS4KLS8vIFVzZWQgYnkgRDNEOS5yYwotI2RlZmluZSBJRERfRElBTE9HMSAgICAgICAgICAgICAgICAgICAgIDEwMQotI2RlZmluZSBJRENfU1RBVElDICAgICAgICAgICAgICAgICAgICAgIC0xCi0KLS8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCi0vLyAKLSNpZmRlZiBBUFNUVURJT19JTlZPS0VECi0jaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKLSNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFICAgICAgICAxMDEKLSNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICA0MDAwMQotI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAgICAgICAgIDEwMDEKLSNkZWZpbmUgX0FQU19ORVhUX1NZTUVEX1ZBTFVFICAgICAgICAgICAxMDEKLSNlbmRpZgotI2VuZGlmCg==