השוואת קופות גמל מתקדמת
חפש, בחר והשווה תשואות, דמי ניהול וחשיפות מתוך … מסלולים פנסיוניים
📊
עדיין לא נבחרו קופות להשוואה
הקלד לפחות 2 אותיות בחיפוש או בחר מוצר/חברה, ולחץ + כדי להוסיף קופות להשוואה
השוואת תשואות ונתונים
גרף ביצועים והשוואה
📊 מדדי השוואה:
מחשבון השקעה
הזן סכומים כדי לראות את התחזית הצפויה בגרף ובסיכום
מחשבון ריבית דריבית
תחזית צמיחה עתידית לפי תשואת עבר שנתית ומספר שנים
ייצוא ושיתוף
שתף בקישור מהיר, או הפק דוח PDF מעוצב עבור הלקוח
או הפק דוח PDF מלא
מה לכלול בדוח
הבהרה משפטית: המידע מוצג לצורך השוואה בלבד ואינו מהווה ייעוץ השקעות, ייעוץ פנסיוני או המלצה לרכישה/מכירה. תשואות עבר אינן מבטיחות תשואות עתיד. לפני קבלת החלטה פנסיונית יש להתייעץ עם בעל רישיון מתאים. הנתונים מבוססים על דיווחי החברות המנהלות דרך data.gov.il ומאגר גמלנט.
KGZ1bmN0aW9uKCl7Cid1c2Ugc3RyaWN0JzsKCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBEYXRhIGxheWVyIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwovLyBGaXggbWFuZ2xlZCAiUyZQIDUwMCIgaW4gc291cmNlIGRhdGEgKCJTMTtQNTAwIiwgInMxO3AgNTAwIiwgIlMmUDUwMCIg4oCmIOKGkiAiUyZQIDUwMCIpCmZ1bmN0aW9uIGNsZWFuTmFtZShzKXsKICBzPShzfHwnJykudG9TdHJpbmcoKTsKICBzPXMucmVwbGFjZSgvc1xzKjFccyo7XHMqcC9naSwnUyZQJyk7ICAgICAgICAvLyB1bi1tYW5nbGUgUzE7UCDihpIgUyZQCiAgcz1zLnJlcGxhY2UoL3NccyomXHMqcFxzKjUwMC9naSwnUyZQIDUwMCcpOyAgLy8gbm9ybWFsaXplIGFsbCBTJlA1MDAgdmFyaWFudHMKICByZXR1cm4gczsKfQp2YXIgRlVORFMgPSBbXTsKKGZ1bmN0aW9uKCl7CiAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQ6bm90KFtzcmNdKScpOwogIGZvciAodmFyIGk9MDtpPHNjcmlwdHMubGVuZ3RoO2krKyl7CiAgICB2YXIgdCA9IHNjcmlwdHNbaV0udGV4dENvbnRlbnQgfHwgJyc7CiAgICBpZiAodC5pbmRleE9mKCdndFNlYXJjaElucHV0JykgPiAtMSl7CiAgICAgIHZhciBtID0gdC5tYXRjaCgvdmFyIGZ1bmRzXHMqPVxzKihcW1tcc1xTXSs/XF0pOy8pOwogICAgICBpZiAobSl7IHRyeXsgRlVORFMgPSBKU09OLnBhcnNlKG1bMV0pOyB9Y2F0Y2goZSl7fSBicmVhazsgfQogICAgfQogIH0KICBGVU5EUy5mb3JFYWNoKGZ1bmN0aW9uKGYpeyBpZihmLm5hbWUpIGYubmFtZT1jbGVhbk5hbWUoZi5uYW1lKTsgaWYoZi5jb21wYW55KSBmLmNvbXBhbnk9Y2xlYW5OYW1lKGYuY29tcGFueSk7IH0pOwp9KSgpOwoKdmFyIEFQSSA9ICcvd3AtanNvbi9ndC92MSc7CnZhciBNQVhfU0VMID0gNDsKCnZhciBQUk9EVUNUUyA9IFsKICB7djonZ3RfcGVuc2l5YScsICAgICAgbDon16TXoNeh15nXlCd9LAogIHt2OidndF9oaXNodGFsbXV0JywgICBsOifXp9eo158g15TXqdeq15zXnteV16onfSwKICB7djonZ3RfZ2VtZWwnLCAgICAgICAgbDon16fXldek16og15LXntecJ30sCiAge3Y6J2d0X2dlbWVsX2ludmVzdCcsIGw6J9eS157XnCDXnNeU16nXp9ei15QnfSwKICB7djonZ3RfcG9saXNhJywgICAgICAgbDon16TXldec15nXodeqINeX15nXodeb15XXnyd9LAogIHt2OidndF90YWdtdWxpbScsICAgICBsOifXqteS157Xldec15nXnSd9LAogIHt2OidndF95ZWxhZGltJywgICAgICBsOifXl9eZ16HXm9eV158g15zXm9ecINeZ15zXkyd9Cl07CnZhciBUTCA9IHtndF9oaXNodGFsbXV0OifXp9eo158g15TXqdeq15zXnteV16onLGd0X2dlbWVsOifXp9eV16TXqiDXktee15wnLGd0X3BlbnNpeWE6J9ek16DXodeZ15QnLGd0X3RhZ211bGltOifXqteS157Xldec15nXnScsZ3RfcG9saXNhOifXpNeV15zXmdeh16og15fXmdeh15vXldefJyxndF95ZWxhZGltOifXl9eZ16HXm9eV158g15zXm9ecINeZ15zXkyd9OwovLyBTcGVjaWFsaXphdGlvbnMgcGVyIHByb2R1Y3Qg4oCUIHtsOmxhYmVsIHNob3duLCBtOnN1YnN0cmluZyB0byBtYXRjaCBpbiBmdW5kIG5hbWVzfQp2YXIgU1BFQ1NfQllfUFJPRFVDVCA9IHsKICBndF9wZW5zaXlhOlsKICAgIHtsOifXnten15nXpNeUJyxtOifXnten15nXpNeUJ30se2w6J9ee16nXnNeZ157XlCcsbTon157Xqdec15nXnteUJ30se2w6J9eb15zXnNeZ16onLG06J9eb15zXnNeZJ30se2w6J9ee16DXmdeV16onLG06J9ee16DXmdeV16onfSwKICAgIHtsOifXlNec15vXlCcsbTon15TXnNeb15QnfSx7bDon16LXlden15Eg157Xk9eTJyxtOifXoteV16fXkSDXnteTJ30se2w6J9eh15fXmdeoJyxtOifXodeX15nXqCd9LAogICAge2w6J9eS15nXnNeQ15kgNTAg15XXnteY15QnLG06JzUwINeV157XmNeUJ30se2w6J9eS15nXnNeQ15kgNTAg16LXkyA2MCcsbTonNTAg16LXkyA2MCd9LHtsOifXkteZ15zXkNeZIDYwINeV157Xotec15QnLG06JzYwINeV157Xotec15QnfQogIF0sCiAgZ3RfaGlzaHRhbG11dDpbCiAgICB7bDon15vXnNec15knLG06J9eb15zXnNeZJ30se2w6J9ee16DXmdeV16onLG06J9ee16DXmdeV16onfSx7bDon15DXkiLXlycsbTon15DXkiLXlyd9LHtsOifXnteX16fXlCDXnteT15MnLG06J9ee15fXp9eUJ30sCiAgICB7bDon15TXnNeb15QnLG06J9eU15zXm9eUJ30se2w6J9eQ16nXqNeQ15kg15XXkNeSIteXJyxtOifXkNep16jXkNeZINeV15DXkiLXlyd9LHtsOifXqden15zXmScsbTon16nXp9ec15knfSx7bDonUyZQIDUwMCcsbTonUyZQIDUwMCd9LHtsOifXoteV16fXkSDXnteT15MnLG06J9ei15XXp9eRINee15MnfQogIF0sCiAgZ3RfZ2VtZWw6WwogICAge2w6J9ec15TXqden16LXlCcsbTon15zXlNep16fXoteUJ30se2w6J9eb15zXnNeZJyxtOifXm9ec15zXmSd9LHtsOifXnteg15nXldeqJyxtOifXnteg15nXldeqJ30se2w6J9eQ15Ii15cnLG06J9eQ15Ii15cnfSwKICAgIHtsOifXnteX16fXlCDXnteT15MnLG06J9ee15fXp9eUJ30se2w6J9eU15zXm9eUJyxtOifXlNec15vXlCd9LHtsOidTJlAgNTAwJyxtOidTJlAgNTAwJ30KICBdLAogIGd0X2dlbWVsX2ludmVzdDpbCiAgICB7bDon15vXnNec15knLG06J9eb15zXnNeZJ30se2w6J9ee16DXmdeV16onLG06J9ee16DXmdeV16onfSx7bDon15DXkiLXlycsbTon15DXkiLXlyd9LHtsOifXnteX16fXlCDXnteT15MnLG06J9ee15fXp9eUJ30se2w6J9eU15zXm9eUJyxtOifXlNec15vXlCd9LHtsOidTJlAgNTAwJyxtOidTJlAgNTAwJ30KICBdLAogIGd0X3BvbGlzYTpbCiAgICB7bDon15vXnNec15knLG06J9eb15zXnNeZJ30se2w6J9ee16DXmdeV16onLG06J9ee16DXmdeV16onfSx7bDon15DXkiLXlycsbTon15DXkiLXlyd9LHtsOifXntee16nXnNeq15knLG06J9ee157Xqdec16rXmSd9LHtsOifXodeX15nXqCcsbTon16HXl9eZ16gnfSx7bDon157Xl9en15Qg157Xk9eTJyxtOifXnteX16fXlCd9CiAgXSwKICBndF90YWdtdWxpbTpbe2w6J9eb15zXnNeZJyxtOifXm9ec15zXmSd9LHtsOifXnteg15nXldeqJyxtOifXnteg15nXldeqJ30se2w6J9eQ15Ii15cnLG06J9eQ15Ii15cnfV0sCiAgZ3RfeWVsYWRpbTpbe2w6J9eb15zXnNeZJyxtOifXm9ec15zXmSd9LHtsOifXnteg15nXldeqJyxtOifXnteg15nXldeqJ30se2w6J9ee15fXp9eUINee15PXkycsbTon157Xl9en15QnfV0KfTsKdmFyIEdFTkVSQUxfU1BFQ1MgPSBbe2w6J9eb15zXnNeZJyxtOifXm9ec15zXmSd9LHtsOifXnteg15nXldeqJyxtOifXnteg15nXldeqJ30se2w6J9eQ15Ii15cnLG06J9eQ15Ii15cnfSx7bDon157Xl9en15Qg157Xk9eTJyxtOifXnteX16fXlCd9LHtsOifXlNec15vXlCcsbTon15TXnNeb15QnfSx7bDonUyZQIDUwMCcsbTonUyZQIDUwMCd9XTsKdmFyIFNQRUNfTUFUQ0ggPSB7fTsgIC8vIGxhYmVsIC0+IG1hdGNoIHN0cmluZwpPYmplY3Qua2V5cyhTUEVDU19CWV9QUk9EVUNUKS5mb3JFYWNoKGZ1bmN0aW9uKHApeyBTUEVDU19CWV9QUk9EVUNUW3BdLmZvckVhY2goZnVuY3Rpb24ocyl7IFNQRUNfTUFUQ0hbcy5sXT1zLm07IH0pOyB9KTsKR0VORVJBTF9TUEVDUy5mb3JFYWNoKGZ1bmN0aW9uKHMpeyBTUEVDX01BVENIW3MubF09cy5tOyB9KTsKdmFyIFNFUklFU19DT0xPUlMgPSBbJyMzZjUxYjUnLCcjZTAyMThhJywnIzFlYTdlMScsJyMxOWIzNmInLCcjZjBhMDIwJ107CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgU3RhdGUg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCnZhciBzZWwgPSBbXTsgICAgICAgICAgLy8gb3JkZXJlZCBsaXN0IG9mIGZ1bmQgb2JqZWN0cwp2YXIgbWV0cmljcyA9IHt9OyAgICAgIC8vIGNvZGUgLT4gY29tcGFyZSByZWNvcmQKdmFyIHNlcmllc0NhY2hlID0ge307ICAvLyBjb2RlIC0+IHsgcmFuZ2UgLT4gbW9udGhseURhdGFbXSB9CnZhciBmUHJvZHVjdHMgPSBbXSwgZkNvbXBhbmllcyA9IFtdLCBmU3BlY3MgPSBbXTsgIC8vIG11bHRpLXNlbGVjdCBmaWx0ZXJzIChlbXB0eSA9IGFsbCkKdmFyIHJlc3VsdHNGb3JjZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdHMgc2hvd24gdmlhIHNlYXJjaCBidXR0b24gKG5vIHRleHQpCnZhciB0YWIgPSAnY3VtJzsgICAgICAgLy8gY3VtIHwgYXZnIHwgcGVyaW9kIHwgYWN0CnZhciBncmFwaFJhbmdlID0gMTI7CnZhciBMQVRFU1RfUEVSSU9EID0gMjAyNjA0Owp2YXIgZXhwYW5kZWRDb2RlID0gbnVsbDsKdmFyIGV4cGFuZFRhYiA9ICdleHBvc3VyZSc7CnZhciBleHRNb2RlID0gJ2N1bSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbmRlZC1yZXR1cm5zIGRpc3BsYXk6ICdjdW0nIHwgJ2F2ZycKdmFyIGV4dFJldCA9IHt9OyAgICAvLyBjb2RlIC0+IHtjMTIwLGMxODAsYzI0MH0gfCB7bG9hZGluZ30gfCB7bmF9ICAoMTAvMTUvMjB5IGN1bXVsYXRpdmUgZnJvbSB5aWVsZHMpCnZhciBmbG93cyA9IHt9OyAgICAgLy8gY29kZSAtPiB7ZGVwLHdkLG5ldCxpbmNlcHRpb24scGVyaW9kfSB8IHtsb2FkaW5nfSB8IHtuYX0KdmFyIHRvcENhdCA9IHt9OyAgICAvLyBjb2RlIC0+IHtmdW5kcyxzcGVjfSB8IHtsb2FkaW5nfSB8IHtuYX0KdmFyIEdFTUVMX05FVF9SSUQgPSAnYTMwZGNiZWEtYTFkMi00ODJjLWFlMjktOGY3ODFmNTAyNWZiJzsgICAvLyBkYXRhLmdvdi5pbCDXktee15wt16DXmCAyMDI04oaSCnZhciBUWVBFX1RPX1BST0RVQ1QgPSB7Z3RfaGlzaHRhbG11dDonaGlzaHRhbG11dCcsIGd0X2dlbWVsOidnZW1lbCcsIGd0X2dlbWVsX2ludmVzdDonZ2VtZWwnLCBndF9wZW5zaXlhOidwZW5zaXlhJywgZ3RfcG9saXNhOidwb2xpc2EnLCBndF90YWdtdWxpbTonZ2VtZWwnLCBndF95ZWxhZGltOidnZW1lbCd9Owp2YXIgY2hhcnQgPSBudWxsOwp2YXIgZ3JhcGhUb2tlbiA9IDA7CnZhciBjaGFydFR5cGUgPSAnbGluZSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdsaW5lJyAoY3VtdWxhdGl2ZSkgfCAnYmFycycgKG1vbnRobHkpCnZhciBpbmRpY2VzID0ge1NQNTAwOmZhbHNlLCBOQVNEQVExMDA6ZmFsc2UsIFRBMzU6ZmFsc2V9OyAgIC8vIG1hcmtldC1pbmRleCBvdmVybGF5cwp2YXIgaW5kZXhDYWNoZSA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW0gLT4geyByYW5nZU1vbnRocyAtPiBwb2ludHNbXSB9CnZhciBJRFhfTUVUQSA9IHtTUDUwMDp7bDonUyZQIDUwMCcsYzonI2MwMzkyYid9LCBOQVNEQVExMDA6e2w6J05hc2RhcSAxMDAnLGM6JyM4ZTQ0YWQnfSwgVEEzNTp7bDon16rXtNeQIDM1JyxjOicjMGU3YzdiJ319Owp2YXIgUkFOR0VfU1RSID0gezEyOicxeScsMzY6JzN5Jyw2MDonNXknLDEyMDonMTB5J307CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgSGVscGVycyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KZnVuY3Rpb24gbm9ybShzKXsgcmV0dXJuIChzfHwnJykudG9TdHJpbmcoKS5yZXBsYWNlKC9bIifXtNezXS9nLCcnKS5yZXBsYWNlKC9ccysvZywnICcpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOyB9CmZ1bmN0aW9uIGVsKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfQpmdW5jdGlvbiBlc2Mocyl7IHJldHVybiAoc3x8JycpLnRvU3RyaW5nKCkucmVwbGFjZSgvWyY8PiJdL2csZnVuY3Rpb24oYyl7cmV0dXJuIHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJyInOicmcXVvdDsnfVtjXTt9KTsgfQoKZnVuY3Rpb24gYWRkTW9udGhzKHltLCBkZWx0YSl7CiAgdmFyIHk9TWF0aC5mbG9vcih5bS8xMDApLCBtPXltJTEwMCwgdD15KjEyKyhtLTEpK2RlbHRhOwogIHZhciBueT1NYXRoLmZsb29yKHQvMTIpLCBubT0odCUxMikrMTsgcmV0dXJuIG55KjEwMCtubTsKfQpmdW5jdGlvbiBudW0odil7IHZhciBuPXBhcnNlRmxvYXQodik7IHJldHVybiBpc05hTihuKT9udWxsOm47IH0KZnVuY3Rpb24gZm10UGVyaW9kKHltKXsgeW09U3RyaW5nKHltKTsgcmV0dXJuIHltLmxlbmd0aD09PTYgPyB5bS5zbGljZSg0LDYpKycvJyt5bS5zbGljZSgwLDQpIDogJyc7IH0KZnVuY3Rpb24gcGN0KHYsZGVjKXsKICB2YXIgbj1udW0odik7CiAgaWYobj09PW51bGwpIHJldHVybiAnPHNwYW4gY2xhc3M9ImdmdC1uYSI+4oCUPC9zcGFuPic7CiAgdmFyIGMgPSBuPj0wID8gJ3Bvcyc6J25lZyc7CiAgcmV0dXJuICc8c3BhbiBjbGFzcz0iZ2Z0LXBjdCAnK2MrJyI+Jysobj49MD8nKyc6JycpK24udG9GaXhlZChkZWM9PW51bGw/MjpkZWMpKyclPC9zcGFuPic7Cn0KZnVuY3Rpb24gY3VtRnJvbUFubnVhbChhbm51YWwseWVhcnMpewogIHZhciBhPW51bShhbm51YWwpOyBpZihhPT09bnVsbCkgcmV0dXJuIG51bGw7CiAgcmV0dXJuIChNYXRoLnBvdygxK2EvMTAwLCB5ZWFycyktMSkqMTAwOwp9Ci8vIGV4cG9zdXJlIGZpZWxkcyBhcmUgYWJzb2x1dGUgYW1vdW50cyAobWlsbGlvbiDigqopIOKGkiBjb252ZXJ0IHRvICUgb2YgdG90YWwgYXNzZXRzCmZ1bmN0aW9uIGV4cFBjdChyYXcsIGFzc2V0cyl7CiAgdmFyIHY9bnVtKHJhdyksIGE9bnVtKGFzc2V0cyk7CiAgaWYodj09PW51bGwgfHwgYT09PW51bGwgfHwgYTw9MCkgcmV0dXJuIG51bGw7CiAgaWYodj49OTk5OSkgcmV0dXJuIG51bGw7ICAgICAgICAgICAgIC8vIDk5OTkuOTkgc2VudGluZWwgPSBub3QgcmVwb3J0ZWQKICB2YXIgcCA9IHYvYSoxMDA7CiAgaWYocDwwIHx8IHA+MTEwKSByZXR1cm4gbnVsbDsKICByZXR1cm4gcD4xMDAgPyAxMDAgOiBwOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgU2VhcmNoICYgZmlsdGVyIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwpmdW5jdGlvbiBhbnlGaWx0ZXIoKXsgcmV0dXJuIGZQcm9kdWN0cy5sZW5ndGh8fGZDb21wYW5pZXMubGVuZ3RofHxmU3BlY3MubGVuZ3RoOyB9CmZ1bmN0aW9uIG1hdGNoRmlsdGVycyhmKXsKICBpZihmUHJvZHVjdHMubGVuZ3RoKXsKICAgIHZhciBva3A9ZlByb2R1Y3RzLnNvbWUoZnVuY3Rpb24ocCl7CiAgICAgIGlmKHA9PT0nZ3RfZ2VtZWxfaW52ZXN0JykgcmV0dXJuIGYudHlwZT09PSdndF9nZW1lbCcgJiYgZi5uYW1lLmluZGV4T2YoJ9ec15TXqden16LXlCcpPi0xOwogICAgICByZXR1cm4gZi50eXBlPT09cDsKICAgIH0pOwogICAgaWYoIW9rcCkgcmV0dXJuIGZhbHNlOwogIH0KICBpZihmQ29tcGFuaWVzLmxlbmd0aCAmJiBmQ29tcGFuaWVzLmluZGV4T2YoZi5jb21wYW55KTwwKSByZXR1cm4gZmFsc2U7CiAgaWYoZlNwZWNzLmxlbmd0aCl7CiAgICB2YXIgbm09KGYubmFtZXx8JycpLnJlcGxhY2UoL1siJ9e017NdL2csJycpOwogICAgdmFyIG9rcz1mU3BlY3Muc29tZShmdW5jdGlvbihsYmwpeyB2YXIgbT0oU1BFQ19NQVRDSFtsYmxdfHxsYmwpLnJlcGxhY2UoL1siJ9e017NdL2csJycpOyByZXR1cm4gbm0uaW5kZXhPZihtKT4tMTsgfSk7CiAgICBpZighb2tzKSByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIHNwZWNzRm9yU2VsZWN0aW9uKCl7CiAgaWYoIWZQcm9kdWN0cy5sZW5ndGgpIHJldHVybiBHRU5FUkFMX1NQRUNTOwogIHZhciBzZWVuPXt9LCBvdXQ9W107CiAgZlByb2R1Y3RzLmZvckVhY2goZnVuY3Rpb24ocCl7IChTUEVDU19CWV9QUk9EVUNUW3BdfHxbXSkuZm9yRWFjaChmdW5jdGlvbihzKXsgaWYoIXNlZW5bcy5sXSl7c2VlbltzLmxdPTE7IG91dC5wdXNoKHMpO30gfSk7IH0pOwogIHJldHVybiBvdXQubGVuZ3RoP291dDpHRU5FUkFMX1NQRUNTOwp9CmZ1bmN0aW9uIHNjb3JlRnVuZChmLHEpewogIHZhciBjPW5vcm0oZi5jb2RlKSwgbj1ub3JtKGYubmFtZSksIGE9bm9ybShmLmFsaWFzZXN8fCcnKSwgY289bm9ybShmLmNvbXBhbnl8fCcnKTsKICB2YXIgcz0wOwogIGlmKGM9PT1xKXMrPTEyMDsgaWYoYy5pbmRleE9mKHEpPT09MClzKz03MDsgZWxzZSBpZihjLmluZGV4T2YocSk+LTEpcys9MzU7CiAgaWYobi5pbmRleE9mKHEpPT09MClzKz02MDsgZWxzZSBpZihuLmluZGV4T2YocSk+LTEpcys9MzA7CiAgaWYoYS5pbmRleE9mKHEpPi0xKXMrPTIwOwogIGlmKGNvLmluZGV4T2YocSk+LTEpcys9MTU7CiAgcmV0dXJuIHM7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBGaWx0ZXIgZHJvcGRvd25zIChtdWx0aS1zZWxlY3QgY2hlY2tib3hlcykg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIGNvbXBhbnlMaXN0KCl7CiAgdmFyIHNlZW49e30sIG91dD1bXTsKICBGVU5EUy5mb3JFYWNoKGZ1bmN0aW9uKGYpeyBpZihmLmNvbXBhbnkgJiYgIXNlZW5bZi5jb21wYW55XSl7c2VlbltmLmNvbXBhbnldPTE7IG91dC5wdXNoKGYuY29tcGFueSk7fSB9KTsKICByZXR1cm4gb3V0LnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIsJ2hlJyk7fSk7Cn0KZnVuY3Rpb24gc2VsQXJyKGtpbmQpeyByZXR1cm4ga2luZD09PSdwcm9kdWN0Jz9mUHJvZHVjdHM6a2luZD09PSdjb21wYW55Jz9mQ29tcGFuaWVzOmZTcGVjczsgfQpmdW5jdGlvbiBidWlsZEZpbHRlck1lbnUoa2luZCl7CiAgdmFyIGl0ZW1zLCBjaG9zZW49c2VsQXJyKGtpbmQpLCBhbGxMYWJlbDsKICBpZihraW5kPT09J3Byb2R1Y3QnKXsgaXRlbXM9UFJPRFVDVFMubWFwKGZ1bmN0aW9uKHApe3JldHVybiB7djpwLnYsbDpwLmx9O30pOyBhbGxMYWJlbD0n15vXnCDXlNee15XXpteo15nXnSc7IH0KICBlbHNlIGlmKGtpbmQ9PT0nY29tcGFueScpeyBpdGVtcz1jb21wYW55TGlzdCgpLm1hcChmdW5jdGlvbihjKXtyZXR1cm4ge3Y6YyxsOmN9O30pOyBhbGxMYWJlbD0n15vXnCDXlNeX15HXqNeV16onOyB9CiAgZWxzZSB7IGl0ZW1zPXNwZWNzRm9yU2VsZWN0aW9uKCkubWFwKGZ1bmN0aW9uKHMpe3JldHVybiB7djpzLmwsbDpzLmx9O30pOyBhbGxMYWJlbD0n15vXnCDXlNeU16rXnteX15XXmdeV16onOyB9CiAgdmFyIGhlYWQ9JzxidXR0b24gY2xhc3M9ImdmdC1mbWVudS1pdGVtIGdmdC1mbWVudS1hbGwnKyhjaG9zZW4ubGVuZ3RoPT09MD8nIG9uJzonJykrJyIgZGF0YS1raW5kPSInK2tpbmQrJyIgZGF0YS12PSJfX2FsbF9fIj4nKwogICAgJzxzcGFuIGNsYXNzPSJnZnQtZm1lbnUtbGJsIj4nK2FsbExhYmVsKyc8L3NwYW4+PHNwYW4gY2xhc3M9ImdmdC1jYngnKyhjaG9zZW4ubGVuZ3RoPT09MD8nIG9uJzonJykrJyI+PC9zcGFuPjwvYnV0dG9uPic7CiAgdmFyIGxpc3RIdG1sPSc8ZGl2IGNsYXNzPSJnZnQtZm1lbnUtbGlzdCI+JytoZWFkK2l0ZW1zLm1hcChmdW5jdGlvbihpdCl7CiAgICB2YXIgb249Y2hvc2VuLmluZGV4T2YoaXQudik+LTE7CiAgICByZXR1cm4gJzxidXR0b24gY2xhc3M9ImdmdC1mbWVudS1pdGVtJysob24/JyBvbic6JycpKyciIGRhdGEta2luZD0iJytraW5kKyciIGRhdGEtdj0iJytlc2MoaXQudikrJyI+JysKICAgICAgJzxzcGFuIGNsYXNzPSJnZnQtZm1lbnUtbGJsIj4nK2VzYyhpdC5sKSsnPC9zcGFuPjxzcGFuIGNsYXNzPSJnZnQtY2J4Jysob24/JyBvbic6JycpKyciPjwvc3Bhbj48L2J1dHRvbj4nOwogIH0pLmpvaW4oJycpKyc8L2Rpdj4nOwogIHZhciBjbnQgPSBhbnlGaWx0ZXIoKSA/IEZVTkRTLmZpbHRlcihtYXRjaEZpbHRlcnMpLmxlbmd0aCA6IDA7CiAgdmFyIGFwcGx5SHRtbCA9ICc8YnV0dG9uIGNsYXNzPSJnZnQtZm1lbnUtYXBwbHkiJysoYW55RmlsdGVyKCk/Jyc6JyBkaXNhYmxlZCcpKyc+JysKICAgIChhbnlGaWx0ZXIoKT8n15TXpteSIDxiPicrY250Kyc8L2I+INen15XXpNeV16og16rXldeQ157XldeqIOKAuic6J9eh157XnyDXnteh16DXoNeZ150g15vXk9eZINec15TXpteZ15Ig16fXldek15XXqicpKyc8L2J1dHRvbj4nOwogIHJldHVybiBsaXN0SHRtbCthcHBseUh0bWw7Cn0KZnVuY3Rpb24gdG9nZ2xlRmlsdGVyKGtpbmQsdil7CiAgdmFyIGFycj1zZWxBcnIoa2luZCk7CiAgaWYodj09PSdfX2FsbF9fJyl7IGFyci5sZW5ndGg9MDsgfQogIGVsc2UgeyB2YXIgaT1hcnIuaW5kZXhPZih2KTsgaWYoaT4tMSkgYXJyLnNwbGljZShpLDEpOyBlbHNlIGFyci5wdXNoKHYpOyB9CiAgaWYoa2luZD09PSdwcm9kdWN0JykgZlNwZWNzLmxlbmd0aD0wOyAgIC8vIHNwZWNpYWxpemF0aW9ucyBkZXBlbmQgb24gcHJvZHVjdCDihpIgcmVzZXQgd2hlbiBwcm9kdWN0IGNoYW5nZXMKfQpmdW5jdGlvbiBmaWx0ZXJMYWJlbChraW5kKXsKICB2YXIgYXJyPXNlbEFycihraW5kKTsKICBpZighYXJyLmxlbmd0aCkgcmV0dXJuIGtpbmQ9PT0ncHJvZHVjdCc/J9eR15fXmdeo16og157Xldem16gnOmtpbmQ9PT0nY29tcGFueSc/J9eR15fXmdeo16og15fXkdeo15QnOifXkdeX15nXqNeqINeU16rXnteX15XXqic7CiAgaWYoYXJyLmxlbmd0aD09PTEpewogICAgaWYoa2luZD09PSdwcm9kdWN0JykgcmV0dXJuIChQUk9EVUNUUy5maWx0ZXIoZnVuY3Rpb24ocCl7cmV0dXJuIHAudj09PWFyclswXTt9KVswXXx8e30pLmx8fGFyclswXTsKICAgIHJldHVybiBhcnJbMF07CiAgfQogIHJldHVybiBhcnIubGVuZ3RoKycg16DXkdeX16jXlSc7Cn0KZnVuY3Rpb24gcmVmcmVzaEZpbHRlckNoaXBzKCl7CiAgWydwcm9kdWN0JywnY29tcGFueScsJ3NwZWMnXS5mb3JFYWNoKGZ1bmN0aW9uKGspewogICAgdmFyIGI9ZWwoJ2dmdC1mYnRuLScrayk7IGlmKCFiKSByZXR1cm47CiAgICBiLnF1ZXJ5U2VsZWN0b3IoJy5nZnQtZmJ0bi10eHQnKS50ZXh0Q29udGVudCA9IGZpbHRlckxhYmVsKGs9PT0nc3BlYyc/J3NwZWMnOmspOwogICAgYi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCAhIXNlbEFycihrPT09J3NwZWMnPydzcGVjJzprKS5sZW5ndGgpOwogIH0pOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgU2VhcmNoIHJlc3VsdHMgZHJvcGRvd24g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIE9wZW5zIE9OTFkgb24gdGV4dCAoPj0yIGNoYXJzKSBvciB2aWEgdGhlIHNlYXJjaCBidXR0b24g4oCUIG5ldmVyIGF1dG8gb24gZmlsdGVyIGNoYW5nZS4gKi8KZnVuY3Rpb24gdXBkYXRlUmVzdWx0cygpewogIHZhciBib3g9ZWwoJ2dmdC1kcm9wJyk7IGlmKCFib3gpIHJldHVybjsKICB2YXIgcT1ub3JtKChlbCgnZ2Z0LXNlYXJjaCcpfHx7fSkudmFsdWV8fCcnKTsKICB2YXIgaGFzVGV4dD1xLmxlbmd0aD49MjsKICBpZighaGFzVGV4dCAmJiAhcmVzdWx0c0ZvcmNlZCl7IGJveC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7IGJveC5pbm5lckhUTUw9Jyc7IHJldHVybjsgfQogIHZhciBsaXN0PUZVTkRTLmZpbHRlcihtYXRjaEZpbHRlcnMpOwogIGlmKGhhc1RleHQpewogICAgbGlzdD1saXN0Lm1hcChmdW5jdGlvbihmKXtyZXR1cm4ge2Y6ZixzOnNjb3JlRnVuZChmLHEpfTt9KQogICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5zPjA7fSkKICAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIucy1hLnM7fSkKICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHguZjt9KTsKICB9IGVsc2UgewogICAgaWYoIWFueUZpbHRlcigpKXsgYm94LmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsgYm94LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZ2Z0LWRyb3AtZW1wdHkiPteR15fXqCDXnteh16DXoNeZ150g15DXlSDXlNen15zXkyDXnNek15fXldeqIDIg15DXldeq15nXldeqINec15fXmdek15XXqTwvZGl2Pic7IHJldHVybjsgfQogICAgbGlzdC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIChhLm5hbWU8Yi5uYW1lKT8tMToxO30pOwogIH0KICBib3guY2xhc3NMaXN0LmFkZCgnb3BlbicpOwogIGlmKCFsaXN0Lmxlbmd0aCl7IGJveC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImdmdC1kcm9wLWVtcHR5Ij7XnNeQINeg157XpteQ15Ug16fXldek15XXqiDXlNeq15XXkNee15XXqjwvZGl2Pic7IHJldHVybjsgfQogIHZhciBzaG93bj1saXN0LnNsaWNlKDAsNjApOwogIHZhciBoZWFkID0gbGlzdC5sZW5ndGg+c2hvd24ubGVuZ3RoID8gJzxkaXYgY2xhc3M9ImdmdC1kcm9wLWhlYWQiPtee16bXmdeSICcrc2hvd24ubGVuZ3RoKycg157XqteV15ogJytsaXN0Lmxlbmd0aCsnINeq15XXpteQ15XXqiDCtyDXptee16bXnSDXnteh16DXoNeZ150g15DXlSDXlNen15zXkyDXnNeX15nXpNeV16k8L2Rpdj4nIDogJyc7CiAgYm94LmlubmVySFRNTCA9IGhlYWQgKyBzaG93bi5tYXAoZnVuY3Rpb24oZil7CiAgICB2YXIgcGlja2VkID0gc2VsLnNvbWUoZnVuY3Rpb24oeCl7cmV0dXJuIHguY29kZT09PWYuY29kZTt9KTsKICAgIHZhciBsb2dvID0gZi5sb2dvID8gJzxpbWcgY2xhc3M9ImdmdC1kcm9wLWxvZ28iIHNyYz0iJytlc2MoZi5sb2dvKSsnIiBsb2FkaW5nPSJsYXp5IiBhbHQ9IiI+JyA6ICc8c3BhbiBjbGFzcz0iZ2Z0LWRyb3AtbG9nbyBnZnQtbG9nby1waCI+PC9zcGFuPic7CiAgICByZXR1cm4gJzxkaXYgY2xhc3M9ImdmdC1kcm9wLWl0ZW0nKyhwaWNrZWQ/JyBwaWNrZWQnOicnKSsnIiBkYXRhLWNvZGU9IicrZXNjKGYuY29kZSkrJyIgZGF0YS1waWNrZWQ9IicrKHBpY2tlZD8xOjApKyciPicrCiAgICAgICAgbG9nbysKICAgICAgICAnPGRpdiBjbGFzcz0iZ2Z0LWRyb3AtaW5mbyI+JysKICAgICAgICAgICc8ZGl2IGNsYXNzPSJnZnQtZHJvcC1uYW1lIj4nK2VzYyhmLm5hbWUpKyc8L2Rpdj4nKwogICAgICAgICAgJzxkaXYgY2xhc3M9ImdmdC1kcm9wLW1ldGEiPjxzcGFuIGNsYXNzPSJnZnQtZHJvcC1jb21wIj4nK2VzYyhmLmNvbXBhbnl8fFRMW2YudHlwZV18fCcnKSsnPC9zcGFuPiDCtyDXnteh17MgJytlc2MoZi5jb2RlKSsnPC9kaXY+JysKICAgICAgICAnPC9kaXY+JysKICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iZ2Z0LWRyb3AtYWRkIiAnKyhwaWNrZWQ/J2Rpc2FibGVkJzonJykrJyB0YWJpbmRleD0iLTEiIHRpdGxlPSLXlNeV16HXoyDXnNeU16nXldeV15DXlCI+JysocGlja2VkPyfinJMnOicrJykrJzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nOwogIH0pLmpvaW4oJycpOwp9CmZ1bmN0aW9uIGNsb3NlUmVzdWx0cygpeyByZXN1bHRzRm9yY2VkPWZhbHNlOyB2YXIgYj1lbCgnZ2Z0LWRyb3AnKTsgaWYoYil7IGIuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOyBiLmlubmVySFRNTD0nJzsgfSB9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgU2VsZWN0aW9uIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwpmdW5jdGlvbiBhZGRGdW5kKGNvZGUpewogIGlmKHNlbC5sZW5ndGg+PU1BWF9TRUwpeyB0b2FzdCgn16DXmdeq158g15zXlNep15XXldeqINei15MgJytNQVhfU0VMKycg16fXldek15XXqicpOyByZXR1cm47IH0KICBpZihzZWwuc29tZShmdW5jdGlvbih4KXtyZXR1cm4geC5jb2RlPT09Y29kZTt9KSkgcmV0dXJuOwogIHZhciBmPUZVTkRTLmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5jb2RlPT09Y29kZTt9KVswXTsgaWYoIWYpIHJldHVybjsKICBzZWwucHVzaChmKTsKICB0b2FzdCgn4pyTICcrKGYubmFtZS5sZW5ndGg+MjY/Zi5uYW1lLnNsaWNlKDAsMjUpKyfigKYnOmYubmFtZSkrJyDXoNeV16HXoycpOwogIHVwZGF0ZVJlc3VsdHMoKTsKICBsb2FkQW5kUmVuZGVyKCk7Cn0KZnVuY3Rpb24gcmVtb3ZlRnVuZChjb2RlKXsKICBzZWw9c2VsLmZpbHRlcihmdW5jdGlvbih4KXtyZXR1cm4geC5jb2RlIT09Y29kZTt9KTsKICBpZihleHBhbmRlZENvZGU9PT1jb2RlKSBleHBhbmRlZENvZGU9bnVsbDsKICB1cGRhdGVSZXN1bHRzKCk7CiAgbG9hZEFuZFJlbmRlcigpOwp9CndpbmRvdy5nZnRSZW1vdmU9cmVtb3ZlRnVuZDsKCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBMb2FkIG1ldHJpY3MgKyBzZXJpZXMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIGxvYWRBbmRSZW5kZXIoKXsKICB1cGRhdGVVUkwoKTsgdXBkYXRlVGFicygpOwogIHZhciBhcmVhPWVsKCdnZnQtY29tcGFyZScpOwogIGlmKCFzZWwubGVuZ3RoKXsgaWYoYXJlYSkgYXJlYS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IGVsKCdnZnQtZW1wdHktY3RhJykuc3R5bGUuZGlzcGxheT0nYmxvY2snOyByZXR1cm47IH0KICBlbCgnZ2Z0LWVtcHR5LWN0YScpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogIGlmKGFyZWEpIGFyZWEuY2xhc3NMaXN0LmFkZCgnc2hvdycpOwogIHZhciByaD1lbCgnZ2Z0LWNhbGMtcmVzdWx0cycpOyBpZihyaCkgcmguaW5uZXJIVE1MPScnOyAvLyBzZWxlY3Rpb24gY2hhbmdlZCDihpIgY2FsYyByZXN1bHRzIHN0YWxlCiAgcmVuZGVyVGFibGUoKTsgICAgICAvLyBvcHRpbWlzdGljIChzaG93cyBzcGlubmVycyBmb3IgbWlzc2luZykKICBkcmF3R3JhcGgoKTsKCiAgdmFyIG5lZWQ9c2VsLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4gIW1ldHJpY3NbZi5jb2RlXTt9KS5tYXAoZnVuY3Rpb24oZil7cmV0dXJuIGYuY29kZTt9KTsKICBpZihuZWVkLmxlbmd0aCl7CiAgICBmZXRjaChBUEkrJy9hcnRpY2xlLWRhdGEvY29tcGFyZT9mdW5kcz0nK25lZWQuam9pbignLCcpKQogICAgICAudGhlbihmdW5jdGlvbihyKXtyZXR1cm4gci5qc29uKCk7fSkKICAgICAgLnRoZW4oZnVuY3Rpb24oail7CiAgICAgICAgKGouZGF0YXx8W10pLmZvckVhY2goZnVuY3Rpb24oZCl7IG1ldHJpY3NbU3RyaW5nKGQuZnVuZF9pZCldPWQ7IH0pOwogICAgICAgIHJlbmRlclRhYmxlKCk7CiAgICAgIH0pCiAgICAgIC5jYXRjaChmdW5jdGlvbigpeyByZW5kZXJUYWJsZSgpOyB9KTsKICB9Cn0KCmZ1bmN0aW9uIGxvYWRTZXJpZXMoY29kZSwgcmFuZ2UsIGNiKXsKICBzZXJpZXNDYWNoZVtjb2RlXT1zZXJpZXNDYWNoZVtjb2RlXXx8e307CiAgaWYoc2VyaWVzQ2FjaGVbY29kZV1bcmFuZ2VdKXsgY2Ioc2VyaWVzQ2FjaGVbY29kZV1bcmFuZ2VdKTsgcmV0dXJuOyB9CiAgdmFyIHRvPUxBVEVTVF9QRVJJT0QsIGZyb209YWRkTW9udGhzKHRvLCAtKHJhbmdlLTEpKTsKICBmZXRjaChBUEkrJy95aWVsZHMvcXVlcnk/ZnVuZF9pZD0nK2NvZGUrJyZmcm9tPScrZnJvbSsnJnRvPScrdG8pCiAgICAudGhlbihmdW5jdGlvbihyKXtyZXR1cm4gci5qc29uKCk7fSkKICAgIC50aGVuKGZ1bmN0aW9uKGopeyB2YXIgbWQ9KGomJmoubW9udGhseV9kYXRhKXx8W107IHNlcmllc0NhY2hlW2NvZGVdW3JhbmdlXT1tZDsgY2IobWQpOyB9KQogICAgLmNhdGNoKGZ1bmN0aW9uKCl7IGNiKFtdKTsgfSk7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBDb21wYXJpc29uIHRhYmxlIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwp2YXIgdGVuWWVhciA9IHt9OyAgICAgIC8vIGNvZGUgLT4ge2N1bSxhbm59IHwge25hOnRydWV9IHwge2xvYWRpbmc6dHJ1ZX0KdmFyIHJhbmtEYXRhID0ge307ICAgICAvLyBjb2RlIC0+IHtyYW5rLHRvdGFsfSB8IHtuYTp0cnVlfSB8IHtsb2FkaW5nOnRydWV9ICAoMy15ciBjYXRlZ29yeSByYW5rKQp2YXIgcGVuc2lhID0ge307ICAgICAgIC8vIHBlbnNpb24gY29kZSAtPiB7bG9hZGluZ30gfCB7bmF9IHwge2FjdCxzdG9jayxmb3JlaWduLGZvcmV4LGlsbGlxdWlkfSAgKGZyb20gZGF0YS5nb3YuaWwg16TXoNeh15nXlC3XoNeYKQp2YXIgUEVOU0lBX05FVF9SSUQgPSAnNmQ0N2Q2YjUtY2IwOC00ODhiLWIzMzMtZjFlNzE3YjFlMWJkJzsgLy8gZGF0YS5nb3YuaWwg16TXoNeh15nXlC3XoNeYIDIwMjTihpIKCi8vIENvbHVtbnMgaW4gcmVhZGluZyBvcmRlcjogcmlnaHQgKGJlc2lkZSB0aGUgZnVuZCkg4oaSIGxlZnQKLy8gYWN0dWFyaWFsIGNvbnRyaWJ1dGlvbiAoJSkgZm9yIGEgdHJhaWxpbmcgd2luZG93IOKAlCAwIGZvciBub24tcGVuc2lvbiAvIHVuYXZhaWxhYmxlCmZ1bmN0aW9uIGFjdFdpbmRvdyhmLCBtb250aHMpewogIGlmKGYudHlwZSE9PSdndF9wZW5zaXlhJykgcmV0dXJuIDA7CiAgdmFyIHA9cGVuc2lhW2YuY29kZV07CiAgaWYoIXB8fHAubG9hZGluZ3x8cC5uYXx8IXAuYWN0V2luKSByZXR1cm4gMDsKICB2YXIgdj1wLmFjdFdpbltTdHJpbmcobW9udGhzKV07CiAgcmV0dXJuIHY9PW51bGw/MDp2Owp9CmZ1bmN0aW9uIHRhYmxlQ29scygpewogIHZhciBBPSh0YWI9PT0nYWN0Jyk7ICAgLy8gIteb15XXnNecINeQ15nXlteV158g15DXp9eY15XXkNeo15kiIOKGkiBhZGQgdGhlIGFjdHVhcmlhbCBiYWxhbmNlIGludG8gdGhlIHJldHVybnMKICB2YXIgY29scz1bCiAgICB7bGJsOicxMiDXl9eV15PXqdeZ150nLCB2OmZ1bmN0aW9uKGQsZil7IHZhciBiPW51bShkLnJldHVybl8xeSk7IGlmKGI9PW51bGwpIHJldHVybiBudWxsOyByZXR1cm4gQT9iK2FjdFdpbmRvdyhmLDEyKTpiOyB9fSwKICAgIHtsYmw6JzMg16nXoNeZ150nLCAgICB2OmZ1bmN0aW9uKGQsZil7IHZhciBiPXRhYj09PSdhdmcnP251bShkLnJldHVybl8zeV9hbm51YWwpOmN1bUZyb21Bbm51YWwoZC5yZXR1cm5fM3lfYW5udWFsLDMpOyBpZihiPT1udWxsKSByZXR1cm4gbnVsbDsgcmV0dXJuIEE/YithY3RXaW5kb3coZiwzNik6YjsgfX0sCiAgICB7bGJsOic1INep16DXmdedJywgICAgdjpmdW5jdGlvbihkLGYpeyB2YXIgYj10YWI9PT0nYXZnJz9udW0oZC5yZXR1cm5fNXlfYW5udWFsKTpjdW1Gcm9tQW5udWFsKGQucmV0dXJuXzV5X2FubnVhbCw1KTsgaWYoYj09bnVsbCkgcmV0dXJuIG51bGw7IHJldHVybiBBP2IrYWN0V2luZG93KGYsNjApOmI7IH19LAogICAge2xibDonMTAg16nXoNeZ150nLCAgIHY6ZnVuY3Rpb24oZCxmKXsgdmFyIHQ9dGVuWWVhcltmLmNvZGVdOyBpZighdHx8dC5sb2FkaW5nKSByZXR1cm4gdW5kZWZpbmVkOyBpZih0Lm5hKSByZXR1cm4gbnVsbDsgdmFyIGI9dGFiPT09J2F2Zyc/dC5hbm46dC5jdW07IHJldHVybiBBP2IrYWN0V2luZG93KGYsMTIwKTpiOyB9fQogIF07CiAgaWYoQSkgY29scy5wdXNoKHtsYmw6J9eQ15nXlteV158g15DXp9eY15XXkNeo15knLCBzdWI6JzEyINeX17MnLCB2OmZ1bmN0aW9uKGQsZil7IGlmKGYudHlwZSE9PSdndF9wZW5zaXlhJykgcmV0dXJuIG51bGw7IHZhciBhPXBlbnNpYVtmLmNvZGVdOyBpZighYXx8YS5sb2FkaW5nKSByZXR1cm4gdW5kZWZpbmVkOyBpZihhLm5hfHxhLmFjdD09bnVsbCkgcmV0dXJuIG51bGw7IHJldHVybiBhLmFjdDsgfX0pOwogIHJldHVybiBjb2xzOwp9Ci8vIFBlbnNpb24gZnVuZHM6IHB1bGwgYWN0dWFyaWFsICsgcmVhbCBleHBvc3VyZXMgZnJvbSBkYXRhLmdvdi5pbCDXpNeg16HXmdeULdeg15gKLy8gKHRoZSBzaXRlJ3MgY29tcGFyZSBlbmRwb2ludCByZXR1cm5zIDk5OTkuOTkgc2VudGluZWxzIGZvciBwZW5zaW9uIGV4cG9zdXJlcykuCmZ1bmN0aW9uIGVuc3VyZVBlbnNpYSgpewogIHNlbC5mb3JFYWNoKGZ1bmN0aW9uKGYpewogICAgaWYoZi50eXBlIT09J2d0X3BlbnNpeWEnKSByZXR1cm47CiAgICBpZihwZW5zaWFbZi5jb2RlXSkgcmV0dXJuOwogICAgcGVuc2lhW2YuY29kZV09e2xvYWRpbmc6dHJ1ZX07CiAgICB2YXIgdXJsPSdodHRwczovL2RhdGEuZ292LmlsL2FwaS8zL2FjdGlvbi9kYXRhc3RvcmVfc2VhcmNoP3Jlc291cmNlX2lkPScrUEVOU0lBX05FVF9SSUQrJyZxPScrZW5jb2RlVVJJQ29tcG9uZW50KGYuY29kZSkrJyZsaW1pdD00MCZzb3J0PScrZW5jb2RlVVJJQ29tcG9uZW50KCdSRVBPUlRfUEVSSU9EIGRlc2MnKTsKICAgIGZldGNoKHVybCkudGhlbihmdW5jdGlvbihyKXtyZXR1cm4gci5qc29uKCk7fSkudGhlbihmdW5jdGlvbihqKXsKICAgICAgdmFyIHJlY3M9KCgoai5yZXN1bHR8fHt9KS5yZWNvcmRzKXx8W10pLmZpbHRlcihmdW5jdGlvbihyKXtyZXR1cm4gU3RyaW5nKHIuRlVORF9JRCk9PT1TdHJpbmcoZi5jb2RlKTt9KTsKICAgICAgaWYoIXJlY3MubGVuZ3RoKXsgcGVuc2lhW2YuY29kZV09e25hOnRydWV9OyByZW5kZXJUYWJsZSgpOyByZXR1cm47IH0KICAgICAgZnVuY3Rpb24gc3VtQWN0KG4peyB2YXIgcz0wLGhhcz1mYWxzZTsgcmVjcy5zbGljZSgwLG4pLmZvckVhY2goZnVuY3Rpb24ocil7IHZhciB2PW51bShyLkFDVFVBUklBTF9BREpVU1RNRU5UKTsgaWYodiE9PW51bGwpeyBzKz12OyBoYXM9dHJ1ZTsgfSB9KTsgcmV0dXJuIGhhcz9zOm51bGw7IH0KICAgICAgdmFyIGFjdFdpbj17JzEyJzpzdW1BY3QoMTIpLCczNic6c3VtQWN0KDM2KSwnNjAnOnN1bUFjdCg2MCksJzEyMCc6c3VtQWN0KDEyMCl9OwogICAgICB2YXIgbGF0ZXN0PXJlY3NbMF0sIEE9bnVtKGxhdGVzdC5UT1RBTF9BU1NFVFMpOwogICAgICBmdW5jdGlvbiBlcCh4KXsgdmFyIHY9bnVtKHgpOyBpZih2PT09bnVsbHx8QT09PW51bGx8fEE8PTApIHJldHVybiBudWxsOyB2YXIgcD12L0EqMTAwOyByZXR1cm4gKHA8MHx8cD4xNTApP251bGw6TWF0aC5taW4ocCwxMDApOyB9CiAgICAgIHZhciBsaXE9bnVtKGxhdGVzdC5MSVFVSURfQVNTRVRTX1BFUkNFTlQpOwogICAgICBwZW5zaWFbZi5jb2RlXT17CiAgICAgICAgYWN0OiBhY3RXaW5bJzEyJ10sIGFjdFdpbjogYWN0V2luLAogICAgICAgIHN0b2NrOiBlcChsYXRlc3QuU1RPQ0tfTUFSS0VUX0VYUE9TVVJFKSwKICAgICAgICBmb3JlaWduOiBlcChsYXRlc3QuRk9SRUlHTl9FWFBPU1VSRSksCiAgICAgICAgZm9yZXg6IGVwKGxhdGVzdC5GT1JFSUdOX0NVUlJFTkNZX0VYUE9TVVJFKSwKICAgICAgICBpbGxpcXVpZDogKGxpcSE9PW51bGwmJmxpcT49MCYmbGlxPD0xMDApPygxMDAtbGlxKTpudWxsCiAgICAgIH07CiAgICAgIHJlbmRlclRhYmxlKCk7CiAgICB9KS5jYXRjaChmdW5jdGlvbigpeyBwZW5zaWFbZi5jb2RlXT17bmE6dHJ1ZX07IHJlbmRlclRhYmxlKCk7IH0pOwogIH0pOwp9Ci8vIENhdGVnb3J5IHJhbmsgKG92ZXIgYSB0cmFpbGluZyAzLXllYXIgd2luZG93KSBmcm9tIHRoZSB5aWVsZHMgc3VtbWFyeQpmdW5jdGlvbiBlbnN1cmVSYW5rKCl7CiAgc2VsLmZvckVhY2goZnVuY3Rpb24oZil7CiAgICBpZihyYW5rRGF0YVtmLmNvZGVdKSByZXR1cm47CiAgICByYW5rRGF0YVtmLmNvZGVdPXtsb2FkaW5nOnRydWV9OwogICAgdmFyIHRvPWFkZE1vbnRocyhMQVRFU1RfUEVSSU9ELC0xKSwgZnJvbT1hZGRNb250aHModG8sLTM1KTsgIC8vIGZ1bGwgM3kgd2luZG93IGVuZGluZyBhdCB0aGUgbGFzdCBDT01QTEVURSBtb250aAogICAgZmV0Y2goQVBJKycveWllbGRzL3F1ZXJ5P2Z1bmRfaWQ9JytmLmNvZGUrJyZmcm9tPScrZnJvbSsnJnRvPScrdG8pCiAgICAgIC50aGVuKGZ1bmN0aW9uKHIpe3JldHVybiByLmpzb24oKTt9KQogICAgICAudGhlbihmdW5jdGlvbihqKXsKICAgICAgICB2YXIgcz1qJiZqLnN1bW1hcnk7CiAgICAgICAgcmFua0RhdGFbZi5jb2RlXT0ocyYmcy5yYW5rJiZzLnRvdGFsX2luX2NhdGVnb3J5KT97cmFuazpzLnJhbmssdG90YWw6cy50b3RhbF9pbl9jYXRlZ29yeX06e25hOnRydWV9OwogICAgICAgIHJlbmRlclRhYmxlKCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCl7IHJhbmtEYXRhW2YuY29kZV09e25hOnRydWV9OyByZW5kZXJUYWJsZSgpOyB9KTsKICB9KTsKfQpmdW5jdGlvbiByYW5rQmFkZ2UoZil7CiAgdmFyIHI9cmFua0RhdGFbZi5jb2RlXTsKICBpZighcnx8ci5sb2FkaW5nfHxyLm5hKSByZXR1cm4gJyc7CiAgdmFyIGZyYWM9ci5yYW5rL3IudG90YWwsIGNscz1mcmFjPD0wLjI1Pyd0b3AnOmZyYWM8PTAuNT8nbWlkJzonbG93JzsKICB2YXIgc3Rhcj1mcmFjPD0wLjI1PyfirZAgJzonJzsKICByZXR1cm4gJzxzcGFuIGNsYXNzPSJnZnQtcmFuayAnK2NscysnIiB0aXRsZT0i15PXmdeo15XXkiDXnNek15kg16rXqdeV15DXlCDXntem15jXkdeo16og15wtMyDXqdeg15nXnSDXkden15jXkteV16jXmdeUIj4nK3N0YXIrJ9ee15PXldeo15IgJytyLnJhbmsrJyDXnteq15XXmiAnK3IudG90YWwrJzwvc3Bhbj4nOwp9CmZ1bmN0aW9uIHVwZGF0ZURhdGFQZXJpb2QoKXsKICB2YXIgZTI9ZWwoJ2dmdC1kYXRhLXBlcmlvZCcpOyBpZighZTIpIHJldHVybjsKICB2YXIgcD1udWxsOwogIGZvcih2YXIgaT0wO2k8c2VsLmxlbmd0aDtpKyspeyB2YXIgZD1tZXRyaWNzW3NlbFtpXS5jb2RlXTsgaWYoZCYmZC5yZXBvcnRfcGVyaW9kKXsgcD1kLnJlcG9ydF9wZXJpb2Q7IGJyZWFrOyB9IH0KICBpZighcCkgcD1MQVRFU1RfUEVSSU9EOwogIGUyLnRleHRDb250ZW50ID0gcD8oJ8K3INeg15vXldefINec16rXp9eV16TXlCAnK2ZtdFBlcmlvZChwKSk6Jyc7Cn0KZnVuY3Rpb24gdXBkYXRlVGFicygpewogIHZhciBoYXNQZW5zaW9uPXNlbC5zb21lKGZ1bmN0aW9uKGYpe3JldHVybiBmLnR5cGU9PT0nZ3RfcGVuc2l5YSc7fSk7CiAgdmFyIGF0PWVsKCdnZnQtdGFiLWFjdCcpOyBpZihhdCkgYXQuc3R5bGUuZGlzcGxheT1oYXNQZW5zaW9uPycnOidub25lJzsKICBpZighaGFzUGVuc2lvbiAmJiB0YWI9PT0nYWN0Jyl7IHRhYj0nY3VtJzsgdmFyIHR0PWVsKCdnZnQtdGFicycpOyBpZih0dCkgdHQucXVlcnlTZWxlY3RvckFsbCgnLmdmdC10YWInKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnRvZ2dsZSgnb24nLHguZGF0YXNldC50YWI9PT0nY3VtJyk7fSk7IH0KfQovLyBQZXJzaXN0IC8gcmVzdG9yZSB0aGUgc2VsZWN0ZWQgZnVuZHMgaW4gdGhlIFVSTCAoP2Z1bmRzPWNvZGUsY29kZSkKZnVuY3Rpb24gdXBkYXRlVVJMKCl7CiAgdHJ5eyB2YXIgdT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsgdmFyIGNvZGVzPXNlbC5tYXAoZnVuY3Rpb24oZil7cmV0dXJuIGYuY29kZTt9KTsKICAgIGlmKGNvZGVzLmxlbmd0aCkgdS5zZWFyY2hQYXJhbXMuc2V0KCdmdW5kcycsY29kZXMuam9pbignLCcpKTsgZWxzZSB1LnNlYXJjaFBhcmFtcy5kZWxldGUoJ2Z1bmRzJyk7CiAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCcnLHUudG9TdHJpbmcoKSk7IH1jYXRjaChlKXt9Cn0KZnVuY3Rpb24gbG9hZEZyb21VUkwoKXsKICB0cnl7IHZhciBxPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ2Z1bmRzJyk7IGlmKCFxKSByZXR1cm47CiAgICBxLnNwbGl0KCcsJykuc2xpY2UoMCxNQVhfU0VMKS5mb3JFYWNoKGZ1bmN0aW9uKGMpeyBjPWMudHJpbSgpOyB2YXIgZj1GVU5EUy5maWx0ZXIoZnVuY3Rpb24oeCl7cmV0dXJuIHguY29kZT09PWM7fSlbMF07IGlmKGYmJiFzZWwuc29tZShmdW5jdGlvbih4KXtyZXR1cm4geC5jb2RlPT09Zi5jb2RlO30pKSBzZWwucHVzaChmKTsgfSk7CiAgfWNhdGNoKGUpe30KfQoKLy8gVW5pZmllZCBleHBvc3VyZSBwZXIgZnVuZDogcGVuc2lvbiDihpIg16TXoNeh15nXlC3XoNeYLCBvdGhlcnMg4oaSIGNvbXBhcmUgZW5kcG9pbnQKZnVuY3Rpb24gZnVuZEV4cG9zdXJlKGYpewogIGlmKGYudHlwZT09PSdndF9wZW5zaXlhJyl7CiAgICB2YXIgcD1wZW5zaWFbZi5jb2RlXTsKICAgIGlmKCFwfHxwLmxvYWRpbmcpIHJldHVybiB7bG9hZGluZzp0cnVlfTsKICAgIGlmKHAubmEpIHJldHVybiB7c3RvY2s6bnVsbCxmb3JlaWduOm51bGwsZm9yZXg6bnVsbCxpbGxpcXVpZDpudWxsfTsKICAgIHJldHVybiB7c3RvY2s6cC5zdG9jayxmb3JlaWduOnAuZm9yZWlnbixmb3JleDpwLmZvcmV4LGlsbGlxdWlkOnAuaWxsaXF1aWR9OwogIH0KICB2YXIgZD1tZXRyaWNzW2YuY29kZV18fHt9LCBBPWQuYXNzZXRzOwogIHJldHVybiB7c3RvY2s6ZXhwUGN0KGQuZXF1aXR5X2xvY2FsLEEpLGZvcmVpZ246ZXhwUGN0KGQuZXF1aXR5X2ZvcmVpZ24sQSksZm9yZXg6ZXhwUGN0KGQuZm9yZXhfZXhwb3N1cmUsQSksaWxsaXF1aWQ6bnVsbH07Cn0KZnVuY3Rpb24gY29sSGVhZGVycygpewogIHJldHVybiB0YWJsZUNvbHMoKS5tYXAoZnVuY3Rpb24oYyl7CiAgICByZXR1cm4gJzx0aCBjbGFzcz0iZ2Z0LWNvbC1udW0iPicrYy5sYmwrKGMuc3ViPyc8c3BhbiBjbGFzcz0iZ2Z0LXRoLXN1YiI+JytjLnN1YisnPC9zcGFuPic6JycpKyc8L3RoPic7CiAgfSkuam9pbignJyk7Cn0KZnVuY3Rpb24gY2VsbEh0bWwoYyxkLGYpewogIGlmKCFkKSByZXR1cm4gJzx0ZCBjbGFzcz0iZ2Z0LWNvbC1udW0iPjxzcGFuIGNsYXNzPSJnZnQtc3BpbiI+PC9zcGFuPjwvdGQ+JzsKICB2YXIgdmFsPWMudihkLGYpOwogIGlmKHZhbD09PXVuZGVmaW5lZCkgcmV0dXJuICc8dGQgY2xhc3M9ImdmdC1jb2wtbnVtIj48c3BhbiBjbGFzcz0iZ2Z0LXNwaW4iPjwvc3Bhbj48L3RkPic7CiAgaWYodmFsPT09bnVsbCkgcmV0dXJuICc8dGQgY2xhc3M9ImdmdC1jb2wtbnVtIGdmdC1uYSI+LTwvdGQ+JzsKICByZXR1cm4gJzx0ZCBjbGFzcz0iZ2Z0LWNvbC1udW0iPicrcGN0KHZhbCkrJzwvdGQ+JzsKfQpmdW5jdGlvbiByb3dWYWx1ZXMoZil7CiAgdmFyIGQ9bWV0cmljc1tmLmNvZGVdOwogIHJldHVybiB0YWJsZUNvbHMoKS5tYXAoZnVuY3Rpb24oYyl7IHJldHVybiBjZWxsSHRtbChjLGQsZik7IH0pLmpvaW4oJycpOwp9CmZ1bmN0aW9uIGNvbXBvdW5kKG1kKXsKICB2YXIgZz0xOyBmb3IodmFyIGk9MDtpPG1kLmxlbmd0aDtpKyspeyB2YXIgcj1udW0obWRbaV0ucmV0dXJuKTsgaWYociE9PW51bGwpIGcqPSgxK3IvMTAwKTsgfQogIHJldHVybiAoZy0xKSoxMDA7Cn0KCmZ1bmN0aW9uIHJlbmRlclRhYmxlKCl7CiAgdmFyIGhvc3Q9ZWwoJ2dmdC10YWJsZS1ob3N0Jyk7IGlmKCFob3N0KSByZXR1cm47CiAgdmFyIGNvbHNwYW4gPSB0YWJsZUNvbHMoKS5sZW5ndGggKyAyOyAvLyBudW1lcmljIGNvbHMgKyBhY3Rpb24gKyBuYW1lCiAgdmFyIHJvd3MgPSBzZWwubWFwKGZ1bmN0aW9uKGYsaSl7CiAgICB2YXIgbG9nbz1mLmxvZ28/JzxpbWcgY2xhc3M9ImdmdC1yb3ctbG9nbyIgc3JjPSInK2VzYyhmLmxvZ28pKyciIGFsdD0iIj4nOic8c3BhbiBjbGFzcz0iZ2Z0LXJvdy1sb2dvIGdmdC1sb2dvLXBoIj48L3NwYW4+JzsKICAgIHZhciBvcGVuID0gZXhwYW5kZWRDb2RlPT09Zi5jb2RlOwogICAgdmFyIG1haW49Jzx0ciBjbGFzcz0iZ2Z0LXJvdycrKG9wZW4/JyBvcGVuJzonJykrJyIgZGF0YS1jb2RlPSInK2VzYyhmLmNvZGUpKyciPicrCiAgICAgICc8dGQgY2xhc3M9ImdmdC1jb2wtbmFtZSI+JysKICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iZ2Z0LWV4cCcrKG9wZW4/JyBvcGVuJzonJykrJyIgZGF0YS1leHA9IicrZXNjKGYuY29kZSkrJyIgdGl0bGU9Itek16jXmNeZINeU16fXldek15QiPjxpPjwvaT48L2J1dHRvbj4nKwogICAgICAgIGxvZ28rCiAgICAgICAgJzxkaXYgY2xhc3M9ImdmdC1yb3ctdHh0Ij48ZGl2IGNsYXNzPSJnZnQtcm93LW5hbWUiPjxzcGFuIGNsYXNzPSJnZnQtZG90IiBzdHlsZT0iYmFja2dyb3VuZDonK1NFUklFU19DT0xPUlNbaSVTRVJJRVNfQ09MT1JTLmxlbmd0aF0rJyI+PC9zcGFuPicrZXNjKGYubmFtZSkrJzwvZGl2PjxkaXYgY2xhc3M9ImdmdC1yb3ctc3ViIj4nK2VzYyhUTFtmLnR5cGVdfHwnJykrJyDCtyDXnteh17MgJytlc2MoZi5jb2RlKSsnPC9kaXY+JytyYW5rQmFkZ2UoZikrJzwvZGl2PicrCiAgICAgICc8L3RkPicrCiAgICAgIHJvd1ZhbHVlcyhmKSsKICAgICAgJzx0ZCBjbGFzcz0iZ2Z0LWNvbC1hY3QiPicrCiAgICAgICAgJzxidXR0b24gY2xhc3M9ImdmdC14IiBkYXRhLXJtPSInK2VzYyhmLmNvZGUpKyciIHRpdGxlPSLXlNeh16giPsOXPC9idXR0b24+JysKICAgICAgJzwvdGQ+JysKICAgICc8L3RyPic7CiAgICB2YXIgZXhwID0gb3BlbiA/ICc8dHIgY2xhc3M9ImdmdC1leHByb3ciPjx0ZCBjb2xzcGFuPSInK2NvbHNwYW4rJyI+JytyZW5kZXJFeHBhbmQoZikrJzwvdGQ+PC90cj4nIDogJyc7CiAgICByZXR1cm4gbWFpbitleHA7CiAgfSkuam9pbignJyk7CgogIGhvc3QuaW5uZXJIVE1MID0KICAgICc8dGFibGUgY2xhc3M9ImdmdC1jdGFibGUiPjx0aGVhZD48dHI+JysKICAgICAgJzx0aCBjbGFzcz0iZ2Z0LWNvbC1uYW1lIj7XqdedINen15XXpNeUPC90aD4nKyBjb2xIZWFkZXJzKCkgKwogICAgICAnPHRoIGNsYXNzPSJnZnQtY29sLWFjdCI+PC90aD4nKwogICAgJzwvdHI+PC90aGVhZD48dGJvZHk+Jytyb3dzKyc8L3Rib2R5PjwvdGFibGU+JysKICAgICh0YWI9PT0nYWN0JyA/ICc8ZGl2IGNsYXNzPSJnZnQtdGFibGUtbm90ZSI+15TXqtep15XXkNeV16og15HXqtem15XXkteUINeW15Ug15vXldec15zXldeqINeQ16og15TXoteV15PXoy/XkteZ16jXoteV158g15TXkNen15jXldeQ16jXmSDXqdecINen16jXoNeV16og15TXpNeg16HXmdeUICjXqtep15XXkNeUINeb15XXnNec16opLiDXotee15XXk9eqICLXkNeZ15bXldefINeQ16fXmNeV15DXqNeZIiDXntem15nXkteUINeQ16og16jXm9eZ15Eg15TXkNeZ15bXldefINecLTEyINeU15fXldeT16nXmdedINeU15DXl9eo15XXoNeZ150uPC9kaXY+JyA6ICcnKTsKCiAgZW5zdXJlVGVuWWVhcigpOwogIGVuc3VyZVBlbnNpYSgpOwogIGVuc3VyZVJhbmsoKTsKICB1cGRhdGVEYXRhUGVyaW9kKCk7Cn0KZnVuY3Rpb24gZW5zdXJlVGVuWWVhcigpewogIHNlbC5mb3JFYWNoKGZ1bmN0aW9uKGYpewogICAgaWYodGVuWWVhcltmLmNvZGVdKSByZXR1cm47CiAgICB0ZW5ZZWFyW2YuY29kZV09e2xvYWRpbmc6dHJ1ZX07CiAgICB2YXIgdG89TEFURVNUX1BFUklPRCwgZnJvbT1hZGRNb250aHModG8sLTExOSk7CiAgICBmZXRjaChBUEkrJy95aWVsZHMvcXVlcnk/ZnVuZF9pZD0nK2YuY29kZSsnJmZyb209Jytmcm9tKycmdG89Jyt0bykKICAgICAgLnRoZW4oZnVuY3Rpb24ocil7cmV0dXJuIHIuanNvbigpO30pCiAgICAgIC50aGVuKGZ1bmN0aW9uKGopewogICAgICAgIHZhciBtZD0oaiYmai5tb250aGx5X2RhdGEpfHxbXTsKICAgICAgICBpZihtZC5sZW5ndGg+PTExOCl7IHZhciBjPWNvbXBvdW5kKG1kKSwgeXJzPW1kLmxlbmd0aC8xMjsgdGVuWWVhcltmLmNvZGVdPXtjdW06YywgYW5uOihNYXRoLnBvdygxK2MvMTAwLDEveXJzKS0xKSoxMDB9OyB9CiAgICAgICAgZWxzZSB0ZW5ZZWFyW2YuY29kZV09e25hOnRydWV9OwogICAgICAgIHJlbmRlclRhYmxlKCk7CiAgICAgIH0pCiAgICAgIC5jYXRjaChmdW5jdGlvbigpeyB0ZW5ZZWFyW2YuY29kZV09e25hOnRydWV9OyByZW5kZXJUYWJsZSgpOyB9KTsKICB9KTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIEV4cGFuZCByb3cg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIGRvbnV0KHAsIGNvbG9yLCBsYWJlbCl7CiAgdmFyIEM9MipNYXRoLlBJKjQyLCBmcmFjPShwPT09bnVsbD8wOk1hdGgubWluKHAsMTAwKSkvMTAwOwogIHZhciByaW5nID0gcD09PW51bGwKICAgID8gJzxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQyIiBmaWxsPSJub25lIiBzdHJva2U9IiNlNmU4ZjAiIHN0cm9rZS13aWR0aD0iMTEiLz4nCiAgICA6ICc8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI0MiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZWNlZWY1IiBzdHJva2Utd2lkdGg9IjExIi8+JysKICAgICAgJzxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQyIiBmaWxsPSJub25lIiBzdHJva2U9IicrY29sb3IrJyIgc3Ryb2tlLXdpZHRoPSIxMSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSInKyhDKmZyYWMpLnRvRml4ZWQoMSkrJyAnK0MudG9GaXhlZCgxKSsnIiB0cmFuc2Zvcm09InJvdGF0ZSgtOTAgNTAgNTApIi8+JzsKICB2YXIgY2VudGVyID0gcD09PW51bGwgPyAnPHNwYW4gY2xhc3M9ImdmdC1kb251dC1uYSI+15DXmdefINeg16rXldefPC9zcGFuPicgOiAnPHNwYW4gY2xhc3M9ImdmdC1kb251dC12YWwiPicrcC50b0ZpeGVkKDEpKyclPC9zcGFuPic7CiAgcmV0dXJuICc8ZGl2IGNsYXNzPSJnZnQtZG9udXQiPjxzdmcgdmlld0JveD0iMCAwIDEwMCAxMDAiPicrcmluZysnPC9zdmc+PGRpdiBjbGFzcz0iZ2Z0LWRvbnV0LWMiPicrY2VudGVyKyc8L2Rpdj48ZGl2IGNsYXNzPSJnZnQtZG9udXQtbGJsIj4nK2xhYmVsKyc8L2Rpdj48L2Rpdj4nOwp9CmZ1bmN0aW9uIGJhcihwLGNvbG9yLGxhYmVsKXsKICB2YXIgdyA9IHA9PT1udWxsPzA6TWF0aC5taW4ocCwxMDApOwogIHJldHVybiAnPGRpdiBjbGFzcz0iZ2Z0LWJhci1yb3ciPjxkaXYgY2xhc3M9ImdmdC1iYXItbGJsIj4nK2xhYmVsKyc8L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImdmdC1iYXItdHJhY2siPjxkaXYgY2xhc3M9ImdmdC1iYXItZmlsbCIgc3R5bGU9IndpZHRoOicrdysnJTtiYWNrZ3JvdW5kOicrY29sb3IrJyI+PC9kaXY+PC9kaXY+JysKICAgICc8ZGl2IGNsYXNzPSJnZnQtYmFyLXZhbCI+JysocD09PW51bGw/JzxzcGFuIGNsYXNzPSJnZnQtbmEiPuKAlDwvc3Bhbj4nOnAudG9GaXhlZCgxKSsnJScpKyc8L2Rpdj48L2Rpdj4nOwp9CmZ1bmN0aW9uIGtwaShsYWJlbCx2YWx1ZSl7IHJldHVybiAnPGRpdiBjbGFzcz0iZ2Z0LWtwaSI+PGRpdiBjbGFzcz0iZ2Z0LWtwaS1sIj4nK2xhYmVsKyc8L2Rpdj48ZGl2IGNsYXNzPSJnZnQta3BpLXYiPicrdmFsdWUrJzwvZGl2PjwvZGl2Pic7IH0KCi8qIOKUgOKUgCBFeHRlbmRlZCByZXR1cm5zICgxMC8xNS8yMHkgY29tcHV0ZWQgZnJvbSB5aWVsZHMgaGlzdG9yeSBiYWNrIHRvIDIwMDYpIOKUgOKUgCAqLwpmdW5jdGlvbiBlbnN1cmVFeHRSZXQoZil7CiAgaWYoZXh0UmV0W2YuY29kZV0pIHJldHVybjsKICBleHRSZXRbZi5jb2RlXT17bG9hZGluZzp0cnVlfTsKICB2YXIgdG89YWRkTW9udGhzKExBVEVTVF9QRVJJT0QsLTEpLCBmcm9tPWFkZE1vbnRocyh0bywtMjM5KTsKICBmZXRjaChBUEkrJy95aWVsZHMvcXVlcnk/ZnVuZF9pZD0nK2YuY29kZSsnJmZyb209Jytmcm9tKycmdG89Jyt0bykKICAgIC50aGVuKGZ1bmN0aW9uKHIpe3JldHVybiByLmpzb24oKTt9KQogICAgLnRoZW4oZnVuY3Rpb24oail7CiAgICAgIHZhciBtZD0oaiYmai5tb250aGx5X2RhdGEpfHxbXTsKICAgICAgZnVuY3Rpb24gY3VtTihuKXsgaWYobWQubGVuZ3RoPG4tMikgcmV0dXJuIG51bGw7IHZhciBzbD1tZC5zbGljZSgtbiksIGc9MTsgc2wuZm9yRWFjaChmdW5jdGlvbihtKXsgdmFyIHI9bnVtKG0ucmV0dXJuKTsgaWYociE9PW51bGwpIGcqPSgxK3IvMTAwKTsgfSk7IHJldHVybiAoZy0xKSoxMDA7IH0KICAgICAgZXh0UmV0W2YuY29kZV09e2MxMjA6Y3VtTigxMjApLCBjMTgwOmN1bU4oMTgwKSwgYzI0MDpjdW1OKDI0MCl9OwogICAgICByZW5kZXJUYWJsZSgpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oKXsgZXh0UmV0W2YuY29kZV09e25hOnRydWV9OyByZW5kZXJUYWJsZSgpOyB9KTsKfQpmdW5jdGlvbiBhbm51YWxpemVDdW0oY3VtLCB5ZWFycyl7IHJldHVybiBjdW09PW51bGw/bnVsbDooTWF0aC5wb3coMStjdW0vMTAwLDEveWVhcnMpLTEpKjEwMDsgfQpmdW5jdGlvbiByZW5kZXJFeHRSZXQoZil7CiAgdmFyIGQ9bWV0cmljc1tmLmNvZGVdfHx7fSwgdD10ZW5ZZWFyW2YuY29kZV0sIGU9ZXh0UmV0W2YuY29kZV07CiAgZnVuY3Rpb24gdmFsKGN1bSwgeWVhcnMsIHNpbmdsZSl7CiAgICBpZihjdW09PT11bmRlZmluZWQpIHJldHVybiAnPHNwYW4gY2xhc3M9ImdmdC1zcGluIj48L3NwYW4+JzsKICAgIGlmKGN1bT09PW51bGwpIHJldHVybiAnPHNwYW4gY2xhc3M9ImdmdC1uYSI+LTwvc3Bhbj4nOwogICAgdmFyIHY9KHNpbmdsZXx8ZXh0TW9kZT09PSdjdW0nfHx5ZWFyczw9MSk/Y3VtOmFubnVhbGl6ZUN1bShjdW0seWVhcnMpOwogICAgcmV0dXJuIHBjdCh2KTsKICB9CiAgdmFyIHQxMD0oIXR8fHQubG9hZGluZyk/dW5kZWZpbmVkOih0Lm5hP251bGw6dC5jdW0pOwogIHZhciBlMTU9ZT8oZS5sb2FkaW5nP3VuZGVmaW5lZDooZS5uYT9udWxsOmUuYzE4MCkpOnVuZGVmaW5lZDsKICB2YXIgZTIwPWU/KGUubG9hZGluZz91bmRlZmluZWQ6KGUubmE/bnVsbDplLmMyNDApKTp1bmRlZmluZWQ7CiAgdmFyIHJvd3M9WwogICAgWyfXl9eV15PXqSDXkNeX16jXldefJywgbnVtKGQucmV0dXJuXzFtKSwgMSwgdHJ1ZV0sCiAgICBbJ9ee16rXl9eZ15zXqiDXlNep16DXlCcsIG51bShkLnJldHVybl95dGQpLCAxLCB0cnVlXSwKICAgIFsnMTIg15fXldeT16nXmdedJywgbnVtKGQucmV0dXJuXzF5KSwgMSwgZmFsc2VdLAogICAgWyczINep16DXmdedJywgY3VtRnJvbUFubnVhbChkLnJldHVybl8zeV9hbm51YWwsMyksIDMsIGZhbHNlXSwKICAgIFsnNSDXqdeg15nXnScsIGN1bUZyb21Bbm51YWwoZC5yZXR1cm5fNXlfYW5udWFsLDUpLCA1LCBmYWxzZV0sCiAgICBbJzEwINep16DXmdedJywgdDEwLCAxMCwgZmFsc2VdLAogICAgWycxNSDXqdeg15nXnScsIGUxNSwgMTUsIGZhbHNlXSwKICAgIFsnMjAg16nXoNeZ150nLCBlMjAsIDIwLCBmYWxzZV0KICBdOwogIHZhciB0b2dnbGU9JzxkaXYgY2xhc3M9ImdmdC1leHQtdG9nZ2xlIiBpZD0iZ2Z0LWV4dC10b2dnbGUiPjxidXR0b24gY2xhc3M9ImdmdC1leHQtYicrKGV4dE1vZGU9PT0nY3VtJz8nIG9uJzonJykrJyIgZGF0YS1tPSJjdW0iPtee16bXmNeR16g8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJnZnQtZXh0LWInKyhleHRNb2RlPT09J2F2Zyc/JyBvbic6JycpKyciIGRhdGEtbT0iYXZnIj7Xntee15XXpteiINep16DXqteZPC9idXR0b24+PC9kaXY+JzsKICB2YXIgZ3JpZD1yb3dzLm1hcChmdW5jdGlvbihyKXsgcmV0dXJuICc8ZGl2IGNsYXNzPSJnZnQtZXh0LWNhcmQiPjxkaXYgY2xhc3M9ImdmdC1leHQtbCI+JytyWzBdKyc8L2Rpdj48ZGl2IGNsYXNzPSJnZnQtZXh0LXYiPicrdmFsKHJbMV0sclsyXSxyWzNdKSsnPC9kaXY+PC9kaXY+JzsgfSkuam9pbignJyk7CiAgcmV0dXJuIHRvZ2dsZSsnPGRpdiBjbGFzcz0iZ2Z0LWV4dC1ncmlkIj4nK2dyaWQrJzwvZGl2PjxkaXYgY2xhc3M9ImdmdC1leHAtbm90ZSI+15fXldeT16kg15DXl9eo15XXnyDXldee16rXl9eZ15zXqiDXlNep16DXlCDigJQg16LXqNeaINeR16TXldei15wuINep15DXqCDXlNeq16fXldek15XXqiDigJQg15zXpNeZINeU15HXldeo16ggKNee16bXmNeR16gv157XnteV16bXoiDXqdeg16rXmSkuIDE1LzIwINep16DXlCDXnteX15XXqdeR15XXqiDXnteU15nXodeY15XXqNeZ15nXqiDXlNeq16nXldeQ15XXqiAo16LXkyAyMDA2KS48L2Rpdj4nOwp9CgovKiDilIDilIAgTmV0IGZ1bmQgZmxvd3MgKGRlcG9zaXRzIC8gd2l0aGRyYXdhbHMpIOKUgOKUgCAqLwpmdW5jdGlvbiBlbnN1cmVGbG93cyhmKXsKICBpZihmbG93c1tmLmNvZGVdKSByZXR1cm47CiAgZmxvd3NbZi5jb2RlXT17bG9hZGluZzp0cnVlfTsKICB2YXIgcmlkID0gZi50eXBlPT09J2d0X3BlbnNpeWEnID8gUEVOU0lBX05FVF9SSUQgOiBHRU1FTF9ORVRfUklEOwogIHZhciB1cmw9J2h0dHBzOi8vZGF0YS5nb3YuaWwvYXBpLzMvYWN0aW9uL2RhdGFzdG9yZV9zZWFyY2g/cmVzb3VyY2VfaWQ9JytyaWQrJyZxPScrZW5jb2RlVVJJQ29tcG9uZW50KGYuY29kZSkrJyZsaW1pdD04JnNvcnQ9JytlbmNvZGVVUklDb21wb25lbnQoJ1JFUE9SVF9QRVJJT0QgZGVzYycpOwogIGZldGNoKHVybCkudGhlbihmdW5jdGlvbihyKXtyZXR1cm4gci5qc29uKCk7fSkudGhlbihmdW5jdGlvbihqKXsKICAgIHZhciByZWNzPSgoKGoucmVzdWx0fHx7fSkucmVjb3Jkcyl8fFtdKS5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuIFN0cmluZyhyLkZVTkRfSUQpPT09U3RyaW5nKGYuY29kZSk7fSk7CiAgICBpZighcmVjcy5sZW5ndGgpeyBmbG93c1tmLmNvZGVdPXtuYTp0cnVlfTsgcmVuZGVyVGFibGUoKTsgcmV0dXJuOyB9CiAgICB2YXIgbD1yZWNzWzBdOwogICAgZmxvd3NbZi5jb2RlXT17ZGVwOm51bShsLkRFUE9TSVRTKSwgd2Q6bnVtKGwuV0lUSERSQVdMUyksIG5ldDpudW0obC5ORVRfTU9OVEhMWV9ERVBPU0lUUyksIHRyYW5zZmVyczpudW0obC5JTlRFUk5BTF9UUkFOU0ZFUlMpLCBpbmNlcHRpb246bC5JTkNFUFRJT05fREFURSwgcGVyaW9kOmwuUkVQT1JUX1BFUklPRH07CiAgICByZW5kZXJUYWJsZSgpOwogIH0pLmNhdGNoKGZ1bmN0aW9uKCl7IGZsb3dzW2YuY29kZV09e25hOnRydWV9OyByZW5kZXJUYWJsZSgpOyB9KTsKfQpmdW5jdGlvbiByZW5kZXJGbG93cyhmKXsKICB2YXIgZmw9Zmxvd3NbZi5jb2RlXTsKICBpZighZmx8fGZsLmxvYWRpbmcpIHJldHVybiAnPGRpdiBjbGFzcz0iZ2Z0LWV4cC1sb2FkaW5nIj48c3BhbiBjbGFzcz0iZ2Z0LXNwaW4iPjwvc3Bhbj4g15jXldei158g16DXqteV16DXmSDXkteZ15XXoeKApjwvZGl2Pic7CiAgaWYoZmwubmEpIHJldHVybiAnPGRpdiBjbGFzcz0iZ2Z0LWV4cC1ub3RlIj7XoNeq15XXoNeZINeS15nXldehL9ek15PXmdeV158g15DXmdeg150g15bXnteZ16DXmdedINec16fXldek15Qg15bXlS48L2Rpdj4nOwogIGZ1bmN0aW9uIG1vbmV5KHYpeyBpZih2PT1udWxsKSByZXR1cm4gJ+KAlCc7IHZhciBhPU1hdGgucm91bmQodikudG9Mb2NhbGVTdHJpbmcoJ2hlJyk7IHJldHVybiAodj49MD8nKyc6JycpK2ErJyDXntezIOKCqic7IH0KICBmdW5jdGlvbiBtb25leVBsYWluKHYpeyByZXR1cm4gdj09bnVsbD8n4oCUJzpNYXRoLnJvdW5kKHYpLnRvTG9jYWxlU3RyaW5nKCdoZScpKycg157XsyDigqonOyB9CiAgdmFyIG5ldENscz0oZmwubmV0fHwwKT49MD8ncG9zJzonbmVnJzsKICB2YXIgYWdlPScnOwogIGlmKGZsLmluY2VwdGlvbil7IHZhciB5cj1wYXJzZUludChTdHJpbmcoZmwuaW5jZXB0aW9uKS5zbGljZSgwLDQpLDEwKTsgaWYoeXIpeyBhZ2U9JzxkaXYgY2xhc3M9ImdmdC1rcGkiPjxkaXYgY2xhc3M9ImdmdC1rcGktbCI+15XXqtenINeU16fXldek15Q8L2Rpdj48ZGl2IGNsYXNzPSJnZnQta3BpLXYiPicrKDIwMjYteXIpKycg16nXoNeZ1508L2Rpdj48L2Rpdj4nOyB9IH0KICByZXR1cm4gJzxkaXYgY2xhc3M9ImdmdC1mbG93cy1oZXJvICcrbmV0Q2xzKyciPjxkaXYgY2xhc3M9ImdmdC1mbG93cy1uZXQiPicrbW9uZXkoZmwubmV0KSsnPC9kaXY+PGRpdiBjbGFzcz0iZ2Z0LWZsb3dzLWxibCI+15LXmdeV16Eg16DXmNeVIMK3ICcrZm10UGVyaW9kKGZsLnBlcmlvZCkrJzwvZGl2PjwvZGl2PicrCiAgICAnPGRpdiBjbGFzcz0iZ2Z0LWtwaXMiPicrCiAgICAgICc8ZGl2IGNsYXNzPSJnZnQta3BpIj48ZGl2IGNsYXNzPSJnZnQta3BpLWwiPteU16TXp9eT15XXqjwvZGl2PjxkaXYgY2xhc3M9ImdmdC1rcGktdiIgc3R5bGU9ImNvbG9yOiMxYThhNTYiPicrbW9uZXlQbGFpbihmbC5kZXApKyc8L2Rpdj48L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZ2Z0LWtwaSI+PGRpdiBjbGFzcz0iZ2Z0LWtwaS1sIj7Xntep15nXm9eV16o8L2Rpdj48ZGl2IGNsYXNzPSJnZnQta3BpLXYiIHN0eWxlPSJjb2xvcjojZDIzYjRlIj4nK21vbmV5UGxhaW4oZmwud2QpKyc8L2Rpdj48L2Rpdj4nKwogICAgICAoZmwudHJhbnNmZXJzIT1udWxsPyc8ZGl2IGNsYXNzPSJnZnQta3BpIj48ZGl2IGNsYXNzPSJnZnQta3BpLWwiPteg15nXldeTINeg15jXlSAo157XoteR16gg16fXldek15XXqik8L2Rpdj48ZGl2IGNsYXNzPSJnZnQta3BpLXYiIHN0eWxlPSJjb2xvcjonKygoZmwudHJhbnNmZXJzfHwwKT49MD8nIzFhOGE1Nic6JyNkMjNiNGUnKSsnIj4nK21vbmV5KGZsLnRyYW5zZmVycykrJzwvZGl2PjwvZGl2Pic6JycpKwogICAgICBhZ2UrCiAgICAnPC9kaXY+JysKICAgICc8ZGl2IGNsYXNzPSJnZnQtZXhwLW5vdGUiPteS15nXldehINeg15jXlSDXl9eZ15XXkdeZID0g15nXldeq16gg15vXodejINeg15vXoNehINee15nXldem15AgKNeQ15nXoNeT15nXp9em15nXlCDXnNeQ157XldefINeU15fXldeh15vXmdedINeV157Xldee16DXmNeV150pLiDXoNeq15XXoNeZ150g15fXldeT16nXmdeZ150g154tZGF0YS5nb3YuaWwuPC9kaXY+JzsKfQoKLyog4pSA4pSAIFRvcCBmdW5kcyBpbiB0aGUgc2FtZSBjYXRlZ29yeSDilIDilIAgKi8KZnVuY3Rpb24gZnVuZFNwZWMoZil7CiAgdmFyIG5tPShmLm5hbWV8fCcnKS5yZXBsYWNlKC9bIifXtNezXS9nLCcnKTsKICB2YXIga2V5cz1bWydTJlAgNTAwJywnUyZQIDUwMCddLFsn16LXlden15Eg157Xk9eTJywn16LXlden15Eg157XkyddLFsn157Xl9en15Qg157Xk9eTJywn157Xl9en15QnXSxbJ9ee16DXmdeV16onLCfXnteg15nXldeqJ10sWyfXkNeSIteXJywn15DXkteXJ10sWyfXlNec15vXlCcsJ9eU15zXm9eUJ10sWyfXntee16nXnNeq15knLCfXntee16nXnNeq15knXSxbJ9eb15zXnNeZJywn15vXnNec15knXV07CiAgZm9yKHZhciBpPTA7aTxrZXlzLmxlbmd0aDtpKyspeyB2YXIga3c9a2V5c1tpXVsxXS5yZXBsYWNlKC9bIifXtNezXS9nLCcnKTsgaWYobm0uaW5kZXhPZihrdyk+LTEpIHJldHVybiB7bGFiZWw6a2V5c1tpXVswXSwga3c6a3d9OyB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gZW5zdXJlVG9wQ2F0KGYpewogIGlmKHRvcENhdFtmLmNvZGVdKSByZXR1cm47CiAgdG9wQ2F0W2YuY29kZV09e2xvYWRpbmc6dHJ1ZX07CiAgdmFyIHNwZWM9ZnVuZFNwZWMoZik7CiAgLy8gYnVpbGQgdGhlIGNhdGVnb3J5IHBlZXIgbGlzdCBmcm9tIHRoZSBmdWxsIGZ1bmQgdW5pdmVyc2UgKHNhbWUgcHJvZHVjdCB0eXBlICsgc2FtZSBzcGVjaWFsaXphdGlvbikKICB2YXIgcGVlcnM9RlVORFMuZmlsdGVyKGZ1bmN0aW9uKHgpewogICAgaWYoeC50eXBlIT09Zi50eXBlKSByZXR1cm4gZmFsc2U7CiAgICBpZihzcGVjKXsgdmFyIG5tPSh4Lm5hbWV8fCcnKS5yZXBsYWNlKC9bIifXtNezXS9nLCcnKTsgaWYobm0uaW5kZXhPZihzcGVjLmt3KTwwKSByZXR1cm4gZmFsc2U7IH0KICAgIHJldHVybiB0cnVlOwogIH0pOwogIHZhciBjb2Rlcz1wZWVycy5zbGljZSgwLDU1KS5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHguY29kZTt9KTsKICBpZihjb2Rlcy5pbmRleE9mKGYuY29kZSk8MCkgY29kZXMucHVzaChmLmNvZGUpOwogIGZldGNoKEFQSSsnL2FydGljbGUtZGF0YS9jb21wYXJlP2Z1bmRzPScrY29kZXMuam9pbignLCcpKS50aGVuKGZ1bmN0aW9uKHIpe3JldHVybiByLmpzb24oKTt9KS50aGVuKGZ1bmN0aW9uKGopewogICAgdmFyIGRhdGE9KChqJiZqLmRhdGEpfHxbXSkuZmlsdGVyKGZ1bmN0aW9uKHgpeyByZXR1cm4gbnVtKHgucmV0dXJuXzF5KSE9bnVsbDsgfSk7CiAgICBkYXRhLnNvcnQoZnVuY3Rpb24oYSxiKXsgcmV0dXJuIG51bShiLnJldHVybl8xeSktbnVtKGEucmV0dXJuXzF5KTsgfSk7CiAgICB2YXIgbXlSYW5rPW51bGw7IGZvcih2YXIgaT0wO2k8ZGF0YS5sZW5ndGg7aSsrKXsgaWYoU3RyaW5nKGRhdGFbaV0uZnVuZF9pZCk9PT1TdHJpbmcoZi5jb2RlKSl7IG15UmFuaz17cmFuazppKzEsdG90YWw6ZGF0YS5sZW5ndGh9OyBicmVhazsgfSB9CiAgICB0b3BDYXRbZi5jb2RlXT17ZnVuZHM6ZGF0YS5zbGljZSgwLDgpLCBzcGVjOnNwZWM/c3BlYy5sYWJlbDpudWxsLCBteVJhbms6bXlSYW5rfTsKICAgIHJlbmRlclRhYmxlKCk7CiAgfSkuY2F0Y2goZnVuY3Rpb24oKXsgdG9wQ2F0W2YuY29kZV09e25hOnRydWV9OyByZW5kZXJUYWJsZSgpOyB9KTsKfQpmdW5jdGlvbiByZW5kZXJUb3BDYXQoZil7CiAgdmFyIHRjPXRvcENhdFtmLmNvZGVdOwogIGlmKCF0Y3x8dGMubG9hZGluZykgcmV0dXJuICc8ZGl2IGNsYXNzPSJnZnQtZXhwLWxvYWRpbmciPjxzcGFuIGNsYXNzPSJnZnQtc3BpbiI+PC9zcGFuPiDXmNeV16LXnyDXk9eZ16jXldeSINen15jXkteV16jXmdeU4oCmPC9kaXY+JzsKICBpZih0Yy5uYXx8IXRjLmZ1bmRzfHwhdGMuZnVuZHMubGVuZ3RoKSByZXR1cm4gJzxkaXYgY2xhc3M9ImdmdC1leHAtbm90ZSI+15DXmdefINeg16rXldeg15kg15PXmdeo15XXkiDXnNen15jXkteV16jXmdeUINeW15UuPC9kaXY+JzsKICB2YXIgaW5Ub3A9dGMuZnVuZHMuc29tZShmdW5jdGlvbih4KXtyZXR1cm4gU3RyaW5nKHguZnVuZF9pZCk9PT1TdHJpbmcoZi5jb2RlKTt9KTsKICB2YXIgcm93cz10Yy5mdW5kcy5tYXAoZnVuY3Rpb24oeCxpKXsKICAgIHZhciBpc1RoaXM9U3RyaW5nKHguZnVuZF9pZCk9PT1TdHJpbmcoZi5jb2RlKTsKICAgIHZhciBwaWNrZWQ9c2VsLnNvbWUoZnVuY3Rpb24ocyl7cmV0dXJuIHMuY29kZT09PVN0cmluZyh4LmZ1bmRfaWQpO30pOwogICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJnZnQtdGMtcm93JysoaXNUaGlzPycgbWUnOicnKSsnIj4nKwogICAgICAnPHNwYW4gY2xhc3M9ImdmdC10Yy1yYW5rIj4nKyhpKzEpKyc8L3NwYW4+JysKICAgICAgJzxzcGFuIGNsYXNzPSJnZnQtdGMtbmFtZSI+Jytlc2MoeC5mdW5kX25hbWUpKyhpc1RoaXM/JyA8Yj4o15bXlSDXlNen15XXpNeUKTwvYj4nOicnKSsnPC9zcGFuPicrCiAgICAgICc8c3BhbiBjbGFzcz0iZ2Z0LXRjLXJldCI+JytwY3QobnVtKHgucmV0dXJuXzF5KSkrJzwvc3Bhbj4nKwogICAgICAoaXNUaGlzPyc8c3BhbiBjbGFzcz0iZ2Z0LXRjLXNsb3QiPjwvc3Bhbj4nOnBpY2tlZD8nPHNwYW4gY2xhc3M9ImdmdC10Yy1zbG90IiBzdHlsZT0iY29sb3I6dmFyKC0tZ24pIj7inJM8L3NwYW4+JzonPGJ1dHRvbiBjbGFzcz0iZ2Z0LXRjLWFkZCIgZGF0YS1jb2RlPSInK2VzYyhTdHJpbmcoeC5mdW5kX2lkKSkrJyIgdGl0bGU9IteU15XXodejINec15TXqdeV15XXkNeUIj4rPC9idXR0b24+JykrCiAgICAnPC9kaXY+JzsKICB9KS5qb2luKCcnKTsKICB2YXIgbWluZSA9ICghaW5Ub3AgJiYgdGMubXlSYW5rKSA/ICc8ZGl2IGNsYXNzPSJnZnQtdGMtbWluZSI+15TXp9eV16TXlCDXqdec15og157Xk9eV16jXkteqIDxiPiMnK3RjLm15UmFuay5yYW5rKyc8L2I+INee16rXldeaICcrdGMubXlSYW5rLnRvdGFsKycg15HXp9eY15LXldeo15nXlDwvZGl2PicgOiAnJzsKICByZXR1cm4gJzxkaXYgY2xhc3M9ImdmdC10Yy10aXRsZSI+16fXldek15XXqiDXnteV15HXmdec15XXqicrKHRjLnNwZWM/JyDCtyAnK2VzYyh0Yy5zcGVjKTonJykrJyA8c3Bhbj4o15zXpNeZINeq16nXldeQ16og16nXoNeUKTwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJnZnQtdGMtbGlzdCI+Jytyb3dzKyc8L2Rpdj4nK21pbmU7Cn0KCmZ1bmN0aW9uIHJlbmRlckV4cGFuZChmKXsKICB2YXIgZD1tZXRyaWNzW2YuY29kZV18fHt9OwogIHZhciBleD1mdW5kRXhwb3N1cmUoZik7CiAgdmFyIGVNYW49ZXguc3RvY2ssIGVGb3I9ZXguZm9yZWlnbiwgZUZ4PWV4LmZvcmV4LCBlSWxsPWV4LmlsbGlxdWlkOwogIHZhciB0YWJzPSc8ZGl2IGNsYXNzPSJnZnQtZXRhYnMiPicrCiAgICBbWydleHBvc3VyZScsJ9eX16nXmdek15QnXSxbJ2Fzc2V0cycsJ9eU16jXm9eRINeg15vXodeZ150nXSxbJ3BvbGljeScsJ9ee15PXmdeg15nXldeqINeU16nXp9ei15QnXSxbJ21vcmUnLCfXnteZ15PXoiDXoNeV16HXoyddLFsnZXh0cmV0Jywn16rXqdeV15DXldeqINee15XXqNeX15EnXSxbJ2Zsb3dzJywn15LXmdeV16Ev16TXk9eZ15XXnyddLFsndG9wY2F0Jywn16fXldek15XXqiDXnteV15HXmdec15XXqiddXQogICAgLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gJzxidXR0b24gY2xhc3M9ImdmdC1ldGFiJysoZXhwYW5kVGFiPT09dFswXT8nIG9uJzonJykrJyIgZGF0YS1ldGFiPSInK3RbMF0rJyIgZGF0YS1lYz0iJytlc2MoZi5jb2RlKSsnIj4nK3RbMV0rJzwvYnV0dG9uPic7fSkuam9pbignJykrJzwvZGl2Pic7CgogIHZhciBib2R5PScnOwogIGlmKGV4cGFuZFRhYj09PSdleHBvc3VyZScpewogICAgYm9keT0gZXgubG9hZGluZwogICAgICA/ICc8ZGl2IGNsYXNzPSJnZnQtZXhwLWxvYWRpbmciPjxzcGFuIGNsYXNzPSJnZnQtc3BpbiI+PC9zcGFuPiDXmNeV16LXnyDXoNeq15XXoNeZINeX16nXmdek15TigKY8L2Rpdj4nCiAgICAgIDogJzxkaXYgY2xhc3M9ImdmdC1kb251dHMiPicrCiAgICAgICAgICBkb251dChlTWFuLCcjM2Y1MWI1Jywn15fXqdeZ16TXlCDXnNee16DXmdeV16onKSsKICAgICAgICAgIGRvbnV0KGVGb3IsJyNlMDIxOGEnLCfXl9ep15nXpNeUINec15fXlde015wnKSsKICAgICAgICAgIGRvbnV0KGVGeCwnIzFlYTdlMScsJ9eX16nXmdek15Qg15zXnteY17TXlycpKwogICAgICAgICAgZG9udXQoZUlsbCwnI2YwYTAyMCcsJ9eg15vXodeZ150g15zXkCDXodeX15nXqNeZ150nKSsKICAgICAgICAnPC9kaXY+PGRpdiBjbGFzcz0iZ2Z0LWV4cC1ub3RlIj7Xl9ep15nXpNeUINeb15DXl9eV15Yg157XodeaINeU16DXm9eh15nXnSwg16LXnCDXkdeh15nXoSDXk9eZ15XXldeX15kg15TXl9eR16jXldeqINeU157XoNeU15zXldeqIChkYXRhLmdvdi5pbCksINeg15vXldefINec16rXp9eV16TXlCDXlNeQ15fXqNeV16DXlC48L2Rpdj4nOwogIH0gZWxzZSBpZihleHBhbmRUYWI9PT0nYXNzZXRzJyl7CiAgICBib2R5PSBleC5sb2FkaW5nCiAgICAgID8gJzxkaXYgY2xhc3M9ImdmdC1leHAtbG9hZGluZyI+PHNwYW4gY2xhc3M9ImdmdC1zcGluIj48L3NwYW4+INeY15XXotef4oCmPC9kaXY+JwogICAgICA6ICc8ZGl2IGNsYXNzPSJnZnQtYmFycyI+JysKICAgICAgICAgIGJhcihlTWFuLCcjM2Y1MWI1Jywn15fXqdeZ16TXlCDXnNee16DXmdeV16onKSsKICAgICAgICAgIGJhcihlRm9yLCcjZTAyMThhJywn15fXqdeZ16TXlCDXnNeX15XXtNecJykrCiAgICAgICAgICBiYXIoZUZ4LCcjMWVhN2UxJywn15fXqdeZ16TXlCDXnNee15jXtNeXJykrCiAgICAgICAgICBiYXIoZUlsbCwnI2YwYTAyMCcsJ9eg15vXodeZ150g15zXkCDXodeX15nXqNeZ150nKSsKICAgICAgICAnPC9kaXY+PGRpdiBjbGFzcz0iZ2Z0LWV4cC1ub3RlIj7Xl9ep15nXpNeUINeb15DXl9eV15Yg157XodeaINeU16DXm9eh15nXnSDXlNee16DXldeU15zXmdedINeR16fXldek15QuPC9kaXY+JzsKICB9IGVsc2UgaWYoZXhwYW5kVGFiPT09J3BvbGljeScpewogICAgYm9keT0nPGRpdiBjbGFzcz0iZ2Z0LXBvbGljeSI+JysKICAgICAgJzxwPjxzdHJvbmc+16HXmdeV15XXkjo8L3N0cm9uZz4gJytlc2MoZC5jYXRlZ29yeXx8VExbZi50eXBlXXx8J+KAlCcpKyc8L3A+JysKICAgICAgJzxwPjxzdHJvbmc+16HXldeSINee15XXpteoOjwvc3Ryb25nPiAnK2VzYyhUTFtmLnR5cGVdfHwn4oCUJykrJzwvcD4nKwogICAgICAnPHAgY2xhc3M9ImdmdC1wb2xpY3ktZGlzYyI+157Xk9eZ16DXmdeV16og15TXlNep16fXoteUINeU157XnNeQ15Qg15XXlNee16HXnNeV15zXmdedINee16TXldeo15jXmdedINeR15PXoyDXlNen15XXpNeUINeU16jXqdee15kuINeU16DXqteV16DXmdedINeQ15nXoNedINee15TXldeV15nXnSDXmdeZ16LXldelINeU16nXp9ei15XXqi48L3A+JysKICAgICAgJzxhIGNsYXNzPSJnZnQtcG9saWN5LWxpbmsiIGhyZWY9IicrZXNjKGYudXJsKSsnIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+15zXnteT15nXoNeZ15XXqiDXlNee15zXkNeUINeR15PXoyDXlNen15XXpNeUIOKAujwvYT4nKwogICAgJzwvZGl2Pic7CiAgfSBlbHNlIGlmKGV4cGFuZFRhYj09PSdleHRyZXQnKXsKICAgIGVuc3VyZUV4dFJldChmKTsgYm9keT1yZW5kZXJFeHRSZXQoZik7CiAgfSBlbHNlIGlmKGV4cGFuZFRhYj09PSdmbG93cycpewogICAgZW5zdXJlRmxvd3MoZik7IGJvZHk9cmVuZGVyRmxvd3MoZik7CiAgfSBlbHNlIGlmKGV4cGFuZFRhYj09PSd0b3BjYXQnKXsKICAgIGVuc3VyZVRvcENhdChmKTsgYm9keT1yZW5kZXJUb3BDYXQoZik7CiAgfSBlbHNlIHsKICAgIGJvZHk9JzxkaXYgY2xhc3M9ImdmdC1rcGlzIj4nKwogICAgICBrcGkoJ9ee15PXkyDXqdeQ16jXpCcsIGQuc2hhcnBlIT1udWxsP251bShkLnNoYXJwZSkudG9GaXhlZCgyKTon4oCUJykrCiAgICAgIGtwaSgn16HXmNeZ15nXqiDXqten158nLCBkLnN0ZF9kZXYhPW51bGw/bnVtKGQuc3RkX2RldikudG9GaXhlZCgyKSsnJSc6J+KAlCcpKwogICAgICBrcGkoJ9eQ15zXpNeQJywgZC5hbHBoYSE9bnVsbD9udW0oZC5hbHBoYSkudG9GaXhlZCgyKTon4oCUJykrCiAgICAgIGtwaSgn15PXnteZINeg15nXlNeV15wg157XpteR15nXqNeUJywgZC5tZ210X2ZlZSE9bnVsbD9udW0oZC5tZ210X2ZlZSkudG9GaXhlZCgyKSsnJSc6J+KAlCcpKwogICAgICBrcGkoJ9eg15vXodeZ150g157XoNeV15TXnNeZ150nLCBkLmFzc2V0cyE9bnVsbD8obnVtKGQuYXNzZXRzKT49MTAwMD8obnVtKGQuYXNzZXRzKS8xMDAwKS50b0ZpeGVkKDEpKycg157Xmdec15nXkNeo15Mg4oKqJzpudW0oZC5hc3NldHMpLnRvRml4ZWQoMCkrJyDXnteZ15zXmdeV158g4oKqJyk6J+KAlCcpKwogICAgICBrcGkoJ9ee16HXpNeoINen15XXpNeUJywgZXNjKGYuY29kZSkpKwogICAgJzwvZGl2PjxhIGNsYXNzPSJnZnQtcG9saWN5LWxpbmsiIGhyZWY9IicrZXNjKGYudXJsKSsnIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+15zXk9ejINeU16fXldek15Qg15TXntec15Ag4oC6PC9hPic7CiAgfQogIHJldHVybiAnPGRpdiBjbGFzcz0iZ2Z0LWV4cGFuZCI+Jyt0YWJzKyc8ZGl2IGNsYXNzPSJnZnQtZWJvZHkiPicrYm9keSsnPC9kaXY+PC9kaXY+JzsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIEdyYXBoIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwpmdW5jdGlvbiBlbnN1cmVJbmRpY2VzKGNiKXsKICB2YXIgbmVlZD1bXTsKICBPYmplY3Qua2V5cyhpbmRpY2VzKS5mb3JFYWNoKGZ1bmN0aW9uKHMpeyBpZihpbmRpY2VzW3NdKXsgaW5kZXhDYWNoZVtzXT1pbmRleENhY2hlW3NdfHx7fTsgaWYoIWluZGV4Q2FjaGVbc11bZ3JhcGhSYW5nZV0pIG5lZWQucHVzaChzKTsgfSB9KTsKICBpZighbmVlZC5sZW5ndGgpeyBpZihjYikgY2IoKTsgcmV0dXJuOyB9CiAgdmFyIHBlbmRpbmc9bmVlZC5sZW5ndGgsIHJzPVJBTkdFX1NUUltncmFwaFJhbmdlXXx8JzEweSc7CiAgbmVlZC5mb3JFYWNoKGZ1bmN0aW9uKHN5bSl7CiAgICBmZXRjaChBUEkrJy9pbmRleD9zeW09JytzeW0rJyZyYW5nZT0nK3JzKS50aGVuKGZ1bmN0aW9uKHIpe3JldHVybiByLmpzb24oKTt9KS50aGVuKGZ1bmN0aW9uKGopewogICAgICBpbmRleENhY2hlW3N5bV1bZ3JhcGhSYW5nZV09KGomJmoucG9pbnRzKXx8W107IGlmKC0tcGVuZGluZz09PTAmJmNiKSBjYigpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oKXsgaW5kZXhDYWNoZVtzeW1dW2dyYXBoUmFuZ2VdPVtdOyBpZigtLXBlbmRpbmc9PT0wJiZjYikgY2IoKTsgfSk7CiAgfSk7Cn0KZnVuY3Rpb24gZHJhd0dyYXBoKCl7CiAgdmFyIGN2PWVsKCdnZnQtY2hhcnQnKTsgaWYoIWN2fHwhd2luZG93LkNoYXJ0KSByZXR1cm47CiAgdmFyIGxnPWVsKCdnZnQtbGVnZW5kJyk7CiAgaWYoIXNlbC5sZW5ndGgpeyBpZihjaGFydCl7Y2hhcnQuZGVzdHJveSgpO2NoYXJ0PW51bGw7fSBpZihsZykgbGcuaW5uZXJIVE1MPScnOyByZXR1cm47IH0KICB2YXIgcmVzdWx0cz1uZXcgQXJyYXkoc2VsLmxlbmd0aCksIHBlbmRpbmc9c2VsLmxlbmd0aCwgdG9rZW49KytncmFwaFRva2VuOwogIHNlbC5mb3JFYWNoKGZ1bmN0aW9uKGYsaSl7CiAgICBsb2FkU2VyaWVzKGYuY29kZSwgZ3JhcGhSYW5nZSwgZnVuY3Rpb24obWQpewogICAgICByZXN1bHRzW2ldPXtmOmYsaTppLG1kOm1kfHxbXX07CiAgICAgIGlmKC0tcGVuZGluZz09PTAgJiYgdG9rZW49PT1ncmFwaFRva2VuKSBidWlsZEFsaWduZWQocmVzdWx0cyk7CiAgICB9KTsKICB9KTsKfQpmdW5jdGlvbiBidWlsZEFsaWduZWQocmVzdWx0cyl7CiAgLy8gQWxpZ24gZXZlcnkgZnVuZCB0byBhIHNoYXJlZCBwZXJpb2QgYXhpcyBzbyBkaWZmZXJlbnQgaGlzdG9yaWVzIGxpbmUgdXAgYnkgREFURSwgbm90IGluZGV4LgogIHZhciBmaXJzdHM9cmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuIHIubWQubGVuZ3RoO30pLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gci5tZFswXS5wZXJpb2Q7fSk7CiAgaWYoIWZpcnN0cy5sZW5ndGgpeyBpZihjaGFydCl7Y2hhcnQuZGVzdHJveSgpO2NoYXJ0PW51bGw7fSByZXR1cm47IH0KICB2YXIgY29tbW9uU3RhcnQ9TWF0aC5tYXguYXBwbHkobnVsbCwgZmlyc3RzKTsgICAvLyBzdGFydCBhbGwgbGluZXMgdG9nZXRoZXIgYXQgdGhlIGxhdGVzdCBjb21tb24gaW5jZXB0aW9uCiAgdmFyIHBtYXA9e307CiAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uKHIpeyByLm1kLmZvckVhY2goZnVuY3Rpb24obSl7IGlmKG0ucGVyaW9kPj1jb21tb25TdGFydCkgcG1hcFttLnBlcmlvZF09bS5zaG9ydF9sYWJlbDsgfSk7IH0pOwogIHZhciBwZXJpb2RzPU9iamVjdC5rZXlzKHBtYXApLm1hcChOdW1iZXIpLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1iO30pOwogIHZhciBsYWJlbHM9cGVyaW9kcy5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHBtYXBbcF07fSk7CgogIC8vIOKUgOKUgCBCQVIgbW9kZTogbW9udGhseSByZXR1cm5zICh2cyBpbmR1c3RyeSBhdmVyYWdlIGZvciBhIHNpbmdsZSBmdW5kKSDilIDilIAKICBpZihjaGFydFR5cGU9PT0nYmFycycpewogICAgdmFyIGJkcz1yZXN1bHRzLm1hcChmdW5jdGlvbihyKXsKICAgICAgdmFyIHJtYXA9e307IHIubWQuZm9yRWFjaChmdW5jdGlvbihtKXsgcm1hcFttLnBlcmlvZF09bS5yZXR1cm47IH0pOwogICAgICB2YXIgZGF0YT1wZXJpb2RzLm1hcChmdW5jdGlvbihwKXsgdmFyIHJyPW51bShybWFwW3BdKTsgcmV0dXJuIHJyPT09bnVsbD9udWxsOityci50b0ZpeGVkKDIpOyB9KTsKICAgICAgcmV0dXJuIHtsYWJlbDpyLmYubmFtZS5sZW5ndGg+MjI/ci5mLm5hbWUuc2xpY2UoMCwyMSkrJ+KApic6ci5mLm5hbWUsIGRhdGE6ZGF0YSwKICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6U0VSSUVTX0NPTE9SU1tyLmklU0VSSUVTX0NPTE9SUy5sZW5ndGhdLCBib3JkZXJSYWRpdXM6MiwgX29yZGVyOnIuaX07CiAgICB9KTsKICAgIGlmKHJlc3VsdHMubGVuZ3RoPT09MSl7CiAgICAgIHZhciBpbWFwPXt9OyByZXN1bHRzWzBdLm1kLmZvckVhY2goZnVuY3Rpb24obSl7IGltYXBbbS5wZXJpb2RdPW0uaW5kdXN0cnlfYXZnOyB9KTsKICAgICAgdmFyIGlkYXRhPXBlcmlvZHMubWFwKGZ1bmN0aW9uKHApeyB2YXIgdj1udW0oaW1hcFtwXSk7IHJldHVybiB2PT09bnVsbD9udWxsOit2LnRvRml4ZWQoMik7IH0pOwogICAgICBiZHMucHVzaCh7bGFiZWw6J9ee157Xldem16Ig16LXoNek15knLCBkYXRhOmlkYXRhLCBiYWNrZ3JvdW5kQ29sb3I6JyNjM2M5ZDknLCBib3JkZXJSYWRpdXM6MiwgX29yZGVyOjk5fSk7CiAgICB9CiAgICBwYWludENoYXJ0KGxhYmVscywgYmRzLCAnYmFyJyk7CiAgICByZXR1cm47CiAgfQoKICB2YXIgZGF0YXNldHM9cmVzdWx0cy5tYXAoZnVuY3Rpb24ocil7CiAgICB2YXIgcm1hcD17fTsgci5tZC5mb3JFYWNoKGZ1bmN0aW9uKG0peyBybWFwW20ucGVyaW9kXT1tLnJldHVybjsgfSk7CiAgICB2YXIgZz0xOwogICAgdmFyIGRhdGE9cGVyaW9kcy5tYXAoZnVuY3Rpb24ocCl7CiAgICAgIHZhciBycj1udW0ocm1hcFtwXSk7IGlmKHJyPT09bnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIGcqPSgxK3JyLzEwMCk7IHJldHVybiArKChnLTEpKjEwMCkudG9GaXhlZCgyKTsKICAgIH0pOwogICAgcmV0dXJuIHsKICAgICAgbGFiZWw6ci5mLm5hbWUubGVuZ3RoPjIyP3IuZi5uYW1lLnNsaWNlKDAsMjEpKyfigKYnOnIuZi5uYW1lLAogICAgICBkYXRhOmRhdGEsCiAgICAgIGJvcmRlckNvbG9yOlNFUklFU19DT0xPUlNbci5pJVNFUklFU19DT0xPUlMubGVuZ3RoXSwKICAgICAgYmFja2dyb3VuZENvbG9yOid0cmFuc3BhcmVudCcsCiAgICAgIGJvcmRlcldpZHRoOjMsIHRlbnNpb246LjM1LCBwb2ludFJhZGl1czowLCBwb2ludEhvdmVyUmFkaXVzOjQsIHNwYW5HYXBzOnRydWUsIF9vcmRlcjpyLmkKICAgIH07CiAgfSk7CiAgLy8g4pSA4pSAIG1hcmtldC1pbmRleCBvdmVybGF5cyAoZGFzaGVkKSDigJQgbm9ybWFsaXplZCB0byAlIGdyb3d0aCBmcm9tIGNvbW1vblN0YXJ0IOKUgOKUgAogIE9iamVjdC5rZXlzKGluZGljZXMpLmZvckVhY2goZnVuY3Rpb24oc3ltKXsKICAgIGlmKCFpbmRpY2VzW3N5bV0pIHJldHVybjsKICAgIHZhciBwdHM9KGluZGV4Q2FjaGVbc3ltXXx8e30pW2dyYXBoUmFuZ2VdOyBpZighcHRzfHwhcHRzLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIGNtYXA9e307IHB0cy5mb3JFYWNoKGZ1bmN0aW9uKHApeyBjbWFwW3AucGVyaW9kXT1wLmNsb3NlOyB9KTsKICAgIHZhciBiYXNlPWNtYXBbY29tbW9uU3RhcnRdOwogICAgaWYoYmFzZT09bnVsbCl7IGZvcih2YXIgaT0wO2k8cGVyaW9kcy5sZW5ndGg7aSsrKXsgaWYoY21hcFtwZXJpb2RzW2ldXSE9bnVsbCl7IGJhc2U9Y21hcFtwZXJpb2RzW2ldXTsgYnJlYWs7IH0gfSB9CiAgICBpZihiYXNlPT1udWxsfHxiYXNlPT09MCkgcmV0dXJuOwogICAgdmFyIGlkYXRhPXBlcmlvZHMubWFwKGZ1bmN0aW9uKHApeyB2YXIgYz1jbWFwW3BdOyByZXR1cm4gYz09bnVsbD9udWxsOisoKChjL2Jhc2UpLTEpKjEwMCkudG9GaXhlZCgyKTsgfSk7CiAgICBkYXRhc2V0cy5wdXNoKHsgbGFiZWw6SURYX01FVEFbc3ltXS5sLCBkYXRhOmlkYXRhLCBib3JkZXJDb2xvcjpJRFhfTUVUQVtzeW1dLmMsIGJhY2tncm91bmRDb2xvcjondHJhbnNwYXJlbnQnLAogICAgICBib3JkZXJXaWR0aDoyLCBib3JkZXJEYXNoOls3LDRdLCB0ZW5zaW9uOi4yLCBwb2ludFJhZGl1czowLCBwb2ludEhvdmVyUmFkaXVzOjMsIHNwYW5HYXBzOnRydWUsIF9vcmRlcjoxMDAgfSk7CiAgfSk7CiAgcGFpbnRDaGFydChsYWJlbHMsIGRhdGFzZXRzKTsKfQpmdW5jdGlvbiBwYWludENoYXJ0KGxhYmVscywgZGF0YXNldHMsIHR5cGUpewogIHR5cGU9dHlwZXx8J2xpbmUnOwogIHZhciBjdj1lbCgnZ2Z0LWNoYXJ0Jyk7CiAgZGF0YXNldHMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLl9vcmRlci1iLl9vcmRlcjt9KTsKICBpZihjaGFydCkgY2hhcnQuZGVzdHJveSgpOwogIGNoYXJ0PW5ldyBDaGFydChjdi5nZXRDb250ZXh0KCcyZCcpLHsKICAgIHR5cGU6dHlwZSwKICAgIGRhdGE6e2xhYmVsczpsYWJlbHMsZGF0YXNldHM6ZGF0YXNldHN9LAogICAgb3B0aW9uczp7CiAgICAgIHJlc3BvbnNpdmU6dHJ1ZSwgbWFpbnRhaW5Bc3BlY3RSYXRpbzpmYWxzZSwKICAgICAgaW50ZXJhY3Rpb246e21vZGU6J2luZGV4JyxpbnRlcnNlY3Q6ZmFsc2V9LAogICAgICBwbHVnaW5zOnsKICAgICAgICBsZWdlbmQ6e2Rpc3BsYXk6ZmFsc2V9LAogICAgICAgIHRvb2x0aXA6e3J0bDp0cnVlLCBjYWxsYmFja3M6e2xhYmVsOmZ1bmN0aW9uKGMpe3JldHVybiBjLmRhdGFzZXQubGFiZWwrJzogJysoYy5wYXJzZWQueT49MD8nKyc6JycpK2MucGFyc2VkLnkudG9GaXhlZCgyKSsnJSc7fX19CiAgICAgIH0sCiAgICAgIHNjYWxlczp7CiAgICAgICAgeDp7c3RhY2tlZDpmYWxzZSwgZ3JpZDp7ZGlzcGxheTpmYWxzZX0sIHRpY2tzOnttYXhUaWNrc0xpbWl0OnR5cGU9PT0nYmFyJz8xMjo4LGZvbnQ6e3NpemU6MTB9LGNvbG9yOicjOGE5M2E4J319LAogICAgICAgIHk6e3Bvc2l0aW9uOidyaWdodCcsZ3JpZDp7Y29sb3I6JyNkZGUxZWMnLGxpbmVXaWR0aDoxLGRyYXdUaWNrczpmYWxzZX0sYm9yZGVyOntkaXNwbGF5OmZhbHNlfSx0aWNrczp7Y2FsbGJhY2s6ZnVuY3Rpb24odil7cmV0dXJuIHYrJyUnO30sZm9udDp7c2l6ZToxMH0sY29sb3I6JyM4YTkzYTgnfX0KICAgICAgfQogICAgfQogIH0pOwogIC8vIGN1c3RvbSBsZWdlbmQKICB2YXIgbGc9ZWwoJ2dmdC1sZWdlbmQnKTsKICBpZihsZykgbGcuaW5uZXJIVE1MPWRhdGFzZXRzLm1hcChmdW5jdGlvbihkcyl7cmV0dXJuICc8c3BhbiBjbGFzcz0iZ2Z0LWxnIj48aSBzdHlsZT0iYmFja2dyb3VuZDonK2RzLmJvcmRlckNvbG9yKyciPjwvaT4nK2VzYyhkcy5sYWJlbCkrJzwvc3Bhbj4nO30pLmpvaW4oJycpOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgSW52ZXN0bWVudCBjYWxjdWxhdG9yIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwp2YXIgY2FsYyA9IHtsdW1wOjE1MDAwMCwgbW9udGhseToyMDAwLCB3aXRoRmVlczpmYWxzZSwgZmVlczp7fX07CgpmdW5jdGlvbiBmbXRNb25leSh2KXsgcmV0dXJuIE1hdGgucm91bmQodikudG9Mb2NhbGVTdHJpbmcoJ2hlJyk7IH0KZnVuY3Rpb24gc2hvcnROYW1lKG4peyByZXR1cm4gbi5sZW5ndGg+MzAgPyBuLnNsaWNlKDAsMjkpKyfigKYnIDogbjsgfQoKZnVuY3Rpb24gc2ltdWxhdGUobWQsIGx1bXAsIG1vbnRobHksIGRlcEZlZSwgbWdtdEFubnVhbCl7CiAgdmFyIGJhbCA9IGx1bXAgLSBsdW1wKmRlcEZlZS8xMDA7CiAgdmFyIGRlcG9zaXRlZCA9IGx1bXA7CiAgdmFyIG1GZWUgPSBtZ210QW5udWFsLzEwMC8xMjsKICBtZC5mb3JFYWNoKGZ1bmN0aW9uKG0pewogICAgYmFsICs9IG1vbnRobHkgLSBtb250aGx5KmRlcEZlZS8xMDA7CiAgICBkZXBvc2l0ZWQgKz0gbW9udGhseTsKICAgIHZhciByPW51bShtLnJldHVybik7IGlmKHIhPT1udWxsKSBiYWwgKj0gKDErci8xMDApOwogICAgYmFsICo9ICgxIC0gbUZlZSk7CiAgfSk7CiAgcmV0dXJuIHtmaW5hbDpiYWwsIGRlcG9zaXRlZDpkZXBvc2l0ZWQsIHByb2ZpdDpiYWwtZGVwb3NpdGVkLCByZXQ6KGRlcG9zaXRlZD4wPyhiYWwtZGVwb3NpdGVkKS9kZXBvc2l0ZWQqMTAwOjApfTsKfQoKZnVuY3Rpb24gcmFuZ2VMYWJlbCgpewogIHJldHVybiB7MTI6J9ep16DXlCcsMzY6JzMg16nXoNeZ150nLDYwOic1INep16DXmdedJywxMjA6JzEwINep16DXmdedJyw5OTk6J9eU16rXp9eV16TXlCDXlNee15zXkNeUJ31bZ3JhcGhSYW5nZV18fCfXlNeq16fXldek15QnOwp9CgpmdW5jdGlvbiByZW5kZXJDYWxjQm9keSgpewogIHZhciBiPWVsKCdnZnQtY2FsYy1ib2R5Jyk7IGlmKCFiKSByZXR1cm47CiAgdmFyIGZlZVJvd3MgPSBjYWxjLndpdGhGZWVzID8gc2VsLm1hcChmdW5jdGlvbihmLGkpewogICAgdmFyIGZlZT1jYWxjLmZlZXNbZi5jb2RlXXx8e30sIGQ9bWV0cmljc1tmLmNvZGVdfHx7fTsKICAgIHZhciBkZWZNZ210ID0gZmVlLm1nbXQhPW51bGw/ZmVlLm1nbXQgOiAoZC5tZ210X2ZlZSE9bnVsbD9udW0oZC5tZ210X2ZlZSkudG9GaXhlZCgyKTonMC4wMCcpOwogICAgdmFyIGRlZkRlcCAgPSBmZWUuZGVwIT1udWxsP2ZlZS5kZXAgIDogKGQuZGVwb3NpdF9mZWUhPW51bGw/bnVtKGQuZGVwb3NpdF9mZWUpLnRvRml4ZWQoMik6JzAuMDAnKTsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZ2Z0LWZlZS1jYXJkIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZ2Z0LWZlZS1oZCI+PHNwYW4gY2xhc3M9ImdmdC1kb3QiIHN0eWxlPSJiYWNrZ3JvdW5kOicrU0VSSUVTX0NPTE9SU1tpJVNFUklFU19DT0xPUlMubGVuZ3RoXSsnIj48L3NwYW4+Jytlc2Moc2hvcnROYW1lKGYubmFtZSkpKyc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZ2Z0LWZlZS1ncmlkIj4nKwogICAgICAgICc8bGFiZWwgY2xhc3M9ImdmdC1mZWUtbGFiIj7Xk9ee15kg16DXmdeU15XXnCDXnteU16TXp9eT15QgKCUpPGlucHV0IHR5cGU9Im51bWJlciIgc3RlcD0iMC4wMSIgbWluPSIwIiBjbGFzcz0iZ2Z0LWZlZS1pbiIgZGF0YS1jb2RlPSInK2VzYyhmLmNvZGUpKyciIGRhdGEta2luZD0iZGVwIiB2YWx1ZT0iJytkZWZEZXArJyI+PC9sYWJlbD4nKwogICAgICAgICc8bGFiZWwgY2xhc3M9ImdmdC1mZWUtbGFiIj7Xk9ee15kg16DXmdeU15XXnCDXnteU16bXkdeZ16jXlCAoJSDXqdeg16rXmSk8aW5wdXQgdHlwZT0ibnVtYmVyIiBzdGVwPSIwLjAxIiBtaW49IjAiIGNsYXNzPSJnZnQtZmVlLWluIiBkYXRhLWNvZGU9IicrZXNjKGYuY29kZSkrJyIgZGF0YS1raW5kPSJtZ210IiB2YWx1ZT0iJytkZWZNZ210KyciPjwvbGFiZWw+JysKICAgICAgJzwvZGl2PicrCiAgICAnPC9kaXY+JzsKICB9KS5qb2luKCcnKSA6ICcnOwogIGIuaW5uZXJIVE1MID0KICAgICc8bGFiZWwgY2xhc3M9ImdmdC1jYWxjLWZpZWxkIj7XlNek16fXk9eUINeX15Mg16TXotee15nXqiAo4oKqKTxpbnB1dCBpZD0iY2FsYy1sdW1wIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgdmFsdWU9IicrY2FsYy5sdW1wKyciPjwvbGFiZWw+JysKICAgICc8bGFiZWwgY2xhc3M9ImdmdC1jYWxjLWZpZWxkIj7XlNek16fXk9eUINeX15XXk9ep15nXqiAo4oKqKTxpbnB1dCBpZD0iY2FsYy1tb250aGx5IiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgdmFsdWU9IicrY2FsYy5tb250aGx5KyciPjwvbGFiZWw+JysKICAgICc8ZGl2IGNsYXNzPSJnZnQtY2FsYy1kaXZpZGVyIj48L2Rpdj4nKwogICAgJzxsYWJlbCBjbGFzcz0iZ2Z0LWNhbGMtY2hlY2siPjxzcGFuPteb15XXnNecINeT157XmSDXoNeZ15TXldecPC9zcGFuPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImNhbGMtZmVlcyIgJysoY2FsYy53aXRoRmVlcz8nY2hlY2tlZCc6JycpKyc+PC9sYWJlbD4nKwogICAgJzxkaXYgY2xhc3M9ImdmdC1mZWUtbGlzdCI+JytmZWVSb3dzKyc8L2Rpdj4nOwp9CmZ1bmN0aW9uIHN5bmNDYWxjSW5wdXRzKCl7CiAgdmFyIGw9ZWwoJ2NhbGMtbHVtcCcpLCBtPWVsKCdjYWxjLW1vbnRobHknKTsKICBpZihsKSBjYWxjLmx1bXA9cGFyc2VGbG9hdChsLnZhbHVlKXx8MDsKICBpZihtKSBjYWxjLm1vbnRobHk9cGFyc2VGbG9hdChtLnZhbHVlKXx8MDsKfQpmdW5jdGlvbiBvcGVuQ2FsYygpewogIGlmKCFzZWwubGVuZ3RoKXsgdG9hc3QoJ9eR15fXqCDXp9eV16TXldeqINec15TXqdeV15XXkNeUINeq15fXmdec15QnKTsgcmV0dXJuOyB9CiAgcmVuZGVyQ2FsY0JvZHkoKTsKICBlbCgnZ2Z0LWNhbGMtb3YnKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7Cn0KZnVuY3Rpb24gY2xvc2VDYWxjKCl7IGVsKCdnZnQtY2FsYy1vdicpLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsgfQoKZnVuY3Rpb24gYXBwbHlDYWxjKCl7CiAgc3luY0NhbGNJbnB1dHMoKTsKICBjYWxjLndpdGhGZWVzID0gZWwoJ2NhbGMtZmVlcycpLmNoZWNrZWQ7CiAgY2FsYy5mZWVzPXt9OwogIGlmKGNhbGMud2l0aEZlZXMpewogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2dmdC1jYWxjLWJvZHkgLmdmdC1mZWUtaW4nKS5mb3JFYWNoKGZ1bmN0aW9uKGlucCl7CiAgICAgIHZhciBjPWlucC5kYXRhc2V0LmNvZGU7IGNhbGMuZmVlc1tjXT1jYWxjLmZlZXNbY118fHt9OwogICAgICBjYWxjLmZlZXNbY11baW5wLmRhdGFzZXQua2luZF09cGFyc2VGbG9hdChpbnAudmFsdWUpfHwwOwogICAgfSk7CiAgfQogIHZhciBob3N0PWVsKCdnZnQtY2FsYy1yZXN1bHRzJyk7CiAgaWYoaG9zdCkgaG9zdC5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImdmdC1yZXMtdGl0bGUiPteh15vXldee15nXnSDXodeV16TXmdeZ150g15HXqteV150g15TXqten15XXpNeUPC9kaXY+PGRpdiBzdHlsZT0icGFkZGluZzoxOHB4O2NvbG9yOnZhcigtLW11KTt0ZXh0LWFsaWduOmNlbnRlciI+4o+zINee15fXqdeR4oCmPC9kaXY+JzsKICBjbG9zZUNhbGMoKTsKICB2YXIgcGVuZGluZz1zZWwubGVuZ3RoLCBkYXRhPXt9OwogIHNlbC5mb3JFYWNoKGZ1bmN0aW9uKGYpewogICAgbG9hZFNlcmllcyhmLmNvZGUsIGdyYXBoUmFuZ2UsIGZ1bmN0aW9uKG1kKXsKICAgICAgdmFyIGZlZT1jYWxjLndpdGhGZWVzPyhjYWxjLmZlZXNbZi5jb2RlXXx8e30pOnt9OwogICAgICBkYXRhW2YuY29kZV09c2ltdWxhdGUobWQsIGNhbGMubHVtcCwgY2FsYy5tb250aGx5LCBmZWUuZGVwfHwwLCBmZWUubWdtdHx8MCk7CiAgICAgIGRhdGFbZi5jb2RlXS5tb250aHM9bWQubGVuZ3RoOwogICAgICBpZigtLXBlbmRpbmc9PT0wKSByZW5kZXJDYWxjUmVzdWx0cyhkYXRhKTsKICAgIH0pOwogIH0pOwp9CmZ1bmN0aW9uIGNsZWFyQ2FsYygpewogIGNhbGM9e2x1bXA6MCxtb250aGx5OjAsd2l0aEZlZXM6ZmFsc2UsZmVlczp7fX07CiAgcmVuZGVyQ2FsY0JvZHkoKTsKICB2YXIgaG9zdD1lbCgnZ2Z0LWNhbGMtcmVzdWx0cycpOyBpZihob3N0KSBob3N0LmlubmVySFRNTD0nJzsKfQpmdW5jdGlvbiByZW5kZXJDYWxjUmVzdWx0cyhkYXRhKXsKICB2YXIgaG9zdD1lbCgnZ2Z0LWNhbGMtcmVzdWx0cycpOyBpZighaG9zdCkgcmV0dXJuOwogIHZhciBiZXN0PS1JbmZpbml0eSwgYmVzdENvZGU9bnVsbDsKICBzZWwuZm9yRWFjaChmdW5jdGlvbihmKXsgdmFyIHI9ZGF0YVtmLmNvZGVdOyBpZihyJiZyLmZpbmFsPmJlc3Qpe2Jlc3Q9ci5maW5hbDtiZXN0Q29kZT1mLmNvZGU7fSB9KTsKICB2YXIgY2FyZHM9c2VsLm1hcChmdW5jdGlvbihmLGkpewogICAgdmFyIHI9ZGF0YVtmLmNvZGVdfHx7fSwgaXNCZXN0PShmLmNvZGU9PT1iZXN0Q29kZSAmJiBzZWwubGVuZ3RoPjEpOwogICAgdmFyIGNvbD1TRVJJRVNfQ09MT1JTW2klU0VSSUVTX0NPTE9SUy5sZW5ndGhdOwogICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJnZnQtcmVzLWNhcmQnKyhpc0Jlc3Q/JyBiZXN0JzonJykrJyI+JysKICAgICAgKGlzQmVzdD8nPGRpdiBjbGFzcz0iZ2Z0LXJlcy1iYWRnZSI+15TXlNem16LXlCDXlNee16nXqtec157XqjwvZGl2Pic6JycpKwogICAgICAnPGRpdiBjbGFzcz0iZ2Z0LXJlcy1uYW1lIj48c3BhbiBjbGFzcz0iZ2Z0LWRvdCIgc3R5bGU9ImJhY2tncm91bmQ6Jytjb2wrJyI+PC9zcGFuPicrZXNjKHNob3J0TmFtZShmLm5hbWUpKSsnPC9kaXY+JysKICAgICAgJzxkaXYgY2xhc3M9ImdmdC1yZXMtYW10Ij4nK2ZtdE1vbmV5KHIuZmluYWx8fDApKycgPHNwYW4+4oKqPC9zcGFuPjwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJnZnQtcmVzLXJvd3MiPicrCiAgICAgICAgJzxkaXY+PHNwYW4+15TXldek16fXkzwvc3Bhbj48Yj4nK2ZtdE1vbmV5KHIuZGVwb3NpdGVkfHwwKSsn4oKqPC9iPjwvZGl2PicrCiAgICAgICAgJzxkaXY+PHNwYW4+16jXldeV15c8L3NwYW4+PGI+JytmbXRNb25leShyLnByb2ZpdHx8MCkrJ+KCqjwvYj48L2Rpdj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJnZnQtcmVzLXJldCAnKygoci5yZXR8fDApPj0wPydwb3MnOiduZWcnKSsnIj48c3Bhbj7Xqtep15XXkNeUPC9zcGFuPjxiPicrKChyLnJldHx8MCk+PTA/JysnOicnKSsoci5yZXR8fDApLnRvRml4ZWQoMikrJyU8L2I+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAnPC9kaXY+JzsKICB9KS5qb2luKCcnKTsKICBob3N0LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZ2Z0LXJlcy10aXRsZSI+16HXm9eV157XmdedINeh15XXpNeZ15nXnSDXkdeq15XXnSDXlNeq16fXldek15QgwrcgJytyYW5nZUxhYmVsKCkrJzwvZGl2PicrCiAgICAnPGRpdiBjbGFzcz0iZ2Z0LXJlcy1ncmlkIj4nK2NhcmRzKyc8L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImdmdC1yZXMtbm90ZSI+15TXl9eZ16nXldeRINee15HXldeh16Eg16LXnCDXlNeq16nXldeQ15XXqiDXlNeX15XXk9ep15nXldeqINeR16TXldei15wg16nXnCDXm9ecINen15XXpNeUINec15DXldeo15ogJytyYW5nZUxhYmVsKCkrJywg15HXqteV16HXpNeqINeU15TXpNen15PXldeqINep15TXldeW16DXlS4g16rXqdeV15DXldeqINei15HXqCDXkNeZ16DXnyDXnteR15jXmdeX15XXqiDXqtep15XXkNeV16og16LXqteZ15MuPC9kaXY+JzsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIENvbXBvdW5kLWludGVyZXN0IChmb3J3YXJkIHByb2plY3Rpb24pIGNhbGN1bGF0b3Ig4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCnZhciBjaSA9IHtsdW1wOjE1MDAwMCwgbW9udGhseToxMDAwLCB5ZWFyczoyMCwgYmFzaXM6JzV5Jywgd2l0aEZlZXM6ZmFsc2UsIGZlZXM6e319Owp2YXIgQ0lfQkFTSVMgPSBbWycxeScsJ9ep16DXlCddLFsnM3knLCczINep16DXmdedJ10sWyc1eScsJzUg16nXoNeZ150nXSxbJzEweScsJzEwINep16DXmdedJ11dOwpmdW5jdGlvbiBjaUJhc2lzTGFiZWwoKXsgdmFyIG09eycxeSc6J9eq16nXldeQ16og16nXoNeUJywnM3knOifXqtep15XXkNeqIDMg16nXoNeZ150nLCc1eSc6J9eq16nXldeQ16ogNSDXqdeg15nXnScsJzEweSc6J9eq16nXldeQ16ogMTAg16nXoNeZ150nfTsgcmV0dXJuIG1bY2kuYmFzaXNdfHwnJzsgfQoKZnVuY3Rpb24gYW5udWFsUmV0dXJuKGYsIGJhc2lzKXsKICB2YXIgZD1tZXRyaWNzW2YuY29kZV18fHt9OwogIGlmKGJhc2lzPT09JzF5JykgcmV0dXJuIG51bShkLnJldHVybl8xeSk7CiAgaWYoYmFzaXM9PT0nM3knKSByZXR1cm4gbnVtKGQucmV0dXJuXzN5X2FubnVhbCk7CiAgaWYoYmFzaXM9PT0nNXknKSByZXR1cm4gbnVtKGQucmV0dXJuXzV5X2FubnVhbCk7CiAgaWYoYmFzaXM9PT0nMTB5Jyl7IHZhciB0PXRlblllYXJbZi5jb2RlXTsgcmV0dXJuICh0JiYhdC5uYSYmIXQubG9hZGluZyk/dC5hbm46bnVsbDsgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGNpU2ltdWxhdGUoclBjdCwgbHVtcCwgbW9udGhseSwgeWVhcnMsIGRlcEZlZSwgbWdtdEFubnVhbCl7CiAgZGVwRmVlPWRlcEZlZXx8MDsgbWdtdEFubnVhbD1tZ210QW5udWFsfHwwOwogIHZhciByPXJQY3QvMTAwLCBtb250aHM9TWF0aC5yb3VuZCh5ZWFycyoxMik7CiAgdmFyIHJtPU1hdGgucG93KDErciwxLzEyKS0xLCBtRmVlPW1nbXRBbm51YWwvMTAwLzEyOwogIHZhciBiYWw9bHVtcC1sdW1wKmRlcEZlZS8xMDAsIGRlcD1sdW1wOwogIGZvcih2YXIgaT0wO2k8bW9udGhzO2krKyl7CiAgICBiYWwgKz0gbW9udGhseSAtIG1vbnRobHkqZGVwRmVlLzEwMDsKICAgIGRlcCArPSBtb250aGx5OwogICAgYmFsICo9ICgxK3JtKTsgICAgICAgIC8vIGdyb3NzIGdyb3d0aAogICAgYmFsICo9ICgxLW1GZWUpOyAgICAgIC8vIGFubnVhbCBtZ210IGZlZSAobW9udGhseSBzbGljZSkKICB9CiAgcmV0dXJuIHtmaW5hbDpiYWwsIGRlcG9zaXRlZDpkZXAsIHByb2ZpdDpiYWwtZGVwLCByZXQ6KGRlcD4wPyhiYWwtZGVwKS9kZXAqMTAwOjApfTsKfQpmdW5jdGlvbiByZW5kZXJDSUJvZHkoKXsKICB2YXIgYj1lbCgnZ2Z0LWNpLWJvZHknKTsgaWYoIWIpIHJldHVybjsKICB2YXIgZmVlUm93cyA9IGNpLndpdGhGZWVzID8gc2VsLm1hcChmdW5jdGlvbihmLGkpewogICAgdmFyIGZlZT1jaS5mZWVzW2YuY29kZV18fHt9LCBkPW1ldHJpY3NbZi5jb2RlXXx8e307CiAgICB2YXIgZGVmTWdtdCA9IGZlZS5tZ210IT1udWxsP2ZlZS5tZ210IDogKGQubWdtdF9mZWUhPW51bGw/bnVtKGQubWdtdF9mZWUpLnRvRml4ZWQoMik6JzAuMDAnKTsKICAgIHZhciBkZWZEZXAgID0gZmVlLmRlcCE9bnVsbD9mZWUuZGVwICA6IChkLmRlcG9zaXRfZmVlIT1udWxsP251bShkLmRlcG9zaXRfZmVlKS50b0ZpeGVkKDIpOicwLjAwJyk7CiAgICByZXR1cm4gJzxkaXYgY2xhc3M9ImdmdC1mZWUtY2FyZCI+JysKICAgICAgJzxkaXYgY2xhc3M9ImdmdC1mZWUtaGQiPjxzcGFuIGNsYXNzPSJnZnQtZG90IiBzdHlsZT0iYmFja2dyb3VuZDonK1NFUklFU19DT0xPUlNbaSVTRVJJRVNfQ09MT1JTLmxlbmd0aF0rJyI+PC9zcGFuPicrZXNjKHNob3J0TmFtZShmLm5hbWUpKSsnPC9kaXY+JysKICAgICAgJzxkaXYgY2xhc3M9ImdmdC1mZWUtZ3JpZCI+JysKICAgICAgICAnPGxhYmVsIGNsYXNzPSJnZnQtZmVlLWxhYiI+15PXnteZINeg15nXlNeV15wg157XlNek16fXk9eUICglKTxpbnB1dCB0eXBlPSJudW1iZXIiIHN0ZXA9IjAuMDEiIG1pbj0iMCIgY2xhc3M9ImdmdC1mZWUtaW4iIGRhdGEtY29kZT0iJytlc2MoZi5jb2RlKSsnIiBkYXRhLWtpbmQ9ImRlcCIgdmFsdWU9IicrZGVmRGVwKyciPjwvbGFiZWw+JysKICAgICAgICAnPGxhYmVsIGNsYXNzPSJnZnQtZmVlLWxhYiI+15PXnteZINeg15nXlNeV15wg157XlNem15HXmdeo15QgKCUg16nXoNeq15kpPGlucHV0IHR5cGU9Im51bWJlciIgc3RlcD0iMC4wMSIgbWluPSIwIiBjbGFzcz0iZ2Z0LWZlZS1pbiIgZGF0YS1jb2RlPSInK2VzYyhmLmNvZGUpKyciIGRhdGEta2luZD0ibWdtdCIgdmFsdWU9IicrZGVmTWdtdCsnIj48L2xhYmVsPicrCiAgICAgICc8L2Rpdj4nKwogICAgJzwvZGl2Pic7CiAgfSkuam9pbignJykgOiAnJzsKICBiLmlubmVySFRNTCA9CiAgICAnPGxhYmVsIGNsYXNzPSJnZnQtY2FsYy1maWVsZCI+15TXpNen15PXlCDXl9eTINek16LXnteZ16ogKOKCqik8aW5wdXQgaWQ9ImNpLWx1bXAiIHR5cGU9Im51bWJlciIgbWluPSIwIiB2YWx1ZT0iJytjaS5sdW1wKyciPjwvbGFiZWw+JysKICAgICc8bGFiZWwgY2xhc3M9ImdmdC1jYWxjLWZpZWxkIj7XlNek16fXk9eUINeX15XXk9ep15nXqiAo4oKqKTxpbnB1dCBpZD0iY2ktbW9udGhseSIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHZhbHVlPSInK2NpLm1vbnRobHkrJyI+PC9sYWJlbD4nKwogICAgJzxsYWJlbCBjbGFzcz0iZ2Z0LWNhbGMtZmllbGQiPtee16HXpNeoINep16DXmdedINec15fXmdep15XXkTxpbnB1dCBpZD0iY2kteWVhcnMiIHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IjYwIiB2YWx1ZT0iJytjaS55ZWFycysnIj48L2xhYmVsPicrCiAgICAnPGRpdiBjbGFzcz0iZ2Z0LWNhbGMtZmllbGQiPjxzcGFuPteR16HXmdehINeq16nXldeQ15Qg16nXoNeq15nXqiAo15zXpNeZINeR15nXpteV16LXmSDXoteR16gpPC9zcGFuPjxkaXYgY2xhc3M9ImdmdC1jaS1iYXNpcyIgaWQ9ImNpLWJhc2lzIj4nKwogICAgICBDSV9CQVNJUy5tYXAoZnVuY3Rpb24oYmIpe3JldHVybiAnPGJ1dHRvbiBjbGFzcz0iZ2Z0LWNpLWInKyhjaS5iYXNpcz09PWJiWzBdPycgb24nOicnKSsnIiBkYXRhLWI9IicrYmJbMF0rJyI+JytiYlsxXSsnPC9idXR0b24+Jzt9KS5qb2luKCcnKSsKICAgICc8L2Rpdj48L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImdmdC1jYWxjLWRpdmlkZXIiPjwvZGl2PicrCiAgICAnPGxhYmVsIGNsYXNzPSJnZnQtY2FsYy1jaGVjayI+PHNwYW4+15vXldec15wg15PXnteZINeg15nXlNeV15w8L3NwYW4+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iY2ktZmVlcyIgJysoY2kud2l0aEZlZXM/J2NoZWNrZWQnOicnKSsnPjwvbGFiZWw+JysKICAgICc8ZGl2IGNsYXNzPSJnZnQtZmVlLWxpc3QiPicrZmVlUm93cysnPC9kaXY+JzsKfQpmdW5jdGlvbiBzeW5jQ0koKXsKICB2YXIgbD1lbCgnY2ktbHVtcCcpLG09ZWwoJ2NpLW1vbnRobHknKSx5PWVsKCdjaS15ZWFycycpOwogIGlmKGwpIGNpLmx1bXA9cGFyc2VGbG9hdChsLnZhbHVlKXx8MDsKICBpZihtKSBjaS5tb250aGx5PXBhcnNlRmxvYXQobS52YWx1ZSl8fDA7CiAgaWYoeSkgY2kueWVhcnM9TWF0aC5tYXgoMSxNYXRoLm1pbig2MCxwYXJzZUZsb2F0KHkudmFsdWUpfHwxKSk7Cn0KZnVuY3Rpb24gb3BlbkNJKCl7IGlmKCFzZWwubGVuZ3RoKXsgdG9hc3QoJ9eR15fXqCDXp9eV16TXldeqINec15TXqdeV15XXkNeUINeq15fXmdec15QnKTsgcmV0dXJuOyB9IHJlbmRlckNJQm9keSgpOyBlbCgnZ2Z0LWNpLW92JykuY2xhc3NMaXN0LmFkZCgnb3BlbicpOyB9CmZ1bmN0aW9uIGNsb3NlQ0koKXsgZWwoJ2dmdC1jaS1vdicpLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsgfQpmdW5jdGlvbiBjbGVhckNJKCl7IGNpPXtsdW1wOjAsbW9udGhseTowLHllYXJzOjIwLGJhc2lzOic1eSd9OyByZW5kZXJDSUJvZHkoKTsgdmFyIGg9ZWwoJ2dmdC1jYWxjLXJlc3VsdHMnKTsgaWYoaCkgaC5pbm5lckhUTUw9Jyc7IH0KZnVuY3Rpb24gYXBwbHlDSSgpewogIHN5bmNDSSgpOwogIGNpLndpdGhGZWVzID0gZWwoJ2NpLWZlZXMnKSA/IGVsKCdjaS1mZWVzJykuY2hlY2tlZCA6IGNpLndpdGhGZWVzOwogIGNpLmZlZXM9e307CiAgaWYoY2kud2l0aEZlZXMpewogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2dmdC1jaS1ib2R5IC5nZnQtZmVlLWluJykuZm9yRWFjaChmdW5jdGlvbihpbnApewogICAgICB2YXIgYz1pbnAuZGF0YXNldC5jb2RlOyBjaS5mZWVzW2NdPWNpLmZlZXNbY118fHt9OyBjaS5mZWVzW2NdW2lucC5kYXRhc2V0LmtpbmRdPXBhcnNlRmxvYXQoaW5wLnZhbHVlKXx8MDsKICAgIH0pOwogIH0KICBjbG9zZUNJKCk7CiAgdmFyIGhvc3Q9ZWwoJ2dmdC1jYWxjLXJlc3VsdHMnKTsgaWYoIWhvc3QpIHJldHVybjsKICB2YXIgYmVzdD0tSW5maW5pdHksIGJlc3RDb2RlPW51bGwsIGRhdGE9e307CiAgc2VsLmZvckVhY2goZnVuY3Rpb24oZil7CiAgICB2YXIgcj1hbm51YWxSZXR1cm4oZixjaS5iYXNpcyksIGZlZT1jaS53aXRoRmVlcz8oY2kuZmVlc1tmLmNvZGVdfHx7fSk6e307CiAgICBkYXRhW2YuY29kZV09IHI9PT1udWxsP251bGw6Y2lTaW11bGF0ZShyLGNpLmx1bXAsY2kubW9udGhseSxjaS55ZWFycywgZmVlLmRlcHx8MCwgZmVlLm1nbXR8fDApOwogICAgaWYoZGF0YVtmLmNvZGVdJiZkYXRhW2YuY29kZV0uZmluYWw+YmVzdCl7YmVzdD1kYXRhW2YuY29kZV0uZmluYWw7YmVzdENvZGU9Zi5jb2RlO30KICB9KTsKICB2YXIgY2FyZHM9c2VsLm1hcChmdW5jdGlvbihmLGkpewogICAgdmFyIHI9ZGF0YVtmLmNvZGVdLCBjb2w9U0VSSUVTX0NPTE9SU1tpJVNFUklFU19DT0xPUlMubGVuZ3RoXSwgaXNCZXN0PShmLmNvZGU9PT1iZXN0Q29kZSYmc2VsLmxlbmd0aD4xKTsKICAgIGlmKCFyKSByZXR1cm4gJzxkaXYgY2xhc3M9ImdmdC1yZXMtY2FyZCI+PGRpdiBjbGFzcz0iZ2Z0LXJlcy1uYW1lIj48c3BhbiBjbGFzcz0iZ2Z0LWRvdCIgc3R5bGU9ImJhY2tncm91bmQ6Jytjb2wrJyI+PC9zcGFuPicrZXNjKHNob3J0TmFtZShmLm5hbWUpKSsnPC9kaXY+PGRpdiBjbGFzcz0iZ2Z0LXJlcy1hbXQgZ2Z0LW5hIiBzdHlsZT0iZm9udC1zaXplOjFyZW0iPteQ15nXnyDXoNeq15XXnyDXnCcrY2lCYXNpc0xhYmVsKCkrJzwvZGl2PjwvZGl2Pic7CiAgICB2YXIgYXI9YW5udWFsUmV0dXJuKGYsY2kuYmFzaXMpOwogICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJnZnQtcmVzLWNhcmQnKyhpc0Jlc3Q/JyBiZXN0JzonJykrJyI+JysKICAgICAgKGlzQmVzdD8nPGRpdiBjbGFzcz0iZ2Z0LXJlcy1iYWRnZSI+15TXqteX15bXmdeqINeU15LXkdeV15TXlDwvZGl2Pic6JycpKwogICAgICAnPGRpdiBjbGFzcz0iZ2Z0LXJlcy1uYW1lIj48c3BhbiBjbGFzcz0iZ2Z0LWRvdCIgc3R5bGU9ImJhY2tncm91bmQ6Jytjb2wrJyI+PC9zcGFuPicrZXNjKHNob3J0TmFtZShmLm5hbWUpKSsnPC9kaXY+JysKICAgICAgJzxkaXYgY2xhc3M9ImdmdC1yZXMtYW10Ij4nK2ZtdE1vbmV5KHIuZmluYWwpKycgPHNwYW4+4oKqPC9zcGFuPjwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJnZnQtcmVzLXJvd3MiPicrCiAgICAgICAgJzxkaXY+PHNwYW4+15TXldek16fXkzwvc3Bhbj48Yj4nK2ZtdE1vbmV5KHIuZGVwb3NpdGVkKSsn4oKqPC9iPjwvZGl2PicrCiAgICAgICAgJzxkaXY+PHNwYW4+16jXldeV15cg16bXpNeV15k8L3NwYW4+PGI+JytmbXRNb25leShyLnByb2ZpdCkrJ+KCqjwvYj48L2Rpdj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJnZnQtcmVzLXJldCBwb3MiPjxzcGFuPteq16nXldeQ15Qg16nXoNeq15nXqjwvc3Bhbj48Yj4nKyhhcj49MD8nKyc6JycpK2FyLnRvRml4ZWQoMikrJyU8L2I+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAnPC9kaXY+JzsKICB9KS5qb2luKCcnKTsKICBob3N0LmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZ2Z0LXJlcy10aXRsZSI+16rXl9eW15nXqiDXqNeZ15HXmdeqLdeT16jXmdeR15nXqiDCtyAnK2NpLnllYXJzKycg16nXoNeZ150gwrcg15zXpNeZICcrY2lCYXNpc0xhYmVsKCkrKGNpLndpdGhGZWVzPycgwrcg15HXoNeZ15vXldeZINeT157XmSDXoNeZ15TXldecJzonJykrJzwvZGl2PicrCiAgICAnPGRpdiBjbGFzcz0iZ2Z0LXJlcy1ncmlkIj4nK2NhcmRzKyc8L2Rpdj4nKwogICAgJzxkaXYgY2xhc3M9ImdmdC1yZXMtbm90ZSI+16rXl9eW15nXqiDXqteZ15DXldeo15jXmdeqINeU157XoNeZ15fXlCDXqtep15XXkNeUINep16DXqteZ16og16fXkdeV16LXlCDXnNek15kg15HXmdem15XXoteZINeU16LXkdeoINep15wg15TXp9eV16TXlC4g15DXmdeg15Qg157XlNeV15XXlCDXlNeR15jXl9eqINeq16nXldeQ15Qg4oCUINeq16nXldeQ15XXqiDXoteR16gg15DXmdeg158g157XoteZ15PXldeqINei15wg15TXoteq15nXky48L2Rpdj4nOwogIGhvc3Quc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOiduZWFyZXN0J30pOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgUERGIC8gY2xpZW50IHJlcG9ydCBleHBvcnQg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIGZ1bmRSZXR1cm5zKGYpewogIHZhciBkPW1ldHJpY3NbZi5jb2RlXXx8e30sIHQ9dGVuWWVhcltmLmNvZGVdOwogIHJldHVybiB7IHIxMjpudW0oZC5yZXR1cm5fMXkpLCByMzpjdW1Gcm9tQW5udWFsKGQucmV0dXJuXzN5X2FubnVhbCwzKSwgcjU6Y3VtRnJvbUFubnVhbChkLnJldHVybl81eV9hbm51YWwsNSksIHIxMDoodCYmIXQubmEmJiF0LmxvYWRpbmcpP3QuY3VtOm51bGwgfTsKfQpmdW5jdGlvbiBwZGZQY3Qodil7IGlmKHY9PW51bGx8fGlzTmFOKHYpKSByZXR1cm4gJzxzcGFuIHN0eWxlPSJjb2xvcjojYWFhIj7igJQ8L3NwYW4+JzsgdmFyIGM9dj49MD8nIzFhOGE1Nic6JyNkMjNiNGUnOyByZXR1cm4gJzxzcGFuIHN0eWxlPSJjb2xvcjonK2MrJztmb250LXdlaWdodDo3MDAiPicrKHY+PTA/JysnOicnKSt2LnRvRml4ZWQoMikrJyU8L3NwYW4+JzsgfQpmdW5jdGlvbiBwZGZOdW0odixzdWYpeyB2YXIgbj1udW0odik7IHJldHVybiBuPT1udWxsPyfigJQnOm4udG9GaXhlZCgyKSsoc3VmfHwnJyk7IH0KZnVuY3Rpb24gb3BlblBERigpeyBpZighc2VsLmxlbmd0aCl7IHRvYXN0KCfXkdeX16gg16fXldek15XXqiDXnNeU16nXldeV15DXlCDXqteX15nXnNeUJyk7IHJldHVybjsgfSBlbCgnZ2Z0LXBkZi1vdicpLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsgdmFyIHQ9ZWwoJ3BkZi10aXRsZScpOyBpZih0JiYhdC52YWx1ZSkgdC5mb2N1cygpOyB9CmZ1bmN0aW9uIGNsb3NlUERGKCl7IGVsKCdnZnQtcGRmLW92JykuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOyB9CmZ1bmN0aW9uIGNvcHlTaGFyZUxpbmsoKXsKICBpZighc2VsLmxlbmd0aCl7IHRvYXN0KCfXkdeX16gg16fXldek15XXqiDXqteX15nXnNeUJyk7IHJldHVybjsgfQogIHVwZGF0ZVVSTCgpOwogIHZhciB1cmw9d2luZG93LmxvY2F0aW9uLmhyZWYsIGRvbmU9ZnVuY3Rpb24oKXsgdG9hc3QoJ+KckyDXlNen15nXqdeV16gg15TXldei16rXpyDigJQg16nXnNeXINec15zXp9eV15cnKTsgY2xvc2VQREYoKTsgfTsKICBpZihuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KXsKICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHVybCkudGhlbihkb25lKS5jYXRjaChmdW5jdGlvbigpeyBmYWxsYmFja0NvcHkodXJsKTsgZG9uZSgpOyB9KTsKICB9IGVsc2UgeyBmYWxsYmFja0NvcHkodXJsKTsgZG9uZSgpOyB9Cn0KZnVuY3Rpb24gZmFsbGJhY2tDb3B5KHRleHQpewogIHRyeXsgdmFyIHRhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7IHRhLnZhbHVlPXRleHQ7IHRhLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCcnKTsgdGEuc3R5bGUucG9zaXRpb249J2ZpeGVkJzsgdGEuc3R5bGUub3BhY2l0eT0nMCc7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7IH1jYXRjaChlKXt9Cn0KCmZ1bmN0aW9uIGJ1aWxkUmVwb3J0SFRNTChvLCBjaGFydEltZyl7CiAgdmFyIGQ9bmV3IERhdGUoKSwgZGF0ZVN0cj1kLmdldERhdGUoKSsnLycrKGQuZ2V0TW9udGgoKSsxKSsnLycrZC5nZXRGdWxsWWVhcigpOwogIHZhciByZXRSb3dzPXNlbC5tYXAoZnVuY3Rpb24oZixpKXsKICAgIHZhciByPWZ1bmRSZXR1cm5zKGYpLCBjb2w9U0VSSUVTX0NPTE9SU1tpJVNFUklFU19DT0xPUlMubGVuZ3RoXTsKICAgIHJldHVybiAnPHRyPjx0ZCBjbGFzcz0ibm0iPjxzcGFuIGNsYXNzPSJkb3QiIHN0eWxlPSJiYWNrZ3JvdW5kOicrY29sKyciPjwvc3Bhbj4nKyhmLmxvZ28/JzxpbWcgc3JjPSInK2VzYyhmLmxvZ28pKyciPic6JycpKyc8c3BhbiBjbGFzcz0ibm10Ij4nK2VzYyhmLm5hbWUpKyc8YnI+PHNtYWxsPicrZXNjKFRMW2YudHlwZV18fCcnKSsnIMK3INee16HXsyAnK2VzYyhmLmNvZGUpKyc8L3NtYWxsPjwvc3Bhbj48L3RkPicrCiAgICAgICc8dGQ+JytwZGZQY3Qoci5yMTIpKyc8L3RkPjx0ZD4nK3BkZlBjdChyLnIzKSsnPC90ZD48dGQ+JytwZGZQY3Qoci5yNSkrJzwvdGQ+PHRkPicrcGRmUGN0KHIucjEwKSsnPC90ZD48L3RyPic7CiAgfSkuam9pbignJyk7CiAgdmFyIGV4cFNlYz0nJzsKICBpZihvLmV4cCl7CiAgICB2YXIgZXI9c2VsLm1hcChmdW5jdGlvbihmKXsgdmFyIGU9ZnVuZEV4cG9zdXJlKGYpOyB2YXIgYz1mdW5jdGlvbih4KXtyZXR1cm4geD09bnVsbD8n4oCUJzp4LnRvRml4ZWQoMSkrJyUnO307CiAgICAgIHJldHVybiAnPHRyPjx0ZCBjbGFzcz0ibm0yIj4nK2VzYyhmLm5hbWUpKyc8L3RkPjx0ZD4nK2MoZS5zdG9jaykrJzwvdGQ+PHRkPicrYyhlLmZvcmVpZ24pKyc8L3RkPjx0ZD4nK2MoZS5mb3JleCkrJzwvdGQ+PHRkPicrYyhlLmlsbGlxdWlkKSsnPC90ZD48L3RyPic7IH0pLmpvaW4oJycpOwogICAgZXhwU2VjPSc8ZGl2IGNsYXNzPSJzZWMiPjxoMj7Xl9ep15nXpNeV16og16DXm9eh15nXnTwvaDI+PHRhYmxlIGNsYXNzPSJydCI+PHRoZWFkPjx0cj48dGggY2xhc3M9ImwiPten15XXpNeUPC90aD48dGg+157XoNeZ15XXqjwvdGg+PHRoPteX15XXtNecPC90aD48dGg+157XmNe015c8L3RoPjx0aD7XnNeQINeh15fXmdeoPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PicrZXIrJzwvdGJvZHk+PC90YWJsZT48L2Rpdj4nOwogIH0KICB2YXIgbWV0U2VjPScnOwogIGlmKG8ubWV0cmljcyl7CiAgICB2YXIgbXI9c2VsLm1hcChmdW5jdGlvbihmKXsgdmFyIGQyPW1ldHJpY3NbZi5jb2RlXXx8e307CiAgICAgIHJldHVybiAnPHRyPjx0ZCBjbGFzcz0ibm0yIj4nK2VzYyhmLm5hbWUpKyc8L3RkPjx0ZD4nK3BkZk51bShkMi5zaGFycGUpKyc8L3RkPjx0ZD4nK3BkZk51bShkMi5zdGRfZGV2LCclJykrJzwvdGQ+PHRkPicrcGRmTnVtKGQyLmFscGhhKSsnPC90ZD48dGQ+JytwZGZOdW0oZDIubWdtdF9mZWUsJyUnKSsnPC90ZD48L3RyPic7IH0pLmpvaW4oJycpOwogICAgbWV0U2VjPSc8ZGl2IGNsYXNzPSJzZWMiPjxoMj7XnteT15PXmdedINeg15XXodek15nXnTwvaDI+PHRhYmxlIGNsYXNzPSJydCI+PHRoZWFkPjx0cj48dGggY2xhc3M9ImwiPten15XXpNeUPC90aD48dGg+16nXkNeo16Q8L3RoPjx0aD7XodeY15nXmdeqINeq16fXnzwvdGg+PHRoPteQ15zXpNeQPC90aD48dGg+15PXnteZINeg15nXlNeV15w8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JyttcisnPC90Ym9keT48L3RhYmxlPjwvZGl2Pic7CiAgfQogIHZhciBncmFwaFNlYz0oby5ncmFwaCYmY2hhcnRJbWcpPyc8ZGl2IGNsYXNzPSJzZWMiPjxoMj7Xkteo16Mg15HXmdem15XXoteZ150g15XXlNep15XXldeQ15Q8L2gyPjxpbWcgY2xhc3M9ImNoYXJ0IiBzcmM9IicrY2hhcnRJbWcrJyI+PC9kaXY+JzonJzsKICB2YXIgbm90ZUJveD1vLm5vdGU/JzxkaXYgY2xhc3M9Im5vdGUiPjxiPteU16LXqNeqINeU15nXldei16U6PC9iPiAnK2VzYyhvLm5vdGUpKyc8L2Rpdj4nOicnOwogIHZhciBjbGllbnRMaW5lPW8uY2xpZW50Pyc8ZGl2IGNsYXNzPSJjbGllbnQiPtei15HXldeoOiA8Yj4nK2VzYyhvLmNsaWVudCkrJzwvYj48L2Rpdj4nOicnOwogIHZhciBjc3M9J0BwYWdle3NpemU6QTQ7bWFyZ2luOjE0bW19Kntib3gtc2l6aW5nOmJvcmRlci1ib3h9Ym9keXtmb250LWZhbWlseTpTZWdvZSBVSSxBcmlhbCxzYW5zLXNlcmlmO2RpcmVjdGlvbjpydGw7Y29sb3I6IzFhMWYzMzttYXJnaW46MDtmb250LXNpemU6MTJweH0nKwogICAgJy5oZHtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6ZmxleC1zdGFydDtib3JkZXItYm90dG9tOjNweCBzb2xpZCAjM2Y1MWI1O3BhZGRpbmctYm90dG9tOjEwcHg7bWFyZ2luLWJvdHRvbToxNHB4fScrCiAgICAnLmJyYW5ke2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjgwMDtjb2xvcjojMWMxYTRkfS5icmFuZCBzcGFue2NvbG9yOiMzZjUxYjV9Lm1ldGF7dGV4dC1hbGlnbjpsZWZ0O2ZvbnQtc2l6ZToxMXB4O2NvbG9yOiM4YTkzYTh9JysKICAgICdoMXtmb250LXNpemU6MTlweDtjb2xvcjojMWMxYTRkO21hcmdpbjowIDAgNHB4fS5jbGllbnR7Y29sb3I6IzNmNTFiNTtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEzcHg7bWFyZ2luLWJvdHRvbTo4cHh9JysKICAgICcubm90ZXtiYWNrZ3JvdW5kOiNmN2Y4ZmQ7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCAjM2Y1MWI1O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTBweCAxMnB4O21hcmdpbjowIDAgMTZweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjZ9JysKICAgICcuc2Vje21hcmdpbi1ib3R0b206MThweDtwYWdlLWJyZWFrLWluc2lkZTphdm9pZH1oMntmb250LXNpemU6MTRweDtjb2xvcjojMWMxYTRkO2JvcmRlci1yaWdodDo0cHggc29saWQgI2UwMjE4YTtwYWRkaW5nLXJpZ2h0OjhweDttYXJnaW46MCAwIDhweH0nKwogICAgJ3RhYmxlLnJ0e3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfXRhYmxlLnJ0IHRoe2JhY2tncm91bmQ6IzFjMWE0ZDtjb2xvcjojZmZmO3BhZGRpbmc6OHB4IDZweDtmb250LXNpemU6MTFweDt0ZXh0LWFsaWduOmNlbnRlcn10YWJsZS5ydCB0aC5se3RleHQtYWxpZ246cmlnaHR9JysKICAgICd0YWJsZS5ydCB0ZHtwYWRkaW5nOjhweCA2cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U2ZThmMjt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTJweH10YWJsZS5ydCB0ZC5ubSx0YWJsZS5ydCB0ZC5ubTJ7dGV4dC1hbGlnbjpyaWdodDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzFjMWE0ZH0nKwogICAgJ3RkLm5tIGltZ3t3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2JvcmRlci1yYWRpdXM6NTAlO29iamVjdC1maXQ6Y29udGFpbjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLWxlZnQ6NnB4fXRkLm5tIC5kb3R7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6OHB4O2hlaWdodDo4cHg7Ym9yZGVyLXJhZGl1czo1MCU7bWFyZ2luLWxlZnQ6NXB4fXRkLm5tIC5ubXR7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlfXRkLm5tIHNtYWxse2NvbG9yOiM4YTkzYTg7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxMHB4fScrCiAgICAnLmNoYXJ0e3dpZHRoOjEwMCU7Ym9yZGVyOjFweCBzb2xpZCAjZTZlOGYyO2JvcmRlci1yYWRpdXM6OHB4fScrCiAgICAnLmRpc2N7bWFyZ2luLXRvcDoyMHB4O3BhZGRpbmctdG9wOjEwcHg7Ym9yZGVyLXRvcDoxcHggc29saWQgI2U2ZThmMjtmb250LXNpemU6OS41cHg7Y29sb3I6IzhhOTNhODtsaW5lLWhlaWdodDoxLjZ9JzsKICByZXR1cm4gJzwhZG9jdHlwZSBodG1sPjxodG1sIGRpcj0icnRsIiBsYW5nPSJoZSI+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiPjx0aXRsZT4nK2VzYyhvLnRpdGxlKSsnPC90aXRsZT48c3R5bGU+Jytjc3MrJzwvc3R5bGU+PC9oZWFkPjxib2R5PicrCiAgICAnPGRpdiBjbGFzcz0iaGQiPjxkaXY+PGRpdiBjbGFzcz0iYnJhbmQiPteS157XnDxzcGFuPteY15XXpDwvc3Bhbj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJtZXRhIj7Xk9eV15cg15TXqdeV15XXkNeUIMK3ICcrZGF0ZVN0cisnPGJyPmdlbWVsdG9wLmNvLmlsPC9kaXY+PC9kaXY+JysKICAgICc8aDE+Jytlc2Moby50aXRsZSkrJzwvaDE+JytjbGllbnRMaW5lK25vdGVCb3grCiAgICAnPGRpdiBjbGFzcz0ic2VjIj48aDI+15TXqdeV15XXkNeqINeq16nXldeQ15XXqiAo157XpteY15HXqCk8L2gyPjx0YWJsZSBjbGFzcz0icnQiPjx0aGVhZD48dHI+PHRoIGNsYXNzPSJsIj7XqdedINen15XXpNeUPC90aD48dGg+MTIg15fXldeT16nXmdedPC90aD48dGg+MyDXqdeg15nXnTwvdGg+PHRoPjUg16nXoNeZ1508L3RoPjx0aD4xMCDXqdeg15nXnTwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4nK3JldFJvd3MrJzwvdGJvZHk+PC90YWJsZT48L2Rpdj4nKwogICAgZ3JhcGhTZWMrZXhwU2VjK21ldFNlYysKICAgICc8ZGl2IGNsYXNzPSJkaXNjIj48Yj7XlNeR15TXqNeUINee16nXpNeY15nXqjo8L2I+INeT15XXlyDXlteUINee15XXpNenINec16bXldeo15og15TXqdeV15XXkNeUINeR15zXkdeTINeV15DXmdeg15Ug157XlNeV15XXlCDXmdeZ16LXldelINeU16nXp9ei15XXqiwg15nXmdei15XXpSDXpNeg16HXmdeV16DXmSDXkNeVINeU157XnNem15Qg15zXqNeb15nXqdeUL9ee15vXmdeo15QuINeq16nXldeQ15XXqiDXoteR16gg15DXmdeg158g157XkdeY15nXl9eV16og16rXqdeV15DXldeqINei16rXmdeTLiDXnNek16DXmSDXp9eR15zXqiDXlNeX15zXmNeUINeZ16kg15zXlNeZ15XXldei16Ug16LXnSDXkdei15wg16jXmdep15nXldefINee16rXkNeZ150uINeU16DXqteV16DXmdedINee15HXldeh16HXmdedINei15wg15PXmdeV15XXl9eZINeU15fXkdeo15XXqiDXlNee16DXlNec15XXqiDXk9eo15ogZGF0YS5nb3YuaWwg15XXnteQ15LXqCDXktee15zXoNeYLjwvZGl2PicrCiAgICAnPHNjcmlwdD53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LmZvY3VzKCk7d2luZG93LnByaW50KCk7fSw1MDApO30pOzxcL3NjcmlwdD4nKwogICAgJzwvYm9keT48L2h0bWw+JzsKfQpmdW5jdGlvbiBnZW5lcmF0ZVBERigpewogIHZhciB0PWVsKCdwZGYtdGl0bGUnKSwgdGl0bGU9KHQmJnQudmFsdWV8fCcnKS50cmltKCk7CiAgaWYoIXRpdGxlKXsgdG9hc3QoJ9eZ16kg15zXlNeW15nXnyDXm9eV16rXqNeqINec15PXldeXJyk7IGlmKHQpIHQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgdmFyIG89eyB0aXRsZTp0aXRsZSwgY2xpZW50OihlbCgncGRmLWNsaWVudCcpLnZhbHVlfHwnJykudHJpbSgpLCBub3RlOihlbCgncGRmLW5vdGUnKS52YWx1ZXx8JycpLnRyaW0oKSwKICAgIGdyYXBoOmVsKCdwZGYtZ3JhcGgnKS5jaGVja2VkLCBleHA6ZWwoJ3BkZi1leHAnKS5jaGVja2VkLCBtZXRyaWNzOmVsKCdwZGYtbWV0cmljcycpLmNoZWNrZWQgfTsKICB2YXIgY2hhcnRJbWc9KG8uZ3JhcGgmJmNoYXJ0KT9jaGFydC50b0Jhc2U2NEltYWdlKCdpbWFnZS9wbmcnLDEpOm51bGw7CiAgdmFyIHc9d2luZG93Lm9wZW4oJycsJ19ibGFuaycpOwogIGlmKCF3KXsgdG9hc3QoJ9eU15PXpNeT16TXnyDXl9eh150g15fXnNeV158g16fXldek16Ug4oCUINeQ16TXqdeoINeX15zXldeg15XXqiDXp9eV16TXpteZ150g15XXoNeh15Qg16nXldeRJyk7IHJldHVybjsgfQogIHcuZG9jdW1lbnQub3BlbigpOyB3LmRvY3VtZW50LndyaXRlKGJ1aWxkUmVwb3J0SFRNTChvLGNoYXJ0SW1nKSk7IHcuZG9jdW1lbnQuY2xvc2UoKTsKICBjbG9zZVBERigpOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgVUkgYmluZGluZ3Mg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIHRvYXN0KG1zZyl7CiAgdmFyIHQ9ZWwoJ2dmdC10b2FzdCcpOwogIGlmKCF0KXsgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgdC5pZD0nZ2Z0LXRvYXN0JzsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTsgfQogIHQudGV4dENvbnRlbnQ9bXNnOyB0LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsKICBjbGVhclRpbWVvdXQodC5fdCk7IHQuX3Q9c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO30sMjQwMCk7Cn0KCmZ1bmN0aW9uIGJpbmQoKXsKICAvLyBzZWFyY2ggaW5wdXQg4oCUIHJlc3VsdHMgYXBwZWFyIG9ubHkgb24gdHlwaW5nICg+PTIgY2hhcnMpIG9yIHZpYSB0aGUgc2VhcmNoIGJ1dHRvbgogIHZhciBzYj1lbCgnZ2Z0LXNlYXJjaCcpOwogIGlmKHNiKSBzYi5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCl7IHJlc3VsdHNGb3JjZWQ9ZmFsc2U7IHVwZGF0ZVJlc3VsdHMoKTsgfSk7CiAgaWYoc2IpIHNiLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24oKXsgdXBkYXRlUmVzdWx0cygpOyB9KTsKICBpZihzYikgc2IuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpeyBpZihlLmtleT09PSdFbnRlcicpeyBlLnByZXZlbnREZWZhdWx0KCk7IHJlc3VsdHNGb3JjZWQ9dHJ1ZTsgdXBkYXRlUmVzdWx0cygpOyB9IH0pOwogIHZhciBzZ289ZWwoJ2dmdC1zZWFyY2gtZ28nKTsKICBpZihzZ28pIHNnby5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsgaWYoc2IpIHNiLmZvY3VzKCk7IHJlc3VsdHNGb3JjZWQ9dHJ1ZTsgdXBkYXRlUmVzdWx0cygpOyB9KTsKICAvLyBkZWRpY2F0ZWQgIteX16TXqSIgYnV0dG9uIGluIHRoZSBmaWx0ZXIgcm93IOKGkiBvcGVuIHJlc3VsdHMgZm9yIHRoZSBhY3RpdmUgZmlsdGVycwogIHZhciBmc0J0bj1lbCgnZ2Z0LWZpbHRlci1zZWFyY2gnKTsKICBpZihmc0J0bikgZnNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHZhciBtPWVsKCdnZnQtZm1lbnUnKTsgaWYobSkgbS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2Z0LWZidG4nKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnJlbW92ZSgnYWN0LW9wZW4nKTt9KTsKICAgIGlmKCFhbnlGaWx0ZXIoKSAmJiBub3JtKChzYnx8e30pLnZhbHVlfHwnJykubGVuZ3RoPDIpeyB0b2FzdCgn16HXntefINee16HXoNeg15nXnSDXkNeVINeU16fXnNeTINec15fXmdek15XXqScpOyBpZihzYikgc2IuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICByZXN1bHRzRm9yY2VkPXRydWU7IHVwZGF0ZVJlc3VsdHMoKTsKICAgIHZhciBkPWVsKCdnZnQtZHJvcCcpOyBpZihkKSBkLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjonc21vb3RoJyxibG9jazonbmVhcmVzdCd9KTsKICB9KTsKCiAgLy8gZHJvcGRvd24gYWRkIGJ1dHRvbnMgKGRlbGVnYXRlZCkKICB2YXIgZHJvcD1lbCgnZ2Z0LWRyb3AnKTsKICBpZihkcm9wKSBkcm9wLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBkcm9wZG93biBvcGVuOyBhdm9pZCBvdXRzaWRlLWNsaWNrIGNsb3NpbmcgaXQKICAgIHZhciBpdD1lLnRhcmdldC5jbG9zZXN0KCcuZ2Z0LWRyb3AtaXRlbScpOyBpZighaXQpIHJldHVybjsKICAgIGlmKGl0LmRhdGFzZXQucGlja2VkPT09JzEnKXsgdG9hc3QoJ9eU16fXldek15Qg15vXkdeoINeg15HXl9eo15QnKTsgcmV0dXJuOyB9CiAgICBhZGRGdW5kKGl0LmRhdGFzZXQuY29kZSk7CiAgfSk7CgogIC8vIGZpbHRlciBidXR0b25zCiAgWydwcm9kdWN0JywnY29tcGFueScsJ3NwZWMnXS5mb3JFYWNoKGZ1bmN0aW9uKGspewogICAgdmFyIGJ0bj1lbCgnZ2Z0LWZidG4tJytrKTsKICAgIGlmKGJ0bikgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdmFyIG1lbnU9ZWwoJ2dmdC1mbWVudScpOwogICAgICB2YXIga2luZD1rPT09J3NwZWMnPydzcGVjJzprOwogICAgICB2YXIgYWxyZWFkeSA9IG1lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJykgJiYgbWVudS5kYXRhc2V0LmtpbmQ9PT1rOwogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2Z0LWZidG4nKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnJlbW92ZSgnYWN0LW9wZW4nKTt9KTsKICAgICAgaWYoYWxyZWFkeSl7IG1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOyByZXR1cm47IH0KICAgICAgbWVudS5kYXRhc2V0LmtpbmQ9azsKICAgICAgbWVudS5pbm5lckhUTUw9YnVpbGRGaWx0ZXJNZW51KGtpbmQ9PT0nc3BlYyc/J3NwZWMnOmtpbmQpOwogICAgICB2YXIgcmVjdD1idG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGhvc3Q9ZWwoJ2dmdC1hcHAnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbWVudS5zdHlsZS50b3A9KGJ0bi5vZmZzZXRUb3ArYnRuLm9mZnNldEhlaWdodCs2KSsncHgnOwogICAgICBtZW51LnN0eWxlLnJpZ2h0PShidG4ub2Zmc2V0UGFyZW50Lm9mZnNldFdpZHRoIC0gYnRuLm9mZnNldExlZnQgLSBidG4ub2Zmc2V0V2lkdGgpKydweCc7CiAgICAgIG1lbnUuY2xhc3NMaXN0LmFkZCgnb3BlbicpOwogICAgICBidG4uY2xhc3NMaXN0LmFkZCgnYWN0LW9wZW4nKTsKICAgIH0pOwogIH0pOwoKICAvLyBmaWx0ZXIgbWVudSBpdGVtIGNsaWNrIOKAlCBtdWx0aS1zZWxlY3Q6IHRvZ2dsZSwga2VlcCBtZW51IG9wZW4sIHJlZnJlc2ggY2hpcHMgKGRvIE5PVCBhdXRvLW9wZW4gcmVzdWx0cykKICB2YXIgbWVudT1lbCgnZ2Z0LWZtZW51Jyk7CiAgaWYobWVudSkgbWVudS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CiAgICAvLyAic2hvdyBOIGZ1bmRzIiBidXR0b24g4oaSIGNsb3NlIG1lbnUsIG9wZW4gcmVzdWx0cyBpbiB0aGUgc2VhcmNoIGJhcgogICAgdmFyIGFwPWUudGFyZ2V0LmNsb3Nlc3QoJy5nZnQtZm1lbnUtYXBwbHknKTsKICAgIGlmKGFwKXsgaWYoYXAuZGlzYWJsZWQpIHJldHVybjsgbWVudS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nZnQtZmJ0bicpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5jbGFzc0xpc3QucmVtb3ZlKCdhY3Qtb3BlbicpO30pOyByZXN1bHRzRm9yY2VkPSEhYW55RmlsdGVyKCk7IHVwZGF0ZVJlc3VsdHMoKTsgdmFyIGQ9ZWwoJ2dmdC1kcm9wJyk7IGlmKGQpIGQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOiduZWFyZXN0J30pOyByZXR1cm47IH0KICAgIHZhciBpdD1lLnRhcmdldC5jbG9zZXN0KCcuZ2Z0LWZtZW51LWl0ZW0nKTsgaWYoIWl0KSByZXR1cm47CiAgICB2YXIga2luZD1pdC5kYXRhc2V0LmtpbmQsIHY9aXQuZGF0YXNldC52OwogICAgdG9nZ2xlRmlsdGVyKGtpbmQsdik7CiAgICBtZW51LmlubmVySFRNTD1idWlsZEZpbHRlck1lbnUoa2luZCk7ICAgICAgIC8vIHJlLXJlbmRlciBjaGVja2JveGVzICsgbGl2ZSBjb3VudAogICAgcmVmcmVzaEZpbHRlckNoaXBzKCk7CiAgICBpZihlbCgnZ2Z0LWRyb3AnKS5jbGFzc0xpc3QuY29udGFpbnMoJ29wZW4nKSl7IHJlc3VsdHNGb3JjZWQ9ISFhbnlGaWx0ZXIoKTsgdXBkYXRlUmVzdWx0cygpOyB9IC8vIGxpdmUtdXBkYXRlIG9ubHkgaWYgYWxyZWFkeSBzaG93aW5nCiAgfSk7CgogIC8vIGNsb3NlIG1lbnVzL2Ryb3Agb24gb3V0c2lkZSBjbGljawogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgIGlmKCFlLnRhcmdldC5jbG9zZXN0KCcuZ2Z0LXNlYXJjaGJhcicpICYmICFlLnRhcmdldC5jbG9zZXN0KCcjZ2Z0LWRyb3AnKSl7CiAgICAgIGNsb3NlUmVzdWx0cygpOwogICAgfQogICAgaWYoIWUudGFyZ2V0LmNsb3Nlc3QoJyNnZnQtZm1lbnUnKSAmJiAhZS50YXJnZXQuY2xvc2VzdCgnLmdmdC1mYnRuJykpewogICAgICB2YXIgbT1lbCgnZ2Z0LWZtZW51Jyk7IGlmKG0pIG0uY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2Z0LWZidG4nKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnJlbW92ZSgnYWN0LW9wZW4nKTt9KTsKICAgIH0KICB9KTsKCiAgLy8gdGFibGUgdGFicwogIHZhciB0dD1lbCgnZ2Z0LXRhYnMnKTsKICBpZih0dCkgdHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgdmFyIGI9ZS50YXJnZXQuY2xvc2VzdCgnLmdmdC10YWInKTsgaWYoIWIpIHJldHVybjsKICAgIHRhYj1iLmRhdGFzZXQudGFiOwogICAgdHQucXVlcnlTZWxlY3RvckFsbCgnLmdmdC10YWInKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnRvZ2dsZSgnb24nLHg9PT1iKTt9KTsKICAgIHJlbmRlclRhYmxlKCk7CiAgfSk7CgogIC8vIHRhYmxlIHJvdyBhY3Rpb25zIChkZWxlZ2F0ZWQpCiAgdmFyIGhvc3Q9ZWwoJ2dmdC10YWJsZS1ob3N0Jyk7CiAgaWYoaG9zdCkgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CiAgICB2YXIgcm09ZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtcm1dJyk7IGlmKHJtKXsgcmVtb3ZlRnVuZChybS5kYXRhc2V0LnJtKTsgcmV0dXJuOyB9CiAgICB2YXIgZXQ9ZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtZXRhYl0nKTsgaWYoZXQpeyBleHBhbmRUYWI9ZXQuZGF0YXNldC5ldGFiOyByZW5kZXJUYWJsZSgpOyByZXR1cm47IH0KICAgIHZhciBleHRiPWUudGFyZ2V0LmNsb3Nlc3QoJy5nZnQtZXh0LWInKTsgaWYoZXh0Yil7IGV4dE1vZGU9ZXh0Yi5kYXRhc2V0Lm07IHJlbmRlclRhYmxlKCk7IHJldHVybjsgfQogICAgdmFyIHRjYT1lLnRhcmdldC5jbG9zZXN0KCcuZ2Z0LXRjLWFkZCcpOyBpZih0Y2EpeyBhZGRGdW5kKHRjYS5kYXRhc2V0LmNvZGUpOyByZXR1cm47IH0KICAgIHZhciByb3c9ZS50YXJnZXQuY2xvc2VzdCgnLmdmdC1yb3cnKTsgaWYocm93KXsgdmFyIGNvZGU9cm93LmdldEF0dHJpYnV0ZSgnZGF0YS1jb2RlJyk7IGV4cGFuZGVkQ29kZSA9IGV4cGFuZGVkQ29kZT09PWNvZGU/bnVsbDpjb2RlOyBleHBhbmRUYWI9J2V4cG9zdXJlJzsgcmVuZGVyVGFibGUoKTsgcmV0dXJuOyB9CiAgfSk7CgogIC8vIGdyYXBoIHJhbmdlCiAgdmFyIGdyPWVsKCdnZnQtZ3JhbmdlJyk7CiAgaWYoZ3IpIGdyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgIHZhciBiPWUudGFyZ2V0LmNsb3Nlc3QoJy5nZnQtZ3InKTsgaWYoIWIpIHJldHVybjsKICAgIGdyYXBoUmFuZ2U9cGFyc2VJbnQoYi5kYXRhc2V0Lm0sMTApOwogICAgZ3IucXVlcnlTZWxlY3RvckFsbCgnLmdmdC1ncicpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5jbGFzc0xpc3QudG9nZ2xlKCdvbicseD09PWIpO30pOwogICAgdmFyIHJoPWVsKCdnZnQtY2FsYy1yZXN1bHRzJyk7IGlmKHJoKSByaC5pbm5lckhUTUw9Jyc7IC8vIGNhbGMgcmVzdWx0cyBkZXBlbmQgb24gcmFuZ2UKICAgIGVuc3VyZUluZGljZXMoZHJhd0dyYXBoKTsKICB9KTsKCiAgLy8gY2hhcnQgdHlwZSB0b2dnbGUgKGxpbmUgLyBiYXJzKQogIHZhciBjdD1lbCgnZ2Z0LWN0eXBlJyk7CiAgaWYoY3QpIGN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgIHZhciBiPWUudGFyZ2V0LmNsb3Nlc3QoJy5nZnQtY3QnKTsgaWYoIWIpIHJldHVybjsKICAgIGNoYXJ0VHlwZT1iLmRhdGFzZXQudDsKICAgIGN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nZnQtY3QnKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnRvZ2dsZSgnb24nLHg9PT1iKTt9KTsKICAgIHZhciB0PWVsKCdnZnQtZ3JhcGgtdGl0bGUnKTsgaWYodCkgdC50ZXh0Q29udGVudCA9IGNoYXJ0VHlwZT09PSdiYXJzJyA/ICfXqtep15XXkNeUINeX15XXk9ep15nXqiDXnteV15wg15TXntee15XXpteiINeU16LXoNek15knIDogJ9eS16jXoyDXkdeZ16bXldei15nXnSDXldeU16nXldeV15DXlCc7CiAgICB2YXIgaWJhcj1lbCgnZ2Z0LWlkeC1iYXInKTsgaWYoaWJhcikgaWJhci5zdHlsZS5kaXNwbGF5ID0gY2hhcnRUeXBlPT09J2JhcnMnID8gJ25vbmUnIDogJyc7IC8vIGluZGljZXMgYXJlIGxpbmUtb25seQogICAgZHJhd0dyYXBoKCk7CiAgfSk7CgogIC8vIG1hcmtldC1pbmRleCBvdmVybGF5IHRvZ2dsZXMKICB2YXIgaWI9ZWwoJ2dmdC1pZHgtYmFyJyk7CiAgaWYoaWIpIGliLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgIHZhciBiPWUudGFyZ2V0LmNsb3Nlc3QoJy5nZnQtaWR4LWJ0bicpOyBpZighYikgcmV0dXJuOwogICAgdmFyIHN5bT1iLmRhdGFzZXQuc3ltOyBpbmRpY2VzW3N5bV09IWluZGljZXNbc3ltXTsKICAgIGIuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLGluZGljZXNbc3ltXSk7CiAgICBpZihpbmRpY2VzW3N5bV0pIGIuc3R5bGUuY3NzVGV4dD0nYmFja2dyb3VuZDonK0lEWF9NRVRBW3N5bV0uYysnO2JvcmRlci1jb2xvcjonK0lEWF9NRVRBW3N5bV0uYysnO2NvbG9yOiNmZmYnOyBlbHNlIGIuc3R5bGUuY3NzVGV4dD0nJzsKICAgIGVuc3VyZUluZGljZXMoZHJhd0dyYXBoKTsKICB9KTsKCiAgLy8gaW52ZXN0bWVudCBjYWxjdWxhdG9yCiAgdmFyIGNvPWVsKCdnZnQtY2FsYy1vcGVuJyk7IGlmKGNvKSBjby5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsb3BlbkNhbGMpOwogIHZhciBjYz1lbCgnZ2Z0LWNhbGMtY2xvc2UnKTsgaWYoY2MpIGNjLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxjbG9zZUNhbGMpOwogIHZhciBjYT1lbCgnZ2Z0LWNhbGMtYXBwbHknKTsgaWYoY2EpIGNhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxhcHBseUNhbGMpOwogIHZhciBjZT1lbCgnZ2Z0LWNhbGMtY2xlYXInKTsgaWYoY2UpIGNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxjbGVhckNhbGMpOwogIHZhciBvdj1lbCgnZ2Z0LWNhbGMtb3YnKTsgaWYob3YpIG92LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsgaWYoZS50YXJnZXQ9PT1vdikgY2xvc2VDYWxjKCk7IH0pOwogIHZhciBjYj1lbCgnZ2Z0LWNhbGMtYm9keScpOyBpZihjYikgY2IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbihlKXsKICAgIGlmKGUudGFyZ2V0LmlkPT09J2NhbGMtZmVlcycpeyBzeW5jQ2FsY0lucHV0cygpOyBjYWxjLndpdGhGZWVzPWUudGFyZ2V0LmNoZWNrZWQ7IHJlbmRlckNhbGNCb2R5KCk7IH0KICB9KTsKCiAgLy8gY29tcG91bmQtaW50ZXJlc3QgY2FsY3VsYXRvcgogIHZhciBjaW89ZWwoJ2dmdC1jaS1vcGVuJyk7IGlmKGNpbykgY2lvLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxvcGVuQ0kpOwogIHZhciBjaWM9ZWwoJ2dmdC1jaS1jbG9zZScpOyBpZihjaWMpIGNpYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsY2xvc2VDSSk7CiAgdmFyIGNpYT1lbCgnZ2Z0LWNpLWFwcGx5Jyk7IGlmKGNpYSkgY2lhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxhcHBseUNJKTsKICB2YXIgY2llPWVsKCdnZnQtY2ktY2xlYXInKTsgaWYoY2llKSBjaWUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGNsZWFyQ0kpOwogIHZhciBjaW92PWVsKCdnZnQtY2ktb3YnKTsgaWYoY2lvdikgY2lvdi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7IGlmKGUudGFyZ2V0PT09Y2lvdikgY2xvc2VDSSgpOyB9KTsKICB2YXIgY2lib2R5PWVsKCdnZnQtY2ktYm9keScpOyBpZihjaWJvZHkpewogICAgY2lib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgdmFyIHBiPWUudGFyZ2V0LmNsb3Nlc3QoJy5nZnQtY2ktYicpOyBpZihwYil7IHN5bmNDSSgpOyBjaS5iYXNpcz1wYi5kYXRhc2V0LmI7IHJlbmRlckNJQm9keSgpOyB9CiAgICB9KTsKICAgIGNpYm9keS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGZ1bmN0aW9uKGUpewogICAgICBpZihlLnRhcmdldC5pZD09PSdjaS1mZWVzJyl7IHN5bmNDSSgpOyBjaS53aXRoRmVlcz1lLnRhcmdldC5jaGVja2VkOyByZW5kZXJDSUJvZHkoKTsgfQogICAgfSk7CiAgfQoKICAvLyBQREYgLyBjbGllbnQgcmVwb3J0IGV4cG9ydAogIHZhciBwbz1lbCgnZ2Z0LXBkZi1vcGVuJyk7IGlmKHBvKSBwby5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsb3BlblBERik7CiAgdmFyIHBjPWVsKCdnZnQtcGRmLWNsb3NlJyk7IGlmKHBjKSBwYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsY2xvc2VQREYpOwogIHZhciBwY3g9ZWwoJ2dmdC1wZGYtY2FuY2VsJyk7IGlmKHBjeCkgcGN4LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxjbG9zZVBERik7CiAgdmFyIHBnPWVsKCdnZnQtcGRmLWdlbicpOyBpZihwZykgcGcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGdlbmVyYXRlUERGKTsKICB2YXIgcGxrPWVsKCdnZnQtcGRmLWxpbmsnKTsgaWYocGxrKSBwbGsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGNvcHlTaGFyZUxpbmspOwogIHZhciBwb3Y9ZWwoJ2dmdC1wZGYtb3YnKTsgaWYocG92KSBwb3YuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpeyBpZihlLnRhcmdldD09PXBvdikgY2xvc2VQREYoKTsgfSk7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBJbml0IOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwpmdW5jdGlvbiBpbml0KCl7CiAgLy8gaGVybyBzdGF0cwogIHZhciBjb3VudHM9e307IEZVTkRTLmZvckVhY2goZnVuY3Rpb24oZil7Y291bnRzW2YudHlwZV09KGNvdW50c1tmLnR5cGVdfHwwKSsxO30pOwogIGlmKGVsKCdnZnQtdG90YWwtaGVybycpKSBlbCgnZ2Z0LXRvdGFsLWhlcm8nKS50ZXh0Q29udGVudD1GVU5EUy5sZW5ndGgudG9Mb2NhbGVTdHJpbmcoJ2hlJyk7CiAgYmluZCgpOwogIHJlZnJlc2hGaWx0ZXJDaGlwcygpOwogIC8vIGxhdGVzdCBwZXJpb2QsIHRoZW4gcmVzdG9yZSBhbnkgZnVuZHMgZnJvbSB0aGUgVVJMICg/ZnVuZHM94oCmKQogIGZldGNoKEFQSSsnL3lpZWxkcy9vcHRpb25zJykudGhlbihmdW5jdGlvbihyKXtyZXR1cm4gci5qc29uKCk7fSkudGhlbihmdW5jdGlvbihqKXsKICAgIGlmKGomJmoucGVyaW9kcyYmai5wZXJpb2RzLmxlbmd0aCkgTEFURVNUX1BFUklPRD1wYXJzZUludChqLnBlcmlvZHNbMF0udmFsdWUsMTApOwogIH0pLmNhdGNoKGZ1bmN0aW9uKCl7fSkudGhlbihmdW5jdGlvbigpeyBsb2FkRnJvbVVSTCgpOyBpZihzZWwubGVuZ3RoKSBsb2FkQW5kUmVuZGVyKCk7IH0pOwogIGlmKCFGVU5EUy5sZW5ndGgpewogICAgdmFyIGQ9ZWwoJ2dmdC1kcm9wJyk7IGlmKGQpe2QuY2xhc3NMaXN0LmFkZCgnb3BlbicpOyBkLmlubmVySFRNTD0nPGRpdiBjbGFzcz0iZ2Z0LWRyb3AtZW1wdHkiPtec15Ag16DXntem15DXlSDXoNeq15XXoNeZINen15XXpNeV16ouINeQ16DXkCDXqNei16DXnyDXkNeqINeU15PXoy48L2Rpdj4nO30KICB9Cn0KaWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSdsb2FkaW5nJykgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsaW5pdCk7IGVsc2UgaW5pdCgpOwoKfSkoKTsK
