Ck5FWFQuVkVSU0lPTgoKICAuLi5ub3RoaW5nIHlldC4uLgoKMC4xMgoKICAqIEFkZHJlc3Mgc2VjdXJpdHkgaXNzdWVzOgogICAgKiBDVkUtMjAxMy02MzcxOiBoYXNoIGNvbGxpc2lvbiBkZW5pYWwgb2Ygc2VydmljZQogICAgKiBDVkUtMjAxMy02MzcwOiBidWZmZXIgb3ZlcmZsb3cgaWYgc2l6ZV90IGlzIGxhcmdlciB0aGFuIGludAoKICAqIEF2b2lkIHBvdGVudGlhbCBvdmVyZmxvdyBpbiBqc29uX29iamVjdF9nZXRfZG91YmxlCgogICogRWxpbWluYXRlIHRoZSBtY19hYm9ydCgpIGZ1bmN0aW9uIGFuZCBNQ19BQk9SVCBtYWNyby4KCiAgKiBNYWtlIHRoZSBqc29uX3Rva2VuZXJfZXJyb3JzIGFycmF5IGxvY2FsLiAgSXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBmb3IKICAgICBhIHdoaWxlLCBhbmQganNvbl90b2tlbmVyX2Vycm9yX2Rlc2MoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoKICAqIGNoYW5nZSB0aGUgZmxvYXRpbmcgcG9pbnQgb3V0cHV0IGZvcm1hdCB0byAlLjE3ZyBzbyB2YWx1ZXMgd2l0aCAKICAgICBtb3JlIHRoYW4gNiBkaWdpdHMgc2hvdyB1cCBpbiB0aGUgb3V0cHV0LgoKICAqIFJlbW92ZSB0aGUgb2xkIGxpYmpzb24uc28gbmFtZSBjb21wYXRpYmlsaXR5IHN1cHBvcnQuICBUaGUgbGlicmFyeSBpcwogICAgICBvbmx5IGNyZWF0ZWQgYXMgbGlianNvbi1jLnNvIG5vdyBhbmQgaGVhZGVycyBhcmUgb25seSBpbnN0YWxsZWQgCiAgICAgIGludG8gdGhlICR7cHJlZml4fS9qc29uLWMgZGlyZWN0b3J5LgoKICAqIFdoZW4gc3VwcG9ydGVkIGJ5IHRoZSBsaW5rZXIsIGFkZCB0aGUgLUJzeW1ib2xpYy1mdW5jdGlvbnMgZmxhZy4KCiAgKiBWYXJpb3VzIGNoYW5nZXMgdG8gZml4IHRoZSBidWlsZCBvbiBNU1ZDLgoKICAqIE1ha2Ugc3RyaWN0IG1vZGUgbW9yZSBzdHJpY3Q6CiAgICAqIG51bWJlciBtdXN0IG5vdCBzdGFydCB3aXRoIDAKICAgICogbm8gc2luZ2xlLXF1b3RlIHN0cmluZ3MKICAgICogbm8gY29tbWVudHMKICAgICogdHJhaWxpbmcgY2hhciBub3QgYWxsb3dlZAogICAgKiBvbmx5IGFsbG93IGxvd2VyY2FzZSBsaXRlcmFscwoKICAqIEFkZGVkIGEganNvbl9vYmplY3RfbmV3X2RvdWJsZV9zKCkgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gYWxsb3cKICAgIGFuIGV4YWN0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRvdWJsZSB0byBiZSBzcGVjaWZpZWQgd2hlbgogICAgY3JlYXRpbmcgdGhlIG9iamVjdCBhbmQgdXNlIGl0IGluIGpzb25fdG9rZW5lcl9wYXJzZV9leCgpIHNvCiAgICBhIHJlLXNlcmlhbGl6ZWQgb2JqZWN0IG1vcmUgZXhhY3RseSBtYXRjaGVzIHRoZSBpbnB1dC4KCiAgKiBBZGQgc3VwcG9ydCBOYU4gYW5kIEluZmluaXR5CgoKMC4xMQoKICAqIElNUE9SVEFOVDogdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgaGFzIGNoYW5nZWQgdG8gbGlianNvbi1jLnNvIGFuZAogICAgIHRoZSBoZWFkZXIgZmlsZXMgYXJlIG5vdyBpbiBpbmNsdWRlL2pzb24tYy4KICAgICBUaGUgcGtnY29uZmlnIG5hbWUgaGFzIGFsc28gY2hhbmdlZCBmcm9tIGpzb24gdG8ganNvbi1jLgogICAgIFlvdSBzaG91bGQgY2hhbmdlIHlvdXIgYnVpbGQgdG8gdXNlIGFwcHJvcHJpYXRlIC1JIGFuZCAtbCBvcHRpb25zLgogICAgIEEgY29tcGF0aWJpbGl0eSBzaGltIGlzIGluIHBsYWNlIHNvIGJ1aWxkcyB1c2luZyB0aGUgb2xkIG5hbWUgd2lsbAogICAgIGNvbnRpbnVlIHRvIHdvcmssIGJ1dCB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLgogICogTWF4aW11bSByZWN1cnNpb24gZGVwdGggaXMgbm93IGEgcnVudGltZSBvcHRpb24uCiAgICAganNvbl90b2tlbmVyX25ldygpIGlzIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5LgogICAgIGpzb25fdG9rZW5lcl9uZXdfZXgoZGVwdGgpCiAgKiBJbmNsdWRlIGpzb25fb2JqZWN0X2l0ZXJhdG9yLmggaW4gdGhlIGluc3RhbGxlZCBoZWFkZXJzLgogICogQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIG9uIEFuZHJvaWQuCiAgKiBSZXdyaXRlIGpzb25fb2JqZWN0X29iamVjdF9hZGQgdG8gcmVwbGFjZSBqdXN0IHRoZSB2YWx1ZSBpZiB0aGUga2V5IGFscmVhZHkgZXhpc3RzIHNvIGtleXMgcmVtYWluIHZhbGlkLgogICogTWFrZSBpdCBzYWZlIHRvIGRlbGV0ZSBrZXlzIHdoaWxlIGl0ZXJhdGluZyB3aXRoIHRoZSBqc29uX29iamVjdF9vYmplY3RfZm9yZWFjaCBtYWNyby4KICAqIEFkZCBhIGpzb25fc2V0X3NlcmlhbGl6ZXIoKSBmdW5jdGlvbiB0byBhbGxvdyB0aGUgc3RyaW5nIG91dHB1dCBvZiBhIGpzb25fb2JqZWN0IHRvIGJlIGN1c3RvbWl6ZWQuCiAgKiBNYWtlIGZsb2F0IHBhcnNpbmcgbG9jYWxlIGluZGVwZW5kZW50LgogICogQWRkIGEganNvbl90b2tlbmVyX3NldF9mbGFncygpIGZ1bmN0aW9uIGFuZCBhIEpTT05fVE9LRU5FUl9TVFJJQ1QgZmxhZy4KICAqIEVuYWJsZSAtV2Vycm9yIHdoZW4gYnVpbGRpbmcuCiAgKiBzcGVlZCBpbXByb3ZlbWVudHMgdG8gcGFyc2luZyA2NC1iaXQgaW50ZWdlcnMgb24gc3lzdGVtcyB3aXRoIHdvcmtpbmcgc3NjYW5mCiAgKiBBZGQgYSBqc29uX29iamVjdF9vYmplY3RfbGVuZ3RoIGZ1bmN0aW9uLgogICogRml4IGEgYnVnIChidWZmZXIgb3ZlcnJ1bikgd2hlbiBleHBhbmRpbmcgYXJyYXlzIHRvIG1vcmUgdGhhbiA2NCBlbnRyaWVzLgoKMC4xMAoKICAqIEFkZCBhIGpzb25fb2JqZWN0X3RvX2pzb25fc3RyaW5nX2V4dCgpIGZ1bmN0aW9uIHRvIGFsbG93IG91dHB1dCB0byBiZQogICAgIGZvcm1hdHRlZCBpbiBhIG1vcmUgaHVtYW4gcmVhZGFibGUgZm9ybS4KICAqIEFkZCBqc29uX29iamVjdF9vYmplY3RfZ2V0X2V4KCksIGEgTlVMTC1zYWZlIGdldCBvYmplY3QgbWV0aG9kLCB0byBiZSBhYmxlCiAgICAgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGtleSBub3QgcHJlc2VudCBhbmQgdGhlIHZhbHVlIGJlaW5nIE5VTEwuCiAgKiBBZGQgYW4gYWx0ZXJuYXRpdmUgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24sIHNlZSBqc29uX29iamVjdF9pdGVyYXRvci5oCiAgKiBNYWtlIGpzb25fb2JqZWN0X2l0ZXIgcHVibGljIHRvIGVuYWJsZSBleHRlcm5hbCB1c2Ugb2YgdGhlCiAgICAganNvbl9vYmplY3Rfb2JqZWN0X2ZvcmVhY2hDIG1hY3JvLgogICogQWRkIGEgcHJpbnRidWZfbWVtc2V0KCkgZnVuY3Rpb24gdG8gcHJvdmlkZSBhbiBlZmZlY2llbnQgd2F5IHRvIHNldCBhbmQKICAgICBhcHBlbmQgdGhpbmdzIGxpa2Ugd2hpdGVzcGFjZSBpbmRlbnRhdGlvbi4KICAqIEFkanVzdCBqc29uX29iamVjdF9pc190eXBlIGFuZCBqc29uX29iamVjdF9nZXRfdHlwZSBzbyB0aGV5IHJldHVybgogICAgICBqc29uX3R5cGVfbnVsbCBmb3IgTlVMTCBvYmplY3RzIGFuZCBoYW5kbGUgTlVMTCBwYXNzZWQgdG8KICAgICAganNvbl9vYmpjdF9vYmplY3RfZ2V0KCkuCiAgKiBSZW5hbWUgYm9vbGVhbiB0eXBlIHRvIGpzb25fYm9vbC4KICAqIEZpeCB2YXJpb3VzIGNvbXBpbGUgaXNzdWVzIGZvciBWaXN1YWwgU3R1ZGlvIGFuZCBNaW5HVy4KICAqIEFsbG93IGpzb25fdG9rZW5lcl9wYXJzZV9leCgpIHRvIGJlIHJlLXVzZWQgdG8gcGFyc2UgbXVsdGlwbGUgb2JqZWN0LgogICAgIEFsc28sIGZpeCBzb21lIHBhcnNpbmcgaXNzdWVzIHdpdGggY2FwaXRhbGl6ZWQgaGV4YWRlY2ltYWwgbnVtYmVycyBhbmQKICAgICBudW1iZXIgaW4gRSBub3RhdGlvbi4KICAqIEFkZCBqc29uX3Rva2VuZXJfZ2V0X2Vycm9yKCkgYW5kIGpzb25fdG9rZW5lcl9lcnJvcl9kZXNjKCkgdG8gYmV0dGVyIAogICAgIGVuY2Fwc3VsYXRlIHRoZSBwcm9jZXNzIG9mIHJldHJpZXZpbmcgZXJyb3JzIHdoaWxlIHBhcnNpbmcuCiAgKiBWYXJpb3VzIGltcHJvdmVtZW50cyB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBtYW55IGZ1bmN0aW9ucy4KICAqIEFkZCBuZXcganNvbl9vYmplY3RfYXJyYXlfc29ydCgpIGZ1bmN0aW9uLgogICogRml4IGEgYnVnIGluIGpzb25fb2JqZWN0X2dldF9pbnQoKSwgd2hpY2ggd291bGQgaW5jb3JyZWN0bHkgcmV0dXJuIDAKICAgIHdoZW4gY2FsbGVkIG9uIGEgc3RyaW5nIHR5cGUgb2JqZWN0LgogICAgRXJpYyBIYXN6bGFraWV3aWN6CiAgKiBBZGQgYSBqc29uX3R5cGVfdG9fbmFtZSgpIGZ1bmN0aW9uLgogICAgRXJpYyBIYXN6bGFraWV3aWN6CiAgKiBBZGQgYSBqc29uX3Rva2VuZXJfcGFyc2VfdmVyYm9zZSgpIGZ1bmN0aW9uLgogICAgSmVoaWFoIEN6ZWJvdGFyCiAgKiBJbXByb3ZlIHN1cHBvcnQgZm9yIG51bGwgYnl0ZXMgd2l0aGluIEpTT04gc3RyaW5ncy4KICAgIEplaGlhaCBDemVib3RhcgogICogRml4IGZpbGUgZGVzY3JpcHRvciBsZWFrIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzIGluIGpzb25fdXRpbAogICAgWmFjaGFyeSBCbGFpciwgemFja19ibGFpciBhdCBob3RtYWlsIGRvdCBjb20KICAqIEFkZCBpbnQ2NCBzdXBwb3J0LiBUd28gbmV3IGZ1bmN0aW9ucyBqc29uX29iamVjdF9uZXRfaW50NjQgYW5kCiAgICBqc29uX29iamVjdF9nZXRfaW50NjQuIEJpbmFyeSBjb21wYXRpYmlsaXR5IHByZXNlcnZlZC4KICAgIEVyaWMgSGFzemxha2lld2ljeiwgRUhBU1pMQSBhdCB0cmFuc3VuaW9uIGNvbQogICAgUnVpIE1pZ3VlbCBTaWx2YSBTZWFicmEsIHJtcyBhdCAxNDA3IGRvdCBvcmcKICAqIEZpeCBzdWJ0bGUgYnVnIGluIGxpbmtoYXNoIHdoZXJlIGxvb2t1cCBjb3VsZCBoYW5nIGFmdGVyIGFsbCBzbG90cwogICAgd2VyZSBmaWxsZWQgdGhlbiBzdWNjZXNzaXZlbHkgZnJlZWQuCiAgICBTcG90dGVkIGJ5IEplYW4tTWFyYyBOYXVkLCBqIGRhc2ggbSBhdCBuZXd0cmF4dGVjaCBkb3QgY29tCiAgKiBNYWtlIGpzb25fb2JqZWN0X2Zyb21fZmlsZSB0YWtlIGNvbnN0IGNoYXIgKmZpbGVuYW1lCiAgICBTcG90dGVkIGJ5IFZpa3JhbSBSYWogViwgdnNhZ2FyIGF0IGF0dGludGVyYWN0aXZlIGRvdCBjb20KICAqIEFkZCBoYW5kbGluZyBvZiBzdXJyb2dhdGUgcGFpcnMgKGpzb25fdG9rZW5lci5jLCB0ZXN0NC5jLCBNYWtlZmlsZS5hbSkKICAgIEJyZW50IE1pbGxlciwgYmRtaWxsZXIgYXQgeWFob28gZGFzaCBpbmMgZG90IGNvbQogICogQ29ycmVjdGlvbiB0byBjb21tZW50IGRlc2NyaWJpbmcgcHJpbnRidWZfbWVtYXBwZW5kIGluIHByaW50YnVmLmgKICAgIEJyZW50IE1pbGxlciwgYmRtaWxsZXIgYXQgeWFob28gZGFzaCBpbmMgZG90IGNvbQoKMC45CiAgKiBBZGQgUkVBRE1FLmh0bWwgUkVBRE1FLVdJTjMyLmh0bWwgY29uZmlnLmgud2luMzIgdG8gTWFrZWZpbGUuYW0KICAgIE1pY2hhZWwgQ2xhcmssIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CiAgKiBBZGQgY29uc3QgcXVhbGlmaWVyIHRvIHRoZSBqc29uX3Rva2VuZXJfcGFyc2UgZnVuY3Rpb25zCiAgICBFcmljIEhhc3psYWtpZXdpY3osIEVIQVNaTEEgYXQgdHJhbnN1bmlvbiBkb3QgY29tCiAgKiBSZW5hbWUgbWluIGFuZCBtYXggc28gd2UgY2FuIG5ldmVyIGNsYXNoIHdpdGggQyBvciBDKysgc3RkIGxpYnJhcnkKICAgIElhbiBBdGhhLCB0aGF0aGEgYXQgeWFob28gZGFzaCBpbmMgZG90IGNvbQogICogRml4IGFueSBub3RpY2VhYmxlIHNwZWxsaW5nIG9yIGdyYW1tYXIgZXJyb3JzLgogICogTWFrZSBzdXJlIGV2ZXJ5IHZhX3N0YXJ0IGhhcyBhIHZhX2VuZC4KICAqIENoZWNrIGFsbCBwb2ludGVycyBmb3IgdmFsaWRpdHkuCiAgICBFcmlrIEhvdmxhbmQsIGVyaWsgYXQgaG92bGFuZCBkb3Qgb3JnCiAgKiBGaXgganNvbl9vYmplY3RfZ2V0X2Jvb2xlYW4gdG8gcmV0dXJuIGZhbHNlIGZvciBlbXB0eSBzdHJpbmcKICAgIFNwb3R0ZWQgYnkgVml0YWx5IEtydWdsaWtvdiwgVml0YWx5IGRvdCBLcnVnbGlrb3YgYXQgcGFsbSBkb3QgY29tCiAgKiBvcHRpbWl6YXRpb25zIHRvIGpzb25fdG9rZW5lcl9wYXJzZV9leCgpLCBwcmludGJ1Zl9tZW1hcHBlbmQoKQogICAgQnJlbnQgTWlsbGVyLCBiZG1pbGxlciBhdCB5YWhvbyBkYXNoIGluYyBkb3QgY29tCiAgKiBEaXNhYmxlIFJFRkNPVU5UX0RFQlVHIGJ5IGRlZmF1bHQgaW4ganNvbl9vYmplY3QuYwogICogRG9uJ3QgdXNlIHRoaXMgYXMgYSB2YXJpYWJsZSwgc28gd2UgY2FuIGNvbXBpbGUgd2l0aCBhIEMrKyBjb21waWxlcgogICogQWRkIGNhc3RzIGZyb20gdm9pZCogdG8gdHlwZSBvZiBhc3NpZ25tZW50IHdoZW4gdXNpbmcgbWFsbG9jIAogICogQWRkICNpZmRlZiBfX2NwbHVzcGx1cyBndWFyZHMgdG8gYWxsIG9mIHRoZSBoZWFkZXJzCiAgKiBBZGQgdHlwZWRlZnMgZm9yIGpzb25fb2JqZWN0LCBqc29uX3Rva2VuZXIsIGFycmF5X2xpc3QsIHByaW50YnVmLCBsaF90YWJsZQogICAgTWljaGFlbCBDbGFyaywgPG1pY2hhZWxAbWV0YXBhcmFkaWdtLmNvbT4KICAqIE51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSBmaXguIEZpeCBqc29uX29iamVjdF9nZXRfYm9vbGVhbiBzdHJsZW4gdGVzdAogICAgdG8gbm90IHJldHVybiBUUlVFIGZvciB6ZXJvIGxlbmd0aCBzdHJpbmcuIFJlbW92ZSByZWR1bmRhbnQgaW5jbHVkZXMuCiAgICBFcmlrIEhvdmxhbmQsIGVyaWsgYXQgaG92bGFuZCBkb3Qgb3JnCiAgKiBGaXhlZCB3YXJuaW5nIHJlcG9ydGVkIGJ5IGFkZGluZyAtV3N0cmljdC1wcm90b3R5cGVzCiAgICAtV29sZC1zdHlsZS1kZWZpbml0aW9uIHRvIHRoZSBjb21waWxhdGluIGZsYWdzLgogICAgRG90YW4gQmFyYWssIGRvdGFuYmEgYXQgZ21haWwgZG90IGNvbQogICogQWRkIGNvbnN0IGNvcnJlY3RuZXNzIHRvIHB1YmxpYyBpbnRlcmZhY2VzCiAgICBHZXJhcmQgS3JvbCwgZyBkb3QgYyBkb3Qga3JvbCBhdCBzdHVkZW50IGRvdCB0dWRlbGZ0IGRvdCBubAoKMC44CiAgKiBBZGQgdmFfZW5kIGZvciBldmVyeSB2YV9zdGFydAogICAgRG90YW4gQmFyYWssIGRvdGFuYmEgYXQgZ21haWwgZG90IGNvbQogICogQWRkIG1hY3JvcyB0byBlbmFibGUgY29tcGlsaW5nIG91dCBkZWJ1ZyBjb2RlCiAgICBHZW9mZnJleSBZb3VuZywgZ2VvZmYgYXQgbW9kcGVybGNvb2tib29rIGRvdCBvcmcKICAqIEZpeCBidWcgd2l0aCB1c2Ugb2YgY2FwaXRhbCBFIGluIG51bWJlcnMgd2l0aCBleHBvbmVudHMKICAgIE1hdGV1c3ogTG9za290LCBtYXRldXN6IGF0IGxvc2tvdCBkb3QgbmV0CiAgKiBBZGQgc3RkZGVmLmggaW5jbHVkZQogICogUGF0Y2ggYWxsb3dzIGZvciBqc29uLWMgY29tcGlsZSB3aXRoIC1XZXJyb3IgYW5kIG5vdCBmYWlsIGR1ZSB0bwogICAgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zCiAgICBHZW9mZnJleSBZb3VuZywgZ2VvZmYgYXQgbW9kcGVybGNvb2tib29rIGRvdCBvcmcKCjAuNwogICogQWRkIGVzY2FwaW5nIG9mIGJhY2tzbGFzaCB0byBqc29uIG91dHB1dAogICogQWRkIGVzY2FwaW5nIG9mIGZvd2FyZCBzbGFzaCBvbiB0b2tlbml6aW5nIGFuZCBvdXRwdXQKICAqIENoYW5nZXMgdG8gaW50ZXJuYWwgdG9rZW5pemVyIGZyb20gdXNpbmcgcmVjdXJzaW9uIHRvCiAgICB1c2luZyBhIGRlcHRoIHN0YXRlIHN0cnVjdHVyZSB0byBhbGxvdyBpbmNyZW1lbnRhbCBwYXJzaW5nCgowLjYKICAqIEZpeCBidWcgaW4gZXNjYXBpbmcgb2YgY29udHJvbCBjaGFyYWN0ZXJzCiAgICBKb2hhbiBCavZya2x1bmQsIGpvaGJqbzA5IGF0IGt0aCBkb3Qgc2UKICAqIFJlbW92ZSBpbmNsdWRlICJjb25maWcuaCIgZnJvbSBoZWFkZXJzIChzaG91bGQgb25seQogICAgYmUgaW5jbHVkZWQgZnJvbSAuYyBmaWxlcykKICAgIE1pY2hhZWwgQ2xhcmsgPG1pY2hhZWxAbWV0YXBhcmFkaWdtLmNvbT4KCjAuNQogICogTWFrZSBoZWFkZXJzIEMrKyBjb21wYXRpYmxlIGJ5IGNoYW5nZSAqdGhpcyB0byAqb2JqCiAgKiBBZGQgaWZkZWYgQysrIGV4dGVybiAiQyIgdG8gaGVhZGVycwogICogVXNlIHNpbXBsZXIgZGVmaW5pdGlvbiBvZiBtaW4gYW5kIG1heCBpbiBiaXRzLmgKICAgIExhcnJ5IExhbnNpbmcsIGxsYW5zaW5nIGF0IGZ1enp5bmVyZCBkb3QgY29tCgogICogUmVtb3ZlIGF1dG9tYWtlIDEuNiByZXF1aXJlbWVudAogICogTW92ZSBhdXRvZ2VuIGNvbW1hbmRzIGludG8gYXV0b2dlbi5zaC4gVXBkYXRlIFJFQURNRQogICogUmVtb3ZlIGVycm9yIHBvaW50ZXIgc3BlY2lhbCBjYXNlIGZvciBXaW5kb3dzCiAgKiBDaGFuZ2UgbGljZW5zZSBmcm9tIExHUEwgdG8gTUlUCiAgICBNaWNoYWVsIENsYXJrIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CgowLjQKICAqIEZpeCBhZGRpdGlvbmFsIGVycm9yIGNhc2UgaW4gb2JqZWN0IHBhcnNpbmcKICAqIEFkZCBiYWNrIHNpZ24gcmV2ZXJzYWwgaW4gbmVzdGVkIG9iamVjdCBwYXJzZSBhcyBlcnJvciBwb2ludGVyCiAgICB2YWx1ZSBpcyBuZWdhdGl2ZSwgd2hpbGUgZXJyb3IgdmFsdWUgaXMgcG9zaXRpdmUuCiAgICBNaWNoYWVsIENsYXJrIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CgowLjMKICAqIGZpeCBwb2ludGVyIGFyaXRobWV0aWMgYnVnIGZvciBlcnJvciBwb2ludGVyIGNoZWNrIGluIGlzX2Vycm9yKCkgbWFjcm8KICAqIGZpeCB0eXBlIHBhc3NlZCB0byBwcmludGJ1Zl9tZW1hcHBlbmQgaW4ganNvbl90b2tlbmVyCiAgKiB1cGRhdGUgYXV0b3Rvb2xzIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMgaW4gUkVBRE1FCiAgICBNaWNoYWVsIENsYXJrIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CgowLjIKICAqIHByaW50YnVmLmMgLSBDLiBXYXRmb3JkIChjaHJpc3RvcGhlci53YXRmb3JkQGdtYWlsLmNvbSkKICAgIEFkZGVkIGEgV2luMzIvV2luNjQgY29tcGxpYW50IGltcGxlbWVudGF0aW9uIG9mIHZhc3ByaW50ZgogICogZGVidWcuYyAtIEMuIFdhdGZvcmQgKGNocmlzdG9waGVyLndhdGZvcmRAZ21haWwuY29tKQogICAgUmVtb3ZlZCB1c2FnZSBvZiB2c3lzbG9nIG9uIFdpbjMyL1dpbjY0IHN5c3RlbXMsIG5lZWRzIHRvIGJlIGhhbmRsZWQKICAgIGJ5IGEgY29uZmlndXJlIHNjcmlwdAogICoganNvbl9vYmplY3QuYyAtIEMuIFdhdGZvcmQgKGNocmlzdG9waGVyLndhdGZvcmRAZ21haWwuY29tKQogICAgQWRkZWQgc2NvcGUgb3BlcmF0b3IgdG8gd3JhcCB1c2FnZSBvZiBqc29uX29iamVjdF9vYmplY3RfZm9yZWFjaCwgdGhpcwogICAgbmVlZHMgdG8gYmUgcmV0aG91Z2h0IHRvIGJlIG1vcmUgQU5TSSBDIGZyaWVuZGx5CiAgKiBqc29uX29iamVjdC5oIC0gQy4gV2F0Zm9yZCAoY2hyaXN0b3BoZXIud2F0Zm9yZEBnbWFpbC5jb20pCiAgICBBZGRlZCBNaWNyb3NvZnQgQyBmcmllbmRseSB2ZXJzaW9uIG9mIGpzb25fb2JqZWN0X29iamVjdF9mb3JlYWNoCiAgKiBqc29uX3Rva2VuZXIuYyAtIEMuIFdhdGZvcmQgKGNocmlzdG9waGVyLndhdGZvcmRAZ21haWwuY29tKQogICAgQWRkZWQgYSBXaW4zMi9XaW42NCBjb21wbGlhbnQgaW1wbGVtZW50YXRpb24gb2Ygc3RybmR1cAogICoganNvbl91dGlsLmMgLSBDLiBXYXRmb3JkIChjaHJpc3RvcGhlci53YXRmb3JkQGdtYWlsLmNvbSkKICAgIEFkZGVkIGNhc3QgYW5kIG1hc2sgdG8gc3VmZmljZSBzaXplX3Qgdi4gdW5zaWduZWQgaW50IGNvbnZlcnNpb24KICAgIGNvcnJlY3RuZXNzIAogICoganNvbl90b2tlbmVyLmMgLSBzaWduIHJldmVyc2FsIGlzc3VlIG9uIGVycm9yIGluZm8gZm9yIG5lc3RlZCBvYmplY3QgcGFyc2UKICAgIHNwb3R0ZWQgYnkgSm9oYW4gQmr2cmtsdW5kIChqb2hiam8wOSBhdCBrdGguc2UpCiAgKiBqc29uX29iamVjdC5jIC0gZXNjYXBlICIgaW4ganNvbl9lc2NhcGVfc3RyCiAgKiBDaGFuZ2UgdG8gYXV0b21ha2UgYW5kIGxpYnRvb2wgdG8gYnVpbGQgc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyeQogICAgTWljaGFlbCBDbGFyayA8bWljaGFlbEBtZXRhcGFyYWRpZ20uY29tPgoJCjAuMQogICogaW5pdGlhbCByZWxlYXNlCg==