IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICAgICAgICAgICAgICAgICAgICBDQURFTkNFIENPUFlSSUdIVCBOT1RJQ0UKIyAgICAgICAgIKkgMjAwOC0yMDEzIENhZGVuY2UgRGVzaWduIFN5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBGb3VuZGF0aW9uIEZsb3cgaXMgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcGVyZm9ybSBzcGVjaWFsaXplZAojIHRhc2tzLgojCiMgVGhpcyB3b3JrIG1heSBub3QgYmUgY29waWVkLCByZS1wdWJsaXNoZWQsIHVwbG9hZGVkLCBvciBkaXN0cmlidXRlZCBpbiBhbnkgd2F5LAojIGluIGFueSBtZWRpdW0sIHdoZXRoZXIgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KIyBmcm9tIENhZGVuY2UuIE5vdHdpdGhzdGFuZGluZyBhbnkgcmVzdHJpY3Rpb25zIGhlcmVpbiwgc3ViamVjdCB0byBjb21wbGlhbmNlCiMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENhZGVuY2Ugc29mdHdhcmUgbGljZW5zZSBhZ3JlZW1lbnQgdW5kZXIKIyB3aGljaCB0aGlzIG1hdGVyaWFsIHdhcyBwcm92aWRlZCwgdGhpcyBtYXRlcmlhbCBtYXkgYmUgY29waWVkIGFuZCBpbnRlcm5hbGx5CiMgZGlzdHJpYnV0ZWQgc29sZWx5IGZvciBpbnRlcm5hbCBwdXJwb3NlcyBmb3IgdXNlIHdpdGggQ2FkZW5jZSB0b29scy4KIwojIFRoaXMgd29yayBpcyBDYWRlbmNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgbWF5IHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYmUKIyBnaXZlbiB0byB0aGlyZCBwYXJ0aWVzLCBuZWl0aGVyIGluIG9yaWdpbmFsIG5vciBpbiBtb2RpZmllZCB2ZXJzaW9ucywgd2l0aG91dAojIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIENhZGVuY2UuIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzCiMgdGhlIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gb2YgQ2FkZW5jZSBvciBpdHMgbGljZW5zb3JzLCBhbmQKIyBpcyBzdXBwbGllZCBzdWJqZWN0IHRvLCBhbmQgbWF5IGJlIHVzZWQgb25seSBieSBDYWRlbmNlJ3MgY3VycmVudCBjdXN0b21lcnMKIyBpbiBhY2NvcmRhbmNlIHdpdGgsIGEgcHJldmlvdXNseSBleGVjdXRlZCBsaWNlbnNlIGFncmVlbWVudCBiZXR3ZWVuIENhZGVuY2UKIyBhbmQgaXRzIGN1c3RvbWVyLgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEJZIENBREVOQ0UgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAojIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBDQURFTkNFIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwKIyBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAojIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgojIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgIE1BVEVSSUFMLCBFVkVOIElGCiMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnBhY2thZ2UgcHJvdmlkZSBmb3VuZGF0aW9uX2Zsb3cgMS4wCgpuYW1lc3BhY2UgZXZhbCBGRl9OT1ZVUzo6IHsKCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBQcm9jZWR1cmUgdG8gc2VlZCBjZXJ0YWluIGZsb3cgdmFyaWFibGVzIHRvIGEga25vd24gZGVmYXVsdCB2YWx1ZSBhcyB3ZWxsCiAgICMgYXMgZGF0YSB2YXJpYWJsZXMgcmVxdWlyZWQgdG8gc2VlZCB0aGUgZ2VuZXJpYyBjb25maWd1cmF0aW9uIGZpbGUKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCiAgIHByb2Mgc2VlZF92YXJpYWJsZXMge3tmb3JjZSAwfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIHJkYV9kZWZhdWx0cwogICAgICBnbG9iYWwgdWRtCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIGluZm9zCiAgICAgIGdsb2JhbCB3YXJuaW5ncwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBmYXJncyAKICAgICAgZ2xvYmFsIGRhcmdzIAoKICAgICAgaWYgeyRmb3JjZX0gewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2VlZCldfSB7CiAgICAgICAgICAgIHVuc2V0IHZhcnMoc2VlZCkKICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHNlZWQpXX0gewoKICAgICAgICAgcHV0cyAiPEZGPiBTZWVkaW5nIHZhcmlhYmxlcyAuLi4iCgogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHdhcm5pbmdfY291bnQpXX0gewogICAgICAgICAgICBzZXQgdmFycyh3YXJuaW5nX2NvdW50KSAwCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhlcnJvcl9jb3VudCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGVycm9yX2NvdW50KSAwCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhpbmZvX2NvdW50KV19IHsKICAgICAgICAgICAgc2V0IHZhcnMoaW5mb19jb3VudCkgMAogICAgICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgU2V0IHZhcnModmVyc2lvbikgdG8gIjE3LjEuMCIgaWYgbm90IGRlZmluZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHZlcnNpb24pXX0gewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIGZhcmdzKHZlcnNpb24pXX0gewojICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBJTkZPOiBWYXJpYWJsZSB2YXJzKHZlcnNpb24pIG5vdCBkZWZpbmVkIC0gc2V0dGluZyB0byAnJGZhcmdzKHZlcnNpb24pJyIKICAgICAgICAgICAgICAgc2V0IHZhcnModmVyc2lvbikgJGZhcmdzKHZlcnNpb24pCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHZlcnNpb24pICRkYXJncyh2ZXJzaW9uKQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB2YXJzKGZsb3cpIG1tbWMKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyhbbHNlYXJjaCAkRkY6OnZhbGlkX3ZlcnNpb25zICR2YXJzKHZlcnNpb24pXSA8IDApfSB7CiAgICAgICAgICAgICAgIHNldCBtc2cgIlZlcnNpb24gJyR2YXJzKHZlcnNpb24pJyBub3Qgc3VwcG9ydGVkIC0gc2V0dGluZyB0byAnMTcuMS4wJyIKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiAkbXNnIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICRtc2dcbiIKICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAkbXNnCiAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICAgICBzZXQgdmFycyhmbG93KSBtbW1jCiAgICAgICAgICAgICAgIHNldCB2YXJzKHZlcnNpb24pICIxNy4xLjAiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3cpIG1tbWMKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIGlmIHtbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfbGRiKSBGQUxTRQogICAgICAgICB9CgojICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTR9IHsKIyAgICAgICAgICAgIHNldCB2YXJzKG5vdnVzKSB0cnVlCiMgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgc2V0IHZhcnMobm92dXMpIGZhbHNlCiMgICAgICAgICB9CgogICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncyhub3Z1cyldfSB7CiAgICAgICAgICAgICBzZXQgdmFycyhub3Z1cykgJGZhcmdzKG5vdnVzKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNldCB2YXJzKG5vdnVzKSAkZGFyZ3Mobm92dXMpCiAgICAgICAgICB9CgojIFRvb2wgc2hvdWxkIGFsd2F5cyBiZSBpbm5vdnVzIGZvciAxNS54IGFzIGVuY291bnRlciBpcyBnb2luZyBhd2F5CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobWFrZV90b29sKV19IHsKICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxNH0gewogICAgICAgICAgICAgIHNldCB2YXJzKG1ha2VfdG9vbCkgaW5ub3Z1cwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2V0IHZhcnMobWFrZV90b29sKSBlbmNvdW50ZXIKICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfbGRiKV0gJiYgJHZhcnMoZW5hYmxlX2xkYil9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJhbl9jb21waWxlKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6cnVuX2NvbXBpbGVdIAogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBTZXQgdmFycyhmbG93KSB0byAibW1tYyIgaWYgbm90IGRlZmluZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGZsb3cpXX0gewogICAgICAgICAgICBwdXRzICI8RkY+IElORk86IFZhcmlhYmxlIHZhcnMoZmxvdykgbm90IGRlZmluZWQgLSBzZXR0aW5nIHRvICdtbW1jJyIKICAgICAgICAgICAgc2V0IHZhcnMoZmxvdykgbW1tYwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7KFtsc2VhcmNoIFtsaXN0ICJkZWZhdWx0IiAicHJfbW1tYyIgIm1tbWMiXSAkdmFycyhmbG93KV0gPCAwKX0gewogICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IEZsb3cgdHlwZSAnJHZhcnMoZmxvdyknIG5vdCBzdXBwb3J0ZWQgLSBzZXR0aW5nIHRvICdtbW1jJyIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBGbG93IHR5cGUgJyR2YXJzKGZsb3cpJyBub3Qgc3VwcG9ydGVkIC0gc2V0dGluZyB0byAnbW1tYydcbiIKICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiRmxvdyB0eXBlICckdmFycyhmbG93KScgbm90IHN1cHBvcnRlZCAtIHNldHRpbmcgdG8gJ21tbWMnIgogICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvdykgbW1tYwogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBNYWtlIHN1cmUgYWxsIHNjYWxpbmcgZmFjdG9ycyBhcmUgZWl0aGVyIHNldCBvciBhcmUgMS4wIC4uLiBhbHNvCiAgICAgICMgc3VwcG9ydCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvZiBvbGQgbmFtZXMKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICBzZXQgbWFwKHByZV9yb3V0ZV9yZXNfZmFjdG9yKSBkZWZfcmVzX2ZhY3RvcgogICAgICAgICBzZXQgbWFwKHByZV9yb3V0ZV9jbGtfcmVzX2ZhY3RvcikgZGVmX2Nsa19yZXNfZmFjdG9yCiAgICAgICAgIHNldCBtYXAocHJlX3JvdXRlX2NhcF9mYWN0b3IpIGRlZl9jYXBfZmFjdG9yCiAgICAgICAgIHNldCBtYXAocHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yKSBkZWZfY2xrX2NhcF9mYWN0b3IKICAgICAgICAgc2V0IG1hcChwb3N0X3JvdXRlX3Jlc19mYWN0b3IpIGRldF9yZXNfZmFjdG9yCiAgICAgICAgIHNldCBtYXAocG9zdF9yb3V0ZV9jbGtfcmVzX2ZhY3RvcikgZGV0X2Nsa19yZXNfZmFjdG9yCiAgICAgICAgIHNldCBtYXAocG9zdF9yb3V0ZV9jYXBfZmFjdG9yKSBkZXRfY2FwX2ZhY3RvcgogICAgICAgICBzZXQgbWFwKHBvc3Rfcm91dGVfY2xrX2NhcF9mYWN0b3IpIGRldF9jbGtfY2FwX2ZhY3RvcgogICAgICAgICBzZXQgbWFwKHBvc3Rfcm91dGVfeGNhcF9mYWN0b3IpIHhjYXBfZmFjdG9yCgogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldICYmICFbaW5mbyBleGlzdHMgdmFycyhwYXJzZWRfdmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICR2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewogICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBWaWV3IGRlZmluaXRpb24gZmlsZSAkdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKSBkb2VzIG5vdCBleGlzdCAuLi4gY2Fubm90IGNvbnRpbnVlIgogICAgICAgICAgICAgICBleGl0CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc291cmNlICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvSU5OT1ZVUy9vdmVybGF5LnRjbAogICAgICAgICAgICBwdXRzICI8RkY+IFBhcnNpbmcgdXNlciB2aWV3IGRlZmluaXRpb24gZmlsZSAuLi4iCiAgICAgICAgICAgIHNldCByYyBbY2F0Y2gge3NvdXJjZSAkdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKX1dCiMgICAgICAgICAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICAgICAgICBpZiB7JHZhcnMobm92dXMpfSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggdmFyICJsaWJyYXJ5X3NldHMgcmNfY29ybmVycyBkZWxheV9jb3JuZXJzIHRpbWluZ19jb25kaXRpb25zIHNldHVwX2FuYWx5c2lzX3ZpZXdzIGhvbGRfYW5hbHlzaXNfdmlld3MgcG93ZXJfZG9tYWlucyIgewogICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFyKV19IHsKICAgICAgICAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIlZhcmlhYmxlIHZhcnMoJHZhcikgaGFzIGJlZW4gc2V0IHRvIFwiJHZhcnMoJHZhcilcIiIKICAgICAgICAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgZm9yZWFjaCB2YXIgImxpYnJhcnlfc2V0cyByY19jb3JuZXJzIGRlbGF5X2Nvcm5lcnMgc2V0dXBfYW5hbHlzaXNfdmlld3MgaG9sZF9hbmFseXNpc192aWV3cyBwb3dlcl9kb21haW5zIiB7CiAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXIpXX0gewogICAgICAgICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiVmFyaWFibGUgdmFycygkdmFyKSBoYXMgYmVlbiBzZXQgdG8gXCIkdmFycygkdmFyKVwiIgogICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiMgICAgICAgICAgICBwdXRzICRyYwojICAgICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgICAgc2V0IHZhcnMocGFyc2VkX3ZpZXdfZGVmaW5pdGlvbl90Y2wpIHRydWUKICAgICAgICAgfQoKIyAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CgogICAgICAgICAgICBmb3JlYWNoIHJjX2Nvcm5lciAkdmFycyhyY19jb3JuZXJzKSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uICJwcmVfcm91dGVfcmVzX2ZhY3RvciBwcmVfcm91dGVfY2xrX3Jlc19mYWN0b3IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9yb3V0ZV9yZXNfZmFjdG9yIHBvc3Rfcm91dGVfY2xrX3Jlc19mYWN0b3IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3JvdXRlX2NhcF9mYWN0b3IgcHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfcm91dGVfY2FwX2ZhY3RvciBwb3N0X3JvdXRlX2Nsa19jYXBfZmFjdG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfcm91dGVfeGNhcF9mYWN0b3IiIHsKICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLCRvcHRpb24pXSAmJiBbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLCRtYXAoJG9wdGlvbikpXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IFZhcmlhYmxlICRtYXAoJG9wdGlvbikgaGFzIGJlZW4gY2hhbmdlZCB0byAkb3B0aW9uIC4uLiBwbGVhc2UgdXBkYXRlXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIlZhcmlhYmxlICRtYXAoJG9wdGlvbikgaGFzIGJlZW4gY2hhbmdlZCB0byAkb3B0aW9uIC4uLiBwbGVhc2UgdXBkYXRlIgogICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJHJjX2Nvcm5lciwkb3B0aW9uKSAkdmFycygkcmNfY29ybmVyLCRtYXAoJG9wdGlvbikpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgIAogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgVGhlIGZvbGxvd2luZyB3aWxsIGJlIHVzZWQgdG8gc2VlZCB0aGUgY29uZmlnIGZpbGUKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAKICAgICAgICAgICAgaWYgeyFbRkY6OmlzX2xwX2Zsb3ddfSB7CgogICAgICAgICAgICAgICBzZXQgbWF4X2xpYnMgW2xpc3RdCiAgICAgICAgICAgICAgIHNldCBtaW5fbGlicyBbbGlzdF0KICAgCiAgICAgICAgICAgICAgIHNldCBjb3VudCAwCiAgIAogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBsaWIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICRtYXhfbGlicyAkbGliXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIG1heF9saWJzICRsaWIKICAgICAgICAgICAgICAgICAgICAgICAgaW5jciBjb3VudAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxsYXRlX2xpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBsaWIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxhdGVfbGlicmFyeV9zZXQpLHRpbWluZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJG1heF9saWJzICRsaWJdID09IC0xfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgbWF4X2xpYnMgJGxpYgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGNvdW50CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZWxpYixtYXgpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliLG1heCkgJG1heF9saWJzCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X2hvbGRfdmlldyksZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCldfSB7CiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbGliICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICRtaW5fbGlicyAkbGliXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIG1pbl9saWJzICRsaWIKICAgICAgICAgICAgICAgICAgICAgICAgaW5jciBjb3VudAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGVhcmx5X2xpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBsaWIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpLHRpbWluZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJG1pbl9saWJzICRsaWJdID09IC0xfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgbWluX2xpYnMgJGxpYgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGNvdW50CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZWxpYixtaW4pXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliLG1pbikgJG1pbl9saWJzCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZWxpYildfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHRpbWVsaWIpICIiCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlKSAiIgogICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtaW4pICIiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1heCkgIiIKICAgCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpXX0gewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSxzaSldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1heCkgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSxzaSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxhdGVfbGlicmFyeV9zZXQpXX0gewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIGFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGF0ZV9saWJyYXJ5X3NldCksc2kpXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtYXgpICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxsYXRlX2xpYnJhcnlfc2V0KSxzaSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtYXgpICIiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSxzaSldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1pbikgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHNpKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X2hvbGRfdmlldyksZGVsYXlfY29ybmVyKSxlYXJseV9saWJyYXJ5X3NldCldfSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X2hvbGRfdmlldyksZGVsYXlfY29ybmVyKSxlYXJseV9saWJyYXJ5X3NldCksc2kpXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtaW4pICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGVhcmx5X2xpYnJhcnlfc2V0KSxzaSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtaW4pICIiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxwcmVfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhmbG93KSAhPSAibW1tYyJ9IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnModGltaW5nY29uX2ZpbGUpICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxwcmVfY3RzX3NkYykKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzZXQgdmFycyhwcmVfY3RzX3NkYykgJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxjb25zdHJhaW50X21vZGUpLHByZV9jdHNfc2RjKQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGNvbnN0cmFpbnRfbW9kZSkscHJlX2N0c19pbG1fc2RjKV19IHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpICE9ICJtbW1jIn0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1pbmdjb25fZmlsZSxmdWxsKSAkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGNvbnN0cmFpbnRfbW9kZSkscHJlX2N0c19pbG1fc2RjKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxpbmNyX2N0c19zZGMpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhpbmNyX2N0c19zZGMpICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxpbmNyX2N0c19zZGMpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxwb3N0X2N0c19zZGMpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhwb3N0X2N0c19zZGMpICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxwb3N0X2N0c19zZGMpCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X2hvbGRfdmlldyksZGVsYXlfY29ybmVyKSxyY19jb3JuZXIpLGNhcF90YWJsZSldICYmXAogICAgICAgICAgICAgICAgICAgW2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lciksY2FwX3RhYmxlKV19IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2FwdGJsX2ZpbGUpIFtjb25jYXQgXAogICAgICAgICAgICAgICAgICAgICAgICItYmVzdCIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSxjYXBfdGFibGUpIFwKICAgICAgICAgICAgICAgICAgICAgICAiLXdvcnN0IiAkdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSxjYXBfdGFibGUpIFwKICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgc2V0IHZhcnMod2NfY2FwX3RhYmxlKSAkdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSxjYXBfdGFibGUpCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSxjYXBfdGFibGUpXX0gewogICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2FwdGJsX2ZpbGUpIFtjb25jYXQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICItYmVzdCIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lciksY2FwX3RhYmxlKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIi13b3JzdCIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lciksY2FwX3RhYmxlKSBcCiAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyh3Y19jYXBfdGFibGUpICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxyY19jb3JuZXIpLGNhcF90YWJsZSkKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2FwdGJsX2ZpbGUpICIiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliKSAiIgogICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSkgIiIKICAgICAgICAgICAgICAgc2V0IHZhcnModGltZWxpYixtYXgpICIiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1heCkgIiIKICAgICAgICAgICAgICAgc2V0IHZhcnModGltZWxpYixtaW4pICIiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1pbikgIiIKICAgICAgICAgICAgICAgc2V0IGZvdW5kX21heCAwIAogICAgICAgICAgICAgICBzZXQgZm91bmRfbWluIDAgCiAgIAogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2V0dXBfYW5hbHlzaXNfdmlld3MpXSAmJiBbaW5mbyBleGlzdHMgdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKV19IHsKICAgICAgICAgICAgICAgICAgZm9yZWFjaCB2aWV3ICR2YXJzKHNldHVwX2FuYWx5c2lzX3ZpZXdzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YXJzKHRpbWVsaWIsbWF4KSAkZmlsZV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKHRpbWVsaWIsbWF4KSAkZmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBmb3VuZF9tYXggMQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gV0FSTklORzogVmFyaWFibGUgdmFycygkdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZykgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxlYXJseV9saWJyYXJ5X3NldCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IFZhcmlhYmxlIHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZm9yZWFjaCB2aWV3ICR2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCksdGltaW5nKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnModGltZWxpYixtaW4pICRmaWxlXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHZhcnModGltZWxpYixtaW4pICRmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGZvdW5kX21pbiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiB2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZykgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlZhcmlhYmxlIHZhcnMoJHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCksdGltaW5nKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGVhcmx5X2xpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV0gJiYgKCR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmlldyAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KQogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCksdGltaW5nKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiB2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZykgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlZhcmlhYmxlIHZhcnMoJHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCksdGltaW5nKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGVhcmx5X2xpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHshJGZvdW5kX21pbiB8fCAhJGZvdW5kX21heH0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IEVpdGhlciBzZXR1cCBvciBob2xkIGFuYWx5c2lzIHZpZXdzIGluYWRlcXVhdGVseSBkZWZpbmVkIgogICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJFaXRoZXIgc2V0dXAgb3IgaG9sZCBhbmFseXNpcyB2aWV3cyBpbmFkZXF1YXRlbHkgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHRpbWVsaWIsbWluKSAiIgogICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliLG1heCkgIiIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBsaWJyYXJ5X3NldCAkdmFycyhsaWJyYXJ5X3NldHMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRsaWJyYXJ5X3NldCx0aW1pbmcpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliKSBbY29uY2F0ICR2YXJzKHRpbWVsaWIpICR2YXJzKCRsaWJyYXJ5X3NldCx0aW1pbmcpXQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkbGlicmFyeV9zZXQsc2kpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSkgW2NvbmNhdCAkdmFycyhjZGJfZmlsZSkgJHZhcnMoJGxpYnJhcnlfc2V0LHNpKV0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IHZhcnMoY2FwdGJsX2ZpbGUpICIiCiAgICAgICAgICAgICAgIHNldCB2YXJzKHRpbWluZ2Nvbl9maWxlKSAiIgogICAgICAjICAgICAgICAgICBzZXQgdmFycyhwcmVfcm91dGVfcmVzX2ZhY3RvcikgMS4wCiAgICAgICMgICAgICAgICAgIHNldCB2YXJzKHBvc3Rfcm91dGVfcmVzX2ZhY3RvcikgMS4wCiAgICAgICMgICAgICAgICAgIHNldCB2YXJzKHByZV9yb3V0ZV9jYXBfZmFjdG9yKSAxLjAKICAgICAgIyAgICAgICAgICAgc2V0IHZhcnMocG9zdF9yb3V0ZV9jYXBfZmFjdG9yKSAxLjAKICAgICAgIyAgICAgICAgICAgc2V0IHZhcnMocHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yKSAxLjAKICAgICAgIyAgICAgICAgICAgc2V0IHZhcnMocG9zdF9yb3V0ZV9jbGtfcmVzX2ZhY3RvcikgMS4wCiAgICAgICMgICAgICAgICAgIHNldCB2YXJzKHByZV9yb3V0ZV9jbGtfY2FwX2ZhY3RvcikgMS4wCiAgICAgICMgICAgICAgICAgIHNldCB2YXJzKHBvc3Rfcm91dGVfY2xrX2NhcF9mYWN0b3IpIDEuMAogICAgICAjICAgICAgICAgICBzZXQgdmFycyhwb3N0X3JvdXRlX3hjYXBfZmFjdG9yKSAxLjAKICAgICAgIyAgICAgICAgIHNldCB2YXJzKHF4dGVjaF9maWxlKSAiIgogICAgICAjICAgICAgICAgc2V0IHZhcnMocXhjb25mX2ZpbGUpICIiCiAgICAgICMgICAgICAgICBzZXQgdmFycyhxeGxpYl9maWxlKSAiIgogICAgICAjICAgICAgICAgc2V0IHZhcnMocXhsYXllcm1hcF9maWxlKSAiIgogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICBzZXQgbWFwKHF4X3RlY2hfZmlsZSkgcXh0ZWNoX2ZpbGUKICAgICAgICAgICAgc2V0IG1hcChxeF9jb25mX2ZpbGUpIHF4Y29uZl9maWxlCiAgICAgICAgICAgIHNldCBtYXAocXhfbGliX2ZpbGUpIHF4bGliX2ZpbGUKICAgCiAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uICJxeF90ZWNoX2ZpbGUgcXhfY29uZl9maWxlIHF4X2xpYl9maWxlIiB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSwkb3B0aW9uKV19IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJG1hcCgkb3B0aW9uKSkgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lciksJG9wdGlvbikKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJG1hcCgkb3B0aW9uKSkgIiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocXhfbGF5ZXJtYXBfZmlsZSldfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhxcmNfbGF5ZXJfbWFwKV19IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMocXhsYXllcm1hcF9maWxlKSAkdmFycyhxcmNfbGF5ZXJfbWFwKQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhxeGxheWVybWFwX2ZpbGUpICIiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IHZhcnMocXhsYXllcm1hcF9maWxlKSAkdmFycyhxeF9sYXllcm1hcF9maWxlKQogICAgICAgICAgICAgICBzZXQgdmFycyhxcmNfbGF5ZXJfbWFwKSAkdmFycyhxeF9sYXllcm1hcF9maWxlKSAKICAgICAgICAgICAgfQojICAgICAgICAgfQoKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGxlYWthZ2VfZWZmb3J0KV0gJiYgIVtpbmZvIGV4aXN0cyB2YXJzKGxlYWthZ2VfcG93ZXJfZWZmb3J0KV19IHsKICAgICAgICAgICAgc2V0IHZhcnMobGVha2FnZV9wb3dlcl9lZmZvcnQpICR2YXJzKGxlYWthZ2VfZWZmb3J0KQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfY3BwcildICYmICgoJHZhcnMoZW5hYmxlX2NwcHIpID09IDApIHx8ICgkdmFycyhlbmFibGVfY3BwcikgPT0gZmFsc2UpKX0gewogICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfY3Bwcikgbm9uZQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfY3BwcildICYmICgoJHZhcnMoZW5hYmxlX2NwcHIpID09IDEpIHx8ICgkdmFycyhlbmFibGVfY3BwcikgPT0gdHJ1ZSkpfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9jcHByKSBib3RoCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZl9maWxlKV19IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBWYXJpYWJsZSBkZWZfZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGRlZl9maWxlcyAuLi4gcGxlYXNlIHVwZGF0ZVxuIgogICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSBkZWZfZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGRlZl9maWxlcyAuLi4gcGxlYXNlIHVwZGF0ZSIKICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgIHNldCB2YXJzKGRlZl9maWxlcykgJHZhcnMoZGVmX2ZpbGUpCiAgICAgICAgIH0KCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBTZWVkIHRoZSByZXN0IG9mIHRoZSBjb25maWcgdmFyaWFibGVzIGFsbG93aW5nIHVzZXIgb3ZlcnJpZGVzIC4uLgogICAjIERlZmF1bHQgdmFsdWVzIGZvciBhbGwgdmFyaWFibGVzIGFyZSBpbiBkZWZhdWx0cy50Y2wKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzY3JpcHRfcGF0aCldfSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzY3JpcHRfcm9vdCldfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHNjcmlwdF9wYXRoKSAkdmFycyhzY3JpcHRfcm9vdCkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBFUlJPUjogVmFyaWFibGUgdmFycyhzY3JpcHRfcm9vdCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgIGV4aXQgIDEKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHNjcmlwdF9yb290KV19IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoc2NyaXB0X3Jvb3QpICR2YXJzKHNjcmlwdF9wYXRoKQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzZXR1cF9wYXRoKV19IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoc2V0dXBfcGF0aCkgIi4iCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGNvbW1hbmQgRkZGOjpnZXRfdG9vbF0gbmUgIiIgJiYgW0ZGRjo6Z2V0X3Rvb2xdIGVxICJyYyJ9IHsKICAgICAgICAgICB0Y2xfc291cmNlICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvSU5OT1ZVUy9yZGFfZGVmYXVsdHMudGNsCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgc291cmNlICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvY29tbW9uX2RlZmF1bHRzLnRjbAogICAgICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvZGVmYXVsdHMudGNsCiAgICAgICAgICAgc291cmNlICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvSU5OT1ZVUy9yZGFfZGVmYXVsdHMudGNsCiAgICAgICAgIH0KCiAgICAgICAgIGlmIHskdmFycyhub3Z1cyl9IHsKICAgICAgICAgICAgRkZfTk9WVVM6OmR1bXBfbm92dXNfYXR0cmlidXRlcwogICAgICAgICB9CgogICAgICAgICBmb3JlYWNoIG9wdGlvbiBbYXJyYXkgbmFtZXMgcmRhX2RlZmF1bHRzXSB7CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJG9wdGlvbildfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKCRvcHRpb24pICRyZGFfZGVmYXVsdHMoJG9wdGlvbikKICAgICAgICAgICAgfSAgZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycygkb3B0aW9uKSAhPSAkcmRhX2RlZmF1bHRzKCRvcHRpb24pfSB7CiMgICAgICAgICAgICAgICAgICBwdXRzICIjIDxGRj4gSU5GTzogVXNlciBvdmVycmlkZSBvZiAkb3B0aW9uIHRvICR2YXJzKCRvcHRpb24pIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjcHVzX3Blcl9yZW1vdGVfaG9zdCldICYmIFtpbmZvIGV4aXN0cyB2YXJzKGNwdV9wZXJfcmVtb3RlX2hvc3QpXX0gewogICAgICAgICAgICBwdXRzICI8RkY+IElORk86IFNldHRpbmcgJ3ZhcnMoY3B1c19wZXJfcmVtb3RlX2hvc3QpJyB0byAndmFycyhjcHVfcGVyX3JlbW90ZV9ob3N0KSciCiAgICAgICAgICAgIHB1dHMgIjxGRj4gSU5GTzogICAgICAgICAgICAgICAgICBeIgogICAgICAgICAgICBwdXRzICI8RkY+IElORk86IFBsZWFzZSB1cGRhdGUgeW91ciBzZXR1cCB0byBjcHVzX3Blcl9yZW1vdGUgLi4uIgogICAgICAgICAgICBzZXQgdmFycyhjcHVzX3Blcl9yZW1vdGVfaG9zdCkgJHZhcnMoY3B1X3Blcl9yZW1vdGVfaG9zdCkKICAgICAgICAgfQoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfYXJ0X2Jhc2VkKV19IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZsZXhtb2RlbF9hc19wdG4pXSAmJiAkdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgICBzZXQgZmxvd19kZWZhdWx0cyhmbGV4bW9kZWxfYXJ0X2Jhc2VkKSAxCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydCkgJGZsb3dfZGVmYXVsdHMoaGlnaF90aW1pbmdfZWZmb3J0KQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19lY28pXSAmJiAoJHZhcnMoY2xvY2tfZWNvKSA9PSAicG9zdGN0cyIpfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgInBvc3RfY3RzIgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19lY28pXSAmJiAoJHZhcnMoY2xvY2tfZWNvKSA9PSAicG9zdHJvdXRlIil9IHsKICAgICAgICAgICAgc2V0IHZhcnMoY2xvY2tfZWNvKSAicG9zdF9yb3V0ZSIKICAgICAgICAgfQogICAgICAgICBpZiB7W3JlZ2V4cCAiOS4xIiAkdmFycyh2ZXJzaW9uKV19IHsgCiAgICAgICAgICAgIGlmIHskdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcml0aWNhbF9yYW5nZSldICYmICgkdmFycyhjcml0aWNhbF9yYW5nZSkgIT0gMS4wKX0gewogICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IEhpZ2ggdGltaW5nIGVmZm9ydCBlbmFibGVkIGJ1dCBjcml0aWNhbF9yYW5nZSBvdmVycmlkZGVuIGJ5IHVzZXIgc2V0dGluZ3MiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2VjbyldICYmICgkdmFycyhjbG9ja19lY28pICE9ICJwb3N0X2N0cyIpfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gSGlnaCB0aW1pbmcgZWZmb3J0IGVuYWJsZWQgYnV0IGNsb2NrX2VjbyBvdmVycmlkZGVuIGJ5IHVzZXIgc2V0dGluZ3MiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGluX3BsYWNlX29wdCldICYmICEkdmFycyhpbl9wbGFjZV9vcHQpfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gSGlnaCB0aW1pbmcgZWZmb3J0IGVuYWJsZWQgYnV0IGluX3BsYWNlX29wdCBvdmVycmlkZGVuIGJ5IHVzZXIgc2V0dGluZ3MiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfZW5naW5lKV0gJiYgKFtzdHJpbmcgdG9sb3dlciAkdmFycyhjdHNfZW5naW5lKV0gPT0gImN0cyIpfSB7CiAgICAgICAgICAgIHNldCBmbG93X2RlZmF1bHRzKHVwZGF0ZV9pb19sYXRlbmN5KSBmYWxzZQojICAgICAgICAgICAgc2V0IHZhcnMoY3RzLHVwZGF0ZV90aW1pbmcsc2tpcCkgdHJ1ZQogICAgICAgICB9CgogICAgICAgICBmb3JlYWNoIG9wdGlvbiBbYXJyYXkgbmFtZXMgZmxvd19kZWZhdWx0c10gewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCRvcHRpb24pXX0gewogICAgICAgICAgICAgICBzZXQgdmFycygkb3B0aW9uKSAkZmxvd19kZWZhdWx0cygkb3B0aW9uKQogICAgICAgICAgICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KSAmJiBbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhpbl9wbGFjZV9vcHQpIHRydWUKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY3JpdGljYWxfcmFuZ2UpIDEuMAojICAgICAgICAgICAgICAgICAgc2V0IHZhcnModXNlZnVsX3NrZXcpIHRydWUKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2xvY2tfZWNvKSBwb3N0X2N0cwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCB1c2VyKCRvcHRpb24pICR2YXJzKCRvcHRpb24pCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKIyAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHVzZXIoY2NvcHRfZWZmb3J0KV0gJiYgKCR2YXJzKGN0c19lbmdpbmUpID09ICJjY29wdCIpfSB7CiMgICAgICAgICAgICBzZXQgdmFycyhjY29wdF9lZmZvcnQpIGxvdwojICAgICAgICAgfQoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgZmxvd19kZWZhdWx0cyh0aW1lX2luZm9fZGIpXX0gewogICAgICAgICAgICBzZXQgZmxvd19kZWZhdWx0cyh0aW1lX2luZm9fZGIpICRmbG93X2RlZmF1bHRzKHJwdF9kaXIpL3RpbWVfaW5mby5kYgogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIGZsb3dfZGVmYXVsdHModGltZV9pbmZvX2Z1bGxfcnB0KV19IHsKICAgICAgICAgICAgc2V0IGZsb3dfZGVmYXVsdHModGltZV9pbmZvX2Z1bGxfcnB0KSAkZmxvd19kZWZhdWx0cyhycHRfZGlyKS90aW1lX2luZm9fZnVsbC5ycHQKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyBmbG93X2RlZmF1bHRzKGh0bWxfc3VtbWFyeSldfSB7CiAgICAgICAgICAgIHNldCBmbG93X2RlZmF1bHRzKGh0bWxfc3VtbWFyeSkgJGZsb3dfZGVmYXVsdHMocnB0X2Rpcikvc3VtbWFyeS5odG1sCiAgICAgICAgIH0KCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX3NpX2F3YXJlKV19IHsKIyAgICAgICAgICAgIGlmIHtbcmVnc3ViICJubSIgJHZhcnMocHJvY2VzcykgIiJdIDw9IDY1fSB7CiMgICAgICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfc2lfYXdhcmUpIHRydWUKIyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9zaV9hd2FyZSkgZmFsc2UKIyAgICAgICAgICAgIH0KICAgICAgICAgfQoKCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZGJzX2Zvcm1hdCldfSB7CiAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhuZXRsaXN0X3R5cGUpICJ2ZXJpbG9nIl0+PTB9IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoZGJzX2Zvcm1hdCkgZmUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoZGJzX2Zvcm1hdCkgb2EKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2RpcildfSB7IAogICAgICAgICAgICBzZXQgdmFycyhwYXJ0aXRpb25fZGlyKSBQQVJUSVRJT04KICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpXX0geyAKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKSAkdmFycyhwYXJ0aXRpb25fZGlyKV9QUkVDVFMKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikgJHZhcnMocGFydGl0aW9uX2RpcilfQ1RTCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnModXNlcl9tb2RlKSA9PSAiaGllciJ9IHsKICAgICAgICAgICAgRkZfTk9WVVM6Om5vcm1hbGl6ZV9maWxlcwogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiMgICAgICAgICAgICAgICBzZXQgdmFycyhjdHMsc3RhcnRpbmdfZGJzKSAiXFtnbG9iICpfcG9zdF9lY28uZW5jXF0iCiMgICAgICAgICAgICAgICAjIERMTSBpcyBhIHR3byBwYXNzIGZsb3cgYnV0IHVzZXIgZG9lc24ndCBuZWVkIHRvIHNwZWNpZnkgaXQKICAgICAgICAgICAgICAgc2V0IHZhcnMoaGllcl9mbG93X3R5cGUpICIycGFzcyIKIyAgICAgICAgICAgICAgIHNldCB2YXJzKHBsYWNlX29wdF9kZXNpZ24pIGZhbHNlCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIn0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhwb3N0Y3RzLHN0YXJ0aW5nX2RicykgLgogICAgICAgICAgICAgICB9CiMgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMob2FfYWJzdHJhY3RfbmFtZSldfSB7IHNldCB2YXJzKG9hX2Fic3RyYWN0X25hbWUpIGFic3RyYWN0fQogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG9hX2xheW91dF9uYW1lKV19IHsgc2V0IHZhcnMob2FfbGF5b3V0X25hbWUpIGxheW91dH0KICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fY2VsbCldfSB7IHNldCB2YXJzKG9hX2Rlc2lnbl9jZWxsKSAkdmFycyhkZXNpZ24pfQogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG9hX2Rlc2lnbl92aWV3KV19IHsgc2V0IHZhcnMob2FfZGVzaWduX3ZpZXcpICIifQogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG9hX3BhcnRpdGlvbl9saWIpXX0geyBzZXQgdmFycyhvYV9wYXJ0aXRpb25fbGliKSBPQV9QVE5fTElCfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG9hX2Fic3RyYWN0X25hbWUpXX0geyBzZXQgdmFycyhvYV9hYnN0cmFjdF9uYW1lKSAiIn0KICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9sYXlvdXRfbmFtZSldfSB7IHNldCB2YXJzKG9hX2xheW91dF9uYW1lKSAiIn0KICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fY2VsbCldfSB7IHNldCB2YXJzKG9hX2Rlc2lnbl9jZWxsKSAiIn0KICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fdmlldyldfSB7IHNldCB2YXJzKG9hX2Rlc2lnbl92aWV3KSAiIn0KICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fbGliKV19IHsgc2V0IHZhcnMob2FfZGVzaWduX2xpYikgIiJ9CiAgICAgICAgIH0KCiAgICAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKGZpeF9ob2xkKV0gPT0gInRydWUiKSB8fCAoJHZhcnMoZml4X2hvbGQpID09IDEpfSB7CiAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNoYW5naW5nIHZhcnMoZml4X2hvbGQpIGZyb20gJHZhcnMoZml4X2hvbGQpIHRvIFwiJGZsb3dfZGVmYXVsdHMoZml4X2hvbGQpXCIiCiAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICBzZXQgdmFycyhmaXhfaG9sZCkgJGZsb3dfZGVmYXVsdHMoZml4X2hvbGQpCiAgICAgICAgIH0KICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZW5hYmxlX29jdildID09ICJ0cnVlIikgfHwgKCR2YXJzKGVuYWJsZV9vY3YpID09IDEpfSB7CiAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNoYW5naW5nIHZhcnMoZW5hYmxlX29jdikgZnJvbSBcIiR2YXJzKGVuYWJsZV9vY3YpXCIgdG8gXCJwcmVfcGxhY2VcIiIKICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9vY3YpIHByZV9wbGFjZQogICAgICAgICB9IGVsc2VpZiB7KCR2YXJzKGVuYWJsZV9vY3YpID09ICJub25lIikgfHwgKCR2YXJzKGVuYWJsZV9vY3YpID09IDApfSB7CiAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNoYW5naW5nIHZhcnMoZW5hYmxlX29jdikgZnJvbSBcIiR2YXJzKGVuYWJsZV9vY3YpXCIgdG8gXCJmYWxzZVwiIgogICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgc2V0IHZhcnMoZW5hYmxlX29jdikgZmFsc2UKICAgICAgICAgfQogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMX0gewogICAgICAgICAgICBpZiB7W3N0cmluZyB0b2xvd2VyICR2YXJzKGVuYWJsZV9vY3YpXSA9PSAiZmFsc2UifSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE1fSB7CiAgICAgICAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNoYW5naW5nIHZhcnMoZW5hYmxlX29jdikgZnJvbSBcIiR2YXJzKGVuYWJsZV9vY3YpXCIgdG8gXCJwcmVfcG9zdHJvdXRlXCIiCiAgICAgICAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfb2N2KSAicHJlX3Bvc3Ryb3V0ZSIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiQ2hhbmdpbmcgdmFycyhlbmFibGVfb2N2KSBmcm9tIFwiJHZhcnMoZW5hYmxlX29jdilcIiB0byBcInByZV9jdHNcIiIKICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9vY3YpICJwcmVfcGxhY2UiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKGVuYWJsZV9zcyldID09ICJ0cnVlIikgfHwgKCR2YXJzKGVuYWJsZV9zcykgPT0gMSl9IHsKICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiQ2hhbmdpbmcgdmFycyhlbmFibGVfc3MpIGZyb20gJHZhcnMoZW5hYmxlX3NzKSB0byBcInByZV9wb3N0cm91dGVcIiIKICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9zcykgcHJlX3Bvc3Ryb3V0ZQogICAgICAgICB9IGVsc2VpZiB7KCR2YXJzKGVuYWJsZV9zcykgPT0gIm5vbmUiKSB8fCAoJHZhcnMoZW5hYmxlX3NzKSA9PSAwKX0gewogICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGVuYWJsZV9zcykgZnJvbSAkdmFycyhlbmFibGVfc3MpIHRvIFwiZmFsc2VcIiIKICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9zcykgZmFsc2UKICAgICAgICAgfQogICAgICAgICBpZiB7KFtzdHJpbmcgdG9sb3dlciAkdmFycyhtZXRhbGZpbGwpXSA9PSAibm9uZSIpIHx8IChbc3RyaW5nIHRvbG93ZXIgJHZhcnMobWV0YWxmaWxsKV0gPT0gImZhbHNlIiAmJiAkdmFycyhtZXRhbGZpbGwpICE9ICJmYWxzZSIpIHx8ICgkdmFycyhtZXRhbGZpbGwpID09IDApfSB7CiAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNoYW5naW5nIHZhcnMobWV0YWxmaWxsKSBmcm9tICR2YXJzKG1ldGFsZmlsbCkgdG8gXCJmYWxzZVwiIgogICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgc2V0IHZhcnMobWV0YWxmaWxsKSBmYWxzZQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19lY28pXX0gewogICAgICAgICAgICBpZiB7KCR2YXJzKGNsb2NrX2VjbykgPT0gInRydWUiKSB8fCAoJHZhcnMoY2xvY2tfZWNvKSA9PSAxKX0gewogICAgICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGNsb2NrX2VjbykgZnJvbSAkdmFycyhjbG9ja19lY28pIHRvIFwicG9zdF9jdHNcIiIKICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgcG9zdF9jdHMKICAgICAgICAgICAgfSBlbHNlaWYgeygkdmFycyhjbG9ja19lY28pID09ICJmYWxzZSIpIHx8ICgkdmFycyhjbG9ja19lY28pID09IDApfSB7CiAgICAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNoYW5naW5nIHZhcnMoY2xvY2tfZWNvKSBmcm9tICR2YXJzKGNsb2NrX2VjbykgdG8gXCJub25lXCIiCiAgICAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICAgICBzZXQgdmFycyhjbG9ja19lY28pIG5vbmUKICAgICAgICAgICAgfSBlbHNlaWYgeygkdmFycyhjbG9ja19lY28pID09ICJwcmVyb3V0ZSIpIHx8ICgkdmFycyhjbG9ja19lY28pID09ICJwcmVfcm91dGUiKX0gewogICAgICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGNsb2NrX2VjbykgZnJvbSAkdmFycyhjbG9ja19lY28pIHRvIFwicG9zdF9jdHNcIiIKICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgcG9zdF9jdHMKICAgICAgICAgICAgfSBlbHNlaWYgeyR2YXJzKGNsb2NrX2VjbykgPT0gInBvc3Ryb3V0ZSJ9IHsKICAgICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiQ2hhbmdpbmcgdmFycyhjbG9ja19lY28pIGZyb20gJHZhcnMoY2xvY2tfZWNvKSB0byBcInBvc3Rfcm91dGVcIiIKICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgcG9zdF9yb3V0ZQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZmxvd19lZmZvcnQpXSA9PSAibm9uZSIpIHx8IChbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZmxvd19lZmZvcnQpXSA9PSAiZGVmYXVsdCIpfSB7CiAgICAgICAgICAgIGFwcGVuZCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIkNoYW5naW5nIHZhcnMoZmxvd19lZmZvcnQpIGZyb20gJyR2YXJzKGZsb3dfZWZmb3J0KScgdG8gJ3N0YW5kYXJkJyIKICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfZWZmb3J0KSBzdGFuZGFyZAogICAgICAgICB9CiAgICAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKHVzZV9mbGV4bW9kZWxzKV0gPT0gInRydWUiKSB8fCAoJHZhcnModXNlX2ZsZXhtb2RlbHMpID09IDEpfSB7CiAgICAgICAgICAgIHNldCB2YXJzKHVzZV9mbGV4bW9kZWxzKSAxCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKHVzZV9mbGV4bW9kZWxzKSAwCiAgICAgICAgIH0KIyAgICAgICAgIGlmIHskdmFycyh1c2VfZmxleG1vZGVscykgJiYgJHZhcnMocGxhY2Vfb3B0X2Rlc2lnbil9IHsKIyAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlNldHRpbmcgdmFycyhwbGFjZV9vcHRfZGVzaWduKSB0byAnZmFsc2UnIGFzIHZhcnModXNlX2ZsZXhtb2RlbHMpIGlzIHRydWUiCiMgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKIyAgICAgICAgICAgIHNldCB2YXJzKHBsYWNlX29wdF9kZXNpZ24pIGZhbHNlCiMgICAgICAgICB9CiAgICAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKGZsZXhtb2RlbF9hc19wdG4pXSA9PSAidHJ1ZSIpIHx8ICgkdmFycyhmbGV4bW9kZWxfYXNfcHRuKSA9PSAxKX0gewogICAgICAgICAgICBzZXQgdmFycyhmbGV4bW9kZWxfYXNfcHRuKSAxCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKGZsZXhtb2RlbF9hc19wdG4pIDAKICAgICAgICAgfQogICAgICAgICBpZiB7KFtzdHJpbmcgdG9sb3dlciAkdmFycyhwbGFjZW1lbnRfYmFzZWRfcHRuKV0gPT0gInRydWUiKSB8fCAoJHZhcnMocGxhY2VtZW50X2Jhc2VkX3B0bikgPT0gMSl9IHsKICAgICAgICAgICAgc2V0IHZhcnMocGxhY2VtZW50X2Jhc2VkX3B0bikgMQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhwbGFjZW1lbnRfYmFzZWRfcHRuKSAwCiAgICAgICAgIH0KICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMoYWJ1dHRlZF9kZXNpZ24pXSA9PSAidHJ1ZSIpIHx8ICgkdmFycyhhYnV0dGVkX2Rlc2lnbikgPT0gMSl9IHsKICAgICAgICAgICAgc2V0IHZhcnMoYWJ1dHRlZF9kZXNpZ24pIDEKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnMoYWJ1dHRlZF9kZXNpZ24pIDAKICAgICAgICAgfQogICAgICAgICBpZiB7KFtzdHJpbmcgdG9sb3dlciAkdmFycyhpbnNlcnRfZmVlZHRocm91Z2gpXSA9PSAidHJ1ZSIpIHx8ICgkdmFycyhpbnNlcnRfZmVlZHRocm91Z2gpID09IDEpfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGluc2VydF9mZWVkdGhyb3VnaCkgMQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhpbnNlcnRfZmVlZHRocm91Z2gpIDAKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHJlc2l6ZV9zaGlmdGVyX2FuZF9pc29faW5zdHMpXSB8fCAkdmFycyhyZXNpemVfc2hpZnRlcl9hbmRfaXNvX2luc3RzKSA9PSAiIn0gewogICAgICAgICAgICBzZXQgdmFycyhyZXNpemVfc2hpZnRlcl9hbmRfaXNvX2luc3RzKSB0cnVlCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhhY3Rpdml0eV9maWxlX2Zvcm1hdCldIHx8ICR2YXJzKGFjdGl2aXR5X2ZpbGVfZm9ybWF0KSA9PSAiIn0gewogICAgICAgICAgICBzZXQgdmFycyhhY3Rpdml0eV9maWxlX2Zvcm1hdCkgVENGCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9uZXRzKV19IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHB3cm5ldCldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogVmFyaWFibGUgcHdybmV0IGhhcyBiZWVuIGNoYW5nZWQgdG8gcG93ZXJfbmV0cyAuLi4gcGxlYXNlIHVwZGF0ZVxuIgogICAgICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJWYXJpYWJsZSBwd3JuZXQgaGFzIGJlZW4gY2hhbmdlZCB0byBwb3dlcl9uZXRzIC4uLiBwbGVhc2UgdXBkYXRlIgogICAgICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgICAgc2V0IHZhcnMocG93ZXJfbmV0cykgJHZhcnMocHdybmV0KQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdmFycyhwb3dlcl9uZXRzKSAiIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhncm91bmRfbmV0cyldfSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhnbmRuZXQpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IFZhcmlhYmxlIGduZG5ldCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGdyb3VuZF9uZXRzIC4uLiBwbGVhc2UgdXBkYXRlXG4iCiAgICAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIlZhcmlhYmxlIGduZG5ldCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGdyb3VuZF9uZXRzIC4uLiBwbGVhc2UgdXBkYXRlIgogICAgICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgICAgc2V0IHZhcnMoZ3JvdW5kX25ldHMpICR2YXJzKGduZG5ldCkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoZ3JvdW5kX25ldHMpICIiCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHN1cGVyaG9zdHMpXX0gewogICAgICAgICAgICBzZXQgdmFycyhzdXBlcmhvc3RzKSAwCiAgICAgICAgIH0KCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc3VwZXJ0aHJlYWRzKV19IHsKICAgICAgICAgICAgc2V0IHZhcnMoc3VwZXJ0aHJlYWRzKSAxCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHsoJHZhcnModGhyZWFkcykgPiAxKSAmJiAoJHZhcnMoc3VwZXJ0aHJlYWRzKSA9PSAxKX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhzdXBlcnRocmVhZHMpICR2YXJzKHRocmVhZHMpCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG1ha2VmaWxlKV19IHsKICAgICAgICAgICAgc2V0IHZhcnMobWFrZWZpbGUpIDEKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGZsYXQpXX0gewogICAgICAgICAgICBzZXQgdmFycyhmbGF0KSBub25lCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhhYm9ydCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGFib3J0KSAwCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjYXRjaF9lcnJvcnMpXX0gewogICAgICAgICAgICBzZXQgdmFycyhjYXRjaF9lcnJvcnMpIDEKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHJlc3RvcmVfZGVzaWduKV19IHsKICAgICAgICAgICAgc2V0IHZhcnMocmVzdG9yZV9kZXNpZ24pIDEKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoY2F0Y2hfZXJyb3JzKX0gewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHNhdmVfb25fY2F0Y2gpXX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhzYXZlX29uX2NhdGNoKSAxCiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZXhpdF9vbl9lcnJvcildfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKGV4aXRfb25fZXJyb3IpIDEKICAgICAgICAgICAgfSAKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXX0gewogICAgICAgICAgICBzZXQgZW52KFZQQVRIKSAkZmxvd19kZWZhdWx0cyh2cGF0aCkKICAgICAgICAgICAgcHV0cyAiPEZGPiBJTkZPOiBTZXR0aW5nIGVudihWUEFUSCkgdG8gJGZsb3dfZGVmYXVsdHModnBhdGgpIgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY3BmX3RpbWluZyldfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKGNwZl90aW1pbmcpIHRydWUKIyAgICAgICAgICAgICAgIHNldCB2YXJzKGZsYXQpIHRydWUKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhjcGZfdGltaW5nKSBmYWxzZQogICAgICAgICB9CgogICAgICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSB7IAogICAgICAgICAgICBpZiB7W0ZGOjppc19scF9mbG93XX0gewogICAgICAgICAgICAgICBjYXRjaCB7YWxpYXMgZmZfbW9kaWZ5X3Bvd2VyX2RvbWFpbnMgRkZfTk9WVVM6Om1vZGlmeV9wb3dlcl9kb21haW5zfQogICAgICAgICAgICAgICBjYXRjaCB7YWxpYXMgZmZfYWRkX3Bvd2VyX3N3aXRjaGVzIEZGX05PVlVTOjphZGRfcG93ZXJfc3dpdGNoZXN9CiAgICAgICAgICAgICAgIGNhdGNoIHthbGlhcyBmZl9yb3V0ZV9zZWNvbmRhcnlfcGdfbmV0cyBGRl9OT1ZVUzo6cm91dGVfc2Vjb25kYXJ5X3BnX25ldHN9CiAgICAgICAgICAgICAgIGNhdGNoIHthbGlhcyBmZl9nZXRfcG93ZXJfZG9tYWlucyBGRl9OT1ZVUzo6Z2V0X3Bvd2VyX2RvbWFpbnN9CiAgICAgICAgICAgICAgIGNhdGNoIHthbGlhcyBmZl9idWZmZXJfYWx3YXlzX29uX25ldHMgRkZfTk9WVVM6OmJ1ZmZlcl9hbHdheXNfb25fbmV0c30KICAgICAgICAgICAgICAgY2F0Y2gge2FsaWFzIGZmX2luc2VydF93ZWxsdGFwc19lbmRjYXBzIEZGX05PVlVTOjppbnNlcnRfd2VsbHRhcHNfZW5kY2Fwc30KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgZmxvd19kZWZhdWx0cyhzY3JpcHRfZGlyKSAiLiIKICAgICAgICB9CgojIFJlbWVtYmVyIHRoZXNlIGZvciBzdGVwIGJhc2VkIHJlcG9ydGluZyAuLi4KICAgICAgICAgc2V0IHZhcnMob3JpZ19ycHRfZGlyKSAgJHZhcnMocnB0X2RpcikKICAgICAgICAgc2V0IHZhcnMob3JpZ19sb2dfZGlyKSAgJHZhcnMobG9nX2RpcikKICAgICAgICAgc2V0IHZhcnMob3JpZ19kYnNfZGlyKSAgJHZhcnMoZGJzX2RpcikKCiMgQWRkIHRoZXNlIGZvciBnZXQgbWV0cmljCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoaHRtbF9zdW1tYXJ5KV19IHsKICAgICAgICAgICAgc2V0IHZhcnMoaHRtbF9zdW1tYXJ5KSAgJHZhcnMocnB0X2Rpcikvc3VtbWFyeS5odG1sCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2luZm9fZGIpXX0gewogICAgICAgICAgICBzZXQgdmFycyh0aW1lX2luZm9fZGIpICAkdmFycyhycHRfZGlyKS90aW1lX2luZm8uZGIKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRpbWVfaW5mb19ycHQpXX0gewogICAgICAgICAgICBzZXQgdmFycyh0aW1lX2luZm9fcnB0KSAgJHZhcnMocnB0X2RpcikvdGltZV9pbmZvLnJwdAogICAgICAgICB9CgogICAgICAgICBpZiB7W2luZm8gY29tbWFuZCBGRkY6OmdldF90b29sXSBuZSAiIiAmJiBbRkZGOjpnZXRfdG9vbF0gZXEgInJjIn0gewogICAgICAgICAgIHRjbF9zb3VyY2UgJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9JTk5PVlVTL3VkbS50Y2wKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBzb3VyY2UgJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9JTk5PVlVTL3VkbS50Y2wKICAgICAgICAgfQogICAgICAgICBpZiB7ISR2YXJzKHJjKSB8fCAoJHZhcnMocmMpICYmICFbaW5mbyBleGlzdHMgdmFycyhyY19zdGVwcyldKX0gewogICAgICAgICAgICBzZXQgdmFycyhzZWVkKSAxCiAgICAgICAgIH0KICAgICAgfQoKIyAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgIEZGX05PVlVTOjpub3JtYWxpemVfY29uc3RyYWludHMgCiMgICAgICB9CgogICAgICBpZiB7JHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcyl9IHsKIyAgICAgICAgIHNldCB2YXJzKHNraXBfc2lnbm9mZl9jaGVja3MpIHRydWUKICAgICAgICAgRkZfTk9WVVM6Om5vcm1hbGl6ZV9maWxlcyAKICAgICAgfQoKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKIyAgICAgICAgIHNldCB2YXJzKHNraXBfc2lnbm9mZl9jaGVja3MpIGZhbHNlCiMgICAgICB9CiAgICAgICMgIFJDIFN0dWZmIC4uLgogICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBpZiB7JHZhcnMocmMpfSB7CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMob3ZmX2RpcildfSB7IHNldCB2YXJzKG92Zl9kaXIpIE9WRiB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobGVjX2RpcildfSB7IHNldCB2YXJzKGxlY19kaXIpIExFQyB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX3JjcCldfSB7IHNldCB2YXJzKGVuYWJsZV9yY3ApIDAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9wYW0pXX0geyBzZXQgdmFycyhlbmFibGVfcGFtKSAwIH0KICAgICAgICAgc2V0IHZhcnMoc3luX21hcCxzZXRfbGliX2F0dHJpYnV0ZXMsc2tpcCkgdHJ1ZQogICAgICAgICBzZXQgdmFycyhzeW5fbWFwLHNldF9taXNjX2F0dHJpYnV0ZXMsc2tpcCkgdHJ1ZQogICAgICAgICBzZXQgdmFycyhzeW5fbWFwLHNldF9oZGxfYXR0cmlidXRlcyxza2lwKSB0cnVlCiAgICAgICAgIHNldCB2YXJzKHN5bl9tYXAsc2V0X2ljZ19hdHRyaWJ1dGVzLHNraXApIHRydWUKICAgICAgICAgc2V0IHZhcnMoc3luX21hcCxzZXRfZGZ0X2F0dHJpYnV0ZXMsc2tpcCkgdHJ1ZQogICAgICAgICBzZXQgdmFycyhzeW5faW5jcixzZXRfb3B0X2F0dHJpYnV0ZXMsc2tpcCkgdHJ1ZQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFNldCBuZXRsaXN0IGFuZCBkZWYgdmFyaWFibGVzIHdoZW4gUkMgLyBSQ1AgZW5hYmxlZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIGlmIHskdmFycyhlbmFibGVfcmNwKX0gewogICAgICAgICAgICBzZXQgdmFycyhuZXRsaXN0KSAkdmFycyhkYnNfZGlyKS9zeW5fcGxhY2Uvc3luX3BsYWNlLnYuZ3oKIyAgICAgICAgICAgIHNldCB2YXJzKGRlZl9maWxlcykgJHZhcnMoZGJzX2Rpcikvc3luX3BsYWNlLmRlZi5negogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhuZXRsaXN0KSAkdmFycyhkYnNfZGlyKS9zeW5faW5jci9zeW5faW5jci52Lmd6CiMgICAgICAgICAgICBzZXQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRic19kaXIpL3N5bl9pbmNyL3N5bl9pbmNyLmRlZi5negogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhub3Z1cyl9IHsKICAgICAgICAgI3NldCB2YXJzKG1ha2VfdG9vbF9hcmdzKSAiLW5vd2luIC02NCIKICAgICAgICAgc2V0IHZhcnMobWFrZV9zeW5fdG9vbF9hcmdzKSAiLTY0IgogICAgICAgICBzZXQgdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKSB0cnVlCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICNzZXQgdmFycyhtYWtlX3Rvb2xfYXJncykgIi1ub3dpbiAtNjQiCiAgICAgICAgIHNldCB2YXJzKG1ha2Vfc3luX3Rvb2xfYXJncykgIi02NCAtbGVnYWN5X3VpIgogICAgICAgICBzZXQgdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKSB0cnVlCiAgICAgIH0gCgogICB9CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgUHJvY2VkdXJlIHRvIGNoZWNrIHRoZSBmbG93IHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBzZXR1cC50Y2wKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgcHJvYyBjaGVja19zZXR1cCB7fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgdHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgd2FybmluZ3MKICAgICAgZ2xvYmFsIGluZm9zCiAgICAgIGdsb2JhbCBjaGVjawoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNoZWNrX3NldHVwKV0gICYmICEkdmFycyhjaGVja19zZXR1cCl9IHsKICAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh3YXJuaW5nX2NvdW50KV19IHsKICAgICAgICAgc2V0IHdhcm5pbmdfY291bnQgJHZhcnMod2FybmluZ19jb3VudCkKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHdhcm5pbmdfY291bnQgMAogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlcnJvcl9jb3VudCldfSB7CiAgICAgICAgIHNldCBlcnJvcl9jb3VudCAkdmFycyhlcnJvcl9jb3VudCkKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGVycm9yX2NvdW50IDAKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaW5mb19jb3VudCldfSB7CiAgICAgICAgIHNldCBpbmZvX2NvdW50ICR2YXJzKGluZm9fY291bnQpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBpbmZvX2NvdW50IDAKICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHBsYWNlX29wdF9kZXNpZ24pICYmICR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJGZWF0dXJlIHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikgbm90IHN1cHBvcnQgZm9yIHRvcCBsZXZlbCBpbXBsZW1lbnRhdGlvbiB3aGVuIHZhcnMoZW5hYmxlX2ZsZXhpbG0pIGlzIHRydWUiCiAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldyldfSB7CiAgICAgICAgIGlmIHtbbHNlYXJjaCBbY29uY2F0ICR2YXJzKHNldHVwX2FuYWx5c2lzX3ZpZXdzKSAkdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKV0gJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldyldID09IC0xfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFBvd2VyIGFuYWx5c2lzIHZpZXcgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgaXMgbm90IGEgZGVmaW5lZCB2aWV3XG4iCiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUG93ZXIgYW5hbHlzaXMgdmlldyAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KSBpcyBub3QgYSBkZWZpbmVkIHZpZXciCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgfQogICAgICB9CgogICAgICBzZXQgdmFsaWQgW2xpc3QgdHJpYWxfaXBvIGdpZ2Ffb3B0IHByb3RvX25ldF9kZWxheV9tb2RlbF0KICAgICAgaWYge1tsc2VhcmNoICR2YWxpZCBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoYnVkZ2V0X21vZGUpXV0gPT0gLTF9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycyhidWRnZXRfbW9kZSkgaGFzIGlsbGVnYWwgdmFsdWUgJHZhcnMoYnVkZ2V0X21vZGUpXG4iCiAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVmFyaWFibGUgdmFycyhidWRnZXRfbW9kZSkgaGFzIGlsbGVnYWwgdmFsdWUgJHZhcnMoYnVkZ2V0X21vZGUpIgogICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgIE11c3QgYmUgb25lIG9mICckdmFsaWQnXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c19lbmdpbmUpXX0gewogICAgICAgICBpZiB7W3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXSA9PSAiY2NvcHRkZXNpZ24ifSB7IAogICAgICAgICAgICBzZXQgdmFycyhjdHNfZW5naW5lKSBjY29wdCAKICAgICAgICAgfSAKICAgICAgICAgaWYge1tzdHJpbmcgdG9sb3dlciAkdmFycyhjdHNfZW5naW5lKV0gPT0gImNsb2NrZGVzaWduIn0geyAKICAgICAgICAgICAgc2V0IHZhcnMoY3RzX2VuZ2luZSkgY3RzIAogICAgICAgICB9CiAgICAgICAgIHNldCB2YWxpZCBbbGlzdCBjY29wdCBjY29wdF9jdHNdCiAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFsaWQgW3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXV0gPT0gLTF9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycyhjdHNfZW5naW5lKSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycyhjdHNfZW5naW5lKVxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMoY3RzX2VuZ2luZSkgaGFzIGlsbGVnYWwgdmFsdWUgJHZhcnMoY3RzX2VuZ2luZSkiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2NvcHRfaW50ZWdyYXRpb24pXX0gewogICAgICAgICBzZXQgdmFsaWQge3NjcmlwdGVkIG5hdGl2ZX0KICAgICAgICAgaWYge1tsc2VhcmNoICR2YWxpZCAkdmFycyhjY29wdF9pbnRlZ3JhdGlvbildID09IC0xfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFZhcmlhYmxlIHZhcnMoY3RzX2VuZ2luZSkgaGFzIGlsbGVnYWwgdmFsdWUgJHZhcnMoY3RzX2VuZ2luZSlcbiIKICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKGN0c19lbmdpbmUpIGhhcyBpbGxlZ2FsIHZhbHVlICR2YXJzKGN0c19lbmdpbmUpIgogICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgIE11c3QgYmUgb25lIG9mICckdmFsaWQnXG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgIyBEZWZhdWx0IHRvIG5hdGl2ZSBpbnRlZ3JhdGlvbgogICAgICAgICBzZXQgdmFycyhjY29wdF9pbnRlZ3JhdGlvbikgIm5hdGl2ZSIKICAgICAgfQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHZhcnNdIHsKICAgICAgICAgICAgc2V0IHNhdmVfdmFycygkdmFyKSAkdmFycygkdmFyKQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHR2YXJzKCR2YXIpXX0gewogICAgICAgICAgICAgICBzZXQgdmFycygkdmFyKSAkdHZhcnMoJHZhcikKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNldCBjb21tYW5kcyAgIiIKCiAgICAgIHNldCBjaGVjayhmaWxlcykgW2xpc3RdCiAgICAgIHNldCBjaGVjayhpbnRlZ2VycykgW2xpc3RdCgoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhhYm9ydCldfSB7CiAgICAgICAgIHNldCB2YXJzKGFib3J0KSAwCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjaGVja192YXJzKV0gJiYgJHZhcnMoY2hlY2tfdmFycyl9IHsKICAgICAgICAgc291cmNlICR2YXJzKHNjcmlwdF9yb290KS9FVEMvSU5OT1ZVUy9jaGVja192YXJzLnRjbAogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgUmVxdWlyZWQgVmFyaWFibGVzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBzZXQgY291bnQgMAogICAgICBmb3JlYWNoIHJlcXVpcmVkICJmcF90Y2xfZmlsZSBmcF9maWxlIGRlZl9maWxlcyIgewogICAgICAgICAjIEJDTDogTm90ZSAtIFRoaXMgY29kZSByZW1vdmVkIGFzIHRoZSBSQyBGb3VuZGF0aW9uIEZsb3cgd2lsbCBzZXQgdmFycyhkZWZfZmlsZXMpIHdoZW4gaXQKICAgICAgICAgIyBpc24ndCBkZWZpbmVkIGluIHRoZSB1c2VyJ3Mgc2V0dXAudGNsCiAgICAgICAgICNpZiB7JHZhcnMocmMpICYmICFbaW5mbyBleGlzdHMgdmFycyhkZWZfZmlsZXMpXX0gewogICAgICAgICAjICAgc2V0IHZhcnMoZGVmX2ZpbGVzKSAkdmFycyhkYnNfZGlyKS8kdmFycyhkZXNpZ24pLnN5bl9wbGFjZWQuZGVmLmd6CiAgICAgICAgICN9CiAgICAgICAgIGlmIHshJHZhcnMocmMpfSB7CiAgICAgICAgICAgIyBCQ0w6IE9ubHkgY2hlY2sgZm9yIHZhcnMoZGVmX2ZpbGVzKSBpZiBub3QgaW4gUkMgbW9kZQogICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmVxdWlyZWQpXSAmJiAoJHZhcnMoJHJlcXVpcmVkKSAhPSAiIil9IHsKICAgICAgICAgICAgICBpZiB7JHJlcXVpcmVkID09ICJkZWZfZmlsZXMifSB7CiAgICAgICAgICAgICAgICAgc2V0IGZpcnN0IDEKICAgICAgICAgICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgYXJvdW5kIHZhcnMoZGVmX2ZpbGVzKSB0byByZXNvbHZlIHZhcnMocnVuZGlyKQogICAgICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSBbc3Vic3QgJHZhcnMoZGVmX2ZpbGVzKV0gewogICAgICAgICAgICAgICAgICAgIGlmIHskZmlyc3QgPT0gMX0gewogICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJHJlcXVpcmVkID0gJGZpbGVcbiIKICAgICAgICAgICAgICAgICAgICAgICBzZXQgZmlyc3QgMAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgICAgICAgICAgICAkZmlsZSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgeyEkdmFycyhyYyl9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJGZpbGUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJHZhcnMoJHJlcXVpcmVkKQogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJHJlcXVpcmVkID0gJHZhcnMoJHJlcXVpcmVkKVxuIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpbmNyIGNvdW50CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZwX3RjbF9wcm9jKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICBmcF90Y2xfcHJvYyA9ICR2YXJzKGZwX3RjbF9wcm9jKVxuIgogICAgICAgICBpbmNyIGNvdW50CiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9mcCldfSB7IAogICAgICAgICBpZiB7W2xsZW5ndGggJHZhcnMob2FfZnApXSA9PSAzfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgICAgICAgb2FfZnAgPSAkdmFycyhvYV9mcClcbiIKICAgICAgICAgICAgaW5jciBjb3VudAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBPQSBmbG9vcnBsYW4gdmFyaWFibGUgKG9hX2ZwKSBzaG91bGQgYmUgJ2xpYiBjZWxsIHZpZXcnIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIk9BIGZsb29ycGxhbiB2YXJpYWJsZSAob2FfZnApIHNob3VsZCBiZSAnbGliIGNlbGwgdmlldyciCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICBpZiB7JGNvdW50ID09IDB9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBOZWl0aGVyIGZwX2ZpbGUsIGRlZl9maWxlcywgZnBfdGNsX2ZpbGUsIGZwX3RjbF9wcm9jIGFyZSBkZWZpbmVkXG4iCiAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIkVpdGhlciBmcF9maWxlLCBkZWZfZmlsZXMsIGZwX3RjbF9maWxlLCBmcF90Y2xfcHJvYyBzaG91bGQgYmUgZGVmaW5lZCIKICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKG5ldGxpc3RfdHlwZSkgInZlcmlsb2ciXT49MH0gewogICAgICAgICAjIEJDTDogTm90ZSAtIFRoaXMgY29kZSByZW1vdmVkIGFzIHRoZSBSQyBGb3VuZGF0aW9uIEZsb3cgd2lsbCBzZXQgdmFycyhkZWZfbmV0bGlzdCkgd2hlbiBpdAogICAgICAgICAjIGlzbid0IGRlZmluZWQgaW4gdGhlIHVzZXIncyBzZXR1cC50Y2wKICAgICAgICAgI2lmIHskdmFycyhyYykgJiYgIVtpbmZvIGV4aXN0cyB2YXJzKG5ldGxpc3QpXX0gewogICAgICAgICAjICAgc2V0IHZhcnMobmV0bGlzdCkgJHZhcnMoZGJzX2RpcikvJHZhcnMoZGVzaWduKS5zeW5fcGxhY2VkLnYuZ3oKICAgICAgICAgI30KICAgICAgICAgaWYgeyEkdmFycyhyYyl9IHsKICAgICAgICAgICAjIEJDTDogT25seSBjaGVjayBmb3IgdmFycyhuZXRsaXN0KSBpZiBub3QgaW4gUkMgbW9kZQogICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhuZXRsaXN0KV19IHsKICAgICAgICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgYXJvdW5kIHZhcnMobmV0bGlzdCkKICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgW3N1YnN0ICR2YXJzKG5ldGxpc3QpXSB7CiAgICAgICAgICAgICAgICAgaWYgeyEkdmFycyhyYyl9IHsKICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkZmlsZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICBuZXRsaXN0ID0gJHZhcnMobmV0bGlzdClcbiIKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIHsoJHZhcnMobmV0bGlzdF90eXBlKSA9PSAiVmVyaWxvZyIpfSB7CiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogQSB2ZXJpbG9nIG5ldGxpc3QgZmlsZSBtdXN0IGJlIGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIkEgdmVyaWxvZyBuZXRsaXN0IGZpbGUgbXVzdCBiZSBkZWZpbmVkIgogICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0gZWxzZWlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhuZXRsaXN0X3R5cGUpICJvYSJdPT0wfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgbmV0bGlzdF90eXBlID0gJHZhcnMobmV0bGlzdF90eXBlKVxuIgogICAgICAgICBmb3JlYWNoIHJlcXVpcmVkICJvYV9yZWZfbGliIG9hX2Rlc2lnbl9saWIgb2FfZGVzaWduX2NlbGwgb2FfZGVzaWduX3ZpZXciIHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyZXF1aXJlZCldICYmICgkdmFycygkcmVxdWlyZWQpICE9ICIiKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICAgICRyZXF1aXJlZCA9ICR2YXJzKCRyZXF1aXJlZClcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgJHJlcXVpcmVkIG11c3QgYmUgZGVmaW5lZCB3aGVuIG5ldGxpc3RfdHlwZSBpcyBvcGVuIGFjY2VzcyIKICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSAkcmVxdWlyZWQgbXVzdCBiZSBkZWZpbmVkIHdoZW4gbmV0bGlzdF90eXBlIGlzIG9wZW4gYWNjZXNzIgogICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIGRic19mb3JtYXQgPSAkdmFycyhkYnNfZm9ybWF0KVxuIgogICAgICAgICBmb3JlYWNoIHJlcXVpcmVkICJvYV9yZWZfbGliIG9hX2Rlc2lnbl9saWIgb2FfYWJzdHJhY3RfbmFtZSBvYV9sYXlvdXRfbmFtZSIgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHJlcXVpcmVkKV0gJiYgKCR2YXJzKCRyZXF1aXJlZCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgICAgJHJlcXVpcmVkID0gJHZhcnMoJHJlcXVpcmVkKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSAkcmVxdWlyZWQgbXVzdCBiZSBkZWZpbmVkIHdoZW4gZGJzX2Zvcm1hdCBpcyBvcGVuIGFjY2VzcyIKICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSAkcmVxdWlyZWQgbXVzdCBiZSBkZWZpbmVkIHdoZW4gZGJzX2Zvcm1hdCBpcyBvcGVuIGFjY2VzcyIKICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX2x2cyldICYmICR2YXJzKGVuYWJsZV9sdnMpfSB7CiAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXSE9MH0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFZhcmlhYmxlIGVuYWJsZV9sdnMgaXMgb25seSBhbGxvd2VkIHdoZW4gZGJzX2Zvcm1hdCBpcyBvcGVuIGFjY2VzcyIKICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiVmFyaWFibGUgZW5hYmxlX2x2cyBpcyBvbmx5IGFsbG93ZWQgd2hlbiBkYnNfZm9ybWF0IGlzIG9wZW4gYWNjZXNzIgogICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgc2V0IHZhcnMoZW5hYmxlX2x2cykgZmFsc2UKICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG5ldGxpc3QpXX0gewojICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKG5ldGxpc3QpIHsKIyAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICRmaWxlCiMgICAgICAgICB9CiMgICAgICB9IGVsc2UgewojICAgICAgICAgaWYgeyR2YXJzKG5ldGxpc3RfdHlwZSkgPT0gIlZlcmlsb2cifSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBBIHZlcmlsb2cgbmV0bGlzdCBmaWxlIG11c3QgYmUgZGVmaW5lZFxuIgojICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJBIHZlcmlsb2cgbmV0bGlzdCBmaWxlIG11c3QgYmUgZGVmaW5lZCIKIyAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKIwojICAgICAgICAgfQojICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c19zcGVjKV0gJiYgKCR2YXJzKGN0c19lbmdpbmUpID09ICJjY29wdCIpfSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSBjdHNfc3BlYyBkZWZpbmVkIGFuZCBjdHNfZW5naW5lIGlzIHNldCB0byBjY29wdFxuIgojICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSBjdHNfc3BlYyBkZWZpbmVkIGFuZCBjdHNfZW5naW5lIGlzIHNldCB0byBjY29wdCIKIyAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBWYXJpYWJsZSBjdHNfc3BlYyBkZWZpbmVkIGFuZCBjdHNfZW5naW5lIGlzIHNldCB0byBjY29wdFxuIgogICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJWYXJpYWJsZSBjdHNfc3BlYyBkZWZpbmVkIGFuZCBjdHNfZW5naW5lIGlzIHNldCB0byBjY29wdCIKICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhjdHNfc3BlYykgewogICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkZmlsZQogICAgICAgICB9CiAgICAgIH0KCiMgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewojICAgICAgICAgc2V0IHJlcXVpcmVkX2xpc3QgImZsb3cgcHJvY2VzcyBsaWJyYXJ5X3NldHMgcmNfY29ybmVycyBkZWxheV9jb3JuZXJzIgojICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHJlcXVpcmVkX2xpc3QgImZsb3cgcHJvY2VzcyBsaWJyYXJ5X3NldHMgcmNfY29ybmVycyBkZWxheV9jb3JuZXJzIHNldHVwX2FuYWx5c2lzX3ZpZXdzIFwKICAgICAgICAgICAgICAgICAgICAgICBob2xkX2FuYWx5c2lzX3ZpZXdzIGFjdGl2ZV9zZXR1cF92aWV3cyBhY3RpdmVfaG9sZF92aWV3cyBkZWZhdWx0X3NldHVwX3ZpZXcgZGVmYXVsdF9ob2xkX3ZpZXciCiMgICAgICB9CgogICAgICBmb3JlYWNoIHJlcXVpcmVkICRyZXF1aXJlZF9saXN0IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyZXF1aXJlZCldICYmICgkdmFycygkcmVxdWlyZWQpICE9ICIiKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRyZXF1aXJlZCA9ICR2YXJzKCRyZXF1aXJlZClcbiIKICAgICAgICAgICAgICAgaWYgeyRyZXF1aXJlZCA9PSAiZmxvdyJ9IHsKICAgICAgICAgICAgICAgICAgaWYgeyhbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldIHx8ICgkdmFycyhpbG1fbGlzdCkgIT0gIiIpKSAmJiAoJHZhcnMoZmxvdykgIT0gIm1tbWMiKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBGbG93IHZhcmlhYmxlIHZhcnMoZmxvdykgbXVzdCBiZSBcIm1tbWNcIiB3aGVuIElMTXMgYXJlIGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICIjICBFUlJPUjogRmxvdyB2YXJpYWJsZSB2YXJzKGZsb3cpIG11c3QgYmUgXCJtbW1jXCIgd2hlbiBJTE1zIGFyZSBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiMgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICBMaWJyYXJ5IFNldHNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGZvcmVhY2ggbGlicmFyeV9zZXQgJHZhcnMobGlicmFyeV9zZXRzKSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJGxpYnJhcnlfc2V0OlxuIgogICAgICAgICAgICBmb3JlYWNoIHJlcXVpcmVkICJ0aW1pbmciIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRsaWJyYXJ5X3NldCwkcmVxdWlyZWQpXSAmJiAoJHZhcnMoJGxpYnJhcnlfc2V0LCRyZXF1aXJlZCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJHJlcXVpcmVkID0gXG4iCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbGliICR2YXJzKCRsaWJyYXJ5X3NldCwkcmVxdWlyZWQpIHsKICAgIyAgICAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICRsaWIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgICAkbGliXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd119IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBWYXJpYWJsZSB2YXJzKCRsaWJyYXJ5X3NldCwkcmVxdWlyZWQpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlZhcmlhYmxlIHZhcnMoJGxpYnJhcnlfc2V0LCRyZXF1aXJlZCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRsaWJyYXJ5X3NldCwkcmVxdWlyZWQpIG5vdCBkZWZpbmVkIG9yIGVtcHR5XG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycygkbGlicmFyeV9zZXQsJHJlcXVpcmVkKSBub3QgZGVmaW5lZCBvciBlbXB0eSIKICAgICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LGFvY3YpXX0gewogICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJGxpYnJhcnlfc2V0LGFvY3YpIHsKICAgICAgICAgICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogQU9DViB0YWJsZSBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiQU9DViB0YWJsZSBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9hb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IEFPQ1YgZW5hYmxlZCwgYnV0IHRhYmxlIG5vdCBwcm92aWRlZCBmb3IgJGxpYnJhcnlfc2V0XG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIkFPQ1YgZW5hYmxlZCwgYnV0IHRhYmxlIG5vdCBwcm92aWRlZCBmb3IgJGxpYnJhcnlfc2V0IgogICAgICAgICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LHNvY3YpXX0gewogICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJGxpYnJhcnlfc2V0LHNvY3YpIHsKICAgICAgICAgICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogU09DViB0YWJsZSBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiU09DViB0YWJsZSBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFNPQ1YgZW5hYmxlZCwgYnV0IHRhYmxlIG5vdCBwcm92aWRlZCBmb3IgJGxpYnJhcnlfc2V0XG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlNPQ1YgZW5hYmxlZCwgYnV0IHRhYmxlIG5vdCBwcm92aWRlZCBmb3IgJGxpYnJhcnlfc2V0IgogICAgICAgICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LHNpKV19IHsKICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKCRsaWJyYXJ5X3NldCxzaSkgewogICAgICAgICAgICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBDREIgZmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIkNEQiBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAKICAgICAgICAgfQojICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgTEVGIEZpbGVzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobGVmX2ZpbGVzKV19IHsKICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGxlZl9maWxlcykgewogICAjICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICRmaWxlCiAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRmaWxlXG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMobmV0bGlzdF90eXBlKV0gPT0gInZlcmlsb2ciKSAmJiAoIVtpbmZvIGV4aXN0cyB2YXJzKG9hX3JlZl9saWIpXSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVxdWlyZWQgdmFyaWFibGUgdmFycyhsZWZfZmlsZXMpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycyhsZWZfZmlsZXMpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgSGllcmFyY2hpY2FsIFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBwYXJ0aXRpb25zID0gJHZhcnMocGFydGl0aW9uX2xpc3QpXG4iCiAgICAgICAgIHNldCBjdHNfc3BlYyBbRkY6OmdldF9ieV9zdWZmaXggdmFycyAiLGN0c19zcGVjIl0gCiAgICAgICAgIGlmIHskY3RzX3NwZWMgIT0gIiJ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgQ1RTIFNwZWNzIDogXG4iCiAgICAgICAgICAgIGZvcmVhY2ggcGFydGl0aW9uICRjdHNfc3BlYyB7CiAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICR2YXJzKCRwYXJ0aXRpb24sY3RzX3NwZWMpCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICRwYXJ0aXRpb24gLT4gJHZhcnMoJHBhcnRpdGlvbixjdHNfc3BlYylcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHNldCBsYXRlbmN5X3NkYyBbRkY6OmdldF9ieV9zdWZmaXggdmFycyAiLGxhdGVuY3lfc2RjIl0KICAgICAgICAgaWYgeyRsYXRlbmN5X3NkYyAhPSAiIn0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICBMYXRlbmN5IFNEQ3MgOlxuIgogICAgICAgICAgICBmb3JlYWNoIHBhcnRpdGlvbiAkbGF0ZW5jeV9zZGMgewogICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycygkcGFydGl0aW9uLGxhdGVuY3lfc2RjKQogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggW3NwbGl0ICRwYXJ0aXRpb24gIiwiXV0gPT0gMX0geyAgCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICRwYXJ0aXRpb24gLT4gJHZhcnMoJHBhcnRpdGlvbixsYXRlbmN5X3NkYylcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgIFtsaW5kZXggW3NwbGl0ICRwYXJ0aXRpb24gIiwiXSAwXSAoW2xpbmRleCBbc3BsaXQgJHBhcnRpdGlvbiAiLCJdIDFdKSAtPiAkdmFycygkcGFydGl0aW9uLGxhdGVuY3lfc2RjKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfcGFjKV0gJiYgJHZhcnMoZW5hYmxlX3BhYyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBQQUMgaXMgb2Jzb2xldGUgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBDb25zaWRlciB1c2luZyBTaWduLW9mZiBFQ08uIgogICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJQQUMgaXMgb2Jzb2xldGUgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBDb25zaWRlciB1c2luZyBTaWduLW9mZiBFQ08uIgogICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgc2V0IHBhY19tb2RlIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIscGFjX21vZGUiXQogICAgICAgICBpZiB7JHBhY19tb2RlICE9ICIifSB7CiAgICAgICAgICAgIHNldCBwYWNfbGlzdCBbbGlzdCAicmVhZF9vbmx5IiAiaW50ZXJmYWNlIiAiaWxtIiAiYWxsIl0KICAgICAgICAgICAgZm9yZWFjaCBwYWMgJHBhY19tb2RlIHsKICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICRwYWNfbGlzdCAkdmFycygkcGFjLHBhY19tb2RlKV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogJHBhYyBwYWNfbW9kZSBpbnZhbGlkIHZhbHVlOyBtdXN0IGJlIG9uZSBvZiBcJyRwYWNfbGlzdFwnXG4iCiAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiJHBhYyBwYWNfbW9kZSBpbnZhbGlkIHZhbHVlOyBtdXN0IGJlIG9uZSBvZiBcJyRwYWNfbGlzdFwnIiAKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W0ZGOjppc19scF9mbG93XX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgIExvdyBQb3dlciBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpZWVlMTgwMV9maWxlKV19IHsKICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlVzaW5nIHZhcnMoaWVlZTE4MDFfZmlsZSkgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBsaW1pdGVkIGFjY2VzcyBmZWF0dXJlIDogbXZzU3VwcG9ydElFRUUxODAxIgogICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIH0KICAgICAgICAgc2V0IG51bV9wb3dlcl9pbnRlbnRfZmlsZXMgMAogICAgICAgICBmb3JlYWNoIHYge2NwZl9maWxlIGllZWUxODAxX2ZpbGV9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2KV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkdiA9ICR2YXJzKCR2KVxuIgogICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycygkdikKICAgICAgICAgICAgICAgaW5jciBudW1fcG93ZXJfaW50ZW50X2ZpbGVzCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7JG51bV9wb3dlcl9pbnRlbnRfZmlsZXMgPiAxfSB7CiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAidmFycyhjcGZfZmlsZSkgYW5kIHZhcnMoaWVlZTE4MDFfZmlsZSkgbWF5IG5vdCBib3RoIGJlIHNwZWNpZmllZC4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6ICRlcnJvcnMoJGVycm9yX2NvdW50KVxuIgogICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIH0KCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9kb21haW5zKV0gJiYgKCR2YXJzKHBvd2VyX2RvbWFpbnMpICE9ICIiKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IHBvd2VyX2RvbWFpbnMgPSAgJHZhcnMocG93ZXJfZG9tYWlucylcbiIKICAgICAgICAgICAgZm9yZWFjaCBkb21haW4gJHZhcnMocG93ZXJfZG9tYWlucykgewogICAgICAgICAgICAgICBzZXQgcHJpbnQoJGRvbWFpbikgMQogICAgICAgICAgICAgICBmb3JlYWNoIG9wdGlvbmFsICJmaWxsZXJfY2VsbHMgdGllX2NlbGxzIGVuZGNhcHMgd2VsbHRhcHMiIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkb21haW4sJG9wdGlvbmFsKV0gJiYgKCR2YXJzKCRkb21haW4sJG9wdGlvbmFsKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyRwcmludCgkZG9tYWluKX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRkb21haW46XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBwcmludCgkZG9tYWluKSAwCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgICAkb3B0aW9uYWwgPSAkdmFycygkZG9tYWluLCRvcHRpb25hbClcbiIKICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICBpZiB7JG9wdGlvbmFsID09ICJmaWxsZXJfY2VsbHN9IHsKIyAgICAgICAgICAgICAgICAgICAgIHNldCBwcm9jZXNzIFtyZWdzdWIgIm5tIiAkdmFycyhwcm9jZXNzKSAiIl0KIyAgICAgICAgICAgICAgICAgICAgIGlmIHtbZXhwciAkcHJvY2VzcyA8PSAyOCldICYmIFtpbmZvIGV4aXN0cyB2YXJzKGZpbGxlcl9jZWxscyxtaW5fZ2FwKV19IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IEZvciBwcm9jZXNzIG5vZGUgPCAyOG5tLCB2YXJpYWJsZSB2YXJzKGZpbGxlcl9jZWxscyxtaW5fZ2FwKSBpcyByZXF1aXJlZFxuIgojICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJGb3IgcHJvY2VzcyBub2RlIDwgMjhubSwgdmFyaWFibGUgdmFycyhmaWxsZXJfY2VsbHMsbWluX2dhcCkgaXMgcmVxdWlyZWQiCiMgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiMgICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMocG93ZXJfZG9tYWlucykgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycyhwb3dlcl9kb21haW5zKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogcG93ZXJfYW5hbHlzaXNfdmlldyA9ICAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KVxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICBXaWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgc2V0dXAgYW5hbHlzaXMgdmlld1xuIgogICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJSZWNvbW1lbmRlZCB2YXJpYWJsZSB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgIFJDIENvcm5lcnNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIHNldCBjaGVjayhyY19jb3JuZXJzKSBbbGlzdF0KICAgICAgICAgZm9yZWFjaCByY19jb3JuZXIgJHZhcnMocmNfY29ybmVycykgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRyY19jb3JuZXI6XG4iCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSldICYmICgkdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgY2FwX3RhYmxlID0gJHZhcnMoJHJjX2Nvcm5lcixjYXBfdGFibGUpXG4iCiAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2socmNfY29ybmVycykgJHZhcnMoJHJjX2Nvcm5lcixjYXBfdGFibGUpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJHJjX2Nvcm5lcixxeF90ZWNoX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSBvciB2YXJzKCRyY19jb3JuZXIscXhfdGVjaF9maWxlKSBtdXN0IGJlIGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSBvciB2YXJzKCRyY19jb3JuZXIscXhfdGVjaF9maWxlKSBtdXN0IGJlIGRlZmluZWQiCiAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNX0gewogICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBWYXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICAgICAgc2V0IGluZm9zKCRpbmZvX2NvdW50KSAiVmFyaWFibGUgdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICBpbmNyIGluZm9fY291bnQKICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3RzX2VuZ2luZSkgIT0gImN0cyJ9IHsKIyAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKV0gJiYgKCR2YXJzKCRyY19jb3JuZXIsYXRmX2ZpbGUpICE9ICIiKX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgYXRmX2ZpbGUgPSAkdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKVxuIgojICAgICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhyY19jb3JuZXJzKSAkdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKQojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKSBub3QgZGVmaW5lZFxuIgojICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKSBub3QgZGVmaW5lZCIKIyAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHJjX2Nvcm5lcixUKV0gJiYgKCR2YXJzKCRyY19jb3JuZXIsVCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgdGVtcGVyYXR1cmUgPSAkdmFycygkcmNfY29ybmVyLFQpXG4iCiAgICAgICAgICAgICAgIHNldCB2YXJzKCRyY19jb3JuZXIsdGVtcGVyYXR1cmUpICR2YXJzKCRyY19jb3JuZXIsVCkKICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhpbnRlZ2VycykgIiRyY19jb3JuZXIsVCIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBSZWNvbW1lbmRlZCB2YXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsVCkgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmNfY29ybmVyLFQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHJjX2Nvcm5lcixxeF90ZWNoX2ZpbGUpXSAmJiAoJHZhcnMoJHJjX2Nvcm5lcixxeF90ZWNoX2ZpbGUpICE9ICIiKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIHF4X3RlY2hfZmlsZSA9ICR2YXJzKCRyY19jb3JuZXIscXhfdGVjaF9maWxlKVxuIgogICAgICAgICAgICAgICBzZXQgdmFycygkcmNfY29ybmVyLHFyY190ZWNoKSAkdmFycygkcmNfY29ybmVyLHF4X3RlY2hfZmlsZSkKICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhyY19jb3JuZXJzKSAkdmFycygkcmNfY29ybmVyLHF4X3RlY2hfZmlsZSkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCldICYmICgkdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpICE9ICJsb3ciKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBxeF90ZWNoX2ZpbGUgbm90IGRlZmluZWQgZm9yICRyY19jb3JuZXIgYW5kIHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCBpcyBzZXQgdG8gJHZhcnMocG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0KVxuIgogICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgInF4X3RlY2hfZmlsZSBub3QgZGVmaW5lZCBmb3IgJHJjX2Nvcm5lciBhbmQgcG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0IGlzIHNldCB0byAkdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpIgogICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQpXSAmJiAoJHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydCkgIT0gImxvdyIpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IHF4X3RlY2hfZmlsZSBub3QgZGVmaW5lZCBmb3IgJHJjX2Nvcm5lciBhbmQgc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydCBpcyBzZXQgdG8gJHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJxeF90ZWNoX2ZpbGUgbm90IGRlZmluZWQgZm9yICRyY19jb3JuZXIgYW5kIHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQgaXMgc2V0IHRvICR2YXJzKHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQpIgogICAjICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG9wY29uZHMpXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgIE9wZXJhdGluZyBDb25kaXRpb25zXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgICBmb3JlYWNoIG9wY29uZCAkdmFycyhvcGNvbmRzKSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJG9wY29uZDpcbiIKICAgICAgICAgICAgICAgZm9yZWFjaCByZXF1aXJlZCAiUCBWIFQiIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRvcGNvbmQsJHJlcXVpcmVkKV0gJiYgKCR2YXJzKCRvcGNvbmQsJHJlcXVpcmVkKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkcmVxdWlyZWQgPSAkdmFycygkb3Bjb25kLCRyZXF1aXJlZClcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVxdWlyZWQgdmFyaWFibGUgdmFycygkb3Bjb25kLCRyZXF1aXJlZCkgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRvcGNvbmQsJHJlcXVpcmVkKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICBUaW1pbmcgQ29uZGl0aW9uc1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHRpbWluZ19jb25kaXRpb25zKV19IHsKICAgICAgICAgICAgIGZvcmVhY2ggdGltaW5nX2NvbmRpdGlvbiAkdmFycyh0aW1pbmdfY29uZGl0aW9ucykgewogICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkdGltaW5nX2NvbmRpdGlvbjpcbiIKICAgICAgICAgICAgICAgIGlmIHshW0ZGOjppc19scF9mbG93XX0gewogICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR0aW1pbmdfY29uZGl0aW9uLGxpYnJhcnlfc2V0KV0gJiYgKCR2YXJzKCR0aW1pbmdfY29uZGl0aW9uLGxpYnJhcnlfc2V0KSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgbGlicmFyeV9zZXQgPSAkdmFycygkdGltaW5nX2NvbmRpdGlvbixsaWJyYXJ5X3NldClcbiIKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGFkZGl0aW9uYWwgImVhcmx5X2xpYnJhcnlfc2V0IGxhdGVfbGlicmFyeV9zZXQiIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdGltaW5nX2NvbmRpdGlvbiwkYWRkaXRpb25hbCldICYmICgkdmFycygkdGltaW5nX2NvbmRpdGlvbiwkYWRkaXRpb25hbCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRhZGRpdGlvbmFsID0gJHZhcnMoJHRpbWluZ19jb25kaXRpb24sJGFkZGl0aW9uYWwpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVxdWlyZWQgdmFyaWFibGUgdmFycygkdGltaW5nX2NvbmRpdGlvbixsaWJyYXJ5X3NldCkgYW5kIHZhcnMoJHRpbWluZ19jb25kaXRpb24sJGFkZGl0aW9uYWwpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlJlcXVpcmVkIHZhcmlhYmxlIHZhcnMoJHRpbWluZ19jb25kaXRpb24sbGlicmFyeV9zZXQpIGFuZCB2YXJzKCR0aW1pbmdfY29uZGl0aW9uLCRhZGRpdGlvbmFsKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yZWFjaCBvcHRpb25hbCAib3Bjb25kIG9wY29uZF9saWJyYXJ5IGVhcmx5X29wY29uZF9saWJyYXJ5IGxhdGVfb3Bjb25kX2xpYnJhcnkiIHsKICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdGltaW5nX2NvbmRpdGlvbiwkb3B0aW9uYWwpXSAmJiAoJHZhcnMoJHRpbWluZ19jb25kaXRpb24sJG9wdGlvbmFsKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJG9wdGlvbmFsID0gJHZhcnMoJHRpbWluZ19jb25kaXRpb24sJG9wdGlvbmFsKVxuIgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvcmVhY2ggZGVsYXlfY29ybmVyICR2YXJzKGRlbGF5X2Nvcm5lcnMpIHsKICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJGRlbGF5X2Nvcm5lcjpcbiIKICAgICAgICAgICAgICAgIGlmIHshW0ZGOjppc19scF9mbG93XX0gewogICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkZWxheV9jb3JuZXIsbGlicmFyeV9zZXQpXSAmJiAoJHZhcnMoJGRlbGF5X2Nvcm5lcixsaWJyYXJ5X3NldCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIGxpYnJhcnlfc2V0ID0gJHZhcnMoJGRlbGF5X2Nvcm5lcixsaWJyYXJ5X3NldClcbiIKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGFkZGl0aW9uYWwgImVhcmx5X2xpYnJhcnlfc2V0IGxhdGVfbGlicmFyeV9zZXQiIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZGVsYXlfY29ybmVyLCRhZGRpdGlvbmFsKV0gJiYgKCR2YXJzKCRkZWxheV9jb3JuZXIsJGFkZGl0aW9uYWwpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkYWRkaXRpb25hbCA9ICR2YXJzKCRkZWxheV9jb3JuZXIsJGFkZGl0aW9uYWwpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVxdWlyZWQgdmFyaWFibGUgdmFycygkZGVsYXlfY29ybmVyLGxpYnJhcnlfc2V0KSBhbmQgdmFycygkZGVsYXlfY29ybmVyLCRhZGRpdGlvbmFsKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRkZWxheV9jb3JuZXIsbGlicmFyeV9zZXQpIGFuZCB2YXJzKCRkZWxheV9jb3JuZXIsJGFkZGl0aW9uYWwpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JlYWNoIG9wdGlvbmFsICJvcGNvbmQgb3Bjb25kX2xpYnJhcnkgZWFybHlfb3Bjb25kX2xpYnJhcnkgbGF0ZV9vcGNvbmRfbGlicmFyeSIgewogICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkZWxheV9jb3JuZXIsJG9wdGlvbmFsKV0gJiYgKCR2YXJzKCRkZWxheV9jb3JuZXIsJG9wdGlvbmFsKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJG9wdGlvbmFsID0gJHZhcnMoJGRlbGF5X2Nvcm5lciwkb3B0aW9uYWwpXG4iCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IAogICAgICAgICB9CiAgIAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgRGVsYXkgQ29ybmVyc1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgc2V0IGdvb2RfY29ybmVycyBbbGlzdF0KICAgICAgICAgZm9yZWFjaCBkZWxheV9jb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewogICAgICAgICAgICBzZXQgYXJncyAwCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJGRlbGF5X2Nvcm5lcjpcbiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkZWxheV9jb3JuZXIscmNfY29ybmVyKV0gJiYgKCR2YXJzKCRkZWxheV9jb3JuZXIscmNfY29ybmVyKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICByY19jb3JuZXIgPSAkdmFycygkZGVsYXlfY29ybmVyLHJjX2Nvcm5lcilcbiIKICAgICAgICAgICAgICAgaW5jciBhcmdzCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFJlcXVpcmVkIHZhcmlhYmxlIHZhcnMoJGRlbGF5X2Nvcm5lcixyY19jb3JuZXIpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycygkZGVsYXlfY29ybmVyLHJjX2Nvcm5lcikgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgaWYgeyghW0ZGOjppc19scF9mbG93XSkgfHwgKFtGRjo6aXNfbHBfZmxvd10gJiYgISR2YXJzKGNwZl90aW1pbmcpKX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModGltaW5nX2NvbmRpdGlvbnMpXX0geyA7ICMgRG9uJ3QgcmVxdWlyZSB0aGlzIGFzIHdlIGNhbiBjb25zdHJ1Y3QgLi4uCiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZGVsYXlfY29ybmVyLHRpbWluZ19jb25kaXRpb24pXSAmJiAoJHZhcnMoJGRlbGF5X2Nvcm5lcix0aW1pbmdfY29uZGl0aW9uKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICB0aW1pbmdfY29uZGl0aW9uID0gJHZhcnMoJGRlbGF5X2Nvcm5lcix0aW1pbmdfY29uZGl0aW9uKVxuIgogICAgICAgICAgICAgICAgICAgICBpbmNyIGFyZ3MKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBhZGRpdGlvbmFsICJlYXJseV90aW1pbmdfY29uZGl0aW9uIGxhdGVfdGltaW5nX2NvbmRpdGlvbiIgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRlbGF5X2Nvcm5lciwkYWRkaXRpb25hbCldICYmICgkdmFycygkZGVsYXlfY29ybmVyLCRhZGRpdGlvbmFsKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkYWRkaXRpb25hbCA9ICR2YXJzKCRkZWxheV9jb3JuZXIsJGFkZGl0aW9uYWwpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgYXJncwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRkZWxheV9jb3JuZXIsdGltaW5nX2NvbmRpdGlvbikgYW5kIHZhcnMoJGRlbGF5X2Nvcm5lciwkYWRkaXRpb25hbCkgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRkZWxheV9jb3JuZXIsdGltaW5nX2NvbmRpdGlvbikgYW5kIHZhcnMoJGRlbGF5X2Nvcm5lciwkYWRkaXRpb25hbCkgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCBvcHRpb25hbCAicG93ZXJfZG9tYWlucyIgewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRlbGF5X2Nvcm5lciwkb3B0aW9uYWwpXSAmJiAoJHZhcnMoJGRlbGF5X2Nvcm5lciwkb3B0aW9uYWwpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRvcHRpb25hbCA9ICR2YXJzKCRkZWxheV9jb3JuZXIsJG9wdGlvbmFsKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyEkdmFycyhjcGZfdGltaW5nKSAmJiAoJGFyZ3MgPiAxKX0gewogICAgICAgICAgICAgICBsYXBwZW5kIGdvb2RfY29ybmVycyAkZGVsYXlfY29ybmVyCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHskYXJncyA+IDB9IHsKICAgICAgICAgICAgICAgICAgbGFwcGVuZCBnb29kX2Nvcm5lcnMgJGRlbGF5X2Nvcm5lcgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgc2V0IHZhcnMoZ29vZF9jb3JuZXJzKSAkZ29vZF9jb3JuZXJzCiAgICAgICAgIHNldCBjaGVjayhjb25zdHJhaW50X21vZGVzKSBbbGlzdF0KICAgICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd119IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICBDb25zdHJhaW50IE1vZGVzXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY29uc3RyYWludF9tb2RlcyldfSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggbW9kZSAkdmFycyhjb25zdHJhaW50X21vZGVzKSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJG1vZGU6XG4iCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggb3RoZXIgInByZV9jdHNfc2RjIGluY3JfY3RzX3NkYyBwb3N0X2N0c19zZGMiIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLCRvdGhlcildICYmICgkdmFycygkbW9kZSwkb3RoZXIpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRvdGhlciA9ICR2YXJzKCRtb2RlLCRvdGhlcilcbiIKICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhjb25zdHJhaW50X21vZGVzKSAkdmFycygkbW9kZSwkb3RoZXIpCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHshJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeygkb3RoZXIgPT0gInByZV9jdHNfc2RjIikgJiYgJHZhcnMocmMpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRtb2RlLCRvdGhlcikgJHZhcnMoZGJzX2RpcikvJHZhcnMoZGVzaWduKS5zeW5fcGxhY2VkLiRtb2RlLnNkYwogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiB7KCRvdGhlciA9PSAicHJlX2N0c19zZGMiKSAmJiAhJHZhcnMocmMpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBFUlJPUjogICAgVmFyaWFibGUgdmFycygkbW9kZSwkb3RoZXIpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVmFyaWFibGUgdmFycygkbW9kZSwkb3RoZXIpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHsoJG90aGVyID09ICJwcmVfY3RzX3NkYyIpIHx8ICgoJG90aGVyID09ICJwb3N0X2N0c19zZGMiKSAmJiAhW2luZm8gZXhpc3RzIHZhcnMoJG1vZGUsaW5jcl9jdHNfc2RjKV0pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgVmFyaWFibGUgdmFycygkbW9kZSwkb3RoZXIpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICBWYXJpYWJsZSB2YXJzKCRtb2RlLCRvdGhlcikgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IE5vIGNvbnN0cmFpbnQgbW9kZSBpbmZvcm1hdGlvbiBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgUG9zdCBDVFMgbGF0ZW5jeSBhZGp1c3RtZW50IG11c3QgYmVcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICBtYW5hZ2VkIGJ5IHRoZSB1c2VyIHZpYSBwbHVnLWluc1xuIgogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgQ29uc3RyYWludCBNb2Rlc1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgICAgaWYgeyR2YXJzKHJjKX0gewogICAgICAgICAgICAgICBzZXQgcmVxdWlyZWRfbGlzdCAic3ludGhfc2RjIHByZV9jdHNfc2RjIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgcmVxdWlyZWRfbGlzdCAicHJlX2N0c19zZGMiCiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGZvcmVhY2ggbW9kZSAkdmFycyhjb25zdHJhaW50X21vZGVzKSB7CiAgICAgICAgICAgICAgIHNldCBmb3VuZCAwCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJG1vZGU6XG4iCiAgICAgICAgICAgICAgIGZvcmVhY2ggcmVxdWlyZWQgJHJlcXVpcmVkX2xpc3QgewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG1vZGUsJHJlcXVpcmVkKV0gJiYgKCR2YXJzKCRtb2RlLCRyZXF1aXJlZCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJHJlcXVpcmVkID0gJHZhcnMoJG1vZGUsJHJlcXVpcmVkKVxuIgogICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGNvbnN0cmFpbnRfbW9kZXMpICR2YXJzKCRtb2RlLCRyZXF1aXJlZCkKICAgICAgICAgICAgICAgICAgICAgaW5jciBmb3VuZAogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJHJlcXVpcmVkX2xpc3RdID09IDF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVxdWlyZWQgdmFyaWFibGUgdmFycygkbW9kZSwkcmVxdWlyZWQpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycygkbW9kZSwkcmVxdWlyZWQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHsoW2xsZW5ndGggJHJlcXVpcmVkX2xpc3RdID4gMSkgJiYgKCRmb3VuZCA9PSAwKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBPbmUgb2YgdGhlIHJlcXVpcmVkIHZhcmlhYmxlcyAoJHJlcXVpcmVkX2xpc3QpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiT25lIG9mIHRoZSByZXF1aXJlZCB2YXJpYWJsZXMgKCRyZXF1aXJlZF9saXN0KSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGZvcmVhY2ggb3RoZXIgInBvc3RfY3RzX3NkYyBpbmNyX2N0c19zZGMiIHsKICAgICAgICAgICAgICAgICAgaWYgeyRvdGhlciA9PSAicG9zdF9jdHNfc2RjIiAmJiAhW2luZm8gZXhpc3RzIHZhcnMoJG90aGVyKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkbW9kZSwkb3RoZXIpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIFZhcmlhYmxlIHZhcnMoJG1vZGUsJG90aGVyKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRvdGhlciA9ICR2YXJzKCRtb2RlLCRvdGhlcilcbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG1vZGUsJG90aGVyKV0gJiYgKCR2YXJzKCRtb2RlLCRvdGhlcikgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJG90aGVyID0gJHZhcnMoJG1vZGUsJG90aGVyKVxuIgogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGNvbnN0cmFpbnRfbW9kZXMpICR2YXJzKCRtb2RlLCRvdGhlcikKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICBWYXJpYWJsZSB2YXJzKCRtb2RlLCRvdGhlcikgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgIAogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpXX0gewogICAgICAgICAgICBzZXQgdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKSAiIgogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldyldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpICIiCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICBBbmFseXNpcyBWaWV3c1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd119IHsKICAgICAgICAgICAgZm9yZWFjaCBhbmFseXNpc192aWV3IFtjb25jYXQgJHZhcnMoc2V0dXBfYW5hbHlzaXNfdmlld3MpICR2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpICR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJGFuYWx5c2lzX3ZpZXc6XG4iCiAgICAgICAgICAgICAgIGZvcmVhY2ggb3RoZXIgImRlbGF5X2Nvcm5lciBjb25zdHJhaW50X21vZGUiIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRhbmFseXNpc192aWV3LCRvdGhlcildICYmICgkdmFycygkYW5hbHlzaXNfdmlldywkb3RoZXIpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRvdGhlciA9ICR2YXJzKCRhbmFseXNpc192aWV3LCRvdGhlcilcbiIKICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhhbmFseXNpc192aWV3KSAkdmFycygkYW5hbHlzaXNfdmlldywkb3RoZXIpCiAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY2hlY2soYW5hbHlzaXNfdmlld3MpIFtsaXN0XQogICAgICAgICAgICBmb3JlYWNoIGFuYWx5c2lzX3ZpZXcgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cykgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldyldIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkYW5hbHlzaXNfdmlldzpcbiIKICAgICAgICAgICAgICAgZm9yZWFjaCByZXF1aXJlZCAiZGVsYXlfY29ybmVyIGNvbnN0cmFpbnRfbW9kZSIgewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGFuYWx5c2lzX3ZpZXcsJHJlcXVpcmVkKV0gJiYgKCR2YXJzKCRhbmFseXNpc192aWV3LCRyZXF1aXJlZCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJHJlcXVpcmVkID0gJHZhcnMoJGFuYWx5c2lzX3ZpZXcsJHJlcXVpcmVkKVxuIgogICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGFuYWx5c2lzX3ZpZXcpICR2YXJzKCRhbmFseXNpc192aWV3LCRyZXF1aXJlZCkKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVxdWlyZWQgdmFyaWFibGUgdmFycygkYW5hbHlzaXNfdmlldywkcmVxdWlyZWQpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycygkYW5hbHlzaXNfdmlldywkcmVxdWlyZWQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KIyAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgUmVjb21tZW5kZWQgVmFyaWFibGVzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBmb3JlYWNoIHJlY29tbWVuZGVkICJzY2FuX2RlZiBnZHNfbGF5ZXJfbWFwIiB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmVjb21tZW5kZWQpXSAmJiAoJHZhcnMoJHJlY29tbWVuZGVkKSAhPSAiIil9IHsKICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJHZhcnMoJHJlY29tbWVuZGVkKQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRyZWNvbW1lbmRlZCA9ICR2YXJzKCRyZWNvbW1lbmRlZClcbiIKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhnZHNfZmlsZXMpXSAmJiAoJHZhcnMoZ2RzX2ZpbGVzKSAhPSAiIil9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBnZHNfZmlsZXMgPSAkdmFycyhnZHNfZmlsZXMpXG4iCiAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhnZHNfZmlsZXMpIHsKICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJGZpbGUKICAgICAgICAgfQogICAgICB9CgogICAgICBmb3JlYWNoIHJlY29tbWVuZGVkICJtYXhfcm91dGVfbGF5ZXIgZmlsbGVyX2NlbGxzIHRpZV9jZWxscyBkb250X3VzZV9saXN0IGFudGVubmFfZGlvZGUiIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyZWNvbW1lbmRlZCldICYmICgkdmFycygkcmVjb21tZW5kZWQpICE9ICIiKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRyZWNvbW1lbmRlZCA9ICR2YXJzKCRyZWNvbW1lbmRlZClcbiIKICAgICAgICAgICAgaWYgeyRyZWNvbW1lbmRlZCA9PSAidGllX2NlbGxzIn0gewogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJHZhcnModGllX2NlbGxzKV0gPiAyfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMoJHJlY29tbWVuZGVkKSBoYXMgbW9yZSB0aGFuIHR3byBjZWxsc1xuIgogICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMoJHJlY29tbWVuZGVkKSBoYXMgbW9yZSB0aGFuIHR3byBjZWxscyIKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRyZWNvbW1lbmRlZCA9PSAiYW50ZW5uYV9kaW9kZSJ9IHsKICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICR2YXJzKGFudGVubmFfZGlvZGUpXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmVjb21tZW5kZWQpIGhhcyBtb3JlIHRoYW4gb25lIGNlbGxzXG4iCiAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmVjb21tZW5kZWQpIGhhcyBtb3JlIHRoYW4gb25lIGNlbGxzIgogICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHJlY29tbWVuZGVkID09ICJtYXhfcm91dGVfbGF5ZXIifSB7CiAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soaW50ZWdlcnMpICIkcmVjb21tZW5kZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeygkcmVjb21tZW5kZWQgPT0gImRvbnRfdXNlX2xpc3QiKX0gewogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGRvbnRfdXNlX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFJlY29tbWVuZGVkIHZhcmlhYmxlcyBkb250X3VzZV9saXN0IGFuZCBkb250X3VzZV9maWxlIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlJlY29tbWVuZGVkIHZhcmlhYmxlcyBkb250X3VzZV9saXN0IGFuZCBkb250X3VzZV9maWxlIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMoJHJlY29tbWVuZGVkKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJSZWNvbW1lbmRlZCB2YXJpYWJsZSB2YXJzKCRyZWNvbW1lbmRlZCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICB9ICAKICAgICAgICAgfQogICAgICB9CiAgICAgIGZvcmVhY2ggb3B0aW9uYWwgInNpemVfb25seV9maWxlIGRvbnRfdXNlX2ZpbGUiIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRvcHRpb25hbCldfSB7CiAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICR2YXJzKCRvcHRpb25hbCkKICAgICAgICAgfQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICBPdGhlciBWYXJpYWJsZXNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGZvcmVhY2ggb3RoZXIgImp0YWdfY2VsbHMganRhZ19yb3dzIHNwYXJlX2NlbGxzIiB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkb3RoZXIpXSAmJiAoJHZhcnMoJG90aGVyKSAhPSAiIil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkb3RoZXIgPSAkdmFycygkb3RoZXIpXG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogVmFyaWFibGUgdmFycygkb3RoZXIpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgIH0KICAgICAgfQoKIyAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgIFNjYWxlIEZhY3RvcnNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGZvcmVhY2ggcmNfY29ybmVyICR2YXJzKHJjX2Nvcm5lcnMpIHsKICAgICAgICAgICAgc2V0IGkgMAogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRyY19jb3JuZXI6XG4iCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLHNjYWxlX3RjbCldfSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoJHJjX2Nvcm5lcixzY2FsZV90Y2wpXX0gewogICAgICAgICAgICAgICAgICBpbmNyIGkKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgIHNjYWxpbmcgZmlsZSA9ICR2YXJzKCRyY19jb3JuZXIsc2NhbGVfdGNsKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBTY2FsaW5nIGZpbGUgJHZhcnMoJHJjX2Nvcm5lcixzY2FsZV90Y2wpIGZvciByYyBjb3JuZXIgJHJjX2Nvcm5lciBkZWZpbmVkIGJ1dCBkb2VzIG5vdCBleGlzdCIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJTY2FsaW5nIGZpbGUgJHZhcnMoJHJjX2Nvcm5lcixzY2FsZV90Y2wpIGZvciByYyBjb3JuZXIgJHJjX2Nvcm5lciBkZWZpbmVkIGJ1dCBkb2VzIG5vdCBleGlzdCIKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggb3RoZXIgInByZV9yb3V0ZV9yZXNfZmFjdG9yIHBvc3Rfcm91dGVfcmVzX2ZhY3RvciBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9yb3V0ZV9jYXBfZmFjdG9yIHBvc3Rfcm91dGVfY2FwX2ZhY3RvciBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9yb3V0ZV9jbGtfcmVzX2ZhY3RvciBwb3N0X3JvdXRlX2Nsa19yZXNfZmFjdG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yIHBvc3Rfcm91dGVfY2xrX2NhcF9mYWN0b3IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3JvdXRlX3hjYXBfZmFjdG9yIiB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLCRvdGhlcildfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJG90aGVyID0gJHZhcnMoJHJjX2Nvcm5lciwkb3RoZXIpXG4iCiAgICAgICAgICAgICAgICAgICAgIGluY3IgaQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGkgPT0gMH0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IE5vIHNjYWxlIGZhY3RvcnMgc2V0IGZvciByYyBjb3JuZXIgKCRyY19jb3JuZXIpXG4iCiAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIk5vIHNjYWxlIGZhY3RvcnMgc2V0IGZvciByYyBjb3JuZXIgKCRyY19jb3JuZXIpIgogICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgfQogICAgICAgICB9CiAgIAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgIERlcmF0aW5nIEZhY3RvcnNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIHNldCBpIDAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlcmF0ZV90Y2wpXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIGRlcmF0ZSBmaWxlID0gJHZhcnMoZGVyYXRlX3RjbClcbiIKICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJHZhcnMoZGVyYXRlX3RjbCkKICAgICAgICAgICAgaW5jciBpCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggZGVsYXlfY29ybmVyICR2YXJzKGRlbGF5X2Nvcm5lcnMpIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkZGVsYXlfY29ybmVyOlxuIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRlbGF5X2Nvcm5lcixkZXJhdGVfdGNsKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICBkZXJhdGUgZmlsZSA9ICR2YXJzKCRkZWxheV9jb3JuZXIsZGVyYXRlX3RjbClcbiIKICAgICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJHZhcnMoJGRlbGF5X2Nvcm5lcixkZXJhdGVfdGNsKQogICAgICAgICAgICAgICAgICBpbmNyIGkKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlcmF0ZV90Y2wpXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIGRlcmF0ZSBmaWxlID0gJHZhcnMoZGVyYXRlX3RjbClcbiIKICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJHZhcnMoZGVyYXRlX3RjbCkKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBvdGhlciAiZWFybHlfZGF0YV9jZWxsIGVhcmx5X2Nsb2NrX2NlbGwgZWFybHlfY2VsbF9jaGVjayBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVfZGF0YV9jZWxsIGxhdGVfY2xvY2tfY2VsbCBsYXRlX2NlbGxfY2hlY2sgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2NlbGxfZWFybHkgY2xvY2tfY2VsbF9lYXJseSBjZWxsX2NoZWNrX2Vhcmx5IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jZWxsX2xhdGUgY2xvY2tfY2VsbF9sYXRlIGNlbGxfY2hlY2tfbGF0ZSIgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRlbGF5X2Nvcm5lciwkb3RoZXIpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRvdGhlciA9ICR2YXJzKCRkZWxheV9jb3JuZXIsJG90aGVyKVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JGkgPT0gMH0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IE5vIGRlcmF0aW5nIGZhY3RvcnMgc2V0IGZvciBkZWxheSBjb3JuZXIgKCRkZWxheV9jb3JuZXIpXG4iCiAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIk5vIGRlcmF0aW5nIGZhY3RvcnMgc2V0IGZvciBkZWxheSBjb3JuZXIgKCRkZWxheV9jb3JuZXIpIgogICAgICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KIyAgICAgIH0KICAgICAgaWYgeyFbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewoKICAgICAgICAgc2V0IHZhbGlkICJUUlVFIEZBTFNFIHRydWUgZmFsc2UgYXV0byIKCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfc2lfYXdhcmUpXX0gewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhbGlkICR2YXJzKGVuYWJsZV9zaV9hd2FyZSldID09IC0xfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFZhcmlhYmxlIHZhcnMoZW5hYmxlX3NpX2F3YXJlKSBoYXMgaWxsZWdhbCB2YWx1ZVxuIgogICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMoZW5hYmxlX3NpX2F3YXJlKSBoYXMgaWxsZWdhbCB2YWx1ZSIKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBNdXN0IGJlIG9uZSBvZiAnJHZhbGlkJ1xuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0IHZhbGlkIFtsaXN0IHRydWUgZmFsc2VdCiAgICAgIGZvcmVhY2ggdmFyICJmaXhfaG9sZF9pZ25vcmVfaW9zIGZpeF9ob2xkX2FsbG93X3Ruc19kZWdyYWRhdGlvbiIgewogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCR2YXIpXX0gewogICAgICAgICAgICBjb250aW51ZQogICAgICAgICB9CiAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFsaWQgW3N0cmluZyB0b2xvd2VyICR2YXJzKCR2YXIpXV0gPT0gLTF9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycygkdmFyKSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycygkdmFyKVxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMoJHZhcikgaGFzIGlsbGVnYWwgdmFsdWUgJHZhcnMoJHZhcikiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgICAgfQogICAgICB9CgogICAgICBzZXQgdmFsaWQgInByZV9wbGFjZSBwcmVfcHJlY3RzIHByZV9jdHMgcHJlX3Bvc3RjdHMgcHJlX3Bvc3Ryb3V0ZSBwcmVfcG9zdHJvdXRlX3NpIHByZV9zaWdub2ZmIHRydWUgZmFsc2UiCiAgICAgIGZvcmVhY2ggb3B0aW9uICJtZXRhbGZpbGwgZW5hYmxlX29jdiBlbmFibGVfc3MiIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRvcHRpb24pXX0gewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhbGlkICR2YXJzKCRvcHRpb24pXSA9PSAtMX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKCRvcHRpb24pIGhhcyBpbGxlZ2FsIHZhbHVlICgkdmFycygkb3B0aW9uKSlcbiIKICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKCRvcHRpb24pIGhhcyBpbGxlZ2FsIHZhbHVlICgkdmFycygkb3B0aW9uKSkiCiAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNldCBwYWNzIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIscGFjX21vZGUiXSAKICAgICAgc2V0IHZhbGlkICJyZWFkX29ubHkgaW50ZXJmYWNlIGFsbCIKCiAgICAgIGZvcmVhY2ggcGFjICRwYWNzIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhY19tb2RlKV19IHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YWxpZCAkdmFycyhwYWNfbW9kZSldID09IC0xfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFZhcmlhYmxlIHZhcnMocGFjX21vZGUpIGhhcyBpbGxlZ2FsIHZhbHVlXG4iCiAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVmFyaWFibGUgdmFycyhwYWNfbW9kZSkgaGFzIGlsbGVnYWwgdmFsdWUiCiAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNldCB2YWxpZCAiZGVmYXVsdCBwZXNzaW1pc3RpYyIKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzaV9hbmFseXNpc190eXBlKV19IHsKICAgICAgICAgaWYge1tsc2VhcmNoICR2YWxpZCAkdmFycyhzaV9hbmFseXNpc190eXBlKV0gPT0gLTF9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycyhzaV9hbmFseXNpc190eXBlKSBoYXMgaWxsZWdhbCB2YWx1ZVxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMoc2lfYW5hbHlzaXNfdHlwZSkgaGFzIGlsbGVnYWwgdmFsdWUiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgICAgfQogICAgICB9CgogICAgICBzZXQgdmFsaWQgInBvc3RfY3RzIHBvc3Rfcm91dGUgYm90aCBub25lIgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2VjbyldfSB7CiAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFsaWQgJHZhcnMoY2xvY2tfZWNvKV0gPT0gLTF9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycyhjbG9ja19lY28pIGhhcyBpbGxlZ2FsIHZhbHVlXG4iCiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVmFyaWFibGUgdmFycyhjbG9ja19lY28pIGhhcyBpbGxlZ2FsIHZhbHVlIgogICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgIE11c3QgYmUgb25lIG9mICckdmFsaWQnXG4iCiAgICAgICAgIH0KICAgICAgfQojICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiVXNpbmcgdmFycyhlbmFibGVfZmxleGlsbSkgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBsaW1pdGVkIGFjY2VzcyBmZWF0dXJlIDogZW5jRmxleElMTSIKIyAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAojICAgICAgICAgaWYgeyR2YXJzKHBsYWNlX29wdF9kZXNpZ24pfSB7CiMgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJTZXR0aW5nIHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikgdG8gJ2ZhbHNlJyBhcyB2YXJzKGVuYWJsZV9mbGV4aWxtKSBpcyB0cnVlIgojICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiMgICAgICAgICAgICBzZXQgdmFycyhwbGFjZV9vcHRfZGVzaWduKSBmYWxzZQojICAgICAgICAgfQojICAgICAgfQogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgVGhlIHJkYV9JbnB1dCh1aV9wZ19jb25uZWN0aW9ucykgdmFyaWFibGUgaXMgYSBzcGVjaWFsIGNhc2UgYXMgZGVwZW5kaW5nCiAgICMgb24gdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUsIG90aGVyICd1c2VyIGRlZmluZWQnIHZhcmlhYmxlcyBtdXN0IGJlCiAgICMgZHluYW1pY2FsbHkgY2hlY2tlZAogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICNpZiB7W2luZm8gZXhpc3RzIHZhcnMocGdfY29ubmVjdGlvbnMpXX0gewogICAjICAgZm9yZWFjaCBvcHRpb24gJHZhcnMocGdfY29ubmVjdGlvbnMpIHsKICAgIyAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJG9wdGlvbildfSB7CiAgICMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBUaGUgcC9nIGNvbm5lY3Rpb24gZGVmaW5pdGlvbiBpcyBpbmNvbXBsZXRlIgogICAjICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICAgICAgICAgUGxlYXNlIGFkZCAnc2V0IHZhcnMoJG9wdGlvbikgPGdsb2JhbF9uZXQ+JyB0byB5b3VyIHNldHVwLnRjbCIKICAgIyAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVGhlIHAvZyBjb25uZWN0aW9uIGRlZmluaXRpb24gaXMgaW5jb21wbGV0ZTsgdmFyaWFibGUgdmFycygkb3B0aW9uKSBpcyByZXF1aXJlZCIKICAgIyAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgIyAgICAgIH0KICAgIyAgIH0KICAgI30KCiAgICAgIHNldCBjaGVjayhwbHVnaW5zKSBbbGlzdF0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG1ldGFsZmlsbCldICYmICgkdmFycyhtZXRhbGZpbGwpICE9IGZhbHNlKX0gewogICAgICAgICBzZXQgY2hlY2socGx1Z2lucykgbWV0YWxmaWxsX3RjbAogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgUGx1Zy1pbnNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIHNldCByY19wbHVnaW5zICJzeW5faW5pdF90Y2wgc3luX2xvYWRfcnRsX3RjbCBwcmVfc3luX2xvYWRfbGliX3RjbCBwb3N0X3N5bl9sb2FkX2xpYl90Y2wgXAogICAgICAgICAgICAgICAgICAgICAgcHJlX3N5bl9lbGFiX3RjbCBwb3N0X3N5bl9lbGFiX3RjbCBzeW5fZGZ0X3NldHVwX3RjbCBwcmVfc3luX2dlbl90Y2wgXAogICAgICAgICAgICAgICAgICAgICAgcG9zdF9zeW5fZ2VuX3RjbCBwcmVfc3luX21hcF90Y2wgcG9zdF9zeW5fbWFwX3RjbCBwb3N0X3N5bl9kZnRfdGNsIFwKICAgICAgICAgICAgICAgICAgICAgIHByZV9zeW5faW5jcl90Y2wgcG9zdF9zeW5faW5jcl90Y2wgcHJlX3N5bl9wbGFjZV90Y2wgcG9zdGxvYWRfc3luX3BsYWNlX3RjbCBcCiAgICAgICAgICAgICAgICAgICAgICBwcmVleHBvcnRfc3luX3BsYWNlX3RjbCBwcmVhbm5vdGF0aW9uX3N5bl9wbGFjZV90Y2wgcG9zdF9zeW5fcGxhY2VfdGNsIHByZV9zeW5fZXhpdF90Y2wiCiAgICAgIHNldCBlZGlfcGx1Z2lucyAiYWx3YXlzX3NvdXJjZV90Y2wgcHJlX2luaXRfdGNsIHBvc3RfaW5pdF90Y2wgXAogICAgICAgICAgICAgICAgICAgICAgIHByZV9wbGFjZV90Y2wgcGxhY2VfdGNsIHBvc3RfcGxhY2VfdGNsIHByZV9jdHNfdGNsIGN0c190Y2wgcG9zdF9jdHNfdGNsIFwKICAgICAgICAgICAgICAgICAgICAgICBwcmVfcHJlY3RzX3RjbCBwb3N0X3ByZWN0c190Y2wgcHJlX3Bvc3RjdHNfdGNsIHBvc3RfcG9zdGN0c190Y2wgXAogICAgICAgICAgICAgICAgICAgICAgIHByZV9wb3N0Y3RzX2hvbGRfdGNsIHBvc3RfcG9zdGN0c19ob2xkX3RjbCBwcmVfcm91dGVfdGNsIHBvc3Rfcm91dGVfdGNsIFwKICAgICAgICAgICAgICAgICAgICAgICBwcmVfcG9zdHJvdXRlX3RjbCBwb3N0X3Bvc3Ryb3V0ZV90Y2wgcHJlX3Bvc3Ryb3V0ZV9ob2xkX3RjbCBwb3N0X3Bvc3Ryb3V0ZV9ob2xkX3RjbCBcCiAgICAgICAgICAgICAgICAgICAgICAgcHJlX3Bvc3Ryb3V0ZV9zaV90Y2wgcG9zdF9wb3N0cm91dGVfc2lfdGNsIHByZV9wb3N0cm91dGVfc2lfaG9sZF90Y2wgCiAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wb3N0cm91dGVfc2lfaG9sZF90Y2wgcHJlX3NpZ25vZmZfdGNsIHBvc3Rfc2lnbm9mZl90Y2wgXAogICAgICAgICAgICAgICAgICAgICAgIHByZV9yZWJ1ZGdldF90Y2wgcG9zdF9yZWJ1ZGdldF90Y2wgcHJlX2ZsZXhpbG1fdGNsIHBvc3RfZmxleGlsbV90Y2wgXAogICAgICAgICAgICAgICAgICAgICAgIHByZV9hc3NlbWJsZV90Y2wgcG9zdF9hc3NlbWJsZV90Y2wgcHJlX21vZGVsX2dlbl90Y2wgcG9zdF9tb2RlbF9nZW5fdGNsIFwKICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFydGl0aW9uX3BsYWNlX3RjbCBwb3N0X3BhcnRpdGlvbl9wbGFjZV90Y2wgcHJlX2Fzc2VtYmxlX2ZsZXhfaWxtX3RjbCBwb3N0X2Fzc2VtYmxlX2ZsZXhpbG1fdGNsIFwKICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFydGl0aW9uX3RjbCBwb3N0X3BhcnRpdGlvbl90Y2wiCiAgICAgICAKICAgICAgc2V0IHZhcnMocmNfcGx1Z2lucykgJHJjX3BsdWdpbnMgCiAgICAgIHNldCB2YXJzKGVkaV9wbHVnaW5zKSAkZWRpX3BsdWdpbnMgCiAgICAgICAKICAgICAgaWYgeyR2YXJzKHJjKX0gewogICAgICAgICBzZXQgcGx1Z2luX2xpc3QgW2pvaW4gW2NvbmNhdCAkcmNfcGx1Z2lucyAkZWRpX3BsdWdpbnNdXQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgcGx1Z2luX2xpc3QgJGVkaV9wbHVnaW5zCiAgICAgIH0KICAgICAgZm9yZWFjaCBwbHVnaW4gJHBsdWdpbl9saXN0IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwbHVnaW4pXSAmJiAoJHZhcnMoJHBsdWdpbikgIT0gIiIpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogUGx1Zy1pbiAkcGx1Z2luID0gJHZhcnMoJHBsdWdpbilcbiIKICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhwbHVnaW5zKSAkcGx1Z2luCiAgICAgICAgICAgIGxhcHBlbmQgdmFycyhwbHVnaW5zX2RlZmluZWQpICRwbHVnaW4gCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHZhcnMobm92dXMpICYmIFtpbmZvIGV4aXN0cyB2YXJzKHBsdWdpbnNfZGVmaW5lZCldfSB7CiAgICAgICAgIEZGX05PVlVTOjpjb252ZXJ0X3BsdWdpbnMKICAgICAgfQoKICAgICAgc2V0IGRpc3QobHNmKSAicXVldWUgcmVzb3VyY2UgYXJncyIKICAgICAgc2V0IGRpc3QoY3VzdG9tKSAic2NyaXB0IgogICAgICBzZXQgZGlzdChyc2gpICJob3N0X2xpc3QiCiAgICAgIHNldCBkaXN0KGxvY2FsKSAiIgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRpc3RyaWJ1dGUpXX0gewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIGRpc3QoJHZhcnMoZGlzdHJpYnV0ZSkpXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uIFNldHVwXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IE1vZGUgPSAkdmFycyhkaXN0cmlidXRlKVxuIgogICAgICAgICAgICBmb3JlYWNoIG9wdGlvbiAkZGlzdCgkdmFycyhkaXN0cmlidXRlKSkgewogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRpc3RyaWJ1dGUpLCRvcHRpb24pXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCR2YXJzKGRpc3RyaWJ1dGUpLCRvcHRpb24pIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycygkdmFycyhkaXN0cmlidXRlKSwkb3B0aW9uKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRvcHRpb24gPSAkdmFycygkdmFycyhkaXN0cmlidXRlKSwkb3B0aW9uKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogRGlzdHJpYnV0aW9uIG1vZGUgJHZhcnMoZGlzdHJpYnV0ZSkgbm90IHN1cHBvcnRlZFxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIkRpc3RyaWJ1dGlvbiBtb2RlICR2YXJzKGRpc3RyaWJ1dGUpIG5vdCBzdXBwb3J0ZWQiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaG9zdHMpXSAmJiAoJHZhcnMoaG9zdHMpID4gMSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjV0FSTklORzogVmFyaWFibGUgdmFycyhob3N0cykgPiAxIGJ1dCB2YXJzKGRpc3RyaWJ1dGUpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlZhcmlhYmxlIHZhcnMoaG9zdHMpID4gMSBidXQgdmFycyhkaXN0cmlidXRlKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgIFR5cGUgQ2hlY2tcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGZvcmVhY2ggaW50ZWdlciAkY2hlY2soaW50ZWdlcnMpIHsKICAgICAgICAgaWYgeyFbc3RyaW5nIGlzIGludGVnZXIgLXN0cmljdCAkdmFycygkaW50ZWdlcildfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFZhcmlhYmxlcyBpcyBub3QgYW4gaW50ZWdlciAoJGludGVnZXIpIC4uLlxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlcyBpcyBub3QgYW4gaW50ZWdlciAoJGludGVnZXIpIC4uLiIKICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICB9CiAgICAgIH0gCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICBGaWxlIENoZWNrXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBzZXQgZmlsZXMgMAogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IENoZWNraW5nIGRlc2lnbiBmaWxlcyAuLi5cbiIKICAgICAgZm9yZWFjaCBmaWxlICRjaGVjayhmaWxlcykgewogICAjICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkZmlsZSAuLi5cbiIKICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IEZpbGUgZG9lcyBub3QgZXhpc3QgKCRmaWxlKSAuLi5cbiIKICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJGaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW5jciBmaWxlcwogICAgICAgICB9CiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAuLi4gZm91bmQgJGZpbGVzIGZpbGVzXG4iCiAgICAgIHNldCBmaWxlcyAwCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogQ2hlY2tpbmcgTEVGIGZpbGVzIC4uLlxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobGVmX2ZpbGVzKV19IHsKICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGxlZl9maWxlcykgewogICAgICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogRmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpXG4iCiAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiRmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpIgogICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGluY3IgZmlsZXMKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgLi4uIGZvdW5kICgkZmlsZXMvW2xsZW5ndGggJHZhcnMobGVmX2ZpbGVzKV0pIGxlZiBmaWxlc1xuIgogICAgICB9CiAgICAgIHNldCBmaWxlcyAwCiAgICAgIHNldCB0b3RhbCAwCiMgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewojICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogQ2hlY2tpbmcgbGlicmFyeSBzZXRzIC4uLlxuIgogICAgICAgICBmb3JlYWNoIGxpYnJhcnlfc2V0ICR2YXJzKGxpYnJhcnlfc2V0cykgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX2xkYildICYmICR2YXJzKGVuYWJsZV9sZGIpfSB7CiAgICAgICAgICAgICAgIHNldCB0ZW1wX2xpc3QgJHZhcnMoJGxpYnJhcnlfc2V0LHRpbWluZyxvcmlnKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdGVtcF9saXN0ICR2YXJzKCRsaWJyYXJ5X3NldCx0aW1pbmcpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR0ZW1wX2xpc3QgewogICAgICAgICAgICAgICBpbmNyIHRvdGFsCiAgICAgICAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICRmaWxlXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBGaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSlcbiIKIyAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiRmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpIgojICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpbmNyIGZpbGVzCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRsaWJyYXJ5X3NldCxzaSldfSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkbGlicmFyeV9zZXQsc2kpIHsKICAgICAgICAgICAgICAgICAgaW5jciB0b3RhbAogICAgICAgICAgICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBDREIgZmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpXG4iCiMgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJDREIgZmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpIgojICAgICAgICAgICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGluY3IgZmlsZXMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHshJHZhcnMoZW5hYmxlX3NpX2F3YXJlKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IENEQiBsaWJyYXJpZXMgbm90IGRlZmluZWQgZm9yICRsaWJyYXJ5X3NldCBsaWJyYXJ5IHNldFxuIgogICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJDREIgbGlicmFyaWVzIG5vdCBkZWZpbmVkIGZvciAkbGlicmFyeV9zZXQgbGlicmFyeSBzZXQiCiAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIC4uLiBmb3VuZCAoJGZpbGVzLyR0b3RhbCkgbGlicmFyeSBmaWxlc1xuIgogICAgICAgICBpZiB7JHRvdGFsICE9ICRmaWxlc30gewogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIltleHByICR0b3RhbCAtICRmaWxlc10gdGltaW5nIGxpYnJhcnkgZmlsZXMgd2VyZSBub3QgZm91bmQgIgogICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIH0KICAgICAgICAgc2V0IGZpbGVzIDAKIyAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBDaGVja2luZyByYyBjb3JuZXJzIC4uLlxuIgogICAgICAgICBmb3JlYWNoIGZpbGUgJGNoZWNrKHJjX2Nvcm5lcnMpIHsKICAgICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IEZpbGUgZG9lcyBub3QgZXhpc3QgKCRmaWxlKVxuIgogICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIkZpbGUgZG9lcyBub3QgZXhpc3QgKCRmaWxlKSIKICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpbmNyIGZpbGVzCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIC4uLiBmb3VuZCAkZmlsZXMgZmlsZXNcbiIKICAgICAgICAgc2V0IGZpbGVzIDAKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBDaGVja2luZyBjb25zdHJhaW50IG1vZGVzIC4uLlxuIgogICAgICAgICBmb3JlYWNoIGZpbGVfbGlzdCAkY2hlY2soY29uc3RyYWludF9tb2RlcykgewogICAgICAgICAgICBmb3JlYWNoIGZpbGUgJGZpbGVfbGlzdCB7CiAgICAgICAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICRmaWxlXX0gewogICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gfHwgKFtpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgISR2YXJzKGNwZl90aW1pbmcpKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBGaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJGaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpbmNyIGZpbGVzCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiMgICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgLi4uIGZvdW5kICRmaWxlcyBmaWxlc1xuIgogICAgICBzZXQgZmlsZXMgMAogICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBDaGVja2luZyBwbHVnaW4gZmlsZXMgLi4uXG4iCiAgICAgIGZvcmVhY2ggcGx1ZyAkY2hlY2socGx1Z2lucykgewogICAgICAgICBzZXQgZmlsZSAkdmFycygkcGx1ZykKICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdICYmICFbZmlsZSBleGlzdHMgJHZhcnMocGx1Z19kaXIpLyRmaWxlXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IEZpbGUgZG9lcyBub3QgZXhpc3QgKCRmaWxlKSAuLi4gY29udGludWluZ1xuIgogICAgICAgICAgICBsYXBwZW5kIHZhcnMobWlzc2luZ19wbHVnaW5zKSAkcGx1ZyAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGFwcGVuZCB2YXJzKHBsdWdpbnNfZm91bmQpICRwbHVnIAogICAgICAgICAgICBpbmNyIGZpbGVzCiAgICAgICAgICAgIGlmIHshJHZhcnMoZW5hYmxlX2NlbHRpY19zdGVwcyl9IHsgCiAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJwb3N0cm91dGVfc2kiICRwbHVnXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJQbHVnLWluICRwbHVnIHdpbGwgYmUgc2tpcHBlZCBmb3Igc2lBd2FyZSBmbG93IgogICAgICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBQbHVnLWluICRwbHVnIHdpbGwgYmUgc2tpcHBlZCBmb3Igc2lBd2FyZSBmbG93XG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgVG8gZW5hYmxlIGNlbHRpYyBiYXNlZCBTSSBmbG93LCB1c2UgdmFycyhlbmFibGVfY2VsdGljX3N0ZXBzKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgLi4uIGZvdW5kICRmaWxlcyBmaWxlc1xuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgIEZsb3cgT3B0aW9uc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldfSB7CiAgICAgICAgIHNldCBmbG93IGhpZXJhcmNoaWNhbAogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgZmxvdyBmbGF0CiAgICAgIH0KICAgICAgc2V0IHZhbGlkIFtsaXN0IG5vbmUgZGVmYXVsdCBzdGFuZGFyZCBleHByZXNzIGV4dHJlbWVdCiAgICAgIGlmIHtbbHNlYXJjaCAkdmFsaWQgW3N0cmluZyB0b2xvd2VyICR2YXJzKGZsb3dfZWZmb3J0KV1dID09IC0xfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFZhcmlhYmxlIHZhcnMoZmxvd19lZmZvcnQpIGhhcyBpbGxlZ2FsIHZhbHVlICR2YXJzKGZsb3dfZWZmb3J0KVxuIgogICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMoZmxvd19lZmZvcnQpIGhhcyBpbGxlZ2FsIHZhbHVlICR2YXJzKGZsb3dfZWZmb3J0KSIKICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBNdXN0IGJlIG9uZSBvZiAnJHZhbGlkJ1xuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgICAgRmxvdyA9ICRmbG93XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgIEZsYXZvciA9ICR2YXJzKGZsb3cpXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgIEVmZm9ydCA9ICR2YXJzKGZsb3dfZWZmb3J0KVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgICAgUGxhY2VtZW50IE9wdGlvbnNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGxhY2Vfb3B0X2Rlc2lnbildfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgUGxhY2UgT3B0IERlc2lnbiA9ICR2YXJzKHBsYWNlX29wdF9kZXNpZ24pXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGluX3BsYWNlX29wdCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgIEluIFBsYWNlIE9wdCA9ICR2YXJzKGluX3BsYWNlX29wdClcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobm9fcHJlX3BsYWNlX29wdCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgIE5vIFByZVBsYWNlIE9wdCA9ICR2YXJzKG5vX3ByZV9wbGFjZV9vcHQpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBsYWNlX2lvX3BpbnMpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgIFBsYWNlIElPIFBpbnMgPSAkdmFycyhwbGFjZV9pb19waW5zKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19nYXRlX2F3YXJlKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICBDbG9jayBHYXRlIEF3YXJlID0gJHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZSlcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY29uZ2VzdGlvbl9lZmZvcnQpXX0gewogICAgICAgICBpZiB7JHZhcnMoY29uZ2VzdGlvbl9lZmZvcnQpID09ICJub25lIn0gewogICAgICAgICAgICB1bnNldCB2YXJzKGNvbmdlc3Rpb25fZWZmb3J0KSAgCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICBDb25nZXN0aW9uIEVmZm9ydCA9ICR2YXJzKGNvbmdlc3Rpb25fZWZmb3J0KVxuIgogICAgICAgICB9CiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgQ2xvY2sgVHJlZSBPcHRpb25zXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICBSb3V0ZSBDbG9jayBOZXRzID0gJHZhcnMocm91dGVfY2xvY2tfbmV0cylcbiIKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2VjbyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgIENsb2NrIEVDTyA9ICR2YXJzKGNsb2NrX2VjbylcbiIKICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uIE9wdGlvbnNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobGVha2FnZV9lZmZvcnQpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgTGVha2FnZSBFZmZvcnQgPSAkdmFycyhsZWFrYWdlX2VmZm9ydClcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocHJlc2VydmVfYXNzZXJ0aW9ucyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgUHJlc2VydmUgQXNzZXJ0aW9ucyA9ICR2YXJzKHByZXNlcnZlX2Fzc2VydGlvbnMpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVzZWZ1bF9za2V3KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgIFVzZWZ1bCBTa2V3ID0gJHZhcnModXNlZnVsX3NrZXcpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNyaXRpY2FsX3JhbmdlKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgIENyaXRpY2FsIFJhbmdlID0gJHZhcnMoY3JpdGljYWxfcmFuZ2UpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFsbF9lbmRfcG9pbnRzKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgIEFsbCBFbmQgUG9pbnRzID0gJHZhcnMoYWxsX2VuZF9wb2ludHMpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNpemVfb25seV9maWxlKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgIFNpemUgT25seSBGaWxlID0gJHZhcnMoc2l6ZV9vbmx5X2ZpbGUpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRvbnRfdXNlX2ZpbGUpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgRG9uJ3QgVXNlIEZpbGUgPSAkdmFycyhkb250X3VzZV9maWxlKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhza2V3X2J1ZmZlcnMpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICBTa2V3IEJ1ZmZlcnMgPSAkdmFycyhza2V3X2J1ZmZlcnMpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9wYWMpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgIEVuYWJsZSBQQUMgPSAkdmFycyhlbmFibGVfcGFjKVxuIgogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICBmb3JlYWNoIHBhYyAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhYyxwYWNfbW9kZSldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgICAkcGFjIC0+ICR2YXJzKCRwYWMscGFjX21vZGUpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICBIb2xkIEZpeGluZyBPcHRpb25zXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgIEZpeCBIb2xkID0gJHZhcnMoZml4X2hvbGQpXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmaXhfaG9sZF9lZmZvcnQpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBGaXggSG9sZCBFZmZvcnQgPSAkdmFycyhmaXhfaG9sZF9lZmZvcnQpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZpeF9ob2xkX2lnbm9yZV9pb3MpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgSWdub3JlIElPcyAgPSAkdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmaXhfaG9sZF9hbGxvd190bnNfZGVncmFkYXRpb24pXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICBBbGxvdyBUTlMgRGVncmFkYXRpb24gPSAkdmFycyhmaXhfaG9sZF9hbGxvd190bnNfZGVncmFkYXRpb24pXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgICBUaW1pbmcgT3B0aW9uc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICBFbmFibGUgQ1BQUiA9ICR2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgIEVuYWJsZSBPQ1YgPSAkdmFycyhlbmFibGVfb2N2KVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgRW5hYmxlIEFPQ1YgPSAkdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgIEVuYWJsZSBTT0NWID0gJHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgIEVuYWJsZSBTUyA9ICR2YXJzKGVuYWJsZV9zcylcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgIFJvdXRpbmcgT3B0aW9uc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh0cmFja19vcHQpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgSW4gUm91dGUgT3B0aW1pemF0aW9uID0gJHZhcnModHJhY2tfb3B0KVxuIgojICAgICAgICAgaWYgeyR2YXJzKHRyYWNrX29wdCl9IHsKIyAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9zaV9hd2FyZSkgdHJ1ZQojICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0cXVhbnR1c19maWxlKV19IHsKIyAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAidFF1YW50dXMgZmlsZSAtIHZhcnModHF1YW50dXNfZmlsZSkgLSByZXF1aXJlZCB3aGVuIHZhcnModHJhY2tfb3B0KSBzZXQgdG8gdHJ1ZSIKIyAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobXVsdGlfY3V0X2VmZm9ydCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgTXVsdGktQ3V0IEVmZm9ydCA9ICR2YXJzKG11bHRpX2N1dF9lZmZvcnQpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGxpdGhvX2RyaXZlbl9yb3V0aW5nKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgIExpdGhvIERyaXZlbiBSb3V0aW5nID0gJHZhcnMobGl0aG9fZHJpdmVuX3JvdXRpbmcpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFudGVubmFfZGlvZGUpXSAmJiAoJHZhcnMoYW50ZW5uYV9kaW9kZSkgIT0gIiIpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgQW50ZW5uYSBEaW9kZSA9ICR2YXJzKGFudGVubmFfZGlvZGUpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKV0gfHwgXAogICAgICAgICAgW2luZm8gZXhpc3RzIHZhcnModG90YWxfY190aHJlc2gpXSB8fCBcCiAgICAgICAgICBbaW5mbyBleGlzdHMgdmFycyhjb3VwbGluZ19jX3RocmVzaCldIHx8XAogICAgICAgICAgW2luZm8gZXhpc3RzIHZhcnMocG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0KV0gfHxcCiAgICAgICAgICBbaW5mbyBleGlzdHMgdmFycyhzaWdub2ZmX2V4dHJhY3Rpb25fZWZmb3J0KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgRXh0cmFjdGlvbiBPcHRpb25zXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgUmVsYXRpdmUgQyBUaHJlc2hvbGQgPSAkdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModG90YWxfY190aHJlc2gpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgVG90YWwgQyBUaHJlc2hvbGQgPSAkdmFycyh0b3RhbF9jX3RocmVzaClcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY291cGxpbmdfY190aHJlc2gpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgQ291cGxpbmcgQyBUaHJlc2hvbGQgPSAkdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBQb3N0cm91dGUgRWZmb3J0IExldmVsID0gJHZhcnMocG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0KVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzaWdub2ZmX2V4dHJhY3Rpb25fZWZmb3J0KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgIFNpZ25vZmYgRWZmb3J0IExldmVsID0gJHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgICAgICBERk0gT3B0aW9uc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIHNldCBjaGVja19scGFfdGVjaCAwCiAgICAgIHNldCBjaGVja19scGFfY29uZiAwCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmaXhfbGl0aG8pXSAmJiAkdmFycyhmaXhfbGl0aG8pfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgIEZpeCBMaXRobyA9ICR2YXJzKGZpeF9saXRobylcbiIKICAgICAgICAgc2V0IGNoZWNrX2xwYV9jb25mIDEKICAgICAgICAgc2V0IHZhcnModmVyaWZ5X2xpdGhvKSB0cnVlCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHZlcmlmeV9saXRobyldICYmICR2YXJzKHZlcmlmeV9saXRobyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgVmVyaWZ5IExpdGhvID0gJHZhcnModmVyaWZ5X2xpdGhvKVxuIgogICAgICAgICBzZXQgY2hlY2tfbHBhX3RlY2ggMQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhscGFfdGVjaF9maWxlKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICBMUEEgVGVjaCBGaWxlID0gJHZhcnMobHBhX3RlY2hfZmlsZSlcbiIKICAgICAgfSAKICAgICAgaWYgeyRjaGVja19scGFfdGVjaH0geyAKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhscGFfdGVjaF9maWxlKV19IHsKICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJMUEEgdGVjaCBmaWxlIG5vdCBkZWZpbmVkIC4uLiIKICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGxwYV9jb25mX2ZpbGUpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgIExQQSBDb25mIEZpbGUgPSAkdmFycyhscGFfY29uZl9maWxlKVxuIgogICAgICB9CiAgICAgIGlmIHskY2hlY2tfbHBhX2NvbmZ9IHsgCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobHBhX2NvbmZfZmlsZSldfSB7CiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiTFBBIGNvbmYgZmlsZSBub3QgZGVmaW5lZCAuLi4iCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgIFNpZ25hbCBJbnRlZ3JpdHkgT3B0aW9uc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgUHJvY2VzcyA9ICR2YXJzKHByb2Nlc3MpXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWx0YV9kZWxheV90aHJlc2hvbGQpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICBEZWx0YSBEZWxheSBUaHJlc2hvbGQgPSAkdmFycyhkZWx0YV9kZWxheV90aHJlc2hvbGQpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNlbHRpY19zZXR0aW5ncyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgIENlbHRpYyBTZXR0aW5ncyA9ICR2YXJzKGNlbHRpY19zZXR0aW5ncylcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2lfYW5hbHlzaXNfdHlwZSldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgQW5hbHlzaXMgVHlwZSA9ICR2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFjY2VwdGFibGVfd25zKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICBBbmFseXNpcyBUeXBlID0gJHZhcnMoYWNjZXB0YWJsZV93bnMpXG4iCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkaXN0cmlidXRlKV19IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkaXN0KCR2YXJzKGRpc3RyaWJ1dGUpKV19IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgQ1BVc1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgICAgTW9kZSA9ICR2YXJzKGRpc3RyaWJ1dGUpXG4iCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhsb2NhbF9jcHVzKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgQ1BVcyBPbiBMb2NhbCBIb3N0ID0gJHZhcnMobG9jYWxfY3B1cylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocmVtb3RlX2hvc3RzKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBOdW1iZXIgb2YgUmVtb3RlIEhvc3RzID0gJHZhcnMocmVtb3RlX2hvc3RzKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcHVzX3Blcl9yZW1vdGVfaG9zdCldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICBDUFVzIFBlciBSZW1vdGUgSG9zdCA9ICR2YXJzKGNwdXNfcGVyX3JlbW90ZV9ob3N0KVxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGxvY2FsX2NwdXMpXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBDUFVzXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgQ1BVcyBPbiBMb2NhbCBIb3N0ID0gJHZhcnMobG9jYWxfY3B1cylcbiIKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHskdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpfSB7CiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE1fSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgIDw8PCBISUdIIEVGRk9SVCBGTE9XIEVOQUJMRUQgPj4+XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBWYXJpYWJsZSB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydCkgbm90IHN1cHBvcnRlZCBhbnltb3JlLiBQbGVhc2UgdXNlIHZhcnMoZmxvd19lZmZvcnQpLlxuIgogICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJWYXJpYWJsZSB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydCkgbm90IHN1cHBvcnRlZCBhbnltb3JlLiBQbGVhc2UgdXNlIHZhcnMoZmxvd19lZmZvcnQpLiIKICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgQWJvcnQgb24gU2V0dXAgRXJyb3IgPSAkdmFycyhhYm9ydClcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHNhdmVfdmFyc10gewogICAgICAgICAgICBzZXQgdmFycygkdmFyKSAkc2F2ZV92YXJzKCR2YXIpCiAgICAgICAgIH0KICAgICAgfQogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBzZXQgdmFycyhpbmZvX2NvdW50KSAkaW5mb19jb3VudAogICAgICBpZiB7JGluZm9fY291bnQgPiAwfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgICAgICAgICAgICAgICAgICBJbmZvIFN1bW1hcnlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgogICAgICAgICBmb3Ige3NldCBpIDB9IHskaTwkaW5mb19jb3VudH0ge2luY3IgaX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgKFtleHByICRpICsgMV0pICRpbmZvcygkaSlcbiIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICB9CiAgICAgIHNldCB2YXJzKHdhcm5pbmdfY291bnQpICR3YXJuaW5nX2NvdW50CiAgICAgIGlmIHskd2FybmluZ19jb3VudCA+IDB9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAgICAgICAgICAgICAgICAgIFdhcm5pbmcgU3VtbWFyeVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCiAgICAgICAgIGZvciB7c2V0IGkgMH0geyRpPCR3YXJuaW5nX2NvdW50fSB7aW5jciBpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAoW2V4cHIgJGkgKyAxXSkgJHdhcm5pbmdzKCRpKVxuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCiAgICAgIH0KICAgICAgc2V0IHZhcnMoZXJyb3JfY291bnQpICRlcnJvcl9jb3VudAogICAgICBpZiB7JGVycm9yX2NvdW50ID4gMH0gewogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgICAgICAgICAgICAgICAgICAgIEVycm9yIFN1bW1hcnlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgogICAgICAgICBmb3Ige3NldCBpIDB9IHskaTwkZXJyb3JfY291bnR9IHtpbmNyIGl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIChbZXhwciAkaSArIDFdKSAkZXJyb3JzKCRpKVxuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCgogICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgU0VUVVAgQ0hFQ0sgUEFTU0VEXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgfQoKICAgICAgZmlsZSBta2RpciAkdmFycyhzY3JpcHRfZGlyKQogICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvY2hlY2sucnB0IHddCiMgICAgICBpZiB7JHZhcnMobm92dXMpfSB7CiMgICAgICAgICBGRl9OT1ZVUzo6ZHVtcF9ub3Z1c19hdHRyaWJ1dGVzCiMgICAgICB9CgogICAgICBwdXRzICRvcCAkY29tbWFuZHMKCiAgICAgIGNsb3NlICRvcAoKICAgICAgaWYgeyR2YXJzKGFib3J0KSAmJiAoJGVycm9yX2NvdW50ID4gMCl9IHsKICAgICAgICAgcHV0cyAiPEZGPiBBYm9ydGluZyBkdWUgdG8gcHJldmlvdXMgZXJyb3JzIC4uLiIKICAgICAgICAgcHV0cyAiPEZGPiBTZWUgJHZhcnMoc2NyaXB0X2RpcikvY2hlY2sucnB0IGZvciBkZXRhaWxzIgogICAgICAgICBwdXRzICIiCiAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgICAgIEVycm9yIFN1bW1hcnkiCiAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0iCgogICAgICAgICBmb3Ige3NldCBpIDB9IHskaTwkZXJyb3JfY291bnR9IHtpbmNyIGl9IHsKICAgICAgICAgICAgcHV0cyAiICAgKFtleHByICRpICsgMV0pICRlcnJvcnMoJGkpIgogICAgICAgICB9CiAgICAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgIGV4aXQgLTEKICAgICAgfQoKICAgICAgaWYgeyEkdmFycyhjb2RlZ2VuKX0gewogICAgICAgICBpZiB7IVtGRjo6aXNfbHBfZmxvd119IHsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIH0KICAgICAgICAgc2V0IHZhcnMocmVxdWlyZWRfcHJvY3MpICJnZXRfY2xvY2tfcG9ydHMgZ2V0X3Bvd2VyX2RvbWFpbnMgbW9kaWZ5X3Bvd2VyX2RvbWFpbnMgYWRkX3Bvd2VyX3N3aXRjaGVzIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZV9zZWNvbmRhcnlfcGdfbmV0cyBidWZmZXJfYWx3YXlzX29uX25ldHMgaW5zZXJ0X3dlbGx0YXBzX2VuZGNhcHMiCiAgICAgIH0KCiAgICAgIHNldCB2YXJzKGNoZWNrX3NldHVwKSAwCgogICAgICAjIFJlY29yZCBlcnJvcnMgZm9yIGxhdGVyIHByb2Nlc3NpbmcKICAgICAgc2V0IHZhcnMoY2hlY2tfc2V0dXBfZXJyb3JzKSB7fQogICAgICBmb3Ige3NldCBpIDB9IHskaTwkZXJyb3JfY291bnR9IHtpbmNyIGl9IHsKICAgICAgICAgbGFwcGVuZCB2YXJzKGNoZWNrX3NldHVwX2Vycm9ycykgJGVycm9ycygkaSkKICAgICAgfQogICB9CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgUHJvY2VkdXJlIHRvIGRldGVybWluZSBmbG93IGZsYXZvciwgY2hlY2sgZm9yIGlsbXMsIGV0Yy4KICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgcHJvYyBjaGVja19mbG93IHt9IHsKICAgCiAgICAgIGdsb2JhbCB2YXJzCiAgIAogICAgICBzZXQgdmFycyhpbG0pIDAKICAgICAgc2V0IHZhcnModG9wKSAwCiAgIAogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0gfHwgKFtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0gJiYgXAogICAgICAgICAgIChbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSAhPSAiJHZhcnMocGFydGl0aW9uX2RpcikiKSl9IHsKCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICBzZXQgdmFycyhmbGF2b3IpIGZsYXQKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhtb2RlKV19IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMobW9kZSkgImZsYXQiCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnMoZmxhdm9yKSBoaWVyCiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobW9kZSldfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKG1vZGUpICJ0b3BfZG93biIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmICgkdmFycyhtb2RlKSA9PSAiYm90dG9tX3VwIil9IHsKICAgICAgICAgICAgc2V0IHZhcnMoaWxtKSAxCiAgICAgICAgIH0KICAgCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbGlzdCldICYmICgkdmFycyhpbG1fbGlzdCkgIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGlsbSkgMQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhpbG0pIDAKICAgICAgICAgfQogICAKICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgICAgc2V0IHB0biBbZmlsZSB0YWlsIFtwd2RdXQogICAgICAgICAgICBzZXQgdmFycyhwdG4pICRwdG4KICAgICAgICAgICAgaWYgeyhbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikiKSAmJgogICAgICAgICAgICAgICAgKFtsc2VhcmNoICR2YXJzKHBhcnRpdGlvbl9saXN0KSAkcHRuXSA9PSAtMSl9IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoaWxtKSAxCiAgICAgICAgICAgICAgIHNldCB2YXJzKHRvcCkgMQojICAgICAgICAgICAgICAgRkZfTk9WVVM6Om5vcm1hbGl6ZV9jb25zdHJhaW50cwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHZhcnMoZGVidWcpfSB7CiAgICAgICAgIHB1dHMgIjxERUJVRz4gRmxvdyAtPiAkdmFycyhmbGF2b3IpIDogU3RlcCAtPiAkdmFycyhzdGVwKSA6IElMTSAtPiAkdmFycyhpbG0pIgogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX2NvbXBpbGUge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUwogICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy9ydW5fY29tcGlsZS50Y2wgd10KCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhsZGJfZGlyKV19IHsKICAgICAgICAgc2V0IHZhcnMobGRiX2RpcikgTERCCiAgICAgIH0KICAgICAgZmlsZSBta2RpciAkdmFycyhsZGJfZGlyKQogICAgICBzZXQgZG9uZV9saXN0IFtsaXN0XQoKICAgICAgZm9yZWFjaCBzZXQgJHZhcnMobGlicmFyeV9zZXRzKSB7CiAgICAgICAgIHNldCBmaWxlX2xpc3QgW2xpc3RdCiAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkc2V0LHRpbWluZykgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGRvbmVfbGlzdCAkZmlsZV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ3cml0ZV9sZGIgLWxpYnJhcnkgJGZpbGUgLW91dGZpbGUgJHZhcnMobGRiX2RpcikvW2ZpbGUgdGFpbCAkZmlsZS5sZGJdXG4iCiAgICAgICAgICAgICAgIGxhcHBlbmQgZG9uZV9saXN0ICRmaWxlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFwcGVuZCBmaWxlX2xpc3QgJHZhcnMobGRiX2RpcikvW2ZpbGUgdGFpbCAkZmlsZV0ubGRiCiAgICAgICAgIH0KICAgICAgICAgc2V0IHZhcnMoJHNldCx0aW1pbmcsb3JpZykgJHZhcnMoJHNldCx0aW1pbmcpCiAgICAgICAgIHNldCB2YXJzKCRzZXQsdGltaW5nKSAkZmlsZV9saXN0CiAgICAgIH0KCiAgICAgIHB1dHMgJG9wICIkY29tbWFuZHNcbmV4aXRcbiIKICAgICAgY2xvc2UgJG9wCgogICAgICBzZXQgdmFycyhyYW5fY29tcGlsZSkgMQogICB9CgoKIyAgICMgR2VuZXJhdGUgdGhlIGNvbW1hbmQgdG8gdmVyaWZ5IGdlb21ldHJ5LiBUaGlzIGlzIHZlcmlmeUdlb21ldHJ5CiMgICAjIGZvciB0cmFkaXRpb25hbCBwcm9jZXNzZXMsIHZlcmlmeV9kcmMgZm9yIDIwbm0gYW5kIGJlbG93LgojICAgcHJvYyB2ZXJpZnlfZ2VvbWV0cnlfY29tbWFuZCB7fSB7CiMgICAgICBnbG9iYWwgdmFycwojICAgICAgc2V0IHByb2Nlc3MgW3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXQojICAgICAgaWYgeyRwcm9jZXNzID4gMjB9IHsKIyAgICAgICAgIHJldHVybiAidmVyaWZ5R2VvbWV0cnkiCiMgICAgICB9IGVsc2UgewojICAgICAgICAgcmV0dXJuICJ2ZXJpZnlfZHJjIgojICAgICAgfQojICAgfQoKCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBQcm9jZWR1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgZm91bmRhdGlvbiBmbG93IAogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICBwcm9jIGluaXRpYWxpemVfZmxvdyB7fSB7CiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgRkZfTk9WVVM6OnNlZWRfdmFyaWFibGVzIDEKICAgICAgRkZfTk9WVVM6OmNoZWNrX3NldHVwCgogICAgICBpZiB7W2luZm8gZXhpc3QgZW52KFZQQVRIKV19IHsKICAgICAgICAgZmlsZSBta2RpciAkZW52KFZQQVRIKQogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2FwdHVyZV9tZXRyaWNzKV0gJiYgJHZhcnMoY2FwdHVyZV9tZXRyaWNzKX0geyAKICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTR9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBMb2FkaW5nIGFwcGxldHMgZm9yIG1ldHJpY3MgY2FwdHVyZSAuLi5cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICBpZiB7W2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtleGVjIHB3ZF1dXSA9PSAkdmFycyhwYXJ0aXRpb25fZGlyKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkdmFycyhub3JtX3NjcmlwdF9wYXRoKS9FVEMvYXBwbGV0LnRjbFxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkdmFycyhub3JtX3NjcmlwdF9wYXRoKS9FVEMvY29tcGF0aWJpbGl0eS50Y2xcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgYXBwbGV0X3NlYXJjaF9wYXRoICR2YXJzKG5vcm1fc2NyaXB0X3BhdGgpL0VUQy9hcHBsZXRzXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic291cmNlIFwkdmFycyhzY3JpcHRfcGF0aCkvRVRDL2FwcGxldC50Y2xcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzb3VyY2UgXCR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvY29tcGF0aWJpbGl0eS50Y2xcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgYXBwbGV0X3NlYXJjaF9wYXRoIFwkdmFycyhzY3JpcHRfcGF0aCkvRVRDL2FwcGxldHNcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImFwcGxldCBsb2FkIG1lYXN1cmVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJhcHBsZXQgbG9hZCB0aW1lX2luZm9cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbZmlsZSBleGlzdHMgJHZhcnModGltZV9pbmZvX2RiKVxdfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgdGltZV9pbmZvIC1xdWlldCAtdGFibGUgZmZfZXh0IC1sb2FkICR2YXJzKHRpbWVfaW5mb19kYilcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIgogICAgICAgICB9CiAgICAgIH0KCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgUlVOIFNDUklQVCBGT1IgU1RFUCAnW3N0cmluZyB0b3VwcGVyICR2YXJzKHN0ZXApXSdcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBpZiB7JHZhcnMocmVwb3J0X3N5c3RlbV9pbmZvKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZmX3Byb2NzOjpzeXN0ZW1faW5mb1xuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OmluaXRpYWxpemVfbXVsdGljcHVdCgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgbG9hZF9kZXNpZ24ge3N0ZXAge2N1cnJlbnRfc3RlcCAiIn0ge2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCB3YXJuaW5ncwoKICAgICAgaWYge1tyZWdleHAgc3luXyAkc3RlcF19IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjdXJyZW50X3N0ZXAsc3RhcnRpbmdfZGJzKV19IHsKICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicyldfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX2RiICR2YXJzKCRjdXJyZW50X3N0ZXAsc3RhcnRpbmdfZGJzKSBcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBTdGFydGluZyBEQlMgKCR2YXJzKCRjdXJyZW50X3N0ZXAsc3RhcnRpbmdfZGJzKSkgZGVmaW5lZCBidXQgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX2RiICR2YXJzKCRjdXJyZW50X3N0ZXAsc3RhcnRpbmdfZGJzKSBcbiIKICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiU3RhcnRpbmcgREJTICgkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicykpIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9kYiAkdmFycyhkYnNfZGlyKS8kc3RlcC5kYlxuIgogICAgICAgICB9CiAgICAgICAgIHJldHVybiAiXG4kY29tbWFuZCIKICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhpZXIpXX0gewogICAgICAgICBzZXQgaGllciB0cnVlCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBoaWVyIGZhbHNlCiAgICAgIH0KCiAgICAgIGlmIHskY3VycmVudF9zdGVwID09ICIifSB7CiAgICAgICAgIHNldCBjdXJyZW50X3N0ZXAgJHN0ZXAKICAgICAgfQoKIyAgICAgIGlmIHskc3RlcCA9PSIifSB7CiMgICAgICAgICBzZXQgc3RlcCAkdmFycyhzdGVwKQojICAgICAgfQojICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzdGVwKV19IHsKIyAgICAgICAgIHNldCB2YXJzKHN0ZXApICRzdGVwCiMgICAgICB9CiAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgc2V0IHJlc3RvcmVfZGVzaWduIHRydWUKICAgICAgfQogICAgICBzZXQgZGVzaWduICR2YXJzKGRlc2lnbikKCiAgICAgICMgQnVpbGQgcmVzdG9yZV9kZXNpZ24gY29tbWFuZCBzdHJpbmcKICAgICAgIyAuLi4gY2hlY2sgZmlyc3QgZm9yIHN0YXJ0aW5nX2RicwogICAgICAjIC4uLiBpZiBub3Qgd2UgbmVlZCB0byBrbm93IHRoZSBkZXNpZ24gbmFtZSBhcyB0aGlzIG1heSBiZSBhIAogICAgICAjICAgICByZWN1cnNpdmUgY2FsbCBpbiBhIGhpZXJhcmhpY2FsIGZsb3cKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicyldfSB7CiAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAjIEludGVycHJldCB0aGUgc3RhcnRpbmcgREJTIGFzIGFuIE9BIHRyaXBsZQogICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJbbGlzdCByZWFkX2RiIC1jZWxsdmlldyAkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicyldXG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBpc2RpcmVjdG9yeSAkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicyldfSB7CiAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlYWRfZGIgJHZhcnMoJGN1cnJlbnRfc3RlcCxzdGFydGluZ19kYnMpIFxuIgogICAgICAgICAgICB9IGVsc2VpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKCRjdXJyZW50X3N0ZXAsc3RhcnRpbmdfZGJzKV19IHsKICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVhZF9kYiAkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicykgXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gU3RhcnRpbmcgREJTICgkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicykpIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJyZWFkX2RiICR2YXJzKCRjdXJyZW50X3N0ZXAsc3RhcnRpbmdfZGJzKSBcbiIKICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiU3RhcnRpbmcgREJTICgkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicykpIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCBhcm91bmQgdmFycyhkYnNfZGlyKSB0byByZXNvbHZlIHZhcnMocnVuZGlyKQogICAgICAgICBzZXQgZGlyIFtzdWJzdCAkdmFycyhkYnNfZGlyKV0KICAgICAgICAgIyBBZGRpbmcgdGhpcyBmb3IgUFYgLi4uCiAgICAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkZGlyLyRzdGVwLmVuY119IHsKICAgICAgICAgICAgICAgIyBCQ0w6IENoYW5nZWQgIkRCUyIgdG8gJGRpcgogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGZvbyBbZ2xvYiAkZGlyLyRzdGVwLmVuYy8qLmNvbmZdfV19IHsKICAgICAgICAgICAgICAgICAgIyBCQ0w6IENoYW5nZWQgIkRCUyIgdG8gJGRpcgogICAgICAgICAgICAgICAgICByZWdzdWIgIlxcXC5jb25mIiBbZ2xvYiAkZGlyLyRzdGVwLmVuYy8qLmNvbmZdICIiIHRlbXAKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgIyBCQ0w6IENoYW5nZWQgIkRCUyIgdG8gJGRpcgogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGZvbyBbZ2xvYiAkZGlyLyRzdGVwLmVuYy8qLmdsb2JhbHNdfV19IHsKICAgICAgICAgICAgICAgICAgICAgIyBCQ0w6IENoYW5nZWQgIkRCUyIgdG8gJGRpcgogICAgICAgICAgICAgICAgICAgICByZWdzdWIgIlxcXC5nbG9iYWxzIiBbZ2xvYiAkZGlyLyRzdGVwLmVuYy8qLmdsb2JhbHNdICIiIHRlbXAKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskZGVzaWduICE9IFtmaWxlIHRhaWwgJHRlbXBdfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGRlc2lnbikgW2ZpbGUgdGFpbCAkdGVtcF0KICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBVcGRhdGluZyBkZXNpZ24gbmFtZSB0byAkZGVzaWduIgogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpIFtmaWxlIHRhaWwgW3B3ZF1dXSAhPSAtMX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgZGVzaWduIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gU3RhcnRpbmcgREJTICRkaXIvJHN0ZXAuZW5jIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICBleGl0IC0xCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgIyBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kIHdpbGwgZGVwZW5kIG9uIHRoZSBkYXRhYmFzZSBmb3JtYXQgLi4uIGFuZCB0aGUgdmVyc2lvbgogICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgaWYgeyRoaWVyfSB7CiAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVhZF9kYiAtY2VsbHZpZXcgXFtsaXN0ICR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRkZXNpZ24gJHN0ZXBcXVxuIgogICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJyZWFkX2RiIC1jZWxsdmlldyBcW2xpc3QgJHZhcnMob2FfZGVzaWduX2xpYikgJGRlc2lnbiAkc3RlcFxdXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyR2YXJzKHVzZXJfbW9kZSkgPT0gImhpZXIiICYmICgkdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIil9IHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKHN0ZXApID09ICJjdHMiICYmICR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICAgICBpZiB7KFtsc2VhcmNoICR2YXJzKHBhcnRpdGlvbl9saXN0KSAkdmFycyhkZXNpZ24pXSAhPSAtMSl9ICB7CiAgICAgICAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlYWRfZGIgJHtkZXNpZ259X3Bvc3RfZWNvLmVuYyBcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVhZF9kYiAuIFxuIgogICAgICAgICAgICAgICAgICB9ICAKICAgICAgICAgICAgICAgfSBlbHNlaWYgeyR2YXJzKHN0ZXApID09ICJwb3N0Y3RzIiAmJiAhJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlYWRfZGIgLiBcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVhZF9kYiAkZGlyLyRzdGVwLmVuYyBcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JHZhcnMoc3RlcCkgIT0gInBhcnRpdGlvbl9wbGFjZSJ9IHsKICAgICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVhZF9kYiAkZGlyLyRzdGVwLmVuY1xuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVhZF9kYiAkZGlyLyRzdGVwLmVuY1xuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgIyBQYXNzIHRoZSBjb21tYW5kIHRocm91Z2ggdGhlIHdyYXBwZXIgYW5kIHRoZW4gbWFrZSBpdCBjb25kaXRpb25hbCBzbyBpdCBjYW4gCiAgICAgICMgYmUgZGlzYWJsZWQgaW4gYSBzaW5nbGUgcHJvY2VzcyBmbG93CiAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJGN1cnJlbnRfc3RlcCxyZXN0b3JlX2Rlc2lnbiAkcmVzdG9yZV9jb21tYW5kXQogICAgICBzZXQgY29uZF9yZXN0b3JlX2NvbW1hbmQgImlmIHtcJHZhcnMocmVzdG9yZV9kZXNpZ24pfSB7XG4kcmVzdG9yZV9jb21tYW5kXG59IgoKICAgICAgaWYgeyEkZm9ybWF0fSB7CiAgICAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewojICAgICAgICAgICAgcmV0dXJuICRjb25kX3Jlc3RvcmVfY29tbWFuZAogICAgICAgICAgICByZXR1cm4gJHJlc3RvcmVfY29tbWFuZAogICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgIGV2YWwgJGNvbmRfcmVzdG9yZV9jb21tYW5kCiAgICAgICAgICAgICBldmFsICRyZXN0b3JlX2NvbW1hbmQKICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICBpZiB7JHZhcnMoY2F0Y2hfZXJyb3JzKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuaWYge1wkdmFycyhyZXN0b3JlX2Rlc2lnbil9IHtcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBpZiB7XFtjYXRjaCB7XG4kcmVzdG9yZV9jb21tYW5kfVxdfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgcHV0cyBcIjxGRj4gRVJST1IgTE9BRElORyBEQVRBQkFTRSBGUk9NIFNURVAgJHN0ZXAgLi4uIEVYSVRJTkdcIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIGV4aXQgLTFcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICB9XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiRyZXN0b3JlX2NvbW1hbmQiCiAgICAgICAgIH0KCiAgICAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEzfSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhzdGVwKSAhPSAiZGVidWcifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG5lbmFibGVfbWV0cmljcyAtb25cbiIKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgYWx3YXlzX3NvdXJjZV90Y2xdCgogICAgICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICAgICB9CiAgICAgIH0KICAgfQoKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIFNldHVwIHByb2NlZHVyZSBmb3IgcnVuKiBzdGVwcwogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICBwcm9jIGluaXRpYWxpemVfc3RlcCB7c3RlcH0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCB3YXJuaW5ncwoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgc3RlcF19IHsKICAgICAgICAgc2V0IHN0ZXAgJHZhcnMoc3RlcCkKICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRzdGVwLHJwdF9kaXIpXX0gewogICAgICAgICBzZXQgdmFycyhycHRfZGlyKSAkdmFycygkc3RlcCxycHRfZGlyKQogICAgICAgICBmaWxlIG1rZGlyICR2YXJzKCRzdGVwLHJwdF9kaXIpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCB2YXJzKHJwdF9kaXIpICR2YXJzKG9yaWdfcnB0X2RpcikKICAgICAgfQoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh3YXJuaW5nX2NvdW50KV19IHsKICAgICAgICAgc2V0IHZhcnMod2FybmluZ19jb3VudCkgMAogICAgICB9CiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZXJyb3JfY291bnQpXX0gewogICAgICAgICBzZXQgdmFycyhlcnJvcl9jb3VudCkgMAogICAgICB9CgogICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgU1RFUCAkc3RlcFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvbmx5X29wdGlvbnMpXSB8fCAoW2luZm8gZXhpc3RzIHZhcnMob25seV9vcHRpb25zKV0gJiYgISR2YXJzKG9ubHlfb3B0aW9ucykpfSB7CgogICAgICAgICBzZXQgdXBkYXRlX3NldHVwIDAKICAgICAgICAgc2V0IHVwZGF0ZV9ob2xkIDAKICAgCiAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc3RlcCxhY3RpdmVfc2V0dXBfdmlld3MpXSAmJiAoW2xsZW5ndGggJHZhcnMoJHN0ZXAsYWN0aXZlX3NldHVwX3ZpZXdzKV0+MCl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldCBzZXR1cF9hbmFseXNpc192aWV3cyBcIiR2YXJzKCRzdGVwLGFjdGl2ZV9zZXR1cF92aWV3cylcIlxuIgogICAgICAgICAgICBzZXQgdXBkYXRlX3NldHVwIDEKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHN0ZXAsYWN0aXZlX2hvbGRfdmlld3MpXSAmJiAoW2xsZW5ndGggJHZhcnMoJHN0ZXAsYWN0aXZlX2hvbGRfdmlld3MpXT4wKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IGhvbGRfYW5hbHlzaXNfdmlld3MgXCIkdmFycygkc3RlcCxhY3RpdmVfaG9sZF92aWV3cylcIlxuIgogICAgICAgICAgICBzZXQgdXBkYXRlX2hvbGQgMQogICAgICAgICB9CiAgIAogICAgICAgICBzZXQgY29tbWVudHMgIiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIFRoZSBhY3RpdmUgYW5hbHlzaXMgdmlld3MgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6XG4iICAKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoJHN0ZXAsYWN0aXZlX3NldHVwX3ZpZXdzKVxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKCRzdGVwLGFjdGl2ZV9ob2xkX3ZpZXdzKVxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCiAgICAgICAgIGlmIHskdXBkYXRlX3NldHVwIHx8ICR1cGRhdGVfaG9sZH0gewogICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IFVQREFUSU5HIEFOQUxZU0lTIFZJRVdTIC4uLlxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7ISR1cGRhdGVfc2V0dXAgJiYgJHVwZGF0ZV9ob2xkfSB7CiAgICMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2FuYWx5c2lzX3ZpZXcgLXNldHVwIFxbYWxsX3NldHVwX2FuYWx5c2lzX3ZpZXdzXF0gLWhvbGQgXFtsaXN0IFwkaG9sZF9hbmFseXNpc192aWV3c1xdXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfYW5hbHlzaXNfdmlldyAtc2V0dXAgXFthbGxfc2V0dXBfYW5hbHlzaXNfdmlld3NcXSAtaG9sZCBcJGhvbGRfYW5hbHlzaXNfdmlld3NcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHVwZGF0ZV9zZXR1cCAmJiAhJHVwZGF0ZV9ob2xkfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfYW5hbHlzaXNfdmlldyAtc2V0dXAgXCRzZXR1cF9hbmFseXNpc192aWV3cyAtaG9sZCBcW2FsbF9ob2xkX2FuYWx5c2lzX3ZpZXdzXF1cbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHVwZGF0ZV9zZXR1cCAmJiAkdXBkYXRlX2hvbGR9IHsKICAgIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfYW5hbHlzaXNfdmlldyAtc2V0dXAgXFtsaXN0IFwkc2V0dXBfYW5hbHlzaXNfdmlld3NcXSAtaG9sZCBcW2xpc3QgXCRob2xkX2FuYWx5c2lzX3ZpZXdzXF1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9hbmFseXNpc192aWV3IC1zZXR1cCBcJHNldHVwX2FuYWx5c2lzX3ZpZXdzIC1ob2xkIFwkaG9sZF9hbmFseXNpc192aWV3c1xuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWVudHMKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIkY29tbWFuZFxuIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyBzZXRfYW5hbHlzaXNfdmlldyAtc2V0dXAgXCR2YXJzKCRzdGVwLGFjdGl2ZV9zZXR1cF92aWV3cykgLWhvbGQgXCR2YXJzKCRzdGVwLGFjdGl2ZV9ob2xkX3ZpZXdzKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tZW50cwogICAgICAgIH0KICAgICAgICAgc2V0IHByb2Nlc3MgW3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXQogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHByb2Nlc3MpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZmxvd19lZmZvcnQpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIGRlc2lnbl9wcm9jZXNzX25vZGUgJHByb2Nlc3NcbiIKICAgICAgICAgaWYge1tzdHJpbmcgdG9sb3dlciAkdmFycyhmbG93X2VmZm9ydCldICE9ICJzdGFuZGFyZCJ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgZGVzaWduX2Zsb3dfZWZmb3J0IFtzdHJpbmcgdG9sb3dlciAkdmFycyhmbG93X2VmZm9ydCldXG4iCiAgICAgICAgIH0KICAgICAgfQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQ2hlY2sgaWYgaW4gdG9wIGxldmVsIHBhcnRpdGlvbiAoaWxtKSBmbG93CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIEZGX05PVlVTOjpjaGVja19mbG93CgojICAgICAgaWYgeyR2YXJzKHJlcG9ydF9ydW5fdGltZSl9IHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoJHN0ZXAsc3RhcnRfdGltZSkgXFtjbG9jayBzZWNvbmRzXF1cbiIKIyAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIHRoZSByZWNvbW1lbmRlZCBjb21tYW5kIG1vZGUgc2V0dGluZ3MgZm9yIHN0ZXAKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIERFRklOSU5HIE1PREUgU0VUVElOR1NcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgoKICAgICAgc2V0IGNvbW1lbnRzICIiCiAgICAgIHNldCB1Y29tbWVudHMgIiIKCiAgICAgIHN3aXRjaCAkc3RlcCB7CgogICAgICAgICAicGxhY2UiIHsKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNldCBwbGFjZW1lbnQgb3B0aW9ucyAuLi4KICAgICAgICAgICAgIyAtIFNldCBvcHRpbWl6YXRpb24gb3B0aW9ucyBpZiBpblBsYWNlT3B0IGlzIGVuYWJsZWQKICAgICAgICAgICAgIyAtIExvYWQgdGhlIENUUyBzcGVjIGZvciBjbG9jayBnYXRlIGF3YXJlIHBsYWNlbWVudAogICAgICAgICAgICAjIC0gUGxhY2UgSlRBRyBjZWxscyBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBzZXQgYXJncyAiIiAKICAgICAgICAgICAgaWYgeygkdmFycyhlbmFibGVfb2N2KSA9PSAicHJlX3BsYWNlIikgfHwgKCgkdmFycyhlbmFibGVfb2N2KSA9PSAicHJlX3ByZWN0cyIpICYmICgkdmFycyhwbGFjZV9vcHRfZGVzaWduKSB8fCAkdmFycyhwcmVyb3V0ZV9vcHRfZGVzaWduKSkpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdilcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfdHlwZSBvY3ZcbiIKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9hb2N2KX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19hb2N2IHRydWVcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19zb2N2IHRydWVcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCIkdmFycyhlbmFibGVfb2N2KVwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwcmVjdHMsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY29uZ2VzdGlvbl9lZmZvcnQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgJGFyZ1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNvbmdlc3Rpb25fZWZmb3J0KVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjb25nZXN0aW9uX2VmZm9ydCkgXCJhdXRvIGxvdyBtZWRpdW0gaGlnaFwiXG4iCiAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19nYXRlX2F3YXJlKV0gJiYgICR2YXJzKGNsb2NrX2dhdGVfYXdhcmUpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfYXdhcmUpXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIgojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjbG9ja19nYXRlX2F3YXJlKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZSlcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBwbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfYXdhcmUpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMocGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyAgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucykgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgfQojICAgICAgICAgICAgc2V0IHByb2Nlc3MgW3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXQojICAgICAgICAgICAgaWYge1tleHByICRwcm9jZXNzIDwgMjhdICYmIFtpbmZvIGV4aXN0cyB2YXJzKGZpbGxlcl9jZWxscyxtaW5fZ2FwKV19IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZmlsbGVyX2NlbGxzLG1pbl9nYXApXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1maWxsZXJHYXBNaW5HYXAgJHZhcnMoZmlsbGVyX2NlbGxzLG1pbl9nYXApIC1maWxsZXJHYXBFZmZvcnQgaGlnaFxuIgojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGZpbGxlcl9jZWxscyxtaW5fZ2FwKSBcIjxtaWNyb25zPlwiXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaWxsZXJfY2VsbHMsZ2FwX2VmZm9ydCkgXCI8bG93IG1lZGl1bSBoaWdoPiBcIlxuIgojICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwbGFjZSxzZXRfcGxhY2VfbW9kZSAkYXJnc10KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKGluX3BsYWNlX29wdCldICYmICR2YXJzKGluX3BsYWNlX29wdCkpIHx8ICR2YXJzKHBsYWNlX29wdF9kZXNpZ24pfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoaW5fcGxhY2Vfb3B0KVxuIgogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhwcmVzZXJ2ZV9hc3NlcnRpb25zKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocHJlc2VydmVfYXNzZXJ0aW9ucylcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBvcHRfcHJlc2VydmVfcGluc193aXRoX3RpbWluZ19jb25zdHJhaW50cyAkYXJnXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHByZXNlcnZlX2Fzc2VydGlvbnMpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhwb3dlcl9lZmZvcnQpfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwb3dlcl9lZmZvcnQpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgb3B0X3Bvd2VyX2VmZm9ydCAkYXJnXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHBvd2VyX2VmZm9ydCkgXCJsb3cgb3IgaGlnaFwiXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMocG93ZXJfcmF0aW8pfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwb3dlcl9yYXRpbylcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBvcHRfbGVha2FnZV90b19keW5hbWljX3JhdGlvICRhcmdcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocG93ZXJfcmF0aW8pIFwiMC4wIHRvIDEuMFwiXG4iCiAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNsb2NrX2dhdGVfYXdhcmVfb3B0KX1dfSB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfYXdhcmVfb3B0KVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBvcHRfY2xvY2tfZ2F0ZV9hd2FyZSAkYXJnXG4iCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZV9vcHQpIFwidHJ1ZVwiXG4iCiMgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNyaXRpY2FsX3JhbmdlKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3JpdGljYWxfcmFuZ2UpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWNyaXRpY2FsUmFuZ2UgJGFyZyIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoYWxsX2VuZF9wb2ludHMpXSAmJiAkdmFycyhhbGxfZW5kX3BvaW50cyl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhhbGxfZW5kX3BvaW50cylcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBvcHRfYWxsX2VuZF9wb2ludHMgdHJ1ZVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhhbGxfZW5kX3BvaW50cykgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhzaXplX29ubHlfZmlsZSl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHNpemVfb25seV9maWxlKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIG9wdF9zaXplX29ubHlfZmlsZSAkYXJnXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHNpemVfb25seV9maWxlKSBcIjxmaWxlPlwiXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZml4X2Zhbm91dF9sb2FkKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2Zhbm91dF9sb2FkKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIG9wdF9maXhfZmFub3V0X2xvYWQgJGFyZ1xuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaXhfZmFub3V0X2xvYWQpIFwiPGZpbGU+XCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh1c2VmdWxfc2tldyl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHVzZWZ1bF9za2V3KVxuIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoY2NvcHRfZWZmb3J0KSA9PSAibG93In0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIG9wdF91c2VmdWxfc2tldyAkYXJnXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgb3B0X3VzZWZ1bF9za2V3X2RlbGF5X3ByZV9jdHMgdHJ1ZVxuIgogICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnModXNlZnVsX3NrZXcpICYmICFbY2F0Y2gge3NldCBhcmcgJHZhcnMoc2tld19idWZmZXJzKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoc2tld19idWZmZXJzKVxuIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIG9wdF91c2VmdWxfc2tld19jZWxscyAkdmFycyhza2V3X2J1ZmZlcnMpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwcmVjdHMsc2V0X3VzZWZ1bF9za2V3X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gVmFyaWFibGUgdmFycyh1c2VmdWxfc2tldykgaWdub3JlZCB3aGVuIHZhcnMoY2NvcHRfZWZmb3J0KSBpcyAkdmFycyhjY29wdF9lZmZvcnQpXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlZhcmlhYmxlIHZhcnModXNlZnVsX3NrZXcpIGlnbm9yZWQgd2hlbiB2YXJzKGNjb3B0X2VmZm9ydCkgaXMgJHZhcnMoY2NvcHRfZWZmb3J0KVxuIgogICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyh1c2VmdWxfc2tldykgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoc2tld19idWZmZXJzKSBcIjxsaXN0IG9mIGJ1ZmZlcnM+XCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBsYWNlLHNldF9vcHRfbW9kZSAkYXJnc10KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAKIyAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6YWRkX3RpZV9jZWxscyB0cnVlIGZhbHNlXQojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBsYWNlLGFkZF90aWVfY2VsbHMgJGNvbW1hbmRdCgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoanRhZ19jZWxscyldICYmCiAgICAgICAgICAgICAgICBbaW5mbyBleGlzdHMgdmFycyhqdGFnX3Jvd3MpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGp0YWdfY2VsbHMpLCB2YXJzKGp0YWdfcm93cylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBQTEFDSU5HIEpUQUcgQ0VMTFNcbiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgZm9yZWFjaCBpbnN0ICR2YXJzKGp0YWdfY2VsbHMpIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlfanRhZyAtaW5zdCAkaW5zdFxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwbGFjZSxzcGVjaWZ5X2p0YWcgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJwbGFjZV9qdGFnIC1ucl9yb3cgJHZhcnMoanRhZ19yb3dzKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcGxhY2UscGxhY2VfanRhZyAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAicHJlY3RzIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgb3B0aW1pemF0aW9uIG9wdGlvbnMgLi4uCiAgICAgICAgICAgICMgRW5hYmxlIHNpZ25hbFN0b3JtIGlmIHJlcXVlc3RlZCAocmVxdWlyZWQgZm9yIEVDU00vQ0NTIGZsb3dzKQogICAgICAgICAgICAjIEZvciBsb3cgcG93ZXIgZmxvd3MsIG1ha2Ugc3VyZSBhbHdheXMtb24gYnVmZmVycyBhcmUgZW5hYmxlZAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBzZXQgYXJncyAiIiAKICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX29jdikgPT0gInByZV9wcmVjdHMifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfdHlwZSBvY3ZcbiIKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9hb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19hb2N2IHRydWVcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19zb2N2IHRydWVcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJwcmVfcHJlY3RzXCJcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcHJlY3RzLHNldF9hbmFseXNpc19tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxN30gewogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhwcmVzZXJ2ZV9hc3NlcnRpb25zKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocHJlc2VydmVfYXNzZXJ0aW9ucylcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBvcHRfcHJlc2VydmVfcGluc193aXRoX3RpbWluZ19jb25zdHJhaW50cyAkYXJnXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHByZXNlcnZlX2Fzc2VydGlvbnMpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMobGVha2FnZV9wb3dlcl9lZmZvcnQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhsZWFrYWdlX3Bvd2VyX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBvcHRfbGVha2FnZV9wb3dlcl9lZmZvcnQgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhsZWFrYWdlX3Bvd2VyX2VmZm9ydCkgXCJsb3cgb3IgaGlnaFwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZHluYW1pY19wb3dlcl9lZmZvcnQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhkeW5hbWljX3Bvd2VyX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBvcHRfZHluYW1pY19wb3dlcl9lZmZvcnQgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhkeW5hbWljX3Bvd2VyX2VmZm9ydCkgXCJsb3cgb3IgaGlnaFwiXG4iCiAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNsb2NrX2dhdGVfYXdhcmVfb3B0KX1dfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfYXdhcmVfb3B0KVxuIgojICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBvcHRfY2xvY2tfZ2F0ZV9hd2FyZSAkYXJnXG4iCiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZV9vcHQpIFwidHJ1ZVwiXG4iCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjcml0aWNhbF9yYW5nZSl9XX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjcml0aWNhbF9yYW5nZSlcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgb3B0X2NyaXRpY2FsX3JhbmdlICRhcmdcbiIKIyAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFsbF9lbmRfcG9pbnRzKV0gJiYgJHZhcnMoYWxsX2VuZF9wb2ludHMpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoYWxsX2VuZF9wb2ludHMpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgb3B0X2FsbF9lbmRfcG9pbnRzICR2YXJzKGFsbF9lbmRfcG9pbnRzKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhhbGxfZW5kX3BvaW50cykgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhzaXplX29ubHlfZmlsZSl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHNpemVfb25seV9maWxlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIG9wdF9zaXplX29ubHlfZmlsZSAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHNpemVfb25seV9maWxlKSBcIjxmaWxlPlwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZml4X2Zhbm91dF9sb2FkKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2Zhbm91dF9sb2FkKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIG9wdF9maXhfZmFub3V0X2xvYWQgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaXhfZmFub3V0X2xvYWQpIFwiPGZpbGU+XCJcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh1c2VmdWxfc2tldyl9XX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoY2NvcHRfZWZmb3J0KSA9PSAibG93In0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHVzZWZ1bF9za2V3KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIG9wdF91c2VmdWxfc2tldyAkYXJnXG4iCiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh1c2VmdWxfc2tldykgJiYgIVtjYXRjaCB7c2V0IGFyZyAkdmFycyhza2V3X2J1ZmZlcnMpfV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhza2V3X2J1ZmZlcnMpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgb3B0X3VzZWZ1bF9za2V3X2NlbGxzICR2YXJzKHNrZXdfYnVmZmVycylcbiIKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHByZWN0cyxzZXRfdXNlZnVsX3NrZXdfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgPEZGPiBWYXJpYWJsZSB2YXJzKHVzZWZ1bF9za2V3KSBpZ25vcmVkIHdoZW4gdmFycyhjY29wdF9lZmZvcnQpIGlzICR2YXJzKGNjb3B0X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiVmFyaWFibGUgdmFycyh1c2VmdWxfc2tldykgaWdub3JlZCB3aGVuIHZhcnMoY2NvcHRfZWZmb3J0KSBpcyAkdmFycyhjY29wdF9lZmZvcnQpXG4iCiAgICAgICAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHVzZWZ1bF9za2V3KSBcInRydWVcIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhza2V3X2J1ZmZlcnMpIFwiPGxpc3Qgb2YgYnVmZmVycz5cIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddfSB7CiAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlc2l6ZV9zaGlmdGVyX2FuZF9pc29faW5zdHMpfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhyZXNpemVfbGV2ZWxfc2hpZnRlcl9hbmRfaXNvX2luc3RzKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIG9wdF9yZXNpemVfbGV2ZWxfc2hpZnRlcl9hbmRfaXNvX2luc3RzICRhcmdcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcHJlY3RzLHNldF9vcHRfbW9kZSAkYXJnc10KICAgICAgICAgICAgfQoKIyAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfcHJlY3RzIn0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpXG4iCiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVsYXlDYWxNb2RlIC1lbmdpbmUgc2lnbmFsU3Rvcm1cbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwcmVjdHMsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcykgXCJwcmVfcHJlY3RzXCJcbiIKIyAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd119IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFsd2F5c19vbl9idWZmZXJzKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhhbHdheXNfb25fYnVmZmVycylcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9pbnRlcmFjdGl2ZV9jb25zdHJhaW50X21vZGVzIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdXG4iCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggYnVmZmVyICR2YXJzKGFsd2F5c19vbl9idWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZG9udF91c2UgZmFsc2UgJGJ1ZmZlclxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RvbnRfdG91Y2ggZmFsc2UgJGJ1ZmZlclxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZm9yZWFjaCBkb21haW4gW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgIixhbHdheXNfb25fYnVmZmVycyJdIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkb21haW4sYWx3YXlzX29uX2J1ZmZlcnMpXX0gewogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGJ1ZmZlciAkdmFycygkZG9tYWluLGFsd2F5c19vbl9idWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZG9udF91c2UgZmFsc2UgJGJ1ZmZlclxuIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RvbnRfdG91Y2ggZmFsc2UgJGJ1ZmZlclxuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JGNvbW1hbmQgIT0gIiJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHByZWN0cyxzZXRfZG9udF91c2UgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAiY3RzIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgQ1RTIG9wdGlvbnMgLi4uIHRoaXMgaW5jbHVkZXMgbmFub3JvdXRlIG9wdGlvbnMgYXMgdGhlIGNsb2NrCiAgICAgICAgICAgICMgbmV0IGlzIHR5cGljYWxseSByb3V0ZWQgZHVyaW5nIENUUy4gRm9yIGhpZXJhcmNoaWNhbCBmbG93cywgdGhlCiAgICAgICAgICAgICMgY2xvY2sgdHJlZSBzcGVjIGlzIGRlZmluZWQgcGVyIHBhcnRpdGlvbiAuCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgICAgIHNldCBhcmdzICIiCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfb2N2KSA9PSAicHJlX2N0cyJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc190eXBlIG9jdlxuIgogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2FvY3YpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX2FvY3YgdHJ1ZVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NvY3YpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX3NvY3YgdHJ1ZVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KSBcInByZV9jdHNcIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0cyxzZXRfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKIyAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJvdXRlX2Nsb2NrX25ldHMpfV19IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocm91dGVfY2xvY2tfbmV0cylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgY3RzX3JvdXRlX2Nsb2NrX3RyZWVfbmV0cyAkYXJnXG4iCiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocm91dGVfY2xvY2tfbmV0cylcbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY3RzIn0gewojICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX3RvcF9sYXllcildICYmICR2YXJzKGNsa190cmVlX3RvcF9sYXllcikgIT0ge319IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfdG9wX2xheWVyKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBjdHNfcm91dGVfdG9wX3ByZWZlcnJlZF9sYXllciAkdmFycyhjbGtfdHJlZV90b3BfbGF5ZXIpXG4iCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfdG9wX2xheWVyKVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX2JvdHRvbV9sYXllcildICYmICR2YXJzKGNsa190cmVlX2JvdHRvbV9sYXllcikgIT0ge319IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfYm90dG9tX2xheWVyKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBjdHNfcm91dGVfYm90dG9tX3ByZWZlcnJlZF9sYXllciAkdmFycyhjbGtfdHJlZV9ib3R0b21fbGF5ZXIpXG4iCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfYm90dG9tX2xheWVyKVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa19sZWFmX3RvcF9sYXllcildICYmICR2YXJzKGNsa19sZWFmX3RvcF9sYXllcikgIT0ge319IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfdG9wX2xheWVyKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBjdHNfcm91dGVfbGVhZl90b3BfcHJlZmVycmVkX2xheWVyICR2YXJzKGNsa19sZWFmX3RvcF9sYXllcilcbiIKIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbGtfbGVhZl90b3BfbGF5ZXIpXG4iCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX2xlYWZfYm90dG9tX2xheWVyKV0gJiYgJHZhcnMoY2xrX2xlYWZfYm90dG9tX2xheWVyKSAhPSB7fX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfbGVhZl9ib3R0b21fbGF5ZXIpXG4iCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGN0c19yb3V0ZV9sZWFmX2JvdHRvbV9wcmVmZXJyZWRfbGF5ZXIgJHZhcnMoY2xrX2xlYWZfYm90dG9tX2xheWVyKVxuIgojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNsa19sZWFmX2JvdHRvbV9sYXllcilcbiIKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbGtfdHJlZV9uZHIpXSAmJiAkdmFycyhjbGtfdHJlZV9uZHIpICE9IHt9fSB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsa190cmVlX25kcilcbiIKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgY3RzX3JvdXRlX25vbl9kZWZhdWx0X3J1bGUgJHZhcnMoY2xrX3RyZWVfbmRyKVxuIgojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNsa190cmVlX25kcilcbiIKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbGtfdHJlZV9leHRyYV9zcGFjZSldICYmICR2YXJzKGNsa190cmVlX2V4dHJhX3NwYWNlKSAhPSB7fX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV9leHRyYV9zcGFjZSlcbiIKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgY3RzX3JvdXRlX3ByZWZlcnJlZF9leHRyYV9zcGFjZSAkdmFycyhjbGtfdHJlZV9leHRyYV9zcGFjZSkiCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfZXh0cmFfc3BhY2UpXG4iCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX2xlYWZfbmRyKV0gJiYgJHZhcnMoY2xrX2xlYWZfbmRyKSAhPSB7fX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfbGVhZl9uZHIpXG4iCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGN0c19yb3V0ZV9sZWFmX25vbl9kZWZhdWx0X3J1bGUgJHZhcnMoY2xrX2xlYWZfbmRyKSIKIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbGtfbGVhZl9uZHIpXG4iCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX2xlYWZfZXh0cmFfc3BhY2UpXSAmJiAkdmFycyhjbGtfbGVhZl9leHRyYV9zcGFjZSkgIT0ge319IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfZXh0cmFfc3BhY2UpXG4iCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGN0c19yb3V0ZV9sZWFmX3ByZWZlcnJlZF9leHRyYV9zcGFjZSAkdmFycyhjbGtfbGVhZl9leHRyYV9zcGFjZSkiCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfZXh0cmFfc3BhY2UpXG4iCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7JGNvbW1hbmQgIT0gIiJ9IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsc2V0X2N0c19tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa19sZWFmX3RvcF9sYXllcildICYmICR2YXJzKGNsa19sZWFmX3RvcF9sYXllcikgIT0ge319IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfbGVhZl90b3BfbGF5ZXIpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItdG9wX3ByZWZlcnJlZF9sYXllciAkdmFycyhjbGtfbGVhZl90b3BfbGF5ZXIpICIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfdG9wX2xheWVyKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbGtfbGVhZl9ib3R0b21fbGF5ZXIpXSAmJiAkdmFycyhjbGtfbGVhZl9ib3R0b21fbGF5ZXIpICE9IHt9fSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfYm90dG9tX2xheWVyKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLWJvdHRvbV9wcmVmZXJyZWRfbGF5ZXIgJHZhcnMoY2xrX2xlYWZfYm90dG9tX2xheWVyKSAiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNsa19sZWFmX2JvdHRvbV9sYXllcilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX2xlYWZfbmRyKV0gJiYgJHZhcnMoY2xrX2xlYWZfbmRyKSAhPSB7fX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsa19sZWFmX25kcilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1ub25fZGVmYXVsdF9ydWxlICR2YXJzKGNsa19sZWFmX25kcikgIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbGtfbGVhZl9uZHIpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjcmVhdGVfcm91dGVfdHlwZSAtbmFtZSBsZWFmICIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgJGFyZ3MKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX3RyZWVfdG9wX2xheWVyKV0gJiYgJHZhcnMoY2xrX3RyZWVfdG9wX2xheWVyKSAhPSB7fX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsa190cmVlX3RvcF9sYXllcilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi10b3BfcHJlZmVycmVkX2xheWVyICR2YXJzKGNsa190cmVlX3RvcF9sYXllcikgIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV90b3BfbGF5ZXIpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX2JvdHRvbV9sYXllcildICYmICR2YXJzKGNsa190cmVlX2JvdHRvbV9sYXllcikgIT0ge319IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV9ib3R0b21fbGF5ZXIpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItYm90dG9tX3ByZWZlcnJlZF9sYXllciAkdmFycyhjbGtfdHJlZV9ib3R0b21fbGF5ZXIpICIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfYm90dG9tX2xheWVyKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbGtfdHJlZV9uZHIpXSAmJiAkdmFycyhjbGtfdHJlZV9uZHIpICE9IHt9fSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfbmRyKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLW5vbl9kZWZhdWx0X3J1bGUgJHZhcnMoY2xrX3RyZWVfbmRyKSAiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNsa190cmVlX25kcilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuY3JlYXRlX3JvdXRlX3R5cGUgLW5hbWUgdHJlZSAiCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICRhcmdzCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsc2V0X2N0c19tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICB9CiMgICAgICAgICAgICB9CgogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBpZiB7W3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXSAhPSAiY3RzIn0gewojICAgICAgICAgICAgICAgRkZfTk9WVVM6OmFzc2lnbl9jdHNfY2VsbHMKIyAgICAgICAgICAgICAgIGZvcmVhY2ggY29ybmVyICR2YXJzKHJjX2Nvcm5lcnMpIHsKIyAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLGF0Zl9maWxlKV19IHsKIyAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidXBkYXRlX2Njb3B0X3JjX2Nvcm5lciAtbmFtZSAkY29ybmVyIC1hdGYgJHZhcnMoJGNvcm5lcixhdGZfZmlsZSlcbiIKIyAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyx1cGRhdGVfY2NvcHRfcmNfY29ybmVyICRjb21tYW5kXQojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKIyAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjY29wdF9pbnRlZ3JhdGlvbildfSB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNjb3B0X2ludGVncmF0aW9uKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBjY29wdF9pbnRlZ3JhdGlvbiBcIiR2YXJzKGNjb3B0X2ludGVncmF0aW9uKVwiXG4iCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2NvcHRfaW50ZWdyYXRpb24pXG4iCiMgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfaW52ZXJ0ZXJfY2VsbHMpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGN0c19pbnZlcnRlcl9jZWxscylcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBjdHNfaW52ZXJ0ZXJfY2VsbHMgXCIkdmFycyhjdHNfaW52ZXJ0ZXJfY2VsbHMpXCJcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY3RzX2ludmVydGVyX2NlbGxzKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfYnVmZmVyX2NlbGxzKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjdHNfYnVmZmVyX2NlbGxzKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGN0c19idWZmZXJfY2VsbHMgXCIkdmFycyhjdHNfYnVmZmVyX2NlbGxzKVwiXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGN0c19idWZmZXJfY2VsbHMpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2dhdGVfY2VsbHMpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfY2VsbHMpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgY3RzX2Nsb2NrX2dhdGluZ19jZWxscyBcIiR2YXJzKGNsb2NrX2dhdGVfY2VsbHMpXCJcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xvY2tfZ2F0ZV9jZWxscylcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX3VzZV9pbnZlcnRlcnMpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGN0c191c2VfaW52ZXJ0ZXJzKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGN0c191c2VfaW52ZXJ0ZXJzIFtzdHJpbmcgdG9sb3dlciAkdmFycyhjdHNfdXNlX2ludmVydGVycyldXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGN0c191c2VfaW52ZXJ0ZXJzKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1cGRhdGVfaW9fbGF0ZW5jeSldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnModXBkYXRlX2lvX2xhdGVuY3kpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgY3RzX3VwZGF0ZV9pb19sYXRlbmN5ICR2YXJzKHVwZGF0ZV9pb19sYXRlbmN5KVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyh1cGRhdGVfaW9fbGF0ZW5jeSlcbiIKICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c19pb19vcHQpXX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjdHNfaW9fb3B0KVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBjY29wdF9pb19vcHQgW3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19pb19vcHQpXVxuIgojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGN0c19pb19vcHQpXG4iCiMgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjY29wdF9lZmZvcnQpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNjb3B0X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgdG9sb3dlciAkdmFycyhjY29wdF9lZmZvcnQpXSAhPSAibG93In0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2Njb3B0X2VmZm9ydCAkdmFycyhjY29wdF9lZmZvcnQpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2NvcHRfZWZmb3J0KVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfdGFyZ2V0X3NrZXcpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGN0c190YXJnZXRfc2tldylcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBjdHNfdGFyZ2V0X3NrZXcgJHZhcnMoY3RzX3RhcmdldF9za2V3KVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjdHNfdGFyZ2V0X3NrZXcpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c190YXJnZXRfc2xldyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3RzX3RhcmdldF9zbGV3KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGN0c190YXJnZXRfbWF4X3RyYW5zaXRpb25fdGltZSAkdmFycyhjdHNfdGFyZ2V0X3NsZXcpXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGN0c190YXJnZXRfc2xldylcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocHJlX2Njb3B0X3RjbCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocHJlX2Njb3B0X3RjbClcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBjY29wdF9wcmVfdGNsIFx7IHNvdXJjZSAkdmFycyhwcmVfY2NvcHRfdGNsKSBcfVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3N0X2Njb3B0X3RjbCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocG9zdF9jY29wdF90Y2wpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgY2NvcHRfcG9zdF90Y2wgXHsgc291cmNlICR2YXJzKHBvc3RfY2NvcHRfdGNsKSBcfVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyxzZXRfY2NvcHRfbW9kZSAkY29tbWFuZF0KIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfcm91dGVfdHlwZSB0cnVuayAiCiMgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX3RyZWVfbmRyKV19IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfbmRyKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1ub25fZGVmYXVsdF9ydWxlICR2YXJzKGNsa190cmVlX25kcikiCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfbmRyKVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX3NoaWVsZF9uZXQpXX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV9zaGllbGRfbmV0KVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1zaGllbGRfbmV0ICR2YXJzKGNsa190cmVlX3NoaWVsZF9uZXQpIgojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNsa190cmVlX3NoaWVsZF9uZXQpXG4iCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX3RyZWVfdG9wX2xheWVyKV19IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfdG9wX2xheWVyKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi10b3BfcHJlZmVycmVkX2xheWVyICR2YXJzKGNsa190cmVlX3RvcF9sYXllcilcbiIKIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV90b3BfbGF5ZXIpXG4iCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX3RyZWVfYm90dG9tX2xheWVyKV19IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItYm90dG9tX3ByZWZlcnJlZCAkdmFycyhjbGtfdHJlZV9ib3R0b21fbGF5ZXIpXG4iCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfYm90dG9tX2xheWVyKVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgaWYgeyRjb21tYW5kICE9ICJjcmVhdGVfcm91dGVfdHlwZSB0cnVuayAifSB7CiMgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKIyAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyxjcmVhdGVfcm91dGVfdHlwZSAkY29tbWFuZF0KIyAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhtdWx0aV9jdXRfZWZmb3J0KX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMobXVsdGlfY3V0X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiByb3V0ZV9kZXNpZ25fZGV0YWlsX3VzZV9tdWx0aV9jdXRfdmlhX2VmZm9ydCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKG11bHRpX2N1dF9lZmZvcnQpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMobGl0aG9fZHJpdmVuX3JvdXRpbmcpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhsaXRob19kcml2ZW5fcm91dGluZylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiByb3V0ZV9kZXNpZ25fd2l0aF9saXRob19kcml2ZW4gJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhsaXRob19kcml2ZW5fcm91dGluZylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsc2V0X25hbm9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0pICYmCiAgICAgICAgICAgICAgICAoW2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtwd2RdXV0gPT0gIiR2YXJzKHBhcnRpdGlvbl9kaXIpIil9IHsKICAgICAgICAgICAgICAgc2V0IHB0biBbZmlsZSB0YWlsIFtwd2RdXQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHB0bixjdHNfc3BlYyldfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGN0c19zcGVjKSAkdmFycygkcHRuLGN0c19zcGVjKQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7JHB0biAhPSAkdmFycyhkZXNpZ24pfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfc3BlYyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0IHZhcnMoY3RzX3NwZWMpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgICJwb3N0Y3RzIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBPcHRpb25hbGx5IGVuYWJsZSBjcHByLCBzaWduYWxTdG9ybSwgYW5kIG9uQ2hpcFZhcmlhdGlvbiAoaWYKICAgICAgICAgICAgIyBNTU1DKQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBzZXQgYXJncyAiIiAKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9jcHByKSAhPSAiZmFsc2UifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX2NwcHIgJHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhmbG93KSA9PSAibW1tYyJ9IHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9vY3YpID09ICJwcmVfcG9zdGN0cyJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc190eXBlIG9jdlxuIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2FvY3YpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX2FvY3YgdHJ1ZVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NvY3YpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX3NvY3YgdHJ1ZVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KSBcInByZV9wb3N0Y3RzXCJcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0cyxzZXRfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKIyAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfc3BlYyldfSB7CiMgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjbG9ja19nYXRlX2Nsb25lKX1dfSB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfY2xvbmUpXG4iCiMgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIG9wdF9wb3N0X2N0c19jbG9ja19nYXRlX2Nsb25pbmcgJGFyZ1xuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHMsc2V0X29wdF9tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAicG9zdGN0c19ob2xkIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgaG9sZCBmaXhpbmcgb3B0aW9ucyAuLi4KICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlbGF5X2NlbGxzKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhkZWxheV9jZWxscylcbiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9pbnRlcmFjdGl2ZV9jb25zdHJhaW50X21vZGVzIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdXG4iCiAgICAgICAgICAgICAgIGZvcmVhY2ggZGVsYXlfY2VsbCAkdmFycyhkZWxheV9jZWxscykgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RvbnRfdXNlIGZhbHNlICRkZWxheV9jZWxsXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyRjb21tYW5kICE9ICIifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0Y3RzX2hvbGQsc2V0X2RvbnRfdXNlICRjb21tYW5kXQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGRlbGF5X2NlbGxzKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBhcmdzICIiCiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGZpeF9ob2xkX2FsbG93X3Ruc19kZWdyYWRhdGlvbil9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGZpeF9ob2xkX2FsbG93X3Ruc19kZWdyYWRhdGlvbilcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiNzZXRfZGIgb3B0X2ZpeF9ob2xkX2FsbG93X3NldHVwX3Ruc19kZWdyYWRlICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKX0gewogICAgICAgICAgICAgICAjYXBwZW5kIGNvbW1hbmRzICJzZXRBbmFseXNpc01vZGUgLWhvbm9yQ2xvY2tEb21haW5zIHRydWVcbiIgCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfaWdub3JlX2lvcylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiNzZXRfZGIgb3B0X2ZpeF9ob2xkX2lnbm9yZV9wYXRoX2dyb3VwcyB7aW4ycmVnIHJlZzJvdXQgaW4yb3V0fVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHNfaG9sZCxzZXRfb3B0X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgInJvdXRlIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgcm91dGluZyBvcHRpb25zICAuLi4KICAgICAgICAgICAgIyBSZWNvbW1lbmRhdGlvbnMgZm9yIG11bHRpY3V0IHZpYSBpbnNlcnRpb24gYW5kIGxpdGhvIGRyaXZlbgogICAgICAgICAgICAjIHJvdXRpbmcuICBUaGVzZSBhbGwgaW5jdXIgcnVudGltZSBwZW5hbHRpZXMgYnV0IGhhdmUgeWllbGQKICAgICAgICAgICAgIyBhZHZhbnRhZ2VzIHNvIGFyZSBpbmNsdWRlZCBoZXJlLiBUaGUgcm91dGVXaXRoTGl0aG9Ecml2ZW4gb3B0aW9uCiAgICAgICAgICAgICMgaXMgcmVjb21tZW5kZWQgZm9yIDQ1bm0gYnV0IG1heSBhbHNvIGJlIHVzZWQgYXQgNjVubS4gVGhlCiAgICAgICAgICAgICMgLWRyb3V0ZVVzZU11bHRpQ3V0VmlhRWZmb3J0IGNhbiBiZSBzZXQgdG8gaGlnaCBpZiBuZWVkZWQ7CiAgICAgICAgICAgICMgZXhwZWN0IGFuIGF2ZXJhZ2Ugb2YgNSUgY292ZXJhZ2UgaW1wcm92ZW1lbnQgd2l0aCBhbiBhdmVyYWdlIDEwJQogICAgICAgICAgICAjIHJ1bnRpbWUgaGl0IHZlcnN1cyBtZWRpdW0KICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgaWYgeygkdmFycyhlbmFibGVfY3BwcikgIT0gImZhbHNlIikgJiYgJHZhcnModHJhY2tfb3B0KX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19jcHByICR2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfY3BwcilcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NpX2F3YXJlKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGRlbGF5Y2FsX2VuYWJsZV9zaSB0cnVlXG4gIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc2lfYXdhcmUpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zaV9hd2FyZSlcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhtdWx0aV9jdXRfZWZmb3J0KX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMobXVsdGlfY3V0X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiByb3V0ZV9kZXNpZ25fZGV0YWlsX3VzZV9tdWx0aV9jdXRfdmlhX2VmZm9ydCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKG11bHRpX2N1dF9lZmZvcnQpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMobGl0aG9fZHJpdmVuX3JvdXRpbmcpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhsaXRob19kcml2ZW5fcm91dGluZylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiByb3V0ZV9kZXNpZ25fd2l0aF9saXRob19kcml2ZW4gJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhsaXRob19kcml2ZW5fcm91dGluZylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhhbnRlbm5hX2Rpb2RlKX1dfSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhhbnRlbm5hX2Rpb2RlKSAhPSAiIn0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGFudGVubmFfZGlvZGUpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgcm91dGVfZGVzaWduX2FudGVubmFfY2VsbF9uYW1lICRhcmdcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiByb3V0ZV9kZXNpZ25fYW50ZW5uYV9kaW9kZV9pbnNlcnRpb24gdHJ1ZVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhhbnRlbm5hX2Rpb2RlKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGFudGVubmFfZGlvZGUpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsc2V0X25hbm9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgICJwb3N0cm91dGUiIHsKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNldCBleHRyYWN0aW9uIGVmZm9ydCBmb3IgcG9zdHJvdXRlIG9wdGltaXphdGlvbgogICAgICAgICAgICAjIEVuYWJsZSBzaWduYWxTdG9ybSBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2VuZ2luZSBwb3N0X3JvdXRlXG4iCiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2VmZm9ydF9sZXZlbCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfdG90YWxfY2FwX3RocmVzaG9sZCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgZXh0cmFjdF9yY19yZWxhdGl2ZV9jYXBfdGhyZXNob2xkICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2NvdXBsaW5nX2NhcF90aHJlc2hvbGQgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2xlZl90ZWNoX2ZpbGVfbWFwICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHFyY19sYXllcl9tYXApXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLHNldF9leHRyYWN0X3JjX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAKCiAgICAgICAgICAgIHNldCBhcmdzICIiCiAgICAgICAgICAgIGlmIHsoJHZhcnMoZW5hYmxlX29jdikgPT0gInByZV9wb3N0cm91dGUiKSB8fCAoJHZhcnMoZW5hYmxlX29jdikgPT0gInByZV9wb3N0Y3RzIil9IHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpICE9ICJkZWZhdWx0In0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX3R5cGUgb2N2XG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9hb2N2KX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19hb2N2IHRydWVcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19zb2N2IHRydWVcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJwcmVfcG9zdHJvdXRlXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfY3BwcikgIT0gImZhbHNlIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19jcHByICR2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfY3BwcilcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHtbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NzKSA9PSAicHJlX3Bvc3Ryb3V0ZSJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpXG4iCiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZWxheUNhbE1vZGUgLWVuZ2luZSBzaWduYWxTdG9ybSAtc2lnbm9mZiB0cnVlICIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSxzZXRfZGVsYXlfY2FsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcykgXCJwcmVfcG9zdHJvdXRlXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zaV9hd2FyZSl9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBkZWxheWNhbF9lbmFibGVfc2kgdHJ1ZVxuICIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSxzZXRfZGVsYXlfY2FsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NpX2F3YXJlKVxuIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NzKSA9PSAicHJlX3Bvc3Ryb3V0ZSJ9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gVmFyaWFibGUgdmFycyhlbmFibGVfc3MpIGlnbm9yZWQgd2hlbiB2YXJzKGVuYWJsZV9zaV9hd2FyZSkgaXMgc2V0XG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlZhcmlhYmxlIHZhcnMoZW5hYmxlX3NzKSBpZ25vcmVkIHdoZW4gdmFycyhlbmFibGVfc2lfYXdhcmUpIGlzIHNldFxuIgogICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc2lfYXdhcmUpXG4iCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfcG9zdHJvdXRlIn0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcylcbiIKIyAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZWxheUNhbE1vZGUgLWVuZ2luZSBzaWduYWxTdG9ybSAtc2lnbm9mZiB0cnVlIC1zaUF3YXJlIGZhbHNlXG4iCiMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiNzZXRfZGIgZGVsYXljYWxfZW5hYmxlX3NpIGZhbHNlXG4iCiMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9wb3N0cm91dGVcIlxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAicG9zdHJvdXRlX2hvbGQiIHsKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNldCBob2xkIGZpeGluZyBvcHRpb25zIC4uLgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfZW5naW5lIHBvc3Rfcm91dGVcbiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMocG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0KX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0KVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfZWZmb3J0X2xldmVsICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0KVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHRvdGFsX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnModG90YWxfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgZXh0cmFjdF9yY190b3RhbF9jYXBfdGhyZXNob2xkICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnModG90YWxfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMocmVsYXRpdmVfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX3JlbGF0aXZlX2NhcF90aHJlc2hvbGQgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjb3VwbGluZ19jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNvdXBsaW5nX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfY291cGxpbmdfY2FwX3RocmVzaG9sZCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNvdXBsaW5nX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHFyY19sYXllcl9tYXApfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhxcmNfbGF5ZXJfbWFwKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfbGVmX3RlY2hfZmlsZV9tYXAgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCxzZXRfZXh0cmFjdF9yY19tb2RlICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAiIiAKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlbGF5X2NlbGxzKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9pbnRlcmFjdGl2ZV9jb25zdHJhaW50X21vZGVzIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVsYXlfY2VsbHMpXG4iCiAgICAgICAgICAgICAgIGZvcmVhY2ggZGVsYXlfY2VsbCAkdmFycyhkZWxheV9jZWxscykgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RvbnRfdXNlIGZhbHNlICRkZWxheV9jZWxsXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZGVsYXlfY2VsbHMpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRjb21tYW5kICE9ICIifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCxzZXRfZG9udF91c2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiI3NldF9kYiBvcHRfZml4X2hvbGRfYWxsb3dfc2V0dXBfdG5zX2RlZ3JhZGUgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaXhfaG9sZF9hbGxvd190bnNfZGVncmFkYXRpb24pXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGZpeF9ob2xkX2lnbm9yZV9pb3MpfSB7CiAgICAgICAgICAgICAgICNhcHBlbmQgY29tbWFuZHMgInNldEFuYWx5c2lzTW9kZSAtaG9ub3JDbG9ja0RvbWFpbnMgdHJ1ZVxuIiAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiI3NldF9kYiBvcHRfZml4X2hvbGRfaWdub3JlX3BhdGhfZ3JvdXBzIHtpbjJyZWcgcmVnMm91dCBpbjJvdXR9IgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9ob2xkLHNldF9vcHRfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAicG9zdHJvdXRlX3NpIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgbm9pc2UsIGV4dHJhY3Rpb24sIGFuZCBTSSBvcHRpb25zIC4uLgogICAgICAgICAgICAjIEVuYWJsZSBzaWduYWxTdG9ybSBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgIyBFbmFibGUgb25DaGlwVmFyaWF0aW9uIChpZiBNTU1DKQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfY291cGxlZCB0cnVlXG4iCiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHRvdGFsX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnModG90YWxfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgZXh0cmFjdF9yY190b3RhbF9jYXBfdGhyZXNob2xkICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnModG90YWxfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMocmVsYXRpdmVfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX3JlbGF0aXZlX2NhcF90aHJlc2hvbGQgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjb3VwbGluZ19jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNvdXBsaW5nX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfY291cGxpbmdfY2FwX3RocmVzaG9sZCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNvdXBsaW5nX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHFyY19sYXllcl9tYXApfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhxcmNfbGF5ZXJfbWFwKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfbGVmX3RlY2hfZmlsZV9tYXAgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhxcmNfbGF5ZXJfbWFwKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaSxzZXRfZXh0cmFjdF9yY19tb2RlICRjb21tYW5kXQoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHNpX2RlbGF5X2RlbHRhX3RocmVzaG9sZCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGRlbHRhX2RlbGF5X3RocmVzaG9sZClcbiIKICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY2VsdGljX3NldHRpbmdzKX1dfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNlbHRpY19zZXR0aW5ncylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWluc0NlbHRJQ1ByZVRjbCBcIiRhcmdcIiIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjZWx0aWNfc2V0dGluZ3MpXG4iCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhzaV9hbmFseXNpc190eXBlKX1dfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1hbmFseXNpc1R5cGUgJGFyZyIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzaV9hbmFseXNpc190eXBlKVxuIgojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KSAmJiBbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgc2lfYWNjZXB0YWJsZV93bnMgMFxuIgogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoYWNjZXB0YWJsZV93bnMpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHNpX2FjY2VwdGFibGVfd25zICR2YXJzKGFjY2VwdGFibGVfd25zKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaSxzZXRfc2lfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9vY3YpID09ICJwcmVfcG9zdHJvdXRlX3NpIn0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoZmxvdykgIT0gImRlZmF1bHQifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfdHlwZSBvY3ZcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2FvY3YpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX2FvY3YgdHJ1ZVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NvY3YpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX3NvY3YgdHJ1ZVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KSBcInByZV9wb3N0cm91dGVfc2lcIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9jcHByKSAhPSAiZmFsc2UifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX2NwcHIgJHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaSxzZXRfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKIyAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfcG9zdHJvdXRlX3NpIn0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpXG4iCiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVsYXlDYWxNb2RlIC1lbmdpbmUgc2lnbmFsU3Rvcm1cbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2ksc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcykgXCJwcmVfcG9zdHJvdXRlX3NpXCJcbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0KCiAgICAgICAgICJwb3N0cm91dGVfc2lfaG9sZCIgewogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU2V0IGhvbGQgZml4aW5nIG9wdGlvbnMgLi4uCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgICAgIHNldCBjb21tYW5kICIiIAogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVsYXlfY2VsbHMpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2ludGVyYWN0aXZlX2NvbnN0cmFpbnRfbW9kZXMgXFthbGxfY29uc3RyYWludF9tb2RlcyAtYWN0aXZlXF1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhkZWxheV9jZWxscylcbiIKICAgICAgICAgICAgICAgZm9yZWFjaCBkZWxheV9jZWxsICR2YXJzKGRlbGF5X2NlbGxzKSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZG9udF91c2UgZmFsc2UgJGRlbGF5X2NlbGxcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhkZWxheV9jZWxscylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGNvbW1hbmQgIT0gIiJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9ob2xkLHNldF9kb250X3VzZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhmaXhfaG9sZF9hbGxvd190bnNfZGVncmFkYXRpb24pfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmaXhfaG9sZF9hbGxvd190bnNfZGVncmFkYXRpb24pXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIjc2V0X2RiIG9wdF9maXhfaG9sZF9hbGxvd19zZXR1cF90bnNfZGVncmFkZSAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGZpeF9ob2xkX2FsbG93X3Ruc19kZWdyYWRhdGlvbilcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoZml4X2hvbGRfaWdub3JlX2lvcyl9IHsKICAgICAgICAgICAgICAgI2FwcGVuZCBjb21tYW5kcyAic2V0QW5hbHlzaXNNb2RlIC1ob25vckNsb2NrRG9tYWlucyB0cnVlXG4iIAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGZpeF9ob2xkX2lnbm9yZV9pb3MpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIjc2V0X2RiIG9wdF9maXhfaG9sZF9pZ25vcmVfcGF0aF9ncm91cHMge2luMnJlZyByZWcyb3V0IGluMm91dH0iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGZpeF9ob2xkX2lnbm9yZV9pb3MpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlbGF5X2NlbGxzKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9pbnRlcmFjdGl2ZV9jb25zdHJhaW50X21vZGVzIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVsYXlfY2VsbHMpXG4iCiAgICAgICAgICAgICAgIGZvcmVhY2ggZGVsYXlfY2VsbCAkdmFycyhkZWxheV9jZWxscykgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RvbnRfdXNlIGZhbHNlICRkZWxheV9jZWxsXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZGVsYXlfY2VsbHMpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX3NpX2hvbGQsc2V0X29wdF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU2V0IG5vaXNlLCBleHRyYWN0aW9uLCBhbmQgU0kgb3B0aW9ucyAuLi4KICAgICAgICAgICAgIyBFbmFibGUgc2lnbmFsU3Rvcm0gaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICMgRW5hYmxlIG9uQ2hpcFZhcmlhdGlvbiAoaWYgTU1NQykKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2NvdXBsZWQgdHJ1ZVxuIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfdG90YWxfY2FwX3RocmVzaG9sZCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgZXh0cmFjdF9yY19yZWxhdGl2ZV9jYXBfdGhyZXNob2xkICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2NvdXBsaW5nX2NhcF90aHJlc2hvbGQgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2xlZl90ZWNoX2ZpbGVfbWFwICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2lfaG9sZCxzZXRfZXh0cmFjdF9yY19tb2RlICRjb21tYW5kXQoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHNpX2RlbGF5X2RlbHRhX3RocmVzaG9sZCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGRlbHRhX2RlbGF5X3RocmVzaG9sZClcbiIKICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY2VsdGljX3NldHRpbmdzKX1dfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNlbHRpY19zZXR0aW5ncylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWluc0NlbHRJQ1ByZVRjbCBcIiRhcmdcIiIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjZWx0aWNfc2V0dGluZ3MpXG4iCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhzaV9hbmFseXNpc190eXBlKX1dfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1hbmFseXNpc1R5cGUgJGFyZyIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzaV9hbmFseXNpc190eXBlKVxuIgojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KSAmJiBbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgc2lfYWNjZXB0YWJsZV93bnMgMFxuIgogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoYWNjZXB0YWJsZV93bnMpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHNpX2FjY2VwdGFibGVfd25zICR2YXJzKGFjY2VwdGFibGVfd25zKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0U0lNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2lfaG9sZCxzZXRfc2lfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NzKSA9PSAicHJlX3Bvc3Ryb3V0ZV9zaSJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpXG4iCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZWxheUNhbE1vZGUgLWVuZ2luZSBzaWduYWxTdG9ybVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX3NpX2hvbGQsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpIFwicHJlX3Bvc3Ryb3V0ZV9zaVwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9vY3YpID09ICJwcmVfcG9zdHJvdXRlX3NpIn0gIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KVxuIgogICAgICAgICAgICAgICBpZiB7JHZhcnMoZmxvdykgIT0gImRlZmF1bHQifSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX3R5cGUgb2N2XG4iCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfYW9jdil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1hb2N2IHRydWUgIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX3NpX2hvbGQsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJwcmVfcG9zdHJvdXRlX3NpXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAic2lnbm9mZiIgewogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgRm9yIHRoZSBkZWZhdWx0IGZsb3csIHN3aXRjaCB0byBNTU1DIGZvciBmaW5hbCBTVEEgdG8gc3VwcG9ydAogICAgICAgICAgICAjIG11bHRpcGxlIFJDIGNvcm5lcnMuICBBbHNvLCBlbmFibGUgQ0NFIChzaWdub2ZmKSBleHRyYWN0aW9uIGlmCiAgICAgICAgICAgICMgdGhlIFFSQyB0ZWNoZmlsZSBleGlzdHMKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBpZiB7JHZhcnMoZmxvdykgPT0gImRlZmF1bHQifSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gVVBEQVRJTkcgVElNSU5HIEVOVklST05NRU5UIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLGluaXRpYWxpemVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU2V0IG5vaXNlLCBleHRyYWN0aW9uLCBhbmQgU0kgb3B0aW9ucyAuLi4KICAgICAgICAgICAgIyBFbmFibGUgc2lnbmFsU3Rvcm0gaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICMgRW5hYmxlIG9uQ2hpcFZhcmlhdGlvbiAoaWYgTU1NQykKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2NvdXBsZWQgdHJ1ZVxuIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfdG90YWxfY2FwX3RocmVzaG9sZCAkYXJnXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgZXh0cmFjdF9yY19yZWxhdGl2ZV9jYXBfdGhyZXNob2xkICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2NvdXBsaW5nX2NhcF90aHJlc2hvbGQgJGFyZ1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2xlZl90ZWNoX2ZpbGVfbWFwICRhcmdcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHNldF9leHRyYWN0X3JjX21vZGUgJGNvbW1hbmRdCgogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhkZWx0YV9kZWxheV90aHJlc2hvbGQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhkZWx0YV9kZWxheV90aHJlc2hvbGQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgc2lfZGVsYXlfZGVsdGFfdGhyZXNob2xkICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGRlbHRhX2RlbGF5X3RocmVzaG9sZClcbiIKICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY2VsdGljX3NldHRpbmdzKX1dfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNlbHRpY19zZXR0aW5ncylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWluc0NlbHRJQ1ByZVRjbCBcIiRhcmdcIiIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjZWx0aWNfc2V0dGluZ3MpXG4iCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhzaV9hbmFseXNpc190eXBlKX1dfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1hbmFseXNpc1R5cGUgJGFyZyIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzaV9hbmFseXNpc190eXBlKVxuIgojICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX29jdikgIT0gImZhbHNlIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX3R5cGUgb2N2XG4iCiAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfYW9jdil9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfYW9jdiB0cnVlXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc29jdil9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfc29jdiB0cnVlXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpIFwicHJlX3NpZ25vZmZcIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9jcHByKSAhPSAiZmFsc2UifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJzZXRfZGIgdGltaW5nX2FuYWx5c2lzX2NwcHIgJHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tyZWdleHAgIjkuMSIgJHZhcnModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfc2lnbm9mZiJ9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlbGF5Q2FsTW9kZSAtZW5naW5lIHNpZ25hbFN0b3JtIC1zaWdub2ZmIHRydWVcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcylcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9zaWdub2ZmXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zaV9hd2FyZSl9IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NpX2F3YXJlKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1zaUF3YXJlIHRydWUgLWVuZ2luZSBhYWVcbiAiCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfc2lnbm9mZiJ9IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlbGF5Q2FsTW9kZSAtZW5naW5lIHNpZ25hbFN0b3JtIC1zaWdub2ZmIHRydWVcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICI8RkY+IFZhcmlhYmxlIHZhcnMoZW5hYmxlX3NzKSBpZ25vcmVkIHdoZW4gdmFycyhlbmFibGVfc2lfYXdhcmUpIGlzIHNldFxuIgojICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiVmFyaWFibGUgdmFycyhlbmFibGVfc3MpIGlnbm9yZWQgd2hlbiB2YXJzKGVuYWJsZV9zaV9hd2FyZSkgaXMgc2V0XG4iCiMgICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9zaWdub2ZmXCJcbiIKICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zaV9hd2FyZSlcbiIKIyAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfc2lnbm9mZiJ9IHsKIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKVxuIgojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1lbmdpbmUgc2lnbmFsU3Rvcm0gLXNpZ25vZmYgdHJ1ZSAiCiMgICAgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9zaWdub2ZmXCJcbiIKIyAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyR2YXJzKHNraXBfc2lnbm9mZl9jaGVja3MpfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgZXh0cmFjdF9yY19lbmdpbmUgcG9zdF9yb3V0ZVxuc2V0X2RiIGV4dHJhY3RfcmNfZWZmb3J0X2xldmVsICR2YXJzKHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQpXG5zZXRfZGIgZXh0cmFjdF9yY19jb3VwbGVkIHRydWVcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2V4dHJhY3RfcmNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycyhhY3RpdmVfcmNfY29ybmVycykgXFtsaXN0XF1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmb3JlYWNoIHZpZXcgXFthbGxfYW5hbHlzaXNfdmlld3NcXSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgc2V0IGNvcm5lciBcW2dldF9kZWxheV9jb3JuZXIgXFtnZXRfYW5hbHlzaXNfdmlldyBcJHZpZXcgLWRlbGF5X2Nvcm5lclxdIC1yY19jb3JuZXJcXVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGlmIHtcW2xzZWFyY2ggXCR2YXJzKGFjdGl2ZV9yY19jb3JuZXJzKSBcJGNvcm5lclxdID09IC0xIH0ge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIGxhcHBlbmQgdmFycyhhY3RpdmVfcmNfY29ybmVycykgXCRjb3JuZXJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICB9XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+IEFDVElWRSBSQyBDT1JORVIgTElTVDogXCR2YXJzKGFjdGl2ZV9yY19jb3JuZXJzKVwiXG4iCiAgIAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBlbXB0eV9jb3JuZXJzIFxbbGlzdFxdXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZm9yZWFjaCBjb3JuZXIgXCR2YXJzKGFjdGl2ZV9yY19jb3JuZXJzKSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgaWYgeyFcW2ZpbGUgZXhpc3RzIFxbZ2V0X3JjX2Nvcm5lciBcJGNvcm5lciAtcXJjX3RlY2hcXVxdfSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgbGFwcGVuZCBlbXB0eV9jb3JuZXJzIFwkY29ybmVyXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgfVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtsbGVuZ3RoIFwkZW1wdHlfY29ybmVyc1xdID09IDB9IHtcbiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiAgIHNldF9kYiBleHRyYWN0X3JjX2VuZ2luZSBwb3N0X3JvdXRlXG4gICBzZXRfZGIgZXh0cmFjdF9yY19lZmZvcnRfbGV2ZWwgJHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydClcbiAgIHNldF9kYiBleHRyYWN0X3JjX2NvdXBsZWQgdHJ1ZVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixzZXRfZXh0cmFjdF9yY19tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgcHV0cyBcIjxGRj4gQ0FOJ1QgUlVOIFNJR05PRkYgRVhUUkFDVElPTiBCRUNBVVNFIHF4X3RlY2hfZmlsZSBJUyBOT1QgREVGSU5FRCBGT1IgdGhlc2UgY29ybmVyczogXCRlbXB0eV9jb3JuZXJzXCJcbiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiAgIHNldF9kYiBleHRyYWN0X3JjX2VuZ2luZSBwb3N0X3JvdXRlXG4gICBzZXRfZGIgZXh0cmFjdF9yY19lZmZvcnRfbGV2ZWwgbG93XG4gICBzZXRfZGIgZXh0cmFjdF9yY19jb3VwbGVkIHRydWVcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2V4dHJhY3RfcmNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdWNvbW1lbnRzXX0gewogICAgICAgICBpZiB7JHVjb21tZW50cyA9PSAiIn0gewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModWNvbW1lbnRzKV19IHsKICAgICAgICAgICAgICAgdW5zZXQgdmFycyh1Y29tbWVudHMpCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnModWNvbW1lbnRzKSAkdWNvbW1lbnRzCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1lbnRzXX0gewogICAgICAgICBpZiB7JGNvbW1lbnRzID09ICIifSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjb21tZW50cyldfSB7CiAgICAgICAgICAgICAgIHVuc2V0IHZhcnMoY29tbWVudHMpCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnMoY29tbWVudHMpICRjb21tZW50cyAKICAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQoKICAgcHJvYyBzYXZlX3Jlc3VsdHMge3tzdGVwICIifSB7Zm9ybWF0IDB9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIGlmIHtbcmVnZXhwIHN5bl8gJHN0ZXBdfSB7CiAgICAgICAgIHNldCBjb21tYW5kcyAiIgogICAgICAgICBpZiB7JHZhcnMocmVwb3J0X3J1bl90aW1lKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZmX3Byb2NzOjpyZXBvcnRfdGltZVxuIgogICAgICAgICB9CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhpZXIpXX0gewogICAgICAgICBzZXQgaGllciB0cnVlCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBoaWVyIGZhbHNlCiAgICAgIH0KICAgICAgaWYgeyRzdGVwICE9ICIifSB7CiAgICAgICAgIHNldCB2YXJzKHN0ZXApICRzdGVwCiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhkZWJ1Zyl9IHsKICAgICAgICAgcHV0cyAiPERFQlVHPiBTYXZpbmcgcmVzdWx0cyBmb3IgJHZhcnMoc3RlcCkgLi4uIgogICAgICB9CgogICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgaWYgeyR2YXJzKGJhdGNoKX0gewoKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgU0FWSU5HIFJFU1VMVFNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIH0KCiMgICAgICAgICBpZiB7W3JlZ2V4cCBfaG9sZCAkdmFycyhzdGVwKV0gJiYgKCFbbHNlYXJjaCAkdmFycyhmaXhfaG9sZCkgJHZhcnMoc3RlcCldIDwwKX0gewojICAgCiMgICAgICAgICAgICBpZiB7ISRmb3JtYXR9IHsKIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kcyAiIgojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIGlmIHskdmFycyhyZXBvcnRfcnVuX3RpbWUpfSB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIkZGX05PVlVTOjpyZXBvcnRfdGltZSAkdmFycyhzdGVwKVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiMgICAgICAgICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0gCgogICAgICAgICBzZXQgaGVhZGVyICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgIGFwcGVuZCBoZWFkZXIgIiMgPEZGPiBHRU5FUkFUSU5HIFJFUE9SVFNcbiIKICAgICAgICAgYXBwZW5kIGhlYWRlciAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAKICAgICAgICAgaWYgeyR2YXJzKHJlcG9ydF9wb3dlcil9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLXZpZXcgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgLW91dF9maWxlICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnBvd2VyLnJwdFxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVwb3J0X3Bvd2VyIC1vdXRfZmlsZSAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5wb3dlci5ycHRcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVwb3J0X3Bvd2VyICRjb21tYW5kXQogICAgICAgICB9CiAgIAogICAgICAgICBpZiB7W0ZGOjppc19scF9mbG93XSAmJiBbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9kb21haW5zKV0gJiYgW2xsZW5ndGggJHZhcnMocG93ZXJfZG9tYWlucyldID4gMX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGhlYWRlcgogICAgICAgICAgICBzZXQgaGVhZGVyICIiCiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgVmVyaWZ5IHBvd2VyIGRvbWFpbgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAojICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNoZWNrX3Bvd2VyX2RvbWFpbnMgLWJpbmQgLWdjb25uIgojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtaXNvX25ldF9wZCAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5pc29uZXRzLnJwdCIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXhfbmV0X3BkICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnhuZXRzLnJwdFxuIgoKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkc3RlcCxjaGVja19wb3dlcl9kb21haW4gJGNvbW1hbmRdCiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgUnVuIENMUAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgICAgICAgICBpZiB7JHZhcnMocnVuX2NscCkgJiYgKFthdXRvX2V4ZWNvayBsZWNdICE9ICIiKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicnVuX2NscCAiCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbHBfb3B0aW9ucyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICR2YXJzKGNscF9vcHRpb25zKQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICRzdGVwLHJ1bl9jbHAgJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY2xwX3dhcm5pbmcpXX0gewogICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IFVOQUJMRSBUTyBSVU4gQ0xQIC4uLiBQTEVBU0UgTUFLRSBTVVJFIElUIElTIElOIFlPVVIgUEFUSCIKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2xwX3dhcm5pbmcpIHRydWUKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIHNldCBtYXAoaW5pdCkgdW5wbGFjZWQKICAgICAgICAgc2V0IG1hcChwbGFjZSkgcGxhY2VkCiAgICAgICAgIHNldCBtYXAocGFydGl0aW9uX3BsYWNlKSBwbGFjZWQKICAgICAgICAgc2V0IG1hcChtb2RlbF9nZW4pIHBsYWNlZAogICAgICAgICBzZXQgbWFwKGFzc2lnbl9waW4pIHBsYWNlZAogICAgICAgICAjc2V0IG1hcChwYXJ0aXRpb24pIHt9CiAgICAgICAgIHNldCBtYXAocHJlY3RzKSBwbGFjZWQKICAgICAgICAgc2V0IG1hcChjdHMpIGNsb2NrX3N5bnRoZXNpemVkCiAgICAgICAgIHNldCBtYXAocG9zdGN0cykgY2xvY2tfc3ludGhlc2l6ZWQKICAgICAgICAgc2V0IG1hcChwb3N0Y3RzX2hvbGQpIGNsb2NrX3N5bnRoZXNpemVkCiAgICAgICAgIHNldCBtYXAocm91dGUpIGNsb2NrX3N5bnRoZXNpemVkX3JvdXRlZAogICAgICAgICBzZXQgbWFwKHBvc3Ryb3V0ZSkgY2xvY2tfc3ludGhlc2l6ZWRfcm91dGVkCiAgICAgICAgIHNldCBtYXAocG9zdHJvdXRlX2hvbGQpIGNsb2NrX3N5bnRoZXNpemVkX3JvdXRlZAogICAgICAgICBzZXQgbWFwKHNpZ25vZmYpIGNsb2NrX3N5bnRoZXNpemVkX3JvdXRlZAogICAgICAgICBzZXQgbWFwKGFzc2VtYmxlKSBwbGFjZWRfcm91dGVkCgogICAgICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKSAmJiAoJHZhcnMoc3RlcCkgIT0gImRlYnVnIil9IHsKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTN9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwb3Bfc25hcHNob3Rfc3RhY2tcbiIKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTZ9IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBtYXAoJHN0ZXApXX0gewogICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjb21wdXRlX21ldHJpY3MpXSAmJiAkdmFycyhjb21wdXRlX21ldHJpY3MpfSB7CiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKSAtY2F0ZWdvcmllcyBcW2RpY3QgZ2V0IFxbZ2V0X2RiIG1ldHJpY19jYXRlZ29yeV9zdGF0dXNfbWFwXF0gJG1hcCgkc3RlcClcXVxuIgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKSAtY2F0ZWdvcmllcyBkZXNpZ25cbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcCkgLWNhdGVnb3JpZXMgZGVzaWduXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcCkgLWNhdGVnb3JpZXMgZGVzaWduXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZXBvcnRfbWV0cmljIC1maWxlICR2YXJzKHJwdF9kaXIpL21ldHJpY3MuaHRtbCAtZm9ybWF0IGh0bWxcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgIAogICAgICAgICBpZiB7KCRzdGVwICE9ICJwYXJ0aXRpb24iKSAmJiAoJHN0ZXAgIT0gInJlYnVkZ2V0IikgJiYgKCRzdGVwICE9ICJmbGV4aWxtIil9IHsKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNhdmVfcmMpXSAmJiAkdmFycyhzYXZlX3JjKX0gewogICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicm91dGUiICR2YXJzKHN0ZXApXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1yYyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2F2ZV9jb25zdHJhaW50cyldICYmICR2YXJzKHNhdmVfY29uc3RyYWludHMpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXRjb24iCiAgICAgICAgICAgIH0KICAgICAKICAgICAgICAgICAgIyBCQ0w6IEFkZGVkIHN1YnN0IGFyb3VuZCB2YXJzKGRic19kaXIpIHRvIHJlc29sdmUgdmFycyhydW5kaXIpCiAgICAgICAgICAgIHNldCBkaXIgW3N1YnN0ICR2YXJzKGRic19kaXIpXQogICAgICAgICAgICBzZXQgZGVzaWduICR2YXJzKGRlc2lnbikKICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgICAgICAgIGlmIHskaGllcn0gewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfZGIgJGFyZ3MgLW9hX2xpYl9jZWxsX3ZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICR2YXJzKGRlc2lnbikgJHZhcnMoc3RlcCl9XG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAkYXJncyAtb2FfbGliX2NlbGxfdmlldyB7JHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSAkdmFycyhzdGVwKX1cbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocmVsYXRpdmVfcGF0aCldICYmICR2YXJzKHJlbGF0aXZlX3BhdGgpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXJlbGF0aXZlX3BhdGgiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFic29sdXRlX2xpYl9wYXRoKV0gJiYgJHZhcnMoYWJzb2x1dGVfbGliX3BhdGgpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWFic29sdXRlX2xpYl9wYXRoIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAkYXJncyAkZGlyLyR2YXJzKHN0ZXApLmVuY1xuIgogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICBpZiB7ISgoJHZhcnMoc3RlcCkgPT0gIm1vZGVsX2dlbiIpICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKSAmJiAkdmFycyhmbGV4bW9kZWxfYXJ0X2Jhc2VkKSl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICRzdGVwLHNhdmVfZGVzaWduICRjb21tYW5kXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHN0ZXAsc2F2ZV9sZWNfbmV0bGlzdCAid3JpdGVfbmV0bGlzdCAkdmFycyhkYnNfZGlyKS9MRUMvJHN0ZXAudi5nelxuIl0KICAgICAgICAgICAgfQogICAKICAgICAgICAgfQoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgZW52KFZQQVRIKV19IHsKICAgICAgICAgICAgc2V0IGVudihWUEFUSCkgIm1ha2UiCiAgICAgICAgIH0KCiAgICAgICAgIGlmIHshJHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcyl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHsiCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS8kdmFycyhzdGVwKSIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICAgIH0KICAgCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBIT1VTRUtFRVBJTkdcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG1haWwsdG8pXX0gewogICAgICAgICAgICBzd2l0Y2ggJHZhcnMoc3RlcCkgewogICAgICAgICAgICAgICBpbml0ICAgICB7IHNldCBzdW1tYXJ5X2ZpbGUgcHJlcGxhY2Uuc3VtbWFyeSB9CiAgICAgICAgICAgICAgIGFzc2VtYmxlIHsgc2V0IHN1bW1hcnlfZmlsZSBzaWdub2ZmLnN1bW1hcnkgfQogICAgICAgICAgICAgICBkZWZhdWx0ICB7IHNldCBzdW1tYXJ5X2ZpbGUgJHZhcnMoc3RlcCkuc3VtbWFyeSB9CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobWFpbCxzdGVwcyldIHx8IFwKICAgICAgICAgICAgICAgIChbaW5mbyBleGlzdHMgdmFycyhtYWlsLHN0ZXBzKV0gJiYgKFtsc2VhcmNoICR2YXJzKG1haWwsc3RlcHMpICR2YXJzKHN0ZXApXSAhPSAtMSkpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcIjxGRj4gTUFJTElORyBSRVNVTFRTIFRPICR2YXJzKG1haWwsdG8pXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtmaWxlIGV4aXN0cyAkdmFycyhycHRfZGlyKS8kc3VtbWFyeV9maWxlXF19IHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBleGVjIC9iaW4vbWFpbCAtcyBcIkZGOiAkdmFycyhkZXNpZ24pLCAkdmFycyhzdGVwKSBjb21wbGV0ZWQgKFxbcHdkXF0pXCIgPCAkdmFycyhycHRfZGlyKS8kc3VtbWFyeV9maWxlICR2YXJzKG1haWwsdG8pXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifSBlbHNlaWYge1xbZmlsZSBleGlzdHMgJHZhcnMocnB0X2RpcikvJHtzdW1tYXJ5X2ZpbGV9Lmd6XF19IHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBndW56aXAgLWMgJHZhcnMocnB0X2RpcikvJHtzdW1tYXJ5X2ZpbGV9Lmd6IFx8IGV4ZWMgL2Jpbi9tYWlsIC1zIFwiRkY6ICR2YXJzKGRlc2lnbiksICR2YXJzKHN0ZXApIGNvbXBsZXRlZCAoXFtwd2RcXSlcIiAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyAvYmluL21haWwgLXMgXCJGRjogJHZhcnMoZGVzaWduKSwgJHZhcnMoc3RlcCkgY29tcGxldGVkIChcW3B3ZFxdKVwiIDwgL2Rldi9udWxsICR2YXJzKG1haWwsdG8pXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImV4ZWMgL2Jpbi90b3VjaCBcJGVudihWUEFUSCkvJHZhcnMoc3RlcClcbiIKICAgCiAgICAgICAgIGlmIHskZm9ybWF0fSB7CiAgICAgICAgICAgIGlmIHskdmFycyhyZXBvcnRfcnVuX3RpbWUpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmZfcHJvY3M6OnJlcG9ydF90aW1lXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTR9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtldmFsIEZGOjpjYXB0dXJlX21ldHJpY3NdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgIAogICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3Fvcl9jaGVjayl9IHsKIyAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc3RlcCxxb3JfdGNsXX0gewojICAgICAgICAgICAgICAgc2V0IHFvcl9maWxlICR2YXJzKCRzdGVwLHFvcl90Y2wpCiMgICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICRxb3JfZmlsZV19IHsKIyAgICAgICAgICAgICAgICAgIHNldCBxb3IgW2NhdGNoIHtleGVjICRxb3JfZmlsZX0gbXNnXQojICAgICAgICAgICAgICAgICAgc2V0IG1ha2VfZmlsZSBbb3BlbiAkdGhpc19zZW1hcGhvcmUgd10KIyAgICAgICAgICAgICAgICAgIHB1dHMgJG1ha2VfZmlsZSAiJHFvciIKIyAgICAgICAgICAgICAgICAgIGNsb3NlICRtYWtlX2ZpbGUKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRzdGVwLHFvcl90Y2wpXX0gewogICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKCRzdGVwLHFvcl90Y2wpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyAke3N0ZXB9LHFvcl90Y2xdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiPEZGPiBXQVJOSU5HOiBRT1IgZmlsZSAkdmFycygkc3RlcCxxb3JfdGNsKSBkb2VzIG5vdCBleGlzdCIKICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiV0FSTklORzogUU9SIGZpbGUgJHZhcnMoJHN0ZXAscW9yX3RjbCkgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhtYWtlZmlsZSkgJiYgISR2YXJzKGdlbmVyYXRlX2Zsb3dfc3RlcHMpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG5pZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHtcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBleGVjIC9iaW4vdG91Y2ggXCRlbnYoVlBBVEgpLyR7c3RlcH1fcW9yXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBmaW5hbF9hbHdheXNfc291cmNlX3RjbF0KCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcIjxGRj4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcIjxGRj4gSU5GTzogUnVubmluZyBpbiBpbnRlcmFjdGl2ZSBtb2RlIC4uLlwiXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcIjxGRj4gICAgICAgUGxlYXNlIHJ1biAnRkZfTk9WVVM6OnNhdmVfcmVzdWx0cyA8Y3VycmVudF9zdGVwPicgXCJcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiAgICAgICB0byBwcmVwYXJlIGEgZGF0YWJhc2UgZm9yIHRoZSBuZXh0IHN0ZXBcIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIlxuIgogICAgICAgICBpZiB7JHZhcnMobWFrZWZpbGUpICYmICEkdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKX0geyAKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHtcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJleGVjIC9iaW4vdG91Y2ggXCRlbnYoVlBBVEgpLyR2YXJzKHN0ZXApXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQoKICAgfQoKICAgcHJvYyBpbml0aWFsaXplX211bHRpY3B1IHt9IHsKCiAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBTRVRUSU5HIFVQIE1VTFRJIFBST0NFU1MgRElTVFJJQlVUSU9OIEFORCBUSFJFQURJTkdcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIGlmIHtbcmVnZXhwIHN5bl8gJHZhcnMoc3RlcCldfSB7CiAgICAgICAgIHJldHVybiAiIgogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGlzdHJpYnV0ZV90aW1lb3V0KV19IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kaXN0cmlidXRlZF9ob3N0cyAtdGltZV9vdXQgJHZhcnMoZGlzdHJpYnV0ZV90aW1lb3V0KSAiCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGlzdHJpYnV0ZWRfaG9zdHMgIgogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGlzdHJpYnV0ZSldfSB7CiAgICAgICAgIHN3aXRjaCAkdmFycyhkaXN0cmlidXRlKSB7CiAgICAgICAgICAgICJyc2giIHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgUlVOTklORyBSU0ggb24gJHZhcnMocnNoLGhvc3RfbGlzdClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1yc2ggLWFkZCBcW2xpc3QgJHZhcnMocnNoLGhvc3RfbGlzdClcXVxuIgogICAgICAgICAgICAgICBzZXQgdmFycyhyZW1vdGVfaG9zdHMpIFtsbGVuZ3RoICR2YXJzKHJzaCxob3N0X2xpc3QpXQogICAgICAgICAgICAgfQogICAgICAgICAgICAibG9jYWwiIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1sb2NhbFxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgICJjdXN0b20iIHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgUlVOTklORyBDVVNUT00gKCR2YXJzKGN1c3RvbSxzY3JpcHQpKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLWN1c3RvbSAtY3VzdG9tX3NjcmlwdCB7ICR2YXJzKGN1c3RvbSxzY3JpcHQpIH1cbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAibHNmIiB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFJVTk5JTkcgTFNGICgkdmFycyhsc2YscXVldWUpLCAkdmFycyhsc2YscmVzb3VyY2UpLCAkdmFycyhsc2YsYXJncylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1sc2YgLXF1ZXVlICR2YXJzKGxzZixxdWV1ZSkgLXJlc291cmNlIHsgJHZhcnMobHNmLHJlc291cmNlKSB9IC1sc2ZfYXJncyB7ICR2YXJzKGxzZixhcmdzKSB9XG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdCB7CiAgICAgICAgICAgICAgICBwdXRzICAiPEZGPiBESVNUUklCVVRJT04gVFlQRSAkdmFycyhkaXN0cmlidXRlKSBOT1QgU1VQUE9SVEVEXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Rpc3RyaWJ1dGVkX2hvc3RzICRjb21tYW5kXQoKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9tdWx0aV9jcHVfdXNhZ2UgIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiLWxvY2FsX2NwdSAkdmFycyhsb2NhbF9jcHVzKSAiCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcmVtb3RlX2hvc3QgJHZhcnMocmVtb3RlX2hvc3RzKSAiCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICItY3B1X3Blcl9yZW1vdGVfaG9zdCAkdmFycyhjcHVzX3Blcl9yZW1vdGVfaG9zdClcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9tdWx0aV9jcHVfdXNhZ2UgJGNvbW1hbmRdCgogICAgICB9IGVsc2UgewoKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1sb2NhbFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Rpc3RyaWJ1dGVkX2hvc3RzICRjb21tYW5kXQoKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9tdWx0aV9jcHVfdXNhZ2UgLWxvY2FsX2NwdSAkdmFycyhsb2NhbF9jcHVzKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X211bHRpX2NwdV91c2FnZSAkY29tbWFuZF0KCiAgICAgIH0KCiAgICAgIHJldHVybiAkY29tbWFuZHMKCiAgIH0KICAgcHJvYyBkZXJhdGVfdGltaW5nICB7e3R5cGUgbWlubWF4fX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKIyAgICAgICAgIHJldHVybiAiIgojICAgICAgfQoKIyAgICAgIGlmIHskdmFycyhlbmFibGVfYW9jdil9IHsKIyAgICAgICAgIHNldCBjb21tYW5kcyAiIgojICAgICAgICAgZm9yZWFjaCBjb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZXNldF90aW1pbmdfZGVyYXRlIC1kZWxheV9jb3JuZXIgJGNvcm5lclxuIgojICAgICAgICAgfSAgIAojICAgICAgICAgcmV0dXJuICRjb21tYW5kcwojICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmRzICJwdXRzIFwiPEZGPiBERVJBVElORyBERUxBWSBDT1JORVJTIC4uLlwiXG4iCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBERVJBVElORyBERUxBWSBDT1JORVJTICgkdHlwZSkgLi4uXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CiAgICAgIHN3aXRjaCAkdHlwZSB7CiAgICAgICAgICJtbW1jIiB7CiAgICAgICAgICAgIHNldCBmb3VuZF9jb3JuZXIgMAogICAgICAgICAgICBmb3JlYWNoIGNvcm5lciAkdmFycyhkZWxheV9jb3JuZXJzKSB7CiAgICAgICAgICAgICAgIHNldCBkZXJhdGVfZmlsZSAwCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kKCRjb3JuZXIpICIiCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLGRlcmF0ZV90Y2wpXX0gewogICAgICAgICAgICAgICAgICBzZXQgZGVyYXRlX2ZpbGUgMQogICAgICAgICAgICAgICAgICBpbmNyIGZvdW5kX2Nvcm5lciAxCiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoJGNvcm5lcixkZXJhdGVfdGNsKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyRjb21tYW5kKCRjb3JuZXIpID09ICIifSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kKCRjb3JuZXIpIFtGRjo6c291cmNlX3BsdWcgIiRjb3JuZXIsZGVyYXRlX3RjbCJdCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHshJGRlcmF0ZV9maWxlfSB7CiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggb2JqZWN0ICJjZWxsIG5ldCIgewogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG1vZGUgImVhcmx5IGxhdGUiIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCB0eXBlICJkYXRhIGNsb2NrIiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLCR7dHlwZX1fJHtvYmplY3R9XyR7bW9kZX0pXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCgkY29ybmVyKSAiICAgc2V0X3RpbWluZ19kZXJhdGUgLSR0eXBlIC0ke29iamVjdH1fZGVsYXkgLSRtb2RlIC1kZWxheV9jb3JuZXIgJGNvcm5lciAkdmFycygkY29ybmVyLCR7dHlwZX1fJHtvYmplY3R9XyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBmb3VuZF9jb3JuZXIgMQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLCR7b2JqZWN0fV8ke3R5cGV9XyR7bW9kZX0pXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCgkY29ybmVyKSAiICAgc2V0X3RpbWluZ19kZXJhdGUgLSR0eXBlIC0ke29iamVjdH1fZGVsYXkgLSRtb2RlIC1kZWxheV9jb3JuZXIgJGNvcm5lciAkdmFycygkY29ybmVyLCR7b2JqZWN0fV8ke3R5cGV9XyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBmb3VuZF9jb3JuZXIgMQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb3JuZXIsY2VsbF9jaGVja18ke21vZGV9KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQoJGNvcm5lcikgIiAgIHNldF90aW1pbmdfZGVyYXRlIC1jZWxsX2NoZWNrIC0kbW9kZSAtZGVsYXlfY29ybmVyICRjb3JuZXIgJHZhcnMoJGNvcm5lcixjZWxsX2NoZWNrXyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBmb3VuZF9jb3JuZXIgMQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLGNoZWNrX2NlbGxfJHttb2RlfSldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kKCRjb3JuZXIpICIgICBzZXRfdGltaW5nX2RlcmF0ZSAtY2VsbF9jaGVjayAtJG1vZGUgLWRlbGF5X2Nvcm5lciAkY29ybmVyICR2YXJzKCRjb3JuZXIsY2hlY2tfY2VsbF8ke21vZGV9KVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZm91bmRfY29ybmVyIDEKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBUaGVyZSBjYW4gb25seSBiZSBvbmUgaWxtX25vbl9zZGNfZmlsZSwgc28gbmVlZCB0byBjb21iaW5lIHRoZW0gd2l0aCAKICAgICAgICAgICAgIyB0aGUgdGltaW5nIGRlcmF0ZSBjb21tYW5kcyBpZiBib3RoIGV4aXN0cwogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHskZm91bmRfY29ybmVyPjB9IHsKICAgICAgICAgICAgICAgaWYgJHZhcnMoaWxtKSB7CiAgICAgICAgICAgICAgICAgIHNldCBvcCBbb3BlbiAuaWxtX25vbl9zZGNfZmlsZS50Y2wgd10KICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXSAmJiBbZmlsZSBleGlzdHMgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7IAogICAgICAgICAgICAgICAgICAgICBzZXQgZmhyIFtvcGVuICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpIHJdCiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIjIgogICAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiIyBDb250ZW50cyBvZiAkdmFycyhpbG1fbm9uX3NkY19maWxlKSIKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiMiCiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkZmhyIGxpbmVdPj0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICAkbGluZSIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjbG9zZSAkZmhyCiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHNhdmVfaWxtX25vbl9zZGNfZmlsZSkgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSkKICAgICAgICAgICAgICAgICAgICAgdW5zZXQgdmFycyhpbG1fbm9uX3NkY19maWxlKQogICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVyYXRlX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJzb3VyY2UgJHZhcnMoZGVyYXRlX3RjbCkiCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggY29ybmVyICR2YXJzKGRlbGF5X2Nvcm5lcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgJGNvbW1hbmQoJGNvcm5lcikKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGNsb3NlICRvcAojICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImxvYWRUaW1pbmdDb24gLWlsbU5vblNkY0ZpbGUgLmlsbV9ub25fc2RjX2ZpbGUudGNsXG4iCiMgICAgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRJbG1Ob25TZGNDb25zdHJhaW50RmlsZSAuaWxtX25vbl9zZGNfZmlsZS50Y2xcbiIKIyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlcmF0ZV90Y2wpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBkZXJhdGVfdGNsXQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBhY3RpdmVfY29ybmVycyBcW2FsbF9kZWxheV9jb3JuZXJzXF1cbiIKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBjb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7JGNvbW1hbmQoJGNvcm5lcikgIT0gIiJ9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtsc2VhcmNoIFwkYWN0aXZlX2Nvcm5lcnMgJGNvcm5lclxdICE9IC0xfSB7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZCgkY29ybmVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVyYXRlX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGRlcmF0ZV90Y2xdCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICJtaW5tYXgiIHsKCiAgICAgICAgICAgIHNldCBjb3JuZXJzKG1pbikgJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lcikKICAgICAgICAgICAgc2V0IGNvcm5lcnMobWF4KSAkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikKCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgRGVyYXRlIHRpbWluZyBpZiBkZXJhdGluZyBmYWN0b3JzIGFyZSBkZWZpbmVkCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGZvcmVhY2ggb2JqZWN0ICJjZWxsIG5ldCIgewogICAgICAgICAgICAgICBmb3JlYWNoIGNvcm5lciAibWluIG1heCIgewogICAgICAgICAgICAgICAgICBmb3JlYWNoIHR5cGUgImRhdGEgY2xvY2siIHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBtb2RlICJlYXJseSBsYXRlIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVycygkY29ybmVyKSwke3R5cGV9XyR7b2JqZWN0fV8ke21vZGV9KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfdGltaW5nX2RlcmF0ZSAtJGNvcm5lciAtJHR5cGUgLSR7b2JqZWN0fV9kZWxheSAtJG1vZGUgJHZhcnMoJGNvcm5lcnMoJGNvcm5lciksJHt0eXBlfV8ke29iamVjdH1fJHttb2RlfSlcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNvcm5lcnMoJGNvcm5lciksJHtvYmplY3R9XyR7dHlwZX1fJHttb2RlfSldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X3RpbWluZ19kZXJhdGUgLSRjb3JuZXIgLSR0eXBlIC0ke29iamVjdH1fZGVsYXkgLSRtb2RlICR2YXJzKCRjb3JuZXJzKCRjb3JuZXIpLCR7b2JqZWN0fV8ke3R5cGV9XyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoIGNvcm5lciAibWluIG1heCIgewogICAgICAgICAgICAgICBmb3JlYWNoIG1vZGUgImVhcmx5IGxhdGUiIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb3JuZXJzKCRjb3JuZXIpLGNlbGxfY2hlY2tfJHttb2RlfSldfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X3RpbWluZ19kZXJhdGUgLWNlbGxfY2hlY2sgLSRtb2RlICR2YXJzKCRjb3JuZXJzKCRjb3JuZXIpLGNlbGxfY2hlY2tfJHttb2RlfSlcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNvcm5lcnMoJGNvcm5lciksY2hlY2tfY2VsbF8ke21vZGV9KV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfdGltaW5nX2RlcmF0ZSAtY2VsbF9jaGVjayAtJG1vZGUgJHZhcnMoJGNvcm5lcnMoJGNvcm5lciksY2hlY2tfY2VsbF8ke21vZGV9KVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICBwdXRzICI8RkY+IElOVkFMSUQgT1BUSU9OIC4uLiBNVVNUIEJFIEVJVEhFUiBtaW5tYXggT1IgbW1tYyIKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS90aW1pbmdkZXJhdGUuc2RjIHddCiAgICAgICAgIHB1dHMgJG9wICRjb21tYW5kcwogICAgICAgICBjbG9zZSAkb3AKICAgICAgICAgaWYgeyEkdmFycyhub3Z1cykgJiYgKFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kcyAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL3RpbWluZ2RlcmF0ZS5zZGNcbiIKICAgICAgICAgfSAKICAgICAgfSAKICAgICAgcmV0dXJuICRjb21tYW5kcwogICB9CiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBUaGUgY29kZSBiZWxvdyB1cGRhdGVzIHRpbWluZyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY3VycmVudCBtb2R1bGUgaXMKICAgIyAtIHRvcCBwYXJ0aXRpb24gaW4gYSBoaWVyYXJjaGljYWwgZmxvdwogICAjIC0gcGFydGl0aW9uIGluIGEgaGllcmFyY2hpY2FsIGZsb3cKICAgIyAtIGNoaXAgb3IgYmxvY2sgaW4gYSBmbGF0IGZsb3cKICAgIyBUaW1pbmcgaXMgdXBkYXRlZCBieSBpbmNyZW1lbnRhbGx5IGFkZGluZyB0aGUgdmFycyhpbmNyX2N0c19zZGMpIHRvIGVhY2gKICAgIyBjb25zdHJhaW50IG1vZGUgdGhhdCBoYXMgb25lIGRlZmluZWQKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgcHJvYyB1cGRhdGVfdGltaW5nIHt7dHlwZSBtbW1jfSB7c3dpdGNoX3RvX3Byb3BhZ2F0ZWQgdHJ1ZX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNvbnN0cmFpbnRfbW9kZXMpXX0gewogICAgICAgICByZXR1cm4KICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmRzICJwdXRzIFwiPEZGPiBVUERBVElORyBUSU1JTkcgLi4uXCJcbiIKCiAgICAgIHNldCBwdG4gW2ZpbGUgdGFpbCBbcHdkXV0KICAgICAgc2V0IHBhcmVudCBbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXQogICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgc2V0IHRvcCBmYWxzZQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXSAmJiAoJHBhcmVudCA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikiKX0gewogICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICRwdG5dICE9IC0xfSB7CiMgICAgICAgICAgICBzZXQgaWxtIGZhbHNlCiAgICAgICAgICAgIHNldCB1cGRhdGUgZmFsc2UKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHRvcCB0cnVlCiAgICAgICAgIH0KICAgICAgfQoKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSUxNICR2YXJzKGlsbSksIFVQREFURSAkdXBkYXRlXG4iCgogICAgICBpZiB7JHN3aXRjaF90b19wcm9wYWdhdGVkfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IG9wIFxbb3BlbiBwcm9wLnNkYyB3XF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwkb3AgXCJzZXRfcHJvcGFnYXRlZF9jbG9jayBcXFxbYWxsX2Nsb2Nrc1xcXF1cIlxuIgogICAgICAgICBpZiB7JHZhcnMoaWxtKX0gewogICAgICAgICAgICBpZiB7JHZhcnMoZmxhdCkgIT0gIm5vbmUifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpnZXRfY2xvY2tfcG9ydHNdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGNsb2NrX3BvcnRzIFxbRkZfRURJOjpnZXRfY2xvY2tfcG9ydHNcXVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbbGxlbmd0aCBcJGNsb2NrX3BvcnRzXF0gPiAwfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZm9yZWFjaCBwb3J0IFwkY2xvY2tfcG9ydHMge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIHB1dHMgXCRvcCBcInNldF9wcm9wYWdhdGVkX2Nsb2NrIFwkcG9ydFwiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgfVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNsb3NlIFwkb3BcbiIKICAgICAgfQoKICAgICAgc3dpdGNoICR0eXBlIHsKCiAgICAgICAgICJtaW5tYXgiIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGlsbSkgJiYgJHVwZGF0ZX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaW5jcl9jdHNfc2RjKV19IHsKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGluY3JfY3RzX3NkYykgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImxvYWRUaW1pbmdDb24gLWlsbSAtaW5jciAkZmlsZVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3N0X2N0c19zZGMpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidW5sb2FkVGltaW5nQ29uXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAibG9hZFRpbWluZ0NvbiAgW2xpbmRleCAkdmFycyhwb3N0X2N0c19zZGMpIDBdXG4iCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggc2RjIFtscmFuZ2UgJHZhcnMocG9zdF9jdHNfc2RjKSAxIGVuZF0gewogICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAibG9hZFRpbWluZ0NvbiAtaWxtIC1pbmNyICRzZGNcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskc3dpdGNoX3RvX3Byb3BhZ2F0ZWR9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJsb2FkVGltaW5nQ29uIC1pbG0gLWluY3IgcHJvcC5zZGNcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JHVwZGF0ZX0gewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaW5jcl9jdHNfc2RjKV19IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGluY3JfY3RzX3NkYykgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImxvYWRUaW1pbmdDb24gLWluY3IgJGZpbGVcbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMocG9zdF9jdHNfc2RjKV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bmxvYWRUaW1pbmdDb25cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJsb2FkVGltaW5nQ29uIFtsaW5kZXggJHZhcnMocG9zdF9jdHNfc2RjKSAwXVxuIgogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIHNkYyBbbHJhbmdlICR2YXJzKHBvc3RfY3RzX3NkYykgMSBlbmRdIHsKICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImxvYWRUaW1pbmdDb24gLWluY3IgJHNkY1xuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHN3aXRjaF90b19wcm9wYWdhdGVkfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAibG9hZFRpbWluZ0NvbiAtaW5jciBwcm9wLnNkY1xuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAibW1tYyIgewojICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVwZGF0ZV9pb19sYXRlbmN5KV0gJiYgJHZhcnModXBkYXRlX2lvX2xhdGVuY3kpfSB7CiMgICAgICAgICAgICAgICB1cGRhdGVfaW9fbGF0ZW5jeQojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHN3aXRjaF90b19wcm9wYWdhdGVkfSB7CiAgICAgICAgICAgICAgIHNldCBwcm9wX3NkYyAicHJvcC5zZGMiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBwcm9wX3NkYyAiIgogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoIG1vZGUgJHZhcnMoY29uc3RyYWludF9tb2RlcykgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2xzZWFyY2ggXFthbGxfY29uc3RyYWludF9tb2Rlc1xdICRtb2RlXF0gIT0gLTF9IHtcbiIKICAgICAgICAgICAgICAgaWYgeyR1cGRhdGV9IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLGluY3JfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoJG1vZGUscG9zdF9jdHNfc2RjX2xpc3QpIFxbY29uY2F0IFxbZ2V0X2NvbnN0cmFpbnRfbW9kZSAkbW9kZSAtaWxtX3NkY19maWxlc1xdICR2YXJzKCRtb2RlLGluY3JfY3RzX3NkYykgJHByb3Bfc2RjXF1cbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkbW9kZSxwb3N0X2N0c19zZGNfbGlzdCkgXFtjb25jYXQgXFtnZXRfY29uc3RyYWludF9tb2RlICRtb2RlIC1zZGNfZmlsZXNcXSAkdmFycygkbW9kZSxpbmNyX2N0c19zZGMpICRwcm9wX3NkY1xdXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IFdBUk5JTkc6IEJPVEggdmFycygkbW9kZSxpbmNyX2N0c19zZGMpIEFORCB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkYykgQVJFIERFRklORUQgLi4uIgogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICAiPEZGPiAgICAgICAgICBVU0lORyB2YXJzKCRtb2RlLGluY3JfY3RzX3NkYykiCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoJG1vZGUscG9zdF9jdHNfc2RjX2xpc3QpIFxbY29uY2F0ICR2YXJzKCRtb2RlLHBvc3RfY3RzX3NkYykgJHByb3Bfc2RjXF1cbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGlsbSl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGN0c19lbmdpbmUpID09ICJjdHMiIHx8ICgkdmFycyhzdGVwKSA9PSAiYXNzZW1ibGUiKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkY19saXN0KSBcW2NvbmNhdCBcW2dldF9jb25zdHJhaW50X21vZGUgJG1vZGUgLWlsbV9zZGNfZmlsZXNcXSAkcHJvcF9zZGNcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoc3RlcCkgIT0gImFzc2VtYmxlIn0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY3RzIiB8fCAoJHZhcnMoc3RlcCkgPT0gImFzc2VtYmxlIil9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkbW9kZSxwb3N0X2N0c19zZGNfbGlzdCkgXFtjb25jYXQgXFtnZXRfY29uc3RyYWludF9tb2RlICRtb2RlIC1zZGNfZmlsZXNcXSAkcHJvcF9zZGNcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoc3RlcCkgIT0gImFzc2VtYmxlIn0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY3RzIn0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkY19saXN0KSBcW2NvbmNhdCBcW2dldF9jb25zdHJhaW50X21vZGUgJG1vZGUgLWlsbV9zZGNfZmlsZXNcXSAkcHJvcF9zZGNcXVxuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXmFzc2VtYmxlIiAkdmFycyhzdGVwKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY3RzIn0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkY19saXN0KSBcW2NvbmNhdCBcW2dldF9jb25zdHJhaW50X21vZGUgJG1vZGUgLXNkY19maWxlc1xdICRwcm9wX3NkY1xdXG4iCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXmFzc2VtYmxlIiAkdmFycyhzdGVwKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyEkdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHJlc3RvcmUgXFtnZXRfZGIgdGltaW5nX2RlZmVyX21tbWNfb2JqX3VwZGF0ZXNcXVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kYiB0aW1pbmdfZGVmZXJfbW1tY19vYmpfdXBkYXRlcyB0cnVlXG4iCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgIGV4ZWMgL2Jpbi90b3VjaCBlbXB0eS5zZGMKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmb3JlYWNoIG1vZGUgXFthbGxfY29uc3RyYWludF9tb2Rlc1xdIHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBpZiB7XFtpbmZvIGV4aXN0cyB2YXJzKFwkbW9kZSxwb3N0X2N0c19zZGNfbGlzdClcXX0ge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIHVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgXCRtb2RlIC1pbG1fc2RjX2ZpbGVzIFwkdmFycyhcJG1vZGUscG9zdF9jdHNfc2RjX2xpc3QpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgfSBlbHNlIHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICBmb3JlYWNoIHZpZXcgXFthbGxfYW5hbHlzaXNfdmlld3NdIHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICAgICBzZXQgbSBcW3JlZ3N1YiBfXCR2aWV3IFwkbW9kZSBcIlwiXF1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICAgICBpZiB7XFtpbmZvIGV4aXN0cyB2YXJzKFwkbSxwb3N0X2N0c19zZGNfbGlzdClcXX0ge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgICAgICAgIHVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgXCRtb2RlIC1pbG1fc2RjX2ZpbGVzIFwkdmFycyhcJG0scG9zdF9jdHNfc2RjX2xpc3QpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgICAgfVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIH0gXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgfSBcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9IFxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZvcmVhY2ggbW9kZSBcW2FsbF9jb25zdHJhaW50X21vZGVzXF0gXHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBpZiBce1xbaW5mbyBleGlzdHMgdmFycyhcJG1vZGUscG9zdF9jdHNfc2RjX2xpc3QpXF1cfSBce1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIHVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgXCRtb2RlIC1zZGNfZmlsZXMgXCR2YXJzKFwkbW9kZSxwb3N0X2N0c19zZGNfbGlzdClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBcfSBlbHNlIFx7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgZm9yZWFjaCB2aWV3IFxbYWxsX2FuYWx5c2lzX3ZpZXdzXSBce1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgICAgIHNldCBtIFxbcmVnc3ViIF9cJHZpZXcgXCRtb2RlIFwiXCJcXVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgICAgIGlmIFx7XFtpbmZvIGV4aXN0cyB2YXJzKFwkbSxwb3N0X2N0c19zZGNfbGlzdClcXVx9IFx7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgICAgICAgdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSBcJG1vZGUgLXNkY19maWxlcyBcJHZhcnMoXCRtLHBvc3RfY3RzX3NkY19saXN0KVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgICAgIFx9XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgXH0gXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgXH0gXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXH0gXG4iCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHshJHZhcnMoaWxtKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9hbmFseXNpc192aWV3IC11cGRhdGVfdGltaW5nXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIHRpbWluZ19kZWZlcl9tbW1jX29ial91cGRhdGVzIFwkcmVzdG9yZVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aGlzX2luZGV4IFtsc2VhcmNoICR2YXJzKHN0ZXBzKSAkdmFycyhzdGVwKV0KICAgICAgICAgICAgc2V0IHByaW9yIFtsaW5kZXggJHZhcnMoc3RlcHMpIFtleHByICR0aGlzX2luZGV4IC0gMV1dCiAgICAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCBhcm91bmQgdmFycyhkYnNfZGlyKQogICAgICAgICAgICBpZiB7W2ZpbGUgaXNmaWxlIFtzdWJzdCAkdmFycyhkYnNfZGlyKV0vJHByaW9yLmVuYy5kYXQvbW1tYy9wYXRoZ3JvdXAuc2RjXX0gewogICAgICAgICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgYXJvdW5kIHZhcnMoZGJzX2RpcikKICAgICAgICAgICAgICAgc2V0IHZhcnMocGF0aF9ncm91cF9zZGMpIFtzdWJzdCAkdmFycyhkYnNfZGlyKV0vJHByaW9yLmVuYy5kYXQvbW1tYy9wYXRoZ3JvdXAuc2RjCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmZfcHJvY3M6OmxvYWRfcGF0aF9ncm91cHMgJHZhcnMocGF0aF9ncm91cF9zZGMpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBkZWZhdWx0IHsKICAgICAgICAgICAgcHV0cyAkdmFycyhjb2RnZW5fbG9nKSAiPEZGPiBJTlZBTElEIE9QVElPTiAuLi4gTVVTVCBCRSBFSVRIRVIgbWlubWF4IE9SIG1tbWMiCiAgICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCiAgIHByb2MgaW5pdGlhbGl6ZV90aW1pbmcge3t0eXBlIG1tbWN9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBpbml0CiAgICAgIGdsb2JhbCB3YXJuaW5ncwoKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKIyAgICAgICAgIHJldHVybiAiIgojICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElOSVRJQUxJWklORyBbc3RyaW5nIHRvdXBwZXIgJHR5cGVdIFRJTUlOR1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgaWYgeyR2YXJzKGRlYnVnKX0gewogICAgICAgICAgcHV0cyAiPERFQlVHPiBFeGVjdXRpbmcgcHJvYzogaW5pdGlhbGl6ZV90aW1pbmcgLi4uIgogICAgICB9CgogICAgICBzd2l0Y2ggJHR5cGUgewogICAgICAgICBtaW5tYXggewojICAgICAgICAgICAgaWYgeyhbbGxlbmd0aCAkdmFycyhyY19jb3JuZXJzKV0gPiAxKX0gewojICAgICAgICAgICAgICAgcHV0cyAgIjxGRj4gV0FSTklORzogVEhFIFwiZGVmYXVsdFwiIEZMT1cgU0hPVUxEIE9OTFkgSEFWRSBBIFNJTkdMRSBSQyBDT1JORVIiCiMgICAgICAgICAgICAgICBwdXRzICAiPEZGPiAgICAgICAgICBCVVQgW2xsZW5ndGggJHZhcnMocmNfY29ybmVycyldIENPUk5FUlMgQVJFIERFRklORUQgKCR2YXJzKHJjX2Nvcm5lcnMpKSIKIyAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBEZWZpbmUgUkMgY29ybmVycyBhbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSB0ZW1wZXJhdHVyZXMuICBUaGlzCiAgICAgICAgICAgICMgcmVxdWlyZXMgdGhhdCB0aGUgY2FwIHRhYmxlcyB1c2UgLWJlc3QvLXdvcnN0IHN5bnRheCBpbiB0aGUKICAgICAgICAgICAgIyBjb25maWd1cmF0aW9uIGZpbGUuICBTY2FsaW5nIGZhY3RvcnMgc2hvdWxkIGJlIGRlcml2ZWQgdXNpbmcKICAgICAgICAgICAgIyBPc3RyaWNoIFZhbHVlcyBmb3IgdGhlIGRlZmF1bHQgdGltaW5nIGVudmlyb25tZW50IGlzIGRlcml2ZWQKICAgICAgICAgICAgIyBmcm9tIHRoZSBkZWZhdWx0IHNldHVwIGFuZCBob2xkIGFuYWx5c2lzIHZpZXdzCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgICAgIHNldCBjb3JuZXJzKG1pbikgJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lcikKICAgICAgICAgICAgc2V0IGNvcm5lcnMobWF4KSAkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikKICAgICAgICAgICAgc2V0IGNvcm5lciAkdmFycygkY29ybmVycyhtYXgpLHJjX2Nvcm5lcikKCiMgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZW52KEZGX0tJVF9QQVRIKV19IHsKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBtYXggJHZhcnMoJHZhcnMoJGNvcm5lcnMobWF4KSxyY19jb3JuZXIpLFQpfV0gJiYKICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBtaW4gJHZhcnMoJHZhcnMoJGNvcm5lcnMobWluKSxyY19jb3JuZXIpLFQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFwKICAgICAgICAgICAgICAgICAgImRlZmluZVJDQ29ybmVyIC1sYXRlIHdvcnN0ICRtYXggLWVhcmx5IGJlc3QgJG1pblxuIgogICAgICAgICAgICB9CiMgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgIHB1dHMgIjxGRj4gVVNJTkcgU0lOR0xFIFJDIENPUk5FUiAkdmFycygkY29ybmVycyhtYXgpLHJjX2Nvcm5lcikiCiMgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkY29ybmVycyhtYXgpLHJjX2Nvcm5lciksVCldfSB7CiMgICAgICAgICAgICAgICAgIHNldEV4dHJhY3RSQ01vZGUgLXNjT3BUZW1wICR2YXJzKCR2YXJzKCRjb3JuZXJzKG1heCkscmNfY29ybmVyKSxUKQojICAgICAgICAgICAgICB9CiMgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgc2NhbGluZyBmYWN0b3JzIC4uLiBmb3IgcHJlLXJvdXRlIG9wdGltaXphdGlvbiwgdGhlIGRldGFpbGVkCiAgICAgICAgICAgICMgY2FwIGZhY3RvciBpcyBzZXQgdG8gdGhlIGRldGFpbGVkIGNsb2NrIGNhcCBmYWN0b3IuICBUaGlzIHdpbGwKICAgICAgICAgICAgIyBiZSByZXNldCBwb3N0LXJvdXRlCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJGNvcm5lcixwcmVfcm91dGVfcmVzX2ZhY3Rvcil9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1wcmVSb3V0ZV9yZXMgJGFyZyIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkY29ybmVyLHByZV9yb3V0ZV9jYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXByZVJvdXRlX2NhcCAkYXJnIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXByZVJvdXRlX2Nsa3JlcyAkYXJnIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXByZVJvdXRlX2Nsa2NhcCAkYXJnIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscG9zdF9yb3V0ZV9yZXNfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXBvc3RSb3V0ZV9yZXMgIgogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ10gPiAxfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJcIltsaW5kZXggJGFyZyAyXSxbbGluZGV4ICRhcmcgMV0sW2xpbmRleCAkYXJnIDBdXCIiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICRhcmcKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscG9zdF9yb3V0ZV9jYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXBvc3RSb3V0ZV9jYXAgIgogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ10gPiAxfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJcIltsaW5kZXggJGFyZyAyXSxbbGluZGV4ICRhcmcgMV0sW2xpbmRleCAkYXJnIDBdXCIiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICRhcmcKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscG9zdF9yb3V0ZV9jbGtfcmVzX2ZhY3Rvcil9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1wb3N0Um91dGVfY2xrcmVzICIKICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmddID4gMX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiXCJbbGluZGV4ICRhcmcgMl0sW2xpbmRleCAkYXJnIDFdLFtsaW5kZXggJGFyZyAwXVwiIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAkYXJnCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkY29ybmVyLHBvc3Rfcm91dGVfY2xrX2NhcF9mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtcG9zdFJvdXRlX2Nsa2NhcCAiCiAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIlwiW2xpbmRleCAkYXJnIDJdLFtsaW5kZXggJGFyZyAxXSxbbGluZGV4ICRhcmcgMF1cIiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgJGFyZwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJGNvcm5lcixwb3N0X3JvdXRlX3hjYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXBvc3RSb3V0ZV94Y2FwICIKICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmddID4gMX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiXCJbbGluZGV4ICRhcmcgMl0sW2xpbmRleCAkYXJnIDFdLFtsaW5kZXggJGFyZyAwXVwiIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAkYXJnCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFJDRmFjdG9yICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcmNfZmFjdG9yICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6ZGVyYXRlX3RpbWluZyBtaW5tYXhdCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgIG1tbWMgewogICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgQ1JFQVRJTkcgUkMgQ09STkVSUyAuLi5cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCByYyAkdmFycyhyY19jb3JuZXJzKSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIHNldCBub25fY29tbWFuZCAiIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHJjLHNjYWxlX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjcmVhdGVfcmNfY29ybmVyIC1uYW1lICRyYyIKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWNhcF90YWJsZSAkdmFycygkcmMsY2FwX3RhYmxlKSAiCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uICJjYXBfdGFibGUgdGVtcGVyYXR1cmUgcXJjX3RlY2giIHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJHJjLCRvcHRpb24pfV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtJG9wdGlvbiAkYXJnIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCBbRkY6OnNvdXJjZV9wbHVnICIkcmMsc2NhbGVfdGNsIl0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNyZWF0ZV9yY19jb3JuZXIgLW5hbWUgJHJjIgogICAgICAgICAgICAgICAgICBmb3JlYWNoIG9wdGlvbiAiY2FwX3RhYmxlIHRlbXBlcmF0dXJlIHFyY190ZWNoIiB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYywkb3B0aW9uKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLSRvcHRpb24gJGFyZyIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1jYXBfdGFibGUgJHZhcnMoJHJjLGNhcF90YWJsZSkgIgogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkcmMscHJlX3JvdXRlX3Jlc19mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcHJlX3JvdXRlX3JlcyAkYXJnIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbm9uX2NvbW1hbmQgIiMgLXByZV9yb3V0ZV9yZXMgXCR2YXJzKCRyYyxwcmVfcm91dGVfcmVzX2ZhY3RvcilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkcmMscHJlX3JvdXRlX2NhcF9mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcHJlX3JvdXRlX2NhcCAkYXJnIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbm9uX2NvbW1hbmQgIiMgLXByZV9yb3V0ZV9jYXAgXCR2YXJzKCRyYyxwcmVfcm91dGVfY2FwX2ZhY3RvcilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkcmMscHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXByZV9yb3V0ZV9jbG9ja19yZXMgJGFyZyIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIG5vbl9jb21tYW5kICIjIC1wcmVfcm91dGVfY2xvY2tfcmVzIFwkdmFycygkcmMscHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYyxwcmVfcm91dGVfY2xrX2NhcF9mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcHJlX3JvdXRlX2Nsb2NrX2NhcCAkYXJnIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbm9uX2NvbW1hbmQgIiMgLXByZV9yb3V0ZV9jbG9ja19jYXAgXCR2YXJzKCRyYyxwcmVfcm91dGVfY2xrX2NhcF9mYWN0b3IpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJHJjLHBvc3Rfcm91dGVfcmVzX2ZhY3Rvcil9XX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1wb3N0X3JvdXRlX3JlcyAiCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlwiJGFyZ1wiIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkYXJnCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIG5vbl9jb21tYW5kICIjIC1wb3N0X3JvdXRlX3JlcyBcJHZhcnMoJHJjLHBvc3Rfcm91dGVfcmVzX2ZhY3RvcilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkcmMscG9zdF9yb3V0ZV9jYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvc3Rfcm91dGVfY2FwICIKICAgICAgICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmddID4gMX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXCIkYXJnXCIiCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICRhcmcKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbm9uX2NvbW1hbmQgIiMgLXBvc3Rfcm91dGVfcmVzIFwkdmFycygkcmMscG9zdF9yb3V0ZV9jYXBfZmFjdG9yKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYyxwb3N0X3JvdXRlX2Nsa19yZXNfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvc3Rfcm91dGVfY2xvY2tfcmVzICIKICAgICAgICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmddID4gMX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXCIkYXJnXCIiCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICRhcmcKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbm9uX2NvbW1hbmQgIiMgLXBvc3Rfcm91dGVfY2xvY2tfcmVzIFwkdmFycygkcmMscG9zdF9yb3V0ZV9jbGtfcmVzX2ZhY3RvcilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkcmMscG9zdF9yb3V0ZV9jbGtfY2FwX2ZhY3Rvcil9XX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1wb3N0X3JvdXRlX2Nsb2NrX2NhcCAiCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlwiJGFyZ1wiIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkYXJnCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIG5vbl9jb21tYW5kICIjIC1wb3N0X3JvdXRlX2Nsb2NrX2NhcCBcJHZhcnMoJHJjLHBvc3Rfcm91dGVfY2xrX2NhcF9mYWN0b3IpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJHJjLHBvc3Rfcm91dGVfY3Jvc3NfY2FwKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvc3Rfcm91dGVfY3Jvc3NfY2FwICIKICAgICAgICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmddID4gMX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXCIkYXJnXCIiCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICRhcmcKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbm9uX2NvbW1hbmQgIiMgLXBvc3Rfcm91dGVfY3Jvc3NfY2FwIFwkdmFycygkcmMscG9zdF9yb3V0ZV94Y2FwX2ZhY3RvcilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9yY19jb3JuZXIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIGlmIHskbm9uX2NvbW1hbmQgIT0gIiJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBBZGRpdGlvbmFsICh1bnVzZWQpIG9wdGlvbnMgLi4uLlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRub25fY29tbWFuZAogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSB8fCAoW2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAhJHZhcnMoY3BmX3RpbWluZykpfSB7CiAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgICAgIyBDUEZfVElNSU5HID09IEZBTFNFCiAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjIDxGRj4gQ1JFQVRJTkcgTElCUkFSWSBTRVRTIC4uLlxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiI1xuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICAgICAgICAgICAgICBmb3JlYWNoIHNldCAkdmFycyhsaWJyYXJ5X3NldHMpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNyZWF0ZV9saWJyYXJ5X3NldCAtbmFtZSAkc2V0IC10aW1pbmcgXFtsaXN0ICIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiR2YXJzKCRzZXQsdGltaW5nKSAiCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2xpYnJhcnlfc2V0ICRjb21tYW5kXQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhvcGNvbmRzKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjIDxGRj4gQ1JFQVRJTkcgT1BFUkFUSU5HIENPTkRJVElPTlMgLi4uXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBvcGNvbmQgJHZhcnMob3Bjb25kcykgewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiY3JlYXRlX29wY29uZCAtbmFtZSAkb3Bjb25kIgogICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGFscmVhZHkgY2hlY2tlZCBzbyB3ZSBrbm93IHRoZXNlIG9wdGlvbnMgZXhpc3QKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG1hcChQKSBwcm9jZXNzCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBtYXAoVikgdm9sdGFnZQogICAgICAgICAgICAgICAgICAgICAgICBzZXQgbWFwKFQpIHRlbXBlcmF0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uICJQIFYgVCIgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC0kbWFwKCRvcHRpb24pICR2YXJzKCRvcGNvbmQsJG9wdGlvbikiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX29wY29uZCAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiI1xuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyA8RkY+IENSRUFUSU5HIERFTEFZIENPUk5FUlMgLi4uXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggYyAkdmFycyhkZWxheV9jb3JuZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfdGltaW5nX2NvbmRpdGlvbiAtbmFtZSB0XyRjIgogICAgICAgICAgICAgICAgICAgICBzZXQgZGNvbW1hbmQgImNyZWF0ZV9kZWxheV9jb3JuZXIgLW5hbWUgJGMiCiAgICAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjLGxpYnJhcnlfc2V0KX1dfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWxpYnJhcnlfc2V0ICRhcmciCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIHshW2NhdGNoIHtzZXQgZWFybHkgJHZhcnMoJGMsZWFybHlfbGlicmFyeV9zZXQpfV0gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBsYXRlICR2YXJzKCRjLGxhdGVfbGlicmFyeV9zZXQpfV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtZWFybHlfbGlicmFyeV9zZXQgJGVhcmx5IgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1sYXRlX2xpYnJhcnlfc2V0ICRsYXRlIgogICAgICAgICAgICAgICAgICAgICB9ICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBFUlJPUjogTGlicmFyeSBzZXRzIGZvciB0aW1pbmcgY29uZGl0aW9uICRjIG5vdCBkZWZpbmVkIHByb3Blcmx5IgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBkY29tbWFuZCAiIC1yY19jb3JuZXIgJHZhcnMoJGMscmNfY29ybmVyKSIKICAgICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBvcGNvbmQgJHZhcnMoJGMsb3Bjb25kKX1dICYmICFbY2F0Y2gge3NldCBsaWJyYXJ5ICR2YXJzKCRjLG9wY29uZF9saWJyYXJ5KX1dfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW9wY29uZF9saWJyYXJ5ICRsaWJyYXJ5IgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1vcGNvbmQgJG9wY29uZCIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBlYXJseSAkdmFycygkYyxlYXJseV9vcGNvbmRfbGlicmFyeSl9XSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIVtjYXRjaCB7c2V0IGxhdGUgJHZhcnMoJGMsbGF0ZV9vcGNvbmRfbGlicmFyeSl9XX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1lYXJseV9vcGNvbmRfbGlicmFyeSAkZWFybHkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWxhdGVfb3Bjb25kX2xpYnJhcnkgJGxhdGUiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBlYXJseV9vcGNvbmQgJHZhcnMoJGMsZWFybHlfb3Bjb25kKX1dICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhW2NhdGNoIHtzZXQgbGF0ZV9vcGNvbmQgJHZhcnMoJGMsbGF0ZV9vcGNvbmQpfV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtZWFybHlfb3Bjb25kICRlYXJseV9vcGNvbmQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWxhdGVfb3Bjb25kICRsYXRlX29wY29uZCIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGRjb21tYW5kICIgLXRpbWluZ19jb25kaXRpb24geyIKICAgICAgICAgICAgICAgICAgICAgaWYge1tjYXRjaCB7c2V0IGRvbWFpbnMgJHZhcnMoJGMscG93ZXJfZG9tYWlucyl9XX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZGNvbW1hbmQgInRfJGMiCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBhdHRyaWJ1dGVfbGlzdCAibGlicmFyeV9zZXQgb3Bjb25kX2xpYnJhcnkgb3Bjb25kIGlyZHJvcF9maWxlIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlX2xpYnJhcnlfc2V0IGVhcmx5X2xpYnJhcnlfc2V0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlX29wY29uZF9saWJyYXJ5IGVhcmx5X29wY29uZF9saWJyYXJ5IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlX29wY29uZCBlYXJseV9vcGNvbmQgbGF0ZV9pcmRyb3BfZmlsZSBlYXJseV9pcmRyb3BfZmlsZSIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBkb21haW4gJGRvbWFpbnMgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZGNvbW1hbmQgIiB0XyRjIgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZGNvbW1hbmQgIiAkZG9tYWluQHRfJGMiCiAgICMgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgdXBkYXRlX2RlbGF5X2Nvcm5lciAtbmFtZSAkYyAtcG93ZXJfZG9tYWluIFwiJGRvbWFpblwiIgogICAjICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBhdHRyICRhdHRyaWJ1dGVfbGlzdCB7CiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGMsJGRvbWFpbiwkYXR0cildfSB7CiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC0kYXR0ciAkdmFycygkYywkZG9tYWluLCRhdHRyKSIKICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAjICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAjICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IG9wY29uZCAkdmFycygkZG9tYWluLG9wY29uZCl9XSAmJgogICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgIVtjYXRjaCB7c2V0IGxpYnJhcnkgJHZhcnMoJGRvbWFpbixvcGNvbmRfbGlicmFyeSl9XX0gewogICAjICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1vcGNvbmRfbGlicmFyeSAkbGlicmFyeSIKICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtb3Bjb25kICRvcGNvbmQiCiAgICMgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBkY29tbWFuZCAiIH1cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV90aW1pbmdfY29uZGl0aW9uICRjb21tYW5kXQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2RlbGF5X2Nvcm5lciAkZGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjIDxGRj4gQ1JFQVRJTkcgQ09OU1RSQUlOVCBNT0RFUyAuLi5cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiNcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1hbmQKICAgCiAgICAgICAgICAgICAgICAgICMgVmFyaWFibGUgY2NvbW1hbmQgY2FwdHVyZXMgdGhlIGNvbnN0cmFpbnQgY3JlYXRpb24gZm9yIHRoZSB2aWV3X2RlZmluaXRpb24udGNsIAogICAgICAgICAgICAgICAgICAjIFZhcmlhYmxlIHVjb21tYW5kIGNhcHR1cmUgdGhlIGNvbnN0cmFpbnQgdXBkYXRlcyBmb3IgaGllci9pbG0gZmxvd3MKICAgICAgICAgICAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgICAgc2V0IGNjb21tYW5kICIiCiAgIAogICAgICAgICAgICAgICAgICBzZXQgYWN0aXZlX3ZpZXdzIFtsaXN0XQogICAgICAgICAgICAgICAgICBzZXQgYWN0aXZlX21vZGVzIFtsaXN0XQogICAKICAgICAgICAgICAgICAgICAgIyBHZXQgbW9kZXMgYWN0dWFsbHkgdXNlZCAuLi4gKGNoYW5nZWQgZnJvbSBhY3RpdmUgdG8gYWxsIHZpZXdzKQogICAgICAgICAgICAgICAgICBmb3JlYWNoIHZpZXcgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cyldIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICRhY3RpdmVfdmlld3MgJHZpZXddID09IC0xfSB7CiAgICMgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGFjdGl2ZV92aWV3cyAkdmlldwogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGFjdGl2ZV9tb2RlcyAkdmFycygkdmlldyxjb25zdHJhaW50X21vZGUpXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGFjdGl2ZV9tb2RlcyAkdmFycygkdmlldyxjb25zdHJhaW50X21vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICAgICBzZXQgZmxhdHRlbl9pbG0gMAogICAgICAgICAgICAgICAgICBmb3JlYWNoIGNvbnN0cmFpbnRfbW9kZSAkYWN0aXZlX21vZGVzIHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyEkdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmYXVsdCBmbGF0IGZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAgImNyZWF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJGNvbnN0cmFpbnRfbW9kZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItc2RjX2ZpbGVzIFxbbGlzdCAkdmFycygkY29uc3RyYWludF9tb2RlLHByZV9jdHNfc2RjKVxdICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2NvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkY29uc3RyYWludF9tb2RlLHN5bnRoX3NkYyldICYmICR2YXJzKHJjKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICJDb25zdHJhaW50IGZpbGUgbm90IGZvdW5kIGZvciAkY29uc3RyYWludF9tb2RlIC4uLiIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMocmMpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29uc3RyYWludF9tb2RlLHN5bnRoX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICAiY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSAkY29uc3RyYWludF9tb2RlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1zZGNfZmlsZXMgXFtsaXN0ICR2YXJzKCRjb25zdHJhaW50X21vZGUsc3ludGhfc2RjKVxdICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2NvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZGVmYXVsdF9zeW50aGVzaXNfbW9kZSkgJGNvbnN0cmFpbnRfbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICJDb25zdHJhaW50IGZpbGUgbm90IGZvdW5kIGZvciAkY29uc3RyYWludF9tb2RlIC4uLiIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGRlZmF1bHRfc3ludGhlc2lzX21vZGUpXX0geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEVSUk9SPiA6IFBsZWFzZSBkZWZpbmUgYSBzeW50aF9zZGMgZm9yIG9uZSBvZiB0aGUgY29uc3RyYWludCBtb2RlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdAogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBJTE0gZmxvdwogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgc2RjcyAiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAjIEhpZXJhcmNoeSArIElMTXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19pbG1fc2RjKV19IHsKICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1zZGNfZmlsZXMgXFtsaXN0ICR2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXF0gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjIC9iaW4vdG91Y2ggZW1wdHkuc2RjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzZGNzICItc2RjX2ZpbGVzIGVtcHR5LnNkYyAiIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc2RjcyAiLWlsbV9zZGNfZmlsZXMgXFtsaXN0ICR2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19pbG1fc2RjKVxdXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMgL2Jpbi90b3VjaCBlbXB0eS5zZGMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHNkY3MgIi1zZGNfZmlsZXMgZW1wdHkuc2RjICIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzZGNzICItaWxtX3NkY19maWxlcyBcW2xpc3QgJHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX3NkYylcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh0b3ApfSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB1Y29tbWFuZF19IHsgc2V0IHVjb21tYW5kICIifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAgInVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJGNvbnN0cmFpbnRfbW9kZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICRzZGNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWFuZCBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx1cGRhdGVfY29uc3RyYWludF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZHluYW1pY191cGRhdGUgMQogICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgICJjcmVhdGVfY29uc3RyYWludF9tb2RlIC1uYW1lICRjb25zdHJhaW50X21vZGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkc2RjcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2NvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAjIElMTSBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICAiY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSAkY29uc3RyYWludF9tb2RlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19pbG1fc2RjKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYyAvYmluL3RvdWNoIGVtcHR5LnNkYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc2RjcyAiLXNkY19maWxlcyBlbXB0eS5zZGMgIiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHNkY3MgIi1pbG1fc2RjX2ZpbGVzIFxbbGlzdCAkdmFycygkY29uc3RyYWludF9tb2RlLHByZV9jdHNfaWxtX3NkYylcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjIC9iaW4vdG91Y2ggZW1wdHkuc2RjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzZGNzICItc2RjX2ZpbGVzIGVtcHR5LnNkYyAiIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc2RjcyAiLWlsbV9zZGNfZmlsZXMgXFtsaXN0ICR2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXF1cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkc2RjcwogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2NvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjY29tbWFuZAogICAKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkeW5hbWljX3VwZGF0ZV0gJiYgJGR5bmFtaWNfdXBkYXRlfSB7CiAgICMgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAjICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImZvcmVhY2ggbW9kZSBcW2FsbF9jb25zdHJhaW50X21vZGVzXF0ge1xuIgogICAjICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgXCRtb2RlIC1zZGNfZmlsZXMgZW1wdHkuc2RjIFxcXG4iCiAgICMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgLWlsbV9zZGNfZmlsZXMgXFtnZXRfY29uc3RyYWludF9tb2RlIFwkbW9kZSAtc2RjX2ZpbGVzXF1cbiIKICAgIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiAgICMgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgCiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJmb3JlYWNoIG1vZGUgXFthbGxfY29uc3RyYWludF9tb2Rlc10gXHtcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIGZvcmVhY2ggdmlldyBcW2FsbF9hbmFseXNpc192aWV3c10gXHtcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIHNldCBtIFxbcmVnc3ViIF9cJHZpZXcgXCRtb2RlIFwiXCJcXVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgaWYgXHsoIFwkbSAhPSBcJG1vZGUgKSAmJiAoIFxbbHNlYXJjaCBcW2FsbF9jb25zdHJhaW50X21vZGVzXF0gXCRtXF0gIT0gLTEpIFx9IFx7XG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgICAgICB1cGRhdGVfY29uc3RyYWludF9tb2RlIC1uYW1lIFwkbW9kZSAtc2RjX2ZpbGVzIGVtcHR5LnNkYyAtaWxtX3NkY19maWxlcyBcW2dldF9jb25zdHJhaW50X21vZGUgXCRtIC1pbG1fc2RjX2ZpbGVzXF1cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIFx9XG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICBcfSBcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlx9IFxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZHluYW1pY191cGRhdGUgJGNvbW1hbmRdCiAgIAogICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoaWxtKX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZmxhdHRlbl9pbG0gImZsYXR0ZW5faWxtXG4iXQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gCgogICAgICAgICAgICAgICAgICBpZiB7KCR2YXJzKHVzZXJfbW9kZSkgPT0gImhpZXIiKSAmJiAhW2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHsoJHZhcnMoc3RlcCkgPT0gImFzc2VtYmxlIikgfHwgKCR2YXJzKHN0ZXApID09ICJyZWJ1ZGdldCIpIHx8ICgkdmFycyhzdGVwKSA9PSAiYXNzZW1ibGVfZmxleGlsbSIpIHx8ICgkdmFycyhzdGVwKSA9PSAicGFydGl0aW9uX3BsYWNlIikgfHwgKCR2YXJzKHN0ZXApID09ICJtb2RlbF9nZW4iKX0gewogICAgICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBtbW1jIGZpbGUgZm9yIHBhcnRpdGlvbiBhbmQgYXNzZW1ibGUgc3RlcAogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL2luY3Jfdmlld19kZWZpbml0aW9uLnRjbAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgb3AgW29wZW4gJG1tbWNfZmlsZSB3XQogICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRvcCBbRkY6OnByZXR0eV9wcmludCAkY29tbWFuZHMgMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgJG9wCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKQogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICRtbW1jX2ZpbGUgd10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgW0ZGOjpwcmV0dHlfcHJpbnQgJGNvbW1hbmRzIDFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlICRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgI3JldHVybiAkY29tbWFuZHMKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIyBSZXR1cm4gb25seSBjb25zdHJhaW50IG1vZGUgdXBkYXRlcyBmb3IgdG9wIGxldmVsIGZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB1Y29tbWFuZF19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR1Y29tbWFuZAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHVjb21tYW5kXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHVjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldyldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpICIiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoYWxsX2FuYWx5c2lzX3ZpZXdzKSBcCiAgICAgICAgICAgICAgICAgICAgIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJHZhcnMoc2V0dXBfYW5hbHlzaXNfdmlld3MpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldyldXQogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiNcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgPEZGPiBDUkVBVElORyBBTkFMWVNJUyBWSUVXUyAuLi5cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiNcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBmb3JlYWNoIHZpZXcgJHZhcnMoYWxsX2FuYWx5c2lzX3ZpZXdzKSB7CiMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiaWYge1xbbHNlYXJjaCBcW2FsbF9hbmFseXNpc192aWV3c1xdICR2aWV3XF0gPT0gLTF9IHtcbiIKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZmF1bHRfc3ludGhlc2lzX21vZGUpXSAmJiAoJHZhcnMoJHZpZXcsY29uc3RyYWludF9tb2RlKSA9PSAkdmFycyhkZWZhdWx0X3N5bnRoZXNpc19tb2RlKSl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZGVmYXVsdF9zeW50aGVzaXNfdmlldykgJHZpZXcKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiY3JlYXRlX2FuYWx5c2lzX3ZpZXciCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtbmFtZSAkdmlldyIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1jb25zdHJhaW50X21vZGUgJHZhcnMoJHZpZXcsY29uc3RyYWludF9tb2RlKSIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1kZWxheV9jb3JuZXIgJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKVxuIgojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2FuYWx5c2lzX3ZpZXcgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZ2VuX3Bvc3Rsb2FkKV19IHsgCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGMgJHZhcnMoZGVsYXlfY29ybmVycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGRvbWFpbnMgJHZhcnMoJGMscG93ZXJfZG9tYWlucyl9XX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGRvbWFpbiAkZG9tYWlucyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgdXBkYXRlX2RlbGF5X2Nvcm5lciAtbmFtZSAkYyAtcG93ZXJfZG9tYWluIFwiJGRvbWFpblwiXG4iCiAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IG9wY29uZCAkdmFycygkZG9tYWluLG9wY29uZCl9XSAmJgogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBsaWJyYXJ5ICR2YXJzKCRkb21haW4sb3Bjb25kX2xpYnJhcnkpfV19IHsKICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW9wY29uZF9saWJyYXJ5ICRsaWJyYXJ5IgogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtb3Bjb25kICRvcGNvbmQiCiAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBpbml0LHVwZGF0ZV9kZWxheV9jb3JuZXIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICAgICAgICMgQ1BGX1RJTUlORyA9PSBUUlVFCiAgICAgICAgICAgICAgICAgICMgU2luY2UgdGhlIGRlbGF5IGNvcm5lciBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBDUEYsIHRoZXkKICAgICAgICAgICAgICAgICAgIyBhcmUgbm90IGtub3duLiAgSG93ZXZlciwgdGhleSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICMgYW5hbHlzaXNfdmlld3MKICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAKICAgIyAgICAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAjICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBVUERBVElORyBERUxBWSBDT1JORVJTICAuLi5cbiIKICAgIyAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhkZWxheV9jb3JuZXJzKV19IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZGVsYXlfY29ybmVycykgW0ZGOjpbZ2V0X2J5X3N1ZmZpeCB2YXJzICIscmNfY29ybmVyIl1dCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBjb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiaWYge1xbbHNlYXJjaCAtZXhhY3QgXFthbGxfZGVsYXlfY29ybmVyc1xdICRjb3JuZXJcXSAhPSAtMX0ge1xuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgdXBkYXRlX2RlbGF5X2Nvcm5lciAtbmFtZSAkY29ybmVyIC1yY19jb3JuZXIgJHZhcnMoJGNvcm5lcixyY19jb3JuZXIpXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV9kZWxheV9jb3JuZXIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgICAgIyBVcGRhdGUgY29uc3RyYWludHMgbW9kZXMgaWYgYW4gSUxNIGZsb3cKICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAgICAgICBzZXQgY2NvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBjb25zdHJhaW50X21vZGUgJHZhcnMoY29uc3RyYWludF9tb2RlcykgewogICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoaWxtKX0gewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAgInVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJGNvbnN0cmFpbnRfbW9kZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICAiY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSAkY29uc3RyYWludF9tb2RlICIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX2lsbV9zZGMpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXNkY19maWxlcyBcW2xpc3QgJHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX3NkYylcXSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItaWxtX3NkY19maWxlcyBcW2xpc3QgJHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX2lsbV9zZGMpXF0gIgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjIC9iaW4vdG91Y2ggZW1wdHkuc2RjCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItc2RjX2ZpbGVzIGVtcHR5LnNkYyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItaWxtX3NkY19maWxlcyBcW2xpc3QgJHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX3NkYylcXSAiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2NvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNjb21tYW5kIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9jb25zdHJhaW50X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICAgICAgICMgUmV0dXJuIGVhcmx5IGZvciBwYXJ0aXRpb24gaW1wbGVtZW50YXRpb24gZmxvd3MgLi4uCiAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgICAgaWYgeygoJHZhcnMobW9kZSkgPT0gImhpZXIiKSB8fCAoW2luZm8gZXhpc3RzIHZhcnMoaGllcildICYmICR2YXJzKGhpZXIpKSkgJiYgKCR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb24iKX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZHMgJGNjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjY29tbWFuZAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFVwZGF0ZSBsaWJyYXJ5X3NldHMgd2l0aCBTSSBsaWJyYXJpZXMgaWYgZGVmaW5lZAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojICAgICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFVQREFUSU5HIExJQlJBUlkgU0VUUyAgLi4uXG4iCiMgICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgIGZvcmVhY2ggc2V0ICR2YXJzKGxpYnJhcnlfc2V0cykgewogICAgICAgICAgICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKCRzZXQsc2kpXSAmJiAoJHZhcnMoJHNldCxzaSkgIT0gIiIpKSB8fCBcCiAgICAgICAgICAgICAgICAgICAoW2luZm8gZXhpc3RzIHZhcnMoJHNldCxzb2N2KV0gJiYgKCR2YXJzKCRzZXQsc29jdikgIT0gIiIpKSB8fCBcCiAgICAgICAgICAgICAgICAgICAoW2luZm8gZXhpc3RzIHZhcnMoJHNldCxhb2N2KV0gJiYgKCR2YXJzKCRzZXQsYW9jdikgIT0gIiIpKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidXBkYXRlX2xpYnJhcnlfc2V0IC1uYW1lICRzZXQiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRzZXQsc29jdildICYmICgkdmFycygkc2V0LHNvY3YpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1zb2N2IFxbbGlzdCIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKCRzZXQsc29jdikgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICRmaWxlIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHNldCxhb2N2KV0gJiYgKCR2YXJzKCRzZXQsYW9jdikgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWFvY3YgXFtsaXN0IgogICAgICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJHNldCxhb2N2KSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgJGZpbGUiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxdIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc2V0LHNpKV0gJiYgKCR2YXJzKCRzZXQsc2kpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1zaSBcW2xpc3QiCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkc2V0LHNpKSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgJGZpbGUiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxdIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2xpYnJhcnlfc2V0ICRjb21tYW5kXQoKIyAgICAgICAgICAgIGlmIHskdmFycyhmbG93KSAhPSAibW1tYyJ9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OnVwZGF0ZV90aW1pbmcgbW1tY10KIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6ZGVyYXRlX3RpbWluZyBtbW1jXQojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgRGVmaW5lIHNldHVwIC8gaG9sZCBhbmFseXNpcyB2aWV3cyBhbmQgZW5hYmxlIHRoZSBkZWZhdWx0IHZpZXdzCiAgICAgICAgICAgICMgZm9yIGVhY2gKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfYW5hbHlzaXNfdmlldyIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLXNldHVwIFxbbGlzdCAkdmFycyhhY3RpdmVfc2V0dXBfdmlld3MpXF0iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1ob2xkIFxbbGlzdCAkdmFycyhhY3RpdmVfaG9sZF92aWV3cylcXVxuIgogICAgICAgICAgICBmaWxlIG1rZGlyICR2YXJzKHNjcmlwdF9kaXIpCiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoZmxhdCkgIT0gImZ1bGwifSB7CiAgICAgICAgICAgICAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9tbW1jLnRjbCB3XQogICAgICAgICAgICAgICAgICBwdXRzICRvcCBbRkY6OnByZXR0eV9wcmludCAkY29tbWFuZHMgMV0KICAgICAgICAgICAgICAgICAgY2xvc2UgJG9wCiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kcyAic291cmNlIFwkdmFycyhzY3JpcHRfZGlyKS9tbW1jLnRjbFxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnMoc2NyaXB0X2RpcikvaW5jcl92aWV3X2RlZmluaXRpb24udGNsCiAgICAgICAgICAgICAgICAgIHNldCBvcCBbb3BlbiAkbW1tY19maWxlIHddCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wIFtGRjo6cHJldHR5X3ByaW50ICRjb21tYW5kcyAxXQogICAgICAgICAgICAgICAgICBjbG9zZSAkb3AKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnMoc2NyaXB0X2Rpcikvdmlld19kZWZpbml0aW9uLnRjbAogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKSAkbW1tY19maWxlCiAgICAgICAgICAgICAgICAgICAgIHNldCBvcCBbb3BlbiAkbW1tY19maWxlIHddCiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wIFtGRjo6cHJldHR5X3ByaW50ICRjb21tYW5kcyAxXQogICAgICAgICAgICAgICAgICAgICBjbG9zZSAkb3AKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdCB7CiAgICAgICAgICAgIHB1dHMgICI8RkY+IElOVkFMSUQgT1BUSU9OIC4uLiBNVVNUIEJFIEVJVEhFUiBtaW5tYXggT1IgbW1tYyIKICAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQoKICAgcHJvYyB1cGRhdGVfcmNfY29ybmVycyB7fSB7CgogICAgICBnbG9iYWwgdmFycwoKICAgICAgZm9yZWFjaCByY19jb3JuZXIgW2FsbF9yY19jb3JuZXJzXSB7CiAgICAgICAgIGlmIHskcmNfY29ybmVyICE9ICJkZWZhdWx0X3JjX2Nvcm5lciJ9IHsKICAgICAgICAgICAgc2V0IHVwZGF0ZSBmYWxzZQogICAgICAgICAgICBzZXQgY29tbWFuZCAidXBkYXRlX3JjX2Nvcm5lciAtbmFtZSAkcmNfY29ybmVyICIKICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLWNhcF90YWJsZV0gIT0gJHZhcnMoJHJjX2Nvcm5lcixjYXBfdGFibGUpfSB7CiAgICAgICAgICAgICAgIHNldCB1cGRhdGUgdHJ1ZQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLWNhcF90YWJsZSAkdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSkgIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbZ2V0X3JjX2Nvcm5lciAkcmNfY29ybmVyIC1wcmVSb3V0ZV9yZXNdICE9ICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX3Jlc19mYWN0b3IpfSB7CiAgICAgICAgICAgICAgIHNldCB1cGRhdGUgdHJ1ZQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXByZVJvdXRlX3JlcyAkdmFycygkcmNfY29ybmVyLHByZV9yb3V0ZV9yZXNfZmFjdG9yKSAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLXByZVJvdXRlX2NhcF0gIT0gJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfY2FwX2ZhY3Rvcil9IHsKICAgICAgICAgICAgICAgc2V0IHVwZGF0ZSB0cnVlCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcHJlUm91dGVfY2FwICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX2NhcF9mYWN0b3IpICIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2dldF9yY19jb3JuZXIgJHJjX2Nvcm5lciAtcG9zdFJvdXRlX3Jlc10gIT0gJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX3Jlc19mYWN0b3IpfSB7CiAgICAgICAgICAgICAgIHNldCB1cGRhdGUgdHJ1ZQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXBvc3RSb3V0ZV9yZXMgXCIkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfcmVzX2ZhY3RvcilcIiAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLXBvc3RSb3V0ZV9jYXBdICE9ICR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9jYXBfZmFjdG9yKX0gewogICAgICAgICAgICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wb3N0Um91dGVfY2FwIFwiJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX2NhcF9mYWN0b3IpXCIgIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbZ2V0X3JjX2Nvcm5lciAkcmNfY29ybmVyIC1wcmVSb3V0ZV9jbGtyZXNdICE9ICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yKX0gewogICAgICAgICAgICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wcmVSb3V0ZV9jbGtyZXMgJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfY2xrX3Jlc19mYWN0b3IpICIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2dldF9yY19jb3JuZXIgJHJjX2Nvcm5lciAtcHJlUm91dGVfY2xrY2FwXSAhPSAkdmFycygkcmNfY29ybmVyLHByZV9yb3V0ZV9jbGtfY2FwX2ZhY3Rvcil9IHsKICAgICAgICAgICAgICAgc2V0IHVwZGF0ZSB0cnVlCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcHJlUm91dGVfY2xrY2FwICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yKSAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLXBvc3RSb3V0ZV9jbGtyZXNdICE9ICR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9jbGtfcmVzX2ZhY3Rvcil9IHsKICAgICAgICAgICAgICAgc2V0IHVwZGF0ZSB0cnVlCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcG9zdFJvdXRlX2Nsa3JlcyBcIiR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9jbGtfcmVzX2ZhY3RvcilcIiAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLXBvc3RSb3V0ZV9jbGtjYXBdICE9ICR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9jbGtfY2FwX2ZhY3Rvcil9IHsKICAgICAgICAgICAgICAgc2V0IHVwZGF0ZSB0cnVlCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcG9zdFJvdXRlX2Nsa2NhcCBcIiR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9jbGtfY2FwX2ZhY3RvcilcIiAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLXBvc3RSb3V0ZV94Y2FwXSAhPSAkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfeGNhcF9mYWN0b3IpfSB7CiAgICAgICAgICAgICAgIHNldCB1cGRhdGUgdHJ1ZQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXBvc3RSb3V0ZV94Y2FwIFwiJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX3hjYXBfZmFjdG9yKVwiICIKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoIG9wdGlvbiAiVCBxeF90ZWNoX2ZpbGUgcXhfY29uZl9maWxlIHF4X2xpYl9maWxlIiB7CiAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHJjX2Nvcm5lciwkb3B0aW9uKV19IHsKICAgICAgICAgICAgICAgICAgIGlmIHtbZ2V0X3JjX2Nvcm5lciAkcmNfY29ybmVyIC0kb3B0aW9uXSAhPSAkdmFycygkcmNfY29ybmVyLCRvcHRpb24pfSB7CiAgICAgICAgICAgICAgICAgICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItJG9wdGlvbiAkdmFycygkcmNfY29ybmVyLCRvcHRpb24pICIKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHVwZGF0ZX0gewogICAgICAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmQKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgfQogICBwcm9jIHJlc2V0X3JjX2Nvcm5lcnMge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIGZvcmVhY2ggY29ybmVyICR2YXJzKHJjX2Nvcm5lcnMpIHsKICAgICAgICAgdXBkYXRlX3JjX2Nvcm5lciAtbmFtZSAkY29ybmVyIFwKICAgICAgICAgICAgLXByZVJvdXRlX3JlcyAxLjAgXAogICAgICAgICAgICAtcHJlUm91dGVfY2xrcmVzIDEuMCBcCiAgICAgICAgICAgIC1wcmVSb3V0ZV9jYXAgMS4wIFwKICAgICAgICAgICAgLXByZVJvdXRlX2Nsa2NhcCAxLjAgXAogICAgICAgICAgICAtcG9zdFJvdXRlX3JlcyAxLjAgXAogICAgICAgICAgICAtcG9zdFJvdXRlX2Nsa3JlcyAxLjAgXAogICAgICAgICAgICAtcG9zdFJvdXRlX2NhcCAxLjAgXAogICAgICAgICAgICAtcG9zdFJvdXRlX2Nsa19hcCAxLjAgXAogICAgICAgICAgICAtcG9zdFJvdXRlX3hjYXAgMS4wCiAgICAgIH0KICAgfQogICBwcm9jIGFkZF92aWV3cyB7fSB7CgogICAgICBnbG9iYWwgdmFycwoKICAgICAgcHV0cyAiPEZGPiBDUkVBVElORyBSQyBDT1JORVJTIC4uLiIKICAgICAgZm9yZWFjaCByY19jb3JuZXIgJHZhcnMocmNfY29ybmVycykgewogICAgICAgICBpZiB7W2xzZWFyY2ggW2FsbF9yY19jb3JuZXJzXSAkcmNfY29ybmVyXSA9PSAtMX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiY3JlYXRlX3JjX2Nvcm5lciAtbmFtZSAkcmNfY29ybmVyICIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1jYXBfdGFibGUgJHZhcnMoJHJjX2Nvcm5lcixjYXBfdGFibGUpXF0gIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXByZVJvdXRlX3JlcyAkdmFycygkcmNfY29ybmVyLHByZV9yb3V0ZV9yZXNfZmFjdG9yKSAiCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcHJlUm91dGVfY2xrcmVzICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yKSAiCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcHJlUm91dGVfY2FwICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX2NhcF9mYWN0b3IpICIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wcmVSb3V0ZV9jbGtjYXAgJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfY2xrX2NhcF9mYWN0b3IpICIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wb3N0Um91dGVfcmVzIFwiJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX3Jlc19mYWN0b3IpXCIgIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXBvc3RSb3V0ZV9jbGtyZXMgXCIkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfY2xrX3Jlc19mYWN0b3IpXCIgIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXBvc3RSb3V0ZV9jYXAgXCIkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfY2FwX2ZhY3RvcilcIiAiCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcG9zdFJvdXRlX2Nsa2NhcCBcIiR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9jbGtfY2FwX2ZhY3RvcilcIiAiCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcG9zdFJvdXRlX3hjYXAgJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX3hjYXBfZmFjdG9yKSAiCiAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uICJUIHF4X3RlY2hfZmlsZSBxeF9jb25mX2ZpbGUgcXhfbGliX2ZpbGUiIHsKICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLCRvcHRpb24pXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLSRvcHRpb24gJHZhcnMoJHJjX2Nvcm5lciwkb3B0aW9uKSAiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyFbRkY6OmlzX2xwX2Zsb3ddIHx8IFwKICAgICAgICAgIChbRkY6OmlzX2xwX2Zsb3ddICYmIChbbGxlbmd0aCBbYWxsX2FuYWx5c2lzX3ZpZXdzXV0gPT0gMikpfSB7CgogICAgICAgICBwdXRzICI8RkY+IENSRUFUSU5HIExJQlJBUlkgU0VUUyAuLi4iCiAgICAgICAgIGZvcmVhY2ggbGlicmFyeV9zZXQgJHZhcnMobGlicmFyeV9zZXRzKSB7CiAgICAgICAgICAgIGlmIHtbbHNlYXJjaCBbYWxsX2xpYnJhcnlfc2V0c10gJGxpYnJhcnlfc2V0XSA9PSAtMX0gewogICAgICAgICAgICAgICBjcmVhdGVfbGlicmFyeV9zZXQgLW5hbWUgJGxpYnJhcnlfc2V0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC10aW1pbmcgJHZhcnMoJGxpYnJhcnlfc2V0LHRpbWluZykKICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBwdXRzICI8RkY+IENSRUFUSU5HIERFTEFZIENPUk5FUlMgLi4uXG4iCiAgICAgICAgIGZvcmVhY2ggZGVsYXlfY29ybmVyICR2YXJzKGRlbGF5X2Nvcm5lcnMpIHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoIFthbGxfZGVsYXlfY29ybmVyc10gJGRlbGF5X2Nvcm5lcl0gPT0gLTF9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNyZWF0ZV9kZWxheV9jb3JuZXIgLW5hbWUgJGRlbGF5X2Nvcm5lciAiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItbGlicmFyeV9zZXQgJHZhcnMoJGRlbGF5X2Nvcm5lcixsaWJyYXJ5X3NldCkgIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXJjX2Nvcm5lciAkdmFycygkZGVsYXlfY29ybmVyLHJjX2Nvcm5lcikgIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRlbGF5X2Nvcm5lcixvcGNvbmQpXSAmJiBbaW5mbyBleGlzdHMgdmFycygkZGVsYXlfY29ybmVyLG9wY29uZF9saWJyYXJ5KV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1vcGNvbmRfbGlicmFyeSAkdmFycygkZGVsYXlfY29ybmVyLG9wY29uZF9saWJyYXJ5KSAiCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItb3Bjb25kICR2YXJzKCRkZWxheV9jb3JuZXIsb3Bjb25kKSAiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kCiAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgZG9tYWlucyAkdmFycygkYyxwb3dlcl9kb21haW5zKX1dfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIgdXBkYXRlX2RlbGF5X2Nvcm5lciAtbmFtZSAkYyAtcG93ZXJfZG9tYWlucyBcIiRkb21haW5zXCIiCiAgICAgICAgICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgcHV0cyAiPEZGPiBVUERBVElORyBDT05TVFJBSU5UIE1PREVTIC4uLiIKICAgICAgICAgZm9yZWFjaCBtb2RlICR2YXJzKGNvbnN0cmFpbnRfbW9kZXMpIHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoIFthbGxfY29uc3RyYWludF9tb2Rlc10gJG1vZGVdID09IC0xfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkbW9kZSxwcmVfY3RzX3NkYyxmdWxsKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfY29uc3RyYWludF9tb2RlICIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLW5hbWUgJG1vZGUgIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtc2RjX2ZpbGVzICR2YXJzKCRtb2RlLHByZV9jdHNfc2RjLGZ1bGwpXG4iCiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkbW9kZSxwcmVfY3RzX3NkYyl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfY29uc3RyYWludF9tb2RlICIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLW5hbWUgJG1vZGUgIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtc2RjX2ZpbGVzICR2YXJzKCRtb2RlLHByZV9jdHNfc2RjKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgc2V0IHZhcnMoYWxsX2FuYWx5c2lzX3ZpZXdzKSBbbHNvcnQgLXVuaXEgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cyldXQogICAgICAgICBwdXRzICI8RkY+IFVQREFUSU5HIEFOQUxZU0lTIFZJRVdTIC4uLiIKCiAgICAgICAgIGZvcmVhY2ggYW5hbHlzaXNfdmlldyAkdmFycyhhbGxfYW5hbHlzaXNfdmlld3MpIHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoIFthbGxfYW5hbHlzaXNfdmlld3NdICRhbmFseXNpc192aWV3XSA9PSAtMX0gewogICAgICAgICAgICAgICBjcmVhdGVfYW5hbHlzaXNfdmlldyAtbmFtZSAkYW5hbHlzaXNfdmlldyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25zdHJhaW50X21vZGUgJHZhcnMoJGFuYWx5c2lzX3ZpZXcsY29uc3RyYWludF9tb2RlKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1kZWxheV9jb3JuZXIgJHZhcnMoJGFuYWx5c2lzX3ZpZXcsZGVsYXlfY29ybmVyKQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBTaW5jZSB0aGUgZGVsYXkgY29ybmVyIG5hbWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIENQRiwgdGhleSBhcmUgbm90CiAgICMga25vd24uICBIb3dldmVyLCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgYW5hbHlzaXNfdmlld3MKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICBwdXRzICI8RkY+IFVQREFUSU5HIERFTEFZIENPUk5FUlMgIC4uLiIKICAgICAgICAgZm9yZWFjaCBjb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewogICAgICAgICAgICBwdXRzICJVcGRhdGluZyBkZWxheSBjb3JuZXIgJGNvcm5lciB3aXRoIFJDIENvcm5lciAkdmFycygkY29ybmVyLHJjX2Nvcm5lcikgLi4uIgogICAgICAgICAgICB1cGRhdGVfZGVsYXlfY29ybmVyIC1uYW1lICRjb3JuZXIgLXJjX2Nvcm5lciAkdmFycygkY29ybmVyLHJjX2Nvcm5lcikKICAgICAgICAgfQogICAgICB9CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgVXBkYXRlIGxpYnJhcnlfc2V0cyB3aXRoIFNJIGxpYnJhcmllcyBpZiBkZWZpbmVkCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgcHV0cyAiPEZGPiBVUERBVElORyBMSUJSQVJZIFNFVFMgIC4uLiIKICAgICAgZm9yZWFjaCBsaWJyYXJ5X3NldCAkdmFycyhsaWJyYXJ5X3NldHMpIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRsaWJyYXJ5X3NldCxzaSldICYmICgkdmFycygkbGlicmFyeV9zZXQsc2kpICE9ICIiKX0gewogICAgICAgICAgICB1cGRhdGVfbGlicmFyeV9zZXQgLW5hbWUgJGxpYnJhcnlfc2V0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zaSAkdmFycygkbGlicmFyeV9zZXQsc2kpCiAgICAgICAgIH0KICAgICAgfQogICAgICBmb3JlYWNoIGxpYnJhcnlfc2V0ICR2YXJzKGxpYnJhcnlfc2V0cykgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LGFvY3YpXSAmJiAoJHZhcnMoJGxpYnJhcnlfc2V0LGFvY3YpICE9ICIiKX0gewogICAgICAgICAgICB1cGRhdGVfbGlicmFyeV9zZXQgLW5hbWUgJGxpYnJhcnlfc2V0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1hb2N2ICR2YXJzKCRsaWJyYXJ5X3NldCxhb2N2KQogICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yZWFjaCBsaWJyYXJ5X3NldCAkdmFycyhsaWJyYXJ5X3NldHMpIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRsaWJyYXJ5X3NldCxzb2N2KV0gJiYgKCR2YXJzKCRsaWJyYXJ5X3NldCxzb2N2KSAhPSAiIil9IHsKICAgICAgICAgICAgdXBkYXRlX2xpYnJhcnlfc2V0IC1uYW1lICRsaWJyYXJ5X3NldCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc29jdiAkdmFycygkbGlicmFyeV9zZXQsc29jdikKICAgICAgICAgfQogICAgICB9CgogICAgICBzZXRfaW50ZXJhY3RpdmVfY29uc3RyYWludF9tb2RlcyBbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZV0KCiAgICAgIHB1dHMgIjxGRj4gREVSQVRJTkcgREVMQVkgQ09STkVSUyAuLi4iCiAgICAgIEZGX05PVlVTOjpkZXJhdGVfdGltaW5nIG1tbWMKCiMgICAgICBpZiB7JHZhcnMoZmxvdykgIT0gIm1tbWMifSB7CiMgICAgICAgICBGRl9OT1ZVUzo6dXBkYXRlX3RpbWluZyBtbW1jCiMgICAgICB9CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgRGVmaW5lIHNldHVwIC8gaG9sZCBhbmFseXNpcyB2aWV3cyBhbmQgZW5hYmxlIHRoZSBkZWZhdWx0IHZpZXdzIGZvciBlYWNoCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgc2V0X2FuYWx5c2lzX3ZpZXcgLXNldHVwICR2YXJzKGFjdGl2ZV9zZXR1cF92aWV3cykgLWhvbGQgJHZhcnMoYWN0aXZlX2hvbGRfdmlld3MpCiAgICAgIHNldF9kZWZhdWx0X3ZpZXcgLXNldHVwICR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldykgLWhvbGQgJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpCiAgIH0KCiAgIHByb2MgZ2V0X3Bvd2VyX2RvbWFpbnNfY29kZSB7fSB7CgogICAgICBnbG9iYWwgdmFycwoKICAgICAgc2V0IGNvbW1hbmRzICJzZXQgZG9tYWlucyBcW2xpc3QgXFtnZXRfZGIgcG93ZXJfZG9tYWluc1xdXF1cbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiZGJGb3JFYWNocG93ZXJfZG9tYWluIFxbZGJnSGVhZFxdIGRvbWFpbiB7XG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGlmIHtcW2RiR3JvdXBISW5zdExpc3QgXFtkYnBvd2VyX2RvbWFpbk5hbWUgXCRkb21haW5cXVxdICE9IFwiMHgwXCJ9IHtcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgbGFwcGVuZCBkb21haW5zIFxbZGJwb3dlcl9kb21haW5OYW1lIFwkZG9tYWluXF1cbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgfVxuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQoKCiAgIHByb2MgZ2V0X2Nsb2NrX3BvcnRzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgY29tbWFuZHMgIiIKCiAgICAgIGlmIHshJHZhcnMoY29kZWdlbikgfHwgKCR2YXJzKGNvZGVnZW4pICYmICgkdmFycyhmbGF0KSAhPSAibm9uZSIpKX0gewoKICAgICAgICAgaWYgeyR2YXJzKGlsbSl9IHsKICAgICAgICAgICAgaWYgeyR2YXJzKHN0ZXApICE9ICJjdHMifSB7IAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldElsbVR5cGUgLW1vZGVsIHNpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBjbG9ja19wb3J0cyBcW2xpc3RcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBjbG9ja3MgXFtnZXRfY2xvY2tzICpcXVxuIgoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmb3JlYWNoX2luX2NvbGxlY3Rpb24gY2xvY2sgXCRjbG9ja3Mge1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIHNldCBzb3VyY2VzICBcW2dldF9wcm9wZXJ0eSBcJGNsb2NrIHNvdXJjZXNcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGZvcmVhY2hfaW5fY29sbGVjdGlvbiBzb3VyY2UgXCRzb3VyY2VzIHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgIHNldCBzb3VyY2VfbmFtZSBcW2dldF9wcm9wZXJ0eSBcJHNvdXJjZSBoaWVyYXJjaGljYWxfbmFtZVxdXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICBzZXQgc291cmNlX3R5cGUgXFtnZXRfcHJvcGVydHkgXCRzb3VyY2Ugb2JqZWN0X3R5cGVcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgaWYge1wkc291cmNlX3R5cGUgPT0gXCJwb3J0XCJ9IHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICAgbGFwcGVuZCBjbG9ja19wb3J0cyBcJHNvdXJjZV9uYW1lXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIH1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgIH1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiRkY6OmdldF9jbG9ja19wb3J0c1xuIgogICAgICB9CiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQoKICAgcHJvYyBhZGRfdGllX2NlbGxzIHt7bW9kZSB0cnVlfSB7YWRkIHRydWV9fSB7CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBUaGlzIHByb2NlZHVyZSBpbnNlcnRzIHRpZSBoaS9sbyBjZWxscyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiB0aGUKICAgICAgIyBzZXR1cC50Y2wKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIEFERElORyBUSUUgQ0VMTFNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiAgICAgIHNldCBhcmdzICIiCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh0aWVfY2VsbHMsbWF4X2Rpc3RhbmNlKV19IHsKICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiBhZGRfdGllb2Zmc19tYXhfZGlzdGFuY2UgJHZhcnModGllX2NlbGxzLG1heF9kaXN0YW5jZSlcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModGllX2NlbGxzLG1heF9mYW5vdXQpXX0gewogICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIGFkZF90aWVvZmZzX21heF9mYW5vdXQgJHZhcnModGllX2NlbGxzLG1heF9mYW5vdXQpXG4iCiAgICAgIH0KCiAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddICYmIChbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9kb21haW5zKV0gJiYgKFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDEpKX0gewoKICAgICAgICAgIyBHZXQgdGhlIHNldCBvZiB0aWUgY2VsbHMgdG8gdXNlLCBib3RoIGRvbWFpbi1zcGVjaWZpYyBhbmQgZ2VuZXJpYy4KCiAgICAgICAgIHNldCBhbGxfdGllX2NlbGxzIFtsaXN0XQoKICAgICAgICAgc2V0IGhhc19kZWZhdWx0IGZhbHNlCiAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgZGVmYXVsdF9jZWxscyAkdmFycyh0aWVfY2VsbHMpfV19IHsKICAgICAgICAgICAgc2V0IGhhc19kZWZhdWx0IHRydWUKICAgICAgICAgICAgbGFwcGVuZCBhbGxfdGllX2NlbGxzICR2YXJzKHRpZV9jZWxscykKICAgICAgICAgfQogICAgICAgICBzZXQgaGFzX3NwZWNpZmljIGZhbHNlCiAgICAgICAgIGZvcmVhY2ggZG9tYWluIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIsdGllX2NlbGxzIl0gewogICAgICAgICAgICBzZXQgY2VsbHMgJHZhcnMoJGRvbWFpbix0aWVfY2VsbHMpCiAgICAgICAgICAgIGxhcHBlbmQgYWxsX3RpZV9jZWxscyAkdmFycygkZG9tYWluLHRpZV9jZWxscykKICAgICAgICAgICAgaWYgeyFbbGxlbmd0aCAkY2VsbHNdfSB7CiAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGhhc19zcGVjaWZpYyB0cnVlCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IHRpZV9jZWxscygkZG9tYWluKSBcW2xpc3QgJGNlbGxzXF1cbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICAgICB9CgogICAgICAgICAjCiAgICAgICAgICMgSWYgdGhlcmUgYXJlIG5vIHRpZSBjZWxscyBhdCBhbGwsIHRoZXJlJ3Mgbm90aGluZyB0byBkbwogICAgICAgICAjCgogICAgICAgICBpZiB7ISRoYXNfZGVmYXVsdCAmJiAhJGhhc19zcGVjaWZpY30gewogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgfQoKICAgICAgICAgc2V0IGFsbF90aWVfY2VsbHMgW2xzb3J0IC11bmlxdWUgW2pvaW4gJGFsbF90aWVfY2VsbHNdXQoKICAgICAgICAgIwogICAgICAgICAjIElmIHRoZXJlIGFyZSBubyBkb21haW4tc3BlY2lmaWMgZW50cmllcywgbGlmZSBpcyByZWFsIHNpbXBsZQogICAgICAgICAjCgojICAgICAgICAgaWYgeyEkaGFzX3NwZWNpZmljfSB7CiMgICAgICAgICAgICBzZXQgY29tbWFuZCAiXG5zZXRfZGIgYWRkX3RpZW9mZnNfY2VsbHMgXCIkZGVmYXVsdF9jZWxsc1wiXG4kYXJncyIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdGllX2hpX2xvX21vZGUgJGNvbW1hbmRdCiMgICAgICAgICAgICBpZiB7JGFkZH0gewojICAgICAgICAgICAgICAgZm9yZWFjaCBjZWxsICRkZWZhdWx0X2NlbGxzIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0RG9udFVzZSAkY2VsbCBmYWxzZVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDB9IHsKIyAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZG9tYWluICR2YXJzKHBvd2VyX2RvbWFpbnMpIHsKIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAgIiAgIGNhdGNoIHthZGRfdGllb2ZmcyAtcG93ZXJfZG9tYWluICRkb21haW4gLXByZWZpeCAkZG9tYWlufVxuIgojICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgZm9yZWFjaCBjZWxsICRkZWZhdWx0X2NlbGxzIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0RG9udFVzZSAkY2VsbCB0cnVlXG4iCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICB9CiMgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgZm9yZWFjaCBjZWxsICRkZWZhdWx0X2NlbGxzIHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0RG9udFVzZSAkY2VsbCBmYWxzZVxuIgojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2xsZW5ndGggJHZhcnMocG93ZXJfZG9tYWlucyldID4gMH0gewogICAgICAgICAgICAgICBmb3JlYWNoIGRvbWFpbiAkdmFycyhwb3dlcl9kb21haW5zKSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLHRpZV9jZWxscyldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJcbnNldF9kYiBhZGRfdGllb2Zmc19jZWxscyBcIiR2YXJzKCRkb21haW4sdGllX2NlbGxzKVwiXG4kYXJncyIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkZWZhdWx0X2NlbGxzXX0geyAKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIlxuc2V0X2RiIGFkZF90aWVvZmZzX2NlbGxzIFwiJGRlZmF1bHRfY2VsbHNcIlxuJGFyZ3MiCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3RpZV9oaV9sb19tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgICIgICBjYXRjaCB7YWRkX3RpZW9mZnMgLXBvd2VyX2RvbWFpbiAkZG9tYWluIC1wcmVmaXggJGRvbWFpbn1cbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgICAgICAgICAgICBmb3JlYWNoIGNlbGwgJGRlZmF1bHRfY2VsbHMgewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXREb250VXNlICRjZWxsIHRydWVcbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0KICAgICAgfSBlbHNlaWYgeyFbY2F0Y2gge3NldCBjZWxscyAkdmFycyh0aWVfY2VsbHMpfV19IHsKICAgICAgICAgc2V0IGNvbW1hbmQgIlxuc2V0X2RiIGFkZF90aWVvZmZzX2NlbGxzIFwiJGNlbGxzXCJcbiRhcmdzIgojICAgICAgICAgaWYgeyRtb2RlfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdGllX2hpX2xvX21vZGUgJGNvbW1hbmRdCiMgICAgICAgICB9CiAgICAgICAgICBzZXQgY29tbWFuZCAiIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImZvcmVhY2ggY2VsbCBceyRjZWxsc1x9IHtcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICBzZXREb250VXNlIFwkY2VsbCBmYWxzZVxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImFkZF90aWVvZmZzXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiZm9yZWFjaCBjZWxsIFx7JGNlbGxzXH0ge1xuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHNldERvbnRVc2UgXCRjZWxsIHRydWVcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgfQoKICAgICAgcmV0dXJuICRjb21tYW5kcwogICB9CgogICBwcm9jIGFkZF9maWxsZXJfY2VsbHMge30gewogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgVGhpcyBwcm9jZWR1cmUgaW5zZXJ0cyB0aWUgaGkvbG8gY2VsbHMgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gdGhlCiAgICAgICMgc2V0dXAudGNsCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgc2V0IGNjb21tYW5kcyAiIgogICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgYXBwZW5kIGNjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY2NvbW1hbmRzICIjIEFERCBGSUxMRVIgQ0VMTFNcbiIKICAgICAgICAgYXBwZW5kIGNjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgJGNjb21tYW5kcwoKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgKFtpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2RvbWFpbnMpXSAmJiAoW2xsZW5ndGggJHZhcnMocG93ZXJfZG9tYWlucyldID4gMSkpfSB7CgogICAgICAgICAjIEdldCB0aGUgc2V0IG9mIGZpbGxlciBjZWxscyB0byB1c2UsIGJvdGggZG9tYWluLXNwZWNpZmljIGFuZCBnZW5lcmljLgoKICAgICAgICAgc2V0IGFsbF9maWxsZXJfY2VsbHMgW2xpc3RdCgogICAgICAgICBzZXQgaGFzX2RlZmF1bHQgZmFsc2UKICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBkZWZhdWx0X2NlbGxzICR2YXJzKGZpbGxlcl9jZWxscyl9XX0gewogICAgICAgICAgICBzZXQgaGFzX2RlZmF1bHQgdHJ1ZQogICAgICAgICAgICBsYXBwZW5kIGFsbF9maWxsZXJfY2VsbHMgJHZhcnMoZmlsbGVyX2NlbGxzKQogICAgICAgICB9CiAgICAgICAgIHNldCBoYXNfc3BlY2lmaWMgZmFsc2UKICAgICAgICAgZm9yZWFjaCBkb21haW4gW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgIixmaWxsZXJfY2VsbHMiXSB7CiAgICAgICAgICAgIHNldCBjZWxscyAkdmFycygkZG9tYWluLGZpbGxlcl9jZWxscykKICAgICAgICAgICAgbGFwcGVuZCBhbGxfZmlsbGVyX2NlbGxzICR2YXJzKCRkb21haW4sZmlsbGVyX2NlbGxzKQogICAgICAgICAgICBpZiB7IVtsbGVuZ3RoICRjZWxsc119IHsKICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgaGFzX3NwZWNpZmljIHRydWUKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgZmlsbGVyX2NlbGxzKCRkb21haW4pIFxbbGlzdCAkY2VsbHNcXVxuIgojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCiAgICAgICAgIH0KCiAgICAgICAgICMKICAgICAgICAgIyBJZiB0aGVyZSBhcmUgbm8gZmlsbGVyIGNlbGxzIGF0IGFsbCwgdGhlcmUncyBub3RoaW5nIHRvIGRvCiAgICAgICAgICMKCiAgICAgICAgIGlmIHshJGhhc19kZWZhdWx0ICYmICEkaGFzX3NwZWNpZmljfSB7CiAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICB9CgogICAgICAgICBzZXQgYWxsX2ZpbGxlcl9jZWxscyBbbHNvcnQgLXVuaXF1ZSBbam9pbiAkYWxsX2ZpbGxlcl9jZWxsc11dCgogICAgICAgICAjCiAgICAgICAgICMgSWYgdGhlcmUgYXJlIG5vIGRvbWFpbi1zcGVjaWZpYyBlbnRyaWVzLCBsaWZlIGlzIHJlYWwgc2ltcGxlCiAgICAgICAgICMKCiMgICAgICAgICBpZiB7ISRoYXNfc3BlY2lmaWN9IHsKIyAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgYWRkX2ZpbGxlcnNfY2VsbHMgXCIkZGVmYXVsdF9jZWxsc1wiXG5zZXRfZGIgYWRkX2ZpbGxlcnNfcHJlZml4IEZJTExcbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZmlsbGVyX21vZGUgJGNvbW1hbmRdCiMgICAgICAgICAgICBpZiB7JGFkZH0gewojICAgICAgICAgICAgICAgZm9yZWFjaCBjZWxsICRkZWZhdWx0X2NlbGxzIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0RG9udFVzZSAkY2VsbCBmYWxzZVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDB9IHsKIyAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZG9tYWluICR2YXJzKHBvd2VyX2RvbWFpbnMpIHsKIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAgIiAgIGNhdGNoIHthZGRfZmlsbGVycyAtcG93ZXJfZG9tYWluICRkb21haW59XG4iCiMgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBmb3JlYWNoIGNlbGwgJGRlZmF1bHRfY2VsbHMgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXREb250VXNlICRjZWxsIHRydWVcbiIKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICBmb3JlYWNoIGNlbGwgJGRlZmF1bHRfY2VsbHMgewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXREb250VXNlICRjZWxsIGZhbHNlXG4iCiMgICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAwfSB7CiAgICAgICAgICAgICAgIHNldCBkZWZhdWx0IDAKICAgICAgICAgICAgICAgZm9yZWFjaCBkb21haW4gJHZhcnMocG93ZXJfZG9tYWlucykgewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRvbWFpbixmaWxsZXJfY2VsbHMpXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGFkZF9maWxsZXJzX2NlbGxzIFwiJHZhcnMoJGRvbWFpbixmaWxsZXJfY2VsbHMpXCJcbnNldF9kYiBhZGRfZmlsbGVyc19wcmVmaXggRklMTFxuIgogICAgICAgICAgICAgICAgICAgICBzZXQgZGVmYXVsdCAwCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZGVmYXVsdF9jZWxsc119IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyEkZGVmYXVsdH0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGFkZF9maWxsZXJzX2NlbGxzIFwiJGRlZmF1bHRfY2VsbHNcIlxuc2V0X2RiIGFkZF9maWxsZXJzX3ByZWZpeCBGSUxMXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBkZWZhdWx0IDEKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2ZpbGxlcl9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgICIgICBjYXRjaCB7YWRkX2ZpbGxlcnMgLXBvd2VyX2RvbWFpbiAkZG9tYWlufVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkZGVmYXVsdF9jZWxscyB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldERvbnRVc2UgJGNlbGwgdHJ1ZVxuIgojICAgICAgICAgICAgfQojICAgICAgIH0KICAgfSBlbHNlaWYgeyFbY2F0Y2gge3NldCBjZWxscyAkdmFycyhmaWxsZXJfY2VsbHMpfV19IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBhZGRfZmlsbGVyc19jZWxscyBcIiRjZWxsc1wiXG5zZXRfZGIgYWRkX2ZpbGxlcnNfcHJlZml4IEZJTExcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9maWxsZXJfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFkZF9maWxsZXJzXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgfQoKICAgICAgcmV0dXJuICRjb21tYW5kcwogICB9CgogICBwcm9jIGRlbGV0ZV9maWxsZXJfY2VsbHMge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSZW1vdmUgZmlsbGVyIGNlbGxzCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kICJkZWxldGVfZmlsbGVyXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZWxldGVfZmlsbGVyX2NlbGxzICRjb21tYW5kXQogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCiAgIHByb2MgaW5zZXJ0X3dlbGx0YXBzX2VuZGNhcHMge3tvdXRsaW5lIGZhbHNlfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbnNlcnQgd2VsbHRhcHMgYW5kIHByZS9wb3N0IGVuZGNhcHMKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgd2FybmluZ3MKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgKFtpbmZvIGV4aXN0IHZhcnMocG93ZXJfZG9tYWlucyldICYmIChbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAxKSl9IHsKCiAgICAgICAgIGlmIHskdmFycyhmbGF0KSA9PSAiZnVsbCJ9IHsKICAgICAgICAgICAgIwogICAgICAgICAgICAjIEp1c3QgbGlrZSB0aWUgYW5kIGZpbGxlciBjZWxscywgd2UgY2FuIGhhdmUgcG93ZXIgZG9tYWluLXNwZWNpZmljCiAgICAgICAgICAgICMgY2VsbHMgYW5kIHNldHRpbmdzIHRoYXQgd2UgbmVlZCB0byB3b3JyeSBhYm91dC4KICAgICAgICAgICAgIwogICAKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6Z2V0X3Bvd2VyX2RvbWFpbnNfY29kZV0KICAgCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBHZXQgdGhlIHNldCBvZiBkb21haW5zIHRoYXQgd2UgbmVlZCB0byB3b3JyeSBhYm91dAogICAgICAgICAgICAjCiAgIAogICAgICAgICAgICBzZXQgcHJlIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIscHJlX2VuZGNhcCJdCiAgICAgICAgICAgIHNldCBwb3N0IFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIscG9zdF9lbmRjYXAiXQogICAgICAgICAgICBzZXQgZW5kY2FwcyBbRkY6OmxpbnRlcnNlY3Rpb24gJHByZSAkcG9zdF0KICAgICAgICAgICAgc2V0IHdlbGx0YXBzIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIsd2VsbHRhcHMiXQogICAKICAgICAgICAgICAgIwogICAgICAgICAgICAjIEZvciBldmVyeSBkb21haW4gaW4gdGhlIHVuaW9uLCB3ZSBuZWVkIHRvIGlzc3VlIHN0YXRlbWVudHMgaWYgdGhhdAogICAgICAgICAgICAjIGRvbWFpbiBpcyBvbmUgb2YgdGhlIHBvd2VyIGRvbWFpbnMgaW4gdGhlIGRlc2lnbgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgTk9URTogV2UgcmVhbGx5IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaW5kZW50aW5nIHRoZSBjb21tYW5kcwogICAgICAgICAgICAjICAgICAgIHRvIGxvb2sgbmljZSBzaW5jZSB0aGUgb3V0cHV0IHJvdXRpbmUgd2lsbCBmb3JtYXQgaXQgY29ycmVjdGx5CiAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgIHNldCBkb21haW5zIFtGRjo6bHVuaW9uICRlbmRjYXBzICR3ZWxsdGFwc10KCiAgICAgICAgICAgIGZvcmVhY2ggZG9tYWluICRkb21haW5zIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtsc2VhcmNoIFwkZG9tYWlucyAkZG9tYWluXF0gIT0gLTF9IHtcbiIKICAgCiAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIyBIYW5kbGUgdGhlIGVuZCBjYXBzCiAgICAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgICAgIHNldCBzdGRfYXJncyAiLXByZWZpeCAkZG9tYWluIC1wb3dlcl9kb21haW4gJGRvbWFpbiIKICAgICAgICAgICAgICAgc2V0IGFkZCAiYWRkX2VuZGNhcHMgJHN0ZF9hcmdzIgogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IHByZSAkdmFycygkZG9tYWluLHByZV9lbmRjYXApfV0gJiYKICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBwb3N0ICR2YXJzKCRkb21haW4scG9zdF9lbmRjYXApfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIkYWRkIC1zdGFydF9yb3dfY2FwICRwcmUgLWVuZF9yb3dfY2FwICRwb3N0XG4iCiAgICAgICAgICAgICAgIH0gZWxzZWlmIHshW2NhdGNoIHtzZXQgcHJlICR2YXJzKHByZV9lbmRjYXApfV0gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBwb3N0ICR2YXJzKHBvc3RfZW5kY2FwKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiJGFkZCAtc3RhcnRfcm93X2NhcCAkcHJlIC1lbmRfcm93X2NhcCAkcG9zdFxuIgogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBzZXQgdGFwcyAiIgogICAgICAgICAgICAgICBpZiB7W2NhdGNoIHtzZXQgdGFwcyAkdmFycygkZG9tYWluLHdlbGx0YXBzKX1dfSB7CiAgICAgICAgICAgICAgICAgIGNhdGNoIHtzZXQgdGFwcyAkdmFycyh3ZWxsdGFwcyl9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyR0YXBzID09ICIifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXH1cbiIKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAjIEhhbmRsZSB3ZWxsIHRhcHMKICAgICAgICAgICAgICAgIwogICAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJhZGRfd2VsbF90YXBzICRzdGRfYXJncyAtY2VsbCBcW2xpc3QgJHRhcHNcXSIKICAgCiAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgaSAkdmFycygkZG9tYWluLHdlbGx0YXBzLGNlbGxfaW50ZXJ2YWwpfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLWNlbGxfaW50ZXJ2YWwgJGkiCiAgICAgICAgICAgICAgIH0gZWxzZWlmIHshW2NhdGNoIHtzZXQgaSAkdmFycyh3ZWxsdGFwcyxjZWxsX2ludGVydmFsKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1jZWxsX2ludGVydmFsICRpIgogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IG9mZnNldCAkdmFycygkZG9tYWluLHdlbGx0YXBzLHJvd19vZmZzZXQpfV0gfHwKICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBvZmZzZXQgJHZhcnMod2VsbHRhcHMscm93X29mZnNldCl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtaW5fcm93X29mZnNldCAkb2Zmc2V0IgogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGNoZWNrZXIgJHZhcnMoJGRvbWFpbix3ZWxsdGFwcyxjaGVja2VyYm9hcmQpfV0gfHwKICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBjaGVja2VyICR2YXJzKHdlbGx0YXBzLGNoZWNrZXJib2FyZCl9XX0gewogICAgICAgICAgICAgICAgICBpZiB7JGNoZWNrZXJ9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLWNoZWNrZXJfYm9hcmQiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuIgogICAKICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAjIEFkZCBhIHZlcmlmeSBzdGVwLCBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgICAgIwogICAKIyAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgcnVsZSAkdmFycygkZG9tYWluLHdlbGx0YXBzLHZlcmlmeV9ydWxlKX1dIHx8CiMgICAgICAgICAgICAgICAgICAgIVtjYXRjaCB7c2V0IHJ1bGUgJHZhcnMod2VsbHRhcHMsdmVyaWZ5X3J1bGUpfV19IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2hlY2tfd2VsbF90YXAgLWNlbGxzIFxbbGlzdCAkdGFwc1xdIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLXBvd2VyX2RvbWFpbiAkZG9tYWluIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLXJlcG9ydCAkdmFycyhycHRfZGlyKS8kZG9tYWluLndlbGx0YXAucnB0XG4iCiMgICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIwogICAgICAgICAgICAjIFdlJ3ZlIHRha2VuIGNhcmUgb2YgYWxsIG9mIHRoZSBkb21haW5zIHRoYXQgd2UgaGF2ZSBleHBsaWNpdAogICAgICAgICAgICAjIHNldHRpbmdzIGZvci4gIEhvd2V2ZXIsIHdlIG1heSBzdGlsbCBoYXZlIGRvbWFpbnMgaW4gdGhlIGRlc2lnbgogICAgICAgICAgICAjIHRoYXQgd2Uga25vdyBub3RoaW5nIGV4cGxpY2l0IGFib3V0LiAgV2UgbmVlZCB0byBoYW5kbGUgdGhlc2UKICAgICAgICAgICAgIyB3aXRoIGEgZGlmZmVyZW50IHNldCBvZiBjb2RlLgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgV2UgYXJlIGdvaW5nIHRvIGNoZWF0LiAgU2luY2UgdGhlIGNvZGUgd2UgbmVlZCBpcyBhbHJlYWR5IHdyaXR0ZW4KICAgICAgICAgICAgIyAoYmVsb3cpLCB3ZSBhcmUgZ29pbmcgdG8gcmVjdXJzaXZlbHkgY2FsbCB0aGlzIHJvdXRpbmUgdG8gZ2V0CiAgICAgICAgICAgICMgdGhlIHNrZWxldG9uIHRoYXQgd2UgbmVlZCBhbmQgd3JhcCBpdCB1cCBpbnRvIGEgZm9yLWxvb3AuICBUaGlzCiAgICAgICAgICAgICMgc2hvdWxkIGdldCB1cyBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CiAgICAgICAgICAgICMgICAgICAgc2V0IHByb2Nlc3NlZCBbbGlzdCBkb21haW4xIGRvbWFpbjIgZG9tYWluM10KICAgICAgICAgICAgIyAgICAgICBmb3JlYWNoIGRvbWFpbiAkZG9tYWlucyB7CiAgICAgICAgICAgICMgICAgICAgICAgaWYge1tsc2VhcmNoICRwcm9jZXNzZWRfZG9tYWlucyAkZG9tYWluXSA9PSAtMX0gewogICAgICAgICAgICAjICAgICAgICAgICAgIGFkZEVuZENhcCAtcG93ZXJfZG9tYWluICRkb21haW4gLXByZWZpeCAkZG9tYWluIC4uLgogICAgICAgICAgICAjICAgICAgICAgICAgIGFkZFdlbGxUYXAgLXBvd2VyX2RvbWFpbiAkZG9tYWluIC1wcmVmaXggJGRvbWFpbiAuLi4KICAgICAgICAgICAgIyAgICAgICAgICAgICB2ZXJpZnlXZWxsVGFwIC1wb3dlcl9kb21haW4gJGRvbWFpbiAuLi4KICAgICAgICAgICAgIyAgICAgICAgICB9CiAgICAgICAgICAgICMgICAgICAgfQogICAgICAgICAgICAjCiAgICAgICAgICAgICMgTk9URTogVGhlIG91dHB1dCByb3V0aW5lIHdpbGwgdGFrZSBjYXJlIG9mIG1ha2luZyB0aGlzIGxvb2sgcHJldHR5CiAgICAgICAgICAgICMgICAgICAgYXQgdGhlIGVuZC4gIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaW5kZW50YXRpb24gZm9yCiAgICAgICAgICAgICMgICAgICAgdGhlIGluc2VydGVkIGNvbW1hbmRzCiAgICAgICAgICAgICMKICAgCiMgICAgICAgICAgICBzZXQgc2F2ZSAkdmFycyhjcGZfZmlsZSkKIyAgICAgICAgICAgIHVuc2V0IHZhcnMoY3BmX2ZpbGUpCiMgICAgICAgICAgICBzZXQgZGVmYXVsdF9pbnNlcnQgW2luc2VydF93ZWxsdGFwc19lbmRjYXBzIHRydWVdCiMgICAgICAgICAgICBpZiB7JGRlZmF1bHRfaW5zZXJ0ICE9ICIifSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBwcm9jZXNzZWRfZG9tYWlucyBcW2xpc3QgJGRvbWFpbnNcXVxuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmb3JlYWNoIGRvbWFpbiBcJGRvbWFpbnMge1xuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBpZiB7XFtsc2VhcmNoIFwkcHJvY2Vzc2VkX2RvbWFpbnMgXCRkb21haW5cXSA9PSAtMX0ge1xuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICAkZGVmYXVsdF9pbnNlcnQiCiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIH1cbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgojICAgICAgICAgICAgfQojICAgICAgICAgICAgc2V0IHZhcnMoY3BmX2ZpbGUpICRzYXZlCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmZfcHJvY3M6Omluc2VydF93ZWxsdGFwc19lbmRjYXBzXG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgIwogICAgICAgICAjIFRoZXJlIGlzIG5vIENQRiBmaWxlIHRoYXQgd2UgbmVlZCB0byB3b3JyeSBhYm91dC4gIEhvd2V2ZXIsIGlmCiAgICAgICAgICMgJG91dGxpbmUgaXMgdHJ1ZSwgaXQgbWVhbnMgdGhhdCB0aGUgY29kZSAoYWJvdmUpIHRoYXQgaGFuZGxlcyBwb3dlcgogICAgICAgICAjIGRvbWFpbnMgY2FsbGVkIHRoaXMgcm91dGluZSByZWN1cnNpdmVseSwgYW5kIHdlIG5lZWQgdG8gY2hhbmdlCiAgICAgICAgICMgdGhlIGNvbW1hbmRzIGEgbGl0dGxlIGJpdCB0byBpbmNsdWRlIHZhcmlhYmxlcyBmb3IgcG93ZXIgZG9tYWlucwogICAgICAgICAjCiAgICAgICAgICMgU3RhcnQgd2l0aCB0aGUgc2ltcGxlIGNhc2U6IGVuZGNhcHMKICAgICAgICAgIwoKICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBwcmUgJHZhcnMocHJlX2VuZGNhcCl9XSAmJgogICAgICAgICAgICAgIVtjYXRjaCB7c2V0IHBvc3QgJHZhcnMocG9zdF9lbmRjYXApfV19IHsKCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiYWRkX2VuZGNhcHMgLXN0YXJ0X3Jvd19jYXAgJHByZSAtZW5kX3Jvd19jYXAgJHBvc3QiCiAgICAgICAgICAgIGlmIHshJG91dGxpbmV9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLXByZWZpeCBFTkRDQVBcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLXByZWZpeCBcJGRvbWFpbiAtcG93ZXJfZG9tYWluIFwkZG9tYWluXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgIwogICAgICAgICAjIE5vdyBwcm9jZXNzIHdlbGx0YXBzCiAgICAgICAgICMKCiAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgdGFwcyAkdmFycyh3ZWxsdGFwcyl9XX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImFkZF93ZWxsX3RhcHMgLWNlbGwgXFtsaXN0ICR0YXBzXF0iCiAgICAgICAgICAgIGlmIHshJG91dGxpbmV9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLXByZWZpeCBXRUxMVEFQIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtcHJlZml4IFwkZG9tYWluIC1wb3dlcl9kb21haW4gXCRkb21haW4iCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgbWF4X2dhcCAkdmFycyh3ZWxsdGFwcyxtYXhfZ2FwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1tYXhfZ2FwICRtYXhfZ2FwIgogICAgICAgICAgICB9IGVsc2VpZiB7IVtjYXRjaCB7c2V0IGludGVydmFsICR2YXJzKHdlbGx0YXBzLGNlbGxfaW50ZXJ2YWwpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLWNlbGxfaW50ZXJ2YWwgJGludGVydmFsIgogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IG9mZnNldCAkdmFycyh3ZWxsdGFwcyxyb3dfb2Zmc2V0KX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1pbl9yb3dfb2Zmc2V0ICRvZmZzZXQiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgY2hlY2tlciAkdmFycyh3ZWxsdGFwcyxjaGVja2VyYm9hcmQpfV19IHsKICAgICAgICAgICAgICAgaWYgeyRjaGVja2VyfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1jaGVja2VyX2JvYXJkIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbiIKCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBJZiBhIHZlcmlmeSByZXF1ZXN0IGhhcyBiZWVuIG1hZGUsIGNyZWF0ZSB0aGUgY29tbWFuZCB0bwogICAgICAgICAgICAjIGRvIHNvLiAgQWdhaW4sIHRha2UgaW50byBhY2NvdW50IHRoZSBwb3RlbnRpYWwgZm9yIGEgcmVjdXJzaXZlCiAgICAgICAgICAgICMgY2FsbCB0byB0aGlzIHJvdXRpbmUuCiAgICAgICAgICAgICMKCiMgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IHJ1bGUgJHZhcnMod2VsbHRhcHMsdmVyaWZ5X3J1bGUpfV19IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2hlY2tfd2VsbF90YXAgLWNlbGxzIFxbbGlzdCAkdGFwc1xdICIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1yZXBvcnQgJHZhcnMocnB0X2RpcikvIgojICAgICAgICAgICAgICAgaWYgeyEkb3V0bGluZX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ3ZWxsdGFwLnJwdFxuIgojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXCRkb21haW4ud2VsbHRhcC5ycHQgLXBvd2VyX2RvbWFpbiBcJGRvbWFpblxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfSBlbHNlaWYgeyEkb3V0bGluZX0gewojIyAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IENhbm5vdCBydW4gdmVyaWZ5V2VsbFRhcCBiZWNhdXNlIHZhcnMod2VsbHRhcHMsdmVyaWZ5X3J1bGUpIGlzIG5vdCBkZWZpbmVkIgojICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiQ2Fubm90IHJ1biB2ZXJpZnlXZWxsVGFwIGJlY2F1c2UgdmFycyh3ZWxsdGFwcyx2ZXJpZnlfcnVsZSkgaXMgbm90IGRlZmluZWQiCiMgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKIyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICAjCiAgICAgICMgSWYgd2UgY3JlYXRlZCBhbnkgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQsIHByZWZpeCB0aGUgY29tbWFuZHMgd2l0aCBhCiAgICAgICMgaGVhZGVyCiAgICAgICMKCiAgICAgIGlmIHsoJGNvbW1hbmRzICE9ICIiKSAmJiAhJG91dGxpbmV9IHsKICAgICAgICAgc2V0IGJvZHkgJGNvbW1hbmRzCgogICAgICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgSU5TRVJUSU5HIFdFTExUQVBTIEFORC9PUiBFTkRDQVBTXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkYm9keQogICAgICB9CgogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCiAgIHByb2Mgcm91dGVfc2Vjb25kYXJ5X3BnX25ldHMge30gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgIwogICAgICAjIERvbid0IHRyeSB0byByb3V0ZSB1bmxlc3MgdGhlIHByb3BlciBmbGFncyBhcmUgaW4gcGxhY2UgdG8gZG8gc28KICAgICAgIwoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhyb3V0ZV9zZWNvbmRhcnlfcGdfbmV0cyldIHx8CiAgICAgICAgICAhJHZhcnMocm91dGVfc2Vjb25kYXJ5X3BnX25ldHMpfSB7CiAgICAgICAgIHJldHVybiAiIgogICAgICB9CgogICAgICBzZXQgY29tbWFuZHMgIiMgPEZGPiBST1VUSU5HIFNFQ09OREFSWSBQT1dFUiBORVRTIC4uLlxuIgoKICAgICAgIwogICAgICAjIEVuYWJsZSBnbG9iYWwgcGluIHBhaXJzIChpZiBkZWZpbmVkKQogICAgICAjCgogICAgICBpZiB7W2NhdGNoIHtzZXQgYXJnICR2YXJzKHNlY29uZGFyeV9wZyxjZWxsX3Bpbl9wYWlycyl9XX0gewogICAgICAgICBwdXRzICI8RkY+ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCiAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IE5vIGNlbGwvcGluIHBhaXJzIGRlZmluZWQuICBQbGVhc2UgZGVmaW5lIGNlbGwvcGluIgogICAgICAgICBwdXRzICI8RkY+ICAgICAgICBwYWlycyBpbiB5b3VyIHNldHVwLnRjbCB1c2luZyB0aGUgdmFyaWFibGUiCiAgICAgICAgIHB1dHMgIjxGRj4gICAgICAgIHZhcnMoc2Vjb25kYXJ5X3BnLGNlbGxfcGluX3BhaXJzKSIKICAgICAgICAgcHV0cyAiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICAgICB9CiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfcGdfcGluc191c2Vfc2lnbmFsX3JvdXRlICRhcmdcbiIKCiAgICAgICMKICAgICAgIyBCdWlsZCBjb21tYW5kcyBmb3IgaW5kaXZpZHVhbCBuZXRzIChpZiBkZWZpbmVkKQogICAgICAjCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2Vjb25kYXJ5X3BnLG5ldHMpXX0gewogICAgICAgICBmb3JlYWNoIG5ldCAkdmFycyhzZWNvbmRhcnlfcGcsbmV0cykgewogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkbmV0LGNlbGxfcGluX3BhaXJzKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X3BnX3BpbnNfdXNlX3NpZ25hbF9yb3V0ZSAkYXJnXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzZXQgbmV0cyAkdmFycyhzZWNvbmRhcnlfcGcsbmV0cykKICAgICAgICAgc2V0IG5ldEZvcm1hdCAiIC1uZXRzICVzIgogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgbmV0cyBbbGlzdCAic2Vjb25kYXJ5X3BnIl0KICAgICAgICAgc2V0IG5ldEZvcm1hdCAiIgogICAgICB9CgogICAgICBmb3JlYWNoIG5ldCAkbmV0cyB7CiAgICAgICAgIHNldCByb3V0ZSAicm91dGVfc2Vjb25kYXJ5X3BnX3BpbnMiCiAgICAgICAgIGFwcGVuZCByb3V0ZSBbZm9ybWF0ICRuZXRGb3JtYXQgJG5ldF0KICAgICAgICAgY2F0Y2gge2FwcGVuZCByb3V0ZSAiIC1wYXR0ZXJuICR2YXJzKCRuZXQscGF0dGVybikifQogICAgICAgICBjYXRjaCB7YXBwZW5kIHJvdXRlICIgLW1heF9waW5zX3Blcl90cnVuayAkdmFycygkbmV0LG1heF9mYW5vdXQpIn0KICAgICAgICAgY2F0Y2gge2FwcGVuZCByb3V0ZSAiIC1ub25fZGVmYXVsdF9ydWxlICR2YXJzKCRuZXQsbm9uX2RlZmF1bHRfcnVsZSkifQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiRyb3V0ZVxuIgogICAgICB9CiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQoKICAgcHJvYyBhZGRfcG93ZXJfc3dpdGNoZXMge3tkb21haW5zICIifX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgbWFwCgogICAgICBzb3VyY2UgJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9JTk9WVVMvbWFwX29wdGlvbnMudGNsCgogICAgICBpZiB7JGRvbWFpbnMgPT0gIiJ9IHsKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OmdldF9wb3dlcl9kb21haW5zX2NvZGVdCiMgICAgICAgICBldmFsIFtGRjo6Z2V0X3Bvd2VyX2RvbWFpbnNfY29kZV0KICAgICAgfQoKICAgICAgZm9yZWFjaCBkb21haW4gJGRvbWFpbnMgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRvbWFpbixzd2l0Y2hhYmxlKV0gJiYKICAgICAgICAgICAgICR2YXJzKCRkb21haW4sc3dpdGNoYWJsZSl9IHsKICAgICAgICAgICAgc2V0IHR5cGUgJHZhcnMoJGRvbWFpbixzd2l0Y2hfdHlwZSkKCiAgICAgICAgICAgIGRlbGV0ZVBvd2VyU3dpdGNoIC0kdHlwZSAtcG93ZXJfZG9tYWluICRkb21haW4KCiAgICAgICAgICAgIHNldCBjb21tYW5kICJhZGRQb3dlclN3aXRjaCAtcG93ZXJfZG9tYWluICRkb21haW4gLSR0eXBlIgoKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkb21haW4sY2hlY2tlcl9ib2FyZCldICYmCiAgICAgICAgICAgICAgICAkdmFycygkZG9tYWluLGNoZWNrZXJfYm9hcmQpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWNoZWNrZXJCb2FyZCIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRvbWFpbixiYWNrX3RvX2JhY2tfY2hhaW4pXSAmJgogICAgICAgICAgICAgICAgJHZhcnMoJGRvbWFpbixiYWNrX3RvX2JhY2tfY2hhaW4pfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWJhY2tUb0JhY2tDaGFpbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRvbWFpbixsb29wX2JhY2tfYXRfZW5kKV0gJiYKICAgICAgICAgICAgICAgICR2YXJzKCRkb21haW4sbG9vcF9iYWNrX2F0X2VuZCl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbG9vcGJhY2tBdEVuZCIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRvbWFpbixjaGVja19oZWlnaHQpXSAmJgogICAgICAgICAgICAgICAgISR2YXJzKCRkb21haW4sY2hlY2tfaGVpZ2h0KX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1ub0RvdWJsZUhlaWdodENoZWNrIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLHZlcmlmeV9yb3dzKV0gJiYKICAgICAgICAgICAgICAgICEkdmFycygkZG9tYWluLHZlcmlmeV9yb3dzKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1ub1Jvd1ZlcmlmeSIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRvbWFpbixlbmFibGVfY2hhaW4pXSAmJgogICAgICAgICAgICAgICAgISR2YXJzKCRkb21haW4sZW5hYmxlX2NoYWluKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1ub0VuYWJsZUNoYWluIgogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoIG9wdGlvbiBbYXJyYXkgbmFtZXMgbWFwXSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLCRvcHRpb24pXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC0kbWFwKCRvcHRpb24pICR2YXJzKCRkb21haW4sJG9wdGlvbikiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kCiAgICAgICAgIH0KICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9jbG9ja19lY28ge2FyZ3N9IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIGlmIHtbbGxlbmd0aCAkYXJnc10gIT0gMX0gewogICAgICAgICBwdXRzICI8RkY+IEludGVybmFsIGVycm9yIGluIHJ1bl9jbG9ja19lY28uICBXcm9uZyBudW1iZXIgb2YgYXJncy4iCiAgICAgICAgIGV4aXQgLTExMQogICAgICB9CgogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IFJVTk5JTkcgQ0xPQ0sgRUNPXG4iCiAgICAgIHN3aXRjaCAkYXJncyB7CiAgICAgICAgICJwb3N0X3JvdXRlIiB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OmRlbGV0ZV9maWxsZXJfY2VsbHNdCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2xvY2tfZWNvIC1wb3N0X3JvdXRlIC11c2Vfc3BlY19maWxlX2NlbGxzX29ubHlcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6YWRkX2ZpbGxlcl9jZWxsc10KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjaGFuZ2VDbG9ja1N0YXR1cyAtYWxsIC1ub19maXhlZF9uZXRfd2lyZXNcbiIKICAgICAgICAgfQogICAgICAgICAicG9zdF9jdHMiIHsgCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2xvY2tfZWNvIC1wb3N0X2N0cyAtdXNlX3NwZWNfZmlsZV9jZWxsc19vbmx5XG4iCiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdCB7CiAgICAgICAgICAgIHB1dHMgIjxGRj4gSW50ZXJuYWwgZXJyb3IgaW4gcnVuX2Nsb2NrX2Vjby4iCiAgICAgICAgICAgIHB1dHMgIjxGRj4gSW52YWxpZCBhcmd1bWVudDsgdmFsaWQgYXJndW1lbnRzIGFyZSBwb3N0X2N0cyBhbmQgcG9zdF9yb3V0ZS4iCiAgICAgICAgICAgIGV4aXQgLTExMQogICAgICAgICB9CiAgICAgIH0KICAgIyAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICMgICB9IGVsc2UgewogICAjICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgIyAgIH0KICAgfQoKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIE1haW4gZm91bmRhdGlvbiBmbG93IHN0ZXAgcHJvY2VkdXJlcwogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICBwcm9jIHJ1bl9zeW5fbWFwIHt7Zm9ybWF0IDF9fSB7CiAgIAogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIHNldCB2YXJzKHN0ZXApIHN5bl9tYXAKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL3ZhcnMudGNsXG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgInByb2MgUHV0cyB7YXJnc30ge3B1dHMgXCRhcmdzfVxuIgoKICAgICAgaWYgeyR2YXJzKG5vdnVzKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXFtnZXRfZGIgcHJvZ3JhbV92ZXJzaW9uIC9cXVxuIgogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXFtnZXRfYXR0ciBwcm9ncmFtX3ZlcnNpb24gL1xdXG4iCiAgICAgIH0KCiAgICAgICMjIGVuYWJsZSBtdWx0aSBwcm9jZXNzaW5nCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGhvc3RsaXN0IFxbbHJlcGVhdCAkdmFycyhsb2NhbF9jcHVzKSBsb2NhbGhvc3RcXVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kYiBzdXBlcl90aHJlYWRfc2VydmVycyBcJGhvc3RsaXN0XG4iCiAgICAgCiMgICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKX0gewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbmVuYWJsZV9tZXRyaWNzIC1vblxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXNoX3NuYXBzaG90X3N0YWNrXG4iCiMgICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9zeW5fc2V0dXBfdGNsXQogICAgICAKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBpbmZvcm1hdGlvbl9sZXZlbCAxXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgc291cmNlX3ZlcmJvc2UgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiAtcXVpZXQgcHJpbnRfZXJyb3JfaW5mbyBmYWxzZVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIC1xdWlldCBlY2hvX2NvbW1hbmRzIGZhbHNlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgbWVzZ19jb2xvcmluZyBmYWxzZVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIHFvc19yZXBvcnRfYmFzaWNfY29zdF9ncm91cHMgdHJ1ZVxuIgoKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBsaWJfbGVmX2NvbnNpc3RlbmN5X2NoZWNrX2VuYWJsZSB0cnVlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgc2NyaXB0X3NlYXJjaF9wYXRoIHsuL31cbiIKICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kICJzdXBwcmVzc19tZXNzYWdlcyB7TEJSLTMwIExCUi0zMSBMQlItMTcwIExCUi03MiBMQlItMTU1IFBIWVMtMjEwIFBIWVMtMjU2IExCUi0yMDEgTEJSLTM0IExCUi04MyBMQlItNDAgTEJSLTE2MiBMQlItMTIyfVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVkaXJlY3QgL2Rldi9udWxsIHtzZXQgbWFwX2ZhbmN5X25hbWVzIDF9XG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3N5bl9zZXR1cF90Y2xdCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfc3luX2xvYWRfbGliX3RjbF0KCiAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV9zdGVwICR2YXJzKHN0ZXApXQogICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfdGltaW5nXQoKICAgICAgc2V0IGNvbW1hbmQgIlxucmVhZF9tbW1jICR2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXG5cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfbW1tYyAkY29tbWFuZF0KICAgICAKICAgICAgc2V0IGNvbW1hbmQgIiIgCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhsZWZfZmlsZXMpXX0gewogICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX3BoeXNpY2FsIC1sZWYgXCJcXFxuIgogICAgICAgIGZvcmVhY2ggbGVmICR2YXJzKGxlZl9maWxlcykgewogICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcdCRsZWZcXFxuIgogICAgICAgIH0KICAgICAgICBhcHBlbmQgY29tbWFuZCAiXCJcbiIKICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9waHlzaWNhbCAkY29tbWFuZF0KICAgICAgCiMgICAgICBmb3JlYWNoIGxpYiAkdmFycygkdmFycyhbc3RyaW5nIHRyaW0gJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHRpbWluZ19jb25kaXRpb24pXSxsaWJyYXJ5X3NldCksdGltaW5nKSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgJGxpYiBcXFxuIgojICAgICAgfQojICAgICAgYXBwZW5kIGNvbW1hbmQgIlwiXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9saWIgJGNvbW1hbmRdCiAgICAgIAojICAgICAgc2V0IGNvbW1hbmQgIlxuc2V0X2RiIGxlZl9saWJyYXJ5IFwiXFxcbiIKIyAgICAgIGZvcmVhY2ggbGVmICR2YXJzKGxlZl9maWxlcykgewojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICRsZWYgXFxcbiIKIyAgICAgIH0KIyAgICAgIGFwcGVuZCBjb21tYW5kICJcIlxuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfbGVmICRjb21tYW5kXQogICAgICAKIyAgICAgIHNldCBjb21tYW5kICJcbnNldF9kYiBxcmNfdGVjaF9maWxlICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxyY19jb3JuZXIpLHF4X3RlY2hfZmlsZSlcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZWFkX3FyYyAkY29tbWFuZF0KICAgICAgCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkb250X3VzZV9saXN0KV0gJiYgJHZhcnMoZG9udF91c2VfbGlzdCkgIT0gIiIgfSB7CiAgICAgICAgIGZvcmVhY2ggY2VsbCAkdmFycyhkb250X3VzZV9saXN0KSB7CiAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kYiBhdm9pZCB0cnVlIFxbZmluZCAvIC1saWJjZWxsICRjZWxsXF1cbiIKICAgICAgICAgfQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3N5bl9sb2FkX2xpYl90Y2xdCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewogICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9wb3dlcl9pbnRlbnQgLW1vZHVsZSAkdmFycyhkZXNpZ24pIC1jcGYgJHZhcnMoY3BmX2ZpbGUpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZWFkX3Bvd2VyX2ludGVudCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGllZWUxODAxX2ZpbGUpXX0gewogICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9wb3dlcl9pbnRlbnQgLW1vZHVsZSAkdmFycyhkZXNpZ24pIC0xODAxICR2YXJzKGllZWUxODAxX2ZpbGUpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZWFkX3Bvd2VyX2ludGVudCAkY29tbWFuZF0KICAgICAgfQogICAgIAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaGRsX3NlYXJjaF9wYXRoKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgaGRsX3NlYXJjaF9wYXRoIFwiJHZhcnMoaGRsX3NlYXJjaF9wYXRoKVwiXG4iCiAgICAgIH0gCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhoZGxfZmlsZV9saXN0KV19IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInJlYWRfaGRsIC12MjAwMSBcIiR2YXJzKGhkbF9maWxlX2xpc3QpXCJcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfaGRsICRjb21tYW5kXQogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBzeW5fbG9hZF9ydGxfdGNsXQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgIlxuI3NldCByZWFkX2RlZl9saWJjZWxsX21pc21hdGNoX2Vycm9yIDBcbiIKICAgICAgCiAgICAgICAgIHNldCBjb21tYW5kICIjc2V0X2RiIGdlbl9tb2R1bGVfcHJlZml4ICAgICAgICAgICAgICAgIF9HRU5VU19cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgaGRsX2FycmF5X25hbWluZ19zdHlsZSAgICAgICAgICAgJXNfJWRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgaGRsX3JlZ19uYW1pbmdfc3R5bGUgICAgICAgICAgICAgJXNfcmVnJXNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgaGRsX3VzZV9pZl9nZW5lcmF0ZV9wcmVmaXggICAgICAgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgaGRsX3VzZV9mb3JfZ2VuZXJhdGVfcHJlZml4ICAgICAgdHJ1ZVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBoZGxfdXNlX2Jsb2NrX3ByZWZpeCAgICAgICAgICAgICBmYWxzZVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBoZGxfbWF4X2xvb3BfbGltaXQgICAgICAgICAgICAgICA4MDk2XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGhkbF9nZW5lcmF0ZV9pbmRleF9zdHlsZSAgICAgICAgICVzXyVkX1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBoZGxfZ2VuZXJhdGVfc2VwYXJhdG9yICAgICAgICAgICBfXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGhkbF9pbnN0YW5jZV9hcnJheV9uYW1pbmdfc3R5bGUgICVzXyVkX1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBoZGxfcGFyYW1ldGVyX25hbWluZ19zdHlsZSAgICAgICBfJXMlZFxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBoZGxfcmVjb3JkX25hbWluZ19zdHlsZSAgICAgICAgICAlc1xbJXNcXVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBoZGxfdXNlX3RlY2hlbHRfZmlyc3QgICAgICAgICAgICB0cnVlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGhkbF9lcnJvcl9vbl9ibGFja2JveCAgICAgICAgICAgIHRydWVcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgaGRsX3RyYWNrX2ZpbGVuYW1lX3Jvd19jb2wgICAgICAgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgaGRsX2VuYWJsZV9wcm9jX25hbWUgICAgICAgICAgICAgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgaGRsX2Vycm9yX29uX2xhdGNoICAgICAgICAgICAgICAgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgaGRsX3VuY29ubmVjdGVkX2lucHV0X3BvcnRfdmFsdWUgbm9uZVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBoZGxfdW5kcml2ZW5fb3V0cHV0X3BvcnRfdmFsdWUgICBub25lXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGhkbF91bmRyaXZlbl9zaWduYWxfdmFsdWUgICAgICAgIG5vbmVcbiIKICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfaGRsX2F0dHJpYnV0ZXMgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfc3luX2xvYWRfZWxhYl90Y2xdCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgIlxuZWxhYm9yYXRlICR2YXJzKGRlc2lnbilcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVsYWJvcmF0ZSAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG5pbml0X2Rlc2lnblxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdF9kZXNpZ24gJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3N5bl9sb2FkX2VsYWJfdGNsXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ3cml0ZV9kYiAkdmFycyhkZXNpZ24pIC1hbGxfcm9vdF9hdHRyaWJ1dGVzIC10b19maWxlICR2YXJzKGRic19kaXIpL2VsYWIuZGJcbiIKICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2hlY2tfZGVzaWduIC1tdWx0aXBsZV9kcml2ZXIgLXVuZHJpdmVuIC11bnJlc29sdmVkID4gJHZhcnMocnB0X2RpcikvY2hlY2tfZGVzaWduLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlcG9ydCBkYXRhcGF0aCAtYWxsIC1tYXhfd2lkdGgge3tmaWxlbmFtZSA1MTJ9fSA+ICR2YXJzKHJwdF9kaXIpL3JlcG9ydF9kYXRhcGF0aC5ycHRcbiIKICAgICAgCiAgICAgIAojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjc2V0IHRyZWF0X2ludmFsaWRfZnJvbV90b19hc190aHJvdWdoIDFcbiIKICAgICAKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2dhdGVfY2VsbHMpXX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGxwX2Nsb2NrX2dhdGluZ19jZWxsIFxbZmluZCAvbGliKiAtbGliY2VsbCAkdmFycyhjbG9ja19nYXRlX2NlbGxzKVxdXG5cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBscF9pbnNlcnRfY2xvY2tfZ2F0aW5nICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluc2VydF9jbG9ja19nYXRpbmcgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhsZWFrYWdlX3Bvd2VyX2VmZm9ydCldICYmICgkdmFycyhsZWFrYWdlX3Bvd2VyX2VmZm9ydCkgIT0gIm5vbmUiKX0gewogICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGxwX211bHRpX3Z0X29wdGltaXphdGlvbl9lZmZvcnQgICAgICAgICAgICAgICAgJHZhcnMobGVha2FnZV9wb3dlcl9lZmZvcnQpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsZWFrYWdlX3Bvd2VyX2VmZm9ydCAkY29tbWFuZF0KICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBscF9pbnNlcnRfb3BlcmFuZF9pc29sYXRpb24gICAgICAgICAgICAgICAgICAgIGZhbHNlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGxwX3Bvd2VyX2FuYWx5c2lzX2VmZm9ydCAgICAgICAgICAgICAgICAgICAgICAgbG93XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGxwX2Nsb2NrX2dhdGluZ19oaWVyYXJjaGljYWwgICAgICAgICAgICAgICAgICAgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgbHBfY2xvY2tfZ2F0aW5nX2F1dG9fY29zdF9ncm91cF9pbml0aWFsX3RhcmdldCAwXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGxwX2Nsb2NrX2dhdGluZ19tYXhfZmxvcHMgICAgICAgICAgICAgICAgICAgICAgaW5maW5pdHlcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgbHBfY2xvY2tfZ2F0aW5nX21pbl9mbG9wcyAgICAgICAgICAgICAgICAgICAgICAzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGxwX2Nsb2NrX2dhdGluZ19hdXRvX3BhdGhfYWRqdXN0ICAgICAgICAgICAgICAgZml4ZWRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgbHBfY2xvY2tfZ2F0aW5nX2F1dG9fcGF0aF9hZGp1c3RfZml4ZWRfZGVsYXkgICAxNzVcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfaWNnX2F0dHJpYnV0ZXMgJGNvbW1hbmRdCgojICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgbHBfcG93ZXJfb3B0aW1pemF0aW9uX3dlaWdodCBcIlwiXG4iCgogICAgICAKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICMgREZUIFNldHRpbmdzCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBzZXQgY29tbWFuZCAiI3NldF9kYiBkZnRfc2Nhbl9tYXBfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZV9hbGxcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgZGZ0X3NjYW5fc3R5bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV4ZWRfc2NhblxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBkZnRfcHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERlRfXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIHVzZV9zY2FuX3NlcXNfZm9yX25vbl9kZnQgICAgICAgICAgICAgICAgIHRydWVcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgZGZ0X3NjYW5fbWFwX21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VfYWxsXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGRmdF9jb25uZWN0X3NoaWZ0X2VuYWJsZV9kdXJpbmdfbWFwcGluZyAgIHRpZV9vZmZcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgZGZ0X2Nvbm5lY3Rfc2Nhbl9kYXRhX3BpbnNfZHVyaW5nX21hcHBpbmcgbG9vcGJhY2tcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgZGZ0X3NjYW5fb3V0cHV0X3ByZWZlcmVuY2UgICAgICAgICAgICAgICAgbm9uX2ludmVydGVkXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGRmdF9sb2NrdXBfZWxlbWVudF90eXBlICAgICAgICAgICAgICAgICAgIGVkZ2Vfc2Vuc2l0aXZlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGRmdF9taXhfY2xvY2tfZWRnZXNfaW5fc2Nhbl9jaGFpbnMgICAgICAgIGZhbHNlXG4iCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2RmdF9hdHRyaWJ1dGVzICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgc3luX3NldHVwX2RmdF90Y2xdCgogICAgICBzZXQgY29tbWFuZCAiIgogICAgICAjIyBSQyB0aW1pbmcgc3RpbGwgY29tZXMgZnJvbSBjcGYsIElubm92dXMgdGltaW5nIGNvbWVzIGZyb20gc2V0dXAudGNsCiAgICAgIGlmIFtpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gewogICAgICAgIGFwcGVuZCBjb21tYW5kICJhcHBseV9wb3dlcl9pbnRlbnQgLXN1bW1hcnlcbiIKICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksYXBwbHlfcG93ZXJfaW50ZW50ICRjb21tYW5kXQogICAgICB9IGVsc2UgewojICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IG1vZGUgW2xpbmRleCAkdmFycyhjb25zdHJhaW50X21vZGVzKSAwXVxuIgojICAgICAgICBhcHBlbmQgY29tbWFuZCAiaWYgeyBcW2ZpbmQgLyAtbW9kZSBcJG1vZGUgXF0gPT0gXCJcIn0ge1xuIgojICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgY3JlYXRlX21vZGUgLWRlZmF1bHQgLW5hbWUgXCRtb2RlXG4iCiMgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiMgICAgICAgICMjIE5vdyBwb3B1bGF0ZSB0aGUgdGltaW5nIG1vZGVzCiMgICAgICAgIGZvcmVhY2ggbW9kZSAkdmFycyhjb25zdHJhaW50X21vZGVzKSB7CiMgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLHN5bnRoX3NkYyldfSB7CiMgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImlmIHsgXFtmaW5kIC8gLW1vZGUgJG1vZGVcXSA9PSBcIlwiIH0ge1xuIgojICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICBjcmVhdGVfbW9kZSAtbmFtZSAkbW9kZVxuIgojICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiMgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJlYWRfc2RjIC1tb2RlICRtb2RlICR2YXJzKCRtb2RlLHN5bnRoX3NkYylcbiIKIyAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG1vZGUscHJlX2N0c19zZGMpXX0gewojICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJpZiB7IFxbZmluZCAvIC1tb2RlICRtb2RlXF0gPT0gXCJcIiB9IHtcbiIKIyAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgY3JlYXRlX21vZGUgLW5hbWUgJG1vZGVcbiIKIyAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgojICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX3NkYyAtbW9kZSAkbW9kZSAkdmFycygkbW9kZSxwcmVfY3RzX3NkYylcbiIKIyAgICAgICAgICAgICB9CiMgICAgICAgICAgfQojICAgICAgICB9CiMgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxhcHBseV9jb25zdHJhaW50cyAkY29tbWFuZF0KIyAgICAgICAgYXBwZW5kIGNvbW1hbmQgInB1dHMgXCJUaGUgbnVtYmVyIG9mIGV4Y2VwdGlvbnMgaXMgXFtsbGVuZ3RoIFxbZmluZCAvIC1leGNlcHRpb24gKlxdXF1cIlxuIgoKICAgICAgICAgICBzZXQgY29tbWFuZCAiXG5kZWZpbmVfY29zdF9ncm91cCAtbmFtZSBpbjJvdXRcbiIKICAgICAgICBhcHBlbmQgY29tbWFuZCAiZGVmaW5lX2Nvc3RfZ3JvdXAgLW5hbWUgaW4ycmVnXG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmQgImRlZmluZV9jb3N0X2dyb3VwIC1uYW1lIHJlZzJvdXRcbiIKICAgICAgICBhcHBlbmQgY29tbWFuZCAiZGVmaW5lX2Nvc3RfZ3JvdXAgLW5hbWUgcmVnMnJlZ1xuIgoKIyAgICAgICAgc2V0IG1vZGUgW2xpbmRleCAkdmFycyhjb25zdHJhaW50X21vZGVzKSAwXQojICAgICAgICBzZXQgbW9kZSAkdmFycyhkZWZhdWx0X3N5bnRoZXNpc19tb2RlKQogICAgICAgIHNldCBtb2RlICR2YXJzKGRlZmF1bHRfc3ludGhlc2lzX3ZpZXcpCgogICAgICAgIGFwcGVuZCBjb21tYW5kICJwYXRoX2dyb3VwIC1tb2RlICRtb2RlIC1mcm9tIFxbYWxsOjphbGxfaW5wc1xdIC10byBcW2FsbDo6YWxsX291dHNcXSAtZ3JvdXAgaW4yb3V0IC1uYW1lIGluMm91dFxuIgogICAgICAgIGFwcGVuZCBjb21tYW5kICJwYXRoX2dyb3VwIC1tb2RlICRtb2RlIC1mcm9tIFxbYWxsOjphbGxfaW5wc1xdIC10byBcW2FsbDo6YWxsX3NlcXNcXSAtZ3JvdXAgaW4ycmVnIC1uYW1lIGluMnJlZ1xuIgogICAgICAgIGFwcGVuZCBjb21tYW5kICJwYXRoX2dyb3VwIC1tb2RlICRtb2RlIC1mcm9tIFxbYWxsOjphbGxfc2Vxc1xdIC10byBcW2FsbDo6YWxsX291dHNcXSAtZ3JvdXAgcmVnMm91dCAtbmFtZSByZWcyb3V0XG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBhdGhfZ3JvdXAgLW1vZGUgJG1vZGUgLWZyb20gXFthbGw6OmFsbF9zZXFzXF0gLXRvIFxbYWxsOjphbGxfc2Vxc1xdIC1ncm91cCByZWcycmVnIC1uYW1lIHJlZzJyZWdcbiIKCiMgICAgICAgIGFwcGVuZCBjb21tYW5kICJwYXRoX2dyb3VwIC1mcm9tIFxbYWxsOjphbGxfaW5wc1xdIC10byBcW2FsbDo6YWxsX291dHNcXSAtZ3JvdXAgaW4yb3V0IC1uYW1lIGluMm91dFxuIgojICAgICAgICBhcHBlbmQgY29tbWFuZCAicGF0aF9ncm91cCAtZnJvbSBcW2FsbDo6YWxsX2lucHNcXSAtdG8gXFthbGw6OmFsbF9zZXFzXF0gLWdyb3VwIGluMnJlZyAtbmFtZSBpbjJyZWdcbiIKIyAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBhdGhfZ3JvdXAgLWZyb20gXFthbGw6OmFsbF9zZXFzXF0gLXRvIFxbYWxsOjphbGxfb3V0c1xdIC1ncm91cCByZWcyb3V0IC1uYW1lIHJlZzJvdXRcbiIKIyAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBhdGhfZ3JvdXAgLWZyb20gXFthbGw6OmFsbF9zZXFzXF0gLXRvIFxbYWxsOjphbGxfc2Vxc1xdIC1ncm91cCByZWcycmVnIC1uYW1lIHJlZzJyZWdcbiIKCiAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9wYXRoX2dyb3VwcyAkY29tbWFuZF0KICAgICAgfQoKCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIHNldCBmaXJzdCAxCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWZfZmlsZXMpXX0gewogICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoZGVmX2ZpbGVzKSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgICAgIGlmIHskZmlyc3R9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJlYWRfZGVmICRmaWxlXG4iCiAgICAgICAgICAgICAgICAgIHNldCBmaXJzdCAwCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9kZWYgLWluY3IgJGZpbGVcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfZGVmICRjb21tYW5kXQogICAgICB9CiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgInJlcG9ydCB0aW1pbmcgLWxpbnRcbiIKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhtYXhfcm91dGVfbGF5ZXIpXX0gewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbnNldF9kYiBudW1iZXJfb2Zfcm91dGluZ19sYXllcnMgJHZhcnMobWF4X3JvdXRlX2xheWVyKSBkZXNpZ25zLyR2YXJzKGRlc2lnbilcbiIKICAgICAgfQoKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiI2ZvcmVhY2ggY2cgXFtmaW5kIC8gLWNvc3RfZ3JvdXAgKlxdIHtcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgcmVwb3J0IHRpbWluZyAtY29zdF9ncm91cCBbbGlzdCBcJGNnXSA+PiAkdmFycyhycHRfZGlyKS9jb3N0X2dyb3VwLm1hcC5ycHRcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiI31cbiIKICAgICAgCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiNzZXRfcmVtb3ZlX2Fzc2lnbl9vcHRpb25zIC1za2lwX3VuY29uc3RyYWluZWRfcGF0aHMgLXBoeXNpY2FsXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiNzZXRfZGIgdXRpbGl6YXRpb24gMCBcW2ZpbmQgLyAtbGF5ZXIgTTFcXVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3N5bl9nZW5fdGNsXQoKICAgICAgc2V0IGNvbW1hbmQgIlxuc3ludGhlc2l6ZSAtdG9fZ2VuZXJpYyAtZWZmb3J0IG1lZGl1bVxuXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzeW4yZ2VuICRjb21tYW5kXQogICAgICAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9zeW5fZ2VuX3RjbF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAid3JpdGVfZGIgJHZhcnMoZGVzaWduKSAtYWxsX3Jvb3RfYXR0cmlidXRlcyAtdG9fZmlsZSAkdmFycyhkYnNfZGlyKS9zeW5fZ2VuLmRiXG4iCiAgICAgCiAgICAgIHNldCBjb21tYW5kICJcbnN5bnRoZXNpemUgLXRvX21hcCAtZWZmb3J0IGhpZ2ggLWNsb2NrX2dhdGluZ19vbmx5XG5cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHN5bjJpY2cgJGNvbW1hbmRdCiAgICAgIAojICAgICAgc2V0IGNnX2NlbGxzICJcbiIKIyAgICAgIGZvcmVhY2ggaSBbZmlsdGVyIGxpYmNlbGwgLWludmVydCAiIiBbZmluZCAvIC1pbnN0IGluc3RhbmNlc19zZXEvKl1dIHsKIyAgICAgICBpZiB7W2dldF9hdHRyIGNsb2NrX2dhdGluZ19pbnRlZ3JhdGVkX2NlbGwgW2dldF9hdHRyIGxpYmNlbGwgJGldXSAhPSAiIiB9IHsKIyAgICAgICAgIGxhcHBlbmQgY2dfY2VsbHMgJGkKIyAgICAgICB9CiMgICAgICB9CiMgICAgICBpZiB7ICRjZ19jZWxscyAhPSAiIiB9IHsKIyAgICAgICAgc2V0IENHX0FESlVTVCBbcGF0aF9hZGp1c3QgLWRlbGF5IC0xNTAgLXRvICRjZ19jZWxsc10KIyAgICAgIH0KICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9zeW5fbWFwX3RjbF0KICAgICAgCiAgICAgICMgU3ludGhlc2l6aW5nIHRvIGdhdGVzIHVzaW5nIGVmZm9ydCBsZXZlbCBkZWZpbmVkIGJ5IHZhcnMoc3luX21hcF9lZmZvcnQpLgogICAgICBzZXQgY29tbWFuZCAiXG5zeW50aGVzaXplIC10b19tYXBwZWQgLWVmZm9ydCBoaWdoIC1ub19pbmNyZW1lbnRhbFxuXG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3luMm1hcCAkY29tbWFuZF0KICAgICAgCiAgICAgICAgIHNldCBjb21tYW5kICIiIAogICAgICBhcHBlbmQgY29tbWFuZCAicmVwb3J0X2FyZWEgICAgICAgICAgID4gJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkuYXJlYS5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlcG9ydF9kcCAgICAgICAgICAgICA+ICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmRhdGFwYXRoLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVwb3J0X3RpbWluZyAtbWF4X3BhdGhzIDUgICAgICAgICAgICAgLXBhdGhfdHlwZSBzdW1tYXJ5ICAgICA+ICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnN0YXJ0X2VuZF9zbGFjay5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlcG9ydF90aW1pbmcgLW1heF9wYXRocyAxICAgLW53b3JzdCAxIC1wYXRoX3R5cGUgZnVsbF9jbG9jayAgPiAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS53b3JzdF9tYXhfcGF0aC5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlcG9ydF90aW1pbmcgLW1heF9wYXRocyA1MDAgLW53b3JzdCAxIC1wYXRoX3R5cGUgZnVsbF9jbG9jayAgPiAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS50b3BfNTAwX3BhdGhzLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVwb3J0X2dhdGVzIC1wb3dlciAgID4gJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkuZ2F0ZXNfcG93ZXIucnB0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZXBvcnRfY2xvY2tfZ2F0aW5nICAgPiAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5jbG9ja2dhdGluZy5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlcG9ydF9wb3dlciAtZGVwdGggMCA+ICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnBvd2VyLnJwdFxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGdlbmVyYXRlX3JlcG9ydHMgJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInBvcF9zbmFwc2hvdF9zdGFja1xuIgogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxNn0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKSAtY2F0ZWdvcmllcyBkZXNpZ25cbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcClcbiIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIndyaXRlX21ldHJpYyAtZm9ybWF0IHRjbCAtZmlsZSAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS51bVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInJlcG9ydF9tZXRyaWMgLWZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoZGVzaWduKS5odG1sIC1mb3JtYXQgaHRtbFxuIgogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgIndyaXRlX2RiICR2YXJzKGRlc2lnbikgLWFsbF9yb290X2F0dHJpYnV0ZXMgLXRvX2ZpbGUgJHZhcnMoZGJzX2Rpcikvc3luX21hcC5kYlxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobWFpbCx0byldfSB7CiAgICAgICAgIHNldCBzdW1tYXJ5X2ZpbGUgJHZhcnMoc3RlcCkuc3VtbWFyeQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG1haWwsc3RlcHMpXSB8fCBcCiAgICAgICAgICAgICAoW2luZm8gZXhpc3RzIHZhcnMobWFpbCxzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhtYWlsLHN0ZXBzKSAkdmFycyhzdGVwKV0gIT0gLTEpKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+IE1BSUxJTkcgUkVTVUxUUyBUTyAkdmFycyhtYWlsLHRvKVwiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbZmlsZSBleGlzdHMgJHZhcnMocnB0X2RpcikvJHN1bW1hcnlfZmlsZVxdfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyAvYmluL21haWwgLXMgXCJGRjogJHZhcnMoZGVzaWduKSwgJHZhcnMoc3RlcCkgY29tcGxldGVkIChcW3NoZWxsIHB3ZFxdKVwiIDwgJHZhcnMocnB0X2RpcikvJHN1bW1hcnlfZmlsZSAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZWlmIHtcW2ZpbGUgZXhpc3RzICR2YXJzKHJwdF9kaXIpLyR7c3VtbWFyeV9maWxlfS5nelxdfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyBndW56aXAgLWMgJHZhcnMocnB0X2RpcikvJHtzdW1tYXJ5X2ZpbGV9Lmd6IFx8IC9iaW4vbWFpbCAtcyBcIkZGOiAkdmFycyhkZXNpZ24pLCAkdmFycyhzdGVwKSBjb21wbGV0ZWQgKFxbcHdkXF0pXCIgJHZhcnMobWFpbCx0bylcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9IGVsc2Uge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGV4ZWMgL2Jpbi9tYWlsIC1zIFwiRkY6ICR2YXJzKGRlc2lnbiksICR2YXJzKHN0ZXApIGNvbXBsZXRlZCAoXFtzaGVsbCBwd2RcXSlcIiA8IC9kZXYvbnVsbCAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgfQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2luZm8gZXhpc3RzIGVudihWUEFUSClcXX0geyIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJleGVjIC9iaW4vdG91Y2ggXCRlbnYoVlBBVEgpLyR2YXJzKHN0ZXApIgogICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKCiAgICAgIHJldHVybiAkY29tbWFuZHMKCiAgIH0KCiAgIHByb2MgcnVuX3N5bl9pbmNyIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIHNldCB2YXJzKHN0ZXApIHN5bl9pbmNyCgogICAgICBzZXQgY29tbWFuZHMgIiIKCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS92YXJzLnRjbFxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwcm9jIFB1dHMge2FyZ3N9IHtwdXRzIFwkYXJnc31cbiIKCiAgICAgIGlmIHskdmFycyhub3Z1cyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFxbZ2V0X2RiIHByb2dyYW1fdmVyc2lvbiAvXF1cbiIKICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFxbZ2V0X2F0dHIgcHJvZ3JhbV92ZXJzaW9uIC9cXVxuIgogICAgICB9CiAgICAgCiAgICAgICMjIGVuYWJsZSBtdWx0aSBwcm9jZXNzaW5nCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGhvc3RsaXN0IFxbbHJlcGVhdCAkdmFycyhsb2NhbF9jcHVzKSBsb2NhbGhvc3RcXVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kYiBzdXBlcl90aHJlYWRfc2VydmVycyBcJGhvc3RsaXN0XG4iCiAgICAgCiMgICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKX0gewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbmVuYWJsZV9tZXRyaWNzIC1vblxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXNoX3NuYXBzaG90X3N0YWNrXG4iCiMgICAgICB9CiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfc3luX2luY3JfdGNsXQogICAgICAKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2F0Y2ggeyBzZXRfcmVtb3ZlX2Fzc2lnbl9vcHRpb25zIC1za2lwX3VuY29uc3RyYWluZWRfcGF0aHMgLXBoeXNpY2FsIH1cbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIHJlbW92ZV9hc3NpZ25zIHRydWVcbiIKICAgICAgCiAgICAgIGlmIHskdmFycyhlbmFibGVfcGFtKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuc2V0X2RiIHBoeXNpY2FsX2F3YXJlX3Jlc3RydWN0dXJpbmcgdHJ1ZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kYiBwaHlzaWNhbF9hd2FyZV9zdHJ1Y3R1cmluZyAgIHRydWVcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgcGh5c2ljYWxfYXdhcmVfbWFwcGluZyAgICAgICB0cnVlXG4iCiAgICAgIH0KICAgICAgCiAgICAgICMjIyMgT1BUSU1JWkFUSU9OIEVGRk9SVCBDT05UUk9MCiAgICAgIGlmIHskdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJcbnNldF9kYiB0bnNfb3B0byB0cnVlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgaW9wdF9lbmFibGVfcGFyYWxsZWxpemF0aW9uIHRydWVcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiB1bHRyYV9nbG9iYWxfbWFwcGluZyB0cnVlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgaW9wdF91bHRyYV9vcHRpbWl6YXRpb24gdHJ1ZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2hpZ2hfZWZmb3J0X2F0dHJpYnV0ZXMgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICAgIHNldCBjb21tYW5kICIjc2V0X2RiIG9wdGltaXplX21lcmdlX2Zsb3BzICAgICAgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgb3B0aW1pemVfY29uc3RhbnRfMF9mbG9wcyB0cnVlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIG9wdGltaXplX2NvbnN0YW50XzFfZmxvcHMgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgb3B0aW1pemVfY29uc3RhbnRfbGF0Y2hlcyBmYWxzZVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBkZWxldGVfdW5sb2FkZWRfc2VxcyAgICAgIHRydWVcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgb3B0aW1pemVfbmV0X2FyZWEgICAgICAgICBmYWxzZVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9kYiBkcF9hcmVhX21vZGUgICAgICAgICAgICAgIHRydWVcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfZGIgYXV0b191bmdyb3VwICAgICAgICAgICAgICBub25lXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIGF1dG9fdW5ncm91cF9taW5fZWZmb3J0ICAgbG93XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2RiIHVuZ3JvdXBfc2VwYXJhdG9yICAgICAgICAgXG4iCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X29wdF9hdHRyaWJ1dGVzICRjb21tYW5kXQoKICAgICAgIyMjIERldGFpbCBTdGF0cyB3aGlsZSBydW5uaW5nCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiNzZXQgaW9wdF9zdGF0cyAxXG4iCiAgICAgIAogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBNYXggbGVha2FnZSBwb3dlciA/CiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjc2V0X2RiIG1heF9sZWFrYWdlX3Bvd2VyID9cbiIKICAgICAgc2V0IGNvbW1hbmQgIlxuc3ludGhlc2l6ZSAtdG9fbWFwcGVkIC1lZmZvcnQgaGlnaCAtaW5jclxuXG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3luMmluY3IgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3N5bl9pbmNyX3RjbF0KCiMgICAgICBhcHBlbmQgY29tbWFuZHMgImZvcmVhY2ggY2cgXFtmaW5kIC8gLWNvc3RfZ3JvdXAgKlxdIHtcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiICByZXBvcnQgdGltaW5nIC1jb3N0X2dyb3VwIFwkY2cgPj4gJHZhcnMocnB0X2Rpcikvc3luX2luY3JfXFtmaWxlIHRhaWwgXCRjZ1xdLnJwdFxuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIAogICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlcG9ydF9hcmVhICAgICAgICAgICA+ICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmFyZWEucnB0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZXBvcnRfZHAgICAgICAgICAgICAgPiAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5kYXRhcGF0aC5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlcG9ydF90aW1pbmcgLW1heF9wYXRocyA1ICAgICAgICAgICAgIC1wYXRoX3R5cGUgc3VtbWFyeSAgICAgPiAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5zdGFydF9lbmRfc2xhY2sucnB0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZXBvcnRfdGltaW5nIC1tYXhfcGF0aHMgMSAgIC1ud29yc3QgMSAtcGF0aF90eXBlIGZ1bGxfY2xvY2sgID4gJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkud29yc3RfbWF4X3BhdGgucnB0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZXBvcnRfdGltaW5nIC1tYXhfcGF0aHMgNTAwIC1ud29yc3QgMSAtcGF0aF90eXBlIGZ1bGxfY2xvY2sgID4gJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkudG9wXzUwMF9wYXRocy5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlcG9ydF9nYXRlcyAtcG93ZXIgICA+ICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmdhdGVzX3Bvd2VyLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVwb3J0X2Nsb2NrX2dhdGluZyAgID4gJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkuY2xvY2tnYXRpbmcucnB0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLWRlcHRoIDAgPiAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5wb3dlci5ycHRcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxnZW5lcmF0ZV9yZXBvcnRzICRjb21tYW5kXQoKICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwb3Bfc25hcHNob3Rfc3RhY2tcbiIKICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTZ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcCkgLWNhdGVnb3JpZXMgZGVzaWduXG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY3JlYXRlX3NuYXBzaG90IC1uYW1lICR2YXJzKHN0ZXApXG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ3cml0ZV9tZXRyaWMgLWZvcm1hdCB0Y2wgLWZpbGUgJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkudW1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZXBvcnRfbWV0cmljIC1maWxlICR2YXJzKHJwdF9kaXIpLyR2YXJzKGRlc2lnbikuaHRtbCAtZm9ybWF0IGh0bWxcbiIKICAgICAgfQoKICAgICAgICAgc2V0IGNvbW1hbmQgIndyaXRlX2RiICR2YXJzKGRlc2lnbikgLWFsbF9yb290X2F0dHJpYnV0ZXMgLXRvX2ZpbGUgJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkuZGJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2RiICRjb21tYW5kXQoKICAgICAgaWYgeyEkdmFycyhlbmFibGVfcmNwKX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiXG53cml0ZV9kZXNpZ24gLWlubm92dXMgLWd6aXAgLWJhc2VuYW1lICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLyR2YXJzKHN0ZXApXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgZmlsZSBcW29wZW4gJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkvJHZhcnMoc3RlcCkubm92dXNfc2V0dXAudGNsIHdcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAicHV0cyBcJGZpbGUgXCJldmFsX2VuYyBce3NvdXJjZSAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS8kdmFycyhzdGVwKS5lbmNfc2V0dXAudGNsXH1cIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiY2xvc2UgXCRmaWxlXG5cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG1haWwsdG8pXX0gewogICAgICAgICBzZXQgc3VtbWFyeV9maWxlICR2YXJzKHN0ZXApLnN1bW1hcnkKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhtYWlsLHN0ZXBzKV0gfHwgXAogICAgICAgICAgICAgKFtpbmZvIGV4aXN0cyB2YXJzKG1haWwsc3RlcHMpXSAmJiAoW2xzZWFyY2ggJHZhcnMobWFpbCxzdGVwcykgJHZhcnMoc3RlcCldICE9IC0xKSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiBNQUlMSU5HIFJFU1VMVFMgVE8gJHZhcnMobWFpbCx0bylcIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2ZpbGUgZXhpc3RzICR2YXJzKHJwdF9kaXIpLyRzdW1tYXJ5X2ZpbGVcXX0ge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGV4ZWMgL2Jpbi9tYWlsIC1zIFwiRkY6ICR2YXJzKGRlc2lnbiksICR2YXJzKHN0ZXApIGNvbXBsZXRlZCAoXFtzaGVsbCBwd2RcXSlcIiA8ICR2YXJzKHJwdF9kaXIpLyRzdW1tYXJ5X2ZpbGUgJHZhcnMobWFpbCx0bylcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9IGVsc2VpZiB7XFtmaWxlIGV4aXN0cyAkdmFycyhycHRfZGlyKS8ke3N1bW1hcnlfZmlsZX0uZ3pcXX0ge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGV4ZWMgZ3VuemlwIC1jICR2YXJzKHJwdF9kaXIpLyR7c3VtbWFyeV9maWxlfS5neiBcfCAvYmluL21haWwgLXMgXCJGRjogJHZhcnMoZGVzaWduKSwgJHZhcnMoc3RlcCkgY29tcGxldGVkIChcW3B3ZFxdKVwiICR2YXJzKG1haWwsdG8pXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifSBlbHNlIHtcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBleGVjIC9iaW4vbWFpbCAtcyBcIkZGOiAkdmFycyhkZXNpZ24pLCAkdmFycyhzdGVwKSBjb21wbGV0ZWQgKFxbc2hlbGwgcHdkXF0pXCIgPCAvZGV2L251bGwgJHZhcnMobWFpbCx0bylcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHsiCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS8kdmFycyhzdGVwKSIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCgogICAgICByZXR1cm4gJGNvbW1hbmRzCgogICB9CgogICBwcm9jIHJ1bl9zeW5fcGxhY2Uge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgc2V0IHZhcnMoc3RlcCkgc3luX3BsYWNlCgogICAgICBzZXQgY29tbWFuZHMgIiIKCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS92YXJzLnRjbFxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwcm9jIFB1dHMge2FyZ3N9IHtwdXRzIFwkYXJnc31cbiIKCiAgICAgIGlmIHskdmFycyhub3Z1cyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFxbZ2V0X2RiIHByb2dyYW1fdmVyc2lvblxdXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcW2dldF9hdHRyIHByb2dyYW1fdmVyc2lvblxdXG4iCiAgICAgIH0KICAgICAKICAgICAgIyMgZW5hYmxlIG11bHRpIHByb2Nlc3NpbmcKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgaG9zdGxpc3QgXFtscmVwZWF0ICR2YXJzKGxvY2FsX2NwdXMpIGxvY2FsaG9zdFxdXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIHN1cGVyX3RocmVhZF9zZXJ2ZXJzIFwkaG9zdGxpc3RcbiIKICAgICAKIyAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuZW5hYmxlX21ldHJpY3MgLW9uXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1c2hfc25hcHNob3Rfc3RhY2tcbiIKIyAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3N0bG9hZF9zeW5fcGxhY2VfdGNsKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgZW5jX3Bvc3Rsb2FkX3NjcmlwdCAkdmFycyhwb3N0bG9hZF9zeW5fcGxhY2VfdGNsKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwcmVleHBvcnRfc3luX3BsYWNlX3RjbCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIGVuY19wcmVleHBvcnRfc2NyaXB0ICR2YXJzKHByZWV4cG9ydF9zeW5fcGxhY2VfdGNsKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwcmVhbm5vdGF0aW9uX3N5bl9wbGFjZWRfdGNsKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgZW5jX3ByZWFubm90YXRpb25fdGNsICR2YXJzKHByZWFubm90YXRpb25fc3luX3BsYWNlZF90Y2wpXG4iCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIGVuY190ZW1wX2RpciAuL0lOTk9WVVMvcmNwX3J1blxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kYiBlbmNfZ3ppcF9pbnRlcmZhY2VfZmlsZXMgdHJ1ZVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kYiBwcW9zX3BsYWNlbWVudF9lZmZvcnQgbm9fdmFsdWVcbiIKCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCA6OnBoeXM6OnBxb3NfdG5zX29wdCAxXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIGlvcHRfZW5hYmxlX3BhcmFsbGVsaXphdGlvbiBmYWxzZVxuIgogICAgICAKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWZfZmlsZXMpXX0gewojICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGRlZl9maWxlcykgewojICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX2RlZiAkdmFycyhkZWZfZmlsZXMpXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9kZWYgJGNvbW1hbmRdCiMgICAgICAgICAgICB9CiMgICAgICAgICB9CiMgICAgICB9CiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfc3luX3BsYWNlX3RjbF0KICAgICAKICAgICAgc2V0IGNvbW1hbmQgIlxuc3ludGhlc2l6ZSAtdG9fcGxhY2VkIC1lZmZvcnQgaGlnaCAtcHFvc19vbmx5XG5cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHN5bjJwbGFjZSAkY29tbWFuZF0KCiAgICAgIHNldCBjb21tYW5kICJcbnN5bnRoZXNpemUgLXRvX3BsYWNlZCAtZWZmb3J0IGhpZ2ggLWluY3JcblxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3luMnBsYWNlX2luY3IgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3N5bl9wbGFjZV90Y2xdCgogICAgICBhcHBlbmQgY29tbWFuZHMgIjo6cGh5czo6cW9zX3N0YXRzIC1xdWlldCAtdGFnIHN5bjJwbGFjZWRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICI6OnBoeXM6OnFvc193cml0ZV9zdGF0c19hcnJheSA+ICR2YXJzKHJwdF9kaXIpL3Fvc19zdGF0cy5xZGJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICI6OnBoeXM6OnFvc19zdW1tYXJ5XG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgImZvcmVhY2ggY2cgXFtmaW5kIC8gLWNvc3RfZ3JvdXAgKlxdIHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgIHJlcG9ydCB0aW1pbmcgLWNvc3RfZ3JvdXAgXCRjZyA+PiAkdmFycyhycHRfZGlyKS9zeW5fcGxhY2VfXFtmaWxlIHRhaWwgXCRjZ1xdLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZXBvcnRfYXJlYSAgICAgICAgICAgPiAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5hcmVhLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVwb3J0X2RwICAgICAgICAgICAgID4gJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkuZGF0YXBhdGgucnB0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZXBvcnRfdGltaW5nIC1tYXhfcGF0aHMgNSAgICAgICAgICAgICAtcGF0aF90eXBlIHN1bW1hcnkgICAgID4gJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkuc3RhcnRfZW5kX3NsYWNrLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVwb3J0X3RpbWluZyAtbWF4X3BhdGhzIDEgICAtbndvcnN0IDEgLXBhdGhfdHlwZSBmdWxsX2Nsb2NrICA+ICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLndvcnN0X21heF9wYXRoLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVwb3J0X3RpbWluZyAtbWF4X3BhdGhzIDUwMCAtbndvcnN0IDEgLXBhdGhfdHlwZSBmdWxsX2Nsb2NrICA+ICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnRvcF81MDBfcGF0aHMucnB0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZXBvcnRfZ2F0ZXMgLXBvd2VyICAgPiAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5nYXRlc19wb3dlci5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlcG9ydF9jbG9ja19nYXRpbmcgICA+ICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmNsb2NrZ2F0aW5nLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVwb3J0X3Bvd2VyIC1kZXB0aCAwID4gJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZ2VuZXJhdGVfcmVwb3J0cyAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicG9wX3NuYXBzaG90X3N0YWNrXG4iCiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDE2fSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY3JlYXRlX3NuYXBzaG90IC1uYW1lICR2YXJzKHN0ZXApIC1jYXRlZ29yaWVzIGRlc2lnblxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKVxuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAid3JpdGVfbWV0cmljIC1mb3JtYXQgdGNsIC1maWxlICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLnVtXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicmVwb3J0X21ldHJpYyAtZmlsZSAkdmFycyhycHRfZGlyKS8kdmFycyhkZXNpZ24pLmh0bWwgLWZvcm1hdCBodG1sXG4iCiAgICAgIH0KCiAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAkdmFycyhkZXNpZ24pIC1hbGxfcm9vdF9hdHRyaWJ1dGVzIC10b19maWxlICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLmRiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx3cml0ZV9kYiAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyhlbmFibGVfcmNwKX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiXG53cml0ZV9kZXNpZ24gLWlubm92dXMgLWd6aXAgLWJhc2VuYW1lICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLyR2YXJzKHN0ZXApXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgZmlsZSBcW29wZW4gJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkvJHZhcnMoc3RlcCkubm92dXNfc2V0dXAudGNsIHdcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAicHV0cyBcJGZpbGUgXCJldmFsX2VuYyBce3NvdXJjZSAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS8kdmFycyhzdGVwKS5lbmNfc2V0dXAudGNsXH1cIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiY2xvc2UgXCRmaWxlXG5cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG1haWwsdG8pXX0gewogICAgICAgICBzZXQgc3VtbWFyeV9maWxlICR2YXJzKHN0ZXApLnN1bW1hcnkKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhtYWlsLHN0ZXBzKV0gfHwgXAogICAgICAgICAgICAgKFtpbmZvIGV4aXN0cyB2YXJzKG1haWwsc3RlcHMpXSAmJiAoW2xzZWFyY2ggJHZhcnMobWFpbCxzdGVwcykgJHZhcnMoc3RlcCldICE9IC0xKSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiBNQUlMSU5HIFJFU1VMVFMgVE8gJHZhcnMobWFpbCx0bylcIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2ZpbGUgZXhpc3RzICR2YXJzKHJwdF9kaXIpLyRzdW1tYXJ5X2ZpbGVcXX0ge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGV4ZWMgL2Jpbi9tYWlsIC1zIFwiRkY6ICR2YXJzKGRlc2lnbiksICR2YXJzKHN0ZXApIGNvbXBsZXRlZCAoXFtzaGVsbCBwd2RcXSlcIiA8ICR2YXJzKHJwdF9kaXIpLyRzdW1tYXJ5X2ZpbGUgJHZhcnMobWFpbCx0bylcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9IGVsc2VpZiB7XFtmaWxlIGV4aXN0cyAkdmFycyhycHRfZGlyKS8ke3N1bW1hcnlfZmlsZX0uZ3pcXX0ge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGV4ZWMgZ3VuemlwIC1jICR2YXJzKHJwdF9kaXIpLyR7c3VtbWFyeV9maWxlfS5neiBcfCAvYmluL21haWwgLXMgXCJGRjogJHZhcnMoZGVzaWduKSwgJHZhcnMoc3RlcCkgY29tcGxldGVkIChcW3B3ZFxdKVwiICR2YXJzKG1haWwsdG8pXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifSBlbHNlIHtcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBleGVjIC9iaW4vbWFpbCAtcyBcIkZGOiAkdmFycyhkZXNpZ24pLCAkdmFycyhzdGVwKSBjb21wbGV0ZWQgKFxbc2hlbGwgcHdkXF0pXCIgPCAvZGV2L251bGwgJHZhcnMobWFpbCx0bylcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNjaGVkdWxlX2Zsb3cgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2luZm8gZXhpc3RzIGVudihWUEFUSClcXX0geyIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJleGVjIC9iaW4vdG91Y2ggXCRlbnYoVlBBVEgpLyR2YXJzKHN0ZXApIgogICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKCiAgICAgIHJldHVybiAkY29tbWFuZHMKCiAgIH0KCiAgIHByb2MgcnVuX2luaXQge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgd2FybmluZ3MKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIHNldCB1Y29tbWVudHMgIiIKICAgICAgc2V0IGNvbW1lbnRzICIiCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnModmlld19kZWZpbml0aW9uX3RjbClcbiIKICAgICAgfQoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzdGVwKV0gfHwgKCgkdmFycyhzdGVwKSAhPSAicGFydGl0aW9uX3BsYWNlIikgJiYgKCR2YXJzKHN0ZXApICE9ICJtb2RlbF9nZW4iKSAmJiAoJHZhcnMoc3RlcCkgIT0gInByb3RvdHlwZSIpKX0geyAKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycyhzdGVwKSBpbml0XG4iCiAgICAgICAgIHNldCB2YXJzKHN0ZXApIGluaXQKICAgICAgfSAKCiAgICAgIGlmIHskdmFycyhyZXBvcnRfcnVuX3RpbWUpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoJHZhcnMoc3RlcCksc3RhcnRfdGltZSkgXFtjbG9jayBzZWNvbmRzXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhyZXBvcnRfcnVuX3RpbWUpXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHJlcG9ydF9ydW5fdGltZSlcbiIKICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKHN0ZXApLHJwdF9kaXIpXX0gewogICAgICAgICBzZXQgdmFycyhycHRfZGlyKSAkdmFycygkdmFycyhzdGVwKSxycHRfZGlyKQogICAgICAgICBmaWxlIG1rZGlyICR2YXJzKCR2YXJzKHN0ZXApLHJwdF9kaXIpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCB2YXJzKHJwdF9kaXIpICR2YXJzKG9yaWdfcnB0X2RpcikKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIE1ha2Ugc3VyZSBuZWNlc3NhcnkgZGF0YSBpcyBkZWZpbmVkCiAgICAgICMgQ3JlYXRlIG1ha2UgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3RzCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeyEkdmFycyhjb2RlZ2VuKX0gIHsgCiAgICAgICAgIHNldCBjb21tYW5kICJGRl9OT1ZVUzo6Y2hlY2tfc2V0dXBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNsZWVwIDNcbiIKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kIAogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTWFrZSBzdXJlIG5lY2Vzc2FyeSBkYXRhIGlzIGRlZmluZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgZm9yZWFjaCBkaXIgIltzdWJzdCAkdmFycyhkYnNfZGlyKV0gW3N1YnN0ICR2YXJzKHJwdF9kaXIpXSBbc3Vic3QgJHZhcnMobG9nX2RpcildIiB7CiAgICAgICAgIHNldCBuZXdEaXIgW3N1YnN0ICRkaXJdCiAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICRuZXdEaXJdfSAgewogICAgICAgICAgICBmaWxlIG1rZGlyICRuZXdEaXIKICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGJ1ZmZlcl90aWVfYXNzaWduKV0gJiYgJHZhcnMoYnVmZmVyX3RpZV9hc3NpZ24pfSAgewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgaW5pdF9idWZmZXJfdGllX2Fzc2lnbiB0cnVlXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGJ1ZmZlcl90aWVfYXNzaWduKVxuIgojICAgICAgfSBlbHNlIHsKIyAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGJ1ZmZlcl90aWVfYXNzaWduKVxuIgojICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGdyb3VuZF9uZXRzKV19ICB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIGluaXRfZ3JvdW5kX25ldHMgXCIkdmFycyhncm91bmRfbmV0cylcIlxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGdyb3VuZF9uZXRzKVxuIgogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhncm91bmRfbmV0cylcbiIKICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX25ldHMpXX0gIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGIgaW5pdF9wb3dlcl9uZXRzIFwiJHZhcnMocG93ZXJfbmV0cylcIlxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHBvd2VyX25ldHMpXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHBvd2VyX25ldHMpXG4iCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIHByZS1pbml0aWFsaXphdGlhb24gcGx1Zy1pbiBzY3JpcHQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfaW5pdF90Y2xdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgVGhlc2UgZmxvdyBzY3JpcHRzIHN1cHBvcnQgdGhlIGZvbGxvd2luZzoKICAgICAgIyAtIEZsYXQgY2hpcCBvciBibG9jawogICAgICAjIC0gSGllcmFyY2hpY2FsIHBhcnRpdGlvbgogICAgICAjIC0gVG9wIGxldmVsIHBhcnRpdGlvbgogICAgICAjCiAgICAgICMgVGhlIGRhdGEgbG9hZGluZyBtZWNoYW5pc20gYXJlIHNsaWdodGx5IGRpZmZlcmVudCBmb3IgZWFjaCBzbyB3ZSBkZXRlcm1pbmUKICAgICAgIyBmaXJzdCBpZiB3ZSBhcmUgaW4gYSBoaWVyYXJjaGljYWwgZmxvdyAoaS5lLiB2YXJzKHBhcnRpdGlvbl9saXN0KSBpcwogICAgICAjIGRlZmluZWQgYW5kLCBpZiBzbywgd2hldGhlciB3ZSBhcmUgaW4gYSBoaWVyYXJjaGljYWwgcGFydGl0aW9uIGZsb3cKICAgICAgIyBvciBhIHRvcCBwYXJ0aXRpb24gZmxvdyAoaS5lLiBjd2QgPT0gJHZhcnMoZGVzaWduKSAtIHNlZSBiZWxvdykKICAgICAgIwogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgRkZfTk9WVVM6OmNoZWNrX2Zsb3cKCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYRUNVVElORyBGTE9XXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCiAgICAgIHNldCBoaWVyIDAKICAgICAgCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhzdGVwKSxzdGFydGluZ19kYnMpXX0gewogICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAjIEludGVycHJldCB0aGUgc3RhcnRpbmcgREJTIGFzIGFuIE9BIHRyaXBsZQogICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgIltsaXN0IHJlYWRfZGIgLWNlbGx2aWV3ICR2YXJzKCR2YXJzKHN0ZXApLHN0YXJ0aW5nX2RicyldXG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBpc2RpcmVjdG9yeSAkdmFycygkdmFycyhzdGVwKSxzdGFydGluZ19kYnMpXX0gewogICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlYWRfZGIgJHZhcnMoJHZhcnMoc3RlcCksc3RhcnRpbmdfZGJzKSBcbiIKICAgICAgICAgICAgfSBlbHNlaWYge1tmaWxlIGV4aXN0cyAkdmFycygkdmFycyhzdGVwKSxzdGFydGluZ19kYnMpXX0gewogICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlYWRfZGIgJHZhcnMoJHZhcnMoc3RlcCksc3RhcnRpbmdfZGJzKSBcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBwdXRzICI8RkY+IFN0YXJ0aW5nIERCUyAoJHZhcnMoJHZhcnMoc3RlcCksc3RhcnRpbmdfZGJzKSkgZGVmaW5lZCBidXQgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVhZF9kYiAkdmFycygkdmFycyhzdGVwKSxzdGFydGluZ19kYnMpIFxuIgogICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlN0YXJ0aW5nIERCUyAoJHZhcnMoJHZhcnMoc3RlcCksc3RhcnRpbmdfZGJzKSkgZGVmaW5lZCBidXQgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfZGIgJHJlc3RvcmVfY29tbWFuZF0KCiAgICAgIH0gZWxzZSB7CgogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0gfHwgKFtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0gJiYgXAogICAgICAgICAgICAgIChbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSAhPSAiJHZhcnMocGFydGl0aW9uX2RpcikiKSl9IHsKICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBQYXJ0aXRpb24gc3RlcCBvciBmbGF0IGluaXQgc3RlcAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldfSB7IAogICAgICAgICAgICAgICBzZXQgaGllciAxCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBGTEFUIElNUExFTUVOVEFUSU9OIEZMT1dcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUEFSVElUSU9OSU5HIEZMT1dcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgTE9BRElORyBERVNJR04gREFUQVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgTG9hZCBkZXNpZ24gY29uZmlndXJhdGlvbiBmaWxlCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgCiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvZ2VuZXJpYy5jb25mCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGlsbSl9IHsKICAgICAgICAgICAgICAgc2V0IGlsbV9saXN0ICR2YXJzKGlsbV9saXN0KQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGlsbV9saXN0KSBcIjxsaXN0IG9mIElMTXM+XCJcbiIKICAgICAgICAgICAgICAgaWYgeyR2YXJzKG1vZGUpID09ICJib3R0b21fdXAifSB7CiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQsaWxtX2RpcildfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoPGlsbT4saWxtX2RpcikgXCI8cGF0aCB0byBJTE0gZGlyZWN0b3J5PlwiXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkaWxtX2xpc3QgJHBhcnRdID09IC0xfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgaWxtX2xpc3QgJHBhcnQKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBmb3JlYWNoIGlsbSAkaWxtX2xpc3QgewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGlsbSxsZWZfZmlsZSldICYmIFtmaWxlIGV4aXN0cyAkdmFycygkaWxtLGxlZl9maWxlKV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyg8aWxtPixsZWZfZmlsZSkgXCI8TEVGIGZpbGUgZm9yIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCBJTE0+XCJcbiIKICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgcmRhX0lucHV0KHVpX2xlZmZpbGUpICR2YXJzKCRpbG0sbGVmX2ZpbGUpCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHZhcnMoZGJzX2Zvcm1hdCkgImZlIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKGxlZl9maWxlcykgJHZhcnMoJGlsbSxsZWZfZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gV0FSTklORzogTEVGIGZpbGUgZWl0aGVyIG5vdCBkZWZpbmVkIG9yIGRvZXNuJ3QgZXhpc3QgZm9yICRpbG0iCiAgICAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gICAgICAgICAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBpbiB5b3VyIHZhcnMobGVmX2ZpbGVzKSBsaXN0IgogICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJMRUYgZmlsZSBlaXRoZXIgbm90IGRlZmluZWQgb3IgZG9lc24ndCBleGlzdCBmb3IgJGlsbVxuXHRQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGluIHlvdXIgdmFycyhsZWZfZmlsZXMpIGxpc3QiCiAgICAgICAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkaWxtLHNldHVwX2xpYildICYmIFtmaWxlIGV4aXN0cyAkdmFycygkaWxtLHNldHVwX2xpYildfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoPGlsbT4sc2V0dXBfbGliKSBcIjxMSUIgZmlsZSBmb3IgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIElMTT5cIlxuIgogICAgICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgcmRhX0lucHV0KHVpX3RpbWVsaWIpICR2YXJzKCRpbG0sc2V0dXBfbGliKQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggc2V0ICR2YXJzKGxpYnJhcnlfc2V0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnMoJHNldCx0aW1pbmcpICR2YXJzKCRpbG0sc2V0dXBfbGliKV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKCRzZXQsdGltaW5nKSAkdmFycygkaWxtLHNldHVwX2xpYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IExJQiBmaWxlIGVpdGhlciBub3QgZGVmaW5lZCBvciBkb2Vzbid0IGV4aXN0IGZvciAkaWxtIgogICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+ICAgICAgICAgIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgaW4geW91ciBsaWJyYXJ5IHNldCBkZWZpbml0aW9ucyIKICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiTElCIGZpbGUgZWl0aGVyIG5vdCBkZWZpbmVkIG9yIGRvZXNuJ3QgZXhpc3QgZm9yICRpbG1cblx0UGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBpbiB5b3VyIGxpYnJhcnkgc2V0IGRlZmluaXRpb25zIgogICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGlsbV9saXN0KSBcIjxsaXN0IG9mIElMTXM+XCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoPGlsbT4saWxtX2RpcikgXCI8cGF0aCB0byBJTE0gZGlyZWN0b3J5PlwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKDxpbG0+LGxlZl9maWxlKSBcIjxMRUYgZmlsZSBmb3IgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIElMTT5cIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyg8aWxtPixzZXR1cF9saWIpIFwiPExJQiBmaWxlIGZvciBibG9jayBhc3NvY2lhdGVkIHdpdGggSUxNPlwiXG4iCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgIEZGX05PVlVTOjpkdW1wX2NvbmZpZwogICAKICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKG5ldGxpc3RfdHlwZSkgInZlcmlsb2ciXT49MH0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIiAKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewogICAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnMoc2NyaXB0X2Rpcikvdmlld19kZWZpbml0aW9uLnRjbAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX21tbWMgJG1tbWNfZmlsZVxuIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobGVmX2ZpbGVzKV19IHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9waHlzaWNhbCAtbGVmIFwiXFxcbiIKICAgICAgICAgICAgICAgICBmb3JlYWNoIGxlZiAkdmFycyhsZWZfZmlsZXMpIHsKIyAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJlYWRfcGh5c2ljYWwgLWxlZiAkbGVmXG4iCiAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlx0JGxlZlxcXG4iCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcIlxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMob2FfcmVmX2xpYildfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX3BoeXNpY2FsIC1vYV9yZWZfbGliICIKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBsaWIgJHZhcnMob2FfcmVmX2xpYikgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAgIiAkbGliIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhuZXRsaXN0KV19IHsKICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX25ldGxpc3QgJHZhcnMobmV0bGlzdClcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJlYWRfcG93ZXJfaW50ZW50IC1jcGYgJHZhcnMoY3BmX2ZpbGUpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImluaXRfZGVzaWduXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0X2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcG93ZXJfbGVha2FnZV9wb3dlcl92aWV3ICR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgcG93ZXJfZHluYW1pY19wb3dlcl92aWV3ICR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcG93ZXJfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JGhpZXJ9IHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHN0ZXApID09ICJwYXJ0aXRpb25fcGxhY2UifSB7IAogICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX2RiIC1jZWxsdmlldyBcW2xpc3QgJHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMob2FfZGVzaWduX2NlbGwpICR2YXJzKG9hX2Rlc2lnbl92aWV3KVxdXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlYWRfZGIgLWNlbGx2aWV3IFxbbGlzdCAkdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkdmFycyhvYV9kZXNpZ25fY2VsbCkgJHZhcnMob2FfZGVzaWduX3ZpZXcpXF1cbiIKICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9kYiAtY2VsbHZpZXcgXFtsaXN0ICR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKG9hX2Rlc2lnbl9jZWxsKSAkdmFycyhvYV9kZXNpZ25fdmlldylcXVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZWFkX2RiICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgTG9hZCAiYWx3YXlzIHNvdXJjZSIgcGx1Zy1pbiBzY3JpcHQKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBhbHdheXNfc291cmNlX3RjbF0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBlaXRoZXIgYSBmbG9vcnBsYW4gZmlsZSwgYQogICAgICAgICAgICAjIERFRiBmaWxlLCBvciBib3RoIGFuZCBsb2FkIHRoZW0KICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBzZXQgY29tbWFuZCAiIiAKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZwX3RjbF9maWxlKV0gfHwgW2luZm8gZXhpc3RzIHZhcnMoZnBfdGNsX3Byb2MpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGZwX3RjbF9maWxlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGZwX3RjbF9wcm9jKVxuIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZnBfdGNsX2ZpbGUpXSAmJiAhW2luZm8gZXhpc3RzIHZhcnMoZnBfdGNsX3Byb2MpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiZmZfcHJvY3M6OnNvdXJjZV9maWxlICR2YXJzKGZwX3RjbF9maWxlKVxuIgogICAgICAgICAgICAgICB9IGVsc2VpZiB7IVtpbmZvIGV4aXN0IHZhcnMoZnBfdGNsX2ZpbGUpXSAmJiBbaW5mbyBleGlzdHMgdmFycyhmcF90Y2xfcHJvYyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIkdmFycyhmcF90Y2xfcHJvYylcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIEVSUk9SOiBCb3RoIGZwX3RjbF9maWxlIGFuZCBmcF90Y2xfcHJvYyBhcmUgZGVmaW5lZCBidXQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVxuIgogICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCR2YXJzKGVycm9yX2NvdW50KSkgIkJvdGggZnBfdGNsX2ZpbGUgYW5kIGZwX3RjbF9wcm9jIGFyZSBkZWZpbmVkIGJ1dCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIgogICAgICAgICAgICAgICAgICBpbmNyIHZhcnMoZXJyb3JfY291bnQpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZnBfdGNsX2ZpbGUpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGZwX3RjbF9wcm9jKVxuIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZnBfZmlsZSldfSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoZnBfZmlsZSldfSB7CiAgICMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicHV0cyBcIjxGRj4gTE9BRElORyBGUCBGSUxFICR2YXJzKGZwX2ZpbGUpXCJcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJlYWRfZmxvb3JwbGFuICR2YXJzKGZwX2ZpbGUpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmcF9maWxlKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmcF9maWxlKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9mcCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJvYUluICR2YXJzKG9hX2ZwKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKG9hX2ZwKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhvYV9mcClcbiIKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZl9maWxlcyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVmX2ZpbGVzKVxuIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMocmMpfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfcmNwKX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhuZXRsaXN0KSAgICR2YXJzKGRic19kaXIpL3N5bl9wbGFjZS9zeW5fcGxhY2Uudi5negogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRic19kaXIpL3N5bl9wbGFjZS9zeW5fcGxhY2UuZGVmLmd6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbnNlcnRfZGZ0KV0gJiYgJHZhcnMoaW5zZXJ0X2RmdCl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKGRlZl9maWxlcykgJHZhcnMoZGJzX2Rpcikvc3luX3BsYWNlL3N5bl9wbGFjZS5zY2FuLmRlZi5negogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKG5ldGxpc3QpICAgJHZhcnMoZGJzX2Rpcikvc3luX2luY3Ivc3luX2luY3Iudi5negogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRic19kaXIpL3N5bl9pbmNyL3N5bl9pbmNyLmRlZi5negogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaW5zZXJ0X2RmdCldICYmICR2YXJzKGluc2VydF9kZnQpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRic19kaXIpL3N5bl9pbmNyL3N5bl9pbmNyLnNjYW4uZGVmLmd6CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGRlZl9maWxlICR2YXJzKGRlZl9maWxlcykgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9kZWYgJGRlZl9maWxlXG4iCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZGVmX2ZpbGUgJHZhcnMoZGVmX2ZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJGRlZl9maWxlXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9kZWYgJGRlZl9maWxlXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVmX2ZpbGVzKVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhkZWZfZmlsZXMpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVmX2ZpbGVzKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfZmxvb3JwbGFuICRjb21tYW5kXQogICAKICAgICAgICAgICAgaWYgeygkdmFycyhwYXJlbnQpID09ICJyYyIpICYmICR2YXJzKHJjKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBhbHdheXNfc291cmNlX3RjbF0KICAgICAgICAgICAgICAgaWYgeyR2YXJzKHJlcG9ydF9ydW5fdGltZSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkdmFycyhzdGVwKSxzdGFydF90aW1lKSBcW2Nsb2NrIHNlY29uZHNcXVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9pbml0X3RjbF0KICAgICAgICAgICAgfQogICAKICAgIyAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhndWlkZXMpXX0gewogICAjICAgICAgICAgICAgc2V0IGNvbW1hbmQgIlxuYnVpbGRfZ3VpZGVzXG4iCiAgICMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgaW5pdCxidWlsZF9ndWlkZXMgJGNvbW1hbmRdCiAgICMgICAgICAgICB9CiAgICMgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoYmxvY2thZ2VzKV19IHsKICAgIyAgICAgICAgICAgIHNldCBjb21tYW5kICJcbmFkZF9ibG9ja2FnZXNcbiIKICAgIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBpbml0LGFkZF9ibG9ja2FnZXMgJGNvbW1hbmRdCiAgICMgICAgICAgICB9CgogICAgICAgICAgICBpZiB7JHZhcnMoYWRkX3RyYWNrcyl9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFkZF90cmFja3NcbiIKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhvbm9yX3BpdGNoKV0gJiYgJHZhcnMoaG9ub3JfcGl0Y2gpfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIgYWRkX3RyYWNrcyAtaG9ub3JfcGl0Y2hcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksYWRkX3RyYWNrcyAkY29tbWFuZF0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhhZGRfdHJhY2tzKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhhZGRfdHJhY2tzKVxuIgogICAgICAgICAgICB9CiAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBEZWZpbmUgcG93ZXIgaW50ZW50IGlmIGl0IGlzIGRlZmluZWQgKGxvdyBwb3dlciBmbG93KQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAjICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6bG9hZF9wb3dlcl9pbnRlbnRdCiAgIAogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoYWN0aXZpdHlfZmlsZSldfSB7CiAgICMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGhlYWRlcgogICAjICAgICAgICAgICAgc2V0IGhlYWRlciAiIgogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVhZEFjdGl2aXR5RmlsZSAtZm9ybWF0ICR2YXJzKGFjdGl2aXR5X2ZpbGVfZm9ybWF0KSAkdmFycyhhY3Rpdml0eV9maWxlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9hY3Rpdml0eV9maWxlICRjb21tYW5kXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGFjdGl2aXR5X2ZpbGUpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoYWN0aXZpdHlfZmlsZV9mb3JtYXQpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGFjdGl2aXR5X2ZpbGUpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGFjdGl2aXR5X2ZpbGVfZm9ybWF0KVxuIgogICAgICAgICAgICB9CgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU3BlY2lmeSBJTE1zIGlmIGRlZmluZWQKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIGlsbV9saXN0XSAmJiAoJGlsbV9saXN0ICE9ICIiKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBmb3JlYWNoIGNlbGwgJGlsbV9saXN0IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjZWxsLGlsbV9kaXIpXSAmJiBbZmlsZSBpc2RpcmVjdG9yeSAkdmFycygkY2VsbCxpbG1fZGlyKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkY2VsbCAtZGlyZWN0b3J5ICR2YXJzKCRjZWxsLGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkY2VsbCAtb2FfY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIFxbZ2V0X2RiIGRlc2lnbnMgLm5hbWVcXSBpbG19XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkY2VsbCAtZGlyZWN0b3J5ICR2YXJzKCRjZWxsLGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBpbG0gZGlyZWN0b3J5IG1pc3NpbmcgZm9yICRjZWxsIgogICAgICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCR2YXJzKGVycm9yX2NvdW50KSkgIklMTSBkaXJlY3RvcnkgbWlzc2luZyBmb3IgJGNlbGwiCiAgICAgICAgICAgICAgICAgICAgIGluY3IgdmFycyhlcnJvcl9jb3VudCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAKIyAgICAgICAgICAgIGlmIHskdmFycyhpbG0pICYmIFtpbmZvIGV4aXN0cyB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXX0gewojICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKIyAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewojICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRUaW1pbmdDb24gLWlsbU5vblNkY0ZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKIyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0SWxtTm9uU2RjQ29uc3RyYWludEZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKIyAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGNvbW1hbmRdCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKIyAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBMb2FkIHRpbWluZyBlbnZpcm9tZW50IGJhc2VkIG9uIHRoZSBmbG93IHNldHRpbmcgaW4gdGhlCiAgICAgICAgICAgICMgc2V0dXAudGNsIGZpbGUuIElmIHRoZSBmbG93IGlzIG1tbWMsIGxvYWQgdGhlIG1tbWMgc2V0dXAKICAgICAgICAgICAgIyBoZXJlIGVsc2UgbG9hZCB0aGUgZGVmYXVsdCB0aW1pbmcgZW52aXJvbm1lbnQKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgU0VUVElORyBVUCBUSU1JTkcgRU5WSVJPTk1FTlRcbiIKICAgIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBpZiB7JHZhcnMoZmxvdykgPT0gIm1tbWMifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3RpbWluZyBtaW5tYXhdCiAgICAgICAgICAgIH0KICAgCiAgICMgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lIHZhcnNdIHsKICAgIyAgICAgICAgaWYgeygkdmFyICE9ICJzdGVwIikgJiYgKCR2YXIgIT0gIm1vZGUiKSAmJiAoJHZhciAhPSAiaWxtIikgJiYgXAogICAjICAgICAgICAgICAgKCR2YXIgIT0gImZsYXZvciIpICYmICgkdmFyICE9ICJ1c2VyX21vZGUiKSAmJiAoJHZhciAhPSAiZmxhdCIpICYmIFwKICAgIyAgICAgICAgICAgICgkdmFyICE9ICJyZXBvcnRfcnVuX3RpbWUiKSAmJiAoJHZhciAhPSAibWFrZWZpbGUiKSAmJiAoJHZhciAhPSAiY29kZWdlbiIpICYmIFwKICAgIyAgICAgICAgICAgICgkdmFyICE9ICJiYWNrdXBfZGF0YSIpICYmICgkdmFyICE9ICJ2ZXJib3NlIikgJiYgKCR2YXIgIT0gImZvcm1hdF9saW5lcyIpICYmIFwKICAgIyAgICAgICAgICAgICgkdmFyICE9ICJ3YXJuaW5nX2NvdW50IikgJiYgKCR2YXIgIT0gImVycm9yX2NvdW50IikgJiYgKCR2YXIgIT0gInJjIikgJiYgXAogICAjICAgICAgICAgICAgKCR2YXIgIT0gImFkZF90cmFja3MiKSAmJiAoJHZhciAhPSAiZml4X2hvbGQiKSAmJiAoJHZhciAhPSAiaG9ub3JfcGl0Y2giKSAmJiBcCiAgICMgICAgICAgICAgICAoJHZhciAhPSAic2NyaXB0X3BhdGgiKSAmJiAoJHZhciAhPSAiZml4X2hvbGQiKSAmJiAoJHZhciAhPSAiaG9ub3JfcGl0Y2giKSAmJiBcCiAgICMgICAgICAgICAgICAoJHZhciAhPSAic3RlcHMiKSAmJiAoJHZhciAhPSAic291cmNlZCIpICYmICgkdmFyICE9ICJ2ZXJzaW9uIil9IHsKICAgIyAgICAgICAgICAgc2V0IHZhcnMoJHZhcikgIlxcXCR2YXJzKCR2YXIpIgogICAjICAgICAgICB9CiAgICMgICAgIH0KICAgICAgCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmRlcmF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBMb2FkIHNjYW4gREVGIGlmIGl0IGV4aXN0cwogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzY2FuX2RlZildfSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoc2Nhbl9kZWYpXX0gewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IExPQURJTkcgU0NBTiBERUYgRklMRVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9kZWYgJHZhcnMoc2Nhbl9kZWYpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX3NjYW4gJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhzY2FuX2RlZilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoc2Nhbl9kZWYpXG4iCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTcGVjaWZ5IHNwYXJlIGdhdGVzIGZvciBwbGFjZW1lbnQgYW5kIG9wdGltaXphdGlvbiBjb25zaWRlcmF0aW9uOyB0aGlzIGFzc3VtZXMKICAgICAgICAgICAgIyB0aGUgc3BhcmUgY2VsbHMgYXJlIGluIHRoZSBuZXRsaXN0LgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc3BhcmVfY2VsbHMpXX0gewogICAgICAgICAgICAgICBmb3JlYWNoIHNwYXJlX2NlbGwgJHZhcnMoc3BhcmVfY2VsbHMpIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlfc3BhcmVfZ2F0ZSAtaW5zdCAkc3BhcmVfY2VsbFxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoc3BhcmVfY2VsbHMpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHNwYXJlX2NlbGxzKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzcGVjaWZ5X3NwYXJlX2dhdGVzICRjb21tYW5kXQogICAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIExvYWQgdGhlIHJlY29tbWVuZGVkIGNvbW1hbmQgbW9kZSBzZXR0aW5ncwogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIERFRklOSU5HIE1PREUgU0VUVElOR1NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgZG9uJ3QgdXNlIGNlbGxzOyBkaXNhYmxlIHNvbWUgKGNsb2NrIGJ1ZmZlcnMsIHN0cm9uZyBidWZmZXJzLCBldGMuKSwKICAgICAgICAgICAgIyBlbmFibGUgb3RoZXJzIHRoYXQgbWF5IGhhdmUgImRvbnRfdXNlIHRydWUiIGluIHRoZSBsaWJyYXJ5IChsaWtlIGRlbGF5IGNlbGxzCiAgICAgICAgICAgICMgZm9yIGhvbGQgZml4aW5nKQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkb250X3VzZV9saXN0KV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9pbnRlcmFjdGl2ZV9jb25zdHJhaW50X21vZGVzIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdXG4iCiAgICAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkdmFycyhkb250X3VzZV9saXN0KSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZG9udF91c2UgdHJ1ZSAkY2VsbFxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZG9udF91c2VfbGlzdClcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZG9udF91c2VfbGlzdClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZG9udF91c2VfZmlsZSldICYmIFtmaWxlIGV4aXN0cyAkdmFycyhkb250X3VzZV9maWxlKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNvdXJjZSAkdmFycyhkb250X3VzZV9maWxlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGRvbnRfdXNlX2ZpbGUpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGRvbnRfdXNlX2ZpbGUpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVzZV9saXN0KV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9pbnRlcmFjdGl2ZV9jb25zdHJhaW50X21vZGVzIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdXG4iCiAgICAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkdmFycyh1c2VfbGlzdCkgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RvbnRfdXNlIGZhbHNlICRjZWxsXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyh1c2VfbGlzdClcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnModXNlX2xpc3QpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRjb21tYW5kICE9ICIifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZG9udF91c2UgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgbWF4aW11bSByb3V0aW5nIGxheWVycwogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhtYXhfcm91dGVfbGF5ZXIpXX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X21heF9yb3V0ZV9sYXllciAkdmFycyhtYXhfcm91dGVfbGF5ZXIpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfbWF4X3JvdXRlX2xheWVyICRjb21tYW5kXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKG1heF9yb3V0ZV9sYXllcilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMobWF4X3JvdXRlX2xheWVyKVxuIgogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU2V0IGRlc2lnbiBtb2RlCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgc2V0IHByb2Nlc3MgW3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kYiBkZXNpZ25fcHJvY2Vzc19ub2RlICRwcm9jZXNzXG4iCiAgICAgICAgICAgIGlmIHtbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZmxvd19lZmZvcnQpXSAhPSAic3RhbmRhcmQifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIGRlc2lnbl9mbG93X2VmZm9ydCBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZmxvd19lZmZvcnQpXVxuIgogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgSW5zZXJ0IHdlbGx0YXBzIGFuZCBwcmUvcG9zdCBlbmRjYXBzCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgaWYgeyhbRkY6OmdldF9ieV9zdWZmaXggdmFycyAid2VsbHRhcHMiXSAhPSAiIikgfHwKICAgICAgICAgICAgICAgICgoW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgInByZV9lbmRjYXAiXSAhPSAiIikgJiYKICAgICAgICAgICAgICAgICAoW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgInBvc3RfZW5kY2FwIl0gIT0gIiIpKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6Omluc2VydF93ZWxsdGFwc19lbmRjYXBzXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3dlbGx0YXBzX2VuZGNhcHMgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMod2VsbHRhcHMpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocHJlX2VuZGNhcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwb3N0X2VuZGNhcClcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMod2VsbHRhcHMpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHByZV9lbmRjYXApXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHBvc3RfZW5kY2FwKVxuIgogICAgICAgICAgICB9CiAgIAogICAgICAgICB9IGVsc2UgewogICAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFBhcnRpdGlvbiBpbml0IHN0ZXAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAKICAgICAgICAgICAgc2V0IHB0biBbZmlsZSB0YWlsIFtwd2RdXQogICAgICAgICAgICBzZXQgdmFycyhkZXNpZ24pICRwdG4KICAgICAgICAgICAgc2V0IHNraXBfY3BmIGZhbHNlCiAgICMgICAgICAgICBzZXQgdmFycyhpbG0pIDAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICRwdG5dID09IC0xfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgIFRPUCAoJHB0bikgSU1QTEVNRU5UQVRJT04gRkxPV1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJsb2FkQ29uZmlnICRwdG4uY29uZiAwXG4iCiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzYXZlX2lsbV9ub25fc2RjX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhpbG1fbm9uX3NkY19maWxlKSAkdmFycyhzYXZlX2lsbV9ub25fc2RjX2ZpbGUpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImdsb2JhbCByZGFfSW5wdXRcbiIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImxhcHBlbmQgcmRhX0lucHV0KHVpX2xlZmZpbGUpIC4uLyRwYXJ0LyRwYXJ0LmFudGVubmEubGVmXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNvbW1pdENvbmZpZ1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9jb25maWcgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9kYiAtY2VsbHZpZXcgXFtsaXN0ICR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwdG4gbGF5b3V0XF1cbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlYWRfZGIgJHtwdG59X3Byb3RvX2Vjby5lbmMuZGF0XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX2RiICR7cHRufV9wcm90b19mdWxsLmVuYy5kYXRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9kYiAuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJmZl9yZXBsYWNlX2ZsZXhtb2RlbF93aXRoX2Z1bGxfbmV0bGlzdFxuIgogICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX2RiIC5cbiIKICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICMgICAgICAgICAgICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgIyAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImlmIHtcW2ZpbGUgZXhpc3RzIC4uLyRwYXJ0LyRwYXJ0LmFudGVubmEubGVmXF19IHtcbiIKICAgIyAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImxvYWRMZWZGaWxlIC4uLyRwYXJ0LyRwYXJ0LmFudGVubmEubGVmXG4iCiAgICMgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiAgICMgICAgICAgICAgICAgICAgICB9CiAgICMgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic291cmNlICRwdG4uZ2xvYmFsc1xuIgogICAjICAgICAgICAgICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICMgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJsYXBwZW5kIGluaXRfbGVmX2ZpbGUgLi4vJHBhcnQvJHBhcnQuYW50ZW5uYS5sZWZcbiIKICAgIyAgICAgICAgICAgICAgICAgIH0KICAgIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJpbml0X2Rlc2lnblxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZWFkX2RiICRjb21tYW5kXQogICAgICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9kZXNpZ24gdHJ1ZQogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcykgJiYgKCgkdmFycyhzdGVwKSA9PSAiaW5pdCIpIHx8ICgoJHZhcnMoc3RlcCkgPT0gInBhcnRpdGlvbl9wbGFjZSIpICYmICEkdmFycyh1c2VfZmxleG1vZGVscykpIHx8ICgkdmFycyhzdGVwKSA9PSAibW9kZWxfZ2VuIikpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZW5hYmxlX21ldHJpY3MgLW9uXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAjIEZsZXhJTE0gZmxvdwogICAgICAgICAgICAgICAgICBpZiB7JHZhcnModG9wKX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgW2ZpbGUgbm9ybWFsaXplICR2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhzY3JpcHRfZGlyKS92aWV3X2RlZmluaXRpb24udGNsXQogICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGRpcnMgIiIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBibG9jayAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZGlycyAiXFxcbiAgIC1mbGV4X2lsbSB7JHtibG9ja30gLi4vJHtibG9ja30vJHtibG9ja30uZmxleGlsbX0iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNvbW1pdF9tb2R1bGVfbW9kZWwgJGRpcnNcXFxuIgogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLW1tbWNfZmlsZSAkdmFycyhtbW1jX2ZpbGUpXFxcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1jcGZfZmlsZSAkdmFycyhjcGZfZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHNraXBfY3BmIHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1tbW1jX2ZpbGUgJHZhcnMobW1tY19maWxlKVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjb21taXRfbW9kdWxlX21vZGVsICRjb21tYW5kXQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFBBUlRJVElPTiAoJHB0bikgSU1QTEVNRU5UQVRJT04gRkxPV1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCiAgICAgICAgICAgICAgIGlmIHskdmFycyh1c2VfZmxleG1vZGVscyl9ICB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9kYiAke3B0bn1fcHJvdG9fZWNvLmVuYy5kYXRcbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlYWRfZGIgJHtwdG59X3Byb3RvX2Z1bGwuZW5jLmRhdFxuIgogICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVzdG9yZV9kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IAogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiZmZfcmVwbGFjZV9mbGV4bW9kZWxfd2l0aF9mdWxsX25ldGxpc3RcbiIKIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxmZl9yZXBsYWNlX2ZsZXhtb2RlbF93aXRoX2Z1bGxfbmV0bGlzdCAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlYWRfZGIgLWNlbGxfdmlldyBcW2xpc3QgJHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHB0biBsYXlvdXRcXVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9kYiAuXG4iCiMgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic291cmNlICRwdG4uZ2xvYmFsc1xuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImluaXRfZGVzaWduXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlc3RvcmVfZGVzaWduICRjb21tYW5kXQogICAgICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9kZXNpZ24gdHJ1ZQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpICYmICgoJHZhcnMoc3RlcCkgPT0gImluaXQiKSB8fCAoKCR2YXJzKHN0ZXApID09ICJwYXJ0aXRpb25fcGxhY2UiKSAmJiAhJHZhcnModXNlX2ZsZXhtb2RlbHMpKSB8fCAoJHZhcnMoc3RlcCkgPT0gIm1vZGVsX2dlbiIpKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImVuYWJsZV9tZXRyaWNzIC1vblxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1c2hfc25hcHNob3Rfc3RhY2tcbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgYWx3YXlzX3NvdXJjZV90Y2xdCiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgTG9hZCBmbG9vcnBsYW4gZmlsZSBvciBERUY7IHVzZSBkZWZJbiB0byBsb2FkIGEgREVGIGZpbGUKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHJlc3RvcmVfZGVzaWduXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInJlYWRfZmxvb3JwbGFuICRwdG4uZnBcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzb3VyY2UgJHB0bi5tb2RlXG4iCiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHB0bi5zY2FuLmRlZl19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiBMT0FESU5HIFNDQU4gREVGIEZJTEUgJHB0bi5zY2FuLmRlZlwiXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicmVhZF9kZWYgJHB0bi5zY2FuLmRlZlxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIE92ZXJyaWRlIG1heGltdW0gcm91dGluZyBsYXllciBpZiBkZWZpbmVkIGZvciB0aGUgcGFydGl0aW9uCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwdG4sbWF4X3JvdXRlX2xheWVyKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfbWF4X3JvdXRlX2xheWVyICgkcHRuLG1heF9yb3V0ZV9sYXllcilcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhtYXhfcm91dGVfbGF5ZXIpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKG1heF9yb3V0ZV9sYXllcilcbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNwZWNpZnkgdGhlIElMTSBtb2RlbHMgZm9yIHRoZSB0b3AgcGFydGl0aW9uCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgaWYgeyR2YXJzKHRvcCl9IHsKICAgICAgICAgICAgICAgaWYgeyEkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxpbG1fZGlyKV0gJiYgKCR2YXJzKGNvZGVnZW4pIHx8IFtmaWxlIGlzZGlyZWN0b3J5ICR2YXJzKCRwYXJ0LGlsbV9kaXIpXSl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkcGFydCAtZGlyICR2YXJzKCRwYXJ0LGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkcGFydCAtb2FfY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIFxbZ2V0X2RiIGRlc2lnbnMgLm5hbWVcXSBpbG19XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkcGFydCAtZGlyZWN0b3J5ICR2YXJzKCRwYXJ0LGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJlYWRfaWxtIC1jZWxsICRwYXJ0IC1kaXJlY3RvcnkgLi4vJHBhcnQvJHBhcnQuaWxtXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkcGFydCAtb2FfY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIFxbZ2V0X2RiIGRlc2lnbnMgLm5hbWVcXSBpbG19XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkcGFydCAtZGlyZWN0b3J5IC4uLyRwYXJ0LyRwYXJ0LmlsbVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhpbG0pICYmIFtpbmZvIGV4aXN0cyB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXX0gewojICAgICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewojICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRUaW1pbmdDb24gLWlsbU5vblNkY0ZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKIyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldElsbU5vblNkY0NvbnN0cmFpbnRGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiMgICAgICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9pbG1fbm9uX3NkY19maWxlICRjb21tYW5kXQojICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAjICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICMgICAgICAgICAgICAgICAgICBzZXQgZGVmZXJfY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdIAogICAjICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIExvYWQgcG93ZXIgaW50ZW50IChpZiBpdCBpcyBkZWZpbmVkKQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHsoW2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSkgJiYgKCR2YXJzKGNwZl9maWxlKSAhPSAiIikgJiYgISRza2lwX2NwZn0gewogICAgICAgICAgICAgICBzZXQgc2F2ZSAkdmFycyhjcGZfZmlsZSkKICAgICAgICAgICAgICAgaWYgeyEkdmFycyh0b3ApfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGNwZl9maWxlKSAiJHB0bi5jcGYiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OmxvYWRfcG93ZXJfaW50ZW50XQogICAgICAgICAgICAgICAgc2V0IHZhcnMoY3BmX2ZpbGUpICRzYXZlIAogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWVlZTE4MDFfZmlsZSldfSB7CiAgICAgICAgICAgICAgIHNldCBzYXZlICR2YXJzKGllZWUxODAxX2ZpbGUpCiAgICAgICAgICAgICAgIGlmIHshJHZhcnModG9wKX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhpZWVlMTgwMV9maWxlKSAiJHB0bi5jcGYiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6bG9hZF9wb3dlcl9pbnRlbnRdCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX3Bvd2VyX2ludGVudCAkdmFycyhpZWVlMTgwMV9maWxlKSAtMTgwMVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjcGZfZmlsZSlcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoaWVlZTE4MDFfZmlsZSlcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIHBvc3QtaW5pdGlhbGl6YXRpb24gcGx1Zy1pbiBzY3JpcHQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X2luaXRfdGNsIDBdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQ2hlY2sgcHJlLXBsYWNlIHRpbWluZyAoYW5kIGdlbmVyYXRlIHRpbWluZyBncmFwaCBmb3IgcGxhY2VtZW50KQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHsoJHZhcnMoc3RlcCkgIT0gIm1vZGVsX2dlbiIpICYmICgkdmFycyhzdGVwKSAhPSAicGFydGl0aW9uX3BsYWNlIil9IHsKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV19IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVfZGVzaWduIC1wcmVfcGxhY2UgLXJlcG9ydF9wcmVmaXggcHJlcGxhY2UgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZV9kZXNpZ24gLXByZV9wbGFjZSAtcmVwb3J0X3ByZWZpeCBwcmVwbGFjZSAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKSAlc1xuIiAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV0KICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdGltZV9kZXNpZ24gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBDaGVjayBkYXRhIHNldHVwIChzYW5pdHkgY2hlY2spCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgc2V0IGNvbW1hbmQgImNoZWNrX2xlZ2FjeV9kZXNpZ24gLWFsbFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY2hlY2tfZGVzaWduICRjb21tYW5kXQoKICAgICAgaWYgeyEkdmFycyhpbG0pfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJjaGVja190aW1pbmdcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNoZWNrX3RpbWluZyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEdlbmVyYXRlIHJlcG9ydHMKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIFJlcG9ydCBwb3dlciBkb21haW4gZm9yIGxldmVsLXNoaWZ0ZXJzLCBpc29sYXRpb24gYW5kIHBnIG5ldHMKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBpZiB7W0ZGOjppc19scF9mbG93XSAmJiAoW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfZG9tYWlucyldICYmIChbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAxKSl9IHsKIyAgICAgICAgIHNldCBjb21tYW5kICJzZXQgZG9tYWlucyBcW0ZGX05PVlVTOjpnZXRfcG93ZXJfZG9tYWluc19jb2RlXF1cbiIKIyAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6Z2V0X3Bvd2VyX2RvbWFpbnNfY29kZV0KCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJmb3JlYWNoIGRvbWFpbiBcW2dldF9kYiBwb3dlcl9kb21haW5zIC5uYW1lXF0ge1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0IGRvbWFpbl9maWxlIFxbcmVnc3ViIC1hbGwge1xbXF1cWzw+fFxcLz8qOlxdfSBcJGRvbWFpbiBfXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHJlcG9ydF9wb3dlcl9kb21haW5zIC1wb3dlcl9kb21haW4gXCRkb21haW4gLW91dF9maWxlICR2YXJzKHJwdF9kaXIpL1wke2RvbWFpbl9maWxlfS5ycHQgLXNoaWZ0ZXIgLWlzb19pbnN0IC1wZ19uZXRzXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICByZXBvcnRfcG93ZXJfZG9tYWlucyAtcG93ZXJfZG9tYWluIFwkZG9tYWluIC1vdXRfZmlsZSAkdmFycyhycHRfZGlyKS9cJHtkb21haW5fZmlsZX1fYmluZGluZy5ycHQgLWJpbmRfbGliXG4iCgogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICMgUmVwb3J0IGxpYnJhcnkgYmluZGluZyBmb3IgcG93ZXIgZG9tYWlucwogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgZm9yZWFjaCBhbmFseXNpc192aWV3IFxbYWxsX2FuYWx5c2lzX3ZpZXdzXF0ge1xuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIHNldF9kZWZhdWx0X3ZpZXcgLXNldHVwIFwkYW5hbHlzaXNfdmlld1xuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIHJlcG9ydF9wb3dlcl9kb21haW5zIC1wb3dlcl9kb21haW4gXCRkb21haW4gLWZpbGUgJHZhcnMocnB0X2RpcikvXCR7ZG9tYWluX2ZpbGV9X1wkYW5hbHlzaXNfdmlldy5ycHQgLWJpbmRfbGliXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgfVxuIgoKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgIHNldF9kYiB0aW1pbmdfYW5hbHlzaXNfY2hlY2tfdHlwZSBob2xkXG4iCgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIGZvcmVhY2ggYW5hbHlzaXNfdmlldyBcW2FsbF9ob2xkX2FuYWx5c2lzX3ZpZXdzXF0ge1xuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIHNldF9kZWZhdWx0X3ZpZXcgLWhvbGQgXCRhbmFseXNpc192aWV3XG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgcmVwb3J0X3Bvd2VyX2RvbWFpbnMgLXBvd2VyX2RvbWFpbiBcJGRvbWFpbiAtZmlsZSAkdmFycyhycHRfZGlyKS9cJHtkb21haW5fZmlsZX1fXCRhbmFseXNpc192aWV3LnJwdCAtYmluZF9saWJcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICB9XG4iCgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHNldF9kYiB0aW1pbmdfYW5hbHlzaXNfY2hlY2tfdHlwZSBzZXR1cFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVwb3J0X3Bvd2VyX2RvbWFpbnMgJGNvbW1hbmRdCiAgICAgICAgIGlmIHskdmFycyhmbG93KSA9PSJtbW1jIn0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9kZWZhdWx0X3ZpZXcgLXNldHVwICR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldykgLWhvbGQgJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpXG4iCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyBjb21tZW50c119IHsKICAgICAgICAgaWYgeyRjb21tZW50cyA9PSAiIn0gewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY29tbWVudHMpXX0gewogICAgICAgICAgICAgICB1bnNldCB2YXJzKGNvbW1lbnRzKQogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKGNvbW1lbnRzKSAkY29tbWVudHMKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdWNvbW1lbnRzXX0gewogICAgICAgICBpZiB7JHVjb21tZW50cyA9PSAiIn0gewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModWNvbW1lbnRzKV19IHsKICAgICAgICAgICAgICAgdW5zZXQgdmFycyh1Y29tbWVudHMpCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnModWNvbW1lbnRzKSAkdWNvbW1lbnRzCiAgICAgICAgIH0KICAgICAgfQogICAgICBzZXQgZmNvbW1hbmRzIFtGRl9OT1ZVUzo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGZjb21tYW5kcyAkY29tbWFuZHMKCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGZjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CgogICB9CgogICBwcm9jIHJ1bl9wbGFjZSB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFyZW50KV0gJiYgKCR2YXJzKHBhcmVudCkgPT0gInJjIil9IHsKICAgICAgICAgc2V0IHZhcnMoc3RlcCkgcmNwCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIHskdmFycyhzdGVwKSAhPSAicGFydGl0aW9uX3BsYWNlIn0gewogICAgICAgICAgICBzZXQgdmFycyhzdGVwKSBwbGFjZQogICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV9zdGVwIHBsYWNlXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiBSVU5OSU5HIFBMQUNFTUVOVCAuLi5cIlxuIgoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBQTEFDRU1FTlRcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmICgkdmFycyhzdGVwKSAhPSAicGFydGl0aW9uX3BsYWNlIikgJiYgXAogICAgICAgICAgKChbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHZhcnMoZGVzaWduKV0gPT0gLTEpICYmICR2YXJzKGVuYWJsZV9mbGV4aWxtKSl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBvcHRfaGllcl9vcHRfc3RhZ2UgcHJlX2N0c1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2hpZXJfbW9kZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcHJlIHBsYWNlbWVudCBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcGxhY2VfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJ1biBzdGFuZGFyZCBjZWxsIHBsYWNlbWVudCBvciBsb2FkIHBsYWNlbWVudCBwbHVnLWluCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwbGFjZV90Y2wpXX0gewogICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhwbGFjZV90Y2wpXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCBbRkY6OnNvdXJjZV9wbHVnIHBsYWNlX3RjbF0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiUGx1Zy1pbiB2YXJzKHBsYWNlX3RjbCkgZGVmaW5lZCBidXQgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgICAgIGluY3IgdmFycyhlcnJvcl9jb3VudCkKIyAgICAgICAgICAgIHNldCB2YXJzKGFib3J0KSAxCiAgICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzZHBfZmlsZXMpXX0gewogICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoc2RwX2ZpbGVzKSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjcmVhZF9zZHBfZmlsZSAtZmlsZSAkZmlsZSAtaGllcl9wYXRoIDxpbnN0YW5jZT4gLW9yaWdpbiA8eCB5PiAtbGVmdF9vdmVyX2dyb3VwIDx0cnVlIHwgZmFsc2U+XG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiNwbGFuX2Rlc2lnbiAtdXNlcl9zZHBfZ3JvdXBcbiIKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFyZW50KV0gJiYgKCR2YXJzKHBhcmVudCkgPT0gInJjIil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBsYWNlX2Rlc2lnbiBcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyR2YXJzKHBsYWNlX29wdF9kZXNpZ24pfSB7CiMgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaGllcildfSB7CiMgICAgICAgICAgICAgICAgICBpZiB7KCR2YXJzKHRvcCkgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pKX0gewojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBsYWNlX2Rlc2lnbiAiCiMgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobm9fcHJlX3BsYWNlX29wdCldICYmICR2YXJzKG5vX3ByZV9wbGFjZV9vcHQpfSB7CiMgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1ub19wcmVfcGxhY2Vfb3B0IgojICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgojICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJwbGFjZV9vcHRfZGVzaWduIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4ICR2YXJzKHN0ZXApXG4iCiMgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicGxhY2Vfb3B0X2Rlc2lnbiAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKSAtcmVwb3J0X3ByZWZpeCAkdmFycyhzdGVwKVxuIgojICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBsYWNlX2Rlc2lnbiAiCiAgICAgICAgICAgICAgIGlmIHsoJHZhcnMoc3RlcCkgPT0gInBhcnRpdGlvbl9wbGFjZSIpICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKX0geyAgCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW5vX3ByZV9wbGFjZV9vcHQiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhub19wcmVfcGxhY2Vfb3B0KV0gJiYgJHZhcnMobm9fcHJlX3BsYWNlX29wdCl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbm9fcHJlX3BsYWNlX29wdCIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdCB2YXJzKHBhcmVudCldICYmICgkdmFycyhwYXJlbnQpICE9ICJyYyIpICYmICAkdmFycyhyYykgJiYgJHZhcnMoZW5hYmxlX3JjcCl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgImVjb19wbGFjZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZWNvX3BsYWNlICRjb21tYW5kXQogICAgICB9IGVsc2UgewojICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhpZXJfY2FzZSldICYmIFtyZWdleHAgIl4xIiAkdmFycyhoaWVyX2Nhc2UpXX0gewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHBsYWNlX2Rlc2lnbiAicGxhY2VfZGVzaWduIC1ub19wcmVfcGxhY2Vfb3B0XG4iXQojICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHBsYWNlX2Rlc2lnbiAkY29tbWFuZF0KIyAgICAgICAgIH0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcG9zdCBwbGFjZW1lbnQgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wbGFjZV90Y2wgMF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBBZGQgdGllIGNlbGxzIGZvciBsb2dpYyAwLzEgbmV0cwogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmFkZF90aWVfY2VsbHMgZmFsc2UgdHJ1ZV0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGFkZF90aWVfY2VsbHMgJGNvbW1hbmRdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQ2hlY2sgcG9zdC1wbGFjZSB0aW1pbmcKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7IVtyZWdleHAgInBsYWNlX29wdF9kZXNpZ24iICRjb21tYW5kc10gJiYgKCR2YXJzKHN0ZXApID09ICJwbGFjZSIpfSB7CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZV9kZXNpZ25fb3B0aW9ucyxzZXR1cCldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJ0aW1lX2Rlc2lnbiAtcHJlX2N0cyAtcmVwb3J0X3ByZWZpeCBwbGFjZSAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKVxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCBbZm9ybWF0ICJ0aW1lX2Rlc2lnbiAlcyAtcHJlX2N0cyAtcmVwb3J0X3ByZWZpeCBwbGFjZSAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKVxuIiAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV0KICAgICAgICAgfQogICAgICB9CiMgICAgICBpZiB7KCR2YXJzKHN0ZXApID09ICJwYXJ0aXRpb25fcGxhY2UiKSAmJiAkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKIyAgICAgICAgIGlmIHshW3JlZ2V4cCAicHJvdG8iICRjb21tYW5kXX0gewojICAgICAgICAgICAgcmVnc3ViICJ0aW1lX2Rlc2lnbiIgJGNvbW1hbmQgInRpbWVfZGVzaWduIC1wcm90byIgY29tbWFuZAojICAgICAgICAgfQojICAgICAgfQojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRpbWVfZGVzaWduICRjb21tYW5kXQoKICAgICAgaWYgeygkdmFycyh1c2VyX21vZGUpID09ICJoaWVyIikgJiYgJHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikgJiYgKCR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UiKX0gewogICAgICAgICBzZXQgcHRuIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmIChbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHB0bl0gIT0gLTEpfSB7CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIndyaXRlX2lsbSAtb3B0X3N0YWdlIHByZWN0cyAtdHlwZV9mbGV4X2lsbSBmbGV4SWxtIC10b19kaXIgXFtnZXRfZGIgZGVzaWducyAubmFtZVxdLmZsZXhpbG1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2ZsZXhfaWxtICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7ISR2YXJzKGJsYWNrX2JveCl9IHsKICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9pbG0gLW9wdF9zdGFnZSBwcmVjdHMgLXR5cGVfZmxleF9pbG0gaWxtIC1tb2RlbF90eXBlIHRpbWluZyAtdG9fZGlyIFxbZ2V0X2RiIGRlc2lnbnMgLm5hbWVcXS5pbG0gLWhvbGRcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIndyaXRlX2lsbSAtb3B0X3N0YWdlIHByZWN0cyAtdHlwZV9mbGV4X2lsbSBpbG0gLW1vZGVsX3R5cGUgdGltaW5nIC1vYV9jZWxsdmlldyB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgXFtnZXRfZGIgZGVzaWducyAubmFtZVxdIGlsbX1cbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksd3JpdGVfaWxtICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgIyBSZS1hc3NpZ24gcGlucyBiYXNlZCBvbiBuZXcgbmV0bGlzdCBjaGFuZ2VzCiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicm91dGVfdHJpYWxcbiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdHJpYWxfcm91dGUxICRjb21tYW5kXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZTEgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInRpbWVfZGVzaWduIC1wcmVfY3RzIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4IGFzc2VtYmxlX2ZsZXhpbG1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRpbWVfZGVzaWduICRjb21tYW5kXQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImFzc2lnbl9wYXJ0aXRpb25fcGluc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksYXNzaWduX3BhcnRpdGlvbl9waW5zICRjb21tYW5kXQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNoZWNrX3Bpbl9hc3NpZ25tZW50XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjaGVja19waW5fYXNzaWdubWVudCAkY29tbWFuZF0KCiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIHJvdXRlX3RyaWFsX2hvbm9yX3BpbiB0cnVlXG4iCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlMiAkY29tbWFuZF0KICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyb3V0ZV90cmlhbFxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0cmlhbF9yb3V0ZTIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIHJvdXRlX2Vhcmx5X2dsb2JhbF9ob25vcl9wYXJ0aXRpb25fcGluIC5cbiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUyICRjb21tYW5kXQogICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZTIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiY3JlYXRlX3RpbWluZ19idWRnZXRcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV90aW1pbmdfYnVkZ2V0ICRjb21tYW5kXQogICAgICAgICAgICAgIAogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBzZXQgZGlycyAiIgogICAgICAgICAgICAgICBmb3JlYWNoIGJsb2NrICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBkaXJzICJcXFxuICAgLWdvbGRlbl9ibG9ja19kaXIgLi4vJGJsb2NrLyR2YXJzKGRic19kaXIpL3BsYWNlLmVuYyAiCiAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ1cGRhdGVfcGFydGl0aW9uIFxcXG4gICAtZmxleF9pbG1fZWNvICRkaXJzIFxcXG4gICAtZmxleF9pbG1fZGlyIC4uLy4uLyR2YXJzKHBhcnRpdGlvbl9kaXIpX1BSRUNUUy8gXFxcbiAgIC1wb3N0X2Vjb19zdWZmaXggcG9zdF9lY28gLXBpbl9sb2NhdGlvblxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidXBkYXRlX3BhcnRpdGlvbiBcXFxuICAgLWZsZXhfaWxtX2VjbyAkZGlycyBcXFxuICAgLWZsZXhfaWxtX2RpciAuLi8uLi8kdmFycyhwYXJ0aXRpb25fZGlyKV9GTEVYSUxNLyBcXFxuICAgLXBvc3RfZWNvX3N1ZmZpeCBwb3N0X2VjbyAtcGluX2xvY2F0aW9uXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx1cGRhdGVfcGFydGl0aW9uICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX3ByZWN0cyB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCB3YXJuaW5ncwoKICAgICAgaWYgeyR2YXJzKHBsYWNlX29wdF9kZXNpZ24pfSB7CiMgICAgICAgICBpZiB7ISgoJHZhcnModXNlcl9tb2RlKSA9PSAiaGllciIpICYmIChbZmlsZSB0YWlsIFtwd2RdXSA9PSAkdmFycyh0b3BfY2VsbCkgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pKSl9IHsKICAgICAgICAgICAgcmV0dXJuICIiCiMgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiRmVhdHVyZSB2YXJzKHBsYWNlX29wdF9kZXNpZ24pIG5vdCBzdXBwb3J0IGZvciB0b3AgbGV2ZWwgaW1wbGVtZW50YXRpb24gd2hlbiB2YXJzKGVuYWJsZV9mbGV4aWxtKSBpcyB0cnVlIgojICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiMgICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJlbnQpXSAmJiAoJHZhcnMocGFyZW50KSA9PSAicmMiKX0gewogICAgICAgICBzZXQgdmFycyhzdGVwKSByY3AKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnMoc3RlcCkgcHJlY3RzCiAgICAgIH0KCiAgICAgIHNldCBjb21tYW5kcyAiIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycyhzdGVwKSAkdmFycyhzdGVwKVxuIgoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEluaXRpYWxpemUgc3RlcCAuLi4KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3N0ZXAgcHJlY3RzXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiBSVU5OSU5HIFBSRS1DVFMgT1BUSU1JWkFUSU9OIC4uLlwiXG4iCgogICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIFBSRS1DVFMgT1BUSU1JWkFUSU9OXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgQ1RTIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wcmVjdHNfdGNsXQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcmVudCldICYmICgkdmFycyhwYXJlbnQpID09ICJyYyIpfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJ1biBwcmUtQ1RTIG9wdGltaXphdGlvbgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0pICYmIChbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikiKX0gewogICAgICAgICBzZXQgcHRuIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgIGlmIHsoW2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICRwdG5dID09IC0xKSAmJiAkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgIyBUb3AgbGV2ZWwgZmxvdyBmb3IgZmxleElsbQogICAgICAgICAgICAjIFJlYWQgUG93ZXIgSW50ZW50IGhlcmUgLi4uCiAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgIGZvcmVhY2ggYmxvY2sgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9wYXJ0aXRpb25fcGluX3N0YXR1cyAtcGFydGl0aW9uICRibG9jayAtcGlucyAqIC1zdGF0dXMgdW5wbGFjZWRcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BhcnRpdGlvbl9waW5fc3RhdHVzICRjb21tYW5kXQogICAgICAgICAgIAogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgcm91dGVfdHJpYWxfaG9ub3JfcGluIGZhbHNlXG5zZXRfZGIgcm91dGVfdHJpYWxfaGFuZGxlX3BhcnRpdGlvbl9jb21wbGV4IHRydWVcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3RyaWFsX3JvdXRlX21vZGUxICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgcm91dGVfZWFybHlfZ2xvYmFsX2hvbm9yX3BhcnRpdGlvbl9waW4ge31cbnNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX2ZlbmNlIC5cbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUxICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIG9wdF9oaWVyX29wdF9zdGFnZSBwcmVDVFNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9oaWVyX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIAojICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgb3B0X2hhbmRsZV9wYXJ0aXRpb25fY29tcGxleCB0cnVlXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X29wdF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAKIyAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAib3B0X2Rlc2lnbiAtcHJlX2N0cyAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKSAtcmVwb3J0X3ByZWZpeCBmbGV4aWxtXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksb3B0X2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICAgICAgCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICMgTm9uIGZsZXhJbG0gdG9wIGZsb3cgYW5kIHBhcnRpdGlvbiBmbG93CiAgICAgICAgICAgc2V0IGNvbW1hbmQgIm9wdF9kZXNpZ24gLXByZV9jdHMgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcikgLXJlcG9ydF9wcmVmaXggcHJlY3RzXG4iCiAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLG9wdF9kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgIyBGbGF0IGZsb3cgCiAgICAgICAgc2V0IGNvbW1hbmQgIm9wdF9kZXNpZ24gLXByZV9jdHMgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcikgLXJlcG9ydF9wcmVmaXggcHJlY3RzXG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLG9wdF9kZXNpZ24gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHBvc3QgQ1RTIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcHJlY3RzX3RjbCAwXQoKICAgICAgaWYgeygkdmFycyh1c2VyX21vZGUpID09ICJoaWVyIil9IHsKICAgICAgICAgc2V0IHB0biBbZmlsZSB0YWlsIFtwd2RdXQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXSAmJiAoW2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICRwdG5dICE9IC0xKSAmJiAhJHZhcnMocGxhY2Vfb3B0X2Rlc2lnbil9IHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfaWxtIC1vcHRfc3RhZ2UgcHJlY3RzIC10eXBlX2ZsZXhfaWxtIGZsZXhJbG0gLXRvX2RpciBcW2dldF9kYiBkZXNpZ25zIC5uYW1lXF0uZmxleGlsbVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2ZsZXhfaWxtICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7ISR2YXJzKGJsYWNrX2JveCl9IHsKICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9pbG0gLW9wdF9zdGFnZSBwcmVjdHMgLXR5cGVfZmxleF9pbG0gaWxtIC10b19kaXIgXFtnZXRfZGIgZGVzaWducyAubmFtZVxdLmlsbVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfaWxtIC1vcHRfc3RhZ2UgcHJlY3RzIC10eXBlX2ZsZXhfaWxtIGlsbSAtb2FfY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIFxbZ2V0X2RiIGRlc2lnbnMgLm5hbWVcXSBpbG19XG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2lsbSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeyA7ICMgVG9wIGxldmVsIHVuY29uZGl0aW9uYWwgKG5vIHBsYWNlX29wdF9kZXNpZ24gc3VwcG9ydCkgLi4uCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIndyaXRlX2RiICR2YXJzKGRic19kaXIpL3ByZWN0c19mbGV4aWxtLmVuY1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2F2ZV9kZXNpZ24gJGNvbW1hbmRdCgogICAgICAgICAgICAgICAjIFJlLWFzc2lnbiBwaW5zIGJhc2VkIG9uIG5ldyBuZXRsaXN0IGNoYW5nZXMKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyb3V0ZV90cmlhbFxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0cmlhbF9yb3V0ZTEgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicm91dGVfZWFybHlfZ2xvYmFsXG4iCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X3JvdXRlMSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInRpbWVfZGVzaWduIC1wcmVfY3RzIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4IHByZWN0c19mbGV4aWxtXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0aW1lX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJhc3NpZ25fcGFydGl0aW9uX3BpbnNcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGFzc2lnbl9wYXJ0aXRpb25fcGlucyAkY29tbWFuZF0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjaGVja19waW5fYXNzaWdubWVudFxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY2hlY2tfcGluX2Fzc2lnbm1lbnQgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgcm91dGVfdHJpYWxfaG9ub3JfcGluIHRydWVcbiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3RyaWFsX3JvdXRlX21vZGUyICRjb21tYW5kXQogICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJvdXRlX3RyaWFsXG4iCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlMiAkY29tbWFuZF0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIHJvdXRlX2Vhcmx5X2dsb2JhbF9ob25vcl9wYXJ0aXRpb25fcGluIC5cbiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUyICRjb21tYW5kXQogICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZTIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIAojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgYnVkZ2V0X2VuYWJsZV9tdF9idWRnZXRpbmcgdHJ1ZVxuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9idWRnZXRpbmdfbW9kZSAkY29tbWFuZF0KCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjcmVhdGVfdGltaW5nX2J1ZGdldFxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX3RpbWluZ19idWRnZXQgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBzZXQgZGlycyAiIgogICAgICAgICAgICAgICBmb3JlYWNoIGJsb2NrICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhwbGFjZV9vcHRfZGVzaWduKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZGlycyAiXFxcbiAgIC1nb2xkZW5fYmxvY2tfZGlyIC4uLyRibG9jay8kdmFycyhkYnNfZGlyKS9wbGFjZS5lbmMgIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZGlycyAiXFxcbiAgIC1nb2xkZW5fYmxvY2tfZGlyIC4uLyRibG9jay8kdmFycyhkYnNfZGlyKS9wcmVjdHMuZW5jICIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidXBkYXRlX3BhcnRpdGlvbiBcXFxuICAgLWZsZXhfaWxtX2VjbyAkZGlycyBcXFxuICAgLWZsZXhfaWxtX2RpciAuLi8uLi8kdmFycyhwYXJ0aXRpb25fZGlyKV9QUkVDVFMvIFxcXG4gICAtcG9zdF9lY29fc3VmZml4IHBvc3RfZWNvIC1waW5fbG9jYXRpb25cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInVwZGF0ZV9wYXJ0aXRpb24gXFxcbiAgIC1mbGV4X2lsbV9lY28gJGRpcnMgXFxcbiAgIC1mbGV4X2lsbV9kaXIgLi4vLi4vJHZhcnMocGFydGl0aW9uX2RpcilfRkxFWElMTS8gXFxcbiAgIC1wb3N0X2Vjb19zdWZmaXggcG9zdF9lY28gLXBpbl9sb2NhdGlvblxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX3BhcnRpdGlvbiAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fY3RzIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7JHZhcnMoc2tpcF9jdHMpfSB7CiAgICAgICAgIHJldHVybiAiIgogICAgICB9CgogICAgICBzZXQgdmFycyhzdGVwKSBjdHMKICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIHNldCB1Y29tbWVudHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbml0aWFsaXplIHN0ZXAgLi4uCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV9zdGVwIGN0c10KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyxpbml0aWFsaXplX3N0ZXAgJGNvbW1hbmRdCgogICAgICBzZXQgdmFycyhvbmx5X29wdGlvbnMpIHRydWUKCiAgICAgIGlmIHtbcmVnZXhwICJeY2NvcHQiICR2YXJzKGN0c19lbmdpbmUpXX0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfc3RlcCBwb3N0Y3RzXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0cyxpbml0aWFsaXplX3N0ZXAgJGNvbW1hbmRdCiAgICAgICAgIGlmIHskdmFycyhwb3N0Y3RzX3NldHVwX2hvbGQpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV9zdGVwIHBvc3RjdHNfaG9sZF0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHNfaG9sZCxpbml0aWFsaXplX3N0ZXAgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0IHZhcnMob25seV9vcHRpb25zKSBmYWxzZQoKICAgICAgaWYgeyR2YXJzKHRvcCkgJiYgKCR2YXJzKHVzZXJfbW9kZSkgPT0gImhpZXIiKSAmJiAoJHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIycGFzcyIpICYmICR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAjIFJlYWQgUG93ZXIgSW50ZW50IGhlcmUgLi4uCiAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQsaWxtX2RpcildICYmICgkdmFycyhjb2RlZ2VuKSB8fCBbZmlsZSBpc2RpcmVjdG9yeSAkdmFycygkcGFydCxpbG1fZGlyKV0pfSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9pbG0gLWNlbGwgJHBhcnQgLWRpciAkdmFycygkcGFydCxpbG1fZGlyKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9pbG0gLWNlbGwgJHBhcnQgLW9hX2NlbGx2aWV3IHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSBcW2dldF9kYiBkZXNpZ25zIC5uYW1lXF0gaWxtfVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9pbG0gLWNlbGwgJHBhcnQgLWRpcmVjdG9yeSAkdmFycygkcGFydCxpbG1fZGlyKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInJlYWRfaWxtIC1jZWxsICRwYXJ0XG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2lsbSAtY2VsbCAkcGFydCAtZGlyZWN0b3J5IC4uLyRwYXJ0LyRwYXJ0LmlsbVxuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyRjb21tYW5kICE9ICIifSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gIiRjb21tYW5kXG5zZXRfZGIgaWxtX2tlZXBfZmxhdHRlbiB0cnVlXG4iXQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgICAgICAgIH0KCiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KIyAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSB8fCAoW2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAhJHZhcnMoY3BmX3RpbWluZykpIH0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiMgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgc2V0IGRlZmVyX2NvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluaXRpYWxpemVfdGltaW5nICRjb21tYW5kXSAKIyAgICAgICAgIH0KICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OmxvYWRfcG93ZXJfaW50ZW50XQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+IFJVTk5JTkcgQ0xPQ0sgVFJFRSBTWU5USEVTSVMgLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgQ0xPQ0sgVFJFRSBTWU5USEVTSVNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIHByZS1DVFMgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7JHZhcnMoY3RzX2VuZ2luZSkgPT0gImN0cyJ9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX2N0c190Y2xdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gQ1RTCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBHZW5lcmF0ZSB0aGUgY2xvY2sgdHJlZSB1c2luZyBjbG9ja0Rlc2lnbiB3aGljaDoKICAgICAgIyAtIGxvYWRzIHRoZSBjbG9jayBzcGVjaWZpY2F0aW9uIGZpbGUKICAgICAgIyAtIHJlbW92ZXMgZXhpc3RpbmcgYnVmZmVycyBpbiB0aGUgY2xvY2sgdHJlZSAobm90IG1hcmtlZCBkb24ndCB0b3VjaCk7CiAgICAgICMgICBpZiBhIGNsb2NrIHRyZWUgaGFzIGJlZW4gcHJldmlvdXNseSBpbnNlcnRlZCwgdXNlIGNoYW5nZUNsb2NrU3RhdHVzCiAgICAgICMgICB0byB1bmZpeCB0aGUgdHJlZSBzbyB0aGF0IGl0IGNhbiBiZSByZW1vdmVkCiAgICAgICMgLSB1bmZpeGVzIHRoZSBjbG9jayBuZXRzIGFmdGVyIHRyZWUgaW5zZXJ0aW9uCiAgICAgICMgTmVlZCB0byBtYWtlIHN1cmUgdGhlIGNsb2NrIGdhdGluZyBjZWxscyBhcmUgdXNhYmxlIGR1cmluZyBjbG9ja0Rlc2lnbi4KICAgICAgIyBEaXNhYmxlIHRoZW0gYWZ0ZXJ3YXJkcy4KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNsb2NrX2dhdGVfY2VsbHMgW2xpc3RdCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19nYXRlX2NlbGxzKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9pbnRlcmFjdGl2ZV9jb25zdHJhaW50X21vZGVzIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdXG4iCiAgICAgICAgIHNldCBjbG9ja19nYXRlX2NlbGxzICR2YXJzKGNsb2NrX2dhdGVfY2VsbHMpCiAgICAgICAgIGZvcmVhY2ggY2VsbCAkY2xvY2tfZ2F0ZV9jZWxscyB7CiAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RvbnRfdXNlIGZhbHNlICRjZWxsXG4iCiAgICAgICAgIH0KICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLGVuYWJsZV9jbG9ja19nYXRlX2NlbGxzICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJ1biBDVFMKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJ1biBjY29wdERlc2lnbiAuLi4gY29udmVydCB0byBwcm9wYWdhdGVkIHRpbWluZyBmaXJzdCBpbiBzY3JpcHRlZCBpbnRlZ3JhdGlvbgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfdGNsKV19IHsKICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhjdHNfdGNsKV19IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX2N0c190Y2xdCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGN0c190Y2xdCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiUGx1Zy1pbiB2YXJzKGN0c190Y2wpIGRlZmluZWQgYnV0IHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICBpbmNyIHZhcnMoZXJyb3JfY291bnQpCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGlzX25hdGl2ZSBbZXhwciB7JHZhcnMoY2NvcHRfaW50ZWdyYXRpb24pID09ICJuYXRpdmUifV0KICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjp1cGRhdGVfdGltaW5nIG1tbWMgW2V4cHIgISRpc19uYXRpdmVdXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLHVwZGF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6ZGVyYXRlX3RpbWluZyBtbW1jXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZGVyYXRlX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX2N0c190Y2xdCiAgICAgICAgIGlmIHtbcmVnZXhwICJeY2NvcHQiICR2YXJzKGN0c19lbmdpbmUpXX0gewogICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wb3N0Y3RzX3RjbCAwXQogICAgICAgICAgIGlmIHskdmFycyhwb3N0Y3RzX3NldHVwX2hvbGQpfSB7CiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3Bvc3RjdHNfaG9sZF90Y2xdCiAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAjIENyZWF0ZSBhIENDT3B0IGNsb2NrIHRyZWUgc3BlYyBpZiBydW5uaW5nIHdpdGggbmF0aXZlIGludGVncmF0aW9uCiAgICAgICAgIGlmIHskdmFycyhjY29wdF9lZmZvcnQpICE9ICJsb3cifSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Njb3B0X21vZGUgInNldF9jY29wdF9tb2RlIC1lZmZvcnQgJHZhcnMoY2NvcHRfZWZmb3J0KVxuIl0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9jY29wdF9lZmZvcnQgInNldF9jY29wdF9lZmZvcnQgLWVmZm9ydCAkdmFycyhjY29wdF9lZmZvcnQpXG4iXQogICAgICAgICB9CiAgICAgICAgIHNldCBjY29wdF9jb21tYW5kICJjY29wdF9kZXNpZ24iCgogICAgICAgICBpZiB7JHZhcnMocG9zdGN0c19zZXR1cF9ob2xkKX0gewogICAgICAgICAgICBhcHBlbmQgY2NvcHRfY29tbWFuZCAiIC1ob2xkIgogICAgICAgICB9CgogICAgICAgICBzZXQgY29tbWFuZCAiY3JlYXRlX2Nsb2NrX3RyZWVfc3BlY1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLGNyZWF0ZV9jbG9ja190cmVlX3NwZWMgJGNvbW1hbmRdCgogICAgICAgICBhcHBlbmQgY2NvcHRfY29tbWFuZCAiXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsY2NvcHRfZGVzaWduICRjY29wdF9jb21tYW5kXQoKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcG9zdCBDVFMgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9jdHNfdGNsIDBdCiAgICAgIGlmIHtbcmVnZXhwICJeY2NvcHQiICR2YXJzKGN0c19lbmdpbmUpXX0gewogICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcG9zdGN0c190Y2wgMF0KICAgICAgICBpZiB7JHZhcnMocG9zdGN0c19zZXR1cF9ob2xkKX0gewogICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcG9zdGN0c19ob2xkX3RjbF0KICAgICAgICB9CiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSZXNldCBjbG9jayBnYXRpbmcgY2VsbCB1c2FnZQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBDaGVjayBwb3N0LWN0cyB0aW1pbmcKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsc2V0dXApXX0gewogICAgICAgICBzZXQgY29tbWFuZCAidGltZV9kZXNpZ24gLXBvc3RjdHMgLXJlcG9ydF9wcmVmaXggY3RzIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtmb3JtYXQgInRpbWVfZGVzaWduIC1wb3N0Y3RzIC1yZXBvcnRfcHJlZml4IGN0cyAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKSAlc1xuIiAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV0KICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLHRpbWVfZGVzaWduICRjb21tYW5kXQoKICAgICAgaWYgeygkdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIikgJiYgISR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICBzZXQgcHRuIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmIChbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHB0bl0gIT0gLTEpfSB7CiAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAiZmUiXT09MH0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfaWxtIC1vcHRfc3RhZ2UgcG9zdGN0cyAtdHlwZV9mbGV4X2lsbSBpbG0gLXRvX2RpciBcW2dldF9kYiBkZXNpZ25zIC5uYW1lXF0uaWxtXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9pbG0gLW9wdF9zdGFnZSBwb3N0Y3RzIC10eXBlX2ZsZXhfaWxtIGlsbSAtb2FfY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIFxbZ2V0X2RiIGRlc2lnbnMgLm5hbWVcXSBpbG19XG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2lsbSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX3Bvc3RjdHMge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICBpZiB7JHZhcnMoc2tpcF9jdHMpfSB7IHJldHVybiAiIiB9CgojICAgICBpZiB7W3JlZ2V4cCAiXmNjb3B0IiBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoY3RzX2VuZ2luZSldXX0gewojICAgICAgICByZXR1cm4gIiIKIyAgICAgfQogICAgIGlmIHtbc3RyaW5nIHRvbG93ZXIgJHZhcnMoY3RzX2VuZ2luZSldID09ICJjY29wdCJ9IHsgCiAgICAgICAgcmV0dXJuICIiCiAgICAgfQoKICAgICAgc2V0IHZhcnMoc3RlcCkgcG9zdGN0cwogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKIAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfc3RlcCBwb3N0Y3RzXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0cyxpbml0aWFsaXplX3N0ZXAgJGNvbW1hbmRdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgU3BlY2lmeSB0aGUgSUxNIG1vZGVscyBmb3IgdGhlIHRvcCBwYXJ0aXRpb24gKG9ubHkgZm9yIDJwYXNzIGZsb3cpCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeyR2YXJzKHRvcCkgJiYgKCR2YXJzKHVzZXJfbW9kZSkgPT0gImhpZXIiKSAmJiAoJHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIycGFzcyIpICYmICEkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKIyAgICAgICAgIGlmIHshJCh2YXJzKGJsYWNrX2JveCl9IHsgCiAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQsaWxtX2RpcildICYmICgkdmFycyhjb2RlZ2VuKSB8fCBbZmlsZSBpc2RpcmVjdG9yeSAkdmFycygkcGFydCxpbG1fZGlyKV0pfSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydCAtZGlyICR2YXJzKCRwYXJ0LGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRwYXJ0XG4iCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRwYXJ0IC1kaXIgJHZhcnMoJHBhcnQsaWxtX2RpcilcbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydCAtZGlyIC4uLyRwYXJ0LyRwYXJ0LmlsbVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydFxuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydCAtZGlyIC4uLyRwYXJ0LyRwYXJ0LmlsbVxuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OnVwZGF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHMsdXBkYXRlX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjpkZXJhdGVfdGltaW5nIG1tbWNdCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OnVwZGF0ZV90aW1pbmcgbWlubWF4XQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0cyx1cGRhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmRlcmF0ZV90aW1pbmcgbWlubWF4XQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZGVyYXRlX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoaWxtKSAmJiBbaW5mbyBleGlzdHMgdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJsb2FkVGltaW5nQ29uIC1pbG1Ob25TZGNGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRJbG1Ob25TZGNDb25zdHJhaW50RmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojICAgICAgICAgfQoKIyAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KIyAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluaXRpYWxpemVfdGltaW5nICRjb21tYW5kXQojICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgIHNldCBkZWZlcl9jb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0gCiMgICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcIjxGRj4gUlVOTklORyBQT1NULUNUUyBPUFRJTUlaQVRJT04gLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUE9TVC1DVFMgT1BUSU1JWkFUSU9OXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgcG9zdENUUyBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcG9zdGN0c190Y2xdCgogICAgICBpZiB7JHZhcnMoY3RzX2VuZ2luZSkgPT0gImNjb3B0IiAmJiAkdmFycyhjY29wdF9pbnRlZ3JhdGlvbikgPT0gIm5hdGl2ZSJ9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInB1dHMgXCI8RkY+IE5PIFBPU1QtQ1RTIE9QVElNSVpBVElPTiBSRVFVSVJFRCBGT1IgQ0NPUFQgTkFUSVZFIElOVEVHUkFUSU9OXCJcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHMsb3B0X2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfSBlbHNlIHsKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAjIFJ1biBwb3N0LUNUUyBvcHRpbWl6YXRpb24KICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAKICAgICAgICAgc2V0IGNvbW1hbmQgIm9wdF9kZXNpZ24gLXBvc3RfY3RzIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4IHBvc3RjdHNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHMsb3B0X2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfQogICAgICAgICAKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcG9zdCBwb3N0Q1RTIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcG9zdGN0c190Y2wgMF0KICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9wb3N0Y3RzX2hvbGQge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgaWYgeyR2YXJzKHNraXBfY3RzKSB8fCAoW2xzZWFyY2ggJHZhcnMoZml4X2hvbGQpIHBvc3RjdHNdIDwgMCkgfHwgJHZhcnMocG9zdGN0c19zZXR1cF9ob2xkKX0gewogICAgICAgICByZXR1cm4gIiIKICAgICAgfQoKICAgICAgc2V0IHZhcnMoc3RlcCkgcG9zdGN0c19ob2xkCiAgICAgIHNldCBjb21tYW5kcyAiIiAKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbml0aWFsaXplIHN0ZXAgLi4uCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV9zdGVwIHBvc3RjdHNfaG9sZF0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHNfaG9sZCxpbml0aWFsaXplX3N0ZXAgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+IFJVTk5JTkcgUE9TVC1DVFMgSE9MRCBGSVhJTkcgLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUE9TVC1DVFMgSE9MRCBGSVhJTkdcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIHByZS1wb3N0Q1RTIGhvbGQgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3Bvc3RjdHNfaG9sZF90Y2xdCgogICAgICBzZXQgY29tbWFuZCAib3B0X2Rlc2lnbiAtcG9zdF9jdHMgLWhvbGQgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcikgLXJlcG9ydF9wcmVmaXggcG9zdGN0c19ob2xkXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0Y3RzX2hvbGQsb3B0X2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIHBvc3QtcG9zdENUUyBob2xkIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcG9zdGN0c19ob2xkX3RjbCAwXQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9yb3V0ZSB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBzZXQgdmFycyhzdGVwKSByb3V0ZQogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbml0aWFsaXplIHN0ZXAgLi4uCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV9zdGVwIHJvdXRlXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQogICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmFkZF9maWxsZXJfY2VsbHNdCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByb3V0ZSxhZGRfZmlsbGVyX2NlbGxzICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiBSVU5OSU5HIEdMT0JBTC9ERVRBSUwgUk9VVElORyAuLi5cIlxuIgoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBHTE9CQUwvREVUQUlMIFJPVVRJTkdcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHByZSByb3V0ZSBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcm91dGVfdGNsXQoKICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjpyb3V0ZV9zZWNvbmRhcnlfcGdfbmV0c10KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHJvdXRlLHJvdXRlX3NlY29uZGFyeV9wZ19uZXRzICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgImNoZWNrX3BsYWNlICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLGNoZWNrX3BsYWNlLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsY2hlY2tfcGxhY2UgJGNvbW1hbmRdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUm91dGUgdGhlIGRlc2lnbgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBzZXQgYXJncyAiIgogICAgICBpZiB7KCR2YXJzKGVuYWJsZV9vY3YpID09ICJwcmVfcG9zdHJvdXRlIikgfHwgKCR2YXJzKGVuYWJsZV9vY3YpID09ICJwcmVfcG9zdGN0cyIpfSB7CiMgICAgICAgICBpZiB7JHZhcnMoZmxvdykgIT0gImRlZmF1bHQifSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdilcbiIKICAgICAgICAgICAgYXBwZW5kIGFyZ3MgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfdHlwZSBvY3ZcbiIKIyAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9hb2N2KX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KVxuIgogICAgICAgICAgICBhcHBlbmQgYXJncyAic2V0X2RiIHRpbWluZ19hbmFseXNpc19hb2N2IHRydWVcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJwcmVfcG9zdHJvdXRlXCJcbiIKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpIFwidHJ1ZVwiXG4iCiAgICAgIH0KICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgIHNldCBjb21tYW5kICIkYXJnc1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3N0cm91dGVfc3ByZWFkX3dpcmVzKV0gJiYgISR2YXJzKHBvc3Ryb3V0ZV9zcHJlYWRfd2lyZXMpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2RiIHJvdXRlX2Rlc2lnbl9kZXRhaWxfcG9zdF9yb3V0ZV9zcHJlYWRfd2lyZSBmYWxzZVxuIgogICAgICB9CgogICAgICBzZXQgY29tbWFuZCAicm91dGVfZGVzaWduIgogICAgICBpZiB7JHZhcnModHJhY2tfb3B0KX0gewogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRyYWNrX29wdClcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtdHJhY2tfb3B0IgogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyh0cmFja19vcHQpXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHJvdXRlLHJvdXRlX2Rlc2lnbiAiJGNvbW1hbmRcbiJdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUnVuIGNrRUNPIGlmIHJlcXVlc3RlZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xvY2tfZWNvKV0gJiYgKCgkdmFycyhjbG9ja19lY28pID09ICJwb3N0X3JvdXRlIikgfHwgKCR2YXJzKGNsb2NrX2VjbykgPT0gImJvdGgiKSl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjpydW5fY2xvY2tfZWNvIHBvc3Rfcm91dGVdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByb3V0ZSxydW5fY2xvY2tfZWNvICRjb21tYW5kXQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgT3B0aW9uYWxseSBydW4gd2lyZSBzcHJlYWRpbmcKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYge1tyZWdzdWIgIm5tIiAkdmFycyhwcm9jZXNzKSAiIl0gPj0gMTZ9IHsKICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocG9zdHJvdXRlX3NwcmVhZF93aXJlcyldICYmICR2YXJzKHBvc3Ryb3V0ZV9zcHJlYWRfd2lyZXMpfSB7CiAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHJvdXRlX2Rlc2lnbl9kZXRhaWxfcG9zdF9yb3V0ZV9zcHJlYWRfd2lyZSB0cnVlXG5zZXRfZGIgcm91dGVfd2l0aF90aW1pbmdfZHJpdmVuIGZhbHNlXG4iCiAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicm91dGVEZXNpZ24gLXdpcmVPcHRcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgcm91dGVfZGVzaWduX2RldGFpbF9wb3N0X3JvdXRlX3NwcmVhZF93aXJlIGZhbHNlXG4iCiAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsc3ByZWFkX3dpcmVzICRjb21tYW5kXQogICAgICAgIH0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIE9wdGlvbmFsbHkgcnVuIExQQQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnModmVyaWZ5X2xpdGhvKX0gewogICAgICAgICBmaWxlIG1rZGlyICR2YXJzKHJwdF9kaXIpL0xQQS9ETUMKICAgICAgICAgc2V0IGNvbW1hbmQgImNoZWNrX2xpdGhvIC1yb3V0aW5nX2xheWVyc19vbmx5IC10ZWNoRmlsZSAkdmFycyhscGFfdGVjaF9maWxlKSAtZGlyICR2YXJzKHJwdF9kaXIpL0xQQVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAidmlvbGF0aW9uQnJvd3NlciAtYWxsIC1ub19kaXNwbGF5X2ZhbHNlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJsb2FkVmlvbGF0aW9uUmVwb3J0IC10eXBlIENETkxpdGhvIC1maWxlbmFtZSAkdmFycyhycHRfZGlyKS9MUEEvRE1DL21lcmdlZC5oaWZcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHJvdXRlLHZlcmlmeV9saXRobyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFNldCBleHRyYWN0aW9uIG1vZGUgdG8gcG9zdHJvdXRlCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2VuZ2luZSBwb3N0X3JvdXRlXG4iCiAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCl9XX0gewogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2VmZm9ydF9sZXZlbCAkYXJnXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgfQogICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGV4dHJhY3RfcmNfdG90YWxfY2FwX3RocmVzaG9sZCAkYXJnXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICB9CiAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZGIgZXh0cmFjdF9yY19yZWxhdGl2ZV9jYXBfdGhyZXNob2xkICRhcmdcbiIKICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgIH0KICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2NvdXBsaW5nX2NhcF90aHJlc2hvbGQgJGFyZ1xuIgogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgfQogICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBleHRyYWN0X3JjX2xlZl90ZWNoX2ZpbGVfbWFwICRhcmciCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHFyY19sYXllcl9tYXApXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsc2V0X2V4dHJhY3RfcmNfbW9kZSAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHBvc3Qgcm91dGUgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9yb3V0ZV90Y2wgMF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBVcGRhdGUgdG8gTU1NQyBpZiBmbG93IGlzICJwcl9tbW1jIgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnMoZmxvdykgIT0gImRlZmF1bHQifSB7CiAgICAgICAgIGlmIHskdmFycyhmbG93KSA9PSAicHJfbW1tYyJ9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV19IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVfZGVzaWduIC1wb3N0X3JvdXRlIC1yZXBvcnRfcHJlZml4IHJvdXRlIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtmb3JtYXQgInRpbWVfZGVzaWduIC1wb3N0X3JvdXRlIC1yZXBvcnRfcHJlZml4IHJvdXRlIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpICVzXG4iICR2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsc2V0dXApXQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByb3V0ZSx0aW1lX2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fcG9zdHJvdXRlIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIHNldCB2YXJzKHN0ZXApIHBvc3Ryb3V0ZQogICAgICBzZXQgY29tbWFuZHMgICIiCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfc3RlcCBwb3N0cm91dGVdCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6Omluc2VydF9jb21tZW50c10gCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQoKICAgICAgaWYgeyR2YXJzKG1ldGFsZmlsbCkgPT0gInByZV9wb3N0cm91dGUifSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRjo6c291cmNlX3BsdWcgbWV0YWxmaWxsX3RjbF0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSxhZGRfbWV0YWxmaWxsICRjb21tYW5kXQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUnVuIGNrRUNPIGlmIHJlcXVlc3RlZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xvY2tfZWNvKV0gJiYgKCgkdmFycyhjbG9ja19lY28pID09ICJwb3N0X3JvdXRlIikgfHwgKCR2YXJzKGNsb2NrX2VjbykgPT0gImJvdGgiKSl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjpydW5fY2xvY2tfZWNvIHBvc3Rfcm91dGVdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcIjxGRj4gUlVOTklORyBQT1NULVJPVVRFIENMT0NLIEVDTyAuLi5cIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUscnVuX2Nsb2NrX2VjbyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiBSVU5OSU5HIFBPU1QtUk9VVEUgT1BUSU1JWkFUSU9OIC4uLlwiXG4iCgogICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIFBPU1QtUk9VVEUgT1BUSU1JWkFUSU9OXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgcG9zdHJvdXRlIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wb3N0cm91dGVfdGNsXQogICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KSAmJiBbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIm9wdF9sZWFrYWdlX3Bvd2VyIC1maXhfdGltaW5nX29ubHlcbiIKICAgICAgfQogICAgICBpZiB7JHZhcnMocG9zdHJvdXRlX3NldHVwX2hvbGQpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wb3N0cm91dGVfaG9sZF90Y2xdCiAgICAgICAgIHNldCBjb21tYW5kICJvcHRfZGVzaWduIC1wb3N0X3JvdXRlIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4IHBvc3Ryb3V0ZSAtc2V0dXAgLWhvbGRcbiIKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgIm9wdF9kZXNpZ24gLXBvc3Rfcm91dGUgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcikgLXJlcG9ydF9wcmVmaXggcG9zdHJvdXRlXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSxvcHRfZGVzaWduICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFRyaW0gbWV0YWwgZmlsbCBpZiBhZGRlZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnMobWV0YWxmaWxsKSA9PSAicHJlX3Bvc3Ryb3V0ZSJ9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInRyaW1fbWV0YWxfZmlsbFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLHRyaW1fbWV0YWxfZmlsbCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIE9wdGlvbmFsbHkgcnVuIExQQQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnModmVyaWZ5X2xpdGhvKX0gewogICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgdG8gaGFuZGxlIGRlcmVyZW5jaW5nIHZhcmlhYmxlcwogICAgICAgICBmaWxlIG1rZGlyIFtzdWJzdCAkdmFycyhycHRfZGlyKV0vTFBBL0RNQwogICAgICAgICBzZXQgY29tbWFuZCAidmVyaWZ5TGl0aG8gLXJvdXRpbmdMYXllcnNPbmx5IC10ZWNoRmlsZSAkdmFycyhscGFfdGVjaF9maWxlKSAtZGlyICR2YXJzKHJwdF9kaXIpL0xQQVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAidmlvbGF0aW9uQnJvd3NlciAtYWxsIC1ub19kaXNwbGF5X2ZhbHNlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJsb2FkVmlvbGF0aW9uUmVwb3J0IC10eXBlIENETkxpdGhvIC1maWxlbmFtZSAkdmFycyhycHRfZGlyKS9MUEEvRE1DL21lcmdlZC5oaWZcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSx2ZXJpZnlfbGl0aG8gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHBvc3QgcG9zdFJvdXRlIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcG9zdHJvdXRlX3RjbCAwXQogICAgICBpZiB7JHZhcnMocG9zdHJvdXRlX3NldHVwX2hvbGQpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcG9zdHJvdXRlX2hvbGRfdGNsXQogICAgICB9CiAKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9wb3N0cm91dGVfaG9sZCB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7W2xzZWFyY2ggJHZhcnMoZml4X2hvbGQpIHBvc3Ryb3V0ZV0gPCAwfSB7CiAgICAgICAgIHJldHVybiAiIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgdmFycyhzdGVwKSBwb3N0cm91dGVfaG9sZAogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV9zdGVwIHBvc3Ryb3V0ZV9ob2xkXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX2hvbGQsaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiPEZGPiBSVU5OSU5HIFBPU1QtUk9VVEUgSE9MRCBGSVhJTkcgLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUE9TVC1ST1VURSBIT0xEIEZJWElOR1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcHJlIHBvc3RSb3V0ZSBob2xkIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wb3N0cm91dGVfaG9sZF90Y2xdCiAgICAgIHNldCBjb21tYW5kICJvcHRfZGVzaWduIC1wb3N0X3JvdXRlIC1ob2xkIgogICAgICBhcHBlbmQgY29tbWFuZCAiIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4IHBvc3Ryb3V0ZV9ob2xkXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCxvcHRfZGVzaWduICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFRyaW0gbWV0YWwgZmlsbCBpZiBhZGRlZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnMobWV0YWxmaWxsKSA9PSAicHJlX3Bvc3Ryb3V0ZSJ9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInRyaW1fbWV0YWxfZmlsbFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX2hvbGQsdHJpbV9tZXRhbF9maWxsICRjb21tYW5kXQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgT3B0aW9uYWxseSBydW4gTFBBCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGlmIHskdmFycyh2ZXJpZnlfbGl0aG8pfSB7CiAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCB0byBoYW5kbGUgZGVyZXJlbmNpbmcgdmFyaWFibGVzCiAgICAgICAgIGZpbGUgbWtkaXIgIFtzdWJzdCAkdmFycyhycHRfZGlyKV0vTFBBL0RNQwogICAgICAgICBzZXQgY29tbWFuZCAidmVyaWZ5TGl0aG8gLXJvdXRpbmdMYXllcnNPbmx5IC10ZWNoRmlsZSAkdmFycyhscGFfdGVjaF9maWxlKSAtZGlyICR2YXJzKHJwdF9kaXIpL0xQQVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAidmlvbGF0aW9uQnJvd3NlciAtYWxsIC1ub19kaXNwbGF5X2ZhbHNlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJsb2FkVmlvbGF0aW9uUmVwb3J0IC10eXBlIENETkxpdGhvIC1maWxlbmFtZSAkdmFycyhycHRfZGlyKS9MUEEvRE1DL21lcmdlZC5oaWZcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9ob2xkLHZlcmlmeV9saXRobyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcG9zdCBwb3N0Um91dGUgaG9sZCBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3Bvc3Ryb3V0ZV9ob2xkX3RjbCAwXQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9zaWdub2ZmIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgaWYgeyR2YXJzKHN0ZXApICE9ICJhc3NlbWJsZSJ9IHsKICAgICAgICAgc2V0IHZhcnMoc3RlcCkgc2lnbm9mZgogICAgICB9CiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIE9wdGlvbmFsbHkgdmVyaWZ5L2ZpeCBsaXRobwogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHskdmFycyhmaXhfbGl0aG8pfSB7CiAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCB0byBoYW5kbGUgZGVyZXJlbmNpbmcgdmFyaWFibGVzCiAgICAgICAgIGZpbGUgbWtkaXIgIFtzdWJzdCAkdmFycyhycHRfZGlyKV0vTFBBL0RNQwogICAgICAgICBzZXQgY29tbWFuZCAibG9hZFZpb2xhdGlvblJlcG9ydCAtdHlwZSBDRE5MaXRobyAtZmlsZW5hbWUgJHZhcnMocnB0X2RpcikvTFBBL0RNQy9tZXJnZWQuaGlmXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXROYW5vUm91dGVNb2RlIC1kcm91dGVQb3N0Um91dGVMaXRob1JlcGFpciB0cnVlIFxcXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgICAgICAgICAgICAgIC1kcm91dGVNaW5pbWl6ZVRvcG9sb2d5Q2hhbmdlIHRydWVcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImdsb2JhbERldGFpbFJvdXRlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ3cml0ZUhpZiAtZmlsZSAkdmFycyhycHRfZGlyKS9MUEEvaW5jcl92ZXJpZnkuaGlmXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ2ZXJpZnlMaXRobyAtc2lnbk9mZiBcXFxuIiAKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgICAgICAgIC1kaXIgJHZhcnMoZGJzX2RpcikvTFBBMiBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgICAgICAgLWNwdSAkdmFycyhsb2NhbF9jcHVzKSBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgICAgICAgLWNvbmZpZyAkdmFycyhscGFfY29uZl9maWxlKSBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgICAgICAgLWluY3JDaGVjayAkdmFycyhycHRfZGlyKS9MUEEvaW5jcl92ZXJpZnkuaGlmXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ2aW9sYXRpb25Ccm93c2VyIC1hbGwgLW5vX2Rpc3BsYXlfZmFsc2VcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImxvYWRWaW9sYXRpb25SZXBvcnQgLXR5cGUgQ0ROTGl0aG8gLWZpbGVuYW1lICR2YXJzKHJwdF9kaXIpL0xQQTIvRE1DL21lcmdlZC5oaWZcbiIKCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLGZpeF9saXRobyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgbWV0YWxmaWxsIHBsdWctaW4KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7JHZhcnMobWV0YWxmaWxsKSA9PSAicHJlX3NpZ25vZmYifSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRjo6c291cmNlX3BsdWcgbWV0YWxmaWxsX3RjbF0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsYWRkX21ldGFsZmlsbCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3N0ZXAgc2lnbm9mZl0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6aW5zZXJ0X2NvbW1lbnRzXSAKIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLGluaXRpYWxpemVfc3RlcCAkY29tbWFuZF0KICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgc2lnbm9mZiBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9zaWdub2ZmX3RjbF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gUkMgRXh0cmFjdGlvbgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+IFJVTk5JTkcgRklOQUwgU0lHTk9GRiAuLi5cIlxuIgoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBGSU5BTCBTSUdOT0ZGXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICBzZXQgY29tbWFuZCAiZXh0cmFjdF9yY1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixleHRyYWN0X3JjICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIER1bXAgU1BFRiBmb3Igc2lnbm9mZiBTVEEKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeyR2YXJzKHNraXBfc2lnbm9mZl9jaGVja3MpfSB7CiAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgIGZvcmVhY2ggY29ybmVyICR2YXJzKHJjX2Nvcm5lcnMpIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIndyaXRlX3BhcmFzaXRpY3MgLXJjX2Nvcm5lciAkY29ybmVyIC1zcGVmX2ZpbGUgJGNvcm5lci5zcGVmLmd6XG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgImZvcmVhY2ggY29ybmVyIFwkdmFycyhhY3RpdmVfcmNfY29ybmVycykge1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgd3JpdGVfcGFyYXNpdGljcyAtcmNfY29ybmVyIFwkY29ybmVyIC1zcGVmX2ZpbGUgXCRjb3JuZXIuc3BlZi5nelxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgogICAgICB9IAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixkdW1wX3NwZWYgJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnMoc3RlcCkgPT0gImFzc2VtYmxlIiAmJgogICAgICAgICAgW2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX3NpZ25vZmZfZWNvKV0gJiYgJHZhcnMoZW5hYmxlX3NpZ25vZmZfZWNvKX0gewogICAgICAgICBzZXQgY29tbWFuZCAidGltZV9zaWdub2ZmIC1yZXBvcnRfb25seSAtbm9fZWNvX2RiXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHRpbWVfc2lnbm9mZiAkY29tbWFuZF0gICAgICAgICAKICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zaV9hd2FyZSl9IHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV19IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVfZGVzaWduIC1yZXBvcnRfcHJlZml4IHNpZ25vZmYgLXNpZ25fb2ZmIC1yZXBvcnRfb25seSAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbZm9ybWF0ICJ0aW1lX2Rlc2lnbiAtcmVwb3J0X3ByZWZpeCBzaWdub2ZmIC1zaWduX29mZiAtcmVwb3J0X29ubHkgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcikgJXNcbiIgJHZhcnModGltZV9kZXNpZ25fb3B0aW9ucyxzZXR1cCldCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV19IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVfZGVzaWduIC1yZXBvcnRfcHJlZml4IHNpZ25vZmYgLXNpZ25fb2ZmIC1zaSAtcmVwb3J0X29ubHkgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZV9kZXNpZ24gLXJlcG9ydF9wcmVmaXggc2lnbl9vZmYgLXNpZ25vZmYgLXNpIC1yZXBvcnRfb25seSAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKSAlc1xuIiAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHRpbWVfZGVzaWduX3NldHVwICRjb21tYW5kXQogICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NpX2F3YXJlKX0gewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsaG9sZCldfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ0aW1lX2Rlc2lnbiAtcmVwb3J0X3ByZWZpeCBzaWdub2ZmIC1zaWduX29mZiAtcmVwb3J0X29ubHkgLWhvbGQgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZV9kZXNpZ24gLXJlcG9ydF9wcmVmaXggc2lnbm9mZiAtc2lnbl9vZmYgLXJlcG9ydF9vbmx5IC1ob2xkIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpICVzXG4iICR2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsaG9sZCldCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLGhvbGQpXX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAidGltZV9kZXNpZ24gLXJlcG9ydF9wcmVmaXggc2lnbm9mZiAtc2lnbl9vZmYgLXNpIC1yZXBvcnRfb25seSAtaG9sZCAgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZV9kZXNpZ24gLXJlcG9ydF9wcmVmaXggc2lnbl9vZmYgLXNpZ25vZmYgLXNpIC1yZXBvcnRfb25seSAtaG9sZCAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKSAlc1xuIiAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLGhvbGQpXQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsdGltZV9kZXNpZ25faG9sZCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIER1bXAgR0RTIGFuZC9vciBPQSBkYXRhIGJhc2UKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZ2RzX2xheWVyX21hcCldfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9zdHJlYW0gJHZhcnMoZGVzaWduKS5nZHMuZ3ogLW1hcF9maWxlICR2YXJzKGdkc19sYXllcl9tYXApICIKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGdkc19maWxlcyldfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItbWVyZ2UgeyAiCiAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhnZHNfZmlsZXMpIHsKICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiRmaWxlICIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcHV0cyAgIjxGRj4gV0FSTklORzogR0RTIEZJTEUgJGZpbGUgRE9FUyBOT1QgRVhJU1QgLi4uLiBTS0lQUElOR1xuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn0iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixzdHJlYW1fb3V0ICRjb21tYW5kXQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhvYXNpc19sYXllcl9tYXApXX0gewogICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfb2FzaXMgJHZhcnMoZGVzaWduKS5vYXNpcy5neiAtbWFwX2ZpbGUgJHZhcnMob2FzaXNfbGF5ZXJfbWFwKSAiCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhvYXNpc19maWxlcyldfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItbWVyZ2UgeyAiCiAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhvYXNpc19maWxlcykgewogICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICRmaWxlXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiJGZpbGUgIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICAiPEZGPiBXQVJOSU5HOiBPQVNJUyBGSUxFICRmaWxlIERPRVMgTk9UIEVYSVNUIC4uLi4gU0tJUFBJTkdcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9IgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsb2FzaXNfb3V0ICRjb21tYW5kXQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgRHVtcCBNb2RlbCBmb3IgVG9wIExldmVsIChIaWVyYXJjaGljYWwgRmxvdyBPbmx5KQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIHNldCBwdG4gW2ZpbGUgdGFpbCBbcHdkXV0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgaWYgeyhbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHB0bl0gIT0gLTEpfSB7CiAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAiZmUiXT09MH0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfaWxtIC1vcHRfc3RhZ2UgcG9zdGN0cyAtdHlwZV9mbGV4X2lsbSBpbG0gLXRvX2RpciBcW2dldF9kYiBkZXNpZ25zIC5uYW1lXF0uaWxtXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9pbG0gLW9wdF9zdGFnZSBwb3N0Y3RzIC10eXBlX2ZsZXhfaWxtIGlsbSAtb2FfY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIFxbZ2V0X2RiIGRlc2lnbnMgLm5hbWVcXSBpbG19XG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9pbG0gLW9wdF9zdGFnZSBwb3N0Y3RzIC10eXBlX2ZsZXhfaWxtIGlsbSAtdG9fZGlyIFxbZ2V0X2RiIGRlc2lnbnMgLm5hbWVcXS5pbG1cbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IAogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZix3cml0ZV9pbG0gJGNvbW1hbmRdCiAgICAgICAgIH0gZWxzZWlmIHskdmFycyhzdGVwKSAhPSAiYXNzZW1ibGUifSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHVuZmxhdHRlbl9pbG0gInVuZmxhdHRlbl9pbG1cbiJdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBWRVJJRlkgQ09NTUFORFNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gdmVyaWZ5IGNvbW1hbmRzCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeyEoW2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX3NpZ25vZmZfZWNvKV0gJiYgJHZhcnMoZW5hYmxlX3NpZ25vZmZfZWNvKSl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInJlcG9ydF9zdW1tYXJ5IC1vdXRfZGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHJlcG9ydF9zdW1tYXJ5ICRjb21tYW5kXQogICAgICB9CiAgICAgIHNldCBjb21tYW5kICJjaGVja19jb25uZWN0aXZpdHlcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsY2hlY2tfY29ubmVjdGl2aXR5ICRjb21tYW5kXQogICAgICBzZXQgY29tbWFuZCAiY2hlY2tfZHJjXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLGNoZWNrX2RyYyAkY29tbWFuZF0KICAgICAgc2V0IGNvbW1hbmQgImNoZWNrX21ldGFsX2RlbnNpdHlcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsY2hlY2tfbWV0YWxfZGVuc2l0eSAkY29tbWFuZF0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0gJiYgKFtsc2VhcmNoICR2YXJzKHBhcnRpdGlvbl9saXN0KSAkcHRuXSAhPSAtMSl9IHsKICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdmFycyhkYnNfZm9ybWF0KSAiZmUiXT09MH0gewogICAgICAgICAgIHNldCBjb21tYW5kICJjaGVja19wcm9jZXNzX2FudGVubmEgLWxlZl9maWxlICRwdG4uYW50ZW5uYS5sZWZcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBzZXQgY29tbWFuZCAiY2hlY2tfcHJvY2Vzc19hbnRlbm5hXG4iCiAgICAgICAgICMgTm90IHN1cmUgeWV0ICBob3cgc2F2ZV9hYnN0cmFjdCAgd291bGQgYmUgY2FsbGVkLSBza2lwIHRoaXMgZm9yIG5vdy4KICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgY29tbWFuZCAiY2hlY2tfcHJvY2Vzc19hbnRlbm5hXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsdmVyaWZ5X3Byb2Nlc3NfYW50ZW5uYSAkY29tbWFuZF0KCiAgICAgIGlmIHsoW2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX2x2cyldICYmICR2YXJzKGVuYWJsZV9sdnMpKSAmJiAoJHZhcnMoZGJzX2Zvcm1hdCkgPT0gIm9hIil9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OmNyZWF0ZV9sdnNfZGF0YV0KICAgICAgfQogICAgICBpZiB7JHZhcnMobm92dXMpfSB7CiAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZmxvd2tpdF93cml0ZV9kYl9hcmdzIC1kZWZcbiIKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcG9zdCBzaWdub2ZmIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9zaWdub2ZmX3RjbCAwXQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQoKICAgfQoKICAgcHJvYyBydW5fYXNzZW1ibGUge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IHZhcnMoc3RlcCkgYXNzZW1ibGUKICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgIEZGX05PVlVTOjppbml0aWFsaXplX3N0ZXAgYXNzZW1ibGUKCiMgICAgICBpZiB7JHZhcnMocmVwb3J0X3J1bl90aW1lKX0gewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkdmFycyhzdGVwKSxzdGFydF90aW1lKSBcW2Nsb2NrIHNlY29uZHNcXVxuIgojICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgQVNTRU1CTElORyBERVNJR05cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgInByZSBhc3NlbWJsZSIgcGx1Zy1pbiBzY3JpcHQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfYXNzZW1ibGVfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEFzc2VtYmxlIHRoZSBkZXNpZ24KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBzZXQgdmFycyhpbG0pIGZhbHNlCiAgICAgIHNldCBpbG1fbGlzdCBbbGlzdF0KICAgICAgc2V0IHBhY19saXN0IFtsaXN0XQogICAgICBpZiB7JHZhcnMoZW5hYmxlX3BhYyl9IHsKICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxwYWNfbW9kZSldfSAgewogICAgICAgICAgICAgICBpZiB7JHZhcnMoJHBhcnQscGFjX21vZGUpID09ICJpbG0ifSB7CiAgICAgICAgICAgICAgICAgIGxhcHBlbmQgaWxtX2xpc3QgJHBhcnQKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgbGFwcGVuZCBwYWNfbGlzdCAkcGFydAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbGlzdCldICYmICgkdmFycyhpbG1fbGlzdCkgIT0gIiIpfSB7CiAgICAgICAgIGZvcmVhY2ggaWxtICR2YXJzKGlsbV9saXN0KSB7CiAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJGlsbV9saXN0ICRpbG1dID09IC0xKSAmJiAoW2xzZWFyY2ggJHBhY19saXN0ICRpbG1dID09IC0xKX0gewogICAgICAgICAgICAgICBsYXBwZW5kIGlsbV9saXN0ICRpbG0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgeyRpbG1fbGlzdCAhPSAiIn0gewogICAgICAgICBzZXQgdmFycyhpbG0pIHRydWUgCiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIn0gewogICAgICAgICBzZXQgcGFydGl0aW9uX2RpciAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKQogICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHBhcnRpdGlvbl9kaXIgJHZhcnMocGFydGl0aW9uX2RpcikKICAgICAgfQogICAgICBzZXQgZGlyIFtmaWxlIHRhaWwgW3N1YnN0ICR2YXJzKGRic19kaXIpXV0KCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyhzY3JpcHRfZGlyKS9pbmNyX3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewogICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnMoc2NyaXB0X2Rpcikvdmlld19kZWZpbml0aW9uLnRjbAogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7KFtzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wKSAmJiAoW2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMCl9IHsKCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZXNpZ24pLGFzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIC10b3BfZGVzaWduIHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkdmFycyhkZXNpZ24pICR2YXJzKCR2YXJzKGRlc2lnbiksYXNzZW1ibGVfc3RlcCl9IC1tbW1jX2ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFzc2VtYmxlX2Rlc2lnbiAtdG9wX2Rlc2lnbiB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHZhcnMoZGVzaWduKSBzaWdub2ZmfSAtbW1tY19maWxlICRtbW1jX2ZpbGUiCiAgICAgICAgIH0KICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkaWxtX2xpc3QgJHBhcnRdID09IC0xfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxhc3NlbWJsZV9zdGVwKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2sgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwYXJ0ICR2YXJzKCR2YXJzKCRwYXJ0KSxhc3NlbWJsZV9zdGVwKX0iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrIHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkcGFydCBzaWdub2ZmfSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgICAgICAgc2V0IGFzc2VtYmxlX2NvbW1hbmQgImFzc2VtYmxlX2Rlc2lnbiAtcG93ZXJfaW50ZW50X2ZpbGUgJHZhcnMoY3BmX2ZpbGUpIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIC1tbW1jX2ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZXNpZ24pLGFzc2VtYmxlX2RicyldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtdG9wX2RpciAkdmFycygkdmFycyhkZXNpZ24pLGFzc2VtYmxlX2RicykiCiAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZXNpZ24pLGFzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFzc2VtYmxlX2NvbW1hbmQgJHBhcnRpdGlvbl9kaXIvJHZhcnMoZGVzaWduKS8kZGlyLyR2YXJzKCR2YXJzKGRlc2lnbiksYXNzZW1ibGVfc3RlcCkuZW5jIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7JHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcyl9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIC10b3BfZGlyICRwYXJ0aXRpb25fZGlyLyR2YXJzKGRlc2lnbikvJGRpci90b3AudG9wX3NpZ25vZmYuZW5jICIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIC10b3BfZGlyICRwYXJ0aXRpb25fZGlyLyR2YXJzKGRlc2lnbikvJGRpci9zaWdub2ZmLmVuYyAiCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoICRpbG1fbGlzdCAkcGFydF0gPT0gLTF9IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LGFzc2VtYmxlX2RicyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrX2RpciAkdmFycygkcGFydCxhc3NlbWJsZV9kYnMpIgogICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQsYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrX2RpciAkcGFydGl0aW9uX2Rpci8kcGFydC8kZGlyLyR2YXJzKCRwYXJ0LGFzc2VtYmxlX3N0ZXApLmVuYyIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGdlbmVyYXRlX2Zsb3dfc3RlcHMpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrX2RpciAkcGFydGl0aW9uX2Rpci8kcGFydC8kZGlyL2Jsb2NrLnNpZ25vZmYuZW5jIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9ja19kaXIgJHBhcnRpdGlvbl9kaXIvJHBhcnQvJGRpci9zaWdub2ZmLmVuYyIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHskdmFycyhlbmFibGVfcGFjKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAtaGllckRpciAkdmFycyhwYWNfc2NyYXRjaF9kaXIpIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kICJcblxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGFzc2VtYmxlX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgaWYgeyhbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwKSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkbW1tY19maWxlXG4iCiAgICAgIH0KICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmRlcmF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEzfSB7CiAgICAgICAgICAgIGlmIHskdmFycyhzdGVwKSAhPSAiZGVidWcifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZW5hYmxlX21ldHJpY3MgLW9uXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgYWx3YXlzX3NvdXJjZV90Y2xdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCAicG9zdCBhc3NlbWJsZSIgcGx1Zy1pbiBzY3JpcHQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X2Fzc2VtYmxlX3RjbCAwXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFNwZWNpZnkgSUxNcyBpZiBkZWZpbmVkCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeyR2YXJzKGlsbSl9IHsKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgU1BFQ0lGWUlORyBJTE1zXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICB9CiAgICAgICAgIHNldCBjb21tYW5kICIiIAogICAgICAgICBmb3JlYWNoIGNlbGwgJGlsbV9saXN0IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjZWxsLGlsbV9kaXIpXSAmJiBbZmlsZSBpc2RpcmVjdG9yeSAkdmFycygkY2VsbCxpbG1fZGlyKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJGNlbGwgLWRpciAkdmFycygkY2VsbCxpbG1fZGlyKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IElMTSBESVJFQ1RPUlkgTUlTU0lORyBGT1IgJGNlbGwgLi4uIFNLSVBQSU5HIgogICAgICAgICAgICB9CiAgICAgICAgIH0gCiAgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxzcGVjaWZ5X2lsbSAkY29tbWFuZF0KICAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXX0gewogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRUaW1pbmdDb24gLWlsbU5vblNkY0ZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldElsbU5vblNkY0NvbnN0cmFpbnRGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGxvYWRfaWxtX25vbl9zZGNfZmlsZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiMgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewojICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRDUEYgJHZhcnMoY3BmX2ZpbGUpXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsbG9hZF9jcGYgJGNvbW1hbmRdCiMgICAgICAgICAgICBzZXQgY29tbWFuZCAiY29tbWl0Q1BGIgojICAgICAgICAgICAgaWYgeyR2YXJzKGNwZl9rZWVwX3Jvd3MpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1rZWVwUm93cyIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhjcGZfcG93ZXJfZG9tYWluKX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG93ZXJfZG9tYWluIgojICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyR2YXJzKGNwZl9pc29sYXRpb24pfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pc29sYXRpb24iCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3BmX3N0YXRlX3JldGVudGlvbil9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXN0YXRlX3JldGVudGlvbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhjcGZfbGV2ZWxfc2hpZnRlcil9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWxldmVsX3NoaWZ0ZXIiCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3BmX3Bvd2VyX3N3aXRjaCl9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvd2VyX3N3aXRjaCIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxjb21taXRfY3BmICRjb21tYW5kXQojICAgICAgICAgfQojICAgICAgfQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGluaXRpYWxpemVfdGltaW5nICRjb21tYW5kXQogICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjp1cGRhdGVfdGltaW5nIG1tbWMgXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsdXBkYXRlX3RpbWluZyAkY29tbWFuZF0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfc2lnbm9mZl9lY28pXSAmJiAkdmFycyhlbmFibGVfc2lnbm9mZl9lY28pfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9zaWdub2ZmX2Vjb190Y2wgMF0KICAgICAgICAgc2V0IGNvbW1hbmQgImNoZWNrX2Nvbm5lY3Rpdml0eVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUscHJlX3NpZ25vZmZfZWNvX3ZlcmlmeV9jb25uZWN0aXZpdHkgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJjaGVja19kcmNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHByZV9zaWdub2ZmX2Vjb192ZXJpZnlfZ2VvbWV0cnkgJGNvbW1hbmRdCgogICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIFNJR04tT0ZGIEVDT1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgfQoKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjpkZWxldGVfZmlsbGVyX2NlbGxzXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsZGVsZXRlX2ZpbGxlcl9jZWxscyAkY29tbWFuZF0KCiAgICAgICAgIHNldCBjb21tYW5kICJleHRyYWN0X3JjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxleHRyYWN0X3JjICRjb21tYW5kXQoKICAgICAgICAgc2V0IG9wIFtvcGVuIHB0bi50eHQgd10KICAgICAgICAgZm9yZWFjaCBwdG4gJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgcHV0cyAkb3AgIiRwdG4iCiAgICAgICAgIH0KICAgICAgICAgY2xvc2UgJG9wIAoKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBvcHRfc2lnbm9mZl9wYXJ0aXRpb25fbGlzdF9maWxlIFwicHRuLnR4dFwiXG4iIAogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIG9wdF9zaWdub2ZmX29wdGltaXplX3JlcGxpY2F0ZWRfbW9kdWxlcyB0cnVlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxzZXRfc2lnbm9mZl9tb2RlICRjb21tYW5kXQoKICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVfc2lnbm9mZiAtcmVwb3J0X29ubHlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHRpbWVfc2lnbm9mZiAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgIm9wdF9kZXNpZ25fc2lnbm9mZiAtc2V0dXAgLW5vX2Vjb19yb3V0ZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsc2lnbm9mZl9vcHRfZGVzaWduICRjb21tYW5kXQogICAgICAgICBzZXQgY29tbWFuZCAiYWRkX2ZpbGxlclxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsYWRkX2ZpbGxlcl9jZWxscyAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgImVjb19yb3V0ZSAtaGFuZGxlX3BhcnRpdGlvblxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsZWNvX3JvdXRlICRjb21tYW5kXQoKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAjIE9wdGlvbmFsbHkgcnVuIExQQQogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgICAgICBpZiB7JHZhcnModmVyaWZ5X2xpdGhvKX0gewogICAgICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgdG8gaGFuZGxlIGRlcmVyZW5jaW5nIHZhcmlhYmxlcwogICAgICAgICAgICBmaWxlIG1rZGlyICBbc3Vic3QgJHZhcnMocnB0X2RpcildL0xQQS9ETUMKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInZlcmlmeUxpdGhvIC1yb3V0aW5nTGF5ZXJzT25seSAtdGVjaEZpbGUgJHZhcnMobHBhX3RlY2hfZmlsZSkgLWRpciAkdmFycyhycHRfZGlyKS9MUEFcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInZpb2xhdGlvbkJyb3dzZXIgLWFsbCAtbm9fZGlzcGxheV9mYWxzZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAibG9hZFZpb2xhdGlvblJlcG9ydCAtdHlwZSBDRE5MaXRobyAtZmlsZW5hbWUgJHZhcnMocnB0X2RpcikvTFBBL0RNQy9tZXJnZWQuaGlmXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSx2ZXJpZnlfbGl0aG8gJGNvbW1hbmRdCiAgICAgICAgIH0KCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3Rfc2lnbm9mZl9lY29fdGNsIDBdCiAgICAgICAgIHNldCBjb21tYW5kICJjaGVja19jb25uZWN0aXZpdHlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHBvc3Rfc2lnbm9mZl9lY29fdmVyaWZ5X2Nvbm5lY3Rpdml0eSAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgImNoZWNrX2RyY1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUscG9zdF9zaWdub2ZmX2Vjb192ZXJpZnlfZ2VvbWV0cnkgJGNvbW1hbmRdCiAgICAgIH0gZWxzZWlmIHskdmFycyhlbmFibGVfcGFjKX0gewogICAgICAgICBzZXQgY29tbWFuZCAiY2hlY2tfY29ubmVjdGl2aXR5XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxwcmVfcGFjX3ZlcmlmeV9jb25uZWN0aXZpdHkgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJjaGVja19kcmNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHByZV9wYWNfdmVyaWZ5X2dlb21ldHJ5ICRjb21tYW5kXQoKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgREVGSU5JTkcgUEFDIE1PREVTXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wYWNfdGNsIDBdCiAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgIGZvcmVhY2ggcGFydCAkcGFjX2xpc3QgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IGhpbnN0IFxbZGJISW5zdE5hbWUgXFtkYkNlbGxISW5zdCBcW2RiR2V0Q2VsbEJ5TmFtZSAkcGFydFxdXF1cXVxuIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscGFjX21vZGUpXX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoJHBhcnQscGFjX21vZGUpID09ICJyZWFkX29ubHkifSB7IHNldCB2YXJzKCRwYXJ0LHBhY19tb2RlKSAicmVhZE9ubHkiIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldE1vZHVsZVZpZXcgLWhpbnN0IFwkaGluc3QgLXR5cGUgJHZhcnMoJHBhcnQscGFjX21vZGUpXG4iCiAgICAgICAgICAgIH0gCiAgICAgICAgIH0KCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJnZXRNb2R1bGVWaWV3XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxzZXRfbW9kdWxlX3ZpZXcgJGNvbW1hbmRdCgogICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIFBPU1QgQVNTRU1CTFkgQ0xPU1VSRVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgfQojICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjpkZWxldGVfZmlsbGVyX2NlbGxzXQojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGRlbGV0ZV9maWxsZXJfY2VsbHMgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJvcHRfZGVzaWduIC1wb3N0X3JvdXRlIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4IHBhY1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsb3B0X2Rlc2lnbiAkY29tbWFuZF0KIyAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6YWRkX2ZpbGxlcl9jZWxsc10KIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxhZGRfZmlsbGVyX2NlbGxzICRjb21tYW5kXQoKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAjIE9wdGlvbmFsbHkgcnVuIExQQQogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgICAgICBpZiB7JHZhcnModmVyaWZ5X2xpdGhvKX0gewogICAgICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgdG8gaGFuZGxlIGRlcmVyZW5jaW5nIHZhcmlhYmxlcwogICAgICAgICAgICBmaWxlIG1rZGlyICBbc3Vic3QgJHZhcnMocnB0X2RpcildL0xQQS9ETUMKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInZlcmlmeUxpdGhvIC1yb3V0aW5nTGF5ZXJzT25seSAtdGVjaEZpbGUgJHZhcnMobHBhX3RlY2hfZmlsZSkgLWRpciAkdmFycyhycHRfZGlyKS9MUEFcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInZpb2xhdGlvbkJyb3dzZXIgLWFsbCAtbm9fZGlzcGxheV9mYWxzZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAibG9hZFZpb2xhdGlvblJlcG9ydCAtdHlwZSBDRE5MaXRobyAtZmlsZW5hbWUgJHZhcnMocnB0X2RpcikvTFBBL0RNQy9tZXJnZWQuaGlmXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSx2ZXJpZnlfbGl0aG8gJGNvbW1hbmRdCiAgICAgICAgIH0KCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcGFjX3RjbCAwXQogICAgICAgICBzZXQgY29tbWFuZCAiY2hlY2tfY29ubmVjdGl2aXR5XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxwb3N0X3BhY192ZXJpZnlfY29ubmVjdGl2aXR5ICRjb21tYW5kXQogICAgICAgICBzZXQgY29tbWFuZCAiY2hlY2tfZHJjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxwb3N0X3BhY192ZXJpZnlfZ2VvbWV0cnkgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICAgICBzZXQgY29tbWFuZHMgIiIgCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OnJ1bl9zaWdub2ZmICRmb3JtYXRdCgojICAgICAgaWYgeyR2YXJzKG1ha2VmaWxlKX0geyAKIyAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2luZm8gZXhpc3RzIGVudihWUEFUSClcXX0ge1xuIgojICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS9hc3NlbWJsZVxuIgojICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgojICAgICAgIH0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9yZWJ1ZGdldCB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgZW52CgogICAgICBzZXQgdmFycyhzdGVwKSByZWJ1ZGdldAogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgIEZGX05PVlVTOjppbml0aWFsaXplX3N0ZXAgJHZhcnMoc3RlcCkKCiMgICAgICBpZiB7JHZhcnMocmVwb3J0X3J1bl90aW1lKX0gewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkdmFycyhzdGVwKSxzdGFydF90aW1lKSBcW2Nsb2NrIHNlY29uZHNcXVxuIgojICAgICAgfQogICAgICBpZiB7ISR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuaWYge1xbZmlsZSBpc2ZpbGUgJHZhcnMocGFjX3NjcmF0Y2hfZGlyKS8ucGFjRmxvd0xvY2tcXX0ge1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGZpbGUgZGVsZXRlICR2YXJzKHBhY19zY3JhdGNoX2RpcikvLnBhY0Zsb3dMb2NrXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgfSBlbHNlIHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbZmlsZSBpc2ZpbGUgJHZhcnMoc2NyaXB0X2Rpcikvdmlld19kZWZpbml0aW9uLnRjbF19IHtcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZmlsZSBjb3B5IC1mb3JjZSAkdmFycyhzY3JpcHRfZGlyKS92aWV3X2RlZmluaXRpb24udGNsICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKGRlc2lnbikvdmlld0RlZmluaXRpb24udGNsXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgIH0KCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIEFTU0VNQkxJTkcgREVTSUdOXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkICJwcmUgcmVidWRnZXQiIHBsdWctaW4gc2NyaXB0CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3JlYnVkZ2V0X3RjbF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBHZXQgdGhlIEZsZXhJTE0gRUNPIHBhdGhzCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2ZpbGUgaXNmaWxlIFwkZW52KFZQQVRIKS9mbGV4aWxtXF19IHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBzb3VyY2UgXCRlbnYoVlBBVEgpL2ZsZXhpbG1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBBc3NlbWJsZSB0aGUgZGVzaWduCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgc2V0IHZhcnMoaWxtKSBmYWxzZQogICAgICBzZXQgaWxtX2xpc3QgW2xpc3RdCiAgICAgIHNldCBwYWNfbGlzdCBbbGlzdF0KICAgICAgaWYgeyR2YXJzKGVuYWJsZV9wYWMpfSB7CiAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscGFjX21vZGUpXX0gIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKCRwYXJ0LHBhY19tb2RlKSA9PSAiaWxtIn0gewogICAgICAgICAgICAgICAgICBsYXBwZW5kIGlsbV9saXN0ICRwYXJ0CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGxhcHBlbmQgcGFjX2xpc3QgJHBhcnQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWxtX2xpc3QpXSAmJiAoJHZhcnMoaWxtX2xpc3QpICE9ICIiKX0gewogICAgICAgICBmb3JlYWNoIGlsbSAkdmFycyhpbG1fbGlzdCkgewogICAgICAgICAgICBpZiB7KFtsc2VhcmNoICRpbG1fbGlzdCAkaWxtXSA9PSAtMSkgJiYgKFtsc2VhcmNoICRwYWNfbGlzdCAkaWxtXSA9PSAtMSl9IHsKICAgICAgICAgICAgICAgbGFwcGVuZCBpbG1fbGlzdCAkaWxtCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHskaWxtX2xpc3QgIT0gIiJ9IHsKICAgICAgICAgc2V0IHZhcnMoaWxtKSB0cnVlIAogICAgICB9CgogICAgICAjIEJDTDogQWRkZWQgdGFpbCBvZiBzdWJzdCBvZiB2YXJzKGRic19kaXIpCiAgICAgICMgTm90ZSAtIEVESUZGIEhpZXJhcmNoaWNhbCBmbG93IGlzIGN1cnJlbnRseSBJTkNPTVBBVElCTEUgd2l0aCBGRiBkaXIgc3RydWN0dXJlCiAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGFwcGVhcnMgdG8gcmVseSBvbiB2YXJzKGRic19kaXIpIGFsd2F5cyBiZWluZyB1bmRlciAkdmFycyhwYXJ0aXRpb25fZGlyKS8kdmFycyhkZXNpZ24pCiAgICAgICMgVGhpcyBuZWVkcyB0byBiZSByZWNvbmNpbGVkCiAgICAgIHNldCBkaXIgW2ZpbGUgdGFpbCBbc3Vic3QgJHZhcnMoZGJzX2RpcildXQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL2luY3Jfdmlld19kZWZpbml0aW9uLnRjbAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyhzY3JpcHRfZGlyKS92aWV3X2RlZmluaXRpb24udGNsCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHsoW3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTApICYmIChbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwKX0gewoKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJhc3NlbWJsZV9kZXNpZ24gLXRvcF9kZXNpZ24geyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICR2YXJzKGRlc2lnbikgJHZhcnMoJHZhcnMoZGVzaWduKSxyZWJ1ZGdldF9hc3NlbWJsZV9zdGVwKX0gLW1tbWNfZmlsZSAkbW1tY19maWxlIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIC10b3BfZGVzaWduIHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkdmFycyhkZXNpZ24pIGN0c30gLW1tbWNfZmlsZSAkbW1tY19maWxlIgogICAgICAgICB9CiAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGlsbV9saXN0ICRwYXJ0XSA9PSAtMX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscmVidWRnZXRfYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrIHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkcGFydCAkdmFycygkdmFycygkcGFydCkscmVidWRnZXRfYXNzZW1ibGVfc3RlcCl9IgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9jayB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHBhcnQgY3RzfSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByZWJ1ZGdldCxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgICAgICAgc2V0IGFzc2VtYmxlX2NvbW1hbmQgImFzc2VtYmxlX2Rlc2lnbiAtcG93ZXJfaW50ZW50X2ZpbGUgJHZhcnMoY3BmX2ZpbGUpIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIC1tbW1jX2ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX2RicyldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtdG9wX2RpciAkdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX2RicykiCiAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFzc2VtYmxlX2NvbW1hbmQgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKS8kZGlyLyR2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfc3RlcCkuZW5jIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKX0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFzc2VtYmxlX2NvbW1hbmQgXFxcbiAgIC10b3BfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpX0ZMRVhJTE0vJHZhcnMoZGVzaWduKSAiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCBcXFxuICAgLXRvcF9kaXIgJHZhcnMocGFydGl0aW9uX2RpcilfRkxFWElMTS8kdmFycyhkZXNpZ24pICIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcyl9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIC10b3BfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKGRlc2lnbikvJGRpci90b3AuY3RzLmVuYyAiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtdG9wX2RpciAkdmFycyhwYXJ0aXRpb25fZGlyKS8kdmFycyhkZXNpZ24pLyRkaXIvY3RzLmVuYyAiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGlsbV9saXN0ICRwYXJ0XSA9PSAtMX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscmVidWRnZXRfYXNzZW1ibGVfZGJzKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tfZGlyICR2YXJzKCRwYXJ0LHJlYnVkZ2V0X2Fzc2VtYmxlX2RicykiCiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxyZWJ1ZGdldF9hc3NlbWJsZV9zdGVwKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwYXJ0LyRkaXIvJHZhcnMoJHBhcnQscmVidWRnZXRfYXNzZW1ibGVfc3RlcCkuZW5jIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrX2RpciBcJHZhcnMoJHBhcnQsY2R0dikgIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwYXJ0LyRkaXIvYmxvY2suY3RzLmVuYyIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwYXJ0LyRkaXIvY3RzLmVuYyIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgeyR2YXJzKGVuYWJsZV9wYWMpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuIC1oaWVyRGlyICR2YXJzKHBhY19zY3JhdGNoX2RpcikiCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGFzc2VtYmxlX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgaWYgeyhbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwKSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkbW1tY19maWxlXG4iCiAgICAgIH0KICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmRlcmF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGFsd2F5c19zb3VyY2VfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgInBvc3QgcmVidWRnZXQiIHBsdWctaW4gc2NyaXB0CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9yZWJ1ZGdldF90Y2wgMF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBTcGVjaWZ5IElMTXMgaWYgZGVmaW5lZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFNQRUNJRllJTkcgSUxNc1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgfQogICAgICAgICBzZXQgY29tbWFuZCAiIiAKICAgICAgICAgZm9yZWFjaCBjZWxsICRpbG1fbGlzdCB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY2VsbCxpbG1fZGlyKV0gJiYgW2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMoJGNlbGwsaWxtX2RpcildfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRjZWxsIC1kaXIgJHZhcnMoJGNlbGwsaWxtX2RpcilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBJTE0gRElSRUNUT1JZIE1JU1NJTkcgRk9SICRjZWxsIC4uLiBTS0lQUElORyIKICAgICAgICAgICAgfQogICAgICAgICB9IAogIAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJsb2FkVGltaW5nQ29uIC1pbG1Ob25TZGNGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRJbG1Ob25TZGNDb25zdHJhaW50RmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKIyAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewojICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV19IHsKIyAgICAgICAgICAgIHNldCBjb21tYW5kICJsb2FkQ1BGICR2YXJzKGNwZl9maWxlKVxuIgojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGxvYWRfY3BmICRjb21tYW5kXQojICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNvbW1pdENQRiIKIyAgICAgICAgICAgIGlmIHskdmFycyhjcGZfa2VlcF9yb3dzKX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAta2VlcFJvd3MiCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3BmX3Bvd2VyX2RvbWFpbil9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvd2VyX2RvbWFpbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhjcGZfaXNvbGF0aW9uKX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtaXNvbGF0aW9uIgojICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyR2YXJzKGNwZl9zdGF0ZV9yZXRlbnRpb24pfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1zdGF0ZV9yZXRlbnRpb24iCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3BmX2xldmVsX3NoaWZ0ZXIpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1sZXZlbF9zaGlmdGVyIgojICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyR2YXJzKGNwZl9wb3dlcl9zd2l0Y2gpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1wb3dlcl9zd2l0Y2giCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY29tbWl0X2NwZiAkY29tbWFuZF0KIyAgICAgICAgIH0KIyAgICAgIH0KCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHshJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6dXBkYXRlX3RpbWluZyBtbW1jIF0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhlbmFibGVfcGFjKX0gewoKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgREVGSU5JTkcgUEFDIE1PREVTXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wYWNfdGNsIDBdCiAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgIGZvcmVhY2ggcGFydCAkcGFjX2xpc3QgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IGhpbnN0IFxbZGJISW5zdE5hbWUgXFtkYkNlbGxISW5zdCBcW2RiR2V0Q2VsbEJ5TmFtZSAkcGFydFxdXF1cXVxuIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscGFjX21vZGUpXX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoJHBhcnQscGFjX21vZGUpID09ICJyZWFkX29ubHkifSB7IHNldCB2YXJzKCRwYXJ0LHBhY19tb2RlKSAicmVhZE9ubHkiIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldE1vZHVsZVZpZXcgLWhpbnN0IFwkaGluc3QgLXR5cGUgJHZhcnMoJHBhcnQscGFjX21vZGUpXG4iCiAgICAgICAgICAgIH0gCiAgICAgICAgIH0KCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJnZXRNb2R1bGVWaWV3XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfbW9kdWxlX3ZpZXcgJGNvbW1hbmRdCgogICAgICAgICBpZiB7ISR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIFBPU1QgQVNTRU1CTFkgQ0xPU1VSRVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAib3B0X2Rlc2lnbiAtcG9zdF9jdHMgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcikgLXJlcG9ydF9wcmVmaXggcGFjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxvcHRfZGVzaWduICRjb21tYW5kXQogICAKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wYWNfdGNsIDBdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHJvdXRlX3RyaWFsX2Zsb29ycGxhbl9tb2RlIHRydWVcbnNldF9kYiByb3V0ZV90cmlhbF9ob25vcl9waW4gdHJ1ZVxuIgogICAgICAgIGFwcGVuZCBjb21tYW5kICJyb3V0ZV90cmlhbFxuIgogICAgICB9IGVsc2UgewogICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcm91dGVfdHJpYWxfZmxvb3JwbGFuX21vZGUgdHJ1ZVxuc2V0X2RiIHJvdXRlX2Vhcmx5X2dsb2JhbF9ob25vcl9wYXJ0aXRpb25fcGluIC5cbiIKICAgICAgICBhcHBlbmQgY29tbWFuZCAicm91dGVfZWFybHlfZ2xvYmFsXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmQgImNyZWF0ZV90aW1pbmdfYnVkZ2V0IC1ub190cmlhbF9pcG8gLW5vX2NvbnN0YW50X21vZGVsXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjcmVhdGVfdGltaW5nX2J1ZGdldCAkY29tbWFuZF0KCiAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfZGIgLW9hX2xpYl9jZWxsX3ZpZXcgeyR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgYnVkZ2V0fVxuIgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAkdmFycyhkYnNfZGlyKS9idWRnZXQuZW5jXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNhdmVfYnVkZ2V0X2RicyAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBQYXJ0aXRpb24gYW5kIHNhdmUgdGhlIHBhcnRpdGlvbnMgaW50byB0aGUKICAgICAgIyBkaXJlY3RvcnkgUEFSVElUSU9OCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wYXJ0aXRpb25fdGNsXQoKIyAgICAgIHNldCBjb21tYW5kICJzZXQgcHRuZ1B0blRpbWluZ0xpYkZvcm1hdCBsaWJcbnBhcnRpdGlvbiAtYnVpbGRTY2FuXG4iCiAgICAgIHNldCBjb21tYW5kICJwYXJ0aXRpb24gLWJ1aWxkU2NhblxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscGFydGl0aW9uICRjb21tYW5kXQogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICBpZiB7KFtzdHJpbmcgY29tcGFyZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MCl9IHsKICAgICAgICAgICAgaWYgeyR2YXJzKGhpZXJfZmxvd190eXBlKSA9PSAiMXBhc3MifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlUGFydGl0aW9uIC1wdG5MaWIgJHZhcnMob2FfcGFydGl0aW9uX2xpYikgLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZVBhcnRpdGlvbiAtcHRuTGliICR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIC1kaXIgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMilcbiIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7JHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIxcGFzcyJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVQYXJ0aXRpb24gLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKSAtZGVmIC1zY2FuRGVmXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlUGFydGl0aW9uIC1kaXIgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikgLWRlZiAtc2NhbkRlZlxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVQYXJ0aXRpb24gLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKSAtZGVmIC1zY2FuRGVmXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNhdmVfcGFydGl0aW9uICRjb21tYW5kXQojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wYXJ0aXRpb25fdGNsXQoKICAgICAgaWYgeyR2YXJzKHVzZV9mbGV4bW9kZWxzKSAmJiAkdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewojICAgICAgICAgc2V0IGNvbW1hbmQgInJlcGxhY2VfcHJvdG9fbW9kZWwgXFxcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtcHJlX2Z0X2RpciAkdmFycyhlY29fZGlyKS9wcmVfZnQgXFxcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtcG9zdF9mdF9kaXIgJHZhcnMoZWNvX2RpcikvcG9zdF9mdCBcXFxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1wdG5fZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpIFxcXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLXB0bl9mdWxsX25ldGxpc3RfZGlyIC4vdGVtcF9uZXRsaXN0X2RpciBcXFxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1vdXRfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpXG4iCgogICAgICAgICBzZXQgY29tbWFuZCAicmVwbGFjZV9wcm90b19tb2RlbCBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLXB0bl9kaXIgJHZhcnMocGFydGl0aW9uX2RpcikgXFxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1vdXRfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpXG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVwbGFjZV9wcm90b19tb2RlbCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYgeyEkdmFycyhjb2RlZ2VuKX0gewogICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgICAgIHNldCBjb21tYW5kcyAiIiAKICAgICAgfQoKIyAgICAgIGlmIHskdmFycyhtYWtlZmlsZSkgJiYgISR2YXJzKGdlbmVyYXRlX2Zsb3dfc3RlcHMpfSB7IAogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHtcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS8kdmFycyhzdGVwKVxuIgogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiMgICAgICAgfQoKIyAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBDb3B5IE1ha2VmaWxlcyBpbiBjYXNlIHRoZXkgZ2V0IGRlbGV0ZWQgZHVyaW5nIHRoZSBmbG93IC4uLlxuIgojICAgICAgICAgZm9yZWFjaCBwYXJ0IFtjb25jYXQgJHZhcnMoZGVzaWduKSAkdmFycyhwYXJ0aXRpb25fbGlzdCldIHsKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmlsZSBjb3B5IC1mb3JjZSAkdmFycyhzY3JpcHRfZGlyKS8kcGFydC5NYWtlZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kcGFydC9NYWtlZmlsZVxuIgojICAgICAgICAgfQojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXIpL01ha2VmaWxlICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpL01ha2VmaWxlXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvTWFrZWZpbGUucGFydGl0aW9uICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpL01ha2VmaWxlLnBhcnRpdGlvblxuIgojICAgICAgfQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX2Fzc2VtYmxlX2ZsZXhpbG0ge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IHZhcnMoc3RlcCkgYXNzZW1ibGVfZmxleGlsbQogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgIEZGX05PVlVTOjppbml0aWFsaXplX3N0ZXAgJHZhcnMoc3RlcCkKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIEFTU0VNQkxJTkcgREVTSUdOXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkICJwcmUgcmVidWRnZXQiIHBsdWctaW4gc2NyaXB0CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3JlYnVkZ2V0X3RjbF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBBc3NlbWJsZSB0aGUgZGVzaWduCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgc2V0IHZhcnMoaWxtKSBmYWxzZQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWxtX2xpc3QpXSAmJiAoJHZhcnMoaWxtX2xpc3QpICE9ICIiKX0gewogICAgICAgICBzZXQgdmFycyhpbG0pIHRydWUgCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCB2YXJzKGlsbV9saXN0KSAiIgogICAgICB9CgogICAgICAjIEJDTDogQWRkZWQgdGFpbCBvZiBzdWJzdCBvZiB2YXJzKGRic19kaXIpCiAgICAgICMgTm90ZSAtIEVESUZGIEhpZXJhcmNoaWNhbCBmbG93IGlzIGN1cnJlbnRseSBJTkNPTVBBVElCTEUgd2l0aCBGRiBkaXIgc3RydWN0dXJlCiAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGFwcGVhcnMgdG8gcmVseSBvbiB2YXJzKGRic19kaXIpIGFsd2F5cyBiZWluZyB1bmRlciAkdmFycyhwYXJ0aXRpb25fZGlyKS8kdmFycyhkZXNpZ24pCiAgICAgICMgVGhpcyBuZWVkcyB0byBiZSByZWNvbmNpbGVkCiAgICAgIHNldCBkaXIgW2ZpbGUgdGFpbCBbc3Vic3QgJHZhcnMoZGJzX2RpcildXQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL2luY3Jfdmlld19kZWZpbml0aW9uLnRjbAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyhzY3JpcHRfZGlyKS92aWV3X2RlZmluaXRpb24udGNsCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHsoW3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTApICYmIChbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwKX0gewoKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJhc3NlbWJsZV9kZXNpZ24gLXRvcF9kZXNpZ24geyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICR2YXJzKGRlc2lnbikgJHZhcnMoJHZhcnMoZGVzaWduKSxyZWJ1ZGdldF9hc3NlbWJsZV9zdGVwKX0gLW1tbWNfZmlsZSAkbW1tY19maWxlIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIC10b3BfZGVzaWduIHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkdmFycyhkZXNpZ24pIGN0c30gLW1tbWNfZmlsZSAkbW1tY19maWxlIgogICAgICAgICB9CiAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGlsbV9saXN0ICRwYXJ0XSA9PSAtMX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscmVidWRnZXRfYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrIHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkcGFydCAkdmFycygkdmFycygkcGFydCkscmVidWRnZXRfYXNzZW1ibGVfc3RlcCl9IgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9jayB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHBhcnQgY3RzfSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByZWJ1ZGdldCxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgICAgICAgc2V0IGFzc2VtYmxlX2NvbW1hbmQgImFzc2VtYmxlX2Rlc2lnbiAtY3BmX2ZpbGUgJHZhcnMoY3BmX2ZpbGUpIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIC1tbW1jX2ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVfZGVzaWduIgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX2RicyldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtZGVmX21lcmdlIC10b3BfZGVzaWduICR2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfZGJzKSIKICAgICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtZGVmX21lcmdlICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKGRlc2lnbikvJGRpci8kdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApLmVuYyIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIFxcXG4gICAtdG9wX2RpciAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kdmFycyhkZXNpZ24pICIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIFxcXG4gICAgLXRvcF9kaXIgJHZhcnMocGFydGl0aW9uX2RpcilfUFJFQ1RTLyR2YXJzKGRlc2lnbikgIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiJGFzc2VtYmxlX2NvbW1hbmQgLXRvcF9kaXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKS8kZGlyL2N0cy5lbmMgIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFycyhpbG1fbGlzdCkgJHBhcnRdID09IC0xfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxyZWJ1ZGdldF9hc3NlbWJsZV9kYnMpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9ja19kaXIgJHZhcnMoJHBhcnQscmVidWRnZXRfYXNzZW1ibGVfZGJzKSIKICAgICAgICAgICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9ja19kaXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHBhcnQvJGRpci8kdmFycygkcGFydCxyZWJ1ZGdldF9hc3NlbWJsZV9zdGVwKS5lbmMiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpX1BSRUNUUy8kcGFydC8ke3BhcnR9X3Bvc3RfZWNvLmVuYyIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwYXJ0LyRkaXIvY3RzLmVuYyIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGFzc2VtYmxlX2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGFsd2F5c19zb3VyY2VfdGNsXQoKCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICMgQWRkaXRpb25hbCB0aW1pbmcgc2V0dXAKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbiksbGF0ZW5jeV9zZGMpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZCAiZm9yZWFjaCBtb2RlIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdIHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHNldCBzZGNfZmlsZXMgXFtnZXRfY29uc3RyYWludF9tb2RlIFwkbW9kZSAtc2RjX2ZpbGVzXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHNldCBzZGNfbGlzdCBcW2NvbmNhdCBcJHNkY19maWxlcyAkdmFycygkdmFycyhkZXNpZ24pLGxhdGVuY3lfc2RjKVxdXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICB1cGRhdGVfY29uc3RyYWludF9tb2RlIC1uYW1lIFwkbW9kZSAtc2RjX2ZpbGVzIFwkc2RjX2xpc3RcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx1cGRhdGVfY29uc3RyYWludF9tb2RlICRjb21tYW5kXQogICAgICB9CgogICAgICBmb3JlYWNoIHZpZXcgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cyldIHsKICAgICAgICAgZm9yZWFjaCBwdG4gJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwdG4sJHZpZXcsbGF0ZW5jeV9zZGMpXX0gewogICAgICAgICAgICAgICBzZXQgbGF0ZW5jeSgkdmlldywkcHRuKSAkdmFycygkcHRuLCR2aWV3LGxhdGVuY3lfc2RjKQogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHB0bixsYXRlbmN5X3NkYyldfSB7CiAgICAgICAgICAgICAgIHNldCBsYXRlbmN5KCR2aWV3LCRwdG4pICR2YXJzKCRwdG4sbGF0ZW5jeV9zZGMpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBsYXRlbmN5KCR2aWV3LCRwdG4pICJub25lIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgZm9yZWFjaCB2aWV3IFtjb25jYXQgJHZhcnMoc2V0dXBfYW5hbHlzaXNfdmlld3MpICR2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpXSB7CiAgICAgICAgIGZvcmVhY2ggcHRuICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgIGlmIHskbGF0ZW5jeSgkdmlldywkcHRuKSAhPSAibm9uZSJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9wYXJ0aXRpb25fdXNlcl9jb25zdHJhaW50c19maWxlIC12aWV3ICR2aWV3IC1uYW1lICRsYXRlbmN5KCR2aWV3LCRwdG4pIC1wYXJ0aXRpb24gJHB0blxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyRjb21tYW5kICE9ICIifSB7ICAgICAgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGFydGl0aW9uX3VzZXJfY29uc3RyYWludHNfZmlsZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYgeyhbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwKSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkbW1tY19maWxlXG4iCiAgICAgIH0KICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmRlcmF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkICJwb3N0IGFzc2VtYmxlX2ZsZXhpbG0iIHBsdWctaW4gc2NyaXB0CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9mbGV4aWxtIDBdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgU3BlY2lmeSBJTE1zIGlmIGRlZmluZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7JHZhcnMoaWxtKX0gewogICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBTUEVDSUZZSU5HIElMTXNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIH0KICAgICAgICAgc2V0IGNvbW1hbmQgIiIgCiAgICAgICAgIGZvcmVhY2ggY2VsbCAkdmFycyhpbG1fbGlzdCkgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNlbGwsaWxtX2RpcildICYmIFtmaWxlIGlzZGlyZWN0b3J5ICR2YXJzKCRjZWxsLGlsbV9kaXIpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeV9pbG0gLWNlbGwgJGNlbGwgLWRpciAkdmFycygkY2VsbCxpbG1fZGlyKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IElMTSBESVJFQ1RPUlkgTUlTU0lORyBGT1IgJGNlbGwgLi4uIFNLSVBQSU5HIgogICAgICAgICAgICB9CiAgICAgICAgIH0gCiAgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzcGVjaWZ5X2lsbSAkY29tbWFuZF0KICAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXX0gewogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRUaW1pbmdDb24gLWlsbU5vblNkY0ZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldElsbU5vblNkY0NvbnN0cmFpbnRGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGxvYWRfaWxtX25vbl9zZGNfZmlsZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiMgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewojICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRDUEYgJHZhcnMoY3BmX2ZpbGUpXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9jcGYgJGNvbW1hbmRdCiMgICAgICAgICAgICBzZXQgY29tbWFuZCAiY29tbWl0Q1BGIgojICAgICAgICAgICAgaWYgeyR2YXJzKGNwZl9rZWVwX3Jvd3MpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1rZWVwUm93cyIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhjcGZfcG93ZXJfZG9tYWluKX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG93ZXJfZG9tYWluIgojICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyR2YXJzKGNwZl9pc29sYXRpb24pfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pc29sYXRpb24iCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3BmX3N0YXRlX3JldGVudGlvbil9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXN0YXRlX3JldGVudGlvbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhjcGZfbGV2ZWxfc2hpZnRlcil9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWxldmVsX3NoaWZ0ZXIiCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3BmX3Bvd2VyX3N3aXRjaCl9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvd2VyX3N3aXRjaCIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjb21taXRfY3BmICRjb21tYW5kXQojICAgICAgICAgfQojICAgICAgfQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9OT1ZVUzo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluaXRpYWxpemVfdGltaW5nICRjb21tYW5kXQogICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYgeyEkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjp1cGRhdGVfdGltaW5nIG1tbWMgXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX3RpbWluZyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgZm9yZWFjaCBuYW1lICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfcGFydGl0aW9uX3Bpbl9zdGF0dXMgLXBhcnRpdGlvbiAkbmFtZSAtcGlucyAqIC1zdGF0dXMgcGxhY2VkXG4iCiAgICAgIH0gCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGFydGl0aW9uX3Bpbl9zdGF0dXMgJGNvbW1hbmRdCgojICAgICAgc2V0IGNvbW1hbmQgImRiX2RlbGV0ZV9yb3V0ZV90cmlhbFxuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlbGV0ZV9yb3V0ZV90cmlhbCAkY29tbWFuZF0KCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV90cmlhbF9oYW5kbGVfcGFydGl0aW9uX2NvbXBsZXggdHJ1ZVxuIiAKICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIHJvdXRlX3RyaWFsX2hvbm9yX3BpbiBmYWxzZVxuIgogICAgICAgIGFwcGVuZCBjb21tYW5kICJyb3V0ZV90cmlhbFxuIgogICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyb3V0ZV90cmlhbCAkY29tbWFuZF0KICAgICAgfSBlbHNlIHsKICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX2ZlbmNlIC5cbiIgCiAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX3BpbiB7fVxuIgogICAgICAgIGFwcGVuZCBjb21tYW5kICJyb3V0ZV9lYXJseV9nbG9iYWxcbiIKICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZWFybHlfcm91dGUgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGFwcGVuZCBjb21tYW5kICJjcmVhdGVfYWN0aXZlX2xvZ2ljX3ZpZXcgLXR5cGUgZmxhdF90b3BcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInRpbWVfZGVzaWduIC1wcmVfY3RzIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4IGFzc2VtYmxlX3ByZWN0c19mbGV4aWxtXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJjbGVhcl9hY3RpdmVfbG9naWNfdmlld1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2FjdGl2ZV9sb2dpY192aWV3ICRjb21tYW5kXQoKIyAgICAgIGFwcGVuZCBjb21tYW5kICJkZXJpdmVfdGltaW5nX2J1ZGdldCAtbm9fdHJpYWxfaXBvIC1ub19jb25zdGFudF9tb2RlbFxuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcml2ZV90aW1pbmdfYnVkZ2V0ICRjb21tYW5kXQoKIyAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewojICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKIyAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAtY2VsbHZpZXcgeyR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgYnVkZ2V0fVxuIgojICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9vYV9kZXNpZ24gJHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSBidWRnZXRcbiIKIyAgICAgICAgIH0KIyAgICAgIH0gZWxzZSB7CiMgICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfZGVzaWduICR2YXJzKGRic19kaXIpL2J1ZGdldC5lbmNcbiIKIyAgICAgIH0KIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzYXZlX2Rlc2lnbixidWRnZXQgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gR0VORVJBVElORyBSRVBPUlRTXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgaWYgeyR2YXJzKHJlcG9ydF9wb3dlcil9IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLXZpZXcgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wb3dlciAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfZG9tYWlucyldICYmIFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDF9IHsKCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBWZXJpZnkgcG93ZXIgZG9tYWluCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgICAgICAgICBzZXQgY29tbWFuZCAiY2hlY2tfcG93ZXJfZG9tYWlucyAtYmluZCAtZ2Nvbm4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pc29fbmV0X3BkICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmlzb25ldHMucnB0IgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAteF9uZXRfcGQgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkueG5ldHMucnB0XG4iCgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNoZWNrX3Bvd2VyX2RvbWFpbiAkY29tbWFuZF0KCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBSdW4gQ0xQCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIGlmIHskdmFycyhydW5fY2xwKSAmJiAoW2F1dG9fZXhlY29rIGxlY10gIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJydW5fY2xwICIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNscF9vcHRpb25zKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgJHZhcnMoY2xwX29wdGlvbnMpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscnVuX2NscCAkY29tbWFuZF0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjbHBfd2FybmluZyldfSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gV0FSTklORzogVU5BQkxFIFRPIFJVTiBDTFAgLi4uIFBMRUFTRSBNQUtFIFNVUkUgSVQgSVMgSU4gWU9VUiBQQVRIIgogICAgICAgICAgICAgICBzZXQgdmFycyhjbHBfd2FybmluZykgdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgICAgc2V0IGNvbW1hbmRzICIiIAogICAgICB9CgogICAgICBpZiB7ISR2YXJzKGdlbmVyYXRlX2Zsb3dfc3RlcHMpfSB7IAogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHtcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS8kdmFycyhzdGVwKVxuIgogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICB9CgojICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIENvcHkgTWFrZWZpbGVzIGluIGNhc2UgdGhleSBnZXQgZGVsZXRlZCBkdXJpbmcgdGhlIGZsb3cgLi4uXG4iCiMgICAgICAgICBmb3JlYWNoIHBhcnQgW2NvbmNhdCAkdmFycyhkZXNpZ24pICR2YXJzKHBhcnRpdGlvbl9saXN0KV0gewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHNjcmlwdF9kaXIpLyRwYXJ0Lk1ha2VmaWxlICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRwYXJ0L01ha2VmaWxlXG4iCiMgICAgICAgICB9CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvTWFrZWZpbGUgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvTWFrZWZpbGVcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmlsZSBjb3B5IC1mb3JjZSAkdmFycyhwYXJ0aXRpb25fZGlyKS9NYWtlZmlsZS5wYXJ0aXRpb24gJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvTWFrZWZpbGUucGFydGl0aW9uXG4iCiMgICAgICB9CgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fZmxleGlsbSB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgZW52CgogICAgICBzZXQgdmFycyhzdGVwKSBmbGV4aWxtCiAgICAgIHNldCBjb21tYW5kcyAiIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycyhzdGVwKSAkdmFycyhzdGVwKVxuIgoKICAgICAgRkZfTk9WVVM6OmluaXRpYWxpemVfc3RlcCBmbGV4aWxtCgojICAgICAgaWYgeyR2YXJzKHJlcG9ydF9ydW5fdGltZSl9IHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoJHZhcnMoc3RlcCksc3RhcnRfdGltZSkgXFtjbG9jayBzZWNvbmRzXF1cbiIKIyAgICAgIH0KCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJFU1RPUklORyBERVNJR05cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgInByZSBmbGV4aWxtIiBwbHVnLWluIHNjcmlwdAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9mbGV4aWxtX3RjbF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSZXN0b3JlIHRoZSBkZXNpZ24KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBzZXQgdmFycyhpbG0pIGZhbHNlCiAgICAgIHNldCBpbG1fbGlzdCBbbGlzdF0KICAgICAgc2V0IHBhY19saXN0IFtsaXN0XQogICAgICBpZiB7JHZhcnMoZW5hYmxlX3BhYyl9IHsKICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxwYWNfbW9kZSldfSAgewogICAgICAgICAgICAgICBpZiB7JHZhcnMoJHBhcnQscGFjX21vZGUpID09ICJpbG0ifSB7CiAgICAgICAgICAgICAgICAgIGxhcHBlbmQgaWxtX2xpc3QgJHBhcnQKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgbGFwcGVuZCBwYWNfbGlzdCAkcGFydAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbGlzdCldICYmICgkdmFycyhpbG1fbGlzdCkgIT0gIiIpfSB7CiAgICAgICAgIGZvcmVhY2ggaWxtICR2YXJzKGlsbV9saXN0KSB7CiAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJGlsbV9saXN0ICRpbG1dID09IC0xKSAmJiAoW2xzZWFyY2ggJHBhY19saXN0ICRpbG1dID09IC0xKX0gewogICAgICAgICAgICAgICBsYXBwZW5kIGlsbV9saXN0ICRpbG0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgeyRpbG1fbGlzdCAhPSAiIn0gewogICAgICAgICBzZXQgdmFycyhpbG0pIHRydWUgCiAgICAgIH0KCiAgICAgICMgQkNMOiBBZGRlZCB0YWlsIG9mIHN1YnN0IG9mIHZhcnMoZGJzX2RpcikKICAgICAgIyBOb3RlIC0gRURJRkYgSGllcmFyY2hpY2FsIGZsb3cgaXMgY3VycmVudGx5IElOQ09NUEFUSUJMRSB3aXRoIEZGIGRpciBzdHJ1Y3R1cmUKICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgYXBwZWFycyB0byByZWx5IG9uIHZhcnMoZGJzX2RpcikgYWx3YXlzIGJlaW5nIHVuZGVyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKGRlc2lnbikKICAgICAgIyBUaGlzIG5lZWRzIHRvIGJlIHJlY29uY2lsZWQKICAgICAgc2V0IGRpciBbZmlsZSB0YWlsIFtzdWJzdCAkdmFycyhkYnNfZGlyKV1dCgogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnMoc2NyaXB0X2RpcikvaW5jcl92aWV3X2RlZmluaXRpb24udGNsCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldExpbWl0ZWRBY2Nlc3NGZWF0dXJlIGVuY0ZsZXhJTE0gMVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKS8kdmFycyhkYnNfZGlyKS9wcmVjdHMuZW5jL3ZpZXdEZWZpbml0aW9uLnRjbFxuIgoKICAgICAgc2V0IGN3ZCBbZXhlYyBwd2RdCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2QgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKVxuIgoKIyAgICAgIHNldCBjb21tYW5kICJyZWFkX2RiIC4gJHZhcnMoZGVzaWduKVxuIgogICAgICBzZXQgY29tbWFuZCAicmVhZF9kYiAkdmFycyhkYnNfZGlyKS9wcmVjdHMuZW5jIFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgZmxleGlsbSxyZWFkX2RiICRjb21tYW5kXQoKIyAgICAgIGlmIHsoW2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMCkgJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic291cmNlICRtbW1jX2ZpbGVcbiIKIyAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgYWx3YXlzX3NvdXJjZV90Y2xdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCAicG9zdCBmbGV4aWxtIiBwbHVnLWluIHNjcmlwdAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfZmxleGlsbSAwXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFNwZWNpZnkgSUxNcyBpZiBkZWZpbmVkCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeyR2YXJzKGlsbSl9IHsKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgU1BFQ0lGWUlORyBJTE1zXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICB9CiAgICAgICAgIHNldCBjb21tYW5kICIiIAogICAgICAgICBmb3JlYWNoIGNlbGwgJGlsbV9saXN0IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjZWxsLGlsbV9kaXIpXSAmJiBbZmlsZSBpc2RpcmVjdG9yeSAkdmFycygkY2VsbCxpbG1fZGlyKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJGNlbGwgLWRpciAkdmFycygkY2VsbCxpbG1fZGlyKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IElMTSBESVJFQ1RPUlkgTUlTU0lORyBGT1IgJGNlbGwgLi4uIFNLSVBQSU5HIgogICAgICAgICAgICB9CiAgICAgICAgIH0gCiAgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzcGVjaWZ5X2lsbSAkY29tbWFuZF0KICAKIyAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKIyAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRUaW1pbmdDb24gLWlsbU5vblNkY0ZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2lsbV9ub25fc2RjX2NvbnN0cmFpbnRzX2ZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGNvbW1hbmRdCiMgICAgICAgICB9CiMgICAgICB9CgojICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiMgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewojICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRDUEYgJHZhcnMoY3BmX2ZpbGUpXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9jcGYgJGNvbW1hbmRdCiMgICAgICAgICAgICBzZXQgY29tbWFuZCAiY29tbWl0Q1BGIgojICAgICAgICAgICAgaWYgeyR2YXJzKGNwZl9rZWVwX3Jvd3MpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1rZWVwUm93cyIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhjcGZfcG93ZXJfZG9tYWluKX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG93ZXJfZG9tYWluIgojICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyR2YXJzKGNwZl9pc29sYXRpb24pfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pc29sYXRpb24iCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3BmX3N0YXRlX3JldGVudGlvbil9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXN0YXRlX3JldGVudGlvbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhjcGZfbGV2ZWxfc2hpZnRlcil9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWxldmVsX3NoaWZ0ZXIiCiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3BmX3Bvd2VyX3N3aXRjaCl9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvd2VyX3N3aXRjaCIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjb21taXRfY3BmICRjb21tYW5kXQojICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiMgICAgICB9CgojICAgICAgc2V0IGNvbW1hbmQgW0ZGX05PVlVTOjp1cGRhdGVfdGltaW5nIG1tbWMgXQojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV90aW1pbmcgJGNvbW1hbmRdCgogICAgICAgZm9yZWFjaCBtb2RlIFtjb25jYXQgJHZhcnMoYWN0aXZlX3NldHVwX3ZpZXdzKSAkdmFycyhhY3RpdmVfaG9sZF92aWV3cyldIHsKICAgICAgICAgc2V0IGNvbW1hbmQgInVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJG1vZGUgLWlsbV9zZGNfZmlsZXMgXFtnZXRfY29uc3RyYWludF9tb2RlICRtb2RlIC1zZGNfZmlsZXNcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJjZCAkY3dkXG4iCgogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9tb2R1bGVfbW9kZWwgLWNlbGwgJHBhcnQgXFxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi10eXBlIGZsZXhJbG0gXFxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1kaXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHBhcnQvJHBhcnQuZmxleGlsbVxuIgogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X21vZHVsZV9tb2RlbCAkY29tbWFuZF0KCiAgICAgIHNldCBjb21tYW5kICJjb21taXRfbW9kdWxlX21vZGVsXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjb21taXRfbW9kdWxlX21vZGVsICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgIiIgCiAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0TW9kdWxlVmlldyAtcGFydGl0aW9uICRwYXJ0IC10eXBlIGludGVyZmFjZVxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfbW9kdWxlX3ZpZXcgJGNvbW1hbmRdCgogICAgICBzZXQgY29tbWFuZCAiZ2V0TW9kdWxlVmlld1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZ2V0X21vZHVsZV92aWV3ICRjb21tYW5kXQoKICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfTk9WVVM6OmRlcmF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICIiCiMgICAgICAgICBmb3JlYWNoIG1vZGUgJHZhcnMoY29uc3RyYWludF9tb2RlcykgewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJG1vZGUgLXNkY19maWxlcyBcIiR2YXJzKCRtb2RlLHByZV9jdHNfc2RjKVwiXG4iICAgCiMgICAgICAgICB9CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgI3NldF9hbmFseXNpc192aWV3IC1zZXR1cCBbYWxsX3NldHVwX2FuYWx5c2lzX3ZpZXdzXSAtaG9sZCBbYWxsX2hvbGRfYW5hbHlzaXNfdmlld3NdCiAgICAgICNwdXRzICI8RkY+IFNFVFVQIC0+IFthbGxfc2V0dXBfYW5hbHlzaXNfdmlld3NdIiAKICAgICAgI3B1dHMgIjxGRj4gSE9MRCAtPiBbYWxsX2hvbGRfYW5hbHlzaXNfdmlld3NdIiAKCiAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfYWN0aXZlX2xvZ2ljX3ZpZXcgLXR5cGUgdG9wX2NyaXRpY2FsIC1wcmVfY3RzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjcmVhdGVfYWN0aXZlX2xvZ2ljX3ZpZXcgJGNvbW1hbmRdCiAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgb3B0X2hpZXJfb3B0X3N0YWdlIHByZV9jdHNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9oaWVyX21vZGUgJGNvbW1hbmRdCiMgICAgICBzZXQgY29tbWFuZCAic2V0T3B0TW9kZSAtYWRkSW5zdGFuY2VQcmVGaXggRmxleElMTUlfIC1hZGROZXRQcmVGaXggRmxleElMTU5fXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X29wdF9tb2RlICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX2ZsZXhpbG1fdGNsIDBdCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGZvcmVhY2ggcGFydCAkcGFjX2xpc3QgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IGhpbnN0IFxbZGJISW5zdE5hbWUgXFtkYkNlbGxISW5zdCBcW2RiR2V0Q2VsbEJ5TmFtZSAkcGFydFxdXF1cXVxuIgogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscGFjX21vZGUpXX0gewogICAgICAgICAgICBpZiB7JHZhcnMoJHBhcnQscGFjX21vZGUpID09ICJyZWFkX29ubHkifSB7IHNldCB2YXJzKCRwYXJ0LHBhY19tb2RlKSAicmVhZE9ubHkiIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldE1vZHVsZVZpZXcgLWhpbnN0IFwkaGluc3QgLXR5cGUgJHZhcnMoJHBhcnQscGFjX21vZGUpXG4iCiAgICAgICAgIH0gCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kICJnZXRNb2R1bGVWaWV3XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfbW9kdWxlX3ZpZXcgJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIEZMRVhJTE0gT1BUSU1JWkFUSU9OXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CiAgICAgIHNldCBjb21tYW5kICJvcHRfZGVzaWduIC1wcmVfY3RzIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpIC1yZXBvcnRfcHJlZml4IGZsZXhpbG1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLG9wdF9kZXNpZ24gJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X2ZsZXhpbG1fdGNsIDBdCgogICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIndyaXRlX2RiIC1vYV9saWJfY2VsbF92aWV3IHskdmFycyhvYV9kZXNpZ25fbGliKSAkdmFycyhkZXNpZ24pIGZsZXhpbG19XG4iCiAgICAgICAgIH0gCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAkdmFycyhkYnNfZGlyKS9mbGV4aWxtLmVuY1xuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzYXZlX2RicyAkY29tbWFuZF0KCiAgICAgIHNldCBjb21tYW5kICJjbGVhcl9hY3RpdmVfbG9naWNfdmlld1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY2xlYXJfYWN0aXZlX2xvZ2ljX3ZpZXcgJGNvbW1hbmRdCgogICAgICBzZXQgY29tbWFuZCAidXBkYXRlX3BhcnRpdGlvbiAtZmxleF9pbG1fZWNvIFxcXG4iCiAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgeyAKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAtZ29sZGVuX2Jsb2NrX2RpciAkdmFycyhwYXJ0aXRpb25fZGlyKS8kcGFydC8kdmFycyhkYnNfZGlyKS9wcmVjdHMuZW5jIFxcXG4iCiAgICAgIH0gCiAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgLWZsZXhfaWxtX2RpciAkdmFycyhwYXJ0aXRpb25fZGlyKV9GTEVYSUxNXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx1cGRhdGVfcGFydGl0aW9uICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgInJlcG9ydF9yZXNvdXJjZSAtZW5kIG9wdF9mbGV4SWxtXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZXBvcnRfcmVzb3VyY2UgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gR0VORVJBVElORyBSRVBPUlRTXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgaWYgeyR2YXJzKHJlcG9ydF9wb3dlcil9IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLXZpZXcgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wb3dlciAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfZG9tYWlucyldICYmIFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDF9IHsKCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBWZXJpZnkgcG93ZXIgZG9tYWluCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgICAgICAgICBzZXQgY29tbWFuZCAiY2hlY2tfcG93ZXJfZG9tYWlucyAtYmluZCAtZ2Nvbm4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pc29fbmV0X3BkICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmlzb25ldHMucnB0IgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAteF9uZXRfcGQgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkueG5ldHMucnB0XG4iCgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNoZWNrX3Bvd2VyX2RvbWFpbnMgJGNvbW1hbmRdCgogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgUnVuIENMUAogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICBpZiB7JHZhcnMocnVuX2NscCkgJiYgKFthdXRvX2V4ZWNvayBsZWNdICE9ICIiKX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAicnVuX2NscCAiCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbHBfb3B0aW9ucyldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICR2YXJzKGNscF9vcHRpb25zKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJ1bl9jbHAgJGNvbW1hbmRdCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY2xwX3dhcm5pbmcpXX0gewogICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IFVOQUJMRSBUTyBSVU4gQ0xQIC4uLiBQTEVBU0UgTUFLRSBTVVJFIElUIElTIElOIFlPVVIgUEFUSCIKICAgICAgICAgICAgICAgc2V0IHZhcnMoY2xwX3dhcm5pbmcpIHRydWUKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgeyEkdmFycyhjb2RlZ2VuKX0gewogICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgICAgIHNldCBjb21tYW5kcyAiIiAKICAgICAgfQoKIyAgICAgIGlmIHskdmFycyhtYWtlZmlsZSl9IHsgCiAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2luZm8gZXhpc3RzIGVudihWUEFUSClcXX0ge1xuIgogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgb3AgXFtvcGVuICRlbnYoVlBBVEgpL2ZsZXhpbG0gd1xdXG4iCiAgICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcJG9wIFwic2V0IHZhcnMoJHBhcnQsY2R0dikgXCQ6OlJkYV9DRFRWOjppbG1EYXRhSW5mbygkcGFydCxibG9ja0RpcilcIlxuIgogICAgICAgICAgfQogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjbG9zZSBcJG9wXG4iCiMgICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiMgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRwYXJ0L01ha2VmaWxlICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRwYXJ0Lk1ha2VmaWxlXG4iCiMgICAgICAgICAgfQoKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS8kdmFycyhzdGVwKVxuIgogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiMgICAgICAgfQoKCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9wYXJ0aXRpb25fcGxhY2Uge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IHZhcnMoc3RlcCkgcGFydGl0aW9uX3BsYWNlCiAgICAgIHNldCB2YXJzKGhpZXIpIHRydWUKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsc2V0dXApXX0gewogICAgICAgICBzZXQgdG1wX3RpbWVfZGVzaWduX29wdGlvbnNfc2V0dXAgJHZhcnModGltZV9kZXNpZ25fb3B0aW9ucyxzZXR1cCkKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnModGltZV9kZXNpZ25fb3B0aW9ucyxzZXR1cCkgIiIKICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmRzICIiCgoKICAgICAgaWYgeyEkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAjIEluaXRpYWxpc2UgdGhlIGRlc2lnbiBpZiBub3QgdXNpbmcgZmxleG1vZGVscyAKICAgICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsgCiAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6cnVuX2luaXQgJGZvcm1hdF0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgIEZGX05PVlVTOjpydW5faW5pdCAkZm9ybWF0CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7JHZhcnModXNlX3Byb3RvX25ldF9kZWxheV9tb2RlbCkgfSB7CiAgICAgICAgIGlmIHshJHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJjYXRjaCB7ZXhlYyBybSAtcmYgcHJvdG9fbW9kZWxfQkFDS1VQfVxuY2F0Y2gge2V4ZWMgbXYgLWYgcHJvdG9fbW9kZWwgcHJvdG9fbW9kZWxfQkFDS1VQfVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscHJvdG9fbW9kZWxfQkFDS1VQICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAiY3JlYXRlX3Byb3RvX25ldF9kZWxheV9tb2RlbFxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX3BzX3Blcl9taWNyb25fbW9kZWwgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVfZGVzaWduIC1wcm90byAtcHJlX3BsYWNlIC1yZXBvcnRfcHJlZml4IHByZXBsYWNlIC1yZXBvcnRfZGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0aW1lX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVfZGVzaWduIC1wcmVfcGxhY2UgLXJlcG9ydF9wcmVmaXggcHJlcGxhY2UgLXJlcG9ydF9kaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRpbWVfZGVzaWduICRjb21tYW5kXQogICAgICB9CiAgICAgCiAgICAgIGlmIHskdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInJlcG9ydF9wcm90b19tb2RlbHMgLWNyZWF0ZWRcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wcm90b19tb2RlbHMgJGNvbW1hbmRdCiAgICAgIH0KICAgICAgCiAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfZGIgLW9hX2xpYl9jZWxsX3ZpZXcgeyR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgaW5pdH1cbiIKICAgICAgICAgfSAKICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgeyR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UifSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAkdmFycyhkYnNfZGlyKS9pbml0LmVuYyBcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgfQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2F2ZV9kZXNpZ24saW5pdCAkY29tbWFuZF0KCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICMgQWRkaXRpb25hbCB0aW1pbmcgc2V0dXAKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbiksbGF0ZW5jeV9zZGMpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZCAiZm9yZWFjaCBtb2RlIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXMgLWFjdGl2ZVxdIHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHNldCBzZGNfZmlsZXMgXFtnZXRfY29uc3RyYWludF9tb2RlIFwkbW9kZSAtc2RjX2ZpbGVzXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHNldCBzZGNfbGlzdCBcW2NvbmNhdCBcJHNkY19maWxlcyAkdmFycygkdmFycyhkZXNpZ24pLGxhdGVuY3lfc2RjKVxdXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICB1cGRhdGVfY29uc3RyYWludF9tb2RlIC1uYW1lIFwkbW9kZSAtc2RjX2ZpbGVzIFwkc2RjX2xpc3RcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx1cGRhdGVfY29uc3RyYWludF9tb2RlICRjb21tYW5kXQogICAgICB9CgogICAgICBmb3JlYWNoIHZpZXcgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cyldIHsKICAgICAgICAgZm9yZWFjaCBwdG4gJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwdG4sJHZpZXcsbGF0ZW5jeV9zZGMpXX0gewogICAgICAgICAgICAgICBzZXQgbGF0ZW5jeSgkdmlldywkcHRuKSAkdmFycygkcHRuLCR2aWV3LGxhdGVuY3lfc2RjKQogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHB0bixsYXRlbmN5X3NkYyldfSB7CiAgICAgICAgICAgICAgIHNldCBsYXRlbmN5KCR2aWV3LCRwdG4pICR2YXJzKCRwdG4sbGF0ZW5jeV9zZGMpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBsYXRlbmN5KCR2aWV3LCRwdG4pICJub25lIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgZm9yZWFjaCB2aWV3IFtjb25jYXQgJHZhcnMoc2V0dXBfYW5hbHlzaXNfdmlld3MpICR2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpXSB7CiAgICAgICAgIGZvcmVhY2ggcHRuICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgIGlmIHskbGF0ZW5jeSgkdmlldywkcHRuKSAhPSAibm9uZSJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9wYXJ0aXRpb25fdXNlcl9jb25zdHJhaW50c19maWxlIC12aWV3ICR2aWV3IC1uYW1lICRsYXRlbmN5KCR2aWV3LCRwdG4pIC1wYXJ0aXRpb24gJHB0blxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyRjb21tYW5kICE9ICIifSB7ICAgICAgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGFydGl0aW9uX3VzZXJfY29uc3RyYWludHNfZmlsZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyBJbnNlcnQgZmVlZHRocm91Z2ggYW5kIHRyaWFsIHJvdXRlLCBhcyBhcHByb3ByaWF0ZQogICAgICBzZXQgZG9fdHJpYWxfcm91dGVfdGltZV9kZXNpZ24gMQoKICAgICAgIyBQcmUtcGxhY2VtZW50CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwbGFjZSxzZXRfcGxhY2VfbW9kZSxza2lwKV19IHsKICAgICAgICAgc2V0IGNhY2hlX3NraXBfcGxhY2VfbW9kZSAkdmFycyhwbGFjZSxzZXRfcGxhY2VfbW9kZSxza2lwKQogICAgICB9CiAgICAgIHNldCB2YXJzKHBsYWNlLHNldF9wbGFjZV9tb2RlLHNraXApIDEKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBsYWNlLHBsYWNlX2Rlc2lnbixza2lwKV19IHsKICAgICAgICAgc2V0IGNhY2hlX3NraXBfcGxhY2VfZGVzaWduICR2YXJzKHBsYWNlLHBsYWNlX2Rlc2lnbixza2lwKQogICAgICB9CiAgICAgIHNldCB2YXJzKHBsYWNlLHBsYWNlX2Rlc2lnbixza2lwKSAxCgogICAgICBzZXQgdmFycyhoaWVyX2Nhc2UpICIkdmFycyh1c2VfZmxleG1vZGVscykkdmFycyhwbGFjZW1lbnRfYmFzZWRfcHRuKSR2YXJzKGFidXR0ZWRfZGVzaWduKSR2YXJzKGluc2VydF9mZWVkdGhyb3VnaCkiCgogICAgICAjIERpc2FibGUgc2NhbiByZW9yZGVyIGZvciBwYXJ0aXRpb25pbmcgZmxvdwogICAgICAjIHNldCBjb21tYW5kICJzZXRfZGIgcGxhY2VfcmVvcmRlcl9zY2FuIGZhbHNlXG4iCiAgICAgICMgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmQgImlmIHtcW2dldF9kYiBoaW5zdHMgLnBhcnRpdGlvbi5jbG9uZXNcXSAhPSBcIlwifSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIgICBhbGlnbl9wYXJ0aXRpb25fY2xvbmVzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxhbGlnbl9wYXJ0aXRpb25fY2xvbmVzICRjb21tYW5kXQoKICAgICAgc3dpdGNoICR2YXJzKGhpZXJfY2FzZSkgewogICAgICAgICAiMDAwMCIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGRlc2lnbl91c2VfdHVyYm9fbnJncl9mbG93IHRydWVcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiMDAwMSIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGRlc2lnbl91c2VfdHVyYm9fbnJncl9mbG93IHRydWVcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0b1xuc2V0X2RiIHBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWVcbnNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAiMDAxMCIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGRlc2lnbl91c2VfdHVyYm9fbnJncl9mbG93IHRydWVcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0b1xuc2V0X2RiIHBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWVcbnNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAiMDAxMSIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGRlc2lnbl91c2VfdHVyYm9fbnJncl9mbG93IHRydWVcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0b1xuc2V0X2RiIHBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWVcbnNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAiMDEwMCIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGRlc2lnbl91c2VfdHVyYm9fbnJncl9mbG93IHRydWVcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0b1xuc2V0X2RiIHBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWVcbnNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG5zZXRfZGIgcGxhY2VfZGVzaWduX2Zsb29ycGxhbl9tb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIwMTAxIiB7CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfbnJncil9IHsKIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgZGVzaWduX3VzZV90dXJib19ucmdyX2Zsb3cgdHJ1ZVxuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9kZXNpZ25fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvXG5zZXRfZGIgcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgdHJ1ZVxuc2V0X2RiIHBsYWNlX2dsb2JhbF9wbGFjZV9pb19waW5zIHRydWVcbnNldF9kYiBwbGFjZV9kZXNpZ25fZmxvb3JwbGFuX21vZGUgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgIjAxMTAiIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9ucmdyKX0gewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBkZXNpZ25fdXNlX3R1cmJvX25yZ3JfZmxvdyB0cnVlXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Rlc2lnbl9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcGxhY2VfZ2xvYmFsX2NvbmdfZWZmb3J0IGF1dG9cbnNldF9kYiBwbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlXG5zZXRfZGIgcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMgdHJ1ZVxuc2V0X2RiIHBsYWNlX2Rlc2lnbl9mbG9vcnBsYW5fbW9kZSB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAiMDExMSIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGRlc2lnbl91c2VfdHVyYm9fbnJncl9mbG93IHRydWVcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0b1xuc2V0X2RiIHBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWVcbnNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG5zZXRfZGIgcGxhY2VfZGVzaWduX2Zsb29ycGxhbl9tb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgIAogICAgICAgICAiMTAwMCIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvXG5zZXRfZGIgcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgdHJ1ZVxuc2V0X2RiIHBsYWNlX2dsb2JhbF9wbGFjZV9pb19waW5zIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBpZiB7ISR2YXJzKGZsZXhtb2RlbF9hc19wdG4pfSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlbF9waHlzaWNhbF9jb25zdHJhaW50IC10eXBlIHNvZnRfZ3VpZGVcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlIC1wbGFjZV9lZmZvcnQgZGVmYXVsdFxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcm91dGVfdHJpYWxfZmxvb3JwbGFuX21vZGUgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX3RyaWFsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgIjEwMDEiIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0b1xuc2V0X2RiIHBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWVcbnNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgaWYgeyEkdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAtdHlwZSBzb2Z0X2d1aWRlXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wcm90b19tb2RlbF9waHlzaWNhbF9jb25zdHJhaW50ICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fbW9kZSAtcGxhY2VfZWZmb3J0IGRlZmF1bHRcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wcm90b19tb2RlICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHJvdXRlX3RyaWFsX2Zsb29ycGxhbl9tb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV90cmlhbF9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIxMDEwIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcGxhY2VfZ2xvYmFsX2NvbmdfZWZmb3J0IGF1dG9cbnNldF9kYiBwbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlXG5zZXRfZGIgcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIGlmIHshJHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgLXR5cGUgc29mdF9ndWlkZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGUgLXBsYWNlX2VmZm9ydCBkZWZhdWx0XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV90cmlhbF9mbG9vcnBsYW5fbW9kZSB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfdHJpYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAiMTAxMSIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvXG5zZXRfZGIgcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgdHJ1ZVxuc2V0X2RiIHBsYWNlX2dsb2JhbF9wbGFjZV9pb19waW5zIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBpZiB7ISR2YXJzKGZsZXhtb2RlbF9hc19wdG4pfSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlbF9waHlzaWNhbF9jb25zdHJhaW50IC10eXBlIHNvZnRfZ3VpZGVcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlIC1wbGFjZV9lZmZvcnQgZGVmYXVsdFxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcm91dGVfdHJpYWxfZmxvb3JwbGFuX21vZGUgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX3RyaWFsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgIjExMDAiIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0b1xuc2V0X2RiIHBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWVcbnNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG5zZXRfZGIgcGxhY2VfZGVzaWduX2Zsb29ycGxhbl9tb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBpZiB7ISR2YXJzKGZsZXhtb2RlbF9hc19wdG4pfSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlbF9waHlzaWNhbF9jb25zdHJhaW50IC10eXBlIHNvZnRfZ3VpZGVcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiMTEwMSIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvXG5zZXRfZGIgcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgdHJ1ZVxuc2V0X2RiIHBsYWNlX2dsb2JhbF9wbGFjZV9pb19waW5zIHRydWVcbnNldF9kYiBwbGFjZV9kZXNpZ25fZmxvb3JwbGFuX21vZGUgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIGlmIHshJHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgLXR5cGUgc29mdF9ndWlkZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICIxMTEwIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcGxhY2VfZ2xvYmFsX2NvbmdfZWZmb3J0IGF1dG9cbnNldF9kYiBwbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlXG5zZXRfZGIgcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMgdHJ1ZVxuc2V0X2RiIHBsYWNlX2Rlc2lnbl9mbG9vcnBsYW5fbW9kZSB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgaWYgeyEkdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAtdHlwZSBzb2Z0X2d1aWRlXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV90cmlhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgIjExMTEiIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBwbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0b1xuc2V0X2RiIHBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWVcbnNldF9kYiBwbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG5zZXRfZGIgcGxhY2VfZGVzaWduX2Zsb29ycGxhbl9tb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBpZiB7ISR2YXJzKGZsZXhtb2RlbF9hc19wdG4pfSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlbF9waHlzaWNhbF9jb25zdHJhaW50IC10eXBlIHNvZnRfZ3VpZGVcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7JHZhcnModXNlX3Byb3RvX25ldF9kZWxheV9tb2RlbCl9IHsgIAogICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGUgLXRpbWluZ19uZXRfZGVsYXlfbW9kZWwgdXNlX2FjdHVhbF93aXJlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWwgJGNvbW1hbmRdIAogICAgICB9CgogICAgICAjIFBsYWNlIGRlc2lnbiAKICAKICAgICAgc2V0IHNhdmUgJHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7IAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjpydW5fcGxhY2UgJGZvcm1hdF0KICAgICAgfSBlbHNlIHsKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcyAKICAgICAgICAgRkZfTk9WVVM6OnJ1bl9wbGFjZSAkZm9ybWF0CiAgICAgICAgIHNldCBjb21tYW5kcyAiIgogICAgICB9CiAgICAgIHNldCB2YXJzKHBsYWNlX29wdF9kZXNpZ24pICRzYXZlCiAgICAgCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgY2FjaGVfc2tpcF9wbGFjZV9tb2RlXX0geyAKICAgICAgICAgc2V0IHZhcnMocGxhY2Usc2V0X3BsYWNlX21vZGUsc2tpcCkgJGNhY2hlX3NraXBfcGxhY2VfbW9kZQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgdmFycyhwbGFjZSxzZXRfcGxhY2VfbW9kZSxza2lwKSBmYWxzZQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgY2FjaGVfc2tpcF9wbGFjZV9tb2RlXX0geyAKICAgICAgICAgc2V0IHZhcnMocGxhY2UscGxhY2VfZGVzaWduLHNraXApICRjYWNoZV9za2lwX3BsYWNlX2Rlc2lnbgogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgdmFycyhwbGFjZSxwbGFjZV9kZXNpZ24sc2tpcCkgZmFsc2UKICAgICAgfQoKICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAtb2FfbGliX2NlbGxfdmlldyB7JHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSBwbGFjZX1cbiIKICAgICAgICAgfSAKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgIndyaXRlX2RiICR2YXJzKGRic19kaXIpL3BsYWNlLmVuYyBcbiIKICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2F2ZV9kZXNpZ24gJGNvbW1hbmRdCiAgIAogICAgICAjIFBvc3QtcGxhY2VtZW50CiAgICAgIHN3aXRjaCAkdmFycyhoaWVyX2Nhc2UpIHsKICAgICAgICAgIjAwMDAiIHsKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHJvdXRlX3RyaWFsX2hhbmRsZV9wYXJ0aXRpb25fY29tcGxleCB0cnVlXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV90cmlhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJyb3V0ZV90cmlhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyb3V0ZV90cmlhbCAkY29tbWFuZF0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHJvdXRlX2Vhcmx5X2dsb2JhbF9ob25vcl9wYXJ0aXRpb25fZmVuY2UgLlxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICIwMDAxIiB7CiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX3RyaWFsXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJvdXRlX3RyaWFsXzEgJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFkZF9wYXJ0aXRpb25fZmVlZHRocnVzIC1yb3V0ZV9iYXNlZCAtd3JpdGVfdG9wb2xvZ2ljYWxfZmlsZSB0b3BvLnR4dCAtbmV0X21hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZV9idWZmZXJcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHJvdXRlX3RyaWFsX2hhbmRsZV9wYXJ0aXRpb25fY29tcGxleCB0cnVlXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV90cmlhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJyb3V0ZV90cmlhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyb3V0ZV90cmlhbF8yICRjb21tYW5kXQogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZV8xICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJhZGRfcGFydGl0aW9uX2ZlZWR0aHJ1cyAtcm91dGVfYmFzZWQgLXdyaXRlX3RvcG9sb2dpY2FsX2ZpbGUgdG9wby50eHQgLW5ldF9tYXBwaW5nIG5ldG1hcHBpbmcudHh0IC1kb3VibGVfYnVmZmVyXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluc2VydF9wdG5fZmVlZHRocm91Z2ggJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX2ZlbmNlIC5cbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZV8yICRjb21tYW5kXQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiMDAxMCIgewogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcm91dGVfdHJpYWxfaGFuZGxlX3BhcnRpdGlvbl9jb21wbGV4IHRydWVcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX3RyaWFsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX3RyaWFsXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJvdXRlX3RyaWFsICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcm91dGVfZWFybHlfZ2xvYmFsX2hvbm9yX3BhcnRpdGlvbl9mZW5jZSAuXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJyb3V0ZV9lYXJseV9nbG9iYWxcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZWFybHlfcm91dGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiMDAxMSIgewogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJyb3V0ZV90cmlhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyb3V0ZV90cmlhbF8xICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJhZGRfcGFydGl0aW9uX2ZlZWR0aHJ1cyAtcm91dGVfYmFzZWQgLXdyaXRlX3RvcG9sb2dpY2FsX2ZpbGUgdG9wby50eHQgLW5ldF9tYXBwaW5nIG5ldG1hcHBpbmcudHh0IC1kb3VibGVfYnVmZmVyXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluc2VydF9wdG5fZmVlZHRocm91Z2ggJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV90cmlhbF9oYW5kbGVfcGFydGl0aW9uX2NvbXBsZXggdHJ1ZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfdHJpYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicm91dGVfdHJpYWxcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscm91dGVfdHJpYWxfMiAkY29tbWFuZF0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicm91dGVfZWFybHlfZ2xvYmFsXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X3JvdXRlXzEgJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFkZF9wYXJ0aXRpb25fZmVlZHRocnVzIC1yb3V0ZV9iYXNlZCAtd3JpdGVfdG9wb2xvZ2ljYWxfZmlsZSB0b3BvLnR4dCAtbmV0X21hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZV9idWZmZXJcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIHJvdXRlX2Vhcmx5X2dsb2JhbF9ob25vcl9wYXJ0aXRpb25fZmVuY2UgLlxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfdHJpYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicm91dGVfZWFybHlfZ2xvYmFsXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X3JvdXRlXzIgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiMDEwMCIgewogICAgICAgICB9CiAgICAgICAgICIwMTAxIiB7CiAgICAgICAgIH0KICAgICAgICAgIjAxMTAiIHsKICAgICAgICAgfQogICAgICAgICAiMDExMSIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiYWRkX3BhcnRpdGlvbl9mZWVkdGhydXMgLXdyaXRlX3RvcG9sb2dpY2FsX2ZpbGUgdG9wby50eHQgLW5ldF9tYXBwaW5nIG5ldG1hcHBpbmcudHh0IC1kb3VibGVfYnVmZmVyXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbnNlcnRfcHRuX2ZlZWR0aHJvdWdoICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIxMDAwIiB7CiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV90cmlhbF9oYW5kbGVfcGFydGl0aW9uX2NvbXBsZXggdHJ1ZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfdHJpYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicm91dGVfdHJpYWxcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscm91dGVfdHJpYWwgJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX2ZlbmNlIC5cbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyb3V0ZV9lYXJseSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICIxMDAxIiB7CiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX3RyaWFsXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJvdXRlX3RyaWFsICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJhZGRfcGFydGl0aW9uX2ZlZWR0aHJ1cyAtcm91dGVfYmFzZWQgLXdyaXRlX3RvcG9sb2dpY2FsX2ZpbGUgdG9wby50eHQgLW5ldF9tYXBwaW5nIG5ldG1hcHBpbmcudHh0IC1kb3VibGVfYnVmZmVyXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluc2VydF9wdG5fZmVlZHRocm91Z2ggJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV90cmlhbF9oYW5kbGVfcGFydGl0aW9uX2NvbXBsZXggdHJ1ZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfdHJpYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicm91dGVfdHJpYWxcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscm91dGVfdHJpYWwgJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZV8xICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJhZGRfcGFydGl0aW9uX2ZlZWR0aHJ1cyAtcm91dGVfYmFzZWQgLXdyaXRlX3RvcG9sb2dpY2FsX2ZpbGUgdG9wby50eHQgLW5ldF9tYXBwaW5nIG5ldG1hcHBpbmcudHh0IC1kb3VibGVfYnVmZmVyXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluc2VydF9wdG5fZmVlZHRocm91Z2ggJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX2ZlbmNlIC5cbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX19tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJyb3V0ZV9lYXJseV9nbG9iYWxcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZWFybHlfcm91dGVfMiAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICIxMDEwIiB7CiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV90cmlhbF9oYW5kbGVfcGFydGl0aW9uX2NvbXBsZXggdHJ1ZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfdHJpYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicm91dGVfdHJpYWxcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscm91dGVfdHJpYWwgJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX2ZlbmNlIC5cbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX2Vhcmx5X2dsb2JhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAKICAgICAgICAgfQogICAgICAgICAiMTAxMSIgewogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJyb3V0ZV90cmlhbFxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyb3V0ZV90cmlhbCAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiYWRkX3BhcnRpdGlvbl9mZWVkdGhydXMgLXJvdXRlX2Jhc2VkIC13cml0ZV90b3BvbG9naWNhbF9maWxlIHRvcG8udHh0IC1uZXRfbWFwcGluZyBuZXRtYXBwaW5nLnR4dCAtZG91YmxlX2J1ZmZlclxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbnNlcnRfcHRuX2ZlZWR0aHJvdWdoICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcm91dGVfdHJpYWxfaGFuZGxlX3BhcnRpdGlvbl9jb21wbGV4IHRydWVcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX3RyaWFsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJvdXRlX3RyaWFsXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJvdXRlX3RyaWFsICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJyb3V0ZV9lYXJseV9nbG9iYWxcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZWFybHlfcm91dGVfMSAkY29tbWFuZF0KICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiYWRkX3BhcnRpdGlvbl9mZWVkdGhydXMgLXJvdXRlX2Jhc2VkIC13cml0ZV90b3BvbG9naWNhbF9maWxlIHRvcG8udHh0IC1uZXRfbWFwcGluZyBuZXRtYXBwaW5nLnR4dCAtZG91YmxlX2J1ZmZlclxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbnNlcnRfcHRuX2ZlZWR0aHJvdWdoICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfZGIgcm91dGVfZWFybHlfZ2xvYmFsX2hvbm9yX3BhcnRpdGlvbl9mZW5jZSAuXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV90cmlhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgIHNldCBjb21tYW5kICJyb3V0ZV9lYXJseV9nbG9iYWxcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscm91dGVfZWFybHlfMiAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICIxMTAwIiB7CiAgICAgICAgIH0KICAgICAgICAgIjExMDEiIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFkZF9wYXJ0aXRpb25fZmVlZHRocnVzIC13cml0ZV90b3BvbG9naWNhbF9maWxlIHRvcG8udHh0IC1uZXRfbWFwcGluZyBuZXRtYXBwaW5nLnR4dCAtZG91YmxlX2J1ZmZlclxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAiMTExMCIgewogICAgICAgICAgICBzZXQgZG9fcm91dGVfdHJpYWxfdGltZV9kZXNpZ24gMCAgICAgICAgICAgIAogICAgICAgICB9CiAgICAgICAgICIxMTExIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJhZGRfcGFydGl0aW9uX2ZlZWR0aHJ1cyAtd3JpdGVfdG9wb2xvZ2ljYWxfZmlsZSB0b3BvLnR4dCAtbmV0X21hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZV9idWZmZXJcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluc2VydF9wdG5fZmVlZHRocm91Z2ggJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHZhcnModXNlX3Byb3RvX25ldF9kZWxheV9tb2RlbCl9IHsgCiAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVfZGVzaWduIC1wcm90byAtcHJlX2N0cyAtcmVwb3J0X3ByZWZpeCBwbGFjZSAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKVxuIgogICAgICB9IGVsc2UgewogICAgICAgIHNldCBjb21tYW5kICJ0aW1lX2Rlc2lnbiAtcHJlX2N0cyAtcmVwb3J0X3ByZWZpeCBwbGFjZSAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKVxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0aW1lX2Rlc2lnbiAkY29tbWFuZF0KCgkgICMgT3V0cHV0IG9yIHJ1biB0aGUgZ2VuZXJhdGVkIGNvbW1hbmRzCgkgIGlmIHskdmFycyhjb2RlZ2VuKX0gewoJCSByZXR1cm4gJGNvbW1hbmRzCgkgIH0gZWxzZSB7CgkJICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCgkgIH0KCiAgIH0KCiAgIHByb2MgcnVuX2Fzc2lnbl9waW4ge3tmb3JtYXQgMX19IHsKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgZW52CgogICAgICBzZXQgdmFycyhzdGVwKSBhc3NpZ25fcGluCiAgICAgIHNldCB2YXJzKGhpZXIpIHRydWUKICAgICAgc2V0IGNvbW1hbmRzICIiCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQXNzaWduIHBhcnRpdGlvbiBwaW5zIHZpYSBwbHVnLWluIGFzIHRoaXMgdGhlCiAgICAgICMgcGl0Y2gsIGRlcHRoLCBhbmQgbGF5ZXIgdmFsdWVzIGFyZSBkZXNpZ24gc3BlY2lmaWMKICAgICAgIyBBbHNvLCB2ZXJpZnkgdGhlIHBpbiBhc3NpZ25tZW50IGFuZCBmaXggdGhlbQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfYXNzaWduX3Bpbl90Y2xdCgogICAgICBzZXQgY29tbWFuZCAiYXNzaWduX3BhcnRpdGlvbl9waW5zXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxhc3NpZ25fcGFydGl0aW9uX3BpbnMgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X2Fzc2lnbl9waW5fdGNsXQoKICAgICAgc2V0IGNvbW1hbmQgImNoZWNrX3Bpbl9hc3NpZ25tZW50XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjaGVja19waW5fYXNzaWdubWVudCAkY29tbWFuZF0KCiAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfdW5hbGlnbmVkX25ldHMgLW91dF9maWxlICR2YXJzKHJwdF9kaXIpL3VuYWxpZ25lZC5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF91bmFsaWduZWRfbmV0cyAkY29tbWFuZF0KCiAgICAgIGlmIHshKFtpbmZvIGV4aXN0cyB2YXJzKHBsYWNlbWVudF9iYXNlZF9wdG4pXSAmJiAkdmFycyhwbGFjZW1lbnRfYmFzZWRfcHRuKSl9IHsKICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV90cmlhbF9oYW5kbGVfcGFydGl0aW9uX2NvbXBsZXggdHJ1ZVxuc2V0X2RiIHJvdXRlX3RyaWFsX2hvbm9yX3BpbiB0cnVlXG4iCiAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicm91dGVfdHJpYWxcbiIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX2ZlbmNlIC5cbnNldF9kYiByb3V0ZV9lYXJseV9nbG9iYWxfaG9ub3JfcGFydGl0aW9uX3BpbiAuXG4iCiAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicm91dGVfZWFybHlfZ2xvYmFsXG4iCiAgICAgICAgfQogICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyb3V0ZV90cmlhbCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9tb2RlbF9nZW4ge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IHZhcnMoc3RlcCkgbW9kZWxfZ2VuCiAgICAgIHNldCB2YXJzKGhpZXIpIHRydWUKICAgICAgc2V0IGNvbW1hbmRzICIiCgogICAgICAjIEluaXRpYWxpc2UgdGhlIGRlc2lnbgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OnJ1bl9pbml0ICRmb3JtYXRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIEZGX05PVlVTOjpydW5faW5pdCAkZm9ybWF0CiAgICAgIH0KCiAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfZGIgLW9hX2xpYl9jZWxsX3ZpZXcgeyR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgaW5pdH1cbiIKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgIndyaXRlX2RiICR2YXJzKGRic19kaXIpL2luaXQuZW5jXG4iCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzYXZlX2Rlc2lnbixpbml0ICRjb21tYW5kXQogICAgICAKCiAgICAgIGlmIHskdmFycyh1c2VfcHJvdG9fbmV0X2RlbGF5X21vZGVsKSAmJiAkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgImNhdGNoIHtleGVjIHJtIC1yZiBwcm90b19tb2RlbF9CQUNLVVB9XG5jYXRjaCB7ZXhlYyBtdiAtZiBwcm90b19tb2RlbCBwcm90b19tb2RlbF9CQUNLVVB9XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxwcm90b19tb2RlbF9CQUNLVVAgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfcHNfcGVyX21pY3Jvbl9tb2RlbFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX3BzX3Blcl9taWNyb25fbW9kZWwgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9tb2RlbF9nZW5fdGNsXQogICAgICAKICAgICAgaWYgeyR2YXJzKGVuYWJsZV9ucmdyKX0gewojICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBkZXNpZ25fdXNlX3R1cmJvX25yZ3JfZmxvdyB0cnVlXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Rlc2lnbl9tb2RlICRjb21tYW5kXQogICAgICB9CgogICAgICBzZXQgdmFycyhoaWVyX2Nhc2UpICIkdmFycyhmbGV4bW9kZWxfYXNfcHRuKSR2YXJzKGluc2VydF9mZWVkdGhyb3VnaCkiCgogICAgICBzd2l0Y2ggJHZhcnMoaGllcl9jYXNlKSB7CiAgICAgICAgICIwMCIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiaWRlbnRpZnlfcHJvdG9fbW9kZWxcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGlkZW50aWZ5X3Byb3RvX21vZGVsICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIwMSIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiaWRlbnRpZnlfcHJvdG9fbW9kZWxcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGlkZW50aWZ5X3Byb3RvX21vZGVsICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIxMCIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAgInNldF9kYiBwcm90b19jcmVhdGVfcGFydGl0aW9uX2FzX2ZsZXhtb2RlbCB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZSAkY29tbWFuZF0KIyAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmICgkdmFycyhwYXJ0aXRpb25fbGlzdCkgIT0gIiIpfSB7CiMgICAgICAgICAgICAgICBmb3JlYWNoIHB0biAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewojICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fbW9kZWwgLW1vZGVsICRwdG4gLXR5cGUgZmxleF9tb2R1bGVcbiIKIyAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGVsICRjb21tYW5kXQojICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBGbGV4bW9kZWwgcGFydGl0aW9uIGZsb3cgZW5hYmxlZCBidXQgbm8gcGFydGl0aW9ucyBhcmUgZGVmaW5lZCIKIyAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiRmxleG1vZGVsIHBhcnRpdGlvbiBmbG93IGVuYWJsZWQgYnV0IG5vIHBhcnRpdGlvbnMgYXJlIGRlZmluZWQiCiMgICAgICAgICAgICAgICBpbmNyIHZhcnMoZXJyb3JfY291bnQpCiMgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgIjExIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICAic2V0X2RiIHByb3RvX2NyZWF0ZV9wYXJ0aXRpb25fYXNfZmxleG1vZGVsIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wcm90b19tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0gJiYgKCR2YXJzKHBhcnRpdGlvbl9saXN0KSAhPSAiIil9IHsKIyAgICAgICAgICAgICAgIGZvcmVhY2ggcHRuICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiMgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlbCAtbW9kZWwgJHB0biAtdHlwZSBmbGV4X21vZHVsZVxuIgojICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWwgJGNvbW1hbmRdCiMgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IEZsZXhtb2RlbCBwYXJ0aXRpb24gZmxvdyBlbmFibGVkIGJ1dCBubyBwYXJ0aXRpb25zIGFyZSBkZWZpbmVkIgojICAgICAgICAgICAgICAgc2V0IGVycm9ycygkdmFycyhlcnJvcl9jb3VudCkpICJGbGV4bW9kZWwgcGFydGl0aW9uIGZsb3cgZW5hYmxlZCBidXQgbm8gcGFydGl0aW9ucyBhcmUgZGVmaW5lZCIKIyAgICAgICAgICAgICAgIGluY3IgdmFycyhlcnJvcl9jb3VudCkKIyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG1vZGVsX2dlbixtaW5faW5zdCldfSB7CiMgICAgICAgICBzZXQgbWluX2luc3QgJHZhcnMobW9kZWxfZ2VuLG1pbl9pbnN0KQojICAgICAgfSBlbHNlIHsKIyAgICAgICAgIHNldCBtaW5faW5zdCAxMDAwCiMgICAgICB9CiMgICAgICBzZXQgY29tbWFuZCAic2V0X2RiIGlsbV9rZWVwX2hpZ2hfZmFub3V0X3BvcnRzIGZhbHNlXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0SWxtTW9kZSAkY29tbWFuZF0KICAgICAKICAgICAgc2V0IGNvbW1hbmQgInNldF9kYiBpbG1fa2VlcF9oaWdoX2Zhbm91dF9wb3J0cyBmYWxzZVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2lsbV9tb2RlICRjb21tYW5kXQogICAgICBpZiB7JHZhcnMoZmxleG1vZGVsX2FydF9iYXNlZCl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgImNyZWF0ZV9wcm90b19tb2RlbCAtb3V0X2RpciAkdmFycyhkYnNfZGlyKS9tb2RlbF9nZW4uZW5jXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfcHJvdG9fbW9kZWwgLXBhcnRpdGlvbl9iYXNlZFxuY29tbWl0X3Byb3RvX21vZGVsXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9wcm90b19tb2RlbCAkY29tbWFuZF0KICAgICAgaWYgeyR2YXJzKGNyZWF0ZV9mbGV4ZmlsbGVyX2Jsb2NrYWdlKX0gewogICAgICAgICBzZXQgY29tbWFuZCAiY3JlYXRlX2ZsZXhmaWxsZXJfcm91dGVfYmxvY2thZ2VcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9mbGV4ZmlsbGVyX3JvdXRlX2Jsb2NrYWdlICRjb21tYW5kXQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X21vZGVsX2dlbl90Y2xdCgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX3BhcnRpdGlvbiB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgZW52CgogICAgICBzZXQgdmFycyhzdGVwKSBwYXJ0aXRpb24KICAgICAgc2V0IHZhcnMoaGllcikgdHJ1ZQoKICAgICAgc2V0IGNvbW1hbmRzICIiCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQnVkZ2V0IHRoZSBibG9ja3MgYmFzZWQgb24gdGhlIG1vZGUKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfZ2xvYmFsIHRpbWluZ19zdXBwb3J0X2hpZXJhcmNoaWNhbF9waW5fY29uc3RyYWludHMgdHJ1ZVxuIgojICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiB0YmdQcmludEV4Y2VwdGlvbkluZm9Jbkp1c3RpZnkgMVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2J1ZGdldF92YXJzICRjb21tYW5kXQoKICAgICAgaWYgeyR2YXJzKGJ1ZGdldF9tb2RlKSA9PSAicHJvdG9fbmV0X2RlbGF5X21vZGVsIiAmJiAkdmFycyh1c2VfcHJvdG9fbmV0X2RlbGF5X21vZGVsKX0gewogICAgICAgICBzZXQgY29tbWFuZCAidGltZV9kZXNpZ24gLXByb3RvIC1yZXBvcnRfcHJlZml4IGJ1ZGdldCAtcmVwb3J0X2RpciAkdmFycyhycHRfZGlyKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdGltZV9kZXNpZ24gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMgRGVmaW5lIGJ1ZGdldGluZyBvcHRpb25zIC4uLgogICAgICBzZXQgY29tbWFuZCAiIgoKICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBidWRnZXRfd3JpdGVfbGF0ZW5jeV9wZXJfY2xvY2sgdHJ1ZVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmQgImlmIHtcW2dldF9kYiBoaW5zdHMgLnBhcnRpdGlvbi5jbG9uZXNcXSAhPSBcIlwifSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIgICBzZXRfZGIgYnVkZ2V0X21lcmdlX2Nsb25lcyB0cnVlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiAgICAgIAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoYWJ1dHRlZF9kZXNpZ24pXSAmJiAkdmFycyhhYnV0dGVkX2Rlc2lnbil9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBidWRnZXRfYWJ1dHRlZCB0cnVlXG4iCiAgICAgIH0KICAgICAgCiMgICAgICBzd2l0Y2ggW3N0cmluZyB0b2xvd2VyICR2YXJzKGJ1ZGdldF9tb2RlKV0gewojICAgICAgICAgZ2lnYV9vcHQgewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBidWRnZXRfdmlydHVhbF9vcHRfZW5naW5lIGdpZ2Ffb3B0XG4iCiMgICAgICAgICB9CiMgICAgICAgICBwcm90b19uZXRfZGVsYXlfbW9kZWwgewojICAgICAgICAgICAgaWYgeyR2YXJzKHVzZV9wcm90b19uZXRfZGVsYXlfbW9kZWwpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2RiIGJ1ZGdldF92aXJ0dWFsX29wdF9lbmdpbmUgbm9uZVxuIgojICAgICAgICAgICAgfQojICAgICAgICAgfQojICAgICAgfQojICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9kYiBidWRnZXRfZW5hYmxlX210X2J1ZGdldGluZyB0cnVlXG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2J1ZGdldGluZ19tb2RlICRjb21tYW5kXQogICAgICAKICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMoYnVkZ2V0X21vZGUpXSAhPSAicHJvdG9fbmV0X2RlbGF5X21vZGVsIikgJiYgJHZhcnModXNlX3Byb3RvX25ldF9kZWxheV9tb2RlbCl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b190aW1pbmdfc2V0dGluZ3MgLXJlc2V0XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fdGltaW5nX3NldHRpbmdzICRjb21tYW5kXQogICAgICB9CiAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfdGltaW5nX2J1ZGdldCAtanVzdGlmeVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX3RpbWluZ19idWRnZXQgJGNvbW1hbmRdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUnVuIENMUAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddICYmIFtpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2RvbWFpbnMpXSAmJiBbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAxfSB7CiAgICAgICAgIGlmIHskdmFycyhydW5fY2xwKSAmJiAoW2F1dG9fZXhlY29rIGxlY10gIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJydW5fY2xwICIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNscF9vcHRpb25zKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgJHZhcnMoY2xwX29wdGlvbnMpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscnVuX2NscCAkY29tbWFuZF0KICAgICAgICAgfQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUGFydGl0aW9uIGFuZCBzYXZlIHRoZSBwYXJ0aXRpb25zIGludG8gdGhlCiAgICAgICMgZGlyZWN0b3J5IFBBUlRJVElPTgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojICAgICAgaWYgeyR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewojICAgICAgICAgc2V0IG1heF9sYXllciBbZ2V0VHJpYWxSb3V0ZU1vZGUgLW1heFJvdXRlTGF5ZXJdCiMgICAgICAgICBzZXRQbGFjZU1vZGUgLXJlc2V0CiMgICAgICAgICBzZXRUcmlhbFJvdXRlTW9kZSAtcmVzZXQKIyAgICAgICAgIHNldFRyaWFsUm91dGVNb2RlIC1tYXhSb3V0ZUxheWVyICRtYXhfbGF5ZXIKIyAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wYXJ0aXRpb25fdGNsXQoKICAgICAgc2V0IGNvbW1hbmQgImNvbW1pdF9wYXJ0aXRpb24gLWJ1aWxkX3NjYW5cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHBhcnRpdGlvbiAkY29tbWFuZF0KICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgaWYgeyhbc3RyaW5nIGNvbXBhcmUgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTApfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9wYXJ0aXRpb25zIC1wYXJ0aXRpb25fbGliICR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIC1kaXIgJHZhcnMocGFydGl0aW9uX2RpcilcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIndyaXRlX3BhcnRpdGlvbnMgLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKSAtZGVmIC1kZWZfc2NhblxuIgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9wYXJ0aXRpb25zIC1kaXIgJHZhcnMocGFydGl0aW9uX2RpcikgLWRlZiAtZGVmX3NjYW5cbiIKICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2F2ZV9wYXJ0aXRpb24gJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnModXNlX2ZsZXhtb2RlbHMpICYmICR2YXJzKGZsZXhtb2RlbF9hc19wdG4pfSB7CiMgICAgICAgICBzZXQgY29tbWFuZCAicmVwbGFjZV9wcm90b19tb2RlbCBcXFxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1wcmVfZnRfZGlyICR2YXJzKGVjb19kaXIpL3ByZV9mdCBcXFxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1wb3N0X2Z0X2RpciAkdmFycyhlY29fZGlyKS9wb3N0X2Z0IFxcXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLXB0bl9kaXIgJHZhcnMocGFydGl0aW9uX2RpcikgXFxcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtcHRuX2Z1bGxfbmV0bGlzdF9kaXIgLi90ZW1wX25ldGxpc3RfZGlyIFxcXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLW91dF9kaXIgJHZhcnMocGFydGl0aW9uX2RpcilcbiIKCiAgICAgICAgIHNldCBjb21tYW5kICJyZXBsYWNlX3Byb3RvX21vZGVsIFxcXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtcHRuX2RpciAkdmFycyhwYXJ0aXRpb25fZGlyKSBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLW91dF9kaXIgJHZhcnMocGFydGl0aW9uX2RpcilcbiIKCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZXBsYWNlX3Byb3RvX21vZGVsICRjb21tYW5kXQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3BhcnRpdGlvbl90Y2xdCgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gR0VORVJBVElORyBSRVBPUlRTXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgaWYgeyR2YXJzKHJlcG9ydF9wb3dlcil9IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLXZpZXcgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wb3dlciAkY29tbWFuZF0KICAgICAgfQogICAgICBzZXQgY29tbWFuZCAiIgoKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfZG9tYWlucyldICYmIFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDF9IHsKCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBWZXJpZnkgcG93ZXIgZG9tYWluCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgICAgICAgICBzZXQgY29tbWFuZCAiY2hlY2tfcG93ZXJfZG9tYWluIC1iaW5kIC1nY29ubiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWlzb19uZXRfcGQgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkuaXNvbmV0cy5ycHQiCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC14X25ldF9wZCAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS54bmV0cy5ycHRcbiIKCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY2hlY2tfcG93ZXJfZG9tYWluICRjb21tYW5kXQoKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAjIFJ1biBDTFAKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgaWYgeyR2YXJzKHJ1bl9jbHApICYmIChbYXV0b19leGVjb2sgbGVjXSAhPSAiIil9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJ1bl9jbHAgIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xwX29wdGlvbnMpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkdmFycyhjbHBfb3B0aW9ucykKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxydW5fY2xwICRjb21tYW5kXQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNscF93YXJuaW5nKV19IHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBVTkFCTEUgVE8gUlVOIENMUCAuLi4gUExFQVNFIE1BS0UgU1VSRSBJVCBJUyBJTiBZT1VSIFBBVEgiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNscF93YXJuaW5nKSB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KCiAgICAgIHNldCBwYXRoIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhzY3JpcHRfcGF0aCldCiAgIAogICAgICBmaWxlIG1rZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpCgogICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkdmFycyhwYXJ0aXRpb25fZGlyKS9NYWtlZmlsZS5wYXJ0aXRpb25dfSB7CiAgICAgICAgIGZpbGUgY29weSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvTWFrZWZpbGUucGFydGl0aW9uICR2YXJzKHBhcnRpdGlvbl9kaXIpCiAgICAgIH0KICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHBhcnRpdGlvbl9kaXIpL01ha2VmaWxlIHddCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIGVudihWUEFUSCldfSB7CiAgICAgICAgIHNldCBlbnYoVlBBVEgpICJtYWtlIgogICAgICB9CiAgICAgIHB1dHMgJG9wICJWUEFUSD0kZW52KFZQQVRIKSIKICAgICAgcHV0cyAkb3AgIkJMT0NLUyA9ICR2YXJzKHBhcnRpdGlvbl9saXN0KSIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgImluY2x1ZGUgTWFrZWZpbGUucGFydGl0aW9uIgogICAgICBjbG9zZSAkb3AKICAgCiAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyB2YXJzXSB7CiAgICAgICAgIHNldCBzdmFycygkdmFyKSAkdmFycygkdmFyKQogICAgICB9CiAgICAgIHNldCB2YXJzKG1vZGUpIGZsYXQKIyAgICAgIHNldCB2YXJzKGhpZXIpIHRydWUKICAgICAgc2V0IGxpbmsgW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9yb290KV0KICAgICAgZm9yZWFjaCBibG9jayBbY29uY2F0ICR2YXJzKGRlc2lnbikgJHZhcnMocGFydGl0aW9uX2xpc3QpXSB7CiAgICAgICAgIGV4ZWMgbWtkaXIgLXAgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrCiMgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzIC5mZi50Y2xdfSB7CiMgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlIC5mZi50Y2wgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrCiMgICAgICAgICB9CiAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrL01ha2VmaWxlXX0gewogICAgICAgICAgICBmaWxlIGRlbGV0ZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svTWFrZWZpbGUKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGJsb2NrLGlubm92dXNfY29uZmlnX3RjbCldICYmIFtmaWxlIGV4aXN0cyAkdmFycygkYmxvY2ssaW5ub3Z1c19jb25maWdfdGNsKV19IHsKICAgICAgICAgICAgcHV0cyAiPEZGPiBTb3VyY2luZyAkdmFycygkYmxvY2ssaW5ub3Z1c19jb25maWdfdGNsKSIKICAgICAgICAgICAgc291cmNlICR2YXJzKCRibG9jayxpbm5vdnVzX2NvbmZpZ190Y2wpCiAgICAgICAgIH0gCiAgICAgICAgIHNldCBjd2QgW3B3ZF0KICAgICAgICAKICAgICAgICAgaWYgeyhbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwKSAgJiYgKFtzdHJpbmcgY29tcGFyZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MCl9IHsKICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyBjZHMubGliXX0gewogICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gY2RzLmxpYiByXQogICAgICAgICAgICAgICBzZXQgaSAwIAogICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjZHNfbGliKCRpKSAkbGluZQogICAgICAgICAgICAgICAgICBpbmNyIGkKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBjbG9zZSAkaXAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBFUlJPUjogQSBjZHMubGliIGZpbGUgaXMgcmVxdWlyZWQgZm9yIG9wZW4gYWNjZXNzIGZsb3dzIC4uLiIKICAgICAgICAgICAgfQogICAgICAgICB9IAogICAgICAgICBjZCAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2sKICAgICAgICAgc2V0IHZhcnMoZGVzaWduKSAkYmxvY2sKICAgICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwcm9jX2ZpbGUpXX0gewogICAgICAgICAgICAgICB1bnNldCB2YXJzKHByb2NfZmlsZSkKICAgICAgICAgICAgfQogICAgICAgICAgICB1bnNldCB2YXJzKHN0ZXBzKQogICAgICAgICB9IAogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX3NwZWMpXX0gewogICAgICAgICAgICB1bnNldCB2YXJzKGN0c19zcGVjKQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkYmxvY2ssY3RzX3NwZWMpXX0gewogICAgICAgICAgICBzZXQgdmFycyhjdHNfc3BlYykgJHZhcnMoJGJsb2NrLGN0c19zcGVjKQogICAgICAgICB9CgogICAgICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSB7IAogICAgICAgICAgICBleGVjIGxuIC1zICRsaW5rIFNDUklQVFMKICAgICAgICAgICAgZXhlYyBsbiAtcyBTQ1JJUFRTL01ha2VmaWxlLmVkaS5mbGF0IE1ha2VmaWxlCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKG1vZGUpIGZsYXQKICAgICAgICAgICAgc2V0IHZhcnMoaGllcikgdHJ1ZSAKICAgICAgICAgICAgdW5zZXQgdmFycyhzdGVwKQogICAgICAgICAgICBleGVjdXRlX2Zsb3cgYWxsICR2YXJzKGZvcm1hdF9saW5lcykKICAgICAgICAgICAgRkY6OmR1bXBfdmFycwogICAgICAgICB9CiAgICAgICAgIGNkICRjd2QKIyAgICAgICAgIHNldCBhY3Rpb25zICR2YXJzKGFjdGlvbnMpCiAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyB2YXJzXSB7CiAgICAgICAgICAgIGlmIHskdmFyICE9ICJwcm9jZXNzZWRfcGx1Z2lucyJ9IHsKICAgICAgICAgICAgICAgdW5zZXQgdmFycygkdmFyKQogICAgICAgICAgICB9CiAgICAgICAgIH0KIyAgICAgICAgIHNldCB2YXJzKGFjdGlvbnMpICRhY3Rpb25zCiAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyBzdmFyc10gewogICAgICAgICAgICBpZiB7JHZhciAhPSAicHJvY2Vzc2VkX3BsdWdpbnMifSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKCR2YXIpICRzdmFycygkdmFyKQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIycGFzcyJ9IHsKICAgICAgICAgZm9yZWFjaCBibG9jayBbY29uY2F0ICR2YXJzKGRlc2lnbikgJHZhcnMocGFydGl0aW9uX2xpc3QpXSB7CiAgICAgICAgICAgIGV4ZWMgbWtkaXIgLXAgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMKICAgICAgICAgICAgZXhlYyBta2RpciAtcCAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2svJHZhcnMocnB0X2RpcikKICAgICAgICAgICAgaWYge1tmaWxlIGlzZGlyZWN0b3J5ICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRibG9jay8kdmFycyhzY3JpcHRfZGlyKS9FVENdfSB7CiAgICAgICAgICAgICAgIGZpbGUgZGVsZXRlIC1mb3JjZSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2svJHZhcnMoc2NyaXB0X2RpcikvRVRDCiAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0VUQyAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2svJHZhcnMoc2NyaXB0X2RpcikvRVRDCiAgICAgICAgICAgIGZvcmVhY2ggZmlsZSBbZ2xvYiAkdmFycyhwYXJ0aXRpb25fZGlyKS9NYWtlKl0gewogICAgICAgICAgICAgICBpZiB7W2ZpbGUgaXNmaWxlICRmaWxlXX0gewogICAgICAgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlICRmaWxlICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCBmaWxlIFtnbG9iICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay8kdmFycyhzY3JpcHRfZGlyKS8qXSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBpc2ZpbGUgJGZpbGVdfSB7CiAgICAgICAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJGZpbGUgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svLmlsbV9ub25fc2RjX2ZpbGUudGNsXX0gewogICAgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay8uaWxtX25vbl9zZGNfZmlsZS50Y2wgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svZW1wdHkuc2RjXX0gewogICAgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay9lbXB0eS5zZGMgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svTWFrZWZpbGUucGFzczJdfSB7CiAgICAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrL01ha2VmaWxlLnBhc3MyICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRibG9jay9NYWtlZmlsZQogICAgICAgICAgICAgICBmaWxlIGRlbGV0ZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svTWFrZWZpbGUucGFzczIKICAgICAgICAgICAgfQogICAgICAgICAgICBjZCAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2sKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBzZXQgaW5kZXggW2xzZWFyY2ggW0ZGOjphZGp1c3Rfc3RlcHNdIGN0c10KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGluZGV4IFtsc2VhcmNoIFtGRjo6YWRqdXN0X3N0ZXBzXSBwb3N0Y3RzXQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNkICRjd2QKICAgICAgICAgICAgZm9yZWFjaCBzdGVwIFtscmFuZ2UgJHZhcnMoc3RlcHMpICRpbmRleCBlbmRdIHsKICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YXJzKGZzdGVwcykgJHN0ZXBdICE9IC0xfSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBpc2ZpbGUgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuXyRzdGVwLnRjbF19IHsKICAgICAgICAgICAgICAgICAgICAgZmlsZSBjb3B5ICAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuXyRzdGVwLnRjbCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRibG9jay8kdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTCiAgICAgICAgICAgICAgICAgICAgIGZpbGUgZGVsZXRlICAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuXyRzdGVwLnRjbAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgICAgICAgZmlsZSBjb3B5IC1mb3JjZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svTWFrZWZpbGUucGFzczIgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrLk1ha2VmaWxlCiMgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrL01ha2VmaWxlLnBhc3MyICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRibG9jay9NYWtlZmlsZQojICAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGNkICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRibG9jawojICAgICAgICAgICAgc2V0IGFkanVzdGVkIFtGRjo6YWRqdXN0X3N0ZXBzXQojICAgICAgICAgICAgRkY6Omdlbl9tYWtlZmlsZSBbbHJhbmdlICR2YXJzKHN0ZXBzKSAkaW5kZXggZW5kXSBmbGF0CiMgICAgICAgICAgICBGRjo6Z2VuX21ha2VmaWxlIFtscmFuZ2UgJGFkanVzdGVkICRpbmRleCBlbmRdIGZsYXQKIyAgICAgICAgICAgIGNkICRjd2QKICAgICAgICAgfQogICAgICB9CiAKICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHZhcnNdIHsKICAgICAgICAgdW5zZXQgdmFycygkdmFyKQogICAgICB9CiAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyBzdmFyc10gewogICAgICAgICBzZXQgdmFycygkdmFyKSAkc3ZhcnMoJHZhcikKICAgICAgfQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiMgICAgICAgICBpZiB7JHZhcnMobWFrZWZpbGUpfSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuZXhlYyAvYmluL3RvdWNoICRlbnYoVlBBVEgpL3BhcnRpdGlvblxuIgojICAgICAgICAgfQogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGV4ZWMgL2Jpbi90b3VjaCAkZW52KFZQQVRIKS9wYXJ0aXRpb24KICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9kZWJ1ZyB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgZW52CgogICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbmdsb2JhbCBlbnZcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbaW5mbyBleGlzdHMgZW52KFNURVApXF19IHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJbRkZfTk9WVVM6OmxvYWRfZGVzaWduIFwkZW52KFNURVApXVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIltGRjo6c291cmNlX3BsdWcgYWx3YXlzX3NvdXJjZV90Y2xdXG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgImd1aV9maXRcbiIKCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KCiAgIH0KCiAgIHByb2MgcnVuX2xlYyB7fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ2cHhtb2RlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGRvZmlsZSBhYm9ydCBleGl0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHVuZGVmaW5lZCBjZWxsIGJsYWNrX2JveCAtbm9hc2NlbmQgLWJvdGhcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ0Y2xtb2RlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiLy8gc2V0dXAgdmFyaWFibGVzIFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgImdsb2JhbCB2YXJzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicHJvYyBQdXRzIHthcmdzfSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgcHV0cyBcJGFyZ3NcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCgogICAgICBhcHBlbmQgY29tbWFuZCAiLy8gRGVmaW5lIHRoZSBuZXRsaXN0IHRvIGJlIHZlcmlmeVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2luZm8gZXhpc3RzIGVudihTVEVQKVxdICYmIFxbZmlsZSBleGlzdHMgJHZhcnMoZGJzX2RpcikvTEVDL1wkZW52KFNURVApLnYuZ3pcXX0ge1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIHNldCByZXZpc2VkTmV0bGlzdCAkdmFycyhkYnNfZGlyKS9MRUMvXCRlbnYoU1RFUCkudi5nelxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgcHV0cyBcIjxGRj4gRmFpbGVkIHRvIGZpbmQgbmV0bGlzdCAgREJTL0xFQy9cJGVudihTVEVQKS52Lmd6XCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModGhyZWFkcyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAidnB4IHNldCBjb21wYXJlIG9wdGlvbiAtdGhyZWFkcyAkdmFycyh0aHJlYWRzKVxuIgogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgIi8vIHJlYWQgbGliZXJ0eSBjZWxsIGRlZmluaXRpb25zXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcildfSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpXX0gewogICAgICAgICAgICBzZXQgc2V0ICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICJ2cHggcmVhZCBsaWJyYXJ5IC1zdGF0ZXRhYmxlIC1ib3RoIC1saWJlcnR5IFxbbGlzdCAkdmFycygkc2V0LHRpbWluZylcXVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIvLyByZWFkIHJlZmVyZW5jZSBuZXRsaXN0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAidnB4IHJlYWQgZGVzaWduIC12ZXJpbG9nIC1zZW5zaXRpdmUgLWdvbGRlbiAkdmFycyhuZXRsaXN0KVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIvLyByZWFkIHBvc3QtaW1wbGVtZW50YXRpb24gbmV0bGlzdFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInZweCByZWFkIGRlc2lnbiAtdmVyaWxvZyAtc2Vuc2l0aXZlIC1yZXZpc2VkIFwkcmV2aXNlZE5ldGxpc3RcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiLy9zZXQgdG9wIGxldmVsXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAidnB4IHNldCByb290IG1vZHVsZSAkdmFycyhkZXNpZ24pIC1ib3RoXG4iCgogICAgICByZWdzdWIgLWFsbCAiIyIgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfbGVjX3RjbF0gIi8vIiB0ZW1wCiAgICAgIGFwcGVuZCBjb21tYW5kcyAkdGVtcAoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ2cHhtb2RlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicmVwb3J0IGRlc2lnbiBkYXRhXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicmVwb3J0IGJsYWNrIGJveFxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgbWFwcGluZyBtZXRob2QgLW5hbWUgZmlyc3RcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgZmxhdHRlbiBtb2RlbCAtc2VxX2NvbnN0YW50IC1zZXFfY29uc3RhbnRfeF90byAwXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGZsYXR0ZW4gbW9kZWwgLW5vZGZmX3RvX2RsYXRfemVybyAtbm9kZmZfdG9fZGxhdF9mZWVkYmFja1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBmbGF0dGVuIG1vZGVsIC1nYXRlZF9jbG9ja1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBzeXN0ZW0gbW9kZSBsZWNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJhZGQgY29tcGFyZSBwb2ludCAtYWxsXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiY29tcGFyZSAtZ2F0ZV90b19nYXRlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAidXNhZ2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIvLyAgIHZweCByZXBvcnQgY29tcGFyZSBkYXRhIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlcG9ydCBjb21wYXJlIGRhdGEgLWNsYXNzIG5vbmVxdWl2YWxlbnQgLWNsYXNzIGFib3J0IC1jbGFzcyBub3Rjb21wYXJlZFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlcG9ydCB2ZXJpZmljYXRpb24gLXZlcmJvc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZXBvcnQgc3RhdGlzdGljc1xuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ0Y2xtb2RlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHBvaW50c19jb3VudCBcW2dldF9jb21wYXJlX3BvaW50cyAtY291bnRcXVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBkaWZmX2NvdW50IFxbZ2V0X2NvbXBhcmVfcG9pbnRzIC1kaWZmIC1jb3VudFxdXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGFib3J0X2NvdW50IFxbZ2V0X2NvbXBhcmVfcG9pbnRzIC1hYm9ydCAtY291bnRcXVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB1bmtub3duX2NvdW50IFxbZ2V0X2NvbXBhcmVfcG9pbnRzIC11bmtub3duIC1jb3VudFxdXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1wkcG9pbnRzX2NvdW50ID09IDB9IHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgcHV0cyBcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCJFUlJPUjogTm8gY29tcGFyZSBwb2ludHMgZGV0ZWN0ZWRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICBwdXRzIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1wkZGlmZl9jb3VudCA+IDB9IHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgcHV0cyBcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCJFUlJPUjogRGlmZmVyZW50IEtleSBQb2ludHMgZGV0ZWN0ZWRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICBwdXRzIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1wkYWJvcnRfY291bnQgPiAwfSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCJFUlJPUjogQWJvcnQgUG9pbnRzIGRldGVjdGVkIFwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcJHVua25vd25fY291bnQgPiAwfSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgcHV0cyBcIkVSUk9SOiBVbmtub3duIEtleSBQb2ludHMgZGV0ZWN0ZWRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICBwdXRzIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCJObyBvZiBjb21wYXJlIHBvaW50cyA9IFwkcG9pbnRzX2NvdW50XCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiTm8gb2YgZGlmZiBwb2ludHMgICAgPSBcJGRpZmZfY291bnRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCJObyBvZiBhYm9ydCBwb2ludHMgICA9IFwkYWJvcnRfY291bnRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCJObyBvZiB1bmtub3duIHBvaW50cyA9IFwkdW5rbm93bl9jb3VudFwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhpdCAwXG4iCgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CgogICB9CgogICBwcm9jIGR1bXBfY29uZmlnIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCB1ZG0KICAgICAgZ2xvYmFsIHJkYV9JbnB1dAogICAgICBnbG9iYWwgcmRhX2RlZmF1bHRzCgojICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikKICAgICAgaWYge1tpbmZvIGNvbW1hbmQgRkZGOjpnZXRfdG9vbF0gbmUgIiIgJiYgW0ZGRjo6Z2V0X3Rvb2xdIGVxICJyYyJ9IHsKICAgICAgICB0Y2xfc291cmNlICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvSU5OT1ZVUy91ZG0udGNsCiAgICAgIH0gZWxzZSB7IAogICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvdWRtLnRjbAogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgIGlmIHskdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICAgICB1bnNldCBpbml0KG1tbWNfZmlsZSkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdW5zZXQgaW5pdChjcGZfZmlsZSkKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgIGlmIHshJHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcykgfHwgKFtsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTUpfSB7CiAgICAgICAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9pbml0LnRjbCB3XQogICAgICAgICAgICAjIEJDTDogVHJ5aW5nIHRvIGZpeCBlbWJlZGRlZCBwYXRocy4uLgogICAgICAgICAgICBzZXQgcmVsYXRpdml6ZU1lc2dMb2cgIiIKICAgICAgICAgICAgc2V0IHJlbGF0aXZpemVNZXNnTG9nICIkcmVsYXRpdml6ZU1lc2dMb2cgW0ZGOjpyZW1vdmVfb3V0ZXJfYnJhY2VzIFtGRjo6cmVsYXRpdml6ZUZpbGVPckRpciAtYXJyIGluaXQgLXZhcmRpciBmZl9leGVfZGlyIC1yZWxhdGl2ZVBhdGhzT2tdXSIKCiAgICAgICAgICAgICNmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgaW5pdF0gewogICAgICAgICAgICAjICAgcHV0cyAkb3AgInNldCBpbml0XyR2YXIgXCIkaW5pdCgkdmFyKVwiIgogICAgICAgICAgICAjfQogICAgICAgICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgbmluaXRdIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKG5ldGxpc3RfdHlwZSkgPT0gInZlcmlsb2cifSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFyID09ICJvYV9kZXNpZ25fbGliIn0geyBjb250aW51ZSB9CiAgICAgICAgICAgICAgICAgIGlmIHskdmFyID09ICJvYV9kZXNpZ25fY2VsbCJ9IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7JHZhciA9PSAib2FfZGVzaWduX3ZpZXcifSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICRvcCAic2V0X2RiIGluaXRfJHZhciBcIiRuaW5pdCgkdmFyKVwiIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlICRvcAogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9ydW4uY29uZiB3XQogICAgICAgICAjQkNMOiBBZGRlZCAuZmYudGNsIHNvdXJjaW5nIGluIHJ1bi5jb25mIGluIG9yZGVyIHRvIHB1bGwgaW4gY29kZWdlbiB2YXJpYWJsZXMKICAgICAgICAgcHV0cyAkb3AgIiMgU2V0IHVwIGNvZGVnZW4gdmFyaWFibGVzIChwb3NzaWJseSkgbmVlZGVkIHRvIHJlc29sdmUgc29tZSBjb25mIHZhcmlhYmxlcyIKICAgICAgICAgI3B1dHMgJG9wICJpZiB7XFtmaWxlIGV4aXN0cyAuZmYudGNsXF19IHsiCiAgICAgICAgICNwdXRzICRvcCAiICBzb3VyY2UgLmZmLnRjbCIKICAgICAgICAgI3B1dHMgJG9wICJ9IgogICAgICAgICAjQkNMOiBPbmx5IGVuY2xvc2UgaW4gY3VybGllcyBpZiBzdWJzdCBpcyBub3QgcGFydCBvZiB0aGUgbmV0bGlzdCBuYW1lCiAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyByZGFfSW5wdXRdIHsKICAgICAgICAgICAjIEJDTDogb25seSB1c2UgY3VybGllcyBpZiB0aGUgdmFyaWFibGUgZG9lc24ndCBjb250YWluIHN1YnN0IChvdGhlcndpc2Ugc3Vic3Qgd2lsbCBub3QgYmUgcGVyZm9ybWVkKQogICAgICAgICAgIGlmIHtbcmVnZXhwIHtzdWJzdH0gJHJkYV9JbnB1dCgkdmFyKV19IHsKICAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgcmRhX0lucHV0KCR2YXIpIFwiJHJkYV9JbnB1dCgkdmFyKVwiIgogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHJkYV9JbnB1dCgkdmFyKSBceyRyZGFfSW5wdXQoJHZhcilcfSIKICAgICAgICAgICB9CiAgICAgICAgIH0KIyAgICAgICAgIGlmIHskdmFycyhmbGF0KSAhPSAiZnVsbCJ9IHsKIyAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgcmRhX0lucHV0KHVpX3ZpZXdfZGVmaW5pdGlvbl9maWxlKSBcIiR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2xcIiIKIyAgICAgICAgIH0KICAgICAgfQogICB9CgogICBwcm9jIGdldF9yZXF1aXJlZF9wcm9jcyB7ZmlsZX0gewogICAgICAjCiAgICAgICMgR2l2ZW4gYSBsaXN0IG9mIHJlcXVpcmVkIHByb2NlZHVyZXMsIHJldHVybiB0aGUgbGluZXMgdGhhdCByZXByZXNlbnQKICAgICAgIyB0aG9zZSBwcm9jZWR1cmVzIGZyb20gdGhlIHV0aWxzLnRjbCBmaWxlCiAgICAgICMKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgICMKICAgICAgIyBSZWFkIHRoZSBmaWxlIGFuZCBnYXRoZXIgYWxsIG9mIHRoZSBjb250ZW50cwogICAgICAjCgogICAgICBzZXQgYWxsX2xpbmVzICIiCiAgICAgIHNldCBsZW5ndGggMAogICAgICBzZXQgaXAgW29wZW4gJGZpbGVdCiAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsKICAgICAgICAgc2V0IHV0aWxzX2xpbmVzKCRsZW5ndGgpICRsaW5lCiAgICAgICAgIGluY3IgbGVuZ3RoCiAgICAgIH0KICAgICAgY2xvc2UgJGlwCgogICAgICAjCiAgICAgICMgSXRlcmF0ZSBhY3Jvc3MgZWFjaCBsaW5lIGFuZCBwdWxsIG91dCByZWxldmFudCBwcm9jZWR1cmVzCiAgICAgICMKCiAgICAgIHNldCBsaW5lcyAiIgogICAgICBzZXQgaSAwCiAgICAgIHdoaWxlIHskaSA8ICRsZW5ndGh9IHsKICAgICAgICAgc2V0IGxpbmUgW3JlZ3N1YiAicHV0cyIgJHV0aWxzX2xpbmVzKCRpKSAicHV0cyJdCiAgICAgICAgIGZvcmVhY2ggcHJvYyAkdmFycyhyZXF1aXJlZF9wcm9jcykgewogICAgICAgICAgICBpZiB7W3JlZ2V4cCAicHJvYyAkcHJvYyIgJGxpbmVdID4gMH0gewogICAgICAgICAgICAgICBhcHBlbmQgbGluZXMgIiAkbGluZVxuIgogICAgICAgICAgICAgICBpbmNyIGkKICAgICAgICAgICAgICAgd2hpbGUgeyRpIDwgJGxlbmd0aH0gewogICAgICAgICAgICAgICAgICBzZXQgbGluZSAkdXRpbHNfbGluZXMoJGkpCiAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJwcm9jICIgJGxpbmVdID4gMH0gewogICAgICAgICAgICAgICAgICAgICBpbmNyIGkgLTEKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl4jIiBbc3RyaW5nIHRyaW1sZWZ0ICRsaW5lXSBdICYmICgkaSAhPSBbZXhwciAkbGVuZ3RoLTFdKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbGluZXMgIiRsaW5lXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaW5jciBpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGluY3IgaQogICAgICB9CgogICAgICBzZXQgbGluZXMgW3N0cmluZyB0cmltcmlnaHQgJGxpbmVzXQogICAgICByZXR1cm4gIiRsaW5lc1xuIgogICB9CgogICBwcm9jIG5vcm1hbGl6ZV9maWxlcyB7fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobm9ybWFsaXplX2ZpbGVzKV0gJiYgISR2YXJzKG5vcm1hbGl6ZV9maWxlcyl9IHsKICAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgc2V0IG1tbWNfZmlsZSBbZmlsZSBub3JtYWxpemUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBtbW1jX2ZpbGUgW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2xdCiAgICAgIH0KICAgICAgc2V0IHZhcnMobW1tY19maWxlKSAkbW1tY19maWxlCgogICAgICBmb3JlYWNoIGZpbGVfdmFyIFtsaXN0IGNwZl9maWxlIGRlZl9maWxlcyBuZXRsaXN0IGN0c19zcGVjIGxlZl9maWxlcyBcCiAgICAgICAgICAgICAgICAgICAgICAgICBnZHNfZmlsZXMgYWN0aXZpdHlfZmlsZSBpbG1fbm9uX3NkY19maWxlIF0gewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGZpbGVfdmFyKV19IHsKICAgICAgICAgICAgc2V0IHRlbXAgW2xpc3RdCiAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkZmlsZV92YXIpIHsgIAogICAgICAgICAgICAgICBsYXBwZW5kIHRlbXAgW2ZpbGUgbm9ybWFsaXplICRmaWxlXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB2YXJzKCRmaWxlX3ZhcikgJHRlbXAKICAgICAgICAgfQogICAgICB9CiAgIH0KCiAgIHByb2Mgbm9ybWFsaXplX2NvbnN0cmFpbnRzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgY3dkIFtwd2RdCiAgICAgIGNkICR2YXJzKGN3ZCkKCiAgICAgIGZvcmVhY2ggbW9kZSAkdmFycyhjb25zdHJhaW50X21vZGVzKSB7CiAgICAgICAgIGZvcmVhY2ggdmFyICJwcmVfY3RzX3NkYyBpbmNyX2N0c19zZGMgcG9zdF9jdHNfc2RjIHByZV9jdHNfaWxtX3NkYyIgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG1vZGUsJHZhcildfSB7CiAgICAgICAgICAgICAgICAgIHNldCB0ZW1wIFtsaXN0XQogICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJG1vZGUsJHZhcikgewogICAgICAgICAgICAgICAgICBsYXBwZW5kIHRlbXAgW2ZpbGUgbm9ybWFsaXplICRmaWxlXQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCB2YXJzKCRtb2RlLCR2YXIpICR0ZW1wCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGNkICRjd2QKICAgfQoKICAgcHJvYyBkZW5vcm1hbGl6ZV9maWxlcyB7fSB7CiAgIAogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgdHZhcnMKICAgCiAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyB2YXJzXSB7CiAgICAgICAgIGlmIHsoJHZhciAhPSAic2V0dXBfcGF0aCIpICYmICgkdmFyICE9ICJzY3JpcHRfZGlyIikgJiYgKCR2YXIgIT0gInNjcmlwdF9wYXRoIikgJiYgKCR2YXIgPT0gImV4ZWN1dGVfc3RyaW5nIil9IHsKICAgICAgICAgICAgc2V0IHR2YXJzKCR2YXIpICR2YXJzKCR2YXIpCiAgICAgICAgIH0KICAgICAgfQoKIyAgICAgIHNldCBvcCBbb3BlbiAuc2V0dXAuZmYudGNsIHddCiAgICAgIGNhdGNoIHt1bnNldCBwYXRoX2FycmF5fQogICAgICBzZXQgcGF0aF9saXN0IFtsaXN0XQogICAgICBzZXQgcGF0aF92YXJzIFtsaXN0XQogICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgdHZhcnNdIHsKICAgICAgICAgaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJHR2YXJzKCR2YXIpXSB7CiAgICAgICAgICAgIHNldCBwYXRoX2FycmF5KCR0dmFycygkdmFyKSkgJHZhcgogICAgICAgICAgICBsYXBwZW5kIHBhdGhfdmFycyAkdmFyCiAgICAgICAgICAgIGxhcHBlbmQgcGF0aF9saXN0ICR0dmFycygkdmFyKSAgCiAgICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgc2V0IHNvcnRlZF9wYXRoX2xpc3QgW2xzb3J0IC1kZWNyZWFzaW5nICRwYXRoX2xpc3RdCiMgICAgICBwdXRzICItPiBGb3VuZCBbbGxlbmd0aCAkc29ydGVkX3BhdGhfbGlzdF0iCiAgICAgIGZvcmVhY2ggcGF0aCAkc29ydGVkX3BhdGhfbGlzdCB7CiMgICAgICAgICBwdXRzICIkcGF0aCAtPiAkcGF0aF9hcnJheSgkcGF0aCkgKFtzdHJpbmcgbGVuZ3RoICRwYXRoXSkiCiMgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHBhdGhfYXJyYXkoJHBhdGgpKSAkcGF0aCIKICAgICAgfQogICAgICAKICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHR2YXJzXSB7CiAgICAgICAgIHNldCBmb3VuZCAwCiAgICAgICAgIGZvcmVhY2ggcGF0aCAkc29ydGVkX3BhdGhfbGlzdCB7CiAgICAgICAgICAgICBpZiB7KCR2YXIgPT0gJHBhdGhfYXJyYXkoJHBhdGgpKSB8fCAoW3N0cmluZyBmaXJzdCAiXFsiICAkdmFyXSAhPSAtMSl9IHsKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICB9CiAgICAgICMgICAgICBwdXRzICRvcCAiW2Zvcm1hdCAicmVnc3ViIC1hbGwgXCIlc1wiIFwiJXNcIiBcXCQlcyIgJHBhdGggW2pvaW4gJHR2YXJzKCR2YXIpXSAkcGF0aF9hcnJheSgkcGF0aCkgdGVtcF0iCiAgICAgICAgICAgIGlmIHtbY2F0Y2gge3NldCBjb21tYW5kIFtmb3JtYXQgInJlZ3N1YiAtYWxsIFwiJXNcIiBcIiVzXCIgXFxcJHZhcnMoJXMpIHRlbXAiICRwYXRoIFtqb2luICR0dmFycygkdmFyKV0gJHBhdGhfYXJyYXkoJHBhdGgpXX1dfSB7CiAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGZvbyBbZXZhbCAkY29tbWFuZF0KICAgICAgICAgICAgaWYgeyRmb28gPiAwfSB7CiMgICAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikgXCJbam9pbiAkdGVtcF1cIiIKICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICR0ZW1wXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJHZhcikgW2pvaW4gJHRlbXBdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCR2YXIpICR0ZW1wCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IGZvdW5kIDEKICAgICAgICAgICAgfQogICAgICAgICB9CiMgICAgICAgICBpZiB7ISRmb3VuZH0gewojICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIFwiW2pvaW4gJHZhcnMoJHZhcildXCIiCiMgICAgICAgICB9CiAgICAgIH0KIyAgICAgIGZvcmVhY2ggcGF0aCAkc29ydGVkX3BhdGhfbGlzdCB7CiMgICAgICAgICBzZXQgdmFycygkcGF0aF9hcnJheSgkcGF0aCkpICRwYXRoCiMgICAgICB9CiMgICAgICBjbG9zZSAkb3AKIyAgICAgIHNvdXJjZSAuc2V0dXAuZmYudGNsIAogICB9CgoKICAgcHJvYyBnZW5fY2hlY2sge30gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL2NoZWNrX3Fvci50Y2wgd10KCiAgICAgIHB1dHMgJG9wICIjIVtsaW5kZXggJHZhcnMoZXhlY3V0ZV9zdHJpbmcpIDBdIgogICAgICAKICAgICAgcHV0cyAkb3AgImlmIHshXFtsbGVuZ3RoIFwkYXJndlxdfSB7IgogICAgICBwdXRzICRvcCAiICAgcHV0cyBcIjxGRj4gRVJST1I6IE1JU1NJTkcgUU9SIFJFU1VMVCBGSUxFIE5BTUVcIiIKICAgICAgcHV0cyAkb3AgIiAgIGV4aXQgLTEiCiAgICAgIHB1dHMgJG9wICJ9IgogICAgICAKICAgICAgcHV0cyAkb3AgImZvcmVhY2ggbmFtZSBcJGFyZ3YgeyIKICAgICAgcHV0cyAkb3AgIiAgIGlmIHshXFtmaWxlIGV4aXN0cyBcJG5hbWVcXX0geyIKICAgICAgcHV0cyAkb3AgIiAgICAgIHB1dHMgXCI8RkY+IEVSUk9SOiBRT1IgUkVTVUxUIEZJTEUgTUlTU0lORyAoXCRuYW1lKVwiIgogICAgICBwdXRzICRvcCAiICAgICAgZXhpdCAtMSIKICAgICAgcHV0cyAkb3AgIiAgIH0iCiAgICAgIAogICAgICBwdXRzICRvcCAiICAgZmlsZSBzdGF0IFwkbmFtZSBxb3Jfc3RhdCIKICAgICAgcHV0cyAkb3AgIiAgIGlmIHshXCRxb3Jfc3RhdChzaXplKX0geyIKICAgICAgcHV0cyAkb3AgIiAgICAgIGNvbnRpbnVlIgogICAgICBwdXRzICRvcCAiICAgfSIKICAgICAgcHV0cyAkb3AgIiAgIHNldCBxb3JfZmlsZSBcW29wZW4gXCRuYW1lIHJcXSIKICAgICAgcHV0cyAkb3AgIiAgIGdldHMgXCRxb3JfZmlsZSBxb3JfcmVzdWx0IgogICAgICBwdXRzICRvcCAiICAgaWYge1xbZXhwciBcJHFvcl9yZXN1bHRcXX0geyIKICAgICAgcHV0cyAkb3AgIiAgICAgIGV4aXQgLTEiCiAgICAgIHB1dHMgJG9wICIgICB9IgogICAgICBwdXRzICRvcCAifSIKICAgICAgCiAgICAgIHB1dHMgJG9wICJleGl0IDAiCgogICAgICBjbG9zZSAkb3AKCiAgICAgIGV4ZWMgY2htb2QgK3ggICR2YXJzKHNjcmlwdF9kaXIpL2NoZWNrX3Fvci50Y2wKICAgfQoKICAgcHJvYyBzb3VyY2VfY29uZmlnX2ZpbGVzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIHVzZXJfdmFycwogICAgICBnbG9iYWwgZGVzYwogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBwdXRzICI8RkY+IExPQURJTkcgQ09ORklHVVJBVElPTiBGSUxFUzoiCiAgICAgIHNldCB2YXJzKGNvbmZpZ19maWxlcykgW2xpc3RdCiAgICAgIGZvcmVhY2ggZmlsZSAic2V0dXAudGNsIGlubm92dXNfY29uZmlnLnRjbCBscF9jb25maWcudGNsIGdlbnVzX2NvbmZpZy50Y2wiIHsKICAgICAgICAgc2V0IHRlbXAgW3JlZ3N1YiAiXFwuIiAkZmlsZSAiXyJdCiAgICAgICAgIHNldCB2YXJzKCR0ZW1wKSBbbGlzdF0gCiAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoc2V0dXBfcGF0aCkvJGZpbGVdfSB7CiAgICAgICAgICAgIEZGOjpzb3VyY2VfZmlsZSAkdmFycyhzZXR1cF9wYXRoKS8kZmlsZQogICAgICAgICAgICBsYXBwZW5kIHZhcnMoJHRlbXApICR2YXJzKHNldHVwX3BhdGgpLyRmaWxlCiAgICAgICAgICAgIGxhcHBlbmQgdmFycyhjb25maWdfZmlsZXMpICR2YXJzKHNldHVwX3BhdGgpLyRmaWxlCiAgICAgICAgIH0KICAgICAgICAgaWYgeygkdmFycyhzZXR1cF9wYXRoKSAhPSAiLiIpICYmIFtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgRkY6OnNvdXJjZV9maWxlICRmaWxlCiAgICAgICAgICAgIGxhcHBlbmQgdmFycygkdGVtcCkgJGZpbGUKICAgICAgICAgICAgbGFwcGVuZCB2YXJzKGNvbmZpZ19maWxlcykgJGZpbGUKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoJHRlbXApICE9ICIifSB7CiAgICAgICAgICAgIHB1dHMgIjxGRj4gICAgJHRlbXAgLT4gJHZhcnMoJHRlbXApIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyB2YXJzXSB7CiAgICAgICAgIHNldCB1c2VyX3ZhcnMoJHZhcikgJHZhcnMoJHZhcikKIyAgICAgICAgIHB1dHMgJHZhcgogICAgICB9CgogICAgICBpZiB7W0ZGOjppc19scF9mbG93XX0gewogICAgICAgICBzZXQgdmFycyhyZXF1aXJlZF9wcm9jcykgXAogICAgICAgICAgICAic291cmNlX2ZpbGUgc3lzdGVtX2luZm8gZ2V0X2Nsb2NrX3BvcnRzIGdldF9wb3dlcl9kb21haW5zIG1vZGlmeV9wb3dlcl9kb21haW5zIGFkZF9wb3dlcl9zd2l0Y2hlcyBcCiAgICAgICAgICAgICByb3V0ZV9zZWNvbmRhcnlfcGdfbmV0cyBpbnNlcnRfd2VsbHRhcHNfZW5kY2FwcyByZXBvcnRfdGltZSBidWZmZXJfYWx3YXlzX29uX25ldHMgXAogICAgICAgICAgICAgc2F2ZV9yZXN1bHRzIGxvYWRfYXBwbGV0IGdldF90b29sIGxvYWRfcGF0aF9ncm91cHMiCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCB2YXJzKHJlcXVpcmVkX3Byb2NzKSBcCiAgICAgICAgICAgICJzb3VyY2VfZmlsZSBzeXN0ZW1faW5mbyBnZXRfY2xvY2tfcG9ydHMgcmVwb3J0X3RpbWUgaW5zZXJ0X3dlbGx0YXBzX2VuZGNhcHMgXAogICAgICAgICAgICAgc2F2ZV9yZXN1bHRzIGxvYWRfYXBwbGV0IGdldF90b29sIGxvYWRfcGF0aF9ncm91cHMgIgogICAgICB9CiAgIH0KCiAgIHByb2MgZXhlY3V0ZV9mbG93IHtzdGVwIHtmb3JtYXQgMX0ge2Fib3J0ICIifX0gewoKICAgICAgIwogICAgICAjIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50LCByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBmdW5jdGlvbnMgYW5kCiAgICAgICMgYWdncmVnYXRpbmcgcmVzdWx0cyBmb3IgZWFjaCBzdGVwIGluIHRoZSBmbG93CiAgICAgICMKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGRhcmdzCiAgICAgIGdsb2JhbCBmYXJncwogICAgICBnbG9iYWwgc3ZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHNvdXJjZWQpXX0geyBzZXQgdmFycyhzb3VyY2VkKSAwIH0KIyAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc2luZ2xlKV19IHsgc2V0IHZhcnMoc2luZ2xlKSAwIH0KICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjYXRjaF9lcnJvcnMpXX0geyBzZXQgdmFycyhjYXRjaF9lcnJvcnMpIDAgfQogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHN0b3Bfc3RlcCldfSB7IHNldCB2YXJzKHN0b3Bfc3RlcCkgInNpZ25vZmYiIH0KICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhpbml0aWFsaXplZCldfSB7IHNldCB2YXJzKGluaXRpYWxpemVkKSAwIH0KICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhsb2FkZWQpXX0geyBzZXQgdmFycyhsb2FkZWQpIDAgfQogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGJzdGVwcyldfSB7IHNldCB2YXJzKGJzdGVwcykgW2xpc3RdIH0KICAgICAgaWYgeyFbaW5mbyBleGlzdHMgZW52KFZQQVRIKV19IHsgc2V0IGVudihWUEFUSCkgbWFrZSB9CgogICAgICAjCiAgICAgICMgSWYgbm8gc3RlcHMgYXJlIGRlZmluZWQsIHNldCB0aGUgc3RlcHMgdG8gZXhlY3V0ZSBiYXNlZCB1cG9uIHRoZQogICAgICAjIG1vZGUgdGhhdCB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcgaW4uICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUKICAgICAgIyBoaWVyYXJjaGljYWwgZmxvdyB3aWxsIHVuc2V0IHRoZSB2YXJzKCkgYXJyYXkgYmVmb3JlIHJlY3Vyc2l2ZWx5CiAgICAgICMgY2FsbGluZyB0aGlzIHJvdXRpbmUuCiAgICAgICMKCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc3RlcHMpXX0gewogICAgICAgICAjIEJDTDogTW92ZWQgdGhlIGZvbGxvd2luZyBpZiAvIGVsc2UgdXAgKGl0IG11c3QgYWx3YXlzIGV4ZWN1dGUpCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobW9kZSldfSB7IAogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIGZhcmdzKG1vZGUpXX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhtb2RlKSAkZmFyZ3MobW9kZSkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IHZhcnMobW9kZSkgJGRhcmdzKG1vZGUpCiAgICAgICAgICAgIH0KICAgICAgICAgfQojICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhpZXIpXSAmJiAhJHZhcnMoaGllcil9IHsKIyAgICAgICAgICAgIEZGOjpzZXRfc3RlcHMgJHZhcnMobW9kZSkgJGZvcm1hdAojICAgICAgICAgICAgdW5zZXQgdmFycyhtb2RlKQojICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgIEZGOjpzZXRfc3RlcHMgJHZhcnMobW9kZSkgJGZvcm1hdAojICAgICAgICAgfQogICAgICB9CgogICAgICAjCiAgICAgICMgU2V0IHRoZSBwcm9jZWR1cmVzIHRoYXQgd2Ugd2lsbCBuZWVkIHRvIGluY2x1ZGUgd2l0aGluIGVhY2ggZmlsZSB0aGF0CiAgICAgICMgd2UgY3JlYXRlIHRvIHJ1biBhIHN0ZXAuCiAgICAgICMKCiMgICAgICBzZXQgdmFycyhyZXF1aXJlZF9wcm9jcykgXAojICAgICAgICAgInNvdXJjZV9wbHVnIGdldF9jbG9ja19wb3J0cyBnZXRfcG93ZXJfZG9tYWlucyByZXBvcnRfdGltZSIKCiAgICAgICMKICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgdmFyaWFibGVzIGFyZSBhY3R1YWxseSBzb3VyY2VkIGZyb20gdGhlCiAgICAgICMgY29uZmlndXJhdGlvbiBmaWxlcwogICAgICAjCgogICAgICBpZiB7ISR2YXJzKHNvdXJjZWQpICYmICgkc3RlcCAhPSAic291cmNlIil9IHsKICAgICAgICAgZXhlY3V0ZV9mbG93ICJzb3VyY2UiICRmb3JtYXQgJGFib3J0CiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhzb3VyY2VkKX0geyAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhpZXIpXSAmJiAhJHZhcnMoaGllcil9IHsKICAgICAgICAgICAgRkY6OnNldF9zdGVwcyAkdmFycyhtb2RlKSAkZm9ybWF0CiAgICAgICAgICAgIHVuc2V0IHZhcnMobW9kZSkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRkY6OnNldF9zdGVwcyAkdmFycyhtb2RlKSAkZm9ybWF0CiAgICAgICAgIH0KICAgICAgfQogICAgICAjCiAgICAgICMgRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgc3RlcCBwZXIgdGhlIGNvbW1hbmQKICAgICAgIwoKICAgICAgc2V0IGFjdGlvbiAiIgogICAgICBzd2l0Y2ggLS0gJHN0ZXAgewogICAgICAgICAic291cmNlIiB7CiAgICAgICAgICAgIGlmIHshJHZhcnMoc291cmNlZCl9IHsKICAgICAgICAgICAgICAgRkZfTk9WVVM6OnNvdXJjZV9jb25maWdfZmlsZXMKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgICAgICAgaWYgeyFbcmVnZXhwICJeMTAiICRmYXJncyh2ZXJzaW9uKV0gJiYgIVtyZWdleHAgIl45IiAkZmFyZ3ModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgICAgICAgIEZGX05PVlVTOjpkZW5vcm1hbGl6ZV9maWxlcwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgZGFyZ3ModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgICAgIGlmIHshW3JlZ2V4cCAiXjEwIiAkZGFyZ3ModmVyc2lvbildICYmICFbcmVnZXhwICJeOSIgJGRhcmdzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICAgICAgICBGRl9OT1ZVUzo6ZGVub3JtYWxpemVfZmlsZXMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGZvcmVhY2ggYXJnIFtqb2luICR2YXJzKGFyZ19saXN0KV0gewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGFyZyldfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZmFyZ3MoJGFyZyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycygkYXJnKSAhPSAkZmFyZ3MoJGFyZyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBPdmVyd3JpdGluZyB2YXJzKCRhcmcpIGZyb20gJHZhcnMoJGFyZykgdG8gJGZhcmdzKCRhcmcpIC4uLiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycygkYXJnKSAkZmFyZ3MoJGFyZykKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBPbmx5IHNldCB0aGUgZmFyZyBpZiBpdCB3YXNuJ3Qgc2V0IGluIGEgY29uZmlnIGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkYXJnKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycygkYXJnKSAkZGFyZ3MoJGFyZykKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZmFyZ3MoJGFyZyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRhcmcpICRmYXJncygkYXJnKQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycygkYXJnKSAkZGFyZ3MoJGFyZykKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICBGRl9OT1ZVUzo6c2VlZF92YXJpYWJsZXMKIyAgICAgICAgICAgICAgIEZGX05PVlVTOjpjaGVja19zZXR1cAojICAgICAgICAgICAgICAgRkZfTk9WVVM6Om5vcm1hbGl6ZV9maWxlcyAKICAgICAgICAgICAgICAgc2V0IHZhcnMoc291cmNlZCkgdHJ1ZQogICAgICAgICAgICAgICBzZXQgdmFycyh0b3BfY2VsbCkgJHZhcnMoZGVzaWduKQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgInNvdXJjZV9vbmx5IiB7CiAgICAgICAgICAgICMgQkNMOiBBZGRlZCB0aGlzIGluIHNpbmNlIGkgd2FudCB0byBzb3VyY2UgdGhlIHZhcmlhYmxlcyB3L291dCBjYWxsaW5nIGNoZWNrX3NldHVwCiAgICAgICAgICAgIGlmIHshJHZhcnMoc291cmNlZCl9IHsKICAgICAgICAgICAgICAgRkZfTk9WVVM6OnNvdXJjZV9jb25maWdfZmlsZXMKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgICAgICAgaWYgeyFbcmVnZXhwICJeMTAiICRmYXJncyh2ZXJzaW9uKV0gJiYgIVtyZWdleHAgIl45IiAkZmFyZ3ModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgICAgICAgIEZGX05PVlVTOjpkZW5vcm1hbGl6ZV9maWxlcwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgZGFyZ3ModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgICAgIGlmIHshW3JlZ2V4cCAiXjEwIiAkZGFyZ3ModmVyc2lvbildICYmICFbcmVnZXhwICJeOSIgJGRhcmdzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICAgICAgICBGRl9OT1ZVUzo6ZGVub3JtYWxpemVfZmlsZXMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGZvcmVhY2ggYXJnIFtqb2luICR2YXJzKGFyZ19saXN0KV0gewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGFyZyldfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZmFyZ3MoJGFyZyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycygkYXJnKSAhPSAkZmFyZ3MoJGFyZyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBPdmVyd3JpdGluZyB2YXJzKCRhcmcpIGZyb20gJHZhcnMoJGFyZykgdG8gJGZhcmdzKCRhcmcpIC4uLiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycygkYXJnKSAkZmFyZ3MoJGFyZykKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBPbmx5IHNldCB0aGUgZmFyZyBpZiBpdCB3YXNuJ3Qgc2V0IGluIGEgY29uZmlnIGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkYXJnKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycygkYXJnKSAkZGFyZ3MoJGFyZykKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZmFyZ3MoJGFyZyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRhcmcpICRmYXJncygkYXJnKQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycygkYXJnKSAkZGFyZ3MoJGFyZykKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICBGRl9OT1ZVUzo6c2VlZF92YXJpYWJsZXMKIyAgICAgICAgICAgICAgIEZGX05PVlVTOjpjaGVja19zZXR1cAojICAgICAgICAgICAgICAgRkZfTk9WVVM6Om5vcm1hbGl6ZV9maWxlcyAKIyAgICAgICAgICAgICAgIHNldCB2YXJzKHNvdXJjZWQpIHRydWUKICAgICAgICAgICAgICAgc2V0IHZhcnModG9wX2NlbGwpICR2YXJzKGRlc2lnbikKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICJjaGVjayIgewogICAgICAgICAgICBpZiB7JGFib3J0ID09ICIifSB7CiAgICAgICAgICAgICAgIHNldCBhYm9ydCAkdmFycyhhYm9ydCkKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgc2F2ZSAkdmFycyhhYm9ydCkKICAgICAgICAgICAgc2V0IHZhcnMoYWJvcnQpICRhYm9ydAogICAgICAgICAgICBzZXQgdmFycyhhYm9ydCkgJHNhdmUKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhtb2RlKV19IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncyhtb2RlKV19IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMobW9kZSkgJGZhcmdzKG1vZGUpCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKG1vZGUpICRkYXJncyhtb2RlKQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKG1vZGUpID09ICJoaWVyIn0gewogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBGTE9XIE1PREUgJHZhcnMobW9kZSkgU0VMRUNURUQgQlVUIFwkdmFycyhwYXJ0aXRpb25fbGlzdCkgTk9UIERFRklORUQiCiAgICAgICAgICAgICAgICAgIGV4aXQgOTkKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtwd2RdXV0gIT0gIiR2YXJzKHBhcnRpdGlvbl9kaXIpIn0gewogICAgICAgICAgICAgICAgICBGRl9OT1ZVUzo6Y2hlY2tfc2V0dXAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBGRl9OT1ZVUzo6Y2hlY2tfc2V0dXAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRkY6OnByb2Nlc3NfZmlsZV9saXN0cwogICAgICAgICB9CgogICAgICAgICAiYWxsIiB7CgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgV2UgaGF2ZSBhbHJlYWR5IHNvdXJjZWQgaW4gYWxsIG9mIHRoZSBmaWxlcy4gIE5vdyBleGVjdXRlIHRoZQogICAgICAgICAgICAjIHJlc3Qgb2YgdGhlIHN0ZXBzLCBpbmNsdWRpbmcgY2hlY2sKICAgICAgICAgICAgIwoKICAgICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgICAgcHV0cyAiPEZGPiBHZW5lcmF0aW5nIHNjcmlwdHMgZm9yICR2YXJzKGRlc2lnbikiCiAgICAgICAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgICAgIGV4ZWN1dGVfZmxvdyBjaGVjayAkZm9ybWF0ICRhYm9ydAoKICAgICAgICAgICAgc2V0IHZhcnMoc3RlcHMpIFtqb2luICR2YXJzKHN0ZXBzKV0KICAgICAgICAgICAgc2V0IHZhcnMoYWxsKSB0cnVlCiAgICAgICAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgICAgICAgaWYgeyR2YXJzKG1vZGUpID09ICJoaWVyIn0gewogICAgICAgICAgICAgICBpZiB7W2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtwd2RdXV0gPT0gIiR2YXJzKHBhcnRpdGlvbl9kaXIpIn0gewogICAgICAgICAgICAgICAgICBzZXQgYWxsX3N0ZXBzICR2YXJzKGZzdGVwcykKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGFsbF9zdGVwcyAkdmFycyhoc3RlcHMpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyEkdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKX0gewogICAgICAgICAgICAgICAgICBmaWxlIG1rZGlyICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMKICAgICAgICAgICAgICAgICAgc2V0IGZociBbb3BlbiAkdmFycyhzY3JpcHRfcGF0aCkvSU5OT1ZVUy9ydW5fYWxsLnRjbCByXSAKICAgICAgICAgICAgICAgICAgc2V0IGZodyBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTL3J1bl9hbGwudGNsIHddIAogICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGZociBsaW5lXT49MH0gewogICAgICAgICAgICAgICAgICAgICByZWdzdWIgInNvdXJjZSBGRiIgJGxpbmUgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKSIgbGluZQogICAgICAgICAgICAgICAgICAgICBwdXRzICRmaHcgIiAgICRsaW5lIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGNsb3NlICRmaHIKICAgICAgICAgICAgICAgICAgY2xvc2UgJGZodwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCBhbGxfc3RlcHMgJHZhcnMoc3RlcHMpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgIwogICAgICAgICAgICAjIEV4ZWN1dGUgZWFjaCBzdGVwIG9mIHRoZSBmbG93IGFuZCBnZXQgYSBjb21wb3NpdGUgbGlzdCBvZiB0aGUKICAgICAgICAgICAgIyBhY3R1YWwgc3RlcHMgdGhhdCBoYWQgYWN0aW9ucyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGVuIGNyZWF0ZQogICAgICAgICAgICAjIGEgTWFrZWZpbGUgZm9yIHRob3NlIHN0ZXBzCiAgICAgICAgICAgICMKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJjX3N0ZXBzKV19IHsKICAgICAgICAgICAgICAgc2V0IGFjdGlvbnMgJHZhcnMocmNfc3RlcHMpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2V0IGFjdGlvbnMgW2xpc3RdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyAKICAgICAgICAgICAgZm9yZWFjaCBzdGVwICRhbGxfc3RlcHMgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZHMgW2V4ZWN1dGVfZmxvdyAkc3RlcCAkZm9ybWF0ICRhYm9ydF0KICAgICAgICAgICAgICAgaWYgeyRjb21tYW5kcyAhPSAiIn0gewogICAgICAgICAgICAgICAgICAgbGFwcGVuZCBhY3Rpb25zICRjb21tYW5kcwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgI3NldCB2YXJzKG1ha2VfdG9vbF9hcmdzKSAiLW5vd2luIC02NCIKCiAgICAgICAgICAgIGlmIHsoJHZhcnModXNlcl9tb2RlKSA9PSAiaGllciIpICYmICgkdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIil9IHsKICAgICAgICAgICAgICAgIyBPbmx5IGdlbmVyYXRlIHN0ZXBzIHVwIHRvIChhbmQgaW5jbHVkaW5nKSBjdHMgZm9yIDJwYXNzIGZsb3dzCiAgICAgICAgICAgICAgICMgR28gYWhlYWQgYW5kIGdlbmVyYXRlIGJvdGggTWFrZWZpbGVzIGFzIHRoZSBhY3Rpb25zIGFyZSBrbm93bgogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhwbGFjZV9vcHRfZGVzaWduKX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W2ZpbGUgdGFpbCBbcHdkXV0gPT0gJHZhcnModG9wX2NlbGwpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBpbmRleCBbbHNlYXJjaCAkYWN0aW9ucyAicHJlY3RzIl0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGluZGV4IFtsc2VhcmNoICRhY3Rpb25zICJwbGFjZSJdCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGluZGV4IFtsc2VhcmNoICRhY3Rpb25zICJwcmVjdHMiXQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIEZGOjpnZW5fbWFrZWZpbGUgW2xyYW5nZSAkYWN0aW9ucyBbZXhwciAkaW5kZXgrMV0gZW5kXSAkdmFycyhtb2RlKQogICAgICAgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlIE1ha2VmaWxlIE1ha2VmaWxlLnBhc3MyCiAgICAgICAgICAgICAgICAgIEZGOjpnZW5fbWFrZWZpbGUgW2xyYW5nZSAkYWN0aW9ucyAwICRpbmRleF0gJHZhcnMobW9kZSkKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGluZGV4IFtsc2VhcmNoICRhY3Rpb25zICJjdHMiXQogICAgICAgICAgICAgICAgICBGRjo6Z2VuX21ha2VmaWxlIFtscmFuZ2UgJGFjdGlvbnMgW2V4cHIgJGluZGV4KzFdIGVuZF0gJHZhcnMobW9kZSkKICAgICAgICAgICAgICAgICAgZmlsZSBjb3B5IC1mb3JjZSBNYWtlZmlsZSBNYWtlZmlsZS5wYXNzMgogICAgICAgICAgICAgICAgICBGRjo6Z2VuX21ha2VmaWxlIFtscmFuZ2UgJGFjdGlvbnMgMCAkaW5kZXhdICR2YXJzKG1vZGUpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgRkY6Omdlbl9tYWtlZmlsZSAkYWN0aW9ucyAkdmFycyhtb2RlKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfcW9yX2NoZWNrKX0geyAKICAgICAgICAgICAgICAgRkZfTk9WVVM6Omdlbl9jaGVjawogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4ZWN1dGVfZmxvdyBkZWJ1ZyAkZm9ybWF0ICRhYm9ydAogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocnVuX2xlYyldICYmICR2YXJzKHJ1bl9sZWMpfSB7CiAgICAgICAgICAgICAgIGV4ZWN1dGVfZmxvdyBsZWMgJGZvcm1hdCAkYWJvcnQKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICJsZWMiIHsKIyAgICAgICAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiMgICAgICAgICAgICBwdXRzICI8RkY+IEdlbmVyYXRpbmcgc2NyaXB0cyBmb3IgJHZhcnMoZGVzaWduKSIKICAgICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhuZXRsaXN0KV19IHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBDYW5ub3QgZ2VuZXJhdGUgJ2xlYycgc3RlcCB3L28gdmVyaWxvZyBuZXRsaXN0IGRlZmluZWQiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHshJHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcyl9IHsKICAgICAgICAgICAgICAgICAgZmlsZSBta2RpciAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTCiAgICAgICAgICAgICAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTL3J1bl9sZWMudGNsIHddCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIvLyIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIi8vIElubm92dXMgRm91bmRhdGlvbiBGbG93IENvZGUgR2VuZXJhdG9yLCBbZXhlYyBkYXRlXSIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIi8vIgogICAgICAgICAgICAgICAgICBpZiB7JHN0ZXAgPT0gImxlYyJ9IHsKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInRjbG1vZGUiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgI3B1dHMgJG9wICJpZiB7XFtmaWxlIGV4aXN0cyAuZmYudGNsXF19IHsiCiAgICAgICAgICAgICAgICAgICNwdXRzICRvcCAiICAgc291cmNlIC5mZi50Y2wiCiAgICAgICAgICAgICAgICAgICNwdXRzICRvcCAifSIKICAgICAgICAgICAgICAgICAgc2V0IHZhcnNGaWxlIFtGRjo6cmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhzY3JpcHRfZGlyKS92YXJzLnRjbF0gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJ1bmRpcildXQogICAgICAgICAgICAgICAgICBwdXRzICRvcCAiaWYge1xbZmlsZSBleGlzdHMgJHZhcnNGaWxlXF19IHsiCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICBzb3VyY2UgJHZhcnNGaWxlIgogICAgICAgICAgICAgICAgICBwdXRzICRvcCAifSIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS9wcm9jcy50Y2wiCiAgICAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IEdlbmVyYXRpbmcgc3RlcCAkc3RlcCIKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmRzIFtGRl9OT1ZVUzo6cnVuX2xlY10KICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgW0ZGOjpwcmV0dHlfcHJpbnQgJGNvbW1hbmRzICRmb3JtYXRdCiAgICAgICAgICAgICAgICAgIGNsb3NlICRvcAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyAgICAgICAgICAgIEZGOjpnZW5fbWFrZWZpbGUgbGVjICR2YXJzKG1vZGUpCiAgICAgICAgIH0KICAgICAgICAgImRlZmF1bHQiIHsKCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBSdW4gZWFjaCBzdGVwIGVpdGhlciBzaW5ndWFybHkgb3IgcmVjdXJzaXZlbHkKICAgICAgICAgICAgIwogICAgICAgICAgICAjCiAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBsaXN0IG9mIGNvbW1hbmRzIHRoYXQgaGFwcGVuIGF0IHRoZSBiZWdpbmluZyBvZgogICAgICAgICAgICAjIGVhY2ggc2NyaXB0CiAgICAgICAgICAgICMKCiAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJHZhcnMoc3RlcHMpICRzdGVwXSA9PSAtMSkgJiYgKCRzdGVwICE9ICJkZWJ1ZyIpfSB7CiAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IEVSUk9SOiBVbmtub3duIEZvdW5kYXRpb24gRmxvdyBzdGVwIFwiJHN0ZXBcIi4iCiAgICAgICAgICAgICAgIGV4aXQgOTkKICAgICAgICAgICAgfQoKIyAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJHZhcnMoc3RlcHMpICRzdGVwXSA9PSAtMSkgJiYgKCRzdGVwICE9ICJkZWJ1ZyIpfSB7CiMgICAgICAgICAgICAgICBwdXRzICAiPEZGPiBFUlJPUjogVW5rbm93biBGb3VuZGF0aW9uIEZsb3cgc3RlcCBcIiRzdGVwXCIuIgojICAgICAgICAgICAgICAgZXhpdCA5OQojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIGlmIHsoJHZhcnMoZml4X2hvbGQpIHx8ICghJHZhcnMoZml4X2hvbGQpICYmICFbcmVnZXhwICJfaG9sZCIgJHN0ZXBdKSkgJiYKIyAgICAgICAgICAgICAgICAgICAhKCR2YXJzKHNraXBfY3RzKSAmJiAoKCRzdGVwID09ICJjdHMiKSB8fCBbcmVnZXhwICJwb3N0Y3RzIiAkc3RlcF0pKX0gewojICAgICAgICAgICAgICAgICAgcHV0cyAgIjxGRj4gR2VuZXJhdGluZyBzdGVwICRzdGVwIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQoKICAgICAgICAgICAgIwogICAgICAgICAgICAjIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd2UgY2hlY2sgdGhlIHZhcmlhYmxlIGNvbnRlbnRzIGFuZAogICAgICAgICAgICAjIGluaXRpYWxpemUgdGhlIGZsb3cgYXQgbGVhc3Qgb25jZSBpbiBhIGdpdmVuIHJ1biwgbm8gbWF0dGVyCiAgICAgICAgICAgICMgd2hhdCBzdGVwIHRoZSB1c2VyIHdhbnRzIHRvIGV4ZWN1dGUKICAgICAgICAgICAgIwoKIyAgICAgICAgICAgIHNldCBoZWFkZXIgIlxuI1xuIyBDb21tYW5kcyBmb3IgJHN0ZXBcbiNcblxuIgoKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhhbGwpXX0gewogICAgICAgICAgICAgICBleGVjdXRlX2Zsb3cgY2hlY2sgJGZvcm1hdCAkYWJvcnQKICAgICAgICAgICAgfQogICAgICAgICAgICAjIEJDTDogQ2hhbmdlZCB0byB0Y2wgZmlsZSBta2RpcgogICAgICAgICAgICBmaWxlIG1rZGlyICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMKICAgICAgICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICAgICAgICBzZXQgY29tbWFuZHMgInBvc3QtMTAuMTAtYjAwOVxuIgogICAgICAgICAgICBpZiB7ISR2YXJzKGluaXRpYWxpemVkKX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhzdGVwKSAkc3RlcAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjppbml0aWFsaXplX2Zsb3ddCiMgICAgICAgICAgICAgICB1bnNldCB2YXJzKHN0ZXApCiAgICAgICAgICAgICAgIHNldCB2YXJzKGluaXRfY29tbWFuZHMpICRjb21tYW5kcwogICAgICAgICAgICAgICBzZXQgdmFycyhpbml0aWFsaXplZCkgMQogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHdhcm5pbmdfY291bnQpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyh3YXJuaW5nX2NvdW50KSAwCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhlcnJvcl9jb3VudCldfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGVycm9yX2NvdW50KSAwCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIwogICAgICAgICAgICAjIEdldCB0aGUgY29tbWFuZHMgdG8gZXhlY3V0ZSB0aGUgc3RlcC4gIFdlIGFsc28gbmVlZCB0byBnZXQgdGhlCiAgICAgICAgICAgICMgY29tbWFuZHMgdG8gbG9hZCB0aGUgZGF0YWJhc2UgZm9yIHRoYXQgc3RlcCwgYXNzdW1pbmcgdGhhdCBhCiAgICAgICAgICAgICMgZGF0YWJhc2UgZXhpc3RzIGZyb20gYSBwcmlvciBzdGVwLiAgVGhvc2UgbG9hZCBjb21tYW5kcyBhcmUKICAgICAgICAgICAgIyBwcmVwZW5kZWQgdG8gdGhlIGV4ZWN1dGlvbiBjb21tYW5kcy4gIFNhdmUgY29tbWFuZHMgYXJlCiAgICAgICAgICAgICMgYXBwZW5kZWQKICAgICAgICAgICAgIwoKICAgICAgICAgICAgaWYge1tpbmZvIGNvbW1hbmRzIDo6RkZfTk9WVVM6OnJ1bl8kc3RlcF0gbmUgIiJ9ICB7CiAgICAgICAgICAgICAgIHNldCB0ZW1wX2NvbW1hbmRzIFtGRl9OT1ZVUzo6cnVuXyRzdGVwICRmb3JtYXRdCiAgICAgICAgICAgICAgIGlmIHskdGVtcF9jb21tYW5kcyA9PSAiIn0gewogICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHN0ZXApICE9ICJpbml0In0gewogICAgICAgICAgICAgICAgICAgICBzZXQgc3RlcF9jb21tYW5kcyAiXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMocmVwb3J0X3J1bl90aW1lKX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHtzdGVwfVxuIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAic2V0IHZhcnMoJHtzdGVwfSxzdGFydF90aW1lKSBcW2Nsb2NrIHNlY29uZHNcXVxuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEzfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICJwdXNoX3NuYXBzaG90X3N0YWNrXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICR0ZW1wX2NvbW1hbmRzCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iCiAgICAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IEdlbmVyYXRpbmcgc3RlcCAkc3RlcCIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3VzdG9tX3N0ZXBfZGlyKV19IHsKICAgICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycyhjdXN0b21fc3RlcF9kaXIpL3J1bl8ke3N0ZXB9LnRjbF19IHsKICAgICAgICAgICAgICAgICAgcHV0cyAgIjxGRj4gR2VuZXJhdGluZyBzdGVwICRzdGVwIgogICAgICAgICAgICAgICAgICBzZXQgZmhyIFtvcGVuICR2YXJzKGN1c3RvbV9zdGVwX2RpcikvcnVuXyRzdGVwLnRjbCByXQogICAgICAgICAgICAgICAgICBzZXQgc3RlcF9jb21tYW5kcyAiXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAiIyBTb3VyY2luZyBjdXN0b20gc2NyaXB0IC4uLlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHJlcG9ydF9ydW5fdGltZSkgJiYgKCRzdGVwICE9ICJpbml0Iil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHN0ZXBfY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR7c3RlcH1cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHN0ZXBfY29tbWFuZHMgInNldCB2YXJzKCR7c3RlcH0sc3RhcnRfdGltZSkgXFtjbG9jayBzZWNvbmRzXF1cbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKSAmJiAoJHZhcnMoc3RlcCkgIT0gImluaXQiKX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxM30gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAicHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIHN0ZXBfY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIKICAgICAgICAgICAgICAgICAgd2hpbGUge1tnZXRzICRmaHIgbGluZV0+PTB9IHsKICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICIkbGluZVxuIgogICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAic291cmNlICR2YXJzKGN1c3RvbV9zdGVwX2RpcikvcnVuXyRzdGVwLnRjbFxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBVbmFibGUgdG8gZ2VuZXJhdGUgc3RlcCAkc3RlcCIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkdmFycyhlcnJvcl9jb3VudCkpICJVbmFibGUgdG8gZ2VuZXJhdGUgc3RlcCAkc3RlcCAtIHByb2NlZHVyZSAncnVuXyRzdGVwJyBtdXN0IGJlIGRlZmluZWQgb3IgYSBcJHZhcnMoY3VzdG9tX3N0ZXBfZGlyKS9ydW5fJHN0ZXAudGNsIGZpbGUgbXVzdCBiZSBwcm92aWRlZCIKICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKGVycm9yX2NvdW50KQogICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBVbmFibGUgdG8gZ2VuZXJhdGUgc3RlcCAkc3RlcCIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkdmFycyhlcnJvcl9jb3VudCkpICJVbmFibGUgdG8gZ2VuZXJhdGUgc3RlcCAkc3RlcCAtIHByb2NlZHVyZSAncnVuXyRzdGVwJyBtdXN0IGJlIGRlZmluZWQgb3IgYSBcJHZhcnMoY3VzdG9tX3N0ZXBfZGlyKS9ydW5fJHN0ZXAudGNsIGZpbGUgbXVzdCBiZSBwcm92aWRlZCIKICAgICAgICAgICAgICAgaW5jciB2YXJzKGVycm9yX2NvdW50KQogICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgdGhpc19pbmRleCBbbHNlYXJjaCAkdmFycyhzdGVwcykgJHN0ZXBdCiAgICAgICAgICAgIHNldCBwcmlvciBbbGluZGV4ICR2YXJzKHN0ZXBzKSBbZXhwciAkdGhpc19pbmRleCAtIDFdXQojICAgICAgICAgICAgaWYgeyEkdmFycyhmaXhfaG9sZCkgJiYgW3JlZ2V4cCBfaG9sZCAkcHJpb3JdfSB7CiMgICAgICAgICAgICAgICBzZXQgcHJpb3IgW2xpbmRleCAkdmFycyhzdGVwcykgW2V4cHIgJHRoaXNfaW5kZXggLSAyXV0KIyAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwIF9ob2xkICRwcmlvcl19IHsKIyAgICAgICAgICAgICAgICAgIHNldCBwcmlvciBbbGluZGV4ICR2YXJzKHN0ZXBzKSBbZXhwciAkdGhpc19pbmRleCAtIDNdXQojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W3JlZ2V4cCBfaG9sZCAkcHJpb3JdICYmIChbbHNlYXJjaCAkdmFycyhmaXhfaG9sZCkgW3JlZ3N1YiBfaG9sZCAkcHJpb3IgIiJdXTwwKX0gewogICAgICAgICAgICAgICBzZXQgcHJpb3IgW2xpbmRleCAkdmFycyhzdGVwcykgW2V4cHIgJHRoaXNfaW5kZXggLSAyXV0KICAgICAgICAgICAgICAgaWYge1tyZWdleHAgX2hvbGQgJHByaW9yXSAmJiAoW2xzZWFyY2ggJHZhcnMoZml4X2hvbGQpIFtyZWdzdWIgX2hvbGQgJHByaW9yICIiXV08MCl9IHsKICAgICAgICAgICAgICAgICAgc2V0IHByaW9yIFtsaW5kZXggJHZhcnMoc3RlcHMpIFtleHByICR0aGlzX2luZGV4IC0gM11dCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeygkc3RlcCA9PSAiY3RzIikgJiYgJHZhcnMocGxhY2Vfb3B0X2Rlc2lnbil9IHsKICAgICAgICAgICAgICAgc2V0IHByaW9yICJwbGFjZSIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7KCRzdGVwID09ICJyb3V0ZSIpICYmICR2YXJzKHNraXBfY3RzKX0gewogICAgICAgICAgICAgICBzZXQgcHJpb3IgInByZWN0cyIKICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeygkc3RlcCA9PSAicm91dGUiKSAmJiBbcmVnZXhwICJeY2NvcHQiIFtzdHJpbmcgdG9sb3dlciAkdmFycyhjdHNfZW5naW5lKV1dfSB7CiMgICAgICAgICAgICAgICBzZXQgcHJpb3IgImN0cyIKIyAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tyZWdleHAgIl5jY29wdCIgW3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXV19IHsKICAgICAgICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZml4X2hvbGQpXSAhPSAiZmFsc2UiKX0gewogICAgICAgICAgICAgICAgICBpZiB7KCRzdGVwID09ICJwb3N0Y3RzX2hvbGQiKSAmJiBbbHNlYXJjaCAkdmFycyhmaXhfaG9sZCkgJHN0ZXBdfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBwcmlvciBjdHMKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgeygkc3RlcCA9PSAicm91dGUiKX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgcHJpb3IgY3RzCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7KCRzdGVwID09ICJyb3V0ZSIpfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBwcmlvciBjdHMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldCB0aGlzX2luZGV4IFtsc2VhcmNoIFtGRjo6YWRqdXN0X3N0ZXBzXSAkc3RlcF0KICAgICAgICAgICAgc2V0IHByaW9yIFtsaW5kZXggW0ZGOjphZGp1c3Rfc3RlcHNdIFtleHByICR0aGlzX2luZGV4IC0gMV1dCgogICAgICAgICAgICBzZXQgbm9fZGJfc3RlcHMgW2xpc3QgImluaXQiICJyZWJ1ZGdldCIgImZsZXhpbG0iICJhc3NlbWJsZSIgImFzc2VtYmxlX2ZsZXhpbG0iICJkZWJ1ZyJdCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1c2VfZmxleG1vZGVscyldICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewogICAgICAgICAgICAgICBsYXBwZW5kIG5vX2RiX3N0ZXBzICJtb2RlbF9nZW4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGxhcHBlbmQgbm9fZGJfc3RlcHMgImZlZWR0aHJvdWdoIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJG5vX2RiX3N0ZXBzICRzdGVwXSA9PSAtMSkgJiYgKCRwcmlvciAhPSAiIil9IHsKICAgICAgICAgICAgICAgc2V0IGxvYWRfY29tbWFuZHMgW0ZGX05PVlVTOjpsb2FkX2Rlc2lnbiAkcHJpb3IgJHN0ZXBdCiMgICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kcyBbbGluZGV4IFtGRl9OT1ZVUzo6bG9hZF9kZXNpZ24gJGZvcm1hdCAkcHJpb3JdIDFdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBsb2FkX2NvbW1hbmRzICIiCiMgICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kcyAiIgogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7ISR2YXJzKGxvYWRlZCl9IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMobG9hZGVkKSAxCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkbG9hZF9jb21tYW5kcwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vZGVsX2dlbiBzYXZlcyBpdHMgZGF0YWJhc2UgZXhwbGljaXRseQojICAgICAgICAgICAgc2V0IG5vX3NhdmVfc3RlcHMgW2xpc3QgImRlYnVnIiAibW9kZWxfZ2VuIl0KICAgICAgICAgICAgc2V0IG5vX3NhdmVfc3RlcHMgW2xpc3QgImRlYnVnIl0KICAgICAgICAgICAgaWYge1tsc2VhcmNoICRub19zYXZlX3N0ZXBzICRzdGVwXSA9PSAtMX0gewogICAgICAgICAgICAgICBzZXQgc2F2ZV9jb21tYW5kcyBbRkZfTk9WVVM6OnNhdmVfcmVzdWx0cyAkc3RlcCAkZm9ybWF0XQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgc2F2ZV9jb21tYW5kcyAiIgogICAgICAgICAgICB9CgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgV3JpdGUgdGhlIGNvbW1hbmRzIHRvIGEgZmlsZSwgbmFtZWQgZm9yIHRoZSBzdGVwIHdlIGFyZQogICAgICAgICAgICAjIGV4ZWN1dGluZwogICAgICAgICAgICAjCgojICAgICAgICAgICAgaWYgeyEkdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKX0gewogICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXnN5biIgJHN0ZXBdfSB7CiAgICAgICAgICAgICAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikvR0VOVVMKICAgICAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0dFTlVTL3J1bl8ke3N0ZXB9LnRjbCB3XQogICAgICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuXyR7c3RlcH0udGNsIHddCiAgICAgICAgICAgICAgIH0KCiAgICMgICAgICAgICAgICBpZiB7JHZhcnMoZGVidWcpfSB7CiAgICMgICAgICAgICAgICAgICBwdXRzICI8REVCVUc+IE9wZW5pbmcgZmlsZTogJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy9ydW5fJHtzdGVwfS50Y2wgaW4gW2V4ZWMgcHdkXSAtPiAkb3AiCiAgICMgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBwdXRzICRvcCBbc3RyaW5nIHJlcGVhdCAiIyIgNjhdCiAgICAgICAgICAgICAgIHB1dHMgJG9wICIjIElubm92dXMgRm91bmRhdGlvbiBGbG93IENvZGUgR2VuZXJhdG9yLCBbZXhlYyBkYXRlXSIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIiMgVmVyc2lvbiA6IDE3LjEwLXAwMDNfMSIKICAgICAgICAgICAgICAgcHV0cyAkb3AgW3N0cmluZyByZXBlYXQgIiMiIDY4XQogICAKICAgICAgICAgICAgICAgaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSJ9IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnNGaWxlIFtGRjo6cmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhzY3JpcHRfZGlyKS92YXJzLnRjbF0gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJ1bmRpcildXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgdmFyc0ZpbGUgJHZhcnMoc2NyaXB0X2RpcikvdmFycy50Y2wKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICRvcCAiXG5pZiB7XFtmaWxlIGV4aXN0cyAkdmFyc0ZpbGVcXX0geyIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHNvdXJjZSAkdmFyc0ZpbGUiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJ9IgogICAgICAgICAgICAgICAjcHV0cyAkb3AgImlmIHtcW2ZpbGUgZXhpc3RzIFwkdmFycyhzY3JpcHRfZGlyKS92YXJzLnRjbFxdfSB7IgogICAgICAgICAgICAgICAjcHV0cyAkb3AgIiAgIHNvdXJjZSBcJHZhcnMoc2NyaXB0X2RpcikvdmFycy50Y2wiCiAgICAgICAgICAgICAgICNwdXRzICRvcCAifVxuIgogICAgICAgICAgICAgICBpZiB7ISR2YXJzKGZyZWV6ZV92YXJzKX0gewogICAgICAgICAgICAgICAgICBpZiB7KFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSIpICYmICFbcmVnZXhwIHN5bl8gJHN0ZXBdfSB7CiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJmb3JlYWNoIGZpbGUgXCR2YXJzKGNvbmZpZ19maWxlcykgeyIKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHNvdXJjZSBcJGZpbGUiCiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJ9XG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICRvcCAic291cmNlIFwkdmFycyhzY3JpcHRfZGlyKS9wcm9jcy50Y2wiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJzb3VyY2UgJHZhcnMoc2NyaXB0X2RpcikvcHJvY3MudGNsIgogICAgICAgICAgICAgICBpZiB7ISRmb3JtYXR9IHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgJGhlYWRlcgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHJlZ3N1YiAtYWxsICJpbml0LCIgJHZhcnMoaW5pdF9jb21tYW5kcykgIiRzdGVwLCIgY29tbWFuZHMKICAgICAgICAgICAgICAgc2V0IG9mIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLmhlYWQgd10KICAgICAgICAgICAgICAgcHV0cyAkb2YgW0ZGOjpwcmV0dHlfcHJpbnQgJHZhcnMoaW5pdF9jb21tYW5kcykgJGZvcm1hdF0KICAgICAgICAgICAgICAgY2xvc2UgJG9mIAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGxvYWRfY29tbWFuZHMgJHN0ZXBfY29tbWFuZHMgJHNhdmVfY29tbWFuZHMKICAgIyAgICAgICAgICAgIHNldCBjb21tYW5kcyAiIgogICAjICAgICAgICAgICAgaWYgeygkc3RlcCAhPSAicGFydGl0aW9uIikgJiYgKCRzdGVwICE9ICJyZWJ1ZGdldCIpICYmICgkc3RlcCAhPSAiZmxleGlsbSIpfSB7CiAgICMgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgX2hvbGQgJHN0ZXBdfSB7CiAgICMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGxvYWRfY29tbWFuZHMgJHN0ZXBfY29tbWFuZHMgJHNhdmVfY29tbWFuZHMKICAgIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICMjICAgICAgICAgICAgICAgICAgaWYgeyEoW2xzZWFyY2ggJHZhcnMoZml4X2hvbGQpIFtyZWdzdWIgX2hvbGQgJHN0ZXAgIiJdXTwwKX0gewogICAjIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkc3RlcF9jb21tYW5kcwogICAjIyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGxvYWRfY29tbWFuZHMgJHN0ZXBfY29tbWFuZHMgJHNhdmVfY29tbWFuZHMKICAgIyMgICAgICAgICAgICAgICAgICB9CiAgICMgICAgICAgICAgICAgICB9CiAgICMjICAgICAgICAgICAgICAgaWYgeyRzdGVwID09ICJkZWJ1ZyJ9IHsKICAgIyMgICAgICAgICAgICAgICAgICBzZXQgdmFycyhzdGVwKSBkZWJ1ZwogICAjIyAgICAgICAgICAgICAgIH0KICAgIyAgICAgICAgICAgIH0gZWxzZSB7CiAgICMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGxvYWRfY29tbWFuZHMgJHN0ZXBfY29tbWFuZHMKICAgIyAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKGJzdGVwcykgJHN0ZXAKICAgICAgICAgICAgICAgc2V0IG9mIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLmxvYWRfJHN0ZXAgd10KICAgIyAgICAgICAgICAgIHB1dHMgJG9mIFtGRjo6cHJldHR5X3ByaW50ICRyZXN0b3JlX2NvbW1hbmRzICRmb3JtYXRdCiAgICAgICAgICAgICAgIHB1dHMgJG9mIFtGRjo6cHJldHR5X3ByaW50ICRsb2FkX2NvbW1hbmRzICRmb3JtYXRdCiAgICAgICAgICAgICAgIGNsb3NlICRvZgogICAgICAgICAgICAgICBzZXQgb2YgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy8uJHN0ZXAgd10KICAgICAgICAgICAgICAgcHV0cyAkb2YgW0ZGOjpwcmV0dHlfcHJpbnQgJHN0ZXBfY29tbWFuZHMgJGZvcm1hdF0KICAgICAgICAgICAgICAgcHV0cyAkb2YgW0ZGOjpwcmV0dHlfcHJpbnQgJHNhdmVfY29tbWFuZHMgJGZvcm1hdF0KICAgICAgICAgICAgICAgY2xvc2UgJG9mCiAgICMgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicG9zdHJvdXRlX3NpIiAkc3RlcF0gJiYgJHNraXBfY29tbWFuZHMgIT0gIiJ9IHsKICAgIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kcyAkc2tpcF9jb21tYW5kcwogICAjICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7ISRmb3JtYXR9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmRzIFtGRjo6c3RyaXBfbGluZXMgJGNvbW1hbmRzIFtsaXN0ICJwdXRzIiAiIyJdXQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskdmFycyhjYXRjaF9lcnJvcnMpICYmICgkc3RlcCAhPSAiZGVidWciKX0gewogICAgICAgICAgICAgICAgICBwdXRzICRvcCAiXG5pZiB7IFxbY2F0Y2gge1xuIgogICAgICAgICAgICAgICAgICBwdXRzICRvcCBbRkY6OnByZXR0eV9wcmludCAkY29tbWFuZHMgJGZvcm1hdF0KICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIn0gc3RlcF9lcnJvclxdfSB7XG4iCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICBwdXRzIFwiPEZGPiA9PT09PT09PT09PSBTVEVQIEVYRUNVVElPTiBFUlJPUiA9PT09PT09PT09PT1cIiIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHB1dHMgXCI8RkY+IEVSUk9SIFJVTk5JTkcgU1RFUCAnJHN0ZXAnXCIiCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhzYXZlX29uX2NhdGNoKX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXnN5biIgJHZhcnMoc3RlcCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHdyaXRlX2RiICR2YXJzKGRlc2lnbikgLWFsbF9yb290X2F0dHJpYnV0ZXMgLXRvX2ZpbGUgJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkuY2F0Y2guZGJcbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiICAgcHV0cyBcIjxGRj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCIiCiAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHB1dHMgXCI8RkY+IC4uLiBTQVZJTkcgREVTSUdOIFRPICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLmNhdGNoLmVuY1wiIgogICAgICAgICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHdyaXRlX2RiIC1vYV9saWJfY2VsbF92aWV3IHskdmFycyhvYV9kZXNpZ25fbGliKSAkdmFycyhkZXNpZ24pICR2YXJzKHN0ZXApLmNhdGNofVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHNhdmVPYURlc2lnbiAkdmFycyhvYV9kZXNpZ25fbGliKSAkdmFycyhkZXNpZ24pICR2YXJzKHN0ZXApLmNhdGNoXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHdyaXRlX2RiICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLmNhdGNoLmVuY1xuIgogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICBwdXRzICRvcCAiICAgcHV0cyBcIjxGRj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCIiCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICBwdXRzIFwiPEZGPiBcJHN0ZXBfZXJyb3JcIiIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHB1dHMgXCI8RkY+IC0tLS0tLS0tLS0tLS0tLS0tLS0gREVUQUlMUyAtLS0tLS0tLS0tLS0tLS0tLS1cIiIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHB1dHMgXCI8RkY+IFwkZXJyb3JJbmZvXCIiCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICBwdXRzIFwiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhiYXRjaCl9IHsKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIGV4aXQgLTEiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIn0iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wIFtGRjo6cHJldHR5X3ByaW50ICRjb21tYW5kcyAkZm9ybWF0XQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskdmFycyhiYXRjaCkgJiYgKCRzdGVwICE9ICJkZWJ1ZyIpfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJpZiB7IVxbaW5mbyBleGlzdHMgdmFycyhzaW5nbGUpXF19IHtcbiAgIGV4aXQgMFxufVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlICRvcAojICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0IHNjb21tYW5kcyBbc3BsaXQgJGNvbW1hbmRzICJcbiJdCgogICAgICAgICAgICBpZiB7JHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcyl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcykgIlxuY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSAkc3RlcCBce1xuIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaHN0ZXBzKV0gJiYgKFtsc2VhcmNoICR2YXJzKGhzdGVwcykgJHN0ZXBdICE9IC0xKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGhpZXIpICJcbmNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgJHN0ZXAgXHtcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG5jcmVhdGVfZmxvd19zdGVwIC1uYW1lICRzdGVwIFx7XG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IHNraXAgMAogICAgICAgICAgICAgICBmb3JlYWNoIGxpbmUgJHNjb21tYW5kcyB7CiAgICAgICAgICAgICAgICAgIGlmIHskc2tpcCAhPSAwfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBza2lwIFtleHByICRza2lwLTFdCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgZmZfcHJvY3MgJGxpbmVdfSB7IGNvbnRpbnVlIH0KIyAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICIjIiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiRVJST1IgTE9BRElORyBEQVRBQkFTRSIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgIlBsdWdpbiAtPiIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KIyAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJQdXRzIiAkbGluZV19IHsgcmVnc3ViIFB1dHMgJGxpbmUgcHV0cyBsaW5lIH0KIyAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJQdXRzIFwiPEZGPiIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgIlZQQVRIIiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAic2V0IHZhcnMiICRsaW5lXSAmJiAhW3JlZ2V4cCAiLHBvc3RfY3RzX3NkYyIgJGxpbmVdICYmICFbcmVnZXhwICJhY3RpdmVfcmNfY29ybmVycyIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgaWYgeygkc3RlcCA9PSAiaW5pdCIpICYmICR2YXJzKHJjKX0gewojICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgInJlYWRfbW1tYyIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KIyAgICAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJyZWFkX25ldGxpc3QiICRsaW5lXX0geyBjb250aW51ZSB9CiMgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicmVhZF9waHlzaWNhbCIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KIyAgICAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJpbml0X2Rlc2lnbiIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgInJlYWRfbW1tYyIgJGxpbmVdfSB7IHJlZ3N1YiByZWFkX21tbWMgJGxpbmUgIiNyZWFkX21tbWMiIGxpbmUgfQogICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicmVhZF9uZXRsaXN0IiAkbGluZV19IHsgcmVnc3ViIHJlYWRfbmV0bGlzdCAkbGluZSAiI3JlYWRfbmV0bGlzdCIgbGluZSB9CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJyZWFkX3BoeXNpY2FsIiAkbGluZV19IHsgcmVnc3ViIHJlYWRfcGh5c2ljYWwgJGxpbmUgIiNyZWFkX3BoeXNpY2FsIiBsaW5lIH0KICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgImluaXRfZGVzaWduIiAkbGluZV19IHsgcmVnc3ViIGluaXRfZGVzaWduICRsaW5lICIjaW5pdF9kZXNpZ24iIGxpbmUgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHskc3RlcCAhPSAiaW5pdCJ9IHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgInJlc3RvcmVfZGVzaWduIiAkbGluZV19IHsgc2V0IHNraXAgNzsgY29udGludWUgfQogICAgICAgICAgICAgICAgICAgICBpZiB7ISgoJHN0ZXAgPT0gImN0cyIpICYmICR2YXJzKGVuYWJsZV9mbGV4aWxtKSl9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJyZWFkX2RiIiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICAgICB9ICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgInJlYWRfZGIiICRsaW5lXX0gewojICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBsaW5lIFtzdHJpbmcgdHJpbSBbbGluZGV4ICRsaW5lIDJdXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGxpbmUgInJlYWRfZGIgXFtmaWxlIHRhaWwgXFtwd2RcXVxdX3Bvc3RfZWNvLmVuY1xuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAid3JpdGVfZGIgIiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAibWV0cmljIiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAic25hcHNob3QiICRsaW5lXX0geyBjb250aW51ZSB9CiAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJyZXBvcnRfbWV0cmljIiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7JGxpbmUgPT0gIiJ9IHsgY29udGludWUgfQojaWYgeyRzdGVwID09ICJpbml0In0geyBwdXRzICRsaW5lIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcykgIlx0JGxpbmVcbiIKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhoc3RlcHMpICRzdGVwXSAhPSAtMSl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxoaWVyKSAiXHQkbGluZVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcdCRsaW5lXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzKSAiXH1cbiIKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhoc3RlcHMpICRzdGVwXSAhPSAtMSl9IHsKICAgICAgICAgICAgICAgICAgaWYgeyRzdGVwID09ICJwYXJ0aXRpb24ifSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggcCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGhpZXIpICJcblx0c2NoZWR1bGVfZmxvdyAtZmxvdyBibG9jayAtZGlyZWN0b3J5ICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7JHN0ZXAgPT0gImFzc2VtYmxlX2ZsZXhpbG0ifSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggcCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGhpZXIpICJcblx0c2NoZWR1bGVfZmxvdyAtZmxvdyBibG9jayAtZGlyZWN0b3J5ICR2YXJzKHBhcnRpdGlvbl9kaXIpX1BSRUNUUy8kcFxuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeygkc3RlcCA9PSAiYXNzZW1ibGUiKSB8fCAoJHN0ZXAgPT0gInBhcnRpdGlvbiIpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB2YXJzKGZsb3dfc3RlcHMsaGllcikgIlxuXH0gXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IAogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGhpZXIpICJcblx9XG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYgeyhbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikiKX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7JHN0ZXAgPT0gInNpZ25vZmYifSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHZhcnMoZGVzaWduKV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG5cdHNjaGVkdWxlX2Zsb3cgLWZsb3cgZmluYWxfYXNzZW1ibHkgLWRpcmVjdG9yeSAuLi8uLiAtbm9fZGJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG5cdHNjaGVkdWxlX2Zsb3cgLWZsb3cgdG9wIC1kaXJlY3RvcnkgJHZhcnMocGFydGl0aW9uX2RpcilfUFJFQ1RTLyR2YXJzKHRvcF9jZWxsKVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcblx0c2NoZWR1bGVfZmxvdyAtZmxvdyB0b3AgLWRpcmVjdG9yeSAuLi8kdmFycyh0b3BfY2VsbCkgLW5vX2RiIC1zeW5jXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcblx0c2NoZWR1bGVfZmxvdyAtZmxvdyB0b3AgLWRpcmVjdG9yeSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kdmFycyh0b3BfY2VsbClcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG5cdHNjaGVkdWxlX2Zsb3cgLWZsb3cgdG9wIC1kaXJlY3RvcnkgLi4vJHZhcnModG9wX2NlbGwpIC1ub19kYiAtc3luY1xuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiB7JHN0ZXAgPT0gInByZWN0cyIgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHZhcnMoZGVzaWduKV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG5cdHNjaGVkdWxlX2Zsb3cgLWZsb3cgaW50ZXJtZWRpYXRlX2Fzc2VtYmx5XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB2YXJzKGZsb3dfc3RlcHMsZmxhdCkgIlxuXHRzY2hlZHVsZV9mbG93IC1mbG93IHRvcCAtZGlyZWN0b3J5ICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKHRvcF9jZWxsKVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgc3luXyAkc3RlcF19IHsgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhyYyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9yY3ApICYmICgkc3RlcCA9PSAic3luX3BsYWNlIil9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG5cdHNjaGVkdWxlX2Zsb3cgLWZsb3cgaW5ub3Z1cyAtZGIgXCIkdmFycyhkYnNfZGlyKS9zeW5fcGxhY2Uvc3luX3BsYWNlLmVuY19zZXR1cC50Y2xcIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiB7ISR2YXJzKGVuYWJsZV9yY3ApICYmICgkdmFycyhzdGVwKSA9PSAic3luX2luY3IiKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcblx0c2NoZWR1bGVfZmxvdyAtZmxvdyBpbm5vdnVzIC1kYiBcIiR2YXJzKGRic19kaXIpL3N5bl9pbmNyL3N5bl9pbmNyLmVuY19zZXR1cC50Y2xcIlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gCiMgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcfVxuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXH1cbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB2YXJzKGZsb3dfc3RlcHMsZmxhdCkgIlx9XG4iCiAgICAgICAgICAgICAgIH0gICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGFjdGlvbiAkc3RlcAogICAgICAgICB9CiAgICAgIH0KCiAgICAgICMKICAgICAgIyBDcmVhdGUgYSBmaWxlIHRoYXQgc2V0cyB1cCBhbGwgb2YgdGhlIHZhcmlhYmxlIHNldHRpbmdzIHRoYXQgd2VyZQogICAgICAjIHVzZWQgaW4gdGhpcyBpbnZvY2F0aW9uCiAgICAgICMKCiAgICAgIHJldHVybiAkYWN0aW9uCiAgIH0KCiAgIHByb2MgaW5zZXJ0X2NvbW1lbnRzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgY29tbWVudHMgIiIKICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCiAgICAgIGFwcGVuZCBjb21tZW50cyAiIyBWYXJpYWJsZXMgYWZmZWN0aW5nIHRoaXMgc3RlcDpcbiIKICAgICAgYXBwZW5kIGNvbW1lbnRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjb21tZW50cyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAkdmFycyhjb21tZW50cykKICAgICAgICAgdW5zZXQgdmFycyhjb21tZW50cykKICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjICAgIE5vIHZhcmlhYmxlcyBkZWZpbmVkIGZvciB0aGlzIHN0ZXAgLi4uXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1Y29tbWVudHMpXX0gewogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgQWRkaXRpb25hbCB2YXJpYWJsZXMgZm9yIHRoaXMgc3RlcDpcbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAkdmFycyh1Y29tbWVudHMpCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIgogICAgICAgICB1bnNldCB2YXJzKHVjb21tZW50cykKICAgICAgfQogICAgICByZXR1cm4gJGNvbW1lbnRzCiAgIH0KCiAgIHByb2MgcnVuX2FsbCB7fSB7CiAKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIHNldCB0aW1lIDAKICAgICAgc2V0IGluZGV4IDAKICAgICAgc2V0IHN0b3Bfc3RlcCBzaWdub2ZmCiAgICAgIHNldCB2YXJzKGNvZGVnZW4pIGZhbHNlCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModnBhdGgpXX0geyBzZXQgdmFycyh2cGF0aCkgbWFrZSB9CiAgICAgIAogICAgICBmb3JlYWNoIHN0ZXAgJHZhcnMoc3RlcHMpIHsKICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyh2cGF0aCkvJHN0ZXBdfSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBtdGltZSAkdmFycyh2cGF0aCkvJHN0ZXBdID4gJHRpbWV9IHsKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggJHZhcnMoc3RlcHMpICRpbmRleF0gPT0gInNpZ25vZmYifSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gU1RFUCBzaWdub2ZmIENPTVBMRVRFIC4uLiBOT1RISU5HIFRPIERPIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgc3RhcnRfc3RlcCBbbGluZGV4ICR2YXJzKHN0ZXBzKSBbZXhwciAkaW5kZXggKyAxXV0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBzdGFydF9zdGVwICRzdGVwCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIH0KICAgICAgICAgaW5jciBpbmRleAogICAgICB9CiAgICAgIAogICAgICBwdXRzICI8RkY+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICBpZiB7JHN0YXJ0X3N0ZXAgPT0gJHN0b3Bfc3RlcH0gewogICAgICAgICBwdXRzICI8RkY+IFJVTk5JTkcgU1RFUCAkc3RhcnRfc3RlcCAuLi4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHB1dHMgIjxGRj4gUlVOTklORyBTVEVQICRzdGFydF9zdGVwIHRocm91Z2ggJHN0b3Bfc3RlcCAuLi4iCiAgICAgIH0KICAgICAgcHV0cyAiPEZGPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgc2xlZXAgNQogICAgICAKICAgICAgIwogICAgICAjIEVtdWxhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlICJtYWtlIiBwcm9ncmFtLiAgSWYgYSBmaWxlIGRvZXNuJ3QgZXhpc3QsCiAgICAgICMgb3IgaWYgaXQncyBwcmVkZWNlc3NvciBzdGVwIGhhcyBleGVjdXRlZCBtb3JlIHJlY2VudGx5LCBydW4gdGhlIGN1cnJlbnQKICAgICAgIyBzdGVwIGFuZCB1cGRhdGUgdGhlIHRpbWUvZGF0ZSBzdGFtcHMgb2YgdGhlIGZpbGVzIHdlIHRyYWNrIHByb2dyZXNzIHdpdGgKICAgICAgIwogICAgICAKICAgICAgc2V0IHZhcnMoc3RvcF9zdGVwKSAkc3RvcF9zdGVwCiAgICAgIAogICAgICBzZXQgbGFzdF9zdGVwICIiCiAgICAgIHNldCB2YXJzKHJlc3RvcmVfZGVzaWduKSAxCiAgICAgIGlmIHskdmFycyhlbmFibGVfcW9yX2NoZWNrKX0gewogICAgICAgICBzZXQgY2hlY2tfcW9yICR2YXJzKHNjcmlwdF9kaXIpL2NoZWNrX3Fvci50Y2wKICAgICAgfQogICAgICBleGVjIG1rZGlyIC1wIG1ha2UKICAgICAgZm9yZWFjaCBzdGVwICR2YXJzKHN0ZXBzKSB7CiAgICAgICAgIHNldCB2YXJzKHN0ZXApICRzdGVwCiAgICAgICAgIHB1dHMgIjxGRj4gU1RFUCAkdmFycyhzdGVwKSAuLi4iCiAgICAgICAgIHNldCB0aGlzX3NlbWFwaG9yZSAiJHZhcnModnBhdGgpLyRzdGVwIgogICAgICAgICBzZXQgbGFzdF9zZW1hcGhvcmUgIiR2YXJzKHZwYXRoKS8kbGFzdF9zdGVwIgogICAgICAKICAgICAgICAgc2V0IHJ1bl9zdGVwIGZhbHNlCiAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICR0aGlzX3NlbWFwaG9yZV19IHsKICAgICAgICAgICAgc2V0IHJ1bl9zdGVwIHRydWUKICAgICAgICAgfSBlbHNlaWYgeyRsYXN0X3N0ZXAgIT0gIiJ9IHsKICAgICAgICAgICAgZmlsZSBzdGF0ICR0aGlzX3NlbWFwaG9yZSB0aGlzX3N0YXQKICAgICAgICAgICAgZmlsZSBzdGF0ICRsYXN0X3NlbWFwaG9yZSBsYXN0X3N0YXQKICAgICAgICAgICAgaWYgeyR0aGlzX3N0YXQobXRpbWUpIDwgJGxhc3Rfc3RhdChtdGltZSl9IHsKICAgICAgICAgICAgICAgc2V0IHJ1bl9zdGVwIHRydWUKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIAogICAgICAgICAjCiAgICAgICAgICMgQ2hlY2sgdGhlIHF1YWxpdHkgb2YgcmVzdWx0cyBmcm9tIHRoZSBsYXN0IHN0ZXAuICBJZiB0aGUgcmVzdWx0cyBhcmVuJ3QKICAgICAgICAgIyBhcyBleHBlY3RlZCwgZG9uJ3QgcHJvY2VlZCB0byB0aGUgbmV4dCBzdGVwCiAgICAgICAgICMKICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9xb3JfY2hlY2spfSB7CiAgICAgICAgICAgIGlmIHskc3RlcCAhPSAiaW5pdCJ9IHsKICAgICAgICAgICAgICAgc2V0IHFvciBbY2F0Y2gge2V4ZWMgJGNoZWNrX3FvciAkbGFzdF9zZW1hcGhvcmV9IG1zZ10KICAgICAgICAgICAgICAgaWYgeyRxb3J9IHsKICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBFUlJPUjogUU9SIFJFU1VMVCBDSEVDSyBJTkRJQ0FURVMgQSBQUk9CTEVNIElOIFNURVAgJGxhc3Rfc3RlcCIKICAgICAgICAgICAgICAgICAgZXhpdCAtMTExCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIAogICAgICAgICBzZXQgbGFzdF9zdGVwICRzdGVwCiAgICAgICAgIGlmIHshJHJ1bl9zdGVwfSB7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIH0KICAgICAgCiAgICAgICAgICMKICAgICAgICAgIyBTb3VyY2UgdGhlIGNvbnRyb2wgZmlsZSB0aGF0IHJ1bnMgdGhlIHN0ZXAuICBJZiBpdCBoYWQgYW4gZXJyb3IsIGV4aXQKICAgICAgICAgIyBpbW1lZGlhdGVseS4gIE90aGVyd2lzZSwgdXBkYXRlIHRoZSB0aW1lL2RhdGUgc3RhbXAgb2YgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgIwogICAgICAgICAjCiAgICAgIAogICAgICAgICBpZiB7W2NhdGNoIHtGRl9OT1ZVUzo6cnVuXyRzdGVwfSBtZXNzYWdlXX0gewogICAgICAgICAgICBwdXRzICRtZXNzYWdlCiAgICAgICAgICAgIGV4aXQgLTExMQogICAgICAgICB9CiAgICAgICAgIHNldCB2YXJzKHJlc3RvcmVfZGVzaWduKSAwCiAgICAgIAogICAgICAgICAjCiAgICAgICAgICMgSWYgdGhlcmUgaXMgYSBRT1IgY2hlY2sgZmlsZSBmb3IgdGhpcyBzdGVwLCBleGVjdXRlIGl0IGFuZCBwbGFjZSB0aGUKICAgICAgICAgIyByZXN1bHQgaW50byB0aGUgbWFrZSBmaWxlLiAgT3RoZXJ3aXNlIGp1c3QgdG91Y2ggdGhlIGZpbGUKICAgICAgICAgIwogICAgICAKICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9xb3JfY2hlY2spfSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc3RlcCxxb3JfdGNsXX0gewogICAgICAgICAgICAgICBzZXQgcW9yX2ZpbGUgJHZhcnMoJHN0ZXAscW9yX3RjbCkKICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkcW9yX2ZpbGVdfSB7CiAgICAgICAgICAgICAgICAgIHNldCBxb3IgW2NhdGNoIHtleGVjICRxb3JfZmlsZX0gbXNnXQogICAgICAgICAgICAgICAgICBzZXQgbWFrZV9maWxlIFtvcGVuICR0aGlzX3NlbWFwaG9yZSB3XQogICAgICAgICAgICAgICAgICBwdXRzICRtYWtlX2ZpbGUgIiRxb3IiCiAgICAgICAgICAgICAgICAgIGNsb3NlICRtYWtlX2ZpbGUKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXhlYyAvYmluL3RvdWNoICR0aGlzX3NlbWFwaG9yZQogICAgICAKICAgICAgICAgaWYgeyRzdGVwID09ICRzdG9wX3N0ZXB9IHsKICAgICAgICAgICAgcHV0cyAiPEZGPiBEb25lIiAKICAgICAgICAgfQogICAgICB9CiAgIH0KCiAgIHByb2MgbG9hZF9wb3dlcl9pbnRlbnQge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV19IHsKICAgICAgICAgaWYge1tmaWxlIGV4dGVuc2lvbiAkdmFycyhjcGZfZmlsZSldID09ICIuY3BmZGIifSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX3Bvd2VyX2ludGVudCAtbXN2REIgJHZhcnMoY3BmX2ZpbGUpXG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX3Bvd2VyX2ludGVudCAtY3BmICR2YXJzKGNwZl9maWxlKVxuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZWFkX3Bvd2VyX2ludGVudCAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgImNvbW1pdF9wb3dlcl9pbnRlbnQiCiAgICAgICAgIGlmIHskdmFycyhjcGZfcG93ZXJfZG9tYWluKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1wb3dlcl9kb21haW4iCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9rZWVwX3Jvd3MpXSAmJiAkdmFycyhjcGZfa2VlcF9yb3dzKX0gewogICAgICAgICAgIGlmIHskdmFycyhub3Z1cyl9IHsKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1rZWVwX3Jvd3MiCiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1rZWVwUm93cyIKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKGNwZl9pc29sYXRpb24pfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWlzb2xhdGlvbiIKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoY3BmX3N0YXRlX3JldGVudGlvbil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtc3RhdGVfcmV0ZW50aW9uIgogICAgICAgICB9CiAgICAgICAgIGlmIHskdmFycyhjcGZfbGV2ZWxfc2hpZnRlcil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGV2ZWxfc2hpZnRlciIKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoY3BmX3Bvd2VyX3N3aXRjaCl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG93ZXJfc3dpdGNoIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNvbW1pdF9wb3dlcl9pbnRlbnQgJGNvbW1hbmRdCiAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycyhpZWVlMTgwMV9maWxlKV19IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInJlYWRfcG93ZXJfaW50ZW50ICR2YXJzKGllZWUxODAxX2ZpbGUpIC0xODAxXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZWFkX3Bvd2VyX2ludGVudCAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgImNvbW1pdF9wb3dlcl9pbnRlbnQiCiAgICAgICAgIGlmIHskdmFycyhpZWVlMTgwMV9wb3dlcl9kb21haW4pfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvd2VyX2RvbWFpbiIKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWVlZTE4MDFfa2VlcF9yb3dzKV0gJiYgJHZhcnMoaWVlZTE4MDFfa2VlcF9yb3dzKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1rZWVwUm93cyIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjb21taXRfcG93ZXJfaW50ZW50ICRjb21tYW5kXQogICAgICB9CiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQoKICAgcHJvYyBkdW1wX25vdnVzX2F0dHJpYnV0ZXMge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIHNldCBtYXAoYWN0aXZpdHlfZmlsZV9mb3JtYXQpICIjIHJlYWRfYWN0aXZpdHlfZmlsZSA8ZmlsZT4gLWZvcm1hdCIgCiAgICAgIHNldCBtYXAoYXNzaWduX2J1ZmZlcikgZGVmdW5jdAogICAgICBzZXQgbWFwKGJ1ZGdldF9tb2RlKSAic2V0X2RiIGJ1ZGdldF92aXJ0dWFsX29wdF9lbmdpbmUiCiAgICAgIHNldCBtYXAoY2FwdHVyZV9tZXRyaWNzKSAiIyBlbmFibGVfbWV0cmljcyAtb24iCiAgICAgIHNldCBtYXAoY2NvcHRfZWZmb3J0KSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoY2NvcHRfaW50ZWdyYXRpb24pIGRlZnVuY3QKICAgICAgc2V0IG1hcChjZGJfZmlsZSkgZGVmdW5jdAogICAgICBzZXQgbWFwKGNsa19sZWFmX2JvdHRvbV9sYXllcikgIiMgY3JlYXRlX3JvdXRlX3R5cGUgLW5hbWUgbGVhZiAtYm90dG9tX3ByZWZlcnJlZF9sYXllciA8bGF5ZXI+IC10b3BfcHJlZmVycmVkX2xheWVyIDxsYXllcj4gLXNoaWVsZF9uZXQgPG5ldD4gLW5vbl9kZWZhdWx0X3J1bGUgPG5kcj4iCiAgICAgIHNldCBtYXAoY2xrX2xlYWZfdG9wX2xheWVyKSAiIyBjcmVhdGVfcm91dGVfdHlwZSAtbmFtZSBsZWFmIC1ib3R0b21fcHJlZmVycmVkX2xheWVyIDxsYXllcj4gLXRvcF9wcmVmZXJyZWRfbGF5ZXIgPGxheWVyPiAtc2hpZWxkX25ldCA8bmV0PiAtbm9uX2RlZmF1bHRfcnVsZSA8bmRyPiIKICAgICAgc2V0IG1hcChjbGtfbWF4X3NrZXcpICJzZXRfZGIgY3RzX3RhcmdldF9za2V3IgogICAgICBzZXQgbWFwKGNsa19tYXhfc2xldykgInNldF9kYiBjdHNfdGFyZ2V0X21heF90cmFuc2l0aW9uX3RpbWUiCiAgICAgIHNldCBtYXAoY2xrX3RyZWVfc2hpZWxkX25ldCkgIiMgY3JlYXRlX3JvdXRlX3R5cGUgLW5hbWUgbGVhZiAtYm90dG9tX3ByZWZlcnJlZF9sYXllciA8bGF5ZXI+IC10b3BfcHJlZmVycmVkX2xheWVyIDxsYXllcj4gLXNoaWVsZF9uZXQgPG5ldD4gLW5vbl9kZWZhdWx0X3J1bGUgPG5kcj4iCiAgICAgIHNldCBtYXAoY2xrX3RyZWVfc2hpZWxkX3RocmVzaCkgInNldF9kYiBjdHNfcm91dGluZ190b3BfbWluX2Zhbm91dCIKICAgICAgc2V0IG1hcChjbGtfdHJlZV9ib3R0b21fbGF5ZXIpICIjIGNyZWF0ZV9yb3V0ZV90eXBlIC1uYW1lIHRvcCAtYm90dG9tX3ByZWZlcnJlZF9sYXllciA8bGF5ZXI+IC10b3BfcHJlZmVycmVkX2xheWVyIDxsYXllcj4gLXNoaWVsZF9uZXQgPG5ldD4gLW5vbl9kZWZhdWx0X3J1bGUgPG5kcj4iCiAgICAgIHNldCBtYXAoY2xrX3RyZWVfdG9wX2xheWVyKSAiIyBjcmVhdGVfcm91dGVfdHlwZSAtbmFtZSB0b3AgLWJvdHRvbV9wcmVmZXJyZWRfbGF5ZXIgPGxheWVyPiAtdG9wX3ByZWZlcnJlZF9sYXllciA8bGF5ZXI+IC1zaGllbGRfbmV0IDxuZXQ+IC1ub25fZGVmYXVsdF9ydWxlIDxuZHI+IgogICAgICBzZXQgbWFwKGNsb2NrX2dhdGVfYXdhcmUpICJzZXRfZGIgcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUiCiAgICAgIHNldCBtYXAoY29uZ2VzdGlvbl9lZmZvcnQpICJzZXRfZGIgcGxhY2VfZ2xvYmFsX2NvbmdfZWZmb3J0IgogICAgICBzZXQgbWFwKGNwZl9maWxlKSAiIyByZWFkX3Bvd2VyX2ludGVudCAtY3BmIDxmaWxlPiIKICAgICAgc2V0IG1hcChjcGZfaXNvbGF0aW9uKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoY3BmX2tlZXBfcm93cykgZGVmdW5jdAogICAgICBzZXQgbWFwKGNwZl9sZXZlbF9zaGlmdGVyKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoY3BmX3Bvd2VyX2RvbWFpbikgZGVmdW5jdAogICAgICBzZXQgbWFwKGNwZl9wb3dlcl9zd2l0Y2gpIGRlZnVuY3QKICAgICAgc2V0IG1hcChjcGZfc3RhdGVfcmV0ZW50aW9uKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoY3BmX3RpbWluZykgZGVmdW5jdAogICAgICBzZXQgbWFwKGNwdXNfcGVyX3JlbW90ZV9ob3N0KSAic2V0X211bHRpX2NwdV91c2FnZSAtY3B1X3Blcl9yZW1vdGVfaG9zdCIKICAgICAgc2V0IG1hcChmbGV4bW9kZWxfYXNfcHRuKSAic2V0X2RiIHByb3RvX2NyZWF0ZV9wYXJ0aXRpb25fYXNfZmxleG1vZGVsIgogICAgICBzZXQgbWFwKGNyZWF0ZV9mbGV4ZmlsbGVyX2Jsb2NrYWdlKSAic2V0X2RiIHByb3RvX2ZsZXhmaWxsZXJfcm91dGVfYmxvY2thZ2UiCiAgICAgIHNldCBtYXAoY3RzX2J1ZmZlcl9jZWxscykgInNldF9kYiBjdHNfYnVmZmVyX2NlbGxzIgogICAgICBzZXQgbWFwKGN0c19lbmdpbmUpIG5vbmUKICAgICAgc2V0IG1hcChjdHNfaW52ZXJ0ZXJfY2VsbHMpICJzZXRfZGIgY3RzX2ludmVydGVyX2NlbGxzIgogICAgICBzZXQgbWFwKGN0c191c2VfaW52ZXJ0ZXJzKSAic2V0X2RiIGN0c191c2VfaW52ZXJ0ZXJzIgogICAgICBzZXQgbWFwKGRic19kaXIpICJzZXRfZGIgZmxvd19kYXRhYmFzZV9kaXJlY3RvcnkiCiAgICAgIHNldCBtYXAoZGVsdGFfZGVsYXlfdGhyZXNob2xkKSAic2V0X2RiIHNpX2RlbGF5X2RlbHRhX3RocmVzaG9sZCIKICAgICAgc2V0IG1hcChlbmFibGVfYW9jdikgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfYW9jdiIKICAgICAgc2V0IG1hcChlbmFibGVfc29jdikgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfc29jdiIKICAgICAgc2V0IG1hcChlbmFibGVfY3BwcikgInNldF9kYiB0aW1pbmdfYW5hbHlzaXNfY3BwciIKICAgICAgc2V0IG1hcChlbmFibGVfZmxleGlsbSkgIiMgbm9uZSA6IHBvc3NpYmxlIGZ1dHVyZSBoaWVyIGZsb3cgb3B0aW9uIgogICAgICBzZXQgbWFwKGVuYWJsZV9sdnMpICIjIG5vbmUgOiBwb3NzaWJsZSBmdXR1cmUgZmxvdyBvcHRpb24iCiAgICAgIHNldCBtYXAoZW5hYmxlX25yZ3IpIGRlZnVuY3QKICAgICAgc2V0IG1hcChlbmFibGVfb2N2KSAic2V0X2RiIHRpbWluZ19hbmFseXNpc190eXBlIG9jdiIKICAgICAgc2V0IG1hcChlbmFibGVfcGFjKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoZW5hYmxlX3BhbSkgIiMgbm9uZSA6IHBvc3NpYmxlIGZ1dHVyZSBmbG93IG9wdGlvbiIKICAgICAgc2V0IG1hcChlbmFibGVfcW9yX2NoZWNrKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoZW5hYmxlX3JjcCkgIiMgbm9uZSA6IGN1cnJlbnQgZmxvdyB0ZW1wbGF0ZSBvcHRpb24iCiAgICAgIHNldCBtYXAoZW5hYmxlX3NpX2F3YXJlKSAic2V0X2RiIGRlbGF5Y2FsX2VuYWJsZV9zaSIKICAgICAgc2V0IG1hcChlbmFibGVfc2lnbm9mZl9lY28pICIjIG5vbmUgOiBwb3NzaWJsZSBmdXR1cmUgZmxvdyBvcHRpb24iCiAgICAgIHNldCBtYXAoZW5hYmxlX3NzKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoZmlsbGVyX2NlbGxzKSAic2V0X2RiIGFkZF9maWxsZXJzX2NlbGxzIgogICAgICBzZXQgbWFwKGZpeF9mYW5vdXRfbG9hZCkgInNldF9kYiBvcHRfZml4X2Zhbm91dF9sb2FkIgogICAgICBzZXQgbWFwKGZpeF9ob2xkX2lnbm9yZV9pb3MpICJzZXRfZGIgZml4X2hvbGRfaWdub3JlX3BhdGhfZ3JvdXBzIgogICAgICBzZXQgbWFwKGZpeF9saXRobykgInNldF9kYiByb3V0ZV9kZXNpZ25fZGV0YWlsX3Bvc3Rfcm91dGVfbGl0aG9fcmVwYWlyIgogICAgICBzZXQgbWFwKGZsb3dfZWZmb3J0KSAic2V0X2RiIGRlc2lnbl9mbG93X2VmZm9ydCIKICAgICAgc2V0IG1hcChhZGRfdHJhY2tzKSAiIyBhZGRfdHJhY2tzIgogICAgICBzZXQgbWFwKGdyb3VuZF9uZXRzKSAic2V0X2RiIGluaXRfZ3JvdW5kX25ldHMiCiAgICAgIHNldCBtYXAoaGlnaF90aW1pbmdfZWZmb3J0KSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoaWVlZTE4MDFfZmlsZSkgIiMgcmVhZF9wb3dlcl9pbnRlbnQgLTE4MDEiCiAgICAgIHNldCBtYXAoaWVlZTE4MDFfaXNvbGF0aW9uKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoaWVlZTE4MDFfa2VlcF9yb3dzKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoaWVlZTE4MDFfbGV2ZWxfc2hpZnRlcikgZGVmdW5jdAogICAgICBzZXQgbWFwKGllZWUxODAxX3Bvd2VyX2RvbWFpbikgZGVmdW5jdAogICAgICBzZXQgbWFwKGllZWUxODAxX3Bvd2VyX3N3aXRjaCkgZGVmdW5jdAogICAgICBzZXQgbWFwKGllZWUxODAxX3N0YXRlX3JldGVudGlvbikgZGVmdW5jdAogICAgICBzZXQgbWFwKGllZWUxODAxX3RpbWluZykgZGVmdW5jdAogICAgICBzZXQgbWFwKGxpdGhvX2RyaXZlbl9yb3V0aW5nKSAic2V0X2RiIHJvdXRlX2Rlc2lnbl93aXRoX2xpdGhvX2RyaXZlbiIgCiAgICAgIHNldCBtYXAobG9jYWxfY3B1cykgInNldF9tdWx0aV9jcHVfdXNhZ2UgLWxvY2FsX2NwdSIKICAgICAgc2V0IG1hcChsb2dfZGlyKSAic2V0X2RiIGZsb3dfbG9nX2RpcmVjdG9yeSIKICAgICAgc2V0IG1hcChtYXhfcm91dGVfbGF5ZXIpICJzZXRfZGIgcm91dGVfdG9wX3JvdXRpbmdfbGF5ZXIiCiAgICAgIHNldCBtYXAobXVsdGlfY3V0X2VmZm9ydCkgInNldF9kYiByb3V0ZV9kZXNpZ25fZGV0YWlsX3VzZV9tdWx0aV9jdXRfdmlhX2VmZm9ydCIKICAgICAgc2V0IG1hcChvYV9hYnN0cmFjdF9uYW1lKSAic2V0X2RiIGluaXRfb2FfYWJzdHJhY3Rfdmlld3MiCiAgICAgIHNldCBtYXAob2FfbGF5b3V0X25hbWUpICJzZXRfZGIgaW5pdF9vYV9sYXlvdXRfdmlld3MiCiAgICAgIHNldCBtYXAob2FfZGVzaWduX2NlbGwpICJzZXRfZGIgaW5pdF9vYV9kZXNpZ25fY2VsbCIKICAgICAgc2V0IG1hcChvYV9kZXNpZ25fbGliKSAic2V0X2RiIGluaXRfb2FfZGVzaWduX2xpYiIKICAgICAgc2V0IG1hcChvYV9kZXNpZ25fdmlldykgInNldF9kYiBpbml0X29hX2Rlc2lnbl92aWV3IgogICAgICBzZXQgbWFwKHBsYWNlX2lvX3BpbnMpICJzZXRfZGIgcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMiCiAgICAgIHNldCBtYXAocG93ZXJfYW5hbHlzaXNfdmlldykgInNldF9kYiBwb3dlcl92aWV3IgogICAgICBzZXQgbWFwKHBvd2VyX2VmZm9ydCkgInNldF9kYiBkZXNpZ25fcG93ZXJfZWZmb3J0IgogICAgICBzZXQgbWFwKHBvd2VyX25ldHMpICJzZXRfZGIgaW5pdF9wb3dlcl9uZXRzIgogICAgICBzZXQgbWFwKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCkgInNldF9kYiBleHRyYWN0X3JjX2VmZm9ydF9sZXZlbCIKICAgICAgc2V0IG1hcChwcm9jZXNzKSAic2V0X2RiIGRlc2lnbl9wcm9jZXNzX25vZGUiCiAgICAgIHNldCBtYXAocmVtb3RlX2hvc3RzKSAic2V0X211bHRpX2NwdV91c2FnZSAtcmVtb3RlX2hvc3RzIgogICAgICBzZXQgbWFwKHJlc2l6ZV9zaGlmdGVyX2FuZF9pc29faW5zdHMpICJzZXRfZGIgb3B0X3Jlc2l6ZV9sZXZlbF9zaGlmdGVyX2FuZF9pc29faW5zdHMiCiAgICAgIHNldCBtYXAocm91dGVfY2xvY2tfbmV0cykgbm9uZQogICAgICBzZXQgbWFwKHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQpICJzZXRfZGIgZXh0cmFjdF9yY19lZmZvcnRfbGV2ZWwiCiAgICAgIHNldCBtYXAoc2tld19idWZmZXJzKSAic2V0X2RiIG9wdF9jbG9ja19za2V3X2J1ZmZlcl9jZWxscyIKICAgICAgc2V0IG1hcChzdXBlcmhvc3RzKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAoc3VwZXJ0aHJlYWRzKSBkZWZ1bmN0CiAgICAgIHNldCBtYXAodGhyZWFkcykgZGVmdW5jdAogICAgICBzZXQgbWFwKHRpZV9jZWxscykgInNldF9kYiBhZGRfdGllb2Zmc19jZWxscyIKICAgICAgc2V0IG1hcCh0aWVfY2VsbHMsbWF4X2Zhbm91dCkgInNldF9kYiBhZGRfdGllb2Zmc19tYXhfZGlzdGFuY2UiIAogICAgICBzZXQgbWFwKHRvcF9jZWxsKSAiIyBcW2dldF9kYiBkZXNpZ25zIC5uYW1lXF0iCiAgICAgIHNldCBtYXAodHF1YW50dXNfZmlsZSkgZGVmdW5jdAogICAgICBzZXQgbWFwKHVwZGF0ZV9pb19sYXRlbmN5KSAic2V0X2RiIGN0c191cGRhdGVfaW9fbGF0ZW5jeSIKICAgICAgc2V0IG1hcCh1c2VfcHJvdG9fbmV0X2RlbGF5X21vZGVsKSAic2V0X2RiIHByb3RvX3VzZV90aW1pbmdfbmV0X2RlbGF5X21vZGVsIgogICAgIAogICAgICBmaWxlIG1rZGlyICR2YXJzKHNjcmlwdF9kaXIpCiAgICAgIGZpbGUgZGVsZXRlICR2YXJzKHNjcmlwdF9kaXIpL2F0dHJpYnV0ZXMudGNsCiAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS8uYXR0cmlidXRlcy50Y2wgd10KICAgICAgCiAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyB2YXJzXSB7CiAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBtYXAoJHZhcildfSB7CiAgICAgICAgICAgaWYgeygkbWFwKCR2YXIpID09ICJub25lIikgfHwgKCR2YXJzKCR2YXIpID09ICIiKX0gewogICAgICAgICAgICAgIGNvbnRpbnVlIAogICAgICAgICAgIH0KICAgICAgICAgICBpZiB7JG1hcCgkdmFyKSA9PSAiZGVmdW5jdCJ9IHsKIyAgICAgICAgICAgICAgcHV0cyAkb3AgIiMgdmFycygkdmFyKSBpcyAkbWFwKCR2YXIpIgogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICR2YXJzKCR2YXIpXSA+IDF9IHsKICAgICAgICAgICAgICAgICBwdXRzICRvcCAiJG1hcCgkdmFyKSBcW2xpc3QgJHZhcnMoJHZhcilcXSA7ICMgJHZhciAiCiAgICAgICAgICAgICAgfSBlbHNlaWYge1tyZWdleHAgIl4jIiAkbWFwKCR2YXIpXX0gewojICAgICAgICAgICAgICAgICBwdXRzICRvcCAiJG1hcCgkdmFyKSA7ICMgJHZhciAiCiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiB7JHZhciA9PSAicHJvY2VzcyJ9IHsKICAgICAgICAgICAgICAgICAgICBzZXQgdmFycygkdmFyKSBbcmVnc3ViICJubSIgJHZhcnMocHJvY2VzcykgIiJdCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIHskdmFyID09ICJlbmFibGVfb2N2In0gewogICAgICAgICAgICAgICAgICAgc2V0ICR2YXJzKCR2YXIpICIiCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHB1dHMgJG9wICIkbWFwKCR2YXIpICR2YXJzKCR2YXIpIDsgIyAkdmFyICIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgY2xvc2UgJG9wCiAgICAgIAogICAgICBleGVjIGNhdCAkdmFycyhzY3JpcHRfZGlyKS8uYXR0cmlidXRlcy50Y2wgfCBzb3J0ID4gJHZhcnMoc2NyaXB0X2RpcikvYXR0cmlidXRlcy50Y2wKICAgICAgZmlsZSBkZWxldGUgJHZhcnMoc2NyaXB0X2RpcikvLmF0dHJpYnV0ZXMudGNsCgogICB9CgogICBwcm9jIGNvbnZlcnRfcGx1Z2lucyB7fSB7CgogICAgIGdsb2JhbCB2YXJzCiAgICAgZ2xvYmFsIHdhcm5pbmdzCgogICAgIHNldCBhbmNob3IoYWx3YXlzX3NvdXJjZV90Y2wpICJiZWZvcmUgaW5pdF9mbG9vcnBsYW4iCiAgICAgc2V0IGFuY2hvcihmaW5hbF9hbHdheXNfc291cmNlX3RjbCkgImJlZm9yZSBibG9ja19maW5pc2giCiAgICAgc2V0IGFuY2hvcihwcmVfaW5pdF90Y2wpICJiZWZvcmUgaW5pdF9kZXNpZ24iCiAgICAgc2V0IGFuY2hvcihwb3N0X2luaXRfdGNsKSAiYWZ0ZXIgYWRkX3RyYWNrcyIKICAgICBzZXQgYW5jaG9yKHByZV9wbGFjZV90Y2wpICJiZWZvcmUgcnVuX3BsYWNlX29wdCIKICAgICBzZXQgYW5jaG9yKHBvc3RfcGxhY2VfdGNsKSAiYWZ0ZXIgcnVuX3BsYWNlX29wdCIKICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxNn0gewogICAgICAgc2V0IGFuY2hvcihwcmVfY3RzX3RjbCkgImJlZm9yZSBhZGRfY2xvY2tfc3BlYyIKICAgICAgIHNldCBhbmNob3IocG9zdF9jdHNfdGNsKSAiYWZ0ZXIgYWRkX2Nsb2NrX3RyZWUiCiAgICAgfSBlbHNlIHsKICAgICAgIHNldCBhbmNob3IocHJlX2N0c190Y2wpICJiZWZvcmUgYnVpbGRfY2xvY2tfdHJlZSIKICAgICAgIHNldCBhbmNob3IocG9zdF9jdHNfdGNsKSAiYWZ0ZXIgYnVpbGRfY2xvY2tfdHJlZSIKICAgICB9CiAgICAgc2V0IGFuY2hvcihwcmVfcm91dGVfdGNsKSAiYmVmb3JlIHJ1bl9yb3V0ZSIKICAgICBzZXQgYW5jaG9yKHBvc3Rfcm91dGVfdGNsKSAiYWZ0ZXIgcnVuX3JvdXRlIgogICAgIHNldCBhbmNob3IocHJlX3Bvc3Ryb3V0ZV90Y2wpICJiZWZvcmUgcnVuX29wdF9wb3N0cm91dGUiCiAgICAgc2V0IGFuY2hvcihwb3N0X3Bvc3Ryb3V0ZV90Y2wpICJhZnRlciBydW5fb3B0X3Bvc3Ryb3V0ZSIKICAgICAjc2V0IGFuY2hvcihwcmVfc2lnbm9mZl90Y2wpICJiZWZvcmUgcnVuX3N0YSIKICAgICAjc2V0IGFuY2hvcihwb3N0X3NpZ25vZmZfdGNsKSAiYWZ0ZXIgcnVuX3N0YSIKCiAgICAgc2V0IHN0ZXAocHJlX2luaXRfdGNsKSAiaW5pdCIKICAgICBzZXQgc3RlcChwb3N0X2luaXRfdGNsKSAiaW5pdCIKICAgICBzZXQgc3RlcChwcmVfcGxhY2VfdGNsKSAicGxhY2UiCiAgICAgc2V0IHN0ZXAocG9zdF9wbGFjZV90Y2wpICJwbGFjZSIKICAgICBzZXQgc3RlcChwcmVfY3RzX3RjbCkgImN0cyIKICAgICBzZXQgc3RlcChwb3N0X2N0c190Y2wpICJjdHMiCiAgICAgc2V0IHN0ZXAocHJlX3JvdXRlX3RjbCkgInJvdXRlIgogICAgIHNldCBzdGVwKHBvc3Rfcm91dGVfdGNsKSAicm91dGUiCiAgICAgc2V0IHN0ZXAocHJlX3Bvc3Ryb3V0ZV90Y2wpICJwb3N0cm91dGUiCiAgICAgc2V0IHN0ZXAocG9zdF9wb3N0cm91dGVfdGNsKSAicG9zdHJvdXRlIgogICAgIHNldCBzdGVwKHByZV9zaWdub2ZmX3RjbCkgInNpZ25vZmYiCiAgICAgc2V0IHN0ZXAocG9zdF9zaWdub2ZmX3RjbCkgInNpZ25vZmYiCiAgCiAgICAgc2V0IGNmIFtvcGVuIGNvbnZlcnRfcGx1Z2lucy50Y2wgd10KCiAgICAgI2ZpbGUgZGVsZXRlIC1mb3JjZSAuZmZ0bXAKICAgICAjZmlsZSBta2RpciAuZmZ0bXAKCiAgICAgc2V0IG5ld19wbHVncyBbbGlzdF0gCiAgICAgc2V0IG9sZF9wbHVncyBbbGlzdF0KICAgICBmb3JlYWNoIHBsdWcgJHZhcnMocGx1Z2luc19kZWZpbmVkKSB7CiAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKHBsdWdfZGlyKS8kdmFycygkcGx1ZyldfSB7IAogICAgICAgICAgc2V0IHBsdWdfZmlsZSBbZmlsZSBub3JtYWxpemUgJHZhcnMocGx1Z19kaXIpLyR2YXJzKCRwbHVnKV0KICAgICAgICAgIGxhcHBlbmQgb2xkX3BsdWdzICIkcGx1ZyAkdmFycyhwbHVnX2RpcikvJHZhcnMoJHBsdWcpIgogICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoJHBsdWcpXX0gewogICAgICAgICAgICAgc2V0IHBsdWdfZmlsZSAkdmFycygkcGx1ZykKICAgICAgICAgICAgIGxhcHBlbmQgb2xkX3BsdWdzICIkcGx1ZyAkdmFycygkcGx1ZykiCiAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgIGNvbnRpbnVlIAogICAgICAgICAgfQogICAgICAgfQogICAgICAgI3B1dHMgJGNmICJjb252ZXJ0X2xlZ2FjeV90b19jb21tb25fdWkgJHBsdWdfZmlsZSAuZmZ0bXAvW2ZpbGUgdGFpbCAkcGx1Z19maWxlXSIKICAgICAgICNsYXBwZW5kIG5ld19wbHVncyAiJHBsdWcgLmZmdG1wL1tmaWxlIHRhaWwgJHBsdWdfZmlsZV0iCiAgICAgICAjcHV0cyAkY2YgImNvbnZlcnRfbGVnYWN5X3RvX2NvbW1vbl91aSAkcGx1Z19maWxlIFtmaWxlIGRpcm5hbWUgJHBsdWdfZmlsZV1fY3VpL1tmaWxlIHRhaWwgJHBsdWdfZmlsZV0iCiAgICAgICBwdXRzICRjZiAiZmlsZSBta2RpciBjb252ZXJ0ZWRfcGx1Z2lucyIKICAgICAgIHB1dHMgJGNmICJjb252ZXJ0X2xlZ2FjeV90b19jb21tb25fdWkgJHBsdWdfZmlsZSBjb252ZXJ0ZWRfcGx1Z2lucy9bZmlsZSB0YWlsICRwbHVnX2ZpbGVdIgogICAgICAgbGFwcGVuZCBuZXdfcGx1Z3MgIiRwbHVnIGN1aS4kcGx1Z19maWxlIgogICAgIH0KCiAgICAgcHV0cyAkY2YgImV4aXQiCiAgICAgY2xvc2UgJGNmCgogICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY29udmVydF9wbHVnaW5zKV0gfHwgKFtpbmZvIGV4aXN0cyB2YXJzKGNvbnZlcnRfcGx1Z2lucyldICAmJiAhJHZhcnMoY29udmVydF9wbHVnaW5zKSl9IHsKIyAgICAgICBQdXRzICI8RkY+IENvbnZlcnRpbmcgW2xsZW5ndGggJHZhcnMocGx1Z2luc19kZWZpbmVkKV0gcGx1Z2lucyAuLi4iCiMgICAgICAgaWYge1tjYXRjaCB7ZXZhbCAiZXhlYyBpbm5vdnVzIC1ub3dpbiAtbm92dXNfdWkgLWZpbGVzIC5jb252ZXJ0X3BsdWdpbnMudGNsIn1dfSB7CiMgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBDYW5ub3QgZmluZCBJbm5vdnVzIGluIHlvdXIgcGF0aCBzbyBwbHVnaW5zIHdpbGwgbm90IGJlIGNvbnZlcnRlZCIKIyAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJDYW5ub3QgZmluZCBJbm5vdnVzIGluIHlvdXIgcGF0aCBzbyBwbHVnaW5zIHdpbGwgbm90IGJlIGNvbnZlcnRlZCIKIyAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKIyAgICAgICAgICByZXR1cm4gCiMgICAgICAgfQogICAgIH0KICAgIAogICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikKICAgICBzZXQgb2YgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvcGx1Z19zdGVwcy50Y2wgd10KCiAgICAgc2V0IHBsdWdfZGljdCBbam9pbiAkbmV3X3BsdWdzXQogICAgIHNldCBwbHVnX2RpY3QgW2pvaW4gJG9sZF9wbHVnc10KICAgICBmb3JlYWNoIGtleSBbZGljdCBrZXlzICRwbHVnX2RpY3RdIHsKICAgICAgICNwdXRzICIka2V5IC0+IFtkaWN0IGdldCAkcGx1Z19kaWN0ICRrZXldIgogICAgICAgc2V0IGlwIFtvcGVuIFtkaWN0IGdldCAkcGx1Z19kaWN0ICRrZXldIHJdCiAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobGVnYWN5X3BsdWdpbnMpXSAmJiAkdmFycyhsZWdhY3lfcGx1Z2lucyl9IHsKICAgICAgICAgcHV0cyAkb2YgImNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgW3JlZ3N1YiAiX3RjbCIgJGtleSAiX3BsdWciXSAtbGVnYWN5IFx7IgogICAgICAgfSBlbHNlIHsKICAgICAgICAgcHV0cyAkb2YgImNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgW3JlZ3N1YiAiX3RjbCIgJGtleSAiX3BsdWciXSBceyIKICAgICAgIH0KICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhjb25maWdfZmlsZXMpIHsKICAgICAgICAgIHB1dHMgJG9mICJzb3VyY2UgJGZpbGUiIAogICAgICAgfQogICAgICAgaWYge1tpbmZvIGV4aXN0cyBzdGVwKCRrZXkpXX0gewogICAgICAgICBwdXRzICRvZiAic2V0IHZhcnMoc3RlcCkgJHN0ZXAoJGtleSkiIAogICAgICAgfQogICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICBwdXRzICRvZiAiICAgICRsaW5lIgogICAgICAgfQogICAgICAgcHV0cyAkb2YgIlx9IgogICAgICAgaWYge1tpbmZvIGV4aXN0cyBhbmNob3IoJGtleSldfSB7CiAgICAgICAgIHB1dHMgJG9mICJlZGl0X2Zsb3cgLWFwcGVuZCBmbG93X3N0ZXA6W3JlZ3N1YiAiX3RjbCIgJGtleSAiX3BsdWciXSAtW2xpbmRleCAkYW5jaG9yKCRrZXkpIDBdIGZsb3dfc3RlcDpbbGluZGV4ICRhbmNob3IoJGtleSkgMV0iCiAgICAgICB9ICBlbHNlIHsKIyAgICAgICAgIHB1dHMgIjxGRj4gTm8gYW5jaG9yIGZvdW5kIGZvciAkcGx1ZyIKICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiTm8gYW5jaG9yIGZvdW5kIGZvciAka2V5IgogICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgIH0KICAgICAgIGNsb3NlICRpcAogICAgIH0KICAgICBjbG9zZSAkb2YKICAgICBmaWxlIGRlbGV0ZSAtZm9yY2UgLmZmdG1wCiAgICAgaWYge1tmaWxlIGV4aXN0cyBzY3JpcHRzL2Zsb3dfY29uZmlnLnRlbXBsYXRlXX0gewogICAgICAgZmlsZSBjb3B5IC1mb3JjZSBzY3JpcHRzL2Zsb3dfY29uZmlnLnRlbXBsYXRlIHNjcmlwdHMvZmxvd19jb25maWcudGNsCiAgICAgfSAKICAgICBpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2xdfSB7CiAgICAgICBmaWxlIG1rZGlyIHNjcmlwdHMKICAgICAgIGZpbGUgY29weSAtZm9yY2UgJHZhcnMoc2NyaXB0X2Rpcikvdmlld19kZWZpbml0aW9uLnRjbCBzY3JpcHRzL21tbWNfY29uZmlnLnRjbAogICAgIH0gZWxzZSAgewogICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJGaWxlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wgbm90IGZvdW5kIgogICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICB9CiMgICAgIHNldCBvcCBbb3BlbiBzY3JpcHRzL2Zsb3dfY29uZmlnLnRjbCBhXQojICAgICBwdXRzICRvcCAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL3BsdWdfc3RlcHMudGNsIgojICAgICBjbG9zZSAkb3AKICAgfQp9CgpuYW1lc3BhY2UgZXZhbCBmZl9ub3Z1czo6IHsKICAgcHJvYyBydW5faW5pdCB7fSB7CiAgICAgIHVwbGV2ZWwgIzAgZXZhbCBbRkZfTk9WVVM6OnJ1bl9pbml0XQogICB9CiAgIHByb2MgcnVuX3BsYWNlIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX3BsYWNlXQogICB9CiAgIHByb2MgcnVuX3ByZWN0cyB7fSB7CiAgICAgIHVwbGV2ZWwgIzAgZXZhbCBbRkZfTk9WVVM6OnJ1bl9wcmVjdHNdCiAgIH0KICAgcHJvYyBydW5fY3RzIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX2N0c10KICAgfQogICBwcm9jIHJ1bl9wb3N0Y3RzIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX3Bvc3RjdHNdCiAgIH0KICAgcHJvYyBydW5fcG9zdGN0c19ob2xkIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX3Bvc3RjdHNfaG9sZF0KICAgfQogICBwcm9jIHJ1bl9yb3V0ZSB7fSB7CiAgICAgIHVwbGV2ZWwgIzAgZXZhbCBbRkZfTk9WVVM6OnJ1bl9yb3V0ZV0KICAgfQogICBwcm9jIHJ1bl9wb3N0cm91dGUge30gewogICAgICB1cGxldmVsICMwIGV2YWwgW0ZGX05PVlVTOjpydW5fcG9zdHJvdXRlXQogICB9CiAgIHByb2MgcnVuX3Bvc3Ryb3V0ZV9ob2xkIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX3Bvc3Ryb3V0ZV9ob2xkXQogICB9CiAgIHByb2MgcnVuX3Bvc3Ryb3V0ZV9zaV9ob2xkIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX3Bvc3Ryb3V0ZV9zaV9ob2xkXQogICB9CiAgIHByb2MgcnVuX3Bvc3Ryb3V0ZV9zaSB7fSB7CiAgICAgIHVwbGV2ZWwgIzAgZXZhbCBbRkZfTk9WVVM6OnJ1bl9wb3N0cm91dGVfc2ldCiAgIH0KICAgcHJvYyBydW5fc2lnbm9mZiB7fSB7CiAgICAgIHVwbGV2ZWwgIzAgZXZhbCBbRkZfTk9WVVM6OnJ1bl9zaWdub2ZmXQogICB9CiAgIHByb2MgcnVuX2Fzc2VtYmxlIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX2Fzc2VtYmxlXQogICB9CiAgIHByb2MgcnVuX3JlYnVkZ2V0IHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX3JlYnVkZ2V0XQogICB9CiAgIHByb2MgcnVuX2ZsZXhpbG0ge30gewogICAgICB1cGxldmVsICMwIGV2YWwgW0ZGX05PVlVTOjpydW5fZmxleGlsbV0KICAgfQogICBwcm9jIHJ1bl9hc3NlbWJsZV9mbGV4aWxtIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX2Fzc2VtYmxlX2ZsZXhpbG1dCiAgIH0KICAgcHJvYyBydW5fcGFydGl0aW9uIHt9IHsKICAgICAgdXBsZXZlbCAjMCBldmFsIFtGRl9OT1ZVUzo6cnVuX3BhcnRpdGlvbl0KICAgfQogICBwcm9jIHJ1bl9sZWMge30gewogICAgICB1cGxldmVsICMwIGV2YWwgW0ZGX05PVlVTOjpydW5fbGVjXQogICB9CiAgIHByb2MgcnVuX2FsbCB7fSB7CiAgICAgIHVwbGV2ZWwgIzAgRkZfTk9WVVM6OnJ1bl9hbGwKICAgfQp9CgpuYW1lc3BhY2UgZXZhbCBGRl9FREk6OiB7CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgUHJvY2VkdXJlIHRvIHNlZWQgY2VydGFpbiBmbG93IHZhcmlhYmxlcyB0byBhIGtub3duIGRlZmF1bHQgdmFsdWUgYXMgd2VsbAogICAjIGFzIGRhdGEgdmFyaWFibGVzIHJlcXVpcmVkIHRvIHNlZWQgdGhlIGdlbmVyaWMgY29uZmlndXJhdGlvbiBmaWxlCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgcHJvYyBzZWVkX3ZhcmlhYmxlcyB7e2ZvcmNlIDB9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgcmRhX2RlZmF1bHRzCiAgICAgIGdsb2JhbCB1ZG0KICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgaW5mb3MKICAgICAgZ2xvYmFsIHdhcm5pbmdzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGZhcmdzIAogICAgICBnbG9iYWwgZGFyZ3MgCgogICAgICBpZiB7JGZvcmNlfSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzZWVkKV19IHsKICAgICAgICAgICAgdW5zZXQgdmFycyhzZWVkKQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc2VlZCldfSB7CgogICAgICAgICBwdXRzICI8RkY+IFNlZWRpbmcgdmFyaWFibGVzIC4uLiIKCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMod2FybmluZ19jb3VudCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKHdhcm5pbmdfY291bnQpIDAKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGVycm9yX2NvdW50KV19IHsKICAgICAgICAgICAgc2V0IHZhcnMoZXJyb3JfY291bnQpIDAKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGluZm9fY291bnQpXX0gewogICAgICAgICAgICBzZXQgdmFycyhpbmZvX2NvdW50KSAwCiAgICAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBTZXQgdmFycyh2ZXJzaW9uKSB0byAiMTcuMS4wIiBpZiBub3QgZGVmaW5lZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModmVyc2lvbildfSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZmFyZ3ModmVyc2lvbildfSB7CiMgICAgICAgICAgICAgICBwdXRzICI8RkY+IElORk86IFZhcmlhYmxlIHZhcnModmVyc2lvbikgbm90IGRlZmluZWQgLSBzZXR0aW5nIHRvICckZmFyZ3ModmVyc2lvbiknIgogICAgICAgICAgICAgICBzZXQgdmFycyh2ZXJzaW9uKSAkZmFyZ3ModmVyc2lvbikKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IHZhcnModmVyc2lvbikgJGRhcmdzKHZlcnNpb24pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHZhcnMoZmxvdykgbW1tYwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7KFtsc2VhcmNoICRGRjo6dmFsaWRfdmVyc2lvbnMgJHZhcnModmVyc2lvbildIDwgMCl9IHsKICAgICAgICAgICAgICAgc2V0IG1zZyAiVmVyc2lvbiAnJHZhcnModmVyc2lvbiknIG5vdCBzdXBwb3J0ZWQgLSBzZXR0aW5nIHRvICcxNy4xLjAnIgogICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6ICRtc2ciCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgJG1zZ1xuIgogICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICRtc2cKICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3cpIG1tbWMKICAgICAgICAgICAgICAgc2V0IHZhcnModmVyc2lvbikgIjE3LjEuMCIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvdykgbW1tYwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgaWYgeyR2YXJzKG1vZGUpID09ICJ0b3BfZG93biJ9IHsgc2V0IHZhcnMobW9kZSkgaGllciB9CgogICAgICAgICBpZiB7W3JlZ2V4cCAiOS4xIiAkdmFycyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgc2V0IHZhcnMoZW5hYmxlX2xkYikgRkFMU0UKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX2xkYildICYmICR2YXJzKGVuYWJsZV9sZGIpfSB7CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocmFuX2NvbXBpbGUpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6cnVuX2NvbXBpbGVdIAogICAgICAgICAgICB9CiAgICAgICAgIH0KCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgU2V0IHZhcnMoZmxvdykgdG8gIm1tbWMiIGlmIG5vdCBkZWZpbmVkCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhmbG93KV19IHsKICAgICAgICAgICAgcHV0cyAiPEZGPiBJTkZPOiBWYXJpYWJsZSB2YXJzKGZsb3cpIG5vdCBkZWZpbmVkIC0gc2V0dGluZyB0byAnbW1tYyciCiAgICAgICAgICAgIHNldCB2YXJzKGZsb3cpIG1tbWMKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyhbbHNlYXJjaCBbbGlzdCAiZGVmYXVsdCIgInByX21tbWMiICJtbW1jIl0gJHZhcnMoZmxvdyldIDwgMCl9IHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBGbG93IHR5cGUgJyR2YXJzKGZsb3cpJyBub3Qgc3VwcG9ydGVkIC0gc2V0dGluZyB0byAnbW1tYyciCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogRmxvdyB0eXBlICckdmFycyhmbG93KScgbm90IHN1cHBvcnRlZCAtIHNldHRpbmcgdG8gJ21tbWMnXG4iCiAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIkZsb3cgdHlwZSAnJHZhcnMoZmxvdyknIG5vdCBzdXBwb3J0ZWQgLSBzZXR0aW5nIHRvICdtbW1jJyIKICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3cpIG1tbWMKICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTWFrZSBzdXJlIGFsbCBzY2FsaW5nIGZhY3RvcnMgYXJlIGVpdGhlciBzZXQgb3IgYXJlIDEuMCAuLi4gYWxzbwogICAgICAjIHN1cHBvcnQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb2Ygb2xkIG5hbWVzCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgc2V0IG1hcChwcmVfcm91dGVfcmVzX2ZhY3RvcikgZGVmX3Jlc19mYWN0b3IKICAgICAgICAgc2V0IG1hcChwcmVfcm91dGVfY2xrX3Jlc19mYWN0b3IpIGRlZl9jbGtfcmVzX2ZhY3RvcgogICAgICAgICBzZXQgbWFwKHByZV9yb3V0ZV9jYXBfZmFjdG9yKSBkZWZfY2FwX2ZhY3RvcgogICAgICAgICBzZXQgbWFwKHByZV9yb3V0ZV9jbGtfY2FwX2ZhY3RvcikgZGVmX2Nsa19jYXBfZmFjdG9yCiAgICAgICAgIHNldCBtYXAocG9zdF9yb3V0ZV9yZXNfZmFjdG9yKSBkZXRfcmVzX2ZhY3RvcgogICAgICAgICBzZXQgbWFwKHBvc3Rfcm91dGVfY2xrX3Jlc19mYWN0b3IpIGRldF9jbGtfcmVzX2ZhY3RvcgogICAgICAgICBzZXQgbWFwKHBvc3Rfcm91dGVfY2FwX2ZhY3RvcikgZGV0X2NhcF9mYWN0b3IKICAgICAgICAgc2V0IG1hcChwb3N0X3JvdXRlX2Nsa19jYXBfZmFjdG9yKSBkZXRfY2xrX2NhcF9mYWN0b3IKICAgICAgICAgc2V0IG1hcChwb3N0X3JvdXRlX3hjYXBfZmFjdG9yKSB4Y2FwX2ZhY3RvcgoKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXSAmJiAhW2luZm8gZXhpc3RzIHZhcnMocGFyc2VkX3ZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewogICAgICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBFUlJPUjogVmlldyBkZWZpbml0aW9uIGZpbGUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCkgZG9lcyBub3QgZXhpc3QgLi4uIGNhbm5vdCBjb250aW51ZSIKICAgICAgICAgICAgICAgZXhpdAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvb3ZlcmxheS50Y2wKICAgICAgICAgICAgcHV0cyAiPEZGPiBQYXJzaW5nIHVzZXIgdmlldyBkZWZpbml0aW9uIGZpbGUgLi4uIgogICAgICAgICAgICBzZXQgcmMgW2NhdGNoIHtzb3VyY2UgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCl9XQojICAgICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgICAgZm9yZWFjaCB2YXIgImxpYnJhcnlfc2V0cyByY19jb3JuZXJzIGRlbGF5X2Nvcm5lcnMgc2V0dXBfYW5hbHlzaXNfdmlld3MgaG9sZF9hbmFseXNpc192aWV3cyBwb3dlcl9kb21haW5zIiB7CiAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXIpXX0gewogICAgICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiVmFyaWFibGUgdmFycygkdmFyKSBoYXMgYmVlbiBzZXQgdG8gXCIkdmFycygkdmFyKVwiIgogICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgICAgICAgICAgICBwdXRzICRyYwojICAgICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgICAgc2V0IHZhcnMocGFyc2VkX3ZpZXdfZGVmaW5pdGlvbl90Y2wpIHRydWUKICAgICAgICAgfQoKIyAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CgogICAgICAgICAgICBmb3JlYWNoIHJjX2Nvcm5lciAkdmFycyhyY19jb3JuZXJzKSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uICJwcmVfcm91dGVfcmVzX2ZhY3RvciBwcmVfcm91dGVfY2xrX3Jlc19mYWN0b3IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9yb3V0ZV9yZXNfZmFjdG9yIHBvc3Rfcm91dGVfY2xrX3Jlc19mYWN0b3IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3JvdXRlX2NhcF9mYWN0b3IgcHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfcm91dGVfY2FwX2ZhY3RvciBwb3N0X3JvdXRlX2Nsa19jYXBfZmFjdG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfcm91dGVfeGNhcF9mYWN0b3IiIHsKICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLCRvcHRpb24pXSAmJiBbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLCRtYXAoJG9wdGlvbikpXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IFZhcmlhYmxlICRtYXAoJG9wdGlvbikgaGFzIGJlZW4gY2hhbmdlZCB0byAkb3B0aW9uIC4uLiBwbGVhc2UgdXBkYXRlXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIlZhcmlhYmxlICRtYXAoJG9wdGlvbikgaGFzIGJlZW4gY2hhbmdlZCB0byAkb3B0aW9uIC4uLiBwbGVhc2UgdXBkYXRlIgogICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJHJjX2Nvcm5lciwkb3B0aW9uKSAkdmFycygkcmNfY29ybmVyLCRtYXAoJG9wdGlvbikpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgIAogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgVGhlIGZvbGxvd2luZyB3aWxsIGJlIHVzZWQgdG8gc2VlZCB0aGUgY29uZmlnIGZpbGUKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAKICAgICAgICAgICAgaWYgeyFbRkY6OmlzX2xwX2Zsb3ddfSB7CgogICAgICAgICAgICAgICBzZXQgbWF4X2xpYnMgW2xpc3RdCiAgICAgICAgICAgICAgIHNldCBtaW5fbGlicyBbbGlzdF0KICAgCiAgICAgICAgICAgICAgIHNldCBjb3VudCAwCiAgIAogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBsaWIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICRtYXhfbGlicyAkbGliXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIG1heF9saWJzICRsaWIKICAgICAgICAgICAgICAgICAgICAgICAgaW5jciBjb3VudAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxsYXRlX2xpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBsaWIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxhdGVfbGlicmFyeV9zZXQpLHRpbWluZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJG1heF9saWJzICRsaWJdID09IC0xfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgbWF4X2xpYnMgJGxpYgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGNvdW50CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZWxpYixtYXgpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliLG1heCkgJG1heF9saWJzCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X2hvbGRfdmlldyksZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCldfSB7CiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbGliICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICRtaW5fbGlicyAkbGliXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIG1pbl9saWJzICRsaWIKICAgICAgICAgICAgICAgICAgICAgICAgaW5jciBjb3VudAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGVhcmx5X2xpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBsaWIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpLHRpbWluZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJG1pbl9saWJzICRsaWJdID09IC0xfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgbWluX2xpYnMgJGxpYgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGNvdW50CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZWxpYixtaW4pXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliLG1pbikgJG1pbl9saWJzCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZWxpYildfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHRpbWVsaWIpICIiCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlKSAiIgogICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtaW4pICIiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1heCkgIiIKICAgCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpXX0gewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSxzaSldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1heCkgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSxzaSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxhdGVfbGlicmFyeV9zZXQpXX0gewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIGFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGF0ZV9saWJyYXJ5X3NldCksc2kpXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtYXgpICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxsYXRlX2xpYnJhcnlfc2V0KSxzaSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtYXgpICIiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSxzaSldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1pbikgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHNpKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X2hvbGRfdmlldyksZGVsYXlfY29ybmVyKSxlYXJseV9saWJyYXJ5X3NldCldfSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X2hvbGRfdmlldyksZGVsYXlfY29ybmVyKSxlYXJseV9saWJyYXJ5X3NldCksc2kpXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtaW4pICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpLGVhcmx5X2xpYnJhcnlfc2V0KSxzaSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSxtaW4pICIiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxwcmVfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhmbG93KSAhPSAibW1tYyJ9IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnModGltaW5nY29uX2ZpbGUpICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxwcmVfY3RzX3NkYykKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzZXQgdmFycyhwcmVfY3RzX3NkYykgJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxjb25zdHJhaW50X21vZGUpLHByZV9jdHNfc2RjKQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGNvbnN0cmFpbnRfbW9kZSkscHJlX2N0c19pbG1fc2RjKV19IHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpICE9ICJtbW1jIn0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1pbmdjb25fZmlsZSxmdWxsKSAkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGNvbnN0cmFpbnRfbW9kZSkscHJlX2N0c19pbG1fc2RjKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxpbmNyX2N0c19zZGMpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhpbmNyX2N0c19zZGMpICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxpbmNyX2N0c19zZGMpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxwb3N0X2N0c19zZGMpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhwb3N0X2N0c19zZGMpICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxwb3N0X2N0c19zZGMpCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X2hvbGRfdmlldyksZGVsYXlfY29ybmVyKSxyY19jb3JuZXIpLGNhcF90YWJsZSldICYmXAogICAgICAgICAgICAgICAgICAgW2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lciksY2FwX3RhYmxlKV19IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2FwdGJsX2ZpbGUpIFtjb25jYXQgXAogICAgICAgICAgICAgICAgICAgICAgICItYmVzdCIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSxjYXBfdGFibGUpIFwKICAgICAgICAgICAgICAgICAgICAgICAiLXdvcnN0IiAkdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSxjYXBfdGFibGUpIFwKICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgc2V0IHZhcnMod2NfY2FwX3RhYmxlKSAkdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSxjYXBfdGFibGUpCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikscmNfY29ybmVyKSxjYXBfdGFibGUpXX0gewogICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2FwdGJsX2ZpbGUpIFtjb25jYXQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICItYmVzdCIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lciksY2FwX3RhYmxlKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIi13b3JzdCIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lciksY2FwX3RhYmxlKSBcCiAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyh3Y19jYXBfdGFibGUpICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxyY19jb3JuZXIpLGNhcF90YWJsZSkKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2FwdGJsX2ZpbGUpICIiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliKSAiIgogICAgICAgICAgICAgICBzZXQgdmFycyhjZGJfZmlsZSkgIiIKICAgICAgICAgICAgICAgc2V0IHZhcnModGltZWxpYixtYXgpICIiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1heCkgIiIKICAgICAgICAgICAgICAgc2V0IHZhcnModGltZWxpYixtaW4pICIiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNkYl9maWxlLG1pbikgIiIKICAgICAgICAgICAgICAgc2V0IGZvdW5kX21heCAwIAogICAgICAgICAgICAgICBzZXQgZm91bmRfbWluIDAgCiAgIAogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2V0dXBfYW5hbHlzaXNfdmlld3MpXSAmJiBbaW5mbyBleGlzdHMgdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKV19IHsKICAgICAgICAgICAgICAgICAgZm9yZWFjaCB2aWV3ICR2YXJzKHNldHVwX2FuYWx5c2lzX3ZpZXdzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YXJzKHRpbWVsaWIsbWF4KSAkZmlsZV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKHRpbWVsaWIsbWF4KSAkZmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBmb3VuZF9tYXggMQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gV0FSTklORzogVmFyaWFibGUgdmFycygkdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZykgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxlYXJseV9saWJyYXJ5X3NldCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IFZhcmlhYmxlIHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZm9yZWFjaCB2aWV3ICR2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCksdGltaW5nKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnModGltZWxpYixtaW4pICRmaWxlXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHZhcnModGltZWxpYixtaW4pICRmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGZvdW5kX21pbiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiB2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZykgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlZhcmlhYmxlIHZhcnMoJHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCksdGltaW5nKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGVhcmx5X2xpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV0gJiYgKCR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmlldyAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KQogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCksdGltaW5nKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiB2YXJzKCR2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpLHRpbWluZykgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlZhcmlhYmxlIHZhcnMoJHZhcnMoJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCksdGltaW5nKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmlldyxkZWxheV9jb3JuZXIpLGVhcmx5X2xpYnJhcnlfc2V0KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKCR2YXJzKCR2aWV3LGRlbGF5X2Nvcm5lciksZWFybHlfbGlicmFyeV9zZXQpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBpZiB7ISRmb3VuZF9taW4gfHwgISRmb3VuZF9tYXh9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBFaXRoZXIgc2V0dXAgb3IgaG9sZCBhbmFseXNpcyB2aWV3cyBpbmFkZXF1YXRlbHkgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiRWl0aGVyIHNldHVwIG9yIGhvbGQgYW5hbHlzaXMgdmlld3MgaW5hZGVxdWF0ZWx5IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICAgICAgICBzZXQgdmFycyh0aW1lbGliLG1pbikgIiIKICAgICAgICAgICAgICAgICAgc2V0IHZhcnModGltZWxpYixtYXgpICIiCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbGlicmFyeV9zZXQgJHZhcnMobGlicmFyeV9zZXRzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkbGlicmFyeV9zZXQsdGltaW5nKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnModGltZWxpYikgW2NvbmNhdCAkdmFycyh0aW1lbGliKSAkdmFycygkbGlicmFyeV9zZXQsdGltaW5nKV0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LHNpKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoY2RiX2ZpbGUpIFtjb25jYXQgJHZhcnMoY2RiX2ZpbGUpICR2YXJzKCRsaWJyYXJ5X3NldCxzaSldCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCB2YXJzKGNhcHRibF9maWxlKSAiIgogICAgICAgICAgICAgICBzZXQgdmFycyh0aW1pbmdjb25fZmlsZSkgIiIKICAgICAgIyAgICAgICAgICAgc2V0IHZhcnMocHJlX3JvdXRlX3Jlc19mYWN0b3IpIDEuMAogICAgICAjICAgICAgICAgICBzZXQgdmFycyhwb3N0X3JvdXRlX3Jlc19mYWN0b3IpIDEuMAogICAgICAjICAgICAgICAgICBzZXQgdmFycyhwcmVfcm91dGVfY2FwX2ZhY3RvcikgMS4wCiAgICAgICMgICAgICAgICAgIHNldCB2YXJzKHBvc3Rfcm91dGVfY2FwX2ZhY3RvcikgMS4wCiAgICAgICMgICAgICAgICAgIHNldCB2YXJzKHByZV9yb3V0ZV9jbGtfcmVzX2ZhY3RvcikgMS4wCiAgICAgICMgICAgICAgICAgIHNldCB2YXJzKHBvc3Rfcm91dGVfY2xrX3Jlc19mYWN0b3IpIDEuMAogICAgICAjICAgICAgICAgICBzZXQgdmFycyhwcmVfcm91dGVfY2xrX2NhcF9mYWN0b3IpIDEuMAogICAgICAjICAgICAgICAgICBzZXQgdmFycyhwb3N0X3JvdXRlX2Nsa19jYXBfZmFjdG9yKSAxLjAKICAgICAgIyAgICAgICAgICAgc2V0IHZhcnMocG9zdF9yb3V0ZV94Y2FwX2ZhY3RvcikgMS4wCiAgICAgICMgICAgICAgICBzZXQgdmFycyhxeHRlY2hfZmlsZSkgIiIKICAgICAgIyAgICAgICAgIHNldCB2YXJzKHF4Y29uZl9maWxlKSAiIgogICAgICAjICAgICAgICAgc2V0IHZhcnMocXhsaWJfZmlsZSkgIiIKICAgICAgIyAgICAgICAgIHNldCB2YXJzKHF4bGF5ZXJtYXBfZmlsZSkgIiIKICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgc2V0IG1hcChxeF90ZWNoX2ZpbGUpIHF4dGVjaF9maWxlCiAgICAgICAgICAgIHNldCBtYXAocXhfY29uZl9maWxlKSBxeGNvbmZfZmlsZQogICAgICAgICAgICBzZXQgbWFwKHF4X2xpYl9maWxlKSBxeGxpYl9maWxlCiAgIAogICAgICAgICAgICBmb3JlYWNoIG9wdGlvbiAicXhfdGVjaF9maWxlIHF4X2NvbmZfZmlsZSBxeF9saWJfZmlsZSIgewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lciksJG9wdGlvbildfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRtYXAoJG9wdGlvbikpICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxyY19jb3JuZXIpLCRvcHRpb24pCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRtYXAoJG9wdGlvbikpICIiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHF4X2xheWVybWFwX2ZpbGUpXX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocXJjX2xheWVyX21hcCldfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHF4bGF5ZXJtYXBfZmlsZSkgJHZhcnMocXJjX2xheWVyX21hcCkKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMocXhsYXllcm1hcF9maWxlKSAiIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHF4bGF5ZXJtYXBfZmlsZSkgJHZhcnMocXhfbGF5ZXJtYXBfZmlsZSkKICAgICAgICAgICAgICAgc2V0IHZhcnMocXJjX2xheWVyX21hcCkgJHZhcnMocXhfbGF5ZXJtYXBfZmlsZSkgCiAgICAgICAgICAgIH0KIyAgICAgICAgIH0KCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhsZWFrYWdlX2VmZm9ydCldICYmICFbaW5mbyBleGlzdHMgdmFycyhsZWFrYWdlX3Bvd2VyX2VmZm9ydCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGxlYWthZ2VfcG93ZXJfZWZmb3J0KSAkdmFycyhsZWFrYWdlX2VmZm9ydCkKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX2NwcHIpXSAmJiAoKCR2YXJzKGVuYWJsZV9jcHByKSA9PSAwKSB8fCAoJHZhcnMoZW5hYmxlX2NwcHIpID09IGZhbHNlKSl9IHsKICAgICAgICAgICAgc2V0IHZhcnMoZW5hYmxlX2NwcHIpIG5vbmUKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX2NwcHIpXSAmJiAoKCR2YXJzKGVuYWJsZV9jcHByKSA9PSAxKSB8fCAoJHZhcnMoZW5hYmxlX2NwcHIpID09IHRydWUpKX0gewogICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfY3BwcikgYm90aAogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWZfZmlsZSldfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogVmFyaWFibGUgZGVmX2ZpbGUgaGFzIGJlZW4gY2hhbmdlZCB0byBkZWZfZmlsZXMgLi4uIHBsZWFzZSB1cGRhdGVcbiIKICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiVmFyaWFibGUgZGVmX2ZpbGUgaGFzIGJlZW4gY2hhbmdlZCB0byBkZWZfZmlsZXMgLi4uIHBsZWFzZSB1cGRhdGUiCiAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICBzZXQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRlZl9maWxlKQogICAgICAgICB9CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgU2VlZCB0aGUgcmVzdCBvZiB0aGUgY29uZmlnIHZhcmlhYmxlcyBhbGxvd2luZyB1c2VyIG92ZXJyaWRlcyAuLi4KICAgIyBEZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHZhcmlhYmxlcyBhcmUgaW4gZGVmYXVsdHMudGNsCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc2NyaXB0X3BhdGgpXX0gewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2NyaXB0X3Jvb3QpXX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhzY3JpcHRfcGF0aCkgJHZhcnMoc2NyaXB0X3Jvb3QpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IFZhcmlhYmxlIHZhcnMoc2NyaXB0X3Jvb3QpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICBleGl0ICAxCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzY3JpcHRfcm9vdCldfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHNjcmlwdF9yb290KSAkdmFycyhzY3JpcHRfcGF0aCkKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc2V0dXBfcGF0aCldfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHNldHVwX3BhdGgpICIuIgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBjb21tYW5kIEZGRjo6Z2V0X3Rvb2xdIG5lICIiICYmIFtGRkY6OmdldF90b29sXSBlcSAicmMifSB7CiAgICAgICAgICAgdGNsX3NvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvcmRhX2RlZmF1bHRzLnRjbAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL2NvbW1vbl9kZWZhdWx0cy50Y2wKICAgICAgICAgICBzb3VyY2UgJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9JTk5PVlVTL2RlZmF1bHRzLnRjbAogICAgICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvcmRhX2RlZmF1bHRzLnRjbAogICAgICAgICB9CgogICAgICAgICBmb3JlYWNoIG9wdGlvbiBbYXJyYXkgbmFtZXMgcmRhX2RlZmF1bHRzXSB7CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJG9wdGlvbildfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKCRvcHRpb24pICRyZGFfZGVmYXVsdHMoJG9wdGlvbikKICAgICAgICAgICAgfSAgZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycygkb3B0aW9uKSAhPSAkcmRhX2RlZmF1bHRzKCRvcHRpb24pfSB7CiMgICAgICAgICAgICAgICAgICBwdXRzICIjIDxGRj4gSU5GTzogVXNlciBvdmVycmlkZSBvZiAkb3B0aW9uIHRvICR2YXJzKCRvcHRpb24pIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjcHVzX3Blcl9yZW1vdGVfaG9zdCldICYmIFtpbmZvIGV4aXN0cyB2YXJzKGNwdV9wZXJfcmVtb3RlX2hvc3QpXX0gewogICAgICAgICAgICBQdXRzICI8RkY+IElORk86IFNldHRpbmcgJ3ZhcnMoY3B1c19wZXJfcmVtb3RlX2hvc3QpJyB0byAndmFycyhjcHVfcGVyX3JlbW90ZV9ob3N0KSciCiAgICAgICAgICAgIFB1dHMgIjxGRj4gSU5GTzogICAgICAgICAgICAgICAgICBeIgogICAgICAgICAgICBQdXRzICI8RkY+IElORk86IFBsZWFzZSB1cGRhdGUgeW91ciBzZXR1cCB0byBjcHVzX3Blcl9yZW1vdGUgLi4uIgogICAgICAgICAgICBzZXQgdmFycyhjcHVzX3Blcl9yZW1vdGVfaG9zdCkgJHZhcnMoY3B1X3Blcl9yZW1vdGVfaG9zdCkKICAgICAgICAgfQoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfYXJ0X2Jhc2VkKV19IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZsZXhtb2RlbF9hc19wdG4pXSAmJiAkdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgICBzZXQgZmxvd19kZWZhdWx0cyhmbGV4bW9kZWxfYXJ0X2Jhc2VkKSAxCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydCkgJGZsb3dfZGVmYXVsdHMoaGlnaF90aW1pbmdfZWZmb3J0KQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19lY28pXSAmJiAoJHZhcnMoY2xvY2tfZWNvKSA9PSAicG9zdGN0cyIpfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgInBvc3RfY3RzIgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19lY28pXSAmJiAoJHZhcnMoY2xvY2tfZWNvKSA9PSAicG9zdHJvdXRlIil9IHsKICAgICAgICAgICAgc2V0IHZhcnMoY2xvY2tfZWNvKSAicG9zdF9yb3V0ZSIKICAgICAgICAgfQogICAgICAgICBpZiB7W3JlZ2V4cCAiOS4xIiAkdmFycyh2ZXJzaW9uKV19IHsgCiAgICAgICAgICAgIGlmIHskdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcml0aWNhbF9yYW5nZSldICYmICgkdmFycyhjcml0aWNhbF9yYW5nZSkgIT0gMS4wKX0gewogICAgICAgICAgICAgICAgICBQdXRzICI8RkY+IEhpZ2ggdGltaW5nIGVmZm9ydCBlbmFibGVkIGJ1dCBjcml0aWNhbF9yYW5nZSBvdmVycmlkZGVuIGJ5IHVzZXIgc2V0dGluZ3MiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2VjbyldICYmICgkdmFycyhjbG9ja19lY28pICE9ICJwb3N0X2N0cyIpfSB7CiAgICAgICAgICAgICAgICAgIFB1dHMgIjxGRj4gSGlnaCB0aW1pbmcgZWZmb3J0IGVuYWJsZWQgYnV0IGNsb2NrX2VjbyBvdmVycmlkZGVuIGJ5IHVzZXIgc2V0dGluZ3MiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGluX3BsYWNlX29wdCldICYmICEkdmFycyhpbl9wbGFjZV9vcHQpfSB7CiAgICAgICAgICAgICAgICAgIFB1dHMgIjxGRj4gSGlnaCB0aW1pbmcgZWZmb3J0IGVuYWJsZWQgYnV0IGluX3BsYWNlX29wdCBvdmVycmlkZGVuIGJ5IHVzZXIgc2V0dGluZ3MiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX2VuZ2luZSldICYmIChbc3RyaW5nIHRvbG93ZXIgJHZhcnMoY3RzX2VuZ2luZSldID09ICJjdHMiKX0gewogICAgICAgICAgICBzZXQgZmxvd19kZWZhdWx0cyh1cGRhdGVfaW9fbGF0ZW5jeSkgZmFsc2UKIyAgICAgICAgICAgIHNldCB2YXJzKGN0cyx1cGRhdGVfdGltaW5nLHNraXApIHRydWUKICAgICAgICAgfQoKICAgICAgICAgZm9yZWFjaCBvcHRpb24gW2FycmF5IG5hbWVzIGZsb3dfZGVmYXVsdHNdIHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycygkb3B0aW9uKV19IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoJG9wdGlvbikgJGZsb3dfZGVmYXVsdHMoJG9wdGlvbikKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydCkgJiYgW3JlZ2V4cCAiOS4xIiAkdmFycyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoaW5fcGxhY2Vfb3B0KSB0cnVlCiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGNyaXRpY2FsX3JhbmdlKSAxLjAKIyAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHVzZWZ1bF9za2V3KSB0cnVlCiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgcG9zdF9jdHMKICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgaWYgeyR2YXJzKGN0c19lbmdpbmUpID09ICJjY29wdF9kZXNpZ24ifSB7CiMgICAgICAgICAgICAgICAgICBzZXQgdmFycyhjY29wdF9lZmZvcnQpIGxvdwojICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZV9pbmZvX2RiKV19IHsKICAgICAgICAgICAgc2V0IGZsb3dfZGVmYXVsdHModGltZV9pbmZvX2RiKSAkdmFycyhycHRfZGlyKS90aW1lX2luZm8uZGIKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRpbWVfaW5mb19mdWxsX3JwdCldfSB7CiAgICAgICAgICAgIHNldCBmbG93X2RlZmF1bHRzKHRpbWVfaW5mb19mdWxsX3JwdCkgJHZhcnMocnB0X2RpcikvdGltZV9pbmZvX2Z1bGwucnB0CiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhodG1sX3N1bW1hcnkpXX0gewogICAgICAgICAgICBzZXQgZmxvd19kZWZhdWx0cyhodG1sX3N1bW1hcnkpICR2YXJzKHJwdF9kaXIpL3N1bW1hcnkuaHRtbAogICAgICAgICB9CgogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9zaV9hd2FyZSldfSB7CiMgICAgICAgICAgICBpZiB7W3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXSA8PSA2NX0gewojICAgICAgICAgICAgICAgc2V0IHZhcnMoZW5hYmxlX3NpX2F3YXJlKSB0cnVlCiMgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfc2lfYXdhcmUpIGZhbHNlCiMgICAgICAgICAgICB9CiAgICAgICAgIH0KCgogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGRic19mb3JtYXQpXX0gewogICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMobmV0bGlzdF90eXBlKSAidmVyaWxvZyJdPj0wfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKGRic19mb3JtYXQpIGZlCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKGRic19mb3JtYXQpIG9hCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9kaXIpXX0geyAKICAgICAgICAgICAgc2V0IHZhcnMocGFydGl0aW9uX2RpcikgUEFSVElUSU9OCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKV19IHsgCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikgJHZhcnMocGFydGl0aW9uX2RpcilfUFJFQ1RTCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpICR2YXJzKHBhcnRpdGlvbl9kaXIpX0NUUwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKHVzZXJfbW9kZSkgPT0gImhpZXIifSB7CiAgICAgICAgICAgIEZGX0VESTo6bm9ybWFsaXplX2ZpbGVzCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKIyAgICAgICAgICAgICAgIHNldCB2YXJzKGN0cyxzdGFydGluZ19kYnMpICJcW2dsb2IgKl9wb3N0RUNPLmVuY1xdIgojICAgICAgICAgICAgICAgIyBETE0gaXMgYSB0d28gcGFzcyBmbG93IGJ1dCB1c2VyIGRvZXNuJ3QgbmVlZCB0byBzcGVjaWZ5IGl0CiAgICAgICAgICAgICAgIHNldCB2YXJzKGhpZXJfZmxvd190eXBlKSAiMnBhc3MiCiMgICAgICAgICAgICAgICBzZXQgdmFycyhwbGFjZV9vcHRfZGVzaWduKSBmYWxzZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIycGFzcyJ9IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMocG9zdGN0cyxzdGFydGluZ19kYnMpIC4KICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG9hX2Fic3RyYWN0X25hbWUpXX0geyBzZXQgdmFycyhvYV9hYnN0cmFjdF9uYW1lKSBhYnN0cmFjdH0KICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9sYXlvdXRfbmFtZSldfSB7IHNldCB2YXJzKG9hX2xheW91dF9uYW1lKSBsYXlvdXR9CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMob2FfZGVzaWduX2NlbGwpXX0geyBzZXQgdmFycyhvYV9kZXNpZ25fY2VsbCkgJHZhcnMoZGVzaWduKX0KICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fdmlldyldfSB7IHNldCB2YXJzKG9hX2Rlc2lnbl92aWV3KSAiIn0KICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9wYXJ0aXRpb25fbGliKV19IHsgc2V0IHZhcnMob2FfcGFydGl0aW9uX2xpYikgT0FfUFROX0xJQn0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhvYV9hYnN0cmFjdF9uYW1lKV19IHsgc2V0IHZhcnMob2FfYWJzdHJhY3RfbmFtZSkgIiJ9CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMob2FfbGF5b3V0X25hbWUpXX0geyBzZXQgdmFycyhvYV9sYXlvdXRfbmFtZSkgIiJ9CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMob2FfZGVzaWduX2NlbGwpXX0geyBzZXQgdmFycyhvYV9kZXNpZ25fY2VsbCkgIiJ9CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMob2FfZGVzaWduX3ZpZXcpXX0geyBzZXQgdmFycyhvYV9kZXNpZ25fdmlldykgIiJ9CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMob2FfZGVzaWduX2xpYildfSB7IHNldCB2YXJzKG9hX2Rlc2lnbl9saWIpICIifQogICAgICAgICB9CgogICAgICAgICBpZiB7KFtzdHJpbmcgdG9sb3dlciAkdmFycyhmaXhfaG9sZCldID09ICJ0cnVlIikgfHwgKCR2YXJzKGZpeF9ob2xkKSA9PSAxKX0gewogICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGZpeF9ob2xkKSBmcm9tICR2YXJzKGZpeF9ob2xkKSB0byBcIiRmbG93X2RlZmF1bHRzKGZpeF9ob2xkKVwiIgogICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgc2V0IHZhcnMoZml4X2hvbGQpICRmbG93X2RlZmF1bHRzKGZpeF9ob2xkKQogICAgICAgICB9CiAgICAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKGVuYWJsZV9vY3YpXSA9PSAidHJ1ZSIpIHx8ICgkdmFycyhlbmFibGVfb2N2KSA9PSAxKX0gewogICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGVuYWJsZV9vY3YpIGZyb20gXCIkdmFycyhlbmFibGVfc3MpXCIgdG8gXCJwcmVfcG9zdHJvdXRlXCIiCiAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfb2N2KSBwcmVfY3RzCiAgICAgICAgIH0gZWxzZWlmIHsoJHZhcnMoZW5hYmxlX29jdikgPT0gIm5vbmUiKSB8fCAoJHZhcnMoZW5hYmxlX29jdikgPT0gMCl9IHsKICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiQ2hhbmdpbmcgdmFycyhlbmFibGVfb2N2KSBmcm9tIFwiJHZhcnMoZW5hYmxlX29jdilcIiB0byBcImZhbHNlXCIiCiAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfb2N2KSBmYWxzZQogICAgICAgICB9CiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDExfSB7CiAgICAgICAgICAgIGlmIHtbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZW5hYmxlX29jdildID09ICJmYWxzZSJ9IHsKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTV9IHsKICAgICAgICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiQ2hhbmdpbmcgdmFycyhlbmFibGVfb2N2KSBmcm9tIFwiJHZhcnMoZW5hYmxlX29jdilcIiB0byBcInByZV9wb3N0cm91dGVcIiIKICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9vY3YpICJwcmVfcG9zdHJvdXRlIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGVuYWJsZV9vY3YpIGZyb20gXCIkdmFycyhlbmFibGVfb2N2KVwiIHRvIFwicHJlX2N0c1wiIgogICAgICAgICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZW5hYmxlX29jdikgInByZV9jdHMiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKGVuYWJsZV9zcyldID09ICJ0cnVlIikgfHwgKCR2YXJzKGVuYWJsZV9zcykgPT0gMSl9IHsKICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiQ2hhbmdpbmcgdmFycyhlbmFibGVfc3MpIGZyb20gJHZhcnMoZW5hYmxlX3NzKSB0byBcInByZV9wb3N0cm91dGVcIiIKICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9zcykgcHJlX3Bvc3Ryb3V0ZQogICAgICAgICB9IGVsc2VpZiB7KCR2YXJzKGVuYWJsZV9zcykgPT0gIm5vbmUiKSB8fCAoJHZhcnMoZW5hYmxlX3NzKSA9PSAwKX0gewogICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGVuYWJsZV9zcykgZnJvbSAkdmFycyhlbmFibGVfc3MpIHRvIFwiZmFsc2VcIiIKICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgIHNldCB2YXJzKGVuYWJsZV9zcykgZmFsc2UKICAgICAgICAgfQogICAgICAgICBpZiB7KFtzdHJpbmcgdG9sb3dlciAkdmFycyhtZXRhbGZpbGwpXSA9PSAibm9uZSIpIHx8IChbc3RyaW5nIHRvbG93ZXIgJHZhcnMobWV0YWxmaWxsKV0gPT0gImZhbHNlIiAmJiAkdmFycyhtZXRhbGZpbGwpICE9ICJmYWxzZSIpIHx8ICgkdmFycyhtZXRhbGZpbGwpID09IDApfSB7CiAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNoYW5naW5nIHZhcnMobWV0YWxmaWxsKSBmcm9tICR2YXJzKG1ldGFsZmlsbCkgdG8gXCJmYWxzZVwiIgogICAgICAgICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgICAgICAgc2V0IHZhcnMobWV0YWxmaWxsKSBmYWxzZQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19lY28pXX0gewogICAgICAgICAgICBpZiB7KCR2YXJzKGNsb2NrX2VjbykgPT0gInRydWUiKSB8fCAoJHZhcnMoY2xvY2tfZWNvKSA9PSAxKX0gewogICAgICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGNsb2NrX2VjbykgZnJvbSAkdmFycyhjbG9ja19lY28pIHRvIFwicG9zdF9jdHNcIiIKICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgcG9zdF9jdHMKICAgICAgICAgICAgfSBlbHNlaWYgeygkdmFycyhjbG9ja19lY28pID09ICJmYWxzZSIpIHx8ICgkdmFycyhjbG9ja19lY28pID09IDApfSB7CiAgICAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNoYW5naW5nIHZhcnMoY2xvY2tfZWNvKSBmcm9tICR2YXJzKGNsb2NrX2VjbykgdG8gXCJub25lXCIiCiAgICAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICAgICBzZXQgdmFycyhjbG9ja19lY28pIG5vbmUKICAgICAgICAgICAgfSBlbHNlaWYgeygkdmFycyhjbG9ja19lY28pID09ICJwcmVyb3V0ZSIpIHx8ICgkdmFycyhjbG9ja19lY28pID09ICJwcmVfcm91dGUiKX0gewogICAgICAgICAgICAgICBzZXQgaW5mb3MoJHZhcnMoaW5mb19jb3VudCkpICJDaGFuZ2luZyB2YXJzKGNsb2NrX2VjbykgZnJvbSAkdmFycyhjbG9ja19lY28pIHRvIFwicG9zdF9jdHNcIiIKICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgcG9zdF9jdHMKICAgICAgICAgICAgfSBlbHNlaWYgeyR2YXJzKGNsb2NrX2VjbykgPT0gInBvc3Ryb3V0ZSJ9IHsKICAgICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiQ2hhbmdpbmcgdmFycyhjbG9ja19lY28pIGZyb20gJHZhcnMoY2xvY2tfZWNvKSB0byBcInBvc3Rfcm91dGVcIiIKICAgICAgICAgICAgICAgaW5jciB2YXJzKGluZm9fY291bnQpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNsb2NrX2VjbykgcG9zdF9yb3V0ZQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnModXNlX2ZsZXhtb2RlbHMpXSA9PSAidHJ1ZSIpIHx8ICgkdmFycyh1c2VfZmxleG1vZGVscykgPT0gMSl9IHsKICAgICAgICAgICAgc2V0IHZhcnModXNlX2ZsZXhtb2RlbHMpIDEKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnModXNlX2ZsZXhtb2RlbHMpIDAKICAgICAgICAgfQojICAgICAgICAgaWYgeyR2YXJzKHVzZV9mbGV4bW9kZWxzKSAmJiAkdmFycyhwbGFjZV9vcHRfZGVzaWduKX0gewojICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiU2V0dGluZyB2YXJzKHBsYWNlX29wdF9kZXNpZ24pIHRvICdmYWxzZScgYXMgdmFycyh1c2VfZmxleG1vZGVscykgaXMgdHJ1ZSIKIyAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQojICAgICAgICAgICAgc2V0IHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikgZmFsc2UKIyAgICAgICAgIH0KICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZmxleG1vZGVsX2FzX3B0bildID09ICJ0cnVlIikgfHwgKCR2YXJzKGZsZXhtb2RlbF9hc19wdG4pID09IDEpfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGZsZXhtb2RlbF9hc19wdG4pIDEKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnMoZmxleG1vZGVsX2FzX3B0bikgMAogICAgICAgICB9CiAgICAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKHBsYWNlbWVudF9iYXNlZF9wdG4pXSA9PSAidHJ1ZSIpIHx8ICgkdmFycyhwbGFjZW1lbnRfYmFzZWRfcHRuKSA9PSAxKX0gewogICAgICAgICAgICBzZXQgdmFycyhwbGFjZW1lbnRfYmFzZWRfcHRuKSAxCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKHBsYWNlbWVudF9iYXNlZF9wdG4pIDAKICAgICAgICAgfQogICAgICAgICBpZiB7KFtzdHJpbmcgdG9sb3dlciAkdmFycyhhYnV0dGVkX2Rlc2lnbildID09ICJ0cnVlIikgfHwgKCR2YXJzKGFidXR0ZWRfZGVzaWduKSA9PSAxKX0gewogICAgICAgICAgICBzZXQgdmFycyhhYnV0dGVkX2Rlc2lnbikgMQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhhYnV0dGVkX2Rlc2lnbikgMAogICAgICAgICB9CiAgICAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKGluc2VydF9mZWVkdGhyb3VnaCldID09ICJ0cnVlIikgfHwgKCR2YXJzKGluc2VydF9mZWVkdGhyb3VnaCkgPT0gMSl9IHsKICAgICAgICAgICAgc2V0IHZhcnMoaW5zZXJ0X2ZlZWR0aHJvdWdoKSAxCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKGluc2VydF9mZWVkdGhyb3VnaCkgMAogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocmVzaXplX3NoaWZ0ZXJfYW5kX2lzb19pbnN0cyldIHx8ICR2YXJzKHJlc2l6ZV9zaGlmdGVyX2FuZF9pc29faW5zdHMpID09ICIifSB7CiAgICAgICAgICAgIHNldCB2YXJzKHJlc2l6ZV9zaGlmdGVyX2FuZF9pc29faW5zdHMpIHRydWUKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGFjdGl2aXR5X2ZpbGVfZm9ybWF0KV0gfHwgJHZhcnMoYWN0aXZpdHlfZmlsZV9mb3JtYXQpID09ICIifSB7CiAgICAgICAgICAgIHNldCB2YXJzKGFjdGl2aXR5X2ZpbGVfZm9ybWF0KSBUQ0YKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX25ldHMpXX0gewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocHdybmV0KV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBWYXJpYWJsZSBwd3JuZXQgaGFzIGJlZW4gY2hhbmdlZCB0byBwb3dlcl9uZXRzIC4uLiBwbGVhc2UgdXBkYXRlXG4iCiAgICAgICAgICAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIlZhcmlhYmxlIHB3cm5ldCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHBvd2VyX25ldHMgLi4uIHBsZWFzZSB1cGRhdGUiCiAgICAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICAgICBzZXQgdmFycyhwb3dlcl9uZXRzKSAkdmFycyhwd3JuZXQpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHBvd2VyX25ldHMpICIiCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGdyb3VuZF9uZXRzKV19IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGduZG5ldCldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogVmFyaWFibGUgZ25kbmV0IGhhcyBiZWVuIGNoYW5nZWQgdG8gZ3JvdW5kX25ldHMgLi4uIHBsZWFzZSB1cGRhdGVcbiIKICAgICAgICAgICAgICAgc2V0IGluZm9zKCR2YXJzKGluZm9fY291bnQpKSAiVmFyaWFibGUgZ25kbmV0IGhhcyBiZWVuIGNoYW5nZWQgdG8gZ3JvdW5kX25ldHMgLi4uIHBsZWFzZSB1cGRhdGUiCiAgICAgICAgICAgICAgIGluY3IgdmFycyhpbmZvX2NvdW50KQogICAgICAgICAgICAgICBzZXQgdmFycyhncm91bmRfbmV0cykgJHZhcnMoZ25kbmV0KQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdmFycyhncm91bmRfbmV0cykgIiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc3VwZXJob3N0cyldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKHN1cGVyaG9zdHMpIDAKICAgICAgICAgfQoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzdXBlcnRocmVhZHMpXX0gewogICAgICAgICAgICBzZXQgdmFycyhzdXBlcnRocmVhZHMpIDEKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeygkdmFycyh0aHJlYWRzKSA+IDEpICYmICgkdmFycyhzdXBlcnRocmVhZHMpID09IDEpfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHN1cGVydGhyZWFkcykgJHZhcnModGhyZWFkcykKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobWFrZWZpbGUpXX0gewogICAgICAgICAgICBzZXQgdmFycyhtYWtlZmlsZSkgMQogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZmxhdCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGZsYXQpIG5vbmUKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGFib3J0KV19IHsKICAgICAgICAgICAgc2V0IHZhcnMoYWJvcnQpIDAKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNhdGNoX2Vycm9ycyldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGNhdGNoX2Vycm9ycykgMQogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocmVzdG9yZV9kZXNpZ24pXX0gewogICAgICAgICAgICBzZXQgdmFycyhyZXN0b3JlX2Rlc2lnbikgMQogICAgICAgICB9CiAgICAgICAgIGlmIHskdmFycyhjYXRjaF9lcnJvcnMpfSB7CiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc2F2ZV9vbl9jYXRjaCldfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHNhdmVfb25fY2F0Y2gpIDEKICAgICAgICAgICAgfSAKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhleGl0X29uX2Vycm9yKV19IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoZXhpdF9vbl9lcnJvcikgMQogICAgICAgICAgICB9IAogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIGVudihWUEFUSCldfSB7CiAgICAgICAgICAgIHNldCBlbnYoVlBBVEgpICRmbG93X2RlZmF1bHRzKHZwYXRoKQogICAgICAgICAgICBQdXRzICI8RkY+IElORk86IFNldHRpbmcgZW52KFZQQVRIKSB0byAkZmxvd19kZWZhdWx0cyh2cGF0aCkiCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV19IHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjcGZfdGltaW5nKV19IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoY3BmX3RpbWluZykgdHJ1ZQojICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxhdCkgdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKGNwZl90aW1pbmcpIGZhbHNlCiAgICAgICAgIH0KCiAgICAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsgCiAgICAgICAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddfSB7CiAgICAgICAgICAgICAgIGNhdGNoIHthbGlhcyBmZl9tb2RpZnlfcG93ZXJfZG9tYWlucyBGRl9FREk6Om1vZGlmeV9wb3dlcl9kb21haW5zfQogICAgICAgICAgICAgICBjYXRjaCB7YWxpYXMgZmZfYWRkX3Bvd2VyX3N3aXRjaGVzIEZGX0VESTo6YWRkX3Bvd2VyX3N3aXRjaGVzfQogICAgICAgICAgICAgICBjYXRjaCB7YWxpYXMgZmZfcm91dGVfc2Vjb25kYXJ5X3BnX25ldHMgRkZfRURJOjpyb3V0ZV9zZWNvbmRhcnlfcGdfbmV0c30KICAgICAgICAgICAgICAgY2F0Y2gge2FsaWFzIGZmX2dldF9wb3dlcl9kb21haW5zIEZGX0VESTo6Z2V0X3Bvd2VyX2RvbWFpbnN9CiAgICAgICAgICAgICAgIGNhdGNoIHthbGlhcyBmZl9idWZmZXJfYWx3YXlzX29uX25ldHMgRkZfRURJOjpidWZmZXJfYWx3YXlzX29uX25ldHN9CiAgICAgICAgICAgICAgIGNhdGNoIHthbGlhcyBmZl9pbnNlcnRfd2VsbHRhcHNfZW5kY2FwcyBGRl9FREk6Omluc2VydF93ZWxsdGFwc19lbmRjYXBzfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBmbG93X2RlZmF1bHRzKHNjcmlwdF9kaXIpICIuIgogICAgICAgIH0KCiMgUmVtZW1iZXIgdGhlc2UgZm9yIHN0ZXAgYmFzZWQgcmVwb3J0aW5nIC4uLgogICAgICAgICBzZXQgdmFycyhvcmlnX3JwdF9kaXIpICAkdmFycyhycHRfZGlyKQogICAgICAgICBzZXQgdmFycyhvcmlnX2xvZ19kaXIpICAkdmFycyhsb2dfZGlyKQogICAgICAgICBzZXQgdmFycyhvcmlnX2Ric19kaXIpICAkdmFycyhkYnNfZGlyKQoKIyBBZGQgdGhlc2UgZm9yIGdldCBtZXRyaWMKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhodG1sX3N1bW1hcnkpXX0gewogICAgICAgICAgICBzZXQgdmFycyhodG1sX3N1bW1hcnkpICAkdmFycyhycHRfZGlyKS9zdW1tYXJ5Lmh0bWwKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRpbWVfaW5mb19kYildfSB7CiAgICAgICAgICAgIHNldCB2YXJzKHRpbWVfaW5mb19kYikgICR2YXJzKHJwdF9kaXIpL3RpbWVfaW5mby5kYgogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZV9pbmZvX3JwdCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKHRpbWVfaW5mb19ycHQpICAkdmFycyhycHRfZGlyKS90aW1lX2luZm8ucnB0CiAgICAgICAgIH0KCiAgICAgICAgIGlmIHtbaW5mbyBjb21tYW5kIEZGRjo6Z2V0X3Rvb2xdIG5lICIiICYmIFtGRkY6OmdldF90b29sXSBlcSAicmMifSB7CiAgICAgICAgICAgdGNsX3NvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvdWRtLnRjbAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvdWRtLnRjbAogICAgICAgICB9CiAgICAgICAgIGlmIHshJHZhcnMocmMpIHx8ICgkdmFycyhyYykgJiYgIVtpbmZvIGV4aXN0cyB2YXJzKHJjX3N0ZXBzKV0pfSB7CiAgICAgICAgICAgIHNldCB2YXJzKHNlZWQpIDEKICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgRkZfRURJOjpub3JtYWxpemVfY29uc3RyYWludHMgCiMgICAgICB9CgogICAgICAjIERpc2FibGUgdGhpcyBmb3IgMTQuMjAKICAgICAgc2V0IHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcykgMAoKICAgICAgaWYgeyR2YXJzKGdlbmVyYXRlX2Zsb3dfc3RlcHMpfSB7CiAgICAgICAgIHNldCB2YXJzKHNraXBfc2lnbm9mZl9jaGVja3MpIHRydWUKICAgICAgICAgRkZfRURJOjpub3JtYWxpemVfZmlsZXMgCiAgICAgIH0KCiMgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiMgICAgICAgICBzZXQgdmFycyhza2lwX3NpZ25vZmZfY2hlY2tzKSBmYWxzZQojICAgICAgfQogICAgICAjICBSQyBTdHVmZiAuLi4KICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgaWYgeyR2YXJzKHJjKX0gewogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG92Zl9kaXIpXX0geyBzZXQgdmFycyhvdmZfZGlyKSBPVkYgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGxlY19kaXIpXX0geyBzZXQgdmFycyhsZWNfZGlyKSBMRUMgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9yY3ApXX0geyBzZXQgdmFycyhlbmFibGVfcmNwKSAwIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfcGFtKV19IHsgc2V0IHZhcnMoZW5hYmxlX3BhbSkgMCB9CiAgICAgICAgIHNldCB2YXJzKHN5bl9tYXAsc2V0X21pc2NfYXR0cmlidXRlcyxza2lwKSBmYWxzZQogICAgICAgICBzZXQgdmFycyhzeW5fbWFwLHNldF9saWJfYXR0cmlidXRlcyxza2lwKSBmYWxzZQogICAgICAgICBzZXQgdmFycyhzeW5fbWFwLHNldF9oZGxfYXR0cmlidXRlcyxza2lwKSBmYWxzZQogICAgICAgICBzZXQgdmFycyhzeW5fbWFwLHNldF9pY2dfYXR0cmlidXRlcyxza2lwKSB0cnVlCiAgICAgICAgIHNldCB2YXJzKHN5bl9tYXAsc2V0X2RmdF9hdHRyaWJ1dGVzLHNraXApIHRydWUKICAgICAgICAgc2V0IHZhcnMoc3luX2luY3Isc2V0X29wdF9hdHRyaWJ1dGVzLHNraXApIHRydWUKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBTZXQgbmV0bGlzdCBhbmQgZGVmIHZhcmlhYmxlcyB3aGVuIFJDIC8gUkNQIGVuYWJsZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3JjcCl9IHsKICAgICAgICAgICAgc2V0IHZhcnMobmV0bGlzdCkgJHZhcnMoZGJzX2Rpcikvc3luX3BsYWNlL3N5bl9wbGFjZS52Lmd6CiAgICAgICAgICAgIHNldCB2YXJzKGRlZl9maWxlcykgJHZhcnMoZGJzX2Rpcikvc3luX3BsYWNlL3N5bl9wbGFjZS5kZWYuZ3oKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnMobmV0bGlzdCkgJHZhcnMoZGJzX2Rpcikvc3luX2luY3Ivc3luX2luY3Iudi5negojICAgICAgICAgICAgc2V0IHZhcnMoZGVmX2ZpbGVzKSAkdmFycyhkYnNfZGlyKS9zeW5faW5jci9zeW5faW5jci5kZWYuZ3oKICAgICAgICAgfQogICAgICB9CgogICB9CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgUHJvY2VkdXJlIHRvIGNoZWNrIHRoZSBmbG93IHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBzZXR1cC50Y2wKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICBwcm9jIGNoZWNrX3NldHVwIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCB0dmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCB3YXJuaW5ncwogICAgICBnbG9iYWwgaW5mb3MKICAgICAgZ2xvYmFsIGNoZWNrCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2hlY2tfc2V0dXApXSAgJiYgISR2YXJzKGNoZWNrX3NldHVwKX0gewogICAgICAgICByZXR1cm4KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHdhcm5pbmdfY291bnQpXX0gewogICAgICAgICBzZXQgd2FybmluZ19jb3VudCAkdmFycyh3YXJuaW5nX2NvdW50KQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgd2FybmluZ19jb3VudCAwCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGVycm9yX2NvdW50KV19IHsKICAgICAgICAgc2V0IGVycm9yX2NvdW50ICR2YXJzKGVycm9yX2NvdW50KQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgZXJyb3JfY291bnQgMAogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbmZvX2NvdW50KV19IHsKICAgICAgICAgc2V0IGluZm9fY291bnQgJHZhcnMoaW5mb19jb3VudCkKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGluZm9fY291bnQgMAogICAgICB9CgogICAgICBpZiB7JHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIkZlYXR1cmUgdmFycyhwbGFjZV9vcHRfZGVzaWduKSBub3Qgc3VwcG9ydCBmb3IgdG9wIGxldmVsIGltcGxlbWVudGF0aW9uIHdoZW4gdmFycyhlbmFibGVfZmxleGlsbSkgaXMgdHJ1ZSIKICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV19IHsKICAgICAgICAgaWYge1tsc2VhcmNoIFtjb25jYXQgJHZhcnMoc2V0dXBfYW5hbHlzaXNfdmlld3MpICR2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpXSAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV0gPT0gLTF9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUG93ZXIgYW5hbHlzaXMgdmlldyAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KSBpcyBub3QgYSBkZWZpbmVkIHZpZXdcbiIKICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJQb3dlciBhbmFseXNpcyB2aWV3ICR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpIGlzIG5vdCBhIGRlZmluZWQgdmlldyIKICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNldCB2YWxpZCBbbGlzdCB0cmlhbF9pcG8gZ2lnYV9vcHQgcHJvdG9fbmV0X2RlbGF5X21vZGVsXQogICAgICBpZiB7W2xzZWFyY2ggJHZhbGlkIFtzdHJpbmcgdG9sb3dlciAkdmFycyhidWRnZXRfbW9kZSldXSA9PSAtMX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKGJ1ZGdldF9tb2RlKSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycyhidWRnZXRfbW9kZSlcbiIKICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKGJ1ZGdldF9tb2RlKSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycyhidWRnZXRfbW9kZSkiCiAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX2VuZ2luZSldfSB7CiAgICAgICAgIGlmIHtbc3RyaW5nIHRvbG93ZXIgJHZhcnMoY3RzX2VuZ2luZSldID09ICJjY29wdGRlc2lnbiJ9IHsgCiAgICAgICAgICAgIHNldCB2YXJzKGN0c19lbmdpbmUpIGNjb3B0IAogICAgICAgICB9IAogICAgICAgICBpZiB7W3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXSA9PSAiY2xvY2tkZXNpZ24ifSB7IAogICAgICAgICAgICBzZXQgdmFycyhjdHNfZW5naW5lKSBjdHMgCiAgICAgICAgIH0KICAgICAgICAgc2V0IHZhbGlkIFtsaXN0IGN0cyBjY29wdCBjY29wdF9jdHNdCiAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFsaWQgW3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXV0gPT0gLTF9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycyhjdHNfZW5naW5lKSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycyhjdHNfZW5naW5lKVxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMoY3RzX2VuZ2luZSkgaGFzIGlsbGVnYWwgdmFsdWUgJHZhcnMoY3RzX2VuZ2luZSkiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c19zcGVjKV19IHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogVmFyaWFibGUgY3RzX3NwZWMgZGVmaW5lZCBzbyBzZXQgY3RzX2VuZ2luZSB0byBjdHNcbiIKIyAgICAgICAgIHNldCBpbmZvcygkaW5mb19jb3VudCkgIlZhcmlhYmxlIGN0c19zcGVjIGRlZmluZWQgc28gc2V0IGN0c19lbmdpbmUgdG8gY3RzIgojICAgICAgICAgaW5jciBpbmZvX2NvdW50CiMgICAgICAgICBzZXQgdmFycyhjdHNfZW5naW5lKSBjdHMKIyAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhjdHNfc3BlYykgewojICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJGZpbGUKIyAgICAgICAgIH0KIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgY3RzX3NwZWMgPSAkdmFycyhjdHNfc3BlYylcbiIKIyAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjY29wdF9pbnRlZ3JhdGlvbildfSB7CiAgICAgICAgIHNldCB2YWxpZCB7c2NyaXB0ZWQgbmF0aXZlfQogICAgICAgICBpZiB7W2xzZWFyY2ggJHZhbGlkICR2YXJzKGNjb3B0X2ludGVncmF0aW9uKV0gPT0gLTF9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycyhjdHNfZW5naW5lKSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycyhjdHNfZW5naW5lKVxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMoY3RzX2VuZ2luZSkgaGFzIGlsbGVnYWwgdmFsdWUgJHZhcnMoY3RzX2VuZ2luZSkiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICAjIERlZmF1bHQgdG8gbmF0aXZlIGludGVncmF0aW9uCiAgICAgICAgIHNldCB2YXJzKGNjb3B0X2ludGVncmF0aW9uKSAibmF0aXZlIgogICAgICB9CiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyB2YXJzXSB7CiAgICAgICAgICAgIHNldCBzYXZlX3ZhcnMoJHZhcikgJHZhcnMoJHZhcikKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB0dmFycygkdmFyKV19IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoJHZhcikgJHR2YXJzKCR2YXIpCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICBzZXQgY29tbWFuZHMgICIiCgogICAgICBzZXQgY2hlY2soZmlsZXMpIFtsaXN0XQogICAgICBzZXQgY2hlY2soaW50ZWdlcnMpIFtsaXN0XQoKCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoYWJvcnQpXX0gewogICAgICAgICBzZXQgdmFycyhhYm9ydCkgMAogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2hlY2tfdmFycyldICYmICR2YXJzKGNoZWNrX3ZhcnMpfSB7CiAgICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcm9vdCkvRVRDL0lOTk9WVVMvY2hlY2tfdmFycy50Y2wKICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgIFJlcXVpcmVkIFZhcmlhYmxlc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgc2V0IGNvdW50IDAKICAgICAgZm9yZWFjaCByZXF1aXJlZCAiZnBfdGNsX2ZpbGUgZnBfZmlsZSBkZWZfZmlsZXMiIHsKICAgICAgICAgaWYgeyEkdmFycyhyYyl9IHsKICAgICAgICAgICAjIEJDTDogT25seSBjaGVjayBmb3IgdmFycyhkZWZfZmlsZXMpIGlmIG5vdCBpbiBSQyBtb2RlCiAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyZXF1aXJlZCldICYmICgkdmFycygkcmVxdWlyZWQpICE9ICIiKX0gewogICAgICAgICAgICAgIGlmIHskcmVxdWlyZWQgPT0gImRlZl9maWxlcyJ9IHsKICAgICAgICAgICAgICAgICBzZXQgZmlyc3QgMQogICAgICAgICAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCBhcm91bmQgdmFycyhkZWZfZmlsZXMpIHRvIHJlc29sdmUgdmFycyhydW5kaXIpCiAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlIFtzdWJzdCAkdmFycyhkZWZfZmlsZXMpXSB7CiAgICAgICAgICAgICAgICAgICAgaWYgeyRmaXJzdCA9PSAxfSB7CiAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkcmVxdWlyZWQgPSAkZmlsZVxuIgogICAgICAgICAgICAgICAgICAgICAgIHNldCBmaXJzdCAwCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICAgICAgICAgICAgICRmaWxlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiB7ISR2YXJzKHJjKX0geyAKICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkZmlsZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycygkcmVxdWlyZWQpCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkcmVxdWlyZWQgPSAkdmFycygkcmVxdWlyZWQpXG4iCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGluY3IgY291bnQKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZnBfdGNsX3Byb2MpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIGZwX3RjbF9wcm9jID0gJHZhcnMoZnBfdGNsX3Byb2MpXG4iCiAgICAgICAgIGluY3IgY291bnQKICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG9hX2ZwKV19IHsgCiAgICAgICAgIGlmIHtbbGxlbmd0aCAkdmFycyhvYV9mcCldID09IDN9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgICAgICBvYV9mcCA9ICR2YXJzKG9hX2ZwKVxuIgogICAgICAgICAgICBpbmNyIGNvdW50CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IE9BIGZsb29ycGxhbiB2YXJpYWJsZSAob2FfZnApIHNob3VsZCBiZSAnbGliIGNlbGwgdmlldyciCiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiT0EgZmxvb3JwbGFuIHZhcmlhYmxlIChvYV9mcCkgc2hvdWxkIGJlICdsaWIgY2VsbCB2aWV3JyIKICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIHskY291bnQgPT0gMH0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IE5laXRoZXIgZnBfZmlsZSwgZGVmX2ZpbGVzLCBmcF90Y2xfZmlsZSwgZnBfdGNsX3Byb2MgYXJlIGRlZmluZWRcbiIKICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiRWl0aGVyIGZwX2ZpbGUsIGRlZl9maWxlcywgZnBfdGNsX2ZpbGUsIGZwX3RjbF9wcm9jIHNob3VsZCBiZSBkZWZpbmVkIgogICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMobmV0bGlzdF90eXBlKSAidmVyaWxvZyJdPj0wfSB7CiAgICAgICAgICMgQkNMOiBOb3RlIC0gVGhpcyBjb2RlIHJlbW92ZWQgYXMgdGhlIFJDIEZvdW5kYXRpb24gRmxvdyB3aWxsIHNldCB2YXJzKGRlZl9uZXRsaXN0KSB3aGVuIGl0CiAgICAgICAgICMgaXNuJ3QgZGVmaW5lZCBpbiB0aGUgdXNlcidzIHNldHVwLnRjbAogICAgICAgICAjaWYgeyR2YXJzKHJjKSAmJiAhW2luZm8gZXhpc3RzIHZhcnMobmV0bGlzdCldfSB7CiAgICAgICAgICMgICBzZXQgdmFycyhuZXRsaXN0KSAkdmFycyhkYnNfZGlyKS8kdmFycyhkZXNpZ24pLnN5bl9wbGFjZWQudi5negogICAgICAgICAjfQogICAgICAgICBpZiB7ISR2YXJzKHJjKX0gewogICAgICAgICAgICMgQkNMOiBPbmx5IGNoZWNrIGZvciB2YXJzKG5ldGxpc3QpIGlmIG5vdCBpbiBSQyBtb2RlCiAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG5ldGxpc3QpXX0gewogICAgICAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCBhcm91bmQgdmFycyhuZXRsaXN0KQogICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSBbc3Vic3QgJHZhcnMobmV0bGlzdCldIHsKICAgICAgICAgICAgICAgICBpZiB7ISR2YXJzKHJjKX0gewogICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICRmaWxlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIG5ldGxpc3QgPSAkdmFycyhuZXRsaXN0KVxuIgogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgeygkdmFycyhuZXRsaXN0X3R5cGUpID09ICJWZXJpbG9nIil9IHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBBIHZlcmlsb2cgbmV0bGlzdCBmaWxlIG11c3QgYmUgZGVmaW5lZFxuIgogICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiQSB2ZXJpbG9nIG5ldGxpc3QgZmlsZSBtdXN0IGJlIGRlZmluZWQiCiAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKG5ldGxpc3RfdHlwZSkgIm9hIl09PTB9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICBuZXRsaXN0X3R5cGUgPSAkdmFycyhuZXRsaXN0X3R5cGUpXG4iCiAgICAgICAgIGZvcmVhY2ggcmVxdWlyZWQgIm9hX3JlZl9saWIgb2FfZGVzaWduX2xpYiBvYV9kZXNpZ25fY2VsbCBvYV9kZXNpZ25fdmlldyIgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHJlcXVpcmVkKV0gJiYgKCR2YXJzKCRyZXF1aXJlZCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgICAgJHJlcXVpcmVkID0gJHZhcnMoJHJlcXVpcmVkKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSAkcmVxdWlyZWQgbXVzdCBiZSBkZWZpbmVkIHdoZW4gbmV0bGlzdF90eXBlIGlzIG9wZW4gYWNjZXNzIgogICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlICRyZXF1aXJlZCBtdXN0IGJlIGRlZmluZWQgd2hlbiBuZXRsaXN0X3R5cGUgaXMgb3BlbiBhY2Nlc3MiCiAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgZGJzX2Zvcm1hdCA9ICR2YXJzKGRic19mb3JtYXQpXG4iCiAgICAgICAgIGZvcmVhY2ggcmVxdWlyZWQgIm9hX3JlZl9saWIgb2FfZGVzaWduX2xpYiBvYV9hYnN0cmFjdF9uYW1lIG9hX2xheW91dF9uYW1lIiB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmVxdWlyZWQpXSAmJiAoJHZhcnMoJHJlcXVpcmVkKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgICAkcmVxdWlyZWQgPSAkdmFycygkcmVxdWlyZWQpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFZhcmlhYmxlICRyZXF1aXJlZCBtdXN0IGJlIGRlZmluZWQgd2hlbiBkYnNfZm9ybWF0IGlzIG9wZW4gYWNjZXNzIgogICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlICRyZXF1aXJlZCBtdXN0IGJlIGRlZmluZWQgd2hlbiBkYnNfZm9ybWF0IGlzIG9wZW4gYWNjZXNzIgogICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfbHZzKV0gJiYgJHZhcnMoZW5hYmxlX2x2cyl9IHsKICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdIT0wfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogVmFyaWFibGUgZW5hYmxlX2x2cyBpcyBvbmx5IGFsbG93ZWQgd2hlbiBkYnNfZm9ybWF0IGlzIG9wZW4gYWNjZXNzIgogICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJWYXJpYWJsZSBlbmFibGVfbHZzIGlzIG9ubHkgYWxsb3dlZCB3aGVuIGRic19mb3JtYXQgaXMgb3BlbiBhY2Nlc3MiCiAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfbHZzKSBmYWxzZQogICAgICAgICB9CiAgICAgIH0KIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhuZXRsaXN0KV19IHsKIyAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhuZXRsaXN0KSB7CiMgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkZmlsZQojICAgICAgICAgfQojICAgICAgfSBlbHNlIHsKIyAgICAgICAgIGlmIHskdmFycyhuZXRsaXN0X3R5cGUpID09ICJWZXJpbG9nIn0gewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogQSB2ZXJpbG9nIG5ldGxpc3QgZmlsZSBtdXN0IGJlIGRlZmluZWRcbiIKIyAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiQSB2ZXJpbG9nIG5ldGxpc3QgZmlsZSBtdXN0IGJlIGRlZmluZWQiCiMgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiMKIyAgICAgICAgIH0KIyAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfc3BlYyldICYmICgkdmFycyhjdHNfZW5naW5lKSA9PSAiY2NvcHQiKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSBjdHNfc3BlYyBkZWZpbmVkIGFuZCBjdHNfZW5naW5lIGlzIHNldCB0byBjY29wdFxuIgogICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIGN0c19zcGVjIGRlZmluZWQgYW5kIGN0c19lbmdpbmUgaXMgc2V0IHRvIGNjb3B0IgogICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhjdHNfc3BlYykgewogICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkZmlsZQogICAgICAgICB9CiAgICAgIH0KCiMgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewojICAgICAgICAgc2V0IHJlcXVpcmVkX2xpc3QgImZsb3cgcHJvY2VzcyBsaWJyYXJ5X3NldHMgcmNfY29ybmVycyBkZWxheV9jb3JuZXJzIgojICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHJlcXVpcmVkX2xpc3QgImZsb3cgcHJvY2VzcyBsaWJyYXJ5X3NldHMgcmNfY29ybmVycyBkZWxheV9jb3JuZXJzIHNldHVwX2FuYWx5c2lzX3ZpZXdzIFwKICAgICAgICAgICAgICAgICAgICAgICBob2xkX2FuYWx5c2lzX3ZpZXdzIGFjdGl2ZV9zZXR1cF92aWV3cyBhY3RpdmVfaG9sZF92aWV3cyBkZWZhdWx0X3NldHVwX3ZpZXcgZGVmYXVsdF9ob2xkX3ZpZXciCiMgICAgICB9CgogICAgICBmb3JlYWNoIHJlcXVpcmVkICRyZXF1aXJlZF9saXN0IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyZXF1aXJlZCldICYmICgkdmFycygkcmVxdWlyZWQpICE9ICIiKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRyZXF1aXJlZCA9ICR2YXJzKCRyZXF1aXJlZClcbiIKICAgICAgICAgICAgICAgaWYgeyRyZXF1aXJlZCA9PSAiZmxvdyJ9IHsKICAgICAgICAgICAgICAgICAgaWYgeyhbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldIHx8ICgkdmFycyhpbG1fbGlzdCkgIT0gIiIpKSAmJiAoJHZhcnMoZmxvdykgIT0gIm1tbWMiKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBGbG93IHZhcmlhYmxlIHZhcnMoZmxvdykgbXVzdCBiZSBcIm1tbWNcIiB3aGVuIElMTXMgYXJlIGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICIjICBFUlJPUjogRmxvdyB2YXJpYWJsZSB2YXJzKGZsb3cpIG11c3QgYmUgXCJtbW1jXCIgd2hlbiBJTE1zIGFyZSBkZWZpbmVkIgogICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiMgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICBMaWJyYXJ5IFNldHNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGZvcmVhY2ggbGlicmFyeV9zZXQgJHZhcnMobGlicmFyeV9zZXRzKSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJGxpYnJhcnlfc2V0OlxuIgogICAgICAgICAgICBmb3JlYWNoIHJlcXVpcmVkICJ0aW1pbmciIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRsaWJyYXJ5X3NldCwkcmVxdWlyZWQpXSAmJiAoJHZhcnMoJGxpYnJhcnlfc2V0LCRyZXF1aXJlZCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJHJlcXVpcmVkID0gXG4iCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbGliICR2YXJzKCRsaWJyYXJ5X3NldCwkcmVxdWlyZWQpIHsKICAgIyAgICAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICRsaWIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgICAkbGliXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd119IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBWYXJpYWJsZSB2YXJzKCRsaWJyYXJ5X3NldCwkcmVxdWlyZWQpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlZhcmlhYmxlIHZhcnMoJGxpYnJhcnlfc2V0LCRyZXF1aXJlZCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRsaWJyYXJ5X3NldCwkcmVxdWlyZWQpIG5vdCBkZWZpbmVkIG9yIGVtcHR5XG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycygkbGlicmFyeV9zZXQsJHJlcXVpcmVkKSBub3QgZGVmaW5lZCBvciBlbXB0eSIKICAgICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LGFvY3YpXX0gewogICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJGxpYnJhcnlfc2V0LGFvY3YpIHsKICAgICAgICAgICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogQU9DViB0YWJsZSBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiQU9DViB0YWJsZSBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9hb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IEFPQ1YgZW5hYmxlZCwgYnV0IHRhYmxlIG5vdCBwcm92aWRlZCBmb3IgJGxpYnJhcnlfc2V0XG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIkFPQ1YgZW5hYmxlZCwgYnV0IHRhYmxlIG5vdCBwcm92aWRlZCBmb3IgJGxpYnJhcnlfc2V0IgogICAgICAgICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LHNvY3YpXX0gewogICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJGxpYnJhcnlfc2V0LHNvY3YpIHsKICAgICAgICAgICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogU09DViB0YWJsZSBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiU09DViB0YWJsZSBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFNPQ1YgZW5hYmxlZCwgYnV0IHRhYmxlIG5vdCBwcm92aWRlZCBmb3IgJGxpYnJhcnlfc2V0XG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlNPQ1YgZW5hYmxlZCwgYnV0IHRhYmxlIG5vdCBwcm92aWRlZCBmb3IgJGxpYnJhcnlfc2V0IgogICAgICAgICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LHNpKV19IHsKICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKCRsaWJyYXJ5X3NldCxzaSkgewogICAgICAgICAgICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBDREIgZmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIkNEQiBmaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAKICAgICAgICAgfQojICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgTEVGIEZpbGVzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobGVmX2ZpbGVzKV19IHsKICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGxlZl9maWxlcykgewogICAjICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICRmaWxlCiAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRmaWxlXG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMobmV0bGlzdF90eXBlKV0gPT0gInZlcmlsb2ciKSAmJiAoIVtpbmZvIGV4aXN0cyB2YXJzKG9hX3JlZl9saWIpXSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVxdWlyZWQgdmFyaWFibGUgdmFycyhsZWZfZmlsZXMpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycyhsZWZfZmlsZXMpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgSGllcmFyY2hpY2FsIFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBwYXJ0aXRpb25zID0gJHZhcnMocGFydGl0aW9uX2xpc3QpXG4iCiAgICAgICAgIHNldCBjdHNfc3BlYyBbRkY6OmdldF9ieV9zdWZmaXggdmFycyAiLGN0c19zcGVjIl0gCiAgICAgICAgIGlmIHskY3RzX3NwZWMgIT0gIiJ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgQ1RTIFNwZWNzIDogXG4iCiAgICAgICAgICAgIGZvcmVhY2ggcGFydGl0aW9uICRjdHNfc3BlYyB7CiAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soZmlsZXMpICR2YXJzKCRwYXJ0aXRpb24sY3RzX3NwZWMpCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICRwYXJ0aXRpb24gLT4gJHZhcnMoJHBhcnRpdGlvbixjdHNfc3BlYylcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHNldCBsYXRlbmN5X3NkYyBbRkY6OmdldF9ieV9zdWZmaXggdmFycyAiLGxhdGVuY3lfc2RjIl0KICAgICAgICAgaWYgeyRsYXRlbmN5X3NkYyAhPSAiIn0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICBMYXRlbmN5IFNEQ3MgOlxuIgogICAgICAgICAgICBmb3JlYWNoIHBhcnRpdGlvbiAkbGF0ZW5jeV9zZGMgewogICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycygkcGFydGl0aW9uLGxhdGVuY3lfc2RjKQogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggW3NwbGl0ICRwYXJ0aXRpb24gIiwiXV0gPT0gMX0geyAgCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICRwYXJ0aXRpb24gLT4gJHZhcnMoJHBhcnRpdGlvbixsYXRlbmN5X3NkYylcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgIFtsaW5kZXggW3NwbGl0ICRwYXJ0aXRpb24gIiwiXSAwXSAoW2xpbmRleCBbc3BsaXQgJHBhcnRpdGlvbiAiLCJdIDFdKSAtPiAkdmFycygkcGFydGl0aW9uLGxhdGVuY3lfc2RjKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfcGFjKV0gJiYgJHZhcnMoZW5hYmxlX3BhYyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBQQUMgaXMgb2Jzb2xldGUgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBDb25zaWRlciB1c2luZyBTaWduLW9mZiBFQ08uIgogICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJQQUMgaXMgb2Jzb2xldGUgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBDb25zaWRlciB1c2luZyBTaWduLW9mZiBFQ08uIgogICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgc2V0IHBhY19tb2RlIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIscGFjX21vZGUiXQogICAgICAgICBpZiB7JHBhY19tb2RlICE9ICIifSB7CiAgICAgICAgICAgIHNldCBwYWNfbGlzdCBbbGlzdCAicmVhZF9vbmx5IiAiaW50ZXJmYWNlIiAiaWxtIiAiYWxsIl0KICAgICAgICAgICAgZm9yZWFjaCBwYWMgJHBhY19tb2RlIHsKICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICRwYWNfbGlzdCAkdmFycygkcGFjLHBhY19tb2RlKV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogJHBhYyBwYWNfbW9kZSBpbnZhbGlkIHZhbHVlOyBtdXN0IGJlIG9uZSBvZiBcJyRwYWNfbGlzdFwnXG4iCiAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiJHBhYyBwYWNfbW9kZSBpbnZhbGlkIHZhbHVlOyBtdXN0IGJlIG9uZSBvZiBcJyRwYWNfbGlzdFwnIiAKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W0ZGOjppc19scF9mbG93XX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgIExvdyBQb3dlciBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpZWVlMTgwMV9maWxlKV19IHsKICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlVzaW5nIHZhcnMoaWVlZTE4MDFfZmlsZSkgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBsaW1pdGVkIGFjY2VzcyBmZWF0dXJlIDogbXZzU3VwcG9ydElFRUUxODAxIgogICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIH0KICAgICAgICAgc2V0IG51bV9wb3dlcl9pbnRlbnRfZmlsZXMgMAogICAgICAgICBmb3JlYWNoIHYge2NwZl9maWxlIGllZWUxODAxX2ZpbGV9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2KV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkdiA9ICR2YXJzKCR2KVxuIgogICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycygkdikKICAgICAgICAgICAgICAgaW5jciBudW1fcG93ZXJfaW50ZW50X2ZpbGVzCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7JG51bV9wb3dlcl9pbnRlbnRfZmlsZXMgPiAxfSB7CiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAidmFycyhjcGZfZmlsZSkgYW5kIHZhcnMoaWVlZTE4MDFfZmlsZSkgbWF5IG5vdCBib3RoIGJlIHNwZWNpZmllZC4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6ICRlcnJvcnMoJGVycm9yX2NvdW50KVxuIgogICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIH0KCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9kb21haW5zKV0gJiYgKCR2YXJzKHBvd2VyX2RvbWFpbnMpICE9ICIiKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IHBvd2VyX2RvbWFpbnMgPSAgJHZhcnMocG93ZXJfZG9tYWlucylcbiIKICAgICAgICAgICAgZm9yZWFjaCBkb21haW4gJHZhcnMocG93ZXJfZG9tYWlucykgewogICAgICAgICAgICAgICBzZXQgcHJpbnQoJGRvbWFpbikgMQogICAgICAgICAgICAgICBmb3JlYWNoIG9wdGlvbmFsICJmaWxsZXJfY2VsbHMgdGllX2NlbGxzIGVuZGNhcHMgd2VsbHRhcHMiIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkb21haW4sJG9wdGlvbmFsKV0gJiYgKCR2YXJzKCRkb21haW4sJG9wdGlvbmFsKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyRwcmludCgkZG9tYWluKX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRkb21haW46XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBwcmludCgkZG9tYWluKSAwCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgICAkb3B0aW9uYWwgPSAkdmFycygkZG9tYWluLCRvcHRpb25hbClcbiIKICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICBpZiB7JG9wdGlvbmFsID09ICJmaWxsZXJfY2VsbHN9IHsKIyAgICAgICAgICAgICAgICAgICAgIHNldCBwcm9jZXNzIFtyZWdzdWIgIm5tIiAkdmFycyhwcm9jZXNzKSAiIl0KIyAgICAgICAgICAgICAgICAgICAgIGlmIHtbZXhwciAkcHJvY2VzcyA8PSAyOCldICYmIFtpbmZvIGV4aXN0cyB2YXJzKGZpbGxlcl9jZWxscyxtaW5fZ2FwKV19IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IEZvciBwcm9jZXNzIG5vZGUgPCAyOG5tLCB2YXJpYWJsZSB2YXJzKGZpbGxlcl9jZWxscyxtaW5fZ2FwKSBpcyByZXF1aXJlZFxuIgojICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJGb3IgcHJvY2VzcyBub2RlIDwgMjhubSwgdmFyaWFibGUgdmFycyhmaWxsZXJfY2VsbHMsbWluX2dhcCkgaXMgcmVxdWlyZWQiCiMgICAgICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiMgICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMocG93ZXJfZG9tYWlucykgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycyhwb3dlcl9kb21haW5zKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogcG93ZXJfYW5hbHlzaXNfdmlldyA9ICAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KVxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIFdBUk5JTkc6IFJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICBXaWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgc2V0dXAgYW5hbHlzaXMgdmlld1xuIgogICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJSZWNvbW1lbmRlZCB2YXJpYWJsZSB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgIFJDIENvcm5lcnNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIHNldCBjaGVjayhyY19jb3JuZXJzKSBbbGlzdF0KICAgICAgICAgZm9yZWFjaCByY19jb3JuZXIgJHZhcnMocmNfY29ybmVycykgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRyY19jb3JuZXI6XG4iCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSldICYmICgkdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgY2FwX3RhYmxlID0gJHZhcnMoJHJjX2Nvcm5lcixjYXBfdGFibGUpXG4iCiAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2socmNfY29ybmVycykgJHZhcnMoJHJjX2Nvcm5lcixjYXBfdGFibGUpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJHJjX2Nvcm5lcixxeF90ZWNoX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSBvciB2YXJzKCRyY19jb3JuZXIscXhfdGVjaF9maWxlKSBtdXN0IGJlIGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSBvciB2YXJzKCRyY19jb3JuZXIscXhfdGVjaF9maWxlKSBtdXN0IGJlIGRlZmluZWQiCiAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNX0gewogICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBWYXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICAgICAgc2V0IGluZm9zKCRpbmZvX2NvdW50KSAiVmFyaWFibGUgdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICBpbmNyIGluZm9fY291bnQKICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7JHZhcnMoY3RzX2VuZ2luZSkgIT0gImN0cyJ9IHsKIyAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKV0gJiYgKCR2YXJzKCRyY19jb3JuZXIsYXRmX2ZpbGUpICE9ICIiKX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAgYXRmX2ZpbGUgPSAkdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKVxuIgojICAgICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhyY19jb3JuZXJzKSAkdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKQojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKSBub3QgZGVmaW5lZFxuIgojICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmNfY29ybmVyLGF0Zl9maWxlKSBub3QgZGVmaW5lZCIKIyAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHJjX2Nvcm5lcixUKV0gJiYgKCR2YXJzKCRyY19jb3JuZXIsVCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgdGVtcGVyYXR1cmUgPSAkdmFycygkcmNfY29ybmVyLFQpXG4iCiAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soaW50ZWdlcnMpICIkcmNfY29ybmVyLFQiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmNfY29ybmVyLFQpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMoJHJjX2Nvcm5lcixUKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyY19jb3JuZXIscXhfdGVjaF9maWxlKV0gJiYgKCR2YXJzKCRyY19jb3JuZXIscXhfdGVjaF9maWxlKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICBxeF90ZWNoX2ZpbGUgPSAkdmFycygkcmNfY29ybmVyLHF4X3RlY2hfZmlsZSlcbiIKICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhyY19jb3JuZXJzKSAkdmFycygkcmNfY29ybmVyLHF4X3RlY2hfZmlsZSkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCldICYmICgkdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpICE9ICJsb3ciKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBxeF90ZWNoX2ZpbGUgbm90IGRlZmluZWQgZm9yICRyY19jb3JuZXIgYW5kIHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCBpcyBzZXQgdG8gJHZhcnMocG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0KVxuIgogICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgInF4X3RlY2hfZmlsZSBub3QgZGVmaW5lZCBmb3IgJHJjX2Nvcm5lciBhbmQgcG9zdHJvdXRlX2V4dHJhY3Rpb25fZWZmb3J0IGlzIHNldCB0byAkdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpIgogICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQpXSAmJiAoJHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydCkgIT0gImxvdyIpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IHF4X3RlY2hfZmlsZSBub3QgZGVmaW5lZCBmb3IgJHJjX2Nvcm5lciBhbmQgc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydCBpcyBzZXQgdG8gJHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJxeF90ZWNoX2ZpbGUgbm90IGRlZmluZWQgZm9yICRyY19jb3JuZXIgYW5kIHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQgaXMgc2V0IHRvICR2YXJzKHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQpIgogICAjICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG9wY29uZHMpXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgIE9wZXJhdGluZyBDb25kaXRpb25zXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgICBmb3JlYWNoIG9wY29uZCAkdmFycyhvcGNvbmRzKSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJG9wY29uZDpcbiIKICAgICAgICAgICAgICAgZm9yZWFjaCByZXF1aXJlZCAibGlicmFyeV9maWxlIFAgViBUIiB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkb3Bjb25kLCRyZXF1aXJlZCldICYmICgkdmFycygkb3Bjb25kLCRyZXF1aXJlZCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJHJlcXVpcmVkID0gJHZhcnMoJG9wY29uZCwkcmVxdWlyZWQpXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFJlcXVpcmVkIHZhcmlhYmxlIHZhcnMoJG9wY29uZCwkcmVxdWlyZWQpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycygkb3Bjb25kLCRyZXF1aXJlZCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgIERlbGF5IENvcm5lcnNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIHNldCBnb29kX2Nvcm5lcnMgW2xpc3RdCiAgICAgICAgIGZvcmVhY2ggZGVsYXlfY29ybmVyICR2YXJzKGRlbGF5X2Nvcm5lcnMpIHsKICAgICAgICAgICAgc2V0IGFyZ3MgMAogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRkZWxheV9jb3JuZXI6XG4iCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZGVsYXlfY29ybmVyLHJjX2Nvcm5lcildICYmICgkdmFycygkZGVsYXlfY29ybmVyLHJjX2Nvcm5lcikgIT0gIiIpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgcmNfY29ybmVyID0gJHZhcnMoJGRlbGF5X2Nvcm5lcixyY19jb3JuZXIpXG4iCiAgICAgICAgICAgICAgIGluY3IgYXJncwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRkZWxheV9jb3JuZXIscmNfY29ybmVyKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlJlcXVpcmVkIHZhcmlhYmxlIHZhcnMoJGRlbGF5X2Nvcm5lcixyY19jb3JuZXIpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgIGlmIHsoIVtGRjo6aXNfbHBfZmxvd10pIHx8IChbRkY6OmlzX2xwX2Zsb3ddICYmICEkdmFycyhjcGZfdGltaW5nKSl9IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkZWxheV9jb3JuZXIsbGlicmFyeV9zZXQpXSAmJiAoJHZhcnMoJGRlbGF5X2Nvcm5lcixsaWJyYXJ5X3NldCkgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgbGlicmFyeV9zZXQgPSAkdmFycygkZGVsYXlfY29ybmVyLGxpYnJhcnlfc2V0KVxuIgogICAgICAgICAgICAgICAgICBpbmNyIGFyZ3MKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBhZGRpdGlvbmFsICJlYXJseV9saWJyYXJ5X3NldCBsYXRlX2xpYnJhcnlfc2V0IiB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZGVsYXlfY29ybmVyLCRhZGRpdGlvbmFsKV0gJiYgKCR2YXJzKCRkZWxheV9jb3JuZXIsJGFkZGl0aW9uYWwpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRhZGRpdGlvbmFsID0gJHZhcnMoJGRlbGF5X2Nvcm5lciwkYWRkaXRpb25hbClcbiIKICAgICAgICAgICAgICAgICAgICAgICAgaW5jciBhcmdzCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFJlcXVpcmVkIHZhcmlhYmxlIHZhcnMoJGRlbGF5X2Nvcm5lcixsaWJyYXJ5X3NldCkgYW5kIHZhcnMoJGRlbGF5X2Nvcm5lciwkYWRkaXRpb25hbCkgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRkZWxheV9jb3JuZXIsbGlicmFyeV9zZXQpIGFuZCB2YXJzKCRkZWxheV9jb3JuZXIsJGFkZGl0aW9uYWwpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoIG9wdGlvbmFsICJvcGNvbmQgb3Bjb25kX2xpYnJhcnkgZWFybHlfb3Bjb25kX2xpYnJhcnkgbGF0ZV9vcGNvbmRfbGlicmFyeSIgewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRlbGF5X2Nvcm5lciwkb3B0aW9uYWwpXSAmJiAoJHZhcnMoJGRlbGF5X2Nvcm5lciwkb3B0aW9uYWwpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICBpbmNyIGFyZ3MKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkb3B0aW9uYWwgPSAkdmFycygkZGVsYXlfY29ybmVyLCRvcHRpb25hbClcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uYWwgInBvd2VyX2RvbWFpbnMiIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkZWxheV9jb3JuZXIsJG9wdGlvbmFsKV0gJiYgKCR2YXJzKCRkZWxheV9jb3JuZXIsJG9wdGlvbmFsKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkb3B0aW9uYWwgPSAkdmFycygkZGVsYXlfY29ybmVyLCRvcHRpb25hbClcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshJHZhcnMoY3BmX3RpbWluZykgJiYgKCRhcmdzID4gMSl9IHsKICAgICAgICAgICAgICAgbGFwcGVuZCBnb29kX2Nvcm5lcnMgJGRlbGF5X2Nvcm5lcgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JGFyZ3MgPiAwfSB7CiAgICAgICAgICAgICAgICAgIGxhcHBlbmQgZ29vZF9jb3JuZXJzICRkZWxheV9jb3JuZXIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIHNldCB2YXJzKGdvb2RfY29ybmVycykgJGdvb2RfY29ybmVycwogICAKICAgICAgICAgc2V0IGNoZWNrKGNvbnN0cmFpbnRfbW9kZXMpIFtsaXN0XQogICAgICAgICBpZiB7W0ZGOjppc19scF9mbG93XX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgIENvbnN0cmFpbnQgTW9kZXNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjb25zdHJhaW50X21vZGVzKV19IHsKICAgICAgICAgICAgICAgZm9yZWFjaCBtb2RlICR2YXJzKGNvbnN0cmFpbnRfbW9kZXMpIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkbW9kZTpcbiIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBvdGhlciAicHJlX2N0c19zZGMgaW5jcl9jdHNfc2RjIHBvc3RfY3RzX3NkYyIgewogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG1vZGUsJG90aGVyKV0gJiYgKCR2YXJzKCRtb2RlLCRvdGhlcikgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJG90aGVyID0gJHZhcnMoJG1vZGUsJG90aGVyKVxuIgogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGNvbnN0cmFpbnRfbW9kZXMpICR2YXJzKCRtb2RlLCRvdGhlcikKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyEkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7KCRvdGhlciA9PSAicHJlX2N0c19zZGMiKSAmJiAkdmFycyhyYyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJG1vZGUsJG90aGVyKSAkdmFycyhkYnNfZGlyKS8kdmFycyhkZXNpZ24pLnN5bl9wbGFjZWQuJG1vZGUuc2RjCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIHsoJG90aGVyID09ICJwcmVfY3RzX3NkYyIpICYmICEkdmFycyhyYyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIEVSUk9SOiAgICBWYXJpYWJsZSB2YXJzKCRtb2RlLCRvdGhlcikgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKCRtb2RlLCRvdGhlcikgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeygkb3RoZXIgPT0gInByZV9jdHNfc2RjIikgfHwgKCgkb3RoZXIgPT0gInBvc3RfY3RzX3NkYyIpICYmICFbaW5mbyBleGlzdHMgdmFycygkbW9kZSxpbmNyX2N0c19zZGMpXSl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICBWYXJpYWJsZSB2YXJzKCRtb2RlLCRvdGhlcikgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIFZhcmlhYmxlIHZhcnMoJG1vZGUsJG90aGVyKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogTm8gY29uc3RyYWludCBtb2RlIGluZm9ybWF0aW9uIGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICBQb3N0IENUUyBsYXRlbmN5IGFkanVzdG1lbnQgbXVzdCBiZVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgIG1hbmFnZWQgYnkgdGhlIHVzZXIgdmlhIHBsdWctaW5zXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICBDb25zdHJhaW50IE1vZGVzXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgICBpZiB7JHZhcnMocmMpfSB7CiAgICAgICAgICAgICAgIHNldCByZXF1aXJlZF9saXN0ICJzeW50aF9zZGMgcHJlX2N0c19zZGMiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCByZXF1aXJlZF9saXN0ICJwcmVfY3RzX3NkYyIKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZm9yZWFjaCBtb2RlICR2YXJzKGNvbnN0cmFpbnRfbW9kZXMpIHsKICAgICAgICAgICAgICAgc2V0IGZvdW5kIDAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkbW9kZTpcbiIKICAgICAgICAgICAgICAgZm9yZWFjaCByZXF1aXJlZCAkcmVxdWlyZWRfbGlzdCB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkbW9kZSwkcmVxdWlyZWQpXSAmJiAoJHZhcnMoJG1vZGUsJHJlcXVpcmVkKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkcmVxdWlyZWQgPSAkdmFycygkbW9kZSwkcmVxdWlyZWQpXG4iCiAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soY29uc3RyYWludF9tb2RlcykgJHZhcnMoJG1vZGUsJHJlcXVpcmVkKQogICAgICAgICAgICAgICAgICAgICBpbmNyIGZvdW5kCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkcmVxdWlyZWRfbGlzdF0gPT0gMX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRtb2RlLCRyZXF1aXJlZCkgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRtb2RlLCRyZXF1aXJlZCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyhbbGxlbmd0aCAkcmVxdWlyZWRfbGlzdF0gPiAxKSAmJiAoJGZvdW5kID09IDApfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IE9uZSBvZiB0aGUgcmVxdWlyZWQgdmFyaWFibGVzICgkcmVxdWlyZWRfbGlzdCkgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJPbmUgb2YgdGhlIHJlcXVpcmVkIHZhcmlhYmxlcyAoJHJlcXVpcmVkX2xpc3QpIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZm9yZWFjaCBvdGhlciAicG9zdF9jdHNfc2RjIGluY3JfY3RzX3NkYyIgewogICAgICAgICAgICAgICAgICBpZiB7JG90aGVyID09ICJwb3N0X2N0c19zZGMiICYmICFbaW5mbyBleGlzdHMgdmFycygkb3RoZXIpXX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLCRvdGhlcildfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgVmFyaWFibGUgdmFycygkbW9kZSwkb3RoZXIpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJG90aGVyID0gJHZhcnMoJG1vZGUsJG90aGVyKVxuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkbW9kZSwkb3RoZXIpXSAmJiAoJHZhcnMoJG1vZGUsJG90aGVyKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkb3RoZXIgPSAkdmFycygkbW9kZSwkb3RoZXIpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soY29uc3RyYWludF9tb2RlcykgJHZhcnMoJG1vZGUsJG90aGVyKQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIFZhcmlhYmxlIHZhcnMoJG1vZGUsJG90aGVyKSBub3QgZGVmaW5lZFxuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoaG9sZF9hbmFseXNpc192aWV3cyldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpICIiCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV19IHsKICAgICAgICAgICAgc2V0IHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIiIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgIEFuYWx5c2lzIFZpZXdzXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICBpZiB7W0ZGOjppc19scF9mbG93XX0gewogICAgICAgICAgICBmb3JlYWNoIGFuYWx5c2lzX3ZpZXcgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cykgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldyldIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAkYW5hbHlzaXNfdmlldzpcbiIKICAgICAgICAgICAgICAgZm9yZWFjaCBvdGhlciAiZGVsYXlfY29ybmVyIGNvbnN0cmFpbnRfbW9kZSIgewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGFuYWx5c2lzX3ZpZXcsJG90aGVyKV0gJiYgKCR2YXJzKCRhbmFseXNpc192aWV3LCRvdGhlcikgIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJG90aGVyID0gJHZhcnMoJGFuYWx5c2lzX3ZpZXcsJG90aGVyKVxuIgogICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGFuYWx5c2lzX3ZpZXcpICR2YXJzKCRhbmFseXNpc192aWV3LCRvdGhlcikKICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjaGVjayhhbmFseXNpc192aWV3cykgW2xpc3RdCiAgICAgICAgICAgIGZvcmVhY2ggYW5hbHlzaXNfdmlldyBbY29uY2F0ICR2YXJzKHNldHVwX2FuYWx5c2lzX3ZpZXdzKSAkdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKSAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRhbmFseXNpc192aWV3OlxuIgogICAgICAgICAgICAgICBmb3JlYWNoIHJlcXVpcmVkICJkZWxheV9jb3JuZXIgY29uc3RyYWludF9tb2RlIiB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkYW5hbHlzaXNfdmlldywkcmVxdWlyZWQpXSAmJiAoJHZhcnMoJGFuYWx5c2lzX3ZpZXcsJHJlcXVpcmVkKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkcmVxdWlyZWQgPSAkdmFycygkYW5hbHlzaXNfdmlldywkcmVxdWlyZWQpXG4iCiAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgY2hlY2soYW5hbHlzaXNfdmlldykgJHZhcnMoJGFuYWx5c2lzX3ZpZXcsJHJlcXVpcmVkKQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRhbmFseXNpc192aWV3LCRyZXF1aXJlZCkgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCRhbmFseXNpc192aWV3LCRyZXF1aXJlZCkgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQojICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICBSZWNvbW1lbmRlZCBWYXJpYWJsZXNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGZvcmVhY2ggcmVjb21tZW5kZWQgInNjYW5fZGVmIGdkc19sYXllcl9tYXAiIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyZWNvbW1lbmRlZCldICYmICgkdmFycygkcmVjb21tZW5kZWQpICE9ICIiKX0gewogICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycygkcmVjb21tZW5kZWQpCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJHJlY29tbWVuZGVkID0gJHZhcnMoJHJlY29tbWVuZGVkKVxuIgogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGdkc19maWxlcyldICYmICgkdmFycyhnZHNfZmlsZXMpICE9ICIiKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IGdkc19maWxlcyA9ICR2YXJzKGdkc19maWxlcylcbiIKICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGdkc19maWxlcykgewogICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkZmlsZQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcmVhY2ggcmVjb21tZW5kZWQgIm1heF9yb3V0ZV9sYXllciBmaWxsZXJfY2VsbHMgdGllX2NlbGxzIGRvbnRfdXNlX2xpc3QgYW50ZW5uYV9kaW9kZSIgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHJlY29tbWVuZGVkKV0gJiYgKCR2YXJzKCRyZWNvbW1lbmRlZCkgIT0gIiIpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJHJlY29tbWVuZGVkID0gJHZhcnMoJHJlY29tbWVuZGVkKVxuIgogICAgICAgICAgICBpZiB7JHJlY29tbWVuZGVkID09ICJ0aWVfY2VsbHMifSB7CiAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkdmFycyh0aWVfY2VsbHMpXSA+IDJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmVjb21tZW5kZWQpIGhhcyBtb3JlIHRoYW4gdHdvIGNlbGxzXG4iCiAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmVjb21tZW5kZWQpIGhhcyBtb3JlIHRoYW4gdHdvIGNlbGxzIgogICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHJlY29tbWVuZGVkID09ICJhbnRlbm5hX2Rpb2RlIn0gewogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJHZhcnMoYW50ZW5uYV9kaW9kZSldID4gMX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZWNvbW1lbmRlZCB2YXJpYWJsZSB2YXJzKCRyZWNvbW1lbmRlZCkgaGFzIG1vcmUgdGhhbiBvbmUgY2VsbHNcbiIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJSZWNvbW1lbmRlZCB2YXJpYWJsZSB2YXJzKCRyZWNvbW1lbmRlZCkgaGFzIG1vcmUgdGhhbiBvbmUgY2VsbHMiCiAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskcmVjb21tZW5kZWQgPT0gIm1heF9yb3V0ZV9sYXllciJ9IHsKICAgICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhpbnRlZ2VycykgIiRyZWNvbW1lbmRlZCIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7KCRyZWNvbW1lbmRlZCA9PSAiZG9udF91c2VfbGlzdCIpfSB7CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZG9udF91c2VfZmlsZSldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogUmVjb21tZW5kZWQgdmFyaWFibGVzIGRvbnRfdXNlX2xpc3QgYW5kIGRvbnRfdXNlX2ZpbGUgbm90IGRlZmluZWRcbiIKICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiUmVjb21tZW5kZWQgdmFyaWFibGVzIGRvbnRfdXNlX2xpc3QgYW5kIGRvbnRfdXNlX2ZpbGUgbm90IGRlZmluZWQiCiAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogUmVjb21tZW5kZWQgdmFyaWFibGUgdmFycygkcmVjb21tZW5kZWQpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlJlY29tbWVuZGVkIHZhcmlhYmxlIHZhcnMoJHJlY29tbWVuZGVkKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgICAgIH0gIAogICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yZWFjaCBvcHRpb25hbCAic2l6ZV9vbmx5X2ZpbGUgZG9udF91c2VfZmlsZSIgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG9wdGlvbmFsKV19IHsKICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhmaWxlcykgJHZhcnMoJG9wdGlvbmFsKQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgIE90aGVyIFZhcmlhYmxlc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgZm9yZWFjaCBvdGhlciAianRhZ19jZWxscyBqdGFnX3Jvd3Mgc3BhcmVfY2VsbHMiIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRvdGhlcildICYmICgkdmFycygkb3RoZXIpICE9ICIiKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRvdGhlciA9ICR2YXJzKCRvdGhlcilcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiBWYXJpYWJsZSB2YXJzKCRvdGhlcikgbm90IGRlZmluZWRcbiIKICAgICAgICAgfQogICAgICB9CgojICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgU2NhbGUgRmFjdG9yc1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgZm9yZWFjaCByY19jb3JuZXIgJHZhcnMocmNfY29ybmVycykgewogICAgICAgICAgICBzZXQgaSAwCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogJHJjX2Nvcm5lcjpcbiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyY19jb3JuZXIsc2NhbGVfdGNsKV19IHsKICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycygkcmNfY29ybmVyLHNjYWxlX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgIGluY3IgaQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgc2NhbGluZyBmaWxlID0gJHZhcnMoJHJjX2Nvcm5lcixzY2FsZV90Y2wpXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IFNjYWxpbmcgZmlsZSAkdmFycygkcmNfY29ybmVyLHNjYWxlX3RjbCkgZm9yIHJjIGNvcm5lciAkcmNfY29ybmVyIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlNjYWxpbmcgZmlsZSAkdmFycygkcmNfY29ybmVyLHNjYWxlX3RjbCkgZm9yIHJjIGNvcm5lciAkcmNfY29ybmVyIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgZm9yZWFjaCBvdGhlciAicHJlX3JvdXRlX3Jlc19mYWN0b3IgcG9zdF9yb3V0ZV9yZXNfZmFjdG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3JvdXRlX2NhcF9mYWN0b3IgcG9zdF9yb3V0ZV9jYXBfZmFjdG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yIHBvc3Rfcm91dGVfY2xrX3Jlc19mYWN0b3IgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcm91dGVfY2xrX2NhcF9mYWN0b3IgcG9zdF9yb3V0ZV9jbGtfY2FwX2ZhY3RvciBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfcm91dGVfeGNhcF9mYWN0b3IiIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyY19jb3JuZXIsJG90aGVyKV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkb3RoZXIgPSAkdmFycygkcmNfY29ybmVyLCRvdGhlcilcbiIKICAgICAgICAgICAgICAgICAgICAgaW5jciBpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskaSA9PSAwfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogTm8gc2NhbGUgZmFjdG9ycyBzZXQgZm9yIHJjIGNvcm5lciAoJHJjX2Nvcm5lcilcbiIKICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiTm8gc2NhbGUgZmFjdG9ycyBzZXQgZm9yIHJjIGNvcm5lciAoJHJjX2Nvcm5lcikiCiAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgRGVyYXRpbmcgRmFjdG9yc1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgc2V0IGkgMAogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVyYXRlX3RjbCldfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgZGVyYXRlIGZpbGUgPSAkdmFycyhkZXJhdGVfdGNsKVxuIgogICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycyhkZXJhdGVfdGNsKQogICAgICAgICAgICBpbmNyIGkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yZWFjaCBkZWxheV9jb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICRkZWxheV9jb3JuZXI6XG4iCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZGVsYXlfY29ybmVyLGRlcmF0ZV90Y2wpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIGRlcmF0ZSBmaWxlID0gJHZhcnMoJGRlbGF5X2Nvcm5lcixkZXJhdGVfdGNsKVxuIgogICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycygkZGVsYXlfY29ybmVyLGRlcmF0ZV90Y2wpCiAgICAgICAgICAgICAgICAgIGluY3IgaQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVyYXRlX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgZGVyYXRlIGZpbGUgPSAkdmFycyhkZXJhdGVfdGNsKVxuIgogICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGNoZWNrKGZpbGVzKSAkdmFycyhkZXJhdGVfdGNsKQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG90aGVyICJlYXJseV9kYXRhX2NlbGwgZWFybHlfY2xvY2tfY2VsbCBlYXJseV9jZWxsX2NoZWNrIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZV9kYXRhX2NlbGwgbGF0ZV9jbG9ja19jZWxsIGxhdGVfY2VsbF9jaGVjayBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY2VsbF9lYXJseSBjbG9ja19jZWxsX2Vhcmx5IGNlbGxfY2hlY2tfZWFybHkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2NlbGxfbGF0ZSBjbG9ja19jZWxsX2xhdGUgY2VsbF9jaGVja19sYXRlIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZGVsYXlfY29ybmVyLCRvdGhlcildfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgJG90aGVyID0gJHZhcnMoJGRlbGF5X2Nvcm5lciwkb3RoZXIpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgaQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskaSA9PSAwfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogTm8gZGVyYXRpbmcgZmFjdG9ycyBzZXQgZm9yIGRlbGF5IGNvcm5lciAoJGRlbGF5X2Nvcm5lcilcbiIKICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiTm8gZGVyYXRpbmcgZmFjdG9ycyBzZXQgZm9yIGRlbGF5IGNvcm5lciAoJGRlbGF5X2Nvcm5lcikiCiAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQojICAgICAgfQogICAgICBpZiB7IVtyZWdleHAgIjkuMSIgJHZhcnModmVyc2lvbildfSB7CgogICAgICAgICBzZXQgdmFsaWQgIlRSVUUgRkFMU0UgdHJ1ZSBmYWxzZSBhdXRvIgoKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9zaV9hd2FyZSldfSB7CiAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFsaWQgJHZhcnMoZW5hYmxlX3NpX2F3YXJlKV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycyhlbmFibGVfc2lfYXdhcmUpIGhhcyBpbGxlZ2FsIHZhbHVlXG4iCiAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVmFyaWFibGUgdmFycyhlbmFibGVfc2lfYXdhcmUpIGhhcyBpbGxlZ2FsIHZhbHVlIgogICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgIE11c3QgYmUgb25lIG9mICckdmFsaWQnXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgojICAgICAgc2V0IHZhbGlkICJwb3N0Y3RzIHBvc3Ryb3V0ZSBwb3N0cm91dGVfc2kgdHJ1ZSBmYWxzZSIKIyAgICAgIGZvcmVhY2ggdmFyICJmaXhfaG9sZCIgewojICAgICAgICAgaWYge1tsc2VhcmNoICR2YWxpZCBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoJHZhcildXSA9PSAtMX0gewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycygkdmFyKSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycygkdmFyKVxuIgojICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKCR2YXIpIGhhcyBpbGxlZ2FsIHZhbHVlICR2YXJzKCR2YXIpIgojICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKIyAgICAgICAgIH0KIyAgICAgIH0KICAgICAgCgogICAgICBzZXQgdmFsaWQgW2xpc3QgdHJ1ZSBmYWxzZV0KICAgICAgZm9yZWFjaCB2YXIgImZpeF9ob2xkX2lnbm9yZV9pb3MgZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uIiB7CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoJHZhcildfSB7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIH0KICAgICAgICAgaWYge1tsc2VhcmNoICR2YWxpZCBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoJHZhcildXSA9PSAtMX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKCR2YXIpIGhhcyBpbGxlZ2FsIHZhbHVlICR2YXJzKCR2YXIpXG4iCiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVmFyaWFibGUgdmFycygkdmFyKSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycygkdmFyKSIKICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBNdXN0IGJlIG9uZSBvZiAnJHZhbGlkJ1xuIgogICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIHNldCB2YWxpZCAicHJlX3BsYWNlIHByZV9wcmVjdHMgcHJlX2N0cyBwcmVfcG9zdGN0cyBwcmVfcG9zdHJvdXRlIHByZV9wb3N0cm91dGVfc2kgcHJlX3NpZ25vZmYgdHJ1ZSBmYWxzZSIKICAgICAgZm9yZWFjaCBvcHRpb24gIm1ldGFsZmlsbCBlbmFibGVfb2N2IGVuYWJsZV9zcyIgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG9wdGlvbildfSB7CiAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFsaWQgJHZhcnMoJG9wdGlvbildID09IC0xfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFZhcmlhYmxlIHZhcnMoJG9wdGlvbikgaGFzIGlsbGVnYWwgdmFsdWUgKCR2YXJzKCRvcHRpb24pKVxuIgogICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMoJG9wdGlvbikgaGFzIGlsbGVnYWwgdmFsdWUgKCR2YXJzKCRvcHRpb24pKSIKICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBNdXN0IGJlIG9uZSBvZiAnJHZhbGlkJ1xuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0IHBhY3MgW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgIixwYWNfbW9kZSJdIAogICAgICBzZXQgdmFsaWQgInJlYWRfb25seSBpbnRlcmZhY2UgYWxsIgoKICAgICAgZm9yZWFjaCBwYWMgJHBhY3MgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFjX21vZGUpXX0gewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhbGlkICR2YXJzKHBhY19tb2RlKV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogVmFyaWFibGUgdmFycyhwYWNfbW9kZSkgaGFzIGlsbGVnYWwgdmFsdWVcbiIKICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKHBhY19tb2RlKSBoYXMgaWxsZWdhbCB2YWx1ZSIKICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBNdXN0IGJlIG9uZSBvZiAnJHZhbGlkJ1xuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0IHZhbGlkICJkZWZhdWx0IHBlc3NpbWlzdGljIgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXX0gewogICAgICAgICBpZiB7W2xzZWFyY2ggJHZhbGlkICR2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXSA9PSAtMX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKHNpX2FuYWx5c2lzX3R5cGUpIGhhcyBpbGxlZ2FsIHZhbHVlXG4iCiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVmFyaWFibGUgdmFycyhzaV9hbmFseXNpc190eXBlKSBoYXMgaWxsZWdhbCB2YWx1ZSIKICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBNdXN0IGJlIG9uZSBvZiAnJHZhbGlkJ1xuIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNldCB2YWxpZCAicG9zdF9jdHMgcG9zdF9yb3V0ZSBib3RoIG5vbmUiCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xvY2tfZWNvKV19IHsKICAgICAgICAgaWYge1tsc2VhcmNoICR2YWxpZCAkdmFycyhjbG9ja19lY28pXSA9PSAtMX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKGNsb2NrX2VjbykgaGFzIGlsbGVnYWwgdmFsdWVcbiIKICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKGNsb2NrX2VjbykgaGFzIGlsbGVnYWwgdmFsdWUiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgICAgfQogICAgICB9CiMgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiMgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJVc2luZyB2YXJzKGVuYWJsZV9mbGV4aWxtKSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGxpbWl0ZWQgYWNjZXNzIGZlYXR1cmUgOiBlbmNGbGV4SUxNIgojICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiMgICAgICAgICBpZiB7JHZhcnMocGxhY2Vfb3B0X2Rlc2lnbil9IHsKIyAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlZhcmlhYmxlIHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikgbm90IHN1cHBvcnRlZCB3aGVuIHZhcnMoZW5hYmxlX2ZsZXhpbG0pIGlzIHRydWUiCiMgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKIyAgICAgICAgIH0KIyAgICAgIH0KICAgICAgaWYgeyR2YXJzKHVzZV9mbGV4bW9kZWxzKSAmJiAkdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKX0gewogICAgICAgICBzZXQgdmFsaWQgW2xpc3QgZmxhdCBtdWx0aV9sZXZlbCB0b3BfdG9fYm90dG9tXQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZV9mbG93X3N0eWxlKV19IHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YWxpZCAkdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlX2Zsb3dfc3R5bGUpXSA9PSAtMX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGVfZmxvd19zdHlsZSkgaGFzIGlsbGVnYWwgdmFsdWUgKCR2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGVfZmxvd19zdHlsZSkpXG4iCiAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiVmFyaWFibGUgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlX2Zsb3dfc3R5bGUpIGhhcyBpbGxlZ2FsIHZhbHVlICgkdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlX2Zsb3dfc3R5bGUpKSIKICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBNdXN0IGJlIG9uZSBvZiAnJHZhbGlkJ1xuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0IGNoZWNrKHBsdWdpbnMpIFtsaXN0XQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobWV0YWxmaWxsKV0gJiYgKCR2YXJzKG1ldGFsZmlsbCkgIT0gZmFsc2UpfSB7CiAgICAgICAgIHNldCBjaGVjayhwbHVnaW5zKSBtZXRhbGZpbGxfdGNsCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICBQbHVnLWluc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgc2V0IHJjX3BsdWdpbnMgInN5bl9pbml0X3RjbCBzeW5fbG9hZF9ydGxfdGNsIHByZV9zeW5fbG9hZF9saWJfdGNsIHBvc3Rfc3luX2xvYWRfbGliX3RjbCBcCiAgICAgICAgICAgICAgICAgICAgICBwcmVfc3luX2VsYWJfdGNsIHBvc3Rfc3luX2VsYWJfdGNsIHN5bl9kZnRfc2V0dXBfdGNsIHByZV9zeW5fZ2VuX3RjbCBcCiAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N5bl9nZW5fdGNsIHByZV9zeW5fbWFwX3RjbCBwb3N0X3N5bl9tYXBfdGNsIHBvc3Rfc3luX2RmdF90Y2wgXAogICAgICAgICAgICAgICAgICAgICAgcHJlX3N5bl9pbmNyX3RjbCBwb3N0X3N5bl9pbmNyX3RjbCBwcmVfc3luX3BsYWNlX3RjbCBwb3N0bG9hZF9zeW5fcGxhY2VfdGNsIFwKICAgICAgICAgICAgICAgICAgICAgIHByZWV4cG9ydF9zeW5fcGxhY2VfdGNsIHByZWFubm90YXRpb25fc3luX3BsYWNlX3RjbCBwb3N0X3N5bl9wbGFjZV90Y2wgcHJlX3N5bl9leGl0X3RjbCIKICAgICAgc2V0IGVkaV9wbHVnaW5zICJhbHdheXNfc291cmNlX3RjbCBwcmVfaW5pdF90Y2wgcG9zdF9pbml0X3RjbCBcCiAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BsYWNlX3RjbCBwbGFjZV90Y2wgcG9zdF9wbGFjZV90Y2wgcHJlX2N0c190Y2wgY3RzX3RjbCBwb3N0X2N0c190Y2wgXAogICAgICAgICAgICAgICAgICAgICAgIHByZV9wcmVjdHNfdGNsIHBvc3RfcHJlY3RzX3RjbCBwcmVfcG9zdGN0c190Y2wgcG9zdF9wb3N0Y3RzX3RjbCBcCiAgICAgICAgICAgICAgICAgICAgICAgcHJlX3Bvc3RjdHNfaG9sZF90Y2wgcG9zdF9wb3N0Y3RzX2hvbGRfdGNsIHByZV9yb3V0ZV90Y2wgcG9zdF9yb3V0ZV90Y2wgXAogICAgICAgICAgICAgICAgICAgICAgIHByZV9wb3N0cm91dGVfdGNsIHBvc3RfcG9zdHJvdXRlX3RjbCBwcmVfcG9zdHJvdXRlX2hvbGRfdGNsIHBvc3RfcG9zdHJvdXRlX2hvbGRfdGNsIFwKICAgICAgICAgICAgICAgICAgICAgICBwcmVfcG9zdHJvdXRlX3NpX3RjbCBwb3N0X3Bvc3Ryb3V0ZV9zaV90Y2wgcHJlX3Bvc3Ryb3V0ZV9zaV9ob2xkX3RjbCAKICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3Bvc3Ryb3V0ZV9zaV9ob2xkX3RjbCBwcmVfc2lnbm9mZl90Y2wgcG9zdF9zaWdub2ZmX3RjbCBcCiAgICAgICAgICAgICAgICAgICAgICAgcHJlX3JlYnVkZ2V0X3RjbCBwb3N0X3JlYnVkZ2V0X3RjbCBwcmVfZmxleGlsbV90Y2wgcG9zdF9mbGV4aWxtX3RjbCBcCiAgICAgICAgICAgICAgICAgICAgICAgcHJlX2Fzc2VtYmxlX3RjbCBwb3N0X2Fzc2VtYmxlX3RjbCBwcmVfcHJvdG90eXBlX3RjbCBwb3N0X3Byb3RvdHlwZV90Y2wgcHJlX21vZGVsX2dlbl90Y2wgcG9zdF9tb2RlbF9nZW5fdGNsIFwKICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFydGl0aW9uX3BsYWNlX3RjbCBwb3N0X3BhcnRpdGlvbl9wbGFjZV90Y2wgcHJlX2Fzc2VtYmxlX2ZsZXhfaWxtX3RjbCBwb3N0X2Fzc2VtYmxlX2ZsZXhpbG1fdGNsIgoKICAgICAgaWYgeyR2YXJzKHJjKX0gewogICAgICAgICBzZXQgcGx1Z2luX2xpc3QgW2pvaW4gW2NvbmNhdCAkcmNfcGx1Z2lucyAkZWRpX3BsdWdpbnNdXQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgcGx1Z2luX2xpc3QgJGVkaV9wbHVnaW5zCiAgICAgIH0KICAgICAgZm9yZWFjaCBwbHVnaW4gJHBsdWdpbl9saXN0IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwbHVnaW4pXSAmJiAoJHZhcnMoJHBsdWdpbikgIT0gIiIpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogUGx1Zy1pbiAkcGx1Z2luID0gJHZhcnMoJHBsdWdpbilcbiIKICAgICAgICAgICAgbGFwcGVuZCBjaGVjayhwbHVnaW5zKSAkcGx1Z2luCiAgICAgICAgICAgIGxhcHBlbmQgdmFycyhwbHVnaW5zX2RlZmluZWQpICRwbHVnaW4gCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0IGRpc3QobHNmKSAicXVldWUgcmVzb3VyY2UgYXJncyIKICAgICAgc2V0IGRpc3QoY3VzdG9tKSAic2NyaXB0IgogICAgICBzZXQgZGlzdChyc2gpICJob3N0X2xpc3QiCiAgICAgIHNldCBkaXN0KGxvY2FsKSAiIgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRpc3RyaWJ1dGUpXX0gewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIGRpc3QoJHZhcnMoZGlzdHJpYnV0ZSkpXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uIFNldHVwXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IE1vZGUgPSAkdmFycyhkaXN0cmlidXRlKVxuIgogICAgICAgICAgICBmb3JlYWNoIG9wdGlvbiAkZGlzdCgkdmFycyhkaXN0cmlidXRlKSkgewogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRpc3RyaWJ1dGUpLCRvcHRpb24pXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBSZXF1aXJlZCB2YXJpYWJsZSB2YXJzKCR2YXJzKGRpc3RyaWJ1dGUpLCRvcHRpb24pIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiUmVxdWlyZWQgdmFyaWFibGUgdmFycygkdmFycyhkaXN0cmlidXRlKSwkb3B0aW9uKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgICRvcHRpb24gPSAkdmFycygkdmFycyhkaXN0cmlidXRlKSwkb3B0aW9uKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogRGlzdHJpYnV0aW9uIG1vZGUgJHZhcnMoZGlzdHJpYnV0ZSkgbm90IHN1cHBvcnRlZFxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIkRpc3RyaWJ1dGlvbiBtb2RlICR2YXJzKGRpc3RyaWJ1dGUpIG5vdCBzdXBwb3J0ZWQiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaG9zdHMpXSAmJiAoJHZhcnMoaG9zdHMpID4gMSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjV0FSTklORzogVmFyaWFibGUgdmFycyhob3N0cykgPiAxIGJ1dCB2YXJzKGRpc3RyaWJ1dGUpIG5vdCBkZWZpbmVkXG4iCiAgICAgICAgICAgIHNldCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIlZhcmlhYmxlIHZhcnMoaG9zdHMpID4gMSBidXQgdmFycyhkaXN0cmlidXRlKSBub3QgZGVmaW5lZCIKICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgIFR5cGUgQ2hlY2tcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgIGZvcmVhY2ggaW50ZWdlciAkY2hlY2soaW50ZWdlcnMpIHsKICAgICAgICAgaWYgeyFbc3RyaW5nIGlzIGludGVnZXIgLXN0cmljdCAkdmFycygkaW50ZWdlcildfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IFZhcmlhYmxlcyBpcyBub3QgYW4gaW50ZWdlciAoJGludGVnZXIpIC4uLlxuIgogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlcyBpcyBub3QgYW4gaW50ZWdlciAoJGludGVnZXIpIC4uLiIKICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICB9CiAgICAgIH0gCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICBGaWxlIENoZWNrXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBzZXQgZmlsZXMgMAogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86IENoZWNraW5nIGRlc2lnbiBmaWxlcyAuLi5cbiIKICAgICAgZm9yZWFjaCBmaWxlICRjaGVjayhmaWxlcykgewogICAjICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAkZmlsZSAuLi5cbiIKICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgRVJST1I6IEZpbGUgZG9lcyBub3QgZXhpc3QgKCRmaWxlKSAuLi5cbiIKICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJGaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW5jciBmaWxlcwogICAgICAgICB9CiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAuLi4gZm91bmQgJGZpbGVzIGZpbGVzXG4iCiAgICAgIHNldCBmaWxlcyAwCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogQ2hlY2tpbmcgTEVGIGZpbGVzIC4uLlxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobGVmX2ZpbGVzKV19IHsKICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGxlZl9maWxlcykgewogICAgICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogRmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpXG4iCiAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiRmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpIgogICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGluY3IgZmlsZXMKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogICAgLi4uIGZvdW5kICgkZmlsZXMvW2xsZW5ndGggJHZhcnMobGVmX2ZpbGVzKV0pIGxlZiBmaWxlc1xuIgogICAgICB9CiAgICAgIHNldCBmaWxlcyAwCiAgICAgIHNldCB0b3RhbCAwCiMgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpXX0gewojICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogQ2hlY2tpbmcgbGlicmFyeSBzZXRzIC4uLlxuIgogICAgICAgICBmb3JlYWNoIGxpYnJhcnlfc2V0ICR2YXJzKGxpYnJhcnlfc2V0cykgewojICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9sZGIpXSAmJiAkdmFycyhlbmFibGVfbGRiKX0gewojICAgICAgICAgICAgICAgc2V0IHRlbXBfbGlzdCAkdmFycygkbGlicmFyeV9zZXQsdGltaW5nLG9yaWcpCiMgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdGVtcF9saXN0ICR2YXJzKCRsaWJyYXJ5X3NldCx0aW1pbmcpCiMgICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdGVtcF9saXN0IHsKICAgICAgICAgICAgICAgaW5jciB0b3RhbAogICAgICAgICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogRmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpXG4iCiMgICAgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIkZpbGUgZG9lcyBub3QgZXhpc3QgKCRmaWxlKSIKIyAgICAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaW5jciBmaWxlcwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkbGlicmFyeV9zZXQsc2kpXX0gewogICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJGxpYnJhcnlfc2V0LHNpKSB7CiAgICAgICAgICAgICAgICAgIGluY3IgdG90YWwKICAgICAgICAgICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogQ0RCIGZpbGUgZG9lcyBub3QgZXhpc3QgKCRmaWxlKVxuIgojICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiQ0RCIGZpbGUgZG9lcyBub3QgZXhpc3QgKCRmaWxlKSIKIyAgICAgICAgICAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpbmNyIGZpbGVzCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7ISR2YXJzKGVuYWJsZV9zaV9hd2FyZSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBDREIgbGlicmFyaWVzIG5vdCBkZWZpbmVkIGZvciAkbGlicmFyeV9zZXQgbGlicmFyeSBzZXRcbiIKICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiQ0RCIGxpYnJhcmllcyBub3QgZGVmaW5lZCBmb3IgJGxpYnJhcnlfc2V0IGxpYnJhcnkgc2V0IgogICAgICAgICAgICAgICAgICBpbmNyIHdhcm5pbmdfY291bnQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAuLi4gZm91bmQgKCRmaWxlcy8kdG90YWwpIGxpYnJhcnkgZmlsZXNcbiIKICAgICAgICAgaWYgeyR0b3RhbCAhPSAkZmlsZXN9IHsKICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJbZXhwciAkdG90YWwgLSAkZmlsZXNdIHRpbWluZyBsaWJyYXJ5IGZpbGVzIHdlcmUgbm90IGZvdW5kICIKICAgICAgICAgICAgaW5jciBlcnJvcl9jb3VudAogICAgICAgICB9CiAgICAgICAgIHNldCBmaWxlcyAwCiMgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogQ2hlY2tpbmcgcmMgY29ybmVycyAuLi5cbiIKICAgICAgICAgZm9yZWFjaCBmaWxlICRjaGVjayhyY19jb3JuZXJzKSB7CiAgICAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICRmaWxlXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBGaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSlcbiIKICAgICAgICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJGaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkiCiAgICAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaW5jciBmaWxlcwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBJTkZPOiAgICAuLi4gZm91bmQgJGZpbGVzIGZpbGVzXG4iCiAgICAgICAgIHNldCBmaWxlcyAwCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogQ2hlY2tpbmcgY29uc3RyYWludCBtb2RlcyAuLi5cbiIKICAgICAgICAgZm9yZWFjaCBmaWxlX2xpc3QgJGNoZWNrKGNvbnN0cmFpbnRfbW9kZXMpIHsKICAgICAgICAgICAgZm9yZWFjaCBmaWxlICRmaWxlX2xpc3QgewogICAgICAgICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldIHx8IChbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICEkdmFycyhjcGZfdGltaW5nKSl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBFUlJPUjogRmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiRmlsZSBkb2VzIG5vdCBleGlzdCAoJGZpbGUpIgogICAgICAgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaW5jciBmaWxlcwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQojICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIC4uLiBmb3VuZCAkZmlsZXMgZmlsZXNcbiIKICAgICAgc2V0IGZpbGVzIDAKICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSU5GTzogQ2hlY2tpbmcgcGx1Z2luIGZpbGVzIC4uLlxuIgogICAgICBmb3JlYWNoIHBsdWcgJGNoZWNrKHBsdWdpbnMpIHsKICAgICAgICAgc2V0IGZpbGUgJHZhcnMoJHBsdWcpCiAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICRmaWxlXSAmJiAhW2ZpbGUgZXhpc3RzICR2YXJzKHBsdWdfZGlyKS8kZmlsZV19IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBXQVJOSU5HOiBGaWxlIGRvZXMgbm90IGV4aXN0ICgkZmlsZSkgLi4uIGNvbnRpbnVpbmdcbiIKICAgICAgICAgICAgbGFwcGVuZCB2YXJzKG1pc3NpbmdfcGx1Z2lucykgJHBsdWcgCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxhcHBlbmQgdmFycyhwbHVnaW5zX2ZvdW5kKSAkcGx1ZyAKICAgICAgICAgICAgaW5jciBmaWxlcwogICAgICAgICAgICBpZiB7ISR2YXJzKGVuYWJsZV9jZWx0aWNfc3RlcHMpfSB7IAogICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicG9zdHJvdXRlX3NpIiAkcGx1Z119IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiUGx1Zy1pbiAkcGx1ZyB3aWxsIGJlIHNraXBwZWQgZm9yIHNpQXdhcmUgZmxvdyIKICAgICAgICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogUGx1Zy1pbiAkcGx1ZyB3aWxsIGJlIHNraXBwZWQgZm9yIHNpQXdhcmUgZmxvd1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgIFRvIGVuYWJsZSBjZWx0aWMgYmFzZWQgU0kgZmxvdywgdXNlIHZhcnMoZW5hYmxlX2NlbHRpY19zdGVwcylcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElORk86ICAgIC4uLiBmb3VuZCAkZmlsZXMgZmlsZXNcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgICBGbG93IE9wdGlvbnNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICBzZXQgZmxvdyBoaWVyYXJjaGljYWwKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGZsb3cgZmxhdAogICAgICB9CiAgICAgIHNldCB2YWxpZCBbbGlzdCBub25lIGRlZmF1bHQgc3RhbmRhcmQgZXhwcmVzcyBleHRyZW1lXQogICAgICBpZiB7W2xzZWFyY2ggJHZhbGlkIFtzdHJpbmcgdG9sb3dlciAkdmFycyhmbG93X2VmZm9ydCldXSA9PSAtMX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKGZsb3dfZWZmb3J0KSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycyhmbG93X2VmZm9ydClcbiIKICAgICAgICAgc2V0IGVycm9ycygkZXJyb3JfY291bnQpICJWYXJpYWJsZSB2YXJzKGZsb3dfZWZmb3J0KSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycyhmbG93X2VmZm9ydCkiCiAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgTXVzdCBiZSBvbmUgb2YgJyR2YWxpZCdcbiIKICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZmxvd19lZmZvcnQpXSA9PSAibm9uZSIpIHx8IChbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZmxvd19lZmZvcnQpXSA9PSAiZGVmYXVsdCIpfSB7CiAgICAgICAgICAgIGFwcGVuZCB3YXJuaW5ncygkd2FybmluZ19jb3VudCkgIkNoYW5naW5nIHZhcnMoZmxvd19lZmZvcnQpIGZyb20gJyR2YXJzKGZsb3dfZWZmb3J0KScgdG8gJ3N0YW5kYXJkJyIKICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfZWZmb3J0KSBzdGFuZGFyZAogICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0IHZhbGlkIFtsaXN0IG5vbmUgbG93IGhpZ2hdCiAgICAgIGlmIHtbbHNlYXJjaCAkdmFsaWQgW3N0cmluZyB0b2xvd2VyICR2YXJzKHBvd2VyX2VmZm9ydCldXSA9PSAtMX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIEVSUk9SOiBWYXJpYWJsZSB2YXJzKHBvd2VyX2VmZm9ydCkgaGFzIGlsbGVnYWwgdmFsdWUgJHZhcnMocG93ZXJfZWZmb3J0KVxuIgogICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIlZhcmlhYmxlIHZhcnMocG93ZXJfZWZmb3J0KSBoYXMgaWxsZWdhbCB2YWx1ZSAkdmFycyhwb3dlcl9lZmZvcnQpIgogICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgIE11c3QgYmUgb25lIG9mICckdmFsaWQnXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgICBGbG93ID0gJGZsb3dcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgIFBvd2VyID0gJHZhcnMocG93ZXJfZWZmb3J0KVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICBGbGF2b3IgPSAkdmFycyhmbG93KVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICBFZmZvcnQgPSAkdmFycyhmbG93X2VmZm9ydClcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgIFBsYWNlbWVudCBPcHRpb25zXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBsYWNlX29wdF9kZXNpZ24pXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgIFBsYWNlIE9wdCBEZXNpZ24gPSAkdmFycyhwbGFjZV9vcHRfZGVzaWduKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbl9wbGFjZV9vcHQpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICBJbiBQbGFjZSBPcHQgPSAkdmFycyhpbl9wbGFjZV9vcHQpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG5vX3ByZV9wbGFjZV9vcHQpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBObyBQcmVQbGFjZSBPcHQgPSAkdmFycyhub19wcmVfcGxhY2Vfb3B0KVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwbGFjZV9pb19waW5zKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICBQbGFjZSBJTyBQaW5zID0gJHZhcnMocGxhY2VfaW9fcGlucylcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZSldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgQ2xvY2sgR2F0ZSBBd2FyZSA9ICR2YXJzKGNsb2NrX2dhdGVfYXdhcmUpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNvbmdlc3Rpb25fZWZmb3J0KV19IHsKICAgICAgICAgaWYgeyR2YXJzKGNvbmdlc3Rpb25fZWZmb3J0KSA9PSAibm9uZSJ9IHsKICAgICAgICAgICAgdW5zZXQgdmFycyhjb25nZXN0aW9uX2VmZm9ydCkgIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgQ29uZ2VzdGlvbiBFZmZvcnQgPSAkdmFycyhjb25nZXN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgIENsb2NrIFRyZWUgT3B0aW9uc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgUm91dGUgQ2xvY2sgTmV0cyA9ICR2YXJzKHJvdXRlX2Nsb2NrX25ldHMpXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19lY28pXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICBDbG9jayBFQ08gPSAkdmFycyhjbG9ja19lY28pXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvbiBPcHRpb25zXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGxlYWthZ2VfZWZmb3J0KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgIExlYWthZ2UgRWZmb3J0ID0gJHZhcnMobGVha2FnZV9lZmZvcnQpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHByZXNlcnZlX2Fzc2VydGlvbnMpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgIFByZXNlcnZlIEFzc2VydGlvbnMgPSAkdmFycyhwcmVzZXJ2ZV9hc3NlcnRpb25zKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1c2VmdWxfc2tldyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICBVc2VmdWwgU2tldyA9ICR2YXJzKHVzZWZ1bF9za2V3KVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcml0aWNhbF9yYW5nZSldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICBDcml0aWNhbCBSYW5nZSA9ICR2YXJzKGNyaXRpY2FsX3JhbmdlKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhhbGxfZW5kX3BvaW50cyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICBBbGwgRW5kIFBvaW50cyA9ICR2YXJzKGFsbF9lbmRfcG9pbnRzKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzaXplX29ubHlfZmlsZSldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICBTaXplIE9ubHkgRmlsZSA9ICR2YXJzKHNpemVfb25seV9maWxlKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkb250X3VzZV9maWxlKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgIERvbid0IFVzZSBGaWxlID0gJHZhcnMoZG9udF91c2VfZmlsZSlcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2tld19idWZmZXJzKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgU2tldyBCdWZmZXJzID0gJHZhcnMoc2tld19idWZmZXJzKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfcGFjKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICBFbmFibGUgUEFDID0gJHZhcnMoZW5hYmxlX3BhYylcbiIKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgICAgZm9yZWFjaCBwYWMgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYWMscGFjX21vZGUpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgJHBhYyAtPiAkdmFycygkcGFjLHBhY19tb2RlKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgSG9sZCBGaXhpbmcgT3B0aW9uc1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICBGaXggSG9sZCA9ICR2YXJzKGZpeF9ob2xkKVxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZml4X2hvbGRfZWZmb3J0KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgRml4IEhvbGQgRWZmb3J0ID0gJHZhcnMoZml4X2hvbGRfZWZmb3J0KVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgIElnbm9yZSBJT3MgID0gJHZhcnMoZml4X2hvbGRfaWdub3JlX2lvcylcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgQWxsb3cgVE5TIERlZ3JhZGF0aW9uID0gJHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKVxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgICAgVGltaW5nIE9wdGlvbnNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgRW5hYmxlIENQUFIgPSAkdmFycyhlbmFibGVfY3BwcilcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICBFbmFibGUgT0NWID0gJHZhcnMoZW5hYmxlX29jdilcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgIEVuYWJsZSBBT0NWID0gJHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICBFbmFibGUgU09DViA9ICR2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICBFbmFibGUgU1MgPSAkdmFycyhlbmFibGVfc3MpXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgICBSb3V0aW5nIE9wdGlvbnNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModHJhY2tfb3B0KV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgIEluIFJvdXRlIE9wdGltaXphdGlvbiA9ICR2YXJzKHRyYWNrX29wdClcbiIKIyAgICAgICAgIGlmIHskdmFycyh0cmFja19vcHQpfSB7CiMgICAgICAgICAgICBzZXQgdmFycyhlbmFibGVfc2lfYXdhcmUpIHRydWUKIyAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModHF1YW50dXNfZmlsZSldfSB7CiMgICAgICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgInRRdWFudHVzIGZpbGUgLSB2YXJzKHRxdWFudHVzX2ZpbGUpIC0gcmVxdWlyZWQgd2hlbiB2YXJzKHRyYWNrX29wdCkgc2V0IHRvIHRydWUiCiMgICAgICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiMgICAgICAgICAgICB9CiMgICAgICAgICB9CiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG11bHRpX2N1dF9lZmZvcnQpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgIE11bHRpLUN1dCBFZmZvcnQgPSAkdmFycyhtdWx0aV9jdXRfZWZmb3J0KVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhsaXRob19kcml2ZW5fcm91dGluZyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICBMaXRobyBEcml2ZW4gUm91dGluZyA9ICR2YXJzKGxpdGhvX2RyaXZlbl9yb3V0aW5nKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhhbnRlbm5hX2Rpb2RlKV0gJiYgKCR2YXJzKGFudGVubmFfZGlvZGUpICE9ICIiKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgIEFudGVubmEgRGlvZGUgPSAkdmFycyhhbnRlbm5hX2Rpb2RlKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhyZWxhdGl2ZV9jX3RocmVzaCldIHx8IFwKICAgICAgICAgIFtpbmZvIGV4aXN0cyB2YXJzKHRvdGFsX2NfdGhyZXNoKV0gfHwgXAogICAgICAgICAgW2luZm8gZXhpc3RzIHZhcnMoY291cGxpbmdfY190aHJlc2gpXSB8fFwKICAgICAgICAgIFtpbmZvIGV4aXN0cyB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCldIHx8XAogICAgICAgICAgW2luZm8gZXhpc3RzIHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgIEV4dHJhY3Rpb24gT3B0aW9uc1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgIFJlbGF0aXZlIEMgVGhyZXNob2xkID0gJHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHRvdGFsX2NfdGhyZXNoKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgIFRvdGFsIEMgVGhyZXNob2xkID0gJHZhcnModG90YWxfY190aHJlc2gpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNvdXBsaW5nX2NfdGhyZXNoKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgIENvdXBsaW5nIEMgVGhyZXNob2xkID0gJHZhcnMoY291cGxpbmdfY190aHJlc2gpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgUG9zdHJvdXRlIEVmZm9ydCBMZXZlbCA9ICR2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICBTaWdub2ZmIEVmZm9ydCBMZXZlbCA9ICR2YXJzKHNpZ25vZmZfZXh0cmFjdGlvbl9lZmZvcnQpXG4iCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgICAgICAgREZNIE9wdGlvbnNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBzZXQgY2hlY2tfbHBhX3RlY2ggMAogICAgICBzZXQgY2hlY2tfbHBhX2NvbmYgMAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZml4X2xpdGhvKV0gJiYgJHZhcnMoZml4X2xpdGhvKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICBGaXggTGl0aG8gPSAkdmFycyhmaXhfbGl0aG8pXG4iCiAgICAgICAgIHNldCBjaGVja19scGFfY29uZiAxCiAgICAgICAgIHNldCB2YXJzKHZlcmlmeV9saXRobykgdHJ1ZQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2ZXJpZnlfbGl0aG8pXSAmJiAkdmFycyh2ZXJpZnlfbGl0aG8pfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgIFZlcmlmeSBMaXRobyA9ICR2YXJzKHZlcmlmeV9saXRobylcbiIKICAgICAgICAgc2V0IGNoZWNrX2xwYV90ZWNoIDEKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobHBhX3RlY2hfZmlsZSldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgTFBBIFRlY2ggRmlsZSA9ICR2YXJzKGxwYV90ZWNoX2ZpbGUpXG4iCiAgICAgIH0gCiAgICAgIGlmIHskY2hlY2tfbHBhX3RlY2h9IHsgCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobHBhX3RlY2hfZmlsZSldfSB7CiAgICAgICAgICAgIHNldCBlcnJvcnMoJGVycm9yX2NvdW50KSAiTFBBIHRlY2ggZmlsZSBub3QgZGVmaW5lZCAuLi4iCiAgICAgICAgICAgIGluY3IgZXJyb3JfY291bnQKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhscGFfY29uZl9maWxlKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICBMUEEgQ29uZiBGaWxlID0gJHZhcnMobHBhX2NvbmZfZmlsZSlcbiIKICAgICAgfQogICAgICBpZiB7JGNoZWNrX2xwYV9jb25mfSB7IAogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGxwYV9jb25mX2ZpbGUpXX0gewogICAgICAgICAgICBzZXQgZXJyb3JzKCRlcnJvcl9jb3VudCkgIkxQQSBjb25mIGZpbGUgbm90IGRlZmluZWQgLi4uIgogICAgICAgICAgICBpbmNyIGVycm9yX2NvdW50CiAgICAgICAgIH0KICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICBTaWduYWwgSW50ZWdyaXR5IE9wdGlvbnNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgIFByb2Nlc3MgPSAkdmFycyhwcm9jZXNzKVxuIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgRGVsdGEgRGVsYXkgVGhyZXNob2xkID0gJHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjZWx0aWNfc2V0dGluZ3MpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICBDZWx0aWMgU2V0dGluZ3MgPSAkdmFycyhjZWx0aWNfc2V0dGluZ3MpXG4iCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgIEFuYWx5c2lzIFR5cGUgPSAkdmFycyhzaV9hbmFseXNpc190eXBlKVxuIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhhY2NlcHRhYmxlX3ducyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgQW5hbHlzaXMgVHlwZSA9ICR2YXJzKGFjY2VwdGFibGVfd25zKVxuIgogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGlzdHJpYnV0ZSldfSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZGlzdCgkdmFycyhkaXN0cmlidXRlKSldfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICAgIE11bHRpcGxlIENQVXNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgIE1vZGUgPSAkdmFycyhkaXN0cmlidXRlKVxuIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobG9jYWxfY3B1cyldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgIENQVXMgT24gTG9jYWwgSG9zdCA9ICR2YXJzKGxvY2FsX2NwdXMpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJlbW90ZV9ob3N0cyldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgTnVtYmVyIG9mIFJlbW90ZSBIb3N0cyA9ICR2YXJzKHJlbW90ZV9ob3N0cylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3B1c19wZXJfcmVtb3RlX2hvc3QpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgQ1BVcyBQZXIgUmVtb3RlIEhvc3QgPSAkdmFycyhjcHVzX3Blcl9yZW1vdGVfaG9zdClcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhsb2NhbF9jcHVzKV19IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgQ1BVc1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgIENQVXMgT24gTG9jYWwgSG9zdCA9ICR2YXJzKGxvY2FsX2NwdXMpXG4iCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KX0gewogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICA8PDwgSElHSCBFRkZPUlQgRkxPVyBFTkFCTEVEID4+PlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgV0FSTklORzogVmFyaWFibGUgdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gUGxlYXNlIHVzZSB2YXJzKGZsb3dfZWZmb3J0KS5cbiIKICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR3YXJuaW5nX2NvdW50KSAiVmFyaWFibGUgdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gUGxlYXNlIHVzZSB2YXJzKGZsb3dfZWZmb3J0KS4iCiAgICAgICAgICAgIGluY3Igd2FybmluZ19jb3VudAogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgIEFib3J0IG9uIFNldHVwIEVycm9yID0gJHZhcnMoYWJvcnQpXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyBzYXZlX3ZhcnNdIHsKICAgICAgICAgICAgc2V0IHZhcnMoJHZhcikgJHNhdmVfdmFycygkdmFyKQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIHNldCB2YXJzKGluZm9fY291bnQpICRpbmZvX2NvdW50CiAgICAgIGlmIHskaW5mb19jb3VudCA+IDB9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAgICAgICAgICAgICAgICAgIEluZm8gU3VtbWFyeVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCiAgICAgICAgIGZvciB7c2V0IGkgMH0geyRpPCRpbmZvX2NvdW50fSB7aW5jciBpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAoW2V4cHIgJGkgKyAxXSkgJGluZm9zKCRpKVxuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCiAgICAgIH0KICAgICAgc2V0IHZhcnMod2FybmluZ19jb3VudCkgJHdhcm5pbmdfY291bnQKICAgICAgaWYgeyR3YXJuaW5nX2NvdW50ID4gMH0gewogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgICAgICAgICAgICAgICAgICAgV2FybmluZyBTdW1tYXJ5XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgICAgZm9yIHtzZXQgaSAwfSB7JGk8JHdhcm5pbmdfY291bnR9IHtpbmNyIGl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIChbZXhwciAkaSArIDFdKSAkd2FybmluZ3MoJGkpXG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1hbmQKICAgICAgfQogICAgICBzZXQgdmFycyhlcnJvcl9jb3VudCkgJGVycm9yX2NvdW50CiAgICAgIGlmIHskZXJyb3JfY291bnQgPiAwfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgICAgICAgICAgICAgICAgICAgRXJyb3IgU3VtbWFyeVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCiAgICAgICAgIGZvciB7c2V0IGkgMH0geyRpPCRlcnJvcl9jb3VudH0ge2luY3IgaX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgKFtleHByICRpICsgMV0pICRlcnJvcnMoJGkpXG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1hbmQKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgICAgICAgICAgICBTRVRVUCBDSEVDSyBQQVNTRURcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICB9CgogICAgICBmaWxlIG1rZGlyICR2YXJzKHNjcmlwdF9kaXIpCiAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9jaGVjay5ycHQgd10KCiAgICAgIHB1dHMgJG9wICRjb21tYW5kcwoKICAgICAgY2xvc2UgJG9wCgogICAgICBpZiB7JHZhcnMoYWJvcnQpICYmICgkZXJyb3JfY291bnQgPiAwKX0gewogICAgICAgICBwdXRzICI8RkY+IEFib3J0aW5nIGR1ZSB0byBwcmV2aW91cyBlcnJvcnMgLi4uIgogICAgICAgICBwdXRzICI8RkY+IFNlZSAkdmFycyhzY3JpcHRfZGlyKS9jaGVjay5ycHQgZm9yIGRldGFpbHMiCiAgICAgICAgIHB1dHMgIiIKICAgICAgICAgcHV0cyAiICAgICAgICAgICAgICAgICAgRXJyb3IgU3VtbWFyeSIKICAgICAgICAgcHV0cyAiICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSIKCiAgICAgICAgIGZvciB7c2V0IGkgMH0geyRpPCRlcnJvcl9jb3VudH0ge2luY3IgaX0gewogICAgICAgICAgICBwdXRzICIgICAoW2V4cHIgJGkgKyAxXSkgJGVycm9ycygkaSkiCiAgICAgICAgIH0KICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgZXhpdCAtMQogICAgICB9CgogICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIGlmIHshW0ZGOjppc19scF9mbG93XX0gewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgfQogICAgICAgICBzZXQgdmFycyhyZXF1aXJlZF9wcm9jcykgImdldF9jbG9ja19wb3J0cyBnZXRfcG93ZXJfZG9tYWlucyBtb2RpZnlfcG93ZXJfZG9tYWlucyBhZGRfcG93ZXJfc3dpdGNoZXMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlX3NlY29uZGFyeV9wZ19uZXRzIGJ1ZmZlcl9hbHdheXNfb25fbmV0cyBpbnNlcnRfd2VsbHRhcHNfZW5kY2FwcyIKICAgICAgfQoKICAgICAgc2V0IHZhcnMoY2hlY2tfc2V0dXApIDAKCiAgICAgICMgUmVjb3JkIGVycm9ycyBmb3IgbGF0ZXIgcHJvY2Vzc2luZwogICAgICBzZXQgdmFycyhjaGVja19zZXR1cF9lcnJvcnMpIHt9CiAgICAgIGZvciB7c2V0IGkgMH0geyRpPCRlcnJvcl9jb3VudH0ge2luY3IgaX0gewogICAgICAgICBsYXBwZW5kIHZhcnMoY2hlY2tfc2V0dXBfZXJyb3JzKSAkZXJyb3JzKCRpKQogICAgICB9CiAgIH0KCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBQcm9jZWR1cmUgdG8gZGV0ZXJtaW5lIGZsb3cgZmxhdm9yLCBjaGVjayBmb3IgaWxtcywgZXRjLgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICBwcm9jIGNoZWNrX2Zsb3cge30gewogICAKICAgICAgZ2xvYmFsIHZhcnMKICAgCiAgICAgIHNldCB2YXJzKGlsbSkgMAogICAgICBzZXQgdmFycyh0b3ApIDAKICAgCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXSB8fCAoW2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXSAmJiBcCiAgICAgICAgICAgKFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSIpKX0gewoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGZsYXZvcikgZmxhdAogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG1vZGUpXX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhtb2RlKSAiZmxhdCIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhmbGF2b3IpIGhpZXIKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhtb2RlKV19IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMobW9kZSkgInRvcF9kb3duIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0gJiYgKCR2YXJzKG1vZGUpID09ICJib3R0b21fdXAiKX0gewogICAgICAgICAgICBzZXQgdmFycyhpbG0pIDEKICAgICAgICAgfQogICAKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGlsbV9saXN0KV0gJiYgKCR2YXJzKGlsbV9saXN0KSAhPSAiIil9IHsKICAgICAgICAgICAgc2V0IHZhcnMoaWxtKSAxCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKGlsbSkgMAogICAgICAgICB9CiAgIAogICAgICB9IGVsc2UgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICBzZXQgcHRuIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgICAgIHNldCB2YXJzKHB0bikgJHB0bgogICAgICAgICAgICBpZiB7KFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dID09ICIkdmFycyhwYXJ0aXRpb25fZGlyKSIpICYmCiAgICAgICAgICAgICAgICAoW2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICRwdG5dID09IC0xKX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhpbG0pIDEKICAgICAgICAgICAgICAgc2V0IHZhcnModG9wKSAxCiMgICAgICAgICAgICAgICBGRl9FREk6Om5vcm1hbGl6ZV9jb25zdHJhaW50cwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHZhcnMoZGVidWcpfSB7CiAgICAgICAgIHB1dHMgIjxERUJVRz4gRmxvdyAtPiAkdmFycyhmbGF2b3IpIDogU3RlcCAtPiAkdmFycyhzdGVwKSA6IElMTSAtPiAkdmFycyhpbG0pIgogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX2NvbXBpbGUge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUwogICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy9ydW5fY29tcGlsZS50Y2wgd10KCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhsZGJfZGlyKV19IHsKICAgICAgICAgc2V0IHZhcnMobGRiX2RpcikgTERCCiAgICAgIH0KICAgICAgZmlsZSBta2RpciAkdmFycyhsZGJfZGlyKQogICAgICBzZXQgZG9uZV9saXN0IFtsaXN0XQoKICAgICAgZm9yZWFjaCBzZXQgJHZhcnMobGlicmFyeV9zZXRzKSB7CiAgICAgICAgIHNldCBmaWxlX2xpc3QgW2xpc3RdCiAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkc2V0LHRpbWluZykgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGRvbmVfbGlzdCAkZmlsZV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ3cml0ZV9sZGIgLWxpYnJhcnkgJGZpbGUgLW91dGZpbGUgJHZhcnMobGRiX2RpcikvW2ZpbGUgdGFpbCAkZmlsZS5sZGJdXG4iCiAgICAgICAgICAgICAgIGxhcHBlbmQgZG9uZV9saXN0ICRmaWxlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFwcGVuZCBmaWxlX2xpc3QgJHZhcnMobGRiX2RpcikvW2ZpbGUgdGFpbCAkZmlsZV0ubGRiCiAgICAgICAgIH0KICAgICAgICAgc2V0IHZhcnMoJHNldCx0aW1pbmcsb3JpZykgJHZhcnMoJHNldCx0aW1pbmcpCiAgICAgICAgIHNldCB2YXJzKCRzZXQsdGltaW5nKSAkZmlsZV9saXN0CiAgICAgIH0KCiAgICAgIHB1dHMgJG9wICIkY29tbWFuZHNcbmV4aXRcbiIKICAgICAgY2xvc2UgJG9wCgogICAgICBzZXQgdmFycyhyYW5fY29tcGlsZSkgMQogICB9CgoKICAgIyBHZW5lcmF0ZSB0aGUgY29tbWFuZCB0byB2ZXJpZnkgZ2VvbWV0cnkuIFRoaXMgaXMgdmVyaWZ5R2VvbWV0cnkKICAgIyBmb3IgdHJhZGl0aW9uYWwgcHJvY2Vzc2VzLCB2ZXJpZnlfZHJjIGZvciAyMG5tIGFuZCBiZWxvdy4KICAgcHJvYyB2ZXJpZnlfZ2VvbWV0cnlfY29tbWFuZCB7fSB7CiAgICAgZ2xvYmFsIHZhcnMKICAgICBzZXQgcHJvY2VzcyBbcmVnc3ViICJubSIgJHZhcnMocHJvY2VzcykgIiJdCiAgICAgaWYgeyhbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDE2KSB8fCAoKFtsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gMF0gPT0gMTYpICYmIChbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAxXSA+IDEpKX0gewogICAgICAgcmV0dXJuICJ2ZXJpZnlfZHJjIgogICAgIH0gZWxzZSB7CiAgICAgICBpZiB7JHByb2Nlc3MgPiAyOH0gewogICAgICAgICByZXR1cm4gInZlcmlmeUdlb21ldHJ5IgogICAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuICJ2ZXJpZnlfZHJjIgogICAgICAgfQogICAgIH0KICAgfQoKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIFByb2NlZHVyZSB0byBpbml0aWFsaXplIHRoZSBmb3VuZGF0aW9uIGZsb3cgCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgIHByb2MgaW5pdGlhbGl6ZV9mbG93IHt9IHsKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IGNvbW1hbmRzICIiCgogICAgICBGRl9FREk6OnNlZWRfdmFyaWFibGVzIDEKICAgICAgRkZfRURJOjpjaGVja19zZXR1cAoKICAgICAgaWYge1tpbmZvIGV4aXN0IGVudihWUEFUSCldfSB7CiAgICAgICAgIGZpbGUgbWtkaXIgJGVudihWUEFUSCkKICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNhcHR1cmVfbWV0cmljcyldICYmICR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsgCiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE0fSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgTG9hZGluZyBhcHBsZXRzIGZvciBtZXRyaWNzIGNhcHR1cmUgLi4uXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbZXhlYyBwd2RdXV0gPT0gJHZhcnMocGFydGl0aW9uX2Rpcil9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzb3VyY2UgJHZhcnMobm9ybV9zY3JpcHRfcGF0aCkvRVRDL2FwcGxldC50Y2xcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzb3VyY2UgJHZhcnMobm9ybV9zY3JpcHRfcGF0aCkvRVRDL2NvbXBhdGliaWxpdHkudGNsXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2F0dHJpYnV0ZSBhcHBsZXRfc2VhcmNoX3BhdGggJHZhcnMobm9ybV9zY3JpcHRfcGF0aCkvRVRDL2FwcGxldHMgL1xuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSBcJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9hcHBsZXQudGNsXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic291cmNlIFwkdmFycyhzY3JpcHRfcGF0aCkvRVRDL2NvbXBhdGliaWxpdHkudGNsXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2F0dHJpYnV0ZSBhcHBsZXRfc2VhcmNoX3BhdGggXCR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvYXBwbGV0cyAvXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJhcHBsZXQgbG9hZCBtZWFzdXJlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiYXBwbGV0IGxvYWQgdGltZV9pbmZvXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2ZpbGUgZXhpc3RzICR2YXJzKHRpbWVfaW5mb19kYilcXX0ge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIHRpbWVfaW5mbyAtcXVpZXQgLXRhYmxlIGZmX2V4dCAtbG9hZCAkdmFycyh0aW1lX2luZm9fZGIpXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIKICAgICAgICAgfQogICAgICB9CgoKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICAgICAgICAgICAgICAgICBSVU4gU0NSSVBUIEZPUiBTVEVQICdbc3RyaW5nIHRvdXBwZXIgJHZhcnMoc3RlcCldJ1xuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGlmIHskdmFycyhyZXBvcnRfc3lzdGVtX2luZm8pfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmZfcHJvY3M6OnN5c3RlbV9pbmZvXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OmluaXRpYWxpemVfbXVsdGljcHVdCgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgbG9hZF9kZXNpZ24ge3N0ZXAge2N1cnJlbnRfc3RlcCAiIn0ge2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBnbG9iYWwgd2FybmluZ3MKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhoaWVyKV19IHsKICAgICAgICAgc2V0IGhpZXIgdHJ1ZQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgaGllciBmYWxzZQogICAgICB9CgogICAgICBpZiB7JGN1cnJlbnRfc3RlcCA9PSAiIn0gewogICAgICAgICBzZXQgY3VycmVudF9zdGVwICRzdGVwCiAgICAgIH0KCiMgICAgICBpZiB7JHN0ZXAgPT0iIn0gewojICAgICAgICAgc2V0IHN0ZXAgJHZhcnMoc3RlcCkKIyAgICAgIH0KIyAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc3RlcCldfSB7CiMgICAgICAgICBzZXQgdmFycyhzdGVwKSAkc3RlcAojICAgICAgfQogICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHNldCByZXN0b3JlX2Rlc2lnbiB0cnVlCiAgICAgIH0KICAgICAgc2V0IGRlc2lnbiAkdmFycyhkZXNpZ24pCgogICAgICBpZiB7W3JlZ2V4cCAiXnN5biIgJGN1cnJlbnRfc3RlcF19IHsKICAgICAgICAgIHJldHVybiAiXG5yZWFkX2RiICR2YXJzKGRic19kaXIpLyRzdGVwLmRiXG4iIAogICAgICB9CgogICAgICAjIEJ1aWxkIHJlc3RvcmVfZGVzaWduIGNvbW1hbmQgc3RyaW5nCiAgICAgICMgLi4uIGNoZWNrIGZpcnN0IGZvciBzdGFydGluZ19kYnMKICAgICAgIyAuLi4gaWYgbm90IHdlIG5lZWQgdG8ga25vdyB0aGUgZGVzaWduIG5hbWUgYXMgdGhpcyBtYXkgYmUgYSAKICAgICAgIyAgICAgcmVjdXJzaXZlIGNhbGwgaW4gYSBoaWVyYXJoaWNhbCBmbG93CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicyldfSB7CiAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAjIEludGVycHJldCB0aGUgc3RhcnRpbmcgREJTIGFzIGFuIE9BIHRyaXBsZQogICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJbbGlzdCByZXN0b3JlRGVzaWduIC1jZWxsdmlldyAkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicyldXG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBpc2RpcmVjdG9yeSAkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicyldfSB7CiAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlc3RvcmVEZXNpZ24gJHZhcnMoJGN1cnJlbnRfc3RlcCxzdGFydGluZ19kYnMpICRkZXNpZ25cbiIKICAgICAgICAgICAgfSBlbHNlaWYge1tmaWxlIGV4aXN0cyAkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicyldfSB7CiAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlc3RvcmVEZXNpZ24gJHZhcnMoJGN1cnJlbnRfc3RlcCxzdGFydGluZ19kYnMpLmRhdCAkZGVzaWduXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gU3RhcnRpbmcgREJTICgkdmFycygkY3VycmVudF9zdGVwLHN0YXJ0aW5nX2RicykpIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJyZXN0b3JlRGVzaWduICR2YXJzKCRjdXJyZW50X3N0ZXAsc3RhcnRpbmdfZGJzKS5kYXQgJGRlc2lnblxuIgogICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJTdGFydGluZyBEQlMgKCR2YXJzKCRjdXJyZW50X3N0ZXAsc3RhcnRpbmdfZGJzKSkgZGVmaW5lZCBidXQgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgIyBCQ0w6IEFkZGVkIHN1YnN0IGFyb3VuZCB2YXJzKGRic19kaXIpIHRvIHJlc29sdmUgdmFycyhydW5kaXIpCiAgICAgICAgIHNldCBkaXIgW3N1YnN0ICR2YXJzKGRic19kaXIpXQogICAgICAgICAjIEFkZGluZyB0aGlzIGZvciBQViAuLi4KICAgICAgICAgaWYgeyEkdmFycyhjb2RlZ2VuKX0gewogICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICRkaXIvJHN0ZXAuZW5jXX0gewogICAgICAgICAgICAgICAjIEJDTDogQ2hhbmdlZCAiREJTIiB0byAkZGlyCiAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgZm9vIFtnbG9iICRkaXIvJHN0ZXAuZW5jLmRhdC8qLmNvbmZdfV19IHsKICAgICAgICAgICAgICAgICAgIyBCQ0w6IENoYW5nZWQgIkRCUyIgdG8gJGRpcgogICAgICAgICAgICAgICAgICByZWdzdWIgIlxcXC5jb25mIiBbZ2xvYiAkZGlyLyRzdGVwLmVuYy5kYXQvKi5jb25mXSAiIiB0ZW1wCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICMgQkNMOiBDaGFuZ2VkICJEQlMiIHRvICRkaXIKICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBmb28gW2dsb2IgJGRpci8kc3RlcC5lbmMuZGF0LyouZ2xvYmFsc119XX0gewogICAgICAgICAgICAgICAgICAgICAjIEJDTDogQ2hhbmdlZCAiREJTIiB0byAkZGlyCiAgICAgICAgICAgICAgICAgICAgIHJlZ3N1YiAiXFxcLmdsb2JhbHMiIFtnbG9iICRkaXIvJHN0ZXAuZW5jLmRhdC8qLmdsb2JhbHNdICIiIHRlbXAKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskZGVzaWduICE9IFtmaWxlIHRhaWwgJHRlbXBdfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGRlc2lnbikgW2ZpbGUgdGFpbCAkdGVtcF0KICAgICAgICAgICAgICAgICAgUHV0cyAiPEZGPiBVcGRhdGluZyBkZXNpZ24gbmFtZSB0byAkZGVzaWduIgogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpIFtmaWxlIHRhaWwgW3B3ZF1dXSAhPSAtMX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgZGVzaWduIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIFB1dHMgIjxGRj4gU3RhcnRpbmcgREJTICRkaXIvJHN0ZXAuZW5jIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICBleGl0IC0xCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgIyBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kIHdpbGwgZGVwZW5kIG9uIHRoZSBkYXRhYmFzZSBmb3JtYXQgLi4uIGFuZCB0aGUgdmVyc2lvbgogICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgICAgaWYgeyRoaWVyfSB7CiAgICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVzdG9yZURlc2lnbiAtY2VsbHZpZXcgXFtsaXN0ICR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRkZXNpZ24gJHN0ZXBcXVxuIgogICAgICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJyZXN0b3JlRGVzaWduIC1jZWxsdmlldyBcW2xpc3QgJHZhcnMob2FfZGVzaWduX2xpYikgJGRlc2lnbiAkc3RlcFxdXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVzdG9yZU9hRGVzaWduICR2YXJzKG9hX2Rlc2lnbl9saWIpICRkZXNpZ24gJHN0ZXBcbiIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7JHZhcnModXNlcl9tb2RlKSA9PSAiaGllciIgJiYgKCR2YXJzKGhpZXJfZmxvd190eXBlKSA9PSAiMnBhc3MiKX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoc3RlcCkgPT0gImN0cyIgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICR2YXJzKGRlc2lnbildICE9IC0xKX0gIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVzdG9yZURlc2lnbiAke2Rlc2lnbn1fcG9zdEVDTy5lbmMuZGF0ICRkZXNpZ25cbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVzdG9yZURlc2lnbiAuICRkZXNpZ25cbiIKICAgICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgICAgIH0gZWxzZWlmIHsoW2xzZWFyY2ggW0ZGOjphZGp1c3Rfc3RlcHNdICR2YXJzKHN0ZXApXSA9PSBbZXhwciBbbHNlYXJjaCBbRkY6OmFkanVzdF9zdGVwc10gY3RzXSsxXSkgJiYgISR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJyZXN0b3JlRGVzaWduIC4gJGRlc2lnblxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJyZXN0b3JlRGVzaWduICRkaXIvJHN0ZXAuZW5jLmRhdCAkZGVzaWduXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UifSB7CiAgICAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlc3RvcmVEZXNpZ24gJGRpci8kc3RlcC5lbmMuZGF0ICRkZXNpZ25cbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewogICAgICAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlc3RvcmVEZXNpZ24gJGRpci8kc3RlcC5lbmMuZGF0ICRkZXNpZ25cbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgICMgUGFzcyB0aGUgY29tbWFuZCB0aHJvdWdoIHRoZSB3cmFwcGVyIGFuZCB0aGVuIG1ha2UgaXQgY29uZGl0aW9uYWwgc28gaXQgY2FuIAogICAgICAjIGJlIGRpc2FibGVkIGluIGEgc2luZ2xlIHByb2Nlc3MgZmxvdwogICAgICBzZXQgcmVzdG9yZV9jb21tYW5kIFtGRjo6d3JhcF9jb21tYW5kICRjdXJyZW50X3N0ZXAscmVzdG9yZV9kZXNpZ24gJHJlc3RvcmVfY29tbWFuZF0KICAgICAgc2V0IGNvbmRfcmVzdG9yZV9jb21tYW5kICJpZiB7XCR2YXJzKHJlc3RvcmVfZGVzaWduKX0geyAkcmVzdG9yZV9jb21tYW5kIH0iCgogICAgICBpZiB7ISRmb3JtYXR9IHsKICAgICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgICAgIHJldHVybiAkY29uZF9yZXN0b3JlX2NvbW1hbmQKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGV2YWwgJGNvbmRfcmVzdG9yZV9jb21tYW5kCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgeyR2YXJzKGNhdGNoX2Vycm9ycyl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbmlmIHtcJHZhcnMocmVzdG9yZV9kZXNpZ24pfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgaWYge1xbY2F0Y2gge1xuJHJlc3RvcmVfY29tbWFuZH1cXX0ge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIFB1dHMgXCI8RkY+IEVSUk9SIExPQURJTkcgREFUQUJBU0UgRlJPTSBTVEVQICRzdGVwIC4uLiBFWElUSU5HXCJcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICBleGl0IC0xXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgfVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbmlmIHtcJHZhcnMocmVzdG9yZV9kZXNpZ24pfSB7IFtzdHJpbmcgdHJpbSAkcmVzdG9yZV9jb21tYW5kXSB9XG4iCiAgICAgICAgIH0KCiAgICAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG51bTo6ZW5hYmxlX21ldHJpY3MgLW9uXG4iCiMgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHB1c2hlZCldIHx8IChbaW5mbyBleGlzdHMgdmFycyhwdXNoZWQpXSAmJiAhJHZhcnMocHVzaGVkKSkgfSB7CiMgICAgICAgICAgICAgICAjIEdHMSAKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAidW06OnB1c2hfc25hcHNob3Rfc3RhY2tcbiIKIyAgICAgICAgICAgICAgIHNldCB2YXJzKHB1c2hlZCkgdHJ1ZQojICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBhbHdheXNfc291cmNlX3RjbF0KCiAgICAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgICAgIH0KICAgICAgfQogICB9CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgU2V0dXAgcHJvY2VkdXJlIGZvciBydW4qIHN0ZXBzCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgIHByb2MgaW5pdGlhbGl6ZV9zdGVwIHtzdGVwfSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIHdhcm5pbmdzCgogICAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdGVwXX0gewogICAgICAgICBzZXQgc3RlcCAkdmFycyhzdGVwKQogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHN0ZXAscnB0X2RpcildfSB7CiAgICAgICAgIHNldCB2YXJzKHJwdF9kaXIpICR2YXJzKCRzdGVwLHJwdF9kaXIpCiAgICAgICAgIGZpbGUgbWtkaXIgJHZhcnMoJHN0ZXAscnB0X2RpcikKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnMocnB0X2RpcikgJHZhcnMob3JpZ19ycHRfZGlyKQogICAgICB9CgogICAgICBzZXQgdmFycygkc3RlcCxjb21tYW5kcykgIiIKCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMod2FybmluZ19jb3VudCldfSB7CiAgICAgICAgIHNldCB2YXJzKHdhcm5pbmdfY291bnQpIDAKICAgICAgfQogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGVycm9yX2NvdW50KV19IHsKICAgICAgICAgc2V0IHZhcnMoZXJyb3JfY291bnQpIDAKICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFNURVAgJHN0ZXBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiMgICAgICBpZiB7JHZhcnMoZW5hYmxlX3Fvcl9jaGVjayl9IHsKIyAgICAgICAgIHNldCBxb3IgW2NhdGNoIHtleGVjICRjaGVja19xb3IgJGVudihWUEFUSCkvJGxhc3Rfc3RlcH0gbXNnXQojICAgICAgICAgaWYgeyRxb3J9IHsKIyAgICAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IFFPUiBSRVNVTFQgQ0hFQ0sgSU5ESUNBVEVTIEEgUFJPQkxFTSBJTiBTVEVQICRsYXN0X3N0ZXAiCiMgICAgICAgICAgICBleGl0IC0xMTEKIyAgICAgICAgIH0KIyAgICAgIH0KICAgICAgc2V0IHVwZGF0ZV9zZXR1cCAwCiAgICAgIHNldCB1cGRhdGVfaG9sZCAwCgogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHN0ZXAsYWN0aXZlX3NldHVwX3ZpZXdzKV0gJiYgKFtsbGVuZ3RoICR2YXJzKCRzdGVwLGFjdGl2ZV9zZXR1cF92aWV3cyldPjApfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgc2V0dXBfYW5hbHlzaXNfdmlld3MgXCIkdmFycygkc3RlcCxhY3RpdmVfc2V0dXBfdmlld3MpXCJcbiIKICAgICAgICAgc2V0IHVwZGF0ZV9zZXR1cCAxCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRzdGVwLGFjdGl2ZV9ob2xkX3ZpZXdzKV0gJiYgKFtsbGVuZ3RoICR2YXJzKCRzdGVwLGFjdGl2ZV9ob2xkX3ZpZXdzKV0+MCl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldCBob2xkX2FuYWx5c2lzX3ZpZXdzIFwiJHZhcnMoJHN0ZXAsYWN0aXZlX2hvbGRfdmlld3MpXCJcbiIKICAgICAgICAgc2V0IHVwZGF0ZV9ob2xkIDEKICAgICAgfQoKICAgICAgc2V0IGNvbW1lbnRzICIiCiAgICAgIGFwcGVuZCBjb21tZW50cyAiIyBUaGUgYWN0aXZlIGFuYWx5c2lzIHZpZXdzIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOlxuIiAgCiAgICAgIGFwcGVuZCBjb21tZW50cyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKCRzdGVwLGFjdGl2ZV9zZXR1cF92aWV3cylcbiIKICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycygkc3RlcCxhY3RpdmVfaG9sZF92aWV3cylcbiIKICAgICAgYXBwZW5kIGNvbW1lbnRzICIjXG4iCiAgICAgIGFwcGVuZCBjb21tZW50cyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIgogICAgICBpZiB7JHVwZGF0ZV9zZXR1cCB8fCAkdXBkYXRlX2hvbGR9IHsKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgPEZGPiBVUERBVElORyBBTkFMWVNJUyBWSUVXUyAuLi5cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIH0KICAgICAgICAgaWYgeyEkdXBkYXRlX3NldHVwICYmICR1cGRhdGVfaG9sZH0gewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9hbmFseXNpc192aWV3IC1zZXR1cCBcW2FsbF9zZXR1cF9hbmFseXNpc192aWV3c1xdIC1ob2xkIFxbbGlzdCBcJGhvbGRfYW5hbHlzaXNfdmlld3NcXVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2FuYWx5c2lzX3ZpZXcgLXNldHVwIFxbYWxsX3NldHVwX2FuYWx5c2lzX3ZpZXdzXF0gLWhvbGQgXCRob2xkX2FuYWx5c2lzX3ZpZXdzXG4iCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR1cGRhdGVfc2V0dXAgJiYgISR1cGRhdGVfaG9sZH0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2FuYWx5c2lzX3ZpZXcgLXNldHVwIFwkc2V0dXBfYW5hbHlzaXNfdmlld3MgLWhvbGQgXFthbGxfaG9sZF9hbmFseXNpc192aWV3c1xdXG4iCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR1cGRhdGVfc2V0dXAgJiYgJHVwZGF0ZV9ob2xkfSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2FuYWx5c2lzX3ZpZXcgLXNldHVwIFxbbGlzdCBcJHNldHVwX2FuYWx5c2lzX3ZpZXdzXF0gLWhvbGQgXFtsaXN0IFwkaG9sZF9hbmFseXNpc192aWV3c1xdXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfYW5hbHlzaXNfdmlldyAtc2V0dXAgXCRzZXR1cF9hbmFseXNpc192aWV3cyAtaG9sZCBcJGhvbGRfYW5hbHlzaXNfdmlld3NcbiIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1lbnRzCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiJGNvbW1hbmRcbiIKICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgc2V0X2FuYWx5c2lzX3ZpZXcgLXNldHVwIFwkdmFycygkc3RlcCxhY3RpdmVfc2V0dXBfdmlld3MpIC1ob2xkIFwkdmFycygkc3RlcCxhY3RpdmVfaG9sZF92aWV3cylcbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWVudHMKICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQ2hlY2sgaWYgaW4gdG9wIGxldmVsIHBhcnRpdGlvbiAoaWxtKSBmbG93CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIEZGX0VESTo6Y2hlY2tfZmxvdwoKIyAgICAgIGlmIHskdmFycyhyZXBvcnRfcnVuX3RpbWUpfSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCRzdGVwLHN0YXJ0X3RpbWUpIFxbY2xvY2sgc2Vjb25kc1xdXG4iCiMgICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCB0aGUgcmVjb21tZW5kZWQgY29tbWFuZCBtb2RlIHNldHRpbmdzIGZvciBzdGVwCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBERUZJTklORyBNT0RFIFNFVFRJTkdTXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKCiAgICAgIHNldCBjb21tZW50cyAiIgogICAgICBzZXQgdWNvbW1lbnRzICIiCgogICAgICBzd2l0Y2ggJHN0ZXAgewoKICAgICAgICAgInBsYWNlIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgcGxhY2VtZW50IG9wdGlvbnMgLi4uCiAgICAgICAgICAgICMgLSBTZXQgb3B0aW1pemF0aW9uIG9wdGlvbnMgaWYgaW5QbGFjZU9wdCBpcyBlbmFibGVkCiAgICAgICAgICAgICMgLSBMb2FkIHRoZSBDVFMgc3BlYyBmb3IgY2xvY2sgZ2F0ZSBhd2FyZSBwbGFjZW1lbnQKICAgICAgICAgICAgIyAtIFBsYWNlIEpUQUcgY2VsbHMgaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMF0KICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzIFtsaW5kZXggW0ZGX0VESTo6c2V0X2Rlc2lnbl9tb2RlXSAxXQogICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzIFtsaW5kZXggW0ZGX0VESTo6c2V0X2Rlc2lnbl9tb2RlXSAyXQoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICAgICAgICBpZiB7KCR2YXJzKGVuYWJsZV9vY3YpID09ICJwcmVfcGxhY2UiKSB8fCAoKCR2YXJzKGVuYWJsZV9vY3YpID09ICJwcmVfcHJlY3RzIikgJiYgKCR2YXJzKHBsYWNlX29wdF9kZXNpZ24pIHx8ICR2YXJzKHByZXJvdXRlX29wdF9kZXNpZ24pKSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLWFuYWx5c2lzVHlwZSBvbkNoaXBWYXJpYXRpb24gIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2FvY3YpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItYW9jdiB0cnVlICIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLXNvY3YgdHJ1ZSAiCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpIFwiJHZhcnMoZW5hYmxlX29jdilcIlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldEFuYWx5c2lzTW9kZSAkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcHJlY3RzLHNldF9hbmFseXNpc19tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfcGxhY2UifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKVxuIgogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVsYXlDYWxNb2RlIC1lbmdpbmUgc2lnbmFsU3Rvcm1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBsYWNlLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9wbGFjZVwiXG4iCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldCBhcmdzICIiCiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNvbmdlc3Rpb25fZWZmb3J0KX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCAkYXJnIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNvbmdlc3Rpb25fZWZmb3J0KVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjb25nZXN0aW9uX2VmZm9ydCkgXCJhdXRvIGxvdyBtZWRpdW0gaGlnaFwiXG4iCiAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19nYXRlX2F3YXJlKV0gJiYgICR2YXJzKGNsb2NrX2dhdGVfYXdhcmUpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfYXdhcmUpXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIgojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjbG9ja19nYXRlX2F3YXJlKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZSlcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZSkgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhwbGFjZV9pb19waW5zKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocGxhY2VfaW9fcGlucylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocGxhY2VfaW9fcGlucykgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgfQojICAgICAgICAgICAgc2V0IHByb2Nlc3MgW3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXQojICAgICAgICAgICAgaWYge1tleHByICRwcm9jZXNzIDwgMjhdICYmIFtpbmZvIGV4aXN0cyB2YXJzKGZpbGxlcl9jZWxscyxtaW5fZ2FwKV19IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZmlsbGVyX2NlbGxzLG1pbl9nYXApXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1maWxsZXJHYXBNaW5HYXAgJHZhcnMoZmlsbGVyX2NlbGxzLG1pbl9nYXApIC1maWxsZXJHYXBFZmZvcnQgaGlnaFxuIgojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGZpbGxlcl9jZWxscyxtaW5fZ2FwKSBcIjxtaWNyb25zPlwiXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaWxsZXJfY2VsbHMsZ2FwX2VmZm9ydCkgXCI8bG93IG1lZGl1bSBoaWdoPiBcIlxuIgojICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBsYWNlLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXQgYXJncyAiIgojICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoc2l6ZV9vbmx5X2ZpbGUpfV19IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoc2l6ZV9vbmx5X2ZpbGUpXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1zaXplT25seUZpbGUgJGFyZyIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzaXplX29ubHlfZmlsZSkgXCI8ZmlsZT5cIlxuIgojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKGluX3BsYWNlX29wdCldICYmICR2YXJzKGluX3BsYWNlX29wdCkpIHx8ICR2YXJzKHBsYWNlX29wdF9kZXNpZ24pfSB7CiAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHNpemVfb25seV9maWxlKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoc2l6ZV9vbmx5X2ZpbGUpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXNpemVPbmx5RmlsZSAkYXJnIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzaXplX29ubHlfZmlsZSkgXCI8ZmlsZT5cIlxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoaW5fcGxhY2Vfb3B0KVxuIgojICAgICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTd9IHsKICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMocHJlc2VydmVfYXNzZXJ0aW9ucyl9XX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHByZXNlcnZlX2Fzc2VydGlvbnMpXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXByZXNlcnZlQXNzZXJ0aW9ucyAkYXJnIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhwcmVzZXJ2ZV9hc3NlcnRpb25zKSBcInRydWVcIlxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMobGVha2FnZV9wb3dlcl9lZmZvcnQpfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhsZWFrYWdlX3Bvd2VyX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtbGVha2FnZVBvd2VyRWZmb3J0ICRhcmciCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGxlYWthZ2VfcG93ZXJfZWZmb3J0KSBcImxvdyBvciBoaWdoXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhkeW5hbWljX3Bvd2VyX2VmZm9ydCl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGR5bmFtaWNfcG93ZXJfZWZmb3J0KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1keW5hbWljUG93ZXJFZmZvcnQgJGFyZyIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZHluYW1pY19wb3dlcl9lZmZvcnQpIFwibG93IG9yIGhpZ2hcIlxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNsb2NrX2dhdGVfYXdhcmVfb3B0KX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZV9vcHQpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWNsa0dhdGVBd2FyZSAkYXJnIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbG9ja19nYXRlX2F3YXJlX29wdCkgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjcml0aWNhbF9yYW5nZSl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNyaXRpY2FsX3JhbmdlKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1jcml0aWNhbFJhbmdlICRhcmciCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFsbF9lbmRfcG9pbnRzKV0gJiYgJHZhcnMoYWxsX2VuZF9wb2ludHMpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoYWxsX2VuZF9wb2ludHMpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWFsbEVuZFBvaW50cyB0cnVlIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhhbGxfZW5kX3BvaW50cykgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhmaXhfZmFub3V0X2xvYWQpfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmaXhfZmFub3V0X2xvYWQpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWZpeEZhbm91dExvYWQgJGFyZyIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZml4X2Zhbm91dF9sb2FkKSBcIjxmaWxlPlwiXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh1c2VmdWxfc2tldyl9XX0gewogICAgICAgICAgICAgICAgIGlmIHskdmFycyhjY29wdF9lZmZvcnQpID09ICJsb3cifSB7IAogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHVzZWZ1bF9za2V3KVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC11c2VmdWxTa2V3ICRhcmciCiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh1c2VmdWxfc2tldykgJiYgIVtjYXRjaCB7c2V0IGFyZyAkdmFycyhza2V3X2J1ZmZlcnMpfV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhza2V3X2J1ZmZlcnMpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRVc2VmdWxTa2V3TW9kZSAtZGVsYXlQcmVDVFMgdHJ1ZSAtdXNlQ2VsbHMgXFtsaXN0ICRhcmdcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcHJlY3RzLHNldF91c2VmdWxfc2tld19tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IFZhcmlhYmxlIHZhcnModXNlZnVsX3NrZXcpIGlnbm9yZWQgd2hlbiB2YXJzKGNjb3B0X2VmZm9ydCkgaXMgJHZhcnMoY2NvcHRfZWZmb3J0KVxuIgogICAgICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKHVzZWZ1bF9za2V3KSBpZ25vcmVkIHdoZW4gdmFycyhjY29wdF9lZmZvcnQpIGlzICR2YXJzKGNjb3B0X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHVzZWZ1bF9za2V3KSBcInRydWVcIlxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHNrZXdfYnVmZmVycykgXCI8bGlzdCBvZiBidWZmZXJzPlwiXG4iCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0T3B0TW9kZSAkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcGxhY2Usc2V0X29wdF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgojICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6YWRkX3RpZV9jZWxscyB0cnVlIGZhbHNlXQojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBsYWNlLGFkZF90aWVfY2VsbHMgJGNvbW1hbmRdCgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX3NwZWMpXX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiY2xlYW51cFNwZWNpZnlDbG9ja1RyZWVcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBsYWNlLGNsZWFudXBfc3BlY2lmeV9jbG9ja190cmVlICRjb21tYW5kXQogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBmb3JlYWNoIHNwZWMgJHZhcnMoY3RzX3NwZWMpIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlDbG9ja1RyZWUgLWZpbGUgJHNwZWNcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcGxhY2Usc3BlY2lmeV9jbG9ja190cmVlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoanRhZ19jZWxscyldICYmCiAgICAgICAgICAgICAgICBbaW5mbyBleGlzdHMgdmFycyhqdGFnX3Jvd3MpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGp0YWdfY2VsbHMpLCB2YXJzKGp0YWdfcm93cylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBQTEFDSU5HIEpUQUcgQ0VMTFNcbiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgZm9yZWFjaCBpbnN0ICR2YXJzKGp0YWdfY2VsbHMpIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlKdGFnIC1pbnN0ICRpbnN0XG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBsYWNlLHNwZWNpZnlfanRhZyAkY29tbWFuZF0KICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInBsYWNlSnRhZyAtbnJSb3cgJHZhcnMoanRhZ19yb3dzKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcGxhY2UscGxhY2VfanRhZyAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAicHJlY3RzIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgb3B0aW1pemF0aW9uIG9wdGlvbnMgLi4uCiAgICAgICAgICAgICMgRW5hYmxlIHNpZ25hbFN0b3JtIGlmIHJlcXVlc3RlZCAocmVxdWlyZWQgZm9yIEVDU00vQ0NTIGZsb3dzKQogICAgICAgICAgICAjIEZvciBsb3cgcG93ZXIgZmxvd3MsIG1ha2Ugc3VyZSBhbHdheXMtb24gYnVmZmVycyBhcmUgZW5hYmxlZAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW2xpbmRleCBbRkZfRURJOjpzZXRfZGVzaWduX21vZGVdIDBdCiAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMV0KICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMl0KCiAgICAgICAgICAgIHNldCBhcmdzICIiIAogICAgICAgICAgICBpZiB7JHZhcnMoZmxvdykgPT0gIm1tbWMifSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfb2N2KSA9PSAicHJlX3ByZWN0cyJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLWFuYWx5c2lzVHlwZSBvbkNoaXBWYXJpYXRpb24gIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2FvY3YpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItYW9jdiB0cnVlICIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLXNvY3YgdHJ1ZSAiCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpIFwicHJlX3ByZWN0c1wiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0QW5hbHlzaXNNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwcmVjdHMsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2dhdGVfY2xvbmUpXSAmJiAkdmFycyhjbG9ja19nYXRlX2Nsb25lKX0gewogICAgICAgICAgICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0pfSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikifSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBwdG4gW2ZpbGUgdGFpbCBbcHdkXV0KICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwdG4sY3RzX3NwZWMpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhjdHNfc3BlYykgJHZhcnMoJHB0bixjdHNfc3BlYykKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgCiAgICAgICAgICAgICAgIHNldCBzY29tbWFuZCAiIgogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX3NwZWMpXX0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiY2xlYW51cFNwZWNpZnlDbG9ja1RyZWVcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHByZWN0cyxjbGVhbnVwX3NwZWNpZnlfY2xvY2tfdHJlZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgZm9yZWFjaCBzcGVjICR2YXJzKGN0c19zcGVjKSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzY29tbWFuZCAic3BlY2lmeUNsb2NrVHJlZSAtZmlsZSAkc3BlY1xuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVDbG9ja1RyZWVTcGVjXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwcmVjdHMsY3JlYXRlX2Nsb2NrX3RyZWVfc3BlYyAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c19jZWxscyldfSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHNjb21tYW5kICJzcGVjaWZ5Q2xvY2tUcmVlIC11cGRhdGUgXCJBdXRvQ1RTUm9vdFBpbiAqIEJ1ZmZlciAkdmFycyhjdHNfY2VsbHMpXCJcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhyb3V0ZV9jbG9ja19uZXRzKV0gJiYgJHZhcnMocm91dGVfY2xvY2tfbmV0cyl9IHsKICAgICAgICAgICAgICAgICBhcHBlbmQgc2NvbW1hbmQgInNwZWNpZnlDbG9ja1RyZWUgLXVwZGF0ZSBcIkF1dG9DVFNSb290UGluICogUm91dGVDbGtOZXQgWUVTXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7ISR2YXJzKGlsbSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHByZWN0cyxzcGVjaWZ5X2Nsb2NrX3RyZWUgJHNjb21tYW5kXQogICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGN0c19zcGVjKV19IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2xvY2tEZXNpZ24gLWdlblNwZWNPbmx5IFxbcGlkXF0uY3RzdGNoXG4iCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNwZWNpZnlDbG9ja1RyZWUgLWZpbGUgXFtwaWRcXS5jdHN0Y2hcbiIKIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICBmb3JlYWNoIHNwZWMgJHZhcnMoY3RzX3NwZWMpIHsKIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic3BlY2lmeUNsb2NrVHJlZSAtZmlsZSAkc3BlY1xuIgojICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxN30gewogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhwcmVzZXJ2ZV9hc3NlcnRpb25zKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocHJlc2VydmVfYXNzZXJ0aW9ucylcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtcHJlc2VydmVBc3NlcnRpb25zICRhcmciCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHByZXNlcnZlX2Fzc2VydGlvbnMpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhsZWFrYWdlX3Bvd2VyX2VmZm9ydCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGxlYWthZ2VfcG93ZXJfZWZmb3J0KVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1sZWFrYWdlUG93ZXJFZmZvcnQgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMobGVha2FnZV9wb3dlcl9lZmZvcnQpIFwibG93IG9yIGhpZ2hcIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGR5bmFtaWNfcG93ZXJfZWZmb3J0KX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZHluYW1pY19wb3dlcl9lZmZvcnQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWR5bmFtaWNQb3dlckVmZm9ydCAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhkeW5hbWljX3Bvd2VyX2VmZm9ydCkgXCJsb3cgb3IgaGlnaFwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY2xvY2tfZ2F0ZV9hd2FyZV9vcHQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbG9ja19nYXRlX2F3YXJlX29wdClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtY2xrR2F0ZUF3YXJlICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfYXdhcmVfb3B0KSBcInRydWVcIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNyaXRpY2FsX3JhbmdlKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3JpdGljYWxfcmFuZ2UpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWNyaXRpY2FsUmFuZ2UgJGFyZyIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoYWxsX2VuZF9wb2ludHMpXSAmJiAkdmFycyhhbGxfZW5kX3BvaW50cyl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhhbGxfZW5kX3BvaW50cylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtYWxsRW5kUG9pbnRzIHRydWUiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGFsbF9lbmRfcG9pbnRzKSBcInRydWVcIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHNpemVfb25seV9maWxlKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoc2l6ZV9vbmx5X2ZpbGUpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXNpemVPbmx5RmlsZSAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzaXplX29ubHlfZmlsZSkgXCI8ZmlsZT5cIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGZpeF9mYW5vdXRfbG9hZCl9XX0gewogICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2Zhbm91dF9sb2FkKVxuIgogICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWZpeEZhbm91dExvYWQgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaXhfZmFub3V0X2xvYWQpIFwiPGZpbGU+XCJcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh1c2VmdWxfc2tldyl9XX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoY2NvcHRfZWZmb3J0KSA9PSAibG93In0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHVzZWZ1bF9za2V3KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC11c2VmdWxTa2V3ICRhcmciCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh1c2VmdWxfc2tldykgJiYgIVtjYXRjaCB7c2V0IGFyZyAkdmFycyhza2V3X2J1ZmZlcnMpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhza2V3X2J1ZmZlcnMpXG4iCiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRVc2VmdWxTa2V3TW9kZSAtZGVsYXlQcmVDVFMgdHJ1ZSAtdXNlQ2VsbHMgXFtsaXN0ICRhcmdcXVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcHJlY3RzLHNldF91c2VmdWxfc2tld19tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IFZhcmlhYmxlIHZhcnModXNlZnVsX3NrZXcpIGlnbm9yZWQgd2hlbiB2YXJzKGNjb3B0X2VmZm9ydCkgaXMgJHZhcnMoY2NvcHRfZWZmb3J0KVxuIgogICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKHVzZWZ1bF9za2V3KSBpZ25vcmVkIHdoZW4gdmFycyhjY29wdF9lZmZvcnQpIGlzICR2YXJzKGNjb3B0X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnModXNlZnVsX3NrZXcpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHNrZXdfYnVmZmVycykgXCI8bGlzdCBvZiBidWZmZXJzPlwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd119IHsKICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMocmVzaXplX3NoaWZ0ZXJfYW5kX2lzb19pbnN0cyl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHJlc2l6ZV9zaGlmdGVyX2FuZF9pc29faW5zdHMpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXJlc2l6ZVNoaWZ0ZXJBbmRJc29JbnN0cyAkYXJnIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRPcHRNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwcmVjdHMsc2V0X29wdF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NzKSA9PSAicHJlX3ByZWN0cyJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpXG4iCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZWxheUNhbE1vZGUgLWVuZ2luZSBzaWduYWxTdG9ybVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcHJlY3RzLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9wcmVjdHNcIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhhbHdheXNfb25fYnVmZmVycyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoYWx3YXlzX29uX2J1ZmZlcnMpXG4iCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggYnVmZmVyICR2YXJzKGFsd2F5c19vbl9idWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXREb250VXNlICRidWZmZXIgZmFsc2VcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGZvcmVhY2ggZG9tYWluIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIsYWx3YXlzX29uX2J1ZmZlcnMiXSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLGFsd2F5c19vbl9idWZmZXJzKV19IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBidWZmZXIgJHZhcnMoJGRvbWFpbixhbHdheXNfb25fYnVmZmVycykgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0RG9udFVzZSAkYnVmZmVyIGZhbHNlXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcHJlY3RzLHNldF9kb250X3VzZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgICJjdHMiIHsKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNldCBDVFMgb3B0aW9ucyAuLi4gdGhpcyBpbmNsdWRlcyBuYW5vcm91dGUgb3B0aW9ucyBhcyB0aGUgY2xvY2sKICAgICAgICAgICAgIyBuZXQgaXMgdHlwaWNhbGx5IHJvdXRlZCBkdXJpbmcgQ1RTLiBGb3IgaGllcmFyY2hpY2FsIGZsb3dzLCB0aGUKICAgICAgICAgICAgIyBjbG9jayB0cmVlIHNwZWMgaXMgZGVmaW5lZCBwZXIgcGFydGl0aW9uIC4KICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtsaW5kZXggW0ZGX0VESTo6c2V0X2Rlc2lnbl9tb2RlXSAwXQogICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgW2xpbmRleCBbRkZfRURJOjpzZXRfZGVzaWduX21vZGVdIDFdCiAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgW2xpbmRleCBbRkZfRURJOjpzZXRfZGVzaWduX21vZGVdIDJdCgogICAgICAgICAgICBzZXQgYXJncyAiIiAKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9vY3YpID09ICJwcmVfY3RzIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItYW5hbHlzaXNUeXBlIG9uQ2hpcFZhcmlhdGlvbiAiCiAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfYW9jdil9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1hb2N2IHRydWUgIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NvY3YpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItc29jdiB0cnVlICIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJwcmVfY3RzXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0QW5hbHlzaXNNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldCBhcmdzICIiIAogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2NwcHIpICE9ICJmYWxzZSJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfY3BwcilcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1jcHByICR2YXJzKGVuYWJsZV9jcHByKSAiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0QW5hbHlzaXNNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRDVFNNb2RlICIKICAgICAgICAgICAgaWYgeyR2YXJzKGN0c19lbmdpbmUpID09ICJjdHMifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3RzX2VuZ2luZSlcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtZW5naW5lIGNrIgogICAgICAgICAgICB9IAogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhyb3V0ZV9jbG9ja19uZXRzKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocm91dGVfY2xvY2tfbmV0cylcbiIKICAgICAgICAgICAgICAgaWYgeyEkdmFycyhyb3V0ZV9jbG9ja19uZXRzKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1yb3V0ZUNsa05ldCAkYXJnIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHJvdXRlX2Nsb2NrX25ldHMpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX3RvcF9sYXllcildICYmICR2YXJzKGNsa190cmVlX3RvcF9sYXllcikgIT0ge319IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV90b3BfbGF5ZXIpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJvdXRlVG9wUHJlZmVycmVkTGF5ZXIgJHZhcnMoY2xrX3RyZWVfdG9wX2xheWVyKSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfdG9wX2xheWVyKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbGtfbGVhZl90b3BfbGF5ZXIpXSAmJiAkdmFycyhjbGtfbGVhZl90b3BfbGF5ZXIpICE9IHt9fSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfdG9wX2xheWVyKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1yb3V0ZUxlYWZUb3BQcmVmZXJyZWRMYXllciAkdmFycyhjbGtfbGVhZl90b3BfbGF5ZXIpIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbGtfbGVhZl90b3BfbGF5ZXIpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX2JvdHRvbV9sYXllcildICYmICR2YXJzKGNsa190cmVlX2JvdHRvbV9sYXllcikgIT0ge319IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV9ib3R0b21fbGF5ZXIpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJvdXRlQm90dG9tUHJlZmVycmVkTGF5ZXIgJHZhcnMoY2xrX3RyZWVfYm90dG9tX2xheWVyKSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfYm90dG9tX2xheWVyKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbGtfbGVhZl9ib3R0b21fbGF5ZXIpXSAmJiAkdmFycyhjbGtfbGVhZl9ib3R0b21fbGF5ZXIpICE9IHt9fSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfYm90dG9tX2xheWVyKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1yb3V0ZUxlYWZCb3R0b21QcmVmZXJyZWRMYXllciAkdmFycyhjbGtfbGVhZl9ib3R0b21fbGF5ZXIpIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbGtfbGVhZl9ib3R0b21fbGF5ZXIpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX25kcildICYmICR2YXJzKGNsa190cmVlX25kcikgIT0ge319IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV9uZHIpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJvdXRlTm9uRGVmYXVsdFJ1bGUgJHZhcnMoY2xrX3RyZWVfbmRyKSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfbmRyKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbGtfdHJlZV9leHRyYV9zcGFjZSldICYmICR2YXJzKGNsa190cmVlX2V4dHJhX3NwYWNlKSAhPSB7fX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsa190cmVlX2V4dHJhX3NwYWNlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1yb3V0ZVByZWZlcnJlZEV4dHJhU3BhY2UgJHZhcnMoY2xrX3RyZWVfZXh0cmFfc3BhY2UpIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbGtfdHJlZV9leHRyYV9zcGFjZSlcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX2xlYWZfbmRyKV0gJiYgJHZhcnMoY2xrX2xlYWZfbmRyKSAhPSB7fX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsa19sZWFmX25kcilcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcm91dGVMZWFmTm9uRGVmYXVsdFJ1bGUgJHZhcnMoY2xrX2xlYWZfbmRyKSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfbmRyKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbGtfbGVhZl9leHRyYV9zcGFjZSldICYmICR2YXJzKGNsa19sZWFmX2V4dHJhX3NwYWNlKSAhPSB7fX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsa19sZWFmX2V4dHJhX3NwYWNlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1yb3V0ZUxlYWZQcmVmZXJyZWRFeHRyYVNwYWNlICR2YXJzKGNsa19sZWFmX2V4dHJhX3NwYWNlKSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2xrX2xlYWZfZXh0cmFfc3BhY2UpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRjb21tYW5kICE9ICJzZXRDVFNNb2RlICJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLHNldF9jdHNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBpZiB7W3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXSAhPSAiY3RzIn0gewojICAgICAgICAgICAgICAgRkZfRURJOjphc3NpZ25fY3RzX2NlbGxzCiMgICAgICAgICAgICAgICBmb3JlYWNoIGNvcm5lciAkdmFycyhyY19jb3JuZXJzKSB7CiMgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNvcm5lcixhdGZfZmlsZSldfSB7CiMgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInVwZGF0ZV9jY29wdF9yY19jb3JuZXIgLW5hbWUgJGNvcm5lciAtYXRmICR2YXJzKCRjb3JuZXIsYXRmX2ZpbGUpXG4iCiMgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7JGNvbW1hbmQgIT0gIiJ9IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsdXBkYXRlX2Njb3B0X3JjX2Nvcm5lciAkY29tbWFuZF0KIyAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9jY29wdF9tb2RlICIKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNjb3B0X2ludGVncmF0aW9uKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjY29wdF9pbnRlZ3JhdGlvbilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtaW50ZWdyYXRpb24gXCIkdmFycyhjY29wdF9pbnRlZ3JhdGlvbilcIiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2NvcHRfaW50ZWdyYXRpb24pXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c19pbnZlcnRlcl9jZWxscyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3RzX2ludmVydGVyX2NlbGxzKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1jdHNfaW52ZXJ0ZXJfY2VsbHMgXCIkdmFycyhjdHNfaW52ZXJ0ZXJfY2VsbHMpXCIiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGN0c19pbnZlcnRlcl9jZWxscylcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX2J1ZmZlcl9jZWxscyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3RzX2J1ZmZlcl9jZWxscylcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtY3RzX2J1ZmZlcl9jZWxscyBcIiR2YXJzKGN0c19idWZmZXJfY2VsbHMpXCIiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGN0c19idWZmZXJfY2VsbHMpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2dhdGVfY2VsbHMpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNsb2NrX2dhdGVfY2VsbHMpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWN0c19jbG9ja19nYXRpbmdfY2VsbHMgXCIkdmFycyhjbG9ja19nYXRlX2NlbGxzKVwiIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjbG9ja19nYXRlX2NlbGxzKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfdXNlX2ludmVydGVycyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3RzX3VzZV9pbnZlcnRlcnMpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWN0c191c2VfaW52ZXJ0ZXJzIFtzdHJpbmcgdG9sb3dlciAkdmFycyhjdHNfdXNlX2ludmVydGVycyldIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjdHNfdXNlX2ludmVydGVycylcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModXBkYXRlX2lvX2xhdGVuY3kpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHVwZGF0ZV9pb19sYXRlbmN5KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1jY29wdF9tb2RpZnlfY2xvY2tfbGF0ZW5jeSAkdmFycyh1cGRhdGVfaW9fbGF0ZW5jeSkiICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHVwZGF0ZV9pb19sYXRlbmN5KVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfaW9fb3B0KV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjdHNfaW9fb3B0KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pb19vcHQgW3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19pb19vcHQpXSIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY3RzX2lvX29wdClcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2NvcHRfZWZmb3J0KV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjY29wdF9lZmZvcnQpXG4iCiMgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoY2NvcHRfZWZmb3J0KSAhPSAibG93In0gewojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtZWZmb3J0ICR2YXJzKGNjb3B0X2VmZm9ydCkiCiMgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNjb3B0X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX3RhcmdldF9za2V3KV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjdHNfdGFyZ2V0X3NrZXcpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWN0c190YXJnZXRfc2tldyAkdmFycyhjdHNfdGFyZ2V0X3NrZXcpIiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjdHNfdGFyZ2V0X3NrZXcpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c190YXJnZXRfc2xldyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3RzX3RhcmdldF9zbGV3KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1jdHNfdGFyZ2V0X3NsZXcgJHZhcnMoY3RzX3RhcmdldF9zbGV3KSIgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY3RzX3RhcmdldF9zbGV3KVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwcmVfY2NvcHRfdGNsKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwcmVfY2NvcHRfdGNsKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1wcmVfdGNsIFx7IHNvdXJjZSAkdmFycyhwcmVfY2NvcHRfdGNsKSBcfSIgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocG9zdF9jY29wdF90Y2wpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHBvc3RfY2NvcHRfdGNsKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1wb3N0X3RjbCBceyBzb3VyY2UgJHZhcnMocG9zdF9jY29wdF90Y2wpIFx9IgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjY29wdF9leGVjdXRhYmxlKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjY29wdF9leGVjdXRhYmxlKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1lbnZBZHZhbmNlZEludGVncmF0aW9uTGluayAkdmFycyhjY29wdF9leGVjdXRhYmxlKSIgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2NvcHRfZXhlY3V0YWJsZSlcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX3RyZWVfbmRyKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcm91dGVfdG9wX25vbl9kZWZhdWx0X3J1bGUgJHZhcnMoY2xrX3RyZWVfbmRyKSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xrX3RyZWVfc2hpZWxkX25ldCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xrX3RyZWVfc2hpZWxkX25ldClcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcm91dGVfdG9wX3NoaWVsZGluZ19uZXQgJHZhcnMoY2xrX3RyZWVfc2hpZWxkX25ldCkiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNsa190cmVlX3NoaWVsZF9uZXQpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX3RvcF9sYXllcildfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJvdXRlX3RvcF90b3BfcHJlZmVycmVkX2xheWVyICR2YXJzKGNsa190cmVlX3RvcF9sYXllcikiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsa190cmVlX2JvdHRvbV9sYXllcildfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJvdXRlX3RvcF9ib3R0b21fcHJlZmVycmVkX2xheWVyICR2YXJzKGNsa190cmVlX2JvdHRvbV9sYXllcikiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLHNldF9jY29wdF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBhcmdzICIiCiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKG11bHRpX2N1dF9lZmZvcnQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhtdWx0aV9jdXRfZWZmb3J0KVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1kcm91dGVVc2VNdWx0aUN1dFZpYUVmZm9ydCAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhtdWx0aV9jdXRfZWZmb3J0KVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGxpdGhvX2RyaXZlbl9yb3V0aW5nKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMobGl0aG9fZHJpdmVuX3JvdXRpbmcpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXJvdXRlV2l0aExpdGhvRHJpdmVuICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGxpdGhvX2RyaXZlbl9yb3V0aW5nKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiXG5zZXROYW5vUm91dGVNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsc2V0X25hbm9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0pICYmCiAgICAgICAgICAgICAgICAoW2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtwd2RdXV0gPT0gIiR2YXJzKHBhcnRpdGlvbl9kaXIpIil9IHsKICAgICAgICAgICAgICAgc2V0IHB0biBbZmlsZSB0YWlsIFtwd2RdXQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHB0bixjdHNfc3BlYyldfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGN0c19zcGVjKSAkdmFycygkcHRuLGN0c19zcGVjKQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7JHB0biAhPSAkdmFycyhkZXNpZ24pfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfc3BlYyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0IHZhcnMoY3RzX3NwZWMpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgICJwb3N0Y3RzIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBPcHRpb25hbGx5IGVuYWJsZSBjcHByLCBzaWduYWxTdG9ybSwgYW5kIG9uQ2hpcFZhcmlhdGlvbiAoaWYKICAgICAgICAgICAgIyBNTU1DKQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW2xpbmRleCBbRkZfRURJOjpzZXRfZGVzaWduX21vZGVdIDBdCiAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMV0KICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMl0KCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfcG9zdGN0cyJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpXG4iCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZWxheUNhbE1vZGUgLWVuZ2luZSBzaWduYWxTdG9ybVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0cyxzZXRfZGVsYXlfY2FsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcykgXCJwcmVfcG9zdGN0c1wiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGFyZ3MgIiIgCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfY3BwcikgIT0gImZhbHNlIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLWNwcHIgJHZhcnMoZW5hYmxlX2NwcHIpICIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX29jdikgPT0gInByZV9wb3N0Y3RzIn0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItYW5hbHlzaXNUeXBlIG9uQ2hpcFZhcmlhdGlvbiAiCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfYW9jdil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1hb2N2IHRydWUgIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NvY3YpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItc29jdiB0cnVlICIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJwcmVfcG9zdGN0c1wiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0QW5hbHlzaXNNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0Y3RzLHNldF9hbmFseXNpc19tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX3NwZWMpXX0gewogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjbG9ja19nYXRlX2Nsb25lKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY2xvY2tfZ2F0ZV9jbG9uZSlcbiIKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldE9wdE1vZGUgLXBvc3RDdHNDbGtHYXRlQ2xvbmluZyAkYXJnXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0Y3RzLHNldF9vcHRfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgICJwb3N0Y3RzX2hvbGQiIHsKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNldCBob2xkIGZpeGluZyBvcHRpb25zIC4uLgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW2xpbmRleCBbRkZfRURJOjpzZXRfZGVzaWduX21vZGVdIDBdCiAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMV0KICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMl0KCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWxheV9jZWxscyldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVsYXlfY2VsbHMpXG4iCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGZvcmVhY2ggZGVsYXlfY2VsbCAkdmFycyhkZWxheV9jZWxscykgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0RG9udFVzZSAkZGVsYXlfY2VsbCBmYWxzZVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0c19ob2xkLHNldF9kb250X3VzZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhkZWxheV9jZWxscylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhmaXhfaG9sZF9hbGxvd190bnNfZGVncmFkYXRpb24pfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmaXhfaG9sZF9hbGxvd190bnNfZGVncmFkYXRpb24pXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWZpeEhvbGRBbGxvd1NldHVwVG5zRGVncmFkZSAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmaXhfaG9sZF9hbGxvd190bnNfZGVncmFkYXRpb24pXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGZpeF9ob2xkX2lnbm9yZV9pb3MpfSB7CiAgICAgICAgICAgICAgICNhcHBlbmQgY29tbWFuZHMgInNldEFuYWx5c2lzTW9kZSAtaG9ub3JDbG9ja0RvbWFpbnMgdHJ1ZVxuIiAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKVxuIgojICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtaWdub3JlUGF0aEdyb3Vwc0ZvckhvbGQge2luMnJlZyByZWcyb3V0IGluMm91dH0iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWlnbm9yZVBhdGhHcm91cHNGb3JIb2xkIHtkZWZhdWx0fSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfaWdub3JlX2lvcylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldE9wdE1vZGUgJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHNfaG9sZCxzZXRfb3B0X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgInJvdXRlIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgcm91dGluZyBvcHRpb25zICAuLi4KICAgICAgICAgICAgIyBSZWNvbW1lbmRhdGlvbnMgZm9yIG11bHRpY3V0IHZpYSBpbnNlcnRpb24gYW5kIGxpdGhvIGRyaXZlbgogICAgICAgICAgICAjIHJvdXRpbmcuICBUaGVzZSBhbGwgaW5jdXIgcnVudGltZSBwZW5hbHRpZXMgYnV0IGhhdmUgeWllbGQKICAgICAgICAgICAgIyBhZHZhbnRhZ2VzIHNvIGFyZSBpbmNsdWRlZCBoZXJlLiBUaGUgcm91dGVXaXRoTGl0aG9Ecml2ZW4gb3B0aW9uCiAgICAgICAgICAgICMgaXMgcmVjb21tZW5kZWQgZm9yIDQ1bm0gYnV0IG1heSBhbHNvIGJlIHVzZWQgYXQgNjVubS4gVGhlCiAgICAgICAgICAgICMgLWRyb3V0ZVVzZU11bHRpQ3V0VmlhRWZmb3J0IGNhbiBiZSBzZXQgdG8gaGlnaCBpZiBuZWVkZWQ7CiAgICAgICAgICAgICMgZXhwZWN0IGFuIGF2ZXJhZ2Ugb2YgNSUgY292ZXJhZ2UgaW1wcm92ZW1lbnQgd2l0aCBhbiBhdmVyYWdlIDEwJQogICAgICAgICAgICAjIHJ1bnRpbWUgaGl0IHZlcnN1cyBtZWRpdW0KICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgaWYgeygkdmFycyhlbmFibGVfY3BwcikgIT0gImZhbHNlIikgfHwgJHZhcnModHJhY2tfb3B0KX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRyYWNrX29wdClcbiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldEFuYWx5c2lzTW9kZSAtY3BwciBib3RoXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByb3V0ZSxzZXRfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnModHJhY2tfb3B0KVxuIgogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NpX2F3YXJlKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVsYXlDYWxNb2RlIC1zaUF3YXJlIHRydWUgLWVuZ2luZSBhYWVcbiAiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zaV9hd2FyZSlcbiIKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zcykgPT0gInByZV9wb3N0cm91dGUifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IFZhcmlhYmxlIHZhcnMoZW5hYmxlX3NzKSBpZ25vcmVkIHdoZW4gdmFycyhlbmFibGVfc2lfYXdhcmUpIGlzIHNldFxuIgogICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJWYXJpYWJsZSB2YXJzKGVuYWJsZV9zcykgaWdub3JlZCB3aGVuIHZhcnMoZW5hYmxlX3NpX2F3YXJlKSBpcyBzZXRcbiIKICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NpX2F3YXJlKVxuIgogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NzKSA9PSAicHJlX3Bvc3Ryb3V0ZSJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpXG4iCiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZWxheUNhbE1vZGUgLWVuZ2luZSBzaWduYWxTdG9ybSAtc2lnbm9mZiB0cnVlIC1zaUF3YXJlIGZhbHNlXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVsYXlDYWxNb2RlIC1zaUF3YXJlIGZhbHNlXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpIFwicHJlX3Bvc3Ryb3V0ZVwiXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhtdWx0aV9jdXRfZWZmb3J0KX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMobXVsdGlfY3V0X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtZHJvdXRlVXNlTXVsdGlDdXRWaWFFZmZvcnQgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMobXVsdGlfY3V0X2VmZm9ydClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhsaXRob19kcml2ZW5fcm91dGluZyl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGxpdGhvX2RyaXZlbl9yb3V0aW5nKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1yb3V0ZVdpdGhMaXRob0RyaXZlbiAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhsaXRob19kcml2ZW5fcm91dGluZylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhhbnRlbm5hX2Rpb2RlKX1dfSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhhbnRlbm5hX2Rpb2RlKSAhPSAiIn0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGFudGVubmFfZGlvZGUpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXJvdXRlQW50ZW5uYUNlbGxOYW1lICRhcmciCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXJvdXRlSW5zZXJ0QW50ZW5uYURpb2RlIHRydWUiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGFudGVubmFfZGlvZGUpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoYW50ZW5uYV9kaW9kZSlcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIlxuc2V0TmFub1JvdXRlTW9kZSAkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsc2V0X25hbm9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyh0cmFja19vcHQpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnModHJhY2tfb3B0KVxuIgogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RXh0cmFjdFJDTW9kZSAtZW5naW5lIHBvc3RSb3V0ZSIKICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnModHF1YW50dXNfZmlsZSl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRxdWFudHVzX2ZpbGUpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXRRdWFudHVzTW9kZWxGaWxlICRhcmciCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRxdWFudHVzX2ZpbGUpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtZWZmb3J0TGV2ZWwgbWVkaXVtIgogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC10b3RhbF9jX3RoICRhcmciCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJlbGF0aXZlX2NfdGggJGFyZyIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtY291cGxpbmdfY190aCAkYXJnIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGVmVGVjaEZpbGVNYXAgJGFyZyIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsc2V0X2V4dHJhY3RfcmNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAicG9zdHJvdXRlIiB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgZXh0cmFjdGlvbiBlZmZvcnQgZm9yIHBvc3Ryb3V0ZSBvcHRpbWl6YXRpb24KICAgICAgICAgICAgIyBFbmFibGUgc2lnbmFsU3Rvcm0gaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgICAgIHNldCBwcm9jZXNzIFtyZWdzdWIgIm5tIiAkdmFycyhwcm9jZXNzKSAiIl0KICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwcm9jZXNzKVxuIgogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgICAgaWYgeyFbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVzaWduTW9kZSAtcHJvY2VzcyAkcHJvY2VzcyAtZmxvd0VmZm9ydCBoaWdoXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZXNpZ25Nb2RlIC1wcm9jZXNzICRwcm9jZXNzXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsc2V0X2Rlc2lnbl9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldE9wdE1vZGUgLXVuZml4Q2xrSW5zdEZvck9wdCB0cnVlXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXByb2Nlc3MgJHByb2Nlc3NcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtsaW5kZXggW0ZGX0VESTo6c2V0X2Rlc2lnbl9tb2RlXSAwXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgW2xpbmRleCBbRkZfRURJOjpzZXRfZGVzaWduX21vZGVdIDFdCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgW2xpbmRleCBbRkZfRURJOjpzZXRfZGVzaWduX21vZGVdIDJdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRFeHRyYWN0UkNNb2RlIC1lbmdpbmUgcG9zdFJvdXRlIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWVmZm9ydExldmVsICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC10b3RhbF9jX3RoICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJlbGF0aXZlX2NfdGggJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtY291cGxpbmdfY190aCAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGVmVGVjaEZpbGVNYXAgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsc2V0X2V4dHJhY3RfcmNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgIAoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeygkdmFycyhlbmFibGVfb2N2KSA9PSAicHJlX3Bvc3Ryb3V0ZSIpIHx8ICgkdmFycyhlbmFibGVfb2N2KSA9PSAicHJlX3Bvc3RjdHMiKX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoZmxvdykgIT0gImRlZmF1bHQifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1hbmFseXNpc1R5cGUgb25DaGlwVmFyaWF0aW9uICIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2FvY3YpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItYW9jdiB0cnVlICIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLXNvY3YgdHJ1ZSAiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpIFwicHJlX3Bvc3Ryb3V0ZVwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2NwcHIpICE9ICJmYWxzZSJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfY3BwcilcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1jcHByICR2YXJzKGVuYWJsZV9jcHByKSAiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0QW5hbHlzaXNNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGUsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHtbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NzKSA9PSAicHJlX3Bvc3Ryb3V0ZSJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc3MpXG4iCiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZWxheUNhbE1vZGUgLWVuZ2luZSBzaWduYWxTdG9ybSAtc2lnbm9mZiB0cnVlICIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSxzZXRfZGVsYXlfY2FsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcykgXCJwcmVfcG9zdHJvdXRlXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zaV9hd2FyZSl9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlbGF5Q2FsTW9kZSAtc2lBd2FyZSB0cnVlIC1lbmdpbmUgYWFlXG4gIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc2lfYXdhcmUpXG4iCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfcG9zdHJvdXRlIn0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgPEZGPiBWYXJpYWJsZSB2YXJzKGVuYWJsZV9zcykgaWdub3JlZCB3aGVuIHZhcnMoZW5hYmxlX3NpX2F3YXJlKSBpcyBzZXRcbiIKICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiVmFyaWFibGUgdmFycyhlbmFibGVfc3MpIGlnbm9yZWQgd2hlbiB2YXJzKGVuYWJsZV9zaV9hd2FyZSkgaXMgc2V0XG4iCiAgICAgICAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zaV9hd2FyZSlcbiIKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zcykgPT0gInByZV9wb3N0cm91dGUifSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKVxuIgogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVsYXlDYWxNb2RlIC1lbmdpbmUgc2lnbmFsU3Rvcm0gLXNpZ25vZmYgdHJ1ZSAtc2lBd2FyZSBmYWxzZVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlbGF5Q2FsTW9kZSAtc2lBd2FyZSBmYWxzZVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9wb3N0cm91dGVcIlxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAicG9zdHJvdXRlX2hvbGQiIHsKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNldCBob2xkIGZpeGluZyBvcHRpb25zIC4uLgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW2xpbmRleCBbRkZfRURJOjpzZXRfZGVzaWduX21vZGVdIDBdCiAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMV0KICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMl0KCiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRFeHRyYWN0UkNNb2RlIC1lbmdpbmUgcG9zdFJvdXRlIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWVmZm9ydExldmVsICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC10b3RhbF9jX3RoICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJlbGF0aXZlX2NfdGggJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtY291cGxpbmdfY190aCAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGVmVGVjaEZpbGVNYXAgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCxzZXRfZXh0cmFjdF9yY19tb2RlICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAiIiAKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlbGF5X2NlbGxzKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhkZWxheV9jZWxscylcbiIKICAgICAgICAgICAgICAgZm9yZWFjaCBkZWxheV9jZWxsICR2YXJzKGRlbGF5X2NlbGxzKSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXREb250VXNlICRkZWxheV9jZWxsIGZhbHNlXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZGVsYXlfY2VsbHMpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRjb21tYW5kICE9ICIifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCxzZXRfZG9udF91c2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1maXhIb2xkQWxsb3dTZXR1cFRuc0RlZ3JhZGUgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKX0gewogICAgICAgICAgICAgICAjYXBwZW5kIGNvbW1hbmRzICJzZXRBbmFseXNpc01vZGUgLWhvbm9yQ2xvY2tEb21haW5zIHRydWVcbiIgCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfaWdub3JlX2lvcylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWlnbm9yZVBhdGhHcm91cHNGb3JIb2xkIHtpbjJyZWcgcmVnMm91dCBpbjJvdXR9IgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1pZ25vcmVQYXRoR3JvdXBzRm9ySG9sZCB7ZGVmYXVsdH0iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGZpeF9ob2xkX2lnbm9yZV9pb3MpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRPcHRNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCxzZXRfb3B0X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgInBvc3Ryb3V0ZV9zaSIgewogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU2V0IG5vaXNlLCBleHRyYWN0aW9uLCBhbmQgU0kgb3B0aW9ucyAuLi4KICAgICAgICAgICAgIyBFbmFibGUgc2lnbmFsU3Rvcm0gaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICMgRW5hYmxlIG9uQ2hpcFZhcmlhdGlvbiAoaWYgTU1NQykKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgc2V0IHByb2Nlc3MgW3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXQogICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHByb2Nlc3MpXG4iCiAgICAgICAgICAgIGlmIHskdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KVxuIgogICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIjkuMSIgJHZhcnModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZXNpZ25Nb2RlIC1wcm9jZXNzICRwcm9jZXNzIC1mbG93RWZmb3J0IGhpZ2hcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXByb2Nlc3MgJHByb2Nlc3NcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVzaWduTW9kZSAtcHJvY2VzcyAkcHJvY2Vzc1xuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2ksc2V0X2Rlc2lnbl9tb2RlICRjb21tYW5kXQoKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldEV4dHJhY3RSQ01vZGUgLWNvdXBsZWQgdHJ1ZSIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnModG90YWxfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyh0b3RhbF9jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtdG90YWxfY190aCAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyh0b3RhbF9jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhyZWxhdGl2ZV9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1yZWxhdGl2ZV9jX3RoICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNvdXBsaW5nX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY291cGxpbmdfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWNvdXBsaW5nX2NfdGggJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY291cGxpbmdfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMocXJjX2xheWVyX21hcCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHFyY19sYXllcl9tYXApXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWxlZlRlY2hGaWxlTWFwICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHFyY19sYXllcl9tYXApXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX3NpLHNldF9leHRyYWN0X3JjX21vZGUgJGNvbW1hbmRdCgogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhkZWx0YV9kZWxheV90aHJlc2hvbGQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhkZWx0YV9kZWxheV90aHJlc2hvbGQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWRlbHRhRGVsYXlUaHJlc2hvbGQgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNlbHRpY19zZXR0aW5ncyl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNlbHRpY19zZXR0aW5ncylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtaW5zQ2VsdElDUHJlVGNsIFwiJGFyZ1wiIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjZWx0aWNfc2V0dGluZ3MpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoc2lfYW5hbHlzaXNfdHlwZSl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWFuYWx5c2lzVHlwZSAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzaV9hbmFseXNpc190eXBlKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpICYmIFtyZWdleHAgIjkuMSIgJHZhcnModmVyc2lvbildfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtYWNjZXB0YWJsZVdOUyAwIgogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoYWNjZXB0YWJsZV93bnMpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1hY2NlcHRhYmxlV05TICR2YXJzKGFjY2VwdGFibGVfd25zKSIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFNJTW9kZSAkYXJnc1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX3NpLHNldF9zaV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX29jdikgPT0gInByZV9wb3N0cm91dGVfc2kifSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhmbG93KSAhPSAiZGVmYXVsdCJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLWFuYWx5c2lzVHlwZSBvbkNoaXBWYXJpYXRpb24gIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfYW9jdil9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1hb2N2IHRydWUgIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NvY3YpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICItc29jdiB0cnVlICIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJwcmVfcG9zdHJvdXRlX3NpXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfY3BwcikgIT0gImZhbHNlIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLWNwcHIgJHZhcnMoZW5hYmxlX2NwcHIpICIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRBbmFseXNpc01vZGUgJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaSxzZXRfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zcykgPT0gInByZV9wb3N0cm91dGVfc2kifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKVxuIgogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVsYXlDYWxNb2RlIC1lbmdpbmUgc2lnbmFsU3Rvcm1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaSxzZXRfZGVsYXlfY2FsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcykgXCJwcmVfcG9zdHJvdXRlX3NpXCJcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICAicG9zdHJvdXRlX3NpX2hvbGQiIHsKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNldCBob2xkIGZpeGluZyBvcHRpb25zIC4uLgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBzZXQgcHJvY2VzcyBbcmVnc3ViICJubSIgJHZhcnMocHJvY2VzcykgIiJdCiAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocHJvY2VzcylcbiIKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTV9IHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydCl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpXG4iCiAgICAgICAgICAgICAgICAgIGlmIHshW3JlZ2V4cCAiOS4xIiAkdmFycyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXByb2Nlc3MgJHByb2Nlc3MgLWZsb3dFZmZvcnQgaGlnaFxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVzaWduTW9kZSAtcHJvY2VzcyAkcHJvY2Vzc1xuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZXNpZ25Nb2RlIC1wcm9jZXNzICRwcm9jZXNzXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgdG9sb3dlciAkdmFycyhmbG93X2VmZm9ydCldICE9ICJzdGFuZGFyZCJ9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXByb2Nlc3MgJHByb2Nlc3MgLWZsb3dFZmZvcnQgW3N0cmluZyB0b2xvd2VyICR2YXJzKGZsb3dfZWZmb3J0KV1cbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmbG93X2VmZm9ydClcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXByb2Nlc3MgJHByb2Nlc3NcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2lfaG9sZCxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCgogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVsYXlfY2VsbHMpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGRlbGF5X2NlbGxzKVxuIgogICAgICAgICAgICAgICBmb3JlYWNoIGRlbGF5X2NlbGwgJHZhcnMoZGVsYXlfY2VsbHMpIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldERvbnRVc2UgJGRlbGF5X2NlbGwgZmFsc2VcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhkZWxheV9jZWxscylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGNvbW1hbmQgIT0gIiJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaV9ob2xkLHNldF9kb250X3VzZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1maXhIb2xkQWxsb3dTZXR1cFRuc0RlZ3JhZGUgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfYWxsb3dfdG5zX2RlZ3JhZGF0aW9uKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhmaXhfaG9sZF9pZ25vcmVfaW9zKX0gewogICAgICAgICAgICAgICAjYXBwZW5kIGNvbW1hbmRzICJzZXRBbmFseXNpc01vZGUgLWhvbm9yQ2xvY2tEb21haW5zIHRydWVcbiIgCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZml4X2hvbGRfaWdub3JlX2lvcylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWlnbm9yZVBhdGhHcm91cHNGb3JIb2xkIHtpbjJyZWcgcmVnMm91dCBpbjJvdXR9IgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1pZ25vcmVQYXRoR3JvdXBzRm9ySG9sZCB7ZGVmYXVsdH0iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGZpeF9ob2xkX2lnbm9yZV9pb3MpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRPcHRNb2RlICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2lfaG9sZCxzZXRfb3B0X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgbm9pc2UsIGV4dHJhY3Rpb24sIGFuZCBTSSBvcHRpb25zIC4uLgogICAgICAgICAgICAjIEVuYWJsZSBzaWduYWxTdG9ybSBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgIyBFbmFibGUgb25DaGlwVmFyaWF0aW9uIChpZiBNTU1DKQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RXh0cmFjdFJDTW9kZSAtY291cGxlZCB0cnVlIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC10b3RhbF9jX3RoICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJlbGF0aXZlX2NfdGggJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtY291cGxpbmdfY190aCAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGVmVGVjaEZpbGVNYXAgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2lfaG9sZCxzZXRfZXh0cmFjdF9yY19tb2RlICRjb21tYW5kXQoKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1kZWx0YURlbGF5VGhyZXNob2xkICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGRlbHRhX2RlbGF5X3RocmVzaG9sZClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhjZWx0aWNfc2V0dGluZ3MpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjZWx0aWNfc2V0dGluZ3MpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWluc0NlbHRJQ1ByZVRjbCBcIiRhcmdcIiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY2VsdGljX3NldHRpbmdzKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHNpX2FuYWx5c2lzX3R5cGUpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhzaV9hbmFseXNpc190eXBlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1hbmFseXNpc1R5cGUgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoc2lfYW5hbHlzaXNfdHlwZSlcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KSAmJiBbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWFjY2VwdGFibGVXTlMgMCIKICAgICAgICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFjY2VwdGFibGVfd25zKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtYWNjZXB0YWJsZVdOUyAkdmFycyhhY2NlcHRhYmxlX3ducykiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRTSU1vZGUgJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaV9ob2xkLHNldF9zaV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfcG9zdHJvdXRlX3NpIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcylcbiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlbGF5Q2FsTW9kZSAtZW5naW5lIHNpZ25hbFN0b3JtXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2lfaG9sZCxzZXRfZGVsYXlfY2FsX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcykgXCJwcmVfcG9zdHJvdXRlX3NpXCJcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX29jdikgPT0gInByZV9wb3N0cm91dGVfc2kifSAgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpXG4iCiAgICAgICAgICAgICAgIGlmIHskdmFycyhmbG93KSAhPSAiZGVmYXVsdCJ9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldEFuYWx5c2lzTW9kZSAtYW5hbHlzaXNUeXBlIG9uQ2hpcFZhcmlhdGlvblxuIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2FvY3YpfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItYW9jdiB0cnVlICIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zb2N2KX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXNvY3YgdHJ1ZSAiCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2lfaG9sZCxzZXRfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KSBcInByZV9wb3N0cm91dGVfc2lcIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdikgXCJ0cnVlXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgInNpZ25vZmYiIHsKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIEZvciB0aGUgZGVmYXVsdCBmbG93LCBzd2l0Y2ggdG8gTU1NQyBmb3IgZmluYWwgU1RBIHRvIHN1cHBvcnQKICAgICAgICAgICAgIyBtdWx0aXBsZSBSQyBjb3JuZXJzLiAgQWxzbywgZW5hYmxlIENDRSAoc2lnbm9mZikgZXh0cmFjdGlvbiBpZgogICAgICAgICAgICAjIHRoZSBRUkMgdGVjaGZpbGUgZXhpc3RzCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJkZWZhdWx0In0gewogICAgICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IFVQREFUSU5HIFRJTUlORyBFTlZJUk9OTUVOVCIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHByb2Nlc3MgW3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXQogICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHByb2Nlc3MpXG4iCiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZXNpZ25Nb2RlIC1wcm9jZXNzICRwcm9jZXNzXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHNldF9kZXNpZ25fbW9kZSAkY29tbWFuZF0KCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgbm9pc2UsIGV4dHJhY3Rpb24sIGFuZCBTSSBvcHRpb25zIC4uLgogICAgICAgICAgICAjIEVuYWJsZSBzaWduYWxTdG9ybSBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgIyBFbmFibGUgb25DaGlwVmFyaWF0aW9uIChpZiBNTU1DKQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RXh0cmFjdFJDTW9kZSAtY291cGxlZCB0cnVlIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhzaWdub2ZmX2V4dHJhY3Rpb25fZWZmb3J0KX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoc2lnbm9mZl9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtZWZmb3J0TGV2ZWwgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtZWZmb3J0TGV2ZWwgaGlnaCIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC10b3RhbF9jX3RoICRhcmciCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJlbGF0aXZlX2NfdGggJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtY291cGxpbmdfY190aCAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGVmVGVjaEZpbGVNYXAgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHNldF9leHRyYWN0X3JjX21vZGUgJGNvbW1hbmRdCgogICAgICAgICAgICBzZXQgYXJncyAiIgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhkZWx0YV9kZWxheV90aHJlc2hvbGQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhkZWx0YV9kZWxheV90aHJlc2hvbGQpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWRlbHRhRGVsYXlUaHJlc2hvbGQgJGFyZyIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZGVsdGFfZGVsYXlfdGhyZXNob2xkKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKGNlbHRpY19zZXR0aW5ncyl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNlbHRpY19zZXR0aW5ncylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtaW5zQ2VsdElDUHJlVGNsIFwiJGFyZ1wiIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjZWx0aWNfc2V0dGluZ3MpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoc2lfYW5hbHlzaXNfdHlwZSl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHNpX2FuYWx5c2lzX3R5cGUpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWFuYWx5c2lzVHlwZSAkYXJnIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzaV9hbmFseXNpc190eXBlKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBhcmdzICIiCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfb2N2KSAhPSAiZmFsc2UifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdilcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1hbmFseXNpc1R5cGUgb25DaGlwVmFyaWF0aW9uICIKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9hb2N2KX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLWFvY3YgdHJ1ZSAiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9hb2N2KVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc29jdil9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdilcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1zb2N2IHRydWUgIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfc29jdilcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfb2N2KSBcInByZV9zaWdub2ZmXCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KSBcInRydWVcIlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfY3BwcikgIT0gImZhbHNlIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9jcHByKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiLWNwcHIgJHZhcnMoZW5hYmxlX2NwcHIpICIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2NwcHIpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyRhcmdzICE9ICIifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRBbmFseXNpc01vZGUgJGFyZ3NcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2FuYWx5c2lzX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tyZWdleHAgIjkuMSIgJHZhcnModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfc2lnbm9mZiJ9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlbGF5Q2FsTW9kZSAtZW5naW5lIHNpZ25hbFN0b3JtIC1zaWdub2ZmIHRydWVcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zcylcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9zaWdub2ZmXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zaV9hd2FyZSl9IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NpX2F3YXJlKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1zaUF3YXJlIHRydWUgLWVuZ2luZSBhYWVcbiAiCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfc2lnbm9mZiJ9IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlbGF5Q2FsTW9kZSAtZW5naW5lIHNpZ25hbFN0b3JtIC1zaWdub2ZmIHRydWVcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICI8RkY+IFZhcmlhYmxlIHZhcnMoZW5hYmxlX3NzKSBpZ25vcmVkIHdoZW4gdmFycyhlbmFibGVfc2lfYXdhcmUpIGlzIHNldFxuIgojICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiVmFyaWFibGUgdmFycyhlbmFibGVfc3MpIGlnbm9yZWQgd2hlbiB2YXJzKGVuYWJsZV9zaV9hd2FyZSkgaXMgc2V0XG4iCiMgICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9zaWdub2ZmXCJcbiIKICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zaV9hd2FyZSlcbiIKIyAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfc3MpID09ICJwcmVfc2lnbm9mZiJ9IHsKIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKVxuIgojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1lbmdpbmUgc2lnbmFsU3Rvcm0gLXNpZ25vZmYgdHJ1ZSAiCiMgICAgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NzKSBcInByZV9zaWdub2ZmXCJcbiIKIyAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyR2YXJzKHNraXBfc2lnbm9mZl9jaGVja3MpfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRFeHRyYWN0UkNNb2RlIC1lbmdpbmUgcG9zdFJvdXRlIC1lZmZvcnRMZXZlbCAkdmFycyhzaWdub2ZmX2V4dHJhY3Rpb25fZWZmb3J0KSAtY291cGxlZCB0cnVlXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHNldF9leHRyYWN0X3JjX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoYWN0aXZlX3JjX2Nvcm5lcnMpIFxbbGlzdFxdXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZm9yZWFjaCB2aWV3IFxbY29uY2F0IFxbYWxsX3NldHVwX2FuYWx5c2lzX3ZpZXdzXF0gXFthbGxfaG9sZF9hbmFseXNpc192aWV3c1xdXF0ge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIHNldCBjb3JuZXIgXFtnZXRfZGVsYXlfY29ybmVyIFxbZ2V0X2FuYWx5c2lzX3ZpZXcgXCR2aWV3IC1kZWxheV9jb3JuZXJcXSAtcmNfY29ybmVyXF1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBpZiB7XFtsc2VhcmNoIFwkdmFycyhhY3RpdmVfcmNfY29ybmVycykgXCRjb3JuZXJcXSA9PSAtMSB9IHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICBsYXBwZW5kIHZhcnMoYWN0aXZlX3JjX2Nvcm5lcnMpIFwkY29ybmVyXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgfVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJQdXRzIFwiPEZGPiBBQ1RJVkUgUkMgQ09STkVSIExJU1Q6IFwkdmFycyhhY3RpdmVfcmNfY29ybmVycylcIlxuIgogICAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgZW1wdHlfY29ybmVycyBcW2xpc3RcXVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZvcmVhY2ggY29ybmVyIFwkdmFycyhhY3RpdmVfcmNfY29ybmVycykge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGlmIHshXFtmaWxlIGV4aXN0cyBcW2dldF9yY19jb3JuZXIgXCRjb3JuZXIgLXF4X3RlY2hfZmlsZVxdXF19IHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICBsYXBwZW5kIGVtcHR5X2Nvcm5lcnMgXCRjb3JuZXJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICB9XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2xsZW5ndGggXCRlbXB0eV9jb3JuZXJzXF0gPT0gMH0ge1xuIgogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiICBzZXRFeHRyYWN0UkNNb2RlIC1lbmdpbmUgcG9zdFJvdXRlIC1lZmZvcnRMZXZlbCAkdmFycyhzaWdub2ZmX2V4dHJhY3Rpb25fZWZmb3J0KSAtY291cGxlZCB0cnVlXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHNldF9leHRyYWN0X3JjX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifSBlbHNlIHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICBQdXRzIFwiPEZGPiBDQU4nVCBSVU4gU0lHTk9GRiBFWFRSQUNUSU9OIEJFQ0FVU0UgcXhfdGVjaF9maWxlIElTIE5PVCBERUZJTkVEIEZPUiB0aGVzZSBjb3JuZXJzOiBcJGVtcHR5X2Nvcm5lcnNcIlxuIgogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiICAgICAgc2V0RXh0cmFjdFJDTW9kZSAtZW5naW5lIHBvc3RSb3V0ZSAtZWZmb3J0TGV2ZWwgbG93IC1jb3VwbGVkIHRydWVcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2V0X2V4dHJhY3RfcmNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdWNvbW1lbnRzXX0gewogICAgICAgICBpZiB7JHVjb21tZW50cyA9PSAiIn0gewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModWNvbW1lbnRzKV19IHsKICAgICAgICAgICAgICAgdW5zZXQgdmFycyh1Y29tbWVudHMpCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnModWNvbW1lbnRzKSAkdWNvbW1lbnRzCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1lbnRzXX0gewogICAgICAgICBpZiB7JGNvbW1lbnRzID09ICIifSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjb21tZW50cyldfSB7CiAgICAgICAgICAgICAgIHVuc2V0IHZhcnMoY29tbWVudHMpCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnMoY29tbWVudHMpICRjb21tZW50cyAKICAgICAgICAgfQogICAgICB9CiAgICAgIHNldCB2YXJzKCRzdGVwLGNvbW1hbmRzKSAkY29tbWFuZHMKICAgICAgcmV0dXJuICRjb21tYW5kcwogICB9CgogICBwcm9jIHNhdmVfcmVzdWx0cyB7e3N0ZXAgIiJ9IHtmb3JtYXQgMH19IHsKCiAgICAgIGlmIHtbcmVnZXhwICJec3luIiAkc3RlcF19IHsKICAgICAgICAgcmV0dXJuICIiCiAgICAgIH0KCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhpZXIpXX0gewogICAgICAgICBzZXQgaGllciB0cnVlCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBoaWVyIGZhbHNlCiAgICAgIH0KICAgICAgaWYgeyRzdGVwICE9ICIifSB7CiAgICAgICAgIHNldCB2YXJzKHN0ZXApICRzdGVwCiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhkZWJ1Zyl9IHsKICAgICAgICAgcHV0cyAiPERFQlVHPiBTYXZpbmcgcmVzdWx0cyBmb3IgJHZhcnMoc3RlcCkgLi4uIgogICAgICB9CgogICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgaWYgeyR2YXJzKGJhdGNoKX0gewogICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBTQVZJTkcgUkVTVUxUU1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgfQogICAKIyAgICAgICAgIGlmIHtbcmVnZXhwIF9ob2xkICR2YXJzKHN0ZXApXSAmJiAoIVtsc2VhcmNoICR2YXJzKGZpeF9ob2xkKSAkdmFycyhzdGVwKV0gPDApfSB7CiMgICAKIyAgICAgICAgICAgIGlmIHshJGZvcm1hdH0gewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgaWYgeyR2YXJzKHJlcG9ydF9ydW5fdGltZSl9IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiRkZfRURJOjpyZXBvcnRfdGltZSAkdmFycyhzdGVwKVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQojICAgICAgICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiMgICAgICAgICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0gCgogICAgICAgICBpZiB7JHZhcnMoc3RlcCkgIT0gInBhcnRpdGlvbiJ9IHsKICAgICAgICAgICAgc2V0IGhlYWRlciAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICBhcHBlbmQgaGVhZGVyICIjIDxGRj4gR0VORVJBVElORyBSRVBPUlRTXG4iCiAgICAgICAgICAgIGFwcGVuZCBoZWFkZXIgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgCiAgICAgICAgICAgIGlmIHskdmFycyhyZXBvcnRfcG93ZXIpfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV0gJiYgKCR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVwb3J0X3Bvd2VyIC12aWV3ICR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpIC1vdXRmaWxlICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnBvd2VyLnJwdFxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVwb3J0X3Bvd2VyIC1vdXRmaWxlICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnBvd2VyLnJwdFxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZXBvcnRfcG93ZXIgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgCiAgICAgICAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddICYmIFtpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2RvbWFpbnMpXSAmJiBbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAxfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkaGVhZGVyCiAgICAgICAgICAgICAgIHNldCBoZWFkZXIgIiIKICAgICAgCiAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgIyBWZXJpZnkgcG93ZXIgZG9tYWluCiAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJ2ZXJpZnlQb3dlckRvbWFpbiAtYmluZCAtZ2Nvbm4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWlzb05ldFBEICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmlzb25ldHMucnB0IgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC14TmV0UEQgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkueG5ldHMucnB0XG4iCiAgIAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHN0ZXAsdmVyaWZ5X3Bvd2VyX2RvbWFpbiAkY29tbWFuZF0KICAgICAgCiAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgIyBSdW4gQ0xQCiAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgCiAgICAgICAgICAgICAgIGlmIHskdmFycyhydW5fY2xwKSAmJiAoW2F1dG9fZXhlY29rIGxlY10gIT0gIiIpfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJydW5DTFAgIgogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xwX29wdGlvbnMpXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkdmFycyhjbHBfb3B0aW9ucykKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkc3RlcCxydW5fY2xwICRjb21tYW5kXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNscF93YXJuaW5nKV19IHsKICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBVTkFCTEUgVE8gUlVOIENMUCAuLi4gUExFQVNFIE1BS0UgU1VSRSBJVCBJUyBJTiBZT1VSIFBBVEgiCiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGNscF93YXJuaW5nKSB0cnVlCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIHNldCBtYXAoaW5pdCkgdW5wbGFjZWQKICAgICAgICAgc2V0IG1hcChwYXJ0aXRpb25fcGxhY2UpIHBsYWNlZAogICAgICAgICBzZXQgbWFwKG1vZGVsX2dlbikgcGxhY2VkCiAgICAgICAgIHNldCBtYXAoYXNzaWduX3BpbikgcGxhY2VkCiAgICAgICAgICNzZXQgbWFwKHBhcnRpdGlvbikge30KICAgICAgICAgc2V0IG1hcChwbGFjZSkgcGxhY2VkCiAgICAgICAgIHNldCBtYXAocHJlY3RzKSBwbGFjZWQKICAgICAgICAgc2V0IG1hcChjdHMpIGNsb2NrX3N5bnRoZXNpemVkCiAgICAgICAgIHNldCBtYXAocG9zdGN0cykgY2xvY2tfc3ludGhlc2l6ZWQKICAgICAgICAgc2V0IG1hcChwb3N0Y3RzX2hvbGQpIGNsb2NrX3N5bnRoZXNpemVkCiAgICAgICAgIHNldCBtYXAocm91dGUpIGNsb2NrX3N5bnRoZXNpemVkX3JvdXRlZAogICAgICAgICBzZXQgbWFwKHBvc3Ryb3V0ZSkgY2xvY2tfc3ludGhlc2l6ZWRfcm91dGVkCiAgICAgICAgIHNldCBtYXAocG9zdHJvdXRlX2hvbGQpIGNsb2NrX3N5bnRoZXNpemVkX3JvdXRlZAogICAgICAgICBzZXQgbWFwKHNpZ25vZmYpIGNsb2NrX3N5bnRoZXNpemVkX3JvdXRlZAogICAgICAgICBzZXQgbWFwKGFzc2VtYmxlKSBwbGFjZWRfcm91dGVkCiAgCiAgICAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpICYmICgkdmFycyhzdGVwKSAhPSAiZGVidWciKX0gewogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxM30gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjpwb3Bfc25hcHNob3Rfc3RhY2tcbiIKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTZ9IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBtYXAoJHN0ZXApXX0gewogICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjb21wdXRlX21ldHJpY3MpXSAmJiAkdmFycyhjb21wdXRlX21ldHJpY3MpfSB7CiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKSAtY2F0ZWdvcmllcyBcW2RpY3QgZ2V0IFwkbWV0cmljX2NhdGVnb3J5X3N0YXR1c19tYXAgJG1hcCgkc3RlcClcXVxuIgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKSAtY2F0ZWdvcmllcyBkZXNpZ25cbiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcCkgLWNhdGVnb3JpZXMgZGVzaWduXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcCkgLWNhdGVnb3JpZXMgZGVzaWduXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZXBvcnRfbWV0cmljIC1maWxlICR2YXJzKHJwdF9kaXIpL21ldHJpY3MuaHRtbCAtZm9ybWF0IGh0bWxcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgSE9VU0VLRUVQSU5HXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhtYWlsLHRvKV19IHsKICAgICAgICAgICAgc3dpdGNoICR2YXJzKHN0ZXApIHsKICAgICAgICAgICAgICAgaW5pdCAgICAgeyBzZXQgc3VtbWFyeV9maWxlIHByZXBsYWNlLnN1bW1hcnkgfQogICAgICAgICAgICAgICBhc3NlbWJsZSB7IHNldCBzdW1tYXJ5X2ZpbGUgc2lnbm9mZi5zdW1tYXJ5IH0KICAgICAgICAgICAgICAgZGVmYXVsdCAgeyBzZXQgc3VtbWFyeV9maWxlICR2YXJzKHN0ZXApLnN1bW1hcnkgfQogICAgICAgICAgICB9IAogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG1haWwsc3RlcHMpXSB8fCBcCiAgICAgICAgICAgICAgICAoW2luZm8gZXhpc3RzIHZhcnMobWFpbCxzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhtYWlsLHN0ZXBzKSAkdmFycyhzdGVwKV0gIT0gLTEpKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlB1dHMgXCI8RkY+IE1BSUxJTkcgUkVTVUxUUyBUTyAkdmFycyhtYWlsLHRvKVwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbZmlsZSBleGlzdHMgJHZhcnMocnB0X2RpcikvJHN1bW1hcnlfZmlsZVxdfSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyAvYmluL21haWwgLXMgXCJGRjogJHZhcnMoZGVzaWduKSwgJHZhcnMoc3RlcCkgY29tcGxldGVkIChcW3B3ZFxdKVwiIDwgJHZhcnMocnB0X2RpcikvJHN1bW1hcnlfZmlsZSAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZWlmIHtcW2ZpbGUgZXhpc3RzICR2YXJzKHJwdF9kaXIpLyR7c3VtbWFyeV9maWxlfS5nelxdfSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyBndW56aXAgLWMgJHZhcnMocnB0X2RpcikvJHtzdW1tYXJ5X2ZpbGV9Lmd6IFx8IC9iaW4vbWFpbCAtcyBcIkZGOiAkdmFycyhkZXNpZ24pLCAkdmFycyhzdGVwKSBjb21wbGV0ZWQgKFxbcHdkXF0pXCIgJHZhcnMobWFpbCx0bylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9IGVsc2Uge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGV4ZWMgL2Jpbi9tYWlsIC1zIFwiRkY6ICR2YXJzKGRlc2lnbiksICR2YXJzKHN0ZXApIGNvbXBsZXRlZCAoXFtwd2RcXSlcIiA8IC9kZXYvbnVsbCAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgIAogICAgICAgICBpZiB7KCRzdGVwICE9ICJwYXJ0aXRpb24iKSAmJiAoJHN0ZXAgIT0gInJlYnVkZ2V0IikgJiYgKCRzdGVwICE9ICJmbGV4aWxtIil9IHsKICAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNhdmVfcmMpXSAmJiAkdmFycyhzYXZlX3JjKX0gewogICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicm91dGUiICR2YXJzKHN0ZXApXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1yYyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2F2ZV9jb25zdHJhaW50cyldICYmICR2YXJzKHNhdmVfY29uc3RyYWludHMpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXRjb24iCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCBhcm91bmQgdmFycyhkYnNfZGlyKSB0byByZXNvbHZlIHZhcnMocnVuZGlyKQogICAgICAgICAgICBzZXQgZGlyIFtzdWJzdCAkdmFycyhkYnNfZGlyKV0KICAgICAgICAgICAgc2V0IGRlc2lnbiAkdmFycyhkZXNpZ24pCiAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICAgICAgICAgICBpZiB7JGhpZXJ9IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVEZXNpZ24gJGFyZ3MgLWNlbGx2aWV3IHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkdmFycyhkZXNpZ24pICR2YXJzKHN0ZXApfVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZURlc2lnbiAkYXJncyAtY2VsbHZpZXcgeyR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgJHZhcnMoc3RlcCl9XG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVPYURlc2lnbiAkdmFycyhvYV9kZXNpZ25fbGliKSAkZGVzaWduICR2YXJzKHN0ZXApXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJlbGF0aXZlX3BhdGgpXSAmJiAkdmFycyhyZWxhdGl2ZV9wYXRoKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1yZWxhdGl2ZVBhdGgiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFic29sdXRlX2xpYl9wYXRoKV0gJiYgJHZhcnMoYWJzb2x1dGVfbGliX3BhdGgpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLWFic29sdXRlTGliUGF0aCIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZURlc2lnbiAkYXJncyAkZGlyLyR2YXJzKHN0ZXApLmVuYyAtY29tcHJlc3NcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7ISgoJHZhcnMoc3RlcCkgPT0gIm1vZGVsX2dlbiIpICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKSAmJiAkdmFycyhmbGV4bW9kZWxfYXJ0X2Jhc2VkKSl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICRzdGVwLHNhdmVfZGVzaWduICRjb21tYW5kXQogICAgICAgICAgICAgICBpZiB7JHZhcnMocnVuX2xlYyl9IHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHN0ZXAsc2F2ZV9sZWNfbmV0bGlzdCAic2F2ZU5ldGxpc3QgJHZhcnMoZGJzX2RpcikvTEVDLyRzdGVwLnYuZ3pcbiJdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXX0gewogICAgICAgICAgICBzZXQgZW52KFZQQVRIKSAibWFrZSIKICAgICAgICAgfQoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHsiCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS8kdmFycyhzdGVwKSIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgCiAgIAogICAgICAgICBpZiB7JGZvcm1hdH0gewogICAgICAgICAgICBpZiB7JHZhcnMocmVwb3J0X3J1bl90aW1lKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZmX3Byb2NzOjpyZXBvcnRfdGltZVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE0fSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbZXZhbCBGRjo6Y2FwdHVyZV9tZXRyaWNzXQogICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgCiAgICAgICAgIGlmIHskdmFycyhlbmFibGVfcW9yX2NoZWNrKX0gewojICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRzdGVwLHFvcl90Y2xdfSB7CiMgICAgICAgICAgICAgICBzZXQgcW9yX2ZpbGUgJHZhcnMoJHN0ZXAscW9yX3RjbCkKIyAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHFvcl9maWxlXX0gewojICAgICAgICAgICAgICAgICAgc2V0IHFvciBbY2F0Y2gge2V4ZWMgJHFvcl9maWxlfSBtc2ddCiMgICAgICAgICAgICAgICAgICBzZXQgbWFrZV9maWxlIFtvcGVuICR0aGlzX3NlbWFwaG9yZSB3XQojICAgICAgICAgICAgICAgICAgcHV0cyAkbWFrZV9maWxlICIkcW9yIgojICAgICAgICAgICAgICAgICAgY2xvc2UgJG1ha2VfZmlsZQojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHN0ZXAscW9yX3RjbCldfSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoJHN0ZXAscW9yX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnICR7c3RlcH0scW9yX3RjbF0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICI8RkY+IFdBUk5JTkc6IFFPUiBmaWxlICR2YXJzKCRzdGVwLHFvcl90Y2wpIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHdhcm5pbmdfY291bnQpICJXQVJOSU5HOiBRT1IgZmlsZSAkdmFycygkc3RlcCxxb3JfdGNsKSBkb2VzIG5vdCBleGlzdCIKICAgICAgICAgICAgICAgICAgaW5jciB3YXJuaW5nX2NvdW50CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKG1ha2VmaWxlKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuaWYge1xbaW5mbyBleGlzdHMgZW52KFZQQVRIKVxdfSB7XG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS8ke3N0ZXB9X3FvclxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgZmluYWxfYWx3YXlzX3NvdXJjZV90Y2xdCgogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlB1dHMgXCI8RkY+ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlB1dHMgXCI8RkY+IElORk86IFJ1bm5pbmcgaW4gaW50ZXJhY3RpdmUgbW9kZSAuLi5cIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlB1dHMgXCI8RkY+ICAgICAgIFBsZWFzZSBydW4gJ2ZmX3Byb2NzOjpzYXZlX3Jlc3VsdHMgPGN1cnJlbnRfc3RlcD4nIFwiXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiUHV0cyBcIjxGRj4gICAgICAgdG8gcHJlcGFyZSBhIGRhdGFiYXNlIGZvciB0aGUgbmV4dCBzdGVwXCJcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJQdXRzIFwiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCJcbiIKICAgICAgICAgaWYgeyR2YXJzKG1ha2VmaWxlKX0geyAKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHtcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJleGVjIC9iaW4vdG91Y2ggXCRlbnYoVlBBVEgpLyR2YXJzKHN0ZXApXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQoKICAgfQoKICAgcHJvYyBpbml0aWFsaXplX211bHRpY3B1IHt9IHsKCiAgICAgZ2xvYmFsIHZhcnMKCiAgICAgaWYge1tyZWdleHAgIl5zeW4iICR2YXJzKHN0ZXApXX0geyByZXR1cm4gIiIgfQoKICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgU0VUVElORyBVUCBNVUxUSSBQUk9DRVNTIERJU1RSSUJVVElPTiBBTkQgVEhSRUFESU5HXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkaXN0cmlidXRlX3RpbWVvdXQpXX0gewogICAgICAgICBzZXQgY29tbWFuZCAic2V0RGlzdHJpYnV0ZUhvc3QgLXRpbWVPdXQgJHZhcnMoZGlzdHJpYnV0ZV90aW1lb3V0KSAiCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzZXREaXN0cmlidXRlSG9zdCAiCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkaXN0cmlidXRlKV19IHsKICAgICAgICAgc3dpdGNoICR2YXJzKGRpc3RyaWJ1dGUpIHsKICAgICAgICAgICAgInJzaCIgewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBSVU5OSU5HIFJTSCBvbiAkdmFycyhyc2gsaG9zdF9saXN0KVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXJzaCAtYWRkIFxbbGlzdCAkdmFycyhyc2gsaG9zdF9saXN0KVxdXG4iCiAgICAgICAgICAgICAgIHNldCB2YXJzKHJlbW90ZV9ob3N0cykgW2xsZW5ndGggJHZhcnMocnNoLGhvc3RfbGlzdCldCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICJsb2NhbCIgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLWxvY2FsXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgImN1c3RvbSIgewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBSVU5OSU5HIENVU1RPTSAoJHZhcnMoY3VzdG9tLHNjcmlwdCkpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItY3VzdG9tIC1jdXN0b21fc2NyaXB0IHsgJHZhcnMoY3VzdG9tLHNjcmlwdCkgfVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgICJsc2YiIHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgUlVOTklORyBMU0YgKCR2YXJzKGxzZixxdWV1ZSksICR2YXJzKGxzZixyZXNvdXJjZSksICR2YXJzKGxzZixhcmdzKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLWxzZiAtcXVldWUgJHZhcnMobHNmLHF1ZXVlKSAtcmVzb3VyY2UgeyAkdmFycyhsc2YscmVzb3VyY2UpIH0gLWxzZl9hcmdzIHsgJHZhcnMobHNmLGFyZ3MpIH1cbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZhdWx0IHsKICAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IERJU1RSSUJVVElPTiBUWVBFICR2YXJzKGRpc3RyaWJ1dGUpIE5PVCBTVVBQT1JURURcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGlzdHJpYnV0ZWRfaG9zdHMgJGNvbW1hbmRdCgogICAgICAgICBzZXQgY29tbWFuZCAic2V0TXVsdGlDcHVVc2FnZSAiCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICItbG9jYWxDcHUgJHZhcnMobG9jYWxfY3B1cykgIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXJlbW90ZUhvc3QgJHZhcnMocmVtb3RlX2hvc3RzKSAiCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICItY3B1UGVyUmVtb3RlSG9zdCAkdmFycyhjcHVzX3Blcl9yZW1vdGVfaG9zdClcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9tdWx0aV9jcHVfdXNhZ2UgJGNvbW1hbmRdCgogICAgICB9IGVsc2UgewoKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1sb2NhbFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Rpc3RyaWJ1dGVfaG9zdCAkY29tbWFuZF0KCiAgICAgICAgIHNldCBjb21tYW5kICJzZXRNdWx0aUNwdVVzYWdlIC1sb2NhbENwdSAkdmFycyhsb2NhbF9jcHVzKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X211bHRpX2NwdV91c2FnZSAkY29tbWFuZF0KCiAgICAgIH0KCiAgICAgIHJldHVybiAkY29tbWFuZHMKCiAgIH0KICAgcHJvYyBkZXJhdGVfdGltaW5nICB7e3R5cGUgbWlubWF4fX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKIyAgICAgICAgIHJldHVybiAiIgojICAgICAgfQoKIyAgICAgIGlmIHskdmFycyhlbmFibGVfYW9jdil9IHsKIyAgICAgICAgIHNldCBjb21tYW5kcyAiIgojICAgICAgICAgZm9yZWFjaCBjb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZXNldF90aW1pbmdfZGVyYXRlIC1kZWxheV9jb3JuZXIgJGNvcm5lclxuIgojICAgICAgICAgfSAgIAojICAgICAgICAgcmV0dXJuICRjb21tYW5kcwojICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmRzICJQdXRzIFwiPEZGPiBERVJBVElORyBERUxBWSBDT1JORVJTIC4uLlwiXG4iCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBERVJBVElORyBERUxBWSBDT1JORVJTICgkdHlwZSkgLi4uXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CiAgICAgIHN3aXRjaCAkdHlwZSB7CiAgICAgICAgICJtbW1jIiB7CiAgICAgICAgICAgIHNldCBmb3VuZF9jb3JuZXIgMAogICAgICAgICAgICBmb3JlYWNoIGNvcm5lciAkdmFycyhkZWxheV9jb3JuZXJzKSB7CiAgICAgICAgICAgICAgIHNldCBkZXJhdGVfZmlsZSAwCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kKCRjb3JuZXIpICIiCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLGRlcmF0ZV90Y2wpXX0gewogICAgICAgICAgICAgICAgICBzZXQgZGVyYXRlX2ZpbGUgMQogICAgICAgICAgICAgICAgICBpbmNyIGZvdW5kX2Nvcm5lciAxCiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoJGNvcm5lcixkZXJhdGVfdGNsKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYgeyRjb21tYW5kKCRjb3JuZXIpID09ICIifSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kKCRjb3JuZXIpIFtGRjo6c291cmNlX3BsdWcgIiRjb3JuZXIsZGVyYXRlX3RjbCJdCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHshJGRlcmF0ZV9maWxlfSB7CiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggb2JqZWN0ICJjZWxsIG5ldCIgewogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG1vZGUgImVhcmx5IGxhdGUiIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCB0eXBlICJkYXRhIGNsb2NrIiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLCR7dHlwZX1fJHtvYmplY3R9XyR7bW9kZX0pXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCgkY29ybmVyKSAiICAgc2V0X3RpbWluZ19kZXJhdGUgLSR0eXBlIC0ke29iamVjdH1fZGVsYXkgLSRtb2RlIC1kZWxheV9jb3JuZXIgJGNvcm5lciAkdmFycygkY29ybmVyLCR7dHlwZX1fJHtvYmplY3R9XyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBmb3VuZF9jb3JuZXIgMQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLCR7b2JqZWN0fV8ke3R5cGV9XyR7bW9kZX0pXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCgkY29ybmVyKSAiICAgc2V0X3RpbWluZ19kZXJhdGUgLSR0eXBlIC0ke29iamVjdH1fZGVsYXkgLSRtb2RlIC1kZWxheV9jb3JuZXIgJGNvcm5lciAkdmFycygkY29ybmVyLCR7b2JqZWN0fV8ke3R5cGV9XyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBmb3VuZF9jb3JuZXIgMQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb3JuZXIsY2VsbF9jaGVja18ke21vZGV9KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQoJGNvcm5lcikgIiAgIHNldF90aW1pbmdfZGVyYXRlIC1jZWxsX2NoZWNrIC0kbW9kZSAtZGVsYXlfY29ybmVyICRjb3JuZXIgJHZhcnMoJGNvcm5lcixjZWxsX2NoZWNrXyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBmb3VuZF9jb3JuZXIgMQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVyLGNoZWNrX2NlbGxfJHttb2RlfSldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kKCRjb3JuZXIpICIgICBzZXRfdGltaW5nX2RlcmF0ZSAtY2VsbF9jaGVjayAtJG1vZGUgLWRlbGF5X2Nvcm5lciAkY29ybmVyICR2YXJzKCRjb3JuZXIsY2hlY2tfY2VsbF8ke21vZGV9KVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZm91bmRfY29ybmVyIDEKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBUaGVyZSBjYW4gb25seSBiZSBvbmUgaWxtX25vbl9zZGNfZmlsZSwgc28gbmVlZCB0byBjb21iaW5lIHRoZW0gd2l0aCAKICAgICAgICAgICAgIyB0aGUgdGltaW5nIGRlcmF0ZSBjb21tYW5kcyBpZiBib3RoIGV4aXN0cwogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHskZm91bmRfY29ybmVyPjB9IHsKICAgICAgICAgICAgICAgaWYgJHZhcnMoaWxtKSB7CiAgICAgICAgICAgICAgICAgIHNldCBvcCBbb3BlbiAuaWxtX25vbl9zZGNfZmlsZS50Y2wgd10KICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXSAmJiBbZmlsZSBleGlzdHMgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7IAogICAgICAgICAgICAgICAgICAgICBzZXQgZmhyIFtvcGVuICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpIHJdCiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIjIgogICAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiIyBDb250ZW50cyBvZiAkdmFycyhpbG1fbm9uX3NkY19maWxlKSIKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiMiCiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkZmhyIGxpbmVdPj0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICAkbGluZSIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjbG9zZSAkZmhyCiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHNhdmVfaWxtX25vbl9zZGNfZmlsZSkgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSkKICAgICAgICAgICAgICAgICAgICAgdW5zZXQgdmFycyhpbG1fbm9uX3NkY19maWxlKQogICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVyYXRlX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJzb3VyY2UgJHZhcnMoZGVyYXRlX3RjbCkiCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggY29ybmVyICR2YXJzKGRlbGF5X2Nvcm5lcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgJGNvbW1hbmQoJGNvcm5lcikKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGNsb3NlICRvcAogICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJsb2FkVGltaW5nQ29uIC1pbG1Ob25TZGNGaWxlIC5pbG1fbm9uX3NkY19maWxlLnRjbFxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldElsbU5vblNkY0NvbnN0cmFpbnRGaWxlIC5pbG1fbm9uX3NkY19maWxlLnRjbFxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkZXJhdGVfdGNsKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgZGVyYXRlX3RjbF0KICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgYWN0aXZlX2Nvcm5lcnMgXFthbGxfZGVsYXlfY29ybmVyc1xdXG4iCiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggY29ybmVyICR2YXJzKGRlbGF5X2Nvcm5lcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyRjb21tYW5kKCRjb3JuZXIpICE9ICIifSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbbHNlYXJjaCBcJGFjdGl2ZV9jb3JuZXJzICRjb3JuZXJcXSAhPSAtMX0ge1xuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1hbmQoJGNvcm5lcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlcmF0ZV90Y2wpXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBkZXJhdGVfdGNsXQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAibWlubWF4IiB7CgogICAgICAgICAgICBzZXQgY29ybmVycyhtaW4pICR2YXJzKCR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KSxkZWxheV9jb3JuZXIpCiAgICAgICAgICAgIHNldCBjb3JuZXJzKG1heCkgJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpCgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIERlcmF0ZSB0aW1pbmcgaWYgZGVyYXRpbmcgZmFjdG9ycyBhcmUgZGVmaW5lZAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBmb3JlYWNoIG9iamVjdCAiY2VsbCBuZXQiIHsKICAgICAgICAgICAgICAgZm9yZWFjaCBjb3JuZXIgIm1pbiBtYXgiIHsKICAgICAgICAgICAgICAgICAgZm9yZWFjaCB0eXBlICJkYXRhIGNsb2NrIiB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbW9kZSAiZWFybHkgbGF0ZSIgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNvcm5lcnMoJGNvcm5lciksJHt0eXBlfV8ke29iamVjdH1fJHttb2RlfSldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X3RpbWluZ19kZXJhdGUgLSRjb3JuZXIgLSR0eXBlIC0ke29iamVjdH1fZGVsYXkgLSRtb2RlICR2YXJzKCRjb3JuZXJzKCRjb3JuZXIpLCR7dHlwZX1fJHtvYmplY3R9XyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb3JuZXJzKCRjb3JuZXIpLCR7b2JqZWN0fV8ke3R5cGV9XyR7bW9kZX0pXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF90aW1pbmdfZGVyYXRlIC0kY29ybmVyIC0kdHlwZSAtJHtvYmplY3R9X2RlbGF5IC0kbW9kZSAkdmFycygkY29ybmVycygkY29ybmVyKSwke29iamVjdH1fJHt0eXBlfV8ke21vZGV9KVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCBjb3JuZXIgIm1pbiBtYXgiIHsKICAgICAgICAgICAgICAgZm9yZWFjaCBtb2RlICJlYXJseSBsYXRlIiB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29ybmVycygkY29ybmVyKSxjZWxsX2NoZWNrXyR7bW9kZX0pXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF90aW1pbmdfZGVyYXRlIC1jZWxsX2NoZWNrIC0kbW9kZSAkdmFycygkY29ybmVycygkY29ybmVyKSxjZWxsX2NoZWNrXyR7bW9kZX0pXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb3JuZXJzKCRjb3JuZXIpLGNoZWNrX2NlbGxfJHttb2RlfSldfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X3RpbWluZ19kZXJhdGUgLWNlbGxfY2hlY2sgLSRtb2RlICR2YXJzKCRjb3JuZXJzKCRjb3JuZXIpLGNoZWNrX2NlbGxfJHttb2RlfSlcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBkZWZhdWx0IHsKICAgICAgICAgICAgUHV0cyAiPEZGPiBJTlZBTElEIE9QVElPTiAuLi4gTVVTVCBCRSBFSVRIRVIgbWlubWF4IE9SIG1tbWMiCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvdGltaW5nZGVyYXRlLnNkYyB3XQogICAgICAgICBwdXRzICRvcCAkY29tbWFuZHMKICAgICAgICAgY2xvc2UgJG9wCiMgICAgICAgICBzZXQgY29tbWFuZHMgInNvdXJjZSBcJHZhcnMoc2NyaXB0X2RpcikvdGltaW5nZGVyYXRlLnNkY1xuIgogICAgICAgICBzZXQgY29tbWFuZHMgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS90aW1pbmdkZXJhdGUuc2RjXG4iCiAgICAgIH0gCiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgVGhlIGNvZGUgYmVsb3cgdXBkYXRlcyB0aW1pbmcgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGN1cnJlbnQgbW9kdWxlIGlzCiAgICMgLSB0b3AgcGFydGl0aW9uIGluIGEgaGllcmFyY2hpY2FsIGZsb3cKICAgIyAtIHBhcnRpdGlvbiBpbiBhIGhpZXJhcmNoaWNhbCBmbG93CiAgICMgLSBjaGlwIG9yIGJsb2NrIGluIGEgZmxhdCBmbG93CiAgICMgVGltaW5nIGlzIHVwZGF0ZWQgYnkgaW5jcmVtZW50YWxseSBhZGRpbmcgdGhlIHZhcnMoaW5jcl9jdHNfc2RjKSB0byBlYWNoCiAgICMgY29uc3RyYWludCBtb2RlIHRoYXQgaGFzIG9uZSBkZWZpbmVkCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgIHByb2MgdXBkYXRlX3RpbWluZyB7e3R5cGUgbWlubWF4fSB7c3dpdGNoX3RvX3Byb3BhZ2F0ZWQgdHJ1ZX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNvbnN0cmFpbnRfbW9kZXMpXX0gewogICAgICAgICByZXR1cm4KICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmRzICJQdXRzIFwiPEZGPiBVUERBVElORyBUSU1JTkcgLi4uXCJcbiIKCiAgICAgIHNldCBwdG4gW2ZpbGUgdGFpbCBbcHdkXV0KICAgICAgc2V0IHBhcmVudCBbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXQogICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgc2V0IHRvcCBmYWxzZQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXSAmJiAoJHBhcmVudCA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikiKX0gewogICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICRwdG5dICE9IC0xfSB7CiMgICAgICAgICAgICBzZXQgaWxtIGZhbHNlCiAgICAgICAgICAgIHNldCB1cGRhdGUgZmFsc2UKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHRvcCB0cnVlCiAgICAgICAgIH0KICAgICAgfQoKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgSUxNICR2YXJzKGlsbSksIFVQREFURSAkdXBkYXRlXG4iCgogICAgICBpZiB7JHN3aXRjaF90b19wcm9wYWdhdGVkfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IG9wIFxbb3BlbiBwcm9wLnNkYyB3XF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwkb3AgXCJzZXRfcHJvcGFnYXRlZF9jbG9jayBcXFxbYWxsX2Nsb2Nrc1xcXF1cIlxuIgogICAgICAgICBpZiB7JHZhcnMoaWxtKX0gewogICAgICAgICAgICBpZiB7JHZhcnMoZmxhdCkgIT0gIm5vbmUifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpnZXRfY2xvY2tfcG9ydHNdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGNsb2NrX3BvcnRzIFxbRkZfRURJOjpnZXRfY2xvY2tfcG9ydHNcXVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbbGxlbmd0aCBcJGNsb2NrX3BvcnRzXF0gPiAwfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZm9yZWFjaCBwb3J0IFwkY2xvY2tfcG9ydHMge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIHB1dHMgXCRvcCBcInNldF9wcm9wYWdhdGVkX2Nsb2NrIFwkcG9ydFwiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgfVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNsb3NlIFwkb3BcbiIKICAgICAgfQoKICAgICAgc3dpdGNoICR0eXBlIHsKCiAgICAgICAgICJtaW5tYXgiIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGlsbSkgJiYgJHVwZGF0ZX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaW5jcl9jdHNfc2RjKV19IHsKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGluY3JfY3RzX3NkYykgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImxvYWRUaW1pbmdDb24gLWlsbSAtaW5jciAkZmlsZVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3N0X2N0c19zZGMpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidW5sb2FkVGltaW5nQ29uXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAibG9hZFRpbWluZ0NvbiAgW2xpbmRleCAkdmFycyhwb3N0X2N0c19zZGMpIDBdXG4iCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggc2RjIFtscmFuZ2UgJHZhcnMocG9zdF9jdHNfc2RjKSAxIGVuZF0gewogICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAibG9hZFRpbWluZ0NvbiAtaWxtIC1pbmNyICRzZGNcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskc3dpdGNoX3RvX3Byb3BhZ2F0ZWR9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJsb2FkVGltaW5nQ29uIC1pbG0gLWluY3IgcHJvcC5zZGNcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JHVwZGF0ZX0gewogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaW5jcl9jdHNfc2RjKV19IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGluY3JfY3RzX3NkYykgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImxvYWRUaW1pbmdDb24gLWluY3IgJGZpbGVcbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMocG9zdF9jdHNfc2RjKV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bmxvYWRUaW1pbmdDb25cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJsb2FkVGltaW5nQ29uIFtsaW5kZXggJHZhcnMocG9zdF9jdHNfc2RjKSAwXVxuIgogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIHNkYyBbbHJhbmdlICR2YXJzKHBvc3RfY3RzX3NkYykgMSBlbmRdIHsKICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImxvYWRUaW1pbmdDb24gLWluY3IgJHNkY1xuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHN3aXRjaF90b19wcm9wYWdhdGVkfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAibG9hZFRpbWluZ0NvbiAtaW5jciBwcm9wLnNkY1xuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAibW1tYyIgewojICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVwZGF0ZV9pb19sYXRlbmN5KV0gJiYgJHZhcnModXBkYXRlX2lvX2xhdGVuY3kpfSB7CiMgICAgICAgICAgICAgICB1cGRhdGVfaW9fbGF0ZW5jeQojICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHN3aXRjaF90b19wcm9wYWdhdGVkfSB7CiAgICAgICAgICAgICAgIHNldCBwcm9wX3NkYyAicHJvcC5zZGMiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBwcm9wX3NkYyAiIgogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoIG1vZGUgJHZhcnMoY29uc3RyYWludF9tb2RlcykgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2xzZWFyY2ggXFthbGxfY29uc3RyYWludF9tb2Rlc1xdICRtb2RlXF0gIT0gLTF9IHtcbiIKICAgICAgICAgICAgICAgaWYgeyR1cGRhdGV9IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLGluY3JfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoJG1vZGUscG9zdF9jdHNfc2RjX2xpc3QpIFxbY29uY2F0IFxbZ2V0X2NvbnN0cmFpbnRfbW9kZSAkbW9kZSAtaWxtX3NkY19maWxlc1xdICR2YXJzKCRtb2RlLGluY3JfY3RzX3NkYykgJHByb3Bfc2RjXF1cbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkbW9kZSxwb3N0X2N0c19zZGNfbGlzdCkgXFtjb25jYXQgXFtnZXRfY29uc3RyYWludF9tb2RlICRtb2RlIC1zZGNfZmlsZXNcXSAkdmFycygkbW9kZSxpbmNyX2N0c19zZGMpICRwcm9wX3NkY1xdXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IFdBUk5JTkc6IEJPVEggdmFycygkbW9kZSxpbmNyX2N0c19zZGMpIEFORCB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkYykgQVJFIERFRklORUQgLi4uIgogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICAiPEZGPiAgICAgICAgICBVU0lORyB2YXJzKCRtb2RlLGluY3JfY3RzX3NkYykiCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoJG1vZGUscG9zdF9jdHNfc2RjX2xpc3QpIFxbY29uY2F0ICR2YXJzKCRtb2RlLHBvc3RfY3RzX3NkYykgJHByb3Bfc2RjXF1cbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGlsbSl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGN0c19lbmdpbmUpID09ICJjdHMiIHx8ICgkdmFycyhzdGVwKSA9PSAiYXNzZW1ibGUiKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkY19saXN0KSBcW2NvbmNhdCBcW2dldF9jb25zdHJhaW50X21vZGUgJG1vZGUgLWlsbV9zZGNfZmlsZXNcXSAkcHJvcF9zZGNcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoc3RlcCkgIT0gImFzc2VtYmxlIn0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY3RzIiB8fCAoJHZhcnMoc3RlcCkgPT0gImFzc2VtYmxlIil9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkbW9kZSxwb3N0X2N0c19zZGNfbGlzdCkgXFtjb25jYXQgXFtnZXRfY29uc3RyYWludF9tb2RlICRtb2RlIC1zZGNfZmlsZXNcXSAkcHJvcF9zZGNcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoc3RlcCkgIT0gImFzc2VtYmxlIn0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY3RzIn0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkY19saXN0KSBcW2NvbmNhdCBcW2dldF9jb25zdHJhaW50X21vZGUgJG1vZGUgLWlsbV9zZGNfZmlsZXNcXSAkcHJvcF9zZGNcXVxuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXmFzc2VtYmxlIiAkdmFycyhzdGVwKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY3RzIn0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCRtb2RlLHBvc3RfY3RzX3NkY19saXN0KSBcW2NvbmNhdCBcW2dldF9jb25zdHJhaW50X21vZGUgJG1vZGUgLXNkY19maWxlc1xdICRwcm9wX3NkY1xdXG4iCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXmFzc2VtYmxlIiAkdmFycyhzdGVwKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyEkdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHJlc3RvcmUgXFtnZXRfZ2xvYmFsIHRpbWluZ19kZWZlcl9tbW1jX29iamVjdF91cGRhdGVzXF1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZ2xvYmFsIHRpbWluZ19kZWZlcl9tbW1jX29iamVjdF91cGRhdGVzIHRydWVcbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyR2YXJzKGlsbSl9IHsKICAgICAgICAgICAgICAgZXhlYyAvYmluL3RvdWNoIGVtcHR5LnNkYwogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZvcmVhY2ggbW9kZSBcW2FsbF9jb25zdHJhaW50X21vZGVzXF0ge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGlmIHtcW2luZm8gZXhpc3RzIHZhcnMoXCRtb2RlLHBvc3RfY3RzX3NkY19saXN0KVxdfSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSBcJG1vZGUgLWlsbV9zZGNfZmlsZXMgXCR2YXJzKFwkbW9kZSxwb3N0X2N0c19zZGNfbGlzdClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICB9IGVsc2Uge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIGZvcmVhY2ggdmlldyBcW2FsbF9hbmFseXNpc192aWV3c10ge1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgICAgIHNldCBtIFxbcmVnc3ViIF9cJHZpZXcgXCRtb2RlIFwiXCJcXVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgICAgIGlmIHtcW2luZm8gZXhpc3RzIHZhcnMoXCRtLHBvc3RfY3RzX3NkY19saXN0KVxdfSB7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgICAgICAgdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSBcJG1vZGUgLWlsbV9zZGNfZmlsZXMgXCR2YXJzKFwkbSxwb3N0X2N0c19zZGNfbGlzdClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICAgICB9XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgfSBcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICB9IFxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn0gXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZm9yZWFjaCBtb2RlIFxbYWxsX2NvbnN0cmFpbnRfbW9kZXNcXSBce1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGlmIFx7XFtpbmZvIGV4aXN0cyB2YXJzKFwkbW9kZSxwb3N0X2N0c19zZGNfbGlzdClcXVx9IFx7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSBcJG1vZGUgLXNkY19maWxlcyBcJHZhcnMoXCRtb2RlLHBvc3RfY3RzX3NkY19saXN0KVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIFx9IGVsc2UgXHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICBmb3JlYWNoIHZpZXcgXFthbGxfYW5hbHlzaXNfdmlld3NdIFx7XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgICAgc2V0IG0gXFtyZWdzdWIgX1wkdmlldyBcJG1vZGUgXCJcIlxdXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgICAgaWYgXHtcW2luZm8gZXhpc3RzIHZhcnMoXCRtLHBvc3RfY3RzX3NkY19saXN0KVxdXH0gXHtcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICAgICAgICB1cGRhdGVfY29uc3RyYWludF9tb2RlIC1uYW1lIFwkbW9kZSAtc2RjX2ZpbGVzIFwkdmFycyhcJG0scG9zdF9jdHNfc2RjX2xpc3QpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgICAgXH1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICBcfSBcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBcfSBcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcfSBcbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyEkdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2FuYWx5c2lzX3ZpZXcgLXVwZGF0ZV90aW1pbmdcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZ2xvYmFsIHRpbWluZ19kZWZlcl9tbW1jX29iamVjdF91cGRhdGVzIFwkcmVzdG9yZVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aGlzX2luZGV4IFtsc2VhcmNoICR2YXJzKHN0ZXBzKSAkdmFycyhzdGVwKV0KICAgICAgICAgICAgc2V0IHByaW9yIFtsaW5kZXggJHZhcnMoc3RlcHMpIFtleHByICR0aGlzX2luZGV4IC0gMV1dCiAgICAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCBhcm91bmQgdmFycyhkYnNfZGlyKQogICAgICAgICAgICBpZiB7W2ZpbGUgaXNmaWxlIFtzdWJzdCAkdmFycyhkYnNfZGlyKV0vJHByaW9yLmVuYy5kYXQvbW1tYy9wYXRoZ3JvdXAuc2RjXX0gewogICAgICAgICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgYXJvdW5kIHZhcnMoZGJzX2RpcikKICAgICAgICAgICAgICAgc2V0IHZhcnMocGF0aF9ncm91cF9zZGMpIFtzdWJzdCAkdmFycyhkYnNfZGlyKV0vJHByaW9yLmVuYy5kYXQvbW1tYy9wYXRoZ3JvdXAuc2RjCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmZfcHJvY3M6OmxvYWRfcGF0aF9ncm91cHMgJHZhcnMocGF0aF9ncm91cF9zZGMpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBkZWZhdWx0IHsKICAgICAgICAgICAgcHV0cyAkdmFycyhjb2RnZW5fbG9nKSAiPEZGPiBJTlZBTElEIE9QVElPTiAuLi4gTVVTVCBCRSBFSVRIRVIgbWlubWF4IE9SIG1tbWMiCiAgICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCiAgIHByb2MgaW5pdGlhbGl6ZV90aW1pbmcge3t0eXBlIG1tbWN9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBpbml0CiAgICAgIGdsb2JhbCB3YXJuaW5ncwoKICAgICAgc2V0IHZhcnMoZGVsYXlfY29ybmVycykgJHZhcnMoZ29vZF9jb3JuZXJzKQoKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKIyAgICAgICAgIHJldHVybiAiIgojICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIElOSVRJQUxJWklORyBbc3RyaW5nIHRvdXBwZXIgJHR5cGVdIFRJTUlOR1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgaWYgeyR2YXJzKGRlYnVnKX0gewogICAgICAgICAgcHV0cyAiPERFQlVHPiBFeGVjdXRpbmcgcHJvYzogaW5pdGlhbGl6ZV90aW1pbmcgLi4uIgogICAgICB9CgogICAgICBzd2l0Y2ggJHR5cGUgewogICAgICAgICBtaW5tYXggewojICAgICAgICAgICAgaWYgeyhbbGxlbmd0aCAkdmFycyhyY19jb3JuZXJzKV0gPiAxKX0gewojICAgICAgICAgICAgICAgcHV0cyAgIjxGRj4gV0FSTklORzogVEhFIFwiZGVmYXVsdFwiIEZMT1cgU0hPVUxEIE9OTFkgSEFWRSBBIFNJTkdMRSBSQyBDT1JORVIiCiMgICAgICAgICAgICAgICBwdXRzICAiPEZGPiAgICAgICAgICBCVVQgW2xsZW5ndGggJHZhcnMocmNfY29ybmVycyldIENPUk5FUlMgQVJFIERFRklORUQgKCR2YXJzKHJjX2Nvcm5lcnMpKSIKIyAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBEZWZpbmUgUkMgY29ybmVycyBhbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSB0ZW1wZXJhdHVyZXMuICBUaGlzCiAgICAgICAgICAgICMgcmVxdWlyZXMgdGhhdCB0aGUgY2FwIHRhYmxlcyB1c2UgLWJlc3QvLXdvcnN0IHN5bnRheCBpbiB0aGUKICAgICAgICAgICAgIyBjb25maWd1cmF0aW9uIGZpbGUuICBTY2FsaW5nIGZhY3RvcnMgc2hvdWxkIGJlIGRlcml2ZWQgdXNpbmcKICAgICAgICAgICAgIyBPc3RyaWNoIFZhbHVlcyBmb3IgdGhlIGRlZmF1bHQgdGltaW5nIGVudmlyb25tZW50IGlzIGRlcml2ZWQKICAgICAgICAgICAgIyBmcm9tIHRoZSBkZWZhdWx0IHNldHVwIGFuZCBob2xkIGFuYWx5c2lzIHZpZXdzCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgICAgIHNldCBjb3JuZXJzKG1pbikgJHZhcnMoJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpLGRlbGF5X2Nvcm5lcikKICAgICAgICAgICAgc2V0IGNvcm5lcnMobWF4KSAkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcikKICAgICAgICAgICAgc2V0IGNvcm5lciAkdmFycygkY29ybmVycyhtYXgpLHJjX2Nvcm5lcikKCiMgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZW52KEZGX0tJVF9QQVRIKV19IHsKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBtYXggJHZhcnMoJHZhcnMoJGNvcm5lcnMobWF4KSxyY19jb3JuZXIpLFQpfV0gJiYKICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBtaW4gJHZhcnMoJHZhcnMoJGNvcm5lcnMobWluKSxyY19jb3JuZXIpLFQpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFwKICAgICAgICAgICAgICAgICAgImRlZmluZVJDQ29ybmVyIC1sYXRlIHdvcnN0ICRtYXggLWVhcmx5IGJlc3QgJG1pblxuIgogICAgICAgICAgICB9CiMgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgIFB1dHMgIjxGRj4gVVNJTkcgU0lOR0xFIFJDIENPUk5FUiAkdmFycygkY29ybmVycyhtYXgpLHJjX2Nvcm5lcikiCiMgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkY29ybmVycyhtYXgpLHJjX2Nvcm5lciksVCldfSB7CiMgICAgICAgICAgICAgICAgIHNldEV4dHJhY3RSQ01vZGUgLXNjT3BUZW1wICR2YXJzKCR2YXJzKCRjb3JuZXJzKG1heCkscmNfY29ybmVyKSxUKQojICAgICAgICAgICAgICB9CiMgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTZXQgc2NhbGluZyBmYWN0b3JzIC4uLiBmb3IgcHJlLXJvdXRlIG9wdGltaXphdGlvbiwgdGhlIGRldGFpbGVkCiAgICAgICAgICAgICMgY2FwIGZhY3RvciBpcyBzZXQgdG8gdGhlIGRldGFpbGVkIGNsb2NrIGNhcCBmYWN0b3IuICBUaGlzIHdpbGwKICAgICAgICAgICAgIyBiZSByZXNldCBwb3N0LXJvdXRlCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgICAgc2V0IGFyZ3MgIiIKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJGNvcm5lcixwcmVfcm91dGVfcmVzX2ZhY3Rvcil9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1wcmVSb3V0ZV9yZXMgJGFyZyIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkY29ybmVyLHByZV9yb3V0ZV9jYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXByZVJvdXRlX2NhcCAkYXJnIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXByZVJvdXRlX2Nsa3JlcyAkYXJnIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXByZVJvdXRlX2Nsa2NhcCAkYXJnIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscG9zdF9yb3V0ZV9yZXNfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXBvc3RSb3V0ZV9yZXMgIgogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ10gPiAxfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJcIltsaW5kZXggJGFyZyAyXSxbbGluZGV4ICRhcmcgMV0sW2xpbmRleCAkYXJnIDBdXCIiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICRhcmcKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscG9zdF9yb3V0ZV9jYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXBvc3RSb3V0ZV9jYXAgIgogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ10gPiAxfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICJcIltsaW5kZXggJGFyZyAyXSxbbGluZGV4ICRhcmcgMV0sW2xpbmRleCAkYXJnIDBdXCIiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICRhcmcKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjb3JuZXIscG9zdF9yb3V0ZV9jbGtfcmVzX2ZhY3Rvcil9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiIC1wb3N0Um91dGVfY2xrcmVzICIKICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmddID4gMX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiXCJbbGluZGV4ICRhcmcgMl0sW2xpbmRleCAkYXJnIDFdLFtsaW5kZXggJGFyZyAwXVwiIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAkYXJnCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkY29ybmVyLHBvc3Rfcm91dGVfY2xrX2NhcF9mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIiAtcG9zdFJvdXRlX2Nsa2NhcCAiCiAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIlwiW2xpbmRleCAkYXJnIDJdLFtsaW5kZXggJGFyZyAxXSxbbGluZGV4ICRhcmcgMF1cIiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGFyZ3MgJGFyZwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJGNvcm5lcixwb3N0X3JvdXRlX3hjYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBhcmdzICIgLXBvc3RSb3V0ZV94Y2FwICIKICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmddID4gMX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAiXCJbbGluZGV4ICRhcmcgMl0sW2xpbmRleCAkYXJnIDFdLFtsaW5kZXggJGFyZyAwXVwiIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgYXJncyAkYXJnCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGFyZ3MgIT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFJDRmFjdG9yICRhcmdzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcmNfZmFjdG9yICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmRlcmF0ZV90aW1pbmcgbWlubWF4XQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZGVyYXRlX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICBtbW1jIHsKICAgICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgIENSRUFUSU5HIFJDIENPUk5FUlMgLi4uXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggcmMgJHZhcnMocmNfY29ybmVycykgewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBzZXQgbm9uX2NvbW1hbmQgIiIKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyYyxzY2FsZV90Y2wpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiY3JlYXRlX3JjX2Nvcm5lciAtbmFtZSAkcmMiCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1jYXBfdGFibGUgJHZhcnMoJHJjLGNhcF90YWJsZSkgIgogICAgICAgICAgICAgICAgICBmb3JlYWNoIG9wdGlvbiAiY2FwX3RhYmxlIFQgcXhfdGVjaF9maWxlIHF4X2NvbmZfZmlsZSBxeF9saWJfZmlsZSIgewogICAgICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkcmMsJG9wdGlvbil9XX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC0kb3B0aW9uICRhcmciCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kIFtGRjo6c291cmNlX3BsdWcgIiRyYyxzY2FsZV90Y2wiXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiY3JlYXRlX3JjX2Nvcm5lciAtbmFtZSAkcmMiCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uICJjYXBfdGFibGUgVCBxeF90ZWNoX2ZpbGUgcXhfY29uZl9maWxlIHF4X2xpYl9maWxlIiB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYywkb3B0aW9uKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLSRvcHRpb24gJGFyZyIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1jYXBfdGFibGUgJHZhcnMoJHJjLGNhcF90YWJsZSkgIgogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkcmMscHJlX3JvdXRlX3Jlc19mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcHJlUm91dGVfcmVzICRhcmciCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBub25fY29tbWFuZCAiIyAtcHJlUm91dGVfcmVzIFwkdmFycygkcmMscHJlX3JvdXRlX3Jlc19mYWN0b3IpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJHJjLHByZV9yb3V0ZV9jYXBfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXByZVJvdXRlX2NhcCAkYXJnIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbm9uX2NvbW1hbmQgIiMgLXByZVJvdXRlX2NhcCBcJHZhcnMoJHJjLHByZV9yb3V0ZV9jYXBfZmFjdG9yKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYyxwcmVfcm91dGVfY2xrX3Jlc19mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcHJlUm91dGVfY2xrcmVzICRhcmciCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBub25fY29tbWFuZCAiIyAtcHJlUm91dGVfY2xrcmVzIFwkdmFycygkcmMscHJlX3JvdXRlX2Nsa19yZXNfZmFjdG9yKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYyxwcmVfcm91dGVfY2xrX2NhcF9mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcHJlUm91dGVfY2xrY2FwICRhcmciCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBub25fY29tbWFuZCAiIyAtcHJlUm91dGVfY2xrY2FwIFwkdmFycygkcmMscHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYyxwb3N0X3JvdXRlX3Jlc19mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG9zdFJvdXRlX3JlcyAiCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlwiJGFyZ1wiIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkYXJnCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIG5vbl9jb21tYW5kICIjIC1wb3N0Um91dGVfcmVzIFwkdmFycygkcmMscG9zdF9yb3V0ZV9yZXNfZmFjdG9yKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYyxwb3N0X3JvdXRlX2NhcF9mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG9zdFJvdXRlX2NhcCAiCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlwiJGFyZ1wiIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkYXJnCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIG5vbl9jb21tYW5kICIjIC1wb3N0Um91dGVfY2FwIFwkdmFycygkcmMscG9zdF9yb3V0ZV9jYXBfZmFjdG9yKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRyYyxwb3N0X3JvdXRlX2Nsa19yZXNfZmFjdG9yKX1dfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvc3RSb3V0ZV9jbGtyZXMgIgogICAgICAgICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ10gPiAxfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcIiRhcmdcIiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgJGFyZwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBub25fY29tbWFuZCAiIyAtcG9zdFJvdXRlX3JlcyBcJHZhcnMoJHJjLHBvc3Rfcm91dGVfY2xrX3Jlc19mYWN0b3IpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoJHJjLHBvc3Rfcm91dGVfY2xrX2NhcF9mYWN0b3IpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG9zdFJvdXRlX2Nsa2NhcCAiCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlwiJGFyZ1wiIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkYXJnCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIG5vbl9jb21tYW5kICIjIC1wb3N0Um91dGVfY2xrY2FwIFwkdmFycygkcmMscG9zdF9yb3V0ZV9jbGtfY2FwX2ZhY3RvcilcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkcmMscG9zdF9yb3V0ZV94Y2FwX2ZhY3Rvcil9XX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1wb3N0Um91dGVfeGNhcCAiCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJnXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlwiJGFyZ1wiIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkYXJnCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIG5vbl9jb21tYW5kICIjIC1wb3N0Um91dGVfeGNhcCBcJHZhcnMoJHJjLHBvc3Rfcm91dGVfeGNhcF9mYWN0b3IpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjcmVhdGVfcmNfY29ybmVyICRjb21tYW5kXQogICAgICAgICAgICAgICBpZiB7JG5vbl9jb21tYW5kICE9ICIifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgQWRkaXRpb25hbCAodW51c2VkKSBvcHRpb25zIC4uLi5cbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkbm9uX2NvbW1hbmQKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gfHwgKFtpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgISR2YXJzKGNwZl90aW1pbmcpKX0gewogICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICAgICMgQ1BGX1RJTUlORyA9PSBGQUxTRQogICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiI1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyA8RkY+IENSRUFUSU5HIExJQlJBUlkgU0VUUyAuLi5cbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiNcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1hbmQKICAgICAgICAgICAgICAgZm9yZWFjaCBzZXQgJHZhcnMobGlicmFyeV9zZXRzKSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjcmVhdGVfbGlicmFyeV9zZXQgLW5hbWUgJHNldCAtdGltaW5nIFxbbGlzdCAiCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIkdmFycygkc2V0LHRpbWluZykgIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXF1cbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9saWJyYXJ5X3NldCAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMob3Bjb25kcyldfSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiI1xuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyA8RkY+IENSRUFUSU5HIE9QRVJBVElORyBDT05ESVRJT05TIC4uLlxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiI1xuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggb3Bjb25kICR2YXJzKG9wY29uZHMpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNyZWF0ZV9vcF9jb25kIC1uYW1lICRvcGNvbmQiCiAgICAgICAgICAgICAgICAgICAgICMgV2UgYWxyZWFkeSBjaGVja2VkIHNvIHdlIGtub3cgdGhlc2Ugb3B0aW9ucyBleGlzdAogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG9wdGlvbiAibGlicmFyeV9maWxlIFAgViBUIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLSRvcHRpb24gJHZhcnMoJG9wY29uZCwkb3B0aW9uKSIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjcmVhdGVfb3BfY29uZCAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiI1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyA8RkY+IENSRUFUSU5HIERFTEFZIENPUk5FUlMgLi4uXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCiAgICAgICAgICAgICAgIGZvcmVhY2ggYyAkdmFycyhkZWxheV9jb3JuZXJzKSB7CiMgICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCRjLHJjX2Nvcm5lcildfSB7IAojICAgICAgICAgICAgICAgICAgICAgcHV0cyAiU2tpcHBpbmcgZGVsYXkgY29ybmVycyAkYyIKIyAgICAgICAgICAgICAgICAgICAgIFB1dHMgIjxGRj4gRVJST1I6IFJDIGNvcm5lciBmb3IgZGVsYXkgY29ybmVyICRjIG1pc3NpbmciCiMgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAKIyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNyZWF0ZV9kZWxheV9jb3JuZXIgLW5hbWUgJGMiCiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKCRjLGxpYnJhcnlfc2V0KX1dfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWxpYnJhcnlfc2V0ICRhcmciCiAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIHshW2NhdGNoIHtzZXQgZWFybHkgJHZhcnMoJGMsZWFybHlfbGlicmFyeV9zZXQpfV0gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBsYXRlICR2YXJzKCRjLGxhdGVfbGlicmFyeV9zZXQpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtZWFybHlfbGlicmFyeV9zZXQgJGVhcmx5IgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1sYXRlX2xpYnJhcnlfc2V0ICRsYXRlIgogICAgICAgICAgICAgICAgICB9ICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgUHV0cyAiPEZGPiBFUlJPUjogTGlicmFyeSBzZXRzIGZvciBkZWxheSBjb3JuZXIgJGMgbm90IGRlZmluZWQgcHJvcGVybHkiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcmNfY29ybmVyICR2YXJzKCRjLHJjX2Nvcm5lcikiCiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgb3Bjb25kICR2YXJzKCRjLG9wY29uZCl9XSAmJgogICAgICAgICAgICAgICAgICAgICAgIVtjYXRjaCB7c2V0IGxpYnJhcnkgJHZhcnMoJGMsb3Bjb25kX2xpYnJhcnkpfV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtb3Bjb25kX2xpYnJhcnkgJGxpYnJhcnkiCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW9wY29uZCAkb3Bjb25kIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGVhcmx5ICR2YXJzKCRjLGVhcmx5X29wY29uZF9saWJyYXJ5KX1dICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAhW2NhdGNoIHtzZXQgbGF0ZSAkdmFycygkYyxsYXRlX29wY29uZF9saWJyYXJ5KX1dfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWVhcmx5X29wY29uZF9saWJyYXJ5ICRlYXJseSIKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGF0ZV9vcGNvbmRfbGlicmFyeSAkbGF0ZSIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGVhcmx5X29wY29uZCAkdmFycygkYyxlYXJseV9vcGNvbmQpfV0gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBsYXRlX29wY29uZCAkdmFycygkYyxsYXRlX29wY29uZCl9XX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1lYXJseV9vcGNvbmQgJGVhcmx5X29wY29uZCIKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGF0ZV9vcGNvbmQgJGxhdGVfb3Bjb25kIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGRvbWFpbnMgJHZhcnMoJGMscG93ZXJfZG9tYWlucyl9XX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgYXR0cmlidXRlX2xpc3QgImxpYnJhcnlfc2V0IG9wY29uZF9saWJyYXJ5IG9wY29uZCBpcmRyb3BfZmlsZSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZV9saWJyYXJ5X3NldCBlYXJseV9saWJyYXJ5X3NldCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZV9vcGNvbmRfbGlicmFyeSBlYXJseV9vcGNvbmRfbGlicmFyeSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZV9vcGNvbmQgZWFybHlfb3Bjb25kIGxhdGVfaXJkcm9wX2ZpbGUgZWFybHlfaXJkcm9wX2ZpbGUiCiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZG9tYWluICRkb21haW5zIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiB1cGRhdGVfZGVsYXlfY29ybmVyIC1uYW1lICRjIC1wb3dlcl9kb21haW4gXCIkZG9tYWluXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGF0dHIgJGF0dHJpYnV0ZV9saXN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkYywkZG9tYWluLCRhdHRyKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLSRhdHRyICR2YXJzKCRjLCRkb21haW4sJGF0dHIpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgb3Bjb25kICR2YXJzKCRkb21haW4sb3Bjb25kKX1dICYmCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVtjYXRjaCB7c2V0IGxpYnJhcnkgJHZhcnMoJGRvbWFpbixvcGNvbmRfbGlicmFyeSl9XX0gewojICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtb3Bjb25kX2xpYnJhcnkgJGxpYnJhcnkiCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1vcGNvbmQgJG9wY29uZCIKIyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2RlbGF5X2Nvcm5lciAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjIDxGRj4gQ1JFQVRJTkcgQ09OU1RSQUlOVCBNT0RFUyAuLi5cbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiNcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1hbmQKCiAgICAgICAgICAgICAgICMgVmFyaWFibGUgY2NvbW1hbmQgY2FwdHVyZXMgdGhlIGNvbnN0cmFpbnQgY3JlYXRpb24gZm9yIHRoZSB2aWV3X2RlZmluaXRpb24udGNsIAogICAgICAgICAgICAgICAjIFZhcmlhYmxlIHVjb21tYW5kIGNhcHR1cmUgdGhlIGNvbnN0cmFpbnQgdXBkYXRlcyBmb3IgaGllci9pbG0gZmxvd3MKICAgICAgICAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgICAgc2V0IGNjb21tYW5kICIiCgogICAgICAgICAgICAgICBzZXQgYWN0aXZlX3ZpZXdzIFtsaXN0XQogICAgICAgICAgICAgICBzZXQgYWN0aXZlX21vZGVzIFtsaXN0XQoKICAgICAgICAgICAgICAgIyBHZXQgbW9kZXMgYWN0dWFsbHkgdXNlZCAuLi4gKGNoYW5nZWQgZnJvbSBhY3RpdmUgdG8gYWxsIHZpZXdzKQogICAgICAgICAgICAgICBmb3JlYWNoIHZpZXcgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cyldIHsKICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICRhY3RpdmVfdmlld3MgJHZpZXddID09IC0xfSB7CiMgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGFjdGl2ZV92aWV3cyAkdmlldwogICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGFjdGl2ZV9tb2RlcyAkdmFycygkdmlldyxjb25zdHJhaW50X21vZGUpXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGFjdGl2ZV9tb2RlcyAkdmFycygkdmlldyxjb25zdHJhaW50X21vZGUpCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCBmbGF0dGVuX2lsbSAwCiAgICAgICAgICAgICAgIGZvcmVhY2ggY29uc3RyYWludF9tb2RlICRhY3RpdmVfbW9kZXMgewogICAgICAgICAgICAgICAgICBpZiB7ISR2YXJzKGlsbSl9IHsKICAgICAgICAgICAgICAgICAgICAgIyBEZWZhdWx0IGZsYXQgZmxvdwogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICAiY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSAkY29uc3RyYWludF9tb2RlICIKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1zZGNfZmlsZXMgXFtsaXN0ICR2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXF0gIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjY29tbWFuZCBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjcmVhdGVfY29uc3RyYWludF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICJDb25zdHJhaW50IGZpbGUgbm90IGZvdW5kIGZvciAkY29uc3RyYWludF9tb2RlIC4uLiIgCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHJjKX0gewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxzeW50aF9zZGMpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAgImNyZWF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJGNvbnN0cmFpbnRfbW9kZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItc2RjX2ZpbGVzIFxbbGlzdCAkdmFycygkY29uc3RyYWludF9tb2RlLHN5bnRoX3NkYylcXSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNjb21tYW5kIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9jb25zdHJhaW50X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgIkNvbnN0cmFpbnQgZmlsZSBub3QgZm91bmQgZm9yICRjb25zdHJhaW50X21vZGUgLi4uIiAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBzZGNzICIiCiAgICAgICAgICAgICAgICAgICAgICMgSUxNIGZsb3cKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBIaWVyYXJjaHkgKyBJTE1zCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29uc3RyYWludF9tb2RlLHByZV9jdHNfaWxtX3NkYyldfSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItc2RjX2ZpbGVzIFxbbGlzdCAkdmFycygkY29uc3RyYWludF9tb2RlLHByZV9jdHNfc2RjKVxdICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYyAvYmluL3RvdWNoIGVtcHR5LnNkYwogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc2RjcyAiLXNkY19maWxlcyBlbXB0eS5zZGMgIiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHNkY3MgIi1pbG1fc2RjX2ZpbGVzIFxbbGlzdCAkdmFycygkY29uc3RyYWludF9tb2RlLHByZV9jdHNfaWxtX3NkYylcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjIC9iaW4vdG91Y2ggZW1wdHkuc2RjCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzZGNzICItc2RjX2ZpbGVzIGVtcHR5LnNkYyAiIAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc2RjcyAiLWlsbV9zZGNfZmlsZXMgXFtsaXN0ICR2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXF1cbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnModG9wKX0geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdWNvbW1hbmRdfSB7IHNldCB1Y29tbWFuZCAiIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgICJ1cGRhdGVfY29uc3RyYWludF9tb2RlIC1uYW1lICRjb25zdHJhaW50X21vZGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkc2RjcwogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWFuZCBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxmbGF0dGVuX2lsbSAiZmxhdHRlbklsbVxuc2V0SWxtTW9kZSAta2VlcEZsYXR0ZW4gdHJ1ZVxuIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGR5bmFtaWNfdXBkYXRlIDEKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICAiY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSAkY29uc3RyYWludF9tb2RlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgJHNkY3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNjb21tYW5kIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9jb25zdHJhaW50X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBJTE0gb25seQogICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAgImNyZWF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJGNvbnN0cmFpbnRfbW9kZSAiCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY29uc3RyYWludF9tb2RlLHByZV9jdHNfaWxtX3NkYyldfSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItc2RjX2ZpbGVzIFxbbGlzdCAkdmFycygkY29uc3RyYWludF9tb2RlLHByZV9jdHNfc2RjKVxdICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYyAvYmluL3RvdWNoIGVtcHR5LnNkYwogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc2RjcyAiLXNkY19maWxlcyBlbXB0eS5zZGMgIiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHNkY3MgIi1pbG1fc2RjX2ZpbGVzIFxbbGlzdCAkdmFycygkY29uc3RyYWludF9tb2RlLHByZV9jdHNfaWxtX3NkYylcXVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjIC9iaW4vdG91Y2ggZW1wdHkuc2RjCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzZGNzICItc2RjX2ZpbGVzIGVtcHR5LnNkYyAiIAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc2RjcyAiLWlsbV9zZGNfZmlsZXMgXFtsaXN0ICR2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXF1cbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXX0gewojICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgICJjcmVhdGVfY29uc3RyYWludF9tb2RlIC1uYW1lICRjb25zdHJhaW50X21vZGUgIgojICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1zZGNfZmlsZXMgXFtsaXN0ICR2YXJzKCRjb25zdHJhaW50X21vZGUscHJlX2N0c19zZGMpXF0gIgojICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgojICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNjb21tYW5kIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9jb25zdHJhaW50X21vZGUgJGNvbW1hbmRdCiMgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiQ29uc3RyYWludCBmaWxlIG5vdCBmb3VuZCBmb3IgJGNvbnN0cmFpbnRfbW9kZSAuLi4iIAojICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkc2RjcwogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2NvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KIyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjY29tbWFuZCBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxmbGF0dGVuX2lsbSAiZmxhdHRlbklsbVxuc2V0SWxtTW9kZSAta2VlcEZsYXR0ZW4gdHJ1ZVxuIl0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjY29tbWFuZAoKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkeW5hbWljX3VwZGF0ZV0gJiYgJGR5bmFtaWNfdXBkYXRlfSB7CiMgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImZvcmVhY2ggbW9kZSBcW2FsbF9jb25zdHJhaW50X21vZGVzXF0ge1xuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgXCRtb2RlIC1zZGNfZmlsZXMgZW1wdHkuc2RjIFxcXG4iCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgLWlsbV9zZGNfZmlsZXMgXFtnZXRfY29uc3RyYWludF9tb2RlIFwkbW9kZSAtc2RjX2ZpbGVzXF1cbiIKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KCiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJmb3JlYWNoIG1vZGUgXFthbGxfY29uc3RyYWludF9tb2Rlc10gXHtcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIGZvcmVhY2ggdmlldyBcW2FsbF9hbmFseXNpc192aWV3c10gXHtcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIHNldCBtIFxbcmVnc3ViIF9cJHZpZXcgXCRtb2RlIFwiXCJcXVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgaWYgXHsoIFwkbSAhPSBcJG1vZGUgKSAmJiAoIFxbbHNlYXJjaCBcW2FsbF9jb25zdHJhaW50X21vZGVzXF0gXCRtXF0gIT0gLTEpIFx9IFx7XG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgICAgICB1cGRhdGVfY29uc3RyYWludF9tb2RlIC1uYW1lIFwkbW9kZSAtc2RjX2ZpbGVzIGVtcHR5LnNkYyAtaWxtX3NkY19maWxlcyBcW2dldF9jb25zdHJhaW50X21vZGUgXCRtIC1pbG1fc2RjX2ZpbGVzXF1cbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIFx9XG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICBcfSBcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlx9IFxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZHluYW1pY191cGRhdGUgJGNvbW1hbmRdCgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoaWxtKX0gewojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tYW5kIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGZsYXR0ZW5faWxtICJmbGF0dGVuSWxtXG5zZXRJbG1Nb2RlIC1rZWVwRmxhdHRlbiB0cnVlXG4iXQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZmxhdHRlbl9pbG0gImZsYXR0ZW5JbG1cbiJdCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgIGlmIHsoJHZhcnModXNlcl9tb2RlKSA9PSAiaGllciIpICYmICFbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgICAgaWYgeygkdmFycyhzdGVwKSA9PSAiYXNzZW1ibGUiKSB8fCAoJHZhcnMoc3RlcCkgPT0gInJlYnVkZ2V0IikgfHwgKCR2YXJzKHN0ZXApID09ICJhc3NlbWJsZV9mbGV4aWxtIikgfHwgKCR2YXJzKHN0ZXApID09ICJwYXJ0aXRpb25fcGxhY2UiKSB8fCAoJHZhcnMoc3RlcCkgPT0gIm1vZGVsX2dlbiIpIHx8ICgkdmFycyhzdGVwKSA9PSAicHJvdG90eXBlIil9IHsKICAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgbW1tYyBmaWxlIGZvciBwYXJ0aXRpb24gYW5kIGFzc2VtYmxlIHN0ZXAKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyhzY3JpcHRfZGlyKS9pbmNyX3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICRtbW1jX2ZpbGUgd10KICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgW0ZGOjpwcmV0dHlfcHJpbnQgJGNvbW1hbmRzIDFdCiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlICRvcAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCkKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyhzY3JpcHRfZGlyKS92aWV3X2RlZmluaXRpb24udGNsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBvcCBbb3BlbiAkbW1tY19maWxlIHddCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wIFtGRjo6cHJldHR5X3ByaW50ICRjb21tYW5kcyAxXQogICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSAkb3AKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICNyZXR1cm4gJGNvbW1hbmRzCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICMgUmV0dXJuIG9ubHkgY29uc3RyYWludCBtb2RlIHVwZGF0ZXMgZm9yIHRvcCBsZXZlbCBmbG93CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdWNvbW1hbmRdfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdWNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB1Y29tbWFuZF19IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR1Y29tbWFuZAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV19IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBzZXQgdmFycyhhbGxfYW5hbHlzaXNfdmlld3MpIFwKICAgICAgICAgICAgICAgICAgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICR2YXJzKGhvbGRfYW5hbHlzaXNfdmlld3MpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV1dCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiI1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyA8RkY+IENSRUFUSU5HIEFOQUxZU0lTIFZJRVdTIC4uLlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiI1xuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGZvcmVhY2ggdmlldyAkdmFycyhhbGxfYW5hbHlzaXNfdmlld3MpIHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJpZiB7XFtsc2VhcmNoIFxbYWxsX2FuYWx5c2lzX3ZpZXdzXF0gJHZpZXdcXSA9PSAtMX0ge1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgY3JlYXRlX2FuYWx5c2lzX3ZpZXciCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgICAtbmFtZSAkdmlldyIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIC1jb25zdHJhaW50X21vZGUgJHZhcnMoJHZpZXcsY29uc3RyYWludF9tb2RlKSIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIC1kZWxheV9jb3JuZXIgJHZhcnMoJHZpZXcsZGVsYXlfY29ybmVyKVxuIgojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2FuYWx5c2lzX3ZpZXcgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZ2VuX3Bvc3Rsb2FkKV19IHsgCiAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICAgICAjIExlZ2FjeSBzdXBwb3J0LCBzbyBubyBJRUVFIDE4MDEgc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICAjIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBjICR2YXJzKGRlbGF5X2Nvcm5lcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBkb21haW5zICR2YXJzKCRjLHBvd2VyX2RvbWFpbnMpfV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBkb21haW4gJGRvbWFpbnMgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIHVwZGF0ZV9kZWxheV9jb3JuZXIgLW5hbWUgJGMgLXBvd2VyX2RvbWFpbiBcIiRkb21haW5cIlxuIgogICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBvcGNvbmQgJHZhcnMoJGRvbWFpbixvcGNvbmQpfV0gJiYKICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhW2NhdGNoIHtzZXQgbGlicmFyeSAkdmFycygkZG9tYWluLG9wY29uZF9saWJyYXJ5KX1dfSB7CiAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1vcGNvbmRfbGlicmFyeSAkbGlicmFyeSIKICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW9wY29uZCAkb3Bjb25kIgogICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgaW5pdCx1cGRhdGVfZGVsYXlfY29ybmVyICRjb21tYW5kXQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAgICAjIENQRl9USU1JTkcgPT0gVFJVRQogICAgICAgICAgICAgICAjIFNpbmNlIHRoZSBkZWxheSBjb3JuZXIgbmFtZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgQ1BGLCB0aGV5CiAgICAgICAgICAgICAgICMgYXJlIG5vdCBrbm93bi4gIEhvd2V2ZXIsIHRoZXkgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZQogICAgICAgICAgICAgICAjIGFuYWx5c2lzX3ZpZXdzCiAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBVUERBVElORyBERUxBWSBDT1JORVJTICAuLi5cbiIKIyAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhkZWxheV9jb3JuZXJzKV19IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZGVsYXlfY29ybmVycykgW0ZGOjpbZ2V0X2J5X3N1ZmZpeCB2YXJzICIscmNfY29ybmVyIl1dCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgZm9yZWFjaCBjb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiaWYge1xbbHNlYXJjaCAtZXhhY3QgXFthbGxfZGVsYXlfY29ybmVyc1xdICRjb3JuZXJcXSAhPSAtMX0ge1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgdXBkYXRlX2RlbGF5X2Nvcm5lciAtbmFtZSAkY29ybmVyIC1yY19jb3JuZXIgJHZhcnMoJGNvcm5lcixyY19jb3JuZXIpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV9kZWxheV9jb3JuZXIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgIyBVcGRhdGUgY29uc3RyYWludHMgbW9kZXMgaWYgYW4gSUxNIGZsb3cKICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAgICBzZXQgY2NvbW1hbmQgIiIKICAgICAgICAgICAgICAgZm9yZWFjaCBjb25zdHJhaW50X21vZGUgJHZhcnMoY29uc3RyYWludF9tb2RlcykgewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoaWxtKX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAgInVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJGNvbnN0cmFpbnRfbW9kZSAiCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICAiY3JlYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSAkY29uc3RyYWludF9tb2RlICIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX2lsbV9zZGMpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXNkY19maWxlcyBcW2xpc3QgJHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX3NkYylcXSAiCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItaWxtX3NkY19maWxlcyBcW2xpc3QgJHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX2lsbV9zZGMpXF0gIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBleGVjIC9iaW4vdG91Y2ggZW1wdHkuc2RjCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItc2RjX2ZpbGVzIGVtcHR5LnNkYyAiCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItaWxtX3NkY19maWxlcyBcW2xpc3QgJHZhcnMoJGNvbnN0cmFpbnRfbW9kZSxwcmVfY3RzX3NkYylcXSAiCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2NvbW1hbmQgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNjb21tYW5kIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9jb25zdHJhaW50X21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICAgICMgUmV0dXJuIGVhcmx5IGZvciBwYXJ0aXRpb24gaW1wbGVtZW50YXRpb24gZmxvd3MgLi4uCiAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgaWYgeygoJHZhcnMobW9kZSkgPT0gImhpZXIiKSB8fCAoW2luZm8gZXhpc3RzIHZhcnMoaGllcildICYmICR2YXJzKGhpZXIpKSkgJiYgKCR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UiKX0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZHMgJGNjb21tYW5kCiAgICAgICAgICAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRjY29tbWFuZAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBVcGRhdGUgbGlicmFyeV9zZXRzIHdpdGggU0kgbGlicmFyaWVzIGlmIGRlZmluZWQKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICBVUERBVElORyBMSUJSQVJZIFNFVFMgIC4uLlxuIgojICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBmb3JlYWNoIHNldCAkdmFycyhsaWJyYXJ5X3NldHMpIHsKICAgICAgICAgICAgICAgaWYgeyhbaW5mbyBleGlzdHMgdmFycygkc2V0LHNpKV0gJiYgKCR2YXJzKCRzZXQsc2kpICE9ICIiKSkgfHwgXAogICAgICAgICAgICAgICAgICAgKFtpbmZvIGV4aXN0cyB2YXJzKCRzZXQsc29jdildICYmICgkdmFycygkc2V0LHNvY3YpICE9ICIiKSkgfHwgXAogICAgICAgICAgICAgICAgICAgKFtpbmZvIGV4aXN0cyB2YXJzKCRzZXQsYW9jdildICYmICgkdmFycygkc2V0LGFvY3YpICE9ICIiKSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInVwZGF0ZV9saWJyYXJ5X3NldCAtbmFtZSAkc2V0IgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc2V0LHNvY3YpXSAmJiAoJHZhcnMoJHNldCxzb2N2KSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtc29jdiBcW2xpc3QiCiAgICAgICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkc2V0LHNvY3YpIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAkZmlsZSIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXF0iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRzZXQsYW9jdildICYmICgkdmFycygkc2V0LGFvY3YpICE9ICIiKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1hb2N2IFxbbGlzdCIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKCRzZXQsYW9jdikgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICRmaWxlIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHNldCxzaSldICYmICgkdmFycygkc2V0LHNpKSAhPSAiIil9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtc2kgXFtsaXN0IgogICAgICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJHNldCxzaSkgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICRmaWxlIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV9saWJyYXJ5X3NldCAkY29tbWFuZF0KCiAgICAgICAgICAgIGlmIHskdmFycyhmbG93KSAhPSAibW1tYyJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OnVwZGF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgICAgfQojICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6ZGVyYXRlX3RpbWluZyBtbW1jXQojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgRGVmaW5lIHNldHVwIC8gaG9sZCBhbmFseXNpcyB2aWV3cyBhbmQgZW5hYmxlIHRoZSBkZWZhdWx0IHZpZXdzCiAgICAgICAgICAgICMgZm9yIGVhY2gKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfYW5hbHlzaXNfdmlldyIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLXNldHVwIFxbbGlzdCAkdmFycyhhY3RpdmVfc2V0dXBfdmlld3MpXF0iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1ob2xkIFxbbGlzdCAkdmFycyhhY3RpdmVfaG9sZF92aWV3cylcXVxuIgojICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9kZWZhdWx0X3ZpZXcgLXNldHVwICR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldykgLWhvbGQgJHZhcnMoZGVmYXVsdF9ob2xkX3ZpZXcpXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2RlZmF1bHRfdmlldyAkY29tbWFuZF0KIyAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmRlcmF0ZV90aW1pbmcgbW1tY10KIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQojICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Bvd2VyX2FuYWx5c2lzX21vZGUgLWFuYWx5c2lzX3ZpZXcgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldylcbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcG93ZXJfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KIyAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsZSBta2RpciAkdmFycyhzY3JpcHRfZGlyKQogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGZsYXQpICE9ICJmdWxsIn0gewogICAgICAgICAgICAgICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvbW1tYy50Y2wgd10KICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgW0ZGOjpwcmV0dHlfcHJpbnQgJGNvbW1hbmRzIDFdCiAgICAgICAgICAgICAgICAgIGNsb3NlICRvcAojICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmRzICJzb3VyY2UgXCR2YXJzKHNjcmlwdF9kaXIpL21tbWMudGNsXG4iCiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kcyAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL21tbWMudGNsXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyhzY3JpcHRfZGlyKS9pbmNyX3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICRtbW1jX2ZpbGUgd10KICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgW0ZGOjpwcmV0dHlfcHJpbnQgJGNvbW1hbmRzIDFdCiAgICAgICAgICAgICAgICAgIGNsb3NlICRvcAogICAgICAgICAgICAgICAgICByZXR1cm4gInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS9pbmNyX3ZpZXdfZGVmaW5pdGlvbi50Y2xcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCkKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICRtbW1jX2ZpbGUgd10KICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgW0ZGOjpwcmV0dHlfcHJpbnQgJGNvbW1hbmRzIDFdCiAgICAgICAgICAgICAgICAgICAgIGNsb3NlICRvcAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgcmV0dXJuCiMgICAgICAgICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBkZWZhdWx0IHsKICAgICAgICAgICAgcHV0cyAgIjxGRj4gSU5WQUxJRCBPUFRJT04gLi4uIE1VU1QgQkUgRUlUSEVSIG1pbm1heCBPUiBtbW1jIgogICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICRjb21tYW5kcwogICB9CgogICBwcm9jIHVwZGF0ZV9yY19jb3JuZXJzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBmb3JlYWNoIHJjX2Nvcm5lciBbYWxsX3JjX2Nvcm5lcnNdIHsKICAgICAgICAgaWYgeyRyY19jb3JuZXIgIT0gImRlZmF1bHRfcmNfY29ybmVyIn0gewogICAgICAgICAgICBzZXQgdXBkYXRlIGZhbHNlCiAgICAgICAgICAgIHNldCBjb21tYW5kICJ1cGRhdGVfcmNfY29ybmVyIC1uYW1lICRyY19jb3JuZXIgIgogICAgICAgICAgICBpZiB7W2dldF9yY19jb3JuZXIgJHJjX2Nvcm5lciAtY2FwX3RhYmxlXSAhPSAkdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSl9IHsKICAgICAgICAgICAgICAgc2V0IHVwZGF0ZSB0cnVlCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItY2FwX3RhYmxlICR2YXJzKCRyY19jb3JuZXIsY2FwX3RhYmxlKSAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLXByZVJvdXRlX3Jlc10gIT0gJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfcmVzX2ZhY3Rvcil9IHsKICAgICAgICAgICAgICAgc2V0IHVwZGF0ZSB0cnVlCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcHJlUm91dGVfcmVzICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX3Jlc19mYWN0b3IpICIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2dldF9yY19jb3JuZXIgJHJjX2Nvcm5lciAtcHJlUm91dGVfY2FwXSAhPSAkdmFycygkcmNfY29ybmVyLHByZV9yb3V0ZV9jYXBfZmFjdG9yKX0gewogICAgICAgICAgICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wcmVSb3V0ZV9jYXAgJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfY2FwX2ZhY3RvcikgIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbZ2V0X3JjX2Nvcm5lciAkcmNfY29ybmVyIC1wb3N0Um91dGVfcmVzXSAhPSAkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfcmVzX2ZhY3Rvcil9IHsKICAgICAgICAgICAgICAgc2V0IHVwZGF0ZSB0cnVlCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcG9zdFJvdXRlX3JlcyBcIiR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9yZXNfZmFjdG9yKVwiICIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2dldF9yY19jb3JuZXIgJHJjX2Nvcm5lciAtcG9zdFJvdXRlX2NhcF0gIT0gJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX2NhcF9mYWN0b3IpfSB7CiAgICAgICAgICAgICAgIHNldCB1cGRhdGUgdHJ1ZQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXBvc3RSb3V0ZV9jYXAgXCIkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfY2FwX2ZhY3RvcilcIiAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLXByZVJvdXRlX2Nsa3Jlc10gIT0gJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfY2xrX3Jlc19mYWN0b3IpfSB7CiAgICAgICAgICAgICAgIHNldCB1cGRhdGUgdHJ1ZQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXByZVJvdXRlX2Nsa3JlcyAkdmFycygkcmNfY29ybmVyLHByZV9yb3V0ZV9jbGtfcmVzX2ZhY3RvcikgIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbZ2V0X3JjX2Nvcm5lciAkcmNfY29ybmVyIC1wcmVSb3V0ZV9jbGtjYXBdICE9ICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX2Nsa19jYXBfZmFjdG9yKX0gewogICAgICAgICAgICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wcmVSb3V0ZV9jbGtjYXAgJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfY2xrX2NhcF9mYWN0b3IpICIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2dldF9yY19jb3JuZXIgJHJjX2Nvcm5lciAtcG9zdFJvdXRlX2Nsa3Jlc10gIT0gJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX2Nsa19yZXNfZmFjdG9yKX0gewogICAgICAgICAgICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wb3N0Um91dGVfY2xrcmVzIFwiJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX2Nsa19yZXNfZmFjdG9yKVwiICIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2dldF9yY19jb3JuZXIgJHJjX2Nvcm5lciAtcG9zdFJvdXRlX2Nsa2NhcF0gIT0gJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX2Nsa19jYXBfZmFjdG9yKX0gewogICAgICAgICAgICAgICBzZXQgdXBkYXRlIHRydWUKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wb3N0Um91dGVfY2xrY2FwIFwiJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX2Nsa19jYXBfZmFjdG9yKVwiICIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2dldF9yY19jb3JuZXIgJHJjX2Nvcm5lciAtcG9zdFJvdXRlX3hjYXBdICE9ICR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV94Y2FwX2ZhY3Rvcil9IHsKICAgICAgICAgICAgICAgc2V0IHVwZGF0ZSB0cnVlCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcG9zdFJvdXRlX3hjYXAgXCIkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfeGNhcF9mYWN0b3IpXCIgIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uICJUIHF4X3RlY2hfZmlsZSBxeF9jb25mX2ZpbGUgcXhfbGliX2ZpbGUiIHsKICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcmNfY29ybmVyLCRvcHRpb24pXX0gewogICAgICAgICAgICAgICAgICAgaWYge1tnZXRfcmNfY29ybmVyICRyY19jb3JuZXIgLSRvcHRpb25dICE9ICR2YXJzKCRyY19jb3JuZXIsJG9wdGlvbil9IHsKICAgICAgICAgICAgICAgICAgICAgIHNldCB1cGRhdGUgdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi0kb3B0aW9uICR2YXJzKCRyY19jb3JuZXIsJG9wdGlvbikgIgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdXBkYXRlfSB7CiAgICAgICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZAogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICB9CiAgIHByb2MgcmVzZXRfcmNfY29ybmVycyB7fSB7CgogICAgICBnbG9iYWwgdmFycwoKICAgICAgZm9yZWFjaCBjb3JuZXIgJHZhcnMocmNfY29ybmVycykgewogICAgICAgICB1cGRhdGVfcmNfY29ybmVyIC1uYW1lICRjb3JuZXIgXAogICAgICAgICAgICAtcHJlUm91dGVfcmVzIDEuMCBcCiAgICAgICAgICAgIC1wcmVSb3V0ZV9jbGtyZXMgMS4wIFwKICAgICAgICAgICAgLXByZVJvdXRlX2NhcCAxLjAgXAogICAgICAgICAgICAtcHJlUm91dGVfY2xrY2FwIDEuMCBcCiAgICAgICAgICAgIC1wb3N0Um91dGVfcmVzIDEuMCBcCiAgICAgICAgICAgIC1wb3N0Um91dGVfY2xrcmVzIDEuMCBcCiAgICAgICAgICAgIC1wb3N0Um91dGVfY2FwIDEuMCBcCiAgICAgICAgICAgIC1wb3N0Um91dGVfY2xrX2FwIDEuMCBcCiAgICAgICAgICAgIC1wb3N0Um91dGVfeGNhcCAxLjAKICAgICAgfQogICB9CiAgIHByb2MgYWRkX3ZpZXdzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBQdXRzICI8RkY+IENSRUFUSU5HIFJDIENPUk5FUlMgLi4uIgogICAgICBmb3JlYWNoIHJjX2Nvcm5lciAkdmFycyhyY19jb3JuZXJzKSB7CiAgICAgICAgIGlmIHtbbHNlYXJjaCBbYWxsX3JjX2Nvcm5lcnNdICRyY19jb3JuZXJdID09IC0xfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfcmNfY29ybmVyIC1uYW1lICRyY19jb3JuZXIgIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLWNhcF90YWJsZSAkdmFycygkcmNfY29ybmVyLGNhcF90YWJsZSlcXSAiCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcHJlUm91dGVfcmVzICR2YXJzKCRyY19jb3JuZXIscHJlX3JvdXRlX3Jlc19mYWN0b3IpICIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wcmVSb3V0ZV9jbGtyZXMgJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfY2xrX3Jlc19mYWN0b3IpICIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wcmVSb3V0ZV9jYXAgJHZhcnMoJHJjX2Nvcm5lcixwcmVfcm91dGVfY2FwX2ZhY3RvcikgIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXByZVJvdXRlX2Nsa2NhcCAkdmFycygkcmNfY29ybmVyLHByZV9yb3V0ZV9jbGtfY2FwX2ZhY3RvcikgIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXBvc3RSb3V0ZV9yZXMgXCIkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfcmVzX2ZhY3RvcilcIiAiCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcG9zdFJvdXRlX2Nsa3JlcyBcIiR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9jbGtfcmVzX2ZhY3RvcilcIiAiCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcG9zdFJvdXRlX2NhcCBcIiR2YXJzKCRyY19jb3JuZXIscG9zdF9yb3V0ZV9jYXBfZmFjdG9yKVwiICIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wb3N0Um91dGVfY2xrY2FwIFwiJHZhcnMoJHJjX2Nvcm5lcixwb3N0X3JvdXRlX2Nsa19jYXBfZmFjdG9yKVwiICIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1wb3N0Um91dGVfeGNhcCAkdmFycygkcmNfY29ybmVyLHBvc3Rfcm91dGVfeGNhcF9mYWN0b3IpICIKICAgICAgICAgICAgZm9yZWFjaCBvcHRpb24gIlQgcXhfdGVjaF9maWxlIHF4X2NvbmZfZmlsZSBxeF9saWJfZmlsZSIgewogICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRyY19jb3JuZXIsJG9wdGlvbildfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItJG9wdGlvbiAkdmFycygkcmNfY29ybmVyLCRvcHRpb24pICIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmQKICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7IVtGRjo6aXNfbHBfZmxvd10gfHwgXAogICAgICAgICAgKFtGRjo6aXNfbHBfZmxvd10gJiYgKFtsbGVuZ3RoIFthbGxfYW5hbHlzaXNfdmlld3NdXSA9PSAyKSl9IHsKCiAgICAgICAgIFB1dHMgIjxGRj4gQ1JFQVRJTkcgTElCUkFSWSBTRVRTIC4uLiIKICAgICAgICAgZm9yZWFjaCBsaWJyYXJ5X3NldCAkdmFycyhsaWJyYXJ5X3NldHMpIHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoIFthbGxfbGlicmFyeV9zZXRzXSAkbGlicmFyeV9zZXRdID09IC0xfSB7CiAgICAgICAgICAgICAgIGNyZWF0ZV9saWJyYXJ5X3NldCAtbmFtZSAkbGlicmFyeV9zZXQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXRpbWluZyAkdmFycygkbGlicmFyeV9zZXQsdGltaW5nKQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIFB1dHMgIjxGRj4gQ1JFQVRJTkcgREVMQVkgQ09STkVSUyAuLi5cbiIKICAgICAgICAgZm9yZWFjaCBkZWxheV9jb3JuZXIgJHZhcnMoZGVsYXlfY29ybmVycykgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggW2FsbF9kZWxheV9jb3JuZXJzXSAkZGVsYXlfY29ybmVyXSA9PSAtMX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiY3JlYXRlX2RlbGF5X2Nvcm5lciAtbmFtZSAkZGVsYXlfY29ybmVyICIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1saWJyYXJ5X3NldCAkdmFycygkZGVsYXlfY29ybmVyLGxpYnJhcnlfc2V0KSAiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItcmNfY29ybmVyICR2YXJzKCRkZWxheV9jb3JuZXIscmNfY29ybmVyKSAiCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZGVsYXlfY29ybmVyLG9wY29uZCldICYmIFtpbmZvIGV4aXN0cyB2YXJzKCRkZWxheV9jb3JuZXIsb3Bjb25kX2xpYnJhcnkpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiLW9wY29uZF9saWJyYXJ5ICR2YXJzKCRkZWxheV9jb3JuZXIsb3Bjb25kX2xpYnJhcnkpICIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1vcGNvbmQgJHZhcnMoJGRlbGF5X2Nvcm5lcixvcGNvbmQpICIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmQKICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBkb21haW5zICR2YXJzKCRjLHBvd2VyX2RvbWFpbnMpfV19IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiB1cGRhdGVfZGVsYXlfY29ybmVyIC1uYW1lICRjIC1wb3dlcl9kb21haW5zIFwiJGRvbWFpbnNcIiIKICAgICAgICAgICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBQdXRzICI8RkY+IFVQREFUSU5HIENPTlNUUkFJTlQgTU9ERVMgLi4uIgogICAgICAgICBmb3JlYWNoIG1vZGUgJHZhcnMoY29uc3RyYWludF9tb2RlcykgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggW2FsbF9jb25zdHJhaW50X21vZGVzXSAkbW9kZV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLHByZV9jdHNfc2RjLGZ1bGwpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9jb25zdHJhaW50X21vZGUgIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtbmFtZSAkbW9kZSAiCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1zZGNfZmlsZXMgJHZhcnMoJG1vZGUscHJlX2N0c19zZGMsZnVsbClcbiIKICAgICAgICAgICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRtb2RlLHByZV9jdHNfc2RjKX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9jb25zdHJhaW50X21vZGUgIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtbmFtZSAkbW9kZSAiCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1zZGNfZmlsZXMgJHZhcnMoJG1vZGUscHJlX2N0c19zZGMpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBzZXQgdmFycyhhbGxfYW5hbHlzaXNfdmlld3MpIFtsc29ydCAtdW5pcSBbY29uY2F0ICR2YXJzKHNldHVwX2FuYWx5c2lzX3ZpZXdzKSAkdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKV1dCiAgICAgICAgIFB1dHMgIjxGRj4gVVBEQVRJTkcgQU5BTFlTSVMgVklFV1MgLi4uIgoKICAgICAgICAgZm9yZWFjaCBhbmFseXNpc192aWV3ICR2YXJzKGFsbF9hbmFseXNpc192aWV3cykgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggW2FsbF9hbmFseXNpc192aWV3c10gJGFuYWx5c2lzX3ZpZXddID09IC0xfSB7CiAgICAgICAgICAgICAgIGNyZWF0ZV9hbmFseXNpc192aWV3IC1uYW1lICRhbmFseXNpc192aWV3IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWNvbnN0cmFpbnRfbW9kZSAkdmFycygkYW5hbHlzaXNfdmlldyxjb25zdHJhaW50X21vZGUpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWRlbGF5X2Nvcm5lciAkdmFycygkYW5hbHlzaXNfdmlldyxkZWxheV9jb3JuZXIpCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9IGVsc2UgewoKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIFNpbmNlIHRoZSBkZWxheSBjb3JuZXIgbmFtZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgQ1BGLCB0aGV5IGFyZSBub3QKICAgIyBrbm93bi4gIEhvd2V2ZXIsIHRoZXkgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBhbmFseXNpc192aWV3cwogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIFB1dHMgIjxGRj4gVVBEQVRJTkcgREVMQVkgQ09STkVSUyAgLi4uIgogICAgICAgICBmb3JlYWNoIGNvcm5lciAkdmFycyhkZWxheV9jb3JuZXJzKSB7CiAgICAgICAgICAgIFB1dHMgIlVwZGF0aW5nIGRlbGF5IGNvcm5lciAkY29ybmVyIHdpdGggUkMgQ29ybmVyICR2YXJzKCRjb3JuZXIscmNfY29ybmVyKSAuLi4iCiAgICAgICAgICAgIHVwZGF0ZV9kZWxheV9jb3JuZXIgLW5hbWUgJGNvcm5lciAtcmNfY29ybmVyICR2YXJzKCRjb3JuZXIscmNfY29ybmVyKQogICAgICAgICB9CiAgICAgIH0KCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBVcGRhdGUgbGlicmFyeV9zZXRzIHdpdGggU0kgbGlicmFyaWVzIGlmIGRlZmluZWQKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBQdXRzICI8RkY+IFVQREFUSU5HIExJQlJBUlkgU0VUUyAgLi4uIgogICAgICBmb3JlYWNoIGxpYnJhcnlfc2V0ICR2YXJzKGxpYnJhcnlfc2V0cykgewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGxpYnJhcnlfc2V0LHNpKV0gJiYgKCR2YXJzKCRsaWJyYXJ5X3NldCxzaSkgIT0gIiIpfSB7CiAgICAgICAgICAgIHVwZGF0ZV9saWJyYXJ5X3NldCAtbmFtZSAkbGlicmFyeV9zZXQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNpICR2YXJzKCRsaWJyYXJ5X3NldCxzaSkKICAgICAgICAgfQogICAgICB9CiAgICAgIGZvcmVhY2ggbGlicmFyeV9zZXQgJHZhcnMobGlicmFyeV9zZXRzKSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkbGlicmFyeV9zZXQsYW9jdildICYmICgkdmFycygkbGlicmFyeV9zZXQsYW9jdikgIT0gIiIpfSB7CiAgICAgICAgICAgIHVwZGF0ZV9saWJyYXJ5X3NldCAtbmFtZSAkbGlicmFyeV9zZXQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWFvY3YgJHZhcnMoJGxpYnJhcnlfc2V0LGFvY3YpCiAgICAgICAgIH0KICAgICAgfQoKCiAgICAgIHNldF9pbnRlcmFjdGl2ZV9jb25zdHJhaW50X21vZGVzIFthbGxfY29uc3RyYWludF9tb2RlcyAtYWN0aXZlXQoKICAgICAgUHV0cyAiPEZGPiBERVJBVElORyBERUxBWSBDT1JORVJTIC4uLiIKICAgICAgRkZfRURJOjpkZXJhdGVfdGltaW5nIG1tbWMKCiAgICAgIGlmIHskdmFycyhmbG93KSAhPSAibW1tYyJ9IHsKICAgICAgICAgRkZfRURJOjp1cGRhdGVfdGltaW5nIG1tbWMKICAgICAgfQoKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIERlZmluZSBzZXR1cCAvIGhvbGQgYW5hbHlzaXMgdmlld3MgYW5kIGVuYWJsZSB0aGUgZGVmYXVsdCB2aWV3cyBmb3IgZWFjaAogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIHNldF9hbmFseXNpc192aWV3IC1zZXR1cCAkdmFycyhhY3RpdmVfc2V0dXBfdmlld3MpIC1ob2xkICR2YXJzKGFjdGl2ZV9ob2xkX3ZpZXdzKQogICAgICBzZXRfZGVmYXVsdF92aWV3IC1zZXR1cCAkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpIC1ob2xkICR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KQogICB9CgogICBwcm9jIGdldF9wb3dlcl9kb21haW5zX2NvZGUge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIHNldCBjb21tYW5kcyAic2V0IGRvbWFpbnMgXFtsaXN0XF1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJkYkZvckVhY2hQb3dlckRvbWFpbiBcW2RiZ0hlYWRcXSBkb21haW4ge1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGlmIHtcW2RiR3JvdXBISW5zdExpc3QgXFtkYlBvd2VyRG9tYWluTmFtZSBcJGRvbWFpblxdXF0gIT0gXCIweDBcIn0ge1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgIGxhcHBlbmQgZG9tYWlucyBcW2RiUG93ZXJEb21haW5OYW1lIFwkZG9tYWluXF1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICB9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCgogICBwcm9jIGdldF9jbG9ja19wb3J0cyB7fSB7CgogICAgICBnbG9iYWwgdmFycwoKICAgICAgc2V0IGNvbW1hbmRzICIiCgogICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pIHx8ICgkdmFycyhjb2RlZ2VuKSAmJiAoJHZhcnMoZmxhdCkgIT0gIm5vbmUiKSl9IHsKCiAgICAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgICAgIGlmIHskdmFycyhzdGVwKSAhPSAiY3RzIn0geyAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRJbG1UeXBlIC1tb2RlbCBzaVxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgY2xvY2tfcG9ydHMgXFtsaXN0XF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgY2xvY2tzIFxbZ2V0X2Nsb2NrcyAqXF1cbiIKCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZm9yZWFjaF9pbl9jb2xsZWN0aW9uIGNsb2NrIFwkY2xvY2tzIHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBzZXQgc291cmNlcyAgXFtnZXRfcHJvcGVydHkgXCRjbG9jayBzb3VyY2VzXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBmb3JlYWNoX2luX2NvbGxlY3Rpb24gc291cmNlIFwkc291cmNlcyB7XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICBzZXQgc291cmNlX25hbWUgXFtnZXRfcHJvcGVydHkgXCRzb3VyY2UgaGllcmFyY2hpY2FsX25hbWVcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICAgc2V0IHNvdXJjZV90eXBlIFxbZ2V0X3Byb3BlcnR5IFwkc291cmNlIG9iamVjdF90eXBlXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgIGlmIHtcJHNvdXJjZV90eXBlID09IFwicG9ydFwifSB7XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgICAgIGxhcHBlbmQgY2xvY2tfcG9ydHMgXCRzb3VyY2VfbmFtZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICB9XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICB9XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIkZGOjpnZXRfY2xvY2tfcG9ydHNcbiIKICAgICAgfQogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCiAgIHByb2MgYWRkX3RpZV9jZWxscyB7e21vZGUgdHJ1ZX0ge2FkZCB0cnVlfX0gewogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgVGhpcyBwcm9jZWR1cmUgaW5zZXJ0cyB0aWUgaGkvbG8gY2VsbHMgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gdGhlCiAgICAgICMgc2V0dXAudGNsCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIHNldCBjb21tYW5kcyAiIgogICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBBRERJTkcgVElFIENFTExTXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICBzZXQgYXJncyAiIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModGllX2NlbGxzLG1heF9kaXN0YW5jZSldfSB7CiAgICAgICAgIGFwcGVuZCBhcmdzICIgLW1heERpc3RhbmNlICR2YXJzKHRpZV9jZWxscyxtYXhfZGlzdGFuY2UpIgogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh0aWVfY2VsbHMsbWF4X2Zhbm91dCldfSB7CiAgICAgICAgIGFwcGVuZCBhcmdzICIgLW1heEZhbm91dCAkdmFycyh0aWVfY2VsbHMsbWF4X2Zhbm91dCkiCiAgICAgIH0KCiAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddICYmIChbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9kb21haW5zKV0gJiYgKFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDEpKX0gewoKICAgICAgICAgIyBHZXQgdGhlIHNldCBvZiB0aWUgY2VsbHMgdG8gdXNlLCBib3RoIGRvbWFpbi1zcGVjaWZpYyBhbmQgZ2VuZXJpYy4KCiAgICAgICAgIHNldCBhbGxfdGllX2NlbGxzIFtsaXN0XQoKICAgICAgICAgc2V0IGhhc19kZWZhdWx0IGZhbHNlCiAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgZGVmYXVsdF9jZWxscyAkdmFycyh0aWVfY2VsbHMpfV19IHsKICAgICAgICAgICAgc2V0IGhhc19kZWZhdWx0IHRydWUKICAgICAgICAgICAgbGFwcGVuZCBhbGxfdGllX2NlbGxzICR2YXJzKHRpZV9jZWxscykKICAgICAgICAgfQogICAgICAgICBzZXQgaGFzX3NwZWNpZmljIGZhbHNlCiAgICAgICAgIGZvcmVhY2ggZG9tYWluIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIsdGllX2NlbGxzIl0gewogICAgICAgICAgICBzZXQgY2VsbHMgJHZhcnMoJGRvbWFpbix0aWVfY2VsbHMpCiAgICAgICAgICAgIGxhcHBlbmQgYWxsX3RpZV9jZWxscyAkdmFycygkZG9tYWluLHRpZV9jZWxscykKICAgICAgICAgICAgaWYgeyFbbGxlbmd0aCAkY2VsbHNdfSB7CiAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGhhc19zcGVjaWZpYyB0cnVlCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IHRpZV9jZWxscygkZG9tYWluKSBcW2xpc3QgJGNlbGxzXF1cbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICAgICB9CgogICAgICAgICAjCiAgICAgICAgICMgSWYgdGhlcmUgYXJlIG5vIHRpZSBjZWxscyBhdCBhbGwsIHRoZXJlJ3Mgbm90aGluZyB0byBkbwogICAgICAgICAjCgogICAgICAgICBpZiB7ISRoYXNfZGVmYXVsdCAmJiAhJGhhc19zcGVjaWZpY30gewogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgfQoKICAgICAgICAgc2V0IGFsbF90aWVfY2VsbHMgW2xzb3J0IC11bmlxdWUgW2pvaW4gJGFsbF90aWVfY2VsbHNdXQoKICAgICAgICAgIwogICAgICAgICAjIElmIHRoZXJlIGFyZSBubyBkb21haW4tc3BlY2lmaWMgZW50cmllcywgbGlmZSBpcyByZWFsIHNpbXBsZQogICAgICAgICAjCgojICAgICAgICAgaWYgeyEkaGFzX3NwZWNpZmljfSB7CiMgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0VGllSGlMb01vZGUgLWNlbGwgXCIkZGVmYXVsdF9jZWxsc1wiICRhcmdzXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3RpZV9oaV9sb19tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgaWYgeyRhZGR9IHsKIyAgICAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkZGVmYXVsdF9jZWxscyB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldERvbnRVc2UgJGNlbGwgZmFsc2VcbiIKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAwfSB7CiMgICAgICAgICAgICAgICAgICBmb3JlYWNoIGRvbWFpbiAkdmFycyhwb3dlcl9kb21haW5zKSB7CiMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgICIgICBjYXRjaCB7YWRkVGllSGlMbyAtcG93ZXJEb21haW4gJGRvbWFpbiAtcHJlZml4ICRkb21haW59XG4iCiMgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBmb3JlYWNoIGNlbGwgJGRlZmF1bHRfY2VsbHMgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXREb250VXNlICRjZWxsIHRydWVcbiIKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkZGVmYXVsdF9jZWxscyB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0RG9udFVzZSAkY2VsbCBmYWxzZVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAwfSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggZG9tYWluICR2YXJzKHBvd2VyX2RvbWFpbnMpIHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkb21haW4sdGllX2NlbGxzKV19IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRpZUhpTG9Nb2RlIC1jZWxsIFwiJHZhcnMoJGRvbWFpbix0aWVfY2VsbHMpXCIgJGFyZ3NcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkZWZhdWx0X2NlbGxzXX0geyAKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRpZUhpTG9Nb2RlIC1jZWxsIFwiJGRlZmF1bHRfY2VsbHNcIiAkYXJnc1xuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90aWVfaGlfbG9fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICAiICAgY2F0Y2gge2FkZFRpZUhpTG8gLXBvd2VyRG9tYWluICRkb21haW4gLXByZWZpeCAkZG9tYWlufVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCBjZWxsICRkZWZhdWx0X2NlbGxzIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXREb250VXNlICRjZWxsIHRydWVcbiIKICAgICAgICAgICAgfQojICAgICAgICAgfQogICAgICB9IGVsc2VpZiB7IVtjYXRjaCB7c2V0IGNlbGxzICR2YXJzKHRpZV9jZWxscyl9XX0gewogICAgICAgICBzZXQgY29tbWFuZCAic2V0VGllSGlMb01vZGUgLWNlbGwgXCIkY2VsbHNcIiAkYXJnc1xuIgojICAgICAgICAgaWYgeyRtb2RlfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdGllX2hpX2xvX21vZGUgJGNvbW1hbmRdCiMgICAgICAgICB9CiAgICAgICAgICAgIHNldCBjb21tYW5kICJmb3JlYWNoIGNlbGwgXHskY2VsbHNcfSB7XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICBzZXREb250VXNlIFwkY2VsbCBmYWxzZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiYWRkVGllSGlMb1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiZm9yZWFjaCBjZWxsIFx7JGNlbGxzXH0ge1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0RG9udFVzZSBcJGNlbGwgdHJ1ZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1hbmQKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIH0KCiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQoKICAgcHJvYyBhZGRfZmlsbGVyX2NlbGxzIHt9IHsKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFRoaXMgcHJvY2VkdXJlIGluc2VydHMgdGllIGhpL2xvIGNlbGxzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZQogICAgICAjIHNldHVwLnRjbAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBzZXQgY29tbWFuZHMgIiIKCiAgICAgIHNldCBjY29tbWFuZHMgIiIKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNjb21tYW5kcyAiIyBBREQgRklMTEVSIENFTExTXG4iCiAgICAgICAgIGFwcGVuZCBjY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICRjY29tbWFuZHMKCiAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddICYmIChbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9kb21haW5zKV0gJiYgKFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDEpKX0gewoKICAgICAgICAgIyBHZXQgdGhlIHNldCBvZiBmaWxsZXIgY2VsbHMgdG8gdXNlLCBib3RoIGRvbWFpbi1zcGVjaWZpYyBhbmQgZ2VuZXJpYy4KCiAgICAgICAgIHNldCBhbGxfZmlsbGVyX2NlbGxzIFtsaXN0XQoKICAgICAgICAgc2V0IGhhc19kZWZhdWx0IGZhbHNlCiAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgZGVmYXVsdF9jZWxscyAkdmFycyhmaWxsZXJfY2VsbHMpfV19IHsKICAgICAgICAgICAgc2V0IGhhc19kZWZhdWx0IHRydWUKICAgICAgICAgICAgbGFwcGVuZCBhbGxfZmlsbGVyX2NlbGxzICR2YXJzKGZpbGxlcl9jZWxscykKICAgICAgICAgfQogICAgICAgICBzZXQgaGFzX3NwZWNpZmljIGZhbHNlCiAgICAgICAgIGZvcmVhY2ggZG9tYWluIFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICIsZmlsbGVyX2NlbGxzIl0gewogICAgICAgICAgICBzZXQgY2VsbHMgJHZhcnMoJGRvbWFpbixmaWxsZXJfY2VsbHMpCiAgICAgICAgICAgIGxhcHBlbmQgYWxsX2ZpbGxlcl9jZWxscyAkdmFycygkZG9tYWluLGZpbGxlcl9jZWxscykKICAgICAgICAgICAgaWYgeyFbbGxlbmd0aCAkY2VsbHNdfSB7CiAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGhhc19zcGVjaWZpYyB0cnVlCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IGZpbGxlcl9jZWxscygkZG9tYWluKSBcW2xpc3QgJGNlbGxzXF1cbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICAgICB9CgogICAgICAgICAjCiAgICAgICAgICMgSWYgdGhlcmUgYXJlIG5vIGZpbGxlciBjZWxscyBhdCBhbGwsIHRoZXJlJ3Mgbm90aGluZyB0byBkbwogICAgICAgICAjCgogICAgICAgICBpZiB7ISRoYXNfZGVmYXVsdCAmJiAhJGhhc19zcGVjaWZpY30gewogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgfQoKICAgICAgICAgc2V0IGFsbF9maWxsZXJfY2VsbHMgW2xzb3J0IC11bmlxdWUgW2pvaW4gJGFsbF9maWxsZXJfY2VsbHNdXQoKICAgICAgICAgIwogICAgICAgICAjIElmIHRoZXJlIGFyZSBubyBkb21haW4tc3BlY2lmaWMgZW50cmllcywgbGlmZSBpcyByZWFsIHNpbXBsZQogICAgICAgICAjCgojICAgICAgICAgaWYgeyEkaGFzX3NwZWNpZmljfSB7CiMgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RmlsbGVyTW9kZSAtY29yZSBcIiRkZWZhdWx0X2NlbGxzXCIgLWNvcmVQcmVmaXggRklMTFxuIgojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9maWxsZXJfbW9kZSAkY29tbWFuZF0KIyAgICAgICAgICAgIGlmIHskYWRkfSB7CiMgICAgICAgICAgICAgICBmb3JlYWNoIGNlbGwgJGRlZmF1bHRfY2VsbHMgewojICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXREb250VXNlICRjZWxsIGZhbHNlXG4iCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJHZhcnMocG93ZXJfZG9tYWlucyldID4gMH0gewojICAgICAgICAgICAgICAgICAgZm9yZWFjaCBkb21haW4gJHZhcnMocG93ZXJfZG9tYWlucykgewojICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICAiICAgY2F0Y2gge2FkZEZpbGxlciAtcG93ZXJEb21haW4gJGRvbWFpbn1cbiIKIyAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkZGVmYXVsdF9jZWxscyB7CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldERvbnRVc2UgJGNlbGwgdHJ1ZVxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQojICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkZGVmYXVsdF9jZWxscyB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldERvbnRVc2UgJGNlbGwgZmFsc2VcbiIKIyAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDB9IHsKICAgICAgICAgICAgICAgc2V0IGRlZmF1bHQgMAogICAgICAgICAgICAgICBmb3JlYWNoIGRvbWFpbiAkdmFycyhwb3dlcl9kb21haW5zKSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLGZpbGxlcl9jZWxscyldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRGaWxsZXJNb2RlIC1jb3JlIFwiJHZhcnMoJGRvbWFpbixmaWxsZXJfY2VsbHMpXCIgLWNvcmVQcmVmaXggRklMTFxuIgogICAgICAgICAgICAgICAgICAgICBzZXQgZGVmYXVsdCAwCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZGVmYXVsdF9jZWxsc119IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyEkZGVmYXVsdH0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RmlsbGVyTW9kZSAtY29yZSBcIiRkZWZhdWx0X2NlbGxzXCIgLWNvcmVQcmVmaXggRklMTFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZGVmYXVsdCAxCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9maWxsZXJfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICAiICAgY2F0Y2gge2FkZEZpbGxlciAtcG93ZXJEb21haW4gJGRvbWFpbn1cbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgICAgICAgICAgICBmb3JlYWNoIGNlbGwgJGRlZmF1bHRfY2VsbHMgewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXREb250VXNlICRjZWxsIHRydWVcbiIKIyAgICAgICAgICAgIH0KIyAgICAgICB9CiAgIH0gZWxzZWlmIHshW2NhdGNoIHtzZXQgY2VsbHMgJHZhcnMoZmlsbGVyX2NlbGxzKX1dfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzZXRGaWxsZXJNb2RlIC1jb3JlIFwiJGNlbGxzXCIgLWNvcmVQcmVmaXggRklMTFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2ZpbGxlcl9tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgc2V0IGNvbW1hbmQgImZvcmVhY2ggY2VsbCBceyRjZWxsc1x9IHtcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICBzZXREb250VXNlIFwkY2VsbCBmYWxzZVxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFkZEZpbGxlclxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImZvcmVhY2ggY2VsbCBceyRjZWxsc1x9IHtcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICBzZXREb250VXNlIFwkY2VsbCB0cnVlXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgJGNvbW1hbmQKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIH0KCiAgICAgIHJldHVybiAkY29tbWFuZHMKICAgfQoKICAgcHJvYyBkZWxldGVfZmlsbGVyX2NlbGxzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUmVtb3ZlIGZpbGxlciBjZWxscwogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCAiZGVsZXRlRmlsbGVyXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZWxldGVfZmlsbGVyX2NlbGxzICRjb21tYW5kXQogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCiAgIHByb2MgaW5zZXJ0X3dlbGx0YXBzX2VuZGNhcHMge3tvdXRsaW5lIGZhbHNlfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbnNlcnQgd2VsbHRhcHMgYW5kIHByZS9wb3N0IGVuZGNhcHMKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgd2FybmluZ3MKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgKFtpbmZvIGV4aXN0IHZhcnMocG93ZXJfZG9tYWlucyldICYmIChbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAwKSl9IHsKCiAgICAgICAgIGlmIHskdmFycyhmbGF0KSA9PSAiZnVsbCJ9IHsKICAgICAgICAgICAgIwogICAgICAgICAgICAjIEp1c3QgbGlrZSB0aWUgYW5kIGZpbGxlciBjZWxscywgd2UgY2FuIGhhdmUgcG93ZXIgZG9tYWluLXNwZWNpZmljCiAgICAgICAgICAgICMgY2VsbHMgYW5kIHNldHRpbmdzIHRoYXQgd2UgbmVlZCB0byB3b3JyeSBhYm91dC4KICAgICAgICAgICAgIwogICAKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpnZXRfcG93ZXJfZG9tYWluc19jb2RlXQogICAKICAgICAgICAgICAgIwogICAgICAgICAgICAjIEdldCB0aGUgc2V0IG9mIGRvbWFpbnMgdGhhdCB3ZSBuZWVkIHRvIHdvcnJ5IGFib3V0CiAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgIHNldCBwcmUgW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgIixwcmVfZW5kY2FwIl0KICAgICAgICAgICAgc2V0IHBvc3QgW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgIixwb3N0X2VuZGNhcCJdCiAgICAgICAgICAgIHNldCBlbmRjYXBzIFtGRjo6bGludGVyc2VjdGlvbiAkcHJlICRwb3N0XQogICAgICAgICAgICBzZXQgd2VsbHRhcHMgW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgIix3ZWxsdGFwcyJdCiAgIAogICAgICAgICAgICAjCiAgICAgICAgICAgICMgRm9yIGV2ZXJ5IGRvbWFpbiBpbiB0aGUgdW5pb24sIHdlIG5lZWQgdG8gaXNzdWUgc3RhdGVtZW50cyBpZiB0aGF0CiAgICAgICAgICAgICMgZG9tYWluIGlzIG9uZSBvZiB0aGUgcG93ZXIgZG9tYWlucyBpbiB0aGUgZGVzaWduCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBOT1RFOiBXZSByZWFsbHkgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpbmRlbnRpbmcgdGhlIGNvbW1hbmRzCiAgICAgICAgICAgICMgICAgICAgdG8gbG9vayBuaWNlIHNpbmNlIHRoZSBvdXRwdXQgcm91dGluZSB3aWxsIGZvcm1hdCBpdCBjb3JyZWN0bHkKICAgICAgICAgICAgIwogICAKICAgICAgICAgICAgc2V0IGRvbWFpbnMgW0ZGOjpsdW5pb24gJGVuZGNhcHMgJHdlbGx0YXBzXQoKICAgICAgICAgICAgZm9yZWFjaCBkb21haW4gJGRvbWFpbnMgewojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtsc2VhcmNoIFwkZG9tYWlucyAkZG9tYWluXF0gIT0gLTF9IHtcbiIKICAgCiAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIyBIYW5kbGUgdGhlIGVuZCBjYXBzCiAgICAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgICAgIHNldCBzdGRfYXJncyAiLXByZWZpeCAkZG9tYWluIC1wb3dlckRvbWFpbiAkZG9tYWluIgogICAgICAgICAgICAgICBzZXQgYWRkICIgICBhZGRFbmRDYXAgJHN0ZF9hcmdzIgogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IHByZSAkdmFycygkZG9tYWluLHByZV9lbmRjYXApfV0gJiYKICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBwb3N0ICR2YXJzKCRkb21haW4scG9zdF9lbmRjYXApfV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIkYWRkIC1wcmVDYXAgJHByZSAtcG9zdENhcCAkcG9zdFxuIgogICAgICAgICAgICAgICB9IGVsc2VpZiB7IVtjYXRjaCB7c2V0IHByZSAkdmFycyhwcmVfZW5kY2FwKX1dICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAhW2NhdGNoIHtzZXQgcG9zdCAkdmFycyhwb3N0X2VuZGNhcCl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiRhZGQgLXByZUNhcCAkcHJlIC1wb3N0Q2FwICRwb3N0XG4iCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIHNldCB0YXBzICIiCiAgICAgICAgICAgICAgIGlmIHtbY2F0Y2gge3NldCB0YXBzICR2YXJzKCRkb21haW4sd2VsbHRhcHMpfV19IHsKICAgICAgICAgICAgICAgICAgY2F0Y2gge3NldCB0YXBzICR2YXJzKHdlbGx0YXBzKX0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHRhcHMgPT0gIiJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcfVxuIgogICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICMgSGFuZGxlIHdlbGwgdGFwcwogICAgICAgICAgICAgICAjCiAgIAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGFkZFdlbGxUYXAgJHN0ZF9hcmdzIC1jZWxsIFxbbGlzdCAkdGFwc1xdIgogICAKICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBpICR2YXJzKCRkb21haW4sd2VsbHRhcHMsY2VsbF9pbnRlcnZhbCl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtY2VsbEludGVydmFsICRpIgogICAgICAgICAgICAgICB9IGVsc2VpZiB7IVtjYXRjaCB7c2V0IGkgJHZhcnMod2VsbHRhcHMsY2VsbF9pbnRlcnZhbCl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtY2VsbEludGVydmFsICRpIgogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IG9mZnNldCAkdmFycygkZG9tYWluLHdlbGx0YXBzLHJvd19vZmZzZXQpfV0gfHwKICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBvZmZzZXQgJHZhcnMod2VsbHRhcHMscm93X29mZnNldCl9XX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtaW5Sb3dPZmZzZXQgJG9mZnNldCIKICAgICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBjaGVja2VyICR2YXJzKCRkb21haW4sd2VsbHRhcHMsY2hlY2tlcmJvYXJkKX1dIHx8CiAgICAgICAgICAgICAgICAgICAhW2NhdGNoIHtzZXQgY2hlY2tlciAkdmFycyh3ZWxsdGFwcyxjaGVja2VyYm9hcmQpfV19IHsKICAgICAgICAgICAgICAgICAgaWYgeyRjaGVja2VyfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1jaGVja2VyYm9hcmQiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuIgogICAKICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAjIEFkZCBhIHZlcmlmeSBzdGVwLCBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgICAgIwogICAKICAgICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBydWxlICR2YXJzKCRkb21haW4sd2VsbHRhcHMsdmVyaWZ5X3J1bGUpfV0gfHwKICAgICAgICAgICAgICAgICAgICFbY2F0Y2gge3NldCBydWxlICR2YXJzKHdlbGx0YXBzLHZlcmlmeV9ydWxlKX1dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAidmVyaWZ5V2VsbFRhcCAtY2VsbHMgXFtsaXN0ICR0YXBzXF0iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1wb3dlckRvbWFpbiAkZG9tYWluIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtcmVwb3J0ICR2YXJzKHJwdF9kaXIpLyRkb21haW4ud2VsbHRhcC5ycHQiCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1ydWxlICRydWxlXG4iCiAgICAgICAgICAgICAgIH0KICAgCiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIwogICAgICAgICAgICAjIFdlJ3ZlIHRha2VuIGNhcmUgb2YgYWxsIG9mIHRoZSBkb21haW5zIHRoYXQgd2UgaGF2ZSBleHBsaWNpdAogICAgICAgICAgICAjIHNldHRpbmdzIGZvci4gIEhvd2V2ZXIsIHdlIG1heSBzdGlsbCBoYXZlIGRvbWFpbnMgaW4gdGhlIGRlc2lnbgogICAgICAgICAgICAjIHRoYXQgd2Uga25vdyBub3RoaW5nIGV4cGxpY2l0IGFib3V0LiAgV2UgbmVlZCB0byBoYW5kbGUgdGhlc2UKICAgICAgICAgICAgIyB3aXRoIGEgZGlmZmVyZW50IHNldCBvZiBjb2RlLgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgV2UgYXJlIGdvaW5nIHRvIGNoZWF0LiAgU2luY2UgdGhlIGNvZGUgd2UgbmVlZCBpcyBhbHJlYWR5IHdyaXR0ZW4KICAgICAgICAgICAgIyAoYmVsb3cpLCB3ZSBhcmUgZ29pbmcgdG8gcmVjdXJzaXZlbHkgY2FsbCB0aGlzIHJvdXRpbmUgdG8gZ2V0CiAgICAgICAgICAgICMgdGhlIHNrZWxldG9uIHRoYXQgd2UgbmVlZCBhbmQgd3JhcCBpdCB1cCBpbnRvIGEgZm9yLWxvb3AuICBUaGlzCiAgICAgICAgICAgICMgc2hvdWxkIGdldCB1cyBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CiAgICAgICAgICAgICMgICAgICAgc2V0IHByb2Nlc3NlZCBbbGlzdCBkb21haW4xIGRvbWFpbjIgZG9tYWluM10KICAgICAgICAgICAgIyAgICAgICBmb3JlYWNoIGRvbWFpbiAkZG9tYWlucyB7CiAgICAgICAgICAgICMgICAgICAgICAgaWYge1tsc2VhcmNoICRwcm9jZXNzZWRfZG9tYWlucyAkZG9tYWluXSA9PSAtMX0gewogICAgICAgICAgICAjICAgICAgICAgICAgIGFkZEVuZENhcCAtcG93ZXJEb21haW4gJGRvbWFpbiAtcHJlZml4ICRkb21haW4gLi4uCiAgICAgICAgICAgICMgICAgICAgICAgICAgYWRkV2VsbFRhcCAtcG93ZXJEb21haW4gJGRvbWFpbiAtcHJlZml4ICRkb21haW4gLi4uCiAgICAgICAgICAgICMgICAgICAgICAgICAgdmVyaWZ5V2VsbFRhcCAtcG93ZXJEb21haW4gJGRvbWFpbiAuLi4KICAgICAgICAgICAgIyAgICAgICAgICB9CiAgICAgICAgICAgICMgICAgICAgfQogICAgICAgICAgICAjCiAgICAgICAgICAgICMgTk9URTogVGhlIG91dHB1dCByb3V0aW5lIHdpbGwgdGFrZSBjYXJlIG9mIG1ha2luZyB0aGlzIGxvb2sgcHJldHR5CiAgICAgICAgICAgICMgICAgICAgYXQgdGhlIGVuZC4gIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaW5kZW50YXRpb24gZm9yCiAgICAgICAgICAgICMgICAgICAgdGhlIGluc2VydGVkIGNvbW1hbmRzCiAgICAgICAgICAgICMKICAgCiMgICAgICAgICAgICBzZXQgc2F2ZSAkdmFycyhjcGZfZmlsZSkKIyAgICAgICAgICAgIHVuc2V0IHZhcnMoY3BmX2ZpbGUpCiMgICAgICAgICAgICBzZXQgZGVmYXVsdF9pbnNlcnQgW2luc2VydF93ZWxsdGFwc19lbmRjYXBzIHRydWVdCiMgICAgICAgICAgICBpZiB7JGRlZmF1bHRfaW5zZXJ0ICE9ICIifSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBwcm9jZXNzZWRfZG9tYWlucyBcW2xpc3QgJGRvbWFpbnNcXVxuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmb3JlYWNoIGRvbWFpbiBcJGRvbWFpbnMge1xuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBpZiB7XFtsc2VhcmNoIFwkcHJvY2Vzc2VkX2RvbWFpbnMgXCRkb21haW5cXSA9PSAtMX0ge1xuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgICAkZGVmYXVsdF9pbnNlcnQiCiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIH1cbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgojICAgICAgICAgICAgfQojICAgICAgICAgICAgc2V0IHZhcnMoY3BmX2ZpbGUpICRzYXZlCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmZfcHJvY3M6Omluc2VydF93ZWxsdGFwc19lbmRjYXBzXG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgIwogICAgICAgICAjIFRoZXJlIGlzIG5vIENQRiBmaWxlIHRoYXQgd2UgbmVlZCB0byB3b3JyeSBhYm91dC4gIEhvd2V2ZXIsIGlmCiAgICAgICAgICMgJG91dGxpbmUgaXMgdHJ1ZSwgaXQgbWVhbnMgdGhhdCB0aGUgY29kZSAoYWJvdmUpIHRoYXQgaGFuZGxlcyBwb3dlcgogICAgICAgICAjIGRvbWFpbnMgY2FsbGVkIHRoaXMgcm91dGluZSByZWN1cnNpdmVseSwgYW5kIHdlIG5lZWQgdG8gY2hhbmdlCiAgICAgICAgICMgdGhlIGNvbW1hbmRzIGEgbGl0dGxlIGJpdCB0byBpbmNsdWRlIHZhcmlhYmxlcyBmb3IgcG93ZXIgZG9tYWlucwogICAgICAgICAjCiAgICAgICAgICMgU3RhcnQgd2l0aCB0aGUgc2ltcGxlIGNhc2U6IGVuZGNhcHMKICAgICAgICAgIwoKICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBwcmUgJHZhcnMocHJlX2VuZGNhcCl9XSAmJgogICAgICAgICAgICAgIVtjYXRjaCB7c2V0IHBvc3QgJHZhcnMocG9zdF9lbmRjYXApfV19IHsKCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiYWRkRW5kQ2FwIC1wcmVDYXAgJHByZSAtcG9zdENhcCAkcG9zdCIKICAgICAgICAgICAgaWYgeyEkb3V0bGluZX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtcHJlZml4IEVORENBUFxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtcHJlZml4IFwkZG9tYWluIC1wb3dlckRvbWFpbiBcJGRvbWFpblxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgICMKICAgICAgICAgIyBOb3cgcHJvY2VzcyB3ZWxsdGFwcwogICAgICAgICAjCgogICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IHRhcHMgJHZhcnMod2VsbHRhcHMpfV19IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJhZGRXZWxsVGFwIC1jZWxsIFxbbGlzdCAkdGFwc1xdIgogICAgICAgICAgICBpZiB7ISRvdXRsaW5lfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1wcmVmaXggV0VMTFRBUCIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLXByZWZpeCBcJGRvbWFpbiAtcG93ZXJEb21haW4gXCRkb21haW4iCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgbWF4X2dhcCAkdmFycyh3ZWxsdGFwcyxtYXhfZ2FwKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1tYXhHYXAgJG1heF9nYXAiCiAgICAgICAgICAgIH0gZWxzZWlmIHshW2NhdGNoIHtzZXQgaW50ZXJ2YWwgJHZhcnMod2VsbHRhcHMsY2VsbF9pbnRlcnZhbCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtY2VsbEludGVydmFsICRpbnRlcnZhbCIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBvZmZzZXQgJHZhcnMod2VsbHRhcHMscm93X29mZnNldCl9XX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAtaW5Sb3dPZmZzZXQgJG9mZnNldCIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3NldCBjaGVja2VyICR2YXJzKHdlbGx0YXBzLGNoZWNrZXJib2FyZCl9XX0gewogICAgICAgICAgICAgICBpZiB7JGNoZWNrZXJ9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgLWNoZWNrZXJib2FyZCIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG4iCgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgSWYgYSB2ZXJpZnkgcmVxdWVzdCBoYXMgYmVlbiBtYWRlLCBjcmVhdGUgdGhlIGNvbW1hbmQgdG8KICAgICAgICAgICAgIyBkbyBzby4gIEFnYWluLCB0YWtlIGludG8gYWNjb3VudCB0aGUgcG90ZW50aWFsIGZvciBhIHJlY3Vyc2l2ZQogICAgICAgICAgICAjIGNhbGwgdG8gdGhpcyByb3V0aW5lLgogICAgICAgICAgICAjCgogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IHJ1bGUgJHZhcnMod2VsbHRhcHMsdmVyaWZ5X3J1bGUpfV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ2ZXJpZnlXZWxsVGFwIC1jZWxscyBcW2xpc3QgJHRhcHNcXSAiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1yZXBvcnQgJHZhcnMocnB0X2RpcikvIgogICAgICAgICAgICAgICBpZiB7ISRvdXRsaW5lfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAid2VsbHRhcC5ycHQiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXCRkb21haW4ud2VsbHRhcC5ycHQgLXBvd2VyRG9tYWluIFwkZG9tYWluIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIC1ydWxlICRydWxlXG4iCiAgICAgICAgICAgIH0gZWxzZWlmIHshJG91dGxpbmV9IHsKIyAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IENhbm5vdCBydW4gdmVyaWZ5V2VsbFRhcCBiZWNhdXNlIHZhcnMod2VsbHRhcHMsdmVyaWZ5X3J1bGUpIGlzIG5vdCBkZWZpbmVkIgogICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJDYW5ub3QgcnVuIHZlcmlmeVdlbGxUYXAgYmVjYXVzZSB2YXJzKHdlbGx0YXBzLHZlcmlmeV9ydWxlKSBpcyBub3QgZGVmaW5lZCIKICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICAjCiAgICAgICMgSWYgd2UgY3JlYXRlZCBhbnkgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQsIHByZWZpeCB0aGUgY29tbWFuZHMgd2l0aCBhCiAgICAgICMgaGVhZGVyCiAgICAgICMKCiAgICAgIGlmIHsoJGNvbW1hbmRzICE9ICIiKSAmJiAhJG91dGxpbmV9IHsKICAgICAgICAgc2V0IGJvZHkgJGNvbW1hbmRzCgogICAgICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgSU5TRVJUSU5HIFdFTExUQVBTIEFORC9PUiBFTkRDQVBTXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkYm9keQogICAgICB9CgogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCiAgIHByb2Mgcm91dGVfc2Vjb25kYXJ5X3BnX25ldHMge30gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgIwogICAgICAjIERvbid0IHRyeSB0byByb3V0ZSB1bmxlc3MgdGhlIHByb3BlciBmbGFncyBhcmUgaW4gcGxhY2UgdG8gZG8gc28KICAgICAgIwoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhyb3V0ZV9zZWNvbmRhcnlfcGdfbmV0cyldIHx8CiAgICAgICAgICAhJHZhcnMocm91dGVfc2Vjb25kYXJ5X3BnX25ldHMpfSB7CiAgICAgICAgIHJldHVybiAiIgogICAgICB9CgogICAgICBzZXQgY29tbWFuZHMgIiMgPEZGPiBST1VUSU5HIFNFQ09OREFSWSBQT1dFUiBORVRTIC4uLlxuIgoKICAgICAgIwogICAgICAjIEVuYWJsZSBnbG9iYWwgcGluIHBhaXJzIChpZiBkZWZpbmVkKQogICAgICAjCgogICAgICBpZiB7W2NhdGNoIHtzZXQgYXJnICR2YXJzKHNlY29uZGFyeV9wZyxjZWxsX3Bpbl9wYWlycyl9XX0gewogICAgICAgICBwdXRzICI8RkY+ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCiAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IE5vIGNlbGwvcGluIHBhaXJzIGRlZmluZWQuICBQbGVhc2UgZGVmaW5lIGNlbGwvcGluIgogICAgICAgICBwdXRzICI8RkY+ICAgICAgICBwYWlycyBpbiB5b3VyIHNldHVwLnRjbCB1c2luZyB0aGUgdmFyaWFibGUiCiAgICAgICAgIHB1dHMgIjxGRj4gICAgICAgIHZhcnMoc2Vjb25kYXJ5X3BnLGNlbGxfcGluX3BhaXJzKSIKICAgICAgICAgcHV0cyAiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICAgICB9CiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRQR1BpblVzZVNpZ25hbFJvdXRlICRhcmdcbiIKCiAgICAgICMKICAgICAgIyBCdWlsZCBjb21tYW5kcyBmb3IgaW5kaXZpZHVhbCBuZXRzIChpZiBkZWZpbmVkKQogICAgICAjCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc2Vjb25kYXJ5X3BnLG5ldHMpXX0gewogICAgICAgICBmb3JlYWNoIG5ldCAkdmFycyhzZWNvbmRhcnlfcGcsbmV0cykgewogICAgICAgICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycygkbmV0LGNlbGxfcGluX3BhaXJzKX1dfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0UEdQaW5Vc2VTaWduYWxSb3V0ZSAkYXJnXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzZXQgbmV0cyAkdmFycyhzZWNvbmRhcnlfcGcsbmV0cykKICAgICAgICAgc2V0IG5ldEZvcm1hdCAiIC1uZXRzICVzIgogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgbmV0cyBbbGlzdCAic2Vjb25kYXJ5X3BnIl0KICAgICAgICAgc2V0IG5ldEZvcm1hdCAiIgogICAgICB9CgogICAgICBmb3JlYWNoIG5ldCAkbmV0cyB7CiAgICAgICAgIHNldCByb3V0ZSAicm91dGVQR1BpblVzZVNpZ25hbFJvdXRlIgogICAgICAgICBhcHBlbmQgcm91dGUgW2Zvcm1hdCAkbmV0Rm9ybWF0ICRuZXRdCiAgICAgICAgIGNhdGNoIHthcHBlbmQgcm91dGUgIiAtcGF0dGVybiAkdmFycygkbmV0LHBhdHRlcm4pIn0KICAgICAgICAgY2F0Y2gge2FwcGVuZCByb3V0ZSAiIC1tYXhGYW5vdXQgJHZhcnMoJG5ldCxtYXhfZmFub3V0KSJ9CiAgICAgICAgIGNhdGNoIHthcHBlbmQgcm91dGUgIiAtbm9uRGVmYXVsdFJ1bGUgJHZhcnMoJG5ldCxub25fZGVmYXVsdF9ydWxlKSJ9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiJHJvdXRlXG4iCiAgICAgIH0KICAgICAgcmV0dXJuICRjb21tYW5kcwogICB9CgogICBwcm9jIGFkZF9wb3dlcl9zd2l0Y2hlcyB7e2RvbWFpbnMgIiJ9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBtYXAKCiAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvbWFwX29wdGlvbnMudGNsCgogICAgICBpZiB7JGRvbWFpbnMgPT0gIiJ9IHsKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpnZXRfcG93ZXJfZG9tYWluc19jb2RlXQojICAgICAgICAgZXZhbCBbRkY6OmdldF9wb3dlcl9kb21haW5zX2NvZGVdCiAgICAgIH0KCiAgICAgIGZvcmVhY2ggZG9tYWluICRkb21haW5zIHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkb21haW4sc3dpdGNoYWJsZSldICYmCiAgICAgICAgICAgICAkdmFycygkZG9tYWluLHN3aXRjaGFibGUpfSB7CiAgICAgICAgICAgIHNldCB0eXBlICR2YXJzKCRkb21haW4sc3dpdGNoX3R5cGUpCgogICAgICAgICAgICBkZWxldGVQb3dlclN3aXRjaCAtJHR5cGUgLXBvd2VyRG9tYWluICRkb21haW4KCiAgICAgICAgICAgIHNldCBjb21tYW5kICJhZGRQb3dlclN3aXRjaCAtcG93ZXJEb21haW4gJGRvbWFpbiAtJHR5cGUiCgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGRvbWFpbixjaGVja2VyX2JvYXJkKV0gJiYKICAgICAgICAgICAgICAgICR2YXJzKCRkb21haW4sY2hlY2tlcl9ib2FyZCl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtY2hlY2tlckJvYXJkIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLGJhY2tfdG9fYmFja19jaGFpbildICYmCiAgICAgICAgICAgICAgICAkdmFycygkZG9tYWluLGJhY2tfdG9fYmFja19jaGFpbil9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtYmFja1RvQmFja0NoYWluIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLGxvb3BfYmFja19hdF9lbmQpXSAmJgogICAgICAgICAgICAgICAgJHZhcnMoJGRvbWFpbixsb29wX2JhY2tfYXRfZW5kKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1sb29wYmFja0F0RW5kIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLGNoZWNrX2hlaWdodCldICYmCiAgICAgICAgICAgICAgICAhJHZhcnMoJGRvbWFpbixjaGVja19oZWlnaHQpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW5vRG91YmxlSGVpZ2h0Q2hlY2siCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkb21haW4sdmVyaWZ5X3Jvd3MpXSAmJgogICAgICAgICAgICAgICAgISR2YXJzKCRkb21haW4sdmVyaWZ5X3Jvd3MpfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW5vUm93VmVyaWZ5IgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZG9tYWluLGVuYWJsZV9jaGFpbildICYmCiAgICAgICAgICAgICAgICAhJHZhcnMoJGRvbWFpbixlbmFibGVfY2hhaW4pfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW5vRW5hYmxlQ2hhaW4iCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcmVhY2ggb3B0aW9uIFthcnJheSBuYW1lcyBtYXBdIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRkb21haW4sJG9wdGlvbildfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLSRtYXAoJG9wdGlvbikgJHZhcnMoJGRvbWFpbiwkb3B0aW9uKSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmQKICAgICAgICAgfQogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX2Nsb2NrX2VjbyB7YXJnc30gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgaWYge1tsbGVuZ3RoICRhcmdzXSAhPSAxfSB7CiAgICAgICAgIHB1dHMgIjxGRj4gSW50ZXJuYWwgZXJyb3IgaW4gcnVuX2Nsb2NrX2Vjby4gIFdyb25nIG51bWJlciBvZiBhcmdzLiIKICAgICAgICAgZXhpdCAtMTExCiAgICAgIH0KCiAgICAgIHNldCBjb21tYW5kcyAiIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gUlVOTklORyBDTE9DSyBFQ09cbiIKICAgICAgc3dpdGNoICRhcmdzIHsKICAgICAgICAgInBvc3Rfcm91dGUiIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OmRlbGV0ZV9maWxsZXJfY2VsbHNdCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2tFQ08gLXBvc3RSb3V0ZSAtdXNlU3BlY0ZpbGVDZWxsc09ubHlcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OmFkZF9maWxsZXJfY2VsbHNdCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2hhbmdlQ2xvY2tTdGF0dXMgLWFsbCAtbm9GaXhlZE5ldFdpcmVzXG4iCiAgICAgICAgIH0KICAgICAgICAgInBvc3RfY3RzIiB7IAogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNrRUNPIC1wb3N0Q1RTIC11c2VTcGVjRmlsZUNlbGxzT25seVxuIgogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICBwdXRzICI8RkY+IEludGVybmFsIGVycm9yIGluIHJ1bl9jbG9ja19lY28uIgogICAgICAgICAgICBwdXRzICI8RkY+IEludmFsaWQgYXJndW1lbnQ7IHZhbGlkIGFyZ3VtZW50cyBhcmUgcG9zdF9jdHMgYW5kIHBvc3Rfcm91dGUuIgogICAgICAgICAgICBleGl0IC0xMTEKICAgICAgICAgfQogICAgICB9CiAgICMgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAjICAgfSBlbHNlIHsKICAgIyAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICMgICB9CiAgIH0KCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyBNYWluIGZvdW5kYXRpb24gZmxvdyBzdGVwIHByb2NlZHVyZXMKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgcHJvYyBydW5fc3luX21hcCB7e2Zvcm1hdCAxfX0gewogICAKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBzZXQgdmFycyhzdGVwKSBzeW5fbWFwCgogICAgICBzZXQgY29tbWFuZHMgIiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicHJvYyBQdXRzIHthcmdzfSB7cHV0cyBcJGFyZ3N9XG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXFtnZXRfYXR0ciBwcm9ncmFtX3ZlcnNpb24gL1xdXG4iCgogICAgICAjIyBlbmFibGUgbXVsdGkgcHJvY2Vzc2luZwogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBob3N0bGlzdCBcW2xyZXBlYXQgJHZhcnMobG9jYWxfY3B1cykgbG9jYWxob3N0XF1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfYXR0cmlidXRlIHN1cGVyX3RocmVhZF9zZXJ2ZXJzIFwkaG9zdGxpc3QgL1xuIgogICAgIAogICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxudW06OmVuYWJsZV9tZXRyaWNzIC1vblxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjpwdXNoX3NuYXBzaG90X3N0YWNrXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3N5bl9zZXR1cF90Y2xdCiAgICAgIAogICAgICAgICBzZXQgY29tbWFuZCAic2V0X2F0dHJpYnV0ZSBpbmZvcm1hdGlvbl9sZXZlbCAxIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9hdHRyaWJ1dGUgc291cmNlX3ZlcmJvc2UgZmFsc2UgL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2F0dHJpYnV0ZSAtcXVpZXQgcHJpbnRfZXJyb3JfaW5mbyBmYWxzZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfYXR0cmlidXRlIC1xdWlldCBlY2hvX2NvbW1hbmRzIGZhbHNlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9hdHRyaWJ1dGUgbWVzZ19jb2xvcmluZyBmYWxzZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfYXR0cmlidXRlIHFvc19yZXBvcnRfYmFzaWNfY29zdF9ncm91cHMgdHJ1ZSAvXG4iCgogICAgICAgICBzZXQgY29tbWFuZCAic2V0X2F0dHJpYnV0ZSBsaWJfbGVmX2NvbnNpc3RlbmN5X2NoZWNrX2VuYWJsZSB0cnVlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9hdHRyaWJ1dGUgc2NyaXB0X3NlYXJjaF9wYXRoIHsuL30gL1xuIgogICAgICAKICAgICAgYXBwZW5kIGNvbW1hbmQgInN1cHByZXNzX21lc3NhZ2VzIHtMQlItMzAgTEJSLTMxIExCUi0xNzAgTEJSLTcyIExCUi0xNTUgUEhZUy0yMTAgUEhZUy0yNTYgTEJSLTIwMSBMQlItMzQgTEJSLTgzIExCUi00MCBMQlItMTYyIExCUi0xMjJ9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZWRpcmVjdCAvZGV2L251bGwge3NldCBtYXBfZmFuY3lfbmFtZXMgMX1cbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3Rfc3luX3NldHVwX3RjbF0KICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9zeW5fbG9hZF9saWJfdGNsXQogICAgICAKICAgICAgc2V0IGNvbW1hbmQgIlxuc2V0X2F0dHJpYnV0ZSBsaWJyYXJ5IFwiXFxcbiIKICAgICAgZm9yZWFjaCBsaWIgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICRsaWIgXFxcbiIKICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZCAiXCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfbGliICRjb21tYW5kXQogICAgICAKICAgICAgc2V0IGNvbW1hbmQgIlxuc2V0X2F0dHJpYnV0ZSBsZWZfbGlicmFyeSBcIlxcXG4iCiAgICAgIGZvcmVhY2ggbGVmICR2YXJzKGxlZl9maWxlcykgewogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgJGxlZiBcXFxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kICJcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9sZWYgJGNvbW1hbmRdCiAgICAgIAogICAgICBzZXQgY29tbWFuZCAiXG5zZXRfYXR0cmlidXRlIHFyY190ZWNoX2ZpbGUgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLHJjX2Nvcm5lcikscXhfdGVjaF9maWxlKVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9xcmMgJGNvbW1hbmRdCiAgICAgIAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZG9udF91c2VfbGlzdCldICYmICR2YXJzKGRvbnRfdXNlX2xpc3QpICE9ICIiIH0gewogICAgICAgICBmb3JlYWNoIGNlbGwgJHZhcnMoZG9udF91c2VfbGlzdCkgewogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfYXR0cmlidXRlIGF2b2lkIHRydWUgXFtmaW5kIC8gLWxpYmNlbGwgJGNlbGxcXVxuIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3Rfc3luX2xvYWRfbGliX3RjbF0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX3Bvd2VyX2ludGVudCAtbW9kdWxlICR2YXJzKGRlc2lnbikgLWNwZiAkdmFycyhjcGZfZmlsZSlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfcG93ZXJfaW50ZW50ICRjb21tYW5kXQogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWVlZTE4MDFfZmlsZSldfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX3Bvd2VyX2ludGVudCAtbW9kdWxlICR2YXJzKGRlc2lnbikgLTE4MDEgJHZhcnMoaWVlZTE4MDFfZmlsZSlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfcG93ZXJfaW50ZW50ICRjb21tYW5kXQogICAgICB9CiAgICAgCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhoZGxfc2VhcmNoX3BhdGgpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9hdHRyaWJ1dGUgaGRsX3NlYXJjaF9wYXRoIFwiJHZhcnMoaGRsX3NlYXJjaF9wYXRoKVwiIC9cbiIKICAgICAgfSAKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhkbF9maWxlX2xpc3QpXX0gewogICAgICAgICBzZXQgY29tbWFuZCAicmVhZF9oZGwgLXYyMDAxIFwiJHZhcnMoaGRsX2ZpbGVfbGlzdClcIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9oZGwgJGNvbW1hbmRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHN5bl9sb2FkX3J0bF90Y2xdCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG4jc2V0IHJlYWRfZGVmX2xpYmNlbGxfbWlzbWF0Y2hfZXJyb3IgMFxuIgogICAgIAogICAgICBpZiB7MH0gewogICAgICAgICBzZXQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgZ2VuX21vZHVsZV9wcmVmaXggICAgICAgICAgICAgICAgX1JDXyAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBoZGxfYXJyYXlfbmFtaW5nX3N0eWxlICAgICAgICAgICAlc18lZCAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBoZGxfcmVnX25hbWluZ19zdHlsZSAgICAgICAgICAgICAlc19yZWclcyAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBoZGxfdXNlX2lmX2dlbmVyYXRlX3ByZWZpeCAgICAgICBmYWxzZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBoZGxfdXNlX2Zvcl9nZW5lcmF0ZV9wcmVmaXggICAgICB0cnVlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGhkbF91c2VfYmxvY2tfcHJlZml4ICAgICAgICAgICAgIGZhbHNlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGhkbF9tYXhfbG9vcF9saW1pdCAgICAgICAgICAgICAgIDgwOTYgL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgaGRsX2dlbmVyYXRlX2luZGV4X3N0eWxlICAgICAgICAgJXNfJWRfIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGhkbF9nZW5lcmF0ZV9zZXBhcmF0b3IgICAgICAgICAgIF8gL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgaGRsX2luc3RhbmNlX2FycmF5X25hbWluZ19zdHlsZSAgJXNfJWRfIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGhkbF9wYXJhbWV0ZXJfbmFtaW5nX3N0eWxlICAgICAgIF8lcyVkIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGhkbF9yZWNvcmRfbmFtaW5nX3N0eWxlICAgICAgICAgICVzXFslc1xdIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGhkbF91c2VfdGVjaGVsdF9maXJzdCAgICAgICAgICAgIHRydWUgL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgaGRsX2Vycm9yX29uX2JsYWNrYm94ICAgICAgICAgICAgdHJ1ZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBoZGxfdHJhY2tfZmlsZW5hbWVfcm93X2NvbCAgICAgICBmYWxzZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBoZGxfZW5hYmxlX3Byb2NfbmFtZSAgICAgICAgICAgICBmYWxzZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBoZGxfZXJyb3Jfb25fbGF0Y2ggICAgICAgICAgICAgICBmYWxzZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBoZGxfdW5jb25uZWN0ZWRfaW5wdXRfcG9ydF92YWx1ZSBub25lIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGhkbF91bmRyaXZlbl9vdXRwdXRfcG9ydF92YWx1ZSAgIG5vbmUgL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgaGRsX3VuZHJpdmVuX3NpZ25hbF92YWx1ZSAgICAgICAgbm9uZSAvXG4iCiAgICAgIH0KICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfaGRsX2F0dHJpYnV0ZXMgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfc3luX2xvYWRfZWxhYl90Y2xdCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgIlxuZWxhYm9yYXRlICR2YXJzKGRlc2lnbilcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3Rfc3luX2xvYWRfZWxhYl90Y2xdCgogICAgICBhcHBlbmQgY29tbWFuZHMgIndyaXRlX2RiICR2YXJzKGRlc2lnbikgLWFsbF9yb290X2F0dHJpYnV0ZXMgLXRvX2ZpbGUgJHZhcnMoZGJzX2RpcikvZWxhYi5kYlxuIgogICAgICAKICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZWRpcmVjdCAkdmFycyhycHRfZGlyKS9jaGVja19kZXNpZ24ucnB0IHsgY2hlY2tfZGVzaWduIC1tdWx0aWRyaXZlbiAtdW5kcml2ZW4gLXVucmVzb2x2ZWQgfVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlZGlyZWN0ICR2YXJzKHJwdF9kaXIpL3JlcG9ydF9kYXRhcGF0aC5ycHQgeyByZXBvcnQgZGF0YXBhdGggLWFsbCAtbWF4X3dpZHRoIHt7ZmlsZW5hbWUgNTEyfX0gfVxuIgogICAgICAKICAgICAgCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiNzZXQgdHJlYXRfaW52YWxpZF9mcm9tX3RvX2FzX3Rocm91Z2ggMVxuIgogICAgIAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xvY2tfZ2F0ZV9jZWxscyldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfYXR0cmlidXRlIGxwX2Nsb2NrX2dhdGluZ19jZWxsIFxbZmluZCAvbGliKiAtbGliY2VsbCAkdmFycyhjbG9ja19nYXRlX2NlbGxzKVxdIC9kZXNpZ25zLypcblxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2F0dHJpYnV0ZSBscF9pbnNlcnRfY2xvY2tfZ2F0aW5nICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgL1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X2Nsb2NrX2dhdGluZyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGxlYWthZ2VfcG93ZXJfZWZmb3J0KV0gJiYgKCR2YXJzKGxlYWthZ2VfcG93ZXJfZWZmb3J0KSAhPSAibm9uZSIpfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzZXRfYXR0cmlidXRlIGxwX211bHRpX3Z0X29wdGltaXphdGlvbl9lZmZvcnQgICAgICAgICAgICAgICAgJHZhcnMobGVha2FnZV9wb3dlcl9lZmZvcnQpIC9cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGxlYWthZ2VfcG93ZXJfZWZmb3J0ICRjb21tYW5kXQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBscF9pbnNlcnRfb3BlcmFuZF9pc29sYXRpb24gICAgICAgICAgICAgICAgICAgIGZhbHNlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGxwX3Bvd2VyX2FuYWx5c2lzX2VmZm9ydCAgICAgICAgICAgICAgICAgICAgICAgbG93IC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGxwX2Nsb2NrX2dhdGluZ19oaWVyYXJjaGljYWwgICAgICAgICAgICAgICAgICAgZmFsc2UgL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgbHBfY2xvY2tfZ2F0aW5nX2F1dG9fY29zdF9ncm91cF9pbml0aWFsX3RhcmdldCAwIC9kZXNpZ25zLypcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGxwX2Nsb2NrX2dhdGluZ19tYXhfZmxvcHMgICAgICAgICAgICAgICAgICAgICAgaW5maW5pdHkgL2Rlc2lnbnMvJHZhcnMoZGVzaWduKVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgbHBfY2xvY2tfZ2F0aW5nX21pbl9mbG9wcyAgICAgICAgICAgICAgICAgICAgICAzIC9kZXNpZ25zLyR2YXJzKGRlc2lnbilcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGxwX2Nsb2NrX2dhdGluZ19hdXRvX3BhdGhfYWRqdXN0ICAgICAgICAgICAgICAgZml4ZWQgL2Rlc2lnbnMvKlxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgbHBfY2xvY2tfZ2F0aW5nX2F1dG9fcGF0aF9hZGp1c3RfZml4ZWRfZGVsYXkgICAxNzUgL2Rlc2lnbnMvKlxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9pY2dfYXR0cmlidXRlcyAkY29tbWFuZF0KCiMgICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgbHBfcG93ZXJfb3B0aW1pemF0aW9uX3dlaWdodCBcIlwiIC9kZXNpZ25zLypcbiIKCiAgICAgIAogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBERlQgU2V0dGluZ3MKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHNldCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBkZnRfc2Nhbl9tYXBfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZV9hbGwgL2Rlc2lnbnMvJHZhcnMoZGVzaWduKVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgZGZ0X3NjYW5fc3R5bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV4ZWRfc2NhbiAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBkZnRfcHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERlRfIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIHVzZV9zY2FuX3NlcXNfZm9yX25vbl9kZnQgICAgICAgICAgICAgICAgIHRydWUgL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgZGZ0X3NjYW5fbWFwX21vZGUgZm9yY2VfYWxsICAgICAgICAgICAgICAgL2RlcyovKlxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgZGZ0X2Nvbm5lY3Rfc2hpZnRfZW5hYmxlX2R1cmluZ19tYXBwaW5nICAgdGllX29mZiAvZGVzaWducy8qXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBkZnRfY29ubmVjdF9zY2FuX2RhdGFfcGluc19kdXJpbmdfbWFwcGluZyBsb29wYmFjayAvZGVzaWducy8qXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBkZnRfc2Nhbl9vdXRwdXRfcHJlZmVyZW5jZSAgICAgICAgICAgICAgICBub25faW52ZXJ0ZWQgL2Rlc2lnbnMvKlxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgZGZ0X2xvY2t1cF9lbGVtZW50X3R5cGUgICAgICAgICAgICAgICAgICAgZWRnZV9zZW5zaXRpdmUgL2Rlc2lnbnMvKlxuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgZGZ0X21peF9jbG9ja19lZGdlc19pbl9zY2FuX2NoYWlucyAgICAgICAgZmFsc2UgL2Rlc2lnbnMvKlxuIgogICAgICAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9kZnRfYXR0cmlidXRlcyAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHN5bl9zZXR1cF9kZnRfdGNsXQoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgIyMgUkMgdGltaW5nIHN0aWxsIGNvbWVzIGZyb20gY3BmLCBJbm5vdnVzIHRpbWluZyBjb21lcyBmcm9tIHNldHVwLnRjbAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewogICAgICAgIGFwcGVuZCBjb21tYW5kICJhcHBseV9wb3dlcl9pbnRlbnQgLXN1bW1hcnlcbiIKICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksYXBwbHlfcG93ZXJfaW50ZW50ICRjb21tYW5kXQogICAgICB9IGVsc2UgewogICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgbW9kZSBbbGluZGV4ICR2YXJzKGNvbnN0cmFpbnRfbW9kZXMpIDBdXG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmQgImlmIHsgXFtmaW5kIC8gLW1vZGUgXCRtb2RlIFxdID09IFwiXCJ9IHtcbiIKICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgY3JlYXRlX21vZGUgLWRlZmF1bHQgLW5hbWUgXCRtb2RlXG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKICAgICAgICBmb3JlYWNoIG1vZGUgW2xyYW5nZSAkdmFycyhjb25zdHJhaW50X21vZGVzKSAxIGVuZF0gewogICAgICAgIH0KICAgICAgICAjIyBOb3cgcG9wdWxhdGUgdGhlIHRpbWluZyBtb2RlcwogICAgICAgIGZvcmVhY2ggbW9kZSAkdmFycyhjb25zdHJhaW50X21vZGVzKSB7CiAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG1vZGUsc3ludGhfc2RjKV19IHsKICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJpZiB7IFxbZmluZCAvIC1tb2RlICRtb2RlXF0gPT0gXCJcIiB9IHtcbiIKICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICBjcmVhdGVfbW9kZSAtbmFtZSAkbW9kZVxuIgogICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX3NkYyAtbW9kZSAkbW9kZSAkdmFycygkbW9kZSxzeW50aF9zZGMpXG4iCiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkbW9kZSxwcmVfY3RzX3NkYyldfSB7CiAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiaWYgeyBcW2ZpbmQgLyAtbW9kZSAkbW9kZVxdID09IFwiXCIgfSB7XG4iCiAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgY3JlYXRlX21vZGUgLW5hbWUgJG1vZGVcbiIKICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iCiAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9zZGMgLW1vZGUgJG1vZGUgJHZhcnMoJG1vZGUscHJlX2N0c19zZGMpXG4iCiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGFwcGx5X2NvbnN0cmFpbnRzICRjb21tYW5kXQogICAgICAgIGFwcGVuZCBjb21tYW5kICJwdXRzIFwiVGhlIG51bWJlciBvZiBleGNlcHRpb25zIGlzIFxbbGxlbmd0aCBcW2ZpbmQgLyAtZXhjZXB0aW9uICpcXVxdXCJcbiIKCiAgICAgICAgICAgc2V0IGNvbW1hbmQgIlxuZGVmaW5lX2Nvc3RfZ3JvdXAgLW5hbWUgaW4yb3V0XG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmQgImRlZmluZV9jb3N0X2dyb3VwIC1uYW1lIGluMnJlZ1xuIgogICAgICAgIGFwcGVuZCBjb21tYW5kICJkZWZpbmVfY29zdF9ncm91cCAtbmFtZSByZWcyb3V0XG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmQgImRlZmluZV9jb3N0X2dyb3VwIC1uYW1lIHJlZzJyZWdcbiIKCiAgICAgICAgc2V0IG1vZGUgW2xpbmRleCAkdmFycyhjb25zdHJhaW50X21vZGVzKSAwXQogICAgICAgIGFwcGVuZCBjb21tYW5kICJwYXRoX2dyb3VwIC1tb2RlICRtb2RlIC1mcm9tIFxbYWxsOjphbGxfaW5wc1xdIC10byBcW2FsbDo6YWxsX291dHNcXSAtZ3JvdXAgaW4yb3V0IC1uYW1lIGluMm91dFxuIgogICAgICAgIGFwcGVuZCBjb21tYW5kICJwYXRoX2dyb3VwIC1tb2RlICRtb2RlIC1mcm9tIFxbYWxsOjphbGxfaW5wc1xdIC10byBcW2FsbDo6YWxsX3NlcXNcXSAtZ3JvdXAgaW4ycmVnIC1uYW1lIGluMnJlZ1xuIgogICAgICAgIGFwcGVuZCBjb21tYW5kICJwYXRoX2dyb3VwIC1tb2RlICRtb2RlIC1mcm9tIFxbYWxsOjphbGxfc2Vxc1xdIC10byBcW2FsbDo6YWxsX291dHNcXSAtZ3JvdXAgcmVnMm91dCAtbmFtZSByZWcyb3V0XG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBhdGhfZ3JvdXAgLW1vZGUgJG1vZGUgLWZyb20gXFthbGw6OmFsbF9zZXFzXF0gLXRvIFxbYWxsOjphbGxfc2Vxc1xdIC1ncm91cCByZWcycmVnIC1uYW1lIHJlZzJyZWdcbiIKCiAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9wYXRoX2dyb3VwcyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgc2V0IGZpcnN0IDEKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZl9maWxlcyldfSB7CiAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhkZWZfZmlsZXMpIHsKICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgaWYgeyRmaXJzdH0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmVhZF9kZWYgJGZpbGVcbiIKICAgICAgICAgICAgICAgICAgc2V0IGZpcnN0IDAKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJyZWFkX2RlZiAtaW5jciAkZmlsZVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9kZWYgJGNvbW1hbmRdCiAgICAgIH0KICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicmVwb3J0IHRpbWluZyAtbGludFxuIgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG1heF9yb3V0ZV9sYXllcildfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG5zZXRfYXR0cmlidXRlIG51bWJlcl9vZl9yb3V0aW5nX2xheWVycyAkdmFycyhtYXhfcm91dGVfbGF5ZXIpIGRlc2lnbnMvJHZhcnMoZGVzaWduKVxuIgogICAgICB9CgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjZm9yZWFjaCBjZyBcW2ZpbmQgLyAtY29zdF9ncm91cCAqXF0ge1xuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjICByZXBvcnQgdGltaW5nIC1jb3N0X2dyb3VwIFtsaXN0IFwkY2ddID4+ICR2YXJzKHJwdF9kaXIpL2Nvc3RfZ3JvdXAubWFwLnJwdFxuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjfVxuIgogICAgICAKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiI3NldF9yZW1vdmVfYXNzaWduX29wdGlvbnMgLXNraXBfdW5jb25zdHJhaW5lZF9wYXRocyAtcGh5c2ljYWxcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiI3NldF9hdHRyaWJ1dGUgdXRpbGl6YXRpb24gMCBcW2ZpbmQgLyAtbGF5ZXIgTTFcXVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3N5bl9nZW5fdGNsXQoKICAgICAgc2V0IGNvbW1hbmQgIlxuc3ludGhlc2l6ZSAtdG9fZ2VuZXJpYyAtZWZmb3J0IG1lZGl1bVxuXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzeW4yZ2VuICRjb21tYW5kXQogICAgICAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9zeW5fZ2VuX3RjbF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAid3JpdGVfZGIgJHZhcnMoZGVzaWduKSAtYWxsX3Jvb3RfYXR0cmlidXRlcyAtdG9fZmlsZSAkdmFycyhkYnNfZGlyKS9zeW5fZ2VuLmRiXG4iCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgInJlZGlyZWN0IC10ZWUgJHZhcnMocnB0X2RpcikvcmVwb3J0X21ldHJpYy5zeW5fZ2VuLnJwdCB7IHJlcG9ydCBxb3IgLW5vcG93ZXIgfVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlZGlyZWN0IC1hcHBlbmQgJHZhcnMocnB0X2RpcikvcmVwb3J0X21ldHJpYy5zeW5fZ2VuLnJwdCB7IHJlcG9ydCB0aW1pbmcgLWZ1bGwgLW51bSAyNTAgLWVuZCB9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicmVkaXJlY3QgLWFwcGVuZCAkdmFycyhycHRfZGlyKS9yZXBvcnRfbWV0cmljLnN5bl9nZW4ucnB0IHsgcmVwb3J0IHRpbWluZyAtZnVsbCAtbnVtIDI1IH1cbiIKICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiZ2VuZXJhdGVfcmVwb3J0cyAtdGFnIHN5bl9nZW4gLW91dGRpciAkdmFycyhycHRfZGlyKVxuIgoKICAgICAgc2V0IGNvbW1hbmQgIlxuc3ludGhlc2l6ZSAtdG9fbWFwIC1lZmZvcnQgaGlnaCAtY2xvY2tfZ2F0aW5nX29ubHlcblxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3luMmljZyAkY29tbWFuZF0KICAgICAgCiMgICAgICBzZXQgY2dfY2VsbHMgIlxuIgojICAgICAgZm9yZWFjaCBpIFtmaWx0ZXIgbGliY2VsbCAtaW52ZXJ0ICIiIFtmaW5kIC8gLWluc3QgaW5zdGFuY2VzX3NlcS8qXV0gewojICAgICAgIGlmIHtbZ2V0X2F0dHIgY2xvY2tfZ2F0aW5nX2ludGVncmF0ZWRfY2VsbCBbZ2V0X2F0dHIgbGliY2VsbCAkaV1dICE9ICIiIH0gewojICAgICAgICAgbGFwcGVuZCBjZ19jZWxscyAkaQojICAgICAgIH0KIyAgICAgIH0KIyAgICAgIGlmIHsgJGNnX2NlbGxzICE9ICIiIH0gewojICAgICAgICBzZXQgQ0dfQURKVVNUIFtwYXRoX2FkanVzdCAtZGVsYXkgLTE1MCAtdG8gJGNnX2NlbGxzXQojICAgICAgfQogICAgICAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3N5bl9tYXBfdGNsXQogICAgICAKICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtsbGVuZ3RoIFxbZmluZCAtbW9kZSAqXF1cXSA+IDB9IHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgIHJlZGlyZWN0ICR2YXJzKHJwdF9kaXIpL3JlcG9ydF90aW1pbmdfbGludC5lbGFiLmd6IHsgcmVwb3J0IHRpbWluZyAtbGludCAtdmVyYm9zZSAtbW9kZSBcW2xpbmRleCBcW2ZpbmQgLW1vZGUgKlxdIDBcXSB9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifSBlbHNlIHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgIHJlZGlyZWN0ICR2YXJzKHJwdF9kaXIpL3JlcG9ydF90aW1pbmdfbGludC5lbGFiLmd6IHsgcmVwb3J0IHRpbWluZyAtbGludCAtdmVyYm9zZSB9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlZGlyZWN0ICR2YXJzKHJwdF9kaXIpL3JlcG9ydF9zZXF1ZW50aWFsLmVsYWIucnB0Lmd6IHsgcmVwb3J0IHNlcXVlbnRpYWwgLWhpZXIgfVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlZGlyZWN0ICR2YXJzKHJwdF9kaXIpL3JlcG9ydF9jZG5fbG9vcF9icmVha2Vycy5lbGFiLnJwdC5neiB7IHJlcG9ydCBjZG5fbG9vcF9icmVha2VyIH1cbiIKICAgICAgICAgIAogICAgICAjIFN5bnRoZXNpemluZyB0byBnYXRlcyB1c2luZyBlZmZvcnQgbGV2ZWwgZGVmaW5lZCBieSB2YXJzKHN5bl9tYXBfZWZmb3J0KS4KICAgICAgc2V0IGNvbW1hbmQgIlxuc3ludGhlc2l6ZSAtdG9fbWFwcGVkIC1lZmZvcnQgaGlnaCAtbm9faW5jcmVtZW50YWxcblxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHN5bjJtYXAgJGNvbW1hbmRdCiAgICAgIAogICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjpwb3Bfc25hcHNob3Rfc3RhY2tcbiIKICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTZ9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNvbXB1dGVfbWV0cmljcyldICYmICR2YXJzKGNvbXB1dGVfbWV0cmljcyl9IHsKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKSAtY2F0ZWdvcmllcyBcW2RpY3QgZ2V0IFxbZ2V0X2F0dHIgbWV0cmljX2NhdGVnb3J5X3N0YXR1c19tYXBcXSBcW2dldF9hdHRyIHN0YXRlIFxbZmluZCAvIC1kZXNpZ24gKlxdXF1cXVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY3JlYXRlX3NuYXBzaG90IC1uYW1lICR2YXJzKHN0ZXApIC1jYXRlZ29yaWVzIGRlc2lnblxuIgogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcClcbiIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZCAidW06OnNhdmVfbWV0cmljX2ZpbGUgJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkudW1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInVtOjpyZXBvcnRfbWV0cmljIC1maWxlICR2YXJzKHJwdF9kaXIpLyR2YXJzKGRlc2lnbikuaHRtbCAtZm9ybWF0IGh0bWxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9zbmFwc2hvdCAkY29tbWFuZF0KICAgICAgfQoKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAid3JpdGVfZGIgJHZhcnMoZGVzaWduKSAtYWxsX3Jvb3RfYXR0cmlidXRlcyAtdG9fZmlsZSAkdmFycyhkYnNfZGlyKS9zeW5fbWFwLmRiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAid3JpdGVfZGIgJHZhcnMoZGVzaWduKSAtYWxsX3Jvb3RfYXR0cmlidXRlcyAtdG9fZmlsZSAkdmFycyhkYnNfZGlyKS9zeW5fbWFwLmRiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAid3JpdGVfaGRsIFxbZmluZCAvIC1kZXNpZ24gJHZhcnMoZGVzaWduKVxdID4gJHZhcnMoZGJzX2Rpcikvc3luX21hcC52Lmd6XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAid3JpdGVfaGRsIFxbZmluZCAvIC1kZXNpZ24gJHZhcnMoZGVzaWduKVxdIC1sZWMgPiAkdmFycyhsZWNfZGlyKS9zeW5fbWFwLkxFQ09OTFkudi5nelxuIgogICAgICAKICAgICAgIyBXcml0ZSBvdXQgUlRMIHZlcnN1cyBtYXBwZWQgTEVDIGRvZmlsZQogICAgICBhcHBlbmQgY29tbWFuZHMgIndyaXRlX2RvX2xlYyAtcmV2aXNlZCAkdmFycyhsZWNfZGlyKS9zeW5fbWFwLkxFQ09OTFkudi5neiAgLWxvZ2ZpbGUgcnRsMm1hcC5sb2cgID4gJHZhcnMobGVjX2RpcikvcnRsMm1hcC5kb2ZcbiIKCiAgICAgICAgIHNldCBjb21tYW5kICJyZWRpcmVjdCAkdmFycyhsZWNfZGlyKS9kZWxldGVkX3NlcXVlbnRpYWxzLnJwdCB7cmVwb3J0IHNlcXVlbnRpYWwgLWRlbGV0ZWRfc2Vxc31cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlZGlyZWN0IC10ZWUgJHZhcnMocnB0X2Rpcikvc3luX21hcC5xb3IucnB0IHsgcmVwb3J0IHFvciAtbm9wb3dlciB9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZWRpcmVjdCAtYXBwZW5kICR2YXJzKHJwdF9kaXIpL3N5bl9tYXAucW9yLnJwdCB7IHJlcG9ydCB0aW1pbmcgLWZ1bGwgLW51bSAyNTAgLWVuZCB9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJyZWRpcmVjdCAtYXBwZW5kICR2YXJzKHJwdF9kaXIpL3N5bl9tYXAucW9yLnJwdCB7IHJlcG9ydCB0aW1pbmcgLWZ1bGwgLW51bSAyNSB9XG4iCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZCAiZ2VuZXJhdGVfcmVwb3J0cyAtdGFnIHN5bl9tYXAgLW91dGRpciAkdmFycyhycHRfZGlyKVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGdlbmVyYXRlX3JlcG9ydHMgJGNvbW1hbmRdCiAgICAgCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhtYWlsLHRvKV19IHsKICAgICAgICAgc2V0IHN1bW1hcnlfZmlsZSAkdmFycyhzdGVwKS5xb3IucnB0CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobWFpbCxzdGVwcyldIHx8IFwKICAgICAgICAgICAgIChbaW5mbyBleGlzdHMgdmFycyhtYWlsLHN0ZXBzKV0gJiYgKFtsc2VhcmNoICR2YXJzKG1haWwsc3RlcHMpICR2YXJzKHN0ZXApXSAhPSAtMSkpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcIjxGRj4gTUFJTElORyBSRVNVTFRTIFRPICR2YXJzKG1haWwsdG8pXCJcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtmaWxlIGV4aXN0cyAkdmFycyhycHRfZGlyKS8kc3VtbWFyeV9maWxlXF19IHtcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBleGVjIC9iaW4vbWFpbCAtcyBcIkZGOiAkdmFycyhkZXNpZ24pLCAkdmFycyhzdGVwKSBjb21wbGV0ZWQgKFxbc2ggcHdkXF0pXCIgPCAkdmFycyhycHRfZGlyKS8kc3VtbWFyeV9maWxlICR2YXJzKG1haWwsdG8pXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifSBlbHNlaWYge1xbZmlsZSBleGlzdHMgJHZhcnMocnB0X2RpcikvJHtzdW1tYXJ5X2ZpbGV9Lmd6XF19IHtcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBleGVjIGd1bnppcCAtYyAkdmFycyhycHRfZGlyKS8ke3N1bW1hcnlfZmlsZX0uZ3ogXHwgL2Jpbi9tYWlsIC1zIFwiRkY6ICR2YXJzKGRlc2lnbiksICR2YXJzKHN0ZXApIGNvbXBsZXRlZCAoXFtwd2RcXSlcIiAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyAvYmluL21haWwgLXMgXCJGRjogJHZhcnMoZGVzaWduKSwgJHZhcnMoc3RlcCkgY29tcGxldGVkIChcW3NoIHB3ZFxdKVwiIDwgL2Rldi9udWxsICR2YXJzKG1haWwsdG8pXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbaW5mbyBleGlzdHMgZW52KFZQQVRIKVxdfSB7IgogICAgICBhcHBlbmQgY29tbWFuZHMgImV4ZWMgL2Jpbi90b3VjaCBcJGVudihWUEFUSCkvJHZhcnMoc3RlcCkiCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgoKICAgICAgcmV0dXJuICRjb21tYW5kcwoKICAgfQoKICAgcHJvYyBydW5fc3luX2luY3Ige3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgc2V0IHZhcnMoc3RlcCkgc3luX2luY3IKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwcm9jIFB1dHMge2FyZ3N9IHtwdXRzIFwkYXJnc31cbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcW2dldF9hdHRyIHByb2dyYW1fdmVyc2lvbiAvXF1cbiIKICAgICAKICAgICAgIyMgZW5hYmxlIG11bHRpIHByb2Nlc3NpbmcKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgaG9zdGxpc3QgXFtscmVwZWF0ICR2YXJzKGxvY2FsX2NwdXMpIGxvY2FsaG9zdFxdXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2F0dHJpYnV0ZSBzdXBlcl90aHJlYWRfc2VydmVycyBcJGhvc3RsaXN0IC9cbiIKICAgICAKICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbnVtOjplbmFibGVfbWV0cmljcyAtb25cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bTo6cHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICB9CiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfc3luX2luY3JfdGNsXQogICAgICAKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2F0Y2ggeyBzZXRfcmVtb3ZlX2Fzc2lnbl9vcHRpb25zIC1za2lwX3VuY29uc3RyYWluZWRfcGF0aHMgLXBoeXNpY2FsIH1cbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2F0dHJpYnV0ZSByZW1vdmVfYXNzaWducyB0cnVlIC9cbiIKICAgICAgCiAgICAgIGlmIHskdmFycyhlbmFibGVfcGFtKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuc2V0X2F0dHJpYnV0ZSBwaHlzaWNhbF9hd2FyZV9yZXN0cnVjdHVyaW5nIHRydWUgL2RlcyovKlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9hdHRyaWJ1dGUgcGh5c2ljYWxfYXdhcmVfc3RydWN0dXJpbmcgICB0cnVlIC9kZXMqLypcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfYXR0cmlidXRlIHBoeXNpY2FsX2F3YXJlX21hcHBpbmcgICAgICAgdHJ1ZSAvZGVzKi8qXG4iCiAgICAgIH0KICAgICAgCiAgICAgICMjIyMgT1BUSU1JWkFUSU9OIEVGRk9SVCBDT05UUk9MCiAgICAgIGlmIHskdmFycyhoaWdoX3RpbWluZ19lZmZvcnQpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJcbnNldF9hdHRyaWJ1dGUgdG5zX29wdG8gdHJ1ZSAvXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfYXR0cmlidXRlIGlvcHRfZW5hYmxlX3BhcmFsbGVsaXphdGlvbiB0cnVlIC9cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9hdHRyaWJ1dGUgdWx0cmFfZ2xvYmFsX21hcHBpbmcgdHJ1ZSAvXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfYXR0cmlidXRlIGlvcHRfdWx0cmFfb3B0aW1pemF0aW9uIHRydWUgL1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2hpZ2hfZWZmb3J0X2F0dHJpYnV0ZXMgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICAgIHNldCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBvcHRpbWl6ZV9tZXJnZV9mbG9wcyAgICAgIGZhbHNlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIG9wdGltaXplX2NvbnN0YW50XzBfZmxvcHMgdHJ1ZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBvcHRpbWl6ZV9jb25zdGFudF8xX2Zsb3BzIGZhbHNlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIG9wdGltaXplX2NvbnN0YW50X2xhdGNoZXMgZmFsc2UgL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgZGVsZXRlX3VubG9hZGVkX3NlcXMgICAgICB0cnVlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIG9wdGltaXplX25ldF9hcmVhICAgICAgICAgZmFsc2UgL1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiI3NldF9hdHRyaWJ1dGUgZHBfYXJlYV9tb2RlICAgICAgICAgICAgICB0cnVlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiNzZXRfYXR0cmlidXRlIGF1dG9fdW5ncm91cCAgICAgICAgICAgICAgbm9uZSAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSBhdXRvX3VuZ3JvdXBfbWluX2VmZm9ydCAgIGxvdyAvXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIjc2V0X2F0dHJpYnV0ZSB1bmdyb3VwX3NlcGFyYXRvciAgICAgICAgIC9cbiIKICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfb3B0X2F0dHJpYnV0ZXMgJGNvbW1hbmRdCgogICAgICAjIyMgRGV0YWlsIFN0YXRzIHdoaWxlIHJ1bm5pbmcKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAiI3NldCBpb3B0X3N0YXRzIDFcbiIKICAgICAgCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIE1heCBsZWFrYWdlIHBvd2VyID8KICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiNzZXRfYXR0cmlidXRlIG1heF9sZWFrYWdlX3Bvd2VyID8gL2Rlc2lnbnMvKlxuIgogICAgICBzZXQgY29tbWFuZCAiXG5zeW50aGVzaXplIC10b19tYXBwZWQgLWVmZm9ydCBoaWdoIC1pbmNyXG5cbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzeW4yaW5jciAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3Rfc3luX2luY3JfdGNsXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJmb3JlYWNoIGNnIFxbZmluZCAvIC1jb3N0X2dyb3VwICpcXSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICByZXBvcnQgdGltaW5nIC1jb3N0X2dyb3VwIFwkY2cgPj4gJHZhcnMocnB0X2Rpcikvc3luX2luY3JfXFtmaWxlIHRhaWwgXCRjZ1xdLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgCiAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9kYiAkdmFycyhkZXNpZ24pIC1hbGxfcm9vdF9hdHRyaWJ1dGVzIC10b19maWxlICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLmRiXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZCAid3JpdGVfZGIgJHZhcnMoZGVzaWduKSAtYWxsX3Jvb3RfYXR0cmlidXRlcyAtdG9fZmlsZSAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS5kYlxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2RiICRjb21tYW5kXQoKICAgICAgICAgc2V0IGNvbW1hbmQgIndyaXRlX2hkbCBcW2ZpbmQgLyAtZGVzaWduICR2YXJzKGRlc2lnbilcXSA+ICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLnYuZ3pcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIndyaXRlX2hkbCBcW2ZpbmQgLyAtZGVzaWduICR2YXJzKGRlc2lnbilcXSAtbGVjID4gJHZhcnMobGVjX2RpcikvJHZhcnMoc3RlcCkuTEVDT05MWS52Lmd6XG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksd3JpdGVfaGRsICRjb21tYW5kXQoKICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bTo6cG9wX3NuYXBzaG90X3N0YWNrXG4iCiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDE2fSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjb21wdXRlX21ldHJpY3MpXSAmJiAkdmFycyhjb21wdXRlX21ldHJpY3MpfSB7CiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcCkgLWNhdGVnb3JpZXMgXFtkaWN0IGdldCBcW2dldF9hdHRyIG1ldHJpY19jYXRlZ29yeV9zdGF0dXNfbWFwXF0gXFtnZXRfYXR0ciBzdGF0ZSBcW2ZpbmQgLyAtZGVzaWduICpcXVxdXF1cbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKSAtY2F0ZWdvcmllcyBkZXNpZ25cbiIKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY3JlYXRlX3NuYXBzaG90IC1uYW1lICR2YXJzKHN0ZXApXG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bTo6c2F2ZV9tZXRyaWNfZmlsZSAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS51bVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjpyZXBvcnRfbWV0cmljIC1maWxlICR2YXJzKHJwdF9kaXIpLyR2YXJzKGRlc2lnbikuaHRtbCAtZm9ybWF0IGh0bWxcbiIKICAgICAgfQoKICAgICAgaWYgeyEkdmFycyhlbmFibGVfcmNwKX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiXG53cml0ZV9kZXNpZ24gLWlubm92dXMgLWd6aXAgLWJhc2VuYW1lICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLyR2YXJzKHN0ZXApXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgZmlsZSBcW29wZW4gJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkvJHZhcnMoc3RlcCkubm92dXNfc2V0dXAudGNsIHdcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAicHV0cyBcJGZpbGUgXCJldmFsX2VuYyBce3NvdXJjZSAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS8kdmFycyhzdGVwKS5lbmNfc2V0dXAudGNsXH1cIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiY2xvc2UgXCRmaWxlXG5cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyBXcml0ZSBvdXQgUlRMIHZlcnN1cyBtYXBwZWQgTEVDIGRvZmlsZQogICAgICBhcHBlbmQgY29tbWFuZHMgIndyaXRlX2RvX2xlYyAtcmV2aXNlZCAkdmFycyhsZWNfZGlyKS8kdmFycyhzdGVwKS5MRUNPTkxZLnYuZ3ogIC1sb2dmaWxlIHJ0bDJpbmNyLmxvZyAgPiAkdmFycyhsZWNfZGlyKS9ydGwyaW5jci5kb2ZcbiIKCiAgICAgICAgIHNldCBjb21tYW5kICJyZWRpcmVjdCAkdmFycyhsZWNfZGlyKS9kZWxldGVkX3NlcXVlbnRpYWxzLnJwdCB7cmVwb3J0IHNlcXVlbnRpYWwgLWRlbGV0ZWRfc2Vxc31cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlZGlyZWN0IC10ZWUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucW9yLnJwdCB7IHJlcG9ydCBxb3IgLW5vcG93ZXIgfVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVkaXJlY3QgLWFwcGVuZCAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5xb3IucnB0IHsgcmVwb3J0IHRpbWluZyAtZnVsbCAtbnVtIDI1MCAtZW5kIH1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlZGlyZWN0IC1hcHBlbmQgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucW9yLnJwdCB7IHJlcG9ydCB0aW1pbmcgLWZ1bGwgLW51bSAyNSB9XG4iCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZCAiZ2VuZXJhdGVfcmVwb3J0cyAtdGFnICR2YXJzKHN0ZXApIC1vdXRkaXIgJHZhcnMocnB0X2RpcikvZ2VuZXJhdGVfcmVwb3J0c1xuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGdlbmVyYXRlX3JlcG9ydHMgJGNvbW1hbmRdCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobWFpbCx0byldfSB7CiAgICAgICAgIHNldCBzdW1tYXJ5X2ZpbGUgJHZhcnMoc3RlcCkucW9yLnJwdAogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG1haWwsc3RlcHMpXSB8fCBcCiAgICAgICAgICAgICAoW2luZm8gZXhpc3RzIHZhcnMobWFpbCxzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhtYWlsLHN0ZXBzKSAkdmFycyhzdGVwKV0gIT0gLTEpKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+IE1BSUxJTkcgUkVTVUxUUyBUTyAkdmFycyhtYWlsLHRvKVwiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbZmlsZSBleGlzdHMgJHZhcnMocnB0X2RpcikvJHN1bW1hcnlfZmlsZVxdfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyAvYmluL21haWwgLXMgXCJGRjogJHZhcnMoZGVzaWduKSwgJHZhcnMoc3RlcCkgY29tcGxldGVkIChcW3NoIHB3ZFxdKVwiIDwgJHZhcnMocnB0X2RpcikvJHN1bW1hcnlfZmlsZSAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZWlmIHtcW2ZpbGUgZXhpc3RzICR2YXJzKHJwdF9kaXIpLyR7c3VtbWFyeV9maWxlfS5nelxdfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyBndW56aXAgLWMgJHZhcnMocnB0X2RpcikvJHtzdW1tYXJ5X2ZpbGV9Lmd6IFx8IC9iaW4vbWFpbCAtcyBcIkZGOiAkdmFycyhkZXNpZ24pLCAkdmFycyhzdGVwKSBjb21wbGV0ZWQgKFxbcHdkXF0pXCIgJHZhcnMobWFpbCx0bylcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9IGVsc2Uge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGV4ZWMgL2Jpbi9tYWlsIC1zIFwiRkY6ICR2YXJzKGRlc2lnbiksICR2YXJzKHN0ZXApIGNvbXBsZXRlZCAoXFtzaCBwd2RcXSlcIiA8IC9kZXYvbnVsbCAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgfQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2luZm8gZXhpc3RzIGVudihWUEFUSClcXX0geyIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJleGVjIC9iaW4vdG91Y2ggXCRlbnYoVlBBVEgpLyR2YXJzKHN0ZXApIgogICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKCiAgICAgIHJldHVybiAkY29tbWFuZHMKCiAgIH0KCiAgIHByb2MgcnVuX3N5bl9wbGFjZSB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBzZXQgdmFycyhzdGVwKSBzeW5fcGxhY2UKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwcm9jIFB1dHMge2FyZ3N9IHtwdXRzIFwkYXJnc31cbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicHV0cyBcW2dldF9hdHRyIHByb2dyYW1fdmVyc2lvbiAvXF1cbiIKICAgICAKICAgICAgIyMgZW5hYmxlIG11bHRpIHByb2Nlc3NpbmcKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgaG9zdGxpc3QgXFtscmVwZWF0ICR2YXJzKGxvY2FsX2NwdXMpIGxvY2FsaG9zdFxdXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2F0dHJpYnV0ZSBzdXBlcl90aHJlYWRfc2VydmVycyBcJGhvc3RsaXN0IC9cbiIKICAgICAKICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcdW06Om5lbmFibGVfbWV0cmljcyAtb25cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bTo6cHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocG9zdGxvYWRfc3luX3BsYWNlX3RjbCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2F0dHJpYnV0ZSBlbmNfcG9zdGxvYWRfc2NyaXB0ICR2YXJzKHBvc3Rsb2FkX3N5bl9wbGFjZV90Y2wpIC9cbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocHJlZXhwb3J0X3N5bl9wbGFjZV90Y2wpXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9hdHRyaWJ1dGUgZW5jX3ByZWV4cG9ydF9zY3JpcHQgJHZhcnMocHJlZXhwb3J0X3N5bl9wbGFjZV90Y2wpIC9cbiIKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocHJlYW5ub3RhdGlvbl9zeW5fcGxhY2VkX3RjbCldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2F0dHJpYnV0ZSBlbmNfcHJlYW5ub3RhdGlvbl90Y2wgJHZhcnMocHJlYW5ub3RhdGlvbl9zeW5fcGxhY2VkX3RjbCkgL1xuIgogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldF9hdHRyaWJ1dGUgZW5jX3RlbXBfZGlyIC4vSU5OT1ZVUy9yY3BfcnVuIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfYXR0cmlidXRlIGVuY19nemlwX2ludGVyZmFjZV9maWxlcyB0cnVlIC9cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfYXR0cmlidXRlIHBxb3NfcGxhY2VtZW50X2VmZm9ydCBub192YWx1ZSAvXG4iCgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCA6OnBoeXM6OnBxb3NfdG5zX29wdCAxXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0X2F0dHJpYnV0ZSBpb3B0X2VuYWJsZV9wYXJhbGxlbGl6YXRpb24gZmFsc2UgL1xuIgogICAgICAKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWZfZmlsZXMpXX0gewojICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKGRlZl9maWxlcykgewojICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX2RlZiAkdmFycyhkZWZfZmlsZXMpXG4iCiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVhZF9kZWYgJGNvbW1hbmRdCiMgICAgICAgICAgICB9CiMgICAgICAgICB9CiMgICAgICB9CiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfc3luX3BsYWNlX3RjbF0KICAgICAKICAgICAgc2V0IGNvbW1hbmQgIlxuc3ludGhlc2l6ZSAtdG9fcGxhY2VkIC1lZmZvcnQgaGlnaCAtcHFvc19vbmx5XG5cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIndyaXRlX2RiICR2YXJzKGRlc2lnbikgLWFsbF9yb290X2F0dHJpYnV0ZXMgLXRvX2ZpbGUgJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkuZGJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHN5bjJwbGFjZSAkY29tbWFuZF0KIAogICAgICBzZXQgY29tbWFuZCAiXG5zeW50aGVzaXplIC10b19wbGFjZWQgLWVmZm9ydCBoaWdoIC1pbmNyXG5cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHN5bjJwbGFjZV9pbmNyICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9zeW5fcGxhY2VfdGNsXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICI6OnBoeXM6OnFvc19zdGF0cyAtcXVpZXQgLXRhZyBzeW4ycGxhY2VkXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiOjpwaHlzOjpxb3Nfd3JpdGVfc3RhdHNfYXJyYXkgPiAkdmFycyhycHRfZGlyKS9xb3Nfc3RhdHMucWRiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiOjpwaHlzOjpxb3Nfc3VtbWFyeVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJmb3JlYWNoIGNnIFxbZmluZCAvIC1jb3N0X2dyb3VwICpcXSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICByZXBvcnQgdGltaW5nIC1jb3N0X2dyb3VwIFwkY2cgPj4gJHZhcnMocnB0X2Rpcikvc3luX3BsYWNlX1xbZmlsZSB0YWlsIFwkY2dcXS5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIAogICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjpwb3Bfc25hcHNob3Rfc3RhY2tcbiIKICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTZ9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNvbXB1dGVfbWV0cmljcyldICYmICR2YXJzKGNvbXB1dGVfbWV0cmljcyl9IHsKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZV9zbmFwc2hvdCAtbmFtZSAkdmFycyhzdGVwKSAtY2F0ZWdvcmllcyBcW2RpY3QgZ2V0IFxbZ2V0X2F0dHIgbWV0cmljX2NhdGVnb3J5X3N0YXR1c19tYXBcXSBcW2dldF9hdHRyIHN0YXRlIFxbZmluZCAvIC1kZXNpZ24gKlxdXF1cXVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY3JlYXRlX3NuYXBzaG90IC1uYW1lICR2YXJzKHN0ZXApIC1jYXRlZ29yaWVzIGRlc2lnblxuIgogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJjcmVhdGVfc25hcHNob3QgLW5hbWUgJHZhcnMoc3RlcClcbiIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjpzYXZlX21ldHJpY19maWxlICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLnVtXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAidW06OnJlcG9ydF9tZXRyaWMgLWZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoZGVzaWduKS5odG1sIC1mb3JtYXQgaHRtbFxuIgogICAgICB9CgogICAgICAgICBzZXQgY29tbWFuZCAid3JpdGVfZGIgJHZhcnMoZGVzaWduKSAtc2NyaXB0ICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApX2RiX3Njci50Y2wgLWFsbF9yb290X2F0dHJpYnV0ZXMgLXRvX2ZpbGUgJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkuZGJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgIndyaXRlX2RiICR2YXJzKGRlc2lnbikgLWFsbF9yb290X2F0dHJpYnV0ZXMgLXRvX2ZpbGUgJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkuZGJcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx3cml0ZV9kYiAkY29tbWFuZF0KCiAgICAgICAgIHNldCBjb21tYW5kICJ3cml0ZV9oZGwgXFtmaW5kIC8gLWRlc2lnbiAkdmFycyhkZXNpZ24pXF0gPiAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS52Lmd6XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJ3cml0ZV9oZGwgXFtmaW5kIC8gLWRlc2lnbiAkdmFycyhkZXNpZ24pXF0gLWxlYyA+ICR2YXJzKGxlY19kaXIpLyR2YXJzKHN0ZXApLkxFQ09OTFkudi5nelxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2hkbCAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyhlbmFibGVfcmNwKX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiXG53cml0ZV9kZXNpZ24gLWlubm92dXMgLWd6aXAgLWJhc2VuYW1lICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLyR2YXJzKHN0ZXApXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgZmlsZSBcW29wZW4gJHZhcnMoZGJzX2RpcikvJHZhcnMoc3RlcCkvJHZhcnMoc3RlcCkubm92dXNfc2V0dXAudGNsIHdcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAicHV0cyBcJGZpbGUgXCJldmFsX2VuYyBce3NvdXJjZSAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS8kdmFycyhzdGVwKS5lbmNfc2V0dXAudGNsXH1cIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiY2xvc2UgXCRmaWxlXG5cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHdyaXRlX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyBXcml0ZSBvdXQgUlRMIHZlcnN1cyBtYXBwZWQgTEVDIGRvZmlsZQogICAgICBhcHBlbmQgY29tbWFuZHMgIndyaXRlX2RvX2xlYyAtcmV2aXNlZCAkdmFycyhsZWNfZGlyKS8kdmFycyhzdGVwKS5MRUNPTkxZLnYuZ3ogIC1sb2dmaWxlIHJ0bDJpbmNyLmxvZyAgPiAkdmFycyhsZWNfZGlyKS9ydGwyaW5jci5kb2ZcbiIKCiAgICAgICAgIHNldCBjb21tYW5kICJyZWRpcmVjdCAkdmFycyhsZWNfZGlyKS9kZWxldGVkX3NlcXVlbnRpYWxzLnJwdCB7cmVwb3J0IHNlcXVlbnRpYWwgLWRlbGV0ZWRfc2Vxc31cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlZGlyZWN0IC10ZWUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucW9yLnJwdCB7IHJlcG9ydCBxb3IgLW5vcG93ZXIgfVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAicmVkaXJlY3QgLWFwcGVuZCAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5xb3IucnB0IHsgcmVwb3J0IHRpbWluZyAtZnVsbCAtbnVtIDI1MCAtZW5kIH1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInJlZGlyZWN0IC1hcHBlbmQgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucW9yLnJwdCB7IHJlcG9ydCB0aW1pbmcgLWZ1bGwgLW51bSAyNSB9XG4iCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZCAiZ2VuZXJhdGVfcmVwb3J0cyAtdGFnICR2YXJzKHN0ZXApIC1vdXRkaXIgJHZhcnMocnB0X2RpcikvZ2VuZXJhdGVfcmVwb3J0c1xuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGdlbmVyYXRlX3JlcG9ydHMgJGNvbW1hbmRdCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobWFpbCx0byldfSB7CiAgICAgICAgIHNldCBzdW1tYXJ5X2ZpbGUgJHZhcnMoc3RlcCkucW9yLnJwdAogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG1haWwsc3RlcHMpXSB8fCBcCiAgICAgICAgICAgICAoW2luZm8gZXhpc3RzIHZhcnMobWFpbCxzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhtYWlsLHN0ZXBzKSAkdmFycyhzdGVwKV0gIT0gLTEpKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+IE1BSUxJTkcgUkVTVUxUUyBUTyAkdmFycyhtYWlsLHRvKVwiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbZmlsZSBleGlzdHMgJHZhcnMocnB0X2RpcikvJHN1bW1hcnlfZmlsZVxdfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyAvYmluL21haWwgLXMgXCJGRjogJHZhcnMoZGVzaWduKSwgJHZhcnMoc3RlcCkgY29tcGxldGVkIChcW3NoIHB3ZFxdKVwiIDwgJHZhcnMocnB0X2RpcikvJHN1bW1hcnlfZmlsZSAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZWlmIHtcW2ZpbGUgZXhpc3RzICR2YXJzKHJwdF9kaXIpLyR7c3VtbWFyeV9maWxlfS5nelxdfSB7XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZXhlYyBndW56aXAgLWMgJHZhcnMocnB0X2RpcikvJHtzdW1tYXJ5X2ZpbGV9Lmd6IFx8IC9iaW4vbWFpbCAtcyBcIkZGOiAkdmFycyhkZXNpZ24pLCAkdmFycyhzdGVwKSBjb21wbGV0ZWQgKFxbcHdkXF0pXCIgJHZhcnMobWFpbCx0bylcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9IGVsc2Uge1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIGV4ZWMgL2Jpbi9tYWlsIC1zIFwiRkY6ICR2YXJzKGRlc2lnbiksICR2YXJzKHN0ZXApIGNvbXBsZXRlZCAoXFtzaCBwd2RcXSlcIiA8IC9kZXYvbnVsbCAkdmFycyhtYWlsLHRvKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgICAgfQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2NoZWR1bGVfZmxvdyAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbaW5mbyBleGlzdHMgZW52KFZQQVRIKVxdfSB7IgogICAgICBhcHBlbmQgY29tbWFuZHMgImV4ZWMgL2Jpbi90b3VjaCBcJGVudihWUEFUSCkvJHZhcnMoc3RlcCkiCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgoKICAgICAgcmV0dXJuICRjb21tYW5kcwoKICAgfQoKICAgcHJvYyBydW5faW5pdCB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCB3YXJuaW5ncwogICAgICBnbG9iYWwgZW52CgogICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgc2V0IHVjb21tZW50cyAiIgogICAgICBzZXQgY29tbWVudHMgIiIKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKVxuIgogICAgICB9CgogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHN0ZXApXSB8fCAoKCR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UiKSAmJiAoJHZhcnMoc3RlcCkgIT0gIm1vZGVsX2dlbiIpICYmICgkdmFycyhzdGVwKSAhPSAicHJvdG90eXBlIikpfSB7IAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApIGluaXRcbiIKICAgICAgICAgc2V0IHZhcnMoc3RlcCkgaW5pdAogICAgICB9IAoKICAgICAgaWYgeyR2YXJzKHJlcG9ydF9ydW5fdGltZSl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkdmFycyhzdGVwKSxzdGFydF90aW1lKSBcW2Nsb2NrIHNlY29uZHNcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHJlcG9ydF9ydW5fdGltZSlcbiIKICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVwb3J0X3J1bl90aW1lKVxuIgogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoc3RlcCkscnB0X2RpcildfSB7CiAgICAgICAgIHNldCB2YXJzKHJwdF9kaXIpICR2YXJzKCR2YXJzKHN0ZXApLHJwdF9kaXIpCiAgICAgICAgIGZpbGUgbWtkaXIgJHZhcnMoJHZhcnMoc3RlcCkscnB0X2RpcikKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnMocnB0X2RpcikgJHZhcnMob3JpZ19ycHRfZGlyKQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTWFrZSBzdXJlIG5lY2Vzc2FyeSBkYXRhIGlzIGRlZmluZWQKICAgICAgIyBDcmVhdGUgbWFrZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdHMKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSAgeyAKICAgICAgICAgc2V0IGNvbW1hbmQgIkZGX0VESTo6Y2hlY2tfc2V0dXBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNsZWVwIDNcbiIKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kIAogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTWFrZSBzdXJlIG5lY2Vzc2FyeSBkYXRhIGlzIGRlZmluZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgZW52KFZQQVRIKV19IHsKICAgICAgICAgc2V0IGVudihWUEFUSCkgIm1ha2UiICAKICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgImV4ZWMgbWtkaXIgLXAgXCRlbnYoVlBBVEgpXG4iCgogICAgICBpZiB7JHZhcnMoYmFja3VwX2RhdGEpfSB7CiAgICAgICAgIHB1dHMgIiMgPEZGPiBCQUNLSU5HIFVQIFBSSU9SIFJVTiBEQVRBIElGIElUIEVYSVNUUy4uLlxuIgogICAgICAgICBzZXQgZGF0ZSBbc3RyaW5nIHRvdXBwZXIgW2Nsb2NrIGZvcm1hdCBbY2xvY2sgc2Vjb25kc10gLWZvcm1hdCB7JWglZF8lSDolTX1dXQogICAgICAgICBleGVjIG1rZGlyIC1wIEJBQ0tVUC8kZGF0ZQogICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgdG8gaGFuZGxlIGRlcmVyZW5jaW5nIHZhcmlhYmxlcwogICAgICAgIAogICAgICAgICBmb3JlYWNoIGRpciAiW3N1YnN0ICR2YXJzKGRic19kaXIpXSBbc3Vic3QgJHZhcnMocnB0X2RpcildIFtzdWJzdCAkdmFycyhsb2dfZGlyKV0iIHsKICAgICAgICAgICAgaWYge1tmaWxlIGlzZGlyZWN0b3J5ICRkaXJdfSB7CiAgICAgICAgICAgICAgIGV4ZWMgbXYgJGRpciBCQUNLVVAvJGRhdGUKICAgICAgICAgICAgICAgIyBCQ0w6IENoYW5nZWQgdG8gZmlsZSBta2RpcgogICAgICAgICAgICAgICBwdXRzICJNYWtpbmcgJGRpciIKICAgICAgICAgICAgICAgZmlsZSBta2RpciAkZGlyCiAgICAgICAgICAgIH0KICAgICAgICAgfQojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzbGVlcCA1XG4iCiAgICAgIH0KICAgICAgIyBCQ0w6IEFkZGVkIHN1YnN0IHRvIGhhbmRsZSBkZXJlcmVuY2luZyB2YXJpYWJsZXMKICAgICAgZm9yZWFjaCBkaXIgIltzdWJzdCAkdmFycyhkYnNfZGlyKV0gW3N1YnN0ICR2YXJzKHJwdF9kaXIpXSBbc3Vic3QgJHZhcnMobG9nX2RpcildIiB7CiAgICAgICAgIHNldCBuZXdEaXIgW3N1YnN0ICRkaXJdCiAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICRuZXdEaXJdfSAgewogICAgICAgICAgICBmaWxlIG1rZGlyICRuZXdEaXIKICAgICAgICAgfQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBwcmUtaW5pdGlhbGl6YXRpYW9uIHBsdWctaW4gc2NyaXB0CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX2luaXRfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFRoZXNlIGZsb3cgc2NyaXB0cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmc6CiAgICAgICMgLSBGbGF0IGNoaXAgb3IgYmxvY2sKICAgICAgIyAtIEhpZXJhcmNoaWNhbCBwYXJ0aXRpb24KICAgICAgIyAtIFRvcCBsZXZlbCBwYXJ0aXRpb24KICAgICAgIwogICAgICAjIFRoZSBkYXRhIGxvYWRpbmcgbWVjaGFuaXNtIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQgZm9yIGVhY2ggc28gd2UgZGV0ZXJtaW5lCiAgICAgICMgZmlyc3QgaWYgd2UgYXJlIGluIGEgaGllcmFyY2hpY2FsIGZsb3cgKGkuZS4gdmFycyhwYXJ0aXRpb25fbGlzdCkgaXMKICAgICAgIyBkZWZpbmVkIGFuZCwgaWYgc28sIHdoZXRoZXIgd2UgYXJlIGluIGEgaGllcmFyY2hpY2FsIHBhcnRpdGlvbiBmbG93CiAgICAgICMgb3IgYSB0b3AgcGFydGl0aW9uIGZsb3cgKGkuZS4gY3dkID09ICR2YXJzKGRlc2lnbikgLSBzZWUgYmVsb3cpCiAgICAgICMKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgRkZfRURJOjpjaGVja19mbG93CgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDVVRJTkcgRkxPV1xuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgogICAgICBzZXQgaGllciAwCiAgICAgIAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoc3RlcCksc3RhcnRpbmdfZGJzKV19IHsKICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgIyBJbnRlcnByZXQgdGhlIHN0YXJ0aW5nIERCUyBhcyBhbiBPQSB0cmlwbGUKICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJbbGlzdCByZXN0b3JlRGVzaWduIC1jZWxsdmlldyAkdmFycygkdmFycyhzdGVwKSxzdGFydGluZ19kYnMpXVxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMoJHZhcnMoc3RlcCksc3RhcnRpbmdfZGJzKV19IHsKICAgICAgICAgICAgICBzZXQgcmVzdG9yZV9jb21tYW5kICJyZXN0b3JlRGVzaWduICR2YXJzKCR2YXJzKHN0ZXApLHN0YXJ0aW5nX2RicykgJHZhcnMoZGVzaWduKVxuIgogICAgICAgICAgICB9IGVsc2VpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKCR2YXJzKHN0ZXApLHN0YXJ0aW5nX2RicyldfSB7CiAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZCAicmVzdG9yZURlc2lnbiAkdmFycygkdmFycyhzdGVwKSxzdGFydGluZ19kYnMpLmRhdCAkdmFycyhkZXNpZ24pXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcHV0cyAiPEZGPiBTdGFydGluZyBEQlMgKCR2YXJzKCR2YXJzKHN0ZXApLHN0YXJ0aW5nX2RicykpIGRlZmluZWQgYnV0IGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmQgInJlc3RvcmVEZXNpZ24gJHZhcnMoJHZhcnMoc3RlcCksc3RhcnRpbmdfZGJzKS5kYXQgJHZhcnMoZGVzaWduKVxuIgogICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlN0YXJ0aW5nIERCUyAoJHZhcnMoJHZhcnMoc3RlcCksc3RhcnRpbmdfZGJzKSkgZGVmaW5lZCBidXQgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlc3RvcmVfZGVzaWduICRyZXN0b3JlX2NvbW1hbmRdCgogICAgICB9IGVsc2UgewoKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldIHx8IChbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmIFwKICAgICAgICAgICAgICAoW2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtwd2RdXV0gIT0gIiR2YXJzKHBhcnRpdGlvbl9kaXIpIikpfSB7CiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgUGFydGl0aW9uIHN0ZXAgb3IgZmxhdCBpbml0IHN0ZXAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsKICAgICAgICAgICAgICAgc2V0IGhpZXIgMQogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgRkxBVCBJTVBMRU1FTlRBVElPTiBGTE9XXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFBBUlRJVElPTklORyBGTE9XXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIExPQURJTkcgREVTSUdOIERBVEFcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIExvYWQgZGVzaWduIGNvbmZpZ3VyYXRpb24gZmlsZQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAwXSA8PSAxMH0gewogICAgICAgICAgICAgICBzb3VyY2UgJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9JTk5PVlVTL2dlbmVyaWMuY29uZgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgICAgICAgIHNldCBpbG1fbGlzdCAkdmFycyhpbG1fbGlzdCkKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhpbG1fbGlzdCkgXCI8bGlzdCBvZiBJTE1zPlwiXG4iCiAgICAgICAgICAgICAgIGlmIHskdmFycyhtb2RlKSA9PSAiYm90dG9tX3VwIn0gewogICAgICAgICAgICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LGlsbV9kaXIpXX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKDxpbG0+LGlsbV9kaXIpIFwiPHBhdGggdG8gSUxNIGRpcmVjdG9yeT5cIlxuIgogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGlsbV9saXN0ICRwYXJ0XSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGlsbV9saXN0ICRwYXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZm9yZWFjaCBpbG0gJGlsbV9saXN0IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRpbG0sbGVmX2ZpbGUpXSAmJiBbZmlsZSBleGlzdHMgJHZhcnMoJGlsbSxsZWZfZmlsZSldfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoPGlsbT4sbGVmX2ZpbGUpIFwiPExFRiBmaWxlIGZvciBibG9jayBhc3NvY2lhdGVkIHdpdGggSUxNPlwiXG4iCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHJkYV9JbnB1dCh1aV9sZWZmaWxlKSAkdmFycygkaWxtLGxlZl9maWxlKQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgdmFycyhsZWZfZmlsZXMpICR2YXJzKCRpbG0sbGVmX2ZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IExFRiBmaWxlIGVpdGhlciBub3QgZGVmaW5lZCBvciBkb2Vzbid0IGV4aXN0IGZvciAkaWxtIgogICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+ICAgICAgICAgIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgaW4geW91ciB2YXJzKGxlZl9maWxlcykgbGlzdCIKICAgICAgICAgICAgICAgICAgICAgc2V0IHdhcm5pbmdzKCR2YXJzKHdhcm5pbmdfY291bnQpKSAiTEVGIGZpbGUgZWl0aGVyIG5vdCBkZWZpbmVkIG9yIGRvZXNuJ3QgZXhpc3QgZm9yICRpbG1cblx0UGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBpbiB5b3VyIHZhcnMobGVmX2ZpbGVzKSBsaXN0IgogICAgICAgICAgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGlsbSxzZXR1cF9saWIpXSAmJiBbZmlsZSBleGlzdHMgJHZhcnMoJGlsbSxzZXR1cF9saWIpXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKDxpbG0+LHNldHVwX2xpYikgXCI8TElCIGZpbGUgZm9yIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCBJTE0+XCJcbiIKICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7IAogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHJkYV9JbnB1dCh1aV90aW1lbGliKSAkdmFycygkaWxtLHNldHVwX2xpYikKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdmFycyhkYnNfZm9ybWF0KSAiZmUiXT09MH0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIHNldCAkdmFycyhsaWJyYXJ5X3NldHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YXJzKCRzZXQsdGltaW5nKSAkdmFycygkaWxtLHNldHVwX2xpYildID09IC0xfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgdmFycygkc2V0LHRpbWluZykgJHZhcnMoJGlsbSxzZXR1cF9saWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBMSUIgZmlsZSBlaXRoZXIgbm90IGRlZmluZWQgb3IgZG9lc24ndCBleGlzdCBmb3IgJGlsbSIKICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiAgICAgICAgICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGluIHlvdXIgbGlicmFyeSBzZXQgZGVmaW5pdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIkxJQiBmaWxlIGVpdGhlciBub3QgZGVmaW5lZCBvciBkb2Vzbid0IGV4aXN0IGZvciAkaWxtXG5cdFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgaW4geW91ciBsaWJyYXJ5IHNldCBkZWZpbml0aW9ucyIKICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhpbG1fbGlzdCkgXCI8bGlzdCBvZiBJTE1zPlwiXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKDxpbG0+LGlsbV9kaXIpIFwiPHBhdGggdG8gSUxNIGRpcmVjdG9yeT5cIlxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyg8aWxtPixsZWZfZmlsZSkgXCI8TEVGIGZpbGUgZm9yIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCBJTE0+XCJcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoPGlsbT4sc2V0dXBfbGliKSBcIjxMSUIgZmlsZSBmb3IgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIElMTT5cIlxuIgogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICBGRl9FREk6OmR1bXBfY29uZmlnCiAgIAogICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRDb25maWcgXCR2YXJzKHNjcmlwdF9kaXIpL3J1bi5jb25mXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2NvbmZpZyAkY29tbWFuZF0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKG5ldGxpc3RfdHlwZSkgInZlcmlsb2ciXT49MH0gewojICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNvdXJjZSBcJHZhcnMoc2NyaXB0X2RpcikvaW5pdC50Y2xcbiIKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGdlbmVyYXRlX2Zsb3dfc3RlcHMpfSB7IAogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvaW5pdC50Y2wgcl0KICAgICAgICAgICAgICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiJGxpbmVcbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL2luaXQudGNsXG4iCiAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJpbml0X2Rlc2lnblxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdF9kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHskaGllcn0gewogICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoc3RlcCkgPT0gInBhcnRpdGlvbl9wbGFjZSJ9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlc3RvcmVEZXNpZ24gLWNlbGx2aWV3IFxbbGlzdCAkdmFycyhvYV9kZXNpZ25fbGliKSAkdmFycyhvYV9kZXNpZ25fY2VsbCkgJHZhcnMob2FfZGVzaWduX3ZpZXcpXF1cbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVzdG9yZURlc2lnbiAtY2VsbHZpZXcgXFtsaXN0ICR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICR2YXJzKG9hX2Rlc2lnbl9jZWxsKSAkdmFycyhvYV9kZXNpZ25fdmlldylcXVxuIgogICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXN0b3JlRGVzaWduIC1jZWxsdmlldyBcW2xpc3QgJHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMob2FfZGVzaWduX2NlbGwpICR2YXJzKG9hX2Rlc2lnbl92aWV3KVxdXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlc3RvcmVfZGVzaWduICRjb21tYW5kXQogICAgICAgICAgICAgICB9CiAgICMgICAgICAgICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSB7CiAgICMgICAgICAgICAgICAgICBQdXRzICI8RkY+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgIyAgICAgICAgICAgICAgIFB1dHMgIjxGRj4gJGNvbW1hbmRzIgogICAjICAgICAgICAgICAgICAgUHV0cyAiPEZGPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICMgICAgICAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICMgICAgICAgICAgICAgICBzZXQgY29tbWFuZHMgIiIgIAogICAjICAgICAgICAgICAgfSAgCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiMgICAgICAgICAgICAgICAgaWYgeygkdmFycyhzdGVwKSAhPSAicGFydGl0aW9uX3BsYWNlIikgJiYgKCR2YXJzKHN0ZXApICE9ICJtb2RlbF9nZW4iKSAmJiAoJHZhcnMoc3RlcCkgIT0gInByb3RvdHlwZSIpfSB7IAogICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxM30gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjplbmFibGVfbWV0cmljcyAtb25cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bTo6cHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBMb2FkICJhbHdheXMgc291cmNlIiBwbHVnLWluIHNjcmlwdAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGFsd2F5c19zb3VyY2VfdGNsXQoKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGVpdGhlciBhIGZsb29ycGxhbiBmaWxlLCBhCiAgICAgICAgICAgICMgREVGIGZpbGUsIG9yIGJvdGggYW5kIGxvYWQgdGhlbQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIHNldCBjb21tYW5kICIiIAogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZnBfdGNsX2ZpbGUpXSB8fCBbaW5mbyBleGlzdHMgdmFycyhmcF90Y2xfcHJvYyldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZnBfdGNsX2ZpbGUpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZnBfdGNsX3Byb2MpXG4iCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmcF90Y2xfZmlsZSldICYmICFbaW5mbyBleGlzdHMgdmFycyhmcF90Y2xfcHJvYyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJmZl9wcm9jczo6c291cmNlX2ZpbGUgJHZhcnMoZnBfdGNsX2ZpbGUpXG4iCiAgICAgICAgICAgICAgIH0gZWxzZWlmIHshW2luZm8gZXhpc3QgdmFycyhmcF90Y2xfZmlsZSldICYmIFtpbmZvIGV4aXN0cyB2YXJzKGZwX3RjbF9wcm9jKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiR2YXJzKGZwX3RjbF9wcm9jKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIyAgRVJST1I6IEJvdGggZnBfdGNsX2ZpbGUgYW5kIGZwX3RjbF9wcm9jIGFyZSBkZWZpbmVkIGJ1dCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlXG4iCiAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiQm90aCBmcF90Y2xfZmlsZSBhbmQgZnBfdGNsX3Byb2MgYXJlIGRlZmluZWQgYnV0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUiCiAgICAgICAgICAgICAgICAgIGluY3IgdmFycyhlcnJvcl9jb3VudCkKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmcF90Y2xfZmlsZSlcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZnBfdGNsX3Byb2MpXG4iCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmcF9maWxlKV19IHsKICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhmcF9maWxlKV19IHsKICAgIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJQdXRzIFwiPEZGPiBMT0FESU5HIEZQIEZJTEUgJHZhcnMoZnBfZmlsZSlcIlxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAibG9hZEZQbGFuICR2YXJzKGZwX2ZpbGUpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmcF9maWxlKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhmcF9maWxlKVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9mcCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJvYUluICR2YXJzKG9hX2ZwKVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKG9hX2ZwKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhvYV9mcClcbiIKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZl9maWxlcyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZGVmX2ZpbGVzKVxuIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMocmMpfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfcmNwKX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhuZXRsaXN0KSAgICR2YXJzKGRic19kaXIpL3N5bl9wbGFjZS9zeW5fcGxhY2Uudi5negogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRic19kaXIpL3N5bl9wbGFjZS9zeW5fcGxhY2UuZGVmLmd6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbnNlcnRfZGZ0KV0gJiYgJHZhcnMoaW5zZXJ0X2RmdCl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKGRlZl9maWxlcykgJHZhcnMoZGJzX2Rpcikvc3luX3BsYWNlL3N5bl9wbGFjZS5zY2FuLmRlZi5negogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKG5ldGxpc3QpICAgJHZhcnMoZGJzX2Rpcikvc3luX2luY3Ivc3luX2luY3Iudi5negojICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZGVmX2ZpbGVzKSAkdmFycyhkYnNfZGlyKS9zeW5faW5jci9zeW5faW5jci5kZWYuZ3oKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGluc2VydF9kZnQpXSAmJiAkdmFycyhpbnNlcnRfZGZ0KX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHZhcnMoZGVmX2ZpbGVzKSAkdmFycyhkYnNfZGlyKS9zeW5faW5jci9zeW5faW5jci5zY2FuLmRlZi5negogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBkZWZfZmlsZSAkdmFycyhkZWZfZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImRlZkluICRkZWZfZmlsZVxuIgogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGRlZl9maWxlICR2YXJzKGRlZl9maWxlcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICRkZWZfZmlsZV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImRlZkluICRkZWZfZmlsZVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGRlZl9maWxlcylcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZGVmX2ZpbGVzKVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMocmMpfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfcmNwKX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhuZXRsaXN0KSAgICR2YXJzKGRic19kaXIpL3N5bl9wbGFjZS9zeW5fcGxhY2Uudi5negogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRic19kaXIpL3N5bl9wbGFjZS9zeW5fcGxhY2UuZGVmLmd6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbnNlcnRfZGZ0KV0gJiYgJHZhcnMoaW5zZXJ0X2RmdCl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKGRlZl9maWxlcykgJHZhcnMoZGJzX2Rpcikvc3luX3BsYWNlL3N5bl9wbGFjZS5zY2FuLmRlZi5negogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKG5ldGxpc3QpICAgJHZhcnMoZGJzX2Rpcikvc3luX2luY3Ivc3luX2luY3Iudi5negogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRic19kaXIpL3N5bl9pbmNyL3N5bl9pbmNyLmRlZi5negogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaW5zZXJ0X2RmdCldICYmICR2YXJzKGluc2VydF9kZnQpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgdmFycyhkZWZfZmlsZXMpICR2YXJzKGRic19kaXIpL3N5bl9pbmNyL3N5bl9pbmNyLnNjYW4uZGVmLmd6CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhkZWZfZmlsZXMpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2Zsb29ycGxhbiAkY29tbWFuZF0KICAgCiAgICAgICAgICAgIGlmIHsoJHZhcnMocGFyZW50KSA9PSAicmMiKSAmJiAkdmFycyhyYyl9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgYWx3YXlzX3NvdXJjZV90Y2xdCiAgICAgICAgICAgICAgIGlmIHskdmFycyhyZXBvcnRfcnVuX3RpbWUpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoJHZhcnMoc3RlcCksc3RhcnRfdGltZSkgXFtjbG9jayBzZWNvbmRzXF1cbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfaW5pdF90Y2xdCiAgICAgICAgICAgIH0KICAgCiAgICMgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZ3VpZGVzKV19IHsKICAgIyAgICAgICAgICAgIHNldCBjb21tYW5kICJcbmJ1aWxkX2d1aWRlc1xuIgogICAjICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGluaXQsYnVpbGRfZ3VpZGVzICRjb21tYW5kXQogICAjICAgICAgICAgfQogICAjICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGJsb2NrYWdlcyldfSB7CiAgICMgICAgICAgICAgICBzZXQgY29tbWFuZCAiXG5hZGRfYmxvY2thZ2VzXG4iCiAgICMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgaW5pdCxhZGRfYmxvY2thZ2VzICRjb21tYW5kXQogICAjICAgICAgICAgfQoKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTV9IHsKICAgICAgICAgICAgICBpZiB7JHZhcnMoZ2VuZXJhdGVfdHJhY2tzKX0gewogICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJnZW5lcmF0ZVRyYWNrc1xuIgogICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhob25vcl9waXRjaCldICYmICR2YXJzKGhvbm9yX3BpdGNoKX0gewogICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIgZ2VuZXJhdGVUcmFja3MgLWhvbm9yUGl0Y2hcbiIKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGdlbmVyYXRlX3RyYWNrcyAkY29tbWFuZF0KICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGdlbmVyYXRlX3RyYWNrcylcbiIKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGdlbmVyYXRlX3RyYWNrcylcbiIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7IAogICAgICAgICAgICAgIGlmIHskdmFycyhhZGRfdHJhY2tzKX0gewogICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJhZGRfdHJhY2tzXG4iCiAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhvbm9yX3BpdGNoKV0gJiYgJHZhcnMoaG9ub3JfcGl0Y2gpfSB7CiAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiBhZGRfdHJhY2tzIC1ob25vcl9waXRjaFxuIgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksYWRkX3RyYWNrcyAkY29tbWFuZF0KICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGFkZF90cmFja3MpXG4iCiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhhZGRfdHJhY2tzKVxuIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNwZWNpZnkgSUxNcyBpZiBkZWZpbmVkCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBpbG1fbGlzdF0gJiYgKCRpbG1fbGlzdCAhPSAiIil9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgZm9yZWFjaCBjZWxsICRpbG1fbGlzdCB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY2VsbCxpbG1fZGlyKV0gJiYgW2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMoJGNlbGwsaWxtX2RpcildfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkY2VsbCAtZGlyICR2YXJzKCRjZWxsLGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRjZWxsXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRjZWxsIC1kaXIgJHZhcnMoJGNlbGwsaWxtX2RpcilcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IGlsbSBkaXJlY3RvcnkgbWlzc2luZyBmb3IgJGNlbGwiCiAgICAgICAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiSUxNIGRpcmVjdG9yeSBtaXNzaW5nIGZvciAkY2VsbCIKICAgICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKGVycm9yX2NvdW50KQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgW0ZGX0VESTo6ZGVyYXRlX3RpbWluZyBtbW1jXV0KICAgICAgICAgICAgICAgaWYgeyRjb21tYW5kICE9ICIifSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzcGVjaWZ5X2lsbSAic2V0SWxtTW9kZSAta2VlcEZsYXR0ZW4gdHJ1ZVxuJHtjb21tYW5kfWZsYXR0ZW5JbG1cbiJdCiMgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyR2YXJzKGlsbSkgJiYgW2luZm8gZXhpc3RzIHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICAgICBzZXQgbGNvbW1hbmQgImxvYWRUaW1pbmdDb24gLWlsbU5vblNkY0ZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGxjb21tYW5kICJzZXRJbG1Ob25TZGNDb25zdHJhaW50RmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGxjb21tYW5kXQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIERlZmluZSBwb3dlciBpbnRlbnQgaWYgaXQgaXMgZGVmaW5lZCAobG93IHBvd2VyIGZsb3cpCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTR9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OmxvYWRfcG93ZXJfaW50ZW50XQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFjdGl2aXR5X2ZpbGUpXX0gewogICAjICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRoZWFkZXIKICAgIyAgICAgICAgICAgIHNldCBoZWFkZXIgIiIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlYWRBY3Rpdml0eUZpbGUgLWZvcm1hdCAkdmFycyhhY3Rpdml0eV9maWxlX2Zvcm1hdCkgJHZhcnMoYWN0aXZpdHlfZmlsZSlcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlYWRfYWN0aXZpdHlfZmlsZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhhY3Rpdml0eV9maWxlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGFjdGl2aXR5X2ZpbGVfZm9ybWF0KVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhhY3Rpdml0eV9maWxlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhhY3Rpdml0eV9maWxlX2Zvcm1hdClcbiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIExvYWQgdGltaW5nIGVudmlyb21lbnQgYmFzZWQgb24gdGhlIGZsb3cgc2V0dGluZyBpbiB0aGUKICAgICAgICAgICAgIyBzZXR1cC50Y2wgZmlsZS4gSWYgdGhlIGZsb3cgaXMgbW1tYywgbG9hZCB0aGUgbW1tYyBzZXR1cAogICAgICAgICAgICAjIGhlcmUgZWxzZSBsb2FkIHRoZSBkZWZhdWx0IHRpbWluZyBlbnZpcm9ubWVudAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBTRVRUSU5HIFVQIFRJTUlORyBFTlZJUk9OTUVOVFxuIgogICAjICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCgogICAgICAgICAgICBpZiB7JHZhcnMoZmxvdykgPT0gIm1tbWMifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfdGltaW5nIG1pbm1heF0KICAgICAgICAgICAgfQogICAKICAgIyAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWUgdmFyc10gewogICAjICAgICAgICBpZiB7KCR2YXIgIT0gInN0ZXAiKSAmJiAoJHZhciAhPSAibW9kZSIpICYmICgkdmFyICE9ICJpbG0iKSAmJiBcCiAgICMgICAgICAgICAgICAoJHZhciAhPSAiZmxhdm9yIikgJiYgKCR2YXIgIT0gInVzZXJfbW9kZSIpICYmICgkdmFyICE9ICJmbGF0IikgJiYgXAogICAjICAgICAgICAgICAgKCR2YXIgIT0gInJlcG9ydF9ydW5fdGltZSIpICYmICgkdmFyICE9ICJtYWtlZmlsZSIpICYmICgkdmFyICE9ICJjb2RlZ2VuIikgJiYgXAogICAjICAgICAgICAgICAgKCR2YXIgIT0gImJhY2t1cF9kYXRhIikgJiYgKCR2YXIgIT0gInZlcmJvc2UiKSAmJiAoJHZhciAhPSAiZm9ybWF0X2xpbmVzIikgJiYgXAogICAjICAgICAgICAgICAgKCR2YXIgIT0gIndhcm5pbmdfY291bnQiKSAmJiAoJHZhciAhPSAiZXJyb3JfY291bnQiKSAmJiAoJHZhciAhPSAicmMiKSAmJiBcCiAgICMgICAgICAgICAgICAoJHZhciAhPSAiZ2VuZXJhdGVfdHJhY2tzIikgJiYgKCR2YXIgIT0gImZpeF9ob2xkIikgJiYgKCR2YXIgIT0gImhvbm9yX3BpdGNoIikgJiYgXAogICAjICAgICAgICAgICAgKCR2YXIgIT0gInNjcmlwdF9wYXRoIikgJiYgKCR2YXIgIT0gImZpeF9ob2xkIikgJiYgKCR2YXIgIT0gImhvbm9yX3BpdGNoIikgJiYgXAogICAjICAgICAgICAgICAgKCR2YXIgIT0gInN0ZXBzIikgJiYgKCR2YXIgIT0gInNvdXJjZWQiKSAmJiAoJHZhciAhPSAidmVyc2lvbiIpfSB7CiAgICMgICAgICAgICAgIHNldCB2YXJzKCR2YXIpICJcXFwkdmFycygkdmFyKSIKICAgIyAgICAgICAgfQogICAjICAgICB9CgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldyldICYmICgkdmFycyhwb3dlcl9hbmFseXNpc192aWV3KSAhPSAiIil9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wb3dlcl9hbmFseXNpc19tb2RlIC1hbmFseXNpc192aWV3ICR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcG93ZXJfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyEkdmFycyhpbG0pICYmICgkdmFycyhmbG93KSA9PSAibW1tYyIpfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmRlcmF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBMb2FkIHNjYW4gREVGIGlmIGl0IGV4aXN0cwogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzY2FuX2RlZildfSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoc2Nhbl9kZWYpXX0gewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IExPQURJTkcgU0NBTiBERUYgRklMRVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiZGVmSW4gJHZhcnMoc2Nhbl9kZWYpXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX3NjYW4gJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhzY2FuX2RlZilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoc2Nhbl9kZWYpXG4iCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBTcGVjaWZ5IHNwYXJlIGdhdGVzIGZvciBwbGFjZW1lbnQgYW5kIG9wdGltaXphdGlvbiBjb25zaWRlcmF0aW9uOyB0aGlzIGFzc3VtZXMKICAgICAgICAgICAgIyB0aGUgc3BhcmUgY2VsbHMgYXJlIGluIHRoZSBuZXRsaXN0LgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc3BhcmVfY2VsbHMpXX0gewogICAgICAgICAgICAgICBmb3JlYWNoIHNwYXJlX2NlbGwgJHZhcnMoc3BhcmVfY2VsbHMpIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlTcGFyZUdhdGUgLWluc3QgJHNwYXJlX2NlbGxcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHNwYXJlX2NlbGxzKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhzcGFyZV9jZWxscylcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9zcGFyZV9nYXRlcyAkY29tbWFuZF0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBMb2FkIHRoZSByZWNvbW1lbmRlZCBjb21tYW5kIG1vZGUgc2V0dGluZ3MKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBERUZJTklORyBNT0RFIFNFVFRJTkdTXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU2V0IGRvbid0IHVzZSBjZWxsczsgZGlzYWJsZSBzb21lIChjbG9jayBidWZmZXJzLCBzdHJvbmcgYnVmZmVycywgZXRjLiksCiAgICAgICAgICAgICMgZW5hYmxlIG90aGVycyB0aGF0IG1heSBoYXZlICJkb250X3VzZSB0cnVlIiBpbiB0aGUgbGlicmFyeSAobGlrZSBkZWxheSBjZWxscwogICAgICAgICAgICAjIGZvciBob2xkIGZpeGluZykKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZG9udF91c2VfbGlzdCldfSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkdmFycyhkb250X3VzZV9saXN0KSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXREb250VXNlICRjZWxsIHRydWVcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGRvbnRfdXNlX2xpc3QpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGRvbnRfdXNlX2xpc3QpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRvbnRfdXNlX2ZpbGUpXSAmJiBbZmlsZSBleGlzdHMgJHZhcnMoZG9udF91c2VfZmlsZSldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzb3VyY2UgJHZhcnMoZG9udF91c2VfZmlsZSlcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhkb250X3VzZV9maWxlKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhkb250X3VzZV9maWxlKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1c2VfbGlzdCldfSB7CiAgICAgICAgICAgICAgIGZvcmVhY2ggY2VsbCAkdmFycyh1c2VfbGlzdCkgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0RG9udFVzZSAkY2VsbCBmYWxzZVxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnModXNlX2xpc3QpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHVzZV9saXN0KVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2RvbnRfdXNlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU2V0IG1heGltdW0gcm91dGluZyBsYXllcnMKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobWF4X3JvdXRlX2xheWVyKV19IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldE1heFJvdXRlTGF5ZXIgJHZhcnMobWF4X3JvdXRlX2xheWVyKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X21heF9yb3V0ZV9sYXllciAkY29tbWFuZF0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhtYXhfcm91dGVfbGF5ZXIpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKG1heF9yb3V0ZV9sYXllcilcbiIKICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIFNldCBkZXNpZ24gbW9kZQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbbGluZGV4IFtGRl9FREk6OnNldF9kZXNpZ25fbW9kZV0gMF0KICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzIFtsaW5kZXggW0ZGX0VESTo6c2V0X2Rlc2lnbl9tb2RlXSAxXQogICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzIFtsaW5kZXggW0ZGX0VESTo6c2V0X2Rlc2lnbl9tb2RlXSAyXQoKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIEluc2VydCB3ZWxsdGFwcyBhbmQgcHJlL3Bvc3QgZW5kY2FwcwogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHsoW0ZGOjpnZXRfYnlfc3VmZml4IHZhcnMgIndlbGx0YXBzIl0gIT0gIiIpIHx8CiAgICAgICAgICAgICAgICAoKFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICJwcmVfZW5kY2FwIl0gIT0gIiIpICYmCiAgICAgICAgICAgICAgICAgKFtGRjo6Z2V0X2J5X3N1ZmZpeCB2YXJzICJwb3N0X2VuZGNhcCJdICE9ICIiKSl9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6aW5zZXJ0X3dlbGx0YXBzX2VuZGNhcHNdCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbnNlcnRfd2VsbHRhcHNfZW5kY2FwcyAkY29tbWFuZF0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyh3ZWxsdGFwcylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwcmVfZW5kY2FwKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHBvc3RfZW5kY2FwKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyh3ZWxsdGFwcylcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocHJlX2VuZGNhcClcbiIKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocG9zdF9lbmRjYXApXG4iCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgUGFydGl0aW9uIGluaXQgc3RlcAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgICAgICAgICBzZXQgcHRuIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgICAgIHNldCB2YXJzKGRlc2lnbikgJHB0bgogICAgICAgICAgICBzZXQgc2tpcF9jcGYgZmFsc2UKICAgICAgICAgICAgc2V0IHNraXBfMTgwMSBmYWxzZQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHB0bl0gPT0gLTF9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyAgICAgICAgVE9QICgkcHRuKSBJTVBMRU1FTlRBVElPTiBGTE9XXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRDb25maWcgJHB0bi5jb25mIDBcbiIKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNhdmVfaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpICR2YXJzKHNhdmVfaWxtX25vbl9zZGNfZmlsZSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiZ2xvYmFsIHJkYV9JbnB1dFxuIgogICAgICAgICAgICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAibGFwcGVuZCByZGFfSW5wdXQodWlfbGVmZmlsZSkgLi4vJHBhcnQvJHBhcnQuYW50ZW5uYS5sZWZcbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiY29tbWl0Q29uZmlnXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2NvbmZpZyAkY29tbWFuZF0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXN0b3JlRGVzaWduIC1jZWxsVmlldyBcW2xpc3QgJHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHB0biBsYXlvdXRcXVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVzdG9yZURlc2lnbiAke3B0bn1fcHJvdG9fZWNvLmVuYy5kYXQgJHB0blxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVzdG9yZURlc2lnbiAke3B0bn1fcHJvdG9fZnVsbC5lbmMuZGF0ICRwdG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVzdG9yZURlc2lnbiAuICRwdG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImZmX3JlcGxhY2VfZmxleG1vZGVsX3dpdGhfZnVsbF9uZXRsaXN0XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlc3RvcmVEZXNpZ24gLiAkcHRuXG4iCiAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEzfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjplbmFibGVfbWV0cmljcyAtb25cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAidW06OnB1c2hfc25hcHNob3Rfc3RhY2tcbiIKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewojICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiaWYge1xbZmlsZSBleGlzdHMgLi4vJHBhcnQvJHBhcnQuYW50ZW5uYS5sZWZcXX0ge1xuIgojICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAibG9hZExlZkZpbGUgLi4vJHBhcnQvJHBhcnQuYW50ZW5uYS5sZWZcbiIKIyAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzb3VyY2UgJHB0bi5nbG9iYWxzXG4iCiMgICAgICAgICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKIyAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImxhcHBlbmQgaW5pdF9sZWZfZmlsZSAuLi8kcGFydC8kcGFydC5hbnRlbm5hLmxlZlxuIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImluaXRfZGVzaWduXG4iCiAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZXN0b3JlX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfZGVzaWduIHRydWUKCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh0b3ApfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSBbZmlsZSBub3JtYWxpemUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCldCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2xdCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0geyAKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGRpcnMgIiIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBibG9jayAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZGlycyAiXFxcbiAgIC1mbGV4X2lsbSB7JHtibG9ja30gLi4vJHtibG9ja30vJHtibG9ja30uZmxleGlsbX0iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNvbW1pdF9tb2R1bGVfbW9kZWwgJGRpcnNcXFxuIgogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLW1tbWNfZmlsZSAkdmFycyhtbW1jX2ZpbGUpXFxcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1jcGZfZmlsZSAkdmFycyhjcGZfZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHNraXBfY3BmIHRydWUgIAogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWVlZTE4MDFfZmlsZSldfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtbW1tY19maWxlICR2YXJzKG1tbWNfZmlsZSlcXFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLTE4MDEgJHZhcnMoaWVlZTE4MDFfZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHNraXBfMTgwMSB0cnVlICAKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1tbW1jX2ZpbGUgJHZhcnMobW1tY19maWxlKVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjb21taXRfbW9kdWxlX21vZGVsICRjb21tYW5kXQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFBBUlRJVElPTiAoJHB0bikgSU1QTEVNRU5UQVRJT04gRkxPV1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJsb2FkQ29uZmlnICRwdG4uY29uZlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9jb25maWcgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh1c2VfZmxleG1vZGVscyl9ICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVzdG9yZURlc2lnbiAke3B0bn1fcHJvdG9fZWNvLmVuYy5kYXQgJHB0blxuIgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVzdG9yZURlc2lnbiAke3B0bn1fcHJvdG9fZnVsbC5lbmMuZGF0ICRwdG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlc3RvcmVEZXNpZ24gLiAkcHRuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJmZl9yZXBsYWNlX2ZsZXhtb2RlbF93aXRoX2Z1bGxfbmV0bGlzdFxuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAicmVzdG9yZURlc2lnbiAtY2VsbFZpZXcgXFtsaXN0ICR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwdG4gbGF5b3V0XF1cbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlc3RvcmVEZXNpZ24gLiAkcHRuXG4iCiAgICMgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic291cmNlICRwdG4uZ2xvYmFsc1xuIgogICAjICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImluaXRfZGVzaWduXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVzdG9yZV9kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2Rlc2lnbiB0cnVlCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTN9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bTo6ZW5hYmxlX21ldHJpY3MgLW9uXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAidW06OnB1c2hfc25hcHNob3Rfc3RhY2tcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBhbHdheXNfc291cmNlX3RjbF0KICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBMb2FkIGZsb29ycGxhbiBmaWxlIG9yIERFRjsgdXNlIGRlZkluIHRvIGxvYWQgYSBERUYgZmlsZQogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHZhcnMoZGJzX2Zvcm1hdCkgImZlIl09PTB9IHsKICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgcmVzdG9yZV9kZXNpZ25dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAibG9hZEZQbGFuICRwdG4uZnBcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzb3VyY2UgJHB0bi5tb2RlXG4iCiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHB0bi5zY2FuLmRlZl19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJQdXRzIFwiPEZGPiBMT0FESU5HIFNDQU4gREVGIEZJTEUgJHB0bi5zY2FuLmRlZlwiXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZGVmSW4gJHB0bi5zY2FuLmRlZlxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAjIE92ZXJyaWRlIG1heGltdW0gcm91dGluZyBsYXllciBpZiBkZWZpbmVkIGZvciB0aGUgcGFydGl0aW9uCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwdG4sbWF4X3JvdXRlX2xheWVyKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRNYXhSb3V0ZUxheWVyICR2YXJzKCRwdG4sbWF4X3JvdXRlX2xheWVyKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKG1heF9yb3V0ZV9sYXllcilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMobWF4X3JvdXRlX2xheWVyKVxuIgogICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICMgU3BlY2lmeSB0aGUgSUxNIG1vZGVscyBmb3IgdGhlIHRvcCBwYXJ0aXRpb24KICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBpZiAkdmFycyh0b3ApIHsKICAgICAgICAgICAgICAgaWYgeyEkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxpbG1fZGlyKV0gJiYgKCR2YXJzKGNvZGVnZW4pIHx8IFtmaWxlIGlzZGlyZWN0b3J5ICR2YXJzKCRwYXJ0LGlsbV9kaXIpXSl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRwYXJ0IC1kaXIgJHZhcnMoJHBhcnQsaWxtX2RpcilcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAkdmFycygkcGFydCxpbG1fZGlyKVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRwYXJ0IC1kaXIgLi4vJHBhcnQvJHBhcnQuaWxtXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRwYXJ0XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRwYXJ0IC1kaXIgLi4vJHBhcnQvJHBhcnQuaWxtXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldElsbU1vZGUgInNldElsbU1vZGUgLWtlZXBGbGF0dGVuIHRydWVcbiJdCiAgICAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImlmIHtcW2ZpbGUgZXhpc3RzIC4uLyRwYXJ0LyRwYXJ0LmFudGVubmEubGVmXF19IHtcbiIKICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgbG9hZExlZkZpbGUgLi4vJHBhcnQvJHBhcnQuYW50ZW5uYS5sZWZcbiIKICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9sZWZfZmlsZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoaWxtKSAmJiBbaW5mbyBleGlzdHMgdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJsb2FkVGltaW5nQ29uIC1pbG1Ob25TZGNGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0SWxtTm9uU2RjQ29uc3RyYWludEZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9pbG1fbm9uX3NkY19maWxlICRjb21tYW5kXQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KICAgIyAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICMgICAgICAgICAgICAgICB9IGVsc2UgewogICAjICAgICAgICAgICAgICAgICAgc2V0IGRlZmVyX2NvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluaXRpYWxpemVfdGltaW5nICRjb21tYW5kXSAKICAgIyAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBMb2FkIHBvd2VyIGludGVudCAoaWYgaXQgaXMgZGVmaW5lZCkKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0pICYmICgkdmFycyhjcGZfZmlsZSkgIT0gIiIpICYmICEkc2tpcF9jcGZ9IHsKICAgICAgICAgICAgICAgc2V0IHNhdmUgJHZhcnMoY3BmX2ZpbGUpCiAgICAgICAgICAgICAgIGlmIHshJHZhcnModG9wKX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhjcGZfZmlsZSkgIiRwdG4uY3BmIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE0fSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6bG9hZF9wb3dlcl9pbnRlbnRdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IHZhcnMoY3BmX2ZpbGUpICRzYXZlIAogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWVlZTE4MDFfZmlsZSldICYmICEkc2tpcF8xODAxfSB7CiAgICAgICAgICAgICAgIHNldCBzYXZlICR2YXJzKGllZWUxODAxX2ZpbGUpCiAgICAgICAgICAgICAgIGlmIHshJHZhcnModG9wKX0gewojICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoaWVlZTE4MDFfZmlsZSkgIiRwdG4uY3BmIgogICAgICAgICAgICAgICAgICBzZXQgdmFycyhjcGZfZmlsZSkgIiRwdG4uY3BmZGIiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTR9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OmxvYWRfcG93ZXJfaW50ZW50XQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJlYWRfcG93ZXJfaW50ZW50ICR2YXJzKGllZWUxODAxX2ZpbGUpIC0xODAxXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNwZl9maWxlKVxuIgogICAgICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhpZWVlMTgwMV9maWxlKVxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgcG9zdC1pbml0aWFsaXphdGlvbiBwbHVnLWluIHNjcmlwdAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfaW5pdF90Y2wgMF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBDaGVjayBwcmUtcGxhY2UgdGltaW5nIChhbmQgZ2VuZXJhdGUgdGltaW5nIGdyYXBoIGZvciBwbGFjZW1lbnQpCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeygkdmFycyhzdGVwKSAhPSAibW9kZWxfZ2VuIikgJiYgKCR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UiKSAmJiAoJHZhcnMoc3RlcCkgIT0gInByb3RvdHlwZSIpfSB7CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGltZV9kZXNpZ25fb3B0aW9ucyxzZXR1cCldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJ0aW1lRGVzaWduIC1wcmVwbGFjZSAtcHJlZml4IHByZXBsYWNlIC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZURlc2lnbiAtcHJlcGxhY2UgLXByZWZpeCBwcmVwbGFjZSAtb3V0RGlyICR2YXJzKHJwdF9kaXIpICVzXG4iICR2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsc2V0dXApXQogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0aW1lX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIENoZWNrIGRhdGEgc2V0dXAgKHNhbml0eSBjaGVjaykKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBzZXQgY29tbWFuZCAiY2hlY2tEZXNpZ24gLWFsbFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY2hlY2tfZGVzaWduICRjb21tYW5kXQoKICAgICAgaWYgeyEkdmFycyhpbG0pfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJjaGVja190aW1pbmdcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNoZWNrX3RpbWluZyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEdlbmVyYXRlIHJlcG9ydHMKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIFJlcG9ydCBwb3dlciBkb21haW4gZm9yIGxldmVsLXNoaWZ0ZXJzLCBpc29sYXRpb24gYW5kIHBnIG5ldHMKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBpZiB7W0ZGOjppc19scF9mbG93XSAmJiAoW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfZG9tYWlucyldICYmIChbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAxKSl9IHsKIyAgICAgICAgIHNldCBjb21tYW5kICJzZXQgZG9tYWlucyBcW0ZGX0VESTo6Z2V0X3Bvd2VyX2RvbWFpbnNfY29kZVxdXG4iCiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmdldF9wb3dlcl9kb21haW5zX2NvZGVdCgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiZm9yZWFjaCBkb21haW4gXCRkb21haW5zIHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHNldCBkb21haW5fZmlsZSBcW3JlZ3N1YiAtYWxsIHtcW1xdXFs8PnxcXC8/KjpcXX0gXCRkb21haW4gX1xdXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICByZXBvcnRQb3dlckRvbWFpbiAtcG93ZXJEb21haW4gXCRkb21haW4gLWZpbGUgJHZhcnMocnB0X2RpcikvXCR7ZG9tYWluX2ZpbGV9LnJwdCAtc2hpZnRlciAtaXNvSW5zdCAtcGdOZXRcbiIKCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBSZXBvcnQgbGlicmFyeSBiaW5kaW5nIGZvciBwb3dlciBkb21haW5zCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIGZvcmVhY2ggYW5hbHlzaXNfdmlldyBcW2FsbF9zZXR1cF9hbmFseXNpc192aWV3c1xdIHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgIHNldF9kZWZhdWx0X3ZpZXcgLXNldHVwIFwkYW5hbHlzaXNfdmlld1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgcmVwb3J0UG93ZXJEb21haW4gLXBvd2VyRG9tYWluIFwkZG9tYWluIC1maWxlICR2YXJzKHJwdF9kaXIpL1wke2RvbWFpbl9maWxlfV9cJGFuYWx5c2lzX3ZpZXcucnB0IC1iaW5kTGliXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICB9XG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICBzZXRBbmFseXNpc01vZGUgLWNoZWNrVHlwZSBob2xkXG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgZm9yZWFjaCBhbmFseXNpc192aWV3IFxbYWxsX2hvbGRfYW5hbHlzaXNfdmlld3NcXSB7XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgICBzZXRfZGVmYXVsdF92aWV3IC1ob2xkIFwkYW5hbHlzaXNfdmlld1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgcmVwb3J0UG93ZXJEb21haW4gLXBvd2VyRG9tYWluIFwkZG9tYWluIC1maWxlICR2YXJzKHJwdF9kaXIpL1wke2RvbWFpbl9maWxlfV9cJGFuYWx5c2lzX3ZpZXcucnB0IC1iaW5kTGliXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICB9XG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0QW5hbHlzaXNNb2RlIC1jaGVja1R5cGUgc2V0dXBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wb3dlcl9kb21haW5zICRjb21tYW5kXQogICAgICAgICBpZiB7JHZhcnMoZmxvdykgPT0ibW1tYyJ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXRfZGVmYXVsdF92aWV3IC1zZXR1cCAkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpIC1ob2xkICR2YXJzKGRlZmF1bHRfaG9sZF92aWV3KVxuIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWVudHNdfSB7CiAgICAgICAgIGlmIHskY29tbWVudHMgPT0gIiJ9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNvbW1lbnRzKV19IHsKICAgICAgICAgICAgICAgdW5zZXQgdmFycyhjb21tZW50cykKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhjb21tZW50cykgJGNvbW1lbnRzCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHVjb21tZW50c119IHsKICAgICAgICAgaWYgeyR1Y29tbWVudHMgPT0gIiJ9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVjb21tZW50cyldfSB7CiAgICAgICAgICAgICAgIHVuc2V0IHZhcnModWNvbW1lbnRzKQogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB2YXJzKHVjb21tZW50cykgJHVjb21tZW50cwogICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0IGZjb21tYW5kcyBbRkZfRURJOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgZmNvbW1hbmRzICRjb21tYW5kcwoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkZmNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KCiAgIH0KCiAgIHByb2MgcnVuX3BsYWNlIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJlbnQpXSAmJiAoJHZhcnMocGFyZW50KSA9PSAicmMiKX0gewogICAgICAgICBzZXQgdmFycyhzdGVwKSByY3AKICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgeyR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UifSB7CiAgICAgICAgICAgIHNldCB2YXJzKHN0ZXApIHBsYWNlCiAgICAgICAgIH0KICAgICAgfQogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbml0aWFsaXplIHN0ZXAgLi4uCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6aW5pdGlhbGl6ZV9zdGVwIHBsYWNlXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluaXRpYWxpemVfc3RlcCAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiUHV0cyBcIjxGRj4gUlVOTklORyBQTEFDRU1FTlQgLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUExBQ0VNRU5UXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXSAmJiAoJHZhcnMoc3RlcCkgIT0gInBhcnRpdGlvbl9wbGFjZSIpICYmIFwKICAgICAgICAgICgoW2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICR2YXJzKGRlc2lnbildID09IC0xKSAmJiAkdmFycyhlbmFibGVfZmxleGlsbSkpfSB7CiAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRIaWVyTW9kZSAtb3B0U3RhZ2UgcHJlQ1RTXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfaGllcl9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAKICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgZm9yZWFjaCBibG9jayAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0UHRuUGluU3RhdHVzIC1jZWxsICRibG9jayAtcGluICogLXN0YXR1cyB1bnBsYWNlZFxuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHRuX3Bpbl9zdGF0dXMgJGNvbW1hbmRdCgogICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRUcmlhbFJvdXRlTW9kZSAtaG9ub3JQaW4gZmFsc2UgLWhhbmRsZVBhcnRpdGlvbkNvbXBsZXggdHJ1ZVxuIgogICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdHJpYWxfcm91dGVfbW9kZTEgJGNvbW1hbmRdCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldFJvdXRlTW9kZSAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yRmVuY2UgLiAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yUGluIHt9XG4iCiAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV9tb2RlMSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldE9wdE1vZGUgLWhhbmRsZVBhcnRpdGlvbkNvbXBsZXggdHJ1ZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X29wdF9tb2RlICRjb21tYW5kXQogICAgICAgICAKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcHJlIHBsYWNlbWVudCBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcGxhY2VfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJ1biBzdGFuZGFyZCBjZWxsIHBsYWNlbWVudCBvciBsb2FkIHBsYWNlbWVudCBwbHVnLWluCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwbGFjZV90Y2wpXX0gewogICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhwbGFjZV90Y2wpXX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCBbRkY6OnNvdXJjZV9wbHVnIHBsYWNlX3RjbF0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiUGx1Zy1pbiB2YXJzKHBsYWNlX3RjbCkgZGVmaW5lZCBidXQgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QiCiAgICAgICAgICAgIGluY3IgdmFycyhlcnJvcl9jb3VudCkKIyAgICAgICAgICAgIHNldCB2YXJzKGFib3J0KSAxCiAgICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzZHBfZmlsZXMpXX0gewogICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoc2RwX2ZpbGVzKSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjcmVhZFNkcEZpbGUgLWZpbGUgJGZpbGUgLWhpZXJQYXRoIDxpbnN0YW5jZT4gLW9yaWdpbiA8eCB5PiAtbGVmdE92ZXJHcm91cCA8dHJ1ZSB8IGZhbHNlPlxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIjcGxhbkRlc2lnbiAtdXNlU2RwR3JvdXBcbiIKICAgICAgICAgfQoKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcmVudCldICYmICgkdmFycyhwYXJlbnQpID09ICJyYyIpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJwbGFjZURlc2lnbiBcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyR2YXJzKHBsYWNlX29wdF9kZXNpZ24pICYmICgkdmFycyhzdGVwKSAhPSAicGFydGl0aW9uX3BsYWNlIil9IHsKIyAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhoaWVyKV19IHsKIyAgICAgICAgICAgICAgICAgIGlmIHsoJHZhcnModG9wKSAmJiAkdmFycyhlbmFibGVfZmxleGlsbSkpfSB7CiMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicGxhY2VEZXNpZ24gIgojICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTN9IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbl9wbGFjZV9vcHQpXSAmJiAkdmFycyhpbl9wbGFjZV9vcHQpfSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pblBsYWNlT3B0IgojICAgICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG5vX3ByZV9wbGFjZV9vcHQpXSAmJiAkdmFycyhub19wcmVfcGxhY2Vfb3B0KX0gewojICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbm9QcmVQbGFjZU9wdCIKIyAgICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKIyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicGxhY2Vfb3B0X2Rlc2lnbiAtb3V0X2RpciAkdmFycyhycHRfZGlyKSAtcHJlZml4ICR2YXJzKHN0ZXApXG4iCiMgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicGxhY2Vfb3B0X2Rlc2lnbiAtb3V0X2RpciAkdmFycyhycHRfZGlyKSAtcHJlZml4ICR2YXJzKHN0ZXApXG4iCiMgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBsYWNlRGVzaWduICIKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTN9IHsKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGluX3BsYWNlX29wdCldICYmICR2YXJzKGluX3BsYWNlX29wdCl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtaW5QbGFjZU9wdCIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHsoJHZhcnMoc3RlcCkgPT0gInBhcnRpdGlvbl9wbGFjZSIpICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKX0geyAgCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLW5vUHJlUGxhY2VPcHQiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhub19wcmVfcGxhY2Vfb3B0KV0gJiYgJHZhcnMobm9fcHJlX3BsYWNlX29wdCl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbm9QcmVQbGFjZU9wdCIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdCB2YXJzKHBhcmVudCldICYmICgkdmFycyhwYXJlbnQpICE9ICJyYyIpICYmICAkdmFycyhyYykgJiYgJHZhcnMoZW5hYmxlX3JjcCl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgImVjb1BsYWNlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlY29fcGxhY2UgJGNvbW1hbmRdCiAgICAgIH0gZWxzZSB7CiMgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaGllcl9jYXNlKV0gJiYgW3JlZ2V4cCAiXjEiICR2YXJzKGhpZXJfY2FzZSldfSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscGxhY2VfZGVzaWduICJwbGFjZURlc2lnbiAtbm9QcmVQbGFjZU9wdFxuIl0KIyAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxwbGFjZV9kZXNpZ24gJGNvbW1hbmRdCiMgICAgICAgICB9CiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHBvc3QgcGxhY2VtZW50IGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcGxhY2VfdGNsIDBdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQWRkIHRpZSBjZWxscyBmb3IgbG9naWMgMC8xIG5ldHMKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6YWRkX3RpZV9jZWxscyBmYWxzZSB0cnVlXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksYWRkX3RpZV9jZWxscyAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBDaGVjayBwb3N0LXBsYWNlIHRpbWluZwogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHshW3JlZ2V4cCAicGxhY2Vfb3B0X2Rlc2lnbiIgJGNvbW1hbmRzXSAmJiAoJHZhcnMoc3RlcCkgPT0gInBsYWNlIil9IHsKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV19IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVEZXNpZ24gLXByZWN0cyAtcHJlZml4IHBsYWNlIC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZURlc2lnbiAlcyAtcHJlY3RzIC1wcmVmaXggcGxhY2UgLW91dERpciAkdmFycyhycHRfZGlyKVxuIiAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV0KICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdGltZV9kZXNpZ24gJGNvbW1hbmRdCiAgICAgIH0KIyAgICAgIGlmIHsoJHZhcnMoc3RlcCkgPT0gInBhcnRpdGlvbl9wbGFjZSIpICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewojICAgICAgICAgaWYgeyFbcmVnZXhwICJwcm90byIgJGNvbW1hbmRdfSB7CiMgICAgICAgICAgICByZWdzdWIgInRpbWVEZXNpZ24iICRjb21tYW5kICJ0aW1lRGVzaWduIC1wcm90byIgY29tbWFuZAojICAgICAgICAgfQojICAgICAgfQoKICAgICAgaWYgeygkdmFycyh1c2VyX21vZGUpID09ICJoaWVyIikgJiYgJHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikgJiYgKCR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UiKX0gewogICAgICAgICBzZXQgcHRuIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmIChbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHB0bl0gIT0gLTEpfSB7CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNyZWF0ZUludGVyZmFjZUxvZ2ljIC1kaXIgJHB0bi5mbGV4aWxtIC11c2VUeXBlIGZsZXhJbG0gLW9wdFN0YWdlIHByZUNUU1xuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2ZsZXhfaWxtICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7ISR2YXJzKGJsYWNrX2JveCl9IHsKICAgICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtbW9kZWxUeXBlIHRpbWluZyAtZGlyICRwdG4uaWxtIC1ob2xkXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtbW9kZWxUeXBlIHRpbWluZyAtY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwdG4gYWJzdHJhY3R9XG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9pbG0gJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2F2ZURlc2lnbiAkdmFycyhkYnNfZGlyKS9wcmVjdHNfZmxleGlsbS5lbmMgLWNvbXByZXNzXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzYXZlX2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgICAgICAgICAgICMgUmUtYXNzaWduIHBpbnMgYmFzZWQgb24gbmV3IG5ldGxpc3QgY2hhbmdlcwogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ0cmlhbFJvdXRlXG4iCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlMSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiZWFybHlHbG9iYWxSb3V0ZVxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGUxICRjb21tYW5kXQogICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ0aW1lRGVzaWduIC1wcmVDVFMgLW91dERpciAkdmFycyhycHRfZGlyKSAtcHJlZml4IHByZWN0c19mbGV4aWxtXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0aW1lX2Rlc2lnbl9mbGV4aWxtICRjb21tYW5kXQoKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImFzc2lnblB0blBpblxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksYXNzaWduX3B0bl9waW4gJGNvbW1hbmRdCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiY2hlY2tQaW5Bc3NpZ25tZW50XG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjaGVja19waW5fYXNzaWdubWVudCAkY29tbWFuZF0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1ob25vclBpbiB0cnVlXG4iCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlMiAkY29tbWFuZF0KICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ0cmlhbFJvdXRlXG4iCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlMiAkY29tbWFuZF0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0Um91dGVNb2RlIC1lYXJseUdsb2JhbFJvdXRlUGFydGl0aW9uSG9ub3JQaW4gLlxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfbW9kZTIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiZWFybHlHbG9iYWxSb3V0ZVxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGUyICRjb21tYW5kXQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAKIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0QnVkZ2V0aW5nTW9kZSAtZW5hYmxlTVRCdWRnZXRpbmcgdHJ1ZVxuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9idWRnZXRpbmdfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJkZXJpdmVUaW1pbmdCdWRnZXRcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcml2ZV90aW1pbmdfYnVkZ2V0ICRjb21tYW5kXQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgc2V0IGRpcnMgIiIKICAgICAgICAgICAgICAgZm9yZWFjaCBibG9jayAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICAgICBhcHBlbmQgZGlycyAiXFxcbiAgIC1nb2xkZW5CbG9ja0RpciAuLi8kYmxvY2svJHZhcnMoZGJzX2RpcikvcGxhY2UuZW5jLmRhdCAiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInVwZGF0ZV9wYXJ0aXRpb24gXFxcbiAgIC1mbGV4SWxtRUNPICRkaXJzIFxcXG4gICAtZmxleElsbURpciAuLi8uLi9QQVJUSVRJT05fRkxFWElMTSBcXFxuICAgLXBvc3RFQ09TdWZmaXggcG9zdEVDTyAtcGluTG9jYXRpb25cbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ1cGRhdGVfcGFydGl0aW9uIFxcXG4gICAtZmxleElsbUVDTyAkZGlycyBcXFxuICAgLWZsZXhJbG1EaXIgLi4vLi4vUEFSVElUSU9OX0ZMRVhJTE0gXFxcbiAgIC1wb3N0RUNPU3VmZml4IHBvc3RFQ08gLXBpbkxvY2F0aW9uIC1hbGxvd1BvcnRFQ09cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV9wYXJ0aXRpb24gJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fcHJlY3RzIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIHdhcm5pbmdzCgogICAgICBpZiB7JHZhcnMocGxhY2Vfb3B0X2Rlc2lnbil9IHsKIyAgICAgICAgIGlmIHshKCR2YXJzKHVzZXJfbW9kZSkgPT0gImhpZXIiKX0gewogICAgICAgICAgICByZXR1cm4gIiIKIyAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJGZWF0dXJlIHZhcnMocGxhY2Vfb3B0X2Rlc2lnbikgbm90IHN1cHBvcnQgZm9yIHRvcCBsZXZlbCBpbXBsZW1lbnRhdGlvbiB3aGVuIHZhcnMoZW5hYmxlX2ZsZXhpbG0pIGlzIHRydWUiCiMgICAgICAgICAgICBpbmNyIHZhcnMod2FybmluZ19jb3VudCkKIyAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcmVudCldICYmICgkdmFycyhwYXJlbnQpID09ICJyYyIpfSB7CiAgICAgICAgIHNldCB2YXJzKHN0ZXApIHJjcAogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgdmFycyhzdGVwKSBwcmVjdHMKICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3N0ZXAgcHJlY3RzXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluaXRpYWxpemVfc3RlcCAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiUHV0cyBcIjxGRj4gUlVOTklORyBQUkUtQ1RTIE9QVElNSVpBVElPTiAuLi5cIlxuIgoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBQUkUtQ1RTIE9QVElNSVpBVElPTlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcHJlIENUUyBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcHJlY3RzX3RjbF0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJlbnQpXSAmJiAoJHZhcnMocGFyZW50KSA9PSAicmMiKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gcHJlLUNUUyBvcHRpbWl6YXRpb24KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeyhbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldKSAmJiAoW2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtwd2RdXV0gPT0gIiR2YXJzKHBhcnRpdGlvbl9kaXIpIil9IHsKICAgICAgICAgc2V0IHB0biBbZmlsZSB0YWlsIFtwd2RdXQogICAgICAgICBpZiB7KFtsc2VhcmNoICR2YXJzKHBhcnRpdGlvbl9saXN0KSAkcHRuXSA9PSAtMSkgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICMgVG9wIGxldmVsIGZsb3cgZm9yIGZsZXhJbG0KICAgICAgICAgICAgCiAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgIGZvcmVhY2ggYmxvY2sgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldFB0blBpblN0YXR1cyAtY2VsbCAkYmxvY2sgLXBpbiAqIC1zdGF0dXMgdW5wbGFjZWRcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3B0bl9waW5fc3RhdHVzICRjb21tYW5kXQogICAgICAgICAgICAKICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0VHJpYWxSb3V0ZU1vZGUgLWhvbm9yUGluIGZhbHNlIC1oYW5kbGVQYXJ0aXRpb25Db21wbGV4IHRydWVcbiIKICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdHJpYWxfcm91dGVfbW9kZTEgJGNvbW1hbmRdCiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRSb3V0ZU1vZGUgLWVhcmx5R2xvYmFsUm91dGVQYXJ0aXRpb25Ib25vckZlbmNlIC4gLWVhcmx5R2xvYmFsUm91dGVQYXJ0aXRpb25Ib25vclBpbiB7fVxuIgogICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV9tb2RlMSAkY29tbWFuZF0KICAgICAgICAgICB9CiAgICAgICAgICAgCiMgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldEhpZXJNb2RlIC1vcHRTdGFnZSBwcmVDVFNcbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfaGllcl9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldE9wdE1vZGUgLWhhbmRsZVBhcnRpdGlvbkNvbXBsZXggdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X29wdF9tb2RlICRjb21tYW5kXQogICAgICAgICAgICAKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIm9wdERlc2lnbiAtcHJlQ1RTIC1vdXREaXIgJHZhcnMocnB0X2RpcikgLXByZWZpeCBmbGV4aWxtXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxvcHRfZGVzaWduICRjb21tYW5kXQogICAgICAgICAgICAKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNhdmVEZXNpZ24gJHZhcnMoZGJzX2RpcikvcHJlY3RzX2ZsZXhpbG0uZW5jIC1jb21wcmVzc1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2F2ZV9kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICMgTm9uIGZsZXhJbG0gdG9wIGZsb3cgYW5kIHBhcnRpdGlvbiBmbG93CiAgICAgICAgICAgc2V0IGNvbW1hbmQgIm9wdERlc2lnbiAtcHJlQ1RTIC1vdXREaXIgJHZhcnMocnB0X2RpcikgLXByZWZpeCBwcmVjdHNcbiIKICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksb3B0X2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAjIEZsYXQgZmxvdyAKICAgICAgICBzZXQgY29tbWFuZCAib3B0RGVzaWduIC1wcmVDVFMgLW91dERpciAkdmFycyhycHRfZGlyKSAtcHJlZml4IHByZWN0c1xuIgogICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxvcHRfZGVzaWduICRjb21tYW5kXQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwb3N0IENUUyBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3ByZWN0c190Y2wgMF0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19nYXRlX2Nsb25lKV0gJiYgJHZhcnMoY2xvY2tfZ2F0ZV9jbG9uZSl9IHsKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBDTE9DSyBHQVRFIENMT05JTkdcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIH0KICAgICAgICAgIyBTZXQgc3BlY19maWxlIGlmIG9uZSBpcyBkZWZpbmVkCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfc3BlYyldfSB7CiAgICAgICAgICAgIHNldCBzcGVjX2ZpbGUgJHZhcnMoY3RzX3NwZWMpCiAgICAgICAgIH0KICAgICAgICAgaWYgeyhbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldKSAmJgogICAgICAgICAgICAgKFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dID09ICIkdmFycyhwYXJ0aXRpb25fZGlyKSIpfSB7CiAgICAgICAgICAgIHNldCBwdG4gW2ZpbGUgdGFpbCBbcHdkXV0KICAgICAgICAgICAgIyBPdmVycmlkZSB3aXRoIHBhcnRpdGlvbiBzcGVjIGlmIGRlZmluZWQKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwdG4sY3RzX3NwZWMpXX0gewogICAgICAgICAgICAgICBzZXQgc3BlY19maWxlICR2YXJzKCRwdG4sY3RzX3NwZWMpCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAjIExvYWQgZmluYWwgc3BlYyBmaWxlIG9yIGdlbmVyYXRlIG9uZQojICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBzcGVjX2ZpbGVdfSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNsZWFudXBTcGVjaWZ5Q2xvY2tUcmVlXG4iCiMgICAgICAgICAgICBmb3JlYWNoIHNwZWMgJHNwZWNfZmlsZSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNwZWNpZnlDbG9ja1RyZWUgLWZpbGUgJHNwZWNcbiIKIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImNyZWF0ZUNsb2NrVHJlZVNwZWNcbiIKIyAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfY2VsbHMpXX0gewojICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNwZWNpZnlDbG9ja1RyZWUgLXVwZGF0ZSBcIkF1dG9DVFNSb290UGluICogQnVmZmVyIFxbbGlzdCAkdmFycyhjdHNfY2VsbHMpXF1cIlxuIgojICAgICAgICAgICAgfQojICAgICAgICAgfQojICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJvdXRlX2Nsb2NrX25ldHMpXSAmJiAkdmFycyhyb3V0ZV9jbG9ja19uZXRzKX0gewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzcGVjaWZ5Q2xvY2tUcmVlIC11cGRhdGUgXCJBdXRvQ1RTUm9vdFBpbiAqIFJvdXRlQ2xrTmV0IFlFU1wiXG4iCiMgICAgICAgICB9CiAgIAogICAgICAgICBzZXQgY29tbWFuZCAiY2tDbG9uZUdhdGUgLXRpbWluZ0RyaXZlbiAtZm9yY2VSZWNvbnZlcmdlbnRcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNrX2Nsb25lX2dhdGUgJGNvbW1hbmRdCiAgICAgIH0KICAgICAgaWYgeygkdmFycyh1c2VyX21vZGUpID09ICJoaWVyIil9IHsKICAgICAgICAgc2V0IHB0biBbZmlsZSB0YWlsIFtwd2RdXQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXSAmJiAoW2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICRwdG5dICE9IC0xKSAmJiAhJHZhcnMocGxhY2Vfb3B0X2Rlc2lnbil9IHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiY3JlYXRlSW50ZXJmYWNlTG9naWMgLWRpciAkcHRuLmZsZXhpbG0gLXVzZVR5cGUgZmxleElsbSAtb3B0U3RhZ2UgcHJlQ1RTXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjcmVhdGVfZmxleF9pbG0gJGNvbW1hbmRdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHshJHZhcnMoYmxhY2tfYm94KX0gewogICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgImZlIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNyZWF0ZUludGVyZmFjZUxvZ2ljIC1tb2RlbFR5cGUgdGltaW5nIC1kaXIgJHB0bi5pbG0gLWhvbGRcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNyZWF0ZUludGVyZmFjZUxvZ2ljIC1tb2RlbFR5cGUgdGltaW5nIC1jZWxsdmlldyB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHB0biBhYnN0cmFjdH1cbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2lsbSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeyA7ICMgVG9wIGxldmVsIHVuY29uZGl0aW9uYWwgKG5vIHBsYWNlX29wdF9kZXNpZ24gc3VwcG9ydCkgLi4uCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgICAgIyBSZS1hc3NpZ24gcGlucyBiYXNlZCBvbiBuZXcgbmV0bGlzdCBjaGFuZ2VzCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInRyaWFsUm91dGVcbiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdHJpYWxfcm91dGUxICRjb21tYW5kXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X3JvdXRlMSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInRpbWVEZXNpZ24gLXByZUNUUyAtb3V0RGlyICR2YXJzKHJwdF9kaXIpIC1wcmVmaXggYXNzZW1ibGVfZmxleGlsbVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdGltZV9kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiYXNzaWduUHRuUGluXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxhc3NpZ25fcHRuX3BpbiAkY29tbWFuZF0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjaGVja1BpbkFzc2lnbm1lbnRcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNoZWNrX3Bpbl9hc3NpZ25tZW50ICRjb21tYW5kXQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0VHJpYWxSb3V0ZU1vZGUgLWhvbm9yUGluIHRydWVcbiIKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3RyaWFsX3JvdXRlX21vZGUyICRjb21tYW5kXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRSb3V0ZU1vZGUgLWVhcmx5R2xvYmFsUm91dGVQYXJ0aXRpb25Ib25vclBpbiAuXG4iCiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV9tb2RlMiAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0cmlhbF9yb3V0ZTIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiZWFybHlHbG9iYWxSb3V0ZVxuIgogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9yb3V0ZTIgJGNvbW1hbmRdCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiMgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0QnVkZ2V0aW5nTW9kZSAtZW5hYmxlTVRCdWRnZXRpbmcgdHJ1ZVxuIgojICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9idWRnZXRpbmdfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJkZXJpdmVUaW1pbmdCdWRnZXRcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcml2ZV90aW1pbmdfYnVkZ2V0ICRjb21tYW5kXQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgICAgICAgc2V0IGRpcnMgIiIKICAgICAgICAgICAgICAgZm9yZWFjaCBibG9jayAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMocGxhY2Vfb3B0X2Rlc2lnbil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGRpcnMgIlxcXG4gICAtZ29sZGVuQmxvY2tEaXIgLi4vJGJsb2NrLyR2YXJzKGRic19kaXIpL3BsYWNlLmVuYy5kYXQgIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZGlycyAiXFxcbiAgIC1nb2xkZW5CbG9ja0RpciAuLi8kYmxvY2svJHZhcnMoZGJzX2RpcikvcHJlY3RzLmVuYy5kYXQgIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInVwZGF0ZV9wYXJ0aXRpb24gXFxcbiAgIC1mbGV4SWxtRUNPICRkaXJzIFxcXG4gICAtZmxleElsbURpciAuLi8uLi9QQVJUSVRJT05fRkxFWElMTSBcXFxuICAgLXBvc3RFQ09TdWZmaXggcG9zdEVDTyAtcGluTG9jYXRpb25cbiIKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ1cGRhdGVfcGFydGl0aW9uIFxcXG4gICAtZmxleElsbUVDTyAkZGlycyBcXFxuICAgLWZsZXhJbG1EaXIgLi4vLi4vUEFSVElUSU9OX0ZMRVhJTE0gXFxcbiAgIC1wb3N0RUNPU3VmZml4IHBvc3RFQ08gLXBpbkxvY2F0aW9uIC1hbGxvd1BvcnRFQ09cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV9wYXJ0aXRpb24gJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX2N0cyB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgaWYgeyR2YXJzKHNraXBfY3RzKX0gewogICAgICAgICByZXR1cm4gIiIKICAgICAgfQoKICAgICAgc2V0IHZhcnMoc3RlcCkgY3RzCiAgICAgIHNldCBjb21tYW5kcyAiIgogICAgICBzZXQgdWNvbW1lbnRzICIiCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3N0ZXAgY3RzXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyxpbml0aWFsaXplX3N0ZXAgJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnModG9wKSAmJiAoJHZhcnModXNlcl9tb2RlKSA9PSAiaGllciIpICYmICgkdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIikgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICMgUmVhZCBQb3dlciBJbnRlbnQgaGVyZSAuLi4KICAgICAgICAgRkZfRURJOjpub3JtYWxpemVfZmlsZXMKIyAgICAgICAgIHNldCBzYXZlICR2YXJzKGNwZl9wb3dlcl9kb21haW4pCiMgICAgICAgICBzZXQgdmFycyhjcGZfcG93ZXJfZG9tYWluKSB0cnVlCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6bG9hZF9wb3dlcl9pbnRlbnRdCiMgICAgICAgICBzZXQgdmFycyhjcGZfcG93ZXJfZG9tYWluKSAkc2F2ZQogICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LGlsbV9kaXIpXSAmJiAoJHZhcnMoY29kZWdlbikgfHwgW2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMoJHBhcnQsaWxtX2RpcildKX0gewogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAkdmFycygkcGFydCxpbG1fZGlyKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydFxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydCAtZGlyICR2YXJzKCRwYXJ0LGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAuLi8kcGFydC8kcGFydC5pbG1cbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnRcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAuLi8kcGFydC8kcGFydC5pbG1cbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7JGNvbW1hbmQgIT0gIiJ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNwZWNpZnlfaWxtICRjb21tYW5kXQogICAgICAgICB9CgogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQojICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldIHx8IChbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICEkdmFycyhjcGZfdGltaW5nKSkgfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KIyAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICBzZXQgZGVmZXJfY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdIAojICAgICAgICAgfQogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNH0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6bG9hZF9wb3dlcl9pbnRlbnRdCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfTk9WVVM6OmxvYWRfcG93ZXJfaW50ZW50XQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiUHV0cyBcIjxGRj4gUlVOTklORyBDTE9DSyBUUkVFIFNZTlRIRVNJUyAuLi5cIlxuIgoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBDTE9DSyBUUkVFIFNZTlRIRVNJU1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgcHJlLUNUUyBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY3RzIn0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfY3RzX3RjbF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJ1biBDVFMKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIEdlbmVyYXRlIHRoZSBjbG9jayB0cmVlIHVzaW5nIGNsb2NrRGVzaWduIHdoaWNoOgogICAgICAjIC0gbG9hZHMgdGhlIGNsb2NrIHNwZWNpZmljYXRpb24gZmlsZQogICAgICAjIC0gcmVtb3ZlcyBleGlzdGluZyBidWZmZXJzIGluIHRoZSBjbG9jayB0cmVlIChub3QgbWFya2VkIGRvbid0IHRvdWNoKTsKICAgICAgIyAgIGlmIGEgY2xvY2sgdHJlZSBoYXMgYmVlbiBwcmV2aW91c2x5IGluc2VydGVkLCB1c2UgY2hhbmdlQ2xvY2tTdGF0dXMKICAgICAgIyAgIHRvIHVuZml4IHRoZSB0cmVlIHNvIHRoYXQgaXQgY2FuIGJlIHJlbW92ZWQKICAgICAgIyAtIHVuZml4ZXMgdGhlIGNsb2NrIG5ldHMgYWZ0ZXIgdHJlZSBpbnNlcnRpb24KICAgICAgIyBOZWVkIHRvIG1ha2Ugc3VyZSB0aGUgY2xvY2sgZ2F0aW5nIGNlbGxzIGFyZSB1c2FibGUgZHVyaW5nIGNsb2NrRGVzaWduLgogICAgICAjIERpc2FibGUgdGhlbSBhZnRlcndhcmRzLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY2xvY2tfZ2F0ZV9jZWxscyBbbGlzdF0KICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2dhdGVfY2VsbHMpXX0gewogICAgICAgICBzZXQgY2xvY2tfZ2F0ZV9jZWxscyAkdmFycyhjbG9ja19nYXRlX2NlbGxzKQogICAgICAgICBmb3JlYWNoIGNlbGwgJGNsb2NrX2dhdGVfY2VsbHMgewogICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldERvbnRVc2UgJGNlbGwgZmFsc2VcbiIKICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsZW5hYmxlX2Nsb2NrX2dhdGVfY2VsbHMgJGNvbW1hbmRdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUnVuIENUUwogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBpZiB7W3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXSA9PSAiY3RzIn0gewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX3RjbCldfSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoY3RzX3RjbCldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGN0c190Y2xdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiUGx1Zy1pbiB2YXJzKGN0c190Y2wpIGRlZmluZWQgYnV0IHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICBpbmNyIHZhcnMoZXJyb3JfY291bnQpCiMgICAgICAgICAgICAgICBzZXQgdmFycyhhYm9ydCkgMQogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfc3BlYyldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjbGVhbnVwU3BlY2lmeUNsb2NrVHJlZVxuIgogICAgICAgICAgICAgICBmb3JlYWNoIHNwZWMgJHZhcnMoY3RzX3NwZWMpIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlDbG9ja1RyZWUgLWZpbGUgJHNwZWNcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNX0gewogICAgICAgICAgICAgICAgICBpZiB7ISR2YXJzKGlsbSl9IHsgCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjcmVhdGVDbG9ja1RyZWVTcGVjXG4iCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfY2VsbHMpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5Q2xvY2tUcmVlIC11cGRhdGUgXCJBdXRvQ1RTUm9vdFBpbiAqIEJ1ZmZlciAkdmFycyhjdHNfY2VsbHMpXCJcbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX3NwZWMpXSB8fCAoIVtpbmZvIGV4aXN0cyB2YXJzKGN0c19zcGVjKV0gJiYgKFtsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTUpKX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocm91dGVfY2xvY2tfbmV0cyldICYmICR2YXJzKHJvdXRlX2Nsb2NrX25ldHMpfSB7CiAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlDbG9ja1RyZWUgLXVwZGF0ZSBcIkF1dG9DVFNSb290UGluICogUm91dGVDbGtOZXQgWUVTXCJcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLGNyZWF0ZV9jbG9ja190cmVlX3NwZWMgJGNvbW1hbmRdCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgICAgICAgIGlmIHskdmFycyh1cGRhdGVfaW9fbGF0ZW5jeSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNsb2NrRGVzaWduIC1za2lwVGltZURlc2lnbiAtdXBkYXRlSW9MYXRlbmN5IC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNsb2NrRGVzaWduIC1za2lwVGltZURlc2lnbiAtb3V0RGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNsb2NrRGVzaWduIC1za2lwVGltZURlc2lnbiAtb3V0RGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyxjbG9ja19kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgZm9yZWFjaCBjZWxsICRjbG9ja19nYXRlX2NlbGxzIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldERvbnRVc2UgJGNlbGwgdHJ1ZVxuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsZGlzYWJsZV9jbG9ja19nYXRlX2NlbGxzICRjb21tYW5kXQoKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAjIFJ1biBja0VDTyBpZiByZXF1ZXN0ZWQKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2VjbyldICYmICgoJHZhcnMoY2xvY2tfZWNvKSA9PSAicG9zdF9jdHMiKSB8fCAoJHZhcnMoY2xvY2tfZWNvKSA9PSAiYm90aCIpKX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjpydW5fY2xvY2tfZWNvIHBvc3RfY3RzXQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLHJ1bl9jbG9ja19lY28gJGNvbW1hbmRdCiAgICAgICAgIH0KCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBVcGRhdGUgdGltaW5nIGJhc2VkIG9uIHZhcnMoPG1vZGU+LGluY3JfY3RzX3NkYykgYW5kCiAgICAgICAgICMgdmFycyg8bW9kZT4scG9zdF9jdHNfc2RjKQogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICBpZiB7JHZhcnMoZmxvdykgPT0gIm1tbWMifSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OnVwZGF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyx1cGRhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjpkZXJhdGVfdGltaW5nIG1tbWNdCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjp1cGRhdGVfdGltaW5nIG1pbm1heF0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyx1cGRhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjpkZXJhdGVfdGltaW5nIG1pbm1heF0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKGlsbSkgJiYgW2luZm8gZXhpc3RzIHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAibG9hZFRpbWluZ0NvbiAtaWxtTm9uU2RjRmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0SWxtTm9uU2RjQ29uc3RyYWludEZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcihzdGVwKSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgQ2hlY2sgcG9zdC1jdHMgdGltaW5nCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV19IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVEZXNpZ24gLXBvc3RjdHMgLXByZWZpeCBjdHMgLW91dERpciAkdmFycyhycHRfZGlyKVxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCBbZm9ybWF0ICJ0aW1lRGVzaWduIC1wb3N0Y3RzIC1wcmVmaXggY3RzIC1vdXREaXIgJHZhcnMocnB0X2RpcikgJXNcbiIgJHZhcnModGltZV9kZXNpZ25fb3B0aW9ucyxzZXR1cCldCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyx0aW1lX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfSBlbHNlIHsKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAjIFJ1biBjY29wdERlc2lnbiAuLi4gY29udmVydCB0byBwcm9wYWdhdGVkIHRpbWluZyBmaXJzdAogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfdGNsKV19IHsKICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhjdHNfdGNsKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX2N0c190Y2xdCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGN0c190Y2xdCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiUGx1Zy1pbiB2YXJzKGN0c190Y2wpIGRlZmluZWQgYnV0IHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgICAgICBpbmNyIHZhcnMoZXJyb3JfY291bnQpCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGlzX25hdGl2ZSBbZXhwciB7JHZhcnMoY2NvcHRfaW50ZWdyYXRpb24pID09ICJuYXRpdmUifV0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6dXBkYXRlX3RpbWluZyBtbW1jIFtleHByICEkaXNfbmF0aXZlXV0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyx1cGRhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjpkZXJhdGVfdGltaW5nIG1tbWNdCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfY3RzX3RjbF0KICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDE0fSB7CiAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJeY2NvcHQiICR2YXJzKGN0c19lbmdpbmUpXSAmJiAoJHZhcnMoY2NvcHRfZWZmb3J0KSAhPSAibG93Iil9IHsKICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcG9zdGN0c190Y2wgMF0KICAgICAgICAgICAgICAgICBpZiB7JHZhcnMocG9zdGN0c19zZXR1cF9ob2xkKX0gewogICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wb3N0Y3RzX2hvbGRfdGNsXQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JHZhcnMoY2NvcHRfZWZmb3J0KSAhPSAibG93In0gewogICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wb3N0Y3RzX3RjbCAwXQogICAgICAgICAgICAgICAgIGlmIHskdmFycyhwb3N0Y3RzX3NldHVwX2hvbGQpfSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3Bvc3RjdHNfaG9sZF90Y2xdCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGNjb3B0X2VmZm9ydCkgIT0gImxvdyJ9IHsKIyAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfY2NvcHRfbW9kZSAic2V0X2Njb3B0X21vZGUgLWVmZm9ydCAkdmFycyhjY29wdF9lZmZvcnQpXG4iXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Njb3B0X21vZGUgInNldF9jY29wdF9lZmZvcnQgLSR2YXJzKGNjb3B0X2VmZm9ydClcbiJdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY2NvcHRfY3RzIn0gewogICAgICAgICAgICAgICBzZXQgY2NvcHRfY29tbWFuZCAiY2NvcHRfZGVzaWduIC1vdXREaXIgJHZhcnMocnB0X2RpcikgLXByZWZpeCAkdmFycyhzdGVwKSAtY3RzIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY2NvcHRfY29tbWFuZCAiY2NvcHRfZGVzaWduIC1vdXREaXIgJHZhcnMocnB0X2RpcikgLXByZWZpeCAkdmFycyhzdGVwKSIKCiAgICAgICAgICAgICAgIGlmIHskdmFycyhwb3N0Y3RzX3NldHVwX2hvbGQpfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjY29wdF9jb21tYW5kICIgLWhvbGQiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyRpc19uYXRpdmV9IHsKICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDE0fSB7CiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhjdHNfZW5naW5lKSA9PSAiY2NvcHRfY3RzIiAmJiBbaW5mbyBleGlzdHMgdmFycyhjdHNfc3BlYyldfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjbGVhbnVwU3BlY2lmeUNsb2NrVHJlZVxuIgogICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIHNwZWMgJHZhcnMoY3RzX3NwZWMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlDbG9ja1RyZWUgLWZpbGUgJHNwZWNcbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X2Njb3B0X21vZGUgLWltcG9ydF9lZGlfY3RzX3NwZWMgdHJ1ZVxuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLGNyZWF0ZV9jY29wdF9jbG9ja190cmVlX3NwZWMgJGNvbW1hbmRdCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfY2NvcHRfY2xvY2tfdHJlZV9zcGVjXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsY3JlYXRlX2Njb3B0X2Nsb2NrX3RyZWVfc3BlYyAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7KCR2YXJzKGNjb3B0X2VmZm9ydCkgPT0gImxvdyIpICYmIFtpbmZvIGV4aXN0cyB2YXJzKGN0c19zcGVjKV19IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImNsZWFudXBTcGVjaWZ5Q2xvY2tUcmVlXG4iCiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggc3BlYyAkdmFycyhjdHNfc3BlYykgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUNsb2NrVHJlZSAtZmlsZSAkc3BlY1xuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfY2NvcHRfbW9kZSAtaW1wb3J0X2VkaV9jdHNfc3BlYyB0cnVlXG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsY3JlYXRlX2Njb3B0X2Nsb2NrX3RyZWVfc3BlYyAkY29tbWFuZF0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNyZWF0ZV9jY29wdF9jbG9ja190cmVlX3NwZWNcbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyxjcmVhdGVfY2NvcHRfY2xvY2tfdHJlZV9zcGVjICRjb21tYW5kXQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXBwZW5kIGNjb3B0X2NvbW1hbmQgIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgY3RzLGNjb3B0X2Rlc2lnbiAkY2NvcHRfY29tbWFuZF0KICAgICAgICAgfQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwb3N0IENUUyBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X2N0c190Y2wgMF0KICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDE0fSB7CiAgICAgICAgIGlmIHtbcmVnZXhwICJeY2NvcHQiICR2YXJzKGN0c19lbmdpbmUpXSAmJiAoJHZhcnMoY2NvcHRfZWZmb3J0KSAhPSAibG93Iil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wb3N0Y3RzX3RjbCAwXQogICAgICAgICAgICBpZiB7JHZhcnMocG9zdGN0c19zZXR1cF9ob2xkKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3Bvc3RjdHNfaG9sZF90Y2xdCiAgICAgICAgICAgIH0KICAgICAgICAgfSAKICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgeyR2YXJzKGNjb3B0X2VmZm9ydCkgIT0gImxvdyJ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wb3N0Y3RzX3RjbCAwXQogICAgICAgICAgICBpZiB7JHZhcnMocG9zdGN0c19zZXR1cF9ob2xkKX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3Bvc3RjdHNfaG9sZF90Y2xdCiAgICAgICAgICAgIH0KICAgICAgICAgfSAKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJlc2V0IGNsb2NrIGdhdGluZyBjZWxsIHVzYWdlCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGlmIHskdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIn0gewogICAgICAgICBzZXQgcHRuIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmIChbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHB0bl0gIT0gLTEpICYmICEkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtbW9kZWxUeXBlIHRpbWluZyAtZGlyICRwdG4uaWxtIC1ob2xkXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtbW9kZWxUeXBlIHRpbWluZyAtY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwdG4gYWJzdHJhY3R9XG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtbW9kZWxUeXBlIHRpbWluZyAtZGlyICRwdG4uaWxtIC1ob2xkXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2lsbSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX3ByZXJvdXRlIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBzZXQgdmFycyhzdGVwKSBwcmVyb3V0ZQogICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgc2V0IHVjb21tZW50cyAiIgoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEluaXRpYWxpemUgc3RlcCAuLi4KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6aW5pdGlhbGl6ZV9zdGVwIHBsYWNlXQogICAgICBhcHBlbmQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3N0ZXAgcHJlY3RzXQogICAgICBhcHBlbmQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3N0ZXAgY3RzXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHByZXJvdXRlLGluaXRpYWxpemVfc3RlcCAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyh0b3ApICYmICgkdmFycyh1c2VyX21vZGUpID09ICJoaWVyIikgJiYgKCR2YXJzKGhpZXJfZmxvd190eXBlKSA9PSAiMnBhc3MiKSAmJiAkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgIyBSZWFkIFBvd2VyIEludGVudCBoZXJlIC4uLgogICAgICAgICBGRl9FREk6Om5vcm1hbGl6ZV9maWxlcwogICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LGlsbV9kaXIpXSAmJiAoJHZhcnMoY29kZWdlbikgfHwgW2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMoJHBhcnQsaWxtX2RpcildKX0gewogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAkdmFycygkcGFydCxpbG1fZGlyKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydFxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydCAtZGlyICR2YXJzKCRwYXJ0LGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAuLi8kcGFydC8kcGFydC5pbG1cbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnRcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAuLi8kcGFydC8kcGFydC5pbG1cbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7JGNvbW1hbmQgIT0gIiJ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNwZWNpZnlfaWxtICRjb21tYW5kXQogICAgICAgICB9CgogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE0fSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6bG9hZF9wb3dlcl9pbnRlbnRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJQdXRzIFwiPEZGPiBSVU5OSU5HIFBSRSBST1VURSBPUFRJTUlaQVRJT04gLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUFJFIFJPVVRFIE9QVElNSVpBVElPTlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgcHJlLUNUUyBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wcmVyb3V0ZV90Y2xdCgogICAgICBzZXQgY2xvY2tfZ2F0ZV9jZWxscyBbbGlzdF0KICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2dhdGVfY2VsbHMpXX0gewogICAgICAgICBzZXQgY2xvY2tfZ2F0ZV9jZWxscyAkdmFycyhjbG9ja19nYXRlX2NlbGxzKQogICAgICAgICBmb3JlYWNoIGNlbGwgJGNsb2NrX2dhdGVfY2VsbHMgewogICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldERvbnRVc2UgJGNlbGwgZmFsc2VcbiIKICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBjdHMsZW5hYmxlX2Nsb2NrX2dhdGVfY2VsbHMgJGNvbW1hbmRdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUnVuIHByZS1yb3V0ZSBvcHRpbWl6YXRpb24gZmxvdwogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCAiIgoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFVwZGF0ZSB0aW1pbmcgYmFzZWQgb24gdmFycyg8bW9kZT4saW5jcl9jdHNfc2RjKSBhbmQKICAgICAgIyB2YXJzKDxtb2RlPixwb3N0X2N0c19zZGMpCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OnVwZGF0ZV90aW1pbmcgbW1tY10KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGN0cyx1cGRhdGVfdGltaW5nICRjb21tYW5kXQogICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjpkZXJhdGVfdGltaW5nIG1tbWNdCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQoKICAgICAgaWYgeyR2YXJzKGlsbSkgJiYgW2luZm8gZXhpc3RzIHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRJbG1Ob25TZGNDb25zdHJhaW50RmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcihzdGVwKSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmQgInByZXJvdXRlX29wdF9kZXNpZ24gLXByZWZpeCAkdmFycyhzdGVwKSAtb3V0X2RpciAkdmFycyhycHRfZGlyKVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHByZXJvdXRlLG9wdF9kZXNpZ24gJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3ByZXJvdXRlX3RjbF0KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJlc2V0IGNsb2NrIGdhdGluZyBjZWxsIHVzYWdlCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGlmIHskdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIn0gewogICAgICAgICBzZXQgcHRuIFtmaWxlIHRhaWwgW3B3ZF1dCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmIChbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHB0bl0gIT0gLTEpICYmICEkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtbW9kZWxUeXBlIHRpbWluZyAtZGlyICRwdG4uaWxtIC1ob2xkXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtbW9kZWxUeXBlIHRpbWluZyAtY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwdG4gYWJzdHJhY3R9XG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNyZWF0ZV9pbG0gJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9wb3N0Y3RzIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKCiMgICAgICBpZiB7KCR2YXJzKHNraXBfY3RzKSkgfHwgW3JlZ2V4cCAiXmNjb3B0IiBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoY3RzX2VuZ2luZSldXX0gewojICAgICAgICAgaWYgeyR2YXJzKGN0c19lbmdpbmUpICE9ICJjY29wdF9jdHMifSB7CiMgICAgICAgICAgICByZXR1cm4gIiIKIyAgICAgICAgIH0KIyAgICAgIH0KCiAgICAgaWYgeyR2YXJzKHNraXBfY3RzKX0geyByZXR1cm4gIiIgfQoKICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTR9IHsKICAgICAgICBpZiB7W3JlZ2V4cCAiXmNjb3B0IiBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoY3RzX2VuZ2luZSldXSAmJiAoJHZhcnMoY2NvcHRfZWZmb3J0KSAhPSAibG93Iil9IHsKICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICBpZiB7W3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXSA9PSAiY2NvcHQifSB7IAogICAgICAgICAgIHJldHVybiAiIgogICAgICAgIH0KIyAgICAgICAgaWYgeyR2YXJzKGNjb3B0X2VmZm9ydCkgIT0gImxvdyJ9IHsKIyAgICAgICAgICAgcmV0dXJuICIiCiMgICAgICAgIH0KICAgICB9CgogICAgICBzZXQgdmFycyhzdGVwKSBwb3N0Y3RzCiAgICAgIHNldCBjb21tYW5kcyAiIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycyhzdGVwKSAkdmFycyhzdGVwKVxuIgogCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbml0aWFsaXplIHN0ZXAgLi4uCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfc3RlcCBwb3N0Y3RzXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHMsaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFNwZWNpZnkgdGhlIElMTSBtb2RlbHMgZm9yIHRoZSB0b3AgcGFydGl0aW9uIChvbmx5IGZvciAycGFzcyBmbG93KQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHskdmFycyh0b3ApICYmICgkdmFycyh1c2VyX21vZGUpID09ICJoaWVyIikgJiYgKCR2YXJzKGhpZXJfZmxvd190eXBlKSA9PSAiMnBhc3MiKSAmJiAhJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiMgICAgICAgICBpZiB7ISQodmFycyhibGFja19ib3gpfSB7IAogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LGlsbV9kaXIpXSAmJiAoJHZhcnMoY29kZWdlbikgfHwgW2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMoJHBhcnQsaWxtX2RpcildKX0gewogICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAkdmFycygkcGFydCxpbG1fZGlyKVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydFxuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkcGFydCAtZGlyICR2YXJzKCRwYXJ0LGlsbV9kaXIpXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAuLi8kcGFydC8kcGFydC5pbG1cbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnRcbiIKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNwZWNpZnlJbG0gLWNlbGwgJHBhcnQgLWRpciAuLi8kcGFydC8kcGFydC5pbG1cbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JGNvbW1hbmQgIT0gIiJ9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNwZWNpZnlfaWxtICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhmbG93KSA9PSAibW1tYyJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6dXBkYXRlX3RpbWluZyBtbW1jXQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0cyx1cGRhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjpkZXJhdGVfdGltaW5nIG1tbWNdCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjp1cGRhdGVfdGltaW5nIG1pbm1heF0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHMsdXBkYXRlX3RpbWluZyAkY29tbWFuZF0KICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6ZGVyYXRlX3RpbWluZyBtaW5tYXhdCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhpbG0pICYmIFtpbmZvIGV4aXN0cyB2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXX0gewogICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXX0gewogICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTB9IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRUaW1pbmdDb24gLWlsbU5vblNkY0ZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldElsbU5vblNkY0NvbnN0cmFpbnRGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGxvYWRfaWxtX25vbl9zZGNfZmlsZSAkY29tbWFuZF0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgICAgICAgICB9CgojICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KIyAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluaXRpYWxpemVfdGltaW5nICRjb21tYW5kXQojICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgIHNldCBkZWZlcl9jb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0gCiMgICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiUHV0cyBcIjxGRj4gUlVOTklORyBQT1NULUNUUyBPUFRJTUlaQVRJT04gLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUE9TVC1DVFMgT1BUSU1JWkFUSU9OXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgcG9zdENUUyBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcG9zdGN0c190Y2xdCgogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPD0gMTR9IHsKICAgICAgICAgaWYgeyR2YXJzKGN0c19lbmdpbmUpID09ICJjY29wdCIgJiYgJHZhcnMoY2NvcHRfaW50ZWdyYXRpb24pID09ICJuYXRpdmUifSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJQdXRzIFwiPEZGPiBOTyBQT1NULUNUUyBPUFRJTUlaQVRJT04gUkVRVUlSRUQgRk9SIENDT1BUIE5BVElWRSBJTlRFR1JBVElPTlwiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0Y3RzLG9wdF9kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgIyBSdW4gcG9zdC1DVFMgb3B0aW1pemF0aW9uCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgCiAgICAgICAgICAgIHNldCBjb21tYW5kICJvcHREZXNpZ24gLXBvc3RDVFMgLW91dERpciAkdmFycyhycHRfZGlyKSAtcHJlZml4IHBvc3RjdHNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3RjdHMsb3B0X2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICBpZiB7JHZhcnMoY3RzX2VuZ2luZSkgPT0gImNjb3B0X2N0cyJ9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIm9wdERlc2lnbiAtcG9zdENUUyAtb3V0RGlyICR2YXJzKHJwdF9kaXIpIC1wcmVmaXggcG9zdGN0c1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0cyxvcHRfZGVzaWduICRjb21tYW5kXQogICAgICAgICAgfQogICAgICAgfQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwb3N0IHBvc3RDVFMgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wb3N0Y3RzX3RjbCAwXQogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX3Bvc3RjdHNfaG9sZCB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7JHZhcnMoc2tpcF9jdHMpIHx8IChbbHNlYXJjaCAkdmFycyhmaXhfaG9sZCkgcG9zdGN0c10gPCAwKSB8fCAoJHZhcnMocG9zdGN0c19zZXR1cF9ob2xkKSAmJiAoJHZhcnMoY3RzX2VuZ2luZSkgIT0gImNjb3B0X2N0cyIpKX0gewogICAgICAgICByZXR1cm4gIiIKICAgICAgfQoKICAgICAgc2V0IHZhcnMoc3RlcCkgcG9zdGN0c19ob2xkCiAgICAgIHNldCBjb21tYW5kcyAiIiAKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbml0aWFsaXplIHN0ZXAgLi4uCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfc3RlcCBwb3N0Y3RzX2hvbGRdCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0c19ob2xkLGluaXRpYWxpemVfc3RlcCAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiUHV0cyBcIjxGRj4gUlVOTklORyBQT1NULUNUUyBIT0xEIEZJWElORyAuLi5cIlxuIgoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBQT1NULUNUUyBIT0xEIEZJWElOR1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgcHJlLXBvc3RDVFMgaG9sZCBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcG9zdGN0c19ob2xkX3RjbF0KCiAgICAgIHNldCBjb21tYW5kICJvcHREZXNpZ24gLXBvc3RDVFMgLWhvbGQgLW91dERpciAkdmFycyhycHRfZGlyKSAtcHJlZml4IHBvc3RjdHNfaG9sZFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdGN0c19ob2xkLG9wdF9kZXNpZ24gJGNvbW1hbmRdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBwb3N0LXBvc3RDVFMgaG9sZCBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3Bvc3RjdHNfaG9sZF90Y2wgMF0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fcm91dGUge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgc2V0IHZhcnMoc3RlcCkgcm91dGUKICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3N0ZXAgcm91dGVdCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQogICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjphZGRfZmlsbGVyX2NlbGxzXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsYWRkX2ZpbGxlcl9jZWxscyAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiUHV0cyBcIjxGRj4gUlVOTklORyBHTE9CQUwvREVUQUlMIFJPVVRJTkcgLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgR0xPQkFML0RFVEFJTCBST1VUSU5HXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgcm91dGUgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3JvdXRlX3RjbF0KCiAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OnJvdXRlX3NlY29uZGFyeV9wZ19uZXRzXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUscm91dGVfc2Vjb25kYXJ5X3BnX25ldHMgJGNvbW1hbmRdCgogICAgICBzZXQgY29tbWFuZCAiY2hlY2tQbGFjZSAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKSxjaGVja19wbGFjZS5ycHRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHJvdXRlLGNoZWNrX3BsYWNlICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJvdXRlIHRoZSBkZXNpZ24KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgc2V0IGFyZ3MgIiIKICAgICAgaWYgeygkdmFycyhlbmFibGVfb2N2KSA9PSAicHJlX3Bvc3Ryb3V0ZSIpIHx8ICgkdmFycyhlbmFibGVfb2N2KSA9PSAicHJlX3Bvc3RjdHMiKX0gewojICAgICAgICAgaWYgeyR2YXJzKGZsb3cpICE9ICJkZWZhdWx0In0gewogICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9vY3YpXG4iCiAgICAgICAgICAgIGFwcGVuZCBhcmdzICItYW5hbHlzaXNUeXBlIG9uQ2hpcFZhcmlhdGlvbiAiCiMgICAgICAgICB9CiAgICAgICAgIGlmIHskdmFycyhlbmFibGVfYW9jdil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgICAgYXBwZW5kIGFyZ3MgIi1hb2N2IHRydWUgIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhlbmFibGVfYW9jdilcbiIKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3NvY3YpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgICAgIGFwcGVuZCBhcmdzICItc29jdiB0cnVlICIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX3NvY3YpXG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX29jdikgXCJwcmVfcG9zdHJvdXRlXCJcbiIKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoZW5hYmxlX2FvY3YpIFwidHJ1ZVwiXG4iCiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGVuYWJsZV9zb2N2KSBcInRydWVcIlxuIgogICAgICB9CiAgICAgIGlmIHskYXJncyAhPSAiIn0gewogICAgICAgICBzZXQgY29tbWFuZCAic2V0QW5hbHlzaXNNb2RlICRhcmdzXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByb3V0ZSxzZXRfYW5hbHlzaXNfbW9kZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvc3Ryb3V0ZV9zcHJlYWRfd2lyZXMpXSAmJiAhJHZhcnMocG9zdHJvdXRlX3NwcmVhZF93aXJlcyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXROYW5vUm91dGVNb2RlIC1kcm91dGVQb3N0Um91dGVTcHJlYWRXaXJlIGZhbHNlXG4iCiAgICAgIH0KCiAgICAgIHNldCBjb21tYW5kICJyb3V0ZURlc2lnbiIKICAgICAgaWYgeyR2YXJzKHRyYWNrX29wdCl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyh0cmFja19vcHQpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXRyYWNrT3B0IgogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyh0cmFja19vcHQpXG4iCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByb3V0ZSxyb3V0ZV9kZXNpZ24gIiRjb21tYW5kXG4iXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJ1biBja0VDTyBpZiByZXF1ZXN0ZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNsb2NrX2VjbyldICYmICgoJHZhcnMoY2xvY2tfZWNvKSA9PSAicG9zdF9yb3V0ZSIpIHx8ICgkdmFycyhjbG9ja19lY28pID09ICJib3RoIikpfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OnJ1bl9jbG9ja19lY28gcG9zdF9yb3V0ZV0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHJvdXRlLHJ1bl9jbG9ja19lY28gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBPcHRpb25hbGx5IHJ1biB3aXJlIHNwcmVhZGluZwogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7W3JlZ3N1YiAibm0iICR2YXJzKHByb2Nlc3MpICIiXSA+IDE2fSB7CiAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvc3Ryb3V0ZV9zcHJlYWRfd2lyZXMpXSAmJiAkdmFycyhwb3N0cm91dGVfc3ByZWFkX3dpcmVzKX0gewogICAgICAgICAgc2V0IGNvbW1hbmQgInNldE5hbm9Sb3V0ZU1vZGUgLWRyb3V0ZVBvc3RSb3V0ZVNwcmVhZFdpcmUgdHJ1ZSAtcm91dGVXaXRoVGltaW5nRHJpdmVuIGZhbHNlXG4iCiAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicm91dGVEZXNpZ24gLXdpcmVPcHRcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXROYW5vUm91dGVNb2RlIC1kcm91dGVQb3N0Um91dGVTcHJlYWRXaXJlIGZhbHNlXG4iCiAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsc3ByZWFkX3dpcmVzICRjb21tYW5kXQogICAgICAgIH0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIE9wdGlvbmFsbHkgcnVuIExQQQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnModmVyaWZ5X2xpdGhvKX0gewogICAgICAgICBmaWxlIG1rZGlyICR2YXJzKHJwdF9kaXIpL0xQQS9ETUMKICAgICAgICAgc2V0IGNvbW1hbmQgInZlcmlmeUxpdGhvIC1yb3V0aW5nTGF5ZXJzT25seSAtdGVjaEZpbGUgJHZhcnMobHBhX3RlY2hfZmlsZSkgLWRpciAkdmFycyhycHRfZGlyKS9MUEFcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInZpb2xhdGlvbkJyb3dzZXIgLWFsbCAtbm9fZGlzcGxheV9mYWxzZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAibG9hZFZpb2xhdGlvblJlcG9ydCAtdHlwZSBDRE5MaXRobyAtZmlsZW5hbWUgJHZhcnMocnB0X2RpcikvTFBBL0RNQy9tZXJnZWQuaGlmXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByb3V0ZSx2ZXJpZnlfbGl0aG8gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBTZXQgZXh0cmFjdGlvbiBtb2RlIHRvIHBvc3Ryb3V0ZQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIHNldCBjb21tYW5kICJzZXRFeHRyYWN0UkNNb2RlIC1lbmdpbmUgcG9zdFJvdXRlIgogICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpfV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwb3N0cm91dGVfZXh0cmFjdGlvbl9lZmZvcnQpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWVmZm9ydExldmVsICRhcmciCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHBvc3Ryb3V0ZV9leHRyYWN0aW9uX2VmZm9ydClcbiIKICAgICAgfQogICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyh0b3RhbF9jX3RocmVzaCl9XX0gewogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC10b3RhbF9jX3RoICRhcmciCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKHRvdGFsX2NfdGhyZXNoKVxuIgogICAgICB9CiAgICAgIGlmIHshW2NhdGNoIHtzZXQgYXJnICR2YXJzKHJlbGF0aXZlX2NfdGhyZXNoKX1dfSB7CiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXJlbGF0aXZlX2NfdGggJGFyZyIKICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocmVsYXRpdmVfY190aHJlc2gpXG4iCiAgICAgIH0KICAgICAgaWYgeyFbY2F0Y2gge3NldCBhcmcgJHZhcnMoY291cGxpbmdfY190aHJlc2gpfV19IHsKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjb3VwbGluZ19jX3RocmVzaClcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtY291cGxpbmdfY190aCAkYXJnIgogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhyZWxhdGl2ZV9jX3RocmVzaClcbiIKICAgICAgfQogICAgICBpZiB7IVtjYXRjaCB7c2V0IGFyZyAkdmFycyhxcmNfbGF5ZXJfbWFwKX1dfSB7CiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGVmVGVjaEZpbGVNYXAgJGFyZyIKICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMocXJjX2xheWVyX21hcClcbiIKICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCByb3V0ZSxzZXRfZXh0cmFjdF9yY19tb2RlICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgcG9zdCByb3V0ZSBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3JvdXRlX3RjbCAwXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFVwZGF0ZSB0byBNTU1DIGlmIGZsb3cgaXMgInByX21tbWMiCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGlmIHskdmFycyhmbG93KSAhPSAiZGVmYXVsdCJ9IHsKICAgICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJwcl9tbW1jIn0gewogICAgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV19IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVEZXNpZ24gLXBvc3Ryb3V0ZSAtcHJlZml4IHJvdXRlIC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZURlc2lnbiAtcG9zdHJvdXRlIC1wcmVmaXggcm91dGUgLW91dERpciAkdmFycyhycHRfZGlyKSAlc1xuIiAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV0KICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUsdGltZV9kZXNpZ24gJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX3Bvc3Ryb3V0ZSB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBzZXQgdmFycyhzdGVwKSBwb3N0cm91dGUKICAgICAgc2V0IGNvbW1hbmRzICAiIgojICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycyhzdGVwKSAkdmFycyhzdGVwKVxuIgoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEluaXRpYWxpemUgc3RlcCAuLi4KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeyR2YXJzKHBvc3Ryb3V0ZV9zZXR1cF9ob2xkKX0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3N0ZXAgcG9zdHJvdXRlX2hvbGRdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjppbnNlcnRfY29tbWVudHNdIAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX2hvbGQsaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQogICAgICB9CgogICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3N0ZXAgcG9zdHJvdXRlXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6aW5zZXJ0X2NvbW1lbnRzXSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSxpbml0aWFsaXplX3N0ZXAgJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnMobWV0YWxmaWxsKSA9PSAicHJlX3Bvc3Ryb3V0ZSJ9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGOjpzb3VyY2VfcGx1ZyBtZXRhbGZpbGxfdGNsXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlLGFkZF9tZXRhbGZpbGwgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gY2tFQ08gaWYgcmVxdWVzdGVkCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbG9ja19lY28pXSAmJiAoKCR2YXJzKGNsb2NrX2VjbykgPT0gInBvc3Rfcm91dGUiKSB8fCAoJHZhcnMoY2xvY2tfZWNvKSA9PSAiYm90aCIpKX0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjpydW5fY2xvY2tfZWNvIHBvc3Rfcm91dGVdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiUHV0cyBcIjxGRj4gUlVOTklORyBQT1NULVJPVVRFIENMT0NLIEVDTyAuLi5cIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcm91dGUscnVuX2Nsb2NrX2VjbyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJQdXRzIFwiPEZGPiBSVU5OSU5HIFBPU1QtUk9VVEUgT1BUSU1JWkFUSU9OIC4uLlwiXG4iCgogICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIFBPU1QtUk9VVEUgT1BUSU1JWkFUSU9OXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgcG9zdHJvdXRlIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wb3N0cm91dGVfdGNsXQogICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KSAmJiBbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIm9wdExlYWthZ2VQb3dlciAtZml4VGltaW5nT25seVxuIgogICAgICB9CiAgICAgIGlmIHskdmFycyhwb3N0cm91dGVfc2V0dXBfaG9sZCl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3Bvc3Ryb3V0ZV9ob2xkX3RjbF0KICAgICAgICAgc2V0IGNvbW1hbmQgIm9wdERlc2lnbiAtcG9zdFJvdXRlIC1vdXREaXIgJHZhcnMocnB0X2RpcikgLXByZWZpeCBwb3N0cm91dGUgLXNldHVwIC1ob2xkXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJvcHREZXNpZ24gLXBvc3RSb3V0ZSAtb3V0RGlyICR2YXJzKHJwdF9kaXIpIC1wcmVmaXggcG9zdHJvdXRlXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSxvcHRfZGVzaWduICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFRyaW0gbWV0YWwgZmlsbCBpZiBhZGRlZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnMobWV0YWxmaWxsKSA9PSAicHJlX3Bvc3Ryb3V0ZSJ9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInRyaW1NZXRhbEZpbGxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSx0cmltX21ldGFsZmlsbCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIE9wdGlvbmFsbHkgcnVuIExQQQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnModmVyaWZ5X2xpdGhvKX0gewogICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgdG8gaGFuZGxlIGRlcmVyZW5jaW5nIHZhcmlhYmxlcwogICAgICAgICBmaWxlIG1rZGlyIFtzdWJzdCAkdmFycyhycHRfZGlyKV0vTFBBL0RNQwogICAgICAgICBzZXQgY29tbWFuZCAidmVyaWZ5TGl0aG8gLXJvdXRpbmdMYXllcnNPbmx5IC10ZWNoRmlsZSAkdmFycyhscGFfdGVjaF9maWxlKSAtZGlyICR2YXJzKHJwdF9kaXIpL0xQQVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAidmlvbGF0aW9uQnJvd3NlciAtYWxsIC1ub19kaXNwbGF5X2ZhbHNlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJsb2FkVmlvbGF0aW9uUmVwb3J0IC10eXBlIENETkxpdGhvIC1maWxlbmFtZSAkdmFycyhycHRfZGlyKS9MUEEvRE1DL21lcmdlZC5oaWZcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZSx2ZXJpZnlfbGl0aG8gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHBvc3QgcG9zdFJvdXRlIGZpbGUgKHBsdWctaW4pCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcG9zdHJvdXRlX3RjbCAwXQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9wb3N0cm91dGVfaG9sZCB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7KFtsc2VhcmNoICR2YXJzKGZpeF9ob2xkKSBwb3N0cm91dGVdIDwgMCkgfHwgJHZhcnMocG9zdHJvdXRlX3NldHVwX2hvbGQpfSB7CiAgICAgICAgIHJldHVybiAiIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgdmFycyhzdGVwKSBwb3N0cm91dGVfaG9sZAogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfc3RlcCBwb3N0cm91dGVfaG9sZF0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6Omluc2VydF9jb21tZW50c10gCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCxpbml0aWFsaXplX3N0ZXAgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgIlB1dHMgXCI8RkY+IFJVTk5JTkcgUE9TVC1ST1VURSBIT0xEIEZJWElORyAuLi5cIlxuIgoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBQT1NULVJPVVRFIEhPTEQgRklYSU5HXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgcG9zdFJvdXRlIGhvbGQgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3Bvc3Ryb3V0ZV9ob2xkX3RjbF0KICAgICAgc2V0IGNvbW1hbmQgIm9wdERlc2lnbiAtcG9zdFJvdXRlIC1ob2xkIgogICAgICBhcHBlbmQgY29tbWFuZCAiIC1vdXREaXIgJHZhcnMocnB0X2RpcikgLXByZWZpeCBwb3N0cm91dGVfaG9sZFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX2hvbGQsb3B0X2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBUcmltIG1ldGFsIGZpbGwgaWYgYWRkZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeyR2YXJzKG1ldGFsZmlsbCkgPT0gInByZV9wb3N0cm91dGUifSB7CiAgICAgICAgIHNldCBjb21tYW5kICJ0cmltTWV0YWxGaWxsXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCx0cmltX21ldGFsZmlsbCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIE9wdGlvbmFsbHkgcnVuIExQQQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnModmVyaWZ5X2xpdGhvKX0gewogICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgdG8gaGFuZGxlIGRlcmVyZW5jaW5nIHZhcmlhYmxlcwogICAgICAgICBmaWxlIG1rZGlyICBbc3Vic3QgJHZhcnMocnB0X2RpcildL0xQQS9ETUMKICAgICAgICAgc2V0IGNvbW1hbmQgInZlcmlmeUxpdGhvIC1yb3V0aW5nTGF5ZXJzT25seSAtdGVjaEZpbGUgJHZhcnMobHBhX3RlY2hfZmlsZSkgLWRpciAkdmFycyhycHRfZGlyKS9MUEFcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInZpb2xhdGlvbkJyb3dzZXIgLWFsbCAtbm9fZGlzcGxheV9mYWxzZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAibG9hZFZpb2xhdGlvblJlcG9ydCAtdHlwZSBDRE5MaXRobyAtZmlsZW5hbWUgJHZhcnMocnB0X2RpcikvTFBBL0RNQy9tZXJnZWQuaGlmXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfaG9sZCx2ZXJpZnlfbGl0aG8gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHBvc3QgcG9zdFJvdXRlIGhvbGQgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wb3N0cm91dGVfaG9sZF90Y2wgMF0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fcG9zdHJvdXRlX3NpX2hvbGQge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgaWYgeyhbbHNlYXJjaCAkdmFycyhmaXhfaG9sZCkgcG9zdHJvdXRlXSA8IDApIHx8ICR2YXJzKHBvc3Ryb3V0ZV9zZXR1cF9ob2xkKX0gewogICAgICAgICByZXR1cm4gIiIKICAgICAgfQoKICAgICAgc2V0IHZhcnMoc3RlcCkgcG9zdHJvdXRlX3NpX2hvbGQKICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgSW5pdGlhbGl6ZSBzdGVwIC4uLgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3N0ZXAgcG9zdHJvdXRlX3NpX2hvbGRdCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX3NpX2hvbGQsaW5pdGlhbGl6ZV9zdGVwICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJQdXRzIFwiPEZGPiBSVU5OSU5HIFBPU1QtUk9VVEUgU0ktQVdBUkUgSE9MRCBGSVhJTkcgLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUE9TVC1ST1VURSBTSSBBV0FSRSBIT0xEIEZJWElOR1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEZvcmNlIGNlbHRpYyBiYXNlZCBTSSBkZWxheSBjYWxjdWxhdGlvbgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBzZXQgY29tbWFuZCAic2V0RGVsYXlDYWxNb2RlIC1lbmdpbmUgc2lnbmFsU3Rvcm0gLXNpQXdhcmUgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaV9ob2xkLHNldF9kZWxheV9jYWxfbW9kZSAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIHByZS1wb3N0Um91dGUgU0kgaG9sZCBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcG9zdHJvdXRlX3NpX2hvbGRfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgbWV0YWxmaWxsIHBsdWctaW4KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeyR2YXJzKG1ldGFsZmlsbCkgPT0gInByZV9wb3N0cm91dGVfc2kifSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRjo6c291cmNlX3BsdWcgbWV0YWxmaWxsX3RjbF0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaV9ob2xkLGFkZF9tZXRhbGZpbGwgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gcG9zdHJvdXRlIFNJIGhvbGQgZml4aW5nCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kICJvcHREZXNpZ24gLXBvc3RSb3V0ZSAtc2kgLWhvbGQiCiAgICAgIGFwcGVuZCBjb21tYW5kICIgLW91dERpciAkdmFycyhycHRfZGlyKSAtcHJlZml4IHBvc3Ryb3V0ZV9zaV9ob2xkXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2lfaG9sZCxvcHRfZGVzaWduICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFRyaW0gbWV0YWwgZmlsbCBpZiBhZGRlZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7KCR2YXJzKG1ldGFsZmlsbCkgPT0gInByZV9wb3N0cm91dGUiKSB8fAogICAgICAgICAgKCR2YXJzKG1ldGFsZmlsbCkgPT0gInByZV9wb3N0cm91dGVfc2kiKX0gewogICAgICAgICBzZXQgY29tbWFuZCAidHJpbU1ldGFsRmlsbFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX3NpX2hvbGQsdHJpbV9tZXRhbGZpbGwgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBPcHRpb25hbGx5IHJ1biBMUEEKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeyR2YXJzKHZlcmlmeV9saXRobyl9IHsKICAgICAgICAgIyBCQ0w6IEFkZGVkIHN1YnN0IHRvIGhhbmRsZSBkZXJlcmVuY2luZyB2YXJpYWJsZXMKICAgICAgICAgZmlsZSBta2RpciAgW3N1YnN0ICR2YXJzKHJwdF9kaXIpXS9MUEEvRE1DCiAgICAgICAgIHNldCBjb21tYW5kICJ2ZXJpZnlMaXRobyAtcm91dGluZ0xheWVyc09ubHkgLXRlY2hGaWxlICR2YXJzKGxwYV90ZWNoX2ZpbGUpIC1kaXIgJHZhcnMocnB0X2RpcikvTFBBXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ2aW9sYXRpb25Ccm93c2VyIC1hbGwgLW5vX2Rpc3BsYXlfZmFsc2VcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImxvYWRWaW9sYXRpb25SZXBvcnQgLXR5cGUgQ0ROTGl0aG8gLWZpbGVuYW1lICR2YXJzKHJwdF9kaXIpL0xQQS9ETUMvbWVyZ2VkLmhpZlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdF9wb3N0cm91dGVfc2lfaG9sZCx2ZXJpZnlfbGl0aG8gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHBvc3QgcG9zdFJvdXRlIFNJIGhvbGQgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wb3N0cm91dGVfc2lfaG9sZF90Y2wgMF0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fcG9zdHJvdXRlX3NpIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIHNldCB2YXJzKHN0ZXApIHBvc3Ryb3V0ZV9zaQogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBJbml0aWFsaXplIHN0ZXAgLi4uCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfc3RlcCBwb3N0cm91dGVfc2ldCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjppbnNlcnRfY29tbWVudHNdIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdHJvdXRlX3NpLGluaXRpYWxpemVfc3RlcCAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBGb3JjZSBjZWx0aWMgYmFzZWQgU0kgZGVsYXkgY2FsY3VsYXRpb24KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgInNldERlbGF5Q2FsTW9kZSAtZW5naW5lIHNpZ25hbFN0b3JtIC1zaUF3YXJlIGZhbHNlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2ksc2V0X2RlbGF5X2NhbF9tb2RlICRjb21tYW5kXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgb3B0aW9uYWwgbWV0YWxmaWxsIHBsdWctaW4KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeyR2YXJzKG1ldGFsZmlsbCkgPT0gInByZV9wb3N0cm91dGVfc2kifSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRjo6c291cmNlX3BsdWcgbWV0YWxmaWxsX3RjbF0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaSxhZGRfbWV0YWxmaWxsICRjb21tYW5kXQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgIlB1dHMgXCI8RkY+IFJVTk5JTkcgUE9TVC1ST1VURSBTSS1BV0FSRSBPUFRJTUlaQVRJT04gLi4uXCJcbiIKCiAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUE9TVC1ST1VURSBTSSBBV0FSRSBPUFRJTUlaQVRJT05cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHByZSBwb3N0Um91dGUgU0kgZmlsZSAocGx1Zy1pbikKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3Bvc3Ryb3V0ZV9zaV90Y2xdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgUnVuIHBvc3Qgcm91dGUgc2V0dXAgZml4aW5nIHcvU0kKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgIm9wdERlc2lnbiAtcG9zdFJvdXRlIC1zaSIKICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtb3V0RGlyICR2YXJzKHJwdF9kaXIpIC1wcmVmaXggcG9zdHJvdXRlX3NpXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBwb3N0cm91dGVfc2ksb3B0X2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBUcmltIG1ldGFsIGZpbGwgaWYgYWRkZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgaWYgeygkdmFycyhtZXRhbGZpbGwpID09ICJwcmVfcG9zdHJvdXRlIikgfHwKICAgICAgICAgICgkdmFycyhtZXRhbGZpbGwpID09ICJwcmVfcG9zdHJvdXRlX3NpIil9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInRyaW1NZXRhbEZpbGxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHBvc3Ryb3V0ZV9zaV9ob2xkLHRyaW1fbWV0YWxmaWxsICRjb21tYW5kXQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgT3B0aW9uYWxseSBydW4gTFBBCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGlmIHskdmFycyh2ZXJpZnlfbGl0aG8pfSB7CiAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCB0byBoYW5kbGUgZGVyZXJlbmNpbmcgdmFyaWFibGVzCiAgICAgICAgIGZpbGUgbWtkaXIgW3N1YnN0ICR2YXJzKHJwdF9kaXIpXS9MUEEvRE1DCiAgICAgICAgIHNldCBjb21tYW5kICJ2ZXJpZnlMaXRobyAtcm91dGluZ0xheWVyc09ubHkgLXRlY2hGaWxlICR2YXJzKGxwYV90ZWNoX2ZpbGUpIC1kaXIgJHZhcnMocnB0X2RpcikvTFBBXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ2aW9sYXRpb25Ccm93c2VyIC1hbGwgLW5vX2Rpc3BsYXlfZmFsc2VcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImxvYWRWaW9sYXRpb25SZXBvcnQgLXR5cGUgQ0ROTGl0aG8gLWZpbGVuYW1lICR2YXJzKHJwdF9kaXIpL0xQQS9ETUMvbWVyZ2VkLmhpZlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcG9zdF9wb3N0cm91dGVfc2ksdmVyaWZ5X2xpdGhvICRjb21tYW5kXQogICAgICB9CgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwb3N0IHBvc3RSb3V0ZSBTSSBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3Bvc3Ryb3V0ZV9zaV90Y2wgMF0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fc2lnbm9mZiB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIGlmIHskdmFycyhzdGVwKSAhPSAiYXNzZW1ibGUifSB7CiAgICAgICAgIHNldCB2YXJzKHN0ZXApIHNpZ25vZmYKICAgICAgfQogICAgICBzZXQgY29tbWFuZHMgIiIKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBPcHRpb25hbGx5IHZlcmlmeS9maXggbGl0aG8KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7JHZhcnMoZml4X2xpdGhvKX0gewogICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgdG8gaGFuZGxlIGRlcmVyZW5jaW5nIHZhcmlhYmxlcwogICAgICAgICBmaWxlIG1rZGlyICBbc3Vic3QgJHZhcnMocnB0X2RpcildL0xQQS9ETUMKICAgICAgICAgc2V0IGNvbW1hbmQgImxvYWRWaW9sYXRpb25SZXBvcnQgLXR5cGUgQ0ROTGl0aG8gLWZpbGVuYW1lICR2YXJzKHJwdF9kaXIpL0xQQS9ETUMvbWVyZ2VkLmhpZlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0TmFub1JvdXRlTW9kZSAtZHJvdXRlUG9zdFJvdXRlTGl0aG9SZXBhaXIgdHJ1ZSBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgICAgICAgICAgICAgICAtZHJvdXRlTWluaW1pemVUb3BvbG9neUNoYW5nZSB0cnVlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJnbG9iYWxEZXRhaWxSb3V0ZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAid3JpdGVIaWYgLWZpbGUgJHZhcnMocnB0X2RpcikvTFBBL2luY3JfdmVyaWZ5LmhpZlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAidmVyaWZ5TGl0aG8gLXNpZ25PZmYgXFxcbiIgCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgICAgICAgICAtZGlyICR2YXJzKGRic19kaXIpL0xQQTIgXFxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgICAgICAgIC1jcHUgJHZhcnMobG9jYWxfY3B1cykgXFxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgICAgICAgIC1jb25maWcgJHZhcnMobHBhX2NvbmZfZmlsZSkgXFxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAgICAgICAgIC1pbmNyQ2hlY2sgJHZhcnMocnB0X2RpcikvTFBBL2luY3JfdmVyaWZ5LmhpZlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAidmlvbGF0aW9uQnJvd3NlciAtYWxsIC1ub19kaXNwbGF5X2ZhbHNlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJsb2FkVmlvbGF0aW9uUmVwb3J0IC10eXBlIENETkxpdGhvIC1maWxlbmFtZSAkdmFycyhycHRfZGlyKS9MUEEyL0RNQy9tZXJnZWQuaGlmXG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixmaXhfbGl0aG8gJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIG1ldGFsZmlsbCBwbHVnLWluCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeyR2YXJzKG1ldGFsZmlsbCkgPT0gInByZV9zaWdub2ZmIn0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkY6OnNvdXJjZV9wbHVnIG1ldGFsZmlsbF90Y2xdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLGFkZF9tZXRhbGZpbGwgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfc3RlcCBzaWdub2ZmXQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6aW5zZXJ0X2NvbW1lbnRzXSAKIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLGluaXRpYWxpemVfc3RlcCAkY29tbWFuZF0KICAgICAgYXBwZW5kIGNvbW1hbmRzICRjb21tYW5kCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCBvcHRpb25hbCBwcmUgc2lnbm9mZiBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9zaWdub2ZmX3RjbF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gUkMgRXh0cmFjdGlvbgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBhcHBlbmQgY29tbWFuZHMgIlB1dHMgXCI8RkY+IFJVTk5JTkcgRklOQUwgU0lHTk9GRiAuLi5cIlxuIgoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBGSU5BTCBTSUdOT0ZGXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CgogICAgICBzZXQgY29tbWFuZCAiZXh0cmFjdFJDXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLGV4dHJhY3RfcmMgJGNvbW1hbmRdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgRHVtcCBTUEVGIGZvciBzaWdub2ZmIFNUQQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICBpZiB7JHZhcnMoc2tpcF9zaWdub2ZmX2NoZWNrcyl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgZm9yZWFjaCBjb3JuZXIgJHZhcnMocmNfY29ybmVycykgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAicmNPdXQgLXJjX2Nvcm5lciAkY29ybmVyIC1zcGVmICRjb3JuZXIuc3BlZi5nelxuIgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJmb3JlYWNoIGNvcm5lciBcJHZhcnMoYWN0aXZlX3JjX2Nvcm5lcnMpIHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHJjT3V0IC1yY19jb3JuZXIgXCRjb3JuZXIgLXNwZWYgXCRjb3JuZXIuc3BlZi5nelxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgogICAgICB9IAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixkdW1wX3NwZWYgJGNvbW1hbmRdCgogICAgICBpZiB7KCgkdmFycyhzdGVwKSA9PSAiYXNzZW1ibGUiKSB8fCAoJHZhcnMoc3RlcCkgPT0gInNpZ25vZmYiKSl9IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9zaWdub2ZmX2VjbyldICYmICR2YXJzKGVuYWJsZV9zaWdub2ZmX2Vjbyl9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNpZ25vZmZUaW1lRGVzaWduIC1yZXBvcnRPbmx5IC1ub0Vjb0RiIC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsc2lnbm9mZl90aW1lX2Rlc2lnbiAkY29tbWFuZF0gICAgICAgICAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zaV9hd2FyZSl9IHsKICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV19IHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVEZXNpZ24gLXByZWZpeCBzaWdub2ZmIC1zaWdub2ZmIC1yZXBvcnRPbmx5IC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZURlc2lnbiAtcHJlZml4IHNpZ25vZmYgLXNpZ25vZmYgLXJlcG9ydE9ubHkgLW91dERpciAkdmFycyhycHRfZGlyKSAlc1xuIiAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKV0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsc2V0dXApXX0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAidGltZURlc2lnbiAtcHJlZml4IHNpZ25vZmYgLXNpZ25vZmYgLXNpIC1yZXBvcnRPbmx5IC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2Zvcm1hdCAidGltZURlc2lnbiAtcHJlZml4IHNpZ25vZmYgLXNpZ25vZmYgLXNpIC1yZXBvcnRPbmx5IC1vdXREaXIgJHZhcnMocnB0X2RpcikgJXNcbiIgJHZhcnModGltZV9kZXNpZ25fb3B0aW9ucyxzZXR1cCldCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZix0aW1lX2Rlc2lnbl9zZXR1cCAkY29tbWFuZF0KICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9zaV9hd2FyZSl9IHsKICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLGhvbGQpXX0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAidGltZURlc2lnbiAtcHJlZml4IHNpZ25vZmYgLXNpZ25vZmYgLXJlcG9ydE9ubHkgLWhvbGQgLW91dERpciAkdmFycyhycHRfZGlyKVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCBbZm9ybWF0ICJ0aW1lRGVzaWduIC1wcmVmaXggc2lnbm9mZiAtc2lnbm9mZiAtcmVwb3J0T25seSAtaG9sZCAtb3V0RGlyICR2YXJzKHJwdF9kaXIpICVzXG4iICR2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsaG9sZCldCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLGhvbGQpXX0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZCAidGltZURlc2lnbiAtcHJlZml4IHNpZ25vZmYgLXNpZ25vZmYgLXNpIC1yZXBvcnRPbmx5IC1ob2xkICAtb3V0RGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kIFtmb3JtYXQgInRpbWVEZXNpZ24gLXByZWZpeCBzaWdub2ZmIC1zaWdub2ZmIC1zaSAtcmVwb3J0T25seSAtaG9sZCAtb3V0RGlyICR2YXJzKHJwdF9kaXIpICVzXG4iICR2YXJzKHRpbWVfZGVzaWduX29wdGlvbnMsaG9sZCldCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZix0aW1lX2Rlc2lnbl9ob2xkICRjb21tYW5kXQogICAgICAgICB9CiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBEdW1wIEdEUyBhbmQvb3IgT0EgZGF0YSBiYXNlCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGdkc19sYXllcl9tYXApXX0gewogICAgICAgICBzZXQgY29tbWFuZCAic3RyZWFtT3V0ICR2YXJzKGRlc2lnbikuZ2RzLmd6IC1tYXBGaWxlICR2YXJzKGdkc19sYXllcl9tYXApICIKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGdkc19maWxlcyldfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICItbWVyZ2UgeyAiCiAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhnZHNfZmlsZXMpIHsKICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiRmaWxlICIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcHV0cyAgIjxGRj4gV0FSTklORzogR0RTIEZJTEUgJGZpbGUgRE9FUyBOT1QgRVhJU1QgLi4uLiBTS0lQUElOR1xuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn0iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixzdHJlYW1fb3V0ICRjb21tYW5kXQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhvYXNpc19sYXllcl9tYXApXX0gewogICAgICAgICBzZXQgY29tbWFuZCAib2FzaXNPdXQgJHZhcnMoZGVzaWduKS5vYXNpcy5neiAtbWFwRmlsZSAkdmFycyhvYXNpc19sYXllcl9tYXApICIKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG9hc2lzX2ZpbGVzKV19IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIi1tZXJnZSB7ICIKICAgICAgICAgICAgZm9yZWFjaCBmaWxlICR2YXJzKG9hc2lzX2ZpbGVzKSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJGZpbGVdfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIkZmlsZSAiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IFdBUk5JTkc6IE9BU0lTIEZJTEUgJGZpbGUgRE9FUyBOT1QgRVhJU1QgLi4uLiBTS0lQUElOR1xuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn0iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixvYXNpc19vdXQgJGNvbW1hbmRdCiAgICAgIH0KCiMgICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKG9hX3JlZl9saWIpXSAmJiAoJHZhcnMob2FfcmVmX2xpYikgIT0gIiIpKSAmJgojICAgICAgICAgIChbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fbGliKV0gJiYgKCR2YXJzKG9hX2Rlc2lnbl9saWIpICE9ICIiKSl9IHsKIyAgICAgICAgIHNldCBjb21tYW5kICJzYXZlT2FEZXNpZ24gJHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSBzaWdub2ZmXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixzYXZlX29hX2Rlc2lnbiAkY29tbWFuZF0KIyAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBEdW1wIE1vZGVsIGZvciBUb3AgTGV2ZWwgKEhpZXJhcmNoaWNhbCBGbG93IE9ubHkpCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgc2V0IHB0biBbZmlsZSB0YWlsIFtwd2RdXQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICBpZiB7KFtsc2VhcmNoICR2YXJzKHBhcnRpdGlvbl9saXN0KSAkcHRuXSAhPSAtMSl9IHsKICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtZGlyICRwdG4uaWxtXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtY2VsbHZpZXcgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwdG4gYWJzdHJhY3R9XG4iCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVJbnRlcmZhY2VMb2dpYyAtZGlyICRwdG4uaWxtXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsY3JlYXRlX2lsbSAkY29tbWFuZF0KICAgICAgICAgfSBlbHNlaWYgeyR2YXJzKHN0ZXApICE9ICJhc3NlbWJsZSJ9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsdW5mbGF0dGVuSWxtICJ1bmZsYXR0ZW5JbG1cbiJdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUlVOTklORyBWRVJJRlkgQ09NTUFORFNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gdmVyaWZ5IGNvbW1hbmRzCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYgeyEoW2luZm8gZXhpc3RzIHZhcnMoZW5hYmxlX3NpZ25vZmZfZWNvKV0gJiYgJHZhcnMoZW5hYmxlX3NpZ25vZmZfZWNvKSl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInN1bW1hcnlSZXBvcnQgLW91dERpciAkdmFycyhycHRfZGlyKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgc2lnbm9mZixzdW1tYXJ5X3JlcG9ydCAkY29tbWFuZF0KICAgICAgfQogICAgICBzZXQgY29tbWFuZCAidmVyaWZ5Q29ubmVjdGl2aXR5IC1ub0FudGVubmFcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsdmVyaWZ5X2Nvbm5lY3Rpdml0eSAkY29tbWFuZF0KICAgICAgc2V0IGNvbW1hbmQgIlt2ZXJpZnlfZ2VvbWV0cnlfY29tbWFuZF1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIHNpZ25vZmYsdmVyaWZ5X2dlb21ldHJ5ICRjb21tYW5kXQogICAgICBzZXQgY29tbWFuZCAidmVyaWZ5TWV0YWxEZW5zaXR5XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHZlcmlmeV9tZXRhbF9kZW5zaXR5ICRjb21tYW5kXQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXSAmJiAoW2xzZWFyY2ggJHZhcnMocGFydGl0aW9uX2xpc3QpICRwdG5dICE9IC0xKX0gewogICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlICR2YXJzKGRic19mb3JtYXQpICJmZSJdPT0wfSB7CiAgICAgICAgICAgc2V0IGNvbW1hbmQgInZlcmlmeVByb2Nlc3NBbnRlbm5hIC1sZWZmaWxlICRwdG4uYW50ZW5uYS5sZWZcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBzZXQgY29tbWFuZCAidmVyaWZ5UHJvY2Vzc0FudGVubmFcbiIKICAgICAgICAgIyBOb3Qgc3VyZSB5ZXQgIGhvdyBzYXZlX2Fic3RyYWN0ICB3b3VsZCBiZSBjYWxsZWQtIHNraXAgdGhpcyBmb3Igbm93LgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJ2ZXJpZnlQcm9jZXNzQW50ZW5uYVxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBzaWdub2ZmLHZlcmlmeV9wcm9jZXNzX2FudGVubmEgJGNvbW1hbmRdCgogICAgICBpZiB7KFtpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9sdnMpXSAmJiAkdmFycyhlbmFibGVfbHZzKSkgJiYgKCR2YXJzKGRic19mb3JtYXQpID09ICJvYSIpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpjcmVhdGVfbHZzX2RhdGFdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkIG9wdGlvbmFsIHBvc3Qgc2lnbm9mZiBmaWxlIChwbHVnLWluKQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3Rfc2lnbm9mZl90Y2wgMF0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KCiAgIH0KCiAgIHByb2MgcnVuX2Fzc2VtYmxlIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIHNldCB2YXJzKHN0ZXApIGFzc2VtYmxlCiAgICAgIHNldCBjb21tYW5kcyAiIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICBGRl9FREk6OmluaXRpYWxpemVfc3RlcCBhc3NlbWJsZQoKIyAgICAgIGlmIHskdmFycyhyZXBvcnRfcnVuX3RpbWUpfSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCR2YXJzKHN0ZXApLHN0YXJ0X3RpbWUpIFxbY2xvY2sgc2Vjb25kc1xdXG4iCiMgICAgICB9CgogICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBBU1NFTUJMSU5HIERFU0lHTlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCAicHJlIGFzc2VtYmxlIiBwbHVnLWluIHNjcmlwdAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9hc3NlbWJsZV90Y2xdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQXNzZW1ibGUgdGhlIGRlc2lnbgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIHNldCB2YXJzKGlsbSkgZmFsc2UKICAgICAgc2V0IGlsbV9saXN0IFtsaXN0XQogICAgICBzZXQgcGFjX2xpc3QgW2xpc3RdCiAgICAgIGlmIHskdmFycyhlbmFibGVfcGFjKX0gewogICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LHBhY19tb2RlKV19ICB7CiAgICAgICAgICAgICAgIGlmIHskdmFycygkcGFydCxwYWNfbW9kZSkgPT0gImlsbSJ9IHsKICAgICAgICAgICAgICAgICAgbGFwcGVuZCBpbG1fbGlzdCAkcGFydAogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBsYXBwZW5kIHBhY19saXN0ICRwYXJ0CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGlsbV9saXN0KV0gJiYgKCR2YXJzKGlsbV9saXN0KSAhPSAiIil9IHsKICAgICAgICAgZm9yZWFjaCBpbG0gJHZhcnMoaWxtX2xpc3QpIHsKICAgICAgICAgICAgaWYgeyhbbHNlYXJjaCAkaWxtX2xpc3QgJGlsbV0gPT0gLTEpICYmIChbbHNlYXJjaCAkcGFjX2xpc3QgJGlsbV0gPT0gLTEpfSB7CiAgICAgICAgICAgICAgIGxhcHBlbmQgaWxtX2xpc3QgJGlsbQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JGlsbV9saXN0ICE9ICIifSB7CiAgICAgICAgIHNldCB2YXJzKGlsbSkgdHJ1ZSAKICAgICAgfQoKICAgICAgIyBCQ0w6IEFkZGVkIHRhaWwgb2Ygc3Vic3Qgb2YgdmFycyhkYnNfZGlyKQogICAgICAjIE5vdGUgLSBFRElGRiBIaWVyYXJjaGljYWwgZmxvdyBpcyBjdXJyZW50bHkgSU5DT01QQVRJQkxFIHdpdGggRkYgZGlyIHN0cnVjdHVyZQogICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBhcHBlYXJzIHRvIHJlbHkgb24gdmFycyhkYnNfZGlyKSBhbHdheXMgYmVpbmcgdW5kZXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKQogICAgICAjIFRoaXMgbmVlZHMgdG8gYmUgcmVjb25jaWxlZAoKICAgICAgaWYgeyR2YXJzKGhpZXJfZmxvd190eXBlKSA9PSAiMnBhc3MifSB7CiAgICAgICAgIHNldCBwYXJ0aXRpb25fZGlyICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpCiAgICAgICB9IGVsc2UgewogICAgICAgICBzZXQgcGFydGl0aW9uX2RpciAkdmFycyhwYXJ0aXRpb25fZGlyKQogICAgICB9CiAgICAgIHNldCBkaXIgW2ZpbGUgdGFpbCBbc3Vic3QgJHZhcnMoZGJzX2RpcildXQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyhzY3JpcHRfZGlyKS9pbmNyX3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmlld19kZWZpbml0aW9uX3RjbCldfSB7CiAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHZpZXdfZGVmaW5pdGlvbl90Y2wpCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyhzY3JpcHRfZGlyKS92aWV3X2RlZmluaXRpb24udGNsCiAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgeyhbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MCkgJiYgKFtsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTApfSB7CgogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoZGVzaWduKSxhc3NlbWJsZV9zdGVwKV19IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFzc2VtYmxlRGVzaWduIC10b3BEZXNpZ24geyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICR2YXJzKGRlc2lnbikgJHZhcnMoJHZhcnMoZGVzaWduKSxhc3NlbWJsZV9zdGVwKX0gLW1tbWNGaWxlICRtbW1jX2ZpbGUiCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJhc3NlbWJsZURlc2lnbiAtdG9wRGVzaWduIHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkdmFycyhkZXNpZ24pIHNpZ25vZmZ9IC1tbW1jRmlsZSAkbW1tY19maWxlIgogICAgICAgICB9CiAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGlsbV9saXN0ICRwYXJ0XSA9PSAtMX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQsYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrIHskdmFycyhvYV9wYXJ0aXRpb25fbGliKSAkcGFydCAkdmFycygkdmFycygkcGFydCksYXNzZW1ibGVfc3RlcCl9IgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9jayB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHBhcnQgc2lnbm9mZn0iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgICAgICAgIHNldCBhc3NlbWJsZV9jb21tYW5kICJhc3NlbWJsZURlc2lnbiAtY3BmRmlsZSAkdmFycyhjcGZfZmlsZSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBhc3NlbWJsZV9jb21tYW5kICJhc3NlbWJsZURlc2lnbiAtbW1tY0ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVEZXNpZ24iCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbiksYXNzZW1ibGVfZGJzKV19IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIC1mZSAtdG9wRGlyICR2YXJzKCR2YXJzKGRlc2lnbiksYXNzZW1ibGVfZGJzKSIKICAgICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbiksYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtZmUgJHBhcnRpdGlvbl9kaXIvJHZhcnMoZGVzaWduKS8kZGlyLyR2YXJzKCR2YXJzKGRlc2lnbiksYXNzZW1ibGVfc3RlcCkuZW5jLmRhdCIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIC1mZSAtdG9wRGlyICRwYXJ0aXRpb25fZGlyLyR2YXJzKGRlc2lnbikvJGRpci9zaWdub2ZmLmVuYy5kYXQgIgogICAgICAgICB9CiAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJGlsbV9saXN0ICRwYXJ0XSA9PSAtMX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQsYXNzZW1ibGVfZGJzKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tEaXIgJHZhcnMoJHBhcnQsYXNzZW1ibGVfZGJzKSIKICAgICAgICAgICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LGFzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9ja0RpciAkcGFydGl0aW9uX2Rpci8kcGFydC8kZGlyLyR2YXJzKCRwYXJ0LGFzc2VtYmxlX3N0ZXApLmVuYy5kYXQiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrRGlyICRwYXJ0aXRpb25fZGlyLyRwYXJ0LyRkaXIvc2lnbm9mZi5lbmMuZGF0IgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHskdmFycyhlbmFibGVfcGFjKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAtaGllckRpciAkdmFycyhwYWNfc2NyYXRjaF9kaXIpIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kICJcblxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGFzc2VtYmxlX2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgIGlmIHsoW2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMCkgJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzb3VyY2UgJG1tbWNfZmlsZVxuIgogICAgICB9CiAgICAgIGlmIHskdmFycyhmbG93KSA9PSAibW1tYyJ9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6ZGVyYXRlX3RpbWluZyBtbW1jXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZGVyYXRlX3RpbWluZyAkY29tbWFuZF0KICAgICAgfQogICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKX0gewogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxM30gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjplbmFibGVfbWV0cmljcyAtb25cbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ1bTo6cHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGFsd2F5c19zb3VyY2VfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgInBvc3QgYXNzZW1ibGUiIHBsdWctaW4gc2NyaXB0CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9hc3NlbWJsZV90Y2wgMF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBTcGVjaWZ5IElMTXMgaWYgZGVmaW5lZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFNQRUNJRllJTkcgSUxNc1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgfQogICAgICAgICBzZXQgY29tbWFuZCAiIiAKICAgICAgICAgZm9yZWFjaCBjZWxsICRpbG1fbGlzdCB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY2VsbCxpbG1fZGlyKV0gJiYgW2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMoJGNlbGwsaWxtX2RpcildfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRjZWxsIC1kaXIgJHZhcnMoJGNlbGwsaWxtX2RpcilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBJTE0gRElSRUNUT1JZIE1JU1NJTkcgRk9SICRjZWxsIC4uLiBTS0lQUElORyIKICAgICAgICAgICAgfQogICAgICAgICB9IAogIAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJsb2FkVGltaW5nQ29uIC1pbG1Ob25TZGNGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRJbG1Ob25TZGNDb25zdHJhaW50RmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTR9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OmxvYWRfcG93ZXJfaW50ZW50XQogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgfQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV0gJiYgJHZhcnMoY3BmX3RpbWluZyl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6aW5pdGlhbGl6ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGluaXRpYWxpemVfdGltaW5nICRjb21tYW5kXQogICAgICB9CgogICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjp1cGRhdGVfdGltaW5nIG1tbWMgMSBdCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSx1cGRhdGVfdGltaW5nICRjb21tYW5kXQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9zaWdub2ZmX2VjbyldICYmICR2YXJzKGVuYWJsZV9zaWdub2ZmX2Vjbyl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3NpZ25vZmZfZWNvX3RjbCAwXQogICAgICAgICBzZXQgY29tbWFuZCAidmVyaWZ5Q29ubmVjdGl2aXR5XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxwcmVfc2lnbm9mZl9lY29fdmVyaWZ5X2Nvbm5lY3Rpdml0eSAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgIlt2ZXJpZnlfZ2VvbWV0cnlfY29tbWFuZF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHByZV9zaWdub2ZmX2Vjb192ZXJpZnlfZ2VvbWV0cnkgJGNvbW1hbmRdCgogICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIFNJR04tT0ZGIEVDT1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgfQoKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6ZGVsZXRlX2ZpbGxlcl9jZWxsc10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGRlbGV0ZV9maWxsZXJfY2VsbHMgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJleHRyYWN0UkNcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGV4dHJhY3RfcmMgJGNvbW1hbmRdCiAgICAgICAgIHNldCBvcCBbb3BlbiBwdG4udHh0IHddCiMgICAgICAgICBkYkZvckVhY2hIZWFkUHRuIFtkYmdIZWFkXSBwdHIgewojICAgICAgICAgICAgc2V0IHB0biBbZGJQdG5OYW1lICRwdHJdCiMgICAgICAgICAgICBwdXRzICRvcCAiJHB0biIKIyAgICAgICAgIH0KICAgICAgICAgZm9yZWFjaCBwdG4gJHZhcnMocGFydGl0aW9uX2xpc3QpIHsgCiAgICAgICAgICAgIHB1dHMgJG9wICIkcHRuIgogICAgICAgICB9CiAgICAgICAgIGNsb3NlICRvcAogICAgICAgICBzZXQgY29tbWFuZCAic2V0U2lnbm9mZk9wdE1vZGUgLXBhcnRpdGlvbkxpc3RGaWxlIFwicHRuLnR4dFwiIC1vcHRpbWl6ZVJlcGxpY2F0ZWRNb2R1bGVzIHRydWVcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHNpZ25vZmZfdGltZV9kZXNpZ24gJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJzaWdub2ZmVGltZURlc2lnbiAtcmVwb3J0T25seVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsc2lnbm9mZl90aW1lX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgInNpZ25vZmZPcHREZXNpZ24gLXNldHVwIC1ub0Vjb1JvdXRlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxzaWdub2ZmX29wdF9kZXNpZ24gJGNvbW1hbmRdCiMgICAgICAgICBzZXQgY29tbWFuZCAiYWRkRmlsbGVyXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsYWRkX2ZpbGxlcl9jZWxscyAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgImVjb1JvdXRlIC1oYW5kbGVQYXJ0aXRpb25cbiIKICAgICAgICAgI3NldCBjb21tYW5kICJlY29Sb3V0ZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsZWNvX3JvdXRlICRjb21tYW5kXQoKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAjIE9wdGlvbmFsbHkgcnVuIExQQQogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgIAogICAgICAgICBpZiB7JHZhcnModmVyaWZ5X2xpdGhvKX0gewogICAgICAgICAgICAjIEJDTDogQWRkZWQgc3Vic3QgdG8gaGFuZGxlIGRlcmVyZW5jaW5nIHZhcmlhYmxlcwogICAgICAgICAgICBmaWxlIG1rZGlyICBbc3Vic3QgJHZhcnMocnB0X2RpcildL0xQQS9ETUMKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInZlcmlmeUxpdGhvIC1yb3V0aW5nTGF5ZXJzT25seSAtdGVjaEZpbGUgJHZhcnMobHBhX3RlY2hfZmlsZSkgLWRpciAkdmFycyhycHRfZGlyKS9MUEFcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInZpb2xhdGlvbkJyb3dzZXIgLWFsbCAtbm9fZGlzcGxheV9mYWxzZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAibG9hZFZpb2xhdGlvblJlcG9ydCAtdHlwZSBDRE5MaXRobyAtZmlsZW5hbWUgJHZhcnMocnB0X2RpcikvTFBBL0RNQy9tZXJnZWQuaGlmXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSx2ZXJpZnlfbGl0aG8gJGNvbW1hbmRdCiAgICAgICAgIH0KCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3Rfc2lnbm9mZl9lY29fdGNsIDBdCiAgICAgICAgIHNldCBjb21tYW5kICJ2ZXJpZnlDb25uZWN0aXZpdHlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHBvc3Rfc2lnbm9mZl9lY29fdmVyaWZ5X2Nvbm5lY3Rpdml0eSAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgIlt2ZXJpZnlfZ2VvbWV0cnlfY29tbWFuZF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHBvc3Rfc2lnbm9mZl9lY29fdmVyaWZ5X2dlb21ldHJ5ICRjb21tYW5kXQogICAgICB9IGVsc2VpZiB7JHZhcnMoZW5hYmxlX3BhYyl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInZlcmlmeUNvbm5lY3Rpdml0eVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUscHJlX3BhY192ZXJpZnlfY29ubmVjdGl2aXR5ICRjb21tYW5kXQogICAgICAgICBzZXQgY29tbWFuZCAiW3ZlcmlmeV9nZW9tZXRyeV9jb21tYW5kXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUscHJlX3BhY192ZXJpZnlfZ2VvbWV0cnkgJGNvbW1hbmRdCgogICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBERUZJTklORyBQQUMgTU9ERVNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3BhY190Y2wgMF0KICAgICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgICAgZm9yZWFjaCBwYXJ0ICRwYWNfbGlzdCB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgaGluc3QgXFtkYkhJbnN0TmFtZSBcW2RiQ2VsbEhJbnN0IFxbZGJHZXRDZWxsQnlOYW1lICRwYXJ0XF1cXVxdXG4iCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxwYWNfbW9kZSldfSB7CiAgICAgICAgICAgICAgIGlmIHskdmFycygkcGFydCxwYWNfbW9kZSkgPT0gInJlYWRfb25seSJ9IHsgc2V0IHZhcnMoJHBhcnQscGFjX21vZGUpICJyZWFkT25seSIgfQogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0TW9kdWxlVmlldyAtaGluc3QgXCRoaW5zdCAtdHlwZSAkdmFycygkcGFydCxwYWNfbW9kZSlcbiIKICAgICAgICAgICAgfSAKICAgICAgICAgfQoKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImdldE1vZHVsZVZpZXdcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHNldF9tb2R1bGVfdmlldyAkY29tbWFuZF0KCiAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFJVTk5JTkcgUE9TVCBBU1NFTUJMWSBDTE9TVVJFXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICB9CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmRlbGV0ZV9maWxsZXJfY2VsbHNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxkZWxldGVfZmlsbGVyX2NlbGxzICRjb21tYW5kXQogICAgICAgICBzZXQgY29tbWFuZCAib3B0RGVzaWduIC1wb3N0Um91dGUgLW91dERpciAkdmFycyhycHRfZGlyKSAtcHJlZml4IHBhY1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgYXNzZW1ibGUsb3B0X2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6YWRkX2ZpbGxlcl9jZWxsc10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLGFkZF9maWxsZXJfY2VsbHMgJGNvbW1hbmRdCgogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgT3B0aW9uYWxseSBydW4gTFBBCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgCiAgICAgICAgIGlmIHskdmFycyh2ZXJpZnlfbGl0aG8pfSB7CiAgICAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCB0byBoYW5kbGUgZGVyZXJlbmNpbmcgdmFyaWFibGVzCiAgICAgICAgICAgIGZpbGUgbWtkaXIgIFtzdWJzdCAkdmFycyhycHRfZGlyKV0vTFBBL0RNQwogICAgICAgICAgICBzZXQgY29tbWFuZCAidmVyaWZ5TGl0aG8gLXJvdXRpbmdMYXllcnNPbmx5IC10ZWNoRmlsZSAkdmFycyhscGFfdGVjaF9maWxlKSAtZGlyICR2YXJzKHJwdF9kaXIpL0xQQVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidmlvbGF0aW9uQnJvd3NlciAtYWxsIC1ub19kaXNwbGF5X2ZhbHNlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJsb2FkVmlvbGF0aW9uUmVwb3J0IC10eXBlIENETkxpdGhvIC1maWxlbmFtZSAkdmFycyhycHRfZGlyKS9MUEEvRE1DL21lcmdlZC5oaWZcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHZlcmlmeV9saXRobyAkY29tbWFuZF0KICAgICAgICAgfQoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wYWNfdGNsIDBdCiAgICAgICAgIHNldCBjb21tYW5kICJ2ZXJpZnlDb25uZWN0aXZpdHlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kIGFzc2VtYmxlLHBvc3RfcGFjX3ZlcmlmeV9jb25uZWN0aXZpdHkgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJbdmVyaWZ5X2dlb21ldHJ5X2NvbW1hbmRdXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCBhc3NlbWJsZSxwb3N0X3BhY192ZXJpZnlfZ2VvbWV0cnkgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICAgICBzZXQgY29tbWFuZHMgIiIgCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpydW5fc2lnbm9mZiAkZm9ybWF0XQoKIyAgICAgIGlmIHskdmFycyhtYWtlZmlsZSl9IHsgCiMgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHtcbiIKIyAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImV4ZWMgL2Jpbi90b3VjaCBcJGVudihWUEFUSCkvYXNzZW1ibGVcbiIKIyAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKIyAgICAgICB9CgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fcmVidWRnZXQge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IHZhcnMoc3RlcCkgcmVidWRnZXQKICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICBGRl9FREk6OmluaXRpYWxpemVfc3RlcCAkdmFycyhzdGVwKQoKIyAgICAgIGlmIHskdmFycyhyZXBvcnRfcnVuX3RpbWUpfSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKCR2YXJzKHN0ZXApLHN0YXJ0X3RpbWUpIFxbY2xvY2sgc2Vjb25kc1xdXG4iCiMgICAgICB9CiAgICAgIGlmIHshJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG5pZiB7XFtmaWxlIGlzZmlsZSAkdmFycyhwYWNfc2NyYXRjaF9kaXIpLy5wYWNGbG93TG9ja1xdfSB7XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgZmlsZSBkZWxldGUgJHZhcnMocGFjX3NjcmF0Y2hfZGlyKS8ucGFjRmxvd0xvY2tcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICB9IGVsc2UgewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtmaWxlIGlzZmlsZSAkdmFycyhzY3JpcHRfZGlyKS92aWV3X2RlZmluaXRpb24udGNsXX0ge1xuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKS92aWV3RGVmaW5pdGlvbi50Y2xcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgQVNTRU1CTElORyBERVNJR05cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgInByZSByZWJ1ZGdldCIgcGx1Zy1pbiBzY3JpcHQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcmVidWRnZXRfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEdldCB0aGUgRmxleElMTSBFQ08gcGF0aHMKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbZmlsZSBpc2ZpbGUgXCRlbnYoVlBBVEgpL2ZsZXhpbG1cXX0ge1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIHNvdXJjZSBcJGVudihWUEFUSCkvZmxleGlsbVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIn1cbiIKICAgICAgfQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEFzc2VtYmxlIHRoZSBkZXNpZ24KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBzZXQgdmFycyhpbG0pIGZhbHNlCiAgICAgIHNldCBpbG1fbGlzdCBbbGlzdF0KICAgICAgc2V0IHBhY19saXN0IFtsaXN0XQogICAgICBpZiB7JHZhcnMoZW5hYmxlX3BhYyl9IHsKICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxwYWNfbW9kZSldfSAgewogICAgICAgICAgICAgICBpZiB7JHZhcnMoJHBhcnQscGFjX21vZGUpID09ICJpbG0ifSB7CiAgICAgICAgICAgICAgICAgIGxhcHBlbmQgaWxtX2xpc3QgJHBhcnQKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgbGFwcGVuZCBwYWNfbGlzdCAkcGFydAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbGlzdCldICYmICgkdmFycyhpbG1fbGlzdCkgIT0gIiIpfSB7CiAgICAgICAgIGZvcmVhY2ggaWxtICR2YXJzKGlsbV9saXN0KSB7CiAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJGlsbV9saXN0ICRpbG1dID09IC0xKSAmJiAoW2xzZWFyY2ggJHBhY19saXN0ICRpbG1dID09IC0xKX0gewogICAgICAgICAgICAgICBsYXBwZW5kIGlsbV9saXN0ICRpbG0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgeyRpbG1fbGlzdCAhPSAiIn0gewogICAgICAgICBzZXQgdmFycyhpbG0pIHRydWUgCiAgICAgIH0KCiAgICAgICMgQkNMOiBBZGRlZCB0YWlsIG9mIHN1YnN0IG9mIHZhcnMoZGJzX2RpcikKICAgICAgIyBOb3RlIC0gRURJRkYgSGllcmFyY2hpY2FsIGZsb3cgaXMgY3VycmVudGx5IElOQ09NUEFUSUJMRSB3aXRoIEZGIGRpciBzdHJ1Y3R1cmUKICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgYXBwZWFycyB0byByZWx5IG9uIHZhcnMoZGJzX2RpcikgYWx3YXlzIGJlaW5nIHVuZGVyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKGRlc2lnbikKICAgICAgIyBUaGlzIG5lZWRzIHRvIGJlIHJlY29uY2lsZWQKICAgICAgc2V0IGRpciBbZmlsZSB0YWlsIFtzdWJzdCAkdmFycyhkYnNfZGlyKV1dCgogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL2luY3Jfdmlld19kZWZpbml0aW9uLnRjbAogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCkKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7KFtzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wKSAmJiAoW2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMCl9IHsKCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiYXNzZW1ibGVEZXNpZ24gLXRvcERlc2lnbiB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHZhcnMoZGVzaWduKSAkdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApfSAtbW1tY0ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFzc2VtYmxlRGVzaWduIC10b3BEZXNpZ24geyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICR2YXJzKGRlc2lnbikgY3RzfSAtbW1tY0ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgfQogICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoICRpbG1fbGlzdCAkcGFydF0gPT0gLTF9IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9jayB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHBhcnQgJHZhcnMoJHZhcnMoJHBhcnQpLHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApfSIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2sgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwYXJ0IGN0c30iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcmVidWRnZXQsaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgICAgICAgIHNldCBhc3NlbWJsZV9jb21tYW5kICJhc3NlbWJsZURlc2lnbiAtY3BmRmlsZSAkdmFycyhjcGZfZmlsZSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBhc3NlbWJsZV9jb21tYW5kICJhc3NlbWJsZURlc2lnbiAtbW1tY0ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVEZXNpZ24iCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfZGJzKV19IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIC1mZSAtdG9wRGlyICR2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfZGJzKSIKICAgICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtZmUgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKS8kZGlyLyR2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfc3RlcCkuZW5jLmRhdCIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIFxcXG4gICAtZmUgXFxcbiAgIC10b3BEaXIgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJHZhcnMoZGVzaWduKSAiCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCBcXFxuICAgLWZlIFxcXG4gICAtdG9wRGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpX0ZMRVhJTE0vJHZhcnMoZGVzaWduKSAiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtZmUgLXRvcERpciAkdmFycyhwYXJ0aXRpb25fZGlyKS8kdmFycyhkZXNpZ24pLyRkaXIvY3RzLmVuYy5kYXQgIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkaWxtX2xpc3QgJHBhcnRdID09IC0xfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxyZWJ1ZGdldF9hc3NlbWJsZV9kYnMpXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9ja0RpciAkdmFycygkcGFydCxyZWJ1ZGdldF9hc3NlbWJsZV9kYnMpIgogICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscmVidWRnZXRfYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrRGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwYXJ0LyRkaXIvJHZhcnMoJHBhcnQscmVidWRnZXRfYXNzZW1ibGVfc3RlcCkuZW5jLmRhdCIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9ja0RpciBcJHZhcnMoJHBhcnQsY2R0dikgIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9ja0RpciAkdmFycyhwYXJ0aXRpb25fZGlyKS8kcGFydC8kZGlyL2N0cy5lbmMuZGF0IgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgeyR2YXJzKGVuYWJsZV9wYWMpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuIC1oaWVyRGlyICR2YXJzKHBhY19zY3JhdGNoX2RpcikiCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGFzc2VtYmxlX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgaWYgeyhbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwKSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkbW1tY19maWxlXG4iCiAgICAgIH0KICAgICAgaWYgeyR2YXJzKGZsb3cpID09ICJtbW1jIn0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjpkZXJhdGVfdGltaW5nIG1tbWNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJhdGVfdGltaW5nICRjb21tYW5kXQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBhbHdheXNfc291cmNlX3RjbF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkICJwb3N0IHJlYnVkZ2V0IiBwbHVnLWluIHNjcmlwdAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcmVidWRnZXRfdGNsIDBdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgU3BlY2lmeSBJTE1zIGlmIGRlZmluZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7JHZhcnMoaWxtKX0gewogICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBTUEVDSUZZSU5HIElMTXNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIH0KICAgICAgICAgc2V0IGNvbW1hbmQgIiIgCiAgICAgICAgIGZvcmVhY2ggY2VsbCAkaWxtX2xpc3QgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNlbGwsaWxtX2RpcildICYmIFtmaWxlIGlzZGlyZWN0b3J5ICR2YXJzKCRjZWxsLGlsbV9kaXIpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkY2VsbCAtZGlyICR2YXJzKCRjZWxsLGlsbV9kaXIpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gV0FSTklORzogSUxNIERJUkVDVE9SWSBNSVNTSU5HIEZPUiAkY2VsbCAuLi4gU0tJUFBJTkciCiAgICAgICAgICAgIH0KICAgICAgICAgfSAKICAKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNwZWNpZnlfaWxtICRjb21tYW5kXQogIAogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAibG9hZFRpbWluZ0NvbiAtaWxtTm9uU2RjRmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0SWxtTm9uU2RjQ29uc3RyYWludEZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9pbG1fbm9uX3NkY19maWxlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE0fSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6bG9hZF9wb3dlcl9pbnRlbnRdCiAgICAgIH0KCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYgeyEkdmFycyhlbmFibGVfZmxleGlsbSl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgW0ZGX0VESTo6dXBkYXRlX3RpbWluZyBtbW1jIF0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhlbmFibGVfcGFjKX0gewoKICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgREVGSU5JTkcgUEFDIE1PREVTXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wYWNfdGNsIDBdCiAgICAgICAgIHNldCBjb21tYW5kICIiCiAgICAgICAgIGZvcmVhY2ggcGFydCAkcGFjX2xpc3QgewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IGhpbnN0IFxbZGJISW5zdE5hbWUgXFtkYkNlbGxISW5zdCBcW2RiR2V0Q2VsbEJ5TmFtZSAkcGFydFxdXF1cXVxuIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscGFjX21vZGUpXX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoJHBhcnQscGFjX21vZGUpID09ICJyZWFkX29ubHkifSB7IHNldCB2YXJzKCRwYXJ0LHBhY19tb2RlKSAicmVhZE9ubHkiIH0KICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldE1vZHVsZVZpZXcgLWhpbnN0IFwkaGluc3QgLXR5cGUgJHZhcnMoJHBhcnQscGFjX21vZGUpXG4iCiAgICAgICAgICAgIH0gCiAgICAgICAgIH0KCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJnZXRNb2R1bGVWaWV3XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfbW9kdWxlX3ZpZXcgJGNvbW1hbmRdCgogICAgICAgICBpZiB7ISR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIFBPU1QgQVNTRU1CTFkgQ0xPU1VSRVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAib3B0RGVzaWduIC1wb3N0Q1RTIC1vdXREaXIgJHZhcnMocnB0X2RpcikgLXByZWZpeCBwYWNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLG9wdF9kZXNpZ24gJGNvbW1hbmRdCiAgIAogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3BhY190Y2wgMF0KICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgIHNldCBjb21tYW5kICJzZXRUcmlhbFJvdXRlTW9kZSAtaGFuZGxlUGFydGl0aW9uQ29tcGxleCB0cnVlIC1ob25vclBpbiB0cnVlXG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlMSAkY29tbWFuZF0KICAgICAgICBzZXQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgogICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0cmlhbF9yb3V0ZTEgJGNvbW1hbmRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0IGNvbW1hbmQgInNldFJvdXRlTW9kZSAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yRmVuY2UgLiAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yUGluIC5cbiIKICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUxICRjb21tYW5kXQogICAgICAgIHNldCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X2dsb2JhbF9yb3V0ZTEgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kICJkZXJpdmVUaW1pbmdCdWRnZXQgLW5vVHJpYWxJUE8gLW5vQ29uc3RhbnRNb2RlbFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZGVyaXZlX3RpbWluZ19idWRnZXQgJGNvbW1hbmRdCgogICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVEZXNpZ24gLWNlbGx2aWV3IHskdmFycyhvYV9kZXNpZ25fbGliKSAkdmFycyhkZXNpZ24pIGJ1ZGdldH1cbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVPYURlc2lnbiAkdmFycyhvYV9kZXNpZ25fbGliKSAkdmFycyhkZXNpZ24pIGJ1ZGdldFxuIgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzYXZlRGVzaWduICR2YXJzKGRic19kaXIpL2J1ZGdldC5lbmMgLWNvbXByZXNzXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNhdmVfZGVzaWduLGJ1ZGdldCAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBQYXJ0aXRpb24gYW5kIHNhdmUgdGhlIHBhcnRpdGlvbnMgaW50byB0aGUKICAgICAgIyBkaXJlY3RvcnkgUEFSVElUSU9OCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wYXJ0aXRpb25fdGNsXQoKIyAgICAgIHNldCBjb21tYW5kICJzZXQgcHRuZ1B0blRpbWluZ0xpYkZvcm1hdCBsaWJcbnBhcnRpdGlvbiAtYnVpbGRTY2FuXG4iCiAgICAgIHNldCBjb21tYW5kICJwYXJ0aXRpb24gLWJ1aWxkU2NhblxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscGFydGl0aW9uICRjb21tYW5kXQogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICBpZiB7KFtzdHJpbmcgY29tcGFyZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MCl9IHsKICAgICAgICAgICAgaWYgeyR2YXJzKGhpZXJfZmxvd190eXBlKSA9PSAiMXBhc3MifSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlUGFydGl0aW9uIC1wdG5MaWIgJHZhcnMob2FfcGFydGl0aW9uX2xpYikgLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZVBhcnRpdGlvbiAtcHRuTGliICR2YXJzKG9hX3BhcnRpdGlvbl9saWIpIC1kaXIgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMilcbiIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7JHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIxcGFzcyJ9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVQYXJ0aXRpb24gLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKSAtZGVmIC1zY2FuRGVmXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlUGFydGl0aW9uIC1kaXIgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikgLWRlZiAtc2NhbkRlZlxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVQYXJ0aXRpb24gLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKSAtZGVmIC1zY2FuRGVmXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNhdmVfcGFydGl0aW9uICRjb21tYW5kXQojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9wYXJ0aXRpb25fdGNsXQoKICAgICAgaWYgeyR2YXJzKHVzZV9mbGV4bW9kZWxzKSAmJiAkdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewojICAgICAgICAgc2V0IGNvbW1hbmQgInJlcGxhY2VfcHJvdG9fbW9kZWwgXFxcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtcHJlX2Z0X2RpciAkdmFycyhlY29fZGlyKS9wcmVfZnQgXFxcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtcG9zdF9mdF9kaXIgJHZhcnMoZWNvX2RpcikvcG9zdF9mdCBcXFxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1wdG5fZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpIFxcXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLXB0bl9mdWxsX25ldGxpc3RfZGlyIC4vdGVtcF9uZXRsaXN0X2RpciBcXFxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1vdXRfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpXG4iCgogICAgICAgICBzZXQgY29tbWFuZCAicmVwbGFjZV9wcm90b19tb2RlbCBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLXB0bl9kaXIgJHZhcnMocGFydGl0aW9uX2RpcikgXFxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1vdXRfZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpXG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscmVwbGFjZV9wcm90b19tb2RlbCAkY29tbWFuZF0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8RkY+IEdFTkVSQVRJTkcgUkVQT1JUU1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCiAgICAgIGlmIHskdmFycyhyZXBvcnRfcG93ZXIpfSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9hbmFseXNpc192aWV3KV0gJiYgKCR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpICE9ICIiKX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAicmVwb3J0X3Bvd2VyIC12aWV3ICR2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpIC1vdXRmaWxlICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnBvd2VyLnJwdFxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAicmVwb3J0X3Bvd2VyIC1vdXRmaWxlICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnBvd2VyLnJwdFxuIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZXBvcnRfcG93ZXIgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddICYmIFtpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2RvbWFpbnMpXSAmJiBbbGxlbmd0aCAkdmFycyhwb3dlcl9kb21haW5zKV0gPiAxfSB7CgogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgVmVyaWZ5IHBvd2VyIGRvbWFpbgogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICBzZXQgY29tbWFuZCAidmVyaWZ5UG93ZXJEb21haW4gLWJpbmQgLWdjb25uIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pc29OZXRQRCAkdmFycyhycHRfZGlyKS8kdmFycyhzdGVwKS5pc29uZXRzLnJwdCIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAteE5ldFBEICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLnhuZXRzLnJwdFxuIgoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHZlcmlmeV9wb3dlcl9kb21haW4gJGNvbW1hbmRdCgogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgUnVuIENMUAogICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICBpZiB7JHZhcnMocnVuX2NscCkgJiYgKFthdXRvX2V4ZWNvayBsZWNdICE9ICIiKX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAicnVuQ0xQICIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNscF9vcHRpb25zKV19IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgJHZhcnMoY2xwX29wdGlvbnMpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscnVuX2NscCAkY29tbWFuZF0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhjbHBfd2FybmluZyldfSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gV0FSTklORzogVU5BQkxFIFRPIFJVTiBDTFAgLi4uIFBMRUFTRSBNQUtFIFNVUkUgSVQgSVMgSU4gWU9VUiBQQVRIIgogICAgICAgICAgICAgICBzZXQgdmFycyhjbHBfd2FybmluZykgdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7ISR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgICAgc2V0IGNvbW1hbmRzICIiIAogICAgICB9CgojICAgICAgaWYgeyR2YXJzKG1ha2VmaWxlKX0geyAKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbaW5mbyBleGlzdHMgZW52KFZQQVRIKVxdfSB7XG4iCiAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImV4ZWMgL2Jpbi90b3VjaCBcJGVudihWUEFUSCkvJHZhcnMoc3RlcClcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgojICAgICAgIH0KCiMgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgQ29weSBNYWtlZmlsZXMgaW4gY2FzZSB0aGV5IGdldCBkZWxldGVkIGR1cmluZyB0aGUgZmxvdyAuLi5cbiIKIyAgICAgICAgIGZvcmVhY2ggcGFydCBbY29uY2F0ICR2YXJzKGRlc2lnbikgJHZhcnMocGFydGl0aW9uX2xpc3QpXSB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZpbGUgY29weSAtZm9yY2UgJHZhcnMoc2NyaXB0X2RpcikvJHBhcnQuTWFrZWZpbGUgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJHBhcnQvTWFrZWZpbGVcbiIKIyAgICAgICAgIH0KIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmlsZSBjb3B5IC1mb3JjZSAkdmFycyhwYXJ0aXRpb25fZGlyKS9NYWtlZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS9NYWtlZmlsZVxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXIpL01ha2VmaWxlLnBhcnRpdGlvbiAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS9NYWtlZmlsZS5wYXJ0aXRpb25cbiIKIyAgICAgIH0KCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9hc3NlbWJsZV9mbGV4aWxtIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIHNldCB2YXJzKHN0ZXApIGFzc2VtYmxlX2ZsZXhpbG0KICAgICAgc2V0IGNvbW1hbmRzICIiCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR2YXJzKHN0ZXApXG4iCgogICAgICBGRl9FREk6OmluaXRpYWxpemVfc3RlcCAkdmFycyhzdGVwKQoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgQVNTRU1CTElORyBERVNJR05cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgIH0KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgInByZSByZWJ1ZGdldCIgcGx1Zy1pbiBzY3JpcHQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcmVidWRnZXRfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIEFzc2VtYmxlIHRoZSBkZXNpZ24KICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBzZXQgdmFycyhpbG0pIGZhbHNlCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbGlzdCldICYmICgkdmFycyhpbG1fbGlzdCkgIT0gIiIpfSB7CiAgICAgICAgIHNldCB2YXJzKGlsbSkgdHJ1ZSAKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnMoaWxtX2xpc3QpICIiCiAgICAgIH0KCiAgICAgICMgQkNMOiBBZGRlZCB0YWlsIG9mIHN1YnN0IG9mIHZhcnMoZGJzX2RpcikKICAgICAgIyBOb3RlIC0gRURJRkYgSGllcmFyY2hpY2FsIGZsb3cgaXMgY3VycmVudGx5IElOQ09NUEFUSUJMRSB3aXRoIEZGIGRpciBzdHJ1Y3R1cmUKICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgYXBwZWFycyB0byByZWx5IG9uIHZhcnMoZGJzX2RpcikgYWx3YXlzIGJlaW5nIHVuZGVyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKGRlc2lnbikKICAgICAgIyBUaGlzIG5lZWRzIHRvIGJlIHJlY29uY2lsZWQKICAgICAgc2V0IGRpciBbZmlsZSB0YWlsIFtzdWJzdCAkdmFycyhkYnNfZGlyKV1dCgogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL2luY3Jfdmlld19kZWZpbml0aW9uLnRjbAogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCkKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7KFtzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wKSAmJiAoW2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMCl9IHsKCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAiYXNzZW1ibGVEZXNpZ24gLXRvcERlc2lnbiB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHZhcnMoZGVzaWduKSAkdmFycygkdmFycyhkZXNpZ24pLHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApfSAtbW1tY0ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImFzc2VtYmxlRGVzaWduIC10b3BEZXNpZ24geyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICR2YXJzKGRlc2lnbikgY3RzfSAtbW1tY0ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgfQogICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoICRpbG1fbGlzdCAkcGFydF0gPT0gLTF9IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXFxcbiAgIC1ibG9jayB7JHZhcnMob2FfcGFydGl0aW9uX2xpYikgJHBhcnQgJHZhcnMoJHZhcnMoJHBhcnQpLHJlYnVkZ2V0X2Fzc2VtYmxlX3N0ZXApfSIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2sgeyR2YXJzKG9hX3BhcnRpdGlvbl9saWIpICRwYXJ0IGN0c30iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgcmVidWRnZXQsaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgICAgICAgIHNldCBhc3NlbWJsZV9jb21tYW5kICJhc3NlbWJsZURlc2lnbiAtY3BmRmlsZSAkdmFycyhjcGZfZmlsZSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBhc3NlbWJsZV9jb21tYW5kICJhc3NlbWJsZURlc2lnbiAtbW1tY0ZpbGUgJG1tbWNfZmlsZSIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgYXNzZW1ibGVfY29tbWFuZCAiYXNzZW1ibGVEZXNpZ24iCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfZGJzKV19IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIC1kZWZNZXJnZSAtdG9wRGlyICR2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfZGJzKSIKICAgICAgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfc3RlcCldfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCAtZGVmTWVyZ2UgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKS8kZGlyLyR2YXJzKCR2YXJzKGRlc2lnbikscmVidWRnZXRfYXNzZW1ibGVfc3RlcCkuZW5jLmRhdCIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIFxcXG4gICAtZGVmTWVyZ2UgXFxcbiAgIC10b3BEaXIgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJHZhcnMoZGVzaWduKSAiCiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICIkYXNzZW1ibGVfY29tbWFuZCBcXFxuICAgLWRlZk1lcmdlIFxcXG4gICAtdG9wRGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpX1BSRUNUUy8kdmFycyhkZXNpZ24pICIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgIiRhc3NlbWJsZV9jb21tYW5kIC1kZWZNZXJnZSAtdG9wRGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKGRlc2lnbikvJGRpci9jdHMuZW5jLmRhdCAiCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YXJzKGlsbV9saXN0KSAkcGFydF0gPT0gLTF9IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LHJlYnVkZ2V0X2Fzc2VtYmxlX2RicyldfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrRGlyICR2YXJzKCRwYXJ0LHJlYnVkZ2V0X2Fzc2VtYmxlX2RicykiCiAgICAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkcGFydCxyZWJ1ZGdldF9hc3NlbWJsZV9zdGVwKV19IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tEaXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHBhcnQvJGRpci8kdmFycygkcGFydCxyZWJ1ZGdldF9hc3NlbWJsZV9zdGVwKS5lbmMuZGF0IgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcXFxuICAgLWJsb2NrRGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpX1BSRUNUUy8kcGFydC8ke3BhcnR9X3Bvc3RFQ08uZW5jLmRhdCIKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIlxcXG4gICAtYmxvY2tEaXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHBhcnQvJGRpci9jdHMuZW5jLmRhdCIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGFzc2VtYmxlX2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyhjYXB0dXJlX21ldHJpY3MpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAidW06OmVuYWJsZV9tZXRyaWNzIC1vblxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgInVtOjpwdXNoX3NuYXBzaG90X3N0YWNrXG4iCiAgICAgIH0KICAgICAgCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGFsd2F5c19zb3VyY2VfdGNsXQoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgIyBBZGRpdGlvbmFsIHRpbWluZyBzZXR1cAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoZGVzaWduKSxsYXRlbmN5X3NkYyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJmb3JlYWNoIG1vZGUgXFthbGxfY29uc3RyYWludF9tb2RlcyAtYWN0aXZlXF0ge1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0IHNkY19maWxlcyBcW2dldF9jb25zdHJhaW50X21vZGUgXCRtb2RlIC1zZGNfZmlsZXNcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0IHNkY19saXN0IFxbY29uY2F0IFwkc2RjX2ZpbGVzICR2YXJzKCR2YXJzKGRlc2lnbiksbGF0ZW5jeV9zZGMpXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgXCRtb2RlIC1zZGNfZmlsZXMgXCRzZGNfbGlzdFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV9jb25zdHJhaW50X21vZGUgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGZvcmVhY2ggdmlldyBbY29uY2F0ICR2YXJzKHNldHVwX2FuYWx5c2lzX3ZpZXdzKSAkdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKV0gewogICAgICAgICBmb3JlYWNoIHB0biAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHB0biwkdmlldyxsYXRlbmN5X3NkYyldfSB7CiAgICAgICAgICAgICAgIHNldCBsYXRlbmN5KCR2aWV3LCRwdG4pICR2YXJzKCRwdG4sJHZpZXcsbGF0ZW5jeV9zZGMpCiAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkcHRuLGxhdGVuY3lfc2RjKV19IHsKICAgICAgICAgICAgICAgc2V0IGxhdGVuY3koJHZpZXcsJHB0bikgJHZhcnMoJHB0bixsYXRlbmN5X3NkYykKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGxhdGVuY3koJHZpZXcsJHB0bikgIm5vbmUiCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBmb3JlYWNoIHZpZXcgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cyldIHsKICAgICAgICAgZm9yZWFjaCBwdG4gJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYgeyRsYXRlbmN5KCR2aWV3LCRwdG4pICE9ICJub25lIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0UHRuVXNlckNuc0ZpbGUgLXZpZXcgJHZpZXcgLWZpbGVOYW1lICRsYXRlbmN5KCR2aWV3LCRwdG4pIC1wdG5OYW1lICRwdG5cbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0geyAgICAgIAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3B0bl91c2VyX2Nuc19maWxlICRjb21tYW5kXQogICAgICB9CgogICAgICBpZiB7KFtsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTApICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic291cmNlICRtbW1jX2ZpbGVcbiIKICAgICAgfQogICAgICBpZiB7JHZhcnMoZmxvdykgPT0gIm1tbWMifSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmRlcmF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBMb2FkICJwb3N0IGFzc2VtYmxlX2ZsZXhpbG0iIHBsdWctaW4gc2NyaXB0CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9mbGV4aWxtIDBdCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgU3BlY2lmeSBJTE1zIGlmIGRlZmluZWQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBpZiB7JHZhcnMoaWxtKX0gewogICAgICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBTUEVDSUZZSU5HIElMTXNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIH0KICAgICAgICAgc2V0IGNvbW1hbmQgIiIgCiAgICAgICAgIGZvcmVhY2ggY2VsbCAkdmFycyhpbG1fbGlzdCkgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGNlbGwsaWxtX2RpcildICYmIFtmaWxlIGlzZGlyZWN0b3J5ICR2YXJzKCRjZWxsLGlsbV9kaXIpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic3BlY2lmeUlsbSAtY2VsbCAkY2VsbCAtZGlyICR2YXJzKCRjZWxsLGlsbV9kaXIpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gV0FSTklORzogSUxNIERJUkVDVE9SWSBNSVNTSU5HIEZPUiAkY2VsbCAuLi4gU0tJUFBJTkciCiAgICAgICAgICAgIH0KICAgICAgICAgfSAKICAKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNwZWNpZnlfaWxtICRjb21tYW5kXQogIAogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWxtX25vbl9zZGNfZmlsZSldfSB7CiAgICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAibG9hZFRpbWluZ0NvbiAtaWxtTm9uU2RjRmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0SWxtTm9uU2RjQ29uc3RyYWludEZpbGUgJHZhcnMoaWxtX25vbl9zZGNfZmlsZSlcbiIKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9pbG1fbm9uX3NkY19maWxlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE0fSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9OT1ZVUzo6bG9hZF9wb3dlcl9pbnRlbnRdCiAgICAgIH0KCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8PSAxMH0gewogICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjppbml0aWFsaXplX3RpbWluZyBtbW1jXQogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5pdGlhbGl6ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KICAgICAgfQoKIyAgICAgIGlmIHshJHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiMgICAgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjp1cGRhdGVfdGltaW5nIG1tbWMgXQojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV90aW1pbmcgJGNvbW1hbmRdCiMgICAgICB9CgogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBmb3JlYWNoIG5hbWUgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldFB0blBpblN0YXR1cyAtY2VsbCAkbmFtZSAtcGluICogLXN0YXR1cyBwbGFjZWRcbiIKICAgICAgfSAKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wdG5fcGluX3N0YXR1cyAkY29tbWFuZF0KICAgICAgc2V0IGNvbW1hbmQgImRiRGVsZXRlVHJpYWxSb3V0ZVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZGVsZXRlX3RyaWFsX3JvdXRlICRjb21tYW5kXQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICBzZXQgY29tbWFuZCAic2V0VHJpYWxSb3V0ZU1vZGUgLWhhbmRsZVBhcnRpdGlvbkNvbXBsZXggdHJ1ZSAtaG9ub3JQaW4gZmFsc2VcbiIKICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3RyaWFsX3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgc2V0IGNvbW1hbmQgInRyaWFsUm91dGVcbiIKICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdHJpYWxfcm91dGUgJGNvbW1hbmRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0IGNvbW1hbmQgInNldFJvdXRlTW9kZSAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yRmVuY2UgLiAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yUGluIHt9XG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgIHNldCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X2dsb2JhbF9yb3V0ZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgYXBwZW5kIGNvbW1hbmQgImNyZWF0ZUFjdGl2ZUxvZ2ljVmlldyAtdHlwZSBmbGF0VG9wXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJ0aW1lRGVzaWduIC1wcmVDVFMgLW91dERpciAkdmFycyhycHRfZGlyKSAtcHJlZml4IGFzc2VtYmxlX3ByZWN0c19mbGV4aWxtXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJjbGVhckFjdGl2ZUxvZ2ljVmlld1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2FjdGl2ZV9sb2dpY192aWV3ICRjb21tYW5kXQoKCiMgICAgICBhcHBlbmQgY29tbWFuZCAiZGVyaXZlVGltaW5nQnVkZ2V0IC1ub1RyaWFsSVBPIC1ub0NvbnN0YW50TW9kZWxcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJpdmVfdGltaW5nX2J1ZGdldCAkY29tbWFuZF0KCiMgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKIyAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiMgICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZURlc2lnbiAtY2VsbHZpZXcgeyR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgYnVkZ2V0fVxuIgojICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlT2FEZXNpZ24gJHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSBidWRnZXRcbiIKIyAgICAgICAgIH0KIyAgICAgIH0gZWxzZSB7CiMgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZURlc2lnbiAkdmFycyhkYnNfZGlyKS9idWRnZXQuZW5jIC1jb21wcmVzc1xuIgojICAgICAgfQojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNhdmVfZGVzaWduLGJ1ZGdldCAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBQYXJ0aXRpb24gYW5kIHNhdmUgdGhlIHBhcnRpdGlvbnMgaW50byB0aGUKICAgICAgIyBkaXJlY3RvcnkgUEFSVElUSU9OCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9wYXJ0aXRpb25fdGNsXQoKIyAgICAgIHNldCBjb21tYW5kICJzZXQgcHRuZ1B0blRpbWluZ0xpYkZvcm1hdCBsaWJcbnBhcnRpdGlvbiAtYnVpbGRTY2FuXG4iCiMgICAgICBzZXQgY29tbWFuZCAicGFydGl0aW9uIC1idWlsZFNjYW5cbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxwYXJ0aXRpb24gJGNvbW1hbmRdCiMgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewojICAgICAgICAgaWYgeyhbc3RyaW5nIGNvbXBhcmUgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTApfSB7CiMgICAgICAgICAgICBpZiB7JHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIxcGFzcyJ9IHsKIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlUGFydGl0aW9uIC1wdG5MaWIgJHZhcnMob2FfcGFydGl0aW9uX2xpYikgLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKVxuIgojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlUGFydGl0aW9uIC1wdG5MaWIgJHZhcnMob2FfcGFydGl0aW9uX2xpYikgLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKVxuIgojICAgICAgICAgICAgfQojICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgIGlmIHskdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjFwYXNzIn0gewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVQYXJ0aXRpb24gLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKSAtZGVmIC1zY2FuRGVmXG4iCiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVQYXJ0aXRpb24gLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKSAtZGVmIC1zY2FuRGVmXG4iCiMgICAgICAgICAgICB9CiMgICAgICAgICB9CiMgICAgICB9IGVsc2UgewojICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVQYXJ0aXRpb24gLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKSAtZGVmIC1zY2FuRGVmXG4iCiMgICAgICB9CiMgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2F2ZV9wYXJ0aXRpb24gJGNvbW1hbmRdCiMgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3BhcnRpdGlvbl90Y2xdCgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gR0VORVJBVElORyBSRVBPUlRTXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgaWYgeyR2YXJzKHJlcG9ydF9wb3dlcil9IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLXZpZXcgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wb3dlciAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfZG9tYWlucyldICYmIFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDF9IHsKCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBWZXJpZnkgcG93ZXIgZG9tYWluCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIHNldCBjb21tYW5kICJ2ZXJpZnlQb3dlckRvbWFpbiAtYmluZCAtZ2Nvbm4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWlzb05ldFBEICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmlzb25ldHMucnB0IgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC14TmV0UEQgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkueG5ldHMucnB0XG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdmVyaWZ5X3Bvd2VyX2RvbWFpbiAkY29tbWFuZF0KCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBSdW4gQ0xQCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIGlmIHskdmFycyhydW5fY2xwKSAmJiAoW2F1dG9fZXhlY29rIGxlY10gIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJydW5DTFAgIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xwX29wdGlvbnMpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkdmFycyhjbHBfb3B0aW9ucykKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxydW5fY2xwICRjb21tYW5kXQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNscF93YXJuaW5nKV19IHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBVTkFCTEUgVE8gUlVOIENMUCAuLi4gUExFQVNFIE1BS0UgU1VSRSBJVCBJUyBJTiBZT1VSIFBBVEgiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNscF93YXJuaW5nKSB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICAgICBzZXQgY29tbWFuZHMgIiIgCiAgICAgIH0KCiMgICAgICBpZiB7JHZhcnMobWFrZWZpbGUpfSB7IAogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHtcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhlYyAvYmluL3RvdWNoIFwkZW52KFZQQVRIKS8kdmFycyhzdGVwKVxuIgogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiMgICAgICAgfQoKIyAgICAgIGlmIHskdmFycyhlbmFibGVfZmxleGlsbSl9IHsKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBDb3B5IE1ha2VmaWxlcyBpbiBjYXNlIHRoZXkgZ2V0IGRlbGV0ZWQgZHVyaW5nIHRoZSBmbG93IC4uLlxuIgojICAgICAgICAgZm9yZWFjaCBwYXJ0IFtjb25jYXQgJHZhcnMoZGVzaWduKSAkdmFycyhwYXJ0aXRpb25fbGlzdCldIHsKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmlsZSBjb3B5IC1mb3JjZSAkdmFycyhzY3JpcHRfZGlyKS8kcGFydC5NYWtlZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kcGFydC9NYWtlZmlsZVxuIgojICAgICAgICAgfQojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXIpL01ha2VmaWxlICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpL01ha2VmaWxlXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvTWFrZWZpbGUucGFydGl0aW9uICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpL01ha2VmaWxlLnBhcnRpdGlvblxuIgojICAgICAgfQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX2ZsZXhpbG0ge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IHZhcnMoc3RlcCkgZmxleGlsbQogICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHZhcnMoc3RlcCkgJHZhcnMoc3RlcClcbiIKCiAgICAgIEZGX0VESTo6aW5pdGlhbGl6ZV9zdGVwIGZsZXhpbG0KCiMgICAgICBpZiB7JHZhcnMocmVwb3J0X3J1bl90aW1lKX0gewojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgdmFycygkdmFycyhzdGVwKSxzdGFydF90aW1lKSBcW2Nsb2NrIHNlY29uZHNcXVxuIgojICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgUkVTVE9SSU5HIERFU0lHTlxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgfQogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgTG9hZCAicHJlIGZsZXhpbG0iIHBsdWctaW4gc2NyaXB0CiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX2ZsZXhpbG1fdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFJlc3RvcmUgdGhlIGRlc2lnbgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIHNldCB2YXJzKGlsbSkgZmFsc2UKICAgICAgc2V0IGlsbV9saXN0IFtsaXN0XQogICAgICBzZXQgcGFjX2xpc3QgW2xpc3RdCiAgICAgIGlmIHskdmFycyhlbmFibGVfcGFjKX0gewogICAgICAgICBmb3JlYWNoIHBhcnQgJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwYXJ0LHBhY19tb2RlKV19ICB7CiAgICAgICAgICAgICAgIGlmIHskdmFycygkcGFydCxwYWNfbW9kZSkgPT0gImlsbSJ9IHsKICAgICAgICAgICAgICAgICAgbGFwcGVuZCBpbG1fbGlzdCAkcGFydAogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBsYXBwZW5kIHBhY19saXN0ICRwYXJ0CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGlsbV9saXN0KV0gJiYgKCR2YXJzKGlsbV9saXN0KSAhPSAiIil9IHsKICAgICAgICAgZm9yZWFjaCBpbG0gJHZhcnMoaWxtX2xpc3QpIHsKICAgICAgICAgICAgaWYgeyhbbHNlYXJjaCAkaWxtX2xpc3QgJGlsbV0gPT0gLTEpICYmIChbbHNlYXJjaCAkcGFjX2xpc3QgJGlsbV0gPT0gLTEpfSB7CiAgICAgICAgICAgICAgIGxhcHBlbmQgaWxtX2xpc3QgJGlsbQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JGlsbV9saXN0ICE9ICIifSB7CiAgICAgICAgIHNldCB2YXJzKGlsbSkgdHJ1ZSAKICAgICAgfQoKICAgICAgIyBCQ0w6IEFkZGVkIHRhaWwgb2Ygc3Vic3Qgb2YgdmFycyhkYnNfZGlyKQogICAgICAjIE5vdGUgLSBFRElGRiBIaWVyYXJjaGljYWwgZmxvdyBpcyBjdXJyZW50bHkgSU5DT01QQVRJQkxFIHdpdGggRkYgZGlyIHN0cnVjdHVyZQogICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBhcHBlYXJzIHRvIHJlbHkgb24gdmFycyhkYnNfZGlyKSBhbHdheXMgYmVpbmcgdW5kZXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKQogICAgICAjIFRoaXMgbmVlZHMgdG8gYmUgcmVjb25jaWxlZAogICAgICBzZXQgZGlyIFtmaWxlIHRhaWwgW3N1YnN0ICR2YXJzKGRic19kaXIpXV0KCiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgICAgIHNldCBtbW1jX2ZpbGUgJHZhcnMoc2NyaXB0X2RpcikvaW5jcl92aWV3X2RlZmluaXRpb24udGNsCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgICAgc2V0IG1tbWNfZmlsZSAkdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgbW1tY19maWxlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiMgICAgICBhcHBlbmQgY29tbWFuZHMgInNldExpbWl0ZWRBY2Nlc3NGZWF0dXJlIGVuY0ZsZXhJTE0gMVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnMoZGVzaWduKS8kdmFycyhkYnNfZGlyKS9wcmVjdHMuZW5jLmRhdC92aWV3RGVmaW5pdGlvbi50Y2xcbiIKCiAgICAgIHNldCBjd2QgW2V4ZWMgcHdkXQogICAgICBhcHBlbmQgY29tbWFuZHMgImNkICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKGRlc2lnbilcbiIKCiMgICAgICBzZXQgY29tbWFuZCAicmVzdG9yZURlc2lnbiAuICR2YXJzKGRlc2lnbilcbiIKICAgICAgc2V0IGNvbW1hbmQgInJlc3RvcmVEZXNpZ24gJHZhcnMoZGJzX2RpcikvcHJlY3RzLmVuYy5kYXQgJHZhcnMoZGVzaWduKVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgZmxleGlsbSxyZXN0b3JlX2Rlc2lnbiAkY29tbWFuZF0KCiMgICAgICBpZiB7KFtsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTApICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInNvdXJjZSAkbW1tY19maWxlXG4iCiMgICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIGFsd2F5c19zb3VyY2VfdGNsXQoKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIExvYWQgInBvc3QgZmxleGlsbSIgcGx1Zy1pbiBzY3JpcHQKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X2ZsZXhpbG0gMF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBTcGVjaWZ5IElMTXMgaWYgZGVmaW5lZAogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgIGlmIHskdmFycyhpbG0pfSB7CiAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIFNQRUNJRllJTkcgSUxNc1xuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiNcbiIKICAgICAgICAgfQogICAgICAgICBzZXQgY29tbWFuZCAiIiAKICAgICAgICAgZm9yZWFjaCBjZWxsICRpbG1fbGlzdCB7CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkY2VsbCxpbG1fZGlyKV0gJiYgW2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMoJGNlbGwsaWxtX2RpcildfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzcGVjaWZ5SWxtIC1jZWxsICRjZWxsIC1kaXIgJHZhcnMoJGNlbGwsaWxtX2RpcilcbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBJTE0gRElSRUNUT1JZIE1JU1NJTkcgRk9SICRjZWxsIC4uLiBTS0lQUElORyIKICAgICAgICAgICAgfQogICAgICAgICB9IAogIAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc3BlY2lmeV9pbG0gJGNvbW1hbmRdCiAgCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbG1fbm9uX3NkY19maWxlKV19IHsKICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDEwfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJsb2FkVGltaW5nQ29uIC1pbG1Ob25TZGNGaWxlICR2YXJzKGlsbV9ub25fc2RjX2ZpbGUpXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRJbG1Ob25TZGNDb25zdHJhaW50RmlsZSAkdmFycyhpbG1fbm9uX3NkY19maWxlKVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxsb2FkX2lsbV9ub25fc2RjX2ZpbGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTR9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OmxvYWRfcG93ZXJfaW50ZW50XQogICAgICB9IGVsc2UgewogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX05PVlVTOjpsb2FkX3Bvd2VyX2ludGVudF0KICAgICAgfQoKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldICYmICR2YXJzKGNwZl90aW1pbmcpfSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmluaXRpYWxpemVfdGltaW5nIG1tbWNdCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbml0aWFsaXplX3RpbWluZyAkY29tbWFuZF0KIyAgICAgIH0KCiMgICAgICBzZXQgY29tbWFuZCBbRkZfRURJOjp1cGRhdGVfdGltaW5nIG1tbWMgXQojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV90aW1pbmcgJGNvbW1hbmRdCgogICAgICBmb3JlYWNoIG1vZGUgW2NvbmNhdCAkdmFycyhhY3RpdmVfc2V0dXBfdmlld3MpICR2YXJzKGFjdGl2ZV9ob2xkX3ZpZXdzKV0gewojICAgICAgICAgZXhlYyAvYmluL3RvdWNoIGVtcHR5LnNkYwojICAgICAgICAgc2V0IGNvbW1hbmQgInVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJG1vZGUgLXNkY19maWxlcyBlbXB0eS5zZGMgLWlsbV9zZGNfZmlsZXMgXFtnZXRfY29uc3RyYWludF9tb2RlICRtb2RlIC1zZGNfZmlsZXNcXVxuIgogICAgICAgICBzZXQgY29tbWFuZCAidXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAtbmFtZSAkbW9kZSAtaWxtX3NkY19maWxlcyBcW2dldF9jb25zdHJhaW50X21vZGUgJG1vZGUgLXNkY19maWxlc1xdXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx1cGRhdGVfY29uc3RyYWludF9tb2RlICRjb21tYW5kXQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgImNkICRjd2RcbiIKCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X21vZHVsZV9tb2RlbCAtY2VsbCAkcGFydCBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiLXR5cGUgZmxleElsbSBcXFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiLWRpciAkdmFycyhwYXJ0aXRpb25fZGlyKS8kcGFydC8kcGFydC5mbGV4aWxtXG4iCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfbW9kdWxlX21vZGVsICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgImNvbW1pdF9tb2R1bGVfbW9kZWxcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNvbW1pdF9tb2R1bGVfbW9kZWwgJGNvbW1hbmRdCgogICAgICBzZXQgY29tbWFuZCAiIiAKICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRNb2R1bGVWaWV3IC1wYXJ0aXRpb24gJHBhcnQgLXR5cGUgaW50ZXJmYWNlXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9tb2R1bGVfdmlldyAkY29tbWFuZF0KCiAgICAgIHNldCBjb21tYW5kICJnZXRNb2R1bGVWaWV3XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxnZXRfbW9kdWxlX3ZpZXcgJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnMoZmxvdykgPT0gIm1tbWMifSB7CiAgICAgICAgIHNldCBjb21tYW5kIFtGRl9FREk6OmRlcmF0ZV90aW1pbmcgbW1tY10KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcmF0ZV90aW1pbmcgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICIiCiMgICAgICAgICBmb3JlYWNoIG1vZGUgJHZhcnMoY29uc3RyYWludF9tb2RlcykgewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgJG1vZGUgLXNkY19maWxlcyBcIiR2YXJzKCRtb2RlLHByZV9jdHNfc2RjKVwiXG4iICAgCiMgICAgICAgICB9CiMgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX2NvbnN0cmFpbnRfbW9kZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgI3NldF9hbmFseXNpc192aWV3IC1zZXR1cCBbYWxsX3NldHVwX2FuYWx5c2lzX3ZpZXdzXSAtaG9sZCBbYWxsX2hvbGRfYW5hbHlzaXNfdmlld3NdCiAgICAgICNQdXRzICI8RkY+IFNFVFVQIC0+IFthbGxfc2V0dXBfYW5hbHlzaXNfdmlld3NdIiAKICAgICAgI1B1dHMgIjxGRj4gSE9MRCAtPiBbYWxsX2hvbGRfYW5hbHlzaXNfdmlld3NdIiAKCiAgICAgIHNldCBjb21tYW5kICJjcmVhdGVBY3RpdmVMb2dpY1ZpZXcgLXR5cGUgdG9wQ3JpdGljYWwgLXByZUNUU1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX2FjdGl2ZV9sb2dpY192aWV3ICRjb21tYW5kXQogICAgICBzZXQgY29tbWFuZCAic2V0SGllck1vZGUgLW9wdFN0YWdlIHByZUNUU1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2hpZXJfbW9kZSAkY29tbWFuZF0KICAgICAgc2V0IGNvbW1hbmQgInNldE9wdE1vZGUgLWFkZEluc3RhbmNlUHJlRml4IEZsZXhJTE1JXyAtYWRkTmV0UHJlRml4IEZsZXhJTE1OX1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X29wdF9tb2RlICRjb21tYW5kXQoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX2ZsZXhpbG1fdGNsIDBdCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGZvcmVhY2ggcGFydCAkcGFjX2xpc3QgewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IGhpbnN0IFxbZGJISW5zdE5hbWUgXFtkYkNlbGxISW5zdCBcW2RiR2V0Q2VsbEJ5TmFtZSAkcGFydFxdXF1cXVxuIgogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHBhcnQscGFjX21vZGUpXX0gewogICAgICAgICAgICBpZiB7JHZhcnMoJHBhcnQscGFjX21vZGUpID09ICJyZWFkX29ubHkifSB7IHNldCB2YXJzKCRwYXJ0LHBhY19tb2RlKSAicmVhZE9ubHkiIH0KICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldE1vZHVsZVZpZXcgLWhpbnN0IFwkaGluc3QgLXR5cGUgJHZhcnMoJHBhcnQscGFjX21vZGUpXG4iCiAgICAgICAgIH0gCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kICJnZXRNb2R1bGVWaWV3XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfbW9kdWxlX3ZpZXcgJGNvbW1hbmRdCgogICAgICBpZiB7JHZhcnModmVyYm9zZSl9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyBSVU5OSU5HIEZMRVhJTE0gT1BUSU1JWkFUSU9OXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiI1xuIgogICAgICB9CiAgICAgIHNldCBjb21tYW5kICJvcHREZXNpZ24gLXByZUNUUyAtb3V0RGlyICR2YXJzKHJwdF9kaXIpIC1wcmVmaXggZmxleGlsbVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksb3B0X2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfZmxleGlsbV90Y2wgMF0KCiMgICAgICBzZXQgY29tbWFuZCAic2V0VHJpYWxSb3V0ZU1vZGUgLWhhbmRsZVBhcnRpdGlvbkNvbXBsZXggdHJ1ZSAtaG9ub3JQaW4gdHJ1ZVxuIgojICAgICAgYXBwZW5kIGNvbW1hbmQgInRyaWFsUm91dGVcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kICJkZXJpdmVUaW1pbmdCdWRnZXQgLW5vQ29uc3RhbnRNb2RlbFxuIgojICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGRlcml2ZV90aW1pbmdfYnVkZ2V0ICRjb21tYW5kXQoKICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlRGVzaWduIC1jZWxsdmlldyB7JHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSBmbGV4aWxtfVxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZU9hRGVzaWduICR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgZmxleGlsbVxuIgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzYXZlRGVzaWduICR2YXJzKGRic19kaXIpL2ZsZXhpbG0uZW5jIC1jb21wcmVzc1xuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzYXZlX2Rlc2lnbiAkY29tbWFuZF0KCiAgICAgIHNldCBjb21tYW5kICJjbGVhckFjdGl2ZUxvZ2ljVmlld1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY2xlYXJfYWN0aXZlX2xvZ2ljX3ZpZXcgJGNvbW1hbmRdCgojIyMgc2F2ZSBwb3N0T3B0IGRhdGEgYW5kIGNvbW1pdCBFQ08gIyMjCgojICAgICAgc2V0IGNvbW1hbmQgInVwZGF0ZV9wYXJ0aXRpb24gLWZsZXhJbG1FQ08gXFxcbiIKIyAgICAgIGFwcGVuZCBjb21tYW5kICIgICAgLWdvbGRlbkRpciAkdmFycyhwYXJ0aXRpb25fZGlyKSBcXFxuIgojICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAtZmxleElsbURpciAkdmFycyhwYXJ0aXRpb25fZGlyKV9GTEVYSUxNXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdXBkYXRlX3BhcnRpdGlvbiAkY29tbWFuZF0KCiAgICAgIHNldCBjb21tYW5kICJ1cGRhdGVfcGFydGl0aW9uIC1mbGV4SWxtRUNPIFxcXG4iCiAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgeyAKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAtZ29sZGVuQmxvY2tEaXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHBhcnQvJHZhcnMoZGJzX2RpcikvcHJlY3RzLmVuYy5kYXQgXFxcbiIKICAgICAgfSAKICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgICAtZmxleElsbURpciAkdmFycyhwYXJ0aXRpb25fZGlyKV9GTEVYSUxNXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx1cGRhdGVfcGFydGl0aW9uICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgInJlcG9ydF9yZXNvdXJjZSAtZW5kIG9wdF9mbGV4SWxtXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZXBvcnRfcmVzb3VyY2UgJGNvbW1hbmRdCgogICAgICBhcHBlbmQgY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxGRj4gR0VORVJBVElORyBSRVBPUlRTXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoKICAgICAgaWYgeyR2YXJzKHJlcG9ydF9wb3dlcil9IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX2FuYWx5c2lzX3ZpZXcpXSAmJiAoJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLXZpZXcgJHZhcnMocG93ZXJfYW5hbHlzaXNfdmlldykgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcG93ZXIgLW91dGZpbGUgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkucG93ZXIucnB0XG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wb3dlciAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfZG9tYWlucyldICYmIFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDF9IHsKCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBWZXJpZnkgcG93ZXIgZG9tYWluCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIHNldCBjb21tYW5kICJ2ZXJpZnlQb3dlckRvbWFpbiAtYmluZCAtZ2Nvbm4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWlzb05ldFBEICR2YXJzKHJwdF9kaXIpLyR2YXJzKHN0ZXApLmlzb25ldHMucnB0IgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC14TmV0UEQgJHZhcnMocnB0X2RpcikvJHZhcnMoc3RlcCkueG5ldHMucnB0XG4iCgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdmVyaWZ5X3Bvd2VyX2RvbWFpbiAkY29tbWFuZF0KCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgIyBSdW4gQ0xQCiAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIGlmIHskdmFycyhydW5fY2xwKSAmJiAoW2F1dG9fZXhlY29rIGxlY10gIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJydW5DTFAgIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2xwX29wdGlvbnMpXX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAkdmFycyhjbHBfb3B0aW9ucykKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxydW5fY2xwICRjb21tYW5kXQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNscF93YXJuaW5nKV19IHsKICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HOiBVTkFCTEUgVE8gUlVOIENMUCAuLi4gUExFQVNFIE1BS0UgU1VSRSBJVCBJUyBJTiBZT1VSIFBBVEgiCiAgICAgICAgICAgICAgIHNldCB2YXJzKGNscF93YXJuaW5nKSB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICAgICBzZXQgY29tbWFuZHMgIiIgCiAgICAgIH0KCiMgICAgICBpZiB7JHZhcnMobWFrZWZpbGUpfSB7IAogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJpZiB7XFtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXF19IHtcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IG9wIFxbb3BlbiAkZW52KFZQQVRIKS9mbGV4aWxtIHdcXVxuIgogICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCRvcCBcInNldCB2YXJzKCRwYXJ0LGNkdHYpIFwkOjpSZGFfQ0RUVjo6aWxtRGF0YUluZm8oJHBhcnQsYmxvY2tEaXIpXCJcbiIKICAgICAgICAgIH0KICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiY2xvc2UgXCRvcFxuIgojICAgICAgICAgIGZvcmVhY2ggcGFydCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewojICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmlsZSBjb3B5IC1mb3JjZSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kcGFydC9NYWtlZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kcGFydC5NYWtlZmlsZVxuIgojICAgICAgICAgIH0KCiAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImV4ZWMgL2Jpbi90b3VjaCBcJGVudihWUEFUSCkvJHZhcnMoc3RlcClcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgojICAgICAgIH0KCgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KICAgfQoKICAgcHJvYyBydW5fcGFydGl0aW9uX3BsYWNlIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCgogICAgICBzZXQgdmFycyhzdGVwKSBwYXJ0aXRpb25fcGxhY2UKICAgICAgc2V0IHZhcnMoaGllcikgdHJ1ZQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModGltZV9kZXNpZ25fb3B0aW9ucyxzZXR1cCldfSB7CiAgICAgICAgIHNldCB0bXBfdGltZV9kZXNpZ25fb3B0aW9uc19zZXR1cCAkdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgdmFycyh0aW1lX2Rlc2lnbl9vcHRpb25zLHNldHVwKSAiIgogICAgICB9CgogICAgICBzZXQgY29tbWFuZHMgIiIKCiAgICAgIGlmIHshJHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgIyBJbml0aWFsaXNlIHRoZSBkZXNpZ24gaWYgbm90IHVzaW5nIGZsZXhtb2RlbHMgCiAgICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7IAogICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjpydW5faW5pdCAkZm9ybWF0XQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgRkZfRURJOjpydW5faW5pdCAkZm9ybWF0CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7JHZhcnModXNlX3Byb3RvX25ldF9kZWxheV9tb2RlbCl9IHsKICAgICAgICAgaWYgeyEkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImNhdGNoIHtleGVjIHJtIC1yZiBwcm90b19tb2RlbF9CQUNLVVB9XG5jYXRjaCB7ZXhlYyBtdiAtZiBwcm90b19tb2RlbCBwcm90b19tb2RlbF9CQUNLVVB9XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxwcm90b19tb2RlbF9CQUNLVVAgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfcHNfcGVyX21pY3Jvbl9tb2RlbFxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX3BzX3Blcl9taWNyb25fbW9kZWwgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVEZXNpZ24gLXByb3RvIC1wcmVQbGFjZSAtcHJlZml4IHByZXBsYWNlIC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRpbWVfZGVzaWduICRjb21tYW5kXQogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgY29tbWFuZCAidGltZURlc2lnbiAtcHJlUGxhY2UgLXByZWZpeCBwcmVwbGFjZSAtb3V0RGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0aW1lX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgfQogICAgIAogICAgICBpZiB7JHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcHJvdG9fbW9kZWwgLWNyZWF0ZWRcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wcm90b19tb2RlbCAkY29tbWFuZF0KICAgICAgfQogICAgICAKICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlRGVzaWduIC1jZWxsdmlldyB7JHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSBpbml0fVxuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZU9hRGVzaWduICR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgaW5pdFxuIgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIHsoJHZhcnMoc3RlcCkgIT0gInBhcnRpdGlvbl9wbGFjZSIpfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlRGVzaWduICR2YXJzKGRic19kaXIpL2luaXQuZW5jIC1jb21wcmVzc1xuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiIgogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzYXZlX2Rlc2lnbixpbml0ICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgIyBBZGRpdGlvbmFsIHRpbWluZyBzZXR1cAogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoZGVzaWduKSxsYXRlbmN5X3NkYyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJmb3JlYWNoIG1vZGUgXFthbGxfY29uc3RyYWludF9tb2RlcyAtYWN0aXZlXF0ge1xuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0IHNkY19maWxlcyBcW2dldF9jb25zdHJhaW50X21vZGUgXCRtb2RlIC1zZGNfZmlsZXNcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0IHNkY19saXN0IFxbY29uY2F0IFwkc2RjX2ZpbGVzICR2YXJzKCR2YXJzKGRlc2lnbiksbGF0ZW5jeV9zZGMpXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIHVwZGF0ZV9jb25zdHJhaW50X21vZGUgLW5hbWUgXCRtb2RlIC1zZGNfZmlsZXMgXCRzZGNfbGlzdFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVwZGF0ZV9jb25zdHJhaW50X21vZGUgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGZvcmVhY2ggdmlldyBbY29uY2F0ICR2YXJzKHNldHVwX2FuYWx5c2lzX3ZpZXdzKSAkdmFycyhob2xkX2FuYWx5c2lzX3ZpZXdzKV0gewogICAgICAgICBmb3JlYWNoIHB0biAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHB0biwkdmlldyxsYXRlbmN5X3NkYyldfSB7CiAgICAgICAgICAgICAgIHNldCBsYXRlbmN5KCR2aWV3LCRwdG4pICR2YXJzKCRwdG4sJHZpZXcsbGF0ZW5jeV9zZGMpCiAgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycygkcHRuLGxhdGVuY3lfc2RjKV19IHsKICAgICAgICAgICAgICAgc2V0IGxhdGVuY3koJHZpZXcsJHB0bikgJHZhcnMoJHB0bixsYXRlbmN5X3NkYykKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGxhdGVuY3koJHZpZXcsJHB0bikgIm5vbmUiCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBzZXQgY29tbWFuZCAiIgogICAgICBmb3JlYWNoIHZpZXcgW2NvbmNhdCAkdmFycyhzZXR1cF9hbmFseXNpc192aWV3cykgJHZhcnMoaG9sZF9hbmFseXNpc192aWV3cyldIHsKICAgICAgICAgZm9yZWFjaCBwdG4gJHZhcnMocGFydGl0aW9uX2xpc3QpIHsKICAgICAgICAgICAgaWYgeyRsYXRlbmN5KCR2aWV3LCRwdG4pICE9ICJub25lIn0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0UHRuVXNlckNuc0ZpbGUgLXZpZXcgJHZpZXcgLWZpbGVOYW1lICRsYXRlbmN5KCR2aWV3LCRwdG4pIC1wdG5OYW1lICRwdG5cbiIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIHskY29tbWFuZCAhPSAiIn0geyAgICAgIAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3B0bl91c2VyX2Nuc19maWxlICRjb21tYW5kXQogICAgICB9CgogICAgICAjIEluc2VydCBmZWVkdGhyb3VnaCBhbmQgdHJpYWwgcm91dGUsIGFzIGFwcHJvcHJpYXRlCiAgICAgIHNldCBkb190cmlhbF9yb3V0ZV90aW1lX2Rlc2lnbiAxCgogICAgICAjIFByZS1wbGFjZW1lbnQKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBsYWNlLHNldF9wbGFjZV9tb2RlLHNraXApXX0gewogICAgICAgICBzZXQgY2FjaGVfc2tpcF9wbGFjZV9tb2RlICR2YXJzKHBsYWNlLHNldF9wbGFjZV9tb2RlLHNraXApCiAgICAgIH0KICAgICAgc2V0IHZhcnMocGxhY2Usc2V0X3BsYWNlX21vZGUsc2tpcCkgMQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGxhY2UscGxhY2VfZGVzaWduLHNraXApXX0gewogICAgICAgICBzZXQgY2FjaGVfc2tpcF9wbGFjZV9kZXNpZ24gJHZhcnMocGxhY2UscGxhY2VfZGVzaWduLHNraXApCiAgICAgIH0KICAgICAgc2V0IHZhcnMocGxhY2UscGxhY2VfZGVzaWduLHNraXApIDEKCiAgICAgIGFwcGVuZCBjb21tYW5kICJpZiB7XFtkYkdldCAtZSB0b3AucHRucy5jbG9uZXNcXSAhPSBcIlwifSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICIgICBhbGlnblB0bkNsb25lXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJ9XG4iIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksYWxpZ25fcGFydGl0aW9uX2Nsb25lICRjb21tYW5kXQoKICAgICAgc2V0IHZhcnMoaGllcl9jYXNlKSAiJHZhcnModXNlX2ZsZXhtb2RlbHMpJHZhcnMocGxhY2VtZW50X2Jhc2VkX3B0bikkdmFycyhhYnV0dGVkX2Rlc2lnbikkdmFycyhpbnNlcnRfZmVlZHRocm91Z2gpIgoKICAgICAgIyBEaXNhYmxlIHNjYW4gcmVvcmRlciBmb3IgcGFydGl0aW9uaW5nIGZsb3cKICAgICAgIyBzZXQgY29tbWFuZCAic2V0UGxhY2VNb2RlIC1yZW9yZGVyU2NhbiBmYWxzZVxuIgogICAgICAjIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KCiAgICAgIHN3aXRjaCAkdmFycyhoaWVyX2Nhc2UpIHsKICAgICAgICAgIjAwMDAiIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9ucmdyKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVzaWduTW9kZSAtdXNlVHVyYm9OUkdSRmxvdyB0cnVlXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiMDAwMSIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZXNpZ25Nb2RlIC11c2VUdXJib05SR1JGbG93IHRydWVcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9kZXNpZ25fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0UGxhY2VNb2RlIC1wbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0byAtcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgdHJ1ZSAtcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgIjAwMTAiIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9ucmdyKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVzaWduTW9kZSAtdXNlVHVyYm9OUkdSRmxvdyB0cnVlXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFBsYWNlTW9kZSAtcGxhY2VfZ2xvYmFsX2NvbmdfZWZmb3J0IGF1dG8gLXBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWUgLXBsYWNlX2dsb2JhbF9wbGFjZV9pb19waW5zIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIwMDExIiB7CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfbnJncil9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXVzZVR1cmJvTlJHUkZsb3cgdHJ1ZVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Rlc2lnbl9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIC1wbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAiMDEwMCIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZXNpZ25Nb2RlIC11c2VUdXJib05SR1JGbG93IHRydWVcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9kZXNpZ25fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0UGxhY2VNb2RlIC1wbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0byAtcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgdHJ1ZSAtcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMgdHJ1ZSAtZnAgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgICAgIjAxMDEiIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9ucmdyKX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVzaWduTW9kZSAtdXNlVHVyYm9OUkdSRmxvdyB0cnVlXG4iCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFBsYWNlTW9kZSAtcGxhY2VfZ2xvYmFsX2NvbmdfZWZmb3J0IGF1dG8gLXBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWUgLXBsYWNlX2dsb2JhbF9wbGFjZV9pb19waW5zIHRydWUgLWZwIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIwMTEwIiB7CiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfbnJncil9IHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXVzZVR1cmJvTlJHUkZsb3cgdHJ1ZVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Rlc2lnbl9tb2RlICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIC1wbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlIC1mcCB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgfQogICAgICAgICAiMDExMSIgewogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX25yZ3IpfSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZXNpZ25Nb2RlIC11c2VUdXJib05SR1JGbG93IHRydWVcbiIKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9kZXNpZ25fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0UGxhY2VNb2RlIC1wbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0byAtcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgdHJ1ZSAtcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMgdHJ1ZSAtZnAgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgCiAgICAgICAgICIxMDAwIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIC1wbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlIFxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIGlmIHshJHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgLXR5cGUgc29mdF9ndWlkZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGUgLXBsYWNlX2VmZm9ydCBkZWZhdWx0XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1mbG9vcnBsYW5Nb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIxMDAxIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIC1wbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlIFxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIGlmIHshJHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgLXR5cGUgc29mdF9ndWlkZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGUgLXBsYWNlX2VmZm9ydCBkZWZhdWx0XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1mbG9vcnBsYW5Nb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIxMDEwIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIC1wbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlIFxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIGlmIHshJHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgLXR5cGUgc29mdF9ndWlkZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGUgLXBsYWNlX2VmZm9ydCBkZWZhdWx0XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1mbG9vcnBsYW5Nb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIxMDExIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIC1wbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlIFxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIGlmIHshJHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgLXR5cGUgc29mdF9ndWlkZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGUgLXBsYWNlX2VmZm9ydCBkZWZhdWx0XG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1mbG9vcnBsYW5Nb2RlIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIxMTAwIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIC1wbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlIC1mcCB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgaWYgeyEkdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAtdHlwZSBzb2Z0X2d1aWRlXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wcm90b19tb2RlbF9waHlzaWNhbF9jb25zdHJhaW50ICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgIjExMDEiIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFBsYWNlTW9kZSAtcGxhY2VfZ2xvYmFsX2NvbmdfZWZmb3J0IGF1dG8gLXBsYWNlX2dsb2JhbF9jbG9ja19nYXRlX2F3YXJlIHRydWUgLXBsYWNlX2dsb2JhbF9wbGFjZV9pb19waW5zIHRydWUgLWZwIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wbGFjZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBpZiB7ISR2YXJzKGZsZXhtb2RlbF9hc19wdG4pfSB7CiAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlbF9waHlzaWNhbF9jb25zdHJhaW50IC10eXBlIHNvZnRfZ3VpZGVcbiIKICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgJGNvbW1hbmRdCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiMTExMCIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0UGxhY2VNb2RlIC1wbGFjZV9nbG9iYWxfY29uZ19lZmZvcnQgYXV0byAtcGxhY2VfZ2xvYmFsX2Nsb2NrX2dhdGVfYXdhcmUgdHJ1ZSAtcGxhY2VfZ2xvYmFsX3BsYWNlX2lvX3BpbnMgdHJ1ZSAtZnAgdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3BsYWNlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIGlmIHshJHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX21vZGVsX3BoeXNpY2FsX2NvbnN0cmFpbnQgLXR5cGUgc29mdF9ndWlkZVxuIgogICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdHJpYWxfcm91dGVfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICIxMTExIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRQbGFjZU1vZGUgLXBsYWNlX2dsb2JhbF9jb25nX2VmZm9ydCBhdXRvIC1wbGFjZV9nbG9iYWxfY2xvY2tfZ2F0ZV9hd2FyZSB0cnVlIC1wbGFjZV9nbG9iYWxfcGxhY2VfaW9fcGlucyB0cnVlIC1mcCB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcGxhY2VfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgaWYgeyEkdmFycyhmbGV4bW9kZWxfYXNfcHRuKX0gewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fbW9kZWxfcGh5c2ljYWxfY29uc3RyYWludCAtdHlwZSBzb2Z0X2d1aWRlXG4iCiAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wcm90b19tb2RlbF9waHlzaWNhbF9jb25zdHJhaW50ICRjb21tYW5kXQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHVzZV9wcm90b19uZXRfZGVsYXlfbW9kZWwpfSB7ICAKICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlIC10aW1pbmdfbmV0X2RlbGF5X21vZGVsIHVzZV9hY3R1YWxfd2lyZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGVsICRjb21tYW5kXSAKICAgICAgfQoKICAgICAgIyBQbGFjZSBkZXNpZ24gCiAgCiAgICAgIHNldCBzYXZlICR2YXJzKHBsYWNlX29wdF9kZXNpZ24pCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0geyAKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRl9FREk6OnJ1bl9wbGFjZSAkZm9ybWF0XQogICAgICB9IGVsc2UgewogICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzIAogICAgICAgICBGRl9FREk6OnJ1bl9wbGFjZSAkZm9ybWF0CiAgICAgICAgIHNldCBjb21tYW5kcyAiIgogICAgICB9CiAgICAgIHNldCB2YXJzKHBsYWNlX29wdF9kZXNpZ24pICRzYXZlCgogICAgICBpZiB7W2luZm8gZXhpc3RzIGNhY2hlX3NraXBfcGxhY2VfbW9kZV19IHsgCiAgICAgICAgIHNldCB2YXJzKHBsYWNlLHNldF9wbGFjZV9tb2RlLHNraXApICRjYWNoZV9za2lwX3BsYWNlX21vZGUKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnMocGxhY2Usc2V0X3BsYWNlX21vZGUsc2tpcCkgZmFsc2UKICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIGNhY2hlX3NraXBfcGxhY2VfbW9kZV19IHsgCiAgICAgICAgIHNldCB2YXJzKHBsYWNlLHBsYWNlX2Rlc2lnbixza2lwKSAkY2FjaGVfc2tpcF9wbGFjZV9kZXNpZ24KICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnMocGxhY2UscGxhY2VfZGVzaWduLHNraXApIGZhbHNlCiAgICAgIH0KICAgCiAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgLW5vY2FzZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MH0gewogICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZURlc2lnbiAtY2VsbHZpZXcgeyR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgcGxhY2V9XG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlT2FEZXNpZ24gJHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSBwbGFjZVxuIgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzYXZlRGVzaWduICR2YXJzKGRic19kaXIpL3BsYWNlLmVuYyAtY29tcHJlc3NcbiIKICAgICAgfQogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2F2ZV9kZXNpZ24gJGNvbW1hbmRdCiAgIAogICAgICAjIFBvc3QtcGxhY2VtZW50CiAgICAgIHN3aXRjaCAkdmFycyhoaWVyX2Nhc2UpIHsKICAgICAgICAiMDAwMCIgewogICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1oYW5kbGVQYXJ0aXRpb25Db21wbGV4IHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdHJpYWxfcm91dGUgJGNvbW1hbmRdCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0Um91dGVNb2RlIC1lYXJseUdsb2JhbFJvdXRlUGFydGl0aW9uSG9ub3JGZW5jZSAuXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgImVhcmx5R2xvYmFsUm91dGVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X2dsb2JhbF9yb3V0ZSAkY29tbWFuZF0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIjAwMDEiIHsKICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJ0cmlhbFJvdXRlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0cmlhbF9yb3V0ZV8xICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAiaW5zZXJ0UHRuRmVlZHRocm91Z2ggLXJvdXRlQmFzZWQgLXNhdmVUb3BvRmlsZSB0b3BvLnR4dCAtbmV0TWFwcGluZyBuZXRtYXBwaW5nLnR4dCAtZG91YmxlQnVmZmVyXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbnNlcnRfcHRuX2ZlZWR0aHJvdWdoICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0VHJpYWxSb3V0ZU1vZGUgLWhhbmRsZVBhcnRpdGlvbkNvbXBsZXggdHJ1ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3RyaWFsX3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJ0cmlhbFJvdXRlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0cmlhbF9yb3V0ZV8yICRjb21tYW5kXQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImVhcmx5R2xvYmFsUm91dGVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X2dsb2JhbF9yb3V0ZV8xICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAiaW5zZXJ0UHRuRmVlZHRocm91Z2ggLXJvdXRlQmFzZWQgLXNhdmVUb3BvRmlsZSB0b3BvLnR4dCAtbmV0TWFwcGluZyBuZXRtYXBwaW5nLnR4dCAtZG91YmxlQnVmZmVyXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbnNlcnRfcHRuX2ZlZWR0aHJvdWdoICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0Um91dGVNb2RlIC1lYXJseUdsb2JhbFJvdXRlUGFydGl0aW9uSG9ub3JGZW5jZSAuXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcm91dGVfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgImVhcmx5R2xvYmFsUm91dGVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGVhcmx5X2dsb2JhbF9yb3V0ZV8yICRjb21tYW5kXQogICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgIjAwMTAiIHsKIyAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRUcmlhbFJvdXRlTW9kZSAtaGFuZGxlUGFydGl0aW9uQ29tcGxleCB0cnVlXG4iCiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3RyaWFsX3JvdXRlX21vZGUgJGNvbW1hbmRdCiMgICAgICAgICAgICBzZXQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlICRjb21tYW5kXQogICAgICAgIH0KICAgICAgICAiMDAxMSIgewogICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRyaWFsUm91dGVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlXzEgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJpbnNlcnRQdG5GZWVkdGhyb3VnaCAtcm91dGVCYXNlZCAtc2F2ZVRvcG9GaWxlIHRvcG8udHh0IC1uZXRNYXBwaW5nIG5ldG1hcHBpbmcudHh0IC1kb3VibGVCdWZmZXJcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluc2VydF9wdG5fZmVlZHRocm91Z2ggJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRUcmlhbFJvdXRlTW9kZSAtaGFuZGxlUGFydGl0aW9uQ29tcGxleCB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdHJpYWxfcm91dGVfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRyaWFsUm91dGVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlXzIgJGNvbW1hbmRdCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiZWFybHlHbG9iYWxSb3V0ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZWFybHlfZ2xvYmFsX3JvdXRlXzEgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJpbnNlcnRQdG5GZWVkdGhyb3VnaCAtcm91dGVCYXNlZCAtc2F2ZVRvcG9GaWxlIHRvcG8udHh0IC1uZXRNYXBwaW5nIG5ldG1hcHBpbmcudHh0IC1kb3VibGVCdWZmZXJcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGluc2VydF9wdG5fZmVlZHRocm91Z2ggJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRSb3V0ZU1vZGUgLWVhcmx5R2xvYmFsUm91dGVQYXJ0aXRpb25Ib25vckZlbmNlIC5cbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAiZWFybHlHbG9iYWxSb3V0ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksZWFybHlfZ2xvYmFsX3JvdXRlXzIgJGNvbW1hbmRdCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICIwMTAwIiB7CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidGltZURlc2lnbiAtcHJlY3RzIC1wcmVmaXggcGxhY2UgLW91dERpciAkdmFycyhycHRfZGlyKVxuIgojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRpbWVfZGVzaWduICRjb21tYW5kXQogICAgICAgIH0KICAgICAgICAiMDEwMSIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiaW5zZXJ0UHRuRmVlZHRocm91Z2ggLXNhdmVUb3BvRmlsZSB0b3BvLnR4dCAtbmV0TWFwcGluZyBuZXRtYXBwaW5nLnR4dCAtZG91YmxlQnVmZmVyXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxpbnNlcnRfcHRuX2ZlZWR0aHJvdWdoICRjb21tYW5kXQogICAgICAgIH0KICAgICAgICAiMDExMCIgewojICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInRpbWVEZXNpZ24gLXByZWN0cyAtcHJlZml4IHBsYWNlIC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSx0aW1lX2Rlc2lnbiAkY29tbWFuZF0KICAgICAgICB9CiAgICAgICAgIjAxMTEiIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImluc2VydFB0bkZlZWR0aHJvdWdoIC1zYXZlVG9wb0ZpbGUgdG9wby50eHQgLW5ldE1hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZUJ1ZmZlclxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICB9CiAgICAgICAgIjEwMDAiIHsKICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRUcmlhbFJvdXRlTW9kZSAtaGFuZGxlUGFydGl0aW9uQ29tcGxleCB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdHJpYWxfcm91dGVfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRyaWFsUm91dGVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlICRjb21tYW5kXQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFJvdXRlTW9kZSAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yRmVuY2UgLlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGUgJGNvbW1hbmRdCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICIxMDAxIiB7CiAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdHJpYWxfcm91dGVfMSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgImluc2VydFB0bkZlZWR0aHJvdWdoIC1yb3V0ZUJhc2VkIC1zYXZlVG9wb0ZpbGUgdG9wby50eHQgLW5ldE1hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZUJ1ZmZlclxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1oYW5kbGVQYXJ0aXRpb25Db21wbGV4IHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdHJpYWxfcm91dGVfMiAkY29tbWFuZF0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGVfMSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgImluc2VydFB0bkZlZWR0aHJvdWdoIC1yb3V0ZUJhc2VkIC1zYXZlVG9wb0ZpbGUgdG9wby50eHQgLW5ldE1hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZUJ1ZmZlclxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFJvdXRlTW9kZSAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yRmVuY2UgLlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGVfMiAkY29tbWFuZF0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIjEwMTAiIHsKICAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA8IDE2fSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRUcmlhbFJvdXRlTW9kZSAtaGFuZGxlUGFydGl0aW9uQ29tcGxleCB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdHJpYWxfcm91dGVfbW9kZSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInRyaWFsUm91dGVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlICRjb21tYW5kXQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFJvdXRlTW9kZSAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yRmVuY2UgLlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGUgJGNvbW1hbmRdCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICIxMDExIiB7CiAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNn0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdHJpYWxfcm91dGVfMSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgImluc2VydFB0bkZlZWR0aHJvdWdoIC1yb3V0ZUJhc2VkIC1zYXZlVG9wb0ZpbGUgdG9wby50eHQgLW5ldE1hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZUJ1ZmZlclxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1oYW5kbGVQYXJ0aXRpb25Db21wbGV4IHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF90cmlhbF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgICBzZXQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdHJpYWxfcm91dGVfMiAkY29tbWFuZF0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGVfMSAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgImluc2VydFB0bkZlZWR0aHJvdWdoIC1yb3V0ZUJhc2VkIC1zYXZlVG9wb0ZpbGUgdG9wby50eHQgLW5ldE1hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZUJ1ZmZlclxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldFJvdXRlTW9kZSAtZWFybHlHbG9iYWxSb3V0ZVBhcnRpdGlvbkhvbm9yRmVuY2UgLlxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3JvdXRlX21vZGUgJGNvbW1hbmRdCiAgICAgICAgICAgIHNldCBjb21tYW5kICJlYXJseUdsb2JhbFJvdXRlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGVfMiAkY29tbWFuZF0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIjExMDAiIHsKICAgICAgICB9CiAgICAgICAgIjExMDEiIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImluc2VydFB0bkZlZWR0aHJvdWdoIC1zYXZlVG9wb0ZpbGUgdG9wby50eHQgLW5ldE1hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZUJ1ZmZlclxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICB9CiAgICAgICAgIjExMTAiIHsKICAgICAgICAgICAgc2V0IGRvX3RyaWFsX3JvdXRlX3RpbWVfZGVzaWduIDAgICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgIjExMTEiIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgImluc2VydFB0bkZlZWR0aHJvdWdoIC1zYXZlVG9wb0ZpbGUgdG9wby50eHQgLW5ldE1hcHBpbmcgbmV0bWFwcGluZy50eHQgLWRvdWJsZUJ1ZmZlclxuIgogICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksaW5zZXJ0X3B0bl9mZWVkdGhyb3VnaCAkY29tbWFuZF0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgeyR2YXJzKHVzZV9wcm90b19uZXRfZGVsYXlfbW9kZWwpfSB7IAogICAgICAgIHNldCBjb21tYW5kICJ0aW1lRGVzaWduIC1wcm90byAtcHJlY3RzIC1wcmVmaXggcGxhY2UgLW91dERpciAkdmFycyhycHRfZGlyKVxuIgogICAgICB9IGVsc2UgewogICAgICAgIHNldCBjb21tYW5kICJ0aW1lRGVzaWduIC1wcmVjdHMgLXByZWZpeCBwbGFjZSAtb3V0RGlyICR2YXJzKHJwdF9kaXIpXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRpbWVfZGVzaWduICRjb21tYW5kXQoKCSAgIyBPdXRwdXQgb3IgcnVuIHRoZSBnZW5lcmF0ZWQgY29tbWFuZHMKCSAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CgkJIHJldHVybiAkY29tbWFuZHMKCSAgfSBlbHNlIHsKCQkgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKCSAgfQoKICAgfQoKICAgcHJvYyBydW5fYXNzaWduX3BpbiB7e2Zvcm1hdCAxfX0gewogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIHNldCB2YXJzKHN0ZXApIGFzc2lnbl9waW4KICAgICAgc2V0IHZhcnMoaGllcikgdHJ1ZQogICAgICBzZXQgY29tbWFuZHMgIiIKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBBc3NpZ24gcGFydGl0aW9uIHBpbnMgdmlhIHBsdWctaW4gYXMgdGhpcyB0aGUKICAgICAgIyBwaXRjaCwgZGVwdGgsIGFuZCBsYXllciB2YWx1ZXMgYXJlIGRlc2lnbiBzcGVjaWZpYwogICAgICAjIEFsc28sIHZlcmlmeSB0aGUgcGluIGFzc2lnbm1lbnQgYW5kIGZpeCB0aGVtCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHByZV9hc3NpZ25fcGluX3RjbF0KCiAgICAgIHNldCBjb21tYW5kICJhc3NpZ25QdG5QaW5cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGFzc2lnbl9wdG5fcGlucyAkY29tbWFuZF0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfYXNzaWduX3Bpbl90Y2xdCgogICAgICBzZXQgY29tbWFuZCAiY2hlY2tQaW5Bc3NpZ25tZW50IC1vdXRGaWxlIHBpbmNoZWNrLnJwdFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY2hlY2tfcGluX2Fzc2lnbm1lbnQgJGNvbW1hbmRdCgogICAgICBzZXQgY29tbWFuZCAicmVwb3J0VW5hbGlnbmVkTmV0cyAtcnB0RmlsZSAkdmFycyhycHRfZGlyKS91bmFsaWduZWQucnB0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxyZXBvcnRfdW5hbGlnbmVkX25ldHMgJGNvbW1hbmRdCgogICAgICBpZiB7IShbaW5mbyBleGlzdHMgdmFycyhwbGFjZW1lbnRfYmFzZWRfcHRuKV0gJiYgJHZhcnMocGxhY2VtZW50X2Jhc2VkX3B0bikpfSB7CiAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDwgMTZ9IHsKICAgICAgICAgIHNldCBjb21tYW5kICJzZXRUcmlhbFJvdXRlTW9kZSAtaG9ub3JQaW4gdHJ1ZSAtaGFuZGxlUGFydGl0aW9uQ29tcGxleCB0cnVlXG4iCiAgICAgICAgICBhcHBlbmQgY29tbWFuZCAidHJpYWxSb3V0ZVxuIgogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRyaWFsX3JvdXRlICRjb21tYW5kXQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZXQgY29tbWFuZCAic2V0Um91dGVNb2RlIC1lYXJseUdsb2JhbFJvdXRlUGFydGl0aW9uSG9ub3JGZW5jZSAuIC1lYXJseUdsb2JhbFJvdXRlUGFydGl0aW9uSG9ub3JQaW4gLlxuIgogICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9yb3V0ZV9tb2RlICRjb21tYW5kXQogICAgICAgICAgc2V0IGNvbW1hbmQgImVhcmx5R2xvYmFsUm91dGVcbiIKICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxlYXJseV9nbG9iYWxfcm91dGUgJGNvbW1hbmRdCiAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX21vZGVsX2dlbiB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgZW52CgogICAgICBzZXQgdmFycyhzdGVwKSBtb2RlbF9nZW4KICAgICAgc2V0IHZhcnMoaGllcikgdHJ1ZQogICAgICBzZXQgY29tbWFuZHMgIiIKCiAgICAgICMgSW5pdGlhbGlzZSB0aGUgZGVzaWduCiAgICAgIGlmIHskdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAjIEluaXRpYWxpc2UgdGhlIGRlc2lnbiBpZiBub3QgdXNpbmcgZmxleG1vZGVsIHByb3RvdHlwZQogICAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0geyAKICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGX0VESTo6cnVuX2luaXQgJGZvcm1hdF0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgIEZGX0VESTo6cnVuX2luaXQgJGZvcm1hdAogICAgICAgIH0KCiAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAtbm9jYXNlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wfSB7CiAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2F2ZURlc2lnbiAtY2VsbHZpZXcgeyR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgaW5pdH1cbiIKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlT2FEZXNpZ24gJHZhcnMob2FfZGVzaWduX2xpYikgJHZhcnMoZGVzaWduKSBpbml0XG4iCiAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVEZXNpZ24gJHZhcnMoZGJzX2RpcikvaW5pdC5lbmMgLWNvbXByZXNzXG4iCiAgICAgICAgfQogICAgICAKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNhdmVfZGVzaWduLGluaXQgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGlmIHskdmFycyh1c2VfcHJvdG9fbmV0X2RlbGF5X21vZGVsKSAmJiAkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgImNhdGNoIHtleGVjIHJtIC1yZiBwcm90b19tb2RlbF9CQUNLVVB9XG5jYXRjaCB7ZXhlYyBtdiAtZiBwcm90b19tb2RlbCBwcm90b19tb2RlbF9CQUNLVVB9XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxwcm90b19tb2RlbF9CQUNLVVAgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfcHNfcGVyX21pY3Jvbl9tb2RlbFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksY3JlYXRlX3BzX3Blcl9taWNyb25fbW9kZWwgJGNvbW1hbmRdCiMgICAgICAgICBzZXQgY29tbWFuZCAidGltZURlc2lnbiAtcHJvdG8gLXByZVBsYWNlIC1wcmVmaXggcHJlcGxhY2UgLW91dERpciAkdmFycyhycHRfZGlyKVxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRpbWVfZGVzaWduICRjb21tYW5kXQogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfbW9kZWxfZ2VuX3RjbF0KICAgICAgCiAgICAgIGlmIHskdmFycyhlbmFibGVfbnJncil9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXVzZVR1cmJvTlJHUkZsb3cgdHJ1ZVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X2Rlc2lnbl9tb2RlICRjb21tYW5kXQogICAgICB9CgogICAgICBzZXQgdmFycyhoaWVyX2Nhc2UpICIkdmFycyhmbGV4bW9kZWxfYXNfcHRuKSR2YXJzKGluc2VydF9mZWVkdGhyb3VnaCkiCgogICAgICBzd2l0Y2ggJHZhcnMoaGllcl9jYXNlKSB7CiAgICAgICAgICIwMCIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiaWRlbnRpZnlfcHJvdG9fbW9kZWxcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGlkZW50aWZ5X3Byb3RvX21vZGVsICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIwMSIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAiaWRlbnRpZnlfcHJvdG9fbW9kZWxcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGlkZW50aWZ5X3Byb3RvX21vZGVsICRjb21tYW5kXQogICAgICAgICB9CiAgICAgICAgICIxMCIgewogICAgICAgICAgICBzZXQgY29tbWFuZCAgInNldF9wcm90b19tb2RlIC1jcmVhdGVfcGFydGl0aW9uX2FzX2ZsZXhtb2RlbCB0cnVlXG4iCiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZSAkY29tbWFuZF0KIyAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldICYmICgkdmFycyhwYXJ0aXRpb25fbGlzdCkgIT0gIiIpfSB7CiMgICAgICAgICAgICAgICBmb3JlYWNoIHB0biAkdmFycyhwYXJ0aXRpb25fbGlzdCkgewojICAgICAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fbW9kZWwgLW1vZGVsICRwdG4gLXR5cGUgZmxleF9tb2R1bGVcbiIKIyAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX21vZGVsICRjb21tYW5kXQojICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBGbGV4bW9kZWwgcGFydGl0aW9uIGZsb3cgZW5hYmxlZCBidXQgbm8gcGFydGl0aW9ucyBhcmUgZGVmaW5lZCIKIyAgICAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiRmxleG1vZGVsIHBhcnRpdGlvbiBmbG93IGVuYWJsZWQgYnV0IG5vIHBhcnRpdGlvbnMgYXJlIGRlZmluZWQiCiMgICAgICAgICAgICAgICBpbmNyIHZhcnMoZXJyb3JfY291bnQpCiMgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgIjExIiB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICAic2V0X3Byb3RvX21vZGUgLWNyZWF0ZV9wYXJ0aXRpb25fYXNfZmxleG1vZGVsIHRydWVcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wcm90b19tb2RlICRjb21tYW5kXQojICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV0gJiYgKCR2YXJzKHBhcnRpdGlvbl9saXN0KSAhPSAiIil9IHsKIyAgICAgICAgICAgICAgIGZvcmVhY2ggcHRuICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiMgICAgICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlbCAtbW9kZWwgJHB0biAtdHlwZSBmbGV4X21vZHVsZVxuIgojICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfcHJvdG9fbW9kZWwgJGNvbW1hbmRdCiMgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IEZsZXhtb2RlbCBwYXJ0aXRpb24gZmxvdyBlbmFibGVkIGJ1dCBubyBwYXJ0aXRpb25zIGFyZSBkZWZpbmVkIgojICAgICAgICAgICAgICAgc2V0IGVycm9ycygkdmFycyhlcnJvcl9jb3VudCkpICJGbGV4bW9kZWwgcGFydGl0aW9uIGZsb3cgZW5hYmxlZCBidXQgbm8gcGFydGl0aW9ucyBhcmUgZGVmaW5lZCIKIyAgICAgICAgICAgICAgIGluY3IgdmFycyhlcnJvcl9jb3VudCkKIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0KICAgICAgfQoKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhtb2RlbF9nZW4sbWluX2luc3QpXX0gewojICAgICAgICAgc2V0IG1pbl9pbnN0ICR2YXJzKG1vZGVsX2dlbixtaW5faW5zdCkKIyAgICAgIH0gZWxzZSB7CiMgICAgICAgICBzZXQgbWluX2luc3QgMTAwMAojICAgICAgfQojICAgICAgc2V0IGNvbW1hbmQgInNldElsbU1vZGUgLWhpZ2hGYW5vdXRQb3J0IGZhbHNlXG4iCiMgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0SWxtTW9kZSAkY29tbWFuZF0KICAgICAKICAgICAgc2V0IGNvbW1hbmQgInNldElsbU1vZGUgLWtlZXBIaWdoRmFub3V0UG9ydHMgZmFsc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9pbG1fbW9kZSAkY29tbWFuZF0KICAgICAgaWYgeyR2YXJzKGZsZXhtb2RlbF9hcnRfYmFzZWQpfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJjcmVhdGVfcHJvdG9fbW9kZWwgLW91dF9kaXIgJHZhcnMoZGJzX2RpcikvbW9kZWxfZ2VuLmVuY1xuIgogICAgICB9IGVsc2UgewogICAgICAgICBzZXQgY29tbWFuZCAiY3JlYXRlX3Byb3RvX21vZGVsIC1wYXJ0aXRpb25fYmFzZWRcbmNvbW1pdF9wcm90b19tb2RlbFxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjcmVhdGVfcHJvdG9fbW9kZWwgJGNvbW1hbmRdCiAgICAgIGlmIHskdmFycyhjcmVhdGVfZmxleGZpbGxlcl9ibG9ja2FnZSl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgImNyZWF0ZV9mbGV4ZmlsbGVyX3JvdXRlX2Jsb2NrYWdlXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjcmVhdGVfZmxleGZpbGxlcl9yb3V0ZV9ibG9ja2FnZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcG9zdF9tb2RlbF9nZW5fdGNsXQoKICAgICAgaWYgeyR2YXJzKGNvZGVnZW4pfSB7CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQogICB9CgogICBwcm9jIHJ1bl9wcm90b3R5cGUge3tmb3JtYXQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKICAgICAgZ2xvYmFsIGVudgoKICAgICAgc2V0IHZhcnMoc3RlcCkgcHJvdG90eXBlCiAgICAgIHNldCB2YXJzKGhpZXIpIHRydWUKICAgICAgc2V0IGNvbW1hbmRzICIiCgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfcHJvdG90eXBlX3RjbF0KCiAgICAgIHNldCBjb21tYW5kICJyZXBvcnRfcHJvdG9fbW9kZWwgLWNyZWF0ZWRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcG9ydF9wcm90b19tb2RlbCAkY29tbWFuZF0KICAgICAgc2V0IGNvbW1hbmQgInVuZ3JvdXAgLXR5cGUgZmxleF9tb2RlbFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdW5ncm91cF9mbGV4aWxtXzEgJGNvbW1hbmRdCgogICAgICBzZXQgY29tbWFuZCAidGltZURlc2lnbiAtcHJvdG8gLXByZXBsYWNlIFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksdGltZV9kZXNpZ24gJGNvbW1hbmRdCiMgICAgICBzZXQgY29tbWFuZCAiZGVmaW5lUGFydGl0aW9uIC1wcm90byBbbGlzdCAkdmFycyhwYXJ0aXRpb25fbGlzdCldXG4iCiAgICAgIHNldCBjb21tYW5kICIiCiAgICAgIGZvcmVhY2ggcHRuICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJkZWZpbmVQYXJ0aXRpb24gLXByb3RvIFxbZGJHZXQgXFtkYkdldENlbGxCeU5hbWUgJHB0blxdLmhpbnN0Lm5hbWVcXVxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZWZpbmVfcGFydGl0aW9uICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b19tb2RlICAtcHJvdG9fZGVzaWduX2xldmVsICR2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGVfZmxvd19zdHlsZSlcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wcm90b19tb2RlICRjb21tYW5kXQogICAgICBzZXQgY29tbWFuZCAic2V0X3Byb3RvX2Rlc2lnbl9tb2RlIC1yZXNldFxuIgogICAgICBpZiB7JHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZV9jb25nZXN0aW9uX2F3YXJlKX0gewogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0X3Byb3RvX2Rlc2lnbl9tb2RlIC1jb25nZXN0aW9uX2F3YXJlIHRydWVcbiIKICAgICAgfQogICAgICBpZiB7JHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZV90aW1pbmdfYXdhcmUpfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRfcHJvdG9fZGVzaWduX21vZGUgLXRpbWluZ19hd2FyZSB0cnVlXG4iCiAgICAgIH0KCiMgRm9sbG93aW5nIDIgc2V0dGluZ3Mgd2lsbCBiZSByZW1vdmVkIAogICAgICBhcHBlbmQgY29tbWFuZCAic2V0X3Byb3RvX2Rlc2lnbl9tb2RlIC1uZXdfYWxnb3JpdGhtIHRydWVcbiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9wcm90b19kZXNpZ25fbW9kZSAtcmVwb3J0X3RpbWluZyBmYWxzZVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9wcm90b19kZXNpZ25fbW9kZSAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlX2Zsb3dfc3R5bGUpID09ICJ0b3BfdG9fYm90dG9tIn0gewojICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlX21heF9sZXZlbCldfSB7CiMgICAgICAgICAgICBzZXQgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlX21heF9sZXZlbCkgMQojICAgICAgICAgfQojICAgICAgICAgc2V0IGNvbW1hbmQgInNldCBtYXhfbGV2ZWwgJHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZV9tYXhfbGV2ZWwpXG4iCiAgICAgICAgIHNldCBjb21tYW5kICJzZXQgbWF4X2xldmVsIFxbZ2V0X2ZsZXhtb2RlbF9tYXhfbGV2ZWxcXVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0IGxldmVsIDBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIndoaWxlIHtcJGxldmVsIDwgXCRtYXhfbGV2ZWx9IHtcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9wcm90b19tb2RlIC1wYXJ0aXRpb25fbGV2ZWxfbnVtIFwkbGV2ZWxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInByb3RvX2Rlc2lnbiAtY29uc3RyYWludHMgJHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZV91c2VyX2NvbnRyYWludHMpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJjaGVja0ZQbGFuIC1vdXRGaWxlICR2YXJzKHJwdF9kaXIpL2NoZWNrX2ZwbGFuX3Byb3RvX2Rlc2lnbl9sZXZlbF9cJHtsZXZlbH0ucnB0ICBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInBsYWNlRGVzaWduIC1ub1ByZVBsYWNlT3B0XG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJ0aW1lRGVzaWduIC1wcm90byAtcHJlY3RzIC1wcmVmaXggIHByb3RvX2Rlc2lnbl9sZXZlbF9cJHtsZXZlbH0gLW91dERpciAkdmFycyhycHRfZGlyKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAibG9hZF90aW1pbmdfZGVidWdfcmVwb3J0IC1wcm90byBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImZpbGUgY29weSAtZm9yY2UgJHZhcnMocGx1Z19kaXIpL3Bvc3RfcHJvdG9fZGVzaWduX2xldmVsLnRjbCAucG9zdF9wcm90b19kZXNpZ25fbGV2ZWxfXCR7bGV2ZWx9LnRjbFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAic291cmNlIC5wb3N0X3Byb3RvX2Rlc2lnbl9sZXZlbF9cJHtsZXZlbH0udGNsXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJpbmNyIGxldmVsIDFcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIn1cbiIKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGNvbW1hbmQgInNldCBsZXZlbCAkdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlX2Zsb3dfc3R5bGUpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJwcm90b19kZXNpZ24gLWNvbnN0cmFpbnRzICR2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGVfdXNlcl9jb250cmFpbnRzKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAiY2hlY2tGUGxhbiAtb3V0RmlsZSAkdmFycyhycHRfZGlyKS9jaGVja19mcGxhbl9wcm90b19kZXNpZ25fbGV2ZWxfXCR7bGV2ZWx9LnJwdCAgXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJwbGFjZURlc2lnblxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAidGltZURlc2lnbiAtcHJvdG8gLXByZWN0cyAtcHJlZml4ICBwcm90b19kZXNpZ25fbGV2ZWxfXCR7bGV2ZWx9IC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgImxvYWRfdGltaW5nX2RlYnVnX3JlcG9ydCAtcHJvdG8gXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzb3VyY2UgJHZhcnMocGx1Z19kaXIpL3Bvc3RfcHJvdG9fZGVzaWduX2xldmVsLnRjbFxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxwcm90b19sb29wICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgInVuZ3JvdXAgLXR5cGUgZmxleF9tb2RlbCAtZGlzcGxheV9hbGxfY29uc3RyYWludHNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHVuZ3JvdXBfZmxleGlsbV8yICRjb21tYW5kXQoKICAgICAgc2V0IGNvbW1hbmQgInNldF9wcm90b190aW1pbmdfc2V0dGluZ3MgLXJlc2V0XG4iCiAgICAgIAogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjpzb3VyY2VfcGx1ZyBwb3N0X3Byb3RvdHlwZV90Y2xdCgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX3BhcnRpdGlvbiB7e2Zvcm1hdCAxfX0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwogICAgICBnbG9iYWwgZW52CgogICAgICBzZXQgdmFycyhzdGVwKSBwYXJ0aXRpb24KICAgICAgc2V0IHZhcnMoaGllcikgdHJ1ZQoKICAgICAgc2V0IGNvbW1hbmRzICIiCgogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICMgQnVkZ2V0IHRoZSBibG9ja3MgYmFzZWQgb24gdGhlIG1vZGUKICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgc2V0IGNvbW1hbmQgIiIKICAgICAgYXBwZW5kIGNvbW1hbmQgInNldF9nbG9iYWwgdGltaW5nX3N1cHBvcnRfaGllcmFyY2hpY2FsX3Bpbl9jb25zdHJhaW50cyB0cnVlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kICJzZXQgdGJnUHJpbnRFeGNlcHRpb25JbmZvSW5KdXN0aWZ5IDFcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9idWRnZXRfdmFycyAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyhidWRnZXRfbW9kZSkgPT0gInByb3RvX25ldF9kZWxheV9tb2RlbCIgJiYgJHZhcnModXNlX3Byb3RvX25ldF9kZWxheV9tb2RlbCl9IHsKICAgICAgICAgc2V0IGNvbW1hbmQgInRpbWVEZXNpZ24gLXByb3RvIC1wcmVmaXggYnVkZ2V0IC1vdXREaXIgJHZhcnMocnB0X2RpcilcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHRpbWVfZGVzaWduICRjb21tYW5kXQogICAgICB9CgogICAgICAjIERlZmluZSBidWRnZXRpbmcgb3B0aW9ucyAuLi4KICAgICAgc2V0IGNvbW1hbmQgIiIKCiAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRCdWRnZXRpbmdNb2RlIC13cml0ZUxhdGVuY3lQZXJDbG9jayB0cnVlXG4iCgogICAgICBhcHBlbmQgY29tbWFuZCAiaWYge1xbZGJHZXQgLWUgdG9wLnB0bnMuY2xvbmVzXF0gIT0gXCJcIn0ge1xuIgogICAgICBhcHBlbmQgY29tbWFuZCAiICAgc2V0QnVkZ2V0aW5nTW9kZSAtbWVyZ2VDbG9uZXMgdHJ1ZVxuIgogICAgICBhcHBlbmQgY29tbWFuZCAifVxuIgogICAgICAKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFidXR0ZWRfZGVzaWduKV0gJiYgJHZhcnMoYWJ1dHRlZF9kZXNpZ24pfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJzZXRCdWRnZXRpbmdNb2RlIC1hYnV0dGVkIHRydWVcbiIKICAgICAgfQogICAgICAKICAgICAgc3dpdGNoIFtzdHJpbmcgdG9sb3dlciAkdmFycyhidWRnZXRfbW9kZSldIHsKICAgICAgICAgZ2lnYV9vcHQgewogICAgICAgICAgICAgIyBUaGlzIGlzIGRlZmF1bHQgYmVoYXZpb3Igbm93CiMgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0QnVkZ2V0aW5nTW9kZSAtdmlydHVhbE9wdEVuZ2luZSBnaWdhT3B0XG4iCiAgICAgICAgIH0KICAgICAgICAgdHJpYWxfaXBvIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldEJ1ZGdldGluZ01vZGUgLXZpcnR1YWxPcHRFbmdpbmUgdHJpYWxJUE9cbiIKICAgICAgICAgfQogICAgICAgICBwcm90b19uZXRfZGVsYXlfbW9kZWwgewogICAgICAgICAgICBpZiB7JHZhcnModXNlX3Byb3RvX25ldF9kZWxheV9tb2RlbCl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldEJ1ZGdldGluZ01vZGUgLXZpcnR1YWxPcHRFbmdpbmUgbm9uZVxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQojICAgICAgYXBwZW5kIGNvbW1hbmQgInNldEJ1ZGdldGluZ01vZGUgLWVuYWJsZU1UQnVkZ2V0aW5nIHRydWVcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9idWRnZXRpbmdfbW9kZSAkY29tbWFuZF0KCiAgICAgIGlmIHsoW3N0cmluZyB0b2xvd2VyICR2YXJzKGJ1ZGdldF9tb2RlKV0gIT0gInByb3RvX25ldF9kZWxheV9tb2RlbCIpICYmICR2YXJzKHVzZV9wcm90b19uZXRfZGVsYXlfbW9kZWwpfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fdGltaW5nX3NldHRpbmdzIC1yZXNldFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX3RpbWluZ19zZXR0aW5ncyAkY29tbWFuZF0KICAgICAgfQogICAgICBzZXQgY29tbWFuZCAiZGVyaXZlVGltaW5nQnVkZ2V0IC1qdXN0aWZ5XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxkZXJpdmVfdGltaW5nX2J1ZGdldCAkY29tbWFuZF0KCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBSdW4gQ0xQCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgaWYge1tGRjo6aXNfbHBfZmxvd10gJiYgW2luZm8gZXhpc3RzIHZhcnMocG93ZXJfZG9tYWlucyldICYmIFtsbGVuZ3RoICR2YXJzKHBvd2VyX2RvbWFpbnMpXSA+IDF9IHsKICAgICAgICAgaWYgeyR2YXJzKHJ1bl9jbHApICYmIChbYXV0b19leGVjb2sgbGVjXSAhPSAiIil9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInJ1bkNMUCAiCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjbHBfb3B0aW9ucyldfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICR2YXJzKGNscF9vcHRpb25zKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJ1bl9jbHAgJGNvbW1hbmRdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHVzZV9mbGV4bW9kZWxzKSB8fCAkdmFycyhwbGFjZW1lbnRfYmFzZWRfcHRuKX0gewogICAgICAgICBzZXQgY29tbWFuZCAic2V0IG1heF9sYXllciBcW2dldFRyaWFsUm91dGVNb2RlIC1tYXhSb3V0ZUxheWVyXF1cbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldFBsYWNlTW9kZSAtcmVzZXQgIFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZCAic2V0VHJpYWxSb3V0ZU1vZGUgLXJlc2V0ICBcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgInNldFRyaWFsUm91dGVNb2RlIC1tYXhSb3V0ZUxheWVyIFwkbWF4X2xheWVyXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfdHJpYWxfcm91dGVfbW9kZSAkY29tbWFuZF0KICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHVzZV9wcm90b19uZXRfZGVsYXlfbW9kZWwpfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzZXRfcHJvdG9fdGltaW5nX3NldHRpbmdzIC1yZXNldFxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksc2V0X3Byb3RvX3RpbWluZ19zZXR0aW5ncyAkY29tbWFuZF0KICAgICAgfQogICAgICAgCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgIyBQYXJ0aXRpb24gYW5kIHNhdmUgdGhlIHBhcnRpdGlvbnMgaW50byB0aGUKICAgICAgIyBkaXJlY3RvcnkgUEFSVElUSU9OCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6c291cmNlX3BsdWcgcHJlX3BhcnRpdGlvbl90Y2xdCgoKIyAgICAgIHNldCBjb21tYW5kICJzZXQgcHRuZ1B0blRpbWluZ0xpYkZvcm1hdCBsaWJcbnBhcnRpdGlvbiAtYnVpbGRTY2FuXG4iCiAgICAgIHNldCBjb21tYW5kICJwYXJ0aXRpb24gLWJ1aWxkU2NhblxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCkscGFydGl0aW9uICRjb21tYW5kXQogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxMH0gewogICAgICAgICBpZiB7KFtzdHJpbmcgY29tcGFyZSAkdmFycyhkYnNfZm9ybWF0KSAib2EiXT09MCl9IHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNhdmVQYXJ0aXRpb24gLXB0bkxpYiAkdmFycyhvYV9wYXJ0aXRpb25fbGliKSAtZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpXG4iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kICJzYXZlUGFydGl0aW9uIC1kaXIgJHZhcnMocGFydGl0aW9uX2RpcikgLWRlZiAtc2NhbkRlZlxuIgogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kICJzYXZlUGFydGl0aW9uIC1kaXIgJHZhcnMocGFydGl0aW9uX2RpcikgLWRlZiAtc2NhbkRlZlxuIgogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzYXZlX3BhcnRpdGlvbiAkY29tbWFuZF0KCiAgICAgIGlmIHskdmFycyh1c2VfZmxleG1vZGVscykgJiYgJHZhcnMoZmxleG1vZGVsX2FzX3B0bil9IHsKIyAgICAgICAgIHNldCBjb21tYW5kICJyZXBsYWNlX3Byb3RvX21vZGVsIFxcXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLXByZV9mdF9kaXIgJHZhcnMoZWNvX2RpcikvcHJlX2Z0IFxcXG4iCiMgICAgICAgICBhcHBlbmQgY29tbWFuZCAiICAgLXBvc3RfZnRfZGlyICR2YXJzKGVjb19kaXIpL3Bvc3RfZnQgXFxcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtcHRuX2RpciAkdmFycyhwYXJ0aXRpb25fZGlyKSBcXFxuIgojICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1wdG5fZnVsbF9uZXRsaXN0X2RpciAuL3RlbXBfbmV0bGlzdF9kaXIgXFxcbiIKIyAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtb3V0X2RpciAkdmFycyhwYXJ0aXRpb25fZGlyKVxuIgoKICAgICAgICAgc2V0IGNvbW1hbmQgInJlcGxhY2VfcHJvdG9fbW9kZWwgXFxcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAgIC1wdG5fZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpIFxcXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAtb3V0X2RpciAkdmFycyhwYXJ0aXRpb25fZGlyKVxuIgoKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHJlcGxhY2VfcHJvdG9fbW9kZWwgJGNvbW1hbmRdCiAgICAgIH0KCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OnNvdXJjZV9wbHVnIHBvc3RfcGFydGl0aW9uX3RjbF0KCiAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgIHVwbGV2ZWwgIzAgZXZhbCAkY29tbWFuZHMKICAgICAgfQoKICAgICAgc2V0IHBhdGggW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9wYXRoKV0KICAgCiAgICAgIGZpbGUgbWtkaXIgJHZhcnMocGFydGl0aW9uX2RpcikKCiAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICR2YXJzKHBhcnRpdGlvbl9kaXIpL01ha2VmaWxlLnBhcnRpdGlvbl19IHsKICAgICAgICAgZmlsZSBjb3B5ICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvSU5OT1ZVUy9NYWtlZmlsZS5wYXJ0aXRpb24gJHZhcnMocGFydGl0aW9uX2RpcikKICAgICAgfQogICAgICBzZXQgb3AgW29wZW4gJHZhcnMocGFydGl0aW9uX2RpcikvTWFrZWZpbGUgd10KICAgICAgaWYgeyFbaW5mbyBleGlzdHMgZW52KFZQQVRIKV19IHsKICAgICAgICAgc2V0IGVudihWUEFUSCkgIm1ha2UiCiAgICAgIH0KICAgICAgcHV0cyAkb3AgIlZQQVRIPSRlbnYoVlBBVEgpIgogICAgICBwdXRzICRvcCAiQkxPQ0tTID0gJHZhcnMocGFydGl0aW9uX2xpc3QpIgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiaW5jbHVkZSBNYWtlZmlsZS5wYXJ0aXRpb24iCiAgICAgIGNsb3NlICRvcAogICAKICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHZhcnNdIHsKICAgICAgICAgc2V0IHN2YXJzKCR2YXIpICR2YXJzKCR2YXIpCiAgICAgIH0KICAgICAgc2V0IHZhcnMobW9kZSkgZmxhdAojICAgICAgc2V0IHZhcnMoaGllcikgdHJ1ZQogICAgICBzZXQgbGluayBbZmlsZSBub3JtYWxpemUgJHZhcnMoc2NyaXB0X3Jvb3QpXQogICAgICBmb3JlYWNoIGJsb2NrIFtjb25jYXQgJHZhcnMoZGVzaWduKSAkdmFycyhwYXJ0aXRpb25fbGlzdCldIHsKICAgICAgICAgZXhlYyBta2RpciAtcCAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2sKIyAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgLmZmLnRjbF19IHsKIyAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgLmZmLnRjbCAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2sKIyAgICAgICAgIH0KICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svTWFrZWZpbGVdfSB7CiAgICAgICAgICAgIGZpbGUgZGVsZXRlICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay9NYWtlZmlsZQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkYmxvY2ssaW5ub3Z1c19jb25maWdfdGNsKV0gJiYgW2ZpbGUgZXhpc3RzICR2YXJzKCRibG9jayxpbm5vdnVzX2NvbmZpZ190Y2wpXX0gewogICAgICAgICAgICBwdXRzICI8RkY+IFNvdXJjaW5nICR2YXJzKCRibG9jayxpbm5vdnVzX2NvbmZpZ190Y2wpIgogICAgICAgICAgICBzb3VyY2UgJHZhcnMoJGJsb2NrLGlubm92dXNfY29uZmlnX3RjbCkKICAgICAgICAgfSAKICAgICAgICAgc2V0IGN3ZCBbcHdkXQogICAgICAgIAogICAgICAgICBpZiB7KFtsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTApICAmJiAoW3N0cmluZyBjb21wYXJlICR2YXJzKGRic19mb3JtYXQpICJvYSJdPT0wKX0gewogICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzIGNkcy5saWJdfSB7CiAgICAgICAgICAgICAgIHNldCBpcCBbb3BlbiBjZHMubGliIHJdCiAgICAgICAgICAgICAgIHNldCBpIDAgCiAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsKICAgICAgICAgICAgICAgICAgc2V0IGNkc19saWIoJGkpICRsaW5lCiAgICAgICAgICAgICAgICAgIGluY3IgaQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGNsb3NlICRpcAogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBBIGNkcy5saWIgZmlsZSBpcyByZXF1aXJlZCBmb3Igb3BlbiBhY2Nlc3MgZmxvd3MgLi4uIgogICAgICAgICAgICB9CiAgICAgICAgIH0gCiAgICAgICAgIGNkICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jawogICAgICAgICBzZXQgdmFycyhkZXNpZ24pICRibG9jawogICAgICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHByb2NfZmlsZSldfSB7CiAgICAgICAgICAgICAgIHVuc2V0IHZhcnMocHJvY19maWxlKQogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuc2V0IHZhcnMoc3RlcHMpCiAgICAgICAgIH0gCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfc3BlYyldfSB7CiAgICAgICAgICAgIHVuc2V0IHZhcnMoY3RzX3NwZWMpCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRibG9jayxjdHNfc3BlYyldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKGN0c19zcGVjKSAkdmFycygkYmxvY2ssY3RzX3NwZWMpCiAgICAgICAgIH0KCiAgICAgICAgIGlmIHshJHZhcnMoY29kZWdlbil9IHsgCiAgICAgICAgICAgIGV4ZWMgbG4gLXMgJGxpbmsgU0NSSVBUUwogICAgICAgICAgICBleGVjIGxuIC1zIFNDUklQVFMvTWFrZWZpbGUuZWRpLmZsYXQgTWFrZWZpbGUKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHZhcnMobW9kZSkgZmxhdAogICAgICAgICAgICBzZXQgdmFycyhoaWVyKSB0cnVlIAogICAgICAgICAgICB1bnNldCB2YXJzKHN0ZXApCiAgICAgICAgICAgIGV4ZWN1dGVfZmxvdyBhbGwgJHZhcnMoZm9ybWF0X2xpbmVzKQogICAgICAgICAgICBGRjo6ZHVtcF92YXJzCiAgICAgICAgIH0KICAgICAgICAgY2QgJGN3ZAojICAgICAgICAgc2V0IGFjdGlvbnMgJHZhcnMoYWN0aW9ucykKICAgICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHZhcnNdIHsKICAgICAgICAgICAgdW5zZXQgdmFycygkdmFyKQogICAgICAgICB9CiMgICAgICAgICBzZXQgdmFycyhhY3Rpb25zKSAkYWN0aW9ucwogICAgICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgc3ZhcnNdIHsKICAgICAgICAgICAgc2V0IHZhcnMoJHZhcikgJHN2YXJzKCR2YXIpCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIycGFzcyJ9IHsKICAgICAgICAgZm9yZWFjaCBibG9jayBbY29uY2F0ICR2YXJzKGRlc2lnbikgJHZhcnMocGFydGl0aW9uX2xpc3QpXSB7CiAgICAgICAgICAgIGV4ZWMgbWtkaXIgLXAgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMKICAgICAgICAgICAgZXhlYyBta2RpciAtcCAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2svJHZhcnMocnB0X2RpcikKICAgICAgICAgICAgaWYge1tmaWxlIGlzZGlyZWN0b3J5ICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRibG9jay8kdmFycyhzY3JpcHRfZGlyKS9FVENdfSB7CiAgICAgICAgICAgICAgIGZpbGUgZGVsZXRlIC1mb3JjZSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2svJHZhcnMoc2NyaXB0X2RpcikvRVRDCiAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0VUQyAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2svJHZhcnMoc2NyaXB0X2RpcikvRVRDCiAgICAgICAgICAgIGZvcmVhY2ggZmlsZSBbZ2xvYiAkdmFycyhwYXJ0aXRpb25fZGlyKS9NYWtlKl0gewogICAgICAgICAgICAgICBpZiB7W2ZpbGUgaXNmaWxlICRmaWxlXX0gewogICAgICAgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlICRmaWxlICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCBmaWxlIFtnbG9iICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay8kdmFycyhzY3JpcHRfZGlyKS8qXSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBpc2ZpbGUgJGZpbGVdfSB7CiAgICAgICAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJGZpbGUgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svLmlsbV9ub25fc2RjX2ZpbGUudGNsXX0gewogICAgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay8uaWxtX25vbl9zZGNfZmlsZS50Y2wgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svZW1wdHkuc2RjXX0gewogICAgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay9lbXB0eS5zZGMgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svTWFrZWZpbGUucGFzczJdfSB7CiAgICAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrL01ha2VmaWxlLnBhc3MyICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRibG9jay9NYWtlZmlsZQogICAgICAgICAgICAgICBmaWxlIGRlbGV0ZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svTWFrZWZpbGUucGFzczIKICAgICAgICAgICAgfQogICAgICAgICAgICBjZCAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2sKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBzZXQgaW5kZXggW2xzZWFyY2ggW0ZGOjphZGp1c3Rfc3RlcHNdIGN0c10KICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgIHNldCBpbmRleCBbbHNlYXJjaCBbRkY6OmFkanVzdF9zdGVwc10gcG9zdGN0c10KIyAgICAgICAgICAgICAgIHNldCBpbmRleCBbbHNlYXJjaCBbRkY6OmFkanVzdF9zdGVwc10gcG9zdGN0c19ob2xkXQogICAgICAgICAgICAgICBzZXQgaW5kZXggW2V4cHIgW2xzZWFyY2ggW0ZGOjphZGp1c3Rfc3RlcHNdIGN0c10rMl0KICAgICAgICAgICAgfQogICAgICAgICAgICBjZCAkY3dkCiNwdXRzICJTUExJVCBGTE9XUzogJGluZGV4LCBbRkY6OmFkanVzdF9zdGVwc10iCiAgICAgICAgICAgIGZvcmVhY2ggc3RlcCBbbHJhbmdlICR2YXJzKHN0ZXBzKSAkaW5kZXggZW5kXSB7CiAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFycyhmc3RlcHMpICRzdGVwXSAhPSAtMX0gewogICAgICAgICAgICAgICAgICBpZiB7W2ZpbGUgaXNmaWxlICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay8kdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTL3J1bl8kc3RlcC50Y2xdfSB7CiNwdXRzICJDT1BZOiAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy9ydW5fJHN0ZXAudGNsICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRibG9jay8kdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTIgogICAgICAgICAgICAgICAgICAgICBmaWxlIGNvcHkgIC1mb3JjZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy9ydW5fJHN0ZXAudGNsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMKI3B1dHMgIkRFTEVURTogJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrLyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuXyRzdGVwLnRjbCIKICAgICAgICAgICAgICAgICAgICAgZmlsZSBkZWxldGUgIC1mb3JjZSAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2svJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy9ydW5fJHN0ZXAudGNsCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgICAgICAgICAgICBzZXQgYWRqdXN0ZWQgW0ZGOjphZGp1c3Rfc3RlcHNdCiMgICAgICAgICAgICBjZCAkdmFycyhwYXJ0aXRpb25fZGlyKS8kYmxvY2sKI3B1dHMgIjE6ICRhZGp1c3RlZCA6IFtscmFuZ2UgJGFkanVzdGVkIDAgJGluZGV4XSIKIyAgICAgICAgICAgIEZGOjpnZW5fbWFrZWZpbGUgW2xyYW5nZSAkYWRqdXN0ZWQgJGluZGV4IGVuZF0gZmxhdAojICAgICAgICAgICAgY2QgJGN3ZAojICAgICAgICAgICAgY2QgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJGJsb2NrCiNwdXRzICIyOiAkYWRqdXN0ZWQgOiBbbHJhbmdlICRhZGp1c3RlZCAkaW5kZXggZW5kXSIKIyAgICAgICAgICAgIEZGOjpnZW5fbWFrZWZpbGUgW2xyYW5nZSAkYWRqdXN0ZWQgJGluZGV4IGVuZF0gZmxhdAojICAgICAgICAgICAgY2QgJGN3ZAogICAgICAgICB9CiAgICAgIH0KIAogICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgdmFyc10gewogICAgICAgICB1bnNldCB2YXJzKCR2YXIpCiAgICAgIH0KICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHN2YXJzXSB7CiAgICAgICAgIHNldCB2YXJzKCR2YXIpICRzdmFycygkdmFyKQogICAgICB9CgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKIyAgICAgICAgIGlmIHskdmFycyhtYWtlZmlsZSl9IHsKIyAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG5leGVjIC9iaW4vdG91Y2ggJGVudihWUEFUSCkvcGFydGl0aW9uXG4iCiMgICAgICAgICB9CiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfSBlbHNlIHsKICAgICAgICAgZXhlYyAvYmluL3RvdWNoICRlbnYoVlBBVEgpL3BhcnRpdGlvbgogICAgICB9CiAgIH0KCiAgIHByb2MgcnVuX2RlYnVnIHt7Zm9ybWF0IDF9fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIHNldCB2YXJzKHN0ZXApIGRlYnVnCgogICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbmdsb2JhbCBlbnZcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1xbaW5mbyBleGlzdHMgZW52KFNURVApXF19IHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJbRkZfRURJOjpsb2FkX2Rlc2lnbiBcJGVudihTVEVQKV1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCgojICAgICAgYXBwZW5kIGNvbW1hbmRzICJbRkY6OnNvdXJjZV9wbHVnIGFsd2F5c19zb3VyY2VfdGNsXVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ3aW5cbiIKCiAgICAgIGlmIHskdmFycyhjb2RlZ2VuKX0gewogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cGxldmVsICMwIGV2YWwgJGNvbW1hbmRzCiAgICAgIH0KCiAgIH0KCiAgIHByb2MgcnVuX2xlYyB7fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIHNldCBjb21tYW5kcyAiIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ2cHhtb2RlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGRvZmlsZSBhYm9ydCBleGl0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHVuZGVmaW5lZCBjZWxsIGJsYWNrX2JveCAtbm9hc2NlbmQgLWJvdGhcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ0Y2xtb2RlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiLy8gc2V0dXAgdmFyaWFibGVzIFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgImdsb2JhbCB2YXJzXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicHJvYyBQdXRzIHthcmdzfSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgcHV0cyBcJGFyZ3NcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCgogICAgICBhcHBlbmQgY29tbWFuZCAiLy8gRGVmaW5lIHRoZSBuZXRsaXN0IHRvIGJlIHZlcmlmeVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcW2luZm8gZXhpc3RzIGVudihTVEVQKVxdICYmIFxbZmlsZSBleGlzdHMgJHZhcnMoZGJzX2RpcikvTEVDL1wkZW52KFNURVApLnYuZ3pcXX0ge1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIHNldCByZXZpc2VkTmV0bGlzdCAkdmFycyhkYnNfZGlyKS9MRUMvXCRlbnYoU1RFUCkudi5nelxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIn0gZWxzZSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgUHV0cyBcIjxGRj4gRmFpbGVkIHRvIGZpbmQgbmV0bGlzdCAgREJTL0xFQy9cJGVudihTVEVQKS52Lmd6XCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModGhyZWFkcyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAidnB4IHNldCBjb21wYXJlIG9wdGlvbiAtdGhyZWFkcyAkdmFycyh0aHJlYWRzKVxuIgogICAgICB9CgogICAgICBhcHBlbmQgY29tbWFuZHMgIi8vIHJlYWQgbGliZXJ0eSBjZWxsIGRlZmluaXRpb25zXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lcildfSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpXX0gewogICAgICAgICAgICBzZXQgc2V0ICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxsaWJyYXJ5X3NldCkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1hbmRzICJ2cHggcmVhZCBsaWJyYXJ5IC1zdGF0ZXRhYmxlIC1ib3RoIC1saWJlcnR5IFxbbGlzdCAkdmFycygkc2V0LHRpbWluZylcXVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIvLyByZWFkIHJlZmVyZW5jZSBuZXRsaXN0XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAidnB4IHJlYWQgZGVzaWduIC12ZXJpbG9nIC1zZW5zaXRpdmUgLWdvbGRlbiAkdmFycyhuZXRsaXN0KVxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICIvLyByZWFkIHBvc3QtaW1wbGVtZW50YXRpb24gbmV0bGlzdFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInZweCByZWFkIGRlc2lnbiAtdmVyaWxvZyAtc2Vuc2l0aXZlIC1yZXZpc2VkIFwkcmV2aXNlZE5ldGxpc3RcbiIKCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiLy9zZXQgdG9wIGxldmVsXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAidnB4IHNldCByb290IG1vZHVsZSAkdmFycyhkZXNpZ24pIC1ib3RoXG4iCgogICAgICByZWdzdWIgLWFsbCAiIyIgW0ZGOjpzb3VyY2VfcGx1ZyBwcmVfbGVjX3RjbF0gIi8vIiB0ZW1wCiAgICAgIGFwcGVuZCBjb21tYW5kcyAkdGVtcAoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ2cHhtb2RlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicmVwb3J0IGRlc2lnbiBkYXRhXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAicmVwb3J0IGJsYWNrIGJveFxuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgbWFwcGluZyBtZXRob2QgLW5hbWUgZmlyc3RcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJzZXQgZmxhdHRlbiBtb2RlbCAtc2VxX2NvbnN0YW50IC1zZXFfY29uc3RhbnRfeF90byAwXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGZsYXR0ZW4gbW9kZWwgLW5vZGZmX3RvX2RsYXRfemVybyAtbm9kZmZfdG9fZGxhdF9mZWVkYmFja1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBmbGF0dGVuIG1vZGVsIC1nYXRlZF9jbG9ja1xuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBzeXN0ZW0gbW9kZSBsZWNcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJhZGQgY29tcGFyZSBwb2ludCAtYWxsXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiY29tcGFyZSAtZ2F0ZV90b19nYXRlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAidXNhZ2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIvLyAgIHZweCByZXBvcnQgY29tcGFyZSBkYXRhIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlcG9ydCBjb21wYXJlIGRhdGEgLWNsYXNzIG5vbmVxdWl2YWxlbnQgLWNsYXNzIGFib3J0IC1jbGFzcyBub3Rjb21wYXJlZFxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInJlcG9ydCB2ZXJpZmljYXRpb24gLXZlcmJvc2VcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZXBvcnQgc3RhdGlzdGljc1xuIgoKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ0Y2xtb2RlXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IHBvaW50c19jb3VudCBcW2dldF9jb21wYXJlX3BvaW50cyAtY291bnRcXVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCBkaWZmX2NvdW50IFxbZ2V0X2NvbXBhcmVfcG9pbnRzIC1kaWZmIC1jb3VudFxdXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAic2V0IGFib3J0X2NvdW50IFxbZ2V0X2NvbXBhcmVfcG9pbnRzIC1hYm9ydCAtY291bnRcXVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInNldCB1bmtub3duX2NvdW50IFxbZ2V0X2NvbXBhcmVfcG9pbnRzIC11bmtub3duIC1jb3VudFxdXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1wkcG9pbnRzX2NvdW50ID09IDB9IHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgcHV0cyBcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCJFUlJPUjogTm8gY29tcGFyZSBwb2ludHMgZGV0ZWN0ZWRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICBwdXRzIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1wkZGlmZl9jb3VudCA+IDB9IHtcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgcHV0cyBcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCJFUlJPUjogRGlmZmVyZW50IEtleSBQb2ludHMgZGV0ZWN0ZWRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICBwdXRzIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYge1wkYWJvcnRfY291bnQgPiAwfSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCJFUlJPUjogQWJvcnQgUG9pbnRzIGRldGVjdGVkIFwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgImlmIHtcJHVua25vd25fY291bnQgPiAwfSB7XG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgIHB1dHMgXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgcHV0cyBcIkVSUk9SOiBVbmtub3duIEtleSBQb2ludHMgZGV0ZWN0ZWRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICBwdXRzIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAifVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCJObyBvZiBjb21wYXJlIHBvaW50cyA9IFwkcG9pbnRzX2NvdW50XCJcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJwdXRzIFwiTm8gb2YgZGlmZiBwb2ludHMgICAgPSBcJGRpZmZfY291bnRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCJObyBvZiBhYm9ydCBwb2ludHMgICA9IFwkYWJvcnRfY291bnRcIlxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCJObyBvZiB1bmtub3duIHBvaW50cyA9IFwkdW5rbm93bl9jb3VudFwiXG4iCiAgICAgIGFwcGVuZCBjb21tYW5kcyAiZXhpdCAwXG4iCgogICAgICBpZiB7JHZhcnMoY29kZWdlbil9IHsKICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9IGVsc2UgewogICAgICAgICAgdXBsZXZlbCAjMCBldmFsICRjb21tYW5kcwogICAgICB9CgogICB9CgogICBwcm9jIGR1bXBfY29uZmlnIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCB1ZG0KICAgICAgZ2xvYmFsIHJkYV9JbnB1dAogICAgICBnbG9iYWwgcmRhX2RlZmF1bHRzCgojICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikKICAgICAgaWYge1tpbmZvIGNvbW1hbmQgRkZGOjpnZXRfdG9vbF0gbmUgIiIgJiYgW0ZGRjo6Z2V0X3Rvb2xdIGVxICJyYyJ9IHsKICAgICAgICB0Y2xfc291cmNlICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvSU5OT1ZVUy91ZG0udGNsCiAgICAgIH0gZWxzZSB7IAogICAgICAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL0lOTk9WVVMvdWRtLnRjbAogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgIGlmIHskdmFycyhjcGZfdGltaW5nKX0gewogICAgICAgICAgICB1bnNldCBpbml0KG1tbWNfZmlsZSkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdW5zZXQgaW5pdChjcGZfZmlsZSkKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDEwfSB7CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgICAgc2V0IGluaXQobW1tY19maWxlKSAkdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKQogICAgICAgICB9CiAgICAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9pbml0LnRjbCB3XQogICAgICAgICAjIEJDTDogVHJ5aW5nIHRvIGZpeCBlbWJlZGRlZCBwYXRocy4uLgogICAgICAgICBzZXQgcmVsYXRpdml6ZU1lc2dMb2cgIiIKICAgICAgICAgc2V0IHJlbGF0aXZpemVNZXNnTG9nICIkcmVsYXRpdml6ZU1lc2dMb2cgW0ZGOjpyZW1vdmVfb3V0ZXJfYnJhY2VzIFtGRjo6cmVsYXRpdml6ZUZpbGVPckRpciAtYXJyIGluaXQgLXZhcmRpciBmZl9leGVfZGlyIC1yZWxhdGl2ZVBhdGhzT2tdXSIKCiAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyBpbml0XSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJGluaXQoJHZhcildfSB7CiAgICAgICAgICAgICAgIHNldCBudmFyIFtsaXN0XQogICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJGluaXQoJHZhcikgewogICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIm9hXyIgJHZhcl19IHsKICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCBudmFyIFtmaWxlIG5vcm1hbGl6ZSAkZmlsZV0KICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldCBpbml0XyR2YXIgXCIkbnZhclwiIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAic2V0IGluaXRfJHZhciBcIiRpbml0KCR2YXIpXCIiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiB7JHZhcnMobmV0bGlzdF90eXBlKSA9PSAidmVyaWxvZyJ9IHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXIgPT0gIm9hX2Rlc2lnbl9saWIifSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgaWYgeyR2YXIgPT0gIm9hX2Rlc2lnbl9jZWxsIn0geyBjb250aW51ZSB9CiAgICAgICAgICAgICAgICAgIGlmIHskdmFyID09ICJvYV9kZXNpZ25fdmlldyJ9IHsgY29udGludWUgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgaW5pdF8kdmFyIFwiJGluaXQoJHZhcilcIiIKICAgICAgICAgICAgfQogICAgICAgICB9CiMgICAgICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgbmluaXRdIHsKIyAgICAgICAgICAgIHB1dHMgJG5wICJzZXRfZGIgaW5pdF8kdmFyIFwiJG5pbml0KCR2YXIpXCIiCiMgICAgICAgICB9CiAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyBjb25mXSB7CiAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgY29uZl8kdmFyIFwiJGNvbmYoJHZhcilcIiIKICAgICAgICAgfQogICAgICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgY3RzXSB7CiAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgY3RzXyR2YXIgXCIkY3RzKCR2YXIpXCIiCiAgICAgICAgIH0KICAgICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIGRlbGF5Y2FsXSB7CiAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgZGVsYXljYWxfJHZhciBcIiRkZWxheWNhbCgkdmFyKVwiIgogICAgICAgICB9CiAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyBleHRyYWN0XSB7CiAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgZXh0cmFjdF8kdmFyIFwiJGV4dHJhY3QoJHZhcilcIiIKICAgICAgICAgfQojICAgICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIGZwXSB7CiMgICAgICAgICAgICBwdXRzICRvcCAic2V0IGZwXyR2YXIgXHskZnAoJHZhcilcfSIKIyAgICAgICAgIH0KICAgICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIG9wdF0gewogICAgICAgICAgICBwdXRzICRvcCAic2V0IG9wdF8kdmFyIFwiJG9wdCgkdmFyKVwiIgogICAgICAgICB9CiMgICAgICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgcmRhX0lucHV0XSB7CiMgICAgICAgICAgICBwdXRzICRvcCAic2V0IHJkYV9JbnB1dCgkdmFyKSBceyRyZGFfSW5wdXQoJHZhcilcfSIKIyAgICAgICAgIH0KIyAgICAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyByZGFfZGVmYXVsdHNdIHsKIyAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgcmRhX0lucHV0KCR2YXIpIFx7JHZhcnMoJHZhcilcfSIKIyAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL3J1bi5jb25mIHddCiAgICAgICAgICNCQ0w6IEFkZGVkIC5mZi50Y2wgc291cmNpbmcgaW4gcnVuLmNvbmYgaW4gb3JkZXIgdG8gcHVsbCBpbiBjb2RlZ2VuIHZhcmlhYmxlcwogICAgICAgICBwdXRzICRvcCAiIyBTZXQgdXAgY29kZWdlbiB2YXJpYWJsZXMgKHBvc3NpYmx5KSBuZWVkZWQgdG8gcmVzb2x2ZSBzb21lIGNvbmYgdmFyaWFibGVzIgogICAgICAgICAjcHV0cyAkb3AgImlmIHtcW2ZpbGUgZXhpc3RzIC5mZi50Y2xcXX0geyIKICAgICAgICAgI3B1dHMgJG9wICIgIHNvdXJjZSAuZmYudGNsIgogICAgICAgICAjcHV0cyAkb3AgIn0iCiAgICAgICAgICNCQ0w6IE9ubHkgZW5jbG9zZSBpbiBjdXJsaWVzIGlmIHN1YnN0IGlzIG5vdCBwYXJ0IG9mIHRoZSBuZXRsaXN0IG5hbWUKICAgICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHJkYV9JbnB1dF0gewogICAgICAgICAgICMgQkNMOiBvbmx5IHVzZSBjdXJsaWVzIGlmIHRoZSB2YXJpYWJsZSBkb2Vzbid0IGNvbnRhaW4gc3Vic3QgKG90aGVyd2lzZSBzdWJzdCB3aWxsIG5vdCBiZSBwZXJmb3JtZWQpCiAgICAgICAgICAgaWYge1tyZWdleHAge3N1YnN0fSAkcmRhX0lucHV0KCR2YXIpXX0gewogICAgICAgICAgICAgcHV0cyAkb3AgInNldCByZGFfSW5wdXQoJHZhcikgXCIkcmRhX0lucHV0KCR2YXIpXCIiCiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgcmRhX0lucHV0KCR2YXIpIFx7JHJkYV9JbnB1dCgkdmFyKVx9IgogICAgICAgICAgIH0KICAgICAgICAgfQojICAgICAgICAgaWYgeyR2YXJzKGZsYXQpICE9ICJmdWxsIn0gewojICAgICAgICAgICAgcHV0cyAkb3AgInNldCByZGFfSW5wdXQodWlfdmlld19kZWZpbml0aW9uX2ZpbGUpIFwiJHZhcnMoc2NyaXB0X2Rpcikvdmlld19kZWZpbml0aW9uLnRjbFwiIgojICAgICAgICAgfQogICAgICB9CiAgICAgIGNsb3NlICRvcAojICAgICAgY2xvc2UgJG5wCiAgIH0KCiAgIHByb2MgZ2V0X3JlcXVpcmVkX3Byb2NzIHtmaWxlfSB7CiAgICAgICMKICAgICAgIyBHaXZlbiBhIGxpc3Qgb2YgcmVxdWlyZWQgcHJvY2VkdXJlcywgcmV0dXJuIHRoZSBsaW5lcyB0aGF0IHJlcHJlc2VudAogICAgICAjIHRob3NlIHByb2NlZHVyZXMgZnJvbSB0aGUgdXRpbHMudGNsIGZpbGUKICAgICAgIwoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVycm9ycwoKICAgICAgIwogICAgICAjIFJlYWQgdGhlIGZpbGUgYW5kIGdhdGhlciBhbGwgb2YgdGhlIGNvbnRlbnRzCiAgICAgICMKCiAgICAgIHNldCBhbGxfbGluZXMgIiIKICAgICAgc2V0IGxlbmd0aCAwCiAgICAgIHNldCBpcCBbb3BlbiAkZmlsZV0KICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICBzZXQgdXRpbHNfbGluZXMoJGxlbmd0aCkgJGxpbmUKICAgICAgICAgaW5jciBsZW5ndGgKICAgICAgfQogICAgICBjbG9zZSAkaXAKCiAgICAgICMKICAgICAgIyBJdGVyYXRlIGFjcm9zcyBlYWNoIGxpbmUgYW5kIHB1bGwgb3V0IHJlbGV2YW50IHByb2NlZHVyZXMKICAgICAgIwoKICAgICAgc2V0IGxpbmVzICIiCiAgICAgIHNldCBpIDAKICAgICAgd2hpbGUgeyRpIDwgJGxlbmd0aH0gewogICAgICAgICBzZXQgbGluZSAkdXRpbHNfbGluZXMoJGkpCiAgICAgICAgIGZvcmVhY2ggcHJvYyAkdmFycyhyZXF1aXJlZF9wcm9jcykgewogICAgICAgICAgICBpZiB7W3JlZ2V4cCAicHJvYyAkcHJvYyIgJGxpbmVdID4gMH0gewogICAgICAgICAgICAgICBhcHBlbmQgbGluZXMgIiAkbGluZVxuIgogICAgICAgICAgICAgICBpbmNyIGkKICAgICAgICAgICAgICAgd2hpbGUgeyRpIDwgJGxlbmd0aH0gewogICAgICAgICAgICAgICAgICBzZXQgbGluZSAkdXRpbHNfbGluZXMoJGkpCiAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJwcm9jICIgJGxpbmVdID4gMH0gewogICAgICAgICAgICAgICAgICAgICBpbmNyIGkgLTEKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl4jIiBbc3RyaW5nIHRyaW1sZWZ0ICRsaW5lXSBdICYmICgkaSAhPSBbZXhwciAkbGVuZ3RoLTFdKX0gewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgbGluZXMgIiRsaW5lXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaW5jciBpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGluY3IgaQogICAgICB9CgogICAgICBzZXQgbGluZXMgW3N0cmluZyB0cmltcmlnaHQgJGxpbmVzXQogICAgICByZXR1cm4gIiRsaW5lc1xuIgogICB9CgogICBwcm9jIG5vcm1hbGl6ZV9maWxlcyB7fSB7CgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobm9ybWFsaXplX2ZpbGVzKV0gJiYgISR2YXJzKG5vcm1hbGl6ZV9maWxlcyl9IHsKICAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh2aWV3X2RlZmluaXRpb25fdGNsKV19IHsKICAgICAgICAgc2V0IG1tbWNfZmlsZSBbZmlsZSBub3JtYWxpemUgJHZhcnModmlld19kZWZpbml0aW9uX3RjbCldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBtbW1jX2ZpbGUgW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2xdCiAgICAgIH0KICAgICAgc2V0IHZhcnMobW1tY19maWxlKSAkbW1tY19maWxlCgogICAgICBmb3JlYWNoIGZpbGVfdmFyIFtsaXN0IGNwZl9maWxlIGRlZl9maWxlcyBuZXRsaXN0IGN0c19zcGVjIGxlZl9maWxlcyBcCiAgICAgICAgICAgICAgICAgICAgICAgICBnZHNfZmlsZXMgYWN0aXZpdHlfZmlsZSBpbG1fbm9uX3NkY19maWxlIF0gewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJGZpbGVfdmFyKV19IHsKICAgICAgICAgICAgc2V0IHRlbXAgW2xpc3RdCiAgICAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycygkZmlsZV92YXIpIHsgIAogICAgICAgICAgICAgICBsYXBwZW5kIHRlbXAgW2ZpbGUgbm9ybWFsaXplICRmaWxlXQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB2YXJzKCRmaWxlX3ZhcikgJHRlbXAKICAgICAgICAgfQogICAgICB9CiAgIH0KCiAgIHByb2Mgbm9ybWFsaXplX2NvbnN0cmFpbnRzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgY3dkIFtwd2RdCiAgICAgIGNkICR2YXJzKGN3ZCkKCiAgICAgIGZvcmVhY2ggbW9kZSAkdmFycyhjb25zdHJhaW50X21vZGVzKSB7CiAgICAgICAgIGZvcmVhY2ggdmFyICJwcmVfY3RzX3NkYyBwcmVfY3RzX2lsbV9zZGMgaW5jcl9jdHNfc2RjIHBvc3RfY3RzX3NkYyIgewogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJG1vZGUsJHZhcildfSB7CiAgICAgICAgICAgICAgICAgIHNldCB0ZW1wIFtsaXN0XQogICAgICAgICAgICAgICBmb3JlYWNoIGZpbGUgJHZhcnMoJG1vZGUsJHZhcikgewogICAgICAgICAgICAgICAgICBsYXBwZW5kIHRlbXAgW2ZpbGUgbm9ybWFsaXplICRmaWxlXQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCB2YXJzKCRtb2RlLCR2YXIpICR0ZW1wCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGNkICRjd2QKICAgfQoKICAgcHJvYyBkZW5vcm1hbGl6ZV9maWxlcyB7fSB7CiAgIAogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgdHZhcnMKICAgCiAgICAgIGZvcmVhY2ggdmFyIFthcnJheSBuYW1lcyB2YXJzXSB7CiAgICAgICAgIGlmIHsoJHZhciAhPSAic2V0dXBfcGF0aCIpICYmICgkdmFyICE9ICJzY3JpcHRfZGlyIikgJiYgKCR2YXIgIT0gInNjcmlwdF9wYXRoIikgJiYgKCR2YXIgPT0gImV4ZWN1dGVfc3RyaW5nIil9IHsKICAgICAgICAgICAgc2V0IHR2YXJzKCR2YXIpICR2YXJzKCR2YXIpCiAgICAgICAgIH0KICAgICAgfQoKIyAgICAgIHNldCBvcCBbb3BlbiAuc2V0dXAuZmYudGNsIHddCiAgICAgIGNhdGNoIHt1bnNldCBwYXRoX2FycmF5fQogICAgICBzZXQgcGF0aF9saXN0IFtsaXN0XQogICAgICBzZXQgcGF0aF92YXJzIFtsaXN0XQogICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgdHZhcnNdIHsKICAgICAgICAgaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJHR2YXJzKCR2YXIpXSB7CiAgICAgICAgICAgIHNldCBwYXRoX2FycmF5KCR0dmFycygkdmFyKSkgJHZhcgogICAgICAgICAgICBsYXBwZW5kIHBhdGhfdmFycyAkdmFyCiAgICAgICAgICAgIGxhcHBlbmQgcGF0aF9saXN0ICR0dmFycygkdmFyKSAgCiAgICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgc2V0IHNvcnRlZF9wYXRoX2xpc3QgW2xzb3J0IC1kZWNyZWFzaW5nICRwYXRoX2xpc3RdCiMgICAgICBwdXRzICItPiBGb3VuZCBbbGxlbmd0aCAkc29ydGVkX3BhdGhfbGlzdF0iCiAgICAgIGZvcmVhY2ggcGF0aCAkc29ydGVkX3BhdGhfbGlzdCB7CiMgICAgICAgICBwdXRzICIkcGF0aCAtPiAkcGF0aF9hcnJheSgkcGF0aCkgKFtzdHJpbmcgbGVuZ3RoICRwYXRoXSkiCiMgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHBhdGhfYXJyYXkoJHBhdGgpKSAkcGF0aCIKICAgICAgfQogICAgICAKICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHR2YXJzXSB7CiAgICAgICAgIHNldCBmb3VuZCAwCiAgICAgICAgIGZvcmVhY2ggcGF0aCAkc29ydGVkX3BhdGhfbGlzdCB7CiAgICAgICAgICAgICBpZiB7KCR2YXIgPT0gJHBhdGhfYXJyYXkoJHBhdGgpKSB8fCAoW3N0cmluZyBmaXJzdCAiXFsiICAkdmFyXSAhPSAtMSl9IHsKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICB9CiAgICAgICMgICAgICBwdXRzICRvcCAiW2Zvcm1hdCAicmVnc3ViIC1hbGwgXCIlc1wiIFwiJXNcIiBcXCQlcyIgJHBhdGggW2pvaW4gJHR2YXJzKCR2YXIpXSAkcGF0aF9hcnJheSgkcGF0aCkgdGVtcF0iCiAgICAgICAgICAgIGlmIHtbY2F0Y2gge3NldCBjb21tYW5kIFtmb3JtYXQgInJlZ3N1YiAtYWxsIFwiJXNcIiBcIiVzXCIgXFxcJHZhcnMoJXMpIHRlbXAiICRwYXRoIFtqb2luICR0dmFycygkdmFyKV0gJHBhdGhfYXJyYXkoJHBhdGgpXX1dfSB7CiAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IGZvbyBbZXZhbCAkY29tbWFuZF0KICAgICAgICAgICAgaWYgeyRmb28gPiAwfSB7CiMgICAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikgXCJbam9pbiAkdGVtcF1cIiIKICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICR0ZW1wXSA+IDF9IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJHZhcikgW2pvaW4gJHRlbXBdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCR2YXIpICR0ZW1wCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IGZvdW5kIDEKICAgICAgICAgICAgfQogICAgICAgICB9CiMgICAgICAgICBpZiB7ISRmb3VuZH0gewojICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIFwiW2pvaW4gJHZhcnMoJHZhcildXCIiCiMgICAgICAgICB9CiAgICAgIH0KIyAgICAgIGZvcmVhY2ggcGF0aCAkc29ydGVkX3BhdGhfbGlzdCB7CiMgICAgICAgICBzZXQgdmFycygkcGF0aF9hcnJheSgkcGF0aCkpICRwYXRoCiMgICAgICB9CiMgICAgICBjbG9zZSAkb3AKIyAgICAgIHNvdXJjZSAuc2V0dXAuZmYudGNsIAogICB9CgogICBwcm9jIHNvdXJjZV9jb25maWdfZmlsZXMge30gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgdXNlcl92YXJzCiAgICAgIGdsb2JhbCBkZXNjCiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIHB1dHMgIjxGRj4gTE9BRElORyBDT05GSUdVUkFUSU9OIEZJTEVTOiIKICAgICAgc2V0IHZhcnMoY29uZmlnX2ZpbGVzKSBbbGlzdF0KICAgICAgZm9yZWFjaCBmaWxlICJzZXR1cC50Y2wgaW5ub3Z1c19jb25maWcudGNsIGxwX2NvbmZpZy50Y2wgZ2VudXNfY29uZmlnLnRjbCIgewogICAgICAgICBzZXQgdGVtcCBbcmVnc3ViICJcXC4iICRmaWxlICJfIl0KICAgICAgICAgc2V0IHZhcnMoJHRlbXApIFtsaXN0XSAKICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhzZXR1cF9wYXRoKS8kZmlsZV19IHsKICAgICAgICAgICAgRkY6OnNvdXJjZV9maWxlICR2YXJzKHNldHVwX3BhdGgpLyRmaWxlCiAgICAgICAgICAgIGxhcHBlbmQgdmFycygkdGVtcCkgJHZhcnMoc2V0dXBfcGF0aCkvJGZpbGUKICAgICAgICAgICAgbGFwcGVuZCB2YXJzKGNvbmZpZ19maWxlcykgJHZhcnMoc2V0dXBfcGF0aCkvJGZpbGUKICAgICAgICAgfQogICAgICAgICBpZiB7KCR2YXJzKHNldHVwX3BhdGgpICE9ICIuIikgJiYgW2ZpbGUgZXhpc3RzICRmaWxlXX0gewogICAgICAgICAgICBGRjo6c291cmNlX2ZpbGUgJGZpbGUKICAgICAgICAgICAgbGFwcGVuZCB2YXJzKCR0ZW1wKSAkZmlsZQogICAgICAgICAgICBsYXBwZW5kIHZhcnMoY29uZmlnX2ZpbGVzKSAkZmlsZQogICAgICAgICB9CiAgICAgICAgIGlmIHskdmFycygkdGVtcCkgIT0gIiJ9IHsKICAgICAgICAgICAgcHV0cyAiPEZGPiAgICAkdGVtcCAtPiAkdmFycygkdGVtcCkiCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHZhcnNdIHsKICAgICAgICAgc2V0IHVzZXJfdmFycygkdmFyKSAkdmFycygkdmFyKQojICAgICAgICAgcHV0cyAkdmFyCiAgICAgIH0KCiAgICAgIGlmIHtbRkY6OmlzX2xwX2Zsb3ddfSB7CiAgICAgICAgIHNldCB2YXJzKHJlcXVpcmVkX3Byb2NzKSBcCiAgICAgICAgICAgICJzb3VyY2VfZmlsZSBzeXN0ZW1faW5mbyBnZXRfY2xvY2tfcG9ydHMgZ2V0X3Bvd2VyX2RvbWFpbnMgbW9kaWZ5X3Bvd2VyX2RvbWFpbnMgYWRkX3Bvd2VyX3N3aXRjaGVzIFwKICAgICAgICAgICAgIHJvdXRlX3NlY29uZGFyeV9wZ19uZXRzIGluc2VydF93ZWxsdGFwc19lbmRjYXBzIHJlcG9ydF90aW1lIGJ1ZmZlcl9hbHdheXNfb25fbmV0cyBcCiAgICAgICAgICAgICBzYXZlX3Jlc3VsdHMgbG9hZF9hcHBsZXQgZ2V0X3Rvb2wgbG9hZF9wYXRoX2dyb3VwcyIKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnMocmVxdWlyZWRfcHJvY3MpIFwKICAgICAgICAgICAgInNvdXJjZV9maWxlIHN5c3RlbV9pbmZvIGdldF9jbG9ja19wb3J0cyByZXBvcnRfdGltZSBpbnNlcnRfd2VsbHRhcHNfZW5kY2FwcyBcCiAgICAgICAgICAgICBzYXZlX3Jlc3VsdHMgbG9hZF9hcHBsZXQgZ2V0X3Rvb2wgbG9hZF9wYXRoX2dyb3VwcyAiCiAgICAgIH0KICAgfQoKICAgcHJvYyBleGVjdXRlX2Zsb3cge3N0ZXAge2Zvcm1hdCAxfSB7YWJvcnQgIiJ9fSB7CgogICAgICAjCiAgICAgICMgVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQsIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGZ1bmN0aW9ucyBhbmQKICAgICAgIyBhZ2dyZWdhdGluZyByZXN1bHRzIGZvciBlYWNoIHN0ZXAgaW4gdGhlIGZsb3cKICAgICAgIwogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZGFyZ3MKICAgICAgZ2xvYmFsIGZhcmdzCiAgICAgIGdsb2JhbCBzdmFycwogICAgICBnbG9iYWwgZW52CiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc291cmNlZCldfSB7IHNldCB2YXJzKHNvdXJjZWQpIDAgfQojICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzaW5nbGUpXX0geyBzZXQgdmFycyhzaW5nbGUpIDAgfQogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGNhdGNoX2Vycm9ycyldfSB7IHNldCB2YXJzKGNhdGNoX2Vycm9ycykgMCB9CiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc3RvcF9zdGVwKV19IHsgc2V0IHZhcnMoc3RvcF9zdGVwKSAic2lnbm9mZiIgfQogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGluaXRpYWxpemVkKV19IHsgc2V0IHZhcnMoaW5pdGlhbGl6ZWQpIDAgfQogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGxvYWRlZCldfSB7IHNldCB2YXJzKGxvYWRlZCkgMCB9CiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoYnN0ZXBzKV19IHsgc2V0IHZhcnMoYnN0ZXBzKSBbbGlzdF0gfQogICAgICBpZiB7IVtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXX0geyBzZXQgZW52KFZQQVRIKSBtYWtlIH0KCiAgICAgICMKICAgICAgIyBJZiBubyBzdGVwcyBhcmUgZGVmaW5lZCwgc2V0IHRoZSBzdGVwcyB0byBleGVjdXRlIGJhc2VkIHVwb24gdGhlCiAgICAgICMgbW9kZSB0aGF0IHRoZSBzeXN0ZW0gaXMgcnVubmluZyBpbi4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIHRoZQogICAgICAjIGhpZXJhcmNoaWNhbCBmbG93IHdpbGwgdW5zZXQgdGhlIHZhcnMoKSBhcnJheSBiZWZvcmUgcmVjdXJzaXZlbHkKICAgICAgIyBjYWxsaW5nIHRoaXMgcm91dGluZS4KICAgICAgIwoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzdGVwcyldfSB7CiAgICAgICAgICMgQkNMOiBNb3ZlZCB0aGUgZm9sbG93aW5nIGlmIC8gZWxzZSB1cCAoaXQgbXVzdCBhbHdheXMgZXhlY3V0ZSkKICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhtb2RlKV19IHsgCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZmFyZ3MobW9kZSldfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKG1vZGUpICRmYXJncyhtb2RlKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdmFycyhtb2RlKSAkZGFyZ3MobW9kZSkKICAgICAgICAgICAgfQogICAgICAgICB9CiMgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaGllcildICYmICEkdmFycyhoaWVyKX0gewojICAgICAgICAgICAgRkY6OnNldF9zdGVwcyAkdmFycyhtb2RlKSAkZm9ybWF0CiMgICAgICAgICAgICB1bnNldCB2YXJzKG1vZGUpCiMgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgRkY6OnNldF9zdGVwcyAkdmFycyhtb2RlKSAkZm9ybWF0CiMgICAgICAgICB9CiAgICAgIH0KCiAgICAgICMKICAgICAgIyBTZXQgdGhlIHByb2NlZHVyZXMgdGhhdCB3ZSB3aWxsIG5lZWQgdG8gaW5jbHVkZSB3aXRoaW4gZWFjaCBmaWxlIHRoYXQKICAgICAgIyB3ZSBjcmVhdGUgdG8gcnVuIGEgc3RlcC4KICAgICAgIwoKIyAgICAgIHNldCB2YXJzKHJlcXVpcmVkX3Byb2NzKSBcCiMgICAgICAgICAic291cmNlX3BsdWcgZ2V0X2Nsb2NrX3BvcnRzIGdldF9wb3dlcl9kb21haW5zIHJlcG9ydF90aW1lIgoKICAgICAgIwogICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSB2YXJpYWJsZXMgYXJlIGFjdHVhbGx5IHNvdXJjZWQgZnJvbSB0aGUKICAgICAgIyBjb25maWd1cmF0aW9uIGZpbGVzCiAgICAgICMKCiAgICAgIGlmIHshJHZhcnMoc291cmNlZCkgJiYgKCRzdGVwICE9ICJzb3VyY2UiKX0gewogICAgICAgICBleGVjdXRlX2Zsb3cgInNvdXJjZSIgJGZvcm1hdCAkYWJvcnQKICAgICAgfQoKICAgICAgaWYgeyR2YXJzKHNvdXJjZWQpfSB7IAogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoaGllcildICYmICEkdmFycyhoaWVyKX0gewogICAgICAgICAgICBGRjo6c2V0X3N0ZXBzICR2YXJzKG1vZGUpICRmb3JtYXQKICAgICAgICAgICAgdW5zZXQgdmFycyhtb2RlKQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBGRjo6c2V0X3N0ZXBzICR2YXJzKG1vZGUpICRmb3JtYXQKICAgICAgICAgfQogICAgICB9CiAgICAgICMKICAgICAgIyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBzdGVwIHBlciB0aGUgY29tbWFuZAogICAgICAjCgogICAgICBzZXQgYWN0aW9uICIiCiAgICAgIHN3aXRjaCAtLSAkc3RlcCB7CiAgICAgICAgICJzb3VyY2UiIHsKICAgICAgICAgICAgaWYgeyEkdmFycyhzb3VyY2VkKX0gewogICAgICAgICAgICAgICBGRl9FREk6OnNvdXJjZV9jb25maWdfZmlsZXMKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgICAgICAgaWYgeyFbcmVnZXhwICJeMTAiICRmYXJncyh2ZXJzaW9uKV0gJiYgIVtyZWdleHAgIl45IiAkZmFyZ3ModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgICAgICAgIEZGX0VESTo6ZGVub3JtYWxpemVfZmlsZXMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGRhcmdzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl4xMCIgJGRhcmdzKHZlcnNpb24pXSAmJiAhW3JlZ2V4cCAiXjkiICRkYXJncyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgICAgICAgICAgRkZfRURJOjpkZW5vcm1hbGl6ZV9maWxlcwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZm9yZWFjaCBhcmcgW2pvaW4gJHZhcnMoYXJnX2xpc3QpXSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkYXJnKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncygkYXJnKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKCRhcmcpICE9ICRmYXJncygkYXJnKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IE92ZXJ3cml0aW5nIHZhcnMoJGFyZykgZnJvbSAkdmFycygkYXJnKSB0byAkZmFyZ3MoJGFyZykgLi4uIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRhcmcpICRmYXJncygkYXJnKQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAjIE9ubHkgc2V0IHRoZSBmYXJnIGlmIGl0IHdhc24ndCBzZXQgaW4gYSBjb25maWcgZmlsZQogICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCRhcmcpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRhcmcpICRkYXJncygkYXJnKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncygkYXJnKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJGFyZykgJGZhcmdzKCRhcmcpCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRhcmcpICRkYXJncygkYXJnKQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgIEZGX0VESTo6c2VlZF92YXJpYWJsZXMKIyAgICAgICAgICAgICAgIEZGX0VESTo6Y2hlY2tfc2V0dXAKIyAgICAgICAgICAgICAgIEZGX0VESTo6bm9ybWFsaXplX2ZpbGVzIAogICAgICAgICAgICAgICBzZXQgdmFycyhzb3VyY2VkKSB0cnVlCiAgICAgICAgICAgICAgIHNldCB2YXJzKHRvcF9jZWxsKSAkdmFycyhkZXNpZ24pCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAic291cmNlX29ubHkiIHsKICAgICAgICAgICAgIyBCQ0w6IEFkZGVkIHRoaXMgaW4gc2luY2UgaSB3YW50IHRvIHNvdXJjZSB0aGUgdmFyaWFibGVzIHcvb3V0IGNhbGxpbmcgY2hlY2tfc2V0dXAKICAgICAgICAgICAgaWYgeyEkdmFycyhzb3VyY2VkKX0gewogICAgICAgICAgICAgICBGRl9FREk6OnNvdXJjZV9jb25maWdfZmlsZXMKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgICAgICAgaWYgeyFbcmVnZXhwICJeMTAiICRmYXJncyh2ZXJzaW9uKV0gJiYgIVtyZWdleHAgIl45IiAkZmFyZ3ModmVyc2lvbildfSB7CiAgICAgICAgICAgICAgICAgICAgIEZGX0VESTo6ZGVub3JtYWxpemVfZmlsZXMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGRhcmdzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl4xMCIgJGRhcmdzKHZlcnNpb24pXSAmJiAhW3JlZ2V4cCAiXjkiICRkYXJncyh2ZXJzaW9uKV19IHsKICAgICAgICAgICAgICAgICAgICAgRkZfRURJOjpkZW5vcm1hbGl6ZV9maWxlcwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZm9yZWFjaCBhcmcgW2pvaW4gJHZhcnMoYXJnX2xpc3QpXSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkYXJnKV19IHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncygkYXJnKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKCRhcmcpICE9ICRmYXJncygkYXJnKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IFdBUk5JTkc6IE92ZXJ3cml0aW5nIHZhcnMoJGFyZykgZnJvbSAkdmFycygkYXJnKSB0byAkZmFyZ3MoJGFyZykgLi4uIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRhcmcpICRmYXJncygkYXJnKQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAjIE9ubHkgc2V0IHRoZSBmYXJnIGlmIGl0IHdhc24ndCBzZXQgaW4gYSBjb25maWcgZmlsZQogICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKCRhcmcpXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRhcmcpICRkYXJncygkYXJnKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBmYXJncygkYXJnKV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJGFyZykgJGZhcmdzKCRhcmcpCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCRhcmcpICRkYXJncygkYXJnKQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgIEZGX0VESTo6c2VlZF92YXJpYWJsZXMKIyAgICAgICAgICAgICAgIEZGX0VESTo6Y2hlY2tfc2V0dXAKIyAgICAgICAgICAgICAgIEZGX0VESTo6bm9ybWFsaXplX2ZpbGVzIAojICAgICAgICAgICAgICAgc2V0IHZhcnMoc291cmNlZCkgdHJ1ZQogICAgICAgICAgICAgICBzZXQgdmFycyh0b3BfY2VsbCkgJHZhcnMoZGVzaWduKQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgImNoZWNrIiB7CiAgICAgICAgICAgIGlmIHskYWJvcnQgPT0gIiJ9IHsKICAgICAgICAgICAgICAgc2V0IGFib3J0ICR2YXJzKGFib3J0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBzYXZlICR2YXJzKGFib3J0KQogICAgICAgICAgICBzZXQgdmFycyhhYm9ydCkgJGFib3J0CiAgICAgICAgICAgIHNldCB2YXJzKGFib3J0KSAkc2F2ZQogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG1vZGUpXX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIGZhcmdzKG1vZGUpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyhtb2RlKSAkZmFyZ3MobW9kZSkKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMobW9kZSkgJGRhcmdzKG1vZGUpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMobW9kZSkgPT0gImhpZXIifSB7CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IEZMT1cgTU9ERSAkdmFycyhtb2RlKSBTRUxFQ1RFRCBCVVQgXCR2YXJzKHBhcnRpdGlvbl9saXN0KSBOT1QgREVGSU5FRCIKICAgICAgICAgICAgICAgICAgZXhpdCA5OQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSAhPSAiJHZhcnMocGFydGl0aW9uX2RpcikifSB7CiAgICAgICAgICAgICAgICAgIEZGX0VESTo6Y2hlY2tfc2V0dXAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBGRl9FREk6OmNoZWNrX3NldHVwCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZGOjpwcm9jZXNzX2ZpbGVfbGlzdHMKICAgICAgICAgfQoKICAgICAgICAgImFsbCIgewoKICAgICAgICAgICAgIwogICAgICAgICAgICAjIFdlIGhhdmUgYWxyZWFkeSBzb3VyY2VkIGluIGFsbCBvZiB0aGUgZmlsZXMuICBOb3cgZXhlY3V0ZSB0aGUKICAgICAgICAgICAgIyByZXN0IG9mIHRoZSBzdGVwcywgaW5jbHVkaW5nIGNoZWNrCiAgICAgICAgICAgICMKCiAgICAgICAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgICAgIHB1dHMgIjxGRj4gR2VuZXJhdGluZyBzY3JpcHRzIGZvciAkdmFycyhkZXNpZ24pIgogICAgICAgICAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICAgICAgICBleGVjdXRlX2Zsb3cgY2hlY2sgJGZvcm1hdCAkYWJvcnQKICAgICAgICAgICAgIyBCQ0w6IGNoYW5nZWQgdG8gZmlsZSBta2RpcgogICAgICAgICAgICBmaWxlIG1rZGlyICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMKCiAgICAgICAgICAgIHNldCB2YXJzKHN0ZXBzKSBbam9pbiAkdmFycyhzdGVwcyldCiAgICAgICAgICAgIHNldCB2YXJzKGFsbCkgdHJ1ZQogICAgICAgICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgICAgICAgc2V0IHRvcCAwCgogICAgICAgICAgICBpZiB7JHZhcnMobW9kZSkgPT0gImhpZXIifSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikifSB7CiAgICAgICAgICAgICAgICAgIHNldCBhbGxfc3RlcHMgJHZhcnMoZnN0ZXBzKQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgYWxsX3N0ZXBzICR2YXJzKGhzdGVwcykKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgZmhyIFtvcGVuICR2YXJzKHNjcmlwdF9wYXRoKS9JTk5PVlVTL3J1bl9hbGwudGNsIHJdIAogICAgICAgICAgICAgICBzZXQgZmh3IFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuX2FsbC50Y2wgd10gCiAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkZmhyIGxpbmVdPj0wfSB7CiAgICAgICAgICAgICAgICAgIHJlZ3N1YiAic291cmNlIEZGIiAkbGluZSAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpIiBsaW5lCiAgICAgICAgICAgICAgICAgIHB1dHMgJGZodyAiICAgJGxpbmUiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgY2xvc2UgJGZocgogICAgICAgICAgICAgICBjbG9zZSAkZmh3CiAgICAgICAgICAgICAgIHNldCBhbGxfc3RlcHMgJHZhcnMoc3RlcHMpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgIwogICAgICAgICAgICAjIEV4ZWN1dGUgZWFjaCBzdGVwIG9mIHRoZSBmbG93IGFuZCBnZXQgYSBjb21wb3NpdGUgbGlzdCBvZiB0aGUKICAgICAgICAgICAgIyBhY3R1YWwgc3RlcHMgdGhhdCBoYWQgYWN0aW9ucyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGVuIGNyZWF0ZQogICAgICAgICAgICAjIGEgTWFrZWZpbGUgZm9yIHRob3NlIHN0ZXBzCiAgICAgICAgICAgICMKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJjX3N0ZXBzKV19IHsKICAgICAgICAgICAgICAgc2V0IGFjdGlvbnMgJHZhcnMocmNfc3RlcHMpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2V0IGFjdGlvbnMgW2xpc3RdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyAKCiAgICAgICAgICAgIGZvcmVhY2ggc3RlcCAkYWxsX3N0ZXBzIHsKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmRzIFtleGVjdXRlX2Zsb3cgJHN0ZXAgJGZvcm1hdCAkYWJvcnRdCiAgICAgICAgICAgICAgIGlmIHskY29tbWFuZHMgIT0gIiJ9IHsKICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgYWN0aW9ucyAkY29tbWFuZHMKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiB7KCR2YXJzKHVzZXJfbW9kZSkgPT0gImhpZXIiKSAmJiAoJHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIycGFzcyIpfSB7CiAgICAgICAgICAgICAgICMgT25seSBnZW5lcmF0ZSBzdGVwcyB1cCB0byAoYW5kIGluY2x1ZGluZykgY3RzIGZvciAycGFzcyBmbG93cwogICAgICAgICAgICAgICAjIEdvIGFoZWFkIGFuZCBnZW5lcmF0ZSBib3RoIE1ha2VmaWxlcyBhcyB0aGUgYWN0aW9ucyBhcmUga25vd24KICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMocGxhY2Vfb3B0X2Rlc2lnbil9IHsKIyAgICAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0YWlsIFtwd2RdXSA9PSAkdmFycyh0b3BfY2VsbCl9IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIHNldCBpbmRleCBbbHNlYXJjaCAkYWN0aW9ucyAicHJlY3RzIl0KIyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBpbmRleCBbbHNlYXJjaCAkYWN0aW9ucyAicGxhY2UiXQojICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgaW5kZXggW2xzZWFyY2ggJGFjdGlvbnMgInByZWN0cyJdCiAgICAgICAgICAgICAgICAgIH0KI3B1dHMgIjE6ICRhY3Rpb25zIDogW2xyYW5nZSAkYWN0aW9ucyBbZXhwciAkaW5kZXgrMV0gZW5kXSAoW3B3ZF0pIgogICAgICAgICAgICAgICAgICBGRjo6Z2VuX21ha2VmaWxlIFtscmFuZ2UgJGFjdGlvbnMgW2V4cHIgJGluZGV4KzFdIGVuZF0gJHZhcnMobW9kZSkKICAgICAgICAgICAgICAgICAgZmlsZSBjb3B5IC1mb3JjZSBNYWtlZmlsZSBNYWtlZmlsZS5wYXNzMgogICAgICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggW2xyYW5nZSAkYWN0aW9ucyAwICRpbmRleF1dICE9IDB9IHsgCiNwdXRzICIyOiAkYWN0aW9ucyA6IFtscmFuZ2UgJGFjdGlvbnMgMCAkaW5kZXhdIChbcHdkXSkiCiAgICAgICAgICAgICAgICAgICAgIEZGOjpnZW5fbWFrZWZpbGUgW2xyYW5nZSAkYWN0aW9ucyAwICRpbmRleF0gJHZhcnMobW9kZSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgaW5kZXggW2xzZWFyY2ggJGFjdGlvbnMgImN0cyJdCiNwdXRzICIzOiAkYWN0aW9ucyA6IFtscmFuZ2UgJGFjdGlvbnMgW2V4cHIgJGluZGV4KzFdIGVuZF0gKFtwd2RdKSIKICAgICAgICAgICAgICAgICAgRkY6Omdlbl9tYWtlZmlsZSBbbHJhbmdlICRhY3Rpb25zIFtleHByICRpbmRleCsxXSBlbmRdICR2YXJzKG1vZGUpCiAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhtb2RlKSAhPSAiaGllciJ9IHsgCiAgICAgICAgICAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgTWFrZWZpbGUgTWFrZWZpbGUucGFzczIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggW2xyYW5nZSAkYWN0aW9ucyAwICRpbmRleF1dICE9IDB9IHsgCiNwdXRzICI0OiAkYWN0aW9ucyA6IFtscmFuZ2UgJGFjdGlvbnMgMCAkaW5kZXhdIChbcHdkXSkiCiAgICAgICAgICAgICAgICAgICAgIEZGOjpnZW5fbWFrZWZpbGUgW2xyYW5nZSAkYWN0aW9ucyAwICRpbmRleF0gJHZhcnMobW9kZSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiNwdXRzICI1OiAkYWN0aW9ucyAoW3B3ZF0pIgogICAgICAgICAgICAgICBGRjo6Z2VuX21ha2VmaWxlICRhY3Rpb25zICR2YXJzKG1vZGUpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHskdmFycyhlbmFibGVfcW9yX2NoZWNrKX0geyAKICAgICAgICAgICAgICAgRkZfRURJOjpnZW5fY2hlY2sKICAgICAgICAgICAgfQogICAgICAgICAgICBleGVjdXRlX2Zsb3cgZGVidWcgJGZvcm1hdCAkYWJvcnQKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJ1bl9sZWMpXSAmJiAkdmFycyhydW5fbGVjKX0gewogICAgICAgICAgICAgICBleGVjdXRlX2Zsb3cgbGVjICRmb3JtYXQgJGFib3J0CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAibGVjIiB7CiMgICAgICAgICAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgojICAgICAgICAgICAgcHV0cyAiPEZGPiBHZW5lcmF0aW5nIHNjcmlwdHMgZm9yICR2YXJzKGRlc2lnbikiCiAgICAgICAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMobmV0bGlzdCldfSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gQ2Fubm90IGdlbmVyYXRlICdsZWMnIHN0ZXAgdy9vIHZlcmlsb2cgbmV0bGlzdCBkZWZpbmVkIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAjIEJDTDogQ2hhbmdlZCB0byB0Y2wgZmlsZSBta2RpcgogICAgICAgICAgICAgICBmaWxlIG1rZGlyICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMKICAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuX2xlYy50Y2wgd10KICAgICAgICAgICAgICAgcHV0cyAkb3AgIi8vIgogICAgICAgICAgICAgICBwdXRzICRvcCAiLy8gSW5ub3Z1cyBGb3VuZGF0aW9uIEZsb3cgQ29kZSBHZW5lcmF0b3IsIFtleGVjIGRhdGVdIgogICAgICAgICAgICAgICBwdXRzICRvcCAiLy8iCiAgICAgICAgICAgICAgIGlmIHskc3RlcCA9PSAibGVjIn0gewogICAgICAgICAgICAgICAgICBwdXRzICRvcCAidGNsbW9kZSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAjcHV0cyAkb3AgImlmIHtcW2ZpbGUgZXhpc3RzIC5mZi50Y2xcXX0geyIKICAgICAgICAgICAgICAgI3B1dHMgJG9wICIgICBzb3VyY2UgLmZmLnRjbCIKICAgICAgICAgICAgICAgI3B1dHMgJG9wICJ9IgogICAgICAgICAgICAgICBzZXQgdmFyc0ZpbGUgW0ZGOjpyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9kaXIpL3ZhcnMudGNsXSBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV1dCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJpZiB7XFtmaWxlIGV4aXN0cyAkdmFyc0ZpbGVcXX0geyIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHNvdXJjZSAkdmFyc0ZpbGUiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJ9IgojICAgICAgICAgICAgICAgcHV0cyAkb3AgInNvdXJjZSBcJHZhcnMoc2NyaXB0X2RpcikvcHJvY3MudGNsIgogICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgc3luXyAkc3RlcF19IHsKICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJzb3VyY2UgJHZhcnMoc2NyaXB0X2RpcikvcHJvY3MudGNsIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IEdlbmVyYXRpbmcgc3RlcCAkc3RlcCIKICAgICAgICAgICAgICAgc2V0IGNvbW1hbmRzIFtGRl9FREk6OnJ1bl9sZWNdCiAgICAgICAgICAgICAgIHB1dHMgJG9wIFtGRjo6cHJldHR5X3ByaW50ICRjb21tYW5kcyAkZm9ybWF0XQogICAgICAgICAgICAgICBjbG9zZSAkb3AKICAgICAgICAgICAgfQojICAgICAgICAgICAgRkY6Omdlbl9tYWtlZmlsZSBsZWMgJHZhcnMobW9kZSkKICAgICAgICAgfQogICAgICAgICAiZGVmYXVsdCIgewoKICAgICAgICAgICAgIwogICAgICAgICAgICAjIFJ1biBlYWNoIHN0ZXAgZWl0aGVyIHNpbmd1YXJseSBvciByZWN1cnNpdmVseQogICAgICAgICAgICAjCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBDcmVhdGUgdGhlIGxpc3Qgb2YgY29tbWFuZHMgdGhhdCBoYXBwZW4gYXQgdGhlIGJlZ2luaW5nIG9mCiAgICAgICAgICAgICMgZWFjaCBzY3JpcHQKICAgICAgICAgICAgIwoKICAgICAgICAgICAgaWYgeyhbbHNlYXJjaCAkdmFycyhzdGVwcykgJHN0ZXBdID09IC0xKSAmJiAoJHN0ZXAgIT0gImRlYnVnIil9IHsKICAgICAgICAgICAgICAgcHV0cyAgIjxGRj4gRVJST1I6IFVua25vd24gRm91bmRhdGlvbiBGbG93IHN0ZXAgXCIkc3RlcFwiLiIKICAgICAgICAgICAgICAgZXhpdCA5OQogICAgICAgICAgICB9CgojICAgICAgICAgICAgaWYgeyhbbHNlYXJjaCAkdmFycyhzdGVwcykgJHN0ZXBdID09IC0xKSAmJiAoJHN0ZXAgIT0gImRlYnVnIil9IHsKIyAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IEVSUk9SOiBVbmtub3duIEZvdW5kYXRpb24gRmxvdyBzdGVwIFwiJHN0ZXBcIi4iCiMgICAgICAgICAgICAgICBleGl0IDk5CiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgaWYgeygkdmFycyhmaXhfaG9sZCkgfHwgKCEkdmFycyhmaXhfaG9sZCkgJiYgIVtyZWdleHAgIl9ob2xkIiAkc3RlcF0pKSAmJgojICAgICAgICAgICAgICAgICAgICEoJHZhcnMoc2tpcF9jdHMpICYmICgoJHN0ZXAgPT0gImN0cyIpIHx8IFtyZWdleHAgInBvc3RjdHMiICRzdGVwXSkpfSB7CiMgICAgICAgICAgICAgICAgICBwdXRzICAiPEZGPiBHZW5lcmF0aW5nIHN0ZXAgJHN0ZXAiCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICB9CgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB3ZSBjaGVjayB0aGUgdmFyaWFibGUgY29udGVudHMgYW5kCiAgICAgICAgICAgICMgaW5pdGlhbGl6ZSB0aGUgZmxvdyBhdCBsZWFzdCBvbmNlIGluIGEgZ2l2ZW4gcnVuLCBubyBtYXR0ZXIKICAgICAgICAgICAgIyB3aGF0IHN0ZXAgdGhlIHVzZXIgd2FudHMgdG8gZXhlY3V0ZQogICAgICAgICAgICAjCgojICAgICAgICAgICAgc2V0IGhlYWRlciAiXG4jXG4jIENvbW1hbmRzIGZvciAkc3RlcFxuI1xuXG4iCgogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGFsbCldfSB7CiAgICAgICAgICAgICAgIGV4ZWN1dGVfZmxvdyBjaGVjayAkZm9ybWF0ICRhYm9ydAogICAgICAgICAgICB9CiAgICAgICAgICAgICMgQkNMOiBDaGFuZ2VkIHRvIHRjbCBmaWxlIG1rZGlyCiAgICAgICAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUwogICAgICAgICAgICBzZXQgY29tbWFuZHMgIiIKIyAgICAgICAgICAgIHNldCBjb21tYW5kcyAicG9zdC0xMC4xMC1iMDA5XG4iCiAgICAgICAgICAgIGlmIHshJHZhcnMoaW5pdGlhbGl6ZWQpfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKHN0ZXApICRzdGVwCiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkZfRURJOjppbml0aWFsaXplX2Zsb3ddCiMgICAgICAgICAgICAgICB1bnNldCB2YXJzKHN0ZXApCiAgICAgICAgICAgICAgIHNldCB2YXJzKGluaXRfY29tbWFuZHMpICRjb21tYW5kcwogICAgICAgICAgICAgICBzZXQgdmFycyhpbml0aWFsaXplZCkgMQogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHdhcm5pbmdfY291bnQpXX0gewogICAgICAgICAgICAgICAgICBzZXQgdmFycyh3YXJuaW5nX2NvdW50KSAwCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhlcnJvcl9jb3VudCldfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGVycm9yX2NvdW50KSAwCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIwogICAgICAgICAgICAjIEdldCB0aGUgY29tbWFuZHMgdG8gZXhlY3V0ZSB0aGUgc3RlcC4gIFdlIGFsc28gbmVlZCB0byBnZXQgdGhlCiAgICAgICAgICAgICMgY29tbWFuZHMgdG8gbG9hZCB0aGUgZGF0YWJhc2UgZm9yIHRoYXQgc3RlcCwgYXNzdW1pbmcgdGhhdCBhCiAgICAgICAgICAgICMgZGF0YWJhc2UgZXhpc3RzIGZyb20gYSBwcmlvciBzdGVwLiAgVGhvc2UgbG9hZCBjb21tYW5kcyBhcmUKICAgICAgICAgICAgIyBwcmVwZW5kZWQgdG8gdGhlIGV4ZWN1dGlvbiBjb21tYW5kcy4gIFNhdmUgY29tbWFuZHMgYXJlCiAgICAgICAgICAgICMgYXBwZW5kZWQKICAgICAgICAgICAgIwoKICAgICAgICAgICAgaWYge1tpbmZvIGNvbW1hbmRzIDo6RkZfRURJOjpydW5fJHN0ZXBdIG5lICIifSAgewogICAgICAgICAgICAgICBzZXQgdGVtcF9jb21tYW5kcyBbRkZfRURJOjpydW5fJHN0ZXAgJGZvcm1hdF0KICAgICAgICAgICAgICAgaWYgeyR0ZW1wX2NvbW1hbmRzID09ICIifSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoc3RlcCkgIT0gImluaXQifSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBzdGVwX2NvbW1hbmRzICJcbiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhyZXBvcnRfcnVuX3RpbWUpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICJzZXQgdmFycyhzdGVwKSAke3N0ZXB9XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICJzZXQgdmFycygke3N0ZXB9LHN0YXJ0X3RpbWUpIFxbY2xvY2sgc2Vjb25kc1xdXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGNhcHR1cmVfbWV0cmljcyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTN9IHsKIyAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHN0ZXBfY29tbWFuZHMgInVtOjplbmFibGVfbWV0cmljcyAtb25cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHRzcKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocHVzaGVkKV0gfHwgKFtpbmZvIGV4aXN0cyB2YXJzKHB1c2hlZCldICYmICEkdmFycyhwdXNoZWQpKSB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHN0ZXBfY29tbWFuZHMgInVtOjpwdXNoX3NuYXBzaG90X3N0YWNrXG4iCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhwdXNoZWQpIHRydWUKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICR0ZW1wX2NvbW1hbmRzCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iCiAgICAgICAgICAgICAgICAgIHB1dHMgICI8RkY+IEdlbmVyYXRpbmcgc3RlcCAkc3RlcCIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3VzdG9tX3N0ZXBfZGlyKV19IHsKICAgICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkdmFycyhjdXN0b21fc3RlcF9kaXIpL3J1bl8ke3N0ZXB9LnRjbF19IHsKICAgICAgICAgICAgICAgICAgcHV0cyAgIjxGRj4gR2VuZXJhdGluZyBzdGVwICRzdGVwIgogICAgICAgICAgICAgICAgICBzZXQgZmhyIFtvcGVuICR2YXJzKGN1c3RvbV9zdGVwX2RpcikvcnVuXyRzdGVwLnRjbCByXQogICAgICAgICAgICAgICAgICBzZXQgc3RlcF9jb21tYW5kcyAiXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAiIyBTb3VyY2luZyBjdXN0b20gc2NyaXB0IC4uLlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHJlcG9ydF9ydW5fdGltZSkgJiYgKCRzdGVwICE9ICJpbml0Iil9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHN0ZXBfY29tbWFuZHMgInNldCB2YXJzKHN0ZXApICR7c3RlcH1cbiIKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHN0ZXBfY29tbWFuZHMgInNldCB2YXJzKCR7c3RlcH0sc3RhcnRfdGltZSkgXFtjbG9jayBzZWNvbmRzXF1cbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoY2FwdHVyZV9tZXRyaWNzKSAmJiAoJHZhcnMoc3RlcCkgIT0gImluaXQiKX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPiAxM30gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAidW06OmVuYWJsZV9tZXRyaWMgLW9uXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICJ1bTo6cHVzaF9zbmFwc2hvdF9zdGFja1xuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIHN0ZXBfY29tbWFuZHMgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIKICAgICAgICAgICAgICAgICAgd2hpbGUge1tnZXRzICRmaHIgbGluZV0+PTB9IHsKICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBzdGVwX2NvbW1hbmRzICIkbGluZVxuIgogICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAic291cmNlICR2YXJzKGN1c3RvbV9zdGVwX2RpcikvcnVuXyRzdGVwLnRjbFxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgc3RlcF9jb21tYW5kcyAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBVbmFibGUgdG8gZ2VuZXJhdGUgc3RlcCAkc3RlcCIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkdmFycyhlcnJvcl9jb3VudCkpICJVbmFibGUgdG8gZ2VuZXJhdGUgc3RlcCAkc3RlcCAtIHByb2NlZHVyZSAncnVuXyRzdGVwJyBtdXN0IGJlIGRlZmluZWQgb3IgYSBcJHZhcnMoY3VzdG9tX3N0ZXBfZGlyKS9ydW5fJHN0ZXAudGNsIGZpbGUgbXVzdCBiZSBwcm92aWRlZCIKICAgICAgICAgICAgICAgICAgaW5jciB2YXJzKGVycm9yX2NvdW50KQogICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBVbmFibGUgdG8gZ2VuZXJhdGUgc3RlcCAkc3RlcCIKICAgICAgICAgICAgICAgICAgc2V0IGVycm9ycygkdmFycyhlcnJvcl9jb3VudCkpICJVbmFibGUgdG8gZ2VuZXJhdGUgc3RlcCAkc3RlcCAtIHByb2NlZHVyZSAncnVuXyRzdGVwJyBtdXN0IGJlIGRlZmluZWQgb3IgYSBcJHZhcnMoY3VzdG9tX3N0ZXBfZGlyKS9ydW5fJHN0ZXAudGNsIGZpbGUgbXVzdCBiZSBwcm92aWRlZCIKICAgICAgICAgICAgICAgaW5jciB2YXJzKGVycm9yX2NvdW50KQogICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgfQojICAgICAgICAgICAgc2V0IHRoaXNfaW5kZXggW2xzZWFyY2ggJHZhcnMoc3RlcHMpICRzdGVwXQojICAgICAgICAgICAgc2V0IHByaW9yIFtsaW5kZXggJHZhcnMoc3RlcHMpIFtleHByICR0aGlzX2luZGV4IC0gMV1dCiMjICAgICAgICAgICAgaWYgeyEkdmFycyhmaXhfaG9sZCkgJiYgW3JlZ2V4cCBfaG9sZCAkcHJpb3JdfSB7CiMjICAgICAgICAgICAgICAgc2V0IHByaW9yIFtsaW5kZXggJHZhcnMoc3RlcHMpIFtleHByICR0aGlzX2luZGV4IC0gMl1dCiMjICAgICAgICAgICAgICAgaWYge1tyZWdleHAgX2hvbGQgJHByaW9yXX0gewojIyAgICAgICAgICAgICAgICAgIHNldCBwcmlvciBbbGluZGV4ICR2YXJzKHN0ZXBzKSBbZXhwciAkdGhpc19pbmRleCAtIDNdXQojIyAgICAgICAgICAgICAgIH0KIyMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7W3JlZ2V4cCBfaG9sZCAkcHJpb3JdICYmIChbbHNlYXJjaCAkdmFycyhmaXhfaG9sZCkgW3JlZ3N1YiBfaG9sZCAkcHJpb3IgIiJdXTwwKX0gewojICAgICAgICAgICAgICAgc2V0IHByaW9yIFtsaW5kZXggJHZhcnMoc3RlcHMpIFtleHByICR0aGlzX2luZGV4IC0gMl1dCiMgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCBfaG9sZCAkcHJpb3JdICYmIChbbHNlYXJjaCAkdmFycyhmaXhfaG9sZCkgW3JlZ3N1YiBfaG9sZCAkcHJpb3IgIiJdXTwwKX0gewojICAgICAgICAgICAgICAgICAgc2V0IHByaW9yIFtsaW5kZXggJHZhcnMoc3RlcHMpIFtleHByICR0aGlzX2luZGV4IC0gM11dCiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7KCRzdGVwID09ICJjdHMiKSAmJiAkdmFycyhwbGFjZV9vcHRfZGVzaWduKX0gewojICAgICAgICAgICAgICAgc2V0IHByaW9yICJwbGFjZSIKIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHsoJHN0ZXAgPT0gInJvdXRlIikgJiYgJHZhcnMoc2tpcF9jdHMpfSB7CiMgICAgICAgICAgICAgICBzZXQgcHJpb3IgInByZWN0cyIKIyAgICAgICAgICAgIH0KIyMgICAgICAgICAgICBpZiB7KCRzdGVwID09ICJyb3V0ZSIpICYmIFtyZWdleHAgIl5jY29wdCIgW3N0cmluZyB0b2xvd2VyICR2YXJzKGN0c19lbmdpbmUpXV19IHsKIyMgICAgICAgICAgICAgICBzZXQgcHJpb3IgImN0cyIKIyMgICAgICAgICAgICB9CiMgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXmNjb3B0IiBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoY3RzX2VuZ2luZSldXX0gewojICAgICAgICAgICAgICAgaWYgeyhbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZml4X2hvbGQpXSAhPSAiZmFsc2UiKX0gewojICAgICAgICAgICAgICAgICAgaWYgeygkc3RlcCA9PSAicG9zdGN0c19ob2xkIikgJiYgW2xzZWFyY2ggJHZhcnMoZml4X2hvbGQpICRzdGVwXX0gewojICAgICAgICAgICAgICAgICAgICAgc2V0IHByaW9yIGN0cwojICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgICAgIGlmIHsoJHN0ZXAgPT0gInJvdXRlIil9IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIHNldCBwcmlvciBjdHMKIyAgICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICBpZiB7KCRzdGVwID09ICJyb3V0ZSIpfSB7CiMgICAgICAgICAgICAgICAgICAgICBzZXQgcHJpb3IgY3RzCiMgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICB9CgogICAgICAgICAgICBzZXQgdGhpc19pbmRleCBbbHNlYXJjaCBbRkY6OmFkanVzdF9zdGVwc10gJHN0ZXBdCiAgICAgICAgICAgIHNldCBwcmlvciBbbGluZGV4IFtGRjo6YWRqdXN0X3N0ZXBzXSBbZXhwciAkdGhpc19pbmRleCAtIDFdXQogICAgICAgICAgICBzZXQgbm9fZGJfc3RlcHMgW2xpc3QgImluaXQiICJyZWJ1ZGdldCIgImZsZXhpbG0iICJhc3NlbWJsZSIgImFzc2VtYmxlX2ZsZXhpbG0iICJkZWJ1ZyJdCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1c2VfZmxleG1vZGVscyldICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewogICAgICAgICAgICAgICBsYXBwZW5kIG5vX2RiX3N0ZXBzICJtb2RlbF9nZW4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGxhcHBlbmQgbm9fZGJfc3RlcHMgImZlZWR0aHJvdWdoIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJG5vX2RiX3N0ZXBzICRzdGVwXSA9PSAtMSkgJiYgKCRwcmlvciAhPSAiIil9IHsKICAgICAgICAgICAgICAgc2V0IGxvYWRfY29tbWFuZHMgW0ZGX0VESTo6bG9hZF9kZXNpZ24gJHByaW9yICRzdGVwXQojICAgICAgICAgICAgICAgc2V0IHJlc3RvcmVfY29tbWFuZHMgW2xpbmRleCBbRkZfRURJOjpsb2FkX2Rlc2lnbiAkZm9ybWF0ICRwcmlvcl0gMV0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGxvYWRfY29tbWFuZHMgIiIKIyAgICAgICAgICAgICAgIHNldCByZXN0b3JlX2NvbW1hbmRzICIiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIHshJHZhcnMobG9hZGVkKX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhsb2FkZWQpIDEKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRsb2FkX2NvbW1hbmRzCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW9kZWxfZ2VuIHNhdmVzIGl0cyBkYXRhYmFzZSBleHBsaWNpdGx5CiMgICAgICAgICAgICBzZXQgbm9fc2F2ZV9zdGVwcyBbbGlzdCAiZGVidWciICJtb2RlbF9nZW4iXQogICAgICAgICAgICBzZXQgbm9fc2F2ZV9zdGVwcyBbbGlzdCAiZGVidWciXQogICAgICAgICAgICBpZiB7W2xzZWFyY2ggJG5vX3NhdmVfc3RlcHMgJHN0ZXBdID09IC0xfSB7CiAgICAgICAgICAgICAgIHNldCBzYXZlX2NvbW1hbmRzIFtGRl9FREk6OnNhdmVfcmVzdWx0cyAkc3RlcCAkZm9ybWF0XQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgc2F2ZV9jb21tYW5kcyAiIgogICAgICAgICAgICB9CgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgV3JpdGUgdGhlIGNvbW1hbmRzIHRvIGEgZmlsZSwgbmFtZWQgZm9yIHRoZSBzdGVwIHdlIGFyZQogICAgICAgICAgICAjIGV4ZWN1dGluZwogICAgICAgICAgICAjCgogICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXnN5biIgJHN0ZXBdfSB7CiAgICAgICAgICAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikvR0VOVVMKICAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0dFTlVTL3J1bl8ke3N0ZXB9LnRjbCB3XQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy9ydW5fJHtzdGVwfS50Y2wgd10KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgeyR2YXJzKGRlYnVnKX0gewojICAgICAgICAgICAgICAgcHV0cyAiPERFQlVHPiBPcGVuaW5nIGZpbGU6ICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuXyR7c3RlcH0udGNsIGluIFtleGVjIHB3ZF0gLT4gJG9wIgogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXRzICRvcCBbc3RyaW5nIHJlcGVhdCAiIyIgNjhdCiAgICAgICAgICAgIHB1dHMgJG9wICIjIElubm92dXMgRm91bmRhdGlvbiBGbG93IENvZGUgR2VuZXJhdG9yLCBbZXhlYyBkYXRlXSIKICAgICAgICAgICAgcHV0cyAkb3AgIiMgVmVyc2lvbiA6IDE3LjEwLXAwMDNfMSIKICAgICAgICAgICAgcHV0cyAkb3AgW3N0cmluZyByZXBlYXQgIiMiIDY4XQoKICAgICAgICAgICAgaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSJ9IHsKICAgICAgICAgICAgICAgc2V0IHZhcnNGaWxlIFtGRjo6cmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhzY3JpcHRfZGlyKS92YXJzLnRjbF0gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJ1bmRpcildXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdmFyc0ZpbGUgJHZhcnMoc2NyaXB0X2RpcikvdmFycy50Y2wKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcCAiXG5pZiB7XFtmaWxlIGV4aXN0cyAkdmFyc0ZpbGVcXX0geyIKICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHNvdXJjZSAkdmFyc0ZpbGUiCiAgICAgICAgICAgIHB1dHMgJG9wICJ9IgogICAgICAgICAgICAjcHV0cyAkb3AgImlmIHtcW2ZpbGUgZXhpc3RzIFwkdmFycyhzY3JpcHRfZGlyKS92YXJzLnRjbFxdfSB7IgogICAgICAgICAgICAjcHV0cyAkb3AgIiAgIHNvdXJjZSBcJHZhcnMoc2NyaXB0X2RpcikvdmFycy50Y2wiCiAgICAgICAgICAgICNwdXRzICRvcCAifVxuIgogICAgICAgICAgICBpZiB7ISR2YXJzKGZyZWV6ZV92YXJzKX0gewogICAgICAgICAgICAgICBpZiB7KFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSIpICYmICFbcmVnZXhwIHN5bl8gJHN0ZXBdfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJmb3JlYWNoIGZpbGUgXCR2YXJzKGNvbmZpZ19maWxlcykgeyIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHNvdXJjZSBcJGZpbGUiCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJ9XG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQojICAgICAgICAgICAgcHV0cyAkb3AgInNvdXJjZSBcJHZhcnMoc2NyaXB0X2RpcikvcHJvY3MudGNsIgogICAgICAgICAgICBwdXRzICRvcCAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL3Byb2NzLnRjbCIKICAgICAgICAgICAgaWYgeyEkZm9ybWF0fSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICRoZWFkZXIKICAgICAgICAgICAgfQogICAgICAgICAgICByZWdzdWIgLWFsbCAiaW5pdCwiICR2YXJzKGluaXRfY29tbWFuZHMpICIkc3RlcCwiIGNvbW1hbmRzCiAgICAgICAgICAgIHNldCBvZiBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy5oZWFkIHddCiAgICAgICAgICAgIHB1dHMgJG9mIFtGRjo6cHJldHR5X3ByaW50ICR2YXJzKGluaXRfY29tbWFuZHMpICRmb3JtYXRdCiAgICAgICAgICAgIGNsb3NlICRvZiAKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICRsb2FkX2NvbW1hbmRzICRzdGVwX2NvbW1hbmRzICRzYXZlX2NvbW1hbmRzCiAgICAgICAgICAgIGxhcHBlbmQgdmFycyhic3RlcHMpICRzdGVwCiAgICAgICAgICAgIHNldCBvZiBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy5sb2FkXyRzdGVwIHddCiMgICAgICAgICAgICBwdXRzICRvZiBbRkY6OnByZXR0eV9wcmludCAkcmVzdG9yZV9jb21tYW5kcyAkZm9ybWF0XQogICAgICAgICAgICBwdXRzICRvZiBbRkY6OnByZXR0eV9wcmludCAkbG9hZF9jb21tYW5kcyAkZm9ybWF0XQogICAgICAgICAgICBjbG9zZSAkb2YKICAgICAgICAgICAgc2V0IG9mIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLiRzdGVwIHddCiAgICAgICAgICAgIHB1dHMgJG9mIFtGRjo6cHJldHR5X3ByaW50ICRzdGVwX2NvbW1hbmRzICRmb3JtYXRdCiAgICAgICAgICAgIHB1dHMgJG9mIFtGRjo6cHJldHR5X3ByaW50ICRzYXZlX2NvbW1hbmRzICRmb3JtYXRdCiAgICAgICAgICAgIGNsb3NlICRvZgojICAgICAgICAgICAgaWYge1tyZWdleHAgInBvc3Ryb3V0ZV9zaSIgJHN0ZXBdICYmICRza2lwX2NvbW1hbmRzICE9ICIifSB7CiMgICAgICAgICAgICAgICBzZXQgY29tbWFuZHMgJHNraXBfY29tbWFuZHMKIyAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyEkZm9ybWF0fSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kcyBbRkY6OnN0cmlwX2xpbmVzICRjb21tYW5kcyBbbGlzdCAicHV0cyIgIiMiXV0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMoY2F0Y2hfZXJyb3JzKSAmJiAoJHN0ZXAgIT0gImRlYnVnIil9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlxuaWYgeyBcW2NhdGNoIHtcbiIKICAgICAgICAgICAgICAgcHV0cyAkb3AgW0ZGOjpwcmV0dHlfcHJpbnQgJGNvbW1hbmRzICRmb3JtYXRdCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJ9IHN0ZXBfZXJyb3JcXX0ge1xuIgogICAgICAgICAgICAgICBwdXRzICRvcCAiICAgUHV0cyBcIjxGRj4gPT09PT09PT09PT0gU1RFUCBFWEVDVVRJT04gRVJST1IgPT09PT09PT09PT09XCIiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICBQdXRzIFwiPEZGPiBFUlJPUiBSVU5OSU5HIFNURVAgJyRzdGVwJ1wiIgogICAgICAgICAgICAgICBpZiB7JHZhcnMoc2F2ZV9vbl9jYXRjaCl9IHsKICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgIl5zeW4iICR2YXJzKHN0ZXApXX0gewogICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICB3cml0ZV9kYiAkdmFycyhkZXNpZ24pIC1hbGxfcm9vdF9hdHRyaWJ1dGVzIC10b19maWxlICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLmNhdGNoLmRiXG4iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICBQdXRzIFwiPEZGPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIiIKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIFB1dHMgXCI8RkY+IC4uLiBTQVZJTkcgREVTSUdOIFRPICR2YXJzKGRic19kaXIpLyR2YXJzKHN0ZXApLmNhdGNoLmVuY1wiIgogICAgICAgICAgICAgICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIC1ub2Nhc2UgJHZhcnMoZGJzX2Zvcm1hdCkgIm9hIl09PTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdID4gMTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIHNhdmVEZXNpZ24gLWNlbGx2aWV3IHskdmFycyhvYV9kZXNpZ25fbGliKSAkdmFycyhkZXNpZ24pICR2YXJzKHN0ZXApLmNhdGNofVxuIgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiICAgc2F2ZU9hRGVzaWduICR2YXJzKG9hX2Rlc2lnbl9saWIpICR2YXJzKGRlc2lnbikgJHZhcnMoc3RlcCkuY2F0Y2hcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiICAgc2F2ZURlc2lnbiAkdmFycyhkYnNfZGlyKS8kdmFycyhzdGVwKS5jYXRjaC5lbmMgLWNvbXByZXNzXG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICBwdXRzICRvcCAiICAgUHV0cyBcIjxGRj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXCIiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICBQdXRzIFwiPEZGPiBcJHN0ZXBfZXJyb3JcIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIFB1dHMgXCI8RkY+IC0tLS0tLS0tLS0tLS0tLS0tLS0gREVUQUlMUyAtLS0tLS0tLS0tLS0tLS0tLS1cIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIFB1dHMgXCI8RkY+IFwkZXJyb3JJbmZvXCIiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICIgICBQdXRzIFwiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgICAgIGlmIHskdmFycyhiYXRjaCl9IHsKIyAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGV4aXRfb25fZXJyb3IpfSB7CiAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiAgIGV4aXQgLTEiCiMgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICRvcCAifSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgW0ZGOjpwcmV0dHlfcHJpbnQgJGNvbW1hbmRzICRmb3JtYXRdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGJhdGNoKSAmJiAoJHN0ZXAgIT0gImRlYnVnIil9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgImlmIHshXFtpbmZvIGV4aXN0cyB2YXJzKHNpbmdsZSlcXX0ge1xuICAgZXhpdCAwXG59XG4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UgJG9wCiAgICAgICAgICAgIHNldCBzY29tbWFuZHMgW3NwbGl0ICRjb21tYW5kcyAiXG4iXQogICAgICAgICAgICBpZiAkdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKSB7CiAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwIHN5bl8gJHN0ZXBdfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCB2YXJzKGZsb3dfc3RlcHMpICJcbmNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgJHN0ZXAgXHtcbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcykgIlxuY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSAkc3RlcCBce1xuICAgZXZhbF9sZWdhY3kgXHtcbiAiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhoc3RlcHMpICRzdGVwXSAhPSAtMSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxoaWVyKSAiXG5jcmVhdGVfZmxvd19zdGVwIC1uYW1lICRzdGVwIFx7XG4gICBldmFsX2xlZ2FjeSBce1xuICIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgc3luXyAkc3RlcF19IHsgCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB2YXJzKGZsb3dfc3RlcHMsZmxhdCkgIlxuY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSAkc3RlcCBce1xuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcbmNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgJHN0ZXAgXHtcbiAgIGV2YWxfbGVnYWN5IFx7XG4gIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IHNraXAgMAogICAgICAgICAgICAgICBmb3JlYWNoIGxpbmUgJHNjb21tYW5kcyB7CiAgICAgICAgICAgICAgICAgIGlmIHskc2tpcCAhPSAwfSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCBza2lwIFtleHByICRza2lwLTFdCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgZmZfcHJvY3MgJGxpbmVdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgIiMiICRsaW5lXX0geyBjb250aW51ZSB9CiAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJQdXRzIiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiVlBBVEgiICRsaW5lXX0geyBjb250aW51ZSB9CiAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJzZXQgdmFycyIgJGxpbmVdICYmICFbcmVnZXhwICIscG9zdF9jdHNfc2RjIiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7JHN0ZXAgIT0gImluaXQifSB7CiMgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicmVzdG9yZV9kZXNpZ24iICRsaW5lXX0geyBzZXQgc2tpcCA3OyBjb250aW51ZSB9CiAgICAgICAgICAgICAgICAgICAgIGlmIHshKCgkc3RlcCA9PSAiY3RzIikgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pKX0geyAKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgInJlc3RvcmVEZXNpZ24iICRsaW5lXX0geyBjb250aW51ZSB9CiAgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicmVzdG9yZURlc2lnbiIgJGxpbmVdfSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGxpbmUgW3N0cmluZyB0cmltIFtsaW5kZXggJGxpbmUgMl1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgbGluZSAicmVzdG9yZURlc2lnbiBcW2ZpbGUgdGFpbCBcW3B3ZFxdXF1fcG9zdEVDTy5lbmMuZGF0IFxbZmlsZSB0YWlsIFxbcHdkXF1cXSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJyZXN0b3JlRGVzaWduIiAkbGluZV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBsaW5lICJyZXN0b3JlRGVzaWduIC4gXFtmaWxlIHRhaWwgXFtwd2RcXV0iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAic2F2ZURlc2lnbiIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgIm1ldHJpYyIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgInNuYXBzaG90IiAkbGluZV19IHsgY29udGludWUgfQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicmVwb3J0X21ldHJpYyIgJGxpbmVdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgaWYgeyRsaW5lID09ICIifSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcykgIlx0JGxpbmVcbiIKICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhoc3RlcHMpICRzdGVwXSAhPSAtMSl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxoaWVyKSAiXHQkbGluZVxuIgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcdCRsaW5lXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzKSAiXH1cbiIKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhzdGVwcyldICYmIChbbHNlYXJjaCAkdmFycyhoc3RlcHMpICRzdGVwXSAhPSAtMSl9IHsKICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxoaWVyKSAiXG4gICBcfVxuIgogICAgICAgICAgICAgICAgICBpZiB7JHN0ZXAgPT0gInBhcnRpdGlvbiJ9IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBwICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiMgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGhpZXIpICJcbiAgc2NoZWR1bGVfZmxvdyAtZmxvdyAkcCAtZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGhpZXIpICJcbiAgc2NoZWR1bGVfZmxvdyAtZmxvdyBibG9jayAtZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxoaWVyKSAiXG5cfVxuIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiB7KFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dID09ICIkdmFycyhwYXJ0aXRpb25fZGlyKSIpICYmICgkc3RlcCA9PSAic2lnbm9mZiIpfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgJHZhcnMoZGVzaWduKV0gPT0gLTF9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG4gICBcfVxuIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcbiAgc2NoZWR1bGVfZmxvdyAtZmxvdyBmaW5hbF9hc3NlbWJseSIKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG5cfVxuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcbiAgIFx9XG4iCiMgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB2YXJzKGZsb3dfc3RlcHMsZmxhdCkgIlxuICBzY2hlZHVsZV9mbG93IC1mbG93ICR2YXJzKHRvcF9jZWxsKSAtZGlyICR2YXJzKHBhcnRpdGlvbl9kaXIpLyR2YXJzKHRvcF9jZWxsKSIKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG4gIHNjaGVkdWxlX2Zsb3cgLWZsb3cgdG9wIC1kaXIgJHZhcnMocGFydGl0aW9uX2RpcikvJHZhcnModG9wX2NlbGwpIgogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcblx9XG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgc3luXyAkc3RlcF19IHsgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhyYyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9yY3ApICYmICgkc3RlcCA9PSAic3luX3BsYWNlIil9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiXG4gIHNjaGVkdWxlX2Zsb3cgLWZsb3cgaW5ub3Z1cyAtZGIgXCIkdmFycyhkYnNfZGlyKS9zeW5fcGxhY2Uvc3luX3BsYWNlLm5vdnVzX3NldHVwLnRjbFwiXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIHshJHZhcnMoZW5hYmxlX3JjcCkgJiYgKCR2YXJzKHN0ZXApID09ICJzeW5faW5jciIpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB2YXJzKGZsb3dfc3RlcHMsZmxhdCkgIlxuICBzY2hlZHVsZV9mbG93IC1mbG93IGlubm92dXMgLWRiIFwiJHZhcnMoZGJzX2Rpcikvc3luX2luY3Ivc3luX2luY3Iubm92dXNfc2V0dXAudGNsXCJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcfVxuIgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdmFycyhmbG93X3N0ZXBzLGZsYXQpICJcfVxuXH1cbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gICAgCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldCBhY3Rpb24gJHN0ZXAKCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgIwogICAgICAjIENyZWF0ZSBhIGZpbGUgdGhhdCBzZXRzIHVwIGFsbCBvZiB0aGUgdmFyaWFibGUgc2V0dGluZ3MgdGhhdCB3ZXJlCiAgICAgICMgdXNlZCBpbiB0aGlzIGludm9jYXRpb24KICAgICAgIwoKICAgIyBHREcgLSBpcyB0aGlzIG5lZWRlZCBhbnltb3JlCiAgIGlmIHswfSB7CiAgICAgICMgQkNMOiBDaGFuZ2VkIHRvIHRjbCBmaWxlIG1rZGlyCiAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikKICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL3ZhcnMudGNsIHddCiAgICAgIHB1dHMgJG9wICIjIHRoaXMgaXMgdGhlIG9uZSIKICAgICAgcHV0cyAkb3AgImlmIHshXFtpbmZvIGV4aXN0cyB2YXJzXF19IHsiCiAgICAgIHB1dHMgJG9wICIgICBnbG9iYWwgdmFycyIKICAgICAgcHV0cyAkb3AgIn0iCiMgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModXNlcl9hcnJheXMpXX0gewojICAgICAgICAgZm9yZWFjaCBhcnJheSAkdmFycyh1c2VyX2FycmF5cykgewojICAgICAgICAgICAgcHV0cyAkb3AgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgojICAgICAgICAgICAgcHV0cyAkb3AgImdsb2JhbCAkYXJyYXkiCiMgICAgICAgICAgICBzZXQgY21kICAiYXJyYXkgbmFtZXMgJGFycmF5IgojICAgICAgICAgICAgc2V0IHV2YXJzIFtldmFsICRjbWRdCiMgICAgICAgICAgICBmb3JlYWNoIHZhciAkdXZhcnMgewojICAgICAgICAgICAgICAgaWYge1tyZWdleHAge1wkfSAkdmFycygkdmFyKV19IHsKIyAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldCAkYXJyYXkoJHZhcikgXCIkJGFycmF5KCR2YXIpXCIiCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICBwdXRzICRvcCAic2V0ICRhcnJheSgkdmFyKSBceyRhcnJheSgkdmFyKVx9IgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQojICAgICAgICAgfQojICAgICAgfQogICAgICAjIyBCQ0w6IEFkZGVkIHNvdXJjaW5nIC5mZi50Y2wgdG8gdmFycy50Y2wKICAgICAgI3B1dHMgJG9wICJpZiB7XFtmaWxlIGV4aXN0cyAuZmYudGNsXF19IHsiCiAgICAgICNwdXRzICRvcCAiICBzb3VyY2UgLmZmLnRjbCIKICAgICAgI3B1dHMgJG9wICJ9IgogICAgICBwdXRzICRvcCAiZ2xvYmFsIGVudlxuXG4iCiAgICAgIHB1dHMgJG9wICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgcHV0cyAkb3AgInNldCBlbnYoVlBBVEgpICRlbnYoVlBBVEgpIgogICAgICBwdXRzICRvcCAic2V0IHZhcnMocnVuZGlyKSAkdmFycyhydW5kaXIpIgogICAgICBmb3JlYWNoIHZhciBbbHNvcnQgW2FycmF5IG5hbWVzIHZhcnNdXSB7CiAgICAgICAgICMgQkNMOiBPbmx5IHdyaXRlIG91dCB2YXJpYWJsZSB2YWx1ZXMgaW4gY3VybGllcyBpZiBub3QgdXNpbmcgJHZhcnMoKSBpbiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlCiAgICAgICAgIGlmIHtbcmVnZXhwIHtcJH0gJHZhcnMoJHZhcildfSB7CiAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIFwiJHZhcnMoJHZhcilcIiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikgXHskdmFycygkdmFyKVx9IgogICAgICAgICB9CiAgICAgIH0KICAgICAgcHV0cyAkb3AgInNldCB2YXJzKHJlc3RvcmVfZGVzaWduKSB7dHJ1ZX0iCiMgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewojICAgICAgICAgcHV0cyAkb3AgImNhdGNoIHthbGlhcyBmZl9tb2RpZnlfcG93ZXJfZG9tYWlucyBGRl9FREk6Om1vZGlmeV9wb3dlcl9kb21haW5zfSIKIyAgICAgICAgIHB1dHMgJG9wICJjYXRjaCB7YWxpYXMgZmZfYWRkX3Bvd2VyX3N3aXRjaGVzIEZGX0VESTo6YWRkX3Bvd2VyX3N3aXRjaGVzfSIKIyAgICAgICAgIHB1dHMgJG9wICJjYXRjaCB7YWxpYXMgZmZfcm91dGVfc2Vjb25kYXJ5X3BnX25ldHMgRkZfRURJOjpyb3V0ZV9zZWNvbmRhcnlfcGdfbmV0c30iCiMgICAgICAgICBwdXRzICRvcCAiY2F0Y2gge2FsaWFzIGZmX2dldF9wb3dlcl9kb21haW5zIEZGX0VESTo6Z2V0X3Bvd2VyX2RvbWFpbnN9IgojICAgICAgICAgcHV0cyAkb3AgImNhdGNoIHthbGlhcyBmZl9idWZmZXJfYWx3YXlzX29uX25ldHMgRkZfRURJOjpidWZmZXJfYWx3YXlzX29uX25ldHN9IgojICAgICAgICAgcHV0cyAkb3AgImNhdGNoIHthbGlhcyBmZl9pbnNlcnRfd2VsbHRhcHNfZW5kY2FwcyBGRl9FREk6Omluc2VydF93ZWxsdGFwc19lbmRjYXBzfSIKIyAgICAgIH0KICAgICAgY2xvc2UgJG9wCiAgIH0KCiAgICAgIHJldHVybiAkYWN0aW9uCiAgIH0KCiAgIHByb2MgaW5zZXJ0X2NvbW1lbnRzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgY29tbWVudHMgIiIKICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCiAgICAgIGFwcGVuZCBjb21tZW50cyAiIyBWYXJpYWJsZXMgYWZmZWN0aW5nIHRoaXMgc3RlcDpcbiIKICAgICAgYXBwZW5kIGNvbW1lbnRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjb21tZW50cyldfSB7CiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAkdmFycyhjb21tZW50cykKICAgICAgICAgdW5zZXQgdmFycyhjb21tZW50cykKICAgICAgfSBlbHNlIHsKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjICAgIE5vIHZhcmlhYmxlcyBkZWZpbmVkIGZvciB0aGlzIHN0ZXAgLi4uXG4iCiAgICAgIH0KICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1Y29tbWVudHMpXX0gewogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgQWRkaXRpb25hbCB2YXJpYWJsZXMgZm9yIHRoaXMgc3RlcDpcbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAkdmFycyh1Y29tbWVudHMpCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIgogICAgICAgICB1bnNldCB2YXJzKHVjb21tZW50cykKICAgICAgfQogICAgICByZXR1cm4gJGNvbW1lbnRzCiAgIH0KCiMgICBwcm9jIHJ1bl9hbGwge30gewojIAojICAgICAgZ2xvYmFsIHZhcnMKIwojICAgICAgc2V0IHRpbWUgMAojICAgICAgc2V0IGluZGV4IDAKIyAgICAgIHNldCBzdG9wX3N0ZXAgc2lnbm9mZgojICAgICAgc2V0IHZhcnMoY29kZWdlbikgZmFsc2UKIyAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModnBhdGgpXX0geyBzZXQgdmFycyh2cGF0aCkgbWFrZSB9CiMgICAgICAKIyAgICAgIGZvcmVhY2ggc3RlcCAkdmFycyhzdGVwcykgewojICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyh2cGF0aCkvJHN0ZXBdfSB7CiMgICAgICAgICAgICBpZiB7W2ZpbGUgbXRpbWUgJHZhcnModnBhdGgpLyRzdGVwXSA+ICR0aW1lfSB7CiMgICAgICAgICAgICAgICBpZiB7W2xpbmRleCAkdmFycyhzdGVwcykgJGluZGV4XSA9PSAic2lnbm9mZiJ9IHsKIyAgICAgICAgICAgICAgICAgIFB1dHMgIjxGRj4gU1RFUCBzaWdub2ZmIENPTVBMRVRFIC4uLiBOT1RISU5HIFRPIERPIgojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIHNldCBzdGFydF9zdGVwIFtsaW5kZXggJHZhcnMoc3RlcHMpIFtleHByICRpbmRleCArIDFdXQojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQojICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgIHNldCBzdGFydF9zdGVwICRzdGVwCiMgICAgICAgICAgICBicmVhawojICAgICAgICAgfQojICAgICAgICAgaW5jciBpbmRleAojICAgICAgfQojICAgICAgCiMgICAgICBwdXRzICI8RkY+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgojICAgICAgaWYgeyRzdGFydF9zdGVwID09ICRzdG9wX3N0ZXB9IHsKIyAgICAgICAgIHB1dHMgIjxGRj4gUlVOTklORyBTVEVQICRzdGFydF9zdGVwIC4uLiIKIyAgICAgIH0gZWxzZSB7CiMgICAgICAgICBwdXRzICI8RkY+IFJVTk5JTkcgU1RFUCAkc3RhcnRfc3RlcCB0aHJvdWdoICRzdG9wX3N0ZXAgLi4uIgojICAgICAgfQojICAgICAgcHV0cyAiPEZGPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKIyAgICAgIHNsZWVwIDUKIyAgICAgIAojICAgICAgIwojICAgICAgIyBFbXVsYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSAibWFrZSIgcHJvZ3JhbS4gIElmIGEgZmlsZSBkb2Vzbid0IGV4aXN0LAojICAgICAgIyBvciBpZiBpdCdzIHByZWRlY2Vzc29yIHN0ZXAgaGFzIGV4ZWN1dGVkIG1vcmUgcmVjZW50bHksIHJ1biB0aGUgY3VycmVudAojICAgICAgIyBzdGVwIGFuZCB1cGRhdGUgdGhlIHRpbWUvZGF0ZSBzdGFtcHMgb2YgdGhlIGZpbGVzIHdlIHRyYWNrIHByb2dyZXNzIHdpdGgKIyAgICAgICMKIyAgICAgIAojICAgICAgc2V0IHZhcnMoc3RvcF9zdGVwKSAkc3RvcF9zdGVwCiMgICAgICAKIyAgICAgIHNldCBsYXN0X3N0ZXAgIiIKIyAgICAgIHNldCB2YXJzKHJlc3RvcmVfZGVzaWduKSAxCiMgICAgICBpZiB7JHZhcnMoZW5hYmxlX3Fvcl9jaGVjayl9IHsKIyAgICAgICAgIHNldCBjaGVja19xb3IgJHZhcnMoc2NyaXB0X2RpcikvY2hlY2tfcW9yLnRjbAojICAgICAgfQojICAgICAgZXhlYyBta2RpciAtcCBtYWtlCiMgICAgICBmb3JlYWNoIHN0ZXAgJHZhcnMoc3RlcHMpIHsKIyAgICAgICAgIHNldCB2YXJzKHN0ZXApICRzdGVwCiMgICAgICAgICBQdXRzICI8RkY+IFNURVAgJHZhcnMoc3RlcCkgLi4uIgojICAgICAgICAgc2V0IHRoaXNfc2VtYXBob3JlICIkdmFycyh2cGF0aCkvJHN0ZXAiCiMgICAgICAgICBzZXQgbGFzdF9zZW1hcGhvcmUgIiR2YXJzKHZwYXRoKS8kbGFzdF9zdGVwIgojICAgICAgCiMgICAgICAgICBzZXQgcnVuX3N0ZXAgZmFsc2UKIyAgICAgICAgIGlmIHshW2ZpbGUgZXhpc3RzICR0aGlzX3NlbWFwaG9yZV19IHsKIyAgICAgICAgICAgIHNldCBydW5fc3RlcCB0cnVlCiMgICAgICAgICB9IGVsc2VpZiB7JGxhc3Rfc3RlcCAhPSAiIn0gewojICAgICAgICAgICAgZmlsZSBzdGF0ICR0aGlzX3NlbWFwaG9yZSB0aGlzX3N0YXQKIyAgICAgICAgICAgIGZpbGUgc3RhdCAkbGFzdF9zZW1hcGhvcmUgbGFzdF9zdGF0CiMgICAgICAgICAgICBpZiB7JHRoaXNfc3RhdChtdGltZSkgPCAkbGFzdF9zdGF0KG10aW1lKX0gewojICAgICAgICAgICAgICAgc2V0IHJ1bl9zdGVwIHRydWUKIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0KIyAgICAgIAojICAgICAgICAgIwojICAgICAgICAgIyBDaGVjayB0aGUgcXVhbGl0eSBvZiByZXN1bHRzIGZyb20gdGhlIGxhc3Qgc3RlcC4gIElmIHRoZSByZXN1bHRzIGFyZW4ndAojICAgICAgICAgIyBhcyBleHBlY3RlZCwgZG9uJ3QgcHJvY2VlZCB0byB0aGUgbmV4dCBzdGVwCiMgICAgICAgICAjCiMgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3Fvcl9jaGVjayl9IHsKIyAgICAgICAgICAgIGlmIHskc3RlcCAhPSAiaW5pdCJ9IHsKIyAgICAgICAgICAgICAgIHNldCBxb3IgW2NhdGNoIHtleGVjICRjaGVja19xb3IgJGxhc3Rfc2VtYXBob3JlfSBtc2ddCiMgICAgICAgICAgICAgICBpZiB7JHFvcn0gewojICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBFUlJPUjogUU9SIFJFU1VMVCBDSEVDSyBJTkRJQ0FURVMgQSBQUk9CTEVNIElOIFNURVAgJGxhc3Rfc3RlcCIKIyAgICAgICAgICAgICAgICAgIGV4aXQgLTExMQojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgfQojICAgICAgICAgfQojICAgICAgCiMgICAgICAgICBzZXQgbGFzdF9zdGVwICRzdGVwCiMgICAgICAgICBpZiB7ISRydW5fc3RlcH0gewojICAgICAgICAgICAgY29udGludWUKIyAgICAgICAgIH0KIyAgICAgIAojICAgICAgICAgIwojICAgICAgICAgIyBTb3VyY2UgdGhlIGNvbnRyb2wgZmlsZSB0aGF0IHJ1bnMgdGhlIHN0ZXAuICBJZiBpdCBoYWQgYW4gZXJyb3IsIGV4aXQKIyAgICAgICAgICMgaW1tZWRpYXRlbHkuICBPdGhlcndpc2UsIHVwZGF0ZSB0aGUgdGltZS9kYXRlIHN0YW1wIG9mIHRoZSBjb3JyZXNwb25kaW5nCiMgICAgICAgICAjCiMgICAgICAgICAjCiMgICAgICAKIyAgICAgICAgIGlmIHtbY2F0Y2gge0ZGX0VESTo6cnVuXyRzdGVwfSBtZXNzYWdlXX0gewojICAgICAgICAgICAgcHV0cyAkbWVzc2FnZQojICAgICAgICAgICAgZXhpdCAtMTExCiMgICAgICAgICB9CiMgICAgICAgICBzZXQgdmFycyhyZXN0b3JlX2Rlc2lnbikgMAojICAgICAgCiMgICAgICAgICAjCiMgICAgICAgICAjIElmIHRoZXJlIGlzIGEgUU9SIGNoZWNrIGZpbGUgZm9yIHRoaXMgc3RlcCwgZXhlY3V0ZSBpdCBhbmQgcGxhY2UgdGhlCiMgICAgICAgICAjIHJlc3VsdCBpbnRvIHRoZSBtYWtlIGZpbGUuICBPdGhlcndpc2UganVzdCB0b3VjaCB0aGUgZmlsZQojICAgICAgICAgIwojICAgICAgCiMgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX3Fvcl9jaGVjayl9IHsKIyAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc3RlcCxxb3JfdGNsXX0gewojICAgICAgICAgICAgICAgc2V0IHFvcl9maWxlICR2YXJzKCRzdGVwLHFvcl90Y2wpCiMgICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICRxb3JfZmlsZV19IHsKIyAgICAgICAgICAgICAgICAgIHNldCBxb3IgW2NhdGNoIHtleGVjICRxb3JfZmlsZX0gbXNnXQojICAgICAgICAgICAgICAgICAgc2V0IG1ha2VfZmlsZSBbb3BlbiAkdGhpc19zZW1hcGhvcmUgd10KIyAgICAgICAgICAgICAgICAgIHB1dHMgJG1ha2VfZmlsZSAiJHFvciIKIyAgICAgICAgICAgICAgICAgIGNsb3NlICRtYWtlX2ZpbGUKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgIH0KIyAgICAgICAgIH0KIyAgICAgICAgIGV4ZWMgL2Jpbi90b3VjaCAkdGhpc19zZW1hcGhvcmUKIyAgICAgIAojICAgICAgICAgaWYgeyRzdGVwID09ICRzdG9wX3N0ZXB9IHsKIyAgICAgICAgICAgIFB1dHMgIjxGRj4gRG9uZSIgCiMgICAgICAgICB9CiMgICAgICB9CiMgICB9CgogICBwcm9jIGxvYWRfcG93ZXJfaW50ZW50IHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgY29tbWFuZHMgIiIKCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJsb2FkQ1BGICR2YXJzKGNwZl9maWxlKVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9jcGYgJGNvbW1hbmRdCiAgICAgICAgIHNldCBjb21tYW5kICJjb21taXRDUEYiCiAgICAgICAgIGlmIHskdmFycyhjcGZfa2VlcF9yb3dzKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1rZWVwUm93cyIKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoY3BmX3Bvd2VyX2RvbWFpbil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG93ZXJEb21haW4iCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKGNwZl9pc29sYXRpb24pfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWlzb2xhdGlvbiIKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoY3BmX3N0YXRlX3JldGVudGlvbil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtc3RhdGVfcmV0ZW50aW9uIgogICAgICAgICB9CiAgICAgICAgIGlmIHskdmFycyhjcGZfbGV2ZWxfc2hpZnRlcil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtbGV2ZWxfc2hpZnRlciIKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoY3BmX3Bvd2VyX3N3aXRjaCl9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtcG93ZXJfc3dpdGNoIgogICAgICAgICB9CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcbiIKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLGNvbW1pdF9jcGYgJGNvbW1hbmRdCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3BmX2ZpbGUpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3BmX2lzb2xhdGlvbilcbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjcGZfc3RhdGVfcmV0ZW50aW9uKVxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNwZl9sZXZlbF9zaGlmdGVyKVxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGNwZl9wb3dlcl9zd2l0Y2gpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoY3BmX3Bvd2VyX2RvbWFpbilcbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhjcGZfa2VlcF9yb3dzKVxuIgogICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMoaWVlZTE4MDFfZmlsZSldfSB7CiAgICAgICAgIHNldCBjb21tYW5kICJyZWFkX3Bvd2VyX2ludGVudCAkdmFycyhpZWVlMTgwMV9maWxlKSAtMTgwMVxuIgogICAgICAgICBhcHBlbmQgY29tbWFuZHMgW0ZGOjp3cmFwX2NvbW1hbmQgJHZhcnMoc3RlcCksbG9hZF9pZWVlMTgwMSAkY29tbWFuZF0KICAgICAgICAgc2V0IGNvbW1hbmQgImNvbW1pdF9wb3dlcl9pbnRlbnQiCiAgICAgICAgIGlmIHskdmFycyhpZWVlMTgwMV9rZWVwX3Jvd3MpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLWtlZXBSb3dzIgogICAgICAgICB9CiAgICAgICAgIGlmIHskdmFycyhpZWVlMTgwMV9wb3dlcl9kb21haW4pfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvd2VyX2RvbWFpbiIKICAgICAgICAgfQogICAgICAgICBpZiB7JHZhcnMoaWVlZTE4MDFfaXNvbGF0aW9uKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1pc29sYXRpb24iCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKGllZWUxODAxX3N0YXRlX3JldGVudGlvbil9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmQgIiAtc3RhdGVfcmV0ZW50aW9uIgogICAgICAgICB9CiAgICAgICAgIGlmIHskdmFycyhpZWVlMTgwMV9sZXZlbF9zaGlmdGVyKX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1sZXZlbF9zaGlmdGVyIgogICAgICAgICB9CiAgICAgICAgIGlmIHskdmFycyhpZWVlMTgwMV9wb3dlcl9zd2l0Y2gpfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgLXBvd2VyX3N3aXRjaCIKICAgICAgICAgfQogICAgICAgICBhcHBlbmQgY29tbWFuZCAiXG4iCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxjb21taXRfaWVlZTE4MDEgJGNvbW1hbmRdCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoaWVlZTE4MDFfZmlsZSlcbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhpZWVlMTgwMV9pc29sYXRpb24pXG4iCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoaWVlZTE4MDFfc3RhdGVfcmV0ZW50aW9uKVxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGllZWUxODAxX2xldmVsX3NoaWZ0ZXIpXG4iCiAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMoaWVlZTE4MDFfcG93ZXJfc3dpdGNoKVxuIgogICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGllZWUxODAxX3Bvd2VyX2RvbWFpbilcbiIKICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhpZWVlMTgwMV9rZWVwX3Jvd3MpXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFwcGVuZCB1Y29tbWVudHMgIiMgLSB2YXJzKGNwZl9maWxlKVxuIgogICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjcGZfaXNvbGF0aW9uKVxuIgogICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjcGZfc3RhdGVfcmV0ZW50aW9uKVxuIgogICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhjcGZfbGV2ZWxfc2hpZnRlcilcbiIKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY3BmX3Bvd2VyX3N3aXRjaClcbiIKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY3BmX3Bvd2VyX2RvbWFpbilcbiIKICAgICAgICAgYXBwZW5kIHVjb21tZW50cyAiIyAtIHZhcnMoY3BmX2tlZXBfcm93cylcbiIKICAgICAgfQogICAgICByZXR1cm4gJGNvbW1hbmRzCiAgIH0KCiAgIHByb2Mgc2V0X2Rlc2lnbl9tb2RlIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgc2V0IGNvbW1lbnRzICIiCiAgICAgIHNldCB1Y29tbWVudHMgIiIKCiAgICAgIHNldCBwcm9jZXNzIFtyZWdzdWIgIm5tIiAkdmFycyhwcm9jZXNzKSAiIl0KICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhwcm9jZXNzKVxuIgogICAgICBpZiB7W2xpbmRleCBbc3BsaXQgJHZhcnModmVyc2lvbikgIi4iXSAgMF0gPCAxNX0gewogICAgICAgICBpZiB7JHZhcnMoaGlnaF90aW1pbmdfZWZmb3J0KX0gewogICAgICAgICAgICBhcHBlbmQgY29tbWVudHMgIiMgLSB2YXJzKGhpZ2hfdGltaW5nX2VmZm9ydClcbiIKICAgICAgICAgICAgaWYgeyFbcmVnZXhwICI5LjEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVzaWduTW9kZSAtcHJvY2VzcyAkcHJvY2VzcyAtZmxvd0VmZm9ydCBoaWdoXG4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHNldCBjb21tYW5kICJzZXREZXNpZ25Nb2RlIC1wcm9jZXNzICRwcm9jZXNzXG4iCiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXByb2Nlc3MgJHByb2Nlc3NcbiIKICAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICBpZiB7W3N0cmluZyB0b2xvd2VyICR2YXJzKGZsb3dfZWZmb3J0KV0gIT0gInN0YW5kYXJkIn0gewogICAgICAgICAgICBzZXQgY29tbWFuZCAic2V0RGVzaWduTW9kZSAtcHJvY2VzcyAkcHJvY2VzcyAtZmxvd0VmZm9ydCBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoZmxvd19lZmZvcnQpXSIKICAgICAgICAgICAgYXBwZW5kIGNvbW1lbnRzICIjIC0gdmFycyhmbG93X2VmZm9ydClcbiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGNvbW1hbmQgInNldERlc2lnbk1vZGUgLXByb2Nlc3MgJHByb2Nlc3MiCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKHBvd2VyX2VmZm9ydCkgIT0gIm5vbmUifSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tZW50cyAiIyAtIHZhcnMocG93ZXJfZWZmb3J0KVxuIgogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZCAiIC1wb3dlckVmZm9ydCAkdmFycyhwb3dlcl9lZmZvcnQpIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcHBlbmQgdWNvbW1lbnRzICIjIC0gdmFycyhwb3dlcl9lZmZvcnQpIFwibG93IG9yIGhpZ2hcIlxuIgogICAgICAgICB9CiAgICAgIH0KIyAgICAgIHVwbGV2ZWwgIzAgYXBwZW5kIGNvbW1hbmRzIFtGRjo6d3JhcF9jb21tYW5kICR2YXJzKHN0ZXApLHNldF9kZXNpZ25fbW9kZSAiJGNvbW1hbmRcbiJdCiAgICAgIGFwcGVuZCBjb21tYW5kcyBbRkY6OndyYXBfY29tbWFuZCAkdmFycyhzdGVwKSxzZXRfZGVzaWduX21vZGUgIiRjb21tYW5kXG4iXQoKICAgICAgcmV0dXJuIFtsaXN0ICRjb21tYW5kcyAkY29tbWVudHMgJHVjb21tZW50c10KICAgfQoKICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAjIFRoaXMgc2NyaXB0IHdpbGwgcHJlcGFyZSBhIGRpZ2l0YWwgYmxvY2sgZm9yIExWUy4gSXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBGRiBieSBhZGRpbmcgdGhlIHRhZzoKICAgIwogICAjICAgIHNldCB2YXJzKHNpZ25vZmYsc2F2ZV9kZXNpZ24scG9zdF90Y2wpICAgICAgICA8cGF0aD4vY3JlYXRlU3ltYm9sQW5kQ0RGLnRjbAogICAjIAogICAjIE5vdGUsIGl0IG11c3QgYmUgcnVuIGFmdGVyIHRoZSBkZXNpZ24gaXMgc2F2ZWQgaW4gdGhlIHNpZ25vZmYgc3RlcC4KICAgIwogICAjIFRoZSBzY3JpcHQgZG9lcyB0aGUgZm9sbG93aW5nOgogICAjCiAgICMgMSkgQ3JlYXRlcyB0aGUgU0tJTEwgc2NyaXB0OiBnZ0NyZWF0ZVN5bWJvbEFuZENERi5pbAogICAjCiAgICMgICAgV2hlbiB0aGlzIHNjcmlwdCBpcyBjYWxsZWQgYnkgVmlydHVvc28gKGxhdGVyIGluIHRoZSBmbG93KSwgaXQgd2lsbCBwZXJmb3JtIAogICAjICAgIHRoZSBmb2xsb3dpbmc6CiAgICMKICAgIyAgICAgICAtY29weSB2aWV3OiAgPGxpYj4gPGNlbGw+IHNpZ25vZmYgCiAgICMgICAgICAgICAgICAgICB0bzogIDxsaWI+IDxjZWxsPiBsYXlvdXQKICAgIwogICAjICAgICAgIC1SZW1hc3RlciB0aGUgaW5zdGFuY2VzIG9mIHRoZSB2aWV3ICJsYXlvdXQiIHRvIHJlZmVyZW5jZSAnbGF5b3V0JyB2aWV3cyAKICAgIyAgICAgICAgcmF0aGVyIHRoYW4gJ2Fic3RyYWN0JyB2aWV3cwogICAjCiAgICMgICAgICAgLUNyZWF0ZSBpaGRsIHBhcmFtZXRlciBhbmQgY29tbWFuZCBmaWxlcyB3aGljaCBhcmUgdXNlZCBieSB2ZXJpbG9nSW4KICAgIwogICAjICAgICAgIC1DcmVhdGUgYSB2ZXJpbG9nIHN0dWIgZmlsZSBmcm9tIHRoZSBwaHlzaWNhbCBuZXRsaXN0CiAgICMKICAgIyAgICAgICAtUnVuIGloZGwgKHZlcmlsb2dJbikgb24gdGhlIHN0dWIgZmlsZSB0byBjcmVhdGUgdGhlICdzeW1ib2wnIHZpZXcKICAgIwogICAjICAgICAgIC1Db3B5IHRoZSBzeW1ib2wgdmlldyB0byBjcmVhdGUgdGhlIGF1Q2RsIHZpZXcKICAgIwogICAjICAgICAgIC1Vc2UgZWl0aGVyIHYyY2RsIG9yIHYybHZzIHRvIGNvbnZlcnQgdGhlIHZlcmlsb2cgbmV0bGlzdCB0byBDREwgCiAgICMgICAgICAgIGFuZCBzdG9yZSBpdCBpbiB0aGUgYXVDZGwgdmlldwogICAjCiAgICMgICAgICAgLUNyZWF0ZSB0aGUgYmFzZSBsZXZlbCBDREYgdG8gc3VwcG9ydCBhdUNkbCBuZXRsaXN0aW5nCiAgICMKICAgIwogICAjIDIpIFNhdmVzIGEgcGh5c2ljYWwgbmV0bGlzdCB0aGF0IGV4Y2x1ZGVzIGZpbGxlciBjZWxscy4gVGhpcyB3aWxsIGJlIHVzZWQgbGF0ZXIgCiAgICMgICAgdG8gY3JlYXRlIHRoZSBDREwgdmlldy4KICAgIwogICAjIDMpIENyZWF0ZXMgdGhlIC5zaW1yYyBmaWxlIHVzZWQgYnkgaWhkbC4KICAgIwogICAjIDQpIENyZWF0ZXMgdGhlIFNLSUxMIHNjcmlwdDogUG9zdFByb2Nlc3NJblZpcnR1b3NvLmlsLgogICAjCiAgICMgICAgVGhpcyBzY3JpcHQgcmVhZHMvZXhlY3V0ZXMgdGhlIHNjcmlwdCBnZ0NyZWF0ZVN5bWJvbEFuZENERi5pbC4KICAgIwogICAjCiAgICMgNSkgSWYgVmlydHVvc28gaXMgaW4gdGhlIHVzZXIncyBwYXRoLCBpdCB3aWxsIGV4ZWN1dGUgdGhlIHNjcmlwdDoKICAgIwogICAjICAgICAgICAgUG9zdFByb2Nlc3NJblZpcnR1b3NvLmlsIAogICAjIAogICAjCiAgICMKICAgIyAgQ3JlYXRlZCBieTogICBCaWxsIFdhcmVoYW0gICAgIDAxLzI2LzIwMTUKICAgIyAgICAgICAgICAgICAgICBWaWtyYW0gQWdhcndhbAogICAjICAgICAgICAgICAgICAgIEdyZWcgR29ydG9uCiAgICMKICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAKICAgcHJvYyBjcmVhdGVfbHZzX2RhdGEge30gewogICAKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGluZm9zCiAgICAgIGdsb2JhbCB3YXJuaW5ncwogICAKICAgICAgIyBDcmVhdGUgdGhlIGdnQ3JlYXRlU3ltYm9sQW5kQ0RGLmlsIHNraWxsIGNvZGUKICAgICAgCiAgICAgIHNldCBpbmZvcygkdmFycyhpbmZvX2NvdW50KSkgIkNyZWF0ZWQgdGhlICR2YXJzKHNjcmlwdF9kaXIpL2dnQ3JlYXRlU3ltYm9sQW5kU0RGLmlsIFNLSUxMIHNjcmlwdFxuIgogICAgICBpbmNyIHZhcnMoaW5mb19jb3VudCkKICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL2dnQ3JlYXRlU3ltYm9sQW5kQ0RGLmlsIHddCiAgICAgIHB1dHMgJG9wICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IgogICAgICBwdXRzICRvcCAiOzs7IgogICAgICBwdXRzICRvcCAiOzs7IEZ1bmN0aW9uOiBnZ0NyZWF0ZVN5bWJvbEFuZENERiAtIHBlcmZvcm1zIHNldmVyYWwgZnVuY3Rpb25zIHRvIHByZXBhcmUgYSBkaWdpdGFsIgogICAgICBwdXRzICRvcCAiOzs7ICBibG9jayBzYXZlZCBmcm9tIElubm92dXMgaW4gT0EgZm9yIGZvbGxvdyBvbiBpbnRlZ3JhdGlvbiBpbiBhIHRvcCBsZXZlbCBWaXJ0dW9zbyIKICAgICAgcHV0cyAkb3AgIjs7OyAgc2NoZW1hdGljIHRvIHN1cHBvcnQgUFZTIExWUy4iCiAgICAgIHB1dHMgJG9wICI7OzsiCiAgICAgIHB1dHMgJG9wICI7OzsgSW5wdXRzOiIKICAgICAgcHV0cyAkb3AgIjs7OyAgICAgbGlicmFyeSAgICAgICAgOiBOYW1lIG9mIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGRpZ2l0YWwgYmxvY2siCiAgICAgIHB1dHMgJG9wICI7OzsgICAgIGNlbGxOYW1lICAgICAgIDogTmFtZSBvZiB0aGUgZGlnaXRhbCBibG9jayIKICAgICAgcHV0cyAkb3AgIjs7OyAgICAgdmlld05hbWUgICAgICAgOiBOYW1lIG9mIHRoZSBkaWdpdGFsIGJsb2NrIHVucmVtYXN0ZXJlZCBsYXlvdXQgdmlldyIKICAgICAgcHV0cyAkb3AgIjs7OyAgICAgdmVyaWxvZ0ZpbGUgICAgOiBOYW1lIG9mIHRoZSB2ZXJpbG9nIG5ldGxpc3QiCiAgICAgIHB1dHMgJG9wICI7OzsgICAgIG92ZXJ3cml0ZSAgICAgIDogT3ZlcndyaXRlIGV4aXN0aW5nIGxpYnJhcnkiCiAgICAgIHB1dHMgJG9wICI7OzsiCiAgICAgIHB1dHMgJG9wICI7OzsgT3V0cHV0czoiCiAgICAgIHB1dHMgJG9wICI7OzsgICAgIGxheW91dCB2aWV3ICAgIDogXCJsYXlvdXRcIiB2aWV3IHdpdGggYWJzdHJhY3RzIHJlbWFzdGVyZWQgdG8gdHlwZSBsYXlvdXQiCiAgICAgIHB1dHMgJG9wICI7OzsgICAgIHN5bWJvbCB2aWV3ICAgIDogXCJzeW1ib2xcIiB2aWV3IHdpdGggcGlucyB0byBtYXRjaCB2ZXJpbG9nRmlsIgogICAgICBwdXRzICRvcCAiOzs7ICAgICBhdUNkbCB2aWV3ICAgICA6IGNvcHkgb2Ygc3ltYm9sIHZpZXcgZm9yIGNkbCBuZXRsaXN0aW5nIHN0b3AgYW5kIHZpZXcgbGlzdHMiCiAgICAgIHB1dHMgJG9wICI7OzsgICAgIGF1Q2RsIENERiAgICAgIDogYmFzZSBDREYgYXVDZGwgc2ltdWxhdGlvbiBwcm9wZXJ0aWVzIGZvciBuZXRsaXN0aW5nIgogICAgICBwdXRzICRvcCAiOzs7IgogICAgICBwdXRzICRvcCAiOzs7IGdnQ3JlYXRlU3ltYm9sQW5kQ0RGKFwibGlibmFtZVwiIFwiY2VsbE5hbWVcIiBcInZpZXdOYW1lXCIgXCIvcGF0aF90b19maWxlL215bmFtZS52XCIpIgogICAgICBwdXRzICRvcCAiOzs7IgogICAgICBwdXRzICRvcCAiOzs7IE5vdGVzOiIKICAgICAgcHV0cyAkb3AgIjs7OyIKICAgICAgcHV0cyAkb3AgIjs7OyBUaGUgaW5wdXQgbGF5b3V0IGZpbGUgZnJvbSBJbm5vdnVzIG9uIE9BIGNyZWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW5tYW5kOiIKICAgICAgcHV0cyAkb3AgIjs7OyAgICAgc2F2ZURlc2lnbiAtY2VsbHZpZXcgeyBsaWJyYXJ5IGNlbGxOYW1lIHZpZXdOYW1lIH0iCiAgICAgIHB1dHMgJG9wICI7OzsgVXNlZCB2aWV3TmFtZSBcImVkaV9yb3V0ZWRcIiB0byBzaWduaWZ5IHJvdXRlZCBkZXNpZ24gZnJvbSBFREkuIgogICAgICBwdXRzICRvcCAiOzs7IFRoaXMgZmlsZSBjYW4gYmUgdXNlZCB0byByZXN0b3JlIGRlc2lnbiBpbiBJbm5vdnVzLiBZb3UgY2FuIGFsc28gcnVuIG9hT3V0IgogICAgICBwdXRzICRvcCAiOzs7IGZyb20gSW5ub3Z1cyBhbmQgaGF2ZSBpdCBjcmVhdGUgYSBsYXlvdXQgdmlldyB3aXRoIHRoZSBhYnN0cmFjdHMgcmVtYXN0ZXJlZC4iCiAgICAgIHB1dHMgJG9wICI7OzsgVGhpcyBzY3JpcHQgd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyBzdGVwIGluIFZpcnR1b3NvIHNvIHlvdSBkb24ndCBoYXZlIHRvIHJ1biIKICAgICAgcHV0cyAkb3AgIjs7OyB0aGUgc2Vjb25kIHNhdmUgZnJvbSBJbm5vdnVzLiIKICAgICAgcHV0cyAkb3AgIjs7OyIKICAgICAgcHV0cyAkb3AgIjs7OyBUaGUgdmVyaWxvZ0ZpbGUgd2FzIGNyZWF0ZWQgZnJvbSBJbm5vdnVzIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoiCiAgICAgIHB1dHMgJG9wICI7OzsgICAgIHNhdmVOZXRsaXN0IG15bmFtZS52IC1leGNsdWRlTGVhZkNlbGwgLXBoeXMgLWV4Y2x1ZGVDZWxsSW5zdCBcIkZJTEwxIC4uLlwiIgogICAgICBwdXRzICRvcCAiOzs7IFVzZWQgXCJjZWxsTmFtZV9waHlzX25vZmlsbC52XCIgYXMgYW4gZXhhbXBsZS4iCiAgICAgIHB1dHMgJG9wICI7OzsgVGhpcyBjcmVhdGVzIGEgcGh5c2ljYWwgdmVyaWxvZyBuZXRsaXN0IHdpdGggcG93ZXIgYW5kIGdyb3VuZCBwaW5zLCBleGNsdWRlcyIKICAgICAgcHV0cyAkb3AgIjs7OyBsZWFmIGNlbGxzIChzdGFuZGFyZCBjZWxscykgYW5kIHJlbW92ZXMgdGhlIEZJTEwgY2VsbHMgbGlzdGVkLiIKICAgICAgcHV0cyAkb3AgIjs7OyIKICAgICAgcHV0cyAkb3AgIjs7OyBUaGUgc2NyaXB0IGlzIHdyaXR0ZW4gdG8gYWNjZXB0IHRoZSBpbnB1dHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIGNhbiBiZSIKICAgICAgcHV0cyAkb3AgIjs7OyBtb2RpZmllZCB0byBwdWxsIGZyb20gdGhlIGFjdGl2ZSB3aW5kb3cgYW5kL29yIGEgZm9ybS4iCiAgICAgIHB1dHMgJG9wICI7OzsiCiAgICAgIHB1dHMgJG9wICI7OzsgVGhlIGxheW91dCBzYXZlZCBmcm9tIElubm92dXMgc2hvdWxkIGJlIG5hbWVkIHNvbWV0aGluZyBvdGhlciB0aGFuIFwibGF5b3V0XCIuIEl0IGlzIgogICAgICBwdXRzICRvcCAiOzs7IGFzc3VtZWQgdGhhdCBhbGwgdGhlIGluc3RhbmNlcyBhcmUgb2YgdHlwZSBcImFic3RyYWN0XCIgYW5kIG5lZWQgdG8gYmUgcmVtYXN0ZXJlZCIKICAgICAgcHV0cyAkb3AgIjs7OyB0byB0eXBlIFwibGF5b3V0XCIuIFRvIGNoYW5nZSB0aGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgcmVtYXN0ZXJlZCBsYXlvdXQgdmlldyBmcm9tIgogICAgICBwdXRzICRvcCAiOzs7IFwibGF5b3V0XCIsIGNoYW5nZSB0aGUgXCJuZXdWaWV3XCIgdmFyaWFibGUuIgogICAgICBwdXRzICRvcCAiOzs7IgogICAgICBwdXRzICRvcCAiOzs7IFRoZSBzeW1ib2wgdmlldyBpcyBjcmVhdGVkIHVzaW5nIFZlcmlsb2dJbi4gVGhlIHBoeXNpY2FsIFZlcmlsb2cgbmV0bGlzdCBmcm9tIEVESSIKICAgICAgcHV0cyAkb3AgIjs7OyBpcyBwYXJzZWQgYW5kIGEgdGVtcG9yYXJ5IG5ldGxpc3QgY3JlYXRlZCB0aGF0IG9ubHkgaGFzIHRoZSBtb2R1bGUgYW5kIHBpbnMiCiAgICAgIHB1dHMgJG9wICI7OzsgZGVmaW5lZCBmb3IgdGhlIGRpZ2l0YWwgYmxvY2sgXCJjZWxsTmFtZVwiLiBUaGUgcmVndWxhciBleHByZXNzaW9uIGNoZWNrcyB0byBzdGFydCIKICAgICAgcHV0cyAkb3AgIjs7OyBhbmQgc3RvcCB0aGUgcGFyc2luZyBvZiB0aGUgaW5wdXQgdmVyaWxvZyBuZXRsaXN0IHRvIGp1c3QgZXh0cmFjdCB0aGUgcGluIgogICAgICBwdXRzICRvcCAiOzs7IGRlZmluaXRpb25zIGlzIGJhc2ljIGFuZCBzcGVjaWZpYyB0byB0aGUgc3ludGF4IHNlZW4gaW4gYSBjb3VwbGUgZXhhbXBsZXMgZnJvbSIKICAgICAgcHV0cyAkb3AgIjs7OyBFREkuIFNlZSBjb21tZW50cyBpbiB0aGUgXCJDcmVhdGluZyAvdG1wL2loZGxfdmVyaWxvZy52XCIgc2VjdGlvbiBmb3IgZGV0YWlscy4iCiAgICAgIHB1dHMgJG9wICI7OzsiCiAgICAgIHB1dHMgJG9wICI7OzsgVHdvIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCBkdXJpbmcgVmVyaWxvZ0luOiIKICAgICAgcHV0cyAkb3AgIjs7OyAgIFZlcmlsb2dJbi5sb2ciCiAgICAgIHB1dHMgJG9wICI7OzsgICBWZXJpbG9nSW5fc3Rkb3V0LmxvZyIKICAgICAgcHV0cyAkb3AgIjs7OyIKICAgICAgcHV0cyAkb3AgIjs7OyBUaGUgZGVmYXVsdCBpcyB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIHN5bWJvbCBkdXJpbmcgVmVyaWxvZ0luIGlmIGl0IHdhcyIKICAgICAgcHV0cyAkb3AgIjs7OyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgVmVyaWxvZ0luIFwib3ZlcndyaXRlX3N5bWJvbCA6PSAxXCIuIFRvIG5vdCBvdmVyd3JpdGUgdGhlIgogICAgICBwdXRzICRvcCAiOzs7IHN5bWJvbCwgcmVnYXJkbGVzcyBvZiB0aGUgc291cmNlIHNldCBpdCB0byBcIm92ZXJ3cml0ZV9zeW1ib2wgOj0gMFwiLiIKICAgICAgcHV0cyAkb3AgIjs7OyIKICAgICAgcHV0cyAkb3AgIjs7OyBWZXJpbG9nSW4gaXMgcnVuIHZpYSB0aGUgdW5peCBjb21tYW5kIGxpbmUgdXNpbmcgaWhkbC4gVGhlIGloZGwgaW5wdXQgZmlsZXMgYXJlIgogICAgICBwdXRzICRvcCAiOzs7IGNyZWF0ZWQgaW4gL3RtcC4iCiAgICAgIHB1dHMgJG9wICI7OzsiCiAgICAgIHB1dHMgJG9wICI7OzsgU2VlIFwiVmVyaWxvZyBJbiBmb3IgVmlydHVvc28gRGVzaWduIEVudmlyb25tZW50IFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZVwiLiIKICAgICAgcHV0cyAkb3AgIjs7OyIKICAgICAgcHV0cyAkb3AgIjs7OyBUaGUgYXVDZGwgdmlldyBpcyBqdXN0IGEgY29weSBvZiB0aGUgc3ltYm9sIHZpZXcgY3JlYXRlZCBieSBWZXJpbG9nSW4uIgogICAgICBwdXRzICRvcCAiOzs7IgogICAgICBwdXRzICRvcCAiOzs7IFRoZSBDREYgYXVDZGwgc2ltdWxhdGlvbiBwYXJhbWV0ZXJzIGFyZSBjcmVhdGVkIGF0IHRoZSBcImJhc2VcIiBjZWxsIGxldmVsIHRvIgogICAgICBwdXRzICRvcCAiOzs7IGVuYWJsZSBjZGwgbmV0bGlzdGluZyBvZiBqdXN0IHRoZSBzdWJja3QgbmFtZSBhbmQgcGlucy4gV2hlbiBydW5uaW5nIExWUyB0aGUiCiAgICAgIHB1dHMgJG9wICI7OzsgYXNzb2NpYXRlZCBWZXJpbG9nIG5ldGxpc3QgYW5kIElQIGNkbCB2aWV3cyBzaG91bGQgYmUgaW5jbHVkZWQuIgogICAgICBwdXRzICRvcCAiOzs7ICIKICAgICAgcHV0cyAkb3AgIjs7OyBXcml0dGVuIGJ5OiAgICBHcmVnIEdvcnRvbiwgICAgNS8xOC8xNCIKICAgICAgcHV0cyAkb3AgIjs7OyIKICAgICAgcHV0cyAkb3AgIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsiCiAgICAgIHB1dHMgJG9wICIiCiAgICAgIHB1dHMgJG9wICJwcm9jZWR1cmUoZ2dDcmVhdGVTeW1ib2xBbmRDREYobGlicmFyeSBjZWxsTmFtZSB2aWV3TmFtZSB2ZXJpbG9nRmlsZSBAb3B0aW9uYWwgKG92ZXJ3cml0ZSBuaWwpKSIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgIiAgICBwcm9nKCAoY3YgbmV3VmlldyBjdjIgaWhzIHN0YXJ0U3RyaW5nIHByaW50TW9kdWxlIGN2MyBjdjQgY2lkIGNkbHBhdGggcG9ydG9yZGVyIE9VVEZJTEUgSU5GSUxFIGJhc2VDREZpZCBuZXh0TGluZSkiCiAgICAgIHB1dHMgJG9wICIiCiAgICAgIHB1dHMgJG9wICIgICAgOyB2aWV3IG5hbWUgdG8gdXNlIGZvciBjb3B5IG9mIHNhdmVkIElubm92dXMgbGF5b3V0IHZpZXcgdGhhdCBuZWVkcyB0byBiZSByZW1hc3RlcmVkIgogICAgICBwdXRzICRvcCAiICAgIG5ld1ZpZXc9XCJsYXlvdXRcIiIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgIiAgICA7IEdldCBsaWJyYXJ5IGNlbGwgYW5kIHZpZXcgZnJvbSB0aGUgYWN0aXZlIHdpbmRvdyIKICAgICAgcHV0cyAkb3AgIiAgICA7IEFkZCBjdyB0byB0aGUgbGV0IHN0YXRlbWVudCIKICAgICAgcHV0cyAkb3AgIiAgICA7IGN3PWhpR2V0Q3VycmVudFdpbmRvdygpIgogICAgICBwdXRzICRvcCAiICAgIDsgY3Y9Y3ctPmNlbGxWaWV3IgogICAgICBwdXRzICRvcCAiICAgIDsgbGlicmFyeT1jdi0+bGliTmFtZSIKICAgICAgcHV0cyAkb3AgIiAgICA7IGNlbGxOYW1lPWN2LT5jZWxsTmFtZSIKICAgICAgcHV0cyAkb3AgIiAgICA7IHZpZXdOYW1lPWN2LT52aWV3TmFtZSIKICAgICAgcHV0cyAkb3AgIiAgICA7IHZlcmlsb2dGaWxlPVwiLi9TQ1JJUFQvY291bnRlcnNUZXN0LnZcIiIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgIiAgICA7IFZlcmlmeSB0aGUgZXhpc3RhbmNlIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIgogICAgICBwdXRzICRvcCAiICAgIHVubGVzcyhpc0ZpbGUodmVyaWxvZ0ZpbGUpIgogICAgICBwdXRzICRvcCAiICAgICAgICBwcmludGYoXCJUaGUgdmVyaWxvZyBmaWxlICVzIGRvZXMgbm90IGV4aXN0LlxcblwiIHZlcmlsb2dGaWxlKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgcHJpbnRmKFwiUGxlYXNlIGZpeCBhbmQgcnVuIGFnYWluLlxcblwiKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgcmV0dXJuKCkiCiAgICAgIHB1dHMgJG9wICIgICAgKSIKICAgICAgcHV0cyAkb3AgIiAgICB1bmxlc3MoY3Y9ZGJPcGVuQ2VsbFZpZXdCeVR5cGUoIGxpYnJhcnkgY2VsbE5hbWUgdmlld05hbWUgKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgcHJpbnRmKFwiVGhlICVzICVzICVzIGNlbGwgdmlldyBkb2VzIG5vdCBleGlzdC5cXG5cIiBsaWJyYXJ5IGNlbGxOYW1lIHZpZXdOYW1lKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgcHJpbnRmKFwiUGxlYXNlIGZpeCBhbmQgcnVuIGFnYWluLlxcblwiKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgcmV0dXJuKCkiCiAgICAgIHB1dHMgJG9wICIgICAgKSIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgIiAgICA7IENvcHkgcHJlc2VudCB2aWV3IHRvIGEgbGF5b3V0IHZpZXcgKG9yIHZhbHVlIGRlZmluZWQgYnkgcGFyYW1ldGVyIG5ld1ZpZXcpIgogICAgICBwdXRzICRvcCAiICAgIHByaW50ZihcIiAgUnVubmluZyBnZ0NyZWF0ZVN5bWJvbEFuZENERjpcXG5cIikiCiAgICAgIHB1dHMgJG9wICIgICAgcHJpbnRmKFwiICBDb3B5ICVzICVzICVzIHRvICVzICVzICVzLlxcblwiIGxpYnJhcnkgY2VsbE5hbWUgdmlld05hbWUgbGlicmFyeSBjZWxsTmFtZSBuZXdWaWV3KSIKICAgICAgcHV0cyAkb3AgIiAgICB1bmxlc3MoZGJDb3B5Q2VsbFZpZXcoY3YgbGlicmFyeSBjZWxsTmFtZSBuZXdWaWV3IG5pbCBuaWwgb3ZlcndyaXRlKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgcHJpbnRmKFwiQ2FuJ3QgY3JlYXRlIHRoZSBuZXcgJXMgdmlldy5cXG5cIiBuZXdWaWV3KSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgcHJpbnRmKFwiUGxlYXNlIHVzZSB0aGUgb3ZlcndyaXRlIHBhcmFtZXRlcjogZ2dDcmVhdGVTeW1ib2xBbmRDREYobGliIGNlbGwgdmlldyB2ZXJpbG9nZmlsZSB0KSBhbmQgY2hlY2sgcGVybWlzc2lvbnMuXFxuXCIpIgogICAgICBwdXRzICRvcCAiICAgICAgICByZXR1cm4oKSIKICAgICAgcHV0cyAkb3AgIiAgICApIgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiICAgIDsgUmVtYXN0ZXIgaW5zdGFuY2VzIGZyb20gdHlwZSBhYnN0cmFjdCB0byBsYXlvdXQgaW4gdGhlIGxheW91dCB2aWV3IgogICAgICBwdXRzICRvcCAiICAgIGN2Mj1kYk9wZW5DZWxsVmlld0J5VHlwZSggbGlicmFyeSBjZWxsTmFtZSBuZXdWaWV3IFwibWFza0xheW91dFwiIFwiYVwiKSIKICAgICAgcHV0cyAkb3AgIiAgICBwcmludGYoXCIgIE9wZW4gJXMgJXMgJXMgZm9yIGVkaXQuXFxuXCIgbGlicmFyeSBjZWxsTmFtZSBuZXdWaWV3KSIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgIiAgICBpaHM9c2V0b2YoaWggY3Yyfj5pbnN0SGVhZGVycyBpaH4+dmlld05hbWU9PVwiYWJzdHJhY3RcIikiCiAgICAgIHB1dHMgJG9wICIgICAgZm9yZWFjaChpaCBpaHMiCiAgICAgIHB1dHMgJG9wICIgICAgICAgIHdoZW4oZGRHZXRPYmooaWh+PmxpYk5hbWUgaWh+PmNlbGxOYW1lIFwibGF5b3V0XCIgKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgICAgIGlofj5tYXN0ZXIgPSBkYk9wZW5DZWxsVmlld0J5VHlwZSggaWh+PmxpYk5hbWUgaWh+PmNlbGxOYW1lIFwibGF5b3V0XCIgKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgKSIKICAgICAgcHV0cyAkb3AgIiAgICApIgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiICAgIGRiU2F2ZShjdjIpIgogICAgICBwdXRzICRvcCAiICAgIGRiQ2xvc2UoY3YyKSIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgIiAgICA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsiCiAgICAgIHB1dHMgJG9wICIgICAgOyBVc2UgdmVyaWxvZ0luIHRvIGNyZWF0ZSBhIHN5bWJvbCIKICAgICAgcHV0cyAkb3AgIiAgICA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsiCiAgICAgIHB1dHMgJG9wICIgICAgcHJpbnRmKFwiICBSdW5uaW5nIFZlcmlsb2dJbiB0byBjcmVhdGUgdGhlICVzICVzIHN5bWJvbCB2aWV3LlxcblwiIGxpYnJhcnkgY2VsbE5hbWUpIgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiICAgIDsgQ3JlYXRlIHRoZSBpaGRsIGNvbW1hbmQgZmlsZSBpbiAvdG1wIgogICAgICBwdXRzICRvcCAiICAgIHByaW50ZihcIiAgICBDcmVhdGluZyAvdG1wL2loZGxfZmlsZXNfJXNcXG5cIiBjZWxsTmFtZSkiCiAgICAgIHB1dHMgJG9wICIgICAgT1VURklMRT1vdXRmaWxlKHN0cmNhdChcIi90bXAvaWhkbF9maWxlc19cIiBjZWxsTmFtZSkpIgogICAgICBwdXRzICRvcCAiICAgIGZwcmludGYoIE9VVEZJTEUgXCItcGFyYW0gL3RtcC9paGRsX3BhcmFtc18lc1xcblwiIGNlbGxOYW1lKSIKICAgICAgcHV0cyAkb3AgIiAgICBmcHJpbnRmKCBPVVRGSUxFIFwiLWNkc2xpYiAuL2Nkcy5saWJcXG5cIikiCiAgICAgIHB1dHMgJG9wICIgICAgY2xvc2UoT1VURklMRSkiCiAgICAgIHB1dHMgJG9wICIgICAgT1VURklMRT1uaWwiCiAgICAgIHB1dHMgJG9wICIiCiAgICAgIHB1dHMgJG9wICIgICAgOyBDcmVhdGUgdGhlIGloZGwgcGFyYW1ldGVycyBmaWxlIGluIC90bXAiCiAgICAgIHB1dHMgJG9wICIgICAgOyBOZWVkIHRvIHNldCBwb3dlciBhbmQgZ3JvdW5kIG5ldHMgdG8gYSBuYW1lIG5vdCB1c2VkIGluIHRoZSBpbnB1dCIKICAgICAgcHV0cyAkb3AgIiAgICA7IHZlcmlsb2cgbmV0bGlzdCBvciB0aGUgcG93ZXIgYW5kIGdyb3VuZCBwaW5zIHdpbGwgYmUgY2hhbmdlZCB0byIKICAgICAgcHV0cyAkb3AgIiAgICA7IGdsb2JhbCBuYW1lcyBvbiB0aGUgc3ltYm9sIHBpbnMuIgogICAgICBwdXRzICRvcCAiICAgIHByaW50ZihcIiAgICBDcmVhdGluZyAvdG1wL2loZGxfcGFyYW1zXyVzXFxuXCIgY2VsbE5hbWUpIgogICAgICBwdXRzICRvcCAiICAgIE9VVEZJTEU9b3V0ZmlsZShzdHJjYXQoXCIvdG1wL2loZGxfcGFyYW1zX1wiIGNlbGxOYW1lKSkiCiAgICAgIHB1dHMgJG9wICIgICAgZnByaW50ZiggT1VURklMRSBcImRlc3Rfc2NoX2xpYiA6PSAlc1xcblwiIGxpYnJhcnkpIgogICAgICBwdXRzICRvcCAiICAgIGZwcmludGYoIE9VVEZJTEUgXCJyZWZfbGliX2xpc3QgOj0gYmFzaWNcXG5cIikiCiAgICAgIHB1dHMgJG9wICIgICAgZnByaW50ZiggT1VURklMRSBcInN0cnVjdHVyYWxfdmlld3MgOj0gNFxcblwiKSIKICAgICAgcHV0cyAkb3AgIiAgICBmcHJpbnRmKCBPVVRGSUxFIFwiZnVuY3Rpb25hbF92aWV3X25hbWUgOj0gZnVuY3Rpb25hbF90b3Bvbmx5XFxuXCIpIgogICAgICBwdXRzICRvcCAiICAgIGZwcmludGYoIE9VVEZJTEUgXCJzeW1ib2xfdmlld19uYW1lIDo9IHN5bWJvbFxcblwiKSIKICAgICAgcHV0cyAkb3AgIiAgICBmcHJpbnRmKCBPVVRGSUxFIFwib3ZlcndyaXRlX3N5bWJvbCA6PSAxXFxuXCIpIgogICAgICBwdXRzICRvcCAiICAgIGZwcmludGYoIE9VVEZJTEUgXCJwb3dlcl9uZXQgOj0gUHh4X2R1bW15VmFsdWVcXG5cIikiCiAgICAgIHB1dHMgJG9wICIgICAgZnByaW50ZiggT1VURklMRSBcImdyb3VuZF9uZXQgOj0gR3h4X2R1bW15VmFsdWVcXG5cIikiCiAgICAgIHB1dHMgJG9wICIgICAgZnByaW50ZiggT1VURklMRSBcImxvZ19maWxlX25hbWUgOj0gLi9WZXJpbG9nSW4ubG9nXFxuXCIpIgogICAgICBwdXRzICRvcCAiICAgIGNsb3NlKE9VVEZJTEUpIgogICAgICBwdXRzICRvcCAiICAgIE9VVEZJTEU9bmlsIgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiICAgIDsgUGFyc2UgdGhlIFZlcmlsb2cgZmlsZSBmcm9tIElubm92dXMgYW5kIGNyZWF0ZSBhIFZlcmlsb2cgZmlsZSB3aXRoIGp1c3QgdGhlIgogICAgICBwdXRzICRvcCAiICAgIDsgdG9wIG1vZHVsZSBkZWZpbml0aW9uIGZvciBcImNlbGxOYW1lXCIgd2l0aCBvbmx5IHRoZSBwaW5zIGRlZmluZS4iCiAgICAgIHB1dHMgJG9wICIgICAgOyBUaGUgcmVndWxhciBleHByZXNzaW9uIGNoZWNrcyB0byBzdGFydCBhbmQgc3RvcCBwcmludGluZyB0aGUgVmVyaWxvZyIKICAgICAgcHV0cyAkb3AgIiAgICA7IG1vZHVsZSBhcmUgc2ltcGxlIGFuZCB0aWVkIHRvIHRoZSBzeW50YXggZnJvbSBFREkuIEl0IHN0YXJ0cyBvbiB0aGUgZXhhY3QiCiAgICAgIHB1dHMgJG9wICIgICAgOyBzdHJpbmcgXCJtb2R1bGUgY2VsbE5hbWVcIiB3aGVyZSBjZWxsTmFtZSBpcyB5b3VyIGNlbGxOYW1lLiBJdCBzdG9wcyBhdCB0aGUiCiAgICAgIHB1dHMgJG9wICIgICAgOyBmaXJzdCBjb21tZW50IGxpbmUgd2hpY2ggaGFzIGJlZW4gXCIvLyBJbnRlcm5hbCB3aXJlc1wiIG9yIgogICAgICBwdXRzICRvcCAiICAgIDsgXCIvLyBNb2R1bGUgaW5zdGFudGlhdGlvbnNcIiBpbiBteSBleGFtcGxlcy4gVGhlc2UgY29tZSBhZnRlciB0aGUgcGluIgogICAgICBwdXRzICRvcCAiICAgIDsgZGVmaW5pdGlvbnMuIgogICAgICBwdXRzICRvcCAiICAgIHByaW50ZihcIiAgICBDcmVhdGluZyAvdG1wL2loZGxfdmVyaWxvZ18lcy52XFxuXCIgY2VsbE5hbWUpIgogICAgICBwdXRzICRvcCAiICAgIElORklMRT1pbmZpbGUodmVyaWxvZ0ZpbGUpIgogICAgICBwdXRzICRvcCAiICAgIE9VVEZJTEU9b3V0ZmlsZShzcHJpbnRmKG5pbCBcIi90bXAvaWhkbF92ZXJpbG9nXyVzLnZcIiBjZWxsTmFtZSkpIgogICAgICBwdXRzICRvcCAiICAgIHN0YXJ0U3RyaW5nPWJ1aWxkU3RyaW5nKCBsaXN0KFwibW9kdWxlXCIgY2VsbE5hbWUpICkiCiAgICAgIHB1dHMgJG9wICIgICAgcHJpbnRNb2R1bGU9XCJub1wiIgogICAgICBwdXRzICRvcCAiICAgIHdoZW4oIElORklMRSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgd2hpbGUoIGdldHMobmV4dExpbmUgSU5GSUxFKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgICAgIGlmKChyZXhNYXRjaHAoc3RhcnRTdHJpbmcgbmV4dExpbmUpIHx8IHByaW50TW9kdWxlPT1cInllc1wiKSB0aGVuIgogICAgICBwdXRzICRvcCAiICAgICAgICAgICAgICAgIGlmKHJleE1hdGNocChcIi8vXCIgbmV4dExpbmUpIHRoZW4iCiAgICAgIHB1dHMgJG9wICIgICAgICAgICAgICAgICAgICAgIHByaW50TW9kdWxlPVwibm9cIiIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihPVVRGSUxFIFwiZW5kbW9kdWxlXFxuXCIpIgogICAgICBwdXRzICRvcCAiICAgICAgICAgICAgICAgIGVsc2UiCiAgICAgIHB1dHMgJG9wICIgICAgICAgICAgICAgICAgICAgIHByaW50TW9kdWxlPVwieWVzXCIiCiAgICAgIHB1dHMgJG9wICIgICAgICAgICAgICAgICAgICAgIGZwcmludGYoT1VURklMRSBuZXh0TGluZSkiCiAgICAgIHB1dHMgJG9wICIgICAgICAgICAgICAgICAgKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgICAgICkgOyBpZiBtb2R1bGUgY2VsbE5hbWUiCiAgICAgIHB1dHMgJG9wICIgICAgICAgICkgOyB3aGlsZSBuZXh0TGluZSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgY2xvc2UoSU5GSUxFKSIKICAgICAgcHV0cyAkb3AgIiAgICApIDsgd2hlbiBJTkZJTEUiCiAgICAgIHB1dHMgJG9wICIgICAgY2xvc2UoT1VURklMRSkiCiAgICAgIHB1dHMgJG9wICIgICAgT1VURklMRT1uaWwiCiAgICAgIHB1dHMgJG9wICIiCiAgICAgIHB1dHMgJG9wICIgICAgOyBSdW4gaWhkbCB0byBjcmVhdGUgdGhlIHN5bWJvbCB2aWV3IGFuZCB0ZW1wb3JhcnkgZnVuY3Rpb25hbCB2aWV3LiIKICAgICAgcHV0cyAkb3AgIiAgICA7IEZ1bmN0aW9uIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIHN5bWJvbCB2aWV3IGlmIHByZXZpb3VzbHkgY3JlYXRlZCBieSBWZXJpbG9nSW4uIgogICAgICBwdXRzICRvcCAiICAgIHByaW50ZihcIiAgICBSdW5uaW5nIGloZGwgLWYgL3RtcC9paGRsX2ZpbGVzXyVzIC90bXAvaWhkbF92ZXJpbG9nXyVzLnYgPiYgVmVyaWxvZ0luX3N0ZG91dF8lcy5sb2dcXG5cIiBjZWxsTmFtZSBjZWxsTmFtZSBjZWxsTmFtZSkiCiAgICAgIHB1dHMgJG9wICIgICAgc3lzdGVtKHNwcmludGYobmlsIFwiaWhkbCAtZiAvdG1wL2loZGxfZmlsZXNfJXMgL3RtcC9paGRsX3Zlcmlsb2dfJXMudiA+JiBWZXJpbG9nSW5fc3Rkb3V0XyVzLmxvZ1wiIGNlbGxOYW1lIGNlbGxOYW1lIGNlbGxOYW1lICkpIgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiICAgIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyIKICAgICAgcHV0cyAkb3AgIiAgICA7IENvcHkgdGhlIHN5bWJvbCB2aWV3IHRvIGFuIGF1Q2RsIHZpZXciCiAgICAgIHB1dHMgJG9wICIgICAgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiICAgIHByaW50ZihcIiAgQ29weSAlcyAlcyBzeW1ib2wgdG8gJXMgJXMgYXVDZGwuXFxuXCIgbGlicmFyeSBjZWxsTmFtZSBsaWJyYXJ5IGNlbGxOYW1lKSIKICAgICAgcHV0cyAkb3AgIiAgICBuZXdWaWV3PVwiYXVDZGxcIiIKICAgICAgcHV0cyAkb3AgIiAgICBjdjM9ZGJPcGVuQ2VsbFZpZXdCeVR5cGUoIGxpYnJhcnkgY2VsbE5hbWUgXCJzeW1ib2xcIikiCiAgICAgIHB1dHMgJG9wICIgICAgY3Y0PWRiQ29weUNlbGxWaWV3KCBjdjMgbGlicmFyeSBjZWxsTmFtZSBuZXdWaWV3IG5pbCBuaWwgb3ZlcndyaXRlKSIKICAgICAgcHV0cyAkb3AgIiAgICBkYkNyZWF0ZVByb3AoY3Y0IFwiQ0RMX05FVExJU1RfRklMRVwiICdzdHJpbmcgXCJjZGwubmV0bGlzdFwiKSIKICAgICAgcHV0cyAkb3AgIiAgICBwb3J0b3JkZXIgPSBjdjR+PnBvcnRPcmRlciIKICAgICAgcHV0cyAkb3AgIiAgICBkYkNsb3NlKGN2MykiCiAgICAgIHB1dHMgJG9wICIgICAgZGJTYXZlKGN2NCkiCiAgICAgIHB1dHMgJG9wICIgICAgZGJDbG9zZShjdjQpIgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiICAgIDtDb252ZXJ0IHRoZSB2ZXJpbG9nIG5ldGxpc3QgdG8gY2RsIG5ldGxpc3QgYW5kIHN0b3JlIGl0IGluIHRoZSBhdUNkbCBjZWxsdmlldy4iCiAgICAgIHB1dHMgJG9wICIgICAgY2RscGF0aCA9IGRkR2V0T2JqUmVhZFBhdGgoZGRHZXRPYmooIGxpYnJhcnkgY2VsbE5hbWUgbmV3VmlldyApKSIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgIiAgICBsZXQoKHBhdGhzKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICBwYXRocyA9IHBhcnNlU3RyaW5nKGdldFNoZWxsRW52VmFyKFwiUEFUSFwiKSBcIjpcIikiCiAgICAgIHB1dHMgJG9wICIgICAgICAgaWYoIGlzRmlsZU5hbWUoXCJ2MmNkbFwiIHBhdGhzKSB0aGVuIgogICAgICBwdXRzICRvcCAiICAgICAgICAgIHN5c3RlbShzcHJpbnRmKG5pbCBcInYyY2RsIC12ICVzIC1vICVzL2NkbC5uZXRsaXN0IC1hIFxcXCJcPFw+XFxcIiBcPlwmIHYyY2RsLmxvZ1wiIHZlcmlsb2dGaWxlIGNkbHBhdGgpKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICBlbHNlIgogICAgICBwdXRzICRvcCAiICAgICAgICAgIGlmKCBpc0ZpbGVOYW1lKFwidjJsdnNcIiBwYXRocykgdGhlbiIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgICAgICBzeXN0ZW0oc3ByaW50ZihuaWwgXCJ2Mmx2cyAtdiAlcyAtbyAlcy9jZGwubmV0bGlzdCAtYSBcXFwiXDxcPlxcXCIgXD5cJiB2MmNkbC5sb2dcIiB2ZXJpbG9nRmlsZSBjZGxwYXRoKSkiCiAgICAgIHB1dHMgJG9wICIgICAgICAgICAgZWxzZSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgICAgICBwcmludGYoXCIgICBFUlJPUjogVW5hYmxlIHRvIGZpbmQgVmVyaWxvZyAtPiBDREwgdHJhbnNsYXRvciEhIVxcblwiKSIKICAgICAgcHV0cyAkb3AgIiAgICAgICAgICAgICBwcmludGYoXCIgICAgICAgICAgTmVpdGhlciB2MmNkbCBub3IgdjJsdnMgd2VyZSBmb3VuZCBpbiB5b3VyIHBhdGguXFxuXFxuXFxuXCIpIgogICAgICBwdXRzICRvcCAiICAgICAgICkiCiAgICAgIHB1dHMgJG9wICIgICAgKSIKICAgICAgcHV0cyAkb3AgIiIKICAgICAgcHV0cyAkb3AgIiAgICA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsiCiAgICAgIHB1dHMgJG9wICIgICAgOyBDcmVhdGUgdGhlIGJhc2UgbGV2ZWwgQ0RGIGZvciBhdUNkbCBuZXRsaXN0aW5nIgogICAgICBwdXRzICRvcCAiICAgIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyIKICAgICAgcHV0cyAkb3AgIiAgICA7IFRoZSBzdWJja3Qgb2YgdGhlIHRvcCBtb2R1bGUgaXMgbmV0bGlzdGVkLiBXaGVuIHJ1bm5pbmcgUFZTIExWUyBpbmNsdWRlIgogICAgICBwdXRzICRvcCAiICAgIDsgdGhlIHRvcCBsZXZlbCBWZXJpbG9nIG5ldGxpc3QgYW5kIGFzc29jaWF0ZWQgSVAgY2RsIG5ldGxpc3RzLiIKICAgICAgcHV0cyAkb3AgIiAgICBwcmludGYoXCIgIENyZWF0ZSBCYXNlIGxldmVsIENERiBmb3IgJXMgJXMgdG8gc3VwcG9ydCBjZGwgbmV0bGlzdGluZy5cXG5cIiBsaWJyYXJ5IGNlbGxOYW1lKSIKICAgICAgcHV0cyAkb3AgIiAgICBjaWQ9ZGRHZXRPYmoobGlicmFyeSBjZWxsTmFtZSkiCiAgICAgIHB1dHMgJG9wICIgICAgdW5sZXNzKGJhc2VDREZpZD1jZGZHZXRCYXNlQ2VsbENERihjaWQpIgogICAgICBwdXRzICRvcCAiICAgICAgICBiYXNlQ0RGaWQ9Y2RmQ3JlYXRlQmFzZUNlbGxDREYoY2lkKSIKICAgICAgcHV0cyAkb3AgIgliYXNlQ0RGaWQtPnNpbUluZm8gPSBsaXN0KCBuaWwgKSIKICAgICAgcHV0cyAkb3AgIgliYXNlQ0RGaWQtPnNpbUluZm8tPmF1Q2RsID0gJyhuaWwpIgogICAgICBwdXRzICRvcCAiICAgICkiCiAgICAgIHB1dHMgJG9wICIgICAgYmFzZUNERmlkLT5zaW1JbmZvLT5hdUNkbC0+bmV0bGlzdFByb2NlZHVyZT1cImFuc0NkbFN1YmNrdENhbGxcIiIKICAgICAgcHV0cyAkb3AgIiAgICBiYXNlQ0RGaWQtPnNpbUluZm8tPmF1Q2RsLT5uYW1lUHJlZml4PVwiWFwiIgogICAgICBwdXRzICRvcCAiICAgIGJhc2VDREZpZC0+c2ltSW5mby0+YXVDZGwtPmNvbXBvbmVudE5hbWU9XCJzdWJjaXJjdWl0XCIiCiAgICAgIHB1dHMgJG9wICIgICAgYmFzZUNERmlkLT5zaW1JbmZvLT5hdUNkbC0+dGVybU9yZGVyPXBvcnRvcmRlciIKICAgICAgcHV0cyAkb3AgIiAgICA7YmFzZUNERmlkLT5zaW1JbmZvLT5hdUNkbC0+bW9kZWxOYW1lPVwiY291bnRlcnNcIiIKICAgICAgcHV0cyAkb3AgIiAgICBjZGZTYXZlQ0RGKGJhc2VDREZpZCkiCiAgICAgIHB1dHMgJG9wICIiCiAgICAgIHB1dHMgJG9wICIgICAgKSA7IHByb2ciCiAgICAgIHB1dHMgJG9wICIiCiAgICAgIHB1dHMgJG9wICIpIDsgcHJvY2VkdXJlIGdnQ3JlYXRlU3ltYm9sQW5kQ0RGKCkiCiAgICAgIGNsb3NlICRvcAogICAKICAgICAgc2V0IGNvbW1hbmRzICIiCiAgICAgIAogICAgICBzZXQgbmV0bGlzdCAkdmFycyhkYnNfZGlyKS8kdmFycyhkZXNpZ24pX3BoeXNfbm9maWxsLnYKICAgICAgCiAgICAgICMgQ3JlYXRlIHRoZSBuZXRsaXN0CiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBhcHBlbmQgY29tbWFuZHMgInNhdmVOZXRsaXN0ICRuZXRsaXN0IC1leGNsdWRlTGVhZkNlbGwgLXBoeXMgLWV4Y2x1ZGVDZWxsSW5zdCBcW2RiR2V0IC11IC1lIHRvcC5waHlzSW5zdHMuY2VsbC5uYW1lXF1cbiIKICAgICAgCiAgICAgICMgQ3JlYXRlIHRoZSAuc2ltcmMgZmlsZQogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgc2V0IG9wIFtvcGVuIC5zaW1yYyB3XQogICAgICBwdXRzICRvcCAiYXVDZGxFbmFibGVOZXRsaXN0SW5jbHVzaW9uPXQiCiAgICAgIHB1dHMgJG9wICJhdUNkbENERlBpbkNudHJsPXQiCiAgICAgIGNsb3NlICRvcAogICAgICAKICAgICAgIyBDcmVhdGUgdGhlIFZpcnR1b3NvIHJlcGxheSBmaWxlCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvUG9zdFByb2Nlc3NJblZpcnR1b3NvLmlsIHddCiAgICAgIHB1dHMgJG9wICJsb2FkKFwiJHZhcnMoc2NyaXB0X2RpcikvZ2dDcmVhdGVTeW1ib2xBbmRDREYuaWxcIikiCiAgICAgIHB1dHMgJG9wICJnZ0NyZWF0ZVN5bWJvbEFuZENERihcIiR2YXJzKG9hX2Rlc2lnbl9saWIpXCIgXCIkdmFycyhkZXNpZ24pXCIgXCJzaWdub2ZmXCIgXCIkbmV0bGlzdFwiIHQpIgogICAgICBwdXRzICRvcCAiZXhpdCgpIgogICAgICBjbG9zZSAkb3AKICAgICAgCiAgICAgICMgQ2FsbCBWaXJ0dW9zbyAKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGlmICFbc3RyaW5nIG1hdGNoIFthdXRvX2V4ZWNvayB2aXJ0dW9zb10gIiJdIHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbmV4ZWMgdmlydHVvc28gLXJlcGxheSAkdmFycyhzY3JpcHRfZGlyKS9Qb3N0UHJvY2Vzc0luVmlydHVvc28uaWwgLW5vZ3JhcGggLWxvZyAkdmFycyhsb2dfZGlyKS9Qb3N0UHJvY2Vzc0luVmlydHVvc28ubG9nXG4iIAogICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCB3YXJuaW5ncygkdmFycyh3YXJuaW5nX2NvdW50KSkgIlVuYWJsZSB0byBmaW5kIFZpcnR1b3NvIGV4ZWN1dGFibGUhIFRoZSByZW1hc3RlcmVkIGxheW91dCB2aWV3LCBzeW1ib2wsIGF1Q2RsIHZpZXdzIGFuZCBhdUNkbCBDREYgd2lsbCBub3QgYmUgY3JlYXRlZCIKICAgICAgICAgaW5jciB2YXJzKHdhcm5pbmdfY291bnQpCiAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgfQogICB9Cgp9Cg==