Ly9Db2RlbWlycm9yIGVkaXRvcgp2YXIgaW5wdXRFZGl0b3IKdmFyIG91dHB1dEVkaXRvcgp2YXIgT1VUUFVUX1NFUCA9ICdcbi0tLS0tLS0tLS0tLS0tLS0tLVxuJwoKZnVuY3Rpb24gc2VuZERhdGEodXJsLCBkYXRhKSB7CiAgICAkLmFqYXgoewogICAgICAgIHR5cGU6IlBPU1QiLAogICAgICAgIHVybDp1cmwsCiAgICAgICAgZGF0YTpkYXRhLAovLyAgICAgICAgZGF0YVR5cGU6Impzb24iLAogICAgICAgIHRpbWVvdXQ6MzAwMDAsIC8vSW4gbWlsbGlzCiAgICAgICAgYmVmb3JlU2VuZDpmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICQoJyNhamF4U3Bpbm5lcicpLnNob3coKTsKICAgICAgICB9LAogICAgICAgIC8qIGVycm9yOiBmdW5jdGlvbigpIHsKICAgICAgICAgJCgnI3N0YXR1cycpLnRleHQoJ1VwZGF0ZSBmYWlsZWSXdHJ5IGFnYWluLicpLnNsaWRlRG93bignc2xvdycpOwogICAgICAgICB9LCovCiAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKCcjYWpheFNwaW5uZXInKS5oaWRlKCk7CiAgICAgICAgfSwKICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHJlbmRlckRhdGEoZGF0YSkKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gcmVuZGVyRGF0YShkYXRhKXsKICAgICQoJyNjb2RlLW91dHB1dCcpLnNob3coKTsKICAgIHZhciBjdXJyZW50RGF0YSA9IG91dHB1dEVkaXRvci5nZXRWYWx1ZSgpCiAgICAvL0lmIHdlIG5lZWQgdG8gYXBwZW5kIHRoZSBkYXRhIHRoZW4gdXNlIGJlbG93CiAgICAvL0ZvciBub3cgd2UganVzdCByZXBsYWNlIHRoZSBleGlzdGluZyBvdXRwdXQKICAgIC8vdmFyIG91dERhdGEgPSBkYXRhICsgT1VUUFVUX1NFUCsgY3VycmVudERhdGEKCiAgICBvdXRwdXRFZGl0b3Iuc2V0VmFsdWUoZGF0YSkKfQoKZnVuY3Rpb24gc2V0VXBDb2RlTWlycm9yKCkgewogICAgQ29kZU1pcnJvci5tb2RlVVJMID0gcGx1Z2luUm9vdCArICIvcmVzL3VpL2NvZGVtaXJyb3IvbW9kZS8lTi8lTi5qcyI7CiAgICBpbnB1dEVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczp0cnVlLAogICAgICAgIGV4dHJhS2V5czogewogICAgICAgICAgICAnQ3RybC1RJzpjbGVhck91dHB1dCwKICAgICAgICAgICAgJ0N0cmwtWCc6ZXhlY3V0ZVNjcmlwdAogICAgICAgIH0KICAgIH0pOwogICAgb3V0cHV0RWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdCIpLCB7CiAgICAgICAgICAgIGxpbmVOdW1iZXJzOnRydWUsCiAgICAgICAgICAgIHJlYWRPbmx5OiJub2N1cnNvciIKICAgICAgICB9KTsKfQoKZnVuY3Rpb24gdXBkYXRlV2l0aE9wdGlvbihvcHQpewogICAgc2V0TGFuZ01vZGUoaW5wdXRFZGl0b3Isb3B0LmF0dHIoJ2xhbmdNb2RlJykpCiAgICAkKCdbbmFtZT1sYW5nXScpLnZhbChvcHQudmFsKCkpCn0KCmZ1bmN0aW9uIHNldExhbmdNb2RlKGVkaXRvciwgbW9kZU5hbWUpIHsKICAgIGlmKCFtb2RlTmFtZSl7CiAgICAgICAgbW9kZU5hbWUgPSAidGV4dC9wbGFpbiIKICAgIH1lbHNlewogICAgICAgIENvZGVNaXJyb3IuYXV0b0xvYWRNb2RlKGlucHV0RWRpdG9yLCBtb2RlTmFtZSk7CiAgICB9CiAgICBlZGl0b3Iuc2V0T3B0aW9uKCJtb2RlIiwgbW9kZU5hbWUpOwp9CgpmdW5jdGlvbiBzZXRVcExhbmdPcHRpb25zKCkgewogICAgdmFyIGNvZGVMYW5nID0gJCgnI2NvZGVMYW5nJykKICAgIHZhciBvcHRpb25zID0gY29kZUxhbmcuYXR0cignb3B0aW9ucycpOwogICAgY29kZUxhbmcuZW1wdHkoKQoKICAgIGZvcih2YXIgaSBpbiBzY3JpcHRDb25maWcpewogICAgICAgIHZhciBjb25maWcgPSBzY3JpcHRDb25maWdbaV0KICAgICAgICB2YXIgb3B0ID0gbmV3IE9wdGlvbihjb25maWcubGFuZ05hbWUsY29uZmlnLmxhbmdDb2RlKTsKICAgICAgICBpZihjb25maWcubW9kZSl7CiAgICAgICAgICAgIG9wdC5sYW5nTW9kZSA9IGNvbmZpZy5tb2RlOwogICAgICAgIH0KICAgICAgICBvcHRpb25zW29wdGlvbnMubGVuZ3RoXSA9IG9wdAogICAgfQogICAgJCgnI2NvZGVMYW5nJykuY2hhbmdlKGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIG9wdCA9ICQodGhpcykuZmluZCgiOnNlbGVjdGVkIik7CiAgICAgICAgdXBkYXRlV2l0aE9wdGlvbihvcHQpCiAgICB9KTsKCiAgICAkKCcjY29kZUxhbmcgb3B0aW9uOmVxKDApJykuYXR0cignc2VsZWN0ZWQnLCdzZWxlY3RlZCcpCiAgICB1cGRhdGVXaXRoT3B0aW9uKCQob3B0aW9uc1swXSkpCn0KCmZ1bmN0aW9uIGV4ZWN1dGVTY3JpcHQoKXsKICAgIGlucHV0RWRpdG9yLnNhdmUoKSAvL0NvcHkgdGhlIGNvbnRlbnRzIHRvIHRleHRhcmVhIGZvcm0gZmllbGQKICAgIHNlbmREYXRhKHBsdWdpblJvb3QsICQoIiNjb25zb2xlRm9ybSIpLnNlcmlhbGl6ZSgpKTsKfQoKZnVuY3Rpb24gY2xlYXJPdXRwdXQoKXsKICAgIG91dHB1dEVkaXRvci5zZXRWYWx1ZSgnJykKfQoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgiI2V4ZWN1dGVCdXR0b24iKS5jbGljayhleGVjdXRlU2NyaXB0KTsKICAgICQoJyNhamF4U3Bpbm5lcicpLmhpZGUoKTsKICAgICQoJyNjb2RlLW91dHB1dCcpLmhpZGUoKTsKICAgIHNldFVwQ29kZU1pcnJvcigpOwogICAgc2V0VXBMYW5nT3B0aW9ucygpOwp9KTsK