LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNuYW1lLmMsdiAxLjE1IDIwMDIvMDkvMjYgMDA6MTc6Mjgga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZAogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgImZjaW50LmgiCgpzdGF0aWMgY29uc3QgRmNPYmplY3RUeXBlIF9GY0Jhc2VPYmplY3RUeXBlc1tdID0gewogICAgeyBGQ19GQU1JTFksCUZjVHlwZVN0cmluZywgfSwKICAgIHsgRkNfU1RZTEUsCQlGY1R5cGVTdHJpbmcsIH0sCiAgICB7IEZDX1NMQU5ULAkJRmNUeXBlSW50ZWdlciwgfSwKICAgIHsgRkNfV0VJR0hULAlGY1R5cGVJbnRlZ2VyLCB9LAogICAgeyBGQ19XSURUSCwJCUZjVHlwZUludGVnZXIsIH0sCiAgICB7IEZDX1NJWkUsCQlGY1R5cGVEb3VibGUsIH0sCiAgICB7IEZDX0FTUEVDVCwJRmNUeXBlRG91YmxlLCB9LAogICAgeyBGQ19QSVhFTF9TSVpFLAlGY1R5cGVEb3VibGUsIH0sCiAgICB7IEZDX1NQQUNJTkcsCUZjVHlwZUludGVnZXIsIH0sCiAgICB7IEZDX0ZPVU5EUlksCUZjVHlwZVN0cmluZywgfSwKLyogICAgeyBGQ19DT1JFLAkJRmNUeXBlQm9vbCwgfSwgKi8KICAgIHsgRkNfQU5USUFMSUFTLAlGY1R5cGVCb29sLCB9LAogICAgeyBGQ19ISU5UX1NUWUxFLCAgICBGY1R5cGVJbnRlZ2VyLCB9LAogICAgeyBGQ19ISU5USU5HLAlGY1R5cGVCb29sLCB9LAogICAgeyBGQ19WRVJUSUNBTF9MQVlPVVQsICAgRmNUeXBlQm9vbCwgfSwKICAgIHsgRkNfQVVUT0hJTlQsCUZjVHlwZUJvb2wsIH0sCiAgICB7IEZDX0dMT0JBTF9BRFZBTkNFLCAgICBGY1R5cGVCb29sLCB9LAovKiAgICB7IEZDX1hMRkQsCQlGY1R5cGVTdHJpbmcsIH0sICovCiAgICB7IEZDX0ZJTEUsCQlGY1R5cGVTdHJpbmcsIH0sCiAgICB7IEZDX0lOREVYLAkJRmNUeXBlSW50ZWdlciwgfSwKICAgIHsgRkNfUkFTVEVSSVpFUiwJRmNUeXBlU3RyaW5nLCB9LAogICAgeyBGQ19PVVRMSU5FLAlGY1R5cGVCb29sLCB9LAogICAgeyBGQ19TQ0FMQUJMRSwJRmNUeXBlQm9vbCwgfSwKICAgIHsgRkNfRFBJLAkJRmNUeXBlRG91YmxlIH0sCiAgICB7IEZDX1JHQkEsCQlGY1R5cGVJbnRlZ2VyLCB9LAogICAgeyBGQ19TQ0FMRSwJCUZjVHlwZURvdWJsZSwgfSwKLyogICAgeyBGQ19SRU5ERVIsCUZjVHlwZUJvb2wsIH0sKi8KICAgIHsgRkNfTUlOU1BBQ0UsCUZjVHlwZUJvb2wsIH0sCiAgICB7IEZDX0NIQVJfV0lEVEgsCUZjVHlwZUludGVnZXIgfSwKICAgIHsgRkNfQ0hBUl9IRUlHSFQsCUZjVHlwZUludGVnZXIgfSwKICAgIHsgRkNfTUFUUklYLAlGY1R5cGVNYXRyaXggfSwKICAgIHsgRkNfQ0hBUlNFVCwJRmNUeXBlQ2hhclNldCB9LAogICAgeyBGQ19MQU5HLAkJRmNUeXBlTGFuZ1NldCB9LAogICAgeyBGQ19GT05UVkVSU0lPTiwJRmNUeXBlSW50ZWdlciB9LAp9OwoKI2RlZmluZSBOVU1fT0JKRUNUX1RZUEVTICAgIChzaXplb2YgX0ZjQmFzZU9iamVjdFR5cGVzIC8gc2l6ZW9mIF9GY0Jhc2VPYmplY3RUeXBlc1swXSkKCnR5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGVMaXN0ICAgIEZjT2JqZWN0VHlwZUxpc3Q7CgpzdHJ1Y3QgX0ZjT2JqZWN0VHlwZUxpc3QgewogICAgY29uc3QgRmNPYmplY3RUeXBlTGlzdCAgKm5leHQ7CiAgICBjb25zdCBGY09iamVjdFR5cGUJICAgICp0eXBlczsKICAgIGludAkJCSAgICBudHlwZXM7Cn07CgpzdGF0aWMgY29uc3QgRmNPYmplY3RUeXBlTGlzdCBfRmNCYXNlT2JqZWN0VHlwZXNMaXN0ID0gewogICAgMCwKICAgIF9GY0Jhc2VPYmplY3RUeXBlcywKICAgIE5VTV9PQkpFQ1RfVFlQRVMKfTsKCnN0YXRpYyBjb25zdCBGY09iamVjdFR5cGVMaXN0CSpfRmNPYmplY3RUeXBlcyA9ICZfRmNCYXNlT2JqZWN0VHlwZXNMaXN0OwoKRmNCb29sCkZjTmFtZVJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZXMpCnsKICAgIEZjT2JqZWN0VHlwZUxpc3QJKmw7CgogICAgbCA9IChGY09iamVjdFR5cGVMaXN0ICopIG1hbGxvYyAoc2l6ZW9mIChGY09iamVjdFR5cGVMaXN0KSk7CiAgICBpZiAoIWwpCglyZXR1cm4gRmNGYWxzZTsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9PQkpFQ1RUWVBFLCBzaXplb2YgKEZjT2JqZWN0VHlwZUxpc3QpKTsKICAgIGwtPnR5cGVzID0gdHlwZXM7CiAgICBsLT5udHlwZXMgPSBudHlwZXM7CiAgICBsLT5uZXh0ID0gX0ZjT2JqZWN0VHlwZXM7CiAgICBfRmNPYmplY3RUeXBlcyA9IGw7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0Jvb2wKRmNOYW1lVW5yZWdpc3Rlck9iamVjdFR5cGVzIChjb25zdCBGY09iamVjdFR5cGUgKnR5cGVzLCBpbnQgbnR5cGVzKQp7CiAgICBjb25zdCBGY09iamVjdFR5cGVMaXN0CSpsLCAqKnByZXY7CgogICAgZm9yIChwcmV2ID0gJl9GY09iamVjdFR5cGVzOyAKCSAobCA9ICpwcmV2KTsgCgkgcHJldiA9IChjb25zdCBGY09iamVjdFR5cGVMaXN0ICoqKSAmKGwtPm5leHQpKQogICAgewoJaWYgKGwtPnR5cGVzID09IHR5cGVzICYmIGwtPm50eXBlcyA9PSBudHlwZXMpCgl7CgkgICAgKnByZXYgPSBsLT5uZXh0OwoJICAgIEZjTWVtRnJlZSAoRkNfTUVNX09CSkVDVFRZUEUsIHNpemVvZiAoRmNPYmplY3RUeXBlTGlzdCkpOwoJICAgIGZyZWUgKCh2b2lkICopIGwpOwoJICAgIHJldHVybiBGY1RydWU7Cgl9CiAgICB9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKY29uc3QgRmNPYmplY3RUeXBlICoKRmNOYW1lR2V0T2JqZWN0VHlwZSAoY29uc3QgY2hhciAqb2JqZWN0KQp7CiAgICBpbnQJCQkgICAgaTsKICAgIGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QgICpsOwogICAgY29uc3QgRmNPYmplY3RUeXBlCSAgICAqdDsKICAgIAogICAgZm9yIChsID0gX0ZjT2JqZWN0VHlwZXM7IGw7IGwgPSBsLT5uZXh0KQogICAgewoJZm9yIChpID0gMDsgaSA8IGwtPm50eXBlczsgaSsrKQoJewoJICAgIHQgPSAmbC0+dHlwZXNbaV07CgkgICAgaWYgKCFzdHJjbXAgKG9iamVjdCwgdC0+b2JqZWN0KSkKCQlyZXR1cm4gdDsKCX0KICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgY29uc3QgRmNDb25zdGFudCBfRmNCYXNlQ29uc3RhbnRzW10gPSB7CiAgICB7IChGY0NoYXI4ICopICJ0aGluIiwJICAgICJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9USElOLCB9LAogICAgeyAoRmNDaGFyOCAqKSAiZXh0cmFsaWdodCIsCSAgICAid2VpZ2h0IiwgICBGQ19XRUlHSFRfRVhUUkFMSUdIVCwgfSwKICAgIHsgKEZjQ2hhcjggKikgInVsdHJhbGlnaHQiLAkgICAgIndlaWdodCIsICAgRkNfV0VJR0hUX0VYVFJBTElHSFQsIH0sCiAgICB7IChGY0NoYXI4ICopICJsaWdodCIsCSAgICAid2VpZ2h0IiwgICBGQ19XRUlHSFRfTElHSFQsIH0sCiAgICB7IChGY0NoYXI4ICopICJib29rIiwJICAgICJ3ZWlnaHQiLAlGQ19XRUlHSFRfQk9PSywgfSwKICAgIHsgKEZjQ2hhcjggKikgInJlZ3VsYXIiLAkgICAgIndlaWdodCIsICAgRkNfV0VJR0hUX1JFR1VMQVIsIH0sCiAgICB7IChGY0NoYXI4ICopICJtZWRpdW0iLAkgICAgIndlaWdodCIsICAgRkNfV0VJR0hUX01FRElVTSwgfSwKICAgIHsgKEZjQ2hhcjggKikgImRlbWlib2xkIiwJICAgICJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9ERU1JQk9MRCwgfSwKICAgIHsgKEZjQ2hhcjggKikgInNlbWlib2xkIiwJICAgICJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9ERU1JQk9MRCwgfSwKICAgIHsgKEZjQ2hhcjggKikgImJvbGQiLAkgICAgIndlaWdodCIsICAgRkNfV0VJR0hUX0JPTEQsIH0sCiAgICB7IChGY0NoYXI4ICopICJleHRyYWJvbGQiLAkgICAgIndlaWdodCIsICAgRkNfV0VJR0hUX0VYVFJBQk9MRCwgfSwKICAgIHsgKEZjQ2hhcjggKikgInVsdHJhYm9sZCIsCSAgICAid2VpZ2h0IiwgICBGQ19XRUlHSFRfRVhUUkFCT0xELCB9LAogICAgeyAoRmNDaGFyOCAqKSAiYmxhY2siLAkgICAgIndlaWdodCIsICAgRkNfV0VJR0hUX0JMQUNLLCB9LAoKICAgIHsgKEZjQ2hhcjggKikgInJvbWFuIiwJICAgICJzbGFudCIsICAgIEZDX1NMQU5UX1JPTUFOLCB9LAogICAgeyAoRmNDaGFyOCAqKSAiaXRhbGljIiwJICAgICJzbGFudCIsICAgIEZDX1NMQU5UX0lUQUxJQywgfSwKICAgIHsgKEZjQ2hhcjggKikgIm9ibGlxdWUiLAkgICAgInNsYW50IiwgICAgRkNfU0xBTlRfT0JMSVFVRSwgfSwKCiAgICB7IChGY0NoYXI4ICopICJ1bHRyYWNvbmRlbnNlZCIsICJ3aWR0aCIsCUZDX1dJRFRIX1VMVFJBQ09OREVOU0VEIH0sCiAgICB7IChGY0NoYXI4ICopICJleHRyYWNvbmRlbnNlZCIsICJ3aWR0aCIsCUZDX1dJRFRIX0VYVFJBQ09OREVOU0VEIH0sCiAgICB7IChGY0NoYXI4ICopICJjb25kZW5zZWQiLAkgICAgIndpZHRoIiwJRkNfV0lEVEhfQ09OREVOU0VEIH0sCiAgICB7IChGY0NoYXI4ICopICJzZW1pY29uZGVuc2VkIiwgIndpZHRoIiwJRkNfV0lEVEhfU0VNSUNPTkRFTlNFRCB9LAogICAgeyAoRmNDaGFyOCAqKSAibm9ybWFsIiwJICAgICJ3aWR0aCIsCUZDX1dJRFRIX05PUk1BTCB9LAogICAgeyAoRmNDaGFyOCAqKSAic2VtaWV4cGFuZGVkIiwgICAid2lkdGgiLAlGQ19XSURUSF9TRU1JRVhQQU5ERUQgfSwKICAgIHsgKEZjQ2hhcjggKikgImV4cGFuZGVkIiwJICAgICJ3aWR0aCIsCUZDX1dJRFRIX0VYUEFOREVEIH0sCiAgICB7IChGY0NoYXI4ICopICJleHRyYWV4cGFuZGVkIiwgICJ3aWR0aCIsCUZDX1dJRFRIX0VYVFJBRVhQQU5ERUQgfSwKICAgIHsgKEZjQ2hhcjggKikgInVsdHJhZXhwYW5kZWQiLCAgIndpZHRoIiwJRkNfV0lEVEhfVUxUUkFFWFBBTkRFRCB9LAogICAgCiAgICB7IChGY0NoYXI4ICopICJwcm9wb3J0aW9uYWwiLCAgICJzcGFjaW5nIiwgIEZDX1BST1BPUlRJT05BTCwgfSwKICAgIHsgKEZjQ2hhcjggKikgImR1YWwiLAkgICAgInNwYWNpbmciLCAgRkNfRFVBTCwgfSwKICAgIHsgKEZjQ2hhcjggKikgIm1vbm8iLAkgICAgInNwYWNpbmciLCAgRkNfTU9OTywgfSwKICAgIHsgKEZjQ2hhcjggKikgImNoYXJjZWxsIiwJICAgICJzcGFjaW5nIiwgIEZDX0NIQVJDRUxMLCB9LAoKICAgIHsgKEZjQ2hhcjggKikgInVua25vd24iLAkgICAgInJnYmEiLAkgICAgRkNfUkdCQV9VTktOT1dOIH0sCiAgICB7IChGY0NoYXI4ICopICJyZ2IiLAkgICAgInJnYmEiLAkgICAgRkNfUkdCQV9SR0IsIH0sCiAgICB7IChGY0NoYXI4ICopICJiZ3IiLAkgICAgInJnYmEiLAkgICAgRkNfUkdCQV9CR1IsIH0sCiAgICB7IChGY0NoYXI4ICopICJ2cmdiIiwJICAgICJyZ2JhIiwJICAgIEZDX1JHQkFfVlJHQiB9LAogICAgeyAoRmNDaGFyOCAqKSAidmJnciIsCSAgICAicmdiYSIsCSAgICBGQ19SR0JBX1ZCR1IgfSwKICAgIHsgKEZjQ2hhcjggKikgIm5vbmUiLAkgICAgInJnYmEiLAkgICAgRkNfUkdCQV9OT05FIH0sCgogICAgeyAoRmNDaGFyOCAqKSAiaGludG5vbmUiLAkgICAgImhpbnRzdHlsZSIsICAgRkNfSElOVF9OT05FIH0sCiAgICB7IChGY0NoYXI4ICopICJoaW50c2xpZ2h0IiwJICAgICJoaW50c3R5bGUiLCAgIEZDX0hJTlRfU0xJR0hUIH0sCiAgICB7IChGY0NoYXI4ICopICJoaW50bWVkaXVtIiwJICAgICJoaW50c3R5bGUiLCAgIEZDX0hJTlRfTUVESVVNIH0sCiAgICB7IChGY0NoYXI4ICopICJoaW50ZnVsbCIsCSAgICAiaGludHN0eWxlIiwgICBGQ19ISU5UX0ZVTEwgfSwKfTsKCiNkZWZpbmUgTlVNX0ZDX0NPTlNUQU5UUyAgIChzaXplb2YgX0ZjQmFzZUNvbnN0YW50cy9zaXplb2YgX0ZjQmFzZUNvbnN0YW50c1swXSkKCnR5cGVkZWYgc3RydWN0IF9GY0NvbnN0YW50TGlzdCBGY0NvbnN0YW50TGlzdDsKCnN0cnVjdCBfRmNDb25zdGFudExpc3QgewogICAgY29uc3QgRmNDb25zdGFudExpc3QgICAgKm5leHQ7CiAgICBjb25zdCBGY0NvbnN0YW50CSAgICAqY29uc3RzOwogICAgaW50CQkJICAgIG5jb25zdHM7Cn07CgpzdGF0aWMgY29uc3QgRmNDb25zdGFudExpc3QgX0ZjQmFzZUNvbnN0YW50TGlzdCA9IHsKICAgIDAsCiAgICBfRmNCYXNlQ29uc3RhbnRzLAogICAgTlVNX0ZDX0NPTlNUQU5UUwp9OwoKc3RhdGljIGNvbnN0IEZjQ29uc3RhbnRMaXN0CSpfRmNDb25zdGFudHMgPSAmX0ZjQmFzZUNvbnN0YW50TGlzdDsKCkZjQm9vbApGY05hbWVSZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cykKewogICAgRmNDb25zdGFudExpc3QJKmw7CgogICAgbCA9IChGY0NvbnN0YW50TGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoRmNDb25zdGFudExpc3QpKTsKICAgIGlmICghbCkKCXJldHVybiBGY0ZhbHNlOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX0NPTlNUQU5ULCBzaXplb2YgKEZjQ29uc3RhbnRMaXN0KSk7CiAgICBsLT5jb25zdHMgPSBjb25zdHM7CiAgICBsLT5uY29uc3RzID0gbmNvbnN0czsKICAgIGwtPm5leHQgPSBfRmNDb25zdGFudHM7CiAgICBfRmNDb25zdGFudHMgPSBsOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjTmFtZVVucmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpCnsKICAgIGNvbnN0IEZjQ29uc3RhbnRMaXN0CSpsLCAqKnByZXY7CgogICAgZm9yIChwcmV2ID0gJl9GY0NvbnN0YW50czsgCgkgKGwgPSAqcHJldik7IAoJIHByZXYgPSAoY29uc3QgRmNDb25zdGFudExpc3QgKiopICYobC0+bmV4dCkpCiAgICB7CglpZiAobC0+Y29uc3RzID09IGNvbnN0cyAmJiBsLT5uY29uc3RzID09IG5jb25zdHMpCgl7CgkgICAgKnByZXYgPSBsLT5uZXh0OwoJICAgIEZjTWVtRnJlZSAoRkNfTUVNX0NPTlNUQU5ULCBzaXplb2YgKEZjQ29uc3RhbnRMaXN0KSk7CgkgICAgZnJlZSAoKHZvaWQgKikgbCk7CgkgICAgcmV0dXJuIEZjVHJ1ZTsKCX0KICAgIH0KICAgIHJldHVybiBGY0ZhbHNlOwp9Cgpjb25zdCBGY0NvbnN0YW50ICoKRmNOYW1lR2V0Q29uc3RhbnQgKEZjQ2hhcjggKnN0cmluZykKewogICAgY29uc3QgRmNDb25zdGFudExpc3QgICAgKmw7CiAgICBpbnQJCQkgICAgaTsKCiAgICBmb3IgKGwgPSBfRmNDb25zdGFudHM7IGw7IGwgPSBsLT5uZXh0KQogICAgewoJZm9yIChpID0gMDsgaSA8IGwtPm5jb25zdHM7IGkrKykKCSAgICBpZiAoIUZjU3RyQ21wSWdub3JlQ2FzZSAoc3RyaW5nLCBsLT5jb25zdHNbaV0ubmFtZSkpCgkJcmV0dXJuICZsLT5jb25zdHNbaV07CiAgICB9CiAgICByZXR1cm4gMDsKfQoKRmNCb29sCkZjTmFtZUNvbnN0YW50IChGY0NoYXI4ICpzdHJpbmcsIGludCAqcmVzdWx0KQp7CiAgICBjb25zdCBGY0NvbnN0YW50CSpjOwoKICAgIGlmICgoYyA9IEZjTmFtZUdldENvbnN0YW50KHN0cmluZykpKQogICAgewoJKnJlc3VsdCA9IGMtPnZhbHVlOwoJcmV0dXJuIEZjVHJ1ZTsKICAgIH0KICAgIHJldHVybiBGY0ZhbHNlOwp9CgpGY0Jvb2wKRmNOYW1lQm9vbCAoRmNDaGFyOCAqdiwgRmNCb29sICpyZXN1bHQpCnsKICAgIGNoYXIgICAgYzAsIGMxOwoKICAgIGMwID0gKnY7CiAgICBjMCA9IEZjVG9Mb3dlciAoYzApOwogICAgaWYgKGMwID09ICd0JyB8fCBjMCA9PSAneScgfHwgYzAgPT0gJzEnKQogICAgewoJKnJlc3VsdCA9IEZjVHJ1ZTsKCXJldHVybiBGY1RydWU7CiAgICB9CiAgICBpZiAoYzAgPT0gJ2YnIHx8IGMwID09ICduJyB8fCBjMCA9PSAnMCcpCiAgICB7CgkqcmVzdWx0ID0gRmNGYWxzZTsKCXJldHVybiBGY1RydWU7CiAgICB9CiAgICBpZiAoYzAgPT0gJ28nKQogICAgewoJYzEgPSB2WzFdOwoJYzEgPSBGY1RvTG93ZXIgKGMxKTsKCWlmIChjMSA9PSAnbicpCgl7CgkgICAgKnJlc3VsdCA9IEZjVHJ1ZTsKCSAgICByZXR1cm4gRmNUcnVlOwoJfQoJaWYgKGMxID09ICdmJykKCXsKCSAgICAqcmVzdWx0ID0gRmNGYWxzZTsKCSAgICByZXR1cm4gRmNUcnVlOwoJfQogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyBGY1ZhbHVlCkZjTmFtZUNvbnZlcnQgKEZjVHlwZSB0eXBlLCBGY0NoYXI4ICpzdHJpbmcsIEZjTWF0cml4ICptKQp7CiAgICBGY1ZhbHVlCXY7CgogICAgdi50eXBlID0gdHlwZTsKICAgIHN3aXRjaCAodi50eXBlKSB7CiAgICBjYXNlIEZjVHlwZUludGVnZXI6CglpZiAoIUZjTmFtZUNvbnN0YW50IChzdHJpbmcsICZ2LnUuaSkpCgkgICAgdi51LmkgPSBhdG9pICgoY2hhciAqKSBzdHJpbmcpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZVN0cmluZzoKCXYudS5zID0gc3RyaW5nOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUJvb2w6CglpZiAoIUZjTmFtZUJvb2wgKHN0cmluZywgJnYudS5iKSkKCSAgICB2LnUuYiA9IEZjRmFsc2U7CglicmVhazsKICAgIGNhc2UgRmNUeXBlRG91YmxlOgoJdi51LmQgPSBzdHJ0b2QgKChjaGFyICopIHN0cmluZywgMCk7CglicmVhazsKICAgIGNhc2UgRmNUeXBlTWF0cml4OgoJdi51Lm0gPSBtOwoJc3NjYW5mICgoY2hhciAqKSBzdHJpbmcsICIlbGcgJWxnICVsZyAlbGciLCAmbS0+eHgsICZtLT54eSwgJm0tPnl4LCAmbS0+eXkpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUNoYXJTZXQ6Cgl2LnUuYyA9IEZjTmFtZVBhcnNlQ2hhclNldCAoc3RyaW5nKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVMYW5nU2V0OgoJdi51LmwgPSBGY05hbWVQYXJzZUxhbmdTZXQgKHN0cmluZyk7CglicmVhazsKICAgIGRlZmF1bHQ6CglicmVhazsKICAgIH0KICAgIHJldHVybiB2Owp9CgpzdGF0aWMgY29uc3QgRmNDaGFyOCAqCkZjTmFtZUZpbmROZXh0IChjb25zdCBGY0NoYXI4ICpjdXIsIGNvbnN0IGNoYXIgKmRlbGltLCBGY0NoYXI4ICpzYXZlLCBGY0NoYXI4ICpsYXN0KQp7CiAgICBGY0NoYXI4ICAgIGM7CiAgICAKICAgIHdoaWxlICgoYyA9ICpjdXIpKQogICAgewoJaWYgKGMgPT0gJ1xcJykKCXsKCSAgICArK2N1cjsKCSAgICBpZiAoIShjID0gKmN1cikpCgkJYnJlYWs7Cgl9CgllbHNlIGlmIChzdHJjaHIgKGRlbGltLCBjKSkKCSAgICBicmVhazsKCSsrY3VyOwoJKnNhdmUrKyA9IGM7CiAgICB9CiAgICAqc2F2ZSA9IDA7CiAgICAqbGFzdCA9ICpjdXI7CiAgICBpZiAoKmN1cikKCWN1cisrOwogICAgcmV0dXJuIGN1cjsKfQoKRmNQYXR0ZXJuICoKRmNOYW1lUGFyc2UgKGNvbnN0IEZjQ2hhcjggKm5hbWUpCnsKICAgIEZjQ2hhcjgJCSpzYXZlOwogICAgRmNQYXR0ZXJuCQkqcGF0OwogICAgZG91YmxlCQlkOwogICAgRmNDaGFyOAkJKmU7CiAgICBGY0NoYXI4CQlkZWxpbTsKICAgIEZjVmFsdWUJCXY7CiAgICBGY01hdHJpeAkJbTsKICAgIGNvbnN0IEZjT2JqZWN0VHlwZQkqdDsKICAgIGNvbnN0IEZjQ29uc3RhbnQJKmM7CgogICAgLyogZnJlZWQgYmVsb3cgKi8KICAgIHNhdmUgPSBtYWxsb2MgKHN0cmxlbiAoKGNoYXIgKikgbmFtZSkgKyAxKTsKICAgIGlmICghc2F2ZSkKCWdvdG8gYmFpbDA7CiAgICBwYXQgPSBGY1BhdHRlcm5DcmVhdGUgKCk7CiAgICBpZiAoIXBhdCkKCWdvdG8gYmFpbDE7CgogICAgZm9yICg7OykKICAgIHsKCW5hbWUgPSBGY05hbWVGaW5kTmV4dCAobmFtZSwgIi0sOiIsIHNhdmUsICZkZWxpbSk7CglpZiAoc2F2ZVswXSkKCXsKCSAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19GQU1JTFksIHNhdmUpKQoJCWdvdG8gYmFpbDI7Cgl9CglpZiAoZGVsaW0gIT0gJywnKQoJICAgIGJyZWFrOwogICAgfQogICAgaWYgKGRlbGltID09ICctJykKICAgIHsKCWZvciAoOzspCgl7CgkgICAgbmFtZSA9IEZjTmFtZUZpbmROZXh0IChuYW1lLCAiLSw6Iiwgc2F2ZSwgJmRlbGltKTsKCSAgICBkID0gc3RydG9kICgoY2hhciAqKSBzYXZlLCAoY2hhciAqKikgJmUpOwoJICAgIGlmIChlICE9IHNhdmUpCgkgICAgewoJCWlmICghRmNQYXR0ZXJuQWRkRG91YmxlIChwYXQsIEZDX1NJWkUsIGQpKQoJCSAgICBnb3RvIGJhaWwyOwoJICAgIH0KCSAgICBpZiAoZGVsaW0gIT0gJywnKQoJCWJyZWFrOwoJfQogICAgfQogICAgd2hpbGUgKGRlbGltID09ICc6JykKICAgIHsKCW5hbWUgPSBGY05hbWVGaW5kTmV4dCAobmFtZSwgIj1fOiIsIHNhdmUsICZkZWxpbSk7CglpZiAoc2F2ZVswXSkKCXsKCSAgICBpZiAoZGVsaW0gPT0gJz0nIHx8IGRlbGltID09ICdfJykKCSAgICB7CgkJdCA9IEZjTmFtZUdldE9iamVjdFR5cGUgKChjaGFyICopIHNhdmUpOwoJCWZvciAoOzspCgkJewoJCSAgICBuYW1lID0gRmNOYW1lRmluZE5leHQgKG5hbWUsICI6LCIsIHNhdmUsICZkZWxpbSk7CgkJICAgIGlmICh0KQoJCSAgICB7CgkJCXYgPSBGY05hbWVDb252ZXJ0ICh0LT50eXBlLCBzYXZlLCAmbSk7CgkJCWlmICghRmNQYXR0ZXJuQWRkIChwYXQsIHQtPm9iamVjdCwgdiwgRmNUcnVlKSkKCQkJewoJCQkgICAgc3dpdGNoICh2LnR5cGUpIHsKCQkJICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKCQkJCUZjQ2hhclNldERlc3Ryb3kgKChGY0NoYXJTZXQgKikgdi51LmMpOwoJCQkJYnJlYWs7CgkJCSAgICBjYXNlIEZjVHlwZUxhbmdTZXQ6CgkJCQlGY0xhbmdTZXREZXN0cm95ICgoRmNMYW5nU2V0ICopIHYudS5sKTsKCQkJCWJyZWFrOwoJCQkgICAgZGVmYXVsdDoKCQkJCWJyZWFrOwoJCQkgICAgfQoJCQkgICAgZ290byBiYWlsMjsKCQkJfQoJCQlzd2l0Y2ggKHYudHlwZSkgewoJCQljYXNlIEZjVHlwZUNoYXJTZXQ6CgkJCSAgICBGY0NoYXJTZXREZXN0cm95ICgoRmNDaGFyU2V0ICopIHYudS5jKTsKCQkJICAgIGJyZWFrOwoJCQljYXNlIEZjVHlwZUxhbmdTZXQ6CgkJCSAgICBGY0xhbmdTZXREZXN0cm95ICgoRmNMYW5nU2V0ICopIHYudS5sKTsKCQkJICAgIGJyZWFrOwoJCQlkZWZhdWx0OgoJCQkgICAgYnJlYWs7CgkJCX0KCQkgICAgfQoJCSAgICBpZiAoZGVsaW0gIT0gJywnKQoJCQlicmVhazsKCQl9CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJaWYgKChjID0gRmNOYW1lR2V0Q29uc3RhbnQgKHNhdmUpKSkKCQl7CgkJICAgIGlmICghRmNQYXR0ZXJuQWRkSW50ZWdlciAocGF0LCBjLT5vYmplY3QsIGMtPnZhbHVlKSkKCQkJZ290byBiYWlsMjsKCQl9CgkgICAgfQoJfQogICAgfQoKICAgIGZyZWUgKHNhdmUpOwogICAgcmV0dXJuIHBhdDsKCmJhaWwyOgogICAgRmNQYXR0ZXJuRGVzdHJveSAocGF0KTsKYmFpbDE6CiAgICBmcmVlIChzYXZlKTsKYmFpbDA6CiAgICByZXR1cm4gMDsKfQpzdGF0aWMgRmNCb29sCkZjTmFtZVVucGFyc2VTdHJpbmcgKEZjU3RyQnVmCSAgICAqYnVmLCAKCQkgICAgIGNvbnN0IEZjQ2hhcjggICpzdHJpbmcsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqZXNjYXBlKQp7CiAgICBGY0NoYXI4IGM7CiAgICB3aGlsZSAoKGMgPSAqc3RyaW5nKyspKQogICAgewoJaWYgKGVzY2FwZSAmJiBzdHJjaHIgKChjaGFyICopIGVzY2FwZSwgKGNoYXIpIGMpKQoJewoJICAgIGlmICghRmNTdHJCdWZDaGFyIChidWYsIGVzY2FwZVswXSkpCgkJcmV0dXJuIEZjRmFsc2U7Cgl9CglpZiAoIUZjU3RyQnVmQ2hhciAoYnVmLCBjKSkKCSAgICByZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNOYW1lVW5wYXJzZVZhbHVlIChGY1N0ckJ1ZgkqYnVmLAoJCSAgICBGY1ZhbHVlCXYsCgkJICAgIEZjQ2hhcjgJKmVzY2FwZSkKewogICAgRmNDaGFyOAl0ZW1wWzEwMjRdOwogICAgCiAgICBzd2l0Y2ggKHYudHlwZSkgewogICAgY2FzZSBGY1R5cGVWb2lkOgoJcmV0dXJuIEZjVHJ1ZTsKICAgIGNhc2UgRmNUeXBlSW50ZWdlcjoKCXNwcmludGYgKChjaGFyICopIHRlbXAsICIlZCIsIHYudS5pKTsKCXJldHVybiBGY05hbWVVbnBhcnNlU3RyaW5nIChidWYsIHRlbXAsIDApOwogICAgY2FzZSBGY1R5cGVEb3VibGU6CglzcHJpbnRmICgoY2hhciAqKSB0ZW1wLCAiJWciLCB2LnUuZCk7CglyZXR1cm4gRmNOYW1lVW5wYXJzZVN0cmluZyAoYnVmLCB0ZW1wLCAwKTsKICAgIGNhc2UgRmNUeXBlU3RyaW5nOgoJcmV0dXJuIEZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1Ziwgdi51LnMsIGVzY2FwZSk7CiAgICBjYXNlIEZjVHlwZUJvb2w6CglyZXR1cm4gRmNOYW1lVW5wYXJzZVN0cmluZyAoYnVmLCB2LnUuYiA/IChGY0NoYXI4ICopICJUcnVlIiA6IChGY0NoYXI4ICopICJGYWxzZSIsIDApOwogICAgY2FzZSBGY1R5cGVNYXRyaXg6CglzcHJpbnRmICgoY2hhciAqKSB0ZW1wLCAiJWcgJWcgJWcgJWciLCAKCQkgdi51Lm0tPnh4LCB2LnUubS0+eHksIHYudS5tLT55eCwgdi51Lm0tPnl5KTsKCXJldHVybiBGY05hbWVVbnBhcnNlU3RyaW5nIChidWYsIHRlbXAsIDApOwogICAgY2FzZSBGY1R5cGVDaGFyU2V0OgoJcmV0dXJuIEZjTmFtZVVucGFyc2VDaGFyU2V0IChidWYsIHYudS5jKTsKICAgIGNhc2UgRmNUeXBlTGFuZ1NldDoKCXJldHVybiBGY05hbWVVbnBhcnNlTGFuZ1NldCAoYnVmLCB2LnUubCk7CiAgICBjYXNlIEZjVHlwZUZURmFjZToKCXJldHVybiBGY1RydWU7CiAgICB9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKc3RhdGljIEZjQm9vbApGY05hbWVVbnBhcnNlVmFsdWVMaXN0IChGY1N0ckJ1ZgkqYnVmLAoJCQlGY1ZhbHVlTGlzdAkqdiwKCQkJRmNDaGFyOAkJKmVzY2FwZSkKewogICAgd2hpbGUgKHYpCiAgICB7CglpZiAoIUZjTmFtZVVucGFyc2VWYWx1ZSAoYnVmLCB2LT52YWx1ZSwgZXNjYXBlKSkKCSAgICByZXR1cm4gRmNGYWxzZTsKCWlmICgodiA9IHYtPm5leHQpKQoJICAgIGlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoYnVmLCAoRmNDaGFyOCAqKSAiLCIsIDApKQoJCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKI2RlZmluZSBGQ19FU0NBUEVfRklYRUQgICAgIlxcLTosIgojZGVmaW5lIEZDX0VTQ0FQRV9WQVJJQUJMRSAiXFw9XzosIgoKRmNDaGFyOCAqCkZjTmFtZVVucGFyc2UgKEZjUGF0dGVybiAqcGF0KQp7CiAgICBGY1N0ckJ1ZgkJICAgIGJ1ZjsKICAgIEZjQ2hhcjgJCSAgICBidWZfc3RhdGljWzgxOTJdOwogICAgaW50CQkJICAgIGk7CiAgICBGY1BhdHRlcm5FbHQJICAgICplOwogICAgY29uc3QgRmNPYmplY3RUeXBlTGlzdCAgKmw7CiAgICBjb25zdCBGY09iamVjdFR5cGUJICAgICpvOwoKICAgIEZjU3RyQnVmSW5pdCAoJmJ1ZiwgYnVmX3N0YXRpYywgc2l6ZW9mIChidWZfc3RhdGljKSk7CiAgICBlID0gRmNQYXR0ZXJuRmluZEVsdCAocGF0LCBGQ19GQU1JTFkpOwogICAgaWYgKGUpCiAgICB7CglpZiAoIUZjTmFtZVVucGFyc2VWYWx1ZUxpc3QgKCZidWYsIGUtPnZhbHVlcywgKEZjQ2hhcjggKikgRkNfRVNDQVBFX0ZJWEVEKSkKCSAgICBnb3RvIGJhaWwwOwogICAgfQogICAgZSA9IEZjUGF0dGVybkZpbmRFbHQgKHBhdCwgRkNfU0laRSk7CiAgICBpZiAoZSkKICAgIHsKCWlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoJmJ1ZiwgKEZjQ2hhcjggKikgIi0iLCAwKSkKCSAgICBnb3RvIGJhaWwwOwoJaWYgKCFGY05hbWVVbnBhcnNlVmFsdWVMaXN0ICgmYnVmLCBlLT52YWx1ZXMsIChGY0NoYXI4ICopIEZDX0VTQ0FQRV9GSVhFRCkpCgkgICAgZ290byBiYWlsMDsKICAgIH0KICAgIGZvciAobCA9IF9GY09iamVjdFR5cGVzOyBsOyBsID0gbC0+bmV4dCkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBsLT5udHlwZXM7IGkrKykKCXsKCSAgICBvID0gJmwtPnR5cGVzW2ldOwoJICAgIGlmICghc3RyY21wIChvLT5vYmplY3QsIEZDX0ZBTUlMWSkgfHwgCgkJIXN0cmNtcCAoby0+b2JqZWN0LCBGQ19TSVpFKSB8fAoJCSFzdHJjbXAgKG8tPm9iamVjdCwgRkNfRklMRSkpCgkJY29udGludWU7CgkgICAgCgkgICAgZSA9IEZjUGF0dGVybkZpbmRFbHQgKHBhdCwgby0+b2JqZWN0KTsKCSAgICBpZiAoZSkKCSAgICB7CgkJaWYgKCFGY05hbWVVbnBhcnNlU3RyaW5nICgmYnVmLCAoRmNDaGFyOCAqKSAiOiIsIDApKQoJCSAgICBnb3RvIGJhaWwwOwoJCWlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoJmJ1ZiwgKEZjQ2hhcjggKikgby0+b2JqZWN0LCAoRmNDaGFyOCAqKSBGQ19FU0NBUEVfVkFSSUFCTEUpKQoJCSAgICBnb3RvIGJhaWwwOwoJCWlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoJmJ1ZiwgKEZjQ2hhcjggKikgIj0iLCAwKSkKCQkgICAgZ290byBiYWlsMDsKCQlpZiAoIUZjTmFtZVVucGFyc2VWYWx1ZUxpc3QgKCZidWYsIGUtPnZhbHVlcywgCgkJCQkJICAgICAoRmNDaGFyOCAqKSBGQ19FU0NBUEVfVkFSSUFCTEUpKQoJCSAgICBnb3RvIGJhaWwwOwoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiBGY1N0ckJ1ZkRvbmUgKCZidWYpOwpiYWlsMDoKICAgIEZjU3RyQnVmRGVzdHJveSAoJmJ1Zik7CiAgICByZXR1cm4gMDsKfQo=