LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiB1Y29udigxKTogYW4gaWNvbnYoMSktbGlrZSBjb252ZXJ0ZXIgdXNpbmcgSUNVLgogKgogKiBPcmlnaW5hbCBjb2RlIGJ5IEpvbmFzIFV0dGVyc3Ry9m0gPGpvbmFzLnV0dGVyc3Ryb21Adml0dHJhbi5ub3Jybm9kLnNlPgogKiBjb250cmlidXRlZCBpbiAxOTk5LgogKgogKiBDb252ZXJzaW9uIHRvIHRoZSBDIGNvbnZlcnNpb24gQVBJIGFuZCBtYW55IGltcHJvdmVtZW50cyBieQogKiBZdmVzIEFycm91eWUgPHl2ZXNAcmVhbG5hbWVzLmNvbT4sIGN1cnJlbnQgbWFpbnRhaW5lci4KICoKICovCgojaW5jbHVkZSA8dW5pY29kZS91dHlwZXMuaD4KI2luY2x1ZGUgPHVuaWNvZGUvdWNudi5oPgojaW5jbHVkZSA8dW5pY29kZS91bmlzdHIuaD4KI2luY2x1ZGUgPHVuaWNvZGUvdHJhbnNsaXQuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAiY21lbW9yeS5oIgojaW5jbHVkZSAiY3N0cmluZy5oIgojaW5jbHVkZSAidXN0cmZtdC5oIgoKI2luY2x1ZGUgInVuaWNvZGUvdXdtc2cuaCIKCiNpZmRlZiBXSU4zMgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxpby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCgojaWZkZWYgVUNPTlZNU0dfTElOSwovKiBiZWxvdyBmcm9tIHRoZSBSRUFETUUgKi8KI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VkYXRhLmgiClVfQ0ZVTkMgY2hhciB1Y29udm1zZ19kYXRbXTsKI2VuZGlmCgojZGVmaW5lIERFRkFVTFRfQlVGU1ogICA0MDk2CiNkZWZpbmUgVUNPTlZNU0cgInVjb252bXNnIgoKc3RhdGljIFVSZXNvdXJjZUJ1bmRsZSAqZ0J1bmRsZSA9IDA7ICAgIC8qIEJ1bmRsZSBjb250YWluaW5nIG1lc3NhZ2VzLiAqLwoKLyoKICogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBidW5kbGUgc28gdGhhdCBtZXNzYWdlIHN0cmluZ3MgY2FuIGJlIGZldGNoZWQKICogYnkgdV93bXNnKCkuCiAqCiAqLwoKc3RhdGljIHZvaWQgaW5pdE1zZyhjb25zdCBjaGFyICpwbmFtZSkgewogICAgc3RhdGljIGludCBwcyA9IDA7CgogICAgaWYgKCFwcykgewogICAgICAgIGNoYXIgZGF0YVBhdGhbMjA0OF07ICAgICAgICAvKiBYWFggU2xvcHB5OiBzaG91bGQgYmUgUEFUSF9NQVguICovCiAgICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CgogICAgICAgIHBzID0gMTsKCiAgICAgICAgLyogU2V0IHVwIG91ciBzdGF0aWMgZGF0YSAtIGlmIGFueSAqLwojaWZkZWYgVUNPTlZNU0dfTElOSwogICAgICAgIHVkYXRhX3NldEFwcERhdGEoVUNPTlZNU0csIChjb25zdCB2b2lkKikgdWNvbnZtc2dfZGF0LCAmZXJyKTsKICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmcsIHByb2JsZW0gaW5zdGFsbGluZyBvdXIgc3RhdGljIHJlc291cmNlIGJ1bmRsZSBkYXRhIHVjb252bXNnOiAlcyAtIHRyeWluZyBhbnl3YXlzLlxuIiwKICAgICAgICAgICAgICAgICAgcG5hbWUsIHVfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOyAvKiBJdCBtYXkgc3RpbGwgZmFpbCAqLwogICAgICAgIH0KI2VuZGlmCgogICAgICAgIC8qIEdldCBtZXNzYWdlcy4gKi8KICAgICAgICBnQnVuZGxlID0gdV93bXNnX3NldFBhdGgoVUNPTlZNU0csICZlcnIpOwogICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAiJXM6IHdhcm5pbmc6IGNvdWxkbid0IG9wZW4gYnVuZGxlICVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBwbmFtZSwgVUNPTlZNU0csIHVfZXJyb3JOYW1lKGVycikpOwojaWZkZWYgVUNPTlZNU0dfTElOSwogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAiJXM6IHNldEFwcERhdGEgd2FzIGNhbGxlZCwgaW50ZXJuYWwgZGF0YSAlcyBmYWlsZWQgdG8gbG9hZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcG5hbWUsIFVDT05WTVNHKTsKI2VuZGlmCiAKICAgICAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgICAgICAgICAvKiB0aGF0IHdhcyB0cnkgIzEsIHRyeSBhZ2FpbiB3aXRoIGEgcGF0aCAqLwogICAgICAgICAgICB1cHJ2X3N0cmNweShkYXRhUGF0aCwgdV9nZXREYXRhRGlyZWN0b3J5KCkpOwogICAgICAgICAgICB1cHJ2X3N0cmNhdChkYXRhUGF0aCwgVV9GSUxFX1NFUF9TVFJJTkcpOwogICAgICAgICAgICB1cHJ2X3N0cmNhdChkYXRhUGF0aCwgVUNPTlZNU0cpOwoKICAgICAgICAgICAgZ0J1bmRsZSA9IHVfd21zZ19zZXRQYXRoKGRhdGFQYXRoLCAmZXJyKTsKICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAiJXM6IHdhcm5pbmc6IHN0aWxsIGNvdWxkbid0IG9wZW4gYnVuZGxlICVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBwbmFtZSwgZGF0YVBhdGgsIHVfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogd2FybmluZzogbWVzc2FnZXMgd2lsbCBub3QgYmUgZGlzcGxheWVkXG4iLCBwbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCi8qIE1hcHBpbmcgb2YgY2FsbGJhY2sgbmFtZXMgdG8gdGhlIGNhbGxiYWNrcyBwYXNzZWQgdG8gdGhlIGNvbnZlcnRlcgogICBBUEkuICovCgpzdGF0aWMgc3RydWN0IGNhbGxiYWNrX2VudCB7CiAgICBjb25zdCBjaGFyICpuYW1lOwogICAgVUNvbnZlcnRlckZyb21VQ2FsbGJhY2sgZnJvbXU7CiAgICBjb25zdCB2b2lkICpmcm9tdWN0eHQ7CiAgICBVQ29udmVydGVyVG9VQ2FsbGJhY2sgdG91OwogICAgY29uc3Qgdm9pZCAqdG91Y3R4dDsKfSB0cmFuc2NvZGVfY2FsbGJhY2tzW10gPSB7CiAgICB7ICJzdWJzdGl0dXRlIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfU1VCU1RJVFVURSwgMCwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX1NVQlNUSVRVVEUsIDAgfSwKICAgIHsgInNraXAiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19TS0lQLCAwLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfU0tJUCwgMCB9LAogICAgeyAic3RvcCIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX1NUT1AsIDAsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19TVE9QLCAwIH0sCiAgICB7ICJlc2NhcGUiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIDAsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIDB9LAogICAgeyAiZXNjYXBlLWljdSIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfSUNVLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9JQ1UgfSwKICAgIHsgImVzY2FwZS1qYXZhIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9KQVZBLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9KQVZBIH0sCiAgICB7ICJlc2NhcGUtYyIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfQywKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfQyB9LAogICAgeyAiZXNjYXBlLXhtbCIsCiAgICAgIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfWE1MX0hFWCwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfWE1MX0hFWCB9LAogICAgeyAiZXNjYXBlLXhtbC1oZXgiLAogICAgICBVQ05WX0ZST01fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1hNTF9IRVgsCiAgICAgIFVDTlZfVE9fVV9DQUxMQkFDS19FU0NBUEUsIFVDTlZfRVNDQVBFX1hNTF9IRVggfSwKICAgIHsgImVzY2FwZS14bWwtZGVjIiwKICAgICAgVUNOVl9GUk9NX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9YTUxfREVDLAogICAgICBVQ05WX1RPX1VfQ0FMTEJBQ0tfRVNDQVBFLCBVQ05WX0VTQ0FQRV9YTUxfREVDIH0sCiAgICB7ICJlc2NhcGUtdW5pY29kZSIsIFVDTlZfRlJPTV9VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfVU5JQ09ERSwKICAgICAgVUNOVl9UT19VX0NBTExCQUNLX0VTQ0FQRSwgVUNOVl9FU0NBUEVfVU5JQ09ERSB9Cn07CgovKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgY2FsbGJhY2sgcmVjb3JkIGdpdmVuIGl0cyBuYW1lLiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjYWxsYmFja19lbnQgKmZpbmRDYWxsYmFjayhjb25zdCBjaGFyICpuYW1lKSB7CiAgICBpbnQgaSwgY291bnQgPQogICAgICAgIHNpemVvZih0cmFuc2NvZGVfY2FsbGJhY2tzKSAvIHNpemVvZigqdHJhbnNjb2RlX2NhbGxiYWNrcyk7CgogICAgLyogV2UnbGwgZG8gYSBsaW5lYXIgc2VhcmNoLCB0aGVyZSBhcmVuJ3QgbWFueSBvZiB0aGVtIGFuZCBic2VhcmNoKCkKICAgICAgIG1heSBub3QgYmUgdGhhdCBwb3J0YWJsZS4gKi8KCiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgIGlmICghdXBydl9zdHJpY21wKG5hbWUsIHRyYW5zY29kZV9jYWxsYmFja3NbaV0ubmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuICZ0cmFuc2NvZGVfY2FsbGJhY2tzW2ldOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyogUHJpbnQgY29udmVydGVyIGluZm9ybWF0aW9uLiBJZiBsb29rZm9yIGlzIHNldCwgb25seSB0aGF0IGNvbnZlcnRlciB3aWxsCiAgIGJlIHByaW50ZWQsIG90aGVyd2lzZSBhbGwgY29udmVydGVycyB3aWxsIGJlIHByaW50ZWQuIElmIGNhbm9uIGlzIG5vbgogICB6ZXJvLCB0YWdzIGFuZCBhbGlhc2VzIGZvciBlYWNoIGNvbnZlcnRlciBhcmUgcHJpbnRlZCB0b28sIGluIHRoZSBmb3JtYXQKICAgZXhwZWN0ZWQgZm9yIGNvbnZydGVycy50eHQoNSkuICovCgpzdGF0aWMgaW50IHByaW50Q29udmVydGVycyhjb25zdCBjaGFyICpwbmFtZSwgY29uc3QgY2hhciAqbG9va2ZvciwKICAgIGludCBjYW5vbikKewogICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICBpbnQzMl90IG51bTsKICAgIHVpbnQxNl90IG51bV9zdGRzOwogICAgY29uc3QgY2hhciAqKnN0ZHM7CgogICAgLyogSWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgbmFtZSwganVzdCBoYW5kbGUgdGhhdCBub3cuICovCgogICAgaWYgKGxvb2tmb3IpIHsKICAgICAgICBpZiAoIWNhbm9uKSB7CiAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIGxvb2tmb3IpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgIC8qICBCZWNhdXNlIHdlIGFyZSBwcmludGluZyBhIGNhbm9uaWNhbCBuYW1lLCB3ZSBuZWVkIHRoZQogICAgICAgICAgICB0cnVlIGNvbnZlcnRlciBuYW1lLiBXZSd2ZSBkb25lIHRoYXQgYWxyZWFkeSBleGNlcHQgZm9yCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IG5hbWUgKGJlY2F1c2Ugd2Ugd2FudCB0byBwcmludCB0aGUgZXhhY3QKICAgICAgICAgICAgbmFtZSBvbmUgd291bGQgZ2V0IHdoZW4gY2FsbGluZyB1Y252X2dldERlZmF1bHROYW1lKCkKICAgICAgICAgICAgaW4gbm9uLWNhbm9uIG1vZGUpLiBCdXQgc2luY2Ugd2UgZG8gbm90IGtub3cgYXQgdGhpcwogICAgICAgICAgICBwb2ludCBpZiB3ZSBoYXZlIHRoZSBkZWZhdWx0IG5hbWUgb3Igc29tZXRoaW5nIGVsc2UsIHdlCiAgICAgICAgICAgIG5lZWQgdG8gbm9ybWFsaXplIGFnYWluIHRvIHRoZSBjYW5vbmljYWwgY29udmVydGVyCiAgICAgICAgICAgIG5hbWUuICovCgogICAgICAgICAgICBjb25zdCBjaGFyICp0cnVlbmFtZSA9IHVjbnZfZ2V0QWxpYXMobG9va2ZvciwgMCwgJmVycik7CiAgICAgICAgICAgIGlmIChVX1NVQ0NFU1MoZXJyKSkgewogICAgICAgICAgICAgICAgbG9va2ZvciA9IHRydWVuYW1lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIFByaW50IGNvbnZlcnRlciBuYW1lcy4gV2UgY29tZSBoZXJlIGZvciBvbmUgb2YgdHdvIHJlYXNvbnM6IHdlCiAgICAgICBhcmUgcHJpbnRpbmcgYWxsIHRoZSBuYW1lcyAobG9va2ZvciB3YXMgbnVsbCksIG9yIHdlIGhhdmUgYQogICAgICAgc2luZ2xlIGNvbnZlcnRlciB0byBwcmludCBidXQgaW4gY2Fub24gbW9kZSwgaGVuY2Ugd2UgbmVlZCB0bwogICAgICAgZ2V0IHRvIGl0IGluIG9yZGVyIHRvIHByaW50IGV2ZXJ5dGhpbmcuICovCgogICAgbnVtID0gdWNudl9jb3VudEF2YWlsYWJsZSgpOwogICAgaWYgKG51bSA8PSAwKSB7CiAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRHZXROYW1lcyIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGlmIChsb29rZm9yKSB7CiAgICAgICAgbnVtID0gMTsgICAgICAgICAgICAgICAgLyogV2Uga25vdyB3aGVyZSB3ZSB3YW50IHRvIGJlLiAqLwogICAgfQoKICAgIG51bV9zdGRzID0gdWNudl9jb3VudFN0YW5kYXJkcygpOwogICAgc3RkcyA9IChjb25zdCBjaGFyICoqKSB1cHJ2X21hbGxvYyhudW1fc3RkcyAqIHNpemVvZigqc3RkcykpOwogICAgaWYgKCFzdGRzKSB7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRHZXRUYWciLCB1X3dtc2dfZXJyb3JOYW1lKFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgewogICAgICAgIHVpbnQxNl90IHM7CgogICAgICAgIGZvciAocyA9IDA7IHMgPCBudW1fc3RkczsgKytzKSB7CiAgICAgICAgICAgIHN0ZHNbc10gPSB1Y252X2dldFN0YW5kYXJkKHMsICZlcnIpOwogICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50R2V0VGFnIiwgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgICAgdWludDE2X3QgbnVtX2FsaWFzZXM7CgogICAgICAgIC8qIFNldCB0aGUgbmFtZSBlaXRoZXIgdG8gd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IsIG9yCiAgICAgICAgdG8gdGhlIGN1cnJlbnQgY29udmVydGVyIG5hbWUuICovCgogICAgICAgIGlmIChsb29rZm9yKSB7CiAgICAgICAgICAgIG5hbWUgPSBsb29rZm9yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5hbWUgPSB1Y252X2dldEF2YWlsYWJsZU5hbWUoaSk7CiAgICAgICAgfQoKICAgICAgICAvKiBHZXQgYWxsIHRoZSBhbGlhc2VzIGFzc29jaWF0ZWQgdG8gdGhlIG5hbWUuICovCgogICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgICAgICBudW1fYWxpYXNlcyA9IHVjbnZfY291bnRBbGlhc2VzKG5hbWUsICZlcnIpOwogICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgICAgICBwcmludGYoIiVzIiwgbmFtZSk7CgogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihuYW1lLCAoaW50MzJfdCkodXBydl9zdHJsZW4obmFtZSkgKyAxKSk7CiAgICAgICAgICAgIHB1dGNoYXIoJ1x0Jyk7CiAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50R2V0QWxpYXNlcyIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1aW50MTZfdCBhLCBzLCB0OwoKICAgICAgICAgICAgLyogV3JpdGUgYWxsIHRoZSBhbGlhc2VzIGFuZCB0aGVpciB0YWdzLiAqLwoKICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IG51bV9hbGlhc2VzOyArK2EpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFsaWFzID0gdWNudl9nZXRBbGlhcyhuYW1lLCBhLCAmZXJyKTsKCiAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihuYW1lLCAoaW50MzJfdCkodXBydl9zdHJsZW4obmFtZSkgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgcHV0Y2hhcignXHQnKTsKICAgICAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudEdldEFsaWFzZXMiLCBzdHIuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCBhbGlhcyk7CgogICAgICAgICAgICAgICAgLyogTG9vayAoc2xvd2x5LCBsaW5lYXIgc2VhcmNoaW5nKSBmb3IgYSB0YWcuICovCgogICAgICAgICAgICAgICAgaWYgKGNhbm9uKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gdCA9IDA7IHMgPCBudW1fc3RkczsgKytzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YW5kYXJkID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbnZfZ2V0U3RhbmRhcmROYW1lKG5hbWUsIHN0ZHNbc10sICZlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKGVycikgJiYgc3RhbmRhcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHN0YW5kYXJkLCBhbGlhcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgeyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBzdGRzW3NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiB9Iik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIE1vdmUgb24uICovCgogICAgICAgICAgICAgICAgaWYgKGEgPCBudW1fYWxpYXNlcyAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBwdXRjaGFyKGEgfHwgIWNhbm9uID8gJyAnIDogJ1x0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFRlcm1pbmF0ZSB0aGlzIGVudHJ5LiAqLwoKICAgICAgICBpZiAoY2Fub24pIHsKICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKICAgICAgICB9IGVsc2UgaWYgKGkgPCBudW0gLSAxKSB7CiAgICAgICAgICAgIHB1dGNoYXIoJyAnKTsKICAgICAgICB9CiAgICB9CgogICAgLyogRnJlZSB0ZW1wb3JhcnkgZGF0YS4gKi8KCiAgICB1cHJ2X2ZyZWUoc3Rkcyk7CgogICAgLyogU3VjY2Vzcy4gKi8KCiAgICByZXR1cm4gMDsKfQoKLyogUHJpbnQgYWxsIGF2YWlsYWJsZSB0cmFuc2xpdGVyYXRvcnMuIElmIGNhbm9uIGlzIG5vbiB6ZXJvLCBwcmludAogICBvbmUgdHJhbnNsaXRlcmF0b3IgcGVyIGxpbmUuICovCgpzdGF0aWMgaW50IHByaW50VHJhbnNsaXRlcmF0b3JzKGludCBjYW5vbikKewojaWYgVUNPTkZJR19OT19UUkFOU0xJVEVSQVRJT04KICAgIHByaW50Zigibm8gdHJhbnNsaXRlcmF0b3JzIGF2YWlsYWJsZSBiZWNhdXNlIG9mIFVDT05GSUdfTk9fVFJBTlNMSVRFUkFUSU9OLCBzZWUgdWNvbmZpZy5oXG4iKTsKICAgIHJldHVybiAxOwojZWxzZQogICAgaW50MzJfdCBudW10cmFucyA9IHV0cmFuc19jb3VudEF2YWlsYWJsZUlEcygpLCBpOwogICAgaW50IGJ1ZmxlbiA9IDUxMjsKICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopIHVwcnZfbWFsbG9jKGJ1Zmxlbik7CiAgICBjaGFyIHN0YXRpY2J1Zls1MTJdOwoKICAgIGNoYXIgc2VwY2hhciA9IGNhbm9uID8gJ1xuJyA6ICcgJzsKCiAgICBpZiAoIWJ1ZikgewogICAgICAgIGJ1ZiA9IHN0YXRpY2J1ZjsKICAgICAgICBidWZsZW4gPSBzaXplb2Yoc3RhdGljYnVmKTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtdHJhbnM7ICsraSkgewogICAgICAgIGludDMyX3QgbGVuID0gdXRyYW5zX2dldEF2YWlsYWJsZUlEKGksIGJ1ZiwgYnVmbGVuKTsKICAgICAgICBpZiAobGVuID49IGJ1ZmxlbiAtIDEpIHsKICAgICAgICAgICAgaWYgKGJ1ZiAhPSBzdGF0aWNidWYpIHsKICAgICAgICAgICAgICAgIGJ1ZmxlbiA8PD0gMTsKICAgICAgICAgICAgICAgIGlmIChidWZsZW4gPCBsZW4pIHsKICAgICAgICAgICAgICAgICAgICBidWZsZW4gPSBsZW4gKyA2NDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJ1ZiA9IChjaGFyICopIHVwcnZfcmVhbGxvYyhidWYsIGJ1Zmxlbik7CiAgICAgICAgICAgICAgICBpZiAoIWJ1ZikgewogICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHN0YXRpY2J1ZjsKICAgICAgICAgICAgICAgICAgICBidWZsZW4gPSBzaXplb2Yoc3RhdGljYnVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB1dHJhbnNfZ2V0QXZhaWxhYmxlSUQoaSwgYnVmLCBidWZsZW4pOwogICAgICAgICAgICBpZiAobGVuID49IGJ1ZmxlbikgewogICAgICAgICAgICAgICAgdXBydl9zdHJjcHkoYnVmICsgYnVmbGVuIC0gNCwgIi4uLiIpOyAvKiBUcnVuY2F0ZSB0aGUgbmFtZS4gKi8KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJpbnRmKCIlcyIsIGJ1Zik7CiAgICAgICAgaWYgKGkgPCBudW10cmFucyAtIDEpIHsKICAgICAgICAgICAgcHV0Y2hhcihzZXBjaGFyKTsKICAgICAgICB9CiAgICB9CgogICAgLyogQWRkIGEgdGVybWluYXRpbmcgbmV3bGluZSBpZiBuZWVkZWQuICovCgogICAgaWYgKHNlcGNoYXIgIT0gJ1xuJykgewogICAgICAgIHB1dGNoYXIoJ1xuJyk7CiAgICB9CgogICAgLyogRnJlZSB0ZW1wb3JhcnkgZGF0YS4gKi8KCiAgICBpZiAoYnVmICE9IHN0YXRpY2J1ZikgewogICAgICAgIHVwcnZfZnJlZShidWYpOwogICAgfQoKICAgIC8qIFN1Y2Nlc3MuICovCgogICAgcmV0dXJuIDA7CiNlbmRpZgp9CgovKiBSZXR1cm4gdGhlIG9mZnNldCBvZiBhIGJ5dGUgaW4gaXRzIHNvdXJjZSwgZ2l2ZW4gdGhlIGZyb20gYW5kIHRvIG9mZnNldHMKICAgdmVjdG9ycyBhbmQgdGhlIGJ5dGUgb2Zmc2V0IGl0c2VsZi4gKi8KCnN0YXRpYyBpbmxpbmUgaW50MzJfdCBkYXRhT2Zmc2V0KGludDMyX3Qgd2hlcmV0bywKICAgIGNvbnN0IGludDMyX3QgKmZyb21vZmZzZXRzLCBpbnQzMl90IGZyb21zeiwKICAgIGNvbnN0IGludDMyX3QgKnRvb2Zmc2V0cywgaW50MzJfdCB0b3N6KSB7CiAgICBpZiAod2hlcmV0byA+PSAwICYmIHdoZXJldG8gPCB0b3N6KSB7CiAgICAgICAgd2hlcmV0byA9IHRvb2Zmc2V0c1t3aGVyZXRvXTsKICAgICAgICBpZiAod2hlcmV0byA+PSAwICYmIHdoZXJldG8gPCBmcm9tc3opIHsKICAgICAgICAgICAgcmV0dXJuIGZyb21vZmZzZXRzW3doZXJldG9dOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLy8gQ29udmVydCBhIGZpbGUgZnJvbSBvbmUgZW5jb2RpbmcgdG8gYW5vdGhlcgpzdGF0aWMgVUJvb2wgY29udmVydEZpbGUoY29uc3QgY2hhciAqcG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tY3BhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBVQ29udmVydGVyVG9VQ2FsbGJhY2sgdG91Y2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0b3VjdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9jcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNrIGZyb211Y2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpmcm9tdWN0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmc3osCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFuc2xpdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluZmlsZXN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKiBvdXRmaWxlLCBpbnQgdmVyYm9zZSkKewogICAgRklMRSAqaW5maWxlOwogICAgVUJvb2wgcmV0ID0gVFJVRTsKICAgIFVDb252ZXJ0ZXIgKmNvbnZmcm9tID0gMDsKICAgIFVDb252ZXJ0ZXIgKmNvbnZ0byA9IDA7CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgIFVCb29sIGZsdXNoOwogICAgY29uc3QgY2hhciAqY2J1ZnA7CiAgICBjaGFyICpidWZwOwogICAgY2hhciAqYnVmID0gMDsKCiAgICB1aW50MzJfdCBpbmZvZmZzZXQgPSAwLCBvdXRmb2Zmc2V0ID0gMDsgICAvKiBXaGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUsIGZvciBlcnJvciByZXBvcnRpbmcuICovCgogICAgY29uc3QgVUNoYXIgKnVuaWJ1ZmJwOwogICAgVUNoYXIgKnVuaWJ1ZnA7CiAgICBVQ2hhciAqdW5pYnVmID0gMDsKICAgIGludDMyX3QgKmZyb21vZmZzZXRzID0gMCwgKnRvb2Zmc2V0cyA9IDA7CgogICAgc2l6ZV90IHJkLCB3ciwgdG9idWZzejsKCiNpZiAhVUNPTkZJR19OT19UUkFOU0xJVEVSQVRJT04KICAgIFRyYW5zbGl0ZXJhdG9yICp0ID0gMDsgICAgICAvLyBUcmFuc2xpdGVyYXRvciBhY3Rpbmcgb24gVW5pY29kZSBkYXRhLgojZW5kaWYKICAgIFVuaWNvZGVTdHJpbmcgdTsgICAgICAgICAgICAvLyBTdHJpbmcgdG8gZG8gdGhlIHRyYW5zbGl0ZXJhdGlvbi4KCiAgICAvLyBPcGVuIHRoZSBjb3JyZWN0IGlucHV0IGZpbGUgb3IgY29ubmVjdCB0byBzdGRpbiBmb3IgcmVhZGluZyBpbnB1dAoKICAgIGlmIChpbmZpbGVzdHIgIT0gMCAmJiBzdHJjbXAoaW5maWxlc3RyLCAiLSIpKSB7CiAgICAgICAgaW5maWxlID0gZm9wZW4oaW5maWxlc3RyLCAicmIiKTsKICAgICAgICBpZiAoaW5maWxlID09IDApIHsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIxKGluZmlsZXN0ciwgIiIpOwogICAgICAgICAgICBzdHIxLmFwcGVuZCgoVUNoYXIzMikgMCk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyMihzdHJlcnJvcihlcnJubyksICIiKTsKICAgICAgICAgICAgc3RyMi5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRPcGVuSW5wdXRGIiwgc3RyMS5nZXRCdWZmZXIoKSwgc3RyMi5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGluZmlsZXN0ciA9ICItIjsKICAgICAgICBpbmZpbGUgPSBzdGRpbjsKI2lmZGVmIFdJTjMyCiAgICAgICAgaWYgKHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpID09IC0xKSB7CiAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFNldEluQmluTW9kZSIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQojZW5kaWYKICAgIH0KCiAgICBpZiAodmVyYm9zZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCBpbmZpbGVzdHIpOwogICAgfQoKI2lmICFVQ09ORklHX05PX1RSQU5TTElURVJBVElPTgogICAgLy8gQ3JlYXRlIHRyYW5zbGl0ZXJhdG9yIGFzIG5lZWRlZC4KCiAgICBpZiAodHJhbnNsaXQgIT0gTlVMTCAmJiAqdHJhbnNsaXQpIHsKICAgICAgICBVUGFyc2VFcnJvciBwYXJzZTsKICAgICAgICBVbmljb2RlU3RyaW5nIHN0cih0cmFuc2xpdCksIHBlc3RyOwoKICAgICAgICAvKiBDcmVhdGUgZnJvbSBydWxlcyBvciBieSBJRCBhcyBuZWVkZWQuICovCgogICAgICAgIHBhcnNlLmxpbmUgPSAtMTsKCiAgICAgICAgaWYgKHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnOicpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPicpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPCcpIHx8IHVwcnZfc3RyY2hyKHRyYW5zbGl0LCAnPicpKSB7CiAgICAgICAgICAgIHQgPSBUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlRnJvbVJ1bGVzKCJVY29udiIsIHN0ciwgVVRSQU5TX0ZPUldBUkQsIHBhcnNlLCBlcnIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHQgPSBUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlSW5zdGFuY2UodHJhbnNsaXQsIFVUUkFOU19GT1JXQVJELCBlcnIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgIHN0ci5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKCiAgICAgICAgICAgIGlmIChwYXJzZS5saW5lID49IDApIHsKICAgICAgICAgICAgICAgIFVDaGFyIGxpbmVidWZbMjBdLCBvZmZzZXRidWZbMjBdOwogICAgICAgICAgICAgICAgdXBydl9pdG91KGxpbmVidWYsIDIwLCBwYXJzZS5saW5lLCAxMCwgMCk7CiAgICAgICAgICAgICAgICB1cHJ2X2l0b3Uob2Zmc2V0YnVmLCAyMCwgcGFyc2Uub2Zmc2V0LCAxMCwgMCk7CiAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudENyZWF0ZVRyYW5zbGl0UGFyc2VFcnIiLCBzdHIuZ2V0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgdV93bXNnX2Vycm9yTmFtZShlcnIpLCBsaW5lYnVmLCBvZmZzZXRidWYpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRDcmVhdGVUcmFuc2xpdCIsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgZGVsZXRlIHQ7CiAgICAgICAgICAgICAgICB0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgfQogICAgfQojZW5kaWYKCiAgICAvLyBDcmVhdGUgY29kZXBhZ2UgY29udmVydGVyLiBJZiB0aGUgY29kZXBhZ2Ugb3IgaXRzIGFsaWFzZXMgd2VyZW4ndAogICAgLy8gYXZhaWxhYmxlLCBpdCByZXR1cm5zIE5VTEwgYW5kIGEgZmFpbHVyZSBjb2RlLiBXZSBhbHNvIHNldCB0aGUKICAgIC8vIGNhbGxiYWNrcywgYW5kIHJldHVybiBlcnJvcnMgaW4gdGhlIHNhbWUgd2F5LgoKICAgIGNvbnZmcm9tID0gdWNudl9vcGVuKGZyb21jcGFnZSwgJmVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihmcm9tY3BhZ2UsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihmcm9tY3BhZ2UpICsgMSkpOwogICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50T3BlbkZyb21Db2Rlc2V0Iiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KICAgIHVjbnZfc2V0VG9VQ2FsbEJhY2soY29udmZyb20sIHRvdWNhbGxiYWNrLCB0b3VjdHh0LCAwLCAwLCAmZXJyKTsKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgIHVfd21zZyhzdGRlcnIsICJjYW50U2V0Q2FsbGJhY2siLCB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KCiAgICBjb252dG8gPSB1Y252X29wZW4odG9jcGFnZSwgJmVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBVbmljb2RlU3RyaW5nIHN0cih0b2NwYWdlLCAoaW50MzJfdCkodXBydl9zdHJsZW4odG9jcGFnZSkgKyAxKSk7CiAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRPcGVuVG9Db2Rlc2V0Iiwgc3RyLmdldEJ1ZmZlcigpLAogICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgIH0KICAgIHVjbnZfc2V0RnJvbVVDYWxsQmFjayhjb252dG8sIGZyb211Y2FsbGJhY2ssIGZyb211Y3R4dCwgMCwgMCwgJmVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFNldENhbGxiYWNrIiwgdV93bXNnX2Vycm9yTmFtZShlcnIpKTsKICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICB9CiAgICB1Y252X3NldEZhbGxiYWNrKGNvbnZ0bywgZmFsbGJhY2spOwoKICAgIC8vIFRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgYWx3YXlzIGlzIG9mIGVub3VnaCBzaXplLCB3ZQogICAgLy8gbXVzdCB0YWtlIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvLCB0aGF0IGlzIHRoZSBjaGFyYWN0ZXIgaW4KICAgIC8vIHRoZSBjb2RlcGFnZSB0aGF0IHVzZXMgdGhlIG1vc3QgYnl0ZXMgYW5kIG11bHRpcGx5IGl0IGFnYWluc3QKICAgIC8vIHRoZSBidWZmZXIgc2l6ZS4KCiAgICAvLyB1c2UgYnVmc3orMSB0byBhbGxvdyBmb3IgYWRkaXRpb25hbCBCT00vc2lnbmF0dXJlIGNoYXJhY3RlciAoVStGRUZGKQogICAgdG9idWZzeiA9IChidWZzeisxKSAqIHVjbnZfZ2V0TWF4Q2hhclNpemUoY29udnRvKTsKCiAgICBidWYgPSBuZXcgY2hhclt0b2J1ZnN6XTsKICAgIHVuaWJ1ZiA9IG5ldyBVQ2hhcltidWZzel07CgogICAgZnJvbW9mZnNldHMgPSBuZXcgaW50MzJfdFtidWZzel07CiAgICB0b29mZnNldHMgPSBuZXcgaW50MzJfdFt0b2J1ZnN6XTsKCiAgICAvLyBPSywgd2UgY2FuIGNvbnZlcnQgbm93LgoKICAgIGRvIHsKICAgICAgICBjaGFyIHdpbGxleGl0ID0gMDsKCiAgICAgICAgcmQgPSBmcmVhZChidWYsIDEsIGJ1ZnN6LCBpbmZpbGUpOwogICAgICAgIGlmIChmZXJyb3IoaW5maWxlKSAhPSAwKSB7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgIHN0ci5hcHBlbmQoKFVDaGFyMzIpIDApOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRSZWFkIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgIH0KCiAgICAgICAgLy8gQ29udmVydCB0aGUgcmVhZCBidWZmZXIgaW50byB0aGUgbmV3IGNvZGluZwogICAgICAgIC8vIEFmdGVyIHRoZSBjYWxsICd1bmlidWZwJyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbGFzdAogICAgICAgIC8vIGNoYXJhY3RlciB0aGF0IHdhcyBjb252ZXJ0ZWQgaW4gdGhlICd1bmlidWYnLgogICAgICAgIC8vIEFsc28gdGhlICdjYnVmcCcgaXMgcG9zaXRpb25lZCBvbiB0aGUgbGFzdCBjb252ZXJ0ZWQKICAgICAgICAvLyBjaGFyYWN0ZXIuCiAgICAgICAgLy8gQXQgdGhlIGxhc3QgY29udmVyc2lvbiBpbiB0aGUgZmlsZSwgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwogICAgICAgIC8vIHRydWUgc28gdGhhdCB3ZSBnZXQgYWxsIGNoYXJhY3RlcnMgY29udmVydGVkCiAgICAgICAgLy8KICAgICAgICAvLyBUaGUgY29udmVydGVyIG11c3QgYmUgZmx1c2hlZCBhdCB0aGUgZW5kIG9mIGNvbnZlcnNpb24gc28KICAgICAgICAvLyB0aGF0IGNoYXJhY3RlcnMgb24gaG9sZCBhbHNvIHdpbGwgYmUgd3JpdHRlbi4KCiAgICAgICAgdW5pYnVmcCA9IHVuaWJ1ZjsKICAgICAgICBjYnVmcCA9IGJ1ZjsKICAgICAgICBmbHVzaCA9IHJkICE9IGJ1ZnN6OwogICAgICAgIHVjbnZfdG9Vbmljb2RlKGNvbnZmcm9tLCAmdW5pYnVmcCwgdW5pYnVmcCArIGJ1ZnN6LCAmY2J1ZnAsCiAgICAgICAgICAgIGNidWZwICsgcmQsIGZyb21vZmZzZXRzLCBmbHVzaCwgJmVycik7CgogICAgICAgIGluZm9mZnNldCArPSAodWludDMyX3QpKGNidWZwIC0gYnVmKTsKCiAgICAgICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgICAgIGNoYXIgcG9zWzMyXTsKICAgICAgICAgICAgc3ByaW50Zihwb3MsICIldSIsIGluZm9mZnNldCAtIDEpOwogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihwb3MsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihwb3MpICsgMSkpOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInByb2JsZW1DdnRUb1UiLCBzdHIuZ2V0QnVmZmVyKCksIHVfd21zZ19lcnJvck5hbWUoZXJyKSk7CiAgICAgICAgICAgIHdpbGxleGl0ID0gMTsKICAgICAgICB9CgogICAgICAgIC8vIEF0IHRoZSBsYXN0IGNvbnZlcnNpb24sIHRoZSBjb252ZXJ0ZWQgY2hhcmFjdGVycyBzaG91bGQgYmUKICAgICAgICAvLyBlcXVhbCB0byBudW1iZXIgb2YgY2hhcnMgcmVhZC4KCiAgICAgICAgaWYgKGZsdXNoICYmICF3aWxsZXhpdCAmJiBjYnVmcCAhPSAoYnVmICsgcmQpKSB7CiAgICAgICAgICAgIGNoYXIgcG9zWzMyXTsKICAgICAgICAgICAgc3ByaW50Zihwb3MsICIldSIsIGluZm9mZnNldCk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHBvcywgKGludDMyX3QpKHVwcnZfc3RybGVuKHBvcykgKyAxKSk7CiAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAicHJlbUVuZElucHV0Iiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgd2lsbGV4aXQgPSAxOwogICAgICAgIH0KCiAgICAgICAgLy8gUHJlcGFyZSB0byB0cmFuc2xpdGVyYXRlIGFuZCBjb252ZXJ0LiBUcmFuc2xpdGVyYXRlIGlmIG5lZWRlZC4KCiNpZiAhVUNPTkZJR19OT19UUkFOU0xJVEVSQVRJT04KICAgICAgICBpZiAodCkgewogICAgICAgICAgICB1LnNldFRvKHVuaWJ1ZiwgKGludDMyX3QpKHVuaWJ1ZnAgLSB1bmlidWYpKTsgLy8gQ29weSBpbnRvIHN0cmluZy4KICAgICAgICAgICAgdC0+dHJhbnNsaXRlcmF0ZSh1KTsKICAgICAgICB9IGVsc2UKI2VuZGlmCiAgICAgICAgewogICAgICAgICAgICB1LnNldFRvKHVuaWJ1ZiwgKGludDMyX3QpKHVuaWJ1ZnAgLSB1bmlidWYpLCAoaW50MzJfdCkoYnVmc3opKTsgLy8gU2hhcmUgdGhlIGJ1ZmZlci4KICAgICAgICB9CgogICAgICAgIGludDMyX3QgdWxlbiA9IHUubGVuZ3RoKCk7CgogICAgICAgIC8vIENvbnZlcnQgdGhlIFVuaWNvZGUgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGNvZGVwYWdlCiAgICAgICAgLy8gQWdhaW4gJ2J1ZnAnIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSBsYXN0IGNvbnZlcnRlZCBjaGFyYWN0ZXIKICAgICAgICAvLyBBbmQgJ3VuaWJ1ZmJwJyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbGFzdCBjb252ZXJ0ZWQgdW5pY29kZSBjaGFyYWN0ZXIKICAgICAgICAvLyBBdCB0aGUgbGFzdCBjb252ZXJzaW9uIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB0byBlbnN1cmUgdGhhdAogICAgICAgIC8vIGFsbCBjaGFyYWN0ZXJzIGxlZnQgZ2V0IGNvbnZlcnRlZAoKICAgICAgICBjb25zdCBVQ2hhciAqdW5pYnVmdSA9IHVuaWJ1ZmJwID0gdS5nZXRCdWZmZXIoKTsKCiAgICAgICAgZG8gewogICAgICAgICAgICBpbnQzMl90IGxlbiA9IHVsZW4gPiAoaW50MzJfdClidWZzeiA/IChpbnQzMl90KWJ1ZnN6IDogdWxlbjsKCiAgICAgICAgICAgIGJ1ZnAgPSBidWY7CiAgICAgICAgICAgIHVuaWJ1ZnAgPSAoVUNoYXIgKikgKHVuaWJ1ZmJwICsgbGVuKTsKCiAgICAgICAgICAgIHVjbnZfZnJvbVVuaWNvZGUoY29udnRvLCAmYnVmcCwgYnVmcCArIHRvYnVmc3osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuaWJ1ZmJwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWJ1ZnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vZmZzZXRzLCBmbHVzaCwgJmVycik7CgogICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycnRhZzsKICAgICAgICAgICAgICAgIGNoYXIgcG9zWzMyXTsKCiAgICAgICAgICAgICAgICB1aW50MzJfdCBlcnJvZmZzZXQgPQogICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQoKGludDMyX3QpKGJ1ZnAgLSBidWYgLSAxKSwgZnJvbW9mZnNldHMsIChpbnQzMl90KShidWZzeiksIHRvb2Zmc2V0cywgKGludDMyX3QpKHRvYnVmc3opKTsKICAgICAgICAgICAgICAgIGludDMyX3QgZmVycm9mZnNldCA9IChpbnQzMl90KShpbmZvZmZzZXQgLSAodW5pYnVmcCAtIHVuaWJ1ZnUpICsgZXJyb2Zmc2V0KTsKCiAgICAgICAgICAgICAgICBpZiAoKGludDMyX3QpIGZlcnJvZmZzZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgZmVycm9mZnNldCA9IChpbnQzMl90KShvdXRmb2Zmc2V0ICsgKGJ1ZnAgLSBidWYpKTsKICAgICAgICAgICAgICAgICAgICBlcnJ0YWcgPSAicHJvYmxlbUN2dEZyb21VT3V0IjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXJydGFnID0gInByb2JsZW1DdnRGcm9tVSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBvcywgIiV1IiwgZmVycm9mZnNldCk7CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cihwb3MsIChpbnQzMl90KSh1cHJ2X3N0cmxlbihwb3MpICsgMSkpOwogICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCBlcnJ0YWcsIHN0ci5nZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICB1X3dtc2dfZXJyb3JOYW1lKGVycikpOwogICAgICAgICAgICAgICAgd2lsbGV4aXQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBBdCB0aGUgbGFzdCBjb252ZXJzaW9uLCB0aGUgY29udmVydGVkIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGVxdWFsIHRvIG51bWJlcgogICAgICAgICAgICAvLyBvZiBjb25zdW1lZCBjaGFyYWN0ZXJzLgogICAgICAgICAgICBpZiAoZmx1c2ggJiYgIXdpbGxleGl0ICYmIHVuaWJ1ZmJwICE9ICh1bmlidWZ1ICsgKHNpemVfdCkgKHVuaWJ1ZnAgLSB1bmlidWZ1KSkpIHsKICAgICAgICAgICAgICAgIGNoYXIgcG9zWzMyXTsKICAgICAgICAgICAgICAgIHNwcmludGYocG9zLCAiJXUiLCBpbmZvZmZzZXQpOwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIocG9zLCAoaW50MzJfdCkodXBydl9zdHJsZW4ocG9zKSArIDEpKTsKICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInByZW1FbmQiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgd2lsbGV4aXQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBGaW5hbGx5LCB3cml0ZSB0aGUgY29udmVydGVkIGJ1ZmZlciB0byB0aGUgb3V0cHV0IGZpbGUKCgogICAgICAgICAgICByZCA9IChzaXplX3QpIChidWZwIC0gYnVmKTsKICAgICAgICAgICAgb3V0Zm9mZnNldCArPSAoaW50MzJfdCkod3IgPSBmd3JpdGUoYnVmLCAxLCByZCwgb3V0ZmlsZSkpOwogICAgICAgICAgICBpZiAod3IgIT0gcmQpIHsKICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKHN0cmVycm9yKGVycm5vKSwgIiIpOwogICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAiY2FudFdyaXRlIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgICAgIHdpbGxleGl0ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdpbGxleGl0KSB7CiAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgodWxlbiAtPSAoaW50MzJfdCkoYnVmc3opKSA+IDApOwogICAgfSB3aGlsZSAoIWZsdXNoKTsgICAgICAgICAgIC8vIFN0b3Agd2hlbiB3ZSBoYXZlIGZsdXNoZWQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydGVycyAodGhpcyBtZWFucyB0aGF0IGl0J3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZW5kIG9mIG91dHB1dCkKCiAgICBnb3RvIG5vcm1hbF9leGl0OwoKZXJyb3JfZXhpdDoKICAgIHJldCA9IEZBTFNFOwoKbm9ybWFsX2V4aXQ6CiAgICAvLyBDbGVhbnVwLgoKICAgIGlmIChjb252ZnJvbSkgdWNudl9jbG9zZShjb252ZnJvbSk7CiAgICBpZiAoY29udnRvKSB1Y252X2Nsb3NlKGNvbnZ0byk7CgojaWYgIVVDT05GSUdfTk9fVFJBTlNMSVRFUkFUSU9OCiAgICBpZiAodCkgZGVsZXRlIHQ7CiNlbmRpZgoKICAgIGlmIChidWYpIGRlbGV0ZVtdIGJ1ZjsKICAgIGlmICh1bmlidWYpIGRlbGV0ZVtdIHVuaWJ1ZjsKCiAgICBpZiAoZnJvbW9mZnNldHMpIGRlbGV0ZVtdIGZyb21vZmZzZXRzOwogICAgaWYgKHRvb2Zmc2V0cykgZGVsZXRlW10gdG9vZmZzZXRzOwoKICAgIGlmIChpbmZpbGUgIT0gc3RkaW4pIHsKICAgICAgICBmY2xvc2UoaW5maWxlKTsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpwbmFtZSwgaW50IGVjb2RlKSB7CiAgICBjb25zdCBVQ2hhciAqbXNnOwogICAgaW50MzJfdCBtc2dMZW47CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICAgIEZJTEUgKmZwID0gZWNvZGUgPyBzdGRlcnIgOiBzdGRvdXQ7CiAgICBpbnQgcmVzOwoKICAgIGluaXRNc2cocG5hbWUpOwogICAgbXNnID0KICAgICAgICB1cmVzX2dldFN0cmluZ0J5S2V5KGdCdW5kbGUsIGVjb2RlID8gImxjVXNhZ2VXb3JkIiA6ICJ1Y1VzYWdlV29yZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnTGVuLCAmZXJyKTsKICAgIFVuaWNvZGVTdHJpbmcgdXBuYW1lKHBuYW1lLCAoaW50MzJfdCkodXBydl9zdHJsZW4ocG5hbWUpICsgMSkpOwogICAgVW5pY29kZVN0cmluZyBtbmFtZShtc2csIG1zZ0xlbiArIDEpOwoKICAgIHJlcyA9IHVfd21zZyhmcCwgInVzYWdlIiwgbW5hbWUuZ2V0QnVmZmVyKCksIHVwbmFtZS5nZXRCdWZmZXIoKSk7CiAgICBpZiAoIWVjb2RlKSB7CiAgICAgICAgaWYgKCFyZXMpIHsKICAgICAgICAgICAgZnB1dGMoJ1xuJywgZnApOwogICAgICAgIH0KICAgICAgICBpZiAoIXVfd21zZyhmcCwgImhlbHAiKSkgewogICAgICAgICAgICAvKiBOb3cgZHVtcCBjYWxsYmFja3MgYW5kIGZpbmlzaC4gKi8KCiAgICAgICAgICAgIGludCBpLCBjb3VudCA9CiAgICAgICAgICAgICAgICBzaXplb2YodHJhbnNjb2RlX2NhbGxiYWNrcykgLyBzaXplb2YoKnRyYW5zY29kZV9jYWxsYmFja3MpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiAlcyIsIHRyYW5zY29kZV9jYWxsYmFja3NbaV0ubmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnB1dGMoJ1xuJywgZnApOwogICAgICAgIH0KICAgIH0KCiAgICBleGl0KGVjb2RlKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBGSUxFICpvdXRmaWxlOwogICAgaW50IHJldCA9IDA7CiAgICBpbnQgc2VlbmYgPSAwOwoKICAgIHNpemVfdCBidWZzeiA9IERFRkFVTFRfQlVGU1o7CgogICAgY29uc3QgY2hhciAqZnJvbWNwYWdlID0gMDsKICAgIGNvbnN0IGNoYXIgKnRvY3BhZ2UgPSAwOwogICAgY29uc3QgY2hhciAqdHJhbnNsaXQgPSAwOwogICAgY29uc3QgY2hhciAqb3V0ZmlsZXN0ciA9IDA7CiAgICBpbnQgZmFsbGJhY2sgPSAwOwoKICAgIFVDb252ZXJ0ZXJGcm9tVUNhbGxiYWNrIGZyb211Y2FsbGJhY2sgPSBVQ05WX0ZST01fVV9DQUxMQkFDS19TVE9QOwogICAgY29uc3Qgdm9pZCAqZnJvbXVjdHh0ID0gMDsKICAgIFVDb252ZXJ0ZXJUb1VDYWxsYmFjayB0b3VjYWxsYmFjayA9IFVDTlZfVE9fVV9DQUxMQkFDS19TVE9QOwogICAgY29uc3Qgdm9pZCAqdG91Y3R4dCA9IDA7CgogICAgY2hhciAqKml0ZXI7CiAgICBjaGFyICoqZW5kID0gYXJndiArIGFyZ2M7CgogICAgY29uc3QgY2hhciAqcG5hbWU7CgogICAgaW50IHByaW50Q29udnMgPSAwLCBwcmludENhbm9uID0gMDsKICAgIGNvbnN0IGNoYXIgKnByaW50TmFtZSA9IDA7CiAgICBpbnQgcHJpbnRUcmFuc2xpdHMgPSAwOwoKICAgIGludCB2ZXJib3NlID0gMDsKCiAgICAvLyBHZXQgYW5kIHByZXR0aWZ5IHBuYW1lLgogICAgcG5hbWUgPSB1cHJ2X3N0cnJjaHIoKmFyZ3YsIFVfRklMRV9TRVBfQ0hBUik7CiNpZmRlZiBXSU4zMgogICAgaWYgKCFwbmFtZSkgewogICAgICAgIHBuYW1lID0gdXBydl9zdHJyY2hyKCphcmd2LCAnLycpOwogICAgfQojZW5kaWYKICAgIGlmICghcG5hbWUpIHsKICAgICAgICBwbmFtZSA9ICphcmd2OwogICAgfSBlbHNlIHsKICAgICAgICArK3BuYW1lOwogICAgfQoKICAgIC8vIEZpcnN0LCBnZXQgdGhlIGFyZ3VtZW50cyBmcm9tIGNvbW1hbmQtbGluZQogICAgLy8gdG8ga25vdyB0aGUgY29kZXBhZ2VzIHRvIGNvbnZlcnQgYmV0d2VlbgoKICAgIC8vIFhYWCBXaGVuIHlvdSBhZGQgdG8gdGhpcyBsb29wLCB5b3UgbmVlZCB0byBhZGQgdG8gdGhlIHNpbWlsYXIgbG9vcAogICAgLy8gYmVsb3cuCgogICAgZm9yIChpdGVyID0gYXJndiArIDE7IGl0ZXIgIT0gZW5kOyBpdGVyKyspIHsKICAgICAgICAvLyBDaGVjayBmb3IgZnJvbSBjaGFyc2V0CiAgICAgICAgaWYgKHN0cmNtcCgiLWYiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWZyb20tY29kZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkKICAgICAgICAgICAgICAgIGZyb21jcGFnZSA9ICppdGVyOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi10IiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS10by1jb2RlIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKQogICAgICAgICAgICAgICAgdG9jcGFnZSA9ICppdGVyOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi14IiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpCiAgICAgICAgICAgICAgICB0cmFuc2xpdCA9ICppdGVyOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWZhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGZhbGxiYWNrID0gMTsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tbm8tZmFsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgZmFsbGJhY2sgPSAwOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItYiIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tYmxvY2stc2l6ZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkgewogICAgICAgICAgICAgICAgYnVmc3ogPSBhdG9pKCppdGVyKTsKICAgICAgICAgICAgICAgIGlmICgoaW50KSBidWZzeiA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIoKml0ZXIpOwogICAgICAgICAgICAgICAgICAgIGluaXRNc2cocG5hbWUpOwogICAgICAgICAgICAgICAgICAgIHVfd21zZyhzdGRlcnIsICJiYWRCbG9ja1NpemUiLCBzdHIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi1sIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1saXN0IiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGlmIChwcmludFRyYW5zbGl0cykgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50Q29udnMgPSAxOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItLWRlZmF1bHQtY29kZSIsICppdGVyKSA9PSAwKSB7CiAgICAgICAgICAgIGlmIChwcmludFRyYW5zbGl0cykgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50TmFtZSA9IHVjbnZfZ2V0RGVmYXVsdE5hbWUoKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1saXN0LWNvZGUiLCAqaXRlcikgPT0gMCkgewogICAgICAgICAgICBpZiAocHJpbnRUcmFuc2xpdHMpIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpIHsKICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgZSA9IFVfWkVST19FUlJPUjsKICAgICAgICAgICAgICAgIHByaW50TmFtZSA9IHVjbnZfZ2V0QWxpYXMoKml0ZXIsIDAsICZlKTsKICAgICAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZSkgfHwgIXByaW50TmFtZSkgewogICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKCppdGVyKTsKICAgICAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAibm9TdWNoQ29kZXNldCIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItLWNhbm9uIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgcHJpbnRDYW5vbiA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi1MIiwgKml0ZXIpID09IDAKICAgICAgICAgICAgfHwgIXN0cmNtcCgiLS1saXN0LXRyYW5zbGl0ZXJhdG9ycyIsICppdGVyKSkgewogICAgICAgICAgICBpZiAocHJpbnRDb252cykgewogICAgICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50VHJhbnNsaXRzID0gMTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLWgiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItPyIsICppdGVyKQogICAgICAgICAgICB8fCAhc3RyY21wKCItLWhlbHAiLCAqaXRlcikpIHsKICAgICAgICAgICAgdXNhZ2UocG5hbWUsIDApOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLWMiLCAqaXRlcikpIHsKICAgICAgICAgICAgZnJvbXVjYWxsYmFjayA9IFVDTlZfRlJPTV9VX0NBTExCQUNLX1NLSVA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLXRvLWNhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY2FsbGJhY2tfZW50ICpjYmUgPSBmaW5kQ2FsbGJhY2soKml0ZXIpOwogICAgICAgICAgICAgICAgaWYgKGNiZSkgewogICAgICAgICAgICAgICAgICAgIGZyb211Y2FsbGJhY2sgPSBjYmUtPmZyb211OwogICAgICAgICAgICAgICAgICAgIGZyb211Y3R4dCA9IGNiZS0+ZnJvbXVjdHh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cigqaXRlcik7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInVua25vd25DYWxsYmFjayIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tZnJvbS1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgIGlmIChpdGVyICE9IGVuZCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNhbGxiYWNrX2VudCAqY2JlID0gZmluZENhbGxiYWNrKCppdGVyKTsKICAgICAgICAgICAgICAgIGlmIChjYmUpIHsKICAgICAgICAgICAgICAgICAgICB0b3VjYWxsYmFjayA9IGNiZS0+dG91OwogICAgICAgICAgICAgICAgICAgIHRvdWN0eHQgPSBjYmUtPnRvdWN0eHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgc3RyKCppdGVyKTsKICAgICAgICAgICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgICAgICAgICB1X3dtc2coc3RkZXJyLCAidW5rbm93bkNhbGxiYWNrIiwgc3RyLmdldEJ1ZmZlcigpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKHBuYW1lLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLWkiLCAqaXRlcikpIHsKICAgICAgICAgICAgdG91Y2FsbGJhY2sgPSBVQ05WX1RPX1VfQ0FMTEJBQ0tfU0tJUDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tY2FsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgaXRlcisrOwogICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBjYWxsYmFja19lbnQgKmNiZSA9IGZpbmRDYWxsYmFjaygqaXRlcik7CiAgICAgICAgICAgICAgICBpZiAoY2JlKSB7CiAgICAgICAgICAgICAgICAgICAgZnJvbXVjYWxsYmFjayA9IGNiZS0+ZnJvbXU7CiAgICAgICAgICAgICAgICAgICAgZnJvbXVjdHh0ID0gY2JlLT5mcm9tdWN0eHQ7CiAgICAgICAgICAgICAgICAgICAgdG91Y2FsbGJhY2sgPSBjYmUtPnRvdTsKICAgICAgICAgICAgICAgICAgICB0b3VjdHh0ID0gY2JlLT50b3VjdHh0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHN0cigqaXRlcik7CiAgICAgICAgICAgICAgICAgICAgaW5pdE1zZyhwbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgInVua25vd25DYWxsYmFjayIsIHN0ci5nZXRCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1zIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tc2lsZW50IiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHZlcmJvc2UgPSAwOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLXYiLCAqaXRlcikgfHwgIXN0cmNtcCgiLS12ZXJib3NlIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHZlcmJvc2UgPSAxOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLVYiLCAqaXRlcikgfHwgIXN0cmNtcCgiLS12ZXJzaW9uIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIHByaW50ZigiJXMgdjIuMFxuIiwgcG5hbWUpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1vIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tb3V0cHV0IiwgKml0ZXIpKSB7CiAgICAgICAgICAgICsraXRlcjsKICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kICYmICFvdXRmaWxlc3RyKSB7CiAgICAgICAgICAgICAgICBvdXRmaWxlc3RyID0gKml0ZXI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCoqaXRlciA9PSAnLScgJiYgKCppdGVyKVsxXSkgewogICAgICAgICAgICB1c2FnZShwbmFtZSwgMSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChwcmludENvbnZzIHx8IHByaW50TmFtZSkgewogICAgICAgIHJldHVybiBwcmludENvbnZlcnRlcnMocG5hbWUsIHByaW50TmFtZSwgcHJpbnRDYW5vbikgPyAyIDogMDsKICAgIH0gZWxzZSBpZiAocHJpbnRUcmFuc2xpdHMpIHsKICAgICAgICByZXR1cm4gcHJpbnRUcmFuc2xpdGVyYXRvcnMocHJpbnRDYW5vbikgPyAzIDogMDsKICAgIH0KCiAgICBpZiAoIWZyb21jcGFnZSB8fCAhdXBydl9zdHJjbXAoZnJvbWNwYWdlLCAiLSIpKSB7CiAgICAgICAgZnJvbWNwYWdlID0gdWNudl9nZXREZWZhdWx0TmFtZSgpOwogICAgfQogICAgaWYgKCF0b2NwYWdlIHx8ICF1cHJ2X3N0cmNtcCh0b2NwYWdlLCAiLSIpKSB7CiAgICAgICAgdG9jcGFnZSA9IHVjbnZfZ2V0RGVmYXVsdE5hbWUoKTsKICAgIH0KCiAgICAvLyBPcGVuIHRoZSBjb3JyZWN0IG91dHB1dCBmaWxlIG9yIGNvbm5lY3QgdG8gc3Rkb3V0IGZvciByZWFkaW5nIGlucHV0CiAgICBpZiAob3V0ZmlsZXN0ciAhPSAwICYmIHN0cmNtcChvdXRmaWxlc3RyLCAiLSIpKSB7CiAgICAgICAgb3V0ZmlsZSA9IGZvcGVuKG91dGZpbGVzdHIsICJ3YiIpOwogICAgICAgIGlmIChvdXRmaWxlID09IDApIHsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIxKG91dGZpbGVzdHIsICIiKTsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBzdHIyKHN0cmVycm9yKGVycm5vKSwgIiIpOwogICAgICAgICAgICBpbml0TXNnKHBuYW1lKTsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRDcmVhdGVPdXRwdXRGIiwKICAgICAgICAgICAgICAgIHN0cjEuZ2V0QnVmZmVyKCksIHN0cjIuZ2V0QnVmZmVyKCkpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIG91dGZpbGVzdHIgPSAiLSI7CiAgICAgICAgb3V0ZmlsZSA9IHN0ZG91dDsKI2lmZGVmIFdJTjMyCiAgICAgICAgaWYgKHNldG1vZGUoZmlsZW5vKG91dGZpbGUpLCBPX0JJTkFSWSkgPT0gLTEpIHsKICAgICAgICAgICAgdV93bXNnKHN0ZGVyciwgImNhbnRTZXRPdXRCaW5Nb2RlIik7CiAgICAgICAgICAgIGV4aXQoLTEpOwogICAgICAgIH0KI2VuZGlmCiAgICB9CgogICAgLyogTG9vcCBhZ2FpbiBvbiB0aGUgYXJndW1lbnRzIHRvIGZpbmQgYWxsIHRoZSBpbnB1dCBmaWxlcywgYW5kCiAgICBjb252ZXJ0IHRoZW0uIFhYWCBDaGVhcCBhbmQgc2xvcHB5LiAqLwoKICAgIGZvciAoaXRlciA9IGFyZ3YgKyAxOyBpdGVyICE9IGVuZDsgaXRlcisrKSB7CiAgICAgICAgaWYgKHN0cmNtcCgiLWYiLCAqaXRlcikgPT0gMCB8fCAhc3RyY21wKCItLWZyb20tY29kZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi10IiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS10by1jb2RlIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLXgiLCAqaXRlcikgPT0gMCkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWZhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tbm8tZmFsbGJhY2siLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItYiIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0tYmxvY2stc2l6ZSIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi1sIiwgKml0ZXIpID09IDAgfHwgIXN0cmNtcCgiLS1saXN0IiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiLS1kZWZhdWx0LWNvZGUiLCAqaXRlcikgPT0gMCkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoIi0tbGlzdC1jb2RlIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItLWNhbm9uIiwgKml0ZXIpID09IDApIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItTCIsICppdGVyKSA9PSAwCiAgICAgICAgICAgIHx8ICFzdHJjbXAoIi0tbGlzdC10cmFuc2xpdGVyYXRvcnMiLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKCItaCIsICppdGVyKSA9PSAwIHx8ICFzdHJjbXAoIi0/IiwgKml0ZXIpCiAgICAgICAgICAgIHx8ICFzdHJjbXAoIi0taGVscCIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItYyIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLXRvLWNhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi0tZnJvbS1jYWxsYmFjayIsICppdGVyKSkgewogICAgICAgICAgICBpdGVyKys7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItaSIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItLWNhbGxiYWNrIiwgKml0ZXIpKSB7CiAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi1zIiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tc2lsZW50IiwgKml0ZXIpKSB7CiAgICAgICAgICAgIDsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIi12IiwgKml0ZXIpIHx8ICFzdHJjbXAoIi0tdmVyYm9zZSIsICppdGVyKSkgewogICAgICAgICAgICA7CiAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCItViIsICppdGVyKSB8fCAhc3RyY21wKCItLXZlcnNpb24iLCAqaXRlcikpIHsKICAgICAgICAgICAgOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLW8iLCAqaXRlcikgfHwgIXN0cmNtcCgiLS1vdXRwdXQiLCAqaXRlcikpIHsKICAgICAgICAgICAgKytpdGVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlZW5mID0gMTsKICAgICAgICAgICAgaWYgKCFjb252ZXJ0RmlsZQogICAgICAgICAgICAgICAgKHBuYW1lLCBmcm9tY3BhZ2UsIHRvdWNhbGxiYWNrLCB0b3VjdHh0LCB0b2NwYWdlLAogICAgICAgICAgICAgICAgZnJvbXVjYWxsYmFjaywgZnJvbXVjdHh0LCBmYWxsYmFjaywgYnVmc3osIHRyYW5zbGl0LCAqaXRlciwKICAgICAgICAgICAgICAgIG91dGZpbGUsIHZlcmJvc2UpKSB7CiAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCFzZWVuZikgewogICAgICAgIGlmICghY29udmVydEZpbGUKICAgICAgICAgICAgKHBuYW1lLCBmcm9tY3BhZ2UsIHRvdWNhbGxiYWNrLCB0b3VjdHh0LCB0b2NwYWdlLAogICAgICAgICAgICBmcm9tdWNhbGxiYWNrLCBmcm9tdWN0eHQsIGZhbGxiYWNrLCBidWZzeiwgdHJhbnNsaXQsIDAsIG91dGZpbGUsCiAgICAgICAgICAgIHZlcmJvc2UpKSB7CiAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKICAgICAgICB9CiAgICB9CgogICAgZ290byBub3JtYWxfZXhpdDsKZXJyb3JfZXhpdDoKICAgIHJldCA9IDE7Cm5vcm1hbF9leGl0OgoKICAgIGlmIChvdXRmaWxlICE9IHN0ZG91dCkKICAgICAgICBmY2xvc2Uob3V0ZmlsZSk7CgogICAgcmV0dXJuIHJldDsKfQoKCi8qCiAqIEhleSwgRW1hY3MsIHBsZWFzZSBzZXQgdGhlIGZvbGxvd2luZzoKICoKICogTG9jYWwgVmFyaWFibGVzOgogKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKICogRW5kOgogKgogKi8K