Ly9Db2RlbWlycm9yIGVkaXRvcgp2YXIgaW5wdXRFZGl0b3IKdmFyIG91dHB1dEVkaXRvcgp2YXIgT1VUUFVUX1NFUCA9ICdcbi0tLS0tLS0tLS0tLS0tLS0tLVxuJwoKZnVuY3Rpb24gc2VuZERhdGEodXJsLCBkYXRhKSB7CiAgICAkLmFqYXgoewogICAgICAgIHR5cGU6IlBPU1QiLAogICAgICAgIHVybDp1cmwsCiAgICAgICAgZGF0YTpkYXRhLAovLyAgICAgICAgZGF0YVR5cGU6Impzb24iLAogICAgICAgIHRpbWVvdXQ6MzAwMDAsIC8vSW4gbWlsbGlzCiAgICAgICAgYmVmb3JlU2VuZDpmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICQoJyNhamF4U3Bpbm5lcicpLnNob3coKTsKICAgICAgICB9LAogICAgICAgIC8qIGVycm9yOiBmdW5jdGlvbigpIHsKICAgICAgICAgJCgnI3N0YXR1cycpLnRleHQoJ1VwZGF0ZSBmYWlsZWSXdHJ5IGFnYWluLicpLnNsaWRlRG93bignc2xvdycpOwogICAgICAgICB9LCovCiAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKCcjYWpheFNwaW5uZXInKS5oaWRlKCk7CiAgICAgICAgfSwKICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHJlbmRlckRhdGEoZGF0YSkKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gcmVuZGVyRGF0YShkYXRhKXsKICAgICQoJyNjb2RlLW91dHB1dCcpLnNob3coKTsKICAgIHZhciBjdXJyZW50RGF0YSA9IG91dHB1dEVkaXRvci5nZXRWYWx1ZSgpCiAgICAvL0lmIHdlIG5lZWQgdG8gYXBwZW5kIHRoZSBkYXRhIHRoZW4gdXNlIGJlbG93CiAgICAvL0ZvciBub3cgd2UganVzdCByZXBsYWNlIHRoZSBleGlzdGluZyBvdXRwdXQKICAgIC8vdmFyIG91dERhdGEgPSBkYXRhICsgT1VUUFVUX1NFUCsgY3VycmVudERhdGEKCiAgICBvdXRwdXRFZGl0b3Iuc2V0VmFsdWUoZGF0YSkKfQoKZnVuY3Rpb24gc2V0VXBDb2RlTWlycm9yKCkgewogICAgQ29kZU1pcnJvci5tb2RlVVJMID0gcGx1Z2luUm9vdCArICIvcmVzL3VpL2NvZGVtaXJyb3IvbW9kZS8lTi8lTi5qcyI7CiAgICBpbnB1dEVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczp0cnVlLAogICAgICAgIGV4dHJhS2V5czogewogICAgICAgICAgICAnQ3RybC1RJzpjbGVhck91dHB1dCwKICAgICAgICAgICAgJ0N0cmwtWCc6ZXhlY3V0ZVNjcmlwdAogICAgICAgIH0KICAgIH0pOwogICAgb3V0cHV0RWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdCIpLCB7CiAgICAgICAgICAgIGxpbmVOdW1iZXJzOnRydWUsCiAgICAgICAgICAgIHJlYWRPbmx5OiJub2N1cnNvciIKICAgICAgICB9KTsKfQoKZnVuY3Rpb24gdXBkYXRlV2l0aE9wdGlvbihvcHQpewogICAgc2V0TGFuZ01vZGUoaW5wdXRFZGl0b3Isb3B0LmF0dHIoJ2xhbmdNb2RlJykpCiAgICAkKCdbbmFtZT1sYW5nXScpLnZhbChvcHQudmFsKCkpCn0KCmZ1bmN0aW9uIHNldExhbmdNb2RlKGVkaXRvciwgbW9kZU5hbWUpIHsKICAgIGlmKCFtb2RlTmFtZSl7CiAgICAgICAgbW9kZU5hbWUgPSAidGV4dC9wbGFpbiIKICAgIH1lbHNlewogICAgICAgIENvZGVNaXJyb3IuYXV0b0xvYWRNb2RlKGlucHV0RWRpdG9yLCBtb2RlTmFtZSk7CiAgICB9CiAgICBlZGl0b3Iuc2V0T3B0aW9uKCJtb2RlIiwgbW9kZU5hbWUpOwp9CgpmdW5jdGlvbiBzZXRVcExhbmdPcHRpb25zKCkgewogICAgdmFyIGNvZGVMYW5nID0gJCgnI2NvZGVMYW5nJykKICAgIHZhciBvcHRpb25zID0gY29kZUxhbmcucHJvcCA/IGNvZGVMYW5nLnByb3AoJ29wdGlvbnMnKSA6IGNvZGVMYW5nLmF0dHIoJ29wdGlvbnMnKTsKICAgIGNvZGVMYW5nLmVtcHR5KCkKCiAgICBmb3IodmFyIGkgaW4gc2NyaXB0Q29uZmlnKXsKICAgICAgICB2YXIgY29uZmlnID0gc2NyaXB0Q29uZmlnW2ldCiAgICAgICAgdmFyIG9wdCA9IG5ldyBPcHRpb24oY29uZmlnLmxhbmdOYW1lLGNvbmZpZy5sYW5nQ29kZSk7CiAgICAgICAgaWYoY29uZmlnLm1vZGUpewogICAgICAgICAgICBvcHQubGFuZ01vZGUgPSBjb25maWcubW9kZTsKICAgICAgICB9CiAgICAgICAgb3B0aW9uc1tvcHRpb25zLmxlbmd0aF0gPSBvcHQKICAgIH0KICAgICQoJyNjb2RlTGFuZycpLmNoYW5nZShmdW5jdGlvbigpewogICAgICAgIHZhciBvcHQgPSAkKHRoaXMpLmZpbmQoIjpzZWxlY3RlZCIpOwogICAgICAgIHVwZGF0ZVdpdGhPcHRpb24ob3B0KQogICAgfSk7CgogICAgJCgnI2NvZGVMYW5nIG9wdGlvbjplcSgwKScpLmF0dHIoJ3NlbGVjdGVkJywnc2VsZWN0ZWQnKQogICAgdXBkYXRlV2l0aE9wdGlvbigkKG9wdGlvbnNbMF0pKQp9CgpmdW5jdGlvbiBleGVjdXRlU2NyaXB0KCl7CiAgICBpbnB1dEVkaXRvci5zYXZlKCkgLy9Db3B5IHRoZSBjb250ZW50cyB0byB0ZXh0YXJlYSBmb3JtIGZpZWxkCiAgICBzZW5kRGF0YShwbHVnaW5Sb290LCAkKCIjY29uc29sZUZvcm0iKS5zZXJpYWxpemUoKSk7Cn0KCmZ1bmN0aW9uIGNsZWFyT3V0cHV0KCl7CiAgICBvdXRwdXRFZGl0b3Iuc2V0VmFsdWUoJycpCn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICQoIiNleGVjdXRlQnV0dG9uIikuY2xpY2soZXhlY3V0ZVNjcmlwdCk7CiAgICAkKCcjYWpheFNwaW5uZXInKS5oaWRlKCk7CiAgICAkKCcjY29kZS1vdXRwdXQnKS5oaWRlKCk7CiAgICBzZXRVcENvZGVNaXJyb3IoKTsKICAgIHNldFVwTGFuZ09wdGlvbnMoKTsKfSk7Cg==