LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudGVzdHMuZXh0OwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnRlc3RzLk9yZGVyZWRUZXN0U3VpdGU7Ci8qKgogKiBBYnN0cmFjdCBzZXJ2ZXIgdGVzdCBjYXNlLiBVc2UgdGhpcyBoYXJuZXNzIHRvIHRlc3QgYSBzcGVjaWZpYyBzZXJ2ZXIuCiAqIEFsbCB5b3UgaGF2ZSB0byBkbyBpcyBleHRlbmQgdGhpcyBjbGFzcywgaW1wbGVtZW50IHRoZSBhYnN0cmFjdAogKiBtZXRob2QocykgYW5kIGFkZCB0aGUgdGVzdCBjYXNlIHRvIHlvdXIgc3VpdGUuCiAqIDxwPgogKiBZb3UgYXJlIHdlbGNvbWUgdG8gYWRkIHR5cGUtc3BlY2lmaWMgdGVzdHMgdG8gdGhpcyBtZXRob2QuIFRoZSB0ZXN0CiAqIG1ldGhvZCBudW1iZXJzIChpLmUuIHRoZSBYWCBpbiB0ZXN0WFgoKSkgc2hvdWxkIGJlIGJldHdlZW4gMjAwIGFuZCAxMDAwLgogKiA8L3A+CiAqLwpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKCXByb3RlY3RlZCBzdGF0aWMgSVByb2plY3QgcHJvamVjdDsKCXByb3RlY3RlZCBzdGF0aWMgSVByb2plY3RQcm9wZXJ0aWVzIHByb3BzOwoJCglwcm90ZWN0ZWQgc3RhdGljIElTZXJ2ZXIgc2VydmVyOwoJcHJvdGVjdGVkIHN0YXRpYyBJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXJBdHRyOwoJcHJvdGVjdGVkIHN0YXRpYyBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV0M7CgkKCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKCQlyZXR1cm4gbmV3IE9yZGVyZWRUZXN0U3VpdGUoQWJzdHJhY3RTZXJ2ZXJUZXN0Q2FzZS5jbGFzcywgIkFic3RyYWN0U2VydmVyVGVzdENhc2UiKTsKCX0KCQoJcHJvdGVjdGVkIElTZXJ2ZXIgZ2V0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJaWYgKHNlcnZlciA9PSBudWxsKSB7CgkJCXNlcnZlciA9IGNyZWF0ZVNlcnZlcigpOwoJCQkKCQkJLy8gdGVzdCBzYXZlIGFsbAoJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKCQkJd2Muc2F2ZUFsbChmYWxzZSwgbnVsbCk7CgkJfQoJCQoJCXJldHVybiBzZXJ2ZXI7Cgl9CgoJcHVibGljIGFic3RyYWN0IElTZXJ2ZXIgY3JlYXRlU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbjsKCQoJcHVibGljIGFic3RyYWN0IHZvaWQgZGVsZXRlU2VydmVyKElTZXJ2ZXIgc2VydmVyMikgdGhyb3dzIEV4Y2VwdGlvbjsKCglwdWJsaWMgdm9pZCB0ZXN0MDAwMEdldFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJ0ZXN0Iik7CgkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5leGlzdHMoKSkgewoJCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKCQkJcHJvamVjdC5vcGVuKG51bGwpOwoJCX0KCQlwcm9wcyA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Cgl9CgoJcHVibGljIHZvaWQgdGVzdDAwMDFHZXRTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlhc3NlcnROdWxsKHByb3BzLmdldERlZmF1bHRTZXJ2ZXIoKSk7Cgl9CgoJcHVibGljIHZvaWQgdGVzdDAwMDJTZXRTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlwcm9wcy5zZXREZWZhdWx0U2VydmVyKGdldFNlcnZlcigpLCBudWxsKTsKCQlhc3NlcnRFcXVhbHMocHJvcHMuZ2V0RGVmYXVsdFNlcnZlcigpLCBnZXRTZXJ2ZXIoKSk7Cgl9CgoJcHVibGljIHZvaWQgdGVzdDAwMDNVblNldFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewoJCXByb3BzLnNldERlZmF1bHRTZXJ2ZXIobnVsbCwgbnVsbCk7CgkJYXNzZXJ0TnVsbChwcm9wcy5nZXREZWZhdWx0U2VydmVyKCkpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3QwMDA0RW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Cgl9CgoJcHVibGljIHZvaWQgdGVzdDAwMDVEZWxlZ2F0ZSgpIHRocm93cyBFeGNlcHRpb24gewoJCWdldFNlcnZlcigpLmdldEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3QwMDA2RGVsZWdhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlnZXRTZXJ2ZXIoKS5nZXRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMDdQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJZ2V0U2VydmVyKCkucHVibGlzaChJU2VydmVyLlBVQkxJU0hfRlVMTCwgbnVsbCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDA4Q2FuUnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJYXNzZXJ0VHJ1ZShnZXRTZXJ2ZXIoKS5jYW5TdGFydChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSkuaXNPSygpKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMDlSdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlnZXRTZXJ2ZXIoKS5zeW5jaHJvbm91c1N0YXJ0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBudWxsKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMTBDYW5TdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJYXNzZXJ0VHJ1ZShnZXRTZXJ2ZXIoKS5jYW5TdG9wKCkuaXNPSygpKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMTFTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJZ2V0U2VydmVyKCkuc3luY2hyb25vdXNTdG9wKGZhbHNlKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMTJDYW5EZWJ1ZygpIHRocm93cyBFeGNlcHRpb24gewoJCWFzc2VydFRydWUoZ2V0U2VydmVyKCkuY2FuU3RhcnQoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSkuaXNPSygpKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMTNEZWJ1ZygpIHRocm93cyBFeGNlcHRpb24gewoJCXNlcnZlci5zeW5jaHJvbm91c1N0YXJ0KElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUsIG51bGwpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAxNENhblN0b3AoKSB7CgkJYXNzZXJ0VHJ1ZShzZXJ2ZXIuY2FuU3RvcCgpLmlzT0soKSk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDE1U3RvcCgpIHsKCQlzZXJ2ZXIuc3luY2hyb25vdXNTdG9wKGZhbHNlKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMTZHZXRTZXJ2ZXJQb3J0cygpIHsKCQlTZXJ2ZXJQb3J0W10gcG9ydHMgPSBzZXJ2ZXIuZ2V0U2VydmVyUG9ydHMobnVsbCk7CgkJaWYgKHBvcnRzICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBwb3J0cy5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlwb3J0c1tpXS5nZXRJZCgpOwoJCQkJcG9ydHNbaV0uZ2V0Q29udGVudFR5cGVzKCk7CgkJCQlwb3J0c1tpXS5nZXROYW1lKCk7CgkJCQlwb3J0c1tpXS5nZXRQb3J0KCk7CgkJCQlwb3J0c1tpXS5nZXRQcm90b2NvbCgpOwoJCQkJcG9ydHNbaV0uaXNBZHZhbmNlZCgpOwoJCQkJcG9ydHNbaV0udG9TdHJpbmcoKTsKCQkJCXBvcnRzW2ldLmVxdWFscyhudWxsKTsKCQkJCXBvcnRzW2ldLmhhc2hDb2RlKCk7CgkJCX0KCQl9Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDE3R2V0U2VydmVyU3RhdGUoKSB7CgkJc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDE4R2V0U2VydmVyUHVibGlzaFN0YXRlKCkgewoJCXNlcnZlci5nZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMTlHZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSB7CgkJc2VydmVyLmdldFNlcnZlclJlc3RhcnRTdGF0ZSgpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAyMEdldE1vZHVsZVN0YXRlKCkgewoJCXNlcnZlci5nZXRNb2R1bGVTdGF0ZShudWxsKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMjFHZXRNb2R1bGVQdWJsaXNoU3RhdGUoKSB7CgkJc2VydmVyLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShudWxsKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMjJHZXRNb2R1bGVSZXN0YXJ0U3RhdGUoKSB7CgkJc2VydmVyLmdldE1vZHVsZVJlc3RhcnRTdGF0ZShudWxsKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMjNHZXRNb2RlKCkgewoJCXNlcnZlci5nZXRNb2RlKCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDI0Q2FuUHVibGlzaCgpIHsKCQlzZXJ2ZXIuY2FuUHVibGlzaCgpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAyNUNhblJlc3RhcnQoKSB7CgkJc2VydmVyLmNhblJlc3RhcnQoInJ1biIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAyNkNhblJlc3RhcnRNb2R1bGUoKSB7CgkJc2VydmVyLmNhblJlc3RhcnRNb2R1bGUobnVsbCwgbnVsbCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDI3QWRkU2VydmVyTGlzdGVuZXIoKSB7CgkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKG51bGwpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAyOEFkZFNlcnZlckxpc3RlbmVyKCkgewoJCXNlcnZlci5hZGRTZXJ2ZXJMaXN0ZW5lcihudWxsLCAwKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMjlSZW1vdmVTZXJ2ZXJMaXN0ZW5lcigpIHsKCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIobnVsbCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDMwR2V0U2VydmVyQXR0cmlidXRlcygpIHsKCQlzZXJ2ZXJBdHRyID0gc2VydmVyOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAzMUdldE5hbWUoKSB7CgkJc2VydmVyQXR0ci5nZXROYW1lKCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDMyR2V0SWQoKSB7CgkJc2VydmVyQXR0ci5nZXRJZCgpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAzM0lzUmVhZE9ubHkoKSB7CgkJc2VydmVyQXR0ci5pc1JlYWRPbmx5KCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDM0SXNXb3JraW5nQ29weSgpIHsKCQlzZXJ2ZXJBdHRyLmlzV29ya2luZ0NvcHkoKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMzVHZXRIb3N0KCkgewoJCXNlcnZlckF0dHIuZ2V0SG9zdCgpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAzNkdldFJ1bnRpbWUoKSB7CgkJc2VydmVyQXR0ci5nZXRSdW50aW1lKCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDM3R2V0U2VydmVyVHlwZSgpIHsKCQlzZXJ2ZXJBdHRyLmdldFNlcnZlclR5cGUoKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwMzhHZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgewoJCXNlcnZlckF0dHIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDAzOUNyZWF0ZVdvcmtpbmdDb3B5KCkgewoJCXNlcnZlckF0dHIuY3JlYXRlV29ya2luZ0NvcHkoKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwNDBHZXRNb2R1bGVzKCkgewoJCXNlcnZlckF0dHIuZ2V0TW9kdWxlcygpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDA0MUNhbk1vZGlmeU1vZHVsZXMoKSB7CgkJc2VydmVyQXR0ci5jYW5Nb2RpZnlNb2R1bGVzKG51bGwsIG51bGwsIG51bGwpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDA0MkdldENoaWxkTW9kdWxlcygpIHsKCQlzZXJ2ZXJBdHRyLmdldENoaWxkTW9kdWxlcyhudWxsLCBudWxsKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwNDNHZXRSb290TW9kdWxlcygpIHsKCQl0cnkgewoJCQlzZXJ2ZXJBdHRyLmdldFJvb3RNb2R1bGVzKG51bGwsIG51bGwpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0KCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwNDRHZXRTZXJ2ZXJQb3J0cygpIHsKCQlzZXJ2ZXJBdHRyLmdldFNlcnZlclBvcnRzKG51bGwpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDA0NURlbGV0ZSgpIHsKCQl0cnkgewoJCQlJU2VydmVyQXR0cmlidXRlcyBzYSA9IHNlcnZlckF0dHIuY3JlYXRlV29ya2luZ0NvcHkoKTsKCQkJc2EuZGVsZXRlKCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJLy8gaWdub3JlCgkJfQoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDA0NkNyZWF0ZVdvcmtpbmdDb3B5KCkgewoJCXNlcnZlcldDID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDQ3SXNEaXJ0eSgpIHsKCQlhc3NlcnRGYWxzZShzZXJ2ZXJXQy5pc0RpcnR5KCkpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDA0OFNldE5hbWUoKSB7CgkJc2VydmVyV0Muc2V0TmFtZSgidGVzdCIpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDA0OVNldEhvc3QoKSB7CgkJc2VydmVyV0Muc2V0SG9zdCgid3d3LmVjbGlwc2Uub3JnIik7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDUwU2V0UmVhZE9ubHkoKSB7CgkJc2VydmVyV0Muc2V0UmVhZE9ubHkodHJ1ZSk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDUxSXNEaXJ0eSgpIHsKCQlhc3NlcnRUcnVlKHNlcnZlcldDLmlzRGlydHkoKSk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDUyQWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKCQlzZXJ2ZXJXQy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG51bGwpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDA1M1JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CgkJc2VydmVyV0MucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihudWxsKTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdDAwNTRHZXRPcmlnaW5hbCgpIHsKCQlzZXJ2ZXJXQy5nZXRPcmlnaW5hbCgpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3QwMDU1U2V0U2VydmVyQ29uZmlndXJhdGlvbigpIHsKCQlzZXJ2ZXJXQy5zZXRTZXJ2ZXJDb25maWd1cmF0aW9uKG51bGwpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0MDA1Nk1vZGlmeU1vZHVsZXMoKSB7CgkJdHJ5IHsKCQkJc2VydmVyV0MubW9kaWZ5TW9kdWxlcyhudWxsLCBudWxsLCBudWxsKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3QwMDU3Q2xlYXIoKSB7CgkJc2VydmVyQXR0ciA9IG51bGw7CgkJc2VydmVyV0MgPSBudWxsOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3QxMDAxRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJZGVsZXRlU2VydmVyKGdldFNlcnZlcigpKTsKCQlzZXJ2ZXIgPSBudWxsOwoJfQp9