IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQ0KIyBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbg0KIyBjc3YgcGFja2FnZSB1bml0IHRlc3RzDQoNCmltcG9ydCBzeXMNCmltcG9ydCBvcw0KaW1wb3J0IHVuaXR0ZXN0DQpmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTw0KaW1wb3J0IHRlbXBmaWxlDQppbXBvcnQgY3N2DQppbXBvcnQgZ2MNCmltcG9ydCBpbw0KZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQNCg0KY2xhc3MgVGVzdF9Dc3YodW5pdHRlc3QuVGVzdENhc2UpOg0KICAgICIiIg0KICAgIFRlc3QgdGhlIHVuZGVybHlpbmcgQyBjc3YgcGFyc2VyIGluIHdheXMgdGhhdCBhcmUgbm90IGFwcHJvcHJpYXRlDQogICAgZnJvbSB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UuIEZ1cnRoZXIgdGVzdHMgb2YgdGhpcyBuYXR1cmUgYXJlIGRvbmUNCiAgICBpbiBUZXN0RGlhbGVjdFJlZ2lzdHJ5Lg0KICAgICIiIg0KICAgIGRlZiBfdGVzdF9hcmdfdmFsaWQoc2VsZiwgY3RvciwgYXJnKToNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIE5vbmUpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBiYWRfYXR0ciA9IDApDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXIgPSAwKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgZGVsaW1pdGVyID0gJ1hYJykNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBjdG9yLCBhcmcsICdmb28nKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgZGVsaW1pdGVyPU5vbmUpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXI9MSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIHF1b3RlY2hhcj0xKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgbGluZXRlcm1pbmF0b3I9Tm9uZSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIGxpbmV0ZXJtaW5hdG9yPTEpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBxdW90aW5nPU5vbmUpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9BTEwsIHF1b3RlY2hhcj0nJykNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTCwgcXVvdGVjaGFyPU5vbmUpDQoNCiAgICBkZWYgdGVzdF9yZWFkZXJfYXJnX3ZhbGlkKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2FyZ192YWxpZChjc3YucmVhZGVyLCBbXSkNCg0KICAgIGRlZiB0ZXN0X3dyaXRlcl9hcmdfdmFsaWQoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3RfYXJnX3ZhbGlkKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpDQoNCiAgICBkZWYgX3Rlc3RfZGVmYXVsdF9hdHRycyhzZWxmLCBjdG9yLCAqYXJncyk6DQogICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MpDQogICAgICAgICMgQ2hlY2sgZGVmYXVsdHMNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICcsJykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kb3VibGVxdW90ZSwgVHJ1ZSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5lc2NhcGVjaGFyLCBOb25lKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmxpbmV0ZXJtaW5hdG9yLCAiXHJcbiIpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGVjaGFyLCAnIicpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGluZywgY3N2LlFVT1RFX01JTklNQUwpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc2tpcGluaXRpYWxzcGFjZSwgRmFsc2UpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBGYWxzZSkNCiAgICAgICAgIyBUcnkgZGVsZXRpbmcgb3IgY2hhbmdpbmcgYXR0cmlidXRlcyAodGhleSBhcmUgcmVhZC1vbmx5KQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlbGF0dHIsIG9iai5kaWFsZWN0LCAnZGVsaW1pdGVyJykNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBvYmouZGlhbGVjdCwgJ2RlbGltaXRlcicsICc6JykNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGRlbGF0dHIsIG9iai5kaWFsZWN0LCAncXVvdGluZycpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBvYmouZGlhbGVjdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1b3RpbmcnLCBOb25lKQ0KDQogICAgZGVmIHRlc3RfcmVhZGVyX2F0dHJzKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2RlZmF1bHRfYXR0cnMoY3N2LnJlYWRlciwgW10pDQoNCiAgICBkZWYgdGVzdF93cml0ZXJfYXR0cnMoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3RfZGVmYXVsdF9hdHRycyhjc3Yud3JpdGVyLCBTdHJpbmdJTygpKQ0KDQogICAgZGVmIF90ZXN0X2t3X2F0dHJzKHNlbGYsIGN0b3IsICphcmdzKToNCiAgICAgICAgIyBOb3cgdHJ5IHdpdGggYWx0ZXJuYXRlIG9wdGlvbnMNCiAgICAgICAga3dhcmdzID0gZGljdChkZWxpbWl0ZXI9JzonLCBkb3VibGVxdW90ZT1GYWxzZSwgZXNjYXBlY2hhcj0nXFwnLA0KICAgICAgICAgICAgICAgICAgICAgIGxpbmV0ZXJtaW5hdG9yPSdccicsIHF1b3RlY2hhcj0nKicsDQogICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSwgc2tpcGluaXRpYWxzcGFjZT1UcnVlLA0KICAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1UcnVlKQ0KICAgICAgICBvYmogPSBjdG9yKCphcmdzLCAqKmt3YXJncykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICc6JykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kb3VibGVxdW90ZSwgRmFsc2UpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZXNjYXBlY2hhciwgJ1xcJykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5saW5ldGVybWluYXRvciwgIlxyIikNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90ZWNoYXIsICcqJykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90aW5nLCBjc3YuUVVPVEVfTk9ORSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnN0cmljdCwgVHJ1ZSkNCg0KICAgIGRlZiB0ZXN0X3JlYWRlcl9rd19hdHRycyhzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdF9rd19hdHRycyhjc3YucmVhZGVyLCBbXSkNCg0KICAgIGRlZiB0ZXN0X3dyaXRlcl9rd19hdHRycyhzZWxmKToNCiAgICAgICAgc2VsZi5fdGVzdF9rd19hdHRycyhjc3Yud3JpdGVyLCBTdHJpbmdJTygpKQ0KDQogICAgZGVmIF90ZXN0X2RpYWxlY3RfYXR0cnMoc2VsZiwgY3RvciwgKmFyZ3MpOg0KICAgICAgICAjIE5vdyB0cnkgd2l0aCBkaWFsZWN0LWRlcml2ZWQgb3B0aW9ucw0KICAgICAgICBjbGFzcyBkaWFsZWN0Og0KICAgICAgICAgICAgZGVsaW1pdGVyPSctJw0KICAgICAgICAgICAgZG91YmxlcXVvdGU9RmFsc2UNCiAgICAgICAgICAgIGVzY2FwZWNoYXI9J14nDQogICAgICAgICAgICBsaW5ldGVybWluYXRvcj0nJCcNCiAgICAgICAgICAgIHF1b3RlY2hhcj0nIycNCiAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTA0KICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZT1UcnVlDQogICAgICAgICAgICBzdHJpY3Q9RmFsc2UNCiAgICAgICAgYXJncyA9IGFyZ3MgKyAoZGlhbGVjdCwpDQogICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZGVsaW1pdGVyLCAnLScpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZG91YmxlcXVvdGUsIEZhbHNlKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsICdeJykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5saW5ldGVybWluYXRvciwgIiQiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RlY2hhciwgJyMnKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RpbmcsIGNzdi5RVU9URV9BTEwpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc2tpcGluaXRpYWxzcGFjZSwgVHJ1ZSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5zdHJpY3QsIEZhbHNlKQ0KDQogICAgZGVmIHRlc3RfcmVhZGVyX2RpYWxlY3RfYXR0cnMoc2VsZik6DQogICAgICAgIHNlbGYuX3Rlc3RfZGlhbGVjdF9hdHRycyhjc3YucmVhZGVyLCBbXSkNCg0KICAgIGRlZiB0ZXN0X3dyaXRlcl9kaWFsZWN0X2F0dHJzKHNlbGYpOg0KICAgICAgICBzZWxmLl90ZXN0X2RpYWxlY3RfYXR0cnMoY3N2LndyaXRlciwgU3RyaW5nSU8oKSkNCg0KDQogICAgZGVmIF93cml0ZV90ZXN0KHNlbGYsIGZpZWxkcywgZXhwZWN0LCAqKmt3YXJncyk6DQogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpDQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosICoqa3dhcmdzKQ0KICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGZpZWxkcykNCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ICsgd3JpdGVyLmRpYWxlY3QubGluZXRlcm1pbmF0b3IpDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkNCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQ0KDQogICAgZGVmIHRlc3Rfd3JpdGVfYXJnX3ZhbGlkKHNlbGYpOg0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3dyaXRlX3Rlc3QsIE5vbmUsICcnKQ0KICAgICAgICBzZWxmLl93cml0ZV90ZXN0KCgpLCAnJykNCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbTm9uZV0sICciIicpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fd3JpdGVfdGVzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgW05vbmVdLCBOb25lLCBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpDQogICAgICAgICMgQ2hlY2sgdGhhdCBleGNlcHRpb25zIGFyZSBwYXNzZWQgdXAgdGhlIGNoYWluDQogICAgICAgIGNsYXNzIEJhZExpc3Q6DQogICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToNCiAgICAgICAgICAgICAgICByZXR1cm4gMTA7DQogICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6DQogICAgICAgICAgICAgICAgaWYgaSA+IDI6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3INCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc2VsZi5fd3JpdGVfdGVzdCwgQmFkTGlzdCgpLCAnJykNCiAgICAgICAgY2xhc3MgQmFkSXRlbToNCiAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOg0KICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3INCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc2VsZi5fd3JpdGVfdGVzdCwgW0JhZEl0ZW0oKV0sICcnKQ0KDQogICAgZGVmIHRlc3Rfd3JpdGVfYmlnZmllbGQoc2VsZik6DQogICAgICAgICMgVGhpcyBleGVyY2lzZXMgdGhlIGJ1ZmZlciByZWFsbG9jIGZ1bmN0aW9uYWxpdHkNCiAgICAgICAgYmlnc3RyaW5nID0gJ1gnICogNTAwMDANCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbYmlnc3RyaW5nLGJpZ3N0cmluZ10sICclcywlcycgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgKGJpZ3N0cmluZywgYmlnc3RyaW5nKSkNCg0KICAgIGRlZiB0ZXN0X3dyaXRlX3F1b3Rpbmcoc2VsZik6DQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSwicCxxIicpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfdGVzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywxLCdwLHEnXSwgJ2EsMSxwLHEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpDQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSwicCxxIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9NSU5JTUFMKQ0KICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICciYSIsMSwicCxxIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05OVU1FUklDKQ0KICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICciYSIsIjEiLCJwLHEiJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX0FMTCkNCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2FcbmInLDFdLCAnImFcbmIiLCIxIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9BTEwpDQoNCiAgICBkZWYgdGVzdF93cml0ZV9lc2NhcGUoc2VsZik6DQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSwicCxxIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFsnYScsMSwncCwicSInXSwgJ2EsMSwicCxcXCJxXFwiIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWNoYXI9Tm9uZSwgZG91YmxlcXVvdGU9RmFsc2UpDQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLCJxIiddLCAnYSwxLCJwLFxcInFcXCIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIGRvdWJsZXF1b3RlID0gRmFsc2UpDQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWyciJ10sICciIiIiJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTUlOSU1BTCkNCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJ1xcIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX01JTklNQUwsDQogICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlcXVvdGUgPSBGYWxzZSkNCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJ1xcIicsDQogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpDQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSxwXFwscScsDQogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpDQoNCiAgICBkZWYgdGVzdF93cml0ZXJvd3Moc2VsZik6DQogICAgICAgIGNsYXNzIEJyb2tlbkZpbGU6DQogICAgICAgICAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToNCiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yDQogICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoQnJva2VuRmlsZSgpKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB3cml0ZXIud3JpdGVyb3dzLCBbWydhJ11dKQ0KICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQ0KICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3cml0ZXIud3JpdGVyb3dzLCBOb25lKQ0KICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93cyhbWydhJywnYiddLFsnYycsJ2QnXV0pDQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICJhLGJcclxuYyxkXHJcbiIpDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkNCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQ0KDQogICAgZGVmIF9yZWFkX3Rlc3Qoc2VsZiwgaW5wdXQsIGV4cGVjdCwgKiprd2FyZ3MpOg0KICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGlucHV0LCAqKmt3YXJncykNCiAgICAgICAgcmVzdWx0ID0gbGlzdChyZWFkZXIpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3QpDQoNCiAgICBkZWYgdGVzdF9yZWFkX29kZGlucHV0cyhzZWxmKToNCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFtdLCBbXSkNCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnJ10sIFtbXV0pDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBbJyJhYiJjJ10sIE5vbmUsIHN0cmljdCA9IDEpDQogICAgICAgICMgY2Fubm90IGhhbmRsZSBudWxsIGJ5dGVzIGZvciB0aGUgbW9tZW50DQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2FiXDBjJ10sIE5vbmUsIHN0cmljdCA9IDEpDQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJyJhYiJjJ10sIFtbJ2FiYyddXSwgZG91YmxlcXVvdGUgPSAwKQ0KDQogICAgZGVmIHRlc3RfcmVhZF9lb2woc2VsZik6DQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYiddLCBbWydhJywnYiddXSkNCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxiXG4nXSwgW1snYScsJ2InXV0pDQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxyXG4nXSwgW1snYScsJ2InXV0pDQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxyJ10sIFtbJ2EnLCdiJ11dKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWydhLGJccmMsZCddLCBbXSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFsnYSxiXG5jLGQnXSwgW10pDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxyXG5jLGQnXSwgW10pDQoNCiAgICBkZWYgdGVzdF9yZWFkX2VzY2FwZShzZWxmKToNCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxcXGIsYyddLCBbWydhJywgJ2InLCAnYyddXSwgZXNjYXBlY2hhcj0nXFwnKQ0KICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLGJcXCxjJ10sIFtbJ2EnLCAnYixjJ11dLCBlc2NhcGVjaGFyPSdcXCcpDQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsImJcXCxjIiddLCBbWydhJywgJ2IsYyddXSwgZXNjYXBlY2hhcj0nXFwnKQ0KICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiLFxcYyInXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykNCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSwiYixjXFwiIiddLCBbWydhJywgJ2IsYyInXV0sIGVzY2FwZWNoYXI9J1xcJykNCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSwiYixjIlxcJ10sIFtbJ2EnLCAnYixjXFwnXV0sIGVzY2FwZWNoYXI9J1xcJykNCg0KICAgIGRlZiB0ZXN0X3JlYWRfcXVvdGluZyhzZWxmKToNCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnMSwiLDMsIiw1J10sIFtbJzEnLCAnLDMsJywgJzUnXV0pDQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJzEsIiwzLCIsNSddLCBbWycxJywgJyInLCAnMycsICciJywgJzUnXV0sDQogICAgICAgICAgICAgICAgICAgICAgICBxdW90ZWNoYXI9Tm9uZSwgZXNjYXBlY2hhcj0nXFwnKQ0KICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWycxLCIsMywiLDUnXSwgW1snMScsICciJywgJzMnLCAnIicsICc1J11dLA0KICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSwgZXNjYXBlY2hhcj0nXFwnKQ0KICAgICAgICAjIHdpbGwgdGhpcyBmYWlsIHdoZXJlIGxvY2FsZSB1c2VzIGNvbW1hIGZvciBkZWNpbWFscz8NCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnLDMsIjUiLDcuMywgOSddLCBbWycnLCAzLCAnNScsIDcuMywgOV1dLA0KICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9OTlVNRVJJQykNCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnImFcbmIiLCA3J10sIFtbJ2FcbmInLCAnIDcnXV0pDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydhYmMsMyddLCBbW11dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9OT05OVU1FUklDKQ0KDQogICAgZGVmIHRlc3RfcmVhZF9iaWdmaWVsZChzZWxmKToNCiAgICAgICAgIyBUaGlzIGV4ZXJjaXNlcyB0aGUgYnVmZmVyIHJlYWxsb2MgZnVuY3Rpb25hbGl0eSBhbmQgZmllbGQgc2l6ZQ0KICAgICAgICAjIGxpbWl0cy4NCiAgICAgICAgbGltaXQgPSBjc3YuZmllbGRfc2l6ZV9saW1pdCgpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNpemUgPSA1MDAwMA0KICAgICAgICAgICAgYmlnc3RyaW5nID0gJ1gnICogc2l6ZQ0KICAgICAgICAgICAgYmlnbGluZSA9ICclcywlcycgJSAoYmlnc3RyaW5nLCBiaWdzdHJpbmcpDQogICAgICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoW2JpZ2xpbmVdLCBbW2JpZ3N0cmluZywgYmlnc3RyaW5nXV0pDQogICAgICAgICAgICBjc3YuZmllbGRfc2l6ZV9saW1pdChzaXplKQ0KICAgICAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFtiaWdsaW5lXSwgW1tiaWdzdHJpbmcsIGJpZ3N0cmluZ11dKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjc3YuZmllbGRfc2l6ZV9saW1pdCgpLCBzaXplKQ0KICAgICAgICAgICAgY3N2LmZpZWxkX3NpemVfbGltaXQoc2l6ZS0xKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFtiaWdsaW5lXSwgW10pDQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5maWVsZF9zaXplX2xpbWl0LCBOb25lKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZmllbGRfc2l6ZV9saW1pdCwgMSwgTm9uZSkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGNzdi5maWVsZF9zaXplX2xpbWl0KGxpbWl0KQ0KDQogICAgZGVmIHRlc3RfcmVhZF9saW5lbnVtKHNlbGYpOg0KICAgICAgICBmb3IgciBpbiAoY3N2LnJlYWRlcihbJ2xpbmUsMScsICdsaW5lLDInLCAnbGluZSwzJ10pLA0KICAgICAgICAgICAgICAgICAgY3N2LkRpY3RSZWFkZXIoWydsaW5lLDEnLCAnbGluZSwyJywgJ2xpbmUsMyddLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bJ2EnLCAnYicsICdjJ10pKToNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMCkNCiAgICAgICAgICAgIHIubmV4dCgpDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubGluZV9udW0sIDEpDQogICAgICAgICAgICByLm5leHQoKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAyKQ0KICAgICAgICAgICAgci5uZXh0KCkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMykNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHIubmV4dCkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMykNCg0KICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9xdW90ZWVkX25ld2xpbmVzKHNlbGYpOg0KICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQ0KICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3cml0ZXIud3JpdGVyb3dzLCBOb25lKQ0KICAgICAgICAgICAgcm93cyA9IFtbJ2FcbmInLCdiJ10sWydjJywneFxyXG5kJ11dDQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3dzKHJvd3MpDQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgIGZvciBpLCByb3cgaW4gZW51bWVyYXRlKGNzdi5yZWFkZXIoZmlsZW9iaikpOg0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93LCByb3dzW2ldKQ0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpDQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkNCg0KY2xhc3MgVGVzdERpYWxlY3RSZWdpc3RyeSh1bml0dGVzdC5UZXN0Q2FzZSk6DQogICAgZGVmIHRlc3RfcmVnaXN0cnlfYmFkYXJncyhzZWxmKToNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YubGlzdF9kaWFsZWN0cywgTm9uZSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZ2V0X2RpYWxlY3QpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3N2LmdldF9kaWFsZWN0LCBOb25lKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIGNzdi5nZXRfZGlhbGVjdCwgIm5vbmVzdWNoIikNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YudW5yZWdpc3Rlcl9kaWFsZWN0KQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QsIE5vbmUpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIikNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSwgTm9uZSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIiwgMCwgMCkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkYXJndW1lbnQ9Tm9uZSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1Ob25lKQ0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCBbXSkNCg0KICAgIGRlZiB0ZXN0X3JlZ2lzdHJ5KHNlbGYpOg0KICAgICAgICBjbGFzcyBteWV4Y2VsdHN2KGNzdi5leGNlbCk6DQogICAgICAgICAgICBkZWxpbWl0ZXIgPSAiXHQiDQogICAgICAgIG5hbWUgPSAibXlleGNlbHRzdiINCiAgICAgICAgZXhwZWN0ZWRfZGlhbGVjdHMgPSBjc3YubGlzdF9kaWFsZWN0cygpICsgW25hbWVdDQogICAgICAgIGV4cGVjdGVkX2RpYWxlY3RzLnNvcnQoKQ0KICAgICAgICBjc3YucmVnaXN0ZXJfZGlhbGVjdChuYW1lLCBteWV4Y2VsdHN2KQ0KICAgICAgICBzZWxmLmFkZENsZWFudXAoY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCwgbmFtZSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjc3YuZ2V0X2RpYWxlY3QobmFtZSkuZGVsaW1pdGVyLCAnXHQnKQ0KICAgICAgICBnb3RfZGlhbGVjdHMgPSBzb3J0ZWQoY3N2Lmxpc3RfZGlhbGVjdHMoKSkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9kaWFsZWN0cywgZ290X2RpYWxlY3RzKQ0KDQogICAgZGVmIHRlc3RfcmVnaXN0ZXJfa3dhcmdzKHNlbGYpOg0KICAgICAgICBuYW1lID0gJ2ZlZGNiYScNCiAgICAgICAgY3N2LnJlZ2lzdGVyX2RpYWxlY3QobmFtZSwgZGVsaW1pdGVyPSc7JykNCiAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QsIG5hbWUpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3N2LmdldF9kaWFsZWN0KG5hbWUpLmRlbGltaXRlciwgJzsnKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtbJ1gnLCAnWScsICdaJ11dLCBsaXN0KGNzdi5yZWFkZXIoWydYO1k7WiddLCBuYW1lKSkpDQoNCiAgICBkZWYgdGVzdF9pbmNvbXBsZXRlX2RpYWxlY3Qoc2VsZik6DQogICAgICAgIGNsYXNzIG15ZXhjZWx0c3YoY3N2LkRpYWxlY3QpOg0KICAgICAgICAgICAgZGVsaW1pdGVyID0gIlx0Ig0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZXhjZWx0c3YpDQoNCiAgICBkZWYgdGVzdF9zcGFjZV9kaWFsZWN0KHNlbGYpOg0KICAgICAgICBjbGFzcyBzcGFjZShjc3YuZXhjZWwpOg0KICAgICAgICAgICAgZGVsaW1pdGVyID0gIiAiDQogICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUNCiAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAiXFwiDQoNCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoImFiYyBkZWZcbmMxY2NjY2MxIGJlbnplbmVcbiIpDQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgIHJkciA9IGNzdi5yZWFkZXIoZmlsZW9iaiwgZGlhbGVjdD1zcGFjZSgpKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZHIubmV4dCgpLCBbImFiYyIsICJkZWYiXSkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmRyLm5leHQoKSwgWyJjMWNjY2NjMSIsICJiZW56ZW5lIl0pDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkNCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQ0KDQogICAgZGVmIHRlc3RfZGlhbGVjdF9hcHBseShzZWxmKToNCiAgICAgICAgY2xhc3MgdGVzdEEoY3N2LmV4Y2VsKToNCiAgICAgICAgICAgIGRlbGltaXRlciA9ICJcdCINCiAgICAgICAgY2xhc3MgdGVzdEIoY3N2LmV4Y2VsKToNCiAgICAgICAgICAgIGRlbGltaXRlciA9ICI6Ig0KICAgICAgICBjbGFzcyB0ZXN0Qyhjc3YuZXhjZWwpOg0KICAgICAgICAgICAgZGVsaW1pdGVyID0gInwiDQoNCiAgICAgICAgY3N2LnJlZ2lzdGVyX2RpYWxlY3QoJ3Rlc3RDJywgdGVzdEMpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpDQogICAgICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmopDQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KFsxLDIsM10pDQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgIjEsMiwzXHJcbiIpDQogICAgICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQ0KICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQ0KDQogICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQ0KICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCB0ZXN0QSkNCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coWzEsMiwzXSkNCiAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMVx0Mlx0M1xyXG4iKQ0KICAgICAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkNCiAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkNCg0KICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD10ZXN0QigpKQ0KICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQ0KICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICIxOjI6M1xyXG4iKQ0KICAgICAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkNCiAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkNCg0KICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0ndGVzdEMnKQ0KICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQ0KICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICIxfDJ8M1xyXG4iKQ0KICAgICAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkNCiAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkNCg0KICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD10ZXN0QSwgZGVsaW1pdGVyPSc7JykNCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coWzEsMiwzXSkNCiAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMTsyOzNcclxuIikNCiAgICAgICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpDQogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpDQoNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QoJ3Rlc3RDJykNCg0KICAgIGRlZiB0ZXN0X2JhZF9kaWFsZWN0KHNlbGYpOg0KICAgICAgICAjIFVua25vd24gcGFyYW1ldGVyDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIGJhZF9hdHRyID0gMCkNCiAgICAgICAgIyBCYWQgdmFsdWVzDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIGRlbGltaXRlciA9IE5vbmUpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIHF1b3RpbmcgPSAtMSkNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IDEwMCkNCg0KY2xhc3MgVGVzdENzdkJhc2UodW5pdHRlc3QuVGVzdENhc2UpOg0KICAgIGRlZiByZWFkZXJBc3NlcnRFcXVhbChzZWxmLCBpbnB1dCwgZXhwZWN0ZWRfcmVzdWx0KToNCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoaW5wdXQpDQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIoZmlsZW9iaiwgZGlhbGVjdCA9IHNlbGYuZGlhbGVjdCkNCiAgICAgICAgICAgIGZpZWxkcyA9IGxpc3QocmVhZGVyKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZHMsIGV4cGVjdGVkX3Jlc3VsdCkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQ0KICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpDQoNCiAgICBkZWYgd3JpdGVyQXNzZXJ0RXF1YWwoc2VsZiwgaW5wdXQsIGV4cGVjdGVkX3Jlc3VsdCk6DQogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpDQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3QgPSBzZWxmLmRpYWxlY3QpDQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3dzKGlucHV0KQ0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZF9yZXN1bHQpDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkNCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQ0KDQpjbGFzcyBUZXN0RGlhbGVjdEV4Y2VsKFRlc3RDc3ZCYXNlKToNCiAgICBkaWFsZWN0ID0gJ2V4Y2VsJw0KDQogICAgZGVmIHRlc3Rfc2luZ2xlKHNlbGYpOg0KICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCdhYmMnLCBbWydhYmMnXV0pDQoNCiAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6DQogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJzEsMiwzLDQsNScsIFtbJzEnLCcyJywnMycsJzQnLCc1J11dKQ0KDQogICAgZGVmIHRlc3RfYmxhbmtsaW5lKHNlbGYpOg0KICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcnLCBbXSkNCg0KICAgIGRlZiB0ZXN0X2VtcHR5X2ZpZWxkcyhzZWxmKToNCiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnLCcsIFtbJycsICcnXV0pDQoNCiAgICBkZWYgdGVzdF9zaW5nbGVxdW90ZWQoc2VsZik6DQogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyIiJywgW1snJ11dKQ0KDQogICAgZGVmIHRlc3Rfc2luZ2xlcXVvdGVkX2xlZnRfZW1wdHkoc2VsZik6DQogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyIiLCcsIFtbJycsJyddXSkNCg0KICAgIGRlZiB0ZXN0X3NpbmdsZXF1b3RlZF9yaWdodF9lbXB0eShzZWxmKToNCiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnLCIiJywgW1snJywnJ11dKQ0KDQogICAgZGVmIHRlc3Rfc2luZ2xlX3F1b3RlZF9xdW90ZShzZWxmKToNCiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnIiIiIicsIFtbJyInXV0pDQoNCiAgICBkZWYgdGVzdF9xdW90ZWRfcXVvdGVzKHNlbGYpOg0KICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciIiIiIiInLCBbWyciIiddXSkNCg0KICAgIGRlZiB0ZXN0X2lubGluZV9xdW90ZShzZWxmKToNCiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnYSIiYicsIFtbJ2EiImInXV0pDQoNCiAgICBkZWYgdGVzdF9pbmxpbmVfcXVvdGVzKHNlbGYpOg0KICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCdhImIiYycsIFtbJ2EiYiJjJ11dKQ0KDQogICAgZGVmIHRlc3RfcXVvdGVzX2FuZF9tb3JlKHNlbGYpOg0KICAgICAgICAjIEV4Y2VsIHdvdWxkIG5ldmVyIHdyaXRlIGEgZmllbGQgY29udGFpbmluZyAnImEiYicsIGJ1dCB3aGVuDQogICAgICAgICMgcmVhZGluZyBvbmUsIGl0IHdpbGwgcmV0dXJuICdhYicuDQogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyJhImInLCBbWydhYiddXSkNCg0KICAgIGRlZiB0ZXN0X2xvbmVfcXVvdGUoc2VsZik6DQogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2EiYicsIFtbJ2EiYiddXSkNCg0KICAgIGRlZiB0ZXN0X3F1b3RlX2FuZF9xdW90ZShzZWxmKToNCiAgICAgICAgIyBFeGNlbCB3b3VsZCBuZXZlciB3cml0ZSBhIGZpZWxkIGNvbnRhaW5pbmcgJyJhIiAiYiInLCBidXQgd2hlbg0KICAgICAgICAjIHJlYWRpbmcgb25lLCBpdCB3aWxsIHJldHVybiAnYSAiYiInLg0KICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciYSIgImIiJywgW1snYSAiYiInXV0pDQoNCiAgICBkZWYgdGVzdF9zcGFjZV9hbmRfcXVvdGUoc2VsZik6DQogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyAiYSInLCBbWycgImEiJ11dKQ0KDQogICAgZGVmIHRlc3RfcXVvdGVkKHNlbGYpOg0KICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcxLDIsMywiSSB0aGluaywgdGhlcmVmb3JlIEkgYW0iLDUsNicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1snMScsICcyJywgJzMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0kgdGhpbmssIHRoZXJlZm9yZSBJIGFtJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JywgJzYnXV0pDQoNCiAgICBkZWYgdGVzdF9xdW90ZWRfcXVvdGUoc2VsZik6DQogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJzEsMiwzLCIiIkkgc2VlLCIiIHNhaWQgdGhlIGJsaW5kIG1hbiIsImFzIGhlIHBpY2tlZCB1cCBoaXMgaGFtbWVyIGFuZCBzYXciJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWycxJywgJzInLCAnMycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIkkgc2VlLCIgc2FpZCB0aGUgYmxpbmQgbWFuJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcyBoZSBwaWNrZWQgdXAgaGlzIGhhbW1lciBhbmQgc2F3J11dKQ0KDQogICAgZGVmIHRlc3RfcXVvdGVkX25sKHNlbGYpOg0KICAgICAgICBpbnB1dCA9ICcnJ1wNCjEsMiwzLCIiIkkgc2VlLCIiDQpzYWlkIHRoZSBibGluZCBtYW4iLCJhcyBoZSBwaWNrZWQgdXAgaGlzDQpoYW1tZXIgYW5kIHNhdyINCjksOCw3LDYnJycNCiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbChpbnB1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWycxJywgJzInLCAnMycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciSSBzZWUsIlxuc2FpZCB0aGUgYmxpbmQgbWFuJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzIGhlIHBpY2tlZCB1cCBoaXNcbmhhbW1lciBhbmQgc2F3J10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnOScsJzgnLCc3JywnNiddXSkNCg0KICAgIGRlZiB0ZXN0X2R1YmlvdXNfcXVvdGUoc2VsZik6DQogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJzEyLDEyLDEiLCcsIFtbJzEyJywgJzEyJywgJzEiJywgJyddXSkNCg0KICAgIGRlZiB0ZXN0X251bGwoc2VsZik6DQogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW10sICcnKQ0KDQogICAgZGVmIHRlc3Rfc2luZ2xlX3dyaXRlcihzZWxmKToNCiAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWydhYmMnXV0sICdhYmNcclxuJykNCg0KICAgIGRlZiB0ZXN0X3NpbXBsZV93cml0ZXIoc2VsZik6DQogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1sxLCAyLCAnYWJjJywgMywgNF1dLCAnMSwyLGFiYywzLDRcclxuJykNCg0KICAgIGRlZiB0ZXN0X3F1b3RlcyhzZWxmKToNCiAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWzEsIDIsICdhImJjIicsIDMsIDRdXSwgJzEsMiwiYSIiYmMiIiIsMyw0XHJcbicpDQoNCiAgICBkZWYgdGVzdF9xdW90ZV9maWVsZHNlcChzZWxmKToNCiAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWydhYmMsZGVmJ11dLCAnImFiYyxkZWYiXHJcbicpDQoNCiAgICBkZWYgdGVzdF9uZXdsaW5lcyhzZWxmKToNCiAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWzEsIDIsICdhXG5iYycsIDMsIDRdXSwgJzEsMiwiYVxuYmMiLDMsNFxyXG4nKQ0KDQpjbGFzcyBFc2NhcGVkRXhjZWwoY3N2LmV4Y2VsKToNCiAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUNCiAgICBlc2NhcGVjaGFyID0gJ1xcJw0KDQpjbGFzcyBUZXN0RXNjYXBlZEV4Y2VsKFRlc3RDc3ZCYXNlKToNCiAgICBkaWFsZWN0ID0gRXNjYXBlZEV4Y2VsKCkNCg0KICAgIGRlZiB0ZXN0X2VzY2FwZV9maWVsZHNlcChzZWxmKToNCiAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWydhYmMsZGVmJ11dLCAnYWJjXFwsZGVmXHJcbicpDQoNCiAgICBkZWYgdGVzdF9yZWFkX2VzY2FwZV9maWVsZHNlcChzZWxmKToNCiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnYWJjXFwsZGVmXHJcbicsIFtbJ2FiYyxkZWYnXV0pDQoNCmNsYXNzIFF1b3RlZEVzY2FwZWRFeGNlbChjc3YuZXhjZWwpOg0KICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9OTlVNRVJJQw0KICAgIGVzY2FwZWNoYXIgPSAnXFwnDQoNCmNsYXNzIFRlc3RRdW90ZWRFc2NhcGVkRXhjZWwoVGVzdENzdkJhc2UpOg0KICAgIGRpYWxlY3QgPSBRdW90ZWRFc2NhcGVkRXhjZWwoKQ0KDQogICAgZGVmIHRlc3Rfd3JpdGVfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOg0KICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbJ2FiYyxkZWYnXV0sICciYWJjLGRlZiJcclxuJykNCg0KICAgIGRlZiB0ZXN0X3JlYWRfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOg0KICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciYWJjXFwsZGVmIlxyXG4nLCBbWydhYmMsZGVmJ11dKQ0KDQpjbGFzcyBUZXN0RGljdEZpZWxkcyh1bml0dGVzdC5UZXN0Q2FzZSk6DQogICAgIyMjICJsb25nIiBtZWFucyB0aGUgcm93IGlzIGxvbmdlciB0aGFuIHRoZSBudW1iZXIgb2YgZmllbGRuYW1lcw0KICAgICMjIyAic2hvcnQiIG1lYW5zIHRoZXJlIGFyZSBmZXdlciBlbGVtZW50cyBpbiB0aGUgcm93IHRoYW4gZmllbGRuYW1lcw0KICAgIGRlZiB0ZXN0X3dyaXRlX3NpbXBsZV9kaWN0KHNlbGYpOg0KICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQ0KICAgICAgICBmaWxlb2JqID0gaW8ub3BlbihmZCwgJ3crYicpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdyaXRlciA9IGNzdi5EaWN0V3JpdGVyKGZpbGVvYmosIGZpZWxkbmFtZXMgPSBbImYxIiwgImYyIiwgImYzIl0pDQogICAgICAgICAgICB3cml0ZXIud3JpdGVoZWFkZXIoKQ0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZGxpbmUoKSwgImYxLGYyLGYzXHJcbiIpDQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coeyJmMSI6IDEwLCAiZjMiOiAiYWJjIn0pDQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgIGZpbGVvYmoucmVhZGxpbmUoKSAjIGhlYWRlcg0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgIjEwLCxhYmNcclxuIikNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQ0KICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpDQoNCiAgICBkZWYgdGVzdF93cml0ZV9ub19maWVsZHMoc2VsZik6DQogICAgICAgIGZpbGVvYmogPSBTdHJpbmdJTygpDQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LkRpY3RXcml0ZXIsIGZpbGVvYmopDQoNCiAgICBkZWYgdGVzdF9yZWFkX2RpY3RfZmllbGRzKHNlbGYpOg0KICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQ0KICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiMSwyLGFiY1xyXG4iKQ0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bImYxIiwgImYyIiwgImYzIl0pDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywgImYzIjogJ2FiYyd9KQ0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpDQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkNCg0KICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9ub19maWVsZG5hbWVzKHNlbGYpOg0KICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQ0KICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiZjEsZjIsZjNcclxuMSwyLGFiY1xyXG4iKQ0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiIsICJmMyJdKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsICJmMyI6ICdhYmMnfSkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQ0KICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpDQoNCiAgICAjIFR3byB0ZXN0IGNhc2VzIHRvIG1ha2Ugc3VyZSBleGlzdGluZyB3YXlzIG9mIGltcGxpY2l0bHkgc2V0dGluZw0KICAgICMgZmllbGRuYW1lcyBjb250aW51ZSB0byB3b3JrLiAgQm90aCBhcmlzZSBmcm9tIGRpc2N1c3Npb24gaW4gaXNzdWUzNDM2Lg0KICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9maWVsZG5hbWVzX2Zyb21fZmlsZShzZWxmKToNCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgZiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGYud3JpdGUoImYxLGYyLGYzXHJcbjEsMixhYmNcclxuIikNCiAgICAgICAgICAgIGYuc2VlaygwKQ0KICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZiwgZmllbGRuYW1lcz1jc3YucmVhZGVyKGYpLm5leHQoKSkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLmZpZWxkbmFtZXMsIFsiZjEiLCAiZjIiLCAiZjMiXSkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLCAiZjMiOiAnYWJjJ30pDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBmLmNsb3NlKCkNCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQ0KDQogICAgZGVmIHRlc3RfcmVhZF9kaWN0X2ZpZWxkbmFtZXNfY2hhaW4oc2VsZik6DQogICAgICAgIGltcG9ydCBpdGVydG9vbHMNCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgZiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGYud3JpdGUoImYxLGYyLGYzXHJcbjEsMixhYmNcclxuIikNCiAgICAgICAgICAgIGYuc2VlaygwKQ0KICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZikNCiAgICAgICAgICAgIGZpcnN0ID0gbmV4dChyZWFkZXIpDQogICAgICAgICAgICBmb3Igcm93IGluIGl0ZXJ0b29scy5jaGFpbihbZmlyc3RdLCByZWFkZXIpOg0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLmZpZWxkbmFtZXMsIFsiZjEiLCAiZjIiLCAiZjMiXSkNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgeyJmMSI6ICcxJywgImYyIjogJzInLCAiZjMiOiAnYWJjJ30pDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBmLmNsb3NlKCkNCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQ0KDQogICAgZGVmIHRlc3RfcmVhZF9sb25nKHNlbGYpOg0KICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQ0KICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiMSwyLGFiYyw0LDUsNlxyXG4iKQ0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bImYxIiwgImYyIl0pDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmU6IFsiYWJjIiwgIjQiLCAiNSIsICI2Il19KQ0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpDQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkNCg0KICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ193aXRoX3Jlc3Qoc2VsZik6DQogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpDQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmaWxlb2JqLndyaXRlKCIxLDIsYWJjLDQsNSw2XHJcbiIpDQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPVsiZjEiLCAiZjIiXSwgcmVzdGtleT0iX3Jlc3QiKQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3Jlc3QiOiBbImFiYyIsICI0IiwgIjUiLCAiNiJdfSkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQ0KICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpDQoNCiAgICBkZWYgdGVzdF9yZWFkX2xvbmdfd2l0aF9yZXN0X25vX2ZpZWxkbmFtZXMoc2VsZik6DQogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpDQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmaWxlb2JqLndyaXRlKCJmMSxmMlxyXG4xLDIsYWJjLDQsNSw2XHJcbiIpDQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosIHJlc3RrZXk9Il9yZXN0IikNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLmZpZWxkbmFtZXMsIFsiZjEiLCAiZjIiXSkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9yZXN0IjogWyJhYmMiLCAiNCIsICI1IiwgIjYiXX0pDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkNCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQ0KDQogICAgZGVmIHRlc3RfcmVhZF9zaG9ydChzZWxmKToNCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoIjEsMixhYmMsNCw1LDZcclxuMSwyLGFiY1xyXG4iKQ0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz0iMSAyIDMgNCA1IDYiLnNwbGl0KCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0dmFsPSJERUZBVUxUIikNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyIxIjogJzEnLCAiMiI6ICcyJywgIjMiOiAnYWJjJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiOiAnREVGQVVMVCcsICI1IjogJ0RFRkFVTFQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYiOiAnREVGQVVMVCd9KQ0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpDQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkNCg0KICAgIGRlZiB0ZXN0X3JlYWRfbXVsdGkoc2VsZik6DQogICAgICAgIHNhbXBsZSA9IFsNCiAgICAgICAgICAgICcyMTQ3NDgzNjQ4LDQzLjBlMTIsMTcsYWJjLGRlZlxyXG4nLA0KICAgICAgICAgICAgJzE0NzQ4MzY0OCw0My4wZTIsMTcsYWJjLGRlZlxyXG4nLA0KICAgICAgICAgICAgJzQ3NDgzNjQ4LDQzLjAsMTcwLGFiYyxkZWZcclxuJw0KICAgICAgICAgICAgXQ0KDQogICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKHNhbXBsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz0iaTEgZmxvYXQgaTIgczEgczIiLnNwbGl0KCkpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJpMSI6ICcyMTQ3NDgzNjQ4JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IjogJzQzLjBlMTInLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTIiOiAnMTcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiczEiOiAnYWJjJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInMyIjogJ2RlZid9KQ0KDQogICAgZGVmIHRlc3RfcmVhZF93aXRoX2JsYW5rcyhzZWxmKToNCiAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoWyIxLDIsYWJjLDQsNSw2XHJcbiIsIlxyXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEsMixhYmMsNCw1LDZcclxuIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9IjEgMiAzIDQgNSA2Ii5zcGxpdCgpKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQ0KDQogICAgZGVmIHRlc3RfcmVhZF9zZW1pX3NlcChzZWxmKToNCiAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoWyIxOzI7YWJjOzQ7NTs2XHJcbiJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPSIxIDIgMyA0IDUgNiIuc3BsaXQoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyPSc7JykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCI6ICc0JywgIjUiOiAnNScsICI2IjogJzYnfSkNCg0KY2xhc3MgVGVzdEFycmF5V3JpdGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToNCiAgICBkZWYgdGVzdF9pbnRfd3JpdGUoc2VsZik6DQogICAgICAgIGltcG9ydCBhcnJheQ0KICAgICAgICBjb250ZW50cyA9IFsoMjAtaSkgZm9yIGkgaW4gcmFuZ2UoMjApXQ0KICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2knLCBjb250ZW50cykNCg0KICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQ0KICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSJleGNlbCIpDQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coYSkNCiAgICAgICAgICAgIGV4cGVjdGVkID0gIiwiLmpvaW4oW3N0cihpKSBmb3IgaSBpbiBhXSkrIlxyXG4iDQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkKQ0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpDQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkNCg0KICAgIGRlZiB0ZXN0X2RvdWJsZV93cml0ZShzZWxmKToNCiAgICAgICAgaW1wb3J0IGFycmF5DQogICAgICAgIGNvbnRlbnRzID0gWygyMC1pKSowLjEgZm9yIGkgaW4gcmFuZ2UoMjApXQ0KICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2QnLCBjb250ZW50cykNCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0iZXhjZWwiKQ0KICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGEpDQogICAgICAgICAgICBleHBlY3RlZCA9ICIsIi5qb2luKFtzdHIoaSkgZm9yIGkgaW4gYV0pKyJcclxuIg0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQ0KICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpDQoNCiAgICBkZWYgdGVzdF9mbG9hdF93cml0ZShzZWxmKToNCiAgICAgICAgaW1wb3J0IGFycmF5DQogICAgICAgIGNvbnRlbnRzID0gWygyMC1pKSowLjEgZm9yIGkgaW4gcmFuZ2UoMjApXQ0KICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2YnLCBjb250ZW50cykNCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0iZXhjZWwiKQ0KICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGEpDQogICAgICAgICAgICBleHBlY3RlZCA9ICIsIi5qb2luKFtzdHIoaSkgZm9yIGkgaW4gYV0pKyJcclxuIg0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQ0KICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpDQoNCiAgICBkZWYgdGVzdF9jaGFyX3dyaXRlKHNlbGYpOg0KICAgICAgICBpbXBvcnQgYXJyYXksIHN0cmluZw0KICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2MnLCBzdHJpbmcubGV0dGVycykNCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkNCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0iZXhjZWwiKQ0KICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGEpDQogICAgICAgICAgICBleHBlY3RlZCA9ICIsIi5qb2luKGEpKyJcclxuIg0KICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkNCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQ0KICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpDQoNCmNsYXNzIFRlc3REaWFsZWN0VmFsaWRpdHkodW5pdHRlc3QuVGVzdENhc2UpOg0KICAgIGRlZiB0ZXN0X3F1b3Rpbmcoc2VsZik6DQogICAgICAgIGNsYXNzIG15ZGlhbGVjdChjc3YuRGlhbGVjdCk6DQogICAgICAgICAgICBkZWxpbWl0ZXIgPSAiOyINCiAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAnXFwnDQogICAgICAgICAgICBkb3VibGVxdW90ZSA9IEZhbHNlDQogICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID0gVHJ1ZQ0KICAgICAgICAgICAgbGluZXRlcm1pbmF0b3IgPSAnXHJcbicNCiAgICAgICAgICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORQ0KICAgICAgICBkID0gbXlkaWFsZWN0KCkNCg0KICAgICAgICBteWRpYWxlY3QucXVvdGluZyA9IE5vbmUNCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpDQoNCiAgICAgICAgbXlkaWFsZWN0LmRvdWJsZXF1b3RlID0gVHJ1ZQ0KICAgICAgICBteWRpYWxlY3QucXVvdGluZyA9IGNzdi5RVU9URV9BTEwNCiAgICAgICAgbXlkaWFsZWN0LnF1b3RlY2hhciA9ICciJw0KICAgICAgICBkID0gbXlkaWFsZWN0KCkNCg0KICAgICAgICBteWRpYWxlY3QucXVvdGVjaGFyID0gIicnIg0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZGlhbGVjdCkNCg0KICAgICAgICBteWRpYWxlY3QucXVvdGVjaGFyID0gNA0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZGlhbGVjdCkNCg0KICAgIGRlZiB0ZXN0X2RlbGltaXRlcihzZWxmKToNCiAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToNCiAgICAgICAgICAgIGRlbGltaXRlciA9ICI7Ig0KICAgICAgICAgICAgZXNjYXBlY2hhciA9ICdcXCcNCiAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UNCiAgICAgICAgICAgIHNraXBpbml0aWFsc3BhY2UgPSBUcnVlDQogICAgICAgICAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJw0KICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FDQogICAgICAgIGQgPSBteWRpYWxlY3QoKQ0KDQogICAgICAgIG15ZGlhbGVjdC5kZWxpbWl0ZXIgPSAiOjo6Ig0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZGlhbGVjdCkNCg0KICAgICAgICBteWRpYWxlY3QuZGVsaW1pdGVyID0gNA0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZGlhbGVjdCkNCg0KICAgIGRlZiB0ZXN0X2xpbmV0ZXJtaW5hdG9yKHNlbGYpOg0KICAgICAgICBjbGFzcyBteWRpYWxlY3QoY3N2LkRpYWxlY3QpOg0KICAgICAgICAgICAgZGVsaW1pdGVyID0gIjsiDQogICAgICAgICAgICBlc2NhcGVjaGFyID0gJ1xcJw0KICAgICAgICAgICAgZG91YmxlcXVvdGUgPSBGYWxzZQ0KICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IFRydWUNCiAgICAgICAgICAgIGxpbmV0ZXJtaW5hdG9yID0gJ1xyXG4nDQogICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUNCiAgICAgICAgZCA9IG15ZGlhbGVjdCgpDQoNCiAgICAgICAgbXlkaWFsZWN0LmxpbmV0ZXJtaW5hdG9yID0gIjo6OiINCiAgICAgICAgZCA9IG15ZGlhbGVjdCgpDQoNCiAgICAgICAgbXlkaWFsZWN0LmxpbmV0ZXJtaW5hdG9yID0gNA0KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZGlhbGVjdCkNCg0KDQpjbGFzcyBUZXN0U25pZmZlcih1bml0dGVzdC5UZXN0Q2FzZSk6DQogICAgc2FtcGxlMSA9ICIiIlwNCkhhcnJ5J3MsIEFybGluZ3RvbiBIZWlnaHRzLCBJTCwgMi8xLzAzLCBLaW1pIEhheWVzDQpTaGFyayBDaXR5LCBHbGVuZGFsZSBIZWlnaHRzLCBJTCwgMTIvMjgvMDIsIFByZXplbmNlDQpUb21teSdzIFBsYWNlLCBCbHVlIElzbGFuZCwgSUwsIDEyLzI4LzAyLCBCbHVlIFN1bmRheS9XaGl0ZSBDcm93DQpTdG9uZWN1dHRlcnMgU2VhZm9vZCBhbmQgQ2hvcCBIb3VzZSwgTGVtb250LCBJTCwgMTIvMTkvMDIsIFdlZWsgQmFjaw0KIiIiDQogICAgc2FtcGxlMiA9ICIiIlwNCidIYXJyeScncyc6J0FybGluZ3RvbiBIZWlnaHRzJzonSUwnOicyLzEvMDMnOidLaW1pIEhheWVzJw0KJ1NoYXJrIENpdHknOidHbGVuZGFsZSBIZWlnaHRzJzonSUwnOicxMi8yOC8wMic6J1ByZXplbmNlJw0KJ1RvbW15JydzIFBsYWNlJzonQmx1ZSBJc2xhbmQnOidJTCc6JzEyLzI4LzAyJzonQmx1ZSBTdW5kYXkvV2hpdGUgQ3JvdycNCidTdG9uZWN1dHRlcnMgJydTZWFmb29kJycgYW5kIENob3AgSG91c2UnOidMZW1vbnQnOidJTCc6JzEyLzE5LzAyJzonV2VlayBCYWNrJw0KIiIiDQogICAgaGVhZGVyID0gJycnXA0KInZlbnVlIiwiY2l0eSIsInN0YXRlIiwiZGF0ZSIsInBlcmZvcm1lcnMiDQonJycNCiAgICBzYW1wbGUzID0gJycnXA0KMDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDMNCjA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzDQowNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMw0KJycnDQoNCiAgICBzYW1wbGU0ID0gJycnXA0KMjE0NzQ4MzY0ODs0My4wZTEyOzE3O2FiYztkZWYNCjE0NzQ4MzY0ODs0My4wZTI7MTc7YWJjO2RlZg0KNDc0ODM2NDg7NDMuMDsxNzA7YWJjO2RlZg0KJycnDQoNCiAgICBzYW1wbGU1ID0gImFhYVx0YmJiXHJcbkFBQVx0XHJcbkJCQlx0XHJcbiINCiAgICBzYW1wbGU2ID0gImF8YnxjXHJcbmR8ZXxmXHJcbiINCiAgICBzYW1wbGU3ID0gIidhJ3wnYid8J2MnXHJcbidkJ3xlfGZcclxuIg0KDQogICAgZGVmIHRlc3RfaGFzX2hlYWRlcihzZWxmKToNCiAgICAgICAgc25pZmZlciA9IGNzdi5TbmlmZmVyKCkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmlmZmVyLmhhc19oZWFkZXIoc2VsZi5zYW1wbGUxKSwgRmFsc2UpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25pZmZlci5oYXNfaGVhZGVyKHNlbGYuaGVhZGVyK3NlbGYuc2FtcGxlMSksIFRydWUpDQoNCiAgICBkZWYgdGVzdF9zbmlmZihzZWxmKToNCiAgICAgICAgc25pZmZlciA9IGNzdi5TbmlmZmVyKCkNCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUxKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiLCIpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5xdW90ZWNoYXIsICciJykNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnNraXBpbml0aWFsc3BhY2UsIFRydWUpDQoNCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUyKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiOiIpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5xdW90ZWNoYXIsICInIikNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnNraXBpbml0aWFsc3BhY2UsIEZhbHNlKQ0KDQogICAgZGVmIHRlc3RfZGVsaW1pdGVycyhzZWxmKToNCiAgICAgICAgc25pZmZlciA9IGNzdi5TbmlmZmVyKCkNCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzKQ0KICAgICAgICAjIGdpdmVuIHRoYXQgYWxsIHRocmVlIGxpbmVzIGluIHNhbXBsZTMgYXJlIGVxdWFsLA0KICAgICAgICAjIEkgdGhpbmsgdGhhdCBhbnkgY2hhcmFjdGVyIGNvdWxkIGhhdmUgYmVlbiAnZ3Vlc3NlZCcgYXMgdGhlDQogICAgICAgICMgZGVsaW1pdGVyLCBkZXBlbmRpbmcgb24gZGljdGlvbmFyeSBvcmRlcg0KICAgICAgICBzZWxmLmFzc2VydEluKGRpYWxlY3QuZGVsaW1pdGVyLCBzZWxmLnNhbXBsZTMpDQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMywgZGVsaW1pdGVycz0iPywiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiPyIpDQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMywgZGVsaW1pdGVycz0iLywiKQ0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiLyIpDQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlNCkNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIjsiKQ0KICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTUpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICJcdCIpDQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlNikNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgInwiKQ0KICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTcpDQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICJ8IikNCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnF1b3RlY2hhciwgIiciKQ0KDQogICAgZGVmIHRlc3RfZG91YmxlcXVvdGUoc2VsZik6DQogICAgICAgIHNuaWZmZXIgPSBjc3YuU25pZmZlcigpDQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuaGVhZGVyKQ0KICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRpYWxlY3QuZG91YmxlcXVvdGUpDQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMikNCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxlY3QuZG91YmxlcXVvdGUpDQoNCmlmIG5vdCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToNCiAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZTogcHJpbnQgIioqKiBza2lwcGluZyBsZWFrYWdlIHRlc3RzICoqKiINCmVsc2U6DQogICAgY2xhc3MgTlVMOg0KICAgICAgICBkZWYgd3JpdGUocywgKmFyZ3MpOg0KICAgICAgICAgICAgcGFzcw0KICAgICAgICB3cml0ZWxpbmVzID0gd3JpdGUNCg0KICAgIGNsYXNzIFRlc3RMZWFrcyh1bml0dGVzdC5UZXN0Q2FzZSk6DQogICAgICAgIGRlZiB0ZXN0X2NyZWF0ZV9yZWFkKHNlbGYpOg0KICAgICAgICAgICAgZGVsdGEgPSAwDQogICAgICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpDQogICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOg0KICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pDQogICAgICAgICAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpDQogICAgICAgICAgICAgICAgY3N2LnJlYWRlcihbImEsYixjXHJcbiJdKQ0KICAgICAgICAgICAgICAgIGNzdi5yZWFkZXIoWyJhLGIsY1xyXG4iXSkNCiAgICAgICAgICAgICAgICBjc3YucmVhZGVyKFsiYSxiLGNcclxuIl0pDQogICAgICAgICAgICAgICAgZGVsdGEgPSByYy1sYXN0cmMNCiAgICAgICAgICAgICAgICBsYXN0cmMgPSByYw0KICAgICAgICAgICAgIyBpZiBjc3YucmVhZGVyKCkgbGVha3MsIGxhc3QgZGVsdGEgc2hvdWxkIGJlIDMgb3IgbW9yZQ0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDMsIFRydWUpDQoNCiAgICAgICAgZGVmIHRlc3RfY3JlYXRlX3dyaXRlKHNlbGYpOg0KICAgICAgICAgICAgZGVsdGEgPSAwDQogICAgICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpDQogICAgICAgICAgICBzID0gTlVMKCkNCiAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6DQogICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpDQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkNCiAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkNCiAgICAgICAgICAgICAgICBjc3Yud3JpdGVyKHMpDQogICAgICAgICAgICAgICAgY3N2LndyaXRlcihzKQ0KICAgICAgICAgICAgICAgIGNzdi53cml0ZXIocykNCiAgICAgICAgICAgICAgICBkZWx0YSA9IHJjLWxhc3RyYw0KICAgICAgICAgICAgICAgIGxhc3RyYyA9IHJjDQogICAgICAgICAgICAjIGlmIGNzdi53cml0ZXIoKSBsZWFrcywgbGFzdCBkZWx0YSBzaG91bGQgYmUgMyBvciBtb3JlDQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgMywgVHJ1ZSkNCg0KICAgICAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOg0KICAgICAgICAgICAgZGVsdGEgPSAwDQogICAgICAgICAgICByb3dzID0gWyJhLGIsY1xyXG4iXSo1DQogICAgICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpDQogICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOg0KICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQ0KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pDQogICAgICAgICAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpDQogICAgICAgICAgICAgICAgcmRyID0gY3N2LnJlYWRlcihyb3dzKQ0KICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmRyOg0KICAgICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgICAgICAgICAgZGVsdGEgPSByYy1sYXN0cmMNCiAgICAgICAgICAgICAgICBsYXN0cmMgPSByYw0KICAgICAgICAgICAgIyBpZiByZWFkZXIgbGVha3MgZHVyaW5nIHJlYWQsIGRlbHRhIHNob3VsZCBiZSA1IG9yIG1vcmUNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVsdGEgPCA1LCBUcnVlKQ0KDQogICAgICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOg0KICAgICAgICAgICAgZGVsdGEgPSAwDQogICAgICAgICAgICByb3dzID0gW1sxLDIsM11dKjUNCiAgICAgICAgICAgIHMgPSBOVUwoKQ0KICAgICAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQ0KICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToNCiAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkNCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdhcmJhZ2UsIFtdKQ0KICAgICAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQ0KICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIocykNCiAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJvd3M6DQogICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhyb3cpDQogICAgICAgICAgICAgICAgZGVsdGEgPSByYy1sYXN0cmMNCiAgICAgICAgICAgICAgICBsYXN0cmMgPSByYw0KICAgICAgICAgICAgIyBpZiB3cml0ZXIgbGVha3MgZHVyaW5nIHdyaXRlLCBsYXN0IGRlbHRhIHNob3VsZCBiZSA1IG9yIG1vcmUNCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVsdGEgPCA1LCBUcnVlKQ0KDQojIGNvbW1lbnRlZCBvdXQgZm9yIG5vdyAtIGNzdiBtb2R1bGUgZG9lc24ndCB5ZXQgc3VwcG9ydCBVbmljb2RlDQojIyBjbGFzcyBUZXN0VW5pY29kZSh1bml0dGVzdC5UZXN0Q2FzZSk6DQojIyAgICAgZGVmIHRlc3RfdW5pY29kZV9yZWFkKHNlbGYpOg0KIyMgICAgICAgICBpbXBvcnQgY29kZWNzDQojIyAgICAgICAgIGYgPSBjb2RlY3MuRW5jb2RlZEZpbGUoU3RyaW5nSU8oIk1hcnRpbiB2b24gTPZ3aXMsIg0KIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXJjIEFuZHLpIExlbWJ1cmcsIg0KIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHdWlkbyB2YW4gUm9zc3VtLCINCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbudvaXMgUGluYXJkXHJcbiIpLA0KIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZW5jb2Rpbmc9J2lzby04ODU5LTEnKQ0KIyMgICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGYpDQojIyAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZWFkZXIpLCBbW3UiTWFydGluIHZvbiBM9ndpcyIsDQojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUiTWFyYyBBbmRy6SBMZW1idXJnIiwNCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSJHdWlkbyB2YW4gUm9zc3VtIiwNCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSJGcmFu529pcyBQaW5hcmRuIl1dKQ0KDQpkZWYgdGVzdF9tYWluKCk6DQogICAgbW9kID0gc3lzLm1vZHVsZXNbX19uYW1lX19dDQogICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgNCiAgICAgICAgKltnZXRhdHRyKG1vZCwgbmFtZSkgZm9yIG5hbWUgaW4gZGlyKG1vZCkgaWYgbmFtZS5zdGFydHN3aXRoKCdUZXN0JyldDQogICAgKQ0KDQppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOg0KICAgIHRlc3RfbWFpbigpDQo=