Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
PD9waHANCg0KREVGSU5FKCJyb290IiwgImh0dHA6Ly8iIC4gaHRtbHNwZWNpYWxjaGFycygkX1NFUlZFUlsiSFRUUF..
Decoded Output download
<? PD9waHANCg0KREVGSU5FKCJyb290IiwgImh0dHA6Ly8iIC4gaHRtbHNwZWNpYWxjaGFycygkX1NFUlZFUlsiSFRUUF9IT1NUIl0pIC4gIi9ldi1jaGFyZ2luZy1kaXNwbGF5LVY0LyIpOw0KLy9HRVQgRkxPT1IgREFUQSAmIERFRklORSBPTiBKQVZBU0NSSVBUIFZBUklBQkxFDQokaWQgPSAnJzsNCg0KaWYgKGlzc2V0KCRfR0VUWydpZCddKSkgew0KICAgICRpZCA9ICRfR0VUWydpZCddOw0KfQ0KDQplY2hvICc8c2NyaXB0PiB2YXIgaWQgPSAiJyAuICRpZCAuICciOzwvc2NyaXB0Pic7DQo/Pg0KDQo8IURPQ1RZUEUgaHRtbD4NCjxodG1sIGxhbmc9ImVuIj4NCg0KPGhlYWQ+DQogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+DQogICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIiAvPg0KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPg0KICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iLi9pbWFnZXMvbG9nby1jcC5wbmciIC8+DQogICAgPHRpdGxlPkV2IENoYXJnaW5nPC90aXRsZT4NCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4vcHVibGljL2Nzcy9wb3RyYWl0LXYyLmNzcyIgLz4NCjwvaGVhZD4NCg0KPGJvZHk+DQogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIiBpZD0ic2xpZGUiPg0KICAgICAgICA8IS0tIENoYXJnaW5nIFBhZ2UgLS0+DQogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciIgaWQ9ImNoYXJnaW5ncGFnZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyI+DQogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdXN0b20tYnRuIGJ0bi03Ij48c3BhbiBpZD0ic3RhdHVzX2J0biI+PC9zcGFuPjwvYnV0dG9uPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hhcmdpbmctYmxvY2siIGlkPSJjaGFyZ2luZ2Jsb2NrIj4NCiAgICAgICAgICAgICAgICA8aW1nIHNyYz0iLi9pbWFnZXMvY2FyLWV2ZS5wbmciIGFsdD0idGhpcyBzbG93cG9rZSBtb3ZlcyIgd2lkdGg9IjE1MHB4IiBoZWlnaHQ9IjEyMHB4IiBpZD0iaW1nLXRvcCIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgLz4NCiAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBibG9jazsiPjwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVzY3JpcHRpb24tbGluZSI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGltZS1saW5lIiBpZD0idGltZS1saW5lIiBzdHlsZT0iZGlzcGxheTogYmxvY2s7Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hhcmdlLWZvbnQgZGVzYy1mb250IiBzdHlsZT0ibWFyZ2luLXRvcDogNXB4OyIgaWQ9InRpbWUiPjAwOjAwOjAwPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW5lcmd5LWxpbmUiIGlkPSJlbmVyZ3ktbGluZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoYXJnZS1mb250IGRlc2MtZm9udCIgaWQ9Imt3aCI+PC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icG93ZXItbGluZSIgaWQ9InBvd2VyLWxpbmUiIHN0eWxlPSJkaXNwbGF5OiBibG9jazsiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGFyZ2UtZm9udCBkZXNjLWZvbnQiIGlkPSJwb3dlciI+PC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgPCEtLSBGdWxsIENoYXJnaW5nIFBhZ2UgLS0+DQoNCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciIgaWQ9ImZ1bGxwYWdlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+DQogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdXN0b20tYnRuIGJ0bi03Ij48c3BhbiBzdHlsZT0ibWFyZ2luLXRvcDogMTVweDsiPkZpbmlzaCBDaGFyZ2luZy4uPC9zcGFuPjwvYnV0dG9uPg0KDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmdWxsLXNwYWNlIiBpZD0iIj4NCiAgICAgICAgICAgICAgICA8dGFibGU+DQogICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD0iZGF0YVRhYiI+DQoNCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4NCiAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8IS0tIEFEUyBDT05URU5UIC0tPg0KICAgICAgICA8IS0tIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KICAgICAgICAgICAgPHZpZGVvIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgbWFyZ2luLXRvcDowJTsgbWFyZ2luLWxlZnQ6LTQwJTsgaGVpZ2h0OjY1MDsgd2lkdGg6MTYwJTsiIGxvb3AgbXV0ZWQgYXV0b3BsYXk+DQogICAgICAgICAgICAgICAgPHNvdXJjZSBzcmM9InB1YmxpYy9CRUNBTEwubXA0IiB0eXBlPSJ2aWRlby9tcDQiPg0KICAgICAgICAgICAgPC92aWRlbz4NCiAgICAgICAgPC9kaXY+IC0tPg0KPC9ib2R5Pg0KPHNjcmlwdCBzcmM9Ii4vcHVibGljL3ZlbmRvci9qcXVlcnktMy42LjAvanF1ZXJ5LTMuNi4wLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEyNTYtL3hVaiszT0pVNXlFeGxxNkdTWUdTSGs3dFBYaWt5blM3b2dFdkRlai9tND0iIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0Pg0KPHNjcmlwdD4NCiAgICB2YXIgc3RhdHVzID0gJyc7DQogICAgdmFyIGVuZXJneSA9IDA7DQogICAgdmFyIHBvd2VyID0gMDsNCiAgICB2YXIgZGF0ZSA9ICcnOw0KICAgIHZhciB2b2x0ID0gMDsNCiAgICB2YXIgYXJ1cyA9IDA7DQogICAgdmFyIGlkX2V2ID0gMDsNCiAgICB2YXIgbG9vcGluZ0lkID0gMDsNCiAgICB2YXIgaW5zZXJ0X3N0YXR1cyA9ICcnOw0KICAgIHZhciBjb2RlID0gJyc7DQogICAgdmFyIHZvdWNoZXIgPSAwOw0KICAgIHZhciB1c2FnZV9zdGF0dXMgPSAnJzsNCiAgICB2YXIgdXNhZ2VfZGF0ZSA9ICcnOw0KICAgIC8vIHZhciBldl9pZCA9ICcnOw0KDQogICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KCJ3czovLzExMC4wLjUwLjEzNTozMDAxL3dlYnNvY2tldCIpOw0KLy8gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KCJ3c3M6Ly9jcC13ZWJzb2NrZXQuc3Ryb29tZXIuY28uaWQ/Y3VzdG9tZXJpZD1TTTQxM2U0NmViMzc3OTE4JmRhc2hib2FyZD10cnVlIik7DQogICAgd3MuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsICgpID0+IHsNCiAgICAgICAgY29uc29sZS5sb2cod3MpOw0KICAgICAgICBjb25zb2xlLmxvZygiQ29ubmVjdGVkIHRvIFdlYnNvY2tldCIpOw0KICAgICAgICAvLyBzZW5kV2ViU29ja2V0TWVzc2FnZSh7IHR5cGU6ICdnZXRfZGF0YV9jaGFyZ2luZycsIGV2X2lkOiBpZCB9KTsNCiAgICB9KTsNCg0KICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCAoZSkgPT4gew0KICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShlLmRhdGEpOw0KICAgICAgICAvLyBjb25zb2xlLmxvZyhOdW1iZXIoZGF0YS5zaWduYWwpKTsNCg0KICAgICAgICB2YXIgdG90YWxDdXJyZW50ID0gZGF0YS5jdXJyZW50ICsgZGF0YS5jdXJyZW50MiArIGRhdGEuY3VycmVudDM7DQogICAgICAgIHZhciByb3VuZGVkQ3VycmVudCA9IHRvdGFsQ3VycmVudC50b0ZpeGVkKDIpOw0KICAgICAgICB2YXIgdm9sdGFnZSA9IE51bWJlcihkYXRhLnZvbHRhZ2UpOw0KICAgICAgICB2YXIgY3VycmVudCA9IE51bWJlcihkYXRhLmN1cnJlbnQpOw0KICAgICAgICAvLyB2YXIgdm9sdGFnZTIgPSBOdW1iZXIoZGF0YS52b2x0YWdlMik7DQogICAgICAgIC8vIHZhciB2b2x0YWdlMyA9IE51bWJlcihkYXRhLnZvbHRhZ2UzKTsNCiAgICAgICAgLy8gdmFyIHZvbHRhZ2UgPSBkYXRhLnZvbHRhZ2UgKyBkYXRhLnZvbHRhZ2UyICsgZGF0YS52b2x0YWdlMzsNCiAgICAgICAgdmFyIG51bWJlck9mVmFsdWVzID0gMzsNCiAgICAgICAgdmFyIGF2ZXJhZ2VWb2x0YWdlID0gaW50ZWdlclZhbHVlIC8gbnVtYmVyT2ZWYWx1ZXM7DQogICAgICAgIHZhciBpbnRlZ2VyVmFsdWUgPSBNYXRoLmZsb29yKHZvbHRhZ2UpIC8gMzsNCgl2YXIgY2hhcmdlZFRpbWUgPSBOdW1iZXIoZGF0YVsnY2hhcmdpbmctdGltZSddKTsNCgl2YXIgY2hhcmdlZEVuZXJneSA9IE51bWJlcihkYXRhWydjaGFyZ2VkLWVuZXJneSddKTsNCiAgICAgICAgdmFyIHJvdW5kZWRFbmVyZ3kgPSBNYXRoLmZsb29yKGNoYXJnZWRFbmVyZ3kpLzEwMDA7DQoJdmFyIGZpeGVkUm91bmRlZEVuZXJneSA9IHJvdW5kZWRFbmVyZ3kudG9GaXhlZCgxKTsNCiAgICAgICBjb25zb2xlLmxvZyhjdXJyZW50KTsNCi8vICAgICAgICBjb25zb2xlLmxvZyhpbnRlZ2VyVmFsdWUpOw0KCS8vIGNvbnNvbGUubG9nKGNoYXJnZWRFbmVyZ3kpOw0KICAgIC8vICAgICBjb25zb2xlLmxvZyhyb3VuZGVkRW5lcmd5LnRvRml4ZWQoMSkpOw0KICAgICAgICAvLyBjb25zb2xlLmxvZyhEYXRlVGltZSgiSDppOnMiLCBjaGFyZ2VkVGltZSkpOw0KLy8JY29uc29sZS5sb2coInN0YXR1cyIpOw0KLy8JY29uc29sZS5sb2coZGF0YVsnY2hhcmdlZC1lbmVyZ3knXSk7DQoJY29uc29sZS5sb2coZGF0YVsnY2hhcmdlci1zdGF0dXMnXSk7DQovLwljb25zb2xlLmxvZyhkYXRhLnZvbHRhZ2UpOw0KDQogICAgICAgIA0KdmFyIHJvdW5kZWRFbmVyZ3lTdHJpbmcgPSBkYXRhLmVuZXJneTsNCnZhciByb3VuZGVkRW5lcmd5TnVtYmVyID0gcGFyc2VGbG9hdChyb3VuZGVkRW5lcmd5U3RyaW5nKTsNCi8vIGNvbnNvbGUubG9nKHJvdW5kZWRFbmVyZ3lOdW1iZXIpOyAvLyBPdXRwdXQ6IDQuOTkNCg0KICAgICAgICBsZXQgdXBkYXRlRXZnYXRlQ2FsbGVkID0gZmFsc2U7IC8vDQoNCiAgICAgICAgaWYgKGRhdGFbJ2NoYXJnZXItc3RhdHVzJ10gPT09ICdDaGFyZ2luZycpIHsNCiAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKGBDaGFyZ2luZyAke2RhdGEudm9sdGFnZX0gVm9sdC4uYCk7DQogICAgICAgICQoJyNrd2gnKS5odG1sKGAke2ZpeGVkUm91bmRlZEVuZXJneX0ga1doYCk7DQogICAgICAgICQoJyNwb3dlcicpLmh0bWwoYCR7ZGF0YS5jdXJyZW50fSBBYCk7DQogICAgICAgIC8vICQoJyN0aW1lJykuaHRtbChgJHtjaGFyZ2VkVGltZX1gKTsNCiAgICAgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2hlYWRlci1ydW4nKQ0KICAgICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9jYXItZXZlLnBuZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTcwcHgiIGhlaWdodD0iMTcwcHgiIHN0eWxlPSJtYXJnaW4tdG9wOi0zNXB4OyBtYXJnaW4tbGVmdDotMjBweDsiLz5gKTsNCiAgICAgICAgc3RhcnRTdG9wd2F0Y2goKTsNCgkgICAgdXBkYXRlRXZnYXRlQ2FsbGVkID0gZmFsc2U7DQogICAgICAgIH0gZWxzZSBpZiAoZGF0YVsnY2hhcmdlci1zdGF0dXMnXSA9PT0gJ1ByZXBhcmluZycgJiYgdXBkYXRlRXZnYXRlQ2FsbGVkID09PSBmYWxzZSkgew0KICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoJ0NoYXJnaW5nIFJlYWR5Li4uJyk7DQogICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKTsNCgkgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCdoZWFkZXItcnVuJykuYWRkQ2xhc3MoJy5oZWFkZXInKQ0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVsbHBhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IA0KCSAgICAvLyB1cGRhdGVFdmdhdGVDYWxsZWQgPSB0cnVlOw0KICAgICAgICBpZiAodXBkYXRlRXZnYXRlQ2FsbGVkID09PSBmYWxzZSkgeyAvLyBwYWRhIHNhYXQga29uZGlzaSBjaGFyZ2luZyBrZSBzdGFuZGJ5IGFrYW4gdXBkYXRlIGRhbiBpbnNlcnQgZGF0YSBjaGFyZ2luZyANCiAgICAgICAgLy8gaW5zZXJ0RGVsdGEoKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bGxwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyZ2luZ3BhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAvLyBnZXRfZGF0YV9sb2djaGFyZ2luZygpOw0KICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoYEZpbmlzaCBDaGFyZ2luZy4uLmApOw0KICAgICAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJ2hlYWRlci1ydW4nKS5hZGRDbGFzcygnLmhlYWRlcicpDQogICAgLy8gICAgbG9vcGluZ0lkKys7DQoJICAgIHVwZGF0ZUV2Z2F0ZUNhbGxlZCA9IHRydWU7DQogICAgICAgICAgIGNvbnNvbGUubG9nKCJUaW1lb3V0Iik7DQogICAgICAgIC8vICAgIGlmIChsb29waW5nSWQgPiAyKSB7DQogICAgICAgIC8vICAgICAgICBsb29waW5nSWQgPSAwOw0KICAgICAgICAvLyAgICBjb25zb2xlLmxvZygiVGltZW91dCIpOw0KICAgICAgICAgICAgLy8gICAgdXBkYXRlRXZnYXRlQ2FsbGVkID0gZmFsc2U7DQogICAgICAgIC8vICAgIH0NCgkgICAgLy8gdXBkYXRlRXZnYXRlQ2FsbGVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRhdGFbJ2NoYXJnZXItc3RhdHVzJ10gPT09ICdQcmVwYXJpbmcnICYmIHVwZGF0ZUV2Z2F0ZUNhbGxlZCA9PT0gdHJ1ZSkgew0KICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoJ0NoYXJnaW5nIFJlYWR5Li4uJyk7DQogICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKTsNCgkgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCcuaGVhZGVyLXJ1bicpLmFkZENsYXNzKCcuaGVhZGVyJykNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bGxwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJnaW5ncGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICAvLyAgICAgICAgbG9vcGluZ0lkKys7DQogICAgICAgIC8vICAgIGNvbnNvbGUubG9nKCJUaW1lb3V0Iik7DQogICAgICAgIC8vICAgIGlmIChsb29waW5nSWQgPiAxKSB7DQogICAgICAgIC8vICAgICAgICBsb29waW5nSWQgPSAwOw0KICAgICAgICAvLyAgICAgICAgdXBkYXRlRXZnYXRlQ2FsbGVkID0gZmFsc2U7DQogICAgICAgIC8vICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChkYXRhWydjaGFyZ2VyLXN0YXR1cyddID09PSAnRmluaXNoaW5nJykgew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVsbHBhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJnaW5ncGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIGdldF9kYXRhX2xvZ2NoYXJnaW5nKCk7DQogICAgICAgICQoJyNzdGF0dXNfYnRuJykuaHRtbChgRmluaXNoIENoYXJnaW5nLi4uYCk7DQogICAgICAgICQoJy5oZWFkZXInKS5yZW1vdmVDbGFzcygnaGVhZGVyLXJ1bicpLmFkZENsYXNzKCcuaGVhZGVyJykNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKCdTdGFuZEJ5Li4uJyk7DQogICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKQ0KCSAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJy5oZWFkZXItcnVuJykuYWRkQ2xhc3MoJ2hlYWRlcicpDQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxscGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyZ2luZ3BhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCiAgICAvLyAgICAgLy8gc3RhdHVzID0gZGF0YS5zdGF0dXM7DQogICAgLy8gICAgIC8vIGVuZXJneSA9IGRhdGEuZW5lcmd5Ow0KICAgIC8vICAgICAvLyBhcnVzID0gZGF0YS5jdXJyZW50Ow0KICAgIC8vICAgICAvLyBwb3dlciA9IGRhdGEucG93ZXI7DQogICAgLy8gICAgIC8vIHZvbHQgPSBkYXRhLnZvbHRhZ2U7IA0KICAgIC8vIGhhbmRsZVdlYlNvY2tldE1lc3NhZ2UoZGF0YSk7DQoNCiAgICAvLyBpZiAoc3RhdHVzID09ICdzdGFuZGJ5Jykgew0KICAgIC8vICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoJ0NoYXJnaW5nIFJlYWR5Li4uJyk7DQogICAgLy8gICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgIC8vICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKTsNCiAgICAvLyAgICAgJCgnI2xvYWRpbmcnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpLmFkZENsYXNzKCdsb2FkaW5nLW9mZicpOw0KICAgIC8vICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9jYXItZXZlLnBuZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTcwcHgiIGhlaWdodD0iMTcwcHgiIHN0eWxlPSJtYXJnaW4tdG9wOi0zNXB4OyBtYXJnaW4tbGVmdDotMjBweDsiIC8+YCk7DQogICAgLy8gICAgIGVsYXBzZWRUaW1lID0gMDsNCiAgICAvLyAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsNCiAgICAvLyAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7DQogICAgLy8gICAgIGRpc3BsYXlUaW1lKDAsIDAsIDAsIDApOw0KICAgIC8vIH0gZWxzZSBpZiAoc3RhdHVzID09ICdjaGFyZ2luZycpew0KICAgIC8vICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoYENoYXJnaW5nICR7ZGF0YS52b2x0YWdlfSBWb2x0Li5gKTsNCiAgICAvLyAgICAgJCgnI2t3aCcpLmh0bWwoZGF0YS5lbmVyZ3krYCBrV2hgKTsNCiAgICAvLyAgICAgLy8gJCgnI3Bvd2VyJykuaHRtbChkYXRhLnRvdGFsQ3VycmVudCtgIEFgKTsNCiAgICAvLyAgICAgJCgnI3Bvd2VyJykuaHRtbChgJHt0b3RhbEN1cnJlbnR9IEFgKTsNCiAgICAvLyAgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2hlYWRlci1ydW4nKQ0KICAgIC8vICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9jYXItZXZlLnBuZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTcwcHgiIGhlaWdodD0iMTcwcHgiIHN0eWxlPSJtYXJnaW4tdG9wOi0zNXB4OyBtYXJnaW4tbGVmdDotMjBweDsiLz5gKTsNCiAgICAvLyAgICAgc3RhcnRTdG9wd2F0Y2goKTsNCiAgICAvLyB9DQogICAgfSk7DQogICAgDQogICAgZnVuY3Rpb24gaW5zZXJ0RGVsdGEoKSB7DQogICAgLy8gVXNpbmcgalF1ZXJ5IEFKQVggdG8gbWFrZSBhIFBPU1QgcmVxdWVzdCB0byBzZWxlY3R0b2luc2VydC5waHANCiAgICAgICAgdmFyIHRpbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZScpLmlubmVySFRNTDsNCiAgICAkLmFqYXgoew0KICAgICAgICB0eXBlOiAiUE9TVCIsDQogICAgICAgIHVybDogImFwaS9zZWxlY3R0b2luc2VydC5waHAiLCAvLyBSZXBsYWNlIHdpdGggdGhlIGFjdHVhbCBwYXRoDQogICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICAvLyBldl9pZDogaWQsDQogICAgICAgICAgICAgICAgLy8ga3doOiBrd2gsDQogICAgICAgICAgICAgICAgdGltZTogdGltZQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGlmIG5lZWRlZA0KICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpOw0KICAgICAgICB9LA0KICAgICAgICBlcnJvcjogZnVuY3Rpb24oZXJyb3IpIHsNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZXJyb3IgaWYgdGhlIEFKQVggcmVxdWVzdCBmYWlscw0KICAgICAgICAgICAgY29uc29sZS5lcnJvcigiQUpBWCByZXF1ZXN0IGZhaWxlZDoiLCBlcnJvcik7DQogICAgICAgIH0NCiAgICB9KTsNCn0NCg0KZnVuY3Rpb24gdXBkYXRlRXZnYXRlKHZvbHRhZ2UsIGN1cnJlbnQpIHsNCiAgICAvLyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugdm9sdGFnZSBhbmQgcm91bmQgdG8gdGhlIG5lYXJlc3Qgd2hvbGUgbnVtYmVyDQogICAgdmFyIHJvdW5kZWRBdmVyYWdlVm9sdGFnZSA9IE1hdGgucm91bmQoKHZvbHRhZ2UgKyB2b2x0YWdlMiArIHZvbHRhZ2UzKSAvIDMpOw0KICAgIHZhciByb3VuZGVkQ3VycmVudCA9IE1hdGgucm91bmQoY3VycmVudCArIGN1cnJlbnQyICsgY3VycmVudDMpOw0KICAgIC8vIHZhciB0aW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWUnKS5pbm5lckhUTUw7DQogICAgJC5hamF4KHsNCiAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICB1cmw6ICJhcGkvaW5zZXJ0LWRlbHRhLnBocCIsIC8vIFJlcGxhY2Ugd2l0aCB0aGUgYWN0dWFsIHBhdGgNCiAgICAgICAgZGF0YTogew0KICAgICAgICAgICAgc2lnbmFsOiBzaWduYWwsDQogICAgICAgICAgICB2b2x0YWdlOiB2b2x0YWdlLA0KICAgICAgICAgICAgdm9sdGFnZTI6IHZvbHRhZ2UyLA0KICAgICAgICAgICAgdm9sdGFnZTM6IHZvbHRhZ2UzLA0KICAgICAgICAgICAgY3VycmVudDogY3VycmVudCwNCiAgICAgICAgICAgIGN1cnJlbnQyOiBjdXJyZW50MiwNCiAgICAgICAgICAgIGN1cnJlbnQzOiBjdXJyZW50MywNCiAgICAgICAgICAgIHBvd2VyOiBwb3dlciwNCiAgICAgICAgICAgIGVuZXJneTogZW5lcmd5DQogICAgICAgICAgICAvLyB0aW1lOiB0aW1lDQogICAgICAgIH0sDQogICAgICAgIGFzeW5jOiB0cnVlLA0KICAgICAgICBkYXRhVHlwZTogIkpTT04iLA0KICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJTaWduYWwgdXBkYXRlZCBzdWNjZXNzZnVsbHkiKTsNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcmVzcG9uc2UgaWYgbmVlZGVkDQogICAgICAgIH0sDQogICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHsNCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIHVwZGF0aW5nIHNpZ25hbCIsIGVycm9yKTsNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZXJyb3IgaWYgbmVlZGVkDQogICAgICAgIH0NCiAgICB9KTsNCn0NCg0KDQogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7DQogICAgICAgIGdldF9kYXRhX2NoYXJnaW5nKCk7DQogICAgfSkNCg0KICAgIHZhciBzdGFydFRpbWUgPSAwOw0KICAgIHZhciBlbGFwc2VkVGltZSA9IDA7DQogICAgdmFyIHRpbWVvdXRJZCA9IG51bGw7DQogICAgdmFyIHBvd2VyX2NvdW50ZG93biA9IDA7DQoNCiAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpOw0KICAgIG15VGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgICAgICAgY2xlYXJJbnRlcnZhbChteVRpbWVyKQ0KICAgICAgICBlbGFwc2VkVGltZSArPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lOw0KICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsNCiAgICB9LCAxMDAwKTsNCg0KICAgIC8vIGZ1bmN0aW9uIGdldF9kYXRhX2NoYXJnaW5nKCkgew0KICAgIC8vICAgICB2YXIgZXZfaWQgPSBpZDsNCiAgICAvLyAgICAgJC5hamF4KHsNCiAgICAvLyAgICAgICAgIHR5cGU6ICdQT1NUJywNCiAgICAvLyAgICAgICAgIHVybDogIjw/PSByb290ID8+YXBpL2RhdGEtcG90cmFpdC5waHAiLA0KICAgIC8vICAgICAgICAgYXN5bmM6IHRydWUsDQogICAgLy8gICAgICAgICBkYXRhVHlwZTogJ0pTT04nLA0KICAgIC8vICAgICAgICAgZGF0YTogew0KICAgIC8vICAgICAgICAgICAgIGV2X2lkOiBldl9pZCwNCiAgICAvLyAgICAgICAgIH0sDQogICAgLy8gICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyKSB7DQogICAgLy8gICAgICAgICAgICAgLy9zdWNjZXNzKHIpOw0KICAgIC8vICAgICAgICAgICAgIHZhciBkYXRhID0gci5ldl9zdGF0dXM7DQogICAgLy8gICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5zdGF0dXM7DQogICAgLy8gICAgICAgICAgICAgdm9sdCA9IGRhdGEudm9sdGFzZTsNCiAgICAvLyAgICAgICAgICAgICBlbmVyZ3kgPSBkYXRhLmVuZXJneTsNCiAgICAvLyAgICAgICAgICAgICBwb3dlciA9IGRhdGEucG93ZXI7DQogICAgLy8gICAgICAgICAgICAgYXJ1cyA9IGRhdGEuYXJ1czsNCiAgICAvLyAgICAgICAgICAgICBpZF9ldiA9IGRhdGEuZXZfaWQ7DQogICAgLy8gICAgICAgICAgICAgaW5zZXJ0cyA9IGRhdGEuaW5zZXJ0czsNCiAgICAvLyAgICAgICAgICAgICB2b3VjaGVyID0gZGF0YS52b3VjaGVyOw0KICAgIC8vICAgICAgICAgICAgIHVzYWdlX3N0YXR1cyA9IGRhdGEudXNhZ2Vfc3RhdHVzOw0KICAgIC8vICAgICAgICAgICAgIHVzYWdlX2RhdGUgPSBkYXRhLnVzYWdlX2RhdGU7DQogICAgLy8gICAgICAgICAgICAgY29kZSA9IGRhdGEuc3RhdHVzX2NvZGU7DQoNCg0KICAgIC8vICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ09OJyAmJiBhcnVzIDw9IDAuMikgew0KICAgIC8vICAgICAgICAgICAgICAgICAvL09OIEJVVCBOTyBJTlBVVCBBUlVTDQogICAgLy8gICAgICAgICAgICAgICAgIGlmIChpbnNlcnRzID09IDAgJiYgY29kZSA9PSAwKSB7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBsb29waW5nSWQrKzsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJUaW1lb3V0Iik7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAobG9vcGluZ0lkID4gNjApIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBsb29waW5nSWQgPSAwOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKCdDaGFyZ2luZyBSZWFkeS4uLicpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI2t3aCcpLmh0bWwoYDAuMDAga1doYCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxscGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVEYXRhKCk7DQoNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS0xJykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTEnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnLmJhci1iYXR0ZXJ5LTInKS5yZW1vdmVDbGFzcygnY2hhcmdlMicpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMycpLnJlbW92ZUNsYXNzKCdjaGFyZ2UzJykNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS00JykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTQnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnLmRlc2MtZm9udCcpLnJlbW92ZUNsYXNzKCdmdWxsLWZvbnQnKS5hZGRDbGFzcygnY2hhcmdlLWZvbnQnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI2xvYWRpbmcnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpLmFkZENsYXNzKCdsb2FkaW5nLW9mZicpOw0KDQoNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICQoJyNjaGFyZ2luZ2Jsb2NrJykuaHRtbChgPGltZyBzcmM9Ii4vaW1hZ2VzL2Nhci1ldmUucG5nIiBhbHQ9InRoaXMgc2xvd3Bva2UgbW92ZXMiIHdpZHRoPSIxNzBweCIgaGVpZ2h0PSIxNzBweCIgc3R5bGU9Im1hcmdpbi10b3A6LTM1cHg7IG1hcmdpbi1sZWZ0Oi0yMHB4OyIgLz5gKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lID0gMDsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUaW1lKDAsIDAsIDAsIDApOw0KICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc2VydHMgPT0gMSAmJiBjb2RlID09IDAgJiYgYXJ1cyA8PSAwLjIpIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmdJZCsrOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkxvYWRpbmcgdG8gRmluaXNoIik7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAobG9vcGluZ0lkID4gNSkgew0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmdJZCA9IDA7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RGF0YSgpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZURhdGEyKCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICB9DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoYENoYXJnaW5nICR7dm9sdH0gVm9sdC4uYCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcja3doJykuaHRtbChgJHtlbmVyZ3l9IGtXaGApOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI3Bvd2VyJykuaHRtbChgJHthcnVzfSBBYCkNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxscGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVEYXRhKCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMScpLnJlbW92ZUNsYXNzKCdjaGFyZ2UxLTInKS5hZGRDbGFzcygnY2hhcmdlMScpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMicpLnJlbW92ZUNsYXNzKCdjaGFyZ2UyLTInKS5hZGRDbGFzcygnY2hhcmdlMicpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMycpLnJlbW92ZUNsYXNzKCdjaGFyZ2UzLTInKS5hZGRDbGFzcygnY2hhcmdlMycpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktNCcpLnJlbW92ZUNsYXNzKCdjaGFyZ2U0LTInKS5hZGRDbGFzcygnY2hhcmdlNCcpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuZGVzYy1mb250JykucmVtb3ZlQ2xhc3MoJ2Z1bGwtZm9udCcpLmFkZENsYXNzKCdjaGFyZ2UtZm9udCcpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjbG9hZGluZycpLnJlbW92ZUNsYXNzKCdsb2FkaW5nLW9mZicpLmFkZENsYXNzKCdsb2FkaW5nJyk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9jYXItZXZlLnBuZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTcwcHgiIGhlaWdodD0iMTcwcHgiIHN0eWxlPSJtYXJnaW4tdG9wOi0zNXB4OyBtYXJnaW4tbGVmdDotMjBweDsiLz5gKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U3RvcHdhdGNoKCk7DQogICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zZXJ0cyA9PSAxICYmIGNvZGUgPT0gMSkgew0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgbG9vcGluZ0lkKys7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiRmluaXNoIik7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAobG9vcGluZ0lkID4gNjApIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBsb29waW5nSWQgPSAwOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKGBGaW5pc2ggQ2hhcmdpbmcuLi5gKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGdldF9kYXRhX2xvZ2NoYXJnaW5nKCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVEYXRhMigpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bGxwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICQoJy5oZWFkZXInKS5yZW1vdmVDbGFzcygnaGVhZGVyLXJ1bicpLmFkZENsYXNzKCcuaGVhZGVyJykNCg0KDQogICAgLy8gICAgICAgICAgICAgICAgIH0NCiAgICAvLyAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnT04nICYmIGFydXMgPj0gMC4yKSB7IC8vT04gQU5EIEFSVVMgMQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoYENoYXJnaW5nICR7dm9sdH0gVm9sdC4uYCk7DQogICAgLy8gICAgICAgICAgICAgICAgICQoJyNrd2gnKS5odG1sKGAke2VuZXJneX0ga1doYCk7DQogICAgLy8gICAgICAgICAgICAgICAgICQoJyNwb3dlcicpLmh0bWwoYCR7YXJ1c30gQWApDQogICAgLy8gICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxscGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgLy8gICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyZ2luZ3BhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCg0KICAgIC8vICAgICAgICAgICAgICAgICB1cGRhdGVEYXRhKCk7DQogICAgLy8gICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS0xJykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTEtMicpLmFkZENsYXNzKCdjaGFyZ2UxJykNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnLmJhci1iYXR0ZXJ5LTInKS5yZW1vdmVDbGFzcygnY2hhcmdlMi0yJykuYWRkQ2xhc3MoJ2NoYXJnZTInKQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMycpLnJlbW92ZUNsYXNzKCdjaGFyZ2UzLTInKS5hZGRDbGFzcygnY2hhcmdlMycpDQogICAgLy8gICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS00JykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTQtMicpLmFkZENsYXNzKCdjaGFyZ2U0JykNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnLmRlc2MtZm9udCcpLnJlbW92ZUNsYXNzKCdmdWxsLWZvbnQnKS5hZGRDbGFzcygnY2hhcmdlLWZvbnQnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJy5oZWFkZXInKS5hZGRDbGFzcygnaGVhZGVyLXJ1bicpDQoNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnI2NoYXJnaW5nYmxvY2snKS5odG1sKGA8aW1nIHNyYz0iLi9pbWFnZXMvY2FyLWV2ZS5wbmciIGFsdD0idGhpcyBzbG93cG9rZSBtb3ZlcyIgd2lkdGg9IjE3MHB4IiBoZWlnaHQ9IjE3MHB4IiBzdHlsZT0ibWFyZ2luLXRvcDotMzVweDsgbWFyZ2luLWxlZnQ6LTIwcHg7Ii8+YCk7DQogICAgLy8gICAgICAgICAgICAgICAgIHN0YXJ0U3RvcHdhdGNoKCk7DQogICAgLy8gICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKCdTdGFuZEJ5Li4uJyk7DQogICAgLy8gICAgICAgICAgICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKQ0KICAgIC8vICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVsbHBhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgIC8vICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgLy8gICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDApIHsgLy9Lb25kaXNpIElkbGUgYXBhYmlsYSBzdHVjayBjb2RlIDEgYWthbiB1cGRhdGUgbWVuamFkaSAwDQogICAgLy8gICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXMoKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMScpLnJlbW92ZUNsYXNzKCdjaGFyZ2UxJykNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnLmJhci1iYXR0ZXJ5LTInKS5yZW1vdmVDbGFzcygnY2hhcmdlMicpDQogICAgLy8gICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS0zJykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTMnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktNCcpLnJlbW92ZUNsYXNzKCdjaGFyZ2U0JykNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnLmRlc2MtZm9udCcpLnJlbW92ZUNsYXNzKCdmdWxsLWZvbnQnKS5hZGRDbGFzcygnY2hhcmdlLWZvbnQnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcjbG9hZGluZycpLnJlbW92ZUNsYXNzKCdsb2FkaW5nJykuYWRkQ2xhc3MoJ2xvYWRpbmctb2ZmJyk7DQoNCiAgICAvLyAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKTsNCg0KICAgIC8vICAgICAgICAgICAgICAgICBpZiAodXNhZ2Vfc3RhdHVzID09ICdCZWx1bSBUZXJwYWthaScpIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmdJZCsrOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkJhcmNvZGUiKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChsb29waW5nSWQgPiA2MCkgew0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmdJZCA9IDA7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVm91Y2hlcigpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI2NoYXJnaW5nYmxvY2snKS5odG1sKGA8ZGl2IGNsYXNzPSJjaGFyZ2UtZm9udCBkZXNjLWZvbnQiIHN0eWxlPSJtYXJnaW4tbGVmdDogLThweDsgbWFyZ2luLXRvcDogMzBweDsgZm9udC1zaXplOiAzMHB4Ij4gWW91IENvZGUgaXMgPGJyPiAke3ZvdWNoZXJ9PC9kaXY+YCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKDApOw0KICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygwKQ0KDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9RUkVYUE8uanBlZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTMzcHgiIGhlaWdodD0iMTMzcHgiIC8+YCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygxKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZSA9IDA7DQogICAgLy8gICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7DQogICAgLy8gICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOw0KICAgIC8vICAgICAgICAgICAgICAgICBkaXNwbGF5VGltZSgwLCAwLCAwLCAwKTsNCiAgICAvLyAgICAgICAgICAgICB9DQogICAgLy8gICAgICAgICB9LA0KICAgIC8vICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgew0KICAgIC8vICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgLy8gICAgICAgICAgICAgICAgIGdldF9kYXRhX2NoYXJnaW5nKCk7DQogICAgLy8gICAgICAgICAgICAgfSwgMTAwMCk7DQogICAgLy8gICAgICAgICB9LA0KDQogICAgLy8gICAgIH0pDQoNCiAgICAvLyAgICAgLy8gcmV0dXJuIHJlc3VsdA0KICAgIC8vIH0NCg0KICAgIGZ1bmN0aW9uIGdldF9kYXRhX2xvZ2NoYXJnaW5nKCkgew0KICAgICAgICAvL3ZhciBldl9pZCA9IGlkOw0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvaW5pdGlhbGl6ZS1wb3RyYWl0LnBocCIsDQogICAgICAgICAgICBkYXRhOiB7DQogICAgICAgICAgICAgICAgaWQ6IGlkDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgZGF0YVR5cGU6ICJqc29uIiwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHIpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJbMF07DQogICAgICAgICAgICAgICAgZW5lcmd5ID0gZGF0YS5lbmVyZ3k7DQogICAgICAgICAgICAgICAgdGltZSA9IGRhdGEudGltZW5vdzsNCiAgICAgICAgICAgICAgICBkYXRlID0gZGF0YS50YW5nZ2FsOw0KICAgICAgICAgICAgICAgIHZhciBzcGxpdGRhdGUgPSBkYXRlLnNwbGl0KCcgJyk7DQogICAgICAgICAgICAgICAgdmFyIGRhdGVzcGxpdCA9IHNwbGl0ZGF0ZVswXTsNCiAgICAgICAgICAgICAgICB2YXIgdGltZXNwbGl0ID0gc3BsaXRkYXRlWzFdOw0KICAgICAgICAgICAgICAgIHZhciBodG1sID0gJyc7DQoNCiAgICAgICAgICAgICAgICBodG1sICs9IGA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWdlbmQtc2FsZG8iPkR1cmF0aW9uPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlZ2VuZC1zYWxkbyI+OjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWdlbmQtc2FsZG8iPiR7dGltZX08L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlZ2VuZC1zYWxkbyI+RW5lcmd5PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlZ2VuZC1zYWxkbyI+OjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWdlbmQtc2FsZG8iPiR7ZW5lcmd5fTwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVnZW5kLXNhbGRvIj5EYXRlPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlZ2VuZC1zYWxkbyI+OjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWdlbmQtc2FsZG8iPiR7ZGF0ZXNwbGl0fTwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPmA7DQoNCiAgICAgICAgICAgICAgICAkKCcjZGF0YVRhYicpLmh0bWwoaHRtbCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIGdldF9kYXRhX2xvZ2NoYXJnaW5nKCk7DQogICAgICAgICAgICAgICAgfSwgMTAwMCk7DQogICAgICAgICAgICB9LA0KICAgICAgICB9KQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHN0YXJ0U3RvcHdhdGNoKCkgew0KICAgICAgICAvL3J1biBzZXRUaW1lb3V0KCkgYW5kIHNhdmUgaWQNCiAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIC8vY2FsY3VsYXRlIGVsYXBzZWQgdGltZQ0KICAgICAgICAgICAgY29uc3QgdGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWUgKyBlbGFwc2VkVGltZTsNCg0KICAgICAgICAgICAgLy9jYWxjdWxhdGUgZGlmZmVyZW50IHRpbWUgbWVhc3VyZW1lbnRzIGJhc2VkIG9uIGVsYXBzZWQgdGltZQ0KICAgICAgICAgICAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlSW50KCh0aW1lIC8gMTAwMCkgJSA2MCkNCiAgICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUludCgodGltZSAvICgxMDAwICogNjApKSAlIDYwKQ0KICAgICAgICAgICAgY29uc3QgaG91ciA9IHBhcnNlSW50KCh0aW1lIC8gKDEwMDAgKiA2MCAqIDYwKSkgJSAyNCk7DQoNCiAgICAgICAgICAgIC8vZGlzcGxheSB0aW1lDQogICAgICAgICAgICBkaXNwbGF5VGltZShob3VyLCBtaW51dGVzLCBzZWNvbmRzKTsNCg0KICAgICAgICAgICAgLy9jYWxsaW5nIHNhbWUgbWV0aG9kIGFnYWluIHJlY3Vyc2l2YWx5DQogICAgICAgICAgICBzdGFydFN0b3B3YXRjaCgpOw0KICAgICAgICB9LCAxMDApOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRpc3BsYXlUaW1lKGhvdXIsIG1pbnV0ZXMsIHNlY29uZHMpIHsNCiAgICAgICAgdmFyIHN0b3B3YXRjaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1lJyk7DQogICAgICAgIGhvdXIgPSBob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cjsNCiAgICAgICAgbWludXRlcyA9IG1pbnV0ZXMgPCAxMCA/ICcwJyArIG1pbnV0ZXMgOiBtaW51dGVzOw0KICAgICAgICBzZWNvbmRzID0gc2Vjb25kcyA8IDEwID8gJzAnICsgc2Vjb25kcyA6IHNlY29uZHM7DQogICAgICAgIHN0b3B3YXRjaC5pbm5lckhUTUwgPSBob3VyICsgJzonICsgbWludXRlcyArICc6JyArIHNlY29uZHM7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaW5zZXJ0RGF0YSgpIHsNCiAgICAgICAgLy92YXIgbWFpbkJ1dHRvbiAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuX3N0YXJ0Jyk7DQogICAgICAgIHZhciBldl9pZCA9IGlkOw0KICAgICAgICB2YXIga3doID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2t3aCcpLmlubmVySFRNTDsNCiAgICAgICAgdmFyIHRpbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZScpLmlubmVySFRNTDsNCiAgICAgICAgLy92YXIgc3RhdHVzID0gMDsNCiAgICAgICAgJC5hamF4KHsNCiAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwNCiAgICAgICAgICAgIHVybDogIjw/PSByb290ID8+YXBpL2xvZ19pbnNlcnQtcG90cmFpdC5waHAiLA0KICAgICAgICAgICAgZGF0YTogew0KICAgICAgICAgICAgICAgIGV2X2lkOiBpZCwNCiAgICAgICAgICAgICAgICBrd2g6IGt3aCwNCiAgICAgICAgICAgICAgICB0aW1lOiB0aW1lDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgYXN5bmM6IHRydWUsDQogICAgICAgICAgICBkYXRhVHlwZTogIkpTT04iLA0KICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocikgew0KICAgICAgICAgICAgICAgICQoJyNtb2RlJykudGV4dCgnU3RhbmRieS4uLicpOw0KICAgICAgICAgICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgICAgICAgICAgICAgICQoJyNwb3dlcicpLmh0bWwoYDAgQWApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KQ0KDQogICAgfQ0KDQogICAgdmFyIHZpZXdGdWxsU2NyZWVuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNsaWRlIik7DQogICAgaWYgKHZpZXdGdWxsU2NyZWVuKSB7DQogICAgICAgIHZpZXdGdWxsU2NyZWVuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgZG9jRWxtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICAgICAgICAgICAgaWYgKGRvY0VsbS5yZXF1ZXN0RnVsbHNjcmVlbikgew0KICAgICAgICAgICAgICAgIGRvY0VsbS5yZXF1ZXN0RnVsbHNjcmVlbigpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChkb2NFbG0ubXNSZXF1ZXN0RnVsbHNjcmVlbikgew0KICAgICAgICAgICAgICAgIGRvY0VsbS5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGRvY0VsbS5tb3pSZXF1ZXN0RnVsbFNjcmVlbikgew0KICAgICAgICAgICAgICAgIGRvY0VsbS5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChkb2NFbG0ud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4pIHsNCiAgICAgICAgICAgICAgICBkb2NFbG0ud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvdXBkYXRlX2xvZy5waHAiLA0KICAgICAgICAgICAgZGF0YTogew0KICAgICAgICAgICAgICAgIGlkOiBpZA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGFzeW5jOiB0cnVlLA0KICAgICAgICAgICAgZGF0YVR5cGU6ICJKU09OIiwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHIpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlIEluc2VydCAxJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlRGF0YU8oKSB7DQogICAgICAgICQuYWpheCh7DQogICAgICAgICAgICB0eXBlOiAiUE9TVCIsDQogICAgICAgICAgICB1cmw6ICI8Pz0gcm9vdCA/PmFwaS91cGRhdGVfbG9nXzAucGhwIiwNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICBpZDogaWQNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBhc3luYzogdHJ1ZSwNCiAgICAgICAgICAgIGRhdGFUeXBlOiAiSlNPTiIsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZSBJbnNlcnQgMCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEyKCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvdXBkYXRlX3N0YXR1c2NvZGUucGhwIiwNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICBpZDogaWQNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBhc3luYzogdHJ1ZSwNCiAgICAgICAgICAgIGRhdGFUeXBlOiAiSlNPTiIsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyKSB7DQogICAgICAgICAgICAgICAgLy9pbnNlcnREYXRhKCk7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZSBTdGF0dXMgQ29kZSAxJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvdXBkYXRlX3N0YXR1cy5waHAiLA0KICAgICAgICAgICAgZGF0YTogew0KICAgICAgICAgICAgICAgIGlkOiBpZA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGFzeW5jOiB0cnVlLA0KICAgICAgICAgICAgZGF0YVR5cGU6ICJKU09OIiwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHIpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlIFN0YXR1cyBPRkYnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVWb3VjaGVyKCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvdXBkYXRlX3ZvdWNoZXIucGhwIiwNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICBpZDogaWQNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBhc3luYzogdHJ1ZSwNCiAgICAgICAgICAgIGRhdGFUeXBlOiAiSlNPTiIsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZSBWb3VjaGVyIFRlcnBha2FpJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgfQ0KPC9zY3JpcHQ+DQoNCjwvaHRtbD4NCg== ?>
Did this file decode correctly?
Original Code
PD9waHANCg0KREVGSU5FKCJyb290IiwgImh0dHA6Ly8iIC4gaHRtbHNwZWNpYWxjaGFycygkX1NFUlZFUlsiSFRUUF9IT1NUIl0pIC4gIi9ldi1jaGFyZ2luZy1kaXNwbGF5LVY0LyIpOw0KLy9HRVQgRkxPT1IgREFUQSAmIERFRklORSBPTiBKQVZBU0NSSVBUIFZBUklBQkxFDQokaWQgPSAnJzsNCg0KaWYgKGlzc2V0KCRfR0VUWydpZCddKSkgew0KICAgICRpZCA9ICRfR0VUWydpZCddOw0KfQ0KDQplY2hvICc8c2NyaXB0PiB2YXIgaWQgPSAiJyAuICRpZCAuICciOzwvc2NyaXB0Pic7DQo/Pg0KDQo8IURPQ1RZUEUgaHRtbD4NCjxodG1sIGxhbmc9ImVuIj4NCg0KPGhlYWQ+DQogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+DQogICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIiAvPg0KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPg0KICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iLi9pbWFnZXMvbG9nby1jcC5wbmciIC8+DQogICAgPHRpdGxlPkV2IENoYXJnaW5nPC90aXRsZT4NCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4vcHVibGljL2Nzcy9wb3RyYWl0LXYyLmNzcyIgLz4NCjwvaGVhZD4NCg0KPGJvZHk+DQogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIiBpZD0ic2xpZGUiPg0KICAgICAgICA8IS0tIENoYXJnaW5nIFBhZ2UgLS0+DQogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciIgaWQ9ImNoYXJnaW5ncGFnZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyI+DQogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdXN0b20tYnRuIGJ0bi03Ij48c3BhbiBpZD0ic3RhdHVzX2J0biI+PC9zcGFuPjwvYnV0dG9uPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hhcmdpbmctYmxvY2siIGlkPSJjaGFyZ2luZ2Jsb2NrIj4NCiAgICAgICAgICAgICAgICA8aW1nIHNyYz0iLi9pbWFnZXMvY2FyLWV2ZS5wbmciIGFsdD0idGhpcyBzbG93cG9rZSBtb3ZlcyIgd2lkdGg9IjE1MHB4IiBoZWlnaHQ9IjEyMHB4IiBpZD0iaW1nLXRvcCIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgLz4NCiAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBibG9jazsiPjwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVzY3JpcHRpb24tbGluZSI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGltZS1saW5lIiBpZD0idGltZS1saW5lIiBzdHlsZT0iZGlzcGxheTogYmxvY2s7Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hhcmdlLWZvbnQgZGVzYy1mb250IiBzdHlsZT0ibWFyZ2luLXRvcDogNXB4OyIgaWQ9InRpbWUiPjAwOjAwOjAwPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW5lcmd5LWxpbmUiIGlkPSJlbmVyZ3ktbGluZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoYXJnZS1mb250IGRlc2MtZm9udCIgaWQ9Imt3aCI+PC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icG93ZXItbGluZSIgaWQ9InBvd2VyLWxpbmUiIHN0eWxlPSJkaXNwbGF5OiBibG9jazsiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGFyZ2UtZm9udCBkZXNjLWZvbnQiIGlkPSJwb3dlciI+PC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgPCEtLSBGdWxsIENoYXJnaW5nIFBhZ2UgLS0+DQoNCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciIgaWQ9ImZ1bGxwYWdlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+DQogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdXN0b20tYnRuIGJ0bi03Ij48c3BhbiBzdHlsZT0ibWFyZ2luLXRvcDogMTVweDsiPkZpbmlzaCBDaGFyZ2luZy4uPC9zcGFuPjwvYnV0dG9uPg0KDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmdWxsLXNwYWNlIiBpZD0iIj4NCiAgICAgICAgICAgICAgICA8dGFibGU+DQogICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD0iZGF0YVRhYiI+DQoNCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4NCiAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8IS0tIEFEUyBDT05URU5UIC0tPg0KICAgICAgICA8IS0tIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KICAgICAgICAgICAgPHZpZGVvIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgbWFyZ2luLXRvcDowJTsgbWFyZ2luLWxlZnQ6LTQwJTsgaGVpZ2h0OjY1MDsgd2lkdGg6MTYwJTsiIGxvb3AgbXV0ZWQgYXV0b3BsYXk+DQogICAgICAgICAgICAgICAgPHNvdXJjZSBzcmM9InB1YmxpYy9CRUNBTEwubXA0IiB0eXBlPSJ2aWRlby9tcDQiPg0KICAgICAgICAgICAgPC92aWRlbz4NCiAgICAgICAgPC9kaXY+IC0tPg0KPC9ib2R5Pg0KPHNjcmlwdCBzcmM9Ii4vcHVibGljL3ZlbmRvci9qcXVlcnktMy42LjAvanF1ZXJ5LTMuNi4wLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEyNTYtL3hVaiszT0pVNXlFeGxxNkdTWUdTSGs3dFBYaWt5blM3b2dFdkRlai9tND0iIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0Pg0KPHNjcmlwdD4NCiAgICB2YXIgc3RhdHVzID0gJyc7DQogICAgdmFyIGVuZXJneSA9IDA7DQogICAgdmFyIHBvd2VyID0gMDsNCiAgICB2YXIgZGF0ZSA9ICcnOw0KICAgIHZhciB2b2x0ID0gMDsNCiAgICB2YXIgYXJ1cyA9IDA7DQogICAgdmFyIGlkX2V2ID0gMDsNCiAgICB2YXIgbG9vcGluZ0lkID0gMDsNCiAgICB2YXIgaW5zZXJ0X3N0YXR1cyA9ICcnOw0KICAgIHZhciBjb2RlID0gJyc7DQogICAgdmFyIHZvdWNoZXIgPSAwOw0KICAgIHZhciB1c2FnZV9zdGF0dXMgPSAnJzsNCiAgICB2YXIgdXNhZ2VfZGF0ZSA9ICcnOw0KICAgIC8vIHZhciBldl9pZCA9ICcnOw0KDQogICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KCJ3czovLzExMC4wLjUwLjEzNTozMDAxL3dlYnNvY2tldCIpOw0KLy8gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KCJ3c3M6Ly9jcC13ZWJzb2NrZXQuc3Ryb29tZXIuY28uaWQ/Y3VzdG9tZXJpZD1TTTQxM2U0NmViMzc3OTE4JmRhc2hib2FyZD10cnVlIik7DQogICAgd3MuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsICgpID0+IHsNCiAgICAgICAgY29uc29sZS5sb2cod3MpOw0KICAgICAgICBjb25zb2xlLmxvZygiQ29ubmVjdGVkIHRvIFdlYnNvY2tldCIpOw0KICAgICAgICAvLyBzZW5kV2ViU29ja2V0TWVzc2FnZSh7IHR5cGU6ICdnZXRfZGF0YV9jaGFyZ2luZycsIGV2X2lkOiBpZCB9KTsNCiAgICB9KTsNCg0KICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCAoZSkgPT4gew0KICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShlLmRhdGEpOw0KICAgICAgICAvLyBjb25zb2xlLmxvZyhOdW1iZXIoZGF0YS5zaWduYWwpKTsNCg0KICAgICAgICB2YXIgdG90YWxDdXJyZW50ID0gZGF0YS5jdXJyZW50ICsgZGF0YS5jdXJyZW50MiArIGRhdGEuY3VycmVudDM7DQogICAgICAgIHZhciByb3VuZGVkQ3VycmVudCA9IHRvdGFsQ3VycmVudC50b0ZpeGVkKDIpOw0KICAgICAgICB2YXIgdm9sdGFnZSA9IE51bWJlcihkYXRhLnZvbHRhZ2UpOw0KICAgICAgICB2YXIgY3VycmVudCA9IE51bWJlcihkYXRhLmN1cnJlbnQpOw0KICAgICAgICAvLyB2YXIgdm9sdGFnZTIgPSBOdW1iZXIoZGF0YS52b2x0YWdlMik7DQogICAgICAgIC8vIHZhciB2b2x0YWdlMyA9IE51bWJlcihkYXRhLnZvbHRhZ2UzKTsNCiAgICAgICAgLy8gdmFyIHZvbHRhZ2UgPSBkYXRhLnZvbHRhZ2UgKyBkYXRhLnZvbHRhZ2UyICsgZGF0YS52b2x0YWdlMzsNCiAgICAgICAgdmFyIG51bWJlck9mVmFsdWVzID0gMzsNCiAgICAgICAgdmFyIGF2ZXJhZ2VWb2x0YWdlID0gaW50ZWdlclZhbHVlIC8gbnVtYmVyT2ZWYWx1ZXM7DQogICAgICAgIHZhciBpbnRlZ2VyVmFsdWUgPSBNYXRoLmZsb29yKHZvbHRhZ2UpIC8gMzsNCgl2YXIgY2hhcmdlZFRpbWUgPSBOdW1iZXIoZGF0YVsnY2hhcmdpbmctdGltZSddKTsNCgl2YXIgY2hhcmdlZEVuZXJneSA9IE51bWJlcihkYXRhWydjaGFyZ2VkLWVuZXJneSddKTsNCiAgICAgICAgdmFyIHJvdW5kZWRFbmVyZ3kgPSBNYXRoLmZsb29yKGNoYXJnZWRFbmVyZ3kpLzEwMDA7DQoJdmFyIGZpeGVkUm91bmRlZEVuZXJneSA9IHJvdW5kZWRFbmVyZ3kudG9GaXhlZCgxKTsNCiAgICAgICBjb25zb2xlLmxvZyhjdXJyZW50KTsNCi8vICAgICAgICBjb25zb2xlLmxvZyhpbnRlZ2VyVmFsdWUpOw0KCS8vIGNvbnNvbGUubG9nKGNoYXJnZWRFbmVyZ3kpOw0KICAgIC8vICAgICBjb25zb2xlLmxvZyhyb3VuZGVkRW5lcmd5LnRvRml4ZWQoMSkpOw0KICAgICAgICAvLyBjb25zb2xlLmxvZyhEYXRlVGltZSgiSDppOnMiLCBjaGFyZ2VkVGltZSkpOw0KLy8JY29uc29sZS5sb2coInN0YXR1cyIpOw0KLy8JY29uc29sZS5sb2coZGF0YVsnY2hhcmdlZC1lbmVyZ3knXSk7DQoJY29uc29sZS5sb2coZGF0YVsnY2hhcmdlci1zdGF0dXMnXSk7DQovLwljb25zb2xlLmxvZyhkYXRhLnZvbHRhZ2UpOw0KDQogICAgICAgIA0KdmFyIHJvdW5kZWRFbmVyZ3lTdHJpbmcgPSBkYXRhLmVuZXJneTsNCnZhciByb3VuZGVkRW5lcmd5TnVtYmVyID0gcGFyc2VGbG9hdChyb3VuZGVkRW5lcmd5U3RyaW5nKTsNCi8vIGNvbnNvbGUubG9nKHJvdW5kZWRFbmVyZ3lOdW1iZXIpOyAvLyBPdXRwdXQ6IDQuOTkNCg0KICAgICAgICBsZXQgdXBkYXRlRXZnYXRlQ2FsbGVkID0gZmFsc2U7IC8vDQoNCiAgICAgICAgaWYgKGRhdGFbJ2NoYXJnZXItc3RhdHVzJ10gPT09ICdDaGFyZ2luZycpIHsNCiAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKGBDaGFyZ2luZyAke2RhdGEudm9sdGFnZX0gVm9sdC4uYCk7DQogICAgICAgICQoJyNrd2gnKS5odG1sKGAke2ZpeGVkUm91bmRlZEVuZXJneX0ga1doYCk7DQogICAgICAgICQoJyNwb3dlcicpLmh0bWwoYCR7ZGF0YS5jdXJyZW50fSBBYCk7DQogICAgICAgIC8vICQoJyN0aW1lJykuaHRtbChgJHtjaGFyZ2VkVGltZX1gKTsNCiAgICAgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2hlYWRlci1ydW4nKQ0KICAgICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9jYXItZXZlLnBuZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTcwcHgiIGhlaWdodD0iMTcwcHgiIHN0eWxlPSJtYXJnaW4tdG9wOi0zNXB4OyBtYXJnaW4tbGVmdDotMjBweDsiLz5gKTsNCiAgICAgICAgc3RhcnRTdG9wd2F0Y2goKTsNCgkgICAgdXBkYXRlRXZnYXRlQ2FsbGVkID0gZmFsc2U7DQogICAgICAgIH0gZWxzZSBpZiAoZGF0YVsnY2hhcmdlci1zdGF0dXMnXSA9PT0gJ1ByZXBhcmluZycgJiYgdXBkYXRlRXZnYXRlQ2FsbGVkID09PSBmYWxzZSkgew0KICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoJ0NoYXJnaW5nIFJlYWR5Li4uJyk7DQogICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKTsNCgkgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCdoZWFkZXItcnVuJykuYWRkQ2xhc3MoJy5oZWFkZXInKQ0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVsbHBhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IA0KCSAgICAvLyB1cGRhdGVFdmdhdGVDYWxsZWQgPSB0cnVlOw0KICAgICAgICBpZiAodXBkYXRlRXZnYXRlQ2FsbGVkID09PSBmYWxzZSkgeyAvLyBwYWRhIHNhYXQga29uZGlzaSBjaGFyZ2luZyBrZSBzdGFuZGJ5IGFrYW4gdXBkYXRlIGRhbiBpbnNlcnQgZGF0YSBjaGFyZ2luZyANCiAgICAgICAgLy8gaW5zZXJ0RGVsdGEoKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bGxwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyZ2luZ3BhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAvLyBnZXRfZGF0YV9sb2djaGFyZ2luZygpOw0KICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoYEZpbmlzaCBDaGFyZ2luZy4uLmApOw0KICAgICAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJ2hlYWRlci1ydW4nKS5hZGRDbGFzcygnLmhlYWRlcicpDQogICAgLy8gICAgbG9vcGluZ0lkKys7DQoJICAgIHVwZGF0ZUV2Z2F0ZUNhbGxlZCA9IHRydWU7DQogICAgICAgICAgIGNvbnNvbGUubG9nKCJUaW1lb3V0Iik7DQogICAgICAgIC8vICAgIGlmIChsb29waW5nSWQgPiAyKSB7DQogICAgICAgIC8vICAgICAgICBsb29waW5nSWQgPSAwOw0KICAgICAgICAvLyAgICBjb25zb2xlLmxvZygiVGltZW91dCIpOw0KICAgICAgICAgICAgLy8gICAgdXBkYXRlRXZnYXRlQ2FsbGVkID0gZmFsc2U7DQogICAgICAgIC8vICAgIH0NCgkgICAgLy8gdXBkYXRlRXZnYXRlQ2FsbGVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKGRhdGFbJ2NoYXJnZXItc3RhdHVzJ10gPT09ICdQcmVwYXJpbmcnICYmIHVwZGF0ZUV2Z2F0ZUNhbGxlZCA9PT0gdHJ1ZSkgew0KICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoJ0NoYXJnaW5nIFJlYWR5Li4uJyk7DQogICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKTsNCgkgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCcuaGVhZGVyLXJ1bicpLmFkZENsYXNzKCcuaGVhZGVyJykNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bGxwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJnaW5ncGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICAvLyAgICAgICAgbG9vcGluZ0lkKys7DQogICAgICAgIC8vICAgIGNvbnNvbGUubG9nKCJUaW1lb3V0Iik7DQogICAgICAgIC8vICAgIGlmIChsb29waW5nSWQgPiAxKSB7DQogICAgICAgIC8vICAgICAgICBsb29waW5nSWQgPSAwOw0KICAgICAgICAvLyAgICAgICAgdXBkYXRlRXZnYXRlQ2FsbGVkID0gZmFsc2U7DQogICAgICAgIC8vICAgIH0NCiAgICAgICAgfSBlbHNlIGlmIChkYXRhWydjaGFyZ2VyLXN0YXR1cyddID09PSAnRmluaXNoaW5nJykgew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVsbHBhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJnaW5ncGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIGdldF9kYXRhX2xvZ2NoYXJnaW5nKCk7DQogICAgICAgICQoJyNzdGF0dXNfYnRuJykuaHRtbChgRmluaXNoIENoYXJnaW5nLi4uYCk7DQogICAgICAgICQoJy5oZWFkZXInKS5yZW1vdmVDbGFzcygnaGVhZGVyLXJ1bicpLmFkZENsYXNzKCcuaGVhZGVyJykNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKCdTdGFuZEJ5Li4uJyk7DQogICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKQ0KCSAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJy5oZWFkZXItcnVuJykuYWRkQ2xhc3MoJ2hlYWRlcicpDQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxscGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyZ2luZ3BhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCiAgICAvLyAgICAgLy8gc3RhdHVzID0gZGF0YS5zdGF0dXM7DQogICAgLy8gICAgIC8vIGVuZXJneSA9IGRhdGEuZW5lcmd5Ow0KICAgIC8vICAgICAvLyBhcnVzID0gZGF0YS5jdXJyZW50Ow0KICAgIC8vICAgICAvLyBwb3dlciA9IGRhdGEucG93ZXI7DQogICAgLy8gICAgIC8vIHZvbHQgPSBkYXRhLnZvbHRhZ2U7IA0KICAgIC8vIGhhbmRsZVdlYlNvY2tldE1lc3NhZ2UoZGF0YSk7DQoNCiAgICAvLyBpZiAoc3RhdHVzID09ICdzdGFuZGJ5Jykgew0KICAgIC8vICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoJ0NoYXJnaW5nIFJlYWR5Li4uJyk7DQogICAgLy8gICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgIC8vICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKTsNCiAgICAvLyAgICAgJCgnI2xvYWRpbmcnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpLmFkZENsYXNzKCdsb2FkaW5nLW9mZicpOw0KICAgIC8vICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9jYXItZXZlLnBuZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTcwcHgiIGhlaWdodD0iMTcwcHgiIHN0eWxlPSJtYXJnaW4tdG9wOi0zNXB4OyBtYXJnaW4tbGVmdDotMjBweDsiIC8+YCk7DQogICAgLy8gICAgIGVsYXBzZWRUaW1lID0gMDsNCiAgICAvLyAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsNCiAgICAvLyAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7DQogICAgLy8gICAgIGRpc3BsYXlUaW1lKDAsIDAsIDAsIDApOw0KICAgIC8vIH0gZWxzZSBpZiAoc3RhdHVzID09ICdjaGFyZ2luZycpew0KICAgIC8vICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoYENoYXJnaW5nICR7ZGF0YS52b2x0YWdlfSBWb2x0Li5gKTsNCiAgICAvLyAgICAgJCgnI2t3aCcpLmh0bWwoZGF0YS5lbmVyZ3krYCBrV2hgKTsNCiAgICAvLyAgICAgLy8gJCgnI3Bvd2VyJykuaHRtbChkYXRhLnRvdGFsQ3VycmVudCtgIEFgKTsNCiAgICAvLyAgICAgJCgnI3Bvd2VyJykuaHRtbChgJHt0b3RhbEN1cnJlbnR9IEFgKTsNCiAgICAvLyAgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2hlYWRlci1ydW4nKQ0KICAgIC8vICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9jYXItZXZlLnBuZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTcwcHgiIGhlaWdodD0iMTcwcHgiIHN0eWxlPSJtYXJnaW4tdG9wOi0zNXB4OyBtYXJnaW4tbGVmdDotMjBweDsiLz5gKTsNCiAgICAvLyAgICAgc3RhcnRTdG9wd2F0Y2goKTsNCiAgICAvLyB9DQogICAgfSk7DQogICAgDQogICAgZnVuY3Rpb24gaW5zZXJ0RGVsdGEoKSB7DQogICAgLy8gVXNpbmcgalF1ZXJ5IEFKQVggdG8gbWFrZSBhIFBPU1QgcmVxdWVzdCB0byBzZWxlY3R0b2luc2VydC5waHANCiAgICAgICAgdmFyIHRpbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZScpLmlubmVySFRNTDsNCiAgICAkLmFqYXgoew0KICAgICAgICB0eXBlOiAiUE9TVCIsDQogICAgICAgIHVybDogImFwaS9zZWxlY3R0b2luc2VydC5waHAiLCAvLyBSZXBsYWNlIHdpdGggdGhlIGFjdHVhbCBwYXRoDQogICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICAvLyBldl9pZDogaWQsDQogICAgICAgICAgICAgICAgLy8ga3doOiBrd2gsDQogICAgICAgICAgICAgICAgdGltZTogdGltZQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGlmIG5lZWRlZA0KICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpOw0KICAgICAgICB9LA0KICAgICAgICBlcnJvcjogZnVuY3Rpb24oZXJyb3IpIHsNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZXJyb3IgaWYgdGhlIEFKQVggcmVxdWVzdCBmYWlscw0KICAgICAgICAgICAgY29uc29sZS5lcnJvcigiQUpBWCByZXF1ZXN0IGZhaWxlZDoiLCBlcnJvcik7DQogICAgICAgIH0NCiAgICB9KTsNCn0NCg0KZnVuY3Rpb24gdXBkYXRlRXZnYXRlKHZvbHRhZ2UsIGN1cnJlbnQpIHsNCiAgICAvLyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugdm9sdGFnZSBhbmQgcm91bmQgdG8gdGhlIG5lYXJlc3Qgd2hvbGUgbnVtYmVyDQogICAgdmFyIHJvdW5kZWRBdmVyYWdlVm9sdGFnZSA9IE1hdGgucm91bmQoKHZvbHRhZ2UgKyB2b2x0YWdlMiArIHZvbHRhZ2UzKSAvIDMpOw0KICAgIHZhciByb3VuZGVkQ3VycmVudCA9IE1hdGgucm91bmQoY3VycmVudCArIGN1cnJlbnQyICsgY3VycmVudDMpOw0KICAgIC8vIHZhciB0aW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWUnKS5pbm5lckhUTUw7DQogICAgJC5hamF4KHsNCiAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICB1cmw6ICJhcGkvaW5zZXJ0LWRlbHRhLnBocCIsIC8vIFJlcGxhY2Ugd2l0aCB0aGUgYWN0dWFsIHBhdGgNCiAgICAgICAgZGF0YTogew0KICAgICAgICAgICAgc2lnbmFsOiBzaWduYWwsDQogICAgICAgICAgICB2b2x0YWdlOiB2b2x0YWdlLA0KICAgICAgICAgICAgdm9sdGFnZTI6IHZvbHRhZ2UyLA0KICAgICAgICAgICAgdm9sdGFnZTM6IHZvbHRhZ2UzLA0KICAgICAgICAgICAgY3VycmVudDogY3VycmVudCwNCiAgICAgICAgICAgIGN1cnJlbnQyOiBjdXJyZW50MiwNCiAgICAgICAgICAgIGN1cnJlbnQzOiBjdXJyZW50MywNCiAgICAgICAgICAgIHBvd2VyOiBwb3dlciwNCiAgICAgICAgICAgIGVuZXJneTogZW5lcmd5DQogICAgICAgICAgICAvLyB0aW1lOiB0aW1lDQogICAgICAgIH0sDQogICAgICAgIGFzeW5jOiB0cnVlLA0KICAgICAgICBkYXRhVHlwZTogIkpTT04iLA0KICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJTaWduYWwgdXBkYXRlZCBzdWNjZXNzZnVsbHkiKTsNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcmVzcG9uc2UgaWYgbmVlZGVkDQogICAgICAgIH0sDQogICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHsNCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIHVwZGF0aW5nIHNpZ25hbCIsIGVycm9yKTsNCiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZXJyb3IgaWYgbmVlZGVkDQogICAgICAgIH0NCiAgICB9KTsNCn0NCg0KDQogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7DQogICAgICAgIGdldF9kYXRhX2NoYXJnaW5nKCk7DQogICAgfSkNCg0KICAgIHZhciBzdGFydFRpbWUgPSAwOw0KICAgIHZhciBlbGFwc2VkVGltZSA9IDA7DQogICAgdmFyIHRpbWVvdXRJZCA9IG51bGw7DQogICAgdmFyIHBvd2VyX2NvdW50ZG93biA9IDA7DQoNCiAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpOw0KICAgIG15VGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgICAgICAgY2xlYXJJbnRlcnZhbChteVRpbWVyKQ0KICAgICAgICBlbGFwc2VkVGltZSArPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lOw0KICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsNCiAgICB9LCAxMDAwKTsNCg0KICAgIC8vIGZ1bmN0aW9uIGdldF9kYXRhX2NoYXJnaW5nKCkgew0KICAgIC8vICAgICB2YXIgZXZfaWQgPSBpZDsNCiAgICAvLyAgICAgJC5hamF4KHsNCiAgICAvLyAgICAgICAgIHR5cGU6ICdQT1NUJywNCiAgICAvLyAgICAgICAgIHVybDogIjw/PSByb290ID8+YXBpL2RhdGEtcG90cmFpdC5waHAiLA0KICAgIC8vICAgICAgICAgYXN5bmM6IHRydWUsDQogICAgLy8gICAgICAgICBkYXRhVHlwZTogJ0pTT04nLA0KICAgIC8vICAgICAgICAgZGF0YTogew0KICAgIC8vICAgICAgICAgICAgIGV2X2lkOiBldl9pZCwNCiAgICAvLyAgICAgICAgIH0sDQogICAgLy8gICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyKSB7DQogICAgLy8gICAgICAgICAgICAgLy9zdWNjZXNzKHIpOw0KICAgIC8vICAgICAgICAgICAgIHZhciBkYXRhID0gci5ldl9zdGF0dXM7DQogICAgLy8gICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5zdGF0dXM7DQogICAgLy8gICAgICAgICAgICAgdm9sdCA9IGRhdGEudm9sdGFzZTsNCiAgICAvLyAgICAgICAgICAgICBlbmVyZ3kgPSBkYXRhLmVuZXJneTsNCiAgICAvLyAgICAgICAgICAgICBwb3dlciA9IGRhdGEucG93ZXI7DQogICAgLy8gICAgICAgICAgICAgYXJ1cyA9IGRhdGEuYXJ1czsNCiAgICAvLyAgICAgICAgICAgICBpZF9ldiA9IGRhdGEuZXZfaWQ7DQogICAgLy8gICAgICAgICAgICAgaW5zZXJ0cyA9IGRhdGEuaW5zZXJ0czsNCiAgICAvLyAgICAgICAgICAgICB2b3VjaGVyID0gZGF0YS52b3VjaGVyOw0KICAgIC8vICAgICAgICAgICAgIHVzYWdlX3N0YXR1cyA9IGRhdGEudXNhZ2Vfc3RhdHVzOw0KICAgIC8vICAgICAgICAgICAgIHVzYWdlX2RhdGUgPSBkYXRhLnVzYWdlX2RhdGU7DQogICAgLy8gICAgICAgICAgICAgY29kZSA9IGRhdGEuc3RhdHVzX2NvZGU7DQoNCg0KICAgIC8vICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ09OJyAmJiBhcnVzIDw9IDAuMikgew0KICAgIC8vICAgICAgICAgICAgICAgICAvL09OIEJVVCBOTyBJTlBVVCBBUlVTDQogICAgLy8gICAgICAgICAgICAgICAgIGlmIChpbnNlcnRzID09IDAgJiYgY29kZSA9PSAwKSB7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBsb29waW5nSWQrKzsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJUaW1lb3V0Iik7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAobG9vcGluZ0lkID4gNjApIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBsb29waW5nSWQgPSAwOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKCdDaGFyZ2luZyBSZWFkeS4uLicpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI2t3aCcpLmh0bWwoYDAuMDAga1doYCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxscGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVEYXRhKCk7DQoNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS0xJykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTEnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnLmJhci1iYXR0ZXJ5LTInKS5yZW1vdmVDbGFzcygnY2hhcmdlMicpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMycpLnJlbW92ZUNsYXNzKCdjaGFyZ2UzJykNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS00JykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTQnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnLmRlc2MtZm9udCcpLnJlbW92ZUNsYXNzKCdmdWxsLWZvbnQnKS5hZGRDbGFzcygnY2hhcmdlLWZvbnQnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI2xvYWRpbmcnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpLmFkZENsYXNzKCdsb2FkaW5nLW9mZicpOw0KDQoNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICQoJyNjaGFyZ2luZ2Jsb2NrJykuaHRtbChgPGltZyBzcmM9Ii4vaW1hZ2VzL2Nhci1ldmUucG5nIiBhbHQ9InRoaXMgc2xvd3Bva2UgbW92ZXMiIHdpZHRoPSIxNzBweCIgaGVpZ2h0PSIxNzBweCIgc3R5bGU9Im1hcmdpbi10b3A6LTM1cHg7IG1hcmdpbi1sZWZ0Oi0yMHB4OyIgLz5gKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lID0gMDsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUaW1lKDAsIDAsIDAsIDApOw0KICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc2VydHMgPT0gMSAmJiBjb2RlID09IDAgJiYgYXJ1cyA8PSAwLjIpIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmdJZCsrOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkxvYWRpbmcgdG8gRmluaXNoIik7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAobG9vcGluZ0lkID4gNSkgew0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmdJZCA9IDA7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RGF0YSgpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZURhdGEyKCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICB9DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoYENoYXJnaW5nICR7dm9sdH0gVm9sdC4uYCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcja3doJykuaHRtbChgJHtlbmVyZ3l9IGtXaGApOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI3Bvd2VyJykuaHRtbChgJHthcnVzfSBBYCkNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxscGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVEYXRhKCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMScpLnJlbW92ZUNsYXNzKCdjaGFyZ2UxLTInKS5hZGRDbGFzcygnY2hhcmdlMScpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMicpLnJlbW92ZUNsYXNzKCdjaGFyZ2UyLTInKS5hZGRDbGFzcygnY2hhcmdlMicpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMycpLnJlbW92ZUNsYXNzKCdjaGFyZ2UzLTInKS5hZGRDbGFzcygnY2hhcmdlMycpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktNCcpLnJlbW92ZUNsYXNzKCdjaGFyZ2U0LTInKS5hZGRDbGFzcygnY2hhcmdlNCcpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcuZGVzYy1mb250JykucmVtb3ZlQ2xhc3MoJ2Z1bGwtZm9udCcpLmFkZENsYXNzKCdjaGFyZ2UtZm9udCcpDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjbG9hZGluZycpLnJlbW92ZUNsYXNzKCdsb2FkaW5nLW9mZicpLmFkZENsYXNzKCdsb2FkaW5nJyk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9jYXItZXZlLnBuZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTcwcHgiIGhlaWdodD0iMTcwcHgiIHN0eWxlPSJtYXJnaW4tdG9wOi0zNXB4OyBtYXJnaW4tbGVmdDotMjBweDsiLz5gKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U3RvcHdhdGNoKCk7DQogICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zZXJ0cyA9PSAxICYmIGNvZGUgPT0gMSkgew0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgbG9vcGluZ0lkKys7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiRmluaXNoIik7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBpZiAobG9vcGluZ0lkID4gNjApIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBsb29waW5nSWQgPSAwOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKGBGaW5pc2ggQ2hhcmdpbmcuLi5gKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGdldF9kYXRhX2xvZ2NoYXJnaW5nKCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVEYXRhMigpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Z1bGxwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICQoJy5oZWFkZXInKS5yZW1vdmVDbGFzcygnaGVhZGVyLXJ1bicpLmFkZENsYXNzKCcuaGVhZGVyJykNCg0KDQogICAgLy8gICAgICAgICAgICAgICAgIH0NCiAgICAvLyAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnT04nICYmIGFydXMgPj0gMC4yKSB7IC8vT04gQU5EIEFSVVMgMQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcjc3RhdHVzX2J0bicpLmh0bWwoYENoYXJnaW5nICR7dm9sdH0gVm9sdC4uYCk7DQogICAgLy8gICAgICAgICAgICAgICAgICQoJyNrd2gnKS5odG1sKGAke2VuZXJneX0ga1doYCk7DQogICAgLy8gICAgICAgICAgICAgICAgICQoJyNwb3dlcicpLmh0bWwoYCR7YXJ1c30gQWApDQogICAgLy8gICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxscGFnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgLy8gICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyZ2luZ3BhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCg0KICAgIC8vICAgICAgICAgICAgICAgICB1cGRhdGVEYXRhKCk7DQogICAgLy8gICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS0xJykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTEtMicpLmFkZENsYXNzKCdjaGFyZ2UxJykNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnLmJhci1iYXR0ZXJ5LTInKS5yZW1vdmVDbGFzcygnY2hhcmdlMi0yJykuYWRkQ2xhc3MoJ2NoYXJnZTInKQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMycpLnJlbW92ZUNsYXNzKCdjaGFyZ2UzLTInKS5hZGRDbGFzcygnY2hhcmdlMycpDQogICAgLy8gICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS00JykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTQtMicpLmFkZENsYXNzKCdjaGFyZ2U0JykNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnLmRlc2MtZm9udCcpLnJlbW92ZUNsYXNzKCdmdWxsLWZvbnQnKS5hZGRDbGFzcygnY2hhcmdlLWZvbnQnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJy5oZWFkZXInKS5hZGRDbGFzcygnaGVhZGVyLXJ1bicpDQoNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnI2NoYXJnaW5nYmxvY2snKS5odG1sKGA8aW1nIHNyYz0iLi9pbWFnZXMvY2FyLWV2ZS5wbmciIGFsdD0idGhpcyBzbG93cG9rZSBtb3ZlcyIgd2lkdGg9IjE3MHB4IiBoZWlnaHQ9IjE3MHB4IiBzdHlsZT0ibWFyZ2luLXRvcDotMzVweDsgbWFyZ2luLWxlZnQ6LTIwcHg7Ii8+YCk7DQogICAgLy8gICAgICAgICAgICAgICAgIHN0YXJ0U3RvcHdhdGNoKCk7DQogICAgLy8gICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnI3N0YXR1c19idG4nKS5odG1sKCdTdGFuZEJ5Li4uJyk7DQogICAgLy8gICAgICAgICAgICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcjcG93ZXInKS5odG1sKGAwIEFgKQ0KICAgIC8vICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnVsbHBhZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgIC8vICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcmdpbmdwYWdlJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgLy8gICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDApIHsgLy9Lb25kaXNpIElkbGUgYXBhYmlsYSBzdHVjayBjb2RlIDEgYWthbiB1cGRhdGUgbWVuamFkaSAwDQogICAgLy8gICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXMoKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktMScpLnJlbW92ZUNsYXNzKCdjaGFyZ2UxJykNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnLmJhci1iYXR0ZXJ5LTInKS5yZW1vdmVDbGFzcygnY2hhcmdlMicpDQogICAgLy8gICAgICAgICAgICAgICAgICQoJy5iYXItYmF0dGVyeS0zJykucmVtb3ZlQ2xhc3MoJ2NoYXJnZTMnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcuYmFyLWJhdHRlcnktNCcpLnJlbW92ZUNsYXNzKCdjaGFyZ2U0JykNCiAgICAvLyAgICAgICAgICAgICAgICAgJCgnLmRlc2MtZm9udCcpLnJlbW92ZUNsYXNzKCdmdWxsLWZvbnQnKS5hZGRDbGFzcygnY2hhcmdlLWZvbnQnKQ0KICAgIC8vICAgICAgICAgICAgICAgICAkKCcjbG9hZGluZycpLnJlbW92ZUNsYXNzKCdsb2FkaW5nJykuYWRkQ2xhc3MoJ2xvYWRpbmctb2ZmJyk7DQoNCiAgICAvLyAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKTsNCg0KICAgIC8vICAgICAgICAgICAgICAgICBpZiAodXNhZ2Vfc3RhdHVzID09ICdCZWx1bSBUZXJwYWthaScpIHsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmdJZCsrOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkJhcmNvZGUiKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChsb29waW5nSWQgPiA2MCkgew0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmdJZCA9IDA7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVm91Y2hlcigpOw0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgJCgnI2NoYXJnaW5nYmxvY2snKS5odG1sKGA8ZGl2IGNsYXNzPSJjaGFyZ2UtZm9udCBkZXNjLWZvbnQiIHN0eWxlPSJtYXJnaW4tbGVmdDogLThweDsgbWFyZ2luLXRvcDogMzBweDsgZm9udC1zaXplOiAzMHB4Ij4gWW91IENvZGUgaXMgPGJyPiAke3ZvdWNoZXJ9PC9kaXY+YCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKDApOw0KICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygwKQ0KDQogICAgLy8gICAgICAgICAgICAgICAgICAgICAkKCcjY2hhcmdpbmdibG9jaycpLmh0bWwoYDxpbWcgc3JjPSIuL2ltYWdlcy9RUkVYUE8uanBlZyIgYWx0PSJ0aGlzIHNsb3dwb2tlIG1vdmVzIiB3aWR0aD0iMTMzcHgiIGhlaWdodD0iMTMzcHgiIC8+YCk7DQogICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygxKTsNCiAgICAvLyAgICAgICAgICAgICAgICAgfQ0KICAgIC8vICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZSA9IDA7DQogICAgLy8gICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7DQogICAgLy8gICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOw0KICAgIC8vICAgICAgICAgICAgICAgICBkaXNwbGF5VGltZSgwLCAwLCAwLCAwKTsNCiAgICAvLyAgICAgICAgICAgICB9DQogICAgLy8gICAgICAgICB9LA0KICAgIC8vICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgew0KICAgIC8vICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgLy8gICAgICAgICAgICAgICAgIGdldF9kYXRhX2NoYXJnaW5nKCk7DQogICAgLy8gICAgICAgICAgICAgfSwgMTAwMCk7DQogICAgLy8gICAgICAgICB9LA0KDQogICAgLy8gICAgIH0pDQoNCiAgICAvLyAgICAgLy8gcmV0dXJuIHJlc3VsdA0KICAgIC8vIH0NCg0KICAgIGZ1bmN0aW9uIGdldF9kYXRhX2xvZ2NoYXJnaW5nKCkgew0KICAgICAgICAvL3ZhciBldl9pZCA9IGlkOw0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvaW5pdGlhbGl6ZS1wb3RyYWl0LnBocCIsDQogICAgICAgICAgICBkYXRhOiB7DQogICAgICAgICAgICAgICAgaWQ6IGlkDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgZGF0YVR5cGU6ICJqc29uIiwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHIpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJbMF07DQogICAgICAgICAgICAgICAgZW5lcmd5ID0gZGF0YS5lbmVyZ3k7DQogICAgICAgICAgICAgICAgdGltZSA9IGRhdGEudGltZW5vdzsNCiAgICAgICAgICAgICAgICBkYXRlID0gZGF0YS50YW5nZ2FsOw0KICAgICAgICAgICAgICAgIHZhciBzcGxpdGRhdGUgPSBkYXRlLnNwbGl0KCcgJyk7DQogICAgICAgICAgICAgICAgdmFyIGRhdGVzcGxpdCA9IHNwbGl0ZGF0ZVswXTsNCiAgICAgICAgICAgICAgICB2YXIgdGltZXNwbGl0ID0gc3BsaXRkYXRlWzFdOw0KICAgICAgICAgICAgICAgIHZhciBodG1sID0gJyc7DQoNCiAgICAgICAgICAgICAgICBodG1sICs9IGA8dHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWdlbmQtc2FsZG8iPkR1cmF0aW9uPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlZ2VuZC1zYWxkbyI+OjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWdlbmQtc2FsZG8iPiR7dGltZX08L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlZ2VuZC1zYWxkbyI+RW5lcmd5PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlZ2VuZC1zYWxkbyI+OjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWdlbmQtc2FsZG8iPiR7ZW5lcmd5fTwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVnZW5kLXNhbGRvIj5EYXRlPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImxlZ2VuZC1zYWxkbyI+OjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWdlbmQtc2FsZG8iPiR7ZGF0ZXNwbGl0fTwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPmA7DQoNCiAgICAgICAgICAgICAgICAkKCcjZGF0YVRhYicpLmh0bWwoaHRtbCk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIGdldF9kYXRhX2xvZ2NoYXJnaW5nKCk7DQogICAgICAgICAgICAgICAgfSwgMTAwMCk7DQogICAgICAgICAgICB9LA0KICAgICAgICB9KQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHN0YXJ0U3RvcHdhdGNoKCkgew0KICAgICAgICAvL3J1biBzZXRUaW1lb3V0KCkgYW5kIHNhdmUgaWQNCiAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIC8vY2FsY3VsYXRlIGVsYXBzZWQgdGltZQ0KICAgICAgICAgICAgY29uc3QgdGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWUgKyBlbGFwc2VkVGltZTsNCg0KICAgICAgICAgICAgLy9jYWxjdWxhdGUgZGlmZmVyZW50IHRpbWUgbWVhc3VyZW1lbnRzIGJhc2VkIG9uIGVsYXBzZWQgdGltZQ0KICAgICAgICAgICAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlSW50KCh0aW1lIC8gMTAwMCkgJSA2MCkNCiAgICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUludCgodGltZSAvICgxMDAwICogNjApKSAlIDYwKQ0KICAgICAgICAgICAgY29uc3QgaG91ciA9IHBhcnNlSW50KCh0aW1lIC8gKDEwMDAgKiA2MCAqIDYwKSkgJSAyNCk7DQoNCiAgICAgICAgICAgIC8vZGlzcGxheSB0aW1lDQogICAgICAgICAgICBkaXNwbGF5VGltZShob3VyLCBtaW51dGVzLCBzZWNvbmRzKTsNCg0KICAgICAgICAgICAgLy9jYWxsaW5nIHNhbWUgbWV0aG9kIGFnYWluIHJlY3Vyc2l2YWx5DQogICAgICAgICAgICBzdGFydFN0b3B3YXRjaCgpOw0KICAgICAgICB9LCAxMDApOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRpc3BsYXlUaW1lKGhvdXIsIG1pbnV0ZXMsIHNlY29uZHMpIHsNCiAgICAgICAgdmFyIHN0b3B3YXRjaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1lJyk7DQogICAgICAgIGhvdXIgPSBob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cjsNCiAgICAgICAgbWludXRlcyA9IG1pbnV0ZXMgPCAxMCA/ICcwJyArIG1pbnV0ZXMgOiBtaW51dGVzOw0KICAgICAgICBzZWNvbmRzID0gc2Vjb25kcyA8IDEwID8gJzAnICsgc2Vjb25kcyA6IHNlY29uZHM7DQogICAgICAgIHN0b3B3YXRjaC5pbm5lckhUTUwgPSBob3VyICsgJzonICsgbWludXRlcyArICc6JyArIHNlY29uZHM7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaW5zZXJ0RGF0YSgpIHsNCiAgICAgICAgLy92YXIgbWFpbkJ1dHRvbiAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuX3N0YXJ0Jyk7DQogICAgICAgIHZhciBldl9pZCA9IGlkOw0KICAgICAgICB2YXIga3doID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2t3aCcpLmlubmVySFRNTDsNCiAgICAgICAgdmFyIHRpbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZScpLmlubmVySFRNTDsNCiAgICAgICAgLy92YXIgc3RhdHVzID0gMDsNCiAgICAgICAgJC5hamF4KHsNCiAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwNCiAgICAgICAgICAgIHVybDogIjw/PSByb290ID8+YXBpL2xvZ19pbnNlcnQtcG90cmFpdC5waHAiLA0KICAgICAgICAgICAgZGF0YTogew0KICAgICAgICAgICAgICAgIGV2X2lkOiBpZCwNCiAgICAgICAgICAgICAgICBrd2g6IGt3aCwNCiAgICAgICAgICAgICAgICB0aW1lOiB0aW1lDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgYXN5bmM6IHRydWUsDQogICAgICAgICAgICBkYXRhVHlwZTogIkpTT04iLA0KICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocikgew0KICAgICAgICAgICAgICAgICQoJyNtb2RlJykudGV4dCgnU3RhbmRieS4uLicpOw0KICAgICAgICAgICAgICAgICQoJyNrd2gnKS5odG1sKGAwLjAwIGtXaGApOw0KICAgICAgICAgICAgICAgICQoJyNwb3dlcicpLmh0bWwoYDAgQWApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KQ0KDQogICAgfQ0KDQogICAgdmFyIHZpZXdGdWxsU2NyZWVuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNsaWRlIik7DQogICAgaWYgKHZpZXdGdWxsU2NyZWVuKSB7DQogICAgICAgIHZpZXdGdWxsU2NyZWVuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgZG9jRWxtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICAgICAgICAgICAgaWYgKGRvY0VsbS5yZXF1ZXN0RnVsbHNjcmVlbikgew0KICAgICAgICAgICAgICAgIGRvY0VsbS5yZXF1ZXN0RnVsbHNjcmVlbigpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChkb2NFbG0ubXNSZXF1ZXN0RnVsbHNjcmVlbikgew0KICAgICAgICAgICAgICAgIGRvY0VsbS5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGRvY0VsbS5tb3pSZXF1ZXN0RnVsbFNjcmVlbikgew0KICAgICAgICAgICAgICAgIGRvY0VsbS5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChkb2NFbG0ud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4pIHsNCiAgICAgICAgICAgICAgICBkb2NFbG0ud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvdXBkYXRlX2xvZy5waHAiLA0KICAgICAgICAgICAgZGF0YTogew0KICAgICAgICAgICAgICAgIGlkOiBpZA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGFzeW5jOiB0cnVlLA0KICAgICAgICAgICAgZGF0YVR5cGU6ICJKU09OIiwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHIpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlIEluc2VydCAxJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlRGF0YU8oKSB7DQogICAgICAgICQuYWpheCh7DQogICAgICAgICAgICB0eXBlOiAiUE9TVCIsDQogICAgICAgICAgICB1cmw6ICI8Pz0gcm9vdCA/PmFwaS91cGRhdGVfbG9nXzAucGhwIiwNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICBpZDogaWQNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBhc3luYzogdHJ1ZSwNCiAgICAgICAgICAgIGRhdGFUeXBlOiAiSlNPTiIsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZSBJbnNlcnQgMCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEyKCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvdXBkYXRlX3N0YXR1c2NvZGUucGhwIiwNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICBpZDogaWQNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBhc3luYzogdHJ1ZSwNCiAgICAgICAgICAgIGRhdGFUeXBlOiAiSlNPTiIsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyKSB7DQogICAgICAgICAgICAgICAgLy9pbnNlcnREYXRhKCk7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZSBTdGF0dXMgQ29kZSAxJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvdXBkYXRlX3N0YXR1cy5waHAiLA0KICAgICAgICAgICAgZGF0YTogew0KICAgICAgICAgICAgICAgIGlkOiBpZA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGFzeW5jOiB0cnVlLA0KICAgICAgICAgICAgZGF0YVR5cGU6ICJKU09OIiwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHIpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlIFN0YXR1cyBPRkYnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVWb3VjaGVyKCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiPD89IHJvb3QgPz5hcGkvdXBkYXRlX3ZvdWNoZXIucGhwIiwNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgICBpZDogaWQNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBhc3luYzogdHJ1ZSwNCiAgICAgICAgICAgIGRhdGFUeXBlOiAiSlNPTiIsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZSBWb3VjaGVyIFRlcnBha2FpJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgfQ0KPC9zY3JpcHQ+DQoNCjwvaHRtbD4NCg==
Function Calls
None |
Stats
MD5 | 1dc2b426ec868ba4c6cb3cd0a5c0cf2f |
Eval Count | 0 |
Decode Time | 3912 ms |