LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2RlYnVnX2hhbmRsZXIuaD4KCi8qKiBAZGVmZ3JvdXAgZGVidWcgZGVidWcKICogIFByaW50IG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhhbmRsZXIgY2hhaW4gYmVpbmcgY2FsbGVkLgogKiAgVGhpcyBpcyBhIHVzZWZ1bCBtb2R1bGUgZm9yIHJ1bi10aW1lCiAqICBkZWJ1Z2dpbmcgb2YgcmVxdWVzdHMgYXMgdGhlIHBhc3MgdGhpcyBoYW5kbGVyIGluIGEgY2FsbGluZyBjaGFpbi4KICogIEFsbCBkZWJ1Z2dpbmcgb3V0cHV0IGlzIGRvbmUgdmlhIHRoZSBzdGFuZGFyZCBkZWJ1Z2dpbmcgcm91dGluZXMKICogIHdpdGggYSB0b2tlbiBuYW1lIG9mICJoZWxwZXI6ZGVidWciLCBzbyB1c2UgdGhlIC1EaGVscGVyOmRlYnVnCiAqICBjb21tYW5kIGxpbmUgZmxhZyB0byBzZWUgdGhlIG91dHB1dCB3aGVuIHJ1bm5pbmcgdGhlIHNubXBkCiAqICBkZW1vbi4gSXQncyBub3QgcmVjb21tZW5kZWQgeW91IGNvbXBpbGUgdGhpcyBpbnRvIGEgaGFuZGxlciBjaGFpbgogKiAgZHVyaW5nIGNvbXBpbGUgdGltZSwgYnV0IGluc3RlYWQgdXNlIHRoZSAiaW5qZWN0SGFuZGxlciIgdG9rZW4gaW4KICogIHRoZSBzbm1wZC5jb25mIGZpbGUgKG9yIHNpbWlsYXIpIHRvIGFkZCBpdCB0byB0aGUgY2hhaW4gbGF0ZXI6CiAqCiAqICAgICBpbmplY3RIYW5kbGVyIGRlYnVnIG15X21vZHVsZV9uYW1lCiAqCiAqICB0byBzZWUgYW4gZXhhbXBsZSBvdXRwdXQsIHRyeToKICoKICogICAgIGluamVjdEhhbmRsZXIgZGVidWcgbWliSUkvc3lzdGVtCiAqCiAqICBhbmQgdGhlbiBydW4gc25tcHdhbGsgb24gdGhlICJzeXN0ZW0iIGdyb3VwLgogKgogKiAgQGluZ3JvdXAgdXRpbGl0aWVzCiAqICBAewogKi8KCi8qKiByZXR1cm5zIGEgZGVidWcgaGFuZGxlciB0aGF0IGNhbiBiZSBpbmplY3RlZCBpbnRvIGEgZ2l2ZW4KICogIGhhbmRsZXIgY2hhaW4uCiAqLwpuZXRzbm1wX21pYl9oYW5kbGVyICoKbmV0c25tcF9nZXRfZGVidWdfaGFuZGxlcih2b2lkKQp7CiAgICByZXR1cm4gbmV0c25tcF9jcmVhdGVfaGFuZGxlcigiZGVidWciLCBuZXRzbm1wX2RlYnVnX2hlbHBlcik7Cn0KCi8qKiBAaW50ZXJuYWwgZGVidWcgcHJpbnQgdmFyaWFibGVzIGluIGEgY2hhaW4gKi8Kdm9pZApkZWJ1Z19wcmludF9yZXF1ZXN0cyhuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdHMpCnsKICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0OwoKICAgIGZvciAocmVxdWVzdCA9IHJlcXVlc3RzOyByZXF1ZXN0OyByZXF1ZXN0ID0gcmVxdWVzdC0+bmV4dCkgewogICAgICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgICAgIyUyZDogIiwgcmVxdWVzdC0+aW5kZXgpKTsKICAgICAgICBERUJVR01TR1ZBUigoImhlbHBlcjpkZWJ1ZyIsIHJlcXVlc3QtPnJlcXVlc3R2YikpOwogICAgICAgIERFQlVHTVNHKCgiaGVscGVyOmRlYnVnIiwgIlxuIikpOwoKICAgICAgICBpZiAocmVxdWVzdC0+cHJvY2Vzc2VkKQogICAgICAgICAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICAgICAgW3Byb2Nlc3NlZF1cbiIpKTsKICAgICAgICBpZiAocmVxdWVzdC0+ZGVsZWdhdGVkKQogICAgICAgICAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICAgICAgW2RlbGVnYXRlZF1cbiIpKTsKICAgICAgICBpZiAocmVxdWVzdC0+c3RhdHVzKQogICAgICAgICAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICAgICAgW3N0YXR1cyA9ICVkXVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKSk7CiAgICAgICAgaWYgKHJlcXVlc3QtPnBhcmVudF9kYXRhKSB7CiAgICAgICAgICAgIG5ldHNubXBfZGF0YV9saXN0ICpsc3Q7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgICAgICBbcGFyZW50IGRhdGEgPSIpKTsKICAgICAgICAgICAgZm9yIChsc3QgPSByZXF1ZXN0LT5wYXJlbnRfZGF0YTsgbHN0OyBsc3QgPSBsc3QtPm5leHQpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHKCgiaGVscGVyOmRlYnVnIiwgIiAlcyIsIGxzdC0+bmFtZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIERFQlVHTVNHKCgiaGVscGVyOmRlYnVnIiwgIl1cbiIpKTsKICAgICAgICB9CiAgICB9Cn0KCgovKiogQGludGVybmFsIEltcGxlbWVudHMgdGhlIGRlYnVnIGhhbmRsZXIgKi8KaW50Cm5ldHNubXBfZGVidWdfaGVscGVyKG5ldHNubXBfbWliX2hhbmRsZXIgKmhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICpyZXFpbmZvLAogICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdHMpCnsKCiAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpocHRyOwogICAgaW50ICAgICAgICAgICAgIGksIHJldCwgY291bnQ7CiAgICBjaGFyICAgICAgICAgICAqY3A7CgogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICJFbnRlcmluZyBEZWJ1Z2dpbmcgSGVscGVyOlxuIikpOwogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgIEhhbmRsZXIgUmVnaXN0cmF0aW9uIEluZm86XG4iKSk7CiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICBOYW1lOiAgICAgICAgJXNcbiIsCiAgICAgICAgICAgICAgICByZWdpbmZvLT5oYW5kbGVyTmFtZSkpOwogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgICAgQ29udGV4dDogICAgICVzXG4iLAogICAgICAgICAgICAgICAgU05NUF9TVFJPUk5VTEwocmVnaW5mby0+Y29udGV4dE5hbWUpKSk7CiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICBCYXNlIE9JRDogICAgIikpOwogICAgREVCVUdNU0dPSUQoKCJoZWxwZXI6ZGVidWciLCByZWdpbmZvLT5yb290b2lkLCByZWdpbmZvLT5yb290b2lkX2xlbikpOwogICAgREVCVUdNU0coKCJoZWxwZXI6ZGVidWciLCAiXG4iKSk7CgogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgICAgTW9kZXM6ICAgICAgIDB4JXggPSAiLAogICAgICAgICAgICAgICAgcmVnaW5mby0+bW9kZXMpKTsKICAgIGZvciAoY291bnQgPSAwLCBpID0gcmVnaW5mby0+bW9kZXM7IGk7IGkgPSBpID4+IDEsIGNvdW50KyspIHsKICAgICAgICBpZiAoaSAmIDB4MDEpIHsKICAgICAgICAgICAgY3AgPSBzZV9maW5kX2xhYmVsX2luX3NsaXN0KCJoYW5kbGVyX2Nhbl9tb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSA8PCBjb3VudCk7CiAgICAgICAgICAgIERFQlVHTVNHKCgiaGVscGVyOmRlYnVnIiwgIiVzIHwgIiwgU05NUF9TVFJPUk5VTEwoY3ApKSk7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0coKCJoZWxwZXI6ZGVidWciLCAiXG4iKSk7CgogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgICAgUHJpb3JpdHk6ICAgICVkXG4iLAogICAgICAgICAgICAgICAgcmVnaW5mby0+cHJpb3JpdHkpKTsKCiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgSGFuZGxlciBDYWxsaW5nIENoYWluOlxuIikpOwogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgICAiKSk7CiAgICBmb3IgKGhwdHIgPSByZWdpbmZvLT5oYW5kbGVyOyBocHRyOyBocHRyID0gaHB0ci0+bmV4dCkgewogICAgICAgIERFQlVHTVNHKCgiaGVscGVyOmRlYnVnIiwgIiAtPiAlcyIsIGhwdHItPmhhbmRsZXJfbmFtZSkpOwogICAgICAgIGlmIChocHRyLT5teXZvaWQpCiAgICAgICAgICAgIERFQlVHTVNHKCgiaGVscGVyOmRlYnVnIiwgIiBbbXl2b2lkID0gJXBdIiwgaHB0ci0+bXl2b2lkKSk7CiAgICB9CiAgICBERUJVR01TRygoImhlbHBlcjpkZWJ1ZyIsICJcbiIpKTsKCiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgUmVxdWVzdCBpbmZvcm1hdGlvbjpcbiIpKTsKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgIE1vZGU6ICAgICAgICAlcyAoJWQgPSAweCV4KVxuIiwKICAgICAgICAgICAgICAgIHNlX2ZpbmRfbGFiZWxfaW5fc2xpc3QoImFnZW50X21vZGUiLCByZXFpbmZvLT5tb2RlKSwKICAgICAgICAgICAgICAgIHJlcWluZm8tPm1vZGUsIHJlcWluZm8tPm1vZGUpKTsKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAgIFJlcXVlc3QgVmFyaWFibGVzOlxuIikpOwogICAgZGVidWdfcHJpbnRfcmVxdWVzdHMocmVxdWVzdHMpOwoKICAgIERFQlVHTVNHVEwoKCJoZWxwZXI6ZGVidWciLCAiICAtLS0gY2FsbGluZyBuZXh0IGhhbmRsZXIgLS0tIFxuIikpOwogICAgcmV0ID0gbmV0c25tcF9jYWxsX25leHRfaGFuZGxlcihoYW5kbGVyLCByZWdpbmZvLCByZXFpbmZvLCByZXF1ZXN0cyk7CgogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICIgIFJlc3VsdHM6XG4iKSk7CiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICBSZXR1cm5lZCBjb2RlOiAlZFxuIiwgcmV0KSk7CiAgICBERUJVR01TR1RMKCgiaGVscGVyOmRlYnVnIiwgIiAgICBSZXR1cm5lZCBWYXJpYWJsZXM6XG4iKSk7CiAgICBkZWJ1Z19wcmludF9yZXF1ZXN0cyhyZXF1ZXN0cyk7CgogICAgREVCVUdNU0dUTCgoImhlbHBlcjpkZWJ1ZyIsICJFeGl0aW5nIERlYnVnZ2luZyBIZWxwZXI6XG4iKSk7CiAgICByZXR1cm4gcmV0Owp9CgovKiogaW5pdGlhbGl6ZXMgdGhlIGRlYnVnIGhlbHBlciB3aGljaCB0aGVuIHJlZ2lzdGVycyBhIGRlYnVnCiAqICBoYW5kbGVyIGFzIGEgcnVuLXRpbWUgaW5qZWN0YWJsZSBoYW5kbGVyIGZvciBjb25maWd1cmF0aW9uIGZpbGUKICogIHVzZS4KICovCnZvaWQKbmV0c25tcF9pbml0X2RlYnVnX2hlbHBlcih2b2lkKQp7CiAgICBuZXRzbm1wX3JlZ2lzdGVyX2hhbmRsZXJfYnlfbmFtZSgiZGVidWciLCBuZXRzbm1wX2dldF9kZWJ1Z19oYW5kbGVyKCkpOwp9Ci8qKiAgQH0gKi8KCg==