LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCkBTWU5PUFNJU0AKI2luY2x1ZGUgJmx0O2ZvbnRjb25maWcuaCZndDsKI2luY2x1ZGUgJmx0O2ZjZnJlZXR5cGUuaCZndDsKQFJFVEAgICAgICAgICAgIEZUX1VJbnQgICAgICAgCkBGVU5DQCAgICAgICAgICBGY0ZyZWVUeXBlQ2hhckluZGV4IApAVFlQRTFAICAgICAgICAgRlRfRmFjZQkJCQlAQVJHMUAgICAgICAgICAgZmFjZSAgICAgIApAVFlQRTJAICAgICAgICAgRmNDaGFyMzIJCQlAQVJHMkAgICAgICAgICAgdWNzNCAgICAgIApAUFVSUE9TRUAJbWFwIFVuaWNvZGUgdG8gZ2x5cGggaWQKQERFU0NACk1hcHMgYSBVbmljb2RlIGNoYXIgdG8gYSBnbHlwaCBpbmRleC4gIFRoaXMgZnVuY3Rpb24gdXNlcyBpbmZvcm1hdGlvbiBmcm9tCnNldmVyYWwgcG9zc2libGUgdW5kZXJseWluZyBlbmNvZGluZyB0YWJsZXMgdG8gd29yayBhcm91bmQgYnJva2VuIGZvbnRzLgpBcyBhIHJlc3VsdCwgdGhpcyBmdW5jdGlvbiBpc24ndCBkZXNpZ25lZCB0byBiZSB1c2VkIGluIHBlcmZvcm1hbmNlCnNlbnNpdGl2ZSBhcmVhczsgcmVzdWx0cyBmcm9tIHRoaXMgZnVuY3Rpb24gYXJlIGludGVuZGVkIHRvIGJlIGNhY2hlZCBieQpoaWdoZXIgbGV2ZWwgZnVuY3Rpb25zLgpAQAoKQFNZTk9QU0lTQAojaW5jbHVkZSAmbHQ7Zm9udGNvbmZpZy5oJmd0OwojaW5jbHVkZSAmbHQ7ZmNmcmVldHlwZS5oJmd0OwpAUkVUQCAgICAgICAgICAgRmNDaGFyU2V0ICogICAgICAKQEZVTkNAICAgICAgICAgIEZjRnJlZVR5cGVDaGFyU2V0IApAVFlQRTFAICAgICAgICAgRlRfRmFjZQkJCQlAQVJHMUAgICAgICAgICAgZmFjZSAgICAgIApAVFlQRTJAICAgICAgICAgRmNCbGFua3MgKgkJCUBBUkcyQCAgICAgICAgICBibGFua3MKQFBVUlBPU0VACWNvbXB1dGUgdW5pY29kZSBjb3ZlcmFnZQpAREVTQ0AKU2NhbnMgYSBGcmVlVHlwZSBmYWNlIGFuZCByZXR1cm5zIHRoZSBzZXQgb2YgZW5jb2RlZCBVbmljb2RlIGNoYXJzLiAgVGhpcyBzY2FucwpzZXZlcmFsIGVuY29kaW5nIHRhYmxlcyB0byBidWlsZCBhcyBjb21wbGV0ZSBhIGxpc3QgYXMgcG9zc2libGUuICAKSWYgJ2JsYW5rcycgaXMgbm90IDAsIHRoZSBnbHlwaHMgaW4gdGhlIGZvbnQgYXJlIGV4YW1pbmVkIGFuZCBhbnkgYmxhbmsgZ2x5cGhzCm5vdCBpbiAnYmxhbmtzJyBhcmUgbm90IHBsYWNlZCBpbiB0aGUgcmV0dXJuZWQgRmNDaGFyU2V0LgpAQAoKQFNZTk9QU0lTQAojaW5jbHVkZSAmbHQ7Zm9udGNvbmZpZy5oJmd0OwojaW5jbHVkZSAmbHQ7ZmNmcmVldHlwZS5oJmd0OwpAUkVUQCAgICAgICAgICAgRmNQYXR0ZXJuICogICAgICAKQEZVTkNAICAgICAgICAgIEZjRnJlZVR5cGVRdWVyeSAKQFRZUEUxQCAgICAgICAgIGNvbnN0IGNoYXIgKgkJCUBBUkcxQCAgICAgICAgICBmaWxlICAgICAgCkBUWVBFMkAgICAgICAgICBpbnQJCQkJQEFSRzJAICAgICAgICAgIGlkICAgICAgCkBUWVBFM0AgICAgICAgICBGY0JsYW5rcyAqCQkJQEFSRzNAICAgICAgICAgIGJsYW5rcyAgICAgIApAVFlQRTRAICAgICAgICAgaW50ICoJCQkJQEFSRzRAICAgICAgICAgIGNvdW50ICAgICAgCkBQVVJQT1NFQAljb21wdXRlIGZvbnQgZmlsZSBwYXR0ZXJuCkBERVNDQApDb25zdHJ1Y3RzIGEgcGF0dGVybiByZXByZXNlbnRpbmcgdGhlICdpZCd0aCBmb250IGluICdmaWxlJy4gIFRoZSBudW1iZXIKb2YgZm9udHMgaW4gJ2ZpbGUnIGlzIHJldHVybmVkIGluICdjb3VudCcuCkBACg==