LyoKICogIE5vdGVwYWQgKFNwYW5pc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTcsOTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogKiAgUHJvb2ZyZWFkIDE5OTggYnkgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgogKiAgUHJvb2ZyZWFkIDE5OTkgYnkgSm9zZSBNYXJjb3MgTG9wZXogPGpvc2UubG9wZXpAdXBjbmV0LnVwYy5lcz4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKiAgQ29weXJpZ2h0IDIwMDMsMjAwNCBKb3PpIE1hbnVlbCBGZXJyZXIgT3J0aXoKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19TUEFOSVNILCBTVUJMQU5HX05FVVRSQUwKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImQXJjaGl2byIgewogIE1FTlVJVEVNICImTnVldm8uLi4iLCAgICAgICAgICAgICAgICAgICBDTURfTkVXCiAgTUVOVUlURU0gIiZBYnJpclx0Q3RybCtPIiwgICAgICAgICAgICAgIENNRF9PUEVOCiAgTUVOVUlURU0gIiZHdWFyZGFyXHRDdHJsK1MiLCAgICAgICAgICAgIENNRF9TQVZFCiAgTUVOVUlURU0gIkd1YXJkYXIgJmNvbW8uLi4iLCAgICAgICAgICAgIENNRF9TQVZFX0FTCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZJbXByaW1pciIsICAgICAgICAgICAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICJDb25maWd1cmFyICZw4WdpbmEuLi4iLCAgICAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJDb25maWd1cmFjafNuICZpbXByZXNvcmEuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImU2FsaXIiLCAgICAgICAgICAgICAgICAgICAgICBDTURfRVhJVAogfQpQT1BVUCAiJkVkaXRhciIgewogIE1FTlVJVEVNICImRGVzaGFjZXJcdEN0cmwrWiIsICAgICAgICAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQ29yJnRhclx0Q3RybCtYIiwgICAgICAgICAgIENNRF9DVVQKICBNRU5VSVRFTSAiJkNvcGlhclx0Q3RybCtDIiwgICAgICAgICAgIENNRF9DT1BZCiAgTUVOVUlURU0gIiZQZWdhclx0Q3RybCtWIiwgICAgICAgICAgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiJkJvcnJhclx0RGVsIiwgICAgICAgICAgICAgIENNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2VsZWNjaW9uYXIgdCZvZG9cdEN0cmwrQSIsIENNRF9TRUxFQ1RfQUxMCiAgTUVOVUlURU0gIiZIb3JhIHkgZmVjaGFcdEY1IiwgICAgICAgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBanVzdGUgZGUgbO1uZWEiLCAgICAgICAgICBDTURfV1JBUAogIE1FTlVJVEVNICJUaXBvIGRlICZsZXRyYS4uLiIsICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZCdXNjYXIiIHsKICBNRU5VSVRFTSAiJkJ1c2Nhclx0Q3RybCtGIiwgICAgICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICJCdXNjYXIgJnNpZ3VpZW50ZVx0RjMiLCBDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIkEmeXVkYSIgewogIE1FTlVJVEVNICLNJm5kaWNlIiwgICAgICAgICAgICAgICBDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImQnVzY2FyLi4uIiwgICAgICAgICAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiQSZ5dWRhIHNvYnJlIGxhIGF5dWRhIiwgQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICImSW5mb3JtYWNp824uLi4iIHsKICAgTUVOVUlURU0gIiZMaWNlbmNpYSIsICAgICAgICAgICAgQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gIlNJTiAmR0FSQU5UzUEiLCAgICAgICAgQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICImQWNlcmNhIGRlIFdpbmUiLCAgICAgIENNRF9BQk9VVF9XSU5FCiAgfQogfQp9CgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQIERJQUxPRyAwLCAwLCAyMjUsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIkFqdXN0ZSBkZSBw4WdpbmEiCnsKTFRFWFQgICAgIiZDYWJlY2VyYToiLCAgMHgxNDAsICAgMTAsIDA3LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDEsICAgICAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUGllOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MywgICAgICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICImTeFyZ2VuZXM6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImSXpxdWllcmRhOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwqLyAgIDB4MTQ3LCAgICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICJBJnJyaWJhOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRGVyZWNoYToiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwqLyAgMHgxNEQsICAgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiQWJhJmpvOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsKi8gMHgxNTAsICAgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJBY2VwdGFyIiwgICAgICBJRE9LLCAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkNhbmNlbGFyIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQXl1ZGEiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgIiZuIiAgICAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIlDhZ2luYSAmcyIgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLCAgICAgIjIwIG1tIiAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAgIjIwIG1tIiAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsICAgICAgIjI1IG1tIiAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsICAgIjI1IG1tIiAgICAgIC8qIEZJWE1FICovCgpTVFJJTkdfTk9URVBBRCwgICAgICAgICAgICAgICAgICJCbG9jIGRlIG5vdGFzIgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICJFUlJPUiIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAiQURWRVJURU5DSUEiClNUUklOR19JTkZPLCAgICAgICAgICAgICAgICAgICAgIkluZm9ybWFjafNuIgoKU1RSSU5HX1VOVElUTEVELCAgICAgICAgICAgICAgICAiKHNpbiB07XR1bG8pIgoKU1RSSU5HX0FMTF9GSUxFUywgICAgICAgICAgICAgICAiVG9kb3MgbG9zIGFyY2hpdm9zICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsICAgICAgICAgICJEb2N1bWVudG9zIGRlIHRleHRvICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAgICAgICAgICAgICAgICJFbCBhcmNoaXZvICclcycgZXMgZGVtYXNpYWRvIGdyYW5kZSBwYXJhIGVsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYyBkZSBub3Rhcy5cbiBVc2Ugb3RybyBlZGl0b3IuIgpTVFJJTkdfTk9URVhULCAgICAgICAgICAgICAgICAgICJObyBlc2NyaWJp8yBuYWRhLiBcblBvciBmYXZvciBlc2NyaWJhIGFsZ28gZSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludOludGVsbyBkZSBudWV2byIKU1RSSU5HX0RPRVNOT1RFWElTVCwgICAgICAgICAgICAiRWwgYXJjaGl2byAnJXMnXG5ubyBleGlzdGVcblxuIL9EZXNlYSBjcmVhciBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuIG51ZXZvIGFyY2hpdm8/IgpTVFJJTkdfTk9UU0FWRUQsICAgICAgICAgICAgICAgICJFbCB0ZXh0byBlbiBlbCBhcmNoaXZvICclcycgaGEgY2FtYmlhZG9cblxuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgv0Rlc2VhIGd1YXJkYXIgbG9zIGNhbWJpb3M/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICJObyBzZSBlbmNvbnRy8yAnJXMnLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAiTm8gaGF5IHN1ZmljaWVudGUgbWVtb3JpYSBwYXJhIHRlcm1pbmFyIGVzdGEgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJlYS4gXG5DaWVycmUgdW5hIG8gbeFzIGFwbGljYWNpb25lcyBwYXJhIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVtZW50YXIgbGEgY2FudGlkYWQgXG5kZSBtZW1vcmlhIGxpYnJlLiIKCn0K