IyBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQuICBTZWUKIyB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwojIHRoYXQgbWF5IGFwcGx5OgojCiMgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQojIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiMKCiMKIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgojCkFDX0lOSVQoW05ldC1TTk1QXSwgWzUuMS1wcmUxYV0sIFtuZXQtc25tcC1jb2RlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0XSkKQUNfUFJFUkVRKFsyLjU3XSkKQUNfQ09ORklHX1NSQ0RJUihbYWdlbnQvbWliZ3JvdXAvdWNkLXNubXAvZXh0ZW5zaWJsZS5jXSkKQUNfUkVWSVNJT04oWyRSZXZpc2lvbiRdKQoKQUNfQ09ORklHX0hFQURFUihpbmNsdWRlL25ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oKQoKQUNfTVNHX0NBQ0hFX0lOSVQoKQoKIwojIHNhdmUgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMKIwpBQ19ERUZJTkVfVU5RVU9URUQoQ09ORklHVVJFX09QVElPTlMsIlwiJGFjX2NvbmZpZ3VyZV9hcmdzXCIiKQpDT05GSUdVUkVfT1BUSU9OUz0iXCIkYWNfY29uZmlndXJlX2FyZ3NcIiIKQUNfU1VCU1QoQ09ORklHVVJFX09QVElPTlMpCgojCiMgQ29tcGlsYXRpb24gc2V0dXAKIwpBQ19BUkdfV0lUSChjYywgWwpDb21waWxlciBPcHRpb25zOgogIC0td2l0aC1jYz1DQyAgICAgICAgICAgICAgICAgICAgdXNlIENDIHRvIGNvbXBpbGUgKGRlZmF1bHQ9Z2NjKS5dLAogICAgW0NDPSR3aXRoX2NjO2V4cG9ydCBDQ10pCgpBQ19BUkdfV0lUSChhciwKWyAgLS13aXRoLWFyPUFSICAgICAgICAgICAgICAgICAgICB1c2UgQVIgYXMgdGhlIGFyY2hpdmVyLl0sCiAgICBbQVI9JHdpdGhfYXI7IGV4cG9ydCBBUl0pCgpBQ19BUkdfV0lUSChlbmRpYW5uZXNzLApbICAtLXdpdGgtZW5kaWFubmVzcz1iaWd8bGl0dGxlICAgIGRlZmluZSBlbmRpYW5uZXNzIG9mIHRhcmdldCBwbGF0Zm9ybSB3aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zcy1jb21waWxpbmcuXSwKICAgIFtpZiB0ZXN0ICR3aXRoX2VuZGlhbm5lc3MgIT0gImJpZyIgLWEgJHdpdGhfZW5kaWFubmVzcyAhPSAibGl0dGxlIiA7IHRoZW4KICAgICAgIEFDX01TR19FUlJPUihbRW5kaWFubmVzcyBtdXN0IGJlIGJpZyBvciBsaXR0bGUsIG5vdCAiJHdpdGhfZW5kaWFubmVzcyIuXSk7CiAgICAgZmkKXSkKCkFDX0FSR19XSVRIKGNmbGFncywKWyAgLS13aXRoLWNmbGFncz1DRkxBR1MgICAgICAgICAgICB1c2UgQ0ZMQUdTIGFzIGNvbXBpbGUgdGltZSBhcmd1bWVudHMuXSwKICAgIFtDRkxBR1M9JHdpdGhfY2ZsYWdzOyBleHBvcnQgQ0ZMQUdTXSkKCkFDX0FSR19XSVRIKGxkZmxhZ3MsClsgIC0td2l0aC1sZGZsYWdzPUxERkxBR1MgICAgICAgICAgdXNlIExERkxBR1MgYXMgbGluayB0aW1lIGFyZ3VtZW50cyB0byBsZC5dLAogICAgW0xERkxBR1M9JHdpdGhfbGRmbGFnczsgZXhwb3J0IExERkxBR1NdKQoKQUNfQVJHX1dJVEgobGlicywKWyAgLS13aXRoLWxpYnM9TElCUyAgICAgICAgICAgICAgICB1c2UgTElCUyBhcyBsaW5rIHRpbWUgYXJndW1lbnRzIHRvIGxkLl0sCiAgICBbTElCUz0kd2l0aF9saWJzOyBleHBvcnQgTElCU10pCgpBQ19BUkdfRU5BQkxFKHNpbGVudC1saWJ0b29sLApbICAtLWVuYWJsZS1zaWxlbnQtbGlidG9vbCAgICAgICAgIFBhc3MgLS1zaWxlbnQgdG8gbGlidG9vbC5dLAoJTElCVE9PTEZMQUdTPS0tc2lsZW50KQpBQ19TVUJTVChMSUJUT09MRkxBR1MpCgpBQ19BUkdfV0lUSChpbnN0YWxsLXByZWZpeCwKWyAgLS13aXRoLWluc3RhbGwtcHJlZml4PVBBVEggICAgICBKdXN0IGZvciBpbnN0YWxsaW5nLCBwcmVmaXggYWxsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgd2l0aCBQQVRILiAgVGhpcyBpcyBrbm93biBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHdvcmsgb24gc29tZSBzeXN0ZW1zIHdpdGggc2hhcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgKGVnLCBIUFVYKV0sCiAgICAgIElOU1RBTExfUFJFRklYPSIkd2l0aHZhbCIpCgppZiB0ZXN0ICJ4JElOU1RBTExfUFJFRklYIiA9ICJ4eWVzIiA7IHRoZW4KICBBQ19NU0dfRVJST1IoWy0td2l0aC1pbnN0YWxsLXByZWZpeCByZXF1aXJlcyBhbiBhcmd1bWVudF0pCmZpCmlmIHRlc3QgIngkSU5TVEFMTF9QUkVGSVgiID0gInhubyIgOyB0aGVuCiAgSU5TVEFMTF9QUkVGSVg9IiIKZmkKQUNfU1VCU1QoSU5TVEFMTF9QUkVGSVgpCgpBQ19BUkdfRU5BQkxFKG1pbmlfYWdlbnQsClsgIC0tZW5hYmxlLW1pbmktYWdlbnQgICAgICAgICAgICAgQnVpbGQgYSBtaW5pbWFsIGFnZW50Ll0sCiAgICBtaW5pX2FnZW50PSJ5ZXMiLG1pbmlfYWdlbnQ9Im5vIikKCkFDX0FSR19FTkFCTEUoYWdlbnQsClsgIC0tZGlzYWJsZS1hZ2VudCAgICAgICAgICAgICAgICAgRG8gbm90IGJ1aWxkIHRoZSBhZ2VudCAoc25tcGQpLl0pCmlmIHRlc3QgIngkZW5hYmxlX2FnZW50IiAhPSAieG5vIjsgdGhlbgogICBNQUlOU1VCUz0iJE1BSU5TVUJTIGFnZW50IgpmaQoKQUNfQVJHX0VOQUJMRShhcHBsaWNhdGlvbnMsClsgIC0tZGlzYWJsZS1hcHBsaWNhdGlvbnMgICAgICAgICAgRG8gbm90IGJ1aWxkIHRoZSBhcHBzIChzbm1wZ2V0LCAuLi4pLl0pCmlmIHRlc3QgIngkZW5hYmxlX2FwcGxpY2F0aW9ucyIgIT0gInhubyI7IHRoZW4KICAgTUFJTlNVQlM9IiRNQUlOU1VCUyBhcHBzIgpmaQoKQUNfQVJHX0VOQUJMRShtYW51YWxzLApbICAtLWRpc2FibGUtbWFudWFscyAgICAgICAgICAgICAgIERvIG5vdCBpbnN0YWxsIHRoZSBtYW51YWxzLl0pCmlmIHRlc3QgIngkZW5hYmxlX21hbnVhbHMiICE9ICJ4bm8iOyB0aGVuCiAgIE1BSU5TVUJTPSIkTUFJTlNVQlMgbWFuIgpmaQoKQUNfQVJHX0VOQUJMRShzY3JpcHRzLApbICAtLWRpc2FibGUtc2NyaXB0cyAgICAgICAgICAgICAgIERvIG5vdCBpbnN0YWxsIHRoZSBzY3JpcHRzIChtaWIyYywgLi4uKS5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9zY3JpcHRzIiAhPSAieG5vIjsgdGhlbgogICBNQUlOU1VCUz0iJE1BSU5TVUJTIGxvY2FsIgpmaQoKQUNfQVJHX0VOQUJMRShtaWJzLApbICAtLWRpc2FibGUtbWlicyAgICAgICAgICAgICAgICAgIERvIG5vdCBpbnN0YWxsIHRoZSBtaWIgZmlsZXMuXSkKaWYgdGVzdCAieCRlbmFibGVfbWlicyIgIT0gInhubyI7IHRoZW4KICAgTUFJTlNVQlM9IiRNQUlOU1VCUyBtaWJzIgpmaQoKQUNfU1VCU1QoTUFJTlNVQlMpCkFDX01TR19DSEVDS0lORyhbd2hhdCB0byBidWlsZCBhbmQgaW5zdGFsbF0pCkFDX01TR19SRVNVTFQoWyRNQUlOU1VCU10pCgpBQ19BUkdfRU5BQkxFKG1pYi1sb2FkaW5nLApbICAtLWRpc2FibGUtbWliLWxvYWRpbmcgICAgICAgICAgICBEbyBub3QgaW5jbHVkZSBjb2RlIHRoYXQgcGFyc2VzIGFuZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5pcHVsYXRlcyB0aGUgbWliIGZpbGVzLl0pCmlmIHRlc3QgIngkZW5hYmxlX21pYl9sb2FkaW5nIiA9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKFtESVNBQkxFX01JQl9MT0FESU5HXSwgMSwgCiAgICAgICAgICAgIFtEZWZpbmUgaWYgbWliIGxvYWRpbmcgYW5kIHBhcnNpbmcgY29kZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkXSkKZmkKCkFDX0FSR19FTkFCTEUoaXB2NiwKWyAgLS1lbmFibGUtaXB2NiAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBJUHY2IHJlYWR5IHZlcnNpb24uXSwKICAgIFtpZiB0ZXN0ICJ4JGVuYWJsZV9pcHY2IiA9ICJ4eWVzIjsgdGhlbgogICAgICBBQ19ERUZJTkUoSU5FVDYpCiAgICBmaV0pCgpBQ19BUkdfRU5BQkxFKGxvY2FsLXNtdXgsClsgIC0tZW5hYmxlLWxvY2FsLXNtdXggICAgICAgICAgICAgUmVzdHJpY3QgU01VWCBjb25uZWN0aW9ucyB0byBsb2NhbGhvc3QgKGJ5IGRlZmF1bHQpLl0sCiAgICBbaWYgdGVzdCAieCRsb2NhbF9zbXV4IiA9ICJ4eWVzIjsgdGhlbgogICAgICBBQ19ERUZJTkUoTE9DQUxfU01VWCkKICAgIGZpXSkKCkFDX0FSR19FTkFCTEUoZGVidWdnaW5nLApbICAtLWVuYWJsZS1kZWJ1Z2dpbmcgICAgICAgICAgICAgIE91dHB1dHMgZXh0cmEgZGVidWdnaW5nIGluZm9ybWF0aW9uIGF0IGFsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMuICBOb3JtYWxseSwgeW91IHNob3VsZCBub3QgZW5hYmxlIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaW5zdGVhZCB1c2UgdGhlIC1EIGZsYWcgb2YgdGhlIGNvbW1hbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdG9nZ2xlcyBkZWJidWdpbmcgb3V0cHV0IGF0IHJ1bnRpbWUuCiAgLS1kaXNhYmxlLWRlYnVnZ2luZyAgICAgICAgICAgICBEaXNhbGxvd3MgZGVidWdnaW5nIGNvZGUgdG8gYmUgYnVpbHQgaW4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1pZ2h0IHByb3ZpZGUgc29tZSBzcGVlZCBiZW5lZml0cy5dLAogICAgQUNfREVGSU5FKFNOTVBfQUxXQVlTX0RFQlVHKSkKCkFDX0FSR19FTkFCTEUoZGV2ZWxvcGVyLApbICAtLWVuYWJsZS1kZXZlbG9wZXIgICAgICAgICAgICAgIFR1cm5zIG9uIHN1cGVyLWR1cGVyLWV4dHJhLWNvbXBpbGUtd2FybmluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdXNpbmcgZ2NjLl0sCiAgICBkZXZlbG9wZXI9eWVzKQoKaWYgdGVzdCAieCRlbmFibGVfZGVidWdnaW5nIiA9ICJ4bm8iOyB0aGVuCiAgICBBQ19ERUZJTkUoU05NUF9OT19ERUJVR0dJTkcpCmZpCgpBQ19BUkdfV0lUSChkbWFsbG9jLApbICAtLXdpdGgtZG1hbGxvYz1QQVRIICAgICAgICAgICAgIFVzZSBkbWFsbG9jIGxpYnJhcnkgKHd3dy5kbWFsbG9jLmNvbSldLAogICAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIjsgdGhlbgogICAgICBMSUJTPSIkTElCUyAtbGRtYWxsb2MiCiAgICAgIEFDX0RFRklORShIQVZFX0RNQUxMT0NfSCkKICAgIGVsaWYgdGVzdCAtZCAiJHdpdGh2YWwiOyB0aGVuCiAgICAgIEFDX0FERF9TRUFSQ0hfUEFUSCgkd2l0aHZhbCkKICAgICAgTElCUz0iJExJQlMgLWxkbWFsbG9jIgogICAgICBBQ19ERUZJTkUoSEFWRV9ETUFMTE9DX0gpCiAgICBmaQopCkFDX1NVQlNUKEhBVkVfRE1BTExPQ19IKQoKQUNfQVJHX1dJVEgoZWZlbmNlLApbICAtLXdpdGgtZWZlbmNlICAgICAgICAgICAgICAgICAgIExvb2sgZm9yIGFuZCB1c2UgbGliZWZlbmNlIChtYWxsb2MpLl0sCiAgICAgIHVzZV9lZmVuY2U9IiR3aXRodmFsIikKCnRyeXJzYXJlZj1ubwpBQ19BUkdfV0lUSChyc2FyZWYsClsgIC0td2l0aC1yc2FyZWY9UEFUSCAgICAgICAgICAgICAgTG9vayBmb3IgbGlicnNhcmVmIGluIFBBVEgvbGliLl0sCiAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInh5ZXMiOyB0aGVuCiAgICAgIHRyeXJzYXJlZj15ZXMKICAgIGVsaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iOyB0aGVuCiAgICAgIHRyeXJzYXJlZj1ubwogICAgZWxpZiB0ZXN0IC1kICIkd2l0aHZhbCI7IHRoZW4KICAgICAgQUNfQUREX1NFQVJDSF9QQVRIKCR3aXRodmFsKQogICAgICB0cnlyc2FyZWY9eWVzCiAgICBmaSwKKQoKdHJ5b3BlbnNzbD1kZWZhdWx0eWVzCmFza2Vkb3BlbnNzbD1ubwpBQ19BUkdfV0lUSChvcGVuc3NsLApbICAtLXdpdGgtb3BlbnNzbD1QQVRIICAgICAgICAgICAgIExvb2sgZm9yIG9wZW5zc2wgaW4gUEFUSC9saWIuXSwKICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyI7IHRoZW4KICAgICAgdHJ5b3BlbnNzbD15ZXMKICAgICAgYXNrZWRvcGVuc3NsPXllcwogICAgZWxpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KICAgICAgdHJ5b3BlbnNzbD1ubwogICAgZWxpZiB0ZXN0IC1kICIkd2l0aHZhbCI7IHRoZW4KICAgICAgQUNfQUREX1NFQVJDSF9QQVRIKCR3aXRodmFsKQogICAgICB0cnlvcGVuc3NsPXllcwogICAgICBhc2tlZG9wZW5zc2w9eWVzCiAgICBmaSwKKQppZiB0ZXN0ICJ4JHRyeW9wZW5zc2wiID0gInhkZWZhdWx0eWVzIjsgdGhlbgogICAgICBBQ19BRERfU0VBUkNIX1BBVEgoL3Vzci9sb2NhbC9zc2wpCiAgICAgIHRyeW9wZW5zc2w9eWVzCmZpCgpBQ19BUkdfV0lUSChycG0sClsgIC0td2l0aG91dC1ycG0gICAgICAgICAgICAgICAgICBEb24ndCBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBSUE0gcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IHN5c3RlbSB3aGVuIGJ1aWxkaW5nIHRoZSBob3N0IE1JQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuXSkKCkFDX0FSR19FTkFCTEUocHJpdmFjeSwKWyAgLS1kaXNhYmxlLXByaXZhY3kgICAgICAgICAgICAgICBEb24ndCBjb21waWxlIGluIHN1cHBvcnQgZm9yIHByaXZhY3kuXSkKaWYgdGVzdCAieCRlbmFibGVfcHJpdmFjeSIgIT0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoU0NBUElfQVVUSFBSSVYpCmZpCgpBQ19BUkdfRU5BQkxFKGludGVybmFsLW1kNSwKWyAgLS1lbmFibGUtaW50ZXJuYWwtbWQ1ICAgICAgICAgICBVc2UgdGhlIGludGVybmFsIE1ENSBzdXBwb3J0Ll0sCkFDX0RFRklORShVU0VfSU5URVJOQUxfTUQ1KSkKCgpBQ19BUkdfV0lUSChvcGFxdWUtc3BlY2lhbC10eXBlcywKWyAgLS13aXRob3V0LW9wYXF1ZS1zcGVjaWFsLXR5cGVzICBEb24ndCB1c2Ugc3BlY2lhbCBvcGFxdWUgZW5jb2RpbmdzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUCBub3JtYWxseSBjYW5ub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdGluZyBudW1iZXJzLCBub3IgbGFyZ2UgNjQgYml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyB3ZWxsLiAgQnkgZGVmYXVsdCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXQtc25tcCBwYWNrYWdlIGNvbXBpbGVzIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciB0aGVzZSBleHRyYSBkYXRhdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiBhIGxlZ2FsIHdheSldKQoKQUNfQVJHX1dJVEgobWliZGlycywKWyAgLS13aXRoLW1pYmRpcnM9XCJkaXIxOmRpcjI6XCIgICAgIERlZmF1bHQgZGlyZWN0b3JpZXMgdG8gbG9vayBmb3IgbWlicy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERlZmF1bHQ6IFwkSE9NRS8uc25tcC9taWJzOkRBVEFESVIvc25tcC9taWJzKV0sCiAgICBbREVGQVVMVF9NSUJESVJTPSIkd2l0aF9taWJkaXJzIgogICAgQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfTUlCRElSUywiJHdpdGhfbWliZGlycyIpXSkKCkFDX0FSR19XSVRIKG1pYnMsClsgIC0td2l0aC1taWJzPVwiaXRlbTE6aXRlbTI6XCIgICAgICBEZWZhdWx0IG1pYiBJRHMgdG8gcmVhZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRoZSBkZWZhdWx0IGxpc3QgaXMgXCJJUC1NSUI6SUYtTUlCOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1AtTUlCOlVEUC1NSUI6U05NUHYyLU1JQjpSRkMxMjEzLU1JQlwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGFkZGl0aW9uIG9mIGFueSBtaWJzIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIG1pYiBtb2R1bGVzIHRoZSBhZ2VudCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkIHdpdGgpXSwKICAgIERFRkFVTFRfTUlCUz0iJHdpdGhfbWlicyIpCgpBQ19BUkdfV0lUSChtaWJmaWxlcywKWyAgLS13aXRoLW1pYmZpbGVzPVwiZmlsZTE6ZmlsZTJcIiAgIERlZmF1bHQgbWliIGZpbGVzIHRvIGxvYWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiAgbm9uZS4gIHVzZXMgSURzIGFib3ZlIGluc3RlYWQuKV0sCiAgICBBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9NSUJGSUxFUywiJHdpdGhfbWliZmlsZXMiKSkKCgpBQ19BUkdfRU5BQkxFKHRlc3RpbmctY29kZSwKWyAgLS1lbmFibGUtdGVzdGluZy1jb2RlICAgICAgICAgICBFbmFibGVzIHNvbWUgY29kZSBzZWN0aW9ucyB0aGF0IHNob3VsZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZyBvZiBjZXJ0YWluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QIGZ1bmN0aW9uYWxpdGllcy4gIFRoaXMgc2hvdWxkICpub3QqIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdHVybmVkIG9uIGZvciBwcm9kdWN0aW9uIHVzZS4gIEV2ZXIuXSwKICAgIEFDX0RFRklORShTTk1QX1RFU1RJTkdfQ09ERSkpCgpBQ19BUkdfRU5BQkxFKHJlZW50cmFudCwKWyAgLS1lbmFibGUtcmVlbnRyYW50ICAgICAgICAgICAgICBFbmFibGVzIGxvY2tpbmcgZnVuY3Rpb25zIHRoYXQgcHJvdGVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSByZXNvdXJjZXMgaW4gc29tZSBtdWx0aS10aHJlYWRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50cy4gIFRoaXMgZG9lcyBub3QgZ3VhcmFudGVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtc2FmZSBvcGVyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgYW4gZXhwZXJpbWVudGFsIHNldHRpbmcuXSwKICAgIHdpdGhfcmVzX2xvY2tzPSJ5ZXMiLHdpdGhfcmVzX2xvY2tzPSJubyIpCgpBQ19BUkdfV0lUSChyb290LWFjY2VzcywKWwpDb25maWd1cmluZyB0aGUgYWdlbnQ6CiAgLS13aXRob3V0LXJvb3QtYWNjZXNzICAgICAgICAgICBUaGUgc25tcGQgYWdlbnQgd29uJ3QgcmVxdWlyZSByb290IGFjY2VzcyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIGl0LiAgVGhlIGluZm9ybWF0aW9uIGl0IHJldHVybnMgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWItSUkgdHJlZSBtYXkgbm90IGJlIGNvcnJlY3QsIGhvd2V2ZXIuXSkKCkFDX0FSR19XSVRIKGttZW0tdXNhZ2UsClsKQ29uZmlndXJpbmcgdGhlIGFnZW50OgogIC0td2l0aG91dC1rbWVtLXVzYWdlICAgICAgICAgICAgRG8gbm90IGluY2x1ZGUgYW55IGNvZGUgcmVsYXRlZCB0byB0aGUgdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBrbWVtLiBUaGlzIG9wdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvcHRpb24gLS1lbmFibGUtbWluaS1hZ2VudC5dKQoKQUNfQVJHX1dJVEgoZHVtbXktdmFsdWVzLApbICAtLXdpdGgtZHVtbXktdmFsdWVzICAgICAgICAgICAgIFByb3ZpZGUgJ3BsYWNlaG9sZGVyJyBkdW1teSB2YWx1ZXMgd2hlcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGVjaG5pY2FsbHkgbm90IGNvbXBsaWFudCB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUCBzcGVjaWZpY2F0aW9ucywgYnV0IHdhcyBob3cgdGhlIGFnZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRlZCBmb3IgdmVyc2lvbnMgPCA0LjAuXSkKCkFDX0FSR19XSVRIKHBlcnNpc3RlbnQtZGlyZWN0b3J5LApbICAtLXdpdGgtcGVyc2lzdGVudC1kaXJlY3Rvcnk9XCJkaXJlY3RvcnlcIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBkaXJlY3RvcnkgZm9yIHBlcnNpc3RlbnQgZGF0YSBzdG9yYWdlLl0sYWNfY3ZfdXNlcl9wcm9tcHRfUEVSU0lTVEVOVF9ESVJFQ1RPUlk9IiR3aXRoX3BlcnNpc3RlbnRfZGlyZWN0b3J5IikKCkFDX0FSR19XSVRIKGNvcHlfcGVyc2lzdGVudF9maWxlcywKWyAgLS13aXRoLWNvcHktcGVyc2lzdGVudC1maWxlcz1cIm5vXCIgRG9uJ3QgY29weSBwZXJzaXN0ZW50IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciB1c2UgXCJ5ZXNcIiB0byBjb3B5IHRoZW0pLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVmYXVsdDogeWVzKV0sCiAgICBhY19jdl91c2VyX3Byb21wdF9DT1BZX1BFUlNJU1RFTlRfRklMRVM9IiR3aXRoX2NvcHlfcGVyc2lzdGVudF9maWxlcyIpCgpBQ19BUkdfV0lUSChkZWZhdWx0LXNubXAtdmVyc2lvbiwKWyAgLS13aXRoLWRlZmF1bHQtc25tcC12ZXJzaW9uPVwiM1wiIERlZmF1bHQgdmVyc2lvbiBvZiBTTk1QIHRvIHVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiAzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWwgdmFsdWVzOiAxLCAyIChmb3IgU05NUHYyYykgb3IgMy5dLAogICAgYWNfY3ZfdXNlcl9wcm9tcHRfREVGQVVMVF9TTk1QX1ZFUlNJT049IiR3aXRoX2RlZmF1bHRfc25tcF92ZXJzaW9uIikKCiMgd2UgdGVzdCB0aGlzIG5vdyBhbmQgbGF0ZXIgYXMgd2VsbC4gIHdlIHRlc3QgaXQgbm93IHNvIGNvbmZpZ3VyZSBjYW4gZGllCiMgZWFybHkgb24gd2l0aCBhbiBlcnJvciByYXRoZXIgdGhhbiB3YWl0aW5nIHRpbGwgdGhlIGVuZCBvZiB0aGUgc2NyaXB0LgppZiB0ZXN0ICJ4JGFjX2N2X3VzZXJfcHJvbXB0X0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAieCI7IHRoZW4KICBpZiB0ZXN0ICIkYWNfY3ZfdXNlcl9wcm9tcHRfREVGQVVMVF9TTk1QX1ZFUlNJT04iICE9ICIxIiAtYSAiJGFjX2N2X3VzZXJfcHJvbXB0X0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMiIgLWEgIiRhY19jdl91c2VyX3Byb21wdF9ERUZBVUxUX1NOTVBfVkVSU0lPTiIgIT0gIjMiOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoSWxsZWdhbCB2ZXJzaW9uIG51bWJlciBwYXNzZWQgdG8gLS13aXRoLWRlZmF1bHQtc25tcC12ZXJzaW9uKQogIGZpCmZpCgpBQ19BUkdfV0lUSChzeXNfY29udGFjdCwKWyAgLS13aXRoLXN5cy1jb250YWN0PVwid2hvQHdoZXJlXCIgIERlZmF1bHQgc3lzdGVtIGNvbnRhY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiBMT0dJTkBET01BSU5OQU1FKV0sCiAgICBhY19jdl91c2VyX3Byb21wdF9TWVNfQ09OVEFDVD0iJHdpdGhfc3lzX2NvbnRhY3QiKQoKQUNfQVJHX1dJVEgoc3lzX2xvY2F0aW9uLApbICAtLXdpdGgtc3lzLWxvY2F0aW9uPVwibG9jYXRpb25cIiAgRGVmYXVsdCBzeXN0ZW0gbG9jYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiBVbmtub3duKV0sCiAgICBhY19jdl91c2VyX3Byb21wdF9TWVNfTE9DPSIkd2l0aF9zeXNfbG9jYXRpb24iKQoKQUNfQVJHX1dJVEgobG9nZmlsZSwKWyAgLS13aXRoLWxvZ2ZpbGU9XCJsb2NhdGlvblwiICAgICAgIERlZmF1bHQgbG9nIGZpbGUgbG9jYXRpb24gZm9yIHNubXBkLl0sCiAgICBhY19jdl91c2VyX3Byb21wdF9MT0dGSUxFPSIkd2l0aF9sb2dmaWxlIikKCiMgVGhpcyBjYW4ndCBiZSB3aXRoaW4gQUNfQVJHX1dJVEguICBJIGRvbid0IHdhbnQgdG8gcmVhZCBhdXRvY29uZiBtNAojIHRvIGZpbmQgb3V0IHdoeS4KQUNfU1VCU1QoV1JBUExJQlMpCgpBQ19BUkdfV0lUSCh0cmFuc3BvcnRzLApbICAtLXdpdGgtdHJhbnNwb3J0cz1cInQxIHQyIC4uLlwiICAgQ29tcGlsZSBpbiB0aGUgZ2l2ZW4gU05NUCB0cmFuc3BvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyAoc3BhY2Ugc2VwYXJhdGVkIGxpc3QpLl0pCkFDX0FSR19XSVRIKG91dF90cmFuc3BvcnRzLApbICAtLXdpdGgtb3V0LXRyYW5zcG9ydHM9XCJ0MSAuLi5cIiAgRXhjbHVkZSBsaXN0ZWQgU05NUCB0cmFuc3BvcnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcGFjZSBzZXBhcmF0ZWQgbGlzdCkuCgogIEF2YWlsYWJsZSBTTk1QIHRyYW5zcG9ydCBtb2R1bGVzIGFyZToKCiAgICBVRFAgICAgICAgICBzdXBwb3J0IGZvciBTTk1QIG92ZXIgVURQL0lQLgogICAgICAgICAgICAgICAgVGhpcyB0cmFuc3BvcnQgaXMgYWx3YXlzIGNvbXBpbGVkIGluLgogICAgVURQSVB2NiAgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIFVEUC9JUHY2LgogICAgICAgICAgICAgICAgVGhpcyB0cmFuc3BvcnQgaXMgYXZhaWxhYmxlIGZvciBMaW51eCwgU29sYXJpcyBhbmQKICAgICAgICAgICAgICAgIEZyZWVCU0QuCiAgICAgICAgICAgICAgICBJdCBpcyBuZXZlciBjb21waWxlZCBpbiBieSBkZWZhdWx0LgogICAgVENQSVB2NiAgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIFVEUC9JUHY2LgogICAgICAgICAgICAgICAgVGhpcyB0cmFuc3BvcnQgaXMgYXZhaWxhYmxlIGZvciBMaW51eCwgU29sYXJpcyBhbmQKICAgICAgICAgICAgICAgIEZyZWVCU0QuCiAgICAgICAgICAgICAgICBJdCBpcyBuZXZlciBjb21waWxlZCBpbiBieSBkZWZhdWx0LgogICAgVENQICAgICAgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIFRDUC9JUC4KICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNwb3J0IGlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQsIGJ1dCBtYXkgYmUgb21pdHRlZC4KICAgIFVuaXggICAgICAgIHN1cHBvcnQgZm9yIFNOTVAgb3ZlciBVbml4IGRvbWFpbiBwcm90b2NvbHMuCiAgICAgICAgICAgICAgICBUaGlzIHRyYW5zcG9ydCBpcyBjb21waWxlZCBpbiBieSBkZWZhdWx0IGV4Y2VwdCBvbiBXaW4zMgogICAgICAgICAgICAgICAgcGxhdGZvcm1zLCBhbmQgbWF5IGJlIG9taXR0ZWQuCiAgICBDYWxsYmFjayAgICBzdXBwb3J0IGZvciBTTk1QIG92ZXIgYW4gaW50ZXJuYWwgbG9jYWxseSBjb25uZWN0ZWQgcGFpcgogICAgICAgICAgICAgICAgb2Ygc25tcF9zZXNzaW9ucy4KICAgIEFBTDVQVkMgICAgIHN1cHBvcnQgZm9yIFNOTVAgb3ZlciBBQUw1IFBWQ3MuCiAgICAgICAgICAgICAgICBUaGlzIHRyYW5zcG9ydCBpcyBwcmVzZW50bHkgb25seSBhdmFpbGFibGUgZm9yIExpbnV4LAogICAgICAgICAgICAgICAgaXMgbmV2ZXIgY29tcGlsZWQgaW4gYnkgZGVmYXVsdCBhbmQgbWF5IGJlIG9taXR0ZWQuCiAgICBJUFggICAgICAgICBzdXBwb3J0IGZvciBTTk1QIG92ZXIgSVBYIHBlciBSRkMgMTQyMC4KICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNwb3J0IGlzIHByZXNlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgTGludXgsCiAgICAgICAgICAgICAgICBpcyBuZXZlciBjb21waWxlZCBpbiBieSBkZWZhdWx0IGFuZCBtYXkgYmUgb21pdHRlZC4KXSkKCiMKIyBDYXRjaCBjb21tb24gbWlzdGFrZXMgaW4gdHJhbnNwb3J0IG9wdGlvbnMKIwpBQ19BUkdfV0lUSCh0cmFuc3BvcnQsLCAgICBBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC10cmFuc3BvcnRzIGluc3RlYWQgXSkgICAgICkKQUNfQVJHX1dJVEgob3V0LXRyYW5zcG9ydCwsQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtb3V0LXRyYW5zcG9ydHMgaW5zdGVhZCBdKSApCgojCiMgc2VjdXJpdHkgbW9kdWxlcwojCgpBQ19BUkdfV0lUSChzZWN1cml0eS1tb2R1bGVzLApbICAtLXdpdGgtc2VjdXJpdHktbW9kdWxlcz1cInMxIHMyIC4uLlwiICAgQ29tcGlsZSBpbiB0aGUgZ2l2ZW4gU05NUCBzZWN1cml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgc2VydmljZXMgKHNwYWNlIHNlcGFyYXRlZCBsaXN0KS4KCiAgQXZhaWxhYmxlIFNOTVAgc2VjdXJpdHkgc2VydmljZXM6CgogICAgICAgIHVzbSAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciB1c2VyIGJhc2VkIFNOTVAgc2VjdXJpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmVkIGFuZCBhbHdheXMgY29tcGlsZWQgaW4pCiAgICAgICAga3NtICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIGtlcmJlcm9zIGJhc2VkIFNOTVAgc2VjdXJpdHkKXSkKCiMKIyBtaWIgbW9kdWxlcwojCgpBQ19BUkdfV0lUSChtaWJfbW9kdWxlcywKWyAgLS13aXRoLW1pYi1tb2R1bGVzPVwiaXRlbTEgLi4uXCIgIENvbXBpbGUgd2l0aCBhZGRpdGlvbmFsIG1pYiBtb2R1bGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTcGFjZSBzZXBhcmF0ZWQgbGlzdCkuXSkKCkFDX0FSR19XSVRIKG91dF9taWJfbW9kdWxlcywKWyAgLS13aXRoLW91dC1taWItbW9kdWxlcz1cImxpc3RcIiAgIENvbXBpbGUgd2l0aG91dCB0aGVzZSBtaWIgbW9kdWxlcy4KCiAgRGVmYXVsdCBtaWIgbW9kdWxlcyBjb21waWxlZCBpbnRvIHRoZSBhZ2VudCAod2hpY2ggY2FuIGJlIHJlbW92ZWQpOgogIAogICAgbWliSUkgICAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciB0aGUgbWliLUlJIHRyZWUuCiAgICBzbm1wdjNtaWJzICAgICAgICAgICAgIHN1cHBvcnQgZm9yIHRoZSBzbm1wdjMgbWliIG1vZHVsZXMuCiAgICB1Y2Rfc25tcCAgICAgICAgICAgICAgIFVDRC1TTk1QLU1JQiBzcGVjaWZpYyBleHRlbnNpb25zLgogICAgYWdlbnRfbWlicyAgICAgICAgICAgICBORVQtU05NUC1BR0VOVC1NSUIgZXh0ZW5zaW9ucwogICAgYWdlbnR4ICAgICAgICAgICAgICAgICAoc2VlIGJlbG93KQogICAgbm90aWZpY2F0aW9uICAgICAgICAgICBtaWJzIHN1cHBvcnRpbmcgc3BlY2lmaWNhdGlvbiBvZiB0cmFwIGRlc3RpbmF0aW9ucy4KICAgIHRhcmdldCAgICAgICAgICAgICAgICAgU3VwcG9ydCBmb3IgdGhlIFNOTVAgV0dzIFRBUkdFVC1NSUIuCiAgICB1dGlsaXRpZXMgICAgICAgICAgICAgIGdlbmVyYWwgYWdlbnQgY29uZmlndXJhdGlvbiB1dGlsaXRpZXMuCgogIE9wdGlvbmFsIG1pYiBtb2R1bGVzIHRoYXQgY2FuIGJlIGJ1aWx0IGludG8gdGhlIGFnZW50IGluY2x1ZGU6CiAgICBob3N0ICAgICAgICAgICAgICAgICAgIGhvc3QgcmVzb3VyY2VzIG1pYiBzdXBwb3J0LgogICAgZGlzbWFuL2V2ZW50LW1pYiAgICAgICBzdXBwb3J0IGZvciB0aGUgRElTTUFOLUVWRU5ULU1JQiAoYmV0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VwcG9ydHMgc2VsZiBtb25pdG9yaW5nIGFuZCBub3RpZmljYXRpb24gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5IHdoZW4gZXJyb3IgY29uZGl0aW9ucyBhcmUgZm91bmQpCiAgICBzbXV4ICAgICAgICAgICAgICAgICAgIHNtdXggc3VwcG9ydCB0byBhbGxvdyBzdWJhZ2VudHMgdG8gYXR0YWNoIHRvIHNubXBkLgogICAgbWliSUkvbXRhX3NlbmRtYWlsICAgICBTZW5kbWFpbCBzdGF0aXN0aWNzIG1vbml0b3JpbmcgKE1UQS1NSUIpCiAgICBtaXNjL2lwZndhY2MgICAgICAgICAgIGFjY291bnRpbmcgcnVsZXMgSVAgZmlyZXdhbGwgaW5mb3JtYXRpb24gKGxpbnV4KS4KICAgIGlwZndjaGFpbnMvaXBmd2NoYWlucyAgZmlyZXdhbGwgY2hhaW5zIHVuZGVyIGlwZncgZm9yIGxpbnV4LgogICAgICAgICAgICAgICAgICAgICAgICAgICAoRG93bmxvYWQgc2VwYXJhdGVseSBmcm9tIHRoZSB1Y2Qtc25tcCBmdHAgc2l0ZS4pCiAgICB1Y2Qtc25tcC9kaXNraW8gICAgICAgIFRhYmxlIG9mIGlvLWRldmljZXMgYW5kIGhvdyBtdWNoIGRhdGEgdGhleSBoYXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQvd3JpdHRlbi4gIChvbmx5IHRlc3RlZCBvbiBTb2xhcmlzLCBMaW51eCkKICAgIHR1bm5lbCAgICAgICAgICAgICAgICAgTGludXggVFVOTkVMLU1JQiBzdXBwb3J0IChpZlRhYmxlIGV4dGVuc2lvbikKCiAgQWdlbnRYIHN1cHBvcnQ6CiAgICBhZ2VudHgvc3ViYWdlbnQgICAgICAgIGFsbG93cyB0aGUgYWdlbnQgdG8gcnVuIGFzIGVpdGhlciBhIHNubXAgYWdlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXMgYW4gYWdlbnRYIHN1Yi1hZ2VudC4KICAgIGFnZW50eC9tYXN0ZXIgICAgICAgICAgbWFrZXMgdGhlIGFnZW50IHJ1biBhcyBhbiBhZ2VudFggbWFzdGVyIGFnZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHdlbGwgYXMgYSBub3JtYWwgc25tcCBhZ2VudC4KICAgIGFnZW50eCAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYm90aCBhZ2VudHgvbWFzdGVyIGFuZCBhZ2VudHgvY2xpZW50LgoKICBPcHRpb25hbCBtb2R1bGVzIGZvciBDIGNvZGVycyB0byBsb29rIGF0IGFuZC9vciBpbmNsdWRlIGFzIGV4dGVuc2lvbiBleGFtcGxlczoKICAKICAgIGV4YW1wbGVzL3VjZERlbW9QdWJsaWMgIFNOTVB2MyBpbnRlcm9wZXJhYmlsaXR5IHRlc3RpbmcgbWliLgogICAgZXhhbXBsZXMvZXhhbXBsZSAgICAgICAgZXhhbXBsZSBDIGNvZGUgZXh0ZW5zaW9uLl0pCgoKIwpBQ19BUkdfV0lUSChlbnRlcnByaXNlLW9pZCwKW0VudGVycHJpc2UgT0lEczogICh3YXJuaW5nOiB0aGlzIHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbi4pCgogIC0td2l0aC1lbnRlcnByaXNlLW9pZCAgICAgICAgICAgICAgVGhlIGVudGVycHJpc2UgbnVtYmVyIGFzc2lnbmVkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yIGJ5IElBTkEuICBTZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuaWFuYS5vcmcvY2dpLWJpbi9lbnRlcnByaXNlLnBsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBnZXQgb25lLCB0aG91Z2ggdXNpbmcgdGhlIGRlZmF1bHQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5IHRoZSByaWdodCBjaG9pY2UgaXMgbW9zdCBjYXNlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDgwNzIgPSAiZW50ZXJwcmlzZS5uZXQtc25tcCIpXSxbCiAgaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWyBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgZW50ZXJwcmlzZSBudW1iZXIgXSk7CiAgZmkKICBBQ19ERUZJTkVfVU5RVU9URUQoRU5URVJQUklTRV9PSUQsICR3aXRodmFsKQogIGVudF9vaWQ9IjEsMyw2LDEsNCwxLCR3aXRodmFsIgogIEFDX0RFRklORV9VTlFVT1RFRChFTlRFUlBSSVNFX01JQiwgJGVudF9vaWQpCiAgZW50X2RvdF9vaWQ9IjEuMy42LjEuNC4xLiR3aXRodmFsIgogIEFDX0RFRklORV9VTlFVT1RFRChFTlRFUlBSSVNFX0RPVF9NSUIsICRlbnRfZG90X29pZCkKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGVudGVycHJpc2UgbnVtYmVyICR3aXRodmFsKQpdLFsKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGRlZmF1bHQgImVudGVycHJpc2UubmV0LXNubXAiKQpdKQoKQUNfQVJHX1dJVEgoZW50ZXJwcmlzZS1zeXNvaWQsClsKICAtLXdpdGgtZW50ZXJwcmlzZS1zeXNvaWQgICAgICAgICAgIFRoZSBiYXNlIE9JRCBmb3IgdGhlIHN5c09iamVjdElECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc3lzdGVtIGdyb3VwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAuMS4zLjYuMS40LjEuODA3Mi4zLjIuLi4gPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV0U25tcEFnZW50T0lEcy4uLiIpXSxbCiAgaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWyBQbGVhc2UgcHJvdmlkZSBhIGJhc2UgT0lEIHZhbHVlIF0pOwogIGZpCiAgc3lzX29pZD1gZWNobyAiJHdpdGh2YWwiIHwgc2VkICdzL15cLi8vJyB8IHNlZCAncy9cLi9cLC9nJ2AKICBBQ19ERUZJTkVfVU5RVU9URUQoU1lTVEVNX01JQiwgJHN5c19vaWQpCiAgc3lzX2RvdF9vaWQ9YGVjaG8gIiR3aXRodmFsIiB8IHNlZCAncy9eXC4vLydgCiAgQUNfREVGSU5FX1VOUVVPVEVEKFNZU1RFTV9ET1RfTUlCLCAkc3lzX2RvdF9vaWQpCiAgc3lzb2lkX2xlbj1gZWNobyAiJHdpdGh2YWwiIHwgc2VkICdzL1teXC5dLy9nJyB8IGF3ayAtRlwuICd7IHByaW50IE5GIH0nYAogIEFDX0RFRklORV9VTlFVT1RFRChTWVNURU1fRE9UX01JQl9MRU5HVEgsICRzeXNvaWRfbGVuKQogIEFDX01TR19SRVNVTFQodXNpbmcgZW50ZXJwcmlzZSBzeXNPSUQgJHdpdGh2YWwgLi4uLikKXSxbCiAgQUNfTVNHX1JFU1VMVCh1c2luZyBkZWZhdWx0IGVudGVycHJpc2Ugc3lzT0lEICJORVQtU05NUC1NSUI6Om5ldFNubXBBZ2VudE9JRHMuLi4iKQpdKQoKQUNfQVJHX1dJVEgoZW50ZXJwcmlzZS1ub3RpZmljYXRpb24tb2lkLApbCiAgLS13aXRoLWVudGVycHJpc2Utbm90aWZpY2F0aW9uLW9pZCBUaGUgT0lEIHVzZWQgZm9yIHRoZSByb290IG9mCgkJCQkgICAgIGVudGVycHJpc2Ugc3BlY2lmaWMgbm90aWZpY2F0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IC4xLjMuNi4xLjQuMS4yMDIxID0gImVudGVycHJpc2UudWNkYXZpcyIpXSxbCiAgaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWyBQbGVhc2UgcHJvdmlkZSBhIGJhc2UgT0lEIHZhbHVlIF0pOwogIGZpCiAgbm90aWZpY2F0aW9uX29pZD1gZWNobyAiJHdpdGh2YWwiIHwgc2VkICdzL15cLi8vJyB8IHNlZCAncy9cLi9cLC9nJ2AKICBBQ19ERUZJTkVfVU5RVU9URUQoTk9USUZJQ0FUSU9OX01JQiwgJG5vdGlmaWNhdGlvbl9vaWQpCiAgbm90aWZpY2F0aW9uX2RvdF9vaWQ9YGVjaG8gIiR3aXRodmFsIiB8IHNlZCAncy9eXC4vLydgCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5PVElGSUNBVElPTl9ET1RfTUlCLCAkbm90aWZpY2F0aW9uX2RvdF9vaWQpCiAgbm90aWZpY2F0aW9ub2lkX2xlbj1gZWNobyAiJHdpdGh2YWwiIHwgc2VkICdzL1teXC5dLy9nJyB8IGF3ayAtRlwuICd7IHByaW50IE5GIH0nYAogIEFDX0RFRklORV9VTlFVT1RFRChOT1RJRklDQVRJT05fRE9UX01JQl9MRU5HVEgsICRub3RpZmljYXRpb25vaWRfbGVuKQogIEFDX01TR19SRVNVTFQodXNpbmcgZW50ZXJwcmlzZSBub3RpZmljYXRpb25zICR3aXRodmFsKQpdLFsKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGRlZmF1bHQgbm90aWZpY2F0aW9ucyAiTkVULVNOTVAtTUlCOjpuZXRTbm1wTm90aWZpY2F0aW9ucyIpCl0pCiMKIyBDYXRjaCBjb21tb24gbWlzdGFrZXMgaW4gY29uZmlndXJlIG9wdGlvbnMKIwpBQ19BUkdfV0lUSChtaWItbW9kdWxlLCwgICAgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24xLiBVc2UgLS13aXRoLW1pYi1tb2R1bGVzIGluc3RlYWQgXSkgICAgICkKQUNfQVJHX1dJVEgobW9kdWxlLCwgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24zLiBVc2UgLS13aXRoLW1pYi1tb2R1bGVzIGluc3RlYWQgXSkgKQpBQ19BUkdfV0lUSChtb2R1bGVzLCwgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb240LiBVc2UgLS13aXRoLW1pYi1tb2R1bGVzIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgob3V0LW1pYi1tb2R1bGUsLEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uNS4gVXNlIC0td2l0aC1vdXQtbWliLW1vZHVsZXMgaW5zdGVhZCBdKSApCkFDX0FSR19XSVRIKG91dC1tb2R1bGVzLCwgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb243LiBVc2UgLS13aXRoLW91dC1taWItbW9kdWxlcyBpbnN0ZWFkIF0pICkKQUNfQVJHX1dJVEgob3V0LW1vZHVsZSwsIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uOC4gVXNlIC0td2l0aC1vdXQtbWliLW1vZHVsZXMgaW5zdGVhZCBdKSApCgojCiMgUGVybCBzcGVjaWZpYwojCkFDX0FSR19XSVRIKHBlcmwtbW9kdWxlcywKWwpQZXJsOgogIC0td2l0aC1wZXJsLW1vZHVsZXNbPUFSR1NdICAgICAgSW5zdGFsbCB0aGUgcGVybCBtb2R1bGVzIGFsb25nIHdpdGggdGhlIHJlc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBuZXQtc25tcCB0b29sa2l0LiAgSWYgQVJHUyBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGV5J3JlIHBhc3NlZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VmaWxlLlBMIHNjcmlwdC5dLFsKICAgIGluc3RhbGxfcGVybD15ZXMKICAgIGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgogICAgICBQRVJMQVJHUz0iIgogICAgZWxzZQogICAgICBQRVJMQVJHUz0iJHdpdGh2YWwiCiAgICBmaQpdKQoKQUNfQVJHX0VOQUJMRShlbWJlZGRlZC1wZXJsLApbCiAgLS1lbmFibGUtZW1iZWRkZWQtcGVybCAgICAgICAgICBFbWJlZCBwZXJsIGluIHRoZSBTTk1QIGFnZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlcyAtLXdpdGgtcGVybC1tb2R1bGVzIGFzIHdlbGwuXV0sCiAgICBlbWJlZF9wZXJsPSJ5ZXMiLCBlbWJlZF9wZXJsPSJubyIpCgojIENvbW1vbiBwZXJsIG1pc3Rha2VzCkFDX0FSR19FTkFCTEUocGVybC1tb2R1bGVzLCwgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtcGVybC1tb2R1bGVzIGluc3RlYWQgXSkgKQoKIwojIG90aGVyd2lzZSBwcm9tcHRlZCBpbmZvcm1hdGlvbgojCkFDX0FSR19XSVRIKGRlZmF1bHRzLApbCk1pc2NlbGxhbmVvdXM6CiAgLS13aXRoLWRlZmF1bHRzICAgICAgICAgIFVzZSBkZWZhdWx0cyBmb3IgcHJvbXB0ZWQgdmFsdWVzLl0sCiAgICBkZWZhdWx0cz0ieWVzIixkZWZhdWx0cz0ibm8iKQoKQUNfQVJHX0VOQUJMRSh1Y2Qtc25tcC1jb21wYXRpYmlsaXR5LApbLS1lbmFibGUtdWNkLXNubXAtY29tcGF0aWJpbGl0eSAgSW5zdGFsbCB1Y2Qtc25tcCBsb29rLWFsaWtlIGhlYWRlcnMgYW5kIGxpYnMuXSwgdWNkX2NvbXBhdD15ZXMsIHVjZF9jb21wYXQ9bm8pCiMKIyBzZXR1cCBpbnN0YWxsIHRhcmdldHMKIwppZiB0ZXN0ICJ4JHVjZF9jb21wYXQiICE9ICJ4bm8iIDsgdGhlbgkKICBpbnN0YWxsdWNkaGVhZGVycz1pbnN0YWxsdWNkaGVhZGVycwogIGluc3RhbGx1Y2RsaWJzPWluc3RhbGx1Y2RsaWJzCiAgQUNfTVNHX0NBQ0hFX0FERChVQ0QtU05NUCBjb21wYXRhYmlsaXR5OiAgICAgZW5hYmxlZCkKZmkKQUNfU1VCU1QoaW5zdGFsbHVjZGhlYWRlcnMpCkFDX1NVQlNUKGluc3RhbGx1Y2RsaWJzKQoKIyBPbmx5IGRlZmluZSBpZiBzcGVjaWZpY2FsbHkgY2hvc2VuIGFzIC0td2l0aG91dCAoaS5lLiwgZGVmYXVsdCB0byB0cnVlKS4gCmlmIHRlc3QgIngkd2l0aF9yb290X2FjY2VzcyIgPSAieG5vIjsgdGhlbgogIEFDX0RFRklORShOT19ST09UX0FDQ0VTUykKZmkKCiMgT25seSBkZWZpbmUgaWYgc3BlY2lmaWNhbGx5IGNob3NlbiBhcyAtLXdpdGhvdXQgKGkuZS4sIGRlZmF1bHQgdG8gdHJ1ZSkuCmlmIHRlc3QgIngkd2l0aF9rbWVtX3VzYWdlIiA9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKE5PX0tNRU1fVVNBR0UpCmZpCgojIERlZmluZSB1bmxlc3Mgc3BlY2lmaWNhbGx5IHN1cHByZXNzZWQgKGkuZS4sIG9wdGlvbiBkZWZhdWx0cyB0byBmYWxzZSkuIAppZiB0ZXN0ICJ4JHdpdGhfZHVtbXlfdmFsdWVzIiAhPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoTk9fRFVNTVlfVkFMVUVTKQpmaQoKIyBPbmx5IGRlZmluZSBpZiBzcGVjaWZpY2FsbHkgY2hvc2VuIGFzIC0td2l0aG91dCAoaS5lLiwgZGVmYXVsdCB0byB0cnVlKS4gCmlmIHRlc3QgIngkd2l0aF9vcGFxdWVfc3BlY2lhbF90eXBlcyIgIT0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoT1BBUVVFX1NQRUNJQUxfVFlQRVMpCmZpCgoKIyBvdmVyZmxvdyBwcm9ibGVtcyB3aXRoIGhwdXgncyBzaAojIHRha2VuIGZyb20gUGVybCdzIENvbmZpZ3VyZSBzY3JpcHQgCgpBQ19NU0dfQ0hFQ0tJTkcoW2lmIEkgbmVlZCB0byBmZWVkIG15c2VsZiB0byBrc2hdKQppZiB0ZXN0IC1mIC9ocC11eCAtYSAtZiAvYmluL2tzaDsgdGhlbgogIGlmIChQQVRIPS47IGFsaWFzIC14KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIEFDX01TR19SRVNVTFQobm8pCiAgZWxzZQogICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICBpZiB0ZXN0ICJ4JDEiID0gIngiOyB0aGVuCiAgICAgIGV4ZWMgL2Jpbi9rc2ggJDAKICAgIGVsc2UKICAgICAgZXhlYyAvYmluL2tzaCAkMCAiJEAiCiAgICBmaQogIGZpCmVsc2UKICBBQ19NU0dfUkVTVUxUKG5vKQpmaQoKaWYgdGVzdCAieCRkZXZlbG9wZXIiICE9ICJ4bm8iIC1hIC1mICRzcmNkaXIvcmVtb3ZlLWZpbGVzOyB0aGVuCiAgIyB0dXJuIG9uIHRoZSBkZXZlbG9wZXIgZmxhZyB3aGVuIHRha2VuIGZyb20gYSBDVlMgY2hlY2tvdXQgKG5vdCBhIHJlbGVhc2UpCiAgZGV2ZWxvcGVyPSJ5ZXMiCmZpCgojIGRpc2FibGUgLS1lbmFibGUtc2hhcmVkIGJ5IGRlZmF1bHQgaW4gY3ZzL2RldmVsb3BlciBjYXNlcy4KaWYgdGVzdCAieCRkZXZlbG9wZXIiID0gInh5ZXMiOyB0aGVuCiAgIyBkb24ndCBkbyBhbnl0aGluZyBpZiBvcHRpb24gc2V0IHZpYSBjbWRsaW5lCiAgaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iICE9IHNldDsgdGhlbgogICAgZW5hYmxlX3NoYXJlZD1ubwogIGZpCmZpCgojIHBlcmwgcmVxdWlyZXMgc2hhcmVkIGxpYnMKaWYgdGVzdCAieCRlbWJlZF9wZXJsIiA9ICJ4eWVzIjsgdGhlbgogICAgaWYgdGVzdCAieCRlbmFibGVfc2hhcmVkIiAhPSAieHllcyI7IHRoZW4KICAgICAgQUNfTVNHX0VSUk9SKC0tZW5hYmxlLWVtYmVkZGVkLXBlcmwgcmVxdWlyZXMgLS1lbmFibGUtc2hhcmVkKQogICAgZmkKZmkKCiMgQUlYIGhhcyBwcm9ibGVtcyB3aXRoIHNoYXJlZCBsaWJzCmNhc2UgJHRhcmdldF9vcyBpbgogICAgYWl4KikKICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdXNpbmcgQUlYIGFuZCBpZiB3ZSBzaG91bGQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzXSkKCUFDX01TR19SRVNVTFQoW3llc10pCgllbmFibGVfc2hhcmVkPW5vCiAgICAgICAgOzsKICAgICopCiAgICAgICAgOzsKZXNhYwoKQUNfUFJPR19DQwpBQ19QUk9HX0NQUApBQ19BSVgKQUNfRVhFRVhUCgojIGxpYnRvb2wgc3R1ZmYgZm9yIHNoYXJlZC9zdGF0aWMgbGlicmFyaWVzLgpBQ19MSUJUT09MX0RMT1BFTgpBQ19MSUJUT09MX1dJTjMyX0RMTApBQ19QUk9HX0xJQlRPT0wKQUNfU1VCU1QoTElCVE9PTF9ERVBTKQoKIyBDaGVja3MgZm9yIHByb2dyYW1zLgpBQ19QUk9HX0lOU1RBTEwKQUNfUFJPR19MTl9TCkFDX1BST0dfTUFLRV9TRVQKQUNfUEFUSF9QUk9HKFtQU1BST0ddLHBzKQpBQ19QQVRIX1BST0coW1BFUkxQUk9HXSxwZXJsKQpBQ19DSEVDS19QUk9HUyhXSE9BTUksIHdob2FtaSBsb2duYW1lLCB3aG9hbWkpCkFDX0NIRUNLX1BST0dTKFNFRCxzZWQgZ3NlZCkKQUNfQ0hFQ0tfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCkFDX0NIRUNLX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlcikKaWYgdGVzdCAieCRhY19jdl9wcm9nX0FVVE9DT05GIiA9ICJ4IjsgdGhlbgoJQVVUT0NPTkY9IjoiCglBQ19TVUJTVChBVVRPQ09ORikKZmkKaWYgdGVzdCAieCRhY19jdl9wcm9nX0FVVE9IRUFERVIiID0gIngiOyB0aGVuCglBVVRPSEVBREVSPSI6IgoJQUNfU1VCU1QoQVVUT0hFQURFUikKZmkKCkFDX1BBVEhfUFJPRyhbVU5BTUVQUk9HXSx1bmFtZSkKQUNfREVGSU5FX1VOUVVPVEVEKFVOQU1FUFJPRywiJFVOQU1FUFJPRyIpCgpBQ19DX0NPTlNUCkFDX0NfSU5MSU5FCgojIGdldCB2ZXJzaW9uIG51bWJlci4KQUNfTVNHX0NIRUNLSU5HKFtmb3IgbmV0LXNubXAgdmVyc2lvbiBudW1iZXJdKQpWRVJTSU9OPWBncmVwIE5ldFNubXBWZXJzaW9uSW5mby4qPSAkc3JjZGlyL3NubXBsaWIvc25tcF92ZXJzaW9uLmMgfCBzZWQgJ3MvIjsuKi8vO3MvLioiLy87cy9wcmUvMC4vOydgCmNoYW5nZXF1b3RlKCwgKQpSRUxFQVNFVkVSU0lPTj1gZWNobyAkVkVSU0lPTiB8IHNlZCAncy9eXChbMC05XVwpXC5cKFswLTldXCkvXDE6XDI6MC8nYApjaGFuZ2VxdW90ZShbLCBdKQpBQ19TVUJTVChWRVJTSU9OKQpBQ19TVUJTVChSRUxFQVNFVkVSU0lPTikKQUNfTVNHX1JFU1VMVCgkVkVSU0lPTikKQUNfTVNHX0NBQ0hFX0FERChOZXQtU05NUCBWZXJzaW9uOiAgICAgICAgICAgJFZFUlNJT04pCgojIHN1cGVyIHR5cGUgY2hlY2tpbmcKIyBXV1dYWFgKQUNfTVNHX0NIRUNLSU5HKFtmb3IgZGV2ZWxvcGVyIGdjYyBmbGFnc10pCmlmIHRlc3QgIngkZGV2ZWxvcGVyIiA9ICJ4eWVzIiAtYSAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCiAgREVWRkxBR1M9Ii1XYWxsIC1XaW5saW5lIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVd3cml0ZS1zdHJpbmdzIC1XY2FzdC1xdWFsIC1Xbm8tY2hhci1zdWJzY3JpcHRzIgplbHNlCiAgREVWRkxBR1M9IiIKZmkKQUNfTVNHX1JFU1VMVCgkREVWRkxBR1MpCkFDX1NVQlNUKERFVkZMQUdTKQoKIyBzeXN0ZW0gY2hlY2sKQUNfQ0FOT05JQ0FMX1RBUkdFVApjaGFuZ2VxdW90ZSgsICkKUEFSVElBTFRBUkdFVE9TPWBlY2hvICR0YXJnZXRfb3MgfCBzZWQgJ3MvWy0uX10uKi8vJ2AKQ0ZMQUdTPSIkQ0ZMQUdTIC1EJFBBUlRJQUxUQVJHRVRPUyIKY2hhbmdlcXVvdGUoWywgXSkKQUNfTVNHX0NBQ0hFX0FERChCdWlsZGluZyBmb3I6ICAgICAgICAgICAgICAgJFBBUlRJQUxUQVJHRVRPUykKCiMKIyBjaGVjayBmb3Igc3BlY2lhbCBpbmNsdWRlcyBhbmQgcGljayBvbmUKIwoKQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3lzdGVtIGluY2x1ZGUgZmlsZV0pCmNoYW5nZXF1b3RlKCwgKQpmaWxlYmFzZT0kdGFyZ2V0X29zCiMgaWdub3JlIGJpbmFyeSBmb3JtYXQgaW5kaWNhdGlvbgpmaWxlYmFzZT1gZWNobyAkZmlsZWJhc2UgfCBzZWQgJ3MvZWxmLy8nYApmaWxlYmFzZT1gZWNobyAkZmlsZWJhc2UgfCBzZWQgJ3MvYW91dC8vJ2AKZmlsZWJhc2U9YGVjaG8gJGZpbGViYXNlIHwgc2VkICdzL2Vjb2ZmLy8nYApmaWxlYmFzZT1gZWNobyAkZmlsZWJhc2UgfCBzZWQgJ3MvY29mZi8vJ2AKd2hpbGUgdGVzdCAieCRmaWxlYmFzZSIgIT0gIngkbGFzdCIgLWEgISAtZiAkc3JjZGlyL2luY2x1ZGUvbmV0LXNubXAvc3lzdGVtLyRmaWxlYmFzZS5oCmRvCiAgICBsYXN0PSRmaWxlYmFzZQogICAgZmlsZWJhc2U9YGVjaG8gJGZpbGViYXNlIHwgc2VkICdzL1stLl9dW14tLl9dKiQvLydgCiAgICBpZiB0ZXN0ICJ4JGZpbGViYXNlIiA9ICJ4JGxhc3QiOyB0aGVuCglmaWxlYmFzZT1gZWNobyAkZmlsZWJhc2UgfCBzZWQgJ3MvWzAtOV0qJC8vJ2AKICAgIGZpCmRvbmUKCmlmIHRlc3QgIngkZmlsZWJhc2UiID0gIngkbGFzdCI7IHRoZW4KICAgIGZpbGViYXNlPSJnZW5lcmljIgpmaQphY19jdl9TWVNURU1fSU5DTFVERV9GSUxFPSJuZXQtc25tcC9zeXN0ZW0vJGZpbGViYXNlLmgiCgpjaGFuZ2VxdW90ZShbLCBdKQpBQ19NU0dfUkVTVUxUKCRhY19jdl9TWVNURU1fSU5DTFVERV9GSUxFKQpBQ19ERUZJTkVfVU5RVU9URUQoU1lTVEVNX0lOQ0xVREVfRklMRSwgIiRhY19jdl9TWVNURU1fSU5DTFVERV9GSUxFIikKCiMgc2Vjb25kIHBhcnQsIHRoZSBDUFUgdHlwZS4KCkFDX01TR19DSEVDS0lORyhbZm9yIG1hY2hpbmUtdHlwZSBpbmNsdWRlIGZpbGVdKQpjaGFuZ2VxdW90ZSgsICkKZmlsZWJhc2U9JHRhcmdldF9jcHUKd2hpbGUgdGVzdCAieCRmaWxlYmFzZSIgIT0gIngkbGFzdCIgLWEgISAtZiAkc3JjZGlyL2luY2x1ZGUvbmV0LXNubXAvbWFjaGluZS8kZmlsZWJhc2UuaApkbwogICAgbGFzdD0kZmlsZWJhc2UKICAgIGZpbGViYXNlPWBlY2hvICRmaWxlYmFzZSB8IHNlZCAncy9bLS5fXVteLS5fXSokLy8nYApkb25lCgppZiB0ZXN0ICJ4JGZpbGViYXNlIiA9ICJ4JGxhc3QiOyB0aGVuCiAgICBmaWxlYmFzZT0iZ2VuZXJpYyIKZmkKYWNfY3ZfTUFDSElORV9JTkNMVURFX0ZJTEU9Im5ldC1zbm1wL21hY2hpbmUvJGZpbGViYXNlLmgiCmNoYW5nZXF1b3RlKFssIF0pCkFDX01TR19SRVNVTFQoWyRhY19jdl9NQUNISU5FX0lOQ0xVREVfRklMRV0pCgpBQ19ERUZJTkVfVU5RVU9URUQoTUFDSElORV9JTkNMVURFX0ZJTEUsICIkYWNfY3ZfTUFDSElORV9JTkNMVURFX0ZJTEUiKQoKQUNfUEFUSF9QUk9HKFtDQ1BBVEhdLCRDQykKIyB3YXRjaCBvdXQgZm9yIC91c3IvdWNiL2NjIG9uIHNvbGFyaXMsIGl0IGRvZXNuJ3Qgd29yayB3aXRoIHRoaXMgcGFja2FnZS4KY2FzZSAkdGFyZ2V0X29zIGluCiAgICBic2RpKikKCWlmIHRlc3QgIngkQ0NQQVRIIiA9ICJ4L3Vzci91Y2IvY2MiIC1vICJ4JENDUEFUSCIgPSAieC91c3IvYmluL2NjIjsgdGhlbgoJICAgIEFDX01TR19FUlJPUihbCgoqKiogVGhlIEJTREkgL3Vzci91Y2IvY2MgY29tcGlsZXIgZG9lcyBub3Qgd29yayB3aXRoIHRoaXMgcGFja2FnZS4gIAoqKiogUGxlYXNlIHJ1biBjb25maWd1cmUgd2l0aCAtLXdpdGgtY2M9Z2NjCl0pCglmaQogICAgOzsKICAgIHNvbGFyaXMqKQoJaWYgdGVzdCAieCRDQ1BBVEgiID0gIngvdXNyL3VjYi9jYyI7IHRoZW4KCSAgICBBQ19NU0dfRVJST1IoWwoKKioqIFRoZSBzb2xhcmlzIC91c3IvdWNiL2NjIGNvbXBpbGVyIGRvZXMgbm90IHdvcmsgd2l0aCB0aGlzIHBhY2thZ2UuICAKKioqIFBsZWFzZSBwdXQgYSBkaWZmZXJlbnQgY29tcGlsZXIgaW4geW91ciBwYXRoIGZpcnN0IG9yIHJ1bgoqKiogY29uZmlndXJlIHdpdGggLS13aXRoLWNjPVhYLCB3aGVyZSBYWCBpcyB0aGUgY29tcGlsZXIgeW91IHdhbnQgdG8gdXNlLgpdKQoJZmkKICAgIDs7CmVzYWMKICAgIApBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhZGRpdGlvbmFsIGNwcCBmbGFnc10pCiMgZ2NjIGV4dHJhIENQUEZMQUdTCmlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIiAtYSAieCRDUFAiID0gIngkQ0MgLUUiOyB0aGVuCiAgIyBleHRyYSBjcHAgZmxhZ3MgZm9yIGdudSBjIGNvbXBpbGVyIHRvIGFsbG93IC5pbiBmaWxlIGV4dGVuc2lvbnMuCiAgRVhUUkFDUFBGTEFHUz0iLXggYyIKZWxzZQogIEVYVFJBQ1BQRkxBR1M9IiIKZmkKCiMgU29sYXJpcyBleHRyYSBjcHAgZmxhZ3MuCmlmIHRlc3QgIngkR0NDIiAhPSAieHllcyI7IHRoZW4KICBjYXNlICR0YXJnZXRfb3MgaW4KICAgIHNvbGFyaXMqKSBFWFRSQUNQUEZMQUdTPSIkRVhUUkFDUFBGTEFHUyAtWHMiIDs7CiAgZXNhYwpmaQoKQUNfU1VCU1QoRVhUUkFDUFBGTEFHUykKQUNfTVNHX1JFU1VMVCgkRVhUUkFDUFBGTEFHUykKCiMgUHJlZml4ZXMgbXVzdCBiZWdpbiB3aXRoICIvIgoKaWYgdGVzdCAieCRwcmVmaXgiID0gInhOT05FIjsgdGhlbgogIHByZWZpeD0vdXNyL2xvY2FsCmZpCgpmY2g9YGVjaG8gJHByZWZpeCB8IHNlZCAncy9cKC5cKS4qL1wxLydgCmlmIHRlc3QgJGZjaCAhPSAiLyIgOyB0aGVuCiAgIHByZWZpeD1gcHdkYC8kcHJlZml4CiAgIGVjaG8gImFkanVzdGluZyBwcmVmaXggdG8gJHByZWZpeCIKZmkKCmlmIHRlc3QgIngkZXhlY19wcmVmaXgiID0gInhOT05FIjsgdGhlbgogIGV4ZWNfcHJlZml4PSRwcmVmaXgKZmkKCmZjaD1gZWNobyAkZXhlY19wcmVmaXggfCBzZWQgJ3MvXCguXCkuKi9cMS8nYAppZiB0ZXN0ICRmY2ggIT0gIi8iIDsgdGhlbgogICBleGVjX3ByZWZpeD1gcHdkYC8kZXhlY19wcmVmaXgKICAgZWNobyAiYWRqdXN0aW5nIGV4ZWNfcHJlZml4IHRvICRleGVjX3ByZWZpeCIKZmkKCiMgU2V0IFNOTVBMSUJQQVRIICYgU05NUFNIQVJFUEFUSAoKU05NUExJQlBBVEg9IiIKdG1wc2V0PSIkbGliZGlyL3NubXAiCndoaWxlIHRlc3QgIngkdG1wc2V0IiAhPSAieCRTTk1QTElCUEFUSCI7IGRvCiAgU05NUExJQlBBVEg9IiR0bXBzZXQiCiAgZXZhbCB0bXBzZXQ9IiR0bXBzZXQiCmRvbmUKQUNfREVGSU5FX1VOUVVPVEVEKFNOTVBMSUJQQVRILCIkU05NUExJQlBBVEgiKQpBQ19ERUZJTkVfVU5RVU9URUQoU05NUERMTU9EUEFUSCwiJFNOTVBMSUJQQVRIL2RsbW9kIikKClNOTVBTSEFSRVBBVEg9IiIKdG1wc2V0PSIkZGF0YWRpci9zbm1wIgp3aGlsZSB0ZXN0ICJ4JHRtcHNldCIgIT0gIngkU05NUFNIQVJFUEFUSCI7IGRvCiAgU05NUFNIQVJFUEFUSD0iJHRtcHNldCIKICBldmFsIHRtcHNldD0iJHRtcHNldCIKZG9uZQpBQ19ERUZJTkVfVU5RVU9URUQoU05NUFNIQVJFUEFUSCwiJFNOTVBTSEFSRVBBVEgiKQoKaWYgdGVzdCAieCRERUZBVUxUX01JQkRJUlMiID0gIngiOyB0aGVuCiAgQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfTUlCRElSUywiXCRIT01FLy5zbm1wL21pYnM6JFNOTVBTSEFSRVBBVEgvbWlicyIpCmZpCgpTTk1QQ09ORlBBVEg9IiIKdG1wc2V0PSIkc3lzY29uZmRpci9zbm1wIgp3aGlsZSB0ZXN0ICJ4JHRtcHNldCIgIT0gIngkU05NUENPTkZQQVRIIjsgZG8KICBTTk1QQ09ORlBBVEg9IiR0bXBzZXQiCiAgZXZhbCB0bXBzZXQ9IiR0bXBzZXQiCmRvbmUKQUNfREVGSU5FX1VOUVVPVEVEKFNOTVBDT05GUEFUSCwiJFNOTVBDT05GUEFUSCIpCkFDX1NVQlNUKFNOTVBDT05GUEFUSCkKCiMgZ3Vlc3MgSVB2NiBzdGFjayB0eXBlLgppZiB0ZXN0ICJ4JGVuYWJsZV9pcHY2IiA9ICJ4eWVzIjsgdGhlbgoJdjZ0eXBlPXVua25vd24KCXY2bGliPW5vbmUKCXY2dHJ5bGliYz1ubwoKCUFDX01TR19DSEVDS0lORyhbW2lwdjYgc3RhY2sgdHlwZV1dKQoJZm9yIGkgaW4gdjZkIHRvc2hpYmEga2FtZSBpbnJpYSB6ZXRhIGxpbnV4LWdsaWJjIGxpbnV4LWluZXQ2OyBkbwoJCWNhc2UgJGkgaW4KCQl2NmQpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPC91c3IvbG9jYWwvdjYvaW5jbHVkZS9zeXMvdHlwZXMuaD4KI2lmZGVmIF9fVjZEX18KeWVzCiNlbmRpZl0sCgkJCQlbdjZ0eXBlPSRpOyB2NmxpYj12NjsKCQkJCXY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwoJCQkJQ0ZMQUdTPSItSS91c3IvbG9jYWwvdjYvaW5jbHVkZSAkQ0ZMQUdTIl0pCgkJCTs7CgkJdG9zaGliYSkKCQkJQUNfRUdSRVBfQ1BQKHllcywgWwojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpZmRlZiBfVE9TSElCQV9JTkVUNgp5ZXMKI2VuZGlmXSwKCQkJCVt2NnR5cGU9JGk7IHY2bGliPWluZXQ2OwoJCQkJdjZsaWJkaXI9L3Vzci9sb2NhbC92Ni9saWI7CgkJCQlDRkxBR1M9Ii1ESU5FVDYgJENGTEFHUyJdKQoJCQk7OwoJCWthbWUpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2lmZGVmIF9fS0FNRV9fCnllcwojZW5kaWZdLAoJCQkJW3Y2dHlwZT0kaTsgdjZsaWI9aW5ldDY7CgkJCQl2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKCQkJCXY2dHJ5bGliYz15ZXM7CgkJCQlDRkxBR1M9Ii1ESU5FVDYgJENGTEFHUyJdKQoJCQk7OwoJCWlucmlhKQoJCQlBQ19FR1JFUF9DUFAoeWVzLCBbCiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpZmRlZiBJUFY2X0lOUklBX1ZFUlNJT04KeWVzCiNlbmRpZl0sCgkJCQlbdjZ0eXBlPSRpOwoJCQkJdjZsaWI9ZHVtbXk7CgkJCQl2NmxpYmRpcj1ub25lOwoJCQkJdjZ0cnlsaWJjPXllczsKCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIl0pCgkJCTs7CgkJemV0YSkKCQkJQUNfRUdSRVBfQ1BQKHllcywgWwojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpZmRlZiBfWkVUQV9NSU5BTUlfSU5FVDYKQQp5ZXMKI2VuZGlmXSwKCQkJCVt2NnR5cGU9JGk7IHY2bGliPWluZXQ2OwoJCQkJdjZsaWJkaXI9L3Vzci9sb2NhbC92Ni9saWI7CgkJCQlDRkxBR1M9Ii1ESU5FVDYgJENGTEFHUyJdKQoJCQk7OwoJCWxpbnV4LWdsaWJjKQoJCQlBQ19FR1JFUF9DUFAoeWVzLCBbCiNpbmNsdWRlIDxmZWF0dXJlcy5oPgojaWYgZGVmaW5lZChfX0dMSUJDX18pICYmICgoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEpIHx8IChfX0dMSUJDXyA+IDIpKQp5ZXMKI2VuZGlmXSwKCQkJCVt2NnR5cGU9JGk7CgkJCQl2NmxpYj1kdW1teTsKCQkJCXY2bGliZGlyPW5vbmU7CgkJCQl2NnRyeWxpYmM9eWVzOwoJCQkJQ0ZMQUdTPSItRElORVQ2ICRDRkxBR1MiXSkKCQkJOzsKCQlsaW51eC1pbmV0NikKCQkJaWYgdGVzdCAtZCAvdXNyL2luZXQ2OyB0aGVuCgkJCQl2NnR5cGU9JGkKCQkJCXY2bGliPWluZXQ2CgkJCQl2NmxpYmRpcj0vdXNyL2luZXQ2L2xpYgoJCQkJQ0ZMQUdTPSItRElORVQ2ICRDRkxBR1MiCgkJCWZpCgkJCTs7CgkJZXNhYwoJCWlmIHRlc3QgIiR2NnR5cGUiICE9ICJ1bmtub3duIjsgdGhlbgoJCQlicmVhawoJCWZpCglkb25lCgoJaWYgdGVzdCAiJHY2bGliIiAhPSAibm9uZSI7IHRoZW4KCQlpZiB0ZXN0IC1kICR2NmxpYmRpciAtYSAtZiAkdjZsaWJkaXIvbGliJHY2bGliLmE7IHRoZW4KCQkJTElCUz0iLUwkdjZsaWJkaXIgLWwkdjZsaWIgJExJQlMiCgkJCWVuYWJsZV9pcHY2PSJ5ZXMiCgkJCUFDX01TR19SRVNVTFQoWyIkdjZ0eXBlLCAkZW5hYmxlX2lwdjYsIHVzaW5nIGxpYiR2NmxpYiJdKQoJCWVsaWYgdGVzdCAiJHY2dHJ5bGliYyIgPSAieWVzIjsgdGhlbgoJCQllbmFibGVfaXB2Nj0ieWVzIgoJCQlBQ19NU0dfUkVTVUxUKFsiJHY2dHlwZSwgJGVuYWJsZV9pcHY2LCB1c2luZyBsaWJjIl0pCgkJZWxzZQoJCQlBQ19NU0dfRVJST1Iobm8gSVB2NiBsaWJyYXJ5IGxpYiR2NmxpYi5hIGZvdW5kLikKCQkJZXhpdCAxCgkJZmkKCWVsc2UKCQllbmFibGVfaXB2Nj0ibm8iCgkJQUNfTVNHX1JFU1VMVChbIiR2NnR5cGUsICRlbmFibGVfaXB2NiJdKQoJZmkKZmkKCiMKIyBNYXliZSBhZGQgbGlicmFyeSBleHRlbnNpb25zIGZvciB0aHJlYWQgbXV0ZXggbG9ja2luZy4KIwoKaWYgdGVzdCAieCR3aXRoX3Jlc19sb2NrcyIgPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoTlNfUkVFTlRSQU5UKQpFT0YKCiAgICBjYXNlICR0YXJnZXRfb3MgaW4KCiAgICBhaXgqKQoJQ0NfUlVOVElNRV9BUkc9IiRDQ19SVU5USU1FX0FSRyAtbHB0aHJlYWRzIgoJOzsKCiAgICAqKQoJOzsKCiAgICBlc2FjCmZpCgpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgd2UgaGF2ZSB0byBidWlsZCBQSUMgY29kZV0pCmVjaG8gIiR3aXRoX21pYl9tb2R1bGVzIiB8IGdyZXAgInVjZC1zbm1wL2RsbW9kIiA+L2Rldi9udWxsCmlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCglETExJQlM9Ii1sZGwiCiAgICAgICAgTElCX0NGTEFHUz0iJExJQl9DRkxBR1MgJFNITElCX0NGTEFHUyIKCUFDX01TR19SRVNVTFQoeWVzKQplbHNlCglETExJQlM9IiIKCUFDX01TR19SRVNVTFQobm8pCmZpCgojCiMgRG8gdHJhbnNwb3J0IG1vZHVsZSBwcm9jZXNzaW5nLgojCkFDX01TR19DSEVDS0lORyhbZm9yIGFuZCBjb25maWd1cmluZyB0cmFuc3BvcnQgbW9kdWxlcyB0byB1c2VdKQp0cmFuc3BvcnRfc3JjX2xpc3Q9IiIKdHJhbnNwb3J0X2hkcl9saXN0PSIiCnRyYW5zcG9ydF9kZWZfbGlzdD0iIgp0cmFuc3BvcnRfcmVzdWx0X2xpc3Q9IiIKdHJhbnNwb3J0X2FkZF9saXN0PSIiCnRyYW5zcG9ydF9jYWxsYmFja19kaXNhYmxlZD0iIgpuZXdfd2l0aF90cmFuc3BvcnRfbGlzdD1gZWNobyAkd2l0aF90cmFuc3BvcnRzIHwgc2VkICdzLywvIC9nOydgCm5ld193aXRoX291dF90cmFuc3BvcnRfbGlzdD1gZWNobyAkd2l0aF9vdXRfdHJhbnNwb3J0cyB8IHNlZCAncy8sLyAvZzsnYAoKIwojIEFkZCB0aGUgZGVmYXVsdCB0cmFuc3BvcnRzIHRvIHRoZSBsaXN0CiMKaWYgdGVzdCAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhjeWd3aW4iOyB0aGVuCiAgdHJhbnNwb3J0X2RlZmF1bHRfbGlzdD0iVURQIFRDUCBDYWxsYmFjayIKZWxpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiOyB0aGVuCiAgdHJhbnNwb3J0X2RlZmF1bHRfbGlzdD0iVURQIFRDUCBDYWxsYmFjayIKZWxzZQogIHRyYW5zcG9ydF9kZWZhdWx0X2xpc3Q9IlVEUCBUQ1AgVW5peCBDYWxsYmFjayIKZmkKaWYgdGVzdCAieCRlbmFibGVfaXB2NiIgPSAieHllcyI7IHRoZW4KICB0cmFuc3BvcnRfZGVmYXVsdF9saXN0PSJVRFBJUHY2IFRDUElQdjYgJHRyYW5zcG9ydF9kZWZhdWx0X2xpc3QiCmZpCmZvciBpIGluICR0cmFuc3BvcnRfZGVmYXVsdF9saXN0OyBkbwogIGlmIGVjaG8gIiAkbmV3X3dpdGhfdHJhbnNwb3J0X2xpc3QgIiB8IGdyZXAgIiAkaSAiID4vZGV2L251bGw7IHRoZW4KICAgIDoKICBlbHNlCiAgICB0cmFuc3BvcnRfYWRkX2xpc3Q9IiRpICR0cmFuc3BvcnRfYWRkX2xpc3QiCiAgZmkKZG9uZQpuZXdfdHJhbnNwb3J0X2xpc3Q9IiR0cmFuc3BvcnRfYWRkX2xpc3QgJG5ld193aXRoX3RyYW5zcG9ydF9saXN0IgoKZm9yIGkgaW4gJG5ld190cmFuc3BvcnRfbGlzdDsgZG8KICBpZiBlY2hvICIgJG5ld193aXRoX291dF90cmFuc3BvcnRfbGlzdCAiIHwgZ3JlcCAiICRpICIgPi9kZXYvbnVsbDsgdGhlbgogICAgaWYgdGVzdCAieCRpIiA9ICJ4VURQIjsgdGhlbgogICAgICBlY2hvCiAgICAgIEFDX01TR19FUlJPUihJdCBpcyBub3QgcG9zc2libGUgdG8gY29tcGlsZSB3aXRob3V0IFVEUC9JUCBzdXBwb3J0LikKICAgIGVsaWYgdGVzdCAieCRpIiA9ICJ4Q2FsbGJhY2siOyB0aGVuCiAgICAgIGVjaG8KICAgICAgdHJhbnNwb3J0X2NhbGxiYWNrX2Rpc2FibGVkPSJ5ZXMiCiAgICBmaQogIGVsc2UKICAgIGlmIHRlc3QgIngkaSIgPSAieEFBTDVQVkMiOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiAhPSAieGxpbnV4IjsgdGhlbgogICAgICAgIGVjaG8KICAgICAgICBBQ19NU0dfRVJST1IoQUFMNSBQVkMgc3VwcG9ydCB1bmF2YWlsYWJsZSBmb3IgdGhpcyBwbGF0Zm9ybSAoTGludXggb25seSkpCiAgICAgIGZpCiAgICBmaQogICAgaWYgdGVzdCAieCRpIiA9ICJ4SVBYIjsgdGhlbgogICAgICBpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgIT0gInhsaW51eCI7IHRoZW4KICAgICAgICBlY2hvCiAgICAgICAgQUNfTVNHX0VSUk9SKElQWCBzdXBwb3J0IHVuYXZhaWxhYmxlIGZvciB0aGlzIHBsYXRmb3JtIChMaW51eCBvbmx5KSkKICAgICAgZmkKICAgIGZpCiAgICBpZiB0ZXN0ICJ4JGkiID0gInhVbml4IjsgdGhlbgogICAgICBpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieGN5Z3dpbiI7IHRoZW4KICAgICAgICBlY2hvCiAgICAgICAgQUNfTVNHX0VSUk9SKFVuaXggZG9tYWluIHByb3RvY29sIHN1cHBvcnQgdW5hdmFpbGFibGUgZm9yIHRoaXMgcGxhdGZvcm0pCiAgICAgIGVsaWYgdGVzdCAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhjeWd3aW4iOyB0aGVuCiAgICAgICAgZWNobwogICAgICAgIEFDX01TR19FUlJPUihVbml4IGRvbWFpbiBwcm90b2NvbCBzdXBwb3J0IHVuYXZhaWxhYmxlIGZvciB0aGlzIHBsYXRmb3JtKQogICAgICBmaQogICAgZmkKICAgIHRyYW5zcG9ydF9zcmM9InNubXAiJGkiRG9tYWluLmMiCiAgICB0cmFuc3BvcnRfaGRyPSJzbm1wIiRpIkRvbWFpbi5oIgogICAgcmVsX3RyYW5zcG9ydF9zcmM9InNubXBsaWIvIiR0cmFuc3BvcnRfc3JjCiAgICByZWxfdHJhbnNwb3J0X2hkcj0iaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5LyIkdHJhbnNwb3J0X2hkcgogICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kcmVsX3RyYW5zcG9ydF9zcmMiOyB0aGVuCiAgICAgIHRyYW5zcG9ydF9yZXN1bHRfbGlzdD0iJHRyYW5zcG9ydF9yZXN1bHRfbGlzdCAkaSIKICAgICAgdHJhbnNwb3J0X3NyY19saXN0PSIkdHJhbnNwb3J0X3NyYyAkdHJhbnNwb3J0X3NyY19saXN0IgogICAgICBpZiB0ZXN0IC1mICIkc3JjZGlyLyRyZWxfdHJhbnNwb3J0X2hkciI7IHRoZW4KICAgICAgICB0cmFuc3BvcnRfaGRyX2xpc3Q9IiR0cmFuc3BvcnRfaGRyICR0cmFuc3BvcnRfaGRyX2xpc3QiCiAgICAgIGZpCiAgICAgIHRyYW5zcG9ydF9kZWY9YGVjaG8gJGkgfCBzZWQgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKICAgICAgdHJhbnNwb3J0X2RlZl9saXN0PSJTTk1QX1RSQU5TUE9SVF8iJHRyYW5zcG9ydF9kZWYiX0RPTUFJTiAkdHJhbnNwb3J0X2RlZl9saXN0IgogICAgZWxzZQogICAgICBlY2hvCiAgICAgIEFDX01TR19FUlJPUihDYW5ub3QgZmluZCBmaWxlICRzcmNkaXIvJHJlbF90cmFuc3BvcnRfc3JjIHRvIHN1cHBvcnQgU05NUCB0cmFuc3BvcnQgZG9tYWluICRpLikKICAgIGZpCiAgZmkKZG9uZQp0cmFuc3BvcnRfb2JqX2xpc3Q9YGVjaG8gIiAkdHJhbnNwb3J0X3NyY19saXN0ICIgfCBzZWQgJ3MvXC5jL1wuby9nJ2AgCSAKdHJhbnNwb3J0X2xvYmpfbGlzdD1gZWNobyAiICR0cmFuc3BvcnRfc3JjX2xpc3QgIiB8IHNlZCAncy9cLmMvXC5sby9nJ2AKQUNfU1VCU1QodHJhbnNwb3J0X2hkcl9saXN0KQpBQ19TVUJTVCh0cmFuc3BvcnRfc3JjX2xpc3QpCkFDX1NVQlNUKHRyYW5zcG9ydF9vYmpfbGlzdCkKQUNfU1VCU1QodHJhbnNwb3J0X2xvYmpfbGlzdCkKZm9yIGkgaW4gJHRyYW5zcG9ydF9kZWZfbGlzdDsgZG8KICBBQ19ERUZJTkVfVU5RVU9URUQoJGkpCmRvbmUKQUNfTVNHX1JFU1VMVCgkdHJhbnNwb3J0X3Jlc3VsdF9saXN0LikKQUNfTVNHX0NBQ0hFX0FERChOZXR3b3JrIHRyYW5zcG9ydCBzdXBwb3J0OiAkdHJhbnNwb3J0X3Jlc3VsdF9saXN0KQoKIwojIFNlY3VyaXR5IG1vZHVsZXMgdG8gdXNlCiMgCgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzZWN1cml0eSBtb2R1bGVzIHRvIHVzZV0pCnNlY3VyaXR5X2RlZl9saXN0PSJ1c20iCnNlY3VyaXR5X3NyY19saXN0PSIiCnNlY3VyaXR5X29ial9saXN0PSIiIAkgCnNlY3VyaXR5X2xvYmpfbGlzdD0iIgpzZWN1cml0eV9pbml0X2ZpbGU9InNubXBsaWIvc25tcHNtX2luaXQuaCIKc2VjdXJpdHlfaW5jbF9maWxlPSJpbmNsdWRlL25ldC1zbm1wL2xpYnJhcnkvc25tcHYzLXNlY3VyaXR5LWluY2x1ZGVzLmgiCm5ld193aXRoX3NlY3VyaXR5PWBlY2hvICR3aXRoX3NlY3VyaXR5X21vZHVsZXMgfCBzZWQgJ3MvLC8gL2c7J2AKbmV3X3dpdGhfb3V0X3NlY3VyaXR5PWBlY2hvICR3aXRoX291dF9zZWN1cml0eV9tb2R1bGVzIHwgc2VkICdzLywvIC9nOydgCgppZiB0ZXN0ICEgLWQgaW5jbHVkZTsgdGhlbgogIG1rZGlyIGluY2x1ZGUKZmkKaWYgdGVzdCAhIC1kIGluY2x1ZGUvbmV0LXNubXA7IHRoZW4KICBta2RpciBpbmNsdWRlL25ldC1zbm1wCmZpCmlmIHRlc3QgISAtZCBpbmNsdWRlL25ldC1zbm1wL2FnZW50OyB0aGVuCiAgbWtkaXIgaW5jbHVkZS9uZXQtc25tcC9hZ2VudApmaQppZiB0ZXN0ICEgLWQgaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5OyB0aGVuCiAgbWtkaXIgaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5CmZpCmlmIHRlc3QgISAtZCBpbmNsdWRlL3VjZC1zbm1wOyB0aGVuCiAgbWtkaXIgaW5jbHVkZS91Y2Qtc25tcApmaQoKaWYgdGVzdCAhIC1kIHNubXBsaWI7IHRoZW4KICBta2RpciBzbm1wbGliCmZpCmVjaG8gIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUuICBEbyBub3QgbW9kaWZ5IGJ5IGhhbmQuICovIiA+ICRzZWN1cml0eV9pbml0X2ZpbGUKZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBtb2RpZnkgYnkgaGFuZC4gKi8iID4gJHNlY3VyaXR5X2luY2xfZmlsZQoKZm9yIGkgaW4gJHNlY3VyaXR5X2RlZl9saXN0OyBkbwogIGlmIGVjaG8gIiAkbmV3X3dpdGhfb3V0X3NlY3VyaXR5ICIgfCBncmVwICIgJGkgIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgaWYgdGVzdCAieCRpIiA9ICJ4dXNtIjsgdGhlbgoJZWNobwogICAgICAgIEFDX01TR19FUlJPUihUaGUgVVNNIHNlY3VyaXR5IG1vZHVsZSBpcyBtYW5kYXRvcnkpCiAgICBmaQogIGVsc2UKICAgIG5ld193aXRoX3NlY3VyaXR5PSIkbmV3X3dpdGhfc2VjdXJpdHkgJGkiCiAgZmkKZG9uZQoKZm9yIGkgaW4gJG5ld193aXRoX3NlY3VyaXR5OyBkbwogIGNmaWxlPSJzbm1wIiRpIi5jIgogIGhmaWxlPSJzbm1wIiRpIi5oIgoKICAjIG1ha2Ugc3VyZSBzdXBwb3J0IGV4aXN0cyBmb3IgaXQKICBpZiB0ZXN0IC1mICRzcmNkaXIiL3NubXBsaWIvIiRjZmlsZSAtYSAtZiAkc3JjZGlyIi9pbmNsdWRlL25ldC1zbm1wL2xpYnJhcnkvIiRoZmlsZTsgdGhlbgogICAgOgogIGVsc2UKICAgIGVjaG8KICAgIEFDX01TR19FUlJPUihObyBzdWNoIHNlY3VyaXR5IG1vZHVsZTogJGkgLyAkY2ZpbGUgLyAkaGZpbGUpCiAgZmkKCiAgIyBkZWZpbmUgYSBidW5jaCBvZiBzdHVmZiB0byBlbmFibGUgaXQKICBzZWN1cml0eV9zcmNfbGlzdD0iJHNlY3VyaXR5X3NyY19saXN0ICRjZmlsZSIKICBzZWN1cml0eV9oZHJfbGlzdD0iJHNlY3VyaXR5X2hkcl9saXN0ICRoZmlsZSIKICBzZWN1cml0eV9vYmpfbGlzdD0iJHNlY3VyaXR5X29ial9saXN0IHNubXAiJGkiLm8iIAkgCiAgc2VjdXJpdHlfbG9ial9saXN0PSIkc2VjdXJpdHlfbG9ial9saXN0IHNubXAiJGkiLmxvIgogIGRlZl9uYW1lPSJTTk1QX1NFQ01PRF8iYGVjaG8gJGkgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCiAgZWNobyAiaW5pdF8iJGkiKCk7IiA+PiAkc2VjdXJpdHlfaW5pdF9maWxlCiAgZWNobyAiI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvJGhmaWxlPiIgPj4gJHNlY3VyaXR5X2luY2xfZmlsZQogIEFDX0RFRklORV9VTlFVT1RFRCgkZGVmX25hbWUpCmRvbmUKCkFDX1NVQlNUKHNlY3VyaXR5X3NyY19saXN0KQpBQ19TVUJTVChzZWN1cml0eV9oZHJfbGlzdCkKQUNfU1VCU1Qoc2VjdXJpdHlfb2JqX2xpc3QpIAkgCkFDX1NVQlNUKHNlY3VyaXR5X2xvYmpfbGlzdCkKQUNfTVNHX1JFU1VMVCgkbmV3X3dpdGhfc2VjdXJpdHkpCkFDX01TR19DQUNIRV9BREQoU05NUHYzIFNlY3VyaXR5IE1vZHVsZXM6ICAgJG5ld193aXRoX3NlY3VyaXR5KQoKIwojIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIEtTTSB0byBzZWUgd2hpY2ggY3J5cHRvIEFQSSB3ZSBzdXBwb3J0CiMKCmZvciBzZWMgaW4gJG5ld193aXRoX3NlY3VyaXR5CmRvCiAgaWYgdGVzdCB4JHNlYyA9IHhrc207IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbdG8gc2VlIHdoaWNoIGNyeXB0byBBUEkgd2UgbmVlZCB0byB1c2VdKQoKICAgIEFDX0NIRUNLX0ZVTkMoa3JiNV9jX2VuY3J5cHQsWwogICAgICBBQ19NU0dfUkVTVUxUKG5ldyBNSVQgY3J5cHRvIEFQSSkKICAgICAgQUNfREVGSU5FKE1JVF9ORVdfQ1JZUFRPKV0sWwogICAgICBBQ19NU0dfUkVTVUxUKG9sZCBNSVQgY3J5cHRvIEFQSSldKQogIGZpCmRvbmUKCiMKIyBEbyBoYWlyeSBhZ2VudCBtb2R1bGUgcHJvY2Vzc2luZy4KIwpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhbmQgY29uZmlndXJpbmcgbWliIG1vZHVsZXMgdG8gdXNlXSkKY2hhbmdlcXVvdGUoLCApCgptaWJkaXI9ImFnZW50L21pYmdyb3VwIgptb2R1bGVfbGlzdD0iIgptb2R1bGVfbGlzdF9jb2RlPSIiCm5ld193aXRoX21pYl9tb2R1bGVzPWBlY2hvICR3aXRoX21pYl9tb2R1bGVzIHwgc2VkICdzLywvIC9nOydgCm5ld193aXRoX291dF9taWJfbW9kdWxlcz1gZWNobyAkd2l0aF9vdXRfbWliX21vZHVsZXMgfCBzZWQgJ3MvLC8gL2c7J2AKbmV3X21vZHVsZV9saXN0PSJtaWJJSSB1Y2Rfc25tcCBzbm1wdjNtaWJzIG5vdGlmaWNhdGlvbiB0YXJnZXQgYWdlbnRfbWlicyBhZ2VudHggYWdlbnRfbWlicyB1dGlsaXRpZXMgJG5ld193aXRoX21pYl9tb2R1bGVzIgpkZWZhdWx0X21pYnM9SVAtTUlCOklGLU1JQjpUQ1AtTUlCOlVEUC1NSUI6SE9TVC1SRVNPVVJDRVMtTUlCOlNOTVB2Mi1NSUI6UkZDMTIxMy1NSUI6Tk9USUZJQ0FUSU9OLUxPRy1NSUIKCmlmIHRlc3QgIngkbWluaV9hZ2VudCIgPSAieHllcyI7IHRoZW4KbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzPSJtaWJJSSAkbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzIgpuZXdfbW9kdWxlX2xpc3Q9InNubXB2M21pYnMgbWliSUkvc25tcF9taWIgbWliSUkvc3lzdGVtX21pYiBtaWJJSS9zeXNPUlRhYmxlIG1pYklJL3ZhY21fdmFycyB1dGlsaXRpZXMvZXhlY3V0ZSAkbmV3X3dpdGhfbWliX21vZHVsZXMiCmRlZmF1bHRfbWlicz1TTk1QdjItTUlCOlJGQzEyMTMtTUlCCmRlZmF1bHRfbWlic19pbnN0YWxsPSIgIgpmaQoKaWYgdGVzdCAieCR0cmFuc3BvcnRfY2FsbGJhY2tfZGlzYWJsZWQiID0gInh5ZXMiOyB0aGVuCiAgICAgICAgY2hhbmdlcXVvdGUoWywgXSkKICAgICAgICBBQ19NU0dfV0FSTihEaXNhYmxpbmcgQ2FsbGJhY2sgdHJhbnNwb3J0IHdpbGwgZGlzYWJsZSBBZ2VudFggc3VwcG9ydC4pCiAgICAgICAgY2hhbmdlcXVvdGUoLCApCiAgICAgICAgbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzPSJhZ2VudHggJG5ld193aXRoX291dF9taWJfbW9kdWxlcyIKZmkKCmlmIHRlc3QgIngkZW5hYmxlX2lwdjYiID0gInh5ZXMiOyB0aGVuCgluZXdfbW9kdWxlX2xpc3Q9IiRuZXdfbW9kdWxlX2xpc3QgbWliSUkvaXB2NiIKZmkKCiMgQ3JlYXRlIGluY2x1ZGUgZmlsZSBsaXN0IGZvciBzbm1wX3ZhcnMuaCB0byB1c2UuCmlmIHRlc3QgISAtZCBhZ2VudDsgdGhlbgogIG1rZGlyIGFnZW50CmZpCmlmIHRlc3QgISAtZCBhZ2VudC9taWJncm91cDsgdGhlbgogIG1rZGlyIGFnZW50L21pYmdyb3VwCmZpCmZvciBpIGluICRtaWJkaXIvbWliX21vZHVsZV9pbmNsdWRlcy5oICRtaWJkaXIvbWliX21vZHVsZV9pbml0cy5oICRtaWJkaXIvbWliX21vZHVsZV9zaHV0ZG93bi5oIGluY2x1ZGUvbmV0LXNubXAvYWdlbnQvbWliX21vZHVsZV9jb25maWcuaCAkbWliZGlyL21pYl9tb2R1bGVfZG90X2NvbmYuaDsgZG8KICBybSAtZiAkaQogIGVjaG8gIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUuICBEbyBub3QgbW9kaWZ5IGJ5IGhhbmQuICovIiA+ICRpCmRvbmUKCnRlc3RfbW9kdWxlcz0iJG5ld19tb2R1bGVfbGlzdCIKbmV3X21vZHVsZV9saXN0PSIiCm1vZHVsZV9saXN0X2g9IiIKCmZvciBpIGluICR0ZXN0X21vZHVsZXMKIGRvCiAgaWYgZWNobyAiICRuZXdfd2l0aF9vdXRfbWliX21vZHVsZXMgIiB8IGdyZXAgIiAkaSAiID4gL2Rldi9udWxsOyB0aGVuCiAgICA6CiAgZWxzZQogICAgbmV3X21vZHVsZV9saXN0PSIkbmV3X21vZHVsZV9saXN0ICRpIgogIGZpCmRvbmUKCmNoYW5nZXF1b3RlKFssIF0pCkFDX01TR19SRVNVTFQoWyRuZXdfbW9kdWxlX2xpc3QuXSkKQUNfTVNHX0NBQ0hFX0FERChBZ2VudCBNSUIgY29kZTogICAgICAgICAgICAkbmV3X21vZHVsZV9saXN0KQoKTU9EVUxFQ1BQPSIkQ1BQIC1JJHtzcmNkaXJ9L2luY2x1ZGUgLUkke3NyY2Rpcn0vYWdlbnQvbWliZ3JvdXAiCkFDX01TR19DSEVDS0lORyhbZm9yIGFuZCBjb25maWd1cmluZyBtaWIgbW9kdWxlcyBwaWVjZXMgdG8gdXNlXSkKY2hhbmdlcXVvdGUoLCApCndoaWxlIHRlc3QgIngkbmV3X21vZHVsZV9saXN0IiAhPSAieCI7IGRvCiAgZm9yIGkgaW4gJG5ld19tb2R1bGVfbGlzdAogICAgZG8KICAgIGlmIGVjaG8gIiAkbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzICIgfCBncmVwICIgJGkgIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICA6CiAgICBlbHNlCiAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci8kbWliZGlyLyRpLmg7IHRoZW4KICAgICAgICBuZXdfbGlzdD0iIgogICAgICAgIG5ld19saXN0X2FyY2g9YGdyZXAgY29uZmlnX2FyY2hfcmVxdWlyZSAkc3JjZGlyLyRtaWJkaXIvJGkuaCB8IHNlZCAncy8uKmNvbmZpZ19hcmNoX3JlcXVpcmUoXCguKlwpLCAqXCguKlwpKS4qL1wxLXhhcmNoeC1cMi8nYAoJaWYgdGVzdCAieCRuZXdfbGlzdF9hcmNoIiAhPSAieCI7IHRoZW4KICAgICAgICAgIGZvciBqIGluICRuZXdfbGlzdF9hcmNoCgkgICAgZG8KCSAgICBhcmNodGVzdD1gZWNobyAkaiB8IHNlZCAncy8teGFyY2h4LS4qLy8nYAoJICAgIGlmIHRlc3QgIngkdGFyZ2V0X29zIiA9ICJ4JGFyY2h0ZXN0IiAtbyAieCRQQVJUSUFMVEFSR0VUT1MiID0gIngkYXJjaHRlc3QiOyB0aGVuCgkgICAgICBuZXdfbGlzdD0iJG5ld19saXN0IGBlY2hvICRqIHwgc2VkICdzLy4qLXhhcmNoeC0vLydgIgoJICAgIGZpCgkgIGRvbmUKCWZpCgluZXdfbGlzdD0iJG5ld19saXN0IGAkTU9EVUxFQ1BQICRzcmNkaXIvJG1pYmRpci8kaS5oIHwgZ3JlcCBjb25maWdfcmVxdWlyZSB8IHNlZCAncy8uKmNvbmZpZ19yZXF1aXJlKFwoLipcKSkuKi9cMS8nYCIKCWlmIHRlc3QgIngkbmV3X2xpc3QiICE9ICJ4IjsgdGhlbgoJICBmb3IgaiBpbiAkbmV3X2xpc3QKCSAgICBkbwoJICAgIGlmIHRlc3QgISAtZiAkc3JjZGlyLyRtaWJkaXIvJGouaDsgdGhlbgoJICAgICAgY2hhbmdlcXVvdGUoWywgXSkKCSAgICAgIEFDX01TR19FUlJPUihbbWliIG1vZHVsZSAiJGkiIHJlcXVpcmVzIG1vZHVsZSAiJGoiIGJ1dCAkai5oIG9yICRqLmMgY291bGQgbm90IGJlIGZvdW5kIGluICRzcmNkaXIvJG1pYmRpcl0pCiAgICAgICAgICAgICAgY2hhbmdlcXVvdGUoLCApCgkgICAgZWxpZiBlY2hvICIgJG5ld193aXRoX291dF9taWJfbW9kdWxlcyAiIHwgZ3JlcCAiICRqICIgPiAvZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBjaGFuZ2VxdW90ZShbLCBdKQoJICAgICAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgIiRpIiByZXF1aXJlcyBtb2R1bGUgIiRqIiBidXQgeW91IHRvbGQgbWUgdG8gY29tcGlsZSB3aXRob3V0IGl0XSkKICAgICAgICAgICAgICBjaGFuZ2VxdW90ZSgsICkKCSAgICBlbGlmIGVjaG8gIiAkbW9kdWxlX2xpc3QgJG5ld19saXN0X3R3byAkbmV3X21vZHVsZV9saXN0ICIgfCBncmVwICIgJGogIiA+IC9kZXYvbnVsbDsgdGhlbgoJICAgICAgOgoJICAgIGVsc2UKCSAgICAgIG5ld19saXN0X3R3bz0iJG5ld19saXN0X3R3byAkaiIKCSAgICBmaQoJICBkb25lCglmaQoJbmV3X21pYnM9YCRNT0RVTEVDUFAgJHNyY2Rpci8kbWliZGlyLyRpLmggfCBncmVwIGNvbmZpZ19hZGRfbWliIHwgc2VkICdzLy4qY29uZmlnX2FkZF9taWIoXCguKlwpKS4qL1wxLydgCglpZiB0ZXN0ICJ4JG5ld19taWJzIiAhPSAieCI7IHRoZW4KCSAgICBmb3IgaiBpbiAkbmV3X21pYnMKCQlkbwoJCWlmIHRlc3QgInhgZWNobyA6JGRlZmF1bHRfbWliczogfCBncmVwIDokajpgIiA9ICJ4IjsgdGhlbgoJCSAgICBkZWZhdWx0X21pYnM9IiRkZWZhdWx0X21pYnM6JGoiCgkJZmkKCQlpZiB0ZXN0IC1mICRzcmNkaXIvbWlicy8kai50eHQ7IHRoZW4KCQkgICAgaWYgZWNobyAkZGVmYXVsdF9taWJzX2luc3RhbGwgfCBncmVwICIgJGogIiA+IC9kZXYvbnVsbDsgdGhlbgoJCQkgICAgOgoJCSAgICBlbHNlCgkJCSAgICBkZWZhdWx0X21pYnNfaW5zdGFsbD0iJGRlZmF1bHRfbWlic19pbnN0YWxsICRqLnR4dCIKCQkgICAgZmkKCQlmaQoJICAgIGRvbmUKCWZpCiAgICAgIGVsc2UKICAgICAgICBjaGFuZ2VxdW90ZShbLCBdKQoJQUNfTVNHX0VSUk9SKFttb2R1bGUgZmlsZXMgJGkuaCBvciAkaS5jIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiAkc3JjZGlyLyRtaWJkaXJdKQogICAgICAgIGNoYW5nZXF1b3RlKCwgKQogICAgICBmaQogICAgICBtb2R1bGVfbGlzdD0iJG1vZHVsZV9saXN0ICRpIgogICAgICBlY2hvICcjaW5jbHVkZSAiJyJtaWJncm91cC8kaS5oIiciJyA+PiAkbWliZGlyL21pYl9tb2R1bGVfaW5jbHVkZXMuaAogICAgICBtb2R1bGVfbGlzdF9oPSIkbW9kdWxlX2xpc3RfaCBtaWJncm91cC8kaS5oIgogICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvJG1pYmRpci8kaS5jOyB0aGVuCiAgICAgICAgbW9kdWxlX2xpc3RfY29kZT0iJG1vZHVsZV9saXN0X2NvZGUgJGkiCiAgICAgICAgbW5tPWBlY2hvICRpIHwgc2VkICdzLy4qXC8vLztzL1wuYyQvLzsnYAogICAgICAgIHRlbXBfaW5pdD1gZ3JlcCBpbml0XyRtbm0gJHNyY2Rpci8kbWliZGlyLyRpLmMgfCBncmVwIC12IF9pbml0XyRtbm1gCglpZiB0ZXN0ICJ4JHRlbXBfaW5pdCIgIT0gIngiOyB0aGVuCgkgICAgZWNobyAiICBpZiAoc2hvdWxkX2luaXQoXCIkbW5tXCIpKSBpbml0XyRtbm0oKTsiID4+ICRtaWJkaXIvbWliX21vZHVsZV9pbml0cy5oCglmaQoJaWYgZ3JlcCBzaHV0ZG93bl9gYmFzZW5hbWUgJGlgICRzcmNkaXIvJG1pYmRpci8kaS5jID4gL2Rldi9udWxsOyB0aGVuCgkgICAgZWNobyAiICBpZiAoc2hvdWxkX2luaXQoXCJgYmFzZW5hbWUgJGlgXCIpKSBzaHV0ZG93bl9gYmFzZW5hbWUgJGlgKCk7IiA+PiAkbWliZGlyL21pYl9tb2R1bGVfc2h1dGRvd24uaAoJZmkKICAgICAgZmkKICAgICAgaWYgdGVzdCAieGBlY2hvICRpIHwgc2VkICdzL1wvLy9nOydgIiAhPSAieCRpIjsgdGhlbgoJbW5kPWBlY2hvICRpIHwgc2VkICdzL1wvW14vXSokLy87J2AKCWlmIHRlc3QgISAtZCAuLyRtaWJkaXIvJG1uZDsgdGhlbgoJICAgIG1vZHVsZV9kaXJlY3Rvcmllcz0iJG1vZHVsZV9kaXJlY3RvcmllcyAuLyRtaWJkaXIvJG1uZCIKCWZpCiAgICAgIGZpCiAgICAgIGlmICRNT0RVTEVDUFAgJHNyY2Rpci8kbWliZGlyLyRpLmggfCBncmVwIGNvbmZpZ19sb2FkX21pYiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgY2hhbmdlcXVvdGUoWywgXSkKICAgICAgCUFDX01TR19XQVJOKFttaWIgbW9kdWxlICIkaSIgdXNlcyB0aGUgImNvbmZpZ19sb2FkX21pYiIgZGlyZWN0aXZlLCB3aGljaCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgSXQgcHJvYmFibHkgd29uJ3Qgd29yay5dKQogICAgICAgIGNoYW5nZXF1b3RlKCwgKQogICAgICBmaQogICAgICAkTU9EVUxFQ1BQICRzcmNkaXIvJG1pYmRpci8kaS5oIHwgZ3JlcCBjb25maWdfcGFyc2VfZG90X2NvbmYgfCBzZWQgJ3NALipjb25maWdfcGFyc2VfZG90X2NvbmYoXChbXildKlwpLCAqXChbXiksXSpcKSwgKlwoW14pLF0qXCksICpcKFteKSxdKlwpKS4qQHJlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJzbm1wZCIsXDEsIFwyLCBcMywgXDQpO0AnID4+ICRtaWJkaXIvbWliX21vZHVsZV9kb3RfY29uZi5oCiAgICAgIHN5bT0iYGVjaG8gJHtpfSB8IHNlZCAncy9bXmEtekEtWjAtOV9dL18vZycgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgIgogICAgICBlY2hvICIvKiBEZWZpbmUgaWYgY29tcGlsaW5nIHdpdGggdGhlICR7aX0gbW9kdWxlIGZpbGVzLiAgKi8iID4+IGluY2x1ZGUvbmV0LXNubXAvYWdlbnQvbWliX21vZHVsZV9jb25maWcuaAogICAgICBlY2hvICIjZGVmaW5lIFVTSU5HXyR7c3ltfV9NT0RVTEUgMSIgPj4gaW5jbHVkZS9uZXQtc25tcC9hZ2VudC9taWJfbW9kdWxlX2NvbmZpZy5oCiAgICAgIGVjaG8gIiAiID4+IGluY2x1ZGUvbmV0LXNubXAvYWdlbnQvbWliX21vZHVsZV9jb25maWcuaAogICAgICBjaGFuZ2VxdW90ZShbLCBdKQogICAgICBlY2hvICRFQ0hPX04gIiAkaSRFQ0hPX0MiCiAgICAgIGNoYW5nZXF1b3RlKCwgKQogICAgZmkKICBkb25lCiAgbmV3X21vZHVsZV9saXN0PSIkbmV3X2xpc3RfdHdvIgogIG5ld19saXN0X3R3bz0iIgpkb25lCm1vZHVsZV9saXN0X289YGVjaG8gIiRtb2R1bGVfbGlzdF9jb2RlICIgfCBzZWQgJ3MvXChbXiBdXCkgL1wxLm8gL2cnYAptb2R1bGVfbGlzdF9sbz1gZWNobyAiJG1vZHVsZV9saXN0X2NvZGUgIiB8IHNlZCAncy9cKFteIF1cKSAvXDEubG8gL2cnYAptb2R1bGVfbGlzdF9jPWBlY2hvICIkbW9kdWxlX2xpc3RfY29kZSAiIHwgc2VkICdzL1woW14gXVwpIC9cMS5jIC9nJ2AKbWliZ3JvdXBfbGlzdF9vPWBlY2hvICIgJG1vZHVsZV9saXN0X28gIiB8IHNlZCAnc0AgXChbXiBdKlwpXC5vQCBtaWJncm91cC9cMS5vIEBnJ2AKbWliZ3JvdXBfbGlzdF9sbz1gZWNobyAiICRtb2R1bGVfbGlzdF9sbyAiIHwgc2VkICdzQCBcKFteIF0qXClcLmxvQCBtaWJncm91cC9cMS5sbyBAZydgCmNoYW5nZXF1b3RlKFssIF0pCk1PRFVMRV9MSVNUPSRtb2R1bGVfbGlzdF9jb2RlCkFDX1NVQlNUKE1PRFVMRV9MSVNUKQpBQ19TVUJTVChtb2R1bGVfbGlzdF9jKQpBQ19TVUJTVChtb2R1bGVfbGlzdF9oKQpBQ19TVUJTVChtb2R1bGVfbGlzdF9vKQpBQ19TVUJTVChtb2R1bGVfbGlzdF9sbykKQUNfU1VCU1QobWliZ3JvdXBfbGlzdF9vKQpBQ19TVUJTVChtaWJncm91cF9saXN0X2xvKQpBQ19TVUJTVChtb2R1bGVfbGlzdCkKQUNfU1VCU1QoZGVmYXVsdF9taWJzX2luc3RhbGwpCgpBQ19NU0dfUkVTVUxUKC4pCgpBQ19NU0dfQ0hFQ0tJTkcoW2lmIGRpcmVjdG9yaWVzIG5lZWQgdG8gYmUgY3JlYXRlZF0pCmZvciBpIGluICRtb2R1bGVfZGlyZWN0b3JpZXM7IGRvCiAgJHNyY2Rpci9ta2luc3RhbGxkaXJzICRpCmRvbmUKQUNfTVNHX1JFU1VMVCguKQoKQUNfTVNHX0NIRUNLSU5HKFtkZWZhdWx0IG1pYiBmaWxlcyB0byByZWFkXSkKaWYgdGVzdCAieCRERUZBVUxUX01JQlMiID0gIngiOyB0aGVuCiAgREVGQVVMVF9NSUJTPSIkZGVmYXVsdF9taWJzIgpmaQpBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9NSUJTLCIkREVGQVVMVF9NSUJTIikKQUNfTVNHX1JFU1VMVCgkREVGQVVMVF9NSUJTKQoKIwojIENoZWNrIGZvciBrZXJuZWwgbG9jYXRpb24KIwoKQUNfQ0FDSEVfQ0hFQ0soZm9yIGxvY2F0aW9uIG9mIHN5c3RlbSBrZXJuZWwsYWNfY3ZfS0VSTkVMX0xPQywKW2FjX2N2X0tFUk5FTF9MT0M9InVua25vd24iCiMgRmlyc3QgZGV0ZXJtaW5lIGlmIHRlc3QgZXhwZWN0cyBhIC1mIG9yIGEgLWMgKGNoYXJhY3RlciBkZXZpY2UgKFNZU1YpKQoKaWYgdGVzdCAtYyAvZGV2L251bGw7IHRoZW4KICBDRkxBRz0iLWMiCmVsaWYgdGVzdCAtZiAvZGV2L251bGw7IHRoZW4KICBDRkxBRz0iLWYiCmVsc2UKICAjIGZhbGwgYmFjawogIENGTEFHPSItZiIKZmkKZm9yIGkgaW4gL3ZtdW5peCAvaHAtdXggL3N0YW5kL3ZtdW5peCAvZGV2L2tzeW1zIC9rZXJuZWwvdW5peCAva2VybmVsL2dlbnVuaXggL25ldGJzZCAvdW5peCAva2VybmVsIC9ic2QgL21hY2hfa2VybmVsCiAgZG8KICBpZiB0ZXN0IC1mICRpIC1vICRDRkxBRyAkaTsgdGhlbgogICAgYWNfY3ZfS0VSTkVMX0xPQz0iJGkiCiAgICBicmVhazsKICBmaQpkb25lCmlmIHRlc3QgJGkgPSAidW5rbm93biI7IHRoZW4KICBBQ19NU0dfV0FSTihbQ2FuJ3QgZmluZCBzeXN0ZW0ga2VybmVsLi4uICBTZXR0aW5nIHRvIC92bXVuaXhdKQogIGFjX2N2X0tFUk5FTF9MT0M9Ii92bXVuaXgiCmZpCl0pCgpBQ19ERUZJTkVfVU5RVU9URUQoS0VSTkVMX0xPQywiJGFjX2N2X0tFUk5FTF9MT0MiKQoKIwojIENoZWNrIGZvciBtb3VudCB0YWJsZSBsb2NhdGlvbgojCgpBQ19DQUNIRV9DSEVDSyhmb3IgbW91bnQgdGFibGUgbG9jYXRpb24sYWNfY3ZfRVRDX01OVFRBQiwKW2FjX2N2X0VUQ19NTlRUQUI9InVua25vd24iCmZvciBpIGluIC9ldGMvbW50dGFiIC9ldGMvbXRhYiAvZXRjL2ZpbGVzeXN0ZW1zCiAgZG8KICBpZiB0ZXN0IC1mICRpOyB0aGVuCiAgICBhY19jdl9FVENfTU5UVEFCPSIkaSIKICAgIGJyZWFrOwogIGZpCmRvbmUKXSkKCkFDX0RFRklORV9VTlFVT1RFRChFVENfTU5UVEFCLCIkYWNfY3ZfRVRDX01OVFRBQiIpCgojIENoZWNrIGZvciAvZGV2L2RtZW0gb3IgL2Rldi9kcnVtIGxvY2F0aW9uCkFDX0NBQ0hFX0NIRUNLKGZvciBsb2NhdGlvbiBvZiBzd2FwIGRldmljZSxhY19jdl9ETUVNX0xPQywKWwojIEZpcnN0IGRldGVybWluZSBpZiB0ZXN0IGV4cGVjdHMgYSAtZiBvciBhIC1jIChjaGFyYWN0ZXIgZGV2aWNlIChTWVNWKSkKCmlmIHRlc3QgLWYgL2Rldi9rbWVtOyB0aGVuCiAgQ1RFU1Q9InRlc3QgLWYiCmVsaWYgdGVzdCAtYyAvZGV2L2ttZW07IHRoZW4KICBDVEVTVD0idGVzdCAtYyIKZWxzZQogICMgZmFsbCBiYWNrCiAgQ1RFU1Q9InRlc3QgLWYiCmZpCgppZiAkQ1RFU1QgL2Rldi9kbWVtOyB0aGVuCiAgYWNfY3ZfRE1FTV9MT0M9Ii9kZXYvZG1lbSIKZWxpZiAkQ1RFU1QgL2Rldi9kcnVtOyB0aGVuCiAgYWNfY3ZfRE1FTV9MT0M9Ii9kZXYvZHJ1bSIKZWxzZQogIGFjX2N2X0RNRU1fTE9DPSJub25lIgpmaQpdKQoKaWYgdGVzdCAieCRhY19jdl9ETUVNX0xPQyIgIT0gInhub25lIjsgdGhlbgogIEFDX0RFRklORV9VTlFVT1RFRChETUVNX0xPQywiJGFjX2N2X0RNRU1fTE9DIikKZmkKCiMgZm9yY2VkIGVmZW5jZSB0dXJuZWQgb2ZmLgojIGlmIHRlc3QgIngkZGV2ZWxvcGVyIiA9ICJ4eWVzIiAtYSAieCR1c2VfZWZlbmNlIiAhPSAieG5vIjsgdGhlbgojICAgIHVzZV9lZmVuY2U9InllcyIKIyBmaQoKaWYgdGVzdCAieCR1c2VfZWZlbmNlIiA9ICJ4eWVzIjsgdGhlbgogICAgQUNfQ0hFQ0tfTElCKGVmZW5jZSwgRUZfRXhpdCkKZmkKCiMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCiMgQUNfQ0hFQ0tfTElCKGRlcywgbWFpbikKQUNfQ0hFQ0tfTElCKG0sIGFzaW4pCiMgbmxpc3QgaXMgbmVlZGVkIGZvciB1cHRpbWUgb24gc29tZSBzeXRlbXMgaW4gdGhlIGdlbmVyaWMgbGlicmFyeQpBQ19DSEVDS19MSUIoZWxmLCBubGlzdCkKCiMgT24gc29tZSBwbGF0Zm9ybXMgKElyaXgpIGxpYm5zbCBhbmQgbGlic29ja2V0IHNob3VsZCBub3QgYmUgdXNlZC4KQUNfQ0hFQ0tfRlVOQyhnZXRob3N0YnluYW1lLCBBQ19ERUZJTkUoSEFWRV9HRVRIT1NUQllOQU1FKSwKCUFDX0NIRUNLX0xJQihuc2wsIGdldGhvc3RieW5hbWUsIEFDX0RFRklORShIQVZFX0dFVEhPU1RCWU5BTUUpCglMSUJTPSIke0xJQlN9IC1sbnNsIikpCkFDX0NIRUNLX0ZVTkMoZ2V0c2VydmJ5bmFtZSwgQUNfREVGSU5FKEhBVkVfR0VUU0VSVkJZTkFNRSksCglBQ19DSEVDS19MSUIoc29ja2V0LCBnZXRzZXJ2YnluYW1lLCBBQ19ERUZJTkUoSEFWRV9HRVRTRVJWQllOQU1FKQoJTElCUz0iJHtMSUJTfSAtbHNvY2tldCIpKQoKIyBSZXBsYWNlIGBtYWluJyB3aXRoIGEgZnVuY3Rpb24gaW4gLWxrc3RhdDoKQUNfQ0hFQ0tfTElCKGtzdGF0LCBrc3RhdF9sb29rdXApCiMgQ2hlY2sgZm9yIG5saXN0IGluIG1sZCAoaXJpeCkKQUNfQ0hFQ0tfTElCKG1sZCwgbmxpc3QpCgojIENoZWNrIGZvciBzZWN1cml0eSByZWxhdGVkIGZ1bmN0aW9ucwppZiB0ZXN0ICJ4JHRyeW9wZW5zc2wiICE9ICJ4bm8iOyB0aGVuCiAgICBpZiB0ZXN0ICJ4JHRyeXJzYXJlZiIgIT0gInhubyI7IHRoZW4KICAgICAgICAgQUNfQ0hFQ0tfTElCKHJzYXJlZiwgUlNBUHJpdmF0ZURlY3J5cHQpCiAgICAgICAgIEFDX0NIRUNLX0xJQihSU0FnbHVlLCBSU0FfUEtDUzFfUlNBcmVmKQogICAgZmkKCiAgICBBQ19DSEVDS19MSUIoY3J5cHRvLCBFVlBfbWQ1KQogICAgQUNfQ0hFQ0tfRlVOQ1MoQUVTX2NmYjEyOF9lbmNyeXB0KQpmaQoKIyBDaGVjayBmb3IgbGlicmFyaWVzIHRoYXQgdGhlIGFnZW50IG5lZWRzCiMgc2F2aW5nIG9sZCBsaWJyYXJpZXMKTk9OQUdFTlRMSUJTPSRMSUJTCgojIGNoZWNrIGZvciB0Y3Agd3JhcHBlciBzdXBwb3J0Cl9jcHBmbGFncz0iJHtDUFBGTEFHU30iCl9sZGZsYWdzPSIke0xERkxBR1N9IgoKQUNfQVJHX1dJVEgobGlid3JhcCwKWyAgLS13aXRoLWxpYndyYXBbPUxJQlBBVEhdIENvbXBpbGUgaW4gbGlid3JhcCAodGNwX3dyYXBwZXJzKSBzdXBwb3J0Ll0sWwogIGlmIHRlc3QgIiR3aXRoX2xpYndyYXAiICE9ICJubyI7IHRoZW4KICAgIGlmIHRlc3QgIiR3aXRoX2xpYndyYXAiICE9ICJ5ZXMiOyB0aGVuCiAgICAgIENQUEZMQUdTPSIke0NQUEZMQUdTfSAtSSR3aXRoX2xpYndyYXAvaW5jbHVkZSIKICAgICAgTERGTEFHUz0iJHtMREZMQUdTfSAtTCR3aXRoX2xpYndyYXAvbGliIgogICAgZmkKCiAgICBfbGlicz0ke0xJQlN9CiAgICBBQ19DSEVDS19IRUFERVIodGNwZC5oLCAsCgkgICAgQUNfTVNHX0VSUk9SKFtBc2tlZCB0byB1c2UgbGlid3JhcCBidXQgSSBjb3VsZG4ndCBmaW5kIHRjcGQuaC5dKSkKCiAgICBMSUJTPSIkTElCUyAtbHdyYXAiCglBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUQ1Agd3JhcHBlcnMgbGlicmFyeSAtbHdyYXBdKQoJQUNfVFJZX0xJTksoWyNpbmNsdWRlIDx0Y3BkLmg+CgkJICAgICBpbnQgYWxsb3dfc2V2ZXJpdHkgPSAwOwoJCSAgICAgaW50IGRlbnlfc2V2ZXJpdHkgID0gMDsKCQkgICAgXSxbaG9zdHNfYWNjZXNzKCh2b2lkICopMCldLFsKCgkgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKCSAgICBBQ19ERUZJTkUoVVNFX0xJQldSQVApCgkgICAgdGVzdCAiJHdpdGhfbGlid3JhcCIgIT0gbm8gLWEgIiR3aXRoX2xpYndyYXAiICE9IHllcyAmJiBXUkFQTElCUz0iLUwkd2l0aF9saWJ3cmFwL2xpYiIKCSAgICBXUkFQTElCUz0iJFdSQVBMSUJTIC1sd3JhcCJdLAogICAgICAgIFsKCSAgICBBQ19NU0dfUkVTVUxUKFtub10pCgkgICAgIyBMaW51eCBSZWRIYXQgNi4xIHdvbid0IGxpbmsgbGlid3JhcCB3aXRob3V0IGxpYm5zbAoJICAgIEFDX0NIRUNLX0ZVTkMoeXBfZ2V0X2RlZmF1bHRfZG9tYWluLCAsCgkJQUNfQ0hFQ0tfTElCKG5zbCwgeXBfZ2V0X2RlZmF1bHRfZG9tYWluKSkKCSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUQ1Agd3JhcHBlcnMgbGlicmFyeSAtbHdyYXAgbGlua2VkIHdpdGggLWxuc2xdKQoJICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8dGNwZC5oPgoJCSAgICAgICAgIGludCBhbGxvd19zZXZlcml0eSA9IDA7CgkgICAgICAgICAgICAgICAgIGludCBkZW55X3NldmVyaXR5ICA9IDA7CgkgCQldLFtob3N0c19hY2Nlc3MoKHZvaWQgKikwKV0sCgoJCQlBQ19NU0dfUkVTVUxUKHllcykKCQkJQUNfREVGSU5FKFVTRV9MSUJXUkFQKQoJCQl0ZXN0ICIkd2l0aF9saWJ3cmFwIiAhPSBubyAtYSAiJHdpdGhfbGlid3JhcCIgIT0geWVzICYmIFdSQVBMSUJTPSItTCR3aXRoX2xpYndyYXAvbGliIgoJCQlXUkFQTElCUz0iJFdSQVBMSUJTIC1sd3JhcCAtbG5zbCIsCgoJCQlBQ19NU0dfUkVTVUxUKG5vKQoJCQlBQ19NU0dfRVJST1IoQXNrZWQgdG8gdXNlIGxpYndyYXAgYnV0IEkgY291bGRuJ3QgZmluZCBpdC4pKV0pCiAgICBDUFBGTEFHUz0ke19jcHBmbGFnc30KICAgIExERkxBR1M9JHtfbGRmbGFnc30KICAgIExJQlM9JHtfbGlic30KICBmaQpdKQoKIwojIHJwbSBsaWJyYXJpZXMgb25seSBuZWVkZWQgZm9yIHRoZSBob3N0IHJlc291cmNlcyBtaWIgc29mdHdhcmUKIyBpbnN0YWxsZWQgdGFibGVzIChvbiBsaW51eCBpbiBwYXJ0aWN1bGFyKQojCmlmIHRlc3QgIngkd2l0aF9ycG0iICE9ICJ4bm8iICYmIFwKICAgICAgICBlY2hvICIgJG1vZHVsZV9saXN0ICIgfCBncmVwICIgaG9zdC9ocl9zd2luc3QgIiA+IC9kZXYvbnVsbDsgdGhlbgogICMgQVJHLiAgUlBNIGlzIGEgcmVhbCBwYWluLgogICMgRldJVyBsaWJycG0ubGEsIGxpYnJwbWlvLmxhLCBhbmQgbGlicG9wdC5sYSBoYXZlIGNvcnJlY3QgZGVwZW5kZW5jaWVzLgogIF9ycG1saWJzPSIiCgogICMgemxpYiBpcyByZXF1aXJlZCBmb3IgbmV3ZXIgdmVyc2lvbnMgb2YgcnBtCiAgX2NwcGZsYWdzPSIke0NQUEZMQUdTfSIKICBfbGRmbGFncz0iJHtMREZMQUdTfSIKCiAgQUNfQVJHX1dJVEgoemxpYiwKICBbICAtLXdpdGgtemxpYls9RElSXSAgICAgICAgdXNlIGxpYnogaW4gRElSXSxbCiAgICBpZiB0ZXN0IC1kICIkd2l0aHZhbCI7IHRoZW4KICAgICAgQ1BQRkxBR1M9IiR7Q1BQRkxBR1N9IC1JJHdpdGh2YWwvaW5jbHVkZSIKICAgICAgTERGTEFHUz0iJHtMREZMQUdTfSAtTCR3aXRodmFsL2xpYiIKICAgIGZpCiAgXSkKCiAgIyBkdW5ubyBpZiB0aGlzIGlzIG5lZWRlZCBmb3IgcnBtLTQuMC54LCBlYXJsaWVyIHByb2JhYmx5IG5lZWRzLgogIEFDX0NIRUNLX0hFQURFUih6bGliLmgsCiAgICAgIEFDX0NIRUNLX0xJQih6LCBnenJlYWQsICwgQ1BQRkxBR1M9JHtfY3BwZmxhZ3N9IExERkxBR1M9JHtfbGRmbGFnc30pLAogICAgICBDUFBGTEFHUz0ke19jcHBmbGFnc30gTERGTEFHUz0ke19sZGZsYWdzfSkKCiAgIyB0d28gdmFyaWFudHMgb2YgYnppcDIgbmVlZCBjaGVja2luZy4KICBBQ19DSEVDS19MSUIoYnoyLCBienJlYWQsIFtfcnBtbGlicz0iJF9ycG1saWJzIC1sYnoyIl0sCiAgICAgQUNfQ0hFQ0tfTElCKGJ6MiwgQloyX2J6cmVhZCwgW19ycG1saWJzPSIkX3JwbWxpYnMgLWxiejIiXSwpKQoKICAjIHR3byB2YXJpYW50cyBvZiBkYjEgbmVlZCBjaGVja2luZy4KICBBQ19DSEVDS19MSUIoZGIxLCBkYm9wZW4sIFtfcnBtbGlicz0iLWxkYjEgJF9ycG1saWJzIl0sCiAgICAgQUNfQ0hFQ0tfTElCKGRiLCBkYm9wZW4sIFtfcnBtbGlicz0iLWxkYiAkX3JwbWxpYnMiXSkpCgogICMgdHdvIHZhcmlhbnRzIG9mIGRiMyBuZWVkIGNoZWNraW5nLgogIEFDX0NIRUNLX0xJQihkYi0zLjEsIGRiX2NyZWF0ZSwgW19ycG1saWJzPSItbGRiLTMuMSAkX3JwbWxpYnMiXSwKICAgIEFDX0NIRUNLX0xJQihkYi0zLjAsIGRiX2NyZWF0ZSwgW19ycG1saWJzPSItbGRiLTMuMCAkX3JwbWxpYnMiXSkpCiAgCiAgIyBycG0tMy4wLjUgYW5kIGxhdGVyIG5lZWRzIHBvcHQuCiAgQUNfQ0hFQ0tfTElCKHBvcHQsIHBvcHRQYXJzZUFyZ3ZTdHJpbmcsIFtfcnBtbGlicz0iLWxwb3B0ICRfcnBtbGlicyJdKQogIAogICMgcnBtLTQuMC54IG5lZWRzIHJwbWlvLgogIEFDX0NIRUNLX0xJQihycG1pbywgRm9wZW4sIFtfcnBtbGlicz0iLWxycG1pbyAkX3JwbWxpYnMiXSwsJF9ycG1saWJzKQogIAogICMgbm93IGNoZWNrIGZvciBycG0gdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGxpYnJhcmllcy4KICBBQ19DSEVDS19MSUIocnBtLCBycG1HZXRGaWxlc3lzdGVtTGlzdCxbCiAgICBBQ19ERUZJTkUoSEFWRV9MSUJSUE0pCiAgICBMSUJTPSItbHJwbSAkX3JwbWxpYnMgJExJQlMiCiAgICBDRkxBR1M9IiRDRkxBR1MgLUkvdXNyL2luY2x1ZGUvcnBtIgogIF0sWwogICAgIyBycG0tNC4wLjMgbGlicnBtZGIgYWN0dWFsbHkgY29udGFpbnMgd2hhdCB3ZSBuZWVkLgogICAgQUNfQ0hFQ0tfTElCKHJwbWRiLCBycG1kYk9wZW4sWwogICAgICBBQ19ERUZJTkUoSEFWRV9MSUJSUE0pCiAgICAgIExJQlM9Ii1scnBtZGIgLWxycG0gJF9ycG1saWJzICRMSUJTIgogICAgICBDRkxBR1M9IiRDRkxBR1MgLUkvdXNyL2luY2x1ZGUvcnBtIgogICAgXSwsLWxycG0gJF9ycG1saWJzKQogIF0pCmZpCiAgCiMgUmVwbGFjZSBgbWFpbicgd2l0aCBhIGZ1bmN0aW9uIGluIC1sa3ZtOgpBQ19DSEVDS19MSUIoa3ZtLCBrdm1fcmVhZCkKIyBEWU5BTUlDIE1PRFVMRSBTVVBQT1JUCkFDX0NIRUNLX0xJQihkbCwgZGxvcGVuKQpBQ19DSEVDS19GVU5DUyhkbG9wZW4pCgpBQ19DSEVDS19GVU5DUyhrdm1fb3BlbmZpbGVzIG5saXN0IGtubGlzdCBrdm1fZ2V0cHJvY3MpCmVjaG8gIiR3aXRoX21pYl9tb2R1bGVzIiB8IGdyZXAgInVjZC1zbm1wL2Rpc2tpbyIgPi9kZXYvbnVsbAojIHdoZXRoZXIgd2UgbmVlZCAtbGRldnN0YXQgZm9yIGRpc2tpbyBNSUIKaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KCUFDX0NIRUNLX0ZVTkMoZ2V0ZGV2cywgQUNfREVGSU5FKEhBVkVfR0VUREVWUyksCgkJQUNfQ0hFQ0tfTElCKGRldnN0YXQsIGdldGRldnMsIEFDX0RFRklORShIQVZFX0dFVERFVlMpCgkJTElCUz0iJHtMSUJTfSAtbGRldnN0YXQiKSkKZmkKCiMgTE0tU0VOU09SUy1NSUIgc3VwcG9ydAplY2hvICIgJHdpdGhfbWliX21vZHVsZXMgIiB8IGdyZXAgIiB1Y2Qtc25tcC9sbVNlbnNvcnMgIiA+IC9kZXYvbnVsbAppZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgogICAgICAgIEFDX0NIRUNLX0hFQURFUihzZW5zb3JzL3NlbnNvcnMuaCkKICAgICAgICBBQ19DSEVDS19MSUIoc2Vuc29ycywgc2Vuc29yc19nZXRfZGV0ZWN0ZWRfY2hpcHMpCmZpCgojCiMgSW5zdGFsbCB0aGUgdmFyaW91cyBwZXJsIG1vZHVsZXMKIwoKaWYgdGVzdCAieCRlbWJlZF9wZXJsIiA9ICJ4eWVzIiAtYSAieCRpbnN0YWxsX3BlcmwiID0gInhubyIgOyB0aGVuCiAgaW5zdGFsbF9wZXJsPSJ5ZXMiCmZpCmlmIHRlc3QgIngkaW5zdGFsbF9wZXJsIiAhPSAieCIgLWEgIngkaW5zdGFsbF9wZXJsIiAhPSAieG5vIjsgdGhlbgogICAgUEVSTFRBUkdTPSJwZXJsbW9kdWxlcyIKICAgIFBFUkxJTlNUQUxMVEFSR1M9InBlcmxpbnN0YWxsIgogICAgUEVSTFVOSU5TVEFMTFRBUkdTPSJwZXJsdW5pbnN0YWxsIgogICAgQUNfU1VCU1QoUEVSTFRBUkdTKQogICAgQUNfU1VCU1QoUEVSTElOU1RBTExUQVJHUykKICAgIEFDX1NVQlNUKFBFUkxVTklOU1RBTExUQVJHUykKICAgIEFDX1NVQlNUKFBFUkxBUkdTKQogICAgQUNfTVNHX0NBQ0hFX0FERChTTk1QIFBlcmwgbW9kdWxlczogICAgICAgICAgZW5hYmxlZCkKZWxzZQogICAgQUNfTVNHX0NBQ0hFX0FERChTTk1QIFBlcmwgbW9kdWxlczogICAgICAgICAgZGlzYWJsZWQpCmZpCgojCiMgRW1iZWRkZWQgUGVybCBzcGVjaWZpYyBzdHVmZgojCmlmIHRlc3QgIngkZW1iZWRfcGVybCIgPSAieHllcyI7IHRoZW4KICAgIG15cGVybD0kYWNfY3ZfcGF0aF9QRVJMUFJPRwogICAgaWYgdGVzdCAkbXlwZXJsID0gIm5vIjsgdGhlbgogICAgICBBQ19NU0dfRVJST1IoLS1lbmFibGUtZW1iZWRkZWQtcGVybCByZXF1ZXN0ZWQgYnV0IG5vIHBlcmwgZXhlY3V0YWJsZSBmb3VuZCkKICAgIGZpCgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcGVybCBDRkxBR1NdKQogICAgcGVybGNmbGFncz1gJG15cGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBjY29wdHNgCiAgICBBQ19NU0dfUkVTVUxUKCRwZXJsY2ZsYWdzKQogICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkcGVybGNmbGFncyIKCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwZXJsIExERkxBR1NdKQogICAgcGVybGxkb3B0cz1gJG15cGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBsZG9wdHNgCiAgICBBQ19NU0dfUkVTVUxUKCRwZXJsbGRvcHRzKQogICAgTElCUz0iJExJQlMgJHBlcmxsZG9wdHMiCgogICAgIyBuZXdlciBwZXJsIHZzIG9sZGVyIHBlcmwgY2FsbCBmdW5jdGlvbnMKICAgIEFDX0NIRUNLX0ZVTkNTKFBlcmxfZXZhbF9wdiBldmFsX3B2IHBlcmxfZXZhbF9wdikKCiAgICBBQ19ERUZJTkUoTkVUU05NUF9FTUJFRERFRF9QRVJMKQogICAgT1RIRVJBR0VOVExJQk9CSlM9InNubXBfcGVybC5vIgogICAgT1RIRVJBR0VOVExJQkxPQkpTPSJzbm1wX3BlcmwubG8iCgogICAgRU1CRURQRVJMSU5TVEFMTD0iZW1iZWRwZXJsaW5zdGFsbCIKICAgIEVNQkVEUEVSTFVOSU5TVEFMTD0iZW1iZWRwZXJsdW5pbnN0YWxsIgogICAgQUNfTVNHX0NBQ0hFX0FERChFbWJlZGRlZCBwZXJsIHN1cHBvcnQ6ICAgICAgZW5hYmxlZCkKZWxzZQogICAgRU1CRURQRVJMSU5TVEFMTD0iIgogICAgRU1CRURQRVJMVU5JTlNUQUxMPSIiCiAgICBBQ19NU0dfQ0FDSEVfQUREKEVtYmVkZGVkIHBlcmwgc3VwcG9ydDogICAgICBkaXNhYmxlZCkKZmkKQUNfU1VCU1QoRU1CRURQRVJMSU5TVEFMTCkKQUNfU1VCU1QoRU1CRURQRVJMVU5JTlNUQUxMKQoKIyByZXNldCBsaWJzCkFHRU5UTElCUz0kTElCUwpMSUJTPSROT05BR0VOVExJQlMKCiMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCkFDX0hFQURFUl9TVERDCkFDX0hFQURFUl9ESVJFTlQKQUNfSEVBREVSX1NZU19XQUlUCkFDX0NIRUNLX0hFQURFUlMoc3RkYXJnLmggc3RyaW5nLmggZmNudGwuaCBsaW1pdHMuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIHN5c2xvZy5oIHVuaXN0ZC5oIG5ldGluZXQvdGNwaXAuaCBuZXRpbmV0L2luLmggbmV0aW5ldC9pcC5oIG5ldGluZXQvaXBfaWNtcC5oIG5ldC9pZi5oIG5ldGRiLmggc3lzL2RtYXAuaCBtYWNoaW5lL3B0ZS5oIHh0aS5oIHN5cy9zb2NraW8uaCBzeXMvc29ja2V0Lmggc3lzL3VuLmggZnN0YWIuaCBzeXMvZnMuaCBtdGFiLmggdWZzL2ZzLmggdWZzL2Zmcy9mcy5oIHN5cy9maXhwb2ludC5oIG1hY2hpbmUvcGFyYW0uaCBzeXMvdm0uaCB2bS92bS5oIHN5cy92bW1ldGVyLmggc3lzL3ZtcGFyYW0uaCBzeXMvdm1tYWMuaCBzeXMvdm1zeXN0bS5oIHN5cy9tYnVmLmggc3lzL3RpbWUuaCBzeXMvc3dhcC5oIGluZXQvbWliMi5oIHN5cy9zdGF0dmZzLmggc3lzL3Zmcy5oIHN5cy9tbnR0YWIuaCBzeXMvdXNlci5oIHN5cy9wcm9jLmggc3lzL3NlbGVjdC5oIG1udGVudC5oIHN5cy9tbnRlbnQuaCBrc3RhdC5oIHV0c25hbWUuaCBzeXMvdXRzbmFtZS5oIHN5cy9jZGVmcy5oIGdldG9wdC5oIGxvY2FsZS5oIHB0aHJlYWQuaCBzeXMvbG9hZGF2Zy5oIHJlZ2V4LmggbGludXgvdGFza3MuaCBwd2QuaCBncnAuaCB1dG1weC5oKQojIEZyZWVCU0QgcmVxdWlyZWQgaGVhZGVycwpBQ19DSEVDS19IRUFERVJTKG1hbGxvYy5oIHN5cy9wYXJhbS5oIG5ldC9pZl9kbC5oIHN5cy9zeXNjdGwuaCBzdGRsaWIuaCBuZXQvaWZfbWliLmggbmV0L2lmX3R5cGVzLmggbmV0L2lmX3Zhci5oIHN5cy9xdWV1ZS5oIG9zcmVsZGF0ZS5oIG1hY2hpbmUvdHlwZXMuaCBzeXMvc29ja2V0dmFyLmgpCiMgTGludXgKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvY29uZi5oIG5ldGluZXQvaW5fc3lzdG0uaCBuZXRpbmV0L3RjcC5oIG5ldGluZXQvdWRwLmggbmV0aW5ldC9pbl92YXIuaCBuZXRpbmV0L2lmX2V0aGVyLmggbmV0aW5ldC9pcF92YXIuaCBuZXRpbmV0L3RjcF90aW1lci5oIG5ldGluZXQvdGNwX3Zhci5oIG5ldGluZXQvdGNwX2ZzbS5oIG5ldGluZXQvdWRwX3Zhci5oIG5ldGluZXQvaWNtcF92YXIuaCBzeXMvcHJvdG9zdy5oIG5saXN0LmggaW9jdGxzLmggYXNtL3BhZ2UuaCBuZXRpcHgvaXB4LmgpCiMgTmV0QlNEIHJlcXVpcmVkIGhlYWRlcnMKQUNfQ0hFQ0tfSEVBREVSUyhhcnBhL2luZXQuaCBrdm0uaCBzeXMvcG9vbC5oIHV2bS91dm1fcGFyYW0uaCB1dm0vdXZtX2V4dGVybi5oIHZtL3ZtX3BhcmFtLmggdm0vdm1fZXh0ZXJuLmgpCiMgQlNEaTIgaGVhZGVycwpBQ19DSEVDS19IRUFERVJTKHN5cy9tb3VudC5oIHZtL3N3YXBfcGFnZXIuaCB1ZnMvdWZzL2Rpbm9kZS5oKQojIEJTRGkzIGhlYWRlcnMKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc3RhdC5oIHN5cy92bm9kZS5oIHVmcy91ZnMvcXVvdGEuaCB1ZnMvdWZzL2lub2RlLmgpCiMgaXJpeCBoZWFkZXJzCkFDX0NIRUNLX0hFQURFUlMoc3lzL2hhc2hpbmcuaCBzeXMvdGNwaXBzdGF0cy5oIHN5cy9zeXNtcC5oKQojIGZyb20gc211eCBzdHVmZgpBQ19DSEVDS19IRUFERVJTKGVyci5oIHN5cy9maWxpby5oIHNndHR5LmgpCiMgQUlYIG5lZWRzIHRoaXMgZm9yIHN0YXRmcyBmdW5jCkFDX0NIRUNLX0hFQURFUlMoc3lzL3N0YXRmcy5oKQojIER5bml4CkFDX0NIRUNLX0hFQURFUlMobmV0L3JvdXRlLmgpCiMgZm9yIEhvc3RSZXMgKEhQLVVYIGF0IGxlYXN0KQpBQ19DSEVDS19IRUFERVJTKHN5cy9ka2lvLmggc3lzL2Rpc2tpby5oIHN5cy9wc3RhdC5oIGxpbnV4L2hkcmVnLmggcGtnbG9jcy5oKQojIGZvciBIb3N0UmVzIChTb2xhcmlzIDIueCBhdCBsZWFzdCkKQUNfQ0hFQ0tfSEVBREVSUyhwa2dpbmZvLmgsCiAgICBBQ19DSEVDS19MSUIoYWRtLCBwa2dpbmZvLCBBQ19ERUZJTkUoSEFWRV9QS0dJTkZPKQogICAgTElCUz0iJHtMSUJTfSAtbGFkbSIKICAgIEFHRU5UTElCUz0iJHtBR0VOVExJQlN9IC1sYWRtIikpCiMgQUlYIHBlcmZzdGF0IGxpYnJhcnksIG5lZWRlZCBmb3IgQ1BVL21lbW9yeSBzdGF0aXN0aWNzCmNhc2UgJHRhcmdldF9vcyBpbgogICAgYWl4KikKICAgICAgICBBQ19DSEVDS19IRUFERVJTKGxpYnBlcmZzdGF0LmgsCiAgICAgICAgICAgIEFDX0NIRUNLX0xJQihwZXJmc3RhdCwgcGVyZnN0YXRfY3B1X3RvdGFsLCBBQ19ERUZJTkUoSEFWRV9QRVJGU1RBVCkKICAgICAgICAgICAgQUdFTlRMSUJTPSIke0FHRU5UTElCU30gLWxwZXJmc3RhdCIpLCBBQ19NU0dfRVJST1IoWwoKKioqIFRvIG1vbml0b3IgQ1BVL21lbW9yeSB2YWx1ZXMgaW4gQUlYIHlvdSBuZWVkIHRvIGluc3RhbGwKKioqIGxpYnBlcmZzdGF0IHdoaWNoIGNhbiBiZSBmb3VuZCBpbiBib3MucGVyZgpdKSkKICAgICAgICA7OwogICAgKikKICAgICAgICA7Owplc2FjCiMgV0lOMzIKIyAobWluZ3czMiBtdXN0IGxpbmsgd2luc29jayBleHBsaWNpdGx5KQpBQ19DSEVDS19IRUFERVJTKHdpbnNvY2suaCxbCglBR0VOVExJQlM9IiR7QUdFTlRMSUJTfSAtbGlwaGxwYXBpIgoJY2FzZSAkdGFyZ2V0X29zIGluCgkJbWluZ3cqKQoJCQlMSUJTPSIke0xJQlN9IC1sd3NvY2szMiIKCQkJQUdFTlRMSUJTPSIke0FHRU5UTElCU30gLWx3c29jazMyIgoJCQk7OwoJCSopCgkJCTs7Cgllc2FjCl0pCkFDX0NIRUNLX0hFQURFUlMoaW8uaCkKIyBTQ08KQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc3RyZWFtLmgpCiMgS0FNRQpBQ19DSEVDS19IRUFERVJTKG5ldGluZXQvaXA2LmggbmV0aW5ldDYvaW42X3Zhci5oIG5ldGluZXQ2L2luNl9wY2IuaCBuZXRpbmV0Ni9pcDZfdmFyLmggbmV0aW5ldDYvdGNwNi5oIG5ldGluZXQ2L3RjcDZfZnNtLmggbmV0aW5ldDYvbmQ2LmggbmV0aW5ldDYvdGNwNl90aW1lci5oIG5ldGluZXQ2L3RjcDZfdmFyLmgpCiMgRFlOQU1JQyBNT0RVTEUgU1VQUE9SVApBQ19DSEVDS19IRUFERVJTKGRsZmNuLmgpCiMgdGFibGVfYXJyYXkgaGVscGVyIHN1cHBvcnQKQUNfQ0hFQ0tfSEVBREVSUyhzZWFyY2guaCkKCiMgUlBNIHN1YmRpcmVjdG9yeSBwYXRoIChzaWdoKQppZiB0ZXN0ICJ4JHdpdGhfcnBtIiAhPSAieG5vIiAmJiBcCiAgICAgICAgZWNobyAiICRtb2R1bGVfbGlzdCAiIHwgZ3JlcCAiIGhvc3QvaHJfc3dpbnN0ICIgPiAvZGV2L251bGw7IHRoZW4KICBBQ19DSEVDS19IRUFERVJTKHJwbWlvLmgsLCBbCiAgICAgQUNfQ0hFQ0tfSEVBREVSUyhycG0vcnBtaW8uaCwgQ0ZMQUdTPSItSS91c3IvaW5jbHVkZS9ycG0gJENGTEFHUyIpCiAgXSkKZmkKCiMgT3BlbkJTRCAyLjYgbmVlZHMgbmV0aW5ldC9pbi5oIGJlZm9yZSBuZXRpbmV0L2luX3BjYi5oCkFDX01TR19DSEVDS0lORyhbW2ZvciBuZXRpbmV0L2luX3BjYi5oXV0pCkFDX0NBQ0hFX1ZBTChjdl9oYXZlX25ldGluZXRfaW5fcGNiX2gsClsgQUNfVFJZX0NQUCggWwojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbl9wY2IuaD4KXSwgY3ZfaGF2ZV9uZXRpbmV0X2luX3BjYl9oPXllcywgY3ZfaGF2ZV9uZXRpbmV0X2luX3BjYl9oPW5vKV0pCkFDX01TR19SRVNVTFQoJGN2X2hhdmVfbmV0aW5ldF9pbl9wY2JfaCkKaWYgdGVzdCAkY3ZfaGF2ZV9uZXRpbmV0X2luX3BjYl9oID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfTkVUSU5FVF9JTl9QQ0JfSCkKZmkKCiMgTmV0QlNEIG5lZWRzIG1hY2hpbmUvdHlwZXMuaCBiZWZvcmUgc3lzL2Rpc2tsYWJlbC5oCkFDX01TR19DSEVDS0lORyhbW2ZvciBzeXMvZGlza2xhYmVsLmhdXSkKQUNfQ0FDSEVfVkFMKGN2X2hhdmVfc3lzX2Rpc2tsYWJlbF9oLApbIEFDX1RSWV9DUFAoIFsKI2luY2x1ZGUgPG1hY2hpbmUvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9kaXNrbGFiZWwuaD4KXSwgY3ZfaGF2ZV9zeXNfZGlza2xhYmVsX2g9eWVzLCBjdl9oYXZlX3N5c19kaXNrbGFiZWxfaD1ubyldKQpBQ19NU0dfUkVTVUxUKCRjdl9oYXZlX3N5c19kaXNrbGFiZWxfaCkKaWYgdGVzdCAkY3ZfaGF2ZV9zeXNfZGlza2xhYmVsX2ggPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9TWVNfRElTS0xBQkVMX0gpCmZpCgojIE9wZW5TU0wKQUNfQ0hFQ0tfSEVBREVSUyhvcGVuc3NsL2htYWMuaCBvcGVuc3NsL2V2cC5oIG9wZW5zc2wvYWVzLmggb3BlbnNzbC9kZXMuaCkKCiMgUHJpbnRpbmcKQUNfUEFUSF9QUk9HKFtMUFNUQVRfUEFUSF0sbHBzdGF0KQppZiB0ZXN0IHgkTFBTVEFUX1BBVEggIT0geDsgdGhlbgogICAgQUNfREVGSU5FX1VOUVVPVEVEKExQU1RBVF9QQVRILCIkTFBTVEFUX1BBVEgiKQogICAgQUNfREVGSU5FKEhBVkVfTFBTVEFUKQpmaQpBQ19DSEVDS19GVU5DUyhjZ2V0bmV4dCkKaWYgdGVzdCAtciAvZXRjL3ByaW50Y2FwOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9QUklOVENBUCkKZmkKCkFDX01TR19DSEVDS0lORyhbZm9yIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnRdKQppZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jcnlwdG9fRVZQX21kNSIgIT0gInh5ZXMiIC1vICJ4JGFjX2N2X2hlYWRlcl9vcGVuc3NsX2htYWNfaCIgIT0gInh5ZXMiIC1vICJ4JGFjX2N2X2hlYWRlcl9vcGVuc3NsX2htYWNfaCIgIT0gInh5ZXMiOyB0aGVuCiMgaWYgT3BlblNTTCBpcyBub3QgZm91bmQsIGRlZmF1bHQgdG8gdXNpbmcgaW50ZXJuYWwgbWQ1IHN1cHBvcnQuCiAgICBBQ19ERUZJTkUoVVNFX0lOVEVSTkFMX01ENSkKICAgIGF1dGhtb2Rlcz0iTUQ1IgogICAgZW5jcm1vZGVzPSIiCiAgICBBQ19NU0dfUkVTVUxUKEludGVybmFsIE1ENSBTdXBwb3J0KQogICAgaWYgdGVzdCAieCRhc2tlZG9wZW5zc2wiID0gInh5ZXMiOyB0aGVuCglBQ19NU0dfRVJST1IoQXNrZWQgdG8gdXNlIE9wZW5TU0wgYnV0IEkgY291bGRuJ3QgZmluZCBpdC4pCiAgICBmaQplbHNlCiAgICBpZiB0ZXN0ICJ4JHRyeW9wZW5zc2wiID0gInhubyI7IHRoZW4KICAgICAgICBhdXRobW9kZXM9Ik1ENSIKICAgICAgICBlbmNybW9kZXM9IiIKCUFDX0RFRklORShVU0VfSU5URVJOQUxfTUQ1KQoJQUNfTVNHX1JFU1VMVChJbnRlcm5hbCBNRDUgU3VwcG9ydCkKICAgIGVsc2UKICAgICAgICBhdXRobW9kZXM9Ik1ENSBTSEExIgogICAgICAgIGlmIHRlc3QgIngkZW5hYmxlX3ByaXZhY3kiICE9ICJ4bm8iIDsgdGhlbgoJICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9vcGVuc3NsX2Flc19oID0gInllcyIgOyB0aGVuCgkgICAgICAgIGVuY3Jtb2Rlcz0iREVTIEFFUzEyOCBBRVMxOTIgQUVTMjU2IgoJICAgIGVsc2UKCSAgICAgICAgZW5jcm1vZGVzPSJERVMiCgkgICAgZmkKICAgICAgICBlbHNlCgkgICAgZW5jcm1vZGVzPSJbZGlzYWJsZWRdIgogICAgICAgIGZpCglBQ19ERUZJTkUoVVNFX09QRU5TU0wpCglBQ19NU0dfUkVTVUxUKE9wZW5TU0wgU3VwcG9ydCkKICAgIGZpCmZpCgpBQ19NU0dfQ0FDSEVfQUREKEF1dGhlbnRpY2F0aW9uIHN1cHBvcnQ6ICAgICAkYXV0aG1vZGVzKQpBQ19NU0dfQ0FDSEVfQUREKEVuY3J5cHRpb24gc3VwcG9ydDogICAgICAgICAkZW5jcm1vZGVzKQoKIyBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgpBQ19UWVBFX09GRl9UCkFDX1RZUEVfUElEX1QKQUNfSEVBREVSX1RJTUUKCiMgdGhpcyBzaG91bGQgdXNlIEFDX0NIRUNLX1RZUEUsIGJ1dCBpdCdzIGJyb2tlbiBhdCBsZWFzdCBpbiAyLjEzLTE0CiMgc28gd2UgZG8gaXQgYnkgaGFuZC4KQUNfTVNHX0NIRUNLSU5HKFtmb3Igc29ja2xlbl90XSkKQUNfQ0FDSEVfVkFMKGFjX2N2X3R5cGVfJDEsCltBQ19FR1JFUF9DUFAoW3NvY2tsZW5fdEA8OkBeYS16QS1aXzAtOUA6PkBdLApbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgU1REQ19IRUFERVJTCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZl0sIFthY19jdl90eXBlX3NvY2tsZW5fdD15ZXNdLCBbYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9bm9dKV0pCgpBQ19NU0dfUkVTVUxUKFskYWNfY3ZfdHlwZV9zb2NrbGVuX3RdKQppZiB0ZXN0ICRhY19jdl90eXBlX3NvY2tsZW5fdCA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1NPQ0tMRU5fVCkKZmkKCiMgQUlYIGtlZXBzIGluX2FkZHJfdCBpbiAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCkFDX01TR19DSEVDS0lORyhbZm9yIGluX2FkZHJfdF0pCkFDX0NBQ0hFX1ZBTChhY19jdl90eXBlXyQxLApbQUNfRUdSRVBfQ1BQKFtpbl9hZGRyX3RAPDpAXmEtekEtWl8wLTlAOj5AXSwKWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIFNURENfSEVBREVSUwojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWZdLCBbYWNfY3ZfdHlwZV9pbl9hZGRyX3Q9eWVzXSwgW2FjX2N2X3R5cGVfaW5fYWRkcl90PW5vXSldKQoKQUNfTVNHX1JFU1VMVChbJGFjX2N2X3R5cGVfaW5fYWRkcl90XSkKaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbl9hZGRyX3QgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9JTl9BRERSX1QpCmZpCgojIE9sZGVyIHZlcnNpb25zIG9mIE1pbkdXIGRvIG5vdCBkZWZpbmUgc3NpemVfdCBpbiBzeXMvdHlwZXMKQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3NpemVfdF0pCkFDX0NBQ0hFX1ZBTChhY19jdl90eXBlXyQxLApbQUNfRUdSRVBfQ1BQKFtzc2l6ZV90QDw6QF5hLXpBLVpfMC05QDo+QF0sClsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBTVERDX0hFQURFUlMKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNlbmRpZl0sIFthY19jdl90eXBlX3NzaXplX3Q9eWVzXSwgW2FjX2N2X3R5cGVfc3NpemVfdD1ub10pXSkKCkFDX01TR19SRVNVTFQoWyRhY19jdl90eXBlX3NzaXplX3RdKQppZiB0ZXN0ICRhY19jdl90eXBlX3NzaXplX3QgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9TU0laRV9UKQpmaQoKIyBDaGVjayBwcyBhcmdzCkFDX0NBQ0hFX0NIRUNLKFtmb3IgY29ycmVjdCBmbGFncyB0byBwc10sIGFjX2N2X3BzX2ZsYWdzLApbaWYgdGVzdCAiYCgkUFNQUk9HIC1lIDI+JjEpIHwgZWdyZXAgJyAocHMpICokJyB8IGF3ayAne3ByaW50ICRORn0nYCIgPSAicHMiIDsgdGhlbgogIGFjX2N2X3BzX2ZsYWdzPSItZSIKZWxpZiB0ZXN0ICJgKCRQU1BST0cgLWVsIDI+JjEpIHwgZWdyZXAgJyAocHMpICokJyB8IGF3ayAne3ByaW50ICRORn0nYCIgPSAicHMiIDsgdGhlbgogIGFjX2N2X3BzX2ZsYWdzPSItZWwiCmVsaWYgdGVzdCAiYCgkUFNQUk9HIGFjeCAyPiYxKSB8IGVncmVwICcgKHBzKSAqJCcgfCBhd2sgJ3twcmludCAkTkZ9J2AiID0gInBzIiA7IHRoZW4KICBhY19jdl9wc19mbGFncz0iYWN4IgplbGlmIHRlc3QgImAoJFBTUFJPRyAtYWN4IDI+JjEpIHwgZWdyZXAgJyAocHMpICokJyB8IGF3ayAne3ByaW50ICRORn0nYCIgPSAicHMiIDsgdGhlbgogIGFjX2N2X3BzX2ZsYWdzPSItYWN4IgplbGlmIHRlc3QgImAoJFBTUFJPRyAtbyBwaWQsdHQsc3RhdGUsdGltZSx1Y29tbSAyPiYxKSB8IGVncmVwICcgcHMgKiQnIHwgYXdrICd7cHJpbnQgJE5GfSdgIiA9ICJwcyIgOyB0aGVuCiAgYWNfY3ZfcHNfZmxhZ3M9Ii1vIHBpZCx0dCxzdGF0ZSx0aW1lLHVjb21tIgplbGlmIHRlc3QgImAoJFBTUFJPRyBheCAyPiYxKSB8IGVncmVwICcgKHBzKSAqJCcgfCBhd2sgJ3twcmludCAkTkZ9J2AiID0gInBzIiA7IHRoZW4KICBhY19jdl9wc19mbGFncz0iYXgiCmVsc2UKICBBQ19NU0dfV0FSTihbVW5hYmxlIHRvIGRldGVybWluZSB2YWxpZCBwcyBmbGFncy4uLiAgZGVmYXVsdGluZy4uLl0pCiAgYWNfY3ZfcHNfZmxhZ3M9Ii1hY3giCmZpCl0pCgpQU0NNRD0iJFBTUFJPRyAkYWNfY3ZfcHNfZmxhZ3MiCkFDX1NVQlNUKFBTQ01EKQpBQ19ERUZJTkVfVU5RVU9URUQoUFNDTUQsICIkUFNQUk9HICRhY19jdl9wc19mbGFncyIpCgojIENoZWNrcyBmb3IgYnl0ZSBvcmRlcgppZiB0ZXN0ICRjcm9zc19jb21waWxpbmcgPSB5ZXM7IHRoZW4KICBpZiB0ZXN0ICR3aXRoX2VuZGlhbm5lc3MgPSAiYmlnIjsgdGhlbgogICAgQUNfREVGSU5FKFdPUkRTX0JJR0VORElBTikKICBlbGlmIHRlc3QgLXogJHdpdGhfZW5kaWFubmVzczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFtZb3UgYXJlIGNyb3NzLWNvbXBpbGluZywgYnV0IHlvdSBoYXZlIG5vdCBzcGVjaWZpZWQgdGhlIHRhcmdldCdzIGVuZGlhbm5lc3NdKQogIGZpCmVsc2UKICBpZiB0ZXN0ICR3aXRoX2VuZGlhbm5lc3M7IHRoZW4KICAgIEFDX01TR19FUlJPUihbRW5kaWFubmVzcyBoYXMgYmVlbiBzcGVjaWZpZWQsIGJ1dCB5b3UgYXJlIG5vdCBjcm9zcy1jb21waWxpbmcuXSkKICBmaQogIEFDX0NfQklHRU5ESUFOCmZpCgojIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCkFDX0ZVTkNfQUxMT0NBCkFDX1BST0dfR0NDX1RSQURJVElPTkFMCkFDX0ZVTkNfTUVNQ01QCkFDX1RZUEVfU0lHTkFMCkFDX0ZVTkNfR0VUTU5URU5UCkFDX0NIRUNLX0ZVTkNTKHNldG1udGVudCBnZXRob3N0bmFtZSB1bmFtZSBnZXR0aW1lb2ZkYXkgc2VsZWN0IHNvY2tldCBzdHJ0b2wgc3RydG91bCBzdHJsY3B5KQpBQ19DSEVDS19GVU5DUyhzdHJjaHIgc3RyZHVwIG1lbWNweSBtZW1tb3ZlIGluZGV4IGJjb3B5IHN0cmNhc2VzdHIgcmVnY29tcCkKQUNfQ0hFQ0tfRlVOQ1Moc2lnbmFsIHNldHNpZCBzaWdzZXQgc2lnYmxvY2sgc2lnaG9sZCBzdHJlcnJvciBzZXRlbnYgdnNucHJpbnRmIHNucHJpbnRmKQpBQ19DSEVDS19GVU5DUyhzaWdhY3Rpb24pCkFDX0NIRUNLX0ZVTkNTKHNucHJpbnRmIHN0cnRvdWwpCkFDX0NIRUNLX0ZVTkNTKHJhbmRvbSBscmFuZDQ4IHJhbmQpCkFDX0NIRUNLX0ZVTkNTKGV4ZWN2IHN5c3RlbSBmb3JrIGdldHBpZCBzdHJuY2FzZWNtcCBzaWdhbHJtKQppZiB0ZXN0ICJ4JHdpdGhfcnBtIiAhPSAieG5vIiAmJiBcCiAgICAgICAgZWNobyAiICRtb2R1bGVfbGlzdCAiIHwgZ3JlcCAiIGhvc3QvaHJfc3dpbnN0ICIgPiAvZGV2L251bGw7IHRoZW4KICBPTERMSUJTPSRMSUJTCiAgTElCUz0kQUdFTlRMSUJTCiAgQUNfQ0hFQ0tfRlVOQ1MocnBtR2V0UGF0aCkKICBMSUJTPSRPTERMSUJTCmZpCgpBQ19DSEVDS19GVU5DUyhnZXRsb2FkYXZnKQpBQ19DSEVDS19GVU5DUyhnZXRhZGRyaW5mbyBnZXRpcG5vZGVieW5hbWUpCiMgQlNEaTIgZnVuY3Rpb25zIGRpZmZlcgpBQ19DSEVDS19GVU5DUyhzdGF0dmZzIHN0YXRmcykKQUNfQ0hFQ0tfRlVOQ1MoZ2V0ZHRhYmxlc2l6ZSkKIyBmcmVlYnNkMiBjaGVja3MKQUNfQ0hFQ0tfRlVOQ1MoZ2V0ZnNzdGF0KQpBQ19DSEVDS19GVU5DUyh1c2xlZXApCkFDX0NIRUNLX0ZVTkNTKHNldGxvY2FsZSkKQUNfQ0hFQ0tfRlVOQ1ModGNnZXRhdHRyKQpBQ19DSEVDS19GVU5DUyhpZl9uYW1laW5kZXggaWZfZnJlZW5hbWVpbmRleCkKIyBzb2xhcmlzIGNoZWNrcwpBQ19DSEVDS19GVU5DUyhnZXRwYWdlc2l6ZSkKQUNfQ0hFQ0tfRlVOQ1MobWtzdGVtcCkKQUNfQ0hFQ0tfRlVOQ1MoZ2V0cHduYW0gZ2V0Z3JuYW0gc2V0Z2lkIHNldHVpZCBzZXRncm91cHMpCiMgSGlnaCByZXNvbHV0aW9uIGFsYXJtIHN1cHBvcnQKQUNfQ0hFQ0tfRlVOQ1Moc2V0aXRpbWVyKQoKQUNfTVNHX0NIRUNLSU5HKFtbZm9yIFNJT0NHSUZBRERSIGluIHN5cy9pb2N0bC5oXV0pCkFDX0NBQ0hFX1ZBTChjdl9zeXNfaW9jdGxfaF9oYXNfU0lPQ0dJRkFERFIsClsgQUNfRUdSRVBfQ1BQKHh4eHllc3h4eCwKWwojaWZkZWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWZkZWYgU0lPQ0dJRkFERFIKeHh4eWVzeHh4CiNlbmRpZgpdLCBjdl9zeXNfaW9jdGxfaF9oYXNfU0lPQ0dJRkFERFI9eWVzLCBjdl9zeXNfaW9jdGxfaF9oYXNfU0lPQ0dJRkFERFI9bm8pXSkKQUNfTVNHX1JFU1VMVCgkY3Zfc3lzX2lvY3RsX2hfaGFzX1NJT0NHSUZBRERSKQppZiB0ZXN0ICRjdl9zeXNfaW9jdGxfaF9oYXNfU0lPQ0dJRkFERFIgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoU1lTX0lPQ1RMX0hfSEFTX1NJT0NHSUZBRERSKQpmaQoKIyB1bHRyaXgKQUNfTVNHX0NIRUNLSU5HKFtbZm9yIHR3by1hcmd1bWVudCBzdGF0ZnMgd2l0aCBzdHJ1Y3QgZnNfZGF0YSAoVWx0cml4KV1dKQpBQ19DQUNIRV9WQUwoZnVfY3Zfc3lzX3N0YXRfZnNfZGF0YSwKW0FDX1RSWV9SVU4oWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19GU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvZnNfdHlwZXMuaD4KI2VuZGlmCm1haW4gKCkKewpzdHJ1Y3QgZnNfZGF0YSBmc2Q7Ci8qIFVsdHJpeCdzIHN0YXRmcyByZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsCiAgIDAgZm9yIG5vdCBtb3VudGVkLCAtMSBmb3IgZmFpbHVyZS4gICovCmV4aXQgKHN0YXRmcyAoIi4iLCAmZnNkKSAhPSAxKTsKfV0sCmZ1X2N2X3N5c19zdGF0X2ZzX2RhdGE9eWVzLApmdV9jdl9zeXNfc3RhdF9mc19kYXRhPW5vLApmdV9jdl9zeXNfc3RhdF9mc19kYXRhPW5vKV0pCkFDX01TR19SRVNVTFQoJGZ1X2N2X3N5c19zdGF0X2ZzX2RhdGEpCmlmIHRlc3QgJGZ1X2N2X3N5c19zdGF0X2ZzX2RhdGEgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoU1RBVF9TVEFURlNfRlNfREFUQSkKZmkKCiMgY2hlY2sgaWYgY29tcGlsZXIgcHJlLXByb2Nlc3NvciBkZWZpbmVzIF9fRlVOQ1RJT05fXwpBQ19DQUNIRV9DSEVDSyhpZiBfX0ZVTkNUSU9OX18gaXMgZGVmaW5lZCxhY19jdl9IQVZFX0NQUF9VTkRFUkJBUl9GVU5DVElPTl9ERUZJTkVELApbCkFDX1RSWV9DT01QSUxFKCxbCiAgICBjaGFyICpjcCA9IF9fRlVOQ1RJT05fXzsKXSwgYWNfY3ZfSEFWRV9DUFBfVU5ERVJCQVJfRlVOQ1RJT05fREVGSU5FRD15ZXMsIGFjX2N2X0hBVkVfQ1BQX1VOREVSQkFSX0ZVTkNUSU9OX0RFRklORUQ9bm8pXSkKCmlmIHRlc3QgIngkYWNfY3ZfSEFWRV9DUFBfVU5ERVJCQVJfRlVOQ1RJT05fREVGSU5FRCIgPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9DUFBfVU5ERVJCQVJfRlVOQ1RJT05fREVGSU5FRCkKZmkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc2lnbmFsLmg+Cl0sIHNpZ2FjdGlvbiwgc2Ffc2lnYWN0aW9uLCBubykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCl0sIHNvY2thZGRyLCBzYV9sZW4sIG5vKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2RlZmluZSBLRVJORUwKI2RlZmluZSBfS0VSTkVMCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiN1bmRlZiBLRVJORUwKI3VuZGVmIF9LRVJORUwKXSwgc29ja2FkZHIsIHNhX3VuaW9uLnNhX2dlbmVyaWMuc2FfZmFtaWx5Miwgbm8pCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZGVmaW5lIEtFUk5FTAojZGVmaW5lIF9LRVJORUwKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI3VuZGVmIEtFUk5FTAojdW5kZWYgX0tFUk5FTAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+Cl0sIHJ0ZW50cnksIHJ0X2RzdCwgbm8pCgojIGNoZWNraW5nIGZvciA0LjMgdnMgNC40IHJ0ZW50cnkuCkFDX0NBQ0hFX0NIRUNLKHR5cGUgb2YgcnRlbnRyeSBzdHJ1Y3R1cmUsYWNfY3ZfUlRFTlRSWV9UWVBFLApbCgojIDQuNCBjb21wYXQKQUNfVFJZX0NPTVBJTEUoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSxbCgojaWZuZGVmIFNUUlVDVF9SVEVOVFJZX0hBU19SVF9EU1QKI2RlZmluZSBydF9kc3QgcnRfbm9kZXMtPnJuX2tleQojZW5kaWYKCiAgc3RydWN0IHJ0ZW50cnkgcnQ7IAogIHJ0LnJ0X25vZGVzWzBdLnJuX2ZsYWdzID0gMTsKICBydC5ydF9kc3Q7CiAgXSwgYWNfY3ZfUlRFTlRSWV9UWVBFPSJCU0QtNC40IikKCiMgNC4zIGNvbXBhdAppZiB0ZXN0ICJ4JGFjX2N2X1JURU5UUllfVFlQRSIgPSAieCI7IHRoZW4KQUNfVFJZX0NPTVBJTEUoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSxbCnN0cnVjdCBydGVudHJ5IHJ0OyAKcnQucnRfaGFzaDsKXSwgYWNfY3ZfUlRFTlRSWV9UWVBFPSJCU0QtNC4zIikKZmkKCiMgZWxzZSBhY2suCmlmIHRlc3QgIngkYWNfY3ZfUlRFTlRSWV9UWVBFIiA9ICJ4IjsgdGhlbgogIEFDX01TR19SRVNVTFQoVW5rbm93bikKICBhY19jdl9SVEVOVFJZX1RZUEU9InVua25vd24iCmZpCgpdKQoKaWYgdGVzdCAieCRhY19jdl9SVEVOVFJZX1RZUEUiID0gInhCU0QtNC40IjsgdGhlbgogIEFDX0RFRklORShSVEVOVFJZXzRfNCkKZmkKCiMgY2hlY2tpbmcgZm9yIGFscGhhJ3Mgb3J0ZW50cnkgdnMgcnRlbnRyeQppZiB0ZXN0ICJ4JGFjX2N2X1JURU5UUllfVFlQRSIgPSAieHVua25vd24iOyB0aGVuCkFDX0NBQ0hFX0NIRUNLKGZvciBzdHJ1Y3QgcnRlbnRyeSwgYWNfY3Zfc3RydWN0X3J0ZW50cnksCltBQ19FR1JFUF9DUFAob3J0ZW50cnksIFsjZGVmaW5lIEtFUk5FTAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+Cl0sICBhY19jdl9zdHJ1Y3RfcnRlbnRyeT1vcnRlbnRyeSwgIGFjX2N2X3N0cnVjdF9ydGVudHJ5PXJ0ZW50cnkgKQppZiB0ZXN0ICJ4JGFjX2N2X3N0cnVjdF9ydGVudHJ5IiA9ICJ4cnRlbnRyeSIgOyB0aGVuCiAgYWNfY3Zfc3RydWN0X3J0ZW50cnk9InJ0ZW50cnkiCmVsc2UKICBhY19jdl9zdHJ1Y3RfcnRlbnRyeT0ib3J0ZW50cnkiCmZpCl0pCmVsc2UKICBSVEVOVFJZX1RZUEU9InJ0ZW50cnkiCiAgYWNfY3Zfc3RydWN0X3J0ZW50cnk9InJ0ZW50cnkiCmZpCgppZiB0ZXN0ICJ4JGFjX2N2X3N0cnVjdF9ydGVudHJ5IiAhPSAieCI7IHRoZW4KICBBQ19ERUZJTkVfVU5RVU9URUQoUlRFTlRSWSxzdHJ1Y3QgJHthY19jdl9zdHJ1Y3RfcnRlbnRyeX0pCmVsc2UKICBBQ19ERUZJTkUoUlRFTlRSWSxzdHJ1Y3QgcnRlbnRyeSkKZmkKCiMgY2hlY2sgZm9yIDQuMydzIHJ0ZW50cnktPnJ0X25leHQKaWYgdGVzdCAieCRhY19jdl9SVEVOVFJZX1RZUEUiID0gInhCU0QtNC4zIjsgdGhlbgpBQ19DQUNIRV9DSEVDSyhmb3Igc3RydWN0IHJ0ZW50cnkgaGFzIGEgcnRfbmV4dCBub2RlLCAKCWFjX2N2X3N0cnVjdF9ydGVudHJ5X3J0X25leHQsClsKQUNfVFJZX0NPTVBJTEUoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSxbCnN0cnVjdCBydGVudHJ5IHJ0OyAKcnQucnRfbmV4dDsKXSwgYWNfY3Zfc3RydWN0X3J0ZW50cnlfcnRfbmV4dD15ZXMsICBhY19jdl9zdHJ1Y3RfcnRlbnRyeV9ydF9uZXh0PW5vICkKXSkKCmlmIHRlc3QgIngkYWNfY3Zfc3RydWN0X3J0ZW50cnlfcnRfbmV4dCIgPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoUlRFTlRSWV9SVF9ORVhUKQpmaQoKZmkKCiMgQ2hlY2sgc3RydWN0IHJ0ZW50cnkgZm9yIHZhcmlvdXMgdGhpbmdzLgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZGVmaW5lIEtFUk5FTAojZGVmaW5lIF9LRVJORUwKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI3VuZGVmIEtFUk5FTAojdW5kZWYgX0tFUk5FTAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+Cl0sIHJ0ZW50cnksIHJ0X3VuaXQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZGVmaW5lIEtFUk5FTAojZGVmaW5lIF9LRVJORUwKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI3VuZGVmIEtFUk5FTAojdW5kZWYgX0tFUk5FTAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+Cl0sIHJ0ZW50cnksIHJ0X3JlZmNudCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSwgcnRlbnRyeSwgcnRfaGFzaCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNkZWZpbmUgS0VSTkVMCiNkZWZpbmUgX0tFUk5FTAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSwgcnRlbnRyeSwgcnRfdXNlKQoKIyBDaGVjayB0Y3BzdGF0IGZvciB0Y3BzdGF0LnRjcF9yY3ZtZW1kcm9wCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgojaWZkZWYgSEFWRV9ORVRJTkVUX1RDUF9USU1FUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcF90aW1lci5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX05FVElORVRfVENQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcF92YXIuaD4KI2VuZGlmCl0sIHRjcHN0YXQsIHRjcF9yY3ZtZW1kcm9wKQoKIyBpcml4IGNoZWNrcwoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPG5ldC9pZi5oPgojaWZkZWYgSEFWRV9ORVRfSUZfVkFSX0gKI2luY2x1ZGUgPG5ldC9pZl92YXIuaD4KI2VuZGlmCl0sIGlmbmV0LCBpZl9tdHUpCgppZiB0ZXN0ICJ4JGFjX2N2X3N0cnVjdF9pZm5ldF9oYXNfaWZfbXR1IiA9ICJ4bm8iOyB0aGVuCkFDX0NBQ0hFX0NIRUNLKGlmIF9LRVJORUwgbmVlZHMgdG8gYmUgZGVmaW5lZCBmb3IgaWZfbXR1LCBhY19jdl9JRk5FVF9ORUVEU19LRVJORUwsClsKaWYgdGVzdCAieCRhY19jdl9zdHJ1Y3RfaWZuZXRfaGFzX2lmX210dSIgPSAieHllcyI7IHRoZW4KICBhY19jdl9JRk5FVF9ORUVEU19LRVJORUw9bm8KZWxzZQpBQ19UUllfQ09NUElMRShbCiNkZWZpbmUgX0tFUk5FTCAxCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2VuZGlmCiNpbmNsdWRlIDxuZXQvaWYuaD4KI2lmZGVmIEhBVkVfTkVUX0lGX1ZBUl9ICiNpbmNsdWRlIDxuZXQvaWZfdmFyLmg+CiNlbmRpZgpdLFsKc3RydWN0IGlmbmV0IHRlc3RpdDsKdGVzdGl0LmlmX210dSA9IDA7Cl0sIGFjX2N2X0lGTkVUX05FRURTX0tFUk5FTD15ZXMsIGFjX2N2X0lGTkVUX05FRURTX0tFUk5FTD1ubykKZmkKXSkKCmlmIHRlc3QgIngkYWNfY3ZfSUZORVRfTkVFRFNfS0VSTkVMIiA9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShJRk5FVF9ORUVEU19LRVJORUwpCmZpCmZpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIElGTkVUX05FRURTX0tFUk5FTAojZGVmaW5lIF9LRVJORUwgMQojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaWZkZWYgSEFWRV9TWVNfVElNRV9ICiNpbmNsdWRlIDxzeXMvdGltZS5oPgojZW5kaWYKI2luY2x1ZGUgPG5ldC9pZi5oPgojaWZkZWYgSEFWRV9ORVRfSUZfVkFSX0gKI2luY2x1ZGUgPG5ldC9pZl92YXIuaD4KI2VuZGlmCl0sIGlmYWRkciwgaWZhX25leHQpCgojIENoZWNrIGlmbmV0IGVudHJpZXMgdXNpbmcgbWFjcm8gZGVmaW5lZCBpbiBhY2xvY2FsLm00LgojCiMgWFhYICBCcm9rZW4gb24gRnJlZUJTRCB3aGVyZSB0aGVzZSBhcmUgI2RlZmluZSdkIGluIDxuZXQvaWYuaD4KIwpBQ19DSEVDS19JRk5FVF9GT1IoaWZfYmF1ZHJhdGUpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9iYXVkcmF0ZS5pZnNfdmFsdWUpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9zcGVlZCkKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX3R5cGUpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9pbWNhc3RzKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfaXFkcm9wcykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX25vcHJvdG8pCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9vbWNhc3RzKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfeG5hbWUsbm8pCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9sYXN0Y2hhbmdlLnR2X3NlYykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX29ieXRlcykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX2lieXRlcykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX2FkZHJsaXN0KQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfYWRkcmhlYWQudHFoX2ZpcnN0KQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcF92YXIuaD4KI2VuZGlmCl0sdWRwc3RhdCx1ZHBzX2Rpc2NhcmQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvdWRwX3Zhci5oPgojZW5kaWYKXSx1ZHBzdGF0LHVkcHNfbm9wb3J0KQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcF92YXIuaD4KI2VuZGlmCl0sdWRwc3RhdCx1ZHBzX25vcG9ydGJjYXN0KQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcF92YXIuaD4KI2VuZGlmCl0sdWRwc3RhdCx1ZHBzX2Z1bGxzb2NrKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2VuZGlmCiNpbmNsdWRlIDxuZXQvaWYuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gKI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KI2VuZGlmCl0sYXJwaGQsYXRfbmV4dCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWYgSEFWRV9TWVNfQ09ORl9ICiNpbmNsdWRlIDxzeXMvY29uZi5oPgojZW5kaWYKXSxzd2RldnQsc3dfbmJsa3NlbmFibGVkKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVEZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFUVkZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CiNlbmRpZgpdLHN0YXR2ZnMsZl9mcnNpemUpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFURlNfSAojaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRWRlNfSAojaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KI2VuZGlmCl0sc3RhdHZmcyxmX2ZpbGVzKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVEZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKI2luY2x1ZGUgPHN5cy9tb3VudC5oPgojZW5kaWYKXSxzdGF0ZnMsZl9maWxlcykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRGU19ICiNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2VuZGlmCl0sc3RhdGZzLGZfZmZyZWUpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFURlNfSAojaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfTU9VTlRfSAojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNlbmRpZgpdLHN0YXRmcyxmX2ZhdmFpbCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWYgSEFWRV9OTElTVF9ICiNpbmNsdWRlIDxubGlzdC5oPgojZW5kaWYKXSxubGlzdCxuX3ZhbHVlKQoKIyBjaGVjayBzdHJ1Y3QgaXBzdGF0IGZvciB2YXJpb3VzIHRoaW5ncwpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19jYW50Zm9yd2FyZCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX2NhbnRmcmFnKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfZGVsaXZlcmVkKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfZnJhZ2Ryb3BwZWQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19mcmFndGltZW91dCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX2xvY2Fsb3V0KQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfbm9wcm90bykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX25vcm91dGUpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19vZHJvcHBlZCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX29mcmFnbWVudHMpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19yZWFzc2VtYmxlZCkKCiMgY2hlY2sgZm9yIHRoZSBkZXNfa3Nfc3RydWN0LndlYWtfa2V5IGF0dHJpYnV0ZSwgd2hpY2ggaW5kaWNhdGVzIHRoZSAKIyBvbGRlciBvcGVuc2xsIHZlcnNpb24gaXMgYmVpbmcgdXNlZC4KaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfb3BlbnNzbF9kZXNfaCIgPSAieHllcyIgOyB0aGVuCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KXSwgZGVzX2tzX3N0cnVjdCwgd2Vha19rZXkpCmZpCgojIGF0dGVtcHQgdG8gZmlndXJlIG91dCBpZiBzeXNjdGwgaXMgdXNhYmxlCgppZiB0ZXN0ICRjcm9zc19jb21waWxpbmcgPSB5ZXM7IHRoZW4KICBBQ19NU0dfV0FSTihbQ2FuJ3QgY2hlY2sgc3lzY3RsLCBtYW51YWxseSBkZWZpbmUgQ0FOX1VTRV9TWVNDVEwgaWYgcGxhdGZvcm0gc3VwcG9ydCBhdmFpbGFibGVdKQplbHNlCiAgQUNfQ0FDSEVfQ0hFQ0soaWYgc3lzY3RsIGNhbiByZWFkIGtlcm5lbCBpbmZvcm1hdGlvbixhY19jdl9DQU5fVVNFX1NZU0NUTCwKICBbQUNfVFJZX1JVTihbCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1BBUkFNX0gKIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiMgaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgojZW5kaWYKCm1haW4oKSB7CiAgaW50ICAgICAgICAgICAgICAgICBtaWJbMl07CiAgc2l6ZV90ICAgICAgICAgICAgICBsZW47CiAgc3RydWN0IHRpbWV2YWwgYm9vdHRpbWU7CiAgCiAgbWliWzBdID0gQ1RMX0tFUk47CiAgbWliWzFdID0gS0VSTl9CT09UVElNRTsKICAKICBsZW4gPSBzaXplb2YoYm9vdHRpbWUpOwogIHN5c2N0bChtaWIsIDIsICZib290dGltZSwgJmxlbiwgTlVMTCwgTlVMTCk7CiAgaWYgKGJvb3R0aW1lLnR2X3NlYyAhPSAwKQogICAgZXhpdCgwKTsKICBlbHNlCiAgICBleGl0KDEpOwp9CiAgXSwgYWNfY3ZfQ0FOX1VTRV9TWVNDVEw9eWVzLCBhY19jdl9DQU5fVVNFX1NZU0NUTD1ubywgYWNfY3ZfQ0FOX1VTRV9TWVNDVEw9bm8pXSkKZmkKCmlmIHRlc3QgIngkYWNfY3ZfQ0FOX1VTRV9TWVNDVEwiID0gInh5ZXMiOyB0aGVuCiAgQUNfREVGSU5FKENBTl9VU0VfU1lTQ1RMKQpmaQoKIwojIEluIEZyZWVCU0QgNC54LCB0aGUgVENQIHRpbWVyIGNvbnN0YW50cyBhcmVuJ3QuICBUaGV5IGFyZSBkZWZpbmVkCiMgaW4gdGVybXMgb2YgYGh6JywgdGhlIGtlcm5lbCBjbG9jayB0aWNrLiAgSW4gdGhpcyBjYXNlLAojIHdlIG5lZWQgdG8gaGF2ZSBhIGxvY2FsIHZhcmlhYmxlIGBoeicgaW4gc2NvcGUgYW5kIHNldCB0byBhIHVzZWZ1bAojIHZhbHVlIHdoZW5ldmVyIHdlIHVzZSBvbmUgb2YgdGhlc2UgY29uc3RhbnRzLgojCkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgVENQIHRpbWVycyBkZXBlbmQgb24gXGBoeicsYWNfY3ZfVENQVFZfTkVFRFNfSFosCltBQ19FR1JFUF9DUFAoaHosClsjaW5jbHVkZSA8bmV0aW5ldC90Y3BfdGltZXIuaD4KVENQVFZfU1JUVERGTFQKXSwgYWNfY3ZfVENQVFZfTkVFRFNfSFo9eWVzLCBhY19jdl9UQ1BUVl9ORUVEU19IWj1ubyldKQoKaWYgdGVzdCAieCRhY19jdl9UQ1BUVl9ORUVEU19IWiIgPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoVENQVFZfTkVFRFNfSFopCmZpCgojCiMgZGVmaW5lIHRoZSBhZ2VudCBsaWJyYXJpZXMgdmFyaWFibGUKIwpBQ19TVUJTVChBR0VOVExJQlMpCkFDX1NVQlNUKE9USEVSQUdFTlRMSUJPQkpTKQpBQ19TVUJTVChPVEhFUkFHRU5UTElCTE9CSlMpCgojCiMgUHJvbXB0IGZvciB2YXJpb3VzIGJpdHMgb2YgdXNlciBpbmZvcm1hdGlvbgojCgppZiB0ZXN0ICJ4JGFjX2N2X3VzZXJfcHJvbXB0X0xPR0ZJTEUiID0gIngiIC1vICJ4JGFjX2N2X3VzZXJfcHJvbXB0X1NZU19MT0MiID0gIngiIC1vICJ4JGFjX2N2X3VzZXJfcHJvbXB0X1NZU19DT05UQUNUIiA9ICJ4IiAtbyAieCRhY19jdl91c2VyX3Byb21wdF9ERUZBVUxUX1NOTVBfVkVSU0lPTiIgPSAieCI7IHRoZW4KQUNfQ0FDSEVfQ0hFQ0soaWYgeW91IGhhdmUgcnVuIGNvbmZpZ3VyZSBiZWZvcmUsIGFjX2N2X2hhdmVfd2FybmVkLApbCmlmIHRlc3QgIngkZGVmYXVsdHMiID0gInhubyI7IHRoZW4KY2F0IDw8IEVPRgoKCSAqKioqKioqKioqKioqKiBDb25maWd1cmF0aW9uIFNlY3Rpb24gKioqKioqKioqKioqKioKCglZb3UgYXJlIGFib3V0IHRvIGJlIHByb21wdGVkIHdpdGggYSBzZXJpZXMgb2YgcXVlc3Rpb25zLiAgQW5zd2VyCnRoZW0gY2FyZWZ1bGx5LCBhcyB0aGV5IGRldGVybWluZSBob3cgdGhlIFNOTVAgYWdlbnQgYW5kIHJlbGF0ZWQKYXBwbGljYXRpb25zIGFyZSB0byBmdW5jdGlvbi4KCglBZnRlciB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5pc2hlcywgeW91IGNhbiBicm93c2UgdGhlIG5ld2x5CmNyZWF0ZWQgY29uZmlnLmggZmlsZSBmb3IgZnVydGhlciAtIGxlc3MgaW1wb3J0YW50IC0gcGFyYW1ldGVycyB0bwptb2RpZnkuICBCZSBjYXJlZnVsIGlmIHlvdSByZS1ydW4gY29uZmlndXJlIHRob3VnaCwgc2luY2UgY29uZmlnLmggd2lsbApiZSBvdmVyd3JpdHRlbi4KCi1QcmVzcyByZXR1cm4gdG8gY29udGludWUtCkVPRgoKcmVhZCB0bXBpbnB1dAphY19jdl9oYXZlX3dhcm5lZD0ieWVzIgplY2hvICRFQ0hPX04gImRpc2FibGluZyBhYm92ZSBwcm9tcHQgZm9yIGZ1dHVyZSBydW5zLi4uICAkRUNIT19DIgplbHNlCiAgYWNfY3ZfaGF2ZV93YXJuZWQ9Im5vIgpmaQpdKQplbHNlCiAgYWNfY3ZfaGF2ZV93YXJuZWQ9InllcyIKZmkKCk1FPWAkV0hPQU1JYAppZiB0ZXN0IC1mIC9ldGMvcmVzb2x2LmNvbmY7IHRoZW4KICBMT0M9YGNhdCAvZXRjL3Jlc29sdi5jb25mIHwgZ3JlcCAnXmRvbWFpbicgfCB0YWlsIC0xIHwgYXdrICd7cHJpbnQgJE5GfSdgCmVsc2UKICBMT0M9IkBuby53aGVyZSIKZmkKCkFDX1BST01QVF9VU0VSKERFRkFVTFRfU05NUF9WRVJTSU9OLFsKCioqKiBEZWZhdWx0IFNOTVAgVmVyc2lvbjoKCglTdGFydGluZyB3aXRoIE5ldC1TTk1QIDUuMCwgeW91IGNhbiBjaG9vc2UgdGhlIGRlZmF1bHQgdmVyc2lvbiBvZgp0aGUgU05NUCBwcm90b2NvbCB0byB1c2Ugd2hlbiBubyB2ZXJzaW9uIGlzIGdpdmVuIGV4cGxpY2l0bHkgb24gdGhlCmNvbW1hbmQgbGluZSwgb3IgdmlhIGFuICdzbm1wLmNvbmYnIGZpbGUuICBJbiB0aGUgcGFzdCB0aGlzIHdhcyBzZXQgdG8KU05NUHYxLCBidXQgeW91IGNhbiB1c2UgdGhpcyB0byBzd2l0Y2ggdG8gU05NUHYzIGlmIGRlc2lyZWQuICBTTk1QdjMKd2lsbCBwcm92aWRlIGEgbW9yZSBzZWN1cmUgbWFuYWdlbWVudCBlbnZpcm9ubWVudCAoYW5kIHRodXMgeW91J3JlCmVuY291cmFnZWQgdG8gc3dpdGNoIHRvIFNOTVB2MyksIGJ1dCBtYXkgYnJlYWsgZXhpc3Rpbmcgc2NyaXB0cyB0aGF0CnJlbHkgb24gdGhlIG9sZCBiZWhhdmlvdXIuICAoVGhvdWdoIHN1Y2ggc2NyaXB0cyB3aWxsIHByb2JhYmx5IG5lZWQgdG8KYmUgY2hhbmdlZCB0byB1c2UgdGhlICctYycgY29tbXVuaXR5IGZsYWcgYW55d2F5LCBhcyB0aGUgU05NUHYxCmNvbW1hbmQgbGluZSB1c2FnZSBoYXMgY2hhbmdlZCBhcyB3ZWxsLikuCiAgIEF0IHRoaXMgcHJvbXB0IHlvdSBjYW4gc2VsZWN0IFwiMVwiLCBcIjJcIiAoZm9yIFNOTVB2MmMpLCBvciBcIjNcIiBhcwp0aGUgZGVmYXVsdCB2ZXJzaW9uIGZvciB0aGUgY29tbWFuZCB0b29scyAoc25tcGdldCwgLi4uKSB0byB1c2UuICBUaGlzCmNhbiBhbHdheXMgYmUgb3ZlcnJpZGRlbiBhdCBydW50aW1lIHVzaW5nIHRoZSAtdiBmbGFnIHRvIHRoZSB0b29scywgb3IKYnkgdXNpbmcgdGhlIFwiZGVmVmVyc2lvblwiIHRva2VuIGluIHlvdXIgc25tcC5jb25mIGZpbGUuCiAgIFByb3ZpZGluZyB0aGUgLS13aXRoLWRlZmF1bHQtc25tcC12ZXJzaW9uPVwieFwiIHBhcmFtZXRlciB0byAuL2NvbmZpZ3VyZQp3aWxsIGF2b2lkIHRoaXMgcHJvbXB0LgoKRGVmYXVsdCB2ZXJzaW9uIG9mIFNOTVAgdG8gdXNlXSwzLHVucXVvdGVkKQoKIyB3ZSB0ZXN0ZWQgdGhpcyBhYm92ZSBiZWZvcmUgdGhlIHByb21wdCwgYnV0IHRoZSBwcm9tcHQgbWF5IGdpdmUgYSBuZXcgdmFsdWUuCmlmIHRlc3QgIiRhY19jdl91c2VyX3Byb21wdF9ERUZBVUxUX1NOTVBfVkVSU0lPTiIgIT0gIjEiIC1hICIkYWNfY3ZfdXNlcl9wcm9tcHRfREVGQVVMVF9TTk1QX1ZFUlNJT04iICE9ICIyIiAtYSAiJGFjX2N2X3VzZXJfcHJvbXB0X0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMyI7IHRoZW4KICBBQ19NU0dfRVJST1IoW0lsbGVnYWwgdmVyc2lvbiBudW1iZXIuICBPbmx5IDEsIDIgKGZvciBTTk1QdjJjKSBhbmQgMyBhcmUgc3VwcG9ydGVkLl0pCmZpCgpBQ19QUk9NUFRfVVNFUihTWVNfQ09OVEFDVCxbCgoqKiogU3lzdGVtIENvbnRhY3QgSW5mb3JtYXRpb246CgoJRGVzY3JpYmVzIHdobyBzaG91bGQgYmUgY29udGFjdGVkIGFib3V0IHRoZSBob3N0IHRoZSBhZ2VudCBpcwpydW5uaW5nIG9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIE1JQi1JSSB0cmVlLiAgVGhpcwpjYW4gYWxzbyBiZSBvdmVyLXJpZGRlbiB1c2luZyB0aGUgXCJzeXNjb250YWN0XCIgc3ludGF4IGluIHRoZSBhZ2VudCdzCmNvbmZpZ3VyYXRpb24gZmlsZXMuCiAgUHJvdmlkaW5nIHRoZSAtLXdpdGgtc3lzLWNvbnRhY3Q9XCJjb250YWN0XCIgcGFyYW1ldGVyIHRvIC4vY29uZmlndXJlCndpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpTeXN0ZW0gQ29udGFjdCBJbmZvcm1hdGlvbl0sJE1FQCRMT0MscXVvdGVkKQoKQUNfUFJPTVBUX1VTRVIoU1lTX0xPQyxbCgoqKiogU3lzdGVtIExvY2F0aW9uOgoKCURlc2NyaWJlcyB0aGUgbG9jYXRpb24gb2YgdGhlIHN5c3RlbS4gIFRoaXMgaW5mb3JtYXRpb24gaXMKYXZhaWxhYmxlIGluIHRoZSBNSUItSUkgdHJlZS4gIHRoaXMgY2FuIGFsc28gYmUgb3Zlci1yaWRkZW4gdXNpbmcgdGhlClwic3lzbG9jYXRpb25cIiBzeW50YXggaW4gdGhlIGFnZW50J3MgY29uZmlndXJhdGlvbiBmaWxlcy4KICBQcm92aWRpbmcgdGhlIC0td2l0aC1zeXMtbG9jYXRpb249XCJsb2NhdGlvblwiIHBhcmFtZXRlciB0byAuL2NvbmZpZ3VyZQp3aWxsIGF2b2lkIHRoaXMgcHJvbXB0LgoKU3lzdGVtIExvY2F0aW9uXSxVbmtub3duLHF1b3RlZCkKCmlmIHRlc3QgLWQgL3Zhci9sb2c7IHRoZW4KICBkZWZhdWx0bG9nPSIvdmFyL2xvZy9zbm1wZC5sb2ciCmVsc2UKICBkZWZhdWx0bG9nPSIvdXNyL2FkbS9zbm1wZC5sb2ciCmZpCiAgCkFDX1BST01QVF9VU0VSKExPR0ZJTEUsWwoKKioqIExvZ2ZpbGUgbG9jYXRpb246CgoJRW50ZXIgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRoZSBzbm1wZCBhZ2VudCB0byBkdW1wCmluZm9ybWF0aW9uICYgZXJyb3JzIHRvLiAgSWYgbm90IGRlZmluZWQgKGVudGVyIHRoZSBrZXl3b3JkIFwibm9uZVwiCmF0IHRoZSBwcm9tcHQgYmVsb3cpIHRoZSBhZ2VudCB3aWxsIHVzZSBzdGRvdXQgYW5kIHN0ZGVyciBpbnN0ZWFkLgooTm90ZTogVGhpcyB2YWx1ZSBjYW4gYmUgb3Zlci1yaWRkZW4gdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMuKQogIFByb3ZpZGluZyB0aGUgLS13aXRoLWxvZ2ZpbGU9XCJwYXRoXCIgcGFyYW1ldGVyIHRvIC4vY29uZmlndXJlCndpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpMb2NhdGlvbiB0byB3cml0ZSBsb2dmaWxlXSwkZGVmYXVsdGxvZyxxdW90ZWQpCgppZiB0ZXN0IC1kIC92YXI7IHRoZW4KICBkZWZhdWx0c3RvcmU9Ii92YXIvbmV0LXNubXAiCiAgdWNkZGVmYXVsdHN0b3JlPSIvdmFyL3VjZC1zbm1wIgplbHNlCiAgZGVmYXVsdHN0b3JlPSIvZXRjL25ldC1zbm1wIgogIHVjZGRlZmF1bHRzdG9yZT0iL2V0Yy91Y2Qtc25tcCIKZmkKICAKQUNfUFJPTVBUX1VTRVIoUEVSU0lTVEVOVF9ESVJFQ1RPUlksWwoKKioqIHNubXBkIHBlcnNpc3RlbnQgc3RvcmFnZSBsb2NhdGlvbjoKCglFbnRlciBhIGRpcmVjdG9yeSBmb3IgdGhlIFNOTVAgbGlicmFyeSB0byBzdG9yZSBwZXJzaXN0ZW50CmRhdGEgaW4gdGhlIGZvcm0gb2YgYSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGlzIGRlZmF1bHQgbG9jYXRpb24gaXMKZGlmZmVyZW50IHRoYW4gdGhlIG9sZCBkZWZhdWx0IGxvY2F0aW9uICh3aGljaCB3YXMgZm9yIHVjZC1zbm1wKS4gIElmCnlvdSBzdGF5IHdpdGggdGhlIG5ldyBwYXRoLCBJJ2xsIGFzayB5b3UgaW4gYSBzZWNvbmQgaWYgeW91IHdpc2ggdG8KY29weSB5b3VyIGZpbGVzIG92ZXIgdG8gdGhlIG5ldyBsb2NhdGlvbiAob25jZSBvbmx5KS4gIElmIHlvdSBwaWNrCnNvbWUgb3RoZXIgcGF0aCB0aGFuIHRoZSBkZWZhdWx0LCB5b3UnbGwgaGF2ZSB0byBjb3B5IHRoZW0geW91cnNlbGYuClRoZXJlIGlzIG5vdGhpbmcgd3Jvbmcgd2l0aCBwaWNraW5nIHRoZSBvbGQgcGF0aCAoJHVjZGRlZmF1bHRzdG9yZSkgaWYKeW91J2QgcmF0aGVyLgogIFByb3ZpZGluZyB0aGUgLS13aXRoLXBlcnNpc3RlbnQtZGlyZWN0b3J5PVwicGF0aFwiIHBhcmFtZXRlciB0bwouL2NvbmZpZ3VyZSB3aWxsIGF2b2lkIHRoaXMgcHJvbXB0LgoKTG9jYXRpb24gdG8gd3JpdGUgcGVyc2lzdGVudCBpbmZvcm1hdGlvbl0sJGRlZmF1bHRzdG9yZSxxdW90ZWQpCgpQRVJTSVNURU5UX0RJUkVDVE9SWT0kYWNfY3ZfdXNlcl9wcm9tcHRfUEVSU0lTVEVOVF9ESVJFQ1RPUlkKQUNfU1VCU1QoUEVSU0lTVEVOVF9ESVJFQ1RPUlkpClVDRFBFUlNJU1RFTlRfRElSRUNUT1JZPSR1Y2RkZWZhdWx0c3RvcmUKQUNfU1VCU1QoVUNEUEVSU0lTVEVOVF9ESVJFQ1RPUlkpCgppZiB0ZXN0ICRQRVJTSVNURU5UX0RJUkVDVE9SWSA9ICIkZGVmYXVsdHN0b3JlIiAtYSAtZCAiJHVjZGRlZmF1bHRzdG9yZSIgLWEgISAtZCAiJGRlZmF1bHRzdG9yZSIgOyB0aGVuCkFDX0NBQ0hFX0NIRUNLKElmIHdlIHNob3VsZCBjb3B5IHRoZSBvbGQgcGVyc2lzdGVudCBkaXJlY3RvcnksIGFjX2N2X3VzZXJfcHJvbXB0X0NPUFlfUEVSU0lTVEVOVF9GSUxFUywKWwpBQ19QUk9NUFRfVVNFUl9OT19ERUZJTkUoYWNfY3ZfdXNlcl9wcm9tcHRfQ09QWV9QRVJTSVNURU5UX0ZJTEVTLFsKCioqKiBDb3B5aW5nIG9sZCB1Y2Qtc25tcCBwZXJzaXN0ZW50IGZpbGVzIHRvIG5ldC1zbm1wIHBlcnNpc3RlbnQgZGlyZWN0b3J5OgoKCVdvdWxkIHlvdSBsaWtlIHRvIGNvcHkgdGhlIG9sZGVyIHVjZC1zbm1wIHBlcnNpc3RlbnQgZmlsZXMKaW50byB5b3VyIG5ldyBuZXQtc25tcCBwZXJzaXN0ZW50IGZpbGUgcGF0aD8gIFRoaXMgd2lsbCBmdW5jdGlvbmFsbHkKc2F2ZSBhbGwgeW91ciB1Y2Qtc25tcCBkYXRhIGFuZCBsZXQgaXQgYmUgdXNlZCB3aXRoaW4gdGhlIG5ldC1zbm1wCnRvb2xzLiAgVGhpcyB3aWxsIG9ubHkgYmUgZG9uZSBvbmNlIHdoZW4geW91IHJ1biBtYWtlIGluc3RhbGwuICBJZiB5b3UKd2lzaCB0byBkbyB0aGlzLCBlbnRlciAieWVzIiBhdCB0aGUgcHJvbXB0LgogIFByb3ZpZGluZyB0aGUgLS13aXRoLWNvcHktcGVyc2lzdGVudC1maWxlcz1cIm5vXCIgKG9yIFwieWVzXCIpCnBhcmFtZXRlcnMgdG8gLi9jb25maWd1cmUgd2lsbCBhdm9pZCB0aGlzIHByb21wdC4KCkNvcHkgdWNkLXNubXAgZGF0YSBpbnRvIHRoZSBuZXQtc25tcCBkYXRhIGRpcmVjdG9yeV0sInllcyIpCl0pCmVsc2UKYWNfY3ZfdXNlcl9wcm9tcHRfQ09QWV9QRVJTSVNURU5UX0ZJTEVTPSJubyIKZmkKQ09QWV9QRVJTSVNURU5UX0ZJTEVTPSIkYWNfY3ZfdXNlcl9wcm9tcHRfQ09QWV9QRVJTSVNURU5UX0ZJTEVTIgpBQ19TVUJTVChDT1BZX1BFUlNJU1RFTlRfRklMRVMpCgpBQ19TVUJTVChETExJQlMpCgpBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlOk1ha2VmaWxlLnRvcDpNYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlc10pCkFDX0NPTkZJR19GSUxFUyhbc25tcGxpYi9NYWtlZmlsZTpNYWtlZmlsZS50b3A6c25tcGxpYi9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlczpzbm1wbGliL01ha2VmaWxlLmRlcGVuZF0pCkFDX0NPTkZJR19GSUxFUyhbYXBwcy9NYWtlZmlsZTpNYWtlZmlsZS50b3A6YXBwcy9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlczphcHBzL01ha2VmaWxlLmRlcGVuZF0pCkFDX0NPTkZJR19GSUxFUyhbYXBwcy9zbm1wbmV0c3RhdC9NYWtlZmlsZTpNYWtlZmlsZS50b3A6YXBwcy9zbm1wbmV0c3RhdC9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlczphcHBzL3NubXBuZXRzdGF0L01ha2VmaWxlLmRlcGVuZF0pCkFDX0NPTkZJR19GSUxFUyhbYWdlbnQvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmFnZW50L01ha2VmaWxlLmluOk1ha2VmaWxlLnJ1bGVzOmFnZW50L01ha2VmaWxlLmRlcGVuZF0pCkFDX0NPTkZJR19GSUxFUyhbYWdlbnQvaGVscGVycy9NYWtlZmlsZTpNYWtlZmlsZS50b3A6YWdlbnQvaGVscGVycy9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlczphZ2VudC9oZWxwZXJzL01ha2VmaWxlLmRlcGVuZF0pCkFDX0NPTkZJR19GSUxFUyhbYWdlbnQvbWliZ3JvdXAvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmFnZW50L21pYmdyb3VwL01ha2VmaWxlLmluOk1ha2VmaWxlLnJ1bGVzOmFnZW50L21pYmdyb3VwL01ha2VmaWxlLmRlcGVuZF0pCkFDX0NPTkZJR19GSUxFUyhbbG9jYWwvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmxvY2FsL01ha2VmaWxlLmluOk1ha2VmaWxlLnJ1bGVzXSkKQUNfQ09ORklHX0ZJTEVTKFt0ZXN0aW5nL01ha2VmaWxlOk1ha2VmaWxlLnRvcDp0ZXN0aW5nL01ha2VmaWxlLmluXSkKQUNfQ09ORklHX0ZJTEVTKFttYW4vTWFrZWZpbGU6TWFrZWZpbGUudG9wOm1hbi9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlc10pCkFDX0NPTkZJR19GSUxFUyhbbWlicy9NYWtlZmlsZTpNYWtlZmlsZS50b3A6bWlicy9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlc10pCkFDX0NPTkZJR19GSUxFUyhbbmV0LXNubXAtY29uZmlnOm5ldC1zbm1wLWNvbmZpZy5pbl0sCgkJW2NobW9kICt4IG5ldC1zbm1wLWNvbmZpZ10pCgpBQ19DT05GSUdfQ09NTUFORFMoW2RlZmF1bHRdLCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgpCkFDX09VVFBVVAoKQUNfTVNHX0NBQ0hFX0RJU1BMQVkoKQojIExvY2FsIFZhcmlhYmxlczoKIyBtb2RlOiBBdXRvY29uZgojIGNvbW1lbnQtc3RhcnQ6ICIjIgojIEVuZDoK