A/MNCmT5IVRjAAAAAAAAAAADAAAAQAAAAHMeAgAAaUwAZAAAZAEANmQCAGQDADZkBABkBQA2ZAYAZAcANmQIAGQJADZkCgBkCwA2ZAwAZA0ANmQOAGQPADZkEABkEQA2ZBIAZBMANmQUAGQVADZkFgBkFwA2ZBgAZBkANmQaAGQbADZkHABkHQA2ZB4AZB8ANmQgAGQhADZkIgBkIwA2ZCQAZCUANmQmAGQnADZkKABkKQA2ZCoAZCsANmQsAGQtADZkLgBkLwA2ZDAAZDEANmQyAGQzADZkNABkNQA2ZDYAZDcANmQ4AGQ5ADZkOgBkOwA2ZDwAZD0ANmQ+AGQ/ADZkQABkQQA2ZEIAZEMANmREAGRFADZkRgBkRwA2ZEgAZEkANmRKAGRLADZkTABkTQA2ZDgAZE4ANmRPAGRQADZkUQBkUgA2ZCQAZFMANmRUAGRVADZkVgBkVwA2ZFgAZFkANmRaAGRbADZkXABkXQA2ZF4AZF8ANmRgAGRhADZkYgBkYwA2ZGQAZGUANmRmAGRnADZkaABkaQA2ZGoAZGsANmRsAGRtADZkbgBkbwA2ZHAAZHEANmRyAGRzADZkdABkdQA2ZHYAZHcANmR4AGR5ADZkegBkewA2ZHwAZH0ANmR+AGR/ADZkgABkgQA2ZIIAZIMANmSEAGSFADZkhgBkhwA2ZIgAZIkANmSKAGSLADZkjABkjQA2ZI4AZI8ANmSQAGSRADZkkgBkkwA2ZJQAZJUANloAAGSWAFMolwAAAHOGBAAAClRoZSBgYGFzc2VydGBgIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioqKioKCkFzc2VydCBzdGF0ZW1lbnRzIGFyZSBhIGNvbnZlbmllbnQgd2F5IHRvIGluc2VydCBkZWJ1Z2dpbmcgYXNzZXJ0aW9ucwppbnRvIGEgcHJvZ3JhbToKCiAgIGFzc2VydF9zdG10IDo6PSAiYXNzZXJ0IiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl0KClRoZSBzaW1wbGUgZm9ybSwgYGBhc3NlcnQgZXhwcmVzc2lvbmBgLCBpcyBlcXVpdmFsZW50IHRvCgogICBpZiBfX2RlYnVnX186CiAgICAgIGlmIG5vdCBleHByZXNzaW9uOiByYWlzZSBBc3NlcnRpb25FcnJvcgoKVGhlIGV4dGVuZGVkIGZvcm0sIGBgYXNzZXJ0IGV4cHJlc3Npb24xLCBleHByZXNzaW9uMmBgLCBpcyBlcXVpdmFsZW50CnRvCgogICBpZiBfX2RlYnVnX186CiAgICAgIGlmIG5vdCBleHByZXNzaW9uMTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IoZXhwcmVzc2lvbjIpCgpUaGVzZSBlcXVpdmFsZW5jZXMgYXNzdW1lIHRoYXQgYGBfX2RlYnVnX19gYCBhbmQgYGBBc3NlcnRpb25FcnJvcmBgCnJlZmVyIHRvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50CmltcGxlbWVudGF0aW9uLCB0aGUgYnVpbHQtaW4gdmFyaWFibGUgYGBfX2RlYnVnX19gYCBpcyBgYFRydWVgYCB1bmRlcgpub3JtYWwgY2lyY3Vtc3RhbmNlcywgYGBGYWxzZWBgIHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZAooY29tbWFuZCBsaW5lIG9wdGlvbiAtTykuICBUaGUgY3VycmVudCBjb2RlIGdlbmVyYXRvciBlbWl0cyBubyBjb2RlCmZvciBhbiBhc3NlcnQgc3RhdGVtZW50IHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCBhdCBjb21waWxlCnRpbWUuICBOb3RlIHRoYXQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZQpleHByZXNzaW9uIHRoYXQgZmFpbGVkIGluIHRoZSBlcnJvciBtZXNzYWdlOyBpdCB3aWxsIGJlIGRpc3BsYXllZCBhcwpwYXJ0IG9mIHRoZSBzdGFjayB0cmFjZS4KCkFzc2lnbm1lbnRzIHRvIGBgX19kZWJ1Z19fYGAgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSBidWlsdC1pbgp2YXJpYWJsZSBpcyBkZXRlcm1pbmVkIHdoZW4gdGhlIGludGVycHJldGVyIHN0YXJ0cy4KdAYAAABhc3NlcnRznx8AAApBc3NpZ25tZW50IHN0YXRlbWVudHMKKioqKioqKioqKioqKioqKioqKioqCgpBc3NpZ25tZW50IHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gKHJlKWJpbmQgbmFtZXMgdG8gdmFsdWVzIGFuZCB0bwptb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6CgogICBhc3NpZ25tZW50X3N0bXQgOjo9ICh0YXJnZXRfbGlzdCAiPSIpKyAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbikKICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXQogICB0YXJnZXQgICAgICAgICAgOjo9IGlkZW50aWZpZXIKICAgICAgICAgICAgICB8ICIoIiB0YXJnZXRfbGlzdCAiKSIKICAgICAgICAgICAgICB8ICJbIiB0YXJnZXRfbGlzdCAiXSIKICAgICAgICAgICAgICB8IGF0dHJpYnV0ZXJlZgogICAgICAgICAgICAgIHwgc3Vic2NyaXB0aW9uCiAgICAgICAgICAgICAgfCBzbGljaW5nCgooU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yIHRoZSBsYXN0IHRocmVlCnN5bWJvbHMuKQoKQW4gYXNzaWdubWVudCBzdGF0ZW1lbnQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGxpc3QgKHJlbWVtYmVyIHRoYXQKdGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgbGF0dGVyCnlpZWxkaW5nIGEgdHVwbGUpIGFuZCBhc3NpZ25zIHRoZSBzaW5nbGUgcmVzdWx0aW5nIG9iamVjdCB0byBlYWNoIG9mCnRoZSB0YXJnZXQgbGlzdHMsIGZyb20gbGVmdCB0byByaWdodC4KCkFzc2lnbm1lbnQgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBkZXBlbmRpbmcgb24gdGhlIGZvcm0gb2YgdGhlIHRhcmdldAoobGlzdCkuIFdoZW4gYSB0YXJnZXQgaXMgcGFydCBvZiBhIG11dGFibGUgb2JqZWN0IChhbiBhdHRyaWJ1dGUKcmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0CnVsdGltYXRlbHkgcGVyZm9ybSB0aGUgYXNzaWdubWVudCBhbmQgZGVjaWRlIGFib3V0IGl0cyB2YWxpZGl0eSwgYW5kCm1heSByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGFzc2lnbm1lbnQgaXMgdW5hY2NlcHRhYmxlLiAgVGhlIHJ1bGVzCm9ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gd2l0aCB0aGUKZGVmaW5pdGlvbiBvZiB0aGUgb2JqZWN0IHR5cGVzIChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUKaGllcmFyY2h5KikuCgpBc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHRhcmdldCBsaXN0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXMKZm9sbG93cy4KCiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgc2luZ2xlIHRhcmdldDogVGhlIG9iamVjdCBpcyBhc3NpZ25lZCB0bwogIHRoYXQgdGFyZ2V0LgoKKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzOiBUaGUgb2JqZWN0CiAgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBhcyB0aGVyZSBhcmUKICB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0bwogIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLgoKQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXMKZm9sbG93cy4KCiogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKToKCiAgKiBJZiB0aGUgbmFtZSBkb2VzIG5vdCBvY2N1ciBpbiBhIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGluIHRoZQogICAgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBjdXJyZW50CiAgICBsb2NhbCBuYW1lc3BhY2UuCgogICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBjdXJyZW50IGdsb2JhbAogICAgbmFtZXNwYWNlLgoKICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgdGhlCiAgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgb2JqZWN0IHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIG5hbWUgdG8gcmVhY2gKICB6ZXJvLCBjYXVzaW5nIHRoZSBvYmplY3QgdG8gYmUgZGVhbGxvY2F0ZWQgYW5kIGl0cyBkZXN0cnVjdG9yIChpZiBpdAogIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC4KCiogSWYgdGhlIHRhcmdldCBpcyBhIHRhcmdldCBsaXN0IGVuY2xvc2VkIGluIHBhcmVudGhlc2VzIG9yIGluIHNxdWFyZQogIGJyYWNrZXRzOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YKICBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCBpdHMgaXRlbXMgYXJlCiAgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy4KCiogSWYgdGhlIHRhcmdldCBpcyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluCiAgdGhlIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYW4gb2JqZWN0IHdpdGgKICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBgYFR5cGVFcnJvcmBgIGlzCiAgcmFpc2VkLiAgVGhhdCBvYmplY3QgaXMgdGhlbiBhc2tlZCB0byBhc3NpZ24gdGhlIGFzc2lnbmVkIG9iamVjdCB0bwogIHRoZSBnaXZlbiBhdHRyaWJ1dGU7IGlmIGl0IGNhbm5vdCBwZXJmb3JtIHRoZSBhc3NpZ25tZW50LCBpdCByYWlzZXMKICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSBgYEF0dHJpYnV0ZUVycm9yYGApLgoKICBOb3RlOiBJZiB0aGUgb2JqZWN0IGlzIGEgY2xhc3MgaW5zdGFuY2UgYW5kIHRoZSBhdHRyaWJ1dGUgcmVmZXJlbmNlCiAgb2NjdXJzIG9uIGJvdGggc2lkZXMgb2YgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIHRoZSBSSFMgZXhwcmVzc2lvbiwKICBgYGEueGBgIGNhbiBhY2Nlc3MgZWl0aGVyIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciAoaWYgbm8gaW5zdGFuY2UKICBhdHRyaWJ1dGUgZXhpc3RzKSBhIGNsYXNzIGF0dHJpYnV0ZS4gIFRoZSBMSFMgdGFyZ2V0IGBgYS54YGAgaXMKICBhbHdheXMgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgogIFRodXMsIHRoZSB0d28gb2NjdXJyZW5jZXMgb2YgYGBhLnhgYCBkbyBub3QgbmVjZXNzYXJpbHkgcmVmZXIgdG8gdGhlCiAgc2FtZSBhdHRyaWJ1dGU6IGlmIHRoZSBSSFMgZXhwcmVzc2lvbiByZWZlcnMgdG8gYSBjbGFzcyBhdHRyaWJ1dGUsCiAgdGhlIExIUyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBhcyB0aGUgdGFyZ2V0IG9mIHRoZQogIGFzc2lnbm1lbnQ6CgogICAgIGNsYXNzIENsczoKICAgICAgICAgeCA9IDMgICAgICAgICAgICAgIyBjbGFzcyB2YXJpYWJsZQogICAgIGluc3QgPSBDbHMoKQogICAgIGluc3QueCA9IGluc3QueCArIDEgICAjIHdyaXRlcyBpbnN0LnggYXMgNCBsZWF2aW5nIENscy54IGFzIDMKCiAgVGhpcyBkZXNjcmlwdGlvbiBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byBkZXNjcmlwdG9yCiAgYXR0cmlidXRlcywgc3VjaCBhcyBwcm9wZXJ0aWVzIGNyZWF0ZWQgd2l0aCBgYHByb3BlcnR5KClgYC4KCiogSWYgdGhlIHRhcmdldCBpcyBhIHN1YnNjcmlwdGlvbjogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGUKICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2UKICBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSBvciBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSkuCiAgTmV4dCwgdGhlIHN1YnNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZC4KCiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpLCB0aGUKICBzdWJzY3JpcHQgbXVzdCB5aWVsZCBhIHBsYWluIGludGVnZXIuICBJZiBpdCBpcyBuZWdhdGl2ZSwgdGhlCiAgc2VxdWVuY2UncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhCiAgbm9ubmVnYXRpdmUgaW50ZWdlciBsZXNzIHRoYW4gdGhlIHNlcXVlbmNlJ3MgbGVuZ3RoLCBhbmQgdGhlCiAgc2VxdWVuY2UgaXMgYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8gaXRzIGl0ZW0gd2l0aAogIHRoYXQgaW5kZXguICBJZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCBgYEluZGV4RXJyb3JgYCBpcyByYWlzZWQKICAoYXNzaWdubWVudCB0byBhIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGEKICBsaXN0KS4KCiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCB0aGUKICBzdWJzY3JpcHQgbXVzdCBoYXZlIGEgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIG1hcHBpbmcncyBrZXkgdHlwZSwKICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzCiAgdGhlIHN1YnNjcmlwdCB0byB0aGUgYXNzaWduZWQgb2JqZWN0LiAgVGhpcyBjYW4gZWl0aGVyIHJlcGxhY2UgYW4KICBleGlzdGluZyBrZXkvdmFsdWUgcGFpciB3aXRoIHRoZSBzYW1lIGtleSB2YWx1ZSwgb3IgaW5zZXJ0IGEgbmV3CiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLgoKKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc2xpY2luZzogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGUgcmVmZXJlbmNlCiAgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYQogIGxpc3QpLiAgVGhlIGFzc2lnbmVkIG9iamVjdCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvYmplY3Qgb2YgdGhlIHNhbWUKICB0eXBlLiAgTmV4dCwgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkLAogIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZSBzZXF1ZW5jZSdzCiAgbGVuZ3RoLiAgVGhlIGJvdW5kcyBzaG91bGQgZXZhbHVhdGUgdG8gKHNtYWxsKSBpbnRlZ2Vycy4gIElmIGVpdGhlcgogIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2UncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuIFRoZQogIHJlc3VsdGluZyBib3VuZHMgYXJlIGNsaXBwZWQgdG8gbGllIGJldHdlZW4gemVybyBhbmQgdGhlIHNlcXVlbmNlJ3MKICBsZW5ndGgsIGluY2x1c2l2ZS4gIEZpbmFsbHksIHRoZSBzZXF1ZW5jZSBvYmplY3QgaXMgYXNrZWQgdG8gcmVwbGFjZQogIHRoZSBzbGljZSB3aXRoIHRoZSBpdGVtcyBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UuICBUaGUgbGVuZ3RoIG9mCiAgdGhlIHNsaWNlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZSwKICB0aHVzIGNoYW5naW5nIHRoZSBsZW5ndGggb2YgdGhlIHRhcmdldCBzZXF1ZW5jZSwgaWYgdGhlIG9iamVjdAogIGFsbG93cyBpdC4KCioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZQpzeW50YXggZm9yIHRhcmdldHMgaXMgdGFrZW4gdG8gYmUgdGhlIHNhbWUgYXMgZm9yIGV4cHJlc3Npb25zLCBhbmQKaW52YWxpZCBzeW50YXggaXMgcmVqZWN0ZWQgZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcGhhc2UsIGNhdXNpbmcKbGVzcyBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcy4KCldBUk5JTkc6IEFsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIGFzc2lnbm1lbnQgaW1wbGllcyB0aGF0IG92ZXJsYXBzCmJldHdlZW4gdGhlIGxlZnQtaGFuZCBzaWRlIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSAnc2FmZScgKGZvcgpleGFtcGxlIGBgYSwgYiA9IGIsIGFgYCBzd2FwcyB0d28gdmFyaWFibGVzKSwgb3ZlcmxhcHMgKndpdGhpbiogdGhlCmNvbGxlY3Rpb24gb2YgYXNzaWduZWQtdG8gdmFyaWFibGVzIGFyZSBub3Qgc2FmZSEgIEZvciBpbnN0YW5jZSwgdGhlCmZvbGxvd2luZyBwcm9ncmFtIHByaW50cyBgYFswLCAyXWBgOgoKICAgeCA9IFswLCAxXQogICBpID0gMAogICBpLCB4W2ldID0gMSwgMgogICBwcmludCB4CgoKQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgb2YgYQpiaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDoKCiAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbikKICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmcKICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iCiAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSIKCihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3IgdGhlIGxhc3QgdGhyZWUKc3ltYm9scy4pCgpBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWwKYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb24KbGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudApvbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuClRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS4KCkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSBgYHggKz0gMWBgIGNhbiBiZSByZXdyaXR0ZW4gYXMKYGB4ID0geCArIDFgYCB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gSW4KdGhlIGF1Z21lbnRlZCB2ZXJzaW9uLCBgYHhgYCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuCnBvc3NpYmxlLCB0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0CnJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCwKdGhlIG9sZCBvYmplY3QgaXMgbW9kaWZpZWQgaW5zdGVhZC4KCldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGEKc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudApzdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gU2ltaWxhcmx5LAp3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnkKb3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsCmJpbmFyeSBvcGVyYXRpb25zLgoKRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSAqY2F2ZWF0IGFib3V0CmNsYXNzIGFuZCBpbnN0YW5jZSBhdHRyaWJ1dGVzKiBhcHBsaWVzIGFzIGZvciByZWd1bGFyIGFzc2lnbm1lbnRzLgp0CgAAAGFzc2lnbm1lbnRz2gQAAApJZGVudGlmaWVycyAoTmFtZXMpCioqKioqKioqKioqKioqKioqKioKCkFuIGlkZW50aWZpZXIgb2NjdXJyaW5nIGFzIGFuIGF0b20gaXMgYSBuYW1lLiAgU2VlIHNlY3Rpb24KKklkZW50aWZpZXJzIGFuZCBrZXl3b3JkcyogZm9yIGxleGljYWwgZGVmaW5pdGlvbiBhbmQgc2VjdGlvbiAqTmFtaW5nCmFuZCBiaW5kaW5nKiBmb3IgZG9jdW1lbnRhdGlvbiBvZiBuYW1pbmcgYW5kIGJpbmRpbmcuCgpXaGVuIHRoZSBuYW1lIGlzIGJvdW5kIHRvIGFuIG9iamVjdCwgZXZhbHVhdGlvbiBvZiB0aGUgYXRvbSB5aWVsZHMKdGhhdCBvYmplY3QuIFdoZW4gYSBuYW1lIGlzIG5vdCBib3VuZCwgYW4gYXR0ZW1wdCB0byBldmFsdWF0ZSBpdApyYWlzZXMgYSBgYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbi4KCioqUHJpdmF0ZSBuYW1lIG1hbmdsaW5nOioqIFdoZW4gYW4gaWRlbnRpZmllciB0aGF0IHRleHR1YWxseSBvY2N1cnMgaW4KYSBjbGFzcyBkZWZpbml0aW9uIGJlZ2lucyB3aXRoIHR3byBvciBtb3JlIHVuZGVyc2NvcmUgY2hhcmFjdGVycyBhbmQKZG9lcyBub3QgZW5kIGluIHR3byBvciBtb3JlIHVuZGVyc2NvcmVzLCBpdCBpcyBjb25zaWRlcmVkIGEgKnByaXZhdGUKbmFtZSogb2YgdGhhdCBjbGFzcy4gUHJpdmF0ZSBuYW1lcyBhcmUgdHJhbnNmb3JtZWQgdG8gYSBsb25nZXIgZm9ybQpiZWZvcmUgY29kZSBpcyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGUgdHJhbnNmb3JtYXRpb24gaW5zZXJ0cyB0aGUKY2xhc3MgbmFtZSwgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmVzIHJlbW92ZWQgYW5kIGEgc2luZ2xlIHVuZGVyc2NvcmUKaW5zZXJ0ZWQsIGluIGZyb250IG9mIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBpZGVudGlmaWVyCmBgX19zcGFtYGAgb2NjdXJyaW5nIGluIGEgY2xhc3MgbmFtZWQgYGBIYW1gYCB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvCmBgX0hhbV9fc3BhbWBgLiAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3ludGFjdGljYWwKY29udGV4dCBpbiB3aGljaCB0aGUgaWRlbnRpZmllciBpcyB1c2VkLiAgSWYgdGhlIHRyYW5zZm9ybWVkIG5hbWUgaXMKZXh0cmVtZWx5IGxvbmcgKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24gZGVmaW5lZAp0cnVuY2F0aW9uIG1heSBoYXBwZW4uIElmIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgdW5kZXJzY29yZXMsCm5vIHRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuCnMQAAAAYXRvbS1pZGVudGlmaWVyc3MKAwAACkxpdGVyYWxzCioqKioqKioqCgpQeXRob24gc3VwcG9ydHMgc3RyaW5nIGxpdGVyYWxzIGFuZCB2YXJpb3VzIG51bWVyaWMgbGl0ZXJhbHM6CgogICBsaXRlcmFsIDo6PSBzdHJpbmdsaXRlcmFsIHwgaW50ZWdlciB8IGxvbmdpbnRlZ2VyCiAgICAgICAgICAgICAgIHwgZmxvYXRudW1iZXIgfCBpbWFnbnVtYmVyCgpFdmFsdWF0aW9uIG9mIGEgbGl0ZXJhbCB5aWVsZHMgYW4gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlIChzdHJpbmcsCmludGVnZXIsIGxvbmcgaW50ZWdlciwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBjb21wbGV4IG51bWJlcikgd2l0aCB0aGUKZ2l2ZW4gdmFsdWUuICBUaGUgdmFsdWUgbWF5IGJlIGFwcHJveGltYXRlZCBpbiB0aGUgY2FzZSBvZiBmbG9hdGluZwpwb2ludCBhbmQgaW1hZ2luYXJ5IChjb21wbGV4KSBsaXRlcmFscy4gIFNlZSBzZWN0aW9uICpMaXRlcmFscyogZm9yCmRldGFpbHMuCgpBbGwgbGl0ZXJhbHMgY29ycmVzcG9uZCB0byBpbW11dGFibGUgZGF0YSB0eXBlcywgYW5kIGhlbmNlIHRoZQpvYmplY3QncyBpZGVudGl0eSBpcyBsZXNzIGltcG9ydGFudCB0aGFuIGl0cyB2YWx1ZS4gIE11bHRpcGxlCmV2YWx1YXRpb25zIG9mIGxpdGVyYWxzIHdpdGggdGhlIHNhbWUgdmFsdWUgKGVpdGhlciB0aGUgc2FtZQpvY2N1cnJlbmNlIGluIHRoZSBwcm9ncmFtIHRleHQgb3IgYSBkaWZmZXJlbnQgb2NjdXJyZW5jZSkgbWF5IG9idGFpbgp0aGUgc2FtZSBvYmplY3Qgb3IgYSBkaWZmZXJlbnQgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUuCnMNAAAAYXRvbS1saXRlcmFsc3PmKgAACkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3MKKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZgphdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mIGBgeC5uYW1lYGApCmZvciBjbGFzcyBpbnN0YW5jZXMuCgpvYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSkKCiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZQogICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgaXQgZm91bmQKICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yIGBgc2VsZmBgKS4gIGBgbmFtZWBgIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS4KICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UKICAgYW4gYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi4KCiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sCiAgIGBgX19nZXRhdHRyX18oKWBgIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBhc3ltbWV0cnkKICAgYmV0d2VlbiBgYF9fZ2V0YXR0cl9fKClgYCBhbmQgYGBfX3NldGF0dHJfXygpYGAuKSBUaGlzIGlzIGRvbmUgYm90aAogICBmb3IgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSBgYF9fZ2V0YXR0cl9fKClgYAogICB3b3VsZCBoYXZlIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlCiAgIHRoYXQgYXQgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnkKICAgbm90IGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0CiAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZQogICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsCiAgIGNvbnRyb2wgaW4gbmV3LXN0eWxlIGNsYXNzZXMuCgpvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpCgogICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZAogICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGUKICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZQogICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC4KCiAgIElmIGBgX19zZXRhdHRyX18oKWBgIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0CiAgIHNob3VsZCBub3Qgc2ltcGx5IGV4ZWN1dGUgYGBzZWxmLm5hbWUgPSB2YWx1ZWBgIC0tLSB0aGlzIHdvdWxkCiAgIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwgdG8gaXRzZWxmLiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluc2VydCB0aGUKICAgdmFsdWUgaW4gdGhlIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgYXR0cmlidXRlcywgZS5nLiwKICAgYGBzZWxmLl9fZGljdF9fW25hbWVdID0gdmFsdWVgYC4gIEZvciBuZXctc3R5bGUgY2xhc3NlcywgcmF0aGVyCiAgIHRoYW4gYWNjZXNzaW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5LCBpdCBzaG91bGQgY2FsbCB0aGUgYmFzZQogICBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSwKICAgYGBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpYGAuCgpvYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSkKCiAgIExpa2UgYGBfX3NldGF0dHJfXygpYGAgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZgogICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiBgYGRlbCBvYmoubmFtZWBgIGlzCiAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuCgoKTW9yZSBhdHRyaWJ1dGUgYWNjZXNzIGZvciBuZXctc3R5bGUgY2xhc3Nlcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB0byBuZXctc3R5bGUgY2xhc3Nlcy4KCm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCgogICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yCiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMKICAgYGBfX2dldGF0dHJfXygpYGAsIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcwogICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIGVpdGhlciBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbgogICBgYEF0dHJpYnV0ZUVycm9yYGAuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkKICAgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb24uIEluIG9yZGVyCiAgIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpbiB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uCiAgIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvCiAgIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCBuZWVkcywgZm9yIGV4YW1wbGUsCiAgIGBgb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlgYC4KCiAgIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzCiAgICAgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXggb3IKICAgICBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGUKICAgICBjbGFzc2VzKi4KCgpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMKPT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcwpjb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhbgoqb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXIncyBjbGFzcwpkaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlCmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcwp0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3MnIGBgX19kaWN0X19gYC4KCm9iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcikKCiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZQogICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZQogICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICppbnN0YW5jZSogaXMgdGhlCiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgYGBOb25lYGAgd2hlbgogICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzIG1ldGhvZCBzaG91bGQKICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbgogICBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLgoKb2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKQoKICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlIG93bmVyCiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLgoKb2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpCgogICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUKICAgb3duZXIgY2xhc3MuCgoKSW52b2tpbmcgRGVzY3JpcHRvcnMKPT09PT09PT09PT09PT09PT09PT0KCkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggImJpbmRpbmcKYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHMKaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgLCBhbmQKYGBfX2RlbGV0ZV9fKClgYC4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuIG9iamVjdCwKaXQgaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuCgpUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgZGVsZXRlCnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3QncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsIGBgYS54YGAgaGFzIGEKbG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggYGBhLl9fZGljdF9fWyd4J11gYCwgdGhlbgpgYHR5cGUoYSkuX19kaWN0X19bJ3gnXWBgLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2YKYGB0eXBlKGEpYGAgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLgoKSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZQpkZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQKaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlCnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZApob3cgdGhleSB3ZXJlIGNhbGxlZC4gIE5vdGUgdGhhdCBkZXNjcmlwdG9ycyBhcmUgb25seSBpbnZva2VkIGZvciBuZXcKc3R5bGUgb2JqZWN0cyBvciBjbGFzc2VzIChvbmVzIHRoYXQgc3ViY2xhc3MgYGBvYmplY3QoKWBgIG9yCmBgdHlwZSgpYGApLgoKVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCBgYGEueGBgLgpIb3cgdGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gYGBhYGA6CgpEaXJlY3QgQ2FsbAogICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5CiAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgYGB4Ll9fZ2V0X18oYSlgYC4KCkluc3RhbmNlIEJpbmRpbmcKICAgSWYgYmluZGluZyB0byBhIG5ldy1zdHlsZSBvYmplY3QgaW5zdGFuY2UsIGBgYS54YGAgaXMgdHJhbnNmb3JtZWQKICAgaW50byB0aGUgY2FsbDogYGB0eXBlKGEpLl9fZGljdF9fWyd4J10uX19nZXRfXyhhLCB0eXBlKGEpKWBgLgoKQ2xhc3MgQmluZGluZwogICBJZiBiaW5kaW5nIHRvIGEgbmV3LXN0eWxlIGNsYXNzLCBgYEEueGBgIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlCiAgIGNhbGw6IGBgQS5fX2RpY3RfX1sneCddLl9fZ2V0X18oTm9uZSwgQSlgYC4KClN1cGVyIEJpbmRpbmcKICAgSWYgYGBhYGAgaXMgYW4gaW5zdGFuY2Ugb2YgYGBzdXBlcmBgLCB0aGVuIHRoZSBiaW5kaW5nIGBgc3VwZXIoQiwKICAgb2JqKS5tKClgYCBzZWFyY2hlcyBgYG9iai5fX2NsYXNzX18uX19tcm9fX2BgIGZvciB0aGUgYmFzZSBjbGFzcwogICBgYEFgYCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYGBCYGAgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvcgogICB3aXRoIHRoZSBjYWxsOiBgYEEuX19kaWN0X19bJ20nXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXylgYC4KCkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHMKb24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lCmFueSBjb21iaW5hdGlvbiBvZiBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgIGFuZCBgYF9fZGVsZXRlX18oKWBgLgpJZiBpdCBkb2VzIG5vdCBkZWZpbmUgYGBfX2dldF9fKClgYCwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsCnJldHVybiB0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZQpvYmplY3QncyBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyBgYF9fc2V0X18oKWBgCmFuZC9vciBgYF9fZGVsZXRlX18oKWBgLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lcwpuZWl0aGVyLCBpdCBpcyBhIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9ycwpkZWZpbmUgYm90aCBgYF9fZ2V0X18oKWBgIGFuZCBgYF9fc2V0X18oKWBgLCB3aGlsZSBub24tZGF0YQpkZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlIGBgX19nZXRfXygpYGAgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoCmBgX19zZXRfXygpYGAgYW5kIGBgX19nZXRfXygpYGAgZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb24KaW4gYW4gaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluIGNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmUKb3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuCgpQeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nIGBgc3RhdGljbWV0aG9kKClgYCBhbmQgYGBjbGFzc21ldGhvZCgpYGApCmFyZSBpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuCnJlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCBpbnN0YW5jZXMgdG8KYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuCgpUaGUgYGBwcm9wZXJ0eSgpYGAgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuCkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LgoKCl9fc2xvdHNfXwo9PT09PT09PT0KCkJ5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBib3RoIG9sZCBhbmQgbmV3LXN0eWxlIGNsYXNzZXMgaGF2ZSBhCmRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZSBzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMKaGF2aW5nIHZlcnkgZmV3IGluc3RhbmNlIHZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lCmFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2UgbnVtYmVycyBvZiBpbnN0YW5jZXMuCgpUaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyAqX19zbG90c19fKiBpbiBhIG5ldy1zdHlsZQpjbGFzcyBkZWZpbml0aW9uLiAgVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YKaW5zdGFuY2UgdmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvCmhvbGQgYSB2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgKl9fZGljdF9fKiBpcwpub3QgY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS4KCl9fc2xvdHNfXwoKICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZQogICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICBJZiBkZWZpbmVkIGluIGEKICAgbmV3LXN0eWxlIGNsYXNzLCAqX19zbG90c19fKiByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkCiAgIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZAogICAqX193ZWFrcmVmX18qIGZvciBlYWNoIGluc3RhbmNlLgoKICAgTmV3IGluIHZlcnNpb24gMi4yLgoKTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXyoKCiogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgKl9fZGljdF9fKgogIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgKl9fc2xvdHNfXyoKICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy4KCiogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3CiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0bwogIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyBgYEF0dHJpYnV0ZUVycm9yYGAuIElmCiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGQKICBgYCdfX2RpY3RfXydgYCB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyoKICBkZWNsYXJhdGlvbi4KCiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWRkaW5nIGBgJ19fZGljdF9fJ2BgIHRvIHRoZQogICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHdvdWxkIG5vdCBlbmFibGUgdGhlIGFzc2lnbm1lbnQgb2YgbmV3CiAgYXR0cmlidXRlcyBub3Qgc3BlY2lmaWNhbGx5IGxpc3RlZCBpbiB0aGUgc2VxdWVuY2Ugb2YgaW5zdGFuY2UKICB2YXJpYWJsZSBuYW1lcy4KCiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXMgZGVmaW5pbmcKICAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzIGluc3RhbmNlcy4gSWYgd2VhawogIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGQgYGAnX193ZWFrcmVmX18nYGAgdG8gdGhlCiAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24uCgogIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFkZGluZyBgYCdfX3dlYWtyZWZfXydgYCB0byB0aGUKICAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB3b3VsZCBub3QgZW5hYmxlIHN1cHBvcnQgZm9yIHdlYWsKICByZWZlcmVuY2VzLgoKKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5IGNyZWF0aW5nCiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXMKICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yCiAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlIGNsYXNzCiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LgoKKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgY2xhc3MKICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKgogIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lcwogIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLgoKKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZSBpbnN0YW5jZQogIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyBpbmFjY2Vzc2libGUgKGV4Y2VwdCBieQogIHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuIFRoaXMKICByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGEKICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLgoKKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbQogICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgYGBsb25nYGAsIGBgc3RyYGAgYW5kCiAgYGB0dXBsZWBgLgoKKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouIE1hcHBpbmdzIG1heQogIGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nIG1heSBiZQogIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS4KCiogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lCiAgKl9fc2xvdHNfXyouCgogIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IFByZXZpb3VzbHksICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgcmFpc2VkIGFuCiAgZXJyb3IgaWYgZWl0aGVyIG5ldyBvciBvbGQgY2xhc3MgaGFkICpfX3Nsb3RzX18qLgpzEAAAAGF0dHJpYnV0ZS1hY2Nlc3NzYQIAAApBdHRyaWJ1dGUgcmVmZXJlbmNlcwoqKioqKioqKioqKioqKioqKioqKgoKQW4gYXR0cmlidXRlIHJlZmVyZW5jZSBpcyBhIHByaW1hcnkgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kIGEgbmFtZToKCiAgIGF0dHJpYnV0ZXJlZiA6Oj0gcHJpbWFyeSAiLiIgaWRlbnRpZmllcgoKVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgc3VwcG9ydHMKYXR0cmlidXRlIHJlZmVyZW5jZXMsIGUuZy4sIGEgbW9kdWxlLCBsaXN0LCBvciBhbiBpbnN0YW5jZS4gIFRoaXMKb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gcHJvZHVjZSB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMgdGhlCmlkZW50aWZpZXIuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgZXhjZXB0aW9uCmBgQXR0cmlidXRlRXJyb3JgYCBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlIHR5cGUgYW5kIHZhbHVlIG9mIHRoZQpvYmplY3QgcHJvZHVjZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb2JqZWN0LiAgTXVsdGlwbGUgZXZhbHVhdGlvbnMgb2YKdGhlIHNhbWUgYXR0cmlidXRlIHJlZmVyZW5jZSBtYXkgeWllbGQgZGlmZmVyZW50IG9iamVjdHMuCnMUAAAAYXR0cmlidXRlLXJlZmVyZW5jZXNzzwYAAApBdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhCmJpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OgoKICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKQogICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgc3Vic2NyaXB0aW9uIHwgc2xpY2luZwogICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSIKICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IgoKKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIGZvciB0aGUgbGFzdCB0aHJlZQpzeW1ib2xzLikKCkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlIG5vcm1hbAphc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvbgpsaXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBhc3NpZ25tZW50Cm9uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsIHRhcmdldC4KVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLgoKQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlIGBgeCArPSAxYGAgY2FuIGJlIHJld3JpdHRlbiBhcwpgYHggPSB4ICsgMWBgIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJbgp0aGUgYXVnbWVudGVkIHZlcnNpb24sIGBgeGBgIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4KcG9zc2libGUsIHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQKcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LAp0aGUgb2xkIG9iamVjdCBpcyBtb2RpZmllZCBpbnN0ZWFkLgoKV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYQpzaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50CnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksCndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeQpvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSBub3JtYWwKYmluYXJ5IG9wZXJhdGlvbnMuCgpGb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lICpjYXZlYXQgYWJvdXQKY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMqIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgYXNzaWdubWVudHMuCnQJAAAAYXVnYXNzaWduc5wMAAAKQmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBoYXZlIHRoZSBjb252ZW50aW9uYWwgcHJpb3JpdHkKbGV2ZWxzLiAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhbHNvIGFwcGx5IHRvIGNlcnRhaW4gbm9uLQpudW1lcmljIHR5cGVzLiAgQXBhcnQgZnJvbSB0aGUgcG93ZXIgb3BlcmF0b3IsIHRoZXJlIGFyZSBvbmx5IHR3bwpsZXZlbHMsIG9uZSBmb3IgbXVsdGlwbGljYXRpdmUgb3BlcmF0b3JzIGFuZCBvbmUgZm9yIGFkZGl0aXZlCm9wZXJhdG9yczoKCiAgIG1fZXhwciA6Oj0gdV9leHByIHwgbV9leHByICIqIiB1X2V4cHIgfCBtX2V4cHIgIi8vIiB1X2V4cHIgfCBtX2V4cHIgIi8iIHVfZXhwcgogICAgICAgICAgICAgIHwgbV9leHByICIlIiB1X2V4cHIKICAgYV9leHByIDo6PSBtX2V4cHIgfCBhX2V4cHIgIisiIG1fZXhwciB8IGFfZXhwciAiLSIgbV9leHByCgpUaGUgYGAqYGAgKG11bHRpcGxpY2F0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHByb2R1Y3Qgb2YgaXRzCmFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzLCBvciBvbmUgYXJndW1lbnQKbXVzdCBiZSBhbiBpbnRlZ2VyIChwbGFpbiBvciBsb25nKSBhbmQgdGhlIG90aGVyIG11c3QgYmUgYSBzZXF1ZW5jZS4KSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUgYW5kCnRoZW4gbXVsdGlwbGllZCB0b2dldGhlci4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgc2VxdWVuY2UgcmVwZXRpdGlvbiBpcwpwZXJmb3JtZWQ7IGEgbmVnYXRpdmUgcmVwZXRpdGlvbiBmYWN0b3IgeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlLgoKVGhlIGBgL2BgIChkaXZpc2lvbikgYW5kIGBgLy9gYCAoZmxvb3IgZGl2aXNpb24pIG9wZXJhdG9ycyB5aWVsZCB0aGUKcXVvdGllbnQgb2YgdGhlaXIgYXJndW1lbnRzLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdApjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gUGxhaW4gb3IgbG9uZyBpbnRlZ2VyIGRpdmlzaW9uIHlpZWxkcyBhbgppbnRlZ2VyIG9mIHRoZSBzYW1lIHR5cGU7IHRoZSByZXN1bHQgaXMgdGhhdCBvZiBtYXRoZW1hdGljYWwgZGl2aXNpb24Kd2l0aCB0aGUgJ2Zsb29yJyBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSByZXN1bHQuIERpdmlzaW9uIGJ5IHplcm8KcmFpc2VzIHRoZSBgYFplcm9EaXZpc2lvbkVycm9yYGAgZXhjZXB0aW9uLgoKVGhlIGBgJWBgIChtb2R1bG8pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcmVtYWluZGVyIGZyb20gdGhlIGRpdmlzaW9uIG9mCnRoZSBmaXJzdCBhcmd1bWVudCBieSB0aGUgc2Vjb25kLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdApjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIEEgemVybyByaWdodCBhcmd1bWVudCByYWlzZXMgdGhlCmBgWmVyb0RpdmlzaW9uRXJyb3JgYCBleGNlcHRpb24uICBUaGUgYXJndW1lbnRzIG1heSBiZSBmbG9hdGluZyBwb2ludApudW1iZXJzLCBlLmcuLCBgYDMuMTQlMC43YGAgZXF1YWxzIGBgMC4zNGBgIChzaW5jZSBgYDMuMTRgYCBlcXVhbHMKYGA0KjAuNyArIDAuMzRgYC4pICBUaGUgbW9kdWxvIG9wZXJhdG9yIGFsd2F5cyB5aWVsZHMgYSByZXN1bHQgd2l0aAp0aGUgc2FtZSBzaWduIGFzIGl0cyBzZWNvbmQgb3BlcmFuZCAob3IgemVybyk7IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZgp0aGUgcmVzdWx0IGlzIHN0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHNlY29uZApvcGVyYW5kIFsyXS4KClRoZSBpbnRlZ2VyIGRpdmlzaW9uIGFuZCBtb2R1bG8gb3BlcmF0b3JzIGFyZSBjb25uZWN0ZWQgYnkgdGhlCmZvbGxvd2luZyBpZGVudGl0eTogYGB4ID09ICh4L3kpKnkgKyAoeCV5KWBgLiAgSW50ZWdlciBkaXZpc2lvbiBhbmQKbW9kdWxvIGFyZSBhbHNvIGNvbm5lY3RlZCB3aXRoIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGRpdm1vZCgpYGA6CmBgZGl2bW9kKHgsIHkpID09ICh4L3ksIHgleSlgYC4gIFRoZXNlIGlkZW50aXRpZXMgZG9uJ3QgaG9sZCBmb3IKZmxvYXRpbmcgcG9pbnQgbnVtYmVyczsgdGhlcmUgc2ltaWxhciBpZGVudGl0aWVzIGhvbGQgYXBwcm94aW1hdGVseQp3aGVyZSBgYHgveWBgIGlzIHJlcGxhY2VkIGJ5IGBgZmxvb3IoeC95KWBgIG9yIGBgZmxvb3IoeC95KSAtIDFgYCBbM10uCgpJbiBhZGRpdGlvbiB0byBwZXJmb3JtaW5nIHRoZSBtb2R1bG8gb3BlcmF0aW9uIG9uIG51bWJlcnMsIHRoZSBgYCVgYApvcGVyYXRvciBpcyBhbHNvIG92ZXJsb2FkZWQgYnkgc3RyaW5nIGFuZCB1bmljb2RlIG9iamVjdHMgdG8gcGVyZm9ybQpzdHJpbmcgZm9ybWF0dGluZyAoYWxzbyBrbm93biBhcyBpbnRlcnBvbGF0aW9uKS4gVGhlIHN5bnRheCBmb3Igc3RyaW5nCmZvcm1hdHRpbmcgaXMgZGVzY3JpYmVkIGluIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UsIHNlY3Rpb24KKlN0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnMqLgoKRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMzogVGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yLCB0aGUgbW9kdWxvCm9wZXJhdG9yLCBhbmQgdGhlIGBgZGl2bW9kKClgYCBmdW5jdGlvbiBhcmUgbm8gbG9uZ2VyIGRlZmluZWQgZm9yCmNvbXBsZXggbnVtYmVycy4gIEluc3RlYWQsIGNvbnZlcnQgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdXNpbmcKdGhlIGBgYWJzKClgYCBmdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KClRoZSBgYCtgYCAoYWRkaXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgc3VtIG9mIGl0cyBhcmd1bWVudHMuIFRoZQphcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzIG9yIGJvdGggc2VxdWVuY2VzIG9mIHRoZSBzYW1lCnR5cGUuICBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZQphbmQgdGhlbiBhZGRlZCB0b2dldGhlci4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHNlcXVlbmNlcyBhcmUKY29uY2F0ZW5hdGVkLgoKVGhlIGBgLWBgIChzdWJ0cmFjdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBkaWZmZXJlbmNlIG9mIGl0cwphcmd1bWVudHMuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbgp0eXBlLgp0BgAAAGJpbmFyeXPiAgAACkJpbmFyeSBiaXR3aXNlIG9wZXJhdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKgoKRWFjaCBvZiB0aGUgdGhyZWUgYml0d2lzZSBvcGVyYXRpb25zIGhhcyBhIGRpZmZlcmVudCBwcmlvcml0eSBsZXZlbDoKCiAgIGFuZF9leHByIDo6PSBzaGlmdF9leHByIHwgYW5kX2V4cHIgIiYiIHNoaWZ0X2V4cHIKICAgeG9yX2V4cHIgOjo9IGFuZF9leHByIHwgeG9yX2V4cHIgIl4iIGFuZF9leHByCiAgIG9yX2V4cHIgIDo6PSB4b3JfZXhwciB8IG9yX2V4cHIgInwiIHhvcl9leHByCgpUaGUgYGAmYGAgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIEFORCBvZiBpdHMgYXJndW1lbnRzLCB3aGljaCBtdXN0CmJlIHBsYWluIG9yIGxvbmcgaW50ZWdlcnMuICBUaGUgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24KdHlwZS4KClRoZSBgYF5gYCBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0cwphcmd1bWVudHMsIHdoaWNoIG11c3QgYmUgcGxhaW4gb3IgbG9uZyBpbnRlZ2Vycy4gIFRoZSBhcmd1bWVudHMgYXJlCmNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLgoKVGhlIGBgfGBgIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSAoaW5jbHVzaXZlKSBPUiBvZiBpdHMgYXJndW1lbnRzLAp3aGljaCBtdXN0IGJlIHBsYWluIG9yIGxvbmcgaW50ZWdlcnMuICBUaGUgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8KYSBjb21tb24gdHlwZS4KdAcAAABiaXR3aXNlc4oCAAAKQ29kZSBPYmplY3RzCioqKioqKioqKioqKgoKQ29kZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byByZXByZXNlbnQgInBzZXVkby0KY29tcGlsZWQiIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUgc3VjaCBhcyBhIGZ1bmN0aW9uIGJvZHkuIFRoZXkgZGlmZmVyCmZyb20gZnVuY3Rpb24gb2JqZWN0cyBiZWNhdXNlIHRoZXkgZG9uJ3QgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGVpcgpnbG9iYWwgZXhlY3V0aW9uIGVudmlyb25tZW50LiAgQ29kZSBvYmplY3RzIGFyZSByZXR1cm5lZCBieSB0aGUgYnVpbHQtCmluIGBgY29tcGlsZSgpYGAgZnVuY3Rpb24gYW5kIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBmdW5jdGlvbiBvYmplY3RzCnRocm91Z2ggdGhlaXIgYGBmdW5jX2NvZGVgYCBhdHRyaWJ1dGUuIFNlZSBhbHNvIHRoZSBgYGNvZGVgYCBtb2R1bGUuCgpBIGNvZGUgb2JqZWN0IGNhbiBiZSBleGVjdXRlZCBvciBldmFsdWF0ZWQgYnkgcGFzc2luZyBpdCAoaW5zdGVhZCBvZiBhCnNvdXJjZSBzdHJpbmcpIHRvIHRoZSBgYGV4ZWNgYCBzdGF0ZW1lbnQgb3IgdGhlIGJ1aWx0LWluIGBgZXZhbCgpYGAKZnVuY3Rpb24uCgpTZWUgKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSogZm9yIG1vcmUgaW5mb3JtYXRpb24uCnMSAAAAYmx0aW4tY29kZS1vYmplY3Rzc08BAAAKVGhlIEVsbGlwc2lzIE9iamVjdAoqKioqKioqKioqKioqKioqKioqCgpUaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGV4dGVuZGVkIHNsaWNlIG5vdGF0aW9uIChzZWUgKlNsaWNpbmdzKikuICBJdApzdXBwb3J0cyBubyBzcGVjaWFsIG9wZXJhdGlvbnMuICBUaGVyZSBpcyBleGFjdGx5IG9uZSBlbGxpcHNpcyBvYmplY3QsCm5hbWVkIGBgRWxsaXBzaXNgYCAoYSBidWlsdC1pbiBuYW1lKS4KCkl0IGlzIHdyaXR0ZW4gYXMgYGBFbGxpcHNpc2BgLiAgV2hlbiBpbiBhIHN1YnNjcmlwdCwgaXQgY2FuIGFsc28gYmUKd3JpdHRlbiBhcyBgYC4uLmBgLCBmb3IgZXhhbXBsZSBgYHNlcVsuLi5dYGAuCnMVAAAAYmx0aW4tZWxsaXBzaXMtb2JqZWN0c/IAAAAKVGhlIE51bGwgT2JqZWN0CioqKioqKioqKioqKioqKgoKVGhpcyBvYmplY3QgaXMgcmV0dXJuZWQgYnkgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhwbGljaXRseSByZXR1cm4gYQp2YWx1ZS4gIEl0IHN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIG51bGwKb2JqZWN0LCBuYW1lZCBgYE5vbmVgYCAoYSBidWlsdC1pbiBuYW1lKS4KCkl0IGlzIHdyaXR0ZW4gYXMgYGBOb25lYGAuCnMRAAAAYmx0aW4tbnVsbC1vYmplY3RzOQEAAApUeXBlIE9iamVjdHMKKioqKioqKioqKioqCgpUeXBlIG9iamVjdHMgcmVwcmVzZW50IHRoZSB2YXJpb3VzIG9iamVjdCB0eXBlcy4gIEFuIG9iamVjdCdzIHR5cGUgaXMKYWNjZXNzZWQgYnkgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgdHlwZSgpYGAuICBUaGVyZSBhcmUgbm8gc3BlY2lhbApvcGVyYXRpb25zIG9uIHR5cGVzLiAgVGhlIHN0YW5kYXJkIG1vZHVsZSBgYHR5cGVzYGAgZGVmaW5lcyBuYW1lcyBmb3IKYWxsIHN0YW5kYXJkIGJ1aWx0LWluIHR5cGVzLgoKVHlwZXMgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiBgYDx0eXBlICdpbnQnPmBgLgpzEgAAAGJsdGluLXR5cGUtb2JqZWN0c3PKBQAACkJvb2xlYW4gb3BlcmF0aW9ucwoqKioqKioqKioqKioqKioqKioKCiAgIG9yX3Rlc3QgIDo6PSBhbmRfdGVzdCB8IG9yX3Rlc3QgIm9yIiBhbmRfdGVzdAogICBhbmRfdGVzdCA6Oj0gbm90X3Rlc3QgfCBhbmRfdGVzdCAiYW5kIiBub3RfdGVzdAogICBub3RfdGVzdCA6Oj0gY29tcGFyaXNvbiB8ICJub3QiIG5vdF90ZXN0CgpJbiB0aGUgY29udGV4dCBvZiBCb29sZWFuIG9wZXJhdGlvbnMsIGFuZCBhbHNvIHdoZW4gZXhwcmVzc2lvbnMgYXJlCnVzZWQgYnkgY29udHJvbCBmbG93IHN0YXRlbWVudHMsIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBpbnRlcnByZXRlZAphcyBmYWxzZTogYGBGYWxzZWBgLCBgYE5vbmVgYCwgbnVtZXJpYyB6ZXJvIG9mIGFsbCB0eXBlcywgYW5kIGVtcHR5CnN0cmluZ3MgYW5kIGNvbnRhaW5lcnMgKGluY2x1ZGluZyBzdHJpbmdzLCB0dXBsZXMsIGxpc3RzLApkaWN0aW9uYXJpZXMsIHNldHMgYW5kIGZyb3plbnNldHMpLiAgQWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQKYXMgdHJ1ZS4gIChTZWUgdGhlIGBgX19ub256ZXJvX18oKWBgIHNwZWNpYWwgbWV0aG9kIGZvciBhIHdheSB0bwpjaGFuZ2UgdGhpcy4pCgpUaGUgb3BlcmF0b3IgYGBub3RgYCB5aWVsZHMgYGBUcnVlYGAgaWYgaXRzIGFyZ3VtZW50IGlzIGZhbHNlLApgYEZhbHNlYGAgb3RoZXJ3aXNlLgoKVGhlIGV4cHJlc3Npb24gYGB4IGFuZCB5YGAgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIGZhbHNlLCBpdHMKdmFsdWUgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgKnkqIGlzIGV2YWx1YXRlZCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZQppcyByZXR1cm5lZC4KClRoZSBleHByZXNzaW9uIGBgeCBvciB5YGAgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIHRydWUsIGl0cwp2YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlCmlzIHJldHVybmVkLgoKKE5vdGUgdGhhdCBuZWl0aGVyIGBgYW5kYGAgbm9yIGBgb3JgYCByZXN0cmljdCB0aGUgdmFsdWUgYW5kIHR5cGUgdGhleQpyZXR1cm4gdG8gYGBGYWxzZWBgIGFuZCBgYFRydWVgYCwgYnV0IHJhdGhlciByZXR1cm4gdGhlIGxhc3QgZXZhbHVhdGVkCmFyZ3VtZW50LiBUaGlzIGlzIHNvbWV0aW1lcyB1c2VmdWwsIGUuZy4sIGlmIGBgc2BgIGlzIGEgc3RyaW5nIHRoYXQKc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcyBlbXB0eSwgdGhlIGV4cHJlc3Npb24KYGBzIG9yICdmb28nYGAgeWllbGRzIHRoZSBkZXNpcmVkIHZhbHVlLiAgQmVjYXVzZSBgYG5vdGBgIGhhcyB0bwppbnZlbnQgYSB2YWx1ZSBhbnl3YXksIGl0IGRvZXMgbm90IGJvdGhlciB0byByZXR1cm4gYSB2YWx1ZSBvZiB0aGUKc2FtZSB0eXBlIGFzIGl0cyBhcmd1bWVudCwgc28gZS5nLiwgYGBub3QgJ2ZvbydgYCB5aWVsZHMgYGBGYWxzZWBgLApub3QgYGAnJ2BgLikKdAgAAABib29sZWFuc3M9AgAAClRoZSBgYGJyZWFrYGAgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKioqCgogICBicmVha19zdG10IDo6PSAiYnJlYWsiCgpgYGJyZWFrYGAgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBgYGZvcmBgIG9yCmBgd2hpbGVgYCBsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24Kd2l0aGluIHRoYXQgbG9vcC4KCkl0IHRlcm1pbmF0ZXMgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AsIHNraXBwaW5nIHRoZSBvcHRpb25hbApgYGVsc2VgYCBjbGF1c2UgaWYgdGhlIGxvb3AgaGFzIG9uZS4KCklmIGEgYGBmb3JgYCBsb29wIGlzIHRlcm1pbmF0ZWQgYnkgYGBicmVha2BgLCB0aGUgbG9vcCBjb250cm9sIHRhcmdldAprZWVwcyBpdHMgY3VycmVudCB2YWx1ZS4KCldoZW4gYGBicmVha2BgIHBhc3NlcyBjb250cm9sIG91dCBvZiBhIGBgdHJ5YGAgc3RhdGVtZW50IHdpdGggYQpgYGZpbmFsbHlgYCBjbGF1c2UsIHRoYXQgYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHkKbGVhdmluZyB0aGUgbG9vcC4KdAUAAABicmVha3P9AAAACkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzCioqKioqKioqKioqKioqKioqKioqKioqKioqCgpvYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kCiAgIGlzIGRlZmluZWQsIGBgeChhcmcxLCBhcmcyLCAuLi4pYGAgaXMgYSBzaG9ydGhhbmQgZm9yCiAgIGBgeC5fX2NhbGxfXyhhcmcxLCBhcmcyLCAuLi4pYGAuCnMOAAAAY2FsbGFibGUtdHlwZXNzxBkAAApDYWxscwoqKioqKgoKQSBjYWxsIGNhbGxzIGEgY2FsbGFibGUgb2JqZWN0IChlLmcuLCBhICpmdW5jdGlvbiopIHdpdGggYSBwb3NzaWJseQplbXB0eSBzZXJpZXMgb2YgKmFyZ3VtZW50cyo6CgogICBjYWxsICAgICAgICAgICAgICAgICA6Oj0gcHJpbWFyeSAiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl0KICAgICAgICAgICAgfCBleHByZXNzaW9uIGdlbmV4cHJfZm9yXSAiKSIKICAgYXJndW1lbnRfbGlzdCAgICAgICAgOjo9IHBvc2l0aW9uYWxfYXJndW1lbnRzIFsiLCIga2V5d29yZF9hcmd1bWVudHNdCiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiAiKiIgZXhwcmVzc2lvbl0gWyIsIiBrZXl3b3JkX2FyZ3VtZW50c10KICAgICAgICAgICAgICAgICAgICAgICBbIiwiICIqKiIgZXhwcmVzc2lvbl0KICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3JkX2FyZ3VtZW50cyBbIiwiICIqIiBleHByZXNzaW9uXQogICAgICAgICAgICAgICAgICAgICAgIFsiLCIgIioqIiBleHByZXNzaW9uXQogICAgICAgICAgICAgICAgICAgICB8ICIqIiBleHByZXNzaW9uIFsiLCIgIioiIGV4cHJlc3Npb25dIFsiLCIgIioqIiBleHByZXNzaW9uXQogICAgICAgICAgICAgICAgICAgICB8ICIqKiIgZXhwcmVzc2lvbgogICBwb3NpdGlvbmFsX2FyZ3VtZW50cyA6Oj0gZXhwcmVzc2lvbiAoIiwiIGV4cHJlc3Npb24pKgogICBrZXl3b3JkX2FyZ3VtZW50cyAgICA6Oj0ga2V5d29yZF9pdGVtICgiLCIga2V5d29yZF9pdGVtKSoKICAga2V5d29yZF9pdGVtICAgICAgICAgOjo9IGlkZW50aWZpZXIgIj0iIGV4cHJlc3Npb24KCkEgdHJhaWxpbmcgY29tbWEgbWF5IGJlIHByZXNlbnQgYWZ0ZXIgdGhlIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQKYXJndW1lbnRzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbWFudGljcy4KClRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYSBjYWxsYWJsZSBvYmplY3QgKHVzZXItZGVmaW5lZApmdW5jdGlvbnMsIGJ1aWx0LWluIGZ1bmN0aW9ucywgbWV0aG9kcyBvZiBidWlsdC1pbiBvYmplY3RzLCBjbGFzcwpvYmplY3RzLCBtZXRob2RzIG9mIGNsYXNzIGluc3RhbmNlcywgYW5kIGNlcnRhaW4gY2xhc3MgaW5zdGFuY2VzCnRoZW1zZWx2ZXMgYXJlIGNhbGxhYmxlOyBleHRlbnNpb25zIG1heSBkZWZpbmUgYWRkaXRpb25hbCBjYWxsYWJsZQpvYmplY3QgdHlwZXMpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsCmlzIGF0dGVtcHRlZC4gIFBsZWFzZSByZWZlciB0byBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZQpzeW50YXggb2YgZm9ybWFsICpwYXJhbWV0ZXIqIGxpc3RzLgoKSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIGZpcnN0IGNvbnZlcnRlZCB0bwpwb3NpdGlvbmFsIGFyZ3VtZW50cywgYXMgZm9sbG93cy4gIEZpcnN0LCBhIGxpc3Qgb2YgdW5maWxsZWQgc2xvdHMgaXMKY3JlYXRlZCBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgdGhlcmUgYXJlIE4gcG9zaXRpb25hbAphcmd1bWVudHMsIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgZmlyc3QgTiBzbG90cy4gIE5leHQsIGZvciBlYWNoCmtleXdvcmQgYXJndW1lbnQsIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZQpjb3JyZXNwb25kaW5nIHNsb3QgKGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBmb3JtYWwKcGFyYW1ldGVyIG5hbWUsIHRoZSBmaXJzdCBzbG90IGlzIHVzZWQsIGFuZCBzbyBvbikuICBJZiB0aGUgc2xvdCBpcwphbHJlYWR5IGZpbGxlZCwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlCnZhbHVlIG9mIHRoZSBhcmd1bWVudCBpcyBwbGFjZWQgaW4gdGhlIHNsb3QsIGZpbGxpbmcgaXQgKGV2ZW4gaWYgdGhlCmV4cHJlc3Npb24gaXMgYGBOb25lYGAsIGl0IGZpbGxzIHRoZSBzbG90KS4gIFdoZW4gYWxsIGFyZ3VtZW50cyBoYXZlCmJlZW4gcHJvY2Vzc2VkLCB0aGUgc2xvdHMgdGhhdCBhcmUgc3RpbGwgdW5maWxsZWQgYXJlIGZpbGxlZCB3aXRoIHRoZQpjb3JyZXNwb25kaW5nIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIChEZWZhdWx0CnZhbHVlcyBhcmUgY2FsY3VsYXRlZCwgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZDsgdGh1cywgYQptdXRhYmxlIG9iamVjdCBzdWNoIGFzIGEgbGlzdCBvciBkaWN0aW9uYXJ5IHVzZWQgYXMgZGVmYXVsdCB2YWx1ZSB3aWxsCmJlIHNoYXJlZCBieSBhbGwgY2FsbHMgdGhhdCBkb24ndCBzcGVjaWZ5IGFuIGFyZ3VtZW50IHZhbHVlIGZvciB0aGUKY29ycmVzcG9uZGluZyBzbG90OyB0aGlzIHNob3VsZCB1c3VhbGx5IGJlIGF2b2lkZWQuKSAgSWYgdGhlcmUgYXJlIGFueQp1bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGEKYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBvZiBmaWxsZWQKc2xvdHMgaXMgdXNlZCBhcyB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIGNhbGwuCgoqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEFuIGltcGxlbWVudGF0aW9uIG1heSBwcm92aWRlCmJ1aWx0LWluIGZ1bmN0aW9ucyB3aG9zZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgZG8gbm90IGhhdmUgbmFtZXMsIGV2ZW4KaWYgdGhleSBhcmUgJ25hbWVkJyBmb3IgdGhlIHB1cnBvc2Ugb2YgZG9jdW1lbnRhdGlvbiwgYW5kIHdoaWNoCnRoZXJlZm9yZSBjYW5ub3QgYmUgc3VwcGxpZWQgYnkga2V5d29yZC4gIEluIENQeXRob24sIHRoaXMgaXMgdGhlIGNhc2UKZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlIGBgUHlBcmdfUGFyc2VUdXBsZSgpYGAgdG8KcGFyc2UgdGhlaXIgYXJndW1lbnRzLgoKSWYgdGhlcmUgYXJlIG1vcmUgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aGVyZSBhcmUgZm9ybWFsIHBhcmFtZXRlcgpzbG90cywgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXIKdXNpbmcgdGhlIHN5bnRheCBgYCppZGVudGlmaWVyYGAgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbApwYXJhbWV0ZXIgcmVjZWl2ZXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHMKKG9yIGFuIGVtcHR5IHR1cGxlIGlmIHRoZXJlIHdlcmUgbm8gZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzKS4KCklmIGFueSBrZXl3b3JkIGFyZ3VtZW50IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBmb3JtYWwgcGFyYW1ldGVyCm5hbWUsIGEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLCB1bmxlc3MgYSBmb3JtYWwgcGFyYW1ldGVyCnVzaW5nIHRoZSBzeW50YXggYGAqKmlkZW50aWZpZXJgYCBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQKZm9ybWFsIHBhcmFtZXRlciByZWNlaXZlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgZXhjZXNzIGtleXdvcmQKYXJndW1lbnRzICh1c2luZyB0aGUga2V5d29yZHMgYXMga2V5cyBhbmQgdGhlIGFyZ3VtZW50IHZhbHVlcyBhcwpjb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZSB3ZXJlIG5vCmV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cy4KCklmIHRoZSBzeW50YXggYGAqZXhwcmVzc2lvbmBgIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsCmBgZXhwcmVzc2lvbmBgIG11c3QgZXZhbHVhdGUgdG8gYW4gaXRlcmFibGUuICBFbGVtZW50cyBmcm9tIHRoaXMKaXRlcmFibGUgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBhcmd1bWVudHM7CmlmIHRoZXJlIGFyZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqeDEqLCAuLi4sICp4TiosIGFuZCBgYGV4cHJlc3Npb25gYApldmFsdWF0ZXMgdG8gYSBzZXF1ZW5jZSAqeTEqLCAuLi4sICp5TSosIHRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGNhbGwKd2l0aCBNK04gcG9zaXRpb25hbCBhcmd1bWVudHMgKngxKiwgLi4uLCAqeE4qLCAqeTEqLCAuLi4sICp5TSouCgpBIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCBhbHRob3VnaCB0aGUgYGAqZXhwcmVzc2lvbmBgIHN5bnRheCBtYXkKYXBwZWFyICphZnRlciogc29tZSBrZXl3b3JkIGFyZ3VtZW50cywgaXQgaXMgcHJvY2Vzc2VkICpiZWZvcmUqIHRoZQprZXl3b3JkIGFyZ3VtZW50cyAoYW5kIHRoZSBgYCoqZXhwcmVzc2lvbmBgIGFyZ3VtZW50LCBpZiBhbnkgLS0gc2VlCmJlbG93KS4gIFNvOgoKICAgPj4+IGRlZiBmKGEsIGIpOgogICAuLi4gIHByaW50IGEsIGIKICAgLi4uCiAgID4+PiBmKGI9MSwgKigyLCkpCiAgIDIgMQogICA+Pj4gZihhPTEsICooMiwpKQogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwogICBUeXBlRXJyb3I6IGYoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50ICdhJwogICA+Pj4gZigxLCAqKDIsKSkKICAgMSAyCgpJdCBpcyB1bnVzdWFsIGZvciBib3RoIGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGUgYGAqZXhwcmVzc2lvbmBgCnN5bnRheCB0byBiZSB1c2VkIGluIHRoZSBzYW1lIGNhbGwsIHNvIGluIHByYWN0aWNlIHRoaXMgY29uZnVzaW9uIGRvZXMKbm90IGFyaXNlLgoKSWYgdGhlIHN5bnRheCBgYCoqZXhwcmVzc2lvbmBgIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsCmBgZXhwcmVzc2lvbmBgIG11c3QgZXZhbHVhdGUgdG8gYSBtYXBwaW5nLCB0aGUgY29udGVudHMgb2Ygd2hpY2ggYXJlCnRyZWF0ZWQgYXMgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4gIEluIHRoZSBjYXNlIG9mIGEga2V5d29yZAphcHBlYXJpbmcgaW4gYm90aCBgYGV4cHJlc3Npb25gYCBhbmQgYXMgYW4gZXhwbGljaXQga2V5d29yZCBhcmd1bWVudCwKYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuCgpGb3JtYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgc3ludGF4IGBgKmlkZW50aWZpZXJgYCBvciBgYCoqaWRlbnRpZmllcmBgCmNhbm5vdCBiZSB1c2VkIGFzIHBvc2l0aW9uYWwgYXJndW1lbnQgc2xvdHMgb3IgYXMga2V5d29yZCBhcmd1bWVudApuYW1lcy4gIEZvcm1hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzeW50YXggYGAoc3VibGlzdClgYCBjYW5ub3QgYmUKdXNlZCBhcyBrZXl3b3JkIGFyZ3VtZW50IG5hbWVzOyB0aGUgb3V0ZXJtb3N0IHN1Ymxpc3QgY29ycmVzcG9uZHMgdG8gYQpzaW5nbGUgdW5uYW1lZCBhcmd1bWVudCBzbG90LCBhbmQgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIGFzc2lnbmVkIHRvCnRoZSBzdWJsaXN0IHVzaW5nIHRoZSB1c3VhbCB0dXBsZSBhc3NpZ25tZW50IHJ1bGVzIGFmdGVyIGFsbCBvdGhlcgpwYXJhbWV0ZXIgcHJvY2Vzc2luZyBpcyBkb25lLgoKQSBjYWxsIGFsd2F5cyByZXR1cm5zIHNvbWUgdmFsdWUsIHBvc3NpYmx5IGBgTm9uZWBgLCB1bmxlc3MgaXQgcmFpc2VzCmFuIGV4Y2VwdGlvbi4gIEhvdyB0aGlzIHZhbHVlIGlzIGNvbXB1dGVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlCmNhbGxhYmxlIG9iamVjdC4KCklmIGl0IGlzLS0tCgphIHVzZXItZGVmaW5lZCBmdW5jdGlvbjoKICAgVGhlIGNvZGUgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCwgcGFzc2luZyBpdCB0aGUKICAgYXJndW1lbnQgbGlzdC4gIFRoZSBmaXJzdCB0aGluZyB0aGUgY29kZSBibG9jayB3aWxsIGRvIGlzIGJpbmQgdGhlCiAgIGZvcm1hbCBwYXJhbWV0ZXJzIHRvIHRoZSBhcmd1bWVudHM7IHRoaXMgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24KICAgKkZ1bmN0aW9uIGRlZmluaXRpb25zKi4gIFdoZW4gdGhlIGNvZGUgYmxvY2sgZXhlY3V0ZXMgYSBgYHJldHVybmBgCiAgIHN0YXRlbWVudCwgdGhpcyBzcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC4KCmEgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kOgogICBUaGUgcmVzdWx0IGlzIHVwIHRvIHRoZSBpbnRlcnByZXRlcjsgc2VlICpCdWlsdC1pbiBGdW5jdGlvbnMqIGZvcgogICB0aGUgZGVzY3JpcHRpb25zIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy4KCmEgY2xhc3Mgb2JqZWN0OgogICBBIG5ldyBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIGlzIHJldHVybmVkLgoKYSBjbGFzcyBpbnN0YW5jZSBtZXRob2Q6CiAgIFRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBpcyBjYWxsZWQsIHdpdGggYW4gYXJndW1lbnQKICAgbGlzdCB0aGF0IGlzIG9uZSBsb25nZXIgdGhhbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY2FsbDogdGhlCiAgIGluc3RhbmNlIGJlY29tZXMgdGhlIGZpcnN0IGFyZ3VtZW50LgoKYSBjbGFzcyBpbnN0YW5jZToKICAgVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgYGBfX2NhbGxfXygpYGAgbWV0aG9kOyB0aGUgZWZmZWN0IGlzIHRoZW4KICAgdGhlIHNhbWUgYXMgaWYgdGhhdCBtZXRob2Qgd2FzIGNhbGxlZC4KdAUAAABjYWxsc3NdCgAACkNsYXNzIGRlZmluaXRpb25zCioqKioqKioqKioqKioqKioqCgpBIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZAp0eXBlIGhpZXJhcmNoeSopOgoKICAgY2xhc3NkZWYgICAgOjo9ICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlCiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2V4cHJlc3Npb25fbGlzdF0gIikiCiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyCgpBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdCBmaXJzdCBldmFsdWF0ZXMgdGhlCmluaGVyaXRhbmNlIGxpc3QsIGlmIHByZXNlbnQuICBFYWNoIGl0ZW0gaW4gdGhlIGluaGVyaXRhbmNlIGxpc3QKc2hvdWxkIGV2YWx1YXRlIHRvIGEgY2xhc3Mgb2JqZWN0IG9yIGNsYXNzIHR5cGUgd2hpY2ggYWxsb3dzCnN1YmNsYXNzaW5nLiAgVGhlIGNsYXNzJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24KZnJhbWUgKHNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsCm5hbWVzcGFjZSBhbmQgdGhlIG9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUKY29udGFpbnMgb25seSBmdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzcydzIHN1aXRlIGZpbmlzaGVzCmV4ZWN1dGlvbiwgaXRzIGV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMKc2F2ZWQuIFs0XSBBIGNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QKZm9yIHRoZSBiYXNlIGNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUKZGljdGlvbmFyeS4gIFRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZQpvcmlnaW5hbCBsb2NhbCBuYW1lc3BhY2UuCgoqKlByb2dyYW1tZXIncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZQpjbGFzcyB2YXJpYWJsZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBhbGwgaW5zdGFuY2VzLiAgVG8gY3JlYXRlIGluc3RhbmNlCnZhcmlhYmxlcywgdGhleSBjYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggYGBzZWxmLm5hbWUgPSB2YWx1ZWBgLgpCb3RoIGNsYXNzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24KImBgc2VsZi5uYW1lYGAiLCBhbmQgYW4gaW5zdGFuY2UgdmFyaWFibGUgaGlkZXMgYSBjbGFzcyB2YXJpYWJsZSB3aXRoCnRoZSBzYW1lIG5hbWUgd2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gQ2xhc3MgdmFyaWFibGVzIGNhbiBiZSB1c2VkCmFzIGRlZmF1bHRzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4KbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMuICBGb3IgKm5ldy1zdHlsZSBjbGFzcyplcywgZGVzY3JpcHRvcnMgY2FuCmJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbgpkZXRhaWxzLgoKQ2xhc3MgZGVmaW5pdGlvbnMsIGxpa2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvcgptb3JlICpkZWNvcmF0b3IqIGV4cHJlc3Npb25zLiAgVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IKZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBmdW5jdGlvbnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzcwpvYmplY3QsIHdoaWNoIGlzIHRoZW4gYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuCgotWyBGb290bm90ZXMgXS0KClsxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzIHRoZXJlCiAgICBpcyBhIGBgZmluYWxseWBgIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXIgZXhjZXB0aW9uLgogICAgVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LgoKWzJdIEN1cnJlbnRseSwgY29udHJvbCAiZmxvd3Mgb2ZmIHRoZSBlbmQiIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhbgogICAgZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSBgYHJldHVybmBgLCBgYGNvbnRpbnVlYGAsIG9yCiAgICBgYGJyZWFrYGAgc3RhdGVtZW50LgoKWzNdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uCiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uJ3MgYGBfX2RvY19fYGAgYXR0cmlidXRlIGFuZAogICAgdGhlcmVmb3JlIHRoZSBmdW5jdGlvbidzICpkb2NzdHJpbmcqLgoKWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzCiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZSdzIGBgX19kb2NfX2BgIGl0ZW0gYW5kCiAgICB0aGVyZWZvcmUgdGhlIGNsYXNzJ3MgKmRvY3N0cmluZyouCnQFAAAAY2xhc3NzuRUAAApDb21wYXJpc29ucwoqKioqKioqKioqKgoKVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksCndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZQpvcGVyYXRpb24uICBBbHNvIHVubGlrZSBDLCBleHByZXNzaW9ucyBsaWtlIGBgYSA8IGIgPCBjYGAgaGF2ZSB0aGUKaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6CgogICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByICggY29tcF9vcGVyYXRvciBvcl9leHByICkqCiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICI8PiIgfCAiIT0iCiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iCgpDb21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogYGBUcnVlYGAgb3IgYGBGYWxzZWBgLgoKQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sIGBgeCA8IHkgPD0gemBgIGlzCmVxdWl2YWxlbnQgdG8gYGB4IDwgeSBhbmQgeSA8PSB6YGAsIGV4Y2VwdCB0aGF0IGBgeWBgIGlzIGV2YWx1YXRlZApvbmx5IG9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzIGBgemBgIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gYGB4IDwKeWBgIGlzIGZvdW5kIHRvIGJlIGZhbHNlKS4KCkZvcm1hbGx5LCBpZiAqYSosICpiKiwgKmMqLCAuLi4sICp5KiwgKnoqIGFyZSBleHByZXNzaW9ucyBhbmQgKm9wMSosCipvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiBgYGEgb3AxIGIgb3AyIGMgLi4uIHkKb3BOIHpgYCBpcyBlcXVpdmFsZW50IHRvIGBgYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHpgYCwKZXhjZXB0IHRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuCgpOb3RlIHRoYXQgYGBhIG9wMSBiIG9wMiBjYGAgZG9lc24ndCBpbXBseSBhbnkga2luZCBvZiBjb21wYXJpc29uCmJldHdlZW4gKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sIGBgeCA8IHkgPiB6YGAgaXMgcGVyZmVjdGx5IGxlZ2FsCih0aG91Z2ggcGVyaGFwcyBub3QgcHJldHR5KS4KClRoZSBmb3JtcyBgYDw+YGAgYW5kIGBgIT1gYCBhcmUgZXF1aXZhbGVudDsgZm9yIGNvbnNpc3RlbmN5IHdpdGggQywKYGAhPWBgIGlzIHByZWZlcnJlZDsgd2hlcmUgYGAhPWBgIGlzIG1lbnRpb25lZCBiZWxvdyBgYDw+YGAgaXMgYWxzbwphY2NlcHRlZC4gIFRoZSBgYDw+YGAgc3BlbGxpbmcgaXMgY29uc2lkZXJlZCBvYnNvbGVzY2VudC4KClRoZSBvcGVyYXRvcnMgYGA8YGAsIGBgPmBgLCBgYD09YGAsIGBgPj1gYCwgYGA8PWBgLCBhbmQgYGAhPWBgIGNvbXBhcmUKdGhlIHZhbHVlcyBvZiB0d28gb2JqZWN0cy4gIFRoZSBvYmplY3RzIG5lZWQgbm90IGhhdmUgdGhlIHNhbWUgdHlwZS4KSWYgYm90aCBhcmUgbnVtYmVycywgdGhleSBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBPdGhlcndpc2UsCm9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzICphbHdheXMqIGNvbXBhcmUgdW5lcXVhbCwgYW5kIGFyZSBvcmRlcmVkCmNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuIFlvdSBjYW4gY29udHJvbCBjb21wYXJpc29uIGJlaGF2aW9yIG9mCm9iamVjdHMgb2Ygbm9uLWJ1aWx0LWluIHR5cGVzIGJ5IGRlZmluaW5nIGEgYGBfX2NtcF9fYGAgbWV0aG9kIG9yIHJpY2gKY29tcGFyaXNvbiBtZXRob2RzIGxpa2UgYGBfX2d0X19gYCwgZGVzY3JpYmVkIGluIHNlY3Rpb24gKlNwZWNpYWwKbWV0aG9kIG5hbWVzKi4KCihUaGlzIHVudXN1YWwgZGVmaW5pdGlvbiBvZiBjb21wYXJpc29uIHdhcyB1c2VkIHRvIHNpbXBsaWZ5IHRoZQpkZWZpbml0aW9uIG9mIG9wZXJhdGlvbnMgbGlrZSBzb3J0aW5nIGFuZCB0aGUgYGBpbmBgIGFuZCBgYG5vdCBpbmBgCm9wZXJhdG9ycy4gSW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBhcmlzb24gcnVsZXMgZm9yIG9iamVjdHMgb2YKZGlmZmVyZW50IHR5cGVzIGFyZSBsaWtlbHkgdG8gY2hhbmdlLikKCkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGRlcGVuZHMgb24gdGhlIHR5cGU6CgoqIE51bWJlcnMgYXJlIGNvbXBhcmVkIGFyaXRobWV0aWNhbGx5LgoKKiBTdHJpbmdzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpYyBlcXVpdmFsZW50cwogICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYG9yZCgpYGApIG9mIHRoZWlyIGNoYXJhY3RlcnMuCiAgVW5pY29kZSBhbmQgOC1iaXQgc3RyaW5ncyBhcmUgZnVsbHkgaW50ZXJvcGVyYWJsZSBpbiB0aGlzIGJlaGF2aW9yLgogIFs0XQoKKiBUdXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyBjb21wYXJpc29uIG9mCiAgY29ycmVzcG9uZGluZyBlbGVtZW50cy4gIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBlYWNoCiAgZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWUKICB0eXBlIGFuZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KCiAgSWYgbm90IGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGZpcnN0CiAgZGlmZmVyaW5nIGVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIGBgY21wKFsxLDIseF0sIFsxLDIseV0pYGAgcmV0dXJucwogIHRoZSBzYW1lIGFzIGBgY21wKHgseSlgYC4gIElmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZG9lcyBub3QKICBleGlzdCwgdGhlIHNob3J0ZXIgc2VxdWVuY2UgaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsIGBgWzEsMl0gPAogIFsxLDIsM11gYCkuCgoqIE1hcHBpbmdzIChkaWN0aW9uYXJpZXMpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlaXIgc29ydGVkCiAgKGtleSwgdmFsdWUpIGxpc3RzIGNvbXBhcmUgZXF1YWwuIFs1XSBPdXRjb21lcyBvdGhlciB0aGFuIGVxdWFsaXR5CiAgYXJlIHJlc29sdmVkIGNvbnNpc3RlbnRseSwgYnV0IGFyZSBub3Qgb3RoZXJ3aXNlIGRlZmluZWQuIFs2XQoKKiBNb3N0IG90aGVyIG9iamVjdHMgb2YgYnVpbHQtaW4gdHlwZXMgY29tcGFyZSB1bmVxdWFsIHVubGVzcyB0aGV5IGFyZQogIHRoZSBzYW1lIG9iamVjdDsgdGhlIGNob2ljZSB3aGV0aGVyIG9uZSBvYmplY3QgaXMgY29uc2lkZXJlZCBzbWFsbGVyCiAgb3IgbGFyZ2VyIHRoYW4gYW5vdGhlciBvbmUgaXMgbWFkZSBhcmJpdHJhcmlseSBidXQgY29uc2lzdGVudGx5CiAgd2l0aGluIG9uZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtLgoKVGhlIG9wZXJhdG9ycyBgYGluYGAgYW5kIGBgbm90IGluYGAgdGVzdCBmb3IgY29sbGVjdGlvbiBtZW1iZXJzaGlwLgpgYHggaW4gc2BgIGV2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiB0aGUgY29sbGVjdGlvbiAqcyosCmFuZCBmYWxzZSBvdGhlcndpc2UuICBgYHggbm90IGluIHNgYCByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBgYHggaW4Kc2BgLiBUaGUgY29sbGVjdGlvbiBtZW1iZXJzaGlwIHRlc3QgaGFzIHRyYWRpdGlvbmFsbHkgYmVlbiBib3VuZCB0bwpzZXF1ZW5jZXM7IGFuIG9iamVjdCBpcyBhIG1lbWJlciBvZiBhIGNvbGxlY3Rpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXMKYSBzZXF1ZW5jZSBhbmQgY29udGFpbnMgYW4gZWxlbWVudCBlcXVhbCB0byB0aGF0IG9iamVjdC4gIEhvd2V2ZXIsIGl0Cm1ha2Ugc2Vuc2UgZm9yIG1hbnkgb3RoZXIgb2JqZWN0IHR5cGVzIHRvIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0cwp3aXRob3V0IGJlaW5nIGEgc2VxdWVuY2UuICBJbiBwYXJ0aWN1bGFyLCBkaWN0aW9uYXJpZXMgKGZvciBrZXlzKSBhbmQKc2V0cyBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdGluZy4KCkZvciB0aGUgbGlzdCBhbmQgdHVwbGUgdHlwZXMsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZQpleGlzdHMgYW4gaW5kZXggKmkqIHN1Y2ggdGhhdCBgYHggPT0geVtpXWBgIGlzIHRydWUuCgpGb3IgdGhlIFVuaWNvZGUgYW5kIHN0cmluZyB0eXBlcywgYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmCip4KiBpcyBhIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgYGB5LmZpbmQoeCkgIT0gLTFgYC4KTm90ZSwgKngqIGFuZCAqeSogbmVlZCBub3QgYmUgdGhlIHNhbWUgdHlwZTsgY29uc2VxdWVudGx5LCBgYHUnYWInIGluCidhYmMnYGAgd2lsbCByZXR1cm4gYGBUcnVlYGAuIEVtcHR5IHN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvCmJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsIHNvIGBgIiIgaW4gImFiYyJgYCB3aWxsIHJldHVybgpgYFRydWVgYC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksICp4KiB3YXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcgb2YKbGVuZ3RoIGBgMWBgLgoKRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgYGBfX2NvbnRhaW5zX18oKWBgIG1ldGhvZCwKYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIGBgeS5fX2NvbnRhaW5zX18oeClgYCBpcyB0cnVlLgoKRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgYGBfX2NvbnRhaW5zX18oKWBgIGJ1dCBkbwpkZWZpbmUgYGBfX2l0ZXJfXygpYGAsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlIGBgemBgIHdpdGggYGB4Cj09IHpgYCBpcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciBgYHlgYC4gIElmIGFuIGV4Y2VwdGlvbiBpcwpyYWlzZWQgZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmIGBgaW5gYCByYWlzZWQgdGhhdCBleGNlcHRpb24uCgpMYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXMKYGBfX2dldGl0ZW1fXygpYGAsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi0KbmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0IGBgeCA9PSB5W2ldYGAsIGFuZCBhbGwgbG93ZXIKaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSBgYEluZGV4RXJyb3JgYCBleGNlcHRpb24uIChJZiBhbnkgb3RoZXIKZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgYGBpbmBgIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuCgpUaGUgb3BlcmF0b3IgYGBub3QgaW5gYCBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZgpgYGluYGAuCgpUaGUgb3BlcmF0b3JzIGBgaXNgYCBhbmQgYGBpcyBub3RgYCB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6IGBgeCBpcwp5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgYGB4IGlzCm5vdCB5YGAgeWllbGRzIHRoZSBpbnZlcnNlIHRydXRoIHZhbHVlLiBbN10KdAsAAABjb21wYXJpc29uc3PnTwAACkNvbXBvdW5kIHN0YXRlbWVudHMKKioqKioqKioqKioqKioqKioqKgoKQ29tcG91bmQgc3RhdGVtZW50cyBjb250YWluIChncm91cHMgb2YpIG90aGVyIHN0YXRlbWVudHM7IHRoZXkgYWZmZWN0Cm9yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgSW4KZ2VuZXJhbCwgY29tcG91bmQgc3RhdGVtZW50cyBzcGFuIG11bHRpcGxlIGxpbmVzLCBhbHRob3VnaCBpbiBzaW1wbGUKaW5jYXJuYXRpb25zIGEgd2hvbGUgY29tcG91bmQgc3RhdGVtZW50IG1heSBiZSBjb250YWluZWQgaW4gb25lIGxpbmUuCgpUaGUgYGBpZmBgLCBgYHdoaWxlYGAgYW5kIGBgZm9yYGAgc3RhdGVtZW50cyBpbXBsZW1lbnQgdHJhZGl0aW9uYWwKY29udHJvbCBmbG93IGNvbnN0cnVjdHMuICBgYHRyeWBgIHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yCmNsZWFudXAgY29kZSBmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzLiAgRnVuY3Rpb24gYW5kIGNsYXNzCmRlZmluaXRpb25zIGFyZSBhbHNvIHN5bnRhY3RpY2FsbHkgY29tcG91bmQgc3RhdGVtZW50cy4KCkNvbXBvdW5kIHN0YXRlbWVudHMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSAnY2xhdXNlcy4nICBBIGNsYXVzZQpjb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSAnc3VpdGUuJyAgVGhlIGNsYXVzZSBoZWFkZXJzIG9mIGEKcGFydGljdWxhciBjb21wb3VuZCBzdGF0ZW1lbnQgYXJlIGFsbCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbC4KRWFjaCBjbGF1c2UgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdW5pcXVlbHkgaWRlbnRpZnlpbmcga2V5d29yZCBhbmQgZW5kcwp3aXRoIGEgY29sb24uICBBIHN1aXRlIGlzIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cyBjb250cm9sbGVkIGJ5IGEKY2xhdXNlLiAgQSBzdWl0ZSBjYW4gYmUgb25lIG9yIG1vcmUgc2VtaWNvbG9uLXNlcGFyYXRlZCBzaW1wbGUKc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBoZWFkZXIsIGZvbGxvd2luZyB0aGUgaGVhZGVyJ3MKY29sb24sIG9yIGl0IGNhbiBiZSBvbmUgb3IgbW9yZSBpbmRlbnRlZCBzdGF0ZW1lbnRzIG9uIHN1YnNlcXVlbnQKbGluZXMuICBPbmx5IHRoZSBsYXR0ZXIgZm9ybSBvZiBzdWl0ZSBjYW4gY29udGFpbiBuZXN0ZWQgY29tcG91bmQKc3RhdGVtZW50czsgdGhlIGZvbGxvd2luZyBpcyBpbGxlZ2FsLCBtb3N0bHkgYmVjYXVzZSBpdCB3b3VsZG4ndCBiZQpjbGVhciB0byB3aGljaCBgYGlmYGAgY2xhdXNlIGEgZm9sbG93aW5nIGBgZWxzZWBgIGNsYXVzZSB3b3VsZCBiZWxvbmc6CgogICBpZiB0ZXN0MTogaWYgdGVzdDI6IHByaW50IHgKCkFsc28gbm90ZSB0aGF0IHRoZSBzZW1pY29sb24gYmluZHMgdGlnaHRlciB0aGFuIHRoZSBjb2xvbiBpbiB0aGlzCmNvbnRleHQsIHNvIHRoYXQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBlaXRoZXIgYWxsIG9yIG5vbmUgb2YgdGhlCmBgcHJpbnRgYCBzdGF0ZW1lbnRzIGFyZSBleGVjdXRlZDoKCiAgIGlmIHggPCB5IDwgejogcHJpbnQgeDsgcHJpbnQgeTsgcHJpbnQgegoKU3VtbWFyaXppbmc6CgogICBjb21wb3VuZF9zdG10IDo6PSBpZl9zdG10CiAgICAgICAgICAgICAgICAgICAgIHwgd2hpbGVfc3RtdAogICAgICAgICAgICAgICAgICAgICB8IGZvcl9zdG10CiAgICAgICAgICAgICAgICAgICAgIHwgdHJ5X3N0bXQKICAgICAgICAgICAgICAgICAgICAgfCB3aXRoX3N0bXQKICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmCiAgICAgICAgICAgICAgICAgICAgIHwgY2xhc3NkZWYKICAgICAgICAgICAgICAgICAgICAgfCBkZWNvcmF0ZWQKICAgc3VpdGUgICAgICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBORVdMSU5FIElOREVOVCBzdGF0ZW1lbnQrIERFREVOVAogICBzdGF0ZW1lbnQgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IGNvbXBvdW5kX3N0bXQKICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdCgpOb3RlIHRoYXQgc3RhdGVtZW50cyBhbHdheXMgZW5kIGluIGEgYGBORVdMSU5FYGAgcG9zc2libHkgZm9sbG93ZWQgYnkKYSBgYERFREVOVGBgLiBBbHNvIG5vdGUgdGhhdCBvcHRpb25hbCBjb250aW51YXRpb24gY2xhdXNlcyBhbHdheXMKYmVnaW4gd2l0aCBhIGtleXdvcmQgdGhhdCBjYW5ub3Qgc3RhcnQgYSBzdGF0ZW1lbnQsIHRodXMgdGhlcmUgYXJlIG5vCmFtYmlndWl0aWVzICh0aGUgJ2RhbmdsaW5nIGBgZWxzZWBgJyBwcm9ibGVtIGlzIHNvbHZlZCBpbiBQeXRob24gYnkKcmVxdWlyaW5nIG5lc3RlZCBgYGlmYGAgc3RhdGVtZW50cyB0byBiZSBpbmRlbnRlZCkuCgpUaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHBsYWNlcwplYWNoIGNsYXVzZSBvbiBhIHNlcGFyYXRlIGxpbmUgZm9yIGNsYXJpdHkuCgoKVGhlIGBgaWZgYCBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09PT0KClRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjoKCiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUKICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSoKICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCgpJdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgb25lCmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucyoKZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkCihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgYGBpZmBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLgpJZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYKcHJlc2VudCwgaXMgZXhlY3V0ZWQuCgoKVGhlIGBgd2hpbGVgYCBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBgYHdoaWxlYGAgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuCmV4cHJlc3Npb24gaXMgdHJ1ZToKCiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGUKICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCgpUaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGUKZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWUKaXQgaXMgdGVzdGVkKSB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMKZXhlY3V0ZWQgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuCgpBIGBgYnJlYWtgYCBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3AKd2l0aG91dCBleGVjdXRpbmcgdGhlIGBgZWxzZWBgIGNsYXVzZSdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGAKc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kCmdvZXMgYmFjayB0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLgoKClRoZSBgYGZvcmBgIHN0YXRlbWVudAo9PT09PT09PT09PT09PT09PT09PT0KClRoZSBgYGZvcmBgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYQpzZXF1ZW5jZSAoc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OgoKICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCgpUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGUKb2JqZWN0LiAgQW4gaXRlcmF0b3IgaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3VsdCBvZiB0aGUKYGBleHByZXNzaW9uX2xpc3RgYC4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggaXRlbQpwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciBvZiBhc2NlbmRpbmcgaW5kaWNlcy4gIEVhY2gKaXRlbSBpbiB0dXJuIGlzIGFzc2lnbmVkIHRvIHRoZSB0YXJnZXQgbGlzdCB1c2luZyB0aGUgc3RhbmRhcmQgcnVsZXMKZm9yIGFzc2lnbm1lbnRzLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXMgZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmUKZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSksIHRoZSBzdWl0ZQppbiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZCwgYW5kIHRoZSBsb29wCnRlcm1pbmF0ZXMuCgpBIGBgYnJlYWtgYCBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3AKd2l0aG91dCBleGVjdXRpbmcgdGhlIGBgZWxzZWBgIGNsYXVzZSdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGAKc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kCmNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlIGBgZWxzZWBgIGNsYXVzZSBpZiB0aGVyZSB3YXMKbm8gbmV4dCBpdGVtLgoKVGhlIHN1aXRlIG1heSBhc3NpZ24gdG8gdGhlIHZhcmlhYmxlKHMpIGluIHRoZSB0YXJnZXQgbGlzdDsgdGhpcyBkb2VzCm5vdCBhZmZlY3QgdGhlIG5leHQgaXRlbSBhc3NpZ25lZCB0byBpdC4KClRoZSB0YXJnZXQgbGlzdCBpcyBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLCBidXQgaWYgdGhlCnNlcXVlbmNlIGlzIGVtcHR5LCBpdCB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXQgYWxsIGJ5IHRoZQpsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgcmFuZ2UoKWBgIHJldHVybnMgYSBzZXF1ZW5jZSBvZgppbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsJ3MgYGBmb3IgaSA6PSBhIHRvIGIKZG9gYDsgZS5nLiwgYGByYW5nZSgzKWBgIHJldHVybnMgdGhlIGxpc3QgYGBbMCwgMSwgMl1gYC4KCk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIGxvb3AKICAodGhpcyBjYW4gb25seSBvY2N1ciBmb3IgbXV0YWJsZSBzZXF1ZW5jZXMsIGkuZS4gbGlzdHMpLiBBbiBpbnRlcm5hbAogIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LCBhbmQgdGhpcwogIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlCiAgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGUgbG9vcCB0ZXJtaW5hdGVzLiAgVGhpcyBtZWFucyB0aGF0IGlmIHRoZQogIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSB0aGUgc2VxdWVuY2UsCiAgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mIHRoZQogIGN1cnJlbnQgaXRlbSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHRyZWF0ZWQpLiAgTGlrZXdpc2UsIGlmIHRoZQogIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZQogIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLgogIFRoaXMgY2FuIGxlYWQgdG8gbmFzdHkgYnVncyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyBhCiAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sCgogICAgIGZvciB4IGluIGFbOl06CiAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KQoKClRoZSBgYHRyeWBgIHN0YXRlbWVudAo9PT09PT09PT09PT09PT09PT09PT0KClRoZSBgYHRyeWBgIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGUKZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czoKCiAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10CiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsoImFzIiB8ICIsIikgdGFyZ2V0XV0gIjoiIHN1aXRlKSsKICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV0KICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGUKICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlCgpDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24sCmBgdHJ5YGAuLi5gYGV4Y2VwdGBgLi4uYGBmaW5hbGx5YGAgZGlkIG5vdCB3b3JrLiBgYHRyeWBgLi4uYGBleGNlcHRgYApoYWQgdG8gYmUgbmVzdGVkIGluIGBgdHJ5YGAuLi5gYGZpbmFsbHlgYC4KClRoZSBgYGV4Y2VwdGBgIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlbgpubyBleGNlcHRpb24gb2NjdXJzIGluIHRoZSBgYHRyeWBgIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXMKZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgYGB0cnlgYCBzdWl0ZSwgYSBzZWFyY2ggZm9yCmFuIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0CmNsYXVzZXMgaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBbgpleHByZXNzaW9uLWxlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzCmFueSBleGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQKZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUKcmVzdWx0aW5nIG9iamVjdCBpcyAiY29tcGF0aWJsZSIgd2l0aCB0aGUgZXhjZXB0aW9uLiAgQW4gb2JqZWN0IGlzCmNvbXBhdGlibGUgd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGUKZXhjZXB0aW9uIG9iamVjdCwgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZQpleGNlcHRpb24uCgpJZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uCmhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiBzdGFjay4KWzFdCgpJZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0IGNsYXVzZQpyYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kCmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uCnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgYGB0cnlgYCBzdGF0ZW1lbnQKcmFpc2VkIHRoZSBleGNlcHRpb24pLgoKV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG8KdGhlIHRhcmdldCBzcGVjaWZpZWQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBhbmQgdGhlIGV4Y2VwdApjbGF1c2UncyBzdWl0ZSBpcyBleGVjdXRlZC4gIEFsbCBleGNlcHQgY2xhdXNlcyBtdXN0IGhhdmUgYW4KZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzIHJlYWNoZWQsIGV4ZWN1dGlvbgpjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgc3RhdGVtZW50LiAgKFRoaXMgbWVhbnMgdGhhdAppZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSBleGNlcHRpb24sIGFuZCB0aGUgZXhjZXB0aW9uCm9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgdGhlIG91dGVyIGhhbmRsZXIgd2lsbApub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKQoKQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2UncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGUKZXhjZXB0aW9uIGFyZSBhc3NpZ25lZCB0byB0aHJlZSB2YXJpYWJsZXMgaW4gdGhlIGBgc3lzYGAgbW9kdWxlOgpgYHN5cy5leGNfdHlwZWBgIHJlY2VpdmVzIHRoZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIGV4Y2VwdGlvbjsKYGBzeXMuZXhjX3ZhbHVlYGAgcmVjZWl2ZXMgdGhlIGV4Y2VwdGlvbidzIHBhcmFtZXRlcjsKYGBzeXMuZXhjX3RyYWNlYmFja2BgIHJlY2VpdmVzIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZQpzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGUgcHJvZ3JhbSB3aGVyZQp0aGUgZXhjZXB0aW9uIG9jY3VycmVkLiBUaGVzZSBkZXRhaWxzIGFyZSBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZQpgYHN5cy5leGNfaW5mbygpYGAgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgYSB0dXBsZSBgYChleGNfdHlwZSwKZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrKWBgLiAgVXNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcyBpcwpkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoaXMgZnVuY3Rpb24sIHNpbmNlIHRoZWlyIHVzZSBpcyB1bnNhZmUgaW4gYQp0aHJlYWRlZCBwcm9ncmFtLiAgQXMgb2YgUHl0aG9uIDEuNSwgdGhlIHZhcmlhYmxlcyBhcmUgcmVzdG9yZWQgdG8KdGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvbgp0aGF0IGhhbmRsZWQgYW4gZXhjZXB0aW9uLgoKVGhlIG9wdGlvbmFsIGBgZWxzZWBgIGNsYXVzZSBpcyBleGVjdXRlZCBpZiBhbmQgd2hlbiBjb250cm9sIGZsb3dzIG9mZgp0aGUgZW5kIG9mIHRoZSBgYHRyeWBgIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlIGBgZWxzZWBgIGNsYXVzZQphcmUgbm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBgYGV4Y2VwdGBgIGNsYXVzZXMuCgpJZiBgYGZpbmFsbHlgYCBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSAnY2xlYW51cCcgaGFuZGxlci4gIFRoZQpgYHRyeWBgIGNsYXVzZSBpcyBleGVjdXRlZCwgaW5jbHVkaW5nIGFueSBgYGV4Y2VwdGBgIGFuZCBgYGVsc2VgYApjbGF1c2VzLiAgSWYgYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdApoYW5kbGVkLCB0aGUgZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgYGBmaW5hbGx5YGAgY2xhdXNlIGlzCmV4ZWN1dGVkLiAgSWYgdGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24sIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kCm9mIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuIElmIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UgcmFpc2VzIGFub3RoZXIKZXhjZXB0aW9uIG9yIGV4ZWN1dGVzIGEgYGByZXR1cm5gYCBvciBgYGJyZWFrYGAgc3RhdGVtZW50LCB0aGUgc2F2ZWQKZXhjZXB0aW9uIGlzIGRpc2NhcmRlZDoKCiAgIGRlZiBmKCk6CiAgICAgICB0cnk6CiAgICAgICAgICAgMS8wCiAgICAgICBmaW5hbGx5OgogICAgICAgICAgIHJldHVybiA0MgoKICAgPj4+IGYoKQogICA0MgoKVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZwpleGVjdXRpb24gb2YgdGhlIGBgZmluYWxseWBgIGNsYXVzZS4KCldoZW4gYSBgYHJldHVybmBgLCBgYGJyZWFrYGAgb3IgYGBjb250aW51ZWBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpbgp0aGUgYGB0cnlgYCBzdWl0ZSBvZiBhIGBgdHJ5YGAuLi5gYGZpbmFsbHlgYCBzdGF0ZW1lbnQsIHRoZQpgYGZpbmFsbHlgYCBjbGF1c2UgaXMgYWxzbyBleGVjdXRlZCAnb24gdGhlIHdheSBvdXQuJyBBIGBgY29udGludWVgYApzdGF0ZW1lbnQgaXMgaWxsZWdhbCBpbiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhCnByb2JsZW0gd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmUKbGlmdGVkIGluIHRoZSBmdXR1cmUpLgoKQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uCipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBgYHJhaXNlYGAgc3RhdGVtZW50IHRvCmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLgoKClRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09PT09PQoKTmV3IGluIHZlcnNpb24gMi41LgoKVGhlIGBgd2l0aGBgIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrIHdpdGgKbWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnQKQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb24KYGB0cnlgYC4uLmBgZXhjZXB0YGAuLi5gYGZpbmFsbHlgYCB1c2FnZSBwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQKZm9yIGNvbnZlbmllbnQgcmV1c2UuCgogICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGUKICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF0KClRoZSBleGVjdXRpb24gb2YgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgYXMKZm9sbG93czoKCjEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBgYHdpdGhfaXRlbWBgKQogICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLgoKMi4gVGhlIGNvbnRleHQgbWFuYWdlcidzIGBgX19leGl0X18oKWBgIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLgoKMy4gVGhlIGNvbnRleHQgbWFuYWdlcidzIGBgX19lbnRlcl9fKClgYCBtZXRob2QgaXMgaW52b2tlZC4KCjQuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgYGB3aXRoYGAgc3RhdGVtZW50LCB0aGUgcmV0dXJuCiAgIHZhbHVlIGZyb20gYGBfX2VudGVyX18oKWBgIGlzIGFzc2lnbmVkIHRvIGl0LgoKICAgTm90ZTogVGhlIGBgd2l0aGBgIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlIGBgX19lbnRlcl9fKClgYAogICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gYGBfX2V4aXRfXygpYGAgd2lsbCBhbHdheXMKICAgICBiZSBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlCiAgICAgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhbiBlcnJvciBvY2N1cnJpbmcKICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LgoKNS4gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLgoKNi4gVGhlIGNvbnRleHQgbWFuYWdlcidzIGBgX19leGl0X18oKWBgIG1ldGhvZCBpcyBpbnZva2VkLiBJZiBhbgogICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kCiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBgYF9fZXhpdF9fKClgYC4gT3RoZXJ3aXNlLAogICB0aHJlZSBgYE5vbmVgYCBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLgoKICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWUKICAgZnJvbSB0aGUgYGBfX2V4aXRfXygpYGAgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcwogICByZXJhaXNlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcwogICBzdXBwcmVzc2VkLCBhbmQgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nCiAgIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQuCgogICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlCiAgIHJldHVybiB2YWx1ZSBmcm9tIGBgX19leGl0X18oKWBgIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gcHJvY2VlZHMKICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi4KCldpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmCm11bHRpcGxlIGBgd2l0aGBgIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6CgogICB3aXRoIEEoKSBhcyBhLCBCKCkgYXMgYjoKICAgICAgIHN1aXRlCgppcyBlcXVpdmFsZW50IHRvCgogICB3aXRoIEEoKSBhcyBhOgogICAgICAgd2l0aCBCKCkgYXMgYjoKICAgICAgICAgICBzdWl0ZQoKTm90ZTogSW4gUHl0aG9uIDIuNSwgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCBpcyBvbmx5IGFsbG93ZWQgd2hlbiB0aGUKICBgYHdpdGhfc3RhdGVtZW50YGAgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgSXQgaXMgYWx3YXlzIGVuYWJsZWQKICBpbiBQeXRob24gMi42LgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy4KClNlZSBhbHNvOgoKICAgKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnQKICAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbgogICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuCgoKRnVuY3Rpb24gZGVmaW5pdGlvbnMKPT09PT09PT09PT09PT09PT09PT0KCkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAoc2VlCnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopOgoKICAgZGVjb3JhdGVkICAgICAgOjo9IGRlY29yYXRvcnMgKGNsYXNzZGVmIHwgZnVuY2RlZikKICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcisKICAgZGVjb3JhdG9yICAgICAgOjo9ICJAIiBkb3R0ZWRfbmFtZSBbIigiIFthcmd1bWVudF9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkUKICAgZnVuY2RlZiAgICAgICAgOjo9ICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIiAiOiIgc3VpdGUKICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSoKICAgcGFyYW1ldGVyX2xpc3QgOjo9IChkZWZwYXJhbWV0ZXIgIiwiKSoKICAgICAgICAgICAgICAgICAgICAgICggICIqIiBpZGVudGlmaWVyIFsiLCIgIioqIiBpZGVudGlmaWVyXQogICAgICAgICAgICAgICAgICAgICAgfCAiKioiIGlkZW50aWZpZXIKICAgICAgICAgICAgICAgICAgICAgIHwgZGVmcGFyYW1ldGVyIFsiLCJdICkKICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dCiAgIHN1Ymxpc3QgICAgICAgIDo6PSBwYXJhbWV0ZXIgKCIsIiBwYXJhbWV0ZXIpKiBbIiwiXQogICBwYXJhbWV0ZXIgICAgICA6Oj0gaWRlbnRpZmllciB8ICIoIiBzdWJsaXN0ICIpIgogICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllcgoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXRzIGV4ZWN1dGlvbiBiaW5kcwp0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3QKKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXMKZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBuYW1lc3BhY2UKYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCgpUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBib2R5OyB0aGlzIGdldHMKZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXQoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqCmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcwpkZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZQpyZXN1bHQgbXVzdCBiZSBhIGNhbGxhYmxlLCB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIGZ1bmN0aW9uIG9iamVjdAphcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lCmluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4KbmVzdGVkIGZhc2hpb24uIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGU6CgogICBAZjEoYXJnKQogICBAZjIKICAgZGVmIGZ1bmMoKTogcGFzcwoKaXMgZXF1aXZhbGVudCB0bzoKCiAgIGRlZiBmdW5jKCk6IHBhc3MKICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpCgpXaGVuIG9uZSBvciBtb3JlIHRvcC1sZXZlbCAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKgpgYD1gYCAqZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyCnZhbHVlcy4iICBGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nCiphcmd1bWVudCogbWF5IGJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlcidzCmRlZmF1bHQgdmFsdWUgaXMgc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGwKZm9sbG93aW5nIHBhcmFtZXRlcnMgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSB0aGlzIGlzIGEKc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci4KCioqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbgppcyBleGVjdXRlZC4qKiAgVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBvbmNlLCB3aGVuCnRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAicHJlLWNvbXB1dGVkIiB2YWx1ZSBpcwp1c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hlbiBhCmRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggYXMgYSBsaXN0IG9yIGEgZGljdGlvbmFyeToKaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gYnkgYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYQpsaXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLiBUaGlzIGlzIGdlbmVyYWxseSBub3QKd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyAgaXMgdG8gdXNlIGBgTm9uZWBgIGFzIHRoZQpkZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIGUuZy46CgogICBkZWYgd2hhdHNfb25fdGhlX3RlbGx5KHBlbmd1aW49Tm9uZSk6CiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6CiAgICAgICAgICAgcGVuZ3VpbiA9IFtdCiAgICAgICBwZW5ndWluLmFwcGVuZCgicHJvcGVydHkgb2YgdGhlIHpvbyIpCiAgICAgICByZXR1cm4gcGVuZ3VpbgoKRnVuY3Rpb24gY2FsbCBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBzZWN0aW9uCipDYWxscyouIEEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnMKbWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tCmtleXdvcmQgYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm0KImBgKmlkZW50aWZpZXJgYCIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcKYW55IGV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWYKdGhlIGZvcm0gImBgKippZGVudGlmaWVyYGAiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3CmRpY3Rpb25hcnkgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXcKZW1wdHkgZGljdGlvbmFyeS4KCkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmQKdG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhCmV4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiAqTGFtYmRhcyouICBOb3RlIHRoYXQgdGhlIGxhbWJkYQpleHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247CmEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhICJgYGRlZmBgIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3IKYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBsYW1iZGEKZXhwcmVzc2lvbi4gIFRoZSAiYGBkZWZgYCIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlIGl0CmFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMuCgoqKlByb2dyYW1tZXIncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgImBgZGVmYGAiCmZvcm0gZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWwgZnVuY3Rpb24KdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWQgaW4gdGhlCm5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uCmNvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqIGZvciBkZXRhaWxzLgoKCkNsYXNzIGRlZmluaXRpb25zCj09PT09PT09PT09PT09PT09CgpBIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZAp0eXBlIGhpZXJhcmNoeSopOgoKICAgY2xhc3NkZWYgICAgOjo9ICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlCiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2V4cHJlc3Npb25fbGlzdF0gIikiCiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyCgpBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdCBmaXJzdCBldmFsdWF0ZXMgdGhlCmluaGVyaXRhbmNlIGxpc3QsIGlmIHByZXNlbnQuICBFYWNoIGl0ZW0gaW4gdGhlIGluaGVyaXRhbmNlIGxpc3QKc2hvdWxkIGV2YWx1YXRlIHRvIGEgY2xhc3Mgb2JqZWN0IG9yIGNsYXNzIHR5cGUgd2hpY2ggYWxsb3dzCnN1YmNsYXNzaW5nLiAgVGhlIGNsYXNzJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24KZnJhbWUgKHNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsCm5hbWVzcGFjZSBhbmQgdGhlIG9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUKY29udGFpbnMgb25seSBmdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzcydzIHN1aXRlIGZpbmlzaGVzCmV4ZWN1dGlvbiwgaXRzIGV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMKc2F2ZWQuIFs0XSBBIGNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QKZm9yIHRoZSBiYXNlIGNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUKZGljdGlvbmFyeS4gIFRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZQpvcmlnaW5hbCBsb2NhbCBuYW1lc3BhY2UuCgoqKlByb2dyYW1tZXIncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZQpjbGFzcyB2YXJpYWJsZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBhbGwgaW5zdGFuY2VzLiAgVG8gY3JlYXRlIGluc3RhbmNlCnZhcmlhYmxlcywgdGhleSBjYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggYGBzZWxmLm5hbWUgPSB2YWx1ZWBgLgpCb3RoIGNsYXNzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24KImBgc2VsZi5uYW1lYGAiLCBhbmQgYW4gaW5zdGFuY2UgdmFyaWFibGUgaGlkZXMgYSBjbGFzcyB2YXJpYWJsZSB3aXRoCnRoZSBzYW1lIG5hbWUgd2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gQ2xhc3MgdmFyaWFibGVzIGNhbiBiZSB1c2VkCmFzIGRlZmF1bHRzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4KbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMuICBGb3IgKm5ldy1zdHlsZSBjbGFzcyplcywgZGVzY3JpcHRvcnMgY2FuCmJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbgpkZXRhaWxzLgoKQ2xhc3MgZGVmaW5pdGlvbnMsIGxpa2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvcgptb3JlICpkZWNvcmF0b3IqIGV4cHJlc3Npb25zLiAgVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IKZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBmdW5jdGlvbnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzcwpvYmplY3QsIHdoaWNoIGlzIHRoZW4gYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuCgotWyBGb290bm90ZXMgXS0KClsxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzIHRoZXJlCiAgICBpcyBhIGBgZmluYWxseWBgIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXIgZXhjZXB0aW9uLgogICAgVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LgoKWzJdIEN1cnJlbnRseSwgY29udHJvbCAiZmxvd3Mgb2ZmIHRoZSBlbmQiIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhbgogICAgZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSBgYHJldHVybmBgLCBgYGNvbnRpbnVlYGAsIG9yCiAgICBgYGJyZWFrYGAgc3RhdGVtZW50LgoKWzNdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uCiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uJ3MgYGBfX2RvY19fYGAgYXR0cmlidXRlIGFuZAogICAgdGhlcmVmb3JlIHRoZSBmdW5jdGlvbidzICpkb2NzdHJpbmcqLgoKWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzCiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZSdzIGBgX19kb2NfX2BgIGl0ZW0gYW5kCiAgICB0aGVyZWZvcmUgdGhlIGNsYXNzJ3MgKmRvY3N0cmluZyouCnQIAAAAY29tcG91bmRzygYAAApXaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCk5ldyBpbiB2ZXJzaW9uIDIuNS4KCkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvCmJlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgYGB3aXRoYGAgc3RhdGVtZW50LiBUaGUgY29udGV4dAptYW5hZ2VyIGhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lCmNvbnRleHQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZQpub3JtYWxseSBpbnZva2VkIHVzaW5nIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uCipUaGUgd2l0aCBzdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXIKbWV0aG9kcy4KClR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91cwpraW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkCmZpbGVzLCBldGMuCgpGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouCgpvYmplY3QuX19lbnRlcl9fKHNlbGYpCgogICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBgYHdpdGhgYAogICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocykKICAgc3BlY2lmaWVkIGluIHRoZSBgYGFzYGAgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS4KCm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spCgogICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnMKICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZQogICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbAogICBiZSBgYE5vbmVgYC4KCiAgIElmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvIHN1cHByZXNzIHRoZQogICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkCiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZAogICBub3JtYWxseSB1cG9uIGV4aXQgZnJvbSB0aGlzIG1ldGhvZC4KCiAgIE5vdGUgdGhhdCBgYF9fZXhpdF9fKClgYCBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluCiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCgpTZWUgYWxzbzoKCiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50CiAgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24KICAgICAgYGB3aXRoYGAgc3RhdGVtZW50LgpzEAAAAGNvbnRleHQtbWFuYWdlcnNz7AEAAApUaGUgYGBjb250aW51ZWBgIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgY29udGludWVfc3RtdCA6Oj0gImNvbnRpbnVlIgoKYGBjb250aW51ZWBgIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgYGBmb3JgYCBvcgpgYHdoaWxlYGAgbG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIG9yCmBgZmluYWxseWBgIGNsYXVzZSB3aXRoaW4gdGhhdCBsb29wLiAgSXQgY29udGludWVzIHdpdGggdGhlIG5leHQgY3ljbGUKb2YgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AuCgpXaGVuIGBgY29udGludWVgYCBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSBgYHRyeWBgIHN0YXRlbWVudCB3aXRoIGEKYGBmaW5hbGx5YGAgY2xhdXNlLCB0aGF0IGBgZmluYWxseWBgIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5CnN0YXJ0aW5nIHRoZSBuZXh0IGxvb3AgY3ljbGUuCnQIAAAAY29udGludWVzRAMAAApBcml0aG1ldGljIGNvbnZlcnNpb25zCioqKioqKioqKioqKioqKioqKioqKioKCldoZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlIHBocmFzZQoidGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwiIHRoZSBhcmd1bWVudHMKYXJlIGNvZXJjZWQgdXNpbmcgdGhlIGNvZXJjaW9uIHJ1bGVzIGxpc3RlZCBhdCAgKkNvZXJjaW9uIHJ1bGVzKi4gIElmCmJvdGggYXJndW1lbnRzIGFyZSBzdGFuZGFyZCBudW1lcmljIHR5cGVzLCB0aGUgZm9sbG93aW5nIGNvZXJjaW9ucyBhcmUKYXBwbGllZDoKCiogSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgY29tcGxleCBudW1iZXIsIHRoZSBvdGhlciBpcyBjb252ZXJ0ZWQgdG8KICBjb21wbGV4OwoKKiBvdGhlcndpc2UsIGlmIGVpdGhlciBhcmd1bWVudCBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgdGhlIG90aGVyCiAgaXMgY29udmVydGVkIHRvIGZsb2F0aW5nIHBvaW50OwoKKiBvdGhlcndpc2UsIGlmIGVpdGhlciBhcmd1bWVudCBpcyBhIGxvbmcgaW50ZWdlciwgdGhlIG90aGVyIGlzCiAgY29udmVydGVkIHRvIGxvbmcgaW50ZWdlcjsKCiogb3RoZXJ3aXNlLCBib3RoIG11c3QgYmUgcGxhaW4gaW50ZWdlcnMgYW5kIG5vIGNvbnZlcnNpb24gaXMKICBuZWNlc3NhcnkuCgpTb21lIGFkZGl0aW9uYWwgcnVsZXMgYXBwbHkgZm9yIGNlcnRhaW4gb3BlcmF0b3JzIChlLmcuLCBhIHN0cmluZyBsZWZ0CmFyZ3VtZW50IHRvIHRoZSAnJScgb3BlcmF0b3IpLiBFeHRlbnNpb25zIGNhbiBkZWZpbmUgdGhlaXIgb3duCmNvZXJjaW9ucy4KdAsAAABjb252ZXJzaW9uc3OaLwAACkJhc2ljIGN1c3RvbWl6YXRpb24KKioqKioqKioqKioqKioqKioqKgoKb2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSkKCiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICBgYF9fbmV3X18oKWBgIGlzIGEKICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKQogICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0cwogICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlCiAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVybgogICB2YWx1ZSBvZiBgYF9fbmV3X18oKWBgIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAodXN1YWxseQogICBhbiBpbnN0YW5jZSBvZiAqY2xzKikuCgogICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGJ5CiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzJ3MgYGBfX25ld19fKClgYCBtZXRob2QgdXNpbmcKICAgYGBzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKWBgIHdpdGggYXBwcm9wcmlhdGUKICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSBhcwogICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC4KCiAgIElmIGBgX19uZXdfXygpYGAgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3CiAgIGluc3RhbmNlJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlCiAgIGBgX19pbml0X18oc2VsZlssIC4uLl0pYGAsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGUKICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gYGBfX25ld19fKClgYC4KCiAgIElmIGBgX19uZXdfXygpYGAgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXcKICAgaW5zdGFuY2UncyBgYF9faW5pdF9fKClgYCBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC4KCiAgIGBgX19uZXdfXygpYGAgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlCiAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlIGNyZWF0aW9uLiAgSXQKICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0bwogICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uCgpvYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pCgogICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgY3JlYXRlZC4gIFRoZSBhcmd1bWVudHMgYXJlIHRob3NlCiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW4KICAgYGBfX2luaXRfXygpYGAgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzcydzIGBgX19pbml0X18oKWBgIG1ldGhvZCwKICAgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mCiAgIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZToKICAgYGBCYXNlQ2xhc3MuX19pbml0X18oc2VsZiwgW2FyZ3MuLi5dKWBgLiAgQXMgYSBzcGVjaWFsIGNvbnN0cmFpbnQKICAgb24gY29uc3RydWN0b3JzLCBubyB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQ7IGRvaW5nIHNvIHdpbGwgY2F1c2UgYQogICBgYFR5cGVFcnJvcmBgIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLgoKb2JqZWN0Ll9fZGVsX18oc2VsZikKCiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuICBUaGlzIGlzIGFsc28KICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSBgYF9fZGVsX18oKWBgIG1ldGhvZCwKICAgdGhlIGRlcml2ZWQgY2xhc3MncyBgYF9fZGVsX18oKWBgIG1ldGhvZCwgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkKICAgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlCiAgIGluc3RhbmNlLiAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yCiAgIHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgaW5zdGFuY2UgYnkKICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXIKICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdAogICBgYF9fZGVsX18oKWBgIG1ldGhvZHMgYXJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0IHN0aWxsIGV4aXN0IHdoZW4KICAgdGhlIGludGVycHJldGVyIGV4aXRzLgoKICAgTm90ZTogYGBkZWwgeGBgIGRvZXNuJ3QgZGlyZWN0bHkgY2FsbCBgYHguX19kZWxfXygpYGAgLS0tIHRoZSBmb3JtZXIKICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGBgeGBgIGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXIKICAgICBpcyBvbmx5IGNhbGxlZCB3aGVuIGBgeGBgJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gIFNvbWUKICAgICBjb21tb24gc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4KICAgICBvYmplY3QgZnJvbSBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbgogICAgIG9iamVjdHMgKGUuZy4sIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoCiAgICAgcGFyZW50IGFuZCBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlCiAgICAgc3RhY2sgZnJhbWUgb2YgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sKICAgICBzdG9yZWQgaW4gYGBzeXMuZXhjX3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yCiAgICAgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4KICAgICB1bmhhbmRsZWQgZXhjZXB0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluCiAgICAgYGBzeXMubGFzdF90cmFjZWJhY2tgYCBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0CiAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgdGhlIGN5Y2xlczsKICAgICB0aGUgbGF0dGVyIHR3byBzaXR1YXRpb25zIGNhbiBiZSByZXNvbHZlZCBieSBzdG9yaW5nIGBgTm9uZWBgIGluCiAgICAgYGBzeXMuZXhjX3RyYWNlYmFja2BgIG9yIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuICBDaXJjdWxhcgogICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIHdoZW4gdGhlIG9wdGlvbiBjeWNsZQogICAgIGRldGVjdG9yIGlzIGVuYWJsZWQgKGl0J3Mgb24gYnkgZGVmYXVsdCksIGJ1dCBjYW4gb25seSBiZSBjbGVhbmVkCiAgICAgdXAgaWYgdGhlcmUgYXJlIG5vIFB5dGhvbi1sZXZlbCBgYF9fZGVsX18oKWBgIG1ldGhvZHMgaW52b2x2ZWQuCiAgICAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgYGdjYGAgbW9kdWxlIGZvciBtb3JlCiAgICAgaW5mb3JtYXRpb24gYWJvdXQgaG93IGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgaGFuZGxlZCBieSB0aGUKICAgICBjeWNsZSBkZXRlY3RvciwgcGFydGljdWxhcmx5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGBnYXJiYWdlYGAKICAgICB2YWx1ZS4KCiAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIGBgX19kZWxfXygpYGAKICAgICBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nIHRoZWlyIGV4ZWN1dGlvbgogICAgIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gYGBzeXMuc3RkZXJyYGAgaW5zdGVhZC4KICAgICBBbHNvLCB3aGVuIGBgX19kZWxfXygpYGAgaXMgaW52b2tlZCBpbiByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZwogICAgIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlcgogICAgIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZQogICAgIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyB0b3JuIGRvd24gKGUuZy4gdGhlCiAgICAgaW1wb3J0IG1hY2hpbmVyeSBzaHV0dGluZyBkb3duKS4gIEZvciB0aGlzIHJlYXNvbiwgYGBfX2RlbF9fKClgYAogICAgIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZCB0byBtYWludGFpbgogICAgIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMS41LCBQeXRob24KICAgICBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGEgc2luZ2xlCiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmUKICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgdGhpcyBtYXkKICAgICBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgYXZhaWxhYmxlIGF0IHRoZQogICAgIHRpbWUgd2hlbiB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgaXMgY2FsbGVkLgoKICAgU2VlIGFsc28gdGhlICotUiogY29tbWFuZC1saW5lIG9wdGlvbi4KCm9iamVjdC5fX3JlcHJfXyhzZWxmKQoKICAgQ2FsbGVkIGJ5IHRoZSBgYHJlcHIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieSBzdHJpbmcKICAgY29udmVyc2lvbnMgKHJldmVyc2UgcXVvdGVzKSB0byBjb21wdXRlIHRoZSAib2ZmaWNpYWwiIHN0cmluZwogICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsIHRoaXMgc2hvdWxkIGxvb2sKICAgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSBhbgogICBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQpLiAgSWYKICAgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSBmb3JtIGBgPC4uLnNvbWUgdXNlZnVsCiAgIGRlc2NyaXB0aW9uLi4uPmBgIHNob3VsZCBiZSByZXR1cm5lZC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhCiAgIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyBgYF9fcmVwcl9fKClgYCBidXQgbm90CiAgIGBgX19zdHJfXygpYGAsIHRoZW4gYGBfX3JlcHJfXygpYGAgaXMgYWxzbyB1c2VkIHdoZW4gYW4gImluZm9ybWFsIgogICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuCgogICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZQogICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy4KCm9iamVjdC5fX3N0cl9fKHNlbGYpCgogICBDYWxsZWQgYnkgdGhlIGBgc3RyKClgYCBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIGBgcHJpbnRgYAogICBzdGF0ZW1lbnQgdG8gY29tcHV0ZSB0aGUgImluZm9ybWFsIiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4KICAgb2JqZWN0LiAgVGhpcyBkaWZmZXJzIGZyb20gYGBfX3JlcHJfXygpYGAgaW4gdGhhdCBpdCBkb2VzIG5vdCBoYXZlCiAgIHRvIGJlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb246IGEgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2UKICAgcmVwcmVzZW50YXRpb24gbWF5IGJlIHVzZWQgaW5zdGVhZC4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEKICAgc3RyaW5nIG9iamVjdC4KCm9iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpCgogICBOZXcgaW4gdmVyc2lvbiAyLjEuCgogICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLCBhbmQgYXJlIGNhbGxlZAogICBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgaW4gcHJlZmVyZW5jZSB0byBgYF9fY21wX18oKWBgIGJlbG93LiBUaGUKICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgaXMgYXMKICAgZm9sbG93czogYGB4PHlgYCBjYWxscyBgYHguX19sdF9fKHkpYGAsIGBgeDw9eWBgIGNhbGxzCiAgIGBgeC5fX2xlX18oeSlgYCwgYGB4PT15YGAgY2FsbHMgYGB4Ll9fZXFfXyh5KWBgLCBgYHghPXlgYCBhbmQKICAgYGB4PD55YGAgY2FsbCBgYHguX19uZV9fKHkpYGAsIGBgeD55YGAgY2FsbHMgYGB4Ll9fZ3RfXyh5KWBgLCBhbmQKICAgYGB4Pj15YGAgY2FsbHMgYGB4Ll9fZ2VfXyh5KWBgLgoKICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbgogICBgYE5vdEltcGxlbWVudGVkYGAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGEKICAgZ2l2ZW4gcGFpciBvZiBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sIGBgRmFsc2VgYCBhbmQgYGBUcnVlYGAgYXJlCiAgIHJldHVybmVkIGZvciBhIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4KICAgcmV0dXJuIGFueSB2YWx1ZSwgc28gaWYgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgdXNlZCBpbiBhCiAgIEJvb2xlYW4gY29udGV4dCAoZS5nLiwgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiBgYGlmYGAgc3RhdGVtZW50KSwKICAgUHl0aG9uIHdpbGwgY2FsbCBgYGJvb2woKWBgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdAogICBpcyB0cnVlIG9yIGZhbHNlLgoKICAgVGhlcmUgYXJlIG5vIGltcGxpZWQgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMuCiAgIFRoZSB0cnV0aCBvZiBgYHg9PXlgYCBkb2VzIG5vdCBpbXBseSB0aGF0IGBgeCE9eWBgIGlzIGZhbHNlLgogICBBY2NvcmRpbmdseSwgd2hlbiBkZWZpbmluZyBgYF9fZXFfXygpYGAsIG9uZSBzaG91bGQgYWxzbyBkZWZpbmUKICAgYGBfX25lX18oKWBgIHNvIHRoYXQgdGhlIG9wZXJhdG9ycyB3aWxsIGJlaGF2ZSBhcyBleHBlY3RlZC4gIFNlZQogICB0aGUgcGFyYWdyYXBoIG9uIGBgX19oYXNoX18oKWBgIGZvciBzb21lIGltcG9ydGFudCBub3RlcyBvbgogICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvbgogICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4KCiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWQKICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodAogICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCBgYF9fbHRfXygpYGAgYW5kIGBgX19ndF9fKClgYCBhcmUgZWFjaAogICBvdGhlcidzIHJlZmxlY3Rpb24sIGBgX19sZV9fKClgYCBhbmQgYGBfX2dlX18oKWBgIGFyZSBlYWNoIG90aGVyJ3MKICAgcmVmbGVjdGlvbiwgYW5kIGBgX19lcV9fKClgYCBhbmQgYGBfX25lX18oKWBgIGFyZSB0aGVpciBvd24KICAgcmVmbGVjdGlvbi4KCiAgIEFyZ3VtZW50cyB0byByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBhcmUgbmV2ZXIgY29lcmNlZC4KCiAgIFRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3QKICAgb3BlcmF0aW9uLCBzZWUgYGBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKWBgLgoKb2JqZWN0Ll9fY21wX18oc2VsZiwgb3RoZXIpCgogICBDYWxsZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRpb25zIGlmIHJpY2ggY29tcGFyaXNvbiAoc2VlIGFib3ZlKSBpcwogICBub3QgZGVmaW5lZC4gIFNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIGBgc2VsZiA8IG90aGVyYGAsCiAgIHplcm8gaWYgYGBzZWxmID09IG90aGVyYGAsIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBgYHNlbGYgPiBvdGhlcmBgLgogICBJZiBubyBgYF9fY21wX18oKWBgLCBgYF9fZXFfXygpYGAgb3IgYGBfX25lX18oKWBgIG9wZXJhdGlvbiBpcwogICBkZWZpbmVkLCBjbGFzcyBpbnN0YW5jZXMgYXJlIGNvbXBhcmVkIGJ5IG9iamVjdCBpZGVudGl0eQogICAoImFkZHJlc3MiKS4gIFNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiBgYF9faGFzaF9fKClgYCBmb3Igc29tZQogICBpbXBvcnRhbnQgbm90ZXMgb24gY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tCiAgIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuIChOb3RlOiB0aGUKICAgcmVzdHJpY3Rpb24gdGhhdCBleGNlcHRpb25zIGFyZSBub3QgcHJvcGFnYXRlZCBieSBgYF9fY21wX18oKWBgIGhhcwogICBiZWVuIHJlbW92ZWQgc2luY2UgUHl0aG9uIDEuNS4pCgpvYmplY3QuX19yY21wX18oc2VsZiwgb3RoZXIpCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi4xOiBObyBsb25nZXIgc3VwcG9ydGVkLgoKb2JqZWN0Ll9faGFzaF9fKHNlbGYpCgogICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gYGBoYXNoKClgYCBhbmQgZm9yIG9wZXJhdGlvbnMgb24KICAgbWVtYmVycyBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nIGBgc2V0YGAsIGBgZnJvemVuc2V0YGAsIGFuZAogICBgYGRpY3RgYC4gIGBgX19oYXNoX18oKWBgIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5CiAgIHJlcXVpcmVkIHByb3BlcnR5IGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWUKICAgaGFzaCB2YWx1ZTsgaXQgaXMgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZwogICBleGNsdXNpdmUgb3IpIHRoZSBoYXNoIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0CiAgIGFsc28gcGxheSBhIHBhcnQgaW4gY29tcGFyaXNvbiBvZiBvYmplY3RzLgoKICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYSBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBtZXRob2QKICAgaXQgc2hvdWxkIG5vdCBkZWZpbmUgYSBgYF9faGFzaF9fKClgYCBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdAogICBkZWZpbmVzIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIGJ1dCBub3QgYGBfX2hhc2hfXygpYGAsIGl0cwogICBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGluIGhhc2hlZCBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3MKICAgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kIGltcGxlbWVudHMgYSBgYF9fY21wX18oKWBgIG9yCiAgIGBgX19lcV9fKClgYCBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50IGBgX19oYXNoX18oKWBgLCBzaW5jZQogICBoYXNoYWJsZSBjb2xsZWN0aW9uIGltcGxlbWVudGF0aW9ucyByZXF1aXJlIHRoYXQgYSBvYmplY3QncyBoYXNoCiAgIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdCdzIGhhc2ggdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZQogICBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLgoKICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSBgYF9fY21wX18oKWBgIGFuZCBgYF9faGFzaF9fKClgYCBtZXRob2RzCiAgIGJ5IGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aAogICB0aGVtc2VsdmVzKSBhbmQgYGB4Ll9faGFzaF9fKClgYCByZXR1cm5zIGBgaWQoeClgYC4KCiAgIENsYXNzZXMgd2hpY2ggaW5oZXJpdCBhIGBgX19oYXNoX18oKWBgIG1ldGhvZCBmcm9tIGEgcGFyZW50IGNsYXNzCiAgIGJ1dCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgc3VjaCB0aGF0CiAgIHRoZSBoYXNoIHZhbHVlIHJldHVybmVkIGlzIG5vIGxvbmdlciBhcHByb3ByaWF0ZSAoZS5nLiBieSBzd2l0Y2hpbmcKICAgdG8gYSB2YWx1ZS1iYXNlZCBjb25jZXB0IG9mIGVxdWFsaXR5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKICAgaWRlbnRpdHkgYmFzZWQgZXF1YWxpdHkpIGNhbiBleHBsaWNpdGx5IGZsYWcgdGhlbXNlbHZlcyBhcyBiZWluZwogICB1bmhhc2hhYmxlIGJ5IHNldHRpbmcgYGBfX2hhc2hfXyA9IE5vbmVgYCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KICAgRG9pbmcgc28gbWVhbnMgdGhhdCBub3Qgb25seSB3aWxsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgcmFpc2UgYW4KICAgYXBwcm9wcmlhdGUgYGBUeXBlRXJyb3JgYCB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGVpcgogICBoYXNoIHZhbHVlLCBidXQgdGhleSB3aWxsIGFsc28gYmUgY29ycmVjdGx5IGlkZW50aWZpZWQgYXMKICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nIGBgaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKWBgCiAgICh1bmxpa2UgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlaXIgb3duIGBgX19oYXNoX18oKWBgIHRvIGV4cGxpY2l0bHkKICAgcmFpc2UgYGBUeXBlRXJyb3JgYCkuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBgYF9faGFzaF9fKClgYCBtYXkgbm93IGFsc28gcmV0dXJuIGEgbG9uZwogICBpbnRlZ2VyIG9iamVjdDsgdGhlIDMyLWJpdCBpbnRlZ2VyIGlzIHRoZW4gZGVyaXZlZCBmcm9tIHRoZSBoYXNoIG9mCiAgIHRoYXQgb2JqZWN0LgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogYGBfX2hhc2hfX2BgIG1heSBub3cgYmUgc2V0IHRvIGBgTm9uZWBgIHRvCiAgIGV4cGxpY2l0bHkgZmxhZyBpbnN0YW5jZXMgb2YgYSBjbGFzcyBhcyB1bmhhc2hhYmxlLgoKb2JqZWN0Ll9fbm9uemVyb19fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb24KICAgYGBib29sKClgYDsgc2hvdWxkIHJldHVybiBgYEZhbHNlYGAgb3IgYGBUcnVlYGAsIG9yIHRoZWlyIGludGVnZXIKICAgZXF1aXZhbGVudHMgYGAwYGAgb3IgYGAxYGAuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLAogICBgYF9fbGVuX18oKWBgIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXMKICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gSWYgYSBjbGFzcyBkZWZpbmVzCiAgIG5laXRoZXIgYGBfX2xlbl9fKClgYCBub3IgYGBfX25vbnplcm9fXygpYGAsIGFsbCBpdHMgaW5zdGFuY2VzIGFyZQogICBjb25zaWRlcmVkIHRydWUuCgpvYmplY3QuX191bmljb2RlX18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYGB1bmljb2RlKClgYCBidWlsdC1pbjsgc2hvdWxkIHJldHVybiBhIFVuaWNvZGUKICAgb2JqZWN0LiBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCBzdHJpbmcgY29udmVyc2lvbiBpcwogICBhdHRlbXB0ZWQsIGFuZCB0aGUgcmVzdWx0IG9mIHN0cmluZyBjb252ZXJzaW9uIGlzIGNvbnZlcnRlZCB0bwogICBVbmljb2RlIHVzaW5nIHRoZSBzeXN0ZW0gZGVmYXVsdCBlbmNvZGluZy4KdA0AAABjdXN0b21pemF0aW9uc6ITAAAKYGBwZGJgYCAtLS0gVGhlIFB5dGhvbiBEZWJ1Z2dlcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgbW9kdWxlIGBgcGRiYGAgZGVmaW5lcyBhbiBpbnRlcmFjdGl2ZSBzb3VyY2UgY29kZSBkZWJ1Z2dlciBmb3IKUHl0aG9uIHByb2dyYW1zLiAgSXQgc3VwcG9ydHMgc2V0dGluZyAoY29uZGl0aW9uYWwpIGJyZWFrcG9pbnRzIGFuZApzaW5nbGUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsaW5lIGxldmVsLCBpbnNwZWN0aW9uIG9mIHN0YWNrIGZyYW1lcywKc291cmNlIGNvZGUgbGlzdGluZywgYW5kIGV2YWx1YXRpb24gb2YgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGluIHRoZQpjb250ZXh0IG9mIGFueSBzdGFjayBmcmFtZS4gIEl0IGFsc28gc3VwcG9ydHMgcG9zdC1tb3J0ZW0gZGVidWdnaW5nCmFuZCBjYW4gYmUgY2FsbGVkIHVuZGVyIHByb2dyYW0gY29udHJvbC4KClRoZSBkZWJ1Z2dlciBpcyBleHRlbnNpYmxlIC0tLSBpdCBpcyBhY3R1YWxseSBkZWZpbmVkIGFzIHRoZSBjbGFzcwpgYFBkYmBgLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5CnJlYWRpbmcgdGhlIHNvdXJjZS4gIFRoZSBleHRlbnNpb24gaW50ZXJmYWNlIHVzZXMgdGhlIG1vZHVsZXMgYGBiZGJgYAphbmQgYGBjbWRgYC4KClRoZSBkZWJ1Z2dlcidzIHByb21wdCBpcyBgYChQZGIpYGAuIFR5cGljYWwgdXNhZ2UgdG8gcnVuIGEgcHJvZ3JhbQp1bmRlciBjb250cm9sIG9mIHRoZSBkZWJ1Z2dlciBpczoKCiAgID4+PiBpbXBvcnQgcGRiCiAgID4+PiBpbXBvcnQgbXltb2R1bGUKICAgPj4+IHBkYi5ydW4oJ215bW9kdWxlLnRlc3QoKScpCiAgID4gPHN0cmluZz4oMCk/KCkKICAgKFBkYikgY29udGludWUKICAgPiA8c3RyaW5nPigxKT8oKQogICAoUGRiKSBjb250aW51ZQogICBOYW1lRXJyb3I6ICdzcGFtJwogICA+IDxzdHJpbmc+KDEpPygpCiAgIChQZGIpCgpgYHBkYi5weWBgIGNhbiBhbHNvIGJlIGludm9rZWQgYXMgYSBzY3JpcHQgdG8gZGVidWcgb3RoZXIgc2NyaXB0cy4KRm9yIGV4YW1wbGU6CgogICBweXRob24gLW0gcGRiIG15c2NyaXB0LnB5CgpXaGVuIGludm9rZWQgYXMgYSBzY3JpcHQsIHBkYiB3aWxsIGF1dG9tYXRpY2FsbHkgZW50ZXIgcG9zdC1tb3J0ZW0KZGVidWdnaW5nIGlmIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIGV4aXRzIGFibm9ybWFsbHkuIEFmdGVyIHBvc3QtCm1vcnRlbSBkZWJ1Z2dpbmcgKG9yIGFmdGVyIG5vcm1hbCBleGl0IG9mIHRoZSBwcm9ncmFtKSwgcGRiIHdpbGwKcmVzdGFydCB0aGUgcHJvZ3JhbS4gQXV0b21hdGljIHJlc3RhcnRpbmcgcHJlc2VydmVzIHBkYidzIHN0YXRlIChzdWNoCmFzIGJyZWFrcG9pbnRzKSBhbmQgaW4gbW9zdCBjYXNlcyBpcyBtb3JlIHVzZWZ1bCB0aGFuIHF1aXR0aW5nIHRoZQpkZWJ1Z2dlciB1cG9uIHByb2dyYW0ncyBleGl0LgoKTmV3IGluIHZlcnNpb24gMi40OiBSZXN0YXJ0aW5nIHBvc3QtbW9ydGVtIGJlaGF2aW9yIGFkZGVkLgoKVGhlIHR5cGljYWwgdXNhZ2UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIgZnJvbSBhIHJ1bm5pbmcgcHJvZ3JhbSBpcwp0byBpbnNlcnQKCiAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQoKYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiB0aGVuCnN0ZXAgdGhyb3VnaCB0aGUgY29kZSBmb2xsb3dpbmcgdGhpcyBzdGF0ZW1lbnQsIGFuZCBjb250aW51ZSBydW5uaW5nCndpdGhvdXQgdGhlIGRlYnVnZ2VyIHVzaW5nIHRoZSBgYGNgYCBjb21tYW5kLgoKVGhlIHR5cGljYWwgdXNhZ2UgdG8gaW5zcGVjdCBhIGNyYXNoZWQgcHJvZ3JhbSBpczoKCiAgID4+PiBpbXBvcnQgcGRiCiAgID4+PiBpbXBvcnQgbXltb2R1bGUKICAgPj4+IG15bW9kdWxlLnRlc3QoKQogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwogICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDQsIGluIHRlc3QKICAgICAgIHRlc3QyKCkKICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSAzLCBpbiB0ZXN0MgogICAgICAgcHJpbnQgc3BhbQogICBOYW1lRXJyb3I6IHNwYW0KICAgPj4+IHBkYi5wbSgpCiAgID4gLi9teW1vZHVsZS5weSgzKXRlc3QyKCkKICAgLT4gcHJpbnQgc3BhbQogICAoUGRiKQoKVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOyBlYWNoIGVudGVycyB0aGUgZGVidWdnZXIKaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5OgoKcGRiLnJ1bihzdGF0ZW1lbnRbLCBnbG9iYWxzWywgbG9jYWxzXV0pCgogICBFeGVjdXRlIHRoZSAqc3RhdGVtZW50KiAoZ2l2ZW4gYXMgYSBzdHJpbmcpIHVuZGVyIGRlYnVnZ2VyIGNvbnRyb2wuCiAgIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55IGNvZGUgaXMgZXhlY3V0ZWQ7IHlvdSBjYW4KICAgc2V0IGJyZWFrcG9pbnRzIGFuZCB0eXBlIGBgY29udGludWVgYCwgb3IgeW91IGNhbiBzdGVwIHRocm91Z2ggdGhlCiAgIHN0YXRlbWVudCB1c2luZyBgYHN0ZXBgYCBvciBgYG5leHRgYCAoYWxsIHRoZXNlIGNvbW1hbmRzIGFyZQogICBleHBsYWluZWQgYmVsb3cpLiAgVGhlIG9wdGlvbmFsICpnbG9iYWxzKiBhbmQgKmxvY2FscyogYXJndW1lbnRzCiAgIHNwZWNpZnkgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBjb2RlIGlzIGV4ZWN1dGVkOyBieSBkZWZhdWx0CiAgIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBtb2R1bGUgYGBfX21haW5fX2BgIGlzIHVzZWQuICAoU2VlIHRoZQogICBleHBsYW5hdGlvbiBvZiB0aGUgYGBleGVjYGAgc3RhdGVtZW50IG9yIHRoZSBgYGV2YWwoKWBgIGJ1aWx0LWluCiAgIGZ1bmN0aW9uLikKCnBkYi5ydW5ldmFsKGV4cHJlc3Npb25bLCBnbG9iYWxzWywgbG9jYWxzXV0pCgogICBFdmFsdWF0ZSB0aGUgKmV4cHJlc3Npb24qIChnaXZlbiBhcyBhIHN0cmluZykgdW5kZXIgZGVidWdnZXIKICAgY29udHJvbC4gIFdoZW4gYGBydW5ldmFsKClgYCByZXR1cm5zLCBpdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUKICAgZXhwcmVzc2lvbi4gIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gYGBydW4oKWBgLgoKcGRiLnJ1bmNhbGwoZnVuY3Rpb25bLCBhcmd1bWVudCwgLi4uXSkKCiAgIENhbGwgdGhlICpmdW5jdGlvbiogKGEgZnVuY3Rpb24gb3IgbWV0aG9kIG9iamVjdCwgbm90IGEgc3RyaW5nKQogICB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuIGBgcnVuY2FsbCgpYGAgcmV0dXJucywgaXQgcmV0dXJucwogICB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5lZC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycwogICBhcyBzb29uIGFzIHRoZSBmdW5jdGlvbiBpcyBlbnRlcmVkLgoKcGRiLnNldF90cmFjZSgpCgogICBFbnRlciB0aGUgZGVidWdnZXIgYXQgdGhlIGNhbGxpbmcgc3RhY2sgZnJhbWUuICBUaGlzIGlzIHVzZWZ1bCB0bwogICBoYXJkLWNvZGUgYSBicmVha3BvaW50IGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYSBwcm9ncmFtLCBldmVuIGlmIHRoZQogICBjb2RlIGlzIG5vdCBvdGhlcndpc2UgYmVpbmcgZGVidWdnZWQgKGUuZy4gd2hlbiBhbiBhc3NlcnRpb24KICAgZmFpbHMpLgoKcGRiLnBvc3RfbW9ydGVtKFt0cmFjZWJhY2tdKQoKICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSBnaXZlbiAqdHJhY2ViYWNrKiBvYmplY3QuICBJZiBubwogICAqdHJhY2ViYWNrKiBpcyBnaXZlbiwgaXQgdXNlcyB0aGUgb25lIG9mIHRoZSBleGNlcHRpb24gdGhhdCBpcwogICBjdXJyZW50bHkgYmVpbmcgaGFuZGxlZCAoYW4gZXhjZXB0aW9uIG11c3QgYmUgYmVpbmcgaGFuZGxlZCBpZiB0aGUKICAgZGVmYXVsdCBpcyB0byBiZSB1c2VkKS4KCnBkYi5wbSgpCgogICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIHRyYWNlYmFjayBmb3VuZCBpbgogICBgYHN5cy5sYXN0X3RyYWNlYmFja2BgLgoKVGhlIGBgcnVuKmBgIGZ1bmN0aW9ucyBhbmQgYGBzZXRfdHJhY2UoKWBgIGFyZSBhbGlhc2VzIGZvcgppbnN0YW50aWF0aW5nIHRoZSBgYFBkYmBgIGNsYXNzIGFuZCBjYWxsaW5nIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUKbmFtZS4gIElmIHlvdSB3YW50IHRvIGFjY2VzcyBmdXJ0aGVyIGZlYXR1cmVzLCB5b3UgaGF2ZSB0byBkbyB0aGlzCnlvdXJzZWxmOgoKY2xhc3MgY2xhc3MgcGRiLlBkYihjb21wbGV0ZWtleT0ndGFiJywgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHNraXA9Tm9uZSkKCiAgIGBgUGRiYGAgaXMgdGhlIGRlYnVnZ2VyIGNsYXNzLgoKICAgVGhlICpjb21wbGV0ZWtleSosICpzdGRpbiogYW5kICpzdGRvdXQqIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZQogICB1bmRlcmx5aW5nIGBgY21kLkNtZGBgIGNsYXNzOyBzZWUgdGhlIGRlc2NyaXB0aW9uIHRoZXJlLgoKICAgVGhlICpza2lwKiBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgZ2xvYi1zdHlsZQogICBtb2R1bGUgbmFtZSBwYXR0ZXJucy4gIFRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBzdGVwIGludG8gZnJhbWVzIHRoYXQKICAgb3JpZ2luYXRlIGluIGEgbW9kdWxlIHRoYXQgbWF0Y2hlcyBvbmUgb2YgdGhlc2UgcGF0dGVybnMuIFsxXQoKICAgRXhhbXBsZSBjYWxsIHRvIGVuYWJsZSB0cmFjaW5nIHdpdGggKnNraXAqOgoKICAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVsnZGphbmdvLionXSkuc2V0X3RyYWNlKCkKCiAgIE5ldyBpbiB2ZXJzaW9uIDIuNzogVGhlICpza2lwKiBhcmd1bWVudC4KCiAgIHJ1bihzdGF0ZW1lbnRbLCBnbG9iYWxzWywgbG9jYWxzXV0pCiAgIHJ1bmV2YWwoZXhwcmVzc2lvblssIGdsb2JhbHNbLCBsb2NhbHNdXSkKICAgcnVuY2FsbChmdW5jdGlvblssIGFyZ3VtZW50LCAuLi5dKQogICBzZXRfdHJhY2UoKQoKICAgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZnVuY3Rpb25zIGV4cGxhaW5lZCBhYm92ZS4KdAgAAABkZWJ1Z2dlcnOPAwAAClRoZSBgYGRlbGBgIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioKCiAgIGRlbF9zdG10IDo6PSAiZGVsIiB0YXJnZXRfbGlzdAoKRGVsZXRpb24gaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHdheSBhc3NpZ25tZW50IGlzCmRlZmluZWQuIFJhdGhlciB0aGFuIHNwZWxsaW5nIGl0IG91dCBpbiBmdWxsIGRldGFpbHMsIGhlcmUgYXJlIHNvbWUKaGludHMuCgpEZWxldGlvbiBvZiBhIHRhcmdldCBsaXN0IHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgZWFjaCB0YXJnZXQsIGZyb20gbGVmdAp0byByaWdodC4KCkRlbGV0aW9uIG9mIGEgbmFtZSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSAgZnJvbSB0aGUgbG9jYWwgb3IKZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgYGBnbG9iYWxgYApzdGF0ZW1lbnQgaW4gdGhlIHNhbWUgY29kZSBibG9jay4gIElmIHRoZSBuYW1lIGlzIHVuYm91bmQsIGEKYGBOYW1lRXJyb3JgYCBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuCgpJdCBpcyBpbGxlZ2FsIHRvIGRlbGV0ZSBhIG5hbWUgZnJvbSB0aGUgbG9jYWwgbmFtZXNwYWNlIGlmIGl0IG9jY3VycwphcyBhIGZyZWUgdmFyaWFibGUgaW4gYSBuZXN0ZWQgYmxvY2suCgpEZWxldGlvbiBvZiBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgc3Vic2NyaXB0aW9ucyBhbmQgc2xpY2luZ3MgaXMgcGFzc2VkCnRvIHRoZSBwcmltYXJ5IG9iamVjdCBpbnZvbHZlZDsgZGVsZXRpb24gb2YgYSBzbGljaW5nIGlzIGluIGdlbmVyYWwKZXF1aXZhbGVudCB0byBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IHNsaWNlIG9mIHRoZSByaWdodCB0eXBlIChidXQgZXZlbgp0aGlzIGlzIGRldGVybWluZWQgYnkgdGhlIHNsaWNlZCBvYmplY3QpLgp0AwAAAGRlbHOmBQAACkRpY3Rpb25hcnkgZGlzcGxheXMKKioqKioqKioqKioqKioqKioqKgoKQSBkaWN0aW9uYXJ5IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2Yga2V5L2RhdHVtIHBhaXJzCmVuY2xvc2VkIGluIGN1cmx5IGJyYWNlczoKCiAgIGRpY3RfZGlzcGxheSAgICAgICA6Oj0gInsiIFtrZXlfZGF0dW1fbGlzdCB8IGRpY3RfY29tcHJlaGVuc2lvbl0gIn0iCiAgIGtleV9kYXR1bV9saXN0ICAgICA6Oj0ga2V5X2RhdHVtICgiLCIga2V5X2RhdHVtKSogWyIsIl0KICAga2V5X2RhdHVtICAgICAgICAgIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uCiAgIGRpY3RfY29tcHJlaGVuc2lvbiA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiBjb21wX2ZvcgoKQSBkaWN0aW9uYXJ5IGRpc3BsYXkgeWllbGRzIGEgbmV3IGRpY3Rpb25hcnkgb2JqZWN0LgoKSWYgYSBjb21tYS1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2Yga2V5L2RhdHVtIHBhaXJzIGlzIGdpdmVuLCB0aGV5IGFyZQpldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHRvIGRlZmluZSB0aGUgZW50cmllcyBvZiB0aGUgZGljdGlvbmFyeToKZWFjaCBrZXkgb2JqZWN0IGlzIHVzZWQgYXMgYSBrZXkgaW50byB0aGUgZGljdGlvbmFyeSB0byBzdG9yZSB0aGUKY29ycmVzcG9uZGluZyBkYXR1bS4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNhbWUga2V5Cm11bHRpcGxlIHRpbWVzIGluIHRoZSBrZXkvZGF0dW0gbGlzdCwgYW5kIHRoZSBmaW5hbCBkaWN0aW9uYXJ5J3MgdmFsdWUKZm9yIHRoYXQga2V5IHdpbGwgYmUgdGhlIGxhc3Qgb25lIGdpdmVuLgoKQSBkaWN0IGNvbXByZWhlbnNpb24sIGluIGNvbnRyYXN0IHRvIGxpc3QgYW5kIHNldCBjb21wcmVoZW5zaW9ucywKbmVlZHMgdHdvIGV4cHJlc3Npb25zIHNlcGFyYXRlZCB3aXRoIGEgY29sb24gZm9sbG93ZWQgYnkgdGhlIHVzdWFsCiJmb3IiIGFuZCAiaWYiIGNsYXVzZXMuIFdoZW4gdGhlIGNvbXByZWhlbnNpb24gaXMgcnVuLCB0aGUgcmVzdWx0aW5nCmtleSBhbmQgdmFsdWUgZWxlbWVudHMgYXJlIGluc2VydGVkIGluIHRoZSBuZXcgZGljdGlvbmFyeSBpbiB0aGUgb3JkZXIKdGhleSBhcmUgcHJvZHVjZWQuCgpSZXN0cmljdGlvbnMgb24gdGhlIHR5cGVzIG9mIHRoZSBrZXkgdmFsdWVzIGFyZSBsaXN0ZWQgZWFybGllciBpbgpzZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqLiAgKFRvIHN1bW1hcml6ZSwgdGhlIGtleSB0eXBlCnNob3VsZCBiZSAqaGFzaGFibGUqLCB3aGljaCBleGNsdWRlcyBhbGwgbXV0YWJsZSBvYmplY3RzLikgIENsYXNoZXMKYmV0d2VlbiBkdXBsaWNhdGUga2V5cyBhcmUgbm90IGRldGVjdGVkOyB0aGUgbGFzdCBkYXR1bSAodGV4dHVhbGx5CnJpZ2h0bW9zdCBpbiB0aGUgZGlzcGxheSkgc3RvcmVkIGZvciBhIGdpdmVuIGtleSB2YWx1ZSBwcmV2YWlscy4KdAQAAABkaWN0c0YFAAAKSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkCmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuCgpJZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvCmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLgoKSWYgdGhlIHdpbGQgY2FyZCBmb3JtIG9mIGltcG9ydCAtLS0gYGBpbXBvcnQgKmBgIC0tLSBpcyB1c2VkIGluIGEKZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWUKdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC4KCklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEKbmVzdGVkIGJsb2NrIHdpdGggZnJlZSB2YXJpYWJsZXMsIHRoZSBjb21waWxlciB3aWxsIHJhaXNlIGEKYGBTeW50YXhFcnJvcmBgIHVubGVzcyB0aGUgZXhlYyBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgbG9jYWwKbmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZQppbGxlZ2FsLCBidXQgYGBleGVjIG9iaiBpbiBuc2BgIHdvdWxkIGJlIGxlZ2FsLikKClRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlCmBgZXhlY2BgIHN0YXRlbWVudCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yCnJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWwgYW5kIGdsb2JhbApuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZQpuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gWzFdIFRoZQpgYGV4ZWNgYCBzdGF0ZW1lbnQgYW5kIHRoZSBgYGV2YWwoKWBgIGFuZCBgYGV4ZWNmaWxlKClgYCBmdW5jdGlvbnMKaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLgpJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLgpzEAAAAGR5bmFtaWMtZmVhdHVyZXNzUQIAAApUaGUgYGBpZmBgIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKgoKVGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOgoKICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZQogICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKgogICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KCkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmUKYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKgpmb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWQKKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuCklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZgpwcmVzZW50LCBpcyBleGVjdXRlZC4KdAQAAABlbHNlc3oJAAAKRXhjZXB0aW9ucwoqKioqKioqKioqCgpFeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgY29udHJvbApvZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbApjb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZXJyb3IgaXMKZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgYnkgYW55CmNvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmUKdGhlIGVycm9yIG9jY3VycmVkLgoKVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lCmVycm9yIChzdWNoIGFzIGRpdmlzaW9uIGJ5IHplcm8pLiAgQSBQeXRob24gcHJvZ3JhbSBjYW4gYWxzbwpleHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBgYHJhaXNlYGAgc3RhdGVtZW50LiBFeGNlcHRpb24KaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBgYHRyeWBgIC4uLiBgYGV4Y2VwdGBgIHN0YXRlbWVudC4gIFRoZQpgYGZpbmFsbHlgYCBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGNsZWFudXAKY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW4KZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuCgpQeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uCmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlcgpsZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgdGhlCmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlCmZyb20gdGhlIHRvcCkuCgpXaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzCmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW4KZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIGJhY2t0cmFjZSwgZXhjZXB0IHdoZW4gdGhlIGV4Y2VwdGlvbiBpcwpgYFN5c3RlbUV4aXRgYC4KCkV4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlIGBgZXhjZXB0YGAgY2xhdXNlCmlzIHNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZQp0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlIGNhbgpiZSByZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQKdGhlIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi4KCkV4Y2VwdGlvbnMgY2FuIGFsc28gYmUgaWRlbnRpZmllZCBieSBzdHJpbmdzLCBpbiB3aGljaCBjYXNlIHRoZQpgYGV4Y2VwdGBgIGNsYXVzZSBpcyBzZWxlY3RlZCBieSBvYmplY3QgaWRlbnRpdHkuICBBbiBhcmJpdHJhcnkgdmFsdWUKY2FuIGJlIHJhaXNlZCBhbG9uZyB3aXRoIHRoZSBpZGVudGlmeWluZyBzdHJpbmcgd2hpY2ggY2FuIGJlIHBhc3NlZCB0bwp0aGUgaGFuZGxlci4KCk5vdGU6IE1lc3NhZ2VzIHRvIGV4Y2VwdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXIKICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXQKICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyCiAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLgoKU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYHRyeWBgIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5CnN0YXRlbWVudCogYW5kIGBgcmFpc2VgYCBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouCgotWyBGb290bm90ZXMgXS0KClsxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCBieSB0aGVzZQogICAgb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXMgY29tcGlsZWQuCnQKAAAAZXhjZXB0aW9uc3OKJgAACkV4ZWN1dGlvbiBtb2RlbAoqKioqKioqKioqKioqKioKCgpOYW1pbmcgYW5kIGJpbmRpbmcKPT09PT09PT09PT09PT09PT09CgoqTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmcKb3BlcmF0aW9ucy4gRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0bwp0aGUgKmJpbmRpbmcqIG9mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBpbiB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIGJsb2NrCmNvbnRhaW5pbmcgdGhlIHVzZS4KCkEgKmJsb2NrKiBpcyBhIHBpZWNlIG9mIFB5dGhvbiBwcm9ncmFtIHRleHQgdGhhdCBpcyBleGVjdXRlZCBhcyBhCnVuaXQuIFRoZSBmb2xsb3dpbmcgYXJlIGJsb2NrczogYSBtb2R1bGUsIGEgZnVuY3Rpb24gYm9keSwgYW5kIGEgY2xhc3MKZGVmaW5pdGlvbi4gRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0CmZpbGUgKGEgZmlsZSBnaXZlbiBhcyBzdGFuZGFyZCBpbnB1dCB0byB0aGUgaW50ZXJwcmV0ZXIgb3Igc3BlY2lmaWVkCm9uIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGxpbmUgdGhlIGZpcnN0IGFyZ3VtZW50KSBpcyBhIGNvZGUgYmxvY2suCkEgc2NyaXB0IGNvbW1hbmQgKGEgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZQp3aXRoIHRoZSAnKiotYyoqJyBvcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBmaWxlIHJlYWQgYnkgdGhlCmJ1aWx0LWluIGZ1bmN0aW9uIGBgZXhlY2ZpbGUoKWBgIGlzIGEgY29kZSBibG9jay4gIFRoZSBzdHJpbmcgYXJndW1lbnQKcGFzc2VkIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGV2YWwoKWBgIGFuZCB0byB0aGUgYGBleGVjYGAKc3RhdGVtZW50IGlzIGEgY29kZSBibG9jay4gVGhlIGV4cHJlc3Npb24gcmVhZCBhbmQgZXZhbHVhdGVkIGJ5IHRoZQpidWlsdC1pbiBmdW5jdGlvbiBgYGlucHV0KClgYCBpcyBhIGNvZGUgYmxvY2suCgpBIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zCnNvbWUgYWRtaW5pc3RyYXRpdmUgaW5mb3JtYXRpb24gKHVzZWQgZm9yIGRlYnVnZ2luZykgYW5kIGRldGVybWluZXMKd2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrJ3MgZXhlY3V0aW9uIGhhcwpjb21wbGV0ZWQuCgpBICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsCnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGUKZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55IGJsb2Nrcwpjb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzCmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLiAgVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYQpjbGFzcyBibG9jayBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZQpjb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tIHRoaXMgaW5jbHVkZXMgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlCnRoZXkgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlCmZvbGxvd2luZyB3aWxsIGZhaWw6CgogICBjbGFzcyBBOgogICAgICAgYSA9IDQyCiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpCgpXaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIG5lYXJlc3QKZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2sKaXMgY2FsbGVkIHRoZSBibG9jaydzICplbnZpcm9ubWVudCouCgpJZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLgpJZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlIG1vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlCnZhcmlhYmxlcyBvZiB0aGUgbW9kdWxlIGNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYQp2YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZSBibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUKdmFyaWFibGUqLgoKV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSBgYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuCklmIHRoZSBuYW1lIHJlZmVycyB0byBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgaGFzIG5vdCBiZWVuIGJvdW5kLCBhCmBgVW5ib3VuZExvY2FsRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgYGBVbmJvdW5kTG9jYWxFcnJvcmBgIGlzIGEKc3ViY2xhc3Mgb2YgYGBOYW1lRXJyb3JgYC4KClRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsCmBgaW1wb3J0YGAgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kIHRoZQpjbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlCmlkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCBgYGZvcmBgIGxvb3AgaGVhZGVyLCBpbiB0aGUKc2Vjb25kIHBvc2l0aW9uIG9mIGFuIGBgZXhjZXB0YGAgY2xhdXNlIGhlYWRlciBvciBhZnRlciBgYGFzYGAgaW4gYQpgYHdpdGhgYCBzdGF0ZW1lbnQuICBUaGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gYGBmcm9tIC4uLgppbXBvcnQgKmBgIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdAp0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlCm1vZHVsZSBsZXZlbC4KCkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhIGBgZGVsYGAgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3IKdGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuICBJdAppcyBpbGxlZ2FsIHRvIHVuYmluZCBhIG5hbWUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFuIGVuY2xvc2luZyBzY29wZTsKdGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgYGBTeW50YXhFcnJvcmBgLgoKRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYQpjbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWwKY29kZSBibG9jaykuCgpJZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbAp1c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGUKY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGEKYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzCmRlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlCndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmUKZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lIGJpbmRpbmcKb3BlcmF0aW9ucy4KCklmIHRoZSBnbG9iYWwgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWUKc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZQp0b3AtbGV2ZWwgbmFtZXNwYWNlLiBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnkKc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZQpjb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlIG5hbWVzcGFjZQpvZiB0aGUgbW9kdWxlIGBgX19idWlsdGluX19gYC4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkCmZpcnN0LiAgSWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzCnNlYXJjaGVkLiAgVGhlIGdsb2JhbCBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLgoKVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgYmxvY2sKaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSBgYF9fYnVpbHRpbnNfX2BgIGluIGl0cwpnbG9iYWwgbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZQpsYXR0ZXIgY2FzZSB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlCmBgX19tYWluX19gYCBtb2R1bGUsIGBgX19idWlsdGluc19fYGAgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZQpgYF9fYnVpbHRpbl9fYGAgKG5vdGU6IG5vICdzJyk7IHdoZW4gaW4gYW55IG90aGVyIG1vZHVsZSwKYGBfX2J1aWx0aW5zX19gYCBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIGBgX19idWlsdGluX19gYAptb2R1bGUgaXRzZWxmLiAgYGBfX2J1aWx0aW5zX19gYCBjYW4gYmUgc2V0IHRvIGEgdXNlci1jcmVhdGVkCmRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoCmBgX19idWlsdGluc19fYGA7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzCndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkIGBgaW1wb3J0YGAKdGhlIGBgX19idWlsdGluX19gYCAobm8gJ3MnKSBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlcwphcHByb3ByaWF0ZWx5LgoKVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGEKbW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkCmBgX19tYWluX19gYC4KClRoZSBgYGdsb2JhbGBgIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcKb3BlcmF0aW9uIGluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhCmZyZWUgdmFyaWFibGUgY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcwp0cmVhdGVkIGFzIGEgZ2xvYmFsLgoKQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lCm5hbWVzLiBUaGVzZSByZWZlcmVuY2VzIGZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24uClRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkKb2YgdGhlIGNsYXNzLiAgTmFtZXMgZGVmaW5lZCBhdCB0aGUgY2xhc3Mgc2NvcGUgYXJlIG5vdCB2aXNpYmxlIGluCm1ldGhvZHMuCgoKSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkCmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuCgpJZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvCmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLgoKSWYgdGhlIHdpbGQgY2FyZCBmb3JtIG9mIGltcG9ydCAtLS0gYGBpbXBvcnQgKmBgIC0tLSBpcyB1c2VkIGluIGEKZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWUKdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC4KCklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEKbmVzdGVkIGJsb2NrIHdpdGggZnJlZSB2YXJpYWJsZXMsIHRoZSBjb21waWxlciB3aWxsIHJhaXNlIGEKYGBTeW50YXhFcnJvcmBgIHVubGVzcyB0aGUgZXhlYyBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgbG9jYWwKbmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZQppbGxlZ2FsLCBidXQgYGBleGVjIG9iaiBpbiBuc2BgIHdvdWxkIGJlIGxlZ2FsLikKClRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlCmBgZXhlY2BgIHN0YXRlbWVudCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yCnJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWwgYW5kIGdsb2JhbApuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZQpuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gWzFdIFRoZQpgYGV4ZWNgYCBzdGF0ZW1lbnQgYW5kIHRoZSBgYGV2YWwoKWBgIGFuZCBgYGV4ZWNmaWxlKClgYCBmdW5jdGlvbnMKaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLgpJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLgoKCkV4Y2VwdGlvbnMKPT09PT09PT09PQoKRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mIGNvbnRyb2wKb2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWwKY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzCmRldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yIGJ5IGFueQpjb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrIHdoZXJlCnRoZSBlcnJvciBvY2N1cnJlZC4KClRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSBydW4tdGltZQplcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc28KZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgYGByYWlzZWBgIHN0YXRlbWVudC4gRXhjZXB0aW9uCmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgYGB0cnlgYCAuLi4gYGBleGNlcHRgYCBzdGF0ZW1lbnQuICBUaGUKYGBmaW5hbGx5YGAgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwCmNvZGUgd2hpY2ggZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24sIGJ1dCBpcyBleGVjdXRlZCB3aGV0aGVyIGFuCmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLgoKUHl0aG9uIHVzZXMgdGhlICJ0ZXJtaW5hdGlvbiIgbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuIGV4Y2VwdGlvbgpoYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXIKbGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZQpmYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgY29kZQpmcm9tIHRoZSB0b3ApLgoKV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlcwpleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluCmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXMKYGBTeXN0ZW1FeGl0YGAuCgpFeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSBgYGV4Y2VwdGBgIGNsYXVzZQppcyBzZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCByZWZlcmVuY2UKdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSBjYW4KYmUgcmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0CnRoZSBleGNlcHRpb25hbCBjb25kaXRpb24uCgpFeGNlcHRpb25zIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgc3RyaW5ncywgaW4gd2hpY2ggY2FzZSB0aGUKYGBleGNlcHRgYCBjbGF1c2UgaXMgc2VsZWN0ZWQgYnkgb2JqZWN0IGlkZW50aXR5LiAgQW4gYXJiaXRyYXJ5IHZhbHVlCmNhbiBiZSByYWlzZWQgYWxvbmcgd2l0aCB0aGUgaWRlbnRpZnlpbmcgc3RyaW5nIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8KdGhlIGhhbmRsZXIuCgpOb3RlOiBNZXNzYWdlcyB0byBleGNlcHRpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gIFRoZWlyCiAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCB3aXRob3V0CiAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biB1bmRlcgogIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci4KClNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGB0cnlgYCBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHRyeQpzdGF0ZW1lbnQqIGFuZCBgYHJhaXNlYGAgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLgoKLVsgRm9vdG5vdGVzIF0tCgpbMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnkgdGhlc2UKICAgIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkLgp0CQAAAGV4ZWNtb2RlbHNNAgAACkV4cHJlc3Npb24gbGlzdHMKKioqKioqKioqKioqKioqKgoKICAgZXhwcmVzc2lvbl9saXN0IDo6PSBleHByZXNzaW9uICggIiwiIGV4cHJlc3Npb24gKSogWyIsIl0KCkFuIGV4cHJlc3Npb24gbGlzdCBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYSB0dXBsZS4gIFRoZQpsZW5ndGggb2YgdGhlIHR1cGxlIGlzIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaW4gdGhlIGxpc3QuICBUaGUKZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQuCgpUaGUgdHJhaWxpbmcgY29tbWEgaXMgcmVxdWlyZWQgb25seSB0byBjcmVhdGUgYSBzaW5nbGUgdHVwbGUgKGEuay5hLiBhCipzaW5nbGV0b24qKTsgaXQgaXMgb3B0aW9uYWwgaW4gYWxsIG90aGVyIGNhc2VzLiAgQSBzaW5nbGUgZXhwcmVzc2lvbgp3aXRob3V0IGEgdHJhaWxpbmcgY29tbWEgZG9lc24ndCBjcmVhdGUgYSB0dXBsZSwgYnV0IHJhdGhlciB5aWVsZHMgdGhlCnZhbHVlIG9mIHRoYXQgZXhwcmVzc2lvbi4gKFRvIGNyZWF0ZSBhbiBlbXB0eSB0dXBsZSwgdXNlIGFuIGVtcHR5IHBhaXIKb2YgcGFyZW50aGVzZXM6IGBgKClgYC4pCnQJAAAAZXhwcmxpc3Rzc6QDAAAKRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMKKioqKioqKioqKioqKioqKioqKioqKioKCkZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsCmRlZmluaXRpb25zOgoKICAgZmxvYXRudW1iZXIgICA6Oj0gcG9pbnRmbG9hdCB8IGV4cG9uZW50ZmxvYXQKICAgcG9pbnRmbG9hdCAgICA6Oj0gW2ludHBhcnRdIGZyYWN0aW9uIHwgaW50cGFydCAiLiIKICAgZXhwb25lbnRmbG9hdCA6Oj0gKGludHBhcnQgfCBwb2ludGZsb2F0KSBleHBvbmVudAogICBpbnRwYXJ0ICAgICAgIDo6PSBkaWdpdCsKICAgZnJhY3Rpb24gICAgICA6Oj0gIi4iIGRpZ2l0KwogICBleHBvbmVudCAgICAgIDo6PSAoImUiIHwgIkUiKSBbIisiIHwgIi0iXSBkaWdpdCsKCk5vdGUgdGhhdCB0aGUgaW50ZWdlciBhbmQgZXhwb25lbnQgcGFydHMgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjYW4KbG9vayBsaWtlIG9jdGFsIGludGVnZXJzLCBidXQgYXJlIGludGVycHJldGVkIHVzaW5nIHJhZGl4IDEwLiAgRm9yCmV4YW1wbGUsIGBgMDc3ZTAxMGBgIGlzIGxlZ2FsLCBhbmQgZGVub3RlcyB0aGUgc2FtZSBudW1iZXIgYXMKYGA3N2UxMGBgLiBUaGUgYWxsb3dlZCByYW5nZSBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFscyBpcwppbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIFNvbWUgZXhhbXBsZXMgb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHM6CgogICAzLjE0ICAgIDEwLiAgICAuMDAxICAgIDFlMTAwICAgIDMuMTRlLTEwICAgIDBlMAoKTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlIGBgLTFgYAppcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciBgYC1gYCBhbmQgdGhlCmxpdGVyYWwgYGAxYGAuCnQIAAAAZmxvYXRpbmdzdAkAAApUaGUgYGBmb3JgYCBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqCgpUaGUgYGBmb3JgYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEKc2VxdWVuY2UgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDoKCiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGUKICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXQoKVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlCm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlCmBgZXhwcmVzc2lvbl9saXN0YGAuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoIGl0ZW0KcHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgb2YgYXNjZW5kaW5nIGluZGljZXMuICBFYWNoCml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzCmZvciBhc3NpZ25tZW50cywgYW5kIHRoZW4gdGhlIHN1aXRlIGlzIGV4ZWN1dGVkLiAgV2hlbiB0aGUgaXRlbXMgYXJlCmV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgZW1wdHkpLCB0aGUgc3VpdGUKaW4gdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcAp0ZXJtaW5hdGVzLgoKQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wCndpdGhvdXQgZXhlY3V0aW5nIHRoZSBgYGVsc2VgYCBjbGF1c2UncyBzdWl0ZS4gIEEgYGBjb250aW51ZWBgCnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZApjb250aW51ZXMgd2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSBgYGVsc2VgYCBjbGF1c2UgaWYgdGhlcmUgd2FzCm5vIG5leHQgaXRlbS4KClRoZSBzdWl0ZSBtYXkgYXNzaWduIHRvIHRoZSB2YXJpYWJsZShzKSBpbiB0aGUgdGFyZ2V0IGxpc3Q7IHRoaXMgZG9lcwpub3QgYWZmZWN0IHRoZSBuZXh0IGl0ZW0gYXNzaWduZWQgdG8gaXQuCgpUaGUgdGFyZ2V0IGxpc3QgaXMgbm90IGRlbGV0ZWQgd2hlbiB0aGUgbG9vcCBpcyBmaW5pc2hlZCwgYnV0IGlmIHRoZQpzZXF1ZW5jZSBpcyBlbXB0eSwgaXQgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0IGFsbCBieSB0aGUKbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHJhbmdlKClgYCByZXR1cm5zIGEgc2VxdWVuY2Ugb2YKaW50ZWdlcnMgc3VpdGFibGUgdG8gZW11bGF0ZSB0aGUgZWZmZWN0IG9mIFBhc2NhbCdzIGBgZm9yIGkgOj0gYSB0byBiCmRvYGA7IGUuZy4sIGBgcmFuZ2UoMylgYCByZXR1cm5zIHRoZSBsaXN0IGBgWzAsIDEsIDJdYGAuCgpOb3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZSBsb29wCiAgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gQW4gaW50ZXJuYWwKICBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgbmV4dCwgYW5kIHRoaXMKICBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhcyByZWFjaGVkIHRoZQogIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUKICBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtIGZyb20gdGhlIHNlcXVlbmNlLAogIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCBvZiB0aGUKICBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGUKICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCB0aGUKICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC4KICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYQogIHRlbXBvcmFyeSBjb3B5IHVzaW5nIGEgc2xpY2Ugb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBlLmcuLAoKICAgICBmb3IgeCBpbiBhWzpdOgogICAgICAgICBpZiB4IDwgMDogYS5yZW1vdmUoeCkKdAMAAABmb3JzFlEAAApGb3JtYXQgU3RyaW5nIFN5bnRheAoqKioqKioqKioqKioqKioqKioqKgoKVGhlIGBgc3RyLmZvcm1hdCgpYGAgbWV0aG9kIGFuZCB0aGUgYGBGb3JtYXR0ZXJgYCBjbGFzcyBzaGFyZSB0aGUgc2FtZQpzeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiBgYEZvcm1hdHRlcmBgLApzdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS4KCkZvcm1hdCBzdHJpbmdzIGNvbnRhaW4gInJlcGxhY2VtZW50IGZpZWxkcyIgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXMKYGB7fWBgLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzIGNvbnNpZGVyZWQgbGl0ZXJhbAp0ZXh0LCB3aGljaCBpcyBjb3BpZWQgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQuICBJZiB5b3UgbmVlZCB0byBpbmNsdWRlCmEgYnJhY2UgY2hhcmFjdGVyIGluIHRoZSBsaXRlcmFsIHRleHQsIGl0IGNhbiBiZSBlc2NhcGVkIGJ5IGRvdWJsaW5nOgpgYHt7YGAgYW5kIGBgfX1gYC4KClRoZSBncmFtbWFyIGZvciBhIHJlcGxhY2VtZW50IGZpZWxkIGlzIGFzIGZvbGxvd3M6CgogICAgICByZXBsYWNlbWVudF9maWVsZCA6Oj0gInsiIFtmaWVsZF9uYW1lXSBbIiEiIGNvbnZlcnNpb25dIFsiOiIgZm9ybWF0X3NwZWNdICJ9IgogICAgICBmaWVsZF9uYW1lICAgICAgICA6Oj0gYXJnX25hbWUgKCIuIiBhdHRyaWJ1dGVfbmFtZSB8ICJbIiBlbGVtZW50X2luZGV4ICJdIikqCiAgICAgIGFyZ19uYW1lICAgICAgICAgIDo6PSBbaWRlbnRpZmllciB8IGludGVnZXJdCiAgICAgIGF0dHJpYnV0ZV9uYW1lICAgIDo6PSBpZGVudGlmaWVyCiAgICAgIGVsZW1lbnRfaW5kZXggICAgIDo6PSBpbnRlZ2VyIHwgaW5kZXhfc3RyaW5nCiAgICAgIGluZGV4X3N0cmluZyAgICAgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJdIj4gKwogICAgICBjb252ZXJzaW9uICAgICAgICA6Oj0gInIiIHwgInMiCiAgICAgIGZvcm1hdF9zcGVjICAgICAgIDo6PSA8ZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24+CgpJbiBsZXNzIGZvcm1hbCB0ZXJtcywgdGhlIHJlcGxhY2VtZW50IGZpZWxkIGNhbiBzdGFydCB3aXRoIGEKKmZpZWxkX25hbWUqIHRoYXQgc3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgdG8gYmUgZm9ybWF0dGVkCmFuZCBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiB0aGUgcmVwbGFjZW1lbnQgZmllbGQuIFRoZQoqZmllbGRfbmFtZSogaXMgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICAqY29udmVyc2lvbiogZmllbGQsIHdoaWNoIGlzCnByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50IGBgJyEnYGAsIGFuZCBhICpmb3JtYXRfc3BlYyosIHdoaWNoCmlzIHByZWNlZGVkIGJ5IGEgY29sb24gYGAnOidgYC4gIFRoZXNlIHNwZWNpZnkgYSBub24tZGVmYXVsdCBmb3JtYXQKZm9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZS4KClNlZSBhbHNvIHRoZSAqRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSogc2VjdGlvbi4KClRoZSAqZmllbGRfbmFtZSogaXRzZWxmIGJlZ2lucyB3aXRoIGFuICphcmdfbmFtZSogdGhhdCBpcyBlaXRoZXIgYQpudW1iZXIgb3IgYSBrZXl3b3JkLiAgSWYgaXQncyBhIG51bWJlciwgaXQgcmVmZXJzIHRvIGEgcG9zaXRpb25hbAphcmd1bWVudCwgYW5kIGlmIGl0J3MgYSBrZXl3b3JkLCBpdCByZWZlcnMgdG8gYSBuYW1lZCBrZXl3b3JkCmFyZ3VtZW50LiAgSWYgdGhlIG51bWVyaWNhbCBhcmdfbmFtZXMgaW4gYSBmb3JtYXQgc3RyaW5nIGFyZSAwLCAxLCAyLAouLi4gaW4gc2VxdWVuY2UsIHRoZXkgY2FuIGFsbCBiZSBvbWl0dGVkIChub3QganVzdCBzb21lKSBhbmQgdGhlCm51bWJlcnMgMCwgMSwgMiwgLi4uIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbiB0aGF0IG9yZGVyLgpCZWNhdXNlICphcmdfbmFtZSogaXMgbm90IHF1b3RlLWRlbGltaXRlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvCnNwZWNpZnkgYXJiaXRyYXJ5IGRpY3Rpb25hcnkga2V5cyAoZS5nLiwgdGhlIHN0cmluZ3MgYGAnMTAnYGAgb3IKYGAnOi1dJ2BgKSB3aXRoaW4gYSBmb3JtYXQgc3RyaW5nLiBUaGUgKmFyZ19uYW1lKiBjYW4gYmUgZm9sbG93ZWQgYnkKYW55IG51bWJlciBvZiBpbmRleCBvciBhdHRyaWJ1dGUgZXhwcmVzc2lvbnMuIEFuIGV4cHJlc3Npb24gb2YgdGhlCmZvcm0gYGAnLm5hbWUnYGAgc2VsZWN0cyB0aGUgbmFtZWQgYXR0cmlidXRlIHVzaW5nIGBgZ2V0YXR0cigpYGAsCndoaWxlIGFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gYGAnW2luZGV4XSdgYCBkb2VzIGFuIGluZGV4IGxvb2t1cAp1c2luZyBgYF9fZ2V0aXRlbV9fKClgYC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAyLjc6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgY2FuIGJlCm9taXR0ZWQsIHNvIGBgJ3t9IHt9J2BgIGlzIGVxdWl2YWxlbnQgdG8gYGAnezB9IHsxfSdgYC4KClNvbWUgc2ltcGxlIGZvcm1hdCBzdHJpbmcgZXhhbXBsZXM6CgogICAiRmlyc3QsIHRob3Ugc2hhbHQgY291bnQgdG8gezB9IiAjIFJlZmVyZW5jZXMgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudAogICAiQnJpbmcgbWUgYSB7fSIgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0bHkgcmVmZXJlbmNlcyB0aGUgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudAogICAiRnJvbSB7fSB0byB7fSIgICAgICAgICAgICAgICAgICAjIFNhbWUgYXMgIkZyb20gezB9IHRvIHsxfSIKICAgIk15IHF1ZXN0IGlzIHtuYW1lfSIgICAgICAgICAgICAgIyBSZWZlcmVuY2VzIGtleXdvcmQgYXJndW1lbnQgJ25hbWUnCiAgICJXZWlnaHQgaW4gdG9ucyB7MC53ZWlnaHR9IiAgICAgICMgJ3dlaWdodCcgYXR0cmlidXRlIG9mIGZpcnN0IHBvc2l0aW9uYWwgYXJnCiAgICJVbml0cyBkZXN0cm95ZWQ6IHtwbGF5ZXJzWzBdfSIgICMgRmlyc3QgZWxlbWVudCBvZiBrZXl3b3JkIGFyZ3VtZW50ICdwbGF5ZXJzJy4KClRoZSAqY29udmVyc2lvbiogZmllbGQgY2F1c2VzIGEgdHlwZSBjb2VyY2lvbiBiZWZvcmUgZm9ybWF0dGluZy4KTm9ybWFsbHksIHRoZSBqb2Igb2YgZm9ybWF0dGluZyBhIHZhbHVlIGlzIGRvbmUgYnkgdGhlCmBgX19mb3JtYXRfXygpYGAgbWV0aG9kIG9mIHRoZSB2YWx1ZSBpdHNlbGYuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzCml0IGlzIGRlc2lyYWJsZSB0byBmb3JjZSBhIHR5cGUgdG8gYmUgZm9ybWF0dGVkIGFzIGEgc3RyaW5nLApvdmVycmlkaW5nIGl0cyBvd24gZGVmaW5pdGlvbiBvZiBmb3JtYXR0aW5nLiAgQnkgY29udmVydGluZyB0aGUgdmFsdWUKdG8gYSBzdHJpbmcgYmVmb3JlIGNhbGxpbmcgYGBfX2Zvcm1hdF9fKClgYCwgdGhlIG5vcm1hbCBmb3JtYXR0aW5nCmxvZ2ljIGlzIGJ5cGFzc2VkLgoKVHdvIGNvbnZlcnNpb24gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6IGBgJyFzJ2BgIHdoaWNoIGNhbGxzCmBgc3RyKClgYCBvbiB0aGUgdmFsdWUsIGFuZCBgYCchcidgYCB3aGljaCBjYWxscyBgYHJlcHIoKWBgLgoKU29tZSBleGFtcGxlczoKCiAgICJIYXJvbGQncyBhIGNsZXZlciB7MCFzfSIgICAgICAgICMgQ2FsbHMgc3RyKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0CiAgICJCcmluZyBvdXQgdGhlIGhvbHkge25hbWUhcn0iICAgICMgQ2FsbHMgcmVwcigpIG9uIHRoZSBhcmd1bWVudCBmaXJzdAoKVGhlICpmb3JtYXRfc3BlYyogZmllbGQgY29udGFpbnMgYSBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGUgdmFsdWUKc2hvdWxkIGJlIHByZXNlbnRlZCwgaW5jbHVkaW5nIHN1Y2ggZGV0YWlscyBhcyBmaWVsZCB3aWR0aCwgYWxpZ25tZW50LApwYWRkaW5nLCBkZWNpbWFsIHByZWNpc2lvbiBhbmQgc28gb24uICBFYWNoIHZhbHVlIHR5cGUgY2FuIGRlZmluZSBpdHMKb3duICJmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2UiIG9yIGludGVycHJldGF0aW9uIG9mIHRoZSAqZm9ybWF0X3NwZWMqLgoKTW9zdCBidWlsdC1pbiB0eXBlcyBzdXBwb3J0IGEgY29tbW9uIGZvcm1hdHRpbmcgbWluaS1sYW5ndWFnZSwgd2hpY2gKaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCgpBICpmb3JtYXRfc3BlYyogZmllbGQgY2FuIGFsc28gaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzCndpdGhpbiBpdC4gVGhlc2UgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkcyBjYW4gY29udGFpbiBvbmx5IGEgZmllbGQKbmFtZTsgY29udmVyc2lvbiBmbGFncyBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb25zIGFyZSBub3QgYWxsb3dlZC4gIFRoZQpyZXBsYWNlbWVudCBmaWVsZHMgd2l0aGluIHRoZSBmb3JtYXRfc3BlYyBhcmUgc3Vic3RpdHV0ZWQgYmVmb3JlIHRoZQoqZm9ybWF0X3NwZWMqIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gVGhpcyBhbGxvd3MgdGhlIGZvcm1hdHRpbmcgb2YgYQp2YWx1ZSB0byBiZSBkeW5hbWljYWxseSBzcGVjaWZpZWQuCgpTZWUgdGhlICpGb3JtYXQgZXhhbXBsZXMqIHNlY3Rpb24gZm9yIHNvbWUgZXhhbXBsZXMuCgoKRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoiRm9ybWF0IHNwZWNpZmljYXRpb25zIiBhcmUgdXNlZCB3aXRoaW4gcmVwbGFjZW1lbnQgZmllbGRzIGNvbnRhaW5lZAp3aXRoaW4gYSBmb3JtYXQgc3RyaW5nIHRvIGRlZmluZSBob3cgaW5kaXZpZHVhbCB2YWx1ZXMgYXJlIHByZXNlbnRlZAooc2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCopLiAgVGhleSBjYW4gYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlCmJ1aWx0LWluIGBgZm9ybWF0KClgYCBmdW5jdGlvbi4gIEVhY2ggZm9ybWF0dGFibGUgdHlwZSBtYXkgZGVmaW5lIGhvdwp0aGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgdG8gYmUgaW50ZXJwcmV0ZWQuCgpNb3N0IGJ1aWx0LWluIHR5cGVzIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZm9yIGZvcm1hdApzcGVjaWZpY2F0aW9ucywgYWx0aG91Z2ggc29tZSBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGFyZSBvbmx5CnN1cHBvcnRlZCBieSB0aGUgbnVtZXJpYyB0eXBlcy4KCkEgZ2VuZXJhbCBjb252ZW50aW9uIGlzIHRoYXQgYW4gZW1wdHkgZm9ybWF0IHN0cmluZyAoYGAiImBgKSBwcm9kdWNlcwp0aGUgc2FtZSByZXN1bHQgYXMgaWYgeW91IGhhZCBjYWxsZWQgYGBzdHIoKWBgIG9uIHRoZSB2YWx1ZS4gQSBub24tCmVtcHR5IGZvcm1hdCBzdHJpbmcgdHlwaWNhbGx5IG1vZGlmaWVzIHRoZSByZXN1bHQuCgpUaGUgZ2VuZXJhbCBmb3JtIG9mIGEgKnN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpZXIqIGlzOgoKICAgZm9ybWF0X3NwZWMgOjo9IFtbZmlsbF1hbGlnbl1bc2lnbl1bI11bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdCiAgIGZpbGwgICAgICAgIDo6PSA8YW55IGNoYXJhY3Rlcj4KICAgYWxpZ24gICAgICAgOjo9ICI8IiB8ICI+IiB8ICI9IiB8ICJeIgogICBzaWduICAgICAgICA6Oj0gIisiIHwgIi0iIHwgIiAiCiAgIHdpZHRoICAgICAgIDo6PSBpbnRlZ2VyCiAgIHByZWNpc2lvbiAgIDo6PSBpbnRlZ2VyCiAgIHR5cGUgICAgICAgIDo6PSAiYiIgfCAiYyIgfCAiZCIgfCAiZSIgfCAiRSIgfCAiZiIgfCAiRiIgfCAiZyIgfCAiRyIgfCAibiIgfCAibyIgfCAicyIgfCAieCIgfCAiWCIgfCAiJSIKCklmIGEgdmFsaWQgKmFsaWduKiB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGNhbiBiZSBwcmVjZWVkZWQgYnkgYSAqZmlsbCoKY2hhcmFjdGVyIHRoYXQgY2FuIGJlIGFueSBjaGFyYWN0ZXIgYW5kIGRlZmF1bHRzIHRvIGEgc3BhY2UgaWYKb21pdHRlZC4gTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGB7YGAgYW5kIGBgfWBgIGFzICpmaWxsKgpjaGFyIHdoaWxlIHVzaW5nIHRoZSBgYHN0ci5mb3JtYXQoKWBgIG1ldGhvZDsgdGhpcyBsaW1pdGF0aW9uIGhvd2V2ZXIKZG9lc24ndCBhZmZlY3QgdGhlIGBgZm9ybWF0KClgYCBmdW5jdGlvbi4KClRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGFsaWdubWVudCBvcHRpb25zIGlzIGFzIGZvbGxvd3M6CgogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwogICB8IGBgJzwnYGAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgbGVmdC1hbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICAgfAogICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBtb3N0IG9iamVjdHMpLiAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJz4nYGAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgcmlnaHQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgfAogICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBudW1iZXJzKS4gICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJz0nYGAgICB8IEZvcmNlcyB0aGUgcGFkZGluZyB0byBiZSBwbGFjZWQgYWZ0ZXIgdGhlIHNpZ24gKGlmIGFueSkgICAgfAogICB8ICAgICAgICAgICB8IGJ1dCBiZWZvcmUgdGhlIGRpZ2l0cy4gIFRoaXMgaXMgdXNlZCBmb3IgcHJpbnRpbmcgZmllbGRzICAgfAogICB8ICAgICAgICAgICB8IGluIHRoZSBmb3JtICcrMDAwMDAwMTIwJy4gVGhpcyBhbGlnbm1lbnQgb3B0aW9uIGlzIG9ubHkgICAgfAogICB8ICAgICAgICAgICB8IHZhbGlkIGZvciBudW1lcmljIHR5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJ14nYGAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgY2VudGVyZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgICAgICAgfAogICB8ICAgICAgICAgICB8IHNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKTm90ZSB0aGF0IHVubGVzcyBhIG1pbmltdW0gZmllbGQgd2lkdGggaXMgZGVmaW5lZCwgdGhlIGZpZWxkIHdpZHRoCndpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGRhdGEgdG8gZmlsbCBpdCwgc28gdGhhdCB0aGUKYWxpZ25tZW50IG9wdGlvbiBoYXMgbm8gbWVhbmluZyBpbiB0aGlzIGNhc2UuCgpUaGUgKnNpZ24qIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBudW1iZXIgdHlwZXMsIGFuZCBjYW4gYmUgb25lIG9mCnRoZSBmb2xsb3dpbmc6CgogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwogICB8IGBgJysnYGAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBmb3IgYm90aCBwb3NpdGl2ZSBhcyAgfAogICB8ICAgICAgICAgICB8IHdlbGwgYXMgbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJy0nYGAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBuZWdhdGl2ZSAgICAgfAogICB8ICAgICAgICAgICB8IG51bWJlcnMgKHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IHNwYWNlICAgICB8IGluZGljYXRlcyB0aGF0IGEgbGVhZGluZyBzcGFjZSBzaG91bGQgYmUgdXNlZCBvbiBwb3NpdGl2ZSAgfAogICB8ICAgICAgICAgICB8IG51bWJlcnMsIGFuZCBhIG1pbnVzIHNpZ24gb24gbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKVGhlIGBgJyMnYGAgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGludGVnZXJzLCBhbmQgb25seSBmb3IgYmluYXJ5LApvY3RhbCwgb3IgaGV4YWRlY2ltYWwgb3V0cHV0LiAgSWYgcHJlc2VudCwgaXQgc3BlY2lmaWVzIHRoYXQgdGhlCm91dHB1dCB3aWxsIGJlIHByZWZpeGVkIGJ5IGBgJzBiJ2BgLCBgYCcwbydgYCwgb3IgYGAnMHgnYGAsCnJlc3BlY3RpdmVseS4KClRoZSBgYCcsJ2BgIG9wdGlvbiBzaWduYWxzIHRoZSB1c2Ugb2YgYSBjb21tYSBmb3IgYSB0aG91c2FuZHMKc2VwYXJhdG9yLiBGb3IgYSBsb2NhbGUgYXdhcmUgc2VwYXJhdG9yLCB1c2UgdGhlIGBgJ24nYGAgaW50ZWdlcgpwcmVzZW50YXRpb24gdHlwZSBpbnN0ZWFkLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogQWRkZWQgdGhlIGBgJywnYGAgb3B0aW9uIChzZWUgYWxzbyAqKlBFUAozNzgqKikuCgoqd2lkdGgqIGlzIGEgZGVjaW1hbCBpbnRlZ2VyIGRlZmluaW5nIHRoZSBtaW5pbXVtIGZpZWxkIHdpZHRoLiAgSWYgbm90CnNwZWNpZmllZCwgdGhlbiB0aGUgZmllbGQgd2lkdGggd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZW50LgoKUHJlY2VkaW5nIHRoZSAqd2lkdGgqIGZpZWxkIGJ5IGEgemVybyAoYGAnMCdgYCkgY2hhcmFjdGVyIGVuYWJsZXMKc2lnbi1hd2FyZSB6ZXJvLXBhZGRpbmcgZm9yIG51bWVyaWMgdHlwZXMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYQoqZmlsbCogY2hhcmFjdGVyIG9mIGBgJzAnYGAgd2l0aCBhbiAqYWxpZ25tZW50KiB0eXBlIG9mIGBgJz0nYGAuCgpUaGUgKnByZWNpc2lvbiogaXMgYSBkZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55IGRpZ2l0cyBzaG91bGQKYmUgZGlzcGxheWVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciBhIGZsb2F0aW5nIHBvaW50IHZhbHVlCmZvcm1hdHRlZCB3aXRoIGBgJ2YnYGAgYW5kIGBgJ0YnYGAsIG9yIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwKcG9pbnQgZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZm9ybWF0dGVkIHdpdGggYGAnZydgYCBvciBgYCdHJ2BgLgpGb3Igbm9uLW51bWJlciB0eXBlcyB0aGUgZmllbGQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIGZpZWxkIHNpemUgLSBpbgpvdGhlciB3b3JkcywgaG93IG1hbnkgY2hhcmFjdGVycyB3aWxsIGJlIHVzZWQgZnJvbSB0aGUgZmllbGQgY29udGVudC4KVGhlICpwcmVjaXNpb24qIGlzIG5vdCBhbGxvd2VkIGZvciBpbnRlZ2VyIHZhbHVlcy4KCkZpbmFsbHksIHRoZSAqdHlwZSogZGV0ZXJtaW5lcyBob3cgdGhlIGRhdGEgc2hvdWxkIGJlIHByZXNlbnRlZC4KClRoZSBhdmFpbGFibGUgc3RyaW5nIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6CgogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwogICB8IGBgJ3MnYGAgICB8IFN0cmluZyBmb3JtYXQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHlwZSBmb3Igc3RyaW5ncyBhbmQgICAgfAogICB8ICAgICAgICAgICB8IG1heSBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzIGBgJ3MnYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKVGhlIGF2YWlsYWJsZSBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6CgogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwogICB8IGBgJ2InYGAgICB8IEJpbmFyeSBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDIuICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJ2MnYGAgICB8IENoYXJhY3Rlci4gQ29udmVydHMgdGhlIGludGVnZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgICAgICAgfAogICB8ICAgICAgICAgICB8IHVuaWNvZGUgY2hhcmFjdGVyIGJlZm9yZSBwcmludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJ2QnYGAgICB8IERlY2ltYWwgSW50ZWdlci4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTAuICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJ28nYGAgICB8IE9jdGFsIGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgOC4gICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJ3gnYGAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDE2LCB1c2luZyBsb3dlci0gICAgfAogICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSA5LiAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJ1gnYGAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDE2LCB1c2luZyB1cHBlci0gICAgfAogICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSA5LiAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IGBgJ24nYGAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBgYCdkJ2BgLCBleGNlcHQgdGhhdCBpdCB1c2VzICAgfAogICB8ICAgICAgICAgICB8IHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgICAgICAgfAogICB8ICAgICAgICAgICB8IG51bWJlciBzZXBhcmF0b3IgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzIGBgJ2QnYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIHByZXNlbnRhdGlvbiB0eXBlcywgaW50ZWdlcnMgY2FuIGJlIGZvcm1hdHRlZAp3aXRoIHRoZSBmbG9hdGluZyBwb2ludCBwcmVzZW50YXRpb24gdHlwZXMgbGlzdGVkIGJlbG93IChleGNlcHQKYGAnbidgYCBhbmQgTm9uZSkuIFdoZW4gZG9pbmcgc28sIGBgZmxvYXQoKWBgIGlzIHVzZWQgdG8gY29udmVydCB0aGUKaW50ZWdlciB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBiZWZvcmUgZm9ybWF0dGluZy4KClRoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciBmbG9hdGluZyBwb2ludCBhbmQgZGVjaW1hbCB2YWx1ZXMKYXJlOgoKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKICAgfCBgYCdlJ2BgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gUHJpbnRzIHRoZSBudW1iZXIgaW4gc2NpZW50aWZpYyAgICAgICAgIHwKICAgfCAgICAgICAgICAgfCBub3RhdGlvbiB1c2luZyB0aGUgbGV0dGVyICdlJyB0byBpbmRpY2F0ZSB0aGUgZXhwb25lbnQuICAgIHwKICAgfCAgICAgICAgICAgfCBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgYGA2YGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBgYCdFJ2BgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gU2FtZSBhcyBgYCdlJ2BgIGV4Y2VwdCBpdCB1c2VzIGFuIHVwcGVyIHwKICAgfCAgICAgICAgICAgfCBjYXNlICdFJyBhcyB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBgYCdmJ2BgICAgfCBGaXhlZCBwb2ludC4gRGlzcGxheXMgdGhlIG51bWJlciBhcyBhIGZpeGVkLXBvaW50IG51bWJlci4gIHwKICAgfCAgICAgICAgICAgfCBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgYGA2YGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBgYCdGJ2BgICAgfCBGaXhlZCBwb2ludC4gU2FtZSBhcyBgYCdmJ2BgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBgYCdnJ2BgICAgfCBHZW5lcmFsIGZvcm1hdC4gIEZvciBhIGdpdmVuIHByZWNpc2lvbiBgYHAgPj0gMWBgLCB0aGlzICAgIHwKICAgfCAgICAgICAgICAgfCByb3VuZHMgdGhlIG51bWJlciB0byBgYHBgYCBzaWduaWZpY2FudCBkaWdpdHMgYW5kIHRoZW4gICAgIHwKICAgfCAgICAgICAgICAgfCBmb3JtYXRzIHRoZSByZXN1bHQgaW4gZWl0aGVyIGZpeGVkLXBvaW50IGZvcm1hdCBvciBpbiAgICAgIHwKICAgfCAgICAgICAgICAgfCBzY2llbnRpZmljIG5vdGF0aW9uLCBkZXBlbmRpbmcgb24gaXRzIG1hZ25pdHVkZS4gIFRoZSAgICAgIHwKICAgfCAgICAgICAgICAgfCBwcmVjaXNlIHJ1bGVzIGFyZSBhcyBmb2xsb3dzOiBzdXBwb3NlIHRoYXQgdGhlIHJlc3VsdCAgICAgIHwKICAgfCAgICAgICAgICAgfCBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSBgYCdlJ2BgIGFuZCBwcmVjaXNpb24gICAgIHwKICAgfCAgICAgICAgICAgfCBgYHAtMWBgIHdvdWxkIGhhdmUgZXhwb25lbnQgYGBleHBgYC4gIFRoZW4gaWYgYGAtNCA8PSBleHAgIHwKICAgfCAgICAgICAgICAgfCA8IHBgYCwgdGhlIG51bWJlciBpcyBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSAgICAgIHwKICAgfCAgICAgICAgICAgfCBgYCdmJ2BgIGFuZCBwcmVjaXNpb24gYGBwLTEtZXhwYGAuIE90aGVyd2lzZSwgdGhlIG51bWJlciAgIHwKICAgfCAgICAgICAgICAgfCBpcyBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSBgYCdlJ2BgIGFuZCBwcmVjaXNpb24gIHwKICAgfCAgICAgICAgICAgfCBgYHAtMWBgLiBJbiBib3RoIGNhc2VzIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MgYXJlICAgIHwKICAgfCAgICAgICAgICAgfCByZW1vdmVkIGZyb20gdGhlIHNpZ25pZmljYW5kLCBhbmQgdGhlIGRlY2ltYWwgcG9pbnQgaXMgICAgIHwKICAgfCAgICAgICAgICAgfCBhbHNvIHJlbW92ZWQgaWYgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBkaWdpdHMgZm9sbG93aW5nICAgIHwKICAgfCAgICAgICAgICAgfCBpdC4gIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBpbmZpbml0eSwgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHwKICAgfCAgICAgICAgICAgfCB6ZXJvLCBhbmQgbmFucywgYXJlIGZvcm1hdHRlZCBhcyBgYGluZmBgLCBgYC1pbmZgYCwgYGAwYGAsIHwKICAgfCAgICAgICAgICAgfCBgYC0wYGAgYW5kIGBgbmFuYGAgcmVzcGVjdGl2ZWx5LCByZWdhcmRsZXNzIG9mIHRoZSAgICAgICAgIHwKICAgfCAgICAgICAgICAgfCBwcmVjaXNpb24uICBBIHByZWNpc2lvbiBvZiBgYDBgYCBpcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgIHwKICAgfCAgICAgICAgICAgfCB0byBhIHByZWNpc2lvbiBvZiBgYDFgYC4gIFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyBgYDZgYC4gIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBgYCdHJ2BgICAgfCBHZW5lcmFsIGZvcm1hdC4gU2FtZSBhcyBgYCdnJ2BgIGV4Y2VwdCBzd2l0Y2hlcyB0byBgYCdFJ2BgIHwKICAgfCAgICAgICAgICAgfCBpZiB0aGUgbnVtYmVyIGdldHMgdG9vIGxhcmdlLiBUaGUgcmVwcmVzZW50YXRpb25zIG9mICAgICAgIHwKICAgfCAgICAgICAgICAgfCBpbmZpbml0eSBhbmQgTmFOIGFyZSB1cHBlcmNhc2VkLCB0b28uICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBgYCduJ2BgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgYGAnZydgYCwgZXhjZXB0IHRoYXQgaXQgdXNlcyAgIHwKICAgfCAgICAgICAgICAgfCB0aGUgY3VycmVudCBsb2NhbGUgc2V0dGluZyB0byBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlICAgICAgIHwKICAgfCAgICAgICAgICAgfCBudW1iZXIgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBgYCclJ2BgICAgfCBQZXJjZW50YWdlLiBNdWx0aXBsaWVzIHRoZSBudW1iZXIgYnkgMTAwIGFuZCBkaXNwbGF5cyBpbiAgIHwKICAgfCAgICAgICAgICAgfCBmaXhlZCAoYGAnZidgYCkgZm9ybWF0LCBmb2xsb3dlZCBieSBhIHBlcmNlbnQgc2lnbi4gICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyBgYCdnJ2BgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpGb3JtYXQgZXhhbXBsZXMKPT09PT09PT09PT09PT09CgpUaGlzIHNlY3Rpb24gY29udGFpbnMgZXhhbXBsZXMgb2YgdGhlIG5ldyBmb3JtYXQgc3ludGF4IGFuZCBjb21wYXJpc29uCndpdGggdGhlIG9sZCBgYCVgYC1mb3JtYXR0aW5nLgoKSW4gbW9zdCBvZiB0aGUgY2FzZXMgdGhlIHN5bnRheCBpcyBzaW1pbGFyIHRvIHRoZSBvbGQKYGAlYGAtZm9ybWF0dGluZywgd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlIGBge31gYCBhbmQgd2l0aCBgYDpgYCB1c2VkCmluc3RlYWQgb2YgYGAlYGAuIEZvciBleGFtcGxlLCBgYCclMDMuMmYnYGAgY2FuIGJlIHRyYW5zbGF0ZWQgdG8KYGAnezowMy4yZn0nYGAuCgpUaGUgbmV3IGZvcm1hdCBzeW50YXggYWxzbyBzdXBwb3J0cyBuZXcgYW5kIGRpZmZlcmVudCBvcHRpb25zLCBzaG93bgppbiB0aGUgZm9sbG93IGV4YW1wbGVzLgoKQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBwb3NpdGlvbjoKCiAgID4+PiAnezB9LCB7MX0sIHsyfScuZm9ybWF0KCdhJywgJ2InLCAnYycpCiAgICdhLCBiLCBjJwogICA+Pj4gJ3t9LCB7fSwge30nLmZvcm1hdCgnYScsICdiJywgJ2MnKSAgIyAyLjcrIG9ubHkKICAgJ2EsIGIsIGMnCiAgID4+PiAnezJ9LCB7MX0sIHswfScuZm9ybWF0KCdhJywgJ2InLCAnYycpCiAgICdjLCBiLCBhJwogICA+Pj4gJ3syfSwgezF9LCB7MH0nLmZvcm1hdCgqJ2FiYycpICAgICAgIyB1bnBhY2tpbmcgYXJndW1lbnQgc2VxdWVuY2UKICAgJ2MsIGIsIGEnCiAgID4+PiAnezB9ezF9ezB9Jy5mb3JtYXQoJ2FicmEnLCAnY2FkJykgICAjIGFyZ3VtZW50cycgaW5kaWNlcyBjYW4gYmUgcmVwZWF0ZWQKICAgJ2FicmFjYWRhYnJhJwoKQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBuYW1lOgoKICAgPj4+ICdDb29yZGluYXRlczoge2xhdGl0dWRlfSwge2xvbmdpdHVkZX0nLmZvcm1hdChsYXRpdHVkZT0nMzcuMjROJywgbG9uZ2l0dWRlPSctMTE1LjgxVycpCiAgICdDb29yZGluYXRlczogMzcuMjROLCAtMTE1LjgxVycKICAgPj4+IGNvb3JkID0geydsYXRpdHVkZSc6ICczNy4yNE4nLCAnbG9uZ2l0dWRlJzogJy0xMTUuODFXJ30KICAgPj4+ICdDb29yZGluYXRlczoge2xhdGl0dWRlfSwge2xvbmdpdHVkZX0nLmZvcm1hdCgqKmNvb3JkKQogICAnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVcnCgpBY2Nlc3NpbmcgYXJndW1lbnRzJyBhdHRyaWJ1dGVzOgoKICAgPj4+IGMgPSAzLTVqCiAgID4+PiAoJ1RoZSBjb21wbGV4IG51bWJlciB7MH0gaXMgZm9ybWVkIGZyb20gdGhlIHJlYWwgcGFydCB7MC5yZWFsfSAnCiAgIC4uLiAgJ2FuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgezAuaW1hZ30uJykuZm9ybWF0KGMpCiAgICdUaGUgY29tcGxleCBudW1iZXIgKDMtNWopIGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgMy4wIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgLTUuMC4nCiAgID4+PiBjbGFzcyBQb2ludChvYmplY3QpOgogICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KToKICAgLi4uICAgICAgICAgc2VsZi54LCBzZWxmLnkgPSB4LCB5CiAgIC4uLiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgIC4uLiAgICAgICAgIHJldHVybiAnUG9pbnQoe3NlbGYueH0sIHtzZWxmLnl9KScuZm9ybWF0KHNlbGY9c2VsZikKICAgLi4uCiAgID4+PiBzdHIoUG9pbnQoNCwgMikpCiAgICdQb2ludCg0LCAyKScKCkFjY2Vzc2luZyBhcmd1bWVudHMnIGl0ZW1zOgoKICAgPj4+IGNvb3JkID0gKDMsIDUpCiAgID4+PiAnWDogezBbMF19OyAgWTogezBbMV19Jy5mb3JtYXQoY29vcmQpCiAgICdYOiAzOyAgWTogNScKClJlcGxhY2luZyBgYCVzYGAgYW5kIGBgJXJgYDoKCiAgID4+PiAicmVwcigpIHNob3dzIHF1b3RlczogeyFyfTsgc3RyKCkgZG9lc24ndDogeyFzfSIuZm9ybWF0KCd0ZXN0MScsICd0ZXN0MicpCiAgICJyZXByKCkgc2hvd3MgcXVvdGVzOiAndGVzdDEnOyBzdHIoKSBkb2Vzbid0OiB0ZXN0MiIKCkFsaWduaW5nIHRoZSB0ZXh0IGFuZCBzcGVjaWZ5aW5nIGEgd2lkdGg6CgogICA+Pj4gJ3s6PDMwfScuZm9ybWF0KCdsZWZ0IGFsaWduZWQnKQogICAnbGVmdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgJwogICA+Pj4gJ3s6PjMwfScuZm9ybWF0KCdyaWdodCBhbGlnbmVkJykKICAgJyAgICAgICAgICAgICAgICAgcmlnaHQgYWxpZ25lZCcKICAgPj4+ICd7Ol4zMH0nLmZvcm1hdCgnY2VudGVyZWQnKQogICAnICAgICAgICAgICBjZW50ZXJlZCAgICAgICAgICAgJwogICA+Pj4gJ3s6Kl4zMH0nLmZvcm1hdCgnY2VudGVyZWQnKSAgIyB1c2UgJyonIGFzIGEgZmlsbCBjaGFyCiAgICcqKioqKioqKioqKmNlbnRlcmVkKioqKioqKioqKionCgpSZXBsYWNpbmcgYGAlK2ZgYCwgYGAlLWZgYCwgYW5kIGBgJSBmYGAgYW5kIHNwZWNpZnlpbmcgYSBzaWduOgoKICAgPj4+ICd7OitmfTsgezorZn0nLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBpdCBhbHdheXMKICAgJyszLjE0MDAwMDsgLTMuMTQwMDAwJwogICA+Pj4gJ3s6IGZ9OyB7OiBmfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGEgc3BhY2UgZm9yIHBvc2l0aXZlIG51bWJlcnMKICAgJyAzLjE0MDAwMDsgLTMuMTQwMDAwJwogICA+Pj4gJ3s6LWZ9OyB7Oi1mfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IG9ubHkgdGhlIG1pbnVzIC0tIHNhbWUgYXMgJ3s6Zn07IHs6Zn0nCiAgICczLjE0MDAwMDsgLTMuMTQwMDAwJwoKUmVwbGFjaW5nIGBgJXhgYCBhbmQgYGAlb2BgIGFuZCBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBkaWZmZXJlbnQKYmFzZXM6CgogICA+Pj4gIyBmb3JtYXQgYWxzbyBzdXBwb3J0cyBiaW5hcnkgbnVtYmVycwogICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOnh9OyAgb2N0OiB7MDpvfTsgIGJpbjogezA6Yn0iLmZvcm1hdCg0MikKICAgJ2ludDogNDI7ICBoZXg6IDJhOyAgb2N0OiA1MjsgIGJpbjogMTAxMDEwJwogICA+Pj4gIyB3aXRoIDB4LCAwbywgb3IgMGIgYXMgcHJlZml4OgogICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOiN4fTsgIG9jdDogezA6I299OyAgYmluOiB7MDojYn0iLmZvcm1hdCg0MikKICAgJ2ludDogNDI7ICBoZXg6IDB4MmE7ICBvY3Q6IDBvNTI7ICBiaW46IDBiMTAxMDEwJwoKVXNpbmcgdGhlIGNvbW1hIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvcjoKCiAgID4+PiAnezosfScuZm9ybWF0KDEyMzQ1Njc4OTApCiAgICcxLDIzNCw1NjcsODkwJwoKRXhwcmVzc2luZyBhIHBlcmNlbnRhZ2U6CgogICA+Pj4gcG9pbnRzID0gMTkuNQogICA+Pj4gdG90YWwgPSAyMgogICA+Pj4gJ0NvcnJlY3QgYW5zd2VyczogezouMiV9Jy5mb3JtYXQocG9pbnRzL3RvdGFsKQogICAnQ29ycmVjdCBhbnN3ZXJzOiA4OC42NCUnCgpVc2luZyB0eXBlLXNwZWNpZmljIGZvcm1hdHRpbmc6CgogICA+Pj4gaW1wb3J0IGRhdGV0aW1lCiAgID4+PiBkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgNywgNCwgMTIsIDE1LCA1OCkKICAgPj4+ICd7OiVZLSVtLSVkICVIOiVNOiVTfScuZm9ybWF0KGQpCiAgICcyMDEwLTA3LTA0IDEyOjE1OjU4JwoKTmVzdGluZyBhcmd1bWVudHMgYW5kIG1vcmUgY29tcGxleCBleGFtcGxlczoKCiAgID4+PiBmb3IgYWxpZ24sIHRleHQgaW4gemlwKCc8Xj4nLCBbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J10pOgogICAuLi4gICAgICd7MDp7ZmlsbH17YWxpZ259MTZ9Jy5mb3JtYXQodGV4dCwgZmlsbD1hbGlnbiwgYWxpZ249YWxpZ24pCiAgIC4uLgogICAnbGVmdDw8PDw8PDw8PDw8PCcKICAgJ15eXl5eY2VudGVyXl5eXl4nCiAgICc+Pj4+Pj4+Pj4+PnJpZ2h0JwogICA+Pj4KICAgPj4+IG9jdGV0cyA9IFsxOTIsIDE2OCwgMCwgMV0KICAgPj4+ICd7OjAyWH17OjAyWH17OjAyWH17OjAyWH0nLmZvcm1hdCgqb2N0ZXRzKQogICAnQzBBODAwMDEnCiAgID4+PiBpbnQoXywgMTYpCiAgIDMyMzIyMzU1MjEKICAgPj4+CiAgID4+PiB3aWR0aCA9IDUKICAgPj4+IGZvciBudW0gaW4gcmFuZ2UoNSwxMik6CiAgIC4uLiAgICAgZm9yIGJhc2UgaW4gJ2RYb2InOgogICAuLi4gICAgICAgICBwcmludCAnezA6e3dpZHRofXtiYXNlfX0nLmZvcm1hdChudW0sIGJhc2U9YmFzZSwgd2lkdGg9d2lkdGgpLAogICAuLi4gICAgIHByaW50CiAgIC4uLgogICAgICAgNSAgICAgNSAgICAgNSAgIDEwMQogICAgICAgNiAgICAgNiAgICAgNiAgIDExMAogICAgICAgNyAgICAgNyAgICAgNyAgIDExMQogICAgICAgOCAgICAgOCAgICAxMCAgMTAwMAogICAgICAgOSAgICAgOSAgICAxMSAgMTAwMQogICAgICAxMCAgICAgQSAgICAxMiAgMTAxMAogICAgICAxMSAgICAgQiAgICAxMyAgMTAxMQp0DQAAAGZvcm1hdHN0cmluZ3NzkREAAApGdW5jdGlvbiBkZWZpbml0aW9ucwoqKioqKioqKioqKioqKioqKioqKgoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWUKc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kik6CgogICBkZWNvcmF0ZWQgICAgICA6Oj0gZGVjb3JhdG9ycyAoY2xhc3NkZWYgfCBmdW5jZGVmKQogICBkZWNvcmF0b3JzICAgICA6Oj0gZGVjb3JhdG9yKwogICBkZWNvcmF0b3IgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORQogICBmdW5jZGVmICAgICAgICA6Oj0gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiICI6IiBzdWl0ZQogICBkb3R0ZWRfbmFtZSAgICA6Oj0gaWRlbnRpZmllciAoIi4iIGlkZW50aWZpZXIpKgogICBwYXJhbWV0ZXJfbGlzdCA6Oj0gKGRlZnBhcmFtZXRlciAiLCIpKgogICAgICAgICAgICAgICAgICAgICAgKCAgIioiIGlkZW50aWZpZXIgWyIsIiAiKioiIGlkZW50aWZpZXJdCiAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgaWRlbnRpZmllcgogICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKQogICBkZWZwYXJhbWV0ZXIgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl0KICAgc3VibGlzdCAgICAgICAgOjo9IHBhcmFtZXRlciAoIiwiIHBhcmFtZXRlcikqIFsiLCJdCiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIHwgIigiIHN1Ymxpc3QgIikiCiAgIGZ1bmNuYW1lICAgICAgIDo6PSBpZGVudGlmaWVyCgpBIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzCnRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uIG9iamVjdAooYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpcwpmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZQphcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KClRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0cwpleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdCgpBIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcioKZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzCmRlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhlCnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0CmFzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIG5hbWUKaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbgpuZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZToKCiAgIEBmMShhcmcpCiAgIEBmMgogICBkZWYgZnVuYygpOiBwYXNzCgppcyBlcXVpdmFsZW50IHRvOgoKICAgZGVmIGZ1bmMoKTogcGFzcwogICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSkKCldoZW4gb25lIG9yIG1vcmUgdG9wLWxldmVsICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqCmBgPWBgICpleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIKdmFsdWVzLiIgIEZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcKKmFyZ3VtZW50KiBtYXkgYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyJ3MKZGVmYXVsdCB2YWx1ZSBpcyBzdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbApmb2xsb3dpbmcgcGFyYW1ldGVycyBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXMgaXMgYQpzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLgoKKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uCmlzIGV4ZWN1dGVkLioqICBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIG9uY2UsIHdoZW4KdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICJwcmUtY29tcHV0ZWQiIHZhbHVlIGlzCnVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB3aGVuIGEKZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCBhcyBhIGxpc3Qgb3IgYSBkaWN0aW9uYXJ5OgppZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieSBhcHBlbmRpbmcgYW4gaXRlbSB0byBhCmxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgbW9kaWZpZWQuIFRoaXMgaXMgZ2VuZXJhbGx5IG5vdAp3aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzICBpcyB0byB1c2UgYGBOb25lYGAgYXMgdGhlCmRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgZS5nLjoKCiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKToKICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZToKICAgICAgICAgICBwZW5ndWluID0gW10KICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIikKICAgICAgIHJldHVybiBwZW5ndWluCgpGdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb24KKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVycwptZW50aW9uZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbiBhcmd1bWVudHMsIGZyb20Ka2V5d29yZCBhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybQoiYGAqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZwphbnkgZXhjZXNzIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZgp0aGUgZm9ybSAiYGAqKmlkZW50aWZpZXJgYCIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXcKZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ldwplbXB0eSBkaWN0aW9uYXJ5LgoKSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZAp0byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGEKZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uICpMYW1iZGFzKi4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhCmV4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjsKYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgImBgZGVmYGAiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBvcgphc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYQpleHByZXNzaW9uLiAgVGhlICJgYGRlZmBgIiBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXQKYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cy4KCioqUHJvZ3JhbW1lcidzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSAiYGBkZWZgYCIKZm9ybSBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbCBmdW5jdGlvbgp0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGUKbmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb24KY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyogZm9yIGRldGFpbHMuCnQIAAAAZnVuY3Rpb25zxAUAAApUaGUgYGBnbG9iYWxgYCBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqCgogICBnbG9iYWxfc3RtdCA6Oj0gImdsb2JhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKgoKVGhlIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGlzIGEgZGVjbGFyYXRpb24gd2hpY2ggaG9sZHMgZm9yIHRoZSBlbnRpcmUKY3VycmVudCBjb2RlIGJsb2NrLiAgSXQgbWVhbnMgdGhhdCB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIGFyZSB0byBiZQppbnRlcnByZXRlZCBhcyBnbG9iYWxzLiAgSXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byBhc3NpZ24gdG8gYSBnbG9iYWwKdmFyaWFibGUgd2l0aG91dCBgYGdsb2JhbGBgLCBhbHRob3VnaCBmcmVlIHZhcmlhYmxlcyBtYXkgcmVmZXIgdG8KZ2xvYmFscyB3aXRob3V0IGJlaW5nIGRlY2xhcmVkIGdsb2JhbC4KCk5hbWVzIGxpc3RlZCBpbiBhIGBgZ2xvYmFsYGAgc3RhdGVtZW50IG11c3Qgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUKY29kZSBibG9jayB0ZXh0dWFsbHkgcHJlY2VkaW5nIHRoYXQgYGBnbG9iYWxgYCBzdGF0ZW1lbnQuCgpOYW1lcyBsaXN0ZWQgaW4gYSBgYGdsb2JhbGBgIHN0YXRlbWVudCBtdXN0IG5vdCBiZSBkZWZpbmVkIGFzIGZvcm1hbApwYXJhbWV0ZXJzIG9yIGluIGEgYGBmb3JgYCBsb29wIGNvbnRyb2wgdGFyZ2V0LCBgYGNsYXNzYGAgZGVmaW5pdGlvbiwKZnVuY3Rpb24gZGVmaW5pdGlvbiwgb3IgYGBpbXBvcnRgYCBzdGF0ZW1lbnQuCgoqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgbm90CmVuZm9yY2UgdGhlIGxhdHRlciB0d28gcmVzdHJpY3Rpb25zLCBidXQgcHJvZ3JhbXMgc2hvdWxkIG5vdCBhYnVzZQp0aGlzIGZyZWVkb20sIGFzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGVuZm9yY2UgdGhlbSBvciBzaWxlbnRseQpjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0uCgoqKlByb2dyYW1tZXIncyBub3RlOioqIHRoZSBgYGdsb2JhbGBgIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBwYXJzZXIuCkl0IGFwcGxpZXMgb25seSB0byBjb2RlIHBhcnNlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBgYGdsb2JhbGBgCnN0YXRlbWVudC4gSW4gcGFydGljdWxhciwgYSBgYGdsb2JhbGBgIHN0YXRlbWVudCBjb250YWluZWQgaW4gYW4KYGBleGVjYGAgc3RhdGVtZW50IGRvZXMgbm90IGFmZmVjdCB0aGUgY29kZSBibG9jayAqY29udGFpbmluZyogdGhlCmBgZXhlY2BgIHN0YXRlbWVudCwgYW5kIGNvZGUgY29udGFpbmVkIGluIGFuIGBgZXhlY2BgIHN0YXRlbWVudCBpcwp1bmFmZmVjdGVkIGJ5IGBgZ2xvYmFsYGAgc3RhdGVtZW50cyBpbiB0aGUgY29kZSBjb250YWluaW5nIHRoZQpgYGV4ZWNgYCBzdGF0ZW1lbnQuICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBgYGV2YWwoKWBgLApgYGV4ZWNmaWxlKClgYCBhbmQgYGBjb21waWxlKClgYCBmdW5jdGlvbnMuCnQGAAAAZ2xvYmFsc7wFAAAKUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVycwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpDZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbAptZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mIGxlYWRpbmcgYW5kCnRyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczoKCmBgXypgYAogICBOb3QgaW1wb3J0ZWQgYnkgYGBmcm9tIG1vZHVsZSBpbXBvcnQgKmBgLiAgVGhlIHNwZWNpYWwgaWRlbnRpZmllcgogICBgYF9gYCBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mCiAgIHRoZSBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgYGBfX2J1aWx0aW5fX2BgIG1vZHVsZS4KICAgV2hlbiBub3QgaW4gaW50ZXJhY3RpdmUgbW9kZSwgYGBfYGAgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXMKICAgbm90IGRlZmluZWQuIFNlZSBzZWN0aW9uICpUaGUgaW1wb3J0IHN0YXRlbWVudCouCgogICBOb3RlOiBUaGUgbmFtZSBgYF9gYCBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQogICAgIGBgZ2V0dGV4dGBgIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uCgpgYF9fKl9fYGAKICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlcgogICBhbmQgaXRzIGltcGxlbWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiAgQ3VycmVudAogICBzeXN0ZW0gbmFtZXMgYXJlIGRpc2N1c3NlZCBpbiB0aGUgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKiBzZWN0aW9uCiAgIGFuZCBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mCiAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiBgYF9fKl9fYGAgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXMKICAgbm90IGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlCiAgIHdpdGhvdXQgd2FybmluZy4KCmBgX18qYGAKICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlCiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm0KICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiAicHJpdmF0ZSIgYXR0cmlidXRlcyBvZiBiYXNlIGFuZAogICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uICpJZGVudGlmaWVycyAoTmFtZXMpKi4KcwoAAABpZC1jbGFzc2Vzc+EKAAAKSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzCioqKioqKioqKioqKioqKioqKioqKioqKgoKSWRlbnRpZmllcnMgKGFsc28gcmVmZXJyZWQgdG8gYXMgKm5hbWVzKikgYXJlIGRlc2NyaWJlZCBieSB0aGUKZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6CgogICBpZGVudGlmaWVyIDo6PSAobGV0dGVyfCJfIikgKGxldHRlciB8IGRpZ2l0IHwgIl8iKSoKICAgbGV0dGVyICAgICA6Oj0gbG93ZXJjYXNlIHwgdXBwZXJjYXNlCiAgIGxvd2VyY2FzZSAgOjo9ICJhIi4uLiJ6IgogICB1cHBlcmNhc2UgIDo6PSAiQSIuLi4iWiIKICAgZGlnaXQgICAgICA6Oj0gIjAiLi4uIjkiCgpJZGVudGlmaWVycyBhcmUgdW5saW1pdGVkIGluIGxlbmd0aC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuCgoKS2V5d29yZHMKPT09PT09PT0KClRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgYXJlIHVzZWQgYXMgcmVzZXJ2ZWQgd29yZHMsIG9yICprZXl3b3Jkcyogb2YKdGhlIGxhbmd1YWdlLCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgb3JkaW5hcnkgaWRlbnRpZmllcnMuICBUaGV5IG11c3QKYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZToKCiAgIGFuZCAgICAgICBkZWwgICAgICAgZnJvbSAgICAgIG5vdCAgICAgICB3aGlsZQogICBhcyAgICAgICAgZWxpZiAgICAgIGdsb2JhbCAgICBvciAgICAgICAgd2l0aAogICBhc3NlcnQgICAgZWxzZSAgICAgIGlmICAgICAgICBwYXNzICAgICAgeWllbGQKICAgYnJlYWsgICAgIGV4Y2VwdCAgICBpbXBvcnQgICAgcHJpbnQKICAgY2xhc3MgICAgIGV4ZWMgICAgICBpbiAgICAgICAgcmFpc2UKICAgY29udGludWUgIGZpbmFsbHkgICBpcyAgICAgICAgcmV0dXJuCiAgIGRlZiAgICAgICBmb3IgICAgICAgbGFtYmRhICAgIHRyeQoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogYGBOb25lYGAgYmVjYW1lIGEgY29uc3RhbnQgYW5kIGlzIG5vdwpyZWNvZ25pemVkIGJ5IHRoZSBjb21waWxlciBhcyBhIG5hbWUgZm9yIHRoZSBidWlsdC1pbiBvYmplY3QgYGBOb25lYGAuCkFsdGhvdWdoIGl0IGlzIG5vdCBhIGtleXdvcmQsIHlvdSBjYW5ub3QgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCB0bwppdC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IFVzaW5nIGBgYXNgYCBhbmQgYGB3aXRoYGAgYXMgaWRlbnRpZmllcnMKdHJpZ2dlcnMgYSB3YXJuaW5nLiAgVG8gdXNlIHRoZW0gYXMga2V5d29yZHMsIGVuYWJsZSB0aGUKYGB3aXRoX3N0YXRlbWVudGBgIGZ1dHVyZSBmZWF0dXJlIC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IGBgYXNgYCBhbmQgYGB3aXRoYGAgYXJlIGZ1bGwga2V5d29yZHMuCgoKUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVycwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbAptZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mIGxlYWRpbmcgYW5kCnRyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczoKCmBgXypgYAogICBOb3QgaW1wb3J0ZWQgYnkgYGBmcm9tIG1vZHVsZSBpbXBvcnQgKmBgLiAgVGhlIHNwZWNpYWwgaWRlbnRpZmllcgogICBgYF9gYCBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mCiAgIHRoZSBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgYGBfX2J1aWx0aW5fX2BgIG1vZHVsZS4KICAgV2hlbiBub3QgaW4gaW50ZXJhY3RpdmUgbW9kZSwgYGBfYGAgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXMKICAgbm90IGRlZmluZWQuIFNlZSBzZWN0aW9uICpUaGUgaW1wb3J0IHN0YXRlbWVudCouCgogICBOb3RlOiBUaGUgbmFtZSBgYF9gYCBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQogICAgIGBgZ2V0dGV4dGBgIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uCgpgYF9fKl9fYGAKICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlcgogICBhbmQgaXRzIGltcGxlbWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiAgQ3VycmVudAogICBzeXN0ZW0gbmFtZXMgYXJlIGRpc2N1c3NlZCBpbiB0aGUgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKiBzZWN0aW9uCiAgIGFuZCBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mCiAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiBgYF9fKl9fYGAgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXMKICAgbm90IGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlCiAgIHdpdGhvdXQgd2FybmluZy4KCmBgX18qYGAKICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlCiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm0KICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiAicHJpdmF0ZSIgYXR0cmlidXRlcyBvZiBiYXNlIGFuZAogICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uICpJZGVudGlmaWVycyAoTmFtZXMpKi4KdAsAAABpZGVudGlmaWVyc3QCAAAAaWZzJwIAAApJbWFnaW5hcnkgbGl0ZXJhbHMKKioqKioqKioqKioqKioqKioqCgpJbWFnaW5hcnkgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6CgogICBpbWFnbnVtYmVyIDo6PSAoZmxvYXRudW1iZXIgfCBpbnRwYXJ0KSAoImoiIHwgIkoiKQoKQW4gaW1hZ2luYXJ5IGxpdGVyYWwgeWllbGRzIGEgY29tcGxleCBudW1iZXIgd2l0aCBhIHJlYWwgcGFydCBvZiAwLjAuCkNvbXBsZXggbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBwYWlyIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKYW5kIGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIG9uIHRoZWlyIHJhbmdlLiAgVG8gY3JlYXRlIGEgY29tcGxleApudW1iZXIgd2l0aCBhIG5vbnplcm8gcmVhbCBwYXJ0LCBhZGQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gaXQsCmUuZy4sIGBgKDMrNGopYGAuICBTb21lIGV4YW1wbGVzIG9mIGltYWdpbmFyeSBsaXRlcmFsczoKCiAgIDMuMTRqICAgMTAuaiAgICAxMGogICAgIC4wMDFqICAgMWUxMDBqICAzLjE0ZS0xMGoKdAkAAABpbWFnaW5hcnlzey8AAApUaGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqCgogICBpbXBvcnRfc3RtdCAgICAgOjo9ICJpbXBvcnQiIG1vZHVsZSBbImFzIiBuYW1lXSAoICIsIiBtb2R1bGUgWyJhcyIgbmFtZV0gKSoKICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdCiAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqCiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIigiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0KICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSogWyIsIl0gIikiCiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiBtb2R1bGUgImltcG9ydCIgIioiCiAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllcgogICByZWxhdGl2ZV9tb2R1bGUgOjo9ICIuIiogbW9kdWxlIHwgIi4iKwogICBuYW1lICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIKCkltcG9ydCBzdGF0ZW1lbnRzIGFyZSBleGVjdXRlZCBpbiB0d28gc3RlcHM6ICgxKSBmaW5kIGEgbW9kdWxlLCBhbmQKaW5pdGlhbGl6ZSBpdCBpZiBuZWNlc3Nhcnk7ICgyKSBkZWZpbmUgYSBuYW1lIG9yIG5hbWVzIGluIHRoZSBsb2NhbApuYW1lc3BhY2UgKG9mIHRoZSBzY29wZSB3aGVyZSB0aGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgb2NjdXJzKS4gVGhlCnN0YXRlbWVudCBjb21lcyBpbiB0d28gZm9ybXMgZGlmZmVyaW5nIG9uIHdoZXRoZXIgaXQgdXNlcyB0aGUgYGBmcm9tYGAKa2V5d29yZC4gVGhlIGZpcnN0IGZvcm0gKHdpdGhvdXQgYGBmcm9tYGApIHJlcGVhdHMgdGhlc2Ugc3RlcHMgZm9yCmVhY2ggaWRlbnRpZmllciBpbiB0aGUgbGlzdC4gVGhlIGZvcm0gd2l0aCBgYGZyb21gYCBwZXJmb3JtcyBzdGVwICgxKQpvbmNlLCBhbmQgdGhlbiBwZXJmb3JtcyBzdGVwICgyKSByZXBlYXRlZGx5LgoKVG8gdW5kZXJzdGFuZCBob3cgc3RlcCAoMSkgb2NjdXJzLCBvbmUgbXVzdCBmaXJzdCB1bmRlcnN0YW5kIGhvdwpQeXRob24gaGFuZGxlcyBoaWVyYXJjaGljYWwgbmFtaW5nIG9mIG1vZHVsZXMuIFRvIGhlbHAgb3JnYW5pemUKbW9kdWxlcyBhbmQgcHJvdmlkZSBhIGhpZXJhcmNoeSBpbiBuYW1pbmcsIFB5dGhvbiBoYXMgYSBjb25jZXB0IG9mCnBhY2thZ2VzLiBBIHBhY2thZ2UgY2FuIGNvbnRhaW4gb3RoZXIgcGFja2FnZXMgYW5kIG1vZHVsZXMgd2hpbGUKbW9kdWxlcyBjYW5ub3QgY29udGFpbiBvdGhlciBtb2R1bGVzIG9yIHBhY2thZ2VzLiBGcm9tIGEgZmlsZSBzeXN0ZW0KcGVyc3BlY3RpdmUsIHBhY2thZ2VzIGFyZSBkaXJlY3RvcmllcyBhbmQgbW9kdWxlcyBhcmUgZmlsZXMuIFRoZQpvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBwYWNrYWdlcyBpcyBzdGlsbCBhdmFpbGFibGUgdG8gcmVhZCwKYWx0aG91Z2ggbWlub3IgZGV0YWlscyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHdyaXRpbmcgb2YgdGhhdApkb2N1bWVudC4KCk9uY2UgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBpcyBrbm93biAodW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoZQp0ZXJtICJtb2R1bGUiIHdpbGwgcmVmZXIgdG8gYm90aCBwYWNrYWdlcyBhbmQgbW9kdWxlcyksIHNlYXJjaGluZyBmb3IKdGhlIG1vZHVsZSBvciBwYWNrYWdlIGNhbiBiZWdpbi4gVGhlIGZpcnN0IHBsYWNlIGNoZWNrZWQgaXMKYGBzeXMubW9kdWxlc2BgLCB0aGUgY2FjaGUgb2YgYWxsIG1vZHVsZXMgdGhhdCBoYXZlIGJlZW4gaW1wb3J0ZWQKcHJldmlvdXNseS4gSWYgdGhlIG1vZHVsZSBpcyBmb3VuZCB0aGVyZSB0aGVuIGl0IGlzIHVzZWQgaW4gc3RlcCAoMikKb2YgaW1wb3J0LgoKSWYgdGhlIG1vZHVsZSBpcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCB0aGVuIGBgc3lzLm1ldGFfcGF0aGBgIGlzCnNlYXJjaGVkICh0aGUgc3BlY2lmaWNhdGlvbiBmb3IgYGBzeXMubWV0YV9wYXRoYGAgY2FuIGJlIGZvdW5kIGluCioqUEVQIDMwMioqKS4gVGhlIG9iamVjdCBpcyBhIGxpc3Qgb2YgKmZpbmRlciogb2JqZWN0cyB3aGljaCBhcmUKcXVlcmllZCBpbiBvcmRlciBhcyB0byB3aGV0aGVyIHRoZXkga25vdyBob3cgdG8gbG9hZCB0aGUgbW9kdWxlIGJ5CmNhbGxpbmcgdGhlaXIgYGBmaW5kX21vZHVsZSgpYGAgbWV0aG9kIHdpdGggdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4gSWYKdGhlIG1vZHVsZSBoYXBwZW5zIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBwYWNrYWdlIChhcyBkZW5vdGVkIGJ5IHRoZQpleGlzdGVuY2Ugb2YgYSBkb3QgaW4gdGhlIG5hbWUpLCB0aGVuIGEgc2Vjb25kIGFyZ3VtZW50IHRvCmBgZmluZF9tb2R1bGUoKWBgIGlzIGdpdmVuIGFzIHRoZSB2YWx1ZSBvZiB0aGUgYGBfX3BhdGhfX2BgIGF0dHJpYnV0ZQpmcm9tIHRoZSBwYXJlbnQgcGFja2FnZSAoZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBkb3QgaW4gdGhlIG5hbWUgb2YKdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCkuIElmIGEgZmluZGVyIGNhbiBmaW5kIHRoZSBtb2R1bGUgaXQgcmV0dXJucwphICpsb2FkZXIqIChkaXNjdXNzZWQgbGF0ZXIpIG9yIHJldHVybnMgYGBOb25lYGAuCgpJZiBub25lIG9mIHRoZSBmaW5kZXJzIG9uIGBgc3lzLm1ldGFfcGF0aGBgIGFyZSBhYmxlIHRvIGZpbmQgdGhlCm1vZHVsZSB0aGVuIHNvbWUgaW1wbGljaXRseSBkZWZpbmVkIGZpbmRlcnMgYXJlIHF1ZXJpZWQuCkltcGxlbWVudGF0aW9ucyBvZiBQeXRob24gdmFyeSBpbiB3aGF0IGltcGxpY2l0IG1ldGEgcGF0aCBmaW5kZXJzIGFyZQpkZWZpbmVkLiBUaGUgb25lIHRoZXkgYWxsIGRvIGRlZmluZSwgdGhvdWdoLCBpcyBvbmUgdGhhdCBoYW5kbGVzCmBgc3lzLnBhdGhfaG9va3NgYCwgYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgLCBhbmQgYGBzeXMucGF0aGBgLgoKVGhlIGltcGxpY2l0IGZpbmRlciBzZWFyY2hlcyBmb3IgdGhlIHJlcXVlc3RlZCBtb2R1bGUgaW4gdGhlICJwYXRocyIKc3BlY2lmaWVkIGluIG9uZSBvZiB0d28gcGxhY2VzICgicGF0aHMiIGRvIG5vdCBoYXZlIHRvIGJlIGZpbGUgc3lzdGVtCnBhdGhzKS4gSWYgdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCBpcyBzdXBwb3NlZCB0byBiZSBjb250YWluZWQKd2l0aGluIGEgcGFja2FnZSB0aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgcGFzc2VkIHRvIGBgZmluZF9tb2R1bGUoKWBgLApgYF9fcGF0aF9fYGAgb24gdGhlIHBhcmVudCBwYWNrYWdlLCBpcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgcGF0aHMuIElmCnRoZSBtb2R1bGUgaXMgbm90IGNvbnRhaW5lZCBpbiBhIHBhY2thZ2UgdGhlbiBgYHN5cy5wYXRoYGAgaXMgdXNlZCBhcwp0aGUgc291cmNlIG9mIHBhdGhzLgoKT25jZSB0aGUgc291cmNlIG9mIHBhdGhzIGlzIGNob3NlbiBpdCBpcyBpdGVyYXRlZCBvdmVyIHRvIGZpbmQgYQpmaW5kZXIgdGhhdCBjYW4gaGFuZGxlIHRoYXQgcGF0aC4gVGhlIGRpY3QgYXQKYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgIGNhY2hlcyBmaW5kZXJzIGZvciBwYXRocyBhbmQgaXMgY2hlY2tlZApmb3IgYSBmaW5kZXIuIElmIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgYSBmaW5kZXIgY2FjaGVkIHRoZW4KYGBzeXMucGF0aF9ob29rc2BgIGlzIHNlYXJjaGVkIGJ5IGNhbGxpbmcgZWFjaCBvYmplY3QgaW4gdGhlIGxpc3Qgd2l0aAphIHNpbmdsZSBhcmd1bWVudCBvZiB0aGUgcGF0aCwgcmV0dXJuaW5nIGEgZmluZGVyIG9yIHJhaXNlcwpgYEltcG9ydEVycm9yYGAuIElmIGEgZmluZGVyIGlzIHJldHVybmVkIHRoZW4gaXQgaXMgY2FjaGVkIGluCmBgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgYCBhbmQgdGhlbiB1c2VkIGZvciB0aGF0IHBhdGggZW50cnkuIElmIG5vCmZpbmRlciBjYW4gYmUgZm91bmQgYnV0IHRoZSBwYXRoIGV4aXN0cyB0aGVuIGEgdmFsdWUgb2YgYGBOb25lYGAgaXMKc3RvcmVkIGluIGBgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgYCB0byBzaWduaWZ5IHRoYXQgYW4gaW1wbGljaXQsCmZpbGUtYmFzZWQgZmluZGVyIHRoYXQgaGFuZGxlcyBtb2R1bGVzIHN0b3JlZCBhcyBpbmRpdmlkdWFsIGZpbGVzCnNob3VsZCBiZSB1c2VkIGZvciB0aGF0IHBhdGguIElmIHRoZSBwYXRoIGRvZXMgbm90IGV4aXN0IHRoZW4gYSBmaW5kZXIKd2hpY2ggYWx3YXlzIHJldHVybnMgYGBOb25lYGAgaXMgcGxhY2VkIGluIHRoZSBjYWNoZSBmb3IgdGhlIHBhdGguCgpJZiBubyBmaW5kZXIgY2FuIGZpbmQgdGhlIG1vZHVsZSB0aGVuIGBgSW1wb3J0RXJyb3JgYCBpcyByYWlzZWQuCk90aGVyd2lzZSBzb21lIGZpbmRlciByZXR1cm5lZCBhIGxvYWRlciB3aG9zZSBgYGxvYWRfbW9kdWxlKClgYCBtZXRob2QKaXMgY2FsbGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsb2FkIChzZWUgKipQRVAgMzAyKiogZm9yIHRoZQpvcmlnaW5hbCBkZWZpbml0aW9uIG9mIGxvYWRlcnMpLiBBIGxvYWRlciBoYXMgc2V2ZXJhbCByZXNwb25zaWJpbGl0aWVzCnRvIHBlcmZvcm0gb24gYSBtb2R1bGUgaXQgbG9hZHMuIEZpcnN0LCBpZiB0aGUgbW9kdWxlIGFscmVhZHkgZXhpc3RzCmluIGBgc3lzLm1vZHVsZXNgYCAoYSBwb3NzaWJpbGl0eSBpZiB0aGUgbG9hZGVyIGlzIGNhbGxlZCBvdXRzaWRlIG9mCnRoZSBpbXBvcnQgbWFjaGluZXJ5KSB0aGVuIGl0IGlzIHRvIHVzZSB0aGF0IG1vZHVsZSBmb3IgaW5pdGlhbGl6YXRpb24KYW5kIG5vdCBhIG5ldyBtb2R1bGUuIEJ1dCBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IGV4aXN0IGluCmBgc3lzLm1vZHVsZXNgYCB0aGVuIGl0IGlzIHRvIGJlIGFkZGVkIHRvIHRoYXQgZGljdCBiZWZvcmUKaW5pdGlhbGl6YXRpb24gYmVnaW5zLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGxvYWRpbmcgb2YgdGhlIG1vZHVsZQphbmQgaXQgd2FzIGFkZGVkIHRvIGBgc3lzLm1vZHVsZXNgYCBpdCBpcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGRpY3QuCklmIGFuIGVycm9yIG9jY3VycyBidXQgdGhlIG1vZHVsZSB3YXMgYWxyZWFkeSBpbiBgYHN5cy5tb2R1bGVzYGAgaXQgaXMKbGVmdCBpbiB0aGUgZGljdC4KClRoZSBsb2FkZXIgbXVzdCBzZXQgc2V2ZXJhbCBhdHRyaWJ1dGVzIG9uIHRoZSBtb2R1bGUuIGBgX19uYW1lX19gYCBpcwp0byBiZSBzZXQgdG8gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4gYGBfX2ZpbGVfX2BgIGlzIHRvIGJlIHRoZSAicGF0aCIKdG8gdGhlIGZpbGUgdW5sZXNzIHRoZSBtb2R1bGUgaXMgYnVpbHQtaW4gKGFuZCB0aHVzIGxpc3RlZCBpbgpgYHN5cy5idWlsdGluX21vZHVsZV9uYW1lc2BgKSBpbiB3aGljaCBjYXNlIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHNldC4KSWYgd2hhdCBpcyBiZWluZyBpbXBvcnRlZCBpcyBhIHBhY2thZ2UgdGhlbiBgYF9fcGF0aF9fYGAgaXMgdG8gYmUgc2V0CnRvIGEgbGlzdCBvZiBwYXRocyB0byBiZSBzZWFyY2hlZCB3aGVuIGxvb2tpbmcgZm9yIG1vZHVsZXMgYW5kCnBhY2thZ2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHBhY2thZ2UgYmVpbmcgaW1wb3J0ZWQuIGBgX19wYWNrYWdlX19gYAppcyBvcHRpb25hbCBidXQgc2hvdWxkIGJlIHNldCB0byB0aGUgbmFtZSBvZiBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlCm1vZHVsZSBvciBwYWNrYWdlICh0aGUgZW1wdHkgc3RyaW5nIGlzIHVzZWQgZm9yIG1vZHVsZSBub3QgY29udGFpbmVkCmluIGEgcGFja2FnZSkuIGBgX19sb2FkZXJfX2BgIGlzIGFsc28gb3B0aW9uYWwgYnV0IHNob3VsZCBiZSBzZXQgdG8KdGhlIGxvYWRlciBvYmplY3QgdGhhdCBpcyBsb2FkaW5nIHRoZSBtb2R1bGUuCgpJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGxvYWRpbmcgdGhlbiB0aGUgbG9hZGVyIHJhaXNlcwpgYEltcG9ydEVycm9yYGAgaWYgc29tZSBvdGhlciBleGNlcHRpb24gaXMgbm90IGFscmVhZHkgYmVpbmcKcHJvcGFnYXRlZC4gT3RoZXJ3aXNlIHRoZSBsb2FkZXIgcmV0dXJucyB0aGUgbW9kdWxlIHRoYXQgd2FzIGxvYWRlZAphbmQgaW5pdGlhbGl6ZWQuCgpXaGVuIHN0ZXAgKDEpIGZpbmlzaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24sIHN0ZXAgKDIpIGNhbgpiZWdpbi4KClRoZSBmaXJzdCBmb3JtIG9mIGBgaW1wb3J0YGAgc3RhdGVtZW50IGJpbmRzIHRoZSBtb2R1bGUgbmFtZSBpbiB0aGUKbG9jYWwgbmFtZXNwYWNlIHRvIHRoZSBtb2R1bGUgb2JqZWN0LCBhbmQgdGhlbiBnb2VzIG9uIHRvIGltcG9ydCB0aGUKbmV4dCBpZGVudGlmaWVyLCBpZiBhbnkuICBJZiB0aGUgbW9kdWxlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYGBhc2BgLAp0aGUgbmFtZSBmb2xsb3dpbmcgYGBhc2BgIGlzIHVzZWQgYXMgdGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBtb2R1bGUuCgpUaGUgYGBmcm9tYGAgZm9ybSBkb2VzIG5vdCBiaW5kIHRoZSBtb2R1bGUgbmFtZTogaXQgZ29lcyB0aHJvdWdoIHRoZQpsaXN0IG9mIGlkZW50aWZpZXJzLCBsb29rcyBlYWNoIG9uZSBvZiB0aGVtIHVwIGluIHRoZSBtb2R1bGUgZm91bmQgaW4Kc3RlcCAoMSksIGFuZCBiaW5kcyB0aGUgbmFtZSBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIHRvIHRoZSBvYmplY3QgdGh1cwpmb3VuZC4gIEFzIHdpdGggdGhlIGZpcnN0IGZvcm0gb2YgYGBpbXBvcnRgYCwgYW4gYWx0ZXJuYXRlIGxvY2FsIG5hbWUKY2FuIGJlIHN1cHBsaWVkIGJ5IHNwZWNpZnlpbmcgImBgYXNgYCBsb2NhbG5hbWUiLiAgSWYgYSBuYW1lIGlzIG5vdApmb3VuZCwgYGBJbXBvcnRFcnJvcmBgIGlzIHJhaXNlZC4gIElmIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIGlzCnJlcGxhY2VkIGJ5IGEgc3RhciAoYGAnKidgYCksIGFsbCBwdWJsaWMgbmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlCmFyZSBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIG9mIHRoZSBgYGltcG9ydGBgIHN0YXRlbWVudC4uCgpUaGUgKnB1YmxpYyBuYW1lcyogZGVmaW5lZCBieSBhIG1vZHVsZSBhcmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGUKbW9kdWxlJ3MgbmFtZXNwYWNlIGZvciBhIHZhcmlhYmxlIG5hbWVkIGBgX19hbGxfX2BgOyBpZiBkZWZpbmVkLCBpdAptdXN0IGJlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB3aGljaCBhcmUgbmFtZXMgZGVmaW5lZCBvciBpbXBvcnRlZCBieQp0aGF0IG1vZHVsZS4gIFRoZSBuYW1lcyBnaXZlbiBpbiBgYF9fYWxsX19gYCBhcmUgYWxsIGNvbnNpZGVyZWQgcHVibGljCmFuZCBhcmUgcmVxdWlyZWQgdG8gZXhpc3QuICBJZiBgYF9fYWxsX19gYCBpcyBub3QgZGVmaW5lZCwgdGhlIHNldCBvZgpwdWJsaWMgbmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZSBtb2R1bGUncyBuYW1lc3BhY2Ugd2hpY2gKZG8gbm90IGJlZ2luIHdpdGggYW4gdW5kZXJzY29yZSBjaGFyYWN0ZXIgKGBgJ18nYGApLiBgYF9fYWxsX19gYApzaG91bGQgY29udGFpbiB0aGUgZW50aXJlIHB1YmxpYyBBUEkuIEl0IGlzIGludGVuZGVkIHRvIGF2b2lkCmFjY2lkZW50YWxseSBleHBvcnRpbmcgaXRlbXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIEFQSSAoc3VjaCBhcwpsaWJyYXJ5IG1vZHVsZXMgd2hpY2ggd2VyZSBpbXBvcnRlZCBhbmQgdXNlZCB3aXRoaW4gdGhlIG1vZHVsZSkuCgpUaGUgYGBmcm9tYGAgZm9ybSB3aXRoIGBgKmBgIG1heSBvbmx5IG9jY3VyIGluIGEgbW9kdWxlIHNjb3BlLiAgSWYgdGhlCndpbGQgY2FyZCBmb3JtIG9mIGltcG9ydCAtLS0gYGBpbXBvcnQgKmBgIC0tLSBpcyB1c2VkIGluIGEgZnVuY3Rpb24KYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLAp0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC4KCldoZW4gc3BlY2lmeWluZyB3aGF0IG1vZHVsZSB0byBpbXBvcnQgeW91IGRvIG5vdCBoYXZlIHRvIHNwZWNpZnkgdGhlCmFic29sdXRlIG5hbWUgb2YgdGhlIG1vZHVsZS4gV2hlbiBhIG1vZHVsZSBvciBwYWNrYWdlIGlzIGNvbnRhaW5lZAp3aXRoaW4gYW5vdGhlciBwYWNrYWdlIGl0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYSByZWxhdGl2ZSBpbXBvcnQgd2l0aGluCnRoZSBzYW1lIHRvcCBwYWNrYWdlIHdpdGhvdXQgaGF2aW5nIHRvIG1lbnRpb24gdGhlIHBhY2thZ2UgbmFtZS4gQnkKdXNpbmcgbGVhZGluZyBkb3RzIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG9yIHBhY2thZ2UgYWZ0ZXIgYGBmcm9tYGAKeW91IGNhbiBzcGVjaWZ5IGhvdyBoaWdoIHRvIHRyYXZlcnNlIHVwIHRoZSBjdXJyZW50IHBhY2thZ2UgaGllcmFyY2h5CndpdGhvdXQgc3BlY2lmeWluZyBleGFjdCBuYW1lcy4gT25lIGxlYWRpbmcgZG90IG1lYW5zIHRoZSBjdXJyZW50CnBhY2thZ2Ugd2hlcmUgdGhlIG1vZHVsZSBtYWtpbmcgdGhlIGltcG9ydCBleGlzdHMuIFR3byBkb3RzIG1lYW5zIHVwCm9uZSBwYWNrYWdlIGxldmVsLiBUaHJlZSBkb3RzIGlzIHVwIHR3byBsZXZlbHMsIGV0Yy4gU28gaWYgeW91IGV4ZWN1dGUKYGBmcm9tIC4gaW1wb3J0IG1vZGBgIGZyb20gYSBtb2R1bGUgaW4gdGhlIGBgcGtnYGAgcGFja2FnZSB0aGVuIHlvdQp3aWxsIGVuZCB1cCBpbXBvcnRpbmcgYGBwa2cubW9kYGAuIElmIHlvdSBleGVjdXRlIGBgZnJvbSAuLnN1YnBrZzIKaW1wb3J0IG1vZGBgIGZyb20gd2l0aGluIGBgcGtnLnN1YnBrZzFgYCB5b3Ugd2lsbCBpbXBvcnQKYGBwa2cuc3VicGtnMi5tb2RgYC4gVGhlIHNwZWNpZmljYXRpb24gZm9yIHJlbGF0aXZlIGltcG9ydHMgaXMKY29udGFpbmVkIHdpdGhpbiAqKlBFUCAzMjgqKi4KCmBgaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKWBgIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zIHRoYXQKZGV0ZXJtaW5lIHdoaWNoIG1vZHVsZXMgbmVlZCB0byBiZSBsb2FkZWQgZHluYW1pY2FsbHkuCgoKRnV0dXJlIHN0YXRlbWVudHMKPT09PT09PT09PT09PT09PT0KCkEgKmZ1dHVyZSBzdGF0ZW1lbnQqIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBjb21waWxlciB0aGF0IGEgcGFydGljdWxhcgptb2R1bGUgc2hvdWxkIGJlIGNvbXBpbGVkIHVzaW5nIHN5bnRheCBvciBzZW1hbnRpY3MgdGhhdCB3aWxsIGJlCmF2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBmdXR1cmUgcmVsZWFzZSBvZiBQeXRob24uICBUaGUgZnV0dXJlCnN0YXRlbWVudCBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBmdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uCnRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gIEl0IGFsbG93cyB1c2Ugb2YKdGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMgYmVmb3JlIHRoZSByZWxlYXNlIGluIHdoaWNoIHRoZQpmZWF0dXJlIGJlY29tZXMgc3RhbmRhcmQuCgogICBmdXR1cmVfc3RhdGVtZW50IDo6PSAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiIGZlYXR1cmUgWyJhcyIgbmFtZV0KICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBmZWF0dXJlIFsiYXMiIG5hbWVdKSoKICAgICAgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlIFsiYXMiIG5hbWVdCiAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqIFsiLCJdICIpIgogICBmZWF0dXJlICAgICAgICAgIDo6PSBpZGVudGlmaWVyCiAgIG5hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIKCkEgZnV0dXJlIHN0YXRlbWVudCBtdXN0IGFwcGVhciBuZWFyIHRoZSB0b3Agb2YgdGhlIG1vZHVsZS4gIFRoZSBvbmx5CmxpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZToKCiogdGhlIG1vZHVsZSBkb2NzdHJpbmcgKGlmIGFueSksCgoqIGNvbW1lbnRzLAoKKiBibGFuayBsaW5lcywgYW5kCgoqIG90aGVyIGZ1dHVyZSBzdGF0ZW1lbnRzLgoKVGhlIGZlYXR1cmVzIHJlY29nbml6ZWQgYnkgUHl0aG9uIDIuNiBhcmUgYGB1bmljb2RlX2xpdGVyYWxzYGAsCmBgcHJpbnRfZnVuY3Rpb25gYCwgYGBhYnNvbHV0ZV9pbXBvcnRgYCwgYGBkaXZpc2lvbmBgLCBgYGdlbmVyYXRvcnNgYCwKYGBuZXN0ZWRfc2NvcGVzYGAgYW5kIGBgd2l0aF9zdGF0ZW1lbnRgYC4gIGBgZ2VuZXJhdG9yc2BgLApgYHdpdGhfc3RhdGVtZW50YGAsIGBgbmVzdGVkX3Njb3Blc2BgIGFyZSByZWR1bmRhbnQgaW4gUHl0aG9uIHZlcnNpb24KMi42IGFuZCBhYm92ZSBiZWNhdXNlIHRoZXkgYXJlIGFsd2F5cyBlbmFibGVkLgoKQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGUKdGltZTogQ2hhbmdlcyB0byB0aGUgc2VtYW50aWNzIG9mIGNvcmUgY29uc3RydWN0cyBhcmUgb2Z0ZW4KaW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBkaWZmZXJlbnQgY29kZS4gIEl0IG1heSBldmVuIGJlIHRoZSBjYXNlCnRoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgbmV3CnJlc2VydmVkIHdvcmQpLCBpbiB3aGljaCBjYXNlIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBwYXJzZSB0aGUKbW9kdWxlIGRpZmZlcmVudGx5LiAgU3VjaCBkZWNpc2lvbnMgY2Fubm90IGJlIHB1c2hlZCBvZmYgdW50aWwKcnVudGltZS4KCkZvciBhbnkgZ2l2ZW4gcmVsZWFzZSwgdGhlIGNvbXBpbGVyIGtub3dzIHdoaWNoIGZlYXR1cmUgbmFtZXMgaGF2ZQpiZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgc3RhdGVtZW50CmNvbnRhaW5zIGEgZmVhdHVyZSBub3Qga25vd24gdG8gaXQuCgpUaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCBzdGF0ZW1lbnQ6CnRoZXJlIGlzIGEgc3RhbmRhcmQgbW9kdWxlIGBgX19mdXR1cmVfX2BgLCBkZXNjcmliZWQgbGF0ZXIsIGFuZCBpdAp3aWxsIGJlIGltcG9ydGVkIGluIHRoZSB1c3VhbCB3YXkgYXQgdGhlIHRpbWUgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXMKZXhlY3V0ZWQuCgpUaGUgaW50ZXJlc3RpbmcgcnVudGltZSBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBmZWF0dXJlCmVuYWJsZWQgYnkgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQuCgpOb3RlIHRoYXQgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBzdGF0ZW1lbnQ6CgogICBpbXBvcnQgX19mdXR1cmVfXyBbYXMgbmFtZV0KClRoYXQgaXMgbm90IGEgZnV0dXJlIHN0YXRlbWVudDsgaXQncyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50IHdpdGgKbm8gc3BlY2lhbCBzZW1hbnRpY3Mgb3Igc3ludGF4IHJlc3RyaWN0aW9ucy4KCkNvZGUgY29tcGlsZWQgYnkgYW4gYGBleGVjYGAgc3RhdGVtZW50IG9yIGNhbGxzIHRvIHRoZSBidWlsdC1pbgpmdW5jdGlvbnMgYGBjb21waWxlKClgYCBhbmQgYGBleGVjZmlsZSgpYGAgdGhhdCBvY2N1ciBpbiBhIG1vZHVsZQpgYE1gYCBjb250YWluaW5nIGEgZnV0dXJlIHN0YXRlbWVudCB3aWxsLCBieSBkZWZhdWx0LCB1c2UgdGhlIG5ldwpzeW50YXggb3Igc2VtYW50aWNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnV0dXJlIHN0YXRlbWVudC4gIFRoaXMgY2FuLApzdGFydGluZyB3aXRoIFB5dGhvbiAyLjIgYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgdG8KYGBjb21waWxlKClgYCAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuCgpBIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0IHdpbGwKdGFrZSBlZmZlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnByZXRlciBzZXNzaW9uLiAgSWYgYW4KaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZCB3aXRoIHRoZSAqLWkqIG9wdGlvbiwgaXMgcGFzc2VkIGEgc2NyaXB0IG5hbWUKdG8gZXhlY3V0ZSwgYW5kIHRoZSBzY3JpcHQgaW5jbHVkZXMgYSBmdXR1cmUgc3RhdGVtZW50LCBpdCB3aWxsIGJlIGluCmVmZmVjdCBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBzdGFydGVkIGFmdGVyIHRoZSBzY3JpcHQgaXMKZXhlY3V0ZWQuCgpTZWUgYWxzbzoKCiAgICoqUEVQIDIzNioqIC0gQmFjayB0byB0aGUgX19mdXR1cmVfXwogICAgICBUaGUgb3JpZ2luYWwgcHJvcG9zYWwgZm9yIHRoZSBfX2Z1dHVyZV9fIG1lY2hhbmlzbS4KdAYAAABpbXBvcnR0AgAAAGluc3kFAAAKSW50ZWdlciBhbmQgbG9uZyBpbnRlZ2VyIGxpdGVyYWxzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKSW50ZWdlciBhbmQgbG9uZyBpbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZwpsZXhpY2FsIGRlZmluaXRpb25zOgoKICAgbG9uZ2ludGVnZXIgICAgOjo9IGludGVnZXIgKCJsIiB8ICJMIikKICAgaW50ZWdlciAgICAgICAgOjo9IGRlY2ltYWxpbnRlZ2VyIHwgb2N0aW50ZWdlciB8IGhleGludGVnZXIgfCBiaW5pbnRlZ2VyCiAgIGRlY2ltYWxpbnRlZ2VyIDo6PSBub256ZXJvZGlnaXQgZGlnaXQqIHwgIjAiCiAgIG9jdGludGVnZXIgICAgIDo6PSAiMCIgKCJvIiB8ICJPIikgb2N0ZGlnaXQrIHwgIjAiIG9jdGRpZ2l0KwogICBoZXhpbnRlZ2VyICAgICA6Oj0gIjAiICgieCIgfCAiWCIpIGhleGRpZ2l0KwogICBiaW5pbnRlZ2VyICAgICA6Oj0gIjAiICgiYiIgfCAiQiIpIGJpbmRpZ2l0KwogICBub256ZXJvZGlnaXQgICA6Oj0gIjEiLi4uIjkiCiAgIG9jdGRpZ2l0ICAgICAgIDo6PSAiMCIuLi4iNyIKICAgYmluZGlnaXQgICAgICAgOjo9ICIwIiB8ICIxIgogICBoZXhkaWdpdCAgICAgICA6Oj0gZGlnaXQgfCAiYSIuLi4iZiIgfCAiQSIuLi4iRiIKCkFsdGhvdWdoIGJvdGggbG93ZXIgY2FzZSBgYCdsJ2BgIGFuZCB1cHBlciBjYXNlIGBgJ0wnYGAgYXJlIGFsbG93ZWQgYXMKc3VmZml4IGZvciBsb25nIGludGVnZXJzLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBhbHdheXMgdXNlCmBgJ0wnYGAsIHNpbmNlIHRoZSBsZXR0ZXIgYGAnbCdgYCBsb29rcyB0b28gbXVjaCBsaWtlIHRoZSBkaWdpdApgYCcxJ2BgLgoKUGxhaW4gaW50ZWdlciBsaXRlcmFscyB0aGF0IGFyZSBhYm92ZSB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHBsYWluCmludGVnZXIgKGUuZy4sIDIxNDc0ODM2NDcgd2hlbiB1c2luZyAzMi1iaXQgYXJpdGhtZXRpYykgYXJlIGFjY2VwdGVkCmFzIGlmIHRoZXkgd2VyZSBsb25nIGludGVnZXJzIGluc3RlYWQuIFsxXSAgVGhlcmUgaXMgbm8gbGltaXQgZm9yIGxvbmcKaW50ZWdlciBsaXRlcmFscyBhcGFydCBmcm9tIHdoYXQgY2FuIGJlIHN0b3JlZCBpbiBhdmFpbGFibGUgbWVtb3J5LgoKU29tZSBleGFtcGxlcyBvZiBwbGFpbiBpbnRlZ2VyIGxpdGVyYWxzIChmaXJzdCByb3cpIGFuZCBsb25nIGludGVnZXIKbGl0ZXJhbHMgKHNlY29uZCBhbmQgdGhpcmQgcm93cyk6CgogICA3ICAgICAyMTQ3NDgzNjQ3ICAgICAgICAgICAgICAgICAgICAgICAgMDE3NwogICAzTCAgICA3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNkwgICAgMDM3N0wgICAweDEwMDAwMDAwMEwKICAgICAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgICAgICAgICAgMHhkZWFkYmVlZgp0CAAAAGludGVnZXJzc3wCAAAKTGFtYmRhcwoqKioqKioqCgogICBsYW1iZGFfZXhwciAgICAgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IGV4cHJlc3Npb24KICAgb2xkX2xhbWJkYV9leHByIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBvbGRfZXhwcmVzc2lvbgoKTGFtYmRhIGV4cHJlc3Npb25zIChzb21ldGltZXMgY2FsbGVkIGxhbWJkYSBmb3JtcykgaGF2ZSB0aGUgc2FtZQpzeW50YWN0aWMgcG9zaXRpb24gYXMgZXhwcmVzc2lvbnMuICBUaGV5IGFyZSBhIHNob3J0aGFuZCB0byBjcmVhdGUKYW5vbnltb3VzIGZ1bmN0aW9uczsgdGhlIGV4cHJlc3Npb24gYGBsYW1iZGEgYXJndW1lbnRzOiBleHByZXNzaW9uYGAKeWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LiAgVGhlIHVubmFtZWQgb2JqZWN0IGJlaGF2ZXMgbGlrZSBhIGZ1bmN0aW9uCm9iamVjdCBkZWZpbmVkIHdpdGgKCiAgIGRlZiBuYW1lKGFyZ3VtZW50cyk6CiAgICAgICByZXR1cm4gZXhwcmVzc2lvbgoKU2VlIHNlY3Rpb24gKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgdGhlIHN5bnRheCBvZiBwYXJhbWV0ZXIgbGlzdHMuCk5vdGUgdGhhdCBmdW5jdGlvbnMgY3JlYXRlZCB3aXRoIGxhbWJkYSBleHByZXNzaW9ucyBjYW5ub3QgY29udGFpbgpzdGF0ZW1lbnRzLgp0BgAAAGxhbWJkYXPwBAAACkxpc3QgZGlzcGxheXMKKioqKioqKioqKioqKgoKQSBsaXN0IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2YgZXhwcmVzc2lvbnMgZW5jbG9zZWQgaW4Kc3F1YXJlIGJyYWNrZXRzOgoKICAgbGlzdF9kaXNwbGF5ICAgICAgICA6Oj0gIlsiIFtleHByZXNzaW9uX2xpc3QgfCBsaXN0X2NvbXByZWhlbnNpb25dICJdIgogICBsaXN0X2NvbXByZWhlbnNpb24gIDo6PSBleHByZXNzaW9uIGxpc3RfZm9yCiAgIGxpc3RfZm9yICAgICAgICAgICAgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgb2xkX2V4cHJlc3Npb25fbGlzdCBbbGlzdF9pdGVyXQogICBvbGRfZXhwcmVzc2lvbl9saXN0IDo6PSBvbGRfZXhwcmVzc2lvbiBbKCIsIiBvbGRfZXhwcmVzc2lvbikrIFsiLCJdXQogICBvbGRfZXhwcmVzc2lvbiAgICAgIDo6PSBvcl90ZXN0IHwgb2xkX2xhbWJkYV9leHByCiAgIGxpc3RfaXRlciAgICAgICAgICAgOjo9IGxpc3RfZm9yIHwgbGlzdF9pZgogICBsaXN0X2lmICAgICAgICAgICAgIDo6PSAiaWYiIG9sZF9leHByZXNzaW9uIFtsaXN0X2l0ZXJdCgpBIGxpc3QgZGlzcGxheSB5aWVsZHMgYSBuZXcgbGlzdCBvYmplY3QuICBJdHMgY29udGVudHMgYXJlIHNwZWNpZmllZApieSBwcm92aWRpbmcgZWl0aGVyIGEgbGlzdCBvZiBleHByZXNzaW9ucyBvciBhIGxpc3QgY29tcHJlaGVuc2lvbi4KV2hlbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGlzIHN1cHBsaWVkLCBpdHMgZWxlbWVudHMKYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHBsYWNlZCBpbnRvIHRoZSBsaXN0IG9iamVjdCBpbgp0aGF0IG9yZGVyLiAgV2hlbiBhIGxpc3QgY29tcHJlaGVuc2lvbiBpcyBzdXBwbGllZCwgaXQgY29uc2lzdHMgb2YgYQpzaW5nbGUgZXhwcmVzc2lvbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgYGBmb3JgYCBjbGF1c2UgYW5kIHplcm8gb3IKbW9yZSBgYGZvcmBgIG9yIGBgaWZgYCBjbGF1c2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZWxlbWVudHMgb2YgdGhlIG5ldwpsaXN0IGFyZSB0aG9zZSB0aGF0IHdvdWxkIGJlIHByb2R1Y2VkIGJ5IGNvbnNpZGVyaW5nIGVhY2ggb2YgdGhlCmBgZm9yYGAgb3IgYGBpZmBgIGNsYXVzZXMgYSBibG9jaywgbmVzdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQsIGFuZApldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIHRvIHByb2R1Y2UgYSBsaXN0IGVsZW1lbnQgZWFjaCB0aW1lIHRoZQppbm5lcm1vc3QgYmxvY2sgaXMgcmVhY2hlZCBbMV0uCnQFAAAAbGlzdHNz7RwAAApOYW1pbmcgYW5kIGJpbmRpbmcKKioqKioqKioqKioqKioqKioqCgoqTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmcKb3BlcmF0aW9ucy4gRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0bwp0aGUgKmJpbmRpbmcqIG9mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBpbiB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIGJsb2NrCmNvbnRhaW5pbmcgdGhlIHVzZS4KCkEgKmJsb2NrKiBpcyBhIHBpZWNlIG9mIFB5dGhvbiBwcm9ncmFtIHRleHQgdGhhdCBpcyBleGVjdXRlZCBhcyBhCnVuaXQuIFRoZSBmb2xsb3dpbmcgYXJlIGJsb2NrczogYSBtb2R1bGUsIGEgZnVuY3Rpb24gYm9keSwgYW5kIGEgY2xhc3MKZGVmaW5pdGlvbi4gRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0CmZpbGUgKGEgZmlsZSBnaXZlbiBhcyBzdGFuZGFyZCBpbnB1dCB0byB0aGUgaW50ZXJwcmV0ZXIgb3Igc3BlY2lmaWVkCm9uIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGxpbmUgdGhlIGZpcnN0IGFyZ3VtZW50KSBpcyBhIGNvZGUgYmxvY2suCkEgc2NyaXB0IGNvbW1hbmQgKGEgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZQp3aXRoIHRoZSAnKiotYyoqJyBvcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBmaWxlIHJlYWQgYnkgdGhlCmJ1aWx0LWluIGZ1bmN0aW9uIGBgZXhlY2ZpbGUoKWBgIGlzIGEgY29kZSBibG9jay4gIFRoZSBzdHJpbmcgYXJndW1lbnQKcGFzc2VkIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGV2YWwoKWBgIGFuZCB0byB0aGUgYGBleGVjYGAKc3RhdGVtZW50IGlzIGEgY29kZSBibG9jay4gVGhlIGV4cHJlc3Npb24gcmVhZCBhbmQgZXZhbHVhdGVkIGJ5IHRoZQpidWlsdC1pbiBmdW5jdGlvbiBgYGlucHV0KClgYCBpcyBhIGNvZGUgYmxvY2suCgpBIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zCnNvbWUgYWRtaW5pc3RyYXRpdmUgaW5mb3JtYXRpb24gKHVzZWQgZm9yIGRlYnVnZ2luZykgYW5kIGRldGVybWluZXMKd2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrJ3MgZXhlY3V0aW9uIGhhcwpjb21wbGV0ZWQuCgpBICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsCnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGUKZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55IGJsb2Nrcwpjb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzCmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLiAgVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYQpjbGFzcyBibG9jayBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZQpjb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tIHRoaXMgaW5jbHVkZXMgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlCnRoZXkgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlCmZvbGxvd2luZyB3aWxsIGZhaWw6CgogICBjbGFzcyBBOgogICAgICAgYSA9IDQyCiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpCgpXaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIG5lYXJlc3QKZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2sKaXMgY2FsbGVkIHRoZSBibG9jaydzICplbnZpcm9ubWVudCouCgpJZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLgpJZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlIG1vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlCnZhcmlhYmxlcyBvZiB0aGUgbW9kdWxlIGNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYQp2YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZSBibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUKdmFyaWFibGUqLgoKV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSBgYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuCklmIHRoZSBuYW1lIHJlZmVycyB0byBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgaGFzIG5vdCBiZWVuIGJvdW5kLCBhCmBgVW5ib3VuZExvY2FsRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgYGBVbmJvdW5kTG9jYWxFcnJvcmBgIGlzIGEKc3ViY2xhc3Mgb2YgYGBOYW1lRXJyb3JgYC4KClRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsCmBgaW1wb3J0YGAgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kIHRoZQpjbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlCmlkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCBgYGZvcmBgIGxvb3AgaGVhZGVyLCBpbiB0aGUKc2Vjb25kIHBvc2l0aW9uIG9mIGFuIGBgZXhjZXB0YGAgY2xhdXNlIGhlYWRlciBvciBhZnRlciBgYGFzYGAgaW4gYQpgYHdpdGhgYCBzdGF0ZW1lbnQuICBUaGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gYGBmcm9tIC4uLgppbXBvcnQgKmBgIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdAp0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlCm1vZHVsZSBsZXZlbC4KCkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhIGBgZGVsYGAgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3IKdGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuICBJdAppcyBpbGxlZ2FsIHRvIHVuYmluZCBhIG5hbWUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFuIGVuY2xvc2luZyBzY29wZTsKdGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgYGBTeW50YXhFcnJvcmBgLgoKRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYQpjbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWwKY29kZSBibG9jaykuCgpJZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbAp1c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGUKY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGEKYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzCmRlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlCndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmUKZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lIGJpbmRpbmcKb3BlcmF0aW9ucy4KCklmIHRoZSBnbG9iYWwgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWUKc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZQp0b3AtbGV2ZWwgbmFtZXNwYWNlLiBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnkKc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZQpjb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlIG5hbWVzcGFjZQpvZiB0aGUgbW9kdWxlIGBgX19idWlsdGluX19gYC4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkCmZpcnN0LiAgSWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzCnNlYXJjaGVkLiAgVGhlIGdsb2JhbCBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLgoKVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgYmxvY2sKaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSBgYF9fYnVpbHRpbnNfX2BgIGluIGl0cwpnbG9iYWwgbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZQpsYXR0ZXIgY2FzZSB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlCmBgX19tYWluX19gYCBtb2R1bGUsIGBgX19idWlsdGluc19fYGAgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZQpgYF9fYnVpbHRpbl9fYGAgKG5vdGU6IG5vICdzJyk7IHdoZW4gaW4gYW55IG90aGVyIG1vZHVsZSwKYGBfX2J1aWx0aW5zX19gYCBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIGBgX19idWlsdGluX19gYAptb2R1bGUgaXRzZWxmLiAgYGBfX2J1aWx0aW5zX19gYCBjYW4gYmUgc2V0IHRvIGEgdXNlci1jcmVhdGVkCmRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoCmBgX19idWlsdGluc19fYGA7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzCndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkIGBgaW1wb3J0YGAKdGhlIGBgX19idWlsdGluX19gYCAobm8gJ3MnKSBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlcwphcHByb3ByaWF0ZWx5LgoKVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGEKbW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkCmBgX19tYWluX19gYC4KClRoZSBgYGdsb2JhbGBgIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcKb3BlcmF0aW9uIGluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhCmZyZWUgdmFyaWFibGUgY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcwp0cmVhdGVkIGFzIGEgZ2xvYmFsLgoKQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lCm5hbWVzLiBUaGVzZSByZWZlcmVuY2VzIGZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24uClRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkKb2YgdGhlIGNsYXNzLiAgTmFtZXMgZGVmaW5lZCBhdCB0aGUgY2xhc3Mgc2NvcGUgYXJlIG5vdCB2aXNpYmxlIGluCm1ldGhvZHMuCgoKSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkCmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuCgpJZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvCmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLgoKSWYgdGhlIHdpbGQgY2FyZCBmb3JtIG9mIGltcG9ydCAtLS0gYGBpbXBvcnQgKmBgIC0tLSBpcyB1c2VkIGluIGEKZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWUKdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC4KCklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEKbmVzdGVkIGJsb2NrIHdpdGggZnJlZSB2YXJpYWJsZXMsIHRoZSBjb21waWxlciB3aWxsIHJhaXNlIGEKYGBTeW50YXhFcnJvcmBgIHVubGVzcyB0aGUgZXhlYyBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgbG9jYWwKbmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZQppbGxlZ2FsLCBidXQgYGBleGVjIG9iaiBpbiBuc2BgIHdvdWxkIGJlIGxlZ2FsLikKClRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlCmBgZXhlY2BgIHN0YXRlbWVudCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yCnJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWwgYW5kIGdsb2JhbApuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZQpuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gWzFdIFRoZQpgYGV4ZWNgYCBzdGF0ZW1lbnQgYW5kIHRoZSBgYGV2YWwoKWBgIGFuZCBgYGV4ZWNmaWxlKClgYCBmdW5jdGlvbnMKaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLgpJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLgp0BgAAAG5hbWluZ3OsAQAACk51bWVyaWMgbGl0ZXJhbHMKKioqKioqKioqKioqKioqKgoKVGhlcmUgYXJlIGZvdXIgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogcGxhaW4gaW50ZWdlcnMsIGxvbmcKaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGFuZCBpbWFnaW5hcnkgbnVtYmVycy4gIFRoZXJlIGFyZSBubwpjb21wbGV4IGxpdGVyYWxzIChjb21wbGV4IG51bWJlcnMgY2FuIGJlIGZvcm1lZCBieSBhZGRpbmcgYSByZWFsCm51bWJlciBhbmQgYW4gaW1hZ2luYXJ5IG51bWJlcikuCgpOb3RlIHRoYXQgbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgaW5jbHVkZSBhIHNpZ247IGEgcGhyYXNlIGxpa2UgYGAtMWBgCmlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yICdgYC1gYCcgYW5kCnRoZSBsaXRlcmFsIGBgMWBgLgp0BwAAAG51bWJlcnNzJBcAAApFbXVsYXRpbmcgbnVtZXJpYyB0eXBlcwoqKioqKioqKioqKioqKioqKioqKioqKgoKVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLgpNZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZQpwYXJ0aWN1bGFyIGtpbmQgb2YgbnVtYmVyIGltcGxlbWVudGVkIChlLmcuLCBiaXR3aXNlIG9wZXJhdGlvbnMgZm9yCm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuCgpvYmplY3QuX19hZGRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Bvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSkKb2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19hbmRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpYwogICBvcGVyYXRpb25zIChgYCtgYCwgYGAtYGAsIGBgKmBgLCBgYC8vYGAsIGBgJWBgLCBgYGRpdm1vZCgpYGAsCiAgIGBgcG93KClgYCwgYGAqKmBgLCBgYDw8YGAsIGBgPj5gYCwgYGAmYGAsIGBgXmBgLCBgYHxgYCkuICBGb3IKICAgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGBgeCArIHlgYCwgd2hlcmUgKngqIGlzIGFuCiAgIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gYGBfX2FkZF9fKClgYCBtZXRob2QsCiAgIGBgeC5fX2FkZF9fKHkpYGAgaXMgY2FsbGVkLiAgVGhlIGBgX19kaXZtb2RfXygpYGAgbWV0aG9kIHNob3VsZCBiZQogICB0aGUgZXF1aXZhbGVudCB0byB1c2luZyBgYF9fZmxvb3JkaXZfXygpYGAgYW5kIGBgX19tb2RfXygpYGA7IGl0CiAgIHNob3VsZCBub3QgYmUgcmVsYXRlZCB0byBgYF9fdHJ1ZWRpdl9fKClgYCAoZGVzY3JpYmVkIGJlbG93KS4gIE5vdGUKICAgdGhhdCBgYF9fcG93X18oKWBgIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdCBhbiBvcHRpb25hbCB0aGlyZAogICBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pbiBgYHBvdygpYGAgZnVuY3Rpb24KICAgaXMgdG8gYmUgc3VwcG9ydGVkLgoKICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlCiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiBgYE5vdEltcGxlbWVudGVkYGAuCgpvYmplY3QuX19kaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKQoKICAgVGhlIGRpdmlzaW9uIG9wZXJhdG9yIChgYC9gYCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbWV0aG9kcy4gIFRoZQogICBgYF9fdHJ1ZWRpdl9fKClgYCBtZXRob2QgaXMgdXNlZCB3aGVuIGBgX19mdXR1cmVfXy5kaXZpc2lvbmBgIGlzIGluCiAgIGVmZmVjdCwgb3RoZXJ3aXNlIGBgX19kaXZfXygpYGAgaXMgdXNlZC4gIElmIG9ubHkgb25lIG9mIHRoZXNlIHR3bwogICBtZXRob2RzIGlzIGRlZmluZWQsIHRoZSBvYmplY3Qgd2lsbCBub3Qgc3VwcG9ydCBkaXZpc2lvbiBpbiB0aGUKICAgYWx0ZXJuYXRlIGNvbnRleHQ7IGBgVHlwZUVycm9yYGAgd2lsbCBiZSByYWlzZWQgaW5zdGVhZC4KCm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3JkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpYwogICBvcGVyYXRpb25zIChgYCtgYCwgYGAtYGAsIGBgKmBgLCBgYC9gYCwgYGAlYGAsIGBgZGl2bW9kKClgYCwKICAgYGBwb3coKWBgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKSB3aXRoCiAgIHJlZmxlY3RlZCAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmCiAgIHRoZSBsZWZ0IG9wZXJhbmQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gYW5kCiAgIHRoZSBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZQogICB0aGUgZXhwcmVzc2lvbiBgYHggLSB5YGAsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQKICAgaGFzIGFuIGBgX19yc3ViX18oKWBgIG1ldGhvZCwgYGB5Ll9fcnN1Yl9fKHgpYGAgaXMgY2FsbGVkIGlmCiAgIGBgeC5fX3N1Yl9fKHkpYGAgcmV0dXJucyAqTm90SW1wbGVtZW50ZWQqLgoKICAgTm90ZSB0aGF0IHRlcm5hcnkgYGBwb3coKWBgIHdpbGwgbm90IHRyeSBjYWxsaW5nIGBgX19ycG93X18oKWBgCiAgICh0aGUgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuCgogICBOb3RlOiBJZiB0aGUgcmlnaHQgb3BlcmFuZCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kJ3MKICAgICB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSByZWZsZWN0ZWQgbWV0aG9kIGZvciB0aGUKICAgICBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdCBvcGVyYW5kJ3MKICAgICBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzIHN1YmNsYXNzZXMgdG8KICAgICBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnMnIG9wZXJhdGlvbnMuCgpvYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pCm9iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpYwogICBhc3NpZ25tZW50cyAoYGArPWBgLCBgYC09YGAsIGBgKj1gYCwgYGAvPWBgLCBgYC8vPWBgLCBgYCU9YGAsCiAgIGBgKio9YGAsIGBgPDw9YGAsIGBgPj49YGAsIGBgJj1gYCwgYGBePWBgLCBgYHw9YGApLiAgVGhlc2UgbWV0aG9kcwogICBzaG91bGQgYXR0ZW1wdCB0byBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQKICAgcmV0dXJuIHRoZSByZXN1bHQgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwKICAgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkCiAgIGFzc2lnbm1lbnQgZmFsbHMgYmFjayB0byB0aGUgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIHRvCiAgIGV4ZWN1dGUgdGhlIHN0YXRlbWVudCBgYHggKz0geWBgLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYQogICBjbGFzcyB0aGF0IGhhcyBhbiBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2lhZGRfXyh5KWBgIGlzCiAgIGNhbGxlZC4gIElmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgZG9lcyBub3QgZGVmaW5lIGEKICAgYGBfX2lhZGRfXygpYGAgbWV0aG9kLCBgYHguX19hZGRfXyh5KWBgIGFuZCBgYHkuX19yYWRkX18oeClgYCBhcmUKICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiBgYHggKyB5YGAuCgpvYmplY3QuX19uZWdfXyhzZWxmKQpvYmplY3QuX19wb3NfXyhzZWxmKQpvYmplY3QuX19hYnNfXyhzZWxmKQpvYmplY3QuX19pbnZlcnRfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgdW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIChgYC1gYCwgYGArYGAsCiAgIGBgYWJzKClgYCBhbmQgYGB+YGApLgoKb2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpCm9iamVjdC5fX2ludF9fKHNlbGYpCm9iamVjdC5fX2xvbmdfXyhzZWxmKQpvYmplY3QuX19mbG9hdF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGBjb21wbGV4KClgYCwKICAgYGBpbnQoKWBgLCBgYGxvbmcoKWBgLCBhbmQgYGBmbG9hdCgpYGAuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YKICAgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCgpvYmplY3QuX19vY3RfXyhzZWxmKQpvYmplY3QuX19oZXhfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zIGBgb2N0KClgYCBhbmQgYGBoZXgoKWBgLgogICBTaG91bGQgcmV0dXJuIGEgc3RyaW5nIHZhbHVlLgoKb2JqZWN0Ll9faW5kZXhfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYG9wZXJhdG9yLmluZGV4KClgYC4gIEFsc28gY2FsbGVkIHdoZW5ldmVyCiAgIFB5dGhvbiBuZWVkcyBhbiBpbnRlZ2VyIG9iamVjdCAoc3VjaCBhcyBpbiBzbGljaW5nKS4gIE11c3QgcmV0dXJuCiAgIGFuIGludGVnZXIgKGludCBvciBsb25nKS4KCiAgIE5ldyBpbiB2ZXJzaW9uIDIuNS4KCm9iamVjdC5fX2NvZXJjZV9fKHNlbGYsIG90aGVyKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCAibWl4ZWQtbW9kZSIgbnVtZXJpYyBhcml0aG1ldGljLiAgU2hvdWxkIGVpdGhlcgogICByZXR1cm4gYSAyLXR1cGxlIGNvbnRhaW5pbmcgKnNlbGYqIGFuZCAqb3RoZXIqIGNvbnZlcnRlZCB0byBhCiAgIGNvbW1vbiBudW1lcmljIHR5cGUsIG9yIGBgTm9uZWBgIGlmIGNvbnZlcnNpb24gaXMgaW1wb3NzaWJsZS4gIFdoZW4KICAgdGhlIGNvbW1vbiB0eXBlIHdvdWxkIGJlIHRoZSB0eXBlIG9mIGBgb3RoZXJgYCwgaXQgaXMgc3VmZmljaWVudCB0bwogICByZXR1cm4gYGBOb25lYGAsIHNpbmNlIHRoZSBpbnRlcnByZXRlciB3aWxsIGFsc28gYXNrIHRoZSBvdGhlcgogICBvYmplY3QgdG8gYXR0ZW1wdCBhIGNvZXJjaW9uIChidXQgc29tZXRpbWVzLCBpZiB0aGUgaW1wbGVtZW50YXRpb24KICAgb2YgdGhlIG90aGVyIHR5cGUgY2Fubm90IGJlIGNoYW5nZWQsIGl0IGlzIHVzZWZ1bCB0byBkbyB0aGUKICAgY29udmVyc2lvbiB0byB0aGUgb3RoZXIgdHlwZSBoZXJlKS4gIEEgcmV0dXJuIHZhbHVlIG9mCiAgIGBgTm90SW1wbGVtZW50ZWRgYCBpcyBlcXVpdmFsZW50IHRvIHJldHVybmluZyBgYE5vbmVgYC4Kcw0AAABudW1lcmljLXR5cGVzc34RAAAKT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlcwoqKioqKioqKioqKioqKioqKioqKioqKioqCgoqT2JqZWN0cyogYXJlIFB5dGhvbidzIGFic3RyYWN0aW9uIGZvciBkYXRhLiAgQWxsIGRhdGEgaW4gYSBQeXRob24KcHJvZ3JhbSBpcyByZXByZXNlbnRlZCBieSBvYmplY3RzIG9yIGJ5IHJlbGF0aW9ucyBiZXR3ZWVuIG9iamVjdHMuIChJbgphIHNlbnNlLCBhbmQgaW4gY29uZm9ybWFuY2UgdG8gVm9uIE5ldW1hbm4ncyBtb2RlbCBvZiBhICJzdG9yZWQKcHJvZ3JhbSBjb21wdXRlciwiIGNvZGUgaXMgYWxzbyByZXByZXNlbnRlZCBieSBvYmplY3RzLikKCkV2ZXJ5IG9iamVjdCBoYXMgYW4gaWRlbnRpdHksIGEgdHlwZSBhbmQgYSB2YWx1ZS4gIEFuIG9iamVjdCdzCippZGVudGl0eSogbmV2ZXIgY2hhbmdlcyBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQ7IHlvdSBtYXkgdGhpbmsgb2YgaXQKYXMgdGhlIG9iamVjdCdzIGFkZHJlc3MgaW4gbWVtb3J5LiAgVGhlICdgYGlzYGAnIG9wZXJhdG9yIGNvbXBhcmVzIHRoZQppZGVudGl0eSBvZiB0d28gb2JqZWN0czsgdGhlIGBgaWQoKWBgIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlcgpyZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5IChjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgaXRzIGFkZHJlc3MpLiBBbgpvYmplY3QncyAqdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXSBBbiBvYmplY3QncyB0eXBlIGRldGVybWluZXMKdGhlIG9wZXJhdGlvbnMgdGhhdCB0aGUgb2JqZWN0IHN1cHBvcnRzIChlLmcuLCAiZG9lcyBpdCBoYXZlIGEKbGVuZ3RoPyIpIGFuZCBhbHNvIGRlZmluZXMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3Igb2JqZWN0cyBvZiB0aGF0CnR5cGUuICBUaGUgYGB0eXBlKClgYCBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdCdzIHR5cGUgKHdoaWNoIGlzIGFuCm9iamVjdCBpdHNlbGYpLiAgVGhlICp2YWx1ZSogb2Ygc29tZSBvYmplY3RzIGNhbiBjaGFuZ2UuICBPYmplY3RzCndob3NlIHZhbHVlIGNhbiBjaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlCmlzIHVuY2hhbmdlYWJsZSBvbmNlIHRoZXkgYXJlIGNyZWF0ZWQgYXJlIGNhbGxlZCAqaW1tdXRhYmxlKi4gKFRoZQp2YWx1ZSBvZiBhbiBpbW11dGFibGUgY29udGFpbmVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEKbXV0YWJsZSBvYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXIncyB2YWx1ZSBpcyBjaGFuZ2VkOyBob3dldmVyCnRoZSBjb250YWluZXIgaXMgc3RpbGwgY29uc2lkZXJlZCBpbW11dGFibGUsIGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gb2YKb2JqZWN0cyBpdCBjb250YWlucyBjYW5ub3QgYmUgY2hhbmdlZC4gIFNvLCBpbW11dGFiaWxpdHkgaXMgbm90CnN0cmljdGx5IHRoZSBzYW1lIGFzIGhhdmluZyBhbiB1bmNoYW5nZWFibGUgdmFsdWUsIGl0IGlzIG1vcmUgc3VidGxlLikKQW4gb2JqZWN0J3MgbXV0YWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IGl0cyB0eXBlOyBmb3IgaW5zdGFuY2UsCm51bWJlcnMsIHN0cmluZ3MgYW5kIHR1cGxlcyBhcmUgaW1tdXRhYmxlLCB3aGlsZSBkaWN0aW9uYXJpZXMgYW5kCmxpc3RzIGFyZSBtdXRhYmxlLgoKT2JqZWN0cyBhcmUgbmV2ZXIgZXhwbGljaXRseSBkZXN0cm95ZWQ7IGhvd2V2ZXIsIHdoZW4gdGhleSBiZWNvbWUKdW5yZWFjaGFibGUgdGhleSBtYXkgYmUgZ2FyYmFnZS1jb2xsZWN0ZWQuICBBbiBpbXBsZW1lbnRhdGlvbiBpcwphbGxvd2VkIHRvIHBvc3Rwb25lIGdhcmJhZ2UgY29sbGVjdGlvbiBvciBvbWl0IGl0IGFsdG9nZXRoZXIgLS0tIGl0IGlzCmEgbWF0dGVyIG9mIGltcGxlbWVudGF0aW9uIHF1YWxpdHkgaG93IGdhcmJhZ2UgY29sbGVjdGlvbiBpcwppbXBsZW1lbnRlZCwgYXMgbG9uZyBhcyBubyBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgdGhhdCBhcmUgc3RpbGwKcmVhY2hhYmxlLgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBDUHl0aG9uIGN1cnJlbnRseSB1c2VzIGEgcmVmZXJlbmNlLQpjb3VudGluZyBzY2hlbWUgd2l0aCAob3B0aW9uYWwpIGRlbGF5ZWQgZGV0ZWN0aW9uIG9mIGN5Y2xpY2FsbHkgbGlua2VkCmdhcmJhZ2UsIHdoaWNoIGNvbGxlY3RzIG1vc3Qgb2JqZWN0cyBhcyBzb29uIGFzIHRoZXkgYmVjb21lCnVucmVhY2hhYmxlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY29sbGVjdCBnYXJiYWdlIGNvbnRhaW5pbmcKY2lyY3VsYXIgcmVmZXJlbmNlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgYGBnY2BgIG1vZHVsZSBmb3IKaW5mb3JtYXRpb24gb24gY29udHJvbGxpbmcgdGhlIGNvbGxlY3Rpb24gb2YgY3ljbGljIGdhcmJhZ2UuIE90aGVyCmltcGxlbWVudGF0aW9ucyBhY3QgZGlmZmVyZW50bHkgYW5kIENQeXRob24gbWF5IGNoYW5nZS4gRG8gbm90IGRlcGVuZApvbiBpbW1lZGlhdGUgZmluYWxpemF0aW9uIG9mIG9iamVjdHMgd2hlbiB0aGV5IGJlY29tZSB1bnJlYWNoYWJsZSAoZXg6CmFsd2F5cyBjbG9zZSBmaWxlcykuCgpOb3RlIHRoYXQgdGhlIHVzZSBvZiB0aGUgaW1wbGVtZW50YXRpb24ncyB0cmFjaW5nIG9yIGRlYnVnZ2luZwpmYWNpbGl0aWVzIG1heSBrZWVwIG9iamVjdHMgYWxpdmUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBjb2xsZWN0YWJsZS4KQWxzbyBub3RlIHRoYXQgY2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSAnYGB0cnlgYC4uLmBgZXhjZXB0YGAnCnN0YXRlbWVudCBtYXkga2VlcCBvYmplY3RzIGFsaXZlLgoKU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byAiZXh0ZXJuYWwiIHJlc291cmNlcyBzdWNoIGFzIG9wZW4KZmlsZXMgb3Igd2luZG93cy4gIEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGVzZSByZXNvdXJjZXMgYXJlIGZyZWVkCndoZW4gdGhlIG9iamVjdCBpcyBnYXJiYWdlLWNvbGxlY3RlZCwgYnV0IHNpbmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBpcwpub3QgZ3VhcmFudGVlZCB0byBoYXBwZW4sIHN1Y2ggb2JqZWN0cyBhbHNvIHByb3ZpZGUgYW4gZXhwbGljaXQgd2F5IHRvCnJlbGVhc2UgdGhlIGV4dGVybmFsIHJlc291cmNlLCB1c3VhbGx5IGEgYGBjbG9zZSgpYGAgbWV0aG9kLiBQcm9ncmFtcwphcmUgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gZXhwbGljaXRseSBjbG9zZSBzdWNoIG9iamVjdHMuICBUaGUKJ2BgdHJ5YGAuLi5gYGZpbmFsbHlgYCcgc3RhdGVtZW50IHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gZG8KdGhpcy4KClNvbWUgb2JqZWN0cyBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0czsgdGhlc2UgYXJlIGNhbGxlZAoqY29udGFpbmVycyouIEV4YW1wbGVzIG9mIGNvbnRhaW5lcnMgYXJlIHR1cGxlcywgbGlzdHMgYW5kCmRpY3Rpb25hcmllcy4gIFRoZSByZWZlcmVuY2VzIGFyZSBwYXJ0IG9mIGEgY29udGFpbmVyJ3MgdmFsdWUuICBJbgptb3N0IGNhc2VzLCB3aGVuIHdlIHRhbGsgYWJvdXQgdGhlIHZhbHVlIG9mIGEgY29udGFpbmVyLCB3ZSBpbXBseSB0aGUKdmFsdWVzLCBub3QgdGhlIGlkZW50aXRpZXMgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzOyBob3dldmVyLCB3aGVuIHdlCnRhbGsgYWJvdXQgdGhlIG11dGFiaWxpdHkgb2YgYSBjb250YWluZXIsIG9ubHkgdGhlIGlkZW50aXRpZXMgb2YgdGhlCmltbWVkaWF0ZWx5IGNvbnRhaW5lZCBvYmplY3RzIGFyZSBpbXBsaWVkLiAgU28sIGlmIGFuIGltbXV0YWJsZQpjb250YWluZXIgKGxpa2UgYSB0dXBsZSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlIG9iamVjdCwgaXRzCnZhbHVlIGNoYW5nZXMgaWYgdGhhdCBtdXRhYmxlIG9iamVjdCBpcyBjaGFuZ2VkLgoKVHlwZXMgYWZmZWN0IGFsbW9zdCBhbGwgYXNwZWN0cyBvZiBvYmplY3QgYmVoYXZpb3IuICBFdmVuIHRoZQppbXBvcnRhbmNlIG9mIG9iamVjdCBpZGVudGl0eSBpcyBhZmZlY3RlZCBpbiBzb21lIHNlbnNlOiBmb3IgaW1tdXRhYmxlCnR5cGVzLCBvcGVyYXRpb25zIHRoYXQgY29tcHV0ZSBuZXcgdmFsdWVzIG1heSBhY3R1YWxseSByZXR1cm4gYQpyZWZlcmVuY2UgdG8gYW55IGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIHZhbHVlLCB3aGlsZQpmb3IgbXV0YWJsZSBvYmplY3RzIHRoaXMgaXMgbm90IGFsbG93ZWQuICBFLmcuLCBhZnRlciBgYGEgPSAxOyBiID0KMWBgLCBgYGFgYCBhbmQgYGBiYGAgbWF5IG9yIG1heSBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHdpdGggdGhlCnZhbHVlIG9uZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGFmdGVyIGBgYyA9IFtdOyBkID0KW11gYCwgYGBjYGAgYW5kIGBgZGBgIGFyZSBndWFyYW50ZWVkIHRvIHJlZmVyIHRvIHR3byBkaWZmZXJlbnQsCnVuaXF1ZSwgbmV3bHkgY3JlYXRlZCBlbXB0eSBsaXN0cy4gKE5vdGUgdGhhdCBgYGMgPSBkID0gW11gYCBhc3NpZ25zCnRoZSBzYW1lIG9iamVjdCB0byBib3RoIGBgY2BgIGFuZCBgYGRgYC4pCnQHAAAAb2JqZWN0c3O2GgAACk9wZXJhdG9yIHByZWNlZGVuY2UKKioqKioqKioqKioqKioqKioqKgoKVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlcyBpbiBQeXRob24sCmZyb20gbG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0IGJpbmRpbmcpIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZSAobW9zdApiaW5kaW5nKS4gT3BlcmF0b3JzIGluIHRoZSBzYW1lIGJveCBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UuICBVbmxlc3MKdGhlIHN5bnRheCBpcyBleHBsaWNpdGx5IGdpdmVuLCBvcGVyYXRvcnMgYXJlIGJpbmFyeS4gIE9wZXJhdG9ycyBpbgp0aGUgc2FtZSBib3ggZ3JvdXAgbGVmdCB0byByaWdodCAoZXhjZXB0IGZvciBjb21wYXJpc29ucywgaW5jbHVkaW5nCnRlc3RzLCB3aGljaCBhbGwgaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlIGFuZCBjaGFpbiBmcm9tIGxlZnQgdG8gcmlnaHQKLS0tIHNlZSBzZWN0aW9uICpDb21wYXJpc29ucyogLS0tIGFuZCBleHBvbmVudGlhdGlvbiwgd2hpY2ggZ3JvdXBzCmZyb20gcmlnaHQgdG8gbGVmdCkuCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgT3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgbGFtYmRhYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGFtYmRhIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYGlmYGAgLS0gYGBlbHNlYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbmRpdGlvbmFsIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBvcmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgYW5kYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYG5vdGBgIGBgeGBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBpbmBgLCBgYG5vdCBpbmBgLCBgYGlzYGAsIGBgaXMgbm90YGAsIGBgPGBgLCAgfCBDb21wYXJpc29ucywgaW5jbHVkaW5nIG1lbWJlcnNoaXAgICAgIHwKfCBgYDw9YGAsIGBgPmBgLCBgYD49YGAsIGBgPD5gYCwgYGAhPWBgLCBgYD09YGAgICB8IHRlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cyAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGB8YGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgXmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBYT1IgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYCZgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGA8PGBgLCBgYD4+YGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTaGlmdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgK2BgLCBgYC1gYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYCpgYCwgYGAvYGAsIGBgLy9gYCwgYGAlYGAgICAgICAgICAgICAgICAgICAgICB8IE11bHRpcGxpY2F0aW9uLCBkaXZpc2lvbiwgcmVtYWluZGVyICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWzhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYCt4YGAsIGBgLXhgYCwgYGB+eGBgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBvc2l0aXZlLCBuZWdhdGl2ZSwgYml0d2lzZSBOT1QgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGAqKmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeHBvbmVudGlhdGlvbiBbOV0gICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgeFtpbmRleF1gYCwgYGB4W2luZGV4OmluZGV4XWBgLCAgICAgICAgICAgICAgIHwgU3Vic2NyaXB0aW9uLCBzbGljaW5nLCBjYWxsLCAgICAgICAgICB8CnwgYGB4KGFyZ3VtZW50cy4uLilgYCwgYGB4LmF0dHJpYnV0ZWBgICAgICAgICAgICAgfCBhdHRyaWJ1dGUgcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgKGV4cHJlc3Npb25zLi4uKWBgLCBgYFtleHByZXNzaW9ucy4uLl1gYCwgICAgIHwgQmluZGluZyBvciB0dXBsZSBkaXNwbGF5LCBsaXN0ICAgICAgICB8CnwgYGB7a2V5OiB2YWx1ZS4uLn1gYCwgYGBgZXhwcmVzc2lvbnMuLi5gYGAgICAgICAgfCBkaXNwbGF5LCBkaWN0aW9uYXJ5IGRpc3BsYXksIHN0cmluZyAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgotWyBGb290bm90ZXMgXS0KClsxXSBJbiBQeXRob24gMi4zIGFuZCBsYXRlciByZWxlYXNlcywgYSBsaXN0IGNvbXByZWhlbnNpb24gImxlYWtzIiB0aGUKICAgIGNvbnRyb2wgdmFyaWFibGVzIG9mIGVhY2ggYGBmb3JgYCBpdCBjb250YWlucyBpbnRvIHRoZSBjb250YWluaW5nCiAgICBzY29wZS4gIEhvd2V2ZXIsIHRoaXMgYmVoYXZpb3IgaXMgZGVwcmVjYXRlZCwgYW5kIHJlbHlpbmcgb24gaXQKICAgIHdpbGwgbm90IHdvcmsgaW4gUHl0aG9uIDMuCgpbMl0gV2hpbGUgYGBhYnMoeCV5KSA8IGFicyh5KWBgIGlzIHRydWUgbWF0aGVtYXRpY2FsbHksIGZvciBmbG9hdHMgaXQKICAgIG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kCiAgICBhc3N1bWluZyBhIHBsYXRmb3JtIG9uIHdoaWNoIGEgUHl0aG9uIGZsb2F0IGlzIGFuIElFRUUgNzU0IGRvdWJsZS0KICAgIHByZWNpc2lvbiBudW1iZXIsIGluIG9yZGVyIHRoYXQgYGAtMWUtMTAwICUgMWUxMDBgYCBoYXZlIHRoZSBzYW1lCiAgICBzaWduIGFzIGBgMWUxMDBgYCwgdGhlIGNvbXB1dGVkIHJlc3VsdCBpcyBgYC0xZS0xMDAgKyAxZTEwMGBgLAogICAgd2hpY2ggaXMgbnVtZXJpY2FsbHkgZXhhY3RseSBlcXVhbCB0byBgYDFlMTAwYGAuICBUaGUgZnVuY3Rpb24KICAgIGBgbWF0aC5mbW9kKClgYCByZXR1cm5zIGEgcmVzdWx0IHdob3NlIHNpZ24gbWF0Y2hlcyB0aGUgc2lnbiBvZgogICAgdGhlIGZpcnN0IGFyZ3VtZW50IGluc3RlYWQsIGFuZCBzbyByZXR1cm5zIGBgLTFlLTEwMGBgIGluIHRoaXMKICAgIGNhc2UuIFdoaWNoIGFwcHJvYWNoIGlzIG1vcmUgYXBwcm9wcmlhdGUgZGVwZW5kcyBvbiB0aGUKICAgIGFwcGxpY2F0aW9uLgoKWzNdIElmIHggaXMgdmVyeSBjbG9zZSB0byBhbiBleGFjdCBpbnRlZ2VyIG11bHRpcGxlIG9mIHksIGl0J3MKICAgIHBvc3NpYmxlIGZvciBgYGZsb29yKHgveSlgYCB0byBiZSBvbmUgbGFyZ2VyIHRoYW4gYGAoeC14JXkpL3lgYAogICAgZHVlIHRvIHJvdW5kaW5nLiAgSW4gc3VjaCBjYXNlcywgUHl0aG9uIHJldHVybnMgdGhlIGxhdHRlciByZXN1bHQsCiAgICBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGF0IGBgZGl2bW9kKHgseSlbMF0gKiB5ICsgeCAlIHlgYCBiZSB2ZXJ5CiAgICBjbG9zZSB0byBgYHhgYC4KCls0XSBXaGlsZSBjb21wYXJpc29ucyBiZXR3ZWVuIHVuaWNvZGUgc3RyaW5ncyBtYWtlIHNlbnNlIGF0IHRoZSBieXRlCiAgICBsZXZlbCwgdGhleSBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgdG8gdXNlcnMuIEZvciBleGFtcGxlLCB0aGUKICAgIHN0cmluZ3MgYGB1Ilx1MDBDNyJgYCBhbmQgYGB1Ilx1MDA0M1x1MDMyNyJgYCBjb21wYXJlIGRpZmZlcmVudGx5LAogICAgZXZlbiB0aG91Z2ggdGhleSBib3RoIHJlcHJlc2VudCB0aGUgc2FtZSB1bmljb2RlIGNoYXJhY3RlciAoTEFUSU4KICAgIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBKS4gVG8gY29tcGFyZSBzdHJpbmdzIGluIGEgaHVtYW4KICAgIHJlY29nbml6YWJsZSB3YXksIGNvbXBhcmUgdXNpbmcgYGB1bmljb2RlZGF0YS5ub3JtYWxpemUoKWBgLgoKWzVdIFRoZSBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcyB0aGlzIGVmZmljaWVudGx5LCB3aXRob3V0IGNvbnN0cnVjdGluZwogICAgbGlzdHMgb3Igc29ydGluZy4KCls2XSBFYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiB1c2VkIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiB0aGUKICAgIHNvcnRlZCAoa2V5LCB2YWx1ZSkgbGlzdHMsIGJ1dCB0aGlzIHdhcyB2ZXJ5IGV4cGVuc2l2ZSBmb3IgdGhlCiAgICBjb21tb24gY2FzZSBvZiBjb21wYXJpbmcgZm9yIGVxdWFsaXR5LiAgQW4gZXZlbiBlYXJsaWVyIHZlcnNpb24gb2YKICAgIFB5dGhvbiBjb21wYXJlZCBkaWN0aW9uYXJpZXMgYnkgaWRlbnRpdHkgb25seSwgYnV0IHRoaXMgY2F1c2VkCiAgICBzdXJwcmlzZXMgYmVjYXVzZSBwZW9wbGUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0byB0ZXN0IGEgZGljdGlvbmFyeQogICAgZm9yIGVtcHRpbmVzcyBieSBjb21wYXJpbmcgaXQgdG8gYGB7fWBgLgoKWzddIER1ZSB0byBhdXRvbWF0aWMgZ2FyYmFnZS1jb2xsZWN0aW9uLCBmcmVlIGxpc3RzLCBhbmQgdGhlIGR5bmFtaWMKICAgIG5hdHVyZSBvZiBkZXNjcmlwdG9ycywgeW91IG1heSBub3RpY2Ugc2VlbWluZ2x5IHVudXN1YWwgYmVoYXZpb3VyCiAgICBpbiBjZXJ0YWluIHVzZXMgb2YgdGhlIGBgaXNgYCBvcGVyYXRvciwgbGlrZSB0aG9zZSBpbnZvbHZpbmcKICAgIGNvbXBhcmlzb25zIGJldHdlZW4gaW5zdGFuY2UgbWV0aG9kcywgb3IgY29uc3RhbnRzLiAgQ2hlY2sgdGhlaXIKICAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby4KCls4XSBUaGUgYGAlYGAgb3BlcmF0b3IgaXMgYWxzbyB1c2VkIGZvciBzdHJpbmcgZm9ybWF0dGluZzsgdGhlIHNhbWUKICAgIHByZWNlZGVuY2UgYXBwbGllcy4KCls5XSBUaGUgcG93ZXIgb3BlcmF0b3IgYGAqKmBgIGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIGFuIGFyaXRobWV0aWMgb3IKICAgIGJpdHdpc2UgdW5hcnkgb3BlcmF0b3Igb24gaXRzIHJpZ2h0LCB0aGF0IGlzLCBgYDIqKi0xYGAgaXMKICAgIGBgMC41YGAuCnMQAAAAb3BlcmF0b3Itc3VtbWFyeXN+AQAAClRoZSBgYHBhc3NgYCBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKgoKICAgcGFzc19zdG10IDo6PSAicGFzcyIKCmBgcGFzc2BgIGlzIGEgbnVsbCBvcGVyYXRpb24gLS0tIHdoZW4gaXQgaXMgZXhlY3V0ZWQsIG5vdGhpbmcgaGFwcGVucy4KSXQgaXMgdXNlZnVsIGFzIGEgcGxhY2Vob2xkZXIgd2hlbiBhIHN0YXRlbWVudCBpcyByZXF1aXJlZApzeW50YWN0aWNhbGx5LCBidXQgbm8gY29kZSBuZWVkcyB0byBiZSBleGVjdXRlZCwgZm9yIGV4YW1wbGU6CgogICBkZWYgZihhcmcpOiBwYXNzICAgICMgYSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZyAoeWV0KQoKICAgY2xhc3MgQzogcGFzcyAgICAgICAjIGEgY2xhc3Mgd2l0aCBubyBtZXRob2RzICh5ZXQpCnQEAAAAcGFzc3OWBQAAClRoZSBwb3dlciBvcGVyYXRvcgoqKioqKioqKioqKioqKioqKioKClRoZSBwb3dlciBvcGVyYXRvciBiaW5kcyBtb3JlIHRpZ2h0bHkgdGhhbiB1bmFyeSBvcGVyYXRvcnMgb24gaXRzCmxlZnQ7IGl0IGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHMgcmlnaHQuICBUaGUKc3ludGF4IGlzOgoKICAgcG93ZXIgOjo9IHByaW1hcnkgWyIqKiIgdV9leHByXQoKVGh1cywgaW4gYW4gdW5wYXJlbnRoZXNpemVkIHNlcXVlbmNlIG9mIHBvd2VyIGFuZCB1bmFyeSBvcGVyYXRvcnMsIHRoZQpvcGVyYXRvcnMgYXJlIGV2YWx1YXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQgKHRoaXMgZG9lcyBub3QgY29uc3RyYWluCnRoZSBldmFsdWF0aW9uIG9yZGVyIGZvciB0aGUgb3BlcmFuZHMpOiBgYC0xKioyYGAgcmVzdWx0cyBpbiBgYC0xYGAuCgpUaGUgcG93ZXIgb3BlcmF0b3IgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYnVpbHQtaW4gYGBwb3coKWBgCmZ1bmN0aW9uLCB3aGVuIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHM6IGl0IHlpZWxkcyBpdHMgbGVmdCBhcmd1bWVudApyYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGl0cyByaWdodCBhcmd1bWVudC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUKZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBUaGUgcmVzdWx0IHR5cGUgaXMgdGhhdCBvZiB0aGUKYXJndW1lbnRzIGFmdGVyIGNvZXJjaW9uLgoKV2l0aCBtaXhlZCBvcGVyYW5kIHR5cGVzLCB0aGUgY29lcmNpb24gcnVsZXMgZm9yIGJpbmFyeSBhcml0aG1ldGljCm9wZXJhdG9ycyBhcHBseS4gRm9yIGludCBhbmQgbG9uZyBpbnQgb3BlcmFuZHMsIHRoZSByZXN1bHQgaGFzIHRoZQpzYW1lIHR5cGUgYXMgdGhlIG9wZXJhbmRzIChhZnRlciBjb2VyY2lvbikgdW5sZXNzIHRoZSBzZWNvbmQgYXJndW1lbnQKaXMgbmVnYXRpdmU7IGluIHRoYXQgY2FzZSwgYWxsIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGZsb2F0IGFuZCBhCmZsb2F0IHJlc3VsdCBpcyBkZWxpdmVyZWQuIEZvciBleGFtcGxlLCBgYDEwKioyYGAgcmV0dXJucyBgYDEwMGBgLCBidXQKYGAxMCoqLTJgYCByZXR1cm5zIGBgMC4wMWBgLiAoVGhpcyBsYXN0IGZlYXR1cmUgd2FzIGFkZGVkIGluIFB5dGhvbgoyLjIuIEluIFB5dGhvbiAyLjEgYW5kIGJlZm9yZSwgaWYgYm90aCBhcmd1bWVudHMgd2VyZSBvZiBpbnRlZ2VyIHR5cGVzCmFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IHdhcyBuZWdhdGl2ZSwgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQpLgoKUmFpc2luZyBgYDAuMGBgIHRvIGEgbmVnYXRpdmUgcG93ZXIgcmVzdWx0cyBpbiBhCmBgWmVyb0RpdmlzaW9uRXJyb3JgYC4gUmFpc2luZyBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGZyYWN0aW9uYWwgcG93ZXIKcmVzdWx0cyBpbiBhIGBgVmFsdWVFcnJvcmBgLgp0BQAAAHBvd2Vyc/wHAAAKVGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKioKCiAgIHJhaXNlX3N0bXQgOjo9ICJyYWlzZSIgW2V4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl1dXQoKSWYgbm8gZXhwcmVzc2lvbnMgYXJlIHByZXNlbnQsIGBgcmFpc2VgYCByZS1yYWlzZXMgdGhlIGxhc3QgZXhjZXB0aW9uCnRoYXQgd2FzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIElmIG5vIGV4Y2VwdGlvbiBpcyBhY3RpdmUgaW4KdGhlIGN1cnJlbnQgc2NvcGUsIGEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkIGluZGljYXRpbmcgdGhhdAp0aGlzIGlzIGFuIGVycm9yIChpZiBydW5uaW5nIHVuZGVyIElETEUsIGEgYGBRdWV1ZS5FbXB0eWBgIGV4Y2VwdGlvbgppcyByYWlzZWQgaW5zdGVhZCkuCgpPdGhlcndpc2UsIGBgcmFpc2VgYCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb25zIHRvIGdldCB0aHJlZSBvYmplY3RzLAp1c2luZyBgYE5vbmVgYCBhcyB0aGUgdmFsdWUgb2Ygb21pdHRlZCBleHByZXNzaW9ucy4gIFRoZSBmaXJzdCB0d28Kb2JqZWN0cyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlICp0eXBlKiBhbmQgKnZhbHVlKiBvZiB0aGUgZXhjZXB0aW9uLgoKSWYgdGhlIGZpcnN0IG9iamVjdCBpcyBhbiBpbnN0YW5jZSwgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiBpcyB0aGUKY2xhc3Mgb2YgdGhlIGluc3RhbmNlLCB0aGUgaW5zdGFuY2UgaXRzZWxmIGlzIHRoZSB2YWx1ZSwgYW5kIHRoZQpzZWNvbmQgb2JqZWN0IG11c3QgYmUgYGBOb25lYGAuCgpJZiB0aGUgZmlyc3Qgb2JqZWN0IGlzIGEgY2xhc3MsIGl0IGJlY29tZXMgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4KVGhlIHNlY29uZCBvYmplY3QgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGV4Y2VwdGlvbiB2YWx1ZTogSWYgaXQgaXMKYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLCB0aGUgaW5zdGFuY2UgYmVjb21lcyB0aGUgZXhjZXB0aW9uIHZhbHVlLiBJZgp0aGUgc2Vjb25kIG9iamVjdCBpcyBhIHR1cGxlLCBpdCBpcyB1c2VkIGFzIHRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUKY2xhc3MgY29uc3RydWN0b3I7IGlmIGl0IGlzIGBgTm9uZWBgLCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0IGlzIHVzZWQsCmFuZCBhbnkgb3RoZXIgb2JqZWN0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgYXJndW1lbnQgdG8gdGhlCmNvbnN0cnVjdG9yLiAgVGhlIGluc3RhbmNlIHNvIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgY29uc3RydWN0b3IgaXMKdXNlZCBhcyB0aGUgZXhjZXB0aW9uIHZhbHVlLgoKSWYgYSB0aGlyZCBvYmplY3QgaXMgcHJlc2VudCBhbmQgbm90IGBgTm9uZWBgLCBpdCBtdXN0IGJlIGEgdHJhY2ViYWNrCm9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopLCBhbmQgaXQgaXMKc3Vic3RpdHV0ZWQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBhcyB0aGUgcGxhY2Ugd2hlcmUgdGhlCmV4Y2VwdGlvbiBvY2N1cnJlZC4gIElmIHRoZSB0aGlyZCBvYmplY3QgaXMgcHJlc2VudCBhbmQgbm90IGEKdHJhY2ViYWNrIG9iamVjdCBvciBgYE5vbmVgYCwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuClRoZSB0aHJlZS1leHByZXNzaW9uIGZvcm0gb2YgYGByYWlzZWBgIGlzIHVzZWZ1bCB0byByZS1yYWlzZSBhbgpleGNlcHRpb24gdHJhbnNwYXJlbnRseSBpbiBhbiBleGNlcHQgY2xhdXNlLCBidXQgYGByYWlzZWBgIHdpdGggbm8KZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHByZWZlcnJlZCBpZiB0aGUgZXhjZXB0aW9uIHRvIGJlIHJlLXJhaXNlZCB3YXMKdGhlIG1vc3QgcmVjZW50bHkgYWN0aXZlIGV4Y2VwdGlvbiBpbiB0aGUgY3VycmVudCBzY29wZS4KCkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvbgoqRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBoYW5kbGluZyBleGNlcHRpb25zIGlzIGluIHNlY3Rpb24KKlRoZSB0cnkgc3RhdGVtZW50Ki4KdAUAAAByYWlzZXMEAwAAClRoZSBgYHJldHVybmBgIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIHJldHVybl9zdG10IDo6PSAicmV0dXJuIiBbZXhwcmVzc2lvbl9saXN0XQoKYGByZXR1cm5gYCBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGZ1bmN0aW9uCmRlZmluaXRpb24sIG5vdCB3aXRoaW4gYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbi4KCklmIGFuIGV4cHJlc3Npb24gbGlzdCBpcyBwcmVzZW50LCBpdCBpcyBldmFsdWF0ZWQsIGVsc2UgYGBOb25lYGAgaXMKc3Vic3RpdHV0ZWQuCgpgYHJldHVybmBgIGxlYXZlcyB0aGUgY3VycmVudCBmdW5jdGlvbiBjYWxsIHdpdGggdGhlIGV4cHJlc3Npb24gbGlzdAoob3IgYGBOb25lYGApIGFzIHJldHVybiB2YWx1ZS4KCldoZW4gYGByZXR1cm5gYCBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSBgYHRyeWBgIHN0YXRlbWVudCB3aXRoIGEKYGBmaW5hbGx5YGAgY2xhdXNlLCB0aGF0IGBgZmluYWxseWBgIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5CmxlYXZpbmcgdGhlIGZ1bmN0aW9uLgoKSW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24sIHRoZSBgYHJldHVybmBgIHN0YXRlbWVudCBpcyBub3QgYWxsb3dlZCB0bwppbmNsdWRlIGFuIGBgZXhwcmVzc2lvbl9saXN0YGAuICBJbiB0aGF0IGNvbnRleHQsIGEgYmFyZSBgYHJldHVybmBgCmluZGljYXRlcyB0aGF0IHRoZSBnZW5lcmF0b3IgaXMgZG9uZSBhbmQgd2lsbCBjYXVzZSBgYFN0b3BJdGVyYXRpb25gYAp0byBiZSByYWlzZWQuCnQGAAAAcmV0dXJuc5cXAAAKRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlcwoqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLgpDb250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpIG9yIG1hcHBpbmdzCihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZQpmaXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2Ugb3IgdG8KZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsIHRoZQphbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggYGAwIDw9IGsgPCBOYGAKd2hlcmUgKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciBzbGljZSBvYmplY3RzLCB3aGljaApkZWZpbmUgYSByYW5nZSBvZiBpdGVtcy4gKEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIG1ldGhvZApgYF9fZ2V0c2xpY2VfXygpYGAgKHNlZSBiZWxvdykgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBoYW5kbGUgc2ltcGxlLApidXQgbm90IGV4dGVuZGVkIHNsaWNlcy4pIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyBwcm92aWRlCnRoZSBtZXRob2RzIGBga2V5cygpYGAsIGBgdmFsdWVzKClgYCwgYGBpdGVtcygpYGAsIGBgaGFzX2tleSgpYGAsCmBgZ2V0KClgYCwgYGBjbGVhcigpYGAsIGBgc2V0ZGVmYXVsdCgpYGAsIGBgaXRlcmtleXMoKWBgLApgYGl0ZXJ2YWx1ZXMoKWBgLCBgYGl0ZXJpdGVtcygpYGAsIGBgcG9wKClgYCwgYGBwb3BpdGVtKClgYCwKYGBjb3B5KClgYCwgYW5kIGBgdXBkYXRlKClgYCBiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob24ncwpzdGFuZGFyZCBkaWN0aW9uYXJ5IG9iamVjdHMuICBUaGUgYGBVc2VyRGljdGBgIG1vZHVsZSBwcm92aWRlcyBhCmBgRGljdE1peGluYGAgY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YKYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgLCBgYF9fZGVsaXRlbV9fKClgYCwgYW5kCmBga2V5cygpYGAuIE11dGFibGUgc2VxdWVuY2VzIHNob3VsZCBwcm92aWRlIG1ldGhvZHMgYGBhcHBlbmQoKWBgLApgYGNvdW50KClgYCwgYGBpbmRleCgpYGAsIGBgZXh0ZW5kKClgYCwgYGBpbnNlcnQoKWBgLCBgYHBvcCgpYGAsCmBgcmVtb3ZlKClgYCwgYGByZXZlcnNlKClgYCBhbmQgYGBzb3J0KClgYCwgbGlrZSBQeXRob24gc3RhbmRhcmQgbGlzdApvYmplY3RzLiAgRmluYWxseSwgc2VxdWVuY2UgdHlwZXMgc2hvdWxkIGltcGxlbWVudCBhZGRpdGlvbiAobWVhbmluZwpjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmcgcmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlCm1ldGhvZHMgYGBfX2FkZF9fKClgYCwgYGBfX3JhZGRfXygpYGAsIGBgX19pYWRkX18oKWBgLCBgYF9fbXVsX18oKWBgLApgYF9fcm11bF9fKClgYCBhbmQgYGBfX2ltdWxfXygpYGAgZGVzY3JpYmVkIGJlbG93OyB0aGV5IHNob3VsZCBub3QKZGVmaW5lIGBgX19jb2VyY2VfXygpYGAgb3Igb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzCnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUKYGBfX2NvbnRhaW5zX18oKWBgIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSBgYGluYGAKb3BlcmF0b3I7IGZvciBtYXBwaW5ncywgYGBpbmBgIHNob3VsZCBiZSBlcXVpdmFsZW50IG9mIGBgaGFzX2tleSgpYGA7CmZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlcgpyZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlCmBgX19pdGVyX18oKWBgIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlCmNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCBgYF9faXRlcl9fKClgYCBzaG91bGQgYmUgdGhlIHNhbWUgYXMKYGBpdGVya2V5cygpYGA7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBpdGVyYXRlIHRocm91Z2ggdGhlIHZhbHVlcy4KCm9iamVjdC5fX2xlbl9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGAuICBTaG91bGQgcmV0dXJuCiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciBgYD49YGAgMC4gIEFsc28sIGFuIG9iamVjdAogICB0aGF0IGRvZXNuJ3QgZGVmaW5lIGEgYGBfX25vbnplcm9fXygpYGAgbWV0aG9kIGFuZCB3aG9zZQogICBgYF9fbGVuX18oKWBgIG1ldGhvZCByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhCiAgIEJvb2xlYW4gY29udGV4dC4KCm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgYGBzZWxmW2tleV1gYC4gRm9yIHNlcXVlbmNlCiAgIHR5cGVzLCB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuCiAgIE5vdGUgdGhhdCB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUKICAgY2xhc3Mgd2lzaGVzIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUKICAgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLiBJZiAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsCiAgIGBgVHlwZUVycm9yYGAgbWF5IGJlIHJhaXNlZDsgaWYgb2YgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2YKICAgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlIChhZnRlciBhbnkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZgogICBuZWdhdGl2ZSB2YWx1ZXMpLCBgYEluZGV4RXJyb3JgYCBzaG91bGQgYmUgcmFpc2VkLiBGb3IgbWFwcGluZwogICB0eXBlcywgaWYgKmtleSogaXMgbWlzc2luZyAobm90IGluIHRoZSBjb250YWluZXIpLCBgYEtleUVycm9yYGAKICAgc2hvdWxkIGJlIHJhaXNlZC4KCiAgIE5vdGU6IGBgZm9yYGAgbG9vcHMgZXhwZWN0IHRoYXQgYW4gYGBJbmRleEVycm9yYGAgd2lsbCBiZSByYWlzZWQgZm9yCiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGUKICAgICBzZXF1ZW5jZS4KCm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvIGBgc2VsZltrZXldYGAuICBTYW1lIG5vdGUgYXMgZm9yCiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWYKICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzCiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGUKICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IKICAgdGhlIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC4KCm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mIGBgc2VsZltrZXldYGAuICBTYW1lIG5vdGUgYXMgZm9yCiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWYKICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMKICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZQogICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlIGBgX19nZXRpdGVtX18oKWBgCiAgIG1ldGhvZC4KCm9iamVjdC5fX2l0ZXJfXyhzZWxmKQoKICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgY29udGFpbmVyLgogICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBpdGVyYXRlCiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZAogICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lciwgYW5kIHNob3VsZCBhbHNvIGJlIG1hZGUKICAgYXZhaWxhYmxlIGFzIHRoZSBtZXRob2QgYGBpdGVya2V5cygpYGAuCgogICBJdGVyYXRvciBvYmplY3RzIGFsc28gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2Q7IHRoZXkgYXJlCiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3IKICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouCgpvYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpCgogICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSBgYHJldmVyc2VkKClgYCBidWlsdC1pbiB0byBpbXBsZW1lbnQKICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0CiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci4KCiAgIElmIHRoZSBgYF9fcmV2ZXJzZWRfXygpYGAgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlCiAgIGBgcmV2ZXJzZWQoKWBgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZQogICBwcm90b2NvbCAoYGBfX2xlbl9fKClgYCBhbmQgYGBfX2dldGl0ZW1fXygpYGApLiAgT2JqZWN0cyB0aGF0CiAgIHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sIHNob3VsZCBvbmx5IHByb3ZpZGUKICAgYGBfX3JldmVyc2VkX18oKWBgIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBpcwogICBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnkgYGByZXZlcnNlZCgpYGAuCgogICBOZXcgaW4gdmVyc2lvbiAyLjYuCgpUaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoYGBpbmBgIGFuZCBgYG5vdCBpbmBgKSBhcmUgbm9ybWFsbHkKaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsIGNvbnRhaW5lcgpvYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnQKaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuCgpvYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWUKICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpcwogICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvcgogICB0aGUga2V5LWl0ZW0gcGFpcnMuCgogICBGb3Igb2JqZWN0cyB0aGF0IGRvbid0IGRlZmluZSBgYF9fY29udGFpbnNfXygpYGAsIHRoZSBtZW1iZXJzaGlwCiAgIHRlc3QgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSBgYF9faXRlcl9fKClgYCwgdGhlbiB0aGUgb2xkCiAgIHNlcXVlbmNlIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgYGBfX2dldGl0ZW1fXygpYGAsIHNlZSAqdGhpcwogICBzZWN0aW9uIGluIHRoZSBsYW5ndWFnZSByZWZlcmVuY2UqLgpzDgAAAHNlcXVlbmNlLXR5cGVzcyADAAAKU2hpZnRpbmcgb3BlcmF0aW9ucwoqKioqKioqKioqKioqKioqKioqCgpUaGUgc2hpZnRpbmcgb3BlcmF0aW9ucyBoYXZlIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGFyaXRobWV0aWMKb3BlcmF0aW9uczoKCiAgIHNoaWZ0X2V4cHIgOjo9IGFfZXhwciB8IHNoaWZ0X2V4cHIgKCAiPDwiIHwgIj4+IiApIGFfZXhwcgoKVGhlc2Ugb3BlcmF0b3JzIGFjY2VwdCBwbGFpbiBvciBsb25nIGludGVnZXJzIGFzIGFyZ3VtZW50cy4gIFRoZQphcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgVGhleSBzaGlmdCB0aGUgZmlyc3QKYXJndW1lbnQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGJ5IHRoZQpzZWNvbmQgYXJndW1lbnQuCgpBIHJpZ2h0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGRlZmluZWQgYXMgZGl2aXNpb24gYnkgYGBwb3coMiwgbilgYC4gIEEKbGVmdCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIG11bHRpcGxpY2F0aW9uIHdpdGggYGBwb3coMiwKbilgYC4gIE5lZ2F0aXZlIHNoaWZ0IGNvdW50cyByYWlzZSBhIGBgVmFsdWVFcnJvcmBgIGV4Y2VwdGlvbi4KCk5vdGU6IEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzIHJlcXVpcmVkIHRvCiAgYmUgYXQgbW9zdCBgYHN5cy5tYXhzaXplYGAuICBJZiB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzIGxhcmdlcgogIHRoYW4gYGBzeXMubWF4c2l6ZWBgIGFuIGBgT3ZlcmZsb3dFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuCnQIAAAAc2hpZnRpbmdz8goAAApTbGljaW5ncwoqKioqKioqKgoKQSBzbGljaW5nIHNlbGVjdHMgYSByYW5nZSBvZiBpdGVtcyBpbiBhIHNlcXVlbmNlIG9iamVjdCAoZS5nLiwgYQpzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgU2xpY2luZ3MgbWF5IGJlIHVzZWQgYXMgZXhwcmVzc2lvbnMgb3IgYXMKdGFyZ2V0cyBpbiBhc3NpZ25tZW50IG9yIGBgZGVsYGAgc3RhdGVtZW50cy4gIFRoZSBzeW50YXggZm9yIGEKc2xpY2luZzoKCiAgIHNsaWNpbmcgICAgICAgICAgOjo9IHNpbXBsZV9zbGljaW5nIHwgZXh0ZW5kZWRfc2xpY2luZwogICBzaW1wbGVfc2xpY2luZyAgIDo6PSBwcmltYXJ5ICJbIiBzaG9ydF9zbGljZSAiXSIKICAgZXh0ZW5kZWRfc2xpY2luZyA6Oj0gcHJpbWFyeSAiWyIgc2xpY2VfbGlzdCAiXSIKICAgc2xpY2VfbGlzdCAgICAgICA6Oj0gc2xpY2VfaXRlbSAoIiwiIHNsaWNlX2l0ZW0pKiBbIiwiXQogICBzbGljZV9pdGVtICAgICAgIDo6PSBleHByZXNzaW9uIHwgcHJvcGVyX3NsaWNlIHwgZWxsaXBzaXMKICAgcHJvcGVyX3NsaWNlICAgICA6Oj0gc2hvcnRfc2xpY2UgfCBsb25nX3NsaWNlCiAgIHNob3J0X3NsaWNlICAgICAgOjo9IFtsb3dlcl9ib3VuZF0gIjoiIFt1cHBlcl9ib3VuZF0KICAgbG9uZ19zbGljZSAgICAgICA6Oj0gc2hvcnRfc2xpY2UgIjoiIFtzdHJpZGVdCiAgIGxvd2VyX2JvdW5kICAgICAgOjo9IGV4cHJlc3Npb24KICAgdXBwZXJfYm91bmQgICAgICA6Oj0gZXhwcmVzc2lvbgogICBzdHJpZGUgICAgICAgICAgIDo6PSBleHByZXNzaW9uCiAgIGVsbGlwc2lzICAgICAgICAgOjo9ICIuLi4iCgpUaGVyZSBpcyBhbWJpZ3VpdHkgaW4gdGhlIGZvcm1hbCBzeW50YXggaGVyZTogYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlCmFuIGV4cHJlc3Npb24gbGlzdCBhbHNvIGxvb2tzIGxpa2UgYSBzbGljZSBsaXN0LCBzbyBhbnkgc3Vic2NyaXB0aW9uCmNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNsaWNpbmcuICBSYXRoZXIgdGhhbiBmdXJ0aGVyIGNvbXBsaWNhdGluZyB0aGUKc3ludGF4LCB0aGlzIGlzIGRpc2FtYmlndWF0ZWQgYnkgZGVmaW5pbmcgdGhhdCBpbiB0aGlzIGNhc2UgdGhlCmludGVycHJldGF0aW9uIGFzIGEgc3Vic2NyaXB0aW9uIHRha2VzIHByaW9yaXR5IG92ZXIgdGhlCmludGVycHJldGF0aW9uIGFzIGEgc2xpY2luZyAodGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgc2xpY2UgbGlzdApjb250YWlucyBubyBwcm9wZXIgc2xpY2Ugbm9yIGVsbGlwc2VzKS4gIFNpbWlsYXJseSwgd2hlbiB0aGUgc2xpY2UKbGlzdCBoYXMgZXhhY3RseSBvbmUgc2hvcnQgc2xpY2UgYW5kIG5vIHRyYWlsaW5nIGNvbW1hLCB0aGUKaW50ZXJwcmV0YXRpb24gYXMgYSBzaW1wbGUgc2xpY2luZyB0YWtlcyBwcmlvcml0eSBvdmVyIHRoYXQgYXMgYW4KZXh0ZW5kZWQgc2xpY2luZy4KClRoZSBzZW1hbnRpY3MgZm9yIGEgc2ltcGxlIHNsaWNpbmcgYXJlIGFzIGZvbGxvd3MuICBUaGUgcHJpbWFyeSBtdXN0CmV2YWx1YXRlIHRvIGEgc2VxdWVuY2Ugb2JqZWN0LiAgVGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBleHByZXNzaW9ucywKaWYgcHJlc2VudCwgbXVzdCBldmFsdWF0ZSB0byBwbGFpbiBpbnRlZ2VyczsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZQpgYHN5cy5tYXhpbnRgYCwgcmVzcGVjdGl2ZWx5LiAgSWYgZWl0aGVyIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUKc2VxdWVuY2UncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgc2xpY2luZyBub3cgc2VsZWN0cyBhbGwgaXRlbXMKd2l0aCBpbmRleCAqayogc3VjaCB0aGF0IGBgaSA8PSBrIDwgamBgIHdoZXJlICppKiBhbmQgKmoqIGFyZSB0aGUKc3BlY2lmaWVkIGxvd2VyIGFuZCB1cHBlciBib3VuZHMuICBUaGlzIG1heSBiZSBhbiBlbXB0eSBzZXF1ZW5jZS4gIEl0CmlzIG5vdCBhbiBlcnJvciBpZiAqaSogb3IgKmoqIGxpZSBvdXRzaWRlIHRoZSByYW5nZSBvZiB2YWxpZCBpbmRleGVzCihzdWNoIGl0ZW1zIGRvbid0IGV4aXN0IHNvIHRoZXkgYXJlbid0IHNlbGVjdGVkKS4KClRoZSBzZW1hbnRpY3MgZm9yIGFuIGV4dGVuZGVkIHNsaWNpbmcgYXJlIGFzIGZvbGxvd3MuICBUaGUgcHJpbWFyeQptdXN0IGV2YWx1YXRlIHRvIGEgbWFwcGluZyBvYmplY3QsIGFuZCBpdCBpcyBpbmRleGVkIHdpdGggYSBrZXkgdGhhdAppcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzbGljZSBsaXN0LCBhcyBmb2xsb3dzLiAgSWYgdGhlIHNsaWNlIGxpc3QKY29udGFpbnMgYXQgbGVhc3Qgb25lIGNvbW1hLCB0aGUga2V5IGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUKY29udmVyc2lvbiBvZiB0aGUgc2xpY2UgaXRlbXM7IG90aGVyd2lzZSwgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGxvbmUKc2xpY2UgaXRlbSBpcyB0aGUga2V5LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBzbGljZSBpdGVtIHRoYXQgaXMgYW4KZXhwcmVzc2lvbiBpcyB0aGF0IGV4cHJlc3Npb24uICBUaGUgY29udmVyc2lvbiBvZiBhbiBlbGxpcHNpcyBzbGljZQppdGVtIGlzIHRoZSBidWlsdC1pbiBgYEVsbGlwc2lzYGAgb2JqZWN0LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBwcm9wZXIKc2xpY2UgaXMgYSBzbGljZSBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKQp3aG9zZSBgYHN0YXJ0YGAsIGBgc3RvcGBgIGFuZCBgYHN0ZXBgYCBhdHRyaWJ1dGVzIGFyZSB0aGUgdmFsdWVzIG9mCnRoZSBleHByZXNzaW9ucyBnaXZlbiBhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kIHN0cmlkZSwKcmVzcGVjdGl2ZWx5LCBzdWJzdGl0dXRpbmcgYGBOb25lYGAgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbnMuCnQIAAAAc2xpY2luZ3NzzAkAAApTcGVjaWFsIEF0dHJpYnV0ZXMKKioqKioqKioqKioqKioqKioqCgpUaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzIHRvIHNldmVyYWwKb2JqZWN0IHR5cGVzLCB3aGVyZSB0aGV5IGFyZSByZWxldmFudC4gIFNvbWUgb2YgdGhlc2UgYXJlIG5vdCByZXBvcnRlZApieSB0aGUgYGBkaXIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uLgoKb2JqZWN0Ll9fZGljdF9fCgogICBBIGRpY3Rpb25hcnkgb3Igb3RoZXIgbWFwcGluZyBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBvYmplY3QncwogICAod3JpdGFibGUpIGF0dHJpYnV0ZXMuCgpvYmplY3QuX19tZXRob2RzX18KCiAgIERlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjI6IFVzZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBkaXIoKWBgCiAgIHRvIGdldCBhIGxpc3Qgb2YgYW4gb2JqZWN0J3MgYXR0cmlidXRlcy4gVGhpcyBhdHRyaWJ1dGUgaXMgbm8KICAgbG9uZ2VyIGF2YWlsYWJsZS4KCm9iamVjdC5fX21lbWJlcnNfXwoKICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMjogVXNlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGRpcigpYGAKICAgdG8gZ2V0IGEgbGlzdCBvZiBhbiBvYmplY3QncyBhdHRyaWJ1dGVzLiBUaGlzIGF0dHJpYnV0ZSBpcyBubwogICBsb25nZXIgYXZhaWxhYmxlLgoKaW5zdGFuY2UuX19jbGFzc19fCgogICBUaGUgY2xhc3MgdG8gd2hpY2ggYSBjbGFzcyBpbnN0YW5jZSBiZWxvbmdzLgoKY2xhc3MuX19iYXNlc19fCgogICBUaGUgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIG9mIGEgY2xhc3Mgb2JqZWN0LgoKY2xhc3MuX19uYW1lX18KCiAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvciB0eXBlLgoKVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBvbmx5IHN1cHBvcnRlZCBieSAqbmV3LXN0eWxlIGNsYXNzKmVzLgoKY2xhc3MuX19tcm9fXwoKICAgVGhpcyBhdHRyaWJ1dGUgaXMgYSB0dXBsZSBvZiBjbGFzc2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgd2hlbgogICBsb29raW5nIGZvciBiYXNlIGNsYXNzZXMgZHVyaW5nIG1ldGhvZCByZXNvbHV0aW9uLgoKY2xhc3MubXJvKCkKCiAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgbWV0YWNsYXNzIHRvIGN1c3RvbWl6ZSB0aGUKICAgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgZm9yIGl0cyBpbnN0YW5jZXMuICBJdCBpcyBjYWxsZWQgYXQgY2xhc3MKICAgaW5zdGFudGlhdGlvbiwgYW5kIGl0cyByZXN1bHQgaXMgc3RvcmVkIGluIGBgX19tcm9fX2BgLgoKY2xhc3MuX19zdWJjbGFzc2VzX18oKQoKICAgRWFjaCBuZXctc3R5bGUgY2xhc3Mga2VlcHMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBpdHMKICAgaW1tZWRpYXRlIHN1YmNsYXNzZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2UKICAgcmVmZXJlbmNlcyBzdGlsbCBhbGl2ZS4gRXhhbXBsZToKCiAgICAgID4+PiBpbnQuX19zdWJjbGFzc2VzX18oKQogICAgICBbPHR5cGUgJ2Jvb2wnPl0KCi1bIEZvb3Rub3RlcyBdLQoKWzFdIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlc2Ugc3BlY2lhbCBtZXRob2RzIG1heSBiZSBmb3VuZCBpbgogICAgdGhlIFB5dGhvbiBSZWZlcmVuY2UgTWFudWFsICgqQmFzaWMgY3VzdG9taXphdGlvbiopLgoKWzJdIEFzIGEgY29uc2VxdWVuY2UsIHRoZSBsaXN0IGBgWzEsIDJdYGAgaXMgY29uc2lkZXJlZCBlcXVhbCB0bwogICAgYGBbMS4wLCAyLjBdYGAsIGFuZCBzaW1pbGFybHkgZm9yIHR1cGxlcy4KClszXSBUaGV5IG11c3QgaGF2ZSBzaW5jZSB0aGUgcGFyc2VyIGNhbid0IHRlbGwgdGhlIHR5cGUgb2YgdGhlCiAgICBvcGVyYW5kcy4KCls0XSBDYXNlZCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoIGdlbmVyYWwgY2F0ZWdvcnkgcHJvcGVydHkgYmVpbmcKICAgIG9uZSBvZiAiTHUiIChMZXR0ZXIsIHVwcGVyY2FzZSksICJMbCIgKExldHRlciwgbG93ZXJjYXNlKSwgb3IgIkx0IgogICAgKExldHRlciwgdGl0bGVjYXNlKS4KCls1XSBUbyBmb3JtYXQgb25seSBhIHR1cGxlIHlvdSBzaG91bGQgdGhlcmVmb3JlIHByb3ZpZGUgYSBzaW5nbGV0b24KICAgIHR1cGxlIHdob3NlIG9ubHkgZWxlbWVudCBpcyB0aGUgdHVwbGUgdG8gYmUgZm9ybWF0dGVkLgoKWzZdIFRoZSBhZHZhbnRhZ2Ugb2YgbGVhdmluZyB0aGUgbmV3bGluZSBvbiBpcyB0aGF0IHJldHVybmluZyBhbiBlbXB0eQogICAgc3RyaW5nIGlzIHRoZW4gYW4gdW5hbWJpZ3VvdXMgRU9GIGluZGljYXRpb24uICBJdCBpcyBhbHNvIHBvc3NpYmxlCiAgICAoaW4gY2FzZXMgd2hlcmUgaXQgbWlnaHQgbWF0dGVyLCBmb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gbWFrZQogICAgYW4gZXhhY3QgY29weSBvZiBhIGZpbGUgd2hpbGUgc2Nhbm5pbmcgaXRzIGxpbmVzKSB0byB0ZWxsIHdoZXRoZXIKICAgIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIGVuZGVkIGluIGEgbmV3bGluZSBvciBub3QgKHllcyB0aGlzCiAgICBoYXBwZW5zISkuCnQMAAAAc3BlY2lhbGF0dHJzc6DRAAAKU3BlY2lhbCBtZXRob2QgbmFtZXMKKioqKioqKioqKioqKioqKioqKioKCkEgY2xhc3MgY2FuIGltcGxlbWVudCBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW52b2tlZCBieSBzcGVjaWFsCnN5bnRheCAoc3VjaCBhcyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb3Igc3Vic2NyaXB0aW5nIGFuZCBzbGljaW5nKSBieQpkZWZpbmluZyBtZXRob2RzIHdpdGggc3BlY2lhbCBuYW1lcy4gVGhpcyBpcyBQeXRob24ncyBhcHByb2FjaCB0bwoqb3BlcmF0b3Igb3ZlcmxvYWRpbmcqLCBhbGxvd2luZyBjbGFzc2VzIHRvIGRlZmluZSB0aGVpciBvd24gYmVoYXZpb3IKd2l0aCByZXNwZWN0IHRvIGxhbmd1YWdlIG9wZXJhdG9ycy4gIEZvciBpbnN0YW5jZSwgaWYgYSBjbGFzcyBkZWZpbmVzCmEgbWV0aG9kIG5hbWVkIGBgX19nZXRpdGVtX18oKWBgLCBhbmQgYGB4YGAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhpcwpjbGFzcywgdGhlbiBgYHhbaV1gYCBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gYGB4Ll9fZ2V0aXRlbV9fKGkpYGAgZm9yCm9sZC1zdHlsZSBjbGFzc2VzIGFuZCBgYHR5cGUoeCkuX19nZXRpdGVtX18oeCwgaSlgYCBmb3IgbmV3LXN0eWxlCmNsYXNzZXMuICBFeGNlcHQgd2hlcmUgbWVudGlvbmVkLCBhdHRlbXB0cyB0byBleGVjdXRlIGFuIG9wZXJhdGlvbgpyYWlzZSBhbiBleGNlcHRpb24gd2hlbiBubyBhcHByb3ByaWF0ZSBtZXRob2QgaXMgZGVmaW5lZCAodHlwaWNhbGx5CmBgQXR0cmlidXRlRXJyb3JgYCBvciBgYFR5cGVFcnJvcmBgKS4KCldoZW4gaW1wbGVtZW50aW5nIGEgY2xhc3MgdGhhdCBlbXVsYXRlcyBhbnkgYnVpbHQtaW4gdHlwZSwgaXQgaXMKaW1wb3J0YW50IHRoYXQgdGhlIGVtdWxhdGlvbiBvbmx5IGJlIGltcGxlbWVudGVkIHRvIHRoZSBkZWdyZWUgdGhhdCBpdAptYWtlcyBzZW5zZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lCnNlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsIG9mIGluZGl2aWR1YWwgZWxlbWVudHMsIGJ1dApleHRyYWN0aW5nIGEgc2xpY2UgbWF5IG5vdCBtYWtlIHNlbnNlLiAgKE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgdGhlCmBgTm9kZUxpc3RgYCBpbnRlcmZhY2UgaW4gdGhlIFczQydzIERvY3VtZW50IE9iamVjdCBNb2RlbC4pCgoKQmFzaWMgY3VzdG9taXphdGlvbgo9PT09PT09PT09PT09PT09PT09CgpvYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKQoKICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gIGBgX19uZXdfXygpYGAgaXMgYQogICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpCiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzCiAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGUKICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuCiAgIHZhbHVlIG9mIGBgX19uZXdfXygpYGAgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5CiAgIGFuIGluc3RhbmNlIG9mICpjbHMqKS4KCiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnkKICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3MncyBgYF9fbmV3X18oKWBgIG1ldGhvZCB1c2luZwogICBgYHN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pYGAgd2l0aCBhcHByb3ByaWF0ZQogICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlIGFzCiAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LgoKICAgSWYgYGBfX25ld19fKClgYCByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXcKICAgaW5zdGFuY2UncyBgYF9faW5pdF9fKClgYCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2UKICAgYGBfX2luaXRfXyhzZWxmWywgLi4uXSlgYCwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgaW5zdGFuY2UgYW5kIHRoZQogICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byBgYF9fbmV3X18oKWBgLgoKICAgSWYgYGBfX25ld19fKClgYCBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ldwogICBpbnN0YW5jZSdzIGBgX19pbml0X18oKWBgIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLgoKICAgYGBfX25ld19fKClgYCBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiBpbW11dGFibGUKICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdAogICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvCiAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi4KCm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSkKCiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBjcmVhdGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2UKICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhbgogICBgYF9faW5pdF9fKClgYCBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNzJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kLAogICBpZiBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YKICAgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOgogICBgYEJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pYGAuICBBcyBhIHNwZWNpYWwgY29uc3RyYWludAogICBvbiBjb25zdHJ1Y3RvcnMsIG5vIHZhbHVlIG1heSBiZSByZXR1cm5lZDsgZG9pbmcgc28gd2lsbCBjYXVzZSBhCiAgIGBgVHlwZUVycm9yYGAgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuCgpvYmplY3QuX19kZWxfXyhzZWxmKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzbwogICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhIGBgX19kZWxfXygpYGAgbWV0aG9kLAogICB0aGUgZGVyaXZlZCBjbGFzcydzIGBgX19kZWxfXygpYGAgbWV0aG9kLCBpZiBhbnksIG11c3QgZXhwbGljaXRseQogICBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUKICAgaW5zdGFuY2UuICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IKICAgdGhlIGBgX19kZWxfXygpYGAgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieQogICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlcgogICB0aW1lIHdoZW4gdGhpcyBuZXcgcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0CiAgIGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlbgogICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuCgogICBOb3RlOiBgYGRlbCB4YGAgZG9lc24ndCBkaXJlY3RseSBjYWxsIGBgeC5fX2RlbF9fKClgYCAtLS0gdGhlIGZvcm1lcgogICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgYGB4YGAgYnkgb25lLCBhbmQgdGhlIGxhdHRlcgogICAgIGlzIG9ubHkgY2FsbGVkIHdoZW4gYGB4YGAncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgU29tZQogICAgIGNvbW1vbiBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbgogICAgIG9iamVjdCBmcm9tIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuCiAgICAgb2JqZWN0cyAoZS5nLiwgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGgKICAgICBwYXJlbnQgYW5kIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUKICAgICBzdGFjayBmcmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFjawogICAgIHN0b3JlZCBpbiBgYHN5cy5leGNfdHJhY2ViYWNrYGAga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IKICAgICBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSB0aGF0IHJhaXNlZCBhbgogICAgIHVuaGFuZGxlZCBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW4KICAgICBgYHN5cy5sYXN0X3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgZmlyc3QKICAgICBzaXR1YXRpb24gY2FuIG9ubHkgYmUgcmVtZWRpZWQgYnkgZXhwbGljaXRseSBicmVha2luZyB0aGUgY3ljbGVzOwogICAgIHRoZSBsYXR0ZXIgdHdvIHNpdHVhdGlvbnMgY2FuIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgYGBOb25lYGAgaW4KICAgICBgYHN5cy5leGNfdHJhY2ViYWNrYGAgb3IgYGBzeXMubGFzdF90cmFjZWJhY2tgYC4gIENpcmN1bGFyCiAgICAgcmVmZXJlbmNlcyB3aGljaCBhcmUgZ2FyYmFnZSBhcmUgZGV0ZWN0ZWQgd2hlbiB0aGUgb3B0aW9uIGN5Y2xlCiAgICAgZGV0ZWN0b3IgaXMgZW5hYmxlZCAoaXQncyBvbiBieSBkZWZhdWx0KSwgYnV0IGNhbiBvbmx5IGJlIGNsZWFuZWQKICAgICB1cCBpZiB0aGVyZSBhcmUgbm8gUHl0aG9uLWxldmVsIGBgX19kZWxfXygpYGAgbWV0aG9kcyBpbnZvbHZlZC4KICAgICBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGBgZ2NgYCBtb2R1bGUgZm9yIG1vcmUKICAgICBpbmZvcm1hdGlvbiBhYm91dCBob3cgYGBfX2RlbF9fKClgYCBtZXRob2RzIGFyZSBoYW5kbGVkIGJ5IHRoZQogICAgIGN5Y2xlIGRldGVjdG9yLCBwYXJ0aWN1bGFybHkgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYGdhcmJhZ2VgYAogICAgIHZhbHVlLgoKICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggYGBfX2RlbF9fKClgYAogICAgIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlaXIgZXhlY3V0aW9uCiAgICAgYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0byBgYHN5cy5zdGRlcnJgYCBpbnN0ZWFkLgogICAgIEFsc28sIHdoZW4gYGBfX2RlbF9fKClgYCBpcyBpbnZva2VkIGluIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nCiAgICAgZGVsZXRlZCAoZS5nLiwgd2hlbiBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0gaXMgZG9uZSksIG90aGVyCiAgICAgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlCiAgICAgYmVlbiBkZWxldGVkIG9yIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHRvcm4gZG93biAoZS5nLiB0aGUKICAgICBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgRm9yIHRoaXMgcmVhc29uLCBgYF9fZGVsX18oKWBgCiAgICAgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlIG1pbmltdW0gbmVlZGVkIHRvIG1haW50YWluCiAgICAgZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjUsIFB5dGhvbgogICAgIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGUKICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciBnbG9iYWxzIGFyZQogICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCB0aGlzIG1heQogICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlCiAgICAgdGltZSB3aGVuIHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCBpcyBjYWxsZWQuCgogICBTZWUgYWxzbyB0aGUgKi1SKiBjb21tYW5kLWxpbmUgb3B0aW9uLgoKb2JqZWN0Ll9fcmVwcl9fKHNlbGYpCgogICBDYWxsZWQgYnkgdGhlIGBgcmVwcigpYGAgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHN0cmluZwogICBjb252ZXJzaW9ucyAocmV2ZXJzZSBxdW90ZXMpIHRvIGNvbXB1dGUgdGhlICJvZmZpY2lhbCIgc3RyaW5nCiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpcyBzaG91bGQgbG9vawogICBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIGFuCiAgIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCkuICBJZgogICB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm0gYGA8Li4uc29tZSB1c2VmdWwKICAgZGVzY3JpcHRpb24uLi4+YGAgc2hvdWxkIGJlIHJldHVybmVkLiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEKICAgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzIGBgX19yZXByX18oKWBgIGJ1dCBub3QKICAgYGBfX3N0cl9fKClgYCwgdGhlbiBgYF9fcmVwcl9fKClgYCBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiCiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC4KCiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlCiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLgoKb2JqZWN0Ll9fc3RyX18oc2VsZikKCiAgIENhbGxlZCBieSB0aGUgYGBzdHIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieSB0aGUgYGBwcmludGBgCiAgIHN0YXRlbWVudCB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbgogICBvYmplY3QuICBUaGlzIGRpZmZlcnMgZnJvbSBgYF9fcmVwcl9fKClgYCBpbiB0aGF0IGl0IGRvZXMgbm90IGhhdmUKICAgdG8gYmUgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbjogYSBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZQogICByZXByZXNlbnRhdGlvbiBtYXkgYmUgdXNlZCBpbnN0ZWFkLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYQogICBzdHJpbmcgb2JqZWN0LgoKb2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fZXFfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fZ2VfXyhzZWxmLCBvdGhlcikKCiAgIE5ldyBpbiB2ZXJzaW9uIDIuMS4KCiAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMsIGFuZCBhcmUgY2FsbGVkCiAgIGZvciBjb21wYXJpc29uIG9wZXJhdG9ycyBpbiBwcmVmZXJlbmNlIHRvIGBgX19jbXBfXygpYGAgYmVsb3cuIFRoZQogICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyBpcyBhcwogICBmb2xsb3dzOiBgYHg8eWBgIGNhbGxzIGBgeC5fX2x0X18oeSlgYCwgYGB4PD15YGAgY2FsbHMKICAgYGB4Ll9fbGVfXyh5KWBgLCBgYHg9PXlgYCBjYWxscyBgYHguX19lcV9fKHkpYGAsIGBgeCE9eWBgIGFuZAogICBgYHg8PnlgYCBjYWxsIGBgeC5fX25lX18oeSlgYCwgYGB4PnlgYCBjYWxscyBgYHguX19ndF9fKHkpYGAsIGFuZAogICBgYHg+PXlgYCBjYWxscyBgYHguX19nZV9fKHkpYGAuCgogICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uCiAgIGBgTm90SW1wbGVtZW50ZWRgYCBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYQogICBnaXZlbiBwYWlyIG9mIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgYGBGYWxzZWBgIGFuZCBgYFRydWVgYCBhcmUKICAgcmV0dXJuZWQgZm9yIGEgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhbgogICByZXR1cm4gYW55IHZhbHVlLCBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEKICAgQm9vbGVhbiBjb250ZXh0IChlLmcuLCBpbiB0aGUgY29uZGl0aW9uIG9mIGFuIGBgaWZgYCBzdGF0ZW1lbnQpLAogICBQeXRob24gd2lsbCBjYWxsIGBgYm9vbCgpYGAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0CiAgIGlzIHRydWUgb3IgZmFsc2UuCgogICBUaGVyZSBhcmUgbm8gaW1wbGllZCByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycy4KICAgVGhlIHRydXRoIG9mIGBgeD09eWBgIGRvZXMgbm90IGltcGx5IHRoYXQgYGB4IT15YGAgaXMgZmFsc2UuCiAgIEFjY29yZGluZ2x5LCB3aGVuIGRlZmluaW5nIGBgX19lcV9fKClgYCwgb25lIHNob3VsZCBhbHNvIGRlZmluZQogICBgYF9fbmVfXygpYGAgc28gdGhhdCB0aGUgb3BlcmF0b3JzIHdpbGwgYmVoYXZlIGFzIGV4cGVjdGVkLiAgU2VlCiAgIHRoZSBwYXJhZ3JhcGggb24gYGBfX2hhc2hfXygpYGAgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uCiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uCiAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLgoKICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZAogICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiBidXQgdGhlIHJpZ2h0CiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsIGBgX19sdF9fKClgYCBhbmQgYGBfX2d0X18oKWBgIGFyZSBlYWNoCiAgIG90aGVyJ3MgcmVmbGVjdGlvbiwgYGBfX2xlX18oKWBgIGFuZCBgYF9fZ2VfXygpYGAgYXJlIGVhY2ggb3RoZXIncwogICByZWZsZWN0aW9uLCBhbmQgYGBfX2VxX18oKWBgIGFuZCBgYF9fbmVfXygpYGAgYXJlIHRoZWlyIG93bgogICByZWZsZWN0aW9uLgoKICAgQXJndW1lbnRzIHRvIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzIGFyZSBuZXZlciBjb2VyY2VkLgoKICAgVG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdAogICBvcGVyYXRpb24sIHNlZSBgYGZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpYGAuCgpvYmplY3QuX19jbXBfXyhzZWxmLCBvdGhlcikKCiAgIENhbGxlZCBieSBjb21wYXJpc29uIG9wZXJhdGlvbnMgaWYgcmljaCBjb21wYXJpc29uIChzZWUgYWJvdmUpIGlzCiAgIG5vdCBkZWZpbmVkLiAgU2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYGBzZWxmIDwgb3RoZXJgYCwKICAgemVybyBpZiBgYHNlbGYgPT0gb3RoZXJgYCwgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIGBgc2VsZiA+IG90aGVyYGAuCiAgIElmIG5vIGBgX19jbXBfXygpYGAsIGBgX19lcV9fKClgYCBvciBgYF9fbmVfXygpYGAgb3BlcmF0aW9uIGlzCiAgIGRlZmluZWQsIGNsYXNzIGluc3RhbmNlcyBhcmUgY29tcGFyZWQgYnkgb2JqZWN0IGlkZW50aXR5CiAgICgiYWRkcmVzcyIpLiAgU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIGBgX19oYXNoX18oKWBgIGZvciBzb21lCiAgIGltcG9ydGFudCBub3RlcyBvbiBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20KICAgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4gKE5vdGU6IHRoZQogICByZXN0cmljdGlvbiB0aGF0IGV4Y2VwdGlvbnMgYXJlIG5vdCBwcm9wYWdhdGVkIGJ5IGBgX19jbXBfXygpYGAgaGFzCiAgIGJlZW4gcmVtb3ZlZCBzaW5jZSBQeXRob24gMS41LikKCm9iamVjdC5fX3JjbXBfXyhzZWxmLCBvdGhlcikKCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjE6IE5vIGxvbmdlciBzdXBwb3J0ZWQuCgpvYmplY3QuX19oYXNoX18oc2VsZikKCiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiBgYGhhc2goKWBgIGFuZCBmb3Igb3BlcmF0aW9ucyBvbgogICBtZW1iZXJzIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgYGBzZXRgYCwgYGBmcm96ZW5zZXRgYCwgYW5kCiAgIGBgZGljdGBgLiAgYGBfX2hhc2hfXygpYGAgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHkKICAgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZQogICBoYXNoIHZhbHVlOyBpdCBpcyBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nCiAgIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQKICAgYWxzbyBwbGF5IGEgcGFydCBpbiBjb21wYXJpc29uIG9mIG9iamVjdHMuCgogICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIG1ldGhvZAogICBpdCBzaG91bGQgbm90IGRlZmluZSBhIGBgX19oYXNoX18oKWBgIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0CiAgIGRlZmluZXMgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgYnV0IG5vdCBgYF9faGFzaF9fKClgYCwgaXRzCiAgIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgaW4gaGFzaGVkIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcwogICBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmQgaW1wbGVtZW50cyBhIGBgX19jbXBfXygpYGAgb3IKICAgYGBfX2VxX18oKWBgIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnQgYGBfX2hhc2hfXygpYGAsIHNpbmNlCiAgIGhhc2hhYmxlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIHJlcXVpcmUgdGhhdCBhIG9iamVjdCdzIGhhc2gKICAgdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0J3MgaGFzaCB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlCiAgIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuCgogICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlIGBgX19jbXBfXygpYGAgYW5kIGBgX19oYXNoX18oKWBgIG1ldGhvZHMKICAgYnkgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoCiAgIHRoZW1zZWx2ZXMpIGFuZCBgYHguX19oYXNoX18oKWBgIHJldHVybnMgYGBpZCh4KWBgLgoKICAgQ2xhc3NlcyB3aGljaCBpbmhlcml0IGEgYGBfX2hhc2hfXygpYGAgbWV0aG9kIGZyb20gYSBwYXJlbnQgY2xhc3MKICAgYnV0IGNoYW5nZSB0aGUgbWVhbmluZyBvZiBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBzdWNoIHRoYXQKICAgdGhlIGhhc2ggdmFsdWUgcmV0dXJuZWQgaXMgbm8gbG9uZ2VyIGFwcHJvcHJpYXRlIChlLmcuIGJ5IHN3aXRjaGluZwogICB0byBhIHZhbHVlLWJhc2VkIGNvbmNlcHQgb2YgZXF1YWxpdHkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdAogICBpZGVudGl0eSBiYXNlZCBlcXVhbGl0eSkgY2FuIGV4cGxpY2l0bHkgZmxhZyB0aGVtc2VsdmVzIGFzIGJlaW5nCiAgIHVuaGFzaGFibGUgYnkgc2V0dGluZyBgYF9faGFzaF9fID0gTm9uZWBgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLgogICBEb2luZyBzbyBtZWFucyB0aGF0IG5vdCBvbmx5IHdpbGwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyByYWlzZSBhbgogICBhcHByb3ByaWF0ZSBgYFR5cGVFcnJvcmBgIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZWlyCiAgIGhhc2ggdmFsdWUsIGJ1dCB0aGV5IHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhcwogICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgYGBpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpYGAKICAgKHVubGlrZSBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGVpciBvd24gYGBfX2hhc2hfXygpYGAgdG8gZXhwbGljaXRseQogICByYWlzZSBgYFR5cGVFcnJvcmBgKS4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IGBgX19oYXNoX18oKWBgIG1heSBub3cgYWxzbyByZXR1cm4gYSBsb25nCiAgIGludGVnZXIgb2JqZWN0OyB0aGUgMzItYml0IGludGVnZXIgaXMgdGhlbiBkZXJpdmVkIGZyb20gdGhlIGhhc2ggb2YKICAgdGhhdCBvYmplY3QuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi42OiBgYF9faGFzaF9fYGAgbWF5IG5vdyBiZSBzZXQgdG8gYGBOb25lYGAgdG8KICAgZXhwbGljaXRseSBmbGFnIGluc3RhbmNlcyBvZiBhIGNsYXNzIGFzIHVuaGFzaGFibGUuCgpvYmplY3QuX19ub256ZXJvX18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvbgogICBgYGJvb2woKWBgOyBzaG91bGQgcmV0dXJuIGBgRmFsc2VgYCBvciBgYFRydWVgYCwgb3IgdGhlaXIgaW50ZWdlcgogICBlcXVpdmFsZW50cyBgYDBgYCBvciBgYDFgYC4gIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsCiAgIGBgX19sZW5fXygpYGAgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpcwogICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiBJZiBhIGNsYXNzIGRlZmluZXMKICAgbmVpdGhlciBgYF9fbGVuX18oKWBgIG5vciBgYF9fbm9uemVyb19fKClgYCwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlCiAgIGNvbnNpZGVyZWQgdHJ1ZS4KCm9iamVjdC5fX3VuaWNvZGVfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYHVuaWNvZGUoKWBgIGJ1aWx0LWluOyBzaG91bGQgcmV0dXJuIGEgVW5pY29kZQogICBvYmplY3QuIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsIHN0cmluZyBjb252ZXJzaW9uIGlzCiAgIGF0dGVtcHRlZCwgYW5kIHRoZSByZXN1bHQgb2Ygc3RyaW5nIGNvbnZlcnNpb24gaXMgY29udmVydGVkIHRvCiAgIFVuaWNvZGUgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nLgoKCkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZgphdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mIGBgeC5uYW1lYGApCmZvciBjbGFzcyBpbnN0YW5jZXMuCgpvYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSkKCiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZQogICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgaXQgZm91bmQKICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yIGBgc2VsZmBgKS4gIGBgbmFtZWBgIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS4KICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UKICAgYW4gYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi4KCiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sCiAgIGBgX19nZXRhdHRyX18oKWBgIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBhc3ltbWV0cnkKICAgYmV0d2VlbiBgYF9fZ2V0YXR0cl9fKClgYCBhbmQgYGBfX3NldGF0dHJfXygpYGAuKSBUaGlzIGlzIGRvbmUgYm90aAogICBmb3IgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSBgYF9fZ2V0YXR0cl9fKClgYAogICB3b3VsZCBoYXZlIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlCiAgIHRoYXQgYXQgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnkKICAgbm90IGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0CiAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZQogICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsCiAgIGNvbnRyb2wgaW4gbmV3LXN0eWxlIGNsYXNzZXMuCgpvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpCgogICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZAogICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGUKICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZQogICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC4KCiAgIElmIGBgX19zZXRhdHRyX18oKWBgIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0CiAgIHNob3VsZCBub3Qgc2ltcGx5IGV4ZWN1dGUgYGBzZWxmLm5hbWUgPSB2YWx1ZWBgIC0tLSB0aGlzIHdvdWxkCiAgIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwgdG8gaXRzZWxmLiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluc2VydCB0aGUKICAgdmFsdWUgaW4gdGhlIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgYXR0cmlidXRlcywgZS5nLiwKICAgYGBzZWxmLl9fZGljdF9fW25hbWVdID0gdmFsdWVgYC4gIEZvciBuZXctc3R5bGUgY2xhc3NlcywgcmF0aGVyCiAgIHRoYW4gYWNjZXNzaW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5LCBpdCBzaG91bGQgY2FsbCB0aGUgYmFzZQogICBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSwKICAgYGBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpYGAuCgpvYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSkKCiAgIExpa2UgYGBfX3NldGF0dHJfXygpYGAgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZgogICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiBgYGRlbCBvYmoubmFtZWBgIGlzCiAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuCgoKTW9yZSBhdHRyaWJ1dGUgYWNjZXNzIGZvciBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB0byBuZXctc3R5bGUgY2xhc3Nlcy4KCm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCgogICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yCiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMKICAgYGBfX2dldGF0dHJfXygpYGAsIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcwogICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIGVpdGhlciBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbgogICBgYEF0dHJpYnV0ZUVycm9yYGAuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkKICAgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb24uIEluIG9yZGVyCiAgIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpbiB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uCiAgIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvCiAgIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCBuZWVkcywgZm9yIGV4YW1wbGUsCiAgIGBgb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlgYC4KCiAgIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzCiAgICAgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXggb3IKICAgICBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGUKICAgICBjbGFzc2VzKi4KCgpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcwpjb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhbgoqb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXIncyBjbGFzcwpkaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlCmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcwp0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3MnIGBgX19kaWN0X19gYC4KCm9iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcikKCiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZQogICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZQogICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICppbnN0YW5jZSogaXMgdGhlCiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgYGBOb25lYGAgd2hlbgogICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzIG1ldGhvZCBzaG91bGQKICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbgogICBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLgoKb2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKQoKICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlIG93bmVyCiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLgoKb2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpCgogICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUKICAgb3duZXIgY2xhc3MuCgoKSW52b2tpbmcgRGVzY3JpcHRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggImJpbmRpbmcKYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHMKaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgLCBhbmQKYGBfX2RlbGV0ZV9fKClgYC4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuIG9iamVjdCwKaXQgaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuCgpUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgZGVsZXRlCnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3QncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsIGBgYS54YGAgaGFzIGEKbG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggYGBhLl9fZGljdF9fWyd4J11gYCwgdGhlbgpgYHR5cGUoYSkuX19kaWN0X19bJ3gnXWBgLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2YKYGB0eXBlKGEpYGAgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLgoKSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZQpkZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQKaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlCnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZApob3cgdGhleSB3ZXJlIGNhbGxlZC4gIE5vdGUgdGhhdCBkZXNjcmlwdG9ycyBhcmUgb25seSBpbnZva2VkIGZvciBuZXcKc3R5bGUgb2JqZWN0cyBvciBjbGFzc2VzIChvbmVzIHRoYXQgc3ViY2xhc3MgYGBvYmplY3QoKWBgIG9yCmBgdHlwZSgpYGApLgoKVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCBgYGEueGBgLgpIb3cgdGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gYGBhYGA6CgpEaXJlY3QgQ2FsbAogICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5CiAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgYGB4Ll9fZ2V0X18oYSlgYC4KCkluc3RhbmNlIEJpbmRpbmcKICAgSWYgYmluZGluZyB0byBhIG5ldy1zdHlsZSBvYmplY3QgaW5zdGFuY2UsIGBgYS54YGAgaXMgdHJhbnNmb3JtZWQKICAgaW50byB0aGUgY2FsbDogYGB0eXBlKGEpLl9fZGljdF9fWyd4J10uX19nZXRfXyhhLCB0eXBlKGEpKWBgLgoKQ2xhc3MgQmluZGluZwogICBJZiBiaW5kaW5nIHRvIGEgbmV3LXN0eWxlIGNsYXNzLCBgYEEueGBgIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlCiAgIGNhbGw6IGBgQS5fX2RpY3RfX1sneCddLl9fZ2V0X18oTm9uZSwgQSlgYC4KClN1cGVyIEJpbmRpbmcKICAgSWYgYGBhYGAgaXMgYW4gaW5zdGFuY2Ugb2YgYGBzdXBlcmBgLCB0aGVuIHRoZSBiaW5kaW5nIGBgc3VwZXIoQiwKICAgb2JqKS5tKClgYCBzZWFyY2hlcyBgYG9iai5fX2NsYXNzX18uX19tcm9fX2BgIGZvciB0aGUgYmFzZSBjbGFzcwogICBgYEFgYCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYGBCYGAgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvcgogICB3aXRoIHRoZSBjYWxsOiBgYEEuX19kaWN0X19bJ20nXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXylgYC4KCkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHMKb24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lCmFueSBjb21iaW5hdGlvbiBvZiBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgIGFuZCBgYF9fZGVsZXRlX18oKWBgLgpJZiBpdCBkb2VzIG5vdCBkZWZpbmUgYGBfX2dldF9fKClgYCwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsCnJldHVybiB0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZQpvYmplY3QncyBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyBgYF9fc2V0X18oKWBgCmFuZC9vciBgYF9fZGVsZXRlX18oKWBgLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lcwpuZWl0aGVyLCBpdCBpcyBhIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9ycwpkZWZpbmUgYm90aCBgYF9fZ2V0X18oKWBgIGFuZCBgYF9fc2V0X18oKWBgLCB3aGlsZSBub24tZGF0YQpkZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlIGBgX19nZXRfXygpYGAgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoCmBgX19zZXRfXygpYGAgYW5kIGBgX19nZXRfXygpYGAgZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb24KaW4gYW4gaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluIGNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmUKb3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuCgpQeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nIGBgc3RhdGljbWV0aG9kKClgYCBhbmQgYGBjbGFzc21ldGhvZCgpYGApCmFyZSBpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuCnJlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCBpbnN0YW5jZXMgdG8KYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuCgpUaGUgYGBwcm9wZXJ0eSgpYGAgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuCkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LgoKCl9fc2xvdHNfXwotLS0tLS0tLS0KCkJ5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBib3RoIG9sZCBhbmQgbmV3LXN0eWxlIGNsYXNzZXMgaGF2ZSBhCmRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZSBzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMKaGF2aW5nIHZlcnkgZmV3IGluc3RhbmNlIHZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lCmFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2UgbnVtYmVycyBvZiBpbnN0YW5jZXMuCgpUaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyAqX19zbG90c19fKiBpbiBhIG5ldy1zdHlsZQpjbGFzcyBkZWZpbml0aW9uLiAgVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YKaW5zdGFuY2UgdmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvCmhvbGQgYSB2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgKl9fZGljdF9fKiBpcwpub3QgY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS4KCl9fc2xvdHNfXwoKICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZQogICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICBJZiBkZWZpbmVkIGluIGEKICAgbmV3LXN0eWxlIGNsYXNzLCAqX19zbG90c19fKiByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkCiAgIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZAogICAqX193ZWFrcmVmX18qIGZvciBlYWNoIGluc3RhbmNlLgoKICAgTmV3IGluIHZlcnNpb24gMi4yLgoKTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXyoKCiogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgKl9fZGljdF9fKgogIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgKl9fc2xvdHNfXyoKICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy4KCiogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3CiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0bwogIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyBgYEF0dHJpYnV0ZUVycm9yYGAuIElmCiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGQKICBgYCdfX2RpY3RfXydgYCB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyoKICBkZWNsYXJhdGlvbi4KCiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWRkaW5nIGBgJ19fZGljdF9fJ2BgIHRvIHRoZQogICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHdvdWxkIG5vdCBlbmFibGUgdGhlIGFzc2lnbm1lbnQgb2YgbmV3CiAgYXR0cmlidXRlcyBub3Qgc3BlY2lmaWNhbGx5IGxpc3RlZCBpbiB0aGUgc2VxdWVuY2Ugb2YgaW5zdGFuY2UKICB2YXJpYWJsZSBuYW1lcy4KCiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXMgZGVmaW5pbmcKICAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzIGluc3RhbmNlcy4gSWYgd2VhawogIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGQgYGAnX193ZWFrcmVmX18nYGAgdG8gdGhlCiAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24uCgogIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFkZGluZyBgYCdfX3dlYWtyZWZfXydgYCB0byB0aGUKICAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB3b3VsZCBub3QgZW5hYmxlIHN1cHBvcnQgZm9yIHdlYWsKICByZWZlcmVuY2VzLgoKKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5IGNyZWF0aW5nCiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXMKICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yCiAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlIGNsYXNzCiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LgoKKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgY2xhc3MKICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKgogIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lcwogIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLgoKKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZSBpbnN0YW5jZQogIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyBpbmFjY2Vzc2libGUgKGV4Y2VwdCBieQogIHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuIFRoaXMKICByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGEKICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLgoKKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbQogICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgYGBsb25nYGAsIGBgc3RyYGAgYW5kCiAgYGB0dXBsZWBgLgoKKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouIE1hcHBpbmdzIG1heQogIGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nIG1heSBiZQogIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS4KCiogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lCiAgKl9fc2xvdHNfXyouCgogIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IFByZXZpb3VzbHksICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgcmFpc2VkIGFuCiAgZXJyb3IgaWYgZWl0aGVyIG5ldyBvciBvbGQgY2xhc3MgaGFkICpfX3Nsb3RzX18qLgoKCkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpCeSBkZWZhdWx0LCBuZXctc3R5bGUgY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgYGB0eXBlKClgYC4gQQpjbGFzcyBkZWZpbml0aW9uIGlzIHJlYWQgaW50byBhIHNlcGFyYXRlIG5hbWVzcGFjZSBhbmQgdGhlIHZhbHVlIG9mCmNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiBgYHR5cGUobmFtZSwgYmFzZXMsIGRpY3QpYGAuCgpXaGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uIGlzIHJlYWQsIGlmICpfX21ldGFjbGFzc19fKiBpcyBkZWZpbmVkIHRoZW4KdGhlIGNhbGxhYmxlIGFzc2lnbmVkIHRvIGl0IHdpbGwgYmUgY2FsbGVkIGluc3RlYWQgb2YgYGB0eXBlKClgYC4gVGhpcwphbGxvd3MgY2xhc3NlcyBvciBmdW5jdGlvbnMgdG8gYmUgd3JpdHRlbiB3aGljaCBtb25pdG9yIG9yIGFsdGVyIHRoZQpjbGFzcyBjcmVhdGlvbiBwcm9jZXNzOgoKKiBNb2RpZnlpbmcgdGhlIGNsYXNzIGRpY3Rpb25hcnkgcHJpb3IgdG8gdGhlIGNsYXNzIGJlaW5nIGNyZWF0ZWQuCgoqIFJldHVybmluZyBhbiBpbnN0YW5jZSBvZiBhbm90aGVyIGNsYXNzIC0tIGVzc2VudGlhbGx5IHBlcmZvcm1pbmcgdGhlCiAgcm9sZSBvZiBhIGZhY3RvcnkgZnVuY3Rpb24uCgpUaGVzZSBzdGVwcyB3aWxsIGhhdmUgdG8gYmUgcGVyZm9ybWVkIGluIHRoZSBtZXRhY2xhc3MncyBgYF9fbmV3X18oKWBgCm1ldGhvZCAtLSBgYHR5cGUuX19uZXdfXygpYGAgY2FuIHRoZW4gYmUgY2FsbGVkIGZyb20gdGhpcyBtZXRob2QgdG8KY3JlYXRlIGEgY2xhc3Mgd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcy4gIFRoaXMgZXhhbXBsZSBhZGRzIGEgbmV3CmVsZW1lbnQgdG8gdGhlIGNsYXNzIGRpY3Rpb25hcnkgYmVmb3JlIGNyZWF0aW5nIHRoZSBjbGFzczoKCiAgIGNsYXNzIG1ldGFjbHModHlwZSk6CiAgICAgICBkZWYgX19uZXdfXyhtY3MsIG5hbWUsIGJhc2VzLCBkaWN0KToKICAgICAgICAgICBkaWN0Wydmb28nXSA9ICdtZXRhY2xzIHdhcyBoZXJlJwogICAgICAgICAgIHJldHVybiB0eXBlLl9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGljdCkKCllvdSBjYW4gb2YgY291cnNlIGFsc28gb3ZlcnJpZGUgb3RoZXIgY2xhc3MgbWV0aG9kcyAob3IgYWRkIG5ldwptZXRob2RzKTsgZm9yIGV4YW1wbGUgZGVmaW5pbmcgYSBjdXN0b20gYGBfX2NhbGxfXygpYGAgbWV0aG9kIGluIHRoZQptZXRhY2xhc3MgYWxsb3dzIGN1c3RvbSBiZWhhdmlvciB3aGVuIHRoZSBjbGFzcyBpcyBjYWxsZWQsIGUuZy4gbm90CmFsd2F5cyBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZS4KCl9fbWV0YWNsYXNzX18KCiAgIFRoaXMgdmFyaWFibGUgY2FuIGJlIGFueSBjYWxsYWJsZSBhY2NlcHRpbmcgYXJndW1lbnRzIGZvciBgYG5hbWVgYCwKICAgYGBiYXNlc2BgLCBhbmQgYGBkaWN0YGAuICBVcG9uIGNsYXNzIGNyZWF0aW9uLCB0aGUgY2FsbGFibGUgaXMgdXNlZAogICBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBgYHR5cGUoKWBgLgoKICAgTmV3IGluIHZlcnNpb24gMi4yLgoKVGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZQpydWxlczoKCiogSWYgYGBkaWN0WydfX21ldGFjbGFzc19fJ11gYCBleGlzdHMsIGl0IGlzIHVzZWQuCgoqIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGJhc2UgY2xhc3MsIGl0cyBtZXRhY2xhc3MgaXMKICB1c2VkICh0aGlzIGxvb2tzIGZvciBhICpfX2NsYXNzX18qIGF0dHJpYnV0ZSBmaXJzdCBhbmQgaWYgbm90IGZvdW5kLAogIHVzZXMgaXRzIHR5cGUpLgoKKiBPdGhlcndpc2UsIGlmIGEgZ2xvYmFsIHZhcmlhYmxlIG5hbWVkIF9fbWV0YWNsYXNzX18gZXhpc3RzLCBpdCBpcwogIHVzZWQuCgoqIE90aGVyd2lzZSwgdGhlIG9sZC1zdHlsZSwgY2xhc3NpYyBtZXRhY2xhc3MgKHR5cGVzLkNsYXNzVHlwZSkgaXMKICB1c2VkLgoKVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzIHRoYXQgaGF2ZQpiZWVuIGV4cGxvcmVkIGluY2x1ZGluZyBsb2dnaW5nLCBpbnRlcmZhY2UgY2hlY2tpbmcsIGF1dG9tYXRpYwpkZWxlZ2F0aW9uLCBhdXRvbWF0aWMgcHJvcGVydHkgY3JlYXRpb24sIHByb3hpZXMsIGZyYW1ld29ya3MsIGFuZAphdXRvbWF0aWMgcmVzb3VyY2UgbG9ja2luZy9zeW5jaHJvbml6YXRpb24uCgoKQ3VzdG9taXppbmcgaW5zdGFuY2UgYW5kIHN1YmNsYXNzIGNoZWNrcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOZXcgaW4gdmVyc2lvbiAyLjYuCgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlCmBgaXNpbnN0YW5jZSgpYGAgYW5kIGBgaXNzdWJjbGFzcygpYGAgYnVpbHQtaW4gZnVuY3Rpb25zLgoKSW4gcGFydGljdWxhciwgdGhlIG1ldGFjbGFzcyBgYGFiYy5BQkNNZXRhYGAgaW1wbGVtZW50cyB0aGVzZSBtZXRob2RzCmluIG9yZGVyIHRvIGFsbG93IHRoZSBhZGRpdGlvbiBvZiBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpIGFzCiJ2aXJ0dWFsIGJhc2UgY2xhc3NlcyIgdG8gYW55IGNsYXNzIG9yIHR5cGUgKGluY2x1ZGluZyBidWlsdC1pbgp0eXBlcyksIGluY2x1ZGluZyBvdGhlciBBQkNzLgoKY2xhc3MuX19pbnN0YW5jZWNoZWNrX18oc2VsZiwgaW5zdGFuY2UpCgogICBSZXR1cm4gdHJ1ZSBpZiAqaW5zdGFuY2UqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvcgogICBpbmRpcmVjdCkgaW5zdGFuY2Ugb2YgKmNsYXNzKi4gSWYgZGVmaW5lZCwgY2FsbGVkIHRvIGltcGxlbWVudAogICBgYGlzaW5zdGFuY2UoaW5zdGFuY2UsIGNsYXNzKWBgLgoKY2xhc3MuX19zdWJjbGFzc2NoZWNrX18oc2VsZiwgc3ViY2xhc3MpCgogICBSZXR1cm4gdHJ1ZSBpZiAqc3ViY2xhc3MqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvcgogICBpbmRpcmVjdCkgc3ViY2xhc3Mgb2YgKmNsYXNzKi4gIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnQKICAgYGBpc3N1YmNsYXNzKHN1YmNsYXNzLCBjbGFzcylgYC4KCk5vdGUgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBsb29rZWQgdXAgb24gdGhlIHR5cGUgKG1ldGFjbGFzcykgb2YgYQpjbGFzcy4gIFRoZXkgY2Fubm90IGJlIGRlZmluZWQgYXMgY2xhc3MgbWV0aG9kcyBpbiB0aGUgYWN0dWFsIGNsYXNzLgpUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbG9va3VwIG9mIHNwZWNpYWwgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQKb24gaW5zdGFuY2VzLCBvbmx5IGluIHRoaXMgY2FzZSB0aGUgaW5zdGFuY2UgaXMgaXRzZWxmIGEgY2xhc3MuCgpTZWUgYWxzbzoKCiAgICoqUEVQIDMxMTkqKiAtIEludHJvZHVjaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcwogICAgICBJbmNsdWRlcyB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY3VzdG9taXppbmcgYGBpc2luc3RhbmNlKClgYCBhbmQKICAgICAgYGBpc3N1YmNsYXNzKClgYCBiZWhhdmlvciB0aHJvdWdoIGBgX19pbnN0YW5jZWNoZWNrX18oKWBgIGFuZAogICAgICBgYF9fc3ViY2xhc3NjaGVja19fKClgYCwgd2l0aCBtb3RpdmF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkKICAgICAgaW4gdGhlIGNvbnRleHQgb2YgYWRkaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoc2VlIHRoZSBgYGFiY2BgCiAgICAgIG1vZHVsZSkgdG8gdGhlIGxhbmd1YWdlLgoKCkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpvYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kCiAgIGlzIGRlZmluZWQsIGBgeChhcmcxLCBhcmcyLCAuLi4pYGAgaXMgYSBzaG9ydGhhbmQgZm9yCiAgIGBgeC5fX2NhbGxfXyhhcmcxLCBhcmcyLCAuLi4pYGAuCgoKRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlcwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLgpDb250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpIG9yIG1hcHBpbmdzCihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZQpmaXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2Ugb3IgdG8KZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsIHRoZQphbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggYGAwIDw9IGsgPCBOYGAKd2hlcmUgKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciBzbGljZSBvYmplY3RzLCB3aGljaApkZWZpbmUgYSByYW5nZSBvZiBpdGVtcy4gKEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIG1ldGhvZApgYF9fZ2V0c2xpY2VfXygpYGAgKHNlZSBiZWxvdykgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBoYW5kbGUgc2ltcGxlLApidXQgbm90IGV4dGVuZGVkIHNsaWNlcy4pIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyBwcm92aWRlCnRoZSBtZXRob2RzIGBga2V5cygpYGAsIGBgdmFsdWVzKClgYCwgYGBpdGVtcygpYGAsIGBgaGFzX2tleSgpYGAsCmBgZ2V0KClgYCwgYGBjbGVhcigpYGAsIGBgc2V0ZGVmYXVsdCgpYGAsIGBgaXRlcmtleXMoKWBgLApgYGl0ZXJ2YWx1ZXMoKWBgLCBgYGl0ZXJpdGVtcygpYGAsIGBgcG9wKClgYCwgYGBwb3BpdGVtKClgYCwKYGBjb3B5KClgYCwgYW5kIGBgdXBkYXRlKClgYCBiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob24ncwpzdGFuZGFyZCBkaWN0aW9uYXJ5IG9iamVjdHMuICBUaGUgYGBVc2VyRGljdGBgIG1vZHVsZSBwcm92aWRlcyBhCmBgRGljdE1peGluYGAgY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YKYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgLCBgYF9fZGVsaXRlbV9fKClgYCwgYW5kCmBga2V5cygpYGAuIE11dGFibGUgc2VxdWVuY2VzIHNob3VsZCBwcm92aWRlIG1ldGhvZHMgYGBhcHBlbmQoKWBgLApgYGNvdW50KClgYCwgYGBpbmRleCgpYGAsIGBgZXh0ZW5kKClgYCwgYGBpbnNlcnQoKWBgLCBgYHBvcCgpYGAsCmBgcmVtb3ZlKClgYCwgYGByZXZlcnNlKClgYCBhbmQgYGBzb3J0KClgYCwgbGlrZSBQeXRob24gc3RhbmRhcmQgbGlzdApvYmplY3RzLiAgRmluYWxseSwgc2VxdWVuY2UgdHlwZXMgc2hvdWxkIGltcGxlbWVudCBhZGRpdGlvbiAobWVhbmluZwpjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmcgcmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlCm1ldGhvZHMgYGBfX2FkZF9fKClgYCwgYGBfX3JhZGRfXygpYGAsIGBgX19pYWRkX18oKWBgLCBgYF9fbXVsX18oKWBgLApgYF9fcm11bF9fKClgYCBhbmQgYGBfX2ltdWxfXygpYGAgZGVzY3JpYmVkIGJlbG93OyB0aGV5IHNob3VsZCBub3QKZGVmaW5lIGBgX19jb2VyY2VfXygpYGAgb3Igb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzCnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUKYGBfX2NvbnRhaW5zX18oKWBgIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSBgYGluYGAKb3BlcmF0b3I7IGZvciBtYXBwaW5ncywgYGBpbmBgIHNob3VsZCBiZSBlcXVpdmFsZW50IG9mIGBgaGFzX2tleSgpYGA7CmZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlcgpyZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlCmBgX19pdGVyX18oKWBgIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlCmNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCBgYF9faXRlcl9fKClgYCBzaG91bGQgYmUgdGhlIHNhbWUgYXMKYGBpdGVya2V5cygpYGA7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBpdGVyYXRlIHRocm91Z2ggdGhlIHZhbHVlcy4KCm9iamVjdC5fX2xlbl9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGAuICBTaG91bGQgcmV0dXJuCiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciBgYD49YGAgMC4gIEFsc28sIGFuIG9iamVjdAogICB0aGF0IGRvZXNuJ3QgZGVmaW5lIGEgYGBfX25vbnplcm9fXygpYGAgbWV0aG9kIGFuZCB3aG9zZQogICBgYF9fbGVuX18oKWBgIG1ldGhvZCByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhCiAgIEJvb2xlYW4gY29udGV4dC4KCm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgYGBzZWxmW2tleV1gYC4gRm9yIHNlcXVlbmNlCiAgIHR5cGVzLCB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuCiAgIE5vdGUgdGhhdCB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUKICAgY2xhc3Mgd2lzaGVzIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUKICAgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLiBJZiAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsCiAgIGBgVHlwZUVycm9yYGAgbWF5IGJlIHJhaXNlZDsgaWYgb2YgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2YKICAgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlIChhZnRlciBhbnkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZgogICBuZWdhdGl2ZSB2YWx1ZXMpLCBgYEluZGV4RXJyb3JgYCBzaG91bGQgYmUgcmFpc2VkLiBGb3IgbWFwcGluZwogICB0eXBlcywgaWYgKmtleSogaXMgbWlzc2luZyAobm90IGluIHRoZSBjb250YWluZXIpLCBgYEtleUVycm9yYGAKICAgc2hvdWxkIGJlIHJhaXNlZC4KCiAgIE5vdGU6IGBgZm9yYGAgbG9vcHMgZXhwZWN0IHRoYXQgYW4gYGBJbmRleEVycm9yYGAgd2lsbCBiZSByYWlzZWQgZm9yCiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGUKICAgICBzZXF1ZW5jZS4KCm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvIGBgc2VsZltrZXldYGAuICBTYW1lIG5vdGUgYXMgZm9yCiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWYKICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzCiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGUKICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IKICAgdGhlIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC4KCm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mIGBgc2VsZltrZXldYGAuICBTYW1lIG5vdGUgYXMgZm9yCiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWYKICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMKICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZQogICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlIGBgX19nZXRpdGVtX18oKWBgCiAgIG1ldGhvZC4KCm9iamVjdC5fX2l0ZXJfXyhzZWxmKQoKICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgY29udGFpbmVyLgogICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBpdGVyYXRlCiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZAogICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lciwgYW5kIHNob3VsZCBhbHNvIGJlIG1hZGUKICAgYXZhaWxhYmxlIGFzIHRoZSBtZXRob2QgYGBpdGVya2V5cygpYGAuCgogICBJdGVyYXRvciBvYmplY3RzIGFsc28gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2Q7IHRoZXkgYXJlCiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3IKICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouCgpvYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpCgogICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSBgYHJldmVyc2VkKClgYCBidWlsdC1pbiB0byBpbXBsZW1lbnQKICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0CiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci4KCiAgIElmIHRoZSBgYF9fcmV2ZXJzZWRfXygpYGAgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlCiAgIGBgcmV2ZXJzZWQoKWBgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZQogICBwcm90b2NvbCAoYGBfX2xlbl9fKClgYCBhbmQgYGBfX2dldGl0ZW1fXygpYGApLiAgT2JqZWN0cyB0aGF0CiAgIHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sIHNob3VsZCBvbmx5IHByb3ZpZGUKICAgYGBfX3JldmVyc2VkX18oKWBgIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBpcwogICBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnkgYGByZXZlcnNlZCgpYGAuCgogICBOZXcgaW4gdmVyc2lvbiAyLjYuCgpUaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoYGBpbmBgIGFuZCBgYG5vdCBpbmBgKSBhcmUgbm9ybWFsbHkKaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsIGNvbnRhaW5lcgpvYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnQKaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuCgpvYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWUKICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpcwogICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvcgogICB0aGUga2V5LWl0ZW0gcGFpcnMuCgogICBGb3Igb2JqZWN0cyB0aGF0IGRvbid0IGRlZmluZSBgYF9fY29udGFpbnNfXygpYGAsIHRoZSBtZW1iZXJzaGlwCiAgIHRlc3QgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSBgYF9faXRlcl9fKClgYCwgdGhlbiB0aGUgb2xkCiAgIHNlcXVlbmNlIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgYGBfX2dldGl0ZW1fXygpYGAsIHNlZSAqdGhpcwogICBzZWN0aW9uIGluIHRoZSBsYW5ndWFnZSByZWZlcmVuY2UqLgoKCkFkZGl0aW9uYWwgbWV0aG9kcyBmb3IgZW11bGF0aW9uIG9mIHNlcXVlbmNlIHR5cGVzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIG9wdGlvbmFsIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZnVydGhlciBlbXVsYXRlCnNlcXVlbmNlIG9iamVjdHMuICBJbW11dGFibGUgc2VxdWVuY2VzIG1ldGhvZHMgc2hvdWxkIGF0IG1vc3Qgb25seQpkZWZpbmUgYGBfX2dldHNsaWNlX18oKWBgOyBtdXRhYmxlIHNlcXVlbmNlcyBtaWdodCBkZWZpbmUgYWxsIHRocmVlCm1ldGhvZHMuCgpvYmplY3QuX19nZXRzbGljZV9fKHNlbGYsIGksIGopCgogICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4wOiBTdXBwb3J0IHNsaWNlIG9iamVjdHMgYXMgcGFyYW1ldGVycwogICB0byB0aGUgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLiAoSG93ZXZlciwgYnVpbHQtaW4gdHlwZXMgaW4KICAgQ1B5dGhvbiBjdXJyZW50bHkgc3RpbGwgaW1wbGVtZW50IGBgX19nZXRzbGljZV9fKClgYC4gIFRoZXJlZm9yZSwKICAgeW91IGhhdmUgdG8gb3ZlcnJpZGUgaXQgaW4gZGVyaXZlZCBjbGFzc2VzIHdoZW4gaW1wbGVtZW50aW5nCiAgIHNsaWNpbmcuKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mIGBgc2VsZltpOmpdYGAuIFRoZSByZXR1cm5lZAogICBvYmplY3Qgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgKnNlbGYqLiAgTm90ZSB0aGF0IG1pc3NpbmcgKmkqCiAgIG9yICpqKiBpbiB0aGUgc2xpY2UgZXhwcmVzc2lvbiBhcmUgcmVwbGFjZWQgYnkgemVybyBvcgogICBgYHN5cy5tYXhpbnRgYCwgcmVzcGVjdGl2ZWx5LiAgSWYgbmVnYXRpdmUgaW5kZXhlcyBhcmUgdXNlZCBpbiB0aGUKICAgc2xpY2UsIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIGFkZGVkIHRvIHRoYXQgaW5kZXguIElmIHRoZQogICBpbnN0YW5jZSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGBgX19sZW5fXygpYGAgbWV0aG9kLCBhbgogICBgYEF0dHJpYnV0ZUVycm9yYGAgaXMgcmFpc2VkLiBObyBndWFyYW50ZWUgaXMgbWFkZSB0aGF0IGluZGV4ZXMKICAgYWRqdXN0ZWQgdGhpcyB3YXkgYXJlIG5vdCBzdGlsbCBuZWdhdGl2ZS4gIEluZGV4ZXMgd2hpY2ggYXJlCiAgIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBhcmUgbm90IG1vZGlmaWVkLiBJZiBubwogICBgYF9fZ2V0c2xpY2VfXygpYGAgaXMgZm91bmQsIGEgc2xpY2Ugb2JqZWN0IGlzIGNyZWF0ZWQgaW5zdGVhZCwgYW5kCiAgIHBhc3NlZCB0byBgYF9fZ2V0aXRlbV9fKClgYCBpbnN0ZWFkLgoKb2JqZWN0Ll9fc2V0c2xpY2VfXyhzZWxmLCBpLCBqLCBzZXF1ZW5jZSkKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byBgYHNlbGZbaTpqXWBgLiBTYW1lIG5vdGVzIGZvciAqaSoKICAgYW5kICpqKiBhcyBmb3IgYGBfX2dldHNsaWNlX18oKWBgLgoKICAgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gSWYgbm8gYGBfX3NldHNsaWNlX18oKWBgIGlzIGZvdW5kLCBvcgogICBmb3IgZXh0ZW5kZWQgc2xpY2luZyBvZiB0aGUgZm9ybSBgYHNlbGZbaTpqOmtdYGAsIGEgc2xpY2Ugb2JqZWN0IGlzCiAgIGNyZWF0ZWQsIGFuZCBwYXNzZWQgdG8gYGBfX3NldGl0ZW1fXygpYGAsIGluc3RlYWQgb2YKICAgYGBfX3NldHNsaWNlX18oKWBgIGJlaW5nIGNhbGxlZC4KCm9iamVjdC5fX2RlbHNsaWNlX18oc2VsZiwgaSwgaikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgYGBzZWxmW2k6al1gYC4gU2FtZSBub3RlcyBmb3IgKmkqCiAgIGFuZCAqaiogYXMgZm9yIGBgX19nZXRzbGljZV9fKClgYC4gVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gSWYgbm8KICAgYGBfX2RlbHNsaWNlX18oKWBgIGlzIGZvdW5kLCBvciBmb3IgZXh0ZW5kZWQgc2xpY2luZyBvZiB0aGUgZm9ybQogICBgYHNlbGZbaTpqOmtdYGAsIGEgc2xpY2Ugb2JqZWN0IGlzIGNyZWF0ZWQsIGFuZCBwYXNzZWQgdG8KICAgYGBfX2RlbGl0ZW1fXygpYGAsIGluc3RlYWQgb2YgYGBfX2RlbHNsaWNlX18oKWBgIGJlaW5nIGNhbGxlZC4KCk5vdGljZSB0aGF0IHRoZXNlIG1ldGhvZHMgYXJlIG9ubHkgaW52b2tlZCB3aGVuIGEgc2luZ2xlIHNsaWNlIHdpdGggYQpzaW5nbGUgY29sb24gaXMgdXNlZCwgYW5kIHRoZSBzbGljZSBtZXRob2QgaXMgYXZhaWxhYmxlLiAgRm9yIHNsaWNlCm9wZXJhdGlvbnMgaW52b2x2aW5nIGV4dGVuZGVkIHNsaWNlIG5vdGF0aW9uLCBvciBpbiBhYnNlbmNlIG9mIHRoZQpzbGljZSBtZXRob2RzLCBgYF9fZ2V0aXRlbV9fKClgYCwgYGBfX3NldGl0ZW1fXygpYGAgb3IKYGBfX2RlbGl0ZW1fXygpYGAgaXMgY2FsbGVkIHdpdGggYSBzbGljZSBvYmplY3QgYXMgYXJndW1lbnQuCgpUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGUgaG93IHRvIG1ha2UgeW91ciBwcm9ncmFtIG9yIG1vZHVsZQpjb21wYXRpYmxlIHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24gKGFzc3VtaW5nIHRoYXQgbWV0aG9kcwpgYF9fZ2V0aXRlbV9fKClgYCwgYGBfX3NldGl0ZW1fXygpYGAgYW5kIGBgX19kZWxpdGVtX18oKWBgIHN1cHBvcnQKc2xpY2Ugb2JqZWN0cyBhcyBhcmd1bWVudHMpOgoKICAgY2xhc3MgTXlDbGFzczoKICAgICAgIC4uLgogICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKICAgICAgICAgICAuLi4KICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgdmFsdWUpOgogICAgICAgICAgIC4uLgogICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KToKICAgICAgICAgICAuLi4KCiAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDApOgogICAgICAgICAgICMgVGhleSB3b24ndCBiZSBkZWZpbmVkIGlmIHZlcnNpb24gaXMgYXQgbGVhc3QgMi4wIGZpbmFsCgogICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6CiAgICAgICAgICAgICAgIHJldHVybiBzZWxmW21heCgwLCBpKTptYXgoMCwgaik6XQogICAgICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgc2VxKToKICAgICAgICAgICAgICAgc2VsZlttYXgoMCwgaSk6bWF4KDAsIGopOl0gPSBzZXEKICAgICAgICAgICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIGksIGopOgogICAgICAgICAgICAgICBkZWwgc2VsZlttYXgoMCwgaSk6bWF4KDAsIGopOl0KICAgICAgIC4uLgoKTm90ZSB0aGUgY2FsbHMgdG8gYGBtYXgoKWBgOyB0aGVzZSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlCmhhbmRsaW5nIG9mIG5lZ2F0aXZlIGluZGljZXMgYmVmb3JlIHRoZSBgYF9fKnNsaWNlX18oKWBgIG1ldGhvZHMgYXJlCmNhbGxlZC4gIFdoZW4gbmVnYXRpdmUgaW5kZXhlcyBhcmUgdXNlZCwgdGhlIGBgX18qaXRlbV9fKClgYCBtZXRob2RzCnJlY2VpdmUgdGhlbSBhcyBwcm92aWRlZCwgYnV0IHRoZSBgYF9fKnNsaWNlX18oKWBgIG1ldGhvZHMgZ2V0IGEKImNvb2tlZCIgZm9ybSBvZiB0aGUgaW5kZXggdmFsdWVzLiAgRm9yIGVhY2ggbmVnYXRpdmUgaW5kZXggdmFsdWUsIHRoZQpsZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIGFkZGVkIHRvIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgbWV0aG9kCih3aGljaCBtYXkgc3RpbGwgcmVzdWx0IGluIGEgbmVnYXRpdmUgaW5kZXgpOyB0aGlzIGlzIHRoZSBjdXN0b21hcnkKaGFuZGxpbmcgb2YgbmVnYXRpdmUgaW5kZXhlcyBieSB0aGUgYnVpbHQtaW4gc2VxdWVuY2UgdHlwZXMsIGFuZCB0aGUKYGBfXyppdGVtX18oKWBgIG1ldGhvZHMgYXJlIGV4cGVjdGVkIHRvIGRvIHRoaXMgYXMgd2VsbC4gIEhvd2V2ZXIsCnNpbmNlIHRoZXkgc2hvdWxkIGFscmVhZHkgYmUgZG9pbmcgdGhhdCwgbmVnYXRpdmUgaW5kZXhlcyBjYW5ub3QgYmUKcGFzc2VkIGluOyB0aGV5IG11c3QgYmUgY29uc3RyYWluZWQgdG8gdGhlIGJvdW5kcyBvZiB0aGUgc2VxdWVuY2UKYmVmb3JlIGJlaW5nIHBhc3NlZCB0byB0aGUgYGBfXyppdGVtX18oKWBgIG1ldGhvZHMuIENhbGxpbmcgYGBtYXgoMCwKaSlgYCBjb252ZW5pZW50bHkgcmV0dXJucyB0aGUgcHJvcGVyIHZhbHVlLgoKCkVtdWxhdGluZyBudW1lcmljIHR5cGVzCj09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljIG9iamVjdHMuCk1ldGhvZHMgY29ycmVzcG9uZGluZyB0byBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3IKbm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC4KCm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKQpvYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcikKCiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljCiAgIG9wZXJhdGlvbnMgKGBgK2BgLCBgYC1gYCwgYGAqYGAsIGBgLy9gYCwgYGAlYGAsIGBgZGl2bW9kKClgYCwKICAgYGBwb3coKWBgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKS4gIEZvcgogICBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gYGB4ICsgeWBgLCB3aGVyZSAqeCogaXMgYW4KICAgaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiBgYF9fYWRkX18oKWBgIG1ldGhvZCwKICAgYGB4Ll9fYWRkX18oeSlgYCBpcyBjYWxsZWQuICBUaGUgYGBfX2Rpdm1vZF9fKClgYCBtZXRob2Qgc2hvdWxkIGJlCiAgIHRoZSBlcXVpdmFsZW50IHRvIHVzaW5nIGBgX19mbG9vcmRpdl9fKClgYCBhbmQgYGBfX21vZF9fKClgYDsgaXQKICAgc2hvdWxkIG5vdCBiZSByZWxhdGVkIHRvIGBgX190cnVlZGl2X18oKWBgIChkZXNjcmliZWQgYmVsb3cpLiAgTm90ZQogICB0aGF0IGBgX19wb3dfXygpYGAgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0IGFuIG9wdGlvbmFsIHRoaXJkCiAgIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluIGBgcG93KClgYCBmdW5jdGlvbgogICBpcyB0byBiZSBzdXBwb3J0ZWQuCgogICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGUKICAgc3VwcGxpZWQgYXJndW1lbnRzLCBpdCBzaG91bGQgcmV0dXJuIGBgTm90SW1wbGVtZW50ZWRgYC4KCm9iamVjdC5fX2Rpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpCgogICBUaGUgZGl2aXNpb24gb3BlcmF0b3IgKGBgL2BgKSBpcyBpbXBsZW1lbnRlZCBieSB0aGVzZSBtZXRob2RzLiAgVGhlCiAgIGBgX190cnVlZGl2X18oKWBgIG1ldGhvZCBpcyB1c2VkIHdoZW4gYGBfX2Z1dHVyZV9fLmRpdmlzaW9uYGAgaXMgaW4KICAgZWZmZWN0LCBvdGhlcndpc2UgYGBfX2Rpdl9fKClgYCBpcyB1c2VkLiAgSWYgb25seSBvbmUgb2YgdGhlc2UgdHdvCiAgIG1ldGhvZHMgaXMgZGVmaW5lZCwgdGhlIG9iamVjdCB3aWxsIG5vdCBzdXBwb3J0IGRpdmlzaW9uIGluIHRoZQogICBhbHRlcm5hdGUgY29udGV4dDsgYGBUeXBlRXJyb3JgYCB3aWxsIGJlIHJhaXNlZCBpbnN0ZWFkLgoKb2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmRpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmxzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnhvcl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcikKCiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljCiAgIG9wZXJhdGlvbnMgKGBgK2BgLCBgYC1gYCwgYGAqYGAsIGBgL2BgLCBgYCVgYCwgYGBkaXZtb2QoKWBgLAogICBgYHBvdygpYGAsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApIHdpdGgKICAgcmVmbGVjdGVkIChzd2FwcGVkKSBvcGVyYW5kcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWYKICAgdGhlIGxlZnQgb3BlcmFuZCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQKICAgdGhlIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlCiAgIHRoZSBleHByZXNzaW9uIGBgeCAtIHlgYCwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdAogICBoYXMgYW4gYGBfX3JzdWJfXygpYGAgbWV0aG9kLCBgYHkuX19yc3ViX18oeClgYCBpcyBjYWxsZWQgaWYKICAgYGB4Ll9fc3ViX18oeSlgYCByZXR1cm5zICpOb3RJbXBsZW1lbnRlZCouCgogICBOb3RlIHRoYXQgdGVybmFyeSBgYHBvdygpYGAgd2lsbCBub3QgdHJ5IGNhbGxpbmcgYGBfX3Jwb3dfXygpYGAKICAgKHRoZSBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS4KCiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmQncwogICAgIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2QgZm9yIHRoZQogICAgIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsZWZ0IG9wZXJhbmQncwogICAgIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3NlcyB0bwogICAgIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9ycycgb3BlcmF0aW9ucy4KCm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSkKb2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcikKCiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljCiAgIGFzc2lnbm1lbnRzIChgYCs9YGAsIGBgLT1gYCwgYGAqPWBgLCBgYC89YGAsIGBgLy89YGAsIGBgJT1gYCwKICAgYGAqKj1gYCwgYGA8PD1gYCwgYGA+Pj1gYCwgYGAmPWBgLCBgYF49YGAsIGBgfD1gYCkuICBUaGVzZSBtZXRob2RzCiAgIHNob3VsZCBhdHRlbXB0IHRvIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZAogICByZXR1cm4gdGhlIHJlc3VsdCAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLAogICAqc2VsZiopLiAgSWYgYSBzcGVjaWZpYyBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWQKICAgYXNzaWdubWVudCBmYWxscyBiYWNrIHRvIHRoZSBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgdG8KICAgZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGBgeCArPSB5YGAsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhCiAgIGNsYXNzIHRoYXQgaGFzIGFuIGBgX19pYWRkX18oKWBgIG1ldGhvZCwgYGB4Ll9faWFkZF9fKHkpYGAgaXMKICAgY2FsbGVkLiAgSWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBkZWZpbmUgYQogICBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2FkZF9fKHkpYGAgYW5kIGBgeS5fX3JhZGRfXyh4KWBgIGFyZQogICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mIGBgeCArIHlgYC4KCm9iamVjdC5fX25lZ19fKHNlbGYpCm9iamVjdC5fX3Bvc19fKHNlbGYpCm9iamVjdC5fX2Fic19fKHNlbGYpCm9iamVjdC5fX2ludmVydF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKGBgLWBgLCBgYCtgYCwKICAgYGBhYnMoKWBgIGFuZCBgYH5gYCkuCgpvYmplY3QuX19jb21wbGV4X18oc2VsZikKb2JqZWN0Ll9faW50X18oc2VsZikKb2JqZWN0Ll9fbG9uZ19fKHNlbGYpCm9iamVjdC5fX2Zsb2F0X18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYGNvbXBsZXgoKWBgLAogICBgYGludCgpYGAsIGBgbG9uZygpYGAsIGFuZCBgYGZsb2F0KClgYC4gIFNob3VsZCByZXR1cm4gYSB2YWx1ZSBvZgogICB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KCm9iamVjdC5fX29jdF9fKHNlbGYpCm9iamVjdC5fX2hleF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGBvY3QoKWBgIGFuZCBgYGhleCgpYGAuCiAgIFNob3VsZCByZXR1cm4gYSBzdHJpbmcgdmFsdWUuCgpvYmplY3QuX19pbmRleF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGBgb3BlcmF0b3IuaW5kZXgoKWBgLiAgQWxzbyBjYWxsZWQgd2hlbmV2ZXIKICAgUHl0aG9uIG5lZWRzIGFuIGludGVnZXIgb2JqZWN0IChzdWNoIGFzIGluIHNsaWNpbmcpLiAgTXVzdCByZXR1cm4KICAgYW4gaW50ZWdlciAoaW50IG9yIGxvbmcpLgoKICAgTmV3IGluIHZlcnNpb24gMi41LgoKb2JqZWN0Ll9fY29lcmNlX18oc2VsZiwgb3RoZXIpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50ICJtaXhlZC1tb2RlIiBudW1lcmljIGFyaXRobWV0aWMuICBTaG91bGQgZWl0aGVyCiAgIHJldHVybiBhIDItdHVwbGUgY29udGFpbmluZyAqc2VsZiogYW5kICpvdGhlciogY29udmVydGVkIHRvIGEKICAgY29tbW9uIG51bWVyaWMgdHlwZSwgb3IgYGBOb25lYGAgaWYgY29udmVyc2lvbiBpcyBpbXBvc3NpYmxlLiAgV2hlbgogICB0aGUgY29tbW9uIHR5cGUgd291bGQgYmUgdGhlIHR5cGUgb2YgYGBvdGhlcmBgLCBpdCBpcyBzdWZmaWNpZW50IHRvCiAgIHJldHVybiBgYE5vbmVgYCwgc2luY2UgdGhlIGludGVycHJldGVyIHdpbGwgYWxzbyBhc2sgdGhlIG90aGVyCiAgIG9iamVjdCB0byBhdHRlbXB0IGEgY29lcmNpb24gKGJ1dCBzb21ldGltZXMsIGlmIHRoZSBpbXBsZW1lbnRhdGlvbgogICBvZiB0aGUgb3RoZXIgdHlwZSBjYW5ub3QgYmUgY2hhbmdlZCwgaXQgaXMgdXNlZnVsIHRvIGRvIHRoZQogICBjb252ZXJzaW9uIHRvIHRoZSBvdGhlciB0eXBlIGhlcmUpLiAgQSByZXR1cm4gdmFsdWUgb2YKICAgYGBOb3RJbXBsZW1lbnRlZGBgIGlzIGVxdWl2YWxlbnQgdG8gcmV0dXJuaW5nIGBgTm9uZWBgLgoKCkNvZXJjaW9uIHJ1bGVzCj09PT09PT09PT09PT09CgpUaGlzIHNlY3Rpb24gdXNlZCB0byBkb2N1bWVudCB0aGUgcnVsZXMgZm9yIGNvZXJjaW9uLiAgQXMgdGhlIGxhbmd1YWdlCmhhcyBldm9sdmVkLCB0aGUgY29lcmNpb24gcnVsZXMgaGF2ZSBiZWNvbWUgaGFyZCB0byBkb2N1bWVudApwcmVjaXNlbHk7IGRvY3VtZW50aW5nIHdoYXQgb25lIHZlcnNpb24gb2Ygb25lIHBhcnRpY3VsYXIKaW1wbGVtZW50YXRpb24gZG9lcyBpcyB1bmRlc2lyYWJsZS4gIEluc3RlYWQsIGhlcmUgYXJlIHNvbWUgaW5mb3JtYWwKZ3VpZGVsaW5lcyByZWdhcmRpbmcgY29lcmNpb24uICBJbiBQeXRob24gMywgY29lcmNpb24gd2lsbCBub3QgYmUKc3VwcG9ydGVkLgoKKiBJZiB0aGUgbGVmdCBvcGVyYW5kIG9mIGEgJSBvcGVyYXRvciBpcyBhIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwKICBubyBjb2VyY2lvbiB0YWtlcyBwbGFjZSBhbmQgdGhlIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbiBpcwogIGludm9rZWQgaW5zdGVhZC4KCiogSXQgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkIHRvIGRlZmluZSBhIGNvZXJjaW9uIG9wZXJhdGlvbi4gTWl4ZWQtCiAgbW9kZSBvcGVyYXRpb25zIG9uIHR5cGVzIHRoYXQgZG9uJ3QgZGVmaW5lIGNvZXJjaW9uIHBhc3MgdGhlCiAgb3JpZ2luYWwgYXJndW1lbnRzIHRvIHRoZSBvcGVyYXRpb24uCgoqIE5ldy1zdHlsZSBjbGFzc2VzICh0aG9zZSBkZXJpdmVkIGZyb20gYGBvYmplY3RgYCkgbmV2ZXIgaW52b2tlIHRoZQogIGBgX19jb2VyY2VfXygpYGAgbWV0aG9kIGluIHJlc3BvbnNlIHRvIGEgYmluYXJ5IG9wZXJhdG9yOyB0aGUgb25seQogIHRpbWUgYGBfX2NvZXJjZV9fKClgYCBpcyBpbnZva2VkIGlzIHdoZW4gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uCiAgYGBjb2VyY2UoKWBgIGlzIGNhbGxlZC4KCiogRm9yIG1vc3QgaW50ZW50cyBhbmQgcHVycG9zZXMsIGFuIG9wZXJhdG9yIHRoYXQgcmV0dXJucwogIGBgTm90SW1wbGVtZW50ZWRgYCBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIG9uZSB0aGF0IGlzIG5vdAogIGltcGxlbWVudGVkIGF0IGFsbC4KCiogQmVsb3csIGBgX19vcF9fKClgYCBhbmQgYGBfX3JvcF9fKClgYCBhcmUgdXNlZCB0byBzaWduaWZ5IHRoZQogIGdlbmVyaWMgbWV0aG9kIG5hbWVzIGNvcnJlc3BvbmRpbmcgdG8gYW4gb3BlcmF0b3I7IGBgX19pb3BfXygpYGAgaXMKICB1c2VkIGZvciB0aGUgY29ycmVzcG9uZGluZyBpbi1wbGFjZSBvcGVyYXRvci4gIEZvciBleGFtcGxlLCBmb3IgdGhlCiAgb3BlcmF0b3IgJ2BgK2BgJywgYGBfX2FkZF9fKClgYCBhbmQgYGBfX3JhZGRfXygpYGAgYXJlIHVzZWQgZm9yIHRoZQogIGxlZnQgYW5kIHJpZ2h0IHZhcmlhbnQgb2YgdGhlIGJpbmFyeSBvcGVyYXRvciwgYW5kIGBgX19pYWRkX18oKWBgCiAgZm9yIHRoZSBpbi1wbGFjZSB2YXJpYW50LgoKKiBGb3Igb2JqZWN0cyAqeCogYW5kICp5KiwgZmlyc3QgYGB4Ll9fb3BfXyh5KWBgIGlzIHRyaWVkLiAgSWYgdGhpcyBpcwogIG5vdCBpbXBsZW1lbnRlZCBvciByZXR1cm5zIGBgTm90SW1wbGVtZW50ZWRgYCwgYGB5Ll9fcm9wX18oeClgYCBpcwogIHRyaWVkLiAgSWYgdGhpcyBpcyBhbHNvIG5vdCBpbXBsZW1lbnRlZCBvciByZXR1cm5zCiAgYGBOb3RJbXBsZW1lbnRlZGBgLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIEJ1dCBzZWUKICB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKCiogRXhjZXB0aW9uIHRvIHRoZSBwcmV2aW91cyBpdGVtOiBpZiB0aGUgbGVmdCBvcGVyYW5kIGlzIGFuIGluc3RhbmNlCiAgb2YgYSBidWlsdC1pbiB0eXBlIG9yIGEgbmV3LXN0eWxlIGNsYXNzLCBhbmQgdGhlIHJpZ2h0IG9wZXJhbmQgaXMgYW4KICBpbnN0YW5jZSBvZiBhIHByb3BlciBzdWJjbGFzcyBvZiB0aGF0IHR5cGUgb3IgY2xhc3MgYW5kIG92ZXJyaWRlcwogIHRoZSBiYXNlJ3MgYGBfX3JvcF9fKClgYCBtZXRob2QsIHRoZSByaWdodCBvcGVyYW5kJ3MgYGBfX3JvcF9fKClgYAogIG1ldGhvZCBpcyB0cmllZCAqYmVmb3JlKiB0aGUgbGVmdCBvcGVyYW5kJ3MgYGBfX29wX18oKWBgIG1ldGhvZC4KCiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgYSBzdWJjbGFzcyBjYW4gY29tcGxldGVseSBvdmVycmlkZSBiaW5hcnkKICBvcGVyYXRvcnMuIE90aGVyd2lzZSwgdGhlIGxlZnQgb3BlcmFuZCdzIGBgX19vcF9fKClgYCBtZXRob2Qgd291bGQKICBhbHdheXMgYWNjZXB0IHRoZSByaWdodCBvcGVyYW5kOiB3aGVuIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gY2xhc3MKICBpcyBleHBlY3RlZCwgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGF0IGNsYXNzIGlzIGFsd2F5cwogIGFjY2VwdGFibGUuCgoqIFdoZW4gZWl0aGVyIG9wZXJhbmQgdHlwZSBkZWZpbmVzIGEgY29lcmNpb24sIHRoaXMgY29lcmNpb24gaXMgY2FsbGVkCiAgYmVmb3JlIHRoYXQgdHlwZSdzIGBgX19vcF9fKClgYCBvciBgYF9fcm9wX18oKWBgIG1ldGhvZCBpcyBjYWxsZWQsCiAgYnV0IG5vIHNvb25lci4gIElmIHRoZSBjb2VyY2lvbiByZXR1cm5zIGFuIG9iamVjdCBvZiBhIGRpZmZlcmVudAogIHR5cGUgZm9yIHRoZSBvcGVyYW5kIHdob3NlIGNvZXJjaW9uIGlzIGludm9rZWQsIHBhcnQgb2YgdGhlIHByb2Nlc3MKICBpcyByZWRvbmUgdXNpbmcgdGhlIG5ldyBvYmplY3QuCgoqIFdoZW4gYW4gaW4tcGxhY2Ugb3BlcmF0b3IgKGxpa2UgJ2BgKz1gYCcpIGlzIHVzZWQsIGlmIHRoZSBsZWZ0CiAgb3BlcmFuZCBpbXBsZW1lbnRzIGBgX19pb3BfXygpYGAsIGl0IGlzIGludm9rZWQgd2l0aG91dCBhbnkKICBjb2VyY2lvbi4gIFdoZW4gdGhlIG9wZXJhdGlvbiBmYWxscyBiYWNrIHRvIGBgX19vcF9fKClgYCBhbmQvb3IKICBgYF9fcm9wX18oKWBgLCB0aGUgbm9ybWFsIGNvZXJjaW9uIHJ1bGVzIGFwcGx5LgoKKiBJbiBgYHggKyB5YGAsIGlmICp4KiBpcyBhIHNlcXVlbmNlIHRoYXQgaW1wbGVtZW50cyBzZXF1ZW5jZQogIGNvbmNhdGVuYXRpb24sIHNlcXVlbmNlIGNvbmNhdGVuYXRpb24gaXMgaW52b2tlZC4KCiogSW4gYGB4ICogeWBgLCBpZiBvbmUgb3BlcmFuZCBpcyBhIHNlcXVlbmNlIHRoYXQgaW1wbGVtZW50cyBzZXF1ZW5jZQogIHJlcGV0aXRpb24sIGFuZCB0aGUgb3RoZXIgaXMgYW4gaW50ZWdlciAoYGBpbnRgYCBvciBgYGxvbmdgYCksCiAgc2VxdWVuY2UgcmVwZXRpdGlvbiBpcyBpbnZva2VkLgoKKiBSaWNoIGNvbXBhcmlzb25zIChpbXBsZW1lbnRlZCBieSBtZXRob2RzIGBgX19lcV9fKClgYCBhbmQgc28gb24pCiAgbmV2ZXIgdXNlIGNvZXJjaW9uLiAgVGhyZWUtd2F5IGNvbXBhcmlzb24gKGltcGxlbWVudGVkIGJ5CiAgYGBfX2NtcF9fKClgYCkgZG9lcyB1c2UgY29lcmNpb24gdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyBhcyBvdGhlcgogIGJpbmFyeSBvcGVyYXRpb25zIHVzZSBpdC4KCiogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBidWlsdC1pbiBudW1lcmljIHR5cGVzIGBgaW50YGAsCiAgYGBsb25nYGAsIGBgZmxvYXRgYCwgYW5kIGBgY29tcGxleGBgIGRvIG5vdCB1c2UgY29lcmNpb24uIEFsbCB0aGVzZQogIHR5cGVzIGltcGxlbWVudCBhIGBgX19jb2VyY2VfXygpYGAgbWV0aG9kLCBmb3IgdXNlIGJ5IHRoZSBidWlsdC1pbgogIGBgY29lcmNlKClgYCBmdW5jdGlvbi4KCiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNy4KCgpXaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5ldyBpbiB2ZXJzaW9uIDIuNS4KCkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvCmJlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgYGB3aXRoYGAgc3RhdGVtZW50LiBUaGUgY29udGV4dAptYW5hZ2VyIGhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lCmNvbnRleHQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZQpub3JtYWxseSBpbnZva2VkIHVzaW5nIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uCipUaGUgd2l0aCBzdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXIKbWV0aG9kcy4KClR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91cwpraW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkCmZpbGVzLCBldGMuCgpGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouCgpvYmplY3QuX19lbnRlcl9fKHNlbGYpCgogICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBgYHdpdGhgYAogICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocykKICAgc3BlY2lmaWVkIGluIHRoZSBgYGFzYGAgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS4KCm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spCgogICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnMKICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZQogICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbAogICBiZSBgYE5vbmVgYC4KCiAgIElmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvIHN1cHByZXNzIHRoZQogICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkCiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZAogICBub3JtYWxseSB1cG9uIGV4aXQgZnJvbSB0aGlzIG1ldGhvZC4KCiAgIE5vdGUgdGhhdCBgYF9fZXhpdF9fKClgYCBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluCiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCgpTZWUgYWxzbzoKCiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50CiAgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24KICAgICAgYGB3aXRoYGAgc3RhdGVtZW50LgoKClNwZWNpYWwgbWV0aG9kIGxvb2t1cCBmb3Igb2xkLXN0eWxlIGNsYXNzZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKRm9yIG9sZC1zdHlsZSBjbGFzc2VzLCBzcGVjaWFsIG1ldGhvZHMgYXJlIGFsd2F5cyBsb29rZWQgdXAgaW4gZXhhY3RseQp0aGUgc2FtZSB3YXkgYXMgYW55IG90aGVyIG1ldGhvZCBvciBhdHRyaWJ1dGUuIFRoaXMgaXMgdGhlIGNhc2UKcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBtZXRob2QgaXMgYmVpbmcgbG9va2VkIHVwIGV4cGxpY2l0bHkgYXMgaW4KYGB4Ll9fZ2V0aXRlbV9fKGkpYGAgb3IgaW1wbGljaXRseSBhcyBpbiBgYHhbaV1gYC4KClRoaXMgYmVoYXZpb3VyIG1lYW5zIHRoYXQgc3BlY2lhbCBtZXRob2RzIG1heSBleGhpYml0IGRpZmZlcmVudApiZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYSBzaW5nbGUgb2xkLXN0eWxlIGNsYXNzIGlmIHRoZQphcHByb3ByaWF0ZSBzcGVjaWFsIGF0dHJpYnV0ZXMgYXJlIHNldCBkaWZmZXJlbnRseToKCiAgID4+PiBjbGFzcyBDOgogICAuLi4gICAgIHBhc3MKICAgLi4uCiAgID4+PiBjMSA9IEMoKQogICA+Pj4gYzIgPSBDKCkKICAgPj4+IGMxLl9fbGVuX18gPSBsYW1iZGE6IDUKICAgPj4+IGMyLl9fbGVuX18gPSBsYW1iZGE6IDkKICAgPj4+IGxlbihjMSkKICAgNQogICA+Pj4gbGVuKGMyKQogICA5CgoKU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGUgY2xhc3Nlcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHNwZWNpYWwgbWV0aG9kcyBhcmUKb25seSBndWFyYW50ZWVkIHRvIHdvcmsgY29ycmVjdGx5IGlmIGRlZmluZWQgb24gYW4gb2JqZWN0J3MgdHlwZSwgbm90CmluIHRoZSBvYmplY3QncyBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgVGhhdCBiZWhhdmlvdXIgaXMgdGhlIHJlYXNvbiB3aHkKdGhlIGZvbGxvd2luZyBjb2RlIHJhaXNlcyBhbiBleGNlcHRpb24gKHVubGlrZSB0aGUgZXF1aXZhbGVudCBleGFtcGxlCndpdGggb2xkLXN0eWxlIGNsYXNzZXMpOgoKICAgPj4+IGNsYXNzIEMob2JqZWN0KToKICAgLi4uICAgICBwYXNzCiAgIC4uLgogICA+Pj4gYyA9IEMoKQogICA+Pj4gYy5fX2xlbl9fID0gbGFtYmRhOiA1CiAgID4+PiBsZW4oYykKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgIFR5cGVFcnJvcjogb2JqZWN0IG9mIHR5cGUgJ0MnIGhhcyBubyBsZW4oKQoKVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBiZWhhdmlvdXIgbGllcyB3aXRoIGEgbnVtYmVyIG9mIHNwZWNpYWwKbWV0aG9kcyBzdWNoIGFzIGBgX19oYXNoX18oKWBgIGFuZCBgYF9fcmVwcl9fKClgYCB0aGF0IGFyZSBpbXBsZW1lbnRlZApieSBhbGwgb2JqZWN0cywgaW5jbHVkaW5nIHR5cGUgb2JqZWN0cy4gSWYgdGhlIGltcGxpY2l0IGxvb2t1cCBvZgp0aGVzZSBtZXRob2RzIHVzZWQgdGhlIGNvbnZlbnRpb25hbCBsb29rdXAgcHJvY2VzcywgdGhleSB3b3VsZCBmYWlsCndoZW4gaW52b2tlZCBvbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmOgoKICAgPj4+IDEgLl9faGFzaF9fKCkgPT0gaGFzaCgxKQogICBUcnVlCiAgID4+PiBpbnQuX19oYXNoX18oKSA9PSBoYXNoKGludCkKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgIFR5cGVFcnJvcjogZGVzY3JpcHRvciAnX19oYXNoX18nIG9mICdpbnQnIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudAoKSW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0byBpbnZva2UgYW4gdW5ib3VuZCBtZXRob2Qgb2YgYSBjbGFzcyBpbiB0aGlzCndheSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgJ21ldGFjbGFzcyBjb25mdXNpb24nLCBhbmQgaXMgYXZvaWRlZApieSBieXBhc3NpbmcgdGhlIGluc3RhbmNlIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHM6CgogICA+Pj4gdHlwZSgxKS5fX2hhc2hfXygxKSA9PSBoYXNoKDEpCiAgIFRydWUKICAgPj4+IHR5cGUoaW50KS5fX2hhc2hfXyhpbnQpID09IGhhc2goaW50KQogICBUcnVlCgpJbiBhZGRpdGlvbiB0byBieXBhc3NpbmcgYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgaW4gdGhlIGludGVyZXN0IG9mCmNvcnJlY3RuZXNzLCBpbXBsaWNpdCBzcGVjaWFsIG1ldGhvZCBsb29rdXAgZ2VuZXJhbGx5IGFsc28gYnlwYXNzZXMKdGhlIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgbWV0aG9kIGV2ZW4gb2YgdGhlIG9iamVjdCdzIG1ldGFjbGFzczoKCiAgID4+PiBjbGFzcyBNZXRhKHR5cGUpOgogICAuLi4gICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOgogICAuLi4gICAgICAgcHJpbnQgIk1ldGFjbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCIKICAgLi4uICAgICAgIHJldHVybiB0eXBlLl9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpCiAgIC4uLgogICA+Pj4gY2xhc3MgQyhvYmplY3QpOgogICAuLi4gICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhCiAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgIC4uLiAgICAgICAgIHJldHVybiAxMAogICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKToKICAgLi4uICAgICAgICAgcHJpbnQgIkNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIgogICAuLi4gICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpCiAgIC4uLgogICA+Pj4gYyA9IEMoKQogICA+Pj4gYy5fX2xlbl9fKCkgICAgICAgICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSBpbnN0YW5jZQogICBDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZAogICAxMAogICA+Pj4gdHlwZShjKS5fX2xlbl9fKGMpICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSB0eXBlCiAgIE1ldGFjbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZAogICAxMAogICA+Pj4gbGVuKGMpICAgICAgICAgICAgICAgICAgICAgICMgSW1wbGljaXQgbG9va3VwCiAgIDEwCgpCeXBhc3NpbmcgdGhlIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgbWFjaGluZXJ5IGluIHRoaXMgZmFzaGlvbgpwcm92aWRlcyBzaWduaWZpY2FudCBzY29wZSBmb3Igc3BlZWQgb3B0aW1pc2F0aW9ucyB3aXRoaW4gdGhlCmludGVycHJldGVyLCBhdCB0aGUgY29zdCBvZiBzb21lIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZgpzcGVjaWFsIG1ldGhvZHMgKHRoZSBzcGVjaWFsIG1ldGhvZCAqbXVzdCogYmUgc2V0IG9uIHRoZSBjbGFzcyBvYmplY3QKaXRzZWxmIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnRseSBpbnZva2VkIGJ5IHRoZSBpbnRlcnByZXRlcikuCgotWyBGb290bm90ZXMgXS0KClsxXSBJdCAqaXMqIHBvc3NpYmxlIGluIHNvbWUgY2FzZXMgdG8gY2hhbmdlIGFuIG9iamVjdCdzIHR5cGUsIHVuZGVyCiAgICBjZXJ0YWluIGNvbnRyb2xsZWQgY29uZGl0aW9ucy4gSXQgZ2VuZXJhbGx5IGlzbid0IGEgZ29vZCBpZGVhCiAgICB0aG91Z2gsIHNpbmNlIGl0IGNhbiBsZWFkIHRvIHNvbWUgdmVyeSBzdHJhbmdlIGJlaGF2aW91ciBpZiBpdCBpcwogICAgaGFuZGxlZCBpbmNvcnJlY3RseS4KClsyXSBGb3Igb3BlcmFuZHMgb2YgdGhlIHNhbWUgdHlwZSwgaXQgaXMgYXNzdW1lZCB0aGF0IGlmIHRoZSBub24tCiAgICByZWZsZWN0ZWQgbWV0aG9kIChzdWNoIGFzIGBgX19hZGRfXygpYGApIGZhaWxzIHRoZSBvcGVyYXRpb24gaXMKICAgIG5vdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeSB0aGUgcmVmbGVjdGVkIG1ldGhvZCBpcyBub3QgY2FsbGVkLgp0DAAAAHNwZWNpYWxuYW1lc3NkQwAAClN0cmluZyBNZXRob2RzCioqKioqKioqKioqKioqCgpCZWxvdyBhcmUgbGlzdGVkIHRoZSBzdHJpbmcgbWV0aG9kcyB3aGljaCBib3RoIDgtYml0IHN0cmluZ3MgYW5kClVuaWNvZGUgb2JqZWN0cyBzdXBwb3J0LiAgU29tZSBvZiB0aGVtIGFyZSBhbHNvIGF2YWlsYWJsZSBvbgpgYGJ5dGVhcnJheWBgIG9iamVjdHMuCgpJbiBhZGRpdGlvbiwgUHl0aG9uJ3Mgc3RyaW5ncyBzdXBwb3J0IHRoZSBzZXF1ZW5jZSB0eXBlIG1ldGhvZHMKZGVzY3JpYmVkIGluIHRoZSAqU2VxdWVuY2UgVHlwZXMgLS0tIHN0ciwgdW5pY29kZSwgbGlzdCwgdHVwbGUsCmJ5dGVhcnJheSwgYnVmZmVyLCB4cmFuZ2UqIHNlY3Rpb24uIFRvIG91dHB1dCBmb3JtYXR0ZWQgc3RyaW5ncyB1c2UKdGVtcGxhdGUgc3RyaW5ncyBvciB0aGUgYGAlYGAgb3BlcmF0b3IgZGVzY3JpYmVkIGluIHRoZSAqU3RyaW5nCkZvcm1hdHRpbmcgT3BlcmF0aW9ucyogc2VjdGlvbi4gQWxzbywgc2VlIHRoZSBgYHJlYGAgbW9kdWxlIGZvciBzdHJpbmcKZnVuY3Rpb25zIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCgpzdHIuY2FwaXRhbGl6ZSgpCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkCiAgIGFuZCB0aGUgcmVzdCBsb3dlcmNhc2VkLgoKICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCgpzdHIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKQoKICAgUmV0dXJuIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBQYWRkaW5nIGlzIGRvbmUKICAgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGEgc3BhY2UpLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogU3VwcG9ydCBmb3IgdGhlICpmaWxsY2hhciogYXJndW1lbnQuCgpzdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YioKICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQKICAgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLgoKc3RyLmRlY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSkKCiAgIERlY29kZXMgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgKmVuY29kaW5nKi4KICAgKmVuY29kaW5nKiBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXkKICAgYmUgZ2l2ZW4gdG8gc2V0IGEgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nIHNjaGVtZS4gIFRoZSBkZWZhdWx0IGlzCiAgIGBgJ3N0cmljdCdgYCwgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBgYFVuaWNvZGVFcnJvcmBgLgogICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgJ2lnbm9yZSdgYCwgYGAncmVwbGFjZSdgYCBhbmQgYW55IG90aGVyCiAgIG5hbWUgcmVnaXN0ZXJlZCB2aWEgYGBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoKWBgLCBzZWUgc2VjdGlvbiAqQ29kZWMKICAgQmFzZSBDbGFzc2VzKi4KCiAgIE5ldyBpbiB2ZXJzaW9uIDIuMi4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXMKICAgYWRkZWQuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC4KCnN0ci5lbmNvZGUoW2VuY29kaW5nWywgZXJyb3JzXV0pCgogICBSZXR1cm4gYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuICBEZWZhdWx0IGVuY29kaW5nIGlzIHRoZQogICBjdXJyZW50IGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nLiAgKmVycm9ycyogbWF5IGJlIGdpdmVuIHRvIHNldCBhCiAgIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXMKICAgYGAnc3RyaWN0J2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGEKICAgYGBVbmljb2RlRXJyb3JgYC4gIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGAnaWdub3JlJ2BgLAogICBgYCdyZXBsYWNlJ2BgLCBgYCd4bWxjaGFycmVmcmVwbGFjZSdgYCwgYGAnYmFja3NsYXNocmVwbGFjZSdgYCBhbmQKICAgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB2aWEgYGBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoKWBgLCBzZWUKICAgc2VjdGlvbiAqQ29kZWMgQmFzZSBDbGFzc2VzKi4gRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZQogICBzZWN0aW9uICpTdGFuZGFyZCBFbmNvZGluZ3MqLgoKICAgTmV3IGluIHZlcnNpb24gMi4wLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYGAneG1sY2hhcnJlZnJlcGxhY2UnYGAgYW5kCiAgIGBgJ2JhY2tzbGFzaHJlcGxhY2UnYGAgYW5kIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXMgYWRkZWQuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC4KCnN0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKQoKICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgKnN1ZmZpeCosCiAgIG90aGVyd2lzZSByZXR1cm4gYGBGYWxzZWBgLiAgKnN1ZmZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZgogICBzdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXQKICAgdGhhdCBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIGF0IHRoYXQKICAgcG9zaXRpb24uCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBBY2NlcHQgdHVwbGVzIGFzICpzdWZmaXgqLgoKc3RyLmV4cGFuZHRhYnMoW3RhYnNpemVdKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQKICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGUKICAgZ2l2ZW4gdGFiIHNpemUuICBUYWIgcG9zaXRpb25zIG9jY3VyIGV2ZXJ5ICp0YWJzaXplKiBjaGFyYWN0ZXJzCiAgIChkZWZhdWx0IGlzIDgsIGdpdmluZyB0YWIgcG9zaXRpb25zIGF0IGNvbHVtbnMgMCwgOCwgMTYgYW5kIHNvIG9uKS4KICAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZXQgdG8gemVybyBhbmQgdGhlCiAgIHN0cmluZyBpcyBleGFtaW5lZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLiAgSWYgdGhlIGNoYXJhY3RlciBpcyBhCiAgIHRhYiAoYGBcdGBgKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgaW4gdGhlCiAgIHJlc3VsdCB1bnRpbCB0aGUgY3VycmVudCBjb2x1bW4gaXMgZXF1YWwgdG8gdGhlIG5leHQgdGFiIHBvc2l0aW9uLgogICAoVGhlIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciBpcyBhCiAgIG5ld2xpbmUgKGBgXG5gYCkgb3IgcmV0dXJuIChgYFxyYGApLCBpdCBpcyBjb3BpZWQgYW5kIHRoZSBjdXJyZW50CiAgIGNvbHVtbiBpcyByZXNldCB0byB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkCiAgIGFuZCB0aGUgY3VycmVudCBjb2x1bW4gaXMgaW5jcmVtZW50ZWQgYnkgb25lIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZQogICBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgd2hlbiBwcmludGVkLgoKICAgPj4+ICcwMVx0MDEyXHQwMTIzXHQwMTIzNCcuZXhwYW5kdGFicygpCiAgICcwMSAgICAgIDAxMiAgICAgMDEyMyAgICAwMTIzNCcKICAgPj4+ICcwMVx0MDEyXHQwMTIzXHQwMTIzNCcuZXhwYW5kdGFicyg0KQogICAnMDEgIDAxMiAwMTIzICAgIDAxMjM0JwoKc3RyLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzCiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIGluIHRoZSBzbGljZSBgYHNbc3RhcnQ6ZW5kXWBgLgogICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlCiAgIG5vdGF0aW9uLiAgUmV0dXJuIGBgLTFgYCBpZiAqc3ViKiBpcyBub3QgZm91bmQuCgogICBOb3RlOiBUaGUgYGBmaW5kKClgYCBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgbmVlZCB0byBrbm93IHRoZQogICAgIHBvc2l0aW9uIG9mICpzdWIqLiAgVG8gY2hlY2sgaWYgKnN1YiogaXMgYSBzdWJzdHJpbmcgb3Igbm90LCB1c2UKICAgICB0aGUgYGBpbmBgIG9wZXJhdG9yOgoKICAgICAgICA+Pj4gJ1B5JyBpbiAnUHl0aG9uJwogICAgICAgIFRydWUKCnN0ci5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKQoKICAgUGVyZm9ybSBhIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbi4gIFRoZSBzdHJpbmcgb24gd2hpY2ggdGhpcwogICBtZXRob2QgaXMgY2FsbGVkIGNhbiBjb250YWluIGxpdGVyYWwgdGV4dCBvciByZXBsYWNlbWVudCBmaWVsZHMKICAgZGVsaW1pdGVkIGJ5IGJyYWNlcyBgYHt9YGAuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkIGNvbnRhaW5zIGVpdGhlcgogICB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG9yIHRoZSBuYW1lIG9mIGEKICAga2V5d29yZCBhcmd1bWVudC4gIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgZWFjaAogICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlCiAgIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuCgogICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKQogICAnVGhlIHN1bSBvZiAxICsgMiBpcyAzJwoKICAgU2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXMKICAgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpbiBmb3JtYXQgc3RyaW5ncy4KCiAgIFRoaXMgbWV0aG9kIG9mIHN0cmluZyBmb3JtYXR0aW5nIGlzIHRoZSBuZXcgc3RhbmRhcmQgaW4gUHl0aG9uIDMsCiAgIGFuZCBzaG91bGQgYmUgcHJlZmVycmVkIHRvIHRoZSBgYCVgYCBmb3JtYXR0aW5nIGRlc2NyaWJlZCBpbgogICAqU3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9ucyogaW4gbmV3IGNvZGUuCgogICBOZXcgaW4gdmVyc2lvbiAyLjYuCgpzdHIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIExpa2UgYGBmaW5kKClgYCwgYnV0IHJhaXNlIGBgVmFsdWVFcnJvcmBgIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QKICAgZm91bmQuCgpzdHIuaXNhbG51bSgpCgogICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYW51bWVyaWMgYW5kCiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLmlzYWxwaGEoKQoKICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFiZXRpYyBhbmQKICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgoKICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCgpzdHIuaXNkaWdpdCgpCgogICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlIGlzCiAgIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLmlzbG93ZXIoKQoKICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZQogICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgoKICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCgpzdHIuaXNzcGFjZSgpCgogICBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZwogICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgoKICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCgpzdHIuaXN0aXRsZSgpCgogICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0CiAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5CiAgIGZvbGxvdyB1bmNhc2VkIGNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy4KICAgUmV0dXJuIGZhbHNlIG90aGVyd2lzZS4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLmlzdXBwZXIoKQoKICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIHVwcGVyY2FzZQogICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgoKICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCgpzdHIuam9pbihpdGVyYWJsZSkKCiAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBpbiB0aGUKICAgKml0ZXJhYmxlKiAqaXRlcmFibGUqLiAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGVsZW1lbnRzIGlzIHRoZQogICBzdHJpbmcgcHJvdmlkaW5nIHRoaXMgbWV0aG9kLgoKc3RyLmxqdXN0KHdpZHRoWywgZmlsbGNoYXJdKQoKICAgUmV0dXJuIHRoZSBzdHJpbmcgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouCiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYQogICBzcGFjZSkuICBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yCiAgIGVxdWFsIHRvIGBgbGVuKHMpYGAuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC4KCnN0ci5sb3dlcigpCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdCiAgIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuCgogICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KCnN0ci5sc3RyaXAoW2NoYXJzXSkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgY2hhcmFjdGVycyByZW1vdmVkLiAgVGhlCiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUKICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvCiAgIHJlbW92aW5nIHdoaXRlc3BhY2UuICBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBub3QgYSBwcmVmaXg7IHJhdGhlciwKICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDoKCiAgID4+PiAnICAgc3BhY2lvdXMgICAnLmxzdHJpcCgpCiAgICdzcGFjaW91cyAgICcKICAgPj4+ICd3d3cuZXhhbXBsZS5jb20nLmxzdHJpcCgnY21vd3ouJykKICAgJ2V4YW1wbGUuY29tJwoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC4KCnN0ci5wYXJ0aXRpb24oc2VwKQoKICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhCiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvcgogICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3QKICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgZm9sbG93ZWQgYnkKICAgdHdvIGVtcHR5IHN0cmluZ3MuCgogICBOZXcgaW4gdmVyc2lvbiAyLjUuCgpzdHIucmVwbGFjZShvbGQsIG5ld1ssIGNvdW50XSkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCoKICAgcmVwbGFjZWQgYnkgKm5ldyouICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgKmNvdW50KiBpcyBnaXZlbiwgb25seQogICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuCgpzdHIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpcwogICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCB3aXRoaW4gYGBzW3N0YXJ0OmVuZF1gYC4KICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZQogICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgb24gZmFpbHVyZS4KCnN0ci5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIExpa2UgYGByZmluZCgpYGAgYnV0IHJhaXNlcyBgYFZhbHVlRXJyb3JgYCB3aGVuIHRoZSBzdWJzdHJpbmcgKnN1YioKICAgaXMgbm90IGZvdW5kLgoKc3RyLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKQoKICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLgogICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGEKICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yCiAgIGVxdWFsIHRvIGBgbGVuKHMpYGAuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC4KCnN0ci5ycGFydGl0aW9uKHNlcCkKCiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhCiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvcgogICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3QKICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgZm9sbG93ZWQgYnkKICAgdGhlIHN0cmluZyBpdHNlbGYuCgogICBOZXcgaW4gdmVyc2lvbiAyLjUuCgpzdHIucnNwbGl0KFtzZXBbLCBtYXhzcGxpdF1dKQoKICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogYXMgdGhlCiAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBzcGxpdHMKICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvcgogICBgYE5vbmVgYCwgYW55IHdoaXRlc3BhY2Ugc3RyaW5nIGlzIGEgc2VwYXJhdG9yLiAgRXhjZXB0IGZvcgogICBzcGxpdHRpbmcgZnJvbSB0aGUgcmlnaHQsIGBgcnNwbGl0KClgYCBiZWhhdmVzIGxpa2UgYGBzcGxpdCgpYGAKICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy4KCiAgIE5ldyBpbiB2ZXJzaW9uIDIuNC4KCnN0ci5yc3RyaXAoW2NoYXJzXSkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZQogICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlCiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0bwogICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsCiAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6CgogICA+Pj4gJyAgIHNwYWNpb3VzICAgJy5yc3RyaXAoKQogICAnICAgc3BhY2lvdXMnCiAgID4+PiAnbWlzc2lzc2lwcGknLnJzdHJpcCgnaXB6JykKICAgJ21pc3Npc3MnCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LgoKc3RyLnNwbGl0KFtzZXBbLCBtYXhzcGxpdF1dKQoKICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogYXMgdGhlCiAgIGRlbGltaXRlciBzdHJpbmcuICBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCoKICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCBgYG1heHNwbGl0KzFgYAogICBlbGVtZW50cykuICBJZiAqbWF4c3BsaXQqIGlzIG5vdCBzcGVjaWZpZWQgb3IgYGAtMWBgLCB0aGVuIHRoZXJlIGlzCiAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzIGFyZSBtYWRlKS4KCiAgIElmICpzZXAqIGlzIGdpdmVuLCBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlcgogICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLAogICBgYCcxLCwyJy5zcGxpdCgnLCcpYGAgcmV0dXJucyBgYFsnMScsICcnLCAnMiddYGApLiAgVGhlICpzZXAqCiAgIGFyZ3VtZW50IG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLAogICBgYCcxPD4yPD4zJy5zcGxpdCgnPD4nKWBgIHJldHVybnMgYGBbJzEnLCAnMicsICczJ11gYCkuIFNwbGl0dGluZwogICBhbiBlbXB0eSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBzZXBhcmF0b3IgcmV0dXJucyBgYFsnJ11gYC4KCiAgIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgYGBOb25lYGAsIGEgZGlmZmVyZW50IHNwbGl0dGluZwogICBhbGdvcml0aG0gaXMgYXBwbGllZDogcnVucyBvZiBjb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGFyZSByZWdhcmRlZAogICBhcyBhIHNpbmdsZSBzZXBhcmF0b3IsIGFuZCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBubyBlbXB0eSBzdHJpbmdzCiAgIGF0IHRoZSBzdGFydCBvciBlbmQgaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBvciB0cmFpbGluZwogICB3aGl0ZXNwYWNlLiAgQ29uc2VxdWVudGx5LCBzcGxpdHRpbmcgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nCiAgIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHdpdGggYSBgYE5vbmVgYCBzZXBhcmF0b3IgcmV0dXJucwogICBgYFtdYGAuCgogICBGb3IgZXhhbXBsZSwgYGAnIDEgIDIgICAzICAnLnNwbGl0KClgYCByZXR1cm5zIGBgWycxJywgJzInLCAnMyddYGAsCiAgIGFuZCBgYCcgIDEgIDIgICAzICAnLnNwbGl0KE5vbmUsIDEpYGAgcmV0dXJucyBgYFsnMScsICcyICAgMyAgJ11gYC4KCnN0ci5zcGxpdGxpbmVzKFtrZWVwZW5kc10pCgogICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgc3RyaW5nLCBicmVha2luZyBhdCBsaW5lCiAgIGJvdW5kYXJpZXMuIFRoaXMgbWV0aG9kIHVzZXMgdGhlICp1bml2ZXJzYWwgbmV3bGluZXMqIGFwcHJvYWNoIHRvCiAgIHNwbGl0dGluZyBsaW5lcy4gTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QKICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuCgogICBGb3IgZXhhbXBsZSwgYGAnYWIgY1xuXG5kZSBmZ1xya2xcclxuJy5zcGxpdGxpbmVzKClgYCByZXR1cm5zCiAgIGBgWydhYiBjJywgJycsICdkZSBmZycsICdrbCddYGAsIHdoaWxlIHRoZSBzYW1lIGNhbGwgd2l0aAogICBgYHNwbGl0bGluZXMoVHJ1ZSlgYCByZXR1cm5zIGBgWydhYiBjXG4nLCAnXG4nLCAnZGUgZmdccicsCiAgICdrbFxyXG4nXWBgLgoKICAgVW5saWtlIGBgc3BsaXQoKWBgIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzCiAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBhIHRlcm1pbmFsCiAgIGxpbmUgYnJlYWsgZG9lcyBub3QgcmVzdWx0IGluIGFuIGV4dHJhIGxpbmUuCgpzdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKQoKICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgKnByZWZpeCosIG90aGVyd2lzZQogICByZXR1cm4gYGBGYWxzZWBgLiAqcHJlZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHByZWZpeGVzIHRvIGxvb2sKICAgZm9yLiAgV2l0aCBvcHRpb25hbCAqc3RhcnQqLCB0ZXN0IHN0cmluZyBiZWdpbm5pbmcgYXQgdGhhdAogICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIHN0cmluZyBhdCB0aGF0CiAgIHBvc2l0aW9uLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqcHJlZml4Ki4KCnN0ci5zdHJpcChbY2hhcnNdKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nCiAgIGNoYXJhY3RlcnMgcmVtb3ZlZC4gVGhlICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUKICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhlCiAgICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gVGhlICpjaGFycyoKICAgYXJndW1lbnQgaXMgbm90IGEgcHJlZml4IG9yIHN1ZmZpeDsgcmF0aGVyLCBhbGwgY29tYmluYXRpb25zIG9mIGl0cwogICB2YWx1ZXMgYXJlIHN0cmlwcGVkOgoKICAgPj4+ICcgICBzcGFjaW91cyAgICcuc3RyaXAoKQogICAnc3BhY2lvdXMnCiAgID4+PiAnd3d3LmV4YW1wbGUuY29tJy5zdHJpcCgnY21vd3ouJykKICAgJ2V4YW1wbGUnCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LgoKc3RyLnN3YXBjYXNlKCkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0bwogICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuCgogICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KCnN0ci50aXRsZSgpCgogICBSZXR1cm4gYSB0aXRsZWNhc2VkIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSB3b3JkcyBzdGFydCB3aXRoIGFuCiAgIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbG93ZXJjYXNlLgoKICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYQogICB3b3JkIGFzIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBsZXR0ZXJzLiAgVGhlIGRlZmluaXRpb24gd29ya3MgaW4KICAgbWFueSBjb250ZXh0cyBidXQgaXQgbWVhbnMgdGhhdCBhcG9zdHJvcGhlcyBpbiBjb250cmFjdGlvbnMgYW5kCiAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSBkZXNpcmVkCiAgIHJlc3VsdDoKCiAgICAgID4+PiAidGhleSdyZSBiaWxsJ3MgZnJpZW5kcyBmcm9tIHRoZSBVSyIudGl0bGUoKQogICAgICAiVGhleSdSZSBCaWxsJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayIKCiAgIEEgd29ya2Fyb3VuZCBmb3IgYXBvc3Ryb3BoZXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHJlZ3VsYXIKICAgZXhwcmVzc2lvbnM6CgogICAgICA+Pj4gaW1wb3J0IHJlCiAgICAgID4+PiBkZWYgdGl0bGVjYXNlKHMpOgogICAgICAuLi4gICAgIHJldHVybiByZS5zdWIociJbQS1aYS16XSsoJ1tBLVphLXpdKyk/IiwKICAgICAgLi4uICAgICAgICAgICAgICAgICAgIGxhbWJkYSBtbzogbW8uZ3JvdXAoMClbMF0udXBwZXIoKSArCiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vLmdyb3VwKDApWzE6XS5sb3dlcigpLAogICAgICAuLi4gICAgICAgICAgICAgICAgICAgcykKICAgICAgLi4uCiAgICAgID4+PiB0aXRsZWNhc2UoInRoZXkncmUgYmlsbCdzIGZyaWVuZHMuIikKICAgICAgIlRoZXkncmUgQmlsbCdzIEZyaWVuZHMuIgoKICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCgpzdHIudHJhbnNsYXRlKHRhYmxlWywgZGVsZXRlY2hhcnNdKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZyBpbiB0aGUKICAgb3B0aW9uYWwgYXJndW1lbnQgKmRlbGV0ZWNoYXJzKiBhcmUgcmVtb3ZlZCwgYW5kIHRoZSByZW1haW5pbmcKICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLAogICB3aGljaCBtdXN0IGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAyNTYuCgogICBZb3UgY2FuIHVzZSB0aGUgYGBtYWtldHJhbnMoKWBgIGhlbHBlciBmdW5jdGlvbiBpbiB0aGUgYGBzdHJpbmdgYAogICBtb2R1bGUgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gdGFibGUuIEZvciBzdHJpbmcgb2JqZWN0cywgc2V0IHRoZQogICAqdGFibGUqIGFyZ3VtZW50IHRvIGBgTm9uZWBgIGZvciB0cmFuc2xhdGlvbnMgdGhhdCBvbmx5IGRlbGV0ZQogICBjaGFyYWN0ZXJzOgoKICAgPj4+ICdyZWFkIHRoaXMgc2hvcnQgdGV4dCcudHJhbnNsYXRlKE5vbmUsICdhZWlvdScpCiAgICdyZCB0aHMgc2hydCB0eHQnCgogICBOZXcgaW4gdmVyc2lvbiAyLjY6IFN1cHBvcnQgZm9yIGEgYGBOb25lYGAgKnRhYmxlKiBhcmd1bWVudC4KCiAgIEZvciBVbmljb2RlIG9iamVjdHMsIHRoZSBgYHRyYW5zbGF0ZSgpYGAgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCB0aGUKICAgb3B0aW9uYWwgKmRlbGV0ZWNoYXJzKiBhcmd1bWVudC4gIEluc3RlYWQsIGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZQogICAqcyogd2hlcmUgYWxsIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbgogICB0cmFuc2xhdGlvbiB0YWJsZSB3aGljaCBtdXN0IGJlIGEgbWFwcGluZyBvZiBVbmljb2RlIG9yZGluYWxzIHRvCiAgIFVuaWNvZGUgb3JkaW5hbHMsIFVuaWNvZGUgc3RyaW5ncyBvciBgYE5vbmVgYC4gVW5tYXBwZWQgY2hhcmFjdGVycwogICBhcmUgbGVmdCB1bnRvdWNoZWQuIENoYXJhY3RlcnMgbWFwcGVkIHRvIGBgTm9uZWBgIGFyZSBkZWxldGVkLgogICBOb3RlLCBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggaXMgdG8gY3JlYXRlIGEgY3VzdG9tIGNoYXJhY3RlcgogICBtYXBwaW5nIGNvZGVjIHVzaW5nIHRoZSBgYGNvZGVjc2BgIG1vZHVsZSAoc2VlIGBgZW5jb2RpbmdzLmNwMTI1MWBgCiAgIGZvciBhbiBleGFtcGxlKS4KCnN0ci51cHBlcigpCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdCiAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgYGBzdHIudXBwZXIoKS5pc3VwcGVyKClgYCBtaWdodAogICBiZSBgYEZhbHNlYGAgaWYgYGBzYGAgY29udGFpbnMgdW5jYXNlZCBjaGFyYWN0ZXJzIG9yIGlmIHRoZSBVbmljb2RlCiAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCAiTHUiIChMZXR0ZXIsCiAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLnpmaWxsKHdpZHRoKQoKICAgUmV0dXJuIHRoZSBudW1lcmljIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIHplcm9zIGluIGEgc3RyaW5nIG9mCiAgIGxlbmd0aCAqd2lkdGgqLiAgQSBzaWduIHByZWZpeCBpcyBoYW5kbGVkIGNvcnJlY3RseS4gIFRoZSBvcmlnaW5hbAogICBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGBsZW4ocylgYC4KCiAgIE5ldyBpbiB2ZXJzaW9uIDIuMi4yLgoKVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBwcmVzZW50IG9ubHkgb24gdW5pY29kZSBvYmplY3RzOgoKdW5pY29kZS5pc251bWVyaWMoKQoKICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGFyZSBvbmx5IG51bWVyaWMgY2hhcmFjdGVycyBpbiBTLAogICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBOdW1lcmljIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLAogICBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHRoZSBVbmljb2RlIG51bWVyaWMgdmFsdWUgcHJvcGVydHksCiAgIGUuZy4gVSsyMTU1LCBWVUxHQVIgRlJBQ1RJT04gT05FIEZJRlRILgoKdW5pY29kZS5pc2RlY2ltYWwoKQoKICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGFyZSBvbmx5IGRlY2ltYWwgY2hhcmFjdGVycyBpbiBTLAogICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBEZWNpbWFsIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLAogICBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBmb3JtIGRlY2ltYWwtcmFkaXggbnVtYmVycywKICAgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPLgpzDgAAAHN0cmluZy1tZXRob2Rzc4QeAAAKU3RyaW5nIGxpdGVyYWxzCioqKioqKioqKioqKioqKgoKU3RyaW5nIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOgoKICAgc3RyaW5nbGl0ZXJhbCAgIDo6PSBbc3RyaW5ncHJlZml4XShzaG9ydHN0cmluZyB8IGxvbmdzdHJpbmcpCiAgIHN0cmluZ3ByZWZpeCAgICA6Oj0gInIiIHwgInUiIHwgInVyIiB8ICJSIiB8ICJVIiB8ICJVUiIgfCAiVXIiIHwgInVSIgogICAgICAgICAgICAgICAgICAgIHwgImIiIHwgIkIiIHwgImJyIiB8ICJCciIgfCAiYlIiIHwgIkJSIgogICBzaG9ydHN0cmluZyAgICAgOjo9ICInIiBzaG9ydHN0cmluZ2l0ZW0qICInIiB8ICciJyBzaG9ydHN0cmluZ2l0ZW0qICciJwogICBsb25nc3RyaW5nICAgICAgOjo9ICInJyciIGxvbmdzdHJpbmdpdGVtKiAiJycnIgogICAgICAgICAgICAgICAgICB8ICciIiInIGxvbmdzdHJpbmdpdGVtKiAnIiIiJwogICBzaG9ydHN0cmluZ2l0ZW0gOjo9IHNob3J0c3RyaW5nY2hhciB8IGVzY2FwZXNlcQogICBsb25nc3RyaW5naXRlbSAgOjo9IGxvbmdzdHJpbmdjaGFyIHwgZXNjYXBlc2VxCiAgIHNob3J0c3RyaW5nY2hhciA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXCIgb3IgbmV3bGluZSBvciB0aGUgcXVvdGU+CiAgIGxvbmdzdHJpbmdjaGFyICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXCI+CiAgIGVzY2FwZXNlcSAgICAgICA6Oj0gIlwiIDxhbnkgQVNDSUkgY2hhcmFjdGVyPgoKT25lIHN5bnRhY3RpYyByZXN0cmljdGlvbiBub3QgaW5kaWNhdGVkIGJ5IHRoZXNlIHByb2R1Y3Rpb25zIGlzIHRoYXQKd2hpdGVzcGFjZSBpcyBub3QgYWxsb3dlZCBiZXR3ZWVuIHRoZSBgYHN0cmluZ3ByZWZpeGBgIGFuZCB0aGUgcmVzdCBvZgp0aGUgc3RyaW5nIGxpdGVyYWwuIFRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCBpcyBkZWZpbmVkIGJ5IHRoZQplbmNvZGluZyBkZWNsYXJhdGlvbjsgaXQgaXMgQVNDSUkgaWYgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gaXMgZ2l2ZW4KaW4gdGhlIHNvdXJjZSBmaWxlOyBzZWUgc2VjdGlvbiAqRW5jb2RpbmcgZGVjbGFyYXRpb25zKi4KCkluIHBsYWluIEVuZ2xpc2g6IFN0cmluZyBsaXRlcmFscyBjYW4gYmUgZW5jbG9zZWQgaW4gbWF0Y2hpbmcgc2luZ2xlCnF1b3RlcyAoYGAnYGApIG9yIGRvdWJsZSBxdW90ZXMgKGBgImBgKS4gIFRoZXkgY2FuIGFsc28gYmUgZW5jbG9zZWQgaW4KbWF0Y2hpbmcgZ3JvdXBzIG9mIHRocmVlIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzICh0aGVzZSBhcmUgZ2VuZXJhbGx5CnJlZmVycmVkIHRvIGFzICp0cmlwbGUtcXVvdGVkIHN0cmluZ3MqKS4gIFRoZSBiYWNrc2xhc2ggKGBgXGBgKQpjaGFyYWN0ZXIgaXMgdXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyB0aGF0IG90aGVyd2lzZSBoYXZlIGEgc3BlY2lhbAptZWFuaW5nLCBzdWNoIGFzIG5ld2xpbmUsIGJhY2tzbGFzaCBpdHNlbGYsIG9yIHRoZSBxdW90ZSBjaGFyYWN0ZXIuClN0cmluZyBsaXRlcmFscyBtYXkgb3B0aW9uYWxseSBiZSBwcmVmaXhlZCB3aXRoIGEgbGV0dGVyIGBgJ3InYGAgb3IKYGAnUidgYDsgc3VjaCBzdHJpbmdzIGFyZSBjYWxsZWQgKnJhdyBzdHJpbmdzKiBhbmQgdXNlIGRpZmZlcmVudCBydWxlcwpmb3IgaW50ZXJwcmV0aW5nIGJhY2tzbGFzaCBlc2NhcGUgc2VxdWVuY2VzLiAgQSBwcmVmaXggb2YgYGAndSdgYCBvcgpgYCdVJ2BgIG1ha2VzIHRoZSBzdHJpbmcgYSBVbmljb2RlIHN0cmluZy4gIFVuaWNvZGUgc3RyaW5ncyB1c2UgdGhlClVuaWNvZGUgY2hhcmFjdGVyIHNldCBhcyBkZWZpbmVkIGJ5IHRoZSBVbmljb2RlIENvbnNvcnRpdW0gYW5kIElTTwoxMDY0Ni4gIFNvbWUgYWRkaXRpb25hbCBlc2NhcGUgc2VxdWVuY2VzLCBkZXNjcmliZWQgYmVsb3csIGFyZQphdmFpbGFibGUgaW4gVW5pY29kZSBzdHJpbmdzLiBBIHByZWZpeCBvZiBgYCdiJ2BgIG9yIGBgJ0InYGAgaXMKaWdub3JlZCBpbiBQeXRob24gMjsgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGxpdGVyYWwgc2hvdWxkIGJlY29tZSBhCmJ5dGVzIGxpdGVyYWwgaW4gUHl0aG9uIDMgKGUuZy4gd2hlbiBjb2RlIGlzIGF1dG9tYXRpY2FsbHkgY29udmVydGVkCndpdGggMnRvMykuICBBIGBgJ3UnYGAgb3IgYGAnYidgYCBwcmVmaXggbWF5IGJlIGZvbGxvd2VkIGJ5IGFuIGBgJ3InYGAKcHJlZml4LgoKSW4gdHJpcGxlLXF1b3RlZCBzdHJpbmdzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZAooYW5kIGFyZSByZXRhaW5lZCksIGV4Y2VwdCB0aGF0IHRocmVlIHVuZXNjYXBlZCBxdW90ZXMgaW4gYSByb3cKdGVybWluYXRlIHRoZSBzdHJpbmcuICAoQSAicXVvdGUiIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuIHRoZQpzdHJpbmcsIGkuZS4gZWl0aGVyIGBgJ2BgIG9yIGBgImBgLikKClVubGVzcyBhbiBgYCdyJ2BgIG9yIGBgJ1InYGAgcHJlZml4IGlzIHByZXNlbnQsIGVzY2FwZSBzZXF1ZW5jZXMgaW4Kc3RyaW5ncyBhcmUgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHJ1bGVzIHNpbWlsYXIgdG8gdGhvc2UgdXNlZCBieQpTdGFuZGFyZCBDLiAgVGhlIHJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmU6CgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHwKKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09Kwp8IGBgXG5ld2xpbmVgYCAgICAgIHwgSWdub3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYFxcYGAgICAgICAgICAgICB8IEJhY2tzbGFzaCAoYGBcYGApICAgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGBcJ2BgICAgICAgICAgICAgfCBTaW5nbGUgcXVvdGUgKGBgJ2BgKSAgICAgICAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgXCJgYCAgICAgICAgICAgIHwgRG91YmxlIHF1b3RlIChgYCJgYCkgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYFxhYGAgICAgICAgICAgICB8IEFTQ0lJIEJlbGwgKEJFTCkgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGBcYmBgICAgICAgICAgICAgfCBBU0NJSSBCYWNrc3BhY2UgKEJTKSAgICAgICAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgXGZgYCAgICAgICAgICAgIHwgQVNDSUkgRm9ybWZlZWQgKEZGKSAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYFxuYGAgICAgICAgICAgICB8IEFTQ0lJIExpbmVmZWVkIChMRikgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGBcTntuYW1lfWBgICAgICAgfCBDaGFyYWN0ZXIgbmFtZWQgKm5hbWUqIGluIHRoZSAgICAgfCAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICB8IFVuaWNvZGUgZGF0YWJhc2UgKFVuaWNvZGUgb25seSkgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGBccmBgICAgICAgICAgICAgfCBBU0NJSSBDYXJyaWFnZSBSZXR1cm4gKENSKSAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgXHRgYCAgICAgICAgICAgIHwgQVNDSUkgSG9yaXpvbnRhbCBUYWIgKFRBQikgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYFx1eHh4eGBgICAgICAgICB8IENoYXJhY3RlciB3aXRoIDE2LWJpdCBoZXggdmFsdWUgICB8ICgxKSAgICAgfAp8ICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqIChVbmljb2RlIG9ubHkpICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYFxVeHh4eHh4eHhgYCAgICB8IENoYXJhY3RlciB3aXRoIDMyLWJpdCBoZXggdmFsdWUgICB8ICgyKSAgICAgfAp8ICAgICAgICAgICAgICAgICAgIHwgKnh4eHh4eHh4KiAoVW5pY29kZSBvbmx5KSAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYFx2YGAgICAgICAgICAgICB8IEFTQ0lJIFZlcnRpY2FsIFRhYiAoVlQpICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGBcb29vYGAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqb29vKiAgfCAoMyw1KSAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgXHhoaGBgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggaGV4IHZhbHVlICpoaCogICAgIHwgKDQsNSkgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKCk5vdGVzOgoKMS4gSW5kaXZpZHVhbCBjb2RlIHVuaXRzIHdoaWNoIGZvcm0gcGFydHMgb2YgYSBzdXJyb2dhdGUgcGFpciBjYW4gYmUKICAgZW5jb2RlZCB1c2luZyB0aGlzIGVzY2FwZSBzZXF1ZW5jZS4KCjIuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheSwgYnV0IGNoYXJhY3RlcnMKICAgb3V0c2lkZSB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApIHdpbGwgYmUgZW5jb2RlZCB1c2luZyBhCiAgIHN1cnJvZ2F0ZSBwYWlyIGlmIFB5dGhvbiBpcyBjb21waWxlZCB0byB1c2UgMTYtYml0IGNvZGUgdW5pdHMgKHRoZQogICBkZWZhdWx0KS4KCjMuIEFzIGluIFN0YW5kYXJkIEMsIHVwIHRvIHRocmVlIG9jdGFsIGRpZ2l0cyBhcmUgYWNjZXB0ZWQuCgo0LiBVbmxpa2UgaW4gU3RhbmRhcmQgQywgZXhhY3RseSB0d28gaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuCgo1LiBJbiBhIHN0cmluZyBsaXRlcmFsLCBoZXhhZGVjaW1hbCBhbmQgb2N0YWwgZXNjYXBlcyBkZW5vdGUgdGhlIGJ5dGUKICAgd2l0aCB0aGUgZ2l2ZW4gdmFsdWU7IGl0IGlzIG5vdCBuZWNlc3NhcnkgdGhhdCB0aGUgYnl0ZSBlbmNvZGVzIGEKICAgY2hhcmFjdGVyIGluIHRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldC4gSW4gYSBVbmljb2RlIGxpdGVyYWwsIHRoZXNlCiAgIGVzY2FwZXMgZGVub3RlIGEgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCgpVbmxpa2UgU3RhbmRhcmQgQywgYWxsIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBsZWZ0IGluIHRoZQpzdHJpbmcgdW5jaGFuZ2VkLCBpLmUuLCAqdGhlIGJhY2tzbGFzaCBpcyBsZWZ0IGluIHRoZSBzdHJpbmcqLiAgKFRoaXMKYmVoYXZpb3IgaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nOiBpZiBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgbWlzdHlwZWQsCnRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIG1vcmUgZWFzaWx5IHJlY29nbml6ZWQgYXMgYnJva2VuLikgIEl0IGlzIGFsc28KaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBtYXJrZWQgYXMgIihVbmljb2RlIG9ubHkpIgppbiB0aGUgdGFibGUgYWJvdmUgZmFsbCBpbnRvIHRoZSBjYXRlZ29yeSBvZiB1bnJlY29nbml6ZWQgZXNjYXBlcyBmb3IKbm9uLVVuaWNvZGUgc3RyaW5nIGxpdGVyYWxzLgoKV2hlbiBhbiBgYCdyJ2BgIG9yIGBgJ1InYGAgcHJlZml4IGlzIHByZXNlbnQsIGEgY2hhcmFjdGVyIGZvbGxvd2luZyBhCmJhY2tzbGFzaCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIHdpdGhvdXQgY2hhbmdlLCBhbmQgKmFsbApiYWNrc2xhc2hlcyBhcmUgbGVmdCBpbiB0aGUgc3RyaW5nKi4gIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nIGxpdGVyYWwKYGByIlxuImBgIGNvbnNpc3RzIG9mIHR3byBjaGFyYWN0ZXJzOiBhIGJhY2tzbGFzaCBhbmQgYSBsb3dlcmNhc2UKYGAnbidgYC4gIFN0cmluZyBxdW90ZXMgY2FuIGJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaCwgYnV0IHRoZQpiYWNrc2xhc2ggcmVtYWlucyBpbiB0aGUgc3RyaW5nOyBmb3IgZXhhbXBsZSwgYGByIlwiImBgIGlzIGEgdmFsaWQKc3RyaW5nIGxpdGVyYWwgY29uc2lzdGluZyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgZG91YmxlCnF1b3RlOyBgYHIiXCJgYCBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCAoZXZlbiBhIHJhdyBzdHJpbmcKY2Fubm90IGVuZCBpbiBhbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzKS4gIFNwZWNpZmljYWxseSwgKmEgcmF3CnN0cmluZyBjYW5ub3QgZW5kIGluIGEgc2luZ2xlIGJhY2tzbGFzaCogKHNpbmNlIHRoZSBiYWNrc2xhc2ggd291bGQKZXNjYXBlIHRoZSBmb2xsb3dpbmcgcXVvdGUgY2hhcmFjdGVyKS4gIE5vdGUgYWxzbyB0aGF0IGEgc2luZ2xlCmJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIG5ld2xpbmUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhvc2UgdHdvIGNoYXJhY3RlcnMKYXMgcGFydCBvZiB0aGUgc3RyaW5nLCAqbm90KiBhcyBhIGxpbmUgY29udGludWF0aW9uLgoKV2hlbiBhbiBgYCdyJ2BgIG9yIGBgJ1InYGAgcHJlZml4IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhCmBgJ3UnYGAgb3IgYGAnVSdgYCBwcmVmaXgsIHRoZW4gdGhlIGBgXHVYWFhYYGAgYW5kIGBgXFVYWFhYWFhYWGBgCmVzY2FwZSBzZXF1ZW5jZXMgYXJlIHByb2Nlc3NlZCB3aGlsZSAgKmFsbCBvdGhlciBiYWNrc2xhc2hlcyBhcmUgbGVmdAppbiB0aGUgc3RyaW5nKi4gRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgbGl0ZXJhbCBgYHVyIlx1MDA2MlxuImBgCmNvbnNpc3RzIG9mIHRocmVlIFVuaWNvZGUgY2hhcmFjdGVyczogJ0xBVElOIFNNQUxMIExFVFRFUiBCJywgJ1JFVkVSU0UKU09MSURVUycsIGFuZCAnTEFUSU4gU01BTEwgTEVUVEVSIE4nLiBCYWNrc2xhc2hlcyBjYW4gYmUgZXNjYXBlZCB3aXRoCmEgcHJlY2VkaW5nIGJhY2tzbGFzaDsgaG93ZXZlciwgYm90aCByZW1haW4gaW4gdGhlIHN0cmluZy4gIEFzIGEKcmVzdWx0LCBgYFx1WFhYWGBgIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG9ubHkgcmVjb2duaXplZCB3aGVuIHRoZXJlIGFyZQphbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzLgp0BwAAAHN0cmluZ3NzFgQAAApTdWJzY3JpcHRpb25zCioqKioqKioqKioqKioKCkEgc3Vic2NyaXB0aW9uIHNlbGVjdHMgYW4gaXRlbSBvZiBhIHNlcXVlbmNlIChzdHJpbmcsIHR1cGxlIG9yIGxpc3QpCm9yIG1hcHBpbmcgKGRpY3Rpb25hcnkpIG9iamVjdDoKCiAgIHN1YnNjcmlwdGlvbiA6Oj0gcHJpbWFyeSAiWyIgZXhwcmVzc2lvbl9saXN0ICJdIgoKVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSBzZXF1ZW5jZSBvciBtYXBwaW5nIHR5cGUuCgpJZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcsIHRoZSBleHByZXNzaW9uIGxpc3QgbXVzdCBldmFsdWF0ZSB0byBhbgpvYmplY3Qgd2hvc2UgdmFsdWUgaXMgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nLCBhbmQgdGhlCnN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwcGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXQKa2V5LiAgKFRoZSBleHByZXNzaW9uIGxpc3QgaXMgYSB0dXBsZSBleGNlcHQgaWYgaXQgaGFzIGV4YWN0bHkgb25lCml0ZW0uKQoKSWYgdGhlIHByaW1hcnkgaXMgYSBzZXF1ZW5jZSwgdGhlIGV4cHJlc3Npb24gKGxpc3QpIG11c3QgZXZhbHVhdGUgdG8gYQpwbGFpbiBpbnRlZ2VyLiAgSWYgdGhpcyB2YWx1ZSBpcyBuZWdhdGl2ZSwgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UKaXMgYWRkZWQgdG8gaXQgKHNvIHRoYXQsIGUuZy4sIGBgeFstMV1gYCBzZWxlY3RzIHRoZSBsYXN0IGl0ZW0gb2YKYGB4YGAuKSAgVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBsZXNzIHRoYW4KdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc2VxdWVuY2UsIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlCml0ZW0gd2hvc2UgaW5kZXggaXMgdGhhdCB2YWx1ZSAoY291bnRpbmcgZnJvbSB6ZXJvKS4KCkEgc3RyaW5nJ3MgaXRlbXMgYXJlIGNoYXJhY3RlcnMuICBBIGNoYXJhY3RlciBpcyBub3QgYSBzZXBhcmF0ZSBkYXRhCnR5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KdA0AAABzdWJzY3JpcHRpb25zc7kDAAAKVHJ1dGggVmFsdWUgVGVzdGluZwoqKioqKioqKioqKioqKioqKioqCgpBbnkgb2JqZWN0IGNhbiBiZSB0ZXN0ZWQgZm9yIHRydXRoIHZhbHVlLCBmb3IgdXNlIGluIGFuIGBgaWZgYCBvcgpgYHdoaWxlYGAgY29uZGl0aW9uIG9yIGFzIG9wZXJhbmQgb2YgdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyBiZWxvdy4gVGhlCmZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZmFsc2U6CgoqIGBgTm9uZWBgCgoqIGBgRmFsc2VgYAoKKiB6ZXJvIG9mIGFueSBudW1lcmljIHR5cGUsIGZvciBleGFtcGxlLCBgYDBgYCwgYGAwTGBgLCBgYDAuMGBgLAogIGBgMGpgYC4KCiogYW55IGVtcHR5IHNlcXVlbmNlLCBmb3IgZXhhbXBsZSwgYGAnJ2BgLCBgYCgpYGAsIGBgW11gYC4KCiogYW55IGVtcHR5IG1hcHBpbmcsIGZvciBleGFtcGxlLCBgYHt9YGAuCgoqIGluc3RhbmNlcyBvZiB1c2VyLWRlZmluZWQgY2xhc3NlcywgaWYgdGhlIGNsYXNzIGRlZmluZXMgYQogIGBgX19ub256ZXJvX18oKWBgIG9yIGBgX19sZW5fXygpYGAgbWV0aG9kLCB3aGVuIHRoYXQgbWV0aG9kIHJldHVybnMKICB0aGUgaW50ZWdlciB6ZXJvIG9yIGBgYm9vbGBgIHZhbHVlIGBgRmFsc2VgYC4gWzFdCgpBbGwgb3RoZXIgdmFsdWVzIGFyZSBjb25zaWRlcmVkIHRydWUgLS0tIHNvIG9iamVjdHMgb2YgbWFueSB0eXBlcyBhcmUKYWx3YXlzIHRydWUuCgpPcGVyYXRpb25zIGFuZCBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgQm9vbGVhbiByZXN1bHQgYWx3YXlzCnJldHVybiBgYDBgYCBvciBgYEZhbHNlYGAgZm9yIGZhbHNlIGFuZCBgYDFgYCBvciBgYFRydWVgYCBmb3IgdHJ1ZSwKdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQuIChJbXBvcnRhbnQgZXhjZXB0aW9uOiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zCmBgb3JgYCBhbmQgYGBhbmRgYCBhbHdheXMgcmV0dXJuIG9uZSBvZiB0aGVpciBvcGVyYW5kcy4pCnQFAAAAdHJ1dGhz4REAAApUaGUgYGB0cnlgYCBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqCgpUaGUgYGB0cnlgYCBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCBjb2RlCmZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6CgogICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdAogICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbKCJhcyIgfCAiLCIpIHRhcmdldF1dICI6IiBzdWl0ZSkrCiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdCiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZQoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uLApgYHRyeWBgLi4uYGBleGNlcHRgYC4uLmBgZmluYWxseWBgIGRpZCBub3Qgd29yay4gYGB0cnlgYC4uLmBgZXhjZXB0YGAKaGFkIHRvIGJlIG5lc3RlZCBpbiBgYHRyeWBgLi4uYGBmaW5hbGx5YGAuCgpUaGUgYGBleGNlcHRgYCBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW4Kbm8gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgYGB0cnlgYCBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzCmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIGBgdHJ5YGAgc3VpdGUsIGEgc2VhcmNoIGZvcgphbiBleGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdApjbGF1c2VzIGluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW4KZXhwcmVzc2lvbi1sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcwphbnkgZXhjZXB0aW9uLiAgRm9yIGFuIGV4Y2VwdCBjbGF1c2Ugd2l0aCBhbiBleHByZXNzaW9uLCB0aGF0CmV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlCnJlc3VsdGluZyBvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcwpjb21wYXRpYmxlIHdpdGggYW4gZXhjZXB0aW9uIGlmIGl0IGlzIHRoZSBjbGFzcyBvciBhIGJhc2UgY2xhc3Mgb2YgdGhlCmV4Y2VwdGlvbiBvYmplY3QsIG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGUKZXhjZXB0aW9uLgoKSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvbgpoYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suClsxXQoKSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2UKcmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkIGFuZAphIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbgp0aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlIGBgdHJ5YGAgc3RhdGVtZW50CnJhaXNlZCB0aGUgZXhjZXB0aW9uKS4KCldoZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvCnRoZSB0YXJnZXQgc3BlY2lmaWVkIGluIHRoYXQgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgYW5kIHRoZSBleGNlcHQKY2xhdXNlJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0IGNsYXVzZXMgbXVzdCBoYXZlIGFuCmV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyBibG9jayBpcyByZWFjaGVkLCBleGVjdXRpb24KY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC4gIChUaGlzIG1lYW5zIHRoYXQKaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLCBhbmQgdGhlIGV4Y2VwdGlvbgpvY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZSBvdXRlciBoYW5kbGVyIHdpbGwKbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLikKCkJlZm9yZSBhbiBleGNlcHQgY2xhdXNlJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlCmV4Y2VwdGlvbiBhcmUgYXNzaWduZWQgdG8gdGhyZWUgdmFyaWFibGVzIGluIHRoZSBgYHN5c2BgIG1vZHVsZToKYGBzeXMuZXhjX3R5cGVgYCByZWNlaXZlcyB0aGUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoZSBleGNlcHRpb247CmBgc3lzLmV4Y192YWx1ZWBgIHJlY2VpdmVzIHRoZSBleGNlcHRpb24ncyBwYXJhbWV0ZXI7CmBgc3lzLmV4Y190cmFjZWJhY2tgYCByZWNlaXZlcyBhIHRyYWNlYmFjayBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUKc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlIHByb2dyYW0gd2hlcmUKdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gVGhlc2UgZGV0YWlscyBhcmUgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUKYGBzeXMuZXhjX2luZm8oKWBgIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIGEgdHVwbGUgYGAoZXhjX3R5cGUsCmV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjaylgYC4gIFVzZSBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZXMgaXMKZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGlzIGZ1bmN0aW9uLCBzaW5jZSB0aGVpciB1c2UgaXMgdW5zYWZlIGluIGEKdGhyZWFkZWQgcHJvZ3JhbS4gIEFzIG9mIFB5dGhvbiAxLjUsIHRoZSB2YXJpYWJsZXMgYXJlIHJlc3RvcmVkIHRvCnRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZyBmcm9tIGEgZnVuY3Rpb24KdGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi4KClRoZSBvcHRpb25hbCBgYGVsc2VgYCBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmYKdGhlIGVuZCBvZiB0aGUgYGB0cnlgYCBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSBgYGVsc2VgYCBjbGF1c2UKYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgYGBleGNlcHRgYCBjbGF1c2VzLgoKSWYgYGBmaW5hbGx5YGAgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgJ2NsZWFudXAnIGhhbmRsZXIuICBUaGUKYGB0cnlgYCBjbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgYGBleGNlcHRgYCBhbmQgYGBlbHNlYGAKY2xhdXNlcy4gIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QKaGFuZGxlZCwgdGhlIGV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlIGBgZmluYWxseWBgIGNsYXVzZSBpcwpleGVjdXRlZC4gIElmIHRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uLCBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZApvZiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlLiBJZiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlIHJhaXNlcyBhbm90aGVyCmV4Y2VwdGlvbiBvciBleGVjdXRlcyBhIGBgcmV0dXJuYGAgb3IgYGBicmVha2BgIHN0YXRlbWVudCwgdGhlIHNhdmVkCmV4Y2VwdGlvbiBpcyBkaXNjYXJkZWQ6CgogICBkZWYgZigpOgogICAgICAgdHJ5OgogICAgICAgICAgIDEvMAogICAgICAgZmluYWxseToKICAgICAgICAgICByZXR1cm4gNDIKCiAgID4+PiBmKCkKICAgNDIKClRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmcKZXhlY3V0aW9uIG9mIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuCgpXaGVuIGEgYGByZXR1cm5gYCwgYGBicmVha2BgIG9yIGBgY29udGludWVgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4KdGhlIGBgdHJ5YGAgc3VpdGUgb2YgYSBgYHRyeWBgLi4uYGBmaW5hbGx5YGAgc3RhdGVtZW50LCB0aGUKYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGFsc28gZXhlY3V0ZWQgJ29uIHRoZSB3YXkgb3V0LicgQSBgYGNvbnRpbnVlYGAKc3RhdGVtZW50IGlzIGlsbGVnYWwgaW4gdGhlIGBgZmluYWxseWBgIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYQpwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlCmxpZnRlZCBpbiB0aGUgZnV0dXJlKS4KCkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvbgoqRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgYGByYWlzZWBgIHN0YXRlbWVudCB0bwpnZW5lcmF0ZSBleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki4KdAMAAAB0cnlzWJcAAApUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkKKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8gUHl0aG9uLiAgRXh0ZW5zaW9uCm1vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlCmltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2YKUHl0aG9uIG1heSBhZGQgdHlwZXMgdG8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuLCByYXRpb25hbCBudW1iZXJzLAplZmZpY2llbnRseSBzdG9yZWQgYXJyYXlzIG9mIGludGVnZXJzLCBldGMuKS4KClNvbWUgb2YgdGhlIHR5cGUgZGVzY3JpcHRpb25zIGJlbG93IGNvbnRhaW4gYSBwYXJhZ3JhcGggbGlzdGluZwonc3BlY2lhbCBhdHRyaWJ1dGVzLicgIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlCmltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyIGRlZmluaXRpb24KbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgoKTm9uZQogICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpcwogICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZSBgYE5vbmVgYC4KICAgSXQgaXMgdXNlZCB0byBzaWduaWZ5IHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gbWFueSBzaXR1YXRpb25zLAogICBlLmcuLCBpdCBpcyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGV4cGxpY2l0bHkgcmV0dXJuCiAgIGFueXRoaW5nLiBJdHMgdHJ1dGggdmFsdWUgaXMgZmFsc2UuCgpOb3RJbXBsZW1lbnRlZAogICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpcwogICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZQogICBgYE5vdEltcGxlbWVudGVkYGAuIE51bWVyaWMgbWV0aG9kcyBhbmQgcmljaCBjb21wYXJpc29uIG1ldGhvZHMgbWF5CiAgIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZXkgZG8gbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciB0aGUKICAgb3BlcmFuZHMgcHJvdmlkZWQuICAoVGhlIGludGVycHJldGVyIHdpbGwgdGhlbiB0cnkgdGhlIHJlZmxlY3RlZAogICBvcGVyYXRpb24sIG9yIHNvbWUgb3RoZXIgZmFsbGJhY2ssIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0b3IuKSAgSXRzCiAgIHRydXRoIHZhbHVlIGlzIHRydWUuCgpFbGxpcHNpcwogICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpcwogICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZQogICBgYEVsbGlwc2lzYGAuIEl0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIHRoZSBgYC4uLmBgCiAgIHN5bnRheCBpbiBhIHNsaWNlLiAgSXRzIHRydXRoIHZhbHVlIGlzIHRydWUuCgpgYG51bWJlcnMuTnVtYmVyYGAKICAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgbnVtZXJpYyBsaXRlcmFscyBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cyBieQogICBhcml0aG1ldGljIG9wZXJhdG9ycyBhbmQgYXJpdGhtZXRpYyBidWlsdC1pbiBmdW5jdGlvbnMuICBOdW1lcmljCiAgIG9iamVjdHMgYXJlIGltbXV0YWJsZTsgb25jZSBjcmVhdGVkIHRoZWlyIHZhbHVlIG5ldmVyIGNoYW5nZXMuCiAgIFB5dGhvbiBudW1iZXJzIGFyZSBvZiBjb3Vyc2Ugc3Ryb25nbHkgcmVsYXRlZCB0byBtYXRoZW1hdGljYWwKICAgbnVtYmVycywgYnV0IHN1YmplY3QgdG8gdGhlIGxpbWl0YXRpb25zIG9mIG51bWVyaWNhbCByZXByZXNlbnRhdGlvbgogICBpbiBjb21wdXRlcnMuCgogICBQeXRob24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmQKICAgY29tcGxleCBudW1iZXJzOgoKICAgYGBudW1iZXJzLkludGVncmFsYGAKICAgICAgVGhlc2UgcmVwcmVzZW50IGVsZW1lbnRzIGZyb20gdGhlIG1hdGhlbWF0aWNhbCBzZXQgb2YgaW50ZWdlcnMKICAgICAgKHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSkuCgogICAgICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgaW50ZWdlcnM6CgogICAgICBQbGFpbiBpbnRlZ2VycwogICAgICAgICBUaGVzZSByZXByZXNlbnQgbnVtYmVycyBpbiB0aGUgcmFuZ2UgLTIxNDc0ODM2NDggdGhyb3VnaAogICAgICAgICAyMTQ3NDgzNjQ3LiAoVGhlIHJhbmdlIG1heSBiZSBsYXJnZXIgb24gbWFjaGluZXMgd2l0aCBhCiAgICAgICAgIGxhcmdlciBuYXR1cmFsIHdvcmQgc2l6ZSwgYnV0IG5vdCBzbWFsbGVyLikgIFdoZW4gdGhlIHJlc3VsdAogICAgICAgICBvZiBhbiBvcGVyYXRpb24gd291bGQgZmFsbCBvdXRzaWRlIHRoaXMgcmFuZ2UsIHRoZSByZXN1bHQgaXMKICAgICAgICAgbm9ybWFsbHkgcmV0dXJuZWQgYXMgYSBsb25nIGludGVnZXIgKGluIHNvbWUgY2FzZXMsIHRoZQogICAgICAgICBleGNlcHRpb24gYGBPdmVyZmxvd0Vycm9yYGAgaXMgcmFpc2VkIGluc3RlYWQpLiAgRm9yIHRoZQogICAgICAgICBwdXJwb3NlIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnMsIGludGVnZXJzIGFyZSBhc3N1bWVkIHRvCiAgICAgICAgIGhhdmUgYSBiaW5hcnksIDIncyBjb21wbGVtZW50IG5vdGF0aW9uIHVzaW5nIDMyIG9yIG1vcmUgYml0cywKICAgICAgICAgYW5kIGhpZGluZyBubyBiaXRzIGZyb20gdGhlIHVzZXIgKGkuZS4sIGFsbCA0Mjk0OTY3Mjk2CiAgICAgICAgIGRpZmZlcmVudCBiaXQgcGF0dGVybnMgY29ycmVzcG9uZCB0byBkaWZmZXJlbnQgdmFsdWVzKS4KCiAgICAgIExvbmcgaW50ZWdlcnMKICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gYW4gdW5saW1pdGVkIHJhbmdlLCBzdWJqZWN0IHRvCiAgICAgICAgIGF2YWlsYWJsZSAodmlydHVhbCkgbWVtb3J5IG9ubHkuICBGb3IgdGhlIHB1cnBvc2Ugb2Ygc2hpZnQKICAgICAgICAgYW5kIG1hc2sgb3BlcmF0aW9ucywgYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaXMgYXNzdW1lZCwgYW5kCiAgICAgICAgIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGEgdmFyaWFudCBvZiAyJ3MKICAgICAgICAgY29tcGxlbWVudCB3aGljaCBnaXZlcyB0aGUgaWxsdXNpb24gb2YgYW4gaW5maW5pdGUgc3RyaW5nIG9mCiAgICAgICAgIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuCgogICAgICBCb29sZWFucwogICAgICAgICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d28KICAgICAgICAgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZSBhcmUgdGhlIG9ubHkKICAgICAgICAgQm9vbGVhbiBvYmplY3RzLiBUaGUgQm9vbGVhbiB0eXBlIGlzIGEgc3VidHlwZSBvZiBwbGFpbgogICAgICAgICBpbnRlZ2VycywgYW5kIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCBhbmQgMSwKICAgICAgICAgcmVzcGVjdGl2ZWx5LCBpbiBhbG1vc3QgYWxsIGNvbnRleHRzLCB0aGUgZXhjZXB0aW9uIGJlaW5nCiAgICAgICAgIHRoYXQgd2hlbiBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIHRoZSBzdHJpbmdzIGBgIkZhbHNlImBgIG9yCiAgICAgICAgIGBgIlRydWUiYGAgYXJlIHJldHVybmVkLCByZXNwZWN0aXZlbHkuCgogICAgICBUaGUgcnVsZXMgZm9yIGludGVnZXIgcmVwcmVzZW50YXRpb24gYXJlIGludGVuZGVkIHRvIGdpdmUgdGhlCiAgICAgIG1vc3QgbWVhbmluZ2Z1bCBpbnRlcnByZXRhdGlvbiBvZiBzaGlmdCBhbmQgbWFzayBvcGVyYXRpb25zCiAgICAgIGludm9sdmluZyBuZWdhdGl2ZSBpbnRlZ2VycyBhbmQgdGhlIGxlYXN0IHN1cnByaXNlcyB3aGVuCiAgICAgIHN3aXRjaGluZyBiZXR3ZWVuIHRoZSBwbGFpbiBhbmQgbG9uZyBpbnRlZ2VyIGRvbWFpbnMuICBBbnkKICAgICAgb3BlcmF0aW9uLCBpZiBpdCB5aWVsZHMgYSByZXN1bHQgaW4gdGhlIHBsYWluIGludGVnZXIgZG9tYWluLAogICAgICB3aWxsIHlpZWxkIHRoZSBzYW1lIHJlc3VsdCBpbiB0aGUgbG9uZyBpbnRlZ2VyIGRvbWFpbiBvciB3aGVuCiAgICAgIHVzaW5nIG1peGVkIG9wZXJhbmRzLiAgVGhlIHN3aXRjaCBiZXR3ZWVuIGRvbWFpbnMgaXMgdHJhbnNwYXJlbnQKICAgICAgdG8gdGhlIHByb2dyYW1tZXIuCgogICBgYG51bWJlcnMuUmVhbGBgIChgYGZsb2F0YGApCiAgICAgIFRoZXNlIHJlcHJlc2VudCBtYWNoaW5lLWxldmVsIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQKICAgICAgbnVtYmVycy4gWW91IGFyZSBhdCB0aGUgbWVyY3kgb2YgdGhlIHVuZGVybHlpbmcgbWFjaGluZQogICAgICBhcmNoaXRlY3R1cmUgKGFuZCBDIG9yIEphdmEgaW1wbGVtZW50YXRpb24pIGZvciB0aGUgYWNjZXB0ZWQKICAgICAgcmFuZ2UgYW5kIGhhbmRsaW5nIG9mIG92ZXJmbG93LiBQeXRob24gZG9lcyBub3Qgc3VwcG9ydCBzaW5nbGUtCiAgICAgIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzOyB0aGUgc2F2aW5ncyBpbiBwcm9jZXNzb3IgYW5kCiAgICAgIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yIHVzaW5nIHRoZXNlIGlzCiAgICAgIGR3YXJmZWQgYnkgdGhlIG92ZXJoZWFkIG9mIHVzaW5nIG9iamVjdHMgaW4gUHl0aG9uLCBzbyB0aGVyZSBpcwogICAgICBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgZmxvYXRpbmcKICAgICAgcG9pbnQgbnVtYmVycy4KCiAgIGBgbnVtYmVycy5Db21wbGV4YGAKICAgICAgVGhlc2UgcmVwcmVzZW50IGNvbXBsZXggbnVtYmVycyBhcyBhIHBhaXIgb2YgbWFjaGluZS1sZXZlbAogICAgICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBUaGUgc2FtZSBjYXZlYXRzIGFwcGx5CiAgICAgIGFzIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGEKICAgICAgY29tcGxleCBudW1iZXIgYGB6YGAgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSByZWFkLW9ubHkKICAgICAgYXR0cmlidXRlcyBgYHoucmVhbGBgIGFuZCBgYHouaW1hZ2BgLgoKU2VxdWVuY2VzCiAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgb3JkZXJlZCBzZXRzIGluZGV4ZWQgYnkgbm9uLW5lZ2F0aXZlCiAgIG51bWJlcnMuIFRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGAgcmV0dXJucyB0aGUgbnVtYmVyIG9mCiAgIGl0ZW1zIG9mIGEgc2VxdWVuY2UuIFdoZW4gdGhlIGxlbmd0aCBvZiBhIHNlcXVlbmNlIGlzICpuKiwgdGhlCiAgIGluZGV4IHNldCBjb250YWlucyB0aGUgbnVtYmVycyAwLCAxLCAuLi4sICpuKi0xLiAgSXRlbSAqaSogb2YKICAgc2VxdWVuY2UgKmEqIGlzIHNlbGVjdGVkIGJ5IGBgYVtpXWBgLgoKICAgU2VxdWVuY2VzIGFsc28gc3VwcG9ydCBzbGljaW5nOiBgYGFbaTpqXWBgIHNlbGVjdHMgYWxsIGl0ZW1zIHdpdGgKICAgaW5kZXggKmsqIHN1Y2ggdGhhdCAqaSogYGA8PWBgICprKiBgYDxgYCAqaiouICBXaGVuIHVzZWQgYXMgYW4KICAgZXhwcmVzc2lvbiwgYSBzbGljZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBUaGlzIGltcGxpZXMKICAgdGhhdCB0aGUgaW5kZXggc2V0IGlzIHJlbnVtYmVyZWQgc28gdGhhdCBpdCBzdGFydHMgYXQgMC4KCiAgIFNvbWUgc2VxdWVuY2VzIGFsc28gc3VwcG9ydCAiZXh0ZW5kZWQgc2xpY2luZyIgd2l0aCBhIHRoaXJkICJzdGVwIgogICBwYXJhbWV0ZXI6IGBgYVtpOmo6a11gYCBzZWxlY3RzIGFsbCBpdGVtcyBvZiAqYSogd2l0aCBpbmRleCAqeCoKICAgd2hlcmUgYGB4ID0gaSArIG4qa2BgLCAqbiogYGA+PWBgIGBgMGBgIGFuZCAqaSogYGA8PWBgICp4KiBgYDxgYAogICAqaiouCgogICBTZXF1ZW5jZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG11dGFiaWxpdHk6CgogICBJbW11dGFibGUgc2VxdWVuY2VzCiAgICAgIEFuIG9iamVjdCBvZiBhbiBpbW11dGFibGUgc2VxdWVuY2UgdHlwZSBjYW5ub3QgY2hhbmdlIG9uY2UgaXQgaXMKICAgICAgY3JlYXRlZC4gIChJZiB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cywKICAgICAgdGhlc2Ugb3RoZXIgb2JqZWN0cyBtYXkgYmUgbXV0YWJsZSBhbmQgbWF5IGJlIGNoYW5nZWQ7IGhvd2V2ZXIsCiAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbiBpbW11dGFibGUKICAgICAgb2JqZWN0IGNhbm5vdCBjaGFuZ2UuKQoKICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlczoKCiAgICAgIFN0cmluZ3MKICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgc3RyaW5nIGFyZSBjaGFyYWN0ZXJzLiAgVGhlcmUgaXMgbm8gc2VwYXJhdGUKICAgICAgICAgY2hhcmFjdGVyIHR5cGU7IGEgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nIG9mIG9uZQogICAgICAgICBpdGVtLiBDaGFyYWN0ZXJzIHJlcHJlc2VudCAoYXQgbGVhc3QpIDgtYml0IGJ5dGVzLiAgVGhlCiAgICAgICAgIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYGNocigpYGAgYW5kIGBgb3JkKClgYCBjb252ZXJ0IGJldHdlZW4KICAgICAgICAgY2hhcmFjdGVycyBhbmQgbm9ubmVnYXRpdmUgaW50ZWdlcnMgcmVwcmVzZW50aW5nIHRoZSBieXRlCiAgICAgICAgIHZhbHVlcy4gIEJ5dGVzIHdpdGggdGhlIHZhbHVlcyAwLTEyNyB1c3VhbGx5IHJlcHJlc2VudCB0aGUKICAgICAgICAgY29ycmVzcG9uZGluZyBBU0NJSSB2YWx1ZXMsIGJ1dCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdmFsdWVzCiAgICAgICAgIGlzIHVwIHRvIHRoZSBwcm9ncmFtLiAgVGhlIHN0cmluZyBkYXRhIHR5cGUgaXMgYWxzbyB1c2VkIHRvCiAgICAgICAgIHJlcHJlc2VudCBhcnJheXMgb2YgYnl0ZXMsIGUuZy4sIHRvIGhvbGQgZGF0YSByZWFkIGZyb20gYQogICAgICAgICBmaWxlLgoKICAgICAgICAgKE9uIHN5c3RlbXMgd2hvc2UgbmF0aXZlIGNoYXJhY3RlciBzZXQgaXMgbm90IEFTQ0lJLCBzdHJpbmdzCiAgICAgICAgIG1heSB1c2UgRUJDRElDIGluIHRoZWlyIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBwcm92aWRlZCB0aGUKICAgICAgICAgZnVuY3Rpb25zIGBgY2hyKClgYCBhbmQgYGBvcmQoKWBgIGltcGxlbWVudCBhIG1hcHBpbmcgYmV0d2VlbgogICAgICAgICBBU0NJSSBhbmQgRUJDRElDLCBhbmQgc3RyaW5nIGNvbXBhcmlzb24gcHJlc2VydmVzIHRoZSBBU0NJSQogICAgICAgICBvcmRlci4gT3IgcGVyaGFwcyBzb21lb25lIGNhbiBwcm9wb3NlIGEgYmV0dGVyIHJ1bGU/KQoKICAgICAgVW5pY29kZQogICAgICAgICBUaGUgaXRlbXMgb2YgYSBVbmljb2RlIG9iamVjdCBhcmUgVW5pY29kZSBjb2RlIHVuaXRzLiAgQQogICAgICAgICBVbmljb2RlIGNvZGUgdW5pdCBpcyByZXByZXNlbnRlZCBieSBhIFVuaWNvZGUgb2JqZWN0IG9mIG9uZQogICAgICAgICBpdGVtIGFuZCBjYW4gaG9sZCBlaXRoZXIgYSAxNi1iaXQgb3IgMzItYml0IHZhbHVlCiAgICAgICAgIHJlcHJlc2VudGluZyBhIFVuaWNvZGUgb3JkaW5hbCAodGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZQogICAgICAgICBvcmRpbmFsIGlzIGdpdmVuIGluIGBgc3lzLm1heHVuaWNvZGVgYCwgYW5kIGRlcGVuZHMgb24gaG93CiAgICAgICAgIFB5dGhvbiBpcyBjb25maWd1cmVkIGF0IGNvbXBpbGUgdGltZSkuICBTdXJyb2dhdGUgcGFpcnMgbWF5CiAgICAgICAgIGJlIHByZXNlbnQgaW4gdGhlIFVuaWNvZGUgb2JqZWN0LCBhbmQgd2lsbCBiZSByZXBvcnRlZCBhcyB0d28KICAgICAgICAgc2VwYXJhdGUgaXRlbXMuICBUaGUgYnVpbHQtaW4gZnVuY3Rpb25zIGBgdW5pY2hyKClgYCBhbmQKICAgICAgICAgYGBvcmQoKWBgIGNvbnZlcnQgYmV0d2VlbiBjb2RlIHVuaXRzIGFuZCBub25uZWdhdGl2ZSBpbnRlZ2VycwogICAgICAgICByZXByZXNlbnRpbmcgdGhlIFVuaWNvZGUgb3JkaW5hbHMgYXMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZQogICAgICAgICBTdGFuZGFyZCAzLjAuIENvbnZlcnNpb24gZnJvbSBhbmQgdG8gb3RoZXIgZW5jb2RpbmdzIGFyZQogICAgICAgICBwb3NzaWJsZSB0aHJvdWdoIHRoZSBVbmljb2RlIG1ldGhvZCBgYGVuY29kZSgpYGAgYW5kIHRoZQogICAgICAgICBidWlsdC1pbiBmdW5jdGlvbiBgYHVuaWNvZGUoKWBgLgoKICAgICAgVHVwbGVzCiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuIFR1cGxlcyBvZgogICAgICAgICB0d28gb3IgbW9yZSBpdGVtcyBhcmUgZm9ybWVkIGJ5IGNvbW1hLXNlcGFyYXRlZCBsaXN0cyBvZgogICAgICAgICBleHByZXNzaW9ucy4gIEEgdHVwbGUgb2Ygb25lIGl0ZW0gKGEgJ3NpbmdsZXRvbicpIGNhbiBiZQogICAgICAgICBmb3JtZWQgYnkgYWZmaXhpbmcgYSBjb21tYSB0byBhbiBleHByZXNzaW9uIChhbiBleHByZXNzaW9uIGJ5CiAgICAgICAgIGl0c2VsZiBkb2VzIG5vdCBjcmVhdGUgYSB0dXBsZSwgc2luY2UgcGFyZW50aGVzZXMgbXVzdCBiZQogICAgICAgICB1c2FibGUgZm9yIGdyb3VwaW5nIG9mIGV4cHJlc3Npb25zKS4gIEFuIGVtcHR5IHR1cGxlIGNhbiBiZQogICAgICAgICBmb3JtZWQgYnkgYW4gZW1wdHkgcGFpciBvZiBwYXJlbnRoZXNlcy4KCiAgIE11dGFibGUgc2VxdWVuY2VzCiAgICAgIE11dGFibGUgc2VxdWVuY2VzIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUKICAgICAgc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mCiAgICAgIGFzc2lnbm1lbnQgYW5kIGBgZGVsYGAgKGRlbGV0ZSkgc3RhdGVtZW50cy4KCiAgICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzOgoKICAgICAgTGlzdHMKICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgbGlzdCBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiAgTGlzdHMgYXJlCiAgICAgICAgIGZvcm1lZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaW4KICAgICAgICAgc3F1YXJlIGJyYWNrZXRzLiAoTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBzcGVjaWFsIGNhc2VzIG5lZWRlZAogICAgICAgICB0byBmb3JtIGxpc3RzIG9mIGxlbmd0aCAwIG9yIDEuKQoKICAgICAgQnl0ZSBBcnJheXMKICAgICAgICAgQSBieXRlYXJyYXkgb2JqZWN0IGlzIGEgbXV0YWJsZSBhcnJheS4gVGhleSBhcmUgY3JlYXRlZCBieQogICAgICAgICB0aGUgYnVpbHQtaW4gYGBieXRlYXJyYXkoKWBgIGNvbnN0cnVjdG9yLiAgQXNpZGUgZnJvbSBiZWluZwogICAgICAgICBtdXRhYmxlIChhbmQgaGVuY2UgdW5oYXNoYWJsZSksIGJ5dGUgYXJyYXlzIG90aGVyd2lzZSBwcm92aWRlCiAgICAgICAgIHRoZSBzYW1lIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbGl0eSBhcyBpbW11dGFibGUgYnl0ZXMKICAgICAgICAgb2JqZWN0cy4KCiAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlIGBgYXJyYXlgYCBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGV4YW1wbGUgb2YKICAgICAgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUuCgpTZXQgdHlwZXMKICAgVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGUKICAgb2JqZWN0cy4gQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiBIb3dldmVyLAogICB0aGV5IGNhbiBiZSBpdGVyYXRlZCBvdmVyLCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgbGVuKClgYAogICByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBzZXQuIENvbW1vbiB1c2VzIGZvciBzZXRzIGFyZSBmYXN0CiAgIG1lbWJlcnNoaXAgdGVzdGluZywgcmVtb3ZpbmcgZHVwbGljYXRlcyBmcm9tIGEgc2VxdWVuY2UsIGFuZAogICBjb21wdXRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBpbnRlcnNlY3Rpb24sIHVuaW9uLAogICBkaWZmZXJlbmNlLCBhbmQgc3ltbWV0cmljIGRpZmZlcmVuY2UuCgogICBGb3Igc2V0IGVsZW1lbnRzLCB0aGUgc2FtZSBpbW11dGFiaWxpdHkgcnVsZXMgYXBwbHkgYXMgZm9yCiAgIGRpY3Rpb25hcnkga2V5cy4gTm90ZSB0aGF0IG51bWVyaWMgdHlwZXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvcgogICBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWwgKGUuZy4sIGBgMWBgIGFuZAogICBgYDEuMGBgKSwgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LgoKICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczoKCiAgIFNldHMKICAgICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluCiAgICAgIGBgc2V0KClgYCBjb25zdHJ1Y3RvciBhbmQgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgYnkgc2V2ZXJhbAogICAgICBtZXRob2RzLCBzdWNoIGFzIGBgYWRkKClgYC4KCiAgIEZyb3plbiBzZXRzCiAgICAgIFRoZXNlIHJlcHJlc2VudCBhbiBpbW11dGFibGUgc2V0LiAgVGhleSBhcmUgY3JlYXRlZCBieSB0aGUKICAgICAgYnVpbHQtaW4gYGBmcm96ZW5zZXQoKWBgIGNvbnN0cnVjdG9yLiAgQXMgYSBmcm96ZW5zZXQgaXMKICAgICAgaW1tdXRhYmxlIGFuZCAqaGFzaGFibGUqLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mCiAgICAgIGFub3RoZXIgc2V0LCBvciBhcyBhIGRpY3Rpb25hcnkga2V5LgoKTWFwcGluZ3MKICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBhcmJpdHJhcnkgaW5kZXgKICAgc2V0cy4gVGhlIHN1YnNjcmlwdCBub3RhdGlvbiBgYGFba11gYCBzZWxlY3RzIHRoZSBpdGVtIGluZGV4ZWQgYnkKICAgYGBrYGAgZnJvbSB0aGUgbWFwcGluZyBgYGFgYDsgdGhpcyBjYW4gYmUgdXNlZCBpbiBleHByZXNzaW9ucyBhbmQKICAgYXMgdGhlIHRhcmdldCBvZiBhc3NpZ25tZW50cyBvciBgYGRlbGBgIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pbgogICBmdW5jdGlvbiBgYGxlbigpYGAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgbWFwcGluZy4KCiAgIFRoZXJlIGlzIGN1cnJlbnRseSBhIHNpbmdsZSBpbnRyaW5zaWMgbWFwcGluZyB0eXBlOgoKICAgRGljdGlvbmFyaWVzCiAgICAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgbmVhcmx5CiAgICAgIGFyYml0cmFyeSB2YWx1ZXMuICBUaGUgb25seSB0eXBlcyBvZiB2YWx1ZXMgbm90IGFjY2VwdGFibGUgYXMKICAgICAga2V5cyBhcmUgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMgb3IgZGljdGlvbmFyaWVzIG9yIG90aGVyCiAgICAgIG11dGFibGUgdHlwZXMgdGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkgb2JqZWN0CiAgICAgIGlkZW50aXR5LCB0aGUgcmVhc29uIGJlaW5nIHRoYXQgdGhlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZgogICAgICBkaWN0aW9uYXJpZXMgcmVxdWlyZXMgYSBrZXkncyBoYXNoIHZhbHVlIHRvIHJlbWFpbiBjb25zdGFudC4KICAgICAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpYwogICAgICBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCBgYDFgYCBhbmQKICAgICAgYGAxLjBgYCkgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZQogICAgICBkaWN0aW9uYXJ5IGVudHJ5LgoKICAgICAgRGljdGlvbmFyaWVzIGFyZSBtdXRhYmxlOyB0aGV5IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSBgYHsuLi59YGAKICAgICAgbm90YXRpb24gKHNlZSBzZWN0aW9uICpEaWN0aW9uYXJ5IGRpc3BsYXlzKikuCgogICAgICBUaGUgZXh0ZW5zaW9uIG1vZHVsZXMgYGBkYm1gYCwgYGBnZGJtYGAsIGFuZCBgYGJzZGRiYGAgcHJvdmlkZQogICAgICBhZGRpdGlvbmFsIGV4YW1wbGVzIG9mIG1hcHBpbmcgdHlwZXMuCgpDYWxsYWJsZSB0eXBlcwogICBUaGVzZSBhcmUgdGhlIHR5cGVzIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdGlvbiAoc2VlCiAgIHNlY3Rpb24gKkNhbGxzKikgY2FuIGJlIGFwcGxpZWQ6CgogICBVc2VyLWRlZmluZWQgZnVuY3Rpb25zCiAgICAgIEEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGEgZnVuY3Rpb24KICAgICAgZGVmaW5pdGlvbiAoc2VlIHNlY3Rpb24gKkZ1bmN0aW9uIGRlZmluaXRpb25zKikuICBJdCBzaG91bGQgYmUKICAgICAgY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcwogICAgICBhcyB0aGUgZnVuY3Rpb24ncyBmb3JtYWwgcGFyYW1ldGVyIGxpc3QuCgogICAgICBTcGVjaWFsIGF0dHJpYnV0ZXM6CgogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKICAgICAgfCBBdHRyaWJ1dGUgICAgICAgICAgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8CiAgICAgICs9PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09KwogICAgICB8IGBgZnVuY19kb2NgYCAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uJ3MgZG9jdW1lbnRhdGlvbiAgICB8IFdyaXRhYmxlICAgIHwKICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZywgb3IgYGBOb25lYGAgaWYgICAgICAgICAgfCAgICAgICAgICAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfAogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKICAgICAgfCBgYF9fZG9jX19gYCAgICAgICAgICAgICB8IEFub3RoZXIgd2F5IG9mIHNwZWxsaW5nICAgICAgICAgfCBXcml0YWJsZSAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYGZ1bmNfZG9jYGAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfAogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKICAgICAgfCBgYGZ1bmNfbmFtZWBgICAgICAgICAgICB8IFRoZSBmdW5jdGlvbidzIG5hbWUgICAgICAgICAgICAgfCBXcml0YWJsZSAgICB8CiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKwogICAgICB8IGBgX19uYW1lX19gYCAgICAgICAgICAgIHwgQW5vdGhlciB3YXkgb2Ygc3BlbGxpbmcgICAgICAgICB8IFdyaXRhYmxlICAgIHwKICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgZnVuY19uYW1lYGAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8CiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKwogICAgICB8IGBgX19tb2R1bGVfX2BgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgICAgICB8IFdyaXRhYmxlICAgIHwKICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLCBvciAgICAgfCAgICAgICAgICAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYE5vbmVgYCBpZiB1bmF2YWlsYWJsZS4gICAgICAgIHwgICAgICAgICAgICAgfAogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKICAgICAgfCBgYGZ1bmNfZGVmYXVsdHNgYCAgICAgICB8IEEgdHVwbGUgY29udGFpbmluZyBkZWZhdWx0ICAgICAgfCBXcml0YWJsZSAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudCB2YWx1ZXMgZm9yIHRob3NlICAgICAgIHwgICAgICAgICAgICAgfAogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnRzIHRoYXQgaGF2ZSBkZWZhdWx0cywgICB8ICAgICAgICAgICAgIHwKICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yIGBgTm9uZWBgIGlmIG5vIGFyZ3VtZW50cyAgICAgfCAgICAgICAgICAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgIHwgICAgICAgICAgICAgfAogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKICAgICAgfCBgYGZ1bmNfY29kZWBgICAgICAgICAgICB8IFRoZSBjb2RlIG9iamVjdCByZXByZXNlbnRpbmcgICAgfCBXcml0YWJsZSAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29tcGlsZWQgZnVuY3Rpb24gYm9keS4gICAgIHwgICAgICAgICAgICAgfAogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKICAgICAgfCBgYGZ1bmNfZ2xvYmFsc2BgICAgICAgICB8IEEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5ICAgfCBSZWFkLW9ubHkgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGF0IGhvbGRzIHRoZSBmdW5jdGlvbidzICAgICAgIHwgICAgICAgICAgICAgfAogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2xvYmFsIHZhcmlhYmxlcyAtLS0gdGhlIGdsb2JhbCB8ICAgICAgICAgICAgIHwKICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlIGluICAgICAgfCAgICAgICAgICAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuIHwgICAgICAgICAgICAgfAogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKICAgICAgfCBgYGZ1bmNfZGljdGBgICAgICAgICAgICB8IFRoZSBuYW1lc3BhY2Ugc3VwcG9ydGluZyAgICAgICAgfCBXcml0YWJsZSAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmJpdHJhcnkgZnVuY3Rpb24gYXR0cmlidXRlcy4gIHwgICAgICAgICAgICAgfAogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKICAgICAgfCBgYGZ1bmNfY2xvc3VyZWBgICAgICAgICB8IGBgTm9uZWBgIG9yIGEgdHVwbGUgb2YgY2VsbHMgICAgfCBSZWFkLW9ubHkgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGF0IGNvbnRhaW4gYmluZGluZ3MgZm9yIHRoZSAgIHwgICAgICAgICAgICAgfAogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24ncyBmcmVlIHZhcmlhYmxlcy4gICAgICB8ICAgICAgICAgICAgIHwKICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCgogICAgICBNb3N0IG9mIHRoZSBhdHRyaWJ1dGVzIGxhYmVsbGVkICJXcml0YWJsZSIgY2hlY2sgdGhlIHR5cGUgb2YgdGhlCiAgICAgIGFzc2lnbmVkIHZhbHVlLgoKICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogYGBmdW5jX25hbWVgYCBpcyBub3cgd3JpdGFibGUuCgogICAgICBGdW5jdGlvbiBvYmplY3RzIGFsc28gc3VwcG9ydCBnZXR0aW5nIGFuZCBzZXR0aW5nIGFyYml0cmFyeQogICAgICBhdHRyaWJ1dGVzLCB3aGljaCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGF0dGFjaCBtZXRhZGF0YQogICAgICB0byBmdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZSBkb3Qtbm90YXRpb24gaXMgdXNlZCB0byBnZXQgYW5kCiAgICAgIHNldCBzdWNoIGF0dHJpYnV0ZXMuICpOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seQogICAgICBzdXBwb3J0cyBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuIEZ1bmN0aW9uCiAgICAgIGF0dHJpYnV0ZXMgb24gYnVpbHQtaW4gZnVuY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlCiAgICAgIGZ1dHVyZS4qCgogICAgICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24ncyBkZWZpbml0aW9uIGNhbiBiZQogICAgICByZXRyaWV2ZWQgZnJvbSBpdHMgY29kZSBvYmplY3Q7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaW50ZXJuYWwKICAgICAgdHlwZXMgYmVsb3cuCgogICBVc2VyLWRlZmluZWQgbWV0aG9kcwogICAgICBBIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGNvbWJpbmVzIGEgY2xhc3MsIGEgY2xhc3MgaW5zdGFuY2UKICAgICAgKG9yIGBgTm9uZWBgKSBhbmQgYW55IGNhbGxhYmxlIG9iamVjdCAobm9ybWFsbHkgYSB1c2VyLWRlZmluZWQKICAgICAgZnVuY3Rpb24pLgoKICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGBpbV9zZWxmYGAgaXMgdGhlIGNsYXNzIGluc3RhbmNlCiAgICAgIG9iamVjdCwgYGBpbV9mdW5jYGAgaXMgdGhlIGZ1bmN0aW9uIG9iamVjdDsgYGBpbV9jbGFzc2BgIGlzIHRoZQogICAgICBjbGFzcyBvZiBgYGltX3NlbGZgYCBmb3IgYm91bmQgbWV0aG9kcyBvciB0aGUgY2xhc3MgdGhhdCBhc2tlZAogICAgICBmb3IgdGhlIG1ldGhvZCBmb3IgdW5ib3VuZCBtZXRob2RzOyBgYF9fZG9jX19gYCBpcyB0aGUgbWV0aG9kJ3MKICAgICAgZG9jdW1lbnRhdGlvbiAoc2FtZSBhcyBgYGltX2Z1bmMuX19kb2NfX2BgKTsgYGBfX25hbWVfX2BgIGlzIHRoZQogICAgICBtZXRob2QgbmFtZSAoc2FtZSBhcyBgYGltX2Z1bmMuX19uYW1lX19gYCk7IGBgX19tb2R1bGVfX2BgIGlzCiAgICAgIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIG1ldGhvZCB3YXMgZGVmaW5lZCBpbiwgb3IgYGBOb25lYGAgaWYKICAgICAgdW5hdmFpbGFibGUuCgogICAgICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yOiBgYGltX3NlbGZgYCB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzcwogICAgICB0aGF0IGRlZmluZWQgdGhlIG1ldGhvZC4KCiAgICAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IEZvciBQeXRob24gMyBmb3J3YXJkLWNvbXBhdGliaWxpdHksCiAgICAgIGBgaW1fZnVuY2BgIGlzIGFsc28gYXZhaWxhYmxlIGFzIGBgX19mdW5jX19gYCwgYW5kIGBgaW1fc2VsZmBgCiAgICAgIGFzIGBgX19zZWxmX19gYC4KCiAgICAgIE1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgYXJiaXRyYXJ5CiAgICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0LgoKICAgICAgVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhbgogICAgICBhdHRyaWJ1dGUgb2YgYSBjbGFzcyAocGVyaGFwcyB2aWEgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyksIGlmCiAgICAgIHRoYXQgYXR0cmlidXRlIGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCwgYW4gdW5ib3VuZAogICAgICB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCwgb3IgYSBjbGFzcyBtZXRob2Qgb2JqZWN0LiBXaGVuIHRoZQogICAgICBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCwgYSBuZXcgbWV0aG9kIG9iamVjdAogICAgICBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIGNsYXNzIGZyb20gd2hpY2ggaXQgaXMgYmVpbmcgcmV0cmlldmVkIGlzCiAgICAgIHRoZSBzYW1lIGFzLCBvciBhIGRlcml2ZWQgY2xhc3Mgb2YsIHRoZSBjbGFzcyBzdG9yZWQgaW4gdGhlCiAgICAgIG9yaWdpbmFsIG1ldGhvZCBvYmplY3Q7IG90aGVyd2lzZSwgdGhlIG9yaWdpbmFsIG1ldGhvZCBvYmplY3QgaXMKICAgICAgdXNlZCBhcyBpdCBpcy4KCiAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYQogICAgICB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcywgaXRzIGBgaW1fc2VsZmBgCiAgICAgIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYCBhbmQgdGhlIG1ldGhvZCBvYmplY3QgaXMgc2FpZCB0byBiZQogICAgICB1bmJvdW5kLiBXaGVuIG9uZSBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSB1c2VyLWRlZmluZWQKICAgICAgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcyB2aWEgb25lIG9mIGl0cyBpbnN0YW5jZXMsIGl0cwogICAgICBgYGltX3NlbGZgYCBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLCBhbmQgdGhlIG1ldGhvZCBvYmplY3QgaXMKICAgICAgc2FpZCB0byBiZSBib3VuZC4gSW4gZWl0aGVyIGNhc2UsIHRoZSBuZXcgbWV0aG9kJ3MgYGBpbV9jbGFzc2BgCiAgICAgIGF0dHJpYnV0ZSBpcyB0aGUgY2xhc3MgZnJvbSB3aGljaCB0aGUgcmV0cmlldmFsIHRha2VzIHBsYWNlLCBhbmQKICAgICAgaXRzIGBgaW1fZnVuY2BgIGF0dHJpYnV0ZSBpcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0LgoKICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZwogICAgICBhbm90aGVyIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCB0aGUgYmVoYXZpb3VyIGlzCiAgICAgIHRoZSBzYW1lIGFzIGZvciBhIGZ1bmN0aW9uIG9iamVjdCwgZXhjZXB0IHRoYXQgdGhlIGBgaW1fZnVuY2BgCiAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgbmV3IGluc3RhbmNlIGlzIG5vdCB0aGUgb3JpZ2luYWwgbWV0aG9kIG9iamVjdAogICAgICBidXQgaXRzIGBgaW1fZnVuY2BgIGF0dHJpYnV0ZS4KCiAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYQogICAgICBjbGFzcyBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgaXRzIGBgaW1fc2VsZmBgCiAgICAgIGF0dHJpYnV0ZSBpcyB0aGUgY2xhc3MgaXRzZWxmLCBhbmQgaXRzIGBgaW1fZnVuY2BgIGF0dHJpYnV0ZSBpcwogICAgICB0aGUgZnVuY3Rpb24gb2JqZWN0IHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC4KCiAgICAgIFdoZW4gYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZQogICAgICB1bmRlcmx5aW5nIGZ1bmN0aW9uIChgYGltX2Z1bmNgYCkgaXMgY2FsbGVkLCB3aXRoIHRoZQogICAgICByZXN0cmljdGlvbiB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHRoZQogICAgICBwcm9wZXIgY2xhc3MgKGBgaW1fY2xhc3NgYCkgb3Igb2YgYSBkZXJpdmVkIGNsYXNzIHRoZXJlb2YuCgogICAgICBXaGVuIGEgYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGUKICAgICAgdW5kZXJseWluZyBmdW5jdGlvbiAoYGBpbV9mdW5jYGApIGlzIGNhbGxlZCwgaW5zZXJ0aW5nIHRoZSBjbGFzcwogICAgICBpbnN0YW5jZSAoYGBpbV9zZWxmYGApIGluIGZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yCiAgICAgIGluc3RhbmNlLCB3aGVuIGBgQ2BgIGlzIGEgY2xhc3Mgd2hpY2ggY29udGFpbnMgYSBkZWZpbml0aW9uIGZvcgogICAgICBhIGZ1bmN0aW9uIGBgZigpYGAsIGFuZCBgYHhgYCBpcyBhbiBpbnN0YW5jZSBvZiBgYENgYCwgY2FsbGluZwogICAgICBgYHguZigxKWBgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgYEMuZih4LCAxKWBgLgoKICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGRlcml2ZWQgZnJvbSBhIGNsYXNzIG1ldGhvZAogICAgICBvYmplY3QsIHRoZSAiY2xhc3MgaW5zdGFuY2UiIHN0b3JlZCBpbiBgYGltX3NlbGZgYCB3aWxsIGFjdHVhbGx5CiAgICAgIGJlIHRoZSBjbGFzcyBpdHNlbGYsIHNvIHRoYXQgY2FsbGluZyBlaXRoZXIgYGB4LmYoMSlgYCBvcgogICAgICBgYEMuZigxKWBgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgYGYoQywxKWBgIHdoZXJlIGBgZmBgIGlzCiAgICAgIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uLgoKICAgICAgTm90ZSB0aGF0IHRoZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGZ1bmN0aW9uIG9iamVjdCB0byAodW5ib3VuZCBvcgogICAgICBib3VuZCkgbWV0aG9kIG9iamVjdCBoYXBwZW5zIGVhY2ggdGltZSB0aGUgYXR0cmlidXRlIGlzCiAgICAgIHJldHJpZXZlZCBmcm9tIHRoZSBjbGFzcyBvciBpbnN0YW5jZS4gSW4gc29tZSBjYXNlcywgYSBmcnVpdGZ1bAogICAgICBvcHRpbWl6YXRpb24gaXMgdG8gYXNzaWduIHRoZSBhdHRyaWJ1dGUgdG8gYSBsb2NhbCB2YXJpYWJsZSBhbmQKICAgICAgY2FsbCB0aGF0IGxvY2FsIHZhcmlhYmxlLiBBbHNvIG5vdGljZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb24KICAgICAgb25seSBoYXBwZW5zIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zOyBvdGhlciBjYWxsYWJsZSBvYmplY3RzCiAgICAgIChhbmQgYWxsIG5vbi1jYWxsYWJsZSBvYmplY3RzKSBhcmUgcmV0cmlldmVkIHdpdGhvdXQKICAgICAgdHJhbnNmb3JtYXRpb24uICBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgdXNlci1kZWZpbmVkCiAgICAgIGZ1bmN0aW9ucyB3aGljaCBhcmUgYXR0cmlidXRlcyBvZiBhIGNsYXNzIGluc3RhbmNlIGFyZSBub3QKICAgICAgY29udmVydGVkIHRvIGJvdW5kIG1ldGhvZHM7IHRoaXMgKm9ubHkqIGhhcHBlbnMgd2hlbiB0aGUKICAgICAgZnVuY3Rpb24gaXMgYW4gYXR0cmlidXRlIG9mIHRoZSBjbGFzcy4KCiAgIEdlbmVyYXRvciBmdW5jdGlvbnMKICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudCAoc2VlCiAgICAgIHNlY3Rpb24gKlRoZSB5aWVsZCBzdGF0ZW1lbnQqKSBpcyBjYWxsZWQgYSAqZ2VuZXJhdG9yIGZ1bmN0aW9uKi4KICAgICAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgYWx3YXlzIHJldHVybnMgYW4gaXRlcmF0b3Igb2JqZWN0CiAgICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uOiAgY2FsbGluZwogICAgICB0aGUgaXRlcmF0b3IncyBgYG5leHQoKWBgIG1ldGhvZCB3aWxsIGNhdXNlIHRoZSBmdW5jdGlvbiB0bwogICAgICBleGVjdXRlIHVudGlsIGl0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQuCiAgICAgIFdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGEgYGByZXR1cm5gYCBzdGF0ZW1lbnQgb3IgZmFsbHMgb2ZmCiAgICAgIHRoZSBlbmQsIGEgYGBTdG9wSXRlcmF0aW9uYGAgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlCiAgICAgIGl0ZXJhdG9yIHdpbGwgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHNldCBvZiB2YWx1ZXMgdG8gYmUKICAgICAgcmV0dXJuZWQuCgogICBCdWlsdC1pbiBmdW5jdGlvbnMKICAgICAgQSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIEMgZnVuY3Rpb24uCiAgICAgIEV4YW1wbGVzIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhcmUgYGBsZW4oKWBgIGFuZCBgYG1hdGguc2luKClgYAogICAgICAoYGBtYXRoYGAgaXMgYSBzdGFuZGFyZCBidWlsdC1pbiBtb2R1bGUpLiBUaGUgbnVtYmVyIGFuZCB0eXBlIG9mCiAgICAgIHRoZSBhcmd1bWVudHMgYXJlIGRldGVybWluZWQgYnkgdGhlIEMgZnVuY3Rpb24uIFNwZWNpYWwgcmVhZC0KICAgICAgb25seSBhdHRyaWJ1dGVzOiBgYF9fZG9jX19gYCBpcyB0aGUgZnVuY3Rpb24ncyBkb2N1bWVudGF0aW9uCiAgICAgIHN0cmluZywgb3IgYGBOb25lYGAgaWYgdW5hdmFpbGFibGU7IGBgX19uYW1lX19gYCBpcyB0aGUKICAgICAgZnVuY3Rpb24ncyBuYW1lOyBgYF9fc2VsZl9fYGAgaXMgc2V0IHRvIGBgTm9uZWBgIChidXQgc2VlIHRoZQogICAgICBuZXh0IGl0ZW0pOyBgYF9fbW9kdWxlX19gYCBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZQogICAgICBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiBvciBgYE5vbmVgYCBpZiB1bmF2YWlsYWJsZS4KCiAgIEJ1aWx0LWluIG1ldGhvZHMKICAgICAgVGhpcyBpcyByZWFsbHkgYSBkaWZmZXJlbnQgZGlzZ3Vpc2Ugb2YgYSBidWlsdC1pbiBmdW5jdGlvbiwgdGhpcwogICAgICB0aW1lIGNvbnRhaW5pbmcgYW4gb2JqZWN0IHBhc3NlZCB0byB0aGUgQyBmdW5jdGlvbiBhcyBhbgogICAgICBpbXBsaWNpdCBleHRyYSBhcmd1bWVudC4gIEFuIGV4YW1wbGUgb2YgYSBidWlsdC1pbiBtZXRob2QgaXMKICAgICAgYGBhbGlzdC5hcHBlbmQoKWBgLCBhc3N1bWluZyAqYWxpc3QqIGlzIGEgbGlzdCBvYmplY3QuIEluIHRoaXMKICAgICAgY2FzZSwgdGhlIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZSBgYF9fc2VsZl9fYGAgaXMgc2V0IHRvIHRoZQogICAgICBvYmplY3QgZGVub3RlZCBieSAqYWxpc3QqLgoKICAgQ2xhc3MgVHlwZXMKICAgICAgQ2xhc3MgdHlwZXMsIG9yICJuZXctc3R5bGUgY2xhc3NlcywiIGFyZSBjYWxsYWJsZS4gIFRoZXNlCiAgICAgIG9iamVjdHMgbm9ybWFsbHkgYWN0IGFzIGZhY3RvcmllcyBmb3IgbmV3IGluc3RhbmNlcyBvZgogICAgICB0aGVtc2VsdmVzLCBidXQgdmFyaWF0aW9ucyBhcmUgcG9zc2libGUgZm9yIGNsYXNzIHR5cGVzIHRoYXQKICAgICAgb3ZlcnJpZGUgYGBfX25ld19fKClgYC4gIFRoZSBhcmd1bWVudHMgb2YgdGhlIGNhbGwgYXJlIHBhc3NlZCB0bwogICAgICBgYF9fbmV3X18oKWBgIGFuZCwgaW4gdGhlIHR5cGljYWwgY2FzZSwgdG8gYGBfX2luaXRfXygpYGAgdG8KICAgICAgaW5pdGlhbGl6ZSB0aGUgbmV3IGluc3RhbmNlLgoKICAgQ2xhc3NpYyBDbGFzc2VzCiAgICAgIENsYXNzIG9iamVjdHMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFdoZW4gYSBjbGFzcyBvYmplY3QgaXMKICAgICAgY2FsbGVkLCBhIG5ldyBjbGFzcyBpbnN0YW5jZSAoYWxzbyBkZXNjcmliZWQgYmVsb3cpIGlzIGNyZWF0ZWQKICAgICAgYW5kIHJldHVybmVkLiAgVGhpcyBpbXBsaWVzIGEgY2FsbCB0byB0aGUgY2xhc3MncyBgYF9faW5pdF9fKClgYAogICAgICBtZXRob2QgaWYgaXQgaGFzIG9uZS4gIEFueSBhcmd1bWVudHMgYXJlIHBhc3NlZCBvbiB0byB0aGUKICAgICAgYGBfX2luaXRfXygpYGAgbWV0aG9kLiAgSWYgdGhlcmUgaXMgbm8gYGBfX2luaXRfXygpYGAgbWV0aG9kLAogICAgICB0aGUgY2xhc3MgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuCgogICBDbGFzcyBpbnN0YW5jZXMKICAgICAgQ2xhc3MgaW5zdGFuY2VzIGFyZSBkZXNjcmliZWQgYmVsb3cuICBDbGFzcyBpbnN0YW5jZXMgYXJlCiAgICAgIGNhbGxhYmxlIG9ubHkgd2hlbiB0aGUgY2xhc3MgaGFzIGEgYGBfX2NhbGxfXygpYGAgbWV0aG9kOwogICAgICBgYHgoYXJndW1lbnRzKWBgIGlzIGEgc2hvcnRoYW5kIGZvciBgYHguX19jYWxsX18oYXJndW1lbnRzKWBgLgoKTW9kdWxlcwogICBNb2R1bGVzIGFyZSBpbXBvcnRlZCBieSB0aGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgKHNlZSBzZWN0aW9uICpUaGUKICAgaW1wb3J0IHN0YXRlbWVudCopLiBBIG1vZHVsZSBvYmplY3QgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGJ5CiAgIGEgZGljdGlvbmFyeSBvYmplY3QgKHRoaXMgaXMgdGhlIGRpY3Rpb25hcnkgcmVmZXJlbmNlZCBieSB0aGUKICAgZnVuY19nbG9iYWxzIGF0dHJpYnV0ZSBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlKS4KICAgQXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksCiAgIGUuZy4sIGBgbS54YGAgaXMgZXF1aXZhbGVudCB0byBgYG0uX19kaWN0X19bIngiXWBgLiBBIG1vZHVsZSBvYmplY3QKICAgZG9lcyBub3QgY29udGFpbiB0aGUgY29kZSBvYmplY3QgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGUKICAgKHNpbmNlIGl0IGlzbid0IG5lZWRlZCBvbmNlIHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lKS4KCiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50IHVwZGF0ZXMgdGhlIG1vZHVsZSdzIG5hbWVzcGFjZSBkaWN0aW9uYXJ5LAogICBlLmcuLCBgYG0ueCA9IDFgYCBpcyBlcXVpdmFsZW50IHRvIGBgbS5fX2RpY3RfX1sieCJdID0gMWBgLgoKICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiBgYF9fZGljdF9fYGAgaXMgdGhlIG1vZHVsZSdzIG5hbWVzcGFjZQogICBhcyBhIGRpY3Rpb25hcnkgb2JqZWN0LgoKICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBCZWNhdXNlIG9mIHRoZSB3YXkgQ1B5dGhvbgogICBjbGVhcnMgbW9kdWxlIGRpY3Rpb25hcmllcywgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHdpbGwgYmUgY2xlYXJlZAogICB3aGVuIHRoZSBtb2R1bGUgZmFsbHMgb3V0IG9mIHNjb3BlIGV2ZW4gaWYgdGhlIGRpY3Rpb25hcnkgc3RpbGwgaGFzCiAgIGxpdmUgcmVmZXJlbmNlcy4gIFRvIGF2b2lkIHRoaXMsIGNvcHkgdGhlIGRpY3Rpb25hcnkgb3Iga2VlcCB0aGUKICAgbW9kdWxlIGFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS4KCiAgIFByZWRlZmluZWQgKHdyaXRhYmxlKSBhdHRyaWJ1dGVzOiBgYF9fbmFtZV9fYGAgaXMgdGhlIG1vZHVsZSdzCiAgIG5hbWU7IGBgX19kb2NfX2BgIGlzIHRoZSBtb2R1bGUncyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgYGBOb25lYGAKICAgaWYgdW5hdmFpbGFibGU7IGBgX19maWxlX19gYCBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaAogICB0aGUgbW9kdWxlIHdhcyBsb2FkZWQsIGlmIGl0IHdhcyBsb2FkZWQgZnJvbSBhIGZpbGUuIFRoZQogICBgYF9fZmlsZV9fYGAgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50IGZvciBDIG1vZHVsZXMgdGhhdCBhcmUKICAgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvciBleHRlbnNpb24gbW9kdWxlcwogICBsb2FkZWQgZHluYW1pY2FsbHkgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlCiAgIHNoYXJlZCBsaWJyYXJ5IGZpbGUuCgpDbGFzc2VzCiAgIEJvdGggY2xhc3MgdHlwZXMgKG5ldy1zdHlsZSBjbGFzc2VzKSBhbmQgY2xhc3Mgb2JqZWN0cyAob2xkLQogICBzdHlsZS9jbGFzc2ljIGNsYXNzZXMpIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBjbGFzcyBkZWZpbml0aW9ucwogICAoc2VlIHNlY3Rpb24gKkNsYXNzIGRlZmluaXRpb25zKikuICBBIGNsYXNzIGhhcyBhIG5hbWVzcGFjZQogICBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0LiBDbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUKICAgdHJhbnNsYXRlZCB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgYGBDLnhgYCBpcwogICB0cmFuc2xhdGVkIHRvIGBgQy5fX2RpY3RfX1sieCJdYGAgKGFsdGhvdWdoIGZvciBuZXctc3R5bGUgY2xhc3NlcwogICBpbiBwYXJ0aWN1bGFyIHRoZXJlIGFyZSBhIG51bWJlciBvZiBob29rcyB3aGljaCBhbGxvdyBmb3Igb3RoZXIKICAgbWVhbnMgb2YgbG9jYXRpbmcgYXR0cmlidXRlcykuIFdoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIG5vdCBmb3VuZAogICB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlIGNsYXNzZXMuICBGb3IKICAgb2xkLXN0eWxlIGNsYXNzZXMsIHRoZSBzZWFyY2ggaXMgZGVwdGgtZmlyc3QsIGxlZnQtdG8tcmlnaHQgaW4gdGhlCiAgIG9yZGVyIG9mIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdC4gTmV3LXN0eWxlIGNsYXNzZXMgdXNlCiAgIHRoZSBtb3JlIGNvbXBsZXggQzMgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgd2hpY2ggYmVoYXZlcyBjb3JyZWN0bHkKICAgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgJ2RpYW1vbmQnIGluaGVyaXRhbmNlIHN0cnVjdHVyZXMgd2hlcmUKICAgdGhlcmUgYXJlIG11bHRpcGxlIGluaGVyaXRhbmNlIHBhdGhzIGxlYWRpbmcgYmFjayB0byBhIGNvbW1vbgogICBhbmNlc3Rvci4gQWRkaXRpb25hbCBkZXRhaWxzIG9uIHRoZSBDMyBNUk8gdXNlZCBieSBuZXctc3R5bGUKICAgY2xhc3NlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGRvY3VtZW50YXRpb24gYWNjb21wYW55aW5nIHRoZSAyLjMKICAgcmVsZWFzZSBhdCBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvcmVsZWFzZXMvMi4zL21yby8uCgogICBXaGVuIGEgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZSAoZm9yIGNsYXNzIGBgQ2BgLCBzYXkpIHdvdWxkIHlpZWxkCiAgIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBvciBhbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2QKICAgb2JqZWN0IHdob3NlIGFzc29jaWF0ZWQgY2xhc3MgaXMgZWl0aGVyIGBgQ2BgIG9yIG9uZSBvZiBpdHMgYmFzZQogICBjbGFzc2VzLCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIHVuYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZAogICBvYmplY3Qgd2hvc2UgYGBpbV9jbGFzc2BgIGF0dHJpYnV0ZSBpcyBgYENgYC4gV2hlbiBpdCB3b3VsZCB5aWVsZCBhCiAgIGNsYXNzIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYSBib3VuZCB1c2VyLWRlZmluZWQKICAgbWV0aG9kIG9iamVjdCB3aG9zZSBgYGltX3NlbGZgYCBhdHRyaWJ1dGUgaXMgYGBDYGAuICBXaGVuIGl0IHdvdWxkCiAgIHlpZWxkIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG9iamVjdAogICB3cmFwcGVkIGJ5IHRoZSBzdGF0aWMgbWV0aG9kIG9iamVjdC4gU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZwogICBEZXNjcmlwdG9ycyogZm9yIGFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMgcmV0cmlldmVkIGZyb20gYQogICBjbGFzcyBtYXkgZGlmZmVyIGZyb20gdGhvc2UgYWN0dWFsbHkgY29udGFpbmVkIGluIGl0cyBgYF9fZGljdF9fYGAKICAgKG5vdGUgdGhhdCBvbmx5IG5ldy1zdHlsZSBjbGFzc2VzIHN1cHBvcnQgZGVzY3JpcHRvcnMpLgoKICAgQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3MncyBkaWN0aW9uYXJ5LCBuZXZlcgogICB0aGUgZGljdGlvbmFyeSBvZiBhIGJhc2UgY2xhc3MuCgogICBBIGNsYXNzIG9iamVjdCBjYW4gYmUgY2FsbGVkIChzZWUgYWJvdmUpIHRvIHlpZWxkIGEgY2xhc3MgaW5zdGFuY2UKICAgKHNlZSBiZWxvdykuCgogICBTcGVjaWFsIGF0dHJpYnV0ZXM6IGBgX19uYW1lX19gYCBpcyB0aGUgY2xhc3MgbmFtZTsgYGBfX21vZHVsZV9fYGAKICAgaXMgdGhlIG1vZHVsZSBuYW1lIGluIHdoaWNoIHRoZSBjbGFzcyB3YXMgZGVmaW5lZDsgYGBfX2RpY3RfX2BgIGlzCiAgIHRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzJ3MgbmFtZXNwYWNlOyBgYF9fYmFzZXNfX2BgIGlzIGEKICAgdHVwbGUgKHBvc3NpYmx5IGVtcHR5IG9yIGEgc2luZ2xldG9uKSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsCiAgIGluIHRoZSBvcmRlciBvZiB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3Q7CiAgIGBgX19kb2NfX2BgIGlzIHRoZSBjbGFzcydzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBOb25lIGlmCiAgIHVuZGVmaW5lZC4KCkNsYXNzIGluc3RhbmNlcwogICBBIGNsYXNzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYnkgY2FsbGluZyBhIGNsYXNzIG9iamVjdCAoc2VlIGFib3ZlKS4KICAgQSBjbGFzcyBpbnN0YW5jZSBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYXMgYSBkaWN0aW9uYXJ5IHdoaWNoCiAgIGlzIHRoZSBmaXJzdCBwbGFjZSBpbiB3aGljaCBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgc2VhcmNoZWQuCiAgIFdoZW4gYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgYW5kIHRoZSBpbnN0YW5jZSdzIGNsYXNzIGhhcwogICBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBjbGFzcwogICBhdHRyaWJ1dGVzLiAgSWYgYSBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQgdGhhdCBpcyBhIHVzZXItZGVmaW5lZAogICBmdW5jdGlvbiBvYmplY3Qgb3IgYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCB3aG9zZQogICBhc3NvY2lhdGVkIGNsYXNzIGlzIHRoZSBjbGFzcyAoY2FsbCBpdCBgYENgYCkgb2YgdGhlIGluc3RhbmNlIGZvcgogICB3aGljaCB0aGUgYXR0cmlidXRlIHJlZmVyZW5jZSB3YXMgaW5pdGlhdGVkIG9yIG9uZSBvZiBpdHMgYmFzZXMsIGl0CiAgIGlzIHRyYW5zZm9ybWVkIGludG8gYSBib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCB3aG9zZQogICBgYGltX2NsYXNzYGAgYXR0cmlidXRlIGlzIGBgQ2BgIGFuZCB3aG9zZSBgYGltX3NlbGZgYCBhdHRyaWJ1dGUgaXMKICAgdGhlIGluc3RhbmNlLiBTdGF0aWMgbWV0aG9kIGFuZCBjbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgYWxzbwogICB0cmFuc2Zvcm1lZCwgYXMgaWYgdGhleSBoYWQgYmVlbiByZXRyaWV2ZWQgZnJvbSBjbGFzcyBgYENgYDsgc2VlCiAgIGFib3ZlIHVuZGVyICJDbGFzc2VzIi4gU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyogZm9yCiAgIGFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyByZXRyaWV2ZWQgdmlhIGl0cwogICBpbnN0YW5jZXMgbWF5IGRpZmZlciBmcm9tIHRoZSBvYmplY3RzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUKICAgY2xhc3MncyBgYF9fZGljdF9fYGAuIElmIG5vIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCwgYW5kIHRoZQogICBvYmplY3QncyBjbGFzcyBoYXMgYSBgYF9fZ2V0YXR0cl9fKClgYCBtZXRob2QsIHRoYXQgaXMgY2FsbGVkIHRvCiAgIHNhdGlzZnkgdGhlIGxvb2t1cC4KCiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50cyBhbmQgZGVsZXRpb25zIHVwZGF0ZSB0aGUgaW5zdGFuY2UncwogICBkaWN0aW9uYXJ5LCBuZXZlciBhIGNsYXNzJ3MgZGljdGlvbmFyeS4gIElmIHRoZSBjbGFzcyBoYXMgYQogICBgYF9fc2V0YXR0cl9fKClgYCBvciBgYF9fZGVsYXR0cl9fKClgYCBtZXRob2QsIHRoaXMgaXMgY2FsbGVkCiAgIGluc3RlYWQgb2YgdXBkYXRpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgZGlyZWN0bHkuCgogICBDbGFzcyBpbnN0YW5jZXMgY2FuIHByZXRlbmQgdG8gYmUgbnVtYmVycywgc2VxdWVuY2VzLCBvciBtYXBwaW5ncwogICBpZiB0aGV5IGhhdmUgbWV0aG9kcyB3aXRoIGNlcnRhaW4gc3BlY2lhbCBuYW1lcy4gIFNlZSBzZWN0aW9uCiAgICpTcGVjaWFsIG1ldGhvZCBuYW1lcyouCgogICBTcGVjaWFsIGF0dHJpYnV0ZXM6IGBgX19kaWN0X19gYCBpcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnk7CiAgIGBgX19jbGFzc19fYGAgaXMgdGhlIGluc3RhbmNlJ3MgY2xhc3MuCgpGaWxlcwogICBBIGZpbGUgb2JqZWN0IHJlcHJlc2VudHMgYW4gb3BlbiBmaWxlLiAgRmlsZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5CiAgIHRoZSBgYG9wZW4oKWBgIGJ1aWx0LWluIGZ1bmN0aW9uLCBhbmQgYWxzbyBieSBgYG9zLnBvcGVuKClgYCwKICAgYGBvcy5mZG9wZW4oKWBgLCBhbmQgdGhlIGBgbWFrZWZpbGUoKWBgIG1ldGhvZCBvZiBzb2NrZXQgb2JqZWN0cwogICAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHMgcHJvdmlkZWQgYnkgZXh0ZW5zaW9uCiAgIG1vZHVsZXMpLiAgVGhlIG9iamVjdHMgYGBzeXMuc3RkaW5gYCwgYGBzeXMuc3Rkb3V0YGAgYW5kCiAgIGBgc3lzLnN0ZGVycmBgIGFyZSBpbml0aWFsaXplZCB0byBmaWxlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUKICAgaW50ZXJwcmV0ZXIncyBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zLiAgU2VlICpGaWxlCiAgIE9iamVjdHMqIGZvciBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgb2JqZWN0cy4KCkludGVybmFsIHR5cGVzCiAgIEEgZmV3IHR5cGVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgaW50ZXJwcmV0ZXIgYXJlIGV4cG9zZWQgdG8gdGhlCiAgIHVzZXIuIFRoZWlyIGRlZmluaXRpb25zIG1heSBjaGFuZ2Ugd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlCiAgIGludGVycHJldGVyLCBidXQgdGhleSBhcmUgbWVudGlvbmVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy4KCiAgIENvZGUgb2JqZWN0cwogICAgICBDb2RlIG9iamVjdHMgcmVwcmVzZW50ICpieXRlLWNvbXBpbGVkKiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlLAogICAgICBvciAqYnl0ZWNvZGUqLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29kZSBvYmplY3QgYW5kIGEKICAgICAgZnVuY3Rpb24gb2JqZWN0IGlzIHRoYXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhbiBleHBsaWNpdAogICAgICByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uJ3MgZ2xvYmFscyAodGhlIG1vZHVsZSBpbiB3aGljaCBpdCB3YXMKICAgICAgZGVmaW5lZCksIHdoaWxlIGEgY29kZSBvYmplY3QgY29udGFpbnMgbm8gY29udGV4dDsgYWxzbyB0aGUKICAgICAgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgZnVuY3Rpb24gb2JqZWN0LCBub3QKICAgICAgaW4gdGhlIGNvZGUgb2JqZWN0IChiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHZhbHVlcyBjYWxjdWxhdGVkIGF0CiAgICAgIHJ1bi10aW1lKS4gIFVubGlrZSBmdW5jdGlvbiBvYmplY3RzLCBjb2RlIG9iamVjdHMgYXJlIGltbXV0YWJsZQogICAgICBhbmQgY29udGFpbiBubyByZWZlcmVuY2VzIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBtdXRhYmxlCiAgICAgIG9iamVjdHMuCgogICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiBgYGNvX25hbWVgYCBnaXZlcyB0aGUgZnVuY3Rpb24KICAgICAgbmFtZTsgYGBjb19hcmdjb3VudGBgIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMKICAgICAgKGluY2x1ZGluZyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyk7IGBgY29fbmxvY2Fsc2BgIGlzIHRoZQogICAgICBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIChpbmNsdWRpbmcKICAgICAgYXJndW1lbnRzKTsgYGBjb192YXJuYW1lc2BgIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YKICAgICAgdGhlIGxvY2FsIHZhcmlhYmxlcyAoc3RhcnRpbmcgd2l0aCB0aGUgYXJndW1lbnQgbmFtZXMpOwogICAgICBgYGNvX2NlbGx2YXJzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBsb2NhbAogICAgICB2YXJpYWJsZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBuZXN0ZWQgZnVuY3Rpb25zOwogICAgICBgYGNvX2ZyZWV2YXJzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBmcmVlCiAgICAgIHZhcmlhYmxlczsgYGBjb19jb2RlYGAgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzZXF1ZW5jZSBvZgogICAgICBieXRlY29kZSBpbnN0cnVjdGlvbnM7IGBgY29fY29uc3RzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZQogICAgICBsaXRlcmFscyB1c2VkIGJ5IHRoZSBieXRlY29kZTsgYGBjb19uYW1lc2BgIGlzIGEgdHVwbGUKICAgICAgY29udGFpbmluZyB0aGUgbmFtZXMgdXNlZCBieSB0aGUgYnl0ZWNvZGU7IGBgY29fZmlsZW5hbWVgYCBpcwogICAgICB0aGUgZmlsZW5hbWUgZnJvbSB3aGljaCB0aGUgY29kZSB3YXMgY29tcGlsZWQ7CiAgICAgIGBgY29fZmlyc3RsaW5lbm9gYCBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlIGZ1bmN0aW9uOwogICAgICBgYGNvX2xub3RhYmBgIGlzIGEgc3RyaW5nIGVuY29kaW5nIHRoZSBtYXBwaW5nIGZyb20gYnl0ZWNvZGUKICAgICAgb2Zmc2V0cyB0byBsaW5lIG51bWJlcnMgKGZvciBkZXRhaWxzIHNlZSB0aGUgc291cmNlIGNvZGUgb2YgdGhlCiAgICAgIGludGVycHJldGVyKTsgYGBjb19zdGFja3NpemVgYCBpcyB0aGUgcmVxdWlyZWQgc3RhY2sgc2l6ZQogICAgICAoaW5jbHVkaW5nIGxvY2FsIHZhcmlhYmxlcyk7IGBgY29fZmxhZ3NgYCBpcyBhbiBpbnRlZ2VyIGVuY29kaW5nCiAgICAgIGEgbnVtYmVyIG9mIGZsYWdzIGZvciB0aGUgaW50ZXJwcmV0ZXIuCgogICAgICBUaGUgZm9sbG93aW5nIGZsYWcgYml0cyBhcmUgZGVmaW5lZCBmb3IgYGBjb19mbGFnc2BgOiBiaXQKICAgICAgYGAweDA0YGAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSBgYCphcmd1bWVudHNgYCBzeW50YXgKICAgICAgdG8gYWNjZXB0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdAogICAgICBgYDB4MDhgYCBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlIGBgKiprZXl3b3Jkc2BgIHN5bnRheAogICAgICB0byBhY2NlcHQgYXJiaXRyYXJ5IGtleXdvcmQgYXJndW1lbnRzOyBiaXQgYGAweDIwYGAgaXMgc2V0IGlmCiAgICAgIHRoZSBmdW5jdGlvbiBpcyBhIGdlbmVyYXRvci4KCiAgICAgIEZ1dHVyZSBmZWF0dXJlIGRlY2xhcmF0aW9ucyAoYGBmcm9tIF9fZnV0dXJlX18gaW1wb3J0CiAgICAgIGRpdmlzaW9uYGApIGFsc28gdXNlIGJpdHMgaW4gYGBjb19mbGFnc2BgIHRvIGluZGljYXRlIHdoZXRoZXIgYQogICAgICBjb2RlIG9iamVjdCB3YXMgY29tcGlsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmVhdHVyZSBlbmFibGVkOiBiaXQKICAgICAgYGAweDIwMDBgYCBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHdhcyBjb21waWxlZCB3aXRoIGZ1dHVyZQogICAgICBkaXZpc2lvbiBlbmFibGVkOyBiaXRzIGBgMHgxMGBgIGFuZCBgYDB4MTAwMGBgIHdlcmUgdXNlZCBpbgogICAgICBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbi4KCiAgICAgIE90aGVyIGJpdHMgaW4gYGBjb19mbGFnc2BgIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgoKICAgICAgSWYgYSBjb2RlIG9iamVjdCByZXByZXNlbnRzIGEgZnVuY3Rpb24sIHRoZSBmaXJzdCBpdGVtIGluCiAgICAgIGBgY29fY29uc3RzYGAgaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3IKICAgICAgYGBOb25lYGAgaWYgdW5kZWZpbmVkLgoKICAgRnJhbWUgb2JqZWN0cwogICAgICBGcmFtZSBvYmplY3RzIHJlcHJlc2VudCBleGVjdXRpb24gZnJhbWVzLiAgVGhleSBtYXkgb2NjdXIgaW4KICAgICAgdHJhY2ViYWNrIG9iamVjdHMgKHNlZSBiZWxvdykuCgogICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiBgYGZfYmFja2BgIGlzIHRvIHRoZSBwcmV2aW91cwogICAgICBzdGFjayBmcmFtZSAodG93YXJkcyB0aGUgY2FsbGVyKSwgb3IgYGBOb25lYGAgaWYgdGhpcyBpcyB0aGUKICAgICAgYm90dG9tIHN0YWNrIGZyYW1lOyBgYGZfY29kZWBgIGlzIHRoZSBjb2RlIG9iamVjdCBiZWluZyBleGVjdXRlZAogICAgICBpbiB0aGlzIGZyYW1lOyBgYGZfbG9jYWxzYGAgaXMgdGhlIGRpY3Rpb25hcnkgdXNlZCB0byBsb29rIHVwCiAgICAgIGxvY2FsIHZhcmlhYmxlczsgYGBmX2dsb2JhbHNgYCBpcyB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzOwogICAgICBgYGZfYnVpbHRpbnNgYCBpcyB1c2VkIGZvciBidWlsdC1pbiAoaW50cmluc2ljKSBuYW1lczsKICAgICAgYGBmX3Jlc3RyaWN0ZWRgYCBpcyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcwogICAgICBleGVjdXRpbmcgaW4gcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZTsgYGBmX2xhc3RpYGAgZ2l2ZXMgdGhlCiAgICAgIHByZWNpc2UgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgYW4gaW5kZXggaW50byB0aGUgYnl0ZWNvZGUgc3RyaW5nCiAgICAgIG9mIHRoZSBjb2RlIG9iamVjdCkuCgogICAgICBTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXM6IGBgZl90cmFjZWBgLCBpZiBub3QgYGBOb25lYGAsIGlzIGEKICAgICAgZnVuY3Rpb24gY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBjb2RlIGxpbmUgKHRoaXMgaXMKICAgICAgdXNlZCBieSB0aGUgZGVidWdnZXIpOyBgYGZfZXhjX3R5cGVgYCwgYGBmX2V4Y192YWx1ZWBgLAogICAgICBgYGZfZXhjX3RyYWNlYmFja2BgIHJlcHJlc2VudCB0aGUgbGFzdCBleGNlcHRpb24gcmFpc2VkIGluIHRoZQogICAgICBwYXJlbnQgZnJhbWUgcHJvdmlkZWQgYW5vdGhlciBleGNlcHRpb24gd2FzIGV2ZXIgcmFpc2VkIGluIHRoZQogICAgICBjdXJyZW50IGZyYW1lIChpbiBhbGwgb3RoZXIgY2FzZXMgdGhleSBhcmUgTm9uZSk7IGBgZl9saW5lbm9gYAogICAgICBpcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBvZiB0aGUgZnJhbWUgLS0tIHdyaXRpbmcgdG8gdGhpcyBmcm9tCiAgICAgIHdpdGhpbiBhIHRyYWNlIGZ1bmN0aW9uIGp1bXBzIHRvIHRoZSBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUKICAgICAgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSBkZWJ1Z2dlciBjYW4gaW1wbGVtZW50IGEgSnVtcCBjb21tYW5kCiAgICAgIChha2EgU2V0IE5leHQgU3RhdGVtZW50KSBieSB3cml0aW5nIHRvIGZfbGluZW5vLgoKICAgVHJhY2ViYWNrIG9iamVjdHMKICAgICAgVHJhY2ViYWNrIG9iamVjdHMgcmVwcmVzZW50IGEgc3RhY2sgdHJhY2Ugb2YgYW4gZXhjZXB0aW9uLiAgQQogICAgICB0cmFjZWJhY2sgb2JqZWN0IGlzIGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLiAgV2hlbiB0aGUKICAgICAgc2VhcmNoIGZvciBhbiBleGNlcHRpb24gaGFuZGxlciB1bndpbmRzIHRoZSBleGVjdXRpb24gc3RhY2ssIGF0CiAgICAgIGVhY2ggdW53b3VuZCBsZXZlbCBhIHRyYWNlYmFjayBvYmplY3QgaXMgaW5zZXJ0ZWQgaW4gZnJvbnQgb2YKICAgICAgdGhlIGN1cnJlbnQgdHJhY2ViYWNrLiAgV2hlbiBhbiBleGNlcHRpb24gaGFuZGxlciBpcyBlbnRlcmVkLAogICAgICB0aGUgc3RhY2sgdHJhY2UgaXMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0uIChTZWUgc2VjdGlvbgogICAgICAqVGhlIHRyeSBzdGF0ZW1lbnQqLikgSXQgaXMgYWNjZXNzaWJsZSBhcyBgYHN5cy5leGNfdHJhY2ViYWNrYGAsCiAgICAgIGFuZCBhbHNvIGFzIHRoZSB0aGlyZCBpdGVtIG9mIHRoZSB0dXBsZSByZXR1cm5lZCBieQogICAgICBgYHN5cy5leGNfaW5mbygpYGAuICBUaGUgbGF0dGVyIGlzIHRoZSBwcmVmZXJyZWQgaW50ZXJmYWNlLAogICAgICBzaW5jZSBpdCB3b3JrcyBjb3JyZWN0bHkgd2hlbiB0aGUgcHJvZ3JhbSBpcyB1c2luZyBtdWx0aXBsZQogICAgICB0aHJlYWRzLiBXaGVuIHRoZSBwcm9ncmFtIGNvbnRhaW5zIG5vIHN1aXRhYmxlIGhhbmRsZXIsIHRoZQogICAgICBzdGFjayB0cmFjZSBpcyB3cml0dGVuIChuaWNlbHkgZm9ybWF0dGVkKSB0byB0aGUgc3RhbmRhcmQgZXJyb3IKICAgICAgc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMgaW50ZXJhY3RpdmUsIGl0IGlzIGFsc28gbWFkZQogICAgICBhdmFpbGFibGUgdG8gdGhlIHVzZXIgYXMgYGBzeXMubGFzdF90cmFjZWJhY2tgYC4KCiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgdGJfbmV4dGBgIGlzIHRoZSBuZXh0IGxldmVsIGluCiAgICAgIHRoZSBzdGFjayB0cmFjZSAodG93YXJkcyB0aGUgZnJhbWUgd2hlcmUgdGhlIGV4Y2VwdGlvbgogICAgICBvY2N1cnJlZCksIG9yIGBgTm9uZWBgIGlmIHRoZXJlIGlzIG5vIG5leHQgbGV2ZWw7IGBgdGJfZnJhbWVgYAogICAgICBwb2ludHMgdG8gdGhlIGV4ZWN1dGlvbiBmcmFtZSBvZiB0aGUgY3VycmVudCBsZXZlbDsKICAgICAgYGB0Yl9saW5lbm9gYCBnaXZlcyB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIGV4Y2VwdGlvbgogICAgICBvY2N1cnJlZDsgYGB0Yl9sYXN0aWBgIGluZGljYXRlcyB0aGUgcHJlY2lzZSBpbnN0cnVjdGlvbi4gIFRoZQogICAgICBsaW5lIG51bWJlciBhbmQgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgdHJhY2ViYWNrIG1heSBkaWZmZXIKICAgICAgZnJvbSB0aGUgbGluZSBudW1iZXIgb2YgaXRzIGZyYW1lIG9iamVjdCBpZiB0aGUgZXhjZXB0aW9uCiAgICAgIG9jY3VycmVkIGluIGEgYGB0cnlgYCBzdGF0ZW1lbnQgd2l0aCBubyBtYXRjaGluZyBleGNlcHQgY2xhdXNlCiAgICAgIG9yIHdpdGggYSBmaW5hbGx5IGNsYXVzZS4KCiAgIFNsaWNlIG9iamVjdHMKICAgICAgU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIHdoZW4gKmV4dGVuZGVkIHNsaWNlCiAgICAgIHN5bnRheCogaXMgdXNlZC4gVGhpcyBpcyBhIHNsaWNlIHVzaW5nIHR3byBjb2xvbnMsIG9yIG11bHRpcGxlCiAgICAgIHNsaWNlcyBvciBlbGxpcHNlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBlLmcuLCBgYGFbaTpqOnN0ZXBdYGAsCiAgICAgIGBgYVtpOmosIGs6bF1gYCwgb3IgYGBhWy4uLiwgaTpqXWBgLiAgVGhleSBhcmUgYWxzbyBjcmVhdGVkIGJ5CiAgICAgIHRoZSBidWlsdC1pbiBgYHNsaWNlKClgYCBmdW5jdGlvbi4KCiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgc3RhcnRgYCBpcyB0aGUgbG93ZXIgYm91bmQ7CiAgICAgIGBgc3RvcGBgIGlzIHRoZSB1cHBlciBib3VuZDsgYGBzdGVwYGAgaXMgdGhlIHN0ZXAgdmFsdWU7IGVhY2ggaXMKICAgICAgYGBOb25lYGAgaWYgb21pdHRlZC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuCgogICAgICBTbGljZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDoKCiAgICAgIHNsaWNlLmluZGljZXMoc2VsZiwgbGVuZ3RoKQoKICAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCAqbGVuZ3RoKiBhbmQKICAgICAgICAgY29tcHV0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4dGVuZGVkIHNsaWNlIHRoYXQgdGhlIHNsaWNlCiAgICAgICAgIG9iamVjdCB3b3VsZCBkZXNjcmliZSBpZiBhcHBsaWVkIHRvIGEgc2VxdWVuY2Ugb2YgKmxlbmd0aCoKICAgICAgICAgaXRlbXMuICBJdCByZXR1cm5zIGEgdHVwbGUgb2YgdGhyZWUgaW50ZWdlcnM7IHJlc3BlY3RpdmVseQogICAgICAgICB0aGVzZSBhcmUgdGhlICpzdGFydCogYW5kICpzdG9wKiBpbmRpY2VzIGFuZCB0aGUgKnN0ZXAqIG9yCiAgICAgICAgIHN0cmlkZSBsZW5ndGggb2YgdGhlIHNsaWNlLiBNaXNzaW5nIG9yIG91dC1vZi1ib3VuZHMgaW5kaWNlcwogICAgICAgICBhcmUgaGFuZGxlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggcmVndWxhciBzbGljZXMuCgogICAgICAgICBOZXcgaW4gdmVyc2lvbiAyLjMuCgogICBTdGF0aWMgbWV0aG9kIG9iamVjdHMKICAgICAgU3RhdGljIG1ldGhvZCBvYmplY3RzIHByb3ZpZGUgYSB3YXkgb2YgZGVmZWF0aW5nIHRoZQogICAgICB0cmFuc2Zvcm1hdGlvbiBvZiBmdW5jdGlvbiBvYmplY3RzIHRvIG1ldGhvZCBvYmplY3RzIGRlc2NyaWJlZAogICAgICBhYm92ZS4gQSBzdGF0aWMgbWV0aG9kIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFueSBvdGhlcgogICAgICBvYmplY3QsIHVzdWFsbHkgYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdC4gV2hlbiBhIHN0YXRpYwogICAgICBtZXRob2Qgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3Mgb3IgYSBjbGFzcyBpbnN0YW5jZSwgdGhlCiAgICAgIG9iamVjdCBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgd3JhcHBlZCBvYmplY3QsIHdoaWNoIGlzIG5vdAogICAgICBzdWJqZWN0IHRvIGFueSBmdXJ0aGVyIHRyYW5zZm9ybWF0aW9uLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlCiAgICAgIG5vdCB0aGVtc2VsdmVzIGNhbGxhYmxlLCBhbHRob3VnaCB0aGUgb2JqZWN0cyB0aGV5IHdyYXAgdXN1YWxseQogICAgICBhcmUuIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW4KICAgICAgYGBzdGF0aWNtZXRob2QoKWBgIGNvbnN0cnVjdG9yLgoKICAgQ2xhc3MgbWV0aG9kIG9iamVjdHMKICAgICAgQSBjbGFzcyBtZXRob2Qgb2JqZWN0LCBsaWtlIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGlzIGEgd3JhcHBlcgogICAgICBhcm91bmQgYW5vdGhlciBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIHdheSBpbiB3aGljaCB0aGF0IG9iamVjdAogICAgICBpcyByZXRyaWV2ZWQgZnJvbSBjbGFzc2VzIGFuZCBjbGFzcyBpbnN0YW5jZXMuIFRoZSBiZWhhdmlvdXIgb2YKICAgICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgdXBvbiBzdWNoIHJldHJpZXZhbCBpcyBkZXNjcmliZWQgYWJvdmUsCiAgICAgIHVuZGVyICJVc2VyLWRlZmluZWQgbWV0aG9kcyIuIENsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkCiAgICAgIGJ5IHRoZSBidWlsdC1pbiBgYGNsYXNzbWV0aG9kKClgYCBjb25zdHJ1Y3Rvci4KdAUAAAB0eXBlc3OxAQAACkZ1bmN0aW9ucwoqKioqKioqKioKCkZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seQpvcGVyYXRpb24gb24gYSBmdW5jdGlvbiBvYmplY3QgaXMgdG8gY2FsbCBpdDogYGBmdW5jKGFyZ3VtZW50LWxpc3QpYGAuCgpUaGVyZSBhcmUgcmVhbGx5IHR3byBmbGF2b3JzIG9mIGZ1bmN0aW9uIG9iamVjdHM6IGJ1aWx0LWluIGZ1bmN0aW9ucwphbmQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gIEJvdGggc3VwcG9ydCB0aGUgc2FtZSBvcGVyYXRpb24gKHRvIGNhbGwKdGhlIGZ1bmN0aW9uKSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQsIGhlbmNlIHRoZQpkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLgoKU2VlICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIG1vcmUgaW5mb3JtYXRpb24uCnQOAAAAdHlwZXNmdW5jdGlvbnNzjC4AAApNYXBwaW5nIFR5cGVzIC0tLSBgYGRpY3RgYAoqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQSAqbWFwcGluZyogb2JqZWN0IG1hcHMgKmhhc2hhYmxlKiB2YWx1ZXMgdG8gYXJiaXRyYXJ5IG9iamVjdHMuCk1hcHBpbmdzIGFyZSBtdXRhYmxlIG9iamVjdHMuICBUaGVyZSBpcyBjdXJyZW50bHkgb25seSBvbmUgc3RhbmRhcmQKbWFwcGluZyB0eXBlLCB0aGUgKmRpY3Rpb25hcnkqLiAgKEZvciBvdGhlciBjb250YWluZXJzIHNlZSB0aGUgYnVpbHQKaW4gYGBsaXN0YGAsIGBgc2V0YGAsIGFuZCBgYHR1cGxlYGAgY2xhc3NlcywgYW5kIHRoZSBgYGNvbGxlY3Rpb25zYGAKbW9kdWxlLikKCkEgZGljdGlvbmFyeSdzIGtleXMgYXJlICphbG1vc3QqIGFyYml0cmFyeSB2YWx1ZXMuICBWYWx1ZXMgdGhhdCBhcmUKbm90ICpoYXNoYWJsZSosIHRoYXQgaXMsIHZhbHVlcyBjb250YWluaW5nIGxpc3RzLCBkaWN0aW9uYXJpZXMgb3IKb3RoZXIgbXV0YWJsZSB0eXBlcyAodGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkgb2JqZWN0CmlkZW50aXR5KSBtYXkgbm90IGJlIHVzZWQgYXMga2V5cy4gIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5CnRoZSBub3JtYWwgcnVsZXMgZm9yIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbAooc3VjaCBhcyBgYDFgYCBhbmQgYGAxLjBgYCkgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0bwppbmRleCB0aGUgc2FtZSBkaWN0aW9uYXJ5IGVudHJ5LiAgKE5vdGUgaG93ZXZlciwgdGhhdCBzaW5jZSBjb21wdXRlcnMKc3RvcmUgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhcyBhcHByb3hpbWF0aW9ucyBpdCBpcyB1c3VhbGx5IHVud2lzZSB0bwp1c2UgdGhlbSBhcyBkaWN0aW9uYXJ5IGtleXMuKQoKRGljdGlvbmFyaWVzIGNhbiBiZSBjcmVhdGVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZgpgYGtleTogdmFsdWVgYCBwYWlycyB3aXRoaW4gYnJhY2VzLCBmb3IgZXhhbXBsZTogYGB7J2phY2snOiA0MDk4LAonc2pvZXJkJzogNDEyN31gYCBvciBgYHs0MDk4OiAnamFjaycsIDQxMjc6ICdzam9lcmQnfWBgLCBvciBieSB0aGUKYGBkaWN0YGAgY29uc3RydWN0b3IuCgpjbGFzcyBjbGFzcyBkaWN0KCoqa3dhcmcpCmNsYXNzIGNsYXNzIGRpY3QobWFwcGluZywgKiprd2FyZykKY2xhc3MgY2xhc3MgZGljdChpdGVyYWJsZSwgKiprd2FyZykKCiAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgcG9zaXRpb25hbAogICBhcmd1bWVudCBhbmQgYSBwb3NzaWJseSBlbXB0eSBzZXQgb2Yga2V5d29yZCBhcmd1bWVudHMuCgogICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQuCiAgIElmIGEgcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYSBtYXBwaW5nIG9iamVjdCwgYQogICBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBrZXktdmFsdWUgcGFpcnMgYXMgdGhlIG1hcHBpbmcKICAgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGFuICppdGVyYXRvcioKICAgb2JqZWN0LiAgRWFjaCBpdGVtIGluIHRoZSBpdGVyYWJsZSBtdXN0IGl0c2VsZiBiZSBhbiBpdGVyYXRvciB3aXRoCiAgIGV4YWN0bHkgdHdvIG9iamVjdHMuICBUaGUgZmlyc3Qgb2JqZWN0IG9mIGVhY2ggaXRlbSBiZWNvbWVzIGEga2V5CiAgIGluIHRoZSBuZXcgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgb2JqZWN0IHRoZSBjb3JyZXNwb25kaW5nCiAgIHZhbHVlLiAgSWYgYSBrZXkgb2NjdXJzIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCB2YWx1ZSBmb3IgdGhhdCBrZXkKICAgYmVjb21lcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgbmV3IGRpY3Rpb25hcnkuCgogICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlaXIKICAgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeSBjcmVhdGVkIGZyb20gdGhlIHBvc2l0aW9uYWwKICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBmcm9tCiAgIHRoZSBrZXl3b3JkIGFyZ3VtZW50IHJlcGxhY2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSBwb3NpdGlvbmFsCiAgIGFyZ3VtZW50LgoKICAgVG8gaWxsdXN0cmF0ZSwgdGhlIGZvbGxvd2luZyBleGFtcGxlcyBhbGwgcmV0dXJuIGEgZGljdGlvbmFyeSBlcXVhbAogICB0byBgYHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9YGA6CgogICAgICA+Pj4gYSA9IGRpY3Qob25lPTEsIHR3bz0yLCB0aHJlZT0zKQogICAgICA+Pj4gYiA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDN9CiAgICAgID4+PiBjID0gZGljdCh6aXAoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sIFsxLCAyLCAzXSkpCiAgICAgID4+PiBkID0gZGljdChbKCd0d28nLCAyKSwgKCdvbmUnLCAxKSwgKCd0aHJlZScsIDMpXSkKICAgICAgPj4+IGUgPSBkaWN0KHsndGhyZWUnOiAzLCAnb25lJzogMSwgJ3R3byc6IDJ9KQogICAgICA+Pj4gYSA9PSBiID09IGMgPT0gZCA9PSBlCiAgICAgIFRydWUKCiAgIFByb3ZpZGluZyBrZXl3b3JkIGFyZ3VtZW50cyBhcyBpbiB0aGUgZmlyc3QgZXhhbXBsZSBvbmx5IHdvcmtzIGZvcgogICBrZXlzIHRoYXQgYXJlIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVycy4gIE90aGVyd2lzZSwgYW55IHZhbGlkIGtleXMKICAgY2FuIGJlIHVzZWQuCgogICBOZXcgaW4gdmVyc2lvbiAyLjIuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBidWlsZGluZyBhIGRpY3Rpb25hcnkgZnJvbQogICBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC4KCiAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9ucyB0aGF0IGRpY3Rpb25hcmllcyBzdXBwb3J0IChhbmQgdGhlcmVmb3JlLAogICBjdXN0b20gbWFwcGluZyB0eXBlcyBzaG91bGQgc3VwcG9ydCB0b28pOgoKICAgbGVuKGQpCgogICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGljdGlvbmFyeSAqZCouCgogICBkW2tleV0KCiAgICAgIFJldHVybiB0aGUgaXRlbSBvZiAqZCogd2l0aCBrZXkgKmtleSouICBSYWlzZXMgYSBgYEtleUVycm9yYGAgaWYKICAgICAgKmtleSogaXMgbm90IGluIHRoZSBtYXAuCgogICAgICBOZXcgaW4gdmVyc2lvbiAyLjU6IElmIGEgc3ViY2xhc3Mgb2YgZGljdCBkZWZpbmVzIGEgbWV0aG9kCiAgICAgIGBgX19taXNzaW5nX18oKWBgLCBpZiB0aGUga2V5ICprZXkqIGlzIG5vdCBwcmVzZW50LCB0aGUKICAgICAgYGBkW2tleV1gYCBvcGVyYXRpb24gY2FsbHMgdGhhdCBtZXRob2Qgd2l0aCB0aGUga2V5ICprZXkqIGFzCiAgICAgIGFyZ3VtZW50LiAgVGhlIGBgZFtrZXldYGAgb3BlcmF0aW9uIHRoZW4gcmV0dXJucyBvciByYWlzZXMKICAgICAgd2hhdGV2ZXIgaXMgcmV0dXJuZWQgb3IgcmFpc2VkIGJ5IHRoZSBgYF9fbWlzc2luZ19fKGtleSlgYCBjYWxsCiAgICAgIGlmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQuIE5vIG90aGVyIG9wZXJhdGlvbnMgb3IgbWV0aG9kcyBpbnZva2UKICAgICAgYGBfX21pc3NpbmdfXygpYGAuIElmIGBgX19taXNzaW5nX18oKWBgIGlzIG5vdCBkZWZpbmVkLAogICAgICBgYEtleUVycm9yYGAgaXMgcmFpc2VkLiAgYGBfX21pc3NpbmdfXygpYGAgbXVzdCBiZSBhIG1ldGhvZDsgaXQKICAgICAgY2Fubm90IGJlIGFuIGluc3RhbmNlIHZhcmlhYmxlLiBGb3IgYW4gZXhhbXBsZSwgc2VlCiAgICAgIGBgY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RgYC4KCiAgIGRba2V5XSA9IHZhbHVlCgogICAgICBTZXQgYGBkW2tleV1gYCB0byAqdmFsdWUqLgoKICAgZGVsIGRba2V5XQoKICAgICAgUmVtb3ZlIGBgZFtrZXldYGAgZnJvbSAqZCouICBSYWlzZXMgYSBgYEtleUVycm9yYGAgaWYgKmtleSogaXMKICAgICAgbm90IGluIHRoZSBtYXAuCgogICBrZXkgaW4gZAoKICAgICAgUmV0dXJuIGBgVHJ1ZWBgIGlmICpkKiBoYXMgYSBrZXkgKmtleSosIGVsc2UgYGBGYWxzZWBgLgoKICAgICAgTmV3IGluIHZlcnNpb24gMi4yLgoKICAga2V5IG5vdCBpbiBkCgogICAgICBFcXVpdmFsZW50IHRvIGBgbm90IGtleSBpbiBkYGAuCgogICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuCgogICBpdGVyKGQpCgogICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeS4gIFRoaXMgaXMgYQogICAgICBzaG9ydGN1dCBmb3IgYGBpdGVya2V5cygpYGAuCgogICBjbGVhcigpCgogICAgICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGRpY3Rpb25hcnkuCgogICBjb3B5KCkKCiAgICAgIFJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgZGljdGlvbmFyeS4KCiAgIGZyb21rZXlzKHNlcVssIHZhbHVlXSkKCiAgICAgIENyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tICpzZXEqIGFuZCB2YWx1ZXMgc2V0IHRvCiAgICAgICp2YWx1ZSouCgogICAgICBgYGZyb21rZXlzKClgYCBpcyBhIGNsYXNzIG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgZGljdGlvbmFyeS4KICAgICAgKnZhbHVlKiBkZWZhdWx0cyB0byBgYE5vbmVgYC4KCiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMy4KCiAgIGdldChrZXlbLCBkZWZhdWx0XSkKCiAgICAgIFJldHVybiB0aGUgdmFsdWUgZm9yICprZXkqIGlmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlCiAgICAgICpkZWZhdWx0Ki4gSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gYGBOb25lYGAsCiAgICAgIHNvIHRoYXQgdGhpcyBtZXRob2QgbmV2ZXIgcmFpc2VzIGEgYGBLZXlFcnJvcmBgLgoKICAgaGFzX2tleShrZXkpCgogICAgICBUZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgKmtleSogaW4gdGhlIGRpY3Rpb25hcnkuICBgYGhhc19rZXkoKWBgCiAgICAgIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYGBrZXkgaW4gZGBgLgoKICAgaXRlbXMoKQoKICAgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgZGljdGlvbmFyeSdzIGxpc3Qgb2YgYGAoa2V5LCB2YWx1ZSlgYAogICAgICBwYWlycy4KCiAgICAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogS2V5cyBhbmQgdmFsdWVzIGFyZSBsaXN0ZWQgaW4KICAgICAgYW4gYXJiaXRyYXJ5IG9yZGVyIHdoaWNoIGlzIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uCiAgICAgIGltcGxlbWVudGF0aW9ucywgYW5kIGRlcGVuZHMgb24gdGhlIGRpY3Rpb25hcnkncyBoaXN0b3J5IG9mCiAgICAgIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy4KCiAgICAgIElmIGBgaXRlbXMoKWBgLCBgYGtleXMoKWBgLCBgYHZhbHVlcygpYGAsIGBgaXRlcml0ZW1zKClgYCwKICAgICAgYGBpdGVya2V5cygpYGAsIGFuZCBgYGl0ZXJ2YWx1ZXMoKWBgIGFyZSBjYWxsZWQgd2l0aCBubwogICAgICBpbnRlcnZlbmluZyBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5LCB0aGUgbGlzdHMgd2lsbAogICAgICBkaXJlY3RseSBjb3JyZXNwb25kLiAgVGhpcyBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGBgKHZhbHVlLAogICAgICBrZXkpYGAgcGFpcnMgdXNpbmcgYGB6aXAoKWBgOiBgYHBhaXJzID0gemlwKGQudmFsdWVzKCksCiAgICAgIGQua2V5cygpKWBgLiAgVGhlIHNhbWUgcmVsYXRpb25zaGlwIGhvbGRzIGZvciB0aGUgYGBpdGVya2V5cygpYGAKICAgICAgYW5kIGBgaXRlcnZhbHVlcygpYGAgbWV0aG9kczogYGBwYWlycyA9IHppcChkLml0ZXJ2YWx1ZXMoKSwKICAgICAgZC5pdGVya2V5cygpKWBgIHByb3ZpZGVzIHRoZSBzYW1lIHZhbHVlIGZvciBgYHBhaXJzYGAuIEFub3RoZXIKICAgICAgd2F5IHRvIGNyZWF0ZSB0aGUgc2FtZSBsaXN0IGlzIGBgcGFpcnMgPSBbKHYsIGspIGZvciAoaywgdikgaW4KICAgICAgZC5pdGVyaXRlbXMoKV1gYC4KCiAgIGl0ZXJpdGVtcygpCgogICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGljdGlvbmFyeSdzIGBgKGtleSwgdmFsdWUpYGAgcGFpcnMuCiAgICAgIFNlZSB0aGUgbm90ZSBmb3IgYGBkaWN0Lml0ZW1zKClgYC4KCiAgICAgIFVzaW5nIGBgaXRlcml0ZW1zKClgYCB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGUKICAgICAgZGljdGlvbmFyeSBtYXkgcmFpc2UgYSBgYFJ1bnRpbWVFcnJvcmBgIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyCiAgICAgIGFsbCBlbnRyaWVzLgoKICAgICAgTmV3IGluIHZlcnNpb24gMi4yLgoKICAgaXRlcmtleXMoKQoKICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Rpb25hcnkncyBrZXlzLiAgU2VlIHRoZSBub3RlIGZvcgogICAgICBgYGRpY3QuaXRlbXMoKWBgLgoKICAgICAgVXNpbmcgYGBpdGVya2V5cygpYGAgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlCiAgICAgIGRpY3Rpb25hcnkgbWF5IHJhaXNlIGEgYGBSdW50aW1lRXJyb3JgYCBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlcgogICAgICBhbGwgZW50cmllcy4KCiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMi4KCiAgIGl0ZXJ2YWx1ZXMoKQoKICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Rpb25hcnkncyB2YWx1ZXMuICBTZWUgdGhlIG5vdGUKICAgICAgZm9yIGBgZGljdC5pdGVtcygpYGAuCgogICAgICBVc2luZyBgYGl0ZXJ2YWx1ZXMoKWBgIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZQogICAgICBkaWN0aW9uYXJ5IG1heSByYWlzZSBhIGBgUnVudGltZUVycm9yYGAgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXIKICAgICAgYWxsIGVudHJpZXMuCgogICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuCgogICBrZXlzKCkKCiAgICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIGRpY3Rpb25hcnkncyBsaXN0IG9mIGtleXMuICBTZWUgdGhlIG5vdGUKICAgICAgZm9yIGBgZGljdC5pdGVtcygpYGAuCgogICBwb3Aoa2V5WywgZGVmYXVsdF0pCgogICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLAogICAgICBlbHNlIHJldHVybiAqZGVmYXVsdCouICBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuIGFuZCAqa2V5KiBpcwogICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgYGBLZXlFcnJvcmBgIGlzIHJhaXNlZC4KCiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMy4KCiAgIHBvcGl0ZW0oKQoKICAgICAgUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IGBgKGtleSwgdmFsdWUpYGAgcGFpciBmcm9tIHRoZQogICAgICBkaWN0aW9uYXJ5LgoKICAgICAgYGBwb3BpdGVtKClgYCBpcyB1c2VmdWwgdG8gZGVzdHJ1Y3RpdmVseSBpdGVyYXRlIG92ZXIgYQogICAgICBkaWN0aW9uYXJ5LCBhcyBvZnRlbiB1c2VkIGluIHNldCBhbGdvcml0aG1zLiAgSWYgdGhlIGRpY3Rpb25hcnkKICAgICAgaXMgZW1wdHksIGNhbGxpbmcgYGBwb3BpdGVtKClgYCByYWlzZXMgYSBgYEtleUVycm9yYGAuCgogICBzZXRkZWZhdWx0KGtleVssIGRlZmF1bHRdKQoKICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiBub3QsIGluc2VydAogICAgICAqa2V5KiB3aXRoIGEgdmFsdWUgb2YgKmRlZmF1bHQqIGFuZCByZXR1cm4gKmRlZmF1bHQqLiAgKmRlZmF1bHQqCiAgICAgIGRlZmF1bHRzIHRvIGBgTm9uZWBgLgoKICAgdXBkYXRlKFtvdGhlcl0pCgogICAgICBVcGRhdGUgdGhlIGRpY3Rpb25hcnkgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzIGZyb20gKm90aGVyKiwKICAgICAgb3ZlcndyaXRpbmcgZXhpc3Rpbmcga2V5cy4gIFJldHVybiBgYE5vbmVgYC4KCiAgICAgIGBgdXBkYXRlKClgYCBhY2NlcHRzIGVpdGhlciBhbm90aGVyIGRpY3Rpb25hcnkgb2JqZWN0IG9yIGFuCiAgICAgIGl0ZXJhYmxlIG9mIGtleS92YWx1ZSBwYWlycyAoYXMgdHVwbGVzIG9yIG90aGVyIGl0ZXJhYmxlcyBvZgogICAgICBsZW5ndGggdHdvKS4gIElmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQsIHRoZSBkaWN0aW9uYXJ5CiAgICAgIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczogYGBkLnVwZGF0ZShyZWQ9MSwKICAgICAgYmx1ZT0yKWBgLgoKICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogQWxsb3dlZCB0aGUgYXJndW1lbnQgdG8gYmUgYW4gaXRlcmFibGUKICAgICAgb2Yga2V5L3ZhbHVlIHBhaXJzIGFuZCBhbGxvd2VkIGtleXdvcmQgYXJndW1lbnRzLgoKICAgdmFsdWVzKCkKCiAgICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIGRpY3Rpb25hcnkncyBsaXN0IG9mIHZhbHVlcy4gIFNlZSB0aGUgbm90ZQogICAgICBmb3IgYGBkaWN0Lml0ZW1zKClgYC4KCiAgIHZpZXdpdGVtcygpCgogICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeSdzIGl0ZW1zIChgYChrZXksIHZhbHVlKWBgCiAgICAgIHBhaXJzKS4gIFNlZSBiZWxvdyBmb3IgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuCgogICAgICBOZXcgaW4gdmVyc2lvbiAyLjcuCgogICB2aWV3a2V5cygpCgogICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeSdzIGtleXMuICBTZWUgYmVsb3cgZm9yCiAgICAgIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLgoKICAgICAgTmV3IGluIHZlcnNpb24gMi43LgoKICAgdmlld3ZhbHVlcygpCgogICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeSdzIHZhbHVlcy4gIFNlZSBiZWxvdyBmb3IKICAgICAgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuCgogICAgICBOZXcgaW4gdmVyc2lvbiAyLjcuCgoKRGljdGlvbmFyeSB2aWV3IG9iamVjdHMKPT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBvYmplY3RzIHJldHVybmVkIGJ5IGBgZGljdC52aWV3a2V5cygpYGAsIGBgZGljdC52aWV3dmFsdWVzKClgYCBhbmQKYGBkaWN0LnZpZXdpdGVtcygpYGAgYXJlICp2aWV3IG9iamVjdHMqLiAgVGhleSBwcm92aWRlIGEgZHluYW1pYyB2aWV3Cm9uIHRoZSBkaWN0aW9uYXJ5J3MgZW50cmllcywgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSBkaWN0aW9uYXJ5CmNoYW5nZXMsIHRoZSB2aWV3IHJlZmxlY3RzIHRoZXNlIGNoYW5nZXMuCgpEaWN0aW9uYXJ5IHZpZXdzIGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHlpZWxkIHRoZWlyIHJlc3BlY3RpdmUgZGF0YSwKYW5kIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0czoKCmxlbihkaWN0dmlldykKCiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkuCgppdGVyKGRpY3R2aWV3KQoKICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMsIHZhbHVlcyBvciBpdGVtcyAocmVwcmVzZW50ZWQgYXMKICAgdHVwbGVzIG9mIGBgKGtleSwgdmFsdWUpYGApIGluIHRoZSBkaWN0aW9uYXJ5LgoKICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIGFuIGFyYml0cmFyeSBvcmRlciB3aGljaCBpcwogICBub24tcmFuZG9tLCB2YXJpZXMgYWNyb3NzIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMsIGFuZCBkZXBlbmRzIG9uCiAgIHRoZSBkaWN0aW9uYXJ5J3MgaGlzdG9yeSBvZiBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuIElmIGtleXMsCiAgIHZhbHVlcyBhbmQgaXRlbXMgdmlld3MgYXJlIGl0ZXJhdGVkIG92ZXIgd2l0aCBubyBpbnRlcnZlbmluZwogICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5LCB0aGUgb3JkZXIgb2YgaXRlbXMgd2lsbCBkaXJlY3RseQogICBjb3JyZXNwb25kLiAgVGhpcyBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGBgKHZhbHVlLCBrZXkpYGAgcGFpcnMKICAgdXNpbmcgYGB6aXAoKWBgOiBgYHBhaXJzID0gemlwKGQudmFsdWVzKCksIGQua2V5cygpKWBgLiAgQW5vdGhlcgogICB3YXkgdG8gY3JlYXRlIHRoZSBzYW1lIGxpc3QgaXMgYGBwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpbgogICBkLml0ZW1zKCldYGAuCgogICBJdGVyYXRpbmcgdmlld3Mgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkKICAgbWF5IHJhaXNlIGEgYGBSdW50aW1lRXJyb3JgYCBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlciBhbGwgZW50cmllcy4KCnggaW4gZGljdHZpZXcKCiAgIFJldHVybiBgYFRydWVgYCBpZiAqeCogaXMgaW4gdGhlIHVuZGVybHlpbmcgZGljdGlvbmFyeSdzIGtleXMsCiAgIHZhbHVlcyBvciBpdGVtcyAoaW4gdGhlIGxhdHRlciBjYXNlLCAqeCogc2hvdWxkIGJlIGEgYGAoa2V5LAogICB2YWx1ZSlgYCB0dXBsZSkuCgpLZXlzIHZpZXdzIGFyZSBzZXQtbGlrZSBzaW5jZSB0aGVpciBlbnRyaWVzIGFyZSB1bmlxdWUgYW5kIGhhc2hhYmxlLgpJZiBhbGwgdmFsdWVzIGFyZSBoYXNoYWJsZSwgc28gdGhhdCAoa2V5LCB2YWx1ZSkgcGFpcnMgYXJlIHVuaXF1ZSBhbmQKaGFzaGFibGUsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgaXMgYWxzbyBzZXQtbGlrZS4gIChWYWx1ZXMgdmlld3MgYXJlIG5vdAp0cmVhdGVkIGFzIHNldC1saWtlIHNpbmNlIHRoZSBlbnRyaWVzIGFyZSBnZW5lcmFsbHkgbm90IHVuaXF1ZS4pICBUaGVuCnRoZXNlIHNldCBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUgKCJvdGhlciIgcmVmZXJzIGVpdGhlciB0byBhbm90aGVyCnZpZXcgb3IgYSBzZXQpOgoKZGljdHZpZXcgJiBvdGhlcgoKICAgUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGRpY3R2aWV3IGFuZCB0aGUgb3RoZXIgb2JqZWN0IGFzIGEKICAgbmV3IHNldC4KCmRpY3R2aWV3IHwgb3RoZXIKCiAgIFJldHVybiB0aGUgdW5pb24gb2YgdGhlIGRpY3R2aWV3IGFuZCB0aGUgb3RoZXIgb2JqZWN0IGFzIGEgbmV3IHNldC4KCmRpY3R2aWV3IC0gb3RoZXIKCiAgIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkaWN0dmlldyBhbmQgdGhlIG90aGVyIG9iamVjdAogICAoYWxsIGVsZW1lbnRzIGluICpkaWN0dmlldyogdGhhdCBhcmVuJ3QgaW4gKm90aGVyKikgYXMgYSBuZXcgc2V0LgoKZGljdHZpZXcgXiBvdGhlcgoKICAgUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSAoYWxsIGVsZW1lbnRzIGVpdGhlciBpbiAqZGljdHZpZXcqCiAgIG9yICpvdGhlciosIGJ1dCBub3QgaW4gYm90aCkgb2YgdGhlIGRpY3R2aWV3IGFuZCB0aGUgb3RoZXIgb2JqZWN0CiAgIGFzIGEgbmV3IHNldC4KCkFuIGV4YW1wbGUgb2YgZGljdGlvbmFyeSB2aWV3IHVzYWdlOgoKICAgPj4+IGRpc2hlcyA9IHsnZWdncyc6IDIsICdzYXVzYWdlJzogMSwgJ2JhY29uJzogMSwgJ3NwYW0nOiA1MDB9CiAgID4+PiBrZXlzID0gZGlzaGVzLnZpZXdrZXlzKCkKICAgPj4+IHZhbHVlcyA9IGRpc2hlcy52aWV3dmFsdWVzKCkKCiAgID4+PiAjIGl0ZXJhdGlvbgogICA+Pj4gbiA9IDAKICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOgogICAuLi4gICAgIG4gKz0gdmFsCiAgID4+PiBwcmludChuKQogICA1MDQKCiAgID4+PiAjIGtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiB0aGUgc2FtZSBvcmRlcgogICA+Pj4gbGlzdChrZXlzKQogICBbJ2VnZ3MnLCAnYmFjb24nLCAnc2F1c2FnZScsICdzcGFtJ10KICAgPj4+IGxpc3QodmFsdWVzKQogICBbMiwgMSwgMSwgNTAwXQoKICAgPj4+ICMgdmlldyBvYmplY3RzIGFyZSBkeW5hbWljIGFuZCByZWZsZWN0IGRpY3QgY2hhbmdlcwogICA+Pj4gZGVsIGRpc2hlc1snZWdncyddCiAgID4+PiBkZWwgZGlzaGVzWydzYXVzYWdlJ10KICAgPj4+IGxpc3Qoa2V5cykKICAgWydzcGFtJywgJ2JhY29uJ10KCiAgID4+PiAjIHNldCBvcGVyYXRpb25zCiAgID4+PiBrZXlzICYgeydlZ2dzJywgJ2JhY29uJywgJ3NhbGFkJ30KICAgeydiYWNvbid9CnQMAAAAdHlwZXNtYXBwaW5nc5QHAAAKTWV0aG9kcwoqKioqKioqCgpNZXRob2RzIGFyZSBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbm90YXRpb24uClRoZXJlIGFyZSB0d28gZmxhdm9yczogYnVpbHQtaW4gbWV0aG9kcyAoc3VjaCBhcyBgYGFwcGVuZCgpYGAgb24KbGlzdHMpIGFuZCBjbGFzcyBpbnN0YW5jZSBtZXRob2RzLiAgQnVpbHQtaW4gbWV0aG9kcyBhcmUgZGVzY3JpYmVkCndpdGggdGhlIHR5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLgoKVGhlIGltcGxlbWVudGF0aW9uIGFkZHMgdHdvIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgdG8gY2xhc3MKaW5zdGFuY2UgbWV0aG9kczogYGBtLmltX3NlbGZgYCBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2QKb3BlcmF0ZXMsIGFuZCBgYG0uaW1fZnVuY2BgIGlzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZC4KQ2FsbGluZyBgYG0oYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKWBgIGlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0bwpjYWxsaW5nIGBgbS5pbV9mdW5jKG0uaW1fc2VsZiwgYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKWBgLgoKQ2xhc3MgaW5zdGFuY2UgbWV0aG9kcyBhcmUgZWl0aGVyICpib3VuZCogb3IgKnVuYm91bmQqLCByZWZlcnJpbmcgdG8Kd2hldGhlciB0aGUgbWV0aG9kIHdhcyBhY2Nlc3NlZCB0aHJvdWdoIGFuIGluc3RhbmNlIG9yIGEgY2xhc3MsCnJlc3BlY3RpdmVseS4gIFdoZW4gYSBtZXRob2QgaXMgdW5ib3VuZCwgaXRzIGBgaW1fc2VsZmBgIGF0dHJpYnV0ZQp3aWxsIGJlIGBgTm9uZWBgIGFuZCBpZiBjYWxsZWQsIGFuIGV4cGxpY2l0IGBgc2VsZmBgIG9iamVjdCBtdXN0IGJlCnBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICBJbiB0aGlzIGNhc2UsIGBgc2VsZmBgIG11c3QgYmUgYW4KaW5zdGFuY2Ugb2YgdGhlIHVuYm91bmQgbWV0aG9kJ3MgY2xhc3MgKG9yIGEgc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcyksCm90aGVyd2lzZSBhIGBgVHlwZUVycm9yYGAgaXMgcmFpc2VkLgoKTGlrZSBmdW5jdGlvbiBvYmplY3RzLCBtZXRob2RzIG9iamVjdHMgc3VwcG9ydCBnZXR0aW5nIGFyYml0cmFyeQphdHRyaWJ1dGVzLiBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkgc3RvcmVkIG9uCnRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdCAoYGBtZXRoLmltX2Z1bmNgYCksIHNldHRpbmcgbWV0aG9kCmF0dHJpYnV0ZXMgb24gZWl0aGVyIGJvdW5kIG9yIHVuYm91bmQgbWV0aG9kcyBpcyBkaXNhbGxvd2VkLgpBdHRlbXB0aW5nIHRvIHNldCBhbiBhdHRyaWJ1dGUgb24gYSBtZXRob2QgcmVzdWx0cyBpbiBhbgpgYEF0dHJpYnV0ZUVycm9yYGAgYmVpbmcgcmFpc2VkLiAgSW4gb3JkZXIgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSwKeW91IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0OgoKICAgPj4+IGNsYXNzIEM6CiAgIC4uLiAgICAgZGVmIG1ldGhvZChzZWxmKToKICAgLi4uICAgICAgICAgcGFzcwogICAuLi4KICAgPj4+IGMgPSBDKCkKICAgPj4+IGMubWV0aG9kLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCcgICMgY2FuJ3Qgc2V0IG9uIHRoZSBtZXRob2QKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgIEF0dHJpYnV0ZUVycm9yOiAnaW5zdGFuY2VtZXRob2QnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICd3aG9hbWknCiAgID4+PiBjLm1ldGhvZC5pbV9mdW5jLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCcKICAgPj4+IGMubWV0aG9kLndob2FtaQogICAnbXkgbmFtZSBpcyBtZXRob2QnCgpTZWUgKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSogZm9yIG1vcmUgaW5mb3JtYXRpb24uCnQMAAAAdHlwZXNtZXRob2RzczUEAAAKTW9kdWxlcwoqKioqKioqCgpUaGUgb25seSBzcGVjaWFsIG9wZXJhdGlvbiBvbiBhIG1vZHVsZSBpcyBhdHRyaWJ1dGUgYWNjZXNzOgpgYG0ubmFtZWBgLCB3aGVyZSAqbSogaXMgYSBtb2R1bGUgYW5kICpuYW1lKiBhY2Nlc3NlcyBhIG5hbWUgZGVmaW5lZAppbiAqbSoncyBzeW1ib2wgdGFibGUuIE1vZHVsZSBhdHRyaWJ1dGVzIGNhbiBiZSBhc3NpZ25lZCB0by4gIChOb3RlCnRoYXQgdGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50IGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvbgpvbiBhIG1vZHVsZSBvYmplY3Q7IGBgaW1wb3J0IGZvb2BgIGRvZXMgbm90IHJlcXVpcmUgYSBtb2R1bGUgb2JqZWN0Cm5hbWVkICpmb28qIHRvIGV4aXN0LCByYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSAqZGVmaW5pdGlvbioKZm9yIGEgbW9kdWxlIG5hbWVkICpmb28qIHNvbWV3aGVyZS4pCgpBIHNwZWNpYWwgYXR0cmlidXRlIG9mIGV2ZXJ5IG1vZHVsZSBpcyBgYF9fZGljdF9fYGAuIFRoaXMgaXMgdGhlCmRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgdGhpcwpkaWN0aW9uYXJ5IHdpbGwgYWN0dWFsbHkgY2hhbmdlIHRoZSBtb2R1bGUncyBzeW1ib2wgdGFibGUsIGJ1dCBkaXJlY3QKYXNzaWdubWVudCB0byB0aGUgYGBfX2RpY3RfX2BgIGF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSBjYW4Kd3JpdGUgYGBtLl9fZGljdF9fWydhJ10gPSAxYGAsIHdoaWNoIGRlZmluZXMgYGBtLmFgYCB0byBiZSBgYDFgYCwgYnV0CnlvdSBjYW4ndCB3cml0ZSBgYG0uX19kaWN0X18gPSB7fWBgKS4gIE1vZGlmeWluZyBgYF9fZGljdF9fYGAgZGlyZWN0bHkKaXMgbm90IHJlY29tbWVuZGVkLgoKTW9kdWxlcyBidWlsdCBpbnRvIHRoZSBpbnRlcnByZXRlciBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6IGBgPG1vZHVsZQonc3lzJyAoYnVpbHQtaW4pPmBgLiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZSB3cml0dGVuIGFzCmBgPG1vZHVsZSAnb3MnIGZyb20gJy91c3IvbG9jYWwvbGliL3B5dGhvblguWS9vcy5weWMnPmBgLgp0DAAAAHR5cGVzbW9kdWxlc3O7pAAAClNlcXVlbmNlIFR5cGVzIC0tLSBgYHN0cmBgLCBgYHVuaWNvZGVgYCwgYGBsaXN0YGAsIGBgdHVwbGVgYCwgYGBieXRlYXJyYXlgYCwgYGBidWZmZXJgYCwgYGB4cmFuZ2VgYAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKClRoZXJlIGFyZSBzZXZlbiBzZXF1ZW5jZSB0eXBlczogc3RyaW5ncywgVW5pY29kZSBzdHJpbmdzLCBsaXN0cywKdHVwbGVzLCBieXRlYXJyYXlzLCBidWZmZXJzLCBhbmQgeHJhbmdlIG9iamVjdHMuCgpGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0IGluIGBgZGljdGBgIGFuZCBgYHNldGBgIGNsYXNzZXMsCmFuZCB0aGUgYGBjb2xsZWN0aW9uc2BgIG1vZHVsZS4KClN0cmluZyBsaXRlcmFscyBhcmUgd3JpdHRlbiBpbiBzaW5nbGUgb3IgZG91YmxlIHF1b3RlczogYGAneHl6enknYGAsCmBgImZyb2JvenoiYGAuICBTZWUgKlN0cmluZyBsaXRlcmFscyogZm9yIG1vcmUgYWJvdXQgc3RyaW5nIGxpdGVyYWxzLgpVbmljb2RlIHN0cmluZ3MgYXJlIG11Y2ggbGlrZSBzdHJpbmdzLCBidXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgc3ludGF4CnVzaW5nIGEgcHJlY2VkaW5nIGBgJ3UnYGAgY2hhcmFjdGVyOiBgYHUnYWJjJ2BgLCBgYHUiZGVmImBgLiBJbgphZGRpdGlvbiB0byB0aGUgZnVuY3Rpb25hbGl0eSBkZXNjcmliZWQgaGVyZSwgdGhlcmUgYXJlIGFsc28gc3RyaW5nLQpzcGVjaWZpYyBtZXRob2RzIGRlc2NyaWJlZCBpbiB0aGUgKlN0cmluZyBNZXRob2RzKiBzZWN0aW9uLiBMaXN0cyBhcmUKY29uc3RydWN0ZWQgd2l0aCBzcXVhcmUgYnJhY2tldHMsIHNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6IGBgW2EsCmIsIGNdYGAuIFR1cGxlcyBhcmUgY29uc3RydWN0ZWQgYnkgdGhlIGNvbW1hIG9wZXJhdG9yIChub3Qgd2l0aGluCnNxdWFyZSBicmFja2V0cyksIHdpdGggb3Igd2l0aG91dCBlbmNsb3NpbmcgcGFyZW50aGVzZXMsIGJ1dCBhbiBlbXB0eQp0dXBsZSBtdXN0IGhhdmUgdGhlIGVuY2xvc2luZyBwYXJlbnRoZXNlcywgc3VjaCBhcyBgYGEsIGIsIGNgYCBvcgpgYCgpYGAuICBBIHNpbmdsZSBpdGVtIHR1cGxlIG11c3QgaGF2ZSBhIHRyYWlsaW5nIGNvbW1hLCBzdWNoIGFzCmBgKGQsKWBgLgoKQnl0ZWFycmF5IG9iamVjdHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24KYGBieXRlYXJyYXkoKWBgLgoKQnVmZmVyIG9iamVjdHMgYXJlIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgUHl0aG9uIHN5bnRheCwgYnV0IGNhbiBiZQpjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgYnVmZmVyKClgYC4gIFRoZXkgZG9uJ3QKc3VwcG9ydCBjb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24uCgpPYmplY3RzIG9mIHR5cGUgeHJhbmdlIGFyZSBzaW1pbGFyIHRvIGJ1ZmZlcnMgaW4gdGhhdCB0aGVyZSBpcyBubwpzcGVjaWZpYyBzeW50YXggdG8gY3JlYXRlIHRoZW0sIGJ1dCB0aGV5IGFyZSBjcmVhdGVkIHVzaW5nIHRoZQpgYHhyYW5nZSgpYGAgZnVuY3Rpb24uICBUaGV5IGRvbid0IHN1cHBvcnQgc2xpY2luZywgY29uY2F0ZW5hdGlvbiBvcgpyZXBldGl0aW9uLCBhbmQgdXNpbmcgYGBpbmBgLCBgYG5vdCBpbmBgLCBgYG1pbigpYGAgb3IgYGBtYXgoKWBgIG9uCnRoZW0gaXMgaW5lZmZpY2llbnQuCgpNb3N0IHNlcXVlbmNlIHR5cGVzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zLiAgVGhlIGBgaW5gYCBhbmQKYGBub3QgaW5gYCBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdGllcyBhcyB0aGUgY29tcGFyaXNvbgpvcGVyYXRpb25zLiAgVGhlIGBgK2BgIGFuZCBgYCpgYCBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkgYXMKdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpYyBvcGVyYXRpb25zLiBbM10gQWRkaXRpb25hbCBtZXRob2RzIGFyZQpwcm92aWRlZCBmb3IgKk11dGFibGUgU2VxdWVuY2UgVHlwZXMqLgoKVGhpcyB0YWJsZSBsaXN0cyB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBzb3J0ZWQgaW4gYXNjZW5kaW5nIHByaW9yaXR5CihvcGVyYXRpb25zIGluIHRoZSBzYW1lIGJveCBoYXZlIHRoZSBzYW1lIHByaW9yaXR5KS4gIEluIHRoZSB0YWJsZSwKKnMqIGFuZCAqdCogYXJlIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlOyAqbiosICppKiBhbmQgKmoqIGFyZQppbnRlZ2VyczoKCistLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCBPcGVyYXRpb24gICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgfAorPT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT0rCnwgYGB4IGluIHNgYCAgICAgICAgIHwgYGBUcnVlYGAgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgfCAoMSkgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgYGBGYWxzZWBgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgYGB4IG5vdCBpbiBzYGAgICAgIHwgYGBGYWxzZWBgIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgfCAoMSkgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgYGBUcnVlYGAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgYGBzICsgdGBgICAgICAgICAgIHwgdGhlIGNvbmNhdGVuYXRpb24gb2YgKnMqIGFuZCAqdCogfCAoNikgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8IGBgcyAqIG4sIG4gKiBzYGAgICB8ICpuKiBzaGFsbG93IGNvcGllcyBvZiAqcyogICAgICAgIHwgKDIpICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgIHwgY29uY2F0ZW5hdGVkICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8IGBgc1tpXWBgICAgICAgICAgICB8ICppKnRoIGl0ZW0gb2YgKnMqLCBvcmlnaW4gMCAgICAgIHwgKDMpICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCBgYHNbaTpqXWBgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICB8ICgzKSg0KSAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgYGBzW2k6ajprXWBgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgfCAoMykoNSkgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgfCB3aXRoIHN0ZXAgKmsqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgYGBsZW4ocylgYCAgICAgICAgIHwgbGVuZ3RoIG9mICpzKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8IGBgbWluKHMpYGAgICAgICAgICB8IHNtYWxsZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgIHwgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCBgYG1heChzKWBgICAgICAgICAgfCBsYXJnZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgYGBzLmluZGV4KGkpYGAgICAgIHwgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgfCAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgfCAqaSogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgYGBzLmNvdW50KGkpYGAgICAgIHwgdG90YWwgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mICAgfCAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgfCAqaSogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCgpTZXF1ZW5jZSB0eXBlcyBhbHNvIHN1cHBvcnQgY29tcGFyaXNvbnMuIEluIHBhcnRpY3VsYXIsIHR1cGxlcyBhbmQKbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IGJ5IGNvbXBhcmluZyBjb3JyZXNwb25kaW5nCmVsZW1lbnRzLiBUaGlzIG1lYW5zIHRoYXQgdG8gY29tcGFyZSBlcXVhbCwgZXZlcnkgZWxlbWVudCBtdXN0IGNvbXBhcmUKZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZQpsZW5ndGguIChGb3IgZnVsbCBkZXRhaWxzIHNlZSAqQ29tcGFyaXNvbnMqIGluIHRoZSBsYW5ndWFnZQpyZWZlcmVuY2UuKQoKTm90ZXM6CgoxLiBXaGVuICpzKiBpcyBhIHN0cmluZyBvciBVbmljb2RlIHN0cmluZyBvYmplY3QgdGhlIGBgaW5gYCBhbmQgYGBub3QKICAgaW5gYCBvcGVyYXRpb25zIGFjdCBsaWtlIGEgc3Vic3RyaW5nIHRlc3QuICBJbiBQeXRob24gdmVyc2lvbnMKICAgYmVmb3JlIDIuMywgKngqIGhhZCB0byBiZSBhIHN0cmluZyBvZiBsZW5ndGggMS4gSW4gUHl0aG9uIDIuMyBhbmQKICAgYmV5b25kLCAqeCogbWF5IGJlIGEgc3RyaW5nIG9mIGFueSBsZW5ndGguCgoyLiBWYWx1ZXMgb2YgKm4qIGxlc3MgdGhhbiBgYDBgYCBhcmUgdHJlYXRlZCBhcyBgYDBgYCAod2hpY2ggeWllbGRzIGFuCiAgIGVtcHR5IHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUgYXMgKnMqKS4gIE5vdGUgYWxzbyB0aGF0IHRoZSBjb3BpZXMKICAgYXJlIHNoYWxsb3c7IG5lc3RlZCBzdHJ1Y3R1cmVzIGFyZSBub3QgY29waWVkLiAgVGhpcyBvZnRlbiBoYXVudHMKICAgbmV3IFB5dGhvbiBwcm9ncmFtbWVyczsgY29uc2lkZXI6CgogICA+Pj4gbGlzdHMgPSBbW11dICogMwogICA+Pj4gbGlzdHMKICAgW1tdLCBbXSwgW11dCiAgID4+PiBsaXN0c1swXS5hcHBlbmQoMykKICAgPj4+IGxpc3RzCiAgIFtbM10sIFszXSwgWzNdXQoKICAgV2hhdCBoYXMgaGFwcGVuZWQgaXMgdGhhdCBgYFtbXV1gYCBpcyBhIG9uZS1lbGVtZW50IGxpc3QgY29udGFpbmluZwogICBhbiBlbXB0eSBsaXN0LCBzbyBhbGwgdGhyZWUgZWxlbWVudHMgb2YgYGBbW11dICogM2BgIGFyZSAocG9pbnRlcnMKICAgdG8pIHRoaXMgc2luZ2xlIGVtcHR5IGxpc3QuICBNb2RpZnlpbmcgYW55IG9mIHRoZSBlbGVtZW50cyBvZgogICBgYGxpc3RzYGAgbW9kaWZpZXMgdGhpcyBzaW5nbGUgbGlzdC4gWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mCiAgIGRpZmZlcmVudCBsaXN0cyB0aGlzIHdheToKCiAgID4+PiBsaXN0cyA9IFtbXSBmb3IgaSBpbiByYW5nZSgzKV0KICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKQogICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpCiAgID4+PiBsaXN0c1syXS5hcHBlbmQoNykKICAgPj4+IGxpc3RzCiAgIFtbM10sIFs1XSwgWzddXQoKMy4gSWYgKmkqIG9yICpqKiBpcyBuZWdhdGl2ZSwgdGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlCiAgIHN0cmluZzogYGBsZW4ocykgKyBpYGAgb3IgYGBsZW4ocykgKyBqYGAgaXMgc3Vic3RpdHV0ZWQuICBCdXQgbm90ZQogICB0aGF0IGBgLTBgYCBpcyBzdGlsbCBgYDBgYC4KCjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mCiAgIGl0ZW1zIHdpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCBgYGkgPD0gayA8IGpgYC4gIElmICppKiBvciAqaiogaXMKICAgZ3JlYXRlciB0aGFuIGBgbGVuKHMpYGAsIHVzZSBgYGxlbihzKWBgLiAgSWYgKmkqIGlzIG9taXR0ZWQgb3IKICAgYGBOb25lYGAsIHVzZSBgYDBgYC4gIElmICpqKiBpcyBvbWl0dGVkIG9yIGBgTm9uZWBgLCB1c2UKICAgYGBsZW4ocylgYC4gIElmICppKiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKmoqLCB0aGUgc2xpY2UgaXMKICAgZW1wdHkuCgo1LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiB3aXRoIHN0ZXAgKmsqIGlzIGRlZmluZWQgYXMgdGhlCiAgIHNlcXVlbmNlIG9mIGl0ZW1zIHdpdGggaW5kZXggIGBgeCA9IGkgKyBuKmtgYCBzdWNoIHRoYXQgYGAwIDw9IG4gPAogICAoai1pKS9rYGAuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMgYXJlIGBgaWBgLCBgYGkra2BgLAogICBgYGkrMiprYGAsIGBgaSszKmtgYCBhbmQgc28gb24sIHN0b3BwaW5nIHdoZW4gKmoqIGlzIHJlYWNoZWQgKGJ1dAogICBuZXZlciBpbmNsdWRpbmcgKmoqKS4gIElmICppKiBvciAqaiogaXMgZ3JlYXRlciB0aGFuIGBgbGVuKHMpYGAsCiAgIHVzZSBgYGxlbihzKWBgLiAgSWYgKmkqIG9yICpqKiBhcmUgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhleSBiZWNvbWUKICAgImVuZCIgdmFsdWVzICh3aGljaCBlbmQgZGVwZW5kcyBvbiB0aGUgc2lnbiBvZiAqayopLiAgTm90ZSwgKmsqCiAgIGNhbm5vdCBiZSB6ZXJvLiBJZiAqayogaXMgYGBOb25lYGAsIGl0IGlzIHRyZWF0ZWQgbGlrZSBgYDFgYC4KCjYuICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSWYgKnMqIGFuZCAqdCogYXJlIGJvdGggc3RyaW5ncywKICAgc29tZSBQeXRob24gaW1wbGVtZW50YXRpb25zIHN1Y2ggYXMgQ1B5dGhvbiBjYW4gdXN1YWxseSBwZXJmb3JtIGFuCiAgIGluLXBsYWNlIG9wdGltaXphdGlvbiBmb3IgYXNzaWdubWVudHMgb2YgdGhlIGZvcm0gYGBzID0gcyArIHRgYCBvcgogICBgYHMgKz0gdGBgLiAgV2hlbiBhcHBsaWNhYmxlLCB0aGlzIG9wdGltaXphdGlvbiBtYWtlcyBxdWFkcmF0aWMKICAgcnVuLXRpbWUgbXVjaCBsZXNzIGxpa2VseS4gIFRoaXMgb3B0aW1pemF0aW9uIGlzIGJvdGggdmVyc2lvbiBhbmQKICAgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiAgRm9yIHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSBjb2RlLCBpdCBpcwogICBwcmVmZXJhYmxlIHRvIHVzZSB0aGUgYGBzdHIuam9pbigpYGAgbWV0aG9kIHdoaWNoIGFzc3VyZXMKICAgY29uc2lzdGVudCBsaW5lYXIgY29uY2F0ZW5hdGlvbiBwZXJmb3JtYW5jZSBhY3Jvc3MgdmVyc2lvbnMgYW5kCiAgIGltcGxlbWVudGF0aW9ucy4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IEZvcm1lcmx5LCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBuZXZlcgogICBvY2N1cnJlZCBpbi1wbGFjZS4KCgpTdHJpbmcgTWV0aG9kcwo9PT09PT09PT09PT09PQoKQmVsb3cgYXJlIGxpc3RlZCB0aGUgc3RyaW5nIG1ldGhvZHMgd2hpY2ggYm90aCA4LWJpdCBzdHJpbmdzIGFuZApVbmljb2RlIG9iamVjdHMgc3VwcG9ydC4gIFNvbWUgb2YgdGhlbSBhcmUgYWxzbyBhdmFpbGFibGUgb24KYGBieXRlYXJyYXlgYCBvYmplY3RzLgoKSW4gYWRkaXRpb24sIFB5dGhvbidzIHN0cmluZ3Mgc3VwcG9ydCB0aGUgc2VxdWVuY2UgdHlwZSBtZXRob2RzCmRlc2NyaWJlZCBpbiB0aGUgKlNlcXVlbmNlIFR5cGVzIC0tLSBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlLApieXRlYXJyYXksIGJ1ZmZlciwgeHJhbmdlKiBzZWN0aW9uLiBUbyBvdXRwdXQgZm9ybWF0dGVkIHN0cmluZ3MgdXNlCnRlbXBsYXRlIHN0cmluZ3Mgb3IgdGhlIGBgJWBgIG9wZXJhdG9yIGRlc2NyaWJlZCBpbiB0aGUgKlN0cmluZwpGb3JtYXR0aW5nIE9wZXJhdGlvbnMqIHNlY3Rpb24uIEFsc28sIHNlZSB0aGUgYGByZWBgIG1vZHVsZSBmb3Igc3RyaW5nCmZ1bmN0aW9ucyBiYXNlZCBvbiByZWd1bGFyIGV4cHJlc3Npb25zLgoKc3RyLmNhcGl0YWxpemUoKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZAogICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLmNlbnRlcih3aWR0aFssIGZpbGxjaGFyXSkKCiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lCiAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhIHNwYWNlKS4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LgoKc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pCgogICBSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpzdWIqCiAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kCiAgICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4KCnN0ci5kZWNvZGUoW2VuY29kaW5nWywgZXJyb3JzXV0pCgogICBEZWNvZGVzIHRoZSBzdHJpbmcgdXNpbmcgdGhlIGNvZGVjIHJlZ2lzdGVyZWQgZm9yICplbmNvZGluZyouCiAgICplbmNvZGluZyogZGVmYXVsdHMgdG8gdGhlIGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nLiAgKmVycm9ycyogbWF5CiAgIGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBpcwogICBgYCdzdHJpY3QnYGAsIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYGBVbmljb2RlRXJyb3JgYC4KICAgT3RoZXIgcG9zc2libGUgdmFsdWVzIGFyZSBgYCdpZ25vcmUnYGAsIGBgJ3JlcGxhY2UnYGAgYW5kIGFueSBvdGhlcgogICBuYW1lIHJlZ2lzdGVyZWQgdmlhIGBgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKClgYCwgc2VlIHNlY3Rpb24gKkNvZGVjCiAgIEJhc2UgQ2xhc3NlcyouCgogICBOZXcgaW4gdmVyc2lvbiAyLjIuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzCiAgIGFkZGVkLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuCgpzdHIuZW5jb2RlKFtlbmNvZGluZ1ssIGVycm9yc11dKQoKICAgUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLiAgRGVmYXVsdCBlbmNvZGluZyBpcyB0aGUKICAgY3VycmVudCBkZWZhdWx0IHN0cmluZyBlbmNvZGluZy4gICplcnJvcnMqIG1heSBiZSBnaXZlbiB0byBzZXQgYQogICBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgZm9yICplcnJvcnMqIGlzCiAgIGBgJ3N0cmljdCdgYCwgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhCiAgIGBgVW5pY29kZUVycm9yYGAuICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgJ2lnbm9yZSdgYCwKICAgYGAncmVwbGFjZSdgYCwgYGAneG1sY2hhcnJlZnJlcGxhY2UnYGAsIGBgJ2JhY2tzbGFzaHJlcGxhY2UnYGAgYW5kCiAgIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgdmlhIGBgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKClgYCwgc2VlCiAgIHNlY3Rpb24gKkNvZGVjIEJhc2UgQ2xhc3NlcyouIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLCBzZWUKICAgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi4KCiAgIE5ldyBpbiB2ZXJzaW9uIDIuMC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIGBgJ3htbGNoYXJyZWZyZXBsYWNlJ2BgIGFuZAogICBgYCdiYWNrc2xhc2hyZXBsYWNlJ2BgIGFuZCBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGFkZGVkLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuCgpzdHIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICpzdWZmaXgqLAogICBvdGhlcndpc2UgcmV0dXJuIGBgRmFsc2VgYC4gICpzdWZmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YKICAgc3VmZml4ZXMgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3QgYmVnaW5uaW5nIGF0CiAgIHRoYXQgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0CiAgIHBvc2l0aW9uLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqc3VmZml4Ki4KCnN0ci5leHBhbmR0YWJzKFt0YWJzaXplXSkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkCiAgIGJ5IG9uZSBvciBtb3JlIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlCiAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogY2hhcmFjdGVycwogICAoZGVmYXVsdCBpcyA4LCBnaXZpbmcgdGFiIHBvc2l0aW9ucyBhdCBjb2x1bW5zIDAsIDgsIDE2IGFuZCBzbyBvbikuCiAgIFRvIGV4cGFuZCB0aGUgc3RyaW5nLCB0aGUgY3VycmVudCBjb2x1bW4gaXMgc2V0IHRvIHplcm8gYW5kIHRoZQogICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgYQogICB0YWIgKGBgXHRgYCksIG9uZSBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkIGluIHRoZQogICByZXN1bHQgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi4KICAgKFRoZSB0YWIgY2hhcmFjdGVyIGl0c2VsZiBpcyBub3QgY29waWVkLikgIElmIHRoZSBjaGFyYWN0ZXIgaXMgYQogICBuZXdsaW5lIChgYFxuYGApIG9yIHJldHVybiAoYGBccmBgKSwgaXQgaXMgY29waWVkIGFuZCB0aGUgY3VycmVudAogICBjb2x1bW4gaXMgcmVzZXQgdG8gemVyby4gIEFueSBvdGhlciBjaGFyYWN0ZXIgaXMgY29waWVkIHVuY2hhbmdlZAogICBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyB0aGUKICAgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIHdoZW4gcHJpbnRlZC4KCiAgID4+PiAnMDFcdDAxMlx0MDEyM1x0MDEyMzQnLmV4cGFuZHRhYnMoKQogICAnMDEgICAgICAwMTIgICAgIDAxMjMgICAgMDEyMzQnCiAgID4+PiAnMDFcdDAxMlx0MDEyM1x0MDEyMzQnLmV4cGFuZHRhYnMoNCkKICAgJzAxICAwMTIgMDEyMyAgICAwMTIzNCcKCnN0ci5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pCgogICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpcwogICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCBpbiB0aGUgc2xpY2UgYGBzW3N0YXJ0OmVuZF1gYC4KICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZQogICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgaWYgKnN1YiogaXMgbm90IGZvdW5kLgoKICAgTm90ZTogVGhlIGBgZmluZCgpYGAgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IG5lZWQgdG8ga25vdyB0aGUKICAgICBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgc3Vic3RyaW5nIG9yIG5vdCwgdXNlCiAgICAgdGhlIGBgaW5gYCBvcGVyYXRvcjoKCiAgICAgICAgPj4+ICdQeScgaW4gJ1B5dGhvbicKICAgICAgICBUcnVlCgpzdHIuZm9ybWF0KCphcmdzLCAqKmt3YXJncykKCiAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uIHdoaWNoIHRoaXMKICAgbWV0aG9kIGlzIGNhbGxlZCBjYW4gY29udGFpbiBsaXRlcmFsIHRleHQgb3IgcmVwbGFjZW1lbnQgZmllbGRzCiAgIGRlbGltaXRlZCBieSBicmFjZXMgYGB7fWBgLiAgRWFjaCByZXBsYWNlbWVudCBmaWVsZCBjb250YWlucyBlaXRoZXIKICAgdGhlIG51bWVyaWMgaW5kZXggb2YgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBvciB0aGUgbmFtZSBvZiBhCiAgIGtleXdvcmQgYXJndW1lbnQuICBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGVhY2gKICAgcmVwbGFjZW1lbnQgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZQogICBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LgoKICAgPj4+ICJUaGUgc3VtIG9mIDEgKyAyIGlzIHswfSIuZm9ybWF0KDErMikKICAgJ1RoZSBzdW0gb2YgMSArIDIgaXMgMycKCiAgIFNlZSAqRm9ybWF0IFN0cmluZyBTeW50YXgqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzCiAgIGZvcm1hdHRpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuCgogICBUaGlzIG1ldGhvZCBvZiBzdHJpbmcgZm9ybWF0dGluZyBpcyB0aGUgbmV3IHN0YW5kYXJkIGluIFB5dGhvbiAzLAogICBhbmQgc2hvdWxkIGJlIHByZWZlcnJlZCB0byB0aGUgYGAlYGAgZm9ybWF0dGluZyBkZXNjcmliZWQgaW4KICAgKlN0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnMqIGluIG5ldyBjb2RlLgoKICAgTmV3IGluIHZlcnNpb24gMi42LgoKc3RyLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pCgogICBMaWtlIGBgZmluZCgpYGAsIGJ1dCByYWlzZSBgYFZhbHVlRXJyb3JgYCB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90CiAgIGZvdW5kLgoKc3RyLmlzYWxudW0oKQoKICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFudW1lcmljIGFuZAogICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCgogICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KCnN0ci5pc2FscGhhKCkKCiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kCiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLmlzZGlnaXQoKQoKICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZSBpcwogICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCgogICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KCnN0ci5pc2xvd2VyKCkKCiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSBsb3dlcmNhc2UKICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLmlzc3BhY2UoKQoKICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcKICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLmlzdGl0bGUoKQoKICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdAogICBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seQogICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuCiAgIFJldHVybiBmYWxzZSBvdGhlcndpc2UuCgogICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KCnN0ci5pc3VwcGVyKCkKCiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSB1cHBlcmNhc2UKICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLmpvaW4oaXRlcmFibGUpCgogICBSZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0cmluZ3MgaW4gdGhlCiAgICppdGVyYWJsZSogKml0ZXJhYmxlKi4gIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGUKICAgc3RyaW5nIHByb3ZpZGluZyB0aGlzIG1ldGhvZC4KCnN0ci5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSkKCiAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLgogICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGEKICAgc3BhY2UpLiAgVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvcgogICBlcXVhbCB0byBgYGxlbihzKWBgLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogU3VwcG9ydCBmb3IgdGhlICpmaWxsY2hhciogYXJndW1lbnQuCgpzdHIubG93ZXIoKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XQogICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgoKICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCgpzdHIubHN0cmlwKFtjaGFyc10pCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZQogICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlCiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0bwogICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgcHJlZml4OyByYXRoZXIsCiAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6CgogICA+Pj4gJyAgIHNwYWNpb3VzICAgJy5sc3RyaXAoKQogICAnc3BhY2lvdXMgICAnCiAgID4+PiAnd3d3LmV4YW1wbGUuY29tJy5sc3RyaXAoJ2Ntb3d6LicpCiAgICdleGFtcGxlLmNvbScKCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuCgpzdHIucGFydGl0aW9uKHNlcCkKCiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYQogICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IKICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90CiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBpdHNlbGYsIGZvbGxvd2VkIGJ5CiAgIHR3byBlbXB0eSBzdHJpbmdzLgoKICAgTmV3IGluIHZlcnNpb24gMi41LgoKc3RyLnJlcGxhY2Uob2xkLCBuZXdbLCBjb3VudF0pCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpvbGQqCiAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgZ2l2ZW4sIG9ubHkKICAgdGhlIGZpcnN0ICpjb3VudCogb2NjdXJyZW5jZXMgYXJlIHJlcGxhY2VkLgoKc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pCgogICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXMKICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgd2l0aGluIGBgc1tzdGFydDplbmRdYGAuCiAgIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2UKICAgbm90YXRpb24uICBSZXR1cm4gYGAtMWBgIG9uIGZhaWx1cmUuCgpzdHIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pCgogICBMaWtlIGBgcmZpbmQoKWBgIGJ1dCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqCiAgIGlzIG5vdCBmb3VuZC4KCnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkKCiAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4KICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhCiAgIHNwYWNlKS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvcgogICBlcXVhbCB0byBgYGxlbihzKWBgLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogU3VwcG9ydCBmb3IgdGhlICpmaWxsY2hhciogYXJndW1lbnQuCgpzdHIucnBhcnRpdGlvbihzZXApCgogICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYQogICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IKICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90CiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsIGZvbGxvd2VkIGJ5CiAgIHRoZSBzdHJpbmcgaXRzZWxmLgoKICAgTmV3IGluIHZlcnNpb24gMi41LgoKc3RyLnJzcGxpdChbc2VwWywgbWF4c3BsaXRdXSkKCiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZQogICBkZWxpbWl0ZXIgc3RyaW5nLiBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCogc3BsaXRzCiAgIGFyZSBkb25lLCB0aGUgKnJpZ2h0bW9zdCogb25lcy4gIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3IKICAgYGBOb25lYGAsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3IKICAgc3BsaXR0aW5nIGZyb20gdGhlIHJpZ2h0LCBgYHJzcGxpdCgpYGAgYmVoYXZlcyBsaWtlIGBgc3BsaXQoKWBgCiAgIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuCgogICBOZXcgaW4gdmVyc2lvbiAyLjQuCgpzdHIucnN0cmlwKFtjaGFyc10pCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGUKICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZQogICByZW1vdmVkLiAgSWYgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhlICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG8KICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHN1ZmZpeDsgcmF0aGVyLAogICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOgoKICAgPj4+ICcgICBzcGFjaW91cyAgICcucnN0cmlwKCkKICAgJyAgIHNwYWNpb3VzJwogICA+Pj4gJ21pc3Npc3NpcHBpJy5yc3RyaXAoJ2lweicpCiAgICdtaXNzaXNzJwoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC4KCnN0ci5zcGxpdChbc2VwWywgbWF4c3BsaXRdXSkKCiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZQogICBkZWxpbWl0ZXIgc3RyaW5nLiAgSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqCiAgIHNwbGl0cyBhcmUgZG9uZSAodGh1cywgdGhlIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgYGBtYXhzcGxpdCsxYGAKICAgZWxlbWVudHMpLiAgSWYgKm1heHNwbGl0KiBpcyBub3Qgc3BlY2lmaWVkIG9yIGBgLTFgYCwgdGhlbiB0aGVyZSBpcwogICBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNwbGl0cyAoYWxsIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuCgogICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXIKICAgYW5kIGFyZSBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSwKICAgYGAnMSwsMicuc3BsaXQoJywnKWBgIHJldHVybnMgYGBbJzEnLCAnJywgJzInXWBgKS4gIFRoZSAqc2VwKgogICBhcmd1bWVudCBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSwKICAgYGAnMTw+Mjw+Mycuc3BsaXQoJzw+JylgYCByZXR1cm5zIGBgWycxJywgJzInLCAnMyddYGApLiBTcGxpdHRpbmcKICAgYW4gZW1wdHkgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgYGBbJyddYGAuCgogICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIGBgTm9uZWBgLCBhIGRpZmZlcmVudCBzcGxpdHRpbmcKICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSBhcmUgcmVnYXJkZWQKICAgYXMgYSBzaW5nbGUgc2VwYXJhdG9yLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gbm8gZW1wdHkgc3RyaW5ncwogICBhdCB0aGUgc3RhcnQgb3IgZW5kIGlmIHRoZSBzdHJpbmcgaGFzIGxlYWRpbmcgb3IgdHJhaWxpbmcKICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZwogICBjb25zaXN0aW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSB3aXRoIGEgYGBOb25lYGAgc2VwYXJhdG9yIHJldHVybnMKICAgYGBbXWBgLgoKICAgRm9yIGV4YW1wbGUsIGBgJyAxICAyICAgMyAgJy5zcGxpdCgpYGAgcmV0dXJucyBgYFsnMScsICcyJywgJzMnXWBgLAogICBhbmQgYGAnICAxICAyICAgMyAgJy5zcGxpdChOb25lLCAxKWBgIHJldHVybnMgYGBbJzEnLCAnMiAgIDMgICddYGAuCgpzdHIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKQoKICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZQogICBib3VuZGFyaWVzLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSAqdW5pdmVyc2FsIG5ld2xpbmVzKiBhcHByb2FjaCB0bwogICBzcGxpdHRpbmcgbGluZXMuIExpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0CiAgIHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZCB0cnVlLgoKICAgRm9yIGV4YW1wbGUsIGBgJ2FiIGNcblxuZGUgZmdccmtsXHJcbicuc3BsaXRsaW5lcygpYGAgcmV0dXJucwogICBgYFsnYWIgYycsICcnLCAnZGUgZmcnLCAna2wnXWBgLCB3aGlsZSB0aGUgc2FtZSBjYWxsIHdpdGgKICAgYGBzcGxpdGxpbmVzKFRydWUpYGAgcmV0dXJucyBgYFsnYWIgY1xuJywgJ1xuJywgJ2RlIGZnXHInLAogICAna2xcclxuJ11gYC4KCiAgIFVubGlrZSBgYHNwbGl0KClgYCB3aGVuIGEgZGVsaW1pdGVyIHN0cmluZyAqc2VwKiBpcyBnaXZlbiwgdGhpcwogICBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0IGZvciB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgYSB0ZXJtaW5hbAogICBsaW5lIGJyZWFrIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBleHRyYSBsaW5lLgoKc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiBgYFRydWVgYCBpZiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICpwcmVmaXgqLCBvdGhlcndpc2UKICAgcmV0dXJuIGBgRmFsc2VgYC4gKnByZWZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBwcmVmaXhlcyB0byBsb29rCiAgIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBzdHJpbmcgYmVnaW5uaW5nIGF0IHRoYXQKICAgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdAogICBwb3NpdGlvbi4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEFjY2VwdCB0dXBsZXMgYXMgKnByZWZpeCouCgpzdHIuc3RyaXAoW2NoYXJzXSkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZwogICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlCiAgIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlbW92ZWQuIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZQogICAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvIHJlbW92aW5nIHdoaXRlc3BhY2UuIFRoZSAqY2hhcnMqCiAgIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMKICAgdmFsdWVzIGFyZSBzdHJpcHBlZDoKCiAgID4+PiAnICAgc3BhY2lvdXMgICAnLnN0cmlwKCkKICAgJ3NwYWNpb3VzJwogICA+Pj4gJ3d3dy5leGFtcGxlLmNvbScuc3RyaXAoJ2Ntb3d6LicpCiAgICdleGFtcGxlJwoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC4KCnN0ci5zd2FwY2FzZSgpCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB1cHBlcmNhc2UgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8KICAgbG93ZXJjYXNlIGFuZCB2aWNlIHZlcnNhLgoKICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuCgpzdHIudGl0bGUoKQoKICAgUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2hlcmUgd29yZHMgc3RhcnQgd2l0aCBhbgogICB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIGxvd2VyY2FzZS4KCiAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGEKICAgd29yZCBhcyBncm91cHMgb2YgY29uc2VjdXRpdmUgbGV0dGVycy4gIFRoZSBkZWZpbml0aW9uIHdvcmtzIGluCiAgIG1hbnkgY29udGV4dHMgYnV0IGl0IG1lYW5zIHRoYXQgYXBvc3Ryb3BoZXMgaW4gY29udHJhY3Rpb25zIGFuZAogICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgZGVzaXJlZAogICByZXN1bHQ6CgogICAgICA+Pj4gInRoZXkncmUgYmlsbCdzIGZyaWVuZHMgZnJvbSB0aGUgVUsiLnRpdGxlKCkKICAgICAgIlRoZXknUmUgQmlsbCdTIEZyaWVuZHMgRnJvbSBUaGUgVWsiCgogICBBIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyByZWd1bGFyCiAgIGV4cHJlc3Npb25zOgoKICAgICAgPj4+IGltcG9ydCByZQogICAgICA+Pj4gZGVmIHRpdGxlY2FzZShzKToKICAgICAgLi4uICAgICByZXR1cm4gcmUuc3ViKHIiW0EtWmEtel0rKCdbQS1aYS16XSspPyIsCiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBsYW1iZGEgbW86IG1vLmdyb3VwKDApWzBdLnVwcGVyKCkgKwogICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtby5ncm91cCgwKVsxOl0ubG93ZXIoKSwKICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpCiAgICAgIC4uLgogICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5J3JlIGJpbGwncyBmcmllbmRzLiIpCiAgICAgICJUaGV5J3JlIEJpbGwncyBGcmllbmRzLiIKCiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LgoKc3RyLnRyYW5zbGF0ZSh0YWJsZVssIGRlbGV0ZWNoYXJzXSkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlCiAgIG9wdGlvbmFsIGFyZ3VtZW50ICpkZWxldGVjaGFycyogYXJlIHJlbW92ZWQsIGFuZCB0aGUgcmVtYWluaW5nCiAgIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZSwKICAgd2hpY2ggbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMjU2LgoKICAgWW91IGNhbiB1c2UgdGhlIGBgbWFrZXRyYW5zKClgYCBoZWxwZXIgZnVuY3Rpb24gaW4gdGhlIGBgc3RyaW5nYGAKICAgbW9kdWxlIHRvIGNyZWF0ZSBhIHRyYW5zbGF0aW9uIHRhYmxlLiBGb3Igc3RyaW5nIG9iamVjdHMsIHNldCB0aGUKICAgKnRhYmxlKiBhcmd1bWVudCB0byBgYE5vbmVgYCBmb3IgdHJhbnNsYXRpb25zIHRoYXQgb25seSBkZWxldGUKICAgY2hhcmFjdGVyczoKCiAgID4+PiAncmVhZCB0aGlzIHNob3J0IHRleHQnLnRyYW5zbGF0ZShOb25lLCAnYWVpb3UnKQogICAncmQgdGhzIHNocnQgdHh0JwoKICAgTmV3IGluIHZlcnNpb24gMi42OiBTdXBwb3J0IGZvciBhIGBgTm9uZWBgICp0YWJsZSogYXJndW1lbnQuCgogICBGb3IgVW5pY29kZSBvYmplY3RzLCB0aGUgYGB0cmFuc2xhdGUoKWBgIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgdGhlCiAgIG9wdGlvbmFsICpkZWxldGVjaGFycyogYXJndW1lbnQuICBJbnN0ZWFkLCBpdCByZXR1cm5zIGEgY29weSBvZiB0aGUKICAgKnMqIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW4KICAgdHJhbnNsYXRpb24gdGFibGUgd2hpY2ggbXVzdCBiZSBhIG1hcHBpbmcgb2YgVW5pY29kZSBvcmRpbmFscyB0bwogICBVbmljb2RlIG9yZGluYWxzLCBVbmljb2RlIHN0cmluZ3Mgb3IgYGBOb25lYGAuIFVubWFwcGVkIGNoYXJhY3RlcnMKICAgYXJlIGxlZnQgdW50b3VjaGVkLiBDaGFyYWN0ZXJzIG1hcHBlZCB0byBgYE5vbmVgYCBhcmUgZGVsZXRlZC4KICAgTm90ZSwgYSBtb3JlIGZsZXhpYmxlIGFwcHJvYWNoIGlzIHRvIGNyZWF0ZSBhIGN1c3RvbSBjaGFyYWN0ZXIKICAgbWFwcGluZyBjb2RlYyB1c2luZyB0aGUgYGBjb2RlY3NgYCBtb2R1bGUgKHNlZSBgYGVuY29kaW5ncy5jcDEyNTFgYAogICBmb3IgYW4gZXhhbXBsZSkuCgpzdHIudXBwZXIoKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XQogICBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLiAgTm90ZSB0aGF0IGBgc3RyLnVwcGVyKCkuaXN1cHBlcigpYGAgbWlnaHQKICAgYmUgYGBGYWxzZWBgIGlmIGBgc2BgIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgVW5pY29kZQogICBjYXRlZ29yeSBvZiB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlcihzKSBpcyBub3QgIkx1IiAoTGV0dGVyLAogICB1cHBlcmNhc2UpLCBidXQgZS5nLiAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuCgogICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC4KCnN0ci56ZmlsbCh3aWR0aCkKCiAgIFJldHVybiB0aGUgbnVtZXJpYyBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBhIHN0cmluZyBvZgogICBsZW5ndGggKndpZHRoKi4gIEEgc2lnbiBwcmVmaXggaXMgaGFuZGxlZCBjb3JyZWN0bHkuICBUaGUgb3JpZ2luYWwKICAgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBgbGVuKHMpYGAuCgogICBOZXcgaW4gdmVyc2lvbiAyLjIuMi4KClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgcHJlc2VudCBvbmx5IG9uIHVuaWNvZGUgb2JqZWN0czoKCnVuaWNvZGUuaXNudW1lcmljKCkKCiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGVyZSBhcmUgb25seSBudW1lcmljIGNoYXJhY3RlcnMgaW4gUywKICAgYGBGYWxzZWBgIG90aGVyd2lzZS4gTnVtZXJpYyBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycywKICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LAogICBlLmcuIFUrMjE1NSwgVlVMR0FSIEZSQUNUSU9OIE9ORSBGSUZUSC4KCnVuaWNvZGUuaXNkZWNpbWFsKCkKCiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGVyZSBhcmUgb25seSBkZWNpbWFsIGNoYXJhY3RlcnMgaW4gUywKICAgYGBGYWxzZWBgIG90aGVyd2lzZS4gRGVjaW1hbCBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycywKICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybSBkZWNpbWFsLXJhZGl4IG51bWJlcnMsCiAgIGUuZy4gVSswNjYwLCBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTy4KCgpTdHJpbmcgRm9ybWF0dGluZyBPcGVyYXRpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClN0cmluZyBhbmQgVW5pY29kZSBvYmplY3RzIGhhdmUgb25lIHVuaXF1ZSBidWlsdC1pbiBvcGVyYXRpb246IHRoZQpgYCVgYCBvcGVyYXRvciAobW9kdWxvKS4gIFRoaXMgaXMgYWxzbyBrbm93biBhcyB0aGUgc3RyaW5nCipmb3JtYXR0aW5nKiBvciAqaW50ZXJwb2xhdGlvbiogb3BlcmF0b3IuICBHaXZlbiBgYGZvcm1hdCAlIHZhbHVlc2BgCih3aGVyZSAqZm9ybWF0KiBpcyBhIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCksIGBgJWBgIGNvbnZlcnNpb24Kc3BlY2lmaWNhdGlvbnMgaW4gKmZvcm1hdCogYXJlIHJlcGxhY2VkIHdpdGggemVybyBvciBtb3JlIGVsZW1lbnRzIG9mCip2YWx1ZXMqLiAgVGhlIGVmZmVjdCBpcyBzaW1pbGFyIHRvIHRoZSB1c2luZyBgYHNwcmludGYoKWBgIGluIHRoZSBDCmxhbmd1YWdlLiAgSWYgKmZvcm1hdCogaXMgYSBVbmljb2RlIG9iamVjdCwgb3IgaWYgYW55IG9mIHRoZSBvYmplY3RzCmJlaW5nIGNvbnZlcnRlZCB1c2luZyB0aGUgYGAlc2BgIGNvbnZlcnNpb24gYXJlIFVuaWNvZGUgb2JqZWN0cywgdGhlCnJlc3VsdCB3aWxsIGFsc28gYmUgYSBVbmljb2RlIG9iamVjdC4KCklmICpmb3JtYXQqIHJlcXVpcmVzIGEgc2luZ2xlIGFyZ3VtZW50LCAqdmFsdWVzKiBtYXkgYmUgYSBzaW5nbGUgbm9uLQp0dXBsZSBvYmplY3QuIFs1XSAgT3RoZXJ3aXNlLCAqdmFsdWVzKiBtdXN0IGJlIGEgdHVwbGUgd2l0aCBleGFjdGx5CnRoZSBudW1iZXIgb2YgaXRlbXMgc3BlY2lmaWVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nLCBvciBhIHNpbmdsZQptYXBwaW5nIG9iamVjdCAoZm9yIGV4YW1wbGUsIGEgZGljdGlvbmFyeSkuCgpBIGNvbnZlcnNpb24gc3BlY2lmaWVyIGNvbnRhaW5zIHR3byBvciBtb3JlIGNoYXJhY3RlcnMgYW5kIGhhcyB0aGUKZm9sbG93aW5nIGNvbXBvbmVudHMsIHdoaWNoIG11c3Qgb2NjdXIgaW4gdGhpcyBvcmRlcjoKCjEuIFRoZSBgYCclJ2BgIGNoYXJhY3Rlciwgd2hpY2ggbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBzcGVjaWZpZXIuCgoyLiBNYXBwaW5nIGtleSAob3B0aW9uYWwpLCBjb25zaXN0aW5nIG9mIGEgcGFyZW50aGVzaXNlZCBzZXF1ZW5jZSBvZgogICBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSwgYGAoc29tZW5hbWUpYGApLgoKMy4gQ29udmVyc2lvbiBmbGFncyAob3B0aW9uYWwpLCB3aGljaCBhZmZlY3QgdGhlIHJlc3VsdCBvZiBzb21lCiAgIGNvbnZlcnNpb24gdHlwZXMuCgo0LiBNaW5pbXVtIGZpZWxkIHdpZHRoIChvcHRpb25hbCkuICBJZiBzcGVjaWZpZWQgYXMgYW4gYGAnKidgYAogICAoYXN0ZXJpc2spLCB0aGUgYWN0dWFsIHdpZHRoIGlzIHJlYWQgZnJvbSB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZQogICB0dXBsZSBpbiAqdmFsdWVzKiwgYW5kIHRoZSBvYmplY3QgdG8gY29udmVydCBjb21lcyBhZnRlciB0aGUKICAgbWluaW11bSBmaWVsZCB3aWR0aCBhbmQgb3B0aW9uYWwgcHJlY2lzaW9uLgoKNS4gUHJlY2lzaW9uIChvcHRpb25hbCksIGdpdmVuIGFzIGEgYGAnLidgYCAoZG90KSBmb2xsb3dlZCBieSB0aGUKICAgcHJlY2lzaW9uLiAgSWYgc3BlY2lmaWVkIGFzIGBgJyonYGAgKGFuIGFzdGVyaXNrKSwgdGhlIGFjdHVhbCB3aWR0aAogICBpcyByZWFkIGZyb20gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgdHVwbGUgaW4gKnZhbHVlcyosIGFuZCB0aGUKICAgdmFsdWUgdG8gY29udmVydCBjb21lcyBhZnRlciB0aGUgcHJlY2lzaW9uLgoKNi4gTGVuZ3RoIG1vZGlmaWVyIChvcHRpb25hbCkuCgo3LiBDb252ZXJzaW9uIHR5cGUuCgpXaGVuIHRoZSByaWdodCBhcmd1bWVudCBpcyBhIGRpY3Rpb25hcnkgKG9yIG90aGVyIG1hcHBpbmcgdHlwZSksIHRoZW4KdGhlIGZvcm1hdHMgaW4gdGhlIHN0cmluZyAqbXVzdCogaW5jbHVkZSBhIHBhcmVudGhlc2lzZWQgbWFwcGluZyBrZXkKaW50byB0aGF0IGRpY3Rpb25hcnkgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGBgJyUnYGAgY2hhcmFjdGVyLgpUaGUgbWFwcGluZyBrZXkgc2VsZWN0cyB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkIGZyb20gdGhlIG1hcHBpbmcuCkZvciBleGFtcGxlOgoKPj4+IHByaW50ICclKGxhbmd1YWdlKXMgaGFzICUobnVtYmVyKTAzZCBxdW90ZSB0eXBlcy4nICUgXAouLi4gICAgICAgeyJsYW5ndWFnZSI6ICJQeXRob24iLCAibnVtYmVyIjogMn0KUHl0aG9uIGhhcyAwMDIgcXVvdGUgdHlwZXMuCgpJbiB0aGlzIGNhc2Ugbm8gYGAqYGAgc3BlY2lmaWVycyBtYXkgb2NjdXIgaW4gYSBmb3JtYXQgKHNpbmNlIHRoZXkKcmVxdWlyZSBhIHNlcXVlbnRpYWwgcGFyYW1ldGVyIGxpc3QpLgoKVGhlIGNvbnZlcnNpb24gZmxhZyBjaGFyYWN0ZXJzIGFyZToKCistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBGbGFnICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGAnIydgYCAgIHwgVGhlIHZhbHVlIGNvbnZlcnNpb24gd2lsbCB1c2UgdGhlICJhbHRlcm5hdGUgZm9ybSIgKHdoZXJlIGRlZmluZWQgICAgIHwKfCAgICAgICAgICAgfCBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGAnMCdgYCAgIHwgVGhlIGNvbnZlcnNpb24gd2lsbCBiZSB6ZXJvIHBhZGRlZCBmb3IgbnVtZXJpYyB2YWx1ZXMuICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgJy0nYGAgICB8IFRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgbGVmdCBhZGp1c3RlZCAob3ZlcnJpZGVzIHRoZSBgYCcwJ2BgICAgICAgICAgICB8CnwgICAgICAgICAgIHwgY29udmVyc2lvbiBpZiBib3RoIGFyZSBnaXZlbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgJyAnYGAgICB8IChhIHNwYWNlKSBBIGJsYW5rIHNob3VsZCBiZSBsZWZ0IGJlZm9yZSBhIHBvc2l0aXZlIG51bWJlciAob3IgZW1wdHkgICB8CnwgICAgICAgICAgIHwgc3RyaW5nKSBwcm9kdWNlZCBieSBhIHNpZ25lZCBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgJysnYGAgICB8IEEgc2lnbiBjaGFyYWN0ZXIgKGBgJysnYGAgb3IgYGAnLSdgYCkgd2lsbCBwcmVjZWRlIHRoZSBjb252ZXJzaW9uICAgICB8CnwgICAgICAgICAgIHwgKG92ZXJyaWRlcyBhICJzcGFjZSIgZmxhZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKQSBsZW5ndGggbW9kaWZpZXIgKGBgaGBgLCBgYGxgYCwgb3IgYGBMYGApIG1heSBiZSBwcmVzZW50LCBidXQgaXMKaWdub3JlZCBhcyBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBQeXRob24gLS0gc28gZS5nLiBgYCVsZGBgIGlzCmlkZW50aWNhbCB0byBgYCVkYGAuCgpUaGUgY29udmVyc2lvbiB0eXBlcyBhcmU6CgorLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgQ29udmVyc2lvbiAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHwKKz09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09Kwp8IGBgJ2QnYGAgICAgICB8IFNpZ25lZCBpbnRlZ2VyIGRlY2ltYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYCdpJ2BgICAgICAgfCBTaWduZWQgaW50ZWdlciBkZWNpbWFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGAnbydgYCAgICAgIHwgU2lnbmVkIG9jdGFsIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMSkgICAgIHwKKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgJ3UnYGAgICAgICB8IE9ic29sZXRlIHR5cGUgLS0gaXQgaXMgaWRlbnRpY2FsIHRvIGBgJ2QnYGAuICAgICAgICAgIHwgKDcpICAgICB8CistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYCd4J2BgICAgICAgfCBTaWduZWQgaGV4YWRlY2ltYWwgKGxvd2VyY2FzZSkuICAgICAgICAgICAgICAgICAgICAgICB8ICgyKSAgICAgfAorLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGAnWCdgYCAgICAgIHwgU2lnbmVkIGhleGFkZWNpbWFsICh1cHBlcmNhc2UpLiAgICAgICAgICAgICAgICAgICAgICAgfCAoMikgICAgIHwKKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgJ2UnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGV4cG9uZW50aWFsIGZvcm1hdCAobG93ZXJjYXNlKS4gICAgICAgIHwgKDMpICAgICB8CistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYCdFJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBleHBvbmVudGlhbCBmb3JtYXQgKHVwcGVyY2FzZSkuICAgICAgICB8ICgzKSAgICAgfAorLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGAnZidgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZGVjaW1hbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgfCAoMykgICAgIHwKKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgJ0YnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGRlY2ltYWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgIHwgKDMpICAgICB8CistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYCdnJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBmb3JtYXQuIFVzZXMgbG93ZXJjYXNlIGV4cG9uZW50aWFsICAgICB8ICg0KSAgICAgfAp8ICAgICAgICAgICAgICB8IGZvcm1hdCBpZiBleHBvbmVudCBpcyBsZXNzIHRoYW4gLTQgb3Igbm90IGxlc3MgdGhhbiAgIHwgICAgICAgICB8CnwgICAgICAgICAgICAgIHwgcHJlY2lzaW9uLCBkZWNpbWFsIGZvcm1hdCBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgJ0cnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGZvcm1hdC4gVXNlcyB1cHBlcmNhc2UgZXhwb25lbnRpYWwgICAgIHwgKDQpICAgICB8CnwgICAgICAgICAgICAgIHwgZm9ybWF0IGlmIGV4cG9uZW50IGlzIGxlc3MgdGhhbiAtNCBvciBub3QgbGVzcyB0aGFuICAgfCAgICAgICAgIHwKfCAgICAgICAgICAgICAgfCBwcmVjaXNpb24sIGRlY2ltYWwgZm9ybWF0IG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGAnYydgYCAgICAgIHwgU2luZ2xlIGNoYXJhY3RlciAoYWNjZXB0cyBpbnRlZ2VyIG9yIHNpbmdsZSBjaGFyYWN0ZXIgfCAgICAgICAgIHwKfCAgICAgICAgICAgICAgfCBzdHJpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgYGAncidgYCAgICAgIHwgU3RyaW5nIChjb252ZXJ0cyBhbnkgUHl0aG9uIG9iamVjdCB1c2luZyAqcmVwcigpKikuICAgfCAoNSkgICAgIHwKKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IGBgJ3MnYGAgICAgICB8IFN0cmluZyAoY29udmVydHMgYW55IFB5dGhvbiBvYmplY3QgdXNpbmcgYGBzdHIoKWBgKS4gIHwgKDYpICAgICB8CistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBgYCclJ2BgICAgICAgfCBObyBhcmd1bWVudCBpcyBjb252ZXJ0ZWQsIHJlc3VsdHMgaW4gYSBgYCclJ2BgICAgICAgICB8ICAgICAgICAgfAp8ICAgICAgICAgICAgICB8IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKCk5vdGVzOgoKMS4gVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyBhIGxlYWRpbmcgemVybyAoYGAnMCdgYCkgdG8gYmUgaW5zZXJ0ZWQKICAgYmV0d2VlbiBsZWZ0LWhhbmQgcGFkZGluZyBhbmQgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIG51bWJlciBpZiB0aGUKICAgbGVhZGluZyBjaGFyYWN0ZXIgb2YgdGhlIHJlc3VsdCBpcyBub3QgYWxyZWFkeSBhIHplcm8uCgoyLiBUaGUgYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIGEgbGVhZGluZyBgYCcweCdgYCBvciBgYCcwWCdgYCAoZGVwZW5kaW5nCiAgIG9uIHdoZXRoZXIgdGhlIGBgJ3gnYGAgb3IgYGAnWCdgYCBmb3JtYXQgd2FzIHVzZWQpIHRvIGJlIGluc2VydGVkCiAgIGJldHdlZW4gbGVmdC1oYW5kIHBhZGRpbmcgYW5kIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBudW1iZXIgaWYgdGhlCiAgIGxlYWRpbmcgY2hhcmFjdGVyIG9mIHRoZSByZXN1bHQgaXMgbm90IGFscmVhZHkgYSB6ZXJvLgoKMy4gVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyB0aGUgcmVzdWx0IHRvIGFsd2F5cyBjb250YWluIGEgZGVjaW1hbAogICBwb2ludCwgZXZlbiBpZiBubyBkaWdpdHMgZm9sbG93IGl0LgoKICAgVGhlIHByZWNpc2lvbiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsCiAgIHBvaW50IGFuZCBkZWZhdWx0cyB0byA2LgoKNC4gVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyB0aGUgcmVzdWx0IHRvIGFsd2F5cyBjb250YWluIGEgZGVjaW1hbAogICBwb2ludCwgYW5kIHRyYWlsaW5nIHplcm9lcyBhcmUgbm90IHJlbW92ZWQgYXMgdGhleSB3b3VsZCBvdGhlcndpc2UKICAgYmUuCgogICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgYmVmb3JlCiAgIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBhbmQgZGVmYXVsdHMgdG8gNi4KCjUuIFRoZSBgYCVyYGAgY29udmVyc2lvbiB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuMC4KCiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgY2hhcmFjdGVycyB1c2VkLgoKNi4gSWYgdGhlIG9iamVjdCBvciBmb3JtYXQgcHJvdmlkZWQgaXMgYSBgYHVuaWNvZGVgYCBzdHJpbmcsIHRoZQogICByZXN1bHRpbmcgc3RyaW5nIHdpbGwgYWxzbyBiZSBgYHVuaWNvZGVgYC4KCiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgY2hhcmFjdGVycyB1c2VkLgoKNy4gU2VlICoqUEVQIDIzNyoqLgoKU2luY2UgUHl0aG9uIHN0cmluZ3MgaGF2ZSBhbiBleHBsaWNpdCBsZW5ndGgsIGBgJXNgYCBjb252ZXJzaW9ucyBkbwpub3QgYXNzdW1lIHRoYXQgYGAnXDAnYGAgaXMgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogYGAlZmBgIGNvbnZlcnNpb25zIGZvciBudW1iZXJzIHdob3NlIGFic29sdXRlCnZhbHVlIGlzIG92ZXIgMWU1MCBhcmUgbm8gbG9uZ2VyIHJlcGxhY2VkIGJ5IGBgJWdgYCBjb252ZXJzaW9ucy4KCkFkZGl0aW9uYWwgc3RyaW5nIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgaW4gc3RhbmRhcmQgbW9kdWxlcwpgYHN0cmluZ2BgIGFuZCBgYHJlYGAuCgoKWFJhbmdlIFR5cGUKPT09PT09PT09PT0KClRoZSBgYHhyYW5nZWBgIHR5cGUgaXMgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHdoaWNoIGlzIGNvbW1vbmx5IHVzZWQKZm9yIGxvb3BpbmcuICBUaGUgYWR2YW50YWdlIG9mIHRoZSBgYHhyYW5nZWBgIHR5cGUgaXMgdGhhdCBhbgpgYHhyYW5nZWBgIG9iamVjdCB3aWxsIGFsd2F5cyB0YWtlIHRoZSBzYW1lIGFtb3VudCBvZiBtZW1vcnksIG5vCm1hdHRlciB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgaXQgcmVwcmVzZW50cy4gIFRoZXJlIGFyZSBubyBjb25zaXN0ZW50CnBlcmZvcm1hbmNlIGFkdmFudGFnZXMuCgpYUmFuZ2Ugb2JqZWN0cyBoYXZlIHZlcnkgbGl0dGxlIGJlaGF2aW9yOiB0aGV5IG9ubHkgc3VwcG9ydCBpbmRleGluZywKaXRlcmF0aW9uLCBhbmQgdGhlIGBgbGVuKClgYCBmdW5jdGlvbi4KCgpNdXRhYmxlIFNlcXVlbmNlIFR5cGVzCj09PT09PT09PT09PT09PT09PT09PT0KCkxpc3QgYW5kIGBgYnl0ZWFycmF5YGAgb2JqZWN0cyBzdXBwb3J0IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0CmFsbG93IGluLXBsYWNlIG1vZGlmaWNhdGlvbiBvZiB0aGUgb2JqZWN0LiBPdGhlciBtdXRhYmxlIHNlcXVlbmNlCnR5cGVzICh3aGVuIGFkZGVkIHRvIHRoZSBsYW5ndWFnZSkgc2hvdWxkIGFsc28gc3VwcG9ydCB0aGVzZQpvcGVyYXRpb25zLiBTdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczogc3VjaApvYmplY3RzIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIGNyZWF0ZWQuIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUKZGVmaW5lZCBvbiBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzICh3aGVyZSAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCk6CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgc1tpXSA9IHhgYCAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgc1tpOmpdID0gdGBgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYGRlbCBzW2k6al1gYCAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tpOmpdID0gW11gYCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgc1tpOmo6a10gPSB0YGAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiBgYHNbaTpqOmtdYGAgYXJlIHwgKDEpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgZGVsIHNbaTpqOmtdYGAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYHNbaTpqOmtdYGAgZnJvbSB0aGUgbGlzdCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgcy5hcHBlbmQoeClgYCAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2xlbihzKTpsZW4ocyldID0gICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbeF1gYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgcy5leHRlbmQoeClgYCAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2xlbihzKTpsZW4ocyldID0geGBgIHwgKDMpICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzLmNvdW50KHgpYGAgICAgICAgICAgICAgICAgIHwgcmV0dXJuIG51bWJlciBvZiAqaSoncyBmb3Igd2hpY2ggfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpXSA9PSB4YGAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzLmluZGV4KHhbLCBpWywgal1dKWBgICAgICAgIHwgcmV0dXJuIHNtYWxsZXN0ICprKiBzdWNoIHRoYXQgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1trXSA9PSB4YGAgYW5kIGBgaSA8PSBrIDwgamBgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzLmluc2VydChpLCB4KWBgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbaTppXSA9IFt4XWBgICAgICAgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYHMucG9wKFtpXSlgYCAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgeCA9IHNbaV07IGRlbCBzW2ldOyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV0dXJuIHhgYCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYHMucmVtb3ZlKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgZGVsIHNbcy5pbmRleCh4KV1gYCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgcy5yZXZlcnNlKClgYCAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDcpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgcy5zb3J0KFtjbXBbLCBrZXlbLCAgICAgICAgICB8IHNvcnQgdGhlIGl0ZW1zIG9mICpzKiBpbiBwbGFjZSAgIHwgKDcpKDgpKDkpKDEwKSAgICAgICAgIHwKfCByZXZlcnNlXV1dKWBgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKTm90ZXM6CgoxLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgIHJlcGxhY2luZy4KCjIuIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiBoYXMgaGlzdG9yaWNhbGx5IGFjY2VwdGVkIG11bHRpcGxlCiAgIHBhcmFtZXRlcnMgYW5kIGltcGxpY2l0bHkgam9pbmVkIHRoZW0gaW50byBhIHR1cGxlOyB0aGlzIG5vIGxvbmdlcgogICB3b3JrcyBpbiBQeXRob24gMi4wLiAgVXNlIG9mIHRoaXMgbWlzZmVhdHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkCiAgIHNpbmNlIFB5dGhvbiAxLjQuCgozLiAqeCogY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3QuCgo0LiBSYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gV2hlbiBhIG5lZ2F0aXZlCiAgIGluZGV4IGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIG9yIHRoaXJkIHBhcmFtZXRlciB0byB0aGUgYGBpbmRleCgpYGAKICAgbWV0aG9kLCB0aGUgbGlzdCBsZW5ndGggaXMgYWRkZWQsIGFzIGZvciBzbGljZSBpbmRpY2VzLiAgSWYgaXQgaXMKICAgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3Igc2xpY2UgaW5kaWNlcy4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGBgaW5kZXgoKWBgIGRpZG4ndCBoYXZlCiAgIGFyZ3VtZW50cyBmb3Igc3BlY2lmeWluZyBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbnMuCgo1LiBXaGVuIGEgbmVnYXRpdmUgaW5kZXggaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gdGhlCiAgIGBgaW5zZXJ0KClgYCBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlCiAgIGluZGljZXMuICBJZiBpdCBpcyBzdGlsbCBuZWdhdGl2ZSwgaXQgaXMgdHJ1bmNhdGVkIHRvIHplcm8sIGFzIGZvcgogICBzbGljZSBpbmRpY2VzLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWxsIG5lZ2F0aXZlIGluZGljZXMgd2VyZQogICB0cnVuY2F0ZWQgdG8gemVyby4KCjYuIFRoZSBgYHBvcCgpYGAgbWV0aG9kIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBsaXN0IGFuZCBhcnJheSB0eXBlcy4KICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICppKiBkZWZhdWx0cyB0byBgYC0xYGAsIHNvIHRoYXQgYnkgZGVmYXVsdAogICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLgoKNy4gVGhlIGBgc29ydCgpYGAgYW5kIGBgcmV2ZXJzZSgpYGAgbWV0aG9kcyBtb2RpZnkgdGhlIGxpc3QgaW4gcGxhY2UKICAgZm9yIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiBzb3J0aW5nIG9yIHJldmVyc2luZyBhIGxhcmdlIGxpc3QuICBUbwogICByZW1pbmQgeW91IHRoYXQgdGhleSBvcGVyYXRlIGJ5IHNpZGUgZWZmZWN0LCB0aGV5IGRvbid0IHJldHVybiB0aGUKICAgc29ydGVkIG9yIHJldmVyc2VkIGxpc3QuCgo4LiBUaGUgYGBzb3J0KClgYCBtZXRob2QgdGFrZXMgb3B0aW9uYWwgYXJndW1lbnRzIGZvciBjb250cm9sbGluZyB0aGUKICAgY29tcGFyaXNvbnMuCgogICAqY21wKiBzcGVjaWZpZXMgYSBjdXN0b20gY29tcGFyaXNvbiBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzIChsaXN0CiAgIGl0ZW1zKSB3aGljaCBzaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUsIHplcm8gb3IgcG9zaXRpdmUgbnVtYmVyCiAgIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIHNtYWxsZXIgdGhhbiwKICAgZXF1YWwgdG8sIG9yIGxhcmdlciB0aGFuIHRoZSBzZWNvbmQgYXJndW1lbnQ6IGBgY21wPWxhbWJkYSB4LHk6CiAgIGNtcCh4Lmxvd2VyKCksIHkubG93ZXIoKSlgYC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgTm9uZWBgLgoKICAgKmtleSogc3BlY2lmaWVzIGEgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50IHRoYXQgaXMgdXNlZCB0byBleHRyYWN0CiAgIGEgY29tcGFyaXNvbiBrZXkgZnJvbSBlYWNoIGxpc3QgZWxlbWVudDogYGBrZXk9c3RyLmxvd2VyYGAuICBUaGUKICAgZGVmYXVsdCB2YWx1ZSBpcyBgYE5vbmVgYC4KCiAgICpyZXZlcnNlKiBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gYGBUcnVlYGAsIHRoZW4gdGhlIGxpc3QKICAgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC4KCiAgIEluIGdlbmVyYWwsIHRoZSAqa2V5KiBhbmQgKnJldmVyc2UqIGNvbnZlcnNpb24gcHJvY2Vzc2VzIGFyZSBtdWNoCiAgIGZhc3RlciB0aGFuIHNwZWNpZnlpbmcgYW4gZXF1aXZhbGVudCAqY21wKiBmdW5jdGlvbi4gIFRoaXMgaXMKICAgYmVjYXVzZSAqY21wKiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGVhY2ggbGlzdCBlbGVtZW50IHdoaWxlCiAgICprZXkqIGFuZCAqcmV2ZXJzZSogdG91Y2ggZWFjaCBlbGVtZW50IG9ubHkgb25jZS4gIFVzZQogICBgYGZ1bmN0b29scy5jbXBfdG9fa2V5KClgYCB0byBjb252ZXJ0IGFuIG9sZC1zdHlsZSAqY21wKiBmdW5jdGlvbgogICB0byBhICprZXkqIGZ1bmN0aW9uLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYGBOb25lYGAgYXMgYW4gZXF1aXZhbGVudCB0bwogICBvbWl0dGluZyAqY21wKiB3YXMgYWRkZWQuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciAqa2V5KiBhbmQgKnJldmVyc2UqIHdhcyBhZGRlZC4KCjkuIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMywgdGhlIGBgc29ydCgpYGAgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmUKICAgc3RhYmxlLiAgQSBzb3J0IGlzIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlCiAgIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbCAtLS0gdGhpcyBpcyBoZWxwZnVsCiAgIGZvciBzb3J0aW5nIGluIG11bHRpcGxlIHBhc3NlcyAoZm9yIGV4YW1wbGUsIHNvcnQgYnkgZGVwYXJ0bWVudCwKICAgdGhlbiBieSBzYWxhcnkgZ3JhZGUpLgoKMTAuICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogV2hpbGUgYSBsaXN0IGlzIGJlaW5nIHNvcnRlZCwKICAgIHRoZSBlZmZlY3Qgb2YgYXR0ZW1wdGluZyB0byBtdXRhdGUsIG9yIGV2ZW4gaW5zcGVjdCwgdGhlIGxpc3QgaXMKICAgIHVuZGVmaW5lZC4gIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiAyLjMgYW5kIG5ld2VyIG1ha2VzIHRoZQogICAgbGlzdCBhcHBlYXIgZW1wdHkgZm9yIHRoZSBkdXJhdGlvbiwgYW5kIHJhaXNlcyBgYFZhbHVlRXJyb3JgYCBpZgogICAgaXQgY2FuIGRldGVjdCB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC4KdAgAAAB0eXBlc3NlcXNBHgAACk11dGFibGUgU2VxdWVuY2UgVHlwZXMKKioqKioqKioqKioqKioqKioqKioqKgoKTGlzdCBhbmQgYGBieXRlYXJyYXlgYCBvYmplY3RzIHN1cHBvcnQgYWRkaXRpb25hbCBvcGVyYXRpb25zIHRoYXQKYWxsb3cgaW4tcGxhY2UgbW9kaWZpY2F0aW9uIG9mIHRoZSBvYmplY3QuIE90aGVyIG11dGFibGUgc2VxdWVuY2UKdHlwZXMgKHdoZW4gYWRkZWQgdG8gdGhlIGxhbmd1YWdlKSBzaG91bGQgYWxzbyBzdXBwb3J0IHRoZXNlCm9wZXJhdGlvbnMuIFN0cmluZ3MgYW5kIHR1cGxlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGVzOiBzdWNoCm9iamVjdHMgY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgY3JlYXRlZC4gVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZQpkZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2UgdHlwZXMgKHdoZXJlICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0KToKCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBzW2ldID0geGBgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkIGJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzW2k6al0gPSB0YGAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAqdCogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgZGVsIHNbaTpqXWBgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6al0gPSBbXWBgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzW2k6ajprXSA9IHRgYCAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mIGBgc1tpOmo6a11gYCBhcmUgfCAoMSkgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBkZWwgc1tpOmo6a11gYCAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpOmo6a11gYCBmcm9tIHRoZSBsaXN0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzLmFwcGVuZCh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbbGVuKHMpOmxlbihzKV0gPSAgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFt4XWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzLmV4dGVuZCh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbbGVuKHMpOmxlbihzKV0gPSB4YGAgfCAoMykgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYHMuY291bnQoeClgYCAgICAgICAgICAgICAgICAgfCByZXR1cm4gbnVtYmVyIG9mICppKidzIGZvciB3aGljaCB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2ldID09IHhgYCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYHMuaW5kZXgoeFssIGlbLCBqXV0pYGAgICAgICAgfCByZXR1cm4gc21hbGxlc3QgKmsqIHN1Y2ggdGhhdCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2tdID09IHhgYCBhbmQgYGBpIDw9IGsgPCBqYGAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYHMuaW5zZXJ0KGksIHgpYGAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tpOmldID0gW3hdYGAgICAgICAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgcy5wb3AoW2ldKWBgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGB4ID0gc1tpXTsgZGVsIHNbaV07ICAgIHwgKDYpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXR1cm4geGBgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgcy5yZW1vdmUoeClgYCAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBkZWwgc1tzLmluZGV4KHgpXWBgICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzLnJldmVyc2UoKWBgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNykgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBsYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBzLnNvcnQoW2NtcFssIGtleVssICAgICAgICAgIHwgc29ydCB0aGUgaXRlbXMgb2YgKnMqIGluIHBsYWNlICAgfCAoNykoOCkoOSkoMTApICAgICAgICAgfAp8IHJldmVyc2VdXV0pYGAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpOb3RlczoKCjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyAgcmVwbGFjaW5nLgoKMi4gVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIGhhcyBoaXN0b3JpY2FsbHkgYWNjZXB0ZWQgbXVsdGlwbGUKICAgcGFyYW1ldGVycyBhbmQgaW1wbGljaXRseSBqb2luZWQgdGhlbSBpbnRvIGEgdHVwbGU7IHRoaXMgbm8gbG9uZ2VyCiAgIHdvcmtzIGluIFB5dGhvbiAyLjAuICBVc2Ugb2YgdGhpcyBtaXNmZWF0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQKICAgc2luY2UgUHl0aG9uIDEuNC4KCjMuICp4KiBjYW4gYmUgYW55IGl0ZXJhYmxlIG9iamVjdC4KCjQuIFJhaXNlcyBgYFZhbHVlRXJyb3JgYCB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLiBXaGVuIGEgbmVnYXRpdmUKICAgaW5kZXggaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgb3IgdGhpcmQgcGFyYW1ldGVyIHRvIHRoZSBgYGluZGV4KClgYAogICBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlIGluZGljZXMuICBJZiBpdCBpcwogICBzdGlsbCBuZWdhdGl2ZSwgaXQgaXMgdHJ1bmNhdGVkIHRvIHplcm8sIGFzIGZvciBzbGljZSBpbmRpY2VzLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYGBpbmRleCgpYGAgZGlkbid0IGhhdmUKICAgYXJndW1lbnRzIGZvciBzcGVjaWZ5aW5nIHN0YXJ0IGFuZCBzdG9wIHBvc2l0aW9ucy4KCjUuIFdoZW4gYSBuZWdhdGl2ZSBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGUKICAgYGBpbnNlcnQoKWBgIG1ldGhvZCwgdGhlIGxpc3QgbGVuZ3RoIGlzIGFkZGVkLCBhcyBmb3Igc2xpY2UKICAgaW5kaWNlcy4gIElmIGl0IGlzIHN0aWxsIG5lZ2F0aXZlLCBpdCBpcyB0cnVuY2F0ZWQgdG8gemVybywgYXMgZm9yCiAgIHNsaWNlIGluZGljZXMuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhbGwgbmVnYXRpdmUgaW5kaWNlcyB3ZXJlCiAgIHRydW5jYXRlZCB0byB6ZXJvLgoKNi4gVGhlIGBgcG9wKClgYCBtZXRob2QgaXMgb25seSBzdXBwb3J0ZWQgYnkgdGhlIGxpc3QgYW5kIGFycmF5IHR5cGVzLgogICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvIGBgLTFgYCwgc28gdGhhdCBieSBkZWZhdWx0CiAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuCgo3LiBUaGUgYGBzb3J0KClgYCBhbmQgYGByZXZlcnNlKClgYCBtZXRob2RzIG1vZGlmeSB0aGUgbGlzdCBpbiBwbGFjZQogICBmb3IgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHNvcnRpbmcgb3IgcmV2ZXJzaW5nIGEgbGFyZ2UgbGlzdC4gIFRvCiAgIHJlbWluZCB5b3UgdGhhdCB0aGV5IG9wZXJhdGUgYnkgc2lkZSBlZmZlY3QsIHRoZXkgZG9uJ3QgcmV0dXJuIHRoZQogICBzb3J0ZWQgb3IgcmV2ZXJzZWQgbGlzdC4KCjguIFRoZSBgYHNvcnQoKWBgIG1ldGhvZCB0YWtlcyBvcHRpb25hbCBhcmd1bWVudHMgZm9yIGNvbnRyb2xsaW5nIHRoZQogICBjb21wYXJpc29ucy4KCiAgICpjbXAqIHNwZWNpZmllcyBhIGN1c3RvbSBjb21wYXJpc29uIGZ1bmN0aW9uIG9mIHR3byBhcmd1bWVudHMgKGxpc3QKICAgaXRlbXMpIHdoaWNoIHNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSwgemVybyBvciBwb3NpdGl2ZSBudW1iZXIKICAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGNvbnNpZGVyZWQgc21hbGxlciB0aGFuLAogICBlcXVhbCB0bywgb3IgbGFyZ2VyIHRoYW4gdGhlIHNlY29uZCBhcmd1bWVudDogYGBjbXA9bGFtYmRhIHgseToKICAgY21wKHgubG93ZXIoKSwgeS5sb3dlcigpKWBgLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBOb25lYGAuCgogICAqa2V5KiBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvIGV4dHJhY3QKICAgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50OiBgYGtleT1zdHIubG93ZXJgYC4gIFRoZQogICBkZWZhdWx0IHZhbHVlIGlzIGBgTm9uZWBgLgoKICAgKnJldmVyc2UqIGlzIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHNldCB0byBgYFRydWVgYCwgdGhlbiB0aGUgbGlzdAogICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLgoKICAgSW4gZ2VuZXJhbCwgdGhlICprZXkqIGFuZCAqcmV2ZXJzZSogY29udmVyc2lvbiBwcm9jZXNzZXMgYXJlIG11Y2gKICAgZmFzdGVyIHRoYW4gc3BlY2lmeWluZyBhbiBlcXVpdmFsZW50ICpjbXAqIGZ1bmN0aW9uLiAgVGhpcyBpcwogICBiZWNhdXNlICpjbXAqIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgZWFjaCBsaXN0IGVsZW1lbnQgd2hpbGUKICAgKmtleSogYW5kICpyZXZlcnNlKiB0b3VjaCBlYWNoIGVsZW1lbnQgb25seSBvbmNlLiAgVXNlCiAgIGBgZnVuY3Rvb2xzLmNtcF90b19rZXkoKWBgIHRvIGNvbnZlcnQgYW4gb2xkLXN0eWxlICpjbXAqIGZ1bmN0aW9uCiAgIHRvIGEgKmtleSogZnVuY3Rpb24uCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYE5vbmVgYCBhcyBhbiBlcXVpdmFsZW50IHRvCiAgIG9taXR0aW5nICpjbXAqIHdhcyBhZGRlZC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yICprZXkqIGFuZCAqcmV2ZXJzZSogd2FzIGFkZGVkLgoKOS4gU3RhcnRpbmcgd2l0aCBQeXRob24gMi4zLCB0aGUgYGBzb3J0KClgYCBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZQogICBzdGFibGUuICBBIHNvcnQgaXMgc3RhYmxlIGlmIGl0IGd1YXJhbnRlZXMgbm90IHRvIGNoYW5nZSB0aGUKICAgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBjb21wYXJlIGVxdWFsIC0tLSB0aGlzIGlzIGhlbHBmdWwKICAgZm9yIHNvcnRpbmcgaW4gbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LAogICB0aGVuIGJ5IHNhbGFyeSBncmFkZSkuCgoxMC4gKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBXaGlsZSBhIGxpc3QgaXMgYmVpbmcgc29ydGVkLAogICAgdGhlIGVmZmVjdCBvZiBhdHRlbXB0aW5nIHRvIG11dGF0ZSwgb3IgZXZlbiBpbnNwZWN0LCB0aGUgbGlzdCBpcwogICAgdW5kZWZpbmVkLiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIDIuMyBhbmQgbmV3ZXIgbWFrZXMgdGhlCiAgICBsaXN0IGFwcGVhciBlbXB0eSBmb3IgdGhlIGR1cmF0aW9uLCBhbmQgcmFpc2VzIGBgVmFsdWVFcnJvcmBgIGlmCiAgICBpdCBjYW4gZGV0ZWN0IHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LgpzEAAAAHR5cGVzc2VxLW11dGFibGVzmQIAAApVbmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpBbGwgdW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHk6CgogICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByCgpUaGUgdW5hcnkgYGAtYGAgKG1pbnVzKSBvcGVyYXRvciB5aWVsZHMgdGhlIG5lZ2F0aW9uIG9mIGl0cyBudW1lcmljCmFyZ3VtZW50LgoKVGhlIHVuYXJ5IGBgK2BgIChwbHVzKSBvcGVyYXRvciB5aWVsZHMgaXRzIG51bWVyaWMgYXJndW1lbnQgdW5jaGFuZ2VkLgoKVGhlIHVuYXJ5IGBgfmBgIChpbnZlcnQpIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBpbnZlcnNpb24gb2YgaXRzCnBsYWluIG9yIGxvbmcgaW50ZWdlciBhcmd1bWVudC4gIFRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiBgYHhgYCBpcwpkZWZpbmVkIGFzIGBgLSh4KzEpYGAuICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwgbnVtYmVycy4KCkluIGFsbCB0aHJlZSBjYXNlcywgaWYgdGhlIGFyZ3VtZW50IGRvZXMgbm90IGhhdmUgdGhlIHByb3BlciB0eXBlLCBhCmBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4KdAUAAAB1bmFyeXO+AgAAClRoZSBgYHdoaWxlYGAgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgYGB3aGlsZWBgIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyBhbgpleHByZXNzaW9uIGlzIHRydWU6CgogICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGV4cHJlc3Npb24gIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXQoKVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgZXhlY3V0ZXMgdGhlCmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lCml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmIHByZXNlbnQsIGlzCmV4ZWN1dGVkIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLgoKQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wCndpdGhvdXQgZXhlY3V0aW5nIHRoZSBgYGVsc2VgYCBjbGF1c2UncyBzdWl0ZS4gIEEgYGBjb250aW51ZWBgCnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZApnb2VzIGJhY2sgdG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi4KdAUAAAB3aGlsZXP9CQAAClRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKgoKTmV3IGluIHZlcnNpb24gMi41LgoKVGhlIGBgd2l0aGBgIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrIHdpdGgKbWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnQKQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb24KYGB0cnlgYC4uLmBgZXhjZXB0YGAuLi5gYGZpbmFsbHlgYCB1c2FnZSBwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQKZm9yIGNvbnZlbmllbnQgcmV1c2UuCgogICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGUKICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF0KClRoZSBleGVjdXRpb24gb2YgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgYXMKZm9sbG93czoKCjEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBgYHdpdGhfaXRlbWBgKQogICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLgoKMi4gVGhlIGNvbnRleHQgbWFuYWdlcidzIGBgX19leGl0X18oKWBgIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLgoKMy4gVGhlIGNvbnRleHQgbWFuYWdlcidzIGBgX19lbnRlcl9fKClgYCBtZXRob2QgaXMgaW52b2tlZC4KCjQuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgYGB3aXRoYGAgc3RhdGVtZW50LCB0aGUgcmV0dXJuCiAgIHZhbHVlIGZyb20gYGBfX2VudGVyX18oKWBgIGlzIGFzc2lnbmVkIHRvIGl0LgoKICAgTm90ZTogVGhlIGBgd2l0aGBgIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlIGBgX19lbnRlcl9fKClgYAogICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gYGBfX2V4aXRfXygpYGAgd2lsbCBhbHdheXMKICAgICBiZSBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlCiAgICAgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhbiBlcnJvciBvY2N1cnJpbmcKICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LgoKNS4gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLgoKNi4gVGhlIGNvbnRleHQgbWFuYWdlcidzIGBgX19leGl0X18oKWBgIG1ldGhvZCBpcyBpbnZva2VkLiBJZiBhbgogICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kCiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBgYF9fZXhpdF9fKClgYC4gT3RoZXJ3aXNlLAogICB0aHJlZSBgYE5vbmVgYCBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLgoKICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWUKICAgZnJvbSB0aGUgYGBfX2V4aXRfXygpYGAgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcwogICByZXJhaXNlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcwogICBzdXBwcmVzc2VkLCBhbmQgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nCiAgIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQuCgogICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlCiAgIHJldHVybiB2YWx1ZSBmcm9tIGBgX19leGl0X18oKWBgIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gcHJvY2VlZHMKICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi4KCldpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmCm11bHRpcGxlIGBgd2l0aGBgIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6CgogICB3aXRoIEEoKSBhcyBhLCBCKCkgYXMgYjoKICAgICAgIHN1aXRlCgppcyBlcXVpdmFsZW50IHRvCgogICB3aXRoIEEoKSBhcyBhOgogICAgICAgd2l0aCBCKCkgYXMgYjoKICAgICAgICAgICBzdWl0ZQoKTm90ZTogSW4gUHl0aG9uIDIuNSwgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCBpcyBvbmx5IGFsbG93ZWQgd2hlbiB0aGUKICBgYHdpdGhfc3RhdGVtZW50YGAgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgSXQgaXMgYWx3YXlzIGVuYWJsZWQKICBpbiBQeXRob24gMi42LgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy4KClNlZSBhbHNvOgoKICAgKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnQKICAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbgogICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuCnQEAAAAd2l0aHNQCAAAClRoZSBgYHlpZWxkYGAgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKioqCgogICB5aWVsZF9zdG10IDo6PSB5aWVsZF9leHByZXNzaW9uCgpUaGUgYGB5aWVsZGBgIHN0YXRlbWVudCBpcyBvbmx5IHVzZWQgd2hlbiBkZWZpbmluZyBhIGdlbmVyYXRvcgpmdW5jdGlvbiwgYW5kIGlzIG9ubHkgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLgpVc2luZyBhIGBgeWllbGRgYCBzdGF0ZW1lbnQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHN1ZmZpY2llbnQgdG8KY2F1c2UgdGhhdCBkZWZpbml0aW9uIHRvIGNyZWF0ZSBhIGdlbmVyYXRvciBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEKbm9ybWFsIGZ1bmN0aW9uLgoKV2hlbiBhIGdlbmVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0IHJldHVybnMgYW4gaXRlcmF0b3Iga25vd24gYXMgYQpnZW5lcmF0b3IgaXRlcmF0b3IsIG9yIG1vcmUgY29tbW9ubHksIGEgZ2VuZXJhdG9yLiAgVGhlIGJvZHkgb2YgdGhlCmdlbmVyYXRvciBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBjYWxsaW5nIHRoZSBnZW5lcmF0b3IncyBgYG5leHQoKWBgCm1ldGhvZCByZXBlYXRlZGx5IHVudGlsIGl0IHJhaXNlcyBhbiBleGNlcHRpb24uCgpXaGVuIGEgYGB5aWVsZGBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCwgdGhlIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IgaXMKZnJvemVuIGFuZCB0aGUgdmFsdWUgb2YgYGBleHByZXNzaW9uX2xpc3RgYCBpcyByZXR1cm5lZCB0bwpgYG5leHQoKWBgJ3MgY2FsbGVyLiAgQnkgImZyb3plbiIgd2UgbWVhbiB0aGF0IGFsbCBsb2NhbCBzdGF0ZSBpcwpyZXRhaW5lZCwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGJpbmRpbmdzIG9mIGxvY2FsIHZhcmlhYmxlcywgdGhlCmluc3RydWN0aW9uIHBvaW50ZXIsIGFuZCB0aGUgaW50ZXJuYWwgZXZhbHVhdGlvbiBzdGFjazogZW5vdWdoCmluZm9ybWF0aW9uIGlzIHNhdmVkIHNvIHRoYXQgdGhlIG5leHQgdGltZSBgYG5leHQoKWBgIGlzIGludm9rZWQsIHRoZQpmdW5jdGlvbiBjYW4gcHJvY2VlZCBleGFjdGx5IGFzIGlmIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50IHdlcmUganVzdAphbm90aGVyIGV4dGVybmFsIGNhbGwuCgpBcyBvZiBQeXRob24gdmVyc2lvbiAyLjUsIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50IGlzIG5vdyBhbGxvd2VkIGluCnRoZSBgYHRyeWBgIGNsYXVzZSBvZiBhIGBgdHJ5YGAgLi4uICBgYGZpbmFsbHlgYCBjb25zdHJ1Y3QuICBJZiB0aGUKZ2VuZXJhdG9yIGlzIG5vdCByZXN1bWVkIGJlZm9yZSBpdCBpcyBmaW5hbGl6ZWQgKGJ5IHJlYWNoaW5nIGEgemVybwpyZWZlcmVuY2UgY291bnQgb3IgYnkgYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQpLCB0aGUgZ2VuZXJhdG9yLQppdGVyYXRvcidzIGBgY2xvc2UoKWBgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCwgYWxsb3dpbmcgYW55IHBlbmRpbmcKYGBmaW5hbGx5YGAgY2xhdXNlcyB0byBleGVjdXRlLgoKRm9yIGZ1bGwgZGV0YWlscyBvZiBgYHlpZWxkYGAgc2VtYW50aWNzLCByZWZlciB0byB0aGUgKllpZWxkCmV4cHJlc3Npb25zKiBzZWN0aW9uLgoKTm90ZTogSW4gUHl0aG9uIDIuMiwgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgd2FzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZQogIGBgZ2VuZXJhdG9yc2BgIGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZC4gIFRoaXMgYGBfX2Z1dHVyZV9fYGAgaW1wb3J0CiAgc3RhdGVtZW50IHdhcyB1c2VkIHRvIGVuYWJsZSB0aGUgZmVhdHVyZToKCiAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzCgpTZWUgYWxzbzoKCiAgICoqUEVQIDAyNTUqKiAtIFNpbXBsZSBHZW5lcmF0b3JzCiAgICAgIFRoZSBwcm9wb3NhbCBmb3IgYWRkaW5nIGdlbmVyYXRvcnMgYW5kIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50CiAgICAgIHRvIFB5dGhvbi4KCiAgICoqUEVQIDAzNDIqKiAtIENvcm91dGluZXMgdmlhIEVuaGFuY2VkIEdlbmVyYXRvcnMKICAgICAgVGhlIHByb3Bvc2FsIHRoYXQsIGFtb25nIG90aGVyIGdlbmVyYXRvciBlbmhhbmNlbWVudHMsIHByb3Bvc2VkCiAgICAgIGFsbG93aW5nIGBgeWllbGRgYCB0byBhcHBlYXIgaW5zaWRlIGEgYGB0cnlgYCAuLi4gYGBmaW5hbGx5YGAKICAgICAgYmxvY2suCnQFAAAAeWllbGROKAEAAAB0BgAAAHRvcGljcygAAAAAKAAAAAAoAAAAAHN8AAAAL2hvbWUvdmFncmFudC9ycG1idWlsZC9CVUlMRC9idWlsZC10b29sY2hhaW4vb3B0L3Rvb2xjaGFpbnMvc3RiZ2NjLTQuOC0xLjAvcHl0aG9uLXJ1bnRpbWUvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL3RvcGljcy5weXQIAAAAPG1vZHVsZT4CAAAAc5YAAAAKAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwEHAQcBBwE=