LyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIEBmaWxlICAgICAgICAgUFZSVFZlY3Rvci5oCiBAY29weXJpZ2h0ICAgIENvcHlyaWdodCAoYykgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIExpbWl0ZWQuCiBAYnJpZWYgICAgICAgIFZlY3RvciBhbmQgbWF0cml4IG1hdGhlbWF0aWNzIGxpYnJhcnkKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmbmRlZiBfX1BWUlRWRUNUT1JfSF9fCiNkZWZpbmUgX19QVlJUVkVDVE9SX0hfXwoKI2luY2x1ZGUgImFzc2VydC5oIgojaW5jbHVkZSAiUFZSVEdsb2JhbC5oIgojaW5jbHVkZSAiUFZSVEZpeGVkUG9pbnQuaCIKI2luY2x1ZGUgIlBWUlRNYXRyaXguaCIKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bWF0aC5oPgoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqIEZvcndhcmQgRGVjbGFyYXRpb25zIGZvciB2ZWN0b3IgYW5kIG1hdHJpeCBzdHJ1Y3RzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBQVlJUVmVjNDsKc3RydWN0IFBWUlRWZWMzOwpzdHJ1Y3QgUFZSVE1hdDM7CnN0cnVjdCBQVlJUTWF0NDsKCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCVBWUlRMaW5lYXJFcVNvbHZlCiBAcGFyYW1baW5dCQkJcFNyYwkyRCBhcnJheSBvZiBmbG9hdHMuIDQgRXEgbGluZWFyIHByb2JsZW0gaXMgNXg0CgkJCQkJCQltYXRyaXgsIGNvbnN0YW50cyBpbiBmaXJzdCBjb2x1bW4KIEBwYXJhbVtpbl0JCQluQ250CU51bWJlciBvZiBlcXVhdGlvbnMgdG8gc29sdmUKIEBwYXJhbVtvdXRdCQlwUmVzCVJlc3VsdAogQGJyaWVmICAgICAgCQlTb2x2ZXMgJ25DbnQnIHNpbXVsdGFuZW91cyBlcXVhdGlvbnMgb2YgJ25DbnQnIHZhcmlhYmxlcy4KCQkJCQlwUmVzIHNob3VsZCBiZSBhbiBhcnJheSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUKCQkJCQlyZXN1bHRzOiB0aGUgdmFsdWVzIG9mIHRoZSAnbkNudCcgdmFyaWFibGVzLgoJCQkJCVRoaXMgZm4gcmVjdXJzaXZlbHkgdXNlcyBHYXVzc2lhbiBFbGltaW5hdGlvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgUFZSVExpbmVhckVxU29sdmUoVkVSVFRZUEUgKiBjb25zdCBwUmVzLCBWRVJUVFlQRSAqKiBjb25zdCBwU3JjLCBjb25zdCBpbnQgbkNudCk7CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBzdHJ1Y3QgICAgICAgICAgICBQVlJUVmVjMiAKIEBicmllZiAgICAgICAgICAgICAyIGNvbXBvbmVudCB2ZWN0b3IKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBQVlJUVmVjMgp7CglWRVJUVFlQRSB4LCB5OwoJLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJKiogQ29uc3RydWN0b3JzCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJQmxhbmsgY29uc3RydWN0b3IuCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMigpIDogeCgwKSwgeSgwKSB7fQoJLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJQGJyaWVmICAgICAgCQlTaW1wbGUgY29uc3RydWN0b3IgZnJvbSAyIHZhbHVlcy4KCQlAcGFyYW1baW5dCQkJZlgJWCBjb21wb25lbnQgb2YgdmVjdG9yCgkJQHBhcmFtW2luXQkJCWZZCVkgY29tcG9uZW50IG9mIHZlY3RvcgoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzIoVkVSVFRZUEUgZlgsIFZFUlRUWVBFIGZZKSA6IHgoZlgpLCB5KGZZKSB7fQoJLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJQGJyaWVmICAgICAgCQlDb25zdHJ1Y3RvciBmcm9tIGEgc2luZ2xlIHZhbHVlLgoJCUBwYXJhbVtpbl0JCQlmVmFsdWUJICAgIEEgY29tcG9uZW50IHZhbHVlCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMihWRVJUVFlQRSBmVmFsdWUpIDogeChmVmFsdWUpLCB5KGZWYWx1ZSkge30KCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJQ29uc3RydWN0b3IgZnJvbSBhbiBhcnJheQoJCUBwYXJhbVtpbl0JCQlwVmVjCUFuIGFycmF5CgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMihjb25zdCBWRVJUVFlQRSogcFZlYykgOiB4KHBWZWNbMF0pLCB5KHBWZWNbMV0pIHt9CgkvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQlAYnJpZWYgICAgICAJCUNvbnN0cnVjdG9yIGZyb20gYSBWZWMzCgkJQHBhcmFtW2luXQkJCXYzVmVjICAgQSBWZWMzCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMihjb25zdCBQVlJUVmVjMyYgdjNWZWMpOwoJLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJKiogT3BlcmF0b3JzCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJY29tcG9uZW50d2lzZSBhZGRpdGlvbiBvcGVyYXRvciBmb3IgdHdvIFZlYzJzCgkJQHBhcmFtW2luXQkJCXJocyAgICAgQW5vdGhlciBWZWMyCgkJQHJldHVybiAJCQlyZXN1bHQgb2YgYWRkaXRpb24KCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMyIG9wZXJhdG9yKyhjb25zdCBQVlJUVmVjMiYgcmhzKSBjb25zdAoJewoJCVBWUlRWZWMyIG91dCgqdGhpcyk7CgkJcmV0dXJuIG91dCArPSByaHM7Cgl9CgkvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQlAYnJpZWYgICAgICAJCWNvbXBvbmVudHdpc2Ugc3VidHJhY3Rpb24gb3BlcmF0b3IgZm9yIHR3byBWZWMycwoJCUBwYXJhbVtpbl0JCQlyaHMgICAgQW5vdGhlciB2ZWMyCgkJQHJldHVybiAJCQlyZXN1bHQgb2Ygc3VidHJhY3Rpb24KCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzIgb3BlcmF0b3ItKGNvbnN0IFBWUlRWZWMyJiByaHMpIGNvbnN0Cgl7CgkJUFZSVFZlYzIgb3V0KCp0aGlzKTsKCQlyZXR1cm4gb3V0IC09IHJoczsKCX0KCgkvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQlAYnJpZWYgICAgICAJCUNvbXBvbmVudHdpc2UgYWRkaXRpb24gYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgZm9yIHR3byBWZWMycwoJCUBwYXJhbVtpbl0JCQlyaHMgICAgQW5vdGhlciB2ZWMyCgkJQHJldHVybiAJCQlyZXN1bHQgb2YgYWRkaXRpb24KCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzImIG9wZXJhdG9yKz0oY29uc3QgUFZSVFZlYzImIHJocykKCXsKCQl4ICs9IHJocy54OwoJCXkgKz0gcmhzLnk7CgkJcmV0dXJuICp0aGlzOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJQ29tcG9uZW50d2lzZSBzdWJ0cmFjdGlvbiBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBmb3IgdHdvIFZlYzJzCgkJQHBhcmFtW2luXQkJCXJocyAgICBBbm90aGVyIHZlYzIKCQlAcmV0dXJuIAkJCVJlc3VsdCBvZiBzdWJ0cmFjdGlvbgoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMiYgb3BlcmF0b3ItPShjb25zdCBQVlJUVmVjMiYgcmhzKQoJewoJCXggLT0gcmhzLng7CgkJeSAtPSByaHMueTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJQGJyaWVmICAgICAgCQlOZWdhdGlvbiBvcGVyYXRvciBmb3IgYSBWZWMyCgkJQHBhcmFtW2luXQkJCXJocyAgICBBbm90aGVyIHZlYzIKCQlAcmV0dXJuIAkJCVJlc3VsdCBvZiBuZWdhdGlvbgoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglmcmllbmQgUFZSVFZlYzIgb3BlcmF0b3ItIChjb25zdCBQVlJUVmVjMiYgcmhzKSB7IHJldHVybiBQVlJUVmVjMigtcmhzLngsIC1yaHMueSk7IH0KCgkvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQlAYnJpZWYgICAgICAJCU11bHRpcGxpY2F0aW9uIG9wZXJhdG9yIGZvciBhIFZlYzIKCQlAcGFyYW1baW5dCQkJbGhzICAgICBTY2FsYXIKCQlAcGFyYW1baW5dCQkJcmhzICAgICBBIFZlYzIKCQlAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglmcmllbmQgUFZSVFZlYzIgb3BlcmF0b3IqKGNvbnN0IFZFUlRUWVBFIGxocywgY29uc3QgUFZSVFZlYzImICByaHMpCgl7CgkJUFZSVFZlYzIgb3V0KGxocyk7CgkJcmV0dXJuIG91dCAqPSByaHM7Cgl9CgoJLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJQGJyaWVmICAgICAgCQlEaXZpc2lvbiBvcGVyYXRvciBmb3Igc2NhbGFyIGFuZCBWZWMyCgkJQHBhcmFtW2luXQkJCWxocyBzY2FsYXIKCQlAcGFyYW1baW5dCQkJcmhzIGEgVmVjMgoJCUByZXR1cm4gCQkJUmVzdWx0IG9mIGRpdmlzaW9uCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCWZyaWVuZCBQVlJUVmVjMiBvcGVyYXRvci8oY29uc3QgVkVSVFRZUEUgbGhzLCBjb25zdCBQVlJUVmVjMiYgIHJocykKCXsKCQlQVlJUVmVjMiBvdXQobGhzKTsKCQlyZXR1cm4gb3V0IC89IHJoczsKCX0KCgkvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJQ29tcG9uZW50d2lzZSBtdWx0aXBsaWNhdGlvbiBieSBzY2FsYXIgZm9yIFZlYzIqCgkJQHBhcmFtW2luXQkJCXJocyAgICAgQSBzY2FsYXIKCQlAcmV0dXJuIAkJCVJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMiBvcGVyYXRvciooY29uc3QgVkVSVFRZUEUmIHJocykgY29uc3QKCXsKCQlQVlJUVmVjMiBvdXQoKnRoaXMpOwoJCXJldHVybiBvdXQgKj0gcmhzOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJQ29tcG9uZW50d2lzZSBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudCBieSBzY2FsYXIgZm9yIFZlYzIKCQlAcGFyYW1baW5dCQkJcmhzICAgICBBIHNjYWxhcgoJCUByZXR1cm4gCQkJUmVzdWx0IG9mIG11bHRpcGxpY2F0aW9uIGFuZCBhc3NpZ25tZW50CgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMyJiBvcGVyYXRvcio9KGNvbnN0IFZFUlRUWVBFJiByaHMpCgl7CgkJeCA9IFZFUlRUWVBFTVVMKHgsIHJocyk7CgkJeSA9IFZFUlRUWVBFTVVMKHksIHJocyk7CgkJcmV0dXJuICp0aGlzOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJQ29tcG9uZW50d2lzZSBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudCBieSBWZWMyIGZvciBWZWMyCgkJQHBhcmFtW2luXQkJCXJocyAgICAgQSBWZWMyCgkJQHJldHVybiAJCQlSZXN1bHQgb2YgbXVsdGlwbGljYXRpb24gYW5kIGFzc2lnbm1lbnQKCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzImIG9wZXJhdG9yKj0oY29uc3QgUFZSVFZlYzImIHJocykKCXsKCQl4ID0gVkVSVFRZUEVNVUwoeCwgcmhzLngpOwoJCXkgPSBWRVJUVFlQRU1VTCh5LCByaHMueSk7CgkJcmV0dXJuICp0aGlzOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJY29tcG9uZW50d2lzZSBkaXZpc2lvbiBieSBzY2FsYXIgZm9yIFZlYzIKCQlAcGFyYW1baW5dCQkJcmhzIGEgc2NhbGFyCgkJQHJldHVybiAJCQlyZXN1bHQgb2YgZGl2aXNpb24KCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzIgb3BlcmF0b3IvKGNvbnN0IFZFUlRUWVBFJiByaHMpIGNvbnN0Cgl7CgkJUFZSVFZlYzIgb3V0KCp0aGlzKTsKCQlyZXR1cm4gb3V0IC89IHJoczsKCX0KCgkvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQlAYnJpZWYgICAgICAJCWNvbXBvbmVudHdpc2UgZGl2aXNpb24gYW5kIGFzc2lnbm1lbnQgYnkgc2NhbGFyIGZvciBWZWMyCgkJQHBhcmFtW2luXQkJCXJocyBhIHNjYWxhcgoJCUByZXR1cm4gCQkJcmVzdWx0IG9mIGRpdmlzaW9uIGFuZCBhc3NpZ25tZW50CgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMyJiBvcGVyYXRvci89KGNvbnN0IFZFUlRUWVBFJiByaHMpCgl7CgkJeCA9IFZFUlRUWVBFRElWKHgsIHJocyk7CgkJeSA9IFZFUlRUWVBFRElWKHksIHJocyk7CgkJcmV0dXJuICp0aGlzOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJY29tcG9uZW50d2lzZSBkaXZpc2lvbiBhbmQgYXNzaWdubWVudCBieSBWZWMyIGZvciBWZWMyCgkJQHBhcmFtW2luXQkJCXJocyBhIFZlYzIKCQlAcmV0dXJuIAkJCXJlc3VsdCBvZiBkaXZpc2lvbiBhbmQgYXNzaWdubWVudAoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMiYgb3BlcmF0b3IvPShjb25zdCBQVlJUVmVjMiYgcmhzKQoJewoJCXggPSBWRVJUVFlQRURJVih4LCByaHMueCk7CgkJeSA9IFZFUlRUWVBFRElWKHksIHJocy55KTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgQGJyaWVmICAgICAgCQlQVlJUVmVjMiBlcXVhbGl0eSBvcGVyYXRvcgogICAgICAgIEBwYXJhbVtpbl0JCQlyaHMgICAgIEEgc2luZ2xlIHZhbHVlCiAgICAgICAgQHJldHVybiAJCQl0cnVlIGlmIHRoZSB0d28gdmVjdG9ycyBhcmUgZXF1YWwKCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglib29sIG9wZXJhdG9yPT0oY29uc3QgUFZSVFZlYzImIHJocykgY29uc3QKCXsKCQlyZXR1cm4gKCh4ID09IHJocy54KSAmJiAoeSA9PSByaHMueSkpOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIEBicmllZiAgICAgIAkJUFZSVFZlYzIgaW5lcXVhbGl0eSBvcGVyYXRvcgogICAgICAgIEBwYXJhbVtpbl0JCQlyaHMgICAgIEEgc2luZ2xlIHZhbHVlCiAgICAgICAgQHJldHVybiAJCQl0cnVlIGlmIHRoZSB0d28gdmVjdG9ycyBhcmUgbm90IGVxdWFsCgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBWUlRWZWMyJiByaHMpIGNvbnN0Cgl7CgkJcmV0dXJuICgoeCAhPSByaHMueCkgfHwgKHkgIT0gcmhzLnkpKTsKCX0KCgkvLyBGVU5DVElPTlMKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBicmllZiAgICAgIAkJY2FsY3VsYXRlcyB0aGUgc3F1YXJlIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvcgoJCUByZXR1cm4gCQkJVGhlIHNxdWFyZSBvZiB0aGUgbWFnbml0dWRlIG9mIHRoZSB2ZWN0b3IKCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJVkVSVFRZUEUgbGVuU3FyKCkgY29uc3QKCXsKCQlyZXR1cm4gVkVSVFRZUEVNVUwoeCx4KStWRVJUVFlQRU1VTCh5LHkpOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBmbiAgICAgICAJCQlsZW5ndGgKCQlAcmV0dXJuIAkJCXRoZSBvZiB0aGUgbWFnbml0dWRlIG9mIHRoZSB2ZWN0b3IKCQlAYnJpZWYgICAgICAJCWNhbGN1bGF0ZXMgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVZFUlRUWVBFIGxlbmd0aCgpIGNvbnN0Cgl7CgkJcmV0dXJuIChWRVJUVFlQRSkgZjJ2dChzcXJ0KHZ0MmYoeCkqdnQyZih4KSArIHZ0MmYoeSkqdnQyZih5KSkpOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBmbiAgICAgICAJCQlub3JtYWxpemUKCQlAcmV0dXJuIAkJCXRoZSBub3JtYWxpemVkIHZhbHVlIG9mIHRoZSB2ZWN0b3IKCQlAYnJpZWYgICAgICAJCW5vcm1hbGl6ZXMgdGhlIHZlY3RvcgoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMiBub3JtYWxpemUoKQoJewoJCXJldHVybiAqdGhpcyAvPSBsZW5ndGgoKTsKCX0KCgkvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQlAZm4gICAgICAgCQkJbm9ybWFsaXplZAoJCUByZXR1cm4gCQkJcmV0dXJucyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgdmVjdG9yCgkJQGJyaWVmICAgICAgCQlyZXR1cm5zIGEgbm9ybWFsaXplZCB2ZWN0b3Igb2YgdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMKCQl2ZWN0b3IKCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzIgbm9ybWFsaXplZCgpIGNvbnN0Cgl7CgkJUFZSVFZlYzIgb3V0KCp0aGlzKTsKCQlyZXR1cm4gb3V0Lm5vcm1hbGl6ZSgpOwoJfQoKCS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCUBmbiAgICAgICAJCQlyb3RhdGVkOTAKCQlAcmV0dXJuIAkJCXJldHVybnMgdGhlIHZlY3RvciByb3RhdGVkIDkwsAoJCUBicmllZiAgICAgIAkJcmV0dXJucyB0aGUgdmVjdG9yIHJvdGF0ZWQgOTCwCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMyIHJvdGF0ZWQ5MCgpIGNvbnN0Cgl7CgkJcmV0dXJuIFBWUlRWZWMyKC15LCB4KTsKCX0KCgkvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQlAZm4gICAgICAgCQkJZG90CgkJQHBhcmFtW2luXQkJCXJocyAgICBBIHNpbmdsZSB2YWx1ZQoJCUByZXR1cm4gCQkJc2NhbGFyIHByb2R1Y3QKCQlAYnJpZWYgICAgICAJCWNhbGN1bGF0ZSB0aGUgc2NhbGFyIHByb2R1Y3Qgb2YgdHdvIFZlYzNzCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVZFUlRUWVBFIGRvdChjb25zdCBQVlJUVmVjMiYgcmhzKSBjb25zdAoJewoJCXJldHVybiBWRVJUVFlQRU1VTCh4LCByaHMueCkgKyBWRVJUVFlQRU1VTCh5LCByaHMueSk7Cgl9CgoJLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJQGZuICAgICAgIAkJCXB0cgoJCUByZXR1cm4gCQkJcG9pbnRlcgoJCUBicmllZiAgICAgIAkJcmV0dXJucyBhIHBvaW50ZXIgdG8gbWVtb3J5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvZiB0aGUKCQlWZWMzCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVZFUlRUWVBFICpwdHIoKSB7IHJldHVybiAoVkVSVFRZUEUqKXRoaXM7IH0KfTsKCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQHN0cnVjdCAgICAgICAgICAgIFBWUlRWZWMzIAogQGJyaWVmICAgICAgICAgICAgIDMgY29tcG9uZW50IHZlY3RvcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgUFZSVFZlYzMgOiBwdWJsaWMgUFZSVFZFQ1RPUjMKewovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiogQ29uc3RydWN0b3JzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlCbGFuayBjb25zdHJ1Y3Rvci4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMygpCgl7CgkJeCA9IHkgPSB6ID0gMDsKCX0KLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCVNpbXBsZSBjb25zdHJ1Y3RvciBmcm9tIDMgdmFsdWVzLgogQHBhcmFtW2luXQkJCWZYCVggY29tcG9uZW50IG9mIHZlY3RvcgogQHBhcmFtW2luXQkJCWZZCVkgY29tcG9uZW50IG9mIHZlY3RvcgogQHBhcmFtW2luXQkJCWZaCVogY29tcG9uZW50IG9mIHZlY3RvcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzKFZFUlRUWVBFIGZYLCBWRVJUVFlQRSBmWSwgVkVSVFRZUEUgZlopCgl7CgkJeCA9IGZYOwl5ID0gZlk7CXogPSBmWjsKCX0KLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCUNvbnN0cnVjdG9yIGZyb20gYSBzaW5nbGUgdmFsdWUuCiBAcGFyYW1baW5dCQkJZlZhbHVlCSBBIGNvbXBvbmVudCB2YWx1ZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzKGNvbnN0IFZFUlRUWVBFIGZWYWx1ZSkKCXsKCQl4ID0gZlZhbHVlOyB5ID0gZlZhbHVlOyB6ID0gZlZhbHVlOwoJfQovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ29uc3RydWN0b3IgZnJvbSBhbiBhcnJheQogQHBhcmFtW2luXQkJCXBWZWMJQW4gYXJyYXkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMyhjb25zdCBWRVJUVFlQRSogcFZlYykKCXsKCQl4ID0gKCpwVmVjKyspOyB5ID0gKCpwVmVjKyspOyB6ID0gKnBWZWM7Cgl9Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlDb25zdHJ1Y3RvciBmcm9tIGEgUFZSVFZlYzQKIEBwYXJhbVtpbl0JCQl2NFZlYyAgIEEgUFZSVFZlYzQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMyhjb25zdCBQVlJUVmVjNCYgdjRWZWMpOwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiogT3BlcmF0b3JzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQljb21wb25lbnR3aXNlIGFkZGl0aW9uIG9wZXJhdG9yIGZvciB0d28gUFZSVFZlYzNzCiBAcGFyYW1baW5dCQkJcmhzICAgICBBbm90aGVyIFBWUlRWZWMzCiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBhZGRpdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzIG9wZXJhdG9yKyhjb25zdCBQVlJUVmVjMyYgcmhzKSBjb25zdAoJewoJCVBWUlRWZWMzIG91dDsKCQlvdXQueCA9IHgrcmhzLng7CgkJb3V0LnkgPSB5K3Jocy55OwoJCW91dC56ID0geityaHMuejsKCQlyZXR1cm4gb3V0OwoJfQovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ29tcG9uZW50d2lzZSBzdWJ0cmFjdGlvbiBvcGVyYXRvciBmb3IgdHdvIFBWUlRWZWMzcwogQHBhcmFtW2luXQkJCXJocyAgICBBbm90aGVyIFBWUlRWZWMzCiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBzdWJ0cmFjdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzMgb3BlcmF0b3ItKGNvbnN0IFBWUlRWZWMzJiByaHMpIGNvbnN0Cgl7CgkJUFZSVFZlYzMgb3V0OwoJCW91dC54ID0geC1yaHMueDsKCQlvdXQueSA9IHktcmhzLnk7CgkJb3V0LnogPSB6LXJocy56OwoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ29tcG9uZW50d2lzZSBhZGRpdGlvbiBhbmQgYXNzaWduZW1lbnQgb3BlcmF0b3IgZm9yIHR3byBQVlJUVmVjM3MKIEBwYXJhbVtpbl0JCQlyaHMgICAgQW5vdGhlciBQVlJUVmVjMwogQHJldHVybiAJCQlSZXN1bHQgb2YgYWRkaXRpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzJiBvcGVyYXRvcis9KGNvbnN0IFBWUlRWZWMzJiByaHMpCgl7CgkJeCArPXJocy54OwoJCXkgKz1yaHMueTsKCQl6ICs9cmhzLno7CgkJcmV0dXJuICp0aGlzOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCUNvbXBvbmVudHdpc2Ugc3VidHJhY3Rpb24gYW5kIGFzc2lnbmVtZW50IG9wZXJhdG9yIGZvciB0d28gUFZSVFZlYzNzCiBAcGFyYW1baW5dCQkJcmhzICAgIEFub3RoZXIgUFZSVFZlYzMKIEByZXR1cm4gCQkJUmVzdWx0IG9mIHN1YnRyYWN0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMyYgb3BlcmF0b3ItPShjb25zdCBQVlJUVmVjMyYgcmhzKQoJewoJCXggLT1yaHMueDsKCQl5IC09cmhzLnk7CgkJeiAtPXJocy56OwoJCXJldHVybiAqdGhpczsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlOZWdhdGlvbiBvcGVyYXRvciBmb3IgYSBQVlJUVmVjMwogQHBhcmFtW2luXQkJCXJocyAgICBBbm90aGVyIFBWUlRWZWMzCiBAcmV0dXJuIAkJCVJlc3VsdCBvZiBuZWdhdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJZnJpZW5kIFBWUlRWZWMzIG9wZXJhdG9yIC0gKGNvbnN0IFBWUlRWZWMzJiByaHMpIHsgcmV0dXJuIFBWUlRWZWMzKHJocykgKj0gZjJ2dCgtMSk7IH0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQltdWx0aXBsaWNhdGlvbiBvcGVyYXRvciBmb3IgYSBQVlJUVmVjMwogQHBhcmFtW2luXQkJCWxocyAgICAgU2luZ2xlIHZhbHVlCiBAcGFyYW1baW5dCQkJcmhzICAgICBBIFBWUlRWZWMzCiBAcmV0dXJuIAkJCVJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJZnJpZW5kIFBWUlRWZWMzIG9wZXJhdG9yKihjb25zdCBWRVJUVFlQRSBsaHMsIGNvbnN0IFBWUlRWZWMzJiAgcmhzKQoJewoJCVBWUlRWZWMzIG91dDsKCQlvdXQueCA9IFZFUlRUWVBFTVVMKGxocyxyaHMueCk7CgkJb3V0LnkgPSBWRVJUVFlQRU1VTChsaHMscmhzLnkpOwoJCW91dC56ID0gVkVSVFRZUEVNVUwobGhzLHJocy56KTsKCQlyZXR1cm4gb3V0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCU5lZ2F0aW9uIG9wZXJhdG9yIGZvciBhIFBWUlRWZWMzCiBAcGFyYW1baW5dCQkJbGhzICAgICBTaW5nbGUgdmFsdWUKIEBwYXJhbVtpbl0JCQlyaHMgICAgIEEgUFZSVFZlYzMKIEByZXR1cm4gCQkJcmVzdWx0IG9mIG5lZ2F0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglmcmllbmQgUFZSVFZlYzMgb3BlcmF0b3IvKGNvbnN0IFZFUlRUWVBFIGxocywgY29uc3QgUFZSVFZlYzMmICByaHMpCgl7CgkJUFZSVFZlYzMgb3V0OwoJCW91dC54ID0gVkVSVFRZUEVESVYobGhzLHJocy54KTsKCQlvdXQueSA9IFZFUlRUWVBFRElWKGxocyxyaHMueSk7CgkJb3V0LnogPSBWRVJUVFlQRURJVihsaHMscmhzLnopOwoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJTWF0cml4IG11bHRpcGxpY2F0aW9uIG9wZXJhdG9yIFBWUlRWZWMzIGFuZCBQVlJUTWF0MwogQHBhcmFtW2luXQkJCXJocyAgICAgQSBQVlJUTWF0MwogQHJldHVybiAJCQlSZXN1bHQgb2YgbXVsdGlwbGljYXRpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzIG9wZXJhdG9yKihjb25zdCBQVlJUTWF0MyYgcmhzKSBjb25zdDsKCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlNYXRyaXggbXVsdGlwbGljYXRpb24gYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgZm9yIFBWUlRWZWMzIGFuZCBQVlJUTWF0MwogQHBhcmFtW2luXQkJCXJocyAgICAgQSBQVlJUTWF0MwogQHJldHVybiAJCQlSZXN1bHQgb2YgbXVsdGlwbGljYXRpb24gYW5kIGFzc2lnbm1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzJiBvcGVyYXRvcio9KGNvbnN0IFBWUlRNYXQzJiByaHMpOwoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCUNvbXBvbmVudHdpc2UgbXVsdGlwbGljYXRpb24gYnkgc2luZ2xlIGRpbWVuc2lvbiB2YWx1ZSBmb3IgUFZSVFZlYzMKIEBwYXJhbVtpbl0JCQlyaHMgICAgIEEgc2luZ2xlIHZhbHVlCiBAcmV0dXJuIAkJCVJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzMgb3BlcmF0b3IqKGNvbnN0IFZFUlRUWVBFJiByaHMpIGNvbnN0Cgl7CgkJUFZSVFZlYzMgb3V0OwoJCW91dC54ID0gVkVSVFRZUEVNVUwoeCxyaHMpOwoJCW91dC55ID0gVkVSVFRZUEVNVUwoeSxyaHMpOwoJCW91dC56ID0gVkVSVFRZUEVNVUwoeixyaHMpOwoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ29tcG9uZW50d2lzZSBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWduZW1lbnQgYnkgc2luZ2xlCgkJCQkJZGltZW5zaW9uIHZhbHVlCWZvciBQVlJUVmVjMwogQHBhcmFtW2luXQkJCXJocyAgICBBIHNpbmdsZSB2YWx1ZQogQHJldHVybiAJCQlSZXN1bHQgb2YgbXVsdGlwbGljYXRpb24gYW5kIGFzc2lnbm1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzJiBvcGVyYXRvcio9KGNvbnN0IFZFUlRUWVBFJiByaHMpCgl7CgkJeCA9IFZFUlRUWVBFTVVMKHgscmhzKTsKCQl5ID0gVkVSVFRZUEVNVUwoeSxyaHMpOwoJCXogPSBWRVJUVFlQRU1VTCh6LHJocyk7CgkJcmV0dXJuICp0aGlzOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCUNvbXBvbmVudHdpc2UgZGl2aXNpb24gYnkgc2luZ2xlIGRpbWVuc2lvbiB2YWx1ZSBmb3IgUFZSVFZlYzMKIEBwYXJhbVtpbl0JCQlyaHMgICAgQSBzaW5nbGUgdmFsdWUKIEByZXR1cm4gCQkJUmVzdWx0IG9mIGRpdmlzaW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMyBvcGVyYXRvci8oY29uc3QgVkVSVFRZUEUmIHJocykgY29uc3QKCXsKCQlQVlJUVmVjMyBvdXQ7CgkJb3V0LnggPSBWRVJUVFlQRURJVih4LHJocyk7CgkJb3V0LnkgPSBWRVJUVFlQRURJVih5LHJocyk7CgkJb3V0LnogPSBWRVJUVFlQRURJVih6LHJocyk7CgkJcmV0dXJuIG91dDsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlDb21wb25lbnR3aXNlIGRpdmlzaW9uIGFuZCBhc3NpZ25lbWVudCBieSBzaW5nbGUKCQkJCQlkaW1lbnNpb24gdmFsdWUJZm9yIFBWUlRWZWMzCiBAcGFyYW1baW5dCQkJcmhzICAgIEEgc2luZ2xlIHZhbHVlCiBAcmV0dXJuIAkJCVJlc3VsdCBvZiBkaXZpc2lvbiBhbmQgYXNzaWdubWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzMmIG9wZXJhdG9yLz0oY29uc3QgVkVSVFRZUEUmIHJocykKCXsKCQl4ID0gVkVSVFRZUEVESVYoeCxyaHMpOwoJCXkgPSBWRVJUVFlQRURJVih5LHJocyk7CgkJeiA9IFZFUlRUWVBFRElWKHoscmhzKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJUFZSVFZlYzMgZXF1YWxpdHkgb3BlcmF0b3IKIEBwYXJhbVtpbl0JCQlyaHMgICAgQSBzaW5nbGUgdmFsdWUKIEByZXR1cm4gCQkJdHJ1ZSBpZiB0aGUgdHdvIHZlY3RvcnMgYXJlIGVxdWFsCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglib29sIG9wZXJhdG9yPT0oY29uc3QgUFZSVFZlYzMmIHJocykgY29uc3QKCXsKCQlyZXR1cm4gKCh4ID09IHJocy54KSAmJiAoeSA9PSByaHMueSkgJiYgKHogPT0gcmhzLnopKTsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlQVlJUVmVjMyBpbmVxdWFsaXR5IG9wZXJhdG9yCiBAcGFyYW1baW5dCQkJcmhzICAgIEEgc2luZ2xlIHZhbHVlCiBAcmV0dXJuIAkJCXRydWUgaWYgdGhlIHR3byB2ZWN0b3JzIGFyZSBub3QgZXF1YWwKCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglib29sIG9wZXJhdG9yIT0oY29uc3QgUFZSVFZlYzMmIHJocykgY29uc3QKCXsKCQlyZXR1cm4gKCh4ICE9IHJocy54KSB8fCAoeSAhPSByaHMueSkgfHwgKHogIT0gcmhzLnopKTsKCX0KCS8vIEZVTkNUSU9OUwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlsZW5TcXIKIEByZXR1cm4gCQkJdGhlIHNxdWFyZSBvZiB0aGUgbWFnbml0dWRlIG9mIHRoZSB2ZWN0b3IKIEBicmllZiAgICAgIAkJY2FsY3VsYXRlcyB0aGUgc3F1YXJlIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJVkVSVFRZUEUgbGVuU3FyKCkgY29uc3QKCXsKCQlyZXR1cm4gVkVSVFRZUEVNVUwoeCx4KStWRVJUVFlQRU1VTCh5LHkpK1ZFUlRUWVBFTVVMKHoseik7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlsZW5ndGgKIEByZXR1cm4gCQkJdGhlIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvcgogQGJyaWVmICAgICAgCQljYWxjdWxhdGVzIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJVkVSVFRZUEUgbGVuZ3RoKCkgY29uc3QKCXsKCQlyZXR1cm4gKFZFUlRUWVBFKSBmMnZ0KHNxcnQodnQyZih4KSp2dDJmKHgpICsgdnQyZih5KSp2dDJmKHkpICsgdnQyZih6KSp2dDJmKHopKSk7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlub3JtYWxpemUKIEByZXR1cm4gCQkJdGhlIG5vcm1hbGl6ZWQgdmFsdWUgb2YgdGhlIHZlY3RvcgogQGJyaWVmICAgICAgCQlub3JtYWxpemVzIHRoZSB2ZWN0b3IKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzIG5vcm1hbGl6ZSgpCgl7CiNpZiBkZWZpbmVkKFBWUlRfRklYRURfUE9JTlRfRU5BQkxFKQoJCS8vIFNjYWxlIHZlY3RvciBieSB1bmlmb3JtIHZhbHVlCgkJaW50IG4gPSBQVlJUQUJTKHgpICsgUFZSVEFCUyh5KSArIFBWUlRBQlMoeik7CgkJeCA9IFZFUlRUWVBFRElWKHgsIG4pOwoJCXkgPSBWRVJUVFlQRURJVih5LCBuKTsKCQl6ID0gVkVSVFRZUEVESVYoeiwgbik7CgoJCS8vIENhbGN1bGF0ZSB4Mit5Mit6Mi9zcXJ0KHgyK3kyK3oyKQoJCWludCBmID0gZG90KCp0aGlzKTsKCQlmID0gVkVSVFRZUEVESVYoUFZSVEYyWCgxLjBmKSwgUFZSVEYyWChzcXJ0KFBWUlRYMkYoZikpKSk7CgoJCS8vIE11bHRpcGx5IHZlY3RvciBjb21wb25lbnRzIGJ5IGYKCQl4ID0gUFZSVFhNVUwoeCwgZik7CgkJeSA9IFBWUlRYTVVMKHksIGYpOwoJCXogPSBQVlJUWE1VTCh6LCBmKTsKI2Vsc2UKCQlWRVJUVFlQRSBsZW4gPSBsZW5ndGgoKTsKCQl4ID1WRVJUVFlQRURJVih4LGxlbik7CgkJeSA9VkVSVFRZUEVESVYoeSxsZW4pOwoJCXogPVZFUlRUWVBFRElWKHosbGVuKTsKI2VuZGlmCgkJcmV0dXJuICp0aGlzOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJbm9ybWFsaXplZAogQHJldHVybiAJCQlyZXR1cm5zIHRoZSBub3JtYWxpemVkIHZhbHVlIG9mIHRoZSB2ZWN0b3IKIEBicmllZiAgICAgIAkJcmV0dXJucyBhIG5vcm1hbGl6ZWQgdmVjdG9yIG9mIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGlzCgkJCQkJdmVjdG9yCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjMyBub3JtYWxpemVkKCkgY29uc3QKCXsKCQlQVlJUVmVjMyBvdXQ7CiNpZiBkZWZpbmVkKFBWUlRfRklYRURfUE9JTlRfRU5BQkxFKQoJCS8vIFNjYWxlIHZlY3RvciBieSB1bmlmb3JtIHZhbHVlCgkJaW50IG4gPSBQVlJUQUJTKHgpICsgUFZSVEFCUyh5KSArIFBWUlRBQlMoeik7CgkJb3V0LnggPSBWRVJUVFlQRURJVih4LCBuKTsKCQlvdXQueSA9IFZFUlRUWVBFRElWKHksIG4pOwoJCW91dC56ID0gVkVSVFRZUEVESVYoeiwgbik7CgoJCS8vIENhbGN1bGF0ZSB4Mit5Mit6Mi9zcXJ0KHgyK3kyK3oyKQoJCWludCBmID0gb3V0LmRvdChvdXQpOwoJCWYgPSBWRVJUVFlQRURJVihQVlJURjJYKDEuMGYpLCBQVlJURjJYKHNxcnQoUFZSVFgyRihmKSkpKTsKCgkJLy8gTXVsdGlwbHkgdmVjdG9yIGNvbXBvbmVudHMgYnkgZgoJCW91dC54ID0gUFZSVFhNVUwob3V0LngsIGYpOwoJCW91dC55ID0gUFZSVFhNVUwob3V0LnksIGYpOwoJCW91dC56ID0gUFZSVFhNVUwob3V0LnosIGYpOwojZWxzZQoJCVZFUlRUWVBFIGxlbiA9IGxlbmd0aCgpOwoJCW91dC54ID1WRVJUVFlQRURJVih4LGxlbik7CgkJb3V0LnkgPVZFUlRUWVBFRElWKHksbGVuKTsKCQlvdXQueiA9VkVSVFRZUEVESVYoeixsZW4pOwojZW5kaWYKCQlyZXR1cm4gb3V0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJZG90CiBAcGFyYW1baW5dCQkJcmhzICAgIEEgc2luZ2xlIHZhbHVlCiBAcmV0dXJuIAkJCXNjYWxhciBwcm9kdWN0CiBAYnJpZWYgICAgICAJCWNhbGN1bGF0ZSB0aGUgc2NhbGFyIHByb2R1Y3Qgb2YgdHdvIFBWUlRWZWMzcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJVkVSVFRZUEUgZG90KGNvbnN0IFBWUlRWZWMzJiByaHMpIGNvbnN0Cgl7CgkJcmV0dXJuIFZFUlRUWVBFTVVMKHgscmhzLngpK1ZFUlRUWVBFTVVMKHkscmhzLnkpK1ZFUlRUWVBFTVVMKHoscmhzLnopOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJY3Jvc3MKIEByZXR1cm4gCQkJcmV0dXJucyB0aHJlZS1kaW1lbnNpb25hbCB2ZWN0b3IKIEBicmllZiAgICAgIAkJY2FsY3VsYXRlIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byBQVlJUVmVjM3MKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzIGNyb3NzKGNvbnN0IFBWUlRWZWMzJiByaHMpIGNvbnN0Cgl7CgkJUFZSVFZlYzMgb3V0OwoJCW91dC54ID0gVkVSVFRZUEVNVUwoeSxyaHMueiktVkVSVFRZUEVNVUwoeixyaHMueSk7CgkJb3V0LnkgPSBWRVJUVFlQRU1VTCh6LHJocy54KS1WRVJUVFlQRU1VTCh4LHJocy56KTsKCQlvdXQueiA9IFZFUlRUWVBFTVVMKHgscmhzLnkpLVZFUlRUWVBFTVVMKHkscmhzLngpOwoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlwdHIKIEByZXR1cm4gCQkJcG9pbnRlcgogQGJyaWVmICAgICAgCQlyZXR1cm5zIGEgcG9pbnRlciB0byBtZW1vcnkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9mIHRoZQoJCQkJCVBWUlRWZWMzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglWRVJUVFlQRSAqcHRyKCkgeyByZXR1cm4gKFZFUlRUWVBFKil0aGlzOyB9Cn07CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBzdHJ1Y3QgICAgICAgICAgICBQVlJUVmVjNCAKIEBicmllZiAgICAgICAgICAgICA0IGNvbXBvbmVudCB2ZWN0b3IKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IFBWUlRWZWM0IDogcHVibGljIFBWUlRWRUNUT1I0CnsKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqIENvbnN0cnVjdG9ycwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAlCbGFuayBjb25zdHJ1Y3Rvci4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjNCgpe30KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCUJsYW5rIGNvbnN0cnVjdG9yLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0KGNvbnN0IFZFUlRUWVBFIHZlYykKCXsKCQl4ID0gdmVjOyB5ID0gdmVjOyB6ID0gdmVjOyB3ID0gdmVjOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJQ29uc3RydWN0cyBhIFBWUlRWZWM0IGZyb20gNCBzZXBhcmF0ZSB2YWx1ZXMKIEBwYXJhbVtpbl0JCWZYICAgICAgVmFsdWUgb2YgeCBjb21wb25lbnQKIEBwYXJhbVtpbl0JCWZZICAgICAgVmFsdWUgb2YgeSBjb21wb25lbnQKIEBwYXJhbVtpbl0JCWZaICAgICAgVmFsdWUgb2YgeiBjb21wb25lbnQKIEBwYXJhbVtpbl0JCWZXICAgICAgVmFsdWUgb2YgdyBjb21wb25lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0KFZFUlRUWVBFIGZYLCBWRVJUVFlQRSBmWSwgVkVSVFRZUEUgZlosIFZFUlRUWVBFIGZXKQoJewoJCXggPSBmWDsJeSA9IGZZOwl6ID0gZlo7CXcgPSBmVzsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQHBhcmFtW2luXQkJCXZlYzMgYSBQVlJUVmVjMwogQHBhcmFtW2luXQkJCWZXICAgICBWYWx1ZSBvZiB3IGNvbXBvbmVudAogQGJyaWVmICAgICAgCQlDb25zdHJ1Y3RzIGEgUFZSVFZlYzQgZnJvbSBhIHZlYzMgYW5kIGEgdyBjb21wb25lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0KGNvbnN0IFBWUlRWZWMzJiB2ZWMzLCBWRVJUVFlQRSBmVykKCXsKCQl4ID0gdmVjMy54Owl5ID0gdmVjMy55Owl6ID0gdmVjMy56Owl3ID0gZlc7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ29uc3RydWN0cyBhIHZlYzQgZnJvbSBhIHZlYzMgYW5kIGEgdyBjb21wb25lbnQKIEBwYXJhbVtpbl0JCQlmWCB2YWx1ZSBvZiB4IGNvbXBvbmVudAogQHBhcmFtW2luXQkJCXZlYzMgYSBQVlJUVmVjMwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzQoVkVSVFRZUEUgZlgsIGNvbnN0IFBWUlRWZWMzJiB2ZWMzKQoJewoJCXggPSBmWDsJeSA9IHZlYzMueDsJeiA9IHZlYzMueTsJdyA9IHZlYzMuejsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlDb25zdHJ1Y3RzIGEgUFZSVFZlYzQgZnJvbSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZm91ciB2YWx1ZXMKIEBwYXJhbVtpbl0JCQlwVmVjIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBmb3VyIHZhbHVlcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzQoY29uc3QgVkVSVFRZUEUqIHBWZWMpCgl7CgkJeCA9ICgqcFZlYysrKTsgeSA9ICgqcFZlYysrKTsgej0gKCpwVmVjKyspOyB3ID0gKnBWZWM7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiogUFZSVFZlYzQgT3BlcmF0b3JzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlBZGRpdGlvbiBvcGVyYXRvciBmb3IgUFZSVFZlYzQKIEBwYXJhbVtpbl0JCQlyaHMgICAgQW5vdGhlciBQVlJUVmVjNAogQHJldHVybiAJCQlyZXN1bHQgb2YgYWRkaXRpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0IG9wZXJhdG9yKyhjb25zdCBQVlJUVmVjNCYgcmhzKSBjb25zdAoJewoJCVBWUlRWZWM0IG91dDsKCQlvdXQueCA9IHgrcmhzLng7CgkJb3V0LnkgPSB5K3Jocy55OwoJCW91dC56ID0geityaHMuejsKCQlvdXQudyA9IHcrcmhzLnc7CgkJcmV0dXJuIG91dDsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlTdWJ0cmFjdGlvbiBvcGVyYXRvciBmb3IgUFZSVFZlYzQKIEBwYXJhbVtpbl0JCQlyaHMgICAgQW5vdGhlciBQVlJUVmVjNAogQHJldHVybiAJCQlyZXN1bHQgb2Ygc3VidHJhY3Rpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0IG9wZXJhdG9yLShjb25zdCBQVlJUVmVjNCYgcmhzKSBjb25zdAoJewoJCVBWUlRWZWM0IG91dDsKCQlvdXQueCA9IHgtcmhzLng7CgkJb3V0LnkgPSB5LXJocy55OwoJCW91dC56ID0gei1yaHMuejsKCQlvdXQudyA9IHctcmhzLnc7CgkJcmV0dXJuIG91dDsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlBZGRpdGlvbiBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBmb3IgUFZSVFZlYzQKIEBwYXJhbVtpbl0JCQlyaHMgICAgQW5vdGhlciBQVlJUVmVjNAogQHJldHVybiAJCQlyZXN1bHQgb2YgYWRkaXRpb24gYW5kIGFzc2lnbm1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0JiBvcGVyYXRvcis9KGNvbnN0IFBWUlRWZWM0JiByaHMpCgl7CgkJeCArPXJocy54OwoJCXkgKz1yaHMueTsKCQl6ICs9cmhzLno7CgkJdyArPXJocy53OwoJCXJldHVybiAqdGhpczsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlTdWJ0cmFjdGlvbiBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBmb3IgUFZSVFZlYzQKIEBwYXJhbVtpbl0JCQlyaHMgICAgQW5vdGhlciBQVlJUVmVjNAogQHJldHVybiAJCQlyZXN1bHQgb2Ygc3VidHJhY3Rpb24gYW5kIGFzc2lnbm1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0JiBvcGVyYXRvci09KGNvbnN0IFBWUlRWZWM0JiByaHMpCgl7CgkJeCAtPXJocy54OwoJCXkgLT1yaHMueTsKCQl6IC09cmhzLno7CgkJdyAtPXJocy53OwoJCXJldHVybiAqdGhpczsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlNYXRyaXggbXVsdGlwbGljYXRpb24gZm9yIFBWUlRWZWM0IGFuZCBQVlJUTWF0NAogQHBhcmFtW2luXQkJCXJocyAgICBBIFBWUlRNYXQ0CiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzQgb3BlcmF0b3IqKGNvbnN0IFBWUlRNYXQ0JiByaHMpIGNvbnN0OwoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCU1hdHJpeCBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudCBmb3IgUFZSVFZlYzQgYW5kIFBWUlRNYXQ0CiBAcGFyYW1baW5dCQkJcmhzICAgIEEgUFZSVE1hdDQKIEByZXR1cm4gCQkJcmVzdWx0IG9mIG11bHRpcGxpY2F0aW9uIGFuZCBhc3NpZ25lbWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzQmIG9wZXJhdG9yKj0oY29uc3QgUFZSVE1hdDQmIHJocyk7CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ29tcG9uZW50d2lzZSBtdWx0aXBsaWNhdGlvbiBvZiBhIFBWUlRWZWM0IGJ5IGEgc2luZ2xlIHZhbHVlCiBAcGFyYW1baW5dCQkJcmhzICBBIHNpbmdsZSBkaW1lbnNpb24gdmFsdWUKIEByZXR1cm4gCQkJcmVzdWx0IG9mIG11bHRpcGxpY2F0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjNCBvcGVyYXRvciooY29uc3QgVkVSVFRZUEUmIHJocykgY29uc3QKCXsKCQlQVlJUVmVjNCBvdXQ7CgkJb3V0LnggPSBWRVJUVFlQRU1VTCh4LHJocyk7CgkJb3V0LnkgPSBWRVJUVFlQRU1VTCh5LHJocyk7CgkJb3V0LnogPSBWRVJUVFlQRU1VTCh6LHJocyk7CgkJb3V0LncgPSBWRVJUVFlQRU1VTCh3LHJocyk7CgkJcmV0dXJuIG91dDsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQljb21wb25lbnR3aXNlIG11bHRpcGxpY2F0aW9uIGFuZCBhc3NpZ25tZW50IG9mIGEgUFZSVFZlYzQgYnkKICAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSB2YWx1ZQogQHBhcmFtW2luXQkJCXJocyAgICAgQSBzaW5nbGUgZGltZW5zaW9uIHZhbHVlCiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVFZlYzQmIG9wZXJhdG9yKj0oY29uc3QgVkVSVFRZUEUmIHJocykKCXsKCQl4ID0gVkVSVFRZUEVNVUwoeCxyaHMpOwoJCXkgPSBWRVJUVFlQRU1VTCh5LHJocyk7CgkJeiA9IFZFUlRUWVBFTVVMKHoscmhzKTsKCQl3ID0gVkVSVFRZUEVNVUwodyxyaHMpOwoJCXJldHVybiAqdGhpczsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQljb21wb25lbnR3aXNlIGRpdmlzaW9uIG9mIGEgUFZSVFZlYzQgYnkgYSBzaW5nbGUgdmFsdWUKIEBwYXJhbVtpbl0JCQlyaHMgICAgIEEgc2luZ2xlIGRpbWVuc2lvbiB2YWx1ZQogQHJldHVybiAJCQlyZXN1bHQgb2YgZGl2aXNpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0IG9wZXJhdG9yLyhjb25zdCBWRVJUVFlQRSYgcmhzKSBjb25zdAoJewoJCVBWUlRWZWM0IG91dDsKCQlvdXQueCA9IFZFUlRUWVBFRElWKHgscmhzKTsKCQlvdXQueSA9IFZFUlRUWVBFRElWKHkscmhzKTsKCQlvdXQueiA9IFZFUlRUWVBFRElWKHoscmhzKTsKCQlvdXQudyA9IFZFUlRUWVBFRElWKHcscmhzKTsKCQlyZXR1cm4gb3V0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCWNvbXBvbmVudHdpc2UgZGl2aXNpb24gYW5kIGFzc2lnbm1lbnQgb2YgYSBQVlJUVmVjNCBieQoJCQkJCWEgc2luZ2xlIHZhbHVlCiBAcGFyYW1baW5dCQkJCXJocyBhIHNpbmdsZSBkaW1lbnNpb24gdmFsdWUKIEByZXR1cm4gCQkJcmVzdWx0IG9mIGRpdmlzaW9uIGFuZCBhc3NpZ25tZW50CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjNCYgb3BlcmF0b3IvPShjb25zdCBWRVJUVFlQRSYgcmhzKQoJewoJCXggPSBWRVJUVFlQRURJVih4LHJocyk7CgkJeSA9IFZFUlRUWVBFRElWKHkscmhzKTsKCQl6ID0gVkVSVFRZUEVESVYoeixyaHMpOwoJCXcgPSBWRVJUVFlQRURJVih3LHJocyk7CgkJcmV0dXJuICp0aGlzOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCWNvbXBvbmVudHdpc2UgbXVsdGlwbGljYXRpb24gb2YgYSBQVlJUVmVjNCBieQoJCQkJCWEgc2luZ2xlIHZhbHVlCiBAcGFyYW1baW5dCQkJCWxocyBhIHNpbmdsZSBkaW1lbnNpb24gdmFsdWUKIEBwYXJhbVtpbl0JCQkJcmhzIGEgUFZSVFZlYzQKIEByZXR1cm4gCQkJcmVzdWx0IG9mIG11bGlwbGljYXRpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZnJpZW5kIFBWUlRWZWM0IG9wZXJhdG9yKihjb25zdCBWRVJUVFlQRSBsaHMsIGNvbnN0IFBWUlRWZWM0JiAgcmhzKQp7CglQVlJUVmVjNCBvdXQ7CglvdXQueCA9IFZFUlRUWVBFTVVMKGxocyxyaHMueCk7CglvdXQueSA9IFZFUlRUWVBFTVVMKGxocyxyaHMueSk7CglvdXQueiA9IFZFUlRUWVBFTVVMKGxocyxyaHMueik7CglvdXQudyA9IFZFUlRUWVBFTVVMKGxocyxyaHMudyk7CglyZXR1cm4gb3V0Owp9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJUFZSVFZlYzQgZXF1YWxpdHkgb3BlcmF0b3IKIEBwYXJhbVtpbl0JCQlyaHMgICAgQSBzaW5nbGUgdmFsdWUKIEByZXR1cm4gCQkJdHJ1ZSBpZiB0aGUgdHdvIHZlY3RvcnMgYXJlIGVxdWFsCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmJvb2wgb3BlcmF0b3I9PShjb25zdCBQVlJUVmVjNCYgcmhzKSBjb25zdAp7CglyZXR1cm4gKCh4ID09IHJocy54KSAmJiAoeSA9PSByaHMueSkgJiYgKHogPT0gcmhzLnopICYmICh3ID09IHJocy53KSk7Cn0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAYnJpZWYgICAgICAJCVBWUlRWZWM0IGluZXF1YWxpdHkgb3BlcmF0b3IKQHBhcmFtW2luXQkJCXJocyAgICBBIHNpbmdsZSB2YWx1ZQpAcmV0dXJuIAkJCXRydWUgaWYgdGhlIHR3byB2ZWN0b3JzIGFyZSBub3QgZXF1YWwKCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmJvb2wgb3BlcmF0b3IhPShjb25zdCBQVlJUVmVjNCYgcmhzKSBjb25zdAp7CglyZXR1cm4gKCh4ICE9IHJocy54KSB8fCAoeSAhPSByaHMueSkgfHwgKHogIT0gcmhzLnopIHx8ICh3ICE9IHJocy53KSk7Cn0KLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqIEZ1bmN0aW9ucwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlsZW5TcXIKIEByZXR1cm4gCQkJc3F1YXJlIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvcgogQGJyaWVmICAgICAgCQljYWxjdWxhdGVzIHRoZSBzcXVhcmUgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglWRVJUVFlQRSBsZW5TcXIoKSBjb25zdAoJewoJCXJldHVybiBWRVJUVFlQRU1VTCh4LHgpK1ZFUlRUWVBFTVVMKHkseSkrVkVSVFRZUEVNVUwoeix6KStWRVJUVFlQRU1VTCh3LHcpOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJbGVuZ3RoCiBAcmV0dXJuIAkJCXRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvcgogQGJyaWVmICAgICAgCQljYWxjdWxhdGVzIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZlY3RvcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJVkVSVFRZUEUgbGVuZ3RoKCkgY29uc3QKCXsKCQlyZXR1cm4gKFZFUlRUWVBFKSBmMnZ0KHNxcnQodnQyZih4KSp2dDJmKHgpICsgdnQyZih5KSp2dDJmKHkpICsgdnQyZih6KSp2dDJmKHopICsgdnQyZih3KSp2dDJmKHcpKSk7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlub3JtYWxpemUKIEByZXR1cm4gCQkJbm9ybWFsaXplZCB2ZWN0b3IKIEBicmllZiAgICAgIAkJY2FsY3VsYXRlcyB0aGUgbm9ybWFsaXplZCB2YWx1ZSBvZiBhIFBWUlRWZWM0CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjNCBub3JtYWxpemUoKQoJewoJCVZFUlRUWVBFIGxlbiA9IGxlbmd0aCgpOwoJCXggPVZFUlRUWVBFRElWKHgsbGVuKTsKCQl5ID1WRVJUVFlQRURJVih5LGxlbik7CgkJeiA9VkVSVFRZUEVESVYoeixsZW4pOwoJCXcgPVZFUlRUWVBFRElWKHcsbGVuKTsKCQlyZXR1cm4gKnRoaXM7Cgl9Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCW5vcm1hbGl6ZWQKIEByZXR1cm4gCQkJbm9ybWFsaXplZCB2ZWN0b3IKIEBicmllZiAgICAgIAkJcmV0dXJucyBhIG5vcm1hbGl6ZWQgdmVjdG9yIG9mIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGlzCgkJCQkJdmVjdG9yCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUVmVjNCBub3JtYWxpemVkKCkgY29uc3QKCXsKCQlQVlJUVmVjNCBvdXQ7CgkJVkVSVFRZUEUgbGVuID0gbGVuZ3RoKCk7CgkJb3V0LnggPVZFUlRUWVBFRElWKHgsbGVuKTsKCQlvdXQueSA9VkVSVFRZUEVESVYoeSxsZW4pOwoJCW91dC56ID1WRVJUVFlQRURJVih6LGxlbik7CgkJb3V0LncgPVZFUlRUWVBFRElWKHcsbGVuKTsKCQlyZXR1cm4gb3V0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJZG90CiBAcmV0dXJuIAkJCXNjYWxhciBwcm9kdWN0CiBAYnJpZWYgICAgICAJCXJldHVybnMgYSBub3JtYWxpemVkIHZlY3RvciBvZiB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcwoJCQkJCXZlY3RvcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJVkVSVFRZUEUgZG90KGNvbnN0IFBWUlRWZWM0JiByaHMpIGNvbnN0Cgl7CgkJcmV0dXJuIFZFUlRUWVBFTVVMKHgscmhzLngpK1ZFUlRUWVBFTVVMKHkscmhzLnkpK1ZFUlRUWVBFTVVMKHoscmhzLnopK1ZFUlRUWVBFTVVMKHcscmhzLncpOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJcHRyCiBAcmV0dXJuIAkJCXBvaW50ZXIgdG8gdmVjdG9yIHZhbHVlcwogQGJyaWVmICAgICAgCQlyZXR1cm5zIGEgcG9pbnRlciB0byBtZW1vcnkgY29udGFpbmluZyB0aGUgdmFsdWVzIG9mIHRoZQoJCQkJCVBWUlRWZWMzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglWRVJUVFlQRSAqcHRyKCkgeyByZXR1cm4gKFZFUlRUWVBFKil0aGlzOyB9Cn07CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBzdHJ1Y3QgICAgICAgICAgICBQVlJUTWF0MwogQGJyaWVmICAgICAgICAgICAgIDN4MyBNYXRyaXgKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IFBWUlRNYXQzIDogcHVibGljIFBWUlRNQVRSSVgzCnsKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqIENvbnN0cnVjdG9ycwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQmxhbmsgY29uc3RydWN0b3IuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDMoKXt9Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlDb25zdHJ1Y3RvciBmcm9tIGFycmF5LgogQHBhcmFtW2luXQkJCXBNYXQgICAgQW4gYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgbWF0cml4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDMoY29uc3QgVkVSVFRZUEUqIHBNYXQpCgl7CgkJVkVSVFRZUEUqIHB0ciA9IGY7CgkJZm9yKGludCBpPTA7aTw5O2krKykKCQl7CgkJCSgqcHRyKyspPSgqcE1hdCsrKTsKCQl9Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkgICAgQ29uc3RydWN0b3IgZnJvbSBkaXN0aW5jdCB2YWx1ZXMuCiBAcGFyYW1baW5dCSAgICAJbTAJbTAgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCSAgICAJbTEJbTEgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCSAgICAJbTIJbTIgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCSAgICAJbTMJbTMgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCSAgICAJbTQJbTQgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCSAgICAJbTUJbTUgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCSAgICAJbTYJbTYgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCSAgICAJbTcJbTcgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCSAgICAJbTgJbTggbWF0cml4IHZhbHVlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDMoVkVSVFRZUEUgbTAsVkVSVFRZUEUgbTEsVkVSVFRZUEUgbTIsCgkJVkVSVFRZUEUgbTMsVkVSVFRZUEUgbTQsVkVSVFRZUEUgbTUsCgkJVkVSVFRZUEUgbTYsVkVSVFRZUEUgbTcsVkVSVFRZUEUgbTgpCgl7CgkJZlswXT1tMDtmWzFdPW0xO2ZbMl09bTI7CgkJZlszXT1tMztmWzRdPW00O2ZbNV09bTU7CgkJZls2XT1tNjtmWzddPW03O2ZbOF09bTg7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ29uc3RydWN0b3IgZnJvbSA0eDQgbWF0cml4IC0gdXNlcyB0b3AgbGVmdCB2YWx1ZXMKIEBwYXJhbVtpbl0JCQltYXQgLSBhIFBWUlRNYXQ0CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDMoY29uc3QgUFZSVE1hdDQmIG1hdCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKiBQVlJUTWF0MyBPUEVSQVRPUlMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCVJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4KCQkJCQlvZiB0aGUgUFZSVE1hdDMKIEBwYXJhbVtpbl0JCQlyb3cJCQlyb3cgb2YgbWF0cml4CiBAcGFyYW1baW5dCQkJY29sdW1uCQljb2x1bW4gb2YgbWF0cml4CiBAcmV0dXJuIAkJCXZhbHVlIG9mIGVsZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglWRVJUVFlQRSYgb3BlcmF0b3IoKShjb25zdCBpbnQgcm93LCBjb25zdCBpbnQgY29sdW1uKQoJewoJCXJldHVybiBmW2NvbHVtbiozK3Jvd107Cgl9Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uCgkJCQkJb2YgdGhlIFBWUlRNYXQzCiBAcGFyYW1baW5dCQkJcm93CQkJcm93IG9mIG1hdHJpeAogQHBhcmFtW2luXQkJCWNvbHVtbgkJY29sdW1uIG9mIG1hdHJpeAogQHJldHVybiAJCQl2YWx1ZSBvZiBlbGVtZW50CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJY29uc3QgVkVSVFRZUEUmIG9wZXJhdG9yKCkoY29uc3QgaW50IHJvdywgY29uc3QgaW50IGNvbHVtbikgY29uc3QKCXsKCQlyZXR1cm4gZltjb2x1bW4qMytyb3ddOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCU1hdHJpeCBtdWx0aXBsaWNhdGlvbiBvZiB0d28gM3gzIG1hdHJpY2VzLgogQHBhcmFtW2luXQkJCXJocyAgICAgQW5vdGhlciBQVlJUTWF0MwogQHJldHVybiAJCQlyZXN1bHQgb2YgbXVsdGlwbGljYXRpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0MyBvcGVyYXRvciooY29uc3QgUFZSVE1hdDMmIHJocykgY29uc3QKCXsKCQlQVlJUTWF0MyBvdXQ7CgkJLy8gY29sIDEKCQlvdXQuZlswXSA9CVZFUlRUWVBFTVVMKGZbMF0scmhzLmZbMF0pK1ZFUlRUWVBFTVVMKGZbM10scmhzLmZbMV0pK1ZFUlRUWVBFTVVMKGZbNl0scmhzLmZbMl0pOwoJCW91dC5mWzFdID0JVkVSVFRZUEVNVUwoZlsxXSxyaHMuZlswXSkrVkVSVFRZUEVNVUwoZls0XSxyaHMuZlsxXSkrVkVSVFRZUEVNVUwoZls3XSxyaHMuZlsyXSk7CgkJb3V0LmZbMl0gPQlWRVJUVFlQRU1VTChmWzJdLHJocy5mWzBdKStWRVJUVFlQRU1VTChmWzVdLHJocy5mWzFdKStWRVJUVFlQRU1VTChmWzhdLHJocy5mWzJdKTsKCgkJLy8gY29sIDIKCQlvdXQuZlszXSA9CVZFUlRUWVBFTVVMKGZbMF0scmhzLmZbM10pK1ZFUlRUWVBFTVVMKGZbM10scmhzLmZbNF0pK1ZFUlRUWVBFTVVMKGZbNl0scmhzLmZbNV0pOwoJCW91dC5mWzRdID0JVkVSVFRZUEVNVUwoZlsxXSxyaHMuZlszXSkrVkVSVFRZUEVNVUwoZls0XSxyaHMuZls0XSkrVkVSVFRZUEVNVUwoZls3XSxyaHMuZls1XSk7CgkJb3V0LmZbNV0gPQlWRVJUVFlQRU1VTChmWzJdLHJocy5mWzNdKStWRVJUVFlQRU1VTChmWzVdLHJocy5mWzRdKStWRVJUVFlQRU1VTChmWzhdLHJocy5mWzVdKTsKCgkJLy8gY29sMwoJCW91dC5mWzZdID0JVkVSVFRZUEVNVUwoZlswXSxyaHMuZls2XSkrVkVSVFRZUEVNVUwoZlszXSxyaHMuZls3XSkrVkVSVFRZUEVNVUwoZls2XSxyaHMuZls4XSk7CgkJb3V0LmZbN10gPQlWRVJUVFlQRU1VTChmWzFdLHJocy5mWzZdKStWRVJUVFlQRU1VTChmWzRdLHJocy5mWzddKStWRVJUVFlQRU1VTChmWzddLHJocy5mWzhdKTsKCQlvdXQuZls4XSA9CVZFUlRUWVBFTVVMKGZbMl0scmhzLmZbNl0pK1ZFUlRUWVBFTVVMKGZbNV0scmhzLmZbN10pK1ZFUlRUWVBFTVVMKGZbOF0scmhzLmZbOF0pOwoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJZWxlbWVudCBieSBlbGVtZW50IGFkZGl0aW9uIG9wZXJhdG9yLgogQHBhcmFtW2luXQkJCXJocyAgICAgQW5vdGhlciBQVlJUTWF0MwogQHJldHVybiAJCQlyZXN1bHQgb2YgYWRkaXRpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0MyBvcGVyYXRvcisoY29uc3QgUFZSVE1hdDMmIHJocykgY29uc3QKCXsKCQlQVlJUTWF0MyBvdXQ7CgkJVkVSVFRZUEUgY29uc3QgKmxwdHIgPSBmLCAqcnB0ciA9IHJocy5mOwoJCVZFUlRUWVBFICpvdXRwdHIgPSBvdXQuZjsKCQlmb3IoaW50IGk9MDtpPDk7aSsrKQoJCXsKCQkJKCpvdXRwdHIrKykgPSAoKmxwdHIrKykgKyAoKnJwdHIrKyk7CgkJfQoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJZWxlbWVudCBieSBlbGVtZW50IHN1YnRyYWN0aW9uIG9wZXJhdG9yLgogQHBhcmFtW2luXQkJCXJocyAgICAgQW5vdGhlciBQVlJUTWF0MwogQHJldHVybiAJCQlyZXN1bHQgb2Ygc3VidHJhY3Rpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0MyBvcGVyYXRvci0oY29uc3QgUFZSVE1hdDMmIHJocykgY29uc3QKCXsKCQlQVlJUTWF0MyBvdXQ7CgkJVkVSVFRZUEUgY29uc3QgKmxwdHIgPSBmLCAqcnB0ciA9IHJocy5mOwoJCVZFUlRUWVBFICpvdXRwdHIgPSBvdXQuZjsKCQlmb3IoaW50IGk9MDtpPDk7aSsrKQoJCXsKCQkJKCpvdXRwdHIrKykgPSAoKmxwdHIrKykgLSAoKnJwdHIrKyk7CgkJfQoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJRWxlbWVudCBieSBlbGVtZW50IGFkZGl0aW9uIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgogQHBhcmFtW2luXQkJCXJocyAgICAgQW5vdGhlciBQVlJUTWF0MwogQHJldHVybiAJCQlSZXN1bHQgb2YgYWRkaXRpb24gYW5kIGFzc2lnbm1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0MyYgb3BlcmF0b3IrPShjb25zdCBQVlJUTWF0MyYgcmhzKQoJewoJCVZFUlRUWVBFICpscHRyID0gZjsKCQlWRVJUVFlQRSBjb25zdCAqcnB0ciA9IHJocy5mOwoJCWZvcihpbnQgaT0wO2k8OTtpKyspCgkJewoJCQkoKmxwdHIrKykgKz0gKCpycHRyKyspOwoJCX0KCQlyZXR1cm4gKnRoaXM7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJZWxlbWVudCBieSBlbGVtZW50IHN1YnRyYWN0aW9uIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgogQHBhcmFtW2luXQkJCXJocyAgICAgQW5vdGhlciBQVlJUTWF0MwogQHJldHVybiAJCQlyZXN1bHQgb2Ygc3VidHJhY3Rpb24gYW5kIGFzc2lnbm1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0MyYgb3BlcmF0b3ItPShjb25zdCBQVlJUTWF0MyYgcmhzKQoJewoJCVZFUlRUWVBFICpscHRyID0gZjsKCQlWRVJUVFlQRSBjb25zdCAqcnB0ciA9IHJocy5mOwoJCWZvcihpbnQgaT0wO2k8OTtpKyspCgkJewoJCQkoKmxwdHIrKykgLT0gKCpycHRyKyspOwoJCX0KCQlyZXR1cm4gKnRoaXM7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJTWF0cml4IG11bHRpcGxpY2F0aW9uIGFuZCBhc3NpZ25tZW50IG9mIHR3byAzeDMgbWF0cmljZXMuCiBAcGFyYW1baW5dCQkJcmhzICAgICBBbm90aGVyIFBWUlRNYXQzCiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRNYXQzJiBvcGVyYXRvcio9KGNvbnN0IFBWUlRNYXQzJiByaHMpCgl7CgkJUFZSVE1hdDMgb3V0OwoJCS8vIGNvbCAxCgkJb3V0LmZbMF0gPQlWRVJUVFlQRU1VTChmWzBdLHJocy5mWzBdKStWRVJUVFlQRU1VTChmWzNdLHJocy5mWzFdKStWRVJUVFlQRU1VTChmWzZdLHJocy5mWzJdKTsKCQlvdXQuZlsxXSA9CVZFUlRUWVBFTVVMKGZbMV0scmhzLmZbMF0pK1ZFUlRUWVBFTVVMKGZbNF0scmhzLmZbMV0pK1ZFUlRUWVBFTVVMKGZbN10scmhzLmZbMl0pOwoJCW91dC5mWzJdID0JVkVSVFRZUEVNVUwoZlsyXSxyaHMuZlswXSkrVkVSVFRZUEVNVUwoZls1XSxyaHMuZlsxXSkrVkVSVFRZUEVNVUwoZls4XSxyaHMuZlsyXSk7CgoJCS8vIGNvbCAyCgkJb3V0LmZbM10gPQlWRVJUVFlQRU1VTChmWzBdLHJocy5mWzNdKStWRVJUVFlQRU1VTChmWzNdLHJocy5mWzRdKStWRVJUVFlQRU1VTChmWzZdLHJocy5mWzVdKTsKCQlvdXQuZls0XSA9CVZFUlRUWVBFTVVMKGZbMV0scmhzLmZbM10pK1ZFUlRUWVBFTVVMKGZbNF0scmhzLmZbNF0pK1ZFUlRUWVBFTVVMKGZbN10scmhzLmZbNV0pOwoJCW91dC5mWzVdID0JVkVSVFRZUEVNVUwoZlsyXSxyaHMuZlszXSkrVkVSVFRZUEVNVUwoZls1XSxyaHMuZls0XSkrVkVSVFRZUEVNVUwoZls4XSxyaHMuZls1XSk7CgoJCS8vIGNvbDMKCQlvdXQuZls2XSA9CVZFUlRUWVBFTVVMKGZbMF0scmhzLmZbNl0pK1ZFUlRUWVBFTVVMKGZbM10scmhzLmZbN10pK1ZFUlRUWVBFTVVMKGZbNl0scmhzLmZbOF0pOwoJCW91dC5mWzddID0JVkVSVFRZUEVNVUwoZlsxXSxyaHMuZls2XSkrVkVSVFRZUEVNVUwoZls0XSxyaHMuZls3XSkrVkVSVFRZUEVNVUwoZls3XSxyaHMuZls4XSk7CgkJb3V0LmZbOF0gPQlWRVJUVFlQRU1VTChmWzJdLHJocy5mWzZdKStWRVJUVFlQRU1VTChmWzVdLHJocy5mWzddKStWRVJUVFlQRU1VTChmWzhdLHJocy5mWzhdKTsKCQkqdGhpcyA9IG91dDsKCQlyZXR1cm4gKnRoaXM7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJRWxlbWVudCBtdWx0aXBsaWNhdGlvbiBieSBhIHNpbmdsZSB2YWx1ZS4KIEBwYXJhbVtpbl0JCQlyaHMgICAgQSBzaW5nbGUgdmFsdWUKIEByZXR1cm4gCQkJUmVzdWx0IG9mIG11bHRpcGxpY2F0aW9uIGFuZCBhc3NpZ25tZW50CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDMmIG9wZXJhdG9yKihjb25zdCBWRVJUVFlQRSByaHMpCgl7CgkJZm9yIChpbnQgaT0wOyBpPDk7ICsraSkKCQl7CgkJCWZbaV0qPXJoczsKCQl9CgkJcmV0dXJuICp0aGlzOwoJfQovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJRWxlbWVudCBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudCBieSBhIHNpbmdsZSB2YWx1ZS4KIEBwYXJhbVtpbl0JCQlyaHMgICAgQSBzaW5nbGUgdmFsdWUKIEByZXR1cm4gCQkJcmVzdWx0IG9mIG11bHRpcGxpY2F0aW9uIGFuZCBhc3NpZ25tZW50CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDMmIG9wZXJhdG9yKj0oY29uc3QgVkVSVFRZUEUgcmhzKQoJewoJCWZvciAoaW50IGk9MDsgaTw5OyArK2kpCgkJewoJCQlmW2ldKj1yaHM7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlNYXRyaXggbXVsdGlwbGljYXRpb24gb2YgM3gzIG1hdHJpeCBhbmQgdmVjMwogQHBhcmFtW2luXQkJCXJocyAgICBBbm90aGVyIFBWUlRWZWMzCiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWMzIG9wZXJhdG9yKihjb25zdCBQVlJUVmVjMyYgcmhzKSBjb25zdAoJewoJCVBWUlRWZWMzIG91dDsKCQlvdXQueCA9IFZFUlRUWVBFTVVMKHJocy54LGZbMF0pK1ZFUlRUWVBFTVVMKHJocy55LGZbM10pK1ZFUlRUWVBFTVVMKHJocy56LGZbNl0pOwoJCW91dC55ID0gVkVSVFRZUEVNVUwocmhzLngsZlsxXSkrVkVSVFRZUEVNVUwocmhzLnksZls0XSkrVkVSVFRZUEVNVUwocmhzLnosZls3XSk7CgkJb3V0LnogPSBWRVJUVFlQRU1VTChyaHMueCxmWzJdKStWRVJUVFlQRU1VTChyaHMueSxmWzVdKStWRVJUVFlQRU1VTChyaHMueixmWzhdKTsKCgkJcmV0dXJuIG91dDsKCX0KCgoJLy8gRlVOQ1RJT05TCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKiBGdW5jdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCWRldGVybWluYW50CiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgogQGJyaWVmICAgICAgCQlNYXRyaXggbXVsdGlwbGljYXRpb24gYW5kIGFzc2lnbm1lbnQgb2YgM3gzIG1hdHJpeCBhbmQgdmVjMwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVZFUlRUWVBFIGRldGVybWluYW50KCkgY29uc3QKCXsKCQlyZXR1cm4gVkVSVFRZUEVNVUwoZlswXSwoVkVSVFRZUEVNVUwoZls0XSxmWzhdKS1WRVJUVFlQRU1VTChmWzddLGZbNV0pKSkKCQkJLSBWRVJUVFlQRU1VTChmWzNdLChWRVJUVFlQRU1VTChmWzFdLGZbOF0pLVZFUlRUWVBFTVVMKGZbN10sZlsyXSkpKQoJCQkrIFZFUlRUWVBFTVVMKGZbNl0sKFZFUlRUWVBFTVVMKGZbMV0sZls1XSktVkVSVFRZUEVNVUwoZls0XSxmWzJdKSkpOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJaW52ZXJzZQogQHJldHVybiAJCQlpbnZlcnNlIG1hdDMKIEBicmllZiAgICAgIAkJQ2FsY3VsYXRlcyBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIHRoaXMgbWF0cml4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDMgaW52ZXJzZSgpIGNvbnN0Cgl7CgkJUFZSVE1hdDMgb3V0OwoKCgkJVkVSVFRZUEUgcmVjRGV0ID0gZGV0ZXJtaW5hbnQoKTsKCQlfQVNTRVJUKHJlY0RldCE9MCk7CgkJcmVjRGV0ID0gVkVSVFRZUEVESVYoZjJ2dCgxLjBmKSxyZWNEZXQpOwoKCQkvL1RPRE86IGRlYWwgd2l0aCBzaW5ndWxhciBtYXRyaWNlcyB3aXRoIG1vcmUgdGhhbiBqdXN0IGFuIGFzc2VydAoKCQkvLyBpbnZlcnNlIGlzIDEvZGV0ICogYWRqb2ludCBvZiBNCgoJCS8vIGFkam9pbnQgaXMgdHJhbnNwb3NlIG9mIGNvZmFjdG9yIG1hdHJpeAoKCQkvLyBkbyB0cmFuc3Bvc2UgYW5kIGNvZmFjdG9ycyBpbiBvbmUgc3RlcAoKCQlvdXQuZlswXSA9IFZFUlRUWVBFTVVMKGZbNF0sZls4XSkgLSBWRVJUVFlQRU1VTChmWzVdLGZbN10pOwoJCW91dC5mWzFdID0gVkVSVFRZUEVNVUwoZlsyXSxmWzddKSAtIFZFUlRUWVBFTVVMKGZbMV0sZls4XSk7CgkJb3V0LmZbMl0gPSBWRVJUVFlQRU1VTChmWzFdLGZbNV0pIC0gVkVSVFRZUEVNVUwoZlsyXSxmWzRdKTsKCgkJb3V0LmZbM10gPSBWRVJUVFlQRU1VTChmWzVdLGZbNl0pIC0gVkVSVFRZUEVNVUwoZlszXSxmWzhdKTsKCQlvdXQuZls0XSA9IFZFUlRUWVBFTVVMKGZbMF0sZls4XSkgLSBWRVJUVFlQRU1VTChmWzJdLGZbNl0pOwoJCW91dC5mWzVdID0gVkVSVFRZUEVNVUwoZlsyXSxmWzNdKSAtIFZFUlRUWVBFTVVMKGZbMF0sZls1XSk7CgoJCW91dC5mWzZdID0gVkVSVFRZUEVNVUwoZlszXSxmWzddKSAtIFZFUlRUWVBFTVVMKGZbNF0sZls2XSk7CgkJb3V0LmZbN10gPSBWRVJUVFlQRU1VTChmWzFdLGZbNl0pIC0gVkVSVFRZUEVNVUwoZlswXSxmWzddKTsKCQlvdXQuZls4XSA9IFZFUlRUWVBFTVVMKGZbMF0sZls0XSkgLSBWRVJUVFlQRU1VTChmWzFdLGZbM10pOwoKCQlvdXQgKj0gcmVjRGV0OwoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQl0cmFuc3Bvc2UKIEByZXR1cm4gCQkJdHJhbnNwb3NlIDN4MyBtYXRyaXgKIEBicmllZiAgICAgIAkJQ2FsY3VsYXRlcyB0aGUgdHJhbnNwb3NlIG9mIHRoaXMgbWF0cml4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDMgdHJhbnNwb3NlKCkgY29uc3QKCXsKCQlQVlJUTWF0MyBvdXQ7CgkJb3V0LmZbMF0gPSBmWzBdOwlvdXQuZlszXSA9IGZbMV07CW91dC5mWzZdID0gZlsyXTsKCQlvdXQuZlsxXSA9IGZbM107CW91dC5mWzRdID0gZls0XTsJb3V0LmZbN10gPSBmWzVdOwoJCW91dC5mWzJdID0gZls2XTsJb3V0LmZbNV0gPSBmWzddOwlvdXQuZls4XSA9IGZbOF07CgkJcmV0dXJuIG91dDsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCXB0cgogQHJldHVybiAJCQlwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIFBWUlRNYXQzCiBAYnJpZWYgICAgICAJCUNhbGN1bGF0ZXMgdHJhbnNwb3NlIG9mIHRoaXMgbWF0cml4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJVkVSVFRZUEUgKnB0cigpIHsgcmV0dXJuIChWRVJUVFlQRSopJmY7IH0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKiBTdGF0aWMgZmFjdG9yeSBmdW5jdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCUlkZW50aXR5CiBAcmV0dXJuIAkJCWEgUFZSVE1hdDMgcmVwcmVzZW50YXRpb24gb2YgdGhlIDN4MyBpZGVudGl0eSBtYXRyaXgKIEBicmllZiAgICAgIAkJR2VuZXJhdGVzIGFuIGlkZW50aXR5IG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0MyBJZGVudGl0eSgpCgl7CgkJUFZSVE1hdDMgb3V0OwoJCW91dC5mWzBdID0gMTtvdXQuZlsxXSA9IDA7b3V0LmZbMl0gPSAwOwoJCW91dC5mWzNdID0gMDtvdXQuZls0XSA9IDE7b3V0LmZbNV0gPSAwOwoJCW91dC5mWzZdID0gMDtvdXQuZls3XSA9IDA7b3V0LmZbOF0gPSAxOwoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlSb3RhdGlvblgKIEByZXR1cm4gCQkJYSBQVlJUTWF0MyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQgcm90YXRpb24KIEBicmllZiAgICAgIAkJQ2FsY3VsYXRlcyBhIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRvIGEgcm90YXRpb24gb2YgYW5nbGUKCQkJCQlkZWdyZWVzIGFib3V0IHRoZSBYIGF4aXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglzdGF0aWMgUFZSVE1hdDMgUm90YXRpb25YKFZFUlRUWVBFIGFuZ2xlKTsKCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCVJvdGF0aW9uWQogQHJldHVybiAJCQlhIFBWUlRNYXQzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3RlZCByb3RhdGlvbgogQGJyaWVmICAgICAgCQlDYWxjdWxhdGVzIGEgbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gYSByb3RhdGlvbiBvZiBhbmdsZQoJCQkJCWRlZ3JlZXMgYWJvdXQgdGhlIFkgYXhpcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0MyBSb3RhdGlvblkoVkVSVFRZUEUgYW5nbGUpOwoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJUm90YXRpb25aCiBAcmV0dXJuIAkJCWEgUFZSVE1hdDMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHJvdGF0aW9uCiBAYnJpZWYgICAgICAJCUNhbGN1bGF0ZXMgYSBtYXRyaXggY29ycmVzcG9uZGluZyB0byBhIHJvdGF0aW9uIG9mIGFuZ2xlCgkJCQkJZGVncmVlcyBhYm91dCB0aGUgWiBheGlzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQzIFJvdGF0aW9uWihWRVJUVFlQRSBhbmdsZSk7CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlSb3RhdGlvbjJECiBAcmV0dXJuIAkJCWEgUFZSVE1hdDMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHJvdGF0aW9uCiBAYnJpZWYgICAgICAJCUNhbGN1bGF0ZXMgYSBtYXRyaXggY29ycmVzcG9uZGluZyB0byBhIHJvdGF0aW9uIG9mIGFuZ2xlCgkJCQkJZGVncmVlcyBhYm91dCB0aGUgWiBheGlzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQzIFJvdGF0aW9uMkQoVkVSVFRZUEUgYW5nbGUpCgl7CgkJcmV0dXJuIFJvdGF0aW9uWihhbmdsZSk7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlTY2FsZQogQHJldHVybiAJCQlhIFBWUlRNYXQzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uCiBAYnJpZWYgICAgICAJCUNhbGN1bGF0ZXMgYSBtYXRyaXggY29ycmVzcG9uZGluZyB0byBzY2FsaW5nIG9mIGZ4LCBmeSBhbmQgZnoKCQkJCQl0aW1lcyBpbiBlYWNoIGF4aXMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQzIFNjYWxlKGNvbnN0IFZFUlRUWVBFIGZ4LGNvbnN0IFZFUlRUWVBFIGZ5LGNvbnN0IFZFUlRUWVBFIGZ6KQoJewoJCXJldHVybiBQVlJUTWF0MyhmeCwwLDAsCgkJCQkJCTAsZnksMCwKCQkJCQkJMCwwLGZ6KTsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCVNjYWxlMkQKIEByZXR1cm4gCQkJYSBQVlJUTWF0MyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQgc2NhbGluZyB0cmFuc2Zvcm1hdGlvbgogQGJyaWVmICAgICAgCQlDYWxjdWxhdGVzIGEgbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gc2NhbGluZyBvZiBmeCwgZnkgYW5kIGZ6CgkJCQkJdGltZXMgaW4gZWFjaCBheGlzLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0MyBTY2FsZTJEKGNvbnN0IFZFUlRUWVBFIGZ4LGNvbnN0IFZFUlRUWVBFIGZ5KQoJewoJCXJldHVybiBQVlJUTWF0MyhmeCwwLDAsCgkJCQkJCTAsZnksMCwKCQkJCQkJMCwwLGYydnQoMSkpOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJVHJhbnNsYXRpb24yRAogQHJldHVybiAJCQlhIFBWUlRNYXQzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3RlZCB0cmFuc2xhdGlvbgogQGJyaWVmICAgICAgCQlDYWxjdWxhdGVzIGEgbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gYSB0cmFuc2Zvcm1hdGlvbgoJCQkJCW9mIHR4IGFuZCB0eSB0aW1lcyBpbiBlYWNoIGF4aXMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQzIFRyYW5zbGF0aW9uMkQoY29uc3QgVkVSVFRZUEUgdHgsIGNvbnN0IFZFUlRUWVBFIHR5KQoJewoJCXJldHVybiBQVlJUTWF0MyggZjJ2dCgxKSwgICAgMCwgIDAsCgkJCQkJCSAwLCAgICBmMnZ0KDEpLCAgMCwKCQkJCQkJdHgsICAJCXR5LCAgZjJ2dCgxKSk7Cgl9Cgp9OwoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAc3RydWN0ICAgICAgICAgICAgUFZSVE1hdDQKIEBicmllZiAgICAgICAgICAgICA0eDQgTWF0cml4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBQVlJUTWF0NCA6IHB1YmxpYyBQVlJUTUFUUklYCnsKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqIENvbnN0cnVjdG9ycwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQmxhbmsgY29uc3RydWN0b3IuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDQoKXt9Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlDb25zdHJ1Y3RvciBmcm9tIGFycmF5LgogQHBhcmFtW2luXQkJCW0wCW0wIG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW0xCW0xIG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW0yCW0yIG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW0zCW0zIG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW00CW00IG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW01CW01IG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW02CW02IG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW03CW03IG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW04CW04IG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW05CW05IG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW0xMAltMTAgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCQkJbTExCW0xMSBtYXRyaXggdmFsdWUKIEBwYXJhbVtpbl0JCQltMTIJbTEyIG1hdHJpeCB2YWx1ZQogQHBhcmFtW2luXQkJCW0xMwltMTMgbWF0cml4IHZhbHVlCiBAcGFyYW1baW5dCQkJbTE0CW0xNCBtYXRyaXggdmFsdWUKIEBwYXJhbVtpbl0JCQltMTUJbTE1IG1hdHJpeCB2YWx1ZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRNYXQ0KFZFUlRUWVBFIG0wLFZFUlRUWVBFIG0xLFZFUlRUWVBFIG0yLFZFUlRUWVBFIG0zLAoJCVZFUlRUWVBFIG00LFZFUlRUWVBFIG01LFZFUlRUWVBFIG02LFZFUlRUWVBFIG03LAoJCVZFUlRUWVBFIG04LFZFUlRUWVBFIG05LFZFUlRUWVBFIG0xMCxWRVJUVFlQRSBtMTEsCgkJVkVSVFRZUEUgbTEyLFZFUlRUWVBFIG0xMyxWRVJUVFlQRSBtMTQsVkVSVFRZUEUgbTE1KQoJewoJCWZbMF09bTA7ZlsxXT1tMTtmWzJdPW0yO2ZbM109bTM7CgkJZls0XT1tNDtmWzVdPW01O2ZbNl09bTY7Zls3XT1tNzsKCQlmWzhdPW04O2ZbOV09bTk7ZlsxMF09bTEwO2ZbMTFdPW0xMTsKCQlmWzEyXT1tMTI7ZlsxM109bTEzO2ZbMTRdPW0xNDtmWzE1XT1tMTU7Cgl9Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlDb25zdHJ1Y3RvciBmcm9tIGRpc3RpbmN0IHZhbHVlcy4KIEBwYXJhbVtpbl0JCQltYXQgICAgIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiAxNiBWRVJUVFlQRXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0NChjb25zdCBWRVJUVFlQRSogbWF0KQoJewoJCVZFUlRUWVBFKiBwdHIgPSBmOwoJCWZvcihpbnQgaT0wO2k8MTY7aSsrKQoJCXsKCQkJKCpwdHIrKyk9KCptYXQrKyk7CgkJfQoJfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiogUFZSVE1hdDQgT1BFUkFUT1JTCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlSZXR1cm5zIHZhbHVlIG9mIHRoZSBlbGVtZW50IGF0IHJvdyByIGFuZCBjb2x1biBjIG9mIHRoZQoJCQkJCVBWUlRNYXQ0CiBAcGFyYW1baW5dCQkJCXIgLSByb3cgb2YgbWF0cml4CiBAcGFyYW1baW5dCQkJCWMgLSBjb2x1bW4gb2YgbWF0cml4CiBAcmV0dXJuIAkJCXZhbHVlIG9mIGVsZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglWRVJUVFlQRSYgb3BlcmF0b3IoKShjb25zdCBpbnQgciwgY29uc3QgaW50IGMpCgl7CgkJcmV0dXJuIGZbYyo0K3JdOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCVJldHVybnMgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYXQgcm93IHIgYW5kIGNvbHVuIGMgb2YgdGhlCgkJCQkJUFZSVE1hdDQKIEBwYXJhbVtpbl0JCQkJciAtIHJvdyBvZiBtYXRyaXgKIEBwYXJhbVtpbl0JCQkJYyAtIGNvbHVtbiBvZiBtYXRyaXgKIEByZXR1cm4gCQkJdmFsdWUgb2YgZWxlbWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCWNvbnN0IFZFUlRUWVBFJiBvcGVyYXRvcigpKGNvbnN0IGludCByLCBjb25zdCBpbnQgYykgY29uc3QKCXsKCQlyZXR1cm4gZltjKjQrcl07Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJTWF0cml4IG11bHRpcGxpY2F0aW9uIG9mIHR3byA0eDQgbWF0cmljZXMuCiBAcGFyYW1baW5dCQkJCXJocyBhbm90aGVyIFBWUlRNYXQ0CiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRNYXQ0IG9wZXJhdG9yKihjb25zdCBQVlJUTWF0NCYgcmhzKSBjb25zdDsKCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQllbGVtZW50IGJ5IGVsZW1lbnQgYWRkaXRpb24gb3BlcmF0b3IuCiBAcGFyYW1baW5dCQkJCXJocyBhbm90aGVyIFBWUlRNYXQ0CiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBhZGRpdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRNYXQ0IG9wZXJhdG9yKyhjb25zdCBQVlJUTWF0NCYgcmhzKSBjb25zdAoJewoJCVBWUlRNYXQ0IG91dDsKCQlWRVJUVFlQRSBjb25zdCAqbHB0ciA9IGYsICpycHRyID0gcmhzLmY7CgkJVkVSVFRZUEUgKm91dHB0ciA9IG91dC5mOwoJCWZvcihpbnQgaT0wO2k8MTY7aSsrKQoJCXsKCQkJKCpvdXRwdHIrKykgPSAoKmxwdHIrKykgKyAoKnJwdHIrKyk7CgkJfQoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJZWxlbWVudCBieSBlbGVtZW50IHN1YnRyYWN0aW9uIG9wZXJhdG9yLgogQHBhcmFtW2luXQkJCQlyaHMgYW5vdGhlciBQVlJUTWF0NAogQHJldHVybiAJCQlyZXN1bHQgb2Ygc3VidHJhY3Rpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0NCBvcGVyYXRvci0oY29uc3QgUFZSVE1hdDQmIHJocykgY29uc3QKCXsKCQlQVlJUTWF0NCBvdXQ7CgkJZm9yKGludCBpPTA7aTwxNjtpKyspCgkJewoJCQlvdXQuZltpXSA9IGZbaV0tcmhzLmZbaV07CgkJfQoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJZWxlbWVudCBieSBlbGVtZW50IGFkZGl0aW9uIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgogQHBhcmFtW2luXQkJCQlyaHMgYW5vdGhlciBQVlJUTWF0NAogQHJldHVybiAJCQlyZXN1bHQgb2YgYWRkaXRpb24gYW5kIGFzc2lnbm1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0NCYgb3BlcmF0b3IrPShjb25zdCBQVlJUTWF0NCYgcmhzKQoJewoJCVZFUlRUWVBFICpscHRyID0gZjsKCQlWRVJUVFlQRSBjb25zdCAqcnB0ciA9IHJocy5mOwoJCWZvcihpbnQgaT0wO2k8MTY7aSsrKQoJCXsKCQkJKCpscHRyKyspICs9ICgqcnB0cisrKTsKCQl9CgkJcmV0dXJuICp0aGlzOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCWVsZW1lbnQgYnkgZWxlbWVudCBzdWJ0cmFjdGlvbiBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4KIEBwYXJhbVtpbl0JCQkJcmhzIGFub3RoZXIgUFZSVE1hdDQKIEByZXR1cm4gCQkJcmVzdWx0IG9mIHN1YnRyYWN0aW9uIGFuZCBhc3NpZ25tZW50CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDQmIG9wZXJhdG9yLT0oY29uc3QgUFZSVE1hdDQmIHJocykKCXsKCQlWRVJUVFlQRSAqbHB0ciA9IGY7CgkJVkVSVFRZUEUgY29uc3QgKnJwdHIgPSByaHMuZjsKCQlmb3IoaW50IGk9MDtpPDE2O2krKykKCQl7CgkJCSgqbHB0cisrKSAtPSAoKnJwdHIrKyk7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJTWF0cml4IG11bHRpcGxpY2F0aW9uIGFuZCBhc3NpZ25tZW50IG9mIHR3byA0eDQgbWF0cmljZXMuCiBAcGFyYW1baW5dCQkJCXJocyBhbm90aGVyIFBWUlRNYXQ0CiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRNYXQ0JiBvcGVyYXRvcio9KGNvbnN0IFBWUlRNYXQ0JiByaHMpCgl7CgkJUFZSVE1hdDQgcmVzdWx0OwoJCS8vIGNvbCAwCgkJcmVzdWx0LmZbMF0gPQlWRVJUVFlQRU1VTChmWzBdLHJocy5mWzBdKStWRVJUVFlQRU1VTChmWzRdLHJocy5mWzFdKStWRVJUVFlQRU1VTChmWzhdLHJocy5mWzJdKStWRVJUVFlQRU1VTChmWzEyXSxyaHMuZlszXSk7CgkJcmVzdWx0LmZbMV0gPQlWRVJUVFlQRU1VTChmWzFdLHJocy5mWzBdKStWRVJUVFlQRU1VTChmWzVdLHJocy5mWzFdKStWRVJUVFlQRU1VTChmWzldLHJocy5mWzJdKStWRVJUVFlQRU1VTChmWzEzXSxyaHMuZlszXSk7CgkJcmVzdWx0LmZbMl0gPQlWRVJUVFlQRU1VTChmWzJdLHJocy5mWzBdKStWRVJUVFlQRU1VTChmWzZdLHJocy5mWzFdKStWRVJUVFlQRU1VTChmWzEwXSxyaHMuZlsyXSkrVkVSVFRZUEVNVUwoZlsxNF0scmhzLmZbM10pOwoJCXJlc3VsdC5mWzNdID0JVkVSVFRZUEVNVUwoZlszXSxyaHMuZlswXSkrVkVSVFRZUEVNVUwoZls3XSxyaHMuZlsxXSkrVkVSVFRZUEVNVUwoZlsxMV0scmhzLmZbMl0pK1ZFUlRUWVBFTVVMKGZbMTVdLHJocy5mWzNdKTsKCgkJLy8gY29sIDEKCQlyZXN1bHQuZls0XSA9CVZFUlRUWVBFTVVMKGZbMF0scmhzLmZbNF0pK1ZFUlRUWVBFTVVMKGZbNF0scmhzLmZbNV0pK1ZFUlRUWVBFTVVMKGZbOF0scmhzLmZbNl0pK1ZFUlRUWVBFTVVMKGZbMTJdLHJocy5mWzddKTsKCQlyZXN1bHQuZls1XSA9CVZFUlRUWVBFTVVMKGZbMV0scmhzLmZbNF0pK1ZFUlRUWVBFTVVMKGZbNV0scmhzLmZbNV0pK1ZFUlRUWVBFTVVMKGZbOV0scmhzLmZbNl0pK1ZFUlRUWVBFTVVMKGZbMTNdLHJocy5mWzddKTsKCQlyZXN1bHQuZls2XSA9CVZFUlRUWVBFTVVMKGZbMl0scmhzLmZbNF0pK1ZFUlRUWVBFTVVMKGZbNl0scmhzLmZbNV0pK1ZFUlRUWVBFTVVMKGZbMTBdLHJocy5mWzZdKStWRVJUVFlQRU1VTChmWzE0XSxyaHMuZls3XSk7CgkJcmVzdWx0LmZbN10gPQlWRVJUVFlQRU1VTChmWzNdLHJocy5mWzRdKStWRVJUVFlQRU1VTChmWzddLHJocy5mWzVdKStWRVJUVFlQRU1VTChmWzExXSxyaHMuZls2XSkrVkVSVFRZUEVNVUwoZlsxNV0scmhzLmZbN10pOwoKCQkvLyBjb2wgMgoJCXJlc3VsdC5mWzhdID0JVkVSVFRZUEVNVUwoZlswXSxyaHMuZls4XSkrVkVSVFRZUEVNVUwoZls0XSxyaHMuZls5XSkrVkVSVFRZUEVNVUwoZls4XSxyaHMuZlsxMF0pK1ZFUlRUWVBFTVVMKGZbMTJdLHJocy5mWzExXSk7CgkJcmVzdWx0LmZbOV0gPQlWRVJUVFlQRU1VTChmWzFdLHJocy5mWzhdKStWRVJUVFlQRU1VTChmWzVdLHJocy5mWzldKStWRVJUVFlQRU1VTChmWzldLHJocy5mWzEwXSkrVkVSVFRZUEVNVUwoZlsxM10scmhzLmZbMTFdKTsKCQlyZXN1bHQuZlsxMF0gPQlWRVJUVFlQRU1VTChmWzJdLHJocy5mWzhdKStWRVJUVFlQRU1VTChmWzZdLHJocy5mWzldKStWRVJUVFlQRU1VTChmWzEwXSxyaHMuZlsxMF0pK1ZFUlRUWVBFTVVMKGZbMTRdLHJocy5mWzExXSk7CgkJcmVzdWx0LmZbMTFdID0JVkVSVFRZUEVNVUwoZlszXSxyaHMuZls4XSkrVkVSVFRZUEVNVUwoZls3XSxyaHMuZls5XSkrVkVSVFRZUEVNVUwoZlsxMV0scmhzLmZbMTBdKStWRVJUVFlQRU1VTChmWzE1XSxyaHMuZlsxMV0pOwoKCQkvLyBjb2wgMwoJCXJlc3VsdC5mWzEyXSA9CVZFUlRUWVBFTVVMKGZbMF0scmhzLmZbMTJdKStWRVJUVFlQRU1VTChmWzRdLHJocy5mWzEzXSkrVkVSVFRZUEVNVUwoZls4XSxyaHMuZlsxNF0pK1ZFUlRUWVBFTVVMKGZbMTJdLHJocy5mWzE1XSk7CgkJcmVzdWx0LmZbMTNdID0JVkVSVFRZUEVNVUwoZlsxXSxyaHMuZlsxMl0pK1ZFUlRUWVBFTVVMKGZbNV0scmhzLmZbMTNdKStWRVJUVFlQRU1VTChmWzldLHJocy5mWzE0XSkrVkVSVFRZUEVNVUwoZlsxM10scmhzLmZbMTVdKTsKCQlyZXN1bHQuZlsxNF0gPQlWRVJUVFlQRU1VTChmWzJdLHJocy5mWzEyXSkrVkVSVFRZUEVNVUwoZls2XSxyaHMuZlsxM10pK1ZFUlRUWVBFTVVMKGZbMTBdLHJocy5mWzE0XSkrVkVSVFRZUEVNVUwoZlsxNF0scmhzLmZbMTVdKTsKCQlyZXN1bHQuZlsxNV0gPQlWRVJUVFlQRU1VTChmWzNdLHJocy5mWzEyXSkrVkVSVFRZUEVNVUwoZls3XSxyaHMuZlsxM10pK1ZFUlRUWVBFTVVMKGZbMTFdLHJocy5mWzE0XSkrVkVSVFRZUEVNVUwoZlsxNV0scmhzLmZbMTVdKTsKCgkJKnRoaXMgPSByZXN1bHQ7CgkJcmV0dXJuICp0aGlzOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCWVsZW1lbnQgbXVsdGlwbGljYXRpb24gYnkgYSBzaW5nbGUgdmFsdWUuCiBAcGFyYW1baW5dCQkJcmhzICAgIEEgc2luZ2xlIHZhbHVlCiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRNYXQ0JiBvcGVyYXRvciooY29uc3QgVkVSVFRZUEUgcmhzKQoJewoJCWZvciAoaW50IGk9MDsgaTwxNjsgKytpKQoJCXsKCQkJZltpXSo9cmhzOwoJCX0KCQlyZXR1cm4gKnRoaXM7Cgl9Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQllbGVtZW50IG11bHRpcGxpY2F0aW9uIGFuZCBhc3NpZ25tZW50IGJ5IGEgc2luZ2xlIHZhbHVlLgogQHBhcmFtW2luXQkJCXJocyAgICBBIHNpbmdsZSB2YWx1ZQogQHJldHVybiAJCQlyZXN1bHQgb2YgbXVsdGlwbGljYXRpb24gYW5kIGFzc2lnbm1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0NCYgb3BlcmF0b3IqPShjb25zdCBWRVJUVFlQRSByaHMpCgl7CgkJZm9yIChpbnQgaT0wOyBpPDE2OyArK2kpCgkJewoJCQlmW2ldKj1yaHM7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQllbGVtZW50IGFzc2lnbm1lbnQgb3BlcmF0b3IuCiBAcGFyYW1baW5dCQkJCXJocyBhbm90aGVyIFBWUlRNYXQ0CiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBhc3NpZ25tZW50CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDQmIG9wZXJhdG9yPShjb25zdCBQVlJUTWF0NCYgcmhzKQoJewoJCWZvciAoaW50IGk9MDsgaTwxNjsgKytpKQoJCXsKCQkJZltpXSA9cmhzLmZbaV07CgkJfQoJCXJldHVybiAqdGhpczsKCX0KLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCU1hdHJpeCBtdWx0aXBsaWNhdGlvbiBvZiA0eDQgbWF0cml4IGFuZCB2ZWMzCiBAcGFyYW1baW5dCQkJCXJocyBhIFBWUlRWZWM0CiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0IG9wZXJhdG9yKihjb25zdCBQVlJUVmVjNCYgcmhzKSBjb25zdAoJewoJCVBWUlRWZWM0IG91dDsKCQlvdXQueCA9IFZFUlRUWVBFTVVMKHJocy54LGZbMF0pK1ZFUlRUWVBFTVVMKHJocy55LGZbNF0pK1ZFUlRUWVBFTVVMKHJocy56LGZbOF0pK1ZFUlRUWVBFTVVMKHJocy53LGZbMTJdKTsKCQlvdXQueSA9IFZFUlRUWVBFTVVMKHJocy54LGZbMV0pK1ZFUlRUWVBFTVVMKHJocy55LGZbNV0pK1ZFUlRUWVBFTVVMKHJocy56LGZbOV0pK1ZFUlRUWVBFTVVMKHJocy53LGZbMTNdKTsKCQlvdXQueiA9IFZFUlRUWVBFTVVMKHJocy54LGZbMl0pK1ZFUlRUWVBFTVVMKHJocy55LGZbNl0pK1ZFUlRUWVBFTVVMKHJocy56LGZbMTBdKStWRVJUVFlQRU1VTChyaHMudyxmWzE0XSk7CgkJb3V0LncgPSBWRVJUVFlQRU1VTChyaHMueCxmWzNdKStWRVJUVFlQRU1VTChyaHMueSxmWzddKStWRVJUVFlQRU1VTChyaHMueixmWzExXSkrVkVSVFRZUEVNVUwocmhzLncsZlsxNV0pOwoKCQlyZXR1cm4gb3V0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCU1hdHJpeCBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudCBvZiA0eDQgbWF0cml4IGFuZCB2ZWMzCiBAcGFyYW1baW5dCQkJCXJocyBhIFBWUlRWZWM0CiBAcmV0dXJuIAkJCXJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvbiBhbmQgYXNzaWdubWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRWZWM0IG9wZXJhdG9yKj0oY29uc3QgUFZSVFZlYzQmIHJocykgY29uc3QKCXsKCQlQVlJUVmVjNCBvdXQ7CgkJb3V0LnggPSBWRVJUVFlQRU1VTChyaHMueCxmWzBdKStWRVJUVFlQRU1VTChyaHMueSxmWzRdKStWRVJUVFlQRU1VTChyaHMueixmWzhdKStWRVJUVFlQRU1VTChyaHMudyxmWzEyXSk7CgkJb3V0LnkgPSBWRVJUVFlQRU1VTChyaHMueCxmWzFdKStWRVJUVFlQRU1VTChyaHMueSxmWzVdKStWRVJUVFlQRU1VTChyaHMueixmWzldKStWRVJUVFlQRU1VTChyaHMudyxmWzEzXSk7CgkJb3V0LnogPSBWRVJUVFlQRU1VTChyaHMueCxmWzJdKStWRVJUVFlQRU1VTChyaHMueSxmWzZdKStWRVJUVFlQRU1VTChyaHMueixmWzEwXSkrVkVSVFRZUEVNVUwocmhzLncsZlsxNF0pOwoJCW91dC53ID0gVkVSVFRZUEVNVUwocmhzLngsZlszXSkrVkVSVFRZUEVNVUwocmhzLnksZls3XSkrVkVSVFRZUEVNVUwocmhzLnosZlsxMV0pK1ZFUlRUWVBFTVVMKHJocy53LGZbMTVdKTsKCgkJcmV0dXJuIG91dDsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlDYWxjdWxhdGVzIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgdGhpcyBtYXRyaXgKCQkJCQlUaGUgbWF0cml4IG11c3QgYmUgb2YgdGhlIGZvcm0gOgoJCQkJCUEgMAoJCQkJCUMgMQoJCQkJCVdoZXJlIEEgaXMgYSAzeDMgbWF0cml4IGFuZCBDIGlzIGEgMXgzIG1hdHJpeC4KIEByZXR1cm4gCQkJaW52ZXJzZSBtYXQ0CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDQgaW52ZXJzZSgpIGNvbnN0OwoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJaW52ZXJzZUV4CiBAcmV0dXJuIAkJCWludmVyc2UgbWF0NAogQGJyaWVmICAgICAgCQlDYWxjdWxhdGVzIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgdGhpcyBtYXRyaXgKCQkJCQlVc2VzIGEgbGluZWFyIGVxdWF0aW9uIHNvbHZlciBhbmQgdGhlIGtub3dsZWRnZSB0aGF0IE0uTV4tMT1JLgoJCQkJCVVzZSB0aGlzIGZuIHRvIGNhbGN1bGF0ZSB0aGUgaW52ZXJzZSBvZiBtYXRyaWNlcyB0aGF0CgkJCQkJaW52ZXJzZSgpIGNhbm5vdC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0NCBpbnZlcnNlRXgoKSBjb25zdAoJewoJCVBWUlRNYXQ0IG91dDsKCQlWRVJUVFlQRSAJCSpwcFJvd3NbNF07CgkJVkVSVFRZUEUgCQlwUmVzWzRdOwoJCVZFUlRUWVBFIAkJcEluWzIwXTsKCQlpbnQJCQkJaSwgajsKCgkJZm9yKGkgPSAwOyBpIDwgNDsgKytpKQoJCQlwcFJvd3NbaV0gPSAmcEluW2kgKiA1XTsKCgkJLyogU29sdmUgNCBzZXRzIG9mIDQgbGluZWFyIGVxdWF0aW9ucyAqLwoJCWZvcihpID0gMDsgaSA8IDQ7ICsraSkKCQl7CgkJCWZvcihqID0gMDsgaiA8IDQ7ICsraikKCQkJewoJCQkJcHBSb3dzW2pdWzBdID0gUFZSVE1hdDQ6OklkZW50aXR5KCkuZltpICsgNCAqIGpdOwoJCQkJbWVtY3B5KCZwcFJvd3Nbal1bMV0sICZmW2ogKiA0XSwgNCAqIHNpemVvZihWRVJUVFlQRSkpOwoJCQl9CgoJCQlQVlJUTGluZWFyRXFTb2x2ZShwUmVzLCAoVkVSVFRZUEUqKilwcFJvd3MsIDQpOwoKCQkJZm9yKGogPSAwOyBqIDwgNDsgKytqKQoJCQl7CgkJCQlvdXQuZltpICsgNCAqIGpdID0gcFJlc1tqXTsKCQkJfQoJCX0KCgkJcmV0dXJuIG91dDsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCXRyYW5zcG9zZQogQHJldHVybiAJCQl0cmFuc3Bvc2UgbWF0NAogQGJyaWVmICAgICAgCQlDYWxjdWxhdGVzIHRyYW5zcG9zZSBvZiB0aGlzIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRNYXQ0IHRyYW5zcG9zZSgpIGNvbnN0Cgl7CgkJUFZSVE1hdDQgb3V0OwoJCW91dC5mWzBdID0gZlswXTsJCW91dC5mWzFdID0gZls0XTsJCW91dC5mWzJdID0gZls4XTsJCW91dC5mWzNdID0gZlsxMl07CgkJb3V0LmZbNF0gPSBmWzFdOwkJb3V0LmZbNV0gPSBmWzVdOwkJb3V0LmZbNl0gPSBmWzldOwkJb3V0LmZbN10gPSBmWzEzXTsKCQlvdXQuZls4XSA9IGZbMl07CQlvdXQuZls5XSA9IGZbNl07CQlvdXQuZlsxMF0gPSBmWzEwXTsJCW91dC5mWzExXSA9IGZbMTRdOwoJCW91dC5mWzEyXSA9IGZbM107CQlvdXQuZlsxM10gPSBmWzddOwkJb3V0LmZbMTRdID0gZlsxMV07CQlvdXQuZlsxNV0gPSBmWzE1XTsKCQlyZXR1cm4gb3V0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCUFsdGVycyB0aGUgdHJhbnNsYXRpb24gY29tcG9uZW50IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCiBAcGFyYW1baW5dCQkJdHggICAgICBEaXN0YW5jZSBvZiB0cmFuc2xhdGlvbiBpbiB4IGF4aXMKIEBwYXJhbVtpbl0JCQl0eSAgICAgIERpc3RhbmNlIG9mIHRyYW5zbGF0aW9uIGluIHkgYXhpcwogQHBhcmFtW2luXQkJCXR6ICAgICAgRGlzdGFuY2Ugb2YgdHJhbnNsYXRpb24gaW4geiBheGlzCiBAcmV0dXJuIAkJCVJldHVybnMgdGhpcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVBWUlRNYXQ0JiBwb3N0VHJhbnNsYXRlKFZFUlRUWVBFIHR4LCBWRVJUVFlQRSB0eSwgVkVSVFRZUEUgdHopCgl7CgkJZlsxMl0gKz0gVkVSVFRZUEVNVUwodHgsZlswXSkrVkVSVFRZUEVNVUwodHksZls0XSkrVkVSVFRZUEVNVUwodHosZls4XSk7CgkJZlsxM10gKz0gVkVSVFRZUEVNVUwodHgsZlsxXSkrVkVSVFRZUEVNVUwodHksZls1XSkrVkVSVFRZUEVNVUwodHosZls5XSk7CgkJZlsxNF0gKz0gVkVSVFRZUEVNVUwodHgsZlsyXSkrVkVSVFRZUEVNVUwodHksZls2XSkrVkVSVFRZUEVNVUwodHosZlsxMF0pOwoJCWZbMTVdICs9IFZFUlRUWVBFTVVMKHR4LGZbM10pK1ZFUlRUWVBFTVVMKHR5LGZbN10pK1ZFUlRUWVBFTVVMKHR6LGZbMTFdKTsKCi8vCQkJY29sKDMpICs9IHR4ICogY29sKDApICsgdHkgKiBjb2woMSkgKyB0eiAqIGNvbCgyKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQWx0ZXJzIHRoZSB0cmFuc2xhdGlvbiBjb21wb25lbnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KIEBwYXJhbVtpbl0JCQl0dmVjICAgIFRyYW5zbGF0aW9uIHZlY3RvcgogQHJldHVybiAJCQlSZXR1cm5zIHRoaXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglQVlJUTWF0NCYgcG9zdFRyYW5zbGF0ZShjb25zdCBQVlJUVmVjMyYgdHZlYykKCXsKCQlyZXR1cm4gcG9zdFRyYW5zbGF0ZSh0dmVjLngsIHR2ZWMueSwgdHZlYy56KTsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlUcmFuc2xhdGVzIHRoZSBtYXRyaXggZnJvbSB0aGUgcGFzc2VkIHBhcmFtZXRlcnMKIEBwYXJhbVtpbl0JCQl0eCAgICAgIERpc3RhbmNlIG9mIHRyYW5zbGF0aW9uIGluIHggYXhpcwogQHBhcmFtW2luXQkJCXR5ICAgICAgRGlzdGFuY2Ugb2YgdHJhbnNsYXRpb24gaW4geSBheGlzCiBAcGFyYW1baW5dCQkJdHogICAgICBEaXN0YW5jZSBvZiB0cmFuc2xhdGlvbiBpbiB6IGF4aXMKIEByZXR1cm4gCQkJUmV0dXJucyB0aGlzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDQmIHByZVRyYW5zbGF0ZShWRVJUVFlQRSB0eCwgVkVSVFRZUEUgdHksIFZFUlRUWVBFIHR6KQoJewoJCWZbMF0rPVZFUlRUWVBFTVVMKGZbM10sdHgpOwlmWzRdKz1WRVJUVFlQRU1VTChmWzddLHR4KTsJZls4XSs9VkVSVFRZUEVNVUwoZlsxMV0sdHgpOwlmWzEyXSs9VkVSVFRZUEVNVUwoZlsxNV0sdHgpOwoJCWZbMV0rPVZFUlRUWVBFTVVMKGZbM10sdHkpOwlmWzVdKz1WRVJUVFlQRU1VTChmWzddLHR5KTsJZls5XSs9VkVSVFRZUEVNVUwoZlsxMV0sdHkpOwlmWzEzXSs9VkVSVFRZUEVNVUwoZlsxNV0sdHkpOwoJCWZbMl0rPVZFUlRUWVBFTVVMKGZbM10sdHopOwlmWzZdKz1WRVJUVFlQRU1VTChmWzddLHR6KTsJZlsxMF0rPVZFUlRUWVBFTVVMKGZbMTFdLHR6KTsJZlsxNF0rPVZFUlRUWVBFTVVMKGZbMTVdLHR6KTsKCi8vCQkJcm93KDApICs9IHR4ICogcm93KDMpOwovLwkJCXJvdygxKSArPSB0eSAqIHJvdygzKTsKLy8JCQlyb3coMikgKz0gdHogKiByb3coMyk7CgkJcmV0dXJuICp0aGlzOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCVRyYW5zbGF0ZXMgdGhlIG1hdHJpeCBmcm9tIHRoZSBwYXNzZWQgcGFyYW1ldGVycwogQHBhcmFtW2luXQkJCXR2ZWMgICAgVHJhbnNsYXRpb24gdmVjdG9yCiBAcmV0dXJuIAkJCVJldHVybnMgdGhlIHRyYW5zbGF0aW9uIGRlZmluZWQgYnkgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJUFZSVE1hdDQmIHByZVRyYW5zbGF0ZShjb25zdCBQVlJUVmVjMyYgdHZlYykKCXsKCQlyZXR1cm4gcHJlVHJhbnNsYXRlKHR2ZWMueCwgdHZlYy55LCB0dmVjLnopOwoJfQovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ2FsY3VsYXRlcyB0cmFuc3Bvc2Ugb2YgdGhpcyBtYXRyaXgKIEByZXR1cm4gCQkJcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aGUgZWxlbWVudHMgb2YgdGhpcyBQVlJUTWF0NAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCVZFUlRUWVBFICpwdHIoKSB7IHJldHVybiAoVkVSVFRZUEUqKSZmOyB9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiogU3RhdGljIGZhY3RvcnkgZnVuY3Rpb25zCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJR2VuZXJhdGVzIGFuIGlkZW50aXR5IG1hdHJpeAogQHJldHVybiAJCQlhIFBWUlRNYXQ0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSA0eDQgaWRlbnRpdHkgbWF0cml4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQ0IElkZW50aXR5KCkKCXsKCQlQVlJUTWF0NCBvdXQ7CgkJb3V0LmZbMF0gPSBmMnZ0KDEpO291dC5mWzFdID0gMDtvdXQuZlsyXSA9IDA7b3V0LmZbM10gPSAwOwoJCW91dC5mWzRdID0gMDtvdXQuZls1XSA9IGYydnQoMSk7b3V0LmZbNl0gPSAwO291dC5mWzddID0gMDsKCQlvdXQuZls4XSA9IDA7b3V0LmZbOV0gPSAwO291dC5mWzEwXSA9IGYydnQoMSk7b3V0LmZbMTFdID0gMDsKCQlvdXQuZlsxMl0gPSAwO291dC5mWzEzXSA9IDA7b3V0LmZbMTRdID0gMDtvdXQuZlsxNV0gPSBmMnZ0KDEpOwoJCXJldHVybiBvdXQ7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlSb3RhdGlvblgKIEByZXR1cm4gCQkJYSBQVlJUTWF0MyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQgcm90YXRpb24KIEBicmllZiAgICAgIAkJQ2FsY3VsYXRlcyBhIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRvIGEgcm90YXRpb24gb2YgYW5nbGUKCQkJCQlkZWdyZWVzIGFib3V0IHRoZSBYIGF4aXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglzdGF0aWMgUFZSVE1hdDQgUm90YXRpb25YKFZFUlRUWVBFIGFuZ2xlKTsKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJUm90YXRpb25ZCiBAcmV0dXJuIAkJCWEgUFZSVE1hdDMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHJvdGF0aW9uCiBAYnJpZWYgICAgICAJCUNhbGN1bGF0ZXMgYSBtYXRyaXggY29ycmVzcG9uZGluZyB0byBhIHJvdGF0aW9uIG9mIGFuZ2xlCgkJCQkJZGVncmVlcyBhYm91dCB0aGUgWSBheGlzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQ0IFJvdGF0aW9uWShWRVJUVFlQRSBhbmdsZSk7Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGZuICAgICAgIAkJCVJvdGF0aW9uWgogQHJldHVybiAJCQlhIFBWUlRNYXQzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3RlZCByb3RhdGlvbgogQGJyaWVmICAgICAgCQlDYWxjdWxhdGVzIGEgbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gYSByb3RhdGlvbiBvZiBhbmdsZQoJCQkJCWRlZ3JlZXMgYWJvdXQgdGhlIFogYXhpcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBSb3RhdGlvblooVkVSVFRZUEUgYW5nbGUpOwoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCUNhbGN1bGF0ZXMgYSBtYXRyaXggY29ycmVzcG9uZGluZyB0byBzY2FsaW5nIG9mIGZ4LCBmeSBhbmQgZnoKCQkJCQl0aW1lcyBpbiBlYWNoIGF4aXMuCiBAcmV0dXJuIAkJCWEgUFZSVE1hdDMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglzdGF0aWMgUFZSVE1hdDQgU2NhbGUoY29uc3QgVkVSVFRZUEUgZngsY29uc3QgVkVSVFRZUEUgZnksY29uc3QgVkVSVFRZUEUgZnopCgl7CgkJcmV0dXJuIFBWUlRNYXQ0KGZ4LDAsMCwwLAoJCQkwLGZ5LDAsMCwKCQkJMCwwLGZ6LDAsCgkJCTAsMCwwLGYydnQoMSkpOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCUNhbGN1bGF0ZXMgYSBtYXRyaXggY29ycmVzcG9uZGluZyB0byBzY2FsaW5nIG9mIHRoZSBnaXZlbiB2ZWN0b3IuCiBAcmV0dXJuIAkJCWEgUFZSVE1hdDMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglzdGF0aWMgUFZSVE1hdDQgU2NhbGUoY29uc3QgUFZSVFZlYzMmIHZlYykKCXsKCQlyZXR1cm4gU2NhbGUodmVjLngsIHZlYy55LCB2ZWMueik7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ2FsY3VsYXRlcyBhIDR4NCBtYXRyaXggY29ycmVzcG9uZGluZyB0byBhIHRyYW5zZm9ybWF0aW9uCgkJCQkJb2YgdHgsIHR5IGFuZCB0eiBkaXN0YW5jZSBpbiBlYWNoIGF4aXMuCiBAcmV0dXJuIAkJCWEgUFZSVE1hdDQgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHRyYW5zbGF0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQ0IFRyYW5zbGF0aW9uKGNvbnN0IFZFUlRUWVBFIHR4LCBjb25zdCBWRVJUVFlQRSB0eSwgY29uc3QgVkVSVFRZUEUgdHopCgl7CgkJcmV0dXJuIFBWUlRNYXQ0KGYydnQoMSksMCwwLDAsCgkJCTAsZjJ2dCgxKSwwLDAsCgkJCTAsMCxmMnZ0KDEpLDAsCgkJCXR4LHR5LHR6LGYydnQoMSkpOwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJCUNhbGN1bGF0ZXMgYSA0eDQgbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gYSB0cmFuc2Zvcm1hdGlvbgoJCQkJCW9mIHR4LCB0eSBhbmQgdHogZGlzdGFuY2UgaW4gZWFjaCBheGlzIGFzIHRha2VuIGZyb20gdGhlCgkJCQkJZ2l2ZW4gdmVjdG9yLgogQHJldHVybiAJCQlhIFBWUlRNYXQ0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3RlZCB0cmFuc2xhdGlvbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCglzdGF0aWMgUFZSVE1hdDQgVHJhbnNsYXRpb24oY29uc3QgUFZSVFZlYzMmIHZlYykKCXsKCQlyZXR1cm4gVHJhbnNsYXRpb24odmVjLngsIHZlYy55LCB2ZWMueik7Cgl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiogQ2xpcHNwYWNlIGVudW0KKiogRGV0ZXJtaW5lcyB3aGV0aGVyIGNsaXAgc3BhY2UgWiByYW5nZXMgZnJvbSAtMSB0byAxIChPR0wpIG9yIGZyb20gMCB0byAxIChEM0QpCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJZW51bSBlQ2xpcHNwYWNlIHsgT0dMLCBEM0QgfTsKCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCQlUcmFuc2xhdGVzIHRoZSBtYXRyaXggZnJvbSB0aGUgcGFzc2VkIHBhcmFtZXRlcnMKIEBwYXJhbVtpbl0JCQlsZWZ0ICAgICAgICBMZWZ0IHZpZXcgcGxhbmUKIEBwYXJhbVtpbl0JCQl0b3AgICAgICAgICBUb3AgdmlldyBwbGFuZQogQHBhcmFtW2luXQkJCXJpZ2h0ICAgICAgIFJpZ2h0IHZpZXcgcGxhbmUKIEBwYXJhbVtpbl0JCQlib3R0b20gICAgICBCb3R0b20gdmlldyBwbGFuZQogQHBhcmFtW2luXQkJCW5lYXJQbGFuZSAgIFRoZSBuZWFyIHJlbmRlcmluZyBwbGFuZQogQHBhcmFtW2luXQkJCWZhclBsYW5lICAgIFRoZSBmYXIgcmVuZGVyaW5nIHBsYW5lCiBAcGFyYW1baW5dCQkJY3MgICAgICAgICAgV2hpY2ggY2xpcHNwYWNlIGNvbnZlbnRpb24gaXMgYmVpbmcgdXNlZAogQHBhcmFtW2luXQkJCWJSb3RhdGUgICAgIElzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCQlSZXR1cm5zIHRoZSBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IGRlZmluZWQgYnkgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQ0IE9ydGhvKFZFUlRUWVBFIGxlZnQsIFZFUlRUWVBFIHRvcCwgVkVSVFRZUEUgcmlnaHQsCgkJVkVSVFRZUEUgYm90dG9tLCBWRVJUVFlQRSBuZWFyUGxhbmUsIFZFUlRUWVBFIGZhclBsYW5lLCBjb25zdCBlQ2xpcHNwYWNlIGNzLCBib29sIGJSb3RhdGUgPSBmYWxzZSkKCXsKCQlWRVJUVFlQRSByY3BsbXIgPSBWRVJUVFlQRURJVihWRVJUVFlQRSgxKSwobGVmdCAtIHJpZ2h0KSk7CgkJVkVSVFRZUEUgcmNwYm10ID0gVkVSVFRZUEVESVYoVkVSVFRZUEUoMSksKGJvdHRvbSAtIHRvcCkpOwoJCVZFUlRUWVBFIHJjcG5tZiA9IFZFUlRUWVBFRElWKFZFUlRUWVBFKDEpLChuZWFyUGxhbmUgLSBmYXJQbGFuZSkpOwoKCQlQVlJUTWF0NCByZXN1bHQ7CgoJCWlmIChiUm90YXRlKQoJCXsKCQkJcmVzdWx0LmZbMF09MDsJCXJlc3VsdC5mWzRdPVZFUlRUWVBFTVVMKDIscmNwbG1yKTsgcmVzdWx0LmZbOF09MDsgcmVzdWx0LmZbMTJdPVZFUlRUWVBFTVVMKC0ocmlnaHQrbGVmdCkscmNwbG1yKTsKCQkJcmVzdWx0LmZbMV09VkVSVFRZUEVNVUwoLTIscmNwYm10KTsJcmVzdWx0LmZbNV09MDsJCXJlc3VsdC5mWzldPTA7CXJlc3VsdC5mWzEzXT1WRVJUVFlQRU1VTCgodG9wK2JvdHRvbSkscmNwYm10KTsKCQl9CgkJZWxzZQoJCXsKCQkJcmVzdWx0LmZbMF09VkVSVFRZUEVNVUwoLTIscmNwbG1yKTsJcmVzdWx0LmZbNF09MDsgcmVzdWx0LmZbOF09MDsgcmVzdWx0LmZbMTJdPVZFUlRUWVBFTVVMKHJpZ2h0K2xlZnQscmNwbG1yKTsKCQkJcmVzdWx0LmZbMV09MDsJCXJlc3VsdC5mWzVdPVZFUlRUWVBFTVVMKC0yLHJjcGJtdCk7CXJlc3VsdC5mWzldPTA7CXJlc3VsdC5mWzEzXT1WRVJUVFlQRU1VTCgodG9wK2JvdHRvbSkscmNwYm10KTsKCQl9CgkJaWYgKGNzID09IEQzRCkKCQl7CgkJCXJlc3VsdC5mWzJdPTA7CXJlc3VsdC5mWzZdPTA7CXJlc3VsdC5mWzEwXT0tcmNwbm1mOwlyZXN1bHQuZlsxNF09VkVSVFRZUEVNVUwobmVhclBsYW5lLHJjcG5tZik7CgkJfQoJCWVsc2UKCQl7CgkJCXJlc3VsdC5mWzJdPTA7CXJlc3VsdC5mWzZdPTA7CXJlc3VsdC5mWzEwXT1WRVJUVFlQRU1VTCgtMixyY3BubWYpOwlyZXN1bHQuZlsxNF09VkVSVFRZUEVNVUwobmVhclBsYW5lICsgZmFyUGxhbmUscmNwbm1mKTsKCQl9CgkJcmVzdWx0LmZbM109MDsJcmVzdWx0LmZbN109MDsJcmVzdWx0LmZbMTFdPTA7CXJlc3VsdC5mWzE1XT0xOwoKCQlyZXR1cm4gcmVzdWx0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAZm4gICAgICAgCQkJTG9va0F0UkgKIEBwYXJhbVtpbl0JCQkJdkV5ZSBwb3NpdGlvbiBvZiAnY2FtZXJhJwogQHBhcmFtW2luXQkJCQl2QXQgdGFyZ2V0IHRoYXQgY2FtZXJhIHBvaW50cyBhdAogQHBhcmFtW2luXQkJCQl2VXAgdXAgdmVjdG9yIGZvciBjYW1lcmEKIEByZXR1cm4gCQkJUmV0dXJucyB0aGUgdmlldyBtYXRyaXggZGVmaW5lZCBieSB0aGUgcGFzc2VkIHBhcmFtZXRlcnMKIEBicmllZiAgICAgIAkJQ3JlYXRlIGEgbG9vay1hdCB2aWV3IG1hdHJpeCBmb3IgYSByaWdodCBoYW5kIGNvb3JkaW5hdGUKCQkJCQlzeXN0ZW0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglzdGF0aWMgUFZSVE1hdDQgTG9va0F0UkgoY29uc3QgUFZSVFZlYzMmIHZFeWUsIGNvbnN0IFBWUlRWZWMzJiB2QXQsIGNvbnN0IFBWUlRWZWMzJiB2VXApCgkJeyByZXR1cm4gTG9va0F0KHZFeWUsIHZBdCwgdlVwLCB0cnVlKTsgfQovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBmbiAgICAgICAJCQlMb29rQXRMSAogQHBhcmFtW2luXQkJCQl2RXllIHBvc2l0aW9uIG9mICdjYW1lcmEnCiBAcGFyYW1baW5dCQkJCXZBdCB0YXJnZXQgdGhhdCBjYW1lcmEgcG9pbnRzIGF0CiBAcGFyYW1baW5dCQkJCXZVcCB1cCB2ZWN0b3IgZm9yIGNhbWVyYQogQHJldHVybiAJCQlSZXR1cm5zIHRoZSB2aWV3IG1hdHJpeCBkZWZpbmVkIGJ5IHRoZSBwYXNzZWQgcGFyYW1ldGVycwogQGJyaWVmICAgICAgCQlDcmVhdGUgYSBsb29rLWF0IHZpZXcgbWF0cml4IGZvciBhIGxlZnQgaGFuZCBjb29yZGluYXRlCgkJCQkJc3lzdGVtCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQ0IExvb2tBdExIKGNvbnN0IFBWUlRWZWMzJiB2RXllLCBjb25zdCBQVlJUVmVjMyYgdkF0LCBjb25zdCBQVlJUVmVjMyYgdlVwKQoJCXsgcmV0dXJuIExvb2tBdCh2RXllLCB2QXQsIHZVcCwgZmFsc2UpOwl9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAlDcmVhdGUgYSBwZXJzcGVjdGl2ZSBtYXRyaXggZm9yIGEgcmlnaHQgaGFuZCBjb29yZGluYXRlCgkJCQlzeXN0ZW0KIEBwYXJhbVtpbl0JCQl3aWR0aAkJd2lkdGggb2Ygdmlld3BsYW5lCiBAcGFyYW1baW5dCQkJaGVpZ2h0CQloZWlnaHQgb2Ygdmlld3BsYW5lCiBAcGFyYW1baW5dCQkJbmVhclBsYW5lCW5lYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCQlmYXJQbGFuZQlmYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCQljcwkJCWNzIHdoaWNoIGNsaXBzcGFjZSBjb252ZW50aW9uIGlzIGJlaW5nIHVzZWQKIEBwYXJhbVtpbl0JCQliUm90YXRlIGlzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCVBlcnNwZWN0aXZlIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBQZXJzcGVjdGl2ZVJIKFZFUlRUWVBFIHdpZHRoLCBWRVJUVFlQRSBoZWlnaHQsIFZFUlRUWVBFIG5lYXJQbGFuZSwKCQlWRVJUVFlQRSBmYXJQbGFuZSwgY29uc3QgZUNsaXBzcGFjZSBjcywgYm9vbCBiUm90YXRlID0gZmFsc2UpCgkJeyByZXR1cm4gUGVyc3BlY3RpdmUod2lkdGgsIGhlaWdodCwgbmVhclBsYW5lLCBmYXJQbGFuZSwgY3MsIHRydWUsIGJSb3RhdGUpOyB9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAlDcmVhdGUgYSBwZXJzcGVjdGl2ZSBtYXRyaXggZm9yIGEgbGVmdCBoYW5kIGNvb3JkaW5hdGUKCQkJCXN5c3RlbQogQHBhcmFtW2luXQkJCXdpZHRoCQl3aWR0aCBvZiB2aWV3cGxhbmUKIEBwYXJhbVtpbl0JCQloZWlnaHQJCWhlaWdodCBvZiB2aWV3cGxhbmUKIEBwYXJhbVtpbl0JCQluZWFyUGxhbmUJbmVhciBjbGlwcGluZyBkaXN0YW5jZQogQHBhcmFtW2luXQkJCWZhclBsYW5lCWZhciBjbGlwcGluZyBkaXN0YW5jZQogQHBhcmFtW2luXQkJCWNzCQkJY3Mgd2hpY2ggY2xpcHNwYWNlIGNvbnZlbnRpb24gaXMgYmVpbmcgdXNlZAogQHBhcmFtW2luXQkJCWJSb3RhdGUgaXMgdGhlIHZpZXdwb3J0IGluIHBvcnRyYWl0IG9yIGxhbmRzY2FwZSBtb2RlCiBAcmV0dXJuIAkJUGVyc3BlY3RpdmUgbWF0cml4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQ0IFBlcnNwZWN0aXZlTEgoVkVSVFRZUEUgd2lkdGgsIFZFUlRUWVBFIGhlaWdodCwgVkVSVFRZUEUgbmVhclBsYW5lLCBWRVJUVFlQRSBmYXJQbGFuZSwgY29uc3QgZUNsaXBzcGFjZSBjcywgYm9vbCBiUm90YXRlID0gZmFsc2UpCgkJeyByZXR1cm4gUGVyc3BlY3RpdmUod2lkdGgsIGhlaWdodCwgbmVhclBsYW5lLCBmYXJQbGFuZSwgY3MsIGZhbHNlLCBiUm90YXRlKTsgfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJQ3JlYXRlIGEgcGVyc3BlY3RpdmUgbWF0cml4IGZvciBhIHJpZ2h0IGhhbmQgY29vcmRpbmF0ZQoJCQkJc3lzdGVtCiBAcGFyYW1baW5dCQkJd2lkdGgJCXdpZHRoIG9mIHZpZXdwbGFuZQogQHBhcmFtW2luXQkJCWhlaWdodAkJaGVpZ2h0IG9mIHZpZXdwbGFuZQogQHBhcmFtW2luXQkJCW5lYXJQbGFuZQluZWFyIGNsaXBwaW5nIGRpc3RhbmNlCiBAcGFyYW1baW5dCQkJY3MJCQljcyB3aGljaCBjbGlwc3BhY2UgY29udmVudGlvbiBpcyBiZWluZyB1c2VkCiBAcGFyYW1baW5dCQkJYlJvdGF0ZSBpcyB0aGUgdmlld3BvcnQgaW4gcG9ydHJhaXQgb3IgbGFuZHNjYXBlIG1vZGUKIEByZXR1cm4gCQlQZXJzcGVjdGl2ZSBtYXRyaXgKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglzdGF0aWMgUFZSVE1hdDQgUGVyc3BlY3RpdmVGbG9hdERlcHRoUkgoVkVSVFRZUEUgd2lkdGgsIFZFUlRUWVBFIGhlaWdodCwgVkVSVFRZUEUgbmVhclBsYW5lLCBjb25zdCBlQ2xpcHNwYWNlIGNzLCBib29sIGJSb3RhdGUgPSBmYWxzZSkKCQl7IHJldHVybiBQZXJzcGVjdGl2ZUZsb2F0RGVwdGgod2lkdGgsIGhlaWdodCwgbmVhclBsYW5lLCBjcywgdHJ1ZSwgYlJvdGF0ZSk7IH0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCUNyZWF0ZSBhIHBlcnNwZWN0aXZlIG1hdHJpeCBmb3IgYSBsZWZ0IGhhbmQgY29vcmRpbmF0ZQoJCQkJc3lzdGVtCiBAcGFyYW1baW5dCQkJd2lkdGgJCXdpZHRoIG9mIHZpZXdwbGFuZQogQHBhcmFtW2luXQkJCWhlaWdodAkJaGVpZ2h0IG9mIHZpZXdwbGFuZQogQHBhcmFtW2luXQkJCW5lYXJQbGFuZQluZWFyIGNsaXBwaW5nIGRpc3RhbmNlCiBAcGFyYW1baW5dCQkJY3MJCQljcyB3aGljaCBjbGlwc3BhY2UgY29udmVudGlvbiBpcyBiZWluZyB1c2VkCiBAcGFyYW1baW5dCQkJYlJvdGF0ZSBpcyB0aGUgdmlld3BvcnQgaW4gcG9ydHJhaXQgb3IgbGFuZHNjYXBlIG1vZGUKIEByZXR1cm4gCQlQZXJzcGVjdGl2ZSBtYXRyaXgKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglzdGF0aWMgUFZSVE1hdDQgUGVyc3BlY3RpdmVGbG9hdERlcHRoTEgoVkVSVFRZUEUgd2lkdGgsIFZFUlRUWVBFIGhlaWdodCwgVkVSVFRZUEUgbmVhclBsYW5lLCBjb25zdCBlQ2xpcHNwYWNlIGNzLCBib29sIGJSb3RhdGUgPSBmYWxzZSkKCQl7IHJldHVybiBQZXJzcGVjdGl2ZUZsb2F0RGVwdGgod2lkdGgsIGhlaWdodCwgbmVhclBsYW5lLCBjcywgZmFsc2UsIGJSb3RhdGUpOyB9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAlDcmVhdGUgYSBwZXJzcGVjdGl2ZSBtYXRyaXggZm9yIGEgcmlnaHQgaGFuZCBjb29yZGluYXRlCgkJCQlzeXN0ZW0KIEBwYXJhbVtpbl0JCQlmb3Z5CQlhbmdsZSBvZiB2aWV3ICh2ZXJ0aWNhbCkKIEBwYXJhbVtpbl0JCQlhc3BlY3QJCWFzcGVjdCByYXRpbyBvZiB2aWV3CiBAcGFyYW1baW5dCQkJbmVhclBsYW5lCW5lYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCQlmYXJQbGFuZQlmYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCQljcwkJCWNzIHdoaWNoIGNsaXBzcGFjZSBjb252ZW50aW9uIGlzIGJlaW5nIHVzZWQKIEBwYXJhbVtpbl0JCQliUm90YXRlIGlzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCVBlcnNwZWN0aXZlIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBQZXJzcGVjdGl2ZUZvdlJIKFZFUlRUWVBFIGZvdnksIFZFUlRUWVBFIGFzcGVjdCwgVkVSVFRZUEUgbmVhclBsYW5lLCBWRVJUVFlQRSBmYXJQbGFuZSwgY29uc3QgZUNsaXBzcGFjZSBjcywgYm9vbCBiUm90YXRlID0gZmFsc2UpCgkJeyByZXR1cm4gUGVyc3BlY3RpdmVGb3YoZm92eSwgYXNwZWN0LCBuZWFyUGxhbmUsIGZhclBsYW5lLCBjcywgdHJ1ZSwgYlJvdGF0ZSk7IH0KLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJQ3JlYXRlIGEgcGVyc3BlY3RpdmUgbWF0cml4IGZvciBhIGxlZnQgaGFuZCBjb29yZGluYXRlCgkJCQlzeXN0ZW0KIEBwYXJhbVtpbl0JCQlmb3Z5CQlhbmdsZSBvZiB2aWV3ICh2ZXJ0aWNhbCkKIEBwYXJhbVtpbl0JCQlhc3BlY3QJCWFzcGVjdCByYXRpbyBvZiB2aWV3CiBAcGFyYW1baW5dCQkJbmVhclBsYW5lCW5lYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCQlmYXJQbGFuZQlmYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCQljcwkJCWNzIHdoaWNoIGNsaXBzcGFjZSBjb252ZW50aW9uIGlzIGJlaW5nIHVzZWQKIEBwYXJhbVtpbl0JCQliUm90YXRlIGlzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCVBlcnNwZWN0aXZlIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBQZXJzcGVjdGl2ZUZvdkxIKFZFUlRUWVBFIGZvdnksIFZFUlRUWVBFIGFzcGVjdCwgVkVSVFRZUEUgbmVhclBsYW5lLCBWRVJUVFlQRSBmYXJQbGFuZSwgY29uc3QgZUNsaXBzcGFjZSBjcywgYm9vbCBiUm90YXRlID0gZmFsc2UpCgkJeyByZXR1cm4gUGVyc3BlY3RpdmVGb3YoZm92eSwgYXNwZWN0LCBuZWFyUGxhbmUsIGZhclBsYW5lLCBjcywgZmFsc2UsIGJSb3RhdGUpOyB9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAlDcmVhdGUgYSBwZXJzcGVjdGl2ZSBtYXRyaXggZm9yIGEgcmlnaHQgaGFuZCBjb29yZGluYXRlCgkJCQlzeXN0ZW0KIEBwYXJhbVtpbl0JCQlmb3Z5CQlhbmdsZSBvZiB2aWV3ICh2ZXJ0aWNhbCkKIEBwYXJhbVtpbl0JCQlhc3BlY3QJCWFzcGVjdCByYXRpbyBvZiB2aWV3CiBAcGFyYW1baW5dCQkJbmVhclBsYW5lCW5lYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCQljcwkJCWNzIHdoaWNoIGNsaXBzcGFjZSBjb252ZW50aW9uIGlzIGJlaW5nIHVzZWQKIEBwYXJhbVtpbl0JCQliUm90YXRlIGlzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCVBlcnNwZWN0aXZlIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBQZXJzcGVjdGl2ZUZvdkZsb2F0RGVwdGhSSChWRVJUVFlQRSBmb3Z5LCBWRVJUVFlQRSBhc3BlY3QsIFZFUlRUWVBFIG5lYXJQbGFuZSwgY29uc3QgZUNsaXBzcGFjZSBjcywgYm9vbCBiUm90YXRlID0gZmFsc2UpCgkJeyByZXR1cm4gUGVyc3BlY3RpdmVGb3ZGbG9hdERlcHRoKGZvdnksIGFzcGVjdCwgbmVhclBsYW5lLCBjcywgdHJ1ZSwgYlJvdGF0ZSk7IH0KLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJQ3JlYXRlIGEgcGVyc3BlY3RpdmUgbWF0cml4IGZvciBhIGxlZnQgaGFuZCBjb29yZGluYXRlCgkJCQlzeXN0ZW0KIEBwYXJhbVtpbl0JCQlmb3Z5CQlhbmdsZSBvZiB2aWV3ICh2ZXJ0aWNhbCkKIEBwYXJhbVtpbl0JCQlhc3BlY3QJCWFzcGVjdCByYXRpbyBvZiB2aWV3CiBAcGFyYW1baW5dCQkJbmVhclBsYW5lCW5lYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCQljcwkJCWNzIHdoaWNoIGNsaXBzcGFjZSBjb252ZW50aW9uIGlzIGJlaW5nIHVzZWQKIEBwYXJhbVtpbl0JCQliUm90YXRlIGlzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCVBlcnNwZWN0aXZlIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBQZXJzcGVjdGl2ZUZvdkZsb2F0RGVwdGhMSChWRVJUVFlQRSBmb3Z5LCBWRVJUVFlQRSBhc3BlY3QsIFZFUlRUWVBFIG5lYXJQbGFuZSwgY29uc3QgZUNsaXBzcGFjZSBjcywgYm9vbCBiUm90YXRlID0gZmFsc2UpCgkJeyByZXR1cm4gUGVyc3BlY3RpdmVGb3ZGbG9hdERlcHRoKGZvdnksIGFzcGVjdCwgbmVhclBsYW5lLCBjcywgZmFsc2UsIGJSb3RhdGUpOyB9CgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEBicmllZiAgICAgIAkJQ3JlYXRlIGEgbG9vay1hdCB2aWV3IG1hdHJpeAogQHBhcmFtW2luXQkJCXZFeWUgICAgICAgICAgICBQb3NpdGlvbiBvZiAnY2FtZXJhJwogQHBhcmFtW2luXQkJCXZBdCAgICAgICAgICAgICBUYXJnZXQgdGhhdCBjYW1lcmEgcG9pbnRzIGF0CiBAcGFyYW1baW5dCQkJdlVwICAgICAgICAgICAgIFVwIHZlY3RvciBmb3IgY2FtZXJhCiBAcGFyYW1baW5dCQkJYlJpZ2h0SGFuZGVkICAgIEhhbmRlZG5lc3Mgb2YgY29vcmRpbmF0ZSBzeXN0ZW0KIEByZXR1cm4gCQkJUmV0dXJucyB0aGUgdmlldyBtYXRyaXggZGVmaW5lZCBieSB0aGUgcGFzc2VkIHBhcmFtZXRlcnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCglzdGF0aWMgUFZSVE1hdDQgTG9va0F0KGNvbnN0IFBWUlRWZWMzJiB2RXllLCBjb25zdCBQVlJUVmVjMyYgdkF0LCBjb25zdCBQVlJUVmVjMyYgdlVwLCBib29sIGJSaWdodEhhbmRlZCkKCXsKCQlQVlJUVmVjMyB2Rm9yd2FyZCwgdlVwTm9ybSwgdlNpZGU7CgkJUFZSVE1hdDQgcmVzdWx0OwoKCQl2Rm9yd2FyZCA9IChiUmlnaHRIYW5kZWQpID8gdkV5ZSAtIHZBdCA6IHZBdCAtIHZFeWU7CgoJCXZGb3J3YXJkLm5vcm1hbGl6ZSgpOwoJCXZTaWRlICAgPSB2VXAuY3Jvc3MoIHZGb3J3YXJkKTsKCQl2U2lkZQk9IHZTaWRlLm5vcm1hbGl6ZWQoKTsKCQl2VXBOb3JtID0gdkZvcndhcmQuY3Jvc3ModlNpZGUpOwoJCXZVcE5vcm0gPSB2VXBOb3JtLm5vcm1hbGl6ZWQoKTsKCgkJcmVzdWx0LmZbMF09dlNpZGUueDsJcmVzdWx0LmZbNF09dlNpZGUueTsJcmVzdWx0LmZbOF09dlNpZGUuejsJCXJlc3VsdC5mWzEyXT0wOwoJCXJlc3VsdC5mWzFdPXZVcE5vcm0ueDsJcmVzdWx0LmZbNV09dlVwTm9ybS55OwlyZXN1bHQuZls5XT12VXBOb3JtLno7CQlyZXN1bHQuZlsxM109MDsKCQlyZXN1bHQuZlsyXT12Rm9yd2FyZC54OyByZXN1bHQuZls2XT12Rm9yd2FyZC55OwlyZXN1bHQuZlsxMF09dkZvcndhcmQuejsJcmVzdWx0LmZbMTRdPTA7CgkJcmVzdWx0LmZbM109MDsJCQlyZXN1bHQuZls3XT0wOwkJCXJlc3VsdC5mWzExXT0wOwkJCQlyZXN1bHQuZlsxNV09ZjJ2dCgxKTsKCgoJCXJlc3VsdC5wb3N0VHJhbnNsYXRlKC12RXllKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJQ3JlYXRlIGEgcGVyc3BlY3RpdmUgbWF0cml4CiBAcGFyYW1baW5dCQl3aWR0aAkJV2lkdGggb2Ygdmlld3BsYW5lCiBAcGFyYW1baW5dCQloZWlnaHQJCUhlaWdodCBvZiB2aWV3cGxhbmUKIEBwYXJhbVtpbl0JCW5lYXJQbGFuZQlOZWFyIGNsaXBwaW5nIGRpc3RhbmNlCiBAcGFyYW1baW5dCQlmYXJQbGFuZQlGYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCWNzCQkJV2hpY2ggY2xpcHNwYWNlIGNvbnZlbnRpb24gaXMgYmVpbmcgdXNlZAogQHBhcmFtW2luXQkJYlJpZ2h0SGFuZGVkCUhhbmRlZG5lc3Mgb2YgY29vcmRpbmF0ZSBzeXN0ZW0KIEBwYXJhbVtpbl0JCWJSb3RhdGUJCUlzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCVBlcnNwZWN0aXZlIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBQZXJzcGVjdGl2ZSgKCQlWRVJUVFlQRSB3aWR0aCwgVkVSVFRZUEUgaGVpZ2h0LAoJCVZFUlRUWVBFIG5lYXJQbGFuZSwgVkVSVFRZUEUgZmFyUGxhbmUsCgkJY29uc3QgZUNsaXBzcGFjZSBjcywKCQlib29sIGJSaWdodEhhbmRlZCwKCQlib29sIGJSb3RhdGUgPSBmYWxzZSkKCXsKCQlWRVJUVFlQRSBuMiA9IFZFUlRUWVBFTVVMKGYydnQoMiksbmVhclBsYW5lKTsKCQlWRVJUVFlQRSByY3BubWYgPSBWRVJUVFlQRURJVihmMnZ0KDEpLChuZWFyUGxhbmUgLSBmYXJQbGFuZSkpOwoKCQlQVlJUTWF0NCByZXN1bHQ7CgkJaWYgKGJSb3RhdGUpCgkJewoJCQlyZXN1bHQuZlswXSA9IDA7CXJlc3VsdC5mWzRdPVZFUlRUWVBFRElWKC1uMix3aWR0aCk7CXJlc3VsdC5mWzhdPTA7CXJlc3VsdC5mWzEyXT0wOwoJCQlyZXN1bHQuZlsxXSA9IFZFUlRUWVBFRElWKG4yLGhlaWdodCk7CXJlc3VsdC5mWzVdPTA7CXJlc3VsdC5mWzldPTA7CXJlc3VsdC5mWzEzXT0wOwoJCX0KCQllbHNlCgkJewoJCQlyZXN1bHQuZlswXSA9IFZFUlRUWVBFRElWKG4yLHdpZHRoKTsJcmVzdWx0LmZbNF09MDsJcmVzdWx0LmZbOF09MDsJcmVzdWx0LmZbMTJdPTA7CgkJCXJlc3VsdC5mWzFdID0gMDsJcmVzdWx0LmZbNV09VkVSVFRZUEVESVYobjIsaGVpZ2h0KTsJcmVzdWx0LmZbOV09MDsJcmVzdWx0LmZbMTNdPTA7CgkJfQoJCWlmIChjcyA9PSBEM0QpCgkJewoJCQlyZXN1bHQuZlsyXSA9IDA7CXJlc3VsdC5mWzZdPTA7CXJlc3VsdC5mWzEwXT1WRVJUVFlQRU1VTChmYXJQbGFuZSxyY3BubWYpOwlyZXN1bHQuZlsxNF09VkVSVFRZUEVNVUwoVkVSVFRZUEVNVUwoZmFyUGxhbmUscmNwbm1mKSxuZWFyUGxhbmUpOwoJCX0KCQllbHNlCgkJewoJCQlyZXN1bHQuZlsyXSA9IDA7CXJlc3VsdC5mWzZdPTA7CXJlc3VsdC5mWzEwXT1WRVJUVFlQRU1VTChmYXJQbGFuZStuZWFyUGxhbmUscmNwbm1mKTsJcmVzdWx0LmZbMTRdPVZFUlRUWVBFTVVMKFZFUlRUWVBFTVVMKGZhclBsYW5lLHJjcG5tZiksbjIpOwoJCX0KCQlyZXN1bHQuZlszXSA9IDA7CXJlc3VsdC5mWzddPTA7CXJlc3VsdC5mWzExXT1mMnZ0KC0xKTsJcmVzdWx0LmZbMTVdPTA7CgoJCWlmICghYlJpZ2h0SGFuZGVkKQoJCXsKCQkJcmVzdWx0LmZbMTBdID0gVkVSVFRZUEVNVUwocmVzdWx0LmZbMTBdLCBmMnZ0KC0xKSk7CgkJCXJlc3VsdC5mWzExXSA9IGYydnQoMSk7CgkJfQoKCQlyZXR1cm4gcmVzdWx0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJUGVyc3BlY3RpdmUgY2FsY3VsYXRpb24gd2hlcmUgZmFyIHBsYW5lIGlzIGFzc3VtZWQgdG8gYmUgYXQgYW4gaW5maW5pdGUgZGlzdGFuY2UgYW5kIHRoZSBzY3JlZW4KCQkJCXNwYWNlIFogaXMgaW52ZXJ0ZWQKIEBwYXJhbVtpbl0JCXdpZHRoCQlXaWR0aCBvZiB2aWV3cGxhbmUKIEBwYXJhbVtpbl0JCWhlaWdodAkJSGVpZ2h0IG9mIHZpZXdwbGFuZQogQHBhcmFtW2luXQkJbmVhclBsYW5lCU5lYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCWNzCQkJV2hpY2ggY2xpcHNwYWNlIGNvbnZlbnRpb24gaXMgYmVpbmcgdXNlZAogQHBhcmFtW2luXQkJYlJpZ2h0SGFuZGVkCUhhbmRlZG5lc3Mgb2YgY29vcmRpbmF0ZSBzeXN0ZW0KIEBwYXJhbVtpbl0JCWJSb3RhdGUJCUlzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCVBlcnNwZWN0aXZlIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBQZXJzcGVjdGl2ZUZsb2F0RGVwdGgoCgkJVkVSVFRZUEUgd2lkdGgsIFZFUlRUWVBFIGhlaWdodCwKCQlWRVJUVFlQRSBuZWFyUGxhbmUsCgkJY29uc3QgZUNsaXBzcGFjZSBjcywKCQlib29sIGJSaWdodEhhbmRlZCwKCQlib29sIGJSb3RhdGUgPSBmYWxzZSkKCXsKCQlWRVJUVFlQRSBuMiA9IFZFUlRUWVBFTVVMKDIsbmVhclBsYW5lKTsKCgkJUFZSVE1hdDQgcmVzdWx0OwoJCWlmIChiUm90YXRlKQoJCXsKCQkJcmVzdWx0LmZbMF0gPSAwOwlyZXN1bHQuZls0XT1WRVJUVFlQRURJVigtbjIsd2lkdGgpOwlyZXN1bHQuZls4XT0wOwlyZXN1bHQuZlsxMl09MDsKCQkJcmVzdWx0LmZbMV0gPSBWRVJUVFlQRURJVihuMixoZWlnaHQpOwlyZXN1bHQuZls1XT0wOwlyZXN1bHQuZls5XT0wOwlyZXN1bHQuZlsxM109MDsKCQl9CgkJZWxzZQoJCXsKCQkJcmVzdWx0LmZbMF0gPSBWRVJUVFlQRURJVihuMix3aWR0aCk7CXJlc3VsdC5mWzRdPTA7CXJlc3VsdC5mWzhdPTA7CXJlc3VsdC5mWzEyXT0wOwoJCQlyZXN1bHQuZlsxXSA9IDA7CXJlc3VsdC5mWzVdPVZFUlRUWVBFRElWKG4yLGhlaWdodCk7CXJlc3VsdC5mWzldPTA7CXJlc3VsdC5mWzEzXT0wOwoJCX0KCQlpZiAoY3MgPT0gRDNEKQoJCXsKCQkJcmVzdWx0LmZbMl0gPSAwOwlyZXN1bHQuZls2XT0wOwlyZXN1bHQuZlsxMF09MDsJcmVzdWx0LmZbMTRdPW5lYXJQbGFuZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmVzdWx0LmZbMl0gPSAwOwlyZXN1bHQuZls2XT0wOwlyZXN1bHQuZlsxMF09KGJSaWdodEhhbmRlZD8oVkVSVFRZUEUpMTooVkVSVFRZUEUpLTEpOwlyZXN1bHQuZlsxNF09bjI7CgkJfQoJCXJlc3VsdC5mWzNdID0gKFZFUlRUWVBFKTA7CXJlc3VsdC5mWzddPShWRVJUVFlQRSkwOwlyZXN1bHQuZlsxMV09IChiUmlnaHRIYW5kZWQ/KFZFUlRUWVBFKS0xOihWRVJUVFlQRSkxKTsJcmVzdWx0LmZbMTVdPShWRVJUVFlQRSkwOwoKCQlyZXR1cm4gcmVzdWx0OwoJfQoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAYnJpZWYgICAgICAJUGVyc3BlY3RpdmUgY2FsY3VsYXRpb24gd2hlcmUgZmllbGQgb2YgdmlldyBpcyB1c2VkIGluc3RlYWQgb2YgbmVhciBwbGFuZSBkaW1lbnNpb25zCiBAcGFyYW1baW5dCQlmb3Z5CQlBbmdsZSBvZiB2aWV3ICh2ZXJ0aWNhbCkKIEBwYXJhbVtpbl0JCWFzcGVjdAkJQXNwZWN0IHJhdGlvIG9mIHZpZXcKIEBwYXJhbVtpbl0JCW5lYXJQbGFuZQlOZWFyIGNsaXBwaW5nIGRpc3RhbmNlCiBAcGFyYW1baW5dCQlmYXJQbGFuZQlGYXIgY2xpcHBpbmcgZGlzdGFuY2UKIEBwYXJhbVtpbl0JCWNzCQkJV2hpY2ggY2xpcHNwYWNlIGNvbnZlbnRpb24gaXMgYmVpbmcgdXNlZAogQHBhcmFtW2luXQkJYlJpZ2h0SGFuZGVkCUhhbmRlZG5lc3Mgb2YgY29vcmRpbmF0ZSBzeXN0ZW0KIEBwYXJhbVtpbl0JCWJSb3RhdGUJCUlzIHRoZSB2aWV3cG9ydCBpbiBwb3J0cmFpdCBvciBsYW5kc2NhcGUgbW9kZQogQHJldHVybiAJCVBlcnNwZWN0aXZlIG1hdHJpeAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCXN0YXRpYyBQVlJUTWF0NCBQZXJzcGVjdGl2ZUZvdigKCQlWRVJUVFlQRSBmb3Z5LCBWRVJUVFlQRSBhc3BlY3QsCgkJVkVSVFRZUEUgbmVhclBsYW5lLCBWRVJUVFlQRSBmYXJQbGFuZSwKCQljb25zdCBlQ2xpcHNwYWNlIGNzLAoJCWJvb2wgYlJpZ2h0SGFuZGVkLAoJCWJvb2wgYlJvdGF0ZSA9IGZhbHNlKQoJewoJCVZFUlRUWVBFIGhlaWdodCA9IFZFUlRUWVBFTVVMKFZFUlRUWVBFTVVMKGYydnQoMi4wZiksbmVhclBsYW5lKSxQVlJUVEFOKFZFUlRUWVBFTVVMKGZvdnksZjJ2dCgwLjVmKSkpKTsKCQlpZiAoYlJvdGF0ZSkgcmV0dXJuIFBlcnNwZWN0aXZlKGhlaWdodCwgVkVSVFRZUEVESVYoaGVpZ2h0LGFzcGVjdCksIG5lYXJQbGFuZSwgZmFyUGxhbmUsIGNzLCBiUmlnaHRIYW5kZWQsIGJSb3RhdGUpOwoJCXJldHVybiBQZXJzcGVjdGl2ZShWRVJUVFlQRU1VTChoZWlnaHQsYXNwZWN0KSwgaGVpZ2h0LCBuZWFyUGxhbmUsIGZhclBsYW5lLCBjcywgYlJpZ2h0SGFuZGVkLCBiUm90YXRlKTsKCX0KCi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQGJyaWVmICAgICAgCVBlcnNwZWN0aXZlIGNhbGN1bGF0aW9uIHdoZXJlIGZpZWxkIG9mIHZpZXcgaXMgdXNlZCBpbnN0ZWFkIG9mIG5lYXIgcGxhbmUgZGltZW5zaW9ucwoJCQkJYW5kIGZhciBwbGFuZSBpcyBhc3N1bWVkIHRvIGJlIGF0IGFuIGluZmluaXRlIGRpc3RhbmNlIHdpdGggaW52ZXJ0ZWQgWiByYW5nZQogQHBhcmFtW2luXQkJZm92eQkJQW5nbGUgb2YgdmlldyAodmVydGljYWwpCiBAcGFyYW1baW5dCQlhc3BlY3QJCUFzcGVjdCByYXRpbyBvZiB2aWV3CiBAcGFyYW1baW5dCQluZWFyUGxhbmUJTmVhciBjbGlwcGluZyBkaXN0YW5jZQogQHBhcmFtW2luXQkJY3MJCQlXaGljaCBjbGlwc3BhY2UgY29udmVudGlvbiBpcyBiZWluZyB1c2VkCiBAcGFyYW1baW5dCQliUmlnaHRIYW5kZWQJSGFuZGVkbmVzcyBvZiBjb29yZGluYXRlIHN5c3RlbQogQHBhcmFtW2luXQkJYlJvdGF0ZQkJSXMgdGhlIHZpZXdwb3J0IGluIHBvcnRyYWl0IG9yIGxhbmRzY2FwZSBtb2RlCiBAcmV0dXJuIAkJUGVyc3BlY3RpdmUgbWF0cml4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJc3RhdGljIFBWUlRNYXQ0IFBlcnNwZWN0aXZlRm92RmxvYXREZXB0aCgKCQlWRVJUVFlQRSBmb3Z5LCBWRVJUVFlQRSBhc3BlY3QsCgkJVkVSVFRZUEUgbmVhclBsYW5lLAoJCWNvbnN0IGVDbGlwc3BhY2UgY3MsCgkJYm9vbCBiUmlnaHRIYW5kZWQsCgkJYm9vbCBiUm90YXRlID0gZmFsc2UpCgl7CgkJVkVSVFRZUEUgaGVpZ2h0ID0gVkVSVFRZUEVNVUwoVkVSVFRZUEVNVUwoMixuZWFyUGxhbmUpLCBQVlJUVEFOKFZFUlRUWVBFTVVMKGZvdnksMC41KSkpOwoJCWlmIChiUm90YXRlKSByZXR1cm4gUGVyc3BlY3RpdmVGbG9hdERlcHRoKGhlaWdodCwgVkVSVFRZUEVESVYoaGVpZ2h0LGFzcGVjdCksIG5lYXJQbGFuZSwgY3MsIGJSaWdodEhhbmRlZCwgYlJvdGF0ZSk7CgkJcmV0dXJuIFBlcnNwZWN0aXZlRmxvYXREZXB0aChWRVJUVFlQRU1VTChoZWlnaHQsYXNwZWN0KSwgaGVpZ2h0LCBuZWFyUGxhbmUsIGNzLCBiUmlnaHRIYW5kZWQsIGJSb3RhdGUpOwoJfQp9OwoKI2VuZGlmIC8qX19QVlJUVkVDVE9SX0hfXyovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRW5kIG9mIGZpbGUgKFBWUlRWZWN0b3IuaCkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgo=