LyoKICogIE5vdGVwYWQgKFNwYW5pc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTcsOTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogKiAgUHJvb2ZyZWFkIDE5OTggYnkgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgogKiAgUHJvb2ZyZWFkIDE5OTkgYnkgSm9zZSBNYXJjb3MgTG9wZXogPGpvc2UubG9wZXpAdXBjbmV0LnVwYy5lcz4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKiAgQ29weXJpZ2h0IDIwMDMsMjAwNCBKb3PpIE1hbnVlbCBGZXJyZXIgT3J0aXoKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19TUEFOSVNILCBTVUJMQU5HX05FVVRSQUwKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImQXJjaGl2byIgewogIE1FTlVJVEVNICImTnVldm9cdEN0cmwrTiIsICAgICAgICAgICAgICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAiJkFicmlyLi4uXHRDdHJsK08iLCAgICAgICAgICAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAiJkd1YXJkYXJcdEN0cmwrUyIsICAgICAgICAgICAgQ01EX1NBVkUKICBNRU5VSVRFTSAiR3VhcmRhciAmY29tby4uLiIsICAgICAgICAgICAgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkltcHJpbWlyLi4uXHRDdHJsK1AiLCAgICAgICAgICAgICAgICAgICBDTURfUFJJTlQKICBNRU5VSVRFTSAiQ29uZmlndXJhciAmcOFnaW5hLi4uIiwgICAgICAgQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiQ29uZmlndXJhY2nzbiAmaW1wcmVzb3JhLi4uIiwgQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlNhbGlyIiwgICAgICAgICAgICAgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIiZFZGl0YXIiIHsKICBNRU5VSVRFTSAiJkRlc2hhY2VyXHRDdHJsK1oiLCAgICAgICAgIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkNvciZ0YXJcdEN0cmwrWCIsICAgICAgICAgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpYXJcdEN0cmwrQyIsICAgICAgICAgICBDTURfQ09QWQogIE1FTlVJVEVNICImUGVnYXJcdEN0cmwrViIsICAgICAgICAgICAgQ01EX1BBU1RFCiAgTUVOVUlURU0gIiZCb3JyYXJcdERlbCIsICAgICAgICAgICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNlbGVjY2lvbmFyIHQmb2RvXHRDdHJsK0EiLCBDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImSG9yYSB5IGZlY2hhXHRGNSIsICAgICAgICAgQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQWp1c3RlIGRlIGztbmVhIiwgICAgICAgICAgQ01EX1dSQVAKICBNRU5VSVRFTSAiVGlwbyBkZSAmbGV0cmEuLi4iLCAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImQnVzY2FyIiB7CiAgTUVOVUlURU0gIiZCdXNjYXIuLi5cdEN0cmwrRiIsICAgICAgIENNRF9TRUFSQ0gKICBNRU5VSVRFTSAiQnVzY2FyICZzaWd1aWVudGVcdEYzIiwgQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICJBJnl1ZGEiIHsKICBNRU5VSVRFTSAizSZuZGljZSIsICAgICAgICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJkJ1c2Nhci4uLiIsICAgICAgICAgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIkEmeXVkYSBzb2JyZSBsYSBheXVkYSIsIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBQT1BVUCAiJkluZm9ybWFjafNuIiB7CiAgIE1FTlVJVEVNICImTGljZW5jaWEuLi4iLCAgICAgICAgICAgIENNRF9MSUNFTlNFCiAgIE1FTlVJVEVNICJTSU4gJkdBUkFOVM1BLi4uIiwgICAgICAgIENNRF9OT19XQVJSQU5UWQogICBNRU5VSVRFTSAiJkFjZXJjYSBkZSBXaW5lLi4uIiwgICAgICBDTURfQUJPVVRfV0lORQogIH0KIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJBanVzdGUgZGUgcOFnaW5hIgp7CkxURVhUICAgICImQ2FiZWNlcmE6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQxLCAgICAgICA2MCwgMDUsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlBpZToiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDMsICAgICAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk3hcmdlbmVzOiIsICAgICAgMHgxNDQsICAgICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAiJkl6cXVpZXJkYToiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsKi8gICAweDE0NywgICAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiQSZycmliYToiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLCovICAgIDB4MTRBLCAgICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkRlcmVjaGE6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsKi8gIDB4MTRELCAgICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIkFiYSZqbzoiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCovIDB4MTUwLCAgICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiQWNlcHRhciIsICAgICAgSURPSywgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJDYW5jZWxhciIsICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkF5dWRhIiwgICAgICAgSURIRUxQLCAgICAgICAgICAgICAgICAxODAsIDM5LCA0MCwgMTUsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgICImbiIgICAgICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgICJQ4WdpbmEgJnMiICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwgICAgICIyMCBtbSIgICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsICAgICIyMCBtbSIgICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLCAgICAgICIyNSBtbSIgICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgICIyNSBtbSIgICAgICAvKiBGSVhNRSAqLwoKU1RSSU5HX05PVEVQQUQsICAgICAgICAgICAgICAgICAiQmxvYyBkZSBub3RhcyIKU1RSSU5HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAiRVJST1IiClNUUklOR19XQVJOSU5HLCAgICAgICAgICAgICAgICAgIkFEVkVSVEVOQ0lBIgpTVFJJTkdfSU5GTywgICAgICAgICAgICAgICAgICAgICJJbmZvcm1hY2nzbiIKClNUUklOR19VTlRJVExFRCwgICAgICAgICAgICAgICAgIihzaW4gdO10dWxvKSIKClNUUklOR19BTExfRklMRVMsICAgICAgICAgICAgICAgIlRvZG9zIGxvcyBhcmNoaXZvcyAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICAiRG9jdW1lbnRvcyBkZSB0ZXh0byAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLCAgICAgICAgICAgICAgICAiRWwgYXJjaGl2byAnJXMnIGVzIGRlbWFzaWFkbyBncmFuZGUgcGFyYSBlbCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2MgZGUgbm90YXMuXG4gVXNlIG90cm8gZWRpdG9yLiIKU1RSSU5HX05PVEVYVCwgICAgICAgICAgICAgICAgICAiTm8gZXNjcmliafMgbmFkYS4gXG5Qb3IgZmF2b3IgZXNjcmliYSBhbGdvIGUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnTpbnRlbG8gZGUgbnVldm8iClNUUklOR19ET0VTTk9URVhJU1QsICAgICAgICAgICAgIkVsIGFyY2hpdm8gJyVzJ1xubm8gZXhpc3RlXG5cbiC/RGVzZWEgY3JlYXIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1biBudWV2byBhcmNoaXZvPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAiRWwgdGV4dG8gZW4gZWwgYXJjaGl2byAnJXMnIGhhIGNhbWJpYWRvXG5cbiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIL9EZXNlYSBndWFyZGFyIGxvcyBjYW1iaW9zPyIKU1RSSU5HX05PVEZPVU5ELCAgICAgICAgICAgICAgICAiTm8gc2UgZW5jb250cvMgJyVzJy4iClNUUklOR19PVVRfT0ZfTUVNT1JZLCAgICAgICAgICAgIk5vIGhheSBzdWZpY2llbnRlIG1lbW9yaWEgcGFyYSB0ZXJtaW5hciBlc3RhIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWEuIFxuQ2llcnJlIHVuYSBvIG3hcyBhcGxpY2FjaW9uZXMgcGFyYSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1bWVudGFyIGxhIGNhbnRpZGFkIFxuZGUgbWVtb3JpYSBsaWJyZS4iCgp9Cg==