CVRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIFdpbmUgZGVidWdnZXIuICBUaGUgcmV2ZXJzZSBhc3NlbWJlcgp3YXMgc3RvbGVuIGZyb20gTWFjaCBtb3JlIG9yIGxlc3MgaW50YWN0LiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlCnR3byB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IGRpZmZlcmVudGx5IGlmIHlvdSBhcmUgcmV2ZXJzZSBhc3NlbWJsaW5nCjE2IGJpdCBjb2RlLCBhbmQgb24gdGhlIHdob2xlIGl0IHNlZW1zIHRvIHdvcmsuCgpORVdTOgoKCVRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBoYXMgKnRvbnMqIG1vcmUgY2FwYWJpbGl0eSB0aGFuIGl0IGRpZCBiZWZvcmUuCkkgaGF2ZSBlbmNsb3NlZCBzb21lIGV4YW1wbGVzIHRoYXQgc2hvdyB1c2FnZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KTmV3IGZlYXR1cmVzIGluY2x1ZGU6CgoJMSkgQWJpbGl0eSBvZiBkZWJ1Z2dlciB0byByZWFkIGRlYnVnIGluZm9ybWF0aW9uIGZyb20gd2luZSBleGVjdXRhYmxlCiphbmQqIGZyb20gV2luMzIgZXhlY3V0YWJsZXMuICBMb2NhbCB2YXJpYWJsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaXMKYWxzbyByZWFkIGFuZCBwcm9jZXNzZWQuCgoJMikgVGhlIGludGVybmFsIGRlYnVnZ2VyIGlzIGNhcGFibGUgb2YgJ3N0ZXBwaW5nJyB0byB0aGUgbmV4dApsaW5lIG51bWJlciwganVzdCBsaWtlIGdkYi4gIEV4YW1wbGVzIG9mIHRoZSBjb21tYW5kcyBhcmU6CgoJc3RlcAoJc3RlcGkKCXNpCglzdGVwIDMKCXNpIDUKCW5leHQKCW5leHRpCgljb250IDQKCWZpbmlzaAoKQWxsIG9mIHRoZXNlIHNob3VsZCBiZSBleGFjdGx5IGxpa2UgaG93IGdkYiBkb2VzIHRoaW5ncy4KCgkzKSBUaGUgaW50ZXJuYWwgZGVidWdnZXIgbm93IGhhcyBhIHNlbnNlIG9mIHdoYXQgc291cmNlIGZpbGUgYW5kIGxpbmUKbnVtYmVyIGEgZ2l2ZW4gUEMgaXMgYXQuICBOZXcgY29tbWFuZHMgdG8gc3VwcG9ydCB0aGlzIGFyZSBqdXN0IGxpa2UgZ2RiLAphbmQgaW5jbHVkZToKCglsaXN0CglkaXIKCXNob3cgZGlyCgp0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIGZvcm1hdHMgb2YgYXJndW1lbnRzIGZvciB0aGUgbGlzdCBjb21tYW5kLiAgQWxsCnBlcm11dGF0aW9ucyBzdXBwb3J0ZWQgYnkgZ2RiIHNob3VsZCBhbHNvIGJlIHN1cHBvcnRlZC4KCgk0KSBUaGUgaW50ZXJuYWwgZGVidWdnZXIga25vd3MgYWJvdXQgZGF0YXR5cGVzIG9mIHZhcmlvdXMgb2JqZWN0cywKZm9yIGJvdGggV2luMzIgKmFuZCogdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgd2luZSBleGVjdXRhYmxlIGl0c2VsZi4KSSBoYXZlIGVuY2xvc2VkIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgd29ya3MgYXQgdGhlIGVuZC4KCgk1KSBUaGVyZSBhcmUgbW9yZSB3YXlzIHRoZSAnYicgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBzZXQgYnJlYWtwb2ludHMuCkV4YW1wbGVzIGFyZToKCgliICoweDgxOTAwMDAKCWIgMTEwMAoJYiBVc2FnZQoJYgoKSSBkb24ndCB0aGluayB0aGlzIGNvdmVycyBhbGwgb2YgdGhlIHBlcm11dGF0aW9ucyB0aGF0IGdkYiBhY2NlcHRzICh0aGlzIHNob3VsZApiZSBjbGVhbmVkIHVwIHNvbWVkYXkgc28gdGhhdCBhbGwgcG9zc2liaWxpdGllcyBhcmUgYWNjZXB0YWJsZSkuCgoJNikgIFRoZSAncHJpbnQnIGFuZCAneCcgY29tbWFuZHMgc2hvdWxkIGJlaGF2ZSBtb3JlIG9yIGxlc3MgZXhhY3RseQphcyB0aGV5IGRvIHVuZGVyIGdkYi4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIHdheSB0aGUgZGF0YSBpcyBwcmVzZW50ZWQKd2lsbCBiZSBzbGlnaHRseSBkaWZmZXJlbnQsIGJ1dCB0aGUgY29udGVudCBzaG91bGQgYmUgZnVuZGFtZW50YWxseSB0aGUgc2FtZS4KCgk3KSBUaGUgaW50ZXJuYWwgZGVidWdnZXIgbm93IHN1cHBvcnRzIGNvbmRpdGlvbmFsIGJyZWFrcG9pbnRzLCBhbmQKYXV0b21hdGljIGRpc3BsYXkgZXhwcmVzc2lvbnMuICBBbiBleGFtcGxlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLiAgVGhlCnN5bnRheCBhbmQgdXNhZ2Ugc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGF0IG9mIGdkYi4KCgk4KSBUeXBlIGNhc3RzIGNhbiBiZSBtYWRlIGZyb20gd2l0aGluIHRoZSBkZWJ1Z2dlciwgYnV0IHRoZXkgY3VycmVudGx5CmRvbid0IHdvcmsgd2l0aCB0eXBlZGVmJ2VkIHR5cGVzLiAgVGhleSBvbmx5IHdvcmsgd2l0aCBidWlsdGluIHR5cGVzIGFuZApuYW1lZCBzdHJ1Y3R1cmVzIHVuaW9ucywgZXRjLiAgVGhlIHByb2JsZW0gaXMgdGhhdCBpbnRlcm5hbGx5IHdlIGRvbid0IGFsd2F5cwpyZWNvcmQgdGhlIHR5cGVkZWZlZCBuYW1lcyBvZiBzdHJ1Y3R1cmVzLCBzbyB3ZSBoYXZlIG5vIGd1YXJhbnRlZSB0aGF0IHdlCndvdWxkIGtub3cgd2hhdCBlYWNoIHR5cGUgaXMuICBUaGlzIGNhbiBiZSBmaXhlZCwgb2YgY291cnNlIC0gIGl0IGp1c3QgdGFrZXMKbW9yZSBtZW1vcnkuICBOb3RlIHRoYXQgaW4gc29tZSBjYXNlcywgdHlwZWRlZmVkIHN0cnVjdHVyZXMgY291bGQgYmUgY2FzdAp1c2luZyAnKHN0cnVjdCB0eXBlZGZuYW1lKScgaW5zdGVhZCBvZiAnKHR5cGVkZm5hbWUpJy4gICBUZWNobmljYWxseSB0aGlzCmlzbid0IHF1aXRlIGNvcnJlY3QsIGJ1dCBpZiBhbmQgd2hlbiB0aGUgcmVzdCBvZiB0aGlzIHN0dWZmIGdldHMgZml4ZWQsCnRoaXMgd291bGQgbmVlZCB0byBnZXQgY29ycmVjdGVkIHRvby4KCk5PVEVTOgoKCUlmIGl0IHdlcmVuJ3QgZm9yIHRoZSBmYWN0IHRoYXQgZ2RiIGRvZXNuJ3QgZ3JvayB0aGUgV2luMzIgZGVidWcKaW5mb3JtYXRpb24sIHlvdSBjb3VsZCBqdXN0IHVzZSBnZGIuICBUaGUgaW50ZXJuYWwgZGVidWdnZXIgc2hvdWxkIGJlIGFibGUKdG8gcmVhZCBhbmQgdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYm90aCBXaW4zMiBhbmQgYWxzbyBmb3IgdGhlCldpbmUgZXhlY3V0YWJsZSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGRlYnVnIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvCnRvZ2V0aGVyIGFzIGlmIGl0IHdlcmUgb25lIGxhcmdlICh2ZXJ5IGxhcmdlKSBlbnRpdHkuCgpMSU1JVEFUSU9OUyBBTkQgRElGRkVSRU5DRVMgRlJPTSBHREI6CgoJWW91IGNhbm5vdCBzZXQgYSBicmVha3BvaW50IGJ5IGZpbGUgYW5kIGxpbmUgbnVtYmVyIGFzIHlvdSBjYW4Kd2l0aCBnZGIuICBBZGRpbmcgc3VwcG9ydCBmb3IgdGhpcyB3b3VsZG4ndCBiZSBhbGwgdGhhdCB0b3VnaCwgSSBndWVzcywgYnV0Cml0IHdvdWxkIGJlIGEgbnVpc2FuY2UuICAgWW91IGNhbiBzZXQgYSBicmVha3BvaW50IGdpdmVuIGEgZnVuY3Rpb24gYW5kCmxpbmUgbnVtYmVyLCBob3dldmVyLiAgQW4gZXhhbXBsZSB3b3VsZCBiZSAnYiBtYWluOjI5OTMnLiAgSXQgdHVybnMgb3V0CnRoYXQgdGhlIHdheSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhcnJhbmdlZCBpdCBpcyBhIHdob2xlIGxvdAplYXNpZXIgdG8gZG8gdGhpbmdzIGluIHRoaXMgd2F5IHRoYW4gaXQgd291bGQgYmUgdG8gdHJ5IGFuZCBnZXQgdGhlCnNvdXJjZTpsaW5lIHR5cGUgb2YgYnJlYWtwb2ludCB3b3JraW5nLCBidXQgaXQgd291bGQgcHJvYmFibHkgYmUgd29ydGggaXQKdG8gdHJ5LgoKCUdldHRpbmcgc3RhY2sgdHJhY2VzIHRocm91Z2ggV2luZSBpdHNlbGYgY2FuIGJlIGEgYml0IHRyaWNreS4KVGhpcyBpcyBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIHRoaW5nIGlzIGJ1aWx0IHdpdGggb3B0aW1pemF0aW9uCmVuYWJsZWQsIGFuZCBhcyBhIHJlc3VsdCBzb21ldGltZXMgZnVuY3Rpb25zIGRvbid0IGdldCBmcmFtZXMsIGFuZApsb3RzIG9mIHZhcmlhYmxlcyBhcmUgb3B0aW1pemVkIGludG8gcmVnaXN0ZXJzLiAgWW91IGNhbiB0dXJuIG9mZgpvcHRpbWl6YXRpb24gZm9yIGEgZmV3IGtleSBzb3VyY2UgZmlsZXMgaWYgaXQgd2lsbCBoZWxwIHlvdS4KCglNZW1vcnkgY29uc3VtcHRpb24gaXMgZ2V0dGluZyB0byBiZSBhIHJlYWwgcHJvYmxlbS4gIEkgdGhpbmsgMzJNYiBpcwpubyBsb25nZXIgc3VmZmljaWVudCB0byBkZWJ1ZyB3aW5lIC0gNDggb3IgNjQgaXMgcHJvYmFibHkgYSB3aG9sZSBsb3QgYmV0dGVyLgpVbmZvcnR1bmF0ZWx5IEkgY2Fubm90IHNodXQgZG93biBYIHRvIHNhdmUgbWVtb3J5IDotKS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRVhBTVBMRVM6CgoJSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyBJIHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBXaW5lLiAgVGhlIHByb2dyYW0KaXMgc29tZXRoaW5nIHRoYXQganVzdCBtYXBzIGFuZCBkdW1wcyB0aGUgY29udGVudHMgb2YgYSBXaW4zMiBleGVjdXRhYmxlLgpJdCB3YXMgZHlpbmcgZm9yIHNvbWUgcmVhc29uLgoKU3RhcnQgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaC4KCmJhc2gkIGxzIC1sIGR1bXBleGUuZXhlIAotcnctcnctci0tICAgMSBlcmljICAgICBkZXZlbCAgICAgIDE2ODQ0OCBKYW4gIDQgMTM6NTEgZHVtcGV4ZS5leGUKYmFzaCQgLi93aW5lIC1kZWJ1ZyAnLi9kdW1wZXhlLmV4ZSAtc3ltYm9sIC4vZHVtcGV4ZS5leGUnCldhcm5pbmc6IGludmFsaWQgZGlyICdlOlx0ZXN0JyBpbiBwYXRoLCBkZWxldGluZyBpdC4KV2luMzIgdGFzayAnVzMyU1hYWFgnOiBCcmVha3BvaW50IDEgYXQgMHgwODFhMzQ1MApMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAuL3dpbmUuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliWHBtLnNvLjQuNi4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJTTS5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliSUNFLnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYZXh0LnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYMTEuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGlibS5zby41LjAuNS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvbGliL2xpYmMuc28uNS4yLjE4Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGQtbGludXguc28uMS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBXaW4zMiBmaWxlIC4vZHVtcGV4ZS5leGUuLi4KU3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwODFhMzQ1MCAoX21haW5DUlRTdGFydHVwKQpJbiAzMiBiaXQgbW9kZS4KKioqIEludmFsaWQgYWRkcmVzcyAweDQxNGM1ZmY4ICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzkzMGVlNmMpCjB4MDgxYTM0NTAgKF9tYWluQ1JUU3RhcnR1cCk6ICBtb3ZsCSVmczowLCVlYXgKV2luZS1kYmc+YiBEdW1wRmlsZQpCcmVha3BvaW50IDIgYXQgMHgwODFhMDA3OCAoRHVtcEZpbGUrMHg5IFtkdW1wZXhlLmM6MjcyM10pCldpbmUtZGJnPmMKRHVtcCBGaWxlOiAuL2R1bXBleGUuZXhlClN0b3BwZWQgb24gYnJlYWtwb2ludCAyIGF0IDB4MDgxYTAwNzggKER1bXBGaWxlKzB4OSBbZHVtcGV4ZS5jOjI3MjNdKQpFbnRlciBwYXRoIHRvIGZpbGUgZHVtcGV4ZS5jOiAuLi9kZQoyNzIzCQlIQU5ETEUJCQkgIGhGaWxlID0gTlVMTDsKMHgwODFhMDA3OCAoRHVtcEZpbGUrMHg5IFtkdW1wZXhlLmM6MjcyM10pOiAgbW92bAkkMHgwLDB4ZmZmZmZmZjQoJWVicCkKV2luZS1kYmc+bGlzdAoyNzIzCQlIQU5ETEUJCQkgIGhGaWxlID0gTlVMTDsKMjcyNAkJSEFORExFCQkJICBoTWFwICA9IE5VTEw7CjI3MjUJCVBTVFIJCQkgIGxwTWFwID0gTlVMTDsKMjcyNgkJRFdPUkQJCQkgIGR3RmlsZVNpemUgICAgID0gMDsKMjcyNwkJRFdPUkQJCQkgIGR3RmlsZVNpemVIaWdoID0gMDsKMjcyOAkKMjcyOQkJUElNQUdFX0RPU19IRUFERVIJICBscEltYWdlRE9TICA9IE5VTEw7CjI3MzAJCVBJTUFHRV9GSUxFX0hFQURFUgkgIGxwSW1hZ2VGaWxlID0gTlVMTDsKMjczMQkJUElNQUdFX05UX0hFQURFUlMJICBscEltYWdlTlQgICA9IE5VTEw7CjI3MzIJCjI3MzMJCS8qCldpbmUtZGJnPm4gMTAKMjc0NwkJZHdGaWxlU2l6ZSA9IEdldEZpbGVTaXplKGhGaWxlLCAmZHdGaWxlU2l6ZUhpZ2gpOwoweDA4MWEwMGVhIChEdW1wRmlsZSsweDdiIFtkdW1wZXhlLmM6Mjc0N10pOiAgbGVhbAkweGZmZmZmZmYwKCVlYnApLCVlYXgKV2luZS1kYmc+bgoyNzQ5CQkgICAgJiYgKEdldExhc3RFcnJvcigpICE9IE5PX0VSUk9SKSApDQoweDA4MWEwMGZiIChEdW1wRmlsZSsweDhjIFtkdW1wZXhlLmM6Mjc0OV0pOiAgY21wbAkkLTEsMHhmZmZmZmZlOCglZWJwKQpXaW5lLWRiZz54L2QgZHdGaWxlU2l6ZQp4L2QgZHdGaWxlU2l6ZQ0KIDE2ODQ0OApXaW5lLWRiZz5uCjI3NTgJCQkJCSBQQUdFX1JFQURPTkxZLCAwLCAwLCAoTFBTVFIpIE5VTEwpOwoweDA4MWEwMTI0IChEdW1wRmlsZSsweGI1IFtkdW1wZXhlLmM6Mjc1OF0pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz5saXN0IDI3NTAKbGlzdCAyNzUwDQoyNzUwCQl7CjI3NTEJCQlGYXRhbCgiQ2Fubm90IGdldCBzaXplIG9mIGZpbGUgJXMiLCBscEZpbGVOYW1lKTsKMjc1MgkJfQoyNzUzCQkKMjc1NAkJLyoKMjc1NQkJICogbWFwIHRoZSBmaWxlCjI3NTYJCSAqLwoyNzU3CQloTWFwID0gQ3JlYXRlRmlsZU1hcHBpbmcoaEZpbGUsIChMUFNFQ1VSSVRZX0FUVFJJQlVURVMpIE5VTEwsCjI3NTgJCQkJCSBQQUdFX1JFQURPTkxZLCAwLCAwLCAoTFBTVFIpIE5VTEwpOwoyNzU5CQlpZiggaE1hcCA9PSBOVUxMICkKMjc2MAkJewpXaW5lLWRiZz5uCjI3NTkJCWlmKCBoTWFwID09IE5VTEwgKQoweDA4MWEwMTNiIChEdW1wRmlsZSsweGNjIFtkdW1wZXhlLmM6Mjc1OV0pOiAgY21wbAkkMCwweGZmZmZmZmZjKCVlYnApCldpbmUtZGJnPnggaE1hcAogMDhlNDhjMzAKV2luZS1kYmc+bgoyNzY3CQlscE1hcCA9IChMUFNUUikgTWFwVmlld09mRmlsZShoTWFwLCBGSUxFX01BUF9SRUFELCAwLCAwLCAwKTsKMHgwODFhMDE1NiAoRHVtcEZpbGUrMHhlNyBbZHVtcGV4ZS5jOjI3NjddKTogIHB1c2hsCSQweDAKV2luZS1kYmc+bgoyNzY4CQlpZiggbHBNYXAgPT0gTlVMTCApCjB4MDgxYTAxNmIgKER1bXBGaWxlKzB4ZmMgW2R1bXBleGUuYzoyNzY4XSk6ICBjbXBsCSQwLDB4ZmZmZmZmZTAoJWVicCkKV2luZS1kYmc+cHJpbnQgbHBNYXAKMHg0MTRjNWY0MApXaW5lLWRiZz54IGxwTWFwCiA0MDAwNzAwMApXaW5lLWRiZz4geC8xMHggMHg0MDAwNzAwMAogeC8xMHggMHg0MDAwNzAwMA0KMHg0MDAwNzAwMCAof0tFUk5FTDMyX05VTExfVEhVTktfREFUQSsweDM3ZTRmZTc0KTogKioqIEludmFsaWQgYWRkcmVzcyAweDQwMDA3MDAwICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzdlNGZlNzQpCldpbmUtZGJnPnF1aXQKJAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpUaGUgZmlyc3QgdGltZSB0aHJvdWdoLCB3ZSBmaW5kIHRoYXQgTWFwVmlld09mRmlsZSBpc24ndCBtYXBwaW5nIHRoZSBmaWxlCmNvcnJlY3RseSBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuICBUcnkgcnVubmluZyBhZ2FpbiwgYW5kIHN0ZXAgaW50bwpNYXBWaWV3T2ZGaWxlIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZW50IHdyb25nLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKYmFzaCQgLi93aW5lIC1kZWJ1ZyAnLi9kdW1wZXhlLmV4ZSAtc3ltYm9sIC4vZHVtcGV4ZS5leGUnCldhcm5pbmc6IGludmFsaWQgZGlyICdlOlx0ZXN0JyBpbiBwYXRoLCBkZWxldGluZyBpdC4KV2luMzIgdGFzayAnVzMyU1hYWFgnOiBCcmVha3BvaW50IDEgYXQgMHgwODFhMzQ1MApMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAuL3dpbmUuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliWHBtLnNvLjQuNi4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJTTS5zby42LjAuLi4KTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliSUNFLnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYZXh0LnNvLjYuMC4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvdXNyL1gxMVI2L2xpYi9saWJYMTEuc28uNi4wLi4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGlibS5zby41LjAuNS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAvbGliL2xpYmMuc28uNS4yLjE4Li4uCkxvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGQtbGludXguc28uMS4uLgpMb2FkaW5nIHN5bWJvbHMgZnJvbSBXaW4zMiBmaWxlIC4vZHVtcGV4ZS5leGUuLi4KU3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwODFhMzQ1MCAoX21haW5DUlRTdGFydHVwKQpJbiAzMiBiaXQgbW9kZS4KKioqIEludmFsaWQgYWRkcmVzcyAweDQxNGM1ZmY4ICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzkzMGVlNmMpCjB4MDgxYTM0NTAgKF9tYWluQ1JUU3RhcnR1cCk6ICBtb3ZsCSVmczowLCVlYXgKV2luZS1kYmc+YiBEdW1wRmlsZToyNzY3CkJyZWFrcG9pbnQgMiBhdCAweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pCldpbmUtZGJnPmMKRHVtcCBGaWxlOiAuL2R1bXBleGUuZXhlDQpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMiBhdCAweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pCkVudGVyIHBhdGggdG8gZmlsZSBkdW1wZXhlLmM6IC4uL2RlCjI3NjcJCWxwTWFwID0gKExQU1RSKSBNYXBWaWV3T2ZGaWxlKGhNYXAsIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOwoweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pOiAgcHVzaGwJJDB4MApXaW5lLWRiZz5zdGVwCjM5MAkwMzg1IHN0ZGNhbGwgTWFwVmlld09mRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE1hcFZpZXdPZkZpbGUKMHgwODBkNzkzYyAoS0VSTkVMMzJfMzg1IFtrZXJuZWwzMi5zcGVjOjM5MF0pOiAgcHVzaGwJJWVicApXaW5lLWRiZz5zdGVwCjIyMwkgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKMHgwODBjODNkYyAoUkVMQVlfRGVidWdDYWxsRnJvbTMyKzB4YyBbcmVsYXkuYzoyMjNdKTogIGNtcHcJJDAsMHg2NDRhCldpbmUtZGJnPgoyNDQJfQoweDA4MGM4NDhlIChSRUxBWV9EZWJ1Z0NhbGxGcm9tMzIrMHhiZSBbcmVsYXkuYzoyNDRdKTogIGxlYWwJMHhmZmZmZmZmNCglZWJwKSwlZXNwCldpbmUtZGJnPgoxMDMJICAgIHJldHVybiBNYXBWaWV3T2ZGaWxlRXgoaGFuZGxlLGFjY2VzcyxvZmZoaSxvZmZsbyxzaXplLDApOwoweDA4MDkxMWE0IChNYXBWaWV3T2ZGaWxlKzB4MTQgW2ZpbGUuYzoxMDNdKTogIHB1c2hsCSQweDAKV2luZS1kYmc+CjExMwkgICAgRklMRU1BUF9PQkpFQ1QgKmZtYXAgPSAoRklMRU1BUF9PQkpFQ1QqKWhhbmRsZTsKMHgwODA5MTFjZiAoTWFwVmlld09mRmlsZUV4KzB4ZiBbZmlsZS5jOjExM10pOiAgbW92bAkweDgoJWVicCksJWVzaQpXaW5lLWRiZz5uCjExNQkgICAgaWYgKCFzaXplKSBzaXplID0gZm1hcC0+c2l6ZTsKMHgwODA5MTFkMiAoTWFwVmlld09mRmlsZUV4KzB4MTIgW2ZpbGUuYzoxMTVdKTogIHRlc3RsCSVlYngsJWVieApXaW5lLWRiZz5saXN0Cmxpc3QNCjExNQkgICAgaWYgKCFzaXplKSBzaXplID0gZm1hcC0+c2l6ZTsKMTE2CSAgICBpZiAoIXNpemUpIHNpemUgPSAxOwoxMTcJICAgIHJldHVybiBtbWFwICgoY2FkZHJfdClzdCwgc2l6ZSwgZm1hcC0+cHJvdCwgCjExOAkgICAgICAgICAgICAgICAgIE1BUF9BTk9OfE1BUF9QUklWQVRFLCAKMTE5CQkJIEZJTEVfR2V0VW5peEhhbmRsZShmbWFwLT5oZmlsZSksCjEyMAkJCSBvZmZsbyk7CjEyMQl9CjEyMgkKMTIzCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoxMjQJICogICAgICAgICAgIFVubWFwVmlld09mRmlsZSAgICAgICAgICAgICAgICAgIChLRVJORUwzMi4zODUpCjEyNQkgKi8KV2luZS1kYmc+eCBzaXplCiAwMDAwMDAwMApXaW5lLWRiZz5uCjExNgkgICAgaWYgKCFzaXplKSBzaXplID0gMTsKMHgwODA5MTFkOSAoTWFwVmlld09mRmlsZUV4KzB4MTkgW2ZpbGUuYzoxMTZdKTogIHRlc3RsCSVlYngsJWVieApXaW5lLWRiZz54IHNpemUKIDAwMDAwMDAwCldpbmUtZGJnPm4KMTE3CSAgICByZXR1cm4gbW1hcCAoKGNhZGRyX3Qpc3QsIHNpemUsIGZtYXAtPnByb3QsIAoweDA4MDkxMWUyIChNYXBWaWV3T2ZGaWxlRXgrMHgyMiBbZmlsZS5jOjExN10pOiAgcHVzaGwJJWVheApXaW5lLWRiZz54IHNpemUKIDAwMDAwMDAwCldpbmUtZGJnPmluZm8gbG9jYWwKTWFwVmlld09mRmlsZUV4OmhhbmRsZSA9PSAweDA4ZTQ4YzkwCk1hcFZpZXdPZkZpbGVFeDphY2Nlc3MgPT0gMHgwMDAwMDAwNApNYXBWaWV3T2ZGaWxlRXg6b2ZmaGkgPT0gMHgwMDAwMDAwMApNYXBWaWV3T2ZGaWxlRXg6b2ZmbG8gPT0gMHgwMDAwMDAwMApNYXBWaWV3T2ZGaWxlRXg6c2l6ZSA9PSAweDAwMDAwMDAwCk1hcFZpZXdPZkZpbGVFeDpzdCA9PSAweDAwMDAwMDAwCk1hcFZpZXdPZkZpbGVFeDpvZmZsbyBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZWF4IApNYXBWaWV3T2ZGaWxlRXg6c2l6ZSBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZWJ4IApNYXBWaWV3T2ZGaWxlRXg6c3Qgb3B0aW1pemVkIGludG8gcmVnaXN0ZXIgJGVkaSAKTWFwVmlld09mRmlsZUV4OmZtYXAgb3B0aW1pemVkIGludG8gcmVnaXN0ZXIgJGVzaSAKV2luZS1kYmc+cHJpbnQgJGVieAoweDAwMDEKV2luZS1kYmc+YnQKYnQNCkJhY2t0cmFjZToKPT4wIDB4MDgwOTExZTIgKE1hcFZpZXdPZkZpbGVFeCsweDIyIFtmaWxlLmM6MTE3XSkKICAxIDB4MDgwOTExYjAgKE1hcFZpZXdPZkZpbGUrMHgyMChoYW5kbGU9MHg4ZTQ4YzkwLCBhY2Nlc3M9MHg0LCBvZmZoaT0weDAsIG9mZmxvPTB4MCwgc2l6ZT0weDApIFtmaWxlLmM6MTA0XSkKICAyIDB4MDgxMDRhYjUgKENhbGxGcm9tMzJfc3RkY2FsbF81KzB4MjUgW2NhbGxmcm9tMzIuc10pCiAgMyAweDA4MWEwMTY4IChEdW1wRmlsZSsweGY5KGxwRmlsZU5hbWU9MHg0MTRjNjFlZCkgW2R1bXBleGUuYzoyNzY3XSkKICA0IDB4MDgxYTBjMzUgKG1haW4rMHg0MTAoYXJnYz0weDMsIGFyZ3Y9MHg0MTRjNjFjYykgW2R1bXBleGUuYzozMDc4XSkKICA1IDB4MDgxYTM1MTQgKF9tYWluQ1JUU3RhcnR1cCsweGM0KQogIDYgMHgwODEwNTQ5ZiAoQ29kZV9TdGFydCsweDEzIFtjYWxsdG8zMi5zXSkKICA3IDB4MDgwMmZkYWMgKFRBU0tfQ2FsbFRvU3RhcnQrMHg4YyBbdGFzay5jOjM3M10pCgpXaW5lLWRiZz4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKTm90aWNlIHRoYXQgeW91IGNhbiBzdGVwIHRocm91Z2ggdGhlIHRodW5rcyBpbnRvIG91ciBvd24gdHJhbnNmZXIKcm91dGluZXMuICAgWW91IHdpbGwgbm90aWNlIHRoYXQgdGhlIHNvdXJjZSBsaW5lIGRpc3BsYXlzIGFzIHNvbWV0aGluZwpsaWtlOgoKMzkwCTAzODUgc3RkY2FsbCBNYXBWaWV3T2ZGaWxlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgTWFwVmlld09mRmlsZQoKVGhpcyBpcyBqdXN0IHRoZSBzb3VyY2UgbGluZSBmcm9tIHRoZSBzcGVjIGZpbGUgdGhhdCBjYXVzZWQgdGhlIHRyYW5zZmVyCnJvdXRpbmUgdG8gYmUgZ2VuZXJhdGVkLiAgRnJvbSB0aGlzIHlvdSBjYW4gc3RlcCBhZ2FpbiwgYW5kIHlvdSBzdGVwCmludG8gdGhlIHJlbGF5IGxvZ2dpbmcgY29kZSAtIGtlZXAgc3RlcHBpbmcgYW5kIHlvdSBldmVudHVhbGx5IHN0ZXAgaW50bwp0aGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgZGlydHkgd29yay4KCglBdCB0aGlzIHBvaW50IGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBzb3VyY2UgdG8gdGhlIFdpbjMyIHByb2dyYW0KYW5kIGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBzb3VyY2UgdG8gd2luMzIvZmlsZS5zIHNob3dlZCB3aGVyZSB0aGUgcHJvYmxlbQp3YXMuICBXaGVuIHlvdSBzcGVjaWZ5IDAgZm9yIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gQ3JlYXRlRmlsZU1hcHBpbmcsCml0IGlzIHN1cHBvc2VkIHRvIHVzZSB0aGUgZW50aXJlIHNpemUgb2YgdGhlIGZpbGUgYXMgdGhlIHNpemUgb2YgdGhlCm9iamVjdC4gIEluc3RlYWQgd2Ugd2VyZSBqdXN0IGJsaW5kbHkgY29weWluZyB0aGUgbnVtYmVyIG92ZXIuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpXaW5lLWRiZz5iIG1haW4KQnJlYWtwb2ludCAxIGF0IDB4MDgwMTA4YzAgKG1haW4gW2RiZ21haW4uYzoyMTNdKQpXaW5lLWRiZz5wcmludCBicmVha3BvaW50c1sxXQp7YWRkcj17dHlwZT0weDA4MDQzMDAwLCBzZWc9MCwgb2ZmPTEzNDI4NTUwNH0sIGFkZHJsZW49JyAnLCBvcGNvZGU9J1UnLCBlbmFibGVkPTEsIHNraXBjb3VudD0wLCBpbl91c2U9MX0KCldpbmUtZGJnPiBwcmludCBicmVha3BvaW50c1sxXS5lbmFibGVkCjEKV2luZS1kYmc+c2V0IGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQgPSAwCldpbmUtZGJnPnByaW50IGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQKMAoKV2luZS1kYmc+cHJpbnQgdHlwZV9oYXNoX3RhYmxlWzFdLT50eXBlClNUUlVDVAoKV2luZS1kYmc+cHJpbnQgdHlwZV9oYXNoX3RhYmxlWzFdCjB4MDgwNzIwMjAKV2luZS1kYmc+cHJpbnQgKnR5cGVfaGFzaF90YWJsZVsxXQpwcmludCAqdHlwZV9oYXNoX3RhYmxlWzFdDQp7dHlwZT1TVFJVQ1QsIG5leHQ9MHgwMDAwMDAwMCwgbmFtZT0iTE9HUEFMRVRURSIsIHVuPXtiYXNpYz17YmFzaWNfdHlwZT04LCBvdXRwdXRfZm9ybWF0PSKgVh0IoE0dCCIsIGJhc2ljX3NpemU9LTEyOCwgYl9zaWduZWQ9MH0sIGJpdGZpZWxkPXtiaXRvZmY9OCwgbmJpdHM9MCwgYmFzZXR5cGU9MHgwODFkNTZjMH0sIHBvaW50ZXI9e3BvaW50c3RvPTB4MDAwMDAwMDh9LCBmdW5jdD17cmV0dHlwZT0weDAwMDAwMDA4fSwgYXJyYXk9e3N0YXJ0PTgsIGVuZD0xMzYxNDA0ODAsIGJhc2ljdHlwZT0weDA4MDQzZTgwfSwgc3RydWN0dXJlPXtzaXplPTgsIG1lbWJlcnM9MHgwODFkNTZjMH0sIGVudW1lcmF0aW9uPXttZW1iZXJzPTB4MDAwMDAwMDh9fX0KV2luZS1kYmc+CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJVGhpcyBleGFtcGxlIHNob3dzIGhvdyB5b3UgY2FuIHByaW50IG91dCB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcy4KTm90ZSB0aGF0IGVudW1lcmF0ZWQgdHlwZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgc3ltYm9saWMgZm9ybSwgYW5kIHN0cmluZ3MKYXJlIGRpc3BsYXllZCBpbiB0aGUgZXhwZWN0ZWQgbWFubmVyLgoKCVlvdSBjYW4gdXNlIHRoZSBzZXQgY29tbWFuZCB0byBzZXQgbW9yZSBvciBsZXNzIGFueXRoaW5nLiAgTm90ZQpob3dldmVyIHRoYXQgeW91IGNhbm5vdCB1c2UgZW51bWVyYXRlZCB0eXBlcyBvbiB0aGUgUkhTIG9mIHRoZSBleHByZXNzaW9uLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCldpbmUtZGJnPmxpc3QKMjk4NiAgICAgICAgICAgIGlmKCBhcmdjIDw9IDEgKQoyOTg3ICAgICAgICAgICAgewoyOTg4ICAgICAgICAgICAgICAgICAgICBVc2FnZShhcmd2WzBdKTsKMjk4OSAgICAgICAgICAgIH0KMjk5MAoyOTkxICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8IGFyZ2M7IGkrKyApCjI5OTIgICAgICAgICAgICB7CjI5OTMgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJuY21wKGFyZ3ZbaV0sICItZG9zIiwgc2l6ZW9mKCItZG9zIikgLSAxKSA9PSAwICkKMjk5NCAgICAgICAgICAgICAgICAgICAgewoyOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIERtcEN0cmwuYkR1bXBET1NIZWFkZXIgPSBUUlVFOwoyOTk2ICAgICAgICAgICAgICAgICAgICB9CldpbmUtZGJnPmIgMjk5MwpCcmVha3BvaW50IDMgYXQgMHgwODFhODg2MSAobWFpbisweDNjIFtkdW1wZXhlLmM6Mjk5M10pCldpbmUtZGJnPmNvbmRpdGlvbiAzIGkgPT0gMgpXaW5lLWRiZz5jClN0b3BwZWQgb24gYnJlYWtwb2ludCAzIGF0IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQoyOTkzICAgICAgICAgICAgICAgICAgICBpZiggc3RybmNtcChhcmd2W2ldLCAiLWRvcyIsIHNpemVvZigiLWRvcyIpIC0gMSkgPT0gMCApCjB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKTogIHB1c2hsICQweDQKV2luZS1kYmc+cHJpbnQgaQoyCldpbmUtZGJnPnByaW50IGFyZ3ZbaV0KIi4vZHVtcGV4ZS5leGUiCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgY29uZGl0aW9uYWwgYnJlYWtwb2ludHMuCglIZXJlIGlzIGFub3RoZXIgb25lIHRoYXQgZGVtb25zdHJhdGVzIGFub3RoZXIgY29vbCBmZWF0dXJlCgljb25kaXRpb25hbCBicmVha3BvaW50cyB0aGF0IGludm9sdmUgYSBmdW5jdGlvbiBjYWxsOgoKCQljb25kaXRpb24gMyBzdHJjbXAoYXJndltpXSwgIi4vZHVtcGV4ZS5leGUiKSA9PSAwCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKV2luZS1kYmc+bGlzdAoyOTg2ICAgICAgICAgICAgaWYoIGFyZ2MgPD0gMSApCjI5ODcgICAgICAgICAgICB7CjI5ODggICAgICAgICAgICAgICAgICAgIFVzYWdlKGFyZ3ZbMF0pOwoyOTg5ICAgICAgICAgICAgfQoyOTkwCjI5OTEgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDwgYXJnYzsgaSsrICkKMjk5MiAgICAgICAgICAgIHsKMjk5MyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cm5jbXAoYXJndltpXSwgIi1kb3MiLCBzaXplb2YoIi1kb3MiKSAtIDEpID09IDAgKQoyOTk0ICAgICAgICAgICAgICAgICAgICB7CjI5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG1wQ3RybC5iRHVtcERPU0hlYWRlciA9IFRSVUU7CjI5OTYgICAgICAgICAgICAgICAgICAgIH0KV2luZS1kYmc+YiAyOTkzCkJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKV2luZS1kYmc+Y29uZGl0aW9uIDMgc3RyY21wKGFyZ3ZbaV0sICIuL2R1bXBleGUuZXhlIikgPT0gMApXaW5lLWRiZz5pbmZvIGJyZWFrCkJyZWFrcG9pbnRzOgoxOiB5IDB4MDgxYWI0NTAgKF9tYWluQ1JUU3RhcnR1cCkKMjogeSAweDA4MWE4ODJlIChtYWluKzB4OSBbZHVtcGV4ZS5jOjI5ODZdKQozOiB5IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQogICAgICAgICAgICAgICAgc3RvcCB3aGVuICAoIHN0cmNtcCgoIGFyZ3ZbaV0gKSwgIi4vZHVtcGV4ZS5leGUiKSA9PSAwICkKV2luZS1kYmc+YwpTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKMjk5MyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cm5jbXAoYXJndltpXSwgIi1kb3MiLCBzaXplb2YoIi1kb3MiKSAtIDEpID09IDAgKQoweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSk6ICBwdXNobCAkMHg0CldpbmUtZGJnPnByaW50IGkKMgpXaW5lLWRiZz5wcmludCBhcmd2W2ldICAKIi4vZHVtcGV4ZS5leGUiCldpbmUtZGJnPgo=