PGh0bWw+CjxoZWFkPgo8dGl0bGU+VGVzdCBmb3IgUmFuZ2UuaXNQb2ludEluUmFuZ2UoKTwvdGl0bGU+CjxzY3JpcHQ+CmZ1bmN0aW9uIHRlc3QoKSAKewogICAgLy8gaXNQb2ludEluUmFuZ2UoIHJlZk5vZGUsIG9mZnNldCApIC0gVGhpcyBtZXRob2QgcmV0dXJucyDQMSwgMCBvciAxIGRlcGVuZGluZyBvbiAKICAgIC8vIGlmIHRoZSBwb2ludCBkZXNjcmliZWQgYnkgdGhlIHJlZk5vZGUgbm9kZSBhbmQgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgbm9kZSBpcyAKICAgIC8vIGJlZm9yZSwgc2FtZSBhcywgb3IgYWZ0ZXIgdGhlIHJhbmdlIHJlc3BlY3RpdmVseS4KICAgIAogICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsgICAKCiAgICAvLyB0ZXN0IDEgLSBwb2ludCBiZWZvcmUgcmFuZ2UsIGRpZmZlcmVudCBub2RlCiAgICB2YXIgZXhwZWN0ZWRSZXN1bHQgPSBmYWxzZTsKICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImEyIikpOwogICAgdmFyIHJlc3VsdCA9IHJhbmdlLmlzUG9pbnRJblJhbmdlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiMSIpLCAxKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpIAogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0MSIpLmlubmVySFRNTCA9ICJ0ZXN0IDEgcGFzc2VkIjsKICAgICAgICAKICAgIC8vIHRlc3QgMiAtIHBvaW50IGJlZm9yZSByYW5nZSwgc2FtZSBub2RlCiAgICByYW5nZS5zZXRTdGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYjIiKSwgMSk7CiAgICByZXN1bHQgPSByYW5nZS5pc1BvaW50SW5SYW5nZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYjIiKSwgMCk7CiAgICBpZiAocmVzdWx0ID09IGV4cGVjdGVkUmVzdWx0KQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0MiIpLmlubmVySFRNTCA9ICJ0ZXN0IDIgcGFzc2VkIjsgICAgCiAgICAgICAgCiAgICAvLyB0ZXN0IDMgLSBwb2ludCBvbiByYW5nZSBzdGFydCBib3VuZGFyeQogICAgZXhwZWN0ZWRSZXN1bHQgPSB0cnVlOwogICAgcmFuZ2Uuc2VsZWN0Tm9kZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYjIiKSk7CiAgICByZXN1bHQgPSByYW5nZS5pc1BvaW50SW5SYW5nZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYjIiKSwgMCk7CiAgICBpZiAocmVzdWx0ID09IGV4cGVjdGVkUmVzdWx0KSAKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdDMiKS5pbm5lckhUTUwgPSAidGVzdCAzIHBhc3NlZCI7CiAgICAgICAgICAgIAogICAgLy8gdGVzdCA0IC0gcG9pbnQgd2l0aGluIHJhbmdlLCBzYW1lIG5vZGUKICAgIHJlc3VsdCA9IHJhbmdlLmlzUG9pbnRJblJhbmdlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiMiIpLCAxKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Q0IikuaW5uZXJIVE1MID0gInRlc3QgNCBwYXNzZWQiOwogICAgICAgICAgICAKICAgIC8vIHRlc3QgNSAtIHBvaW50IHdpdGhpbiByYW5nZSwgc3BhbnMgbm9kZXMKICAgIHJhbmdlLnNldFN0YXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiMSIpLCAxKTsKICAgIHJhbmdlLnNldEVuZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzIiKSwgMSk7CiAgICByZXN1bHQgPSByYW5nZS5pc1BvaW50SW5SYW5nZSggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMyIiksIDApOwogICAgaWYgKHJlc3VsdCA9PSBleHBlY3RlZFJlc3VsdCkgCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Q1IikuaW5uZXJIVE1MID0gInRlc3QgNSBwYXNzZWQiOyAgICAKCiAgICAvLyB0ZXN0IDYgLSBwb2ludCBvbiByYW5nZSBlbmQgYm91bmRhcnkKICAgIHJlc3VsdCA9IHJhbmdlLmlzUG9pbnRJblJhbmdlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjMiIpLCAxKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpIAogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0NiIpLmlubmVySFRNTCA9ICJ0ZXN0IDYgcGFzc2VkIjsgICAgCgogICAgLy8gdGVzdCA3IC0gcG9pbnQgYWZ0ZXIgcmFuZ2UsIHNhbWUgbm9kZQogICAgZXhwZWN0ZWRSZXN1bHQgPSBmYWxzZTsKICAgIHJhbmdlLnNldEVuZChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzIiKSwgMCk7CiAgICByZXN1bHQgPSByYW5nZS5pc1BvaW50SW5SYW5nZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzIiKSwgMSk7CiAgICBpZiAocmVzdWx0ID09IGV4cGVjdGVkUmVzdWx0KSAKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdDciKS5pbm5lckhUTUwgPSAidGVzdCA3IHBhc3NlZCI7ICAgIAoKICAgIC8vIHRlc3QgOCAtIHBvaW50IGFmdGVyIHJhbmdlLCBkaWZmZXJlbnQgbm9kZQogICAgcmVzdWx0ID0gcmFuZ2UuaXNQb2ludEluUmFuZ2UoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImEzIiksIDEpOwogICAgaWYgKHJlc3VsdCA9PSBleHBlY3RlZFJlc3VsdCkgCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Q4IikuaW5uZXJIVE1MID0gInRlc3QgOCBwYXNzZWQiOyAKICAgICAgICAKICAgIC8vIHRlc3QgOSAtIGRldGFjaGVkIHJhbmdlLCBhdHRhY2hlZCBub2RlCiAgICAvLyBkZXRhY2goKSBpcyBhIG5vLW9wLgogICAgZXhwZWN0ZWRSZXN1bHQgPSBmYWxzZTsKICAgIHZhciBkZXRhY2hlZFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIGRldGFjaGVkUmFuZ2UuZGV0YWNoKCk7CiAgICByZXN1bHQgPSBkZXRhY2hlZFJhbmdlLmlzUG9pbnRJblJhbmdlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhMSIpLCAwKTsKICAgIGlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Q5IikuaW5uZXJIVE1MID0gInRlc3QgOSBwYXNzZWQiOyAKCiAgICAvLyB0ZXN0IDEwIC0gYXR0YWNoZWQgcmFuZ2UsIGRldGFjaGVkIG5vZGUKICAgIC8vIGZpcmVmb3ggZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm5zIGZhbHNlIGZvciB0aGlzIHRlc3QKICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImExIikpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYjEiKTsKICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgIHJlc3VsdCA9IHJhbmdlLmlzUG9pbnRJblJhbmdlKG5vZGUsIDApOwogICAgaWYgKHJlc3VsdCA9PSBleHBlY3RlZFJlc3VsdCkKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdDEwIikuaW5uZXJIVE1MID0gInRlc3QgMTAgcGFzc2VkIjsgCgogICAgaWYgKHdpbmRvdy50ZXN0UnVubmVyKQogICAgICAgIHRlc3RSdW5uZXIuZHVtcEFzVGV4dCgpOwp9Cgo8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBvbmxvYWQ9InRlc3QoKTsiPgoKPCEtLSB2aXNpYmxlIGFyZWEgd2l0aCB0ZXN0IHJlc3VsdHMgLS0+CjxkaXYgaWQ9dGVzdDE+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXN0IDEgZmFpbGVkPC9zcGFuPjwvZGl2Pjxicj4KPGRpdiBpZD10ZXN0Mj48c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPnRlc3QgMiBmYWlsZWQ8L3NwYW4+PC9kaXY+PGJyPgo8ZGl2IGlkPXRlc3QzPjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGVzdCAzIGZhaWxlZDwvc3Bhbj48L2Rpdj48YnI+CjxkaXYgaWQ9dGVzdDQ+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXN0IDQgZmFpbGVkPC9zcGFuPjwvZGl2Pjxicj4KPGRpdiBpZD10ZXN0NT48c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPnRlc3QgNSBmYWlsZWQ8L3NwYW4+PC9kaXY+PGJyPgo8ZGl2IGlkPXRlc3Q2PjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGVzdCA2IGZhaWxlZDwvc3Bhbj48L2Rpdj48YnI+CjxkaXYgaWQ9dGVzdDc+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXN0IDcgZmFpbGVkPC9zcGFuPjwvZGl2Pjxicj4KPGRpdiBpZD10ZXN0OD48c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPnRlc3QgOCBmYWlsZWQ8L3NwYW4+PC9kaXY+PGJyPgo8ZGl2IGlkPXRlc3Q5PjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGVzdCA5IGZhaWxlZDwvc3Bhbj48L2Rpdj48YnI+CjxkaXYgaWQ9dGVzdDEwPjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGVzdCAxMCBmYWlsZWQ8L3NwYW4+PC9kaXY+PGJyPgoKPCEtLSBoaWRkZW4gYXJlYSB0byBjcmVhdGUgdGhlIHJhbmdlcyBiZWluZyB0ZXN0ZWQgLS0+CjxkaXYgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbiI+CiAgICA8ZGl2IGlkPWExPmExCiAgICA8ZGl2IGlkPWIxPmIxPC9kaXY+IDxkaXYgaWQ9YzE+YzE8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGlkPWEyPmEyCiAgICA8ZGl2IGlkPWIyPmIyPC9kaXY+IDxkaXYgaWQ9YzI+YzI8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGlkPWEzPmEzCiAgICA8ZGl2IGlkPWIzPmIzPC9kaXY+IDxkaXYgaWQ9YzM+YzM8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KCjwvYm9keT4KPC9odG1sPgo=