LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qKgogKiBAZmlsZSB0YWJsZV9pdGVyYXRvci5oCiAqIEBhZGR0b2dyb3VwIHRhYmxlX2l0ZXJhdG9yCiAqIEB7CiAqLwojaWZuZGVmIF9UQUJMRV9JVEVSQVRPUl9IQU5ETEVSX0hfCiNkZWZpbmUgX1RBQkxFX0lURVJBVE9SX0hBTkRMRVJfSF8KCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gICAgICAgICAgIkMiIHsKI2VuZGlmCgogICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zOwoKICAgIHR5cGVkZWYgbmV0c25tcF92YXJpYWJsZV9saXN0ICoKICAgICAgICAgICAgICAgKE5ldHNubXBfRmlyc3RfRGF0YV9Qb2ludCkgKHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0c25tcF9pdGVyYXRvcl9pbmZvX3MgKik7CiAgICB0eXBlZGVmIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqCiAgICAgICAgICAgICAgIChOZXRzbm1wX05leHRfRGF0YV9Qb2ludCkgICh2b2lkICoqbG9vcF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGFfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zICopOwogICAgdHlwZWRlZiB2b2lkICooTmV0c25tcF9NYWtlX0RhdGFfQ29udGV4dCkgKHZvaWQgKmxvb3BfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zICopOwogICAgdHlwZWRlZiB2b2lkICAoTmV0c25tcF9GcmVlX0xvb3BfQ29udGV4dCkgKHZvaWQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zICopOwogICAgdHlwZWRlZiB2b2lkICAoTmV0c25tcF9GcmVlX0RhdGFfQ29udGV4dCkgKHZvaWQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldHNubXBfaXRlcmF0b3JfaW5mb19zICopOwoKICAgIC8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9pdGVyYXRvcl9pbmZvX3MgbmV0c25tcF9pdGVyYXRvcl9pbmZvCiAgICAgKiBUeXBlZGVmcyB0aGUgbmV0c25tcF9pdGVyYXRvcl9pbmZvX3Mgc3RydWN0IGludG8gbmV0c25tcF9pdGVyYXRvcl9pbmZvICovCgogICAgLyoqIEBzdHJ1Y3QgbmV0c25tcF9pdGVyYXRvcl9pbmZvX3MKCiAgICAgKiBIb2xkcyBpdGVyYXRvciBpbmZvcm1hdGlvbiBjb250YWluaW5nIGZ1bmN0aW9ucyB3aGljaCBzaG91bGQgYmUKICAgICAgIGNhbGxlZCBieSB0aGUgaXRlcmF0b3JfaGFuZGxlciB0byBsb29wIG92ZXIgeW91ciBkYXRhIHNldCBhbmQKICAgICAgIHNvcnQgaXQgaW4gYSBTTk1QIHNwZWNpZmljIG1hbm5lci4KICAgICAgIAogICAgICAgVGhlIG5ldHNubXBfaXRlcmF0b3JfaW5mbyB0eXBlZGVmIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgZGlyZWN0bHkgY2FsbGluZyB0aGlzIHN0cnVjdCBpZiB5b3Ugd291bGQgcHJlZmVyLgogICAgICovCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2l0ZXJhdG9yX2luZm9fcyB7CiAgICAgICAvKiogUmVzcG9uc2libGUgZm9yOiByZXR1cm5pbmcgdGhlIGZpcnN0IHNldCBvZiAiaW5kZXgiIGRhdGEsIGEKICAgICAgICAgICBsb29wLWNvbnRleHQgcG9pbnRlciwgYW5kIG9wdGlvbmFsbHkgYSBkYXRhIGNvbnRleHQKICAgICAgICAgICBwb2ludGVyICovCiAgICAgICAgTmV0c25tcF9GaXJzdF9EYXRhX1BvaW50ICpnZXRfZmlyc3RfZGF0YV9wb2ludDsKCiAgICAgICAvKiogR2l2ZW4gdGhlIHByZXZpb3VzIGxvb3AgY29udGV4dCwgdGhpcyBzaG91bGQgcmV0dXJuIHRoZQogICAgICAgICAgIG5leHQgbG9vcCBjb250ZXh0LCBhc3NvY2lhdGVkIGluZGV4IHNldCBhbmQgb3B0aW9uYWxseSBhCiAgICAgICAgICAgZGF0YSBjb250ZXh0ICovCiAgICAgICAgTmV0c25tcF9OZXh0X0RhdGFfUG9pbnQgKmdldF9uZXh0X2RhdGFfcG9pbnQ7CgogICAgICAgLyoqIElmIGEgZGF0YSBjb250ZXh0IHdhc24ndCBzdXBwbGllZCBieSB0aGUKICAgICAgICAgICBnZXRfZmlyc3RfZGF0YV9wb2ludCBvciBnZXRfbmV4dF9kYXRhX3BvaW50IGZ1bmN0aW9ucyBhbmQKICAgICAgICAgICB0aGUgbWFrZV9kYXRhX2NvbnRleHQgcG9pbnRlciBpcyBkZWZpbmVkLCBpdCB3aWxsIGJlIGNhbGxlZAogICAgICAgICAgIHRvIGNvbnZlcnQgYSBsb29wIGNvbnRleHQgaW50byBhIGRhdGEgY29udGV4dC4gKi8KICAgICAgICBOZXRzbm1wX01ha2VfRGF0YV9Db250ZXh0ICptYWtlX2RhdGFfY29udGV4dDsKCiAgICAgICAvKiogQSBmdW5jdGlvbiB3aGljaCBzaG91bGQgZnJlZSB0aGUgbG9vcCBjb250ZXh0LiAgVGhpcwogICAgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCAqZWFjaCogaXRlcmF0aW9uIHN0ZXAsIHdoaWNoIGlzCiAgICAgICAgICAgbm90LW9wdGltYWwgZm9yIHNwZWVkIHB1cnBvc2VzLiAgVGhlIHVzZSBvZgogICAgICAgICAgIGZyZWVfbG9vcF9jb250ZXh0X2F0X2VuZCBpbnN0ZWFkIGlzIHN0cm9uZ2x5CiAgICAgICAgICAgZW5jb3VyYWdlZC4gVGhpcyBjYW4gYmUgc2V0IHRvIE5VTEwgdG8gYXZvaWQgaXRzIHVzYWdlLiAqLwogICAgICAgIE5ldHNubXBfRnJlZV9Mb29wX0NvbnRleHQgKmZyZWVfbG9vcF9jb250ZXh0OwoKICAgICAgIC8qKiBGcmVlcyBhIGRhdGEgY29udGV4dC4gIFRoaXMgd2lsbCBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYQogICAgICAgICAgIGRhdGEgY29udGV4dCBuZWVkcyB0byBiZSBmcmVlZC4gIFRoaXMgbWF5IGJlIGF0IHRoZSBzYW1lCiAgICAgICAgICAgdGltZSBhcyBhIGNvcnJlc3BvbmRuZyBsb29wIGNvbnRleHQgaXMgZnJlZWQsIG9yIG11Y2ggbXVjaAogICAgICAgICAgIGxhdGVyLiAgTXVsdGlwbGUgZGF0YSBjb250ZXh0cyBtYXkgYmUga2VwdCBpbiBleGlzdGVuY2UgYXQKICAgICAgICAgICBhbnkgdGltZS4gKi8KICAgICAgIE5ldHNubXBfRnJlZV9EYXRhX0NvbnRleHQgKmZyZWVfZGF0YV9jb250ZXh0OwoKICAgICAgIC8qKiBGcmVlcyBhIGxvb3AgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBlbnRpcmUgaXRlcmF0aW9uCiAgICAgICAgICAgc2VxdWVuY2UuICBHZW5lcmFsbHksIHRoaXMgd291bGQgZnJlZSB0aGUgbG9vcCBjb250ZXh0CiAgICAgICAgICAgYWxsb2NhdGVkIGJ5IHRoZSBnZXRfZmlyc3RfZGF0YV9wb2ludCBmdW5jdGlvbiAod2hpY2ggd291bGQKICAgICAgICAgICB0aGVuIGJlIHVwZGF0ZWQgYnkgZWFjaCBjYWxsIHRvIHRoZSBnZXRfbmV4dF9kYXRhX3BvaW50CiAgICAgICAgICAgZnVuY3Rpb24pLiAgSXQgaXMgbm90IGNhbGxlZCB1bnRpbCB0aGUgZ2V0X25leHRfZGF0YV9wb2ludAogICAgICAgICAgIGZ1bmN0aW9uIHJldHVybnMgYSBOVUxMICovCiAgICAgICAgTmV0c25tcF9GcmVlX0xvb3BfQ29udGV4dCAqZnJlZV9sb29wX2NvbnRleHRfYXRfZW5kOwoKICAgICAgIC8qKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBoYW5kbGVycyB0byBzdG9yZSBhbnkKICAgICAgICAgICBpbmZvcm1hdGlvbiB0aGV5IG5lZWQgKi8KICAgICAgICB2b2lkICAgICAgICAgICAqbXl2b2lkOwogICAgICAgIGludCAgICAgICAgICAgICBmbGFnczsKI2RlZmluZSBORVRTTk1QX0lURVJBVE9SX0ZMQUdfU09SVEVECTB4MDEKCiAgICAgICAvKiogQSBwb2ludGVyIHRvIHRoZSBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvIG9iamVjdAogICAgICAgICAgIHRoaXMgaXRlcmF0b3IgaXMgcmVnaXN0ZXJlZCBhbG9uZyB3aXRoLiAqLwogICAgICAgIG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8gKnRhYmxlX3JlZ2luZm87CgogICAgICAgIC8qIEV4cGVyaW1lbnRhbCBleHRlbnNpb24gLSBVc2UgQXQgWW91ciBPd24gUmlzawogICAgICAgICAgICh0aGVzZSB0d28gZmllbGRzIG1heSBjaGFuZ2UvZGlzYXBwZWFyIHdpdGhvdXQgd2FybmluZykgKi8KICAgICAgICBOZXRzbm1wX0ZpcnN0X0RhdGFfUG9pbnQgKmdldF9yb3dfaW5kZXhlczsKICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmluZGV4ZXM7CiAgICB9IG5ldHNubXBfaXRlcmF0b3JfaW5mbzsKCiNkZWZpbmUgVEFCTEVfSVRFUkFUT1JfTkFNRSAidGFibGVfaXRlcmF0b3IiCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEl0ZXJhdG9yIEFQSTogVGFibGUgbWFpbnRlbmFuY2UKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogICAgICAgIC8qIE4vQSAqLwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBJdGVyYXRvciBBUEk6IE1JQiBtYWludGVuYW5jZQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgogICAgbmV0c25tcF9taWJfaGFuZGxlcgogICAgICAgICAgKm5ldHNubXBfZ2V0X3RhYmxlX2l0ZXJhdG9yX2hhbmRsZXIobmV0c25tcF9pdGVyYXRvcl9pbmZvICppaW5mbyk7CiAgICBpbnQgICAgbmV0c25tcF9yZWdpc3Rlcl90YWJsZV9pdGVyYXRvciggICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKmlpbmZvKTsKICAgIHZvaWQgIG5ldHNubXBfaXRlcmF0b3JfZGVsZXRlX3RhYmxlKG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqaWluZm8pOwoKICAgIHZvaWQgKm5ldHNubXBfZXh0cmFjdF9pdGVyYXRvcl9jb250ZXh0KG5ldHNubXBfcmVxdWVzdF9pbmZvICopOwogICAgdm9pZCAgIG5ldHNubXBfaW5zZXJ0X2l0ZXJhdG9yX2NvbnRleHQobmV0c25tcF9yZXF1ZXN0X2luZm8gKiwgdm9pZCAqKTsKCiAgICBOZXRzbm1wX05vZGVfSGFuZGxlciBuZXRzbm1wX3RhYmxlX2l0ZXJhdG9yX2hlbHBlcl9oYW5kbGVyOwoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogSXRlcmF0b3IgQVBJOiBSb3cgb3BlcmF0aW9ucwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgp2b2lkICpuZXRzbm1wX2l0ZXJhdG9yX3Jvd19maXJzdCggICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKik7CnZvaWQgKm5ldHNubXBfaXRlcmF0b3Jfcm93X2dldCggICAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqLCB2b2lkICopOwp2b2lkICpuZXRzbm1wX2l0ZXJhdG9yX3Jvd19uZXh0KCAgICAgICBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKiwgdm9pZCAqKTsKdm9pZCAqbmV0c25tcF9pdGVyYXRvcl9yb3dfZ2V0X2J5aWR4KCAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqKTsKdm9pZCAqbmV0c25tcF9pdGVyYXRvcl9yb3dfbmV4dF9ieWlkeCggbmV0c25tcF9pdGVyYXRvcl9pbmZvICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqKTsKdm9pZCAqbmV0c25tcF9pdGVyYXRvcl9yb3dfZ2V0X2J5b2lkKCAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICosIG9pZCAqLCBzaXplX3QpOwp2b2lkICpuZXRzbm1wX2l0ZXJhdG9yX3Jvd19uZXh0X2J5b2lkKCBuZXRzbm1wX2l0ZXJhdG9yX2luZm8gKiwgb2lkICosIHNpemVfdCk7CmludCAgIG5ldHNubXBfaXRlcmF0b3Jfcm93X2NvdW50KCAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqKTsKCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEl0ZXJhdG9yIEFQSTogSW5kZXggb3BlcmF0aW9ucwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogX1RBQkxFX0lURVJBVE9SX0hBTkRMRVJfSF8gKi8KLyoqIEB9ICovCg==