LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY25hbWUuYyx2IDEuMTAgMjAwMi8wNi8yOSAyMDozMTowMiBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgImZjaW50LmgiCgpzdGF0aWMgY29uc3QgRmNPYmplY3RUeXBlIF9GY0Jhc2VPYmplY3RUeXBlc1tdID0gewogICAgeyBGQ19GQU1JTFksCUZjVHlwZVN0cmluZywgfSwKICAgIHsgRkNfU1RZTEUsCQlGY1R5cGVTdHJpbmcsIH0sCiAgICB7IEZDX1NMQU5ULAkJRmNUeXBlSW50ZWdlciwgfSwKICAgIHsgRkNfV0VJR0hULAlGY1R5cGVJbnRlZ2VyLCB9LAogICAgeyBGQ19TSVpFLAkJRmNUeXBlRG91YmxlLCB9LAogICAgeyBGQ19BU1BFQ1QsCUZjVHlwZURvdWJsZSwgfSwKICAgIHsgRkNfUElYRUxfU0laRSwJRmNUeXBlRG91YmxlLCB9LAogICAgeyBGQ19TUEFDSU5HLAlGY1R5cGVJbnRlZ2VyLCB9LAogICAgeyBGQ19GT1VORFJZLAlGY1R5cGVTdHJpbmcsIH0sCi8qICAgIHsgRkNfQ09SRSwJCUZjVHlwZUJvb2wsIH0sICovCiAgICB7IEZDX0FOVElBTElBUywJRmNUeXBlQm9vbCwgfSwKICAgIHsgRkNfSElOVElORywJRmNUeXBlQm9vbCwgfSwKICAgIHsgRkNfVkVSVElDQUxfTEFZT1VULCAgIEZjVHlwZUJvb2wsIH0sCiAgICB7IEZDX0FVVE9ISU5ULAlGY1R5cGVCb29sLCB9LAogICAgeyBGQ19HTE9CQUxfQURWQU5DRSwgICAgRmNUeXBlQm9vbCwgfSwKLyogICAgeyBGQ19YTEZELAkJRmNUeXBlU3RyaW5nLCB9LCAqLwogICAgeyBGQ19GSUxFLAkJRmNUeXBlU3RyaW5nLCB9LAogICAgeyBGQ19JTkRFWCwJCUZjVHlwZUludGVnZXIsIH0sCiAgICB7IEZDX1JBU1RFUklaRVIsCUZjVHlwZVN0cmluZywgfSwKICAgIHsgRkNfT1VUTElORSwJRmNUeXBlQm9vbCwgfSwKICAgIHsgRkNfU0NBTEFCTEUsCUZjVHlwZUJvb2wsIH0sCiAgICB7IEZDX0RQSSwJCUZjVHlwZURvdWJsZSB9LAogICAgeyBGQ19SR0JBLAkJRmNUeXBlSW50ZWdlciwgfSwKICAgIHsgRkNfU0NBTEUsCQlGY1R5cGVEb3VibGUsIH0sCi8qICAgIHsgRkNfUkVOREVSLAlGY1R5cGVCb29sLCB9LCovCiAgICB7IEZDX01JTlNQQUNFLAlGY1R5cGVCb29sLCB9LAogICAgeyBGQ19DSEFSX1dJRFRILAlGY1R5cGVJbnRlZ2VyIH0sCiAgICB7IEZDX0NIQVJfSEVJR0hULAlGY1R5cGVJbnRlZ2VyIH0sCiAgICB7IEZDX01BVFJJWCwJRmNUeXBlTWF0cml4IH0sCiAgICB7IEZDX0NIQVJTRVQsCUZjVHlwZUNoYXJTZXQgfSwKICAgIHsgRkNfTEFORywJCUZjVHlwZVN0cmluZyB9LAp9OwoKI2RlZmluZSBOVU1fT0JKRUNUX1RZUEVTICAgIChzaXplb2YgX0ZjQmFzZU9iamVjdFR5cGVzIC8gc2l6ZW9mIF9GY0Jhc2VPYmplY3RUeXBlc1swXSkKCnR5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGVMaXN0ICAgIEZjT2JqZWN0VHlwZUxpc3Q7CgpzdHJ1Y3QgX0ZjT2JqZWN0VHlwZUxpc3QgewogICAgY29uc3QgRmNPYmplY3RUeXBlTGlzdCAgKm5leHQ7CiAgICBjb25zdCBGY09iamVjdFR5cGUJICAgICp0eXBlczsKICAgIGludAkJCSAgICBudHlwZXM7Cn07CgpzdGF0aWMgY29uc3QgRmNPYmplY3RUeXBlTGlzdCBfRmNCYXNlT2JqZWN0VHlwZXNMaXN0ID0gewogICAgMCwKICAgIF9GY0Jhc2VPYmplY3RUeXBlcywKICAgIE5VTV9PQkpFQ1RfVFlQRVMKfTsKCnN0YXRpYyBjb25zdCBGY09iamVjdFR5cGVMaXN0CSpfRmNPYmplY3RUeXBlcyA9ICZfRmNCYXNlT2JqZWN0VHlwZXNMaXN0OwoKRmNCb29sCkZjTmFtZVJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZXMpCnsKICAgIEZjT2JqZWN0VHlwZUxpc3QJKmw7CgogICAgbCA9IChGY09iamVjdFR5cGVMaXN0ICopIG1hbGxvYyAoc2l6ZW9mIChGY09iamVjdFR5cGVMaXN0KSk7CiAgICBpZiAoIWwpCglyZXR1cm4gRmNGYWxzZTsKICAgIGwtPnR5cGVzID0gdHlwZXM7CiAgICBsLT5udHlwZXMgPSBudHlwZXM7CiAgICBsLT5uZXh0ID0gX0ZjT2JqZWN0VHlwZXM7CiAgICBfRmNPYmplY3RUeXBlcyA9IGw7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0Jvb2wKRmNOYW1lVW5yZWdpc3Rlck9iamVjdFR5cGVzIChjb25zdCBGY09iamVjdFR5cGUgKnR5cGVzLCBpbnQgbnR5cGVzKQp7CiAgICBjb25zdCBGY09iamVjdFR5cGVMaXN0CSpsLCAqKnByZXY7CgogICAgZm9yIChwcmV2ID0gJl9GY09iamVjdFR5cGVzOyAKCSAobCA9ICpwcmV2KTsgCgkgcHJldiA9IChjb25zdCBGY09iamVjdFR5cGVMaXN0ICoqKSAmKGwtPm5leHQpKQogICAgewoJaWYgKGwtPnR5cGVzID09IHR5cGVzICYmIGwtPm50eXBlcyA9PSBudHlwZXMpCgl7CgkgICAgKnByZXYgPSBsLT5uZXh0OwoJICAgIGZyZWUgKCh2b2lkICopIGwpOwoJICAgIHJldHVybiBGY1RydWU7Cgl9CiAgICB9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKY29uc3QgRmNPYmplY3RUeXBlICoKRmNOYW1lR2V0T2JqZWN0VHlwZSAoY29uc3QgY2hhciAqb2JqZWN0KQp7CiAgICBpbnQJCQkgICAgaTsKICAgIGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QgICpsOwogICAgY29uc3QgRmNPYmplY3RUeXBlCSAgICAqdDsKICAgIAogICAgZm9yIChsID0gX0ZjT2JqZWN0VHlwZXM7IGw7IGwgPSBsLT5uZXh0KQogICAgewoJZm9yIChpID0gMDsgaSA8IGwtPm50eXBlczsgaSsrKQoJewoJICAgIHQgPSAmbC0+dHlwZXNbaV07CgkgICAgaWYgKCFzdHJjbXAgKG9iamVjdCwgdC0+b2JqZWN0KSkKCQlyZXR1cm4gdDsKCX0KICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgY29uc3QgRmNDb25zdGFudCBfRmNCYXNlQ29uc3RhbnRzW10gPSB7CiAgICB7IChGY0NoYXI4ICopICJsaWdodCIsCSAgICAid2VpZ2h0IiwgICBGQ19XRUlHSFRfTElHSFQsIH0sCiAgICB7IChGY0NoYXI4ICopICJtZWRpdW0iLAkgICAgIndlaWdodCIsICAgRkNfV0VJR0hUX01FRElVTSwgfSwKICAgIHsgKEZjQ2hhcjggKikgImRlbWlib2xkIiwJICAgICJ3ZWlnaHQiLCAgIEZDX1dFSUdIVF9ERU1JQk9MRCwgfSwKICAgIHsgKEZjQ2hhcjggKikgImJvbGQiLAkgICAgIndlaWdodCIsICAgRkNfV0VJR0hUX0JPTEQsIH0sCiAgICB7IChGY0NoYXI4ICopICJibGFjayIsCSAgICAid2VpZ2h0IiwgICBGQ19XRUlHSFRfQkxBQ0ssIH0sCgogICAgeyAoRmNDaGFyOCAqKSAicm9tYW4iLAkgICAgInNsYW50IiwgICAgRkNfU0xBTlRfUk9NQU4sIH0sCiAgICB7IChGY0NoYXI4ICopICJpdGFsaWMiLAkgICAgInNsYW50IiwgICAgRkNfU0xBTlRfSVRBTElDLCB9LAogICAgeyAoRmNDaGFyOCAqKSAib2JsaXF1ZSIsCSAgICAic2xhbnQiLCAgICBGQ19TTEFOVF9PQkxJUVVFLCB9LAoKICAgIHsgKEZjQ2hhcjggKikgInByb3BvcnRpb25hbCIsICAgInNwYWNpbmciLCAgRkNfUFJPUE9SVElPTkFMLCB9LAogICAgeyAoRmNDaGFyOCAqKSAibW9ubyIsCSAgICAic3BhY2luZyIsICBGQ19NT05PLCB9LAogICAgeyAoRmNDaGFyOCAqKSAiY2hhcmNlbGwiLAkgICAgInNwYWNpbmciLCAgRkNfQ0hBUkNFTEwsIH0sCgogICAgeyAoRmNDaGFyOCAqKSAibm9uZSIsCSAgICAicmdiYSIsCSAgICBGQ19SR0JBX05PTkUgfSwKICAgIHsgKEZjQ2hhcjggKikgInJnYiIsCSAgICAicmdiYSIsCSAgICBGQ19SR0JBX1JHQiwgfSwKICAgIHsgKEZjQ2hhcjggKikgImJnciIsCSAgICAicmdiYSIsCSAgICBGQ19SR0JBX0JHUiwgfSwKICAgIHsgKEZjQ2hhcjggKikgInZyZ2IiLAkgICAgInJnYmEiLAkgICAgRkNfUkdCQV9WUkdCIH0sCiAgICB7IChGY0NoYXI4ICopICJ2YmdyIiwJICAgICJyZ2JhIiwJICAgIEZDX1JHQkFfVkJHUiB9LAp9OwoKI2RlZmluZSBOVU1fRkNfQ09OU1RBTlRTICAgKHNpemVvZiBfRmNCYXNlQ29uc3RhbnRzL3NpemVvZiBfRmNCYXNlQ29uc3RhbnRzWzBdKQoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ29uc3RhbnRMaXN0IEZjQ29uc3RhbnRMaXN0OwoKc3RydWN0IF9GY0NvbnN0YW50TGlzdCB7CiAgICBjb25zdCBGY0NvbnN0YW50TGlzdCAgICAqbmV4dDsKICAgIGNvbnN0IEZjQ29uc3RhbnQJICAgICpjb25zdHM7CiAgICBpbnQJCQkgICAgbmNvbnN0czsKfTsKCnN0YXRpYyBjb25zdCBGY0NvbnN0YW50TGlzdCBfRmNCYXNlQ29uc3RhbnRMaXN0ID0gewogICAgMCwKICAgIF9GY0Jhc2VDb25zdGFudHMsCiAgICBOVU1fRkNfQ09OU1RBTlRTCn07CgpzdGF0aWMgY29uc3QgRmNDb25zdGFudExpc3QJKl9GY0NvbnN0YW50cyA9ICZfRmNCYXNlQ29uc3RhbnRMaXN0OwoKRmNCb29sCkZjTmFtZVJlZ2lzdGVyQ29uc3RhbnRzIChjb25zdCBGY0NvbnN0YW50ICpjb25zdHMsIGludCBuY29uc3RzKQp7CiAgICBGY0NvbnN0YW50TGlzdAkqbDsKCiAgICBsID0gKEZjQ29uc3RhbnRMaXN0ICopIG1hbGxvYyAoc2l6ZW9mIChGY0NvbnN0YW50TGlzdCkpOwogICAgaWYgKCFsKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBsLT5jb25zdHMgPSBjb25zdHM7CiAgICBsLT5uY29uc3RzID0gbmNvbnN0czsKICAgIGwtPm5leHQgPSBfRmNDb25zdGFudHM7CiAgICBfRmNDb25zdGFudHMgPSBsOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjTmFtZVVucmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpCnsKICAgIGNvbnN0IEZjQ29uc3RhbnRMaXN0CSpsLCAqKnByZXY7CgogICAgZm9yIChwcmV2ID0gJl9GY0NvbnN0YW50czsgCgkgKGwgPSAqcHJldik7IAoJIHByZXYgPSAoY29uc3QgRmNDb25zdGFudExpc3QgKiopICYobC0+bmV4dCkpCiAgICB7CglpZiAobC0+Y29uc3RzID09IGNvbnN0cyAmJiBsLT5uY29uc3RzID09IG5jb25zdHMpCgl7CgkgICAgKnByZXYgPSBsLT5uZXh0OwoJICAgIGZyZWUgKCh2b2lkICopIGwpOwoJICAgIHJldHVybiBGY1RydWU7Cgl9CiAgICB9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKY29uc3QgRmNDb25zdGFudCAqCkZjTmFtZUdldENvbnN0YW50IChGY0NoYXI4ICpzdHJpbmcpCnsKICAgIGNvbnN0IEZjQ29uc3RhbnRMaXN0ICAgICpsOwogICAgaW50CQkJICAgIGk7CiAgICAKICAgIGZvciAobCA9IF9GY0NvbnN0YW50czsgbDsgbCA9IGwtPm5leHQpCiAgICB7Cglmb3IgKGkgPSAwOyBpIDwgbC0+bmNvbnN0czsgaSsrKQoJICAgIGlmICghRmNTdHJDbXBJZ25vcmVDYXNlIChzdHJpbmcsIGwtPmNvbnN0c1tpXS5uYW1lKSkKCQlyZXR1cm4gJmwtPmNvbnN0c1tpXTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpGY0Jvb2wKRmNOYW1lQ29uc3RhbnQgKEZjQ2hhcjggKnN0cmluZywgaW50ICpyZXN1bHQpCnsKICAgIGNvbnN0IEZjQ29uc3RhbnQJKmM7CgogICAgaWYgKChjID0gRmNOYW1lR2V0Q29uc3RhbnQoc3RyaW5nKSkpCiAgICB7CgkqcmVzdWx0ID0gYy0+dmFsdWU7CglyZXR1cm4gRmNUcnVlOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCkZjQm9vbApGY05hbWVCb29sIChGY0NoYXI4ICp2LCBGY0Jvb2wgKnJlc3VsdCkKewogICAgY2hhciAgICBjMCwgYzE7CgogICAgYzAgPSAqdjsKICAgIGlmIChpc3VwcGVyIChjMCkpCgljMCA9IHRvbG93ZXIgKGMwKTsKICAgIGlmIChjMCA9PSAndCcgfHwgYzAgPT0gJ3knIHx8IGMwID09ICcxJykKICAgIHsKCSpyZXN1bHQgPSBGY1RydWU7CglyZXR1cm4gRmNUcnVlOwogICAgfQogICAgaWYgKGMwID09ICdmJyB8fCBjMCA9PSAnbicgfHwgYzAgPT0gJzAnKQogICAgewoJKnJlc3VsdCA9IEZjRmFsc2U7CglyZXR1cm4gRmNUcnVlOwogICAgfQogICAgaWYgKGMwID09ICdvJykKICAgIHsKCWMxID0gdlsxXTsKCWlmIChpc3VwcGVyIChjMSkpCgkgICAgYzEgPSB0b2xvd2VyIChjMSk7CglpZiAoYzEgPT0gJ24nKQoJewoJICAgICpyZXN1bHQgPSBGY1RydWU7CgkgICAgcmV0dXJuIEZjVHJ1ZTsKCX0KCWlmIChjMSA9PSAnZicpCgl7CgkgICAgKnJlc3VsdCA9IEZjRmFsc2U7CgkgICAgcmV0dXJuIEZjVHJ1ZTsKCX0KICAgIH0KICAgIHJldHVybiBGY0ZhbHNlOwp9CgpzdGF0aWMgRmNWYWx1ZQpGY05hbWVDb252ZXJ0IChGY1R5cGUgdHlwZSwgRmNDaGFyOCAqc3RyaW5nLCBGY01hdHJpeCAqbSkKewogICAgRmNWYWx1ZQl2OwoKICAgIHYudHlwZSA9IHR5cGU7CiAgICBzd2l0Y2ggKHYudHlwZSkgewogICAgY2FzZSBGY1R5cGVJbnRlZ2VyOgoJaWYgKCFGY05hbWVDb25zdGFudCAoc3RyaW5nLCAmdi51LmkpKQoJICAgIHYudS5pID0gYXRvaSAoKGNoYXIgKikgc3RyaW5nKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVTdHJpbmc6Cgl2LnUucyA9IHN0cmluZzsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVCb29sOgoJaWYgKCFGY05hbWVCb29sIChzdHJpbmcsICZ2LnUuYikpCgkgICAgdi51LmIgPSBGY0ZhbHNlOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZURvdWJsZToKCXYudS5kID0gc3RydG9kICgoY2hhciAqKSBzdHJpbmcsIDApOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZU1hdHJpeDoKCXYudS5tID0gbTsKCXNzY2FuZiAoKGNoYXIgKikgc3RyaW5nLCAiJWxnICVsZyAlbGcgJWxnIiwgJm0tPnh4LCAmbS0+eHksICZtLT55eCwgJm0tPnl5KTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVDaGFyU2V0OgoJdi51LmMgPSBGY05hbWVQYXJzZUNoYXJTZXQgKHN0cmluZyk7CglicmVhazsKICAgIGRlZmF1bHQ6CglicmVhazsKICAgIH0KICAgIHJldHVybiB2Owp9CgpzdGF0aWMgY29uc3QgRmNDaGFyOCAqCkZjTmFtZUZpbmROZXh0IChjb25zdCBGY0NoYXI4ICpjdXIsIGNvbnN0IGNoYXIgKmRlbGltLCBGY0NoYXI4ICpzYXZlLCBGY0NoYXI4ICpsYXN0KQp7CiAgICBGY0NoYXI4ICAgIGM7CiAgICAKICAgIHdoaWxlICgoYyA9ICpjdXIpKQogICAgewoJaWYgKGMgPT0gJ1xcJykKCXsKCSAgICArK2N1cjsKCSAgICBpZiAoIShjID0gKmN1cikpCgkJYnJlYWs7Cgl9CgllbHNlIGlmIChzdHJjaHIgKGRlbGltLCBjKSkKCSAgICBicmVhazsKCSsrY3VyOwoJKnNhdmUrKyA9IGM7CiAgICB9CiAgICAqc2F2ZSA9IDA7CiAgICAqbGFzdCA9ICpjdXI7CiAgICBpZiAoKmN1cikKCWN1cisrOwogICAgcmV0dXJuIGN1cjsKfQoKRmNQYXR0ZXJuICoKRmNOYW1lUGFyc2UgKGNvbnN0IEZjQ2hhcjggKm5hbWUpCnsKICAgIEZjQ2hhcjgJCSpzYXZlOwogICAgRmNQYXR0ZXJuCQkqcGF0OwogICAgZG91YmxlCQlkOwogICAgRmNDaGFyOAkJKmU7CiAgICBGY0NoYXI4CQlkZWxpbTsKICAgIEZjVmFsdWUJCXY7CiAgICBGY01hdHJpeAkJbTsKICAgIGNvbnN0IEZjT2JqZWN0VHlwZQkqdDsKICAgIGNvbnN0IEZjQ29uc3RhbnQJKmM7CgogICAgc2F2ZSA9IG1hbGxvYyAoc3RybGVuICgoY2hhciAqKSBuYW1lKSArIDEpOwogICAgaWYgKCFzYXZlKQoJZ290byBiYWlsMDsKICAgIHBhdCA9IEZjUGF0dGVybkNyZWF0ZSAoKTsKICAgIGlmICghcGF0KQoJZ290byBiYWlsMTsKCiAgICBmb3IgKDs7KQogICAgewoJbmFtZSA9IEZjTmFtZUZpbmROZXh0IChuYW1lLCAiLSw6Iiwgc2F2ZSwgJmRlbGltKTsKCWlmIChzYXZlWzBdKQoJewoJICAgIGlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX0ZBTUlMWSwgc2F2ZSkpCgkJZ290byBiYWlsMjsKCX0KCWlmIChkZWxpbSAhPSAnLCcpCgkgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoZGVsaW0gPT0gJy0nKQogICAgewoJZm9yICg7OykKCXsKCSAgICBuYW1lID0gRmNOYW1lRmluZE5leHQgKG5hbWUsICItLDoiLCBzYXZlLCAmZGVsaW0pOwoJICAgIGQgPSBzdHJ0b2QgKChjaGFyICopIHNhdmUsIChjaGFyICoqKSAmZSk7CgkgICAgaWYgKGUgIT0gc2F2ZSkKCSAgICB7CgkJaWYgKCFGY1BhdHRlcm5BZGREb3VibGUgKHBhdCwgRkNfU0laRSwgZCkpCgkJICAgIGdvdG8gYmFpbDI7CgkgICAgfQoJICAgIGlmIChkZWxpbSAhPSAnLCcpCgkJYnJlYWs7Cgl9CiAgICB9CiAgICB3aGlsZSAoZGVsaW0gPT0gJzonKQogICAgewoJbmFtZSA9IEZjTmFtZUZpbmROZXh0IChuYW1lLCAiPV86Iiwgc2F2ZSwgJmRlbGltKTsKCWlmIChzYXZlWzBdKQoJewoJICAgIGlmIChkZWxpbSA9PSAnPScgfHwgZGVsaW0gPT0gJ18nKQoJICAgIHsKCQl0ID0gRmNOYW1lR2V0T2JqZWN0VHlwZSAoKGNoYXIgKikgc2F2ZSk7CgkJZm9yICg7OykKCQl7CgkJICAgIG5hbWUgPSBGY05hbWVGaW5kTmV4dCAobmFtZSwgIjosIiwgc2F2ZSwgJmRlbGltKTsKCQkgICAgaWYgKHQpCgkJICAgIHsKCQkJdiA9IEZjTmFtZUNvbnZlcnQgKHQtPnR5cGUsIHNhdmUsICZtKTsKCQkJaWYgKCFGY1BhdHRlcm5BZGQgKHBhdCwgdC0+b2JqZWN0LCB2LCBGY1RydWUpKQoJCQl7CgkJCSAgICBpZiAodi50eXBlID09IEZjVHlwZUNoYXJTZXQpCgkJCQlGY0NoYXJTZXREZXN0cm95ICgoRmNDaGFyU2V0ICopIHYudS5jKTsKCQkJICAgIGdvdG8gYmFpbDI7CgkJCX0KCQkJaWYgKHYudHlwZSA9PSBGY1R5cGVDaGFyU2V0KQoJCQkgICAgRmNDaGFyU2V0RGVzdHJveSAoKEZjQ2hhclNldCAqKSB2LnUuYyk7CgkJICAgIH0KCQkgICAgaWYgKGRlbGltICE9ICcsJykKCQkJYnJlYWs7CgkJfQoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWlmICgoYyA9IEZjTmFtZUdldENvbnN0YW50IChzYXZlKSkpCgkJewoJCSAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgYy0+b2JqZWN0LCBjLT52YWx1ZSkpCgkJCWdvdG8gYmFpbDI7CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICBmcmVlIChzYXZlKTsKICAgIHJldHVybiBwYXQ7CgpiYWlsMjoKICAgIEZjUGF0dGVybkRlc3Ryb3kgKHBhdCk7CmJhaWwxOgogICAgZnJlZSAoc2F2ZSk7CmJhaWwwOgogICAgcmV0dXJuIDA7Cn0Kc3RhdGljIEZjQm9vbApGY05hbWVVbnBhcnNlU3RyaW5nIChGY1N0ckJ1ZgkgICAgKmJ1ZiwgCgkJICAgICBjb25zdCBGY0NoYXI4ICAqc3RyaW5nLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKmVzY2FwZSkKewogICAgRmNDaGFyOCBjOwogICAgd2hpbGUgKChjID0gKnN0cmluZysrKSkKICAgIHsKCWlmIChlc2NhcGUgJiYgc3RyY2hyICgoY2hhciAqKSBlc2NhcGUsIChjaGFyKSBjKSkKCXsKCSAgICBpZiAoIUZjU3RyQnVmQ2hhciAoYnVmLCBlc2NhcGVbMF0pKQoJCXJldHVybiBGY0ZhbHNlOwoJfQoJaWYgKCFGY1N0ckJ1ZkNoYXIgKGJ1ZiwgYykpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjTmFtZVVucGFyc2VWYWx1ZSAoRmNTdHJCdWYJKmJ1ZiwKCQkgICAgRmNWYWx1ZQl2LAoJCSAgICBGY0NoYXI4CSplc2NhcGUpCnsKICAgIEZjQ2hhcjgJdGVtcFsxMDI0XTsKICAgIAogICAgc3dpdGNoICh2LnR5cGUpIHsKICAgIGNhc2UgRmNUeXBlVm9pZDoKCXJldHVybiBGY1RydWU7CiAgICBjYXNlIEZjVHlwZUludGVnZXI6CglzcHJpbnRmICgoY2hhciAqKSB0ZW1wLCAiJWQiLCB2LnUuaSk7CglyZXR1cm4gRmNOYW1lVW5wYXJzZVN0cmluZyAoYnVmLCB0ZW1wLCAwKTsKICAgIGNhc2UgRmNUeXBlRG91YmxlOgoJc3ByaW50ZiAoKGNoYXIgKikgdGVtcCwgIiVnIiwgdi51LmQpOwoJcmV0dXJuIEZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1ZiwgdGVtcCwgMCk7CiAgICBjYXNlIEZjVHlwZVN0cmluZzoKCXJldHVybiBGY05hbWVVbnBhcnNlU3RyaW5nIChidWYsIHYudS5zLCBlc2NhcGUpOwogICAgY2FzZSBGY1R5cGVCb29sOgoJcmV0dXJuIEZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1Ziwgdi51LmIgPyAoRmNDaGFyOCAqKSAiVHJ1ZSIgOiAoRmNDaGFyOCAqKSAiRmFsc2UiLCAwKTsKICAgIGNhc2UgRmNUeXBlTWF0cml4OgoJc3ByaW50ZiAoKGNoYXIgKikgdGVtcCwgIiVnICVnICVnICVnIiwgCgkJIHYudS5tLT54eCwgdi51Lm0tPnh5LCB2LnUubS0+eXgsIHYudS5tLT55eSk7CglyZXR1cm4gRmNOYW1lVW5wYXJzZVN0cmluZyAoYnVmLCB0ZW1wLCAwKTsKICAgIGNhc2UgRmNUeXBlQ2hhclNldDoKCXJldHVybiBGY05hbWVVbnBhcnNlQ2hhclNldCAoYnVmLCB2LnUuYyk7CiAgICBjYXNlIEZjVHlwZUZURmFjZToKCXJldHVybiBGY1RydWU7CiAgICBjYXNlIEZjVHlwZVBhdHRlcm46CglyZXR1cm4gRmNUcnVlOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNOYW1lVW5wYXJzZVZhbHVlTGlzdCAoRmNTdHJCdWYJKmJ1ZiwKCQkJRmNWYWx1ZUxpc3QJKnYsCgkJCUZjQ2hhcjgJCSplc2NhcGUpCnsKICAgIHdoaWxlICh2KQogICAgewoJaWYgKCFGY05hbWVVbnBhcnNlVmFsdWUgKGJ1Ziwgdi0+dmFsdWUsIGVzY2FwZSkpCgkgICAgcmV0dXJuIEZjRmFsc2U7CglpZiAoKHYgPSB2LT5uZXh0KSkKCSAgICBpZiAoIUZjTmFtZVVucGFyc2VTdHJpbmcgKGJ1ZiwgKEZjQ2hhcjggKikgIiwiLCAwKSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCiNkZWZpbmUgRkNfRVNDQVBFX0ZJWEVEICAgICJcXC06LCIKI2RlZmluZSBGQ19FU0NBUEVfVkFSSUFCTEUgIlxcPV86LCIKCkZjQ2hhcjggKgpGY05hbWVVbnBhcnNlIChGY1BhdHRlcm4gKnBhdCkKewogICAgRmNTdHJCdWYJCSAgICBidWY7CiAgICBGY0NoYXI4CQkgICAgYnVmX3N0YXRpY1s4MTkyXTsKICAgIGludAkJCSAgICBpOwogICAgRmNQYXR0ZXJuRWx0CSAgICAqZTsKICAgIGNvbnN0IEZjT2JqZWN0VHlwZUxpc3QgICpsOwogICAgY29uc3QgRmNPYmplY3RUeXBlCSAgICAqbzsKCiAgICBGY1N0ckJ1ZkluaXQgKCZidWYsIGJ1Zl9zdGF0aWMsIHNpemVvZiAoYnVmX3N0YXRpYykpOwogICAgZSA9IEZjUGF0dGVybkZpbmRFbHQgKHBhdCwgRkNfRkFNSUxZKTsKICAgIGlmIChlKQogICAgewoJaWYgKCFGY05hbWVVbnBhcnNlVmFsdWVMaXN0ICgmYnVmLCBlLT52YWx1ZXMsIChGY0NoYXI4ICopIEZDX0VTQ0FQRV9GSVhFRCkpCgkgICAgZ290byBiYWlsMDsKICAgIH0KICAgIGUgPSBGY1BhdHRlcm5GaW5kRWx0IChwYXQsIEZDX1NJWkUpOwogICAgaWYgKGUpCiAgICB7CglpZiAoIUZjTmFtZVVucGFyc2VTdHJpbmcgKCZidWYsIChGY0NoYXI4ICopICItIiwgMCkpCgkgICAgZ290byBiYWlsMDsKCWlmICghRmNOYW1lVW5wYXJzZVZhbHVlTGlzdCAoJmJ1ZiwgZS0+dmFsdWVzLCAoRmNDaGFyOCAqKSBGQ19FU0NBUEVfRklYRUQpKQoJICAgIGdvdG8gYmFpbDA7CiAgICB9CiAgICBmb3IgKGwgPSBfRmNPYmplY3RUeXBlczsgbDsgbCA9IGwtPm5leHQpCiAgICB7Cglmb3IgKGkgPSAwOyBpIDwgbC0+bnR5cGVzOyBpKyspCgl7CgkgICAgbyA9ICZsLT50eXBlc1tpXTsKCSAgICBpZiAoIXN0cmNtcCAoby0+b2JqZWN0LCBGQ19GQU1JTFkpIHx8IAoJCSFzdHJjbXAgKG8tPm9iamVjdCwgRkNfU0laRSkgfHwKCQkhc3RyY21wIChvLT5vYmplY3QsIEZDX0ZJTEUpKQoJCWNvbnRpbnVlOwoJICAgIAoJICAgIGUgPSBGY1BhdHRlcm5GaW5kRWx0IChwYXQsIG8tPm9iamVjdCk7CgkgICAgaWYgKGUpCgkgICAgewoJCWlmICghRmNOYW1lVW5wYXJzZVN0cmluZyAoJmJ1ZiwgKEZjQ2hhcjggKikgIjoiLCAwKSkKCQkgICAgZ290byBiYWlsMDsKCQlpZiAoIUZjTmFtZVVucGFyc2VTdHJpbmcgKCZidWYsIChGY0NoYXI4ICopIG8tPm9iamVjdCwgKEZjQ2hhcjggKikgRkNfRVNDQVBFX1ZBUklBQkxFKSkKCQkgICAgZ290byBiYWlsMDsKCQlpZiAoIUZjTmFtZVVucGFyc2VTdHJpbmcgKCZidWYsIChGY0NoYXI4ICopICI9IiwgMCkpCgkJICAgIGdvdG8gYmFpbDA7CgkJaWYgKCFGY05hbWVVbnBhcnNlVmFsdWVMaXN0ICgmYnVmLCBlLT52YWx1ZXMsIAoJCQkJCSAgICAgKEZjQ2hhcjggKikgRkNfRVNDQVBFX1ZBUklBQkxFKSkKCQkgICAgZ290byBiYWlsMDsKCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gRmNTdHJCdWZEb25lICgmYnVmKTsKYmFpbDA6CiAgICBGY1N0ckJ1ZkRlc3Ryb3kgKCZidWYpOwogICAgcmV0dXJuIDA7Cn0K