IyEvYmluL3NoCiMKIyBTY3JpcHQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIFdJTkVQUkVGSVggZGlyZWN0b3J5CiMKIyBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KIyBDb3B5cmlnaHQgMjAwNCBDaHJpcyBNb3JnYW4KIyBDb3B5cmlnaHQgMjAwNCBBbGV4YW5kcmUgSnVsbGlhcmQKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojCgp1c2FnZSgpCnsKICAgIGVjaG8gIlVzYWdlOiAkMCBbb3B0aW9uc10iCiAgICBlY2hvICIiCiAgICBlY2hvICJPcHRpb25zOiIKICAgIGVjaG8gIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UiCiAgICBlY2hvICIgICAgICAtLXByZWZpeCA8ZGlyPiAgICAgICAgIERpcmVjdG9yeSB0byBjcmVhdGUgKGRlZmF1bHQ6IFwkV0lORVBSRUZJWCBvciB+Ly53aW5lKSIKICAgIGVjaG8gIiAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgRG9uJ3QgcHJpbnQgc3RhdHVzIG1lc3NhZ2VzIgogICAgZWNobyAiICAtdSwgLS11cGRhdGUgICAgICAgICAgICAgICBVcGRhdGUgdGhlIHByZWZpeCBkaXJlY3RvcnkgaWYgaXQgYWxyZWFkeSBleGlzdHMiCiAgICBlY2hvICIgICAgICAtLXVzZS13aW5lLXRyZWUgPGRpcj4gIFJ1biBmcm9tIHRoZSBXaW5lIHNvdXJjZSB0cmVlIDxkaXI+IgogICAgZWNobyAiIgp9CgpzZXQgLWUKCmRsbGRpcj0iQGRsbGRpckAiCmRhdGFkaXI9IkBkYXRhZGlyQC93aW5lIgoKZG9fdXBkYXRlPTAKcXVpZXQ9MAoKd2hpbGUgWyAkIyAtZ3QgMCBdCmRvCiAgICBjYXNlICIkMSIgaW4KICAgICAgICAtaHwtLWhlbHApCiAgICAgICAgICAgIHVzYWdlCiAgICAgICAgICAgIGV4aXQgMAogICAgICAgICAgICA7OwogICAgICAgIC0tcHJlZml4KQogICAgICAgICAgICBXSU5FUFJFRklYPSIkMiIKICAgICAgICAgICAgc2hpZnQgMgogICAgICAgICAgICA7OwogICAgICAgIC11fC0tdXBkYXRlKQogICAgICAgICAgICBkb191cGRhdGU9MQogICAgICAgICAgICBzaGlmdAogICAgICAgICAgICA7OwogICAgICAgIC1xfC0tcXVpZXQpCiAgICAgICAgICAgIHF1aWV0PTEKICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgOzsKICAgICAgICAtLXVzZS13aW5lLXRyZWUpCiAgICAgICAgICAgIHRvcGRpcj1gY2QgIiQyIiAmJiBwd2RgCiAgICAgICAgICAgIGlmIFsgLXggIiR0b3BkaXIvc2VydmVyL3dpbmVzZXJ2ZXIiIF0KICAgICAgICAgICAgdGhlbgogICAgICAgICAgICAgICAgV0lORUxPQURFUj0iJHRvcGRpci93aW5lIgogICAgICAgICAgICAgICAgV0lORVNFUlZFUj0iJHRvcGRpci9zZXJ2ZXIvd2luZXNlcnZlciIKICAgICAgICAgICAgICAgIGlmIFsgLW4gIiRMRF9MSUJSQVJZX1BBVEgiIF0KICAgICAgICAgICAgICAgIHRoZW4KICAgICAgICAgICAgICAgICAgICBMRF9MSUJSQVJZX1BBVEg9IiR0b3BkaXIvbGliczokTERfTElCUkFSWV9QQVRIIgogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIExEX0xJQlJBUllfUEFUSD0iJHRvcGRpci9saWJzIgogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKICAgICAgICAgICAgICAgIGRsbGRpcj0iJHRvcGRpci9wcm9ncmFtcyIKICAgICAgICAgICAgICAgIGRhdGFkaXI9IiR0b3BkaXIvdG9vbHMiCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIiQyIGlzIG5vdCBhIHZhbGlkIFdpbmUgc291cmNlIHRyZWUiCiAgICAgICAgICAgICAgICBleGl0IDEKICAgICAgICAgICAgZmkKICAgICAgICAgICAgc2hpZnQgMgogICAgICAgICAgICA7OwogICAgICAgICopCiAgICAgICAgICAgIGVjaG8gIlVua25vd24gb3B0aW9uICQxIgogICAgICAgICAgICB1c2FnZQogICAgICAgICAgICBleGl0IDEKICAgICAgICAgICAgOzsKICBlc2FjCmRvbmUKCldJTkVQUkVGSVg9IiR7V0lORVBSRUZJWDotJEhPTUUvLndpbmV9IgoKaWYgWyAtZCAiJFdJTkVQUkVGSVgiIF0gfHwgbWtkaXIgIiRXSU5FUFJFRklYIjsgdGhlbiA6CmVsc2UKICAgIGVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgJFdJTkVQUkVGSVgsIGFib3J0aW5nIgogICAgZXhpdCAxCmZpCgpXSU5FUFJFRklYPWBjZCAiJFdJTkVQUkVGSVgiICYmIHB3ZGAKCiMgQ3JlYXRlIHRoZSBkcml2ZSBzeW1saW5rcwoKaWYgWyAhIC1kICIkV0lORVBSRUZJWC9kb3NkZXZpY2VzIiBdCnRoZW4KICAgIG1rZGlyICIkV0lORVBSRUZJWC9kb3NkZXZpY2VzIgogICAgWyAtZCAiJFdJTkVQUkVGSVgvZHJpdmVfYyIgXSB8fCBta2RpciAiJFdJTkVQUkVGSVgvZHJpdmVfYyIKICAgIGxuIC1zICIuLi9kcml2ZV9jIiAiJFdJTkVQUkVGSVgvZG9zZGV2aWNlcy9jOiIKICAgIGxuIC1zICIvIiAiJFdJTkVQUkVGSVgvZG9zZGV2aWNlcy96OiIKZmkKCkNST09UPSIkV0lORVBSRUZJWC9kb3NkZXZpY2VzL2M6IgoKIyBDcmVhdGUgdGhlIGRpcmVjdG9yeSB0cmVlCgpmb3IgaSBpbiBcCiAgICAiJENST09UL015IERvY3VtZW50cyIgXAogICAgIiRDUk9PVC9NeSBEb2N1bWVudHMvTXkgTXVzaWMiIFwKICAgICIkQ1JPT1QvTXkgRG9jdW1lbnRzL015IFBpY3R1cmVzIiBcCiAgICAiJENST09UL015IERvY3VtZW50cy9NeSBWaWRlbyIgXAogICAgIiRDUk9PVC9Qcm9ncmFtIEZpbGVzIiBcCiAgICAiJENST09UL1Byb2dyYW0gRmlsZXMvQ29tbW9uIEZpbGVzIiBcCiAgICAiJENST09UL3dpbmRvd3MiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9jb21tYW5kIiBcCiAgICAiJENST09UL3dpbmRvd3MvZm9udHMiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9pbmYiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9wcm9maWxlcyIgXAogICAgIiRDUk9PVC93aW5kb3dzL3Byb2ZpbGVzL0FkbWluaXN0cmF0b3IiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9TdGFydCBNZW51IiBcCiAgICAiJENST09UL3dpbmRvd3MvQXBwbGljYXRpb24gRGF0YSIgXAogICAgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9TdGFydCBNZW51L1Byb2dyYW1zL1N0YXJ0dXAiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0iIFwKICAgICIkQ1JPT1Qvd2luZG93cy90ZW1wIgpkbwogICAgWyAtZCAiJGkiIF0gfHwgbWtkaXIgIiRpIgpkb25lCgojIENyZWF0ZSB0aGUgYXBwbGljYXRpb24gc3ltbGlua3MKCmxpbmtfYXBwKCkKewogICBybSAtZiAiJDIiICYmIGxuIC1zICIkZGxsZGlyLyQxLmV4ZS5zbyIgIiQyIiB8fCBlY2hvICJXYXJuaW5nOiBmYWlsZWQgdG8gY3JlYXRlICQyIgp9CgpsaW5rX2FwcCBzdGFydCAgICAgICAgIiRDUk9PVC93aW5kb3dzL2NvbW1hbmQvc3RhcnQuZXhlIgpsaW5rX2FwcCBub3RlcGFkICAgICAgIiRDUk9PVC93aW5kb3dzL25vdGVwYWQuZXhlIgpsaW5rX2FwcCByZWdlZGl0ICAgICAgIiRDUk9PVC93aW5kb3dzL3JlZ2VkaXQuZXhlIgpsaW5rX2FwcCBydW5kbGwzMiAgICAgIiRDUk9PVC93aW5kb3dzL3J1bmRsbDMyLmV4ZSIKbGlua19hcHAgd2NtZCAgICAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0vd2NtZC5leGUiCmxpbmtfYXBwIGNvbnRyb2wgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL2NvbnRyb2wuZXhlIgpsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS9oZWxwLmV4ZSIKbGlua19hcHAgbm90ZXBhZCAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0vbm90ZXBhZC5leGUiCmxpbmtfYXBwIHByb2dtYW4gICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3Byb2dtYW4uZXhlIgpsaW5rX2FwcCByZWdzdnIzMiAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS9yZWdzdnIzMi5leGUiCmxpbmtfYXBwIHdpbmVtaW5lICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3dpbm1pbmUuZXhlIgpsaW5rX2FwcCB3aW52ZXIgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS93aW52ZXIuZXhlIgpsaW5rX2FwcCB1bmluc3RhbGxlciAgIiRDUk9PVC93aW5kb3dzL3VuaW5zdGFsbC5leGUiCmxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGVscC5leGUiCmxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGxwMzIuZXhlIgpsaW5rX2FwcCB3aW5lYnJvd3NlciAgIiRDUk9PVC93aW5kb3dzL3dpbmVicm93c2VyLmV4ZSIKCiMgQ29weSB0aGUgLmluZiBzY3JpcHQgYW5kIHJ1biBpdAoKY3AgIiRkYXRhZGlyL3dpbmUuaW5mIiAiJENST09UL3dpbmRvd3MvaW5mL3dpbmUuaW5mIgpleHBvcnQgV0lORVBSRUZJWAoke1dJTkVMT0FERVI6LXdpbmV9IHJ1bmRsbDMyLmV4ZSBzZXR1cGFwaS5kbGwsSW5zdGFsbEhpbmZTZWN0aW9uIERlZmF1bHRJbnN0YWxsIDEyOCB3aW5lLmluZgoKIyBXYWl0IGZvciB0aGUgd2luZXNlcnZlciB0byBmaW5pc2gKCmlmIFsgJGRvX3VwZGF0ZSA9IDAgXQp0aGVuCiAgICAke1dJTkVTRVJWRVI6LXdpbmVzZXJ2ZXJ9IC13CiAgICBpZiBbICRxdWlldCA9IDAgXQogICAgdGhlbgogICAgICAgIGVjaG8gIiRXSU5FUFJFRklYIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LiIKICAgIGZpCmVsc2UKICAgIGlmIFsgJHF1aWV0ID0gMCBdCiAgICB0aGVuCiAgICAgICAgZWNobyAiJFdJTkVQUkVGSVggdXBkYXRlZCBzdWNjZXNzZnVsbHkuIgogICAgZmkKZmkK