LyoKICogSGVscCBWaWV3ZXIKICogUG9ydHVndWVzZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAxOTk2IFVscmljaCBTY2htaWQKICogUG9ydHVndWVzZSB0cmFuc2xhdGlvbiBieSBHdXN0YXZvIEp1bmlvciBBbHZlcyA8YWx2ZXNAY29ycmVpb25ldC5jb20uYnI+CiAqIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKiBDb3B5cmlnaHQgMjAwMyBNYXJjZWxvIER1YXJ0ZQogKiBDb3B5cmlnaHQgMjAwNCwyMDA3IEFt6XJpY28gSm9z6SBNZWxvCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCi8qIE1lbnUgKi8KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTgoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZBcnF1aXZvIiB7CiAgTUVOVUlURU0gIiZBYnJpci4uLiIsIE1OSURfRklMRV9PUEVOCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZJbXByaW1pciIsIE1OSURfRklMRV9QUklOVAogIE1FTlVJVEVNICImQ29uZmlndXJhciBJbXByZXNzb3JhLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJTYWkmciIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiJkVkaXRhciIgewogICBNRU5VSVRFTSAiJkNvcGlhci4uLiIsIE1OSURfRURJVF9DT1BZRExHCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkFub3Rhci4uLiIsIE1OSURfRURJVF9BTk5PVEFURQogfQogUE9QVVAgIkluJmRpY2Fkb3IiIHsKICAgTUVOVUlURU0gIiZEZWZpbmlyLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIkFqJnVkYSIgewogICBNRU5VSVRFTSAiQWp1ZGEgJm5hIGFqdWRhIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiU2VtcHJlICZ2aXPtdmVsIiwgTU5JRF9IRUxQX0hFTFBUT1AKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImSW5mb3JtYef1ZXMuLi4iLCBNTklEX0hFTFBfQUJPVVQKI2lmZGVmIFdJTkVMSUIKICAgTUVOVUlURU0gIiZTb2JyZSBXSU5FIiwgTU5JRF9IRUxQX1dJTkUKI2VuZGlmCiB9Cn0KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkZpY2hlaXJvIiB7CiAgTUVOVUlURU0gIiZBYnJpci4uLiIsIE1OSURfRklMRV9PUEVOCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZJbXByaW1pciIsIE1OSURfRklMRV9QUklOVAogIE1FTlVJVEVNICImQ29uZmlndXJhciBJbXByZXNzb3JhLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJTYWkmciIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiJkVkaXRhciIgewogICBNRU5VSVRFTSAiJkNvcGlhci4uLiIsIE1OSURfRURJVF9DT1BZRExHCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJkFub3Rhci4uLiIsIE1OSURfRURJVF9BTk5PVEFURQogfQogUE9QVVAgIkluJmRpY2Fkb3IiIHsKICAgTUVOVUlURU0gIiZEZWZpbmlyLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIkFqJnVkYSIgewogICBNRU5VSVRFTSAiQWp1ZGEgJm5hIGFqdWRhIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiU2VtcHJlICZ2aXPtdmVsIiwgTU5JRF9IRUxQX0hFTFBUT1AKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImSW5mb3JtYef1ZXMuLi4iLCBNTklEX0hFTFBfQUJPVVQKI2lmZGVmIFdJTkVMSUIKICAgTUVOVUlURU0gIiZBY2VyY2EgZG8gV0lORSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgovKiBTdHJpbmdzICovCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RJRF9XSU5FX0hFTFAsIAkiQWp1ZGEgV0lORSIKU1RJRF9XSEVSUk9SLCAJCSJFUlJPIgpTVElEX1dBUk5JTkcsICAJCSJBVklTTyIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYefjbyIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiTuNvIGltcGxlbWVudGFkbyIKU1RJRF9ITFBGSUxFX0VSUk9SX3MsIAkiRXJybyBlbmNvbnRyYWRvIG5hIGxlaXR1cmEgZG8gYXJxdWl2byBkZSBhanVkYSAnJXMnIgpTVElEX0NPTlRFTlRTLCAJCSImQ29udGX6ZG8iClNUSURfU0VBUkNILCAJCSImUHJvY3VyYXIiClNUSURfQkFDSywgCQkiJlZvbHRhciIKU1RJRF9ISVNUT1JZLCAJCSImSGlzdPNyaWNvIgpTVElEX1RPUElDUywJCSImVPNwaWNvcyIKU1RJRF9BTExfRklMRVMsIAkiVG9kb3Mgb3MgYXJxdWl2b3MgKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkiQXJxdWl2b3MgZGUgYWp1ZGEgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zICAgIkNhbm5vdCBmaW5kICclcycuIERvIHlvdSB3YW50IHRvIGZpbmQgdGhpcyBmaWxlIHlvdXJzZWxmPyIKU1RJRF9OT19SSUNIRURJVAkiQ2Fubm90IGZpbmQgYSByaWNoZWRpdCBpbXBsZW1lbnRhdGlvbi4uLiBBYm9ydGluZyIKfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RJRF9XSU5FX0hFTFAsIAkiQWp1ZGEgV0lORSIKU1RJRF9XSEVSUk9SLCAJCSJFUlJPIgpTVElEX1dBUk5JTkcsICAJCSJBVklTTyIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYefjbyIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiTuNvIGltcGxlbWVudGFkbyIKU1RJRF9ITFBGSUxFX0VSUk9SX3MsIAkiRXJybyBlbmNvbnRyYWRvIG5hIGxlaXR1cmEgZG8gZmljaGVpcm8gZGUgYWp1ZGEgJyVzJyIKU1RJRF9DT05URU5UUywgCQkiJkNvbnRl+mRvIgpTVElEX1NFQVJDSCwgCQkiJlByb2N1cmFyIgpTVElEX0JBQ0ssIAkJIiZWb2x0YXIiClNUSURfSElTVE9SWSwgCQkiJkhpc3TzcmljbyIKU1RJRF9UT1BJQ1MsCQkiJlTzcGljb3MiClNUSURfQUxMX0ZJTEVTLCAJIlRvZG9zIG9zIGZpY2hlaXJvcyAoKi4qKSIKU1RJRF9IRUxQX0ZJTEVTX0hMUCwgCSJGaWNoZWlyb3MgZGUgYWp1ZGEgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJO428g6SBwb3Nz7XZlbCBlbmNvbnRyYXIgJyVzJy4gRGVzZWphIHByb2N1cmFyIGVzdGUgZmljaGVpcm8gdm9j6iBtZXNtbz8iClNUSURfTk9fUklDSEVESVQJIkNhbm5vdCBmaW5kIGEgcmljaGVkaXQgaW1wbGVtZW50YXRpb24uLi4gQWJvcnRpbmciCn0K