aGVhZGVyIHsKcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKCWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwoJaW1wb3J0IGphdmEuaW8uUmVhZGVyOwoJaW1wb3J0IGFudGxyLklucHV0QnVmZmVyOwoJaW1wb3J0IGFudGxyLkxleGVyU2hhcmVkSW5wdXRTdGF0ZTsKfQogCi8qKiBKU1ItMjQxIEdyb292eSBSZWNvZ25pemVyCiAqCiAqIFJ1biAnamF2YSBNYWluIFstc2hvd3RyZWVdIGRpcmVjdG9yeS1mdWxsLW9mLWdyb292eS1maWxlcycKICoKICogW1RoZSAtc2hvd3RyZWUgb3B0aW9uIHBvcHMgdXAgYSBTd2luZyBmcmFtZSB0aGF0IHNob3dzCiAqICB0aGUgQVNUIGNvbnN0cnVjdGVkIGZyb20gdGhlIHBhcnNlci5dCiAqCiAqIENvbnRyaWJ1dGluZyBhdXRob3JzOgogKgkJSm9obiBNaXRjaGVsbAkJam9obm1Abm9uLm5ldAogKgkJVGVyZW5jZSBQYXJyCQlwYXJydEBtYWdlbGFuZy5jb20KICoJCUpvaG4gTGlsbGV5CQlqbGlsbGV5QGVtcGF0aHkuY29tCiAqCQlTY290dCBTdGFuY2hmaWVsZAl0aGV0aWNrQG1hZ2VsYW5nLmNvbQogKgkJTWFya3VzIE1vaG5lbgkJbW9obmVuQGluZm9ybWF0aWsucnd0aC1hYWNoZW4uZGUKICoJCVBldGVyIFdpbGxpYW1zCQlwZXRlLndpbGxpYW1zQHN1bi5jb20KICoJCUFsbGFuIEphY29icwkJQWxsYW4uSmFjb2JzQGVuZy5zdW4uY29tCiAqCQlTdGV2ZSBNZXNzaWNrCQltZXNzaWNrQHJlZGhpbGxzLmNvbQogKgkJSm9obiBQeWJ1cwkJam9obkBweWJ1cy5vcmcKICoJCUpvaG4gUm9zZQkJcm9zZTAwQG1hYy5jb20KICoJCUplcmVteSBSYXluZXIJCWdyb292eUByb3NzLXJheW5lci5jb20KICoKICogVmVyc2lvbiAxLjAwIERlY2VtYmVyIDksIDE5OTcgLS0gaW5pdGlhbCByZWxlYXNlCiAqIFZlcnNpb24gMS4wMSBEZWNlbWJlciAxMCwgMTk5NwogKgkJZml4ZWQgYnVnIGluIG9jdGFsIGRlZiAoMC4uNyBub3QgMC4uOCkKICogVmVyc2lvbiAxLjEwIEF1Z3VzdCAxOTk4IChwYXJydCkKICoJCWFkZGVkIHRyZWUgY29uc3RydWN0aW9uCiAqCQlmaXhlZCBkZWZpbml0aW9uIG9mIFdTLGNvbW1lbnRzIGZvciBtYWMscGMsdW5peCBuZXdsaW5lcwogKgkJYWRkZWQgdW5hcnkgcGx1cwogKiBWZXJzaW9uIDEuMTEgKE5vdiAyMCwgMTk5OCkKICoJCUFkZGVkICJzaHV0dXAiIG9wdGlvbiB0byB0dXJuIG9mZiBsYXN0IGFtYmlnIHdhcm5pbmcuCiAqCQlGaXhlZCBpbm5lciBjbGFzcyBkZWYgdG8gYWxsb3cgbmFtZWQgY2xhc3MgZGVmcyBhcyBzdGF0ZW1lbnRzCiAqCQlzeW5jaHJvbml6ZWQgcmVxdWlyZXMgY29tcG91bmQgbm90IHNpbXBsZSBzdGF0ZW1lbnQKICoJCWFkZCBbXSBhZnRlciBidWlsdEluVHlwZSBET1QgY2xhc3MgaW4gcHJpbWFyeUV4cHJlc3Npb24KICoJCSJjb25zdCIgaXMgcmVzZXJ2ZWQgYnV0IG5vdCB2YWxpZC4ucmVtb3ZlZCBmcm9tIG1vZGlmaWVycwogKiBWZXJzaW9uIDEuMTIgKEZlYiAyLCAxOTk5KQogKgkJQ2hhbmdlZCBMSVRFUkFMX3h4eCB0byB4eHggaW4gdHJlZSBncmFtbWFyLgogKgkJVXBkYXRlZCBqYXZhLmcgdG8gdXNlIHRva2VucyB7Li4ufSBub3cgZm9yIDIuNi4wIChuZXcgZmVhdHVyZSkuCiAqCiAqIFZlcnNpb24gMS4xMyAoQXByIDIzLCAxOTk5KQogKgkJRGlkbid0IGhhdmUgKHN0YXQpPyBmb3IgZWxzZSBjbGF1c2UgaW4gdHJlZSBwYXJzZXIuCiAqCQlEaWRuJ3QgZ2VuIEFTVHMgZm9yIGludGVyZmFjZSBleHRlbmRzLiAgVXBkYXRlZCB0cmVlIHBhcnNlciB0b28uCiAqCQlVcGRhdGVkIHRvIDIuNi4wLgogKiBWZXJzaW9uIDEuMTQgKEp1biAyMCwgMTk5OSkKICoJCUFsbG93ZWQgZmluYWwvYWJzdHJhY3Qgb24gbG9jYWwgY2xhc3Nlcy4KICoJCVJlbW92ZWQgbG9jYWwgaW50ZXJmYWNlcyBmcm9tIG1ldGhvZHMKICoJCVB1dCBpbnN0YW5jZW9mIHByZWNlZGVuY2Ugd2hlcmUgaXQgYmVsb25ncy4uLmluIHJlbGF0aW9uYWxFeHByCiAqCQkJSXQgYWxzbyBoYWQgZXhwciBub3QgdHlwZSBhcyBhcmc7IGZpeGVkIGl0LgogKgkJTWlzc2luZyAhIG9uIFNFTUkgaW4gY2xhc3NCbG9jawogKgkJZml4ZWQ6IChleHByKSArICJzdHJpbmciIHdhcyBwYXJzZWQgaW5jb3JyZWN0bHkgKCsgYXMgdW5hcnkgcGx1cykuCiAqCQlmaXhlZDogZGlkbid0IGxpa2UgT2JqZWN0W10uY2xhc3MgaW4gcGFyc2VyIG9yIHRyZWUgcGFyc2VyCiAqIFZlcnNpb24gMS4xNSAoSnVuIDI2LCAxOTk5KQogKgkJU2NyZXdlZCB1cCBydWxlIHdpdGggaW5zdGFuY2VvZiBpbiBpdC4gOiggIEZpeGVkLgogKgkJVHJlZSBwYXJzZXIgZGlkbid0IGxpa2UgKGV4cHIpLnNvbWV0aGluZzsgZml4ZWQuCiAqCQlBbGxvd2VkIG11bHRpcGxlIGluaGVyaXRhbmNlIGluIHRyZWUgZ3JhbW1hci4gb29wcy4KICogVmVyc2lvbiAxLjE2IChBdWd1c3QgMjIsIDE5OTkpCiAqCQlFeHRlbmRpbmcgYW4gaW50ZXJmYWNlIGJ1aWx0IGEgd2Fja3kgdHJlZTogaGFkIGV4dHJhIEVYVEVORFMuCiAqCQlUcmVlIGdyYW1tYXIgZGlkbid0IGFsbG93IG11bHRpcGxlIHN1cGVyaW50ZXJmYWNlcy4KICoJCVRyZWUgZ3JhbW1hciBkaWRuJ3QgYWxsb3cgZW1wdHkgdmFyIGluaXRpYWxpemVyOiB7fQogKiBWZXJzaW9uIDEuMTcgKE9jdG9iZXIgMTIsIDE5OTkpCiAqCQlFU0MgbGV4ZXIgcnVsZSBhbGxvd2VkIDM5OSBtYXggbm90IDM3NyBtYXguCiAqCQlqYXZhLnRyZWUuZyBkaWRuJ3QgaGFuZGxlIHRoZSBleHByZXNzaW9uIG9mIHN5bmNocm9uaXplZAogKgkJc3RhdGVtZW50cy4KICogVmVyc2lvbiAxLjE4IChBdWd1c3QgMTIsIDIwMDEpCiAqCSAgCVRlcmVuY2UgdXBkYXRlZCB0byBKYXZhIDIgVmVyc2lvbiAxLjMgYnkKICoJCW9ic2VydmluZy9jb21iaW5pbmcgd29yayBvZiBBbGxhbiBKYWNvYnMgYW5kIFN0ZXZlCiAqCQlNZXNzaWNrLiAgSGFuZGxlcyAxLjMgc3JjLiAgU3VtbWFyeToKICoJCW8gIHByaW1hcnkgZGlkbid0IGluY2x1ZGUgYm9vbGVhbi5jbGFzcyBraW5kIG9mIHRoaW5nCiAqCSAgCW8gIGNvbnN0cnVjdG9yIGNhbGxzIHBhcnNlZCBleHBsaWNpdGx5IG5vdzoKICogCQkgICBzZWUgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24KICoJCW8gIGFkZCBzdHJpY3RmcCBtb2RpZmllcgogKgkgIAlvICBtaXNzaW5nIG9iakJsb2NrIGFmdGVyIG5ldyBleHByZXNzaW9uIGluIHRyZWUgZ3JhbW1hcgogKgkJbyAgbWVyZ2VkIGxvY2FsIGNsYXNzIGRlZmluaXRpb24gYWx0ZXJuYXRpdmVzLCBtb3ZlZCBhZnRlciBkZWNsYXJhdGlvbgogKgkJbyAgZml4ZWQgcHJvYmxlbSB3aXRoIENsYXNzTmFtZS5zdXBlci5maWVsZAogKgkgIAlvICByZW9yZGVyZWQgc29tZSBhbHRlcm5hdGl2ZXMgdG8gbWFrZSB0aGluZ3MgbW9yZSBlZmZpY2llbnQKICoJCW8gIGxvbmcgYW5kIGRvdWJsZSBjb25zdGFudHMgd2VyZSBub3QgZGlmZmVyZW50aWF0ZWQgZnJvbSBpbnQvZmxvYXQKICoJCW8gIHdoaXRlc3BhY2UgcnVsZSB3YXMgaW5lZmZpY2llbnQ6IG1hdGNoZWQgb25seSBvbmUgY2hhcgogKgkJbyAgYWRkIGFuIGV4YW1wbGVzIGRpcmVjdG9yeSB3aXRoIHNvbWUgbmFzdHkgMS4zIGNhc2VzCiAqCQlvICBtYWRlIE1haW4uamF2YSB1c2UgYnVmZmVyZWQgSU8gYW5kIGEgUmVhZGVyIGZvciBVbmljb2RlIHN1cHBvcnQKICoJCW8gIHN1cHBvcnRzIFVOSUNPREU/CiAqCQkgICBVc2luZyBVbmljb2RlIGNoYXJWb2NhYnVsYXkgbWFrZXMgY29kZSBmaWxlIGJpZywgYnV0IG9ubHkKICoJCSAgIGluIHRoZSBiaXRzZXRzIGF0IHRoZSBlbmQuIEkgbmVlZCB0byBtYWtlIEFOVExSIGdlbmVyYXRlCiAqCQkgICB1bmljb2RlIGJpdHNldHMgbW9yZSBlZmZpY2llbnRseS4KICogVmVyc2lvbiAxLjE5IChBcHJpbCAyNSwgMjAwMikKICoJCVRlcmVuY2UgYWRkZWQgaW4gbmljZSBmaXhlcyBieSBKb2huIFB5YnVzIGNvbmNlcm5pbmcgZmxvYXRpbmcKICoJCWNvbnN0YW50cyBhbmQgcHJvYmxlbXMgd2l0aCBzdXBlcigpIGNhbGxzLiAgSm9obiBkaWQgYSBuaWNlCiAqCQlyZW9yZyBvZiB0aGUgcHJpbWFyeS9wb3N0Zml4IGV4cHJlc3Npb24gc3R1ZmYgdG8gcmVhZCBiZXR0ZXIKICoJCWFuZCBtYWtlcyBmLmcuc3VwZXIoKSBwYXJzZSBwcm9wZXJseSAoaXQgd2FzIE1FVEhPRF9DQUxMIG5vdAogKgkJYSBTVVBFUl9DVE9SX0NBTEwpLiAgQWxzbzoKICoKICoJCW8gICJmaW5hbGx5IiBjbGF1c2Ugd2FzIGEgcm9vdC4uLm1hZGUgaXQgYSBjaGlsZCBvZiAidHJ5IgogKgkJbyAgQWRkZWQgc3R1ZmYgZm9yIGFzc2VydHMgdG9vIGZvciBKYXZhIDEuNCwgYnV0ICpjb21tZW50ZWQgb3V0KgogKgkJICAgYXMgaXQgaXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUuCiAqCiAqIFZlcnNpb24gMS4yMCAoT2N0b2JlciAyNywgMjAwMikKICoKICoJICBUZXJlbmNlIGVuZGVkIHVwIHJlb3JnaW5nIEpvaG4gUHlidXMnIHN0dWZmIHRvCiAqCSAgcmVtb3ZlIHNvbWUgbm9uZGV0ZXJtaW5pc21zIGFuZCBzb21lIHN5bnRhY3RpYyBwcmVkaWNhdGVzLgogKgkgIE5vdGUgdGhhdCB0aGUgZ3JhbW1hciBpcyBzdHJpY3RlciBub3c7IGUuZy4sIHRoaXMoLi4uKSBtdXN0CiAqCWJlIHRoZSBmaXJzdCBzdGF0ZW1lbnQuCiAqCiAqCSAgVHJpbmFyeSA/OiBvcGVyYXRvciB3YXNuJ3Qgd29ya2luZyBhcyBhcnJheSBuYW1lOgogKgkJICAoaXNCaWcgPyBiaWdEaWdpdHMgOiBkaWdpdHMpW2ldOwogKgogKgkgIENoZWNrZWQgcGFyc2VyL3RyZWUgcGFyc2VyIG9uIHNvdXJjZSBmb3IKICoJCSAgUmVzaW4tMi4wLjUsIGppdmUtMi4xLjEsIGpkayAxLjMuMSwgTHVjZW5lLCBhbnRsciAyLjcuMmE0LAogKgkJYW5kIHRoZSAxMTBrLWxpbmUgakd1cnUgc2VydmVyIHNvdXJjZS4KICoKICogVmVyc2lvbiAxLjIxIChPY3RvYmVyIDE3LCAyMDAzKQogKiAgRml4ZWQgbG90cyBvZiBwcm9ibGVtcyBpbmNsdWRpbmc6CiAqICBSYXkgV2FsZGluOiBhZGQgdHlwZURlZmluaXRpb24gdG8gaW50ZXJmYWNlQmxvY2sgaW4gamF2YS50cmVlLmcKICogIEhlIGZvdW5kIGEgcHJvYmxlbS9maXggd2l0aCBmbG9hdGluZyBwb2ludCB0aGF0IHN0YXJ0IHdpdGggMAogKiAgUmF5IGFsc28gZml4ZWQgcHJvYmxlbSB0aGF0IChpbnQuY2xhc3MpIHdhcyBub3QgcmVjb2duaXplZC4KICogIFRob3JzdGVuIHZhbiBFbGxlbiBub3RpY2VkIHRoYXQgXG4gYXJlIGFsbG93ZWQgaW5jb3JyZWN0bHkgaW4gc3RyaW5ncy4KICogIFRKUCBmaXhlZCBDSEFSX0xJVEVSQUwgYW5hbG9nb3VzbHkuCiAqCiAqIFZlcnNpb24gMS4yMS4yIChNYXJjaCwgMjAwMykKICoJICBDaGFuZ2VzIGJ5IE1hdHQgUXVhaWwgdG8gc3VwcG9ydCBnZW5lcmljcyAoYXMgcGVyIEpESzEuNS9KU1IxNCkKICoJICBOb3RlczoKICoJICBvIFdlIG9ubHkgYWxsb3cgdGhlICJleHRlbmRzIiBrZXl3b3JkIGFuZCBub3QgdGhlICJpbXBsZW1lbnRzIgogKgkJa2V5d29yZCwgc2luY2UgdGhhdHMgd2hhdCBKU1IxNCBzZWVtcyB0byBpbXBseS4KICoJICBvIFRoYW5rcyB0byBNb250eSBadWtvd3NraSBmb3IgaGlzIGhlbHAgb24gdGhlIGFudGxyLWludGVyZXN0CiAqCQltYWlsIGxpc3QuCiAqCSAgbyBUaGFua3MgdG8gQWxhbiBFbGlhc2VuIGZvciB0ZXN0aW5nIHRoZSBncmFtbWFyIG92ZXIgaGlzCiAqCQlGaW5rIHNvdXJjZSBiYXNlCiAqCiAqIFZlcnNpb24gMS4yMiAoSnVseSwgMjAwNCkKICoJICBDaGFuZ2VzIGJ5IE1pY2hhZWwgU3R1ZG1hbiB0byBzdXBwb3J0IEphdmEgMS41IGxhbmd1YWdlIGV4dGVuc2lvbnMKICoJICBOb3RlczoKICoJICBvIEFkZGVkIHN1cHBvcnQgZm9yIGFubm90YXRpb25zIHR5cGVzCiAqCSAgbyBGaW5pc2hlZCBvZmYgTWF0dCBRdWFpbCdzIGdlbmVyaWNzIGVuaGFuY2VtZW50cyB0byBzdXBwb3J0IGJvdW5kIHR5cGUgYXJndW1lbnRzCiAqCSAgbyBBZGRlZCBzdXBwb3J0IGZvciBuZXcgZm9yIHN0YXRlbWVudCBzeW50YXgKICoJICBvIEFkZGVkIHN1cHBvcnQgZm9yIHN0YXRpYyBpbXBvcnQgc3ludGF4CiAqCSAgbyBBZGRlZCBzdXBwb3J0IGZvciBlbnVtIHR5cGVzCiAqCSAgbyBUZXN0ZWQgYWdhaW5zdCBKREsgMS41IHNvdXJjZSBiYXNlIGFuZCBzb3VyY2UgYmFzZSBvZiBqZGlncmFwaCBwcm9qZWN0CiAqCSAgbyBUaGFua3MgdG8gTWF0dCBRdWFpbCBmb3IgZG9pbmcgdGhlIGhhcmQgcGFydCBieSBkb2luZyBtb3N0IG9mIHRoZSBnZW5lcmljcyB3b3JrCiAqCiAqIFZlcnNpb24gMS4yMi4xIChKdWx5IDI4LCAyMDA0KQogKgkgIEJ1Zy9vbWlzc2lvbiBmaXhlcyBmb3IgSmF2YSAxLjUgbGFuZ3VhZ2Ugc3VwcG9ydAogKgkgIG8gRml4ZWQgdHJlZSBzdHJ1Y3R1cmUgYnVnIHdpdGggY2xhc3NPckludGVyZmFjZSAtIHRoYW5rcyB0byBQaWV0ZXIgVmFuZ29ycHRvIGZvcgogKgkJc3BvdHRpbmcgdGhpcwogKgkgIG8gRml4ZWQgYnVnIHdoZXJlIGluY29ycmVjdCBoYW5kbGluZyBvZiBTUiBhbmQgQlNSIHRva2VucyB3b3VsZCBjYXVzZSB0eXBlCiAqCQlwYXJhbWV0ZXJzIHRvIGJlIHJlY29nbmlzZWQgYXMgdHlwZSBhcmd1bWVudHMuCiAqCSAgbyBFbmFibGVkIHR5cGUgcGFyYW1ldGVycyBvbiBjb25zdHJ1Y3RvcnMsIGFubm90YXRpb25zIG9uIGVudW0gY29uc3RhbnRzCiAqCQlhbmQgcGFja2FnZSBkZWZpbml0aW9ucwogKgkgIG8gRml4ZWQgcHJvYmxlbXMgd2hlbiBwYXJzaW5nIGlmICgoY2hhci5jbGFzcy5lcXVhbHMoYykpKSB7fSAtIHNvbHV0aW9uIGJ5IE1hdHQgUXVhaWwgYXQgQ2VucXVhCiAqCiAqIFZlcnNpb24gMS4yMi4yIChKdWx5IDI4LCAyMDA0KQogKgkgIFNsaWdodCByZWZhY3RvcmluZyBvZiBKYXZhIDEuNSBsYW5ndWFnZSBzdXBwb3J0CiAqCSAgbyBSZWZhY3RvcmVkIGZvci8iZm9yZWFjaCIgcHJvZHVjdGlvbnMgc28gdGhhdCBvcmlnaW5hbCBsaXRlcmFsICJmb3IiIGxpdGVyYWwKICoJICAgIGlzIHN0aWxsIHVzZWQgYnV0IHRoZSBmb3Igc3ViLWNsYXVzZXMgdmFyeSBieSB0b2tlbiB0eXBlCiAqCSAgbyBGaXhlZCBidWcgd2hlcmUgdHlwZSBwYXJhbWV0ZXIgd2FzIG5vdCBpbmNsdWRlZCBpbiBnZW5lcmljIGNvbnN0cnVjdG9yJ3MgYnJhbmNoIG9mIEFTVAogKgogKiBWZXJzaW9uIDEuMjIuMyAoQXVndXN0IDI2LCAyMDA0KQogKgkgIEJ1ZyBmaXhlcyBhcyBpZGVudGlmaWVkIGJ5IE1pY2hhZWwgU3RhaGw7IGNsZWFuIHVwIG9mIHRhYnMvc3BhY2VzCiAqICAgICAgICBhbmQgb3RoZXIgcmVmYWN0b3JpbmdzCiAqCSAgbyBGaXhlZCB0eXBlUGFyYW1ldGVycyBvbWlzc2lvbiBpbiBpZGVudFByaW1hcnkgYW5kIG5ld1N0YXRlbWVudAogKgkgIG8gUmVwbGFjZWQgR1QgcmVjb25jaWxsaWF0aW9uIGNvZGUgd2l0aCBzaW1wbGUgc2VtYW50aWMgcHJlZGljYXRlCiAqCSAgbyBBZGFwdGVkIGVudW0vYXNzZXJ0IGtleXdvcmQgY2hlY2tpbmcgc3VwcG9ydCBmcm9tIE1pY2hhZWwgU3RhaGwncyBqYXZhMTUgZ3JhbW1hcgogKgkgIG8gUmVmYWN0b3JlZCB0eXBlRGVmaW5pdGlvbiBwcm9kdWN0aW9uIGFuZCBmaWVsZCBwcm9kdWN0aW9ucyB0byByZWR1Y2UgZHVwbGljYXRpb24KICoKICogVmVyc2lvbiAxLjIyLjQgKE9jdG9iZXIgMjEsIDIwMDQpCiAqICAgIFNtYWxsIGJ1eCBmaXhlcwogKiAgICBvIEFkZGVkIHR5cGVBcmd1bWVudHMgdG8gZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24sIGUuZy4gbmV3IDxTdHJpbmc+TXlQYXJhbWV0ZXJpc2VkKCkKICogICAgbyBBZGRlZCB0eXBlQXJndW1lbnRzIHRvIHBvc3RmaXhFeHByZXNzaW9uIHByb2R1Y3Rpb25zIGZvciBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgc3VwZXIKICogICAgICBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLCBlLmcuIG5ldyBPdXRlcigpLjxTdHJpbmc+c3VwZXIoKQogKiAgICBvIEZpeGVkIGJ1ZyBpbiBhcnJheSBkZWNsYXJhdGlvbnMgaWRlbnRpZmllZCBieSBHZW9mZiBSb3kKICoKICogVmVyc2lvbiAxLjIyLjQuZy4xCiAqICAgIG8gSSBoYXZlIHRha2VuIGphdmEuZyBmb3IgSmF2YTEuNSBmcm9tIE1pY2hhZWwgU3R1ZG1hbiAoMS4yMi40KQogKiAgICAgIGFuZCBoYXZlIGFwcGxpZWQgdGhlIGdyb292eS5kaWZmIGZyb20gamF2YS5nICgxLjIyKSBieSBKb2huIFJvc2UKICogICAgICBiYWNrIG9udG8gdGhlIG5ldyByb290ICgxLjIyLjQpIC0gSmVyZW15IFJheW5lciAoSmFuIDIwMDUpCiAqICAgIG8gZm9yIGEgbWFwIG9mIHRoZSB0YXNrIHNlZS4uLiAKICogICAgICBodHRwOi8vZ3Jvb3Z5LmphdmFuaWN1cy5jb20vamF2YS1nLnBuZwogKgogKiBUaGlzIGdyYW1tYXIgaXMgaW4gdGhlIFBVQkxJQyBET01BSU4KICovCgpjbGFzcyBHcm9vdnlSZWNvZ25pemVyIGV4dGVuZHMgUGFyc2VyOwpvcHRpb25zIHsKCWsgPSAzOwkJCQkJCQkvLyB0aHJlZSB0b2tlbiBsb29rYWhlYWQKCWV4cG9ydFZvY2FiPUdyb292eTsJCQkJLy8gQ2FsbCBpdHMgdm9jYWJ1bGFyeSAiR3Jvb3Z5IgoJY29kZUdlbk1ha2VTd2l0Y2hUaHJlc2hvbGQgPSAyOwkvLyBTb21lIG9wdGltaXphdGlvbnMKCWNvZGVHZW5CaXRzZXRUZXN0VGhyZXNob2xkID0gMzsKCWRlZmF1bHRFcnJvckhhbmRsZXIgPSBmYWxzZTsJLy8gRG9uJ3QgZ2VuZXJhdGUgcGFyc2VyIGVycm9yIGhhbmRsZXJzCglidWlsZEFTVCA9IHRydWU7Cn0KCnRva2VucyB7CglCTE9DSzsgTU9ESUZJRVJTOyBPQkpCTE9DSzsgU0xJU1Q7IE1FVEhPRF9ERUY7IFZBUklBQkxFX0RFRjsKCUlOU1RBTkNFX0lOSVQ7IFNUQVRJQ19JTklUOyBUWVBFOyBDTEFTU19ERUY7IElOVEVSRkFDRV9ERUY7CglQQUNLQUdFX0RFRjsgRVhURU5EU19DTEFVU0U7IElNUExFTUVOVFNfQ0xBVVNFOwoJUEFSQU1FVEVSUzsgUEFSQU1FVEVSX0RFRjsgTEFCRUxFRF9TVEFUOyBUWVBFQ0FTVDsgSU5ERVhfT1A7CglQT1NUX0lOQzsgUE9TVF9ERUM7IE1FVEhPRF9DQUxMOyBFWFBSOwoJSU1QT1JUOyBVTkFSWV9NSU5VUzsgVU5BUllfUExVUzsgQ0FTRV9HUk9VUDsgRUxJU1Q7IEZPUl9JTklUOyBGT1JfQ09ORElUSU9OOwoJRk9SX0lURVJBVE9SOyBFTVBUWV9TVEFUOyBGSU5BTD0iZmluYWwiOyBBQlNUUkFDVD0iYWJzdHJhY3QiOwpVTlVTRURfR09UTz0iZ290byI7IFVOVVNFRF9DT05TVD0iY29uc3QiOyBVTlVTRURfRE89ImRvIjsKCVNUUklDVEZQPSJzdHJpY3RmcCI7IFNVUEVSX0NUT1JfQ0FMTDsgQ1RPUl9DQUxMOyBDVE9SX0lERU5UOyBWQVJJQUJMRV9QQVJBTUVURVJfREVGOwpTVFJJTkdfQ09OU1RSVUNUT1I7IFNUUklOR19DVE9SX01JRERMRTsKQ0xPU0VEX0JMT0NLOyBJTVBMSUNJVF9QQVJBTUVURVJTOyBERUY9ImRlZiI7ClNFTEVDVF9TTE9UOyBSRUZMRUNUX01FTUJFUjsgRFlOQU1JQ19NRU1CRVI7CkxBQkVMRURfQVJHOyBTUFJFQURfQVJHOyBPUFRJT05BTF9BUkc7IFNDT1BFX0VTQ0FQRTsKTElTVF9DT05TVFJVQ1RPUjsgTUFQX0NPTlNUUlVDVE9SOwpGT1JfSU5fSVRFUkFCTEU7IFJBTkdFX0VYQ0xVU0lWRTsKCVNUQVRJQ19JTVBPUlQ7IEVOVU1fREVGOyBFTlVNX0NPTlNUQU5UX0RFRjsgRk9SX0VBQ0hfQ0xBVVNFOyBBTk5PVEFUSU9OX0RFRjsgQU5OT1RBVElPTlM7CglBTk5PVEFUSU9OOyBBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSOyBBTk5PVEFUSU9OX0ZJRUxEX0RFRjsgQU5OT1RBVElPTl9BUlJBWV9JTklUOwoJVFlQRV9BUkdVTUVOVFM7IFRZUEVfQVJHVU1FTlQ7IFRZUEVfUEFSQU1FVEVSUzsgVFlQRV9QQVJBTUVURVI7IFdJTERDQVJEX1RZUEU7CglUWVBFX1VQUEVSX0JPVU5EUzsgVFlQRV9MT1dFUl9CT1VORFM7Cn0KCnsKCS8qKiBUaGlzIGZhY3RvcnkgaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIHdpcmUgdG9nZXRoZXIgYSBHcm9vdnkgcGFyc2VyIGFuZCBsZXhlci4gKi8KCXB1YmxpYyBzdGF0aWMgR3Jvb3Z5UmVjb2duaXplciBtYWtlKEdyb292eUxleGVyIGxleGVyKSB7CgkJR3Jvb3Z5UmVjb2duaXplciBwYXJzZXIgPSBuZXcgR3Jvb3Z5UmVjb2duaXplcihsZXhlci5wbHVtYigpKTsKCQkvLyBUTyBETzogc2V0IHVwIGEgY29tbW9uIGVycm9yLWhhbmRsaW5nIGNvbnRyb2wgYmxvY2ssIHRvIGF2b2lkIGV4Y2Vzc2l2ZSB0YW5nbGUgYmV0d2VlbiB0aGVzZSBndXlzCgkJcGFyc2VyLmxleGVyID0gbGV4ZXI7CgkJbGV4ZXIucGFyc2VyID0gcGFyc2VyOwoJCXJldHVybiBwYXJzZXI7Cgl9CgkvLyBDcmVhdGUgYSBzY2FubmVyIHRoYXQgcmVhZHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHBhc3NlZCB0byB1cy4uLgoJcHVibGljIHN0YXRpYyBHcm9vdnlSZWNvZ25pemVyIG1ha2UoSW5wdXRTdHJlYW0gaW4pIHsgcmV0dXJuIG1ha2UobmV3IEdyb292eUxleGVyKGluKSk7IH0KCXB1YmxpYyBzdGF0aWMgR3Jvb3Z5UmVjb2duaXplciBtYWtlKFJlYWRlciBpbikgeyByZXR1cm4gbWFrZShuZXcgR3Jvb3Z5TGV4ZXIoaW4pKTsgfQoJcHVibGljIHN0YXRpYyBHcm9vdnlSZWNvZ25pemVyIG1ha2UoSW5wdXRCdWZmZXIgaW4pIHsgcmV0dXJuIG1ha2UobmV3IEdyb292eUxleGVyKGluKSk7IH0KCXB1YmxpYyBzdGF0aWMgR3Jvb3Z5UmVjb2duaXplciBtYWtlKExleGVyU2hhcmVkSW5wdXRTdGF0ZSBpbikgeyByZXR1cm4gbWFrZShuZXcgR3Jvb3Z5TGV4ZXIoaW4pKTsgfQoKCUdyb292eUxleGVyIGxleGVyOwoJcHVibGljIEdyb292eUxleGVyIGdldExleGVyKCkgeyByZXR1cm4gbGV4ZXI7IH0KCXB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmKSB7IHN1cGVyLnNldEZpbGVuYW1lKGYpOyBsZXhlci5zZXRGaWxlbmFtZShmKTsgfQoKCS8vIHN0dWZmIHRvIGFkanVzdCBBTlRMUidzIHRyYWNpbmcgbWFjaGluZXJ5CiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHJhY2luZyA9IGZhbHNlOyAgLy8gb25seSBlZmZlY3RpdmUgaWYgYW50bHIuVG9vbCBpcyBydW4gd2l0aCAtdHJhY2VQYXJzZXIKICAgIHB1YmxpYyB2b2lkIHRyYWNlSW4oU3RyaW5nIHJuYW1lKSB0aHJvd3MgVG9rZW5TdHJlYW1FeGNlcHRpb24gewogICAgICAgIGlmICghR3Jvb3Z5UmVjb2duaXplci50cmFjaW5nKSAgcmV0dXJuOwogICAgICAgIHN1cGVyLnRyYWNlSW4ocm5hbWUpOwogICAgfQogICAgcHVibGljIHZvaWQgdHJhY2VPdXQoU3RyaW5nIHJuYW1lKSB0aHJvd3MgVG9rZW5TdHJlYW1FeGNlcHRpb24gewogICAgICAgIGlmICghR3Jvb3Z5UmVjb2duaXplci50cmFjaW5nKSAgcmV0dXJuOwogICAgICAgIGlmIChyZXR1cm5BU1QgIT0gbnVsbCkgIHJuYW1lICs9IHJldHVybkFTVC50b1N0cmluZ0xpc3QoKTsKICAgICAgICBzdXBlci50cmFjZU91dChybmFtZSk7CiAgICB9CgkKCS8vIEVycm9yIGhhbmRsaW5nLiAgVGhpcyBpcyBhIGZ1bm5lbCB0aHJvdWdoIHdoaWNoIHBhcnNlciBlcnJvcnMgZ28sIHdoZW4gdGhlIHBhcnNlciBjYW4gc3VnZ2VzdCBhIHNvbHV0aW9uLgoJcHVibGljIHZvaWQgcmVxdWlyZUZhaWxlZChTdHJpbmcgcHJvYmxlbSwgU3RyaW5nIHNvbHV0aW9uKSB0aHJvd3MgU2VtYW50aWNFeGNlcHRpb24gewoJCS8vIFRPIERPOiBOZWVkcyBtb3JlIHdvcmsuCgkJVG9rZW4gbHQgPSBudWxsOwoJCXRyeSB7IGx0ID0gTFQoMSk7IH0KCQljYXRjaCAoVG9rZW5TdHJlYW1FeGNlcHRpb24gZWUpIHsgfQoJCWlmIChsdCA9PSBudWxsKSAgbHQgPSBUb2tlbi5iYWRUb2tlbjsKCQl0aHJvdyBuZXcgU2VtYW50aWNFeGNlcHRpb24ocHJvYmxlbSArICI7XG4gICBzb2x1dGlvbjogIiArIHNvbHV0aW9uLAoJCQkJCQkJCQlnZXRGaWxlbmFtZSgpLCBsdC5nZXRMaW5lKCksIGx0LmdldENvbHVtbigpKTsKCX0KCS8vIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgb2YgZXhwZWN0ZWQgZXJyb3Igc3luZHJvbWVzLgoJcHJpdmF0ZSB2b2lkIHJlcXVpcmUoYm9vbGVhbiB6LCBTdHJpbmcgcHJvYmxlbSwgU3RyaW5nIHNvbHV0aW9uKSB0aHJvd3MgU2VtYW50aWNFeGNlcHRpb24gewoJCWlmICgheikgIHJlcXVpcmVGYWlsZWQocHJvYmxlbSwgc29sdXRpb24pOwoJfQoKCS8vIFF1ZXJ5IGEgbmFtZSB0b2tlbiB0byBzZWUgaWYgaXQgYmVnaW5zIHdpdGggYSBjYXBpdGFsIGxldHRlci4KCS8vIFRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlICh3L28gc3ltYm9sIHRhYmxlIGFjY2VzcykgYmV0d2VlbiB7U3RyaW5nIHh9IGFuZCB7cHJpbnRsbiB4fS4KCXByaXZhdGUgYm9vbGVhbiBpc1VwcGVyQ2FzZShUb2tlbiB4KSB7CgkJaWYgKHggPT0gbnVsbCB8fCB4LmdldFR5cGUoKSAhPSBJREVOVCkgIHJldHVybiBmYWxzZTsgIC8vIGNhbm5vdCBoYXBwZW4/CgkJU3RyaW5nIHh0ZXh0ID0geC5nZXRUZXh0KCk7CgkJcmV0dXJuICh4dGV4dC5sZW5ndGgoKSA+IDAgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHh0ZXh0LmNoYXJBdCgwKSkpOwoJfQoKCXByaXZhdGUgQVNUIGN1cnJlbnRDbGFzcyA9IG51bGw7ICAvLyBjdXJyZW50IGVuY2xvc2luZyBjbGFzcyAoZm9yIGNvbnN0cnVjdG9yIHJlY29nbml0aW9uKQoJLy8gUXVlcnkgYSBuYW1lIHRva2VuIHRvIHNlZSBpZiBpdCBpcyBpZGVudGljYWwgd2l0aCB0aGUgY3VycmVudCBjbGFzcyBuYW1lLgoJLy8gVGhpcyBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGNvbnN0cnVjdG9ycyBmcm9tIG90aGVyIG1ldGhvZHMuCglwcml2YXRlIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcklkZW50KFRva2VuIHgpIHsKCQlpZiAoY3VycmVudENsYXNzID09IG51bGwpICByZXR1cm4gZmFsc2U7CgkJaWYgKGN1cnJlbnRDbGFzcy5nZXRUeXBlKCkgIT0gSURFTlQpICByZXR1cm4gZmFsc2U7ICAvLyBjYW5ub3QgaGFwcGVuPwoJCVN0cmluZyBjbmFtZSA9IGN1cnJlbnRDbGFzcy5nZXRUZXh0KCk7CgoJCWlmICh4ID09IG51bGwgfHwgeC5nZXRUeXBlKCkgIT0gSURFTlQpICByZXR1cm4gZmFsc2U7ICAvLyBjYW5ub3QgaGFwcGVuPwoJCXJldHVybiBjbmFtZS5lcXVhbHMoeC5nZXRUZXh0KCkpOwoJfQoKCi8qKgoJICogQ291bnRzIHRoZSBudW1iZXIgb2YgTFQgc2VlbiBpbiB0aGUgdHlwZUFyZ3VtZW50cyBwcm9kdWN0aW9uLgoJICogSXQgaXMgdXNlZCBpbiBzZW1hbnRpYyBwcmVkaWNhdGVzIHRvIGVuc3VyZSB3ZSBoYXZlIHNlZW4KCSAqIGVub3VnaCBjbG9zaW5nICc+JyBjaGFyYWN0ZXJzOyB3aGljaCBhY3R1YWxseSBtYXkgaGF2ZSBiZWVuCgkgKiBlaXRoZXIgR1QsIFNSIG9yIEJTUiB0b2tlbnMuCgkgKi8KCXByaXZhdGUgaW50IGx0Q291bnRlciA9IDA7Cn0KCi8vIENvbXBpbGF0aW9uIFVuaXQ6IEluIEdyb292eSwgdGhpcyBpcyBhIHNpbmdsZSBmaWxlIG9yIHNjcmlwdC4gVGhpcyBpcyB0aGUgc3RhcnQKLy8gcnVsZSBmb3IgdGhpcyBwYXJzZXIKY29tcGlsYXRpb25Vbml0Cgk6CS8vIEEgY29tcGlsYXRpb24gdW5pdCBzdGFydHMgd2l0aCBhbiBvcHRpb25hbCBwYWNrYWdlIGRlZmluaXRpb24KCQkoCShhbm5vdGF0aW9ucyAicGFja2FnZSIpPT4gcGFja2FnZURlZmluaXRpb24KICAgICAgICAgICAgICAgIC8vIFRoZSBtYWluIHBhcnQgb2YgdGhlIHNjcmlwdCBpcyBhIHNlcXVlbmNlIG9mIGFueSBudW1iZXIgb2Ygc3RhdGVtZW50cy4KICAgICAgICAgICAgICAgIC8vIFNlbWljb2xvbnMgYW5kL29yIHNpZ25pZmljYW50IG5ld2xpbmVzIHNlcnZlIGFzIHNlcGFyYXRvcnMuCiAgICAgICAgICAgICAgICAoIHNlcCEgKHN0YXRlbWVudCk/ICkqCiAgICAgICAgICAgICAgICBFT0YhCgkJfCAgIChzdGF0ZW1lbnQpPyAoIHNlcCEgKHN0YXRlbWVudCk/ICkqCiAgICAgICAgICAgIEVPRiEKCQkpCgoJCS8vIE5leHQgd2UgaGF2ZSBhIHNlcmllcyBvZiB6ZXJvIG9yIG1vcmUgaW1wb3J0IHN0YXRlbWVudHMKCQkvLyBUT0RPIFJFTU9WRSAoIGltcG9ydERlZmluaXRpb24gKSoKCgkJLy8gV3JhcHBpbmcgdGhpbmdzIHVwIHdpdGggYW55IG51bWJlciBvZiBjbGFzcyBvciBpbnRlcmZhY2UKCQkvLyBkZWZpbml0aW9ucwoJCS8vIFRPRE8gUkVNT1ZFICggdHlwZURlZmluaXRpb24gKSoKCgkJRU9GIQoJOwoKLyoqIEEgR3Jvb3Z5IHNjcmlwdCBvciBzaW1wbGUgZXhwcmVzc2lvbi4gIENhbiBiZSBhbnl0aGluZyBsZWdhbCBpbnNpZGUgey4uLn0uICovCnNuaXBwZXRVbml0CiAgICA6ICAgICAgIGJsb2NrQm9keQogICAgOwoKCi8vIFBhY2thZ2Ugc3RhdGVtZW50OiBvcHRpb25hbCBhbm5vdGF0aW9ucyBmb2xsb3dlZCBieSAicGFja2FnZSIgdGhlbiB0aGUgcGFja2FnZSBpZGVudGlmaWVyLgpwYWNrYWdlRGVmaW5pdGlvbgoJLy9UT0RPPyBvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9IC8vIGxldCBBTlRMUiBoYW5kbGUgZXJyb3JzCgk6CWFubm90YXRpb25zIHA6InBhY2thZ2UiXiB7I3Auc2V0VHlwZShQQUNLQUdFX0RFRik7fSBpZGVudGlmaWVyCgk7CgoKLy8gSW1wb3J0IHN0YXRlbWVudDogaW1wb3J0IGZvbGxvd2VkIGJ5IGEgcGFja2FnZSBvciBjbGFzcyBuYW1lCmltcG9ydFN0YXRlbWVudAoJLy9UT0RPPyBvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9Cgl7IGJvb2xlYW4gaXNTdGF0aWMgPSBmYWxzZTsgfQoJOglpOiJpbXBvcnQiXiB7I2kuc2V0VHlwZShJTVBPUlQpO30gKCAic3RhdGljIiEgeyNpLnNldFR5cGUoU1RBVElDX0lNUE9SVCk7fSApPyBpZGVudGlmaWVyU3RhcgoJOwoKLy8gVE9ETyBSRU1PVkUKLy8gQSB0eXBlIGRlZmluaXRpb24gaXMgZWl0aGVyIGEgY2xhc3MsIGludGVyZmFjZSwgZW51bSBvciBhbm5vdGF0aW9uIHdpdGggcG9zc2libGUgYWRkaXRpb25hbCBzZW1pcy4KLy90eXBlRGVmaW5pdGlvbgovLwlvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9Ci8vCToJbTptb2RpZmllcnMhCi8vCQl0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtXQovLwl8CVNFTUkhCi8vCTsKCi8vIEFkZGVkIHRoaXMgcHJvZHVjdGlvbiwgZXZlbiB0aG91Z2ggJ3R5cGVEZWZpbml0aW9uJyBzZWVtcyB0byBiZSBvYnNvbGV0ZSwKLy8gYXMgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IG1hbnkgb3RoZXIgcGFydHMgb2YgdGhlIGdyYW1tYXIuCi8vIFByb3RlY3RlZCB0eXBlIGRlZmluaXRpb25zIHByb2R1Y3Rpb24gZm9yIHJldXNlIGluIG90aGVyIHByb2R1Y3Rpb25zCnByb3RlY3RlZCB0eXBlRGVmaW5pdGlvbkludGVybmFsW0FTVCBtb2RzXQoJOgljZDpjbGFzc0RlZmluaXRpb25bI21vZHNdCQkvLyBpbm5lciBjbGFzcwoJICB7I3R5cGVEZWZpbml0aW9uSW50ZXJuYWwgPSAjY2Q7fQoJfAlpZDppbnRlcmZhY2VEZWZpbml0aW9uWyNtb2RzXQkvLyBpbm5lciBpbnRlcmZhY2UKCSAgeyN0eXBlRGVmaW5pdGlvbkludGVybmFsID0gI2lkO30KCXwJZWQ6ZW51bURlZmluaXRpb25bI21vZHNdCQkvLyBpbm5lciBlbnVtCgkgIHsjdHlwZURlZmluaXRpb25JbnRlcm5hbCA9ICNlZDt9Cgl8CWFkOmFubm90YXRpb25EZWZpbml0aW9uWyNtb2RzXQkvLyBpbm5lciBhbm5vdGF0aW9uCgkgIHsjdHlwZURlZmluaXRpb25JbnRlcm5hbCA9ICNhZDt9Cgk7CgovKiogQSBkZWNsYXJhdGlvbiBpcyB0aGUgY3JlYXRpb24gb2YgYSByZWZlcmVuY2Ugb3IgcHJpbWl0aXZlLXR5cGUgdmFyaWFibGUsCiAqICBvciAoaWYgYXJndW1lbnRzIGFyZSBwcmVzZW50KSBvZiBhIG1ldGhvZC4KICogIEdlbmVyaWNhbGx5LCB0aGlzIGlzIGNhbGxlZCBhICd2YXJpYWJsZScgZGVmaW5pdGlvbiwgZXZlbiBpbiB0aGUgY2FzZSBvZiBhIGNsYXNzIGZpZWxkIG9yIG1ldGhvZC4KICogIEl0IG1heSBzdGFydCB3aXRoIHRoZSBrZXl3b3JkICJkZWYiIGFuZC9vciBtb2RpZmllcnMuCiAqICBJdCBtYXkgYWxzbyBzdGFydCwgbW9yZSBzaW1wbHksIHdpdGggYSBjYXBpdGFsaXplZCB0eXBlIG5hbWUuCiAqICA8cD4KICogIEFTVCBlZmZlY3Q6IENyZWF0ZSBhIHNlcGFyYXRlIFR5cGUvVmFyIHRyZWUgZm9yIGVhY2ggdmFyIGluIHRoZSB2YXIgbGlzdC4KICogIE11c3QgYmUgZ3VhcmRlZCwgYXMgaW4gKGRlY2xhcmF0aW9uU3RhcnQpID0+IGRlY2xhcmF0aW9uLgogKi8KZGVjbGFyYXRpb24hCiAgICA6ICAgICAgIERFRiEgbmxzIQogICAgICAgIChtOm1vZGlmaWVycyk/ICh0OnR5cGVTcGVjW2ZhbHNlXSk/IHY6dmFyaWFibGVEZWZpbml0aW9uc1sjbSwjdF0KICAgICAgICB7I2RlY2xhcmF0aW9uID0gI3Y7fQogICAgfCAgIG0yOm1vZGlmaWVycyAgICh0Mjp0eXBlU3BlY1tmYWxzZV0pPyB2Mjp2YXJpYWJsZURlZmluaXRpb25zWyNtMiwjdDJdCiAgICAgICAgeyNkZWNsYXJhdGlvbiA9ICN2Mjt9CiAgICB8ICAgICAgIHQzOnR5cGVTcGVjW2ZhbHNlXSB2Mzp2YXJpYWJsZURlZmluaXRpb25zW251bGwsI3QzXQogICAgICAgIHsjZGVjbGFyYXRpb24gPSAjdjM7fQogICAgOwoKLyoqIEEgZGVjbGFyYXRpb24gd2l0aCBvbmUgZGVjbGFyYXRvciBhbmQgbm8gaW5pdGlhbGl6YXRpb24sIGxpa2UgYSBwYXJhbWV0ZXJEZWNsYXJhdGlvbi4gKi8KCi8qVE9ETyogWWVzLCBhbmQgd2UgbXVzdCBhbHNvIGF1ZGl0IHRoZSB2YXJpb3VzIG9jY3VycmVuY2VzIG9mIHdhcm5pbmcKc3VwcHJlc3Npb25zIGxpa2UgIm9wdGlvbnMgeyBncmVlZHkgPSB0cnVlOyB9Ii4KKi8KCnNpbmdsZURlY2xhcmF0aW9uTm9Jbml0IQogICAgOiAgICAgICBERUYhIG5scyEKICAgICAgICAobTptb2RpZmllcnMpPyAodDp0eXBlU3BlY1tmYWxzZV0pPyAgdjpzaW5nbGVWYXJpYWJsZVsjbSwjdF0KICAgICAgICB7I3NpbmdsZURlY2xhcmF0aW9uTm9Jbml0ID0gI3Y7fQogICAgfCAgIG0yOm1vZGlmaWVycyAgICh0Mjp0eXBlU3BlY1tmYWxzZV0pPyB2MjpzaW5nbGVWYXJpYWJsZVsjbTIsI3QyXQogICAgICAgIHsjc2luZ2xlRGVjbGFyYXRpb25Ob0luaXQgPSAjdjI7fQogICAgfCAgICAgICB0Mzp0eXBlU3BlY1tmYWxzZV0gdjM6c2luZ2xlVmFyaWFibGVbbnVsbCwjdDNdCiAgICAgICAgeyNzaW5nbGVEZWNsYXJhdGlvbk5vSW5pdCA9ICN2Mzt9CiAgICA7CgpzaW5nbGVEZWNsYXJhdGlvbgogICAgOiAgIHNkOnNpbmdsZURlY2xhcmF0aW9uTm9Jbml0IQogICAgICAgIHsgI3NpbmdsZURlY2xhcmF0aW9uID0gI3NkOyB9CiAgICAgICAgICAgICAgICB2YXJJbml0aWFsaXplcgogICAgOwoKLyoqIFVzZWQgb25seSBhcyBhIGxvb2thaGVhZCBwcmVkaWNhdGUsIGJlZm9yZSBkaXZpbmcgaW4gYW5kIHBhcnNpbmcgYSBkZWNsYXJhdGlvbi4KICogIEEgZGVjbGFyYXRpb24gY2FuIGJlIHVuYW1iaWd1b3VzbHkgaW50cm9kdWNlZCB3aXRoICJkZWYiIG9yIGEgbW9kaWZpZXIgdG9rZW4gbGlrZSAiZmluYWwiLgogKiAgSXQgbWF5IGFsc28gYmUgaW50cm9kdWNlZCBieSBhIHNpbXBsZSBpZGVudGlmaWVyIHdob3NlIGZpcnN0IGNoYXJhY3RlciBpcyBhbiB1cHBlcmNhc2UgbGV0dGVyLAogKiAgYXMgaW4ge1N0cmluZyB4fS4gIEEgZGVjbGFyYXRpb24gY2FuIGFsc28gYmUgaW50cm9kdWNlZCB3aXRoIGEgYnVpbHQgaW4gdHlwZSBsaWtlICdpbnQnIG9yICd2b2lkJy4KICogIEJyYWNrZXRzIChhcnJheSBhbmQgZ2VuZXJpYykgYXJlIGFsbG93ZWQsIGFzIGluIHtMaXN0W10geH0gb3Ige2ludFtdW10geX0uCiAqICBBbnl0aGluZyBlbHNlIGlzIHBhcnNlZCBhcyBhIHN0YXRlbWVudCBvZiBzb21lIHNvcnQgKGV4cHJlc3Npb24gb3IgY29tbWFuZCkuCiAqICA8cD4KICogIChJbiB0aGUgYWJzZW5jZSBvZiBleHBsaWNpdCBtZXRob2QtY2FsbCBwYXJlbnMsIHdlIGFzc3VtZSBhIGNhcGl0YWxpemVkIG5hbWUgaXMgYSB0eXBlIG5hbWUuCiAqICBZZXMsIHRoaXMgaXMgYSBsaXR0bGUgaGFja3kuICBBbHRlcm5hdGl2ZXMgYXJlIHRvIGNvbXBsaWNhdGUgdGhlIGRlY2xhcmF0aW9uIG9yIGNvbW1hbmQKICogIHN5bnRheGVzLCBvciB0byBoYXZlIHRoZSBwYXJzZXIgcXVlcnkgdGhlIHN5bWJvbCB0YWJsZS4gIFBhcnNlLXRpbWUgcXVlcmllcyBhcmUgZXZpbC4KICogIEFuZCB3ZSB3YW50IGJvdGgge1N0cmluZyB4fSBhbmQge3ByaW50bG4geH0uICBTbyB3ZSBuZWVkIGEgc3ludGFjdGljIHJhem9yLWVkZ2UgdG8gc2xpcAogKiAgYmV0d2VlbiAncHJpbnRsbicgYW5kICdTdHJpbmcnLikKICogIAogKiAgICpUT0RPKiBUaGUgZGVjbGFyYXRpb25TdGFydCBwcm9kdWN0aW9uIG5lZWRzIHRvIGJlIHN0cmVuZ3RoZW5lZCB0byByZWNvZ25pemUKICogIHRoaW5ncyBsaWtlIHtMaXN0PFN0cmluZz4gZm9vfS4KICogIFJpZ2h0IG5vdyBpdCBvbmx5IGtub3dzIGhvdyB0byBza2lwIHNxdWFyZSBicmFja2V0cyBhZnRlciB0aGUgdHlwZSwgbm90CiAqICBhbmdsZSBicmFja2V0cy4KICogIFRoaXMgcHJvYmFibHkgdHVybnMgb3V0IHRvIGJlIHRyaWNreSBiZWNhdXNlIG9mID4+IHZzLiA+ID4uIMpJZiBzbywKICogIGp1c3QgcHV0IGEgVE8gRE8gY29tbWVudCBpbi4KICogICAKICovCmRlY2xhcmF0aW9uU3RhcnQhCiAgICA6ICAgREVGCiAgICB8ICAgbW9kaWZpZXIhCiAgICB8ICAgKCAgIHVwcGVyQ2FzZUlkZW50IQogICAgICAgIHwgICBidWlsdEluVHlwZSEKICAgICAgICApIChMQlJBQ0sgYmFsYW5jZWRUb2tlbnMhIFJCUkFDSykqIChJREVOVCB8ICJpdCIpCiAgICA7CgovKiogVXNlZCBvbmx5IGFzIGEgbG9va2FoZWFkIHByZWRpY2F0ZSBmb3IgbmVzdGVkIHR5cGUgZGVjbGFyYXRpb25zLiAqLwoKLypUT0RPKiBUaGUgbG9va2FoZWFkIGluIHR5cGVEZWNsYXJhdGlvblN0YXJ0IG5lZWRzIHRvIHNraXAgYW5ub3RhdGlvbnMsIG5vdApqdXN0IHN0b3AgYXQgJ0AnLCBiZWNhdXNlIHZhcmlhYmxlIGFuZCBtZXRob2QgZGVjbGFyYXRpb25zIGNhbiBhbHNvIGJlCmFubm90YXRlZC4KPiB0eXBlRGVjbGFyYXRpb25TdGFydCEKPiDKIMogOiDKIChtb2RpZmllciEpKiAoImNsYXNzIiB8ICJpbnRlcmZhY2UiIHwgImVudW0iIHwgQVQgKQpTLkIuIHNvbWV0aGluZyBsaWtlCj4gyiDKIDogyiAobW9kaWZpZXIhIHwgYW5ub3RhdGlvblRva2VucyEpKiAoImNsYXNzIiB8ICJpbnRlcmZhY2UiIHwKPiAiZW51bSIgKQooQW5kIG1heWJlIEBpbnRlcmZhY2UsIGlmIEphdmEgNSBhbGxvd3MgbmVzdGVkIGFubm90YXRpb24gdHlwZXM/IMpEb24ndAprbm93IG9mZmhhbmQuKQpXaGVyZSBhbm5vdGF0aW9uVG9rZW5zIGNhbiBiZSBhIHF1aWNrIHBhcmVuLXNraXBwZXIsIGFzIGluIG90aGVyCnBsYWNlczogyidAJyBpZGVudCAnKCcgYmFsYW5jZWRUb2tlbnMgJyknLgoqLwoKdHlwZURlY2xhcmF0aW9uU3RhcnQhCiAgICA6ICAgKG1vZGlmaWVyISkqICgiY2xhc3MiIHwgImludGVyZmFjZSIgfCAiZW51bSIgfCBBVCApCiAgICA7CgovKiogQW4gSURFTlQgdG9rZW4gd2hvc2Ugc3BlbGxpbmcgaXMgcmVxdWlyZWQgdG8gc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLgogKiAgSW4gdGhlIGNhc2Ugb2YgYSBzaW1wbGUgc3RhdGVtZW50IHtVcHBlcklEIG5hbWV9IHRoZSBpZGVudGlmaWVyIGlzIHRha2VuIHRvIGJlIGEgdHlwZSBuYW1lLCBub3QgYSBjb21tYW5kIG5hbWUuCiAqLwp1cHBlckNhc2VJZGVudAogICAgOiAgIHtpc1VwcGVyQ2FzZShMVCgxKSl9PwogICAgICAgICAgICAgICAgSURFTlQKICAgIDsKCi8vIEEgdHlwZSBzcGVjaWZpY2F0aW9uIGlzIGEgdHlwZSBuYW1lIHdpdGggcG9zc2libGUgYnJhY2tldHMgYWZ0ZXJ3YXJkcwovLyAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KLy8gU2V0IGFkZEltYWdOb2RlIHRydWUgZm9yIHR5cGVzIGluc2lkZSBleHByZXNzaW9ucywgbm90IGRlY2xhcmF0aW9ucy4KdHlwZVNwZWNbYm9vbGVhbiBhZGRJbWFnTm9kZV0KCTogY2xhc3NUeXBlU3BlY1thZGRJbWFnTm9kZV0KCXwJYnVpbHRJblR5cGVTcGVjW2FkZEltYWdOb2RlXQoJOwoKLy9UT0RPIC0gVVJHRU5UIC0gY2hlY2sgdGhhdCAnYXJyYXlPclR5cGVBcmdzJyBpcyBvayBpbnN0ZWFkIG9mICdBUlJBWV9ERUNMQVJBVE9SJwovLyBhbHNvIGNoZWNrIHRoYXQgJ2NsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXScgaXMgYSBzdWl0YWJsZSBzdWJzdGl0dXRpb24gZm9yICdpZGVudGlmaWVyJwoKLy8gQSBjbGFzcyB0eXBlIHNwZWNpZmljYXRpb24gaXMgYSBjbGFzcyB0eXBlIHdpdGggZWl0aGVyOgovLyAtIHBvc3NpYmxlIGJyYWNrZXRzIGFmdGVyd2FyZHMKLy8gICAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KLy8gLSBnZW5lcmljIHR5cGUgYXJndW1lbnRzIGFmdGVyCmNsYXNzVHlwZVNwZWNbYm9vbGVhbiBhZGRJbWFnTm9kZV0KCToJdDpjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0KCQkoICAgYXRhOmFycmF5T3JUeXBlQXJnc1sjdF0gICk/CgkJewoJCQlpZiAoI2F0YSAhPSBudWxsKSAgI2NsYXNzVHlwZVNwZWMgPSAjYXRhOwoJCQlpZiAoIGFkZEltYWdOb2RlICkgewoJCQkJI2NsYXNzVHlwZVNwZWMgPSAjKCNbVFlQRSwiVFlQRSJdLCAjY2xhc3NUeXBlU3BlYyk7CgkJCX0KCQl9Cgk7CgovLyBBIG5vbi1idWlsdCBpbiB0eXBlIG5hbWUsIHdpdGggcG9zc2libGUgdHlwZSBwYXJhbWV0ZXJzCmNsYXNzT3JJbnRlcmZhY2VUeXBlW2Jvb2xlYW4gYWRkSW1hZ05vZGVdCgk6CUlERU5UXiAodHlwZUFyZ3VtZW50cyk/CgkJKG9wdGlvbnN7Z3JlZWR5PXRydWU7fTogLy8gbWF0Y2ggYXMgbWFueSBhcyBwb3NzaWJsZQoJCQlET1ReCgkJCUlERU5UICh0eXBlQXJndW1lbnRzKT8KCQkpKgoJCXsKCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKCQkJCSNjbGFzc09ySW50ZXJmYWNlVHlwZSA9ICMoI1tUWVBFLCJUWVBFIl0sICNjbGFzc09ySW50ZXJmYWNlVHlwZSk7CgkJCX0KCQl9Cgk7CgovLyBBIHNwZWNpYWxpc2VkIGZvcm0gb2YgdHlwZVNwZWMgd2hlcmUgYnVpbHQgaW4gdHlwZXMgbXVzdCBiZSBhcnJheXMKdHlwZUFyZ3VtZW50U3BlYwoJOgljbGFzc1R5cGVTcGVjW3RydWVdCgl8CWJ1aWx0SW5UeXBlQXJyYXlTcGVjW3RydWVdCgk7CgovLyBBIGdlbmVyaWMgdHlwZSBhcmd1bWVudCBpcyBhIGNsYXNzIHR5cGUsIGEgcG9zc2libHkgYm91bmRlZCB3aWxkY2FyZCB0eXBlIG9yIGEgYnVpbHQtaW4gdHlwZSBhcnJheQp0eXBlQXJndW1lbnQKCToJKAl0eXBlQXJndW1lbnRTcGVjCgkJfAl3aWxkY2FyZFR5cGUKCQkpCgkJeyN0eXBlQXJndW1lbnQgPSAjKCNbVFlQRV9BUkdVTUVOVCwiVFlQRV9BUkdVTUVOVCJdLCAjdHlwZUFyZ3VtZW50KTt9Cgk7CgovLyBXaWxkY2FyZCB0eXBlIGluZGljYXRpbmcgYWxsIHR5cGVzICh3aXRoIHBvc3NpYmxlIGNvbnN0cmFpbnQpCndpbGRjYXJkVHlwZQoJOglxOlFVRVNUSU9OXiB7I3Euc2V0VHlwZShXSUxEQ0FSRF9UWVBFKTt9CgkJKCgiZXh0ZW5kcyIgfCAic3VwZXIiKT0+IHR5cGVBcmd1bWVudEJvdW5kcyk/Cgk7CgovLyBUeXBlIGFyZ3VtZW50cyB0byBhIGNsYXNzIG9yIGludGVyZmFjZSB0eXBlCnR5cGVBcmd1bWVudHMKe2ludCBjdXJyZW50THRMZXZlbCA9IDA7fQoJOgoJCXtjdXJyZW50THRMZXZlbCA9IGx0Q291bnRlcjt9CgkJTFQhIHtsdENvdW50ZXIrKzt9CgkJdHlwZUFyZ3VtZW50CgkJKG9wdGlvbnN7Z3JlZWR5PXRydWU7fTogLy8gbWF0Y2ggYXMgbWFueSBhcyBwb3NzaWJsZQoJCQl7aW5wdXRTdGF0ZS5ndWVzc2luZyAhPTAgfHwgbHRDb3VudGVyID09IGN1cnJlbnRMdExldmVsICsgMX0/CgkJCUNPTU1BISB0eXBlQXJndW1lbnQKCQkpKgoKCQkoCS8vIHR1cm4gd2FybmluZyBvZmYgc2luY2UgQW50bHIgZ2VuZXJhdGVzIHRoZSByaWdodCBjb2RlLAoJCQkvLyBwbHVzIHdlIGhhdmUgb3VyIHNlbWFudGljIHByZWRpY2F0ZSBiZWxvdwoJCQlvcHRpb25ze2dlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTt9OgoJCQl0eXBlQXJndW1lbnRzT3JQYXJhbWV0ZXJzRW5kCgkJKT8KCgkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgZ29iYmxlZCB1cCBlbm91Z2ggJz4nIGNoYXJhY3RlcnMKCQkvLyBpZiB3ZSBhcmUgYXQgdGhlICJ0b3AgbGV2ZWwiIG9mIG5lc3RlZCB0eXBlQXJndW1lbnQgcHJvZHVjdGlvbnMKCQl7KGN1cnJlbnRMdExldmVsICE9IDApIHx8IGx0Q291bnRlciA9PSBjdXJyZW50THRMZXZlbH0/CgoJCXsjdHlwZUFyZ3VtZW50cyA9ICMoI1tUWVBFX0FSR1VNRU5UUywgIlRZUEVfQVJHVU1FTlRTIl0sICN0eXBlQXJndW1lbnRzKTt9Cgk7CgovLyB0aGlzIGdvYmJsZXMgdXAgKnNvbWUqIGFtb3VudCBvZiAnPicgY2hhcmFjdGVycywgYW5kIGNvdW50cyBob3cgbWFueQovLyBpdCBnb2JibGVkLgpwcm90ZWN0ZWQgdHlwZUFyZ3VtZW50c09yUGFyYW1ldGVyc0VuZAoJOglHVCEge2x0Q291bnRlci09MTt9Cgl8CVNSISB7bHRDb3VudGVyLT0yO30KCXwJQlNSISB7bHRDb3VudGVyLT0zO30KCTsKCi8vIFJlc3RyaWN0aW9uIG9uIHdpbGRjYXJkIHR5cGVzIGJhc2VkIG9uIHN1cGVyIGNsYXNzIG9yIGRlcnJpdmVkIGNsYXNzCnR5cGVBcmd1bWVudEJvdW5kcwoJe2Jvb2xlYW4gaXNVcHBlckJvdW5kcyA9IGZhbHNlO30KCToKCQkoICJleHRlbmRzIiEge2lzVXBwZXJCb3VuZHM9dHJ1ZTt9IHwgInN1cGVyIiEgKSBjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0KCQl7CgkJCWlmIChpc1VwcGVyQm91bmRzKQoJCQl7CgkJCQkjdHlwZUFyZ3VtZW50Qm91bmRzID0gIygjW1RZUEVfVVBQRVJfQk9VTkRTLCJUWVBFX1VQUEVSX0JPVU5EUyJdLCAjdHlwZUFyZ3VtZW50Qm91bmRzKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSN0eXBlQXJndW1lbnRCb3VuZHMgPSAjKCNbVFlQRV9MT1dFUl9CT1VORFMsIlRZUEVfTE9XRVJfQk9VTkRTIl0sICN0eXBlQXJndW1lbnRCb3VuZHMpOwoJCQl9CgkJfQoJOwoKLy9UT0RPIC0gY2hlY2sgdGhhdCBhcnJheU9yVHlwZUFyZ3MgaXMgc3VpdGFibGUgaGVyZQovLyBBIGJ1aWx0aW4gdHlwZSBhcnJheSBzcGVjaWZpY2F0aW9uIGlzIGEgYnVpbHRpbiB0eXBlIHdpdGggYnJhY2tldHMgYWZ0ZXJ3YXJkcwpidWlsdEluVHlwZUFycmF5U3BlY1tib29sZWFuIGFkZEltYWdOb2RlXQoJOgl0OmJ1aWx0SW5UeXBlCgkJKCAgIGF0YTphcnJheU9yVHlwZUFyZ3NbI3RdICApKwoJCXsKCQkJaWYgKCNhdGEgIT0gbnVsbCkgICNidWlsdEluVHlwZUFycmF5U3BlYyA9ICNhdGE7CgkJCWlmICggYWRkSW1hZ05vZGUgKSB7CgkJCQkjYnVpbHRJblR5cGVBcnJheVNwZWMgPSAjKCNbVFlQRSwiVFlQRSJdLCAjYnVpbHRJblR5cGVBcnJheVNwZWMpOwoJCQl9CgkJfQoJOwoKLy9UT0RPIC0gY2hlY2sgdGhhdCBhcnJheU9yVHlwZUFyZ3MgaXMgc3VpdGFibGUgaGVyZQovLyBBIGJ1aWx0aW4gdHlwZSBzcGVjaWZpY2F0aW9uIGlzIGEgYnVpbHRpbiB0eXBlIHdpdGggcG9zc2libGUgYnJhY2tldHMKLy8gYWZ0ZXJ3YXJkcyAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KYnVpbHRJblR5cGVTcGVjW2Jvb2xlYW4gYWRkSW1hZ05vZGVdCgk6CXQ6YnVpbHRJblR5cGUKCQkoICAgYXRhOmFycmF5T3JUeXBlQXJnc1sjdF0gICkqCgkJewoJCQlpZiAoI2F0YSAhPSBudWxsKSAgI2J1aWx0SW5UeXBlU3BlYyA9ICNhdGE7CgkJCWlmICggYWRkSW1hZ05vZGUgKSB7CgkJCQkjYnVpbHRJblR5cGVTcGVjID0gIygjW1RZUEUsIlRZUEUiXSwgI2J1aWx0SW5UeXBlU3BlYyk7CgkJCX0KCQl9Cgk7CgovLyBBIHR5cGUgbmFtZS4gd2hpY2ggaXMgZWl0aGVyIGEgKHBvc3NpYmx5IHF1YWxpZmllZCBhbmQgcGFyYW1ldGVyaXplZCkKLy8gY2xhc3MgbmFtZSBvciBhIHByaW1pdGl2ZSAoYnVpbHRpbikgdHlwZQp0eXBlCgk6CWNsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXQoJfAlidWlsdEluVHlwZQoJOwoKLy8gVGhlIHByaW1pdGl2ZSB0eXBlcy4KYnVpbHRJblR5cGUKCToJInZvaWQiCgl8CSJib29sZWFuIgoJfAkiYnl0ZSIKCXwJImNoYXIiCgl8CSJzaG9ydCIKCXwJImludCIKCXwJImZsb2F0IgoJfAkibG9uZyIKCXwJImRvdWJsZSIKICAgIHwgICAiYW55IgogICAgLy8gUFJPUE9TRTogIEFkZCAibGlzdCIsICJtYXAiLCAiY2xvc3VyZSI/PwoJOwoKLy8gQSAocG9zc2libHktcXVhbGlmaWVkKSBqYXZhIGlkZW50aWZpZXIuIFdlIHN0YXJ0IHdpdGggdGhlIGZpcnN0IElERU5UCi8vIGFuZCBleHBhbmQgaXRzIG5hbWUgYnkgYWRkaW5nIGRvdHMgYW5kIGZvbGxvd2luZyBJREVOVFMKaWRlbnRpZmllcgogICAgOiAgICAgICBJREVOVAogICAgICAgICggICBvcHRpb25zIHsgZ3JlZWR5ID0gdHJ1ZTsgfSA6CiAgICAgICAgICAgICAgICAgICAgICAgIERPVF4gbmxzISBJREVOVCApKgogICAgOwoKaWRlbnRpZmllclN0YXIKICAgIDogICAgICAgSURFTlQKICAgICAgICAoICAgb3B0aW9ucyB7IGdyZWVkeSA9IHRydWU7IH0gOgogICAgICAgICAgICAgICAgICAgICAgICBET1ReICBubHMhIElERU5UICkqCiAgICAgICAgKCAgIERPVF4gIG5scyEgU1RBUgogICAgICAgIHwgICAiYXMiXiBubHMhIElERU5UCiAgICAgICAgKT8KICAgIDsKCi8vIEEgbGlzdCBvZiB6ZXJvIG9yIG1vcmUgbW9kaWZpZXJzLiBXZSBjb3VsZCBoYXZlIHVzZWQgKG1vZGlmaWVyKSogaW4KLy8gcGxhY2Ugb2YgYSBjYWxsIHRvIG1vZGlmaWVycywgYnV0IEkgdGhvdWdodCBpdCB3YXMgYSBnb29kIGlkZWEgdG8ga2VlcAovLyB0aGlzIHJ1bGUgc2VwYXJhdGUgc28gdGhleSBjYW4gZWFzaWx5IGJlIGNvbGxlY3RlZCBpbiBhIFZlY3RvciBpZgovLyBzb21lb25lIHNvIGRlc2lyZXMKbW9kaWZpZXJzCgk6CgkJKAoJCQkvL2h1c2ggd2FybmluZ3Mgc2luY2UgdGhlIHNlbWFudGljIGNoZWNrIGZvciAiQGludGVyZmFjZSIgc29sdmVzIHRoZSBub24tZGV0ZXJtaW5pc20KCQkJb3B0aW9uc3tnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7fToKCgkJCW1vZGlmaWVyIG5scyEKCQkJfAoJCQkvL1NlbWFudGljIGNoZWNrIHRoYXQgd2UgYXJlbid0IG1hdGNoaW5nIEBpbnRlcmZhY2UgYXMgdGhpcyBpcyBub3QgYW4gYW5ub3RhdGlvbgoJCQkvL0EgbmljZXIgd2F5IHRvIGRvIHRoaXMgd291bGQgYmUgbmljZQoJCQl7TEEoMSk9PUFUICYmICFMVCgyKS5nZXRUZXh0KCkuZXF1YWxzKCJpbnRlcmZhY2UiKX0/IGFubm90YXRpb24gbmxzIQogICAgICAgICkrCgoJCXsjbW9kaWZpZXJzID0gIyhbTU9ESUZJRVJTLCAiTU9ESUZJRVJTIl0sICNtb2RpZmllcnMpO30KCTsKCi8vIG1vZGlmaWVycyBmb3IgSmF2YSBjbGFzc2VzLCBpbnRlcmZhY2VzLCBjbGFzcy9pbnN0YW5jZSB2YXJzIGFuZCBtZXRob2RzCm1vZGlmaWVyCgk6CSJwcml2YXRlIgoJfAkicHVibGljIgoJfAkicHJvdGVjdGVkIgoJfAkic3RhdGljIgoJfAkidHJhbnNpZW50IgoJfAkiZmluYWwiCgl8CSJhYnN0cmFjdCIKCXwJIm5hdGl2ZSIKCXwJInRocmVhZHNhZmUiCgl8CSJzeW5jaHJvbml6ZWQiCgl8CSJ2b2xhdGlsZSIKCXwJInN0cmljdGZwIgoJOwoKYW5ub3RhdGlvbiEKCToJQVQhIGk6aWRlbnRpZmllciAoIExQQVJFTiEgKCBhcmdzOmFubm90YXRpb25Bcmd1bWVudHMgKT8gUlBBUkVOISApPwoJCXsjYW5ub3RhdGlvbiA9ICMoI1tBTk5PVEFUSU9OLCJBTk5PVEFUSU9OIl0sIGksIGFyZ3MpO30KCTsKCmFubm90YXRpb25zCiAgICA6ICAgKGFubm90YXRpb24gbmxzISkqCgkJeyNhbm5vdGF0aW9ucyA9ICMoW0FOTk9UQVRJT05TLCAiQU5OT1RBVElPTlMiXSwgI2Fubm90YXRpb25zKTt9CiAgICA7Cgphbm5vdGF0aW9uQXJndW1lbnRzCgk6CWFubm90YXRpb25NZW1iZXJWYWx1ZUluaXRpYWxpemVyIHwgYW5udG90YXRpb25NZW1iZXJWYWx1ZVBhaXJzCgk7Cgphbm50b3RhdGlvbk1lbWJlclZhbHVlUGFpcnMKCToJYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpciAoIENPTU1BISBhbm5vdGF0aW9uTWVtYmVyVmFsdWVQYWlyICkqCgk7Cgphbm5vdGF0aW9uTWVtYmVyVmFsdWVQYWlyIQoJOglpOklERU5UIEFTU0lHTiEgdjphbm5vdGF0aW9uTWVtYmVyVmFsdWVJbml0aWFsaXplcgoJCXsjYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpciA9ICMoI1tBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSLCJBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSIl0sIGksIHYpO30KCTsKCmFubm90YXRpb25NZW1iZXJWYWx1ZUluaXRpYWxpemVyCgk6CgkJY29uZGl0aW9uYWxFeHByZXNzaW9uIHwgYW5ub3RhdGlvbiBubHMhfCBhbm5vdGF0aW9uTWVtYmVyQXJyYXlJbml0aWFsaXplcgoJOwoKLy8gVGhpcyBpcyBhbiBpbml0aWFsaXplciB1c2VkIHRvIHNldCB1cCBhbiBhbm5vdGF0aW9uIG1lbWJlciBhcnJheS4KYW5ub3RhdGlvbk1lbWJlckFycmF5SW5pdGlhbGl6ZXIKCToJbGM6TENVUkxZXiB7I2xjLnNldFR5cGUoQU5OT1RBVElPTl9BUlJBWV9JTklUKTt9CgkJCSgJYW5ub3RhdGlvbk1lbWJlckFycmF5VmFsdWVJbml0aWFsaXplcgoJCQkJKAoJCQkJCS8vIENPTkZMSUNUOiBkb2VzIGEgQ09NTUEgYWZ0ZXIgYW4gaW5pdGlhbGl6ZXIgc3RhcnQgYSBuZXcKCQkJCQkvLyBpbml0aWFsaXplciBvciBzdGFydCB0aGUgb3B0aW9uICcsJyBhdCBlbmQ/CgkJCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlIGJ5IG1hdGNoaW5nCgkJCQkJLy8gdGhlIGNvbW1hIGFzIHNvb24gYXMgcG9zc2libGUuCgkJCQkJb3B0aW9ucyB7CgkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKCQkJCQl9CgkJCQk6CgkJCQkJQ09NTUEhIGFubm90YXRpb25NZW1iZXJBcnJheVZhbHVlSW5pdGlhbGl6ZXIKCQkJCSkqCgkJCQkoQ09NTUEhKT8KCQkJKT8KCQlSQ1VSTFkhCgk7CgovLyBUaGUgdHdvIHRoaW5ncyB0aGF0IGNhbiBpbml0aWFsaXplIGFuIGFubm90YXRpb24gYXJyYXkgZWxlbWVudCBhcmUgYSBjb25kaXRpb25hbCBleHByZXNzaW9uCi8vIGFuZCBhbiBhbm5vdGF0aW9uIChuZXN0ZWQgYW5ub3RhdGlvbiBhcnJheSBpbml0aWFsaXNlcnMgYXJlIG5vdCB2YWxpZCkKYW5ub3RhdGlvbk1lbWJlckFycmF5VmFsdWVJbml0aWFsaXplcgoJOgljb25kaXRpb25hbEV4cHJlc3Npb24KCXwJYW5ub3RhdGlvbiBubHMhCgk7CgpzdXBlckNsYXNzQ2xhdXNlIQoJOgkoICJleHRlbmRzIiBjOmNsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXSApPwoJCXsjc3VwZXJDbGFzc0NsYXVzZSA9ICMoI1tFWFRFTkRTX0NMQVVTRSwiRVhURU5EU19DTEFVU0UiXSxjKTt9Cgk7CgovLyBEZWZpbml0aW9uIG9mIGEgSmF2YSBjbGFzcwpjbGFzc0RlZmluaXRpb24hW0FTVCBtb2RpZmllcnNdCiAgICAgICAgeyBBU1QgcHJldkN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzczsgfQoJOgkiY2xhc3MiIElERU5UIG5scyEKICAgICAgICB7IGN1cnJlbnRDbGFzcyA9ICNJREVOVDsgfQoJCS8vIGl0IF9taWdodF8gaGF2ZSB0eXBlIHBhcmFtYXRlcnMKCQkodHA6dHlwZVBhcmFtZXRlcnMpPwoJCS8vIGl0IF9taWdodF8gaGF2ZSBhIHN1cGVyY2xhc3MuLi4KCQlzYzpzdXBlckNsYXNzQ2xhdXNlCgkJLy8gaXQgbWlnaHQgaW1wbGVtZW50IHNvbWUgaW50ZXJmYWNlcy4uLgoJCWljOmltcGxlbWVudHNDbGF1c2UKCQkvLyBub3cgcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGNsYXNzCgkJY2I6Y2xhc3NCbG9jawoJCXsjY2xhc3NEZWZpbml0aW9uID0gIygjW0NMQVNTX0RFRiwiQ0xBU1NfREVGIl0sCgkJCQkJCQkJbW9kaWZpZXJzLElERU5ULHRwLHNjLGljLGNiKTt9CiAgICAgICAgeyBjdXJyZW50Q2xhc3MgPSBwcmV2Q3VycmVudENsYXNzOyB9Cgk7CgovL1RPRE8gLSB3aGVyZSBoYXMgc3VwZXJDbGFzc0NsYXVzZSEgcHJvZHVjdGlvbiBnb25lPz8/CgovLyBEZWZpbml0aW9uIG9mIGEgSmF2YSBJbnRlcmZhY2UKaW50ZXJmYWNlRGVmaW5pdGlvbiFbQVNUIG1vZGlmaWVyc10KCToJImludGVyZmFjZSIgSURFTlQgbmxzIQoJCS8vIGl0IF9taWdodF8gaGF2ZSB0eXBlIHBhcmFtYXRlcnMKCQkodHA6dHlwZVBhcmFtZXRlcnMpPwoJCS8vIGl0IG1pZ2h0IGV4dGVuZCBzb21lIG90aGVyIGludGVyZmFjZXMKCQlpZTppbnRlcmZhY2VFeHRlbmRzCgkJLy8gbm93IHBhcnNlIHRoZSBib2R5IG9mIHRoZSBpbnRlcmZhY2UgKGxvb2tzIGxpa2UgYSBjbGFzcy4uLikKCQlpYjppbnRlcmZhY2VCbG9jawoJCXsjaW50ZXJmYWNlRGVmaW5pdGlvbiA9ICMoI1tJTlRFUkZBQ0VfREVGLCJJTlRFUkZBQ0VfREVGIl0sCgkJCQkJCQkJCW1vZGlmaWVycyxJREVOVCx0cCxpZSxpYik7fQoJOwoKZW51bURlZmluaXRpb24hW0FTVCBtb2RpZmllcnNdCgk6CSJlbnVtIiBJREVOVAoJCS8vIGl0IG1pZ2h0IGltcGxlbWVudCBzb21lIGludGVyZmFjZXMuLi4KCQlpYzppbXBsZW1lbnRzQ2xhdXNlCgkJLy8gbm93IHBhcnNlIHRoZSBib2R5IG9mIHRoZSBlbnVtCgkJZWI6ZW51bUJsb2NrCgkJeyNlbnVtRGVmaW5pdGlvbiA9ICMoI1tFTlVNX0RFRiwiRU5VTV9ERUYiXSwKCQkJCQkJCQltb2RpZmllcnMsSURFTlQsaWMsZWIpO30KCTsKCmFubm90YXRpb25EZWZpbml0aW9uIVtBU1QgbW9kaWZpZXJzXQoJOglBVCAiaW50ZXJmYWNlIiBJREVOVAoJCS8vIG5vdyBwYXJzZSB0aGUgYm9keSBvZiB0aGUgYW5ub3RhdGlvbgoJCWFiOmFubm90YXRpb25CbG9jawoJCXsjYW5ub3RhdGlvbkRlZmluaXRpb24gPSAjKCNbQU5OT1RBVElPTl9ERUYsIkFOTk9UQVRJT05fREVGIl0sCgkJCQkJCQkJCW1vZGlmaWVycyxJREVOVCxhYik7fQoJOwoKdHlwZVBhcmFtZXRlcnMKe2ludCBjdXJyZW50THRMZXZlbCA9IDA7fQoJOgoJCXtjdXJyZW50THRMZXZlbCA9IGx0Q291bnRlcjt9CgkJTFQhIHtsdENvdW50ZXIrKzt9CgkJdHlwZVBhcmFtZXRlciAoQ09NTUEhIHR5cGVQYXJhbWV0ZXIpKgoJCSh0eXBlQXJndW1lbnRzT3JQYXJhbWV0ZXJzRW5kKT8KCgkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgZ29iYmxlZCB1cCBlbm91Z2ggJz4nIGNoYXJhY3RlcnMKCQkvLyBpZiB3ZSBhcmUgYXQgdGhlICJ0b3AgbGV2ZWwiIG9mIG5lc3RlZCB0eXBlQXJndW1lbnQgcHJvZHVjdGlvbnMKCQl7KGN1cnJlbnRMdExldmVsICE9IDApIHx8IGx0Q291bnRlciA9PSBjdXJyZW50THRMZXZlbH0/CgoJCXsjdHlwZVBhcmFtZXRlcnMgPSAjKCNbVFlQRV9QQVJBTUVURVJTLCAiVFlQRV9QQVJBTUVURVJTIl0sICN0eXBlUGFyYW1ldGVycyk7fQoJOwoKdHlwZVBhcmFtZXRlcgoJOgoJCS8vIEknbSBwcmV0dHkgc3VyZSBBbnRsciBnZW5lcmF0ZXMgdGhlIHJpZ2h0IHRoaW5nIGhlcmU6CgkJKGlkOklERU5UKSAoIG9wdGlvbnN7Z2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlO306IHR5cGVQYXJhbWV0ZXJCb3VuZHMgKT8KCQl7I3R5cGVQYXJhbWV0ZXIgPSAjKCNbVFlQRV9QQVJBTUVURVIsIlRZUEVfUEFSQU1FVEVSIl0sICN0eXBlUGFyYW1ldGVyKTt9Cgk7Cgp0eXBlUGFyYW1ldGVyQm91bmRzCgk6CgkJImV4dGVuZHMiISBjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0KCQkoQkFORCEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdKSoKCQl7I3R5cGVQYXJhbWV0ZXJCb3VuZHMgPSAjKCNbVFlQRV9VUFBFUl9CT1VORFMsIlRZUEVfVVBQRVJfQk9VTkRTIl0sICN0eXBlUGFyYW1ldGVyQm91bmRzKTt9Cgk7CgovLyBUaGlzIGlzIHRoZSBib2R5IG9mIGEgY2xhc3MuIFlvdSBjYW4gaGF2ZSBjbGFzc0ZpZWxkcyBhbmQgZXh0cmEgc2VtaWNvbG9ucy4KY2xhc3NCbG9jawoJOglMQ1VSTFkhCiAgICAgICAgICAgICggY2xhc3NGaWVsZCApPyAoIHNlcCEgKCBjbGFzc0ZpZWxkICk/ICkqCgkJUkNVUkxZIQoJCXsjY2xhc3NCbG9jayA9ICMoW09CSkJMT0NLLCAiT0JKQkxPQ0siXSwgI2NsYXNzQmxvY2spO30KCTsKCi8vIFRoaXMgaXMgdGhlIGJvZHkgb2YgYW4gaW50ZXJmYWNlLiBZb3UgY2FuIGhhdmUgaW50ZXJmYWNlRmllbGQgYW5kIGV4dHJhIHNlbWljb2xvbnMuCmludGVyZmFjZUJsb2NrCgk6CUxDVVJMWSEKICAgICAgICAgICAgKCBpbnRlcmZhY2VGaWVsZCApPyAoIHNlcCEgKCBpbnRlcmZhY2VGaWVsZCApPyApKgoJCVJDVVJMWSEKCQl7I2ludGVyZmFjZUJsb2NrID0gIyhbT0JKQkxPQ0ssICJPQkpCTE9DSyJdLCAjaW50ZXJmYWNlQmxvY2spO30KCTsKCQovLyBUaGlzIGlzIHRoZSBib2R5IG9mIGFuIGFubm90YXRpb24uIFlvdSBjYW4gaGF2ZSBhbm5vdGF0aW9uIGZpZWxkcyBhbmQgZXh0cmEgc2VtaWNvbG9ucywKLy8gVGhhdCdzIGFib3V0IGl0ICh1bnRpbCB5b3Ugc2VlIHdoYXQgYW4gYW5ub2F0aW9uIGZpZWxkIGlzLi4uKQphbm5vdGF0aW9uQmxvY2sKCToJTENVUkxZIQogICAgICAgICAgICAoIGFubm90YXRpb25GaWVsZCApPyAoIHNlcCEgKCBhbm5vdGF0aW9uRmllbGQgKT8gKSoKCQlSQ1VSTFkhCgkJeyNhbm5vdGF0aW9uQmxvY2sgPSAjKFtPQkpCTE9DSywgIk9CSkJMT0NLIl0sICNhbm5vdGF0aW9uQmxvY2spO30KCTsKCi8vIFRoaXMgaXMgdGhlIGJvZHkgb2YgYW4gZW51bS4gWW91IGNhbiBoYXZlIHplcm8gb3IgbW9yZSBlbnVtIGNvbnN0YW50cwovLyBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIGZpZWxkcyBsaWtlIGEgcmVndWxhciBjbGFzcwplbnVtQmxvY2sKCToJTENVUkxZIQoJCQkoIGVudW1Db25zdGFudCAoIG9wdGlvbnN7Z3JlZWR5PXRydWU7fTogQ09NTUEhIGVudW1Db25zdGFudCApKiAoIENPTU1BISApPyApPwoJCQkoIFNFTUkhICggY2xhc3NGaWVsZCB8IFNFTUkhICkqICk/CgkJUkNVUkxZIQoJCXsjZW51bUJsb2NrID0gIyhbT0JKQkxPQ0ssICJPQkpCTE9DSyJdLCAjZW51bUJsb2NrKTt9Cgk7CgovLyBBbiBhbm5vdGF0aW9uIGZpZWxkCmFubm90YXRpb25GaWVsZCEKCToJbW9kczptb2RpZmllcnMKCQkoCXRkOnR5cGVEZWZpbml0aW9uSW50ZXJuYWxbI21vZHNdCgkJCXsjYW5ub3RhdGlvbkZpZWxkID0gI3RkO30KCQl8CXQ6dHlwZVNwZWNbZmFsc2VdCQkvLyBhbm5vdGF0aW9uIGZpZWxkCgkJCSgJaTpJREVOVAkJCQkvLyB0aGUgbmFtZSBvZiB0aGUgZmllbGQKCgkJCQlMUEFSRU4hIFJQQVJFTiEKCgkJCQkvKk9CUyogcnQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XSAqT0JTKi8KCgkJCQkoICJkZWZhdWx0IiBhbXZpOmFubm90YXRpb25NZW1iZXJWYWx1ZUluaXRpYWxpemVyICk/CgoJCQkJU0VNSQoJCQkJeyNhbm5vdGF0aW9uRmllbGQgPQoJCQkJCSMoI1tBTk5PVEFUSU9OX0ZJRUxEX0RFRiwiQU5OT1RBVElPTl9GSUVMRF9ERUYiXSwKCQkJCQkJIG1vZHMsCgkJCQkJCSAjKCNbVFlQRSwiVFlQRSJdLHQpLAoJCQkJCQkgaSxhbXZpCgkJCQkJCSApO30KCQkJfAl2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI21vZHMsI3RdIFNFTUkJLy8gdmFyaWFibGUKCQkJCXsjYW5ub3RhdGlvbkZpZWxkID0gI3Y7fQoJCQkpCgkJKQoJOwoKLy9BbiBlbnVtIGNvbnN0YW50IG1heSBoYXZlIG9wdGlvbmFsIHBhcmFtZXRlcnMgYW5kIG1heSBoYXZlIGEKLy9hIGNsYXNzIGJvZHkKZW51bUNvbnN0YW50IQoJOglhbjphbm5vdGF0aW9ucwoJCWk6SURFTlQKCQkoCUxQQVJFTiEKCQkJYTphcmdMaXN0CgkJCVJQQVJFTiEKCQkpPwoJCSggYjplbnVtQ29uc3RhbnRCbG9jayApPwoJCXsjZW51bUNvbnN0YW50ID0gIyhbRU5VTV9DT05TVEFOVF9ERUYsICJFTlVNX0NPTlNUQU5UX0RFRiJdLCBhbiwgaSwgYSwgYik7fQoJOwoKLy9UaGUgY2xhc3MtbGlrZSBib2R5IG9mIGFuIGVudW0gY29uc3RhbnQKZW51bUNvbnN0YW50QmxvY2sKCToJTENVUkxZIQoJCSggZW51bUNvbnN0YW50RmllbGQgfCBTRU1JISApKgoJCVJDVVJMWSEKCQl7I2VudW1Db25zdGFudEJsb2NrID0gIyhbT0JKQkxPQ0ssICJPQkpCTE9DSyJdLCAjZW51bUNvbnN0YW50QmxvY2spO30KCTsKCi8vQW4gZW51bSBjb25zdGFudCBmaWVsZCBpcyBqdXN0IGxpa2UgYSBjbGFzcyBmaWVsZCBidXQgd2l0aG91dAovL3RoZSBwb3NpYmlsaXR5IG9mIGEgY29uc3RydWN0b3IgZGVmaW5pdGlvbiBvciBhIHN0YXRpYyBpbml0aWFsaXplcgoKLy8gVE9ETyAtIG1heWJlIGFsbG93ICdkZWNsYXJhdGlvbicgcHJvZHVjdGlvbiB3aXRoaW4gdGhpcyBwcm9kdWN0aW9uLCAKLy8gYnV0IGhvdyB0byBkaXNhbGxvdyBjb25zdHJ1Y3RvcnMgYW5kIHN0YXRpYyBpbml0aWFsaXplcnMuLi4KZW51bUNvbnN0YW50RmllbGQhCgk6CW1vZHM6bW9kaWZpZXJzCgkJKAl0ZDp0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtb2RzXQoJCQl7I2VudW1Db25zdGFudEZpZWxkID0gI3RkO30KCXwJLy8gQSBnZW5lcmljIG1ldGhvZCBoYXMgdGhlIHR5cGVQYXJhbWV0ZXJzIGJlZm9yZSB0aGUgcmV0dXJuIHR5cGUuCgkJCS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgZm9yIHZhcmlhYmxlIGRlZmluaXRpb25zLCBidXQgdGhpcyBwcm9kdWN0aW9uCgkJCS8vIGFsbG93cyBpdCwgYSBzZW1hbnRpYyBjaGVjayBjb3VsZCBiZSB1c2VkIGlmIHlvdSB3YW50ZWQuCgkJCSh0cDp0eXBlUGFyYW1ldGVycyk/IHQ6dHlwZVNwZWNbZmFsc2VdCQkvLyBtZXRob2Qgb3IgdmFyaWFibGUgZGVjbGFyYXRpb24ocykKCQkJKAlJREVOVAkJCQkJCQkJCS8vIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKCgkJCQkvLyBwYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCgkJCQlMUEFSRU4hIHBhcmFtOnBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCBSUEFSRU4hCgoJLypPQlMqCQkJcnQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XSAqT0JTKi8KCgkJCQkvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzCgkJCQkvLyBkZWNsYXJlZCB0byB0aHJvdwoJCQkJKHRjOnRocm93c0NsYXVzZSk/CgoJCQkJKCBzMjpjb21wb3VuZFN0YXRlbWVudCB8IFNFTUkgKQoJCQkgLy8gVE9ETyAtIHZlcmlmeSB0aGF0ICd0JyBpcyB1c2VmdWwvY29ycmVjdCBoZXJlLCB1c2VkIHRvIGJlICdydCcKCQkJCXsjZW51bUNvbnN0YW50RmllbGQgPSAjKCNbTUVUSE9EX0RFRiwiTUVUSE9EX0RFRiJdLAoJCQkJCQkJIG1vZHMsCgkJCQkJCQkgdHAsCgkJCQkJCQkgIygjW1RZUEUsIlRZUEUiXSx0KSwKCQkJCQkJCSBJREVOVCwKCQkJCQkJCSBwYXJhbSwKCQkJCQkJCSB0YywKCQkJCQkJCSBzMik7fQoJCQkKCQkJIHwJdjp2YXJpYWJsZURlZmluaXRpb25zWyNtb2RzLCN0XSBTRU1JCgkJCQl7I2VudW1Db25zdGFudEZpZWxkID0gI3Y7fQoJCQkpCgkJKQoKCS8vICJ7IC4uLiB9IiBpbnN0YW5jZSBpbml0aWFsaXplcgoJfAlzNDpjb21wb3VuZFN0YXRlbWVudAoJCXsjZW51bUNvbnN0YW50RmllbGQgPSAjKCNbSU5TVEFOQ0VfSU5JVCwiSU5TVEFOQ0VfSU5JVCJdLCBzNCk7fQoJOwoKLy8gQW4gaW50ZXJmYWNlIGNhbiBleHRlbmQgc2V2ZXJhbCBvdGhlciBpbnRlcmZhY2VzLi4uCmludGVyZmFjZUV4dGVuZHMKCToJKAoJCWU6ImV4dGVuZHMiISBubHMhCgkJY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICggQ09NTUEhIG5scyEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICkqIG5scyEKCQkpPwoJCXsjaW50ZXJmYWNlRXh0ZW5kcyA9ICMoI1tFWFRFTkRTX0NMQVVTRSwiRVhURU5EU19DTEFVU0UiXSwKCQkJCQkJCQkjaW50ZXJmYWNlRXh0ZW5kcyk7fQoJOwoKLy8gQSBjbGFzcyBjYW4gaW1wbGVtZW50IHNldmVyYWwgaW50ZXJmYWNlcy4uLgppbXBsZW1lbnRzQ2xhdXNlCgk6CSgKCQkJaToiaW1wbGVtZW50cyIhIG5scyEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICggQ09NTUEhIG5scyEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICkqIG5scyEKCQkpPwoJCXsjaW1wbGVtZW50c0NsYXVzZSA9ICMoI1tJTVBMRU1FTlRTX0NMQVVTRSwiSU1QTEVNRU5UU19DTEFVU0UiXSwKCQkJCQkJCQkgI2ltcGxlbWVudHNDbGF1c2UpO30KCTsKCi8vIE5vdyB0aGUgdmFyaW91cyB0aGluZ3MgdGhhdCBjYW4gYmUgZGVmaW5lZCBpbnNpZGUgYSBjbGFzcwpjbGFzc0ZpZWxkIQoJOgkvLyBtZXRob2QsIGNvbnN0cnVjdG9yLCBvciB2YXJpYWJsZSBkZWNsYXJhdGlvbgoJCShkZWNsYXJhdGlvblN0YXJ0KT0+CiAgICAgICAgZDpkZWNsYXJhdGlvbgogICAgICAgIHsjY2xhc3NGaWVsZCA9ICNkO30KICAgIHwKICAgICAgICAvL1RPRE8gLSB1bmlmeSB0eXBlRGVjbGFyYXRpb24gYW5kIHR5cGVEZWZpbml0aW9uSW50ZXJuYWwgbmFtZXMKICAgICAgICAvLyB0eXBlIGRlY2xhcmF0aW9uCiAgICAgICAgKHR5cGVEZWNsYXJhdGlvblN0YXJ0KT0+CiAgICAgICAgKCBtb2RzOm1vZGlmaWVycyApPwoJCSgJdGQ6dHlwZURlZmluaXRpb25JbnRlcm5hbFsjbW9kc10KCQkJeyNjbGFzc0ZpZWxkID0gI3RkO30KCQkpCgoJLy8gInN0YXRpYyB7IC4uLiB9IiBjbGFzcyBpbml0aWFsaXplcgoJfAkic3RhdGljIiBzMzpjb21wb3VuZFN0YXRlbWVudAoJCXsjY2xhc3NGaWVsZCA9ICMoI1tTVEFUSUNfSU5JVCwiU1RBVElDX0lOSVQiXSwgczMpO30KCgkvLyAieyAuLi4gfSIgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKCXwJczQ6Y29tcG91bmRTdGF0ZW1lbnQKCQl7I2NsYXNzRmllbGQgPSAjKCNbSU5TVEFOQ0VfSU5JVCwiSU5TVEFOQ0VfSU5JVCJdLCBzNCk7fQoJOwoKLy8gTm93IHRoZSB2YXJpb3VzIHRoaW5ncyB0aGF0IGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIGludGVyZmFjZQppbnRlcmZhY2VGaWVsZCEKCToJLy8gbWV0aG9kLCBjb25zdHJ1Y3Rvciwgb3IgdmFyaWFibGUgZGVjbGFyYXRpb24KICAgICAgICAoZGVjbGFyYXRpb25TdGFydCk9PgogICAgICAgIGQ6ZGVjbGFyYXRpb24KICAgICAgICB7I2ludGVyZmFjZUZpZWxkID0gI2Q7fQogICAgfAogICAgICAgIC8vVE9ETyAtIHVuaWZ5IHR5cGVEZWNsYXJhdGlvbiBhbmQgdHlwZURlZmluaXRpb25JbnRlcm5hbCBuYW1lcwogICAgICAgIC8vIHR5cGUgZGVjbGFyYXRpb24KICAgICAgICAodHlwZURlY2xhcmF0aW9uU3RhcnQpPT4KICAgICAgICAoIG1vZHM6bW9kaWZpZXJzICk/CgoJCSgJdGQ6dHlwZURlZmluaXRpb25JbnRlcm5hbFsjbW9kc10KCQkJeyNpbnRlcmZhY2VGaWVsZCA9ICN0ZDt9CgkJKQoJOwoKY29uc3RydWN0b3JCb2R5Cgk6CWxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKFNMSVNUKTt9IG5scyEKICAgICAgICAoICAgKGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKSA9PiAgIC8vIEphdmEgY29tcGF0aWJpbGl0eSBoYWNrCiAgICAgICAgICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiAoc2VwISBibG9ja0JvZHkpPwogICAgICAgICAgICB8ICAgYmxvY2tCb2R5CiAgICAgICAgKQogICAgICAgIFJDVVJMWSEKICAgIDsKCgovKiogQ2F0Y2ggb2J2aW91cyBjb25zdHJ1Y3RvciBjYWxscywgYnV0IG5vdCB0aGUgZXhwci5zdXBlciguLi4pIGNhbGxzICovCmV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uCiAgICAgICAge2Jvb2xlYW4geno7IC8qaWdub3JlZCovIH0KCToJKHR5cGVBcmd1bWVudHMpPwoJCSgJInRoaXMiISBscDE6TFBBUkVOXiB6ej1hcmdMaXN0IFJQQVJFTiEKCQkJeyNscDEuc2V0VHlwZShDVE9SX0NBTEwpO30KCQl8CSJzdXBlciIhIGxwMjpMUEFSRU5eIHp6PWFyZ0xpc3QgUlBBUkVOIQoJCQl7I2xwMi5zZXRUeXBlKFNVUEVSX0NUT1JfQ0FMTCk7fQoJCSkKCTsKCi8qKiBUaGUgdGFpbCBvZiBhIGRlY2xhcmF0aW9uLgogICogRWl0aGVyIHYxLCB2MiwgLi4uICh3aXRoIHBvc3NpYmxlIGluaXRpYWxpemVycykgb3IgZWxzZSBtKGFyZ3Mpe2JvZHl9LgogICogVGhlIHR3byBhcmd1bWVudHMgYXJlIHRoZSBtb2RpZmllciBsaXN0IChpZiBhbnkpIGFuZCB0aGUgZGVjbGFyYXRpb24gaGVhZCAoaWYgYW55KS4KICAqIFRoZSBkZWNsYXJhdGlvbiBoZWFkIGlzIHRoZSB2YXJpYWJsZSB0eXBlLCBvciAoZm9yIGEgbWV0aG9kKSB0aGUgcmV0dXJuIHR5cGUuCiAgKiBJZiBpdCBpcyBtaXNzaW5nLCB0aGVuIHRoZSB2YXJpYWJsZSB0eXBlIGlzIHRha2VuIGZyb20gaXRzIGluaXRpYWxpemVyIChpZiB0aGVyZSBpcyBvbmUpLgogICogT3RoZXJ3aXNlLCB0aGUgdmFyaWFibGUgdHlwZSBkZWZhdWx0cyB0byAnYW55Jy4KICAqIERFQ0lERTogIE1ldGhvZCByZXR1cm4gdHlwZXMgZGVmYXVsdCB0byB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIGJvZHksIGFzIGFuIGV4cHJlc3Npb24uCiAgKi8KdmFyaWFibGVEZWZpbml0aW9uc1tBU1QgbW9kcywgQVNUIHRdCiAgICA6ICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcltnZXRBU1RGYWN0b3J5KCkuZHVwVHJlZShtb2RzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCiAgICAgICAgKCAgICAgICBDT01NQSEgbmxzIQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3JbZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUobW9kcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCiAgICAgICAgKSoKICAgIHwKICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJzZXIgYWxsb3dzIGEgbWV0aG9kIGRlZmluaXRpb24gYW55d2hlcmUgYSB2YXJpYWJsZSBkZWZpbml0aW9uIGlzIGFjY2VwdGVkLgoKICAgICAgICAoICAgaWQ6SURFTlQKICAgICAgICB8ICAgcWlkOlNUUklOR19MSVRFUkFMICAgICAgICAgIHsjcWlkLnNldFR5cGUoSURFTlQpO30gIC8vIHVzZSBmb3Igb3BlcmF0b3IgZGVmaW50aW9ucywgZXRjLgogICAgICAgICkKCiAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCiAgICAgICAgICAgICAgICBMUEFSRU4hIHBhcmFtOnBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCEgUlBBUkVOIQoKICAgICAgICAgICAgICAgIC8qT0JTKnJ0OmRlY2xhcmF0b3JCcmFja2V0c1sjdF0qLwoKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRoYXQgdGhpcyBtZXRob2QgaXMKICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIHRvIHRocm93CiAgICAgICAgKCAgICAgICB0Yzp0aHJvd3NDbGF1c2UhICApPwoKICAgICAgICAgICAgICAgIC8vIHRoZSBtZXRob2QgYm9keSBpcyBhbiBvcGVuIGJsb2NrCiAgICAgICAgICAgICAgICAvLyBidXQsIGl0IG1heSBoYXZlIGFuIG9wdGlvbmFsIGNvbnN0cnVjdG9yIGNhbGwgKGZvciBjb25zdHJ1Y3RvcnMgb25seSkKICAgICAgICAoCiAgICAgICAgICAgIHtpc0NvbnN0cnVjdG9ySWRlbnQoaWQpfT8KICAgICAgICAgICAgeyNpZC5zZXRUeXBlKENUT1JfSURFTlQpO30KICAgICAgICAgICAgICAgICAgICAgICAgY2I6Y29uc3RydWN0b3JCb2R5IQogICAgICAgIHwgICAgICAgbWI6b3BlbkJsb2NrIQogICAgICAgIHwgICAvKm9yIG5vdGhpbmcgYXQgYWxsKi8KICAgICAgICApCiAgICAgICAgeyAgIGlmICgjY2IgIT0gbnVsbCkgICAjbWIgPSAjY2I7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgjcWlkICE9IG51bGwpICAjaWQgPSAjcWlkOwogICAgICAgICAgICAgICAgICAgICAgICAjdmFyaWFibGVEZWZpbml0aW9ucyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIygjW01FVEhPRF9ERUYsIk1FVEhPRF9ERUYiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHMsICMoI1tUWVBFLCJUWVBFIl0sdCksIGlkLCBwYXJhbSwgdGMsIG1iKTsKICAgICAgICB9CiAgICA7CgoKLyoqIERlY2xhcmF0aW9uIG9mIGEgdmFyaWFibGUuIFRoaXMgY2FuIGJlIGEgY2xhc3MvaW5zdGFuY2UgdmFyaWFibGUsCiAqICBvciBhIGxvY2FsIHZhcmlhYmxlIGluIGEgbWV0aG9kCiAqICBJdCBjYW4gYWxzbyBpbmNsdWRlIHBvc3NpYmxlIGluaXRpYWxpemF0aW9uLgogKi8KdmFyaWFibGVEZWNsYXJhdG9yIVtBU1QgbW9kcywgQVNUIHRdCiAgICA6CiAgICAgICAgICAgICAgICBpZDp2YXJpYWJsZU5hbWUKICAgICAgICAgICAgICAgIC8qT0JTKmQ6ZGVjbGFyYXRvckJyYWNrZXRzW3RdKi8KICAgICAgICAgICAgICAgIHY6dmFySW5pdGlhbGl6ZXIKICAgICAgICB7I3ZhcmlhYmxlRGVjbGFyYXRvciA9ICMoI1tWQVJJQUJMRV9ERUYsIlZBUklBQkxFX0RFRiJdLCBtb2RzLCAjKCNbVFlQRSwiVFlQRSJdLHQpLCBpZCwgdik7fQogICAgOwoKLyoqIFVzZWQgaW4gY2FzZXMgd2hlcmUgYSBkZWNsYXJhdGlvbiBjYW5ub3QgaGF2ZSBjb21tYXMsIG9yIGVuZHMgd2l0aCB0aGUgImluIiBvcGVyYXRvciBpbnN0ZWFkIG9mICc9Jy4gKi8Kc2luZ2xlVmFyaWFibGUhW0FTVCBtb2RzLCBBU1QgdF0KICAgICAgICA6CiAgICAgICAgICAgICAgICBpZDp2YXJpYWJsZU5hbWUKICAgICAgICAgICAgICAgIHsjc2luZ2xlVmFyaWFibGUgPSAjKCNbVkFSSUFCTEVfREVGLCJWQVJJQUJMRV9ERUYiXSwgbW9kcywgIygjW1RZUEUsIlRZUEUiXSx0KSwgaWQpO30KICAgICAgICA7Cgp2YXJpYWJsZU5hbWUKICAgICAgICA6ICAgKElERU5UIHwgIml0IikKICAgICAgICA7CgovKk9CUyoKZGVjbGFyYXRvckJyYWNrZXRzW0FTVCB0eXBdCgk6CXsjZGVjbGFyYXRvckJyYWNrZXRzPXR5cDt9CgkJKGxiOkxCUkFDS14geyNsYi5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLISkqCgk7CipPQlMqLwoKdmFySW5pdGlhbGl6ZXIKCToJKCBBU1NJR05eIG5scyEgaW5pdGlhbGl6ZXIgKT8KCTsKCi8qT0JTKgovLyBUaGlzIGlzIGFuIGluaXRpYWxpemVyIHVzZWQgdG8gc2V0IHVwIGFuIGFycmF5LgphcnJheUluaXRpYWxpemVyCgk6CWxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKEFSUkFZX0lOSVQpO30KCQkJKAlpbml0aWFsaXplcgoJCQkJKAoJCQkJCS8vIENPTkZMSUNUOiBkb2VzIGEgQ09NTUEgYWZ0ZXIgYW4gaW5pdGlhbGl6ZXIgc3RhcnQgYSBuZXcKCQkJCQkvLyBpbml0aWFsaXplciBvciBzdGFydCB0aGUgb3B0aW9uICcsJyBhdCBlbmQ/CgkJCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlIGJ5IG1hdGNoaW5nCgkJCQkJLy8gdGhlIGNvbW1hIGFzIHNvb24gYXMgcG9zc2libGUuCgkJCQkJb3B0aW9ucyB7CgkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKCQkJCQl9CgkJCQk6CgkJCQkJQ09NTUEhIGluaXRpYWxpemVyCgkJCQkpKgoJCQkJKENPTU1BISk/CgkJCSk/CgkJUkNVUkxZIQoJOwoqT0JTKi8KCi8vIFRoZSB0d28gInRoaW5ncyIgdGhhdCBjYW4gaW5pdGlhbGl6ZSBhbiBhcnJheSBlbGVtZW50IGFyZSBhbiBleHByZXNzaW9uCi8vIGFuZCBhbm90aGVyIChuZXN0ZWQpIGFycmF5IGluaXRpYWxpemVyLgppbml0aWFsaXplcgoJOglleHByZXNzaW9uCi8qT0JTKiAgLy8gVXNlIFsuLi5dIGZvciBpbml0aWFsaXppbmcgYWxsIHNvcnRzIG9mIHNlcXVlbmNlcywgaW5jbHVkaW5nIGFycmF5cy4KCXwJYXJyYXlJbml0aWFsaXplcgoqT0JTKi8KCTsKCi8qT0JTPz8/Ci8vIFRoaXMgaXMgdGhlIGhlYWRlciBvZiBhIG1ldGhvZC4gSXQgaW5jbHVkZXMgdGhlIG5hbWUgYW5kIHBhcmFtZXRlcnMKLy8gZm9yIHRoZSBtZXRob2QuCi8vIFRoaXMgYWxzbyB3YXRjaGVzIGZvciBhIGxpc3Qgb2YgZXhjZXB0aW9uIGNsYXNzZXMgaW4gYSAidGhyb3dzIiBjbGF1c2UuCmN0b3JIZWFkCgk6CUlERU5UIC8vIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKCgkJLy8gcGFyc2UgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgoJCUxQQVJFTiEgcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0IFJQQVJFTiEKCgkJLy8gZ2V0IHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCB0byB0aHJvdwoJCSh0aHJvd3NDbGF1c2UpPwoJOwoqT0JTKi8KCi8vIFRoaXMgaXMgYSBsaXN0IG9mIGV4Y2VwdGlvbiBjbGFzc2VzIHRoYXQgdGhlIG1ldGhvZCBpcyBkZWNsYXJlZCB0byB0aHJvdwp0aHJvd3NDbGF1c2UKCToJInRocm93cyJeIG5scyEgaWRlbnRpZmllciAoIENPTU1BISBubHMhIGlkZW50aWZpZXIgKSogbmxzIQoJOwoKLy8gQSBsaXN0IG9mIGZvcm1hbCBwYXJhbWV0ZXJzCi8vCSBaZXJvIG9yIG1vcmUgcGFyYW1ldGVycwovLwkgSWYgYSBwYXJhbWV0ZXIgaXMgdmFyaWFibGUgbGVuZ3RoIChlLmcuIFN0cmluZy4uLiBteUFyZykgaXQgaXMgdGhlIHJpZ2h0LW1vc3QgcGFyYW1ldGVyCnBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdAoJLy8gVGhlIHNlbWFudGljIGNoZWNrIGluICggLi4uLiApKiBibG9jayBpcyBmbGFnZ2VkIGFzIHN1cGVyZmx1b3VzLCBhbmQgc2VlbXMgc3VwZXJmbHVvdXMgYnV0CgkvLyBpcyB0aGUgb25seSB3YXkgSSBjb3VsZCBtYWtlIHRoaXMgd29yay4gSWYgbXkgdW5kZXJzdGFuZGluZyBpcyBjb3JyZWN0IHRoaXMgaXMgYSBrbm93biBidWcKCToJKAkoIHBhcmFtZXRlckRlY2xhcmF0aW9uICk9PiBwYXJhbWV0ZXJEZWNsYXJhdGlvbgoJCQkoIG9wdGlvbnMge3dhcm5XaGVuRm9sbG93QW1iaWc9ZmFsc2U7fSA6ICggQ09NTUEhIG5scyEgcGFyYW1ldGVyRGVjbGFyYXRpb24gKSA9PiBDT01NQSEgbmxzISBwYXJhbWV0ZXJEZWNsYXJhdGlvbiApKgoJCQkoIENPTU1BISBubHMhIHZhcmlhYmxlTGVuZ3RoUGFyYW1ldGVyRGVjbGFyYXRpb24gKT8KCQl8CgkJCXZhcmlhYmxlTGVuZ3RoUGFyYW1ldGVyRGVjbGFyYXRpb24KCQkpPwoJCXsjcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0ID0gIygjW1BBUkFNRVRFUlMsIlBBUkFNRVRFUlMiXSwKCQkJCQkJCQkJI3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCk7fQoJOwoKLy8gQSBmb3JtYWwgcGFyYW1ldGVyLgpwYXJhbWV0ZXJEZWNsYXJhdGlvbiEKICAgICAgICA6ICAgICAgICgiZGVmIiEpPyAgLy8gdXNlbGVzcyBidXQgcGVybWl0dGVkIGZvciBzeW1tZXRyeQogICAgICAgICAgICAgICAgcG06cGFyYW1ldGVyTW9kaWZpZXIgKCBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDogdDp0eXBlU3BlY1tmYWxzZV0pPyBpZDpwYXJhbWV0ZXJJZGVudAogICAgICAgICAgICAgICAgLypPQlMqcGQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XSovCiAgICAgICAgICAgICAgICB7I3BhcmFtZXRlckRlY2xhcmF0aW9uID0gIygjW1BBUkFNRVRFUl9ERUYsIlBBUkFNRVRFUl9ERUYiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0sICMoW1RZUEUsIlRZUEUiXSx0KSwgaWQpO30KICAgICAgICA7CgovLyBUT0RPIC0gcG9zc2libHkgYWRkIG5scyEgc29tZXdoZXJlIHdpdGhpbiB2YXJpYWJsZUxlbmd0aFBhcmFtZXRlckRlY2xhcmF0aW9uCnZhcmlhYmxlTGVuZ3RoUGFyYW1ldGVyRGVjbGFyYXRpb24hCgk6CXBtOnBhcmFtZXRlck1vZGlmaWVyIHQ6dHlwZVNwZWNbZmFsc2VdIFRSSVBMRV9ET1QhIGlkOklERU5UCgkJLypPQlMqIHBkOmRlY2xhcmF0b3JCcmFja2V0c1sjdF0qLwoJCXsjdmFyaWFibGVMZW5ndGhQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9ICMoI1tWQVJJQUJMRV9QQVJBTUVURVJfREVGLCJWQVJJQUJMRV9QQVJBTUVURVJfREVGIl0sCgkJCQkJCQkJCQkJCXBtLCAjKFtUWVBFLCJUWVBFIl0sdCksIGlkKTt9Cgk7CgpwYXJhbWV0ZXJNb2RpZmllcgoJLy9maW5hbCBjYW4gYXBwZWFyIGFtb25nc3QgYW5ub3RhdGlvbnMgaW4gYW55IG9yZGVyIC0gZ3JlZWRpbHkgY29uc3VtZSBhbnkgcHJlY2VkaW5nCgkvL2Fubm90YXRpb25zIHRvIHNodXQgbm9uZC1ldGVybWluaXNtIHdhcm5pbmdzIG9mZgoJOgkob3B0aW9uc3tncmVlZHk9dHJ1ZTt9IDogYW5ub3RhdGlvbiBubHMhKSogKGY6ImZpbmFsIik/IChhbm5vdGF0aW9uIG5scyEpKgoJCXsjcGFyYW1ldGVyTW9kaWZpZXIgPSAjKCNbTU9ESUZJRVJTLCJNT0RJRklFUlMiXSwgI3BhcmFtZXRlck1vZGlmaWVyKTt9Cgk7CgpjbG9zdXJlUGFyYW1ldGVycwogICAgICAgIDogICAoY2xvc3VyZVBhcmFtZXRlciAoQ09NTUEhIG5scyEgY2xvc3VyZVBhcmFtZXRlcikqIG5scyEpPyBCT1IhCiAgICAgICAgICAgICAgICB7I2Nsb3N1cmVQYXJhbWV0ZXJzID0gIygjW1BBUkFNRVRFUlMsIlBBUkFNRVRFUlMiXSwgI2Nsb3N1cmVQYXJhbWV0ZXJzKTt9CiAgICAgICAgfCAgIExQQVJFTiEgcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0IFJQQVJFTiEgQk9SIQogICAgICAgICAgICAgICAgLy8gWWVzLCB5b3UgY2FuIGhhdmUgYSBmdWxsIHBhcmFtZXRlciBkZWNsYXJhdGlvbiBsaXN0LgogICAgICAgICAgICAgICAgLy8gWWVzLCB5b3UgbXVzdCBwYXJlbnRoZXNpemUgaXQgKGFzIGZvciBhIG5hbWVkIG1ldGhvZCkgdW5sZXNzIGl0J3MgcmVhbGx5LCByZWFsbHkgc2ltcGxlLgogICAgICAgIDsKCmNsb3N1cmVQYXJhbWV0ZXJzU3RhcnQhCiAgICAgICAgOiAgIEJPUgogICAgICAgIHwgICAgICAgcGFyYW1ldGVySWRlbnQhIG5scyEgKEJPUiB8IENPTU1BKQogICAgICAgIHwgICBMUEFSRU4gYmFsYW5jZWRUb2tlbnMhIFJQQVJFTiBubHMhIEJPUgogICAgICAgIDsKCi8qKiBTaW1wbGUgbmFtZXMsIGFzIGluIHt4fC4uLn0sIGFyZSBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8geyhkZWYgeCl8Li4ufS4gIEJ1aWxkIHRoZSByaWdodCBBU1QuICovCmNsb3N1cmVQYXJhbWV0ZXIhCiAgICAgICAgOiAgIHBhcmFtZXRlcklkZW50IQogICAgICAgICAgICAgICAgeyNjbG9zdXJlUGFyYW1ldGVyID0gIygjW1BBUkFNRVRFUl9ERUYsIlBBUkFNRVRFUl9ERUYiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMoI1tNT0RJRklFUlMsIk1PRElGSUVSUyJdKSwgIyhbVFlQRSwiVFlQRSJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjbG9zdXJlUGFyYW1ldGVyKTt9CiAgICAgICAgOwoKLyoqIEEgZm9ybWFsIHBhcmFtZXRlciBuYW1lIGNhbiBiZSBkZWNvcmF0ZWQgd2l0aCB0aGUgb3B0aW9uYWxpdHkgb3BlcmF0b3IsIG1lYW5pbmcgdGhhdAogKiAgdGhlIGFyZ3VtZW50IGNhbiBiZSBvbWl0dGVkIGJ5IHRoZSBjYWxsZXIuCiAqICAoVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNyZWF0aW5nIGEgbmV3IHdyYXBwZXIgb3ZlcmxvYWRpbmcgdGhhdAogKiAgcGFzc2VzIHRoZSBhcHByb3ByaWF0ZSBudWxsIHZhbHVlIGluIHBsYWNlIG9mIHRoZSBtaXNzaW5nIGFyZ3VtZW50LikKICogIDxwPgogKiAgQSBmb3JtYWwgcGFyYW1ldGVyIG5hbWUgY2FuIGJlIGRlY29yYXRlZCB3aXRoIGEgc3ByZWFkIG9wZXJhdG9yIGYoKngpLAogKiAgd2hpY2ggbWVhbnMgdGhlIG5hbWUgd2lsbCBiZSBib3VuZCB0byBhIGxpc3Qgb2YgYXJndW1lbnQgdmFsdWVzLgogKiAgVGhpcyBzcHJlYWQgYXJndW1lbnQgbXVzdCBiZSB0aGUgbGFzdCBhcmd1bWVudCwgZXhjZXB0IHBlcmhhcHMgZm9yCiAqICBhIE1hcCBhcmd1bWVudCAod2hpY2ggbWF5IGFsc28gYmUgc3ByZWFkKSwgYW5kIGV4Y2VwdCBwZXJoYXBzIGZvcgogKiAgYSBmaW5hbCBDbG9zdXJlIGFyZ3VtZW50LiAgVGhlIE1hcCBhbmQgQ2xvc3VyZSBwYXJhbWV0ZXJzIG11c3QgYmUKICogIGV4cGxpY2l0bHkgdHlwZWQsIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBjbGVhciBiYXNpcyBmb3IgZGl2aWRpbmcKICogIGluY29taW5nIGFyZ3VtZW50cyBpbnRvIHVubGFiZWxlZCwgbGFiZWxlZCwgYW5kIGNsb3N1cmUgY2F0ZWdvcmllcy4KICogIDxwPgogKiAgRXhhbXBsZXM6CiAqICAgIHsoKmFsKSB8IGFsfSgwLDEsMikgID09PSAgWzAsMSwyXQogKiAgICB7KCphbCkgfCBhbH0oMCxhOjEsYjoyKSAgPT09ICBbMCxbYToxLGI6Ml1dCiAqICAgIHsoKmFsKSB8IGFsfSgwKXtzfSAgPT09ICBbMCx7c31dCiAqICAgIHsoKmFsLENsb3N1cmUgYykgfCBhbH0oMCl7c30gID09PSAgWzBdCiAqICAgIHsoKmFsLE1hcCBtKSB8IGFsfSgwLGE6MSxiOjIpICA9PT0gIFswXQogKiAgICB7KCphbCxNYXAgbSkgfCBtfSgwKSAgPT09ICBbOl0KICovCnBhcmFtZXRlcklkZW50CiAgICAgICAgOiAgICggICAvLyBTcHJlYWQgb3BlcmF0b3I6ICB7KCp5KXx5fSgxLDIsMykgID09PSAgWzEsMiwzXQogICAgICAgICAgICAgICAgICAgICAgICBzcDpTVEFSXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNzcC5zZXRUeXBlKFNQUkVBRF9BUkcpO30KICAgICAgICAgICAgICAgIHwgICAvLyBPcHRpb25hbC1udWxsIG9wZXJhdG9yOiAgeyg/eCw/eSl8W3gseV19KDEpICA9PT0gIFsxLG51bGxdCiAgICAgICAgICAgICAgICAgICAgICAgIG9wOlFVRVNUSU9OXiAgICAgICAgICAgICAgICAgICAgeyNvcC5zZXRUeXBlKE9QVElPTkFMX0FSRyk7fQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICggICBJREVOVAogICAgICAgICAgICAgICAgfCAgICJpdCIgICAgICAgICAgICAgICAgLy8gYWxsb3cga2V5d29yZCAiaXQiLCBidXQgb25seSBhcyBhIG1ldGhvZCBvciBjbG9zdXJlIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgKQogICAgICAgIDsKCi8vIENvbXBvdW5kIHN0YXRlbWVudC4gVGhpcyBpcyB1c2VkIGluIG1hbnkgY29udGV4dHM6Ci8vIEluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gcHJlZml4ZWQgd2l0aCAic3RhdGljIjoKLy8gaXQgaXMgYSBjbGFzcyBpbml0aWFsaXplcgovLyBJbnNpZGUgYSBjbGFzcyBkZWZpbml0aW9uIHdpdGhvdXQgInN0YXRpYyI6Ci8vIGl0IGlzIGFuIGluc3RhbmNlIGluaXRpYWxpemVyCi8vIEFzIHRoZSBib2R5IG9mIGEgbWV0aG9kCi8vIEFzIGEgY29tcGxldGVseSBpbmRlcGRlbnQgYnJhY2VkIGJsb2NrIG9mIGNvZGUgaW5zaWRlIGEgbWV0aG9kCi8vIGl0IHN0YXJ0cyBhIG5ldyBzY29wZSBmb3IgdmFyaWFibGUgZGVmaW5pdGlvbnMKLy8gSW4gR3Jvb3Z5LCB0aGlzIGlzIGNhbGxlZCBhbiAib3BlbiBibG9jayIuICBJdCBjYW5ub3QgaGF2ZSBjbG9zdXJlIGFyZ3VtZW50cy4KCmNvbXBvdW5kU3RhdGVtZW50Cgk6CW9wZW5CbG9jawoJOwoKLyoqIEFuIG9wZW4gYmxvY2sgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBjbG9zdXJlIGFyZ3VtZW50cy4gKi8Kb3BlbkJsb2NrCiAgICAgICAgOiAgICAgICBsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShTTElTVCk7fSAgIC8vIEFTVCB0eXBlIG9mIFNMSVNUIG1lYW5zICJuZXZlciBnb25uYSBiZSBhIGNsb3N1cmUiCiAgICAgICAgICAgICAgICBibG9ja0JvZHkKICAgICAgICAgICAgICAgIFJDVVJMWSEKICAgICAgICA7CgovKiogQSBibG9jayBib2R5IGlzIGVpdGhlciBhIHNpbmdsZSBleHByZXNzaW9uLCB3aXRoIG5vIGFkZGl0aW9uYWwgbmV3bGluZXMgb3Igc2VwYXJhdG9ycywKICAqIG9yIGVsc2UgdGhlIHVzdWFsIHBhcmFkZSBvZiB6ZXJvIG9yIG1vcmUgc3RhdGVtZW50cy4KICAqLwpibG9ja0JvZHkKICAgICAgICA6ICAgLy8gQWxsb3cgYWxtb3N0IGFueSBleHByZXNzaW9uLCBhcyBsb25nIGFzIGl0IHN0YW5kcyBjb21wbGV0ZWx5IGFsb25lIGluIHRoZSBibG9jay4KICAgICAgICAgICAgICAgIC8vIFRoZSBleHByZXNzaW9uIG11c3Qgbm90IGNvbnRhaW4gbGluZSBicmVha3Mgb3V0c2lkZSBvZiBwYXJlbnRoZXNlcy4KICAgICAgICAgICAgICAgIC8vIERFQ0lERTogSWxsZWdhbGl0eSBvZiBsaW5lIGJyZWFrcy4gIEZvcmNlcyBjb2RlcnMgdG8gcGxhY2UgdGhlIFJDVVJMWSByaWdodCBhZnRlciB0aGUgZXhwcmVzc2lvbjogIHsxKzF9LgogICAgICAgICAgICAgICAgLy8gVGhpcyBtYWtlcyBleHByZXNzaW9uLWJlYXJpbmcgYmxvY2tzIGxvb2sgbW9yZSBkaXN0aW5jdC4KICAgICAgICAgICAgICAgIChiYWxhbmNlZFRva2Vuc05vU2VwIChSQ1VSTFkgfCBFT0YpKSA9PiAoYXNzaWdubWVudEV4cHJlc3Npb24gKFJDVVJMWSB8IEVPRikpID0+IGV4cHJlc3Npb25Ob3RCT1IKCiAgICAgICAgfCAgICAgICAvLyBpbmNsdWRlIHRoZSAocG9zc2libHktZW1wdHkpIGxpc3Qgb2Ygc3RhdGVtZW50cwogICAgICAgICAgICAgICAgKHN0YXRlbWVudCk/IChzZXAhIChzdGF0ZW1lbnQpPykqCiAgICAgICAgOwoKLy8gU3BlY2lhbCByZXN0cmljdGlvbjogIExvZ2ljYWwgT1IgZXhwcmVzc2lvbnMgY2Fubm90IG9jY3VyIGF0IHN0YXRlbWVudCBsZXZlbCwgbm90IGV2ZW4gYXMge2EuLi58Yi4uLn0uCi8vIFRoaXMgcmVzdHJpY3Rpb24gaGVscHMgcHJvZ3JhbW1lcnMgYXZvaWQgaW5hZHZlcnRhbnRseSBjcmVhdGluZyBjbG9zdXJlIGFyZ3VtZW50cy4KLy8gTm90ZSBwZXJuaWNpb3VzIGNhc2UgIzE6ICB7aXR8MX0uICBEb2VzIHRoaXMgbWVhbiBzZXQgdGhlIGxvdy1vcmRlciBiaXQgb2YgdGhlIGFyZ3VtZW50LCBvciByZXR1cm4gY29uc3RhbnQgMT8KLy8gTm90ZSBwZXJuaWNpb3VzIGNhc2UgIzI6ICB7eHh8MX0uICBEb2VzIHRoaXMgbWVhbiBhZGQgdGhlIGxvdy1vcmRlciBiaXQgaW50byB4eCwgb3IgcmV0dXJuIGNvbnN0YW50IDE/Ci8vIEluIGJvdGggY2FzZXMsIHRoZSBiYXIgaXMgImVhZ2VybHkiIHRha2VuIHRvIGJlIGEgY2xvc3VyZSBhcmd1bWVudCBkZWxpbWl0ZXIuCmV4cHJlc3Npb25Ob3RCT1IKICAgICAgICA6ICAgZTpleHByZXNzaW9uCiAgICAgICAgICAgICAgICB7cmVxdWlyZSgjZS5nZXRUeXBlKCkgIT0gQk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHByZXNzaW9uIGluIGJsb2NrOyBjYW5ub3QgYmUgb2YgdGhlIGZvcm0gYXxiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jbG9zZSB0aGUgZXhwcmVzc2lvbiBwYXJlbnRoZXNlcyAoYXxiKSIpO30KICAgICAgICA7CgovKiogQSBibG9jayB3aGljaCBpcyBrbm93biB0byBiZSBhIGNsb3N1cmUsIGV2ZW4gaWYgaXQgaGFzIG5vIGFwcGFyZW50IGFyZ3VtZW50cy4KICovCmNsb3NlZEJsb2NrCiAgICAgICAgOiAgICAgICBsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShDTE9TRURfQkxPQ0spO30KICAgICAgICAgICAgICAgICggKCBubHMgY2xvc3VyZVBhcmFtZXRlcnNTdGFydCApID0+CiAgICAgICAgICAgICAgICAgICAgICAgIG5scyEgY2xvc3VyZVBhcmFtZXRlcnMKICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXRQYXJhbWV0ZXJzICAvLyBpbXBsaWNpdCB7aXR8Li4ufSBvciB7P25vbmFtZXwuLi59CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBibG9ja0JvZHkKICAgICAgICAgICAgICAgIFJDVVJMWSEKICAgICAgICA7CgovKiogQSBibG9jayBpbnNpZGUgYW4gZXhwcmVzc2lvbiBpcyBhc3N1bWVkIHRvIGJlIGEgY2xvc3VyZSwgdW5sZXNzIGl0IGlzIGRvdWJsZSBicmFjZWQuCiAqICBERUNJREU6IFBST1BPU0FMOiBEb3VibGUgYnJhY2luZyBhbHdheXMgZm9yY2VzIGFuIG9wZW4gYmxvY2suCiAqICBUaGlzIHN5bnRheCBpcyB1c2VmdWwgZm9yIHBhc3Npbmcgb24gYSBwcmUtZXhpc3RpbmcgY2xvc3VyZSB0byBhIGNhbGwsIHJhdGhlciB0aGFuIGJ1aWxkaW5nIGFub3RoZXIuCiAqICBFeGFtcGxlOiAgPGNvZGU+ZGVmIGZvckVhY2hUd2ljZShDbG9zdXJlIHkpIHsgZm9yRWFjaHt7eX19OyBmb3JFYWNoe3t5fX0gfTwvY29kZT4KICogIEluIHRoZSBhYnNlbmNlIG9mIGRvdWJsZSBicmFjaW5nLCB0aGUgYmxvY2sgbWF5IGFsd2F5cyBiZSBpbnRlcnByZXRlZCBhcyBhIGNsb3N1cmUsCiAqICBldmVuIHRob3VnaCBpdHMgc3ludGFjdGljIGNvbnRleHQgbWF5IHJlcXVpcmUgdGhhdCB0aGUgY2xvc3VyZSBiZSBpbW1lZGlhdGVseSBpbnZva2VkLgogKi8KZXhwcmVzc2lvbkJsb2NrCiAgICAgICAgOiAgIChMQ1VSTFkgTENVUkxZIGJhbGFuY2VkVG9rZW5zIFJDVVJMWSBSQ1VSTFkpID0+CiAgICAgICAgICAgICAgICBMQ1VSTFkhIG9wZW5CbG9jayBSQ1VSTFkhCiAgICAgICAgfCAgIGNsb3NlZEJsb2NrCiAgICAgICAgOwoKLyoqIEFuIGFwcGVuZGVkIGJsb2NrIGZvbGxvd3MgYSBtZXRob2QgbmFtZSBvciBtZXRob2QgYXJndW1lbnQgbGlzdC4KICogIEl0IGlzIG9wdGlvbmFsbHkgbGFiZWxlZC4gIERFQ0lERTogIEEgZ29vZCBydWxlPwogKi8KYXBwZW5kZWRCbG9jawogICAgICAgIDoKICAgICAgICAvKgogICAgICAgICAgICAoSURFTlQgQ09MT04gbmxzIExDVVJMWSk9PgogICAgICAgICAgICAgICAgSURFTlQgYzpDT0xPTl4geyNjLnNldFR5cGUoTEFCRUxFRF9BUkcpO30gbmxzIQogICAgICAgICAgICAgICAgZXhwcmVzc2lvbkJsb2NrCiAgICAgICAgfAogICAgICAgICovCiAgICAgICAgICAgICAgICBleHByZXNzaW9uQmxvY2sKICAgICAgICA7CgovKiogQSBibG9jayBrbm93biB0byBiZSBhIGNsb3N1cmUsIGJ1dCB3aGljaCBvbWl0cyBpdHMgYXJndW1lbnRzLCBpcyBnaXZlbiB0aGlzIHBsYWNlaG9sZGVyLgogKiAgQSBzdWJzZXF1ZW50IHBhc3MgaXMgcmVzcG9uc2libGUgZm9yIGRlY2lkaW5nIGlmIHRoZXJlIGlzIGFuIGltcGxpY2l0ICdpdCcgcGFyYW1ldGVyLAogKiAgb3IgaWYgdGhlIHBhcmFtZXRlciBsaXN0IHNob3VsZCBiZSBlbXB0eS4KICovCmltcGxpY2l0UGFyYW1ldGVycwogICAgICAgIDogICB7ICAgI2ltcGxpY2l0UGFyYW1ldGVycyA9ICMoI1tJTVBMSUNJVF9QQVJBTUVURVJTLCJJTVBMSUNJVF9QQVJBTUVURVJTIl0pOyAgfQogICAgICAgIDsKCi8qKiBBIHN1Yi1ibG9jayBvZiBhIGJsb2NrIGNhbiBiZSBlaXRoZXIgb3BlbiBvciBjbG9zZWQuCiAqICBJdCBpcyBjbG9zZWQgaWYgYW5kIG9ubHkgaWYgdGhlcmUgYXJlIGV4cGxpY2l0IGNsb3N1cmUgYXJndW1lbnRzLgogKiAgQ29tcGFyZSB0aGlzIHRvIGEgYmxvY2sgd2hpY2ggaXMgYXBwZW5kZWQgdG8gYSBtZXRob2QgY2FsbCwKICogIHdoaWNoIGlzIGdpdmVuIGNsb3N1cmUgYXJndW1lbnRzLCBldmVuIGlmIHRoZXkgYXJlIG5vdCBleHBsaWNpdCBpbiB0aGUgY29kZS4KICovCm9wZW5PckNsb3NlZEJsb2NrCiAgICAgICAgOiAgIChMQ1VSTFkgbmxzIGNsb3N1cmVQYXJhbWV0ZXJzU3RhcnQgKSA9PgogICAgICAgICAgICAgICAgY2xvc2VkQmxvY2sKICAgICAgICB8ICAgICAgIG9wZW5CbG9jawogICAgICAgIDsKCnN0YXRlbWVudAoJLy8gQSBsaXN0IG9mIHN0YXRlbWVudHMgaW4gY3VybHkgYnJhY2VzIC0tIHN0YXJ0IGEgbmV3IHNjb3BlIQoJLy8gRnJlZS1mbG9hdGluZyBibG9ja3MgbXVzdCBiZSBsYWJlbGVkIG9yIGRvdWJsZS1icmFjZWQsIHRvIGRlZmVuZCBhZ2FpbnN0IHR5cG9zLgogICAgICAgIDogICAgICAgKExDVVJMWSBMQ1VSTFkgYmFsYW5jZWRUb2tlbnMgUkNVUkxZIFJDVVJMWSkgPT4KICAgICAgICAgICAgICAgIExDVVJMWSEgb3Blbk9yQ2xvc2VkQmxvY2sgUkNVUkxZIQogICAgICAgIHwgICAgICAgY29tcG91bmRTdGF0ZW1lbnQKCQl7cmVxdWlyZShmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW1iaWd1b3VzIGZyZWUtZmxvYXRpbmcgYmxvY2sgaGVhZHsuLi59IG5lZWRzIGNvbnRleHQgdG8gZGV0ZXJtaW5lIGlmIGl0J3Mgb3BlbiBvciBjbG9zZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXJyb3VuZCB7Li4ufSB3aXRoIGV4dHJhIGJyYWNlcyB7ey4uLn19IG9yIHVzZSBpdCBhcyBhIGNsb3N1cmUgaW4gYW4gZXhwcmVzc2lvbiB4PXsuLi59Iik7fQoKCS8vIGRlY2xhcmF0aW9ucyBhcmUgYW1iaWd1b3VzIHdpdGggIklEIERPVCIgcmVsYXRpdmUgdG8gZXhwcmVzc2lvbgoJLy8gc3RhdGVtZW50cy4gTXVzdCBiYWNrdHJhY2sgdG8gYmUgc3VyZS4gQ291bGQgdXNlIGEgc2VtYW50aWMKCS8vIHByZWRpY2F0ZSB0byB0ZXN0IHN5bWJvbCB0YWJsZSB0byBzZWUgd2hhdCB0aGUgdHlwZSB3YXMgY29taW5nCgkvLyB1cCwgYnV0IHRoYXQncyBwcmV0dHkgaGFyZCB3aXRob3V0IGEgc3ltYm9sIHRhYmxlIDspCgl8CShkZWNsYXJhdGlvblN0YXJ0KT0+IAogICAgICAgICAgICAgICAgZGVjbGFyYXRpb24KCgkvLyBBbiBleHByZXNzaW9uIHN0YXRlbWVudC4gVGhpcyBjb3VsZCBiZSBhIG1ldGhvZCBjYWxsLAoJLy8gYXNzaWdubWVudCBzdGF0ZW1lbnQsIG9yIGFueSBvdGhlciBleHByZXNzaW9uIGV2YWx1YXRlZCBmb3IKCS8vIHNpZGUtZWZmZWN0cy4KCXwJZXhwcmVzc2lvblN0YXRlbWVudCAKCgkvL1RPRE86IHdoYXQgYWJvdXIgaW50ZXJmYWNlcywgZW51bXMgYW5kIGFubm90YXRpb25zCgkvLyBjbGFzcyBkZWZpbml0aW9uCgl8CShtOm1vZGlmaWVycyEpPyBjbGFzc0RlZmluaXRpb25bI21dCgoJLy8gQXR0YWNoIGEgbGFiZWwgdG8gdGhlIGZyb250IG9mIGEgc3RhdGVtZW50CiAgICAgICAgLy8gVGhpcyBibG9jayBpcyBleGVjdXRlZCBmb3IgZWZmZWN0LCB1bmxlc3MgaXQgaGFzIGFuIGV4cGxpY2l0IGNsb3N1cmUgYXJndW1lbnQuCiAgICAgICAgfCAgICAgICBJREVOVCBjOkNPTE9OXiB7I2Muc2V0VHlwZShMQUJFTEVEX1NUQVQpO30KICAgICAgICAgICAgICAgICggICAoTENVUkxZKSA9PiBvcGVuT3JDbG9zZWRCbG9jawogICAgICAgICAgICAgICAgfCAgIHN0YXRlbWVudAogICAgICAgICAgICAgICAgKQoKCS8vIElmLWVsc2Ugc3RhdGVtZW50CiAgICAgICAgLy8gTm90ZTogIFRoZXJlIGlzIG5vIG5scyBuZXh0IHRvIGVpdGhlciBwYXJlbiwgZXZlbiB0aG91Z2ggaXQgd291bGQgYmUgaW5jcmVhc2UgY29tcGF0aWJpbGl0eQogICAgICAgIC8vIHdpdGggdmFyaW91cyBzdHlsZXMgb2YgSmF2YSBpbmRlbnRpbmcuICBUaGUgImlmIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIGNvbnN0cmFpbnRzIG9uIHdoaXRlCiAgICAgICAgLy8gc3BhY2UgYXMgYSBtZXRob2QgY2FsbCBzdGF0ZW1lbnQgbGlrZSAiaWZsaWtlbWV0aG9kIChhcmdzKSB7IGJvZHkgfSIuICBCeSByZXN0cmljdGluZwogICAgICAgIC8vIG5ld2xpbmVzIGluIGJvdGggY29uc3RydWN0cyBpbiBzaW1pbGFyIHdheXMsIHdlIG1ha2UgR3Jvb3Z5IGludGVybmFsbHkgY29uc2lzdGVudCwKICAgICAgICAvLyBhdCBhIG1pbm9yIGNvc3QgdG8gY29tcGF0aWJpbGl0eSB3aXRoIEphdmEuCiAgICAgICAgfCAgICAgICAiaWYiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBjb21wYXRpYmxlQm9keVN0YXRlbWVudAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAvLyBDT05GTElDVDogdGhlIG9sZCAiZGFuZ2xpbmctZWxzZSIgcHJvYmxlbS4uLgogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlIG1hdGNoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhcyBzb29uIGFzIHBvc3NpYmxlLiAgSHVzaCB3YXJuaW5nLgogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgKHNlcCEpPyAgLy8gYWxsb3cgU0VNSSBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggSmF2YQogICAgICAgICAgICAgICAgICAgICAgICAiZWxzZSIhIG5scyEgY29tcGF0aWJsZUJvZHlTdGF0ZW1lbnQKICAgICAgICAgICAgICAgICk/CgoJLy8gRm9yIHN0YXRlbWVudAoJfAlmb3JTdGF0ZW1lbnQKCgkvLyBXaGlsZSBzdGF0ZW1lbnQKCXwJIndoaWxlIl4gTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgY29tcGF0aWJsZUJvZHlTdGF0ZW1lbnQKCgkvKk9CUyogbm8gZG8td2hpbGUgc3RhdGVtZW50IGluIEdyb292eSAodG9vIGFtYmlndW91cykKCS8vIGRvLXdoaWxlIHN0YXRlbWVudAoJfAkiZG8iXiBzdGF0ZW1lbnQgIndoaWxlIiEgTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgU0VNSSEKCSpPQlMqLwoJLy8gV2l0aCBzdGF0ZW1lbnQKICAgICAgICAvLyAoVGhpcyBpcyB0aGUgR3Jvb3Z5IHNjb3BlLXNoaWZ0IG1lY2hhbmlzbSwgdXNlZCBmb3IgYnVpbGRlcnMuKQogICAgICAgIHwgICAgICAgIndpdGgiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBjb21wb3VuZFN0YXRlbWVudAogICAgICAgIAogICAgICAgIC8vIFNwbGljZSBzdGF0ZW1lbnQsIG1lYW5pbmdmdWwgb25seSBpbnNpZGUgYSAid2l0aCIgZXhwcmVzc2lvbi4KICAgICAgICAvLyBQUk9QT1NFRCwgREVDSURFLiAgUHJldmVudHMgdGhlIG5hbWVzcGFjZSBwb2xsdXRpb24gb2YgYSAidGV4dCIgbWV0aG9kIG9yIHNvbWUgc3VjaC4KICAgICAgICB8ICAgc3A6U1RBUl4gbmxzISAgICAgICAgICAgICAgICAgICAgICAgeyNzcC5zZXRUeXBlKFNQUkVBRF9BUkcpO30KICAgICAgICAgICAgICAgIGV4cHJlc3Npb25TdGF0ZW1lbnQKICAgICAgICAvLyBFeGFtcGxlOiAgd2l0aChodG1sYnVpbGRlcikgeyBoZWFke30gYm9keXsgKiJzb21lIHRleHQiIH0gfQogICAgICAgIC8vIEVxdWl2YWxlbnQgdG86ICB7IGh0bWxidWlsZGVyLmhlYWR7fSBodG1sYnVpbGRlci5ib2R5eyAoaHRtbGJ1aWxkZXIgYXMgQ29sbGVjdGlvbikuYWRkKCJzb21lIHRleHQiKSB9IH0KCiAgICAgICAgLy8gSW1wb3J0IHN0YXRlbWVudC4gIENhbiBiZSB1c2VkIGluIGFueSBzY29wZS4gIEhhcyAiaW1wb3J0IHggYXMgeSIgYWxzby4KICAgICAgICB8ICAgaW1wb3J0U3RhdGVtZW50CgoJLy8gc3dpdGNoL2Nhc2Ugc3RhdGVtZW50Cgl8CSJzd2l0Y2giXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBMQ1VSTFkhCgkJCSggY2FzZXNHcm91cCApKgoJCVJDVVJMWSEKCgkvLyBleGNlcHRpb24gdHJ5LWNhdGNoIGJsb2NrCgl8CXRyeUJsb2NrCgoJLy8gc3luY2hyb25pemUgYSBzdGF0ZW1lbnQKCXwJInN5bmNocm9uaXplZCJeIExQQVJFTiEgZXhwcmVzc2lvbiBSUEFSRU4hIGNvbXBvdW5kU3RhdGVtZW50CgoKCS8qT0JTKgoJLy8gZW1wdHkgc3RhdGVtZW50Cgl8CXM6U0VNSSB7I3Muc2V0VHlwZShFTVBUWV9TVEFUKTt9CgkqT0JTKi8KCgkvLyBOT1RFOiBzb21lIGFsdGVybmF0aW9ucyBoYXZlIGJlZW4gbW92ZWQgdG8gJ2JyYW5jaEV4cHJlc3Npb24nCgk7Cgpmb3JTdGF0ZW1lbnQKCToJZjoiZm9yIl4KCQlMUEFSRU4hCgkJCSgJKGZvckluaXQgU0VNSSk9PnRyYWRpdGlvbmFsRm9yQ2xhdXNlCgkJCS8vICpPQlMqIAoJCQkvLyBUaGVyZSdzIG5vIG5lZWQgYXQgYWxsIGZvciBzcXVlZXppbmcgaW4gdGhlIG5ldyBKYXZhIDUgImZvciIKICAvLyBzeW50YXgsIHNpbmNlIEdyb292eSdzIGlzIGEgc3VpdGFibGUgYWx0ZXJuYXRpdmUuCgkJIC8vIHwJKHBhcmFtZXRlckRlY2xhcmF0aW9uIENPTE9OKT0+IGZvckVhY2hDbGF1c2UKCSAgLy8gKk9CUyoKCQkJfCAgICAgICAvLyB0aGUgY29hc3QgaXMgY2xlYXI7IGl0J3MgYSBtb2Rlcm4gR3Jvb3Z5IGZvciBzdGF0ZW1lbnQKCQkJCWZvckluQ2xhdXNlCgkJCSkKCQlSUEFSRU4hCgkJY29tcGF0aWJsZUJvZHlTdGF0ZW1lbnQJCQkJCSAvLyBzdGF0ZW1lbnQgdG8gbG9vcCBvdmVyCgk7Cgp0cmFkaXRpb25hbEZvckNsYXVzZQoJOgoJCWZvckluaXQgU0VNSSEJLy8gaW5pdGlhbGl6ZXIKCQlmb3JDb25kIFNFTUkhCS8vIGNvbmRpdGlvbiB0ZXN0CgkJZm9ySXRlcgkJCS8vIHVwZGF0ZXIKCTsKCi8qT0JTKgpmb3JFYWNoQ2xhdXNlCgk6CgkJcDpwYXJhbWV0ZXJEZWNsYXJhdGlvbiBDT0xPTiEgZXhwcmVzc2lvbgoJCXsjZm9yRWFjaENsYXVzZSA9ICMoI1tGT1JfRUFDSF9DTEFVU0UsIkZPUl9FQUNIX0NMQVVTRSJdLCAjZm9yRWFjaENsYXVzZSk7fQoJOwoqT0JTKi8KCmZvckluQ2xhdXNlCiAgICAgICAgOiAgICAgICAoICAgKGRlY2xhcmF0aW9uU3RhcnQpPT4KICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlRGVjbGFyYXRpb25Ob0luaXQKICAgICAgICAgICAgICAgIHwgICBJREVOVAogICAgICAgICAgICAgICAgfCAgICJpdCIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGk6ImluIl4gICAgICAgICB7I2kuc2V0VHlwZShGT1JfSU5fSVRFUkFCTEUpO30KICAgICAgICAgICAgICAgIHNoaWZ0RXhwcmVzc2lvbgogICAgICAgIDsKCi8qKiBJbiBKYXZhLCAiaWYiLCAid2hpbGUiLCBhbmQgImZvciIgc3RhdGVtZW50cyBjYW4gdGFrZSByYW5kb20sIG5vbi1icmFjZWQgc3RhdGVtZW50cyBhcyB0aGVpciBib2RpZXMuCiAqICBTdXBwb3J0IHRoaXMgcHJhY3RpY2UsIGV2ZW4gdGhvdWdoIGl0IGlzbid0IHZlcnkgR3Jvb3Z5LgogKi8KY29tcGF0aWJsZUJvZHlTdGF0ZW1lbnQKICAgICAgICA6ICAgKExDVVJMWSk9PgogICAgICAgICAgICAgICAgY29tcG91bmRTdGF0ZW1lbnQKICAgICAgICB8CiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQKICAgICAgICA7CgovKiBUT0RPIC0gUVVFU1RJT04gLSB3aHkgZG8gd2UgdXNlICdhc3NpZ25tZW50RXhwcmVzc2lvbicgaW5zdGVhZCBvZiAnZXhwcmVzc2lvbicgaW5zaWRlIGVhY2ggYnJhbmNoRXhwcmVzc2lvbiBwcm9kdWN0aW9uICovCi8qKiBJbiBHcm9vdnksIHJldHVybiwgYnJlYWssIGNvbnRpbnVlLCB0aHJvdywgYW5kIGFzc2VydCBjYW4gYmUgdXNlZCBpbiBhbnkgZXhwcmVzc2lvbiBjb250ZXh0LgogKiAgRXhhbXBsZTogIHByaW50bG4gKHggfHwgcmV0dXJuKTsgIHByaW50bG4gYXNzZXJ0IHgsICJ3b24ndCBwcmludCBhIGZhbHNlIHZhbHVlISIKICogIElmIGFuIG9wdGlvbmFsIGV4cHJlc3Npb24gaXMgbWlzc2luZywgaXRzIHZhbHVlIGlzIHZvaWQgKHRoaXMgY29lcmNlcyB0byBudWxsIHdoZW4gYSB2YWx1ZSBpcyByZXF1aXJlZCkuCiAqLwpicmFuY2hFeHByZXNzaW9uCiAgICAgICAgOgogICAgICAgIC8vIFJldHVybiBhbiBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAicmV0dXJuIl4gKGFzc2lnbm1lbnRFeHByZXNzaW9uKT8KCiAgICAgICAgLy8gYnJlYWs6ICBnZXQgb3V0IG9mIGEgbG9vcCwgb3Igc3dpdGNoLCBvciBtZXRob2QgY2FsbAogICAgICAgIC8vIGNvbnRpbnVlOiAgZG8gbmV4dCBpdGVyYXRpb24gb2YgYSBsb29wLCBvciBsZWF2ZSBhIGNsb3N1cmUKICAgICAgICB8ICAgICAgICgiYnJlYWsiXiB8ICJjb250aW51ZSJeKQogICAgICAgICAgICAgICAgKCAgIElERU5UCiAgICAgICAgICAgICAgICAgICAgICAgICggICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPTiEgYXNzaWdubWVudEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICk/CgogICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbgogICAgICAgIHwgICAgICAgInRocm93Il4gYXNzaWdubWVudEV4cHJlc3Npb24hCgoKCS8vIFRPRE8gLSBkZWNpZGUgb24gZGVmaW5pdGl2ZSAnYXNzZXJ0JyBzdGF0ZW1lbnQgaW4gZ3Jvb3Z5ICgxLjQgYW5kfG9yIGdyb292eSkKCS8vIGFzc2VydHMKCS8vIDEuNCsgLi4uCgkvLyAgICAgIHwJImFzc2VydCJeIGV4cHJlc3Npb24gKCBDT0xPTiEgZXhwcmVzc2lvbiApPwoJCgkvLyBncm9vdnkgYXNzZXJ0aW9uLi4uCiAgICAgICAgfCAgICAgICAiYXNzZXJ0Il4gYXNzaWdubWVudEV4cHJlc3Npb24KICAgICAgICAgICAgICAgICggICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUEhIGFzc2lnbm1lbnRFeHByZXNzaW9uCiAgICAgICAgICAgICAgICApPwoJCgogICAgICAgIC8vIE5vdGU6ICBUaGUgY29sb24gaXMgdG9vIHNwZWNpYWwgaW4gR3Jvb3Z5OyB3ZSBtb2RpZnkgdGhlIEZPUiBhbmQgQVNTRVJUIHN5bnRheCB0byBkaXNwZW5zZSB3aXRoIGl0LgogICAgICAgIDsKCgovKiogQW55IHN0YXRlbWVudCB3aGljaCBiZWdpbnMgd2l0aCBhbiBleHByZXNzaW9uLCBjYWxsZWQgdGhlICJoZWFkIi4KICogIFRoZSBoZWFkIGNhbiBiZSBmb2xsb3dlZCBieSBjb21tYW5kIGFyZ3VtZW50czogIHt4LnkgYSxifSwge3hbeV0gYSxifSwgZXZlbiB7Zih4KSB5fS4KICogIE9yLCB0aGUgaGVhZCBjYW4gYmUgZm9sbG93ZWQgYnkgYW4gYXNzaWdubWVudCBvcGVyYXRvcjogIHt4LnkgPSB6fSwge3gueVthXSArK30sIHt4LnkoYSkgKz0gen0sIGV0Yy4KICogIFRvIGNhdGNoIHNpbXBsZSBlcnJvcnMsIGV4cHJlc3Npb25zIGF0IHN0YXRlbWVudCBsZXZlbCBoYXZlIGEgbGltaXRlZCBzZXQgb2Ygc3ludGF4ZXMuCiAqICBGb3IgZXhhbXBsZSwge3ByaW50IHg7ICt5fSBpcyBhIHN5bnRheCBlcnJvci4gIChKYXZhIGRvZXMgdGhpcyB0cmljayBhbHNvLikKICogIElmIHlvdSByZWFsbHkgd2FudCBzb21ldGhpbmcgd2VpcmQsIHdyYXAgaXQgaW4gcGFyZW50aGVzZXMgb3IgY3VybHkgYnJhY2VzLgogKi8KLy8gIGlkKGEpLCB4LmlkKGEpLCAoeCkuaWQoYSksIGV0Yy47IGlkey4uLn0sIHguaWR7Li4ufSwgKHgpLmlkey4uLn0sIGV0Yy4KZXhwcmVzc2lvblN0YXRlbWVudAogICAgICAgICAgICAgICAgeyBib29sZWFuIGVuZEJyYWNrZXRzID0gZmFsc2U7IH0KICAgICAgICA6ICAgZW5kQnJhY2tldHM9CiAgICAgICAgICAgICAgICBoZWFkOnBhdGhFeHByZXNzaW9uIQogICAgICAgICAgICAgICAgKCAgICAgICB7IWVuZEJyYWNrZXRzfT8KICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEFyZ3VtZW50c1sjaGVhZF0KICAgICAgICAgICAgICAgIHwgICBhc3NpZ25tZW50VGFpbFsjaGVhZF0KICAgICAgICAgICAgICAgIHwgICB7I2V4cHJlc3Npb25TdGF0ZW1lbnQgPSAjaGVhZDt9ICAvLyBubyBjb21tYW5kIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgeyAgIC8vIERvIGFuIGVycm9yIGNoZWNrIG9uIHRoZSBmb2xsb3dpbmcgdG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoTEEoMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSQ1VSTFk6IGNhc2UgUkJSQUNLOiBjYXNlIFJQQVJFTjogY2FzZSBTRU1JOiBjYXNlIE5MUzogY2FzZSBFT0Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgZm9sbG93ZWQgYnkgZ2FyYmFnZSBpbiBmLi4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudGhlc2l6ZSBjb3JyZWN0IGFyZ3VtZW50IGxpc3QgZiguLi4pIG9yIHdob2xlIGV4cHJlc3Npb24gKGYoKS4uLikiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIHwKICAgICAgICAgICAgICAgIC8vIFByZWZpeCBpbmNyZW1lbnQ7IGEgc3BlY2lhbCBjYXNlIG9mIGFzc2lnbm1lbnQgc3RhdGVtZW50LgogICAgICAgICAgICAgICAgKElOQ14gfCBERUNeKSBlbmRCcmFja2V0cz1wYXRoRXhwcmVzc2lvbgogICAgICAgIHwKICAgICAgICAgICAgICAgIGJyYW5jaEV4cHJlc3Npb24KICAgICAgICA7CgpjYXNlc0dyb3VwCgk6CSgJLy8gQ09ORkxJQ1Q6IHRvIHdoaWNoIGNhc2UgZ3JvdXAgZG8gdGhlIHN0YXRlbWVudHMgYmluZD8KCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlOiBpdCBncm91cHMgdGhlCgkJCS8vIG1hbnkgImNhc2UiLyJkZWZhdWx0IiBsYWJlbHMgdG9nZXRoZXIgdGhlbgoJCQkvLyBmb2xsb3dzIHRoZW0gd2l0aCB0aGUgc3RhdGVtZW50cwoJCQlvcHRpb25zIHsKCQkJCWdyZWVkeSA9IHRydWU7CgkJCX0KCQkJOgoJCQlhQ2FzZQoJCSkrCgkJY2FzZVNMaXN0CgkJeyNjYXNlc0dyb3VwID0gIyhbQ0FTRV9HUk9VUCwgIkNBU0VfR1JPVVAiXSwgI2Nhc2VzR3JvdXApO30KCTsKCmFDYXNlCgk6CSgiY2FzZSJeIGV4cHJlc3Npb24gfCAiZGVmYXVsdCIpIENPTE9OISBubHMhCgk7CgpjYXNlU0xpc3QKCToJc3RhdGVtZW50IChzZXAhIChzdGF0ZW1lbnQpPykqCgkJeyNjYXNlU0xpc3QgPSAjKCNbU0xJU1QsIlNMSVNUIl0sI2Nhc2VTTGlzdCk7fQoJOwoKLy8gVGhlIGluaXRpYWxpemVyIGZvciBhIGZvciBsb29wCi8vIFRoZSBjb250cm9sRXhwcmVzc2lvbkxpc3QgcHJvZHVjdGlvbiBpbmNsdWRlcyBkZWNsYXJhdGlvbnMgYXMgYSBwb3NzaWJpbGl0eQpmb3JJbml0CiAgICAgICAgOiAgICAgICAoY29udHJvbEV4cHJlc3Npb25MaXN0KT8KICAgICAgICAgICAgICAgIHsjZm9ySW5pdCA9ICMoI1tGT1JfSU5JVCwiRk9SX0lOSVQiXSwjZm9ySW5pdCk7fQogICAgICAgIDsKCmZvckNvbmQKCToJKGV4cHJlc3Npb24pPwoJCXsjZm9yQ29uZCA9ICMoI1tGT1JfQ09ORElUSU9OLCJGT1JfQ09ORElUSU9OIl0sI2ZvckNvbmQpO30KCTsKCmZvckl0ZXIKCToJKGNvbnRyb2xFeHByZXNzaW9uTGlzdCk/CgkJeyNmb3JJdGVyID0gIygjW0ZPUl9JVEVSQVRPUiwiRk9SX0lURVJBVE9SIl0sI2Zvckl0ZXIpO30KCTsKCi8vIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRyeS9jYXRjaCBibG9jawp0cnlCbG9jawogICAgICAgIDogICAgICAgInRyeSJeIGNvbXBvdW5kU3RhdGVtZW50CiAgICAgICAgICAgICAgICAoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiAgbmxzISBoYW5kbGVyKSoKICAgICAgICAgICAgICAgICggb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6ICBubHMhIGZpbmFsbHlDbGF1c2UpPwogICAgICAgIDsKCmZpbmFsbHlDbGF1c2UKCToJImZpbmFsbHkiXiBjb21wb3VuZFN0YXRlbWVudAoJOwoKLy8gYW4gZXhjZXB0aW9uIGhhbmRsZXIKaGFuZGxlcgoJOgkiY2F0Y2giXiBMUEFSRU4hIHBhcmFtZXRlckRlY2xhcmF0aW9uIFJQQVJFTiEgY29tcG91bmRTdGF0ZW1lbnQKCTsKCgphc3NpZ25tZW50VGFpbFtBU1QgaGVhZF0KICAgICAgICA6CiAgICAgICAgICAgICAgICB7I2Fzc2lnbm1lbnRUYWlsID0gaGVhZDt9CiAgICAgICAgICAgICAgICAoICAgQVNTSUdOXgogICAgICAgICAgICAgICAgfCAgIFBMVVNfQVNTSUdOXgogICAgICAgICAgICAgICAgfCAgIE1JTlVTX0FTU0lHTl4KICAgICAgICAgICAgICAgIHwgICBTVEFSX0FTU0lHTl4KICAgICAgICAgICAgICAgIHwgICBESVZfQVNTSUdOXgogICAgICAgICAgICAgICAgfCAgIE1PRF9BU1NJR05eCiAgICAgICAgICAgICAgICB8ICAgU1JfQVNTSUdOXgogICAgICAgICAgICAgICAgfCAgIEJTUl9BU1NJR05eCiAgICAgICAgICAgICAgICB8ICAgU0xfQVNTSUdOXgogICAgICAgICAgICAgICAgfCAgIEJBTkRfQVNTSUdOXgogICAgICAgICAgICAgICAgfCAgIEJYT1JfQVNTSUdOXgogICAgICAgICAgICAgICAgfCAgIEJPUl9BU1NJR05eCiAgICAgICAgICAgICAgICAvL3wgICBVU0VST1BfMTNeICAvL0RFQ0lERTogVGhpcyBpcyBob3cgdXNlci1kZWZpbmUgb3BzIHdvdWxkIHNob3cgdXAuCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBubHMhCiAgICAgICAgICAgICAgICBhc3NpZ25tZW50RXhwcmVzc2lvbgogICAgICAgIHwKICAgICAgICAgICAgICAgIHsjYXNzaWdubWVudFRhaWwgPSBoZWFkO30KICAgICAgICAgICAgICAgIGluOklOQ14geyNpbi5zZXRUeXBlKFBPU1RfSU5DKTt9CiAgICAgICAgfAogICAgICAgICAgICAgICAgeyNhc3NpZ25tZW50VGFpbCA9IGhlYWQ7fQogICAgICAgICAgICAgICAgZGU6REVDXiB7I2RlLnNldFR5cGUoUE9TVF9ERUMpO30KICAgICAgICA7CgovKiogQSBtZW1iZXIgbmFtZSAoeC55KSBvciBlbGVtZW50IG5hbWUgKHhbeV0pIGNhbiBzZXJ2ZSBhcyBhIGNvbW1hbmQgbmFtZSwKICogIHdoaWNoIG1heSBiZSBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgYXJndW1lbnRzLgogKi8KY29tbWFuZEFyZ3VtZW50c1tBU1QgaGVhZF0KICAgICAgICA6ICAgeyAgICNjb21tYW5kQXJndW1lbnRzID0gaGVhZDsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChMQSgxKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBMVVM6IGNhc2UgTUlOVVM6IGNhc2UgSU5DOiBjYXNlIERFQzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSOiBjYXNlIERJVjogY2FzZSBNT0Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1I6IGNhc2UgQlNSOiBjYXNlIFNMOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJBTkQ6IGNhc2UgQlhPUjogY2FzZSBCT1I6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2FyYmFnZSBpbmZpeCBvciBwcmVmaXggb3BlcmF0b3IgYWZ0ZXIgY29tbWFuZCBuYW1lIGYgK3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudGhlc2l6ZSBlaXRoZXIgdGhlIHdob2xlIGV4cHJlc3Npb24gKGYreCkgb3IgdGhlIGNvbW1hbmQgYXJndW1lbnRzIGYoK3gpIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gKG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfSA6IENPTU1BISBubHMhIGV4cHJlc3Npb24pKgogICAgICAgICAgICAgICAgLy8gcHJpbnRsbiAyKzIgLy9CQUQKICAgICAgICAgICAgICAgIC8vIHByaW50bG4oMisyKSAvL09LCiAgICAgICAgICAgICAgICAvLyBwcmludGxuICgyKSsyIC8vQkFECiAgICAgICAgICAgICAgICAvLyBwcmludGxuKCgyKSsyKSAvL09LCiAgICAgICAgICAgICAgICAvLyAocHJpbnRsbigyKSsyKSAvL09LCiAgICAgICAgICAgICAgICAvLyBjb21wYXJlICgyKSwgMiAvL0JBRAogICAgICAgICAgICAgICAgLy8gY29tcGFyZSggKDIpLCAyICkgLy9PSwogICAgICAgICAgICAgICAgLy8gZm9vLmJhciBiYXp7YmF0fSwgYmFuZ3tib3p9IC8vT0s/IQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBU1QgaGVhZGlkID0gZ2V0QVNURmFjdG9yeSgpLmR1cCgjaGVhZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRpZC5zZXRUeXBlKE1FVEhPRF9DQUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGlkLnNldFRleHQoIjxjb21tYW5kPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAjY29tbWFuZEFyZ3VtZW50cyA9ICMoaGVhZGlkLCAjY29tbWFuZEFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgOwoKYXNzaWdubWVudE9wCiAgICAgICAgOgogICAgICAgICggICBBU1NJR05eCiAgICAgICAgfCAgIFBMVVNfQVNTSUdOXgogICAgICAgIHwgICBNSU5VU19BU1NJR05eCiAgICAgICAgfCAgIFNUQVJfQVNTSUdOXgogICAgICAgIHwgICBESVZfQVNTSUdOXgogICAgICAgIHwgICBNT0RfQVNTSUdOXgogICAgICAgIHwgICBTUl9BU1NJR05eCiAgICAgICAgfCAgIEJTUl9BU1NJR05eCiAgICAgICAgfCAgIFNMX0FTU0lHTl4KICAgICAgICB8ICAgQkFORF9BU1NJR05eCiAgICAgICAgfCAgIEJYT1JfQVNTSUdOXgogICAgICAgIHwgICBCT1JfQVNTSUdOXgogICAgICAgICkKICAgICAgICA7CgovLyBleHByZXNzaW9ucwovLyBOb3RlIHRoYXQgbW9zdCBvZiB0aGVzZSBleHByZXNzaW9ucyBmb2xsb3cgdGhlIHBhdHRlcm4KLy8gICB0aGlzTGV2ZWxFeHByZXNzaW9uIDoKLy8JICAgbmV4dEhpZ2hlclByZWNlZGVuY2VFeHByZXNzaW9uCi8vCQkgICAoT1BFUkFUT1IgbmV4dEhpZ2hlclByZWNlZGVuY2VFeHByZXNzaW9uKSoKLy8gd2hpY2ggaXMgYSBzdGFuZGFyZCByZWN1cnNpdmUgZGVmaW5pdGlvbiBmb3IgYSBwYXJzaW5nIGFuIGV4cHJlc3Npb24uCi8vIFRoZSBvcGVyYXRvcnMgaW4gamF2YSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZXM6Ci8vCWxvd2VzdCAgKDEzKSAgPSAqPSAvPSAlPSArPSAtPSA8PD0gPj49ID4+Pj0gJj0gXj0gfD0KLy8JCQkoMTIpICA/OgovLwkJCSgxMSkgIHx8Ci8vCQkJKDEwKSAgJiYKLy8JCQkoIDkpICB8Ci8vCQkJKCA4KSAgXgovLwkJCSggNykgICYKLy8JCQkoIDYpICA9PSAhPQovLwkJCSggNSkgIDwgPD0gPiA+PQovLwkJCSggNCkgIDw8ID4+Ci8vCQkJKCAzKSAgKyhiaW5hcnkpIC0oYmluYXJ5KQovLwkJCSggMikgICogLyAlCi8vCQkJKCAxKSAgKysgLS0gKyh1bmFyeSkgLSh1bmFyeSkgIH4gICEgICh0eXBlKQovLwkJCQkgIFtdICAgKCkgKG1ldGhvZCBjYWxsKSAgLiAoZG90IC0tIGlkZW50aWZpZXIgcXVhbGlmaWNhdGlvbikKLy8JCQkJICBuZXcgICAoKSAgKGV4cGxpY2l0IHBhcmVudGhlc2lzKQovLwovLyB0aGUgbGFzdCB0d28gYXJlIG5vdCB1c3VhbGx5IG9uIGEgcHJlY2VkZW5jZSBjaGFydDsgSSBwdXQgdGhlbSBpbgovLyB0byBwb2ludCBvdXQgdGhhdCBuZXcgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiAnLicsIHNvIHlvdQovLyBjYW4gdmFsaWR5IHVzZQovLwkgbmV3IEZyYW1lKCkuc2hvdygpCi8vCi8vIE5vdGUgdGhhdCB0aGUgYWJvdmUgcHJlY2VkZW5jZSBsZXZlbHMgbWFwIHRvIHRoZSBydWxlcyBiZWxvdy4uLgovLyBPbmNlIHlvdSBoYXZlIGEgcHJlY2VkZW5jZSBjaGFydCwgd3JpdGluZyB0aGUgYXBwcm9wcmlhdGUgcnVsZXMgYXMgYmVsb3cKLy8gICBpcyB1c3VhbGx5IHZlcnkgc3RyYWlnaHRmb3dhcmQKCgoKLy8gdGhlIG1vdGhlciBvZiBhbGwgZXhwcmVzc2lvbnMKLy8gVGhpcyBub250ZXJtaW5hbCBpcyBub3QgdXNlZCBmb3IgZXhwcmVzc2lvbiBzdGF0ZW1lbnRzLCB3aGljaCBoYXZlIGEgbW9yZSByZXN0cmljdGVkIHN5bnRheAovLyBkdWUgdG8gcG9zc2libGUgYW1iaWd1aXRpZXMgd2l0aCBvdGhlciBraW5kcyBvZiBzdGF0ZW1lbnRzLiAgVGhpcyBub250ZXJtaW5hbCBpcyB1c2VkIG9ubHkKLy8gaW4gY29udGV4dHMgd2hlcmUgd2Uga25vdyB3ZSBoYXZlIGFuIGV4cHJlc3Npb24uICBJdCBhbGxvd3MgZ2VuZXJhbCBKYXZhLXR5cGUgZXhwcmVzc2lvbnMuCmV4cHJlc3Npb24KICAgICAgICA6ICAgKGRlY2xhcmF0aW9uU3RhcnQpPT4gc2luZ2xlRGVjbGFyYXRpb24KICAgICAgICB8ICAgYnJhbmNoRXhwcmVzc2lvbgogICAgICAgIHwgICAgICAgYXNzaWdubWVudEV4cHJlc3Npb24KICAgICAgICAgICAgICAgIHsjZXhwcmVzc2lvbiA9ICMoI1tFWFBSLCJFWFBSIl0sI2V4cHJlc3Npb24pO30KICAgICAgICA7Ci8vIFRoaXMgaXMgYSBsaXN0IG9mIGV4cHJlc3Npb25zLgpjb250cm9sRXhwcmVzc2lvbkxpc3QKICAgICAgICA6ICAgICAgIGNvbnRyb2xFeHByZXNzaW9uIChDT01NQSEgbmxzISBjb250cm9sRXhwcmVzc2lvbikqCiAgICAgICAgICAgICAgICB7I2NvbnRyb2xFeHByZXNzaW9uTGlzdCA9ICMoI1tFTElTVCwiRUxJU1QiXSwgY29udHJvbEV4cHJlc3Npb25MaXN0KTt9CiAgICAgICAgOwoKLyoqIFVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGluIGEgZmV3IHBsYWNlcyB3aGVyZQogKiAgSmF2YSBleHByZXNpb24gc3RhdGVtZW50cyBhbmQgZGVjbGFyYXRpb25zIGFyZSByZXF1aXJlZC4KICovCmNvbnRyb2xFeHByZXNzaW9uCiAgICAgICAgICAgICAgICB7Ym9vbGVhbiB6ejsgLyppZ25vcmUqLyB9CiAgICAgICAgOiAgICAgICAvLyBpZiBpdCBsb29rcyBsaWtlIGEgZGVjbGFyYXRpb24sIGl0IGlzCiAgICAgICAgICAgICAgICAoZGVjbGFyYXRpb25TdGFydCk9PiBzaW5nbGVEZWNsYXJhdGlvbgogICAgICAgIHwgICAvLyBvdGhlcndpc2UgaXQncyBhIHBsYWluIHN0YXRlbWVudCBleHByZXNzaW9uCiAgICAgICAgICAgICAgICB6ej1oZWFkOnBhdGhFeHByZXNzaW9uIQogICAgICAgICAgICAgICAgKCAgICAgICBhc3NpZ25tZW50VGFpbFsjaGVhZF0KICAgICAgICAgICAgICAgIHwgICB7I2NvbnRyb2xFeHByZXNzaW9uID0gI2hlYWQ7fSAgLy8gbm8gY29tbWFuZCBzeW50YXggaW4gdGhpcyBjb250ZXh0CiAgICAgICAgICAgICAgICApCiAgICAgICAgfAogICAgICAgICAgICAgICAgLy8gUHJlZml4IGluY3JlbWVudDsgYSBzcGVjaWFsIGNhc2Ugb2YgYXNzaWdubWVudCBzdGF0ZW1lbnQuCiAgICAgICAgICAgICAgICAoSU5DXiB8IERFQ14pIHp6PXBhdGhFeHByZXNzaW9uCiAgICAgICAgOwoKLyoqIEEgInBhdGggZXhwcmVzc2lvbiIgaXMgYSBuYW1lIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB2YWx1ZSwgYXNzaWduZWQgdG8sIG9yIGNhbGxlZC4KICogIFVzZXMgaW5jbHVkZSBhc3NpZ25tZW50IHRhcmdldHMsIGNvbW1hbmRzLCBhbmQgdHlwZXMgaW4gZGVjbGFyYXRpb25zLgogKiAgSXQgaXMgY2FsbGVkIGEgInBhdGgiIGJlY2F1c2UgaXQgbG9va3MgbGlrZSBhIGxpbmVhciBwYXRoIHRocm91Z2ggYSBkYXRhIHN0cnVjdHVyZS4KICogIEV4YW1wbGU6ICBhLmJbbl0uYyh4KS5ke3N9CiAqICAoQ29tcGFyZSB0byBhIEMgbHZhbHVlLCBvciBMZWZ0SGFuZFNpZGUgaW4gdGhlIEpMUyBzZWN0aW9uIDE1LjI2LikKICogIEdlbmVyYWwgZXhwcmVzc2lvbnMgYXJlIGJ1aWx0IHVwIGZyb20gcGF0aCBleHByZXNzaW9ucywgdXNpbmcgb3BlcmF0b3JzIGxpa2UgJysnIGFuZCAnPScuCiAqICBOb3RlOiAgQSBwYXRoIGV4cHJlc3Npb24gY2Fubm90IGJlZ2luIHdpdGggYSBibG9jayBvciBjbG9zdXJlLgogKi8KcGF0aEV4cHJlc3Npb24KcmV0dXJucyBbYm9vbGVhbiBlbmRCcmFja2V0cyA9IGZhbHNlXQogICAgICAgIDogICBwZTpwcmltYXJ5RXhwcmVzc2lvbiEKICAgICAgICAgICAgICAgIGVuZEJyYWNrZXRzPQogICAgICAgICAgICAgICAgcGF0aEV4cHJlc3Npb25UYWlsWyNwZV0KICAgICAgICA7CgpwYXRoRXhwcmVzc2lvblRhaWxbQVNUIHJlc3VsdF0KcmV0dXJucyBbYm9vbGVhbiBlbmRCcmFja2V0cyA9IGZhbHNlXQogICAgICAgIDoKICAgICAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNhbiB0aGVuIGJlIGZvbGxvd2VkIGJ5IGEgY2hhaW4gb2YgLmlkLCAoYSksIFthXSwgYW5kIHsuLi59CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNpbmcgb2YgdGhpcyBjaGFpbiBpcyBncmVlZHkuICBGb3IgZXhhbXBsZSwgYSBwYXRoRXhwcmVzc2lvbiBtYXkgYmUgYSBjb21tYW5kIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93ZWQgYnkgYSBjb21tYW5kIGFyZ3VtZW50LCBidXQgdGhhdCBjb21tYW5kIGFyZ3VtZW50IGNhbm5vdCBiZWdpbiB3aXRoIGFuIExQQVJFTiwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gaXMgZ3JlZWRpbHkgYXR0YWNoZWQgdG8gdGhlIHBhdGhFeHByZXNzaW9uIGFzIGEgbWV0aG9kIGFyZ3VtZW50LgogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHsgZ3JlZWR5PXRydWU7IH0KICAgICAgICAgICAgICAgICAgICAgICAgOgoKICAgICAgICAgICAgICAgICAgICAgICAgZW5kQnJhY2tldHM9CiAgICAgICAgICAgICAgICAgICAgICAgIHBlOnBhdGhFbGVtZW50W3Jlc3VsdF0hCiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVzdWx0ID0gI3BlOyB9CiAgICAgICAgICAgICAgICApKgogICAgICAgICAgICAgICAgeyAgICNwYXRoRXhwcmVzc2lvblRhaWwgPSByZXN1bHQ7ICB9CiAgICAgICAgOwoKcGF0aEV4cHJlc3Npb25Gcm9tQnJhY2tldHMKICAgICAgICAgICAgICAgIHtib29sZWFuIHp6OyAvKmlnbm9yZSovIH0KICAgICAgICA6ICAgcGU6ZXhwcmVzc2lvbkJsb2NrIQogICAgICAgICAgICAgICAgeno9cGF0aEV4cHJlc3Npb25UYWlsWyNwZV0KICAgICAgICB8ICAgcGUyOmxpc3RPck1hcENvbnN0cnVjdG9yRXhwcmVzc2lvbiEKICAgICAgICAgICAgICAgIHp6PXBhdGhFeHByZXNzaW9uVGFpbFsjcGUyXQogICAgICAgIDsKCnBhdGhFbGVtZW50W0FTVCBwcmVmaXhdCnJldHVybnMgW2Jvb2xlYW4gZW5kQnJhY2tldHMgPSBmYWxzZV0KICAgICAgICAgICAgICAgIHtib29sZWFuIHp6OyAvKmlnbm9yZSovIH0KICAgICAgICA6CiAgICAgICAgICAgICAgICB7ICAgI3BhdGhFbGVtZW50ID0gcHJlZml4OyAgfQogICAgICAgICAgICAgICAgLy8gU3R1ZmYgd2hpY2ggY2FuIHByZWNlZGUgYSBET1Q6CiAgICAgICAgICAgICAgICAoICAgLy8gU3ByZWFkIG9wZXJhdG9yOiAgeCoueSAgPT09ICB4Py5jb2xsZWN0e2l0Lnl9CiAgICAgICAgICAgICAgICAgICAgICAgIHNwOlNUQVJeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7I3NwLnNldFR5cGUoU1BSRUFEX0FSRyk7fQogICAgICAgICAgICAgICAgfCAgIC8vIE9wdGlvbmFsLW51bGwgb3BlcmF0b3I6ICB4Py55ICA9PT0gKHg9PW51bGwpP251bGw6eC55CiAgICAgICAgICAgICAgICAgICAgICAgIG9wOlFVRVNUSU9OXiAgICAgICAgICAgICAgICAgICAgeyNvcC5zZXRUeXBlKE9QVElPTkFMX0FSRyk7fQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgIC8vIFRoZSBhbGwtcG93ZXJmdWwgZG90LgogICAgICAgICAgICAgICAgRE9UXiBubHMhIG5hbWVQYXJ0CiAgICAgICAgICAgICAgICB7ICAgZW5kQnJhY2tldHMgPSBmYWxzZTsgfQogICAgICAgIHwKICAgICAgICAgICAgICAgIG1jYTptZXRob2RDYWxsQXJnc1twcmVmaXhdCiAgICAgICAgICAgICAgICB7ICAgI3BhdGhFbGVtZW50ID0gI21jYTsgZW5kQnJhY2tldHMgPSB0cnVlOyAgfQogICAgICAgIHwKICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgc2VsZWN0aW9uIGlzIGFsd2F5cyBhbiBvcHRpb24sIHRvby4KICAgICAgICAgICAgICAgIC8vIEluIEdyb292eSwgdGhlIHN0dWZmIGJldHdlZW4gYnJhY2tldHMgaXMgYSBnZW5lcmFsIGFyZ3VtZW50IGxpc3QsCiAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYnJhY2tldCBvcGVyYXRvciBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgbWV0aG9kIGNhbGwuCiAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBhbHNvIGJlIGEgZGVjbGFyYXRpb24gaGVhZDsgc3F1YXJlIGJyYWNrZXRzIGFyZSB1c2VkIHRvIHBhcmFtZXRlcml6ZSBhcnJheSB0eXBlcy4KICAgICAgICAgICAgICAgIGF0YTphcnJheU9yVHlwZUFyZ3NbcHJlZml4XQogICAgICAgICAgICAgICAgeyAgICNwYXRoRWxlbWVudCA9ICNhdGE7IGVuZEJyYWNrZXRzID0gZmFsc2U7ICB9CgovKk5ZSSoKICAgICAgICB8ICAgICAgIERPVF4gbmxzISAidGhpcyIKCiAgICAgICAgfCAgICAgICBET1ReIG5scyEgInN1cGVyIgogICAgICAgICAgICAgICAgKCAgIC8vIChuZXcgT3V0ZXIoKSkuc3VwZXIoKSAgKGNyZWF0ZSBlbmNsb3NpbmcgaW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIGxwMzpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOIQogICAgICAgICAgICAgICAgICAgICAgICB7I2xwMy5zZXRUeXBlKFNVUEVSX0NUT1JfQ0FMTCk7fQogICAgICAgICAgICAgICAgfCAgIERPVF4gSURFTlQKICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICBscHM6TFBBUkVOXiB7I2xwcy5zZXRUeXBlKE1FVEhPRF9DQUxMKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnTGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQVJFTiEKICAgICAgICAgICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICkKICAgICAgICB8ICAgICAgIERPVF4gbmxzISBuZXdFeHByZXNzaW9uCipOWUkqLwogICAgICAgIDsKCi8qKiBMb29rYWhlYWQgcGF0dGVybiBmb3IgcGF0aEVsZW1lbnQuICovCnBhdGhFbGVtZW50U3RhcnQhCiAgICAgICAgOiAgIChMUEFSRU4gfCBMQlJBQ0UgfCBMQlJBQ0sgfCBET1QgfCAoU1RBUnxRVUVTVElPTikgRE9UKQogICAgICAgIDsKCi8qKiBUaGlzIGlzIHRoZSBncmFtbWFyIGZvciB3aGF0IGNhbiBmb2xsb3cgYSBkb3Q6ICB4LmEsIHguQGEsIHguJmEsIHguJ2EnLCBldGMuCiAqICA8cD5UaGUgYWx0ZXJuYXRpdmUgZm9yICJpbiIgaXMgdGhlcmUganVzdCBmb3IgZXJyb3IgcHJvY2Vzc2luZzsgaXQgcmFpc2VzIGFuIGVycm9yLgogKi8KbmFtZVBhcnQKICAgICAgICA6CiAgICAgICAgICAgICAgICAoICAgYW1wOkxBTkReICAgeyNhbXAuc2V0VHlwZShSRUZMRUNUX01FTUJFUik7fSAvLyBmb28uJmJhciByZWZsZWN0cyB0aGUgJ2JhcicgbWVtYmVyIG9mIGZvbwogICAgICAgICAgICAgICAgfCAgICAgICBhdHM6QVRTSUdOXiB7I2FtcC5zZXRUeXBlKFNFTEVDVF9TTE9UKTt9ICAgICAgICAvLyBmb28uQGJhciBzZWxlY3RzIHRoZSBmaWVsZCAob3IgYXR0cmlidXRlKSwgbm90IHByb3BlcnR5CiAgICAgICAgICAgICAgICApPwoKICAgICAgICAgICAgKCAgIElERU5UCiAgICAgICAgICAgICAgICB8ICAgc2w6U1RSSU5HX0xJVEVSQUwgeyNzbC5zZXRUeXBlKElERU5UKTt9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvby4nYmFyJyBpcyBpbiBhbGwgd2F5cyBzYW1lIGFzIGZvby5iYXIsIGV4Y2VwdCB0aGF0IGJhciBjYW4gaGF2ZSBhbiBhcmJpdHJhcnkgc3BlbGxpbmcKICAgICAgICAgICAgICAgIHwgICBkbjpkeW5hbWljTWVtYmVyTmFtZSEKICAgICAgICAgICAgICAgICAgICAgICAgeyAgICNuYW1lUGFydCA9ICMoI1tEWU5BTUlDX01FTUJFUiwgIkRZTkFNSUNfTUVNQkVSIl0sICNkbik7ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERFQ0lERSBQUk9QT1NBTDogIGZvby4oYmFyKSwgeC4ocD8nYSc6J2InKSBtZWFucyBkeW5hbWljIGxvb2t1cCBvbiBhIGR5bmFtaWMgbmFtZQogICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICBvcGVuQmxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFJPUE9TQUwsIERFQ0lERTogIElzIHRoaXMgaW5saW5lIGZvcm0gb2YgdGhlICd3aXRoJyBzdGF0ZW1lbnQgdXNlZnVsPwogICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbml0aW9uOiAgYS57Zm9vfSA9PT0ge3dpdGgoYSkge2Zvb319CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heSBjb3ZlciBzb21lIHBhdGggZXhwcmVzc2lvbiB1c2UtY2FzZXMgcHJldmlvdXNseSBoYW5kbGVkIGJ5IGR5bmFtaWMgc2NvcGluZyAoY2xvc3VyZSBkZWxlZ2F0ZXMpLgogICAgICAgICAgICAgICAgLy8gUmVjb3ZlciB3aXRoIGEgZ29vZCBkaWFnbm9zdGljIGZyb20gYSBjb21tb24gZXJyb3I6CiAgICAgICAgICAgICAgICB8ICAgImluIiAgLy8gcG9zdGVyIGNoaWxkOyB0aGUgbGV4ZXIgbWFrZXMgYWxsIGtleXdvcmRzIGFmdGVyIGRvdCBsb29rIGxpa2UgImluIgogICAgICAgICAgICAgICAgICAgICAgICB7ICAgU3RyaW5nIGt3ZCA9IExUKDEpLmdldFRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBrZXl3b3JkIGFmdGVyIGRvdCBpbiB4LiIra3dkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHV0IHRoZSBrZXl3b3JkIGluIHF1b3RlcywgYXMgaW4geC4nIitrd2QrIiciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGhlbHBzIHRoZSB1c2VyIHJlY292ZXIgZnJvbSBydWluZWQgSmF2YSBpZGVudGlmaWVycywgYXMgaW4gU3lzdGVtLidpbicuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gREVDSURFOiBTaGFsbCB3ZSBqdXN0IGRlZmluZSBmb28uaW4gdG8gRFRSVCBhdXRvbWFnaWNhbGx5LCBvciBkbyB3ZSB3YW50IHRoZSBzeW50YXggY2hlY2s/CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAvLyAoTm8sIHguJkB5IGlzIG5vdCBuZWVkZWQ7IGp1c3Qgc2F5IHguJnkgYXMgU2xvdCBvciBzb21lIHN1Y2guKQogICAgICAgIDsKCi8qKiBJZiBhIGRvdCBpcyBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQgb3IgcXVvdGVkIGV4cHJlc3Npb24sIHRoZSBtZW1iZXIgaXMgY29tcHV0ZWQgZHluYW1pY2FsbHksCiAqICBhbmQgdGhlIG1lbWJlciBzZWxlY3Rpb24gaXMgZG9uZSBvbmx5IGF0IHJ1bnRpbWUuICBUaGlzIGZvcmNlcyBhIHN0YXRpY2FsbHkgdW5jaGVja2VkIG1lbWJlciBhY2Nlc3MuCiAqLwpkeW5hbWljTWVtYmVyTmFtZQogICAgICAgIDogICAoICAgcGFyZW50aGVzaXplZEV4cHJlc3Npb24KICAgICAgICAgICAgICAgIHwgICBzdHJpbmdDb25zdHJ1Y3RvckV4cHJlc3Npb24KICAgICAgICAgICAgICAgICkKICAgICAgICB7ICAgI2R5bmFtaWNNZW1iZXJOYW1lID0gIygjW0RZTkFNSUNfTUVNQkVSLCAiRFlOQU1JQ19NRU1CRVIiXSwgI2R5bmFtaWNNZW1iZXJOYW1lKTsgIH0KICAgICAgICA7CgovKiogQW4gZXhwcmVzc2lvbiBtYXkgYmUgZm9sbG93ZWQgYnkgb25lIG9yIGJvdGggb2YgKC4uLikgYW5kIHsuLi59LgogKiAgTm90ZTogSWYgZWl0aGVyIGlzICguLi4pIG9yIHsuLi59IHByZXNlbnQsIGl0IGlzIGEgbWV0aG9kIGNhbGwuCiAqICBUaGUgey4uLn0gaXMgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50IGxpc3QsIGFuZCBtYXRjaGVzIGEgZm9ybWFsIG9mIHR5cGUgQ2xvc3VyZS4KICogIElmIHRoZXJlIGlzIG5vIG1ldGhvZCBtZW1iZXIsIGEgcHJvcGVydHkgKG9yIGZpZWxkKSBpcyB1c2VkIGluc3RlYWQsIGFuZCBtdXN0IGl0c2VsZiBiZSBjYWxsYWJsZS4KICogIDxwPgogKiAgSWYgdGhlIG1ldGhvZENhbGxBcmdzIGFyZSBhYnNlbnQsIGl0IGlzIGEgcHJvcGVydHkgKG9yIGZpZWxkKSByZWZlcmVuY2UsIGlmIHBvc3NpYmxlLgogKiAgSWYgdGhlcmUgaXMgbm8gcHJvcGVydHkgb3IgZmllbGQsIGl0IGlzIHRyZWF0ZWQgYXMgYSBtZXRob2QgY2FsbCAobnVsbGFyeSkgYWZ0ZXIgYWxsLgogKiAgPHA+CiAqICBBcmd1bWVudHMgaW4gdGhlICguLi4pIGNhbiBiZSBsYWJlbGVkLCBhbmQgdGhlIGFwcGVuZGVkIGJsb2NrIGNhbiBiZSBsYWJlbGVkIGFsc28uCiAqICBJZiB0aGVyZSBpcyBhIG1peCBvZiB1bmxhYmVsZWQgYW5kIGxhYmVsZWQgYXJndW1lbnRzLAogKiAgYWxsIHRoZSBsYWJlbGVkIGFyZ3VtZW50cyBtdXN0IGZvbGxvdyB0aGUgdW5sYWJlbGVkIGFyZ3VtZW50cywKICogIGV4Y2VwdCB0aGF0IHRoZSBjbG9zdXJlIChsYWJlbGVkIG9yIG5vdCkgaXMgYWx3YXlzIGEgc2VwYXJhdGUgZmluYWwgYXJndW1lbnQuCiAqICBMYWJlbGVkIGFyZ3VtZW50cyBhcmUgY29sbGVjdGVkIHVwIGFuZCBwYXNzZWQgYXMgYSBzaW5nbGUgYXJndW1lbnQgdG8gYSBmb3JtYWwgb2YgdHlwZSBNYXAuCiAqICA8cD4KICogIFRoZXJlZm9yZSwgZih4LHksIGE6cCwgYjpxKSB7c30gaXMgZXF1aXZhbGVudCBpbiBhbGwgd2F5cyB0byBmKHgseSwgW2E6cCxiOnFdLCB7c30pLgogKiAgU3ByZWFkIGFyZ3VtZW50cyBvZiBzZXF1ZW5jZSB0eXBlIGNvdW50IGFzIHVubGFiZWxlZCBhcmd1bWVudHMsCiAqICB3aGlsZSBzcHJlYWQgYXJndW1lbnRzIG9mIG1hcCB0eXBlIGNvdW50IGFzIGxhYmVsZWQgYXJndW1lbnRzLgogKiAgKFRoaXMgZGlzdGluY3Rpb24gbXVzdCBzb21ldGltZXMgYmUgY2hlY2tlZCBkeW5hbWljYWxseS4pCiAqCiAqICBBIHBsYWluIHVubGFiZWxlZCBhcmd1bWVudCBpcyBhbGxvd2VkIHRvIG1hdGNoIGEgdHJhaWxpbmcgTWFwIG9yIENsb3N1cmUgYXJndW1lbnQ6CiAqICBmKHgsIGE6cCkge3N9ICA9PT0gIGYoKlsgeCwgW2E6cF0sIHtzfSBdKQogKiAgPHA+CiAqICBSZXR1cm5lZCBBU1QgaXMgW01FVEhPRF9DQUxMLCBjYWxsZWUsIEVMSVNUPywgQ0xPU0VEX0JMT0NLP10uCiAqLwptZXRob2RDYWxsQXJnc1tBU1QgY2FsbGVlXQogICAgICAgIHtib29sZWFuIHp6OyAvKmlnbm9yZSovIH0KICAgICAgICA6CiAgICAgICAgICAgICAgICB7I21ldGhvZENhbGxBcmdzID0gY2FsbGVlO30KICAgICAgICAgICAgICAgIGxwOkxQQVJFTl4geyNscC5zZXRUeXBlKE1FVEhPRF9DQUxMKTt9CiAgICAgICAgICAgICAgICB6ej1hcmdMaXN0CiAgICAgICAgICAgICAgICBSUEFSRU4hCiAgICAgICAgICAgICAgICAoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiBhcHBlbmRlZEJsb2NrICk/ICAgICAgICAgICAgIC8vIG1heWJlIGFwcGVuZCBhIGNsb3N1cmUKICAgICAgICB8CiAgICAgICAgICAgICAgICAvLyBlbHNlIHVzZSBhIGNsb3N1cmUgYWxvbmUKICAgICAgICAgICAgICAgIHsjbWV0aG9kQ2FsbEFyZ3MgPSBjYWxsZWU7fQogICAgICAgICAgICAgICAgY2I6YXBwZW5kZWRCbG9jawogICAgICAgICAgICAgICAgeyAgIEFTVCBsYnJhY2UgPSBnZXRBU1RGYWN0b3J5KCkuZHVwKCNjYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGxicmFjZS5zZXRUeXBlKE1FVEhPRF9DQUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgI21ldGhvZENhbGxBcmdzID0gIyhsYnJhY2UsICNtZXRob2RDYWxsQXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgOwoKLyoqIEFuIGV4cHJlc3Npb24gbWF5IGJlIGZvbGxvd2VkIGJ5IFsuLi5dLgogKiAgVW5saWtlIEphdmEsIHRoZXNlIGJyYWNrZXRzIG1heSBjb250YWluIGEgZ2VuZXJhbCBhcmd1bWVudCBsaXN0LAogKiAgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBhcnJheSBlbGVtZW50IG9wZXJhdG9yLCB3aGljaCBjYW4gbWFrZSBvZiBpdCB3aGF0IGl0IHdhbnRzLgogKiAgVGhlIGJyYWNrZXRzIG1heSBhbHNvIGJlIGVtcHR5LCBhcyBpbiBUW10uICBUaGlzIGlzIGhvdyBHcm9vdnkgbmFtZXMgYXJyYXkgdHlwZXMuCiAqICA8cD5SZXR1cm5lZCBBU1QgaXMgW0lOREVYX09QLCBpbmRleGVlLCBFTElTVF0uCiAqCiAqICpUT0RPKiAoVGhlIGFycmF5T3JUeXBlQXJncyB0aGluZyBpbiAxLjQgZ3Jvb3Z5LmcgaXMgYSBwbGFjZWhvbGRlciB3aGljaAogKiBhbnRpY2lwYXRlcyB0aGUgdHJvdWJsZSBvZiBpbnRlZ3JhdGluZyBKYXZhIDUgdHlwZSBhcmd1bWVudHMuKQogKi8KYXJyYXlPclR5cGVBcmdzW0FTVCBpbmRleGVlXQogICAgICAgIHtib29sZWFuIHp6OyAvKmlnbm9yZSovIH0KICAgICAgICA6CiAgICAgICAgICAgICAgICB7I2FycmF5T3JUeXBlQXJncyA9IGluZGV4ZWU7fQogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIGNvbnZlbmllbnQgdG8gYmUgZ3JlZWR5IGhlcmUsIHRob3VnaCBpdCBkb2Vzbid0IGFmZmVjdCBjb3JyZWN0bmVzcwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHsgZ3JlZWR5ID0gdHJ1ZTsgfSA6CiAgICAgICAgICAgICAgICAgICAgICAgIGxiOkxCUkFDS14geyNsYi5zZXRUeXBlKElOREVYX09QKTt9CiAgICAgICAgICAgICAgICAgICAgICAgIHp6PWFyZ0xpc3QKICAgICAgICAgICAgICAgICAgICAgICAgUkJSQUNLIQogICAgICAgICAgICAgICAgKSsKICAgICAgICA7CgoKLy8gYXNzaWdubWVudCBleHByZXNzaW9uIChsZXZlbCAxMykKYXNzaWdubWVudEV4cHJlc3Npb24KICAgICAgICA6ICAgICAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgKCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgKCAgIEFTU0lHTl4KICAgICAgICAgICAgICAgICAgICAgICAgfCAgIFBMVVNfQVNTSUdOXgogICAgICAgICAgICAgICAgICAgICAgICB8ICAgTUlOVVNfQVNTSUdOXgogICAgICAgICAgICAgICAgICAgICAgICB8ICAgU1RBUl9BU1NJR05eCiAgICAgICAgICAgICAgICAgICAgICAgIHwgICBESVZfQVNTSUdOXgogICAgICAgICAgICAgICAgICAgICAgICB8ICAgTU9EX0FTU0lHTl4KICAgICAgICAgICAgICAgICAgICAgICAgfCAgIFNSX0FTU0lHTl4KICAgICAgICAgICAgICAgICAgICAgICAgfCAgIEJTUl9BU1NJR05eCiAgICAgICAgICAgICAgICAgICAgICAgIHwgICBTTF9BU1NJR05eCiAgICAgICAgICAgICAgICAgICAgICAgIHwgICBCQU5EX0FTU0lHTl4KICAgICAgICAgICAgICAgICAgICAgICAgfCAgIEJYT1JfQVNTSUdOXgogICAgICAgICAgICAgICAgICAgICAgICB8ICAgQk9SX0FTU0lHTl4KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBubHMhCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRFeHByZXNzaW9uCiAgICAgICAgICAgICAgICApPwogICAgICAgIDsKCi8vIGNvbmRpdGlvbmFsIHRlc3QgKGxldmVsIDEyKQpjb25kaXRpb25hbEV4cHJlc3Npb24KICAgICAgICA6ICAgICAgIGxvZ2ljYWxPckV4cHJlc3Npb24KICAgICAgICAgICAgICAgICggUVVFU1RJT05eIG5scyEgYXNzaWdubWVudEV4cHJlc3Npb24gQ09MT04hIG5scyEgY29uZGl0aW9uYWxFeHByZXNzaW9uICk/CiAgICAgICAgOwoKCi8vIGxvZ2ljYWwgb3IgKHx8KSAgKGxldmVsIDExKQpsb2dpY2FsT3JFeHByZXNzaW9uCiAgICAgICAgOiAgICAgICBsb2dpY2FsQW5kRXhwcmVzc2lvbiAoTE9SXiBubHMhIGxvZ2ljYWxBbmRFeHByZXNzaW9uKSoKICAgICAgICA7CgoKLy8gbG9naWNhbCBhbmQgKCYmKSAgKGxldmVsIDEwKQpsb2dpY2FsQW5kRXhwcmVzc2lvbgogICAgICAgIDogICAgICAgaW5jbHVzaXZlT3JFeHByZXNzaW9uIChMQU5EXiBubHMhIGluY2x1c2l2ZU9yRXhwcmVzc2lvbikqCiAgICAgICAgOwoKCi8vIGJpdHdpc2Ugb3Igbm9uLXNob3J0LWNpcmN1aXRpbmcgb3IgKHwpICAobGV2ZWwgOSkKaW5jbHVzaXZlT3JFeHByZXNzaW9uCiAgICAgICAgOiAgICAgICBleGNsdXNpdmVPckV4cHJlc3Npb24gKEJPUl4gbmxzISBleGNsdXNpdmVPckV4cHJlc3Npb24pKgogICAgICAgIDsKCgovLyBleGNsdXNpdmUgb3IgKF4pICAobGV2ZWwgOCkKZXhjbHVzaXZlT3JFeHByZXNzaW9uCiAgICAgICAgOiAgICAgICBhbmRFeHByZXNzaW9uIChCWE9SXiBubHMhIGFuZEV4cHJlc3Npb24pKgogICAgICAgIDsKCgovLyBiaXR3aXNlIG9yIG5vbi1zaG9ydC1jaXJjdWl0aW5nIGFuZCAoJikgIChsZXZlbCA3KQphbmRFeHByZXNzaW9uCiAgICAgICAgOiAgICAgICBlcXVhbGl0eUV4cHJlc3Npb24gKEJBTkReIG5scyEgZXF1YWxpdHlFeHByZXNzaW9uKSoKICAgICAgICA7CgoKLy8gZXF1YWxpdHkvaW5lcXVhbGl0eSAoPT0vIT0pIChsZXZlbCA2KQplcXVhbGl0eUV4cHJlc3Npb24KICAgICAgICA6ICAgICAgIHJlbGF0aW9uYWxFeHByZXNzaW9uICgoTk9UX0VRVUFMXiB8IEVRVUFMXikgbmxzISByZWxhdGlvbmFsRXhwcmVzc2lvbikqCiAgICAgICAgOwoKCi8vIGJvb2xlYW4gcmVsYXRpb25hbCBleHByZXNzaW9ucyAobGV2ZWwgNSkKcmVsYXRpb25hbEV4cHJlc3Npb24KICAgICAgICA6ICAgICAgIHNoaWZ0RXhwcmVzc2lvbgogICAgICAgICAgICAgICAgKCAgICAgICAoICAgICAgICggICAgICAgTFReCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBHVF4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIExFXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgR0VeCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAiaW4iXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubHMhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRFeHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICB8ICAgICAgICJpbnN0YW5jZW9mIl4gbmxzISB0eXBlU3BlY1t0cnVlXQogICAgICAgICAgICAgICAgfCAgICAgICAiYXMiXiAgICAgICAgIG5scyEgdHlwZVNwZWNbdHJ1ZV0gLy9UTyBETzogUmV3b3JrIHRvIGFsbG93IHR5cGUgZXhwcmVzc2lvbj8KICAgICAgICAgICAgICAgICkKICAgICAgICA7CgoKCi8vIGJpdCBzaGlmdCBleHByZXNzaW9ucyAobGV2ZWwgNCkKc2hpZnRFeHByZXNzaW9uCiAgICAgICAgOiAgICAgICBhZGRpdGl2ZUV4cHJlc3Npb24KICAgICAgICAgICAgICAgICggICAoKFNMXiB8IFNSXiB8IEJTUl4pIG5scyEKICAgICAgICAgICAgICAgICAgICAgICAgfCAgIFJBTkdFX0lOQ0xVU0lWRV4KICAgICAgICAgICAgICAgICAgICAgICAgfCAgIERFQ14geyNERUMuc2V0VHlwZShSQU5HRV9FWENMVVNJVkUpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBERUNJREU6IE1heWJlIHVzZSBhLS1iIHRvIGRlbm90ZSBDL0phdmEtc3R5bGUgaW5kZXggcmFuZ2UgKCJleGNsdXNpdmUiKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aXZlRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgKSoKICAgICAgICA7CgoKLy8gYmluYXJ5IGFkZGl0aW9uL3N1YnRyYWN0aW9uIChsZXZlbCAzKQphZGRpdGl2ZUV4cHJlc3Npb24KICAgICAgICA6ICAgICAgIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoKFBMVVNeIHwgTUlOVVNeKSBubHMhIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbikqCiAgICAgICAgOwoKCi8vIG11bHRpcGxpY2F0aW9uL2RpdmlzaW9uL21vZHVsbyAobGV2ZWwgMikKbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCiAgICAgICAgOiAgICAgICB1bmFyeUV4cHJlc3Npb24gKChTVEFSXiB8IERJVl4gfCBNT0ReICkgbmxzISB1bmFyeUV4cHJlc3Npb24pKgogICAgICAgIDsKCnVuYXJ5RXhwcmVzc2lvbgogICAgICAgIDogICAgICAgSU5DXiBubHMhIHVuYXJ5RXhwcmVzc2lvbgogICAgICAgIHwgICAgICAgREVDXiBubHMhIHVuYXJ5RXhwcmVzc2lvbgogICAgICAgIHwgICAgICAgTUlOVVNeIHsjTUlOVVMuc2V0VHlwZShVTkFSWV9NSU5VUyk7fSBubHMhIHVuYXJ5RXhwcmVzc2lvbgogICAgICAgIHwgICAgICAgUExVU14gIHsjUExVUy5zZXRUeXBlKFVOQVJZX1BMVVMpO30gbmxzISB1bmFyeUV4cHJlc3Npb24KICAgICAgICB8ICAgICAgIERPTExBUl4gIHsjRE9MTEFSLnNldFR5cGUoU0NPUEVfRVNDQVBFKTt9IG5scyEgdW5hcnlFeHByZXNzaW9uCiAgICAgICAgfCAgICAgICB1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKICAgICAgICA7CgovLyBUaGUgU0NPUEVfRVNDQVBFIG9wZXJhdG9yIHBvcHMgaXRzIG9wZXJhbmQgb3V0IG9mIHRoZSBzY29wZSBvZiBhICJ3aXRoIiBibG9jay4KLy8gSWYgbm90IHdpdGhpbiBhICJ3aXRoIiBibG9jaywgaXQgcG9wcyB0aGUgb3BlcmFuZCBvdXQgb2YgdGhlIHN0YXRpYyBnbG9iYWwgc2NvcGUsCi8vIGludG8gd2hhdGV2ZXIgZHluYW1pYyAodW5jaGVja2VkKSBnbG9iYWwgc2NvcGUgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIHNjcmlwdCBpcyBydW4sCi8vIHJlZ2FyZGxlc3Mgb2YgcGFja2FnZSBhbmQgaW1wb3J0cy4KLy8gRXhhbXBsZSBvZiBTQ09QRV9FU0NBUEU6ICBkZWYgeD0xOyB3aXRoIChbeDoyLHk6LTFdKSB7IGRlZiB5PTM7IHByaW50bG4gWyR4LCB4LCB5XSB9ICA9PiAgIlsxLCAyLCAzXSIKCnVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cwoJOglCTk9UXiBubHMhIHVuYXJ5RXhwcmVzc2lvbgoJfAlMTk9UXiBubHMhIHVuYXJ5RXhwcmVzc2lvbgoJfAkoCS8vIHN1YnJ1bGUgYWxsb3dzIG9wdGlvbiB0byBzaHV0IG9mZiB3YXJuaW5ncwoJCQlvcHRpb25zIHsKCQkJCS8vICIoaW50IiBhbWJpZyB3aXRoIHBvc3RmaXhFeHByIGR1ZSB0byBsYWNrIG9mIHNlcXVlbmNlCgkJCQkvLyBpbmZvIGluIGxpbmVhciBhcHByb3hpbWF0ZSBMTChrKS4gSXQncyBvay4gU2h1dCB1cC4KCQkJCWdlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTsKCQkJfQoJCToJLy8gSWYgdHlwZWNhc3QgaXMgYnVpbHQgaW4gdHlwZSwgbXVzdCBiZSBudW1lcmljIG9wZXJhbmQKCQkJLy8gSGF2ZSB0byBiYWNrdHJhY2sgdG8gc2VlIGlmIG9wZXJhdG9yIGZvbGxvd3MKCQkoTFBBUkVOIGJ1aWx0SW5UeXBlU3BlY1t0cnVlXSBSUEFSRU4gdW5hcnlFeHByZXNzaW9uKT0+CgkJbHBiOkxQQVJFTl4geyNscGIuc2V0VHlwZShUWVBFQ0FTVCk7fSBidWlsdEluVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIQoJCXVuYXJ5RXhwcmVzc2lvbgoKCQkvLyBIYXZlIHRvIGJhY2t0cmFjayB0byBzZWUgaWYgb3BlcmF0b3IgZm9sbG93cy4gSWYgbm8gb3BlcmF0b3IKCQkvLyBmb2xsb3dzLCBpdCdzIGEgdHlwZWNhc3QuIE5vIHNlbWFudGljIGNoZWNraW5nIG5lZWRlZCB0byBwYXJzZS4KCQkvLyBpZiBpdCBfbG9va3NfIGxpa2UgYSBjYXN0LCBpdCBfaXNfIGEgY2FzdDsgZWxzZSBpdCdzIGEgIihleHByKSIKCQkvLyBUTyBETzogIFJld29yayB0aGlzIG1lc3MgZm9yIEdyb292eS4KCXwJKExQQVJFTiBjbGFzc1R5cGVTcGVjW3RydWVdIFJQQVJFTiB1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMpPT4KCQlscDpMUEFSRU5eIHsjbHAuc2V0VHlwZShUWVBFQ0FTVCk7fSBjbGFzc1R5cGVTcGVjW3RydWVdIFJQQVJFTiEKCQl1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKCgl8CXBvc3RmaXhFeHByZXNzaW9uCgkpCgk7CgovLyBxdWFsaWZpZWQgbmFtZXMsIGFycmF5IGV4cHJlc3Npb25zLCBtZXRob2QgaW52b2NhdGlvbiwgcG9zdCBpbmMvZGVjCnBvc3RmaXhFeHByZXNzaW9uCgkJe2Jvb2xlYW4geno7IC8qaWdub3JlZCovfQoJOgoJCSggICB6ej1wYXRoRXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHgsIHguZiwgeCgpLCB4e30sIGV0Yy4KICAgICAgICAgICAgICAgIHwgICBwYXRoRXhwcmVzc2lvbkZyb21CcmFja2V0cyAgICAgICAgICAvLyB7Y30sIHtjfSgpLCBbeF0uZiwgZXRjLgogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmx5IGFkZCBvbiBhIHBvc3QtaW5jcmVtZW50IG9yIHBvc3QtZGVjcmVtZW50LgoJCQkvLyBhbGxvd3MgSU5DL0RFQyBvbiB0b28gbXVjaCwgYnV0IHNlbWFudGljcyBjYW4gY2hlY2sKCQkJaW46SU5DXiB7I2luLnNldFR5cGUoUE9TVF9JTkMpO30KCSAJfAlkZTpERUNeIHsjZGUuc2V0VHlwZShQT1NUX0RFQyk7fQoJCSk/CiAJOwoKLy8gdGhlIGJhc2ljIGVsZW1lbnQgb2YgYW4gZXhwcmVzc2lvbgpwcmltYXJ5RXhwcmVzc2lvbgogICAgICAgIDogICAgICAgSURFTlQKICAgICAgICAvKk9CUyogIC8vY2xhc3MgbmFtZXMgd29yayBmaW5lIGFzIGV4cHJlc3Npb25zLCBubyBuZWVkIGZvciBULmNsYXNzIGluIEdyb292eQogICAgICAgICAgICAgICAgKCBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDogRE9UXiAiY2xhc3MiICk/CiAgICAgICAgKk9CUyovCiAgICB8ICAgY29uc3RhbnQKICAgICAgICB8ICAgICAgICJ0cnVlIgogICAgICAgIHwgICAgICAgImZhbHNlIgogICAgICAgIHwgICAgICAgIm51bGwiCiAgICB8ICAgbmV3RXhwcmVzc2lvbgogICAgICAgIHwgICAgICAgIml0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCBvciBleHBsaWNpdCBjbG9zdXJlIHBhcmFtZXRlciAob3IgbWV0aG9kIHBhcmFtZXRlcikKICAgICAgICB8ICAgICAgICJ0aGlzIgogICAgICAgIHwgICAgICAgInN1cGVyIgogICAgICAgIHwgICAgICAgcGFyZW50aGVzaXplZEV4cHJlc3Npb24gICAgICAgICAgICAgICAgIC8vIChnZW5lcmFsIHN0dWZmLi4sLikKICAgICAgICB8ICAgc3RyaW5nQ29uc3RydWN0b3JFeHByZXNzaW9uICAgICAgICAgLy8gImZvbyAkYmFyIGJheiI7IHByZXNlbnRlZCBhcyBtdWx0aXBsZSB0b2tlbnMKICAgICAgICB8ICAgYnVpbHRJblR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgZXhwcmVzc2lvbnMgd29yayBpbiBHcm9vdnkKICAgICAgICAvKk9CUyogIC8vY2xhc3MgbmFtZXMgd29yayBmaW5lIGFzIGV4cHJlc3Npb25zCiAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBpbnQuY2xhc3MgYW5kIGludFtdLmNsYXNzCiAgICAgICAgfCAgICAgICBidWlsdEluVHlwZQogICAgICAgICAgICAgICAgKCBsYnQ6TEJSQUNLXiB7I2xidC5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLISApKgogICAgICAgICAgICAgICAgRE9UXiBubHMhICJjbGFzcyIKICAgICAgICAqT0JTKi8KICAgICAgICA7CgpwYXJlbnRoZXNpemVkRXhwcmVzc2lvbgogICAgICAgIDogICBscDpMUEFSRU5eIGV4cHJlc3Npb24gUlBBUkVOISAgICAgICAgICAgICAgICAgICAgICAgeyAjbHAuc2V0VHlwZShFWFBSKTsgfQogICAgICAgIDsKCi8vIEdyb292eSBzeW50YXggZm9yICIkeCAkeSIuCnN0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbgogICAgICAgIDogICBjczpTVFJJTkdfQ1RPUl9TVEFSVAogICAgICAgICAgICAgICAgeyAjY3Muc2V0VHlwZShTVFJJTkdfTElURVJBTCk7IH0KCiAgICAgICAgICAgICAgICBzdHJpbmdDb25zdHJ1Y3RvclZhbHVlUGFydAoKICAgICAgICAgICAgICAgICggICBjbTpTVFJJTkdfQ1RPUl9NSURETEUKICAgICAgICAgICAgICAgICAgICAgICAgeyAjY20uc2V0VHlwZShTVFJJTkdfTElURVJBTCk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQ29uc3RydWN0b3JWYWx1ZVBhcnQKICAgICAgICAgICAgICAgICkqCgogICAgICAgICAgICAgICAgY2U6U1RSSU5HX0NUT1JfRU5ECiAgICAgICAgICAgICAgICB7ICNjZS5zZXRUeXBlKFNUUklOR19MSVRFUkFMKTsKICAgICAgICAgICAgICAgICAgI3N0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgICMoI1tTVFJJTkdfQ09OU1RSVUNUT1IsIlNUUklOR19DT05TVFJVQ1RPUiJdLCBzdHJpbmdDb25zdHJ1Y3RvckV4cHJlc3Npb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgIDsKCnN0cmluZ0NvbnN0cnVjdG9yVmFsdWVQYXJ0CiAgICAgICAgOiAgIGlkZW50aWZpZXIgICAgICAgICAgLy8gYWthLCBwYXRoRXhwcmVzc2lvbgogICAgICAgIHwgICBvcGVuQmxvY2sKICAgICAgICA7CgovKioKICogQSBsaXN0IGNvbnN0cnVjdG9yIGlzIGEgYXJndW1lbnQgbGlzdCBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMsIHdpdGhvdXQgbGFiZWxzLgogKiBBbnkgYXJndW1lbnQgY2FuIGJlIGRlY29yYXRlZCB3aXRoIGEgc3ByZWFkIG9yIG9wdGlvbmFsIG9wZXJhdG9yICgqeCwgP3gpLCBidXQgbm90IGEgbGFiZWwgKGE6eCkuCiAqIEV4YW1wbGVzOiAgW10sIFsxXSwgWzEsMl0sIFsxLCpsMSwyXSwgWypsMSwqbDJdLCBbMSw/eCwyXS4KICogKFRoZSBsMSwgbDIgbXVzdCBiZSBhIHNlcXVlbmNlIG9yIG51bGwuKQogKiA8cD4KICogQSBtYXAgY29uc3RydWN0b3IgaXMgYW4gYXJndW1lbnQgbGlzdCBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMsIHdpdGggbGFiZWxzIGV2ZXJ5d2hlcmUsCiAqIGV4Y2VwdCBwb3NzaWJseSBvbiBzcHJlYWQgYXJndW1lbnRzLCB3aGljaCBzdGFuZCBmb3Igd2hvbGUgbWFwcyBzcGxpY2VkIGluLgogKiBBIGNvbG9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsZWZ0IGJyYWNrZXQgYWxzbyBmb3JjZXMgdGhlIGV4cHJlc3Npb24gdG8gYmUgYSBtYXAgY29uc3RydWN0b3IuCiAqIEV4YW1wbGVzOiBbOl0sIFthOjFdLCBbOiBhOjFdLCBbYToxLGI6Ml0sIFthOjEsKm0xLGI6Ml0sIFs6Km0xLCptMl0sIFthOjEscTo/eCxiOjJdLCBbYToxLGE6KngsYjoyXQogKiAoVGhlIG0xLCBtMiBtdXN0IGJlIGEgbWFwIG9yIG51bGwuKQogKiBWYWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGlkZW50aWNhbCBrZXlzIG92ZXJ3cml0ZSBmcm9tIGxlZnQgdG8gcmlnaHQ6CiAqIFthOjEsYToyXSAgPT09ICBbYToyXQogKiA8cD4KICogU29tZSBtYWxmb3JtZWQgY29uc3RydWN0b3IgZXhwcmVzc2lvbnMgYXJlIG5vdCBkZXRlY3RlZCBpbiB0aGUgcGFyc2VyLCBidXQgaW4gYSBwb3N0LXBhc3MuCiAqIEJhZCBleGFtcGxlczogWzEsYjoyXSwgW2E6MSwyXSwgWzoxXSwgW2E6MSw/eF0sIFthOjEsIGI6KnhdLgogKiAoTm90ZSB0aGF0IG1ldGhvZCBjYWxsIGFyZ3VtZW50cywgYnkgY29udHJhc3QsIGNhbiBiZSBhIG1peCBvZiBrZXl3b3JkZWQgYW5kIG5vbi1rZXl3b3JkZWQgYXJndW1lbnRzLikKICovCmxpc3RPck1hcENvbnN0cnVjdG9yRXhwcmVzc2lvbgogICAgICAgICAgICAgICAgeyBib29sZWFuIGhhc0xhYmVscyA9IGZhbHNlLCBoYWw7IH0KICAgICAgICA6ICAgbGNvbjpMQlJBQ0teCiAgICAgICAgICAgICAgICAoICBDT0xPTiEgICAgICAgICAgICAgICB7IGhhc0xhYmVscyB8PSB0cnVlOyB9ICApPyAgLy8gWzpdLCBbOip4XSwgWzoqeCwqeV0gYXJlIG1hcCBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICAgIGhhbD1hcmdMaXN0ICAgICAgICAgICAgIHsgaGFzTGFiZWxzIHw9IGhhbDsgIH0gICAgICAvLyBhbnkgYXJndW1lbnQgbGFiZWwgaW1wbGllcyBhIG1hcAogICAgICAgICAgICAgICAgUkJSQUNLIQogICAgICAgICAgICAgICAgeyAgICNsY29uLnNldFR5cGUoaGFzTGFiZWxzID8gTUFQX0NPTlNUUlVDVE9SIDogTElTVF9DT05TVFJVQ1RPUik7ICB9CiAgICAgICAgOwoKLypPQlMqCi8qKiBNYXRjaCBhLCBhLmIuYyByZWZzLCBhLmIuYyguLi4pIHJlZnMsIGEuYi5jW10sIGEuYi5jW10uY2xhc3MsCiAqICBhbmQgYS5iLmMuY2xhc3MgcmVmcy4gQWxzbyB0aGlzKC4uLikgYW5kIHN1cGVyKC4uLikuIE1hdGNoCiAqICB0aGlzIG9yIHN1cGVyLgogKi8KLypPQlMqCmlkZW50UHJpbWFyeQoJOgkodGExOnR5cGVBcmd1bWVudHMhKT8KCQlJREVOVAoJCS8vIFN5bnRheCBmb3IgbWV0aG9kIGludm9jYXRpb24gd2l0aCB0eXBlIGFyZ3VtZW50cyBpcwoJCS8vIDxTdHJpbmc+Zm9vKCJibGFoIikKCQkoCgkJCW9wdGlvbnMgewoJCQkJLy8gLmlkZW50IGNvdWxkIG1hdGNoIGhlcmUgb3IgaW4gcG9zdGZpeEV4cHJlc3Npb24uCgkJCQkvLyBXZSBkbyB3YW50IHRvIG1hdGNoIGhlcmUuIFR1cm4gb2ZmIHdhcm5pbmcuCgkJCQlncmVlZHk9dHJ1ZTsKCQkJCS8vIFRoaXMgdHVybnMgdGhlIGFtYmlndWl0eSB3YXJuaW5nIG9mIHRoZSBzZWNvbmQgYWx0ZXJuYXRpdmUKCQkJCS8vIG9mZi4gU2VlIGJlbG93LiAoVGhlICJmYWxzZSIgcHJlZGljYXRlIG1ha2VzIGl0IG5vbi1pc3N1ZSkKCQkJCXdhcm5XaGVuRm9sbG93QW1iaWc9ZmFsc2U7CgkJCX0KCQkJLy8gd2UgaGF2ZSBhIG5ldyBub25kZXRlcm1pbmlzbSBiZWNhdXNlIG9mCgkJCS8vIHR5cGVBcmd1bWVudHMuLi4gb25seSBhIHN5bnRhY3RpYyBwcmVkaWNhdGUgd2lsbCBoZWxwLi4uCgkJCS8vIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhpcyBsb29wIGhlcmUgY29uZmxpY3RzIHdpdGgKCQkJLy8gRE9UIHR5cGVBcmd1bWVudHMgInN1cGVyIiBpbiBwb3N0Zml4RXhwcmVzc2lvbiAoaz0yKQoJCQkvLyBBIHByb3BlciBzb2x1dGlvbiB3b3VsZCByZXF1aXJlIGEgbG90IG9mIHJlZmFjdG9yaW5nLi4uCgkJOgkoRE9UICh0eXBlQXJndW1lbnRzKT8gSURFTlQpID0+CgkJCQlET1ReICh0YTI6dHlwZUFyZ3VtZW50cyEpPyBJREVOVAoJCXwJe2ZhbHNlfT8JLy8gRklYTUU6IHRoaXMgaXMgdmVyeSB1Z2x5IGJ1dCBpdCBzZWVtcyB0byB3b3JrLi4uCgkJCQkJCS8vIHRoaXMgd2lsbCBhbHNvIHByb2R1Y2UgYW4gQU5UTFIgd2FybmluZyEKCQkJCS8vIFVuZm9ydHVuYXRlbHkgYSBzeW50YWN0aWMgcHJlZGljYXRlIGNhbiBvbmx5IHNlbGVjdCBvbmUgb2YKCQkJCS8vIG11bHRpcGxlIGFsdGVybmF0aXZlcyBvbiB0aGUgc2FtZSBsZXZlbCwgbm90IGJyZWFrIG91dCBvZgoJCQkJLy8gYW4gZW5jbG9zaW5nIGxvb3AsIHdoaWNoIGlzIHdoeSB0aGlzIHVnbHkgaGFjayAoYSBmYWtlCgkJCQkvLyBlbXB0eSBhbHRlcm5hdGl2ZSB3aXRoIGFsd2F5cy1mYWxzZSBzZW1hbnRpYyBwcmVkaWNhdGUpCgkJCQkvLyBpcyBuZWNlc3NhcnkuCgkJKSoKCQkoCgkJCW9wdGlvbnMgewoJCQkJLy8gQVJSQVlfREVDTEFSQVRPUiBoZXJlIGNvbmZsaWN0cyB3aXRoIElOREVYX09QIGluCgkJCQkvLyBwb3N0Zml4RXhwcmVzc2lvbiBvbiBMQlJBQ0sgUkJSQUNLLgoJCQkJLy8gV2Ugd2FudCB0byBtYXRjaCBbXSBoZXJlLCBzbyBncmVlZHkuIFRoaXMgb3ZlcmNvbWVzCgkJCQkvLyBsaW1pdGF0aW9uIG9mIGxpbmVhciBhcHByb3hpbWF0ZSBsb29rYWhlYWQuCgkJCQlncmVlZHk9dHJ1ZTsKCQkJfQoJCToJKAlscDpMUEFSRU5eIHsjbHAuc2V0VHlwZShNRVRIT0RfQ0FMTCk7fQoJCQkJLy8gaWYgdGhlIGlucHV0IGlzIHZhbGlkLCBvbmx5IHRoZSBsYXN0IElERU5UIG1heQoJCQkJLy8gaGF2ZSBwcmVjZWRpbmcgdHlwZUFyZ3VtZW50cy4uLiByYXRoZXIgaGFja3ksIHRoaXMgaXMuLi4KCQkJCXtpZiAoI3RhMiAhPSBudWxsKSBhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsICN0YTIpO30KCQkJCXtpZiAoI3RhMiA9PSBudWxsKSBhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsICN0YTEpO30KCQkJCWFyZ0xpc3QgUlBBUkVOIQoJCQkpCgkJfAkoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOgoJCQkJbGJjOkxCUkFDS14geyNsYmMuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9IFJCUkFDSyEKCQkJKSsKCQkpPwoJOwoqT0JTKi8KCi8qKiBvYmplY3QgaW5zdGFudGlhdGlvbi4KICogIFRyZWVzIGFyZSBidWlsdCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGlucHV0L3RyZWUgcGFpcnM6CiAqCiAqICBuZXcgVCgpCiAqCiAqICBuZXcKICogICB8CiAqICAgVCAtLSAgRUxJU1QKICoJCSAgIHwKICoJCSAgYXJnMSAtLSBhcmcyIC0tIC4uIC0tIGFyZ24KICoKICogIG5ldyBpbnRbXQogKgogKiAgbmV3CiAqICAgfAogKiAgaW50IC0tIEFSUkFZX0RFQ0xBUkFUT1IKICoKICogIG5ldyBpbnRbXSB7MSwyfQogKgogKiAgbmV3CiAqICAgfAogKiAgaW50IC0tIEFSUkFZX0RFQ0xBUkFUT1IgLS0gQVJSQVlfSU5JVAogKgkJCQkJCQkJICB8CiAqCQkJCQkJCQlFWFBSIC0tIEVYUFIKICoJCQkJCQkJCSAgfAkgIHwKICoJCQkJCQkJCSAgMQkgIDIKICoKICogIG5ldyBpbnRbM10KICogIG5ldwogKiAgIHwKICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SCiAqCQkJCXwKICoJCQkgIEVYUFIKICoJCQkJfAogKgkJCQkzCiAqCiAqICBuZXcgaW50WzFdWzJdCiAqCiAqICBuZXcKICogICB8CiAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUgogKgkJCSAgIHwKICoJCSBBUlJBWV9ERUNMQVJBVE9SIC0tIEVYUFIKICoJCQkgICB8CQkJICB8CiAqCQkJIEVYUFIJCQkgMQogKgkJCSAgIHwKICoJCQkgICAyCiAqCiAqLwpuZXdFeHByZXNzaW9uCgkJe2Jvb2xlYW4geno7IC8qaWdub3JlZCovfQoJOgkibmV3Il4gKHR5cGVBcmd1bWVudHMpPyB0eXBlCgkJKAlMUEFSRU4hIHp6PWFyZ0xpc3QgUlBBUkVOISAKCQkJLypUT0RPIC0gTllJKiAoYW5vbnltb3VzSW5uZXJDbGFzc0Jsb2NrKT8gKk5ZSSovCgovKk9CUyoKCQkJLy9qYXZhIDEuMQoJCQkvLyBOb3RlOiBUaGlzIHdpbGwgYWxsb3cgYmFkIGNvbnN0cnVjdHMgbGlrZQoJCQkvLwluZXcgaW50WzRdW11bM10ge2V4cCxleHB9LgoJCQkvLwlUaGVyZSBuZWVkcyB0byBiZSBhIHNlbWFudGljIGNoZWNrIGhlcmUuLi4KCQkJLy8gdG8gbWFrZSBzdXJlOgoJCQkvLyAgIGEpIFsgZXhwciBdIGFuZCBbIF0gYXJlIG5vdCBtaXhlZAoJCQkvLyAgIGIpIFsgZXhwciBdIGFuZCBhbiBpbml0IGFyZSBub3QgdXNlZCB0b2dldGhlcgoKCQl8CW5ld0FycmF5RGVjbGFyYXRvciAoYXJyYXlJbml0aWFsaXplcik/CgkJCS8vIEdyb292eSBkb2VzIG5vdCBzdXBwb3J0IEphdmEgc3ludGF4IGZvciBpbml0aWFsaXplZCBuZXcgYXJyYXlzLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc2VxdWVuY2UgY29uc3RydWN0b3JzIGluc3RlYWQuCgoqT0JTKi8KCQkpCgkvLyBERUNJREU6ICBLZWVwICduZXcgeCgpJyBzeW50YXg/Cgk7CgovKk5ZSSoKYW5vbnltb3VzSW5uZXJDbGFzc0Jsb2NrCiAgICAgICAgOiAgIGNsYXNzQmxvY2sKICAgICAgICA7CipOWUkqLwoKYXJnTGlzdApyZXR1cm5zIFtib29sZWFuIGhhc0xhYmVscyA9IGZhbHNlXQp7IGJvb2xlYW4gaGwyOyB9CiAgICAgICAgOiAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhYmVscz1hcmd1bWVudAogICAgICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB7IGdyZWVkeT10cnVlOyB9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BISBobDI9YXJndW1lbnQgICAgICAgICAgICAgeyBoYXNMYWJlbHMgfD0gaGwyOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICkqCiAgICAgICAgICAgICAgICAgICAgICAgIHsjYXJnTGlzdCA9ICMoI1tFTElTVCwiRUxJU1QiXSwgYXJnTGlzdCk7fQogICAgICAgICAgICAgICAgfCAgICAgICAvKm5vdGhpbmcqLwogICAgICAgICAgICAgICAgICAgICAgICB7I2FyZ0xpc3QgPSAjW0VMSVNULCJFTElTVCJdO30KICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAvLyBERUNJREU6IEFsbG93IGFuIGV4dHJhIHRyYWlsaW5nIGNvbW1hLCBmb3IgZWFzeSBlZGl0aW5nIG9mIGxvbmcgbGlzdHMuCiAgICAgICAgICAgICAgICAvLyBUaGlzIGFwcGxpZXMgdW5pZm9ybWx5IHRvIFt4LHksXSBhbmQgKHgseSwpLiAgSXQgaXMgaW5zcGlyZWQgYnkgSmF2YSdzIGFbXSA9IHt4LHksfS4KICAgICAgICAgICAgICAgICggICBDT01NQSEgICk/CiAgICAgICAgOwoKLyoqIEEgc2luZ2xlIGFyZ3VtZW50IGluICguLi4pIG9yIFsuLi5dLiAgQ29ycmVzcG9uZHMgdG8gdG8gYSBtZXRob2Qgb3IgY2xvc3VyZSBwYXJhbWV0ZXIuCiAqICBNYXkgYmUgbGFiZWxlZC4gIE1heSBiZSBtb2RpZmllZCBieSB0aGUgc3ByZWFkIG9yIG9wdGlvbmFsaXR5IG9wZXJhdG9ycyAqLCA/LgogKi8KYXJndW1lbnQKcmV0dXJucyBbYm9vbGVhbiBoYXNMYWJlbCA9IGZhbHNlXQogICAgICAgIDoKICAgICAgICAgICAgICAgIC8vIE9wdGlvbmFsIGFyZ3VtZW50IGxhYmVsLgogICAgICAgICAgICAgICAgLy8gVXNhZ2U6ICBTcGVjaWZpZXMgYSBtYXAga2V5LCBvciBhIGtleXdvcmRlZCBhcmd1bWVudC4KICAgICAgICAgICAgICAgICggICAoYXJndW1lbnRMYWJlbFN0YXJ0KSA9PgogICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudExhYmVsIGM6Q09MT05eICAgICAgICAgICAgICAgICAgeyNjLnNldFR5cGUoTEFCRUxFRF9BUkcpO30KICAgICAgICAgICAgICAgICk/CgogICAgICAgICAgICAgICAgKCAgICAgICAvLyBTcHJlYWQgb3BlcmF0b3I6ICBmKCpbYSxiLGNdKSAgPT09ICBmKGEsYixjKTsgIGYoMSwqbnVsbCwyKSAgPT09ICBmKDEsMikuCiAgICAgICAgICAgICAgICAgICAgICAgIHNwOlNUQVJeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7I3NwLnNldFR5cGUoU1BSRUFEX0FSRyk7fQogICAgICAgICAgICAgICAgfCAgICAgICAvLyBPcHRpb25hbC1udWxsIG9wZXJhdG9yOiAgZigxLD94LDIpICA9PT0gICh4PT1udWxsKT9mKDEsMik6ZigxLHgsMikKICAgICAgICAgICAgICAgICAgICAgICAgb3A6UVVFU1RJT05eICAgICAgICAgICAgICAgICAgICB7I29wLnNldFR5cGUoT1BUSU9OQUxfQVJHKTt9CiAgICAgICAgICAgICAgICApPwoKICAgICAgICAgICAgICAgIGV4cHJlc3Npb24KICAgICAgICA7CgovKiogQSBsYWJlbCBmb3IgYW4gYXJndW1lbnQgaXMgb2YgdGhlIGZvcm0gYTpiLCAnYSc6YiwgImEiOmIsIG9yIChhKTpiLgogKiAgICAgIFRoZSBsYWJlbHMgaW4gKGE6YiksICgnYSc6YiksIGFuZCAoImEiOmIpIGFyZSBpbiBhbGwgd2F5cyBlcXVpdmFsZW50LAogKiAgICAgIGV4Y2VwdCB0aGF0IHRoZSBxdW90ZXMgYWxsb3cgbW9yZSBzcGVsbGluZ3MuCiAqICBFcXVpdmFsZW50IGR5bmFtaWNhbGx5IGNvbXB1dGVkIGxhYmVscyBhcmUgKCgnYScpOmIpIGFuZCAoIiR7J2EnfSI6YikKICogIGJ1dCBub3QgKChhKTpiKSBvciAiJGEiOmIsIHNpbmNlIHRoZSBsYXR0ZXIgY2FzZXMgZXZhbHVhdGUgKGEpIGFzIGEgbm9ybWFsIGlkZW50aWZpZXIuCiAqICAgICAgQm90dG9tIGxpbmU6ICBJZiB5b3Ugd2FudCBhIHRydWx5IHZhcmlhYmxlIGxhYmVsLCB1c2UgcGFyZW5zIGFuZCBzYXkgKChhKTpiKS4KICovCmFyZ3VtZW50TGFiZWwKICAgICAgICA6ICAgU1RSSU5HX0xJVEVSQUwKICAgICAgICB8ICAgaWQ6SURFTlQgICAgICAgICAgICAgICAgICAgIHsjaWQuc2V0VHlwZShTVFJJTkdfTElURVJBTCk7fSAgLy8gaWRlbnRpZmllcnMgYXJlIHNlbGYtcXVvdGluZyBpbiB0aGlzIGNvbnRleHQKICAgICAgICB8ICAgc3RyaW5nQ29uc3RydWN0b3JFeHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgZXhwcmVzc2lvbgogICAgICAgIHwgICBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIGV4cHJlc3Npb24KICAgICAgICA7CgovKiogRm9yIGxvb2thaGVhZCBvbmx5LiAgRmFzdCBhcHByb3hpbWF0ZSBwYXJzZSBvZiBhIHN0YXRlbWVudExhYmVsIGZvbGxvd2VkIGJ5IGEgY29sb24uICovCmFyZ3VtZW50TGFiZWxTdGFydCEKICAgICAgICA6ICAgKCBJREVOVCB8IFNUUklOR19MSVRFUkFMIHwgKExQQVJFTiB8IFNUUklOR19DVE9SX1NUQVJUKT0+IGJhbGFuY2VkQnJhY2tldHMgKSBDT0xPTgogICAgICAgIDsKCi8qT0JTKgpuZXdBcnJheURlY2xhcmF0b3IKCToJKAoJCQkvLyBDT05GTElDVDoKCQkJLy8gbmV3RXhwcmVzc2lvbiBpcyBhIHByaW1hcnlFeHByZXNzaW9uIHdoaWNoIGNhbiBiZQoJCQkvLyBmb2xsb3dlZCBieSBhbiBhcnJheSBpbmRleCByZWZlcmVuY2UuIFRoaXMgaXMgb2ssCgkJCS8vIGFzIHRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIHN0YXkgaW4gdGhpcyBsb29wIGFzCgkJCS8vIGxvbmcgYXMgaXQgc2VlcyBhbiBMQlJBQ0sgKHByb3BlciBiZWhhdmlvcikKCQkJb3B0aW9ucyB7CgkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7CgkJCX0KCQk6CgkJCWxiOkxCUkFDS14geyNsYi5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30KCQkJCShleHByZXNzaW9uKT8KCQkJUkJSQUNLIQoJCSkrCgk7CipPQlMqLwoKY29uc3RhbnQKICAgICAgICA6ICAgICAgIE5VTV9JTlQKICAgICAgICB8ICAgICAgIFNUUklOR19MSVRFUkFMCiAgICAgICAgfCAgICAgICBOVU1fRkxPQVQKICAgICAgICB8ICAgICAgIE5VTV9MT05HCiAgICAgICAgfCAgICAgICBOVU1fRE9VQkxFCiAgICAgICAgfCAgIE5VTV9CSUdfSU5UCiAgICAgICAgfCAgIE5VTV9CSUdfREVDSU1BTAogICAgICAgIDsKCi8qKiBGYXN0IGxvb2thaGVhZCBhY3Jvc3MgYmFsYW5jZWQgYnJhY2tldHMgb2YgYWxsIHNvcnRzLiAqLwpiYWxhbmNlZEJyYWNrZXRzIQogICAgICAgIDogICBMUEFSRU4gYmFsYW5jZWRUb2tlbnMgUlBBUkVOCiAgICAgICAgfCAgIExCUkFDSyBiYWxhbmNlZFRva2VucyBSQlJBQ0sKICAgICAgICB8ICAgTENVUkxZIGJhbGFuY2VkVG9rZW5zIFJDVVJMWQogICAgICAgIHwgICBTVFJJTkdfQ1RPUl9TVEFSVCBiYWxhbmNlZFRva2VucyBTVFJJTkdfQ1RPUl9FTkQKICAgICAgICA7CgpiYWxhbmNlZFRva2VucyEKICAgICAgICA6ICAgKCAgIGJhbGFuY2VkQnJhY2tldHMKICAgICAgICAgICAgICAgIHwgICB+KExQQVJFTnxMQlJBQ0t8TENVUkxZIHwgU1RSSU5HX0NUT1JfU1RBUlQKICAgICAgICAgICAgICAgICAgICAgfFJQQVJFTnxSQlJBQ0t8UkNVUkxZIHwgU1RSSU5HX0NUT1JfRU5EKQogICAgICAgICAgICAgICAgKSoKICAgICAgICA7CgpiYWxhbmNlZFRva2Vuc05vU2VwIQogICAgICAgIDogICAoICAgYmFsYW5jZWRCcmFja2V0cwogICAgICAgICAgICAgICAgfCAgIH4oTFBBUkVOfExCUkFDS3xMQ1VSTFkgfCBTVFJJTkdfQ1RPUl9TVEFSVAogICAgICAgICAgICAgICAgICAgICB8UlBBUkVOfFJCUkFDS3xSQ1VSTFkgfCBTVFJJTkdfQ1RPUl9FTkQgICAgIHwgU0VNSXxOTFMpCiAgICAgICAgICAgICAgICApKgogICAgICAgIDsKCi8qKiBBIHN0YXRlbWVudCBzZXBhcmF0b3IgaXMgZWl0aGVyIGEgc2VtaWNvbG9uIG9yIGEgc2lnbmlmaWNhbnQgbmV3bGluZS4gCiAqICBBbnkgbnVtYmVyIG9mIGFkZGl0aW9uYWwgKGluc2lnbmlmaWNhbnQpIG5ld2xpbmVzIG1heSBhY2NvbXBhbnkgaXQuCiAqICAoQWxsIHRoZSAnIScgc2lnbnMgc2ltcGx5IHN1cHByZXNzIHRoZSBkZWZhdWx0IEFTVCBidWlsZGluZy4pCiAqLwpzZXAhCiAgICAgICAgOiAgIFNFTUkhIG5scyEKICAgICAgICB8ICAgTkxTISAgICAgICAgICAgICAgICAvLyB0aGlzIG5ld2xpbmUgaXMgc2lnbmlmaWNhbnQhCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfToKICAgICAgICAgICAgICAgICAgICAgICAgU0VNSSEgbmxzISAgICAgIC8vIHRoaXMgc3VwZXJmbHVvdXMgc2VtaWNvbG9uIGlzIGdvYmJsZWQKICAgICAgICAgICAgICAgICk/CiAgICAgICAgOwoKLyoqIFplcm8gb3IgbW9yZSBpbnNpZ25pZmljYW50IG5ld2xpbmVzLCBhbGwgZ29iYmxlZCB1cCBhbmQgdGhyb3duIGF3YXkuICovCm5scyEgICAgOgogICAgICAgICAgICAgICAgKG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfTogTkxTISk/CiAgICAgICAgOwoKCi8vIFRPIERPOiBkZWNsYXJhdGlvbnMgaW4gZXhwcmVzc2lvbiBwb3NpdGlvbgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRoZSBHcm9vdnkgc2Nhbm5lcgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgR3Jvb3Z5TGV4ZXIgZXh0ZW5kcyBMZXhlcjsKCm9wdGlvbnMgewoJZXhwb3J0Vm9jYWI9R3Jvb3Z5OwkJLy8gY2FsbCB0aGUgdm9jYWJ1bGFyeSAiR3Jvb3Z5IgoJdGVzdExpdGVyYWxzPWZhbHNlOwkJLy8gZG9uJ3QgYXV0b21hdGljYWxseSB0ZXN0IGZvciBsaXRlcmFscwoJaz00OwkJCQkJLy8gZm91ciBjaGFyYWN0ZXJzIG9mIGxvb2thaGVhZAoJY2hhclZvY2FidWxhcnk9J1x1MDAwMycuLidcdUZGRkYnOwoJLy8gd2l0aG91dCBpbmxpbmluZyBzb21lIGJpdHNldCB0ZXN0cywgY291bGRuJ3QgZG8gdW5pY29kZTsKCS8vIEkgbmVlZCB0byBtYWtlIEFOVExSIGdlbmVyYXRlIHNtYWxsZXIgYml0c2V0czsgc2VlCgkvLyBib3R0b20gb2YgR3Jvb3Z5TGV4ZXIuamF2YQoJY29kZUdlbkJpdHNldFRlc3RUaHJlc2hvbGQ9MjA7Cn0KCnsKCS8qKiBmbGFnIGZvciBlbmFibGluZyB0aGUgImFzc2VydCIga2V5d29yZCAqLwoJcHJpdmF0ZSBib29sZWFuIGFzc2VydEVuYWJsZWQgPSB0cnVlOwoJLyoqIGZsYWcgZm9yIGVuYWJsaW5nIHRoZSAiZW51bSIga2V5d29yZCAqLwoJcHJpdmF0ZSBib29sZWFuIGVudW1FbmFibGVkID0gdHJ1ZTsKCgkvKiogRW5hYmxlIHRoZSAiYXNzZXJ0IiBrZXl3b3JkICovCglwdWJsaWMgdm9pZCBlbmFibGVBc3NlcnQoYm9vbGVhbiBzaG91bGRFbmFibGUpIHsgYXNzZXJ0RW5hYmxlZCA9IHNob3VsZEVuYWJsZTsgfQoJLyoqIFF1ZXJ5IHRoZSAiYXNzZXJ0IiBrZXl3b3JkIHN0YXRlICovCglwdWJsaWMgYm9vbGVhbiBpc0Fzc2VydEVuYWJsZWQoKSB7IHJldHVybiBhc3NlcnRFbmFibGVkOyB9CgkvKiogRW5hYmxlIHRoZSAiZW51bSIga2V5d29yZCAqLwoJcHVibGljIHZvaWQgZW5hYmxlRW51bShib29sZWFuIHNob3VsZEVuYWJsZSkgeyBlbnVtRW5hYmxlZCA9IHNob3VsZEVuYWJsZTsgfQoJLyoqIFF1ZXJ5IHRoZSAiZW51bSIga2V5d29yZCBzdGF0ZSAqLwoJcHVibGljIGJvb2xlYW4gaXNFbnVtRW5hYmxlZCgpIHsgcmV0dXJuIGVudW1FbmFibGVkOyB9CgoKLyoqIEJ1bXBlZCB3aGVuIGluc2lkZSAnW3hdJyBvciAnKHgpJywgcmVzZXQgaW5zaWRlICd7eH0nLiAgU2VlIE9ORV9OTC4gICovCglwcm90ZWN0ZWQgaW50IHBhcmVuTGV2ZWwgPSAwOwoJcHJvdGVjdGVkIGludCBzdXBwcmVzc05ld2xpbmUgPSAwOyAgLy8gYmUgcmVhbGx5IG1lYW4gdG8gbmV3bGluZXMgaW5zaWRlIHN0cmluZ3MKCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNDU19UUklQTEUgPSAxLCBTQ1NfVkFMID0gMiwgU0NTX0xJVCA9IDQsIFNDU19MSU1JVCA9IDg7Cglwcm90ZWN0ZWQgaW50IHN0cmluZ0N0b3JTdGF0ZSA9IDA7ICAvLyBoYWNrIHN0cmluZyBjb25zdHJ1Y3RvciBib3VuZGFyaWVzCgkvKiogUHVzaCBwYXJlbkxldmVsIGhlcmUgYW5kIHJlc2V0IHdoZW5ldmVyIGluc2lkZSAne3h9Jy4gKi8KCXByb3RlY3RlZCBBcnJheUxpc3QgcGFyZW5MZXZlbFN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwoJcHJvdGVjdGVkIFRva2VuIGxhc3RUb2tlbiA9IFRva2VuLmJhZFRva2VuOwoKCXByb3RlY3RlZCB2b2lkIHB1c2hQYXJlbkxldmVsKCkgewoJCXBhcmVuTGV2ZWxTdGFjay5hZGQobmV3IEludGVnZXIocGFyZW5MZXZlbCo4ICsgc3RyaW5nQ3RvclN0YXRlKSk7CgkJcGFyZW5MZXZlbCA9IDA7CgkJc3RyaW5nQ3RvclN0YXRlID0gMDsKCX0KCXByb3RlY3RlZCB2b2lkIHBvcFBhcmVuTGV2ZWwoKSB7CgkJaW50IG5wbCA9IHBhcmVuTGV2ZWxTdGFjay5zaXplKCk7CgkJaWYgKG5wbCA9PSAwKSAgcmV0dXJuOwoJCWludCBpID0gKChJbnRlZ2VyKSBwYXJlbkxldmVsU3RhY2sucmVtb3ZlKC0tbnBsKSkuaW50VmFsdWUoKTsKCQlwYXJlbkxldmVsICAgICAgPSBpIC8gU0NTX0xJTUlUOwoJCXN0cmluZ0N0b3JTdGF0ZSA9IGkgJSBTQ1NfTElNSVQ7Cgl9CgkKCXByb3RlY3RlZCB2b2lkIHJlc3RhcnRTdHJpbmdDdG9yKGJvb2xlYW4gZXhwZWN0TGl0ZXJhbCkgewoJCWlmIChzdHJpbmdDdG9yU3RhdGUgIT0gMCkgewoJCQlzdHJpbmdDdG9yU3RhdGUgPSAoZXhwZWN0TGl0ZXJhbD8gU0NTX0xJVDogU0NTX1ZBTCkgKyAoc3RyaW5nQ3RvclN0YXRlICYgU0NTX1RSSVBMRSk7CgkJfQoJfQoKCXZvaWQgbmV3bGluZUNoZWNrKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKCQlpZiAoc3VwcHJlc3NOZXdsaW5lID4gMCkgewoJCQlzdXBwcmVzc05ld2xpbmUgPSAwOwoJCQlyZXF1aXJlKHN1cHByZXNzTmV3bGluZSA9PSAwLAoJCQkJImVuZCBvZiBsaW5lIHJlYWNoZWQgd2l0aGluIGEgc2ltcGxlIHN0cmluZyAneCcgb3IgXCJ4XCIiLAoJCQkJImZvciBtdWx0aS1saW5lIGxpdGVyYWxzLCB1c2UgdHJpcGxlIHF1b3RlcyAnJyd4JycnIG9yIFwiXCJcInhcIlwiXCIiKTsKCQl9CgkJbmV3bGluZSgpOwoJfQoJCgkvKiogVGhpcyBpcyBhIGJpdCBvZiBwbHVtYmluZyB3aGljaCByZXN1bWVzIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0cnVjdG9yIGJvZGllcywKCSAqICBhZnRlciBhbiBlbWJlZGRlZCBleHByZXNzaW9uIGhhcyBiZWVuIHBhcnNlZC4KCSAqICBVc2FnZTogIG5ldyBHcm9vdnlSZWNvZ25pemVyKG5ldyBHcm9vdnlMZXhlcihpbikucGx1bWIoKSkuCgkgKi8KCXB1YmxpYyBUb2tlblN0cmVhbSBwbHVtYigpIHsKCQlyZXR1cm4gbmV3IFRva2VuU3RyZWFtKCkgewoJCQlwdWJsaWMgVG9rZW4gbmV4dFRva2VuKCkgdGhyb3dzIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKCQkJCWlmIChzdHJpbmdDdG9yU3RhdGUgPj0gU0NTX0xJVCkgewoJCQkJCS8vIFRoaXMgZ29vIGlzIG1vZGVsZWQgdXBvbiB0aGUgQU5UTFIgY29kZSBmb3IgbmV4dFRva2VuOgoJCQkJCWJvb2xlYW4gdHJpcGxlUXVvdGUgPSAoc3RyaW5nQ3RvclN0YXRlICYgU0NTX1RSSVBMRSkgIT0gMDsKCQkJCQlzdHJpbmdDdG9yU3RhdGUgPSAwOyAgLy8gZ2V0IG91dCBvZiB0aGlzIG1vZGUsIG5vdwoJCQkJCXJlc2V0VGV4dCgpOwoJCQkJCXRyeSB7CgkJCQkJCW1TVFJJTkdfQ1RPUl9FTkQodHJ1ZSwgLypmcm9tU3RhcnQ6Ki9mYWxzZSwgdHJpcGxlUXVvdGUpOwoJCQkJCQlyZXR1cm4gbGFzdFRva2VuID0gX3JldHVyblRva2VuOwoJCQkJCX0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKCQkJCQkJdGhyb3cgbmV3IFRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb24oZSk7CgkJCQkJfSBjYXRjaCAoQ2hhclN0cmVhbUV4Y2VwdGlvbiBjc2UpIHsKCQkJCQkJaWYgKCBjc2UgaW5zdGFuY2VvZiBDaGFyU3RyZWFtSU9FeGNlcHRpb24gKSB7CgkJCQkJCQl0aHJvdyBuZXcgVG9rZW5TdHJlYW1JT0V4Y2VwdGlvbigoKENoYXJTdHJlYW1JT0V4Y2VwdGlvbiljc2UpLmlvKTsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCXRocm93IG5ldyBUb2tlblN0cmVhbUV4Y2VwdGlvbihjc2UuZ2V0TWVzc2FnZSgpKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiBsYXN0VG9rZW4gPSBHcm9vdnlMZXhlci50aGlzLm5leHRUb2tlbigpOwoJCQl9CgkJfTsKCX0KCgkvLyBzdHVmZiB0byBhZGp1c3QgQU5UTFIncyB0cmFjaW5nIG1hY2hpbmVyeQogICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRyYWNpbmcgPSBmYWxzZTsgIC8vIG9ubHkgZWZmZWN0aXZlIGlmIGFudGxyLlRvb2wgaXMgcnVuIHdpdGggLXRyYWNlTGV4ZXIKICAgIHB1YmxpYyB2b2lkIHRyYWNlSW4oU3RyaW5nIHJuYW1lKSB0aHJvd3MgQ2hhclN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgaWYgKCFHcm9vdnlMZXhlci50cmFjaW5nKSAgcmV0dXJuOwogICAgICAgIHN1cGVyLnRyYWNlSW4ocm5hbWUpOwogICAgfQogICAgcHVibGljIHZvaWQgdHJhY2VPdXQoU3RyaW5nIHJuYW1lKSB0aHJvd3MgQ2hhclN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgaWYgKCFHcm9vdnlMZXhlci50cmFjaW5nKSAgcmV0dXJuOwogICAgICAgIGlmIChfcmV0dXJuVG9rZW4gIT0gbnVsbCkgIHJuYW1lICs9IHRva2VuU3RyaW5nT2YoX3JldHVyblRva2VuKTsKICAgICAgICBzdXBlci50cmFjZU91dChybmFtZSk7CiAgICB9Cglwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCB0dHlwZXM7Cglwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9rZW5TdHJpbmdPZihUb2tlbiB0KSB7CgkJaWYgKHR0eXBlcyA9PSBudWxsKSB7CgkJCWphdmEudXRpbC5IYXNoTWFwIG1hcCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZFtdIGZpZWxkcyA9IEdyb292eVRva2VuVHlwZXMuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKCQkJCWlmIChmaWVsZHNbaV0uZ2V0VHlwZSgpICE9IGludC5jbGFzcykgIGNvbnRpbnVlOwoJCQkJdHJ5IHsKCQkJCQltYXAucHV0KGZpZWxkc1tpXS5nZXQobnVsbCksIGZpZWxkc1tpXS5nZXROYW1lKCkpOwoJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlZSkgewoJCQkJfQoJCQl9CgkJCXR0eXBlcyA9IG1hcDsKCQl9CgkJSW50ZWdlciB0dCA9IG5ldyBJbnRlZ2VyKHQuZ2V0VHlwZSgpKTsKCQlPYmplY3QgdHRuID0gdHR5cGVzLmdldCh0dCk7CgkJaWYgKHR0biA9PSBudWxsKSAgdHRuID0gIjwiK3R0KyI+IjsKCQlyZXR1cm4gIlsiK3R0bisiLFwiIit0LmdldFRleHQoKSsiXCJdIjsKCX0KCglwcm90ZWN0ZWQgR3Jvb3Z5UmVjb2duaXplciBwYXJzZXI7ICAvLyBsaXR0bGUtdXNlZCBsaW5rOyBUTyBETzogZ2V0IHJpZCBvZgoJcHJpdmF0ZSB2b2lkIHJlcXVpcmUoYm9vbGVhbiB6LCBTdHJpbmcgcHJvYmxlbSwgU3RyaW5nIHNvbHV0aW9uKSB0aHJvd3MgU2VtYW50aWNFeGNlcHRpb24gewoJCS8vIFRPIERPOiBEaXJlY3QgdG8gYSBjb21tb24gZXJyb3IgaGFuZGxlciwgcmF0aGVyIHRoYW4gdGhyb3VnaCB0aGUgcGFyc2VyLgoJCWlmICgheikgIHBhcnNlci5yZXF1aXJlRmFpbGVkKHByb2JsZW0sIHNvbHV0aW9uKTsKCX0KfQoKLy8gVE8gRE86ICBSZWdleHAgb3BzLCByYW5nZSBvcHMsIEJvcm5lby1zdHlsZSBvcHMuCgovKiAqVE9ETyoKRE9UICh3aXRoIGRvdWJsZSBhbmQgdHJpcGxlIGRvdCkgaXMgYW4gb3JkaW5hcnkgb3BlcmF0b3IKdG9rZW47IGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBjb21tZW50ZWQgb3V0LgoqLwoKLy8gT1BFUkFUT1JTClFVRVNUSU9OCQk6CSc/JwkJOwpMUEFSRU4JCQk6CScoJwkJeysrcGFyZW5MZXZlbDt9OwpSUEFSRU4JCQk6CScpJwkJey0tcGFyZW5MZXZlbDt9OwpMQlJBQ0sJCQk6CSdbJwkJeysrcGFyZW5MZXZlbDt9OwpSQlJBQ0sJCQk6CSddJwkJey0tcGFyZW5MZXZlbDt9OwpMQ1VSTFkJCQk6CSd7JwkJe3B1c2hQYXJlbkxldmVsKCk7fTsKUkNVUkxZCQkJOgknfScJCXtwb3BQYXJlbkxldmVsKCk7IGlmKHN0cmluZ0N0b3JTdGF0ZSE9MCkgcmVzdGFydFN0cmluZ0N0b3IodHJ1ZSk7fTsKQ09MT04JCQk6CSc6JwkJOwpDT01NQQkJCToJJywnCQk7CkRPVAkJCToJJy4nCQk7CkFTU0lHTgkJCToJJz0nCQk7CkVRVUFMCQkJOgkiPT0iCTsKTE5PVAkJCToJJyEnCQk7CkJOT1QJCQk6CSd+JwkJOwpOT1RfRVFVQUwJCToJIiE9Igk7CkRJVgkJCQk6CScvJwkJOwpESVZfQVNTSUdOCQk6CSIvPSIJOwpQTFVTCQkJOgknKycJCTsKUExVU19BU1NJR04JCToJIis9Igk7CklOQwkJCQk6CSIrKyIJOwpNSU5VUwkJCToJJy0nCQk7Ck1JTlVTX0FTU0lHTgk6CSItPSIJOwpERUMJCQkJOgkiLS0iCTsKU1RBUgkJCToJJyonCQk7ClNUQVJfQVNTSUdOCQk6CSIqPSIJOwpNT0QJCQkJOgknJScJCTsKTU9EX0FTU0lHTgkJOgkiJT0iCTsKU1IJCQkJOgkiPj4iCTsKU1JfQVNTSUdOCQk6CSI+Pj0iCTsKQlNSCQkJCToJIj4+PiIJOwpCU1JfQVNTSUdOCQk6CSI+Pj49Igk7CkdFCQkJCToJIj49Igk7CkdUCQkJCToJIj4iCQk7ClNMCQkJCToJIjw8Igk7ClNMX0FTU0lHTgkJOgkiPDw9Igk7CkxFCQkJCToJIjw9Igk7CkxUCQkJCToJJzwnCQk7CkJYT1IJCQk6CSdeJwkJOwpCWE9SX0FTU0lHTgkJOgkiXj0iCTsKQk9SCQkJCToJJ3wnCQk7CkJPUl9BU1NJR04JCToJInw9Igk7CkxPUgkJCQk6CSJ8fCIJOwpCQU5ECQkJOgknJicJCTsKQkFORF9BU1NJR04JCToJIiY9Igk7CkxBTkQJCQk6CSImJiIJOwpTRU1JCQkJOgknOycJCTsKRE9MTEFSICAgICAgICAgICAgICAgICAgOiAgICAgICAnJCcgICAgICAgICAgICAgOwpSQU5HRV9JTkNMVVNJVkUJCTogICAgICAgIi4uIiAgICA7CgovLyBXaGl0ZXNwYWNlIC0tIGlnbm9yZWQKV1MgICAgICA6ICAgICAgICgKICAgICAgICAgICAgICAgIG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfToKICAgICAgICAgICAgICAgICAgICAgICAgJyAnCiAgICAgICAgICAgICAgICB8ICAgICAgICdcdCcKICAgICAgICAgICAgICAgIHwgICAgICAgJ1xmJwogICAgICAgICAgICAgICAgKSsKICAgICAgICAgICAgICAgIHsgX3R0eXBlID0gVG9rZW4uU0tJUDsgfQogICAgICAgIDsKCnByb3RlY3RlZApPTkVfTkwhIDogICAgICAgLy8gaGFuZGxlIG5ld2xpbmVzLCB3aGljaCBhcmUgc2lnbmlmaWNhbnQgaW4gR3Jvb3Z5CiAgICAgICAgICAgICAgICAoICAgICAgIG9wdGlvbnMge2dlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTt9CiAgICAgICAgICAgICAgICA6ICAgICAgICJcclxuIiAgLy8gRXZpbCBET1MKICAgICAgICAgICAgICAgIHwgICAgICAgJ1xyJyAgICAvLyBNYWNpbnRvc2gKICAgICAgICAgICAgICAgIHwgICAgICAgJ1xuJyAgICAvLyBVbml4ICh0aGUgcmlnaHQgd2F5KQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY3VycmVudCBsaW5lIG51bWJlciBmb3IgZXJyb3IgcmVwb3J0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmVDaGVjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgIDsKICAgICAgICAKLy8gR3JvdXAgYW55IG51bWJlciBvZiBuZXdsaW5lcyAod2l0aCBjb21tZW50cyBhbmQgd2hpdGVzcGFjZSkgaW50byBhIHNpbmdsZSB0b2tlbi4KLy8gVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQgb2YgcGFyc2VyIGxvb2thaGVhZCByZXF1aXJlZCB0byBwYXJzZSBhcm91bmQgbmV3bGluZXMuCi8vIEl0IGlzIGFuIGludmFyaWFudCB0aGF0IHRoZSBwYXJzZXIgbmV2ZXIgc2VlcyBOTFMgdG9rZW5zIGJhY2stdG8tYmFjay4KTkxTICAgICA6ICAgICAgIAogICAgICAgICAgICAgICAgKCAgICAgICBPTkVfTkwKICAgICAgICAgICAgICAgICAgICAgICAgKFdTIHwgU0xfQ09NTUVOVCB8IE1MX0NPTU1FTlQpKgogICAgICAgICAgICAgICAgICAgICAgICAvLyAoZ29iYmxlLCBnb2JibGUpKgogICAgICAgICAgICAgICAgKSsKICAgICAgICAgICAgICAgIC8vIEluc2lkZSAoLi4uKSBhbmQgWy4uLl0gYnV0IG5vdCB7Li4ufSwgaWdub3JlIG5ld2xpbmVzLgogICAgICAgICAgICAgICAgeyAgIGlmIChwYXJlbkxldmVsICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2V0VHlwZShUb2tlbi5TS0lQKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2V0VGV4dCgiPGxpbmV0ZXJtPiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgOwoKLy8gU2luZ2xlLWxpbmUgY29tbWVudHMKU0xfQ09NTUVOVAogICAgICAgIDogICAgICAgIi8vIgogICAgICAgICAgICAgICAgKH4oJ1xuJ3wnXHInKSkqCiAgICAgICAgICAgICAgICB7JHNldFR5cGUoVG9rZW4uU0tJUCk7fQogICAgICAgICAgICAgICAgT05FX05MCiAgICAgICAgOwoKLy8gbXVsdGlwbGUtbGluZSBjb21tZW50cwpNTF9DT01NRU5UCgk6CSIvKiIKCQkoCS8qCSdccicgJ1xuJyBjYW4gYmUgbWF0Y2hlZCBpbiBvbmUgYWx0ZXJuYXRpdmUgb3IgYnkgbWF0Y2hpbmcKCQkJCSdccicgaW4gb25lIGl0ZXJhdGlvbiBhbmQgJ1xuJyBpbiBhbm90aGVyLiBJIGFtIHRyeWluZyB0bwoJCQkJaGFuZGxlIGFueSBmbGF2b3Igb2YgbmV3bGluZSB0aGF0IGNvbWVzIGluLCBidXQgdGhlIGxhbmd1YWdlCgkJCQl0aGF0IGFsbG93cyBib3RoICJcclxuIiBhbmQgIlxyIiBhbmQgIlxuIiB0byBhbGwgYmUgdmFsaWQKCQkJCW5ld2xpbmUgaXMgYW1iaWd1b3VzLiBDb25zZXF1ZW50bHksIHRoZSByZXN1bHRpbmcgZ3JhbW1hcgoJCQkJbXVzdCBiZSBhbWJpZ3VvdXMuIEknbSBzaHV0dGluZyB0aGlzIHdhcm5pbmcgb2ZmLgoJCQkgKi8KCQkJb3B0aW9ucyB7CgkJCQlnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7CgkJCX0KCQk6CgkJCSggJyonIH4nLycgKSA9PiAnKicKCQl8CSdccicgJ1xuJwkJe25ld2xpbmVDaGVjaygpO30KCQl8CSdccicJCQl7bmV3bGluZUNoZWNrKCk7fQoJCXwJJ1xuJwkJCXtuZXdsaW5lQ2hlY2soKTt9CgkJfAl+KCcqJ3wnXG4nfCdccicpCgkJKSoKCQkiKi8iCgkJeyRzZXRUeXBlKFRva2VuLlNLSVApO30KCTsKCgovLyBzdHJpbmcgbGl0ZXJhbHMKU1RSSU5HX0xJVEVSQUwKICAgICAgICAgICAgICAgIHtpbnQgdHQ9MDt9CiAgICAgICAgOiAgICgiJycnIikgPT4gIC8vLi4uc2h1dCBvZmYgYW1iaWd1aXR5IHdhcm5pbmcKICAgICAgICAgICAgICAgICInJyciIQogICAgICAgICAgICAgICAgKCAgIFNUUklOR19DSCB8IEVTQyB8ICciJyB8ICckJwogICAgICAgICAgICAgICAgfCAgICAgICAoJ1wnJyAofidcJycgfCAnXCcnIH4nXCcnKSkgPT4gJ1wnJyAgLy8gYWxsb3cgMSBvciAyIGNsb3NlIHF1b3RlcwogICAgICAgICAgICAgICAgKSoKICAgICAgICAgICAgICAgICInJyciIQogICAgICAgIHwgICAgICAgJ1wnJyEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsrK3N1cHByZXNzTmV3bGluZTt9CiAgICAgICAgICAgICAgICAoICAgU1RSSU5HX0NIIHwgRVNDIHwgJyInIHwgJyQnICApKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0tc3VwcHJlc3NOZXdsaW5lO30KICAgICAgICAgICAgICAgICdcJychCiAgICAgICAgfCAgICgiXCJcIlwiIikgPT4gIC8vLi4uc2h1dCBvZmYgYW1iaWd1aXR5IHdhcm5pbmcKICAgICAgICAgICAgICAgICJcIlwiXCIiIQogICAgICAgICAgICAgICAgdHQ9U1RSSU5HX0NUT1JfRU5EW3RydWUsIC8qdHJpcGxlUXVvdGU6Ki8gdHJ1ZV0KICAgICAgICAgICAgICAgIHskc2V0VHlwZSh0dCk7fQogICAgICAgIHwgICAgICAgJyInIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeysrc3VwcHJlc3NOZXdsaW5lO30KICAgICAgICAgICAgICAgIHR0PVNUUklOR19DVE9SX0VORFt0cnVlLCAvKnRyaXBsZVF1b3RlOiovIGZhbHNlXQogICAgICAgICAgICAgICAgeyRzZXRUeXBlKHR0KTt9CiAgICAgICAgOwoKcHJvdGVjdGVkClNUUklOR19DVE9SX0VORFtib29sZWFuIGZyb21TdGFydCwgYm9vbGVhbiB0cmlwbGVRdW90ZV0KcmV0dXJucyBbaW50IHR0PVNUUklOR19DVE9SX0VORF0KICAgICAgICA6CiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgeyAgZ3JlZWR5ID0gdHJ1ZTsgIH06CiAgICAgICAgICAgICAgICAgICAgU1RSSU5HX0NIIHwgRVNDIHwgJ1wnJwogICAgICAgICAgICAgICAgfCAgICgnIicgKH4nIicgfCAnIicgficiJykpPT4ge3RyaXBsZVF1b3RlfT8gJyInICAvLyBhbGxvdyAxIG9yIDIgY2xvc2UgcXVvdGVzCiAgICAgICAgICAgICAgICApKgogICAgICAgICAgICAgICAgKCAgICAgICAoICAgeyAhdHJpcGxlUXVvdGUgfT8gIlwiIiEKICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHsgIHRyaXBsZVF1b3RlIH0/ICJcIlwiXCIiIQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVN0YXJ0KSAgICAgIHR0ID0gU1RSSU5HX0xJVEVSQUw7ICAvLyBwbGFpbiBzdHJpbmcgbGl0ZXJhbCEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyaXBsZVF1b3RlKSAgICAgICB7LS1zdXBwcmVzc05ld2xpbmU7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUgd2l0aCBzdHJpbmcgY29uc3RydWN0b3IhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hc3NlcnQoc3RyaW5nQ3RvclN0YXRlID09IDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB8ICAgJyQnIQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKCgnKicpPyAoJ3snIHwgTEVUVEVSKSkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgayA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsYyA9IExBKGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYyA9PSAnKicpICBsYyA9IExBKCsrayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShsYyA9PSAneycgfHwgKGxjICE9ICckJyAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGxjKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHN0cmluZyBib2R5IGNoYXJhY3RlciBhZnRlciBkb2xsYXIgc2lnbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlaXRoZXIgZXNjYXBlIGEgbGl0ZXJhbCBkb2xsYXIgc2lnbiBcIlxcJDVcIiBvciBicmFja2V0IHRoZSB2YWx1ZSBleHByZXNzaW9uIFwiJHs1fVwiIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWWVzLCBpdCdzIGEgc3RyaW5nIGNvbnN0cnVjdG9yLCBhbmQgd2UndmUgZ290IGEgdmFsdWUgcGFydC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dCA9IChmcm9tU3RhcnQgPyBTVFJJTkdfQ1RPUl9TVEFSVCA6IFNUUklOR19DVE9SX01JRERMRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQ3RvclN0YXRlID0gU0NTX1ZBTCArICh0cmlwbGVRdW90ZT8gU0NTX1RSSVBMRTogMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsgICAkc2V0VHlwZSh0dCk7ICB9CiAgICAgICAgOwoKcHJvdGVjdGVkClNUUklOR19DSAogICAgICAgIDogICB+KCciJ3wnXCcnfCdcXCd8JyQnfCdcbid8J1xyJykKICAgICAgICA7CgovLyBlc2NhcGUgc2VxdWVuY2UgLS0gbm90ZSB0aGF0IHRoaXMgaXMgcHJvdGVjdGVkOyBpdCBjYW4gb25seSBiZSBjYWxsZWQKLy8gZnJvbSBhbm90aGVyIGxleGVyIHJ1bGUgLS0gaXQgd2lsbCBub3QgZXZlciBkaXJlY3RseSByZXR1cm4gYSB0b2tlbiB0bwovLyB0aGUgcGFyc2VyCi8vIFRoZXJlIGFyZSB2YXJpb3VzIGFtYmlndWl0aWVzIGh1c2hlZCBpbiB0aGlzIHJ1bGUuIFRoZSBvcHRpb25hbAovLyAnMCcuLi4nOScgZGlnaXQgbWF0Y2hlcyBzaG91bGQgYmUgbWF0Y2hlZCBoZXJlIHJhdGhlciB0aGFuIGxldHRpbmcKLy8gdGhlbSBnbyBiYWNrIHRvIFNUUklOR19MSVRFUkFMIHRvIGJlIG1hdGNoZWQuIEFOVExSIGRvZXMgdGhlCi8vIHJpZ2h0IHRoaW5nIGJ5IG1hdGNoaW5nIGltbWVkaWF0ZWx5OyBoZW5jZSwgaXQncyBvayB0byBzaHV0IG9mZgovLyB0aGUgRk9MTE9XIGFtYmlnIHdhcm5pbmdzLgpwcm90ZWN0ZWQKRVNDCgk6CSdcXCchCgkJKAknbicgICAgIHskc2V0VGV4dCgiXG4iKTt9CgkJfAkncicgICAgIHskc2V0VGV4dCgiXHIiKTt9CgkJfAkndCcgICAgIHskc2V0VGV4dCgiXHQiKTt9CgkJfAknYicgICAgIHskc2V0VGV4dCgiXGIiKTt9CgkJfAknZicgICAgIHskc2V0VGV4dCgiXGYiKTt9CgkJfAknIicKCQl8CSdcJycKCQl8CSdcXCcKCQl8CSckJwkvL2VzY2FwZSBHcm9vdnkgJCBvcGVyYXRvciB1bmlmb3JtbHkgYWxzbwoJCXwJKCd1JykrIHskc2V0VGV4dCgiIik7fQoJCQkJCUhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVAoJCQkJCXtjaGFyIGNoID0gKGNoYXIpSW50ZWdlci5wYXJzZUludCgkZ2V0VGV4dCwxNik7ICRzZXRUZXh0KGNoKTt9CgkJfAknMCcuLiczJwoJCQkoCgkJCQlvcHRpb25zIHsKCQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7CgkJCQl9CgkJCToJJzAnLi4nNycKCQkJCSgKCQkJCQlvcHRpb25zIHsKCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwoJCQkJCX0KCQkJCToJJzAnLi4nNycKCQkJCSk/CgkJCSk/CgkJCQkJe2NoYXIgY2ggPSAoY2hhcilJbnRlZ2VyLnBhcnNlSW50KCRnZXRUZXh0LnN1YnN0cmluZygxKSw4KTsgJHNldFRleHQoY2gpO30KCQl8CSc0Jy4uJzcnCgkJCSgKCQkJCW9wdGlvbnMgewoJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKCQkJCX0KCQkJOgknMCcuLic3JwoJCQkpPwoJCQkJe2NoYXIgY2ggPSAoY2hhcilJbnRlZ2VyLnBhcnNlSW50KCRnZXRUZXh0LnN1YnN0cmluZygxKSw4KTsgJHNldFRleHQoY2gpO30KCQkpCgl8ISAgICAgICdcXCcgT05FX05MCiAgICAgICAgfCEgICAgICBPTkVfTkwgICAgICAgICAgeyAkc2V0VGV4dCgnXG4nKTsgfSAgICAgICAgICAgICAvLyBhbHdheXMgbm9ybWFsaXplIHRvIG5ld2xpbmUKCTsKCgovLyBoZXhhZGVjaW1hbCBkaWdpdCAoYWdhaW4sIG5vdGUgaXQncyBwcm90ZWN0ZWQhKQpwcm90ZWN0ZWQKSEVYX0RJR0lUCgk6CSgnMCcuLic5J3wnQScuLidGJ3wnYScuLidmJykKCTsKCgovLyBhIGR1bW15IHJ1bGUgdG8gZm9yY2Ugdm9jYWJ1bGFyeSB0byBiZSBhbGwgY2hhcmFjdGVycyAoZXhjZXB0IHNwZWNpYWwKLy8gb25lcyB0aGF0IEFOVExSIHVzZXMgaW50ZXJuYWxseSAoMCB0byAyKQpwcm90ZWN0ZWQKVk9DQUIKCToJJ1wzJy4uJ1wzNzcnCgk7CgoKLy8gYW4gaWRlbnRpZmllci4gTm90ZSB0aGF0IHRlc3RMaXRlcmFscyBpcyBzZXQgdG8gdHJ1ZSEgVGhpcyBtZWFucwovLyB0aGF0IGFmdGVyIHdlIG1hdGNoIHRoZSBydWxlLCB3ZSBsb29rIGluIHRoZSBsaXRlcmFscyB0YWJsZSB0byBzZWUKLy8gaWYgaXQncyBhIGxpdGVyYWwgb3IgcmVhbGx5IGFuIGlkZW50aWZlcgpJREVOVAoJb3B0aW9ucyB7dGVzdExpdGVyYWxzPXRydWU7fQoJOglMRVRURVIoTEVUVEVSfERJR0lUKSoKCQl7CgkJCWlmIChzdHJpbmdDdG9yU3RhdGUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMQSgxKSA9PSAnLicgJiYgTEEoMikgIT0gJyQnICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoTEEoMikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIHVwIGFub3RoZXIgbmFtZSBjb21wb25lbnQgYmVmb3JlIGdvaW5nIGxpdGVyYWwgYWdhaW46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0U3RyaW5nQ3RvcihmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGJhY2sgdG8gdGhlIHN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFN0cmluZ0N0b3IodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGludCB0dHlwZSA9IHRlc3RMaXRlcmFsc1RhYmxlKElERU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR0eXBlICE9IElERU5UICYmIGxhc3RUb2tlbi5nZXRUeXBlKCkgPT0gRE9UKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBmZXcga2V5d29yZHMgY2FuIGZvbGxvdyBhIGRvdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3RoaXM6IGNhc2UgTElURVJBTF9zdXBlcjogY2FzZSBMSVRFUkFMX2NsYXNzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eXBlID0gTElURVJBTF9pbjsgIC8vIHRoZSBwb3N0ZXIgY2hpbGQgZm9yIGJhZCBkb3R0ZWQgbmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJHNldFR5cGUodHR5cGUpOwoKCQkJLy8gY2hlY2sgaWYgImFzc2VydCIga2V5d29yZCBpcyBlbmFibGVkCgkJCWlmIChhc3NlcnRFbmFibGVkICYmICJhc3NlcnQiLmVxdWFscygkZ2V0VGV4dCkpIHsKCQkJCSRzZXRUeXBlKExJVEVSQUxfYXNzZXJ0KTsgLy8gc2V0IHRva2VuIHR5cGUgZm9yIHRoZSBydWxlIGluIHRoZSBwYXJzZXIKCQkJfQoJCQkvLyBjaGVjayBpZiAiZW51bSIga2V5d29yZCBpcyBlbmFibGVkCgkJCWlmIChlbnVtRW5hYmxlZCAmJiAiZW51bSIuZXF1YWxzKCRnZXRUZXh0KSkgewoJCQkJJHNldFR5cGUoTElURVJBTF9lbnVtKTsgLy8gc2V0IHRva2VuIHR5cGUgZm9yIHRoZSBydWxlIGluIHRoZSBwYXJzZXIKCQkJfQoJCX0KCTsKCnByb3RlY3RlZApMRVRURVIKICAgICAgICA6ICAgJ2EnLi4neid8J0EnLi4nWid8J18nCiAgICAgICAgLy8gVE8gRE86ICBSZWNvZ25pemUgYWxsIHRoZSBKYXZhIGlkZW50aWZpZXIgc3RhcnRzIGhlcmUgKGV4Y2VwdCAnJCcpLgogICAgICAgIDsKCnByb3RlY3RlZApESUdJVAogICAgICAgIDogICAnMCcuLic5JwogICAgICAgIC8vIFRPIERPOiAgUmVjb2duaXplIGFsbCB0aGUgSmF2YSBpZGVudGlmaWVyIHBhcnRzIGhlcmUgKGV4Y2VwdCAnJCcpLgogICAgICAgIDsKCi8vIGEgbnVtZXJpYyBsaXRlcmFsCk5VTV9JTlQKCXtib29sZWFuIGlzRGVjaW1hbD1mYWxzZTsgVG9rZW4gdD1udWxsO30KCToKLypPQlMqCgkJJy4nIHtfdHR5cGUgPSBET1Q7fQoJCQkoCgkJCQkoKCcwJy4uJzknKSsgKEVYUE9ORU5UKT8gKGYxOkZMT0FUX1NVRkZJWCB7dD1mMTt9KT8KCQkJCXsKCQkJCWlmICh0ICE9IG51bGwgJiYgdC5nZXRUZXh0KCkudG9VcHBlckNhc2UoKS5pbmRleE9mKCdGJyk+PTApIHsKCQkJCQlfdHR5cGUgPSBOVU1fRkxPQVQ7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlfdHR5cGUgPSBOVU1fRE9VQkxFOyAvLyBhc3N1bWUgZG91YmxlCgkJCQl9CgkJCQl9KQoJCQkJfAoJCQkJLy8gSkRLIDEuNSB0b2tlbiBmb3IgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cwoJCQkJKCIuLiIge190dHlwZSA9IFRSSVBMRV9ET1Q7fSkKCQkJKT8KCXwKKk9CUyovCgkvLyBUTyBETzogIFRoaXMgY29tcGxleCBwYXR0ZXJuIHNlZW1zIHdyb25nLiAgVmVyaWZ5IG9yIGZpeC4KCSgJJzAnIHtpc0RlY2ltYWwgPSB0cnVlO30gLy8gc3BlY2lhbCBjYXNlIGZvciBqdXN0ICcwJwoJCQkoCSgneCd8J1gnKQoJCQkJKAkJCQkJCQkJCQkJLy8gaGV4CgkJCQkJLy8gdGhlICdlJ3wnRScgYW5kIGZsb2F0IHN1ZmZpeCBzdHVmZiBsb29rCgkJCQkJLy8gbGlrZSBoZXggZGlnaXRzLCBoZW5jZSB0aGUgKC4uLikrIGRvZXNuJ3QKCQkJCQkvLyBrbm93IHdoZW4gdG8gc3RvcDogYW1iaWcuIEFOVExSIHJlc29sdmVzCgkJCQkJLy8gaXQgY29ycmVjdGx5IGJ5IG1hdGNoaW5nIGltbWVkaWF0ZWx5LiBJdAoJCQkJCS8vIGlzIHRoZXJlZm9yIG9rIHRvIGh1c2ggd2FybmluZy4KCQkJCQlvcHRpb25zIHsKCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZz1mYWxzZTsKCQkJCQl9CgkJCQk6CUhFWF9ESUdJVAoJCQkJKSsKCgkJCXwJLy9mbG9hdCBvciBkb3VibGUgd2l0aCBsZWFkaW5nIHplcm8KCQkJCSgoJzAnLi4nOScpKyAoJy4nfEVYUE9ORU5UfEZMT0FUX1NVRkZJWCkpID0+ICgnMCcuLic5JykrCgkJCQl7aXNEZWNpbWFsPXRydWU7fQoKCQkJfAkoJzAnLi4nNycpKwkJCQkJCQkJCS8vIG9jdGFsCgkJCSk/CgkJfAkoJzEnLi4nOScpICgnMCcuLic5JykqICB7aXNEZWNpbWFsPXRydWU7fQkJLy8gbm9uLXplcm8gZGVjaW1hbAoJCSkKCQkoCSgnbCd8J0wnKSB7IF90dHlwZSA9IE5VTV9MT05HOyB9CgkJfAlCSUdfU1VGRklYIHsgX3R0eXBlID0gTlVNX0JJR19JTlQ7IH0KCgkJLy8gb25seSBjaGVjayB0byBzZWUgaWYgaXQncyBhIGZsb2F0IGlmIGxvb2tzIGxpa2UgZGVjaW1hbCBzbyBmYXIKCQl8CXtpc0RlY2ltYWx9PwoJCQkoCScuJyAoJzAnLi4nOScpKyAoRVhQT05FTlQpPyAoZjI6RkxPQVRfU1VGRklYIHt0PWYyO30gfCBnMjpCSUdfU1VGRklYIHt0PWcyO30pPwoJCQl8CUVYUE9ORU5UIChmMzpGTE9BVF9TVUZGSVgge3Q9ZjM7fSB8IGczOkJJR19TVUZGSVgge3Q9ZzM7fSk/CgkJCXwJZjQ6RkxPQVRfU1VGRklYIHt0PWY0O30KCQkJKQoJCQl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR4dCA9ICh0ID09IG51bGwgPyAiIiA6IHQuZ2V0VGV4dCgpLnRvVXBwZXJDYXNlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eHQuaW5kZXhPZignRicpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90dHlwZSA9IE5VTV9GTE9BVDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR4dC5pbmRleE9mKCdHJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3R0eXBlID0gTlVNX0JJR19ERUNJTUFMOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHR5cGUgPSBOVU1fRE9VQkxFOyAvLyBhc3N1bWUgZG91YmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgkJKT8KCTsKCi8vIEpESyAxLjUgdG9rZW4gZm9yIGFubm90YXRpb25zIGFuZCB0aGVpciBkZWNsYXJhdGlvbnMKLy8gYWxzbyBhIGdyb292eSBvcGVyYXRvciBmb3IgYWN0dWFsIGZpZWxkIGFjY2VzcyBlLmcuICd0ZWxzb24uQGFnZScgCkFUCgk6CSdAJwoJOwoKLy8gYSBjb3VwbGUgcHJvdGVjdGVkIG1ldGhvZHMgdG8gYXNzaXN0IGluIG1hdGNoaW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKcHJvdGVjdGVkCkVYUE9ORU5UCgk6CSgnZSd8J0UnKSAoJysnfCctJyk/ICgnMCcuLic5JykrCgk7CgoKcHJvdGVjdGVkCkZMT0FUX1NVRkZJWAoJOgknZid8J0YnfCdkJ3wnRCcKCTsKCnByb3RlY3RlZApCSUdfU1VGRklYCiAgICAgICAgOiAgICAgICAnZyd8J0cnCiAgICAgICAgOwoKLy8gSGVyZSdzIGEgbGl0dGxlIGhpbnQgZm9yIHlvdSwgRW1hY3M6Ci8vIExvY2FsIFZhcmlhYmxlczoKLy8gbW9kZTogamF2YQovLyB0YWItd2lkdGg6IDQKLy8gRW5kOgo=