LyoKICogQ29weXJpZ2h0IChDKSAyMDAzIE1pY2hhZWwgR/xubmV3aWcKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2RlZmluZSBDT01fTk9fV0lORE9XU19ICiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJvYmpiYXNlLmgiCiNpbmNsdWRlICJtZWRpYW9iai5oIgojaW5jbHVkZSAiZG1vcnQuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChtc2Rtbyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1vQ3JlYXRlTWVkaWFUeXBlCShNU0RNTy5AKQogKi8KSFJFU1VMVCBXSU5BUEkgTW9DcmVhdGVNZWRpYVR5cGUoRE1PX01FRElBX1RZUEUqKiBwcG1lZGlhLCBEV09SRCBjYkZvcm1hdCkKewogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJWx1KVxuIiwgcHBtZWRpYSwgY2JGb3JtYXQpOwoKICBpZiAocHBtZWRpYSA9PSBOVUxMKQogICAgcmV0dXJuIEVfUE9JTlRFUjsKCiAgKnBwbWVkaWEgPSBDb1Rhc2tNZW1BbGxvYyhzaXplb2YoRE1PX01FRElBX1RZUEUpKTsKICBpZiAoKnBwbWVkaWEgPT0gTlVMTCkKICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKICBociA9IE1vSW5pdE1lZGlhVHlwZSgqcHBtZWRpYSwgY2JGb3JtYXQpOwogIGlmIChGQUlMRUQoaHIpKSB7CiAgICBDb1Rhc2tNZW1GcmVlKCpwcG1lZGlhKTsKICAgICpwcG1lZGlhID0gTlVMTDsKICB9CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNb0luaXRNZWRpYVR5cGUJCShNU0RNTy5AKQogKi8KSFJFU1VMVCBXSU5BUEkgTW9Jbml0TWVkaWFUeXBlKERNT19NRURJQV9UWVBFKiBwbWVkaWEsIERXT1JEIGNiRm9ybWF0KQp7CiAgVFJBQ0UoIiglcCwlbHUpXG4iLCBwbWVkaWEsY2JGb3JtYXQpOwoKICBpZiAocG1lZGlhID09IE5VTEwpCiAgICByZXR1cm4gRV9QT0lOVEVSOwoKICBtZW1zZXQocG1lZGlhLCAwLCBzaXplb2YoRE1PX01FRElBX1RZUEUpKTsKCiAgaWYgKGNiRm9ybWF0ID4gMCkgewogICAgcG1lZGlhLT5wYkZvcm1hdCA9IENvVGFza01lbUFsbG9jKGNiRm9ybWF0KTsKICAgIGlmIChwbWVkaWEtPnBiRm9ybWF0ID09IE5VTEwpCiAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKICAgIHBtZWRpYS0+Y2JGb3JtYXQgPSBjYkZvcm1hdDsKICB9CgogIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1vRGVsZXRlTWVkaWFUeXBlCShNU0RNTy5AKQogKi8KSFJFU1VMVCBXSU5BUEkgTW9EZWxldGVNZWRpYVR5cGUoRE1PX01FRElBX1RZUEUqIHBtZWRpYSkKewogIFRSQUNFKCIoJXApXG4iLCBwbWVkaWEpOwoKICBpZiAocG1lZGlhID09IE5VTEwpCiAgICByZXR1cm4gRV9QT0lOVEVSOwoKICBNb0ZyZWVNZWRpYVR5cGUocG1lZGlhKTsKICBDb1Rhc2tNZW1GcmVlKHBtZWRpYSk7CgogIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1vRnJlZU1lZGlhVHlwZQkJKE1TRE1PLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBNb0ZyZWVNZWRpYVR5cGUoRE1PX01FRElBX1RZUEUqIHBtZWRpYSkKewogIFRSQUNFKCIoJXApXG4iLCBwbWVkaWEpOwoKICBpZiAocG1lZGlhID09IE5VTEwpCiAgICByZXR1cm4gRV9QT0lOVEVSOwoKICBpZiAocG1lZGlhLT5wVW5rICE9IE5VTEwpIHsKICAgIElVbmtub3duX1JlbGVhc2UocG1lZGlhLT5wVW5rKTsKICAgIHBtZWRpYS0+cFVuayA9IE5VTEw7CiAgfQoKICBpZiAocG1lZGlhLT5wYkZvcm1hdCAhPSBOVUxMKSB7CiAgICBDb1Rhc2tNZW1GcmVlKHBtZWRpYS0+cGJGb3JtYXQpOwogICAgcG1lZGlhLT5wYkZvcm1hdCA9IE5VTEw7CiAgfQoKICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNb0R1cGxpY2F0ZU1lZGlhVHlwZQkoTVNETU8uQCkKICovCkhSRVNVTFQgV0lOQVBJIE1vRHVwbGljYXRlTWVkaWFUeXBlKERNT19NRURJQV9UWVBFKiogcHBkc3QsCgkJCQkgICAgY29uc3QgRE1PX01FRElBX1RZUEUqIHBzcmMpCnsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgcHBkc3QsIHBzcmMpOwoKICBpZiAocHBkc3QgPT0gTlVMTCB8fCBwc3JjID09IE5VTEwpCiAgICByZXR1cm4gRV9QT0lOVEVSOwoKICAqcHBkc3QgPSBDb1Rhc2tNZW1BbGxvYyhzaXplb2YoRE1PX01FRElBX1RZUEUpKTsKICBpZiAoKnBwZHN0ID09IE5VTEwpCiAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKCiAgaHIgPSBNb0NvcHlNZWRpYVR5cGUoKnBwZHN0LCBwc3JjKTsKICBpZiAoRkFJTEVEKGhyKSkgewogICAgTW9GcmVlTWVkaWFUeXBlKCpwcGRzdCk7CiAgICAqcHBkc3QgPSBOVUxMOwogIH0KCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1vQ29weU1lZGlhVHlwZQkJKE1TRE1PLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBNb0NvcHlNZWRpYVR5cGUoRE1PX01FRElBX1RZUEUqIHBkc3QsCgkJCSAgICAgICBjb25zdCBETU9fTUVESUFfVFlQRSogcHNyYykKewogIFRSQUNFKCIoJXAsJXApXG4iLCBwZHN0LCBwc3JjKTsKCiAgaWYgKHBkc3QgPT0gTlVMTCB8fCBwc3JjID09IE5VTEwpCiAgICByZXR1cm4gRV9QT0lOVEVSOwoKICBtZW1jcHkoJnBkc3QtPm1ham9ydHlwZSwgICZwc3JjLT5tYWpvcnR5cGUsICBzaXplb2YocHNyYy0+bWFqb3J0eXBlKSk7CiAgbWVtY3B5KCZwZHN0LT5zdWJ0eXBlLCAgICAmcHNyYy0+c3VidHlwZSwgICAgc2l6ZW9mKHBzcmMtPnN1YnR5cGUpKTsKICBtZW1jcHkoJnBkc3QtPmZvcm1hdHR5cGUsICZwc3JjLT5mb3JtYXR0eXBlLCBzaXplb2YocHNyYy0+Zm9ybWF0dHlwZSkpOwoKICBwZHN0LT5iRml4ZWRTaXplU2FtcGxlcyAgICA9IHBzcmMtPmJGaXhlZFNpemVTYW1wbGVzOwogIHBkc3QtPmJUZW1wb3JhbENvbXByZXNzaW9uID0gcHNyYy0+YlRlbXBvcmFsQ29tcHJlc3Npb247CiAgcGRzdC0+bFNhbXBsZVNpemUgICAgICAgICAgPSBwc3JjLT5sU2FtcGxlU2l6ZTsKICBwZHN0LT5jYkZvcm1hdCAgICAgICAgICAgICA9IHBzcmMtPmNiRm9ybWF0OwoKICBpZiAocHNyYy0+cGJGb3JtYXQgIT0gTlVMTCAmJiBwc3JjLT5jYkZvcm1hdCA+IDApIHsKICAgIHBkc3QtPnBiRm9ybWF0ID0gQ29UYXNrTWVtQWxsb2MocHNyYy0+Y2JGb3JtYXQpOwogICAgaWYgKHBkc3QtPnBiRm9ybWF0ID09IE5VTEwpCiAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKICAgIG1lbWNweShwZHN0LT5wYkZvcm1hdCwgcHNyYy0+cGJGb3JtYXQsIHBzcmMtPmNiRm9ybWF0KTsKICB9IGVsc2UKICAgIHBkc3QtPnBiRm9ybWF0ID0gTlVMTDsKCiAgaWYgKHBzcmMtPnBVbmsgIT0gTlVMTCkgewogICAgcGRzdC0+cFVuayA9IHBzcmMtPnBVbms7CiAgICBJVW5rbm93bl9BZGRSZWYocGRzdC0+cFVuayk7CiAgfSBlbHNlCiAgICBwZHN0LT5wVW5rID0gTlVMTDsKCiAgcmV0dXJuIFNfT0s7Cn0K