LyoNCiAqIFFFTVUgTlZSQU0gZW11bGF0aW9uIGZvciBEUzEyMjVZIGNoaXANCiAqIA0KICogQ29weXJpZ2h0IChjKSAyMDA3IEhlcnbpIFBvdXNzaW5lYXUNCiAqIA0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCiAqDQogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQogKg0KICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwNCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KICogVEhFIFNPRlRXQVJFLg0KICovDQoNCiNpbmNsdWRlICJody5oIg0KI2luY2x1ZGUgIm1pcHMuaCINCiNpbmNsdWRlICJudnJhbS5oIg0KDQp0eXBlZGVmIGVudW0NCnsNCiAgICBub25lID0gMCwNCiAgICByZWFkbW9kZSwNCiAgICB3cml0ZW1vZGUsDQp9IG52cmFtX29wZW5fbW9kZTsNCg0Kc3RydWN0IGRzMTIyNXlfdA0Kew0KICAgIHRhcmdldF9waHlzX2FkZHJfdCBtZW1fYmFzZTsNCiAgICB1aW50MzJfdCBjYXBhY2l0eTsNCiAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsNCiAgICBRRU1VRmlsZSAqZmlsZTsNCiAgICBudnJhbV9vcGVuX21vZGUgb3Blbl9tb2RlOw0KfTsNCg0Kc3RhdGljIGludCBkczEyMjV5X3NldF90b19tb2RlKGRzMTIyNXlfdCAqTlZSQU0sIG52cmFtX29wZW5fbW9kZSBtb2RlLCBjb25zdCBjaGFyICpmaWxlbW9kZSkNCnsNCiAgICBpZiAoTlZSQU0tPm9wZW5fbW9kZSAhPSBtb2RlKQ0KICAgIHsNCiAgICAgICAgaWYgKE5WUkFNLT5maWxlKQ0KICAgICAgICAgICAgcWVtdV9mY2xvc2UoTlZSQU0tPmZpbGUpOw0KICAgICAgICBOVlJBTS0+ZmlsZSA9IHFlbXVfZm9wZW4oTlZSQU0tPmZpbGVuYW1lLCBmaWxlbW9kZSk7DQogICAgICAgIE5WUkFNLT5vcGVuX21vZGUgPSBtb2RlOw0KICAgIH0NCiAgICByZXR1cm4gKE5WUkFNLT5maWxlICE9IE5VTEwpOw0KfQ0KDQpzdGF0aWMgdWludDMyX3QgbnZyYW1fcmVhZGIgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIpDQp7DQogICAgZHMxMjI1eV90ICpOVlJBTSA9IG9wYXF1ZTsNCiAgICBpbnQ2NF90IHBvczsNCg0KICAgIHBvcyA9IGFkZHIgLSBOVlJBTS0+bWVtX2Jhc2U7DQogICAgaWYgKGFkZHIgPj0gTlZSQU0tPmNhcGFjaXR5KQ0KICAgICAgICBhZGRyIC09IE5WUkFNLT5jYXBhY2l0eTsNCg0KICAgIGlmICghZHMxMjI1eV9zZXRfdG9fbW9kZShOVlJBTSwgcmVhZG1vZGUsICJyYiIpKQ0KICAgICAgICByZXR1cm4gMDsNCiAgICBxZW11X2ZzZWVrKE5WUkFNLT5maWxlLCBwb3MsIFNFRUtfU0VUKTsNCiAgICByZXR1cm4gKHVpbnQzMl90KXFlbXVfZ2V0X2J5dGUoTlZSQU0tPmZpbGUpOw0KfQ0KDQpzdGF0aWMgdm9pZCBudnJhbV93cml0ZWIgKHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsIHVpbnQzMl90IHZhbHVlKQ0Kew0KICAgIGRzMTIyNXlfdCAqTlZSQU0gPSBvcGFxdWU7DQogICAgaW50NjRfdCBwb3M7DQoNCiAgICBwb3MgPSBhZGRyIC0gTlZSQU0tPm1lbV9iYXNlOw0KICAgIGlmIChkczEyMjV5X3NldF90b19tb2RlKE5WUkFNLCB3cml0ZW1vZGUsICJ3YiIpKQ0KICAgIHsNCiAgICAgICAgcWVtdV9mc2VlayhOVlJBTS0+ZmlsZSwgcG9zLCBTRUVLX1NFVCk7DQogICAgICAgIHFlbXVfcHV0X2J5dGUoTlZSQU0tPmZpbGUsIChpbnQpdmFsdWUpOw0KICAgIH0NCn0NCg0Kc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpudnJhbV9yZWFkW10gPSB7DQogICAgJm52cmFtX3JlYWRiLA0KICAgIE5VTEwsDQogICAgTlVMTCwNCn07DQoNCnN0YXRpYyBDUFVXcml0ZU1lbW9yeUZ1bmMgKm52cmFtX3dyaXRlW10gPSB7DQogICAgJm52cmFtX3dyaXRlYiwNCiAgICBOVUxMLA0KICAgIE5VTEwsDQp9Ow0KDQpzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICpudnJhbV9ub25lW10gPSB7DQogICAgTlVMTCwNCiAgICBOVUxMLA0KICAgIE5VTEwsDQp9Ow0KDQovKiBJbml0aWFsaXNhdGlvbiByb3V0aW5lICovDQpkczEyMjV5X3QgKmRzMTIyNXlfaW5pdCh0YXJnZXRfcGh5c19hZGRyX3QgbWVtX2Jhc2UsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQ0Kew0KICAgIGRzMTIyNXlfdCAqczsNCiAgICBpbnQgbWVtX2luZGV4MSwgbWVtX2luZGV4MjsNCg0KICAgIHMgPSBxZW11X21hbGxvY3ooc2l6ZW9mKGRzMTIyNXlfdCkpOw0KICAgIGlmICghcykNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgcy0+bWVtX2Jhc2UgPSBtZW1fYmFzZTsNCiAgICBzLT5jYXBhY2l0eSA9IDB4MjAwMDsgLyogRml4ZWQgZm9yIGRzMTIyNXkgY2hpcDogOEsgKi8NCiAgICBzLT5maWxlbmFtZSA9IGZpbGVuYW1lOw0KDQogICAgLyogUmVhZC93cml0ZSBtZW1vcnkgKi8NCiAgICBtZW1faW5kZXgxID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeSgwLCBudnJhbV9yZWFkLCBudnJhbV93cml0ZSwgcyk7DQogICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShtZW1fYmFzZSwgcy0+Y2FwYWNpdHksIG1lbV9pbmRleDEpOw0KICAgIC8qIFJlYWQtb25seSBtZW1vcnkgKi8NCiAgICBtZW1faW5kZXgyID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeSgwLCBudnJhbV9yZWFkLCBudnJhbV9ub25lLCBzKTsNCiAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KG1lbV9iYXNlICsgcy0+Y2FwYWNpdHksIHMtPmNhcGFjaXR5LCBtZW1faW5kZXgyKTsNCiAgICByZXR1cm4gczsNCn0NCg==