LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqIENvcHlyaWdodCAyMDAzLTIwMDQgUHVvdGkKICogQ29weXJpZ2h0IDIwMDYgQW50b25pbyBDb2RhenppCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfSVRBTElBTiwgU1VCTEFOR19ORVVUUkFMCgpNRU5VXzAwMSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglNRU5VSVRFTSAiSWNvbmUgJkdyYW5kaSIsCUZDSURNX1NIVklFV19CSUdJQ09OCglNRU5VSVRFTSAiSWNvbmUgJlBpY2NvbGUiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCglNRU5VSVRFTSAiJkxpc3RhIiwJCUZDSURNX1NIVklFV19MSVNUVklFVwoJTUVOVUlURU0gIiZEZXR0YWdsaSIsCQlGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwpFTkQKCi8qCiBzaGVsbHZpZXcgYmFja2dyb3VuZCBtZW51CiovCk1FTlVfMDAyIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJICBQT1BVUCAiJlZpc3VhbGl6emEiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIkljb25lICZHcmFuZGkiLAlGQ0lETV9TSFZJRVdfQklHSUNPTgoJICAgIE1FTlVJVEVNICJJY29uZSAmUGljY29sZSIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCSAgICBNRU5VSVRFTSAiJkxpc3RhIiwJCUZDSURNX1NIVklFV19MSVNUVklFVwoJICAgIE1FTlVJVEVNICImRGV0dGFnbGkiLAlGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwoJICBFTkQKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIFBPUFVQICJEaXNwb25pICZJY29uZSIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiUGVyICZOb21lIiwJMHgzMAkvKiBjb2x1bW4gMCAqLwoJICAgIE1FTlVJVEVNICJQZXIgJlRpcG8iLAkweDMyCS8qIGNvbHVtbiAyICovCgkgICAgTUVOVUlURU0gIlBlciBEaSZtZW5zaW9uZSIsCTB4MzEJLyogLi4uICovCgkgICAgTUVOVUlURU0gIlBlciAmRGF0YSIsCTB4MzMKCSAgICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgICBNRU5VSVRFTSAiJkRpc3BvbmkgQXV0b21hdGljYW1lbnRlIiwJRkNJRE1fU0hWSUVXX0FVVE9BUlJBTkdFCgkgIEVORAoJICBNRU5VSVRFTSAiQWxsaW5lYSBJY29uZSIsCUZDSURNX1NIVklFV19TTkFQVE9HUklECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiQWdnaW9ybmEiLAkJRkNJRE1fU0hWSUVXX1JFRlJFU0gKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICJJbmNvbGxhIiwJCUZDSURNX1NIVklFV19JTlNFUlQKCSAgTUVOVUlURU0gIkNyZWEgQ29sbGVnYW1lbnRvIiwJRkNJRE1fU0hWSUVXX0lOU0VSVExJTksKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIFBPUFVQICJOdW92byIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiTnVvdmEgJkNhcnRlbGxhIiwJRkNJRE1fU0hWSUVXX05FV0ZPTERFUgoJICAgIE1FTlVJVEVNICJOdW92byBDbyZsbGVnYW1lbnRvIiwJRkNJRE1fU0hWSUVXX05FV0xJTksKCSAgICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiUHJvcHJpZXTgIiwJRkNJRE1fU0hWSUVXX1BST1BFUlRJRVMKCUVORApFTkQKCi8qCiBzaGVsbHZpZXcgaXRlbSBtZW51CiovCk1FTlVfU0hWX0ZJTEUgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJUE9QVVAgIiIKCUJFR0lOCgkgIE1FTlVJVEVNICImU2VsZWN0IgkJRkNJRE1fU0hWSUVXX09QRU4KCSAgTUVOVUlURU0gIkUmc3Bsb3JhIiwJCUZDSURNX1NIVklFV19FWFBMT1JFCgkgIE1FTlVJVEVNICImQXByaSIsCQlGQ0lETV9TSFZJRVdfT1BFTgoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIiZUYWdsaWEiLAkJRkNJRE1fU0hWSUVXX0NVVAoJICBNRU5VSVRFTSAiJkNvcGlhIiwJCUZDSURNX1NIVklFV19DT1BZCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiQ3JlYSBDbyZsbGVnYW1lbnRvIiwJRkNJRE1fU0hWSUVXX0NSRUFURUxJTksKCSAgTUVOVUlURU0gIiZDYW5jZWxsYSIsCQlGQ0lETV9TSFZJRVdfREVMRVRFCgkgIE1FTlVJVEVNICImUmlub21pbmEiLAkJRkNJRE1fU0hWSUVXX1JFTkFNRQoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIiZQcm9wcmlldOAiLAlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKU0hCUlNGT1JGT0xERVJfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMTg4LCAxOTIKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBEU18zRExPT0sKQ0FQVElPTiAiU2ZvZ2xpYSBDYXJ0ZWxsYSIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDgwLCAxNzYsIDUwLCAxMiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAiQW5udWxsYSIsIDIsIDEzNCwgMTc2LCA1MCwgMTIsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogTFRFWFQgIiIsIElERF9USVRMRSwgNCwgNCwgMTgwLCAxMgogTFRFWFQgIiIsIElERF9TVEFUVVMsIDQsIDI1LCAxODAsIDEyCiBDT05UUk9MICIiLCBJRERfVFJFRVZJRVcsICJTeXNUcmVlVmlldzMyIiwKIAlUVlNfSEFTQlVUVE9OUyB8IFRWU19IQVNMSU5FUyB8IFRWU19MSU5FU0FUUk9PVCB8CglXU19CT1JERVIgfCBXU19UQUJTVE9QLAoJNCwgNDAsIDE4MCwgMTIwCn0KClNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJJbmZvcm1hemlvbmkgc3UgJXMiCkZPTlQgMTAsICJNUyBTaGVsbCBEbGciCnsKIERFRlBVU0hCVVRUT04gIk9LIiwgSURPSywgMTUzLCAxMzMsIDUwLCAxMiwgV1NfVEFCU1RPUAogTElTVEJPWCBJRENfQUJPVVRfTElTVEJPWCwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCiBJQ09OICIiLCBzdGMxLCAxMCwgMTAsIDMwLCAzMAogTFRFWFQgIiIsIElEQ19BQk9VVF9TVEFUSUNfVEVYVDEsIDQwLCAxMCwgMTM3LCAxMAogTFRFWFQgIiIsIElEQ19BQk9VVF9TVEFUSUNfVEVYVDIsIDQwLCAyMiwgMTM3LCAxMAogTFRFWFQgIldpbmUg6CBkaXNwb25pYmlsZSBncmF6aWUgYToiLCBJRENfQUJPVVRfV0lORV9URVhULCA4LCA1NSwgMTM3LCAxMAp9CgpTSEVMTF9SVU5fRExHIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDAsIDAsIDIyNywgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiBJQ09OICIiLCAxMjI5NywgNywgMTEsIDE4LCAyMCwgV1NfVklTSUJMRQogTFRFWFQgIkRpZ2l0YXJlIGlsIG5vbWUgZGVsIHByb2dyYW1tYSwgZGVsbGEgY2FydGVsbGEsIGRlbCBkb2N1bWVudG8gbyBkZWxsYSByaXNvcnNhIGludGVybmV0LCBlIFdpbmUgbGEgYXByaXLgLiIsIDEyMjg5LCAzNiwgMTEsIDE4MiwgMTgKIExURVhUICImQXByaToiLCAxMjMwNSwgNywgMzksIDI0LCAxMAogQ09OVFJPTCAiIiwgMTIyOTgsICJDT01CT0JPWCIsIFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZTQ1JPTEwgfCBXU19WSVNJQkxFIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19EUk9QRE9XTiwgMzYsIDM3LCAxODMsIDEwMAogREVGUFVTSEJVVFRPTiAiT0siLCBJRE9LLCA2MiwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAiQW5udWxsYSIsIElEQ0FOQ0VMLCAxMTYsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIkUmc3Bsb3JhLi4uIiwgMTIyODgsIDE3MCwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRQp7CgkvKgljb2x1bW5zIGluIHRoZSBzaGVsbHZpZXcJKi8KCUlEU19TSFZfQ09MVU1OMQkJIkZpbGUiCglJRFNfU0hWX0NPTFVNTjIJCSJEaW1lbnNpb25lIgoJSURTX1NIVl9DT0xVTU4zCQkiVGlwbyIKCUlEU19TSFZfQ09MVU1ONAkJIk1vZGlmaWNhdG8iCglJRFNfU0hWX0NPTFVNTjUJCSJBdHRyaWJ1dGkiCglJRFNfU0hWX0NPTFVNTjYJCSJTcGF6aW8iCglJRFNfU0hWX0NPTFVNTjcJCSJTcGF6aW8gZGlzcG9uaWJpbGUiCglJRFNfU0hWX0NPTFVNTjgJCSJOb21lIgoJSURTX1NIVl9DT0xVTU45CQkiQ29tbWVudGkiCgoJLyogc3BlY2lhbCBmb2xkZXIgKi8KCUlEU19ERVNLVE9QCQkiRGVza3RvcCIKCUlEU19NWUNPTVBVVEVSCQkiUmlzb3JzZSBkZWwgQ29tcHV0ZXIiCgoJLyogIGNvbnRleHQgbWVudXMgICovCglJRFNfVklFV19MQVJHRQkJIkljb25lICZHcmFuZGkiCglJRFNfVklFV19TTUFMTAkJIkljb25lICZQaWNjb2xlIgoJSURTX1ZJRVdfTElTVAkJIiZMaXN0YSIKCUlEU19WSUVXX0RFVEFJTFMJIiZEZXR0YWdsaSIKCUlEU19TRUxFQ1QJCSJTZWxlemlvbmUiCglJRFNfT1BFTgkJIkFwcmkiCgoJSURTX0NSRUFURUZPTERFUl9ERU5JRUQgIkltcG9zc2liaWxlIGNyZWFyZSBsYSBjYXJ0ZWxsYTogQWNjZXNzbyBuZWdhdG8uIgoJSURTX0NSRUFURUZPTERFUl9DQVBUSU9OICJFcnJvcmUgZHVyYW50ZSBsYSBjcmVhemlvbmUgZGVsbGEgY2FydGVsbGEiCglJRFNfREVMRVRFSVRFTV9DQVBUSU9OICJDb25mZXJtYXJlIGxhIGNhbmNlbGxhemlvbmUgZGVsIGZpbGUiCglJRFNfREVMRVRFRk9MREVSX0NBUFRJT04gIkNvbmZlcm1hcmUgbGEgY2FuY2VsbGF6aW9uZSBkZWxsYSBjYXJ0ZWxsYSIKCUlEU19ERUxFVEVJVEVNX1RFWFQgIlNlaSBzaWN1cm8gZGkgdm9sZXIgY2FuY2VsbGFyZSAnJTEnPyIKCUlEU19ERUxFVEVNVUxUSVBMRV9URVhUICJTZWkgc2ljdXJvIGRpIHZvbGVyIGNhbmNlbGxhcmUgcXVlc3RpICUxIGVsZW1lbnRpPyIKCUlEU19PVkVSV1JJVEVGSUxFX1RFWFQgIlRoaXMgZm9sZGVyIGFscmVhZHkgY29udGFpbnMgYSBmaWxlIGNhbGxlZCAnJTEnLlxuXG5EbyB5b3Ugd2FudCB0byByZXBsYWNlIGl0PyIKCUlEU19PVkVSV1JJVEVGSUxFX0NBUFRJT04gIkNvbmZlcm1hcmUgbGEgc292cmFzY3JpemlvbmUgZGVsIEZpbGUiCglJRFNfT1ZFUldSSVRFRk9MREVSX1RFWFQgIlRoaXMgZm9sZGVyIGFscmVhZHkgY29udGFpbnMgYSBmb2xkZXIgbmFtZWQgJyUxJy5cblxuIlwKCSAgICAiSWYgdGhlIGZpbGVzIGluIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyBmaWxlcyBpbiB0aGVcbiJcCgkgICAgInNlbGVjdGVkIGZvbGRlciB0aGV5IHdpbGwgYmUgcmVwbGFjZWQuIERvIHlvdSBzdGlsbCB3YW50IHRvIG1vdmUgb3IgY29weVxuIlwKCSAgICAidGhlIGZvbGRlcj8iCgoJLyogbWVzc2FnZSBib3ggc3RyaW5ncyAqLwogICAgICAgSURTX1JFU1RBUlRfVElUTEUgICAgICAgIlJpYXZ2aWEiCiAgICAgICBJRFNfUkVTVEFSVF9QUk9NUFQgICAgICAiVnVvaSBzaW11bGFyZSB1biByaWF2dmlvIGRpIFdpbmRvd3M/IgogICAgICAgSURTX1NIVVRET1dOX1RJVExFICAgICAgIlRlcm1pbmEgc2Vzc2lvbmUiCiAgICAgICBJRFNfU0hVVERPV05fUFJPTVBUICAgICAiVnVvaSB0ZXJtaW5hcmUgbGEgc2Vzc2lvbmUgZGkgV2luZT8iCgoJLyogc2hlbGwgZm9sZGVyIHBhdGggZGVmYXVsdCB2YWx1ZXMgKi8KCUlEU19TVEFSVE1FTlUgICAgICAgICAgICAgICAiU3RhcnQgTWVudSIKCUlEU19QUk9HUkFNUyAgICAgICAgICAgICAgICAiU3RhcnQgTWVudVxcUHJvZ3JhbW1pIgoJSURTX1NUQVJUVVAgICAgICAgICAgICAgICAgICJTdGFydCBNZW51XFxQcm9ncmFtbWlcXFN0YXJ0VXAiCglJRFNfQURNSU5UT09MUyAgICAgICAgICAgICAgIlN0YXJ0IE1lbnVcXFByb2dyYW1taVxcQWRtaW5pc3RyYXRpdmUgVG9vbHMiCglJRFNfSU5URVJORVRfQ0FDSEUgICAgICAgICAgIlNldHRhZ2dpIExvY2FsaVxcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzIgoJSURTX0hJU1RPUlkgICAgICAgICAgICAgICAgICJTZXR0YWdnaSBMb2NhbGlcXENyb25vbG9naWEiCglJRFNfTE9DQUxfQVBQREFUQSAgICAgICAgICAgIlNldHRhZ2dpIExvY2FsaVxcQXBwbGljYXppb25pIgoJSURTX0NEQlVSTl9BUkVBICAgICAgICAgICAgICJTZXR0YWdnaSBMb2NhbGlcXEFwcGxpY2F6aW9uaVxcTWljcm9zb2Z0XFxDRCBCdXJuaW5nIgoJSURTX1BST0dSQU1fRklMRVMgICAgICAgICAgICJQcm9ncmFtbWkiCglJRFNfUFJPR1JBTV9GSUxFU19DT01NT04gICAgIlByb2dyYW1taVxcQ29tbW9uIEZpbGVzIgoJSURTX0NPTU1PTl9ET0NVTUVOVFMgICAgICAgICJEb2N1bWVudGkiCglJRFNfQ09NTU9OX01VU0lDICAgICAgICAgICAgIkRvY3VtZW50aVxcTXVzaWNhIgoJSURTX0NPTU1PTl9QSUNUVVJFUyAgICAgICAgICJEb2N1bWVudGlcXEltbWFnaW5pIgoJSURTX0NPTU1PTl9WSURFTyAgICAgICAgICAgICJEb2N1bWVudGlcXFZpZGVvIgoJSURTX1BFUlNPTkFMICAgICAgICAgICAgICAgICJNaWVpIERvY3VtZW50aSIKCUlEU19NWU1VU0lDICAgICAgICAgICAgICAgICAiTXVzaWNhIgoJSURTX01ZVklERU8gICAgICAgICAgICAgICAgICJWaWRlbyIKCUlEU19NWVBJQ1RVUkVTICAgICAgICAgICAgICAiSW1tYWdpbmkiCglJRFNfRkFWT1JJVEVTICAgICAgICAgICAgICAgIkZhdm9yaXRpIgoJSURTX1JFQ0VOVCAgICAgICAgICAgICAgICAgICJSZWNlbnRpIgoJSURTX1NFTkRUTyAgICAgICAgICAgICAgICAgICJTZW5kVG8iCglJRFNfREVTS1RPUERJUkVDVE9SWSAgICAgICAgIkRlc2t0b3AiCglJRFNfTkVUSE9PRCAgICAgICAgICAgICAgICAgIk5ldEhvb2QiCglJRFNfVEVNUExBVEVTICAgICAgICAgICAgICAgIk1vZGVsbGkiCglJRFNfQVBQREFUQSAgICAgICAgICAgICAgICAgIkFwcGxpY2F6aW9uaSIKCUlEU19QUklOVEhPT0QgICAgICAgICAgICAgICAiUHJpbnRIb29kIgoJSURTX0NPT0tJRVMgICAgICAgICAgICAgICAgICJDb29raWVzIgoKCUlEU19ORVdGT0xERVIJCSJOZXcgRm9sZGVyIgp9Cg==