IyEgL2Jpbi9zaAouICIke3NyY2Rpcj0ufS9pbml0LnNoIjsgcGF0aF9wcmVwZW5kXyAuIC4uL3NyYwoKIyBUZXN0IG9mIGdldHRleHQgZmFjaWxpdGllcyBpbiB0aGUgSmF2YSBsYW5ndWFnZS4KIyBBc3N1bWVzIGFuIGZyX0ZSIGxvY2FsZSBpcyBpbnN0YWxsZWQuCiMgQXNzdW1lcyB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQ6IGphdmEuCgojIFRlc3Qgd2hldGhlciB3ZSBjYW4gYnVpbGQgYW5kIHRlc3QgSmF2YSBwcm9ncmFtcy4KdGVzdCAiJHtKQVZBX0NIT0lDRX0iICE9IG5vIHx8IHsKICBlY2hvICJTa2lwcGluZyB0ZXN0OiBjb25maWd1cmVkIHdpdGggLS1kaXNhYmxlLWphdmEiCiAgRXhpdCA3Nwp9CnRlc3QgIiR7QlVJTERKQVZBfSIgPSB5ZXMgfHwgewogIGVjaG8gIlNraXBwaW5nIHRlc3Q6IEphdmEgY29tcGlsZXIgb3IgamFyIG5vdCBmb3VuZCIKICBFeGl0IDc3Cn0KdGVzdCAiJHtURVNUSkFWQX0iID0geWVzIHx8IHsKICBlY2hvICJTa2lwcGluZyB0ZXN0OiBKYXZhIGVuZ2luZSBub3QgZm91bmQiCiAgRXhpdCA3Nwp9CgpjYXQgPDxcRU9GID4gUHJvZ3JhbS5qYXZhCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEudGV4dC4qOwppbXBvcnQgZ251LmdldHRleHQuKjsKCnB1YmxpYyBjbGFzcyBQcm9ncmFtIHsKICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewogICAgLy8gU29tZSBzeXN0ZW1zIChsaWtlIFNvbGFyaXMpIGRvbid0IHNldCBMb2NhbGUuZ2V0RGVmYXVsdCgpCiAgICAvLyBhcyBzcGVjaWZpZWQgYnkgTENfQUxMLiBTbyBzZXQgaXQgYnkgaGFuZC4KICAgIExvY2FsZS5zZXREZWZhdWx0KG5ldyBMb2NhbGUoImZyIiwiRlIiKSk7CkVPRgpjYXNlICIkaG9zdF9vcyIgaW4KICBkYXJ3aW4qKQpjYXQgPDxcRU9GID4+IFByb2dyYW0uamF2YQogICAgLy8gU29tZSBzeXN0ZW1zIChsaWtlIE1hY09TIFgpIGRvbid0IHNldCBTeXN0ZW0ub3V0J3MgY2hhcmFjdGVyIGVuY29kaW5nCiAgICAvLyBhY2NvcmRpbmcgdG8gTENfQUxMLCB3aGljaCBpcyB3aGF0IHdlIG5lZWQgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMuCiAgICB0cnkgewogICAgICBTeXN0ZW0uc2V0T3V0KG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShGaWxlRGVzY3JpcHRvci5vdXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBhcmdzWzFdKSk7CiAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKICAgIH0KRU9GCiAgICA7Owplc2FjCmNhdCA8PFxFT0YgPj4gUHJvZ3JhbS5qYXZhCiAgICBpbnQgbiA9IEludGVnZXIucGFyc2VJbnQoYXJnc1swXSk7CiAgICBSZXNvdXJjZUJ1bmRsZSBjYXRhbG9nID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJwcm9nIik7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oR2V0dGV4dFJlc291cmNlLmdldHRleHQoY2F0YWxvZywiJ1lvdXIgY29tbWFuZCwgcGxlYXNlPycsIGFza2VkIHRoZSB3YWl0ZXIuIikpOwogICAgU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEdldHRleHRSZXNvdXJjZS5uZ2V0dGV4dChjYXRhbG9nLCJhIHBpZWNlIG9mIGNha2UiLCJ7MCxudW1iZXJ9IHBpZWNlcyBvZiBjYWtlIixuKSwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIobikgfSkpOwogICAgU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEdldHRleHRSZXNvdXJjZS5nZXR0ZXh0KGNhdGFsb2csInswfSBpcyByZXBsYWNlZCBieSB7MX0uIiksIG5ldyBPYmplY3RbXSB7ICJGRiIsICJFVVIiIH0pKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChHZXR0ZXh0UmVzb3VyY2UubnBnZXR0ZXh0KGNhdGFsb2csIisrIiwiYSBwaWVjZSBvZiBjYWtlIiwiezAsbnVtYmVyfSBwaWVjZXMgb2YgY2FrZSIsbiksIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKG4pIH0pKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChHZXR0ZXh0UmVzb3VyY2UucGdldHRleHQoY2F0YWxvZywiKysiLCJ7MH0gaXMgcmVwbGFjZWQgYnkgezF9LiIpLCBuZXcgT2JqZWN0W10geyAiRkYiLCAiRVVSIiB9KSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdChHZXR0ZXh0UmVzb3VyY2UubmdldHRleHQoY2F0YWxvZywiU2hlIGhhcyBvbmUgY2hpbGQiLCJTaGUgaGFzICVkIGNoaWxkcmVuIixuKSwgbikpOwogICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoR2V0dGV4dFJlc291cmNlLmdldHRleHQoY2F0YWxvZywiJWQgbGVmdC13aW5nIGRlcHV0ZWVzIGFuZCAlZCByaWdodC13aW5nIGRlcHV0ZWVzIiksIDc1LCA2NCkpOwogIH0KfQpFT0YKCjogJHtKQVZBQ09NUD0iL2Jpbi9zaCAuLi8uLi9qYXZhY29tcC5zaCJ9CkNMQVNTUEFUSD0uLi8uLi8uLi9nZXR0ZXh0LXJ1bnRpbWUvaW50bC1qYXZhL2xpYmludGwuamFyICR7SkFWQUNPTVB9IC1kIC4gUHJvZ3JhbS5qYXZhIDI+cHJvZy5lcnIgXAogIHx8IHsgY2F0IHByb2cuZXJyIDE+JjI7IEV4aXQgMTsgfQoKOiAke1hHRVRURVhUPXhnZXR0ZXh0fQoke1hHRVRURVhUfSAtbyBwcm9nLnRtcCAtLW9taXQtaGVhZGVyIC0tbm8tbG9jYXRpb24gUHJvZ3JhbS5qYXZhIHx8IEV4aXQgMQpMQ19BTEw9QyB0ciAtZCAnXHInIDwgcHJvZy50bXAgPiBwcm9nLnBvdCB8fCBFeGl0IDEKCmNhdCA8PEVPRiA+IHByb2cub2sKbXNnaWQgIidZb3VyIGNvbW1hbmQsIHBsZWFzZT8nLCBhc2tlZCB0aGUgd2FpdGVyLiIKbXNnc3RyICIiCgojLCBqYXZhLWZvcm1hdAptc2dpZCAiYSBwaWVjZSBvZiBjYWtlIgptc2dpZF9wbHVyYWwgInswLG51bWJlcn0gcGllY2VzIG9mIGNha2UiCm1zZ3N0clswXSAiIgptc2dzdHJbMV0gIiIKCiMsIGphdmEtZm9ybWF0Cm1zZ2lkICJ7MH0gaXMgcmVwbGFjZWQgYnkgezF9LiIKbXNnc3RyICIiCgojLCBqYXZhLWZvcm1hdAptc2djdHh0ICIrKyIKbXNnaWQgImEgcGllY2Ugb2YgY2FrZSIKbXNnaWRfcGx1cmFsICJ7MCxudW1iZXJ9IHBpZWNlcyBvZiBjYWtlIgptc2dzdHJbMF0gIiIKbXNnc3RyWzFdICIiCgojLCBqYXZhLWZvcm1hdAptc2djdHh0ICIrKyIKbXNnaWQgInswfSBpcyByZXBsYWNlZCBieSB7MX0uIgptc2dzdHIgIiIKCiMsIGphdmEtcHJpbnRmLWZvcm1hdAptc2dpZCAiU2hlIGhhcyBvbmUgY2hpbGQiCm1zZ2lkX3BsdXJhbCAiU2hlIGhhcyAlZCBjaGlsZHJlbiIKbXNnc3RyWzBdICIiCm1zZ3N0clsxXSAiIgoKIywgamF2YS1wcmludGYtZm9ybWF0Cm1zZ2lkICIlZCBsZWZ0LXdpbmcgZGVwdXRlZXMgYW5kICVkIHJpZ2h0LXdpbmcgZGVwdXRlZXMiCm1zZ3N0ciAiIgpFT0YKCjogJHtESUZGPWRpZmZ9CiR7RElGRn0gcHJvZy5vayBwcm9nLnBvdCB8fCBFeGl0IDEKCmNhdCA8PFxFT0YgPiBmci5wbwptc2dpZCAiIgptc2dzdHIgIiIKIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xXG4iCiJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiA+IDEpO1xuIgoKbXNnaWQgIidZb3VyIGNvbW1hbmQsIHBsZWFzZT8nLCBhc2tlZCB0aGUgd2FpdGVyLiIKbXNnc3RyICKrVm90cmUgY29tbWFuZGUsIHMnaWwgdm91cyBwbGFpdLssIGRpdCBsZSBnYXLnb24uIgoKIyBMZXMgZ2F0ZWF1eCBhbGxlbWFuZHMgc29udCBsZXMgbWVpbGxldXJzIGR1IG1vbmRlLgojLCBqYXZhLWZvcm1hdAptc2dpZCAiYSBwaWVjZSBvZiBjYWtlIgptc2dpZF9wbHVyYWwgInswLG51bWJlcn0gcGllY2VzIG9mIGNha2UiCm1zZ3N0clswXSAidW4gbW9yY2VhdSBkZSBnYXRlYXUiCm1zZ3N0clsxXSAiezAsbnVtYmVyfSBtb3JjZWF1eCBkZSBnYXRlYXUiCgojIFJldmVyc2UgdGhlIGFyZ3VtZW50cy4KIywgamF2YS1mb3JtYXQKbXNnaWQgInswfSBpcyByZXBsYWNlZCBieSB7MX0uIgptc2dzdHIgInsxfSByZW1wbGFjZSB7MH0uIgoKIyBFdXBoZW1pc3RpYyBmb3JtdWxhdGlvbi4KIywgamF2YS1mb3JtYXQKbXNnY3R4dCAiKysiCm1zZ2lkICJhIHBpZWNlIG9mIGNha2UiCm1zZ2lkX3BsdXJhbCAiezAsbnVtYmVyfSBwaWVjZXMgb2YgY2FrZSIKbXNnc3RyWzBdICJ1biBtb3JjZWF1IGRlIGdhdGVhdSBzdWNjdWxlbnQiCm1zZ3N0clsxXSAiezAsbnVtYmVyfSBtb3JjZWF1eCBkZSBnYXRlYXUgc3VjY3VsZW50IgoKIyBFdXBoZW1pc3RpYyBmb3JtdWxhdGlvbi4KIywgamF2YS1mb3JtYXQKbXNnY3R4dCAiKysiCm1zZ2lkICJ7MH0gaXMgcmVwbGFjZWQgYnkgezF9LiIKbXNnc3RyICJMZSBub3V2ZWF1IHsxfSByZW1wbGFjZSBsZSB2aWV1eCB7MH0uIgoKIywgamF2YS1wcmludGYtZm9ybWF0Cm1zZ2lkICJTaGUgaGFzIG9uZSBjaGlsZCIKbXNnaWRfcGx1cmFsICJTaGUgaGFzICVkIGNoaWxkcmVuIgptc2dzdHJbMF0gIkVsbGUgYSB1biBlbmZhbnQiCm1zZ3N0clsxXSAiRWxsZSBhICVkIGVuZmFudHMiCgojLCBqYXZhLXByaW50Zi1mb3JtYXQKbXNnaWQgIiVkIGxlZnQtd2luZyBkZXB1dGVlcyBhbmQgJWQgcmlnaHQtd2luZyBkZXB1dGVlcyIKbXNnc3RyICIlMiRkIGTpcHV06XMgZGUgZHJvaXRlIGV0ICVkIGTpcHV06XMgZGUgZ2F1Y2hlIgpFT0YKCjogJHtNU0dNRVJHRT1tc2dtZXJnZX0KJHtNU0dNRVJHRX0gLXEgLW8gZnIucG8udG1wIGZyLnBvIHByb2cucG90IHx8IEV4aXQgMQpMQ19BTEw9QyB0ciAtZCAnXHInIDwgZnIucG8udG1wID4gZnIucG8ubmV3IHx8IEV4aXQgMQoKOiAke0RJRkY9ZGlmZn0KJHtESUZGfSBmci5wbyBmci5wby5uZXcgfHwgRXhpdCAxCgo6ICR7TVNHRk1UPW1zZ2ZtdH0KJHtNU0dGTVR9IC1qIC1kIC4gLXIgcHJvZyAtbCBmciBmci5wbyB8fCBFeGl0IDEKCiMgVGVzdCB3aGljaCBvZiB0aGUgZnJfRlIgbG9jYWxlcyBhcmUgaW5zdGFsbGVkLgo6ICR7TE9DQUxFX0ZSPWZyX0ZSfQo6ICR7TE9DQUxFX0ZSX1VURjg9ZnJfRlIuVVRGLTh9CmlmIHRlc3QgJExPQ0FMRV9GUiAhPSBub25lOyB0aGVuCiAgTENfQUxMPSRMT0NBTEVfRlIgLi4vdGVzdGxvY2FsZQogIGNhc2UgJD8gaW4KICAgIDApIDs7CiAgICA3NykgTE9DQUxFX0ZSPW5vbmU7OwogICAgKikgRXhpdCAxOzsKICBlc2FjCmZpCmlmIHRlc3QgJExPQ0FMRV9GUl9VVEY4ICE9IG5vbmU7IHRoZW4KICBMQ19BTEw9JExPQ0FMRV9GUl9VVEY4IC4uL3Rlc3Rsb2NhbGUKICBjYXNlICQ/IGluCiAgICAwKSA7OwogICAgNzcpIExPQ0FMRV9GUl9VVEY4PW5vbmU7OwogICAgKikgRXhpdCAxOzsKICBlc2FjCmZpCmlmIHRlc3QgJExPQ0FMRV9GUiA9IG5vbmUgJiYgdGVzdCAkTE9DQUxFX0ZSX1VURjggPSBub25lOyB0aGVuCiAgaWYgdGVzdCAtZiAvdXNyL2Jpbi9sb2NhbGVkZWY7IHRoZW4KICAgIGVjaG8gIlNraXBwaW5nIHRlc3Q6IG5vIGZyZW5jaCBsb2NhbGUgaXMgaW5zdGFsbGVkIgogIGVsc2UKICAgIGVjaG8gIlNraXBwaW5nIHRlc3Q6IG5vIGZyZW5jaCBsb2NhbGUgaXMgc3VwcG9ydGVkIgogIGZpCiAgRXhpdCA3NwpmaQoKOiAke0RJRkY9ZGlmZn0KY2F0IDw8XEVPRiA+IHByb2cub2sKq1ZvdHJlIGNvbW1hbmRlLCBzJ2lsIHZvdXMgcGxhaXS7LCBkaXQgbGUgZ2Fy529uLgoyIG1vcmNlYXV4IGRlIGdhdGVhdQpFVVIgcmVtcGxhY2UgRkYuCjIgbW9yY2VhdXggZGUgZ2F0ZWF1IHN1Y2N1bGVudApMZSBub3V2ZWF1IEVVUiByZW1wbGFjZSBsZSB2aWV1eCBGRi4KRWxsZSBhIDIgZW5mYW50cwo2NCBk6XB1dOlzIGRlIGRyb2l0ZSBldCA3NSBk6XB1dOlzIGRlIGdhdWNoZQpFT0YKY2F0IDw8XEVPRiA+IHByb2cub2t1CsKrVm90cmUgY29tbWFuZGUsIHMnaWwgdm91cyBwbGFpdMK7LCBkaXQgbGUgZ2Fyw6dvbi4KMiBtb3JjZWF1eCBkZSBnYXRlYXUKRVVSIHJlbXBsYWNlIEZGLgoyIG1vcmNlYXV4IGRlIGdhdGVhdSBzdWNjdWxlbnQKTGUgbm91dmVhdSBFVVIgcmVtcGxhY2UgbGUgdmlldXggRkYuCkVsbGUgYSAyIGVuZmFudHMKNjQgZMOpcHV0w6lzIGRlIGRyb2l0ZSBldCA3NSBkw6lwdXTDqXMgZGUgZ2F1Y2hlCkVPRgoKOiAke0xPQ0FMRV9GUj1mcl9GUn0KOiAke0xPQ0FMRV9GUl9VVEY4PWZyX0ZSLlVURi04fQo6ICR7SkFWQUVYRUM9Ii9iaW4vc2ggLi4vLi4vamF2YWV4ZWMuc2gifQppZiB0ZXN0ICRMT0NBTEVfRlIgIT0gbm9uZTsgdGhlbgogIHByZXBhcmVfbG9jYWxlXyBmciAkTE9DQUxFX0ZSCiAgTEFOR1VBR0U9IExDX0FMTD0kTE9DQUxFX0ZSIENMQVNTUEFUSD0uOi4uLy4uLy4uL2dldHRleHQtcnVudGltZS9pbnRsLWphdmEvbGliaW50bC5qYXIgJHtKQVZBRVhFQ30gUHJvZ3JhbSAyIElTTy04ODU5LTEgPiBwcm9nLm91dCB8fCBFeGl0IDEKICAke0RJRkZ9IHByb2cub2sgcHJvZy5vdXQgfHwgRXhpdCAxCmZpCmlmIHRlc3QgJExPQ0FMRV9GUl9VVEY4ICE9IG5vbmU7IHRoZW4KICBwcmVwYXJlX2xvY2FsZV8gZnIgJExPQ0FMRV9GUl9VVEY4CiAgTEFOR1VBR0U9IExDX0FMTD0kTE9DQUxFX0ZSX1VURjggQ0xBU1NQQVRIPS46Li4vLi4vLi4vZ2V0dGV4dC1ydW50aW1lL2ludGwtamF2YS9saWJpbnRsLmphciAke0pBVkFFWEVDfSBQcm9ncmFtIDIgVVRGLTggPiBwcm9nLm91dCB8fCBFeGl0IDEKICAke0RJRkZ9IHByb2cub2t1IHByb2cub3V0IHx8IEV4aXQgMQpmaQoKRXhpdCAwCg==