q0lNUE9SVCBlbWa7CqtJTVBPUlQgbWV0YWFibbsKq0lNUE9SVCBtZXRhYWJtOjphY3S7CqtJTVBPUlQgbWV0YWFibTo6ZnVuY3Rpb267CgqrRVhURU5TSU9OIG1ldGFhYm06OnRtcGw6Om5hbWVzuwqrRVhURU5TSU9OIG1ldGFhYm06OnRtcGw6OnR5cGVzuwqrRVhURU5TSU9OIG1ldGFhYm06OnRtcGw6OmluZmVyuwqrRVhURU5TSU9OIG1ldGFhYm06OnRtcGw6OnV0aWy7CqtFWFRFTlNJT04gbWV0YWFibTo6dG1wbDo6cHJvamVjdGlvbnO7CqtFWFRFTlNJT04gbWV0YWFibTo6YXNjYXBlOjp0bXBsOjppbmZlcmFzY2FwZbsgCqtFWFRFTlNJT04gbWV0YWFibTo6YXNjYXBlOjp0bXBsOjpuYW1lc2FzY2FwZbsgCgqrQVJPVU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkV4dGVuZFR5cGUgRk9SIFNQcm9qZWN0aW9uLbtTY2FwZatFTkRBUk9VTkS7CqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6RXh0ZW5kVHlwZSBGT1IgU0NvbnRleHQtu6t0eXBlTmFtZSgpLburRU5EQVJPVU5EuwqrQVJPVU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkV4dGVuZFR5cGUgRk9SIFNBZ2VudC27q3BrZ20oKS27U2NhcGWrRU5EQVJPVU5EuwoKq0FST1VORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpDbGFzc0luaGVpcml0YW5jZSBGT1IgU0NvbnRleHQtuyBleHRlbmRzIFNjYXBlq0VOREFST1VORLsKq0FST1VORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpDbGFzc0luaGVpcml0YW5jZSBGT1IgU0FnZW50LbsgZXh0ZW5kcyCrZXh0ZW5kVHlwZSgpu6tFTkRBUk9VTkS7CqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6Q2xhc3NJbmhlaXJpdGFuY2UgRk9SIFNTdHlsZS27IGV4dGVuZHMgRHJhd0ZlYXR1cmWrRU5EQVJPVU5EuwoKq0FST1VORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpJbXBvcnRzIEZPUiBTU3R5bGUtuwppbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7CmltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwppbXBvcnQgamF2YS5hd3QuU2hhcGU7CmltcG9ydCBqYXZhLmF3dC5nZW9tLkVsbGlwc2UyRDsKaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CmltcG9ydCBvcmcuYXNjYXBlLnV0aWwudmlzLkRyYXdGZWF0dXJlOwoKaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuQ2VsbE9jY3VwYW50OwppbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5Ib3N0Q2VsbDsKq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6SW1wb3J0cyBGT1IgU0FnZW50LbsKCWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKCWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKCWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwoJCglpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKCWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CgkKCWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkFnZW50OwoJaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuQ2VsbDsKCWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkNlbGxPY2N1cGFudDsKCWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLkhvc3RDZWxsOwoJaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuTG9jYXRlZEFnZW50OwoJaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuU2NhcGU7CglpbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5ldmVudC5TY2FwZUV2ZW50OwoJaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwucnVsZS5SdWxlOwoJaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwucnVsZS5FeGVjdXRlVGhlblVwZGF0ZTsKCWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvbGxlY3Rpb25TcGFjZTsKCWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkNvb3JkaW5hdGU7CglpbXBvcnQgb3JnLmFzY2FwZS5tb2RlbC5zcGFjZS5Db29yZGluYXRlMkREaXNjcmV0ZTsKCWltcG9ydCBvcmcuYXNjYXBlLm1vZGVsLnNwYWNlLkdyYXBoOwoJaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuU2luZ2xldG9uOwoJaW1wb3J0IG9yZy5hc2NhcGUubW9kZWwuc3BhY2UuTG9jYXRpb247CglpbXBvcnQgb3JnLmFzY2FwZS51dGlsLkNvbmRpdGlvbmFsOwoJCgmrdGFyZ2V0RGVmLnByb2NlZWQoKbsKq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6Qm9keSBGT1IgU0FnZW50LbsKCat0YXJnZXREZWYucHJvY2VlZCgpuwoJq0VYUEFORCBtZXRhYWJtOjphc2NhcGU6OnRtcGw6OlNjYXBlQXNwZWN0OjpBZ2VudEJvZHktuwoJCgmrRVhQQU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkdlbmVyYXRlQ29tbWVudLsKICAgIHB1YmxpYyBDb2xvciBnZXRDb2xvcigpIHsKICAgIAlyZXR1cm4gQ29sb3IuTElHSFRfR1JBWTsKICAgIH0Kq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6Qm9keSBGT1IgU0NvbnRleHQtuwogICAgq0VYUEFORCBtZXRhYWJtOjphc2NhcGU6OnRtcGw6OlNjYXBlQXNwZWN0OjpTY2FwZUJvZHktuwogICAgCgmrRVhQQU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkdlbmVyYXRlQ29tbWVudLsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQkobmV3IG9yZy5hc2NhcGUucnVudGltZS5zd2luZy5Td2luZ1J1bm5lcigpKS5vcGVuKCKraW1wbGVtZW50YXRpb24ucXVhbGlmaWVkTmFtZbsiLCBhcmdzKTsKCX0Kq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6Qm9keSBGT1IgU1N0eWxlLbsKCat0YXJnZXREZWYucHJvY2VlZCgpuwoJCgmrRVhQQU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkdlbmVyYXRlQ29tbWVudLsKICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MgZywgT2JqZWN0IG9iamVjdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAJU2hhcGUgc2hhcGUgPSBudWxsOwoJCatJRiBhZ2VudC5pc0hvc3QoKS27CgkJCathZ2VudC50eXBlTmFtZSgpuyCrcm9vdEFjdGl2aXR5LmlkKCm7ID0gKKthZ2VudC50eXBlTmFtZSgpuykgb2JqZWN0OwoJCQmrRk9SRUFDSCAoKEFHcm91cCkgcm9vdEFjdGl2aXR5KS5yb290cyBBUyBhY3S7q2FnZW50LnR5cGVOYW1lKCm7IKthY3QuaWQoKbsgPSCrcm9vdEFjdGl2aXR5LmlkKCm7O6tFTkRGT1JFQUNIuwoJCQmrRVhQQU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkFjdGlvbkJvZHktuwoJCatFTFNFLbsKCSAgICAgICAgSG9zdENlbGwgq3Jvb3RBY3Rpdml0eS5pZCgpu0NlbGwgPSAoSG9zdENlbGwpIG9iamVjdDsKCSAgICAgICAgaWYgKKtyb290QWN0aXZpdHkuaWQoKbtDZWxsLmdldE9jY3VwYW50KCkgaW5zdGFuY2VvZiCrYWdlbnQudHlwZU5hbWUoKbspIHsKCQkJCathZ2VudC50eXBlTmFtZSgpuyCrcm9vdEFjdGl2aXR5LmlkKCm7ID0gKKthZ2VudC50eXBlTmFtZSgpuykgq3Jvb3RBY3Rpdml0eS5pZCgpu0NlbGwuZ2V0T2NjdXBhbnQoKTsKCQkJCatGT1JFQUNIICgoQUdyb3VwKSByb290QWN0aXZpdHkpLnJvb3RzIEFTIGFjdLurYWdlbnQudHlwZU5hbWUoKbsgq2FjdC5pZCgpuyA9IKtyb290QWN0aXZpdHkuaWQoKbs7q0VOREZPUkVBQ0i7CgkJCQmrRVhQQU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkFjdGlvbkJvZHktuwoJCQl9CgkJq0VORElGLbsKCX0Kq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6YXNjYXBlOjp0bXBsOjpTY2FwZUFzcGVjdDo6Vmlld0J1aWxkZXIgRk9SIEFHcm91cC27Cgl7CiAgICCrdGFyZ2V0RGVmLnByb2NlZWQoKS27CiAgICB9Cgl7CglvcmcuYXNjYXBlLnZpZXcudmlzLkNoYXJ0VmlldyBjaGFydCA9IG5ldyBvcmcuYXNjYXBlLnZpZXcudmlzLkNoYXJ0VmlldygpOwogICAgYWRkVmlldyhjaGFydCk7CgkvL2lmIChnZXRSdW5uZXIoKS5nZXRFbnZpcm9ubWVudCgpIGluc3RhbmNlb2Ygb3JnLmFzY2FwZS5ydW50aW1lLmFwcGxldC5BcHBsZXRFbnZpcm9ubWVudCkgewogICAgLy8gICAgY2hhcnQuZ2V0Q2hhcnQoKS5nZXRMZWdlbmQoKS5zZXRBbmNob3IoY29tLmpyZWZpbmVyeS5jaGFydC5MZWdlbmQuU09VVEgpOwoJLy99CglHcmFwaGljcyBkdW1teUdyYXBoaWNzID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoMTAsIDEwLCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQikuZ2V0R3JhcGhpY3MoKTsKCiAgICCrRk9SRUFDSCAoKFNDb250ZXh0KSByZWZlcmVuY2UpLmFnZW50cyBBUyBhZ2VudLsKICAgIKtJRiAhYWdlbnQuc3R5bGVzLmlzRW1wdHktuwogICAgZmluYWwgq2FnZW50Lm93bmVyLnR5cGVOYW1lKCm7IKthZ2VudC5pZCgpu1NjYXBlID0gbmV3IKthZ2VudC5vd25lci50eXBlTmFtZSgpuygpOwogICAgq2FnZW50LmlkKCm7U2NhcGUuc2V0UnVubmVyKG5ldyBvcmcuYXNjYXBlLnJ1bnRpbWUuTm9uR3JhcGhpY1J1bm5lcigpKTsKCathZ2VudC50eXBlTmFtZSgpuyCrYWdlbnQuaWQoKbsgPSBuZXcgq2FnZW50LnR5cGVOYW1lKCm7KCkgewoJCQkJq0VYUEFORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpHZW5lcmF0ZUNvbW1lbnS7CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlKCkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgq0VYUEFORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpHZW5lcmF0ZUNvbW1lbnS7CiAgICAgICAgICAgICAgICBwdWJsaWMgq2FnZW50Lm93bmVyLnR5cGVOYW1lKCm7IGdldKthZ2VudC5vd25lci50eXBlTmFtZSgpuygpIHsKICAgICAgICAgICAgICAgIAlyZXR1cm4gq2FnZW50LmlkKCm7U2NhcGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICCrYWdlbnQuaWQoKbtTY2FwZS5hZGQoq2FnZW50LmlkKCm7KTsKCatJRiAhYWdlbnQuaXNIb3N0KCktuwoJb3JnLmFzY2FwZS5tb2RlbC5Ib3N0Q2VsbCCrYWdlbnQuaWQoKbtIb3N0ID0gbmV3IG9yZy5hc2NhcGUubW9kZWwuSG9zdENlbGwoKSB7CgkJCQmrRVhQQU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkdlbmVyYXRlQ29tbWVudLsKICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGUoKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgmrYWdlbnQuaWQoKbtIb3N0LnNldE9jY3VwYW50KChvcmcuYXNjYXBlLm1vZGVsLkNlbGxPY2N1cGFudCkgq2FnZW50LmlkKCm7KTsKCatFTkRJRi27CgmrRU5ESUYtuwogICAgq0ZPUkVBQ0ggYWdlbnQuc3R5bGVzIEFTIHN0eWxluwoJq3N0eWxlLnR5cGVOYW1lKCm7IKtzdHlsZS5pZCgpuyA9IG5ldyCrc3R5bGUudHlwZU5hbWUoKbsoKTsKCatGT1JFQUNIIHN0eWxlLnNldHRlclNwYWNlKCkgQVMgc2V0dGVyuwogICAgqygoTGlzdCkgc2V0dGVyKS5sYXN0KCm7OwoJq0lGIGFnZW50LmlzSG9zdCgpLbsKICAgIKtzdHlsZS5pZCgpuy5kcmF3KGR1bW15R3JhcGhpY3MsIKthZ2VudC5pZCgpuywgNCwgNCk7CiAgICCrRUxTRbsKICAgIKtzdHlsZS5pZCgpuy5kcmF3KGR1bW15R3JhcGhpY3MsIKthZ2VudC5pZCgpu0hvc3QsIDQsIDQpOwogICAgq0VORElGLbsKICAgIHsKICAgIENvbG9yIGFnZW50Q29sb3IgPSBkdW1teUdyYXBoaWNzLmdldENvbG9yKCk7CgljaGFydC5hZGRTZXJpZXMoIkNvdW50IKthZ2VudC50eXBlTmFtZSgpuyCrKChMaXN0KSBzZXR0ZXIpLmZpcnN0KCm7IiwgYWdlbnRDb2xvcik7Cgl9CiAgICCrRU5ERk9SRUFDSC27CiAgICCrRU5ERk9SRUFDSC27CiAgICCrRU5ERk9SRUFDSC27CiAgICB9CqtFTkRBUk9VTkS7CgqrREVGSU5FIFN0eWxlQnVpbGRlciAoU1Byb2plY3Rpb24gcHJvamVjdGlvbikgRk9SIFNTdHlsZS27CiAgICAgICAgq0lGIGFwcHJvcHJpYXRlKHByb2plY3Rpb24sIHRoaXMpLbsKICAgICAgICBvcmcuYXNjYXBlLnV0aWwudmlzLkRyYXdGZWF0dXJlIKtpZCgpuyA9IG5ldyCraW1wbGVtZW50YXRpb24ucXVhbGlmaWVkTmFtZbsoKTsKICAgICAgICCraWQoKbsuc2V0TmFtZSgiq2xhYmVsuyIpOwogICAgICAgIKtwcm9qZWN0aW9uLmZpZWxkTmFtZSgpuy5hZGREcmF3RmVhdHVyZSiraWQoKbspOwogICAgICAgIKtFTkRJRi27CqtFTkRERUZJTkW7CqtERUZJTkUgU3R5bGVTZWxlY3RvciAoU1Byb2plY3Rpb24gcHJvamVjdGlvbikgRk9SIFNTdHlsZS27CiAgICAgICAgq0lGIGFwcHJvcHJpYXRlKHByb2plY3Rpb24sIHRoaXMpLbsKICAgICAgICCrcHJvamVjdGlvbi5pZCgpu1ZpZXcuZ2V0RHJhd1NlbGVjdGlvbigpLnNldFNlbGVjdGVkKKtpZCgpuywgdHJ1ZSk7CiAgICAgICAgq0VORElGLbsKq0VORERFRklORbsKq0RFRklORSBTdHlsZVNlbGVjdG9yIChTUHJvamVjdGlvbiBwcm9qZWN0aW9uKSBGT1IgU1Byb2plY3Rpb24tu6tFTkRERUZJTkW7CqtERUZJTkUgU3R5bGVTZWxlY3RvciAoU1Byb2plY3Rpb24gcHJvamVjdGlvbikgRk9SIFNHcmlkLbsKICAgICAgICCraWQoKbtWaWV3LmdldERyYXdTZWxlY3Rpb24oKS5zZXRTZWxlY3RlZCiraWQoKbtWaWV3LmFnZW50c19vdmFsX2NlbGxzX2RyYXdfZmVhdHVyZSwgZmFsc2UpOwogICAgICAgIKtpZCgpu1ZpZXcuZ2V0RHJhd1NlbGVjdGlvbigpLnNldFNlbGVjdGVkKKtpZCgpu1ZpZXcuY2VsbHNfZmlsbF9kcmF3X2ZlYXR1cmUsIHRydWUpOwogICAgICAgIKtpZCgpu1ZpZXcuZ2V0RHJhd1NlbGVjdGlvbigpLm1vdmVUb0Zyb250KKtpZCgpu1ZpZXcuY2VsbHNfZmlsbF9kcmF3X2ZlYXR1cmUpOwqrRU5EREVGSU5FuwqrQVJPVU5EIG1ldGFhYm06OmFzY2FwZTo6dG1wbDo6U2NhcGVBc3BlY3Q6OlZpZXdCdWlsZGVyIEZPUiBBQnVpbGRHcmlkLbsKCatJRiAocHJvamVjdGlvbi5kZWZhdWx0VmlldygpICE9IG51bGwpLbsKCQmrcHJvamVjdGlvbi5kZWZhdWx0VmlldygpuyCrcHJvamVjdGlvbi5pZCgpu1ZpZXcgPSBuZXcgq3Byb2plY3Rpb24uZGVmYXVsdFZpZXcoKbsoKTsKCQmrcHJvamVjdGlvbi5pZCgpu1ZpZXcuc2V0QWdlbnRTaXplKKsoKFNHcmlkKSBwcm9qZWN0aW9uKS5hZ2VudFBpeGVsU2l6ZSgpuyk7CgkJq3Byb2plY3Rpb24uZmllbGROYW1lKCm7LmFkZFZpZXcoq3Byb2plY3Rpb24uaWQoKbtWaWV3KTsKCQmrSUYgISgoU0NvbnRleHQpIHJlZmVyZW5jZSkucHJvamVjdGlvbnMudHlwZVNlbGVjdChTTmV0d29yaykuaXNFbXB0eS27CgkJq3Byb2plY3Rpb24uaWQoKbtWaWV3LnNldERyYXdOZXR3b3JrKHRydWUpOwoJCatFTkRJRi27CgkJq0lGIGZpbGxBZ2VudCAhPSBudWxsLbsKICAgICAgICCrRVhQQU5EIFN0eWxlQnVpbGRlciAocHJvamVjdGlvbikgRk9SRUFDSCBmaWxsQWdlbnQuc3R5bGVzLbsKICAgICAgICCrRU5ESUYtuwogICAgICAgIKtGT1JFQUNIIGFnZW50cyBBUyBidWlsZEFnZW50LbsKICAgICAgICCrRVhQQU5EIFN0eWxlQnVpbGRlciAocHJvamVjdGlvbikgRk9SRUFDSCBidWlsZEFnZW50LnN0eWxlcy27CiAgICAgICAgq0VOREZPUkVBQ0gtuwogICAgICAgIKtGT1JFQUNIIGFnZW50cyBBUyBidWlsZEFnZW50LbsKICAgICAgICCrRVhQQU5EIFN0eWxlU2VsZWN0b3IgKHByb2plY3Rpb24pIEZPUkVBQ0ggYnVpbGRBZ2VudC5zdHlsZXMtuwogICAgICAgIKtFTkRGT1JFQUNILbsKCQmrSUYgZmlsbEFnZW50ICE9IG51bGwtuwogICAgICAgIKtFWFBBTkQgU3R5bGVTZWxlY3RvciAocHJvamVjdGlvbikgRk9SRUFDSCBmaWxsQWdlbnQuc3R5bGVzLbsKICAgICAgICCrRU5ESUYtuwogICAgICAgIKtFWFBBTkQgU3R5bGVTZWxlY3RvciAocHJvamVjdGlvbikgRk9SIHByb2plY3Rpb24tuwoJq0VORElGLbsKq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6SW5uZXJCbG9jayAoTGlzdFttZXRhYWJtOjphY3Q6OkFBY3RdIHBhdGgsIEJvb2xlYW4gaW5uZXIpIEZPUiBBRXZhbHVhdGUtuwoJq0lGIGZ1bmN0aW9uLmlkKCkuc3RhcnRzV2l0aCgiY29sb3IiKS27CgkJq3RhcmdldERlZi5wcm9jZWVkKCm7CgkJZy5zZXRDb2xvciiraWQoKbspOwoJq0VMU0VJRiBmdW5jdGlvbi5pZCgpID09ICJzaGFwZU92YWwiLbsKCQlzaGFwZSA9IG5ldyBFbGxpcHNlMkQuRG91YmxlKDAsIDAsIHdpZHRoIC0gMiwgaGVpZ2h0IC0gMik7CgmrRUxTRUlGIGZ1bmN0aW9uLmlkKCkgPT0gInNoYXBlUmVjdGFuZ2xlIi27CgkJq0lGICFyZWZlcmVuY2UuaXNIb3N0KCktuwoJCXNoYXBlID0gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpOwoJCatFTFNFLbsKCQlzaGFwZSA9IG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7CgkJq0VORElGLbsKCatFTFNFSUYgZnVuY3Rpb24uaWQoKSA9PSAic2hhcGVNYXJrZXIiLbsKICAgICAgICBzaGFwZSA9IG5ldyBFbGxpcHNlMkQuRG91YmxlKHdpZHRoICogLjI1IC0gMSwgd2lkdGggKiAuMjUgLSAxLCB3aWR0aCAqIC41IC0gMSwgd2lkdGggKiAuNSAtIDEpOwoJq0VMU0VJRiBmdW5jdGlvbi5pZCgpLnN0YXJ0c1dpdGgoImdyYXBoaWNGaWxsIiktuwogICAgICAgICgoR3JhcGhpY3MyRCkgZykuZmlsbChzaGFwZSk7CgmrRUxTRUlGIGZ1bmN0aW9uLmlkKCkuc3RhcnRzV2l0aCgiZ3JhcGhpY091dGxpbmUiKS27CiAgICAgICAgKChHcmFwaGljczJEKSBnKS5kcmF3KHNoYXBlKTsKICAgIKtFTFNFLbsKCSAJq0lGIHNlbGVjdGVkID09IHJvb3RTZWxlY3RlZCB8fCBhbGxUYXJnZXRzLnR5cGVTZWxlY3QoQVNldCkuY29sbGVjdChlIHwgZS5wYXJhbWV0ZXIpLnNpemUgPiAwLbsKCQkJq3RhcmdldERlZi5wcm9jZWVkKCm7CgkJq0VORElGLbsKCatFTkRJRi27CqtFTkRBUk9VTkS7CgqrQVJPVU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkZ1bmN0aW9uSW5uZXJCbG9jayAoTGlzdFttZXRhYWJtOjphY3Q6OkFBY3RdIHBhdGgsIEJvb2xlYW4gaW5uZXIpIEZPUiBBU2luay27CiAgICCrSUYgZnVuY3Rpb24uaWQoKSA9PSAicmFuZG9tVW5pdCItuwogICAgICAgIGdldFJhbmRvbSgpLm5leHREb3VibGUoKQogICAgq0VMU0VJRiBmdW5jdGlvbi5pZCgpID09ICJyYW5kb21JcyItuwogICAgICAgIGdldFJhbmRvbSgpLm5leHRCb29sZWFuKCkKICAgIKtFTFNFSUYgZnVuY3Rpb24uaWQoKSA9PSAidW5pZm9ybURpc3RyaWJ1dGlvbiItuwogICAgICAgIHJhbmRvbUluUmFuZ2Uoq2lucHV0cy5leHByZXNzaW9uKHBhdGgsIGlubmVyKS50b1N0cmluZygiLCAiKbspOwoJq0VMU0VJRiBmdW5jdGlvbi5pZCgpID09ICJ0aW1lTm93Ii27CgkJq3BhdGgubGFzdCgpLmFjY2Vzc1BhdGgodGhpcywgaW5uZXIpu6tyZWZlcmVuY2Uub3duZXIucGFyZW50ICE9IG51bGwgPyAiZ2V0U2NhcGUoKS4iIDogIiK7Z2V0UGVyaW9kKCkKICAgIKtFTFNFSUYgZnVuY3Rpb24uaWQoKSA9PSAiYXZhaWxhYmxlIi27CiAgICAgICAgaXNBdmFpbGFibGUoKQogICAgq0VMU0VJRiBmdW5jdGlvbi5pZCgpID09ICJ3aXRoaW5Cb3VuZGFyaWVzIi27CiAgICAgICAgq2V4cHJlc3Npb25TaW5rKHBhdGgsIGZ1bmN0aW9uLCBpbm5lcim7CgmrRUxTRS27CgkJq3RhcmdldERlZi5wcm9jZWVkKCm7CgmrRU5ESUYtuwqrRU5EQVJPVU5EuwoKq0FST1VORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpPdGhlckFjY2Vzc29ycyBGT1IgU0FnZW50LbsKCat0YXJnZXREZWYucHJvY2VlZCgpLbsKICAgIKtFWFBBTkQgbWV0YWFibTo6YXNjYXBlOjp0bXBsOjpTY2FwZUFzcGVjdDo6TmFtZUFjY2Vzc29yLbsKq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6QnVpbGRlciBGT1IgU0FnZW50LbsKCatJRiAocm9vdEFjdGl2aXR5ICE9IG51bGwpLbsKCQmrRVhQQU5EIG1ldGFhYm06OmFzY2FwZTo6dG1wbDo6U2NhcGVBc3BlY3Q6OkNoaWxkQnVpbGRlciBGT1Igcm9vdEFjdGl2aXR5LbsKCatFTkRJRi27CqtFTkRBUk9VTkS7CgqrQVJPVU5EIG1ldGFhYm06OnRtcGw6OkphdmE6Ok1ldGhvZFBvdGVudGlhbCAobWV0YWFibTo6YWN0OjpBQWN0IHdpdGhpbikgRk9SIEZGdW5jdGlvbi27CgmrSUYgKGlkKCkgPT0gIndpdGhpbkJvdW5kYXJpZXMiKSB8fCAoaWQoKSA9PSAiZGlzdGFuY2UiKS27CgkJq0VYUEFORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpNZXRob2QtuwoJq0VMU0UtuwoJCat0YXJnZXREZWYucHJvY2VlZCgpLbsKCatFTkRJRi27CqtFTkRBUk9VTkS7CgqrQVJPVU5EIG1ldGFhYm06OnRtcGw6OkphdmE6Ok1ldGhvZFBvdGVudGlhbCAobWV0YWFibTo6YWN0OjpBQWN0IHdpdGhpbikgRk9SIEFRdWVyeS27CgmrSUYgKGZ1bmN0aW9uLmlkKCkgPT0gIm1pbmltaXplIikgfHwgKGZ1bmN0aW9uLmlkKCkgPT0gIm1heGltaXplIiktuwogICAgLyoqCiAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgICogQSBkYXRhIHBvaW50IHVzZWQgd2l0aGluIGEgc2VhcmNoIHRvIGZpbmQgdGhlIKtzZWxlY3RlZC5hZ2VudC5sYWJlbLsgd2l0aCB0aGUgq2Z1bmN0aW9uLmlkKCm7ZCCraW5wdXRzLnZhbHVlLmdldCgwKS5sYWJlbLsgdmFsdWUuCiAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAgICAqIEBnZW5lcmF0ZWQKICAgICAqLwogICAgcHVibGljIGZpbmFsIHN0YXRpYyBEYXRhUG9pbnQgq2RhdGFQb2ludCgpuyA9IG5ldyBEYXRhUG9pbnRDb25jcmV0ZSgiq2Z1bmN0aW9uLmlkKCkudG9GaXJzdFVwcGVyKCm7IKtpbnB1dHMudmFsdWUuZ2V0KDApLmlkKCm7IikgewoJCatFWFBBTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6R2VuZXJhdGVDb21tZW50uwogICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM3NTU4MTA0NDMzMzU3MzkwMTJMOwoJCatFWFBBTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6R2VuZXJhdGVDb21tZW50uwogICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0VmFsdWUoT2JqZWN0IG8pIHsKICAgICAgICAgICAgq0VYUEFORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpJbm5lckV2YWx1YXRpb24oYWxsU291cmNlcy5zZWxlY3QoZXxlLnNlbGVjdGVkID09IHRoaXMuc2VsZWN0ZWQpLCBmYWxzZSktuwogICAgICAgICAgICByZXR1cm4gKCirc2VsZWN0ZWQuYWdlbnQudHlwZU5hbWUoKbspIG8pLqtpbnB1dHMudmFsdWUuZ2V0KDApLmdldHRlck5hbWUoKbsoKTsKICAgICAgICB9CiAgICB9OwoJq0VMU0UtuwoJCat0YXJnZXREZWYucHJvY2VlZCgpLbsKCatFTkRJRi27CqtFTkRBUk9VTkS7CgqrQVJPVU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OkFjdGlvbkJvZHkgRk9SIEZGdW5jdGlvbi27CgmrSUYgaWQoKSA9PSAid2l0aGluQm91bmRhcmllcyItuwogICAgICAgIENvb3JkaW5hdGUyRERpc2NyZXRlIGNvb3IgPSAoQ29vcmRpbmF0ZTJERGlzY3JldGUpIGdldENvb3JkaW5hdGUoKTsKICAgICAgICByZXR1cm4gKGNvb3IuZ2V0WVZhbHVlKCkgPj0gYm91bmRzWzBdCiAgICAgICAgICAgICAgICAmJiBjb29yLmdldFhWYWx1ZSgpID49IGJvdW5kc1sxXQogICAgICAgICAgICAgICAgJiYgY29vci5nZXRZVmFsdWUoKSA8PSBib3VuZHNbMl0KICAgICAgICAgICAgICAgICYmIGNvb3IuZ2V0WFZhbHVlKCkgPD0gYm91bmRzWzNdKTsKICAgIKtFTFNFLburdGFyZ2V0RGVmLnByb2NlZWQoKburRU5ESUYtuwqrRU5EQVJPVU5EuwoKq0FST1VORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpDb25kaXRpb25CbG9jayAoTGlzdFttZXRhYWJtOjphY3Q6OkFBY3RdIHBhdGgsIEJvb2xlYW4gaW5uZXIpIEZPUiBBQWN0LbsKCatFWFBBTkQgbWV0YWFibTo6YXNjYXBlOjp0bXBsOjpTY2FwZUFzcGVjdDo6Q29uZGl0aW9uYWwocGF0aCwgaW5uZXIpLbsKq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6QmVnaW5RdWVyeUJsb2NrIChMaXN0W21ldGFhYm06OmFjdDo6QUFjdF0gcGF0aCwgQm9vbGVhbiBpbm5lcikgRk9SIEFBY3QtuwoJq0VYUEFORCBtZXRhYWJtOjphc2NhcGU6OnRtcGw6OlNjYXBlQXNwZWN0OjpCZWdpblF1ZXJ5KHBhdGgsIGlubmVyKS27CqtFTkRBUk9VTkS7CqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6RW5kUXVlcnlCbG9jayAoTGlzdFttZXRhYWJtOjphY3Q6OkFBY3RdIHBhdGgsIEJvb2xlYW4gaW5uZXIpIEZPUiBBQWN0LbsKCatFWFBBTkQgbWV0YWFibTo6YXNjYXBlOjp0bXBsOjpTY2FwZUFzcGVjdDo6RW5kUXVlcnkocGF0aCwgaW5uZXIpLbsKq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6QmVnaW5TZXJpYWxCbG9jayhMaXN0W0FBY3RdIHBhdGgsIEJvb2xlYW4gaW5uZXIpIEZPUiBBQ29udHJvbC27CgmrRVhQQU5EIG1ldGFhYm06OmFzY2FwZTo6dG1wbDo6U2NhcGVBc3BlY3Q6OkJlZ2luU2VyaWFsKHBhdGgsIGlubmVyKS27CiAgICCrdGFyZ2V0RGVmLnByb2NlZWQoKS27CqtFTkRBUk9VTkS7CqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6RW5kU2VyaWFsQmxvY2soTGlzdFtBQWN0XSBwYXRoLCBCb29sZWFuIGlubmVyKSBGT1IgQUNvbnRyb2wtuwoJq0VYUEFORCBtZXRhYWJtOjphc2NhcGU6OnRtcGw6OlNjYXBlQXNwZWN0OjpFbmRTZXJpYWwocGF0aCwgaW5uZXIpLbsKICAgIKt0YXJnZXREZWYucHJvY2VlZCgpLbsKq0VOREFST1VORLsKCqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6SW5uZXJCbG9jayAoTGlzdFttZXRhYWJtOjphY3Q6OkFBY3RdIHBhdGgsIEJvb2xlYW4gaW5uZXIpIEZPUiBBTW92ZS27CgmrRVhQQU5EIG1ldGFhYm06OmFzY2FwZTo6dG1wbDo6U2NhcGVBc3BlY3Q6OklubmVyQmxvY2tDYWxsKHBhdGgsIGlubmVyKS27q0VOREFST1VORLsKq0FST1VORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpJbm5lckJsb2NrIChMaXN0W21ldGFhYm06OmFjdDo6QUFjdF0gcGF0aCwgQm9vbGVhbiBpbm5lcikgRk9SIEFDcmVhdGVBZ2VudHMtuwoJq2NhbGwocGF0aCwgaW5uZXIpu6tFTkRBUk9VTkS7CqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6SW5uZXJCbG9jayAoTGlzdFttZXRhYWJtOjphY3Q6OkFBY3RdIHBhdGgsIEJvb2xlYW4gaW5uZXIpIEZPUiBBRGllLbsKCatjYWxsKHBhdGgsIGlubmVyKburRU5EQVJPVU5EuwqrQVJPVU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OklubmVyQmxvY2sgKExpc3RbbWV0YWFibTo6YWN0OjpBQWN0XSBwYXRoLCBCb29sZWFuIGlubmVyKSBGT1IgQUxlYXZlLbsKCatjYWxsKHBhdGgsIGlubmVyKburRU5EQVJPVU5EuwoKq0FST1VORCBtZXRhYWJtOjp0bXBsOjpKYXZhOjpJbm5lckJsb2NrIChMaXN0W21ldGFhYm06OmFjdDo6QUFjdF0gcGF0aCwgQm9vbGVhbiBpbm5lcikgRk9SIEFSZXBsYWNlLbsKCatjYWxsKHBhdGgsIGlubmVyKburRU5EQVJPVU5EuwqrQVJPVU5EIG1ldGFhYm06OnRtcGw6OkphdmE6OklubmVyQmxvY2sgKExpc3RbbWV0YWFibTo6YWN0OjpBQWN0XSBwYXRoLCBCb29sZWFuIGlubmVyKSBGT1IgQUNvbm5lY3QtuwoJq2NhbGwocGF0aCwgaW5uZXIpu6tFTkRBUk9VTkS7CqtBUk9VTkQgbWV0YWFibTo6dG1wbDo6SmF2YTo6SW5uZXJCbG9jayAoTGlzdFttZXRhYWJtOjphY3Q6OkFBY3RdIHBhdGgsIEJvb2xlYW4gaW5uZXIpIEZPUiBBRGlzY29ubmVjdLsKCatjYWxsKHBhdGgsIGlubmVyKburRU5EQVJPVU5EuwoJCg==