LyoKICogY29tX3JpZ2h0LmMgLS0gcHJvdmlkZSBIZWltZGFsbCAvIEtlcmJlcm9zNGt0aCBjb21fZXJyIGludGVyZmFjZXMKICogCWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDMgYnkgVGhlb2RvcmUgVHMnbwogKgogKiBUYWtlbiBmcm9tIGxpYi9jb21fZXJyL2Vycm9yLmMgZnJvbSBLZXJiZXJvczRrdGggZGlzdHJpYnV0aW9uLgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDIwMDEgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgImNvbV9lcnIuaCIKI2luY2x1ZGUgImVycm9yX3RhYmxlLmgiCgpjb25zdCBjaGFyICoKY29tX3JpZ2h0KHN0cnVjdCBldF9saXN0ICpsaXN0LCBsb25nIGNvZGUpCnsKICAgIHN0cnVjdCBldF9saXN0ICpwOwogICAgZm9yIChwID0gbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKCWlmIChjb2RlID49IHAtPnRhYmxlLT5iYXNlICYmIGNvZGUgPCBwLT50YWJsZS0+YmFzZSArIHAtPnRhYmxlLT5uX21zZ3MpCgkgICAgcmV0dXJuIHAtPnRhYmxlLT5tc2dzW2NvZGUgLSBwLT50YWJsZS0+YmFzZV07CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKY29uc3QgY2hhciAqCmNvbV9yaWdodF9yKHN0cnVjdCBldF9saXN0ICpsaXN0LCBsb25nIGNvZGUsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKewogICAgc3RydWN0IGV0X2xpc3QgKnA7CiAgICBmb3IgKHAgPSBsaXN0OyBwOyBwID0gcC0+bmV4dCkgewoJaWYgKChjb2RlID49IHAtPnRhYmxlLT5iYXNlKSAmJgoJICAgIChjb2RlIDwgcC0+dGFibGUtPmJhc2UgKyBwLT50YWJsZS0+bl9tc2dzKSkgewogICAgICAgICAgICBzdHJuY3B5KHN0ciwgcC0+dGFibGUtPm1zZ3NbY29kZSAtIHAtPnRhYmxlLT5iYXNlXSwgbGVuKTsKICAgICAgICAgICAgc3RyW2xlbi0xXSA9ICdcMCc7CiAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnN0cnVjdCBmb29iYXIgewogICAgc3RydWN0IGV0X2xpc3QgZXRsOwogICAgc3RydWN0IGVycm9yX3RhYmxlIHRhYjsKfTsKCi8qCiAqIFdlIHByb3ZpZGUgdGhpcyByb3V0aW5lIGZvciBjb21wYXRpYmlsaXR5IHdpdGggSGVpbWRhbGwgZ2VuZXJhdGVkCiAqIGZvb19lcnIuYyBmaWxlcywgYnV0IHdlIGRvbid0IHVzZSB0aGlzIG91cnNlbHZlcyBmb3IgZm9vX2Vyci5jCiAqIGZpbGVzIGdlbmVyYXRlZCBieSBvdXIgY29tcGlsZV9ldC4gIFRoaXMgaXMgc28gb3VyIGZvb19lcnIuYwogKiBmaWxlcyBjYW4gYmUgdXNlZCB3aXRoIG9sZGVyIGNvbV9lcnIgbGlicmFyaWVzIHdpdGhvdXQgcnVubmluZwogKiBhZm91bCBvZiBkZXBlbmRlbmNpZXMuCiAqLwp2b2lkCmluaXRpYWxpemVfZXJyb3JfdGFibGVfcihzdHJ1Y3QgZXRfbGlzdCAqKmxpc3QsCgkJCSBjb25zdCBjaGFyICoqbWVzc2FnZXMsCgkJCSBpbnQgbnVtX2Vycm9ycywKCQkJIGxvbmcgYmFzZSkKewogICAgc3RydWN0IGV0X2xpc3QgKmV0LCAqKmVuZDsKICAgIHN0cnVjdCBlcnJvcl90YWJsZSAqdGFiOwogICAgc3RydWN0IGZvb2JhciAqZjsKCiAgICBmb3IgKGVuZCA9IGxpc3QsIGV0ID0gKmxpc3Q7IGV0OyBlbmQgPSAmZXQtPm5leHQsIGV0ID0gZXQtPm5leHQpCiAgICAgICAgaWYgKGV0LT50YWJsZS0+bXNncyA9PSBtZXNzYWdlcykKICAgICAgICAgICAgcmV0dXJuOwogICAgZiA9IG1hbGxvYyhzaXplb2YoKmYpKTsKICAgIGlmIChmID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgZXQgPSAmZi0+ZXRsOwogICAgZXQtPnRhYmxlID0gdGFiID0gJmYtPnRhYjsKICAgIHRhYi0+bXNncyA9IG1lc3NhZ2VzOwogICAgdGFiLT5uX21zZ3MgPSBudW1fZXJyb3JzOwogICAgdGFiLT5iYXNlID0gYmFzZTsKICAgIGV0LT5uZXh0ID0gTlVMTDsKICAgICplbmQgPSBldDsKfQoKCnZvaWQKZnJlZV9lcnJvcl90YWJsZShzdHJ1Y3QgZXRfbGlzdCAqZXQpCnsKICAgIHdoaWxlKGV0KXsKCXN0cnVjdCBldF9saXN0ICpwID0gZXQ7CglldCA9IGV0LT5uZXh0OwoJZnJlZShwKTsKICAgIH0KfQo=