LyogRGlyZWN0M0QgTWF0ZXJpYWwKICogQ29weXJpZ2h0IChjKSAyMDAyIExpb25lbCBVTE1FUgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIETWU0lOR0VSCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgRGlyZWN0M0RNYXRlcmlhbC4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CgpzdGF0aWMgdm9pZCBkdW1wX21hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMICptYXQpCnsKICAgIERQUklOVEYoIiAgZHdTaXplIDogJWRcbiIsIG1hdC0+ZHdTaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIE1ldGhvZHMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDM6OlF1ZXJ5SW50ZXJmYWNlCiAqCiAqIFF1ZXJ5SW50ZXJmYWNlIGZvciBJRGlyZWN0M0RNYXRlcmlhbC4gQ2FuIHF1ZXJ5IGFsbCBJRGlyZWN0M0RNYXRlcmlhbAogKiB2ZXJzaW9ucy4KICoKICogUGFyYW1zOgogKiAgcmlpZDogSW50ZXJmYWNlIGlkIHF1ZXJpZWQgZm9yCiAqICBvYmo6IEFkZHJlc3MgdG8gcGFzcyB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYmFjawogKgogKiBSZXR1cm5zOgogKiAgU19PSyBvbiBzdWNjZXNzCiAqICBFX05PSU5URVJGQUNFIGlmIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlIHdhc24ndCBmb3VuZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKCiAgICAqb2JwID0gTlVMTDsKCiAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCAgcmlpZCApICkgewogICAgICAgIElEaXJlY3QzRE1hdGVyaWFsX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbCkpOwoJKm9icCA9IGlmYWNlOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSVVua25vd24gaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9icCk7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNETWF0ZXJpYWwsIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbF9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwpKTsKICAgICAgICAqb2JwID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwpOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNETWF0ZXJpYWwgaW50ZXJmYWNlICVwXG4iLCAqb2JwKTsKCXJldHVybiBTX09LOwogICAgfQogICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RNYXRlcmlhbDIsIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbF9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwpKTsKICAgICAgICAqb2JwID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwyKTsKCVRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRE1hdGVyaWFsMiBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRE1hdGVyaWFsMywgcmlpZCApICkgewogICAgICAgIElEaXJlY3QzRE1hdGVyaWFsX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbCkpOwogICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbDMpOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZSAlcFxuIiwgKm9icCk7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIEZJWE1FKCIoJXApOiBpbnRlcmZhY2UgZm9yIElJRCAlcyBOT1QgZm91bmQhXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpBZGRSZWYKICoKICogSW5jcmVhc2VzIHRoZSByZWZjb3VudC4KICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9BZGRSZWYoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwoKICAgIFRSQUNFKCIoJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIHJlZiAtIDEpOwoKICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDM6OlJlbGVhc2UKICoKICogUmVkdWNlcyB0aGUgcmVmY291bnQgYnkgb25lLiBJZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMCwgdGhlIG9iamVjdAogKiBpcyBkZXN0cm95ZWQKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9SZWxlYXNlKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgKyAxKTsKCiAgICBpZiAoIXJlZikKICAgIHsKICAgICAgICBpZihUaGlzLT5IYW5kbGUpCiAgICAgICAgewogICAgICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgICAgICBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW1RoaXMtPkhhbmRsZSAtIDFdLnB0ciA9IE5VTEw7CiAgICAgICAgICAgIFRoaXMtPmRkcmF3LT5kM2RkZXZpY2UtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0udHlwZSA9IEREcmF3SGFuZGxlX1Vua25vd247CiAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgfQoKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbCBNZXRob2RzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDo6SW5pdGlhbGl6ZQogKgogKiBBIG5vLW9wIGluaXRpYWxpemF0aW9uCiAqCiAqIFBhcmFtczoKICogIERpcmVjdDNEOiBQb2ludGVyIHRvIGEgRGlyZWN0M0QgaW50ZXJmYWNlCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX0luaXRpYWxpemUoSURpcmVjdDNETWF0ZXJpYWwgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEICpEaXJlY3QzRCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgaWZhY2UpOwoKICAgIFRSQUNFKCIoJXApLT4oJXApIG5vLW9wLi4uIVxuIiwgVGhpcywgRGlyZWN0M0QpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDo6UmVzZXJ2ZQogKgogKiBEaXJlY3RYIDUgc2RrOiAiVGhlIElEaXJlY3QzRE1hdGVyaWFsMjo6UmVzZXJ2ZSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIgogKiBPZGQuIFRoZXkgc2VlbSB0byBoYXZlIG1peGVkIHRoZWlyIGludGVyZmFjZXMuCiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfUmVzZXJ2ZShJRGlyZWN0M0RNYXRlcmlhbCAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSBub3QgaW1wbGVtZW50ZWRcbiIsIFRoaXMpOwoKICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsOjpVbnJlc2VydmUKICoKICogTm90IHN1cHBvcnRlZCB0b28KICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVECiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9VbnJlc2VydmUoSURpcmVjdDNETWF0ZXJpYWwgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCkgbm90IGltcGxlbWVudGVkLlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpTZXRNYXRlcmlhbAogKgogKiBTZXRzIHRoZSBtYXRlcmlhbCBkZXNjcmlwdGlvbgogKgogKiBQYXJhbXM6CiAqICBNYXQ6IE1hdGVyaWFsIHRvIHNldAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgTWF0IGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX1NldE1hdGVyaWFsKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRFUklBTCAqbHBNYXQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBNYXQpOwogICAgaWYgKFRSQUNFX09OKGQzZDcpKQogICAgICAgIGR1bXBfbWF0ZXJpYWwobHBNYXQpOwoKICAgIC8qIFN0b3JlcyB0aGUgbWF0ZXJpYWwgKi8KICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBtZW1zZXQoJlRoaXMtPm1hdCwgMCwgc2l6ZW9mKFRoaXMtPm1hdCkpOwogICAgbWVtY3B5KCZUaGlzLT5tYXQsIGxwTWF0LCBscE1hdC0+ZHdTaXplKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpHZXRNYXRlcmlhbAogKgogKiBSZXR1cm5zIHRoZSBtYXRlcmlhbCBhc3NpZ25lZCB0byB0aGlzIGludGVyZmFjZQogKgogKiBQYXJhbXM6CiAqICBNYXQ6IFBvaW50ZXIgdG8gYSBEM0RNQVRFUklBTCBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIG1hdGVyaWFsIGRlc2NyaXB0aW9uCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXQgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0TWF0ZXJpYWwoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVEVSSUFMICpscE1hdCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgIERXT1JEIGR3U2l6ZTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscE1hdCk7CiAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKICAgICAgICBUUkFDRSgiICBSZXR1cm5pbmcgbWF0ZXJpYWwgOiAiKTsKICAgICAgICBkdW1wX21hdGVyaWFsKCZUaGlzLT5tYXQpOwogICAgfQoKICAgIC8qIENvcGllcyB0aGUgbWF0ZXJpYWwgc3RydWN0dXJlICovCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgZHdTaXplID0gbHBNYXQtPmR3U2l6ZTsKICAgIG1lbXNldChscE1hdCwgMCwgZHdTaXplKTsKICAgIG1lbWNweShscE1hdCwgJlRoaXMtPm1hdCwgZHdTaXplKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpHZXRIYW5kbGUKICoKICogUmV0dXJucyBhIGhhbmRsZSBmb3IgdGhlIG1hdGVyaWFsIGludGVyZmFjZS4gVGhlIGhhbmRsZSBpcyBzaW1wbHkgYQogKiBwb2ludGVyIHRvIHRoZSBtYXRlcmlhbCBpbXBsZW1lbnRhdGlvbgogKgogKiBQYXJhbXM6CiAqICBEaXJlY3QzRERldmljZTM6IFRoZSBkZXZpY2UgdGhpcyBoYW5kbGUgaXMgYXNzaWduZWQgdG8KICogIEhhbmRsZTogQWRkcmVzcyB0byB3cml0ZSB0aGUgaGFuZGxlIHRvCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBIYW5kbGUgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0SGFuZGxlKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlMyAqbHBEaXJlY3QzRERldmljZTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUxIQU5ETEUgKmxwSGFuZGxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAqZGV2aWNlID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgbHBEaXJlY3QzRERldmljZTMpOwogICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcClcbiIsIFRoaXMsIGlmYWNlLCBkZXZpY2UsIGxwSGFuZGxlKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgVGhpcy0+YWN0aXZlX2RldmljZSA9IGRldmljZTsKICAgIGlmKCFUaGlzLT5IYW5kbGUpCiAgICB7CiAgICAgICAgVGhpcy0+SGFuZGxlID0gSURpcmVjdDNERGV2aWNlSW1wbF9DcmVhdGVIYW5kbGUoZGV2aWNlKTsKICAgICAgICBpZighVGhpcy0+SGFuZGxlKQogICAgICAgIHsKICAgICAgICAgICAgRVJSKCJFcnJvciBjcmVhdGluZyBhIGhhbmRsZVxuIik7CiAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOyAgIC8qIFVuY2hlY2tlZCAqLwogICAgICAgIH0KICAgICAgICBkZXZpY2UtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0ucHRyID0gVGhpczsKICAgICAgICBkZXZpY2UtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0udHlwZSA9IEREcmF3SGFuZGxlX01hdGVyaWFsOwogICAgfQogICAgKmxwSGFuZGxlID0gVGhpcy0+SGFuZGxlOwogICAgVFJBQ0UoIiByZXR1cm5pbmcgaGFuZGxlICUwOHguXG4iLCAqbHBIYW5kbGUpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfR2V0SGFuZGxlKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UsCgkJCQkJTFBESVJFQ1QzRERFVklDRTIgbHBEaXJlY3QzRERldmljZTIsCgkJCQkJTFBEM0RNQVRFUklBTEhBTkRMRSBscEhhbmRsZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRGlyZWN0M0REZXZpY2UyLCBscEhhbmRsZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0dldEhhbmRsZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAoJCQkJCUNPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UzLCBscERpcmVjdDNERGV2aWNlMiksCgkJCQkJbHBIYW5kbGUpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0SGFuZGxlKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSwKCQkJCQlMUERJUkVDVDNEREVWSUNFIGxwRGlyZWN0M0REZXZpY2UsCgkJCQkJTFBEM0RNQVRFUklBTEhBTkRMRSBscEhhbmRsZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRGlyZWN0M0REZXZpY2UsIGxwSGFuZGxlKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfR2V0SGFuZGxlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKCQkJCQlDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBJRGlyZWN0M0REZXZpY2UzLCBscERpcmVjdDNERGV2aWNlKSwKCQkJCQlscEhhbmRsZSk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9RdWVyeUludGVyZmFjZShMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnApOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9icCk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfQWRkUmVmKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9BZGRSZWYoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9SZWxlYXNlKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1JlbGVhc2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUmVsZWFzZShMUERJUkVDVDNETUFURVJJQUwgaWZhY2UpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1JlbGVhc2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1NldE1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFURVJJQUwgbHBNYXQpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscE1hdCk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1NldE1hdGVyaWFsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWF0KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1NldE1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfU2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE1hdCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVEVSSUFMIGxwTWF0KQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19HZXRNYXRlcmlhbChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE1hdCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9HZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFURVJJQUwgbHBNYXQpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscE1hdCk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0dldE1hdGVyaWFsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBNYXQpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG1hdGVyaWFsX2FjdGl2YXRlCiAqCiAqIFVzZXMgSURpcmVjdDNERGV2aWNlNzo6U2V0TWF0ZXJpYWwgdG8gYWN0aXZhdGUgdGhlIG1hdGVyaWFsCiAqCiAqIFBhcmFtczoKICogIFRoaXM6IFBvaW50ZXIgdG8gdGhlIG1hdGVyaWFsIGltcGxlbWVudGF0aW9uIHRvIGFjdGl2YXRlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBtYXRlcmlhbF9hY3RpdmF0ZShJRGlyZWN0M0RNYXRlcmlhbEltcGwqIFRoaXMpCnsKICAgIEQzRE1BVEVSSUFMNyBkM2Q3bWF0OwoKICAgIFRSQUNFKCJBY3RpdmF0aW5nIG1hdGVyaWFsICVwXG4iLCBUaGlzKTsKICAgIGQzZDdtYXQudS5kaWZmdXNlID0gVGhpcy0+bWF0LnUuZGlmZnVzZTsKICAgIGQzZDdtYXQudTEuYW1iaWVudCA9IFRoaXMtPm1hdC51MS5hbWJpZW50OwogICAgZDNkN21hdC51Mi5zcGVjdWxhciA9IFRoaXMtPm1hdC51Mi5zcGVjdWxhcjsKICAgIGQzZDdtYXQudTMuZW1pc3NpdmUgPSBUaGlzLT5tYXQudTMuZW1pc3NpdmU7CiAgICBkM2Q3bWF0LnU0LnBvd2VyID0gVGhpcy0+bWF0LnU0LnBvd2VyOwoKICAgIElEaXJlY3QzRERldmljZTdfU2V0TWF0ZXJpYWwoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+YWN0aXZlX2RldmljZSwgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkM2Q3bWF0KTsKfQoKY29uc3QgSURpcmVjdDNETWF0ZXJpYWwzVnRibCBJRGlyZWN0M0RNYXRlcmlhbDNfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfQWRkUmVmLAogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRE1hdGVyaWFsMyBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9TZXRNYXRlcmlhbCwKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9HZXRNYXRlcmlhbCwKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9HZXRIYW5kbGUsCn07Cgpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDJWdGJsIElEaXJlY3QzRE1hdGVyaWFsMl9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNETWF0ZXJpYWwyIE1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfU2V0TWF0ZXJpYWwsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRNYXRlcmlhbCwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX0dldEhhbmRsZSwKfTsKCmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsVnRibCBJRGlyZWN0M0RNYXRlcmlhbF9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNETWF0ZXJpYWwxIE1ldGhvZHMgKioqLwogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX0luaXRpYWxpemUsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9TZXRNYXRlcmlhbCwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0dldE1hdGVyaWFsLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0SGFuZGxlLAogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1Jlc2VydmUsCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfVW5yZXNlcnZlCn07Cg==