LyoNCiAqIENvcHlyaWdodCAoYykgMjAxNyAtIDIwMTggLCBOWFANCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQ0KICovDQoNCiNpbmNsdWRlICJmc2xfY29tbW9uLmgiDQojaW5jbHVkZSAiZnNsX2Nsb2NrLmgiDQojaW5jbHVkZSAiZnNsX3Bvd2VyLmgiDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogRGVmaW5pdGlvbnMNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBDb21wb25lbnQgSUQgZGVmaW5pdGlvbiwgdXNlZCBieSB0b29scy4gKi8NCiNpZm5kZWYgRlNMX0NPTVBPTkVOVF9JRA0KI2RlZmluZSBGU0xfQ09NUE9ORU5UX0lEICJwbGF0Zm9ybS5kcml2ZXJzLmNsb2NrIg0KI2VuZGlmDQojZGVmaW5lIE5WQUxNQVggKDB4MTAwVSkNCiNkZWZpbmUgUFZBTE1BWCAoMHgyMFUpDQojZGVmaW5lIE1WQUxNQVggKDB4MTAwMDBVKQ0KDQojZGVmaW5lIFBMTF9NQVhfTl9ESVYgMHgxMDBVDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiEhISBJZiByZXF1aXJlZCB0aGVzZSAjZGVmaW5lcyBjYW4gYmUgbW92ZWQgdG8gY2hpcCBsaWJyYXJ5IGZpbGUNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojZGVmaW5lIFBMTF9TU0NHMV9NREVDX1ZBTF9QICgxMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ERUMgaXMgaW4gYml0cyAgMTYgZG93bnRvIDAgKi8NCiNkZWZpbmUgUExMX1NTQ0cxX01ERUNfVkFMX00gKDB4M0ZGRkMwMFVMTCA8PCBQTExfU1NDRzFfTURFQ19WQUxfUCkgLyogTkRFQyBpcyBpbiBiaXRzICA5IGRvd250byAwICovDQojZGVmaW5lIFBMTF9OREVDX1ZBTF9QICgwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ERUMgaXMgaW4gYml0cyAgOTowICovDQojZGVmaW5lIFBMTF9OREVDX1ZBTF9NICgweEZGVUwgPDwgUExMX05ERUNfVkFMX1ApDQojZGVmaW5lIFBMTF9QREVDX1ZBTF9QICgwVSkgLyohPCAgUERFQyBpcyBpbiBiaXRzIDY6MCAqLw0KI2RlZmluZSBQTExfUERFQ19WQUxfTSAoMHgxRlVMIDw8IFBMTF9QREVDX1ZBTF9QKQ0KDQojZGVmaW5lIFBMTF9NSU5fQ0NPX0ZSRVFfTUhaICgyNzUwMDAwMDBVKQ0KI2RlZmluZSBQTExfTUFYX0NDT19GUkVRX01IWiAoNTUwMDAwMDAwVSkNCiNkZWZpbmUgUExMX0xPV0VSX0lOX0xJTUlUICgyMDAwVSkgLyohPCAgTWluaW11bSBQTEwgaW5wdXQgcmF0ZSAqLw0KI2RlZmluZSBQTExfSElHSEVSX0lOX0xJTUlUICgxNTAwMDAwMDBVKSAvKiE8ICBNYXhpbXVtIFBMTCBpbnB1dCByYXRlICovDQojZGVmaW5lIFBMTF9NSU5fSU5fU1NNT0RFICgzMDAwMDAwVSkNCiNkZWZpbmUgUExMX01BWF9JTl9TU01PREUgKDEwMDAwMDAwMFUpIC8qITwgIE5vdCBmaW5kIHRoZSB2YWx1ZSBpbiBVTSwgSnVzdCB1c2UgdGhlIG1heGltdW0gZnJlcXVlbmN5IHdoaWNoIGRldmljZSBzdXBwb3J0ICovDQoNCi8qIFBMTCBOREVDIHJlZyAqLw0KI2RlZmluZSBQTExfTkRFQ19WQUxfU0VUKHZhbHVlKSAoKCh1bnNpZ25lZCBsb25nKSh2YWx1ZSkgPDwgUExMX05ERUNfVkFMX1ApICYgUExMX05ERUNfVkFMX00pDQovKiBQTEwgUERFQyByZWcgKi8NCiNkZWZpbmUgUExMX1BERUNfVkFMX1NFVCh2YWx1ZSkgKCgodW5zaWduZWQgbG9uZykodmFsdWUpIDw8IFBMTF9QREVDX1ZBTF9QKSAmIFBMTF9QREVDX1ZBTF9NKQ0KLyogU1NDRyBjb250cm9sMCAqLw0KI2RlZmluZSBQTExfU1NDRzFfTURFQ19WQUxfU0VUKHZhbHVlKSAoKCh1bnNpZ25lZCBsb25nKSh2YWx1ZSkgPDwgUExMX1NTQ0cxX01ERUNfVkFMX1ApICYgUExMX1NTQ0cxX01ERUNfVkFMX00pDQoNCi8qIFBMTDAgU1NDRyBjb250cm9sMSAqLw0KI2RlZmluZSBQTEwwX1NTQ0dfTURfRlJBQ1RfUCAwVQ0KI2RlZmluZSBQTEwwX1NTQ0dfTURfSU5UX1AgMjVVDQojZGVmaW5lIFBMTDBfU1NDR19NRF9GUkFDVF9NICgweDFGRkZGRkZVTCA8PCBQTEwwX1NTQ0dfTURfRlJBQ1RfUCkNCiNkZWZpbmUgUExMMF9TU0NHX01EX0lOVF9NICgodWludDY0X3QpMHhGRlVMIDw8IFBMTDBfU1NDR19NRF9JTlRfUCkNCg0KI2RlZmluZSBQTEwwX1NTQ0dfTURfRlJBQ1RfU0VUKHZhbHVlKSAoKCh1aW50NjRfdCkodmFsdWUpIDw8IFBMTDBfU1NDR19NRF9GUkFDVF9QKSAmIFBMTDBfU1NDR19NRF9GUkFDVF9NKQ0KI2RlZmluZSBQTEwwX1NTQ0dfTURfSU5UX1NFVCh2YWx1ZSkgKCgodWludDY0X3QpKHZhbHVlKSA8PCBQTEwwX1NTQ0dfTURfSU5UX1ApICYgUExMMF9TU0NHX01EX0lOVF9NKQ0KDQovKiBTYXZlZCB2YWx1ZSBvZiBQTEwgb3V0cHV0IHJhdGUsIGNvbXB1dGVkIHdoZW5ldmVyIG5lZWRlZCB0byBzYXZlIHJ1bi10aW1lDQogICBjb21wdXRhdGlvbiBvbiBlYWNoIGNhbGwgdG8gcmV0cml2ZSB0aGUgUExMIHJhdGUuICovDQpzdGF0aWMgdWludDMyX3Qgc19QbGwwX0ZyZXE7DQpzdGF0aWMgdWludDMyX3Qgc19QbGwxX0ZyZXE7DQoNCi8qKiBFeHRlcm5hbCBjbG9jayByYXRlIG9uIHRoZSBDTEtJTiBwaW4gaW4gSHouIElmIG5vdCB1c2VkLA0KICAgIHNldCB0aGlzIHRvIDAuIE90aGVyd2lzZSwgc2V0IGl0IHRvIHRoZSBleGFjdCByYXRlIGluIEh6IHRoaXMgcGluIGlzDQogICAgYmVpbmcgZHJpdmVuIGF0LiAqLw0Kc3RhdGljIHVpbnQzMl90IHNfRXh0X0Nsa19GcmVxID0gMTYwMDAwMDBVOw0Kc3RhdGljIHVpbnQzMl90IHNfSTJTX01jbGtfRnJlcSA9IDBVOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogVmFyaWFibGVzDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogUHJvdG90eXBlcw0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIEZpbmQgU0VMUCwgU0VMSSwgYW5kIFNFTFIgdmFsdWVzIGZvciByYXcgTSB2YWx1ZSwgbWF4IE0gPSBNVkFMTUFYICovDQpzdGF0aWMgdm9pZCBwbGxGaW5kU2VsKHVpbnQzMl90IE0sIHVpbnQzMl90ICpwU2VsUCwgdWludDMyX3QgKnBTZWxJLCB1aW50MzJfdCAqcFNlbFIpOw0KLyogR2V0IHByZWRpdmlkZXIgKE4pIGZyb20gUExMMCBOREVDIHNldHRpbmcgKi8NCnN0YXRpYyB1aW50MzJfdCBmaW5kUGxsMFByZURpdih2b2lkKTsNCi8qIEdldCBwcmVkaXZpZGVyIChOKSBmcm9tIFBMTDEgTkRFQyBzZXR0aW5nICovDQpzdGF0aWMgdWludDMyX3QgZmluZFBsbDFQcmVEaXYodm9pZCk7DQovKiBHZXQgcG9zdGRpdmlkZXIgKFApIGZyb20gUExMMCBQREVDIHNldHRpbmcgKi8NCnN0YXRpYyB1aW50MzJfdCBmaW5kUGxsMFBvc3REaXYodm9pZCk7DQovKiBHZXQgbXVsdGlwbGllciAoTSkgZnJvbSBQTEwwIE1ERUMgYW5kIFNTQ0cgc2V0dGluZ3MgKi8NCnN0YXRpYyBmbG9hdCBmaW5kUGxsME1NdWx0KHZvaWQpOw0KLyogR2V0IHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciAqLw0Kc3RhdGljIHVpbnQzMl90IEZpbmRHcmVhdGVzdENvbW1vbkRpdmlzb3IodWludDMyX3QgbSwgdWludDMyX3Qgbik7DQovKiBTZXQgUExMIG91dHB1dCBiYXNlZCBvbiBkZXNpcmVkIG91dHB1dCByYXRlICovDQpzdGF0aWMgcGxsX2Vycm9yX3QgQ0xPQ0tfR2V0UGxsMENvbmZpZygNCiAgICB1aW50MzJfdCBmaW5IeiwgdWludDMyX3QgZm91dEh6LCBwbGxfc2V0dXBfdCAqcFNldHVwLCBib29sIHVzZVNTKTsNCi8qIFVwZGF0ZSBsb2NhbCBQTEwgcmF0ZSB2YXJpYWJsZSAqLw0Kc3RhdGljIHZvaWQgQ0xPQ0tfR2V0UExMME91dEZyb21TZXR1cFVwZGF0ZShwbGxfc2V0dXBfdCAqcFNldHVwKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvZGUNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIENsb2NrIFNlbGVjdGlvbiBmb3IgSVAgKi8NCi8qKg0KICogYnJpZWYgICBDb25maWd1cmUgdGhlIGNsb2NrIHNlbGVjdGlvbiBtdXhlcy4NCiAqIHBhcmFtICAgY29ubmVjdGlvbiAgOiBDbG9jayB0byBiZSBjb25maWd1cmVkLg0KICogcmV0dXJuICBOb3RoaW5nDQogKi8NCnZvaWQgQ0xPQ0tfQXR0YWNoQ2xrKGNsb2NrX2F0dGFjaF9pZF90IGNvbm5lY3Rpb24pDQp7DQogICAgdWludDhfdCBtdXg7DQogICAgdWludDhfdCBzZWw7DQogICAgdWludDE2X3QgaXRlbTsNCiAgICB1aW50MzJfdCBpOw0KICAgIHZvbGF0aWxlIHVpbnQzMl90ICpwQ2xrU2VsOw0KDQogICAgcENsa1NlbCA9ICYoU1lTQ09OLT5TWVNUSUNLQ0xLU0VMWFswXSk7DQoNCiAgICBpZiAoY29ubmVjdGlvbiAhPSBrTk9ORV90b19OT05FKQ0KICAgIHsNCiAgICAgICAgZm9yIChpID0gMFU7IGkgPCAyVTsgaSsrKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSAwVSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGl0ZW0gPSAodWludDE2X3QpR0VUX0lEX0lURU0oY29ubmVjdGlvbik7DQogICAgICAgICAgICBpZiAoaXRlbSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBtdXggPSBHRVRfSURfSVRFTV9NVVgoaXRlbSk7DQogICAgICAgICAgICAgICAgc2VsID0gR0VUX0lEX0lURU1fU0VMKGl0ZW0pOw0KICAgICAgICAgICAgICAgIGlmIChtdXggPT0gQ01fUlRDT1NDMzJLQ0xLU0VMKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgUE1DLT5SVENPU0MzMksgfD0gc2VsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBwQ2xrU2VsW211eF0gPSBzZWw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY29ubmVjdGlvbiA9IEdFVF9JRF9ORVhUX0lURU0oY29ubmVjdGlvbik7IC8qIHBpY2sgdXAgbmV4dCBkZXNjcmlwdG9yICovDQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8qIFJldHVybiB0aGUgYWN0dWFsIGNsb2NrIGF0dGFjaCBpZCAqLw0KLyoqDQogKiBicmllZiAgIEdldCB0aGUgYWN0dWFsIGNsb2NrIGF0dGFjaCBpZC4NCiAqIFRoaXMgZnVjdGlvbiB1c2VzIHRoZSBvZmZzZXQgaW4gaW5wdXQgYXR0YWNoIGlkLCB0aGVuIGl0IHJlYWRzIHRoZSBhY3R1YWwgc291cmNlIHZhbHVlIGluDQogKiB0aGUgcmVnaXN0ZXIgYW5kIGNvbWJpbmUgdGhlIG9mZnNldCB0byBvYnRhaW4gYW4gYWN0dWFsIGF0dGFjaCBpZC4NCiAqIHBhcmFtICAgYXR0YWNoSWQgIDogQ2xvY2sgYXR0YWNoIGlkIHRvIGdldC4NCiAqIHJldHVybiAgQ2xvY2sgc291cmNlIHZhbHVlLg0KICovDQpjbG9ja19hdHRhY2hfaWRfdCBDTE9DS19HZXRDbG9ja0F0dGFjaElkKGNsb2NrX2F0dGFjaF9pZF90IGF0dGFjaElkKQ0Kew0KICAgIHVpbnQ4X3QgbXV4Ow0KICAgIHVpbnQ4X3QgYWN0dWFsU2VsOw0KICAgIHVpbnQzMl90IGk7DQogICAgdWludDMyX3QgYWN0dWFsQXR0YWNoSWQgPSAwVTsNCiAgICB1aW50MzJfdCBzZWxlY3RvciA9IEdFVF9JRF9TRUxFQ1RPUihhdHRhY2hJZCk7DQogICAgdm9sYXRpbGUgdWludDMyX3QgKnBDbGtTZWw7DQoNCiAgICBwQ2xrU2VsID0gJihTWVNDT04tPlNZU1RJQ0tDTEtTRUxYWzBdKTsNCg0KICAgIGlmIChhdHRhY2hJZCA9PSBrTk9ORV90b19OT05FKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIGtOT05FX3RvX05PTkU7DQogICAgfQ0KDQogICAgZm9yIChpID0gMFU7IGkgPCAyVTsgaSsrKQ0KICAgIHsNCiAgICAgICAgbXV4ID0gR0VUX0lEX0lURU1fTVVYKGF0dGFjaElkKTsNCiAgICAgICAgaWYgKGF0dGFjaElkKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAobXV4ID09IENNX1JUQ09TQzMyS0NMS1NFTCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBhY3R1YWxTZWwgPSBQTUMtPlJUQ09TQzMySzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBhY3R1YWxTZWwgPSBwQ2xrU2VsW211eF07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8qIENvbnNpZGVyIHRoZSBjb21iaW5hdGlvbiBvZiB0d28gcmVnaXN0ZXJzICovDQogICAgICAgICAgICBhY3R1YWxBdHRhY2hJZCB8PSBDTEtfQVRUQUNIX0lEKG11eCwgYWN0dWFsU2VsLCBpKTsNCiAgICAgICAgfQ0KICAgICAgICBhdHRhY2hJZCA9IEdFVF9JRF9ORVhUX0lURU0oYXR0YWNoSWQpOyAvKiE8ICBwaWNrIHVwIG5leHQgZGVzY3JpcHRvciAqLw0KICAgIH0NCg0KICAgIGFjdHVhbEF0dGFjaElkIHw9IHNlbGVjdG9yOw0KDQogICAgcmV0dXJuIChjbG9ja19hdHRhY2hfaWRfdClhY3R1YWxBdHRhY2hJZDsNCn0NCg0KLyogU2V0IElQIENsb2NrIERpdmlkZXIgKi8NCi8qKg0KICogYnJpZWYgICBTZXR1cCBwZXJpcGhlcmFsIGNsb2NrIGRpdmlkZXJzLg0KICogcGFyYW0gICBkaXZfbmFtZSAgICA6IENsb2NrIGRpdmlkZXIgbmFtZQ0KICogcGFyYW0gZGl2aWRlZF9ieV92YWx1ZTogVmFsdWUgdG8gYmUgZGl2aWRlZA0KICogcGFyYW0gcmVzZXQgOiAgV2hldGhlciB0byByZXNldCB0aGUgZGl2aWRlciBjb3VudGVyLg0KICogcmV0dXJuICBOb3RoaW5nDQogKi8NCnZvaWQgQ0xPQ0tfU2V0Q2xrRGl2KGNsb2NrX2Rpdl9uYW1lX3QgZGl2X25hbWUsIHVpbnQzMl90IGRpdmlkZWRfYnlfdmFsdWUsIGJvb2wgcmVzZXQpDQp7DQogICAgdm9sYXRpbGUgdWludDMyX3QgKnBDbGtEaXY7DQoNCiAgICBwQ2xrRGl2ID0gJihTWVNDT04tPlNZU1RJQ0tDTEtESVYwKTsNCiAgICBpZiAocmVzZXQpDQogICAgew0KICAgICAgICBwQ2xrRGl2W2Rpdl9uYW1lXSA9IDFVIDw8IDI5VTsNCiAgICB9DQogICAgaWYgKGRpdmlkZWRfYnlfdmFsdWUgPT0gMFUpIC8qITwgIGhhbHQgKi8NCiAgICB7DQogICAgICAgIHBDbGtEaXZbZGl2X25hbWVdID0gMVUgPDwgMzBVOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBwQ2xrRGl2W2Rpdl9uYW1lXSA9IChkaXZpZGVkX2J5X3ZhbHVlIC0gMVUpOw0KICAgIH0NCn0NCg0KLyogU2V0IFJUQyAxS0h6IENsb2NrIERpdmlkZXIgKi8NCi8qKg0KICogYnJpZWYgICBTZXR1cCBydGMgMWtoeiBjbG9jayBkaXZpZGVyLg0KICogcGFyYW0gZGl2aWRlZF9ieV92YWx1ZTogVmFsdWUgdG8gYmUgZGl2aWRlZA0KICogcmV0dXJuICBOb3RoaW5nDQogKi8NCnZvaWQgQ0xPQ0tfU2V0UnRjMWtoekNsa0Rpdih1aW50MzJfdCBkaXZpZGVkX2J5X3ZhbHVlKQ0Kew0KICAgIFBNQy0+UlRDT1NDMzJLIHw9ICgoKGRpdmlkZWRfYnlfdmFsdWUgLSAyOFUpIDw8IFBNQ19SVENPU0MzMktfQ0xLMUtIWkRJVl9TSElGVCkgfCBQTUNfUlRDT1NDMzJLX0NMSzFLSFpESVZfTUFTSyk7DQp9DQoNCi8qIFNldCBSVEMgMUtIeiBDbG9jayBEaXZpZGVyICovDQovKioNCiAqIGJyaWVmICAgU2V0dXAgcnRjIDFoeiBjbG9jayBkaXZpZGVyLg0KICogcGFyYW0gZGl2aWRlZF9ieV92YWx1ZTogVmFsdWUgdG8gYmUgZGl2aWRlZA0KICogcmV0dXJuICBOb3RoaW5nDQogKi8NCnZvaWQgQ0xPQ0tfU2V0UnRjMWh6Q2xrRGl2KHVpbnQzMl90IGRpdmlkZWRfYnlfdmFsdWUpDQp7DQogICAgaWYgKGRpdmlkZWRfYnlfdmFsdWUgPT0gMFUpIC8qITwgIGhhbHQgKi8NCiAgICB7DQogICAgICAgIFBNQy0+UlRDT1NDMzJLIHw9ICgxVSA8PCBQTUNfUlRDT1NDMzJLX0NMSzFIWkRJVkhBTFRfU0hJRlQpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBQTUMtPlJUQ09TQzMySyB8PQ0KICAgICAgICAgICAgKCgoZGl2aWRlZF9ieV92YWx1ZSAtIDMxNzQ0VSkgPDwgUE1DX1JUQ09TQzMyS19DTEsxSFpESVZfU0hJRlQpIHwgUE1DX1JUQ09TQzMyS19DTEsxSFpESVZfTUFTSyk7DQogICAgfQ0KfQ0KDQovKiBTZXQgRlJPIENsb2NraW5nICovDQovKioNCiAqIGJyaWVmICAgSW5pdGlhbGl6ZSB0aGUgQ29yZSBjbG9jayB0byBnaXZlbiBmcmVxdWVuY3kgKDEyLCA0OCBvciA5NiBNSHopLg0KICogVHVybnMgb24gRlJPIGFuZCB1c2VzIGRlZmF1bHQgQ0NPLCBpZiBmcmVxIGlzIDEyMDAwMDAwLCB0aGVuIGhpZ2ggc3BlZWQgb3V0cHV0IGlzIG9mZiwgZWxzZSBoaWdoIHNwZWVkIG91dHB1dCBpcw0KICogZW5hYmxlZC4NCiAqIHBhcmFtICAgaUZyZXEgICA6IERlc2lyZWQgZnJlcXVlbmN5IChtdXN0IGJlIG9uZSBvZiAjQ0xLX0ZST18xMk1IWiBvciAjQ0xLX0ZST180OE1IWiBvciAjQ0xLX0ZST185Nk1IWikNCiAqIHJldHVybiAgcmV0dXJucyBzdWNjZXNzIG9yIGZhaWwgc3RhdHVzLg0KICovDQpzdGF0dXNfdCBDTE9DS19TZXR1cEZST0Nsb2NraW5nKHVpbnQzMl90IGlGcmVxKQ0Kew0KICAgIGlmICgoaUZyZXEgIT0gMTIwMDAwMDBVKSAmJiAoaUZyZXEgIT0gNDgwMDAwMDBVKSAmJiAoaUZyZXEgIT0gOTYwMDAwMDBVKSkNCiAgICB7DQogICAgICAgIHJldHVybiBrU3RhdHVzX0ZhaWw7DQogICAgfQ0KICAgIC8qIEVuYWJsZSBBbmFsb2cgQ29udHJvbCBtb2R1bGUgKi8NCiAgICBTWVNDT04tPlBSRVNFVENUUkxDTFJbMl0gPSAoMVUgPDwgU1lTQ09OX1BSRVNFVENUUkwyX0FOQUxPR19DVFJMX1JTVF9TSElGVCk7DQogICAgU1lTQ09OLT5BSEJDTEtDVFJMU0VUWzJdID0gU1lTQ09OX0FIQkNMS0NUUkwyX0FOQUxPR19DVFJMX01BU0s7DQogICAgLyogUG93ZXIgdXAgdGhlIEZSTzE5Mk0gKi8NCiAgICBQT1dFUl9EaXNhYmxlUEQoa1BEUlVOQ0ZHX1BEX0ZSTzE5Mk0pOw0KDQogICAgaWYgKGlGcmVxID09IDk2MDAwMDAwVSkNCiAgICB7DQogICAgICAgIEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCB8PSBBTkFDVFJMX0ZSTzE5Mk1fQ1RSTF9FTkFfOTZNSFpDTEsoMSk7DQogICAgfQ0KICAgIGVsc2UgaWYgKGlGcmVxID09IDQ4MDAwMDAwVSkNCiAgICB7DQogICAgICAgIEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCB8PSBBTkFDVFJMX0ZSTzE5Mk1fQ1RSTF9FTkFfNDhNSFpDTEsoMSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCB8PSBBTkFDVFJMX0ZSTzE5Mk1fQ1RSTF9FTkFfMTJNSFpDTEsoMSk7DQogICAgfQ0KICAgIHJldHVybiAwVTsNCn0NCg0KLyogU2V0IHRoZSBGTEFTSCB3YWl0IHN0YXRlcyBmb3IgdGhlIHBhc3NlZCBmcmVxdWVuY3kgKi8NCi8qKg0KICogYnJpZWYJU2V0IHRoZSBmbGFzaCB3YWl0IHN0YXRlcyBmb3IgdGhlIGlucHV0IGZyZXVxZW5jeS4NCiAqIHBhcmFtCWlGcmVxCTogSW5wdXQgZnJlcXVlbmN5DQogKiByZXR1cm4JTm90aGluZw0KICovDQp2b2lkIENMT0NLX1NldEZMQVNIQWNjZXNzQ3ljbGVzRm9yRnJlcSh1aW50MzJfdCBpRnJlcSkNCnsNCiAgICB1aW50MzJfdCBudW1fd2FpdF9zdGF0ZXM7DQogICAgZmxvYXQgZl9udW1fd2FpdF9zdGF0ZXMgPSAwLjAwMDAwMDA5ICogKChmbG9hdClpRnJlcSk7DQogICAgLyogUmF0aW9uYWwgOiB0aW1pbmcgaXMgY2xvc2VkIGF0IDEwME1IeisxMCUgdG9sZXJhbmNlLCBoZW5jZSB0aGUgoa45oa8gaW4gdGhlIGZvcm11bGEgYWJvdmUgKi8NCiAgICBudW1fd2FpdF9zdGF0ZXMgPSAodWludDMyX3QpZl9udW1fd2FpdF9zdGF0ZXM7DQoNCiAgICAvKg0KICAgICAqIEl0IGlzIGd1YXJhbnRlZWQgYnkgZGVzaWduIHRoYXQgIm51bV93YWl0X3N0YXRlcyA9IDgiDQogICAgICogd2lsbCBmaXQgYWxsIGZyZXF1ZW5jaWVzIChiZWxvdyBhbmQgaW5jbHVkaW5nKSAxMDAgTUh6Lg0KICAgICAqLw0KICAgIGlmIChudW1fd2FpdF9zdGF0ZXMgPj0gOSkNCiAgICB7DQogICAgICAgIG51bV93YWl0X3N0YXRlcyA9IDg7DQogICAgfQ0KDQogICAgLyogRG9uJ3QgYWx0ZXIgb3RoZXIgYml0cyAqLw0KICAgIFNZU0NPTi0+Rk1DQ1IgPSAoU1lTQ09OLT5GTUNDUiAmIH5TWVNDT05fRk1DQ1JfRk1DVElNX01BU0spIHwNCiAgICAgICAgICAgICAgICAgICAgKChudW1fd2FpdF9zdGF0ZXMgIDw8IFNZU0NPTl9GTUNDUl9GTUNUSU1fU0hJRlQpICYgU1lTQ09OX0ZNQ0NSX0ZNQ1RJTV9NQVNLKTsNCn0NCg0KLyogU2V0IEVYVCBPU0MgQ2xrICovDQovKioNCiAqIGJyaWVmICAgSW5pdGlhbGl6ZSB0aGUgZXh0ZXJuYWwgb3NjIGNsb2NrIHRvIGdpdmVuIGZyZXF1ZW5jeS4NCiAqIHBhcmFtICAgaUZyZXEgICA6IERlc2lyZWQgZnJlcXVlbmN5IChtdXN0IGJlIGVxdWFsIHRvIGV4YWN0IHJhdGUgaW4gSHopDQogKiByZXR1cm4gIHJldHVybnMgc3VjY2VzcyBvciBmYWlsIHN0YXR1cy4NCiAqLw0Kc3RhdHVzX3QgQ0xPQ0tfU2V0dXBFeHRDbG9ja2luZyh1aW50MzJfdCBpRnJlcSkNCnsNCiAgICBpZiAoaUZyZXEgPj0gMzIwMDAwMDBVKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIGtTdGF0dXNfRmFpbDsNCiAgICB9DQogICAgLyogVHVybiBvbiBwb3dlciBmb3IgY3J5c3RhbCAzMiBNSHogKi8NCiAgICBQT1dFUl9EaXNhYmxlUEQoa1BEUlVOQ0ZHX1BEX1hUQUwzMk0pOw0KICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfTERPWE8zMk0pOw0KICAgIC8qIEVuYWJsZSBjbG9ja19pbiBjbG9jayBmb3IgY2xvY2sgbW9kdWxlLiAqLw0KICAgIFNZU0NPTi0+Q0xPQ0tfQ1RSTCB8PSBTWVNDT05fQ0xPQ0tfQ1RSTF9DTEtJTl9FTkFfTUFTSzsNCg0KICAgIHNfRXh0X0Nsa19GcmVxID0gaUZyZXE7DQogICAgcmV0dXJuIDBVOw0KfQ0KDQovKiBTZXQgSTJTIE1DTEsgQ2xrICovDQovKioNCiAqIGJyaWVmICAgSW5pdGlhbGl6ZSB0aGUgSTJTIE1DTEsgY2xvY2sgdG8gZ2l2ZW4gZnJlcXVlbmN5Lg0KICogcGFyYW0gICBpRnJlcSAgIDogRGVzaXJlZCBmcmVxdWVuY3kgKG11c3QgYmUgZXF1YWwgdG8gZXhhY3QgcmF0ZSBpbiBIeikNCiAqIHJldHVybiAgcmV0dXJucyBzdWNjZXNzIG9yIGZhaWwgc3RhdHVzLg0KICovDQpzdGF0dXNfdCBDTE9DS19TZXR1cEkyU01DbGtDbG9ja2luZyh1aW50MzJfdCBpRnJlcSkNCnsNCiAgICBzX0kyU19NY2xrX0ZyZXEgPSBpRnJlcTsNCiAgICByZXR1cm4gMFU7DQp9DQoNCi8qIEdldCBDTE9DSyBPVVQgQ2xrICovDQovKiEgYnJpZWYgIFJldHVybiBGcmVxdWVuY3kgb2YgQ2xvY2tPdXQNCiAqICByZXR1cm4gRnJlcXVlbmN5IG9mIENsb2NrT3V0DQogKi8NCnVpbnQzMl90IENMT0NLX0dldENsb2NrT3V0Q2xrRnJlcSh2b2lkKQ0Kew0KICAgIHVpbnQzMl90IGZyZXEgPSAwVTsNCg0KICAgIHN3aXRjaCAoU1lTQ09OLT5DTEtPVVRTRUwpDQogICAgew0KICAgICAgICBjYXNlIDBVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldENvcmVTeXNDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDFVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldFBsbDBPdXRGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDJVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldEV4dENsa0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgIGNhc2UgM1U6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0RnJvSGZGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDRVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldEZybzFNRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSA1VToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRQbGwxT3V0RnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSA2VToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRPc2MzMktGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDdVOg0KICAgICAgICAgICAgZnJlcSA9IDBVOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICByZXR1cm4gZnJlcSAvICgoU1lTQ09OLT5DTEtPVVRESVYgJiAweGZmVSkgKyAxVSk7DQp9DQoNCi8qIEdldCBBREMgQ2xrICovDQovKiEgYnJpZWYgIFJldHVybiBGcmVxdWVuY3kgb2YgQWRjIENsb2NrDQogKiAgcmV0dXJuIEZyZXF1ZW5jeSBvZiBBZGMuDQogKi8NCnVpbnQzMl90IENMT0NLX0dldEFkY0Nsa0ZyZXEodm9pZCkNCnsNCiAgICB1aW50MzJfdCBmcmVxID0gMFU7DQoNCiAgICBzd2l0Y2ggKFNZU0NPTi0+QURDQ0xLU0VMKQ0KICAgIHsNCiAgICAgICAgY2FzZSAwVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDb3JlU3lzQ2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMVU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0UGxsME91dEZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDJVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldEZyb0hmRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgN1U6DQogICAgICAgICAgICBmcmVxID0gMFU7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgcmV0dXJuIGZyZXEgLyAoKFNZU0NPTi0+QURDQ0xLRElWICYgU1lTQ09OX0FEQ0NMS0RJVl9ESVZfTUFTSykgKyAxVSk7DQp9DQoNCi8qIEdldCBVU0IwIENsayAqLw0KLyohIGJyaWVmICBSZXR1cm4gRnJlcXVlbmN5IG9mIFVzYjAgQ2xvY2sNCiAqICByZXR1cm4gRnJlcXVlbmN5IG9mIFVzYjAgQ2xvY2suDQogKi8NCnVpbnQzMl90IENMT0NLX0dldFVzYjBDbGtGcmVxKHZvaWQpDQp7DQogICAgdWludDMyX3QgZnJlcSA9IDBVOw0KDQogICAgc3dpdGNoIChTWVNDT04tPlVTQjBDTEtTRUwpDQogICAgew0KICAgICAgICBjYXNlIDBVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldENvcmVTeXNDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAxVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRQbGwwT3V0RnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgM1U6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0RnJvSGZGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSA1VToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRQbGwxT3V0RnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgN1U6DQogICAgICAgICAgICBmcmVxID0gMFU7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgcmV0dXJuIGZyZXEgLyAoKFNZU0NPTi0+VVNCMENMS0RJViAmIDB4ZmZVKSArIDFVKTsNCn0NCg0KLyogR2V0IFVTQjEgQ2xrICovDQovKiEgYnJpZWYgIFJldHVybiBGcmVxdWVuY3kgb2YgVXNiMSBDbG9jaw0KICogIHJldHVybiBGcmVxdWVuY3kgb2YgVXNiMSBDbG9jay4NCiAqLw0KdWludDMyX3QgQ0xPQ0tfR2V0VXNiMUNsa0ZyZXEodm9pZCkNCnsNCiAgICByZXR1cm4gKEFOQUNUUkwtPlhPMzJNX0NUUkwgJiBBTkFDVFJMX1hPMzJNX0NUUkxfRU5BQkxFX1BMTF9VU0JfT1VUX01BU0spID8gc19FeHRfQ2xrX0ZyZXEgOiAwVTsNCn0NCg0KLyogR2V0IE1DTEsgQ2xrICovDQovKiEgYnJpZWYgIFJldHVybiBGcmVxdWVuY3kgb2YgTUNsayBDbG9jaw0KICogIHJldHVybiBGcmVxdWVuY3kgb2YgTUNsayBDbG9jay4NCiAqLw0KdWludDMyX3QgQ0xPQ0tfR2V0TWNsa0Nsa0ZyZXEodm9pZCkNCnsNCiAgICB1aW50MzJfdCBmcmVxID0gMFU7DQoNCiAgICBzd2l0Y2ggKFNZU0NPTi0+TUNMS0NMS1NFTCkNCiAgICB7DQogICAgICAgIGNhc2UgMFU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0RnJvSGZGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAxVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRQbGwwT3V0RnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgN1U6DQogICAgICAgICAgICBmcmVxID0gMFU7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgcmV0dXJuIGZyZXEgLyAoKFNZU0NPTi0+TUNMS0RJViAmIDB4ZmZVKSArIDFVKTsNCn0NCg0KLyogR2V0IFNDVElNRVIgQ2xrICovDQovKiEgYnJpZWYgIFJldHVybiBGcmVxdWVuY3kgb2YgU0NUaW1lciBDbG9jaw0KICogIHJldHVybiBGcmVxdWVuY3kgb2YgU0NUaW1lciBDbG9jay4NCiAqLw0KdWludDMyX3QgQ0xPQ0tfR2V0U2N0Q2xrRnJlcSh2b2lkKQ0Kew0KICAgIHVpbnQzMl90IGZyZXEgPSAwVTsNCg0KICAgIHN3aXRjaCAoU1lTQ09OLT5TQ1RDTEtTRUwpDQogICAgew0KICAgICAgICBjYXNlIDBVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldENvcmVTeXNDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAxVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRQbGwwT3V0RnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMlU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0RXh0Q2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgM1U6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0RnJvSGZGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSA1VToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRJMlNNQ2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgN1U6DQogICAgICAgICAgICBmcmVxID0gMFU7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgcmV0dXJuIGZyZXEgLyAoKFNZU0NPTi0+U0NUQ0xLRElWICYgMHhmZlUpICsgMVUpOw0KfQ0KDQovKiBHZXQgU0RJTyBDbGsgKi8NCi8qISBicmllZiAgUmV0dXJuIEZyZXF1ZW5jeSBvZiBTRElPIENsb2NrDQogKiAgcmV0dXJuIEZyZXF1ZW5jeSBvZiBTRElPIENsb2NrLg0KICovDQp1aW50MzJfdCBDTE9DS19HZXRTZGlvQ2xrRnJlcSh2b2lkKQ0Kew0KICAgIHVpbnQzMl90IGZyZXEgPSAwVTsNCg0KICAgIHN3aXRjaCAoU1lTQ09OLT5TRElPQ0xLU0VMKQ0KICAgIHsNCiAgICAgICAgY2FzZSAwVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDb3JlU3lzQ2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMVU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0UGxsME91dEZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDNVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldEZyb0hmRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgNVU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0UGxsMU91dEZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDdVOg0KICAgICAgICAgICAgZnJlcSA9IDBVOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICBicmVhazsNCiAgICB9DQoNCiAgICByZXR1cm4gZnJlcSAvICgoU1lTQ09OLT5TRElPQ0xLRElWICYgMHhmZlUpICsgMVUpOw0KfQ0KDQovKiBHZXQgRlJPIDEyTSBDbGsgKi8NCi8qISBicmllZiAgUmV0dXJuIEZyZXF1ZW5jeSBvZiBGUk8gMTJNSHoNCiAqICByZXR1cm4gRnJlcXVlbmN5IG9mIEZSTyAxMk1Ieg0KICovDQp1aW50MzJfdCBDTE9DS19HZXRGcm8xMk1GcmVxKHZvaWQpDQp7DQogICAgcmV0dXJuIChQTUMtPlBEUlVOQ0ZHMCAmIFBNQ19QRFJVTkNGRzBfUERFTl9GUk8xOTJNX01BU0spID8NCiAgICAgICAgICAgICAgIDAgOg0KICAgICAgICAgICAgICAgKEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCAmIEFOQUNUUkxfRlJPMTkyTV9DVFJMX0VOQV8xMk1IWkNMS19NQVNLKSA/IDEyMDAwMDAwVSA6IDBVOw0KfQ0KDQovKiBHZXQgRlJPIDFNIENsayAqLw0KLyohIGJyaWVmICBSZXR1cm4gRnJlcXVlbmN5IG9mIEZSTyAxTUh6DQogKiAgcmV0dXJuIEZyZXF1ZW5jeSBvZiBGUk8gMU1Ieg0KICovDQp1aW50MzJfdCBDTE9DS19HZXRGcm8xTUZyZXEodm9pZCkNCnsNCiAgICByZXR1cm4gKFNZU0NPTi0+Q0xPQ0tfQ1RSTCAmIFNZU0NPTl9DTE9DS19DVFJMX0ZSTzFNSFpfQ0xLX0VOQV9NQVNLKSA/IDEwMDAwMDBVIDogMFU7DQp9DQoNCi8qIEdldCBFWFQgT1NDIENsayAqLw0KLyohIGJyaWVmICBSZXR1cm4gRnJlcXVlbmN5IG9mIEV4dGVybmFsIENsb2NrDQogKiAgcmV0dXJuIEZyZXF1ZW5jeSBvZiBFeHRlcm5hbCBDbG9jay4gSWYgbm8gZXh0ZXJuYWwgY2xvY2sgaXMgdXNlZCByZXR1cm5zIDAuDQogKi8NCnVpbnQzMl90IENMT0NLX0dldEV4dENsa0ZyZXEodm9pZCkNCnsNCiAgICByZXR1cm4gKEFOQUNUUkwtPlhPMzJNX0NUUkwgJiBBTkFDVFJMX1hPMzJNX0NUUkxfRU5BQkxFX1NZU1RFTV9DTEtfT1VUX01BU0spID8gc19FeHRfQ2xrX0ZyZXEgOiAwVTsNCn0NCg0KLyogR2V0IFdBVENIIERPRyBDbGsgKi8NCi8qISBicmllZiAgUmV0dXJuIEZyZXF1ZW5jeSBvZiBXYXRjaGRvZw0KICogIHJldHVybiBGcmVxdWVuY3kgb2YgV2F0Y2hkb2cNCiAqLw0KdWludDMyX3QgQ0xPQ0tfR2V0V2R0Q2xrRnJlcSh2b2lkKQ0Kew0KICAgIHJldHVybiBDTE9DS19HZXRGcm8xTUZyZXEoKSAvICgoU1lTQ09OLT5XRFRDTEtESVYgJiBTWVNDT05fV0RUQ0xLRElWX0RJVl9NQVNLKSArIDFVKTsNCn0NCg0KLyogR2V0IEhGIEZSTyBDbGsgKi8NCi8qISBicmllZiAgUmV0dXJuIEZyZXF1ZW5jeSBvZiBIaWdoLUZyZXEgb3V0cHV0IG9mIEZSTw0KICogIHJldHVybiBGcmVxdWVuY3kgb2YgSGlnaC1GcmVxIG91dHB1dCBvZiBGUk8NCiAqLw0KdWludDMyX3QgQ0xPQ0tfR2V0RnJvSGZGcmVxKHZvaWQpDQp7DQogICAgcmV0dXJuIChQTUMtPlBEUlVOQ0ZHMCAmIFBNQ19QRFJVTkNGRzBfUERFTl9GUk8xOTJNX01BU0spID8NCiAgICAgICAgICAgICAgIDAgOg0KICAgICAgICAgICAgICAgKEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCAmIEFOQUNUUkxfRlJPMTkyTV9DVFJMX0VOQV85Nk1IWkNMS19NQVNLKSA/IDk2MDAwMDAwVSA6IDBVOw0KfQ0KDQovKiBHZXQgU1lTVEVNIFBMTCBDbGsgKi8NCi8qISBicmllZiAgUmV0dXJuIEZyZXF1ZW5jeSBvZiBQTEwNCiAqICByZXR1cm4gRnJlcXVlbmN5IG9mIFBMTA0KICovDQp1aW50MzJfdCBDTE9DS19HZXRQbGwwT3V0RnJlcSh2b2lkKQ0Kew0KICAgIHJldHVybiBzX1BsbDBfRnJlcTsNCn0NCg0KLyogR2V0IFVTQiBQTEwgQ2xrICovDQovKiEgYnJpZWYgIFJldHVybiBGcmVxdWVuY3kgb2YgVVNCIFBMTA0KICogIHJldHVybiBGcmVxdWVuY3kgb2YgUExMDQogKi8NCnVpbnQzMl90IENMT0NLX0dldFBsbDFPdXRGcmVxKHZvaWQpDQp7DQogICAgcmV0dXJuIHNfUGxsMV9GcmVxOw0KfQ0KDQovKiBHZXQgUlRDIE9TQyBDbGsgKi8NCi8qISBicmllZiAgUmV0dXJuIEZyZXF1ZW5jeSBvZiAzMmtIeiBvc2MNCiAqICByZXR1cm4gRnJlcXVlbmN5IG9mIDMya0h6IG9zYw0KICovDQp1aW50MzJfdCBDTE9DS19HZXRPc2MzMktGcmVxKHZvaWQpDQp7DQogICAgcmV0dXJuICgofihQTUMtPlBEUlVOQ0ZHMCAmIFBNQ19QRFJVTkNGRzBfUERFTl9GUk8zMktfTUFTSykpICYmIChQTUMtPlJUQ09TQzMySyAmIFBNQ19SVENPU0MzMktfU0VMKDApKSkgPw0KICAgICAgICAgICAgICAgQ0xLX1JUQ18zMktfQ0xLIDoNCiAgICAgICAgICAgICAgICgofihQTUMtPlBEUlVOQ0ZHMCAmIFBNQ19QRFJVTkNGRzBfUERFTl9YVEFMMzJLX01BU0spKSAmJiAoUE1DLT5SVENPU0MzMksgJiBQTUNfUlRDT1NDMzJLX1NFTCgxKSkpID8NCiAgICAgICAgICAgICAgIENMS19SVENfMzJLX0NMSyA6DQogICAgICAgICAgICAgICAwVTsNCn0NCg0KLyogR2V0IE1BSU4gQ2xrICovDQovKiEgYnJpZWYgIFJldHVybiBGcmVxdWVuY3kgb2YgQ29yZSBTeXN0ZW0NCiAqICByZXR1cm4gRnJlcXVlbmN5IG9mIENvcmUgU3lzdGVtDQogKi8NCnVpbnQzMl90IENMT0NLX0dldENvcmVTeXNDbGtGcmVxKHZvaWQpDQp7DQogICAgdWludDMyX3QgZnJlcSA9IDBVOw0KDQogICAgc3dpdGNoIChTWVNDT04tPk1BSU5DTEtTRUxCKQ0KICAgIHsNCiAgICAgICAgY2FzZSAwVToNCiAgICAgICAgICAgIGlmIChTWVNDT04tPk1BSU5DTEtTRUxBID09IDBVKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGcm8xMk1GcmVxKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChTWVNDT04tPk1BSU5DTEtTRUxBID09IDFVKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRFeHRDbGtGcmVxKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChTWVNDT04tPk1BSU5DTEtTRUxBID09IDJVKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGcm8xTUZyZXEoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKFNZU0NPTi0+TUFJTkNMS1NFTEEgPT0gM1UpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldEZyb0hmRnJlcSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMVU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0UGxsME91dEZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDJVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldFBsbDFPdXRGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDNVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldE9zYzMyS0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICBicmVhazsNCiAgICB9DQoNCiAgICByZXR1cm4gZnJlcTsNCn0NCg0KLyogR2V0IEkyUyBNQ0xLIENsayAqLw0KLyohIGJyaWVmICBSZXR1cm4gRnJlcXVlbmN5IG9mIEkyUyBNQ0xLIENsb2NrDQogKiAgcmV0dXJuIEZyZXF1ZW5jeSBvZiBJMlMgTUNMSyBDbG9jaw0KICovDQp1aW50MzJfdCBDTE9DS19HZXRJMlNNQ2xrRnJlcSh2b2lkKQ0Kew0KICAgIHJldHVybiBzX0kyU19NY2xrX0ZyZXE7DQp9DQoNCi8qIEdldCBGTEVYQ09NTSBpbnB1dCBjbG9jayAqLw0KLyohIGJyaWVmICBSZXR1cm4gRnJlcXVlbmN5IG9mIGZsZXhjb21tIGlucHV0IGNsb2NrDQogKiAgcGFyYW0gIGlkICAgICA6IGZsZXhjb21tIGluc3RhbmNlIGlkDQogKiAgcmV0dXJuIEZyZXF1ZW5jeSB2YWx1ZQ0KICovDQp1aW50MzJfdCBDTE9DS19HZXRGbGV4Q29tbUlucHV0Q2xvY2sodWludDMyX3QgaWQpDQp7DQogICAgdWludDMyX3QgZnJlcSA9IDBVOw0KDQogICAgc3dpdGNoIChTWVNDT04tPkZDQ0xLU0VMWFtpZF0pDQogICAgew0KICAgICAgICBjYXNlIDBVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldENvcmVTeXNDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAxVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRQbGwwT3V0RnJlcSgpIC8gKChTWVNDT04tPlBMTDBDTEtESVYgJiAweGZmVSkgKyAxVSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAyVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGcm8xMk1GcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAzVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGcm9IZkZyZXEoKSAvICgoU1lTQ09OLT5GUk9IRkRJViAmIDB4ZmZVKSArIDFVKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDRVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldEZybzFNRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgNVU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0STJTTUNsa0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDZVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldE9zYzMyS0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDdVOg0KICAgICAgICAgICAgZnJlcSA9IDBVOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIHJldHVybiBmcmVxOw0KfQ0KDQovKiBHZXQgRkxFWENPTU0gQ2xrICovDQp1aW50MzJfdCBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEodWludDMyX3QgaWQpDQp7DQogICAgdWludDMyX3QgZnJlcSA9IDBVOw0KDQogICAgZnJlcSA9IENMT0NLX0dldEZsZXhDb21tSW5wdXRDbG9jayhpZCk7DQogICAgcmV0dXJuIGZyZXEgLyAoMSArDQogICAgICAgICAgICAgICAgICAgKFNZU0NPTi0+RkxFWEZSR1hDVFJMW2lkXSAmIFNZU0NPTl9GTEVYRlJHMENUUkxfTVVMVF9NQVNLKSAvDQogICAgICAgICAgICAgICAgICAgICAgICgoU1lTQ09OLT5GTEVYRlJHWENUUkxbaWRdICYgU1lTQ09OX0ZMRVhGUkcwQ1RSTF9ESVZfTUFTSykgKyAxVSkpOw0KfQ0KDQovKiBHZXQgSFNfTFBTSSBDbGsgKi8NCnVpbnQzMl90IENMT0NLX0dldEhzTHNwaUNsa0ZyZXEodm9pZCkNCnsNCiAgICB1aW50MzJfdCBmcmVxID0gMFU7DQoNCiAgICBzd2l0Y2ggKFNZU0NPTi0+SFNMU1BJQ0xLU0VMKQ0KICAgIHsNCiAgICAgICAgY2FzZSAwVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDb3JlU3lzQ2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMVU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0UGxsME91dEZyZXEoKSAvICgoU1lTQ09OLT5QTEwwQ0xLRElWICYgMHhmZlUpICsgMVUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMlU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0RnJvMTJNRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgM1U6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0RnJvSGZGcmVxKCkgLyAoKFNZU0NPTi0+RlJPSEZESVYgJiAweGZmVSkgKyAxVSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSA0VToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGcm8xTUZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDZVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldE9zYzMyS0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDdVOg0KICAgICAgICAgICAgZnJlcSA9IDBVOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIHJldHVybiBmcmVxOw0KfQ0KDQovKiBHZXQgQ1RpbWVyIENsayAqLw0KLyohIGJyaWVmICBSZXR1cm4gRnJlcXVlbmN5IG9mIENUaW1lciBmdW5jdGlvbmFsIENsb2NrDQogKiAgcmV0dXJuIEZyZXF1ZW5jeSBvZiBDVGltZXIgZnVuY3Rpb25hbCBDbG9jaw0KICovDQp1aW50MzJfdCBDTE9DS19HZXRDVGltZXJDbGtGcmVxKHVpbnQzMl90IGlkKQ0Kew0KICAgIHVpbnQzMl90IGZyZXEgPSAwVTsNCg0KICAgIHN3aXRjaCAoU1lTQ09OLT5DVElNRVJDTEtTRUxYW2lkXSkNCiAgICB7DQogICAgICAgIGNhc2UgMFU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0Q29yZVN5c0Nsa0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDFVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldFBsbDBPdXRGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAzVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGcm9IZkZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDRVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldEZybzFNRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgNVU6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0STJTTUNsa0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDZVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldE9zYzMyS0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDdVOg0KICAgICAgICAgICAgZnJlcSA9IDBVOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIHJldHVybiBmcmVxOw0KfQ0KDQovKiBHZXQgU3lzdGljayBDbGsgKi8NCi8qISBicmllZiAgUmV0dXJuIEZyZXF1ZW5jeSBvZiBTeXN0aWNrQ2xvY2sNCiAqICByZXR1cm4gRnJlcXVlbmN5IG9mIFN5c3RpY2sgQ2xvY2sNCiAqLw0KdWludDMyX3QgQ0xPQ0tfR2V0U3lzdGlja0Nsa0ZyZXEodWludDMyX3QgaWQpDQp7DQogICAgdm9sYXRpbGUgdWludDMyX3QgKnBTeXN0aWNrQ2xrRGl2Ow0KICAgIHBTeXN0aWNrQ2xrRGl2ID0gJihTWVNDT04tPlNZU1RJQ0tDTEtESVYwKTsNCiAgICB1aW50MzJfdCBmcmVxID0gMFU7DQoNCiAgICBzd2l0Y2ggKFNZU0NPTi0+U1lTVElDS0NMS1NFTFhbaWRdKQ0KICAgIHsNCiAgICAgICAgY2FzZSAwVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDb3JlU3lzQ2xrRnJlcSgpIC8gKChwU3lzdGlja0Nsa0RpdltpZF0gJiAweGZmVSkgKyAxVSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAxVToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGcm8xTUZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDJVOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldE9zYzMyS0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDdVOg0KICAgICAgICAgICAgZnJlcSA9IDBVOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIHJldHVybiBmcmVxOw0KfQ0KDQovKiBTZXQgRmxleENvbW0gQ2xvY2sgKi8NCi8qKg0KICogYnJpZWYgICBTZXQgdGhlIGZsZXhjb21tIG91dHB1dCBmcmVxdWVuY3kuDQogKiBwYXJhbSAgIGlkICAgICAgOiBmbGV4Y29tbSBpbnN0YW5jZSBpZA0KICogICAgICAgICAgZnJlcSAgICA6IG91dHB1dCBmcmVxdWVuY3kNCiAqIHJldHVybiAgMCAgIDogdGhlIGZyZXF1ZW5jeSByYW5nZSBpcyBvdXQgb2YgcmFuZ2UuDQogKiAgICAgICAgICAxICAgOiBzd2l0Y2ggc3VjY2Vzc2Z1bGx5Lg0KICovDQp1aW50MzJfdCBDTE9DS19TZXRGbGV4Q29tbUNsb2NrKHVpbnQzMl90IGlkLCB1aW50MzJfdCBmcmVxKQ0Kew0KICAgIHVpbnQzMl90IGlucHV0ID0gQ0xPQ0tfR2V0RmxleENvbW1DbGtGcmVxKGlkKTsNCiAgICB1aW50MzJfdCBtdWw7DQoNCiAgICBpZiAoKGZyZXEgPiA0ODAwMDAwMCkgfHwgKGZyZXEgPiBpbnB1dCkgfHwgKGlucHV0IC8gZnJlcSA+PSAyKSkNCiAgICB7DQogICAgICAgIC8qIEZSRyBvdXRwdXQgZnJlcXVlbmN5IHNob3VsZCBiZSBsZXNzIHRoYW4gZXF1YWwgdG8gNDhNSHogKi8NCiAgICAgICAgcmV0dXJuIDA7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIG11bCA9ICgodWludDY0X3QpKGlucHV0IC0gZnJlcSkgKiAyNTYpIC8gKCh1aW50NjRfdClmcmVxKTsNCiAgICAgICAgU1lTQ09OLT5GTEVYRlJHWENUUkxbaWRdID0gKG11bCA8PCA4VSkgfCAweEZGVTsNCiAgICAgICAgcmV0dXJuIDE7DQogICAgfQ0KfQ0KDQovKiBHZXQgSVAgQ2xrICovDQovKiEgYnJpZWYgIFJldHVybiBGcmVxdWVuY3kgb2Ygc2VsZWN0ZWQgY2xvY2sNCiAqICByZXR1cm4gRnJlcXVlbmN5IG9mIHNlbGVjdGVkIGNsb2NrDQogKi8NCnVpbnQzMl90IENMT0NLX0dldEZyZXEoY2xvY2tfbmFtZV90IGNsb2NrTmFtZSkNCnsNCiAgICB1aW50MzJfdCBmcmVxOw0KICAgIHN3aXRjaCAoY2xvY2tOYW1lKQ0KICAgIHsNCiAgICAgICAgY2FzZSBrQ0xPQ0tfQ29yZVN5c0NsazoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDb3JlU3lzQ2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0J1c0NsazoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDb3JlU3lzQ2xrRnJlcSgpIC8gKChTWVNDT04tPkFIQkNMS0RJViAmIDB4ZmZVKSArIDFVKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19DbG9ja091dDoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDbG9ja091dENsa0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19BZGM6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0QWRjQ2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX1VzYjA6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0VXNiMENsa0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19Vc2IxOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldFVzYjFDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBrQ0xPQ0tfUGxsMU91dDoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRQbGwxT3V0RnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX01jbGs6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0TWNsa0Nsa0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19Gcm9IZjoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGcm9IZkZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19Gcm8xMk06DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0RnJvMTJNRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0V4dENsazoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRFeHRDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBrQ0xPQ0tfUGxsME91dDoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRQbGwwT3V0RnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX1dkdENsazoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRXZHRDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBrQ0xPQ0tfU2N0Og0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldFNjdENsa0ZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19TRGlvOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldFNkaW9DbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBrQ0xPQ0tfRmxleEkyUzoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRJMlNNQ2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0ZsZXhjb21tMDoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEoMFUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0ZsZXhjb21tMToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEoMVUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0ZsZXhjb21tMjoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEoMlUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0ZsZXhjb21tMzoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEoM1UpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0ZsZXhjb21tNDoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEoNFUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0ZsZXhjb21tNToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEoNVUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0ZsZXhjb21tNjoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEoNlUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0ZsZXhjb21tNzoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRGbGV4Q29tbUNsa0ZyZXEoN1UpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0hzTHNwaToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRIc0xzcGlDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBrQ0xPQ0tfQ1RtaWVyMDoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDVGltZXJDbGtGcmVxKDBVKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19DVG1pZXIxOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldENUaW1lckNsa0ZyZXEoMVUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX0NUbWllcjI6DQogICAgICAgICAgICBmcmVxID0gQ0xPQ0tfR2V0Q1RpbWVyQ2xrRnJlcSgyVSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSBrQ0xPQ0tfQ1RtaWVyMzoNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRDVGltZXJDbGtGcmVxKDNVKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19DVG1pZXI0Og0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldENUaW1lckNsa0ZyZXEoNFUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2Uga0NMT0NLX1N5c3RpY2swOg0KICAgICAgICAgICAgZnJlcSA9IENMT0NLX0dldFN5c3RpY2tDbGtGcmVxKDBVKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIGtDTE9DS19TeXN0aWNrMToNCiAgICAgICAgICAgIGZyZXEgPSBDTE9DS19HZXRTeXN0aWNrQ2xrRnJlcSgxVSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGZyZXEgPSAwVTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICByZXR1cm4gZnJlcTsNCn0NCg0KLyogRmluZCBTRUxQLCBTRUxJLCBhbmQgU0VMUiB2YWx1ZXMgZm9yIHJhdyBNIHZhbHVlLCBtYXggTSA9IE1WQUxNQVggKi8NCnN0YXRpYyB2b2lkIHBsbEZpbmRTZWwodWludDMyX3QgTSwgdWludDMyX3QgKnBTZWxQLCB1aW50MzJfdCAqcFNlbEksIHVpbnQzMl90ICpwU2VsUikNCnsNCiAgICB1aW50MzJfdCBzZWxpLCBzZWxwOw0KICAgIC8qIGJhbmR3aWR0aDogY29tcHV0ZSBzZWxQIGZyb20gTXVsdGlwbGllciAqLw0KICAgIGlmIChTWVNDT04tPlBMTDBTU0NHMSAmIFNZU0NPTl9QTEwwU1NDRzFfTURJVl9FWFRfTUFTSykNCiAgICB7DQogICAgICAgIHNlbHAgPSAoTSA+PiAyVSkgKyAxVTsNCiAgICAgICAgaWYgKHNlbHAgPj0gMzFVKQ0KICAgICAgICB7DQogICAgICAgICAgICBzZWxwID0gMzFVOw0KICAgICAgICB9DQogICAgICAgICpwU2VsUCA9IHNlbHA7DQoNCiAgICAgICAgaWYgKE0gPj0gMzI3NjgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNlbGkgPSAxOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKE0gPj0gMTYzODQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNlbGkgPSAyOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKE0gPj0gNDA5NikNCiAgICAgICAgew0KICAgICAgICAgICAgc2VsaSA9IDQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoTSA+PSAxMDAyKQ0KICAgICAgICB7DQogICAgICAgICAgICBzZWxpID0gODsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChNID49IDEyMCkNCiAgICAgICAgew0KICAgICAgICAgICAgc2VsaSA9IDQgKiAoKDEwMjQvKE0vMiArIDkpKSArIDEpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgc2VsaSA9IDQgKiAoTS84ICsgMSk7DQogICAgICAgIH0gDQoNCiAgICAgICAgaWYgKHNlbGkgPj0gNjMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNlbGkgPSA2MzsNCiAgICAgICAgfQ0KICAgICAgICAqcFNlbEkgPSBzZWxpOw0KDQogICAgICAgICpwU2VsUiA9IDBVOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICAqcFNlbFAgPSAzVTsNCiAgICAgICAgKnBTZWxJID0gNFU7DQogICAgICAgICpwU2VsUiA9IDRVOw0KICAgIH0NCn0NCg0KLyogR2V0IHByZWRpdmlkZXIgKE4pIGZyb20gUExMMCBOREVDIHNldHRpbmcgKi8NCnN0YXRpYyB1aW50MzJfdCBmaW5kUGxsMFByZURpdih2b2lkKQ0Kew0KICAgIHVpbnQzMl90IHByZURpdiA9IDE7DQoNCiAgICAvKiBEaXJlY3QgaW5wdXQgaXMgbm90IHVzZWQ/ICovDQogICAgaWYgKChTWVNDT04tPlBMTDBDVFJMICYgU1lTQ09OX1BMTDBDVFJMX0JZUEFTU1BSRURJVl9NQVNLKSA9PSAwKQ0KICAgIHsNCiAgICAgICAgcHJlRGl2ID0gU1lTQ09OLT5QTEwwTkRFQyAmIFNZU0NPTl9QTEwwTkRFQ19ORElWX01BU0s7DQogICAgICAgIGlmIChwcmVEaXYgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgcHJlRGl2ID0gMTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gcHJlRGl2Ow0KfQ0KDQovKiBHZXQgcHJlZGl2aWRlciAoTikgZnJvbSBQTEwxIE5ERUMgc2V0dGluZyAqLw0Kc3RhdGljIHVpbnQzMl90IGZpbmRQbGwxUHJlRGl2KHZvaWQpDQp7DQogICAgdWludDMyX3QgcHJlRGl2ID0gMTsNCg0KICAgIC8qIERpcmVjdCBpbnB1dCBpcyBub3QgdXNlZD8gKi8NCiAgICBpZiAoKFNZU0NPTi0+UExMMUNUUkwgJiBTWVNDT05fUExMMUNUUkxfQllQQVNTUFJFRElWX01BU0spID09IDApDQogICAgew0KICAgICAgICBwcmVEaXYgPSBTWVNDT04tPlBMTDFOREVDICYgU1lTQ09OX1BMTDFOREVDX05ESVZfTUFTSzsNCiAgICAgICAgaWYgKHByZURpdiA9PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBwcmVEaXYgPSAxOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBwcmVEaXY7DQp9DQoNCi8qIEdldCBwb3N0ZGl2aWRlciAoUCkgZnJvbSBQTEwwIFBERUMgc2V0dGluZyAqLw0Kc3RhdGljIHVpbnQzMl90IGZpbmRQbGwwUG9zdERpdih2b2lkKQ0Kew0KICAgIHVpbnQzMl90IHBvc3REaXYgPSAxOw0KDQogICAgaWYgKChTWVNDT04tPlBMTDBDVFJMICYgU1lTQ09OX1BMTDBDVFJMX0JZUEFTU1BPU1RESVZfTUFTSykgPT0gMCkNCiAgICB7DQogICAgICAgIGlmIChTWVNDT04tPlBMTDBDVFJMICYgU1lTQ09OX1BMTDBDVFJMX0JZUEFTU1BPU1RESVYyX01BU0spDQogICAgICAgIHsNCiAgICAgICAgICAgIHBvc3REaXYgPSBTWVNDT04tPlBMTDBQREVDICYgU1lTQ09OX1BMTDBQREVDX1BESVZfTUFTSzsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHBvc3REaXYgPSAyICogKFNZU0NPTi0+UExMMFBERUMgJiBTWVNDT05fUExMMFBERUNfUERJVl9NQVNLKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocG9zdERpdiA9PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBwb3N0RGl2ID0gMjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gcG9zdERpdjsNCn0NCg0KLyogR2V0IG11bHRpcGxpZXIgKE0pIGZyb20gUExMMCBTU0NHIGFuZCBTRUxfRVhUIHNldHRpbmdzICovDQpzdGF0aWMgZmxvYXQgZmluZFBsbDBNTXVsdCh2b2lkKQ0Kew0KICAgIGZsb2F0IG1NdWx0ID0gMTsNCiAgICBmbG9hdCBtTXVsdF9mcmFjdDsNCiAgICB1aW50MzJfdCBtTXVsdF9pbnQ7DQoNCiAgICBpZiAoU1lTQ09OLT5QTEwwU1NDRzEgJiBTWVNDT05fUExMMFNTQ0cxX1NFTF9FWFRfTUFTSykNCiAgICB7DQogICAgICAgIG1NdWx0ID0gKFNZU0NPTi0+UExMMFNTQ0cxICYgU1lTQ09OX1BMTDBTU0NHMV9NRElWX0VYVF9NQVNLKSA+PiBTWVNDT05fUExMMFNTQ0cxX01ESVZfRVhUX1NISUZUOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBtTXVsdF9pbnQgPSAoKFNZU0NPTi0+UExMMFNTQ0cxICYgU1lTQ09OX1BMTDBTU0NHMV9NRF9NQlNfTUFTSykgPDwgN1UpIHwgKChTWVNDT04tPlBMTDBTU0NHMCkgPj4gUExMMF9TU0NHX01EX0lOVF9QKTsNCiAgICAgICAgbU11bHRfZnJhY3QgPSAoKGZsb2F0KSgoU1lTQ09OLT5QTEwwU1NDRzApICYgUExMMF9TU0NHX01EX0ZSQUNUX00pLygxIDw8IFBMTDBfU1NDR19NRF9JTlRfUCkpOw0KICAgICAgICBtTXVsdCA9IChmbG9hdCltTXVsdF9pbnQgKyBtTXVsdF9mcmFjdDsNCiAgICB9DQogICAgaWYgKG1NdWx0ID09IDApDQogICAgew0KICAgICAgICBtTXVsdCA9IDE7DQogICAgfQ0KICAgIHJldHVybiBtTXVsdDsNCn0NCg0KDQovKiBGaW5kIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIGJldHdlZW4gbSBhbmQgbiAqLw0Kc3RhdGljIHVpbnQzMl90IEZpbmRHcmVhdGVzdENvbW1vbkRpdmlzb3IodWludDMyX3QgbSwgdWludDMyX3QgbikNCnsNCiAgICB1aW50MzJfdCB0bXA7DQoNCiAgICB3aGlsZSAobiAhPSAwVSkNCiAgICB7DQogICAgICAgIHRtcCA9IG47DQogICAgICAgIG4gPSBtICUgbjsNCiAgICAgICAgbSA9IHRtcDsNCiAgICB9DQoNCiAgICByZXR1cm4gbTsNCn0NCg0KLyoNCiAqIFNldCBQTEwwIG91dHB1dCBiYXNlZCBvbiBkZXNpcmVkIG91dHB1dCByYXRlLg0KICogSW4gdGhpcyBmdW5jdGlvbiwgdGhlIGl0IGNhbGN1bGF0ZXMgdGhlIFBMTDAgc2V0dGluZyBmb3Igb3V0cHV0IGZyZXF1ZW5jeSBmcm9tIGlucHV0IGNsb2NrDQogKiBmcmVxdWVuY3kuIFRoZSBjYWxjdWxhdGlvbiB3b3VsZCBjb3N0IGEgZmV3IHRpbWUuIFNvIGl0IGlzIG5vdCByZWNvbW1hbmVkIHRvIHVzZSBpdCBmcmVxdWVudGx5Lg0KICogdGhlICJwbGxjdHJsIiwgInBsbG5kZWMiLCAicGxscGRlYyIsICJwbGxtZGVjIiB3b3VsZCB1cGRhdGVkIGluIHRoaXMgZnVuY3Rpb24uDQogKi8NCnN0YXRpYyBwbGxfZXJyb3JfdCBDTE9DS19HZXRQbGwwQ29uZmlnSW50ZXJuYWwoDQogICAgdWludDMyX3QgZmluSHosIHVpbnQzMl90IGZvdXRIeiwgcGxsX3NldHVwX3QgKnBTZXR1cCwgYm9vbCB1c2VTUykNCnsNCiAgICB1aW50MzJfdCBuRGl2T3V0SHosIGZjY29IejsNCiAgICB1aW50MzJfdCBwbGxQcmVEaXZpZGVyLCBwbGxNdWx0aXBsaWVyLCBwbGxQb3N0RGl2aWRlcjsNCiAgICB1aW50MzJfdCBwbGxEaXJlY3RJbnB1dCwgcGxsRGlyZWN0T3V0cHV0Ow0KICAgIHVpbnQzMl90IHBsbFNlbFAsIHBsbFNlbEksIHBsbFNlbFIsIHVwbGltb2ZmOw0KDQogICAgLyogQmFzZWxpbmUgcGFyYW1ldGVycyAobm8gaW5wdXQgb3Igb3V0cHV0IGRpdmlkZXJzKSAqLw0KICAgIHBsbFByZURpdmlkZXIgPSAxVTsgIC8qIDEgaW1wbGllcyBwcmUtZGl2aWRlciB3aWxsIGJlIGRpc2FibGVkICovDQogICAgcGxsUG9zdERpdmlkZXIgPSAxVTsgLyogMSBpbXBsaWVzIHBvc3QtZGl2aWRlciB3aWxsIGJlIGRpc2FibGVkICovDQogICAgcGxsRGlyZWN0T3V0cHV0ID0gMVU7DQoNCiAgICAvKiBWZXJpZnkgb3V0cHV0IHJhdGUgcGFyYW1ldGVyICovDQogICAgaWYgKGZvdXRIeiA+IFBMTF9NQVhfQ0NPX0ZSRVFfTUhaKQ0KICAgIHsNCiAgICAgICAgLyogTWF4aW11bSBQTEwgb3V0cHV0IHdpdGggcG9zdCBkaXZpZGVyPTEgY2Fubm90IGdvIGFib3ZlIHRoaXMgZnJlcXVlbmN5ICovDQogICAgICAgIHJldHVybiBrU3RhdHVzX1BMTF9PdXRwdXRUb29IaWdoOw0KICAgIH0NCiAgICBpZiAoZm91dEh6IDwgKFBMTF9NSU5fQ0NPX0ZSRVFfTUhaIC8gKFBWQUxNQVggPDwgMVUpKSkNCiAgICB7DQogICAgICAgIC8qIE1pbm11bSBQTEwgb3V0cHV0IHdpdGggbWF4aW11bSBwb3N0IGRpdmlkZXIgY2Fubm90IGdvIGJlbG93IHRoaXMgZnJlcXVlbmN5ICovDQogICAgICAgIHJldHVybiBrU3RhdHVzX1BMTF9PdXRwdXRUb29Mb3c7DQogICAgfQ0KDQogICAgLyogSWYgdXNpbmcgU1MgbW9kZSwgaW5wdXQgY2xvY2sgbmVlZHMgdG8gYmUgYmV0d2VlbiAzTUh6IGFuZCAyME1IeiAqLw0KICAgIGlmICh1c2VTUykNCiAgICB7DQogICAgICAgIC8qIFZlcmlmeSBpbnB1dCByYXRlIHBhcmFtZXRlciAqLw0KICAgICAgICBpZiAoZmluSHogPCBQTExfTUlOX0lOX1NTTU9ERSkNCiAgICAgICAgew0KICAgICAgICAgICAgLyogSW5wdXQgY2xvY2sgaW50byB0aGUgUExMIGNhbm5vdCBiZSBsb3dlciB0aGFuIHRoaXMgKi8NCiAgICAgICAgICAgIHJldHVybiBrU3RhdHVzX1BMTF9JbnB1dFRvb0xvdzsNCiAgICAgICAgfQ0KICAgICAgICAvKiBQTEwgaW5wdXQgaW4gU1MgbW9kZSBtdXN0IGJlIHVuZGVyIDIwTUh6ICovDQogICAgICAgIGlmIChmaW5IeiA+IChQTExfTUFYX0lOX1NTTU9ERSAqIE5WQUxNQVgpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4ga1N0YXR1c19QTExfSW5wdXRUb29IaWdoOw0KICAgICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIC8qIFZlcmlmeSBpbnB1dCByYXRlIHBhcmFtZXRlciAqLw0KICAgICAgICBpZiAoZmluSHogPCBQTExfTE9XRVJfSU5fTElNSVQpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8qIElucHV0IGNsb2NrIGludG8gdGhlIFBMTCBjYW5ub3QgYmUgbG93ZXIgdGhhbiB0aGlzICovDQogICAgICAgICAgICByZXR1cm4ga1N0YXR1c19QTExfSW5wdXRUb29Mb3c7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGZpbkh6ID4gUExMX0hJR0hFUl9JTl9MSU1JVCkNCiAgICAgICAgew0KICAgICAgICAgICAgLyogSW5wdXQgY2xvY2sgaW50byB0aGUgUExMIGNhbm5vdCBiZSBoaWdoZXIgdGhhbiB0aGlzICovDQogICAgICAgICAgICByZXR1cm4ga1N0YXR1c19QTExfSW5wdXRUb29IaWdoOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogRmluZCB0aGUgb3B0aW1hbCBDQ08gZnJlcXVlbmN5IGZvciB0aGUgb3V0cHV0IGFuZCBpbnB1dCB0aGF0DQogICAgICAgd2lsbCBrZWVwIGl0IGluc2lkZSB0aGUgUExMIENDTyByYW5nZS4gVGhpcyBtYXkgcmVxdWlyZQ0KICAgICAgIHR3ZWFraW5nIHRoZSBwb3N0LWRpdmlkZXIgZm9yIHRoZSBQTEwuICovDQogICAgZmNjb0h6ID0gZm91dEh6Ow0KICAgIHdoaWxlIChmY2NvSHogPCBQTExfTUlOX0NDT19GUkVRX01IWikNCiAgICB7DQogICAgICAgIC8qIENDTyBvdXRwdXQgaXMgbGVzcyB0aGFuIG1pbmltdW0gQ0NPIHJhbmdlLCBzbyB0aGUgQ0NPIG91dHB1dA0KICAgICAgICAgICBuZWVkcyB0byBiZSBidW1wZWQgdXAgYW5kIHRoZSBwb3N0LWRpdmlkZXIgaXMgdXNlZCB0byBicmluZw0KICAgICAgICAgICB0aGUgUExMIG91dHB1dCBiYWNrIGRvd24uICovDQogICAgICAgIHBsbFBvc3REaXZpZGVyKys7DQogICAgICAgIGlmIChwbGxQb3N0RGl2aWRlciA+IFBWQUxNQVgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBrU3RhdHVzX1BMTF9PdXRzaWRlSW50TGltaXQ7DQogICAgICAgIH0NCg0KICAgICAgICAvKiBUYXJnZXQgQ0NPIGdvZXMgdXAsIFBMTCBvdXRwdXQgZ29lcyBkb3duICovDQogICAgICAgIC8qIGRpdmlkZS1ieS0yIGRpdmlkZXIgaW4gdGhlIHBvc3QtZGl2aWRlciBpcyBhbHdheXMgd29yayovDQogICAgICAgIGZjY29IeiA9IGZvdXRIeiAqIChwbGxQb3N0RGl2aWRlciAqIDJVKTsNCiAgICAgICAgcGxsRGlyZWN0T3V0cHV0ID0gMFU7DQogICAgfQ0KDQogICAgLyogRGV0ZXJtaW5lIGlmIGEgcHJlLWRpdmlkZXIgaXMgbmVlZGVkIHRvIGdldCB0aGUgYmVzdCBmcmVxdWVuY3kgKi8NCiAgICBpZiAoKGZpbkh6ID4gUExMX0xPV0VSX0lOX0xJTUlUKSAmJiAoZmNjb0h6ID49IGZpbkh6KSAmJiAodXNlU1MgPT0gZmFsc2UpKQ0KICAgIHsNCiAgICAgICAgdWludDMyX3QgYSA9IEZpbmRHcmVhdGVzdENvbW1vbkRpdmlzb3IoZmNjb0h6LCBmaW5Ieik7DQoNCiAgICAgICAgaWYgKGEgPiBQTExfTE9XRVJfSU5fTElNSVQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGEgPSBmaW5IeiAvIGE7DQogICAgICAgICAgICBpZiAoKGEgIT0gMFUpICYmIChhIDwgUExMX01BWF9OX0RJVikpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcGxsUHJlRGl2aWRlciA9IGE7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBCeXBhc3MgcHJlLWRpdmlkZXIgaGFyZHdhcmUgaWYgcHJlLWRpdmlkZXIgaXMgMSAqLw0KICAgIGlmIChwbGxQcmVEaXZpZGVyID4gMVUpDQogICAgew0KICAgICAgICBwbGxEaXJlY3RJbnB1dCA9IDBVOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBwbGxEaXJlY3RJbnB1dCA9IDFVOw0KICAgIH0NCg0KICAgIC8qIERldGVybWluZSBQTEwgbXVsdGlwbGVyICovDQogICAgbkRpdk91dEh6ID0gKGZpbkh6IC8gcGxsUHJlRGl2aWRlcik7DQogICAgcGxsTXVsdGlwbGllciA9IChmY2NvSHogLyBuRGl2T3V0SHopOw0KDQogICAgLyogRmluZCBvcHRpbWFsIHZhbHVlcyBmb3IgZmlsdGVyICovDQogICAgaWYgKHVzZVNTID09IGZhbHNlKQ0KICAgIHsNCiAgICAgICAgLyogV2lsbCBidW1waW5nIHVwIE0gYnkgMSBnZXQgdXMgY2xvc2VyIHRvIHRoZSBkZXNpcmVkIENDTyBmcmVxdWVuY3k/ICovDQogICAgICAgIGlmICgobkRpdk91dEh6ICogKChwbGxNdWx0aXBsaWVyICogMlUpICsgMVUpKSA8IChmY2NvSHogKiAyVSkpDQogICAgICAgIHsNCiAgICAgICAgICAgIHBsbE11bHRpcGxpZXIrKzsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qIFNldHVwIGZpbHRlcmluZyAqLw0KICAgICAgICBwbGxGaW5kU2VsKHBsbE11bHRpcGxpZXIsICZwbGxTZWxQLCAmcGxsU2VsSSwgJnBsbFNlbFIpOw0KICAgICAgICB1cGxpbW9mZiA9IDBVOw0KDQogICAgICAgIC8qIEdldCBlbmNvZGVkIHZhbHVlIGZvciBNIChtdWx0KSBhbmQgdXNlIG1hbnVhbCBmaWx0ZXIsIGRpc2FibGUgU1MgbW9kZSAqLw0KICAgICAgICBwU2V0dXAtPnBsbHNzY2dbMV0gPSAoUExMX1NTQ0cxX01ERUNfVkFMX1NFVChwbGxNdWx0aXBsaWVyKSkgfCAoMVUgPDwgU1lTQ09OX1BMTDBTU0NHMV9TRUxfRVhUX1NISUZUKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgdWludDY0X3QgZmM7DQoNCiAgICAgICAgLyogRmlsdGVyaW5nIHdpbGwgYmUgaGFuZGxlZCBieSBTU0MgKi8NCiAgICAgICAgcGxsU2VsUiA9IHBsbFNlbEkgPSBwbGxTZWxQID0gMFU7DQogICAgICAgIHVwbGltb2ZmID0gMVU7DQoNCiAgICAgICAgLyogVGhlIFBMTCBtdWx0aXBsaWVyIHdpbGwgZ2V0IHZlcnkgY2xvc2UgYW5kIHNsaWdodGx5IHVuZGVyIHRoZQ0KICAgICAgICAgICBkZXNpcmVkIHRhcmdldCBmcmVxdWVuY3kuIEEgc21hbGwgZnJhY3Rpb25hbCBjb21wb25lbnQgY2FuIGJlDQogICAgICAgICAgIGFkZGVkIHRvIGZpbmUgdHVuZSB0aGUgZnJlcXVlbmN5IHVwd2FyZHMgdG8gdGhlIHRhcmdldC4gKi8NCiAgICAgICAgZmMgPSAoKHVpbnQ2NF90KShmY2NvSHogJSBuRGl2T3V0SHopIDw8IDI1VSkgLyBuRGl2T3V0SHo7DQoNCiAgICAgICAgLyogU2V0IG11bHRpcGxpZXIgKi8NCiAgICAgICAgcFNldHVwLT5wbGxzc2NnWzBdID0gKHVpbnQzMl90KShQTEwwX1NTQ0dfTURfSU5UX1NFVChwbGxNdWx0aXBsaWVyKSB8IFBMTDBfU1NDR19NRF9GUkFDVF9TRVQoKHVpbnQzMl90KWZjKSk7DQogICAgICAgIHBTZXR1cC0+cGxsc3NjZ1sxXSA9IFBMTDBfU1NDR19NRF9JTlRfU0VUKHBsbE11bHRpcGxpZXIpID4+IDMyVTsNCiAgICB9DQoNCiAgICAvKiBHZXQgZW5jb2RlZCB2YWx1ZXMgZm9yIE4gKHByZWRpdikgYW5kIFAgKHBvc3RkaXYpICovDQogICAgcFNldHVwLT5wbGxuZGVjID0gUExMX05ERUNfVkFMX1NFVChwbGxQcmVEaXZpZGVyKTsNCiAgICBwU2V0dXAtPnBsbHBkZWMgPSBQTExfUERFQ19WQUxfU0VUKHBsbFBvc3REaXZpZGVyKTsNCg0KICAgIC8qIFBMTCBjb250cm9sICovDQogICAgcFNldHVwLT5wbGxjdHJsID0gKHBsbFNlbFIgPDwgU1lTQ09OX1BMTDBDVFJMX1NFTFJfU0hJRlQpIHwgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50ICovDQogICAgICAgICAgICAgICAgICAgICAgKHBsbFNlbEkgPDwgU1lTQ09OX1BMTDBDVFJMX1NFTElfU0hJRlQpIHwgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50ICovDQogICAgICAgICAgICAgICAgICAgICAgKHBsbFNlbFAgPDwgU1lTQ09OX1BMTDBDVFJMX1NFTFBfU0hJRlQpIHwgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50ICovDQogICAgICAgICAgICAgICAgICAgICAgKDAgPDwgU1lTQ09OX1BMTDBDVFJMX0JZUEFTU1BMTF9TSElGVCkgfCAgICAgICAgICAgICAgICAgICAgLyogUExMIGJ5cGFzcyBtb2RlIGRpc2FibGVkICovDQogICAgICAgICAgICAgICAgICAgICAgKHVwbGltb2ZmIDw8IFNZU0NPTl9QTEwwQ1RSTF9MSU1VUE9GRl9TSElGVCkgfCAgICAgICAgICAgICAgLyogU1MvZnJhY3Rpb25hbCBtb2RlIGRpc2FibGVkICovDQogICAgICAgICAgICAgICAgICAgICAgKHBsbERpcmVjdElucHV0IDw8IFNZU0NPTl9QTEwwQ1RSTF9CWVBBU1NQUkVESVZfU0hJRlQpIHwgICAgLyogQnlwYXNzIHByZS1kaXZpZGVyPyAqLw0KICAgICAgICAgICAgICAgICAgICAgIChwbGxEaXJlY3RPdXRwdXQgPDwgU1lTQ09OX1BMTDBDVFJMX0JZUEFTU1BPU1RESVZfU0hJRlQpIHwgIC8qIEJ5cGFzcyBwb3N0LWRpdmlkZXI/ICovDQogICAgICAgICAgICAgICAgICAgICAgKDEgPDwgU1lTQ09OX1BMTDBDVFJMX0NMS0VOX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5zdXJlIHRoZSBQTEwgY2xvY2sgb3V0cHV0ICovDQoNCiAgICByZXR1cm4ga1N0YXR1c19QTExfU3VjY2VzczsNCn0NCg0KI2lmIChkZWZpbmVkKENMT0NLX1VTUl9DRkdfUExMX0NPTkZJR19DQUNIRV9DT1VOVCkgJiYgQ0xPQ0tfVVNSX0NGR19QTExfQ09ORklHX0NBQ0hFX0NPVU5UKQ0KLyogQWxsb2N0IHRoZSBzdGF0aWMgYnVmZmVyIGZvciBjYWNoZS4gKi8NCnN0YXRpYyBwbGxfc2V0dXBfdCBzX1BsbFNldHVwQ2FjaGVTdHJ1Y3RbQ0xPQ0tfVVNSX0NGR19QTExfQ09ORklHX0NBQ0hFX0NPVU5UXTsNCnN0YXRpYyB1aW50MzJfdCBzX0Zpbkh6Q2FjaGVbQ0xPQ0tfVVNSX0NGR19QTExfQ09ORklHX0NBQ0hFX0NPVU5UXSA9IHswfTsNCnN0YXRpYyB1aW50MzJfdCBzX0ZvdXRIekNhY2hlW0NMT0NLX1VTUl9DRkdfUExMX0NPTkZJR19DQUNIRV9DT1VOVF0gPSB7MH07DQpzdGF0aWMgYm9vbCBzX1VzZVNTQ2FjaGVbQ0xPQ0tfVVNSX0NGR19QTExfQ09ORklHX0NBQ0hFX0NPVU5UXSA9IHtmYWxzZX07DQpzdGF0aWMgdWludDMyX3Qgc19QbGxTZXR1cENhY2hlSWR4ID0gMFU7DQojZW5kaWYgLyogQ0xPQ0tfVVNSX0NGR19QTExfQ09ORklHX0NBQ0hFX0NPVU5UICovDQoNCi8qDQogKiBDYWxjdWxhdGUgdGhlIFBMTCBzZXR0aW5nIHZhbHVlcyBmcm9tIGlucHV0IGNsb2NrIGZyZXEgdG8gb3V0cHV0IGZyZXEuDQogKi8NCnN0YXRpYyBwbGxfZXJyb3JfdCBDTE9DS19HZXRQbGwwQ29uZmlnKA0KICAgIHVpbnQzMl90IGZpbkh6LCB1aW50MzJfdCBmb3V0SHosIHBsbF9zZXR1cF90ICpwU2V0dXAsIGJvb2wgdXNlU1MpDQp7DQogICAgcGxsX2Vycm9yX3QgcmV0RXJyOw0KI2lmIChkZWZpbmVkKENMT0NLX1VTUl9DRkdfUExMX0NPTkZJR19DQUNIRV9DT1VOVCkgJiYgQ0xPQ0tfVVNSX0NGR19QTExfQ09ORklHX0NBQ0hFX0NPVU5UKQ0KICAgIHVpbnQzMl90IGk7DQoNCiAgICBmb3IgKGkgPSAwVTsgaSA8IENMT0NLX1VTUl9DRkdfUExMX0NPTkZJR19DQUNIRV9DT1VOVDsgaSsrKQ0KICAgIHsNCiAgICAgICAgaWYgKChmaW5IeiA9PSBzX0Zpbkh6Q2FjaGVbaV0pICYmIChmb3V0SHogPT0gc19Gb3V0SHpDYWNoZVtpXSkgJiYgKHVzZVNTID09IHNfVXNlU1NDYWNoZVtpXSkpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8qIEhpdCB0aGUgdGFyZ2V0IGluIGNhY2hlIGJ1ZmZlci4gKi8NCiAgICAgICAgICAgIHBTZXR1cC0+cGxsY3RybCA9IHNfUGxsU2V0dXBDYWNoZVN0cnVjdFtpXS5wbGxjdHJsOw0KICAgICAgICAgICAgcFNldHVwLT5wbGxuZGVjID0gc19QbGxTZXR1cENhY2hlU3RydWN0W2ldLnBsbG5kZWM7DQogICAgICAgICAgICBwU2V0dXAtPnBsbHBkZWMgPSBzX1BsbFNldHVwQ2FjaGVTdHJ1Y3RbaV0ucGxscGRlYzsNCiAgICAgICAgICAgIHBTZXR1cC0+cGxsc3NjZ1swXSA9IHNfUGxsU2V0dXBDYWNoZVN0cnVjdFtpXS5wbGxzc2NnWzBdOw0KICAgICAgICAgICAgcFNldHVwLT5wbGxzc2NnWzFdID0gc19QbGxTZXR1cENhY2hlU3RydWN0W2ldLnBsbHNzY2dbMV07DQogICAgICAgICAgICByZXRFcnIgPSBrU3RhdHVzX1BMTF9TdWNjZXNzOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoaSA8IENMT0NLX1VTUl9DRkdfUExMX0NPTkZJR19DQUNIRV9DT1VOVCkNCiAgICB7DQogICAgICAgIHJldHVybiByZXRFcnI7DQogICAgfQ0KI2VuZGlmIC8qIENMT0NLX1VTUl9DRkdfUExMX0NPTkZJR19DQUNIRV9DT1VOVCAqLw0KDQogICAgcmV0RXJyID0gQ0xPQ0tfR2V0UGxsMENvbmZpZ0ludGVybmFsKGZpbkh6LCBmb3V0SHosIHBTZXR1cCwgdXNlU1MpOw0KDQojaWYgKGRlZmluZWQoQ0xPQ0tfVVNSX0NGR19QTExfQ09ORklHX0NBQ0hFX0NPVU5UKSAmJiBDTE9DS19VU1JfQ0ZHX1BMTF9DT05GSUdfQ0FDSEVfQ09VTlQpDQogICAgLyogQ2FjaGUgdGhlIG1vc3QgcmVjZW50IGNhbHVsYXRpb24gcmVzdWx0IGludG8gYnVmZmVyLiAqLw0KICAgIHNfRmluSHpDYWNoZVtzX1BsbFNldHVwQ2FjaGVJZHhdID0gZmluSHo7DQogICAgc19Gb3V0SHpDYWNoZVtzX1BsbFNldHVwQ2FjaGVJZHhdID0gZm91dEh6Ow0KICAgIHNfVXNlU1NDYWNoZVtzX1BsbFNldHVwQ2FjaGVJZHhdID0gdXNlU1M7DQoNCiAgICBzX1BsbFNldHVwQ2FjaGVTdHJ1Y3Rbc19QbGxTZXR1cENhY2hlSWR4XS5wbGxjdHJsID0gcFNldHVwLT5wbGxjdHJsOw0KICAgIHNfUGxsU2V0dXBDYWNoZVN0cnVjdFtzX1BsbFNldHVwQ2FjaGVJZHhdLnBsbG5kZWMgPSBwU2V0dXAtPnBsbG5kZWM7DQogICAgc19QbGxTZXR1cENhY2hlU3RydWN0W3NfUGxsU2V0dXBDYWNoZUlkeF0ucGxscGRlYyA9IHBTZXR1cC0+cGxscGRlYzsNCiAgICBzX1BsbFNldHVwQ2FjaGVTdHJ1Y3Rbc19QbGxTZXR1cENhY2hlSWR4XS5wbGxzc2NnWzBdID0gcFNldHVwLT5wbGxzc2NnWzBdOw0KICAgIHNfUGxsU2V0dXBDYWNoZVN0cnVjdFtzX1BsbFNldHVwQ2FjaGVJZHhdLnBsbHNzY2dbMV0gPSBwU2V0dXAtPnBsbHNzY2dbMV07DQogICAgLyogVXBkYXRlIHRoZSBpbmRleCBmb3IgbmV4dCBhdmFpbGFibGUgYnVmZmVyLiAqLw0KICAgIHNfUGxsU2V0dXBDYWNoZUlkeCA9IChzX1BsbFNldHVwQ2FjaGVJZHggKyAxVSkgJSBDTE9DS19VU1JfQ0ZHX1BMTF9DT05GSUdfQ0FDSEVfQ09VTlQ7DQojZW5kaWYgLyogQ0xPQ0tfVVNSX0NGR19QTExfQ09ORklHX0NBQ0hFX0NPVU5UICovDQoNCiAgICByZXR1cm4gcmV0RXJyOw0KfQ0KDQovKiBVcGRhdGUgbG9jYWwgUExMIHJhdGUgdmFyaWFibGUgKi8NCnN0YXRpYyB2b2lkIENMT0NLX0dldFBMTDBPdXRGcm9tU2V0dXBVcGRhdGUocGxsX3NldHVwX3QgKnBTZXR1cCkNCnsNCiAgICBzX1BsbDBfRnJlcSA9IENMT0NLX0dldFBMTDBPdXRGcm9tU2V0dXAocFNldHVwKTsNCn0NCg0KLyogUmV0dXJuIFN5c3RlbSBQTEwgaW5wdXQgY2xvY2sgcmF0ZSAqLw0KLyohIGJyaWVmICAgIFJldHVybiAgUExMMCBpbnB1dCBjbG9jayByYXRlDQoqICByZXR1cm4gICAgUExMMCBpbnB1dCBjbG9jayByYXRlDQoqLw0KdWludDMyX3QgQ0xPQ0tfR2V0UExMMEluQ2xvY2tSYXRlKHZvaWQpDQp7DQogICAgdWludDMyX3QgY2xrUmF0ZSA9IDBVOw0KDQogICAgc3dpdGNoICgoU1lTQ09OLT5QTEwwQ0xLU0VMICYgU1lTQ09OX1BMTDBDTEtTRUxfU0VMX01BU0spKQ0KICAgIHsNCiAgICAgICAgY2FzZSAweDAwVToNCiAgICAgICAgICAgIGNsa1JhdGUgPSBDTEtfRlJPXzEyTUhaOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSAweDAxVToNCiAgICAgICAgICAgIGNsa1JhdGUgPSBDTE9DS19HZXRFeHRDbGtGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDB4MDJVOg0KICAgICAgICAgICAgY2xrUmF0ZSA9IENMT0NLX0dldEZybzFNRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSAweDAzVToNCiAgICAgICAgICAgIGNsa1JhdGUgPSBDTE9DS19HZXRPc2MzMktGcmVxKCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgY2xrUmF0ZSA9IDBVOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgcmV0dXJuIGNsa1JhdGU7DQp9DQoNCi8qIFJldHVybiBQTEwxIGlucHV0IGNsb2NrIHJhdGUgKi8NCnVpbnQzMl90IENMT0NLX0dldFBMTDFJbkNsb2NrUmF0ZSh2b2lkKQ0Kew0KICAgIHVpbnQzMl90IGNsa1JhdGUgPSAwVTsNCg0KICAgIHN3aXRjaCAoKFNZU0NPTi0+UExMMUNMS1NFTCAmIFNZU0NPTl9QTEwxQ0xLU0VMX1NFTF9NQVNLKSkNCiAgICB7DQogICAgICAgIGNhc2UgMHgwMFU6DQogICAgICAgICAgICBjbGtSYXRlID0gQ0xLX0ZST18xMk1IWjsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgIGNhc2UgMHgwMVU6DQogICAgICAgICAgICBjbGtSYXRlID0gQ0xPQ0tfR2V0RXh0Q2xrRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSAweDAyVToNCiAgICAgICAgICAgIGNsa1JhdGUgPSBDTE9DS19HZXRGcm8xTUZyZXEoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgIGNhc2UgMHgwM1U6DQogICAgICAgICAgICBjbGtSYXRlID0gQ0xPQ0tfR2V0T3NjMzJLRnJlcSgpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIGNsa1JhdGUgPSAwVTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIHJldHVybiBjbGtSYXRlOw0KfQ0KDQovKiBSZXR1cm4gUExMMCBvdXRwdXQgY2xvY2sgcmF0ZSBmcm9tIHNldHVwIHN0cnVjdHVyZSAqLw0KLyohIGJyaWVmICAgIFJldHVybiBQTEwwIG91dHB1dCBjbG9jayByYXRlIGZyb20gc2V0dXAgc3RydWN0dXJlDQoqICBwYXJhbSAgICBwU2V0dXAgOiBQb2ludGVyIHRvIGEgUExMIHNldHVwIHN0cnVjdHVyZQ0KKiAgcmV0dXJuICAgUExMMCBvdXRwdXQgY2xvY2sgcmF0ZSB0aGUgc2V0dXAgc3RydWN0dXJlIHdpbGwgZ2VuZXJhdGUNCiovDQp1aW50MzJfdCBDTE9DS19HZXRQTEwwT3V0RnJvbVNldHVwKHBsbF9zZXR1cF90ICpwU2V0dXApDQp7DQogICAgdWludDMyX3QgY2xrUmF0ZSA9IDA7DQogICAgdWludDMyX3QgcHJlZGl2LCBwb3N0ZGl2Ow0KICAgIGZsb2F0IHdvcmtSYXRlID0gMDsNCg0KICAgIC8qIEdldCB0aGUgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IG9mIFBMTC4gKi8NCiAgICBjbGtSYXRlID0gQ0xPQ0tfR2V0UExMMEluQ2xvY2tSYXRlKCk7DQoNCiAgICBpZiAoKChTWVNDT04tPlBMTDBDVFJMICYgU1lTQ09OX1BMTDBDVFJMX0JZUEFTU1BMTF9NQVNLKSA9PSAwKSAmJiAoU1lTQ09OLT5QTEwwQ1RSTCAmIFNZU0NPTl9QTEwwQ1RSTF9DTEtFTl9NQVNLKSAmJiAoKFBNQy0+UERSVU5DRkcwICYgUE1DX1BEUlVOQ0ZHMF9QREVOX1BMTDBfTUFTSykgPT0gMCkgJiYgKChQTUMtPlBEUlVOQ0ZHMCAmIFBNQ19QRFJVTkNGRzBfUERFTl9QTEwwX1NTQ0dfTUFTSykgPT0gMCkpDQogICAgew0KICAgICAgICBwcmVkaXYgPSBmaW5kUGxsMFByZURpdigpOw0KICAgICAgICBwb3N0ZGl2ID0gZmluZFBsbDBQb3N0RGl2KCk7DQogICAgICAgIC8qIEFkanVzdCBpbnB1dCBjbG9jayAqLw0KICAgICAgICBjbGtSYXRlID0gY2xrUmF0ZSAvIHByZWRpdjsNCiAgICAgICAgLyogTURFQyB1c2VkIGZvciByYXRlICovDQogICAgICAgIHdvcmtSYXRlID0gKGZsb2F0KWNsa1JhdGUgKiAoZmxvYXQpZmluZFBsbDBNTXVsdCgpOw0KICAgICAgICBjbGtSYXRlID0gKHVpbnQzMl90KSh3b3JrUmF0ZSAvICgoZmxvYXQpcG9zdGRpdikpOw0KICAgIH0NCg0KICAgIHJldHVybiAodWludDMyX3Qpd29ya1JhdGU7DQp9DQoNCi8qIFNldCB0aGUgY3VycmVudCBQTEwwIFJhdGUgKi8NCi8qISBicmllZiBTdG9yZSB0aGUgY3VycmVudCBQTEwgcmF0ZQ0KKiAgcGFyYW0gICAgcmF0ZTogQ3VycmVudCByYXRlIG9mIHRoZSBQTEwNCiogIHJldHVybiAgIE5vdGhpbmcNCioqLw0Kdm9pZCBDTE9DS19TZXRTdG9yZWRQTEwwQ2xvY2tSYXRlKHVpbnQzMl90IHJhdGUpDQp7DQogICAgc19QbGwwX0ZyZXEgPSByYXRlOw0KfQ0KDQovKiBSZXR1cm4gUExMMCBvdXRwdXQgY2xvY2sgcmF0ZSAqLw0KLyohIGJyaWVmICAgIFJldHVybiAgUExMMCBvdXRwdXQgY2xvY2sgcmF0ZQ0KKiAgcGFyYW0gICAgcmVjb21wdXRlICAgOiBGb3JjZXMgYSBQTEwgcmF0ZSByZWNvbXB1dGF0aW9uIGlmIHRydWUNCiogIHJldHVybiAgICBQTEwwIG91dHB1dCBjbG9jayByYXRlDQoqICBub3RlIFRoZSBQTEwgcmF0ZSBpcyBjYWNoZWQgaW4gdGhlIGRyaXZlciBpbiBhIHZhcmlhYmxlIGFzDQoqICB0aGUgcmF0ZSBjb21wdXRhdGlvbiBmdW5jdGlvbiBjYW4gdGFrZSBzb21lIHRpbWUgdG8gcGVyZm9ybS4gSXQNCiogIGlzIHJlY29tbWVuZGVkIHRvIHVzZSAnZmFsc2UnIHdpdGggdGhlICdyZWNvbXB1dGUnIHBhcmFtZXRlci4NCiovDQp1aW50MzJfdCBDTE9DS19HZXRQTEwwT3V0Q2xvY2tSYXRlKGJvb2wgcmVjb21wdXRlKQ0Kew0KICAgIHBsbF9zZXR1cF90IFNldHVwOw0KICAgIHVpbnQzMl90IHJhdGU7DQoNCiAgICBpZiAoKHJlY29tcHV0ZSkgfHwgKHNfUGxsMF9GcmVxID09IDBVKSkNCiAgICB7DQogICAgICAgIFNldHVwLnBsbGN0cmwgPSBTWVNDT04tPlBMTDBDVFJMOw0KICAgICAgICBTZXR1cC5wbGxuZGVjID0gU1lTQ09OLT5QTEwwTkRFQzsNCiAgICAgICAgU2V0dXAucGxscGRlYyA9IFNZU0NPTi0+UExMMFBERUM7DQogICAgICAgIFNldHVwLnBsbHNzY2dbMF0gPSBTWVNDT04tPlBMTDBTU0NHMDsNCiAgICAgICAgU2V0dXAucGxsc3NjZ1sxXSA9IFNZU0NPTi0+UExMMFNTQ0cxOw0KDQogICAgICAgIENMT0NLX0dldFBMTDBPdXRGcm9tU2V0dXBVcGRhdGUoJlNldHVwKTsNCiAgICB9DQoNCiAgICByYXRlID0gc19QbGwwX0ZyZXE7DQoNCiAgICByZXR1cm4gcmF0ZTsNCn0NCg0KLyogU2V0IFBMTDAgb3V0cHV0IGJhc2VkIG9uIHRoZSBwYXNzZWQgUExMIHNldHVwIGRhdGEgKi8NCi8qISBicmllZiAgICBTZXQgUExMIG91dHB1dCBiYXNlZCBvbiB0aGUgcGFzc2VkIFBMTCBzZXR1cCBkYXRhDQoqICBwYXJhbSAgICBwQ29udHJvbCAgICA6IFBvaW50ZXIgdG8gcG9wdWxhdGVkIFBMTCBjb250cm9sIHN0cnVjdHVyZSB0byBnZW5lcmF0ZSBzZXR1cCB3aXRoDQoqICBwYXJhbSAgICBwU2V0dXAgICAgICA6IFBvaW50ZXIgdG8gUExMIHNldHVwIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQNCiogIHJldHVybiAgIFBMTF9FUlJPUl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIFBMTCBzZXR1cCBlcnJvciBjb2RlDQoqICBub3RlIEFjdHVhbCBmcmVxdWVuY3kgZm9yIHNldHVwIG1heSB2YXJ5IGZyb20gdGhlIGRlc2lyZWQgZnJlcXVlbmN5IGJhc2VkIG9uIHRoZQ0KKiAgYWNjdXJhY3kgb2YgaW5wdXQgY2xvY2tzLCByb3VuZGluZywgbm9uLWZyYWN0aW9uYWwgUExMIG1vZGUsIGV0Yy4NCiovDQpwbGxfZXJyb3JfdCBDTE9DS19TZXR1cFBMTDBEYXRhKHBsbF9jb25maWdfdCAqcENvbnRyb2wsIHBsbF9zZXR1cF90ICpwU2V0dXApDQp7DQogICAgdWludDMyX3QgaW5SYXRlOw0KICAgIGJvb2wgdXNlU1MgPSAoYm9vbCkoKHBDb250cm9sLT5mbGFncyAmIFBMTF9DT05GSUdGTEFHX0ZPUkNFTk9GUkFDVCkgPT0gMFUpOw0KDQogICAgcGxsX2Vycm9yX3QgcGxsRXJyb3I7DQoNCiAgICAvKiBEZXRlcm1pbmUgaW5wdXQgcmF0ZSBmb3IgdGhlIFBMTCAqLw0KICAgIGlmICgocENvbnRyb2wtPmZsYWdzICYgUExMX0NPTkZJR0ZMQUdfVVNFSU5SQVRFKSAhPSAwVSkNCiAgICB7DQogICAgICAgIGluUmF0ZSA9IHBDb250cm9sLT5pbnB1dFJhdGU7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGluUmF0ZSA9IENMT0NLX0dldFBMTDBJbkNsb2NrUmF0ZSgpOw0KICAgIH0NCg0KICAgIC8qIFBMTCBmbGFnIG9wdGlvbnMgKi8NCiAgICBwbGxFcnJvciA9IENMT0NLX0dldFBsbDBDb25maWcoaW5SYXRlLCBwQ29udHJvbC0+ZGVzaXJlZFJhdGUsIHBTZXR1cCwgdXNlU1MpOw0KICAgIGlmICgodXNlU1MpICYmIChwbGxFcnJvciA9PSBrU3RhdHVzX1BMTF9TdWNjZXNzKSkNCiAgICB7DQogICAgICAgIC8qIElmIHVzaW5nIFNTIG1vZGUsIHRoZW4gc29tZSB0d2Vha3MgYXJlIG1hZGUgdG8gdGhlIGdlbmVyYXRlZCBzZXR1cCAqLw0KICAgICAgICBwU2V0dXAtPnBsbHNzY2dbMV0gfD0gKHVpbnQzMl90KXBDb250cm9sLT5zc19tZiB8ICh1aW50MzJfdClwQ29udHJvbC0+c3NfbXIgfCAodWludDMyX3QpcENvbnRyb2wtPnNzX21jOw0KICAgICAgICBpZiAocENvbnRyb2wtPm1mRGl0aGVyKQ0KICAgICAgICB7DQogICAgICAgICAgICBwU2V0dXAtPnBsbHNzY2dbMV0gfD0gKDFVIDw8IFNZU0NPTl9QTEwwU1NDRzFfRElUSEVSX1NISUZUKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBwbGxFcnJvcjsNCn0NCg0KLyogU2V0IFBMTDAgb3V0cHV0IGZyb20gUExMIHNldHVwIHN0cnVjdHVyZSAqLw0KLyohIGJyaWVmICAgIFNldCBQTEwgb3V0cHV0IGZyb20gUExMIHNldHVwIHN0cnVjdHVyZSAocHJlY2lzZSBmcmVxdWVuY3kpDQoqIHBhcmFtIHBTZXR1cCAgOiBQb2ludGVyIHRvIHBvcHVsYXRlZCBQTEwgc2V0dXAgc3RydWN0dXJlDQoqIHBhcmFtIGZsYWdjZmcgOiBGbGFnIGNvbmZpZ3VyYXRpb24gZm9yIFBMTCBjb25maWcgc3RydWN0dXJlDQoqIHJldHVybiAgICBQTExfRVJST1JfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciBQTEwgc2V0dXAgZXJyb3IgY29kZQ0KKiBub3RlICBUaGlzIGZ1bmN0aW9uIHdpbGwgcG93ZXIgb2ZmIHRoZSBQTEwsIHNldHVwIHRoZSBQTEwgd2l0aCB0aGUNCiogbmV3IHNldHVwIGRhdGEsIGFuZCB0aGVuIG9wdGlvbmFsbHkgcG93ZXJ1cCB0aGUgUExMLCB3YWl0IGZvciBQTEwgbG9jaywNCiogYW5kIGFkanVzdCBzeXN0ZW0gdm9sdGFnZXMgdG8gdGhlIG5ldyBQTEwgcmF0ZS4gVGhlIGZ1bmN0aW9uIHdpbGwgbm90DQoqIGFsdGVyIGFueSBzb3VyY2UgY2xvY2tzIChpZSwgbWFpbiBzeXN0ZW4gY2xvY2spIHRoYXQgbWF5IHVzZSB0aGUgUExMLA0KKiBzbyB0aGVzZSBzaG91bGQgYmUgc2V0dXAgcHJpb3IgdG8gYW5kIGFmdGVyIGV4aXRpbmcgdGhlIGZ1bmN0aW9uLg0KKi8NCnBsbF9lcnJvcl90IENMT0NLX1NldHVwUExMMFByZWMocGxsX3NldHVwX3QgKnBTZXR1cCwgdWludDMyX3QgZmxhZ2NmZykNCnsgICANCiAgICB1aW50MzJfdCBpblJhdGUsIGNsa1JhdGUsIHByZWRpdjsNCg0KICAgIC8qIFBvd2VyIG9mZiBQTEwgZHVyaW5nIHNldHVwIGNoYW5nZXMgKi8NCiAgICBQT1dFUl9FbmFibGVQRChrUERSVU5DRkdfUERfUExMMCk7DQogICAgUE9XRVJfRW5hYmxlUEQoa1BEUlVOQ0ZHX1BEX1BMTDBfU1NDRyk7DQoNCiAgICBwU2V0dXAtPmZsYWdzID0gZmxhZ2NmZzsNCg0KICAgIC8qIFdyaXRlIFBMTCBzZXR1cCBkYXRhICovDQogICAgU1lTQ09OLT5QTEwwQ1RSTCA9IHBTZXR1cC0+cGxsY3RybDsNCiAgICBTWVNDT04tPlBMTDBOREVDID0gcFNldHVwLT5wbGxuZGVjOw0KICAgIFNZU0NPTi0+UExMME5ERUMgPSBwU2V0dXAtPnBsbG5kZWMgfCAoMVUgPDwgU1lTQ09OX1BMTDBOREVDX05SRVFfU0hJRlQpOyAvKiBsYXRjaCAqLw0KICAgIFNZU0NPTi0+UExMMFBERUMgPSBwU2V0dXAtPnBsbHBkZWM7DQogICAgU1lTQ09OLT5QTEwwUERFQyA9IHBTZXR1cC0+cGxscGRlYyB8ICgxVSA8PCBTWVNDT05fUExMMFBERUNfUFJFUV9TSElGVCk7IC8qIGxhdGNoICovDQogICAgU1lTQ09OLT5QTEwwU1NDRzAgPSBwU2V0dXAtPnBsbHNzY2dbMF07DQogICAgU1lTQ09OLT5QTEwwU1NDRzEgPSBwU2V0dXAtPnBsbHNzY2dbMV07DQogICAgU1lTQ09OLT5QTEwwU1NDRzEgPQ0KICAgICAgICBwU2V0dXAtPnBsbHNzY2dbMV0gfCAoMVUgPDwgU1lTQ09OX1BMTDBTU0NHMV9NUkVRX1NISUZUKSB8ICgxVSA8PCBTWVNDT05fUExMMFNTQ0cxX01EX1JFUV9TSElGVCk7IC8qIGxhdGNoICovDQoNCiAgICBQT1dFUl9EaXNhYmxlUEQoa1BEUlVOQ0ZHX1BEX1BMTDApOw0KICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfUExMMF9TU0NHKTsNCg0KICAgIGlmICgocFNldHVwLT5mbGFncyAmIFBMTF9TRVRVUEZMQUdfV0FJVExPQ0spICE9IDBVKQ0KICAgIHsNCiAgICAgICAgaW5SYXRlID0gQ0xPQ0tfR2V0UExMMEluQ2xvY2tSYXRlKCk7DQogICAgICAgIHByZWRpdiA9IGZpbmRQbGwwUHJlRGl2KCk7DQogICAgICAgIC8qIEFkanVzdCBpbnB1dCBjbG9jayAqLw0KICAgICAgICBjbGtSYXRlID0gaW5SYXRlIC8gcHJlZGl2Ow0KICAgICAgICAvKiBUaGUgbG9jayBzaWduYWwgaXMgb25seSByZWxpYWJsZSBiZXR3ZWVuIGZyZWZbMl0gOjEwMCBrSHogdG8gMjAgTUh6LiAqLw0KICAgICAgICBpZiAoKGNsa1JhdGUgPj0gMTAwMDAwKSAmJiAoY2xrUmF0ZSA8PSAyMDAwMDAwMCkpDQogICAgICAgIHsNCiAgICAgICAgICAgIHdoaWxlIChDTE9DS19Jc1BMTDBMb2NrZWQoKSA9PSBmYWxzZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIFVwZGF0ZSBjdXJyZW50IHByb2dyYW1tZWQgUExMIHJhdGUgdmFyICovDQogICAgQ0xPQ0tfR2V0UExMME91dEZyb21TZXR1cFVwZGF0ZShwU2V0dXApOw0KDQogICAgLyogU3lzdGVtIHZvbHRhZ2UgYWRqdXN0bWVudCwgb2NjdXJzIHByaW9yIHRvIHNldHRpbmcgbWFpbiBzeXN0ZW0gY2xvY2sgKi8NCiAgICBpZiAoKHBTZXR1cC0+ZmxhZ3MgJiBQTExfU0VUVVBGTEFHX0FER1ZPTFQpICE9IDBVKQ0KICAgIHsNCiAgICAgICAgUE9XRVJfU2V0Vm9sdGFnZUZvckZyZXEoc19QbGwwX0ZyZXEpOw0KICAgIH0NCg0KICAgIHJldHVybiBrU3RhdHVzX1BMTF9TdWNjZXNzOw0KfQ0KDQovKiBTZXR1cCBQTEwgRnJlcXVlbmN5IGZyb20gcHJlLWNhbGN1bGF0ZWQgdmFsdWUgKi8NCi8qKg0KKiBicmllZiBTZXQgUExMMCBvdXRwdXQgZnJvbSBQTEwgc2V0dXAgc3RydWN0dXJlIChwcmVjaXNlIGZyZXF1ZW5jeSkNCiogcGFyYW0gcFNldHVwICA6IFBvaW50ZXIgdG8gcG9wdWxhdGVkIFBMTCBzZXR1cCBzdHJ1Y3R1cmUNCiogcmV0dXJuICAgIGtTdGF0dXNfUExMX1N1Y2Nlc3Mgb24gc3VjY2Vzcywgb3IgUExMIHNldHVwIGVycm9yIGNvZGUNCiogbm90ZSAgVGhpcyBmdW5jdGlvbiB3aWxsIHBvd2VyIG9mZiB0aGUgUExMLCBzZXR1cCB0aGUgUExMIHdpdGggdGhlDQoqIG5ldyBzZXR1cCBkYXRhLCBhbmQgdGhlbiBvcHRpb25hbGx5IHBvd2VydXAgdGhlIFBMTCwgd2FpdCBmb3IgUExMIGxvY2ssDQoqIGFuZCBhZGp1c3Qgc3lzdGVtIHZvbHRhZ2VzIHRvIHRoZSBuZXcgUExMIHJhdGUuIFRoZSBmdW5jdGlvbiB3aWxsIG5vdA0KKiBhbHRlciBhbnkgc291cmNlIGNsb2NrcyAoaWUsIG1haW4gc3lzdGVuIGNsb2NrKSB0aGF0IG1heSB1c2UgdGhlIFBMTCwNCiogc28gdGhlc2Ugc2hvdWxkIGJlIHNldHVwIHByaW9yIHRvIGFuZCBhZnRlciBleGl0aW5nIHRoZSBmdW5jdGlvbi4NCiovDQpwbGxfZXJyb3JfdCBDTE9DS19TZXRQTEwwRnJlcShjb25zdCBwbGxfc2V0dXBfdCAqcFNldHVwKQ0Kew0KICAgIHVpbnQzMl90IGluUmF0ZSwgY2xrUmF0ZSwgcHJlZGl2Ow0KICAgIC8qIFBvd2VyIG9mZiBQTEwgZHVyaW5nIHNldHVwIGNoYW5nZXMgKi8NCiAgICBQT1dFUl9FbmFibGVQRChrUERSVU5DRkdfUERfUExMMCk7DQogICAgUE9XRVJfRW5hYmxlUEQoa1BEUlVOQ0ZHX1BEX1BMTDBfU1NDRyk7DQoNCiAgICAvKiBXcml0ZSBQTEwgc2V0dXAgZGF0YSAqLw0KICAgIFNZU0NPTi0+UExMMENUUkwgPSBwU2V0dXAtPnBsbGN0cmw7DQogICAgU1lTQ09OLT5QTEwwTkRFQyA9IHBTZXR1cC0+cGxsbmRlYzsNCiAgICBTWVNDT04tPlBMTDBOREVDID0gcFNldHVwLT5wbGxuZGVjIHwgKDFVIDw8IFNZU0NPTl9QTEwwTkRFQ19OUkVRX1NISUZUKTsgLyogbGF0Y2ggKi8NCiAgICBTWVNDT04tPlBMTDBQREVDID0gcFNldHVwLT5wbGxwZGVjOw0KICAgIFNZU0NPTi0+UExMMFBERUMgPSBwU2V0dXAtPnBsbHBkZWMgfCAoMVUgPDwgU1lTQ09OX1BMTDBQREVDX1BSRVFfU0hJRlQpOyAvKiBsYXRjaCAqLw0KICAgIFNZU0NPTi0+UExMMFNTQ0cwID0gcFNldHVwLT5wbGxzc2NnWzBdOw0KICAgIFNZU0NPTi0+UExMMFNTQ0cxID0gcFNldHVwLT5wbGxzc2NnWzFdOw0KICAgIFNZU0NPTi0+UExMMFNTQ0cxID0NCiAgICAgICAgcFNldHVwLT5wbGxzc2NnWzFdIHwgKDFVIDw8IFNZU0NPTl9QTEwwU1NDRzFfTURfUkVRX1NISUZUKSB8ICgxVSA8PCBTWVNDT05fUExMMFNTQ0cxX01SRVFfU0hJRlQpOyAvKiBsYXRjaCAqLw0KDQogICAgUE9XRVJfRGlzYWJsZVBEKGtQRFJVTkNGR19QRF9QTEwwKTsNCiAgICBQT1dFUl9EaXNhYmxlUEQoa1BEUlVOQ0ZHX1BEX1BMTDBfU1NDRyk7DQoNCiAgICBpZiAoKHBTZXR1cC0+ZmxhZ3MgJiBQTExfU0VUVVBGTEFHX1dBSVRMT0NLKSAhPSAwVSkNCiAgICB7DQogICAgICAgIGluUmF0ZSA9IENMT0NLX0dldFBMTDBJbkNsb2NrUmF0ZSgpOw0KICAgICAgICBwcmVkaXYgPSBmaW5kUGxsMFByZURpdigpOw0KICAgICAgICAvKiBBZGp1c3QgaW5wdXQgY2xvY2sgKi8NCiAgICAgICAgY2xrUmF0ZSA9IGluUmF0ZSAvIHByZWRpdjsNCiAgICAgICAgLyogVGhlIGxvY2sgc2lnbmFsIGlzIG9ubHkgcmVsaWFibGUgYmV0d2VlbiBmcmVmWzJdIDoxMDAga0h6IHRvIDIwIE1Iei4gKi8NCiAgICAgICAgaWYgKChjbGtSYXRlID49IDEwMDAwMCkgJiYgKGNsa1JhdGUgPD0gMjAwMDAwMDApKQ0KICAgICAgICB7DQogICAgICAgICAgICB3aGlsZSAoQ0xPQ0tfSXNQTEwwTG9ja2VkKCkgPT0gZmFsc2UpDQogICAgICAgICAgICB7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBVcGRhdGUgY3VycmVudCBwcm9ncmFtbWVkIFBMTCByYXRlIHZhciAqLw0KICAgIHNfUGxsMF9GcmVxID0gcFNldHVwLT5wbGxSYXRlOw0KDQogICAgcmV0dXJuIGtTdGF0dXNfUExMX1N1Y2Nlc3M7DQp9DQoNCi8qIFNldHVwIFBMTDEgRnJlcXVlbmN5IGZyb20gcHJlLWNhbGN1bGF0ZWQgdmFsdWUgKi8NCi8qKg0KKiBicmllZiBTZXQgUExMMSBvdXRwdXQgZnJvbSBQTEwgc2V0dXAgc3RydWN0dXJlIChwcmVjaXNlIGZyZXF1ZW5jeSkNCiogcGFyYW0gcFNldHVwICA6IFBvaW50ZXIgdG8gcG9wdWxhdGVkIFBMTCBzZXR1cCBzdHJ1Y3R1cmUNCiogcmV0dXJuICAgIGtTdGF0dXNfUExMX1N1Y2Nlc3Mgb24gc3VjY2Vzcywgb3IgUExMIHNldHVwIGVycm9yIGNvZGUNCiogbm90ZSAgVGhpcyBmdW5jdGlvbiB3aWxsIHBvd2VyIG9mZiB0aGUgUExMLCBzZXR1cCB0aGUgUExMIHdpdGggdGhlDQoqIG5ldyBzZXR1cCBkYXRhLCBhbmQgdGhlbiBvcHRpb25hbGx5IHBvd2VydXAgdGhlIFBMTCwgd2FpdCBmb3IgUExMIGxvY2ssDQoqIGFuZCBhZGp1c3Qgc3lzdGVtIHZvbHRhZ2VzIHRvIHRoZSBuZXcgUExMIHJhdGUuIFRoZSBmdW5jdGlvbiB3aWxsIG5vdA0KKiBhbHRlciBhbnkgc291cmNlIGNsb2NrcyAoaWUsIG1haW4gc3lzdGVuIGNsb2NrKSB0aGF0IG1heSB1c2UgdGhlIFBMTCwNCiogc28gdGhlc2Ugc2hvdWxkIGJlIHNldHVwIHByaW9yIHRvIGFuZCBhZnRlciBleGl0aW5nIHRoZSBmdW5jdGlvbi4NCiovDQpwbGxfZXJyb3JfdCBDTE9DS19TZXRQTEwxRnJlcShjb25zdCBwbGxfc2V0dXBfdCAqcFNldHVwKQ0Kew0KICAgIHVpbnQzMl90IGluUmF0ZSwgY2xrUmF0ZSwgcHJlZGl2Ow0KICAgIC8qIFBvd2VyIG9mZiBQTEwgZHVyaW5nIHNldHVwIGNoYW5nZXMgKi8NCiAgICBQT1dFUl9FbmFibGVQRChrUERSVU5DRkdfUERfUExMMSk7DQoNCiAgICAvKiBXcml0ZSBQTEwgc2V0dXAgZGF0YSAqLw0KICAgIFNZU0NPTi0+UExMMUNUUkwgPSBwU2V0dXAtPnBsbGN0cmw7DQogICAgU1lTQ09OLT5QTEwxTkRFQyA9IHBTZXR1cC0+cGxsbmRlYzsNCiAgICBTWVNDT04tPlBMTDFOREVDID0gcFNldHVwLT5wbGxuZGVjIHwgKDFVIDw8IFNZU0NPTl9QTEwxTkRFQ19OUkVRX1NISUZUKTsgLyogbGF0Y2ggKi8NCiAgICBTWVNDT04tPlBMTDFQREVDID0gcFNldHVwLT5wbGxwZGVjOw0KICAgIFNZU0NPTi0+UExMMVBERUMgPSBwU2V0dXAtPnBsbHBkZWMgfCAoMVUgPDwgU1lTQ09OX1BMTDFQREVDX1BSRVFfU0hJRlQpOyAvKiBsYXRjaCAqLw0KICAgIFNZU0NPTi0+UExMMU1ERUMgPSBwU2V0dXAtPnBsbG1kZWM7DQogICAgU1lTQ09OLT5QTEwxTURFQyA9IHBTZXR1cC0+cGxsbWRlYyB8ICgxVSA8PCBTWVNDT05fUExMMU1ERUNfTVJFUV9TSElGVCk7IC8qIGxhdGNoICovDQoNCiAgICBQT1dFUl9EaXNhYmxlUEQoa1BEUlVOQ0ZHX1BEX1BMTDEpOw0KDQogICAgaWYgKChwU2V0dXAtPmZsYWdzICYgUExMX1NFVFVQRkxBR19XQUlUTE9DSykgIT0gMFUpDQogICAgew0KICAgICAgICBpblJhdGUgPSBDTE9DS19HZXRQTEwxSW5DbG9ja1JhdGUoKTsNCiAgICAgICAgcHJlZGl2ID0gZmluZFBsbDFQcmVEaXYoKTsNCiAgICAgICAgLyogQWRqdXN0IGlucHV0IGNsb2NrICovDQogICAgICAgIGNsa1JhdGUgPSBpblJhdGUgLyBwcmVkaXY7DQogICAgICAgIC8qIFRoZSBsb2NrIHNpZ25hbCBpcyBvbmx5IHJlbGlhYmxlIGJldHdlZW4gZnJlZlsyXSA6MTAwIGtIeiB0byAyMCBNSHouICovDQogICAgICAgIGlmICgoY2xrUmF0ZSA+PSAxMDAwMDApICYmIChjbGtSYXRlIDw9IDIwMDAwMDAwKSkNCiAgICAgICAgew0KICAgICAgICAgICAgd2hpbGUgKENMT0NLX0lzUExMMUxvY2tlZCgpID09IGZhbHNlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogVXBkYXRlIGN1cnJlbnQgcHJvZ3JhbW1lZCBQTEwgcmF0ZSB2YXIgKi8NCiAgICBzX1BsbDBfRnJlcSA9IHBTZXR1cC0+cGxsUmF0ZTsNCg0KICAgIHJldHVybiBrU3RhdHVzX1BMTF9TdWNjZXNzOw0KfQ0KDQovKiBTZXQgUExMMCBjbG9jayBiYXNlZCBvbiB0aGUgaW5wdXQgZnJlcXVlbmN5IGFuZCBtdWx0aXBsaWVyICovDQovKiEgYnJpZWYgICAgU2V0IFBMTDAgb3V0cHV0IGJhc2VkIG9uIHRoZSBtdWx0aXBsaWVyIGFuZCBpbnB1dCBmcmVxdWVuY3kNCiogcGFyYW0gbXVsdGlwbHlfYnkgOiBtdWx0aXBsaWVyDQoqIHBhcmFtIGlucHV0X2ZyZXEgIDogQ2xvY2sgaW5wdXQgZnJlcXVlbmN5IG9mIHRoZSBQTEwNCiogcmV0dXJuICAgIE5vdGhpbmcNCiogbm90ZSAgVW5saWtlIHRoZSBDaGlwX0Nsb2NrX1NldHVwU3lzdGVtUExMUHJlYygpIGZ1bmN0aW9uLCB0aGlzDQoqIGZ1bmN0aW9uIGRvZXMgbm90IGRpc2FibGUgb3IgZW5hYmxlIFBMTCBwb3dlciwgd2FpdCBmb3IgUExMIGxvY2ssDQoqIG9yIGFkanVzdCBzeXN0ZW0gdm9sdGFnZXMuIFRoZXNlIG11c3QgYmUgZG9uZSBpbiB0aGUgYXBwbGljYXRpb24uDQoqIFRoZSBmdW5jdGlvbiB3aWxsIG5vdCBhbHRlciBhbnkgc291cmNlIGNsb2NrcyAoaWUsIG1haW4gc3lzdGVuIGNsb2NrKQ0KKiB0aGF0IG1heSB1c2UgdGhlIFBMTCwgc28gdGhlc2Ugc2hvdWxkIGJlIHNldHVwIHByaW9yIHRvIGFuZCBhZnRlcg0KKiBleGl0aW5nIHRoZSBmdW5jdGlvbi4NCiovDQp2b2lkIENMT0NLX1NldHVwUExMME11bHQodWludDMyX3QgbXVsdGlwbHlfYnksIHVpbnQzMl90IGlucHV0X2ZyZXEpDQp7DQogICAgdWludDMyX3QgY2NvX2ZyZXEgPSBpbnB1dF9mcmVxICogbXVsdGlwbHlfYnk7DQogICAgdWludDMyX3QgcGRlYyA9IDFVOw0KICAgIHVpbnQzMl90IHNlbHI7DQogICAgdWludDMyX3Qgc2VsaTsNCiAgICB1aW50MzJfdCBzZWxwOw0KICAgIHVpbnQzMl90IG1kZWMsIG5kZWM7DQoNCiAgICB3aGlsZSAoY2NvX2ZyZXEgPCAyNzUwMDAwMDBVKQ0KICAgIHsNCiAgICAgICAgbXVsdGlwbHlfYnkgPDw9IDFVOyAvKiBkb3VibGUgdmFsdWUgaW4gZWFjaCBpdGVyYXRpb24gKi8NCiAgICAgICAgcGRlYyA8PD0gMVU7ICAgICAgICAvKiBjb3JyZXNwb25kaW5nbHkgZG91YmxlIHBkZWMgdG8gY2FuY2VsIGVmZmVjdCBvZiBkb3VibGUgbXNlbCAqLw0KICAgICAgICBjY29fZnJlcSA9IGlucHV0X2ZyZXEgKiBtdWx0aXBseV9ieTsNCiAgICB9DQoNCiAgICBzZWxyID0gMFU7DQoNCiAgICBpZiAobXVsdGlwbHlfYnkgPj0gMzI3NjgpDQogICAgew0KICAgICAgICBzZWxpID0gMTsNCiAgICB9DQogICAgZWxzZSBpZiAobXVsdGlwbHlfYnkgPj0gMTYzODQpDQogICAgew0KICAgICAgICBzZWxpID0gMjsNCiAgICB9DQogICAgZWxzZSBpZiAobXVsdGlwbHlfYnkgPj0gNDA5NikNCiAgICB7DQogICAgICAgIHNlbGkgPSA0Ow0KICAgIH0NCiAgICBlbHNlIGlmIChtdWx0aXBseV9ieSA+PSAxMDAyKQ0KICAgIHsNCiAgICAgICAgc2VsaSA9IDg7DQogICAgfQ0KICAgIGVsc2UgaWYgKG11bHRpcGx5X2J5ID49IDEyMCkNCiAgICB7DQogICAgICAgIHNlbGkgPSA0ICogKCgxMDI0LyhtdWx0aXBseV9ieS8yICsgOSkpICsgMSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHNlbGkgPSA0ICogKG11bHRpcGx5X2J5LzggKyAxKTsNCiAgICB9IA0KDQogICAgaWYgKHNlbGkgPj0gNjNVKQ0KICAgIHsNCiAgICAgICAgc2VsaSA9IDYzVTsNCiAgICB9DQogICAgc2VscCA9IChtdWx0aXBseV9ieSA+PiAyVSkgKyAxVTsNCiAgICB7DQogICAgICAgIHNlbHAgPSAzMVU7DQogICAgfQ0KDQogICAgaWYgKHBkZWMgPiAxVSkNCiAgICB7DQogICAgICAgIHBkZWMgPSBwZGVjIC8gMlU7IC8qIEFjY291bnQgZm9yIG1pbnVzIDEgZW5jb2RpbmcgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNsYXRlIFAgdmFsdWUgKi8NCiAgICB9DQoNCiAgICBtZGVjID0gUExMX1NTQ0cxX01ERUNfVkFMX1NFVChtdWx0aXBseV9ieSk7DQogICAgbmRlYyA9IDB4MVU7IC8qIHByZSBkaXZpZGUgYnkgMSAoaGFyZGNvZGVkKSAqLw0KDQogICAgU1lTQ09OLT5QTEwwQ1RSTCA9IFNZU0NPTl9QTEwwQ1RSTF9DTEtFTl9NQVNLIHxTWVNDT05fUExMMENUUkxfQllQQVNTUE9TVERJVigwKSB8IFNZU0NPTl9QTEwwQ1RSTF9CWVBBU1NQT1NURElWMigwKSB8DQogICAgICAgICAgICAgICAgICAgICAgIChzZWxyIDw8IFNZU0NPTl9QTEwwQ1RSTF9TRUxSX1NISUZUKSB8IChzZWxpIDw8IFNZU0NPTl9QTEwwQ1RSTF9TRUxJX1NISUZUKSB8DQogICAgICAgICAgICAgICAgICAgICAgIChzZWxwIDw8IFNZU0NPTl9QTEwwQ1RSTF9TRUxQX1NISUZUKTsNCiAgICBTWVNDT04tPlBMTDBQREVDID0gcGRlYyB8ICgxVSA8PCBTWVNDT05fUExMMFBERUNfUFJFUV9TSElGVCk7ICAgLyogc2V0IFBkZWMgdmFsdWUgYW5kIGFzc2VydCBwcmVxICovDQogICAgU1lTQ09OLT5QTEwwTkRFQyA9IG5kZWMgfCAoMVUgPDwgU1lTQ09OX1BMTDBOREVDX05SRVFfU0hJRlQpOyAgIC8qIHNldCBQZGVjIHZhbHVlIGFuZCBhc3NlcnQgcHJlcSAqLw0KICAgIFNZU0NPTi0+UExMMFNTQ0cxID0gbWRlYyB8ICgxVSA8PCBTWVNDT05fUExMMFNTQ0cxX01SRVFfU0hJRlQpOyAvKiBzZWxlY3Qgbm9uIHNzY2cgTURFQyB2YWx1ZSwgYXNzZXJ0IG1yZXEgYW5kIHNlbGVjdCBtZGVjIHZhbHVlICovDQp9DQoNCi8qIEVuYWJsZSBVU0IgREVWSUNFIEZVTEwgU1BFRUQgY2xvY2sgKi8NCi8qISBicmllZiBFbmFibGUgVVNCIERldmljZSBGUyBjbG9jay4NCiogcGFyYW0gc3JjIDogY2xvY2sgc291cmNlDQoqIHBhcmFtIGZyZXE6IGNsb2NrIGZyZXF1ZW5jeQ0KKiBFbmFibGUgVVNCIERldmljZSBGdWxsIFNwZWVkIGNsb2NrLg0KKi8NCmJvb2wgQ0xPQ0tfRW5hYmxlVXNiZnMwRGV2aWNlQ2xvY2soY2xvY2tfdXNiZnNfc3JjX3Qgc3JjLCB1aW50MzJfdCBmcmVxKQ0Kew0KICAgIGJvb2wgcmV0ID0gdHJ1ZTsNCg0KICAgIENMT0NLX0Rpc2FibGVDbG9jayhrQ0xPQ0tfVXNiZDApOw0KDQogICAgaWYgKGtDTE9DS19Vc2Jmc1NyY0ZybyA9PSBzcmMpDQogICAgew0KICAgICAgICBzd2l0Y2ggKGZyZXEpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgOTYwMDAwMDBVOg0KICAgICAgICAgICAgICAgIENMT0NLX1NldENsa0RpdihrQ0xPQ0tfRGl2VXNiMENsaywgMiwgZmFsc2UpOyAvKiE8IERpdiBieSAyIHRvIGdldCA0OE1Ieiwgbm8gZGl2aWRlciByZXNldCAqLw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIC8qIFR1cm4gT04gRlJPIEhGICovDQogICAgICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfRlJPMTkyTSk7DQogICAgICAgIC8qIEVuYWJsZSBGUk8gOTZNSHogb3V0cHV0ICovDQogICAgICAgIEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCA9IEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCB8IEFOQUNUUkxfRlJPMTkyTV9DVFJMX0VOQV85Nk1IWkNMS19NQVNLOw0KICAgICAgICAvKiBTZWxlY3QgRlJPIDk2IG9yIDQ4IE1IeiAqLw0KICAgICAgICBDTE9DS19BdHRhY2hDbGsoa0ZST19IRl90b19VU0IwX0NMSyk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIC8qU2V0IHRoZSBVU0IgUExMIGFzIHRoZSBVc2IwIENMSyovDQogICAgICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfUExMMSk7DQogICAgICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfWFRBTDMyTSk7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbnN1cmUgWFRBTDMySyBpcyBvbiAgKi8NCiAgICAgICAgUE9XRVJfRGlzYWJsZVBEKGtQRFJVTkNGR19QRF9MRE9YTzMyTSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuc3VyZSBYVEFMMzJLIGlzIG9uICAqLw0KICAgICAgICBTWVNDT04tPkNMT0NLX0NUUkwgfD0gU1lTQ09OX0NMT0NLX0NUUkxfQ0xLSU5fRU5BX01BU0s7IC8qITwgRW5zdXJlIENMS19JTiBpcyBvbiAgKi8NCiAgICAgICAgQU5BQ1RSTC0+WE8zMk1fQ1RSTCB8PSBBTkFDVFJMX1hPMzJNX0NUUkxfRU5BQkxFX1NZU1RFTV9DTEtfT1VUX01BU0s7DQoNCiAgICAgICAgQ0xPQ0tfQXR0YWNoQ2xrKGtFWFRfQ0xLX3RvX1BMTDEpOyAvKiE8IFN3aXRjaCBQTEwwIGNsb2NrIHNvdXJjZSBzZWxlY3RvciB0byBYVEFMMTZNICovDQoNCiAgICAgICAgY29uc3QgcGxsX3NldHVwX3QgcGxsMVNldHVwID0gew0KICAgICAgICAgICAgLnBsbGN0cmwgPSBTWVNDT05fUExMMUNUUkxfQ0xLRU5fTUFTSyB8IFNZU0NPTl9QTEwxQ1RSTF9TRUxJKDE2VSkgfCBTWVNDT05fUExMMUNUUkxfU0VMUCg3VSksDQogICAgICAgICAgICAucGxsbmRlYyA9IFNZU0NPTl9QTEwxTkRFQ19ORElWKDFVKSwNCiAgICAgICAgICAgIC5wbGxwZGVjID0gU1lTQ09OX1BMTDFQREVDX1BESVYoNFUpLA0KICAgICAgICAgICAgLnBsbG1kZWMgPSBTWVNDT05fUExMMU1ERUNfTURJVigyNFUpLA0KICAgICAgICAgICAgLnBsbFJhdGUgPSA0ODAwMDAwMFUsDQogICAgICAgICAgICAuZmxhZ3MgPSBQTExfU0VUVVBGTEFHX1dBSVRMT0NLLA0KICAgICAgICB9Ow0KDQogICAgICAgIENMT0NLX1NldFBMTDFGcmVxKCZwbGwxU2V0dXApOyAvKiE8IENvbmZpZ3VyZSBQTEwxIHRvIHRoZSBkZXNpcmVkIHZhbHVlcyAqLw0KDQogICAgICAgIENMT0NLX1NldENsa0RpdihrQ0xPQ0tfRGl2VXNiMENsaywgMVUsIGZhbHNlKTsNCiAgICAgICAgQ0xPQ0tfQXR0YWNoQ2xrKGtQTEwxX3RvX1VTQjBfQ0xLKTsNCiAgICAgICAgdWludDMyX3QgZGVsYXkgPSAxMDAwMDA7DQogICAgICAgIHdoaWxlIChkZWxheS0tKQ0KICAgICAgICB7DQogICAgICAgICAgICBfX2FzbSgibm9wIik7DQogICAgICAgIH0NCiAgICB9DQogICAgQ0xPQ0tfRW5hYmxlQ2xvY2soa0NMT0NLX1VzYmQwKTsNCiAgICBDTE9DS19FbmFibGVDbG9jayhrQ0xPQ0tfVXNiUmFtMSk7DQoNCiAgICByZXR1cm4gcmV0Ow0KfQ0KDQovKiBFbmFibGUgVVNCIEhPU1QgRlVMTCBTUEVFRCBjbG9jayAqLw0KLyohIGJyaWVmIEVuYWJsZSBVU0IgSE9TVCBGUyBjbG9jay4NCiogcGFyYW0gc3JjIDogY2xvY2sgc291cmNlDQoqIHBhcmFtIGZyZXE6IGNsb2NrIGZyZXF1ZW5jeQ0KKiBFbmFibGUgVVNCIEhPU1QgRnVsbCBTcGVlZCBjbG9jay4NCiovDQpib29sIENMT0NLX0VuYWJsZVVzYmZzMEhvc3RDbG9jayhjbG9ja191c2Jmc19zcmNfdCBzcmMsIHVpbnQzMl90IGZyZXEpDQp7DQogICAgYm9vbCByZXQgPSB0cnVlOw0KDQogICAgQ0xPQ0tfRGlzYWJsZUNsb2NrKGtDTE9DS19Vc2JobXIwKTsNCiAgICBDTE9DS19EaXNhYmxlQ2xvY2soa0NMT0NLX1VzYmhzbDApOw0KDQogICAgaWYgKGtDTE9DS19Vc2Jmc1NyY0ZybyA9PSBzcmMpDQogICAgew0KICAgICAgICBzd2l0Y2ggKGZyZXEpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgOTYwMDAwMDBVOg0KICAgICAgICAgICAgICAgIENMT0NLX1NldENsa0RpdihrQ0xPQ0tfRGl2VXNiMENsaywgMiwgZmFsc2UpOyAvKiE8IERpdiBieSAyIHRvIGdldCA0OE1Ieiwgbm8gZGl2aWRlciByZXNldCAqLw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIC8qIFR1cm4gT04gRlJPIEhGICovDQogICAgICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfRlJPMTkyTSk7DQogICAgICAgIC8qIEVuYWJsZSBGUk8gOTZNSHogb3V0cHV0ICovDQogICAgICAgIEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCA9IEFOQUNUUkwtPkZSTzE5Mk1fQ1RSTCB8IEFOQUNUUkxfRlJPMTkyTV9DVFJMX0VOQV85Nk1IWkNMS19NQVNLOw0KICAgICAgICAvKiBTZWxlY3QgRlJPIDk2IE1IeiAqLw0KICAgICAgICBDTE9DS19BdHRhY2hDbGsoa0ZST19IRl90b19VU0IwX0NMSyk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIC8qU2V0IHRoZSBVU0IgUExMIGFzIHRoZSBVc2IwIENMSyovDQogICAgICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfUExMMSk7DQogICAgICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfWFRBTDMyTSk7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbnN1cmUgWFRBTDMySyBpcyBvbiAgKi8NCiAgICAgICAgUE9XRVJfRGlzYWJsZVBEKGtQRFJVTkNGR19QRF9MRE9YTzMyTSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuc3VyZSBYVEFMMzJLIGlzIG9uICAqLw0KICAgICAgICBTWVNDT04tPkNMT0NLX0NUUkwgfD0gU1lTQ09OX0NMT0NLX0NUUkxfQ0xLSU5fRU5BX01BU0s7IC8qITwgRW5zdXJlIENMS19JTiBpcyBvbiAgKi8NCiAgICAgICAgQU5BQ1RSTC0+WE8zMk1fQ1RSTCB8PSBBTkFDVFJMX1hPMzJNX0NUUkxfRU5BQkxFX1NZU1RFTV9DTEtfT1VUX01BU0s7DQoNCiAgICAgICAgQ0xPQ0tfQXR0YWNoQ2xrKGtFWFRfQ0xLX3RvX1BMTDEpOyAvKiE8IFN3aXRjaCBQTEwwIGNsb2NrIHNvdXJjZSBzZWxlY3RvciB0byBYVEFMMTZNICovDQoNCiAgICAgICAgY29uc3QgcGxsX3NldHVwX3QgcGxsMVNldHVwID0gew0KICAgICAgICAgICAgLnBsbGN0cmwgPSBTWVNDT05fUExMMUNUUkxfQ0xLRU5fTUFTSyB8IFNZU0NPTl9QTEwxQ1RSTF9TRUxJKDE2VSkgfCBTWVNDT05fUExMMUNUUkxfU0VMUCg3VSksDQogICAgICAgICAgICAucGxsbmRlYyA9IFNZU0NPTl9QTEwxTkRFQ19ORElWKDFVKSwNCiAgICAgICAgICAgIC5wbGxwZGVjID0gU1lTQ09OX1BMTDFQREVDX1BESVYoNFUpLA0KICAgICAgICAgICAgLnBsbG1kZWMgPSBTWVNDT05fUExMMU1ERUNfTURJVigyNFUpLA0KICAgICAgICAgICAgLnBsbFJhdGUgPSA0ODAwMDAwMFUsDQogICAgICAgICAgICAuZmxhZ3MgPSBQTExfU0VUVVBGTEFHX1dBSVRMT0NLLA0KICAgICAgICB9Ow0KDQogICAgICAgIENMT0NLX1NldFBMTDFGcmVxKCZwbGwxU2V0dXApOyAvKiE8IENvbmZpZ3VyZSBQTEwxIHRvIHRoZSBkZXNpcmVkIHZhbHVlcyAqLw0KDQogICAgICAgIENMT0NLX1NldENsa0RpdihrQ0xPQ0tfRGl2VXNiMENsaywgMVUsIGZhbHNlKTsNCiAgICAgICAgQ0xPQ0tfQXR0YWNoQ2xrKGtQTEwxX3RvX1VTQjBfQ0xLKTsNCiAgICAgICAgdWludDMyX3QgZGVsYXkgPSAxMDAwMDA7DQogICAgICAgIHdoaWxlIChkZWxheS0tKQ0KICAgICAgICB7DQogICAgICAgICAgICBfX2FzbSgibm9wIik7DQogICAgICAgIH0NCiAgICB9DQogICAgQ0xPQ0tfRW5hYmxlQ2xvY2soa0NMT0NLX1VzYmhtcjApOw0KICAgIENMT0NLX0VuYWJsZUNsb2NrKGtDTE9DS19Vc2Joc2wwKTsNCiAgICBDTE9DS19FbmFibGVDbG9jayhrQ0xPQ0tfVXNiUmFtMSk7DQoNCiAgICByZXR1cm4gcmV0Ow0KfQ0KDQovKiBFbmFibGUgVVNCIFBIWSBjbG9jayAqLw0KYm9vbCBDTE9DS19FbmFibGVVc2JoczBQaHlQbGxDbG9jayhjbG9ja191c2JfcGh5X3NyY190IHNyYywgdWludDMyX3QgZnJlcSkNCnsNCiAgICB2b2xhdGlsZSB1aW50MzJfdCBpOw0KDQogICAgUE9XRVJfRGlzYWJsZVBEKGtQRFJVTkNGR19QRF9YVEFMMzJNKTsNCiAgICBQT1dFUl9EaXNhYmxlUEQoa1BEUlVOQ0ZHX1BEX0xET1hPMzJNKTsNCiAgICBQT1dFUl9EaXNhYmxlUEQoa1BEUlVOQ0ZHX1BEX0ZSTzMySyk7ICAgLyohPCBFbnN1cmUgRlJPMzJrIGlzIG9uICAqLw0KICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfWFRBTDMySyk7ICAvKiE8IEVuc3VyZSB4dGFsMzJrIGlzIG9uICAqLw0KICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfVVNCMV9QSFkpOyAvKiE8IEVuc3VyZSB4dGFsMzJrIGlzIG9uICAqLw0KICAgIFBPV0VSX0Rpc2FibGVQRChrUERSVU5DRkdfUERfTERPVVNCSFMpOyAvKiE8IEVuc3VyZSB4dGFsMzJrIGlzIG9uICAqLw0KDQogICAgLyogd2FpdCB0byBtYWtlIHN1cmUgUEhZIHBvd2VyIGlzIGZ1bGx5IHVwICovDQogICAgaSA9IDEwMDAwMDsNCiAgICB3aGlsZSAoaS0tKQ0KICAgIHsNCiAgICAgICAgX19hc20oIm5vcCIpOw0KICAgIH0NCg0KICAgIFNZU0NPTi0+QUhCQ0xLQ1RSTFNFVFsyXSA9IFNZU0NPTl9BSEJDTEtDVFJMMl9BTkFMT0dfQ1RSTCgxKTsNCiAgICBTWVNDT04tPkFIQkNMS0NUUkxTRVRbMl0gPSBTWVNDT05fQUhCQ0xLQ1RSTDJfVVNCMV9QSFkoMSk7DQoNCiAgICBVU0JQSFktPkNUUkxfQ0xSID0gVVNCUEhZX0NUUkxfU0ZUUlNUX01BU0s7DQogICAgVVNCUEhZLT5QTExfU0lDID0gKFVTQlBIWS0+UExMX1NJQyAmIH5VU0JQSFlfUExMX1NJQ19QTExfRElWX1NFTCgweDcpKSB8IFVTQlBIWV9QTExfU0lDX1BMTF9ESVZfU0VMKDB4MDYpOw0KICAgIFVTQlBIWS0+UExMX1NJQ19TRVQgPSBVU0JQSFlfUExMX1NJQ19TRVRfUExMX1JFR19FTkFCTEVfTUFTSzsNCiAgICBVU0JQSFktPlBMTF9TSUNfQ0xSID0gVVNCUEhZX1BMTF9TSUNfU0VUX1BMTF9CWVBBU1NfTUFTSzsNCiAgICBVU0JQSFktPlBMTF9TSUNfU0VUID0gVVNCUEhZX1BMTF9TSUNfU0VUX1BMTF9QT1dFUl9NQVNLOw0KICAgIFVTQlBIWS0+UExMX1NJQ19TRVQgPSBVU0JQSFlfUExMX1NJQ19TRVRfUExMX0VOX1VTQl9DTEtTX01BU0s7DQogICAgVVNCUEhZLT5QTExfU0lDX1NFVCA9DQogICAgICAgIFVTQlBIWV9QTExfU0lDX1NFVF9NSVNDMl9DT05UUk9MMF9NQVNLOyAvKiBlbmFibGVzIGF1dG8gcG93ZXIgZG93biBvZiBQSFkgUExMIGR1cmluZyBzdXNwZW5kICovDQoNCiAgICBVU0JQSFktPkNUUkxfQ0xSID0gVVNCUEhZX0NUUkxfQ0xSX0NMS0dBVEVfTUFTSzsNCiAgICBVU0JQSFktPlBXRF9TRVQgPSAweDA7DQoNCiAgICByZXR1cm4gdHJ1ZTsNCn0NCg0KLyogRW5hYmxlIFVTQiBERVZJQ0UgSElHSCBTUEVFRCBjbG9jayAqLw0KYm9vbCBDTE9DS19FbmFibGVVc2JoczBEZXZpY2VDbG9jayhjbG9ja191c2Joc19zcmNfdCBzcmMsIHVpbnQzMl90IGZyZXEpDQp7DQogICAgU1lTQ09OLT5BSEJDTEtDVFJMU0VUWzJdID0gU1lTQ09OX0FIQkNMS0NUUkwyX1VTQjFfUkFNKDEpOw0KICAgIFNZU0NPTi0+QUhCQ0xLQ1RSTFNFVFsyXSA9IFNZU0NPTl9BSEJDTEtDVFJMMl9VU0IxX0RFVigxKTsNCg0KICAgIC8qIDE2IE1IeiB3aWxsIGJlIGRyaXZlbiBieSB0aGUgdGIgb24gdGhlIHh0YWwxIHBpbiBvZiBYVEFMMzJNICovDQogICAgU1lTQ09OLT5DTE9DS19DVFJMIHw9IFNZU0NPTl9DTE9DS19DVFJMX0NMS0lOX0VOQV9NQVNLOyAvKiBFbmFibGUgY2xvY2tfaW4gY2xvY2sgZm9yIGNsb2NrIG1vZHVsZS4gKi8NCiAgICBBTkFDVFJMLT5YTzMyTV9DVFJMIHw9IEFOQUNUUkxfWE8zMk1fQ1RSTF9FTkFCTEVfUExMX1VTQl9PVVQoMSk7DQogICAgcmV0dXJuIHRydWU7DQp9DQoNCi8qIEVuYWJsZSBVU0IgSE9TVCBISUdIIFNQRUVEIGNsb2NrICovDQpib29sIENMT0NLX0VuYWJsZVVzYmhzMEhvc3RDbG9jayhjbG9ja191c2Joc19zcmNfdCBzcmMsIHVpbnQzMl90IGZyZXEpDQp7DQogICAgU1lTQ09OLT5BSEJDTEtDVFJMU0VUWzJdID0gU1lTQ09OX0FIQkNMS0NUUkwyX1VTQjFfUkFNKDEpOw0KICAgIFNZU0NPTi0+QUhCQ0xLQ1RSTFNFVFsyXSA9IFNZU0NPTl9BSEJDTEtDVFJMMl9VU0IxX0hPU1QoMSk7DQoNCiAgICAvKiAxNiBNSHogd2lsbCBiZSBkcml2ZW4gYnkgdGhlIHRiIG9uIHRoZSB4dGFsMSBwaW4gb2YgWFRBTDMyTSAqLw0KICAgIFNZU0NPTi0+Q0xPQ0tfQ1RSTCB8PSBTWVNDT05fQ0xPQ0tfQ1RSTF9DTEtJTl9FTkFfTUFTSzsgLyogRW5hYmxlIGNsb2NrX2luIGNsb2NrIGZvciBjbG9jayBtb2R1bGUuICovDQogICAgQU5BQ1RSTC0+WE8zMk1fQ1RSTCB8PSBBTkFDVFJMX1hPMzJNX0NUUkxfRU5BQkxFX1BMTF9VU0JfT1VUKDEpOw0KDQogICAgcmV0dXJuIHRydWU7DQp9DQo=