# zem_event 0.34 # Event calendar # Alex Shiels # http://thresholdstate.com/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6OToiemVtX2V2ZW50IjtzOjY6ImF1dGhvciI7czoxMToiQWxleCBTaGllbHMiO3M6MTA6ImF1dGhvcl91cmkiO3M6MjY6Imh0dHA6Ly90aHJlc2hvbGRzdGF0ZS5jb20vIjtzOjc6InZlcnNpb24iO3M6NDoiMC4zNCI7czoxMToiZGVzY3JpcHRpb24iO3M6MTQ6IkV2ZW50IGNhbGVuZGFyIjtzOjQ6ImhlbHAiO3M6NDM6Igk8aDE+VGV4dGlsZS1mb3JtYXR0ZWQgaGVscCBnb2VzIGhlcmU8L2gxPgoiO3M6NDoiY29kZSI7czo2MDA4NjoiLyoNCg0KQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgQWxleCBTaGllbHMgaHR0cDovL3RocmVzaG9sZHN0YXRlLmNvbS8NCg0KVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCnZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4NCg0KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQpidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCg0KKi8NCg0KLy8gbWF4aW11bSBudW1iZXIgb2YgcmVwZWF0cyBhc3NvY2lhdGVkIHdpdGggZWFjaCByZWN1cnJpbmcgZXZlbnQNCmRlZmluZSgnWkVNX01BWF9SRVBFQVRfRVZFTlRTJywgMTAwKTsNCg0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfaW5zdGFsbCgpIHsNCglpZiAoIWdldFRoaW5ncygic2hvdyB0YWJsZXMgbGlrZSAnIi5QRlguInplbV9ldmVudF9jYWxlbmRhciciKSkNCgkJc2FmZV9xdWVyeSgiY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgIi5QRlguInplbV9ldmVudF9jYWxlbmRhciAoDQoNCgkJCWlkIGJpZ2ludCBhdXRvX2luY3JlbWVudCBub3QgbnVsbCBwcmltYXJ5IGtleSwNCgkJCWFydGljbGVfaWQgYmlnaW50IG5vdCBudWxsLA0KDQoJCQltb2RpZmllZCB0aW1lc3RhbXAsDQoJCQljcmVhdGVkIHRpbWVzdGFtcCwNCg0KCQkJZXZlbnRfZGF0ZSBkYXRlIGRlZmF1bHQgbnVsbCwNCgkJCWV2ZW50X3RpbWUgdGltZSBkZWZhdWx0IG51bGwsDQoNCgkJCW5hbWUgdmFyY2hhcigyNTUpDQoNCgkJCSk7Iik7DQoNCglpZiAoIXNhZmVfZmllbGQoJ25hbWUnLCAndHhwX2Zvcm0nLCAibmFtZT0nemVtX2V2ZW50X2Rpc3BsYXknIikpIHsNCgkJJGZvcm0gPSA8PDxFT0YNCjx0eHA6emVtX2V2ZW50X3Blcm1saW5rIHdyYXB0YWc9IiIgPjx0eHA6emVtX2V2ZW50X25hbWUgbGFiZWw9IkV2ZW50IiB3cmFwdGFnPSIiIC8+PC90eHA6emVtX2V2ZW50X3Blcm1saW5rPg0KPHR4cDp6ZW1fZXZlbnRfZGF0ZSBsYWJlbD0iRGF0ZSIgd3JhcHRhZz0iIiAvPg0KPHR4cDp6ZW1fZXZlbnRfdGltZSBsYWJlbD0iVGltZSIgd3JhcHRhZz0iIiAvPg0KDQpFT0Y7DQoJCXNhZmVfaW5zZXJ0KCd0eHBfZm9ybScsDQoJCQkibmFtZT0nemVtX2V2ZW50X2Rpc3BsYXknLA0KCQkJdHlwZT0nbWlzYycsDQoJCQlGb3JtPSciLmRvU2xhc2goJGZvcm0pLiInIg0KCQkpOw0KDQoJfQ0KDQoJaWYgKCFzYWZlX2ZpZWxkKCduYW1lJywgJ3R4cF9mb3JtJywgIm5hbWU9J3plbV9ldmVudF9kaXNwbGF5X2ZlZWQnIikpIHsNCgkJJGZvcm0gPSA8PDxFT0YNCjx0eHA6emVtX2V2ZW50X3Blcm1saW5rIHdyYXB0YWc9IiIgPjx0eHA6emVtX2V2ZW50X25hbWUgbGFiZWw9IkV2ZW50IiB3cmFwdGFnPSIiIC8+PC90eHA6emVtX2V2ZW50X3Blcm1saW5rPg0KPHR4cDp6ZW1fZXZlbnRfZGF0ZSBsYWJlbD0iRGF0ZSIgd3JhcHRhZz0iIiAvPg0KPHR4cDp6ZW1fZXZlbnRfdGltZSBsYWJlbD0iVGltZSIgd3JhcHRhZz0iIiAvPg0KDQpFT0Y7DQoJCXNhZmVfaW5zZXJ0KCd0eHBfZm9ybScsDQoJCQkibmFtZT0nemVtX2V2ZW50X2Rpc3BsYXlfZmVlZCcsDQoJCQl0eXBlPSdtaXNjJywNCgkJCUZvcm09JyIuZG9TbGFzaCgkZm9ybSkuIiciDQoJCSk7DQoNCgl9DQoNCglpZiAoIXNhZmVfZmllbGQoJ25hbWUnLCAndHhwX2Zvcm0nLCAibmFtZT0nemVtX2V2ZW50X2NhbF9lbnRyeSciKSkgew0KCQkkZm9ybSA9IDw8PEVPRg0KPHR4cDp6ZW1fZXZlbnRfcGVybWxpbmsgd3JhcHRhZz0iIiA+PHR4cDp6ZW1fZXZlbnRfbmFtZSBsYWJlbD0iRXZlbnQiIHdyYXB0YWc9IiIgLz48L3R4cDp6ZW1fZXZlbnRfcGVybWxpbms+DQo8dHhwOnplbV9ldmVudF90aW1lIGxhYmVsPSJUaW1lIiB3cmFwdGFnPSIiIC8+DQoNCkVPRjsNCgkJc2FmZV9pbnNlcnQoJ3R4cF9mb3JtJywNCgkJCSJuYW1lPSd6ZW1fZXZlbnRfY2FsX2VudHJ5JywNCgkJCXR5cGU9J21pc2MnLA0KCQkJRm9ybT0nIi5kb1NsYXNoKCRmb3JtKS4iJyINCgkJKTsNCg0KCX0NCg0KCS8vIGFkZCBmaW5pc2ggZGF0ZSBhbmQgdGltZSBmaWVsZHMNCiAgICRjYWwgPSBnZXRUaGluZ3MoJ2Rlc2NyaWJlICcuUEZYLid6ZW1fZXZlbnRfY2FsZW5kYXInKTsNCiAgIGlmICghaW5fYXJyYXkoJ2ZpbmlzaF9kYXRlJywkY2FsKSkNCiAgICAgIHplbV9hbHRlcignemVtX2V2ZW50X2NhbGVuZGFyJywgJ2FkZCBmaW5pc2hfZGF0ZSBkYXRlIGRlZmF1bHQgbnVsbCcpOw0KICAgaWYgKCFpbl9hcnJheSgnZmluaXNoX3RpbWUnLCRjYWwpKQ0KICAgICAgemVtX2FsdGVyKCd6ZW1fZXZlbnRfY2FsZW5kYXInLCAnYWRkIGZpbmlzaF90aW1lIHRpbWUgZGVmYXVsdCBudWxsJyk7DQogICBpZiAoIWluX2FycmF5KCdsb2NhdGlvbicsJGNhbCkpDQogICAgICB6ZW1fYWx0ZXIoJ3plbV9ldmVudF9jYWxlbmRhcicsICdhZGQgbG9jYXRpb24gdmFyY2hhcigyNTUpJyk7DQogICBpZiAoIWluX2FycmF5KCdsb2NhdGlvbl91cmwnLCRjYWwpKQ0KICAgICAgemVtX2FsdGVyKCd6ZW1fZXZlbnRfY2FsZW5kYXInLCAnYWRkIGxvY2F0aW9uX3VybCB2YXJjaGFyKDI1NSknKTsNCiAgIGlmICghaW5fYXJyYXkoJ3VybCcsJGNhbCkpDQogICAgICB6ZW1fYWx0ZXIoJ3plbV9ldmVudF9jYWxlbmRhcicsICdhZGQgdXJsIHZhcmNoYXIoMjU1KScpOw0KICAgaWYgKCFpbl9hcnJheSgnZW1haWwnLCRjYWwpKQ0KICAgICAgemVtX2FsdGVyKCd6ZW1fZXZlbnRfY2FsZW5kYXInLCAnYWRkIGVtYWlsIHZhcmNoYXIoMTI4KScpOw0KICAgaWYgKCFpbl9hcnJheSgnZGVzY3JpcHRpb24nLCRjYWwpKQ0KICAgICAgemVtX2FsdGVyKCd6ZW1fZXZlbnRfY2FsZW5kYXInLCAnYWRkIGRlc2NyaXB0aW9uIHRleHQnKTsNCiAgIGlmICghaW5fYXJyYXkoJ2Rlc2NyaXB0aW9uX2h0bWwnLCRjYWwpKQ0KICAgICAgemVtX2FsdGVyKCd6ZW1fZXZlbnRfY2FsZW5kYXInLCAnYWRkIGRlc2NyaXB0aW9uX2h0bWwgdGV4dCcpOw0KDQogICBpZiAoIWluX2FycmF5KCdyZXBlYXRfbicsJGNhbCkpDQogICAgICB6ZW1fYWx0ZXIoJ3plbV9ldmVudF9jYWxlbmRhcicsICdhZGQgcmVwZWF0X24gaW50Jyk7DQogICBpZiAoIWluX2FycmF5KCdyZXBlYXRfcGVyaW9kJywkY2FsKSkNCiAgICAgIHplbV9hbHRlcignemVtX2V2ZW50X2NhbGVuZGFyJywgJ2FkZCByZXBlYXRfcGVyaW9kIHZhcmNoYXIoMTYpJyk7DQogICBpZiAoIWluX2FycmF5KCdyZXBlYXRfdG8nLCRjYWwpKQ0KICAgICAgemVtX2FsdGVyKCd6ZW1fZXZlbnRfY2FsZW5kYXInLCAnYWRkIHJlcGVhdF90byBkYXRlIGRlZmF1bHQgbnVsbCcpOw0KDQoNCglpZiAoIXNhZmVfcm93KCdpZCcsICd0eHBfY2F0ZWdvcnknLCAidHlwZSA9ICdldmVudCcgYW5kIG5hbWUgPSAncm9vdCciKSkgew0KCQlzYWZlX2luc2VydCgndHhwX2NhdGVnb3J5JywgInR5cGUgPSAnZXZlbnQnLCBuYW1lID0gJ3Jvb3QnLCB0aXRsZSA9ICdyb290JyIpOw0KCX0NCi8vYWRkIGV2ZW50IGFuZC1vciBhcnRpY2xlIGFuZCBldmVudCBkZWxldGUgc3RhdHVzIGZpZWxkcw0KICAgIGlmICghaW5fYXJyYXkoJ2RlbGV0ZV9ldmVudCcsJGNhbCkpDQogICAgICAgemVtX2FsdGVyKCd6ZW1fZXZlbnRfY2FsZW5kYXInLCAnYWRkIGRlbGV0ZV9ldmVudCB0aW55aW50KDIpIGRlZmF1bHQgMCcpOwkgIA0KICAgIGlmICghaW5fYXJyYXkoJ2RlbGV0ZV9lbnRyeScsJGNhbCkpDQogICAgICAgemVtX2FsdGVyKCd6ZW1fZXZlbnRfY2FsZW5kYXInLCAnYWRkIGRlbGV0ZV9lbnRyeSB0aW55aW50KDIpIGRlZmF1bHQgMCcpOw0KDQoJLy8gZXZlbnQgbS0+bSBjYXRlZ29yeQ0KCWlmICghZ2V0VGhpbmdzKCJzaG93IHRhYmxlcyBsaWtlICciLlBGWC4iemVtX2V2ZW50X2NhdGVnb3J5JyIpKQ0KCQlzYWZlX3F1ZXJ5KCJjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyAiLlBGWC4iemVtX2V2ZW50X2NhdGVnb3J5ICgNCgkJCQlrMSBpbnQgbm90IG51bGwsDQoJCQkJazIgaW50IG5vdCBudWxsLA0KCQkJCVBSSU1BUlkgS0VZIChrMSxrMikNCgkJCSkiDQoJCSk7DQoNCglpZiAoIWdldFRoaW5ncygic2hvdyB0YWJsZXMgbGlrZSAnIi5QRlguInplbV9ldmVudF9kYXRlJyIpKSB7DQoJCXNhZmVfcXVlcnkoImNyZWF0ZSB0YWJsZSBpZiBub3QgZXhpc3RzICIuUEZYLiJ6ZW1fZXZlbnRfZGF0ZSAoDQoJCQkJZXZlbnRfaWQgYmlnaW50IG5vdCBudWxsLA0KCQkJCWV2ZW50X2RhdGUgZGF0ZSBub3QgbnVsbCwNCgkJCQlldmVudF90aW1lIHRpbWUgZGVmYXVsdCBudWxsLA0KCQkJCWZpbmlzaF9kYXRlIGRhdGUgZGVmYXVsdCBudWxsLA0KCQkJCWZpbmlzaF90aW1lIHRpbWUgZGVmYXVsdCBudWxsLA0KDQoJCQkJUFJJTUFSWSBLRVkgKGV2ZW50X2lkLCBldmVudF9kYXRlKQ0KCQkJKSINCgkJKTsNCg0KCQlpZiAoaW5fYXJyYXkoJ2V2ZW50X2RhdGUnLCRjYWwpKSB7DQoJCQkvLyBjb3B5IGRhdGVzIGFuZCB0aW1lcyB0byB0aGUgbmV3IHplbV9ldmVudF9kYXRlIHRhYmxlDQoJCQkkcnMgPSBzYWZlX3Jvd3MoJ2lkLCBldmVudF9kYXRlLCBldmVudF90aW1lLCBmaW5pc2hfZGF0ZSwgZmluaXNoX3RpbWUnLCAnemVtX2V2ZW50X2NhbGVuZGFyJywgJzE9MScpOw0KCQkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsNCgkJCQlleHRyYWN0KCRyb3cpOw0KCQkJCXNhZmVfaW5zZXJ0KCd6ZW1fZXZlbnRfZGF0ZScsDQoJCQkJCSJldmVudF9pZD0nIi5kb1NsYXNoKCRpZCkuIicsDQoJCQkJCWV2ZW50X2RhdGU9Ii4oJGV2ZW50X2RhdGUgPyAiJyIuZG9TbGFzaCgkZXZlbnRfZGF0ZSkuIiciIDogIk5VTEwiKS4iLA0KCQkJCQlldmVudF90aW1lPSIuKCRldmVudF90aW1lID8gIiciLmRvU2xhc2goJGV2ZW50X3RpbWUpLiInIiA6ICJOVUxMIikuIiwNCgkJCQkJZmluaXNoX2RhdGU9Ii4oJGZpbmlzaF9kYXRlID8gIiciLmRvU2xhc2goJGZpbmlzaF9kYXRlKS4iJyIgOiAiTlVMTCIpLiIsDQoJCQkJCWZpbmlzaF90aW1lPSIuKCRmaW5pc2hfdGltZSA/ICInIi5kb1NsYXNoKCRmaW5pc2hfdGltZSkuIiciIDogIk5VTEwiKQ0KCQkJCSk7DQoJCQl9DQoJCX0NCg0KCX0NCg0KDQp9DQoNCmZ1bmN0aW9uIHplbV9hbHRlcigkdGFibGUsICR0aGluZykgew0KCXJldHVybiBzYWZlX3F1ZXJ5KCdhbHRlciBpZ25vcmUgdGFibGUgJy5zYWZlX3BmeCgkdGFibGUpLicgJy4kdGhpbmcpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fc3RydG90aW1lKCR0LCAkbm93PScnKSB7DQoJaWYgKCF0cmltKCR0KSkgcmV0dXJuIGZhbHNlOw0KCWlmICghJG5vdykgJG5vdyA9IHRpbWUoKTsNCgkkciA9IEBzdHJ0b3RpbWUoJHQsICRub3cpOw0KCWlmICgkciA9PT0gLTEgb3IgJHIgPT09IGZhbHNlKQ0KCQlyZXR1cm4gZmFsc2U7DQoJcmV0dXJuICRyOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fdHpkKCkgew0KCWdsb2JhbCAkZ210b2Zmc2V0Ow0KDQoJJGggPSAkZ210b2Zmc2V0IC8gMzYwMDsNCgkkbSA9IGFicygkZ210b2Zmc2V0KSAlIDM2MDAgLyA2MDsNCg0KCXJldHVybiBzcHJpbnRmKCclKzAzZDolMDJkJywgJGgsICRtKTsNCn0NCg0KZnVuY3Rpb24gemVtX3N0cmZ0aW1lKCRmLCAkdCkgew0KCSRmID0gcHJlZ19yZXBsYWNlKCcvJXovJywgemVtX3R6ZCgpLCAkZik7DQoNCglyZXR1cm4gc3RyZnRpbWUoJGYsICR0KTsNCn0NCg0KZnVuY3Rpb24gemVtX3NxbHRpbWUoJHQpIHsNCglyZXR1cm4gc3RyZnRpbWUoJyVIOiVNOiVTJywgJHQpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fc3FsZGF0ZSgkdCkgew0KCXJldHVybiBzdHJmdGltZSgnJVktJW0tJWQnLCAkdCk7DQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9pbnNlcnRfZGF0ZSgkZXZlbnRfaWQsICRkYXRlLCAkdGltZT1OVUxMLCAkZmluaXNoX2RhdGU9TlVMTCwgJGZpbmlzaF90aW1lPU5VTEwpIHsNCglyZXR1cm4gc2FmZV9pbnNlcnQoJ3plbV9ldmVudF9kYXRlJywNCgkJImV2ZW50X2lkID0gJyIuZG9TbGFzaCgkZXZlbnRfaWQpLiInLCIuDQoJCSJldmVudF9kYXRlPSciLmRvU2xhc2goemVtX3NxbGRhdGUoemVtX3N0cnRvdGltZSgkZGF0ZSkpKS4iJywiLg0KCQkoJHRpbWUgPyAiZXZlbnRfdGltZT0nIi5kb1NsYXNoKHplbV9zcWx0aW1lKHplbV9zdHJ0b3RpbWUoJHRpbWUpKSkuIicsIiA6ICdldmVudF90aW1lPU5VTEwsJykuDQoJCSgkZmluaXNoX2RhdGUgPyAiZmluaXNoX2RhdGU9JyIuZG9TbGFzaCh6ZW1fc3FsZGF0ZSh6ZW1fc3RydG90aW1lKCRmaW5pc2hfZGF0ZSkpKS4iJywiIDogJ2ZpbmlzaF9kYXRlPU5VTEwsJykuDQoJCSgkZmluaXNoX3RpbWUgPyAiZmluaXNoX3RpbWU9JyIuZG9TbGFzaCh6ZW1fc3FsdGltZSh6ZW1fc3RydG90aW1lKCRmaW5pc2hfdGltZSkpKS4iJyIgOiAnZmluaXNoX3RpbWU9TlVMTCcpDQoJKTsNCn0NCg0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfc2F2ZSgkYXJ0aWNsZV9pZCwgJG5hbWUsICRkYXRlLCAkdGltZT1OVUxMLCRmaW5pc2hfZGF0ZT1OVUxMLCRmaW5pc2hfdGltZT1OVUxMLCAkbG9jYXRpb249TlVMTCwgJGxvY2F0aW9uX3VybD1OVUxMLCAkdXJsPU5VTEwsICRlbWFpbD1OVUxMLCAkZGVzY3JpcHRpb249TlVMTCwgJGNhdGVnb3JpZXM9TlVMTCwgJHJlcGVhdF9uPU5VTEwsICRyZXBlYXRfcGVyaW9kPU5VTEwsICRyZXBlYXRfdG89TlVMTCkgew0KDQoJJGQgPSB6ZW1fc3RydG90aW1lKCRkYXRlKTsNCglpZiAoISRkKSByZXR1cm4gZmFsc2U7DQoJJHNxbF9kYXRlID0gemVtX3NxbGRhdGUoJGQpOw0KDQoJaWYgKCR0aW1lICE9PSBOVUxMKSB7DQoJCSR0ID0gemVtX3N0cnRvdGltZSgkdGltZSk7DQoJCWlmICghJHQpIHJldHVybiBmYWxzZTsNCgkJJHNxbF90aW1lID0gemVtX3NxbHRpbWUoJHQpOw0KCX0NCg0KCWlmICgkZmluaXNoX2RhdGUpIHsNCgkJJGQgPSB6ZW1fc3RydG90aW1lKCRmaW5pc2hfZGF0ZSk7DQoJCWlmICghJGQpIHJldHVybiBmYWxzZTsNCgkJJHNxbF9mZGF0ZSA9IHplbV9zcWxkYXRlKCRkKTsNCgl9DQoNCglpZiAoJGZpbmlzaF90aW1lKSB7DQoJCSR0ID0gemVtX3N0cnRvdGltZSgkZmluaXNoX3RpbWUpOw0KCQlpZiAoISR0KSByZXR1cm4gZmFsc2U7DQoJCSRzcWxfZnRpbWUgPSB6ZW1fc3FsdGltZSgkdCk7DQoJfQ0KDQoJaWYgKCRyZXBlYXRfdG8pIHsNCgkJJGQgPSB6ZW1fc3RydG90aW1lKCRyZXBlYXRfdG8pOw0KCQlpZiAoISRkKSByZXR1cm4gZmFsc2U7DQoJCSRzcWxfcmVwZWF0X3RvID0gemVtX3NxbGRhdGUoJGQpOw0KCX0NCg0KCSRkZXNjcmlwdGlvbl9odG1sID0gJGRlc2NyaXB0aW9uOw0KCWlmICgkZGVzY3JpcHRpb24gIT09IE5VTEwpIHsNCgkJaW5jbHVkZV9vbmNlKHR4cGF0aC4nL2xpYi9jbGFzc1RleHRpbGUucGhwJyk7DQoJCSR0ZXh0aWxlID0gbmV3IFRleHRpbGUoKTsNCgkJJGRlc2NyaXB0aW9uX2h0bWwgPSAkdGV4dGlsZS0+dGV4dGlsZVRoaXMoJGRlc2NyaXB0aW9uKTsNCgl9DQoNCglpZiAoJGlkPXNhZmVfZmllbGQoJ2lkJywgJ3plbV9ldmVudF9jYWxlbmRhcicsICJhcnRpY2xlX2lkPSciLmRvU2xhc2goJGFydGljbGVfaWQpLiInIikpIHsNCgkJJG9sZCA9IHNhZmVfcm93KCcqJywgJ3plbV9ldmVudF9jYWxlbmRhcicsICJpZD0nIi5kb1NsYXNoKCRpZCkuIiciKTsNCgkJJHJlc3VsdCA9IHNhZmVfdXBkYXRlKCd6ZW1fZXZlbnRfY2FsZW5kYXInLA0KCQkJImV2ZW50X2RhdGU9JyIuZG9TbGFzaCgkc3FsX2RhdGUpLiInLCIuDQoJCQkoJHRpbWUgPyAiZXZlbnRfdGltZT0nIi5kb1NsYXNoKCRzcWxfdGltZSkuIicsIiA6ICdldmVudF90aW1lPU5VTEwsJykuDQoJCQkoJGZpbmlzaF9kYXRlID8gImZpbmlzaF9kYXRlPSciLmRvU2xhc2goJHNxbF9mZGF0ZSkuIicsIiA6ICdmaW5pc2hfZGF0ZT1OVUxMLCcpLg0KCQkJKCRmaW5pc2hfdGltZSA/ICJmaW5pc2hfdGltZT0nIi5kb1NsYXNoKCRzcWxfZnRpbWUpLiInLCIgOiAnZmluaXNoX3RpbWU9TlVMTCwnKS4NCgkJCSgkbG9jYXRpb24gIT09IE5VTEwgPyAibG9jYXRpb249JyIuZG9TbGFzaCgkbG9jYXRpb24pLiInLCIgOiAnJykuDQoJCQkoJGxvY2F0aW9uX3VybCAhPT0gTlVMTCA/ICJsb2NhdGlvbl91cmw9JyIuZG9TbGFzaCgkbG9jYXRpb25fdXJsKS4iJywiIDogJycpLg0KCQkJKCR1cmwgIT09IE5VTEwgPyAidXJsPSciLmRvU2xhc2goJHVybCkuIicsIiA6ICcnKS4NCgkJCSgkZW1haWwgIT09IE5VTEwgPyAiZW1haWw9JyIuZG9TbGFzaCgkZW1haWwpLiInLCIgOiAnJykuDQoJCQkoJGRlc2NyaXB0aW9uICE9PSBOVUxMID8gImRlc2NyaXB0aW9uPSciLmRvU2xhc2goJGRlc2NyaXB0aW9uKS4iJywiIDogJycpLg0KCQkJKCRkZXNjcmlwdGlvbl9odG1sICE9PSBOVUxMID8gImRlc2NyaXB0aW9uX2h0bWw9JyIuZG9TbGFzaCgkZGVzY3JpcHRpb25faHRtbCkuIicsIiA6ICcnKS4NCgkJCSgkcmVwZWF0X24gPyAicmVwZWF0X249JyIuaW50dmFsKCRyZXBlYXRfbikuIicsIiA6ICdyZXBlYXRfbj1OVUxMLCcpLg0KCQkJKCRyZXBlYXRfcGVyaW9kID8gInJlcGVhdF9wZXJpb2Q9JyIuZG9TbGFzaCgkcmVwZWF0X3BlcmlvZCkuIicsIiA6ICdyZXBlYXRfcGVyaW9kPU5VTEwsJykuDQoJCQkoJHJlcGVhdF90byA/ICJyZXBlYXRfdG89JyIuZG9TbGFzaCgkc3FsX3JlcGVhdF90bykuIicsIiA6ICdyZXBlYXRfdG89TlVMTCwnKS4NCiAJCQkoJGF1dG9fZGVsZXRlX2VudHJ5ID8gImRlbGV0ZV9lbnRyeT0nIi5kb1NsYXNoKCRhdXRvX2RlbGV0ZV9lbnRyeSkuIicsIiA6ICdkZWxldGVfZW50cnk9MCwnKS4NCiAJCQkoJGF1dG9fZGVsZXRlX2V2ZW50ID8gImRlbGV0ZV9ldmVudD0nIi5kb1NsYXNoKCRhdXRvX2RlbGV0ZV9ldmVudCkuIicsIiA6ICdkZWxldGVfZXZlbnQ9MCwnKS4NCgkJCSJuYW1lPSciLmRvU2xhc2goJG5hbWUpLiInLA0KCQkJbW9kaWZpZWQ9bm93KCkiLA0KCQkJImlkPSciLmRvU2xhc2goJGlkKS4iJyINCgkJKTsNCg0KCQkvLyByZWluc2VydCBkYXRlcyBpZiBhbnkgaGF2ZSBjaGFuZ2VkDQoJCWlmICgkcmVzdWx0IGFuZCBhcnJheSgkb2xkWydldmVudF9kYXRlJ10sICRvbGRbJ2V2ZW50X3RpbWUnXSwgJG9sZFsnZmluaXNoX2RhdGUnXSwgJG9sZFsnZmluaXNoX3RpbWUnXSwgJG9sZFsncmVwZWF0X24nXSwgJG9sZFsncmVwZWF0X3BlcmlvZCddLCAkb2xkWydyZXBlYXRfdG8nXSkgIT0gYXJyYXkoJHNxbF9kYXRlLCBAJHNxbF90aW1lLCBAJHNxbF9mZGF0ZSwgQCRzcWxfZnRpbWUsIEAkcmVwZWF0X24sICRyZXBlYXRfcGVyaW9kLCAkcmVwZWF0X3RvKSkgew0KCQkJc2FmZV9kZWxldGUoJ3plbV9ldmVudF9kYXRlJywgImV2ZW50X2lkPSciLmRvU2xhc2goJGlkKS4iJyIpOw0KDQoJCQl6ZW1fZXZlbnRfaW5zZXJ0X2RhdGUoJGlkLCAkZGF0ZSwgJHRpbWUsICRmaW5pc2hfZGF0ZSwgJGZpbmlzaF90aW1lKTsNCgkJCWlmICgkcmVwZWF0X24gYW5kICRyZXBlYXRfcGVyaW9kIGFuZCAkcmVwZWF0X3RvKSB7DQoNCgkJCQkkZmlyc3RfZGF0ZSA9IHplbV9zdHJ0b3RpbWUoJGRhdGUpOw0KCQkJCSRmaXJzdF9maW5pc2ggPSB6ZW1fc3RydG90aW1lKCRmaW5pc2hfZGF0ZSk7DQoNCgkJCQkkaSA9IDE7DQoJCQkJJGNvdW50PTA7DQoNCgkJCQl3aGlsZSAoKCsrJGNvdW50IDwgWkVNX01BWF9SRVBFQVRfRVZFTlRTKSBhbmQgKCRuZXh0ID0gemVtX3N0cnRvdGltZSgnKycuKCRpICogJHJlcGVhdF9uKS4nICcuJHJlcGVhdF9wZXJpb2QsICRmaXJzdF9kYXRlKSkgPD0gemVtX3N0cnRvdGltZSgkcmVwZWF0X3RvKSkgew0KCQkJCQl6ZW1fZXZlbnRfaW5zZXJ0X2RhdGUoJGlkLCB6ZW1fc3FsZGF0ZSgkbmV4dCksICR0aW1lLCAoJGZpbmlzaF9kYXRlID8gemVtX3NxbGRhdGUoemVtX3N0cnRvdGltZSgnKycuKCRpICogJHJlcGVhdF9uKS4nICcuJHJlcGVhdF9wZXJpb2QsICRmaXJzdF9maW5pc2gpKSA6IE5VTEwpLCAkZmluaXNoX3RpbWUpOw0KDQoJCQkJCSsrJGk7DQoJCQkJfQ0KDQoJCQl9DQoJCX0NCgl9DQoJZWxzZSB7DQoJCSRyZXN1bHQgPSBzYWZlX2luc2VydCgnemVtX2V2ZW50X2NhbGVuZGFyJywNCgkJCSJldmVudF9kYXRlPSciLmRvU2xhc2goJHNxbF9kYXRlKS4iJywiLg0KCQkJKCR0aW1lID8gImV2ZW50X3RpbWU9JyIuZG9TbGFzaCgkc3FsX3RpbWUpLiInLCIgOiAnZXZlbnRfdGltZT1OVUxMLCcpLg0KCQkJKCRmaW5pc2hfZGF0ZSA/ICJmaW5pc2hfZGF0ZT0nIi5kb1NsYXNoKCRzcWxfZmRhdGUpLiInLCIgOiAnZmluaXNoX2RhdGU9TlVMTCwnKS4NCgkJCSgkZmluaXNoX3RpbWUgPyAiZmluaXNoX3RpbWU9JyIuZG9TbGFzaCgkc3FsX2Z0aW1lKS4iJywiIDogJ2ZpbmlzaF90aW1lPU5VTEwsJykuDQoJCQkoJGxvY2F0aW9uICE9PSBOVUxMID8gImxvY2F0aW9uPSciLmRvU2xhc2goJGxvY2F0aW9uKS4iJywiIDogJycpLg0KCQkJKCRsb2NhdGlvbl91cmwgIT09IE5VTEwgPyAibG9jYXRpb25fdXJsPSciLmRvU2xhc2goJGxvY2F0aW9uX3VybCkuIicsIiA6ICcnKS4NCgkJCSgkdXJsICE9PSBOVUxMID8gInVybD0nIi5kb1NsYXNoKCR1cmwpLiInLCIgOiAnJykuDQoJCQkoJGVtYWlsICE9PSBOVUxMID8gImVtYWlsPSciLmRvU2xhc2goJGVtYWlsKS4iJywiIDogJycpLg0KCQkJKCRkZXNjcmlwdGlvbiAhPT0gTlVMTCA/ICJkZXNjcmlwdGlvbj0nIi5kb1NsYXNoKCRkZXNjcmlwdGlvbikuIicsIiA6ICcnKS4NCgkJCSgkZGVzY3JpcHRpb25faHRtbCAhPT0gTlVMTCA/ICJkZXNjcmlwdGlvbl9odG1sPSciLmRvU2xhc2goJGRlc2NyaXB0aW9uX2h0bWwpLiInLCIgOiAnJykuDQoJCQkoJHJlcGVhdF9uID8gInJlcGVhdF9uPSciLmludHZhbCgkcmVwZWF0X24pLiInLCIgOiAncmVwZWF0X249TlVMTCwnKS4NCgkJCSgkcmVwZWF0X3BlcmlvZCA/ICJyZXBlYXRfcGVyaW9kPSciLmRvU2xhc2goJHJlcGVhdF9wZXJpb2QpLiInLCIgOiAncmVwZWF0X3BlcmlvZD1OVUxMLCcpLg0KCQkJKCRyZXBlYXRfdG8gPyAicmVwZWF0X3RvPSciLmRvU2xhc2goJHNxbF9yZXBlYXRfdG8pLiInLCIgOiAncmVwZWF0X3RvPU5VTEwsJykuDQogCQkJKCRhdXRvX2RlbGV0ZV9lbnRyeSA/ICJkZWxldGVfZW50cnk9JyIuZG9TbGFzaCgkYXV0b19kZWxldGVfZW50cnkpLiInLCIgOiAnZGVsZXRlX2VudHJ5PTAsJykuDQogCQkJKCRhdXRvX2RlbGV0ZV9ldmVudCA/ICJkZWxldGVfZXZlbnQ9JyIuZG9TbGFzaCgkYXV0b19kZWxldGVfZXZlbnQpLiInLCIgOiAnZGVsZXRlX2V2ZW50PTAsJykuDQoJCQkibmFtZT0nIi5kb1NsYXNoKCRuYW1lKS4iJywNCgkJCWFydGljbGVfaWQ9JyIuZG9TbGFzaCgkYXJ0aWNsZV9pZCkuIicsDQoJCQltb2RpZmllZD1ub3coKSwNCgkJCWNyZWF0ZWQ9bm93KCkiDQoJCSk7DQoJCWlmICgkcmVzdWx0KQ0KCQkJJGlkID0gJHJlc3VsdDsNCg0KCQlpZiAoJGlkKSB7DQoJCQl6ZW1fZXZlbnRfaW5zZXJ0X2RhdGUoJGlkLCAkZGF0ZSwgJHRpbWUsICRmaW5pc2hfZGF0ZSwgJGZpbmlzaF90aW1lKTsNCgkJCWlmICgkcmVwZWF0X24gYW5kICRyZXBlYXRfcGVyaW9kIGFuZCAkcmVwZWF0X3RvKSB7DQoNCgkJCQkkZmlyc3RfZGF0ZSA9IHplbV9zdHJ0b3RpbWUoJGRhdGUpOw0KCQkJCSRmaXJzdF9maW5pc2ggPSB6ZW1fc3RydG90aW1lKCRmaW5pc2hfZGF0ZSk7DQoNCgkJCQkkaSA9IDE7DQoJCQkJJGNvdW50PTA7DQoNCgkJCQl3aGlsZSAoKCsrJGNvdW50IDwgWkVNX01BWF9SRVBFQVRfRVZFTlRTKSBhbmQgKCRuZXh0ID0gemVtX3N0cnRvdGltZSgnKycuKCRpICogJHJlcGVhdF9uKS4nICcuJHJlcGVhdF9wZXJpb2QsICRmaXJzdF9kYXRlKSkgPD0gemVtX3N0cnRvdGltZSgkcmVwZWF0X3RvKSkgew0KCQkJCQl6ZW1fZXZlbnRfaW5zZXJ0X2RhdGUoJGlkLCB6ZW1fc3FsZGF0ZSgkbmV4dCksICR0aW1lLCAoJGZpbmlzaF9kYXRlID8gemVtX3NxbGRhdGUoemVtX3N0cnRvdGltZSgnKycuKCRpICogJHJlcGVhdF9uKS4nICcuJHJlcGVhdF9wZXJpb2QsICRmaXJzdF9maW5pc2gpKSA6IE5VTEwpLCAkZmluaXNoX3RpbWUpOw0KDQoJCQkJCSsrJGk7DQoJCQkJfQ0KDQoJCQl9DQoJCX0NCgl9DQoNCglpZiAoJHJlc3VsdCBhbmQgJGNhdGVnb3JpZXMgIT09IE5VTEwpIHsNCgkJaWYgKGVtcHR5KCRjYXRlZ29yaWVzKSkNCgkJCSRjYXRlZ29yaWVzID0gYXJyYXkoKTsNCgkJaWYgKG0ybV91cGRhdGVfbGlua3MoJ3plbV9ldmVudF9jYXRlZ29yeScsICRpZCwgJGNhdGVnb3JpZXMpKQ0KCQkJcmV0dXJuICRpZDsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWlmICgkcmVzdWx0KQ0KCQlyZXR1cm4gJGlkOw0KCXJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2RlbGV0ZSgkYXJ0aWNsZV9pZCkgew0KCXJldHVybiBzYWZlX2RlbGV0ZSgnemVtX2V2ZW50X2NhbGVuZGFyJywgImFydGljbGVfaWQ9JyIuZG9TbGFzaCgkYXJ0aWNsZV9pZCkuIiciKTsNCn0NCg0KZnVuY3Rpb24gemVtX2FydGljbGVfZGVsZXRlKCRhcnRpY2xlX2lkKSB7DQogCXJldHVybiBzYWZlX2RlbGV0ZSgndGV4dHBhdHRlcm4nLCAiSUQ9JyIuZG9TbGFzaCgkYXJ0aWNsZV9pZCkuIiciKTsNCn0NCg0KZnVuY3Rpb24gemVtX2RhdGVzX2RlbGV0ZSgkaWQpIHsNCiAJcmV0dXJuIHNhZmVfZGVsZXRlKCd6ZW1fZXZlbnRfZGF0ZScsICJldmVudF9pZD0nIi5kb1NsYXNoKCRpZCkuIiciKTsNCn0NCg0KZnVuY3Rpb24gcmFzX2F1dG9fZGVsZXRlKCkgew0KICAgICR0el9kYXRlID0gc3RydG90aW1lKGRhdGUoJ1ktbS1kJywgbWt0aW1lKCkgKyB0el9vZmZzZXQoKSkpOw0KICAgICRyZXN1bHQgPSBzYWZlX3Jvd3Nfc3RhcnQoJyonLCAnemVtX2V2ZW50X2NhbGVuZGFyLHplbV9ldmVudF9kYXRlJywgImlkICE9IDAiKTsNCgl3aGlsZSgkYSA9IG5leHRSb3coJHJlc3VsdCkpIHsNCglpZigkYVsnZmluaXNoX2RhdGUnXSAhPSBOVUxMKQ0KCQl7DQoJCQkkZXhwaXJlX2RhdGUgPSAkYVsnZmluaXNoX2RhdGUnXTsNCgkJfSBlbHNlIHsNCgkJCSRleHBpcmVfZGF0ZSA9ICRhWydldmVudF9kYXRlJ107DQoJfQ0KCQlpZigkdHpfZGF0ZSA+IHN0cnRvdGltZSgkZXhwaXJlX2RhdGUpKSB7DQoJCQlpZigkYVsnZGVsZXRlX2VudHJ5J10gPT0gMSkgew0KCQkJCXplbV9ldmVudF9kZWxldGUoJGFbJ2FydGljbGVfaWQnXSk7DQoJCQkJemVtX2FydGljbGVfZGVsZXRlKCRhWydhcnRpY2xlX2lkJ10pOw0KCQkJCXplbV9kYXRlc19kZWxldGUoJGFbJ2lkJ10pOw0KCQkJfSBlbHNlaWYgKCRhWydkZWxldGVfZXZlbnQnXSA9PSAxKSB7DQoJCQkJemVtX2V2ZW50X2RlbGV0ZSgkYVsnYXJ0aWNsZV9pZCddKTsNCgkJCQl6ZW1fZGF0ZXNfZGVsZXRlKCRhWydpZCddKTsNCgkJCX0gZWxzZSB7cmV0dXJuIGZhbHNlOyB9DQoJCX0gDQoJfQkJCSAgICAgDQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9kYXRlKCRhdHRzKSB7DQoJJGxhdHRzID0gbEF0dHMoYXJyYXkoDQoJCSd0eXBlJyAgICA9PiAnZGF0ZScsDQoJCSdmaWVsZCcgICA9PiAnZXZlbnRfZGF0ZScsDQoJCSdmb3JtYXQnICA9PiAnJXgnLA0KCQknd3JhcHRhZycgPT4gJ3NwYW4nLA0KCQknY2xhc3MnICAgPT4gX19GVU5DVElPTl9fLA0KCSksJGF0dHMsIDApOw0KDQoJcmV0dXJuIHplbV9kYXRhX2ZpZWxkKHplbV9ldmVudF90aGlzZXZlbnQoKSwgJGxhdHRzICsgJGF0dHMpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfdGltZSgkYXR0cykgew0KCSRsYXR0cyA9IGxBdHRzKGFycmF5KA0KCQkndHlwZScgICAgPT4gJ2RhdGUnLA0KCQknZmllbGQnICAgPT4gJ2V2ZW50X3RpbWUnLA0KCQknZm9ybWF0JyAgPT4gJyVYJywNCgkJJ3dyYXB0YWcnID0+ICdzcGFuJywNCgkJJ2NsYXNzJyAgID0+IF9fRlVOQ1RJT05fXywNCgkpLCRhdHRzLCAwKTsNCg0KCXJldHVybiB6ZW1fZGF0YV9maWVsZCh6ZW1fZXZlbnRfdGhpc2V2ZW50KCksICRsYXR0cyArICRhdHRzKTsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X25hbWUoJGF0dHMpIHsNCgkkbGF0dHMgPSBsQXR0cyhhcnJheSgNCgkJJ2ZpZWxkJyAgID0+ICduYW1lJywNCgkJJ3dyYXB0YWcnID0+ICdzcGFuJywNCgkJJ2NsYXNzJyAgID0+IF9fRlVOQ1RJT05fXywNCgkJJ2RlZmF1bHQnID0+ICdVbnRpdGxlZCcsDQoJKSwkYXR0cywgMCk7DQoNCglyZXR1cm4gemVtX2RhdGFfZmllbGQoemVtX2V2ZW50X3RoaXNldmVudCgpLCAkbGF0dHMgKyAkYXR0cyk7DQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9wZXJtbGluaygkYXR0cywgJHRoaW5nPScnKSB7DQoJJGxhdHRzID0gbEF0dHMoYXJyYXkoDQoJCSd0eXBlJyAgICA9PiAncGVybWxpbmsnLA0KCQknZmllbGQnICAgPT4gJ2FydGljbGVfaWQnLA0KCQknd3JhcHRhZycgPT4gJycsDQoJCSdjbGFzcycgICA9PiBfX0ZVTkNUSU9OX18sDQoJCSdsaW5rdGV4dCc9PiBOVUxMLA0KCSksJGF0dHMsIDApOw0KDQoJaWYgKCR0aGluZykNCgkJJGxhdHRzWydsaW5rdGV4dCddID0gcGFyc2UoJHRoaW5nKTsNCg0KCXJldHVybiB6ZW1fZGF0YV9maWVsZCh6ZW1fZXZlbnRfdGhpc2V2ZW50KCksICRsYXR0cyArICRhdHRzKTsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2ZpbmlzaF9kYXRlKCRhdHRzKSB7DQoJJGxhdHRzID0gbEF0dHMoYXJyYXkoDQoJCSd0eXBlJyAgICA9PiAnZGF0ZScsDQoJCSdmaWVsZCcgICA9PiAnZmluaXNoX2RhdGUnLA0KCQknZm9ybWF0JyAgPT4gJyV4JywNCgkJJ3dyYXB0YWcnID0+ICdzcGFuJywNCgkJJ2NsYXNzJyAgID0+IF9fRlVOQ1RJT05fXywNCgkpLCRhdHRzLCAwKTsNCg0KCXJldHVybiB6ZW1fZGF0YV9maWVsZCh6ZW1fZXZlbnRfdGhpc2V2ZW50KCksICRsYXR0cyArICRhdHRzKTsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2ZpbmlzaF90aW1lKCRhdHRzKSB7DQoJJGxhdHRzID0gbEF0dHMoYXJyYXkoDQoJCSd0eXBlJyAgICA9PiAnZGF0ZScsDQoJCSdmaWVsZCcgICA9PiAnZmluaXNoX3RpbWUnLA0KCQknZm9ybWF0JyAgPT4gJyVYJywNCgkJJ3dyYXB0YWcnID0+ICdzcGFuJywNCgkJJ2NsYXNzJyAgID0+IF9fRlVOQ1RJT05fXywNCgkpLCRhdHRzLCAwKTsNCg0KCXJldHVybiB6ZW1fZGF0YV9maWVsZCh6ZW1fZXZlbnRfdGhpc2V2ZW50KCksICRsYXR0cyArICRhdHRzKTsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2xvY2F0aW9uKCRhdHRzKSB7DQoJJGxhdHRzID0gbEF0dHMoYXJyYXkoDQoJCSdmaWVsZCcgICA9PiAnbG9jYXRpb24nLA0KCQknd3JhcHRhZycgPT4gJ3NwYW4nLA0KCQknY2xhc3MnICAgPT4gX19GVU5DVElPTl9fLA0KCSksJGF0dHMsIDApOw0KDQoJcmV0dXJuIHplbV9kYXRhX2ZpZWxkKHplbV9ldmVudF90aGlzZXZlbnQoKSwgJGxhdHRzICsgJGF0dHMpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfdXJsKCRhdHRzLCAkdGhpbmc9JycpIHsNCgkkbGF0dHMgPSBsQXR0cyhhcnJheSgNCgkJJ3R5cGUnICAgID0+ICdsaW5rJywNCgkJJ2ZpZWxkJyAgID0+ICd1cmwnLA0KCQknd3JhcHRhZycgPT4gJycsDQoJCSdjbGFzcycgICA9PiBfX0ZVTkNUSU9OX18sDQoJCSdsaW5rdGV4dCc9PiBOVUxMLA0KCSksJGF0dHMsIDApOw0KDQoJaWYgKCR0aGluZykNCgkJJGxhdHRzWydsaW5rdGV4dCddID0gcGFyc2UoJHRoaW5nKTsNCg0KCXJldHVybiB6ZW1fZGF0YV9maWVsZCh6ZW1fZXZlbnRfdGhpc2V2ZW50KCksICRsYXR0cyArICRhdHRzKTsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2xvY2F0aW9uX3VybCgkYXR0cywgJHRoaW5nPScnKSB7DQoJJGxhdHRzID0gbEF0dHMoYXJyYXkoDQoJCSd0eXBlJyAgICA9PiAnbGluaycsDQoJCSdmaWVsZCcgICA9PiAnbG9jYXRpb25fdXJsJywNCgkJJ3dyYXB0YWcnID0+ICcnLA0KCQknY2xhc3MnICAgPT4gX19GVU5DVElPTl9fLA0KCQknbGlua3RleHQnPT4gTlVMTCwNCgkpLCRhdHRzLCAwKTsNCg0KCWlmICgkdGhpbmcpDQoJCSRsYXR0c1snbGlua3RleHQnXSA9IHBhcnNlKCR0aGluZyk7DQoNCglyZXR1cm4gemVtX2RhdGFfZmllbGQoemVtX2V2ZW50X3RoaXNldmVudCgpLCAkbGF0dHMgKyAkYXR0cyk7DQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9kZXNjcmlwdGlvbigkYXR0cykgew0KCSRsYXR0cyA9IGxBdHRzKGFycmF5KA0KCQknZmllbGQnICAgPT4gJ2Rlc2NyaXB0aW9uX2h0bWwnLA0KCQknd3JhcHRhZycgPT4gJ2RpdicsDQoJCSdlc2NhcGUnICA9PiAwLA0KCQknY2xhc3MnICAgPT4gX19GVU5DVElPTl9fLA0KCSksJGF0dHMsIDApOw0KDQoJcmV0dXJuIHplbV9kYXRhX2ZpZWxkKHplbV9ldmVudF90aGlzZXZlbnQoKSwgJGxhdHRzICsgJGF0dHMpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfZW1haWwoJGF0dHMsICR0aGluZz0nJykgew0KCSRsYXR0cyA9IGxBdHRzKGFycmF5KA0KCQkndHlwZScgICAgPT4gJ2VtYWlsJywNCgkJJ2ZpZWxkJyAgID0+ICdlbWFpbCcsDQoJCSd3cmFwdGFnJyA9PiAnJywNCgkJJ2NsYXNzJyAgID0+IF9fRlVOQ1RJT05fXywNCgkpLCRhdHRzLCAwKTsNCgkNCglpZiAoJHRoaW5nKSB7DQoJCSRsYXR0c1snbGlua3RleHQnXSA9IHBhcnNlKCR0aGluZyk7DQoJCSRsYXR0c1sndHlwZSddID0gJ2VtYWlsbGluayc7DQoJfQ0KCQ0KCXJldHVybiB6ZW1fZGF0YV9maWVsZCh6ZW1fZXZlbnRfdGhpc2V2ZW50KCksICRsYXR0cyArICRhdHRzKTsNCgkNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2NhdGVnb3JpZXMoJGF0dHMpIHsNCglnbG9iYWwgJHByZXRleHQ7DQoNCgkkbGF0dHMgPSBsQXR0cyhhcnJheSgNCgkJJ3dyYXB0YWcnID0+ICcnLA0KCQknY2xhc3MnICAgPT4gX19GVU5DVElPTl9fLA0KCQknYnJlYWsnICAgPT4gbiwNCgkJJ2JyZWFrY2xhc3MnID0+ICcnLA0KCQknbGluaycgICAgPT4gMSwNCgkJJ3NlY3Rpb24nID0+IEAkcHJldGV4dFsncyddLA0KCSksJGF0dHMsIDApOw0KDQoJZXh0cmFjdCgkbGF0dHMpOw0KDQoJJHRoaXNldmVudCA9JiB6ZW1fZXZlbnRfdGhpc2V2ZW50KCk7DQoJaWYgKGVtcHR5KCR0aGlzZXZlbnQpKQ0KCQlyZXR1cm47DQoNCglpZiAoIWlzc2V0KCR0aGlzZXZlbnRbJ2NhdGVnb3JpZXMnXSkpDQoJCSR0aGlzZXZlbnRbJ2NhdGVnb3JpZXMnXSA9IG0ybV9saW5rZWQoJ3plbV9ldmVudF9jYXRlZ29yeScsICR0aGlzZXZlbnRbJ2lkJ10sICd0eHBfY2F0ZWdvcnknKTsNCg0KCSRvdXQgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0aGlzZXZlbnRbJ2NhdGVnb3JpZXMnXSBhcyAkY2F0KSB7DQoJCWlmICgkbGluaykNCgkJCSRvdXRbXSA9IGhyZWYoJGNhdFsndGl0bGUnXSwgcGFnZWxpbmt1cmwoYXJyYXkoJ3MnPT4kc2VjdGlvbiwgJ2MnPT4kY2F0WyduYW1lJ10pKSk7DQoJCWVsc2UNCgkJCSRvdXRbXSA9ICRjYXRbJ3RpdGxlJ107DQoJfQ0KDQoJcmV0dXJuIGRvV3JhcCgkb3V0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsNCn0NCg0KZnVuY3Rpb24gJnplbV9ldmVudF90aGlzZXZlbnQoKSB7DQoJZ2xvYmFsICR6ZW1fdGhpc2V2ZW50Y2FsOw0KDQoJaWYgKGVtcHR5KCR6ZW1fdGhpc2V2ZW50Y2FsKSkgew0KCQl0cmlnZ2VyX2Vycm9yKHplbV9ldmVudF9nVHh0KCdlcnJvcl9jb250ZXh0JywgYXJyYXkoJ3t0aGluZ30nID0+ICd0aGlzZXZlbnQnKSkpOw0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCXJldHVybiAkemVtX3RoaXNldmVudGNhbDsNCn0NCg0KZnVuY3Rpb24gemVtX2RhdGFfZmllbGQoJiRvYmosICRhdHRzKSB7DQoNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQkndHlwZScgPT4gJycsDQoJCSdmaWVsZCcgPT4gJycsDQoJCSd3cmFwdGFnJyA9PiAnJywNCgkJJ2NsYXNzJyA9PiAnemVtX2RhdGFfZmllbGQnLA0KCQknZm9ybWF0JyA9PiAnJywNCgkJJ3RpdGxlJyAgPT4gJycsDQoJCSd0aXRsZV9mb3JtYXQnID0+ICcnLA0KCQknbGFiZWwnID0+ICcnLA0KCQknc2VwJyAgID0+ICc6ICcsDQoJCSdlc2NhcGUnID0+ICcxJywNCgkJJ2xpbmt0ZXh0JyA9PiBOVUxMLA0KCQknZGVmYXVsdCcgPT4gJycsDQoJKSwgJGF0dHMsIDApKTsNCg0KCSRhdHRyID0gJyc7DQoNCglpZiAoISRvYmopDQoJCXJldHVybjsNCg0KCWlmICghYXJyYXlfa2V5X2V4aXN0cygkZmllbGQsICRvYmopKSB7DQoJCXRyaWdnZXJfZXJyb3IoZ1R4dCgndW5rbm93bl9maWVsZCcsIGFycmF5KCd7ZmllbGR9JyA9PiAkZmllbGQpKSk7DQoJfQ0KDQoJaWYgKGVtcHR5KCRvYmpbJGZpZWxkXSkpIHsNCgkJaWYgKCRkZWZhdWx0KQ0KCQkJJG91dCA9ICRkZWZhdWx0Ow0KCQllbHNlDQoJCQlyZXR1cm4gJyc7DQoJfQ0KCWVsc2UNCgkJJG91dCA9ICRvYmpbJGZpZWxkXTsNCg0KCWlmICgkdHlwZSA9PSAnZGF0ZScgYW5kICRmb3JtYXQpDQoJCSRvdXQgPSB6ZW1fc3RyZnRpbWUoJGZvcm1hdCwgc3RydG90aW1lKCRvdXQpKTsNCglpZiAoJHR5cGUgPT0gJ2RhdGUnIGFuZCAkdGl0bGVfZm9ybWF0KQ0KCQkkYXR0ciA9ICcgdGl0bGU9IicuemVtX3N0cmZ0aW1lKCR0aXRsZV9mb3JtYXQsIHN0cnRvdGltZSgkb3V0KSkuJyInOw0KDQoJaWYgKCRlc2NhcGUpDQoJCSRvdXQgPSBlc2NhcGVfb3V0cHV0KCRvdXQpOw0KDQoJaWYgKCR0eXBlID09ICdwZXJtbGluaycpDQoJCSRvdXQgPSBwZXJtbGluayhhcnJheSgnY2xhc3MnPT4kY2xhc3MsJ2lkJz0+JG91dCksJGxpbmt0ZXh0KTsNCgllbHNlaWYgKCR0eXBlID09ICdsaW5rJykNCgkJJG91dCA9IGhyZWYoJGxpbmt0ZXh0LCAkb3V0KTsNCgllbHNlaWYgKCR0eXBlID09ICdlbWFpbCcpDQoJCSRvdXQgPSBlRSgkb3V0KTsNCgllbHNlaWYgKCR0eXBlID09ICdlbWFpbGxpbmsnKQ0KCQkkb3V0ID0gaHJlZigkbGlua3RleHQsJ21haWx0bzonLmVFKCRvdXQpKTsNCg0KCSRwcmUgPSAnJzsNCg0KCWlmICgkbGFiZWwpDQoJCSRwcmUgPSAkbGFiZWwgLiAkc2VwOw0KDQoJcmV0dXJuIGRvVGFnKCRwcmUgLiAkb3V0LCAkd3JhcHRhZywgJGNsYXNzLCAkYXR0cik7DQp9DQoNCg0KZnVuY3Rpb24gemVtX2V2ZW50X3RpbWVxKCRkYXRlX2Zyb20sICRkYXRlX3RvKSB7DQoJJGRfZnJvbSA9IHplbV9zdHJ0b3RpbWUoJGRhdGVfZnJvbSk7DQoJaWYgKHRyaW0oJGRhdGVfZnJvbSkgYW5kICEkZF9mcm9tKQ0KCQl0cmlnZ2VyX2Vycm9yKHplbV9ldmVudF9nVHh0KCdpbnZhbGlkX2RhdGUnLCBhcnJheSgne2RhdGV9JyA9PiAkZGF0ZV9mcm9tKSksIEVfVVNFUl9XQVJOSU5HKTsNCgkkZF90byA9IHplbV9zdHJ0b3RpbWUoJGRhdGVfdG8pOw0KCWlmICh0cmltKCRkYXRlX3RvKSBhbmQgISRkX3RvKQ0KCQl0cmlnZ2VyX2Vycm9yKHplbV9ldmVudF9nVHh0KCdpbnZhbGlkX2RhdGUnLCBhcnJheSgne2RhdGV9JyA9PiAkZGF0ZV90bykpLCBFX1VTRVJfV0FSTklORyk7DQoNCgkkdyA9IGFycmF5KCk7DQoJaWYgKCRkX2Zyb20pIHsNCgkJJHdbXSA9ICIoemVtX2V2ZW50X2RhdGUuZXZlbnRfZGF0ZSA+PSAnIi5kb1NsYXNoKHplbV9zcWxkYXRlKCRkX2Zyb20pKS4iJyINCgkJCS4iIG9yIHplbV9ldmVudF9kYXRlLmZpbmlzaF9kYXRlID49ICciLmRvU2xhc2goemVtX3NxbGRhdGUoJGRfZnJvbSkpLiInKSI7DQoJfQ0KDQoJaWYgKCRkX3RvKSB7DQoJCSR3W10gPSAiKHplbV9ldmVudF9kYXRlLmV2ZW50X2RhdGUgPD0gJyIuZG9TbGFzaCh6ZW1fc3FsZGF0ZSgkZF90bykpLiInIg0KCQkJLiIgb3IgemVtX2V2ZW50X2RhdGUuZmluaXNoX2RhdGUgPD0gJyIuZG9TbGFzaCh6ZW1fc3FsZGF0ZSgkZF90bykpLiInKSI7DQoJfQ0KDQoJcmV0dXJuICR3Ow0KfQ0KDQoNCi8vIGxpc3QgYWxsIGV2ZW50cw0KZnVuY3Rpb24gemVtX2V2ZW50X2xpc3QoJGF0dHMsICR0aGluZz1OVUxMKSB7DQoJZ2xvYmFsICR6ZW1fdGhpc2V2ZW50Y2FsLCAkcHJldGV4dDsNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSd3cmFwdGFnJyA9PiAnJywNCgkJJ2NsYXNzJyAgID0+IF9fRlVOQ1RJT05fXywNCgkJJ2JyZWFrJyAgID0+ICcnLA0KCQknYnJlYWtjbGFzcycgPT4gJycsDQoJCSdmb3JtJyAgICA9PiAnemVtX2V2ZW50X2Rpc3BsYXknLA0KCQknc29ydCcgICAgPT4gJ3plbV9ldmVudF9kYXRlLmV2ZW50X2RhdGUgYXNjLCB6ZW1fZXZlbnRfZGF0ZS5ldmVudF90aW1lIGFzYycsDQoJCSdkYXRlX2Zyb20nID0+IChncHMoJ2RhdGVfZnJvbScpID8gZ3BzKCdkYXRlX2Zyb20nKSA6ICd0b2RheScpLA0KCQknZGF0ZV90bycgICA9PiAoZ3BzKCdkYXRlX3RvJykgPyBncHMoJ2RhdGVfdG8nKSA6ICcnKSwNCgkJJ2RhdGUnICAgID0+IGdwcygnZGF0ZScpLA0KCQknbGFiZWwnICAgPT4gJycsDQoJCSdsYWJlbHRhZycgPT4gJycsDQoJCSdsaW1pdCcgICAgPT4gJycsDQoJCSdjYXRlZ29yeScgPT4gKGdwcygnYycpID8gZ3BzKCdjJykgOiBAJHByZXRleHRbJ2MnXSksDQoJCSdhbGxfY2F0ZWdvcmllcycgPT4gZ3BzKCdhbGxfY2F0ZWdvcmllcycpLA0KCQknbG9jYXRpb24nID0+IGdwcygnbG9jYXRpb24nKSwNCgkJJ2FsbF9sb2NhdGlvbnMnID0+IGdwcygnYWxsX2xvY2F0aW9ucycpLA0KCQknZGVidWcnICAgID0+IDAsDQoJKSwkYXR0cykpOw0KDQoJaWYgKCR0aGluZyA9PT0gTlVMTCkNCgkJJHRoaW5nID0gZmV0Y2hfZm9ybSgkZm9ybSk7DQoNCgkkd2hlcmUgPSAnemVtX2V2ZW50X2NhbGVuZGFyLmlkPXplbV9ldmVudF9kYXRlLmV2ZW50X2lkIGFuZCB6ZW1fZXZlbnRfY2FsZW5kYXIuYXJ0aWNsZV9pZCA9IHRleHRwYXR0ZXJuLklEIGFuZCB0ZXh0cGF0dGVybi5TdGF0dXMgPj0gNCBhbmQgdGV4dHBhdHRlcm4uUG9zdGVkIDw9IG5vdygpJzsNCg0KCWlmICgkZGF0ZSkgew0KCQlAbGlzdCgkeSwgJG0sICRkKSA9IGV4cGxvZGUoJy0nLCAkZGF0ZSk7DQoJCWlmICgkeSBhbmQgJG0gYW5kICRkKSB7DQoJCQkkZGF0ZV9mcm9tID0gJGRhdGVfdG8gPSAiJHktJG0tJGQiOw0KCQl9DQoJCWVsc2VpZiAoJHkgYW5kICRtKSB7DQoJCQkkZGF0ZV9mcm9tID0gIiR5LSRtLTAxIjsNCgkJCSRkYXRlX3RvID0gc3RyZnRpbWUoJyVZLSVtLSVkJywgc3RydG90aW1lKCctMSBkYXknLCBzdHJ0b3RpbWUoJysxIG1vbnRoJywgc3RydG90aW1lKCRkYXRlX2Zyb20pKSkpOw0KCQl9DQoJCWVsc2VpZiAoJHkpIHsNCgkJCSRkYXRlX2Zyb20gPSAiJHktMDEtMDEiOw0KCQkJJGRhdGVfdG8gPSAiJHktMTItMzEiOw0KCQl9DQoJCWVsc2VpZiAoJHQgPSB6ZW1fc3RydG90aW1lKCRkYXRlKSkgew0KCQkJJGRhdGVfZnJvbSA9IHN0cmZ0aW1lKCclWS0lbS0lZCcsICR0KTsNCgkJCSRkYXRlX3RvID0gc3RyZnRpbWUoJyVZLSVtLSVkJywgJHQpOw0KCQl9DQoJfQ0KDQoJJHcgPSB6ZW1fZXZlbnRfdGltZXEoJGRhdGVfZnJvbSwgJGRhdGVfdG8pOw0KCWlmICgkdykNCgkJJHdoZXJlIC49ICgnIGFuZCAnLmpvaW4oJyBhbmQgJywgJHcpKTsNCg0KCWlmICgkbG9jYXRpb24gYW5kICEkYWxsX2xvY2F0aW9ucykgew0KCQkvLyBsb2NhdGlvbiBjb3VsZCBiZSBhbiBhcnJheSBpZiBpdCBjYW1lIGZyb20gZ3BzKCkNCgkJaWYgKGlzX2FycmF5KCRsb2NhdGlvbikpDQoJCQkkbG9jcyA9ICRsb2NhdGlvbjsNCgkJZWxzZQ0KCQkJJGxvY3MgPSBkb19saXN0KCRsb2NhdGlvbik7DQoJCSR3aGVyZSAuPSAoIiBhbmQgbG9jYXRpb24gSU4gKCIuam9pbignLCcsIHF1b3RlX2xpc3QoJGxvY3MpKS4iKSIpOw0KCX0NCg0KCWlmICgkcSA9IGdwcygncScpKQ0KCQkkd2hlcmUgLj0gKCIgYW5kIChuYW1lIHJsaWtlICciLmRvU2xhc2goJHEpLiInIG9yIGRlc2NyaXB0aW9uIHJsaWtlICciLmRvU2xhc2goJHEpLiInKSIpOw0KDQoJaWYgKCRjYXRlZ29yeSBhbmQgISRhbGxfY2F0ZWdvcmllcykgew0KCQkvLyBjYXRlZ29yeSBjb3VsZCBiZSBhbiBhcnJheSBpZiBpdCBjYW1lIGZyb20gZ3BzKCkNCgkJaWYgKGlzX2FycmF5KCRjYXRlZ29yeSkpDQoJCQkkY2F0cyA9ICRjYXRlZ29yeTsNCgkJZWxzZQ0KCQkJJGNhdHMgPSBkb19saXN0KCRjYXRlZ29yeSk7DQoJCSRjYXRzX2lkID0gc2FmZV9jb2x1bW4oJ2lkJywgJ3R4cF9jYXRlZ29yeScsICJ0eXBlPSdldmVudCcgYW5kIG5hbWUgSU4gKCIuam9pbignLCcsIHF1b3RlX2xpc3QoJGNhdHMpKS4iKSIpOw0KCQlpZiAoISRjYXRzX2lkKQ0KCQkJJGNhdHNfaWQgPSBhcnJheSgwKTsNCgkJJHdoZXJlID0gInplbV9ldmVudF9jYWxlbmRhci5pZD16ZW1fZXZlbnRfY2F0ZWdvcnkuazEgYW5kIHplbV9ldmVudF9jYXRlZ29yeS5rMiBJTiAoIi5qb2luKCcsJywgcXVvdGVfbGlzdCgkY2F0c19pZCkpLiIpIGFuZCAiLiR3aGVyZTsNCgkJJGdyYW5kX3RvdGFsID0gc2FmZV9jb3VudCgnemVtX2V2ZW50X2NhbGVuZGFyLCB6ZW1fZXZlbnRfZGF0ZSwgdGV4dHBhdHRlcm4sIHplbV9ldmVudF9jYXRlZ29yeScsICR3aGVyZS4nIGdyb3VwIGJ5IHplbV9ldmVudF9jYWxlbmRhci5pZCBvcmRlciBieSAnLiRzb3J0LCAkZGVidWcpOw0KCQkkbGltID0gemVtX2V2ZW50X3BhZ2luYXRlKCRsaW1pdCwgJGdyYW5kX3RvdGFsKTsNCgkJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCd6ZW1fZXZlbnRfY2FsZW5kYXIuKiwgemVtX2V2ZW50X2RhdGUuKiwgdGV4dHBhdHRlcm4uKiwgdW5peF90aW1lc3RhbXAoUG9zdGVkKSBhcyB1UG9zdGVkJywgJ3plbV9ldmVudF9jYWxlbmRhciwgemVtX2V2ZW50X2RhdGUsIHRleHRwYXR0ZXJuLCB6ZW1fZXZlbnRfY2F0ZWdvcnknLCAkd2hlcmUuJyBncm91cCBieSB6ZW1fZXZlbnRfY2FsZW5kYXIuaWQgb3JkZXIgYnkgJy4kc29ydC4kbGltLCAkZGVidWcpOw0KCX0NCgllbHNlIHsNCgkJJGdyYW5kX3RvdGFsID0gc2FmZV9jb3VudCgnemVtX2V2ZW50X2NhbGVuZGFyLCB6ZW1fZXZlbnRfZGF0ZSwgdGV4dHBhdHRlcm4nLCAkd2hlcmUuJyBvcmRlciBieSAnLiRzb3J0LCAkZGVidWcpOw0KCQkkbGltID0gemVtX2V2ZW50X3BhZ2luYXRlKCRsaW1pdCwgJGdyYW5kX3RvdGFsKTsNCgkJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCcqLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0ZWQnLCAnemVtX2V2ZW50X2NhbGVuZGFyLCB6ZW1fZXZlbnRfZGF0ZSwgdGV4dHBhdHRlcm4nLCAkd2hlcmUuJyBvcmRlciBieSAnLiRzb3J0LiRsaW0sICRkZWJ1Zyk7DQoJfQ0KDQoJJG91dCA9IGFycmF5KCk7DQoJd2hpbGUgKCRyb3cgPSBuZXh0Um93KCRycykpIHsNCgkJYXJ0aWNsZV9wdXNoKCk7DQoJCSR6ZW1fdGhpc2V2ZW50Y2FsID0gJHJvdzsNCgkJcG9wdWxhdGVBcnRpY2xlRGF0YSgkcm93KTsNCgkJJG91dFtdID0gcGFyc2UoJHRoaW5nKTsNCgkJJHplbV90aGlzZXZlbnRjYWwgPSBOVUxMOw0KCQlhcnRpY2xlX3BvcCgpOw0KCX0NCg0KCXJldHVybiBkb1RhZygkbGFiZWwsICRsYWJlbHRhZywgJGNsYXNzKS4NCgkJZG9XcmFwKCRvdXQsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOw0KfQ0KDQovLyBzaG93IHRoZSBjdXJyZW50IGFydGljbGUncyBldmVudCwgaWYgYW55DQpmdW5jdGlvbiB6ZW1fYXJ0aWNsZV9ldmVudCgkYXR0cywgJHRoaW5nPU5VTEwpIHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkemVtX3RoaXNldmVudGNhbDsNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSd3cmFwdGFnJyA9PiAnJywNCgkJJ2JyZWFrJyAgID0+ICcnLA0KCQknY2xhc3MnICAgPT4gX19GVU5DVElPTl9fLA0KCQknYnJlYWtjbGFzcycgPT4gJycsDQoJCSdsYWJlbCcgICA9PiAnJywNCgkJJ2xhYmVsdGFnJyA9PiAnJywNCgkJJ2Zvcm0nICAgID0+ICd6ZW1fZXZlbnRfZGlzcGxheScsDQoJCSdsaW1pdCcgICA9PiAnJywNCgkpLCRhdHRzKSk7DQoNCglhc3NlcnRfYXJ0aWNsZSgpOw0KDQoJaWYgKCR0aGluZyA9PT0gTlVMTCkNCgkJJHRoaW5nID0gZmV0Y2hfZm9ybSgkZm9ybSk7DQoNCgkkd2hlcmUgPSAiYXJ0aWNsZV9pZD0nIi5kb1NsYXNoKCR0aGlzYXJ0aWNsZVsndGhpc2lkJ10pLiInIGFuZCB6ZW1fZXZlbnRfY2FsZW5kYXIuaWQ9emVtX2V2ZW50X2RhdGUuZXZlbnRfaWQiOw0KDQoJJGxpbSA9ICcnOw0KCWlmIChpbnR2YWwoJGxpbWl0KSkNCgkJJGxpbSA9ICcgbGltaXQgJy5pbnR2YWwoJGxpbWl0KTsNCg0KCSRycyA9IHNhZmVfcm93c19zdGFydCgnKicsICd6ZW1fZXZlbnRfY2FsZW5kYXIsIHplbV9ldmVudF9kYXRlJywgJHdoZXJlLiRsaW0pOw0KDQoJJG91dCA9IGFycmF5KCk7DQoJd2hpbGUgKCRyb3cgPSBuZXh0Um93KCRycykpIHsNCgkJJHplbV90aGlzZXZlbnRjYWwgPSAkcm93Ow0KCQkkb3V0W10gPSBwYXJzZSgkdGhpbmcpOw0KCQkkemVtX3RoaXNldmVudGNhbCA9IE5VTEw7DQoNCgl9DQoNCglpZiAoJG91dCkNCgkJcmV0dXJuIGRvVGFnKCRsYWJlbCwgJGxhYmVsdGFnLCAkY2xhc3MpLg0KCQkJZG9XcmFwKCRvdXQsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOw0KfQ0KDQoNCi8vIGNhbGVuZGFyIHZpZXcNCmZ1bmN0aW9uIHplbV9ldmVudF9jYWxlbmRhcigkYXR0cykgew0KDQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ3dyYXB0YWcnICAgICA9PiAndWwnLA0KCQknYnJlYWsnICAgICAgID0+ICdsaScsDQoNCgkJJ3RhYmxlJyAgICAgICA9PiAndGFibGUnLA0KCQkndHInICAgICAgICAgID0+ICd0cicsDQoJCSd0ZCcgICAgICAgICAgPT4gJ3RkJywNCgkJJ3RoJyAgICAgICAgICA9PiAndGgnLA0KCQknY2FwdGlvbicgICAgID0+ICdjYXB0aW9uJywNCgkJJ2NvbCcgICAgICAgICA9PiAnY29sJywNCgkJJ2NvbGdyb3VwJyAgICA9PiAnY29sZ3JvdXAnLA0KCQkndGhlYWQnICAgICAgID0+ICd0aGVhZCcsDQoJCSd0Ym9keScgICAgICAgPT4gJ3Rib2R5JywNCgkJJ2NlbGxzcGFjaW5nJyA9PiAnJywNCg0KCQknZGF0ZScgICAgICAgPT4gZ3BzKCdkYXRlJyksDQoJCSdjbGFzcycgICAgICAgPT4gX19GVU5DVElPTl9fLA0KCQknY2xhc3Nfcm93X251bScgPT4gJ251bWJlcicsDQoJCSdjbGFzc19yb3dfZGF5JyA9PiAnZGF5JywNCgkJJ2NsYXNzX2V2ZW50JyA9PiAnJywNCgkJJ2NsYXNzX2VtcHR5JyA9PiAnJywNCgkJJ2NsYXNzX25vZGF5JyA9PiAnJywNCgkJJ2Zvcm0nICAgICAgICA9PiAnemVtX2V2ZW50X2NhbF9lbnRyeScsDQoJCSdsYWJlbHRhZycgICAgPT4gJ2gzJywNCgkpLCRhdHRzKSk7DQoNCgkkeSA9IHN0cmZ0aW1lKCclWScpOw0KCSRtID0gc3RyZnRpbWUoJyVtJyk7DQoJaWYgKCRkYXRlKSB7DQoJCUBsaXN0KCR5LCAkbSwgJGQpID0gZXhwbG9kZSgnLScsICRkYXRlKTsNCgkJaWYgKCR5IGFuZCAkbSkgew0KCQl9DQoJCWVsc2VpZiAoJHkgYW5kICEkbSkgew0KCQkJJG0gPSBzdHJmdGltZSgnJW0nKTsNCgkJfQ0KCQllbHNlaWYgKCR0ID0gemVtX3N0cnRvdGltZSgkZGF0ZSkpIHsNCgkJCSR5ID0gc3RyZnRpbWUoJyVZJywgJHQpOw0KCQkJJG0gPSBzdHJmdGltZSgnJW0nLCAkdCk7DQoJCX0NCgl9DQoNCgkvLyBkYXkgbnVtYmVyIG9mIHRoZSBmaXJzdCBvZiB0aGUgbW9udGggKFN1bmRheSA9IDApDQoJJGZpcnN0ID0gbWt0aW1lKDAsMCwwLCRtLCAxLCAkeSk7DQoJJGZpcnN0ZGF5ID0gc3RyZnRpbWUoJyV3JywgJGZpcnN0KTsNCgkvLyBudW1iZXIgb2YgZGF5cyBpbiB0aGUgbW9udGgNCgkkbnVtZGF5cyA9IHN0cmZ0aW1lKCclZCcsc3RydG90aW1lKCctMSBkYXknLCBzdHJ0b3RpbWUoJysxIG1vbnRoJywgJGZpcnN0KSkpOw0KDQoJJG91dCA9IGFycmF5KCk7DQoNCgkjIGNhcHRpb24NCgkkb3V0W10gPSBkb1RhZyhzdHJmdGltZSgnJUIgJVknLCAkZmlyc3QpLCAnY2FwdGlvbicpOw0KDQoJIyBjb2x1bW4gZ3JvdXBzDQoJJHJvdyA9IGFycmF5KCk7DQoJZm9yICgkZD0xOyAkZDw9NzsgJGQrKykNCgkJJHJvd1tdID0gZG9UYWcoJycsICdjb2wnLCBzdHJmdGltZSgnJWEnLCBta3RpbWUoMCwwLDAsJG0sICgkZCs3LSRmaXJzdGRheSksICR5KSkpOw0KCSRvdXRbXSA9IGRvVGFnKG4uam9pbihuLCAkcm93KS5uLCAnY29sZ3JvdXAnKTsNCg0KCSMgdGFibGUgaGVhZGluZ3MNCgkkcm93ID0gYXJyYXkoKTsNCglmb3IgKCRkPTE7ICRkPD03OyAkZCsrKQ0KCQkkcm93W10gPSBkb1RhZyhzdHJmdGltZSgnJWEnLCBta3RpbWUoMCwwLDAsJG0sICgkZCs3LSRmaXJzdGRheSksICR5KSksICR0aCwgJycsICcgc2NvcGU9ImNvbCInKTsNCgkkb3V0W10gPSBkb1RhZyhuLnRyKG4uam9pbihuLCAkcm93KS5uKS5uLCAndGhlYWQnKTsNCg0KCSRib2R5ID0gYXJyYXkoKTsNCg0KCSRudW1yb3dzID0gY2VpbCgoJG51bWRheXMgKyAkZmlyc3RkYXkpLzcpOw0KDQoJIyBkaXNwbGF5IGVhY2ggY2VsbCBpbiB0aGUgY2FsZW5kYXIsIDcgeCA1IGdyaWQNCglmb3IgKCR3PTA7ICR3PCRudW1yb3dzOyAkdysrKSB7DQoJCSRudW1fcm93ID0gYXJyYXkoKTsNCgkJJGRheV9yb3cgPSBhcnJheSgpOw0KCQlmb3IgKCRkPTE7ICRkPD03OyAkZCsrKSB7DQoJCQkkZGF5bnVtID0gKCR3KjcpICsgJGQ7DQoJCQkkZGF5b2Ztb250aCA9ICRkYXludW0gLSAkZmlyc3RkYXk7DQoNCgkJCWlmIChjaGVja2RhdGUoJG0sICRkYXlvZm1vbnRoLCAkeSkpIHsNCgkJCQkvLyB0aGlzIGlzIGEgcmVhbCBkYXkNCgkJCQkjIG5lZWQgdG8gbGlzdCB0aGUgZXZlbnRzIGhlcmUNCgkJCQkkZXZlbnRzID0gemVtX2V2ZW50X2xpc3QoYXJyYXkoDQoJCQkJCSd3cmFwdGFnJyAgPT4gJHdyYXB0YWcsDQoJCQkJCSdicmVhaycgICAgPT4gJGJyZWFrLA0KCQkJCQknZm9ybScgICAgID0+ICRmb3JtLA0KCQkJCQknZGF0ZScgICAgID0+ICIkeS0kbS0kZGF5b2Ztb250aCIsDQoJCQkJKSk7DQoJCQkJaWYgKCRldmVudHMpIHsNCgkJCQkJJG51bV9yb3dbXSA9IGRvVGFnKCRkYXlvZm1vbnRoLCAkdGQsICRjbGFzc19ldmVudCk7DQoJCQkJCSRkYXlfcm93W10gPSBkb1RhZygkZXZlbnRzLCAkdGQsICRjbGFzc19ldmVudCk7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KCQkJCQkkbnVtX3Jvd1tdID0gZG9UYWcoJGRheW9mbW9udGgsICR0ZCwgJGNsYXNzX2VtcHR5KTsNCgkJCQkJJGRheV9yb3dbXSA9IGRvVGFnKCcmbmJzcDsnLCAkdGQsICRjbGFzc19lbXB0eSk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8ganVzdCBhIGJsYW5rIHRvIGZpbGwgaW4gdGhlIGdyaWQNCgkJCQkkbnVtX3Jvd1tdID0gZG9UYWcoJyZuYnNwOycsICR0ZCwgJGNsYXNzX25vZGF5KTsNCgkJCQkkZGF5X3Jvd1tdID0gZG9UYWcoJyZuYnNwOycsICR0ZCwgJGNsYXNzX25vZGF5KTsNCgkJCX0NCg0KDQoJCX0NCgkJJGJvZHlbXSA9IGRvVGFnKG4uam9pbihuLCAkbnVtX3JvdykubiwgJHRyLCAkY2xhc3Nfcm93X251bSk7DQoJCSRib2R5W10gPSBkb1RhZyhuLmpvaW4obiwgJGRheV9yb3cpLm4sICR0ciwgJGNsYXNzX3Jvd19kYXkpOw0KCX0NCg0KCSRvdXRbXSA9IGRvVGFnKG4uam9pbihuLCAkYm9keSkubiwgJ3Rib2R5Jyk7DQoNCglyZXR1cm4gZG9UYWcobi5qb2luKG4sICRvdXQpLm4sICR0YWJsZSwgJGNsYXNzLCAoJGNlbGxzcGFjaW5nID09PSAnJyA/ICcnIDogJyBjZWxsc3BhY2luZz0iJy4kY2VsbHNwYWNpbmcuJyInKSk7DQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9jYWxlbmRhcl9uYXYoJGF0dHMpIHsNCglnbG9iYWwgJHByZXRleHQ7DQoNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQknd3JhcHRhZycgPT4gJ2RpdicsDQoJCSdicmVhaycgICA9PiBuLA0KCQknY2xhc3MnICAgPT4gX19GVU5DVElPTl9fLA0KCQkncHJldicgICAgPT4gJyZsYXJyOycsDQoJCSdwcmV2Y2xhc3MnID0+ICdwcmV2JywNCgkJJ25leHQnICAgID0+ICcmcmFycjsnLA0KCQknbmV4dGNsYXNzJyA9PiAnbmV4dCcsDQoJCSdkYXRlJyAgID0+ICd0b2RheScsDQoJCSdsYWJlbCcgID0+ICclQiAlWScsDQoJCSdsYWJlbHRhZyc9PiAnaDMnLA0KCQkncmV2ZXJzZScgPT4gMCwNCgkJJ3N0ZXAnICAgID0+ICdtb250aCcsDQoJKSwkYXR0cywgMCkpOw0KDQoJaWYgKGdwcygnZGF0ZScpKSB7DQoJCUBsaXN0KCR5LCAkbSkgPSBleHBsb2RlKCctJywgZ3BzKCdkYXRlJykpOw0KCQkkeSA9IGludHZhbCgkeSkgPyBpbnR2YWwoJHkpIDogc3RyZnRpbWUoJyVZJyk7DQoJCSRtID0gaW50dmFsKCRtKSA/IGludHZhbCgkbSkgOiBzdHJmdGltZSgnJW0nKTsNCgl9DQoJZWxzZSB7DQoJCSR0cyA9IHN0cnRvdGltZSgkZGF0ZSk7DQoJCSR5ID0gc3RyZnRpbWUoJyVZJywgJHRzKTsNCgkJJG0gPSBzdHJmdGltZSgnJW0nLCAkdHMpOw0KCX0NCg0KCSMgbmV4dCBhbmQgcHJldmlvdXMgZGF0ZXMNCglpZiAoJHN0ZXAgPT0gJ3llYXInKSB7DQoJCSRwcmV2X2QgPSBzdHJmdGltZSgnJVknLCAkcHJldl90cyA9IHN0cnRvdGltZSgnLTEgeWVhcicsIG1rdGltZSgwLDAsMCwkbSwxLCR5KSkpOw0KCQkkbmV4dF9kID0gc3RyZnRpbWUoJyVZJywgJG5leHRfdHMgPSBzdHJ0b3RpbWUoJysxIHllYXInLCBta3RpbWUoMCwwLDAsJG0sMSwkeSkpKTsNCgl9DQoJZWxzZSB7DQoJCSRwcmV2X2QgPSBzdHJmdGltZSgnJVktJW0nLCAkcHJldl90cyA9IHN0cnRvdGltZSgnLTEgbW9udGgnLCBta3RpbWUoMCwwLDAsJG0sMSwkeSkpKTsNCgkJJG5leHRfZCA9IHN0cmZ0aW1lKCclWS0lbScsICRuZXh0X3RzID0gc3RydG90aW1lKCcrMSBtb250aCcsIG1rdGltZSgwLDAsMCwkbSwxLCR5KSkpOw0KCX0NCg0KCSRvdXQgPSBhcnJheSgpOw0KDQoJIyBwcmV2IGxpbmsNCgkkb3V0W10gPSAnPGEgcmVsPSJwcmV2IiBjbGFzcz0iJy4kcHJldmNsYXNzLiciIGhyZWY9IicucGFnZWxpbmt1cmwoYXJyYXkoDQoJCSdkYXRlJyA9PiAkcHJldl9kLA0KCQkncycgICAgPT5AJHByZXRleHRbJ3MnXSwNCgkJJ2MnICAgID0+QCRwcmV0ZXh0WydjJ10sDQoJCSdxJyAgICA9PkAkcHJldGV4dFsncSddLA0KCSkpLiciPicuc3RyZnRpbWUoJHByZXYsICRwcmV2X3RzKS4nPC9hPic7DQoNCgkjIG1vbnRoIG5hbWUNCgkkb3V0W10gPSBkb1RhZyhzdHJmdGltZSgkbGFiZWwsIG1rdGltZSgwLDAsMCwkbSwxLCR5KSksICRsYWJlbHRhZywgJGNsYXNzKTsNCg0KCSMgbmV4dCBsaW5rDQoJJG91dFtdID0gJzxhIHJlbD0ibmV4dCIgY2xhc3M9IicuJG5leHRjbGFzcy4nIiBocmVmPSInLnBhZ2VsaW5rdXJsKGFycmF5KA0KCQknZGF0ZScgPT4gJG5leHRfZCwNCgkJJ3MnICAgID0+QCRwcmV0ZXh0WydzJ10sDQoJCSdjJyAgICA9PkAkcHJldGV4dFsnYyddLA0KCQkncScgICAgPT5AJHByZXRleHRbJ3EnXSwNCgkpKS4nIj4nLnN0cmZ0aW1lKCRuZXh0LCAkbmV4dF90cykuJzwvYT4nOw0KDQoJaWYgKCRyZXZlcnNlKQ0KCQkkb3V0ID0gYXJyYXlfcmV2ZXJzZSgkb3V0KTsNCg0KCXJldHVybiBkb1dyYXAoJG91dCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzKTsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X21pbmlfY2FsZW5kYXIoJGF0dHMpIHsNCgkvLyBhIG1pbmkgY2FsZW5kYXIgaW50ZW5kZWQgYXMgYSBuYXZpZ2F0aW9uIGNvbnRyb2wgZm9yIHNpZGViYXJzIGV0Yw0KCWdsb2JhbCAkcHJldGV4dDsNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSd0YWJsZScgICAgICAgPT4gJ3RhYmxlJywNCgkJJ3RyJyAgICAgICAgICA9PiAndHInLA0KCQkndGQnICAgICAgICAgID0+ICd0ZCcsDQoJCSd0aCcgICAgICAgICAgPT4gJ3RoJywNCgkJJ2NhcHRpb24nICAgICA9PiAnY2FwdGlvbicsDQoJCSdjb2wnICAgICAgICAgPT4gJ2NvbCcsDQoJCSdjb2xncm91cCcgICAgPT4gJ2NvbGdyb3VwJywNCgkJJ3RoZWFkJyAgICAgICA9PiAndGhlYWQnLA0KCQkndGJvZHknICAgICAgID0+ICd0Ym9keScsDQoJCSdjZWxsc3BhY2luZycgPT4gJycsDQoNCgkJJ2RhdGUnICAgICAgID0+IGdwcygnZGF0ZScpLA0KCQknY2xhc3MnICAgICAgID0+IF9fRlVOQ1RJT05fXywNCgkJJ2NsYXNzX3Jvd19udW0nID0+ICdudW1iZXInLA0KCQknY2xhc3Nfcm93X2RheScgPT4gJ2RheScsDQoJCSdjbGFzc19ldmVudCcgPT4gJycsDQoJCSdjbGFzc19lbXB0eScgPT4gJycsDQoJCSdjbGFzc19ub2RheScgPT4gJycsDQoJCSdjbGFzc19saW5rJyAgPT4gJycsDQoJCSdsYWJlbHRhZycgICAgPT4gJ2gzJywNCgkJJ3NlY3Rpb24nICAgICA9PiBAJHByZXRleHRbJ3MnXSwNCgkpLCRhdHRzKSk7DQoNCgkkeSA9ICcnOyAkbSA9ICcnOw0KCWlmICgkZGF0ZSkNCgkJQGxpc3QoJHksICRtLCAkZCkgPSBzcGxpdCgnLScsICRkYXRlKTsNCglpZiAoIWlzX251bWVyaWMoJHkpKQ0KCQkkeSA9IHN0cmZ0aW1lKCclWScpOw0KCWlmICghaXNfbnVtZXJpYygkbSkpDQoJCSRtID0gc3RyZnRpbWUoJyVtJyk7DQoNCgkvLyBkYXkgbnVtYmVyIG9mIHRoZSBmaXJzdCBvZiB0aGUgbW9udGggKFN1bmRheSA9IDApDQoJJGZpcnN0ID0gbWt0aW1lKDAsMCwwLCRtLCAxLCAkeSk7DQoJJGZpcnN0ZGF5ID0gc3RyZnRpbWUoJyV3JywgJGZpcnN0KTsNCgkvLyBudW1iZXIgb2YgZGF5cyBpbiB0aGUgbW9udGgNCgkkbnVtZGF5cyA9IHN0cmZ0aW1lKCclZCcsc3RydG90aW1lKCctMSBkYXknLCBzdHJ0b3RpbWUoJysxIG1vbnRoJywgJGZpcnN0KSkpOw0KDQoJJG91dCA9IGFycmF5KCk7DQoNCgkjIGNhcHRpb24NCgkkb3V0W10gPSBkb1RhZyhzdHJmdGltZSgnJUIgJVknLCAkZmlyc3QpLCAnY2FwdGlvbicpOw0KDQoJIyBjb2x1bW4gZ3JvdXBzDQoJJHJvdyA9IGFycmF5KCk7DQoJZm9yICgkZD0xOyAkZDw9NzsgJGQrKykNCgkJJHJvd1tdID0gZG9UYWcoJycsICdjb2wnLCBzdHJmdGltZSgnJWEnLCBta3RpbWUoMCwwLDAsJG0sICgkZCs3LSRmaXJzdGRheSksICR5KSkpOw0KCSRvdXRbXSA9IGRvVGFnKG4uam9pbihuLCAkcm93KS5uLCAnY29sZ3JvdXAnKTsNCg0KCSMgdGFibGUgaGVhZGluZ3MNCgkkcm93ID0gYXJyYXkoKTsNCglmb3IgKCRkPTE7ICRkPD03OyAkZCsrKQ0KCQkkcm93W10gPSBkb1RhZyhzdHJmdGltZSgnJWEnLCBta3RpbWUoMCwwLDAsJG0sICgkZCs3LSRmaXJzdGRheSksICR5KSksICR0aCwgJycsICcgc2NvcGU9ImNvbCInKTsNCgkkb3V0W10gPSBkb1RhZyhuLnRyKG4uam9pbihuLCAkcm93KS5uKS5uLCAndGhlYWQnKTsNCg0KCSRib2R5ID0gYXJyYXkoKTsNCg0KCSRudW1yb3dzID0gY2VpbCgoJG51bWRheXMgKyAkZmlyc3RkYXkpLzcpOw0KDQoJJGRheXMgPSBhcnJheSgpOw0KCSR3ID0gemVtX2V2ZW50X3RpbWVxKCIkeS0kbS0wMSIsICIkeS0kbS0kbnVtZGF5cyIpOw0KCSRycyA9IHNhZmVfcm93cygnemVtX2V2ZW50X2RhdGUuKicsICd6ZW1fZXZlbnRfY2FsZW5kYXIsemVtX2V2ZW50X2RhdGUsdGV4dHBhdHRlcm4nLCAnemVtX2V2ZW50X2NhbGVuZGFyLmlkPXplbV9ldmVudF9kYXRlLmV2ZW50X2lkIGFuZCB6ZW1fZXZlbnRfY2FsZW5kYXIuYXJ0aWNsZV9pZCA9IHRleHRwYXR0ZXJuLklEIGFuZCB0ZXh0cGF0dGVybi5TdGF0dXMgPj0gNCBhbmQgdGV4dHBhdHRlcm4uUG9zdGVkIDw9IG5vdygpJyk7DQoJZm9yZWFjaCAoJHJzIGFzICRyKSB7DQoJCSRkYXlzWyRyWydldmVudF9kYXRlJ11dID0gdHJ1ZTsNCgl9DQoNCgkjIGRpc3BsYXkgZWFjaCBjZWxsIGluIHRoZSBjYWxlbmRhciwgNyB4IDUgZ3JpZA0KCWZvciAoJHc9MDsgJHc8JG51bXJvd3M7ICR3KyspIHsNCgkJJGRheV9yb3cgPSBhcnJheSgpOw0KCQlmb3IgKCRkPTE7ICRkPD03OyAkZCsrKSB7DQoJCQkkZGF5bnVtID0gKCR3KjcpICsgJGQ7DQoJCQkkZGF5b2Ztb250aCA9ICRkYXludW0gLSAkZmlyc3RkYXk7DQoNCgkJCWlmIChjaGVja2RhdGUoJG0sICRkYXlvZm1vbnRoLCAkeSkpIHsNCgkJCQkvLyB0aGlzIGlzIGEgcmVhbCBkYXkNCgkJCQlpZiAoaXNzZXQoJGRheXNbIiR5LSRtLSRkYXlvZm1vbnRoIl0pKSB7DQoJCQkJCSR1cmwgPSAnPGEgY2xhc3M9IicuJGNsYXNzX2xpbmsuJyIgaHJlZj0iJy5wYWdlbGlua3VybChhcnJheSgNCgkJCQkJCSdkYXRlJyA9PiAiJHktJG0tJGRheW9mbW9udGgiLA0KCQkJCQkJJ3MnICAgID0+JHNlY3Rpb24sDQoJCQkJCQknYycgICAgPT5AJHByZXRleHRbJ2MnXSwNCgkJCQkJCSdxJyAgICA9PkAkcHJldGV4dFsncSddLA0KCQkJCQkpKS4nIj4nLiRkYXlvZm1vbnRoLic8L2E+JzsNCg0KCQkJCQkkZGF5X3Jvd1tdID0gZG9UYWcoJHVybCwgJHRkLCAkY2xhc3NfZXZlbnQpOw0KCQkJCX0NCgkJCQllbHNlIHsNCgkJCQkJJGRheV9yb3dbXSA9IGRvVGFnKCRkYXlvZm1vbnRoLCAkdGQsICRjbGFzc19lbXB0eSk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJLy8ganVzdCBhIGJsYW5rIHRvIGZpbGwgaW4gdGhlIGdyaWQNCgkJCQkkZGF5X3Jvd1tdID0gZG9UYWcoJyZuYnNwOycsICR0ZCwgJGNsYXNzX25vZGF5KTsNCgkJCX0NCg0KDQoJCX0NCgkJJGJvZHlbXSA9IGRvVGFnKG4uam9pbihuLCAkZGF5X3JvdykubiwgJHRyLCAkY2xhc3Nfcm93X2RheSk7DQoJfQ0KDQoJJG91dFtdID0gZG9UYWcobi5qb2luKG4sICRib2R5KS5uLCAndGJvZHknKTsNCg0KCXJldHVybiBkb1RhZyhuLmpvaW4obiwgJG91dCkubiwgJHRhYmxlLCAkY2xhc3MsICgkY2VsbHNwYWNpbmcgPT09ICcnID8gJycgOiAnIGNlbGxzcGFjaW5nPSInLiRjZWxsc3BhY2luZy4nIicpKTsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X3NlYXJjaF9pbnB1dCgkYXR0cykgew0KCWdsb2JhbCAkcHJldGV4dCwgJHplbV9ldmVudF9oYXNfanM7DQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ2NsYXNzJyA9PiBfX0ZVTkNUSU9OX18sDQoJCSdicmVhaycgPT4gJ2JyJywNCgkJJ3dyYXB0YWcnID0+ICdkaXYnLA0KCQknY2xhc3MnID0+IF9fRlVOQ1RJT05fXywNCgkJJ2JyZWFrY2xhc3MnID0+ICcnLA0KCQknc2VwJyA9PiAnJm5ic3A7JywNCgkJJ21ldGhvZCcgPT4gJ3Bvc3QnLA0KCQknc2VjdGlvbicgPT4gQCRwcmV0ZXh0WydzJ10sDQoJKSwgJGF0dHMpKTsNCg0KCSRvdXRbXSA9DQoJCSc8bGFiZWwgZm9yPSJkYXRlX2Zyb20iPkZyb206PC9sYWJlbD4nLiRzZXAuJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJkYXRlX2Zyb20iIGlkPSJkYXRlX2Zyb20iIGNsYXNzPSJ6ZW1fZGF0ZV9zZWxlY3QiIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoZ3BzKCdkYXRlX2Zyb20nKSkuJyIgLz4nOw0KCSRvdXRbXSA9DQoJCSc8bGFiZWwgZm9yPSJkYXRlX3RvIj5Ubzo8L2xhYmVsPicuJHNlcC4nPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRhdGVfdG8iIGlkPSJkYXRlX3RvIiBjbGFzcz0iemVtX2RhdGVfc2VsZWN0IiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKGdwcygnZGF0ZV90bycpKS4nIiAvPic7DQoNCgkkb3V0W10gPQ0KCQknPGxhYmVsIGZvcj0icSI+U2VhcmNoOjwvbGFiZWw+Jy4kc2VwLic8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InEiIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoZ3BzKCdxJykpLiciIC8+JzsNCg0KCSRjYXRzID0gZ2V0VHJlZSgncm9vdCcsICdldmVudCcpOw0KDQoJJGZzX2MgPSAnPGxlZ2VuZD5DYXRlZ29yeTwvbGVnZW5kPic7DQoJJGZzX2MgLj0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYWxsX2NhdGVnb3JpZXMiIGlkPSJhbGxfY2F0ZWdvcmllcyIgdmFsdWU9IjEiJy4oZ3BzKCdhbGxfY2F0ZWdvcmllcycpID8gJyBjaGVja2VkPSJjaGVja2VkIicgOiAnJykuJyAvPicuJHNlcA0KCQkuJzxsYWJlbCBmb3I9ImFsbF9jYXRlZ29yaWVzIj5BbGwgQ2F0ZWdvcmllczwvbGFiZWw+Jy5ici5uOw0KDQoJJGdwc19jID0gKGdwcygnYycpID8gZ3BzKCdjJykgOiBhcnJheSgpKTsNCg0KCWZvcmVhY2ggKCRjYXRzIGFzICRjKQ0KCQkkZnNfYyAuPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjWycuJGNbJ25hbWUnXS4nXSIgaWQ9ImNbJy4kY1snbmFtZSddLiddIiB2YWx1ZT0iJy4kY1snbmFtZSddLiciJy4oaW5fYXJyYXkoJGNbJ25hbWUnXSwgJGdwc19jKSA/ICcgY2hlY2tlZD0iY2hlY2tlZCInIDogJycpLicgLz4nLiRzZXAuDQoJCQknPGxhYmVsIGZvcj0iY1snLiRjWyduYW1lJ10uJ10iPicuaHRtbHNwZWNpYWxjaGFycygkY1sndGl0bGUnXSkuJzwvbGFiZWw+Jy5ici5uOw0KDQoJJG91dFtdID0gJzxmaWVsZHNldCBpZD0iY2F0ZWdvcnkiPicuJGZzX2MuJzwvZmllbGRzZXQ+JzsNCg0KCSRsb2NzID0gc2FmZV9jb2x1bW4oJ2Rpc3RpbmN0IGxvY2F0aW9uIGFzIGwnLCAnemVtX2V2ZW50X2NhbGVuZGFyJywgJzE9MSBvcmRlciBieSBsb2NhdGlvbiBhc2MnKTsNCg0KCSRmc19sID0gJzxsZWdlbmQ+TG9jYXRpb248L2xlZ2VuZD4nOw0KCSRmc19sIC49ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImFsbF9sb2NhdGlvbnMiIGlkPSJhbGxfbG9jYXRpb25zIiB2YWx1ZT0iMSInLihncHMoJ2FsbF9sb2NhdGlvbnMnKSA/ICcgY2hlY2tlZD0iY2hlY2tlZCInIDogJycpLicgLz4nLiRzZXANCgkJLic8bGFiZWwgZm9yPSJhbGxfbG9jYXRpb25zIj5BbGwgTG9jYXRpb25zPC9sYWJlbD4nLmJyLm47DQoNCgkkZ3BzX2wgPSAoZ3BzKCdsb2NhdGlvbicpID8gZ3BzKCdsb2NhdGlvbicpIDogYXJyYXkoKSk7DQoNCglmb3JlYWNoICgkbG9jcyBhcyAkbCkNCgkJJGZzX2wgLj0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibG9jYXRpb25bJy4kbC4nXSIgaWQ9ImxvY2F0aW9uWycuJGwuJ10iIHZhbHVlPSInLiRsLiciJy4oaW5fYXJyYXkoJGwsICRncHNfbCkgPyAnIGNoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnKS4nIC8+Jy4kc2VwLg0KCQkJJzxsYWJlbCBmb3I9ImxvY2F0aW9uWycuJGwuJ10iPicuaHRtbHNwZWNpYWxjaGFycygkbCkuJzwvbGFiZWw+Jy5ici5uOw0KDQoJJG91dFtdID0gJzxmaWVsZHNldCBpZD0ibG9jYXRpb24iPicuJGZzX2wuJzwvZmllbGRzZXQ+JzsNCg0KCSRvdXRbXSA9ICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzZWFyY2giIHZhbHVlPSJTZWFyY2giIC8+JzsNCg0KCSRqcyA9ICcnOw0KCWlmICgkemVtX2V2ZW50X2hhc19qcykgew0KCQlpZiAoemVtX2V2ZW50X2RhdGVfZm9ybWF0KCkgPT0gJ01NL2RkL3l5eXknKSB7DQoJCQkkZm9ybWF0ID0gJ21keSc7DQoJCQkkZHMgPSAnLyc7DQoJCX0NCgkJZWxzZSB7DQoJCQkkZm9ybWF0ID0gJ3ltZCc7DQoJCQkkZHMgPSAnLSc7DQoJCX0NCg0KCQkkanMgPSBzY3JpcHRfanMoDQoJCSckLmRhdGVQaWNrZXIuc2V0RGF0ZUZvcm1hdChcJycuJGZvcm1hdC4nXCcsXCcnLiRkcy4nXCcpOw0KCSQoXCdpbnB1dC56ZW1fZGF0ZV9zZWxlY3RcJykuZGF0ZVBpY2tlcigpOycNCgkJKTsNCgl9DQoNCg0KCSR1cmwgPSBwYWdlbGlua3VybChhcnJheSgncyc9PiRzZWN0aW9uKSk7DQoJcmV0dXJuICc8Zm9ybSBhY3Rpb249IicuJHVybC4nIiBtZXRob2Q9InBvc3QiPicuZG9XcmFwKCRvdXQsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpLic8L2Zvcm0+Jy5uLiRqczsNCn0NCg0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfaGVhZF9qcygkYXR0cykgew0KCWdsb2JhbCAkemVtX2V2ZW50X2hhc19qczsNCg0KCSR6ZW1fZXZlbnRfaGFzX2pzID0gdHJ1ZTsNCg0KCSRvdXQgPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy56ZW1fZmlsZV91cmwoJ2RhdGVQaWNrZXIuY3NzJykuJyIgLz4nLm47DQoNCgkkb3V0IC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLmh1Lid0ZXh0cGF0dGVybi9qcy9qcXVlcnkuanMiPjwvc2NyaXB0PicubjsNCgkkb3V0IC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLmh1Lid0ZXh0cGF0dGVybi9qcy9kYXRlUGlja2VyLmpzIj48L3NjcmlwdD4nLm47DQoNCglyZXR1cm4gJG91dDsNCn0NCg0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfcGFnaW5hdGUoJGxpbSwgJGdyYW5kX3RvdGFsLCAkb2Zmc2V0PTAsICRwYWdlYnk9MCkgew0KDQoJaWYgKCEkZ3JhbmRfdG90YWwpDQoJCXJldHVybiAnJzsNCg0KCSRsaW1pdCA9IChpbnR2YWwoJGxpbSkgPyBpbnR2YWwoJGxpbSkgOiBpbnR2YWwoJGdyYW5kX3RvdGFsKSk7DQoNCiAgICBpZiAoISRwYWdlYnkpDQoJICAgICRwYWdlYnkgPSAkbGltaXQ7DQogICAgJHBnID0gZ3BzKCdwZycpOw0KDQogICAgJHRvdGFsID0gJGdyYW5kX3RvdGFsIC0gJG9mZnNldDsNCiAgICAkbnVtUGFnZXMgPSBpbnR2YWwoY2VpbCgkdG90YWwvJHBhZ2VieSkpOw0KICAgICRwZyA9ICghJHBnKSA/IDEgOiAkcGc7DQogICAgJHBnb2Zmc2V0ID0gJG9mZnNldCArICgoJHBnIC0gMSkgKiAkcGFnZWJ5KTsNCiAgICAvLyBzZW5kIHBhZ2luZyBpbmZvIHRvIHR4cDpuZXdlciBhbmQgdHhwOm9sZGVyDQogICAgJHBhZ2VvdXRbJ3BnJ10gICAgICAgPSAkcGc7DQogICAgJHBhZ2VvdXRbJ251bVBhZ2VzJ10gPSAkbnVtUGFnZXM7DQogICAgJHBhZ2VvdXRbJ2dyYW5kX3RvdGFsJ10gPSAkZ3JhbmRfdG90YWw7DQogICAgJHBhZ2VvdXRbJ3RvdGFsJ10gICAgPSAkdG90YWw7DQoNCglnbG9iYWwgJHRoaXNwYWdlOw0KCWlmIChlbXB0eSgkdGhpc3BhZ2UpKQ0KCQkkdGhpc3BhZ2UgPSAkcGFnZW91dDsNCg0KCWlmICgkbGltKQ0KCQlyZXR1cm4gJyBsaW1pdCAnLmludHZhbCgkcGdvZmZzZXQpLicsJy5pbnR2YWwoJGxpbSk7DQoNCglyZXR1cm4gJyc7DQp9DQoNCg0KLy8gLS0tLSBhZG1pbiBzaWRlDQoNCmZ1bmN0aW9uIHplbV90b2dnbGVfZGlzcGxheSgkaWQsICRsaW5rdGV4dCwgJGJvZHksICRkaXNwbGF5PTApIHsNCgkkc3R5bGUgPSAoJGRpc3BsYXkgPyAnZGlzcGxheTpibG9jazsnIDogJ2Rpc3BsYXk6bm9uZTsnKTsNCglyZXR1cm4NCgkJJzxoMyBjbGFzcz0icGxhaW4iPjxhIGhyZWY9IiMiIG9uY2xpY2s9InRvZ2dsZURpc3BsYXkoXCcnLiRpZC4nXCcpOyByZXR1cm4gZmFsc2U7Ij4nLmdUeHQoJGxpbmt0ZXh0KS4nPC9hPjwvaDM+Jy4NCgkJJzxkaXYgaWQ9IicuJGlkLiciIHN0eWxlPSInLiRzdHlsZS4nIj4nLiRib2R5Lic8L2Rpdj4nOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fdG9nZ2xlX2ZpZWxkc2V0KCRpZCwgJGxpbmt0ZXh0LCAkYm9keSwgJGRpc3BsYXk9MCkgew0KCSRzdHlsZSA9ICgkZGlzcGxheSA/ICdkaXNwbGF5OmJsb2NrOycgOiAnZGlzcGxheTpub25lOycpOw0KCSRzdHlsZV9uZWcgPSAoJGRpc3BsYXkgPyAnZGlzcGxheTpub25lOycgOiAnZGlzcGxheTpibG9jazsnKTsNCgkkbGluayA9ICc8YSBocmVmPSIjIiBvbmNsaWNrPSJ0b2dnbGVEaXNwbGF5KFwnJy4kaWQuJ1wnKTsgdG9nZ2xlRGlzcGxheShcJycuJGlkLidfbmVnXCcpOyByZXR1cm4gZmFsc2U7Ij4nLmdUeHQoJGxpbmt0ZXh0KS4nPC9hPic7DQoNCglyZXR1cm4NCgkJJzxwIGlkPSInLiRpZC4nX25lZyIgc3R5bGU9IicuJHN0eWxlX25lZy4nIj4nLiRsaW5rLic8L3A+Jy5uLg0KCQknPGZpZWxkc2V0IGlkPSInLiRpZC4nIiBzdHlsZT0iJy4kc3R5bGUuJyI+Jy5uLg0KCQknPGxlZ2VuZD4nLiRsaW5rLic8L2xlZ2VuZD4nLm4uDQoJCSRib2R5Lm4uDQoJCSc8L2ZpZWxkc2V0Pic7DQp9DQoNCg0KZnVuY3Rpb24gemVtX2V2ZW50X2RhdGVfZm9ybWF0KCkgew0KCS8vIHdvcmsgb3V0IGlmIHRoZSBsb2NhbGUncyBwcmVmZXJyZWQgZGF0ZSBmb3JtYXQgaXMgbS9kL3kgb3Igc29tZXRoaW5nIGVsc2UNCgkkZCA9IHN0cmZ0aW1lKCcleCcsIG1rdGltZSgwLDAsMCwxLDIsMjAwMCkpOw0KCWlmICgkZCA9PSAnMDEvMDIvMjAwMCcpIHJldHVybiAnTU0vZGQveXl5eSc7DQoJcmV0dXJuICd5eXl5LU1NLWRkJzsNCn0NCg0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfY2F0X3RhYigkZXZlbnQsICRzdGVwKSB7DQoJc3dpdGNoICgkc3RlcCkgew0KCQljYXNlICdjcmVhdGUnOg0KCQkJemVtX2V2ZW50X2NhdF90YWJfY3JlYXRlKCk7DQoJCWJyZWFrOw0KDQoJCWNhc2UgJ2VkaXQnOg0KCQkJemVtX2V2ZW50X2NhdF90YWJfZWRpdCgpOw0KCQlicmVhazsNCg0KCQljYXNlICdzYXZlJzoNCgkJCXplbV9ldmVudF9jYXRfdGFiX3NhdmUoKTsNCgkJYnJlYWs7DQoNCgkJY2FzZSAnbXVsdGknOg0KCQkJemVtX2V2ZW50X2NhdF90YWJfbXVsdGllZGl0KCk7DQoJCWJyZWFrOw0KDQoJCWNhc2UgJ2xpc3QnOg0KCQlkZWZhdWx0Og0KCQkJemVtX2V2ZW50X2NhdF90YWJfbGlzdCgpOw0KCQlicmVhazsNCgl9DQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9jYXRfdGFiX2xpc3QoJG1lc3NhZ2UgPSAnJykgew0KCXBhZ2V0b3AoemVtX2V2ZW50X2dUeHQoJ2V2ZW50X2NhdGVnb3JpZXMnKSwgJG1lc3NhZ2UpOw0KDQoJZWNobyBuLm4uJzx0YWJsZSBjZWxsc3BhY2luZz0iMjAiIGFsaWduPSJjZW50ZXIiPicuDQoJCW4uJzx0cj4nLg0KCQluLnQuJzx0ZCBzdHlsZT0icGFkZGluZzogOHB4OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyIgY2xhc3M9ImNhdGVnb3JpZXMiPicuDQoNCgkJbi5uLmhlZCh6ZW1fZXZlbnRfZ1R4dCgnZXZlbnRfY2F0ZWdvcmllcycpLCAzKS4NCg0KCQluLmZvcm0oDQoJCQlmSW5wdXQoJ3RleHQnLCAndGl0bGUnLCAnJywgJ2VkaXQnLCAnJywgJycsIDIwKS4NCgkJCWZJbnB1dCgnc3VibWl0JywgJycsIGdUeHQoJ0NyZWF0ZScpLCAnc21hbGxlcmJveCcpLg0KCQkJZUlucHV0KCd6ZW1fZXZlbnRfY2F0cycpLg0KCQkJc0lucHV0KCdjcmVhdGUnKQ0KCQkpOw0KDQoJCSRycyA9IGdldFRyZWUoJ3Jvb3QnLCAnZXZlbnQnKTsNCg0KCQlpZiAoJHJzKQ0KCQl7DQoJCQkkaXRlbXMgPSBhcnJheSgpOw0KDQoJCQlmb3JlYWNoICgkcnMgYXMgJGEpDQoJCQl7DQoJCQkJZXh0cmFjdCgkYSk7DQoNCgkJCQkkaXRlbXNbXSA9IGdyYWYoDQoJCQkJCWNoZWNrYm94KCdzZWxlY3RlZFtdJywgJGlkLCAwKS5zcC5zdHJfcmVwZWF0KHNwLnNwLCAkbGV2ZWwgKiAyKS4NCgkJCQkJZUxpbmsoJ3plbV9ldmVudF9jYXRzJywgJ2VkaXQnLCAnaWQnLCAkaWQsICR0aXRsZSkNCgkJCQkpOw0KCQkJfQ0KDQoJCQlpZiAoJGl0ZW1zKQ0KCQkJew0KCQkJCXplbV9ldmVudF9jYXRfdGFiX211bHRpZWRpdF9mb3JtKCRpdGVtcyk7DQoJCQl9DQoJCX0NCg0KCQllbHNlDQoJCXsNCgkJCWVjaG8gbi5ncmFmKGdUeHQoJ25vX2NhdGVnb3JpZXNfZXhpc3QnKSk7DQoJCX0NCg0KCWVjaG8gbi50Lic8L3RkPicuDQoJCW4uJzwvdHI+Jy4NCgkJbi5lbmRUYWJsZSgpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfY2F0X3RhYl9jcmVhdGUoKSB7DQoJJHRpdGxlID0gcHMoJ3RpdGxlJyk7DQoNCgkkbmFtZSA9IHNhbml0aXplRm9yVXJsKCR0aXRsZSk7DQoNCgkkbmFtZV9zcWwgPSBkb1NsYXNoKCRuYW1lKTsNCg0KCWlmICghJG5hbWUpIHsNCgkJJG1lc3NhZ2UgPSB6ZW1fZXZlbnRfZ1R4dCgnY2F0ZWdvcnlfaW52YWxpZCcsIGFycmF5KCd7bmFtZX0nID0+ICRuYW1lKSk7DQoNCgkJcmV0dXJuIHplbV9ldmVudF9jYXRfdGFiX2xpc3QoJG1lc3NhZ2UpOw0KCX0NCg0KCSRleGlzdHMgPSBzYWZlX2ZpZWxkKCduYW1lJywgJ3R4cF9jYXRlZ29yeScsICJuYW1lID0gJyRuYW1lX3NxbCcgYW5kIHR5cGUgPSAnZXZlbnQnIik7DQoNCglpZiAoJGV4aXN0cykgew0KCQkkbWVzc2FnZSA9IHplbV9ldmVudF9nVHh0KCdjYXRlZ29yeV9hbHJlYWR5X2V4aXN0cycsIGFycmF5KCd7bmFtZX0nID0+ICRuYW1lKSk7DQoNCgkJcmV0dXJuIHplbV9ldmVudF9jYXRfdGFiX2xpc3QoJG1lc3NhZ2UpOw0KCX0NCg0KCSRxID0gc2FmZV9pbnNlcnQoJ3R4cF9jYXRlZ29yeScsICJwYXJlbnQgPSAncm9vdCcsIHR5cGUgPSAnZXZlbnQnLCBuYW1lID0gJyRuYW1lX3NxbCcsIHRpdGxlID0gJyIuZG9TbGFzaCgkdGl0bGUpLiInIik7DQoNCglpZiAoJHEpIHsNCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygncmVidWlsZF90cmVlX2Z1bGwnKSkgew0KCQkJcmVidWlsZF90cmVlX2Z1bGwoJ2V2ZW50Jyk7DQoJCX0gZWxzZSB7DQoJCQlyZWJ1aWxkX3RyZWUoJ3Jvb3QnLCAxLCAnZXZlbnQnKTsNCgkJfQ0KDQoJCSRtZXNzYWdlID0gemVtX2V2ZW50X2dUeHQoJ2NhdGVnb3J5X2NyZWF0ZWQnLCBhcnJheSgne25hbWV9JyA9PiAkbmFtZSkpOw0KDQoJCXplbV9ldmVudF9jYXRfdGFiX2xpc3QoJG1lc3NhZ2UpOw0KCX0NCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2NhdF90YWJfZWRpdCgpIHsNCglwYWdldG9wKGdUeHQoJ2NhdGVnb3JpZXMnKSk7DQoNCgkkaWQgICAgID0gYXNzZXJ0X2ludChncHMoJ2lkJykpOw0KCSRwYXJlbnQgPSBkb1NsYXNoKGdwcygncGFyZW50JykpOw0KDQoJJHJvdyA9IHNhZmVfcm93KCcqJywgJ3R4cF9jYXRlZ29yeScsICJpZCA9ICRpZCIpOw0KDQoJaWYgKCRyb3cpIHsNCgkJZXh0cmFjdCgkcm93KTsNCg0KCQkkb3V0ID0gc3RhY2tSb3dzKA0KCQkJZkxhYmVsQ2VsbCh6ZW1fZXZlbnRfZ1R4dCgnY2F0ZWdvcnlfbmFtZScpKS4NCgkJCWZJbnB1dENlbGwoJ25hbWUnLCAkbmFtZSwgMSwgMjApLA0KDQoJCQlmTGFiZWxDZWxsKCdwYXJlbnQnKS4NCgkJCXRkKHplbV9ldmVudF9jYXRfcGFyZW50X3BvcCgkcGFyZW50LCAnZXZlbnQnLCAkaWQpKSwNCg0KCQkJZkxhYmVsQ2VsbCh6ZW1fZXZlbnRfZ1R4dCgnY2F0ZWdvcnlfdGl0bGUnKSkuDQoJCQlmSW5wdXRDZWxsKCd0aXRsZScsICR0aXRsZSwgMSwgMzApLA0KCQkJaElucHV0KCdpZCcsICRpZCksDQoNCgkJCXRkY3MoZklucHV0KCdzdWJtaXQnLCAnJywgZ1R4dCgnc2F2ZV9idXR0b24nKSwgJ3NtYWxsZXJib3gnKSwgMikNCgkJKTsNCgl9DQoNCgllY2hvIGZvcm0oDQoJCXN0YXJ0VGFibGUoJ2VkaXQnKS4NCgkJJG91dC4NCgkJZUlucHV0KCd6ZW1fZXZlbnRfY2F0cycpLg0KCQlzSW5wdXQoJ3NhdmUnICkuDQoJCWhJbnB1dCgnb2xkX25hbWUnLCAkbmFtZSkuDQoJCWVuZFRhYmxlKCkNCgkpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfY2F0X3RhYl9zYXZlKCkgew0KCWdsb2JhbCAkdHhwY2ZnOw0KDQoJZXh0cmFjdChkb1NsYXNoKHBzYShhcnJheSgnaWQnLCAnbmFtZScsICdvbGRfbmFtZScsICdwYXJlbnQnLCAndGl0bGUnKSkpKTsNCg0KCSRpZCA9IGFzc2VydF9pbnQoJGlkKTsNCg0KCSRuYW1lID0gc2FuaXRpemVGb3JVcmwoJG5hbWUpOw0KDQoJLy8gbWFrZSBzdXJlIHRoZSBuYW1lIGlzIHZhbGlkDQoJaWYgKCEkbmFtZSkgew0KCQkkbWVzc2FnZSA9IHplbV9ldmVudF9nVHh0KCdjYXRlZ29yeV9pbnZhbGlkJywgYXJyYXkoJ3tuYW1lfScgPT4gJG5hbWUpKTsNCg0KCQlyZXR1cm4gemVtX2V2ZW50X2NhdF90YWJfbGlzdCgkbWVzc2FnZSk7DQoJfQ0KDQoJLy8gZG9uJ3QgYWxsb3cgcmVuYW1lIHRvIGNsb2JiZXIgYW4gZXhpc3RpbmcgY2F0ZWdvcnkNCgkkZXhpc3RpbmdfaWQgPSBzYWZlX2ZpZWxkKCdpZCcsICd0eHBfY2F0ZWdvcnknLCAidHlwZSA9ICdldmVudCcgYW5kIG5hbWUgPSAnJG5hbWUnIik7DQoNCglpZiAoJGV4aXN0aW5nX2lkIGFuZCAkZXhpc3RpbmdfaWQgIT0gJGlkKSB7DQoJCSRtZXNzYWdlID0gemVtX2V2ZW50X2dUeHQoJ2NhdGVnb3J5X2FscmVhZHlfZXhpc3RzJywgYXJyYXkoJ3tuYW1lfScgPT4gJG5hbWUpKTsNCg0KCQlyZXR1cm4gemVtX2V2ZW50X2NhdF90YWJfbGlzdCgkbWVzc2FnZSk7DQoJfQ0KDQoJJHBhcmVudCA9ICgkcGFyZW50KSA/ICRwYXJlbnQgOiAncm9vdCc7DQoNCglpZiAoc2FmZV91cGRhdGUoJ3R4cF9jYXRlZ29yeScsICJwYXJlbnQgPSAnJHBhcmVudCcsIG5hbWUgPSAnJG5hbWUnLCB0aXRsZSA9ICckdGl0bGUnIiwgImlkID0gJGlkIikpIHsNCgkJc2FmZV91cGRhdGUoJ3R4cF9jYXRlZ29yeScsICJwYXJlbnQgPSAnJG5hbWUnIiwgInBhcmVudCA9ICckb2xkX25hbWUnIik7DQoJfQ0KDQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygncmVidWlsZF90cmVlX2Z1bGwnKSkgew0KCQlyZWJ1aWxkX3RyZWVfZnVsbCgnZXZlbnQnKTsNCgl9IGVsc2Ugew0KCQlyZWJ1aWxkX3RyZWUoJ3Jvb3QnLCAxLCAnZXZlbnQnKTsNCgl9DQoNCgkkbWVzc2FnZSA9IHplbV9ldmVudF9nVHh0KCdjYXRlZ29yeV91cGRhdGVkJywgYXJyYXkoJ3tuYW1lfScgPT4gZG9TdHJpcCgkbmFtZSkpKTsNCg0KCXplbV9ldmVudF9jYXRfdGFiX2xpc3QoJG1lc3NhZ2UpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfY2F0X3RhYl9tdWx0aWVkaXQoKSB7DQoJJG1ldGhvZCA9IHBzKCdlZGl0X21ldGhvZCcpOw0KCSR0aGluZ3MgPSBwcygnc2VsZWN0ZWQnKTsNCg0KCWlmICgkdGhpbmdzKSB7DQoJCWZvcmVhY2ggKCR0aGluZ3MgYXMgJGNhdGlkKSB7DQoJCQkkY2F0aWQgPSBhc3NlcnRfaW50KCRjYXRpZCk7DQoNCgkJCWlmICgkbWV0aG9kID09ICdkZWxldGUnKSB7DQoJCQkJJGNhdG5hbWUgPSBzYWZlX2ZpZWxkKCduYW1lJywgJ3R4cF9jYXRlZ29yeScsICJpZCA9ICRjYXRpZCIpOw0KDQoJCQkJaWYgKHNhZmVfZGVsZXRlKCd0eHBfY2F0ZWdvcnknLCAiaWQgPSAkY2F0aWQiKSkgew0KCQkJCQlpZiAoJGNhdG5hbWUpIHsNCgkJCQkJCXNhZmVfdXBkYXRlKCd0eHBfY2F0ZWdvcnknLCAicGFyZW50ID0gJ3Jvb3QnIiwgInR5cGUgPSAnZXZlbnQnIGFuZCBwYXJlbnQgPSAnIi5kb1NsYXNoKCRjYXRuYW1lKS4iJyIpOw0KCQkJCQl9DQoNCgkJCQkJJGNhdGVnb3JpZXNbXSA9ICRjYXRpZDsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdyZWJ1aWxkX3RyZWVfZnVsbCcpKSB7DQoJCQlyZWJ1aWxkX3RyZWVfZnVsbCgnZXZlbnQnKTsNCgkJfSBlbHNlIHsNCgkJCXJlYnVpbGRfdHJlZSgncm9vdCcsIDEsICdldmVudCcpOw0KCQl9DQoNCgkJJG1lc3NhZ2UgPSB6ZW1fZXZlbnRfZ1R4dCgnY2F0ZWdvcmllc19kZWxldGVkJywgYXJyYXkoJ3tsaXN0fScgPT4gam9pbignLCAnLCAkY2F0ZWdvcmllcykpKTsNCg0KCQl6ZW1fZXZlbnRfY2F0X3RhYl9saXN0KCRtZXNzYWdlKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9jYXRfcGFyZW50X3BvcCgkbmFtZSwgJHR5cGUsICRpZCkgew0KCWlmICgkaWQpIHsNCgkJJGlkID0gYXNzZXJ0X2ludCgkaWQpOw0KCQlsaXN0KCRsZnQsICRyZ3QpID0gYXJyYXlfdmFsdWVzKHNhZmVfcm93KCdsZnQsIHJndCcsICd0eHBfY2F0ZWdvcnknLCAnaWQgPSAnLiRpZCkpOw0KDQoJCSRycyA9IGdldFRyZWUoJ3Jvb3QnLCAkdHlwZSwgImxmdCBub3QgYmV0d2VlbiAkbGZ0IGFuZCAkcmd0Iik7DQoJfSBlbHNlIHsNCgkJJHJzID0gZ2V0VHJlZSgncm9vdCcsICR0eXBlKTsNCgl9DQoNCglpZiAoJHJzKSB7DQoJCXJldHVybiB0cmVlU2VsZWN0SW5wdXQoJ3BhcmVudCcsICRycywgJG5hbWUpOw0KCX0NCg0KCXJldHVybiBnVHh0KCdub19vdGhlcl9jYXRlZ29yaWVzX2V4aXN0Jyk7DQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9jYXRfdGFiX211bHRpZWRpdF9mb3JtKCRpdGVtcykgew0KCSRtZXRob2RzID0gYXJyYXkoDQoJCSdkZWxldGUnID0+IGdUeHQoJ2RlbGV0ZScpDQoJKTsNCg0KCWVjaG8gbi5mb3JtKA0KCQlqb2luKCcnLCAkaXRlbXMpLg0KDQoJCW4uZUlucHV0KCd6ZW1fZXZlbnRfY2F0cycpLg0KCQluLnNJbnB1dCgnbXVsdGknKS4NCg0KCQlzbWFsbChnVHh0KCd3aXRoX3NlbGVjdGVkJykpLnNwLnNlbGVjdElucHV0KCdlZGl0X21ldGhvZCcsICRtZXRob2RzLCAnJywgMSkuc3AuDQoJCQlmSW5wdXQoJ3N1Ym1pdCcsICcnLCBnVHh0KCdnbycpLCAnc21hbGxlcmJveCcpDQoNCgksICdtYXJnaW4tdG9wOiAxZW0nLCAidmVyaWZ5KCciLmdUeHQoJ2FyZV95b3Vfc3VyZScpLiInKSIpOw0KfQ0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfZGF0ZXBpY2tlcl9jc3MoKSB7DQoNCgkkaWNvbiA9IHplbV9maWxlX3VybCgnemVtX2V2ZW50X2NhbC5naWYnKTsNCg0KCSRjc3MgPSA8PDxFT0YNCmlucHV0LnplbV9kYXRlX3NlbGVjdCB7DQoJbWFyZ2luLXJpZ2h0OiA1cHg7DQp9DQoNCi8qIERhdGUgcGlja2VyIHNwZWNpZmljIHN0eWxlcyBmb2xsb3cgKi8NCg0KYS5kYXRlLXBpY2tlciB7DQoJd2lkdGg6IDE2cHg7DQoJaGVpZ2h0OiAxNnB4Ow0KCWJvcmRlcjogbm9uZTsNCgljb2xvcjogI2ZmZjsNCglwYWRkaW5nOiAwOw0KCW1hcmdpbjogMDsNCglmbG9hdDogbGVmdDsNCglvdmVyZmxvdzogaGlkZGVuOw0KCWN1cnNvcjogcG9pbnRlcjsNCgliYWNrZ3JvdW5kOiB1cmwoeyRpY29ufSkgbm8tcmVwZWF0Ow0KfQ0KYS5kYXRlLXBpY2tlciBzcGFuIHsNCgltYXJnaW46IDAgMCAwIC0yMDAwcHg7DQp9DQpkaXYuZGF0ZS1waWNrZXItaG9sZGVyLCBkaXYuZGF0ZS1waWNrZXItaG9sZGVyICogew0KCW1hcmdpbjogMDsNCglwYWRkaW5nOiAwOw0KfQ0KZGl2LmRhdGUtcGlja2VyLWhvbGRlciB7DQoJcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KZGl2LmRhdGUtcGlja2VyLWhvbGRlciBpbnB1dCB7DQoJZmxvYXQ6IGxlZnQ7DQp9DQpkaXYucG9wdXAtY2FsZW5kYXIgew0KCWRpc3BsYXk6IG5vbmU7DQoJcG9zaXRpb246IGFic29sdXRlOw0KCXotaW5kZXg6IDI7DQoJdG9wOiAwOw0KCWxlZnQ6IC0xNnB4OyAvKiB2YWx1ZSBmb3IgSUUgKi8NCglwYWRkaW5nOiA0cHg7DQoJYm9yZGVyOiAycHggc29saWQgIzAwMDsNCgliYWNrZ3JvdW5kOiAjZmZmOw0KCWNvbG9yOiAjMDAwOw0KCW92ZXJmbG93OmhpZGRlbjsNCgl3aWR0aDogMTYzcHg7DQp9DQpodG1sPmJvZHkgZGl2LnBvcHVwLWNhbGVuZGFyIHsNCglsZWZ0OiA5OXB4OyAvKiB2YWx1ZSBmb3IgZGVjZW50IGJyb3dzZXJzICovDQp9DQpkaXYucG9wdXAtY2FsZW5kYXIgZGl2LmxpbmstY2xvc2Ugew0KCWZsb2F0OiByaWdodDsNCn0NCmRpdi5wb3B1cC1jYWxlbmRhciBkaXYubGluay1wcmV2IHsNCglmbG9hdDogbGVmdDsNCn0NCmRpdi5wb3B1cC1jYWxlbmRhciBoMyB7DQoJZm9udC1zaXplOiAxLjNlbTsNCgltYXJnaW46IDJweCAwIDVweCAzcHg7DQp9DQpkaXYucG9wdXAtY2FsZW5kYXIgZGl2LmxpbmstbmV4dCB7DQoJZmxvYXQ6IHJpZ2h0Ow0KfQ0KZGl2LnBvcHVwLWNhbGVuZGFyIGRpdiBhIHsNCglwYWRkaW5nOiAxcHggMnB4Ow0KCWNvbG9yOiAjMDAwOw0KfQ0KZGl2LnBvcHVwLWNhbGVuZGFyIGRpdiBhOmhvdmVyIHsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOw0KCWNvbG9yOiAjZmZmOw0KfQ0KZGl2LnBvcHVwLWNhbGVuZGFyIHRhYmxlIHsNCgltYXJnaW46IDA7DQp9DQoqIGh0bWwgZGl2LnBvcHVwLWNhbGVuZGFyIHRhYmxlIHsNCglkaXNwbGF5OiBpbmxpbmU7DQp9DQpkaXYucG9wdXAtY2FsZW5kYXIgdGFibGUgdGgsIGRpdi5wb3B1cC1jYWxlbmRhciB0YWJsZSB0ZCB7DQoJYmFja2dyb3VuZDogI2VlZTsNCgl3aWR0aDogMjFweDsNCgloZWlnaHQ6IDE3cHg7DQoJdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KZGl2LnBvcHVwLWNhbGVuZGFyIHRhYmxlIHRkLmluYWN0aXZlIHsNCgljb2xvcjogI2FhYTsNCglwYWRkaW5nOiAxcHggMCAwOw0KfQ0KZGl2LnBvcHVwLWNhbGVuZGFyIHRhYmxlIHRoLndlZWtlbmQsIGRpdi5wb3B1cC1jYWxlbmRhciB0YWJsZSB0ZC53ZWVrZW5kIHsNCgliYWNrZ3JvdW5kOiAjZjZmNmY2Ow0KfQ0KZGl2LnBvcHVwLWNhbGVuZGFyIHRhYmxlIHRkIGEgew0KCWRpc3BsYXk6IGJsb2NrOw0KCWJvcmRlcjogMXB4IHNvbGlkICNlZWU7DQoJd2lkdGg6IDE5cHg7DQoJaGVpZ2h0OiAxNXB4Ow0KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCgljb2xvcjogIzMzMzsNCn0NCmRpdi5wb3B1cC1jYWxlbmRhciB0YWJsZSB0ZC50b2RheSBhIHsNCglib3JkZXItY29sb3I6ICNhYWE7DQp9DQpkaXYucG9wdXAtY2FsZW5kYXIgdGFibGUgdGQgYS5zZWxlY3RlZCwgZGl2LnBvcHVwLWNhbGVuZGFyIHRhYmxlIHRkIGE6aG92ZXIgew0KCWJhY2tncm91bmQ6ICMzMzM7DQoJY29sb3I6ICNmZmY7DQp9DQpFT0Y7DQoNCglyZXR1cm4gJGNzczsNCn0NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgew0KDQoJJGFydGljbGVfaWQgPSBncHMoJ0lEJykgPyBncHMoJ0lEJykgOiBAJEdMT0JBTFNbJ0lEJ107DQoNCglpZiAoJGFydGljbGVfaWQgYW5kIChncHMoJ3NhdmUnKSBvciBncHMoJ3B1Ymxpc2gnKSkpIHsNCgkJaWYgKHBzKCd6ZW1fZXZlbnRfZGF0ZScpKSB7DQoJCQkvLyBpbnNlcnQgb3IgdXBkYXRlDQoJCQkkdGltZSA9IHBzKCd6ZW1fZXZlbnRfdGltZScpID8gcHMoJ3plbV9ldmVudF90aW1lJykgOiBOVUxMOw0KCQkJJGZpbmlzaF9kYXRlID0gcHMoJ3plbV9maW5pc2hfZGF0ZScpID8gcHMoJ3plbV9maW5pc2hfZGF0ZScpIDogTlVMTDsNCgkJCSRmaW5pc2hfdGltZSA9IHBzKCd6ZW1fZmluaXNoX3RpbWUnKSA/IHBzKCd6ZW1fZmluaXNoX3RpbWUnKSA6IE5VTEw7DQoJCQkkbG9jYXRpb24gPSBwcygnemVtX2V2ZW50X2xvY2F0aW9uJyk7DQoJCQkkbG9jYXRpb25fdXJsID0gcHMoJ3plbV9ldmVudF9sb2NhdGlvbl91cmwnKTsNCgkJCSRkZXNjcmlwdGlvbiA9IHBzKCd6ZW1fZXZlbnRfZGVzY3JpcHRpb24nKTsNCgkJCSRlbWFpbCA9IHBzKCd6ZW1fZXZlbnRfZW1haWwnKTsNCgkJCSR1cmwgPSBwcygnemVtX2V2ZW50X3VybCcpOw0KCQkJJG5hbWUgPSBwcygnemVtX2V2ZW50X25hbWUnKTsNCgkJCSRyZXBlYXRfbiA9IHBzKCd6ZW1fZXZlbnRfcmVwZWF0X24nKTsNCgkJCSRyZXBlYXRfcGVyaW9kID0gcHMoJ3plbV9ldmVudF9yZXBlYXRfcGVyaW9kJyk7DQoJCQkkcmVwZWF0X3RvID0gcHMoJ3plbV9ldmVudF9yZXBlYXRfdG8nKTsNCiAgICAgICAgICAgICRhdXRvX2RlbGV0ZV9lbnRyeSA9IHBzKCd6ZW1fYXV0b19kZWxldGVfZW50cnknKSA/IHBzKCd6ZW1fYXV0b19kZWxldGVfZW50cnknKSA6IE5VTEw7DQogICAgICAgICAgICAkYXV0b19kZWxldGVfZXZlbnQgPSBwcygnemVtX2F1dG9fZGVsZXRlX2V2ZW50JykgPyBwcygnemVtX2F1dG9fZGVsZXRlX2V2ZW50JykgOiBOVUxMOw0KDQoJCQkvLyBzaW1wbGUgYXJyYXkgb2YgY2F0ZWdvcnkgaWRzDQoJCQkkY2F0ZWdvcmllcyA9IHBzKCd6ZW1fZXZlbnRfY2F0cycpOw0KDQoJCQkvLyB1c2UgYXJ0aWNsZSB0aXRsZSBhcyB0aGUgZGVmYXVsdCBuYW1lDQoJCQlpZiAoISRuYW1lKQ0KCQkJCSRuYW1lID0gcHMoJ1RpdGxlJyk7DQoNCgkJCSRpZCA9IHplbV9ldmVudF9zYXZlKCRhcnRpY2xlX2lkLCAkbmFtZSwgcHMoJ3plbV9ldmVudF9kYXRlJyksICR0aW1lLCAkZmluaXNoX2RhdGUsICRmaW5pc2hfdGltZSwgJGxvY2F0aW9uLCAkbG9jYXRpb25fdXJsLCAkdXJsLCAkZW1haWwsICRkZXNjcmlwdGlvbiwgJGNhdGVnb3JpZXMsICRyZXBlYXRfbiwgJHJlcGVhdF9wZXJpb2QsICRyZXBlYXRfdG8sJGF1dG9fZGVsZXRlX2VudHJ5LCRhdXRvX2RlbGV0ZV9ldmVudCk7DQoJCQlpZiAoISRpZCkNCgkJCQl0cmlnZ2VyX2Vycm9yKCdVbmFibGUgdG8gc2F2ZSBldmVudCcpOw0KCQl9DQoJCWVsc2Ugew0KCQkJLy8gZGVsZXRlDQoJCQl6ZW1fZXZlbnRfZGVsZXRlKCRhcnRpY2xlX2lkKTsNCgkJfQ0KCX0NCg0KCSRyb3cgPSBhcnJheSgpOw0KCWlmICgkYXJ0aWNsZV9pZCkNCgkJJHJvdyA9IHNhZmVfcm93KCcqJywgJ3plbV9ldmVudF9jYWxlbmRhcicsICJhcnRpY2xlX2lkPSciLmRvU2xhc2goJGFydGljbGVfaWQpLiInIGxpbWl0IDEiKTsNCg0KCWlmICh6ZW1fZXZlbnRfZGF0ZV9mb3JtYXQoKSA9PSAnTU0vZGQveXl5eScpDQoJCSRmb3JtYXQgPSAnJW0vJWQvJVknOw0KCWVsc2UNCgkJJGZvcm1hdCA9ICclWS0lbS0lZCc7DQoNCgkkZGF0ZSA9IEAkcm93WydldmVudF9kYXRlJ107DQoJaWYgKCRkYXRlKQ0KCQkkZGF0ZSA9IHN0cmZ0aW1lKCRmb3JtYXQsIHN0cnRvdGltZSgkZGF0ZSkpOw0KCSR0aW1lID0gQCRyb3dbJ2V2ZW50X3RpbWUnXTsNCglpZiAoJHRpbWUpDQoJCSR0aW1lID0gc3RyZnRpbWUoJyVIOiVNJywgc3RydG90aW1lKCR0aW1lKSk7DQoJJGZpbmlzaF9kYXRlID0gQCRyb3dbJ2ZpbmlzaF9kYXRlJ107DQoJaWYgKCRmaW5pc2hfZGF0ZSkNCgkJJGZpbmlzaF9kYXRlID0gc3RyZnRpbWUoJGZvcm1hdCwgc3RydG90aW1lKCRmaW5pc2hfZGF0ZSkpOw0KCSRmaW5pc2hfdGltZSA9IEAkcm93WydmaW5pc2hfdGltZSddOw0KCWlmICgkZmluaXNoX3RpbWUpDQoJCSRmaW5pc2hfdGltZSA9IHN0cmZ0aW1lKCclSDolTScsIHN0cnRvdGltZSgkZmluaXNoX3RpbWUpKTsNCgkkbmFtZSA9IEAkcm93WyduYW1lJ107DQoJJGRlc2NyaXB0aW9uID0gQCRyb3dbJ2Rlc2NyaXB0aW9uJ107DQoJJGxvY2F0aW9uID0gQCRyb3dbJ2xvY2F0aW9uJ107DQoJJGxvY2F0aW9uX3VybCA9IEAkcm93Wydsb2NhdGlvbl91cmwnXTsNCgkkdXJsID0gQCRyb3dbJ3VybCddOw0KCSRlbWFpbCA9IEAkcm93WydlbWFpbCddOw0KDQoJJHJlcGVhdF9uID0gQCRyb3dbJ3JlcGVhdF9uJ107DQoJJHJlcGVhdF9wZXJpb2QgPSBAJHJvd1sncmVwZWF0X3BlcmlvZCddOw0KCSRyZXBlYXRfdG8gPSBAJHJvd1sncmVwZWF0X3RvJ107DQoJaWYgKCRyZXBlYXRfdG8pDQoJCSRyZXBlYXRfdG8gPSBzdHJmdGltZSgkZm9ybWF0LCBzdHJ0b3RpbWUoJHJlcGVhdF90bykpOw0KCS8vYWRkIGRlbGV0ZSB2YXJpYWJsZXMNCiAgICAkYXV0b19kZWxldGVfZW50cnkgPSBAJHJvd1snYXV0b19kZWxldGVfZW50cnknXTsNCiAgICAkYXV0b19kZWxldGVfZXZlbnQgPSBAJHJvd1snYXV0b19kZWxldGVfZXZlbnQnXTsNCg0KCS8vIGJ1aWxkIGEgZHJvcGRvd24gb2YgbG9jYXRpb24gY2hvaWNlcw0KCSRhdmFpbGFibGVfbG9jYXRpb25zID0gemVtX2V2ZW50X2F2YWlsYWJsZV9sb2NhdGlvbnMoKTsNCg0KCS8vIGRvbid0IGZvcmdldCB0byBncmFiIGNhdGVnb3JpZXMgZnJvbSBkYg0KCS8vIHplbV9ldmVudF9jYXRfYm94ZXMoKSBleHBlY3RzIGEgc2ltcGxlIGFycmF5IG9mIGNhdGVnb3J5IGlkcw0KCS8vIGlmIHRoZXJlIGFyZSBub25lLCBhbiBlbXB0eSBzdHJpbmcgb3IgYXJyYXkgaXMgZmluZQ0KCSRjYXRlZ29yaWVzID0gYXJyYXkoKTsNCglpZiAoQCRyb3dbJ2lkJ10pDQoJCSRjYXRlZ29yaWVzID0gbTJtX2xpbmtzKCd6ZW1fZXZlbnRfY2F0ZWdvcnknLCAkcm93WydpZCddKTsNCg0KCSRkYXRlcyA9IGFycmF5KCk7DQoJaWYgKEAkcm93WydpZCddKQ0KCQkkZGF0ZXMgPSBzYWZlX2NvbHVtbignZXZlbnRfZGF0ZScsICd6ZW1fZXZlbnRfZGF0ZScsICJldmVudF9pZD0nIi5kb1NsYXNoKCRyb3dbJ2lkJ10pLiInIik7DQoNCg0KCSRmb3JtID0NCgkJc3RhcnRUYWJsZSgnJywgJycsICd6ZW1fZXZlbnQnLCA1LCAnMTAwJScpLg0KCQkJdHIoDQoJCQkJdGRhKA0KCQkJCQluLmdyYWYoJzxsYWJlbCBmb3I9InplbV9ldmVudF9uYW1lIj4nLnplbV9ldmVudF9nVHh0KCduYW1lX2xhYmVsJykuJzwvbGFiZWw+Jy5ici4NCgkJCQkJCWZJbnB1dCgndGV4dCcsICd6ZW1fZXZlbnRfbmFtZScsICRuYW1lLCAnZWRpdCcsICcnLCAnJywgNDAsICcnLCAnemVtX2V2ZW50X25hbWUnKSkuDQoNCgkJCQkJbi5ncmFmKCc8bGFiZWwgZm9yPSJ6ZW1fZXZlbnRfZGVzY3JpcHRpb24iPicuemVtX2V2ZW50X2dUeHQoJ2Rlc2NyaXB0aW9uX2xhYmVsJykuJzwvbGFiZWw+Jy5ici4NCgkJCQkJCXRleHRfYXJlYSgnemVtX2V2ZW50X2Rlc2NyaXB0aW9uJywgJzc1JywgJzM3NScsICRkZXNjcmlwdGlvbiwgJ3plbV9ldmVudF9kZXNjcmlwdGlvbicpKQ0KCQkJCSwgJyBjb2xzcGFuPSIyIicpDQoJCQkpLg0KDQoJCQl0cigNCgkJCQl0ZCgNCgkJCQkJbi5ncmFmKCc8bGFiZWwgZm9yPSJ6ZW1fZXZlbnRfZGF0ZSI+Jy56ZW1fZXZlbnRfZ1R4dCgnZGF0ZV9sYWJlbCcpLic8L2xhYmVsPicuYnIuDQoJCQkJCQlmSW5wdXQoJ3RleHQnLCAnemVtX2V2ZW50X2RhdGUnLCAkZGF0ZSwgJ3plbV9kYXRlX3NlbGVjdCcsICdZWVlZLU1NLUREJywgJycsIDI0LCAnJywgJ3plbV9ldmVudF9kYXRlJykpLg0KDQoJCQkJCW4uZ3JhZignPGxhYmVsIGZvcj0iemVtX2V2ZW50X3RpbWUiPicuemVtX2V2ZW50X2dUeHQoJ3RpbWVfbGFiZWwnKS4nPC9sYWJlbD4nLmJyLg0KCQkJCQkJZklucHV0KCd0ZXh0JywgJ3plbV9ldmVudF90aW1lJywgJHRpbWUsICdlZGl0JywgJ0hIOm1tJywgJycsIDI0LCAnJywgJ3plbV9ldmVudF90aW1lJyksICcgc3R5bGU9ImNsZWFyOmJvdGg7IicpDQoJCQkJKS4NCg0KCQkJCXRkKA0KCQkJCQluLmdyYWYoJzxsYWJlbCBmb3I9InplbV9maW5pc2hfZGF0ZSI+Jy56ZW1fZXZlbnRfZ1R4dCgnZmluaXNoX2RhdGVfbGFiZWwnKS4nPC9sYWJlbD4nLmJyLg0KCQkJCQkJZklucHV0KCd0ZXh0JywgJ3plbV9maW5pc2hfZGF0ZScsICRmaW5pc2hfZGF0ZSwgJ3plbV9kYXRlX3NlbGVjdCcsICdZWVlZLU1NLUREJywgJycsIDI0LCAnJywgJ3plbV9maW5pc2hfZGF0ZScpKS4NCg0KCQkJCQluLmdyYWYoJzxsYWJlbCBmb3I9InplbV9maW5pc2hfdGltZSI+Jy56ZW1fZXZlbnRfZ1R4dCgnZmluaXNoX3RpbWVfbGFiZWwnKS4nPC9sYWJlbD4nLmJyLg0KCQkJCQkJZklucHV0KCd0ZXh0JywgJ3plbV9maW5pc2hfdGltZScsICRmaW5pc2hfdGltZSwgJ2VkaXQnLCAnSEg6bW0nLCAnJywgMjQsICcnLCAnemVtX2ZpbmlzaF90aW1lJyksICcgc3R5bGU9ImNsZWFyOmJvdGg7IicpDQoJCQkJKQ0KCQkJKS4NCg0KCQkJdHIoDQoJCQkJdGQoDQoJCQkJCW4uZ3JhZignPGxhYmVsIGZvcj0iemVtX2V2ZW50X2xvY2F0aW9uIj4nLnplbV9ldmVudF9nVHh0KCdsb2NhdGlvbl9sYWJlbCcpLic8L2xhYmVsPicuYnIuDQoJCQkJCQkoJGF2YWlsYWJsZV9sb2NhdGlvbnMNCgkJCQkJCQk/IHNlbGVjdElucHV0KCd6ZW1fZXZlbnRfbG9jYXRpb24nLCAkYXZhaWxhYmxlX2xvY2F0aW9ucywgJGxvY2F0aW9uLCB0cnVlLCAnJywgJ3plbV9ldmVudF9sb2NhdGlvbicpDQoJCQkJCQkJOiBmSW5wdXQoJ3RleHQnLCAnemVtX2V2ZW50X2xvY2F0aW9uJywgJGxvY2F0aW9uLCAnZWRpdCcsICcnLCAyNCwgJycsICd6ZW1fZXZlbnRfbG9jYXRpb24nKQ0KCQkJCQkJKQ0KCQkJCQkpLg0KDQoJCQkJCW4uZ3JhZignPGxhYmVsIGZvcj0iemVtX2V2ZW50X2xvY2F0aW9uX3VybCI+Jy56ZW1fZXZlbnRfZ1R4dCgnbWFwX2xhYmVsJykuJzwvbGFiZWw+Jy5ici4NCgkJCQkJZklucHV0KCd0ZXh0JywgJ3plbV9ldmVudF9sb2NhdGlvbl91cmwnLCAkbG9jYXRpb25fdXJsLCAnZWRpdCcsICcnLCAnJywgMjQsICcnLCAnemVtX2V2ZW50X2xvY2F0aW9uX3VybCcpKQ0KCQkJCSkuDQoNCgkJCQl0ZCgNCgkJCQkJbi5ncmFmKCc8bGFiZWwgZm9yPSJ6ZW1fZXZlbnRfdXJsIj4nLnplbV9ldmVudF9nVHh0KCd1cmxfbGFiZWwnKS4nPC9sYWJlbD4nLmJyLg0KCQkJCQkJZklucHV0KCd0ZXh0JywgJ3plbV9ldmVudF91cmwnLCAkdXJsLCAnZWRpdCcsICcnLCAnJywgMjQsICcnLCAnemVtX2V2ZW50X3VybCcpKS4NCg0KCQkJCQluLmdyYWYoJzxsYWJlbCBmb3I9InplbV9ldmVudF9lbWFpbCI+Jy56ZW1fZXZlbnRfZ1R4dCgnZW1haWxfbGFiZWwnKS4nPC9sYWJlbD4nLmJyLg0KCQkJCQkJZklucHV0KCd0ZXh0JywgJ3plbV9ldmVudF9lbWFpbCcsICRlbWFpbCwgJ2VkaXQnLCAnJywgJycsIDI0LCAnJywgJ3plbV9ldmVudF9lbWFpbCcpKQ0KCQkJCSkNCgkJCSkuDQoNCgkJCXRyKA0KCQkJCXRkYSgNCgkJCQkJbi4nPGZpZWxkc2V0IGlkPSJ6ZW1fZXZlbnRfY2F0ZWdvcmllcyI+Jy4NCgkJCQkJJzxsZWdlbmQ+Jy56ZW1fZXZlbnRfZ1R4dCgnY2F0ZWdvcnlfbGFiZWwnKS4nIDxzcGFuIGNsYXNzPSJzbWFsbCI+WzxhIGhyZWY9ImluZGV4LnBocD9ldmVudD16ZW1fZXZlbnRfY2F0cyI+Jy5nVHh0KCdlZGl0JykuJzwvYT5dPC9zcGFuPjwvbGVnZW5kPicuDQoJCQkJCXplbV9ldmVudF9jYXRfYm94ZXMoJGNhdGVnb3JpZXMpLg0KCQkJCQknPC9maWVsZHNldD4nDQoJCQkJLCAnIGNvbHNwYW49IjIiJykNCgkJCSkuDQoNCgkJCXRyKA0KCQkJCXRkYSgNCgkJCQkJbi4nPGZpZWxkc2V0IGlkPSJ6ZW1fZXZlbnRfcmVjdXJyaW5nIj4nLg0KCQkJCQknPGxlZ2VuZD4nLnplbV9ldmVudF9nVHh0KCdyZWN1cnJpbmdfbGFiZWwnKS4nPC9sZWdlbmQ+Jy4NCg0KCQkJCQluLmdyYWYoDQoNCgkJCQkJCXplbV9ldmVudF9nVHh0KCdyZXBlYXRfbicpLmJyLg0KCQkJCQkJZklucHV0KCd0ZXh0JywgJ3plbV9ldmVudF9yZXBlYXRfbicsICRyZXBlYXRfbiwgJ2VkaXQnLCAnJywgJycsIDQsICcnLCAnemVtX2V2ZW50X3JlcGVhdF9uJykuc3AuDQoJCQkJCQlzZWxlY3RJbnB1dCgnemVtX2V2ZW50X3JlcGVhdF9wZXJpb2QnLCBhcnJheSgnZGF5Jz0+J0RheShzKScsJ3dlZWsnPT4nV2VlayhzKScsJ21vbnRoJz0+J01vbnRoKHMpJywneWVhcic9PidZZWFyKHMpJyksJHJlcGVhdF9wZXJpb2QsdHJ1ZSwnJywnemVtX2V2ZW50X3JlcGVhdF9wZXJpb2QnKS5ici4NCg0KCQkJCQkJemVtX2V2ZW50X2dUeHQoJ3JlcGVhdF90bycpLmZJbnB1dCgndGV4dCcsICd6ZW1fZXZlbnRfcmVwZWF0X3RvJywgJHJlcGVhdF90bywgJ3plbV9kYXRlX3NlbGVjdCcsICdZWVlZLU1NLUREJywgJycsIDI0LCAnJywgJ3plbV9ldmVudF9yZXBlYXRfdG8nKSkuDQoJCQkJCQkoJGRhdGVzID8gYnIuJ0RhdGVzOicuYnIuam9pbihici5uLCAkZGF0ZXMpIDogJycpLg0KDQoNCgkJCQkJJzwvZmllbGRzZXQ+Jw0KCQkJCSwgJyBjb2xzcGFuPSIyIicpDQoJCQkpLg0KCQkJDQoJCQl0cigNCgkJCQl0ZGEoDQoJCQkJCW4uJzxmaWVsZHNldCBpZD0iemVtX2F1dG9fZGVsZXRlIj4nLg0KCQkJCQknPGxlZ2VuZD4nLnplbV9ldmVudF9nVHh0KCdhdXRvX2RlbGV0aW9uJykuJzwvbGVnZW5kPicuDQoJCQkJCQljaGVja2JveDIoJ3plbV9hdXRvX2RlbGV0ZV9ldmVudCcsICRhdXRvX2RlbGV0ZV9ldmVudCwnJywnemVtX2F1dG9fZGVsZXRlX2V2ZW50JykuemVtX2V2ZW50X2dUeHQoJ19kZWxldGVfZXZlbnQnKS5ici4NCgkJCQkJCWNoZWNrYm94MignemVtX2F1dG9fZGVsZXRlX2VudHJ5JywgJGF1dG9fZGVsZXRlX2VudHJ5LCcnLCd6ZW1fYXV0b19kZWxldGVfZW50cnknKS56ZW1fZXZlbnRfZ1R4dCgnX2RlbGV0ZV9lbnRyeScpLg0KCQkJCQknPC9maWVsZHNldD4nDQoJCQkJLCAnIGNvbHNwYW49IjIiJykNCgkJCSkuDQoNCgkJCWVuZFRhYmxlKCk7DQoNCgkkaHRtbCA9IHplbV90b2dnbGVfZmllbGRzZXQoJ3plbV9ldmVudF9maWVsZHNldCcsIHplbV9ldmVudF9nVHh0KCdldmVudF9sYWJlbCcpLCAkZm9ybSwgIWVtcHR5KCRyb3cpKTsNCg0KDQoJaWYgKCFpc19maWxlKCRwYXRoID0gdHhwYXRoLicvanMvanF1ZXJ5LmpzJykpDQoJCXRyaWdnZXJfZXJyb3IoemVtX2V2ZW50X2dUeHQoJ21pc3NpbmdfZmlsZScsIGFycmF5KCd7cGF0aH0nID0+ICRwYXRoKSkpOw0KDQoJaWYgKCFpc19maWxlKCRwYXRoID0gdHhwYXRoLicvanMvZGF0ZVBpY2tlci5qcycpKQ0KCQl0cmlnZ2VyX2Vycm9yKHplbV9ldmVudF9nVHh0KCdtaXNzaW5nX2ZpbGUnLCBhcnJheSgne3BhdGh9JyA9PiAkcGF0aCkpKTsNCg0KCWVjaG8gc2NyaXB0X2pzKCdkb2N1bWVudC53cml0ZShcJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicuemVtX2ZpbGVfdXJsKCdkYXRlUGlja2VyLmNzcycpLiciIC8+XCcpOycpOw0KCWVjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuaHUuJ3RleHRwYXR0ZXJuL2pzL2pxdWVyeS5qcyI+PC9zY3JpcHQ+JzsNCgllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLmh1Lid0ZXh0cGF0dGVybi9qcy9kYXRlUGlja2VyLmpzIj48L3NjcmlwdD4nOw0KDQoJZWNobyBkb21fYXR0YWNoKCdhcnRpY2xlLW1haW4nLCAkaHRtbCkgOw0KCS8vIGFkZCBkYXRlUGlja2VyIHRvIGFsbCBpbnB1dCB0YWdzIHdpdGggY2xhc3MgemVtX2RhdGVfc2VsZWN0DQoNCglpZiAoemVtX2V2ZW50X2RhdGVfZm9ybWF0KCkgPT0gJ01NL2RkL3l5eXknKSB7DQoJCSRmb3JtYXQgPSAnbWR5JzsNCgkJJHNlcCA9ICcvJzsNCgl9DQoJZWxzZSB7DQoJCSRmb3JtYXQgPSAneW1kJzsNCgkJJHNlcCA9ICctJzsNCgl9DQoNCgllY2hvIHNjcmlwdF9qcygNCgknJC5kYXRlUGlja2VyLnNldERhdGVGb3JtYXQoXCcnLiRmb3JtYXQuJ1wnLFwnJy4kc2VwLidcJyk7DQokKFwnaW5wdXQuemVtX2RhdGVfc2VsZWN0XCcpLmRhdGVQaWNrZXIoKTsnDQoJKTsNCiMJZWNobyAkaHRtbDsNCn0NCg0KLyoNCgljcmVhdGUgYXJyYXkgb2YgYXZhaWxhYmxlIGxvY2F0aW9ucyBmcm9tIGZvcm0gY29udGVudHMNCglvbmUgbG9jYXRpb24gb24gZWFjaCBsaW5lDQoJbmFtZSBzZXBhcmF0ZWQgZnJvbSB0aXRsZSBieSBhbiBlcXVhbCBzaWduDQoqLw0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfYXZhaWxhYmxlX2xvY2F0aW9ucygpIHsNCg0KCSRmb3JtID0gQGZldGNoX2Zvcm0oJ3plbV9ldmVudF9sb2NhdGlvbnMnKTsNCg0KCS8vIHByZXBhcmUgZm9ybSBmb3IgdXNlDQoJJGZvcm0gPSBzdHJfcmVwbGFjZShhcnJheSgiXHJcbiIsICJcciIpLCAiXG4iLCAkZm9ybSk7DQoNCgkkbGlzdCA9IGV4cGxvZGUoIlxuIiwgJGZvcm0pOw0KDQoJJGF2YWlsYWJsZV9sb2NhdGlvbnMgPSBhcnJheSgpOw0KDQoJZm9yZWFjaCAoJGxpc3QgYXMgJGtleSA9PiAkdmFsKSB7DQoJCSRsb2NhdGlvbiA9IGV4cGxvZGUoJz0nLCAkdmFsKTsNCg0KCQkvLyBvbmx5IGFkZCB0byB0aGUgbGlzdCBpZiBib3RoIGEgbmFtZSBhbmQgdGl0bGUgd2VyZSBzdXBwbGllZA0KCQlpZiAoJGxvY2F0aW9uWzBdIGFuZCAkbG9jYXRpb25bMV0pIHsNCgkJCWxpc3QoJG5hbWUsICR0aXRsZSkgPSBkb0FycmF5KCRsb2NhdGlvbiwgJ3RyaW0nKTsNCg0KCQkJJGF2YWlsYWJsZV9sb2NhdGlvbnNbJG5hbWVdID0gJHRpdGxlOw0KCQl9DQoJfQ0KDQoJcmV0dXJuICRhdmFpbGFibGVfbG9jYXRpb25zOw0KfQ0KDQovKg0KCWNyZWF0ZSBhIGxpc3Qgb2YgY2F0ZWdvcnkgY2hlY2tib3hlcw0KKi8NCg0KZnVuY3Rpb24gemVtX2V2ZW50X2NhdF9ib3hlcygkY2F0ZWdvcmllcykgew0KDQoJaWYgKCFpc19hcnJheSgkY2F0ZWdvcmllcykpIHsNCgkJJGNhdGVnb3JpZXMgPSBhcnJheSgpOw0KCX0NCg0KCSRycyA9IGdldFRyZWUoJ3Jvb3QnLCAnZXZlbnQnKTsNCg0KCWlmICgkcnMpIHsNCgkJJG91dCA9IGFycmF5KCk7DQoNCgkJJGkgPSAwOw0KDQoJCWZvcmVhY2ggKCRycyBhcyAkYSkgew0KCQkJZXh0cmFjdCgkYSk7DQoNCgkJCSRpKys7DQoNCgkJCSRvdXRbXSA9IG4uZ3JhZigNCgkJCQlzdHJfcmVwZWF0KHNwLnNwLCAkbGV2ZWwgKiAyKS4NCgkJCQknPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iemVtX2V2ZW50X2NhdHNfJy4kaWQuJyIgY2xhc3M9ImNoZWNrYm94IiBuYW1lPSJ6ZW1fZXZlbnRfY2F0c1tdIiB2YWx1ZT0iJy4kaWQuJyInLg0KCQkJCShpbl9hcnJheSgkaWQsICRjYXRlZ29yaWVzKSA/ICcgY2hlY2tlZD0iY2hlY2tlZCInIDogJycpLg0KCQkJCScgLz4nLg0KCQkJCSc8bGFiZWwgZm9yPSJ6ZW1fZXZlbnRfY2F0c18nLiRpZC4nIj4nLmh0bWxzcGVjaWFsY2hhcnMoJHRpdGxlKS4nPC9sYWJlbD4nDQoJCQkpOw0KCQl9DQoNCgkJcmV0dXJuIGpvaW4oJycsICRvdXQpOw0KCX0gZWxzZSB7DQoJCXJldHVybiBnVHh0KCdub19jYXRlZ29yaWVzX2V4aXN0Jyk7DQoJfQ0KfQ0KDQovLyByZWxhdGlvbnNoaXAgdGFibGUgZnVuY3Rpb25zDQoNCiMgZmV0Y2ggdGhlIGxpbmtzIGF0dGFjaGVkIHRvIGEgcGFydGljdWxhciBpdGVtIChidXQgbm90IHRoZQ0KIyBsaW5rZWQgcm93cyB0aGVtc2VsdmVzKQ0KZnVuY3Rpb24gbTJtX2xpbmtzKCRydCwgJHYxKSB7DQoNCgkjIHVzZSBhcnJheV92YWx1ZXMoKSB0byByZWluZGV4IGZyb20gemVybw0KCXJldHVybiBhcnJheV92YWx1ZXMoc2FmZV9jb2x1bW4oJ2syJywgJHJ0LCAiazE9JyIuZG9TbGFzaCgkdjEpLiInIikpOw0KfQ0KDQpmdW5jdGlvbiBtMm1fbGlua2VkKCRydCwgJHYxLCAkbHQsICRrMj0naWQnKSB7DQoJcmV0dXJuIHNhZmVfcm93cygnKicsICRydC4nLCcuJGx0LCAieyRydH0uazE9JyIuZG9TbGFzaCgkdjEpLiInIGFuZCB7JHJ0fS5rMj17JGx0fS57JGsyfSIpOw0KfQ0KDQojIGFkZCBhIGxpbmsNCmZ1bmN0aW9uIG0ybV9hZGRfbGluaygkcnQsICR2MSwgJHYyKSB7DQoNCgkjIG5iIC0gdGhlcmUncyBhIHJhY2UgY29uZGl0aW9uIGhlcmUuDQoJIyBhdm9pZGluZyBpdCBwcm9iYWJseSBpc24ndCB3b3J0aCB0aGUgZXh0cmEgY29tcGxleGl0eS4NCglpZiAoIW0ybV9pc19saW5rZWQoJHJ0LCAkdjEsICR2MikpDQoJCXJldHVybiBzYWZlX2luc2VydCgkcnQsICJrMT0nIi5kb1NsYXNoKCR2MSkuIicsIGsyPSciLmRvU2xhc2goJHYyKS4iJyIpOw0KfQ0KDQojIGRlbGV0ZSBhIHNwZWNpZmljIGxpbmsNCmZ1bmN0aW9uIG0ybV9kZWxfbGluaygkcnQsICR2MSwgJHYyKSB7DQoNCglyZXR1cm4gc2FmZV9kZWxldGUoJHJ0LCAiazE9JyIuZG9TbGFzaCgkdjEpLiInIEFORCBrMj0nIi5kb1NsYXNoKCR2MikuIiciKTsNCn0NCg0KIyBjaGVjayB3aGV0aGVyIG9yIG5vdCB0d28gaXRlbXMgYXJlIGxpbmtlZA0KZnVuY3Rpb24gbTJtX2lzX2xpbmtlZCgkcnQsICR2MSwgJHYyKSB7DQoNCgkkYyA9IHNhZmVfY291bnQoJHJ0LCAiazE9JyIuZG9TbGFzaCgkdjEpLiInIEFORCBrMj0nIi5kb1NsYXNoKCR2MikuIicgbGltaXQgMSIpOw0KCXJldHVybiAkYzsNCn0NCg0KZnVuY3Rpb24gbTJtX3VwZGF0ZV9saW5rcygkcnQsICR2MSwgJHYybGlzdCkgew0KDQoJIyByZW1vdmUgYW55IGxpbmtzIHRoYXQgYXJlbid0IGluIHRoZSBuZXcgbGlzdA0KCSRsaW5rcyA9IG0ybV9saW5rcygkcnQsICR2MSk7DQoJaWYgKCRsaW5rcykgew0KCQlmb3JlYWNoICgkbGlua3MgYXMgJGlkKSB7DQoJCQlpZiAoIWluX2FycmF5KCRpZCwgJHYybGlzdCkpIHsNCgkJCQlpZiAoIW0ybV9kZWxfbGluaygkcnQsICR2MSwgJGlkKSkNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJIyBhZGQgbmV3IGxpbmtzIHRoYXQgd2VyZW4ndCBhbHJlYWR5IHRoZXJlDQoJZm9yZWFjaCAoJHYybGlzdCBhcyAkdjIpDQoJCWlmICghaW5fYXJyYXkoJHYyLCAkbGlua3MpKSB7DQoJCQlpZiAoIW0ybV9hZGRfbGluaygkcnQsICR2MSwgJHYyKSkNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCXJldHVybiB0cnVlOw0KfQ0KDQovLyBjYWxsYmFjayBldmVudCBoYW5kbGVycw0KDQpmdW5jdGlvbiB6ZW1fZXZlbnRfZmVlZF9lbnRyeSgkZXZlbnQsICRzdGVwKSB7DQoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsNCg0KCS8vIGFwcGVuZCB0aGUgZXZlbnQgaW5mbyB0byB0aGUgZXhjZXJwdCwgdXNpbmcgdGhlICd6ZW1fZXZlbnRfZGlzcGxheV9mZWVkJyBmb3JtDQoJJHRoaXNhcnRpY2xlWydleGNlcnB0J10gLj0gbi56ZW1fYXJ0aWNsZV9ldmVudChhcnJheSgnZm9ybScgPT4gJ3plbV9ldmVudF9kaXNwbGF5X2ZlZWQnKSk7DQp9DQoNCmZ1bmN0aW9uIHplbV9maWxlX3NlcnZlKCRkYXRhLCAkY29udGVudF90eXBlPSdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSB7DQoJaGVhZGVyKCdDb250ZW50LXR5cGU6ICcuJGNvbnRlbnRfdHlwZSk7DQoJZWNobyAkZGF0YTsNCglleGl0Ow0KfQ0KDQpmdW5jdGlvbiB6ZW1fZmlsZV91cmwoJG5hbWUpIHsNCglyZXR1cm4gcGFnZWxpbmt1cmwoYXJyYXkoJ3pmJz0+JG5hbWUpKTsNCn0NCg0KZnVuY3Rpb24gemVtX2ZpbGVfaW1nKCRuYW1lKSB7DQoJcmV0dXJuICc8aW1nIHNyYz0iJy56ZW1fZmlsZV91cmwoJG5hbWUpLiciIC8+JzsNCn0NCg0KaWYgKHR4cGludGVyZmFjZSA9PT0gJ2FkbWluJykgew0KCXplbV9ldmVudF9pbnN0YWxsKCk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3plbV9ldmVudF9oYW5kbGVyJywgJ2FydGljbGUnKTsNCg0KCWFkZF9wcml2cygnemVtX2V2ZW50X2NhdHMnLCAnMSwyLDMsNCw1Jyk7DQoJcmVnaXN0ZXJfdGFiKCdjb250ZW50JywgJ3plbV9ldmVudF9jYXRzJywgemVtX2V2ZW50X2dUeHQoJ2V2ZW50X2NhdGVnb3JpZXMnKSk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3plbV9ldmVudF9jYXRfdGFiJywgJ3plbV9ldmVudF9jYXRzJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3Jhc19hdXRvX2RlbGV0ZScgLCAnYXJ0aWNsZScpOyANCn0NCg0KaWYgKHR4cGludGVyZmFjZSA9PT0gJ3B1YmxpYycpIHsNCglyZWdpc3Rlcl9jYWxsYmFjaygnemVtX2V2ZW50X2ZlZWRfZW50cnknLCAnYXRvbV9lbnRyeScpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCd6ZW1fZXZlbnRfZmVlZF9lbnRyeScsICdyc3NfZW50cnknKTsNCg0KCWlmIChncHMoJ3pmJykgPT09ICd6ZW1fZXZlbnRfY2FsLmdpZicpIHsNCgkJJGNhbF9naWYgPSA8PDxFT0YNClIwbEdPRGxoRUFBUUFNUWZBSmU2NmYrWldOamk4UFQzKzJtVzBYZWkyTzN5K1AreVpmK2lZbE9GeExYTjZxdkc2VjJNeWJ6UTYvKzYNCmM3SEo2ZitJUmYrcFYrTHE5SWF1NFk2ejVYK28zVjJMeHE3STZhUEM3LzkrUFAvLy83clM4OERUNjU2LzdQK1NVUC8vL3lINUJBRUENCkFCOEFMQUFBQUFBUUFCQUFBQVdMNENlT1pDbHVXTmNCTEVWTlV5V0wyR0RmdUYySTNZRDhpRURBQTRGa0JnU2V6OEYwSEE2UnlESDUNCkFmaUFRYUhIZ3hSWk5acEZlUHpRR0JnaXltREJ2bHdlaXJoQ1lFa1BMcHB5V2FIaEN4SWlFd1p3Y29VWGZ5SVZCbnlNR2cxOUdnSm8NCkg0b05EWEtYY25RaUJRWWNHcCtmWUdDYkg1MEdFcWtDcTZ5bEJRU3dEQXdKdExXMEpyZ2tJUUE3DQpFT0Y7DQoJCXplbV9maWxlX3NlcnZlKGJhc2U2NF9kZWNvZGUoJGNhbF9naWYpKTsNCgl9DQoNCglpZiAoZ3BzKCd6ZicpID09PSAnZGF0ZVBpY2tlci5jc3MnKSB7DQoJCXplbV9maWxlX3NlcnZlKHplbV9ldmVudF9kYXRlcGlja2VyX2NzcygpLCAndGV4dC9jc3MnKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHplbV9ldmVudF9nVHh0KCR3aGF0LCAkYXR0cyA9IGFycmF5KCkpIHsNCgkkbGFuZyA9IGFycmF5KA0KCQknX2RlbGV0ZV9ldmVudCcgICAgICAgICAgID0+ICdBdXRvIGRlbGV0ZSBldmVudCBhdCBleHBpcmF0aW9uJywNCgkJJ19kZWxldGVfZW50cnknICAgICAgICAgICA9PiAnQXV0byBkZWxldGUgZW50cnkgKGFydGljbGUgYW5kIGV2ZW50KSBhdCBldmVudCBleHBpcmF0aW9uJywNCgkJJ2F1dG9fZGVsZXRpb24nICAgICAgICAgICA9PiAnQXV0b21hdGljIGRlbGV0aW9uJywNCgkJJ2NhdGVnb3JpZXNfZGVsZXRlZCcgICAgICA9PiAnRXZlbnQgY2F0ZWdvcmllcyBkZWxldGVkOiA8c3Ryb25nPntsaXN0fTwvc3Ryb25nPi4nLA0KCQknY2F0ZWdvcnlfYWxyZWFkeV9leGlzdHMnID0+ICdFdmVudCBjYXRlZ29yeSA8c3Ryb25nPntuYW1lfTwvc3Ryb25nPiBhbHJlYWR5IGV4aXN0cy4nLA0KCQknY2F0ZWdvcnlfY3JlYXRlZCcgICAgICAgID0+ICdFdmVudCBjYXRlZ29yeSA8c3Ryb25nPntuYW1lfTwvc3Ryb25nPiBjcmVhdGVkLicsDQoJCSdjYXRlZ29yeV9pbnZhbGlkJyAgICAgICAgPT4gJ0V2ZW50IGNhdGVnb3J5IDxzdHJvbmc+e25hbWV9PC9zdHJvbmc+IGludmFsaWQuJywNCgkJJ2NhdGVnb3J5X2xhYmVsJyAgICAgICAgICA9PiAnQ2F0ZWdvcmllcycsDQoJCSdjYXRlZ29yeV9uYW1lJyAgICAgICAgICAgPT4gJ0NhdGVnb3J5IG5hbWUnLA0KCQknY2F0ZWdvcnlfdGl0bGUnICAgICAgICAgID0+ICdDYXRlZ29yeSB0aXRsZScsDQoJCSdjYXRlZ29yeV91cGRhdGVkJyAgICAgICAgPT4gJ0V2ZW50IGNhdGVnb3J5IDxzdHJvbmc+e25hbWV9PC9zdHJvbmc+IHVwZGF0ZWQuJywNCgkJJ2RhdGVfbGFiZWwnICAgICAgICAgICAgICA9PiAnRGF0ZScsDQoJCSdkZXNjcmlwdGlvbl9sYWJlbCcgICAgICAgPT4gJ0Rlc2NyaXB0aW9uJywNCgkJJ2VtYWlsX2xhYmVsJyAgICAgICAgICAgICA9PiAnQ29udGFjdCBFbWFpbCcsDQoJCSdldmVudF9jYXRlZ29yaWVzJyAgICAgICAgPT4gJ0V2ZW50IENhdGVnb3JpZXMnLA0KCQknZXZlbnRfbGFiZWwnICAgICAgICAgICAgID0+ICdFdmVudCcsDQoJCSdmaW5pc2hfZGF0ZV9sYWJlbCcgICAgICAgPT4gJ0ZpbmlzaCBEYXRlJywNCgkJJ2ZpbmlzaF90aW1lX2xhYmVsJyAgICAgICA9PiAnRmluaXNoIFRpbWUnLA0KCQknbG9jYXRpb25fbGFiZWwnICAgICAgICAgID0+ICdMb2NhdGlvbicsDQoJCSdtYXBfbGFiZWwnICAgICAgICAgICAgICAgPT4gJ01hcCBVUkwnLA0KCQknbmFtZV9sYWJlbCcgICAgICAgICAgICAgID0+ICdOYW1lJywNCgkJJ3RpbWVfbGFiZWwnICAgICAgICAgICAgICA9PiAnVGltZScsDQoJCSd1cmxfbGFiZWwnICAgICAgICAgICAgICAgPT4gJ0V2ZW50IFVSTCcsDQoJCSdpbnZhbGlkX2RhdGUnICAgICAgICAgICAgPT4gJ0ludmFsaWQgZGF0ZSA8c3Ryb25nPntkYXRlfTwvc3Ryb25nPicsDQoJCSdtaXNzaW5nX2ZpbGUnICAgICAgICAgICAgPT4gJ1JlcXVpcmVkIGZpbGUgaXMgbWlzc2luZzogPHN0cm9uZz57cGF0aH08L3N0cm9uZz4nLA0KCQkncmVjdXJyaW5nX2xhYmVsJyAgICAgICAgID0+ICdSZWN1cnJpbmcgZXZlbnQnLA0KCQkncmVwZWF0X24nICAgICAgICAgICAgICAgID0+ICdSZXBlYXQgdGhpcyBldmVudCBldmVyeScsDQoJCSdyZXBlYXRfdG8nICAgICAgICAgICAgICAgPT4gJ1VudGlsJywNCgkJJ2Vycm9yX2NvbnRleHQnICAgICAgICAgICA9PiAnQ29udGV4dCBlcnJvcjogdGhlcmUgaXMgbm8gPHN0cm9uZz57dGhpbmd9PC9zdHJvbmc+IGhlcmUnLA0KCSk7DQoNCglyZXR1cm4gc3RydHIoJGxhbmdbJHdoYXRdLCAkYXR0cyk7DQp9DQoiO3M6NDoidHlwZSI7czoxOiIxIjtzOjM6Im1kNSI7czozMjoiMmNiNzk1OTkwNmEwMzZmYTE3YmMxYWEzZGViODljZjgiO30=