Ci8qKgogKiBAZmlsZSAgICBJeEF0bWRBY2NDdHJsLmgKICoKICogQGRhdGUgICAgMjAtTWFyLTIwMDIKICoKICogQGJyaWVmIEl4QXRtZEFjYyBQdWJsaWMgQVBJCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcHVibGljIEFQSSBvZiBJeEF0bWRBY2MsIHJlbGF0ZWQgdG8gdGhlCiAqIGNvbnRyb2wgZnVuY3Rpb25zIG9mIHRoZSBjb21wb25lbnQuCiAqCiAqIAogKiBAcGFyCiAqIElYUDQwMCBTVyBSZWxlYXNlIHZlcnNpb24gMi4wCiAqIAogKiAtLSBDb3B5cmlnaHQgTm90aWNlIC0tCiAqIAogKiBAcGFyCiAqIENvcHlyaWdodCAyMDAxLTIwMDUsIEludGVsIENvcnBvcmF0aW9uLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogQHBhcgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKiAKICogQHBhcgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwogKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqIAogKiBAcGFyCiAqIC0tIEVuZCBvZiBDb3B5cmlnaHQgTm90aWNlIC0tCiAqLwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERveHlnZW4gZ3JvdXAgZGVmaW5pdGlvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioKICoKICogQGRlZmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkgSVhQNDAwIEFUTSBEcml2ZXIgQWNjZXNzIChJeEF0bWRBY2MpIENvbnRyb2wgQVBJCiAqCiAqIEBicmllZiBUaGUgcHVibGljIEFQSSBmb3IgdGhlIElYUDQwMCBBdG0gRHJpdmVyIENvbnRyb2wgY29tcG9uZW50CiAqCiAqIEl4QXRtZEFjYyBpcyB0aGUgbG93IGxldmVsIGludGVyZmFjZSBieSB3aGljaCBBQUwgUERVIGdldCB0cmFuc21pdHRlZAogKiB0byxhbmQgcmVjZWl2ZWQgZnJvbSB0aGUgVXRvcGlhIGJ1cwogKgogKiBUaGlzIHBhcnQgaXMgcmVsYXRlZCB0byB0aGUgQ29udHJvbCBjb25maWd1cmF0aW9uCiAqCiAqIEB7CiAqLwoKI2lmbmRlZiBJWEFUTURBQ0NDVFJMX0gKI2RlZmluZSBJWEFUTURBQ0NDVFJMX0gKCiNpbmNsdWRlICJJeEF0bWRBY2MuaCIKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBBdG1kQWNjQ3RybCBEYXRhIFR5cGVzIGRlZmluaXRpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioKKgoqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKKgoqIEBkZWYgSVhfQVRNREFDQ19QT1JUX0RJU0FCTEVfSU5fUFJPR1JFU1MKKgoqIEBicmllZiBQb3J0IGVuYWJsZSByZXR1cm4gY29kZQoqCiogVGhpcyBjb25zdGFudCBpcyB1c2VkIHRvIHRlbGwgSXhBdG1EQWNjIHVzZXIgdGhhdCB0aGUgcG9ydCBkaXNhYmxlCiogZnVuY3Rpb25zIGFyZSBub3QgY29tcGxldGUuIFRoZSB1c2VyIGNhbiBjYWxsIGl4QXRtZEFjY1BvcnREaXNhYmxlQ29tcGxldGUoKQoqIHRvIGZpbmQgb3V0IHdoZW4gdGhlIGRpc2FibGUgaGFzIGZpbmlzaGVkLiBUaGUgcG9ydCBlbmFibGUgY2FuIHRoZW4gcHJvY2VlZC4KKgoqLwojZGVmaW5lIElYX0FUTURBQ0NfUE9SVF9ESVNBQkxFX0lOX1BST0dSRVNTIDUKCi8qKgoqCiogQGluZ3JvdXAgSXhBdG1kQWNjQ3RybEFQSQoqCiogQGRlZiBJWF9BVE1EQUNDX0FMTFBEVVMKKgoqIEBicmllZiBBbGwgUERVcwoqCiogVGhpcyBjb25zdGFudCBpcyB1c2VkIHRvIHRlbGwgSXhBdG1EQWNjIHRvIHByb2Nlc3MgYWxsIFBEVXMgZnJvbQoqIHRoZSBSWCBxdWV1ZSBvciB0aGUgVFggRG9uZQoqCiogQHNhIEl4QXRtZEFjY1J4RGlzcGF0Y2hlcgoqIEBzYSBJeEF0bWRBY2NUeERvbmVEaXNwYXRjaGVyCioKKi8KI2RlZmluZSBJWF9BVE1EQUNDX0FMTFBEVVMgMHhmZmZmZmZmZgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFBhcnQgb2YgdGhlIEl4QXRtZEFjYyBpbnRlcmZhY2UgcmVsYXRlZCB0byBSWCB0cmFmZmljCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqCiAqCiAqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICoKICogQGJyaWVmIENhbGxiYWNrIHByb3RvdHlwZSBmb3Igbm90aWZpY2F0aW9uIG9mIGF2YWlsYWJsZSBQRFVzIGZvcgogKiBhbiBSeCBRLgogKgogKiBUaGlzIGEgcHJvdG95cGUgZm9yIGEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYXQKICogbGVhc3Qgb25lIFBkdSBhdmFpbGFibGUgZm9yIHByb2Nlc3Npbmcgb24gYSBwYXJ0aWN1bGFyIFJ4IFEuCiAqCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNhbGwgQGEgaXhBdG1kQWNjUnhEaXNwYXRjaCgpIHdpdGgKICogdGhlIGFwcnJvcHJpYXRlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRvIHJlYWQgYW5kIHByb2Nlc3MgdGhlIFJ4IFEuCiAqCiAqIEBzYSBpeEF0bWRBY2NSeERpc3BhdGNoCiAqIEBzYSBpeEF0bWRBY2NSeFZjQ29ubmVjdAogKiBAc2EgaXhBdG1kQWNjUnhEaXNwYXRjaGVyUmVnaXN0ZXIKICoKICogQHBhcmFtIHJ4UXVldWVJZCBAcmVmIEl4QXRtUnhRdWV1ZUlkIFtpbl0gaW5kaWNhdGVzIHdoaWNoIFJYIHF1ZXVlIHRvIGhhcyBQZHVzIHRvIHByb2Nlc3MuCiAqIEBwYXJhbSBudW1iZXJPZlBkdXNUb1Byb2Nlc3MgdW5zaWduZWQgaW50IFtpbl0gaW5kaWNhdGVzIHRoZSBtaW5pbXVtIG51bWJlciBvZgogKiAgICAgICAgUERVcyBhdmFpbGFibGUgdG8gcHJvY2VzcyBhbGwgUERVcyBmcm9tIHRoZSBxdWV1ZS4KICogQHBhcmFtIHJlc2VydmVkUHRyIHVuc2lnbmVkIGludCogW291dF0gcG9pbnRlciB0byBhIGludCBsb2NhdGlvbiB3aGljaCBjYW4KICogICAgICAgIGJlIHdyaXR0ZW4gdG8sIGJ1dCBkb2VzIG5vdCByZXRhaW4gd3JpdHRlbiB2YWx1ZXMuIFRoaXMgaXMKICogICAgICAgIHByb3ZpZGVkIHRvIG1ha2UgdGhpcyBwcm90b3R5cGUgY29tcGF0aWJsZQogKiAgICAgICAgd2l0aCBAYSBpeEF0bWRBY2NSeERpc3BhdGNoKCkKICoKICogQHJldHVybiBAbGkgaW50IC0gaWdub3JlZC4KICoKICovCnR5cGVkZWYgSVhfU1RBVFVTICgqSXhBdG1kQWNjUnhEaXNwYXRjaGVyKSAoSXhBdG1SeFF1ZXVlSWQgcnhRdWV1ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bWJlck9mUGR1c1RvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcmVzZXJ2ZWRQdHIpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFBhcnQgb2YgdGhlIEl4QXRtZEFjYyBpbnRlcmZhY2UgcmVsYXRlZCB0byBUWCB0cmFmZmljCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqCiAqCiAqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICoKICogQGJyaWVmIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgdHJhbnNtaXR0ZWQgbWJ1ZiB3aGVuIHRocmVzaG9sZCBsZXZlbCBpcwogKiAgICAgICAgY3Jvc3NlZC4KICoKICogSXhBdG1kQWNjVHhEb25lRGlzcGF0Y2hlciBpcyB0aGUgcHJvdG90eXBlIG9mIHRoZSB1c2VyIGZ1bmN0aW9uCiAqIHdoaWNoIGdldCBjYWxsZWQgd2hlbiBwZHVzIGFyZSBjb21wbGV0ZWx5IHRyYW5zbWl0dGVkLiBUaGlzIGZ1bmN0aW9uCiAqIGlzIGxpa2VseSB0byBjYWxsIHRoZSBAYSBpeEF0bWRBY2NUeERvbmVEaXNwYXRjaCgpIGZ1bmN0aW9uLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHBkdXMgZm9yCiAqIHJlY2VwdGlvbiBpcyBjcm9zc2luZyB0aGUgdGhyZXNob2xkIGxldmVsIGFzIGRlZmluZWQKICogaW4gQGEgaXhBdG1kQWNjVHhEb25lRGlzcGF0Y2hlclJlZ2lzdGVyKCkKICoKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW5zaWRlIGFuIFFtZ3IgZGlzcGF0Y2ggY29udGV4dC4gTm8gc3lzdGVtCiAqIHJlc291cmNlIG9yIGludGVycnVwdC11bnNhZmUgZmVhdHVyZSBzaG91bGQgYmUgdXNlZCBpbnNpZGUgdGhpcwogKiBjYWxsYmFjay4KICoKICogVHJhbnNtaXR0ZWQgYnVmZmVycyByZWN5Y2xpbmcgaW1wbGVtZW50YXRpb24gaXMgYSBzeXRlbS13aWRlIG1lY2hhbmlzbQogKiBhbmQgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgdHJhZmZpYyBpcyBzdGFydGVkLiBJZiB0aGlzIHRocmVzaG9sZAogKiBtZWNoYW5pc20gaXMgbm90IHVzZWQsIHRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBwb2xsaW5nIHRoZQogKiB0cmFuc21pdHRlZCBidWZmZXJzIHdpdGggQGEgaXhBdG1kQWNjVHhEb25lRGlzcGF0Y2goKQogKiBhbmQgQGEgaXhBdG1kQWNjVHhEb25lTGV2ZWxRdWVyeSgpIGZ1bmN0aW9ucy4KICoKICogQHNhIGl4QXRtZEFjY1R4RG9uZURpc3BhdGNoZXJSZWdpc3RlcgogKiBAc2EgaXhBdG1kQWNjVHhEb25lRGlzcGF0Y2gKICogQHNhIGl4QXRtZEFjY1R4RG9uZUxldmVsUXVlcnkKICoKICogQHBhcmFtIG51bWJlck9mUGR1c1RvUHJvY2VzcyB1bnNpZ25lZCBpbnQgW2luXSAtIFRoZSBjdXJyZW50IG51bWJlciBvZiBwZHVzIGN1cnJlbnRseQogKiAgICAgICAgYXZhaWxhYmxlIGZvciByZWN5Y2xpbmcKICogQHBhcmFtICpyZXNlcnZlZFB0ciB1bnNpZ25lZCBpbnQgW291dF0gLSBwb2ludGVyIHRvIGEgaW50IGxvY2F0aW9uIHdoaWNoIGNhbiBiZQogKiAgICAgICAgd3JpdHRlbiB0byBidXQgZG9lcyBub3QgcmV0YWluIHdyaXR0ZW4gdmFsdWVzLiBUaGlzIGlzIHByb3ZpZGVkCiAqICAgICAgICB0byBtYWtlIHRoaXMgcHJvdG90eXBlIGNvbXBhdGlibGUKICogICAgICAgIHdpdGggQGEgaXhBdG1kQWNjVHhEb25lRGlzcGF0Y2goKQogKgogKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIFRoaXMgaXMgcHJvdmlkZWQgdG8gbWFrZQogKiAgICB0aGlzIHByb3RvdHlwZSBjb21wYXRpYmxlIHdpdGggQGEgaXhBdG1kQWNjVHhEb25lRGlzcGF0Y2goKQogKiBAcmV0dXJuIEBsaSBJWF9GQUlMIGludmFsaWQgcGFyYW1ldGVycyBvciBzb21lIHVuc3BlY2lmaWVkIGludGVybmFsCiAqICAgIGVycm9yIG9jY3VyZWQuIFRoaXMgaXMgcHJvdmlkZWQgdG8gbWFrZQogKiAgICB0aGlzIHByb3RvdHlwZSBjb21wYXRpYmxlIHdpdGggQGEgaXhBdG1kQWNjVHhEb25lRGlzcGF0Y2goKQogKgogKi8KdHlwZWRlZiBJWF9TVEFUVVMgKCpJeEF0bWRBY2NUeERvbmVEaXNwYXRjaGVyKSAodW5zaWduZWQgaW50IG51bWJlck9mUGR1c1RvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpyZXNlcnZlZFB0cik7CgovKioKKgoqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKKgoqIEBicmllZiBOb3RpZmljYXRpb24gdGhhdCB0aGUgdGhyZXNob2xkIG51bWJlciBvZiBzY2hlZHVsZWQgY2VsbHMKKiByZW1haW5zIGluIGEgcG9ydCdzIHRyYW5zbWl0IFEuCioKKiBUaGUgaXMgdGhlIHByb3RvdHlwZSBmb3Igb2YgdGhlIHVzZXIgbm90aWZpY2F0aW9uIGZ1bmN0aW9uIHdoaWNoCiogZ2V0cyBjYWxsZWQgb24gYSBwZXItcG9ydCBiYXNpcywgd2hlbiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZwoqIHNjaGVkdWxlZCBjZWxscyB0byBiZSB0cmFuc21pdHRlZCBkZWNyZWFzZXMgdG8gdGhlIHRocmVzaG9sZCBsZXZlbC4KKiBUaGUgbnVtYmVyIG9mIGNlbGxzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBjYW4gYmUgdXNlZCBmb3Igc2NoZWR1bGluZwoqIHB1cnBvc2VzIGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjZWxscyB0aGF0IGNhbiBiZSBwYXNzZWQgaW4gYQoqIHNjaGVkdWxlIHRhYmxlIHRvIHRoZSBAYSBpeEF0bWRBY2NQb3J0VHhQcm9jZXNzKCkgZnVuY3Rpb24uCioKKiBAc2EgaXhBdG1kQWNjUG9ydFR4Q2FsbGJhY2tSZWdpc3RlcgoqIEBzYSBpeEF0bWRBY2NQb3J0VHhQcm9jZXNzCiogQHNhIGl4QXRtZEFjY1BvcnRUeEZyZWVFbnRyaWVzUXVlcnkKKgoqIEBwYXJhbSBwb3J0IEByZWYgSXhBdG1Mb2dpY2FsUG9ydCBbaW5dIC0gbG9naWNhbCBQSFkgcG9ydCBbQGEgSVhfVVRPUElBX1BPUlRfMCAuLiBAYSBJWF9VVE9QSUFfTUFYX1BPUlRTIC0gMV0KKiBAcGFyYW0gbnVtYmVyT2ZBdmFpbGFibGVDZWxscyB1bnNpZ25lZCBpbnQgW2luXSAtIG51bWJlciBvZiBhdmFpbGFibGUKKiAgICAgICAgY2VsbCBlbnRyaWVzLmZvciB0aGUgcG9ydAoqCiogQG5vdGUgLSBUaGlzIGZ1bmN0aW9ucyBzaGFsbCBub3QgdXNlIHN5c3RlbSByZXNvdXJjZXMgd2hlbiB1c2VkCiogICAgICAgICBpbnNpZGUgYW4gaW50ZXJydXB0IGNvbnRleHQuCioKKi8KdHlwZWRlZiB2b2lkICgqSXhBdG1kQWNjUG9ydFR4TG93Q2FsbGJhY2spIChJeEF0bUxvZ2ljYWxQb3J0IHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1iZXJPZkF2YWlsYWJsZUNlbGxzKTsKCi8qKgoqCiogQGluZ3JvdXAgSXhBdG1kQWNjQ3RybEFQSQoqCiogQGJyaWVmICBQcm90b3R5cGUgdG8gc3VibWl0IGNlbGxzIGZvciB0cmFuc21pc3Npb24KKgoqIEl4QXRtZEFjY1R4VmNEZW1hbmRVcGRhdGVDYWxsYmFjayBpcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBjYWxsYmFjawoqIGZ1bmN0aW9uIHVzZWQgYnkgQXRtRCB0byBub3RpZnkgYW4gQVRNIFNjaGVkdWxlciB0aGF0IHRoZSB1c2VyIG9mCiogYSBWQyBoYXMgc3VibWl0dGVkIGNlbGxzIGZvciB0cmFuc21pc3Npb24uCioKKiBAc2EgSXhBdG1kQWNjVHhWY0RlbWFuZFVwZGF0ZUNhbGxiYWNrCiogQHNhIEl4QXRtZEFjY1R4VmNEZW1hbmRDbGVhckNhbGxiYWNrCiogQHNhIEl4QXRtZEFjY1R4U2NoVmNJZEdldENhbGxiYWNrCiogQHNhIGl4QXRtZEFjY1BvcnRUeFNjaGVkdWxlZE1vZGVFbmFibGUKKgoqIEBwYXJhbSBwb3J0IEByZWYgSXhBdG1Mb2dpY2FsUG9ydCBbaW5dIC0gU3BlY2lmaWVzIHRoZSBBVE0gcG9ydCBvbiB3aGljaCB0aGUgVkMgdG8gYmUgdXBkYXRlZAoqICAgICAgICBpcyBlc3RhYmxpc2hlZAoqIEBwYXJhbSB2Y0lkIGludCBbaW5dIC0gSWRlbnRpZmllcyB0aGUgVkMgdG8gYmUgdXBkYXRlZC4gVGhpcyBpcyB0aGUgdmFsdWUKKiAgICAgICAgcmV0dXJuZWQgYnkgdGhlIEBhIEl4QXRtZEFjY1R4U2NoVmNJZEdldENhbGxiYWNrKCkgY2FsbCAuCiogQHBhcmFtIG51bWJlck9mQ2VsbHMgdW5zaWduZWQgaW50IFtpbl0gLSBJbmRpY2F0ZXMgaG93IG1hbnkgQVRNIGNlbGxzIHNob3VsZCBiZSBhZGRlZAoqICAgICAgICB0byB0aGUgcXVldWUgZm9yIHRoaXMgVkMuCioKKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIHRoZSBmdW5jdGlvbiBpcyByZWdpc3RlcmluZyB0aGUgY2VsbCBkZW1hbmQgZm9yCiogICAgICAgIHRoaXMgVkMuCiogQHJldHVybiBAbGkgSVhfRkFJTCB0aGUgZnVuY3Rpb24gY2Fubm90IHJlZ2lzdGVyIGNlbGwgZm9yIHRoaXMgVkMgOiB0aGUKKiAgICAgICAgIHNjaGVkdWxlciBtYXliZSBvdmVybG9hZGVkIG9yIG1pc2NvbmZpZ3VyZWQKKgoqLwp0eXBlZGVmIElYX1NUQVRVUyAoKkl4QXRtZEFjY1R4VmNEZW1hbmRVcGRhdGVDYWxsYmFjaykgKEl4QXRtTG9naWNhbFBvcnQgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZjSWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1iZXJPZkNlbGxzKTsKCi8qKgoqCiogQGluZ3JvdXAgSXhBdG1kQWNjQ3RybEFQSQoqCiogQGJyaWVmICBwcm90b3R5cGUgdG8gIHJlbW92ZSBhbGwgY3VycmVudGx5IHF1ZXVlZCBjZWxscyBmcm9tIGEKKiByZWdpc3RlcmVkIFZDCioKKiBJeEF0bWRBY2NUeFZjRGVtYW5kQ2xlYXJDYWxsYmFjayBpcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBmdW5jdGlvbgoqIHRvIHJlbW92ZSBhbGwgY3VycmVudGx5IHF1ZXVlZCBjZWxscyBmcm9tIGEgcmVnaXN0ZXJlZCBWQy4gVGhlCiogcGVuZGluZyBjZWxsIGNvdW50IGZvciB0aGUgc3BlY2lmaWVkIFZDIGlzIHJlc2V0IHRvIHplcm8uIEFmdGVyIHRoZQoqIHVzZSBvZiB0aGlzIGNhbGxiYWNrLCB0aGUgc2NoZWR1bGVyIHNoYWxsIG5vdCBzY2hlZHVsZSBtb3JlIGNlbGxzCiogZm9yIHRoaXMgVkMuCioKKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgYSBWQyBkaXNjb25uZWN0aW9uCiogQGEgaXhBdG1kQWNjVHhWY1RyeURpc2Nvbm5lY3QoKQoqCiogQHNhIEl4QXRtZEFjY1R4VmNEZW1hbmRVcGRhdGVDYWxsYmFjawoqIEBzYSBJeEF0bWRBY2NUeFZjRGVtYW5kQ2xlYXJDYWxsYmFjawoqIEBzYSBJeEF0bWRBY2NUeFNjaFZjSWRHZXRDYWxsYmFjawoqIEBzYSBpeEF0bWRBY2NQb3J0VHhTY2hlZHVsZWRNb2RlRW5hYmxlCiogQHNhIGl4QXRtZEFjY1R4VmNUcnlEaXNjb25uZWN0CioKKiBAcGFyYW0gcG9ydCBAcmVmIEl4QXRtTG9naWNhbFBvcnQgW2luXSAtIFNwZWNpZmllcyB0aGUgQVRNIHBvcnQgb24gd2hpY2ggdGhlIFZDIHRvIGJlIGNsZWFyZWQKKiAgICAgICAgaXMgZXN0YWJsaXNoZWQKKiBAcGFyYW0gdmNJZCBpbnQgW2luXSAtIElkZW50aWZpZXMgdGhlIFZDIHRvIGJlIGNsZWFyZWQuIFRoaXMgaXMgdGhlIHZhbHVlCiogICAgICAgIHJldHVybmVkIGJ5IHRoZSBAYSBJeEF0bWRBY2NUeFNjaFZjSWRHZXRDYWxsYmFjaygpIGNhbGwgLgoqCiogQHJldHVybiBub25lCioKKi8KdHlwZWRlZiB2b2lkICgqSXhBdG1kQWNjVHhWY0RlbWFuZENsZWFyQ2FsbGJhY2spIChJeEF0bUxvZ2ljYWxQb3J0IHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZjSWQpOwoKLyoqCioKKiBAaW5ncm91cCBJeEF0bWRBY2NDdHJsQVBJCioKKiBAYnJpZWYgIHByb3RvdHlwZSB0byBnZXQgYSBzY2hlZHVsZXIgdmMgaWQKKgoqIEl4QXRtZEFjY1R4U2NoVmNJZEdldENhbGxiYWNrIGlzIHRoZSBwcm90b3R5cGUgb2YgdGhlIGZ1bmN0aW9uIHRvIGdldAoqIGEgc2NoZWR1bGVyIHZjSWQKKgoqIEBzYSBJeEF0bWRBY2NUeFZjRGVtYW5kVXBkYXRlQ2FsbGJhY2sKKiBAc2EgSXhBdG1kQWNjVHhWY0RlbWFuZENsZWFyQ2FsbGJhY2sKKiBAc2EgSXhBdG1kQWNjVHhTY2hWY0lkR2V0Q2FsbGJhY2sKKiBAc2EgaXhBdG1kQWNjUG9ydFR4U2NoZWR1bGVkTW9kZUVuYWJsZQoqCiogQHBhcmFtIHBvcnQgQHJlZiBJeEF0bUxvZ2ljYWxQb3J0IFtpbl0gLSBTcGVjaWZpZXMgdGhlIEFUTSBsb2dpY2FsIHBvcnQgb24gd2hpY2ggdGhlIFZDIGlzCiogICAgICAgIGVzdGFibGlzaGVkCiogQHBhcmFtIHZwaSB1bnNpZ25lZCBpbnQgW2luXSAtIEZvciBBQUwwL0FBTDUgc3BlY2lmaWVzIHRoZSBBVE0gdnBpIG9uIHdoaWNoIHRoZSAKKiAgICAgICAgICAgICAgICAgVkMgaXMgZXN0YWJsaXNoZWQuCiogICAgICAgICAgICAgICAgIEZvciBPQU0gc3BlY2lmaWVzIHRoZSBkZWRpY2F0ZWQgIk9BTSBUeCBjaGFubmVsIiBWUEkuCiogQHBhcmFtIHZjaSB1bnNpZ25lZCBpbnQgW2luXSAtIEZvciBBQUwwL0FBTDUgc3BlY2lmaWVzIHRoZSBBVE0gdmNpIG9uIHdoaWNoIHRoZSAKKiAgICAgICAgICAgICAgICAgVkMgaXMgZXN0YWJsaXNoZWQuCiogICAgICAgICAgICAgICAgIEZvciBPQU0gc3BlY2lmaWVzIHRoZSBkZWRpY2F0ZWQgIk9BTSBUeCBjaGFubmVsIiBWQ0kuCiogQHBhcmFtIGNvbm5JZCBAcmVmIEl4QXRtQ29ubklkIFtpbl0gLSBzcGVjaWZpZXMgdGhlIEl4QXRtZEFjYyBjb25uZWN0aW9uIElkIGFscmVhZHkKKiAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVkMKKiBAcGFyYW0gdmNJZCBpbnQqIFtvdXRdIC0gcG9pbnRlciB0byBhIHZjSWQKKgoqIEByZXR1cm4gQGxpIElYX1NVQ0NFU1MgdGhlIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIFNjaGVkdWxlciB2Y0lkIGZvciB0aGlzCiogICAgICAgICBWQwoqIEByZXR1cm4gQGxpIElYX0ZBSUwgdGhlIGZ1bmN0aW9uIGNhbm5vdCBwcm9jZXNzIHNjaGVkdWxpbmcgZm9yIHRoaXMgVkMuCiogICAgICAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiB2Y0lkIGlzIHVuc3BlY2lmaWVkCioKKi8KdHlwZWRlZiBJWF9TVEFUVVMgKCpJeEF0bWRBY2NUeFNjaFZjSWRHZXRDYWxsYmFjaykgKEl4QXRtTG9naWNhbFBvcnQgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2cGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmNpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXhBdG1Db25uSWQgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp2Y0lkKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBQYXJ0IG9mIHRoZSBJeEF0bWRBY2MgaW50ZXJmYWNlIHJlbGF0ZWQgdG8gUlggdHJhZmZpYwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qKgogKgogKiBAaW5ncm91cCBJeEF0bWRBY2NDdHJsQVBJCiAqCiAqIEBmbiBpeEF0bWRBY2NSeERpc3BhdGNoZXJSZWdpc3RlciAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgSXhBdG1SeFF1ZXVlSWQgcXVldWVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBJeEF0bWRBY2NSeERpc3BhdGNoZXIgY2FsbGJhY2spCiAqCiAqIEBicmllZiBSZWdpc3RlciBhIG5vdGlmaWNhdGlvbiBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlcmUgaXMKICogYXQgbGVhc3Qgb25lIGVudHJ5IG9uIGEgcGFydGljdWxhciBSeCBxdWV1ZS4KICoKICogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlcmUgaXMgYXQKICogbGVhc3Qgb25lIGVudHJ5IGluIGEgcGFydGljdWxhciBxdWV1ZS4gVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaXMKICogY2FsbGVkIGV2ZXJ5IHRpbWUgd2hlbiB0aGUgaGFyZHdhcmUgYWRkcyBvbmUgb3IgbW9yZSBwZHVzIHRvIHRoZQogKiBzcGVjaWZpZWQgUnggcXVldWUuCiAqCiAqIFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgd2hlbiBhIFJ4IFZjIHVzaW5nIHRoaXMgcXVldWUgaXMKICogYWxyZWFkeSBleGlzdGluZy4KICoKICogQG5vdGUgLVRoZSBjYWxsYmFjayBmdW5jdGlvbiBjYW4gYmUgdGhlIEFQSSBmdW5jdGlvbgogKiAgICAgICBAYSBpeEF0bWRBY2NSeERpc3BhdGNoKCkgOiBldmVyeSB0aW1lIHRoZSB0aHJlaG9sZCBsZXZlbAogKiAgICAgICBvZiB0aGUgcXVldWUgaXMgcmVhY2hlZCwgdGhlIGl4QXRtZEFjY1J4RGlzcGF0Y2goKSBpcwogKiAgICAgICBpbnZva2VkIHRvIHJlbW92ZSBhbGwgZW50cmllcyBmcm9tIHRoZSBxdWV1ZS4KICoKICogQHNhIGl4QXRtZEFjY1J4RGlzcGF0Y2gKICogQHNhIEl4QXRtZEFjY1J4RGlzcGF0Y2hlcgogKgogKiBAcGFyYW0gcXVldWVJZCBAcmVmIEl4QXRtUnhRdWV1ZUlkIFtpbl0gUlggcXVldWUgaWRlbnRpZmljYXRpb24KICogQHBhcmFtIGNhbGxiYWNrIEByZWYgSXhBdG1kQWNjUnhEaXNwYXRjaGVyIFtpbl0gZnVuY3Rpb24gdHJpZ2dlcmluZyB0aGUgZGVsaXZlcnkgb2YgaW5jb21pbmcKICogICAgICAgIHRyYWZmaWMuIFRoaXMgcGFyYW1ldGVyIGNhbm5vdCBiZSBhIG51bGwgcG9pbnRlci4KICoKICogQHJldHVybiBAbGkgSVhfU1VDQ0VTUyBTdWNjZXNzZnVsIGNhbGwgdG8gQGEgaXhBdG1kQWNjUnhEaXNwYXRjaGVyUmVnaXN0ZXIoKQogKiBAcmV0dXJuIEBsaSBJWF9GQUlMIGVycm9yIGluIHRoZSBwYXJhbWV0ZXJzLCBvciB0aGVyZSBpcyBhbgogKiAgICAgICAgICAgICBhbHJlYWR5IGFjdGl2ZSBSWCBWQyBmb3IgdGhpcyBxdWV1ZSBvciBzb21lIHVuc3BlY2lmaWVkCiAqICAgICAgICAgICAgIGludGVybmFsIGVycm9yIG9jY3VycmVkLgogKgogKi8KUFVCTElDIElYX1NUQVRVUyBpeEF0bWRBY2NSeERpc3BhdGNoZXJSZWdpc3RlciAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgSXhBdG1SeFF1ZXVlSWQgcXVldWVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBJeEF0bWRBY2NSeERpc3BhdGNoZXIgY2FsbGJhY2spOwoKLyoqCiAqCiAqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICoKICogQGZuIGl4QXRtZEFjY1J4RGlzcGF0Y2ggKEl4QXRtUnhRdWV1ZUlkIHJ4UXVldWVJZCwKICAgIHVuc2lnbmVkIGludCBudW1iZXJPZlBkdXNUb1Byb2Nlc3MsCiAgICB1bnNpZ25lZCBpbnQgKm51bWJlck9mUGR1c1Byb2Nlc3NlZFB0cikKICoKICoKICogQGJyaWVmIENvbnRyb2wgZnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgUnggcHJvY2Vzc2luZyBmb3IgYSBwYXJ0aWN1bGFyCiAqIFJ4IHN0cmVhbS4KICoKICogVGhlIEBhIEl4QXRtZEFjY1J4RGlzcGF0Y2goKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHByb2Nlc3MgcmVjZWl2ZWQgUGR1cwogKiBhdmFpbGFibGUgZnJvbSBvbmUgb2YgdGhlIHR3byBpbmNvbWluZyBSWCBzdHJlYW1zLiBXaGVuIHRoaXMgZnVuY3Rpb24KICogaXMgaW52b2tlZCwgdGhlIGluY29taW5nIHRyYWZmaWMgKHVwIHRvIHRoZSBudW1iZXIgb2YgUERVcyBwYXNzZWQgYXMKICogYSBwYXJhbWV0ZXIpIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIEl4QXRtZEFjYyB1c2VycyB0aHJvdWdoIHRoZQogKiBjYWxsYmFjayBAYSBJeEF0bWRBY2NSeFZjUnhDYWxsYmFjaygpLCBhcyByZWdpc3RlcmVkIGR1cmluZyB0aGUKICogQGEgaXhBdG1kQWNjUnhWY0Nvbm5lY3QoKSBjYWxsLgogKgogKiBUaGUgdXNlciByZWNlaXZlIGNhbGxiYWNrcyB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoaXMKICogZnVuY3Rpb24uCiAqCiAqIEZhaWxpbmcgdG8gdXNlIHRoaXMgZnVuY3Rpb24gb24gYSByZWd1bGFyIGJhc2lzIHdoZW4gdGhlcmUgaXMgdHJhZmZpYwogKiB3aWxsIGJsb2NrIGluY29taW5nIHRyYWZmaWMgYW5kIGNhbiByZXN1bHQgaW4gUGR1cyBiZWluZyBkcm9wcGVkIGJ5CiAqIHRoZSBoYXJkd2FyZS4KICoKICogVGhpcyBzaG91bGQgYmUgdXNlZCB0byBjb250cm9sIHdoZW4gcmVjZWl2ZWQgcGR1cyBhcmUgaGFuZGVkIG9mZiBmcm9tCiAqIHRoZSBoYXJkd2FyZSB0byBBYWwgdXNlcnMgZnJvbSBhIHBhcnRpY2x1YXIgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FuCiAqIGJlIHVzZWQgZnJvbSBhIHRpbWVyIGNvbnRleHQsIG9yIGNhbiBiZSByZWdpc3RlcmVkIGFzIGEgY2FsbGJhY2sgaW4KICogcmVzcG9uc2UgdG8gYW4gcnggc3RyZWFtIHRocmVzaG9sZCBldmVudCwgb3IgY2FuIGJlIHVzZWQgaW5zaWRlIGFuCiAqIGFjdGl2ZSBwb2xsaW5nIG1lY2hhbmlzbSB3aGljaCBpcyB1bmRlciB1c2VyIGNvbnRyb2wuCiAqCiAqIEBub3RlIC0gVGhlIHNpZ25hdHVyZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRpcmVjdGx5IGNvbXBhdGlibGUgd2l0aCB0aGUKICogY2FsbGJhY2sgcHJvdG90eXBlIHdoaWNoIGNhbiBiZSByZWdpc3RlciB3aXRoIEBhIGl4QXRtZEFjY1J4RGlzcGF0Y2hlclJlZ2lzdGVyKCkuCiAqCiAqIEBzYSBpeEF0bWRBY2NSeERpc3BhdGNoZXJSZWdpc3RlcgogKiBAc2EgSXhBdG1kQWNjUnhWY1J4Q2FsbGJhY2sKICogQHNhIGl4QXRtZEFjY1J4VmNGcmVlRW50cmllc1F1ZXJ5CiAqCiAqIEBwYXJhbSByeFF1ZXVlSWQgQHJlZiBJeEF0bVJ4UXVldWVJZCBbaW5dIC0gaW5kaWNhdGVzIHdoaWNoIFJYIHF1ZXVlIHRvIHByb2Nlc3MuCiAqIEBwYXJhbSBudW1iZXJPZlBkdXNUb1Byb2Nlc3MgdW5zaWduZWQgaW50IFtpbl0gLSBpbmRpY2F0ZXMgdGhlIG1heGl1bXVtIG51bWJlciBvZiBQRFUgdG8KICogICAgIHJlbW92ZSBmcm9tIHRoZSBSWCBxdWV1ZS4gQSB2YWx1ZSBvZiBJWF9BVE1EQUNDX0FMTFBEVVMgaW5kaWNhdGVzCiAqICAgICB0byBwcm9jZXNzIGFsbCBQRFVzIGZyb20gdGhlIHF1ZXVlLiBUaGlzIGluY2x1ZGVzIGF0IGxlYXN0IHRoZSBQRFVzCiAqICAgICBpbiB0aGUgcXVldWUgd2hlbiB0aGUgZnVjdGlvbiBpcyBpbnZva2VkLiBCZWNhdXNlIG9mIHJlYWwtdGltZQogKiAgICAgY29uc3RyYWludHMsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0dGhlIHF1ZXVlIHdpbGwgYmUgZW1wdHkKICogICAgIHdoZW4gdGhlIGZ1bmN0aW9uIGV4aXRzLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBncmVhdGVyIHRoYW4gdGhlCiAqICAgICBudW1iZXIgb2YgZW50cmllcyBvZiB0aGUgcXVldWVzLCB0aGUgZnVuY3Rpb24gd2lsbCBzdWNjZWVkCiAqICAgICBhbmQgdGhlIHBhcmFtZXRlciBudW1iZXJPZlBkdXNQcm9jZXNzZWRQdHIgd2lsbCByZWZsZWN0IHRoZSBleGFjdAogKiAgICAgbnVtYmVyIG9mIFBEVXMgcHJvY2Vzc2VkLgogKiBAcGFyYW0gKm51bWJlck9mUGR1c1Byb2Nlc3NlZFB0ciB1bnNpZ25lZCBpbnQgW291dF0gLSBpbmRpY2F0ZXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgUERVCiAqICAgICBwcm9jZXNzZWQgZHVyaW5nIHRoaXMgY2FsbC4gVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIGEgbnVsbAogKiAgICAgcG9pbnRlci4KICoKICogQHJldHVybiBAbGkgSVhfU1VDQ0VTUyB0aGUgbnVtYmVyIG9mIFBEVXMgYXMgaW5kaWNhdGVkIGluCiAqICAgICBudW1iZXJPZlBkdXNQcm9jZXNzZWRQdHIgYXJlIHJlbW92ZWQgZnJvbSB0aGUgUlggcXVldWUgYW5kIHRoZSBWQyBjYWxsYmFjawogKiAgICAgYXJlIGNhbGxlZC4KICogQHJldHVybiBAbGkgSVhfRkFJTCBpbnZhbGlkIHBhcmFtZXRlcnMgb3Igc29tZSB1bnNwZWNpZmllZCBpbnRlcm5hbAogKiAgICAgZXJyb3Igb2NjdXJlZC4KICoKICovClBVQkxJQyBJWF9TVEFUVVMgaXhBdG1kQWNjUnhEaXNwYXRjaCAoSXhBdG1SeFF1ZXVlSWQgcnhRdWV1ZUlkLAogICAgdW5zaWduZWQgaW50IG51bWJlck9mUGR1c1RvUHJvY2VzcywKICAgIHVuc2lnbmVkIGludCAqbnVtYmVyT2ZQZHVzUHJvY2Vzc2VkUHRyKTsKCi8qKgogKgogKiBAaW5ncm91cCBJeEF0bWRBY2NDdHJsQVBJCiAqIAogKiBAZm4gaXhBdG1kQWNjUnhMZXZlbFF1ZXJ5IChJeEF0bVJ4UXVldWVJZCByeFF1ZXVlSWQsCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtYmVyT2ZQZHVzUHRyKQogKgogKiBAYnJpZWYgUXVlcnkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGEgcGFydGljdWxhciBSWCBxdWV1ZS4KICoKICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBudW1iZXIgb2YgcGR1cyByZWNlaXZlZCBieQogKiB0aGUgaGFyZHdhcmUgYW5kIHJlYWR5IGZvciBkaXN0cmlidXRpb24gdG8gdXNlcnMuCiAqCiAqIEBwYXJhbSByeFF1ZXVlSWQgQHJlZiBJeEF0bVJ4UXVldWVJZCBbaW5dIC0gaW5kaWNhdGVzIHdoaWNoIG9mIHR3byBSWCBxdWV1ZXMgdG8gcXVlcnkuCiAqIEBwYXJhbSBudW1iZXJPZlBkdXNQdHIgdW5zaWduZWQgaW50KiBbb3V0XSAtIFBvaW50ZXIgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBhdmFpbGFibGUKICogICAgICAgIFBEVXMgaW4gdGhlIFJYIHF1ZXVlLiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgYSBudWxsIHBvaW50ZXIuCiAqCiAqIEByZXR1cm4gQGxpIElYX1NVQ0NFU1MgdGhlIHZhbHVlIGluIG51bWJlck9mUGR1c1B0ciBzcGVjaWZpZXMgdGhlCiAqICAgICAgICAgbnVtYmVyIG9mIGluY29taW5nIHBkdXMgd2FpdGluZyBpbiB0aGlzIHF1ZXVlCiAqIEByZXR1cm4gQGxpIElYX0ZBSUwgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nLgogKiAgICAgICAgIFRoZSB2YWx1ZSBpbiBudW1iZXJPZlBkdXNQdHIgaXMgdW5zcGVjaWZpZWQuCiAqCiAqIEBub3RlIC0gVGhpcyBmdW5jdGlvbiBpcyByZWVudHJhbnQsIGRvZXNuJ3QgdXNlIHN5c3RlbSByZXNvdXJjZXMKICogICAgICAgICBhbmQgY2FuIGJlIHVzZWQgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dC4KICoKICovClBVQkxJQyBJWF9TVEFUVVMgaXhBdG1kQWNjUnhMZXZlbFF1ZXJ5IChJeEF0bVJ4UXVldWVJZCByeFF1ZXVlSWQsCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtYmVyT2ZQZHVzUHRyKTsKCi8qKgogKgogKiBAaW5ncm91cCBJeEF0bWRBY2NDdHJsQVBJCiAqCiAqIEBmbiBpeEF0bWRBY2NSeFF1ZXVlU2l6ZVF1ZXJ5IChJeEF0bVJ4UXVldWVJZCByeFF1ZXVlSWQsCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtYmVyT2ZQZHVzUHRyKQogKgogKiBAYnJpZWYgUXVlcnkgdGhlIHNpemUgb2YgYSBwYXJ0aWN1bGFyIFJYIHF1ZXVlLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIG51bWJlciBvZiBwZHVzIHRoZSBzeXN0ZW0gaXMKICogYWJsZSB0byBxdWV1ZSB3aGVuIHJlY2VwdGlvbiBpcyBjb21wbGV0ZS4KICoKICogQHBhcmFtIHJ4UXVldWVJZCBAcmVmIEl4QXRtUnhRdWV1ZUlkIFtpbl0gLSBpbmRpY2F0ZXMgd2hpY2ggb2YgdHdvIFJYIHF1ZXVlcyB0byBxdWVyeS4KICogQHBhcmFtIG51bWJlck9mUGR1c1B0ciB1bnNpZ25lZCBpbnQqIFtvdXRdIC0gUG9pbnRlciB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHBkdXMKICogICAgICAgICB0aGUgc3lzdGVtIGlzIGFibGUgdG8gcXVldWUgaW4gdGhlIFJYIHF1ZXVlLiBUaGlzIHBhcmFtZXRlcgogKiAgICAgICAgIGNhbm5vdCBiZSBhIG51bGwgcG9pbnRlci4KICoKICogQHJldHVybiBAbGkgSVhfU1VDQ0VTUyB0aGUgdmFsdWUgaW4gbnVtYmVyT2ZQZHVzUHRyIHNwZWNpZmllcyB0aGUKICogICAgICAgICBudW1iZXIgb2YgcGR1cyB0aGUgc3lzdGVtIGlzIGFibGUgdG8gcXVldWUuCiAqIEByZXR1cm4gQGxpIElYX0ZBSUwgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nLgogKiAgICAgICAgIFRoZSB2YWx1ZSBpbiBudW1iZXJPZlBkdXNQdHIgaXMgdW5zcGVjaWZpZWQuCiAqCiAqIEBub3RlIC0gVGhpcyBmdW5jdGlvbiBpcyByZWVudHJhbnQsIGRvZXNuJ3QgdXNlIHN5c3RlbSByZXNvdXJjZXMKICogICAgICAgICBhbmQgY2FuIGJlIHVzZWQgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dC4KICoKICovClBVQkxJQyBJWF9TVEFUVVMgaXhBdG1kQWNjUnhRdWV1ZVNpemVRdWVyeSAoSXhBdG1SeFF1ZXVlSWQgcnhRdWV1ZUlkLAogICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bWJlck9mUGR1c1B0cik7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgUGFydCBvZiB0aGUgSXhBdG1kQWNjIGludGVyZmFjZSByZWxhdGVkIHRvIFRYIHRyYWZmaWMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioKICoKICogQGluZ3JvdXAgSXhBdG1kQWNjQ3RybEFQSQogKgogKiBAZm4gaXhBdG1kQWNjUG9ydFR4RnJlZUVudHJpZXNRdWVyeSAoSXhBdG1Mb2dpY2FsUG9ydCBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1iZXJPZkNlbGxzUHRyKQogKgogKiBAYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNlbGxzIHRoZSBzeXN0ZW0gY2FuIGFjY2VwdCBmb3IKICogICAgICAgdHJhbnNtaXNzaW9uLgogKgogKiBUaGUgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGNlbGxzIHRoYXQgY2FuIGJlCiAqIHF1ZXVlZCBmb3IgdHJhbnNtaXNzaW9uIHRvIHRoZSBoYXJkd2FyZS4KICoKICogVGhpcyBudW1iZXIgaXMgYmFzZWQgb24gdGhlIHdvcnN0IHNjaGVkdWxlIHRhYmxlIHdoZXJlIG9uZSBjZWxsCiAqIGlzIHN0b3JlZCBpbiBvbmUgc2NoZWR1bGUgdGFibGUgZW50cnksIGRlcGVuZGluZyBvbiB0aGUgcGR1cyBzaXplCiAqIGFuZCBtYnVmIHNpemUgYW5kIGZyYWdtZW50YXRpb24uCiAqCiAqIFRoaXMgZnVuY3Rpb24gZG9lc24ndCB1c2Ugc3lzdGVtIHJlc291cmNlcyBhbmQgY2FuIGJlIHVzZWQgZnJvbSBhCiAqIHRpbWVyIGNvbnRleHQsIG9yIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSB0aHJlc2hvbGQgZXZlbnQsIG9yIGNhbgogKiBiZSB1c2VkIGluc2lkZSBhbiBhY3RpdmUgcG9sbGluZyBtZWNoYW5pc20KICoKICogQHBhcmFtIHBvcnQgQHJlZiBJeEF0bUxvZ2ljYWxQb3J0IFtpbl0gLSBsb2dpY2FsIFBIWSBwb3J0IFtAYSBJWF9VVE9QSUFfUE9SVF8wIC4uIEBhIElYX1VUT1BJQV9NQVhfUE9SVFMgLSAxXQogKiBAcGFyYW0gbnVtYmVyT2ZDZWxsc1B0ciB1bnNpZ25lZCBpbnQqIFtvdXRdIC0gbnVtYmVyIG9mIGF2YWlsYWJsZSBjZWxscy4KICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIGEgbnVsbCBwb2ludGVyLgogKgogKiBAc2EgaXhBdG1kQWNjUG9ydFR4UHJvY2VzcwogKgogKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIG51bWJlck9mQ2VsbHNQdHIgY29udGFpbnMgdGhlIG51bWJlciBvZiBjZWxscyB0aGF0IGNhbiBiZSBzY2hlZHVsZWQKICogICAgICAgICBmb3IgdGhpcyBwb3J0LgogKiBAcmV0dXJuIEBsaSBJWF9GQUlMIGVycm9yIGluIHRoZSBwYXJhbWV0ZXJzLCBvciBzb21lIHByb2Nlc3NpbmcgZXJyb3IKICogICAgICAgICBvY2N1cmVkLgogKgogKi8KUFVCTElDIElYX1NUQVRVUyBpeEF0bWRBY2NQb3J0VHhGcmVlRW50cmllc1F1ZXJ5IChJeEF0bUxvZ2ljYWxQb3J0IHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bWJlck9mQ2VsbHNQdHIpOwoKLyoqCiAqCiAqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICogCiAqIEBmbiBpeEF0bWRBY2NQb3J0VHhDYWxsYmFja1JlZ2lzdGVyIChJeEF0bUxvZ2ljYWxQb3J0IHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bWJlck9mQ2VsbHMsCiAgICAgICAgICAgICAgICAgICAgICAgSXhBdG1kQWNjUG9ydFR4TG93Q2FsbGJhY2sgY2FsbGJhY2spCiAqCiAqIEBicmllZiBDb25maWd1cmUgdGhlIFR4IHBvcnQgdGhyZXNob2xkIHZhbHVlIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGhhbmRsZQogKiB0aHJlc2hvbGQgbm90aWZpY2F0aW9ucy4KICoKICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB0aHJlc2hvbGQgaW4gY2VsbHMKICoKICogQHNhIGl4QXRtZEFjY1BvcnRUeENhbGxiYWNrUmVnaXN0ZXIKICogQHNhIGl4QXRtZEFjY1BvcnRUeFByb2Nlc3MKICogQHNhIGl4QXRtZEFjY1BvcnRUeEZyZWVFbnRyaWVzUXVlcnkKICoKICogQHBhcmFtIHBvcnQgQHJlZiBJeEF0bUxvZ2ljYWxQb3J0IFtpbl0gLSBsb2dpY2FsIFBIWSBwb3J0IFtAYSBJWF9VVE9QSUFfUE9SVF8wIC4uIEBhIElYX1VUT1BJQV9NQVhfUE9SVFMgLSAxXQogKiBAcGFyYW0gbnVtYmVyT2ZDZWxscyB1bnNpZ25lZCBpbnQgW2luXSAtIHRocmVzaG9sZCB2YWx1ZSB3aGljaCB0cmlnZ2VycyB0aGUgY2FsbGJhY2sKICogICAgICAgIGludm9jYXRpb24sIFRoaXMgbnVtYmVyIGhhcyB0byBiZSBvbmUgb2YgdGhlCiAqICAgICAgICB2YWx1ZXMgMCwxLDIsNCw4LDE2LDMyIC4uLi4KICogICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGNhbm5vdCBiZSBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgdHhWYyBxdWV1ZQogKiAgICAgICAgc2l6ZSAod2hpY2ggY2FuIGJlIHJldHJpZXZlZCB1c2luZyBAYSBpeEF0bWRBY2NQb3J0VHhGcmVlRW50cmllc1F1ZXJ5KCkKICogICAgICAgIGJlZm9yZSBhbnkgVHggdHJhZmZpYyBpcyBzZW50IGZvciB0aGlzIHBvcnQpCiAqIEBwYXJhbSBjYWxsYmFjayBAcmVmIEl4QXRtZEFjY1BvcnRUeExvd0NhbGxiYWNrIFtpbl0gLSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgdGhyZXNob2xkCiAqICAgICAgICAgICAgICAgICBsZXZlbCBpcyByZWFjaGVkLgogKiAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIGEgbnVsbCBwb2ludGVyLgogKgogKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIFN1Y2Nlc3NmdWwgY2FsbCB0byBAYSBpeEF0bWRBY2NQb3J0VHhDYWxsYmFja1JlZ2lzdGVyKCkKICogQHJldHVybiBAbGkgSVhfRkFJTCBlcnJvciBpbiB0aGUgcGFyYW1ldGVycywgVHggY2hhbm5lbCBhbHJlYWR5IHNldCBmb3IgdGhpcyBwb3J0CiAqICAgICAgICAgICAgIHRocmVzaG9sZCBsZXZlbCBpcyBub3QgY29ycmVjdCBvciB3aXRoaW4gdGhlIHJhbmdlIHJlZ2FyZGluZyB0aGUKICogICAgICAgICAgICAgcXVldWUgc2l6ZTpvciB1bnNwZWNpZmllZCBlcnJvciBkdXJpbmcgcHJvY2Vzc2luZzoKICoKICogQG5vdGUgLSBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIGdldCBjYWxsZWQgd2hlbiB0aGUgdGhyZXNob2xkIGxldmVsIGRyb3BzIGZyb20KICogICAgICAgICAobnVtYmVyT2ZDZWxscysxKSBjZWxscyB0byAobnVtYmVyT2ZDZWxscykgY2VsbHMKICoKICogQG5vdGUgLSBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIHN5c3RlbSBpbml0aWFsaXNhdGlvbiwKICogICAgICAgICBvdXRzaWRlIGFuIGludGVycnVwdCBjb250ZXh0CiAqCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4QXRtZEFjY1BvcnRUeENhbGxiYWNrUmVnaXN0ZXIgKEl4QXRtTG9naWNhbFBvcnQgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyT2ZDZWxscywKICAgICAgICAgICAgICAgICAgICAgICBJeEF0bWRBY2NQb3J0VHhMb3dDYWxsYmFjayBjYWxsYmFjayk7CgovKioKICoKICogQGluZ3JvdXAgSXhBdG1kQWNjQ3RybEFQSQogKgogKiBAZm4gaXhBdG1kQWNjUG9ydFR4U2NoZWR1bGVkTW9kZUVuYWJsZSAoSXhBdG1Mb2dpY2FsUG9ydCBwb3J0LAogICAgSXhBdG1kQWNjVHhWY0RlbWFuZFVwZGF0ZUNhbGxiYWNrIHZjRGVtYW5kVXBkYXRlQ2FsbGJhY2ssCiAgICBJeEF0bWRBY2NUeFZjRGVtYW5kQ2xlYXJDYWxsYmFjayB2Y0RlbWFuZENsZWFyQ2FsbGJhY2ssCiAgICBJeEF0bWRBY2NUeFNjaFZjSWRHZXRDYWxsYmFjayB2Y0lkR2V0Q2FsbGJhY2spCiAqCiAqIEBicmllZiBQdXQgdGhlIHBvcnQgaW50byBTY2hlZHVsZWQgTW9kZQogKgogKiBUaGlzIGZ1bmN0aW9uIHB1dHMgdGhlIHNwZWNpZmllZCBwb3J0IGludG8gc2NoZWR1bGVkIG1vZGUgb2YKICogdHJhbnNtaXNzaW9uIHdoaWNoIG1lYW5zIGFuIGV4dGVybmFsIHMvdyBlbnRpdHkgY29udHJvbHMgdGhlCiAqIHRyYW5zbWlzc2lvbiBvZiBjZWxscyBvbiB0aGlzIHBvcnQuIFRoaXMgZmFjaWx0YXRlcyB0cmFmZmljIHNoYXBpbmcgb24KICogdGhlIHBvcnQuCiAqCiAqIEFueSBidWZmZXJzIHN1Ym1pdHRlZCBvbiBhIFZDIGZvciB0aGlzIHBvcnQgd2lsbCBiZSBxdWV1ZWQgaW4gSXhBdG1kQWNjLgogKiBUaGUgdHJhbnNtaXNzaW9uIG9mIHRoZXNlIGJ1ZmZlcnMgdG8gYW5kIGJ5IHRoZSBoYXJkd2FyZSB3aWxsIGJlIGRyaXZlbgogKiBieSBhIHRyYW5zbWl0IHNjaGVkdWxlIHN1Ym1pdHRlZCByZWd1bGFyeSBpbiBjYWxscyB0bwogKiBAYSBpeEF0bWRBY2NQb3J0VHhQcm9jZXNzKCkgYnkgdHJhZmZpYyBzaGFwaW5nIGVudGl0eS4KICoKICogVGhlIHRyYW5zbWl0IHNjaGVkdWxlIGlzIGV4cGVjdGVkIHRvIGJlIGR5bmFtaWMgaW4gbmF0dXJlIGJhc2VkIG9uCiAqIHRoZSBkZW1hbmQgaW4gY2VsbHMgZm9yIGVhY2ggVkMgb24gdGhlIHBvcnQuIEhlbmNlIHRoZSBjYWxsYmFjawogKiBwYXJhbWV0ZXJzIHByb3ZpZGVkIHRvIHRoaXMgZnVuY3Rpb24gYWxsb3cgSXhBdG1kQWNjIHRvIGluZm9ybSB0aGUKICogc2hhcGluZyBlbnRpdHkgb2YgZGVtYW5kIGNoYW5nZXMgZm9yIGVhY2ggVkMgb24gdGhlIHBvcnQuCiAqCiAqIEJ5IGRlZmF1bHQgYSBwb3J0IGlzIGluIFVuc2NoZWR1bGVkIE1vZGUgc28gaWYgdGhpcyBmdW5jdGlvbiBpcyBub3QKICogY2FsbGVkLCB0cmFuc21pc3Npb24gb2YgZGF0YSBpcyBkb25lIHdpdGhvdXQgc2hlZHVsaW5nIHJ1bGVzLCBvbiBhCiAqIGZpcnN0LWNvbWUsIGZpcnN0LW91dCBiYXNpcy4KICoKICogT25jZSBhIHBvcnQgaXMgcHV0IGluIHNjaGVkdWxlZCBtb2RlIGl0IGNhbm5vdCBiZSByZXZlcnRlZCB0bwogKiB1bi1zY2hlZHVsZWQgbW9kZS4gTm90ZSB0aGF0IHVuc2NoZWR1bGVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZAogKiBpbiBpeHA0MjUgMS4wCiAqCiAqIEBub3RlIC0gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgVkNzIGhhdmUgYmUKICogY29ubmVjdGVkIG9uIGEgcG9ydC4gT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gY2FsbCB3aWxsIHJldHVybiBmYWlsdXJlLgogKgogKiBAbm90ZSAtIFRoaXMgZnVuY3Rpb24gdXNlcyBpbnRlcm5hbCBsb2NrcyBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbQogKiBhbiBpbnRlcnJ1cHQgY29udGV4dAogKgogKiBAc2EgSXhBdG1kQWNjVHhWY0RlbWFuZFVwZGF0ZUNhbGxiYWNrCiAqIEBzYSBJeEF0bWRBY2NUeFZjRGVtYW5kQ2xlYXJDYWxsYmFjawogKiBAc2EgSXhBdG1kQWNjVHhTY2hWY0lkR2V0Q2FsbGJhY2sKICogQHNhIGl4QXRtZEFjY1BvcnRUeFByb2Nlc3MKICoKICogQHBhcmFtIHBvcnQgQHJlZiBJeEF0bUxvZ2ljYWxQb3J0IFtpbl0gLSBsb2dpY2FsIFBIWSBwb3J0IFtAYSBJWF9VVE9QSUFfUE9SVF8wIC4uIEBhIElYX1VUT1BJQV9NQVhfUE9SVFMgLSAxXQogKiBAcGFyYW0gdmNEZW1hbmRVcGRhdGVDYWxsYmFjayBAcmVmIEl4QXRtZEFjY1R4VmNEZW1hbmRVcGRhdGVDYWxsYmFjayBbaW5dIC0gY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCB0byB1cGRhdGUKICogICAgIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgY2VsbHMgZm9yIHRyYW5zbWlzc2lvbi4gVGhpcyBwYXJhbWV0ZXIKICogICAgIGNhbm5vdCBiZSBhIG51bGwgcG9pbnRlci4KICogQHBhcmFtIHZjRGVtYW5kQ2xlYXJDYWxsYmFjayBAcmVmIEl4QXRtZEFjY1R4VmNEZW1hbmRDbGVhckNhbGxiYWNrIFtpbl0gLSBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIHRvIHJlbW92ZSBhbGwKICogICAgIGNsZWFyIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgY2VsbHMgZm9yIGEgVkMuIFRoaXMgcGFyYW1ldGVyCiAqICAgICBjYW5ub3QgYmUgYSBudWxsIHBvaW50ZXIuCiAqIEBwYXJhbSB2Y0lkR2V0Q2FsbGJhY2sgQHJlZiBJeEF0bWRBY2NUeFNjaFZjSWRHZXRDYWxsYmFjayBbaW5dIC0gY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCB0byBleGNoYW5nZSB2YwogKiAgICAgSWRlbnRpZmllcnMgYmV0d2VlbiBJeEF0bWRBY2MgYW5kIHRoZSBlbnRpdHkgc3VwcGx5aW5nIHRoZQogKiAgICAgdHJhbnNtaXQgc2NoZWR1bGUuIFRoaXMgcGFyYW1ldGVyIGNhbm5vdCBiZSBhIG51bGwgcG9pbnRlci4KICoKICogQHJldHVybiBAbGkgSVhfU1VDQ0VTUyBzY2hlZHVsZXIgcmVnaXN0cmF0aW9uIGlzIGNvbXBsZXRlIGFuZCB0aGUgcG9ydAogKiAgICAgICAgIGlzIG5vdyBpbiBzY2hlZHVsZWQgbW9kZS4KICogQHJldHVybiBAbGkgSVhfRkFJTCBmYWlsZWQgKHdyb25nIHBhcmFtZXRlcnMsIG9yIHRyYWZmaWMgaXMgYWxyZWFkeQogKiAgICAgICAgIGVuYWJsZWQgb24gdGhpcyBwb3J0LCBwb3NzaWJseSB3aXRob3V0IEFUTSBzaGFwaW5nKQogKgogKi8KUFVCTElDIElYX1NUQVRVUyBpeEF0bWRBY2NQb3J0VHhTY2hlZHVsZWRNb2RlRW5hYmxlIChJeEF0bUxvZ2ljYWxQb3J0IHBvcnQsCiAgICBJeEF0bWRBY2NUeFZjRGVtYW5kVXBkYXRlQ2FsbGJhY2sgdmNEZW1hbmRVcGRhdGVDYWxsYmFjaywKICAgIEl4QXRtZEFjY1R4VmNEZW1hbmRDbGVhckNhbGxiYWNrIHZjRGVtYW5kQ2xlYXJDYWxsYmFjaywKICAgIEl4QXRtZEFjY1R4U2NoVmNJZEdldENhbGxiYWNrIHZjSWRHZXRDYWxsYmFjayk7CgovKioKICoKICogQGluZ3JvdXAgSXhBdG1kQWNjQ3RybEFQSQogKgogKiBAZm4gaXhBdG1kQWNjUG9ydFR4UHJvY2VzcyAoSXhBdG1Mb2dpY2FsUG9ydCBwb3J0LAogICAgSXhBdG1TY2hlZHVsZVRhYmxlKiBzY2hlZHVsZVRhYmxlUHRyKQogKgogKiBAYnJpZWYgVHJhbnNtaXQgcXVldWUgY2VsbHMgdG8gdGhlIEgvVyBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgc2NoZWR1bGUKICogICAgICAgIHRhYmxlLgogKgogKiBUaGlzIGZ1bmN0aW9uIEBhIGl4QXRtZEFjY1BvcnRUeFByb2Nlc3MoKSBwcm9jZXNzIHRoZSBzY2hlZHVsZQogKiB0YWJsZSBwcm92aWRlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24uIEFzIGEgcmVzdWx0IGNlbGxzIGFyZQogKiBzZW50IHRvIHRoZSB1bmRlcmxheWluZyBoYXJkd2FyZSBmb3IgdHJhbnNtaXNzaW9uLgogKgogKiBUaGUgc2NoZWR1bGUgdGFibGUgaXMgZXhlY3V0ZWQgaW4gaXRzIGVudGlyZXR5IG9yIG5vdCBhdCBhbGwuIFNvIHRoZQogKiBvbnVzIGlzIG9uIHRoZSBjYWxsZXIgbm90IHRvIHN1Ym1pdCBhIHRhYmxlIGNvbnRhaW5pbmcgbW9yZSBjZWxscyB0aGFuCiAqIGNhbiBiZSB0cmFuc21pdHRlZCBhdCB0aGF0IHBvaW50LiBUaGUgbWF4aW11bSBudW1iZXJzIHRoYXQgY2FuIGJlCiAqIHRyYW5zbWl0dGVkIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIG51bWJlciBvZiBjZWxscyBhcyByZXR1cm5lZCBieSB0aGUKICogZnVuY3Rpb24gQGEgaXhBdG1kQWNjUG9ydFR4RnJlZUVudHJpZXNRdWVyeSgpLgogKgogKiBXaGVuIHRoZSBzY2hlZHVsZXIgaXMgaW52b2tlZCBvbiBhIHRocmVzaG9sZCBsZXZlbCwgSXhBdG1kQWNjIGdpdmVzIHRoZQogKiBtaW5pbXVtIG51bWJlciBvZiBjZWxscyAodG8gZW5zdXJlIHRoZSBjYWxsYmFjayB3aWxsIGZpcmUgYWdhaW4gbGF0ZXIpCiAqIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2VsbHMgdGhhdCBAYSBpeEF0bWRBY2NQb3J0VHhQcm9jZXNzKCkKICogd2lsbCBiZSBhYmxlIHRvIHByb2Nlc3MgKGFzc3VtaW5nIHRoZSBBVE0gc2NoZWR1bGVyIGlzIGFibGUKICogdG8gcHJvZHVjZSB0aGUgd29yc3QtY2FzZSBzY2hlZHVsZSB0YWJsZSwgaS5lLiBvbmUgZW50cnkgcGVyIGNlbGwpLgogKgogKiBXaGVuIGludm9rZWQgb3VzaWRlIGEgdGhyZXNob2xkIGxldmVsLCB0aGUgb3ZlcmFsbCBudW1iZXIgb2YgY2VsbHMgb2YKICogdGhlIHNjaGVkdWxlIHRhYmxlIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBjZWxscyByZXR1cm5lZAogKiBieSB0aGUgQGEgaXhBdG1kQWNjUG9ydFR4RnJlZUVudHJpZXNRdWVyeSgpIGZ1bmN0aW9uLgogKgogKiBBZnRlciBpbnZva2luZyB0aGUgQGEgaXhBdG1kQWNjUG9ydFR4UHJvY2VzcygpIGZ1bmN0aW9uLCBpdCBpcyB0aGUKICogdXNlciBjaG9pY2UgdG8gcXVlcnkgYWdhaW4gdGhlIHF1ZXVlIGxldmVsIHdpdGggdGhlIGZ1bmN0aW9uCiAqIEBhIGl4QXRtZEFjY1BvcnRUeEZyZWVFbnRyaWVzUXVlcnkoKSBhbmQsIGRlcGVuZGluZyBvbiBhIG5ldyBjZWxsCiAqIG51bWJlciwgc3VibWl0IGFuIG90aGVyIHNjaGVkdWxlIHRhYmxlLgogKgogKiBJeEF0bWRBY2Mgd2lsbCBjaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIHNjaGVkdWxlIHRhYmxlCiAqIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc21pdCBsZXZlbC4gSWYgdGhlCiAqCiAqIE9ic29sZXRlIG9yIGludmFsaWQgY29ubmVjdGlvbiBJZCB3aWxsIGJlIHNpbGVudGx5IGRpc2NhcmRlZC4KICoKICogVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVlbnRyYW50IGZvciB0aGUgc2FtZSBwb3J0LgogKgogKiBUaGlzIGZ1bmN0aW9ucyBkb2Vzbid0IHVzZSBzeXN0ZW0gcmVzb3VyY2VzIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgYW4KICogaW50ZXJydXB0IGNvbnRleHQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIHJlc3BvbnNlIHRvIHRoZSBoYXJkd2FyZSByZXF1ZXN0aW5nIG1vcmUKICogY2VsbHMgdG8gdHJhbnNtaXQuCiAqCiAqIEBzYSBpeEF0bWRBY2NQb3J0VHhTY2hlZHVsZWRNb2RlRW5hYmxlCiAqIEBzYSBpeEF0bWRBY2NQb3J0VHhGcmVlRW50cmllc1F1ZXJ5CiAqIEBzYSBpeEF0bWRBY2NQb3J0VHhDYWxsYmFja1JlZ2lzdGVyCiAqIEBzYSBpeEF0bWRBY2NQb3J0RW5hYmxlCiAqCiAqIEBwYXJhbSBwb3J0IEByZWYgSXhBdG1Mb2dpY2FsUG9ydCBbaW5dIC0gbG9naWNhbCBQSFkgcG9ydCBbQGEgSVhfVVRPUElBX1BPUlRfMCAuLiBAYSBJWF9VVE9QSUFfTUFYX1BPUlRTIC0gMV0KICogQHBhcmFtIHNjaGVkdWxlVGFibGVQdHIgQHJlZiBJeEF0bVNjaGVkdWxlVGFibGUqIFtpbl0gLSBwb2ludGVyIHRvIGEgc2NoZWR1bGVyIHVwZGF0ZSB0YWJsZS4gVGhlCiAqICAgICBjb250ZW50IG9mIHRoaXMgdGFibGUgaXMgbm90IG1vZGlmaWVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRoaXMKICogICAgIHBhcmFtZXRlciBjYW5ub3QgYmUgYSBudWxsIHBvaW50ZXIuCiAqCiAqIEByZXR1cm4gQGxpIElYX1NVQ0NFU1MgdGhlIHNjaGVkdWxlIHRhYmxlIHByb2Nlc3MgaXMgY29tcGxldGUKICogICAgICAgICAgICAgYW5kIGNlbGxzIGFyZSB0cmFuc21pdHRlZCB0byB0aGUgaGFyZHdhcmUKICogQHJldHVybiBAbGkgSVhfQVRNREFDQ19XQVJOSU5HIDogVHJhZmZpYyB3aWxsIGJlIGRyb3BwZWQ6IHRoZSBzY2hlZHVsZSB0YWJsZSBleGNlZWQKICogICAgIHRoZSBoYXJkd2FyZSBjYXBhY2l0eSAgSWYgdGhpcyBlcnJvciBpcyBpZ25vcmVkLCBmdXJ0aGVyIHRyYWZmaWMKICogICAgIGFuZCBzY2hlZHVsZSB3aWxsIHdvcmsgY29ycmVjdGx5LgogKiAgICAgT3ZlcnNjaGVkdWxpbmcgZG9lcyBub3Qgb2NjdXIgd2hlbiB0aGUgc2NoZWR1bGUgdGFibGUgZG9lcwogKiAgICAgbm90IGNvbnRhaW4gbW9yZSBlbnRyaWVzIHRoYXQgdGhlIG51bWJlciBvZiBmcmVlIGVudHJpZXMgcmV0dXJuZWQKICogICAgIGJ5IEBhIGl4QXRtZEFjY1BvcnRUeEZyZWVFbnRyaWVzUXVlcnkoKS4KICogICAgIEhvd2V2ZXIsIERpc2Nvbm5lY3QgYXR0ZW1wdHMganVzdCBhZnRlciB0aGlzIGVycm9yIHdpbGwgZmFpbCBwZXJtYW5lbnRseQogKiAgICAgd2l0aCB0aGUgZXJyb3IgY29kZSBAYSBJWF9BVE1EQUNDX1JFU09VUkNFU19TVElMTF9BTExPQ0FURUQsIGFuZCBpdCBpcwogKiAgICAgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIHBvcnQgdG8gbWFrZSBAYSBpeEF0bWRBY2NUeFZjVHJ5RGlzY29ubmVjdCgpCiAqICAgICBzdWNjZXNzZnVsLgogKiBAcmV0dXJuIEBsaSBJWF9GQUlMIGEgd3JvbmcgcGFyYW1ldGVyIGlzIHN1cHBsaWVkLCBvciB0aGUgZm9ybWF0IG9mCiAqICAgICB0aGUgc2NoZWR1bGUgdGFibGUgaXMgaW52YWxpZCwgb3IgdGhlIHBvcnQgaXMgbm90IEVuYWJsZWQsIG9yCiAqICAgICBhbiBpbnRlcm5hbCBzZXZlcmUgZXJyb3Igb2NjdXJlZC4gTm8gY2VsbHMgaXMgdHJhbnNtaXR0ZWQgdG8gdGhlIGhhcmR3YXJlCiAqCiAqIEBub3RlIC0gSWYgdGhlIGZhaWx1cmUgaXMgbGlua2VkIHRvIGFuIG92ZXJzY2hlZHVsZSBvZiBkYXRhIGNlbGxzCiAqICAgICB0aGUgcmVzdWx0IGlzIGFuIGluY29uc2lzdGVuY3kgaW4gdGhlIG91dHB1dCB0cmFmZmljIChvbmUgb3IgbWFueQogKiAgICAgY2VsbHMgbWF5IGJlIG1pc3NpbmcgYW5kIHRoZSB0cmFmZmljIGNvbnRyYWN0IGlzIG5vdCByZXNwZWN0ZWQpLgogKgogKi8KUFVCTElDIElYX1NUQVRVUyBpeEF0bWRBY2NQb3J0VHhQcm9jZXNzIChJeEF0bUxvZ2ljYWxQb3J0IHBvcnQsCiAgICBJeEF0bVNjaGVkdWxlVGFibGUqIHNjaGVkdWxlVGFibGVQdHIpOwoKLyoqCiAqCiAqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICoKICogQGZuIGl4QXRtZEFjY1R4RG9uZURpc3BhdGNoICh1bnNpZ25lZCBpbnQgbnVtYmVyT2ZQZHVzVG9Qcm9jZXNzLAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1iZXJPZlBkdXNQcm9jZXNzZWRQdHIpCiAqCiAqIEBicmllZiBQcm9jZXNzIGEgbnVtYmVyIG9mIHBlbmRpbmcgdHJhbnNtaXQgZG9uZSBwZHVzIGZyb20gdGhlIGhhcmR3YXJlLgogKgogKiBBcyBhIGJ5LXByb2R1Y3Qgb2YgQXRtIHRyYW5zbWl0IG9wZXJhdGlvbiBidWZmZXJzIHdoaWNoIHRyYW5zbWlzc2lvbgogKiBpcyBjb21wbGV0ZSBuZWVkIHRvIGJlIHJlY3ljbGVkIHRvIHVzZXJzLiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQKICogdG8gc2VydmljZSB0aGUgb3VzdGFuZGluZyBsaXN0IG9mIHRyYW5zbWl0dGVkIGJ1ZmZlcnMgYW5kIHBhc3MgdGhlbQogKiB0byBWQyB1c2Vycy4KICoKICogVXNlcnMgYXJlIGhhbmRlZCBiYWNrIHBkdXMgYnkgaW52b2tpbmcgdGhlIGZyZWUgY2FsbGJhY2sgcmVnaXN0ZXJlZAogKiBkdXJpbmcgdGhlIEBhIGl4QXRtZEFjY1R4VmNDb25uZWN0KCkgY2FsbC4KICoKICogVGhlcmUgaXMgYSBzaW5nbGUgVHggZG9uZSBzdHJlYW0gc2VydmljaW5nIGFsbCBhY3RpdmUgQXRtIFR4IHBvcnRzCiAqIHdoaWNoIGNhbiBjb250YWluIGEgbWF4aW11bSBvZiA2NCBlbnRyaWVzLiBJZiB0aGlzIHN0cmVhbSBmaWxscyBwb3J0CiAqIHRyYW5zbWlzc2lvbiB3aWxsIHN0b3Agc28gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGwgc3VmZmljZW50bHkKICogZnJlcXVlbnRseSB0byBlbnN1cmUgbm8gZGlzcnVwdGlvbiB0byB0aGUgdHJhbnNtaXQgb3BlcmF0aW9uLgogKgogKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZyb20gYSB0aW1lciBjb250ZXh0LCBvciBjYW4gYmUgYXNzb2NpYXRlZAogKiB3aXRoIGEgVHhEb25lIGxldmVsIHRocmVzaG9sZCBldmVudCAoc2VlIEBhIGl4QXRtZEFjY1R4RG9uZURpc3BhdGNoZXJSZWdpc3RlcigpICksCiAqIG9yIGNhbiBiZSB1c2VkIGluc2lkZSBhbiBhY3RpdmUgcG9sbGluZyBtZWNoYW5pc20gdW5kZXIgdXNlciBjb250cm9sLgogKgogKiBGb3IgZWFzZSBvZiB1c2UgdGhlIHNpZ25hdHVyZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUKICogVHhEb25lIHRocmVzaG9sZCBldmVudCBjYWxsYmFjayBwcm90b3R5cGUuCiAqCiAqIFRoaXMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluc2lkZSBhbiBpbnRlcnJ1cHQgY29udGV4dC4KICoKICogQHNhIGl4QXRtZEFjY1R4RG9uZURpc3BhdGNoZXJSZWdpc3RlcgogKiBAc2EgSXhBdG1kQWNjVHhWY0J1ZmZlclJldHVybkNhbGxiYWNrCiAqIEBzYSBpeEF0bWRBY2NUeERvbmVMZXZlbFF1ZXJ5CiAqCiAqIEBwYXJhbSBudW1iZXJPZlBkdXNUb1Byb2Nlc3MgdW5zaWduZWQgaW50IFtpbl0gLSBtYXhpdW11bSBudW1iZXIgb2YgcGR1cyB0byByZW1vdmUKICogICAgIGZyb20gdGhlIFRYIERvbmUgcXVldWUKICogQHBhcmFtICpudW1iZXJPZlBkdXNQcm9jZXNzZWRQdHIgdW5zaWduZWQgaW50IFtvdXRdIC0gbnVtYmVyIG9mIHBkdXMgcmVtb3ZlZCBmcm9tCiAqICAgICB0aGUgVFggRG9uZSBxdWV1ZS4gVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIGEgbnVsbCBwb2ludGVyLgogKgogKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIHRoZSBudW1iZXIgb2YgcGR1cyBhcyBpbmRpY2F0ZWQgaW4KICogICAgIG51bWJlck9mUGR1c1RvUHJvY2VzcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBUWCBEb25lIGhhcmR3YXJlCiAqICAgICBhbmQgcGFzc2VkIHRvIHRoZSB1c2VyIHRocm91Z2ggdGhlIFR4IERvbmUgY2FsbGJhY2sgcmVnaXN0ZXJlZAogKiAgICAgZHVyaW5nIGEgY2FsbCB0byBAYSBpeEF0bWRBY2NUeFZjQ29ubmVjdCgpCiAqIEByZXR1cm4gQGxpIElYX0ZBSUwgaW52YWxpZCBwYXJhbWV0ZXJzIG9yIG51bWJlck9mUGR1c1Byb2Nlc3NlZFB0ciBpcwogKiAgICAgYSBudWxsIHBvaW50ZXIgb3Igc29tZSB1bnNwZWNpZmllZCBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgogKgogKi8KUFVCTElDIElYX1NUQVRVUwppeEF0bWRBY2NUeERvbmVEaXNwYXRjaCAodW5zaWduZWQgaW50IG51bWJlck9mUGR1c1RvUHJvY2VzcywKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtYmVyT2ZQZHVzUHJvY2Vzc2VkUHRyKTsKCi8qKgogKgogKiBAaW5ncm91cCBJeEF0bWRBY2NDdHJsQVBJCiAqIAogKiBAZm4gaXhBdG1kQWNjVHhEb25lTGV2ZWxRdWVyeSAodW5zaWduZWQgaW50ICpudW1iZXJPZlBkdXNQdHIpCiAqCiAqIEBicmllZiBRdWVyeSB0aGUgY3VycmVudCBudW1iZXIgb2YgdHJhbnNtaXQgcGR1cyByZWFkeSBmb3IKICogICAgICAgIHJlY3ljbGluZy4KICoKICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHBkdXMgd2hpY2gKICogdGhlIGhhcmR3YXJlIGlzIHJlYWR5IHRvIGhhbmQgYmFjayB0byB1c2VyLgogKgogKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZyb20gYSB0aW1lciBjb250ZXh0LCBvciBjYW4gYmUgYXNzb2NpYXRlZAogKiB3aXRoIGEgdGhyZXNob2xkIGV2ZW50LCBvbiBjYW4gYmUgdXNlZCBpbnNpZGUgYW4gYWN0aXZlIHBvbGxpbmcKICogbWVjaGFuaXNtCiAqCiAqIEBzYSBpeEF0bWRBY2NUeERvbmVEaXNwYXRjaAogKgogKiBAcGFyYW0gKm51bWJlck9mUGR1c1B0ciB1bnNpZ25lZCBpbnQgW291dF0gLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgcGR1cyB0cmFuc21pdHRlZAogKiAgICAgICAgYXQgdGhlIHRpbWUgb2YgdGhpcyBmdW5jdGlvbiBjYWxsLCBhbmQgcmVhZHkgZm9yIHJlY3ljbGluZwogKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIGEgbnVsbCBwb2ludGVyLgogKgogKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIG51bWJlck9mUGR1c1B0ciBjb250YWlucyB0aGUgbnVtYmVyIG9mIHBkdXMKICogICAgICAgIHJlYWR5IGZvciByZWN5Y2xpbmcgYXQgdGhlIHRpbWUgb2YgdGhpcyBmdW5jdGlvbiBjYWxsCiAqCiAqIEByZXR1cm4gQGxpIElYX0ZBSUwgd3JvbmcgcGFyYW1ldGVyIChudWxsIHBvaW50ZXIgYXMgcGFyYW1ldGVyKS5vcgogKiAgICAgICAgIHVuc3BlY2lmaWVkIHJvY2Vzc2luZyBlcnJvciBvY2N1cnMuLlRoZSB2YWx1ZSBpbiBudW1iZXJPZlBkdXNQdHIKICogICAgICAgICBpcyB1bnNwZWNpZmllZC4KICoKICovClBVQkxJQyBJWF9TVEFUVVMKaXhBdG1kQWNjVHhEb25lTGV2ZWxRdWVyeSAodW5zaWduZWQgaW50ICpudW1iZXJPZlBkdXNQdHIpOwoKLyoqCiAqCiAqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICoKICogQGZuIGl4QXRtZEFjY1R4RG9uZVF1ZXVlU2l6ZVF1ZXJ5ICh1bnNpZ25lZCBpbnQgKm51bWJlck9mUGR1c1B0cikKICoKICogQGJyaWVmIFF1ZXJ5IHRoZSBUeERvbmUgcXVldWUgc2l6ZS4KICoKICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIHBkdXMgd2hpY2gKICogdGhlIGhhcmR3YXJlIGlzIGFibGUgdG8gc3RvcmUgYWZ0ZXIgdHJhbnNtaXNzaW9uIGlzIGNvbXBsZXRlCiAqCiAqIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCB0byBzZXQgYSB0aHJlc2hvbGQgYW5kIGVuYWJsZQogKiBhIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIG51bWJlciBvZiBwZHVzIGlzIGdvaW5nIG92ZXIKICogdGhlIHRocmVzaG9sZC4KICoKICogQHNhIGl4QXRtZEFjY1R4RG9uZURpc3BhdGNoZXJSZWdpc3RlcgogKgogKiBAcGFyYW0gKm51bWJlck9mUGR1c1B0ciB1bnNpZ25lZCBpbnQgW291dF0gLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgcGR1cyB0aGUgc3lzdGVtCiAqICAgICAgICBpcyBhYmxlIHRvIHF1ZXVlIGFmdGVyIHRyYW5zbWlzc2lvbgogKgogKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIG51bWJlck9mUGR1c1B0ciBjb250YWlucyB0aGUgdGhlIG51bWJlciBvZgogKiAgICAgICAgcGR1cyB0aGUgc3lzdGVtIGlzIGFibGUgdG8gcXVldWUgYWZ0ZXIgdHJhbnNtaXNzaW9uCiAqIEByZXR1cm4gQGxpIElYX0ZBSUwgd3JvbmcgcGFyYW1ldGVyIChudWxsIHBvaW50ZXIgYXMgcGFyYW1ldGVyKS5vcgogKiAgICAgICAgIHVuc3BlY2lmaWVkIHJvY2Vzc2luZyBlcnJvciBvY2N1cnMuLlRoZSB2YWx1ZSBpbiBudW1iZXJPZlBkdXNQdHIKICogICAgICAgICBpcyB1bnNwZWNpZmllZC4KICoKICogQG5vdGUgLSBUaGlzIGZ1bmN0aW9uIGlzIHJlZW50cmFudCwgZG9lc24ndCB1c2Ugc3lzdGVtIHJlc291cmNlcwogKiAgICAgICAgIGFuZCBjYW4gYmUgdXNlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LgogKi8KUFVCTElDIElYX1NUQVRVUwppeEF0bWRBY2NUeERvbmVRdWV1ZVNpemVRdWVyeSAodW5zaWduZWQgaW50ICpudW1iZXJPZlBkdXNQdHIpOwoKLyoqCiAqCiAqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICogCiAqIEBmbiBpeEF0bWRBY2NUeERvbmVEaXNwYXRjaGVyUmVnaXN0ZXIgKHVuc2lnbmVkIGludCBudW1iZXJPZlBkdXMsCiAgIEl4QXRtZEFjY1R4RG9uZURpc3BhdGNoZXIgbm90aWZpY2F0aW9uQ2FsbGJhY2spCiAqCiAqIEBicmllZiBDb25maWd1cmUgdGhlIFR4IERvbmUgc3RyZWFtIHRocmVzaG9sZCB2YWx1ZSBhbmQgcmVnaXN0ZXIgYQogKiBjYWxsYmFjayB0byBoYW5kbGUgdGhyZXNob2xkIG5vdGlmaWNhdGlvbnMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdGhyZXNob2xkIGxldmVsIGluIHRlcm0gb2YgbnVtYmVyIG9mIHBkdXMgYXQKICogd2hpY2ggdGhlIHN1cHBsaWVkIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkLgogKgogKiBUaGUgaGlnaGVyIHRoZSB0aHJlc2hvbGQgdmFsdWUgaXMsIHRoZSBsZXNzIGV2ZW50cyB3aWxsIGJlIG5lY2Vzc2FyeQogKiB0byBwcm9jZXNzIHRyYW5zbWl0dGVkIGJ1ZmZlcnMuCiAqCiAqIFRyYW5zbWl0dGVkIGJ1ZmZlcnMgcmVjeWNsaW5nIGltcGxlbWVudGF0aW9uIGlzIGEgc3l0ZW0td2lkZSBtZWNoYW5pc20KICogYW5kIG5lZWRzIHRvIGJlIHNldCBwcmlvciBhbnkgdHJhZmZpYyBpcyBzdGFydGVkLiBJZiB0aGlzIHRocmVzaG9sZAogKiBtZWNoYW5pc20gaXMgbm90IHVzZWQsIHRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBwb2xsaW5nIHRoZQogKiB0cmFuc21pdHRlZCBidWZmZXJzIHRoYW5rcyB0byBAYSBpeEF0bWRBY2NUeERvbmVEaXNwYXRjaCgpIGFuZAogKiBAYSBpeEF0bWRBY2NUeERvbmVMZXZlbFF1ZXJ5KCkgZnVuY3Rpb25zLgogKgogKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIHN5c3RlbSBpbml0aWFsaXNhdGlvbiBvdXRzaWRlCiAqIGFuIGludGVycnVwdCBjb250ZXh0CiAqCiAqIEBzYSBpeEF0bWRBY2NUeERvbmVEaXNwYXRjaGVyUmVnaXN0ZXIKICogQHNhIGl4QXRtZEFjY1R4RG9uZURpc3BhdGNoCiAqIEBzYSBpeEF0bWRBY2NUeERvbmVMZXZlbFF1ZXJ5CiAqCiAqIEBwYXJhbSBudW1iZXJPZlBkdXMgdW5zaWduZWQgaW50IFtpbl0gLSBUaGUgbnVtYmVyIG9mIFR4RG9uZSBwZHVzIHdoaWNoIHRyaWdnZXJzIHRoZQogKiAgICAgICAgY2FsbGJhY2sgaW52b2NhdGlvbiBUaGlzIG51bWJlciBoYXMgdG8gYmUgYSBwb3dlciBvZiAyLCBvbmUgb2YgdGhlCiAqICAgICAgICB2YWx1ZXMgMCwxLDIsNCw4LDE2LDMyIC4uLgogKiAgICAgICAgVGhlIG1heGltdW0gdmFsdWUgY2Fubm90IGJlIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSB0eERvbmUgcXVldWUKICogICAgICAgIHNpemUgKHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgQGEgaXhBdG1kQWNjVHhEb25lUXVldWVTaXplUXVlcnkoKSkKICogQHBhcmFtIG5vdGlmaWNhdGlvbkNhbGxiYWNrIEByZWYgSXhBdG1kQWNjVHhEb25lRGlzcGF0Y2hlciBbaW5dIC0gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gKFRoaXMKICogICAgICAgIHBhcmFtZXRlciBjYW4gYmUgQGEgaXhBdG1kQWNjVHhEb25lRGlzcGF0Y2goKSkuVGhpcwogKiAgICAgICAgcGFyYW1ldGVyIHVzdCBub3QgYmUgYSBudWxsIHBvaW50ZXIuCiAqCiAqIEByZXR1cm4gQGxpIElYX1NVQ0NFU1MgU3VjY2Vzc2Z1bCBjYWxsIHRvIGl4QXRtZEFjY1R4RG9uZURpc3BhdGNoZXJSZWdpc3RlcgogKiBAcmV0dXJuIEBsaSBJWF9GQUlMIGVycm9yIGluIHRoZSBwYXJhbWV0ZXJzOgogKgogKiBAbm90ZSAtIFRoZSBub3RpZmljYXRpb25DYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IHdoZW4gdGhlIHRocmVzaG9sZCBsZXZlbAogKiAgICAgICAgIHdpbGwgaW5jcmVhc2UgZnJvbSAobnVtYmVyT2ZQZHVzKSB0byAobnVtYmVyT2ZQZHVzKzEpCiAqCiAqIEBub3RlIC0gSWYgdGhlcmUgaXMgbm8gVHggdHJhZmZpYywgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgVHhEb25lIFBkdXMgd2lsbAogKiAgICAgICBiZSByZWxlYXNlZCB0byB0aGUgdXNlciAod2hlbiB0eERvbmUgbGV2ZWwgaXMgcGVybWFuZW50bHkgdW5kZXIgdGhlIHRocmVzaG9sZAogKiAgICAgICBsZXZlbC4gT25lIG9mIHRoZSBwcmVmZmVyZWQgd2F5IHRvIHJldHVybiByZXNvdXJjZXMgdG8gdGhlIHVzZXIgaXMgdG8gdXNlCiAqICAgICAgIGEgbWl4IG9mIHR4RG9uZSBub3RpZmljYXRpb25zLCB1c2VkIHRvZ2V0aGVyIHdpdGggYSBzbG93CiAqICAgICAgIHJhdGUgdGltZXIgYW5kIGFuIGV4Y2x1c2lvbiBtZWNoYW5pc20gcHJvdGVjdGluZyBmcm9tIHJlLWVudHJhbmN5CiAqCiAqIEBub3RlIC0gVGhlIFR4RG9uZSB0aHJlc2hvbGQgd2lsbCBvbmx5IGhhbmQgYmFjayBidWZmZXJzIHdoZW4gdGhlIHRocmVzaG9sZCBsZXZlbCBpcwogKiAgICAgIGNyb3NzZWQuIFNldHRpbmcgdGhpcyB0aHJlc2hvbGQgdG8gYSBncmVhdCBudW1iZXIgcmVkdWNlIHRoZSBpbnRlcnJ1cHQgcmF0ZQogKiAgICAgIGFuZCB0aGUgY3B1IGxvYWQsIGJ1dCBhbHNvIGluY3JlYXNlIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWJ1ZnMgYW5kIGhhcwogKiAgICAgIGEgc3lzdGVtIHdpZGUgaW1wYWN0IHdoZW4gdGhlc2UgbWJ1ZnMgYXJlIG5lZWRlZCBieSBvdGhlciBjb21wb25lbnRzLgogKgogKi8KUFVCTElDIElYX1NUQVRVUyBpeEF0bWRBY2NUeERvbmVEaXNwYXRjaGVyUmVnaXN0ZXIgKHVuc2lnbmVkIGludCBudW1iZXJPZlBkdXMsCiAgIEl4QXRtZEFjY1R4RG9uZURpc3BhdGNoZXIgbm90aWZpY2F0aW9uQ2FsbGJhY2spOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFBhcnQgb2YgdGhlIEl4QXRtZEFjYyBpbnRlcmZhY2UgcmVsYXRlZCB0byBVdG9waWEgY29uZmlnCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqCiAqCiAqIEBpbmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICoKICogQGRlZmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkgSVhQNDAwIEFUTSBEcml2ZXIgQWNjZXNzIChJeEF0bWRBY2MpIFV0b3BpYSBDb250cm9sIEFQSQogKgogKiBAYnJpZWYgVGhlIHB1YmxpYyBBUEkgZm9yIHRoZSBJWFA0MDAgQXRtIERyaXZlciBDb250cm9sIGNvbXBvbmVudAogKgogKiBJeEF0bWRBY2MgaXMgdGhlIGxvdyBsZXZlbCBpbnRlcmZhY2UgYnkgd2hpY2ggQUFMIFBEVSBnZXQKICogdHJhbnNtaXR0ZWQgdG8sYW5kIHJlY2VpdmVkIGZyb20gdGhlIFV0b3BpYSBidXMKICoKICogVGhpcyBwYXJ0IGlzIHJlbGF0ZWQgdG8gdGhlIFVUT1BJQSBjb25maWd1cmF0aW9uLgogKgogKiBAewogKi8KCi8qKgogKgogKiBAYnJpZWYgVXRvcGlhIGNvbmZpZ3VyYXRpb24KICoKICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzZXQgdGhlIFV0b3BpYSBwYXJhbWV0ZXJzCiAqIEBsaSBjb250YWlucyB0aGUgdmFsdWVzIG9mIFV0b3BpYSByZWdpc3RlcnMsIHRvIGJlIHNldCBkdXJpbmcgaW5pdGlhbGlzYXRpb24KICogQGxpIGNvbnRhaW5zIGRlYnVnIGNvbW1hbmRzIGZvciBOUEUsIHRvIGJlIHVzZWQgZHVyaW5nIGRldmVsb3BtZW50IHN0ZXBzCiAqCiAqIEBub3RlIC0gdGhlIGV4YWN0IGRlc2NyaXB0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIGlzIGRvbmUgaW4gdGhlIFV0b3BpYSByZWZlcmVuY2UKICogICBkb2N1bWVudHMuCiAqCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICAvKioKICAgICogQGluZ3JvdXAgSXhBdG1kQWNjVXRvcGlhQ3RybEFQSQogICAgKiBAc3RydWN0IFV0VHhDb25maWdfCiAgICAqIEBicmllZiBVdG9waWEgVHggQ29uZmlnIFJlZ2lzdGVyCiAgICAqLwogICAgc3RydWN0IFV0VHhDb25maWdfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6MTsgIC8qKjwgWzMxXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMC4qLwogICAgdW5zaWduZWQgaW50IHR4SW50ZXJmYWNlOjE7ICAgICAvKio8IFszMF0gVXRvcGlhIFRyYW5zbWl0IEludGVyZmFjZS4gVGhlIGZvbGxvd2luZyBlbmNvZGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgdXNlZCB0byBzZXQgdGhlIFV0b3BpYSBUcmFuc21pdCBpbnRlcmZhY2UgYXMgQVRNIG1hc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgUEhZIHNsYXZlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQGxpIDEgLSBQSFkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBsaSAwIC0gQVRNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGludCB0eE1vZGU6MTsgICAgICAvKio8IFsyOV0gVXRvcGlhIFRyYW5zbWl0IE1vZGUuIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgaXMgdXNlZAogICAgKiAgdG8gc2V0IHRoZSBVdG9waWEgVHJhbnNtaXQgbW9kZSB0byBTUEhZIG9yIE1QSFk6CiAgICAqICBAbGkgMSAtIFNQSFkKICAgICogIEBsaSAwIC0gTVBIWQogICAgKi8KICAgIHVuc2lnbmVkIGludCB0eE9jdGV0OjE7ICAvKio8IFsyOF0gVXRvcGlhIFRyYW5zbWl0IGNlbGwgdHJhbnNmZXIgcHJvdG9jb2wuIFVzZWQgdG8gc2V0CiAgICAqIHRoZSBVdG9waWEgY2VsbCB0cmFuc2ZlciBwcm90b2NvbCB0byBPY3RldC1sZXZlbCBoYW5kc2hha2luZy4KICAgICogTm90ZSB0aGlzIGlzIG9ubHkgYXBwbGljYWJsZSBpbiBTUEhZIG1vZGUuCiAgICAqIEBsaSAxIC0gT2N0ZXQtaGFuZHNoYWtpbmcgZW5hYmxlZAogICAgKiBAbGkgMCAtIENlbGwtaGFuZHNoYWtpbmcgZW5hYmxlZAogICAgKi8KICAgIHVuc2lnbmVkIGludCB0eFBhcml0eToxOyAgICAvKio8IFsyN10gVXRvcGlhIFRyYW5zbWl0IHBhcml0eSBlbmFibGVkIHdoZW4gc2V0LiBUeEV2ZW5QYXJpdHkKICAgICogZGVmaW5lcyB0aGUgcGFyaXR5IGZvcm1hdCBvZGQvZXZlbi4KICAgICogQGxpIDEgLSBFbmFibGUgUGFyaXR5IGdlbmVyYXRpb24uCiAgICAqIEBsaSAwIC0gdXRfb3BfcHJ0eSBoZWxkIGxvdy4KICAgICovCiAgICB1bnNpZ25lZCBpbnQgdHhFdmVuUGFyaXR5OjE7IC8qKjwgWzI2XSBVdG9waWEgVHJhbnNtaXQgUGFyaXR5IE1vZGUKICAgICogQGxpIDEgLSBFdmVuIFBhcml0eSBHZW5lcmF0ZWQuCiAgICAqIEBsaSAwIC0gT2RkIFBhcml0eSBHZW5lcmF0ZWQuCiAgICAqLwogICAgdW5zaWduZWQgaW50IHR4SEVDOjE7IC8qKjwgWzI1XSBIZWFkZXIgRXJyb3IgQ2hlY2sgSW5zZXJ0aW9uIE1vZGUuIFNwZWNpZmllcyBpZiB0aGUgdHJhbnNtaXQKICAgICogY2VsbCBoZWFkZXIgY2hlY2sgYnl0ZSBpcyBjYWxjdWxhdGVkIGFuZCBpbnNlcnRlZCB3aGVuIHNldC4KICAgICogQGxpIDEgLSBHZW5lcmF0ZSBIRUMuCiAgICAqIEBsaSAwIC0gRGlzYWJsZSBIRUMgZ2VuZXJhdGlvbi4KICAgICovCiAgICB1bnNpZ25lZCBpbnQgdHhDT1NFVDoxOyAgICAvKio8IFsyNF0gSWYgZW5hYmxlZCB0aGUgSEVDIGlzIEV4Y2x1c2l2ZS1PUsZlZCB3aXRoIHRoZSB2YWx1ZSAweDU1IGJlZm9yZQogICogYmVpbmcgcHJlc2VudGVkIG9uIHRoZSBVdG9waWEgYnVzLgogICogQGxpIDEgLSBFbmFibGUgSEVDIEV4T1Igd2l0aCB2YWx1ZSAweDU1CiAgKiBAbGkgMCAtIFVzZSBnZW5lcmF0ZWQgSEVDIHZhbHVlLgogICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzI6MTsgICAgLyoqPCBbMjNdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwCiAgICAqLwogICAgdW5zaWduZWQgaW50IHR4Q2VsbFNpemU6NzsgICAgLyoqPCBbMjI6MTZdIFRyYW5zbWl0IGV4cGVjdGVkIGNlbGwgc2l6ZS4gQ29uZmlndXJlcyB0aGUgY2VsbCBzaXplCiAgICAqIGZvciB0aGUgdHJhbnNtaXQgbW9kdWxlOiBWYWx1ZXMgYmV0d2VlbiA1Mi02NCBhcmUgdmFsaWQuCiAgICAqLwogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzM6MzsgIC8qKjwgWzE1OjEzXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwogICAgdW5zaWduZWQgaW50IHR4QWRkclJhbmdlOjU7ICAgICAgIC8qKjwgWzEyOjhdIFdoZW4gY29uZmlndXJlZCBhcyBhbiBBVE0gbWFzdGVyIGluIE1QSFkgbW9kZSB0aGlzCiAgICAqIHJlZ2lzdGVyIHNwZWNpZmllcyB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIFBIWSBwb2xsaW5nIGxvZ2ljYWwKICAgICogcmFuZ2UuIFRoZSBudW1iZXIgb2YgYWN0aXZlIFBIWXMgYXJlIFR4QWRkclJhbmdlICsgMS4KICAgICovCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfNDozOyAgICAgIC8qKjwgWzc6NV0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KICAgIHVuc2lnbmVkIGludCB0eFBIWUFkZHI6NTsgICAgIC8qKjwgWzQ6MF0gV2hlbiBjb25maWd1cmVkIGFzIGEgc2xhdmUgaW4gYW4gTVBIWSBzeXN0ZW0gdGhpcyByZWdpc3RlcgogICAgKiBzcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFBIWS4KICAgICovCiAgICB9CgogICAgdXRUeENvbmZpZzsgICAgICAgLyoqPCBUeCBjb25maWcgVXRvcGlhIHJlZ2lzdGVyICovCgogICAvKioKICAgICogQGluZ3JvdXAgSXhBdG1kQWNjVXRvcGlhQ3RybEFQSQogICAqIEBzdHJ1Y3QgVXRUeFN0YXRzQ29uZmlnXwogICAqIEBicmllZiBVdG9waWEgVHggc3RhdHMgUmVnaXN0ZXIKICAgICovCiAgICBzdHJ1Y3QgVXRUeFN0YXRzQ29uZmlnXwogICAgewoKICAgIHVuc2lnbmVkIGludCB2cGk6MTI7ICAvKio8IFszMToyMF0gQVRNIFZQSSBbMTE6MF0gT1IgR0ZDIFszOjBdIGFuZCBWUEkgWzc6MF0KICAgIEBsaSBOb3RlOiBpZiBWQ1N0YXRzVHhHRkMgaXMgc2V0IHRvIDAgdGhlIEdGQyBmaWVsZCBpcyBpZ25vcmVkIGluIHRlc3QuICovCgogICAgdW5zaWduZWQgaW50IHZjaToxNjsgIC8qKjwgWzE5OjRdIEFUTSBWQ0kgWzE1OjBdIG9yIFBIWSBBZGRyZXNzWzRdICovCgogICAgdW5zaWduZWQgaW50IHB0aTozOyAgLyoqPCBbMzoxXSBBVE0gUFRJIFsyOjBdIG9yIFBIWSBBZGRyZXNzWzM6MV0KICBAbGkgTm90ZTogaWYgVkNTdGF0c1R4UFRJIGlzIHNldCB0byAwIHRoZSBQVEkgZmllbGQgaXMgaWdub3JlZCBpbiB0ZXN0LgogIEBsaSBOb3RlOiBpZiBWQ1N0YXRzVHhFbmIgaXMgc2V0IHRvIDAgb25seSB0aGUgdHJhbnNtaXQgUEhZIHBvcnQKICBhZGRyZXNzIGFzIGRlZmluZWQgYnkgdGhpcyByZWdpc3RlciBpcyB1c2VkIGZvciBBVE0gc3RhdGlzdGljcyBbNDowXS4gKi8KCiAgICB1bnNpZ25lZCBpbnQgY2xwOjE7ICAvKio8IFswXSBBVE0gQ0xQIG9yIFBIWSBBZGRyZXNzIFswXQogIEBsaSBOb3RlOiBpZiBWQ1N0YXRzVHhDTFAgaXMgc2V0IHRvIDAgdGhlIENMUCBmaWVsZCBpcyBpZ25vcmVkIGluIHRlc3QuCiAgQGxpIE5vdGU6IGlmIFZDU3RhdHNUeEVuYiBpcyBzZXQgdG8gMCBvbmx5IHRoZSB0cmFuc21pdCBQSFkgcG9ydAogIGFkZHJlc3MgYXMgZGVmaW5lZCBieSB0aGlzIHJlZ2lzdGVyIGlzIHVzZWQgZm9yIEFUTSBzdGF0aXN0aWNzIFs0OjBdLiAqLwogICAgfQoKICAgIHV0VHhTdGF0c0NvbmZpZzsgICAgICAgLyoqPCBUeCBzdGF0cyBjb25maWcgVXRvcGlhIHJlZ2lzdGVyICovCgogICAgICAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAgICAgICogQHN0cnVjdCBVdFR4RGVmaW5lSWRsZV8KICAgICAgICogQGJyaWVmIFV0b3BpYSBUeCBpZGxlIGNlbGxzIFJlZ2lzdGVyCiAgICAqLwogICAgc3RydWN0IFV0VHhEZWZpbmVJZGxlXwogICAgewoKICAgIHVuc2lnbmVkIGludCB2cGk6MTI7ICAvKio8IFszMToyMF0gQVRNIFZQSSBbMTE6MF0gT1IgR0ZDIFszOjBdIGFuZCBWUEkgWzc6MF0KICAgIEBsaSBOb3RlOiBpZiBWQ0lkbGVUeEdGQyBpcyBzZXQgdG8gMCB0aGUgR0ZDIGZpZWxkIGlzIGlnbm9yZWQgaW4gdGVzdC4gKi8KCiAgICB1bnNpZ25lZCBpbnQgdmNpOjE2OyAgLyoqPCBbMTk6NF0gQVRNIFZDSSBbMTU6MF0gKi8KCiAgICB1bnNpZ25lZCBpbnQgcHRpOjM7ICAvKio8IFszOjFdIEFUTSBQVEkgUFRJIFsyOjBdCiAgQGxpIE5vdGU6IGlmIFZDSWRsZVR4UFRJIGlzIHNldCB0byAwIHRoZSBQVEkgZmllbGQgaXMgaWdub3JlZCBpbiB0ZXN0LiovCgogICAgdW5zaWduZWQgaW50IGNscDoxOyAgLyoqPCBbMF0gQVRNIENMUCBbMF0KICBAbGkgTm90ZTogaWYgVkNJZGxlVHhDTFAgaXMgc2V0IHRvIDAgdGhlIENMUCBmaWVsZCBpcyBpZ25vcmVkIGluIHRlc3QuKi8KICAgIH0KCiAgICB1dFR4RGVmaW5lSWRsZTsgICAgICAvKio8IFR4IGlkbGUgY2VsbCBjb25maWcgVXRvcGlhIHJlZ2lzdGVyICovCgogICAgICAvKioKICAgICogQGluZ3JvdXAgSXhBdG1kQWNjVXRvcGlhQ3RybEFQSQogICAgICAqIEBzdHJ1Y3QgVXRUeEVuYWJsZUZpZWxkc18KICAgICAgKiBAYnJpZWYgVXRvcGlhIFR4IGllbmFibGUgZmllbGRzIFJlZ2lzdGVyCiAgICAqLwogICAgc3RydWN0IFV0VHhFbmFibGVGaWVsZHNfCiAgICB7CgogICAgdW5zaWduZWQgaW50IGRlZmluZVR4SWRsZUdGQzoxOyAgICAvKio8IFszMV0gVGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGUgR0ZDCiAgICBmaWVsZCBvZiB0aGUgQVRNIGhlYWRlciB3aGVuIHRlc3RpbmcgZm9yIElkbGUgY2VsbHMuCiAgICBAbGkgMSAtIEdGQyBmaWVsZCBpcyB2YWxpZC4KICAgIEBsaSAwIC0gR0ZDIGZpZWxkIGlnbm9yZWQuKi8KCiAgICB1bnNpZ25lZCBpbnQgZGVmaW5lVHhJZGxlUFRJOjE7ICAgIC8qKjwgWzMwXSBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZSBQVEkKICAgIGZpZWxkIG9mIHRoZSBBVE0gaGVhZGVyIHdoZW4gdGVzdGluZyBmb3IgSWRsZSBjZWxscy4KICAgIEBsaSAxIC0gUFRJIGZpZWxkIGlzIHZhbGlkCiAgICBAbGkgICAgMCAtIFBUSSBmaWVsZCBpZ25vcmVkLiovCgogICAgdW5zaWduZWQgaW50IGRlZmluZVR4SWRsZUNMUDoxOyAgICAvKio8IFsyOV0gVGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIGluY2x1ZGUgb3IKICAgIGV4Y2x1ZGUgdGhlIENMUCBmaWVsZCBvZiB0aGUgQVRNIGhlYWRlciB3aGVuIHRlc3RpbmcgZm9yIElkbGUgY2VsbHMuCiAgICBAbGkgMSAtIENMUCBmaWVsZCBpcyB2YWxpZC4KICAgIEBsaSAwIC0gQ0xQIGZpZWxkIGlnbm9yZWQuICovCgogICAgdW5zaWduZWQgaW50IHBoeVN0YXRzVHhFbmI6MTsgICAgLyoqPCBbMjhdIFRoaXMgcmVnaXN0ZXIgaXMgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSBBVE0KICBzdGF0aXN0aWNzIGdhdGhlcmluZyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIFBIWSBhZGRyZXNzIGFzIGRlZmluZWQKICBpbiBUeFN0YXRzQ29uZmlnIHJlZ2lzdGVyLgogIEBsaSAxIC0gRW5hYmxlIHN0YXRpc3RpY3MgZm9yIHNwZWNpZmllZCB0cmFuc21pdCBQSFkgYWRkcmVzcy4KICAgIEBsaSAwIC0gRGlzYWJsZSBzdGF0aXN0aWNzIGZvciBzcGVjaWZpZWQgdHJhbnNtaXQgUEhZIGFkZHJlc3MuICovCgogICAgdW5zaWduZWQgaW50IHZjU3RhdHNUeEVuYjoxOyAgLyoqPCBbMjddIFRoaXMgcmVnaXN0ZXIgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIEFUTQogICAgICBzdGF0aXN0aWNzLWdhdGhlcmluZyBtb2RlIGZyb20gdGhlIHNwZWNpZmllZCBsb2dpY2FsIFBIWSBhZGRyZXNzCiAgICAgIHRvIGEgc3BlY2lmaWMgVlBJL1ZDSSBhZGRyZXNzLgogICAgICBAbGkgMSAtIEVuYWJsZSBzdGF0aXN0aWNzIGZvciBzcGVjaWZpZWQgVlBJL1ZDSSBhZGRyZXNzLgogICAgICBAbGkgMCAtIERpc2FibGUgc3RhdGlzdGljcyBmb3Igc3BlY2lmaWVkIFZQSS9WQ0kgYWRkcmVzcyAqLwoKICAgIHVuc2lnbmVkIGludCB2Y1N0YXRzVHhHRkM6MTsgIC8qKjwgWzI2XSBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZSBHRkMKICAgICAgZmllbGQgb2YgdGhlIEFUTSBoZWFkZXIgd2hlbiBBVE0gVlBJL1ZDSSBzdGF0aXN0aWNzIGFyZSBlbmFibGVkLgogICAgICBHRkMgaXMgb25seSBhdmFpbGFibGUgYXQgdGhlIFVOSSBhbmQgdXNlcyB0aGUgZmlyc3QgNC1iaXRzIG9mCiAgICAgIHRoZSBWUEkgZmllbGQuCiAgICAgIEBsaSAxIC0gR0ZDIGZpZWxkIGlzIHZhbGlkCiAgICAgIEBsaSAwIC0gR0ZDIGZpZWxkIGlnbm9yZWQuKi8KCiAgICB1bnNpZ25lZCBpbnQgdmNTdGF0c1R4UFRJOjE7ICAvKio8IFsyNV0gVGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGUgUFRJCiAgICAgIGZpZWxkIG9mIHRoZSBBVE0gaGVhZGVyIHdoZW4gQVRNIFZQSS9WQ0kgc3RhdGlzdGljcyBhcmUgZW5hYmxlZC4KICAgICAgQGxpIDEgLSBQVEkgZmllbGQgaXMgdmFsaWQKICAgICAgQGxpIDAgLSBQVEkgZmllbGQgaWdub3JlZC4qLwoKICAgIHVuc2lnbmVkIGludCB2Y1N0YXRzVHhDTFA6MTsgIC8qKjwgWzI0XSBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZSBDTFAKICAgICAgZmllbGQgb2YgdGhlIEFUTSBoZWFkZXIgd2hlbiBBVE0gVlBJL1ZDSSBzdGF0aXN0aWNzIGFyZSBlbmFibGVkLgogICAgICBAbGkgMSAtIENMUCBmaWVsZCBpcyB2YWxpZAogICAgICBAbGkgMCAtIENMUCBmaWVsZCBpZ25vcmVkLiAqLwoKICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8xOjM7ICAvKio8IFsyMy0yMV0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KCiAgICB1bnNpZ25lZCBpbnQgdHhQb2xsU3RzSW50OjE7ICAgIC8qKjwgWzIwXSBFbmFibGUgdGhlIGFzc2VydGlvbiBvZiB0aGUgdWNwX3R4X3BvbGxfc3RzIGNvbmRpdGlvbgogIHdoZXJlIHRoZXJlIGlzIGEgY2hhbmdlIGluIHBvbGxpbmcgc3RhdHVzLgogIEBsaSAxIC0gdWNwX3R4X3BvbGxfc3RzIGFzc2VydGVkIHdoZW5ldmVyIHRoZXJlIGlzIGEgY2hhbmdlIGluIHN0YXR1cwogIEBsaSAgICAwIC0gdWNwX3R4X3BvbGxfc3RzIGFzc2VydGVkIGlmIEFOWSB0cmFuc21pdCBQSFkgaXMgYXZhaWxhYmxlCiAgKi8KICAgIHVuc2lnbmVkIGludCB0eENlbGxPdnJJbnQ6MTsgICAgLyoqPCBbMTldIEVuYWJsZSBUeENlbGxDb3VudCBvdmVyZmxvdyBDQkkgVHJhbnNtaXQgU3RhdHVzIGNvbmRpdGlvbgogICAgICBhc3NlcnRpb24uCiAgICAgIEBsaSAxIC0gSWYgVHhDZWxsQ291bnRPdnIgaXMgc2V0IGFzc2VydCB0aGUgVHJhbnNtaXQgU3RhdHVzIENvbmRpdGlvbi4KICAgICAgQGxpIDAgLSBObyBDQkkgVHJhbnNtaXQgU3RhdHVzIGNvbmRpdGlvbiBhc3NlcnRpb24gKi8KCiAgICB1bnNpZ25lZCBpbnQgdHhJZGxlQ2VsbE92ckludDoxOyAgLyoqPCBbMThdIEVuYWJsZSBUeElkbGVDZWxsQ291bnQgb3ZlcmZsb3cgVHJhbnNtaXQgU3RhdHVzIENvbmRpdGlvbgogICAgQGxpIDEgLSBJZiBUeElkbGVDZWxsQ291bnRPdnIgaXMgc2V0IGFzc2VydCB0aGUgVHJhbnNtaXQgU3RhdHVzIENvbmRpdGlvbgogICAgICBAbGkgMCAtIE5vIENCSSBUcmFuc21pdCBTdGF0dXMgY29uZGl0aW9uIGFzc2VydGlvbi4uKi8KCiAgICB1bnNpZ25lZCBpbnQgZW5iSWRsZUNlbGxDbnQ6MTsgICAgLyoqPCBbMTddIEVuYWJsZSBUcmFuc21pdCBJZGxlIENlbGwgQ291bnQuCiAgICBAbGkgMSAtIEVuYWJsZSBjb3VudCBvZiBJZGxlIGNlbGxzIHRyYW5zbWl0dGVkLgogICAgICBAbGkgMCAtIE5vIGNvdW50IGlzIG1haW50YWluZWQuICovCgogICAgdW5zaWduZWQgaW50IGVuYlR4Q2VsbENudDoxOyAgICAvKio8IFsxNl0gRW5hYmxlIFRyYW5zbWl0IFZhbGlkIENlbGwgQ291bnQgb2Ygbm9uLWlkbGUvbm9uLWVycm9yIGNlbGxzCiAgICAgIEBsaSAxIC0gRW5hYmxlIGNvdW50IG9mIHZhbGlkIGNlbGxzIHRyYW5zbWl0dGVkLSBub24taWRsZS9ub24tZXJyb3IKICAgICAgQGxpIDAgLSBObyBjb3VudCBpcyBtYWludGFpbmVkLiovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzI6MTY7ICAgLyoqPCBbMTU6MF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KICAgIH0gdXRUeEVuYWJsZUZpZWxkczsgIC8qKjwgVHggZW5hYmxlIFV0b3BpYSByZWdpc3RlciAqLwoKICAgIC8qKgogICAgKiBAaW5ncm91cCBJeEF0bWRBY2NVdG9waWFDdHJsQVBJCiAgICAqIEBzdHJ1Y3QgVXRUeFRyYW5zVGFibGUwXwogICAgKiBAYnJpZWYgVXRvcGlhIFR4IHRyYW5zbGF0aW9uIHRhYmxlIFJlZ2lzdGVyCiAgICAqLwogICAgc3RydWN0IFV0VHhUcmFuc1RhYmxlMF8KICAgIHsKCiAgICB1bnNpZ25lZCBpbnQgcGh5MDo1OyAgLyoqPCBbMzEtMjddIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgMCAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxOjU7ICAvKio8IFsyNi0yMl0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSAxICovCgogICAgdW5zaWduZWQgaW50IHBoeTI6NTsgIC8qKjwgWzIxLTE3XSBUeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDIgKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMToxOyAgLyoqPCBbMTZdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwLiovCgogICAgdW5zaWduZWQgaW50IHBoeTM6NTsgIC8qKjwgWzE1LTExXSBUeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDMgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5NDo1OyAgLyoqPCBbMTAtNl0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA0ICovCgogICAgdW5zaWduZWQgaW50IHBoeTU6NTsgIC8qKjwgWzUtMV0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA1ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzI6MTsgIC8qKjwgWzBdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwICovCiAgICB9IHV0VHhUcmFuc1RhYmxlMDsgIC8qKjwgVHggdHJhbnNsYXRpb24gdGFibGUgKi8KCiAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAqIEBzdHJ1Y3QgVXRUeFRyYW5zVGFibGUxXwogICogQGJyaWVmIFV0b3BpYSBUeCB0cmFuc2xhdGlvbiB0YWJsZSBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFR4VHJhbnNUYWJsZTFfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHBoeTY6NTsgIC8qKjwgWzMxLTI3XSBUeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDYgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5Nzo1OyAgLyoqPCBbMjYtMjJdIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNyAqLwoKICAgIHVuc2lnbmVkIGludCBwaHk4OjU7ICAvKio8IFsyMS0xN10gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA4ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6MTsgLyoqPCBbMTYtMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5OTo1OyAgLyoqPCBbMTUtMTFdIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgMyAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxMDo1OyAgIC8qKjwgWzEwLTZdIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNCAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxMTo1OyAgIC8qKjwgWzUtMV0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA1ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzI6MTsgIC8qKjwgWzBdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwICovCiAgICB9IHV0VHhUcmFuc1RhYmxlMTsgIC8qKjwgVHggdHJhbnNsYXRpb24gdGFibGUgKi8KCiAgICAvKioKICAgICogQGluZ3JvdXAgSXhBdG1kQWNjVXRvcGlhQ3RybEFQSQogICAgKiBAc3RydWN0IFV0VHhUcmFuc1RhYmxlMl8KICAgICogQGJyaWVmIFV0b3BpYSBUeCB0cmFuc2xhdGlvbiB0YWJsZSBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFR4VHJhbnNUYWJsZTJfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHBoeTEyOjU7ICAgLyoqPCBbMzEtMjddIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNiAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxMzo1OyAgIC8qKjwgWzI2LTIyXSBUeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDcgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MTQ6NTsgICAvKio8IFsyMS0xN10gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA4ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6MTsgLyoqPCBbMTYtMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MTU6NTsgICAvKio8IFsxNS0xMV0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSAzICovCgogICAgdW5zaWduZWQgaW50IHBoeTE2OjU7ICAgLyoqPCBbMTAtNl0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA0ICovCgogICAgdW5zaWduZWQgaW50IHBoeTE3OjU7ICAgLyoqPCBbNS0xXSBUeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDUgKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMjoxOyAgLyoqPCBbMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KICAgIH0gdXRUeFRyYW5zVGFibGUyOyAgICAvKio8IFR4IHRyYW5zbGF0aW9uIHRhYmxlICovCgogICAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAgICogQHN0cnVjdCBVdFR4VHJhbnNUYWJsZTNfCiAgICAqIEBicmllZiBVdG9waWEgVHggdHJhbnNsYXRpb24gdGFibGUgUmVnaXN0ZXIKICAgICovCiAgICBzdHJ1Y3QgVXRUeFRyYW5zVGFibGUzXwogICAgewoKICAgIHVuc2lnbmVkIGludCBwaHkxODo1OyAgIC8qKjwgWzMxLTI3XSBUeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDYgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MTk6NTsgICAvKio8IFsyNi0yMl0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA3ICovCgogICAgdW5zaWduZWQgaW50IHBoeTIwOjU7ICAgLyoqPCBbMjEtMTddIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgOCAqLwoKICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8xOjE7IC8qKjwgWzE2LTBdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwICovCgogICAgdW5zaWduZWQgaW50IHBoeTIxOjU7ICAgLyoqPCBbMTUtMTFdIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgMyAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkyMjo1OyAgIC8qKjwgWzEwLTZdIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNCAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkyMzo1OyAgIC8qKjwgWzUtMV0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA1ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzI6MTsgIC8qKjwgWzBdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwICovCiAgICB9IHV0VHhUcmFuc1RhYmxlMzsgIC8qKjwgVHggdHJhbnNsYXRpb24gdGFibGUgKi8KCiAgICAvKioKICAgICogQGluZ3JvdXAgSXhBdG1kQWNjVXRvcGlhQ3RybEFQSQogICAgKiBAc3RydWN0IFV0VHhUcmFuc1RhYmxlNF8KICAgICogQGJyaWVmIFV0b3BpYSBUeCB0cmFuc2xhdGlvbiB0YWJsZSBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFR4VHJhbnNUYWJsZTRfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHBoeTI0OjU7ICAgLyoqPCBbMzEtMjddIFR4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNiAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkyNTo1OyAgIC8qKjwgWzI2LTIyXSBUeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDcgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MjY6NTsgICAvKio8IFsyMS0xN10gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA4ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6MTsgLyoqPCBbMTYtMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5Mjc6NTsgICAvKio8IFsxNS0xMV0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSAzICovCgogICAgdW5zaWduZWQgaW50IHBoeTI4OjU7ICAgLyoqPCBbMTAtNl0gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA0ICovCgogICAgdW5zaWduZWQgaW50IHBoeTI5OjU7ICAgLyoqPCBbNS0xXSBUeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDUgKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMjoxOyAgLyoqPCBbMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KICAgIH0gdXRUeFRyYW5zVGFibGU0OyAgLyoqPCBUeCB0cmFuc2xhdGlvbiB0YWJsZSAqLwoKICAgIC8qKgogICAgKiBAaW5ncm91cCBJeEF0bWRBY2NVdG9waWFDdHJsQVBJCiAgICAqIEBzdHJ1Y3QgVXRUeFRyYW5zVGFibGU1XwogICAgKiBAYnJpZWYgVXRvcGlhIFR4IHRyYW5zbGF0aW9uIHRhYmxlIFJlZ2lzdGVyCiAgICAqLwogICAgc3RydWN0IFV0VHhUcmFuc1RhYmxlNV8KICAgIHsKCiAgICB1bnNpZ25lZCBpbnQgcGh5MzA6NTsgICAvKio8IFszMS0yN10gVHggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA2ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6Mjc7ICAgICAvKio8IFsyNi0wXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwoKICAgIH0gdXRUeFRyYW5zVGFibGU1OyAgLyoqPCBUeCB0cmFuc2xhdGlvbiB0YWJsZSAqLwoKICAgIC8qKgogICAgKiBAaW5ncm91cCBJeEF0bWRBY2NVdG9waWFDdHJsQVBJCiAgICAqIEBzdHJ1Y3QgVXRSeENvbmZpZ18KICAgICogQGJyaWVmIFV0b3BpYSBSeCBjb25maWcgUmVnaXN0ZXIKICAgICovCiAgICBzdHJ1Y3QgVXRSeENvbmZpZ18KICAgIHsKCiAgICB1bnNpZ25lZCBpbnQgcnhJbnRlcmZhY2U6MTsgICAgLyoqPCBbMzFdIFV0b3BpYSBSZWNlaXZlIEludGVyZmFjZS4gVGhlIGZvbGxvd2luZyBlbmNvZGluZyBpcyB1c2VkCiB0byBzZXQgdGhlIFV0b3BpYSBSZWNlaXZlIGludGVyZmFjZSBhcyBBVE0gbWFzdGVyIG9yIFBIWSBzbGF2ZToKIEBsaSAxIC0gUEhZCiAgICBAbGkgMCAtIEFUTSAqLwoKICAgIHVuc2lnbmVkIGludCByeE1vZGU6MTsgICAgICAvKio8IFszMF0gVXRvcGlhIFJlY2VpdmUgTW9kZS4gVGhlIGZvbGxvd2luZyBlbmNvZGluZyBpcyB1c2VkIHRvIHNldAogICAgICB0aGUgVXRvcGlhIFJlY2VpdmUgbW9kZSB0byBTUEhZIG9yIE1QSFk6CiAgICAgIEBsaSAxIC0gU1BIWQogICAgQGxpIDAgLSBNUEhZICovCgogICAgdW5zaWduZWQgaW50IHJ4T2N0ZXQ6MTsgIC8qKjwgWzI5XSBVdG9waWEgUmVjZWl2ZSBjZWxsIHRyYW5zZmVyIHByb3RvY29sLiBVc2VkIHRvIHNldCB0aGUgVXRvcGlhCiAgY2VsbCB0cmFuc2ZlciBwcm90b2NvbCB0byBPY3RldC1sZXZlbCBoYW5kc2hha2luZy4gTm90ZSB0aGlzIGlzIG9ubHkKICBhcHBsaWNhYmxlIGluIFNQSFkgbW9kZS4KICBAbGkgMSAtIE9jdGV0LWhhbmRzaGFraW5nIGVuYWJsZWQKICAgIEBsaSAwIC0gQ2VsbC1oYW5kc2hha2luZyBlbmFibGVkICovCgogICAgdW5zaWduZWQgaW50IHJ4UGFyaXR5OjE7ICAgIC8qKjwgWzI4XSBVdG9waWEgUmVjZWl2ZSBQYXJpdHkgQ2hlY2tpbmcgZW5hYmxlLgogICAgQGxpIDEgLSBQYXJpdHkgY2hlY2tpbmcgZW5hYmxlZAogICAgQGxpIDAgLSBQYXJpdHkgY2hlY2tpbmcgZGlzYWJsZWQgKi8KCiAgICB1bnNpZ25lZCBpbnQgcnhFdmVuUGFyaXR5OjE7LyoqPCBbMjddIFV0b3BpYSBSZWNlaXZlIFBhcml0eSBNb2RlCiAgICBAbGkgMSAtIENoZWNrIGZvciBFdmVuIFBhcml0eQogICAgQGxpIDAgLSBDaGVjayBmb3IgT2RkIFBhcml0eS4qLwoKICAgIHVuc2lnbmVkIGludCByeEhFQzoxOyAgICAvKio8IFsyNl0gUnhIRUMgICAgSGVhZGVyIEVycm9yIENoZWNrIE1vZGUuIEVuYWJsZXMvZGlzYWJsZXMgY2VsbCBoZWFkZXIKICAgIGVycm9yIGNoZWNraW5nIG9uIHRoZSByZWNlaXZlZCBjZWxsIGhlYWRlci4KICAgIEBsaSAxIC0gSEVDIGNoZWNraW5nIGVuYWJsZWQKICAgIEBsaSAwIC0gSEVDIGNoZWNraW5nIGRpc2FibGVkICovCgogICAgdW5zaWduZWQgaW50IHJ4Q09TRVQ6MTsgIC8qKjwgWzI1XSBJZiBlbmFibGVkIHRoZSBIRUMgaXMgRXhjbHVzaXZlLU9SxmVkIHdpdGggdGhlIHZhbHVlIDB4NTUKICBiZWZvcmUgYmVpbmcgdGVzdGVkIHdpdGggdGhlIHJlY2VpdmVkIEhFQy4KICBAbGkgMSAtIEVuYWJsZSBIRUMgRXhPUiB3aXRoIHZhbHVlIDB4NTUuCiAgICBAbGkgMCAtIFVzZSBnZW5lcmF0ZWQgSEVDIHZhbHVlLiovCgogICAgdW5zaWduZWQgaW50IHJ4SEVDcGFzczoxOyAgICAvKio8IFsyNF0gU3BlY2lmaWVzIGlmIHRoZSBpbmNvbWluZyBjZWxsIEhFQyBieXRlIHNob3VsZCBiZSB0cmFuc2ZlcnJlZAogICAgIGFmdGVyIG9wdGlvbmFsIHByb2Nlc3NpbmcgdG8gdGhlIE5QRTIgQ29wcm9jZXNzb3IgQnVzIEludGVyZmFjZSBvcgogICAgIGlmIGl0IHNob3VsZCBiZSBkaXNjYXJkZWQuCiAgICAgQGxpIDEgLSBIRUMgbWFpbnRhaW5lZCA1My1ieXRlL1VEQyBjZWxsIHNlbnQgdG8gTlBFMi4KICAgIEBsaSAwIC0gSEVDIGRpc2NhcmRlZCA1Mi1ieXRlL1VEQyBjZWxsIHNlbnQgdG8gTlBFMiBjb3Byb2Nlc3Nvci4qLwoKICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8xOjE7ICAgIC8qKjwgWzIzXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwoKICAgIHVuc2lnbmVkIGludCByeENlbGxTaXplOjc7ICAgIC8qKjwgWzIyOjE2XSBSZWNlaXZlIGNlbGwgc2l6ZS4gQ29uZmlndXJlcyB0aGUgcmVjZWl2ZSBjZWxsIHNpemUuCiAgICAgIFZhbHVlcyBiZXR3ZWVuIDUyLTY0IGFyZSB2YWxpZCAqLwoKICAgIHVuc2lnbmVkIGludCByeEhhc2hFbmJHRkM6MTsgICAgICAvKio8IFsxNV0gU3BlY2lmaWVzIGlmIHRoZSBWUEkgZmllbGQgWzExOjhdL0dGQyBmaWVsZCBzaG91bGQgYmUKICAgICAgaW5jbHVkZWQgaW4gdGhlIEhhc2ggZGF0YSBpbnB1dCBvciBpZiB0aGUgYml0cyBzaG91bGQgYmUgcGFkZGVkCiAgICAgIHdpdGggMcZiMC4KICAgICAgQGxpIDEgLSBWUEkgWzExOjhdL0dGQyBmaWVsZCB2YWxpZCBhbmQgdXNlZCBpbiBIYXNoIHJlc2lkdWUgY2FsY3VsYXRpb24uCiAgICAgIEBsaSAwIC0gVlBJIFsxMTo4XS9HRkMgZmllbGQgcGFkZGVkIHdpdGggMcZiMCAqLwoKICAgIHVuc2lnbmVkIGludCByeFByZUhhc2g6MTsgLyoqPCBbMTRdIEVuYWJsZSBQcmUtaGFzaCB2YWx1ZSBnZW5lcmF0aW9uLiBTcGVjaWZpZXMgaWYgdGhlCiBpbmNvbWluZyBjZWxsIGRhdGEgc2hvdWxkIGJlIHByZS1oYXNoZWQgdG8gYWxsb3cgVlBJL1ZDSSBoZWFkZXIgbG9vay11cAogaW4gYSBoYXNoIHRhYmxlLgogQGxpIDEgLSBQcmUtaGFzaGluZyBlbmFibGVkCiAgICAgIEBsaSAwIC0gUHJlLWhhc2hpbmcgZGlzYWJsZWQgKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMjoxOyAgICAvKio8IFsxM10gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KCiAgICB1bnNpZ25lZCBpbnQgcnhBZGRyUmFuZ2U6NTsgICAgIC8qKjwgWzEyOjhdIEluIEFUTSBtYXN0ZXIsIE1QSFkgbW9kZSwKICAgICAqIHRoaXMgcmVnaXN0ZXIgc3BlY2lmaWVzIHRoZSB1cHBlcgogICAgICogbGltaXQgb2YgdGhlIFBIWSBwb2xsaW5nIGxvZ2ljYWwgcmFuZ2UuIFRoZSBudW1iZXIgb2YgYWN0aXZlIFBIWXMgYXJlCiAgICAgKiBSeEFkZHJSYW5nZSArIDEuCiAgICAgKi8KICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8zOjM7ICAgIC8qKjwgWzctNV0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgLiovCiAgICB1bnNpZ25lZCBpbnQgcnhQSFlBZGRyOjU7ICAgICAvKio8IFs0OjBdIFdoZW4gY29uZmlndXJlZCBhcyBhIHNsYXZlIGluIGFuIE1QSFkgc3lzdGVtIHRoaXMgcmVnaXN0ZXIKICAgICAgKiBzcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFBIWS4KICAgICAgKi8KICAgIH0gdXRSeENvbmZpZzsgIC8qKjwgUnggY29uZmlnIFV0b3BpYSByZWdpc3RlciAqLwoKICAgICAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAgICAgKiBAc3RydWN0IFV0UnhTdGF0c0NvbmZpZ18KICAgICAgKiBAYnJpZWYgVXRvcGlhIFJ4IHN0YXRzIGNvbmZpZyBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFJ4U3RhdHNDb25maWdfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHZwaToxMjsgIC8qKjwgWzMxOjIwXSBBVE0gVlBJICAgIFZQSSBbMTE6MF0gT1IgR0ZDIFszOjBdIGFuZCBWUEkgWzc6MF0KICAgIEBsaSBOb3RlOiBpZiBWQ1N0YXRzUnhHRkMgaXMgc2V0IHRvIDAgdGhlIEdGQyBmaWVsZCBpcyBpZ25vcmVkIGluIHRlc3QuICovCgogICAgdW5zaWduZWQgaW50IHZjaToxNjsgIC8qKjwgWzE5OjRdIFZDSSBbMTU6MF0gb3IgUEhZIEFkZHJlc3MgWzRdICovCgogICAgdW5zaWduZWQgaW50IHB0aTozOyAgLyoqPCBbMzoxXSBQVEkgWzI6MF0gb3Igb3IgUEhZIEFkZHJlc3MgWzM6MV0KICBAbGkgTm90ZTogaWYgVkNTdGF0c1J4UFRJIGlzIHNldCB0byAwIHRoZSBQVEkgZmllbGQgaXMgaWdub3JlZCBpbiB0ZXN0LgogIEBsaSBOb3RlOiBpZiBWQ1N0YXRzUnhFbmIgaXMgc2V0IHRvIDAgb25seSB0aGUgUEhZIHBvcnQgYWRkcmVzcyBpcyB1c2VkCiAgZm9yIHN0YXRpc3RpY3MgZ2F0aGVyaW5nLi4gKi8KCiAgICB1bnNpZ25lZCBpbnQgY2xwOjE7ICAvKio8IFswXSBDTFAgWzBdIG9yIFBIWSBBZGRyZXNzIFswXQogIEBsaSBOb3RlOiBpZiBWQ1N0YXRzUnhDTFAgaXMgc2V0IHRvIDAgdGhlIENMUCBmaWVsZCBpcyBpZ25vcmVkIGluIHRlc3QuCiAgQGxpIE5vdGU6IGlmIFZDU3RhdHNSeEVuYiBpcyBzZXQgdG8gMCBvbmx5IHRoZSBQSFkgcG9ydCBhZGRyZXNzIGlzIHVzZWQKICBmb3Igc3RhdGlzdGljcyBnYXRoZXJpbmcuLiAqLwogICAgfSB1dFJ4U3RhdHNDb25maWc7ICAvKio8IFJ4IHN0YXRzIGNvbmZpZyBVdG9waWEgcmVnaXN0ZXIgKi8KCiAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAqIEBzdHJ1Y3QgVXRSeERlZmluZUlkbGVfCiAgKiBAYnJpZWYgVXRvcGlhIFJ4IGlkbGUgY2VsbHMgY29uZmlnIFJlZ2lzdGVyCiAgICAqLwogICAgc3RydWN0IFV0UnhEZWZpbmVJZGxlXwogICAgewoKICAgIHVuc2lnbmVkIGludCB2cGk6MTI7ICAvKio8IFszMToyMF0gQVRNIFZQSSBbMTE6MF0gT1IgR0ZDIFszOjBdIGFuZCBWUEkgWzc6MF0KICAgIEBsaSBOb3RlOiBpZiBWQ0lkbGVSeEdGQyBpcyBzZXQgdG8gMCB0aGUgR0ZDIGZpZWxkIGlzIGlnbm9yZWQgaW4gdGVzdC4gKi8KCiAgICB1bnNpZ25lZCBpbnQgdmNpOjE2OyAgLyoqPCBbMTk6NF0gQVRNIFZDSSBbMTU6MF0gKi8KCiAgICB1bnNpZ25lZCBpbnQgcHRpOjM7ICAvKio8IFszOjFdIEFUTSBQVEkgUFRJIFsyOjBdCiAgQGxpIE5vdGU6IGlmIFZDSWRsZVJ4UFRJIGlzIHNldCB0byAwIHRoZSBQVEkgZmllbGQgaXMgaWdub3JlZCBpbiB0ZXN0LiovCgogICAgdW5zaWduZWQgaW50IGNscDoxOyAgLyoqPCBbMF0gQVRNIENMUCBbMF0KICBAbGkgTm90ZTogaWYgVkNJZGxlUnhDTFAgaXMgc2V0IHRvIDAgdGhlIENMUCBmaWVsZCBpcyBpZ25vcmVkIGluIHRlc3QuKi8KICAgIH0gdXRSeERlZmluZUlkbGU7ICAgICAgLyoqPCBSeCBpZGxlIGNlbGwgY29uZmlnIFV0b3BpYSByZWdpc3RlciAqLwoKICAgICAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAgICAgKiBAc3RydWN0IFV0UnhFbmFibGVGaWVsZHNfCiAgICAgICogQGJyaWVmIFV0b3BpYSBSeCBlbmFibGUgUmVnaXN0ZXIKICAgICovCiAgICBzdHJ1Y3QgVXRSeEVuYWJsZUZpZWxkc18KICAgIHsKCiAgICB1bnNpZ25lZCBpbnQgZGVmaW5lUnhJZGxlR0ZDOjE7LyoqPCBbMzFdIFRoaXMgcmVnaXN0ZXIgaXMgdXNlZCB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlIEdGQwogZmllbGQgb2YgdGhlIEFUTSBoZWFkZXIgd2hlbiB0ZXN0aW5nIGZvciBJZGxlIGNlbGxzLgogQGxpIDEgLSBHRkMgZmllbGQgaXMgdmFsaWQuCiAgICBAbGkgMCAtIEdGQyBmaWVsZCBpZ25vcmVkLiovCgogICAgdW5zaWduZWQgaW50IGRlZmluZVJ4SWRsZVBUSToxOy8qKjwgWzMwXSBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZSBQVEkKIGZpZWxkIG9mIHRoZSBBVE0gaGVhZGVyIHdoZW4gdGVzdGluZyBmb3IgSWRsZSBjZWxscy4KIEBsaSAxIC0gUFRJIGZpZWxkIGlzIHZhbGlkLgogICAgQGxpIDAgLSBQVEkgZmllbGQgaWdub3JlZC4qLwoKICAgIHVuc2lnbmVkIGludCBkZWZpbmVSeElkbGVDTFA6MTsvKio8IFsyOV0gVGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGUgQ0xQCiBmaWVsZCBvZiB0aGUgQVRNIGhlYWRlciB3aGVuIHRlc3RpbmcgZm9yIElkbGUgY2VsbHMuCiBAbGkgMSAtIENMUCBmaWVsZCBpcyB2YWxpZC4KICAgIEBsaSAgICAwIC0gQ0xQIGZpZWxkIGlnbm9yZWQuKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5U3RhdHNSeEVuYjoxOy8qKjwgWzI4XSBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgQVRNIHN0YXRpc3RpY3MKICAgICBnYXRoZXJpbmcgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBQSFkgYWRkcmVzcyBhcyBkZWZpbmVkIGluIFJ4U3RhdHNDb25maWcKICAgICByZWdpc3Rlci4KICAgICBAbGkgMSAtIEVuYWJsZSBzdGF0aXN0aWNzIGZvciBzcGVjaWZpZWQgcmVjZWl2ZSBQSFkgYWRkcmVzcy4KICAgIEBsaSAwIC0gRGlzYWJsZSBzdGF0aXN0aWNzIGZvciBzcGVjaWZpZWQgcmVjZWl2ZSBQSFkgYWRkcmVzcy4qLwoKICAgIHVuc2lnbmVkIGludCB2Y1N0YXRzUnhFbmI6MTsvKio8IFsyN10gVGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIEFUTSBzdGF0aXN0aWNzCiAgICBnYXRoZXJpbmcgYmFzZWQgb24gYSBzcGVjaWZpYyBWUEkvVkNJIGFkZHJlc3MuCiAgICBAbGkgMSAtIEVuYWJsZSBzdGF0aXN0aWNzIGZvciBzcGVjaWZpZWQgVlBJL1ZDSSBhZGRyZXNzLgogICAgQGxpIDAgLSBEaXNhYmxlIHN0YXRpc3RpY3MgZm9yIHNwZWNpZmllZCBWUEkvVkNJIGFkZHJlc3MuKi8KCiAgICB1bnNpZ25lZCBpbnQgdmNTdGF0c1J4R0ZDOjE7LyoqPCBbMjZdIFRoaXMgcmVnaXN0ZXIgaXMgdXNlZCB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlIEdGQyBmaWVsZAogICAgb2YgdGhlIEFUTSBoZWFkZXIgd2hlbiBBVE0gVlBJL1ZDSSBzdGF0aXN0aWNzIGFyZSBlbmFibGVkLiBHRkMgaXMgb25seQogICAgYXZhaWxhYmxlIGF0IHRoZSBVTkkgYW5kIHVzZXMgdGhlIGZpcnN0IDQtYml0cyBvZiB0aGUgVlBJIGZpZWxkLgogICAgQGxpIDEgLSBHRkMgZmllbGQgaXMgdmFsaWQuCiAgICBAbGkgMCAtIEdGQyBmaWVsZCBpZ25vcmVkLiAqLwoKICAgIHVuc2lnbmVkIGludCB2Y1N0YXRzUnhQVEk6MTsvKio8IFsyNV0gVGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGUgUFRJIGZpZWxkCiAgICBvZiB0aGUgQVRNIGhlYWRlciB3aGVuIEFUTSBWUEkvVkNJIHN0YXRpc3RpY3MgYXJlIGVuYWJsZWQuCiAgICBAbGkgMSAtIFBUSSBmaWVsZCBpcyB2YWxpZC4KICAgIEBsaSAwIC0gUFRJIGZpZWxkIGlnbm9yZWQuKi8KCiAgICB1bnNpZ25lZCBpbnQgdmNTdGF0c1J4Q0xQOjE7LyoqPCBbMjRdIFRoaXMgcmVnaXN0ZXIgaXMgdXNlZCB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlIENMUCBmaWVsZAogICAgb2YgdGhlIEFUTSBoZWFkZXIgd2hlbiBBVE0gVlBJL1ZDSSBzdGF0aXN0aWNzIGFyZSBlbmFibGVkLgogICAgQGxpIDEgLSBDTFAgZmllbGQgaXMgdmFsaWQuCiAgICBAbGkgMCAtIENMUCBmaWVsZCBpZ25vcmVkLiAqLwoKICAgIHVuc2lnbmVkIGludCBkaXNjYXJkSGVjRXJyOjE7LyoqPCBbMjNdIERpc2NhcmQgY2VsbHMgd2l0aCBhbiBpbnZhbGlkIEhFQy4KICAgICBAbGkgMSAtIERpc2NhcmQgY2VsbHMgd2l0aCBIRUMgZXJyb3JzCiAgICBAbGkgMCAtIENlbGxzIHdpdGggSEVDIGVycm9ycyBhcmUgcGFzc2VkICovCgogICAgdW5zaWduZWQgaW50IGRpc2NhcmRQYXJFcnI6MTsvKio8IFsyMl0gRGlzY2FyZCBjZWxscyBjb250YWluaW5nIHBhcml0eSBlcnJvcnMuCiAgICAgQGxpIDEgLSBEaXNjYXJkIGNlbGxzIHdpdGggcGFyaXR5IGVycm9ycwogICAgQGxpIDAgLSBDZWxscyB3aXRoIHBhcml0eSBlcnJvcnMgYXJlIHBhc3NlZCAqLwoKICAgIHVuc2lnbmVkIGludCBkaXNjYXJkSWRsZToxOyAgICAvKio8IFsyMV0gRGlzY2FyZCBJZGxlIENlbGxzIGJhc2VkIG9uIERlZmluZUlkbGUgcmVnaXN0ZXIgdmFsdWVzCiBAbGkgICAgMSAtIERpc2NhcmQgSURMRSBjZWxscwogICAgQGxpIDAgLSBJRExFIGNlbGxzIHBhc3NlZCAqLwoKICAgIHVuc2lnbmVkIGludCBlbmJIZWNFcnJDbnQ6MTsvKio8IFsyMF0gRW5hYmxlIFJlY2VpdmUgSEVDIEVycm9yIENvdW50LgogICAgQGxpIDEgLSBFbmFibGUgY291bnQgb2YgcmVjZWl2ZWQgY2VsbHMgY29udGFpbmluZyBIRUMgZXJyb3JzCiAgICBAbGkgMCAtIE5vIGNvdW50IGlzIG1haW50YWluZWQuICovCgogICAgdW5zaWduZWQgaW50IGVuYlBhckVyckNudDoxOy8qKjwgWzE5XSBFbmFibGUgUGFyaXR5IEVycm9yIENvdW50CiAgICBAbGkgICAgMSAtIEVuYWJsZSBjb3VudCBvZiByZWNlaXZlZCBjZWxscyBjb250YWluaW5nIFBhcml0eSBlcnJvcnMKICAgIEBsaSAwIC0gTm8gY291bnQgaXMgbWFpbnRhaW5lZC4gKi8KCiAgICB1bnNpZ25lZCBpbnQgZW5iSWRsZUNlbGxDbnQ6MTsvKio8IFsxOF0gRW5hYmxlIFJlY2VpdmUgSWRsZSBDZWxsIENvdW50LgogICAgICBAbGkgMSAtIEVuYWJsZSBjb3VudCBvZiBJZGxlIGNlbGxzIHJlY2VpdmVkLgogICAgQGxpIDAgLSBObyBjb3VudCBpcyBtYWludGFpbmVkLiovCgogICAgdW5zaWduZWQgaW50IGVuYlNpemVFcnJDbnQ6MTsvKio8IFsxN10gRW5hYmxlIFJlY2VpdmUgU2l6ZSBFcnJvciBDb3VudC4KICAgICBAbGkgMSAtIEVuYWJsZSBjb3VudCBvZiByZWNlaXZlZCBjZWxscyBvZiBpbmNvcnJlY3Qgc2l6ZQogICAgQGxpICAgIDAgLSBObyBjb3VudCBpcyBtYWludGFpbmVkLiAqLwoKICAgIHVuc2lnbmVkIGludCBlbmJSeENlbGxDbnQ6MTsvKio8IFsxNl0gRW5hYmxlIFJlY2VpdmUgVmFsaWQgQ2VsbCBDb3VudCBvZiBub24taWRsZS9ub24tZXJyb3IgY2VsbHMuCiAgICBAbGkgICAgMSAtIEVuYWJsZSBjb3VudCBvZiB2YWxpZCBjZWxscyByZWNlaXZlZCAtIG5vbi1pZGxlL25vbi1lcnJvcgogICAgQGxpIDAgLSBObyBjb3VudCBpcyBtYWludGFpbmVkLiAqLwoKICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8xOjM7ICAgIC8qKjwgWzE1OjEzXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwoKICAgIHVuc2lnbmVkIGludCByeENlbGxPdnJJbnQ6MTsgICAgICAvKio8IFsxMl0gRW5hYmxlIENCSSBVdG9waWEgUmVjZWl2ZSBTdGF0dXMgQ29uZGl0aW9uIGlmIHRoZSBSeENlbGxDb3VudAogICAgICByZWdpc3RlciBvdmVyZmxvd3MuCiAgICAgIEBsaSAxIC0gQ0JJIFJlY2VpdmUgU3RhdHVzIGFzc2VydGVkLgogICAgICBAbGkgICAgMCAtIE5vIENCSSBSZWNlaXZlIFN0YXR1cyBhc3NlcnRlZC4qLwoKICAgIHVuc2lnbmVkIGludCBpbnZhbGlkSGVjT3ZySW50OjE7ICAvKio8IFsxMV0gRW5hYmxlIENCSSBSZWNlaXZlIFN0YXR1cyBDb25kaXRpb24gaWYgdGhlIEludmFsaWRIZWNDb3VudAogICAgcmVnaXN0ZXIgb3ZlcmZsb3dzLgogICAgQGxpICAgIDEgLSBDQkkgUmVjZWl2ZSBDb25kaXRpb24gYXNzZXJ0ZWQuCiAgICAgIEBsaSAwIC0gTm8gQ0JJIFJlY2VpdmUgQ29uZGl0aW9uIGFzc2VydGVkICovCgogICAgdW5zaWduZWQgaW50IGludmFsaWRQYXJPdnJJbnQ6MTsgIC8qKjwgWzEwXSBFbmFibGUgQ0JJIFJlY2VpdmUgU3RhdHVzIENvbmRpdGlvbiBpZiB0aGUgSW52YWxpZFBhckNvdW50CiAgICByZWdpc3RlciBvdmVyZmxvd3MKICAgIEBsaSAgICAxIC0gQ0JJIFJlY2VpdmUgQ29uZGl0aW9uIGFzc2VydGVkLgogICAgICBAbGkgMCAtIE5vIENCSSBSZWNlaXZlIENvbmRpdGlvbiBhc3NlcnRlZCAqLwoKICAgIHVuc2lnbmVkIGludCBpbnZhbGlkU2l6ZU92ckludDoxOyAgIC8qKjwgWzldIEVuYWJsZSBDQkkgUmVjZWl2ZSBTdGF0dXMgQ29uZGl0aW9uIGlmIHRoZSBJbnZhbGlkU2l6ZUNvdW50CiAgICAgcmVnaXN0ZXIgb3ZlcmZsb3dzLgogICAgIEBsaSAxIC0gQ0JJIFJlY2VpdmUgU3RhdHVzIENvbmRpdGlvbiBhc3NlcnRlZC4KICAgICAgQGxpuDAgLSBObyBDQkkgUmVjZWl2ZSBTdGF0dXMgYXNzZXJ0ZWQgKi8KCiAgICB1bnNpZ25lZCBpbnQgcnhJZGxlT3ZySW50OjE7ICAgICAgLyoqPCBbOF0gRW5hYmxlIENCSSBSZWNlaXZlIFN0YXR1cyBDb25kaXRpb24gaWYgdGhlIFJ4SWRsZUNvdW50IG92ZXJmbG93cy4KICAgICAgQGxpICAgIDEgLSBDQkkgUmVjZWl2ZSBDb25kaXRpb24gYXNzZXJ0ZWQuCiAgICAgIEBsaSAwIC0gTm8gQ0JJIFJlY2VpdmUgQ29uZGl0aW9uIGFzc2VydGVkICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzI6MzsgICAgLyoqPCBbNzo1XSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwoKICAgIHVuc2lnbmVkIGludCByeEFkZHJNYXNrOjU7ICAgIC8qKjwgWzQ6MF0gVGhpcyByZWdpc3RlciBpcyB1c2VkIGFzIGEgbWFzayB0byBhbGxvdyB0aGUgdXNlciB0byBpbmNyZWFzZQogICAgdGhlIFBIWSByZWNlaXZlIGFkZHJlc3MgcmFuZ2UuIFRoZSByZWdpc3RlciBzaG91bGQgYmUgcHJvZ3JhbW1lZCB3aXRoCiAgICB0aGUgYWRkcmVzcy1yYW5nZSBsaW1pdCwgaS5lLiBpZiBzZXQgdG8gMHgzIHRoZSBhZGRyZXNzIHJhbmdlIGluY3JlYXNlcwogIHRvIGEgbWF4aW11bSBvZiA0IGFkZHJlc3Nlcy4gKi8KICAgIH0gdXRSeEVuYWJsZUZpZWxkczsgICAgICAvKio8IFJ4IGVuYWJsZSBVdG9waWEgcmVnaXN0ZXIgKi8KCiAgICAgIC8qKgogICAgKiBAaW5ncm91cCBJeEF0bWRBY2NVdG9waWFDdHJsQVBJCiAgICAgICogQHN0cnVjdCBVdFJ4VHJhbnNUYWJsZTBfCiAgICAgICogQGJyaWVmIFV0b3BpYSBSeCB0cmFuc2xhdGlvbiB0YWJsZSBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFJ4VHJhbnNUYWJsZTBfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHBoeTA6NTsgIC8qKjwgWzMxLTI3XSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDAgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MTo1OyAgLyoqPCBbMjYtMjJdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgMSAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkyOjU7ICAvKio8IFsyMS0xN10gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSAyICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6MTsgIC8qKjwgWzE2XSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkzOjU7ICAvKio8IFsxNS0xMV0gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSAzICovCgogICAgdW5zaWduZWQgaW50IHBoeTQ6NTsgIC8qKjwgWzEwLTZdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNCAqLwoKICAgIHVuc2lnbmVkIGludCBwaHk1OjU7ICAvKio8IFs1LTFdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNSAqLwoKICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8yOjE7ICAvKio8IFswXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwogICAgfQoKICAgIHV0UnhUcmFuc1RhYmxlMDsgIC8qKjwgUnggdHJhbnNsYXRpb24gdGFibGUgKi8KCiAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAqIEBzdHJ1Y3QgVXRSeFRyYW5zVGFibGUxXwogICogQGJyaWVmIFV0b3BpYSBSeCB0cmFuc2xhdGlvbiB0YWJsZSBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFJ4VHJhbnNUYWJsZTFfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHBoeTY6NTsgIC8qKjwgWzMxLTI3XSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDYgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5Nzo1OyAgLyoqPCBbMjYtMjJdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNyAqLwoKICAgIHVuc2lnbmVkIGludCBwaHk4OjU7ICAvKio8IFsyMS0xN10gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA4ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6MTsgLyoqPCBbMTYtMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5OTo1OyAgLyoqPCBbMTUtMTFdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgMyAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxMDo1OyAgIC8qKjwgWzEwLTZdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNCAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxMTo1OyAgIC8qKjwgWzUtMV0gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA1ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzI6MTsgIC8qKjwgWzBdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwICovCiAgICB9CgogICAgdXRSeFRyYW5zVGFibGUxOyAgLyoqPCBSeCB0cmFuc2xhdGlvbiB0YWJsZSAqLwoKICAgIC8qKgogICAgKiBAaW5ncm91cCBJeEF0bWRBY2NVdG9waWFDdHJsQVBJCiAgICAqIEBzdHJ1Y3QgVXRSeFRyYW5zVGFibGUyXwogICAgKiBAYnJpZWYgVXRvcGlhIFJ4IHRyYW5zbGF0aW9uIHRhYmxlIFJlZ2lzdGVyCiAgICAqLwogICAgc3RydWN0IFV0UnhUcmFuc1RhYmxlMl8KICAgIHsKCiAgICB1bnNpZ25lZCBpbnQgcGh5MTI6NTsgICAvKio8IFszMS0yN10gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA2ICovCgogICAgdW5zaWduZWQgaW50IHBoeTEzOjU7ICAgLyoqPCBbMjYtMjJdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNyAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxNDo1OyAgIC8qKjwgWzIxLTE3XSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDggKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMToxOyAvKio8IFsxNi0wXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxNTo1OyAgIC8qKjwgWzE1LTExXSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDMgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MTY6NTsgICAvKio8IFsxMC02XSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDQgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MTc6NTsgICAvKio8IFs1LTFdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNSAqLwoKICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8yOjE7ICAvKio8IFswXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwogICAgfSB1dFJ4VHJhbnNUYWJsZTI7ICAgIC8qKjwgUnggdHJhbnNsYXRpb24gdGFibGUgKi8KCiAgICAvKioKICAgICogQGluZ3JvdXAgSXhBdG1kQWNjVXRvcGlhQ3RybEFQSQogICAgKiBAc3RydWN0IFV0UnhUcmFuc1RhYmxlM18KICAgICogQGJyaWVmIFV0b3BpYSBSeCB0cmFuc2xhdGlvbiB0YWJsZSBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFJ4VHJhbnNUYWJsZTNfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHBoeTE4OjU7ICAgLyoqPCBbMzEtMjddIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNiAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkxOTo1OyAgIC8qKjwgWzI2LTIyXSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDcgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MjA6NTsgICAvKio8IFsyMS0xN10gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA4ICovCgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6MTsgLyoqPCBbMTYtMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5MjE6NTsgICAvKio8IFsxNS0xMV0gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSAzICovCgogICAgdW5zaWduZWQgaW50IHBoeTIyOjU7ICAgLyoqPCBbMTAtNl0gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA0ICovCgogICAgdW5zaWduZWQgaW50IHBoeTIzOjU7ICAgLyoqPCBbNS0xXSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDUgKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMjoxOyAgLyoqPCBbMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KICAgIH0gdXRSeFRyYW5zVGFibGUzOyAgLyoqPCBSeCB0cmFuc2xhdGlvbiB0YWJsZSAqLwoKICAgIC8qKgogICAgKiBAaW5ncm91cCBJeEF0bWRBY2NVdG9waWFDdHJsQVBJCiAgICAqIEBzdHJ1Y3QgVXRSeFRyYW5zVGFibGU0XwogICAgKiBAYnJpZWYgVXRvcGlhIFJ4IHRyYW5zbGF0aW9uIHRhYmxlIFJlZ2lzdGVyCiAgICAqLwogICAgc3RydWN0IFV0UnhUcmFuc1RhYmxlNF8KICAgIHsKCiAgICB1bnNpZ25lZCBpbnQgcGh5MjQ6NTsgICAvKio8IFszMS0yN10gUnggTWFwcGluZyB2YWx1ZSBvZiBsb2dpY2FsIHBoeSA2ICovCgogICAgdW5zaWduZWQgaW50IHBoeTI1OjU7ICAgLyoqPCBbMjYtMjJdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNyAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkyNjo1OyAgIC8qKjwgWzIxLTE3XSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDggKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMToxOyAvKio8IFsxNi0wXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwoKICAgIHVuc2lnbmVkIGludCBwaHkyNzo1OyAgIC8qKjwgWzE1LTExXSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDMgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5Mjg6NTsgICAvKio8IFsxMC02XSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDQgKi8KCiAgICB1bnNpZ25lZCBpbnQgcGh5Mjk6NTsgICAvKio8IFs1LTFdIFJ4IE1hcHBpbmcgdmFsdWUgb2YgbG9naWNhbCBwaHkgNSAqLwoKICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF8yOjE7ICAvKio8IFswXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwogICAgfSB1dFJ4VHJhbnNUYWJsZTQ7ICAvKio8IFJ4IHRyYW5zbGF0aW9uIHRhYmxlICovCgogICAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAgICogQHN0cnVjdCBVdFJ4VHJhbnNUYWJsZTVfCiAgICAqIEBicmllZiBVdG9waWEgUnggdHJhbnNsYXRpb24gdGFibGUgUmVnaXN0ZXIKICAgICovCiAgICBzdHJ1Y3QgVXRSeFRyYW5zVGFibGU1XwogICAgewoKICAgIHVuc2lnbmVkIGludCBwaHkzMDo1OyAgIC8qKjwgWzMxLTI3XSBSeCBNYXBwaW5nIHZhbHVlIG9mIGxvZ2ljYWwgcGh5IDYgKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMToyNzsgICAgIC8qKjwgWzI2LTBdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwICovCgogICAgfSB1dFJ4VHJhbnNUYWJsZTU7ICAvKio8IFJ4IHRyYW5zbGF0aW9uIHRhYmxlICovCgogICAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAgICogQHN0cnVjdCBVdFN5c0NvbmZpZ18KICAgICogQGJyaWVmIE5QRSBzZXR1cCBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFN5c0NvbmZpZ18KICAgIHsKCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMToyOyAgICAgLyoqPCBbMzEtMzBdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwICovCiAgICB1bnNpZ25lZCBpbnQgdHhFbmJGU006MTsgICAgLyoqPCBbMjldIEVuYWJsZXMgdGhlIG9wZXJhdGlvbiBvZnRoZSBVdG9waWEgVHJhbnNtaXQgRlNNCiAgICogQGxpIDEgLSBGU00gZW5hYmxlZAogICAqIEBsaSAwIC0gRlNNIGluYWN0aXZlCiAgICovCiAgICB1bnNpZ25lZCBpbnQgcnhFbmJGU006MTsgICAgLyoqPCBbMjhdIEVuYWJsZXMgdGhlIG9wZXJhdGlvbiBvZnRoZSBVdG9waWEgUmV2aWV2ZSBGU00KICAgKiBAbGkgMSAtIEZTTSBlbmFibGVkCiAgICogQGxpIDAgLSBGU00gaW5hY3RpdmUKICAgKi8KICAgIHVuc2lnbmVkIGludCBkaXNhYmxlUGluczoxOyAgICAvKio8IFsyN10gRGlzYWJsZSBVdG9waWEgaW50ZXJmYWNlIEkvTyBwaW5zIGZvcmNpbmcgdGhlIHNpZ25hbHMgdG8gYW4KICAgKiBpbmFjdGl2ZSBzdGF0ZS4gIE5vdGUgdGhhdCB0aGlzIGJpdCBpcyBzZXQgb24gcmVzZXQgYW5kIG11c3QgYmUKICAgKiBkZS1hc3NlcnRlZAogICAqIEBsaSAwIC0gTm9ybWFsIGRhdGEgdHJhbnNmZXIKICAgKiBAbGkgICAgMSAtIFV0b3BpYSBpbnRlcmZhY2UgcGlucyBhcmUgZm9yY2VkIGluYWN0aXZlCiAgICAqLwogICAgdW5zaWduZWQgaW50IHRzdExvb3A6MTsgICAgLyoqPCBbMjZdIFRlc3QgTG9vcCBCYWNrIEVuYWJsZS4KICAgICogQGxpIE5vdGU6IEZvciBsb29wIGJhY2sgdG8gZnVuY3Rpb24gUnhNb2RlIGFuZCBUeCBNb2RlIG11c3QgYm90aCBiZSBzZXQKICAgICogdG8gc2luZ2xlIFBIWSBtb2RlLgogICAgKiBAbGkgMCAtIExvb3AgYmFjawogICAgKiBAbGkgMSAtIE5vcm1hbCBvcGVyYXRpbmcgbW9kZQogICAgKi8KCiAgICB1bnNpZ25lZCBpbnQgdHhSZXNldDoxOyAgIC8qKjwgWzI1XSBSZXNldHMgdGhlIFV0b3BpYSBDb3Byb2Nlc3NvciB0cmFuc21pdCBtb2R1bGUgdG8gYSBrbm93biBzdGF0ZS4KICAgICogQGxpIE5vdGU6IEFsbCB0cmFuc21pdCBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMgcmVnaXN0ZXJzIHdpbGwgYmUgcmVzZXQKICAgICogdG8gdGhlaXIgcmVzZXQgdmFsdWVzLgogICAgKiBAbGkgMCAtIE5vcm1hbCBvcGVyYXRpbmcgbW9kZbgKICAgICogQGxpIDEgLSBSZXNldCB0cmFuc21pdCBtb2R1bGVzCiAgICAqLwoKICAgIHVuc2lnbmVkIGludCByeFJlc2V0OjE7ICAgLyoqPCBbMjRdIFJlc2V0cyB0aGUgVXRvcGlhIENvcHJvY2Vzc29yIHJlY2VpdmUgbW9kdWxlIHRvIGEga25vd24gc3RhdGUuCiAgICAqIEBsaSBOb3RlOiBBbGwgcmVjZWl2ZSBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMgcmVnaXN0ZXJzIHdpbGwgYmUgcmVzZXQKICAgICogdG8gdGhlaXIgcmVzZXQgdmFsdWVzLgogICAgKiBAbGkgICAgMCAtIE5vcm1hbCBvcGVyYXRpbmcgbW9kZQogICAgKiBAbGkgMSAtIFJlc2V0IHJlY2VpdmUgbW9kdWxlcwogICAgKi8KCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMjoyNDsgICAgIC8qKjwgWzIzLTBdIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwICovCiAgICB9IHV0U3lzQ29uZmlnOyAgLyoqPCBOUEUgZGVidWcgY29uZmlnICovCgp9Ckl4QXRtZEFjY1V0b3BpYUNvbmZpZzsKCi8qKgoqCiogQGJyaWVmIFV0b3BpYSBzdGF0dXMKKgoqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2V0L2dldCB0aGUgVXRvcGlhIHN0YXR1cyBwYXJhbWV0ZXJzCiogQGxpIGNvbnRhaW5zIGRlYnVnIGNlbGwgY291bnRlcnMsIHRvIGJlIGFjY2Vzc2VkIGR1cmluZyBhIHJlYWQgb3BlcmF0aW9uCioKKiBAbm90ZSAtIHRoZSBleGFjdCBkZXNjcmlwdGlvbiBvZiBhbGwgcGFyYW1ldGVycyBpcyBkb25lIGluIHRoZSBVdG9waWEgcmVmZXJlbmNlCiogICBkb2N1bWVudHMuCioKKi8KdHlwZWRlZiBzdHJ1Y3QKewoKICAgIHVuc2lnbmVkIGludCB1dFR4Q2VsbENvdW50OyAgLyoqPCBjb3VudCBvZiBjZWxscyB0cmFuc21pdHRlZCAqLwoKICAgIHVuc2lnbmVkIGludCB1dFR4SWRsZUNlbGxDb3VudDsgICAgLyoqPCBjb3VudCBvZiBpZGxlIGNlbGxzIHRyYW5zbWl0dGVkICovCgogICAgLyoqCiAgICAqIEBpbmdyb3VwIEl4QXRtZEFjY1V0b3BpYUN0cmxBUEkKICAgICogQHN0cnVjdCBVdFR4Q2VsbENvbmRpdGlvblN0YXR1c18KICAgICogQGJyaWVmIFV0b3BpYSBUeCBTdGF0dXMgUmVnaXN0ZXIKICAgICovCiAgICBzdHJ1Y3QgVXRUeENlbGxDb25kaXRpb25TdGF0dXNfCiAgICB7CgogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzE6MjsgICAvKio8IFszMTozMF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KICAgIHVuc2lnbmVkIGludCB0eEZJRk8yVW5kZXJmbG93OjE7IC8qKjwgWzI5XSBUaGlzIGJpdCBpcyBzZXQgaWYgNjQtYnl0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUcmFuc21pdCBGSUZPMiBpbmRpY2F0ZXMgYSBGSUZPIHVuZGVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBlcnJvciBjb25kaXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgaW50IHR4RklGTzFVbmRlcmZsb3c6MTsgLyoqPCBbMjhdIFRoaXMgYml0IGlzIHNldCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiA2NC1ieXRlIFRyYW5zbWl0IEZJRk8xIGluZGljYXRlcyBhIEZJRk8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdW5kZXJmbG93IGVycm9yIGNvbmRpdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgdHhGSUZPMk92ZXJmbG93OjE7ICAvKio8IFsyN10gVGhpcyBiaXQgaXMgc2V0IGlmIDY0LWJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHJhbnNtaXQgRklGTzIgaW5kaWNhdGVzIGEgRklGTyBvdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBlcnJvciBjb25kaXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgaW50IHR4RklGTzFPdmVyZmxvdzoxOyAvKio8IFsyNl0gVGhpcyBiaXQgaXMgc2V0IGlmIDY0LWJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUcmFuc21pdCBGSUZPMSBpbmRpY2F0ZXMgYSBGSUZPIG92ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZXJyb3IgY29uZGl0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgaW50IHR4SWRsZUNlbGxDb3VudE92cjoxOyAvKio8IFsyNV0gVGhpcyBiaXQgaXMgc2V0IGlmIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR4SWRsZUNlbGxDb3VudCByZWdpc3RlciBvdmVyZmxvd3MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgdHhDZWxsQ291bnRPdnI6MTsgLyoqPCBbMjRdIFRoaXMgYml0IGlzIHNldCBpZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR4Q2VsbENvdW50IHJlZ2lzdGVyIG92ZXJmbG93cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMjoyNDsgICAgLyoqPCBbMjM6MF0gVGhlc2UgYml0cyBhcmUgYWx3YXlzIDAgKi8KICAgIH0gdXRUeENlbGxDb25kaXRpb25TdGF0dXM7ICAgIC8qKjwgVHggY2VsbHMgY29uZGl0aW9uIHN0YXR1cyAqLwoKICAgIHVuc2lnbmVkIGludCB1dFJ4Q2VsbENvdW50OyAvKio8IGNvdW50IG9mIGNlbGwgcmVjZWl2ZWQgKi8KICAgIHVuc2lnbmVkIGludCB1dFJ4SWRsZUNlbGxDb3VudDsgICAgLyoqPCBjb3VudCBvZiBpZGxlIGNlbGwgcmVjZWl2ZWQgKi8KICAgIHVuc2lnbmVkIGludCB1dFJ4SW52YWxpZEhFQ291bnQ7ICAgICAvKio8IGNvdW50IG9mIGludmFsaWQgY2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWNlaXZlZCBiZWNhdXNlIG9mIEhFQyBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgdXRSeEludmFsaWRQYXJDb3VudDsgIC8qKjwgY291bnQgb2YgaW52YWxpZCBjZWxsIHJlY2VpdmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlY2F1c2Ugb2YgcGFyaXR5IGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGludCB1dFJ4SW52YWxpZFNpemVDb3VudDsgIC8qKjwgY291bnQgb2YgaW52YWxpZCBjZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlY2VpdmVkIGJlY2F1c2Ugb2YgY2VsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAvKioKICAgICogQGluZ3JvdXAgSXhBdG1kQWNjVXRvcGlhQ3RybEFQSQogICAgKiBAc3RydWN0IFV0UnhDZWxsQ29uZGl0aW9uU3RhdHVzXwogICAgKiBAYnJpZWYgVXRvcGlhIFJ4IFN0YXR1cyBSZWdpc3RlcgogICAgKi8KICAgIHN0cnVjdCBVdFJ4Q2VsbENvbmRpdGlvblN0YXR1c18KICAgIHsKCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMTozOyAgLyoqPCBbMzE6MjldIFRoZXNlIGJpdHMgYXJlIGFsd2F5cyAwLiovCiAgICB1bnNpZ25lZCBpbnQgcnhDZWxsQ291bnRPdnI6MTsgICAgICAvKio8IFsyOF0gVGhpcyBiaXQgaXMgc2V0IGlmIHRoZSBSeENlbGxDb3VudCByZWdpc3RlciBvdmVyZmxvd3MuICovCiAgICB1bnNpZ25lZCBpbnQgaW52YWxpZEhlY0NvdW50T3ZyOjE7ICAgIC8qKjwgWzI3XSBUaGlzIGJpdCBpcyBzZXQgaWYgdGhlIEludmFsaWRIZWNDb3VudCByZWdpc3RlciBvdmVyZmxvd3MuKi8KICAgIHVuc2lnbmVkIGludCBpbnZhbGlkUGFyQ291bnRPdnI6MTsgICAgLyoqPCBbMjZdIFRoaXMgYml0IGlzIHNldCBpZiB0aGUgSW52YWxpZFBhckNvdW50IHJlZ2lzdGVyIG92ZXJmbG93cy4qLwogICAgdW5zaWduZWQgaW50IGludmFsaWRTaXplQ291bnRPdnI6MTsgICAgLyoqPCBbMjVdIFRoaXMgYml0IGlzIHNldCBpZiB0aGUgSW52YWxpZFNpemVDb3VudCByZWdpc3RlciBvdmVyZmxvd3MuKi8KICAgIHVuc2lnbmVkIGludCByeElkbGVDb3VudE92cjoxOyAgICAgIC8qKjwgWzI0XSBUaGlzIGJpdCBpcyBzZXQgaWYgdGhlIFJ4SWRsZUNvdW50IHJlZ2lzdGVyIG92ZXJmbG93cy4qLwogICAgdW5zaWduZWQgaW50IHJlc2VydmVkXzI6NDsgIC8qKjwgWzIzOjIwXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMCAqLwogICAgdW5zaWduZWQgaW50IHJ4RklGTzJVbmRlcmZsb3c6MTsgIC8qKjwgWzE5XSBUaGlzIGJpdCBpcyBzZXQgaWYgNjQtYnl0ZSBSZWNlaXZlIEZJRk8yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmRpY2F0ZXMgYSBGSUZPIHVuZGVyZmxvdyBlcnJvciBjb25kaXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVuc2lnbmVkIGludCByeEZJRk8xVW5kZXJmbG93OjE7ICAvKio8IFsxOF0gVGhpcyBiaXQgaXMgc2V0IGlmIDY0LWJ5dGUgUmVjZWl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRklGTzEgaW5kaWNhdGVzIGEgRklGTyB1bmRlcmZsb3cgZXJyb3IgY29uZGl0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gKi8KICAgIHVuc2lnbmVkIGludCByeEZJRk8yT3ZlcmZsb3c6MTsgICAgLyoqPCBbMTddIFRoaXMgYml0IGlzIHNldCBpZiA2NC1ieXRlIFJlY2VpdmUgRklGTzIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmRpY2F0ZXMgYSBGSUZPIG92ZXJmbG93IGVycm9yIGNvbmRpdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgcnhGSUZPMU92ZXJmbG93OjE7ICAgIC8qKjwgWzE2XSBUaGlzIGJpdCBpcyBzZXQgaWYgNjQtYnl0ZSBSZWNlaXZlIEZJRk8xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGVzIGEgRklGTyBvdmVyZmxvdyBlcnJvciBjb25kaXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfMzoxNjsgICAgICAvKio8IFsxNTowXSBUaGVzZSBiaXRzIGFyZSBhbHdheXMgMC4gKi8KICAgIH0gdXRSeENlbGxDb25kaXRpb25TdGF0dXM7ICAgIC8qKjwgUnggY2VsbHMgY29uZGl0aW9uIHN0YXR1cyAqLwoKfSBJeEF0bWRBY2NVdG9waWFTdGF0dXM7CgovKioKICogQH0gZGVmZ3JvdXAgSXhBdG1kQWNjVXRvcGlhQ3RybEFQSQogKi8KCiAvKioKICoKICogQGluZ3JvdXAgSXhBdG1kQWNjQ3RybEFQSQogKgogKiBAZm4gaXhBdG1kQWNjVXRvcGlhQ29uZmlnU2V0IChjb25zdCBJeEF0bWRBY2NVdG9waWFDb25maWcgKgogICAgICAgICAgICAgICAgICAgICAgICBpeEF0bWRBY2NVdG9waWFDb25maWdQdHIpCiAqCiAqIEBicmllZiBTZW5kIHRoZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB0byB0aGUgVXRvcGlhIGludGVyZmFjZQogKgogKiBUaGlzIGZ1bmN0aW9uIGRvd25sb2FkcyB0aGUgQGEgSXhBdG1kQWNjVXRvcGlhQ29uZmlnIHN0cnVjdHVyZSB0bwogKiB0aGUgVXRvcGlhIGFuZCBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzCiAqICBAbGkgc2V0dXAgdGhlIFV0b3BpYSBpbnRlcmZhY2UKICogIEBsaSBpbml0aWFsaXNlIHRoZSBOUEUKICogIEBsaSByZXNldCB0aGUgVXRvcGlhIGNlbGwgY291bnRlcnMgYW5kIHN0YXR1cyByZWdpc3RlcnMgdG8ga25vd24gdmFsdWVzCiAqCiAqIFRoaXMgYWN0aW9uIGhhcyB0byBiZSBkb25lIG9uY2UgYXQgaW5pdGlhbGlzYXRpb24uIEEgbG9jayBpcyBwcmV2ZW50aW5nCiAqIHRoZSBjb25jdXJyZW50IHVzZSBvZiBAYSBpeEF0bWRBY2NVdG9waWFTdGF0dXNHZXQoKSBhbmQKICogQEEgaXhBdG1kQWNjVXRvcGlhQ29uZmlnU2V0KCkKICoKICogQHBhcmFtICppeEF0bWRBY2NOUEVDb25maWdQdHIgQHJlZiBJeEF0bWRBY2NVdG9waWFDb25maWcgW2luXSAtIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgdG8gZG93bmxvYWQgdG8KICogIFV0b3BpYS4gVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIGEgbnVsbCBwb2ludGVyLgogKgogKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIHN1Y2Nlc3NmdWwgZG93bmxvYWQKICogQHJldHVybiBAbGkgSVhfRkFJTCBlcnJvciBpbiB0aGUgcGFyYW1ldGVycywgb3IgY29uZmlndXJhdGlvbiBpcyBub3QKICogICAgICAgICBjb21wbGV0ZSBvciBmYWlsZWQKICoKICogQHNhIGl4QXRtZEFjY1V0b3BpYVN0YXR1c0dldAogKgogKi8KUFVCTElDIElYX1NUQVRVUyBpeEF0bWRBY2NVdG9waWFDb25maWdTZXQgKGNvbnN0IEl4QXRtZEFjY1V0b3BpYUNvbmZpZyAqCiAgICAgICAgICAgICAgICAgICAgICAgIGl4QXRtZEFjY1V0b3BpYUNvbmZpZ1B0cik7CgovKioKICoKICogQGluZ3JvdXAgSXhBdG1kQWNjQ3RybEFQSQogKgogKiBAZm4gaXhBdG1kQWNjVXRvcGlhU3RhdHVzR2V0IChJeEF0bWRBY2NVdG9waWFTdGF0dXMgKgogICAgICAgICAgICAgICAgICAgICAgICBpeEF0bWRBY2NVdG9waWFTdGF0dXMpCiAqCiAqIEBicmllZiBHZXQgdGhlIFV0b3BpYSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbi4KICoKICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgVXRvcGlhIHJlZ2lzdGVycyBhbmQgdGhlIENlbGwgY291bnRzCiAqIGFuZCBmaWxscyB0aGUgQGEgSXhBdG1kQWNjVXRvcGlhU3RhdHVzIHN0cnVjdHVyZQogKgogKiBBIGxvY2sgaXMgcHJldmVudGluZyB0aGUgY29uY3VycmVudAogKiB1c2Ugb2YgQGEgaXhBdG1kQWNjVXRvcGlhU3RhdHVzR2V0KCkgYW5kIEBBIGl4QXRtZEFjY1V0b3BpYUNvbmZpZ1NldCgpCiAqCiAqIEBwYXJhbSBpeEF0bWRBY2NVdG9waWFTdGF0dXMgQHJlZiBJeEF0bWRBY2NVdG9waWFTdGF0dXMgW291dF0gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0byBiZSB1cGRhdGVkIGZyb20gaW50ZXJuYWwKICogICAgICAgIGhhcmR3YXJlIGNvdW50ZXJzLiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgYSBOVUxMIHBvaW50ZXIuCiAqCiAqIEByZXR1cm4gQGxpIElYX1NVQ0NFU1Mgc3VjY2Vzc2Z1bCByZWFkCiAqIEByZXR1cm4gQGxpIElYX0ZBSUwgZXJyb3IgaW4gdGhlIHBhcmFtZXRlcnMgbnVsbCBwb2ludGVyLCBvcgogKiAgICAgICAgICBjb25maWd1cmF0aW9uIHJlYWQgaXMgbm90IGNvbXBsZXRlIG9yIGZhaWxlZAogKgogKiBAc2EgaXhBdG1kQWNjVXRvcGlhQ29uZmlnU2V0CiAqCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4QXRtZEFjY1V0b3BpYVN0YXR1c0dldCAoSXhBdG1kQWNjVXRvcGlhU3RhdHVzICoKICAgICAgICAgICAgICAgICAgICAgICAgaXhBdG1kQWNjVXRvcGlhU3RhdHVzKTsKCi8qKgogKgogKiBAaW5ncm91cCBJeEF0bWRBY2MKICoKICogQGZuIGl4QXRtZEFjY1BvcnRFbmFibGUgKEl4QXRtTG9naWNhbFBvcnQgcG9ydCkKICoKICogQGJyaWVmIGVuYWJsZSBhIFBIWSBsb2dpY2FsIHBvcnQKICoKICogVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSB0cmFuc21pc3Npb24gb3ZlciBvbmUgcG9ydC4gSXQgc2hvdWxkIGJlCiAqIGNhbGxlZCBiZWZvcmUgYWNjZXNzaW5nIGFueSByZXNvdXJjZSBmcm9tIHRoaXMgcG9ydCBhbmQgYmVmb3JlIHRoZQogKiBlc3RhYmxpc2htZW50IG9mIGEgVkMuCiAqCiAqIFdoZW4gYSBwb3J0IGlzIGVuYWJsZWQsIHRoZSBjZWxsIHRyYW5zbWlzc2lvbiB0byB0aGUgVXRvcGlhIGludGVyZmFjZQogKiBpcyBzdGFydGVkLiBJZiB0aGVyZSBpcyBubyB0cmFmZmljIGFscmVhZHkgcnVubmluZywgaWRsZSBjZWxscyBhcmUKICogc2VudCBvdmVyIHRoZSBpbnRlcmZhY2UuCiAqCiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KICoKICogQHBhcmFtIHBvcnQgQHJlZiBJeEF0bUxvZ2ljYWxQb3J0IFtpbl0gLSBsb2dpY2FsIFBIWSBwb3J0IFtAYSBJWF9VVE9QSUFfUE9SVF8wIC4uIEBhIElYX1VUT1BJQV9NQVhfUE9SVFMgLSAxXQogKgogKiBAcmV0dXJuIEBsaSBJWF9TVUNDRVNTIGVuYWJsZSBpcyBjb21wbGV0ZQogKiBAcmV0dXJuIEBsaSBJWF9BVE1EQUNDX1dBUk5JTkcgcG9ydCBhbHJlYWR5IGVuYWJsZWQKICogQHJldHVybiBAbGkgSVhfRkFJTCBlbmFibGUgZmFpbGVkLCB3cm9uZyBwYXJhbWV0ZXIsIG9yIGNhbm5vdAogKiAgICAgICAgIGluaXRpYWxpc2UgdGhpcyBwb3J0ICh0aGUgcG9ydCBpcyBtYXliZSBhbHJlYWR5IGluIHVzZSwKICogICAgICAgICBvciB0aGVyZSBpcyBhIGhhcmR3YXJlIGlzc3VlKQogKgogKiBAbm90ZSAtIFRoaXMgZnVuY3Rpb24gbmVlZHMgaW50ZXJuYWwgbG9ja3MgYW5kIHNob3VsZCBub3QgYmUKICogICAgICAgICBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dAogKgogKiBAc2EgaXhBdG1kQWNjUG9ydERpc2FibGUKICoKICovClBVQkxJQyBJWF9TVEFUVVMgaXhBdG1kQWNjUG9ydEVuYWJsZSAoSXhBdG1Mb2dpY2FsUG9ydCBwb3J0KTsKCi8qKgogKgogKiBAaW5ncm91cCBJeEF0bWRBY2NDdHJsQVBJCiAqCiAqIEBmbiBpeEF0bWRBY2NQb3J0RGlzYWJsZSAoSXhBdG1Mb2dpY2FsUG9ydCBwb3J0KQogKgogKiBAYnJpZWYgZGlzYWJsZSBhIFBIWSBsb2dpY2FsIHBvcnQKICoKICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlIHRoZSB0cmFuc21pc3Npb24gb3ZlciBvbmUgcG9ydC4KICoKICogV2hlbiBhIHBvcnQgaXMgZGlzYWJsZWQsIHRoZSBjZWxsIHRyYW5zbWlzc2lvbiB0byB0aGUgVXRvcGlhIGludGVyZmFjZQogKiBpcyBzdG9wcGVkLgogKgogKiBAcGFyYW0gcG9ydCBAcmVmIEl4QXRtTG9naWNhbFBvcnQgW2luXSAtIGxvZ2ljYWwgUEhZIHBvcnQgW0BhIElYX1VUT1BJQV9QT1JUXzAgLi4gQGEgSVhfVVRPUElBX01BWF9QT1JUUyAtIDFdCiAqCiAqIEByZXR1cm4gQGxpIElYX1NVQ0NFU1MgZGlzYWJsZSBpcyBjb21wbGV0ZQogKiBAcmV0dXJuIEBsaSBJWF9BVE1EQUNDX1dBUk5JTkcgcG9ydCBhbHJlYWR5IGRpc2FibGVkCiAqIEByZXR1cm4gQGxpIElYX0ZBSUwgZGlzYWJsZSBmYWlsZWQsIHdyb25nIHBhcmFtZXRlciAuCiAqCiAqIEBub3RlIC0gVGhpcyBmdW5jdGlvbiBuZWVkcyBpbnRlcm5hbCBsb2NrcyBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQKICogICAgICAgICBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0CiAqCiAqIEBub3RlIC0gVGhlIHJlc3BvbnNlIGZyb20gaGFyZHdhcmUgaXMgZG9uZSB0aHJvdWdoIHRoZSB0eERvbmUgbWVjaGFuaXNtCiAqICAgICAgICAgdG8gZW5zdXJlIHRoZSBzeW5jaHJuaXNhdGlvbiB3aXRoIHR4IHJlc291cmNlcy4gVGhlcmVmb3JlLCB0aGUKICogICAgICAgICB0eERvbmUgbWVjaGFuaXNtIG5lZWRzIHRvIGJlIHNlcnZpY2VkIHRvIG1ha2UgYSBQb3J0RGlzYWJsZSBjb21wbGV0ZS4KICoKICogQHNhIGl4QXRtZEFjY1BvcnRFbmFibGUKICogQHNhIGl4QXRtZEFjY1BvcnREaXNhYmxlQ29tcGxldGUKICogQHNhIGl4QXRtZEFjY1R4RG9uZURpc3BhdGNoCiAqCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4QXRtZEFjY1BvcnREaXNhYmxlIChJeEF0bUxvZ2ljYWxQb3J0IHBvcnQpOwoKLyoqCioKKiBAaW5ncm91cCBJeEF0bWRBY2NDdHJsQVBJCioKKiBAZm4gaXhBdG1kQWNjUG9ydERpc2FibGVDb21wbGV0ZSAoSXhBdG1Mb2dpY2FsUG9ydCBwb3J0KQoqCiogQGJyaWVmIGRpc2FibGUgYSBQSFkgbG9naWNhbCBwb3J0CioKKiBUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyBpZiB0aGUgcG9ydCBkaXNhYmxlIGZvciBhIHBvcnQgaGFzIGNvbXBsZXRlZC4gVGhpcwoqIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIFRSVUUgaWYgdGhlIHBvcnQgaGFzIG5ldmVyIGJlZW4gZW5hYmxlZC4KKgoqIEBwYXJhbSBwb3J0IEByZWYgSXhBdG1Mb2dpY2FsUG9ydCBbaW5dIC0gbG9naWNhbCBQSFkgcG9ydCBbQGEgSVhfVVRPUElBX1BPUlRfMCAuLiBAYSBJWF9VVE9QSUFfTUFYX1BPUlRTIC0gMV0KKgoqIEByZXR1cm4gQGxpIFRSVUUgZGlzYWJsZSBpcyBjb21wbGV0ZQoqIEByZXR1cm4gQGxpIEZBTFNFIGRpc2FibGUgZmFpbGVkLCB3cm9uZyBwYXJhbWV0ZXIgLgoqCiogQG5vdGUgLSBUaGlzIGZ1bmN0aW9uIG5lZWRzIGludGVybmFsIGxvY2tzIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZAoqICAgICAgICAgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dAoqCiogQHNhIGl4QXRtZEFjY1BvcnRFbmFibGUKKiBAc2EgaXhBdG1kQWNjUG9ydERpc2FibGUKKgoqLwpQVUJMSUMgQk9PTCBpeEF0bWRBY2NQb3J0RGlzYWJsZUNvbXBsZXRlIChJeEF0bUxvZ2ljYWxQb3J0IHBvcnQpOwoKI2VuZGlmIC8qIElYQVRNREFDQ0NUUkxfSCAqLwoKLyoqCiAqIEB9IGRlZmdyb3VwIEl4QXRtZEFjY0N0cmxBUEkKICovCgoK