LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICoKICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KICoKICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAogKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICoKICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCiAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAqCiAqIENvZGUgY2hhbmdlIG5vdGVzOgogKiAKICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEphbiBL5GxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICogSmFuIEvkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uWG1sOwp1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwpuYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAp7CglpbnRlcm5hbCBjbGFzcyBSb3dJbnRlcm5hbAogICAgewogICAgICAgIGludGVybmFsIGRvdWJsZSBIZWlnaHQ9LTE7CiAgICAgICAgaW50ZXJuYWwgYm9vbCBIaWRkZW47CiAgICAgICAgaW50ZXJuYWwgYm9vbCBDb2xsYXBzZWQ7ICAgICAgICAKICAgICAgICBpbnRlcm5hbCBzaG9ydCBPdXRsaW5lTGV2ZWw7CiAgICAgICAgaW50ZXJuYWwgYm9vbCBQYWdlQnJlYWs7CiAgICAgICAgaW50ZXJuYWwgYm9vbCBQaG9uZXRpYzsKICAgICAgICBpbnRlcm5hbCBib29sIEN1c3RvbUhlaWdodDsKICAgICAgICBpbnRlcm5hbCBpbnQgTWVyZ2VJRDsKICAgICAgICBpbnRlcm5hbCBSb3dJbnRlcm5hbCBDbG9uZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFJvd0ludGVybmFsKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSGVpZ2h0PUhlaWdodCwKICAgICAgICAgICAgICAgIEhpZGRlbj1IaWRkZW4sCiAgICAgICAgICAgICAgICBDb2xsYXBzZWQ9Q29sbGFwc2VkLAogICAgICAgICAgICAgICAgT3V0bGluZUxldmVsPU91dGxpbmVMZXZlbCwKICAgICAgICAgICAgICAgIFBhZ2VCcmVhaz1QYWdlQnJlYWssCiAgICAgICAgICAgICAgICBQaG9uZXRpYz1QaG9uZXRpYywKICAgICAgICAgICAgICAgIEN1c3RvbUhlaWdodD1DdXN0b21IZWlnaHQsCiAgICAgICAgICAgICAgICBNZXJnZUlEPU1lcmdlSUQKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvLy8gPHN1bW1hcnk+CgkvLy8gUmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHJvdyBpbiB0aGUgc3ByZWFkc2hlZXQuCgkvLy8gPC9zdW1tYXJ5PgoJcHVibGljIGNsYXNzIEV4Y2VsUm93IDogSVJhbmdlSUQKCXsKCQlwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7CgkJcHJpdmF0ZSBYbWxFbGVtZW50IF9yb3dFbGVtZW50ID0gbnVsbDsKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEludGVybmFsIFJvd0lELgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW09ic29sZXRlXQogICAgICAgIHB1YmxpYyB1bG9uZyBSb3dJRCAKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gR2V0Um93SUQoX3dvcmtzaGVldC5TaGVldElELCBSb3cpOwogICAgICAgICAgICB9CiAgICAgICAgfQoJCSNyZWdpb24gRXhjZWxSb3cgQ29uc3RydWN0b3IKCQkvLy8gPHN1bW1hcnk+CgkJLy8vIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsUm93IGNsYXNzLiAKCQkvLy8gRm9yIGludGVybmFsIHVzZSBvbmx5IQoJCS8vLyA8L3N1bW1hcnk+CgkJLy8vIDxwYXJhbSBuYW1lPSJXb3Jrc2hlZXQiPlRoZSBwYXJlbnQgd29ya3NoZWV0PC9wYXJhbT4KCQkvLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIHJvdyBudW1iZXI8L3BhcmFtPgoJCWludGVybmFsIEV4Y2VsUm93KEV4Y2VsV29ya3NoZWV0IFdvcmtzaGVldCwgaW50IHJvdykKCQl7CgkJCV93b3Jrc2hlZXQgPSBXb3Jrc2hlZXQ7CiAgICAgICAgICAgIFJvdyA9IHJvdzsKCQl9CgkJI2VuZHJlZ2lvbgoKCQkvLy8gPHN1bW1hcnk+CgkJLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIHJvdy4KCQkvLy8gPC9zdW1tYXJ5PgoJCWludGVybmFsIFhtbE5vZGUgTm9kZSB7IGdldCB7IHJldHVybiAoX3Jvd0VsZW1lbnQpOyB9IH0KCgkJI3JlZ2lvbiBFeGNlbFJvdyBIaWRkZW4KICAgICAgICAvLy8gPHN1bW1hcnk+CgkJLy8vIEFsbG93cyB0aGUgcm93IHRvIGJlIGhpZGRlbiBpbiB0aGUgd29ya3NoZWV0CgkJLy8vIDwvc3VtbWFyeT4KCQlwdWJsaWMgYm9vbCBIaWRkZW4KICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcj0oUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CiAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5IaWRkZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKICAgICAgICAgICAgICAgIHIuSGlkZGVuPXZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfSAgICAgICAgCgkJI2VuZHJlZ2lvbgoKCQkjcmVnaW9uIEV4Y2VsUm93IEhlaWdodAogICAgICAgIC8vLyA8c3VtbWFyeT4KCQkvLy8gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSByb3cKCQkvLy8gPC9zdW1tYXJ5PgoJCXB1YmxpYyBkb3VibGUgSGVpZ2h0CiAgICAgICAgewoJCQlnZXQKCQkJewogICAgICAgICAgICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CiAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsIHx8IHIuSGVpZ2h0PDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuRGVmYXVsdFJvd0hlaWdodDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5IZWlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9wYWNrYWdlLkRvQWRqdXN0RHJhd2luZ3MpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IF93b3Jrc2hlZXQuRHJhd2luZ3MuR2V0RHJhd2luZ1dpZHRocygpOwogICAgICAgICAgICAgICAgICAgIHIuSGVpZ2h0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5EcmF3aW5ncy5BZGp1c3RIZWlnaHQocG9zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByLkhlaWdodCA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoci5IaWRkZW4gJiYgdmFsdWUgIT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBIaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIuQ3VzdG9tSGVpZ2h0ID0gKHZhbHVlICE9IF93b3Jrc2hlZXQuRGVmYXVsdFJvd0hlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBTZXQgdG8gdHJ1ZSBpZiBZb3UgZG9uJ3Qgd2FudCB0aGUgcm93IHRvIEF1dG9zaXplCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBDdXN0b21IZWlnaHQgCiAgICAgICAgewogICAgICAgICAgICBnZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CiAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5DdXN0b21IZWlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKICAgICAgICAgICAgICAgIHIuQ3VzdG9tSGVpZ2h0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgkJI2VuZHJlZ2lvbgoKICAgICAgICBpbnRlcm5hbCBzdHJpbmcgX3N0eWxlTmFtZSA9ICIiOwogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gU2V0cyB0aGUgc3R5bGUgZm9yIHRoZSBlbnRpcmUgY29sdW1uIHVzaW5nIGEgc3R5bGUgbmFtZS4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBzdHJpbmcgU3R5bGVOYW1lCiAgICAgICAgewogICAgICAgICAgICBnZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN0eWxlSUQgPSBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5HZXRTdHlsZUlkRnJvbU5hbWUodmFsdWUpOwogICAgICAgICAgICAgICAgX3N0eWxlTmFtZSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gU2V0cyB0aGUgc3R5bGUgZm9yIHRoZSBlbnRpcmUgcm93IHVzaW5nIHRoZSBzdHlsZSBJRC4gIAogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIGludCBTdHlsZUlECiAgICAgICAgewogICAgICAgICAgICBnZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuX3N0eWxlcy5HZXRWYWx1ZShSb3csIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUoUm93LCAwLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUm93bnVtYmVyCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgaW50IFJvdwogICAgICAgIHsKICAgICAgICAgICAgZ2V0OwogICAgICAgICAgICBzZXQ7CiAgICAgICAgfQogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gSWYgb3V0bGluZSBsZXZlbCBpcyBzZXQgdGhpcyB0ZWxscyB0aGF0IHRoZSByb3cgaXMgY29sbGFwc2VkCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBDb2xsYXBzZWQKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcj0oUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CiAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5Db2xsYXBzZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKICAgICAgICAgICAgICAgIHIuQ29sbGFwc2VkID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBPdXRsaW5lIGxldmVsLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIGludCBPdXRsaW5lTGV2ZWwKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcj0oUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CiAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByLk91dGxpbmVMZXZlbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOwogICAgICAgICAgICAgICAgci5PdXRsaW5lTGV2ZWw9KHNob3J0KXZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlICBSb3dJbnRlcm5hbCBHZXRSb3dJbnRlcm5hbCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgciA9IG5ldyBSb3dJbnRlcm5hbCgpOwogICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKFJvdywgMCwgcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgfSAgICAgICAgCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBTaG93IHBob25ldGljIEluZm9ybWF0aW9uCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBQaG9uZXRpYyAKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByLlBob25ldGljOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7CiAgICAgICAgICAgICAgICByLlBob25ldGljID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUaGUgU3R5bGUgYXBwbGllZCB0byB0aGUgd2hvbGUgcm93LiBPbmx5IGVmZmVrdCBjZWxscyB3aXRoIG5vIGluZGl2aWR1YWwgc3R5bGUgc2V0LiAKICAgICAgICAvLy8gVXNlIEV4Y2VsUmFuZ2Ugb2JqZWN0IGlmIHlvdSB3YW50IHRvIHNldCBzcGVjaWZpYyBzdHlsZXMuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZSBTdHlsZQogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5HZXRTdHlsZU9iamVjdChTdHlsZUlELF93b3Jrc2hlZXQuUG9zaXRpb25JRCAsUm93LlRvU3RyaW5nKCkgKyAiOiIgKyBSb3cuVG9TdHJpbmcoKSk7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQWRkcyBhIG1hbnVhbCBwYWdlIGJyZWFrIGFmdGVyIHRoZSByb3cuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBQYWdlQnJlYWsKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByLlBhZ2VCcmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOwogICAgICAgICAgICAgICAgci5QYWdlQnJlYWsgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwdWJsaWMgYm9vbCBNZXJnZWQKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5NZXJnZWRDZWxsc1tSb3csIDBdICE9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQWRkKG5ldyBFeGNlbEFkZHJlc3NCYXNlKFJvdywgMSwgUm93LCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyksIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGludGVybmFsIHN0YXRpYyB1bG9uZyBHZXRSb3dJRChpbnQgc2hlZXRJRCwgaW50IHJvdykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAoKHVsb25nKXNoZWV0SUQpICsgKCgodWxvbmcpcm93KSA8PCAyOSk7CgogICAgICAgIH0KICAgICAgICAKICAgICAgICAjcmVnaW9uIElSYW5nZUlEIE1lbWJlcnMKCiAgICAgICAgW09ic29sZXRlXQogICAgICAgIHVsb25nIElSYW5nZUlELlJhbmdlSUQKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gUm93SUQ7IAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSb3cgPSAoKGludCkodmFsdWUgPj4gMjkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgI2VuZHJlZ2lvbgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQ29waWVzIHRoZSBjdXJyZW50IHJvdyB0byBhIG5ldyB3b3Jrc2hlZXQKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkZWQiPlRoZSB3b3Jrc2hlZXQgd2hlcmUgdGhlIGNvcHkgd2lsbCBiZSBjcmVhdGVkPC9wYXJhbT4KICAgICAgICBpbnRlcm5hbCB2b2lkIENsb25lKEV4Y2VsV29ya3NoZWV0IGFkZGVkKQogICAgICAgIHsKICAgICAgICAgICAgRXhjZWxSb3cgbmV3Um93ID0gYWRkZWQuUm93KFJvdyk7CiAgICAgICAgICAgIG5ld1Jvdy5Db2xsYXBzZWQgPSBDb2xsYXBzZWQ7CiAgICAgICAgICAgIG5ld1Jvdy5IZWlnaHQgPSBIZWlnaHQ7CiAgICAgICAgICAgIG5ld1Jvdy5IaWRkZW4gPSBIaWRkZW47CiAgICAgICAgICAgIG5ld1Jvdy5PdXRsaW5lTGV2ZWwgPSBPdXRsaW5lTGV2ZWw7CiAgICAgICAgICAgIG5ld1Jvdy5QYWdlQnJlYWsgPSBQYWdlQnJlYWs7CiAgICAgICAgICAgIG5ld1Jvdy5QaG9uZXRpYyA9IFBob25ldGljOwogICAgICAgICAgICBuZXdSb3cuX3N0eWxlTmFtZSA9IF9zdHlsZU5hbWU7CiAgICAgICAgICAgIG5ld1Jvdy5TdHlsZUlEID0gU3R5bGVJRDsKICAgICAgICB9CiAgICB9Cn0K