LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICoKICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KICoKICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAogKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICoKICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCiAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAqCiAqIENvZGUgY2hhbmdlIG5vdGVzOgogKiAKICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEphbiBL5GxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgMjAwOS0xMC0wMQogKiBKYW4gS+RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLlhtbDsKCm5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCnsKCS8vLyA8c3VtbWFyeT4KCS8vLyBSZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgdmlldyBzdGF0ZXMgb2YgdGhlIHdvcmtzaGVldAoJLy8vIDwvc3VtbWFyeT4KCXB1YmxpYyBjbGFzcyBFeGNlbFdvcmtzaGVldFZpZXcgOiBYbWxIZWxwZXIKCXsKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFRoZSB3b3Jrc2hlZXQgcGFuZXMgYWZ0ZXIgYSBmcmVlemUgb3Igc3BsaXQuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgY2xhc3MgRXhjZWxXb3Jrc2hlZXRQYW5lcyA6IFhtbEhlbHBlcgogICAgICAgIHsKICAgICAgICAgICAgWG1sRWxlbWVudCBfc2VsZWN0aW9uTm9kZSA9IG51bGw7CiAgICAgICAgICAgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0UGFuZXMoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlKSA6CiAgICAgICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZih0b3BOb2RlLk5hbWU9PSJzZWxlY3Rpb24iKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIF9zZWxlY3Rpb25Ob2RlPXRvcE5vZGUgYXMgWG1sRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3Qgc3RyaW5nIF9hY3RpdmVDZWxsUGF0aCA9ICJAYWN0aXZlQ2VsbCI7CiAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgICAgLy8vIFNldCB0aGUgYWN0aXZlIGNlbGwuIE11c3QgYmUgc2V0IHdpdGhpbiB0aGUgU2VsZWN0ZWRSYW5nZS4KICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgICAgcHVibGljIHN0cmluZyBBY3RpdmVDZWxsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdldAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0cmluZyBhZGRyZXNzID0gR2V0WG1sTm9kZVN0cmluZyhfYWN0aXZlQ2VsbFBhdGgpOwogICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJBMSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW50IGZyb21Db2wsIGZyb21Sb3csIHRvQ29sLCB0b1JvdzsKICAgICAgICAgICAgICAgICAgICBpZihfc2VsZWN0aW9uTm9kZT09bnVsbCkgQ3JlYXRlU2VsZWN0aW9uRWxlbWVudCgpOwogICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3ModmFsdWUsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOwogICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2FjdGl2ZUNlbGxQYXRoLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCgoWG1sRWxlbWVudClUb3BOb2RlKS5HZXRBdHRyaWJ1dGUoInNxcmVmIikgPT0gIiIpCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRSYW5nZSA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOkFkZCBmaXggZm9yIG91dCBvZiByYW5nZSBoZXJlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBwcml2YXRlIHZvaWQgQ3JlYXRlU2VsZWN0aW9uRWxlbWVudCgpCiAgICAgICAgICAgIHsKIAkgICAgICAgICAgICBfc2VsZWN0aW9uTm9kZT1Ub3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwogICAgICAgICAgICAgICAgVG9wTm9kZS5BcHBlbmRDaGlsZChfc2VsZWN0aW9uTm9kZSk7CiAgICAgICAgICAgICAgICBUb3BOb2RlPV9zZWxlY3Rpb25Ob2RlOyAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzdHJpbmcgX3NlbGVjdGlvblJhbmdlUGF0aCA9ICJAc3FyZWYiOwogICAgICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgICAgIC8vLyBTZWxlY3RlZCBDZWxscy5Vc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggQWN0aXZlQ2VsbAogICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgICAgICAgCiAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgU2VsZWN0ZWRSYW5nZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBnZXQKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYWRkcmVzcyA9IEdldFhtbE5vZGVTdHJpbmcoX3NlbGVjdGlvblJhbmdlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkExIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXQKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbUNvbCwgZnJvbVJvdywgdG9Db2wsIHRvUm93OwogICAgICAgICAgICAgICAgICAgIGlmKF9zZWxlY3Rpb25Ob2RlPT1udWxsKSBDcmVhdGVTZWxlY3Rpb25FbGVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgRXhjZWxDZWxsQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyh2YWx1ZSwgb3V0IGZyb21Sb3csIG91dCBmcm9tQ29sLCBvdXQgdG9Sb3csIG91dCB0b0NvbCk7CiAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc2VsZWN0aW9uUmFuZ2VQYXRoLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCgoWG1sRWxlbWVudClUb3BOb2RlKS5HZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiKSA9PSAiIikKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmVDZWxsID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86QWRkIGZpeCBmb3Igb3V0IG9mIHJhbmdlIGhlcmUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgkJcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OwoKCQkjcmVnaW9uIEV4Y2VsV29ya3NoZWV0VmlldyBDb25zdHJ1Y3RvcgoJCS8vLyA8c3VtbWFyeT4KCQkvLy8gQ3JlYXRlcyBhIG5ldyBFeGNlbFdvcmtzaGVldFZpZXcgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIGFsbCB0aGUgdmlldyBzdGF0ZXMgb2YgdGhlIHdvcmtzaGVldC4KCQkvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPjwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj48L3BhcmFtPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ieGxXb3Jrc2hlZXQiPjwvcGFyYW0+CgkJaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXRWaWV3KFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSwgIEV4Y2VsV29ya3NoZWV0IHhsV29ya3NoZWV0KSA6CiAgICAgICAgICAgIGJhc2UobnMsIG5vZGUpCgkJewogICAgICAgICAgICBfd29ya3NoZWV0ID0geGxXb3Jrc2hlZXQ7CiAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJzaGVldFZpZXdzIiwgInNoZWV0VmlldyIsICJwYW5lIiwgInNlbGVjdGlvbiIgfTsKICAgICAgICAgICAgUGFuZXMgPSBMb2FkUGFuZXMoKTsgCgkJfQoKCQkjZW5kcmVnaW9uCiAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldFBhbmVzW10gTG9hZFBhbmVzKCkKICAgICAgICB7CiAgICAgICAgICAgIFhtbE5vZGVMaXN0IG5vZGVzID0gVG9wTm9kZS5TZWxlY3ROb2RlcygiLy9kOnNlbGVjdGlvbiIsIE5hbWVTcGFjZU1hbmFnZXIpOwogICAgICAgICAgICBpZihub2Rlcy5Db3VudD09MCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFdvcmtzaGVldFBhbmVzW10geyBuZXcgRXhjZWxXb3Jrc2hlZXRQYW5lcyhOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlKSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXRQYW5lc1tdIHBhbmVzID0gbmV3IEV4Y2VsV29ya3NoZWV0UGFuZXNbbm9kZXMuQ291bnRdOwogICAgICAgICAgICAgICAgaW50IGk9MDsKICAgICAgICAgICAgICAgIGZvcmVhY2goWG1sRWxlbWVudCBlbGVtIGluIG5vZGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhbmVzW2krK10gPSBuZXcgRXhjZWxXb3Jrc2hlZXRQYW5lcyhOYW1lU3BhY2VNYW5hZ2VyLCBlbGVtKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYW5lczsKICAgICAgICAgICAgfQogICAgICAgIH0KCQkjcmVnaW9uIFNoZWV0Vmlld0VsZW1lbnQKCQkvLy8gPHN1bW1hcnk+CgkJLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNoZWV0VmlldyBlbGVtZW50CgkJLy8vIDwvc3VtbWFyeT4KCQlwcm90ZWN0ZWQgaW50ZXJuYWwgWG1sRWxlbWVudCBTaGVldFZpZXdFbGVtZW50CgkJewoJCQlnZXQgCgkJCXsKCQkJCXJldHVybiAoWG1sRWxlbWVudClUb3BOb2RlOwoJCQl9CgkJfQoJCSNlbmRyZWdpb24KCQkjcmVnaW9uIFRhYlNlbGVjdGVkCiAgICAgICAgcHJpdmF0ZSBYbWxFbGVtZW50IF9zZWxlY3Rpb25Ob2RlID0gbnVsbDsKICAgICAgICBwcml2YXRlIFhtbEVsZW1lbnQgU2VsZWN0aW9uTm9kZQogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9zZWxlY3Rpb25Ob2RlID0gU2hlZXRWaWV3RWxlbWVudC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6c2VsZWN0aW9uIiwgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwogICAgICAgICAgICAgICAgaWYgKF9zZWxlY3Rpb25Ob2RlID09IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX3NlbGVjdGlvbk5vZGUgPSBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CiAgICAgICAgICAgICAgICAgICAgU2hlZXRWaWV3RWxlbWVudC5BcHBlbmRDaGlsZChfc2VsZWN0aW9uTm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gX3NlbGVjdGlvbk5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgI2VuZHJlZ2lvbgogICAgICAgICNyZWdpb24gUHVibGljIE1ldGhvZHMgJiBQcm9wZXJ0aWVzCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUaGUgYWN0aXZlIGNlbGwuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgc3RyaW5nIEFjdGl2ZUNlbGwKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gUGFuZXNbUGFuZXMuR2V0VXBwZXJCb3VuZCgwKV0uQWN0aXZlQ2VsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFBhbmVzW1BhbmVzLkdldFVwcGVyQm91bmQoMCldLkFjdGl2ZUNlbGwgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFNlbGVjdGVkIENlbGxzIGluIHRoZSB3b3Jrc2hlZXQuVXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIEFjdGl2ZUNlbGwKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBzdHJpbmcgU2VsZWN0ZWRSYW5nZQogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBQYW5lc1tQYW5lcy5HZXRVcHBlckJvdW5kKDApXS5TZWxlY3RlZFJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQYW5lc1tQYW5lcy5HZXRVcHBlckJvdW5kKDApXS5TZWxlY3RlZFJhbmdlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBJbmRpY2F0ZXMgaWYgdGhlIHdvcmtzaGVldCBpcyBzZWxlY3RlZCB3aXRoaW4gdGhlIHdvcmtib29rCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBUYWJTZWxlY3RlZAogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHRhYlNlbGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyAgICAvLyBlbnN1cmUgbm8gb3RoZXIgd29ya3NoZWV0IGhhcyBpdHMgdGFiU2VsZWN0ZWQgYXR0cmlidXRlIHNldCB0byAxCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgc2hlZXQgaW4gX3dvcmtzaGVldC5fcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQogICAgICAgICAgICAgICAgICAgICAgICBzaGVldC5WaWV3LlRhYlNlbGVjdGVkID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIFNoZWV0Vmlld0VsZW1lbnQuU2V0QXR0cmlidXRlKCJ0YWJTZWxlY3RlZCIsICIxIik7CiAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBib29rVmlldyA9IF93b3Jrc2hlZXQuV29ya2Jvb2suV29ya2Jvb2tYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOndvcmtib29rVmlldyIsIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKICAgICAgICAgICAgICAgICAgICBpZiAoYm9va1ZpZXcgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2tWaWV3LlNldEF0dHJpYnV0ZSgiYWN0aXZlVGFiIiwgKF93b3Jrc2hlZXQuUG9zaXRpb25JRCAtIDEpLlRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdGFiU2VsZWN0ZWQiLCAiMCIpOwoKICAgICAgICAgICAgfQogICAgICAgIH0KCgkJLy8vIDxzdW1tYXJ5PgoJCS8vLyBTZXRzIHRoZSB2aWV3IG1vZGUgb2YgdGhlIHdvcmtzaGVldCB0byBwYWdlbGF5b3V0CgkJLy8vIDwvc3VtbWFyeT4KCQlwdWJsaWMgYm9vbCBQYWdlTGF5b3V0VmlldwoJCXsKCQkJZ2V0CgkJCXsKICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAdmlldyIpID09ICJwYWdlTGF5b3V0IjsKCQkJfQoJCQlzZXQKCQkJewogICAgICAgICAgICAgICAgaWYgKHZhbHVlKQogICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkB2aWV3IiwgInBhZ2VMYXlvdXQiKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBTaGVldFZpZXdFbGVtZW50LlJlbW92ZUF0dHJpYnV0ZSgidmlldyIpOwoJCQl9CgkJfQogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gU2V0cyB0aGUgdmlldyBtb2RlIG9mIHRoZSB3b3Jrc2hlZXQgdG8gcGFnZWJyZWFrCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBQYWdlQnJlYWtWaWV3CiAgICAgICAgewogICAgICAgICAgICBnZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkB2aWV3IikgPT0gInBhZ2VCcmVha1ByZXZpZXciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHZpZXciLCAicGFnZUJyZWFrUHJldmlldyIpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIFNoZWV0Vmlld0VsZW1lbnQuUmVtb3ZlQXR0cmlidXRlKCJ2aWV3Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBTaG93IGdyaWRsaW5lcyBpbiB0aGUgd29ya3NoZWV0CiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBTaG93R3JpZExpbmVzIAogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHNob3dHcmlkTGluZXMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHNob3dHcmlkTGluZXMiLCB2YWx1ZSA/ICIxIiA6ICIwIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBTaG93IHRoZSBDb2x1bW4vUm93IGhlYWRlcnMgKGNvbnRhaW5nIGNvbHVtbiBsZXR0ZXJzIGFuZCByb3cgbnVtYmVycykKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBib29sIFNob3dIZWFkZXJzCiAgICAgICAgewogICAgICAgICAgICBnZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc2hvd1Jvd0NvbEhlYWRlcnMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHNob3dSb3dDb2xIZWFkZXJzIiwgdmFsdWUgPyAiMSIgOiAiMCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gV2luZG93IHpvb20gbWFnbmlmaWNhdGlvbiBmb3IgY3VycmVudCB2aWV3IHJlcHJlc2VudGluZyBwZXJjZW50IHZhbHVlcy4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyBpbnQgWm9vbVNjYWxlCiAgICAgICAgewogICAgICAgICAgICBnZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkB6b29tU2NhbGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTAgfHwgdmFsdWUgPiA0MDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiWm9vbWUgc2NhbGUgb3V0IG9mIHJhbmdlICgxMC00MDApIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAem9vbVNjYWxlIiwgdmFsdWUuVG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgc2hlZXQgaXMgaW4gJ3JpZ2h0IHRvIGxlZnQnIGRpc3BsYXkgbW9kZS4gV2hlbiBpbiB0aGlzIG1vZGUsQ29sdW1uIEEgaXMgb24gdGhlIGZhciByaWdodCwgQ29sdW1uIEIgO2lzIG9uZSBjb2x1bW4gbGVmdCBvZiBDb2x1bW4gQSwgYW5kIHNvIG9uLiBBbHNvLGluZm9ybWF0aW9uIGluIGNlbGxzIGlzIGRpc3BsYXllZCBpbiB0aGUgUmlnaHQgdG8gTGVmdCBmb3JtYXQuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgYm9vbCBSaWdodFRvTGVmdAogICAgICAgIHsKICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHJpZ2h0VG9MZWZ0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkByaWdodFRvTGVmdCIsIHZhbHVlID09IHRydWUgPyAiMSIgOiAiMCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGludGVybmFsIGJvb2wgV2luZG93UHJvdGVjdGlvbiAKICAgICAgICB7CiAgICAgICAgICAgIGdldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkB3aW5kb3dQcm90ZWN0aW9uIixmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAd2luZG93UHJvdGVjdGlvbiIsdmFsdWUsZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBwYW5lcwogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgcHVibGljIEV4Y2VsV29ya3NoZWV0UGFuZXNbXSBQYW5lcwogICAgICAgIHsKICAgICAgICAgICAgZ2V0OwogICAgICAgICAgICBpbnRlcm5hbCBzZXQ7CiAgICAgICAgfQogICAgICAgIHN0cmluZyBfcGFuZU5vZGVQYXRoID0gImQ6cGFuZSI7CiAgICAgICAgc3RyaW5nIF9zZWxlY3Rpb25Ob2RlUGF0aCA9ICJkOnNlbGVjdGlvbiI7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBGcmVlemUgdGhlIGNvbHVtbnMvcm93cyB0byBsZWZ0IGFuZCBhYm92ZSB0aGUgY2VsbAogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJSb3ciPjwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW4iPjwvcGFyYW0+CiAgICAgICAgcHVibGljIHZvaWQgRnJlZXplUGFuZXMoaW50IFJvdywgaW50IENvbHVtbikKICAgICAgICB7CiAgICAgICAgICAgIC8vVE9ETzpmaXggdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNwbGl0cyBhcyB3ZWxsLgogICAgICAgICAgICBpZiAoUm93ID09IDEgJiYgQ29sdW1uID09IDEpIFVuRnJlZXplUGFuZXMoKTsKICAgICAgICAgICAgc3RyaW5nIHNxUmVmID0gU2VsZWN0ZWRSYW5nZSwgYWN0aXZlQ2VsbCA9IEFjdGl2ZUNlbGw7CiAgICAgICAgICAgIAogICAgICAgICAgICBYbWxFbGVtZW50IHBhbmVOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYW5lTm9kZVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CiAgICAgICAgICAgIGlmIChwYW5lTm9kZSA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9wYW5lTm9kZVBhdGgpOwogICAgICAgICAgICAgICAgcGFuZU5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3BhbmVOb2RlUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYW5lTm9kZS5SZW1vdmVBbGwoKTsgICAvL0NsZWFyIGFsbCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGlmIChDb2x1bW4gPiAxKSBwYW5lTm9kZS5TZXRBdHRyaWJ1dGUoInhTcGxpdCIsIChDb2x1bW4gLSAxKS5Ub1N0cmluZygpKTsKICAgICAgICAgICAgaWYgKFJvdyA+IDEpIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgieVNwbGl0IiwgKFJvdyAtIDEpLlRvU3RyaW5nKCkpOwogICAgICAgICAgICBwYW5lTm9kZS5TZXRBdHRyaWJ1dGUoInRvcExlZnRDZWxsIiwgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKFJvdywgQ29sdW1uKSk7CiAgICAgICAgICAgIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgic3RhdGUiLCAiZnJvemVuIik7CgogICAgICAgICAgICBSZW1vdmVTZWxlY3Rpb24oKTsKCiAgICAgICAgICAgIGlmIChSb3cgPiAxICYmIENvbHVtbj09MSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJhY3RpdmVQYW5lIiwgImJvdHRvbUxlZnQiKTsKICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsPVRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CiAgICAgICAgICAgICAgICBzZWwuU2V0QXR0cmlidXRlKCJwYW5lIiwgImJvdHRvbUxlZnQiKTsKICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDZWxsICE9ICIiKSBzZWwuU2V0QXR0cmlidXRlKCJhY3RpdmVDZWxsIiwgYWN0aXZlQ2VsbCk7CiAgICAgICAgICAgICAgICBpZiAoc3FSZWYgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOwogICAgICAgICAgICAgICAgc2VsLlNldEF0dHJpYnV0ZSgic3FyZWYiLCBzcVJlZik7CiAgICAgICAgICAgICAgICBUb3BOb2RlLkluc2VydEFmdGVyKHNlbCwgcGFuZU5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKENvbHVtbiA+IDEgJiYgUm93ID09IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgiYWN0aXZlUGFuZSIsICJ0b3BSaWdodCIpOwogICAgICAgICAgICAgICAgWG1sRWxlbWVudCBzZWwgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwogICAgICAgICAgICAgICAgc2VsLlNldEF0dHJpYnV0ZSgicGFuZSIsICJ0b3BSaWdodCIpOwogICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUNlbGwgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBhY3RpdmVDZWxsKTsKICAgICAgICAgICAgICAgIGlmIChzcVJlZiAhPSAiIikgc2VsLlNldEF0dHJpYnV0ZSgic3FyZWYiLCBzcVJlZik7CiAgICAgICAgICAgICAgICBUb3BOb2RlLkluc2VydEFmdGVyKHNlbCwgcGFuZU5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJhY3RpdmVQYW5lIiwgImJvdHRvbVJpZ2h0Iik7CiAgICAgICAgICAgICAgICBYbWxFbGVtZW50IHNlbDEgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwogICAgICAgICAgICAgICAgc2VsMS5TZXRBdHRyaWJ1dGUoInBhbmUiLCAidG9wUmlnaHQiKTsKICAgICAgICAgICAgICAgIHN0cmluZyBjZWxsID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKDEsIENvbHVtbik7CiAgICAgICAgICAgICAgICBzZWwxLlNldEF0dHJpYnV0ZSgiYWN0aXZlQ2VsbCIsIGNlbGwpOwogICAgICAgICAgICAgICAgc2VsMS5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgY2VsbCk7CiAgICAgICAgICAgICAgICBwYW5lTm9kZS5QYXJlbnROb2RlLkluc2VydEFmdGVyKHNlbDEsIHBhbmVOb2RlKTsKCiAgICAgICAgICAgICAgICBYbWxFbGVtZW50IHNlbDIgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwogICAgICAgICAgICAgICAgY2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhSb3csIDEpOwogICAgICAgICAgICAgICAgc2VsMi5TZXRBdHRyaWJ1dGUoInBhbmUiLCAiYm90dG9tTGVmdCIpOwogICAgICAgICAgICAgICAgc2VsMi5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBjZWxsKTsKICAgICAgICAgICAgICAgIHNlbDIuU2V0QXR0cmlidXRlKCJzcXJlZiIsIGNlbGwpOwogICAgICAgICAgICAgICAgc2VsMS5QYXJlbnROb2RlLkluc2VydEFmdGVyKHNlbDIsIHNlbDEpOwoKICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsMyA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CiAgICAgICAgICAgICAgICBzZWwzLlNldEF0dHJpYnV0ZSgicGFuZSIsICJib3R0b21SaWdodCIpOwogICAgICAgICAgICAgICAgaWYoYWN0aXZlQ2VsbCE9IiIpIHNlbDMuU2V0QXR0cmlidXRlKCJhY3RpdmVDZWxsIiwgYWN0aXZlQ2VsbCk7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYoc3FSZWYhPSIiKSBzZWwzLlNldEF0dHJpYnV0ZSgic3FyZWYiLCBzcVJlZik7CiAgICAgICAgICAgICAgICBzZWwyLlBhcmVudE5vZGUuSW5zZXJ0QWZ0ZXIoc2VsMywgc2VsMik7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIFBhbmVzPUxvYWRQYW5lcygpOwogICAgICAgIH0KICAgICAgICBwcml2YXRlIHZvaWQgUmVtb3ZlU2VsZWN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vRmluZCBzZWxlY3Rpb24gbm9kZXMgYW5kIHJlbW92ZSB0aGVtICAgICAgICAgICAgCiAgICAgICAgICAgIFhtbE5vZGVMaXN0IHNlbGVjdGlvbnMgPSBUb3BOb2RlLlNlbGVjdE5vZGVzKF9zZWxlY3Rpb25Ob2RlUGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7CiAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgc2VsIGluIHNlbGVjdGlvbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNlbC5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKHNlbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBVbmxvY2sgYWxsIHJvd3MgYW5kIGNvbHVtbnMgdG8gc2Nyb2xsIGZyZWVseQogICAgICAgIC8vLyAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHB1YmxpYyB2b2lkIFVuRnJlZXplUGFuZXMoKQogICAgICAgIHsKICAgICAgICAgICAgc3RyaW5nIHNxUmVmID0gU2VsZWN0ZWRSYW5nZSwgYWN0aXZlQ2VsbCA9IEFjdGl2ZUNlbGw7CgogICAgICAgICAgICBYbWxFbGVtZW50IHBhbmVOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYW5lTm9kZVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CiAgICAgICAgICAgIGlmIChwYW5lTm9kZSAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwYW5lTm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKHBhbmVOb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBSZW1vdmVTZWxlY3Rpb24oKTsKCiAgICAgICAgICAgIFBhbmVzPUxvYWRQYW5lcygpOwoKICAgICAgICAgICAgU2VsZWN0ZWRSYW5nZSA9IHNxUmVmOwogICAgICAgICAgICBBY3RpdmVDZWxsID0gYWN0aXZlQ2VsbDsKICAgICAgICB9CiAgICAgICAgI2VuZHJlZ2lvbgogICAgfQp9Cg==