public static final java.lang.String |
mraidJS |
"Ly8KICAgICAgICAvLyAgbXJhaWQuanMKICAgICAgICAvLwoKICAgICAgICAoZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgY29uc29sZS5sb2coIk1SQUlEIG9iamVjdCBsb2FkaW5nLi4uIik7CgogICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAqIGNvbnNvbGUgbG9nZ2luZyBoZWxwZXIKICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgICAgICAgdmFyIExvZ0xldmVsRW51bSA9IHsKICAgICAgICAgICAgICAgICJERUJVRyI6IDAsCiAgICAgICAgICAgICAgICAiSU5GTyI6IDEsCiAgICAgICAgICAgICAgICAiV0FSTklORyI6IDIsCiAgICAgICAgICAgICAgICAiRVJST1IiOiAzLAogICAgICAgICAgICAgICAgIk5PTkUiOiA0CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbG9nTGV2ZWwgPSBMb2dMZXZlbEVudW0uREVCVUc7CiAgICAgICAgICAgIHZhciBsb2cgPSB7fTsKCiAgICAgICAgICAgIGxvZy5kID0gZnVuY3Rpb24gKG1zZykgewogICAgICAgICAgICAgICAgaWYgKGxvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5ERUJVRykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCIoRC1tcmFpZC5qcykgIiArIG1zZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBsb2cuaSA9IGZ1bmN0aW9uIChtc2cpIHsKICAgICAgICAgICAgICAgIGlmIChsb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uSU5GTykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCIoSS1tcmFpZC5qcykgIiArIG1zZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBsb2cudyA9IGZ1bmN0aW9uIChtc2cpIHsKICAgICAgICAgICAgICAgIGlmIChsb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uV0FSTklORykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCIoVy1tcmFpZC5qcykgIiArIG1zZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBsb2cuZSA9IGZ1bmN0aW9uIChtc2cpIHsKICAgICAgICAgICAgICAgIGlmIChsb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiKEUtbXJhaWQuanMpICIgKyBtc2cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgKiBNUkFJRCBkZWNsYXJhdGlvbgogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgICAgICB2YXIgbXJhaWQgPSB3aW5kb3cubXJhaWQgPSB7fTsKCiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICogY29uc3RhbnRzCiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAgICAgICAgIHZhciBWRVJTSU9OID0gIjIuMCI7CgogICAgICAgICAgICB2YXIgU1RBVEVTID0gbXJhaWQuU1RBVEVTID0gewogICAgICAgICAgICAgICAgIkxPQURJTkciOiAibG9hZGluZyIsCiAgICAgICAgICAgICAgICAiREVGQVVMVCI6ICJkZWZhdWx0IiwKICAgICAgICAgICAgICAgICJFWFBBTkRFRCI6ICJleHBhbmRlZCIsCiAgICAgICAgICAgICAgICAiUkVTSVpFRCI6ICJyZXNpemVkIiwKICAgICAgICAgICAgICAgICJISURERU4iOiAiaGlkZGVuIgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIFBMQUNFTUVOVF9UWVBFUyA9IG1yYWlkLlBMQUNFTUVOVF9UWVBFUyA9IHsKICAgICAgICAgICAgICAgICJJTkxJTkUiOiAiaW5saW5lIiwKICAgICAgICAgICAgICAgICJJTlRFUlNUSVRJQUwiOiAiaW50ZXJzdGl0aWFsIgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIFJFU0laRV9QUk9QRVJUSUVTX0NVU1RPTV9DTE9TRV9QT1NJVElPTiA9IG1yYWlkLlJFU0laRV9QUk9QRVJUSUVTX0NVU1RPTV9DTE9TRV9QT1NJVElPTiA9IHsKICAgICAgICAgICAgICAgICJUT1BfTEVGVCI6ICJ0b3AtbGVmdCIsCiAgICAgICAgICAgICAgICAiVE9QX0NFTlRFUiI6ICJ0b3AtY2VudGVyIiwKICAgICAgICAgICAgICAgICJUT1BfUklHSFQiOiAidG9wLXJpZ2h0IiwKICAgICAgICAgICAgICAgICJDRU5URVIiOiAiY2VudGVyIiwKICAgICAgICAgICAgICAgICJCT1RUT01fTEVGVCI6ICJib3R0b20tbGVmdCIsCiAgICAgICAgICAgICAgICAiQk9UVE9NX0NFTlRFUiI6ICJib3R0b20tY2VudGVyIiwKICAgICAgICAgICAgICAgICJCT1RUT01fUklHSFQiOiAiYm90dG9tLXJpZ2h0IgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIE9SSUVOVEFUSU9OX1BST1BFUlRJRVNfRk9SQ0VfT1JJRU5UQVRJT04gPSBtcmFpZC5PUklFTlRBVElPTl9QUk9QRVJUSUVTX0ZPUkNFX09SSUVOVEFUSU9OID0gewogICAgICAgICAgICAgICAgIlBPUlRSQUlUIjogInBvcnRyYWl0IiwKICAgICAgICAgICAgICAgICJMQU5EU0NBUEUiOiAibGFuZHNjYXBlIiwKICAgICAgICAgICAgICAgICJOT05FIjogIm5vbmUiCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgRVZFTlRTID0gbXJhaWQuRVZFTlRTID0gewogICAgICAgICAgICAgICAgIkVSUk9SIjogImVycm9yIiwKICAgICAgICAgICAgICAgICJSRUFEWSI6ICJyZWFkeSIsCiAgICAgICAgICAgICAgICAiU0laRUNIQU5HRSI6ICJzaXplQ2hhbmdlIiwKICAgICAgICAgICAgICAgICJTVEFURUNIQU5HRSI6ICJzdGF0ZUNoYW5nZSIsCiAgICAgICAgICAgICAgICAiVklFV0FCTEVDSEFOR0UiOiAidmlld2FibGVDaGFuZ2UiCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgU1VQUE9SVEVEX0ZFQVRVUkVTID0gbXJhaWQuU1VQUE9SVEVEX0ZFQVRVUkVTID0gewogICAgICAgICAgICAgICAgIlNNUyI6ICJzbXMiLAogICAgICAgICAgICAgICAgIlRFTCI6ICJ0ZWwiLAogICAgICAgICAgICAgICAgIkNBTEVOREFSIjogImNhbGVuZGFyIiwKICAgICAgICAgICAgICAgICJTVE9SRVBJQ1RVUkUiOiAic3RvcmVQaWN0dXJlIiwKICAgICAgICAgICAgICAgICJJTkxJTkVWSURFTyI6ICJpbmxpbmVWaWRlbyIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICogc3RhdGUKICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgICAgICAgdmFyIHN0YXRlID0gU1RBVEVTLkxPQURJTkc7CiAgICAgICAgICAgIHZhciBwbGFjZW1lbnRUeXBlID0gUExBQ0VNRU5UX1RZUEVTLklOTElORTsKICAgICAgICAgICAgdmFyIHN1cHBvcnRlZEZlYXR1cmVzID0ge307CiAgICAgICAgICAgIHZhciBpc1ZpZXdhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBpc0V4cGFuZFByb3BlcnRpZXNTZXQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIGlzUmVzaXplUmVhZHkgPSBmYWxzZTsKCiAgICAgICAgICAgIHZhciBleHBhbmRQcm9wZXJ0aWVzID0gewogICAgICAgICAgICAgICAgIndpZHRoIjogMCwKICAgICAgICAgICAgICAgICJoZWlnaHQiOiAwLAogICAgICAgICAgICAgICAgInVzZUN1c3RvbUNsb3NlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAiaXNNb2RhbCI6IHRydWUKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBvcmllbnRhdGlvblByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAiYWxsb3dPcmllbnRhdGlvbkNoYW5nZSI6IHRydWUsCiAgICAgICAgICAgICAgICAiZm9yY2VPcmllbnRhdGlvbiI6IE9SSUVOVEFUSU9OX1BST1BFUlRJRVNfRk9SQ0VfT1JJRU5UQVRJT04uTk9ORQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHJlc2l6ZVByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICAgICAid2lkdGgiOiAwLAogICAgICAgICAgICAgICAgImhlaWdodCI6IDAsCiAgICAgICAgICAgICAgICAiY3VzdG9tQ2xvc2VQb3NpdGlvbiI6IFJFU0laRV9QUk9QRVJUSUVTX0NVU1RPTV9DTE9TRV9QT1NJVElPTi5UT1BfUklHSFQsCiAgICAgICAgICAgICAgICAib2Zmc2V0WCI6IDAsCiAgICAgICAgICAgICAgICAib2Zmc2V0WSI6IDAsCiAgICAgICAgICAgICAgICAiYWxsb3dPZmZzY3JlZW4iOiB0cnVlCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY3VycmVudFBvc2l0aW9uID0gewogICAgICAgICAgICAgICAgIngiOiAwLAogICAgICAgICAgICAgICAgInkiOiAwLAogICAgICAgICAgICAgICAgIndpZHRoIjogMCwKICAgICAgICAgICAgICAgICJoZWlnaHQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZGVmYXVsdFBvc2l0aW9uID0gewogICAgICAgICAgICAgICAgIngiOiAwLAogICAgICAgICAgICAgICAgInkiOiAwLAogICAgICAgICAgICAgICAgIndpZHRoIjogMCwKICAgICAgICAgICAgICAgICJoZWlnaHQiOiAwCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWF4U2l6ZSA9IHsKICAgICAgICAgICAgICAgICJ3aWR0aCI6IDAsCiAgICAgICAgICAgICAgICAiaGVpZ2h0IjogMAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHNjcmVlblNpemUgPSB7CiAgICAgICAgICAgICAgICAid2lkdGgiOiAwLAogICAgICAgICAgICAgICAgImhlaWdodCI6IDAKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBjdXJyZW50T3JpZW50YXRpb24gPSAwOwoKICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHt9OwogICAgICAgICAgICB3aW5kb3cubGlzdGVuZXJzID0gbGlzdGVuZXJzOwoKICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgKiAib2ZmaWNpYWwiIEFQSTogbWV0aG9kcyBjYWxsZWQgYnkgY3JlYXRpdmUKICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgICAgICAgbXJhaWQuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5hZGRFdmVudExpc3RlbmVyICIgKyBldmVudCArICI6ICIgKyBTdHJpbmcobGlzdGVuZXIpKTsKICAgICAgICAgICAgICAgIGlmICghZXZlbnQgfHwgIWxpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgbXJhaWQuZmlyZUVycm9yRXZlbnQoIkJvdGggZXZlbnQgYW5kIGxpc3RlbmVyIGFyZSByZXF1aXJlZC4iLCAiYWRkRXZlbnRMaXN0ZW5lciIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghY29udGFpbnMoZXZlbnQsIEVWRU5UUykpIHsKICAgICAgICAgICAgICAgICAgICBtcmFpZC5maXJlRXJyb3JFdmVudCgiVW5rbm93biBNUkFJRCBldmVudDogIiArIGV2ZW50LCAiYWRkRXZlbnRMaXN0ZW5lciIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lcnNGb3JFdmVudCA9IGxpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnNbZXZlbnRdIHx8IFtdOwogICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxpc3RlbmVyIGlzbid0IGFscmVhZHkgcmVnaXN0ZXJlZAogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnNGb3JFdmVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIxID0gU3RyaW5nKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RyMiA9IFN0cmluZyhsaXN0ZW5lcnNGb3JFdmVudFtpXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09PSBsaXN0ZW5lcnNGb3JFdmVudFtpXSB8fCBzdHIxID09PSBzdHIyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pKCJsaXN0ZW5lciAiICsgc3RyMSArICIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBldmVudCAiICsgZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGlzdGVuZXJzRm9yRXZlbnQucHVzaChsaXN0ZW5lcik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5jcmVhdGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKHBhcmFtZXRlcnMpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5jcmVhdGVDYWxlbmRhckV2ZW50IHdpdGggIiArIHBhcmFtZXRlcnMpOwogICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZEZlYXR1cmVzW21yYWlkLlNVUFBPUlRFRF9GRUFUVVJFUy5DQUxFTkRBUl0pIHsKICAgICAgICAgICAgICAgICAgICBjYWxsTmF0aXZlKCJjcmVhdGVDYWxlbmRhckV2ZW50P2V2ZW50SlNPTj0iICsgSlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycykpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb2cuZSgiY3JlYXRlQ2FsZW5kYXJFdmVudCBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5jbG9zZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5jbG9zZSIpOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBTVEFURVMuTE9BRElORwogICAgICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PT0gU1RBVEVTLkRFRkFVTFQgJiYgcGxhY2VtZW50VHlwZSA9PT0gUExBQ0VNRU5UX1RZUEVTLklOTElORSkKICAgICAgICAgICAgICAgICAgICB8fCBzdGF0ZSA9PT0gU1RBVEVTLkhJRERFTikgewogICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsTmF0aXZlKCJjbG9zZSIpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQuZXhwYW5kID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLmV4cGFuZCAoMS1wYXJ0KSIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuZXhwYW5kICIgKyB1cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgdGltZSBpdCBpcyB2YWxpZCB0byBjYWxsIGV4cGFuZCBpcyB3aGVuIHRoZSBhZCBpcwogICAgICAgICAgICAgICAgLy8gYSBiYW5uZXIgY3VycmVudGx5IGluIGVpdGhlciBkZWZhdWx0IG9yIHJlc2l6ZWQgc3RhdGUuCiAgICAgICAgICAgICAgICBpZiAocGxhY2VtZW50VHlwZSAhPT0gUExBQ0VNRU5UX1RZUEVTLklOTElORQogICAgICAgICAgICAgICAgICAgIHx8IChzdGF0ZSAhPT0gU1RBVEVTLkRFRkFVTFQgJiYgc3RhdGUgIT09IFNUQVRFUy5SRVNJWkVEKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxOYXRpdmUoImV4cGFuZCIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWxsTmF0aXZlKCJleHBhbmQ/dXJsPSIgKyBlbmNvZGVVUklDb21wb25lbnQodXJsKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5nZXRDdXJyZW50UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuZ2V0Q3VycmVudFBvc2l0aW9uIik7CiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFBvc2l0aW9uOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQuZ2V0RGVmYXVsdFBvc2l0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLmdldERlZmF1bHRQb3NpdGlvbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRQb3NpdGlvbjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLmdldEV4cGFuZFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuZ2V0RXhwYW5kUHJvcGVydGllcyIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGV4cGFuZFByb3BlcnRpZXM7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5nZXRNYXhTaXplID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLmdldE1heFNpemUiKTsKICAgICAgICAgICAgICAgIHJldHVybiBtYXhTaXplOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQuZ2V0T3JpZW50YXRpb25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLmdldE9yaWVudGF0aW9uUHJvcGVydGllcyIpOwogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWVudGF0aW9uUHJvcGVydGllczsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLmdldFBsYWNlbWVudFR5cGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuZ2V0UGxhY2VtZW50VHlwZSIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlbWVudFR5cGU7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5nZXRSZXNpemVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLmdldFJlc2l6ZVByb3BlcnRpZXMiKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNpemVQcm9wZXJ0aWVzOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQuZ2V0U2NyZWVuU2l6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5nZXRTY3JlZW5TaXplIik7CiAgICAgICAgICAgICAgICByZXR1cm4gc2NyZWVuU2l6ZTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLmdldFN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLmdldFN0YXRlIik7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5nZXRWZXJzaW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLmdldFZlcnNpb24iKTsKICAgICAgICAgICAgICAgIHJldHVybiBWRVJTSU9OOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQuaXNWaWV3YWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5pc1ZpZXdhYmxlIik7CiAgICAgICAgICAgICAgICByZXR1cm4gaXNWaWV3YWJsZTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLm9wZW4gPSBmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQub3BlbiAiICsgdXJsKTsKICAgICAgICAgICAgICAgIGNhbGxOYXRpdmUoIm9wZW4/dXJsPSIgKyBlbmNvZGVVUklDb21wb25lbnQodXJsKSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5wbGF5VmlkZW8gPSBmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQucGxheVZpZGVvICIgKyB1cmwpOwogICAgICAgICAgICAgICAgY2FsbE5hdGl2ZSgicGxheVZpZGVvP3VybD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5yZW1vdmVFdmVudExpc3RlbmVyICIgKyBldmVudCArICIgOiAiICsgU3RyaW5nKGxpc3RlbmVyKSk7CiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgbXJhaWQuZmlyZUVycm9yRXZlbnQoIkV2ZW50IGlzIHJlcXVpcmVkLiIsICJyZW1vdmVFdmVudExpc3RlbmVyIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjb250YWlucyhldmVudCwgRVZFTlRTKSkgewogICAgICAgICAgICAgICAgICAgIG1yYWlkLmZpcmVFcnJvckV2ZW50KCJVbmtub3duIE1SQUlEIGV2ZW50OiAiICsgZXZlbnQsICJyZW1vdmVFdmVudExpc3RlbmVyIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVycy5oYXNPd25Qcm9wZXJ0eShldmVudCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyc0ZvckV2ZW50ID0gbGlzdGVuZXJzW2V2ZW50XTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgdGhlIGdpdmVuIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSBsaXN0ZW5lcnNGb3JFdmVudC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWdpc3RlcmVkTGlzdGVuZXIgPSBsaXN0ZW5lcnNGb3JFdmVudFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIxID0gU3RyaW5nKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIyID0gU3RyaW5nKHJlZ2lzdGVyZWRMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgPT09IHJlZ2lzdGVyZWRMaXN0ZW5lciB8fCBzdHIxID09PSBzdHIyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzRm9yRXZlbnQuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBsZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pKCJsaXN0ZW5lciAiICsgc3RyMSArICIgbm90IGZvdW5kIGZvciBldmVudCAiICsgZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNGb3JFdmVudC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbZXZlbnRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbGlzdGVuZXIgdG8gcmVtb3ZlIHdhcyBwcm92aWRlZCwgc28gcmVtb3ZlIGFsbCBsaXN0ZW5lcnMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGdpdmVuIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbZXZlbnRdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmkoIm5vIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBldmVudCAiICsgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQucmVzaXplID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLnJlc2l6ZSIpOwogICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgdGltZSBpdCBpcyB2YWxpZCB0byBjYWxsIHJlc2l6ZSBpcyB3aGVuIHRoZSBhZCBpcwogICAgICAgICAgICAgICAgLy8gYSBiYW5uZXIgY3VycmVudGx5IGluIGVpdGhlciBkZWZhdWx0IG9yIHJlc2l6ZWQgc3RhdGUuCiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGFuIGVycm9yIGlmIHRoZSBjdXJyZW50IHN0YXRlIGlzIGV4cGFuZGVkLgogICAgICAgICAgICAgICAgaWYgKHBsYWNlbWVudFR5cGUgPT09IFBMQUNFTUVOVF9UWVBFUy5JTlRFUlNUSVRJQUwgfHwgc3RhdGUgPT09IFNUQVRFUy5MT0FESU5HIHx8IHN0YXRlID09PSBTVEFURVMuSElEREVOKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVTLkVYUEFOREVEKSB7CiAgICAgICAgICAgICAgICAgICAgbXJhaWQuZmlyZUVycm9yRXZlbnQoIm1yYWlkLnJlc2l6ZSBjYWxsZWQgd2hlbiBhZCBpcyBpbiBleHBhbmRlZCBzdGF0ZSIsICJtcmFpZC5yZXNpemUiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWlzUmVzaXplUmVhZHkpIHsKICAgICAgICAgICAgICAgICAgICBtcmFpZC5maXJlRXJyb3JFdmVudCgibXJhaWQucmVzaXplIGlzIG5vdCByZWFkeSB0byBiZSBjYWxsZWQiLCAibXJhaWQucmVzaXplIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FsbE5hdGl2ZSgicmVzaXplIik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5zZXRFeHBhbmRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5zZXRFeHBhbmRQcm9wZXJ0aWVzIik7CgogICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZShwcm9wZXJ0aWVzLCAic2V0RXhwYW5kUHJvcGVydGllcyIpKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmUoImZhaWxlZCB2YWxpZGF0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBvbGRVc2VDdXN0b21DbG9zZSA9IGV4cGFuZFByb3BlcnRpZXMudXNlQ3VzdG9tQ2xvc2U7CgogICAgICAgICAgICAgICAgLy8gZXhwYW5kUHJvcGVydGllcyBjb250YWlucyAzIHJlYWQtd3JpdGUgcHJvcGVydGllczogd2lkdGgsIGhlaWdodCwgYW5kIHVzZUN1c3RvbUNsb3NlOwogICAgICAgICAgICAgICAgLy8gdGhlIGlzTW9kYWwgcHJvcGVydHkgaXMgcmVhZC1vbmx5CiAgICAgICAgICAgICAgICB2YXIgcndQcm9wcyA9IFsid2lkdGgiLCAiaGVpZ2h0IiwgInVzZUN1c3RvbUNsb3NlIl07CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ3UHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcG5hbWUgPSByd1Byb3BzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BuYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRQcm9wZXJ0aWVzW3Byb3BuYW1lXSA9IHByb3BlcnRpZXNbcHJvcG5hbWVdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBJbiBNUkFJRCB2Mi4wLCBhbGwgZXhwYW5kZWQgYWRzIGJ5IGRlZmluaXRpb24gY292ZXIgdGhlIGVudGlyZSBzY3JlZW4sCiAgICAgICAgICAgICAgICAvLyBzbyB0aGUgb25seSBwcm9wZXJ0eSB0aGF0IHRoZSBuYXRpdmUgc2lkZSBoYXMgdG8ga25vdyBhYm91dCBpcyB1c2VDdXN0b21DbG9zZS4KICAgICAgICAgICAgICAgIC8vIChUaGF0IGlzLCB0aGUgd2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzIGFyZSBub3QgbmVlZGVkIGJ5IHRoZSBuYXRpdmUgY29kZS4pCiAgICAgICAgICAgICAgICBpZiAoZXhwYW5kUHJvcGVydGllcy51c2VDdXN0b21DbG9zZSAhPT0gb2xkVXNlQ3VzdG9tQ2xvc2UpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsTmF0aXZlKCJ1c2VDdXN0b21DbG9zZT91c2VDdXN0b21DbG9zZT0iICsgZXhwYW5kUHJvcGVydGllcy51c2VDdXN0b21DbG9zZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaXNFeHBhbmRQcm9wZXJ0aWVzU2V0ID0gdHJ1ZTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLnNldE9yaWVudGF0aW9uUHJvcGVydGllcyA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuc2V0T3JpZW50YXRpb25Qcm9wZXJ0aWVzIik7CgogICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZShwcm9wZXJ0aWVzLCAic2V0T3JpZW50YXRpb25Qcm9wZXJ0aWVzIikpIHsKICAgICAgICAgICAgICAgICAgICBsb2cuZSgiZmFpbGVkIHZhbGlkYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG5ld09yaWVudGF0aW9uUHJvcGVydGllcyA9IHt9OwogICAgICAgICAgICAgICAgbmV3T3JpZW50YXRpb25Qcm9wZXJ0aWVzLmFsbG93T3JpZW50YXRpb25DaGFuZ2UgPSBvcmllbnRhdGlvblByb3BlcnRpZXMuYWxsb3dPcmllbnRhdGlvbkNoYW5nZSwKICAgICAgICAgICAgICAgICAgICBuZXdPcmllbnRhdGlvblByb3BlcnRpZXMuZm9yY2VPcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uUHJvcGVydGllcy5mb3JjZU9yaWVudGF0aW9uOwoKICAgICAgICAgICAgICAgIC8vIG9yaWVudGF0aW9uUHJvcGVydGllcyBjb250YWlucyAyIHJlYWQtd3JpdGUgcHJvcGVydGllczoKICAgICAgICAgICAgICAgIC8vIGFsbG93T3JpZW50YXRpb25DaGFuZ2UgYW5kIGZvcmNlT3JpZW50YXRpb24KICAgICAgICAgICAgICAgIHZhciByd1Byb3BzID0gWyJhbGxvd09yaWVudGF0aW9uQ2hhbmdlIiwgImZvcmNlT3JpZW50YXRpb24iXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcndQcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wbmFtZSA9IHJ3UHJvcHNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld09yaWVudGF0aW9uUHJvcGVydGllc1twcm9wbmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BuYW1lXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gU2V0dGluZyBhbGxvd09yaWVudGF0aW9uQ2hhbmdlIHRvIHRydWUgd2hpbGUgc2V0dGluZyBmb3JjZU9yaWVudGF0aW9uCiAgICAgICAgICAgICAgICAvLyB0byBlaXRoZXIgcG9ydHJhaXQgb3IgbGFuZHNjYXBlCiAgICAgICAgICAgICAgICAvLyBpcyBjb25zaWRlcmVkIGFuIGVycm9yIGNvbmRpdGlvbi4KICAgICAgICAgICAgICAgIGlmIChuZXdPcmllbnRhdGlvblByb3BlcnRpZXMuYWxsb3dPcmllbnRhdGlvbkNoYW5nZQogICAgICAgICAgICAgICAgICAgICYmIG5ld09yaWVudGF0aW9uUHJvcGVydGllcy5mb3JjZU9yaWVudGF0aW9uICE9PSBtcmFpZC5PUklFTlRBVElPTl9QUk9QRVJUSUVTX0ZPUkNFX09SSUVOVEFUSU9OLk5PTkUpIHsKICAgICAgICAgICAgICAgICAgICBtcmFpZC5maXJlRXJyb3JFdmVudCgKICAgICAgICAgICAgICAgICAgICAgICAgImFsbG93T3JpZW50YXRpb25DaGFuZ2UgaXMgdHJ1ZSBidXQgZm9yY2VPcmllbnRhdGlvbiBpcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3T3JpZW50YXRpb25Qcm9wZXJ0aWVzLmZvcmNlT3JpZW50YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICJzZXRPcmllbnRhdGlvblByb3BlcnRpZXMiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgb3JpZW50YXRpb25Qcm9wZXJ0aWVzLmFsbG93T3JpZW50YXRpb25DaGFuZ2UgPSBuZXdPcmllbnRhdGlvblByb3BlcnRpZXMuYWxsb3dPcmllbnRhdGlvbkNoYW5nZTsKICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uUHJvcGVydGllcy5mb3JjZU9yaWVudGF0aW9uID0gbmV3T3JpZW50YXRpb25Qcm9wZXJ0aWVzLmZvcmNlT3JpZW50YXRpb247CgogICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICJhbGxvd09yaWVudGF0aW9uQ2hhbmdlPSIKICAgICAgICAgICAgICAgICAgICArIG9yaWVudGF0aW9uUHJvcGVydGllcy5hbGxvd09yaWVudGF0aW9uQ2hhbmdlCiAgICAgICAgICAgICAgICAgICAgKyAiJmZvcmNlT3JpZW50YXRpb249IiArIG9yaWVudGF0aW9uUHJvcGVydGllcy5mb3JjZU9yaWVudGF0aW9uOwoKICAgICAgICAgICAgICAgIGNhbGxOYXRpdmUoInNldE9yaWVudGF0aW9uUHJvcGVydGllcz8iICsgcGFyYW1zKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLnNldFJlc2l6ZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAocHJvcGVydGllcykgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLnNldFJlc2l6ZVByb3BlcnRpZXMiKTsKCiAgICAgICAgICAgICAgICBpc1Jlc2l6ZVJlYWR5ID0gZmFsc2U7CgogICAgICAgICAgICAgICAgLy8gcmVzaXplUHJvcGVydGllcyBjb250YWlucyA2IHJlYWQtd3JpdGUgcHJvcGVydGllczoKICAgICAgICAgICAgICAgIC8vIHdpZHRoLCBoZWlnaHQsIG9mZnNldFgsIG9mZnNldFksIGN1c3RvbUNsb3NlUG9zaXRpb24sIGFsbG93T2Zmc2NyZWVuCgogICAgICAgICAgICAgICAgLy8gVGhlIHByb3BlcnRpZXMgb2JqZWN0IHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24gbXVzdCBjb250YWluIHdpZHRoLCBoZWlnaHQsIG9mZnNldFgsIG9mZnNldFkuCiAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHR3byBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbC4KICAgICAgICAgICAgICAgIHZhciByZXF1aXJlZFByb3BzID0gWyJ3aWR0aCIsICJoZWlnaHQiLCAib2Zmc2V0WCIsICJvZmZzZXRZIl07CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkUHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcG5hbWUgPSByZXF1aXJlZFByb3BzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXJhaWQuZmlyZUVycm9yRXZlbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgcHJvcGVydHkgIiArIHByb3BuYW1lICsgIiBpcyBtaXNzaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcmFpZC5zZXRSZXNpemVQcm9wZXJ0aWVzIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZShwcm9wZXJ0aWVzLCAic2V0UmVzaXplUHJvcGVydGllcyIpKSB7CiAgICAgICAgICAgICAgICAgICAgbXJhaWQuZmlyZUVycm9yRXZlbnQoImZhaWxlZCB2YWxpZGF0aW9uIiwgIm1yYWlkLnNldFJlc2l6ZVByb3BlcnRpZXMiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGFkanVzdG1lbnRzID0geyJ4IjogMCwgInkiOiAwfTsKCiAgICAgICAgICAgICAgICB2YXIgYWxsb3dPZmZzY3JlZW4gPSBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KCJhbGxvd09mZnNjcmVlbiIpID8gcHJvcGVydGllcy5hbGxvd09mZnNjcmVlbiA6IHJlc2l6ZVByb3BlcnRpZXMuYWxsb3dPZmZzY3JlZW47CiAgICAgICAgICAgICAgICBpZiAoIWFsbG93T2Zmc2NyZWVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMud2lkdGggPiBtYXhTaXplLndpZHRoIHx8IHByb3BlcnRpZXMuaGVpZ2h0ID4gbWF4U2l6ZS5oZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXJhaWQuZmlyZUVycm9yRXZlbnQoInJlc2l6ZSB3aWR0aCBvciBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhTaXplIHdpZHRoIG9yIGhlaWdodCIsICJtcmFpZC5zZXRSZXNpemVQcm9wZXJ0aWVzIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRqdXN0bWVudHMgPSBmaXRSZXNpemVWaWV3T25TY3JlZW4ocHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nsb3NlUmVnaW9uT25TY3JlZW4ocHJvcGVydGllcykpIHsKICAgICAgICAgICAgICAgICAgICBtcmFpZC5maXJlRXJyb3JFdmVudCgiY2xvc2UgZXZlbnQgcmVnaW9uIHdpbGwgbm90IGFwcGVhciBlbnRpcmVseSBvbnNjcmVlbiIsICJtcmFpZC5zZXRSZXNpemVQcm9wZXJ0aWVzIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciByd1Byb3BzID0gWyJ3aWR0aCIsICJoZWlnaHQiLCAib2Zmc2V0WCIsICJvZmZzZXRZIiwgImN1c3RvbUNsb3NlUG9zaXRpb24iLCAiYWxsb3dPZmZzY3JlZW4iXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcndQcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wbmFtZSA9IHJ3UHJvcHNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVByb3BlcnRpZXNbcHJvcG5hbWVdID0gcHJvcGVydGllc1twcm9wbmFtZV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPQogICAgICAgICAgICAgICAgICAgICJ3aWR0aD0iICsgcmVzaXplUHJvcGVydGllcy53aWR0aCArCiAgICAgICAgICAgICAgICAgICAgIiZoZWlnaHQ9IiArIHJlc2l6ZVByb3BlcnRpZXMuaGVpZ2h0ICsKICAgICAgICAgICAgICAgICAgICAiJm9mZnNldFg9IiArIChyZXNpemVQcm9wZXJ0aWVzLm9mZnNldFggKyBhZGp1c3RtZW50cy54KSArCiAgICAgICAgICAgICAgICAgICAgIiZvZmZzZXRZPSIgKyAocmVzaXplUHJvcGVydGllcy5vZmZzZXRZICsgYWRqdXN0bWVudHMueSkgKwogICAgICAgICAgICAgICAgICAgICImY3VzdG9tQ2xvc2VQb3NpdGlvbj0iICsgcmVzaXplUHJvcGVydGllcy5jdXN0b21DbG9zZVBvc2l0aW9uICsKICAgICAgICAgICAgICAgICAgICAiJmFsbG93T2Zmc2NyZWVuPSIgKyByZXNpemVQcm9wZXJ0aWVzLmFsbG93T2Zmc2NyZWVuOwoKICAgICAgICAgICAgICAgIGNhbGxOYXRpdmUoInNldFJlc2l6ZVByb3BlcnRpZXM/IiArIHBhcmFtcyk7CgogICAgICAgICAgICAgICAgaXNSZXNpemVSZWFkeSA9IHRydWU7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5zdG9yZVBpY3R1cmUgPSBmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuc3RvcmVQaWN0dXJlICIgKyB1cmwpOwogICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZEZlYXR1cmVzW21yYWlkLlNVUFBPUlRFRF9GRUFUVVJFUy5TVE9SRVBJQ1RVUkVdKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbE5hdGl2ZSgic3RvcmVQaWN0dXJlP3VybD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb2cuZSgic3RvcmVQaWN0dXJlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLnN1cHBvcnRzID0gZnVuY3Rpb24gKGZlYXR1cmUpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5zdXBwb3J0cyAiICsgZmVhdHVyZSArICIgIiArIHN1cHBvcnRlZEZlYXR1cmVzW2ZlYXR1cmVdKTsKICAgICAgICAgICAgICAgIHZhciByZXR2YWwgPSBzdXBwb3J0ZWRGZWF0dXJlc1tmZWF0dXJlXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmV0dmFsID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLnVzZUN1c3RvbUNsb3NlID0gZnVuY3Rpb24gKGlzQ3VzdG9tQ2xvc2UpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC51c2VDdXN0b21DbG9zZSAiICsgaXNDdXN0b21DbG9zZSk7CiAgICAgICAgICAgICAgICBpZiAoZXhwYW5kUHJvcGVydGllcy51c2VDdXN0b21DbG9zZSAhPT0gaXNDdXN0b21DbG9zZSkgewogICAgICAgICAgICAgICAgICAgIGV4cGFuZFByb3BlcnRpZXMudXNlQ3VzdG9tQ2xvc2UgPSBpc0N1c3RvbUNsb3NlOwogICAgICAgICAgICAgICAgICAgIGNhbGxOYXRpdmUoInVzZUN1c3RvbUNsb3NlP3VzZUN1c3RvbUNsb3NlPSIKICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBhbmRQcm9wZXJ0aWVzLnVzZUN1c3RvbUNsb3NlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICogaGVscGVyIG1ldGhvZHMgY2FsbGVkIGJ5IFNESwogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgICAgICAvLyBzZXR0ZXJzIHRvIGNoYW5nZSBzdGF0ZQogICAgICAgICAgICBtcmFpZC5zZXRDdXJyZW50UG9zaXRpb24gPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLnNldEN1cnJlbnRQb3NpdGlvbiAiICsgeCArICIsIiArIHkgKyAiLCIgKyB3aWR0aCArICIsIiArIGhlaWdodCk7CgogICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzU2l6ZSA9IHt9OwogICAgICAgICAgICAgICAgcHJldmlvdXNTaXplLndpZHRoID0gY3VycmVudFBvc2l0aW9uLndpZHRoOwogICAgICAgICAgICAgICAgcHJldmlvdXNTaXplLmhlaWdodCA9IGN1cnJlbnRQb3NpdGlvbi5oZWlnaHQ7CiAgICAgICAgICAgICAgICBsb2cuaSgicHJldmlvdXNTaXplICIgKyBwcmV2aW91c1NpemUud2lkdGggKyAiLCIgKyBwcmV2aW91c1NpemUuaGVpZ2h0KTsKCiAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24ueCA9IHg7CiAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24ueSA9IHk7CiAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24ud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbi5oZWlnaHQgPSBoZWlnaHQ7CgogICAgICAgICAgICAgICAgaWYgKHdpZHRoICE9PSBwcmV2aW91c1NpemUud2lkdGggfHwgaGVpZ2h0ICE9PSBwcmV2aW91c1NpemUuaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgbXJhaWQuZmlyZVNpemVDaGFuZ2VFdmVudCh3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLnNldERlZmF1bHRQb3NpdGlvbiA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuc2V0RGVmYXVsdFBvc2l0aW9uICIgKyB4ICsgIiwiICsgeSArICIsIiArIHdpZHRoICsgIiwiICsgaGVpZ2h0KTsKICAgICAgICAgICAgICAgIGRlZmF1bHRQb3NpdGlvbi54ID0geDsKICAgICAgICAgICAgICAgIGRlZmF1bHRQb3NpdGlvbi55ID0geTsKICAgICAgICAgICAgICAgIGRlZmF1bHRQb3NpdGlvbi53aWR0aCA9IHdpZHRoOwogICAgICAgICAgICAgICAgZGVmYXVsdFBvc2l0aW9uLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLnNldEV4cGFuZFNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLnNldEV4cGFuZFNpemUgIiArIHdpZHRoICsgIngiICsgaGVpZ2h0KTsKICAgICAgICAgICAgICAgIGV4cGFuZFByb3BlcnRpZXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgICAgIGV4cGFuZFByb3BlcnRpZXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQuc2V0TWF4U2l6ZSA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuc2V0TWF4U2l6ZSAiICsgd2lkdGggKyAieCIgKyBoZWlnaHQpOwogICAgICAgICAgICAgICAgbWF4U2l6ZS53aWR0aCA9IHdpZHRoOwogICAgICAgICAgICAgICAgbWF4U2l6ZS5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5zZXRQbGFjZW1lbnRUeXBlID0gZnVuY3Rpb24gKHB0KSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuc2V0UGxhY2VtZW50VHlwZSAiICsgcHQpOwogICAgICAgICAgICAgICAgcGxhY2VtZW50VHlwZSA9IHB0OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbXJhaWQuc2V0U2NyZWVuU2l6ZSA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuc2V0U2NyZWVuU2l6ZSAiICsgd2lkdGggKyAieCIgKyBoZWlnaHQpOwogICAgICAgICAgICAgICAgc2NyZWVuU2l6ZS53aWR0aCA9IHdpZHRoOwogICAgICAgICAgICAgICAgc2NyZWVuU2l6ZS5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICAgICAgICB1cGRhdGVDcmVhdGl2ZVNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICAgICBpZiAoIWlzRXhwYW5kUHJvcGVydGllc1NldCkgewogICAgICAgICAgICAgICAgICAgIGV4cGFuZFByb3BlcnRpZXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgICAgICAgICBleHBhbmRQcm9wZXJ0aWVzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5zZXRTdXBwb3J0cyA9IGZ1bmN0aW9uIChmZWF0dXJlLCBzdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5zZXRTdXBwb3J0cyAiICsgZmVhdHVyZSArICIgIiArIHN1cHBvcnRlZCk7CiAgICAgICAgICAgICAgICBzdXBwb3J0ZWRGZWF0dXJlc1tmZWF0dXJlXSA9IHN1cHBvcnRlZDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIG1ldGhvZHMgdG8gZmlyZSBldmVudHMKCiAgICAgICAgICAgIG1yYWlkLmZpcmVFcnJvckV2ZW50ID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGFjdGlvbikgewogICAgICAgICAgICAgICAgbG9nLmkoIm1yYWlkLmZpcmVFcnJvckV2ZW50ICIgKyBtZXNzYWdlICsgIiAiICsgYWN0aW9uKTsKICAgICAgICAgICAgICAgIGZpcmVFdmVudChtcmFpZC5FVkVOVFMuRVJST1IsIG1lc3NhZ2UsIGFjdGlvbik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5maXJlUmVhZHlFdmVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5maXJlUmVhZHlFdmVudCIpOwogICAgICAgICAgICAgICAgZmlyZUV2ZW50KG1yYWlkLkVWRU5UUy5SRUFEWSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBtcmFpZC5maXJlU2l6ZUNoYW5nZUV2ZW50ID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5maXJlU2l6ZUNoYW5nZUV2ZW50ICIgKyB3aWR0aCArICJ4IiArIGhlaWdodCk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IG1yYWlkLlNUQVRFUy5MT0FESU5HKSB7CiAgICAgICAgICAgICAgICAgICAgZmlyZUV2ZW50KG1yYWlkLkVWRU5UUy5TSVpFQ0hBTkdFLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLmZpcmVTdGF0ZUNoYW5nZUV2ZW50ID0gZnVuY3Rpb24gKG5ld1N0YXRlKSB7CiAgICAgICAgICAgICAgICBsb2cuaSgibXJhaWQuZmlyZVN0YXRlQ2hhbmdlRXZlbnQgIiArIG5ld1N0YXRlKTsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbmV3U3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ld1N0YXRlOwogICAgICAgICAgICAgICAgICAgIGZpcmVFdmVudChtcmFpZC5FVkVOVFMuU1RBVEVDSEFOR0UsIHN0YXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG1yYWlkLmZpcmVWaWV3YWJsZUNoYW5nZUV2ZW50ID0gZnVuY3Rpb24gKG5ld0lzVmlld2FibGUpIHsKICAgICAgICAgICAgICAgIGxvZy5pKCJtcmFpZC5maXJlVmlld2FibGVDaGFuZ2VFdmVudCAiICsgbmV3SXNWaWV3YWJsZSk7CiAgICAgICAgICAgICAgICBpZiAoaXNWaWV3YWJsZSAhPT0gbmV3SXNWaWV3YWJsZSkgewogICAgICAgICAgICAgICAgICAgIGlzVmlld2FibGUgPSBuZXdJc1ZpZXdhYmxlOwogICAgICAgICAgICAgICAgICAgIGZpcmVFdmVudChtcmFpZC5FVkVOVFMuVklFV0FCTEVDSEFOR0UsIGlzVmlld2FibGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgKiBpbnRlcm5hbCBoZWxwZXIgbWV0aG9kcwogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgICAgICBmdW5jdGlvbiBjYWxsTmF0aXZlKGNvbW1hbmQpIHsKICAgICAgICAgICAgICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJRlJBTUUiKTsKICAgICAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoInNyYyIsICJtcmFpZDovLyIgKyBjb21tYW5kKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChpZnJhbWUpOwogICAgICAgICAgICAgICAgaWZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaWZyYW1lKTsKICAgICAgICAgICAgICAgIGlmcmFtZSA9IG51bGw7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBmdW5jdGlvbiBmaXJlRXZlbnQoZXZlbnQpIHsKICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgICAgIGxvZy5pKCJmaXJlRXZlbnQgIiArIGV2ZW50ICsgIiBbIiArIGFyZ3MudG9TdHJpbmcoKSArICJdIik7CiAgICAgICAgICAgICAgICB2YXIgZXZlbnRMaXN0ZW5lcnMgPSAobGlzdGVuZXJzW2V2ZW50XSB8fCBbXSkuc2xpY2UoMCk7CiAgICAgICAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgICAgICBsb2cuaShldmVudExpc3RlbmVycy5sZW5ndGggKyAiIGxpc3RlbmVyKHMpIGZvdW5kIGZvciAiICsgZXZlbnQpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmkoImZpcmluZyBsaXN0ZW5lciAiICsgaSArICIgZm9yICIgKyBldmVudCArICI6ICIgKyBldmVudExpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmkoIm5vIGxpc3RlbmVycyBmb3VuZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgZnVuY3Rpb24gY29udGFpbnModmFsdWUsIGFycmF5KSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBUaGUgYWN0aW9uIHBhcmFtZXRlciBpcyBhIHN0cmluZyB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgc2V0dGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIC8vIHdoaWNoIGNhbGxlZCB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgIC8vIChpbiBvdGhlciB3b3Jkcywgc2V0RXhwYW5kUHJvcGV0aWVzLCBzZXRPcmllbnRhdGlvblByb3BlcnRpZXMsIG9yCiAgICAgICAgICAgIC8vIHNldFJlc2l6ZVByb3BlcnRpZXMpLgogICAgICAgICAgICAvLyBJdCBzZXJ2ZXMgYm90aCBhcyB0aGUga2V5IHRvIGdldCB0aGUgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiB2YWxpZGF0aW5nCiAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyBmcm9tIHRoZSBhbGxWYWxpZGF0b3JzIG9iamVjdAogICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIG9mIGFueSBlcnJvciBldmVudCB0aGF0IG1heSBiZSB0aHJvd24uCiAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BlcnRpZXMsIGFjdGlvbikgewogICAgICAgICAgICAgICAgdmFyIHJldHZhbCA9IHRydWU7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWRhdG9ycyA9IGFsbFZhbGlkYXRvcnNbYWN0aW9uXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gcHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW3Byb3BdOwogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3BlcnRpZXNbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciAmJiAhdmFsaWRhdG9yKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtcmFpZC5maXJlRXJyb3JFdmVudCgiVmFsdWUgb2YgcHJvcGVydHkgIiArIHByb3AgKyAiICgiICsgdmFsdWUgKyAiKSBpcyBpbnZhbGlkIiwgIm1yYWlkLiIgKyBhY3Rpb24pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGFsbFZhbGlkYXRvcnMgPSB7CiAgICAgICAgICAgICAgICAic2V0RXhwYW5kUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAvLyBJbiBNUkFJRCAyLjAsIHRoZSBvbmx5IHByb3BlcnR5IGluIGV4cGFuZFByb3BlcnRpZXMgd2UgYWN0dWFsbHkgY2FyZSBhYm91dCBpcyB1c2VDdXN0b21DbG9zZS4KICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCwgd2UnbGwgZG8gYSBiYXNpYyBzYW5pdHkgY2hlY2sgb24gdGhlIHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllcywgdG9vLgogICAgICAgICAgICAgICAgICAgICJ3aWR0aCI6IGZ1bmN0aW9uICh3aWR0aCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJoZWlnaHQiOiBmdW5jdGlvbiAoaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNOYU4oaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ1c2VDdXN0b21DbG9zZSI6IGZ1bmN0aW9uICh1c2VDdXN0b21DbG9zZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB1c2VDdXN0b21DbG9zZSA9PT0gImJvb2xlYW4iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInNldE9yaWVudGF0aW9uUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAiYWxsb3dPcmllbnRhdGlvbkNoYW5nZSI6IGZ1bmN0aW9uIChhbGxvd09yaWVudGF0aW9uQ2hhbmdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZW9mIGFsbG93T3JpZW50YXRpb25DaGFuZ2UgPT09ICJib29sZWFuIik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZm9yY2VPcmllbnRhdGlvbiI6IGZ1bmN0aW9uIChmb3JjZU9yaWVudGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZFZhbHVlcyA9IFsicG9ydHJhaXQiLCAibGFuZHNjYXBlIiwgIm5vbmUiXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgZm9yY2VPcmllbnRhdGlvbiA9PT0gInN0cmluZyIgJiYgdmFsaWRWYWx1ZXMuaW5kZXhPZihmb3JjZU9yaWVudGF0aW9uKSAhPT0gLTEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic2V0UmVzaXplUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAid2lkdGgiOiBmdW5jdGlvbiAod2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc05hTih3aWR0aCkgJiYgNTAgPD0gd2lkdGg7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0IjogZnVuY3Rpb24gKGhlaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKGhlaWdodCkgJiYgNTAgPD0gaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9mZnNldFgiOiBmdW5jdGlvbiAob2Zmc2V0WCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKG9mZnNldFgpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgIm9mZnNldFkiOiBmdW5jdGlvbiAob2Zmc2V0WSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKG9mZnNldFkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImN1c3RvbUNsb3NlUG9zaXRpb24iOiBmdW5jdGlvbiAoY3VzdG9tQ2xvc2VQb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsaWRQb3NpdGlvbnMgPSBbInRvcC1sZWZ0IiwgInRvcC1jZW50ZXIiLCAidG9wLXJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZW50ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvdHRvbS1sZWZ0IiwgImJvdHRvbS1jZW50ZXIiLCAiYm90dG9tLXJpZ2h0Il07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHlwZW9mIGN1c3RvbUNsb3NlUG9zaXRpb24gPT09ICJzdHJpbmciICYmIHZhbGlkUG9zaXRpb25zLmluZGV4T2YoY3VzdG9tQ2xvc2VQb3NpdGlvbikgIT09IC0xKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGxvd09mZnNjcmVlbiI6IGZ1bmN0aW9uIChhbGxvd09mZnNjcmVlbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBhbGxvd09mZnNjcmVlbiA9PT0gImJvb2xlYW4iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBmdW5jdGlvbiBpc0Nsb3NlUmVnaW9uT25TY3JlZW4ocHJvcGVydGllcykgewogICAgICAgICAgICAgICAgbG9nLmQoImlzQ2xvc2VSZWdpb25PblNjcmVlbiIpOwogICAgICAgICAgICAgICAgbG9nLmQoImRlZmF1bHRQb3NpdGlvbiAiICsgZGVmYXVsdFBvc2l0aW9uLnggKyAiICIgKyBkZWZhdWx0UG9zaXRpb24ueSk7CiAgICAgICAgICAgICAgICBsb2cuZCgib2Zmc2V0ICIgKyBwcm9wZXJ0aWVzLm9mZnNldFggKyAiICIgKyBwcm9wZXJ0aWVzLm9mZnNldFkpOwoKICAgICAgICAgICAgICAgIHZhciByZXNpemVSZWN0ID0ge307CiAgICAgICAgICAgICAgICByZXNpemVSZWN0LnggPSBkZWZhdWx0UG9zaXRpb24ueCArIHByb3BlcnRpZXMub2Zmc2V0WDsKICAgICAgICAgICAgICAgIHJlc2l6ZVJlY3QueSA9IGRlZmF1bHRQb3NpdGlvbi55ICsgcHJvcGVydGllcy5vZmZzZXRZOwogICAgICAgICAgICAgICAgcmVzaXplUmVjdC53aWR0aCA9IHByb3BlcnRpZXMud2lkdGg7CiAgICAgICAgICAgICAgICByZXNpemVSZWN0LmhlaWdodCA9IHByb3BlcnRpZXMuaGVpZ2h0OwogICAgICAgICAgICAgICAgcHJpbnRSZWN0KCJyZXNpemVSZWN0IiwgcmVzaXplUmVjdCk7CgogICAgICAgICAgICAgICAgdmFyIGN1c3RvbUNsb3NlUG9zaXRpb24gPSBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KCJjdXN0b21DbG9zZVBvc2l0aW9uIikgPwogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuY3VzdG9tQ2xvc2VQb3NpdGlvbiA6IHJlc2l6ZVByb3BlcnRpZXMuY3VzdG9tQ2xvc2VQb3NpdGlvbjsKICAgICAgICAgICAgICAgIGxvZy5kKCJjdXN0b21DbG9zZVBvc2l0aW9uICIgKyBjdXN0b21DbG9zZVBvc2l0aW9uKTsKCiAgICAgICAgICAgICAgICB2YXIgY2xvc2VSZWN0ID0geyJ3aWR0aCI6IDUwLCAiaGVpZ2h0IjogNTB9OwoKICAgICAgICAgICAgICAgIGlmIChjdXN0b21DbG9zZVBvc2l0aW9uLnNlYXJjaCgibGVmdCIpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGNsb3NlUmVjdC54ID0gcmVzaXplUmVjdC54OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXN0b21DbG9zZVBvc2l0aW9uLnNlYXJjaCgiY2VudGVyIikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VSZWN0LnggPSByZXNpemVSZWN0LnggKyAocmVzaXplUmVjdC53aWR0aCAvIDIpIC0gMjU7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUNsb3NlUG9zaXRpb24uc2VhcmNoKCJyaWdodCIpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGNsb3NlUmVjdC54ID0gcmVzaXplUmVjdC54ICsgcmVzaXplUmVjdC53aWR0aCAtIDUwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjdXN0b21DbG9zZVBvc2l0aW9uLnNlYXJjaCgidG9wIikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VSZWN0LnkgPSByZXNpemVSZWN0Lnk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUNsb3NlUG9zaXRpb24gPT09ICJjZW50ZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VSZWN0LnkgPSByZXNpemVSZWN0LnkgKyAocmVzaXplUmVjdC5oZWlnaHQgLyAyKSAtIDI1OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXN0b21DbG9zZVBvc2l0aW9uLnNlYXJjaCgiYm90dG9tIikgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VSZWN0LnkgPSByZXNpemVSZWN0LnkgKyByZXNpemVSZWN0LmhlaWdodCAtIDUwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBtYXhSZWN0ID0geyJ4IjogMCwgInkiOiAwfTsKICAgICAgICAgICAgICAgIG1heFJlY3Qud2lkdGggPSBtYXhTaXplLndpZHRoOwogICAgICAgICAgICAgICAgbWF4UmVjdC5oZWlnaHQgPSBtYXhTaXplLmhlaWdodDsKCiAgICAgICAgICAgICAgICByZXR1cm4gaXNSZWN0Q29udGFpbmVkKG1heFJlY3QsIGNsb3NlUmVjdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGZpdFJlc2l6ZVZpZXdPblNjcmVlbihwcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICBsb2cuZCgiZml0UmVzaXplVmlld09uU2NyZWVuIik7CiAgICAgICAgICAgICAgICBsb2cuZCgiZGVmYXVsdFBvc2l0aW9uICIgKyBkZWZhdWx0UG9zaXRpb24ueCArICIgIiArIGRlZmF1bHRQb3NpdGlvbi55KTsKICAgICAgICAgICAgICAgIGxvZy5kKCJvZmZzZXQgIiArIHByb3BlcnRpZXMub2Zmc2V0WCArICIgIiArIHByb3BlcnRpZXMub2Zmc2V0WSk7CgogICAgICAgICAgICAgICAgdmFyIHJlc2l6ZVJlY3QgPSB7fTsKICAgICAgICAgICAgICAgIHJlc2l6ZVJlY3QueCA9IGRlZmF1bHRQb3NpdGlvbi54ICsgcHJvcGVydGllcy5vZmZzZXRYOwogICAgICAgICAgICAgICAgcmVzaXplUmVjdC55ID0gZGVmYXVsdFBvc2l0aW9uLnkgKyBwcm9wZXJ0aWVzLm9mZnNldFk7CiAgICAgICAgICAgICAgICByZXNpemVSZWN0LndpZHRoID0gcHJvcGVydGllcy53aWR0aDsKICAgICAgICAgICAgICAgIHJlc2l6ZVJlY3QuaGVpZ2h0ID0gcHJvcGVydGllcy5oZWlnaHQ7CiAgICAgICAgICAgICAgICBwcmludFJlY3QoInJlc2l6ZVJlY3QiLCByZXNpemVSZWN0KTsKCiAgICAgICAgICAgICAgICB2YXIgbWF4UmVjdCA9IHsieCI6IDAsICJ5IjogMH07CiAgICAgICAgICAgICAgICBtYXhSZWN0LndpZHRoID0gbWF4U2l6ZS53aWR0aDsKICAgICAgICAgICAgICAgIG1heFJlY3QuaGVpZ2h0ID0gbWF4U2l6ZS5oZWlnaHQ7CgogICAgICAgICAgICAgICAgdmFyIGFkanVzdG1lbnRzID0geyJ4IjogMCwgInkiOiAwfTsKCiAgICAgICAgICAgICAgICBpZiAoaXNSZWN0Q29udGFpbmVkKG1heFJlY3QsIHJlc2l6ZVJlY3QpKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmQoIm5vIGFkanVzdG1lbnQgbmVjZXNzYXJ5Iik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkanVzdG1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChyZXNpemVSZWN0LnggPCBtYXhSZWN0LngpIHsKICAgICAgICAgICAgICAgICAgICBhZGp1c3RtZW50cy54ID0gbWF4UmVjdC54IC0gcmVzaXplUmVjdC54OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocmVzaXplUmVjdC54ICsgcmVzaXplUmVjdC53aWR0aCkgPiAobWF4UmVjdC54ICsgbWF4UmVjdC53aWR0aCkpIHsKICAgICAgICAgICAgICAgICAgICBhZGp1c3RtZW50cy54ID0gKG1heFJlY3QueCArIG1heFJlY3Qud2lkdGgpIC0gKHJlc2l6ZVJlY3QueCArIHJlc2l6ZVJlY3Qud2lkdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbG9nLmQoImFkanVzdG1lbnRzLnggIiArIGFkanVzdG1lbnRzLngpOwoKICAgICAgICAgICAgICAgIGlmIChyZXNpemVSZWN0LnkgPCBtYXhSZWN0LnkpIHsKICAgICAgICAgICAgICAgICAgICBhZGp1c3RtZW50cy55ID0gbWF4UmVjdC55IC0gcmVzaXplUmVjdC55OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocmVzaXplUmVjdC55ICsgcmVzaXplUmVjdC5oZWlnaHQpID4gKG1heFJlY3QueSArIG1heFJlY3QuaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgIGFkanVzdG1lbnRzLnkgPSAobWF4UmVjdC55ICsgbWF4UmVjdC5oZWlnaHQpIC0gKHJlc2l6ZVJlY3QueSArIHJlc2l6ZVJlY3QuaGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxvZy5kKCJhZGp1c3RtZW50cy55ICIgKyBhZGp1c3RtZW50cy55KTsKCiAgICAgICAgICAgICAgICByZXNpemVSZWN0LnggPSBkZWZhdWx0UG9zaXRpb24ueCArIHByb3BlcnRpZXMub2Zmc2V0WCArIGFkanVzdG1lbnRzLng7CiAgICAgICAgICAgICAgICByZXNpemVSZWN0LnkgPSBkZWZhdWx0UG9zaXRpb24ueSArIHByb3BlcnRpZXMub2Zmc2V0WSArIGFkanVzdG1lbnRzLnk7CiAgICAgICAgICAgICAgICBwcmludFJlY3QoImFkanVzdGVkIHJlc2l6ZVJlY3QiLCByZXNpemVSZWN0KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYWRqdXN0bWVudHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGlzUmVjdENvbnRhaW5lZChjb250YWluaW5nUmVjdCwgY29udGFpbmVkUmVjdCkgewogICAgICAgICAgICAgICAgbG9nLmQoImlzUmVjdENvbnRhaW5lZCIpOwogICAgICAgICAgICAgICAgcHJpbnRSZWN0KCJjb250YWluaW5nUmVjdCIsIGNvbnRhaW5pbmdSZWN0KTsKICAgICAgICAgICAgICAgIHByaW50UmVjdCgiY29udGFpbmVkUmVjdCIsIGNvbnRhaW5lZFJlY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIChjb250YWluZWRSZWN0LnggPj0gY29udGFpbmluZ1JlY3QueCAmJgogICAgICAgICAgICAgICAgICAgIChjb250YWluZWRSZWN0LnggKyBjb250YWluZWRSZWN0LndpZHRoKSA8PSAoY29udGFpbmluZ1JlY3QueCArIGNvbnRhaW5pbmdSZWN0LndpZHRoKSAmJgogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZFJlY3QueSA+PSBjb250YWluaW5nUmVjdC55ICYmCiAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lZFJlY3QueSArIGNvbnRhaW5lZFJlY3QuaGVpZ2h0KSA8PSAoY29udGFpbmluZ1JlY3QueSArIGNvbnRhaW5pbmdSZWN0LmhlaWdodCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBwcmludFJlY3QobGFiZWwsIHJlY3QpIHsKICAgICAgICAgICAgICAgIGxvZy5kKGxhYmVsICsKICAgICAgICAgICAgICAgICAgICAiIFsiICsgcmVjdC54ICsgIiwiICsgcmVjdC55ICsgIl0iICsKICAgICAgICAgICAgICAgICAgICAiLFsiICsgKHJlY3QueCArIHJlY3Qud2lkdGgpICsgIiwiICsgKHJlY3QueSArIHJlY3QuaGVpZ2h0KSArICJdIiArCiAgICAgICAgICAgICAgICAgICAgIiAoIiArIHJlY3Qud2lkdGggKyAieCIgKyByZWN0LmhlaWdodCArICIpIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1yYWlkLmR1bXBMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbkV2ZW50cyA9IE9iamVjdC5rZXlzKGxpc3RlbmVycykubGVuZ3RoOwogICAgICAgICAgICAgICAgbG9nLmkoImR1bXBpbmcgbGlzdGVuZXJzICgiICsgbkV2ZW50cyArICIgZXZlbnRzKSIpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgZXZlbnQgaW4gbGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzW2V2ZW50XTsKICAgICAgICAgICAgICAgICAgICBsb2cuaSgiICAiICsgZXZlbnQgKyAiIGNvbnRhaW5zICIgKyBldmVudExpc3RlbmVycy5sZW5ndGggKyAiIGxpc3RlbmVycyIpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmkoIiAgICAiICsgZXZlbnRMaXN0ZW5lcnNbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJNUkFJRCBvYmplY3QgbG9hZGVkIik7CgogICAgICAgIH0pKCk7" |
public static final java.lang.String |
new_close |
"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 AAAASUVORK5CYII=" |
public static final java.lang.String |
new_close_pressed |
"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 4RT5f02O5nnLDJUQAAAAAElFTkSuQmCC" |
public static final java.lang.String |
scaling_script |
"dmFyIGVsZW1lbnRUb1NjYWxlRm91bmQgPSBmYWxzZTsKICAgICAgICB2YXIgZWxlbWVudFRvU2NhbGUgPSBudWxsOwoKICAgICAgICBjb25zdCBjcmVhdGl2ZVJlc2l6ZSA9IGZ1bmN0aW9uIChwYXJlbnRfd2lkdGgsIHBhcmVudF9oZWlnaHQsIGVsZW1lbnQpIHsKICAgICAgICAgICAgbGV0IGNoaWxkX2RpdiA9IGVsZW1lbnQ7CgogICAgICAgICAgICBsZXQgY2hpbGRfaGVpZ2h0ID0gcGFyZW50X2hlaWdodDsKICAgICAgICAgICAgbGV0IGNoaWxkX3dpZHRoID0gcGFyZW50X3dpZHRoOwoKICAgICAgICAgICAgLy8gRFNQcyBjb3VsZCBiZSBhdHRhY2hpbmcgYmVhY29ucyhpbWcgMVgxKSBpbiBjaGlsZCBkaXYsIGRvIG5vdCBjb25zaWRlciBpdCBhcyBjcmVhdGl2ZSBmb3IgcmVzaXplCiAgICAgICAgICAgIGlmIChjaGlsZF9kaXYub2Zmc2V0SGVpZ2h0ID4gMSAmJiBjaGlsZF9kaXYub2Zmc2V0V2lkdGggPiAxKSB7CiAgICAgICAgICAgICAgICBjaGlsZF9oZWlnaHQgPSBjaGlsZF9kaXYub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgICAgICAgY2hpbGRfd2lkdGggPSBjaGlsZF9kaXYub2Zmc2V0V2lkdGg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxldCBhc3BlY3Rfd2lkdGggPSBjaGlsZF93aWR0aDsKICAgICAgICAgICAgbGV0IGFzcGVjdF9oZWlnaHQgPSBjaGlsZF9oZWlnaHQ7CiAgICAgICAgICAgIGlmIChjaGlsZF9oZWlnaHQgPCBwYXJlbnRfaGVpZ2h0IHx8IGNoaWxkX3dpZHRoIDwgcGFyZW50X3dpZHRoKSB7CiAgICAgICAgICAgICAgICBsZXQgcGFyZW50X2FzcGVjdCA9IHBhcmVudF93aWR0aCAvIHBhcmVudF9oZWlnaHQ7CiAgICAgICAgICAgICAgICBsZXQgY2hpbGRfYXNwZWN0ID0gY2hpbGRfd2lkdGggLyBjaGlsZF9oZWlnaHQ7CiAgICAgICAgICAgICAgICBsZXQgc2NhbGVfZmFjdG9yID0gMTsKICAgICAgICAgICAgICAgIGxldCBzY2FsZV9mYWN0b3JfeSA9IDE7CgogICAgICAgICAgICAgICAgaWYgKHBhcmVudF9hc3BlY3QgPiBjaGlsZF9hc3BlY3QpIHsKICAgICAgICAgICAgICAgICAgICBzY2FsZV9mYWN0b3IgPSAocGFyZW50X2hlaWdodCAvIGNoaWxkX2hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgYXNwZWN0X3dpZHRoID0gY2hpbGRfd2lkdGggKiBzY2FsZV9mYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgYXNwZWN0X2hlaWdodCA9IHBhcmVudF9oZWlnaHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZhY3RvciA9IChwYXJlbnRfd2lkdGggLyBjaGlsZF93aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX3kgPSAocGFyZW50X2hlaWdodCAvIGNoaWxkX2hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgYXNwZWN0X3dpZHRoID0gcGFyZW50X3dpZHRoOwogICAgICAgICAgICAgICAgICAgIGFzcGVjdF9oZWlnaHQgPSBjaGlsZF9oZWlnaHQgKiAoc2NhbGVfZmFjdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYXNwZWN0X3dpZHRoIDwgcGFyZW50X3dpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgY2hpbGRfZGl2LnN0eWxlLm1hcmdpbkxlZnQgPSAocGFyZW50X3dpZHRoIC0gYXNwZWN0X3dpZHRoKSAvIDIgKyAicHgiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChhc3BlY3RfaGVpZ2h0IDwgcGFyZW50X2hlaWdodCkgewogICAgICAgICAgICAgICAgICAgIGxldCB0cmFuc2xhdGlvblBpeGVscyA9IChwYXJlbnRfaGVpZ2h0IC0gY2hpbGRfaGVpZ2h0KSAvIDIgKyAicHgiOwogICAgICAgICAgICAgICAgICAgIGNoaWxkX2Rpdi5zdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwcHgsIiArIHRyYW5zbGF0aW9uUGl4ZWxzICsgIikiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoaWxkX2Rpdi5zdHlsZS50cmFuc2Zvcm0gKz0gInNjYWxlKCIgKyBzY2FsZV9mYWN0b3IgKyAiLCIgKyBzY2FsZV9mYWN0b3JfeSArICIpIjsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGNvbnN0IGZpbmRFbGVtZW50QnlTaXplID0gZnVuY3Rpb24gKGN1cnJlbnRFbGVtZW50LCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQgPT09IGhlaWdodCAmJiBjdXJyZW50RWxlbWVudC5vZmZzZXRXaWR0aCA9PT0gd2lkdGgpIHsKICAgICAgICAgICAgICAgIGVsZW1lbnRUb1NjYWxlID0gY3VycmVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICBlbGVtZW50VG9TY2FsZUZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCAmJiAhZWxlbWVudFRvU2NhbGVGb3VuZDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZmluZEVsZW1lbnRCeVNpemUoY3VycmVudEVsZW1lbnQuY2hpbGRyZW5baV0sIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb25zdCB1cGRhdGVDcmVhdGl2ZVNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgewogICAgICAgICAgICBlbGVtZW50VG9TY2FsZSA9IG51bGw7CiAgICAgICAgICAgIGVsZW1lbnRUb1NjYWxlRm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgbGV0IHBhcmVudF9oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICAgIGxldCBwYXJlbnRfd2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgbGV0IGFkX2NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoeWJpZC1hZCcpOwogICAgICAgICAgICBmaW5kRWxlbWVudEJ5U2l6ZShhZF9jb250YWluZXIsIDMyMCwgNDgwKTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50VG9TY2FsZUZvdW5kICYmIGVsZW1lbnRUb1NjYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNyZWF0aXZlUmVzaXplKHBhcmVudF93aWR0aCwgcGFyZW50X2hlaWdodCwgZWxlbWVudFRvU2NhbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQ==" |