LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovL8Cp1blhdMP8we65pL7fvK+jrNPD09rJ+rPJus294s72wKnVuWF0w/zB7g0KLy+2r9f3x+vH86O6YXQreHg9eXksenpcclxuDQovL7Lp0a/H68fzOiBhdCt4eD8gXHJcbg0KLy/W97avyc+xqDogXHJcbit4eDp5eSx6elxyXG4NCi8vveG5+8Lro7pcclxub2s6MlxyXG4NCi8vICAgICAgICBcclxuZXJyb3I6d3dcclxuDQovL7G416Kjusbk1tCjrHh4zqpBVMP8we7D+6O7eXnOqrLOyv0xtcTWtaOsenrOqrLOyv0ytcTWtaO7d3fOqr7fzOW1xLTtzvPC69a1o6zI57n7w7vT0LTtzvPC66OsxKzIz86qMC4NCi8vICAgDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgImF0X3V0aWxzLmgiDQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlICJ6eGljX2Vycm5vLmgiDQojaW5jbHVkZSAiYXRfbXNnLmgiDQojaW5jbHVkZSAic29mdGFwX2xvZy5oIg0KI2luY2x1ZGUgPGN0eXBlLmg+DQojaW5jbHVkZSA8c3lzL3RpbWUuaD4NCiNpbmNsdWRlIDx0ZXJtaW9zLmg+DQoNCiNkZWZpbmUgRElGRl9WQUxVRSAoJ2EnLSdBJykNCiNkZWZpbmUgQVRfUEFSQU1fTUFYX05VTSAgKDUwKQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8NCi8vyfqzyWF0tq/X98frx/PD/MHuLNK7sOPU2mFwcF9jbHRfb3BzX3TW0LX308OjrLj5vt3P+8+ixNrI3aOsyfqzydfu1tW1xGF0x+vH88P8we4NCi8vyfqzyWF0x+vH88P8we7KsaOssdjQ682ouf1tYWxsb2PJ6sfryrnTw7XExNq05qOssqK3tbvYuMPWuNXruPjN4rLjtffTw7qvyv3KudPDo6wNCi8v1+7W1dPJzeKy47X308O6r8r9ys23xbjDxNq05g0KLy9pbnB1dDogIGNtZCAgInh4Ig0KLy8gICAgICAgICAgIHBhcmFtICAgICJ5eSx6eiINCi8vb3V0cHV0OiAgIGF0K3h4PXl5LHp6XHJcbg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KY2hhciogYXRfYWN0X2J1aWxkKGNoYXIqIGNtZCwgY2hhciogcGFyYW0pDQp7DQogICAgY2hhciAqIGF0X3N0cjsNCglpZihwYXJhbSkNCgl7DQogICAgCWF0X3N0ciA9IG1hbGxvYygzMiArIHN0cmxlbihjbWQpICsgc3RybGVuKHBhcmFtKSk7DQoJfQ0KCWVsc2UNCgl7DQogICAgCWF0X3N0ciA9IG1hbGxvYygzMiArIHN0cmxlbihjbWQpKTsNCgl9DQoJYXNzZXJ0KGF0X3N0cik7DQogICAgLy9pZighYXRfc3RyKQ0KICAgICAgICAvL3JldHVybiBOVUxMOw0KICAgIGlmKHBhcmFtKQ0KICAgICAgICBzcHJpbnRmKGF0X3N0ciwiYXQrJXM9JXNcclxuIixjbWQscGFyYW0pOw0KICAgIGVsc2UNCiAgICAgICAgc3ByaW50ZihhdF9zdHIsImF0KyVzXHJcbiIsY21kKTsNCiAgICByZXR1cm4gYXRfc3RyOyAgICANCg0KfQ0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovL8n6s8lhdLLp0a/H68fzw/zB7qOs0ruw49TaYXBwX2NsdF9vcHNfdNbQtffTw6OsuPm+3c/7z6LE2sjdo6zJ+rPJ1+7W1bXEYXTH68fzw/zB7g0KLy/J+rPJYXSy6dGvw/zB7sqxo6zNqLn9bWFsbG9jyerH68q508O1xMTatOajrLKit7W72LjD1rjV67j4zeKy47X308O6r8r9yrnTw6OsDQovL9fu1tXTyc3isuO199PDuq/K/crNt8W4w8TatOYNCi8vaW5wdXQ6ICBjbWQgICJ4eCIgICAgICAgICANCi8vb3V0cHV0OiAgIGF0K3h4PyBcclxuDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KY2hhciogYXRfcXVlcnlfYnVpbGQoY2hhciogY21kKQ0Kew0KICAgIGNoYXIgKiBhdF9zdHI7DQogICAgDQogICAgYXRfc3RyID0gbWFsbG9jKDMyICsgc3RybGVuKGNtZCkpOyAvL9PJYXRfY3RsuLrU8MrNt8UNCglhc3NlcnQoYXRfc3RyKTsNCiAgICAvL2lmKCFhdF9zdHIpDQogICAgICAgIC8vcmV0dXJuIE5VTEw7DQogICAgc3ByaW50ZihhdF9zdHIsImF0KyVzP1xyXG4iLGNtZCk7DQogICAgDQogICAgcmV0dXJuIGF0X3N0cjsgICAgDQoNCn0NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy/J+rPJYXSy6dGvx+vH88P8we61xM/s06bD/MHuo6y1sdPQ1tC85L3hufvJz7GoyrGjrNTac2VyX29wc190MrXEcnNwX2FjdLX308OjrA0KLy+4w7qvyv3W0L2r1tC85MnPsai94bn7us1va2F0w/zB7tfp17DU2tK7xvCjrM2ouf1tYWxsb2PJ6sfryrnTw7XExNq05qOssqK3tbvYDQovL7jD1rjV67j4zeKy47X308O6r8r9yrnTw6Os1+7W1dPJzeKy47X308O6r8r9ys23xbjDxNq05g0KLy9pbnB1dDogIGNtZCAgInh4IiAgIA0KLy8gICAgICAgICAgIHBhcmFtICAgICJ5eSx6eiIgDQovL291dHB1dDogICBcclxuK3h4Onl5LHp6XHJcbg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmNoYXIqIGF0X3F1ZXJ5X3Jlc3VsdF9idWlsZChjaGFyKiBjbWQsIGNoYXIqIHBhcmFtKQ0Kew0KICAgIGNoYXIgKiBhdF9zdHI7DQoNCglpZihwYXJhbSkNCgl7DQogICAgCWF0X3N0ciA9IG1hbGxvYygzMiArIHN0cmxlbihjbWQpICsgc3RybGVuKHBhcmFtKSk7DQoJfQ0KCWVsc2UNCgl7DQogICAgCWF0X3N0ciA9IG1hbGxvYygzMiArIHN0cmxlbihjbWQpKTsNCgl9DQoJYXNzZXJ0KGF0X3N0cik7DQogICAgLy9pZighYXRfc3RyKQ0KICAgICAgICAvL3JldHVybiBOVUxMOw0KICAgIGlmKCFwYXJhbSkNCiAgICAgICAgc3ByaW50ZihhdF9zdHIsIlxyXG4rJXNcclxuXHJcbk9LXHJcbiIsY21kKTsNCiAgICBlbHNlDQogICAgICAgIHNwcmludGYoYXRfc3RyLCJcclxuKyVzOiAlc1xyXG5cclxuT0tcclxuIixjbWQscGFyYW0pOw0KDQogICAgcmV0dXJuIGF0X3N0cjsgICAgDQoNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vyfqzyWF0tcRva8/s06bD/MHuo6y4+b7dss7K/dDFz6LJ+rPJsrvNrLXEb2vP7NOmw/zB7g0KLy/NqLn9bWFsbG9jyerH68q508O1xMTatOajrLKit7W72LjD1rjV67j4zeKy47X308O6r8r9yrnTw6Os1+7W1dPJzeKy47X308O6r8r9ys23xbjDxNq05g0KLy9pbnB1dDogIHBhcmFtICAieHgiICANCg0KLy9vdXRwdXQ6ICAgXHJcbm9rOnh4DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoNCmNoYXIqIGF0X29rX2J1aWxkKCkNCnsNCiAgICBjaGFyICogYXRfc3RyOw0KICAgIA0KICAgIGF0X3N0ciA9IG1hbGxvYygzMik7IC8v08lhdF9jdGy4utTwys23xQ0KCWFzc2VydChhdF9zdHIpOw0KCQ0KCXNwcmludGYoYXRfc3RyLCJcclxuT0tcclxuIik7DQoNCiAgICAgICAgDQogICAgcmV0dXJuIGF0X3N0cjsgICAgDQoNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vyfqzyWF0tcRlcnLP7NOmw/zB7qOsuPm+3bLOyv3Qxc+iyfqzybK7zay1xGVycs/s06bD/MHuDQovL82ouf1tYWxsb2PJ6sfryrnTw7XExNq05qOssqK3tbvYuMPWuNXruPjN4rLjtffTw7qvyv3KudPDo6zX7tbV08nN4rLjtffTw7qvyv3KzbfFuMPE2rTmDQovL2lucHV0OiAgcGFyYW0gIHh4ICANCi8vb3V0cHV0OiAgIFxyXG5lcnI6eHgNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCg0KY2hhciogYXRfZXJyX2J1aWxkKGludCBwYXJhbSkNCnsNCiAgICBjaGFyICphdF9zdHIgPSBOVUxMOw0KCQ0KICAgIGF0X3N0ciA9IG1hbGxvYygzMik7DQoJDQoJYXNzZXJ0KGF0X3N0cik7DQogICAgaWYocGFyYW0gPT0gMCkNCiAgICAgICAgc3ByaW50ZihhdF9zdHIsIlxyXG5FUlJPUlxyXG4iKTsNCiAgICBlbHNlDQogICAgICAgIHNwcmludGYoYXRfc3RyLCJcclxuK0NNRSBFUlJPUjogJWRcclxuIixwYXJhbSk7DQogICAgICAgIA0KICAgIHJldHVybiBhdF9zdHI7ICAgIA0KDQp9DQoNCnN0YXRpYyBpbnQgaXNfZGlnaXRfc3RyKGNvbnN0IGNoYXIgKnN0cikNCnsNCgl1bnNpZ25lZCBpbnQgZGlnaXRfbGVuID0gMDsNCgl3aGlsZSgqc3RyID09ICcgJyl7DQoJCXN0cisrOw0KCX0NCglpZigqc3RyID09ICctJyB8fCAqc3RyID09ICcrJyl7DQoJCXN0cisrOw0KCX0NCgl3aGlsZShpc2RpZ2l0KCpzdHIpKXsNCgkJc3RyKys7DQoJCWRpZ2l0X2xlbisrOw0KCX0NCgl3aGlsZSgqc3RyID09ICcgJyl7DQoJCXN0cisrOw0KCX0NCglyZXR1cm4gKnN0ciA9PSAnXDAnICYmIGRpZ2l0X2xlbiA+IDA7DQp9DQoNCg0KLyq4w7qvyv3Tw9PasLTV1bj4tqi1xLjxyr294s72ss7K/aOsuPHKvb321qez1iVkus0lcyzNrMqxv8nS1NTaw7+49rjxyr3HsLzTyc/K/dfW0tTWuLaoDQqx5MG/v8nS1Liz1rW1xL/VvOS089Cho6y1pc67zqrX1r3ao6zA/cjnJTJkse3Kvr3Tyty05rSiv9W85M6qMtfWvdqjuyU1c7Htyr7L48nPJ1wwJ6Os1+624L/J0tQNCr3Tytw1uPbX1rf7oaO1sSVksrvWuLaoyv3X1sqxo6ywtNXVNNfWvdq9+NDQuLPWtaOsJXPU8rC01dXKtbzKveLO9rXE19a3+7Sus6S2yM3qyKu4s9a1o6zT0L/JxNwNCrvh09DUvb3noaO0y83i08O7p8q508PKsaOsyPSyu8/r08m4w73Tv9rE2rK/vfjQ0LLOyv21xLjxyr27r73izvajrL/J0tS9q2ZtdLiz1rXOqiIlcyKjrA0KcHZhbLiz1rXOqmNoYXIgKipwy6vWuNXro6zV4tH5ss7K/b2r1/fOqtX7zOXX1rf7tK63tbvYuPi199PD1d8qLw0KaW50IHBhcnNlX3BhcmFtMihjaGFyICpmbXQsIGNoYXIgKmJ1Ziwgdm9pZCAqKnB2YWwpDQp7DQoJY2hhciAqcDsNCgljaGFyICpzZXBwOyANCgljaGFyICp0bXA7DQoJY2hhciBzZXBjOw0KCWNoYXIgKnBzdHJbQVRfUEFSQU1fTUFYX05VTV0gPSB7IDAgfTsNCglpbnQgIGxlbiwgZmxhZzsNCglpbnQgIG4JPSAwOw0KCWludCAgbnBhcmFtID0gMDsNCglpZiAoYnVmID09IE5VTEwpIHsNCgkJcHJpbnRmKCJidWYgTlVMTFxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoJDQoJbGVuID0gc3RybGVuKGJ1ZikgKyAxOw0KCXRtcCA9IHAgPSAoY2hhciopbWFsbG9jKGxlbik7DQoJaWYgKHAgPT0gTlVMTCkgew0KCQkvL2Fzc2VydCgwKTsNCgkJcHJpbnRmKCJmYWlsIHRvIG1hbGxvY1xuIik7DQoJCXJldHVybiAtMTsNCgl9DQoJbWVtc2V0KHAsIDAsIGxlbik7DQoJbWVtY3B5KHAsIGJ1Ziwgc3RybGVuKGJ1ZikpOw0KCS8qIHJlbW92ZSBcciBvciBcbiBhdCB0aCBlbmQgKi8NCglmb3IobGVuLS07IGxlbiA+IDA7IGxlbi0tKXsNCgkJaWYocFtsZW4gLSAxXSA9PSAnXHInIHx8IHBbbGVuIC0gMV0gPT0gJ1xuJyl7DQoJCQlwW2xlbiAtIDFdID0gJ1wwJzsNCgkJfSBlbHNlIHsNCgkJCWJyZWFrOw0KCQl9DQoJfQ0KCS8qIGRpdmlzZSB0aGUgYXQtc3RyaW5nIHRvIHNvbWUgc3RyaW5nIHBhcmFtICovDQoJZG8gew0KCQlmbGFnID0gMDsNCgkJaWYgKCpwID09ICciJykgew0KCQkJaW50IGksIGo7DQoJCQlmb3IgKGkgPSBqID0gMCwgKytwOyBwW2pdICE9ICdcMCc7IGkrKywgaisrKSB7DQoJCQkJaWYgKHBbal0gPT0gJyInKSB7DQoJCQkJCSsrajsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoaiA9PSAxKSBmbGFnID0gMTsNCgkJCXBbaiAtIDFdID0gJ1wwJzsNCgkJCXNlcHAgPSBwICsgajsNCgkJfSBlbHNlIHsNCgkJCXNlcHAgPSBwICsgc3RyY3NwbihwLCAiLCIpOw0KCQkJaWYgKHAgPT0gc2VwcCkgZmxhZyA9IDE7DQoJCX0NCg0KCQlucGFyYW0rKzsNCgkJc2VwYyA9IHNlcHBbMF07DQoJCXNlcHBbMF0gPSAnXDAnOw0KDQoJCWlmIChmbGFnID09IDEpDQoJCQlwc3RyW24rK10gPSBOVUxMOw0KCQllbHNlDQoJCQlwc3RyW24rK10gPSBwOw0KCQlwID0gc2VwcCArIDE7DQoJfSB3aGlsZSAoKG4gPCBBVF9QQVJBTV9NQVhfTlVNKSAmJiAoc2VwYyA9PSAnLCcpKTsNCg0KCS8qIGNvbnZlcnQgdGhlIHN0cmluZyBwYXJhbXMgdG8gdGhlIHR5cGVzIHRoYXQgZm10IEFwcG9pbnRlZCAqLw0KCWludCBwYXJhbV9jb3VudCA9IDA7IC8qIGNvdW50IHRoZSBwYXJhbSB0aGF0IGJlaW5nIGdldCAqLw0KCWludCBwYXJhbV9zdHJfaW5kZXggPSAwOyAvKiB0aGUgaW5kZXggb2Ygc3RyaW5nIHBhcmFtcyAqLw0KCWludCBwYXJhbV92YWxfaW5kZXggPSAwOyAvKiB0aGUgaW5kZXggb2YgcGFyYW0gdmFsdWVzICAqLw0KCWZvciAoOyBmbXQgIT0gIE5VTEwgJiYgcGFyYW1fc3RyX2luZGV4IDwgbnBhcmFtOyBwYXJhbV9zdHJfaW5kZXgrKykgew0KCQljaGFyIHR5cGU7DQoJCWludCAgc2l6ZTsNCgkJY2hhciBzdHJfcGFyYW1fc2l6ZVs2XSA9IHsgMCB9Ow0KCQlpbnQgIHBhcmFtX3NpemVfaW5kZXggID0gMDsNCg0KCQl3aGlsZSgqZm10ID09ICcgJykgZm10Kys7DQoJCWlmKCpmbXQgPT0gJywnKXsNCgkJCWZtdCsrOw0KCQkJY29udGludWU7ICAvKiBpZ21vcmUgdGhlIHBhcmFtIHRoYXQgaXMgd2l0aG91dCB0eXBlICovDQoJCX0NCgkJaWYoKmZtdCsrICE9ICclJyl7DQoJCQkgYnJlYWs7DQoJCX0NCgkJZm9yICg7IHBhcmFtX3NpemVfaW5kZXggPCBzaXplb2Yoc3RyX3BhcmFtX3NpemUpIC0gMTsgZm10KyssIHBhcmFtX3NpemVfaW5kZXgrKyl7DQoJCQlpZighaXNkaWdpdCgqZm10KSl7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlzdHJfcGFyYW1fc2l6ZVtwYXJhbV9zaXplX2luZGV4XSA9ICpmbXQ7DQoJCX0NCgkJdHlwZSA9ICooZm10KyspOw0KCQljaGFyICpzdG9wOw0KCQllcnJubyA9IDA7DQoJCXNpemUgPSAoaW50KXN0cnRvbChzdHJfcGFyYW1fc2l6ZSwgJnN0b3AsIDEwKTsNCgkJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRA0KCQl7DQoJCQlwcmludGYoInN0cnRvbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KCQl9DQoJCS8vc2l6ZSA9IGF0b2koc3RyX3BhcmFtX3NpemUpOw0KCQlpZihzaXplIDwgMCkNCgkJCWJyZWFrOw0KCQl3aGlsZSgqZm10ID09ICcgJykgZm10Kys7IC8qIGlnbW9yZSB0aGUgYmxhbmtzICovDQoJCWZtdCA9ICgqZm10ID09ICcsJyA/IGZtdCArIDEgOiBOVUxMKTsNCg0KCQlpZiAodHlwZSA9PSAnZCcpIHsNCgkJCWlmKHNpemUgPT0gMCB8fCBzaXplID09IDQpIHsNCgkJCQlpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KCQkJCQlpZighaXNfZGlnaXRfc3RyKHBzdHJbcGFyYW1fc3RyX2luZGV4XSkpew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJKigoaW50ICopcHZhbFtwYXJhbV92YWxfaW5kZXhdKSA9IChpbnQpYXRvaShwc3RyW3BhcmFtX3N0cl9pbmRleF0pOw0KCQkJCQlwYXJhbV9jb3VudCsrOw0KCQkJCX0NCgkJCX0gZWxzZSBpZihzaXplID09IDEpIHsNCgkJCQlpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KCQkJCQlpZighaXNfZGlnaXRfc3RyKHBzdHJbcGFyYW1fc3RyX2luZGV4XSkpew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJKigoY2hhciAqKXB2YWxbcGFyYW1fdmFsX2luZGV4XSkgPSAoY2hhcilhdG9pKHBzdHJbcGFyYW1fc3RyX2luZGV4XSk7DQoJCQkJCXBhcmFtX2NvdW50Kys7DQoJCQkJfQ0KCQkJfSBlbHNlIGlmKHNpemUgPT0gMikgew0KCQkJCWlmKHBzdHJbcGFyYW1fc3RyX2luZGV4XSAhPSBOVUxMKSB7DQoJCQkJCWlmKCFpc19kaWdpdF9zdHIocHN0cltwYXJhbV9zdHJfaW5kZXhdKSl7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCQkqKChzaG9ydCAqKXB2YWxbcGFyYW1fdmFsX2luZGV4XSkgPSAoc2hvcnQpYXRvaShwc3RyW3BhcmFtX3N0cl9pbmRleF0pOyANCgkJCQkJcGFyYW1fY291bnQrKzsNCgkJCQl9DQoJCQl9ZWxzZSB7DQoJCQkJYnJlYWs7DQoJCQl9IA0KCQl9IGVsc2UgaWYgKHR5cGUgPT0gJ3MnKSB7DQoJCQlpZiAoc2l6ZSA9PSAwKSB7DQoJCQkJaWYocHN0cltwYXJhbV9zdHJfaW5kZXhdICE9IE5VTEwpIHsNCgkJCQkJc3RyY3B5KChjaGFyICopcHZhbFtwYXJhbV92YWxfaW5kZXhdLCBwc3RyW3BhcmFtX3N0cl9pbmRleF0pOw0KCQkJCQlwYXJhbV9jb3VudCsrOw0KCQkJCX0NCgkJCX0gZWxzZSBpZiAoc2l6ZSA8IDB4ZmZmZikgey8va2xvY3dvcmsNCgkJCSAgIGlmKHBzdHJbcGFyYW1fc3RyX2luZGV4XSAhPSBOVUxMKSB7DQoJCQkJCS8vc3RybmNweSgoY2hhciAqKXB2YWxbcGFyYW1fdmFsX2luZGV4XSwgcHN0cltwYXJhbV9zdHJfaW5kZXhdLCBzaXplIC0gMSk7DQoJCQkJCXNucHJpbnRmKChjaGFyICopcHZhbFtwYXJhbV92YWxfaW5kZXhdLHNpemUsIiVzIixwc3RyW3BhcmFtX3N0cl9pbmRleF0pOw0KCQkJCQlwYXJhbV9jb3VudCsrOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlicmVhazsNCgkJfQ0KCQlwYXJhbV92YWxfaW5kZXgrKzsNCgl9DQoJZnJlZSh0bXApOw0KCQkNCglyZXR1cm4gcGFyYW1fY291bnQ7DQp9DQoNCg0Kc3RhdGljIGludCBpc19wcmludF9zdHIoY29uc3QgY2hhciAqc3RyKXsNCiAgICB3aGlsZShpc3ByaW50KCpzdHIpKXsNCiAgICAgICAgc3RyKys7DQogICAgfQ0KICAgIHJldHVybiAqc3RyID09ICdcMCc7DQp9DQoNCnN0YXRpYyBpbnQgZ2V0X2ZtdF9wYXJhbV9jb3VudChjb25zdCBjaGFyICpzdHIpew0KICAgIGludCBmbXRfcGFyYW1fY291bnQgPSAwOw0KICAgIA0KICAgIGZvcig7ICpzdHIgIT0gJ1wwJzsgc3RyKyspew0KICAgICAgICBpZigqc3RyID09ICcsJyl7DQogICAgICAgICAgICBmbXRfcGFyYW1fY291bnQrKzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZm10X3BhcmFtX2NvdW50ICsgMTsNCn0NCg0KLypyZXR1cm4gMLHtyr694s72ss7K/dX9s6OjrMTasr+9+NDQ0c+48bXEss7K/bzssumjrLD8wKiyzsr9uPbK/dK71sLQ1LzssumjrLbU09q/ydGhss7K/aOs0OjSqrX308PV39fU0NC/vMLHKi8NCmludCAgcGFyc2VfcGFyYW1fc2FmZShjaGFyICpmbXQsIGNoYXIgKmJ1Ziwgdm9pZCAqKnB2YWwpDQp7DQoJY2hhciAqcDsNCiAgICBjaGFyICpzZXBwOyANCiAgICBjaGFyICp0bXA7DQoJY2hhciBzZXBjOw0KCWNoYXIgKnBzdHJbQVRfUEFSQU1fTUFYX05VTV0gPSB7MH07DQoJaW50ICBsZW4sIGZsYWc7DQoJaW50ICBuICAgPSAwOw0KCWludCAgbnBhcmFtID0gMDsvL2J1ZtfWt/u0rsq1vMq1xLLOyv249sr9DQoJaW50ICBmbXRfcGFyYW1fbnVtID0gMDsvL2ZtdLjxyr27r9bQ0qrH87XEss7K/dfcuPbK/aOs0+sluPbK/dK71sINCglpbnQgIHJldCAgPSBBVF9QQVJTRV9PSzsNCglpbnQgIG1hcmtfZmxhZyA9IDA7Ly/Tw9PaserKtszYyuK3+7rFtcTF5LbUx+m/9qOsxL/HsNPD09rLq9L9usUNCglpZiAoYnVmID09IE5VTEwpIHsNCgkJcmV0dXJuIEFURVJSX1BST0NfRkFJTEVEOw0KCX0NCiAgICB3aGlsZSgqYnVmID09ICcgJykgYnVmKys7DQoJbGVuID0gc3RybGVuKGJ1ZikgKyAxOw0KCXRtcCA9IHAgPSAoY2hhciopbWFsbG9jKGxlbik7DQoJaWYgKHAgPT0gTlVMTCkgew0KCQlyZXR1cm4gQVRFUlJfTk9fUFJJTlQ7DQoJfQ0KCS8vZm10X3BhcmFtX251bSA9IGZpbmRfY2hhcl9udW0oZm10LCIlIik7DQoJbWVtc2V0KHAsIDAsIGxlbik7DQoJLy/J6sfr0MLE2rTmtOa3xcjrss61xEFUw/zB7qOs0tSx47340NDV+9DOtqjWxg0KCW1lbWNweShwLCBidWYsIHN0cmxlbihidWYpKTsNCiAgICAvKsils/3OsrK/tcRcclxuo6zEv8ewvfbU2jcxMDDJz9PQtMvOysziICovDQogICAgZm9yKGxlbi0tOyBsZW4gPiAwOyBsZW4tLSl7DQogICAgICAgIGlmKHBbbGVuIC0gMV0gPT0gJ1xyJyB8fCBwW2xlbiAtIDFdID09ICdcbicpew0KICAgICAgICAgICAgcFtsZW4gLSAxXSA9ICdcMCc7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZighaXNfcHJpbnRfc3RyKHApKXsvKiDI50FUw/zB7tbQsPy6rLK7v8m8+9fWt/vWsb3Tt7W72LTtzvMgKi8NCiAgICAgICAgZnJlZSh0bXApOw0KCQlyZXR1cm4gQVRFUlJfTk9fUFJJTlQ7DQogICAgfQ0KICAgIC8qsLS2urrFvfjQ0MO/uPayzsr9tcS31rju1fvQzizLq9L9usXA77XEtrq6xcz4uf0qLw0KCWRvIHsNCgkJZmxhZyA9IDA7DQoJCW1hcmtfZmxhZyA9IDA7DQoJCWlmICgqcCA9PSAnIicpIHsNCgkJCWludCBpLCBqOw0KCQkJZm9yIChpID0gaiA9IDAsICsrcDsgcFtqXSAhPSAnXDAnOyBpKyssIGorKykgew0KCQkJCWlmIChwW2pdID09ICciJykgew0KCQkJCQkrK2o7DQoJCQkJCW1hcmtfZmxhZyA9IDE7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJCWlmKG1hcmtfZmxhZyA9PSAwKXsvKiDOtMalxeS1vcur0v26xdaxvdO3tbvYtO3O8yAqLw0KCQkJCWZyZWUodG1wKTsNCgkJCQlyZXR1cm4gQVRFUlJfRFJPUF9NQVJLOw0KCQkJfQ0KCQkJaWYgKGogPT0gMSkgZmxhZyA9IDE7DQoJCQlwW2ogLSAxXSA9ICdcMCc7DQoJCQlzZXBwID0gcCArIGo7DQoJCX0gZWxzZSB7DQoJCQlzZXBwID0gcCArIHN0cmNzcG4ocCwgIiwiKTsNCgkJCWlmIChwID09IHNlcHApIGZsYWcgPSAxOw0KCQl9DQoNCgkJbnBhcmFtKys7DQoJCXNlcGMgPSBzZXBwWzBdOw0KCQlzZXBwWzBdID0gJ1wwJzsNCg0KCQlpZiAoZmxhZyA9PSAxKQ0KCQkJcHN0cltuKytdID0gTlVMTDsNCgkJZWxzZQ0KCQkJcHN0cltuKytdID0gcDsNCgkJcCA9IHNlcHAgKyAxOw0KCX0gd2hpbGUgKChuIDwgQVRfUEFSQU1fTUFYX05VTSkgJiYgKHNlcGMgPT0gJywnKSk7DQoNCiAgICBpZihucGFyYW0gPCBnZXRfZm10X3BhcmFtX2NvdW50KGZtdCkpew0KCQlyZXQgPSBBVFdBUk5fRFJPUF9STjsgICAgDQoJfWVsc2UgaWYobnBhcmFtID4gZ2V0X2ZtdF9wYXJhbV9jb3VudChmbXQpKXsNCgkJcmV0ID0gQVRXQVJOX0xBQ0tfUEFSQU07ICAgIA0KCX0NCiAgICAvKiBjb252ZXJ0IHRoZSBzdHJpbmcgcGFyYW1zIHRvIHRoZSB0eXBlcyB0aGF0IGZtdCBBcHBvaW50ZWQgKi8NCiAgICBpbnQgcGFyYW1fY291bnQgPSAwOyAvKsrkyOu1xNfWt/u0rtbQ09DQp7LOyv249sr9Ki8NCiAgICBpbnQgcGFyYW1fc3RyX2luZGV4ID0gMDsgLyogdGhlIGluZGV4IG9mIHN0cmluZyBwYXJhbXMgKi8NCiAgICBpbnQgcGFyYW1fdmFsX2luZGV4ID0gMDsgLyogdGhlIGluZGV4IG9mIHBhcmFtIHZhbHVlcyAgKi8NCgkvL7C01dXI67LOuPHKvb340NDDv7j2ss7K/da1tcS3tbvYuLPWtQ0KICAgIGZvciAoOyBmbXQgIT0gIE5VTEwgJiYgcGFyYW1fc3RyX2luZGV4IDwgbnBhcmFtOyBwYXJhbV9zdHJfaW5kZXgrKykgew0KICAgICAgICBjaGFyIHR5cGU7DQogICAgICAgIGludCAgc2l6ZTsNCiAgICAgICAgY2hhciBzdHJfcGFyYW1fc2l6ZVsxMF0gPSB7IDAgfTsNCiAgICAgICAgaW50ICBwYXJhbV9zaXplX2luZGV4ICA9IDA7DQoNCiAgICAgICAgd2hpbGUoKmZtdCA9PSAnICcpIGZtdCsrOw0KICAgICAgICBpZigqZm10ID09ICcsJyl7DQogICAgICAgICAgICBmbXQrKzsNCiAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogaWdtb3JlIHRoZSBwYXJhbSB0aGF0IGlzIHdpdGhvdXQgdHlwZSAqLw0KICAgICAgICB9DQogICAgICAgIGlmKCpmbXQrKyAhPSAnJScpew0KICAgICAgICAgICAgIHJldCA9IEFURVJSX05PX1BSSU5UOw0KICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGZvciAoOyBwYXJhbV9zaXplX2luZGV4IDwgc2l6ZW9mKHN0cl9wYXJhbV9zaXplKSAtIDE7IGZtdCsrLCBwYXJhbV9zaXplX2luZGV4Kyspew0KICAgICAgICAgICAgaWYoIWlzZGlnaXQoKmZtdCkpew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc3RyX3BhcmFtX3NpemVbcGFyYW1fc2l6ZV9pbmRleF0gPSAqZm10Ow0KICAgICAgICB9DQogICAgICAgIHR5cGUgPSAqKGZtdCsrKTsNCgkJY2hhciAqc3RvcDsNCgkJZXJybm8gPSAwOw0KCQlzaXplID0gKGludClzdHJ0b2woc3RyX3BhcmFtX3NpemUsICZzdG9wLCAxMCk7DQoJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQNCgkJew0KCQkJcHJpbnRmKCJzdHJ0b2wgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCgkJfQ0KICAgICAgICAvL3NpemUgPSBhdG9pKHN0cl9wYXJhbV9zaXplKTsNCgkJaWYoc2l6ZSA8IDApew0KCQkJcmV0ID0gQVRFUlJfU1RSX1RPT19MT05HOw0KCQkJYnJlYWs7DQoJCX0NCiAgICAgICAgd2hpbGUoKmZtdCA9PSAnICcpIGZtdCsrOyAvKiBpZ21vcmUgdGhlIGJsYW5rcyAqLw0KICAgICAgICBmbXQgPSAoKmZtdCA9PSAnLCcgPyBmbXQgKyAxIDogTlVMTCk7DQoNCiAgICAgICAgaWYgKHR5cGUgPT0gJ2QnKSB7DQogICAgICAgICAgICBpZihzaXplID09IDAgfHwgc2l6ZSA9PSA0KSB7DQogICAgICAgICAgICAgICAgaWYocHN0cltwYXJhbV9zdHJfaW5kZXhdICE9IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAgICAgKigoaW50ICopcHZhbFtwYXJhbV92YWxfaW5kZXhdKSA9IChpbnQpYXRvaShwc3RyW3BhcmFtX3N0cl9pbmRleF0pOw0KICAgICAgICAgICAgICAgICAgICBwYXJhbV9jb3VudCsrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSBpZihzaXplID09IDEpIHsNCiAgICAgICAgICAgICAgICBpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KICAgICAgICAgICAgICAgICAgICAqKChjaGFyICopcHZhbFtwYXJhbV92YWxfaW5kZXhdKSA9IChjaGFyKWF0b2kocHN0cltwYXJhbV9zdHJfaW5kZXhdKTsNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1fY291bnQrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2UgaWYoc2l6ZSA9PSAyKSB7DQogICAgICAgICAgICAgICAgaWYocHN0cltwYXJhbV9zdHJfaW5kZXhdICE9IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAgICAgKigoc2hvcnQgKilwdmFsW3BhcmFtX3ZhbF9pbmRleF0pID0gKHNob3J0KWF0b2kocHN0cltwYXJhbV9zdHJfaW5kZXhdKTsgDQogICAgICAgICAgICAgICAgICAgIHBhcmFtX2NvdW50Kys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2Ugew0KICAgICAgICAgICAgICAgIGFzc2VydCgwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAncycpIHsNCiAgICAgICAgICAgIGlmIChzaXplID09IDApIHsNCiAgICAgICAgICAgICAgICBpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KICAgICAgICAgICAgICAgICAgICBzdHJjcHkoKGNoYXIgKilwdmFsW3BhcmFtX3ZhbF9pbmRleF0sIHBzdHJbcGFyYW1fc3RyX2luZGV4XSk7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtX2NvdW50Kys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgIGlmKHBzdHJbcGFyYW1fc3RyX2luZGV4XSAhPSBOVUxMICYmIHNpemUgPCBzdHJsZW4ocHN0cltwYXJhbV9zdHJfaW5kZXhdKSl7DQoJCQkJICAgIHJldCA9IEFURVJSX1NUUl9UT09fTE9ORzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoJCQkgICB9DQogICAgICAgICAgICAgICBpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KICAgICAgICAgICAgICAgICAgICAvL3N0cm5jcHkoKGNoYXIgKilwdmFsW3BhcmFtX3ZhbF9pbmRleF0sIHBzdHJbcGFyYW1fc3RyX2luZGV4XSwgc2l6ZSAtIDEpOw0KCQkJCQlpZihzaXplIDwgMHhmZmZmKS8va2xvY3dvcmsNCgkJCQkJc25wcmludGYoKGNoYXIgKilwdmFsW3BhcmFtX3ZhbF9pbmRleF0sc2l6ZSwiJXMiLHBzdHJbcGFyYW1fc3RyX2luZGV4XSk7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtX2NvdW50Kys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGFzc2VydCgwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICBwYXJhbV92YWxfaW5kZXgrKzsNCiAgICB9DQogICAgZnJlZSh0bXApOw0KICAgIHJldHVybiByZXQ7DQp9DQovKnJldHVybiAwse3Kvr3izvayzsr91f2zo6Ossru9+NDQss7K/bj2yv21xNPQ0KfQ1LzssumjrL7fzOW3tbvY1rWyzr+0QVRfUEFSU0VfT0u1yLrq1rUqLw0KaW50ICBwYXJzZV9wYXJhbShjaGFyICpmbXQsIGNoYXIgKmJ1Ziwgdm9pZCAqKnB2YWwpDQp7DQogICAgaW50IHJldCA9IHBhcnNlX3BhcmFtX3NhZmUoZm10LGJ1ZixwdmFsKTsNCiAgICBpZihyZXQ9PUFUV0FSTl9MQUNLX1BBUkFNfHxyZXQ9PUFUV0FSTl9EUk9QX1JOKQ0KICAgICAgICByZXR1cm4gIEFUX1BBUlNFX09LOw0KICAgIHJldHVybiByZXQ7DQp9DQovKioNCiAqIEBicmllZiC/ybTy06HX1rf7tK7Xqru7zqrX1r3ayv2+3SCjrMjno7oNCiAgICAgICAgICAgICAgICAiQzgzMjlCRkQwRTAxIiAtLT4gezB4QzgsIDB4MzIsIDB4OUIsIDB4RkQsIDB4MEUsIDB4MDF9DQogKiBAcGFyYW0gcFNyYyDUtNfWt/u0rta41esNCiAqIEBwYXJhbSBwRHN0IMS/serK/b7d1rjV6w0KICogQHBhcmFtIG5TcmNMZW5ndGgg1LTX1rf7tK6zpLbIDQogKiBAcmV0dXJuIMS/serK/b7ds6S2yA0KICogQG5vdGUgICANCiAqIEB3YXJuaW5nIA0KICovDQppbnQgc3RyaW5nMmJ5dGVzKGNvbnN0IGNoYXIqIHBTcmMsIHVuc2lnbmVkIGNoYXIqIHBEc3QsIGludCBuU3JjTGVuZ3RoKQ0Kew0KICAgIGludCBpPTA7DQoNCiAgICAvL9Cj0emyzsr9DQogICAgaWYocFNyYyA9PSAgTlVMTCB8fCBwRHN0ID09IE5VTEwgfHwgblNyY0xlbmd0aCA8IDApDQogICAgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgZm9yKGkgPSAwOyBpIDwgblNyY0xlbmd0aDsgaSArPSAyKQ0KICAgIHsNCiAgICAgICAgLy8gyuSz9rjfNM67DQogICAgICAgIGlmKCpwU3JjID49ICcwJyAmJiAqcFNyYyA8PSAnOScpDQogICAgICAgIHsNCiAgICAgICAgICAgICpwRHN0ID0gKCpwU3JjIC0gJzAnKSA8PCA0Ow0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgKnBEc3QgPSAoKHRvdXBwZXIoKnBTcmMpIC0gJ0EnKSArIDEwKSA8PCA0Ow0KICAgICAgICB9DQoNCiAgICAgICAgcFNyYysrOw0KDQogICAgICAgIC8vIMrks/a1zTTOuw0KICAgICAgICBpZigqcFNyYyA+PSAnMCcgJiYgKnBTcmMgPD0gJzknKQ0KICAgICAgICB7DQogICAgICAgICAgICAqcERzdCB8PSAqcFNyYyAtICcwJzsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgICpwRHN0IHw9ICh0b3VwcGVyKCpwU3JjKSAtICdBJykgKyAxMDsNCiAgICAgICAgfQ0KDQogICAgICAgIHBTcmMrKzsNCiAgICAgICAgcERzdCsrOw0KICAgIH0NCg0KICAgIC8vILe1u9jEv7Hqyv2+3bOktsgNCiAgICByZXR1cm4gblNyY0xlbmd0aCAvIDI7DQp9DQoNCi8qKg0KICogQGJyaWVmINfWvdrK/b7d16q7u86qv8m08tOh19a3+7SuIKOsyOejug0KICAgICAgICAgICAgICAgICAgICAgezB4QzgsIDB4MzIsIDB4OUIsIDB4RkQsIDB4MEUsIDB4MDF9IC0tPiAiQzgzMjlCRkQwRTAxIg0KICogQHBhcmFtIHBTcmMg1LTK/b7d1rjV6w0KICogQHBhcmFtIHBEc3QgxL+x6tfWt/u0rta41esNCiAqIEBwYXJhbSBuU3JjTGVuZ3RoINS0yv2+3bOktsgNCiAqIEByZXR1cm4gxL+x6sr9vt2zpLbIo7sNCiAqIEBub3RlICAgDQogKiBAd2FybmluZyANCiAqLw0KaW50IGJ5dGVzMnN0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyKiBwU3JjLCBjaGFyKiBwRHN0LCBpbnQgblNyY0xlbmd0aCkNCnsNCiAgICBjb25zdCBjaGFyIHRhYltdPSIwMTIzNDU2Nzg5QUJDREVGIjsJLy8gMHgwLTB4ZrXE19a3+7Lp1dKx7Q0KICAgIGludCBpID0gMDsNCg0KICAgIC8v0KPR6bLOyv0NCiAgICBpZihwU3JjID09ICBOVUxMIHx8IHBEc3QgPT0gTlVMTCB8fCBuU3JjTGVuZ3RoIDwgMCkNCiAgICB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBmb3IoaT0wOyBpPG5TcmNMZW5ndGg7IGkrKykNCiAgICB7DQogICAgICAgICpwRHN0KysgPSB0YWJbKnBTcmMgPj4gNF07CQkvLyDK5LP2tc00zrsNCiAgICAgICAgKnBEc3QrKyA9IHRhYlsqcFNyYyAmIDB4MGZdOwkvLyDK5LP2uN80zrsNCiAgICAgICAgcFNyYysrOw0KICAgIH0NCg0KICAgIC8vILe1u9jEv7Hq19a3+7Sus6S2yA0KICAgIHJldHVybiBuU3JjTGVuZ3RoICogMjsNCn0NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioguq/K/cP7s8ajuiB2b2lkIHp4aWNfZXJyX3RyYWNrKGludCBlcnIpDQoqILmmxNzD6Mr2o7ogvavTptPDtO3O87rFzO2807W9bnbW0A0KKiDK5Mjrss7K/aO6ICAgICAgZXJyOiC07c7zusUNCiogt7Ugu9gg1rWjusS/serK/b7ds6S2yKO7DQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgenhpY19lcnJfdHJhY2soaW50IGVycikNCnsNCglFUlJfVFJBQ0sgZXJyVHJhY2sgPSB7MH07DQoJY2hhciAgIG52RXJyVHJhY2tbMiAqIHNpemVvZihFUlJfVFJBQ0spXSA9IHswfTsNCgljaGFyICAgYXNzZXJ0X2Vycm5vWzEwXSA9IHswfTsNCglpbnQgcmVjb3JkTGVuID0gMCwgY3VyRXJybm8gPSAwLCBwcmVudW0gPSAwLCBpID0gMDsNCglzdHJ1Y3QgdGltZXZhbCBjdXJUaW1lID0gezB9Ow0KCXVuc2lnbmVkIGxvbmcgY3VyRXJyVGltZSAgPSAwOyAvL7rBw+sNCglpbnQgaW5kZXg7DQoNCglnZXR0aW1lb2ZkYXkoJmN1clRpbWUsIE5VTEwpOw0KCWN1ckVyclRpbWUgPSBjdXJUaW1lLnR2X3NlYyAqIDEwMDAgKyBjdXJUaW1lLnR2X3VzZWMgLyAxMDAwOw0KDQoJY3VyRXJybm8gPSBlcnI7DQoJLy9hdF9wcmludChBVF9ERUJVRywiW0VSUl1jdXJFcnJubyA9ICVkXHJcbiIsIGN1ckVycm5vKTsNCg0KCS8vt6LLzdDo0qq2z9HUtcRlcnJub6Os1rG907bP0dQNCgljZmdfZ2V0X2l0ZW0oImFzc2VydF9lcnJubyIsIGFzc2VydF9lcnJubywgc2l6ZW9mKGFzc2VydF9lcnJubykpOw0KCWlmIChjdXJFcnJubyA9PSBhdG9pKGFzc2VydF9lcnJubykpIHsNCgkJYXNzZXJ0KDApOw0KCX0NCg0KCS8vtNNOVrbByKG07c7zv+zV1dDFz6INCglyZWNvcmRMZW4gPSAyICogc2l6ZW9mKEVSUl9UUkFDSyk7DQoJbWVtc2V0KG52RXJyVHJhY2ssIDB4MDAsIHJlY29yZExlbik7DQoJY2ZnX2dldF9pdGVtKCJlcnJfdHJhY2siLCBudkVyclRyYWNrLCByZWNvcmRMZW4pOw0KCXN0cmluZzJieXRlcyhudkVyclRyYWNrLCAodW5zaWduZWQgY2hhciopJmVyclRyYWNrLCBzdHJsZW4obnZFcnJUcmFjaykpOw0KDQoNCgkvL7Ty06G/7NXV0MXPog0KI2lmIDANCglhdF9wcmludChBVF9ERUJVRywgIltFUlJdbnVtID0gJWRcclxuIiwgZXJyVHJhY2subnVtKTsNCglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7DQoJCWF0X3ByaW50KEFUX0RFQlVHLCAiW0VSUl1lcnJUcmFjay5lcnJJbmZvWyVkXS5lcnJubyA9ICVkXHJcbiIsIGksIGVyclRyYWNrLmVyckluZm9baV0uZXJyX25vKTsNCgkJYXRfcHJpbnQoQVRfREVCVUcsICJbRVJSXWVyclRyYWNrLmVyckluZm9bJWRdLmVycnRpbWUgPSAlbGRcclxuIiwgaSwgZXJyVHJhY2suZXJySW5mb1tpXS5lcnJfdGltZSk7DQoJfQ0KI2VuZGlmDQoJaW5kZXggPSBlcnJUcmFjay5udW0gJSBFUlJfVFJBQ0tfTUFYX05VTTsNCgkvL9Gtu7e8x8K8tO3O89DFz6INCglpZiAoaW5kZXggPT0gMCAmJiBlcnJUcmFjay5udW0gIT0gMCkNCgkJcHJlbnVtID0gRVJSX1RSQUNLX01BWF9OVU0gLSAxOw0KCWVsc2UgaWYgKGluZGV4ID09IDApDQoJCXByZW51bSA9IDA7DQoJZWxzZQ0KCQlwcmVudW0gPSBpbmRleCAtIDE7DQoNCgkvL8G9tM5lcnJub8/gzayjrL32uPzQwsqxvOQNCglpZiAoY3VyRXJybm8gPT0gZXJyVHJhY2suZXJySW5mb1twcmVudW1dLmVycl9ubykgew0KCQllcnJUcmFjay5lcnJJbmZvW3ByZW51bV0uZXJyX3RpbWUgPSBjdXJFcnJUaW1lOw0KCX0NCgkvL8G9tM5lcnJub7K7z+DNrKOsvMfCvM/C0MK1xGVycm5vus1lcnJ0aW1lDQoJZWxzZSB7DQoJCWVyclRyYWNrLmVyckluZm9baW5kZXhdLmVycl9ubyA9IGN1ckVycm5vOw0KCQllcnJUcmFjay5lcnJJbmZvW2luZGV4XS5lcnJfdGltZSA9IGN1ckVyclRpbWU7DQoJCWVyclRyYWNrLm51bSsrOw0KCX0NCg0KCS8vsaO05rTtzvO/7NXV0MXPorW9TlYNCg0KCW1lbXNldChudkVyclRyYWNrLCAweDAwLCByZWNvcmRMZW4pOw0KCWJ5dGVzMnN0cmluZygodW5zaWduZWQgY2hhciopJmVyclRyYWNrLCBudkVyclRyYWNrLCBzaXplb2YoRVJSX1RSQUNLKSk7DQoJY2ZnX3NldCgiZXJyX3RyYWNrIiwgbnZFcnJUcmFjayk7DQoNCn0NCg0KDQp2b2lkIGdldF9hdF9yZXFfcHJlZml4KGNoYXIgKmF0X3N0ciwgY2hhcioqIGF0X3ByZWZpeCkNCnsNCgljaGFyICpwcmVmaXggPSBOVUxMOwkNCiAgICBjaGFyICpwc3pBdEhlYWQgPSBOVUxMOwkNCiAgICBjaGFyICpwdGVtc3RyID0gTlVMTDsNCgkNCglpZigoKmF0X3N0ciA9PSAnQSd8fCphdF9zdHIgPT0gJ2EnKSYmKCooYXRfc3RyKzEpID09ICdUJ3x8KihhdF9zdHIrMSkgPT0gJ3QnKSkNCiAgICB7DQogICAgICAgIGlmKGlzYWxwaGEoKihhdF9zdHIrMikpKQ0KICAgICAgICB7DQogICAgICAgICAgICAqYXRfcHJlZml4ID0gTlVMTDsNCiAgICAgICAgfQ0KCQllbHNlDQoJCXsNCgkJCXByZWZpeCA9IChjaGFyKiltYWxsb2MoNTApOw0KCQkJaWYocHJlZml4ID09IE5VTEwpIHsNCgkJCQlzb2Z0YXBfYXNzZXJ0KCJtYWxsb2MgZmFpbCEiKTsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCQltZW1zZXQocHJlZml4LCAweDAwLCA1MCk7DQoJDQoJCQlwc3pBdEhlYWQgPSBhdF9zdHI7DQoJCQkvL9XStb3K17j2t8fX1sS4u/LV38r919a1xLLOyv2jrMD9yOcrDQoJCQlmb3IoOyAqYXRfc3RyICE9ICdcMCc7IGF0X3N0cisrKQ0KCQkJew0KCQkJICAgaWYoIShpc2FsbnVtKCphdF9zdHIpIHx8ICphdF9zdHIgPT0gJ1xyJyB8fCAqYXRfc3RyID09ICdcbicpKQ0KCQkJICAgew0KCQkJCSAgIHBzekF0SGVhZCA9IGF0X3N0cjsNCgkJCQkgICBwc3pBdEhlYWQrKzsNCgkJCQkgICBicmVhazsNCgkJCSAgIH0NCgkJCX0NCg0KCQkJZm9yKHB0ZW1zdHIgPSBwc3pBdEhlYWQ7ICpwdGVtc3RyICE9ICdcMCc7IHB0ZW1zdHIrKykNCgkJCXsNCgkJCQlpZigqcHRlbXN0ciA9PSAnPScgfHwgKnB0ZW1zdHIgPT0gJz8nIHx8ICpwdGVtc3RyID09ICdccicpDQoJCQkJew0KCQkJCQltZW1jcHkocHJlZml4LCBwc3pBdEhlYWQsIHB0ZW1zdHItcHN6QXRIZWFkKTsgDQoJCQkJCSphdF9wcmVmaXggPSBwcmVmaXg7DQoJCQkJCXJldHVybjsNCgkJCQl9DQoJCQl9DQoJCX0NCiAgICB9DQoJZWxzZQ0KCXsNCgkJc29mdGFwX2Fzc2VydCgicmVxX2F0IGNtZCBpcyBpbnZhbGlkISIpOw0KCX0NCglpZihwcmVmaXgpDQoJZnJlZShwcmVmaXgpOw0KfQ0KDQoNCi8vuPhhdF9jbGllbnS3osvNx+vH88/7z6KjrNCvtPhhdMP8we7X1rf7tK66zbOsyrHKsbOkDQp2b2lkIHNlbmRfYXBwX3JlcShpbnQgbW9kdWxlX2lkLCBjaGFyICpyZXFfYXQsIGludCBsZW4sIGludCB0aW1lb3V0LGludCBkaXJlY3QpDQp7DQoJc3RydWN0IGFwcF9zZW5kX3JlcV9hdCBhcHByZXE7DQoNCgltZW1zZXQoJmFwcHJlcSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBhcHBfc2VuZF9yZXFfYXQpKTsNCgltZW1jcHkoYXBwcmVxLmF0c3RyLCByZXFfYXQsIGxlbik7DQoJYXBwcmVxLnN0cl9sZW4gPSBsZW47DQogICAgYXBwcmVxLnRpbWVvdXQgPSB0aW1lb3V0Ow0KCWlmKGRpcmVjdCA9PSBORUFSX1BTKQ0KCQlpcGNfc2VuZF9tZXNzYWdlKG1vZHVsZV9pZCwgTU9EVUxFX0lEX0FUX0NUTCwgTVNHX0NNRF9TRU5EX0FUX1RPX1BTLHNpemVvZihzdHJ1Y3QgYXBwX3NlbmRfcmVxX2F0KSwgJmFwcHJlcSwgMCk7DQoJZWxzZQ0KCQlpcGNfc2VuZF9tZXNzYWdlKG1vZHVsZV9pZCwgTU9EVUxFX0lEX0FUX0NUTCwgTVNHX0NNRF9TRU5EX1JFUUFUX1RPX0ZBUlBTLHNpemVvZihzdHJ1Y3QgYXBwX3NlbmRfcmVxX2F0KSwgJmFwcHJlcSwgMCk7DQoNCglwcmludGYoInNlbmRfYXBwX3JlcVxuIik7DQoNCn0NCg0KDQovKioNCiAqIEBicmllZiDTptPDt6LLzbav1/fA4EFUx+vH86OssqLX6Mj7tci0/bav1/e94bn7o7vXotLio7q4w73Tv9rWu8Tc08PT2rLp0a+6zcno1sO6zda00NDH68fzo6zNqLn9yOuyzr340NDW0LzkveG5+7XExNqyv73izva0psDto6yyosfSDQogICAgICAgICAg09DW0LzkveG5+8nPsajKsaOs1rvWp7PW0rvM9dbQvOS94bn7tcTJz7GoveLO9qO7DQogKiBAcGFyYW0gcmVxX2F0ICDH68fzQVTD/MHuDQogKiBAcGFyYW0gaW5mb19mbXQgQVTP7NOmtcS48cq9u6+3vcq9DQogKiBAcGFyYW0gcHZhbCAguPHKvbuvuvO1xEFUz+zTpg0KICogQHBhcmFtIHNhZmVfcGFybV9jaGVjawnWuMq+yse38bbUss7K/bj2yv29+NDQ0rvWwtDUvOyy6aOsMLHtyr66rL/J0aGyzsr9o6yyu7bUss7K/bj2yv29+NDQvOyy6Tsxse3KvrbUss7K/bj2yv29+NDQ0c+48bzssukNCiAqIEByZXR1cm4gMLHtyr63tbvYs8m5pqOsxuTL+9a1se3KvsqnsNy07c7zwusNCiAqIEBub3RlICAxLiDTw7unyrnTw8qxo6zI9LK7z+vTybjDvdO/2sTasr+9+NDQss7K/bXEuPHKvbuvveLO9qOsv8nS1L2raW5mb19mbXS4s9a1zqoiJXMio6xwdmFsuLPWtc6qY2hhciAqKnDLq9a41eujrNXi0fmyzsr9vavX986q1fvM5dfWt/u0rre1u9i4+LX308PV3w0KCSAgICAgIDIuILbU09paTUdMLENQQlIsIENPUFM9P7XI0rvM9cfrx/O74dPQtuDM9dbQvOS94bn7x+m/9qOsu7nQ6Mq508NyZWdpc3Rlcl9pbmZvcm1fZnVuY9eisuHW0LzkveG5+7XEtKbA7bqvyv0NCiAqIEB3YXJuaW5nIA0KICovDQppbnQgIHNlbmRfcmVxX2FuZF93YWl0KGNoYXIgKnJlcV9hdCxpbnQgbGVuLGNoYXIgKmluZm9fZm10LHZvaWQgKipwdmFsLCBpbnQgc2FmZV9wYXJtX2NoZWNrLGludCB0aW1lb3V0LGludCBkaXJlY3QpDQp7DQoJaW50IG15X2hhbmRsZSA9IDA7DQogICAgY2hhciAqcHJlZml4ID0gTlVMTDsNCglNU0dfQlVGIHJzcF9tc2cgPSB7MH07DQoJTE9ORyBtc2dTaXplID0gc2l6ZW9mKE1TR19CVUYpLXNpemVvZihMT05HKTsNCglpbnQgaVJldCA9IDA7DQogICAgaW50IG1vZHVsZV9pZCA9IE1PRFVMRV9JRF9BVERZTkFNSUNfQkFTRTsvL8Tasr+2r8ysu/HIodS0xKO/6UlEo6yz9cq81rXOqk1PRFVMRV9JRF9BVERZTkFNSUNfQkFTRQ0KICAgIGludCAgZXJyID0gMDsNCglpbnQgIGF0X3NlbmRfY250ID0gMDsNCg0KDQoJaWYobGVuID49IE1TR19EQVRBX01BWF9MRU4tMTIpCQkNCgkJc29mdGFwX2Fzc2VydCgic2VuZF9yZXFfYW5kX3dhaXQgcmVxIGF0IGlzIHRvbyBsb25nISEhISEiKTsNCiAgICBhc3NlcnQoKGluZm9fZm10PT1OVUxMJiZwdmFsPT1OVUxMKXx8KGluZm9fZm10IT1OVUxMJiZwdmFsIT1OVUxMKSk7DQogICAgLy+2r8ystLS9qMHZyrG1xM/7z6K208HQudy1wA0KICAgIC8vbXNnZ2V0yrnTw7LOyv1JUENfQ1JFQVQgfCBJUENfRVhDTHwgMDYwMKOsxdC2z7Wxx7Btb2R1bGVfaWS1xM/7z6K208HQyse38Q0KICAgIC8vtObU2qOsyOe5+7K7tObU2qOs1rG907S0vajQwrXEz/vPorbTwdCju8jnufu05tTao6y3tbvY1rXOtC0xo6zIu7rzbW9kdWxlX2lkDQogICAgLy/WtbzTMaOssru2z9Gtu7fWsbW91dK1vcO709DKudPDtcRtb2R1bGVfaWTWtQ0KICAgIHdoaWxlKChteV9oYW5kbGUgPSBtc2dnZXQobW9kdWxlX2lkLElQQ19DUkVBVCB8IElQQ19FWENMfCAwNjAwKSkgPT0gLTEpDQogICAgew0KICAgICAgICBtb2R1bGVfaWQrKzsNCgkJaWYgKG1vZHVsZV9pZCA+IE1PRFVMRV9JRF9BVERZTkFNSUNfRU5EKSANCgkJCS8vtbFtb2R1bGVfaWS089PaTU9EVUxFX0lEX0FURFlOQU1JQ19FTkTWtcqxo6zW97avts/R1A0KCQkJc29mdGFwX2Fzc2VydCgiYXQgZHluYW1pYyBtc2cgcGlwaSBub3QgZnJlZSB0aW1lbHkhISEhISEhISEhISIpOw0KCX0NCiAgICAvL7j5vt3H68fzQVTD/MHuus2y6dGv0++3qKOs1dK1vbbU06a1xLLp0a/HsNe6o6y2r8ysuLPWtbj4s/ayzqOszeKyv7340NDE2rTmtcTKzbfFDQogICAgZ2V0X2F0X3JlcV9wcmVmaXgocmVxX2F0LCZwcmVmaXgpOw0KUkVTRU5EOgkNCiAgICAvL7j4YXRfY3Rst6LLzc/7z6KjrLeiy821xM/7z6LE2sjdysdhdMP8we7X1rf7tK4NCglhdF9zZW5kX2NudCsrOw0KICAgIGFzc2VydChhdF9zZW5kX2NudDw9Myk7DQogICAgLy/TyWF0Y3Rs1ve/2MTasr/J6NbDs6zKsbXItP2jrNbYt6K687vh08nW2Lm51tjJ6LjDtqjKscb3DQoJc2VuZF9hcHBfcmVxKG1vZHVsZV9pZCxyZXFfYXQsbGVuLHRpbWVvdXQsZGlyZWN0KTsNCglzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJwcmVmaXg6JXNcbiIscHJlZml4KTsNCgl3aGlsZSgxKQ0KCXsNCgkJaVJldCA9IDA7DQoJCW1lbXNldCgmcnNwX21zZywgMHgwMCwgc2l6ZW9mKE1TR19CVUYpKTsNCgkJaVJldCA9IG1zZ3JjdihteV9oYW5kbGUsICZyc3BfbXNnLCBtc2dTaXplLCAwLCAwKTsNCgkJaWYgKGlSZXQgPCAwKQ0KICAgICAgICB7DQogICAgICAgIAljb250aW51ZTsNCgkJfQ0KCQkvL8vAtcjTprTwz/vPog0KCQlpZihyc3BfbXNnLnVzTXNnQ21kID09IE1TR19DTURfU0VORF9BVF9NU0dfUlNQKS8vxqXF5LW9ysdNU0dfQ01EX1NFTkRfQVRfTVNHX1JTUMqxssW0psDtDQoJCXsNCgkJICAgIGNoYXIgKmJ1ZiA9IHJzcF9tc2cuYXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgIGNoYXIgKmF0X3BhcmFzID0gTlVMTDsNCiAgICAgICAgCWNoYXIgKnJzcF9oZWFkID0gTlVMTDsNCgkJCWNoYXIgKnJzcF90YWlsID0gTlVMTDsNCiAgICAgICAgICAgIHJzcF9oZWFkID0gYnVmOw0KCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAicmVjdiBNU0dfQ01EX1NFTkRfQVRfTVNHX1JTUCwgYnVmOiVzXG4iLGJ1Zik7DQogICAgICAgIAkvL7bU09qy6dGvx+vH86OssqLM4bmpwcuyzsr9xNq05r/VvOSjrNTyvfjQ0LLOyv21xL3izvYNCiAgICAgICAgCWlmKHByZWZpeCE9TlVMTCAmJiBpbmZvX2ZtdCE9TlVMTCAmJiBwdmFsIT1OVUxMICYmICgocnNwX2hlYWQ9YXRfc3Ryc3RyKGJ1ZixwcmVmaXgpKSE9TlVMTCkpDQogICAgICAgIAl7DQogICAgICAgIAkJLy/M+Ln91tC85L3hufu1xM23sr+jrNXStb2yzsr9tcTK17XY1rcNCiAgICAgICAgCQlyc3BfaGVhZCA9IHJzcF9oZWFkK3N0cmxlbihwcmVmaXgpKzI7IA0KCQkJCWlmKChyc3BfdGFpbCA9IHN0cnN0cihyc3BfaGVhZCwiXHJcbiIpKSA9PSBOVUxMKS8vtbHJz7GotcTW0LzkveG5+9bQw7vT0FxyXG7KsaOsy7XD973hufvT0M7KzOKjrNaxvdO2z9HUDQoJCQkJCXNvZnRhcF9hc3NlcnQoInJzcCByZXN1bHQgaXMgd3JvbmcgYW5kIHBsZWFzZSBjb250YWN0IHdpdGggeWFuZ3l1biEiKTsNCgkJCQkNCgkJCQlpZihzdHJjbXAoaW5mb19mbXQsIiVzIikgPT0gMCkNCgkJCQkJLy/I57n7srvP69PJxNqyv7340NCyzsr9tcS48cq9u6+94s72yrGjrNaxvdO9q8irsr+yzsr9xNrI3cihs/bAtLiz1rW1vXB2YWxbMF3W0KOssrvX9sjOus694s72DQoJCQkJCS8vc3RybmNweSgoY2hhciAqKSpwdmFsLCByc3BfaGVhZCwgKGludCkocnNwX3RhaWwtcnNwX2hlYWQpKTsNCgkJCQkJLy+3wNa5yOuyzrfHyKswo6zU2sSpzrK809fWt/u0rr3hyvi3+w0KCQkJCQlzbnByaW50ZigoY2hhciAqKSpwdmFsLCAocnNwX3RhaWwtcnNwX2hlYWQpKzEsICIlcyIsIHJzcF9oZWFkKTsNCgkJCQllbHNlLy/Q6NKqss7K/b3izvbKsaOsvavW0LzkveG5+7TTyc+xqL3hufvW0LPps/bAtKOoyc+xqLXEveG5+9bQv8nE3NPQT0u05tTao6kNCgkJCQl7DQoJCQkJCWNoYXIgKmF0X3BhcmFzID0gIG1hbGxvYyhzdHJsZW4ocnNwX2hlYWQpKzEpOw0KCQkJCQlpZihhdF9wYXJhcyA9PSBOVUxMKSB7DQoJCQkJCQlzb2Z0YXBfYXNzZXJ0KCJtYWxsb2MgZmFpbCEiKTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQogICAgICAgICAgICAgICAgICAgIG1lbXNldChhdF9wYXJhcywgMCwgc3RybGVuKHJzcF9oZWFkKSsxKTsNCgkJCQkJbWVtY3B5KGF0X3BhcmFzLCByc3BfaGVhZCwgKGludCkocnNwX3RhaWwtcnNwX2hlYWQpKTsNCg0KCQkJCQlpZihzYWZlX3Bhcm1fY2hlY2spDQoJCQkJCQllcnIgPSBwYXJzZV9wYXJhbV9zYWZlKGluZm9fZm10LCBhdF9wYXJhcywgcHZhbCk7Ly+wtNXVuPHKvb3izvayzsr9DQoJCQkJCWVsc2UNCgkJCQkJCWVyciA9IHBhcnNlX3BhcmFtKGluZm9fZm10LCBhdF9wYXJhcywgcHZhbCk7Ly+wtNXVuPHKvb3izvayzsr9DQoJCQkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInJzcCBwYXJzZV9wYXJhbV9zYWZlIHJldHVybiBFUlI9JWQhISEhISFcbiIsZXJyKTsNCg0KCQkJCQkvL2lmKGF0X3BhcmFzICE9IE5VTEwpDQoJCQkJCQlmcmVlKGF0X3BhcmFzKTsNCiAgICAgICAgICAgICAgICAgICAgLy+yzsr9sru6z7eoo6zH0srH0+vN4rK/TUNVvfjQ0L27u6XKsaOswaK8tNbY0MK3osvNx+vH8w0KICAgICAgICAgICAgICAgICAgICBpZihkaXJlY3Q9PUZBUl9QUyAmJiBlcnIgIT0gQVRfUEFSU0VfT0spDQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFJFU0VORDsNCiAgICAgICAgICAgICAgICAgICAgLy+yzsr9sru6z7eoo6xaWElDxNqyv727u6XKsaOswaK8tLe1u9iyzsr9tO3O88LrDQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoZXJyICE9IEFUX1BBUlNFX09LKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoJCQkJfSAgICAgICAgICAgICAgICANCiAgICAgICAgCX0NCiAgICAgICAgCS8vttTT2rLp0a/A4KOssrvTprjDt7W72LTtzvOjrNXS0K3S6dW7DQogICAgICAgIAlpZigocnNwX2hlYWQgPSBzdHJzdHIoYnVmLCJFUlJPUiIpKSAhPSBOVUxMKQ0KCQkJew0KCQkJCXNzY2FuZihyc3BfaGVhZCtzdHJsZW4oIkVSUk9SIikrMiwgIiVkIiwgJmVycik7IAkJCQkNCgkJCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJzZXJ2ZXIgcmV0dXJuIEVSUj0lZCwgYXRfc2VuZF9jbnQ9JWQhISEhISEhXG4iLGVycixhdF9zZW5kX2NudCk7DQogICAgICAgICAgICAgICAgLy/O3tDos6zKsdbYt6K78tXft7W72LXEtO3O88LrzqrTw7unwKnVubTtzvOjrLK7vfjQ0NbYt6INCiAgICAgICAgICAgICAgICBpZihkaXJlY3Q9PUZBUl9QUyYmZXJyPDkwMDApDQoJCQkJCWdvdG8gUkVTRU5EOw0KCQkJCQ0KCQkJCWNoYXIgbmVlZEluaXRbMjBdID0gezB9Ow0KCQkJCS8vttTT2s2ouf03MTAwyc/N+MSjyr2jrNf2zNjK4rao1sajrLvYuLRlcnJvcrrzsdjQ69bYtKsNCiAgICAJCQljZmdfZ2V0X2l0ZW0oImN1c3RvbWVyX3R5cGUiLG5lZWRJbml0LHNpemVvZihuZWVkSW5pdCkpOw0KCQkJCWlmKDAgPT0gc3RyY21wKG5lZWRJbml0LCAiNzEwMG1vZGVtIikgJiYgZXJyPDkwMDApDQoJCQkJCWdvdG8gUkVTRU5EOw0KCQkJCQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KCQkJfQkJCQ0KCQkJLy+21NPayejWw8Dgw/zB7rrN0rvQqda00NDA4MP8we6jrNa709BPS8nPsajDu9PQ1tC85L3hufvJz7GoDQoJCQllbHNlIGlmKChyc3BfaGVhZCA9IHN0cnN0cihidWYsIk9LIikpICE9IE5VTEwpDQogICAgICAgIAl7DQogICAgICAgICAgICAgICAgYnJlYWs7CQkNCiAgICAgICAgCX0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZihwcmVmaXghPU5VTEwpDQogICAgICAgIGZyZWUocHJlZml4KTsNCiAgICAvL7Lp0a/D/MHuveG5+7e1u9i686Osz/q72daux7C0tL2otcTP+8+ittPB0A0KICAgIGlmKG1zZ2N0bChteV9oYW5kbGUsSVBDX1JNSUQsMCkgPCAwKQ0KICAgICAgICBzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICIlZDolcyIsZXJybm8sc3RyZXJyb3IoZXJybm8pKTsJDQogICAgcmV0dXJuIGVycjsNCn0NCmludCAgZ2V0X21vZGVtX2luZm8oY2hhciAqcmVxX2F0LGNoYXIgKmluZm9fZm10LHZvaWQgKipwdmFsKQ0Kew0KICAgIHJldHVybiBzZW5kX3JlcV9hbmRfd2FpdChyZXFfYXQsc3RybGVuKHJlcV9hdCksaW5mb19mbXQscHZhbCwwLDAsTkVBUl9QUyk7DQp9DQppbnQgIGdldF9tb2RlbV9pbmZvMihjaGFyICpyZXFfYXQsY2hhciAqaW5mb19mbXQsdm9pZCAqKnB2YWwsIGludCBzYWZlX3Bhcm1fY2hlY2ssIGludCB0aW1lb3V0KQ0Kew0KICAgIHJldHVybiBzZW5kX3JlcV9hbmRfd2FpdChyZXFfYXQsc3RybGVuKHJlcV9hdCksaW5mb19mbXQscHZhbCxzYWZlX3Bhcm1fY2hlY2ssdGltZW91dCxORUFSX1BTKTsNCn0NCmludCAgc2VuZF9yZXFhdF90b19mYXJwcyhjaGFyICpyZXFfYXQsaW50IGxlbixjaGFyICppbmZvX2ZtdCx2b2lkICoqcHZhbCwgaW50IHNhZmVfcGFybV9jaGVjaywgaW50IHRpbWVvdXQpDQp7DQogICAgcmV0dXJuIHNlbmRfcmVxX2FuZF93YWl0KHJlcV9hdCxsZW4saW5mb19mbXQscHZhbCxzYWZlX3Bhcm1fY2hlY2ssdGltZW91dCxGQVJfUFMpOw0KfQ0KDQovKtTauvbC1LTz0KHQtLXEx7DM4c/CLLHIvc/BvdfWt/u0rsrHt/HN6sirxqXF5KOsyOe5+8alxeS3tbvYMKOsyOe5+7Xa0ru49sjrss6089Patdq2/rj2yOuyzqOsDQq3tbvY1f3WtaOst/HU8re1u9i4uta1o7sNCr/J08PT2rHIvc9BVMP8we7HsNe6yse38calxeSjrMD9yOdhdCtjb3BzP7rNQVQrQ09QUz+1xLHIvc8qLw0KaW50IGF0X3N0cmNtcChjb25zdCBjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzb3VyY2UpDQp7DQogICAgLy9pbnQgRElGRl9WQUxVRSA9ICdhJy0nQSc7DQogICAgaW50IGNoMSA9IDA7DQogICAgaW50IGNoMiA9IDA7DQoNCiAgICBpZihOVUxMID09IGRlc3QgfHwgTlVMTCA9PSBzb3VyY2UpDQogICAgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQoJLy+9q8G919a3+7Su1tC1xLTz0KHX1sS4z8jXqruvs8m21NOmtcTQodC019bEuLrzsci9zw0KICAgIGRvDQogICAgew0KICAgICAgICBpZigoY2gxID0gKih1bnNpZ25lZCBjaGFyICopZGVzdCkgPj0gJ0EnICYmIChjaDEgPD0gJ1onKSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2gxICs9IERJRkZfVkFMVUU7DQogICAgICAgIH0NCiAgICAgICAgaWYoKGNoMiA9ICoodW5zaWduZWQgY2hhciAqKXNvdXJjZSkgPj0gJ0EnICYmIChjaDIgPD0gJ1onKSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2gyICs9IERJRkZfVkFMVUU7DQogICAgICAgIH0NCgkJZGVzdCsrOw0KCQlzb3VyY2UrKzsNCiAgICB9d2hpbGUoKGNoMSA9PSBjaDIpICYmIGNoMSAmJiBjaDIpOw0KDQogICAgaWYoY2gxID09IGNoMikNCgkJcmV0dXJuIDA7DQoJZWxzZQ0KCQlyZXR1cm4gKigtLWRlc3QpIC0gKigtLXNvdXJjZSk7DQp9DQoNCi8q1Nq69sLUtPPQodC0tcTHsMzhz8Issci9z8G919a3+7Sux7BzaXpl19a3+8rHt/HGpcXko6zI57n7xqXF5Le1u9gwo6wNCsjnufu12tK7uPbI67LOtPPT2rXatv649sjrss6jrLe1u9jV/da1o6y38dTyt7W72Li61rWjuw0Kv8nTw9Pasci9z0FUw/zB7sfrx/PHsNe6us3G5NbQvOS94bn7tcTHsNe6yse38calxeSjrMD9yOdjb3BzP7rNQ09QU9Tax7A0uPbX1rf7tcSxyL3PKi8NCmludCBhdF9zdHJuY21wKGNvbnN0IGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNvdXJjZSwgaW50IHNpemUpDQp7DQoJLy9pbnQgRElGRl9WQUxVRSA9ICdhJy0nQSc7DQogICAgaW50IGNoMSA9IDA7DQogICAgaW50IGNoMiA9IDA7DQoNCglpZihOVUxMID09IGRlc3QgfHwgTlVMTCA9PSBzb3VyY2UgfHwgc2l6ZSA8IDApDQoJew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIGlmKDAgPT0gc2l6ZSkNCgl7DQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCgkvL72rwb3X1rf7tK7W0LXEtPPQodfWxLjPyNequ6+zybbU06a1xNCh0LTX1sS4uvOxyL3Px7BzaXpl19a3+w0KCWRvDQogICAgew0KICAgICAgICBpZigoY2gxID0gKih1bnNpZ25lZCBjaGFyICopZGVzdCkgPj0gJ0EnICYmIChjaDEgPD0gJ1onKSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2gxICs9IERJRkZfVkFMVUU7DQogICAgICAgIH0NCiAgICAgICAgaWYoKGNoMiA9ICoodW5zaWduZWQgY2hhciAqKXNvdXJjZSkgPj0gJ0EnICYmIChjaDIgPD0gJ1onKSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2gyICs9IERJRkZfVkFMVUU7DQogICAgICAgIH0NCgkJZGVzdCsrOw0KCQlzb3VyY2UrKzsNCiAgICB9d2hpbGUoLS1zaXplICYmIChjaDEgPT0gY2gyKSAmJiBjaDEgJiYgY2gyKTsNCg0KICAgIGlmKGNoMSA9PSBjaDIpDQoJCXJldHVybiAwOw0KCWVsc2UNCgkJcmV0dXJuICooLS1kZXN0KSAtICooLS1zb3VyY2UpOw0KDQp9DQoNCi8q1Nq69sLUtPPQodC0tcTHsMzhz8IsINTac291cmNl1tDRsNXSc3Vic3Ry19O0rqOsyOe5+9XStb2jrNaxvdO3tbvY1Npzb3VyY2XW0LXa0ru0zrP2z9a1xM671sOjrA0KyOe5+8O709DV0rW9o6y3tbvYTlVMTCovDQpjaGFyICogYXRfc3Ryc3RyKGNvbnN0IGNoYXIgKiBzb3VyY2UsIGNvbnN0IGNoYXIgKiBzdWJzdHIpDQp7DQoJLy9pbnQgRElGRl9WQUxVRSA9ICdhJy0nQSc7DQogICAgaW50IGNoMSA9IDA7DQogICAgaW50IGNoMiA9IDA7DQoNCiAgICBpZihzdWJzdHIgPT0gTlVMTCB8fCAgc291cmNlID09IE5VTEwpDQoJCXJldHVybiBOVUxMOw0KCS8vvavBvdfWt/u0rtbQtcS089Ch19bEuM/I16q7r7PJttTTprXE0KHQtNfWxLi689TZsunV0g0KICAgIHdoaWxlKCpzb3VyY2UgIT0gJ1wwJykNCiAgICB7DQoJCWNoYXIgKnAgPSAoY2hhciAqKXNvdXJjZTsNCiAgICAgICAgY2hhciAqcSA9IChjaGFyICopc3Vic3RyOw0KICAgICAgICBjaGFyICpyZXMgPSBOVUxMOw0KICAgICAgICANCgkJcmVzID0gcDsNCgkJZG8NCgkJew0KCQkJaWYoKGNoMSA9ICoodW5zaWduZWQgY2hhciAqKXApID49ICdBJyAmJiAoY2gxIDw9ICdaJykpDQoJCQl7DQoJCQkJY2gxICs9IERJRkZfVkFMVUU7DQoJCQl9DQoJCQlpZigoY2gyID0gKih1bnNpZ25lZCBjaGFyICopcSkgPj0gJ0EnICYmIChjaDIgPD0gJ1onKSkNCgkJCXsNCgkJCQljaDIgKz0gRElGRl9WQUxVRTsNCgkJCX0NCgkJCXArKzsNCgkJCXErKzsNCgkJfXdoaWxlKGNoMSAmJiBjaDIgJiYgKGNoMSA9PSBjaDIpKTsNCiAgICAgICAgICAgICAgICANCgkJaWYoY2gyID09ICdcMCcpDQoJCQlyZXR1cm4gcmVzOyANCiAgICAgICAgc291cmNlKys7DQogICAgfQ0KICAgIHJldHVybiBOVUxMOw0KfQ0KDQovL7f+zvG2y9Om08OzzNDyo6y3osvN1tC85L3hufu6zc/s06a1vc3isr9NQ1UNCmludCBzZW5kX3JzcF9zdHJfdG9fZmFycHMoaW50ICBtb2R1bGVfaWQsIGNoYXIgKnJzcF9jbWQsaW50IHJzcF9sZW4pDQp7DQoJcmV0dXJuIGlwY19zZW5kX21lc3NhZ2UobW9kdWxlX2lkLCBNT0RVTEVfSURfQVRfQ1RMLCBNU0dfQ01EX1NFTkRfUlNQX1RPX09VVFNJREUsIHJzcF9sZW4sIHJzcF9jbWQsIDApOw0KfQ0KDQoNCnVuc2lnbmVkIHNob3J0IGdldF9jaGtzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqcHRyLCB1bnNpZ25lZCBzaG9ydCBsZW4pDQp7DQoJdW5zaWduZWQgaW50IHN1bSA9IDA7DQoJdW5zaWduZWQgaW50IHRtcDsNCgljb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7DQoNCgllbmQgPSBwdHIgKyBsZW4gLSAxOw0KDQoJd2hpbGUgKHB0ciA8IGVuZCkgew0KCQl0bXAgPSAocHRyWzBdIDw8IDgpICsgcHRyWzFdOw0KCQlzdW0gKz0gdG1wOw0KCQlpZiAoc3VtIDwgdG1wKSB7DQoJCQlzdW0rKzsNCgkJfQ0KCQlwdHIgKz0gMjsNCgl9DQoNCglpZiAocHRyID09IGVuZCkgew0KCQl0bXAgPSBwdHJbMF0gPDwgODsNCgkJc3VtICs9IHRtcDsNCgkJaWYgKHN1bSA8IHRtcCkgew0KCQkJc3VtKys7DQoJCX0NCgl9DQoNCglyZXR1cm4gc3VtOw0KfQ0KDQo=