LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBTd2VkaXNoIGxhbmd1YWdlIGJ5IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KICogQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCi8qIE1lbnUgKi8KCk1BSU5fTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ERUZBVUxUCnsKIFBPUFVQICImQXJraXYiIHsKICBNRU5VSVRFTSAiJtZwcG5hLi4uIiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlNrcml2IHV0IiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIlNrcml2YXIgJmluc3TkbGxuaW5nYXIuLi4iLCBNTklEX0ZJTEVfU0VUVVAKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBdnNsdXRhIiwgTU5JRF9GSUxFX0VYSVQKIH0KIFBPUFVQICImUmVkaWdlcmEiIHsKICAgTUVOVUlURU0gIiZLb3BpZXJhLi4uIiwgTU5JRF9FRElUX0NPUFlETEcKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImTWFya2VyYS4uLiIsIE1OSURfRURJVF9BTk5PVEFURQogfQogUE9QVVAgIiZCb2tt5HJrZSIgewogICBNRU5VSVRFTSAiJkRlZmluZ2VyYS4uLiIsIE1OSURfQktNS19ERUZJTkUKIH0KIFBPUFVQICImSGrkbHAiIHsKICAgTUVOVUlURU0gIkFuduRuZG5pbmdlbiAmYXYgaGrkbHAiLCBNTklEX0hFTFBfSEVMUE9OCiAgIE1FTlVJVEVNICJBbGx0aWQgJvZ2ZXJzdCIsIE1OSURfSEVMUF9IRUxQVE9QCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkluZm9ybWF0aW9uLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICImT20gV0lORSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgovKiBTdHJpbmdzICovCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX1NXRURJU0gsIFNVQkxBTkdfREVGQVVMVAp7ClNUSURfV0lORV9IRUxQLCAJIldJTkUgSGrkbHAiClNUSURfV0hFUlJPUiwgCQkiRkVMIgpTVElEX1dBUk5JTkcsICAJCSJWQVJOSU5HIgpTVElEX0lORk8sICAJCSJJbmZvcm1hdGlvbiIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiRWogaW1wbGVtZW50ZXJlcmF0IgpTVElEX0hMUEZJTEVfRVJST1JfcywgCSJGRUwgdmlkIGzkc25pbmcgYXYgaGrkbHAgZmlsZW4gYCVzJyIKU1RJRF9DT05URU5UUywgCQkiJklubmVo5WxsIgpTVElEX1NFQVJDSCwgCQkiJlP2ayIKU1RJRF9CQUNLLCAJCSImVGlsbGJha2EiClNUSURfSElTVE9SWSwgCQkiJtZ2ZXJzaWt0IgpTVElEX1RPUElDUywJCSJUJm9waWNzIgpTVElEX0FMTF9GSUxFUywgCSJBbGxhIGZpbGVyICgqLiopKSIKU1RJRF9IRUxQX0ZJTEVTX0hMUCwgCSJIauRscCBmaWxlciAoKi5obHApIgpTVElEX0ZJTEVfTk9UX0ZPVU5EX3MJIkNhbm5vdCBmaW5kICclcycuIERvIHlvdSB3YW50IHRvIGZpbmQgdGhpcyBmaWxlIHlvdXJzZWxmPyIKfQo=