parse-server 9.9.0-alpha.2 → 9.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -0
- package/lib/Config.js +35 -2
- package/lib/Deprecator/Deprecations.js +5 -1
- package/lib/InstallationDedup.js +178 -0
- package/lib/Options/Definitions.js +26 -1
- package/lib/Options/docs.js +9 -1
- package/lib/Options/index.js +1 -1
- package/lib/RestWrite.js +36 -35
- package/package.json +1 -1
package/lib/Options/docs.js
CHANGED
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
* @property {String} graphQLSchema Full path to your GraphQL custom schema.graphql file
|
|
62
62
|
* @property {String} host The host to serve ParseServer on, defaults to 0.0.0.0
|
|
63
63
|
* @property {IdempotencyOptions} idempotencyOptions Options for request idempotency to deduplicate identical requests that may be caused by network issues. Caution, this is an experimental feature that may not be appropriate for production.
|
|
64
|
+
* @property {InstallationOptions} installation Options controlling how Parse Server deduplicates `_Installation` records that share the same `deviceToken`.
|
|
64
65
|
* @property {String} javascriptKey Key for the Javascript SDK
|
|
65
66
|
* @property {Boolean} jsonLogs Log as structured JSON objects
|
|
66
67
|
* @property {LiveQueryOptions} liveQuery parse-server's LiveQuery configuration object
|
|
@@ -148,6 +149,13 @@
|
|
|
148
149
|
* @property {Number} subqueryLimit Maximum number of results returned by a `$inQuery`, `$notInQuery`, `$select`, `$dontSelect` subquery. Set to `-1` to disable. Default is `-1`.
|
|
149
150
|
*/
|
|
150
151
|
|
|
152
|
+
/**
|
|
153
|
+
* @interface InstallationOptions
|
|
154
|
+
* @property {String} duplicateDeviceTokenAction What Parse Server does to the conflicting `_Installation` row(s) when a new install's `deviceToken` collides with an existing row. `'delete'` destroys the conflicting row. `'update'` clears the now-conflicting ID field on the conflicting row, preserving custom fields, channels, and history. Default is `'delete'`.
|
|
155
|
+
* @property {Boolean} duplicateDeviceTokenActionEnforceAuth Whether the `_Installation` deduplication operation enforces the caller's auth context (and the resulting ACL and CLP). When `true`, the dedup `destroy`/`update` runs with the caller's `runOptions`, so ACL and CLP are honored. When `false`, the dedup runs as master and bypasses both. Master and maintenance keys always bypass regardless of this flag. Default is `false`.
|
|
156
|
+
* @property {String} duplicateDeviceTokenMergePriority At the merge case (when an existing row holds the new `deviceToken` but has no `installationId` of its own), which side wins. `'deviceToken'` — the deviceToken-only row survives, the request's `idMatch` row is the loser. `'installationId'` — the request's `idMatch` (active install) survives, the deviceToken-only orphan is the loser. Default is `'deviceToken'`.
|
|
157
|
+
*/
|
|
158
|
+
|
|
151
159
|
/**
|
|
152
160
|
* @interface SecurityOptions
|
|
153
161
|
* @property {CheckGroup[]} checkGroups The security check groups to run. This allows to add custom security checks or override existing ones. Default are the groups defined in `CheckGroups.js`.
|
|
@@ -377,4 +385,4 @@
|
|
|
377
385
|
* @property {String} triggerBeforeSuccess Log level used by the Cloud Code Triggers `beforeSave`, `beforeDelete`, `beforeFind`, `beforeLogin` on success. Default is `info`. See [LogLevel](LogLevel.html) for available values.
|
|
378
386
|
*/
|
|
379
387
|
"use strict";
|
|
380
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL09wdGlvbnMvZG9jcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBpbnRlcmZhY2UgU2NoZW1hT3B0aW9uc1xuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gYWZ0ZXJNaWdyYXRpb24gRXhlY3V0ZSBhIGNhbGxiYWNrIGFmdGVyIHJ1bm5pbmcgc2NoZW1hIG1pZ3JhdGlvbnMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBiZWZvcmVNaWdyYXRpb24gRXhlY3V0ZSBhIGNhbGxiYWNrIGJlZm9yZSBydW5uaW5nIHNjaGVtYSBtaWdyYXRpb25zLlxuICogQHByb3BlcnR5IHtBbnl9IGRlZmluaXRpb25zIFJlc3QgcmVwcmVzZW50YXRpb24gb24gUGFyc2UuU2NoZW1hIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9yZXN0L2d1aWRlLyNhZGRpbmctYS1zY2hlbWFcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGVsZXRlRXh0cmFGaWVsZHMgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGRlbGV0ZSBhbnkgZmllbGRzIG5vdCBkZWZpbmVkIGluIGEgc2NoZW1hIGRlZmluaXRpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGtlZXBVbmtub3duSW5kZXhlcyAoT3B0aW9uYWwpIEtlZXAgaW5kZXhlcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBkYXRhYmFzZSBidXQgbm90IGRlZmluZWQgaW4gdGhlIHNjaGVtYS4gU2V0IHRoaXMgdG8gYHRydWVgIGlmIHlvdSBhcmUgYWRkaW5nIGluZGV4ZXMgbWFudWFsbHksIHNvIHRoYXQgdGhleSB3b24ndCBiZSByZW1vdmVkIHdoZW4gcnVubmluZyBzY2hlbWEgbWlncmF0aW9uLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGxvY2tTY2hlbWFzIElzIHRydWUgaWYgUGFyc2UgU2VydmVyIHdpbGwgcmVqZWN0IGFueSBhdHRlbXB0cyB0byBtb2RpZnkgdGhlIHNjaGVtYSB3aGlsZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJlY3JlYXRlTW9kaWZpZWRGaWVsZHMgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIHJlY3JlYXRlIGFueSBmaWVsZHMgdGhhdCBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIGN1cnJlbnQgZGF0YWJhc2Ugc2NoZW1hIGFuZCB0aGVzY2hlbWEgZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc3RyaWN0IElzIHRydWUgaWYgUGFyc2UgU2VydmVyIHNob3VsZCBleGl0IGlmIHNjaGVtYSB1cGRhdGUgZmFpbC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUGFyc2VTZXJ2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge0FjY291bnRMb2Nrb3V0T3B0aW9uc30gYWNjb3VudExvY2tvdXQgVGhlIGFjY291bnQgbG9ja291dCBwb2xpY3kgZm9yIGZhaWxlZCBsb2dpbiBhdHRlbXB0cy48YnI+PGJyPk5vdGU6IFNldHRpbmcgYSB1c2VyJ3MgQUNMIHRvIGFuIGVtcHR5IG9iamVjdCBge31gIHZpYSBtYXN0ZXIga2V5IGlzIGEgc2VwYXJhdGUgbWVjaGFuaXNtIHRoYXQgb25seSBwcmV2ZW50cyBuZXcgbG9naW5zOyBpdCBkb2VzIG5vdCBpbnZhbGlkYXRlIGV4aXN0aW5nIHNlc3Npb24gdG9rZW5zLiBUbyBpbW1lZGlhdGVseSByZXZva2UgYSB1c2VyJ3MgYWNjZXNzLCBkZXN0cm95IHRoZWlyIHNlc3Npb25zIHZpYSBtYXN0ZXIga2V5IGluIGFkZGl0aW9uIHRvIHNldHRpbmcgdGhlIEFDTC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIEVuYWJsZSAob3IgZGlzYWJsZSkgY2xpZW50IGNsYXNzIGNyZWF0aW9uLCBkZWZhdWx0cyB0byBmYWxzZVxuICogQHByb3BlcnR5IHtCb29sZWFufSBhbGxvd0N1c3RvbU9iamVjdElkIEVuYWJsZSAob3IgZGlzYWJsZSkgY3VzdG9tIG9iamVjdElkXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4gRGVwcmVjYXRlZC4gVGhpcyBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIEF1dGggcHJvdmlkZXJzIGFyZSBhbHdheXMgdmFsaWRhdGVkIG9uIGxvZ2luLiBPbiB1cGRhdGUsIGlmIHRoaXMgaXMgc2V0IHRvIGB0cnVlYCwgYXV0aCBwcm92aWRlcnMgYXJlIG9ubHkgcmUtdmFsaWRhdGVkIHdoZW4gdGhlIGF1dGggZGF0YSBoYXMgY2hhbmdlZC4gSWYgdGhpcyBpcyBzZXQgdG8gYGZhbHNlYCwgYXV0aCBwcm92aWRlcnMgYXJlIHJlLXZhbGlkYXRlZCBvbiBldmVyeSB1cGRhdGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBhbGxvd0hlYWRlcnMgQWRkIGhlYWRlcnMgdG8gQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1xuICogQHByb3BlcnR5IHtTdHJpbmd8U3RyaW5nW119IGFsbG93T3JpZ2luIFNldHMgb3JpZ2lucyBmb3IgQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luLiBUaGlzIGNhbiBiZSBhIHN0cmluZyBmb3IgYSBzaW5nbGUgb3JpZ2luIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MgZm9yIG11bHRpcGxlIG9yaWdpbnMuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8QW5hbHl0aWNzQWRhcHRlcj59IGFuYWx5dGljc0FkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBhbmFseXRpY3NcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhcHBJZCBZb3VyIFBhcnNlIEFwcGxpY2F0aW9uIElEXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXBwTmFtZSBTZXRzIHRoZSBhcHAgbmFtZVxuICogQHByb3BlcnR5IHtPYmplY3R9IGF1dGggQ29uZmlndXJhdGlvbiBmb3IgeW91ciBhdXRoZW50aWNhdGlvbiBwcm92aWRlcnMsIGFzIHN0cmluZ2lmaWVkIEpTT04uIFNlZSBodHRwOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9wYXJzZS1zZXJ2ZXIvZ3VpZGUvI29hdXRoLWFuZC0zcmQtcGFydHktYXV0aGVudGljYXRpb248YnI+PGJyPlByb3ZpZGVyIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY29udGFpbiBvbmx5IGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzIChgL15bQS1aYS16XVtBLVphLXowLTlfXSokL2ApLiBUaGlzIGlzIGJlY2F1c2UgZWFjaCBwcm92aWRlciBuYW1lIGlzIHVzZWQgdG8gY29uc3RydWN0IGEgZGF0YWJhc2UgZmllbGQgKGBfYXV0aF9kYXRhXzxwcm92aWRlcj5gKSwgd2hpY2ggbXVzdCBjb21wbHkgd2l0aCBQYXJzZSBTZXJ2ZXIncyBmaWVsZCBuYW1pbmcgcnVsZXMuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8Q2FjaGVBZGFwdGVyPn0gY2FjaGVBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgY2FjaGVcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjYWNoZU1heFNpemUgU2V0cyB0aGUgbWF4aW11bSBzaXplIGZvciB0aGUgaW4gbWVtb3J5IGNhY2hlLCBkZWZhdWx0cyB0byAxMDAwMFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGNhY2hlVFRMIFNldHMgdGhlIFRUTCBmb3IgdGhlIGluIG1lbW9yeSBjYWNoZSAoaW4gbXMpLCBkZWZhdWx0cyB0byA1MDAwICg1IHNlY29uZHMpXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY2xpZW50S2V5IEtleSBmb3IgaU9TLCBNYWNPUywgdHZPUyBjbGllbnRzXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY2xvdWQgRnVsbCBwYXRoIHRvIHlvdXIgY2xvdWQgY29kZSBtYWluLmpzXG4gKiBAcHJvcGVydHkge051bWJlcnxCb29sZWFufSBjbHVzdGVyIFJ1biB3aXRoIGNsdXN0ZXIsIG9wdGlvbmFsbHkgc2V0IHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGRlZmF1bHQgdG8gb3MuY3B1cygpLmxlbmd0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGNvbGxlY3Rpb25QcmVmaXggQSBjb2xsZWN0aW9uIHByZWZpeCBmb3IgdGhlIGNsYXNzZXNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29udmVydEVtYWlsVG9Mb3dlcmNhc2UgT3B0aW9uYWwuIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBgZW1haWxgIHByb3BlcnR5IG9mIGEgdXNlciBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIENvbnNlcXVlbnRseSwgcXVlcmllcyBtdXN0IG1hdGNoIHRoZSBjYXNlIGFzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UsIHdoaWNoIHdvdWxkIGJlIGxvd2VyY2FzZSBpbiB0aGlzIHNjZW5hcmlvLiBJZiBgZmFsc2VgLCB0aGUgYGVtYWlsYCBwcm9wZXJ0eSBpcyBzdG9yZWQgYXMgc2V0LCB3aXRob3V0IGFueSBjYXNlIG1vZGlmaWNhdGlvbnMuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29udmVydFVzZXJuYW1lVG9Mb3dlcmNhc2UgT3B0aW9uYWwuIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBgdXNlcm5hbWVgIHByb3BlcnR5IG9mIGEgdXNlciBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIENvbnNlcXVlbnRseSwgcXVlcmllcyBtdXN0IG1hdGNoIHRoZSBjYXNlIGFzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UsIHdoaWNoIHdvdWxkIGJlIGxvd2VyY2FzZSBpbiB0aGlzIHNjZW5hcmlvLiBJZiBgZmFsc2VgLCB0aGUgYHVzZXJuYW1lYCBwcm9wZXJ0eSBpcyBzdG9yZWQgYXMgc2V0LCB3aXRob3V0IGFueSBjYXNlIG1vZGlmaWNhdGlvbnMuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Q3VzdG9tUGFnZXNPcHRpb25zfSBjdXN0b21QYWdlcyBjdXN0b20gcGFnZXMgZm9yIHBhc3N3b3JkIHZhbGlkYXRpb24gYW5kIHJlc2V0XG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8U3RvcmFnZUFkYXB0ZXI+fSBkYXRhYmFzZUFkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBkYXRhYmFzZTsgYW55IG9wdGlvbnMgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgZGVzY3JpYmVkIGhlcmUgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgZGF0YWJhc2UgY2xpZW50LlxuICogQHByb3BlcnR5IHtEYXRhYmFzZU9wdGlvbnN9IGRhdGFiYXNlT3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGRhdGFiYXNlIGNsaWVudFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRhdGFiYXNlVVJJIFRoZSBmdWxsIFVSSSB0byB5b3VyIGRhdGFiYXNlLiBTdXBwb3J0ZWQgZGF0YWJhc2VzIGFyZSBtb25nb2RiIG9yIHBvc3RncmVzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGRlZmF1bHRMaW1pdCBEZWZhdWx0IHZhbHVlIGZvciBsaW1pdCBvcHRpb24gb24gcXVlcmllcywgZGVmYXVsdHMgdG8gYDEwMGAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRpcmVjdEFjY2VzcyBTZXQgdG8gYHRydWVgIGlmIFBhcnNlIHJlcXVlc3RzIHdpdGhpbiB0aGUgc2FtZSBOb2RlLmpzIGVudmlyb25tZW50IGFzIFBhcnNlIFNlcnZlciBzaG91bGQgYmUgcm91dGVkIHRvIFBhcnNlIFNlcnZlciBkaXJlY3RseSBpbnN0ZWFkIG9mIHZpYSB0aGUgSFRUUCBpbnRlcmZhY2UuIERlZmF1bHQgaXMgYGZhbHNlYC48YnI+PGJyPklmIHNldCB0byBgZmFsc2VgIHRoZW4gUGFyc2UgcmVxdWVzdHMgd2l0aGluIHRoZSBzYW1lIE5vZGUuanMgZW52aXJvbm1lbnQgYXMgUGFyc2UgU2VydmVyIGFyZSBleGVjdXRlZCBhcyBIVFRQIHJlcXVlc3RzIHNlbnQgdG8gUGFyc2UgU2VydmVyIHZpYSB0aGUgYHNlcnZlclVSTGAuIEZvciBleGFtcGxlLCBhIGBQYXJzZS5RdWVyeWAgaW4gQ2xvdWQgQ29kZSBpcyBjYWxsaW5nIFBhcnNlIFNlcnZlciB2aWEgYSBIVFRQIHJlcXVlc3QuIFRoZSBzZXJ2ZXIgaXMgZXNzZW50aWFsbHkgbWFraW5nIGEgSFRUUCByZXF1ZXN0IHRvIGl0c2VsZiwgdW5uZWNlc3NhcmlseSB1c2luZyBuZXR3b3JrIHJlc291cmNlcyBzdWNoIGFzIG5ldHdvcmsgcG9ydHMuPGJyPjxicj7imqDvuI8gSW4gZW52aXJvbm1lbnRzIHdoZXJlIG11bHRpcGxlIFBhcnNlIFNlcnZlciBpbnN0YW5jZXMgcnVuIGJlaGluZCBhIGxvYWQgYmFsYW5jZXIgYW5kIFBhcnNlIHJlcXVlc3RzIHdpdGhpbiB0aGUgY3VycmVudCBOb2RlLmpzIGVudmlyb25tZW50IHNob3VsZCBiZSByb3V0ZWQgdmlhIHRoZSBsb2FkIGJhbGFuY2VyIGFuZCBkaXN0cmlidXRlZCBhcyBIVFRQIHJlcXVlc3RzIGFtb25nIGFsbCBpbnN0YW5jZXMgdmlhIHRoZSBgc2VydmVyVVJMYCwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZG90TmV0S2V5IEtleSBmb3IgVW5pdHkgYW5kIC5OZXQgU0RLXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8TWFpbEFkYXB0ZXI+fSBlbWFpbEFkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIGVtYWlsIHNlbmRpbmdcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW1haWxWZXJpZnlTdWNjZXNzT25JbnZhbGlkRW1haWwgU2V0IHRvIGB0cnVlYCBpZiBhIHJlcXVlc3QgdG8gdmVyaWZ5IHRoZSBlbWFpbCBzaG91bGQgcmV0dXJuIGEgc3VjY2VzcyByZXNwb25zZSBldmVuIGlmIHRoZSBwcm92aWRlZCBlbWFpbCBhZGRyZXNzIGRvZXMgbm90IGJlbG9uZyB0byBhIHZlcmlmaWFibGUgYWNjb3VudCwgZm9yIGV4YW1wbGUgYmVjYXVzZSBpdCBpcyB1bmtub3duIG9yIGFscmVhZHkgdmVyaWZpZWQsIG9yIGBmYWxzZWAgaWYgdGhlIHJlcXVlc3Qgc2hvdWxkIHJldHVybiBhbiBlcnJvciByZXNwb25zZSBpbiB0aG9zZSBjYXNlcy48YnI+PGJyPkRlZmF1bHQgaXMgYHRydWVgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkIFNldCB0byBgdHJ1ZWAgaWYgYSBlbWFpbCB2ZXJpZmljYXRpb24gdG9rZW4gc2hvdWxkIGJlIHJldXNlZCBpbiBjYXNlIGFub3RoZXIgdG9rZW4gaXMgcmVxdWVzdGVkIGJ1dCB0aGVyZSBpcyBhIHRva2VuIHRoYXQgaXMgc3RpbGwgdmFsaWQsIGkuZS4gaGFzIG5vdCBleHBpcmVkLiBUaGlzIGF2b2lkcyB0aGUgb2Z0ZW4gb2JzZXJ2ZWQgaXNzdWUgdGhhdCBhIHVzZXIgcmVxdWVzdHMgbXVsdGlwbGUgZW1haWxzIGFuZCBkb2VzIG5vdCBrbm93IHdoaWNoIGxpbmsgY29udGFpbnMgYSB2YWxpZCB0b2tlbiBiZWNhdXNlIGVhY2ggbmV3bHkgZ2VuZXJhdGVkIHRva2VuIHdvdWxkIGludmFsaWRhdGUgdGhlIHByZXZpb3VzIHRva2VuLjxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uIFNldCB0aGUgdmFsaWRpdHkgZHVyYXRpb24gb2YgdGhlIGVtYWlsIHZlcmlmaWNhdGlvbiB0b2tlbiBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSB0b2tlbiBleHBpcmVzLiBUaGUgdG9rZW4gaXMgdXNlZCBpbiB0aGUgbGluayB0aGF0IGlzIHNldCBpbiB0aGUgZW1haWwuIEFmdGVyIHRoZSB0b2tlbiBleHBpcmVzLCB0aGUgbGluayBiZWNvbWVzIGludmFsaWQgYW5kIGEgbmV3IGxpbmsgaGFzIHRvIGJlIHNlbnQuIElmIHRoZSBvcHRpb24gaXMgbm90IHNldCBvciBzZXQgdG8gYHVuZGVmaW5lZGAsIHRoZW4gdGhlIHRva2VuIG5ldmVyIGV4cGlyZXMuPGJyPjxicj5Gb3IgZXhhbXBsZSwgdG8gZXhwaXJlIHRoZSB0b2tlbiBhZnRlciAyIGhvdXJzLCBzZXQgYSB2YWx1ZSBvZiA3MjAwIHNlY29uZHMgKD0gNjAgc2Vjb25kcyAqIDYwIG1pbnV0ZXMgKiAyIGhvdXJzKS48YnI+PGJyPkRlZmF1bHQgaXMgYHVuZGVmaW5lZGAuPGJyPlJlcXVpcmVzIG9wdGlvbiBgdmVyaWZ5VXNlckVtYWlsczogdHJ1ZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUFub255bW91c1VzZXJzIEVuYWJsZSAob3IgZGlzYWJsZSkgYW5vbnltb3VzIHVzZXJzLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUNvbGxhdGlvbkNhc2VDb21wYXJpc29uIE9wdGlvbmFsLiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgY29sbGF0aW9uIHJ1bGUgb2YgY2FzZSBjb21wYXJpc29uIGZvciBxdWVyaWVzIGFuZCBpbmRleGVzIGlzIGVuYWJsZWQuIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBydW4gUGFyc2UgU2VydmVyIHdpdGggTW9uZ29EQiBBdGxhcyBTZXJ2ZXJsZXNzIG9yIEFXUyBBbWF6b24gRG9jdW1lbnREQi4gSWYgYGZhbHNlYCwgdGhlIGNvbGxhdGlvbiBydWxlIG9mIGNhc2UgY29tcGFyaXNvbiBpcyBkaXNhYmxlZC4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVFeHByZXNzRXJyb3JIYW5kbGVyIEVuYWJsZXMgdGhlIGRlZmF1bHQgZXhwcmVzcyBlcnJvciBoYW5kbGVyIGZvciBhbGwgZXJyb3JzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUluc2VjdXJlQXV0aEFkYXB0ZXJzIE9wdGlvbmFsLiBFbmFibGVzIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uIGFkYXB0ZXJzLiBJbnNlY3VyZSBhdXRoIGFkYXB0ZXJzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlUHJvZHVjdFB1cmNoYXNlTGVnYWN5QXBpIERlcHJlY2F0ZWQuIEVuYWJsZXMgdGhlIGxlZ2FjeSBwcm9kdWN0IHB1cmNoYXNlIEFQSSBpbmNsdWRpbmcgdGhlIGBfUHJvZHVjdGAgY2xhc3MgYW5kIHRoZSBgL3ZhbGlkYXRlX3B1cmNoYXNlYCBlbmRwb2ludC4gVGhpcyBpcyBhbiB1bmRvY3VtZW50ZWQsIHVubWFpbnRhaW5lZCBsZWdhY3kgZmVhdHVyZSBpbmhlcml0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgUGFyc2UgcGxhdGZvcm0gdGhhdCBtYXkgbm90IGZ1bmN0aW9uIGFzIGV4cGVjdGVkLiBXZSBzdHJvbmdseSBhZHZpc2UgYWdhaW5zdCB1c2luZyBpdC4gSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZVNhbml0aXplZEVycm9yUmVzcG9uc2UgSWYgc2V0IHRvIGB0cnVlYCwgZXJyb3IgZGV0YWlscyBhcmUgcmVtb3ZlZCBmcm9tIGVycm9yIG1lc3NhZ2VzIGluIHJlc3BvbnNlcyB0byBjbGllbnQgcmVxdWVzdHMsIGFuZCBpbnN0ZWFkIGEgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIGlzIHNlbnQuIERlZmF1bHQgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVuY3J5cHRpb25LZXkgS2V5IGZvciBlbmNyeXB0aW5nIHlvdXIgZmlsZXNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5mb3JjZVByaXZhdGVVc2VycyBTZXQgdG8gdHJ1ZSBpZiBuZXcgdXNlcnMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aG91dCBwdWJsaWMgcmVhZCBhbmQgd3JpdGUgYWNjZXNzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBleHBpcmVJbmFjdGl2ZVNlc3Npb25zIFNldHMgd2hldGhlciB3ZSBzaG91bGQgZXhwaXJlIHRoZSBpbmFjdGl2ZSBzZXNzaW9ucywgZGVmYXVsdHMgdG8gdHJ1ZS4gSWYgZmFsc2UsIGFsbCBuZXcgc2Vzc2lvbnMgYXJlIGNyZWF0ZWQgd2l0aCBubyBleHBpcmF0aW9uIGRhdGUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGV4dGVuZFNlc3Npb25PblVzZSBXaGV0aGVyIFBhcnNlIFNlcnZlciBzaG91bGQgYXV0b21hdGljYWxseSBleHRlbmQgYSB2YWxpZCBzZXNzaW9uIGJ5IHRoZSBzZXNzaW9uTGVuZ3RoLiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzZXNzaW9uIHVwZGF0ZXMgaW4gdGhlIGRhdGFiYXNlLCBhIHNlc3Npb24gd2lsbCBvbmx5IGJlIGV4dGVuZGVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkIGFmdGVyIGF0IGxlYXN0IGhhbGYgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIGxpZmV0aW1lIGhhcyBwYXNzZWQuXG4gKiBAcHJvcGVydHkge0ZpbGVEb3dubG9hZE9wdGlvbnN9IGZpbGVEb3dubG9hZCBPcHRpb25zIGZvciBmaWxlIGRvd25sb2Fkc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGZpbGVLZXkgS2V5IGZvciB5b3VyIGZpbGVzXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8RmlsZXNBZGFwdGVyPn0gZmlsZXNBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgZmlsZXMgc3ViLXN5c3RlbVxuICogQHByb3BlcnR5IHtGaWxlVXBsb2FkT3B0aW9uc30gZmlsZVVwbG9hZCBPcHRpb25zIGZvciBmaWxlIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBncmFwaFFMUGF0aCBUaGUgbW91bnQgcGF0aCBmb3IgdGhlIEdyYXBoUUwgZW5kcG9pbnQ8YnI+PGJyPuKaoO+4jyBGaWxlIHVwbG9hZCBpbnNpZGUgdGhlIEdyYXBoUUwgbXV0YXRpb24gc3lzdGVtIHJlcXVpcmVzIFBhcnNlIFNlcnZlciB0byBiZSBhYmxlIHRvIGNhbGwgaXRzZWxmIGJ5IG1ha2luZyByZXF1ZXN0cyB0byB0aGUgVVJMIHNldCBpbiBgc2VydmVyVVJMYC48YnI+PGJyPkRlZmF1bHRzIGlzIGAvZ3JhcGhxbGAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGdyYXBoUUxQdWJsaWNJbnRyb3NwZWN0aW9uIEVuYWJsZSBwdWJsaWMgaW50cm9zcGVjdGlvbiBmb3IgdGhlIEdyYXBoUUwgZW5kcG9pbnQsIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZ3JhcGhRTFNjaGVtYSBGdWxsIHBhdGggdG8geW91ciBHcmFwaFFMIGN1c3RvbSBzY2hlbWEuZ3JhcGhxbCBmaWxlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gaG9zdCBUaGUgaG9zdCB0byBzZXJ2ZSBQYXJzZVNlcnZlciBvbiwgZGVmYXVsdHMgdG8gMC4wLjAuMFxuICogQHByb3BlcnR5IHtJZGVtcG90ZW5jeU9wdGlvbnN9IGlkZW1wb3RlbmN5T3B0aW9ucyBPcHRpb25zIGZvciByZXF1ZXN0IGlkZW1wb3RlbmN5IHRvIGRlZHVwbGljYXRlIGlkZW50aWNhbCByZXF1ZXN0cyB0aGF0IG1heSBiZSBjYXVzZWQgYnkgbmV0d29yayBpc3N1ZXMuIENhdXRpb24sIHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtYXkgbm90IGJlIGFwcHJvcHJpYXRlIGZvciBwcm9kdWN0aW9uLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGphdmFzY3JpcHRLZXkgS2V5IGZvciB0aGUgSmF2YXNjcmlwdCBTREtcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0ganNvbkxvZ3MgTG9nIGFzIHN0cnVjdHVyZWQgSlNPTiBvYmplY3RzXG4gKiBAcHJvcGVydHkge0xpdmVRdWVyeU9wdGlvbnN9IGxpdmVRdWVyeSBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7TGl2ZVF1ZXJ5U2VydmVyT3B0aW9uc30gbGl2ZVF1ZXJ5U2VydmVyT3B0aW9ucyBMaXZlIHF1ZXJ5IHNlcnZlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgKHdpbGwgc3RhcnQgdGhlIGxpdmVRdWVyeSBzZXJ2ZXIpXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8TG9nZ2VyQWRhcHRlcj59IGxvZ2dlckFkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBsb2dnaW5nIHN1Yi1zeXN0ZW1cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2dMZXZlbCBTZXRzIHRoZSBsZXZlbCBmb3IgbG9nc1xuICogQHByb3BlcnR5IHtMb2dMZXZlbHN9IGxvZ0xldmVscyAoT3B0aW9uYWwpIE92ZXJyaWRlcyB0aGUgbG9nIGxldmVscyB1c2VkIGludGVybmFsbHkgYnkgUGFyc2UgU2VydmVyIHRvIGxvZyBldmVudHMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbG9nc0ZvbGRlciBGb2xkZXIgZm9yIHRoZSBsb2dzIChkZWZhdWx0cyB0byAnLi9sb2dzJyk7IHNldCB0byBudWxsIHRvIGRpc2FibGUgZmlsZSBiYXNlZCBsb2dnaW5nXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWFpbnRlbmFuY2VLZXkgKE9wdGlvbmFsKSBUaGUgbWFpbnRlbmFuY2Uga2V5IGlzIHVzZWQgZm9yIG1vZGlmeWluZyBpbnRlcm5hbCBhbmQgcmVhZC1vbmx5IGZpZWxkcyBvZiBQYXJzZSBTZXJ2ZXIuPGJyPjxicj7imqDvuI8gVGhpcyBrZXkgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBhIHJlZ3VsYXIgb3BlcmF0aW9uIG9mIFBhcnNlIFNlcnZlci4gVGhpcyBrZXkgaXMgaW50ZW5kZWQgdG8gY29uZHVjdCBvdXQtb2YtYmFuZCBjaGFuZ2VzIHN1Y2ggYXMgb25lLXRpbWUgbWlncmF0aW9ucyBvciBkYXRhIGNvcnJlY3Rpb24gdGFza3MuIEludGVybmFsIGZpZWxkcyBhcmUgbm90IG9mZmljaWFsbHkgZG9jdW1lbnRlZCBhbmQgbWF5IGNoYW5nZSBhdCBhbnkgdGltZSB3aXRob3V0IHB1YmxpY2F0aW9uIGluIHJlbGVhc2UgY2hhbmdlbG9ncy4gV2Ugc3Ryb25nbHkgYWR2aWNlIG5vdCB0byByZWx5IG9uIGludGVybmFsIGZpZWxkcyBhcyBwYXJ0IG9mIHlvdXIgcmVndWxhciBvcGVyYXRpb24gYW5kIHRvIGludmVzdGlnYXRlIHRoZSBpbXBsaWNhdGlvbnMgb2YgYW55IHBsYW5uZWQgY2hhbmdlcyAqZGlyZWN0bHkgaW4gdGhlIHNvdXJjZSBjb2RlKiBvZiB5b3VyIGN1cnJlbnQgdmVyc2lvbiBvZiBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBtYWludGVuYW5jZUtleUlwcyAoT3B0aW9uYWwpIFJlc3RyaWN0cyB0aGUgdXNlIG9mIG1haW50ZW5hbmNlIGtleSBwZXJtaXNzaW9ucyB0byBhIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIG9yIHJhbmdlcy48YnI+PGJyPlRoaXMgb3B0aW9uIGFjY2VwdHMgYSBsaXN0IG9mIHNpbmdsZSBJUCBhZGRyZXNzZXMsIGZvciBleGFtcGxlIGBbJzEwLjAuMC4xJywgJzEwLjAuMC4yJ11gLiBZb3UgY2FuIGFsc28gdXNlIENJRFIgbm90YXRpb24gdG8gc3BlY2lmeSBhbiBJUCBhZGRyZXNzIHJhbmdlLCBmb3IgZXhhbXBsZSBgWycxMC4wLjEuMC8yNCddYC48YnI+PGJyPjxiPlNwZWNpYWwgc2NlbmFyaW9zOjwvYj48YnI+LSBTZXR0aW5nIGFuIGVtcHR5IGFycmF5IGBbXWAgbWVhbnMgdGhhdCB0aGUgbWFpbnRlbmFuY2Uga2V5IGNhbm5vdCBiZSB1c2VkIGV2ZW4gaW4gUGFyc2UgU2VydmVyIENsb3VkIENvZGUuIFRoaXMgdmFsdWUgY2Fubm90IGJlIHNldCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHBhc3MgYW4gZW1wdHkgYXJyYXkgdG8gUGFyc2UgU2VydmVyIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS48YnI+LSBTZXR0aW5nIGBbJzAuMC4wLjAvMCcsICc6OjAnXWAgbWVhbnMgdG8gYWxsb3cgYW55IElQdjQgYW5kIElQdjYgYWRkcmVzcyB0byB1c2UgdGhlIG1haW50ZW5hbmNlIGtleSBhbmQgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIElQIGZpbHRlci48YnI+PGJyPjxiPkNvbnNpZGVyYXRpb25zOjwvYj48YnI+LSBJUHY0IGFuZCBJUHY2IGFkZHJlc3NlcyBhcmUgbm90IGNvbXBhcmVkIGFnYWluc3QgZWFjaCBvdGhlci4gRWFjaCBJUCB2ZXJzaW9uIChJUHY0IGFuZCBJUHY2KSBuZWVkcyB0byBiZSBjb25zaWRlcmVkIHNlcGFyYXRlbHkuIEZvciBleGFtcGxlLCBgWycwLjAuMC4wLzAnXWAgYWxsb3dzIGFueSBJUHY0IGFkZHJlc3MgYW5kIGJsb2NrcyBldmVyeSBJUHY2IGFkZHJlc3MuIENvbnZlcnNlbHksIGBbJzo6MCddYCBhbGxvd3MgYW55IElQdjYgYWRkcmVzcyBhbmQgYmxvY2tzIGV2ZXJ5IElQdjQgYWRkcmVzcy48YnI+LSBLZWVwIGluIG1pbmQgdGhhdCB0aGUgSVAgdmVyc2lvbiBpbiB1c2UgZGVwZW5kcyBvbiB0aGUgbmV0d29yayBzdGFjayBvZiB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggUGFyc2UgU2VydmVyIHJ1bnMuIEEgbG9jYWwgZW52aXJvbm1lbnQgbWF5IHVzZSBhIGRpZmZlcmVudCBJUCB2ZXJzaW9uIHRoYW4gYSByZW1vdGUgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBpdCdzIHBvc3NpYmxlIHRoYXQgbG9jYWxseSB0aGUgdmFsdWUgYFsnMC4wLjAuMC8wJ11gIGFsbG93cyB0aGUgcmVxdWVzdCBJUCBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBpcyB1c2luZyBJUHY0LCBidXQgd2hlbiBQYXJzZSBTZXJ2ZXIgaXMgZGVwbG95ZWQgcmVtb3RlbHkgdGhlIHJlcXVlc3QgSVAgaXMgYmxvY2tlZCBiZWNhdXNlIHRoZSByZW1vdGUgZW52aXJvbm1lbnQgaXMgdXNpbmcgSVB2Ni48YnI+LSBXaGVuIHNldHRpbmcgdGhlIG9wdGlvbiB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdGhlIG5vdGF0aW9uIGlzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZywgZm9yIGV4YW1wbGUgYFwiMC4wLjAuMC8wLDo6MFwiYC48YnI+LSBJUHY2IHpvbmUgaW5kaWNlcyAoYCVgIHN1ZmZpeCkgYXJlIG5vdCBzdXBwb3J0ZWQsIGZvciBleGFtcGxlIGBmZTgwOjoxJWV0aDBgLCBgZmU4MDo6MSUxYCBvciBgOjoxJWxvYC48YnI+PGJyPkRlZmF1bHRzIHRvIGBbJzEyNy4wLjAuMScsICc6OjEnXWAgd2hpY2ggbWVhbnMgdGhhdCBvbmx5IGBsb2NhbGhvc3RgLCB0aGUgc2VydmVyIGluc3RhbmNlIG9uIHdoaWNoIFBhcnNlIFNlcnZlciBydW5zLCBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgbWFpbnRlbmFuY2Uga2V5LlxuICogQHByb3BlcnR5IHtVbmlvbn0gbWFzdGVyS2V5IFlvdXIgUGFyc2UgTWFzdGVyIEtleVxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gbWFzdGVyS2V5SXBzIChPcHRpb25hbCkgUmVzdHJpY3RzIHRoZSB1c2Ugb2YgbWFzdGVyIGtleSBwZXJtaXNzaW9ucyB0byBhIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIG9yIHJhbmdlcy48YnI+PGJyPlRoaXMgb3B0aW9uIGFjY2VwdHMgYSBsaXN0IG9mIHNpbmdsZSBJUCBhZGRyZXNzZXMsIGZvciBleGFtcGxlIGBbJzEwLjAuMC4xJywgJzEwLjAuMC4yJ11gLiBZb3UgY2FuIGFsc28gdXNlIENJRFIgbm90YXRpb24gdG8gc3BlY2lmeSBhbiBJUCBhZGRyZXNzIHJhbmdlLCBmb3IgZXhhbXBsZSBgWycxMC4wLjEuMC8yNCddYC48YnI+PGJyPjxiPlNwZWNpYWwgc2NlbmFyaW9zOjwvYj48YnI+LSBTZXR0aW5nIGFuIGVtcHR5IGFycmF5IGBbXWAgbWVhbnMgdGhhdCB0aGUgbWFzdGVyIGtleSBjYW5ub3QgYmUgdXNlZCBldmVuIGluIFBhcnNlIFNlcnZlciBDbG91ZCBDb2RlLiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBzZXQgdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHRoZXJlIGlzIG5vIHdheSB0byBwYXNzIGFuIGVtcHR5IGFycmF5IHRvIFBhcnNlIFNlcnZlciB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuPGJyPi0gU2V0dGluZyBgWycwLjAuMC4wLzAnLCAnOjowJ11gIG1lYW5zIHRvIGFsbG93IGFueSBJUHY0IGFuZCBJUHY2IGFkZHJlc3MgdG8gdXNlIHRoZSBtYXN0ZXIga2V5IGFuZCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgSVAgZmlsdGVyLjxicj48YnI+PGI+Q29uc2lkZXJhdGlvbnM6PC9iPjxicj4tIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzIGFyZSBub3QgY29tcGFyZWQgYWdhaW5zdCBlYWNoIG90aGVyLiBFYWNoIElQIHZlcnNpb24gKElQdjQgYW5kIElQdjYpIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQgc2VwYXJhdGVseS4gRm9yIGV4YW1wbGUsIGBbJzAuMC4wLjAvMCddYCBhbGxvd3MgYW55IElQdjQgYWRkcmVzcyBhbmQgYmxvY2tzIGV2ZXJ5IElQdjYgYWRkcmVzcy4gQ29udmVyc2VseSwgYFsnOjowJ11gIGFsbG93cyBhbnkgSVB2NiBhZGRyZXNzIGFuZCBibG9ja3MgZXZlcnkgSVB2NCBhZGRyZXNzLjxicj4tIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBJUCB2ZXJzaW9uIGluIHVzZSBkZXBlbmRzIG9uIHRoZSBuZXR3b3JrIHN0YWNrIG9mIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCBQYXJzZSBTZXJ2ZXIgcnVucy4gQSBsb2NhbCBlbnZpcm9ubWVudCBtYXkgdXNlIGEgZGlmZmVyZW50IElQIHZlcnNpb24gdGhhbiBhIHJlbW90ZSBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIGl0J3MgcG9zc2libGUgdGhhdCBsb2NhbGx5IHRoZSB2YWx1ZSBgWycwLjAuMC4wLzAnXWAgYWxsb3dzIHRoZSByZXF1ZXN0IElQIGJlY2F1c2UgdGhlIGVudmlyb25tZW50IGlzIHVzaW5nIElQdjQsIGJ1dCB3aGVuIFBhcnNlIFNlcnZlciBpcyBkZXBsb3llZCByZW1vdGVseSB0aGUgcmVxdWVzdCBJUCBpcyBibG9ja2VkIGJlY2F1c2UgdGhlIHJlbW90ZSBlbnZpcm9ubWVudCBpcyB1c2luZyBJUHY2Ljxicj4tIFdoZW4gc2V0dGluZyB0aGUgb3B0aW9uIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGUgbm90YXRpb24gaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLCBmb3IgZXhhbXBsZSBgXCIwLjAuMC4wLzAsOjowXCJgLjxicj4tIElQdjYgem9uZSBpbmRpY2VzIChgJWAgc3VmZml4KSBhcmUgbm90IHN1cHBvcnRlZCwgZm9yIGV4YW1wbGUgYGZlODA6OjElZXRoMGAsIGBmZTgwOjoxJTFgIG9yIGA6OjElbG9gLjxicj48YnI+RGVmYXVsdHMgdG8gYFsnMTI3LjAuMC4xJywgJzo6MSddYCB3aGljaCBtZWFucyB0aGF0IG9ubHkgYGxvY2FsaG9zdGAsIHRoZSBzZXJ2ZXIgaW5zdGFuY2Ugb24gd2hpY2ggUGFyc2UgU2VydmVyIHJ1bnMsIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBtYXN0ZXIga2V5LlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1hc3RlcktleVR0bCAoT3B0aW9uYWwpIFRoZSBkdXJhdGlvbiBpbiBzZWNvbmRzIGZvciB3aGljaCB0aGUgY3VycmVudCBgbWFzdGVyS2V5YCBpcyBiZWluZyB1c2VkIGJlZm9yZSBpdCBpcyByZXF1ZXN0ZWQgYWdhaW4gaWYgYG1hc3RlcktleWAgaXMgc2V0IHRvIGEgZnVuY3Rpb24uIElmIGBtYXN0ZXJLZXlgIGlzIG5vdCBzZXQgdG8gYSBmdW5jdGlvbiwgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdC4gRGVmYXVsdCBpcyBgMGAsIHdoaWNoIG1lYW5zIHRoZSBtYXN0ZXIga2V5IGlzIHJlcXVlc3RlZCBieSBpbnZva2luZyB0aGUgIGBtYXN0ZXJLZXlgIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUgdGhlIG1hc3RlciBrZXkgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhMaW1pdCBNYXggdmFsdWUgZm9yIGxpbWl0IG9wdGlvbiBvbiBxdWVyaWVzLCBkZWZhdWx0cyB0byB1bmxpbWl0ZWRcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfFN0cmluZ30gbWF4TG9nRmlsZXMgTWF4aW11bSBudW1iZXIgb2YgbG9ncyB0byBrZWVwLiBJZiBub3Qgc2V0LCBubyBsb2dzIHdpbGwgYmUgcmVtb3ZlZC4gVGhpcyBjYW4gYmUgYSBudW1iZXIgb2YgZmlsZXMgb3IgbnVtYmVyIG9mIGRheXMuIElmIHVzaW5nIGRheXMsIGFkZCAnZCcgYXMgdGhlIHN1ZmZpeC4gKGRlZmF1bHQ6IG51bGwpXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWF4VXBsb2FkU2l6ZSBNYXggZmlsZSBzaXplIGZvciB1cGxvYWRzLCBkZWZhdWx0cyB0byAyMG1iXG4gKiBAcHJvcGVydHkge1VuaW9ufSBtaWRkbGV3YXJlIG1pZGRsZXdhcmUgZm9yIGV4cHJlc3Mgc2VydmVyLCBjYW4gYmUgc3RyaW5nIG9yIGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IG1vdW50R3JhcGhRTCBNb3VudHMgdGhlIEdyYXBoUUwgZW5kcG9pbnRcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtb3VudFBhdGggTW91bnQgcGF0aCBmb3IgdGhlIHNlcnZlciwgZGVmYXVsdHMgdG8gL3BhcnNlXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IG1vdW50UGxheWdyb3VuZCBEZXByZWNhdGVkLiBNb3VudHMgdGhlIEdyYXBoUUwgUGxheWdyb3VuZCB3aGljaCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gVGhlIHBsYXlncm91bmQgZXhwb3NlcyB0aGUgbWFzdGVyIGtleSBpbiB0aGUgYnJvd3Nlci4gVXNlIFBhcnNlIERhc2hib2FyZCBhcyBHcmFwaFFMIElERSBvciBjb25maWd1cmUgYSB0aGlyZC1wYXJ0eSBHcmFwaFFMIGNsaWVudCB3aXRoIGN1c3RvbSByZXF1ZXN0IGhlYWRlcnMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gb2JqZWN0SWRTaXplIFNldHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGdlbmVyYXRlZCBvYmplY3QgaWQncywgZGVmYXVsdCAxMFxuICogQHByb3BlcnR5IHtQYWdlc09wdGlvbnN9IHBhZ2VzIFRoZSBvcHRpb25zIGZvciBwYWdlcyBzdWNoIGFzIHBhc3N3b3JkIHJlc2V0IGFuZCBlbWFpbCB2ZXJpZmljYXRpb24uXG4gKiBAcHJvcGVydHkge1Bhc3N3b3JkUG9saWN5T3B0aW9uc30gcGFzc3dvcmRQb2xpY3kgVGhlIHBhc3N3b3JkIHBvbGljeSBmb3IgZW5mb3JjaW5nIHBhc3N3b3JkIHJlbGF0ZWQgcnVsZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGxheWdyb3VuZFBhdGggRGVwcmVjYXRlZC4gTW91bnQgcGF0aCBmb3IgdGhlIEdyYXBoUUwgUGxheWdyb3VuZC4gVGhlIHBsYXlncm91bmQgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge051bWJlcn0gcG9ydCBUaGUgcG9ydCB0byBydW4gdGhlIFBhcnNlU2VydmVyLCBkZWZhdWx0cyB0byAxMzM3LlxuICogQHByb3BlcnR5IHtCb29sZWFufSBwcmVzZXJ2ZUZpbGVOYW1lIEVuYWJsZSAob3IgZGlzYWJsZSkgdGhlIGFkZGl0aW9uIG9mIGEgdW5pcXVlIGhhc2ggdG8gdGhlIGZpbGUgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCBTZXQgdG8gYHRydWVgIHRvIHByZXZlbnQgYSB1c2VyIGZyb20gbG9nZ2luZyBpbiBpZiB0aGUgZW1haWwgaGFzIG5vdCB5ZXQgYmVlbiB2ZXJpZmllZCBhbmQgZW1haWwgdmVyaWZpY2F0aW9uIGlzIHJlcXVpcmVkLiBTdXBwb3J0cyBhIGZ1bmN0aW9uIHdpdGggYSByZXR1cm4gdmFsdWUgb2YgYHRydWVgIG9yIGBmYWxzZWAgZm9yIGNvbmRpdGlvbmFsIHByZXZlbnRpb24uIFRoZSBmdW5jdGlvbiByZWNlaXZlcyBhIHJlcXVlc3Qgb2JqZWN0IHRoYXQgaW5jbHVkZXMgYGNyZWF0ZWRXaXRoYCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbnZvY2F0aW9uIGlzIGZvciBgc2lnbnVwYCBvciBgbG9naW5gIGFuZCB0aGUgdXNlZCBhdXRoIHByb3ZpZGVyLjxicj48YnI+VGhlIGBjcmVhdGVkV2l0aGAgdmFsdWVzIHBlciBzY2VuYXJpbzo8dWw+PGxpPlBhc3N3b3JkIHNpZ251cDogYHsgYWN0aW9uOiAnc2lnbnVwJywgYXV0aFByb3ZpZGVyOiAncGFzc3dvcmQnIH1gPC9saT48bGk+QXV0aCBwcm92aWRlciBzaWdudXA6IGB7IGFjdGlvbjogJ3NpZ251cCcsIGF1dGhQcm92aWRlcjogJzxwcm92aWRlcj4nIH1gPC9saT48bGk+UGFzc3dvcmQgbG9naW46IGB7IGFjdGlvbjogJ2xvZ2luJywgYXV0aFByb3ZpZGVyOiAncGFzc3dvcmQnIH1gPC9saT48bGk+QXV0aCBwcm92aWRlciBsb2dpbjogZnVuY3Rpb24gbm90IGludm9rZWQ7IGF1dGggcHJvdmlkZXIgbG9naW4gYnlwYXNzZXMgZW1haWwgdmVyaWZpY2F0aW9uPC9saT48L3VsPkRlZmF1bHQgaXMgYGZhbHNlYC48YnI+UmVxdWlyZXMgb3B0aW9uIGB2ZXJpZnlVc2VyRW1haWxzOiB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJldmVudFNpZ251cFdpdGhVbnZlcmlmaWVkRW1haWwgSWYgc2V0IHRvIGB0cnVlYCBpdCBwcmV2ZW50cyBhIHVzZXIgZnJvbSBzaWduaW5nIHVwIGlmIHRoZSBlbWFpbCBoYXMgbm90IHlldCBiZWVuIHZlcmlmaWVkIGFuZCBlbWFpbCB2ZXJpZmljYXRpb24gaXMgcmVxdWlyZWQuIEluIHRoYXQgY2FzZSB0aGUgc2VydmVyIHJlc3BvbmRzIHRvIHRoZSBzaWduLXVwIHdpdGggSFRUUCBzdGF0dXMgNDAwIGFuZCBhIFBhcnNlIEVycm9yIDIwNSBgRU1BSUxfTk9UX0ZPVU5EYC4gSWYgc2V0IHRvIGBmYWxzZWAgdGhlIHNlcnZlciByZXNwb25kcyB3aXRoIEhUVFAgc3RhdHVzIDIwMCwgYW5kIGNsaWVudCBTREtzIHJldHVybiBhbiB1bmF1dGhlbnRpY2F0ZWQgUGFyc2UgVXNlciB3aXRob3V0IHNlc3Npb24gdG9rZW4uIEluIHRoYXQgY2FzZSBzdWJzZXF1ZW50IHJlcXVlc3RzIGZhaWwgdW50aWwgdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzIGlzIHZlcmlmaWVkLjxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtQcm90ZWN0ZWRGaWVsZHN9IHByb3RlY3RlZEZpZWxkcyBGaWVsZHMgcGVyIGNsYXNzIHRoYXQgYXJlIGhpZGRlbiBmcm9tIHF1ZXJ5IHJlc3VsdHMgZm9yIHNwZWNpZmljIHVzZXIgZ3JvdXBzLiBQcm90ZWN0ZWQgZmllbGRzIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2UsIGJ1dCBjYW4gc3RpbGwgYmUgdXNlZCBpbnRlcm5hbGx5IChlLmcuIGluIENsb3VkIENvZGUgdHJpZ2dlcnMpLiBDb25maWd1cmUgYXMgYHsgJ0NsYXNzTmFtZSc6IHsgJ1VzZXJHcm91cCc6IFsnZmllbGQxJywgJ2ZpZWxkMiddIH0gfWAgd2hlcmUgYFVzZXJHcm91cGAgaXMgb25lIG9mOiBgJyonYCAoYWxsIHVzZXJzKSwgYCdhdXRoZW50aWNhdGVkJ2AgKGF1dGhlbnRpY2F0ZWQgdXNlcnMpLCBgJ3JvbGU6Um9sZU5hbWUnYCAodXNlcnMgd2l0aCBhIHNwZWNpZmljIHJvbGUpLCBgJ3VzZXJGaWVsZDpGaWVsZE5hbWUnYCAodXNlcnMgcmVmZXJlbmNlZCBieSBhIHBvaW50ZXIgZmllbGQpLCBvciBhIHVzZXIgYG9iamVjdElkYCB0byB0YXJnZXQgYSBzcGVjaWZpYyB1c2VyLiBXaGVuIG11bHRpcGxlIGdyb3VwcyBhcHBseSwgdGhlIGludGVyc2VjdGlvbiBvZiB0aGVpciBwcm90ZWN0ZWQgZmllbGRzIGlzIHVzZWQuIEFueSBmaWVsZCBjYW4gYmUgcHJvdGVjdGVkLCBpbmNsdWRpbmcgc3lzdGVtIGZpZWxkcyBsaWtlIGBjcmVhdGVkQXRgIGFuZCBgdXBkYXRlZEF0YC4gQnkgZGVmYXVsdCwgYGVtYWlsYCBpcyBwcm90ZWN0ZWQgb24gdGhlIGBfVXNlcmAgY2xhc3MgZm9yIGFsbCB1c2Vycy4gT24gdGhlIGBfVXNlcmAgY2xhc3MsIHRoZSBvYmplY3Qgb3duZXIgaXMgZXhlbXB0IGZyb20gcHJvdGVjdGVkIGZpZWxkcyBieSBkZWZhdWx0OyBzZWUgYHByb3RlY3RlZEZpZWxkc093bmVyRXhlbXB0YCB0byBjaGFuZ2UgdGhpcy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJvdGVjdGVkRmllbGRzT3duZXJFeGVtcHQgV2hldGhlciB0aGUgYF9Vc2VyYCBjbGFzcyBpcyBleGVtcHQgZnJvbSBgcHJvdGVjdGVkRmllbGRzYCB3aGVuIHRoZSBsb2dnZWQtaW4gdXNlciBxdWVyaWVzIHRoZWlyIG93biB1c2VyIG9iamVjdC4gSWYgYHRydWVgIChkZWZhdWx0KSwgYSB1c2VyIGNhbiBzZWUgYWxsIHRoZWlyIG93biBmaWVsZHMgcmVnYXJkbGVzcyBvZiBgcHJvdGVjdGVkRmllbGRzYCBjb25maWd1cmF0aW9uOyBkZWZhdWx0IHByb3RlY3RlZCBmaWVsZHMgKGUuZy4gYGVtYWlsYCkgYXJlIG1lcmdlZCBpbnRvIGFueSBjdXN0b20gYHByb3RlY3RlZEZpZWxkc2AgY29uZmlndXJhdGlvbi4gSWYgYGZhbHNlYCwgYHByb3RlY3RlZEZpZWxkc2AgYXBwbGllcyBlcXVhbGx5IHRvIHRoZSB1c2VyJ3Mgb3duIG9iamVjdCwgY29uc2lzdGVudCB3aXRoIGFsbCBvdGhlciBjbGFzc2VzOyBvbmx5IGV4cGxpY2l0bHkgY29uZmlndXJlZCBwcm90ZWN0ZWQgZmllbGRzIGFwcGx5LCBkZWZhdWx0cyBhcmUgbm90IG1lcmdlZC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBwcm90ZWN0ZWRGaWVsZHNTYXZlUmVzcG9uc2VFeGVtcHQgV2hldGhlciBzYXZlIG9wZXJhdGlvbiByZXNwb25zZXMgKGNyZWF0ZSwgdXBkYXRlKSBhcmUgZXhlbXB0IGZyb20gYHByb3RlY3RlZEZpZWxkc2AuIElmIGB0cnVlYCAoZGVmYXVsdCksIHByb3RlY3RlZCBmaWVsZHMgbW9kaWZpZWQgZHVyaW5nIGEgc2F2ZSBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuIElmIGBmYWxzZWAsIHByb3RlY3RlZCBmaWVsZHMgYXJlIHN0cmlwcGVkIGZyb20gc2F2ZSByZXNwb25zZXMsIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhleSBhcmUgc3RyaXBwZWQgZnJvbSBxdWVyeSByZXN1bHRzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHByb3RlY3RlZEZpZWxkc1RyaWdnZXJFeGVtcHQgV2hldGhlciBDbG91ZCBDb2RlIHRyaWdnZXJzIChlLmcuIGBiZWZvcmVTYXZlYCwgYGFmdGVyU2F2ZWApIGFyZSBleGVtcHQgZnJvbSBgcHJvdGVjdGVkRmllbGRzYC4gSWYgYHRydWVgLCB0cmlnZ2VycyByZWNlaXZlIHRoZSBmdWxsIG9iamVjdCBpbmNsdWRpbmcgcHJvdGVjdGVkIGZpZWxkcyBpbiBgcmVxdWVzdC5vYmplY3RgIGFuZCBgcmVxdWVzdC5vcmlnaW5hbGAsIHJlZ2FyZGxlc3Mgb2YgdGhlIGNhbGxlcidzIGF1dGggY29udGV4dC4gSWYgYGZhbHNlYCwgcHJvdGVjdGVkIGZpZWxkcyBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgb3JpZ2luYWwgb2JqZWN0IGZldGNoIHVzZWQgdG8gYnVpbGQgdHJpZ2dlciBvYmplY3RzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtVbmlvbn0gcHVibGljU2VydmVyVVJMIE9wdGlvbmFsLiBUaGUgcHVibGljIFVSTCB0byBQYXJzZSBTZXJ2ZXIuIFRoaXMgVVJMIHdpbGwgYmUgdXNlZCB0byByZWFjaCBQYXJzZSBTZXJ2ZXIgcHVibGljbHkgZm9yIGZlYXR1cmVzIGxpa2UgcGFzc3dvcmQgcmVzZXQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbiBsaW5rcy4gVGhlIG9wdGlvbiBjYW4gYmUgc2V0IHRvIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXN5bmNocm9ub3VzbHkgcmVzb2x2ZWQuIFRoZSByZXR1cm5lZCBVUkwgc3RyaW5nIG11c3Qgc3RhcnQgd2l0aCBgaHR0cDovL2Agb3IgYGh0dHBzOi8vYC5cbiAqIEBwcm9wZXJ0eSB7QW55fSBwdXNoIENvbmZpZ3VyYXRpb24gZm9yIHB1c2gsIGFzIHN0cmluZ2lmaWVkIEpTT04uIFNlZSBodHRwOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9wYXJzZS1zZXJ2ZXIvZ3VpZGUvI3B1c2gtbm90aWZpY2F0aW9uc1xuICogQHByb3BlcnR5IHtRdWVyeVNlcnZlck9wdGlvbnN9IHF1ZXJ5IFF1ZXJ5LXJlbGF0ZWQgc2VydmVyIGRlZmF1bHRzLlxuICogQHByb3BlcnR5IHtSYXRlTGltaXRPcHRpb25zW119IHJhdGVMaW1pdCBPcHRpb25zIHRvIGxpbWl0IHJlcGVhdGVkIHJlcXVlc3RzIHRvIFBhcnNlIFNlcnZlciBBUElzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3RlY3Qgc2Vuc2l0aXZlIGVuZHBvaW50cyBzdWNoIGFzIGAvcmVxdWVzdFBhc3N3b3JkUmVzZXRgIGZyb20gYnJ1dGUtZm9yY2UgYXR0YWNrcyBvciBQYXJzZSBTZXJ2ZXIgYXMgYSB3aG9sZSBmcm9tIGRlbmlhbC1vZi1zZXJ2aWNlIChEb1MpIGF0dGFja3MuPGJyPjxicj7ihLnvuI8gTWluZCB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOjxicj4tIHJhdGUgbGltaXRzIGFwcGxpZWQgcGVyIElQIGFkZHJlc3M7IHRoaXMgbGltaXRzIHByb3RlY3Rpb24gYWdhaW5zdCBkaXN0cmlidXRlZCBkZW5pYWwtb2Ytc2VydmljZSAoRERvUykgYXR0YWNrcyB3aGVyZSBtYW55IHJlcXVlc3RzIGFyZSBjb21pbmcgZnJvbSB2YXJpb3VzIElQIGFkZHJlc3Nlczxicj4tIGlmIG11bHRpcGxlIFBhcnNlIFNlcnZlciBpbnN0YW5jZXMgYXJlIGJlaGluZCBhIGxvYWQgYmFsYW5jZXIgb3IgcmFuIGluIGEgY2x1c3RlciwgZWFjaCBpbnN0YW5jZSB3aWxsIGNhbGN1bGF0ZSBpdCdzIG93biByZXF1ZXN0IHJhdGVzLCBpbmRlcGVuZGVudCBmcm9tIG90aGVyIGluc3RhbmNlczsgdGhpcyBsaW1pdHMgdGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhpcyBmZWF0dXJlIHdoZW4gdXNpbmcgYSBsb2FkIGJhbGFuY2VyIGFuZCBhbm90aGVyIHJhdGUgbGltaXRpbmcgc29sdXRpb24gdGhhdCB0YWtlcyByZXF1ZXN0cyBhY3Jvc3MgYWxsIGluc3RhbmNlcyBpbnRvIGFjY291bnQgbWF5IGJlIG1vcmUgc3VpdGFibGU8YnI+LSB0aGlzIGZlYXR1cmUgcHJvdmlkZXMgYmFzaWMgcHJvdGVjdGlvbiBhZ2FpbnN0IGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFja3MsIGJ1dCBhIG1vcmUgc29waGlzdGljYXRlZCBzb2x1dGlvbiB3b3JrcyBlYXJsaWVyIGluIHRoZSByZXF1ZXN0IGZsb3cgYW5kIHByZXZlbnRzIGEgbWFsaWNpb3VzIHJlcXVlc3RzIHRvIGV2ZW4gcmVhY2ggYSBzZXJ2ZXIgaW5zdGFuY2U7IGl0J3MgdGhlcmVmb3JlIHJlY29tbWVuZGVkIHRvIGltcGxlbWVudCBhIHNvbHV0aW9uIGFjY29yZGluZyB0byBhcmNoaXRlY3R1cmUgYW5kIHVzZSBjYXNlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWRPbmx5TWFzdGVyS2V5IFJlYWQtb25seSBrZXksIHdoaWNoIGhhcyB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgYXMgTWFzdGVyS2V5IHdpdGhvdXQgd3JpdGVzXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSByZWFkT25seU1hc3RlcktleUlwcyAoT3B0aW9uYWwpIFJlc3RyaWN0cyB0aGUgdXNlIG9mIHJlYWQtb25seSBtYXN0ZXIga2V5IHBlcm1pc3Npb25zIHRvIGEgbGlzdCBvZiBJUCBhZGRyZXNzZXMgb3IgcmFuZ2VzLjxicj48YnI+VGhpcyBvcHRpb24gYWNjZXB0cyBhIGxpc3Qgb2Ygc2luZ2xlIElQIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYFsnMTAuMC4wLjEnLCAnMTAuMC4wLjInXWAuIFlvdSBjYW4gYWxzbyB1c2UgQ0lEUiBub3RhdGlvbiB0byBzcGVjaWZ5IGFuIElQIGFkZHJlc3MgcmFuZ2UsIGZvciBleGFtcGxlIGBbJzEwLjAuMS4wLzI0J11gLjxicj48YnI+PGI+U3BlY2lhbCBzY2VuYXJpb3M6PC9iPjxicj4tIFNldHRpbmcgYW4gZW1wdHkgYXJyYXkgYFtdYCBtZWFucyB0aGF0IHRoZSByZWFkLW9ubHkgbWFzdGVyIGtleSBjYW5ub3QgYmUgdXNlZCBldmVuIGluIFBhcnNlIFNlcnZlciBDbG91ZCBDb2RlLiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBzZXQgdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHRoZXJlIGlzIG5vIHdheSB0byBwYXNzIGFuIGVtcHR5IGFycmF5IHRvIFBhcnNlIFNlcnZlciB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuPGJyPi0gU2V0dGluZyBgWycwLjAuMC4wLzAnLCAnOjowJ11gIG1lYW5zIHRvIGFsbG93IGFueSBJUHY0IGFuZCBJUHY2IGFkZHJlc3MgdG8gdXNlIHRoZSByZWFkLW9ubHkgbWFzdGVyIGtleSBhbmQgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIElQIGZpbHRlci48YnI+PGJyPjxiPkNvbnNpZGVyYXRpb25zOjwvYj48YnI+LSBJUHY0IGFuZCBJUHY2IGFkZHJlc3NlcyBhcmUgbm90IGNvbXBhcmVkIGFnYWluc3QgZWFjaCBvdGhlci4gRWFjaCBJUCB2ZXJzaW9uIChJUHY0IGFuZCBJUHY2KSBuZWVkcyB0byBiZSBjb25zaWRlcmVkIHNlcGFyYXRlbHkuIEZvciBleGFtcGxlLCBgWycwLjAuMC4wLzAnXWAgYWxsb3dzIGFueSBJUHY0IGFkZHJlc3MgYW5kIGJsb2NrcyBldmVyeSBJUHY2IGFkZHJlc3MuIENvbnZlcnNlbHksIGBbJzo6MCddYCBhbGxvd3MgYW55IElQdjYgYWRkcmVzcyBhbmQgYmxvY2tzIGV2ZXJ5IElQdjQgYWRkcmVzcy48YnI+LSBLZWVwIGluIG1pbmQgdGhhdCB0aGUgSVAgdmVyc2lvbiBpbiB1c2UgZGVwZW5kcyBvbiB0aGUgbmV0d29yayBzdGFjayBvZiB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggUGFyc2UgU2VydmVyIHJ1bnMuIEEgbG9jYWwgZW52aXJvbm1lbnQgbWF5IHVzZSBhIGRpZmZlcmVudCBJUCB2ZXJzaW9uIHRoYW4gYSByZW1vdGUgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBpdCdzIHBvc3NpYmxlIHRoYXQgbG9jYWxseSB0aGUgdmFsdWUgYFsnMC4wLjAuMC8wJ11gIGFsbG93cyB0aGUgcmVxdWVzdCBJUCBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBpcyB1c2luZyBJUHY0LCBidXQgd2hlbiBQYXJzZSBTZXJ2ZXIgaXMgZGVwbG95ZWQgcmVtb3RlbHkgdGhlIHJlcXVlc3QgSVAgaXMgYmxvY2tlZCBiZWNhdXNlIHRoZSByZW1vdGUgZW52aXJvbm1lbnQgaXMgdXNpbmcgSVB2Ni48YnI+LSBXaGVuIHNldHRpbmcgdGhlIG9wdGlvbiB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdGhlIG5vdGF0aW9uIGlzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZywgZm9yIGV4YW1wbGUgYFwiMC4wLjAuMC8wLDo6MFwiYC48YnI+LSBJUHY2IHpvbmUgaW5kaWNlcyAoYCVgIHN1ZmZpeCkgYXJlIG5vdCBzdXBwb3J0ZWQsIGZvciBleGFtcGxlIGBmZTgwOjoxJWV0aDBgLCBgZmU4MDo6MSUxYCBvciBgOjoxJWxvYC48YnI+PGJyPkRlZmF1bHRzIHRvIGBbJzAuMC4wLjAvMCcsICc6OjAnXWAgd2hpY2ggbWVhbnMgdGhhdCBhbnkgSVAgYWRkcmVzcyBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgcmVhZC1vbmx5IG1hc3RlciBrZXkuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBgWycxMjcuMC4wLjEnLCAnOjoxJ11gIHRvIHJlc3RyaWN0IGFjY2VzcyB0byBgbG9jYWxob3N0YC5cbiAqIEBwcm9wZXJ0eSB7UmVxdWVzdENvbXBsZXhpdHlPcHRpb25zfSByZXF1ZXN0Q29tcGxleGl0eSBPcHRpb25zIHRvIGxpbWl0IHRoZSBjb21wbGV4aXR5IG9mIHJlcXVlc3RzIHRvIHByZXZlbnQgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrcy4gTGltaXRzIGFyZSBlbmZvcmNlZCBmb3IgYWxsIHJlcXVlc3RzIGV4Y2VwdCB0aG9zZSB1c2luZyB0aGUgbWFzdGVyIG9yIG1haW50ZW5hbmNlIGtleS4gRWFjaCBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvIGAtMWAgdG8gZGlzYWJsZSB0aGF0IHNwZWNpZmljIGxpbWl0LlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcmVxdWVzdENvbnRleHRNaWRkbGV3YXJlIE9wdGlvbnMgdG8gY3VzdG9taXplIHRoZSByZXF1ZXN0IGNvbnRleHQgdXNpbmcgaW52ZXJzaW9uIG9mIGNvbnRyb2wvZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAcHJvcGVydHkge1JlcXVlc3RLZXl3b3JkRGVueWxpc3RbXX0gcmVxdWVzdEtleXdvcmREZW55bGlzdCBBbiBhcnJheSBvZiBrZXlzIGFuZCB2YWx1ZXMgdGhhdCBhcmUgcHJvaGliaXRlZCBpbiBkYXRhYmFzZSByZWFkIGFuZCB3cml0ZSByZXF1ZXN0cyB0byBwcmV2ZW50IHBvdGVudGlhbCBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIEl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgb25seSBhIGtleSAoYHtcImtleVwiOlwiLi4uXCJ9YCksIG9ubHkgYSB2YWx1ZSAoYHtcInZhbHVlXCI6XCIuLi5cIn1gKSBvciBhIGtleS12YWx1ZSBwYWlyIChge1wia2V5XCI6XCIuLi5cIixcInZhbHVlXCI6XCIuLi5cIn1gKS4gVGhlIHNwZWNpZmljYXRpb24gY2FuIHVzZSB0aGUgZm9sbG93aW5nIHR5cGVzOiBgYm9vbGVhbmAsIGBudW1lcmljYCBvciBgc3RyaW5nYCwgd2hlcmUgYHN0cmluZ2Agd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhIHJlZ2V4IG5vdGF0aW9uLiBSZXF1ZXN0IGRhdGEgaXMgZGVlcC1zY2FubmVkIGZvciBtYXRjaGluZyBkZWZpbml0aW9ucyB0byBkZXRlY3QgYWxzbyBhbnkgbmVzdGVkIG9jY3VycmVuY2VzLiBEZWZhdWx0cyBhcmUgcGF0dGVybnMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIHVzZWQgaW4gbWFsaWNpb3VzIHJlcXVlc3RzLiBTZXR0aW5nIHRoaXMgb3B0aW9uIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGF0dGVybnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVzdEFQSUtleSBLZXkgZm9yIFJFU1QgY2FsbHNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCBXaGVuIGEgdXNlciBjaGFuZ2VzIHRoZWlyIHBhc3N3b3JkLCBlaXRoZXIgdGhyb3VnaCB0aGUgcmVzZXQgcGFzc3dvcmQgZW1haWwgb3Igd2hpbGUgbG9nZ2VkIGluLCBhbGwgc2Vzc2lvbnMgYXJlIHJldm9rZWQgaWYgdGhpcyBpcyB0cnVlLiBTZXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnQgdG8gcmV2b2tlIHNlc3Npb25zLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gcm91dGVBbGxvd0xpc3QgKE9wdGlvbmFsKSBSZXN0cmljdHMgZXh0ZXJuYWwgY2xpZW50IGFjY2VzcyB0byBhIGxpc3Qgb2YgYWxsb3dlZCBBUEkgcm91dGVzLjxicj48YnI+V2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQsIGFsbCBleHRlcm5hbCBub24tbWFzdGVyLWtleSByZXF1ZXN0cyBhcmUgZGVuaWVkIGJ5IGRlZmF1bHQuIE9ubHkgcm91dGVzIG1hdGNoaW5nIGF0IGxlYXN0IG9uZSBvZiB0aGUgY29uZmlndXJlZCByZWdleCBwYXR0ZXJucyBhcmUgYWxsb3dlZCB0aHJvdWdoLiBJbnRlcm5hbCBjYWxscyBmcm9tIENsb3VkIENvZGUsIENsb3VkIEpvYnMsIGFuZCB0cmlnZ2VycyBhcmUgbm90IGFmZmVjdGVkLjxicj48YnI+RWFjaCBlbnRyeSBpcyBhIHJlZ2V4IHBhdHRlcm4gc3RyaW5nIG1hdGNoZWQgYWdhaW5zdCB0aGUgbm9ybWFsaXplZCByb3V0ZSBpZGVudGlmaWVyIChyZXF1ZXN0IHBhdGggd2l0aCBtb3VudCBwcmVmaXggYW5kIGxlYWRpbmcgc2xhc2ggc3RyaXBwZWQpLiBQYXR0ZXJucyBhcmUgYXV0by1hbmNob3JlZCB3aXRoIGBeYCBhbmQgYCRgIGZvciBmdWxsLW1hdGNoIHNlbWFudGljcy48YnI+PGJyPjxiPkV4YW1wbGVzIG9mIG5vcm1hbGl6ZWQgcm91dGUgaWRlbnRpZmllcnM6PC9iPjx1bD48bGk+YGNsYXNzZXMvR2FtZVNjb3JlYCAoY2xhc3MgQ1JVRCk8L2xpPjxsaT5gY2xhc3Nlcy9HYW1lU2NvcmUvYWJjMTIzYCAob2JqZWN0IGJ5IElEKTwvbGk+PGxpPmB1c2Vyc2AgKHVzZXIgb3BlcmF0aW9ucyk8L2xpPjxsaT5gbG9naW5gIChsb2dpbiBlbmRwb2ludCk8L2xpPjxsaT5gZnVuY3Rpb25zL3NlbmRFbWFpbGAgKENsb3VkIEZ1bmN0aW9uKTwvbGk+PGxpPmBqb2JzL2NsZWFudXBgIChDbG91ZCBKb2IpPC9saT48bGk+YHB1c2hgIChwdXNoIG5vdGlmaWNhdGlvbnMpPC9saT48bGk+YGNvbmZpZ2AgKGNsaWVudCBjb25maWcpPC9saT48bGk+YGluc3RhbGxhdGlvbnNgIChpbnN0YWxsYXRpb25zKTwvbGk+PGxpPmBmaWxlcy9waWN0dXJlLmpwZ2AgKGZpbGUgb3BlcmF0aW9ucyk8L2xpPjwvdWw+PGI+RXhhbXBsZSBwYXR0ZXJuczo8L2I+PHVsPjxsaT5gY2xhc3Nlcy9DaGF0TWVzc2FnZWAgbWF0Y2hlcyBvbmx5IGBjbGFzc2VzL0NoYXRNZXNzYWdlYDwvbGk+PGxpPmBjbGFzc2VzL0NoYXQuKmAgbWF0Y2hlcyBgY2xhc3Nlcy9DaGF0TWVzc2FnZWAsIGBjbGFzc2VzL0NoYXRSb29tYCwgZXRjLjwvbGk+PGxpPmBmdW5jdGlvbnMvLipgIG1hdGNoZXMgYWxsIENsb3VkIEZ1bmN0aW9uczwvbGk+PC91bD5TZXR0aW5nIGFuIGVtcHR5IGFycmF5IGBbXWAgYmxvY2tzIGFsbCBleHRlcm5hbCBub24tbWFzdGVyLWtleSByZXF1ZXN0cyAoZnVsbCBsb2NrZG93bikuPGJyPjxicj5XaGVuIHNldHRpbmcgdGhlIG9wdGlvbiB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBub3RhdGlvbiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcsIGZvciBleGFtcGxlIGBcImNsYXNzZXMvQ2hhdE1lc3NhZ2UsdXNlcnMsZnVuY3Rpb25zLy4qXCJgLjxicj48YnI+RGVmYXVsdHMgdG8gYHVuZGVmaW5lZGAgd2hpY2ggbWVhbnMgdGhlIGZlYXR1cmUgaXMgaW5hY3RpdmUgYW5kIGFsbCByb3V0ZXMgYXJlIGFjY2Vzc2libGUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHNjaGVkdWxlZFB1c2ggQ29uZmlndXJhdGlvbiBmb3IgcHVzaCBzY2hlZHVsaW5nLCBkZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7U2NoZW1hT3B0aW9uc30gc2NoZW1hIERlZmluZWQgc2NoZW1hXG4gKiBAcHJvcGVydHkge1NlY3VyaXR5T3B0aW9uc30gc2VjdXJpdHkgVGhlIHNlY3VyaXR5IG9wdGlvbnMgdG8gaWRlbnRpZnkgYW5kIHJlcG9ydCB3ZWFrIHNlY3VyaXR5IHNldHRpbmdzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBzZW5kVXNlckVtYWlsVmVyaWZpY2F0aW9uIFNldCB0byBgZmFsc2VgIHRvIHByZXZlbnQgc2VuZGluZyBvZiB2ZXJpZmljYXRpb24gZW1haWwuIFN1cHBvcnRzIGEgZnVuY3Rpb24gd2l0aCBhIHJldHVybiB2YWx1ZSBvZiBgdHJ1ZWAgb3IgYGZhbHNlYCBmb3IgY29uZGl0aW9uYWwgZW1haWwgc2VuZGluZy48YnI+PGJyPkRlZmF1bHQgaXMgYHRydWVgLjxicj5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHNlcnZlckNsb3NlQ29tcGxldGUgQ2FsbGJhY2sgd2hlbiBzZXJ2ZXIgaGFzIGNsb3NlZFxuICogQHByb3BlcnR5IHtTdHJpbmd9IHNlcnZlclVSTCBUaGUgVVJMIHRvIFBhcnNlIFNlcnZlci48YnI+PGJyPuKaoO+4jyBDZXJ0YWluIHNlcnZlciBmZWF0dXJlcyBvciBhZGFwdGVycyBtYXkgcmVxdWlyZSBQYXJzZSBTZXJ2ZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0c2VsZiBieSBtYWtpbmcgcmVxdWVzdHMgdG8gdGhlIFVSTCBzZXQgaW4gYHNlcnZlclVSTGAuIElmIGEgZmVhdHVyZSByZXF1aXJlcyB0aGlzLCBpdCBpcyBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIEluIHRoYXQgY2FzZSBlbnN1cmUgdGhhdCB0aGUgVVJMIGlzIGFjY2Vzc2libGUgZnJvbSB0aGUgc2VydmVyIGl0c2VsZi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzZXNzaW9uTGVuZ3RoIFNlc3Npb24gZHVyYXRpb24sIGluIHNlY29uZHMsIGRlZmF1bHRzIHRvIDEgeWVhclxuICogQHByb3BlcnR5IHtCb29sZWFufSBzaWxlbnQgRGlzYWJsZXMgY29uc29sZSBvdXRwdXRcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc3RhcnRMaXZlUXVlcnlTZXJ2ZXIgU3RhcnRzIHRoZSBsaXZlUXVlcnkgc2VydmVyXG4gKiBAcHJvcGVydHkge0FueX0gdHJ1c3RQcm94eSBUaGUgdHJ1c3QgcHJveHkgc2V0dGluZ3MuIEl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoZSBleGFjdCBzZXR1cCBvZiB0aGUgcmV2ZXJzZSBwcm94eSwgc2luY2UgdGhpcyBzZXR0aW5nIHdpbGwgdHJ1c3QgdmFsdWVzIHByb3ZpZGVkIGluIHRoZSBQYXJzZSBTZXJ2ZXIgQVBJIHJlcXVlc3QuIFNlZSB0aGUgPGEgaHJlZj1cImh0dHBzOi8vZXhwcmVzc2pzLmNvbS9lbi9ndWlkZS9iZWhpbmQtcHJveGllcy5odG1sXCI+ZXhwcmVzcyB0cnVzdCBwcm94eSBzZXR0aW5nczwvYT4gZG9jdW1lbnRhdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHVzZXJTZW5zaXRpdmVGaWVsZHMgUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24gZmllbGRzIGluIHRoZSB1c2VyIHRhYmxlIHRoZSBzaG91bGQgYmUgcmVtb3ZlZCBmb3Igbm9uLWF1dGhvcml6ZWQgdXNlcnMuIERlcHJlY2F0ZWQgQHNlZSBwcm90ZWN0ZWRGaWVsZHNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdmVyYm9zZSBTZXQgdGhlIGxvZ2dpbmcgdG8gdmVyYm9zZVxuICogQHByb3BlcnR5IHtCb29sZWFufSB2ZXJpZnlTZXJ2ZXJVcmwgUGFyc2UgU2VydmVyIG1ha2VzIGEgSFRUUCByZXF1ZXN0IHRvIHRoZSBVUkwgc2V0IGluIGBzZXJ2ZXJVUkxgIGF0IHRoZSBlbmQgb2YgaXRzIGxhdW5jaCByb3V0aW5lIHRvIHZlcmlmeSB0aGF0IHRoZSBsYXVuY2ggc3VjY2VlZGVkLiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gYGZhbHNlYCwgdGhlIHZlcmlmaWNhdGlvbiB3aWxsIGJlIHNraXBwZWQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIHNlcnZlciBVUkwgaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgc2VydmVyIGl0c2VsZiwgc3VjaCBhcyB3aGVuIHJ1bm5pbmcgYmVoaW5kIGEgZmlyZXdhbGwgb3IgaW4gY2VydGFpbiBjb250YWluZXJpemVkIGVudmlyb25tZW50cy48YnI+PGJyPuKaoO+4jyBTZXJ2ZXIgVVJMIHZlcmlmaWNhdGlvbiByZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0c2VsZiBieSBtYWtpbmcgcmVxdWVzdHMgdG8gdGhlIFVSTCBzZXQgaW4gYHNlcnZlclVSTGAuPGJyPjxicj5EZWZhdWx0IGlzIGB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdmVyaWZ5VXNlckVtYWlscyBTZXQgdG8gYHRydWVgIHRvIHJlcXVpcmUgdXNlcnMgdG8gdmVyaWZ5IHRoZWlyIGVtYWlsIGFkZHJlc3MgdG8gY29tcGxldGUgdGhlIHNpZ24tdXAgcHJvY2Vzcy4gU3VwcG9ydHMgYSBmdW5jdGlvbiB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mIGB0cnVlYCBvciBgZmFsc2VgIGZvciBjb25kaXRpb25hbCB2ZXJpZmljYXRpb24uIFRoZSBmdW5jdGlvbiByZWNlaXZlcyBhIHJlcXVlc3Qgb2JqZWN0IHRoYXQgaW5jbHVkZXMgYGNyZWF0ZWRXaXRoYCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbnZvY2F0aW9uIGlzIGZvciBgc2lnbnVwYCBvciBgbG9naW5gIGFuZCB0aGUgdXNlZCBhdXRoIHByb3ZpZGVyLjxicj48YnI+VGhlIGBjcmVhdGVkV2l0aGAgdmFsdWVzIHBlciBzY2VuYXJpbzo8dWw+PGxpPlBhc3N3b3JkIHNpZ251cDogYHsgYWN0aW9uOiAnc2lnbnVwJywgYXV0aFByb3ZpZGVyOiAncGFzc3dvcmQnIH1gPC9saT48bGk+QXV0aCBwcm92aWRlciBzaWdudXA6IGB7IGFjdGlvbjogJ3NpZ251cCcsIGF1dGhQcm92aWRlcjogJzxwcm92aWRlcj4nIH1gPC9saT48bGk+UGFzc3dvcmQgbG9naW46IGB7IGFjdGlvbjogJ2xvZ2luJywgYXV0aFByb3ZpZGVyOiAncGFzc3dvcmQnIH1gPC9saT48bGk+QXV0aCBwcm92aWRlciBsb2dpbjogZnVuY3Rpb24gbm90IGludm9rZWQ7IGF1dGggcHJvdmlkZXIgbG9naW4gYnlwYXNzZXMgZW1haWwgdmVyaWZpY2F0aW9uPC9saT48bGk+UmVzZW5kIHZlcmlmaWNhdGlvbiBlbWFpbDogYGNyZWF0ZWRXaXRoYCBpcyBgdW5kZWZpbmVkYDsgdXNlIHRoZSBgcmVzZW5kUmVxdWVzdGAgcHJvcGVydHkgdG8gaWRlbnRpZnkgdGhvc2U8L2xpPjwvdWw+RGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHdlYmhvb2tLZXkgS2V5IHNlbnQgd2l0aCBvdXRnb2luZyB3ZWJob29rIGNhbGxzXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFJhdGVMaW1pdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBlcnJvclJlc3BvbnNlTWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBpbiB0aGUgYm9keSBvZiB0aGUgSFRUUCA0MjkgcmVzcG9uc2Ugd2hlbiB0aGUgcmF0ZSBsaW1pdCBpcyBoaXQuIERlZmF1bHQgaXMgYFRvbyBtYW55IHJlcXVlc3RzLmAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGluY2x1ZGVJbnRlcm5hbFJlcXVlc3RzIE9wdGlvbmFsLCBpZiBgdHJ1ZWAgdGhlIHJhdGUgbGltaXQgd2lsbCBhbHNvIGFwcGx5IHRvIHJlcXVlc3RzIHRoYXQgYXJlIG1hZGUgaW4gYnkgQ2xvdWQgQ29kZSwgZGVmYXVsdCBpcyBgZmFsc2VgLiBOb3RlIHRoYXQgYSBwdWJsaWMgQ2xvdWQgQ29kZSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIGludGVybmFsIHJlcXVlc3RzIG1heSBjaXJjdW12ZW50IHJhdGUgbGltaXRpbmcgYW5kIGJlIHZ1bG5lcmFibGUgdG8gYXR0YWNrcy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaW5jbHVkZU1hc3RlcktleSBPcHRpb25hbCwgaWYgYHRydWVgIHRoZSByYXRlIGxpbWl0IHdpbGwgYWxzbyBhcHBseSB0byByZXF1ZXN0cyB1c2luZyB0aGUgYG1hc3RlcktleWAsIGRlZmF1bHQgaXMgYGZhbHNlYC4gTm90ZSB0aGF0IGEgcHVibGljIENsb3VkIENvZGUgZnVuY3Rpb24gdGhhdCB0cmlnZ2VycyBpbnRlcm5hbCByZXF1ZXN0cyB1c2luZyB0aGUgYG1hc3RlcktleWAgbWF5IGNpcmN1bXZlbnQgcmF0ZSBsaW1pdGluZyBhbmQgYmUgdnVsbmVyYWJsZSB0byBhdHRhY2tzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlZGlzVXJsIE9wdGlvbmFsLCB0aGUgVVJMIG9mIHRoZSBSZWRpcyBzZXJ2ZXIgdG8gc3RvcmUgcmF0ZSBsaW1pdCBkYXRhLiBUaGlzIGFsbG93cyB0byByYXRlIGxpbWl0IHJlcXVlc3RzIGZvciBtdWx0aXBsZSBzZXJ2ZXJzIGJ5IGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWxsIHJlcXVlc3RzIGFjcm9zcyBhbGwgc2VydmVycy4gVGhpcyBpcyB1c2VmdWwgaWYgbXVsdGlwbGUgc2VydmVycyBhcmUgcHJvY2Vzc2luZyByZXF1ZXN0cyBiZWhpbmQgYSBsb2FkIGJhbGFuY2VyLiBGb3IgZXhhbXBsZSwgdGhlIGxpbWl0IG9mIDEwIHJlcXVlc3RzIGlzIHJlYWNoZWQgaWYgZWFjaCBvZiAyIHNlcnZlcnMgcHJvY2Vzc2VkIDUgcmVxdWVzdHMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gcmVxdWVzdENvdW50IFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBjYW4gYmUgbWFkZSBwZXIgSVAgYWRkcmVzcyB3aXRoaW4gdGhlIHRpbWUgd2luZG93IHNldCBpbiBgcmVxdWVzdFRpbWVXaW5kb3dgIGJlZm9yZSB0aGUgcmF0ZSBsaW1pdCBpcyBhcHBsaWVkLiBGb3IgYmF0Y2ggcmVxdWVzdHMsIHRoaXMgYWxzbyBsaW1pdHMgdGhlIG51bWJlciBvZiBzdWItcmVxdWVzdHMgaW4gYSBzaW5nbGUgYmF0Y2ggdGhhdCB0YXJnZXQgdGhpcyBwYXRoOyBob3dldmVyLCByZXF1ZXN0cyBhbHJlYWR5IGNvbnN1bWVkIGluIHRoZSBjdXJyZW50IHRpbWUgd2luZG93IGFyZSBub3QgY291bnRlZCBhZ2FpbnN0IHRoZSBiYXRjaCwgc28gdGhlIGVmZmVjdGl2ZSBsaW1pdCBtYXkgYmUgaGlnaGVyIHdoZW4gY29tYmluaW5nIGluZGl2aWR1YWwgYW5kIGJhdGNoIHJlcXVlc3RzLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGJhc2ljIHNlcnZlci1sZXZlbCByYXRlIGxpbWl0OyBmb3IgY29tcHJlaGVuc2l2ZSBwcm90ZWN0aW9uLCB1c2UgYSByZXZlcnNlIHByb3h5IG9yIFdBRiBmb3IgcmF0ZSBsaW1pdGluZy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHJlcXVlc3RNZXRob2RzIE9wdGlvbmFsLCB0aGUgSFRUUCByZXF1ZXN0IG1ldGhvZHMgdG8gd2hpY2ggdGhlIHJhdGUgbGltaXQgc2hvdWxkIGJlIGFwcGxpZWQsIGRlZmF1bHQgaXMgYWxsIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVxdWVzdFBhdGggVGhlIHBhdGggb2YgdGhlIEFQSSByb3V0ZSB0byBiZSByYXRlIGxpbWl0ZWQuIFJvdXRlIHBhdGhzLCBpbiBjb21iaW5hdGlvbiB3aXRoIGEgcmVxdWVzdCBtZXRob2QsIGRlZmluZSB0aGUgZW5kcG9pbnRzIGF0IHdoaWNoIHJlcXVlc3RzIGNhbiBiZSBtYWRlLiBSb3V0ZSBwYXRocyBjYW4gYmUgc3RyaW5ncyBvciBzdHJpbmcgcGF0dGVybnMgZm9sbG93aW5nIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vcGlsbGFyanMvcGF0aC10by1yZWdleHBcIj5wYXRoLXRvLXJlZ2V4cCB2ODwvYT4gc3ludGF4LlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHJlcXVlc3RUaW1lV2luZG93IFRoZSB3aW5kb3cgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgd2l0aGluIHdoaWNoIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgc2V0IGluIGByZXF1ZXN0Q291bnRgIGNhbiBiZSBtYWRlIGJlZm9yZSB0aGUgcmF0ZSBsaW1pdCBpcyBhcHBsaWVkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHpvbmUgVGhlIHR5cGUgb2YgcmF0ZSBsaW1pdCB0byBhcHBseS4gVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgc3VwcG9ydGVkOjx1bD48bGk+YGdsb2JhbGA6IHJhdGUgbGltaXQgYmFzZWQgb24gdGhlIG51bWJlciBvZiByZXF1ZXN0cyBtYWRlIGJ5IGFsbCB1c2VyczwvbGk+PGxpPmBpcGA6IHJhdGUgbGltaXQgYmFzZWQgb24gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHJlcXVlc3Q8L2xpPjxsaT5gdXNlcmA6IHJhdGUgbGltaXQgYmFzZWQgb24gdGhlIHVzZXIgSUQgb2YgdGhlIHJlcXVlc3Q8L2xpPjxsaT5gc2Vzc2lvbmA6IHJhdGUgbGltaXQgYmFzZWQgb24gdGhlIHNlc3Npb24gdG9rZW4gb2YgdGhlIHJlcXVlc3Q8L2xpPjwvdWw+RGVmYXVsdCBpcyBgaXBgLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBSZXF1ZXN0Q29tcGxleGl0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWxsb3dSZWdleCBXaGV0aGVyIHRvIGFsbG93IHRoZSBgJHJlZ2V4YCBxdWVyeSBvcGVyYXRvci4gU2V0IHRvIGBmYWxzZWAgdG8gcmVqZWN0IGAkcmVnZXhgIGluIHF1ZXJpZXMgZm9yIG5vbi1tYXN0ZXIta2V5IHVzZXJzLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBiYXRjaFJlcXVlc3RMaW1pdCBNYXhpbXVtIG51bWJlciBvZiBzdWItcmVxdWVzdHMgaW4gYSBzaW5nbGUgYmF0Y2ggcmVxdWVzdC4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgLTFgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGdyYXBoUUxEZXB0aCBNYXhpbXVtIGRlcHRoIG9mIEdyYXBoUUwgZmllbGQgc2VsZWN0aW9ucy4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgLTFgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGdyYXBoUUxGaWVsZHMgTWF4aW11bSBudW1iZXIgb2YgZmllbGQgc2VsZWN0aW9ucyBpbiBhIEdyYXBoUUwgcXVlcnkuIFNldCB0byBgLTFgIHRvIGRpc2FibGUuIERlZmF1bHQgaXMgYC0xYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBpbmNsdWRlQ291bnQgTWF4aW11bSBudW1iZXIgb2YgaW5jbHVkZSBwYXRocyBpbiBhIHNpbmdsZSBxdWVyeS4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgLTFgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGluY2x1ZGVEZXB0aCBNYXhpbXVtIGRlcHRoIG9mIGluY2x1ZGUgcG9pbnRlciBjaGFpbnMgKGUuZy4gYGEuYi5jYCA9IGRlcHRoIDMpLiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gcXVlcnlEZXB0aCBNYXhpbXVtIG5lc3RpbmcgZGVwdGggb2YgYCRvcmAsIGAkYW5kYCwgYCRub3JgIHF1ZXJ5IG9wZXJhdG9ycy4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgLTFgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHN1YnF1ZXJ5RGVwdGggTWF4aW11bSBuZXN0aW5nIGRlcHRoIG9mIGAkaW5RdWVyeWAsIGAkbm90SW5RdWVyeWAsIGAkc2VsZWN0YCwgYCRkb250U2VsZWN0YCBzdWJxdWVyaWVzLiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc3VicXVlcnlMaW1pdCBNYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHJldHVybmVkIGJ5IGEgYCRpblF1ZXJ5YCwgYCRub3RJblF1ZXJ5YCwgYCRzZWxlY3RgLCBgJGRvbnRTZWxlY3RgIHN1YnF1ZXJ5LiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtDaGVja0dyb3VwW119IGNoZWNrR3JvdXBzIFRoZSBzZWN1cml0eSBjaGVjayBncm91cHMgdG8gcnVuLiBUaGlzIGFsbG93cyB0byBhZGQgY3VzdG9tIHNlY3VyaXR5IGNoZWNrcyBvciBvdmVycmlkZSBleGlzdGluZyBvbmVzLiBEZWZhdWx0IGFyZSB0aGUgZ3JvdXBzIGRlZmluZWQgaW4gYENoZWNrR3JvdXBzLmpzYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlQ2hlY2sgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGNoZWNrIGZvciB3ZWFrIHNlY3VyaXR5IHNldHRpbmdzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVDaGVja0xvZyBJcyB0cnVlIGlmIHRoZSBzZWN1cml0eSBjaGVjayByZXBvcnQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gbG9ncy4gVGhpcyBzaG91bGQgb25seSBiZSBlbmFibGVkIHRlbXBvcmFyaWx5IHRvIG5vdCBleHBvc2Ugd2VhayBzZWN1cml0eSBzZXR0aW5ncyBpbiBsb2dzLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBRdWVyeVNlcnZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWdncmVnYXRpb25SYXdGaWVsZE5hbWVzIFdoZW4gYHRydWVgLCBhbGwgYWdncmVnYXRpb24gcXVlcmllcyBkZWZhdWx0IHRvIHVzaW5nIG5hdGl2ZSBNb25nb0RCIGZpZWxkIG5hbWVzIChubyBhdXRvbWF0aWMgYGNyZWF0ZWRBdGAg4oaSIGBfY3JlYXRlZF9hdGAgcmV3cml0aW5nKS4gSW5kaXZpZHVhbCBxdWVyaWVzIGNhbiBzdGlsbCBvdmVycmlkZSB0aGlzIHZpYSB0aGUgYHJhd0ZpZWxkTmFtZXNgIG9wdGlvbi4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBhZ2dyZWdhdGlvblJhd1ZhbHVlcyBXaGVuIGB0cnVlYCwgYWxsIGFnZ3JlZ2F0aW9uIHF1ZXJpZXMgZGVmYXVsdCB0byB1c2luZyBNb25nb0RCIEV4dGVuZGVkIEpTT04gKEVKU09OKSBmb3IgZXhwbGljaXQgdmFsdWUgdHlwaW5nIGFuZCBza2lwIHNjaGVtYS1iYXNlZCB2YWx1ZSBjb2VyY2lvbi4gSW5kaXZpZHVhbCBxdWVyaWVzIGNhbiBzdGlsbCBvdmVycmlkZSB0aGlzIHZpYSB0aGUgYHJhd1ZhbHVlc2Agb3B0aW9uLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFBhZ2VzT3B0aW9uc1xuICogQHByb3BlcnR5IHtQYWdlc1JvdXRlW119IGN1c3RvbVJvdXRlcyBUaGUgY3VzdG9tIHJvdXRlcy5cbiAqIEBwcm9wZXJ0eSB7UGFnZXNDdXN0b21VcmxzT3B0aW9uc30gY3VzdG9tVXJscyBUaGUgVVJMcyB0byB0aGUgY3VzdG9tIHBhZ2VzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVMb2NhbGl6YXRpb24gSXMgdHJ1ZSBpZiBwYWdlcyBzaG91bGQgYmUgbG9jYWxpemVkOyB0aGlzIGhhcyBubyBlZmZlY3Qgb24gY3VzdG9tIHBhZ2UgcmVkaXJlY3RzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmNvZGVQYWdlUGFyYW1IZWFkZXJzIElzIGB0cnVlYCBpZiB0aGUgcGFnZSBwYXJhbWV0ZXIgaGVhZGVycyBzaG91bGQgYmUgVVJJLWVuY29kZWQuIFRoaXMgaXMgcmVxdWlyZWQgaWYgYW55IHBhZ2UgcGFyYW1ldGVyIHZhbHVlIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBzdWNoIGFzIHRoZSBhcHAgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZm9yY2VSZWRpcmVjdCBJcyB0cnVlIGlmIHJlc3BvbnNlcyBzaG91bGQgYWx3YXlzIGJlIHJlZGlyZWN0cyBhbmQgbmV2ZXIgY29udGVudCwgZmFsc2UgaWYgdGhlIHJlc3BvbnNlIHR5cGUgc2hvdWxkIGRlcGVuZCBvbiB0aGUgcmVxdWVzdCB0eXBlIChHRVQgcmVxdWVzdCAtPiBjb250ZW50IHJlc3BvbnNlOyBQT1NUIHJlcXVlc3QgLT4gcmVkaXJlY3QgcmVzcG9uc2UpLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvY2FsaXphdGlvbkZhbGxiYWNrTG9jYWxlIFRoZSBmYWxsYmFjayBsb2NhbGUgZm9yIGxvY2FsaXphdGlvbiBpZiBubyBtYXRjaGluZyB0cmFuc2xhdGlvbiBpcyBwcm92aWRlZCBmb3IgdGhlIGdpdmVuIGxvY2FsZS4gVGhpcyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gcHJvdmlkaW5nIHRyYW5zbGF0aW9uIHJlc291cmNlcyB2aWEgSlNPTiBmaWxlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvY2FsaXphdGlvbkpzb25QYXRoIFRoZSBwYXRoIHRvIHRoZSBKU09OIGZpbGUgZm9yIGxvY2FsaXphdGlvbjsgdGhlIHRyYW5zbGF0aW9ucyB3aWxsIGJlIHVzZWQgdG8gZmlsbCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFnZXNFbmRwb2ludCBUaGUgQVBJIGVuZHBvaW50IGZvciB0aGUgcGFnZXMuIERlZmF1bHQgaXMgJ2FwcHMnLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhZ2VzUGF0aCBUaGUgcGF0aCB0byB0aGUgcGFnZXMgZGlyZWN0b3J5OyB0aGlzIGFsc28gZGVmaW5lcyB3aGVyZSB0aGUgc3RhdGljIGVuZHBvaW50ICcvYXBwcycgcG9pbnRzIHRvLiBEZWZhdWx0IGlzIHRoZSAnLi9wdWJsaWMvJyBkaXJlY3Rvcnkgb2YgdGhlIHBhcnNlLXNlcnZlciBtb2R1bGUuXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGxhY2Vob2xkZXJzIFRoZSBwbGFjZWhvbGRlciBrZXlzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gcGFnZXM7IHRoaXMgY2FuIGJlIGEgc2ltcGxlIG9iamVjdCBvciBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBQYWdlc1JvdXRlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSByb3V0ZSBoYW5kbGVyIHRoYXQgaXMgYW4gYXN5bmMgZnVuY3Rpb24uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWV0aG9kIFRoZSByb3V0ZSBtZXRob2QsIGUuZy4gJ0dFVCcgb3IgJ1BPU1QnLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggVGhlIHJvdXRlIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFBhZ2VzQ3VzdG9tVXJsc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBlbWFpbFZlcmlmaWNhdGlvbkxpbmtFeHBpcmVkIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBlbWFpbCB2ZXJpZmljYXRpb24gLT4gbGluayBleHBpcmVkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVtYWlsVmVyaWZpY2F0aW9uTGlua0ludmFsaWQgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIGVtYWlsIHZlcmlmaWNhdGlvbiAtPiBsaW5rIGludmFsaWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZW1haWxWZXJpZmljYXRpb25TZW5kRmFpbCBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgZW1haWwgdmVyaWZpY2F0aW9uIC0+IGxpbmsgc2VuZCBmYWlsLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVtYWlsVmVyaWZpY2F0aW9uU2VuZFN1Y2Nlc3MgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIGVtYWlsIHZlcmlmaWNhdGlvbiAtPiByZXNlbmQgbGluayAtPiBzdWNjZXNzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVtYWlsVmVyaWZpY2F0aW9uU3VjY2VzcyBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgZW1haWwgdmVyaWZpY2F0aW9uIC0+IHN1Y2Nlc3MuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFzc3dvcmRSZXNldCBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgcGFzc3dvcmQgcmVzZXQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFzc3dvcmRSZXNldExpbmtJbnZhbGlkIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBwYXNzd29yZCByZXNldCAtPiBsaW5rIGludmFsaWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFzc3dvcmRSZXNldFN1Y2Nlc3MgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIHBhc3N3b3JkIHJlc2V0IC0+IHN1Y2Nlc3MuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIEN1c3RvbVBhZ2VzT3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGNob29zZVBhc3N3b3JkIGNob29zZSBwYXNzd29yZCBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBleHBpcmVkVmVyaWZpY2F0aW9uTGluayBleHBpcmVkIHZlcmlmaWNhdGlvbiBsaW5rIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGludmFsaWRMaW5rIGludmFsaWQgbGluayBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBpbnZhbGlkUGFzc3dvcmRSZXNldExpbmsgaW52YWxpZCBwYXNzd29yZCByZXNldCBsaW5rIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGludmFsaWRWZXJpZmljYXRpb25MaW5rIGludmFsaWQgdmVyaWZpY2F0aW9uIGxpbmsgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbGlua1NlbmRGYWlsIHZlcmlmaWNhdGlvbiBsaW5rIHNlbmQgZmFpbCBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsaW5rU2VuZFN1Y2Nlc3MgdmVyaWZpY2F0aW9uIGxpbmsgc2VuZCBzdWNjZXNzIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhcnNlRnJhbWVVUkwgZm9yIG1hc2tpbmcgdXNlci1mYWNpbmcgcGFnZXNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXNzd29yZFJlc2V0U3VjY2VzcyBwYXNzd29yZCByZXNldCBzdWNjZXNzIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IHZlcmlmeUVtYWlsU3VjY2VzcyB2ZXJpZnkgZW1haWwgc3VjY2VzcyBwYWdlIHBhdGhcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTGl2ZVF1ZXJ5T3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gY2xhc3NOYW1lcyBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgY2xhc3NOYW1lc1xuICogQHByb3BlcnR5IHtBZGFwdGVyPFB1YlN1YkFkYXB0ZXI+fSBwdWJTdWJBZGFwdGVyIExpdmVRdWVyeSBwdWJzdWIgYWRhcHRlclxuICogQHByb3BlcnR5IHtBbnl9IHJlZGlzT3B0aW9ucyBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgcmVkaXNPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVkaXNVUkwgcGFyc2Utc2VydmVyJ3MgTGl2ZVF1ZXJ5IHJlZGlzVVJMXG4gKiBAcHJvcGVydHkge051bWJlcn0gcmVnZXhUaW1lb3V0IFNldHMgdGhlIG1heGltdW0gZXhlY3V0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBtYXRjaGluZyBpbiBMaXZlUXVlcnkuIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBSZWd1bGFyIEV4cHJlc3Npb24gRGVuaWFsIG9mIFNlcnZpY2UgKFJlRG9TKSBhdHRhY2tzIHdoZXJlIGEgbWFsaWNpb3VzIHJlZ2V4IHBhdHRlcm4gY291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AuIEEgcmVnZXggdGhhdCBleGNlZWRzIHRoZSB0aW1lb3V0IHdpbGwgYmUgdHJlYXRlZCBhcyBub24tbWF0Y2hpbmcuPGJyPjxicj5UaGUgcHJvdGVjdGlvbiBydW5zIGVhY2ggcmVnZXggZXZhbHVhdGlvbiBpbiBhbiBpc29sYXRlZCBWTSBjb250ZXh0IHdpdGggYSB0aW1lb3V0LiBUaGlzIGFkZHMgYXBwcm94aW1hdGVseSA1MCBtaWNyb3NlY29uZHMgb2Ygb3ZlcmhlYWQgcGVyIHJlZ2V4IGV2YWx1YXRpb24uIEZvciBtb3N0IGFwcGxpY2F0aW9ucyB0aGlzIGlzIG5lZ2xpZ2libGUsIGJ1dCBpdCBjYW4gYWRkIHVwIGlmIHlvdSBoYXZlIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgTGl2ZVF1ZXJ5IHN1YnNjcmlwdGlvbnMgdGhhdCB1c2UgYCRyZWdleGAgb24gdGhlIHNhbWUgY2xhc3MuIEZvciBleGFtcGxlLCAxMCwwMDAgY29uY3VycmVudCByZWdleCBzdWJzY3JpcHRpb25zIHdvdWxkIGFkZCBhcHByb3hpbWF0ZWx5IDUwMG1zIG9mIHByb2Nlc3NpbmcgdGltZSBwZXIgb2JqZWN0IHNhdmUgZXZlbnQgb24gdGhhdCBjbGFzcy48YnI+PGJyPlNldCB0byBgMGAgdG8gZGlzYWJsZSB0aGUgdGltZW91dCBhbmQgdXNlIG5hdGl2ZSByZWdleCBldmFsdWF0aW9uIHdpdGhvdXQgcHJvdGVjdGlvbi4gRGVmYXVsdHMgdG8gYDEwMGAuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8V1NTQWRhcHRlcj59IHdzc0FkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBXZWJTb2NrZXRTZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTGl2ZVF1ZXJ5U2VydmVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGFwcElkIFRoaXMgc3RyaW5nIHNob3VsZCBtYXRjaCB0aGUgYXBwSWQgaW4gdXNlIGJ5IHlvdXIgUGFyc2UgU2VydmVyLiBJZiB5b3UgZGVwbG95IHRoZSBMaXZlUXVlcnkgc2VydmVyIGFsb25nc2lkZSBQYXJzZSBTZXJ2ZXIsIHRoZSBMaXZlUXVlcnkgc2VydmVyIHdpbGwgdHJ5IHRvIHVzZSB0aGUgc2FtZSBhcHBJZC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjYWNoZVRpbWVvdXQgTnVtYmVyIGluIG1pbGxpc2Vjb25kcy4gV2hlbiBjbGllbnRzIHByb3ZpZGUgdGhlIHNlc3Npb25Ub2tlbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgd2lsbCB0cnkgdG8gZmV0Y2ggaXRzIFBhcnNlVXNlcidzIG9iamVjdElkIGZyb20gcGFyc2Ugc2VydmVyIGFuZCBzdG9yZSBpdCBpbiB0aGUgY2FjaGUuIFRoZSB2YWx1ZSBkZWZpbmVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FjaGUuIENoZWNrIHRoZSBmb2xsb3dpbmcgU2VjdXJpdHkgc2VjdGlvbiBhbmQgb3VyIHByb3RvY29sIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMsIGRlZmF1bHRzIHRvIDUgKiAxMDAwIG1zICg1IHNlY29uZHMpLlxuICogQHByb3BlcnR5IHtBbnl9IGtleVBhaXJzIEEgSlNPTiBvYmplY3QgdGhhdCBzZXJ2ZXMgYXMgYSB3aGl0ZWxpc3Qgb2Yga2V5cy4gSXQgaXMgdXNlZCBmb3IgdmFsaWRhdGluZyBjbGllbnRzIHdoZW4gdGhleSB0cnkgdG8gY29ubmVjdCB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci4gQ2hlY2sgdGhlIGZvbGxvd2luZyBTZWN1cml0eSBzZWN0aW9uIGFuZCBvdXIgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2dMZXZlbCBUaGlzIHN0cmluZyBkZWZpbmVzIHRoZSBsb2cgbGV2ZWwgb2YgdGhlIExpdmVRdWVyeSBzZXJ2ZXIuIFdlIHN1cHBvcnQgVkVSQk9TRSwgSU5GTywgRVJST1IsIE5PTkUsIGRlZmF1bHRzIHRvIElORk8uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWFzdGVyS2V5IFRoaXMgc3RyaW5nIHNob3VsZCBtYXRjaCB0aGUgbWFzdGVyS2V5IGluIHVzZSBieSB5b3VyIFBhcnNlIFNlcnZlci4gSWYgeW91IGRlcGxveSB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBhbG9uZ3NpZGUgUGFyc2UgU2VydmVyLCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciB3aWxsIHRyeSB0byB1c2UgdGhlIHNhbWUgbWFzdGVyS2V5LlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHBvcnQgVGhlIHBvcnQgdG8gcnVuIHRoZSBMaXZlUXVlcnkgc2VydmVyLCBkZWZhdWx0cyB0byAxMzM3LlxuICogQHByb3BlcnR5IHtBZGFwdGVyPFB1YlN1YkFkYXB0ZXI+fSBwdWJTdWJBZGFwdGVyIExpdmVRdWVyeSBwdWJzdWIgYWRhcHRlclxuICogQHByb3BlcnR5IHtBbnl9IHJlZGlzT3B0aW9ucyBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgcmVkaXNPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVkaXNVUkwgcGFyc2Utc2VydmVyJ3MgTGl2ZVF1ZXJ5IHJlZGlzVVJMXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyVVJMIFRoaXMgc3RyaW5nIHNob3VsZCBtYXRjaCB0aGUgc2VydmVyVVJMIGluIHVzZSBieSB5b3VyIFBhcnNlIFNlcnZlci4gSWYgeW91IGRlcGxveSB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBhbG9uZ3NpZGUgUGFyc2UgU2VydmVyLCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciB3aWxsIHRyeSB0byB1c2UgdGhlIHNhbWUgc2VydmVyVVJMLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHdlYnNvY2tldFRpbWVvdXQgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBpbmcvcG9uZyBmcmFtZXMuIFRoZSBXZWJTb2NrZXQgc2VydmVyIHNlbmRzIHBpbmcvcG9uZyBmcmFtZXMgdG8gdGhlIGNsaWVudHMgdG8ga2VlcCB0aGUgV2ViU29ja2V0IGFsaXZlLiBUaGlzIHZhbHVlIGRlZmluZXMgdGhlIGludGVydmFsIG9mIHRoZSBwaW5nL3BvbmcgZnJhbWUgZnJvbSB0aGUgc2VydmVyIHRvIGNsaWVudHMsIGRlZmF1bHRzIHRvIDEwICogMTAwMCBtcyAoMTAgcykuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8V1NTQWRhcHRlcj59IHdzc0FkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBXZWJTb2NrZXRTZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgSWRlbXBvdGVuY3lPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBwYXRocyBBbiBhcnJheSBvZiBwYXRocyBmb3Igd2hpY2ggdGhlIGZlYXR1cmUgc2hvdWxkIGJlIGVuYWJsZWQuIFRoZSBtb3VudCBwYXRoIG11c3Qgbm90IGJlIGluY2x1ZGVkLCBmb3IgZXhhbXBsZSBpbnN0ZWFkIG9mIGAvcGFyc2UvZnVuY3Rpb25zL215RnVuY3Rpb25gIHNwZWNpZml5IGBmdW5jdGlvbnMvbXlGdW5jdGlvbmAuIFRoZSBlbnRyaWVzIGFyZSBpbnRlcnByZXRlZCBhcyByZWd1bGFyIGV4cHJlc3Npb24sIGZvciBleGFtcGxlIGBmdW5jdGlvbnMvLipgIG1hdGNoZXMgYWxsIGZ1bmN0aW9ucywgYGpvYnMvLipgIG1hdGNoZXMgYWxsIGpvYnMsIGBjbGFzc2VzLy4qYCBtYXRjaGVzIGFsbCBjbGFzc2VzLCBgLipgIG1hdGNoZXMgYWxsIHBhdGhzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHR0bCBUaGUgZHVyYXRpb24gaW4gc2Vjb25kcyBhZnRlciB3aGljaCBhIHJlcXVlc3QgcmVjb3JkIGlzIGRpc2NhcmRlZCBmcm9tIHRoZSBkYXRhYmFzZSwgZGVmYXVsdHMgdG8gMzAwcy5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgQWNjb3VudExvY2tvdXRPcHRpb25zXG4gKiBAcHJvcGVydHkge051bWJlcn0gZHVyYXRpb24gU2V0IHRoZSBkdXJhdGlvbiBpbiBtaW51dGVzIHRoYXQgYSBsb2NrZWQtb3V0IGFjY291bnQgcmVtYWlucyBsb2NrZWQgb3V0IGJlZm9yZSBhdXRvbWF0aWNhbGx5IGJlY29taW5nIHVubG9ja2VkLjxicj48YnI+VmFsaWQgdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gYDBgIGFuZCBsZXNzIHRoYW4gYDEwMDAwMGAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gdGhyZXNob2xkIFNldCB0aGUgbnVtYmVyIG9mIGZhaWxlZCBzaWduLWluIGF0dGVtcHRzIHRoYXQgd2lsbCBjYXVzZSBhIHVzZXIgYWNjb3VudCB0byBiZSBsb2NrZWQuIElmIHRoZSBhY2NvdW50IGlzIGxvY2tlZC4gVGhlIGFjY291bnQgd2lsbCB1bmxvY2sgYWZ0ZXIgdGhlIGR1cmF0aW9uIHNldCBpbiB0aGUgYGR1cmF0aW9uYCBvcHRpb24gaGFzIHBhc3NlZCBhbmQgbm8gZnVydGhlciBsb2dpbiBhdHRlbXB0cyBoYXZlIGJlZW4gbWFkZS48YnI+PGJyPlZhbGlkIHZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIGAwYCBhbmQgbGVzcyB0aGFuIGAxMDAwYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdW5sb2NrT25QYXNzd29yZFJlc2V0IFNldCB0byBgdHJ1ZWAgIGlmIHRoZSBhY2NvdW50IHNob3VsZCBiZSB1bmxvY2tlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgcGFzc3dvcmQgcmVzZXQuPGJyPjxicj5EZWZhdWx0IGlzIGBmYWxzZWAuPGJyPlJlcXVpcmVzIG9wdGlvbnMgYGR1cmF0aW9uYCBhbmQgYHRocmVzaG9sZGAgdG8gYmUgc2V0LlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBQYXNzd29yZFBvbGljeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZG9Ob3RBbGxvd1VzZXJuYW1lIFNldCB0byBgdHJ1ZWAgdG8gZGlzYWxsb3cgdGhlIHVzZXJuYW1lIGFzIHBhcnQgb2YgdGhlIHBhc3N3b3JkLjxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heFBhc3N3b3JkQWdlIFNldCB0aGUgbnVtYmVyIG9mIGRheXMgYWZ0ZXIgd2hpY2ggYSBwYXNzd29yZCBleHBpcmVzLiBMb2dpbiBhdHRlbXB0cyBmYWlsIGlmIHRoZSB1c2VyIGRvZXMgbm90IHJlc2V0IHRoZSBwYXNzd29yZCBiZWZvcmUgZXhwaXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhQYXNzd29yZEhpc3RvcnkgU2V0IHRoZSBudW1iZXIgb2YgcHJldmlvdXMgcGFzc3dvcmQgdGhhdCB3aWxsIG5vdCBiZSBhbGxvd2VkIHRvIGJlIHNldCBhcyBuZXcgcGFzc3dvcmQuIElmIHRoZSBvcHRpb24gaXMgbm90IHNldCBvciBzZXQgdG8gYDBgLCBubyBwcmV2aW91cyBwYXNzd29yZHMgd2lsbCBiZSBjb25zaWRlcmVkLjxicj48YnI+VmFsaWQgdmFsdWVzIGFyZSA+PSBgMGAgYW5kIDw9IGAyMGAuPGJyPkRlZmF1bHQgaXMgYDBgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSByZXNldFBhc3N3b3JkU3VjY2Vzc09uSW52YWxpZEVtYWlsIFNldCB0byBgdHJ1ZWAgaWYgYSByZXF1ZXN0IHRvIHJlc2V0IHRoZSBwYXNzd29yZCBzaG91bGQgcmV0dXJuIGEgc3VjY2VzcyByZXNwb25zZSBldmVuIGlmIHRoZSBwcm92aWRlZCBlbWFpbCBhZGRyZXNzIGlzIGludmFsaWQsIG9yIGBmYWxzZWAgaWYgdGhlIHJlcXVlc3Qgc2hvdWxkIHJldHVybiBhbiBlcnJvciByZXNwb25zZSBpZiB0aGUgZW1haWwgYWRkcmVzcyBpcyBpbnZhbGlkLjxicj48YnI+RGVmYXVsdCBpcyBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJlc2V0VG9rZW5SZXVzZUlmVmFsaWQgU2V0IHRvIGB0cnVlYCBpZiBhIHBhc3N3b3JkIHJlc2V0IHRva2VuIHNob3VsZCBiZSByZXVzZWQgaW4gY2FzZSBhbm90aGVyIHRva2VuIGlzIHJlcXVlc3RlZCBidXQgdGhlcmUgaXMgYSB0b2tlbiB0aGF0IGlzIHN0aWxsIHZhbGlkLCBpLmUuIGhhcyBub3QgZXhwaXJlZC4gVGhpcyBhdm9pZHMgdGhlIG9mdGVuIG9ic2VydmVkIGlzc3VlIHRoYXQgYSB1c2VyIHJlcXVlc3RzIG11bHRpcGxlIGVtYWlscyBhbmQgZG9lcyBub3Qga25vdyB3aGljaCBsaW5rIGNvbnRhaW5zIGEgdmFsaWQgdG9rZW4gYmVjYXVzZSBlYWNoIG5ld2x5IGdlbmVyYXRlZCB0b2tlbiB3b3VsZCBpbnZhbGlkYXRlIHRoZSBwcmV2aW91cyB0b2tlbi48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvbiBTZXQgdGhlIHZhbGlkaXR5IGR1cmF0aW9uIG9mIHRoZSBwYXNzd29yZCByZXNldCB0b2tlbiBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSB0b2tlbiBleHBpcmVzLiBUaGUgdG9rZW4gaXMgdXNlZCBpbiB0aGUgbGluayB0aGF0IGlzIHNldCBpbiB0aGUgZW1haWwuIEFmdGVyIHRoZSB0b2tlbiBleHBpcmVzLCB0aGUgbGluayBiZWNvbWVzIGludmFsaWQgYW5kIGEgbmV3IGxpbmsgaGFzIHRvIGJlIHNlbnQuIElmIHRoZSBvcHRpb24gaXMgbm90IHNldCBvciBzZXQgdG8gYHVuZGVmaW5lZGAsIHRoZW4gdGhlIHRva2VuIG5ldmVyIGV4cGlyZXMuPGJyPjxicj5Gb3IgZXhhbXBsZSwgdG8gZXhwaXJlIHRoZSB0b2tlbiBhZnRlciAyIGhvdXJzLCBzZXQgYSB2YWx1ZSBvZiA3MjAwIHNlY29uZHMgKD0gNjAgc2Vjb25kcyAqIDYwIG1pbnV0ZXMgKiAyIGhvdXJzKS48YnI+PGJyPkRlZmF1bHQgaXMgYHVuZGVmaW5lZGAuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdmFsaWRhdGlvbkVycm9yIFNldCB0aGUgZXJyb3IgbWVzc2FnZSB0byBiZSBzZW50Ljxicj48YnI+RGVmYXVsdCBpcyBgUGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgUGFzc3dvcmQgUG9saWN5IHJlcXVpcmVtZW50cy5gXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB2YWxpZGF0b3JDYWxsYmFjayBTZXQgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB2YWxpZGF0ZSBhIHBhc3N3b3JkIHRvIGJlIGFjY2VwdGVkLjxicj48YnI+SWYgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGB2YWxpZGF0b3JQYXR0ZXJuYCwgdGhlIHBhc3N3b3JkIG11c3QgcGFzcyBib3RoIHRvIGJlIGFjY2VwdGVkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHZhbGlkYXRvclBhdHRlcm4gU2V0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGlvbiBwYXR0ZXJuIGEgcGFzc3dvcmQgbXVzdCBtYXRjaCB0byBiZSBhY2NlcHRlZC48YnI+PGJyPklmIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgdmFsaWRhdG9yQ2FsbGJhY2tgLCB0aGUgcGFzc3dvcmQgbXVzdCBwYXNzIGJvdGggdG8gYmUgYWNjZXB0ZWQuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIEZpbGVVcGxvYWRPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBhbGxvd2VkRmlsZVVybERvbWFpbnMgU2V0cyB0aGUgYWxsb3dlZCBob3N0bmFtZXMgZm9yIGZpbGUgVVJMcyByZWZlcmVuY2VkIGluIFBhcnNlIG9iamVjdHMuIFdoZW4gYSBGaWxlIG9iamVjdCBpbmNsdWRlcyBhIFVSTCwgaXRzIGhvc3RuYW1lIG11c3QgbWF0Y2ggb25lIG9mIHRoZXNlIGVudHJpZXMgdG8gYmUgYWNjZXB0ZWQuIFN1cHBvcnRzIGV4YWN0IGhvc3RuYW1lcyAoZS5nLiwgYCdjZG4uZXhhbXBsZS5jb20nYCkgYW5kIHdpbGRjYXJkIHN1YmRvbWFpbnMgKGUuZy4sIGAnKi5leGFtcGxlLmNvbSdgKS4gVXNlIGBbJyonXWAgdG8gYWxsb3cgYW55IGRvbWFpbi4gVXNlIGBbXWAgdG8gYmxvY2sgYWxsIGZpbGUgVVJMcyAob25seSBuYW1lLWJhc2VkIGZpbGVzIGFsbG93ZWQpLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVGb3JBbm9ueW1vdXNVc2VyIElzIHRydWUgaWYgZmlsZSB1cGxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGFub255bW91cyB1c2Vycy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIgSXMgdHJ1ZSBpZiBmaWxlIHVwbG9hZCBzaG91bGQgYmUgYWxsb3dlZCBmb3IgYXV0aGVudGljYXRlZCB1c2Vycy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRm9yUHVibGljIElzIHRydWUgaWYgZmlsZSB1cGxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGFueW9uZSwgcmVnYXJkbGVzcyBvZiB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gZmlsZUV4dGVuc2lvbnMgU2V0cyB0aGUgYWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIHVwbG9hZGluZyBmaWxlcy4gVGhlIGV4dGVuc2lvbiBpcyBkZWZpbmVkIGFzIGFuIGFycmF5IG9mIGZpbGUgZXh0ZW5zaW9ucywgb3IgYSByZWdleCBwYXR0ZXJuLjxicj48YnI+SXQgaXMgcmVjb21tZW5kZWQgdG8gb25seSBhbGxvdyB0aGUgZmlsZSBleHRlbnNpb25zIHRoYXQgeW91ciBhcHAgYWN0dWFsbHkgbmVlZHMsIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYmxvY2tpbmcgZGFuZ2Vyb3VzIGV4dGVuc2lvbnMuIFRoaXMgYWxsb3dsaXN0IGFwcHJvYWNoIGlzIG1vcmUgc2VjdXJlIGJlY2F1c2UgbmV3IGRhbmdlcm91cyBmaWxlIGV4dGVuc2lvbnMgbWF5IGVtZXJnZSB0aGF0IGFyZSBub3QgY292ZXJlZCBieSB0aGUgZGVmYXVsdCBibG9ja2xpc3QuPGJyPjxicj5UaGUgZGVmYXVsdCBibG9ja3MgdGhlIG1vc3QgY29tbW9uIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSBrbm93biB0byBiZSByZW5kZXJlZCBhcyBhY3RpdmUgY29udGVudCBieSB3ZWIgYnJvd3NlcnMsIHN1Y2ggYXMgSFRNTCwgU1ZHLCBhbmQgWE1MIGZpbGVzLCB3aGljaCBtYXkgYmUgdXNlZCBieSBhbiBhdHRhY2tlciB0byBjb21wcm9taXNlIHRoZSBzZXNzaW9uIHRva2VuIG9mIGFub3RoZXIgdXNlciB2aWEgYWNjZXNzaW5nIHRoZSBicm93c2VyJ3MgbG9jYWwgc3RvcmFnZS4gVGhlIGJsb2NrZWQgZXh0ZW5zaW9ucyBhcmU6IGBodG1sYCwgYGh0bWAsIGBzaHRtbGAsIGB4aHRtbGAsIGB4aHRtbCt4bWxgLCBgeGh0YCwgYHN2Z2AsIGBzdmd6YCwgYHN2Zyt4bWxgLCBgeG1sYCwgYHhzbGAsIGB4c2x0YCwgYHhzbHQreG1sYCwgYHhzZGAsIGBybmdgLCBgcmRmYCwgYHJkZit4bWxgLCBgb3dsYCwgYG1hdGhtbGAsIGBtYXRobWwreG1sYC48YnI+PGJyPkRlZmF1bHRzIHRvIGBbXCJeKD8hKFt4WHNTXT9baEhdW3RUXVttTV1bbExdPyhcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1baEhdW3RUXXxbc1NdW3ZWXVtnR10oW3paXXxcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1bbU1dW2xMXXxbeFhdW3NTXVtsTF1bdFRdPyhcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1bc1NdW2REXXxbclJdW25OXVtnR118W3JSXVtkRF1bZkZdKFxcXFwrW3hYXVttTV1bbExdKT98W29PXVt3V11bbExdfFttTV1bYUFdW3RUXVtoSF1bbU1dW2xMXShcXFxcK1t4WF1bbU1dW2xMXSk/KSQpXCJdYC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRmlsZURvd25sb2FkT3B0aW9uc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVGb3JBbm9ueW1vdXNVc2VyIElzIHRydWUgaWYgZmlsZSBkb3dubG9hZCBzaG91bGQgYmUgYWxsb3dlZCBmb3IgYW5vbnltb3VzIHVzZXJzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciBJcyB0cnVlIGlmIGZpbGUgZG93bmxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGF1dGhlbnRpY2F0ZWQgdXNlcnMuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUZvclB1YmxpYyBJcyB0cnVlIGlmIGZpbGUgZG93bmxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGFueW9uZSwgcmVnYXJkbGVzcyBvZiB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBMb2dMZXZlbFxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBkZWJ1ZyBEZWJ1ZyBsZXZlbFxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBlcnJvciBFcnJvciBsZXZlbCAtIGhpZ2hlc3QgcHJpb3JpdHlcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0gaW5mbyBJbmZvIGxldmVsIC0gZGVmYXVsdFxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBzaWxseSBTaWxseSBsZXZlbCAtIGxvd2VzdCBwcmlvcml0eVxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSB2ZXJib3NlIFZlcmJvc2UgbGV2ZWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0gd2FybiBXYXJuaW5nIGxldmVsXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIExvZ0NsaWVudEV2ZW50XG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBrZXlzIE9wdGlvbmFsIGFycmF5IG9mIGRvdC1ub3RhdGlvbiBwYXRocyB0byBleHRyYWN0IHNwZWNpZmljIGRhdGEgZnJvbSB0aGUgZXZlbnQgb2JqZWN0LiBJZiBub3QgcHJvdmlkZWQgb3IgZW1wdHksIHRoZSBlbnRpcmUgZXZlbnQgb2JqZWN0IHdpbGwgYmUgbG9nZ2VkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvZ0xldmVsIFRoZSBsb2cgbGV2ZWwgdG8gdXNlIGZvciB0aGlzIGV2ZW50LiBTZWUgW0xvZ0xldmVsXShMb2dMZXZlbC5odG1sKSBmb3IgYXZhaWxhYmxlIHZhbHVlcy4gRGVmYXVsdHMgdG8gYCdpbmZvJ2AuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgTW9uZ29EQiBkcml2ZXIgZXZlbnQgbmFtZSB0byBsaXN0ZW4gZm9yLiBTZWUgdGhlIFtNb25nb0RCIGRyaXZlciBldmVudHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cubW9uZ29kYi5jb20vZG9jcy9kcml2ZXJzL25vZGUvY3VycmVudC9mdW5kYW1lbnRhbHMvbW9uaXRvcmluZy8pIGZvciBhdmFpbGFibGUgZXZlbnRzLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBEYXRhYmFzZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWxsb3dQdWJsaWNFeHBsYWluIFNldCB0byBgdHJ1ZWAgdG8gYWxsb3cgYFBhcnNlLlF1ZXJ5LmV4cGxhaW5gIHdpdGhvdXQgbWFzdGVyIGtleS48YnI+PGJyPuKaoO+4jyBFbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgZXhwb3NlIHNlbnNpdGl2ZSBxdWVyeSBwZXJmb3JtYW5jZSBkYXRhIHRvIHVuYXV0aG9yaXplZCB1c2VycyBhbmQgY291bGQgcG90ZW50aWFsbHkgYmUgZXhwbG9pdGVkIGZvciBtYWxpY2lvdXMgcHVycG9zZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXBwTmFtZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHRoYXQgY3JlYXRlZCB0aGlzIE1vbmdvQ2xpZW50IGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGF1dGhNZWNoYW5pc20gVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gdGhhdCBNb25nb0RCIHdpbGwgdXNlIHRvIGF1dGhlbnRpY2F0ZSB0aGUgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QW55fSBhdXRoTWVjaGFuaXNtUHJvcGVydGllcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgcHJvcGVydGllcyBmb3IgdGhlIHNwZWNpZmllZCBhdXRoTWVjaGFuaXNtIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sb24tc2VwYXJhdGVkIGtleS12YWx1ZSBwYWlycy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhdXRoU291cmNlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZGF0YWJhc2UgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIncyBjcmVkZW50aWFscy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYXV0b1NlbGVjdEZhbWlseSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCB3aGV0aGVyIHRoZSBzb2NrZXQgYXR0ZW1wdHMgdG8gY29ubmVjdCB0byBJUHY2IGFuZCBJUHY0IGFkZHJlc3NlcyB1bnRpbCBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIElmIGF2YWlsYWJsZSwgdGhlIGRyaXZlciB3aWxsIHNlbGVjdCB0aGUgZmlyc3QgSVB2NiBhZGRyZXNzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24gYXR0ZW1wdCB0byBmaW5pc2ggYmVmb3JlIHRyeWluZyB0aGUgbmV4dCBhZGRyZXNzIHdoZW4gdXNpbmcgdGhlIGF1dG9TZWxlY3RGYW1pbHkgb3B0aW9uLiBJZiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiAxMCwgdGhlIHZhbHVlIDEwIGlzIHVzZWQgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBiYXRjaFNpemUgVGhlIG51bWJlciBvZiBkb2N1bWVudHMgcGVyIGJhdGNoIGZvciBNb25nb0RCIGN1cnNvciBgZ2V0TW9yZWAgb3BlcmF0aW9ucy4gQSBsb3dlciB2YWx1ZSByZWR1Y2VzIG1lbW9yeSB1c2FnZSBwZXIgYmF0Y2g7IGEgaGlnaGVyIHZhbHVlIHJlZHVjZXMgdGhlIG51bWJlciBvZiBuZXR3b3JrIHJvdW5kLXRyaXBzLlxuICogQHByb3BlcnR5IHtEYXRhYmFzZU9wdGlvbnNDbGllbnRNZXRhZGF0YX0gY2xpZW50TWV0YWRhdGEgQ3VzdG9tIG1ldGFkYXRhIHRvIGFwcGVuZCB0byBkYXRhYmFzZSBjbGllbnQgY29ubmVjdGlvbnMgZm9yIGlkZW50aWZ5aW5nIFBhcnNlIFNlcnZlciBpbnN0YW5jZXMgaW4gZGF0YWJhc2UgbG9ncy4gSWYgc2V0LCB0aGlzIG1ldGFkYXRhIHdpbGwgYmUgdmlzaWJsZSBpbiBkYXRhYmFzZSBsb2dzIGR1cmluZyBjb25uZWN0aW9uIGhhbmRzaGFrZXMuIFRoaXMgY2FuIGhlbHAgd2l0aCBkZWJ1Z2dpbmcgYW5kIG1vbml0b3JpbmcgaW4gZGVwbG95bWVudHMgd2l0aCBtdWx0aXBsZSBkYXRhYmFzZSBjbGllbnRzLiBTZXQgYG5hbWVgIHRvIGlkZW50aWZ5IHlvdXIgYXBwbGljYXRpb24gKGUuZy4sICdNeUFwcCcpIGFuZCBgdmVyc2lvbmAgdG8geW91ciBhcHBsaWNhdGlvbidzIHZlcnNpb24uIExlYXZlIHVuZGVmaW5lZCAoZGVmYXVsdCkgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUgYW5kIGF2b2lkIHRoZSBhZGRpdGlvbmFsIGRhdGEgdHJhbnNmZXIgb3ZlcmhlYWQuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBjb21wcmVzc29ycyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgYW4gYXJyYXkgb3IgY29tbWEtZGVsaW1pdGVkIHN0cmluZyBvZiBjb21wcmVzc29ycyB0byBlbmFibGUgbmV0d29yayBjb21wcmVzc2lvbiBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoaXMgY2xpZW50IGFuZCBhIG1vbmdvZC9tb25nb3MgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge051bWJlcn0gY29ubmVjdFRpbWVvdXRNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgdG8gZXN0YWJsaXNoIGEgc2luZ2xlIFRDUCBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGJlZm9yZSByYWlzaW5nIGFuIGVycm9yLiBTcGVjaWZ5aW5nIDAgZGlzYWJsZXMgdGhlIGNvbm5lY3Rpb24gdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhBdXRoRGF0YVVuaXF1ZW5lc3MgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSB1bmlxdWUgaW5kZXhlcyBvbiB0aGUgYXV0aERhdGEgZmllbGRzIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIGZvciBlYWNoIGNvbmZpZ3VyZWQgYXV0aCBwcm92aWRlciBvbiBzZXJ2ZXIgc3RhcnQsIGluY2x1ZGluZyBgYW5vbnltb3VzYCB3aGVuIGFub255bW91cyB1c2VycyBhcmUgZW5hYmxlZC4gVGhlc2UgaW5kZXhlcyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgY29uY3VycmVudCBzaWdudXBzIHdpdGggdGhlIHNhbWUgYXV0aERhdGEuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXhlcywga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXhlcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gYmUgb3B0aW1pemVkIGZvciB0aGUgaW50ZXJuYWwgdXNhZ2UgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBjcmVhdGVJbmRleFJvbGVOYW1lIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSB1bmlxdWUgaW5kZXggb24gdGhlIG5hbWUgZmllbGQgb2YgdGhlIF9Sb2xlIGNvbGxlY3Rpb24gb24gc2VydmVyIHN0YXJ0LiBTZXQgdG8gYGZhbHNlYCB0byBza2lwIGluZGV4IGNyZWF0aW9uLiBEZWZhdWx0IGlzIGB0cnVlYC48YnI+PGJyPuKaoO+4jyBXaGVuIHNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGZhbHNlYCB0byBtYW51YWxseSBjcmVhdGUgdGhlIGluZGV4LCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgb3RoZXJ3aXNlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpbmRleCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gYmUgb3B0aW1pemVkIGZvciB0aGUgaW50ZXJuYWwgdXNhZ2UgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBjcmVhdGVJbmRleFVzZXJFbWFpbCBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGluZGV4ZXMgb24gdGhlIGVtYWlsIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyRW1haWxDYXNlSW5zZW5zaXRpdmUgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIGNhc2UtaW5zZW5zaXRpdmUgaW5kZXggb24gdGhlIGVtYWlsIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyRW1haWxWZXJpZnlUb2tlbiBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGFuIGluZGV4IG9uIHRoZSBfZW1haWxfdmVyaWZ5X3Rva2VuIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyUGFzc3dvcmRSZXNldFRva2VuIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYW4gaW5kZXggb24gdGhlIF9wZXJpc2hhYmxlX3Rva2VuIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyVXNlcm5hbWUgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBpbmRleGVzIG9uIHRoZSB1c2VybmFtZSBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZUluZGV4VXNlclVzZXJuYW1lQ2FzZUluc2Vuc2l0aXZlIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSBjYXNlLWluc2Vuc2l0aXZlIGluZGV4IG9uIHRoZSB1c2VybmFtZSBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRpcmVjdENvbm5lY3Rpb24gVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBmb3JjZSBhIFNpbmdsZSB0b3BvbG9neSB0eXBlIHdpdGggYSBjb25uZWN0aW9uIHN0cmluZyBjb250YWluaW5nIG9uZSBob3N0LlxuICogQHByb3BlcnR5IHtCb29sZWFufSBkaXNhYmxlSW5kZXhGaWVsZFZhbGlkYXRpb24gU2V0IHRvIGB0cnVlYCB0byBkaXNhYmxlIHZhbGlkYXRpb24gb2YgaW5kZXggZmllbGRzLiBXaGVuIGRpc2FibGVkLCBpbmRleGVzIGNhbiBiZSBjcmVhdGVkIGV2ZW4gaWYgdGhlIGZpZWxkcyBkbyBub3QgZXhpc3QgaW4gdGhlIHNjaGVtYS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gY3JlYXRpbmcgaW5kZXhlcyBvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIGFkZGVkIGxhdGVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVTY2hlbWFIb29rcyBFbmFibGVzIGRhdGFiYXNlIHJlYWwtdGltZSBob29rcyB0byB1cGRhdGUgc2luZ2xlIHNjaGVtYSBjYWNoZS4gU2V0IHRvIGB0cnVlYCBpZiB1c2luZyBtdWx0aXBsZSBQYXJzZSBTZXJ2ZXJzIGluc3RhbmNlcyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgZGF0YWJhc2UuIEZhaWxpbmcgdG8gZG8gc28gd2lsbCBjYXVzZSBhIHNjaGVtYSBjaGFuZ2UgdG8gbm90IHByb3BhZ2F0ZSB0byBhbGwgaW5zdGFuY2VzIGFuZCByZS1zeW5jaW5nIHdpbGwgb25seSBoYXBwZW4gd2hlbiB0aGUgaW5zdGFuY2VzIHJlc3RhcnQuIFRvIHVzZSB0aGlzIGZlYXR1cmUgd2l0aCBNb25nb0RCLCBhIHJlcGxpY2Egc2V0IGNsdXN0ZXIgd2l0aCBbY2hhbmdlIHN0cmVhbV0oaHR0cHM6Ly9kb2NzLm1vbmdvZGIuY29tL21hbnVhbC9jaGFuZ2VTdHJlYW1zLyNhdmFpbGFiaWxpdHkpIHN1cHBvcnQgaXMgcmVxdWlyZWQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGZvcmNlU2VydmVyT2JqZWN0SWQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBmb3JjZSBzZXJ2ZXIgdG8gYXNzaWduIF9pZCB2YWx1ZXMgaW5zdGVhZCBvZiBkcml2ZXIuXG4gKiBAcHJvcGVydHkge051bWJlcn0gaGVhcnRiZWF0RnJlcXVlbmN5TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBmcmVxdWVuY3kgaW4gbWlsbGlzZWNvbmRzIGF0IHdoaWNoIHRoZSBkcml2ZXIgY2hlY2tzIHRoZSBzdGF0ZSBvZiB0aGUgTW9uZ29EQiBkZXBsb3ltZW50LlxuICogQHByb3BlcnR5IHtCb29sZWFufSBsb2FkQmFsYW5jZWQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBpbnN0cnVjdCB0aGUgZHJpdmVyIGl0IGlzIGNvbm5lY3RpbmcgdG8gYSBsb2FkIGJhbGFuY2VyIGZyb250aW5nIGEgbW9uZ29zIGxpa2Ugc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBsb2NhbFRocmVzaG9sZE1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgc2l6ZSAoaW4gbWlsbGlzZWNvbmRzKSBvZiB0aGUgbGF0ZW5jeSB3aW5kb3cgZm9yIHNlbGVjdGluZyBhbW9uZyBtdWx0aXBsZSBzdWl0YWJsZSBNb25nb0RCIGluc3RhbmNlcy5cbiAqIEBwcm9wZXJ0eSB7TG9nQ2xpZW50RXZlbnRbXX0gbG9nQ2xpZW50RXZlbnRzIEFuIGFycmF5IG9mIE1vbmdvREIgY2xpZW50IGV2ZW50IGNvbmZpZ3VyYXRpb25zIHRvIGVuYWJsZSBsb2dnaW5nIG9mIHNwZWNpZmljIGV2ZW50cy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhDb25uZWN0aW5nIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBtYXkgYmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZXN0YWJsaXNoZWQgY29uY3VycmVudGx5IGJ5IHRoZSBjb25uZWN0aW9uIHBvb2wuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4SWRsZVRpbWVNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGF0IGEgY29ubmVjdGlvbiBjYW4gcmVtYWluIGlkbGUgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbCBiZWZvcmUgYmVpbmcgcmVtb3ZlZCBhbmQgY2xvc2VkLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heFBvb2xTaXplIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuZWQsIGNhY2hlZCwgcmVhZHktdG8tdXNlIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG1haW50YWluZWQgYnkgdGhlIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhTdGFsZW5lc3NTZWNvbmRzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtYXhpbXVtIHJlcGxpY2F0aW9uIGxhZyBmb3IgcmVhZHMgZnJvbSBzZWNvbmRhcnkgbm9kZXMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4VGltZU1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IGEgY3VtdWxhdGl2ZSB0aW1lIGxpbWl0IGluIG1pbGxpc2Vjb25kcyBmb3IgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGEgY3Vyc29yLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1pblBvb2xTaXplIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtaW5pbXVtIG51bWJlciBvZiBvcGVuZWQsIGNhY2hlZCwgcmVhZHktdG8tdXNlIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG1haW50YWluZWQgYnkgdGhlIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm94eUhvc3QgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBjb25maWd1cmUgYSBTb2NrczUgcHJveHkgaG9zdCB1c2VkIGZvciBjcmVhdGluZyBUQ1AgY29ubmVjdGlvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcHJveHlQYXNzd29yZCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGNvbmZpZ3VyZSBhIFNvY2tzNSBwcm94eSBwYXNzd29yZCB3aGVuIHRoZSBwcm94eSByZXF1aXJlcyB1c2VybmFtZS9wYXNzd29yZCBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwcm94eVBvcnQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBjb25maWd1cmUgYSBTb2NrczUgcHJveHkgcG9ydCB1c2VkIGZvciBjcmVhdGluZyBUQ1AgY29ubmVjdGlvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcHJveHlVc2VybmFtZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGNvbmZpZ3VyZSBhIFNvY2tzNSBwcm94eSB1c2VybmFtZSB3aGVuIHRoZSBwcm94eSByZXF1aXJlcyB1c2VybmFtZS9wYXNzd29yZCBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZWFkQ29uY2VybkxldmVsIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbGV2ZWwgb2YgaXNvbGF0aW9uLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWRQcmVmZXJlbmNlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcmVhZCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtBbnlbXX0gcmVhZFByZWZlcmVuY2VUYWdzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgdGFncyBkb2N1bWVudCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbG9uLXNlcGFyYXRlZCBrZXktdmFsdWUgcGFpcnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVwbGljYVNldCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHJlcGxpY2Egc2V0LCBpZiB0aGUgbW9uZ29kIGlzIGEgbWVtYmVyIG9mIGEgcmVwbGljYSBzZXQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJldHJ5UmVhZHMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBlbmFibGUgcmV0cnlhYmxlIHJlYWRzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSByZXRyeVdyaXRlcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCB3aGV0aGVyIHRvIHJldHJ5IGZhaWxlZCB3cml0ZXMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc2NoZW1hQ2FjaGVUdGwgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNjaGVtYSBjYWNoZSBleHBpcmVzIGFuZCB3aWxsIGJlIHJlZmV0Y2hlZCBmcm9tIHRoZSBkYXRhYmFzZS4gVXNlIHRoaXMgb3B0aW9uIGlmIHVzaW5nIG11bHRpcGxlIFBhcnNlIFNlcnZlcnMgaW5zdGFuY2VzIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBkYXRhYmFzZS4gQSBsb3cgZHVyYXRpb24gd2lsbCBjYXVzZSB0aGUgc2NoZW1hIGNhY2hlIHRvIGJlIHVwZGF0ZWQgdG9vIG9mdGVuLCBjYXVzaW5nIHVubmVjZXNzYXJ5IGRhdGFiYXNlIHJlYWRzLiBBIGhpZ2ggZHVyYXRpb24gd2lsbCBjYXVzZSB0aGUgc2NoZW1hIHRvIGJlIHVwZGF0ZWQgdG9vIHJhcmVseSwgaW5jcmVhc2luZyB0aGUgdGltZSByZXF1aXJlZCB1bnRpbCBzY2hlbWEgY2hhbmdlcyBwcm9wYWdhdGUgdG8gYWxsIHNlcnZlciBpbnN0YW5jZXMuIFRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBvciBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpb24gYGVuYWJsZVNjaGVtYUhvb2tzYC4gRGVmYXVsdCBpcyBpbmZpbml0ZSB3aGljaCBtZWFucyB0aGUgc2NoZW1hIGNhY2hlIG5ldmVyIGV4cGlyZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyTW9uaXRvcmluZ01vZGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBpbnN0cnVjdCB0aGUgZHJpdmVyIG1vbml0b3JzIHRvIHVzZSBhIHNwZWNpZmljIG1vbml0b3JpbmcgbW9kZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzZXJ2ZXJTZWxlY3Rpb25UaW1lb3V0TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIGEgc2VydmVyIHRvIGJlIGNvbnNpZGVyZWQgc3VpdGFibGUgZm9yIHNlbGVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzb2NrZXRUaW1lb3V0TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBzcGVudCBhdHRlbXB0aW5nIHRvIHNlbmQgb3IgcmVjZWl2ZSBvbiBhIHNvY2tldCBiZWZvcmUgdGltaW5nIG91dC4gU3BlY2lmeWluZyAwIG1lYW5zIG5vIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc3J2TWF4SG9zdHMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBob3N0cyB0byBjb25uZWN0IHRvIHdoZW4gdXNpbmcgYW4gc3J2IGNvbm5lY3Rpb24gc3RyaW5nLCBhIHNldHRpbmcgb2YgMCBtZWFucyB1bmxpbWl0ZWQgaG9zdHMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc3J2U2VydmljZU5hbWUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBtb2RpZnkgdGhlIHNydiBVUkkgc2VydmljZSBuYW1lLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBzc2wgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBlbmFibGUgb3IgZGlzYWJsZSBUTFMvU1NMIGZvciB0aGUgY29ubmVjdGlvbiAoZXF1aXZhbGVudCB0byB0bHMgb3B0aW9uKS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdGxzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZW5hYmxlIG9yIGRpc2FibGUgVExTL1NTTCBmb3IgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHRsc0FsbG93SW52YWxpZENlcnRpZmljYXRlcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGJ5cGFzcyB2YWxpZGF0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgcHJlc2VudGVkIGJ5IHRoZSBtb25nb2QvbW9uZ29zIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB0bHNBbGxvd0ludmFsaWRIb3N0bmFtZXMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBkaXNhYmxlIGhvc3RuYW1lIHZhbGlkYXRpb24gb2YgdGhlIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSB0aGUgbW9uZ29kL21vbmdvcyBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0bHNDQUZpbGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBhIGxvY2FsIC5wZW0gZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSByb290IGNlcnRpZmljYXRlIGNoYWluIGZyb20gdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0bHNDZXJ0aWZpY2F0ZUtleUZpbGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBhIGxvY2FsIC5wZW0gZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGllbnQncyBUTFMvU1NMIGNlcnRpZmljYXRlIGFuZCBrZXkuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdGxzQ2VydGlmaWNhdGVLZXlGaWxlUGFzc3dvcmQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSB0bHNDZXJ0aWZpY2F0ZUtleUZpbGUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHRsc0luc2VjdXJlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZGlzYWJsZSB2YXJpb3VzIGNlcnRpZmljYXRlIHZhbGlkYXRpb25zLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHdhaXRRdWV1ZVRpbWVvdXRNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCBhIHRocmVhZCBjYW4gd2FpdCBmb3IgYSBjb25uZWN0aW9uIHRvIGJlY29tZSBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge051bWJlcn0gemxpYkNvbXByZXNzaW9uTGV2ZWwgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpZiB1c2luZyB6bGliIGZvciBuZXR3b3JrIGNvbXByZXNzaW9uICgwLTkpLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBEYXRhYmFzZU9wdGlvbnNDbGllbnRNZXRhZGF0YVxuICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgdG8gaWRlbnRpZnkgeW91ciBhcHBsaWNhdGlvbiBpbiBkYXRhYmFzZSBsb2dzIChlLmcuLCAnTXlBcHAnKS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHlvdXIgYXBwbGljYXRpb24gKGUuZy4sICcxLjAuMCcpLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBBdXRoQWRhcHRlclxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVkIElzIGB0cnVlYCBpZiB0aGUgYXV0aCBhZGFwdGVyIGlzIGVuYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBMb2dMZXZlbHNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjbG91ZEZ1bmN0aW9uRXJyb3IgTG9nIGxldmVsIHVzZWQgYnkgdGhlIENsb3VkIENvZGUgRnVuY3Rpb25zIG9uIGVycm9yLiBEZWZhdWx0IGlzIGBlcnJvcmAuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGNsb3VkRnVuY3Rpb25TdWNjZXNzIExvZyBsZXZlbCB1c2VkIGJ5IHRoZSBDbG91ZCBDb2RlIEZ1bmN0aW9ucyBvbiBzdWNjZXNzLiBEZWZhdWx0IGlzIGBpbmZvYC4gU2VlIFtMb2dMZXZlbF0oTG9nTGV2ZWwuaHRtbCkgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2lnbnVwVXNlcm5hbWVUYWtlbiBMb2cgbGV2ZWwgdXNlZCB3aGVuIGEgc2lnbi11cCBmYWlscyBiZWNhdXNlIHRoZSB1c2VybmFtZSBhbHJlYWR5IGV4aXN0cy4gRGVmYXVsdCBpcyBgaW5mb2AuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRyaWdnZXJBZnRlciBMb2cgbGV2ZWwgdXNlZCBieSB0aGUgQ2xvdWQgQ29kZSBUcmlnZ2VycyBgYWZ0ZXJTYXZlYCwgYGFmdGVyRGVsZXRlYCwgYGFmdGVyRmluZGAsIGBhZnRlckxvZ291dGAuIERlZmF1bHQgaXMgYGluZm9gLiBTZWUgW0xvZ0xldmVsXShMb2dMZXZlbC5odG1sKSBmb3IgYXZhaWxhYmxlIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0cmlnZ2VyQmVmb3JlRXJyb3IgTG9nIGxldmVsIHVzZWQgYnkgdGhlIENsb3VkIENvZGUgVHJpZ2dlcnMgYGJlZm9yZVNhdmVgLCBgYmVmb3JlRGVsZXRlYCwgYGJlZm9yZUZpbmRgLCBgYmVmb3JlTG9naW5gIG9uIGVycm9yLiBEZWZhdWx0IGlzIGBlcnJvcmAuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRyaWdnZXJCZWZvcmVTdWNjZXNzIExvZyBsZXZlbCB1c2VkIGJ5IHRoZSBDbG91ZCBDb2RlIFRyaWdnZXJzIGBiZWZvcmVTYXZlYCwgYGJlZm9yZURlbGV0ZWAsIGBiZWZvcmVGaW5kYCwgYGJlZm9yZUxvZ2luYCBvbiBzdWNjZXNzLiBEZWZhdWx0IGlzIGBpbmZvYC4gU2VlIFtMb2dMZXZlbF0oTG9nTGV2ZWwuaHRtbCkgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuXG4gKi9cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQSIsImlnbm9yZUxpc3QiOltdfQ==
|
|
388
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL09wdGlvbnMvZG9jcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBpbnRlcmZhY2UgU2NoZW1hT3B0aW9uc1xuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gYWZ0ZXJNaWdyYXRpb24gRXhlY3V0ZSBhIGNhbGxiYWNrIGFmdGVyIHJ1bm5pbmcgc2NoZW1hIG1pZ3JhdGlvbnMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBiZWZvcmVNaWdyYXRpb24gRXhlY3V0ZSBhIGNhbGxiYWNrIGJlZm9yZSBydW5uaW5nIHNjaGVtYSBtaWdyYXRpb25zLlxuICogQHByb3BlcnR5IHtBbnl9IGRlZmluaXRpb25zIFJlc3QgcmVwcmVzZW50YXRpb24gb24gUGFyc2UuU2NoZW1hIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9yZXN0L2d1aWRlLyNhZGRpbmctYS1zY2hlbWFcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGVsZXRlRXh0cmFGaWVsZHMgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGRlbGV0ZSBhbnkgZmllbGRzIG5vdCBkZWZpbmVkIGluIGEgc2NoZW1hIGRlZmluaXRpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGtlZXBVbmtub3duSW5kZXhlcyAoT3B0aW9uYWwpIEtlZXAgaW5kZXhlcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBkYXRhYmFzZSBidXQgbm90IGRlZmluZWQgaW4gdGhlIHNjaGVtYS4gU2V0IHRoaXMgdG8gYHRydWVgIGlmIHlvdSBhcmUgYWRkaW5nIGluZGV4ZXMgbWFudWFsbHksIHNvIHRoYXQgdGhleSB3b24ndCBiZSByZW1vdmVkIHdoZW4gcnVubmluZyBzY2hlbWEgbWlncmF0aW9uLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGxvY2tTY2hlbWFzIElzIHRydWUgaWYgUGFyc2UgU2VydmVyIHdpbGwgcmVqZWN0IGFueSBhdHRlbXB0cyB0byBtb2RpZnkgdGhlIHNjaGVtYSB3aGlsZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJlY3JlYXRlTW9kaWZpZWRGaWVsZHMgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIHJlY3JlYXRlIGFueSBmaWVsZHMgdGhhdCBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIGN1cnJlbnQgZGF0YWJhc2Ugc2NoZW1hIGFuZCB0aGVzY2hlbWEgZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc3RyaWN0IElzIHRydWUgaWYgUGFyc2UgU2VydmVyIHNob3VsZCBleGl0IGlmIHNjaGVtYSB1cGRhdGUgZmFpbC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUGFyc2VTZXJ2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge0FjY291bnRMb2Nrb3V0T3B0aW9uc30gYWNjb3VudExvY2tvdXQgVGhlIGFjY291bnQgbG9ja291dCBwb2xpY3kgZm9yIGZhaWxlZCBsb2dpbiBhdHRlbXB0cy48YnI+PGJyPk5vdGU6IFNldHRpbmcgYSB1c2VyJ3MgQUNMIHRvIGFuIGVtcHR5IG9iamVjdCBge31gIHZpYSBtYXN0ZXIga2V5IGlzIGEgc2VwYXJhdGUgbWVjaGFuaXNtIHRoYXQgb25seSBwcmV2ZW50cyBuZXcgbG9naW5zOyBpdCBkb2VzIG5vdCBpbnZhbGlkYXRlIGV4aXN0aW5nIHNlc3Npb24gdG9rZW5zLiBUbyBpbW1lZGlhdGVseSByZXZva2UgYSB1c2VyJ3MgYWNjZXNzLCBkZXN0cm95IHRoZWlyIHNlc3Npb25zIHZpYSBtYXN0ZXIga2V5IGluIGFkZGl0aW9uIHRvIHNldHRpbmcgdGhlIEFDTC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIEVuYWJsZSAob3IgZGlzYWJsZSkgY2xpZW50IGNsYXNzIGNyZWF0aW9uLCBkZWZhdWx0cyB0byBmYWxzZVxuICogQHByb3BlcnR5IHtCb29sZWFufSBhbGxvd0N1c3RvbU9iamVjdElkIEVuYWJsZSAob3IgZGlzYWJsZSkgY3VzdG9tIG9iamVjdElkXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4gRGVwcmVjYXRlZC4gVGhpcyBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIEF1dGggcHJvdmlkZXJzIGFyZSBhbHdheXMgdmFsaWRhdGVkIG9uIGxvZ2luLiBPbiB1cGRhdGUsIGlmIHRoaXMgaXMgc2V0IHRvIGB0cnVlYCwgYXV0aCBwcm92aWRlcnMgYXJlIG9ubHkgcmUtdmFsaWRhdGVkIHdoZW4gdGhlIGF1dGggZGF0YSBoYXMgY2hhbmdlZC4gSWYgdGhpcyBpcyBzZXQgdG8gYGZhbHNlYCwgYXV0aCBwcm92aWRlcnMgYXJlIHJlLXZhbGlkYXRlZCBvbiBldmVyeSB1cGRhdGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBhbGxvd0hlYWRlcnMgQWRkIGhlYWRlcnMgdG8gQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1xuICogQHByb3BlcnR5IHtTdHJpbmd8U3RyaW5nW119IGFsbG93T3JpZ2luIFNldHMgb3JpZ2lucyBmb3IgQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luLiBUaGlzIGNhbiBiZSBhIHN0cmluZyBmb3IgYSBzaW5nbGUgb3JpZ2luIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MgZm9yIG11bHRpcGxlIG9yaWdpbnMuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8QW5hbHl0aWNzQWRhcHRlcj59IGFuYWx5dGljc0FkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBhbmFseXRpY3NcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhcHBJZCBZb3VyIFBhcnNlIEFwcGxpY2F0aW9uIElEXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXBwTmFtZSBTZXRzIHRoZSBhcHAgbmFtZVxuICogQHByb3BlcnR5IHtPYmplY3R9IGF1dGggQ29uZmlndXJhdGlvbiBmb3IgeW91ciBhdXRoZW50aWNhdGlvbiBwcm92aWRlcnMsIGFzIHN0cmluZ2lmaWVkIEpTT04uIFNlZSBodHRwOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9wYXJzZS1zZXJ2ZXIvZ3VpZGUvI29hdXRoLWFuZC0zcmQtcGFydHktYXV0aGVudGljYXRpb248YnI+PGJyPlByb3ZpZGVyIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY29udGFpbiBvbmx5IGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzIChgL15bQS1aYS16XVtBLVphLXowLTlfXSokL2ApLiBUaGlzIGlzIGJlY2F1c2UgZWFjaCBwcm92aWRlciBuYW1lIGlzIHVzZWQgdG8gY29uc3RydWN0IGEgZGF0YWJhc2UgZmllbGQgKGBfYXV0aF9kYXRhXzxwcm92aWRlcj5gKSwgd2hpY2ggbXVzdCBjb21wbHkgd2l0aCBQYXJzZSBTZXJ2ZXIncyBmaWVsZCBuYW1pbmcgcnVsZXMuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8Q2FjaGVBZGFwdGVyPn0gY2FjaGVBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgY2FjaGVcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjYWNoZU1heFNpemUgU2V0cyB0aGUgbWF4aW11bSBzaXplIGZvciB0aGUgaW4gbWVtb3J5IGNhY2hlLCBkZWZhdWx0cyB0byAxMDAwMFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGNhY2hlVFRMIFNldHMgdGhlIFRUTCBmb3IgdGhlIGluIG1lbW9yeSBjYWNoZSAoaW4gbXMpLCBkZWZhdWx0cyB0byA1MDAwICg1IHNlY29uZHMpXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY2xpZW50S2V5IEtleSBmb3IgaU9TLCBNYWNPUywgdHZPUyBjbGllbnRzXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY2xvdWQgRnVsbCBwYXRoIHRvIHlvdXIgY2xvdWQgY29kZSBtYWluLmpzXG4gKiBAcHJvcGVydHkge051bWJlcnxCb29sZWFufSBjbHVzdGVyIFJ1biB3aXRoIGNsdXN0ZXIsIG9wdGlvbmFsbHkgc2V0IHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGRlZmF1bHQgdG8gb3MuY3B1cygpLmxlbmd0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGNvbGxlY3Rpb25QcmVmaXggQSBjb2xsZWN0aW9uIHByZWZpeCBmb3IgdGhlIGNsYXNzZXNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29udmVydEVtYWlsVG9Mb3dlcmNhc2UgT3B0aW9uYWwuIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBgZW1haWxgIHByb3BlcnR5IG9mIGEgdXNlciBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIENvbnNlcXVlbnRseSwgcXVlcmllcyBtdXN0IG1hdGNoIHRoZSBjYXNlIGFzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UsIHdoaWNoIHdvdWxkIGJlIGxvd2VyY2FzZSBpbiB0aGlzIHNjZW5hcmlvLiBJZiBgZmFsc2VgLCB0aGUgYGVtYWlsYCBwcm9wZXJ0eSBpcyBzdG9yZWQgYXMgc2V0LCB3aXRob3V0IGFueSBjYXNlIG1vZGlmaWNhdGlvbnMuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29udmVydFVzZXJuYW1lVG9Mb3dlcmNhc2UgT3B0aW9uYWwuIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBgdXNlcm5hbWVgIHByb3BlcnR5IG9mIGEgdXNlciBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIENvbnNlcXVlbnRseSwgcXVlcmllcyBtdXN0IG1hdGNoIHRoZSBjYXNlIGFzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UsIHdoaWNoIHdvdWxkIGJlIGxvd2VyY2FzZSBpbiB0aGlzIHNjZW5hcmlvLiBJZiBgZmFsc2VgLCB0aGUgYHVzZXJuYW1lYCBwcm9wZXJ0eSBpcyBzdG9yZWQgYXMgc2V0LCB3aXRob3V0IGFueSBjYXNlIG1vZGlmaWNhdGlvbnMuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Q3VzdG9tUGFnZXNPcHRpb25zfSBjdXN0b21QYWdlcyBjdXN0b20gcGFnZXMgZm9yIHBhc3N3b3JkIHZhbGlkYXRpb24gYW5kIHJlc2V0XG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8U3RvcmFnZUFkYXB0ZXI+fSBkYXRhYmFzZUFkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBkYXRhYmFzZTsgYW55IG9wdGlvbnMgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgZGVzY3JpYmVkIGhlcmUgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgZGF0YWJhc2UgY2xpZW50LlxuICogQHByb3BlcnR5IHtEYXRhYmFzZU9wdGlvbnN9IGRhdGFiYXNlT3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGRhdGFiYXNlIGNsaWVudFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGRhdGFiYXNlVVJJIFRoZSBmdWxsIFVSSSB0byB5b3VyIGRhdGFiYXNlLiBTdXBwb3J0ZWQgZGF0YWJhc2VzIGFyZSBtb25nb2RiIG9yIHBvc3RncmVzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGRlZmF1bHRMaW1pdCBEZWZhdWx0IHZhbHVlIGZvciBsaW1pdCBvcHRpb24gb24gcXVlcmllcywgZGVmYXVsdHMgdG8gYDEwMGAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRpcmVjdEFjY2VzcyBTZXQgdG8gYHRydWVgIGlmIFBhcnNlIHJlcXVlc3RzIHdpdGhpbiB0aGUgc2FtZSBOb2RlLmpzIGVudmlyb25tZW50IGFzIFBhcnNlIFNlcnZlciBzaG91bGQgYmUgcm91dGVkIHRvIFBhcnNlIFNlcnZlciBkaXJlY3RseSBpbnN0ZWFkIG9mIHZpYSB0aGUgSFRUUCBpbnRlcmZhY2UuIERlZmF1bHQgaXMgYGZhbHNlYC48YnI+PGJyPklmIHNldCB0byBgZmFsc2VgIHRoZW4gUGFyc2UgcmVxdWVzdHMgd2l0aGluIHRoZSBzYW1lIE5vZGUuanMgZW52aXJvbm1lbnQgYXMgUGFyc2UgU2VydmVyIGFyZSBleGVjdXRlZCBhcyBIVFRQIHJlcXVlc3RzIHNlbnQgdG8gUGFyc2UgU2VydmVyIHZpYSB0aGUgYHNlcnZlclVSTGAuIEZvciBleGFtcGxlLCBhIGBQYXJzZS5RdWVyeWAgaW4gQ2xvdWQgQ29kZSBpcyBjYWxsaW5nIFBhcnNlIFNlcnZlciB2aWEgYSBIVFRQIHJlcXVlc3QuIFRoZSBzZXJ2ZXIgaXMgZXNzZW50aWFsbHkgbWFraW5nIGEgSFRUUCByZXF1ZXN0IHRvIGl0c2VsZiwgdW5uZWNlc3NhcmlseSB1c2luZyBuZXR3b3JrIHJlc291cmNlcyBzdWNoIGFzIG5ldHdvcmsgcG9ydHMuPGJyPjxicj7imqDvuI8gSW4gZW52aXJvbm1lbnRzIHdoZXJlIG11bHRpcGxlIFBhcnNlIFNlcnZlciBpbnN0YW5jZXMgcnVuIGJlaGluZCBhIGxvYWQgYmFsYW5jZXIgYW5kIFBhcnNlIHJlcXVlc3RzIHdpdGhpbiB0aGUgY3VycmVudCBOb2RlLmpzIGVudmlyb25tZW50IHNob3VsZCBiZSByb3V0ZWQgdmlhIHRoZSBsb2FkIGJhbGFuY2VyIGFuZCBkaXN0cmlidXRlZCBhcyBIVFRQIHJlcXVlc3RzIGFtb25nIGFsbCBpbnN0YW5jZXMgdmlhIHRoZSBgc2VydmVyVVJMYCwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZG90TmV0S2V5IEtleSBmb3IgVW5pdHkgYW5kIC5OZXQgU0RLXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8TWFpbEFkYXB0ZXI+fSBlbWFpbEFkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIGVtYWlsIHNlbmRpbmdcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW1haWxWZXJpZnlTdWNjZXNzT25JbnZhbGlkRW1haWwgU2V0IHRvIGB0cnVlYCBpZiBhIHJlcXVlc3QgdG8gdmVyaWZ5IHRoZSBlbWFpbCBzaG91bGQgcmV0dXJuIGEgc3VjY2VzcyByZXNwb25zZSBldmVuIGlmIHRoZSBwcm92aWRlZCBlbWFpbCBhZGRyZXNzIGRvZXMgbm90IGJlbG9uZyB0byBhIHZlcmlmaWFibGUgYWNjb3VudCwgZm9yIGV4YW1wbGUgYmVjYXVzZSBpdCBpcyB1bmtub3duIG9yIGFscmVhZHkgdmVyaWZpZWQsIG9yIGBmYWxzZWAgaWYgdGhlIHJlcXVlc3Qgc2hvdWxkIHJldHVybiBhbiBlcnJvciByZXNwb25zZSBpbiB0aG9zZSBjYXNlcy48YnI+PGJyPkRlZmF1bHQgaXMgYHRydWVgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkIFNldCB0byBgdHJ1ZWAgaWYgYSBlbWFpbCB2ZXJpZmljYXRpb24gdG9rZW4gc2hvdWxkIGJlIHJldXNlZCBpbiBjYXNlIGFub3RoZXIgdG9rZW4gaXMgcmVxdWVzdGVkIGJ1dCB0aGVyZSBpcyBhIHRva2VuIHRoYXQgaXMgc3RpbGwgdmFsaWQsIGkuZS4gaGFzIG5vdCBleHBpcmVkLiBUaGlzIGF2b2lkcyB0aGUgb2Z0ZW4gb2JzZXJ2ZWQgaXNzdWUgdGhhdCBhIHVzZXIgcmVxdWVzdHMgbXVsdGlwbGUgZW1haWxzIGFuZCBkb2VzIG5vdCBrbm93IHdoaWNoIGxpbmsgY29udGFpbnMgYSB2YWxpZCB0b2tlbiBiZWNhdXNlIGVhY2ggbmV3bHkgZ2VuZXJhdGVkIHRva2VuIHdvdWxkIGludmFsaWRhdGUgdGhlIHByZXZpb3VzIHRva2VuLjxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uIFNldCB0aGUgdmFsaWRpdHkgZHVyYXRpb24gb2YgdGhlIGVtYWlsIHZlcmlmaWNhdGlvbiB0b2tlbiBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSB0b2tlbiBleHBpcmVzLiBUaGUgdG9rZW4gaXMgdXNlZCBpbiB0aGUgbGluayB0aGF0IGlzIHNldCBpbiB0aGUgZW1haWwuIEFmdGVyIHRoZSB0b2tlbiBleHBpcmVzLCB0aGUgbGluayBiZWNvbWVzIGludmFsaWQgYW5kIGEgbmV3IGxpbmsgaGFzIHRvIGJlIHNlbnQuIElmIHRoZSBvcHRpb24gaXMgbm90IHNldCBvciBzZXQgdG8gYHVuZGVmaW5lZGAsIHRoZW4gdGhlIHRva2VuIG5ldmVyIGV4cGlyZXMuPGJyPjxicj5Gb3IgZXhhbXBsZSwgdG8gZXhwaXJlIHRoZSB0b2tlbiBhZnRlciAyIGhvdXJzLCBzZXQgYSB2YWx1ZSBvZiA3MjAwIHNlY29uZHMgKD0gNjAgc2Vjb25kcyAqIDYwIG1pbnV0ZXMgKiAyIGhvdXJzKS48YnI+PGJyPkRlZmF1bHQgaXMgYHVuZGVmaW5lZGAuPGJyPlJlcXVpcmVzIG9wdGlvbiBgdmVyaWZ5VXNlckVtYWlsczogdHJ1ZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUFub255bW91c1VzZXJzIEVuYWJsZSAob3IgZGlzYWJsZSkgYW5vbnltb3VzIHVzZXJzLCBkZWZhdWx0cyB0byB0cnVlXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUNvbGxhdGlvbkNhc2VDb21wYXJpc29uIE9wdGlvbmFsLiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgY29sbGF0aW9uIHJ1bGUgb2YgY2FzZSBjb21wYXJpc29uIGZvciBxdWVyaWVzIGFuZCBpbmRleGVzIGlzIGVuYWJsZWQuIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBydW4gUGFyc2UgU2VydmVyIHdpdGggTW9uZ29EQiBBdGxhcyBTZXJ2ZXJsZXNzIG9yIEFXUyBBbWF6b24gRG9jdW1lbnREQi4gSWYgYGZhbHNlYCwgdGhlIGNvbGxhdGlvbiBydWxlIG9mIGNhc2UgY29tcGFyaXNvbiBpcyBkaXNhYmxlZC4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVFeHByZXNzRXJyb3JIYW5kbGVyIEVuYWJsZXMgdGhlIGRlZmF1bHQgZXhwcmVzcyBlcnJvciBoYW5kbGVyIGZvciBhbGwgZXJyb3JzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUluc2VjdXJlQXV0aEFkYXB0ZXJzIE9wdGlvbmFsLiBFbmFibGVzIGluc2VjdXJlIGF1dGhlbnRpY2F0aW9uIGFkYXB0ZXJzLiBJbnNlY3VyZSBhdXRoIGFkYXB0ZXJzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlUHJvZHVjdFB1cmNoYXNlTGVnYWN5QXBpIERlcHJlY2F0ZWQuIEVuYWJsZXMgdGhlIGxlZ2FjeSBwcm9kdWN0IHB1cmNoYXNlIEFQSSBpbmNsdWRpbmcgdGhlIGBfUHJvZHVjdGAgY2xhc3MgYW5kIHRoZSBgL3ZhbGlkYXRlX3B1cmNoYXNlYCBlbmRwb2ludC4gVGhpcyBpcyBhbiB1bmRvY3VtZW50ZWQsIHVubWFpbnRhaW5lZCBsZWdhY3kgZmVhdHVyZSBpbmhlcml0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgUGFyc2UgcGxhdGZvcm0gdGhhdCBtYXkgbm90IGZ1bmN0aW9uIGFzIGV4cGVjdGVkLiBXZSBzdHJvbmdseSBhZHZpc2UgYWdhaW5zdCB1c2luZyBpdC4gSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZVNhbml0aXplZEVycm9yUmVzcG9uc2UgSWYgc2V0IHRvIGB0cnVlYCwgZXJyb3IgZGV0YWlscyBhcmUgcmVtb3ZlZCBmcm9tIGVycm9yIG1lc3NhZ2VzIGluIHJlc3BvbnNlcyB0byBjbGllbnQgcmVxdWVzdHMsIGFuZCBpbnN0ZWFkIGEgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIGlzIHNlbnQuIERlZmF1bHQgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVuY3J5cHRpb25LZXkgS2V5IGZvciBlbmNyeXB0aW5nIHlvdXIgZmlsZXNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5mb3JjZVByaXZhdGVVc2VycyBTZXQgdG8gdHJ1ZSBpZiBuZXcgdXNlcnMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aG91dCBwdWJsaWMgcmVhZCBhbmQgd3JpdGUgYWNjZXNzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBleHBpcmVJbmFjdGl2ZVNlc3Npb25zIFNldHMgd2hldGhlciB3ZSBzaG91bGQgZXhwaXJlIHRoZSBpbmFjdGl2ZSBzZXNzaW9ucywgZGVmYXVsdHMgdG8gdHJ1ZS4gSWYgZmFsc2UsIGFsbCBuZXcgc2Vzc2lvbnMgYXJlIGNyZWF0ZWQgd2l0aCBubyBleHBpcmF0aW9uIGRhdGUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGV4dGVuZFNlc3Npb25PblVzZSBXaGV0aGVyIFBhcnNlIFNlcnZlciBzaG91bGQgYXV0b21hdGljYWxseSBleHRlbmQgYSB2YWxpZCBzZXNzaW9uIGJ5IHRoZSBzZXNzaW9uTGVuZ3RoLiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzZXNzaW9uIHVwZGF0ZXMgaW4gdGhlIGRhdGFiYXNlLCBhIHNlc3Npb24gd2lsbCBvbmx5IGJlIGV4dGVuZGVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkIGFmdGVyIGF0IGxlYXN0IGhhbGYgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIGxpZmV0aW1lIGhhcyBwYXNzZWQuXG4gKiBAcHJvcGVydHkge0ZpbGVEb3dubG9hZE9wdGlvbnN9IGZpbGVEb3dubG9hZCBPcHRpb25zIGZvciBmaWxlIGRvd25sb2Fkc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGZpbGVLZXkgS2V5IGZvciB5b3VyIGZpbGVzXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8RmlsZXNBZGFwdGVyPn0gZmlsZXNBZGFwdGVyIEFkYXB0ZXIgbW9kdWxlIGZvciB0aGUgZmlsZXMgc3ViLXN5c3RlbVxuICogQHByb3BlcnR5IHtGaWxlVXBsb2FkT3B0aW9uc30gZmlsZVVwbG9hZCBPcHRpb25zIGZvciBmaWxlIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBncmFwaFFMUGF0aCBUaGUgbW91bnQgcGF0aCBmb3IgdGhlIEdyYXBoUUwgZW5kcG9pbnQ8YnI+PGJyPuKaoO+4jyBGaWxlIHVwbG9hZCBpbnNpZGUgdGhlIEdyYXBoUUwgbXV0YXRpb24gc3lzdGVtIHJlcXVpcmVzIFBhcnNlIFNlcnZlciB0byBiZSBhYmxlIHRvIGNhbGwgaXRzZWxmIGJ5IG1ha2luZyByZXF1ZXN0cyB0byB0aGUgVVJMIHNldCBpbiBgc2VydmVyVVJMYC48YnI+PGJyPkRlZmF1bHRzIGlzIGAvZ3JhcGhxbGAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGdyYXBoUUxQdWJsaWNJbnRyb3NwZWN0aW9uIEVuYWJsZSBwdWJsaWMgaW50cm9zcGVjdGlvbiBmb3IgdGhlIEdyYXBoUUwgZW5kcG9pbnQsIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZ3JhcGhRTFNjaGVtYSBGdWxsIHBhdGggdG8geW91ciBHcmFwaFFMIGN1c3RvbSBzY2hlbWEuZ3JhcGhxbCBmaWxlXG4gKiBAcHJvcGVydHkge1N0cmluZ30gaG9zdCBUaGUgaG9zdCB0byBzZXJ2ZSBQYXJzZVNlcnZlciBvbiwgZGVmYXVsdHMgdG8gMC4wLjAuMFxuICogQHByb3BlcnR5IHtJZGVtcG90ZW5jeU9wdGlvbnN9IGlkZW1wb3RlbmN5T3B0aW9ucyBPcHRpb25zIGZvciByZXF1ZXN0IGlkZW1wb3RlbmN5IHRvIGRlZHVwbGljYXRlIGlkZW50aWNhbCByZXF1ZXN0cyB0aGF0IG1heSBiZSBjYXVzZWQgYnkgbmV0d29yayBpc3N1ZXMuIENhdXRpb24sIHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtYXkgbm90IGJlIGFwcHJvcHJpYXRlIGZvciBwcm9kdWN0aW9uLlxuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb25PcHRpb25zfSBpbnN0YWxsYXRpb24gT3B0aW9ucyBjb250cm9sbGluZyBob3cgUGFyc2UgU2VydmVyIGRlZHVwbGljYXRlcyBgX0luc3RhbGxhdGlvbmAgcmVjb3JkcyB0aGF0IHNoYXJlIHRoZSBzYW1lIGBkZXZpY2VUb2tlbmAuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gamF2YXNjcmlwdEtleSBLZXkgZm9yIHRoZSBKYXZhc2NyaXB0IFNES1xuICogQHByb3BlcnR5IHtCb29sZWFufSBqc29uTG9ncyBMb2cgYXMgc3RydWN0dXJlZCBKU09OIG9iamVjdHNcbiAqIEBwcm9wZXJ0eSB7TGl2ZVF1ZXJ5T3B0aW9uc30gbGl2ZVF1ZXJ5IHBhcnNlLXNlcnZlcidzIExpdmVRdWVyeSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHByb3BlcnR5IHtMaXZlUXVlcnlTZXJ2ZXJPcHRpb25zfSBsaXZlUXVlcnlTZXJ2ZXJPcHRpb25zIExpdmUgcXVlcnkgc2VydmVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAod2lsbCBzdGFydCB0aGUgbGl2ZVF1ZXJ5IHNlcnZlcilcbiAqIEBwcm9wZXJ0eSB7QWRhcHRlcjxMb2dnZXJBZGFwdGVyPn0gbG9nZ2VyQWRhcHRlciBBZGFwdGVyIG1vZHVsZSBmb3IgdGhlIGxvZ2dpbmcgc3ViLXN5c3RlbVxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvZ0xldmVsIFNldHMgdGhlIGxldmVsIGZvciBsb2dzXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsc30gbG9nTGV2ZWxzIChPcHRpb25hbCkgT3ZlcnJpZGVzIHRoZSBsb2cgbGV2ZWxzIHVzZWQgaW50ZXJuYWxseSBieSBQYXJzZSBTZXJ2ZXIgdG8gbG9nIGV2ZW50cy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2dzRm9sZGVyIEZvbGRlciBmb3IgdGhlIGxvZ3MgKGRlZmF1bHRzIHRvICcuL2xvZ3MnKTsgc2V0IHRvIG51bGwgdG8gZGlzYWJsZSBmaWxlIGJhc2VkIGxvZ2dpbmdcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYWludGVuYW5jZUtleSAoT3B0aW9uYWwpIFRoZSBtYWludGVuYW5jZSBrZXkgaXMgdXNlZCBmb3IgbW9kaWZ5aW5nIGludGVybmFsIGFuZCByZWFkLW9ubHkgZmllbGRzIG9mIFBhcnNlIFNlcnZlci48YnI+PGJyPuKaoO+4jyBUaGlzIGtleSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIGEgcmVndWxhciBvcGVyYXRpb24gb2YgUGFyc2UgU2VydmVyLiBUaGlzIGtleSBpcyBpbnRlbmRlZCB0byBjb25kdWN0IG91dC1vZi1iYW5kIGNoYW5nZXMgc3VjaCBhcyBvbmUtdGltZSBtaWdyYXRpb25zIG9yIGRhdGEgY29ycmVjdGlvbiB0YXNrcy4gSW50ZXJuYWwgZmllbGRzIGFyZSBub3Qgb2ZmaWNpYWxseSBkb2N1bWVudGVkIGFuZCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIHdpdGhvdXQgcHVibGljYXRpb24gaW4gcmVsZWFzZSBjaGFuZ2Vsb2dzLiBXZSBzdHJvbmdseSBhZHZpY2Ugbm90IHRvIHJlbHkgb24gaW50ZXJuYWwgZmllbGRzIGFzIHBhcnQgb2YgeW91ciByZWd1bGFyIG9wZXJhdGlvbiBhbmQgdG8gaW52ZXN0aWdhdGUgdGhlIGltcGxpY2F0aW9ucyBvZiBhbnkgcGxhbm5lZCBjaGFuZ2VzICpkaXJlY3RseSBpbiB0aGUgc291cmNlIGNvZGUqIG9mIHlvdXIgY3VycmVudCB2ZXJzaW9uIG9mIFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IG1haW50ZW5hbmNlS2V5SXBzIChPcHRpb25hbCkgUmVzdHJpY3RzIHRoZSB1c2Ugb2YgbWFpbnRlbmFuY2Uga2V5IHBlcm1pc3Npb25zIHRvIGEgbGlzdCBvZiBJUCBhZGRyZXNzZXMgb3IgcmFuZ2VzLjxicj48YnI+VGhpcyBvcHRpb24gYWNjZXB0cyBhIGxpc3Qgb2Ygc2luZ2xlIElQIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYFsnMTAuMC4wLjEnLCAnMTAuMC4wLjInXWAuIFlvdSBjYW4gYWxzbyB1c2UgQ0lEUiBub3RhdGlvbiB0byBzcGVjaWZ5IGFuIElQIGFkZHJlc3MgcmFuZ2UsIGZvciBleGFtcGxlIGBbJzEwLjAuMS4wLzI0J11gLjxicj48YnI+PGI+U3BlY2lhbCBzY2VuYXJpb3M6PC9iPjxicj4tIFNldHRpbmcgYW4gZW1wdHkgYXJyYXkgYFtdYCBtZWFucyB0aGF0IHRoZSBtYWludGVuYW5jZSBrZXkgY2Fubm90IGJlIHVzZWQgZXZlbiBpbiBQYXJzZSBTZXJ2ZXIgQ2xvdWQgQ29kZS4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgc2V0IHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyB0aGVyZSBpcyBubyB3YXkgdG8gcGFzcyBhbiBlbXB0eSBhcnJheSB0byBQYXJzZSBTZXJ2ZXIgdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLjxicj4tIFNldHRpbmcgYFsnMC4wLjAuMC8wJywgJzo6MCddYCBtZWFucyB0byBhbGxvdyBhbnkgSVB2NCBhbmQgSVB2NiBhZGRyZXNzIHRvIHVzZSB0aGUgbWFpbnRlbmFuY2Uga2V5IGFuZCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgSVAgZmlsdGVyLjxicj48YnI+PGI+Q29uc2lkZXJhdGlvbnM6PC9iPjxicj4tIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzIGFyZSBub3QgY29tcGFyZWQgYWdhaW5zdCBlYWNoIG90aGVyLiBFYWNoIElQIHZlcnNpb24gKElQdjQgYW5kIElQdjYpIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQgc2VwYXJhdGVseS4gRm9yIGV4YW1wbGUsIGBbJzAuMC4wLjAvMCddYCBhbGxvd3MgYW55IElQdjQgYWRkcmVzcyBhbmQgYmxvY2tzIGV2ZXJ5IElQdjYgYWRkcmVzcy4gQ29udmVyc2VseSwgYFsnOjowJ11gIGFsbG93cyBhbnkgSVB2NiBhZGRyZXNzIGFuZCBibG9ja3MgZXZlcnkgSVB2NCBhZGRyZXNzLjxicj4tIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBJUCB2ZXJzaW9uIGluIHVzZSBkZXBlbmRzIG9uIHRoZSBuZXR3b3JrIHN0YWNrIG9mIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCBQYXJzZSBTZXJ2ZXIgcnVucy4gQSBsb2NhbCBlbnZpcm9ubWVudCBtYXkgdXNlIGEgZGlmZmVyZW50IElQIHZlcnNpb24gdGhhbiBhIHJlbW90ZSBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIGl0J3MgcG9zc2libGUgdGhhdCBsb2NhbGx5IHRoZSB2YWx1ZSBgWycwLjAuMC4wLzAnXWAgYWxsb3dzIHRoZSByZXF1ZXN0IElQIGJlY2F1c2UgdGhlIGVudmlyb25tZW50IGlzIHVzaW5nIElQdjQsIGJ1dCB3aGVuIFBhcnNlIFNlcnZlciBpcyBkZXBsb3llZCByZW1vdGVseSB0aGUgcmVxdWVzdCBJUCBpcyBibG9ja2VkIGJlY2F1c2UgdGhlIHJlbW90ZSBlbnZpcm9ubWVudCBpcyB1c2luZyBJUHY2Ljxicj4tIFdoZW4gc2V0dGluZyB0aGUgb3B0aW9uIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGUgbm90YXRpb24gaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLCBmb3IgZXhhbXBsZSBgXCIwLjAuMC4wLzAsOjowXCJgLjxicj4tIElQdjYgem9uZSBpbmRpY2VzIChgJWAgc3VmZml4KSBhcmUgbm90IHN1cHBvcnRlZCwgZm9yIGV4YW1wbGUgYGZlODA6OjElZXRoMGAsIGBmZTgwOjoxJTFgIG9yIGA6OjElbG9gLjxicj48YnI+RGVmYXVsdHMgdG8gYFsnMTI3LjAuMC4xJywgJzo6MSddYCB3aGljaCBtZWFucyB0aGF0IG9ubHkgYGxvY2FsaG9zdGAsIHRoZSBzZXJ2ZXIgaW5zdGFuY2Ugb24gd2hpY2ggUGFyc2UgU2VydmVyIHJ1bnMsIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBtYWludGVuYW5jZSBrZXkuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBtYXN0ZXJLZXkgWW91ciBQYXJzZSBNYXN0ZXIgS2V5XG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBtYXN0ZXJLZXlJcHMgKE9wdGlvbmFsKSBSZXN0cmljdHMgdGhlIHVzZSBvZiBtYXN0ZXIga2V5IHBlcm1pc3Npb25zIHRvIGEgbGlzdCBvZiBJUCBhZGRyZXNzZXMgb3IgcmFuZ2VzLjxicj48YnI+VGhpcyBvcHRpb24gYWNjZXB0cyBhIGxpc3Qgb2Ygc2luZ2xlIElQIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYFsnMTAuMC4wLjEnLCAnMTAuMC4wLjInXWAuIFlvdSBjYW4gYWxzbyB1c2UgQ0lEUiBub3RhdGlvbiB0byBzcGVjaWZ5IGFuIElQIGFkZHJlc3MgcmFuZ2UsIGZvciBleGFtcGxlIGBbJzEwLjAuMS4wLzI0J11gLjxicj48YnI+PGI+U3BlY2lhbCBzY2VuYXJpb3M6PC9iPjxicj4tIFNldHRpbmcgYW4gZW1wdHkgYXJyYXkgYFtdYCBtZWFucyB0aGF0IHRoZSBtYXN0ZXIga2V5IGNhbm5vdCBiZSB1c2VkIGV2ZW4gaW4gUGFyc2UgU2VydmVyIENsb3VkIENvZGUuIFRoaXMgdmFsdWUgY2Fubm90IGJlIHNldCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHBhc3MgYW4gZW1wdHkgYXJyYXkgdG8gUGFyc2UgU2VydmVyIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS48YnI+LSBTZXR0aW5nIGBbJzAuMC4wLjAvMCcsICc6OjAnXWAgbWVhbnMgdG8gYWxsb3cgYW55IElQdjQgYW5kIElQdjYgYWRkcmVzcyB0byB1c2UgdGhlIG1hc3RlciBrZXkgYW5kIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBJUCBmaWx0ZXIuPGJyPjxicj48Yj5Db25zaWRlcmF0aW9uczo8L2I+PGJyPi0gSVB2NCBhbmQgSVB2NiBhZGRyZXNzZXMgYXJlIG5vdCBjb21wYXJlZCBhZ2FpbnN0IGVhY2ggb3RoZXIuIEVhY2ggSVAgdmVyc2lvbiAoSVB2NCBhbmQgSVB2NikgbmVlZHMgdG8gYmUgY29uc2lkZXJlZCBzZXBhcmF0ZWx5LiBGb3IgZXhhbXBsZSwgYFsnMC4wLjAuMC8wJ11gIGFsbG93cyBhbnkgSVB2NCBhZGRyZXNzIGFuZCBibG9ja3MgZXZlcnkgSVB2NiBhZGRyZXNzLiBDb252ZXJzZWx5LCBgWyc6OjAnXWAgYWxsb3dzIGFueSBJUHY2IGFkZHJlc3MgYW5kIGJsb2NrcyBldmVyeSBJUHY0IGFkZHJlc3MuPGJyPi0gS2VlcCBpbiBtaW5kIHRoYXQgdGhlIElQIHZlcnNpb24gaW4gdXNlIGRlcGVuZHMgb24gdGhlIG5ldHdvcmsgc3RhY2sgb2YgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIFBhcnNlIFNlcnZlciBydW5zLiBBIGxvY2FsIGVudmlyb25tZW50IG1heSB1c2UgYSBkaWZmZXJlbnQgSVAgdmVyc2lvbiB0aGFuIGEgcmVtb3RlIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwgaXQncyBwb3NzaWJsZSB0aGF0IGxvY2FsbHkgdGhlIHZhbHVlIGBbJzAuMC4wLjAvMCddYCBhbGxvd3MgdGhlIHJlcXVlc3QgSVAgYmVjYXVzZSB0aGUgZW52aXJvbm1lbnQgaXMgdXNpbmcgSVB2NCwgYnV0IHdoZW4gUGFyc2UgU2VydmVyIGlzIGRlcGxveWVkIHJlbW90ZWx5IHRoZSByZXF1ZXN0IElQIGlzIGJsb2NrZWQgYmVjYXVzZSB0aGUgcmVtb3RlIGVudmlyb25tZW50IGlzIHVzaW5nIElQdjYuPGJyPi0gV2hlbiBzZXR0aW5nIHRoZSBvcHRpb24gdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoZSBub3RhdGlvbiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcsIGZvciBleGFtcGxlIGBcIjAuMC4wLjAvMCw6OjBcImAuPGJyPi0gSVB2NiB6b25lIGluZGljZXMgKGAlYCBzdWZmaXgpIGFyZSBub3Qgc3VwcG9ydGVkLCBmb3IgZXhhbXBsZSBgZmU4MDo6MSVldGgwYCwgYGZlODA6OjElMWAgb3IgYDo6MSVsb2AuPGJyPjxicj5EZWZhdWx0cyB0byBgWycxMjcuMC4wLjEnLCAnOjoxJ11gIHdoaWNoIG1lYW5zIHRoYXQgb25seSBgbG9jYWxob3N0YCwgdGhlIHNlcnZlciBpbnN0YW5jZSBvbiB3aGljaCBQYXJzZSBTZXJ2ZXIgcnVucywgaXMgYWxsb3dlZCB0byB1c2UgdGhlIG1hc3RlciBrZXkuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWFzdGVyS2V5VHRsIChPcHRpb25hbCkgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgZm9yIHdoaWNoIHRoZSBjdXJyZW50IGBtYXN0ZXJLZXlgIGlzIGJlaW5nIHVzZWQgYmVmb3JlIGl0IGlzIHJlcXVlc3RlZCBhZ2FpbiBpZiBgbWFzdGVyS2V5YCBpcyBzZXQgdG8gYSBmdW5jdGlvbi4gSWYgYG1hc3RlcktleWAgaXMgbm90IHNldCB0byBhIGZ1bmN0aW9uLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiBEZWZhdWx0IGlzIGAwYCwgd2hpY2ggbWVhbnMgdGhlIG1hc3RlciBrZXkgaXMgcmVxdWVzdGVkIGJ5IGludm9raW5nIHRoZSAgYG1hc3RlcktleWAgZnVuY3Rpb24gZXZlcnkgdGltZSB0aGUgbWFzdGVyIGtleSBpcyB1c2VkIGludGVybmFsbHkgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heExpbWl0IE1heCB2YWx1ZSBmb3IgbGltaXQgb3B0aW9uIG9uIHF1ZXJpZXMsIGRlZmF1bHRzIHRvIHVubGltaXRlZFxuICogQHByb3BlcnR5IHtOdW1iZXJ8U3RyaW5nfSBtYXhMb2dGaWxlcyBNYXhpbXVtIG51bWJlciBvZiBsb2dzIHRvIGtlZXAuIElmIG5vdCBzZXQsIG5vIGxvZ3Mgd2lsbCBiZSByZW1vdmVkLiBUaGlzIGNhbiBiZSBhIG51bWJlciBvZiBmaWxlcyBvciBudW1iZXIgb2YgZGF5cy4gSWYgdXNpbmcgZGF5cywgYWRkICdkJyBhcyB0aGUgc3VmZml4LiAoZGVmYXVsdDogbnVsbClcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtYXhVcGxvYWRTaXplIE1heCBmaWxlIHNpemUgZm9yIHVwbG9hZHMsIGRlZmF1bHRzIHRvIDIwbWJcbiAqIEBwcm9wZXJ0eSB7VW5pb259IG1pZGRsZXdhcmUgbWlkZGxld2FyZSBmb3IgZXhwcmVzcyBzZXJ2ZXIsIGNhbiBiZSBzdHJpbmcgb3IgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbW91bnRHcmFwaFFMIE1vdW50cyB0aGUgR3JhcGhRTCBlbmRwb2ludFxuICogQHByb3BlcnR5IHtTdHJpbmd9IG1vdW50UGF0aCBNb3VudCBwYXRoIGZvciB0aGUgc2VydmVyLCBkZWZhdWx0cyB0byAvcGFyc2VcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbW91bnRQbGF5Z3JvdW5kIERlcHJlY2F0ZWQuIE1vdW50cyB0aGUgR3JhcGhRTCBQbGF5Z3JvdW5kIHdoaWNoIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBUaGUgcGxheWdyb3VuZCBleHBvc2VzIHRoZSBtYXN0ZXIga2V5IGluIHRoZSBicm93c2VyLiBVc2UgUGFyc2UgRGFzaGJvYXJkIGFzIEdyYXBoUUwgSURFIG9yIGNvbmZpZ3VyZSBhIHRoaXJkLXBhcnR5IEdyYXBoUUwgY2xpZW50IHdpdGggY3VzdG9tIHJlcXVlc3QgaGVhZGVycy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBvYmplY3RJZFNpemUgU2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gZ2VuZXJhdGVkIG9iamVjdCBpZCdzLCBkZWZhdWx0IDEwXG4gKiBAcHJvcGVydHkge1BhZ2VzT3B0aW9uc30gcGFnZXMgVGhlIG9wdGlvbnMgZm9yIHBhZ2VzIHN1Y2ggYXMgcGFzc3dvcmQgcmVzZXQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UGFzc3dvcmRQb2xpY3lPcHRpb25zfSBwYXNzd29yZFBvbGljeSBUaGUgcGFzc3dvcmQgcG9saWN5IGZvciBlbmZvcmNpbmcgcGFzc3dvcmQgcmVsYXRlZCBydWxlcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwbGF5Z3JvdW5kUGF0aCBEZXByZWNhdGVkLiBNb3VudCBwYXRoIGZvciB0aGUgR3JhcGhRTCBQbGF5Z3JvdW5kLiBUaGUgcGxheWdyb3VuZCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwb3J0IFRoZSBwb3J0IHRvIHJ1biB0aGUgUGFyc2VTZXJ2ZXIsIGRlZmF1bHRzIHRvIDEzMzcuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHByZXNlcnZlRmlsZU5hbWUgRW5hYmxlIChvciBkaXNhYmxlKSB0aGUgYWRkaXRpb24gb2YgYSB1bmlxdWUgaGFzaCB0byB0aGUgZmlsZSBuYW1lc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBwcmV2ZW50TG9naW5XaXRoVW52ZXJpZmllZEVtYWlsIFNldCB0byBgdHJ1ZWAgdG8gcHJldmVudCBhIHVzZXIgZnJvbSBsb2dnaW5nIGluIGlmIHRoZSBlbWFpbCBoYXMgbm90IHlldCBiZWVuIHZlcmlmaWVkIGFuZCBlbWFpbCB2ZXJpZmljYXRpb24gaXMgcmVxdWlyZWQuIFN1cHBvcnRzIGEgZnVuY3Rpb24gd2l0aCBhIHJldHVybiB2YWx1ZSBvZiBgdHJ1ZWAgb3IgYGZhbHNlYCBmb3IgY29uZGl0aW9uYWwgcHJldmVudGlvbi4gVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgcmVxdWVzdCBvYmplY3QgdGhhdCBpbmNsdWRlcyBgY3JlYXRlZFdpdGhgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGludm9jYXRpb24gaXMgZm9yIGBzaWdudXBgIG9yIGBsb2dpbmAgYW5kIHRoZSB1c2VkIGF1dGggcHJvdmlkZXIuPGJyPjxicj5UaGUgYGNyZWF0ZWRXaXRoYCB2YWx1ZXMgcGVyIHNjZW5hcmlvOjx1bD48bGk+UGFzc3dvcmQgc2lnbnVwOiBgeyBhY3Rpb246ICdzaWdudXAnLCBhdXRoUHJvdmlkZXI6ICdwYXNzd29yZCcgfWA8L2xpPjxsaT5BdXRoIHByb3ZpZGVyIHNpZ251cDogYHsgYWN0aW9uOiAnc2lnbnVwJywgYXV0aFByb3ZpZGVyOiAnPHByb3ZpZGVyPicgfWA8L2xpPjxsaT5QYXNzd29yZCBsb2dpbjogYHsgYWN0aW9uOiAnbG9naW4nLCBhdXRoUHJvdmlkZXI6ICdwYXNzd29yZCcgfWA8L2xpPjxsaT5BdXRoIHByb3ZpZGVyIGxvZ2luOiBmdW5jdGlvbiBub3QgaW52b2tlZDsgYXV0aCBwcm92aWRlciBsb2dpbiBieXBhc3NlcyBlbWFpbCB2ZXJpZmljYXRpb248L2xpPjwvdWw+RGVmYXVsdCBpcyBgZmFsc2VgLjxicj5SZXF1aXJlcyBvcHRpb24gYHZlcmlmeVVzZXJFbWFpbHM6IHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBwcmV2ZW50U2lnbnVwV2l0aFVudmVyaWZpZWRFbWFpbCBJZiBzZXQgdG8gYHRydWVgIGl0IHByZXZlbnRzIGEgdXNlciBmcm9tIHNpZ25pbmcgdXAgaWYgdGhlIGVtYWlsIGhhcyBub3QgeWV0IGJlZW4gdmVyaWZpZWQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbiBpcyByZXF1aXJlZC4gSW4gdGhhdCBjYXNlIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgdG8gdGhlIHNpZ24tdXAgd2l0aCBIVFRQIHN0YXR1cyA0MDAgYW5kIGEgUGFyc2UgRXJyb3IgMjA1IGBFTUFJTF9OT1RfRk9VTkRgLiBJZiBzZXQgdG8gYGZhbHNlYCB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGggSFRUUCBzdGF0dXMgMjAwLCBhbmQgY2xpZW50IFNES3MgcmV0dXJuIGFuIHVuYXV0aGVudGljYXRlZCBQYXJzZSBVc2VyIHdpdGhvdXQgc2Vzc2lvbiB0b2tlbi4gSW4gdGhhdCBjYXNlIHN1YnNlcXVlbnQgcmVxdWVzdHMgZmFpbCB1bnRpbCB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3MgaXMgdmVyaWZpZWQuPGJyPjxicj5EZWZhdWx0IGlzIGBmYWxzZWAuPGJyPlJlcXVpcmVzIG9wdGlvbiBgdmVyaWZ5VXNlckVtYWlsczogdHJ1ZWAuXG4gKiBAcHJvcGVydHkge1Byb3RlY3RlZEZpZWxkc30gcHJvdGVjdGVkRmllbGRzIEZpZWxkcyBwZXIgY2xhc3MgdGhhdCBhcmUgaGlkZGVuIGZyb20gcXVlcnkgcmVzdWx0cyBmb3Igc3BlY2lmaWMgdXNlciBncm91cHMuIFByb3RlY3RlZCBmaWVsZHMgYXJlIHN0cmlwcGVkIGZyb20gdGhlIHNlcnZlciByZXNwb25zZSwgYnV0IGNhbiBzdGlsbCBiZSB1c2VkIGludGVybmFsbHkgKGUuZy4gaW4gQ2xvdWQgQ29kZSB0cmlnZ2VycykuIENvbmZpZ3VyZSBhcyBgeyAnQ2xhc3NOYW1lJzogeyAnVXNlckdyb3VwJzogWydmaWVsZDEnLCAnZmllbGQyJ10gfSB9YCB3aGVyZSBgVXNlckdyb3VwYCBpcyBvbmUgb2Y6IGAnKidgIChhbGwgdXNlcnMpLCBgJ2F1dGhlbnRpY2F0ZWQnYCAoYXV0aGVudGljYXRlZCB1c2VycyksIGAncm9sZTpSb2xlTmFtZSdgICh1c2VycyB3aXRoIGEgc3BlY2lmaWMgcm9sZSksIGAndXNlckZpZWxkOkZpZWxkTmFtZSdgICh1c2VycyByZWZlcmVuY2VkIGJ5IGEgcG9pbnRlciBmaWVsZCksIG9yIGEgdXNlciBgb2JqZWN0SWRgIHRvIHRhcmdldCBhIHNwZWNpZmljIHVzZXIuIFdoZW4gbXVsdGlwbGUgZ3JvdXBzIGFwcGx5LCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZWlyIHByb3RlY3RlZCBmaWVsZHMgaXMgdXNlZC4gQW55IGZpZWxkIGNhbiBiZSBwcm90ZWN0ZWQsIGluY2x1ZGluZyBzeXN0ZW0gZmllbGRzIGxpa2UgYGNyZWF0ZWRBdGAgYW5kIGB1cGRhdGVkQXRgLiBCeSBkZWZhdWx0LCBgZW1haWxgIGlzIHByb3RlY3RlZCBvbiB0aGUgYF9Vc2VyYCBjbGFzcyBmb3IgYWxsIHVzZXJzLiBPbiB0aGUgYF9Vc2VyYCBjbGFzcywgdGhlIG9iamVjdCBvd25lciBpcyBleGVtcHQgZnJvbSBwcm90ZWN0ZWQgZmllbGRzIGJ5IGRlZmF1bHQ7IHNlZSBgcHJvdGVjdGVkRmllbGRzT3duZXJFeGVtcHRgIHRvIGNoYW5nZSB0aGlzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBwcm90ZWN0ZWRGaWVsZHNPd25lckV4ZW1wdCBXaGV0aGVyIHRoZSBgX1VzZXJgIGNsYXNzIGlzIGV4ZW1wdCBmcm9tIGBwcm90ZWN0ZWRGaWVsZHNgIHdoZW4gdGhlIGxvZ2dlZC1pbiB1c2VyIHF1ZXJpZXMgdGhlaXIgb3duIHVzZXIgb2JqZWN0LiBJZiBgdHJ1ZWAgKGRlZmF1bHQpLCBhIHVzZXIgY2FuIHNlZSBhbGwgdGhlaXIgb3duIGZpZWxkcyByZWdhcmRsZXNzIG9mIGBwcm90ZWN0ZWRGaWVsZHNgIGNvbmZpZ3VyYXRpb247IGRlZmF1bHQgcHJvdGVjdGVkIGZpZWxkcyAoZS5nLiBgZW1haWxgKSBhcmUgbWVyZ2VkIGludG8gYW55IGN1c3RvbSBgcHJvdGVjdGVkRmllbGRzYCBjb25maWd1cmF0aW9uLiBJZiBgZmFsc2VgLCBgcHJvdGVjdGVkRmllbGRzYCBhcHBsaWVzIGVxdWFsbHkgdG8gdGhlIHVzZXIncyBvd24gb2JqZWN0LCBjb25zaXN0ZW50IHdpdGggYWxsIG90aGVyIGNsYXNzZXM7IG9ubHkgZXhwbGljaXRseSBjb25maWd1cmVkIHByb3RlY3RlZCBmaWVsZHMgYXBwbHksIGRlZmF1bHRzIGFyZSBub3QgbWVyZ2VkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHByb3RlY3RlZEZpZWxkc1NhdmVSZXNwb25zZUV4ZW1wdCBXaGV0aGVyIHNhdmUgb3BlcmF0aW9uIHJlc3BvbnNlcyAoY3JlYXRlLCB1cGRhdGUpIGFyZSBleGVtcHQgZnJvbSBgcHJvdGVjdGVkRmllbGRzYC4gSWYgYHRydWVgIChkZWZhdWx0KSwgcHJvdGVjdGVkIGZpZWxkcyBtb2RpZmllZCBkdXJpbmcgYSBzYXZlIGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4gSWYgYGZhbHNlYCwgcHJvdGVjdGVkIGZpZWxkcyBhcmUgc3RyaXBwZWQgZnJvbSBzYXZlIHJlc3BvbnNlcywgY29uc2lzdGVudCB3aXRoIGhvdyB0aGV5IGFyZSBzdHJpcHBlZCBmcm9tIHF1ZXJ5IHJlc3VsdHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcHJvdGVjdGVkRmllbGRzVHJpZ2dlckV4ZW1wdCBXaGV0aGVyIENsb3VkIENvZGUgdHJpZ2dlcnMgKGUuZy4gYGJlZm9yZVNhdmVgLCBgYWZ0ZXJTYXZlYCkgYXJlIGV4ZW1wdCBmcm9tIGBwcm90ZWN0ZWRGaWVsZHNgLiBJZiBgdHJ1ZWAsIHRyaWdnZXJzIHJlY2VpdmUgdGhlIGZ1bGwgb2JqZWN0IGluY2x1ZGluZyBwcm90ZWN0ZWQgZmllbGRzIGluIGByZXF1ZXN0Lm9iamVjdGAgYW5kIGByZXF1ZXN0Lm9yaWdpbmFsYCwgcmVnYXJkbGVzcyBvZiB0aGUgY2FsbGVyJ3MgYXV0aCBjb250ZXh0LiBJZiBgZmFsc2VgLCBwcm90ZWN0ZWQgZmllbGRzIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBvcmlnaW5hbCBvYmplY3QgZmV0Y2ggdXNlZCB0byBidWlsZCB0cmlnZ2VyIG9iamVjdHMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBwdWJsaWNTZXJ2ZXJVUkwgT3B0aW9uYWwuIFRoZSBwdWJsaWMgVVJMIHRvIFBhcnNlIFNlcnZlci4gVGhpcyBVUkwgd2lsbCBiZSB1c2VkIHRvIHJlYWNoIFBhcnNlIFNlcnZlciBwdWJsaWNseSBmb3IgZmVhdHVyZXMgbGlrZSBwYXNzd29yZCByZXNldCBhbmQgZW1haWwgdmVyaWZpY2F0aW9uIGxpbmtzLiBUaGUgb3B0aW9uIGNhbiBiZSBzZXQgdG8gYSBzdHJpbmcgb3IgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhc3luY2hyb25vdXNseSByZXNvbHZlZC4gVGhlIHJldHVybmVkIFVSTCBzdHJpbmcgbXVzdCBzdGFydCB3aXRoIGBodHRwOi8vYCBvciBgaHR0cHM6Ly9gLlxuICogQHByb3BlcnR5IHtBbnl9IHB1c2ggQ29uZmlndXJhdGlvbiBmb3IgcHVzaCwgYXMgc3RyaW5naWZpZWQgSlNPTi4gU2VlIGh0dHA6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL3BhcnNlLXNlcnZlci9ndWlkZS8jcHVzaC1ub3RpZmljYXRpb25zXG4gKiBAcHJvcGVydHkge1F1ZXJ5U2VydmVyT3B0aW9uc30gcXVlcnkgUXVlcnktcmVsYXRlZCBzZXJ2ZXIgZGVmYXVsdHMuXG4gKiBAcHJvcGVydHkge1JhdGVMaW1pdE9wdGlvbnNbXX0gcmF0ZUxpbWl0IE9wdGlvbnMgdG8gbGltaXQgcmVwZWF0ZWQgcmVxdWVzdHMgdG8gUGFyc2UgU2VydmVyIEFQSXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvdGVjdCBzZW5zaXRpdmUgZW5kcG9pbnRzIHN1Y2ggYXMgYC9yZXF1ZXN0UGFzc3dvcmRSZXNldGAgZnJvbSBicnV0ZS1mb3JjZSBhdHRhY2tzIG9yIFBhcnNlIFNlcnZlciBhcyBhIHdob2xlIGZyb20gZGVuaWFsLW9mLXNlcnZpY2UgKERvUykgYXR0YWNrcy48YnI+PGJyPuKEue+4jyBNaW5kIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6PGJyPi0gcmF0ZSBsaW1pdHMgYXBwbGllZCBwZXIgSVAgYWRkcmVzczsgdGhpcyBsaW1pdHMgcHJvdGVjdGlvbiBhZ2FpbnN0IGRpc3RyaWJ1dGVkIGRlbmlhbC1vZi1zZXJ2aWNlIChERG9TKSBhdHRhY2tzIHdoZXJlIG1hbnkgcmVxdWVzdHMgYXJlIGNvbWluZyBmcm9tIHZhcmlvdXMgSVAgYWRkcmVzc2VzPGJyPi0gaWYgbXVsdGlwbGUgUGFyc2UgU2VydmVyIGluc3RhbmNlcyBhcmUgYmVoaW5kIGEgbG9hZCBiYWxhbmNlciBvciByYW4gaW4gYSBjbHVzdGVyLCBlYWNoIGluc3RhbmNlIHdpbGwgY2FsY3VsYXRlIGl0J3Mgb3duIHJlcXVlc3QgcmF0ZXMsIGluZGVwZW5kZW50IGZyb20gb3RoZXIgaW5zdGFuY2VzOyB0aGlzIGxpbWl0cyB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzIGZlYXR1cmUgd2hlbiB1c2luZyBhIGxvYWQgYmFsYW5jZXIgYW5kIGFub3RoZXIgcmF0ZSBsaW1pdGluZyBzb2x1dGlvbiB0aGF0IHRha2VzIHJlcXVlc3RzIGFjcm9zcyBhbGwgaW5zdGFuY2VzIGludG8gYWNjb3VudCBtYXkgYmUgbW9yZSBzdWl0YWJsZTxicj4tIHRoaXMgZmVhdHVyZSBwcm92aWRlcyBiYXNpYyBwcm90ZWN0aW9uIGFnYWluc3QgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrcywgYnV0IGEgbW9yZSBzb3BoaXN0aWNhdGVkIHNvbHV0aW9uIHdvcmtzIGVhcmxpZXIgaW4gdGhlIHJlcXVlc3QgZmxvdyBhbmQgcHJldmVudHMgYSBtYWxpY2lvdXMgcmVxdWVzdHMgdG8gZXZlbiByZWFjaCBhIHNlcnZlciBpbnN0YW5jZTsgaXQncyB0aGVyZWZvcmUgcmVjb21tZW5kZWQgdG8gaW1wbGVtZW50IGEgc29sdXRpb24gYWNjb3JkaW5nIHRvIGFyY2hpdGVjdHVyZSBhbmQgdXNlIGNhc2UuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVhZE9ubHlNYXN0ZXJLZXkgUmVhZC1vbmx5IGtleSwgd2hpY2ggaGFzIHRoZSBzYW1lIGNhcGFiaWxpdGllcyBhcyBNYXN0ZXJLZXkgd2l0aG91dCB3cml0ZXNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHJlYWRPbmx5TWFzdGVyS2V5SXBzIChPcHRpb25hbCkgUmVzdHJpY3RzIHRoZSB1c2Ugb2YgcmVhZC1vbmx5IG1hc3RlciBrZXkgcGVybWlzc2lvbnMgdG8gYSBsaXN0IG9mIElQIGFkZHJlc3NlcyBvciByYW5nZXMuPGJyPjxicj5UaGlzIG9wdGlvbiBhY2NlcHRzIGEgbGlzdCBvZiBzaW5nbGUgSVAgYWRkcmVzc2VzLCBmb3IgZXhhbXBsZSBgWycxMC4wLjAuMScsICcxMC4wLjAuMiddYC4gWW91IGNhbiBhbHNvIHVzZSBDSURSIG5vdGF0aW9uIHRvIHNwZWNpZnkgYW4gSVAgYWRkcmVzcyByYW5nZSwgZm9yIGV4YW1wbGUgYFsnMTAuMC4xLjAvMjQnXWAuPGJyPjxicj48Yj5TcGVjaWFsIHNjZW5hcmlvczo8L2I+PGJyPi0gU2V0dGluZyBhbiBlbXB0eSBhcnJheSBgW11gIG1lYW5zIHRoYXQgdGhlIHJlYWQtb25seSBtYXN0ZXIga2V5IGNhbm5vdCBiZSB1c2VkIGV2ZW4gaW4gUGFyc2UgU2VydmVyIENsb3VkIENvZGUuIFRoaXMgdmFsdWUgY2Fubm90IGJlIHNldCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHBhc3MgYW4gZW1wdHkgYXJyYXkgdG8gUGFyc2UgU2VydmVyIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS48YnI+LSBTZXR0aW5nIGBbJzAuMC4wLjAvMCcsICc6OjAnXWAgbWVhbnMgdG8gYWxsb3cgYW55IElQdjQgYW5kIElQdjYgYWRkcmVzcyB0byB1c2UgdGhlIHJlYWQtb25seSBtYXN0ZXIga2V5IGFuZCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgSVAgZmlsdGVyLjxicj48YnI+PGI+Q29uc2lkZXJhdGlvbnM6PC9iPjxicj4tIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzIGFyZSBub3QgY29tcGFyZWQgYWdhaW5zdCBlYWNoIG90aGVyLiBFYWNoIElQIHZlcnNpb24gKElQdjQgYW5kIElQdjYpIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQgc2VwYXJhdGVseS4gRm9yIGV4YW1wbGUsIGBbJzAuMC4wLjAvMCddYCBhbGxvd3MgYW55IElQdjQgYWRkcmVzcyBhbmQgYmxvY2tzIGV2ZXJ5IElQdjYgYWRkcmVzcy4gQ29udmVyc2VseSwgYFsnOjowJ11gIGFsbG93cyBhbnkgSVB2NiBhZGRyZXNzIGFuZCBibG9ja3MgZXZlcnkgSVB2NCBhZGRyZXNzLjxicj4tIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBJUCB2ZXJzaW9uIGluIHVzZSBkZXBlbmRzIG9uIHRoZSBuZXR3b3JrIHN0YWNrIG9mIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCBQYXJzZSBTZXJ2ZXIgcnVucy4gQSBsb2NhbCBlbnZpcm9ubWVudCBtYXkgdXNlIGEgZGlmZmVyZW50IElQIHZlcnNpb24gdGhhbiBhIHJlbW90ZSBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIGl0J3MgcG9zc2libGUgdGhhdCBsb2NhbGx5IHRoZSB2YWx1ZSBgWycwLjAuMC4wLzAnXWAgYWxsb3dzIHRoZSByZXF1ZXN0IElQIGJlY2F1c2UgdGhlIGVudmlyb25tZW50IGlzIHVzaW5nIElQdjQsIGJ1dCB3aGVuIFBhcnNlIFNlcnZlciBpcyBkZXBsb3llZCByZW1vdGVseSB0aGUgcmVxdWVzdCBJUCBpcyBibG9ja2VkIGJlY2F1c2UgdGhlIHJlbW90ZSBlbnZpcm9ubWVudCBpcyB1c2luZyBJUHY2Ljxicj4tIFdoZW4gc2V0dGluZyB0aGUgb3B0aW9uIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGUgbm90YXRpb24gaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLCBmb3IgZXhhbXBsZSBgXCIwLjAuMC4wLzAsOjowXCJgLjxicj4tIElQdjYgem9uZSBpbmRpY2VzIChgJWAgc3VmZml4KSBhcmUgbm90IHN1cHBvcnRlZCwgZm9yIGV4YW1wbGUgYGZlODA6OjElZXRoMGAsIGBmZTgwOjoxJTFgIG9yIGA6OjElbG9gLjxicj48YnI+RGVmYXVsdHMgdG8gYFsnMC4wLjAuMC8wJywgJzo6MCddYCB3aGljaCBtZWFucyB0aGF0IGFueSBJUCBhZGRyZXNzIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSByZWFkLW9ubHkgbWFzdGVyIGtleS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIGBbJzEyNy4wLjAuMScsICc6OjEnXWAgdG8gcmVzdHJpY3QgYWNjZXNzIHRvIGBsb2NhbGhvc3RgLlxuICogQHByb3BlcnR5IHtSZXF1ZXN0Q29tcGxleGl0eU9wdGlvbnN9IHJlcXVlc3RDb21wbGV4aXR5IE9wdGlvbnMgdG8gbGltaXQgdGhlIGNvbXBsZXhpdHkgb2YgcmVxdWVzdHMgdG8gcHJldmVudCBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLiBMaW1pdHMgYXJlIGVuZm9yY2VkIGZvciBhbGwgcmVxdWVzdHMgZXhjZXB0IHRob3NlIHVzaW5nIHRoZSBtYXN0ZXIgb3IgbWFpbnRlbmFuY2Uga2V5LiBFYWNoIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gYC0xYCB0byBkaXNhYmxlIHRoYXQgc3BlY2lmaWMgbGltaXQuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSByZXF1ZXN0Q29udGV4dE1pZGRsZXdhcmUgT3B0aW9ucyB0byBjdXN0b21pemUgdGhlIHJlcXVlc3QgY29udGV4dCB1c2luZyBpbnZlcnNpb24gb2YgY29udHJvbC9kZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVxdWVzdEtleXdvcmREZW55bGlzdFtdfSByZXF1ZXN0S2V5d29yZERlbnlsaXN0IEFuIGFycmF5IG9mIGtleXMgYW5kIHZhbHVlcyB0aGF0IGFyZSBwcm9oaWJpdGVkIGluIGRhdGFiYXNlIHJlYWQgYW5kIHdyaXRlIHJlcXVlc3RzIHRvIHByZXZlbnQgcG90ZW50aWFsIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gSXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBvbmx5IGEga2V5IChge1wia2V5XCI6XCIuLi5cIn1gKSwgb25seSBhIHZhbHVlIChge1widmFsdWVcIjpcIi4uLlwifWApIG9yIGEga2V5LXZhbHVlIHBhaXIgKGB7XCJrZXlcIjpcIi4uLlwiLFwidmFsdWVcIjpcIi4uLlwifWApLiBUaGUgc3BlY2lmaWNhdGlvbiBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgdHlwZXM6IGBib29sZWFuYCwgYG51bWVyaWNgIG9yIGBzdHJpbmdgLCB3aGVyZSBgc3RyaW5nYCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgcmVnZXggbm90YXRpb24uIFJlcXVlc3QgZGF0YSBpcyBkZWVwLXNjYW5uZWQgZm9yIG1hdGNoaW5nIGRlZmluaXRpb25zIHRvIGRldGVjdCBhbHNvIGFueSBuZXN0ZWQgb2NjdXJyZW5jZXMuIERlZmF1bHRzIGFyZSBwYXR0ZXJucyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgdXNlZCBpbiBtYWxpY2lvdXMgcmVxdWVzdHMuIFNldHRpbmcgdGhpcyBvcHRpb24gd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYXR0ZXJucy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZXN0QVBJS2V5IEtleSBmb3IgUkVTVCBjYWxsc1xuICogQHByb3BlcnR5IHtCb29sZWFufSByZXZva2VTZXNzaW9uT25QYXNzd29yZFJlc2V0IFdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlaXIgcGFzc3dvcmQsIGVpdGhlciB0aHJvdWdoIHRoZSByZXNldCBwYXNzd29yZCBlbWFpbCBvciB3aGlsZSBsb2dnZWQgaW4sIGFsbCBzZXNzaW9ucyBhcmUgcmV2b2tlZCBpZiB0aGlzIGlzIHRydWUuIFNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byByZXZva2Ugc2Vzc2lvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSByb3V0ZUFsbG93TGlzdCAoT3B0aW9uYWwpIFJlc3RyaWN0cyBleHRlcm5hbCBjbGllbnQgYWNjZXNzIHRvIGEgbGlzdCBvZiBhbGxvd2VkIEFQSSByb3V0ZXMuPGJyPjxicj5XaGVuIHRoaXMgb3B0aW9uIGlzIHNldCwgYWxsIGV4dGVybmFsIG5vbi1tYXN0ZXIta2V5IHJlcXVlc3RzIGFyZSBkZW5pZWQgYnkgZGVmYXVsdC4gT25seSByb3V0ZXMgbWF0Y2hpbmcgYXQgbGVhc3Qgb25lIG9mIHRoZSBjb25maWd1cmVkIHJlZ2V4IHBhdHRlcm5zIGFyZSBhbGxvd2VkIHRocm91Z2guIEludGVybmFsIGNhbGxzIGZyb20gQ2xvdWQgQ29kZSwgQ2xvdWQgSm9icywgYW5kIHRyaWdnZXJzIGFyZSBub3QgYWZmZWN0ZWQuPGJyPjxicj5FYWNoIGVudHJ5IGlzIGEgcmVnZXggcGF0dGVybiBzdHJpbmcgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBub3JtYWxpemVkIHJvdXRlIGlkZW50aWZpZXIgKHJlcXVlc3QgcGF0aCB3aXRoIG1vdW50IHByZWZpeCBhbmQgbGVhZGluZyBzbGFzaCBzdHJpcHBlZCkuIFBhdHRlcm5zIGFyZSBhdXRvLWFuY2hvcmVkIHdpdGggYF5gIGFuZCBgJGAgZm9yIGZ1bGwtbWF0Y2ggc2VtYW50aWNzLjxicj48YnI+PGI+RXhhbXBsZXMgb2Ygbm9ybWFsaXplZCByb3V0ZSBpZGVudGlmaWVyczo8L2I+PHVsPjxsaT5gY2xhc3Nlcy9HYW1lU2NvcmVgIChjbGFzcyBDUlVEKTwvbGk+PGxpPmBjbGFzc2VzL0dhbWVTY29yZS9hYmMxMjNgIChvYmplY3QgYnkgSUQpPC9saT48bGk+YHVzZXJzYCAodXNlciBvcGVyYXRpb25zKTwvbGk+PGxpPmBsb2dpbmAgKGxvZ2luIGVuZHBvaW50KTwvbGk+PGxpPmBmdW5jdGlvbnMvc2VuZEVtYWlsYCAoQ2xvdWQgRnVuY3Rpb24pPC9saT48bGk+YGpvYnMvY2xlYW51cGAgKENsb3VkIEpvYik8L2xpPjxsaT5gcHVzaGAgKHB1c2ggbm90aWZpY2F0aW9ucyk8L2xpPjxsaT5gY29uZmlnYCAoY2xpZW50IGNvbmZpZyk8L2xpPjxsaT5gaW5zdGFsbGF0aW9uc2AgKGluc3RhbGxhdGlvbnMpPC9saT48bGk+YGZpbGVzL3BpY3R1cmUuanBnYCAoZmlsZSBvcGVyYXRpb25zKTwvbGk+PC91bD48Yj5FeGFtcGxlIHBhdHRlcm5zOjwvYj48dWw+PGxpPmBjbGFzc2VzL0NoYXRNZXNzYWdlYCBtYXRjaGVzIG9ubHkgYGNsYXNzZXMvQ2hhdE1lc3NhZ2VgPC9saT48bGk+YGNsYXNzZXMvQ2hhdC4qYCBtYXRjaGVzIGBjbGFzc2VzL0NoYXRNZXNzYWdlYCwgYGNsYXNzZXMvQ2hhdFJvb21gLCBldGMuPC9saT48bGk+YGZ1bmN0aW9ucy8uKmAgbWF0Y2hlcyBhbGwgQ2xvdWQgRnVuY3Rpb25zPC9saT48L3VsPlNldHRpbmcgYW4gZW1wdHkgYXJyYXkgYFtdYCBibG9ja3MgYWxsIGV4dGVybmFsIG5vbi1tYXN0ZXIta2V5IHJlcXVlc3RzIChmdWxsIGxvY2tkb3duKS48YnI+PGJyPldoZW4gc2V0dGluZyB0aGUgb3B0aW9uIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIG5vdGF0aW9uIGlzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZywgZm9yIGV4YW1wbGUgYFwiY2xhc3Nlcy9DaGF0TWVzc2FnZSx1c2VycyxmdW5jdGlvbnMvLipcImAuPGJyPjxicj5EZWZhdWx0cyB0byBgdW5kZWZpbmVkYCB3aGljaCBtZWFucyB0aGUgZmVhdHVyZSBpcyBpbmFjdGl2ZSBhbmQgYWxsIHJvdXRlcyBhcmUgYWNjZXNzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc2NoZWR1bGVkUHVzaCBDb25maWd1cmF0aW9uIGZvciBwdXNoIHNjaGVkdWxpbmcsIGRlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtTY2hlbWFPcHRpb25zfSBzY2hlbWEgRGVmaW5lZCBzY2hlbWFcbiAqIEBwcm9wZXJ0eSB7U2VjdXJpdHlPcHRpb25zfSBzZWN1cml0eSBUaGUgc2VjdXJpdHkgb3B0aW9ucyB0byBpZGVudGlmeSBhbmQgcmVwb3J0IHdlYWsgc2VjdXJpdHkgc2V0dGluZ3MuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHNlbmRVc2VyRW1haWxWZXJpZmljYXRpb24gU2V0IHRvIGBmYWxzZWAgdG8gcHJldmVudCBzZW5kaW5nIG9mIHZlcmlmaWNhdGlvbiBlbWFpbC4gU3VwcG9ydHMgYSBmdW5jdGlvbiB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mIGB0cnVlYCBvciBgZmFsc2VgIGZvciBjb25kaXRpb25hbCBlbWFpbCBzZW5kaW5nLjxicj48YnI+RGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gc2VydmVyQ2xvc2VDb21wbGV0ZSBDYWxsYmFjayB3aGVuIHNlcnZlciBoYXMgY2xvc2VkXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyVVJMIFRoZSBVUkwgdG8gUGFyc2UgU2VydmVyLjxicj48YnI+4pqg77iPIENlcnRhaW4gc2VydmVyIGZlYXR1cmVzIG9yIGFkYXB0ZXJzIG1heSByZXF1aXJlIFBhcnNlIFNlcnZlciB0byBiZSBhYmxlIHRvIGNhbGwgaXRzZWxmIGJ5IG1ha2luZyByZXF1ZXN0cyB0byB0aGUgVVJMIHNldCBpbiBgc2VydmVyVVJMYC4gSWYgYSBmZWF0dXJlIHJlcXVpcmVzIHRoaXMsIGl0IGlzIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSW4gdGhhdCBjYXNlIGVuc3VyZSB0aGF0IHRoZSBVUkwgaXMgYWNjZXNzaWJsZSBmcm9tIHRoZSBzZXJ2ZXIgaXRzZWxmLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHNlc3Npb25MZW5ndGggU2Vzc2lvbiBkdXJhdGlvbiwgaW4gc2Vjb25kcywgZGVmYXVsdHMgdG8gMSB5ZWFyXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHNpbGVudCBEaXNhYmxlcyBjb25zb2xlIG91dHB1dFxuICogQHByb3BlcnR5IHtCb29sZWFufSBzdGFydExpdmVRdWVyeVNlcnZlciBTdGFydHMgdGhlIGxpdmVRdWVyeSBzZXJ2ZXJcbiAqIEBwcm9wZXJ0eSB7QW55fSB0cnVzdFByb3h5IFRoZSB0cnVzdCBwcm94eSBzZXR0aW5ncy4gSXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGV4YWN0IHNldHVwIG9mIHRoZSByZXZlcnNlIHByb3h5LCBzaW5jZSB0aGlzIHNldHRpbmcgd2lsbCB0cnVzdCB2YWx1ZXMgcHJvdmlkZWQgaW4gdGhlIFBhcnNlIFNlcnZlciBBUEkgcmVxdWVzdC4gU2VlIHRoZSA8YSBocmVmPVwiaHR0cHM6Ly9leHByZXNzanMuY29tL2VuL2d1aWRlL2JlaGluZC1wcm94aWVzLmh0bWxcIj5leHByZXNzIHRydXN0IHByb3h5IHNldHRpbmdzPC9hPiBkb2N1bWVudGF0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gdXNlclNlbnNpdGl2ZUZpZWxkcyBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiBmaWVsZHMgaW4gdGhlIHVzZXIgdGFibGUgdGhlIHNob3VsZCBiZSByZW1vdmVkIGZvciBub24tYXV0aG9yaXplZCB1c2Vycy4gRGVwcmVjYXRlZCBAc2VlIHByb3RlY3RlZEZpZWxkc1xuICogQHByb3BlcnR5IHtCb29sZWFufSB2ZXJib3NlIFNldCB0aGUgbG9nZ2luZyB0byB2ZXJib3NlXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHZlcmlmeVNlcnZlclVybCBQYXJzZSBTZXJ2ZXIgbWFrZXMgYSBIVFRQIHJlcXVlc3QgdG8gdGhlIFVSTCBzZXQgaW4gYHNlcnZlclVSTGAgYXQgdGhlIGVuZCBvZiBpdHMgbGF1bmNoIHJvdXRpbmUgdG8gdmVyaWZ5IHRoYXQgdGhlIGxhdW5jaCBzdWNjZWVkZWQuIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgZmFsc2VgLCB0aGUgdmVyaWZpY2F0aW9uIHdpbGwgYmUgc2tpcHBlZC4gVGhpcyBjYW4gYmUgdXNlZnVsIGluIGVudmlyb25tZW50cyB3aGVyZSB0aGUgc2VydmVyIFVSTCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBzZXJ2ZXIgaXRzZWxmLCBzdWNoIGFzIHdoZW4gcnVubmluZyBiZWhpbmQgYSBmaXJld2FsbCBvciBpbiBjZXJ0YWluIGNvbnRhaW5lcml6ZWQgZW52aXJvbm1lbnRzLjxicj48YnI+4pqg77iPIFNlcnZlciBVUkwgdmVyaWZpY2F0aW9uIHJlcXVpcmVzIFBhcnNlIFNlcnZlciB0byBiZSBhYmxlIHRvIGNhbGwgaXRzZWxmIGJ5IG1ha2luZyByZXF1ZXN0cyB0byB0aGUgVVJMIHNldCBpbiBgc2VydmVyVVJMYC48YnI+PGJyPkRlZmF1bHQgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB2ZXJpZnlVc2VyRW1haWxzIFNldCB0byBgdHJ1ZWAgdG8gcmVxdWlyZSB1c2VycyB0byB2ZXJpZnkgdGhlaXIgZW1haWwgYWRkcmVzcyB0byBjb21wbGV0ZSB0aGUgc2lnbi11cCBwcm9jZXNzLiBTdXBwb3J0cyBhIGZ1bmN0aW9uIHdpdGggYSByZXR1cm4gdmFsdWUgb2YgYHRydWVgIG9yIGBmYWxzZWAgZm9yIGNvbmRpdGlvbmFsIHZlcmlmaWNhdGlvbi4gVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgcmVxdWVzdCBvYmplY3QgdGhhdCBpbmNsdWRlcyBgY3JlYXRlZFdpdGhgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGludm9jYXRpb24gaXMgZm9yIGBzaWdudXBgIG9yIGBsb2dpbmAgYW5kIHRoZSB1c2VkIGF1dGggcHJvdmlkZXIuPGJyPjxicj5UaGUgYGNyZWF0ZWRXaXRoYCB2YWx1ZXMgcGVyIHNjZW5hcmlvOjx1bD48bGk+UGFzc3dvcmQgc2lnbnVwOiBgeyBhY3Rpb246ICdzaWdudXAnLCBhdXRoUHJvdmlkZXI6ICdwYXNzd29yZCcgfWA8L2xpPjxsaT5BdXRoIHByb3ZpZGVyIHNpZ251cDogYHsgYWN0aW9uOiAnc2lnbnVwJywgYXV0aFByb3ZpZGVyOiAnPHByb3ZpZGVyPicgfWA8L2xpPjxsaT5QYXNzd29yZCBsb2dpbjogYHsgYWN0aW9uOiAnbG9naW4nLCBhdXRoUHJvdmlkZXI6ICdwYXNzd29yZCcgfWA8L2xpPjxsaT5BdXRoIHByb3ZpZGVyIGxvZ2luOiBmdW5jdGlvbiBub3QgaW52b2tlZDsgYXV0aCBwcm92aWRlciBsb2dpbiBieXBhc3NlcyBlbWFpbCB2ZXJpZmljYXRpb248L2xpPjxsaT5SZXNlbmQgdmVyaWZpY2F0aW9uIGVtYWlsOiBgY3JlYXRlZFdpdGhgIGlzIGB1bmRlZmluZWRgOyB1c2UgdGhlIGByZXNlbmRSZXF1ZXN0YCBwcm9wZXJ0eSB0byBpZGVudGlmeSB0aG9zZTwvbGk+PC91bD5EZWZhdWx0IGlzIGBmYWxzZWAuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gd2ViaG9va0tleSBLZXkgc2VudCB3aXRoIG91dGdvaW5nIHdlYmhvb2sgY2FsbHNcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUmF0ZUxpbWl0T3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGVycm9yUmVzcG9uc2VNZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGluIHRoZSBib2R5IG9mIHRoZSBIVFRQIDQyOSByZXNwb25zZSB3aGVuIHRoZSByYXRlIGxpbWl0IGlzIGhpdC4gRGVmYXVsdCBpcyBgVG9vIG1hbnkgcmVxdWVzdHMuYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaW5jbHVkZUludGVybmFsUmVxdWVzdHMgT3B0aW9uYWwsIGlmIGB0cnVlYCB0aGUgcmF0ZSBsaW1pdCB3aWxsIGFsc28gYXBwbHkgdG8gcmVxdWVzdHMgdGhhdCBhcmUgbWFkZSBpbiBieSBDbG91ZCBDb2RlLCBkZWZhdWx0IGlzIGBmYWxzZWAuIE5vdGUgdGhhdCBhIHB1YmxpYyBDbG91ZCBDb2RlIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgaW50ZXJuYWwgcmVxdWVzdHMgbWF5IGNpcmN1bXZlbnQgcmF0ZSBsaW1pdGluZyBhbmQgYmUgdnVsbmVyYWJsZSB0byBhdHRhY2tzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBpbmNsdWRlTWFzdGVyS2V5IE9wdGlvbmFsLCBpZiBgdHJ1ZWAgdGhlIHJhdGUgbGltaXQgd2lsbCBhbHNvIGFwcGx5IHRvIHJlcXVlc3RzIHVzaW5nIHRoZSBgbWFzdGVyS2V5YCwgZGVmYXVsdCBpcyBgZmFsc2VgLiBOb3RlIHRoYXQgYSBwdWJsaWMgQ2xvdWQgQ29kZSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIGludGVybmFsIHJlcXVlc3RzIHVzaW5nIHRoZSBgbWFzdGVyS2V5YCBtYXkgY2lyY3VtdmVudCByYXRlIGxpbWl0aW5nIGFuZCBiZSB2dWxuZXJhYmxlIHRvIGF0dGFja3MuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVkaXNVcmwgT3B0aW9uYWwsIHRoZSBVUkwgb2YgdGhlIFJlZGlzIHNlcnZlciB0byBzdG9yZSByYXRlIGxpbWl0IGRhdGEuIFRoaXMgYWxsb3dzIHRvIHJhdGUgbGltaXQgcmVxdWVzdHMgZm9yIG11bHRpcGxlIHNlcnZlcnMgYnkgY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhbGwgcmVxdWVzdHMgYWNyb3NzIGFsbCBzZXJ2ZXJzLiBUaGlzIGlzIHVzZWZ1bCBpZiBtdWx0aXBsZSBzZXJ2ZXJzIGFyZSBwcm9jZXNzaW5nIHJlcXVlc3RzIGJlaGluZCBhIGxvYWQgYmFsYW5jZXIuIEZvciBleGFtcGxlLCB0aGUgbGltaXQgb2YgMTAgcmVxdWVzdHMgaXMgcmVhY2hlZCBpZiBlYWNoIG9mIDIgc2VydmVycyBwcm9jZXNzZWQgNSByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByZXF1ZXN0Q291bnQgVGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGNhbiBiZSBtYWRlIHBlciBJUCBhZGRyZXNzIHdpdGhpbiB0aGUgdGltZSB3aW5kb3cgc2V0IGluIGByZXF1ZXN0VGltZVdpbmRvd2AgYmVmb3JlIHRoZSByYXRlIGxpbWl0IGlzIGFwcGxpZWQuIEZvciBiYXRjaCByZXF1ZXN0cywgdGhpcyBhbHNvIGxpbWl0cyB0aGUgbnVtYmVyIG9mIHN1Yi1yZXF1ZXN0cyBpbiBhIHNpbmdsZSBiYXRjaCB0aGF0IHRhcmdldCB0aGlzIHBhdGg7IGhvd2V2ZXIsIHJlcXVlc3RzIGFscmVhZHkgY29uc3VtZWQgaW4gdGhlIGN1cnJlbnQgdGltZSB3aW5kb3cgYXJlIG5vdCBjb3VudGVkIGFnYWluc3QgdGhlIGJhdGNoLCBzbyB0aGUgZWZmZWN0aXZlIGxpbWl0IG1heSBiZSBoaWdoZXIgd2hlbiBjb21iaW5pbmcgaW5kaXZpZHVhbCBhbmQgYmF0Y2ggcmVxdWVzdHMuIE5vdGUgdGhhdCB0aGlzIGlzIGEgYmFzaWMgc2VydmVyLWxldmVsIHJhdGUgbGltaXQ7IGZvciBjb21wcmVoZW5zaXZlIHByb3RlY3Rpb24sIHVzZSBhIHJldmVyc2UgcHJveHkgb3IgV0FGIGZvciByYXRlIGxpbWl0aW5nLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gcmVxdWVzdE1ldGhvZHMgT3B0aW9uYWwsIHRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kcyB0byB3aGljaCB0aGUgcmF0ZSBsaW1pdCBzaG91bGQgYmUgYXBwbGllZCwgZGVmYXVsdCBpcyBhbGwgbWV0aG9kcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZXF1ZXN0UGF0aCBUaGUgcGF0aCBvZiB0aGUgQVBJIHJvdXRlIHRvIGJlIHJhdGUgbGltaXRlZC4gUm91dGUgcGF0aHMsIGluIGNvbWJpbmF0aW9uIHdpdGggYSByZXF1ZXN0IG1ldGhvZCwgZGVmaW5lIHRoZSBlbmRwb2ludHMgYXQgd2hpY2ggcmVxdWVzdHMgY2FuIGJlIG1hZGUuIFJvdXRlIHBhdGhzIGNhbiBiZSBzdHJpbmdzIG9yIHN0cmluZyBwYXR0ZXJucyBmb2xsb3dpbmcgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9waWxsYXJqcy9wYXRoLXRvLXJlZ2V4cFwiPnBhdGgtdG8tcmVnZXhwIHY4PC9hPiBzeW50YXguXG4gKiBAcHJvcGVydHkge051bWJlcn0gcmVxdWVzdFRpbWVXaW5kb3cgVGhlIHdpbmRvdyBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB3aXRoaW4gd2hpY2ggdGhlIG51bWJlciBvZiByZXF1ZXN0cyBzZXQgaW4gYHJlcXVlc3RDb3VudGAgY2FuIGJlIG1hZGUgYmVmb3JlIHRoZSByYXRlIGxpbWl0IGlzIGFwcGxpZWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gem9uZSBUaGUgdHlwZSBvZiByYXRlIGxpbWl0IHRvIGFwcGx5LiBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6PHVsPjxsaT5gZ2xvYmFsYDogcmF0ZSBsaW1pdCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIG1hZGUgYnkgYWxsIHVzZXJzPC9saT48bGk+YGlwYDogcmF0ZSBsaW1pdCBiYXNlZCBvbiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVxdWVzdDwvbGk+PGxpPmB1c2VyYDogcmF0ZSBsaW1pdCBiYXNlZCBvbiB0aGUgdXNlciBJRCBvZiB0aGUgcmVxdWVzdDwvbGk+PGxpPmBzZXNzaW9uYDogcmF0ZSBsaW1pdCBiYXNlZCBvbiB0aGUgc2Vzc2lvbiB0b2tlbiBvZiB0aGUgcmVxdWVzdDwvbGk+PC91bD5EZWZhdWx0IGlzIGBpcGAuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFJlcXVlc3RDb21wbGV4aXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBhbGxvd1JlZ2V4IFdoZXRoZXIgdG8gYWxsb3cgdGhlIGAkcmVnZXhgIHF1ZXJ5IG9wZXJhdG9yLiBTZXQgdG8gYGZhbHNlYCB0byByZWplY3QgYCRyZWdleGAgaW4gcXVlcmllcyBmb3Igbm9uLW1hc3Rlci1rZXkgdXNlcnMuIERlZmF1bHQgaXMgYHRydWVgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGJhdGNoUmVxdWVzdExpbWl0IE1heGltdW0gbnVtYmVyIG9mIHN1Yi1yZXF1ZXN0cyBpbiBhIHNpbmdsZSBiYXRjaCByZXF1ZXN0LiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gZ3JhcGhRTERlcHRoIE1heGltdW0gZGVwdGggb2YgR3JhcGhRTCBmaWVsZCBzZWxlY3Rpb25zLiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gZ3JhcGhRTEZpZWxkcyBNYXhpbXVtIG51bWJlciBvZiBmaWVsZCBzZWxlY3Rpb25zIGluIGEgR3JhcGhRTCBxdWVyeS4gU2V0IHRvIGAtMWAgdG8gZGlzYWJsZS4gRGVmYXVsdCBpcyBgLTFgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGluY2x1ZGVDb3VudCBNYXhpbXVtIG51bWJlciBvZiBpbmNsdWRlIHBhdGhzIGluIGEgc2luZ2xlIHF1ZXJ5LiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gaW5jbHVkZURlcHRoIE1heGltdW0gZGVwdGggb2YgaW5jbHVkZSBwb2ludGVyIGNoYWlucyAoZS5nLiBgYS5iLmNgID0gZGVwdGggMykuIFNldCB0byBgLTFgIHRvIGRpc2FibGUuIERlZmF1bHQgaXMgYC0xYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBxdWVyeURlcHRoIE1heGltdW0gbmVzdGluZyBkZXB0aCBvZiBgJG9yYCwgYCRhbmRgLCBgJG5vcmAgcXVlcnkgb3BlcmF0b3JzLiBTZXQgdG8gYC0xYCB0byBkaXNhYmxlLiBEZWZhdWx0IGlzIGAtMWAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc3VicXVlcnlEZXB0aCBNYXhpbXVtIG5lc3RpbmcgZGVwdGggb2YgYCRpblF1ZXJ5YCwgYCRub3RJblF1ZXJ5YCwgYCRzZWxlY3RgLCBgJGRvbnRTZWxlY3RgIHN1YnF1ZXJpZXMuIFNldCB0byBgLTFgIHRvIGRpc2FibGUuIERlZmF1bHQgaXMgYC0xYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzdWJxdWVyeUxpbWl0IE1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgcmV0dXJuZWQgYnkgYSBgJGluUXVlcnlgLCBgJG5vdEluUXVlcnlgLCBgJHNlbGVjdGAsIGAkZG9udFNlbGVjdGAgc3VicXVlcnkuIFNldCB0byBgLTFgIHRvIGRpc2FibGUuIERlZmF1bHQgaXMgYC0xYC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgSW5zdGFsbGF0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGR1cGxpY2F0ZURldmljZVRva2VuQWN0aW9uIFdoYXQgUGFyc2UgU2VydmVyIGRvZXMgdG8gdGhlIGNvbmZsaWN0aW5nIGBfSW5zdGFsbGF0aW9uYCByb3cocykgd2hlbiBhIG5ldyBpbnN0YWxsJ3MgYGRldmljZVRva2VuYCBjb2xsaWRlcyB3aXRoIGFuIGV4aXN0aW5nIHJvdy4gYCdkZWxldGUnYCBkZXN0cm95cyB0aGUgY29uZmxpY3Rpbmcgcm93LiBgJ3VwZGF0ZSdgIGNsZWFycyB0aGUgbm93LWNvbmZsaWN0aW5nIElEIGZpZWxkIG9uIHRoZSBjb25mbGljdGluZyByb3csIHByZXNlcnZpbmcgY3VzdG9tIGZpZWxkcywgY2hhbm5lbHMsIGFuZCBoaXN0b3J5LiBEZWZhdWx0IGlzIGAnZGVsZXRlJ2AuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGR1cGxpY2F0ZURldmljZVRva2VuQWN0aW9uRW5mb3JjZUF1dGggV2hldGhlciB0aGUgYF9JbnN0YWxsYXRpb25gIGRlZHVwbGljYXRpb24gb3BlcmF0aW9uIGVuZm9yY2VzIHRoZSBjYWxsZXIncyBhdXRoIGNvbnRleHQgKGFuZCB0aGUgcmVzdWx0aW5nIEFDTCBhbmQgQ0xQKS4gV2hlbiBgdHJ1ZWAsIHRoZSBkZWR1cCBgZGVzdHJveWAvYHVwZGF0ZWAgcnVucyB3aXRoIHRoZSBjYWxsZXIncyBgcnVuT3B0aW9uc2AsIHNvIEFDTCBhbmQgQ0xQIGFyZSBob25vcmVkLiBXaGVuIGBmYWxzZWAsIHRoZSBkZWR1cCBydW5zIGFzIG1hc3RlciBhbmQgYnlwYXNzZXMgYm90aC4gTWFzdGVyIGFuZCBtYWludGVuYW5jZSBrZXlzIGFsd2F5cyBieXBhc3MgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkdXBsaWNhdGVEZXZpY2VUb2tlbk1lcmdlUHJpb3JpdHkgQXQgdGhlIG1lcmdlIGNhc2UgKHdoZW4gYW4gZXhpc3Rpbmcgcm93IGhvbGRzIHRoZSBuZXcgYGRldmljZVRva2VuYCBidXQgaGFzIG5vIGBpbnN0YWxsYXRpb25JZGAgb2YgaXRzIG93biksIHdoaWNoIHNpZGUgd2lucy4gYCdkZXZpY2VUb2tlbidgIOKAlCB0aGUgZGV2aWNlVG9rZW4tb25seSByb3cgc3Vydml2ZXMsIHRoZSByZXF1ZXN0J3MgYGlkTWF0Y2hgIHJvdyBpcyB0aGUgbG9zZXIuIGAnaW5zdGFsbGF0aW9uSWQnYCDigJQgdGhlIHJlcXVlc3QncyBgaWRNYXRjaGAgKGFjdGl2ZSBpbnN0YWxsKSBzdXJ2aXZlcywgdGhlIGRldmljZVRva2VuLW9ubHkgb3JwaGFuIGlzIHRoZSBsb3Nlci4gRGVmYXVsdCBpcyBgJ2RldmljZVRva2VuJ2AuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtDaGVja0dyb3VwW119IGNoZWNrR3JvdXBzIFRoZSBzZWN1cml0eSBjaGVjayBncm91cHMgdG8gcnVuLiBUaGlzIGFsbG93cyB0byBhZGQgY3VzdG9tIHNlY3VyaXR5IGNoZWNrcyBvciBvdmVycmlkZSBleGlzdGluZyBvbmVzLiBEZWZhdWx0IGFyZSB0aGUgZ3JvdXBzIGRlZmluZWQgaW4gYENoZWNrR3JvdXBzLmpzYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlQ2hlY2sgSXMgdHJ1ZSBpZiBQYXJzZSBTZXJ2ZXIgc2hvdWxkIGNoZWNrIGZvciB3ZWFrIHNlY3VyaXR5IHNldHRpbmdzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVDaGVja0xvZyBJcyB0cnVlIGlmIHRoZSBzZWN1cml0eSBjaGVjayByZXBvcnQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gbG9ncy4gVGhpcyBzaG91bGQgb25seSBiZSBlbmFibGVkIHRlbXBvcmFyaWx5IHRvIG5vdCBleHBvc2Ugd2VhayBzZWN1cml0eSBzZXR0aW5ncyBpbiBsb2dzLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBRdWVyeVNlcnZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWdncmVnYXRpb25SYXdGaWVsZE5hbWVzIFdoZW4gYHRydWVgLCBhbGwgYWdncmVnYXRpb24gcXVlcmllcyBkZWZhdWx0IHRvIHVzaW5nIG5hdGl2ZSBNb25nb0RCIGZpZWxkIG5hbWVzIChubyBhdXRvbWF0aWMgYGNyZWF0ZWRBdGAg4oaSIGBfY3JlYXRlZF9hdGAgcmV3cml0aW5nKS4gSW5kaXZpZHVhbCBxdWVyaWVzIGNhbiBzdGlsbCBvdmVycmlkZSB0aGlzIHZpYSB0aGUgYHJhd0ZpZWxkTmFtZXNgIG9wdGlvbi4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBhZ2dyZWdhdGlvblJhd1ZhbHVlcyBXaGVuIGB0cnVlYCwgYWxsIGFnZ3JlZ2F0aW9uIHF1ZXJpZXMgZGVmYXVsdCB0byB1c2luZyBNb25nb0RCIEV4dGVuZGVkIEpTT04gKEVKU09OKSBmb3IgZXhwbGljaXQgdmFsdWUgdHlwaW5nIGFuZCBza2lwIHNjaGVtYS1iYXNlZCB2YWx1ZSBjb2VyY2lvbi4gSW5kaXZpZHVhbCBxdWVyaWVzIGNhbiBzdGlsbCBvdmVycmlkZSB0aGlzIHZpYSB0aGUgYHJhd1ZhbHVlc2Agb3B0aW9uLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFBhZ2VzT3B0aW9uc1xuICogQHByb3BlcnR5IHtQYWdlc1JvdXRlW119IGN1c3RvbVJvdXRlcyBUaGUgY3VzdG9tIHJvdXRlcy5cbiAqIEBwcm9wZXJ0eSB7UGFnZXNDdXN0b21VcmxzT3B0aW9uc30gY3VzdG9tVXJscyBUaGUgVVJMcyB0byB0aGUgY3VzdG9tIHBhZ2VzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVMb2NhbGl6YXRpb24gSXMgdHJ1ZSBpZiBwYWdlcyBzaG91bGQgYmUgbG9jYWxpemVkOyB0aGlzIGhhcyBubyBlZmZlY3Qgb24gY3VzdG9tIHBhZ2UgcmVkaXJlY3RzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmNvZGVQYWdlUGFyYW1IZWFkZXJzIElzIGB0cnVlYCBpZiB0aGUgcGFnZSBwYXJhbWV0ZXIgaGVhZGVycyBzaG91bGQgYmUgVVJJLWVuY29kZWQuIFRoaXMgaXMgcmVxdWlyZWQgaWYgYW55IHBhZ2UgcGFyYW1ldGVyIHZhbHVlIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBzdWNoIGFzIHRoZSBhcHAgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZm9yY2VSZWRpcmVjdCBJcyB0cnVlIGlmIHJlc3BvbnNlcyBzaG91bGQgYWx3YXlzIGJlIHJlZGlyZWN0cyBhbmQgbmV2ZXIgY29udGVudCwgZmFsc2UgaWYgdGhlIHJlc3BvbnNlIHR5cGUgc2hvdWxkIGRlcGVuZCBvbiB0aGUgcmVxdWVzdCB0eXBlIChHRVQgcmVxdWVzdCAtPiBjb250ZW50IHJlc3BvbnNlOyBQT1NUIHJlcXVlc3QgLT4gcmVkaXJlY3QgcmVzcG9uc2UpLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvY2FsaXphdGlvbkZhbGxiYWNrTG9jYWxlIFRoZSBmYWxsYmFjayBsb2NhbGUgZm9yIGxvY2FsaXphdGlvbiBpZiBubyBtYXRjaGluZyB0cmFuc2xhdGlvbiBpcyBwcm92aWRlZCBmb3IgdGhlIGdpdmVuIGxvY2FsZS4gVGhpcyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gcHJvdmlkaW5nIHRyYW5zbGF0aW9uIHJlc291cmNlcyB2aWEgSlNPTiBmaWxlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvY2FsaXphdGlvbkpzb25QYXRoIFRoZSBwYXRoIHRvIHRoZSBKU09OIGZpbGUgZm9yIGxvY2FsaXphdGlvbjsgdGhlIHRyYW5zbGF0aW9ucyB3aWxsIGJlIHVzZWQgdG8gZmlsbCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFnZXNFbmRwb2ludCBUaGUgQVBJIGVuZHBvaW50IGZvciB0aGUgcGFnZXMuIERlZmF1bHQgaXMgJ2FwcHMnLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhZ2VzUGF0aCBUaGUgcGF0aCB0byB0aGUgcGFnZXMgZGlyZWN0b3J5OyB0aGlzIGFsc28gZGVmaW5lcyB3aGVyZSB0aGUgc3RhdGljIGVuZHBvaW50ICcvYXBwcycgcG9pbnRzIHRvLiBEZWZhdWx0IGlzIHRoZSAnLi9wdWJsaWMvJyBkaXJlY3Rvcnkgb2YgdGhlIHBhcnNlLXNlcnZlciBtb2R1bGUuXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGxhY2Vob2xkZXJzIFRoZSBwbGFjZWhvbGRlciBrZXlzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gcGFnZXM7IHRoaXMgY2FuIGJlIGEgc2ltcGxlIG9iamVjdCBvciBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBQYWdlc1JvdXRlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSByb3V0ZSBoYW5kbGVyIHRoYXQgaXMgYW4gYXN5bmMgZnVuY3Rpb24uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWV0aG9kIFRoZSByb3V0ZSBtZXRob2QsIGUuZy4gJ0dFVCcgb3IgJ1BPU1QnLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggVGhlIHJvdXRlIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFBhZ2VzQ3VzdG9tVXJsc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBlbWFpbFZlcmlmaWNhdGlvbkxpbmtFeHBpcmVkIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBlbWFpbCB2ZXJpZmljYXRpb24gLT4gbGluayBleHBpcmVkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVtYWlsVmVyaWZpY2F0aW9uTGlua0ludmFsaWQgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIGVtYWlsIHZlcmlmaWNhdGlvbiAtPiBsaW5rIGludmFsaWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZW1haWxWZXJpZmljYXRpb25TZW5kRmFpbCBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgZW1haWwgdmVyaWZpY2F0aW9uIC0+IGxpbmsgc2VuZCBmYWlsLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVtYWlsVmVyaWZpY2F0aW9uU2VuZFN1Y2Nlc3MgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIGVtYWlsIHZlcmlmaWNhdGlvbiAtPiByZXNlbmQgbGluayAtPiBzdWNjZXNzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGVtYWlsVmVyaWZpY2F0aW9uU3VjY2VzcyBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgZW1haWwgdmVyaWZpY2F0aW9uIC0+IHN1Y2Nlc3MuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFzc3dvcmRSZXNldCBUaGUgVVJMIHRvIHRoZSBjdXN0b20gcGFnZSBmb3IgcGFzc3dvcmQgcmVzZXQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFzc3dvcmRSZXNldExpbmtJbnZhbGlkIFRoZSBVUkwgdG8gdGhlIGN1c3RvbSBwYWdlIGZvciBwYXNzd29yZCByZXNldCAtPiBsaW5rIGludmFsaWQuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGFzc3dvcmRSZXNldFN1Y2Nlc3MgVGhlIFVSTCB0byB0aGUgY3VzdG9tIHBhZ2UgZm9yIHBhc3N3b3JkIHJlc2V0IC0+IHN1Y2Nlc3MuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIEN1c3RvbVBhZ2VzT3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGNob29zZVBhc3N3b3JkIGNob29zZSBwYXNzd29yZCBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBleHBpcmVkVmVyaWZpY2F0aW9uTGluayBleHBpcmVkIHZlcmlmaWNhdGlvbiBsaW5rIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGludmFsaWRMaW5rIGludmFsaWQgbGluayBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBpbnZhbGlkUGFzc3dvcmRSZXNldExpbmsgaW52YWxpZCBwYXNzd29yZCByZXNldCBsaW5rIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGludmFsaWRWZXJpZmljYXRpb25MaW5rIGludmFsaWQgdmVyaWZpY2F0aW9uIGxpbmsgcGFnZSBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbGlua1NlbmRGYWlsIHZlcmlmaWNhdGlvbiBsaW5rIHNlbmQgZmFpbCBwYWdlIHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsaW5rU2VuZFN1Y2Nlc3MgdmVyaWZpY2F0aW9uIGxpbmsgc2VuZCBzdWNjZXNzIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhcnNlRnJhbWVVUkwgZm9yIG1hc2tpbmcgdXNlci1mYWNpbmcgcGFnZXNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXNzd29yZFJlc2V0U3VjY2VzcyBwYXNzd29yZCByZXNldCBzdWNjZXNzIHBhZ2UgcGF0aFxuICogQHByb3BlcnR5IHtTdHJpbmd9IHZlcmlmeUVtYWlsU3VjY2VzcyB2ZXJpZnkgZW1haWwgc3VjY2VzcyBwYWdlIHBhdGhcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTGl2ZVF1ZXJ5T3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gY2xhc3NOYW1lcyBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgY2xhc3NOYW1lc1xuICogQHByb3BlcnR5IHtBZGFwdGVyPFB1YlN1YkFkYXB0ZXI+fSBwdWJTdWJBZGFwdGVyIExpdmVRdWVyeSBwdWJzdWIgYWRhcHRlclxuICogQHByb3BlcnR5IHtBbnl9IHJlZGlzT3B0aW9ucyBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgcmVkaXNPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVkaXNVUkwgcGFyc2Utc2VydmVyJ3MgTGl2ZVF1ZXJ5IHJlZGlzVVJMXG4gKiBAcHJvcGVydHkge051bWJlcn0gcmVnZXhUaW1lb3V0IFNldHMgdGhlIG1heGltdW0gZXhlY3V0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBtYXRjaGluZyBpbiBMaXZlUXVlcnkuIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBSZWd1bGFyIEV4cHJlc3Npb24gRGVuaWFsIG9mIFNlcnZpY2UgKFJlRG9TKSBhdHRhY2tzIHdoZXJlIGEgbWFsaWNpb3VzIHJlZ2V4IHBhdHRlcm4gY291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AuIEEgcmVnZXggdGhhdCBleGNlZWRzIHRoZSB0aW1lb3V0IHdpbGwgYmUgdHJlYXRlZCBhcyBub24tbWF0Y2hpbmcuPGJyPjxicj5UaGUgcHJvdGVjdGlvbiBydW5zIGVhY2ggcmVnZXggZXZhbHVhdGlvbiBpbiBhbiBpc29sYXRlZCBWTSBjb250ZXh0IHdpdGggYSB0aW1lb3V0LiBUaGlzIGFkZHMgYXBwcm94aW1hdGVseSA1MCBtaWNyb3NlY29uZHMgb2Ygb3ZlcmhlYWQgcGVyIHJlZ2V4IGV2YWx1YXRpb24uIEZvciBtb3N0IGFwcGxpY2F0aW9ucyB0aGlzIGlzIG5lZ2xpZ2libGUsIGJ1dCBpdCBjYW4gYWRkIHVwIGlmIHlvdSBoYXZlIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgTGl2ZVF1ZXJ5IHN1YnNjcmlwdGlvbnMgdGhhdCB1c2UgYCRyZWdleGAgb24gdGhlIHNhbWUgY2xhc3MuIEZvciBleGFtcGxlLCAxMCwwMDAgY29uY3VycmVudCByZWdleCBzdWJzY3JpcHRpb25zIHdvdWxkIGFkZCBhcHByb3hpbWF0ZWx5IDUwMG1zIG9mIHByb2Nlc3NpbmcgdGltZSBwZXIgb2JqZWN0IHNhdmUgZXZlbnQgb24gdGhhdCBjbGFzcy48YnI+PGJyPlNldCB0byBgMGAgdG8gZGlzYWJsZSB0aGUgdGltZW91dCBhbmQgdXNlIG5hdGl2ZSByZWdleCBldmFsdWF0aW9uIHdpdGhvdXQgcHJvdGVjdGlvbi4gRGVmYXVsdHMgdG8gYDEwMGAuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8V1NTQWRhcHRlcj59IHdzc0FkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBXZWJTb2NrZXRTZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTGl2ZVF1ZXJ5U2VydmVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGFwcElkIFRoaXMgc3RyaW5nIHNob3VsZCBtYXRjaCB0aGUgYXBwSWQgaW4gdXNlIGJ5IHlvdXIgUGFyc2UgU2VydmVyLiBJZiB5b3UgZGVwbG95IHRoZSBMaXZlUXVlcnkgc2VydmVyIGFsb25nc2lkZSBQYXJzZSBTZXJ2ZXIsIHRoZSBMaXZlUXVlcnkgc2VydmVyIHdpbGwgdHJ5IHRvIHVzZSB0aGUgc2FtZSBhcHBJZC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjYWNoZVRpbWVvdXQgTnVtYmVyIGluIG1pbGxpc2Vjb25kcy4gV2hlbiBjbGllbnRzIHByb3ZpZGUgdGhlIHNlc3Npb25Ub2tlbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgd2lsbCB0cnkgdG8gZmV0Y2ggaXRzIFBhcnNlVXNlcidzIG9iamVjdElkIGZyb20gcGFyc2Ugc2VydmVyIGFuZCBzdG9yZSBpdCBpbiB0aGUgY2FjaGUuIFRoZSB2YWx1ZSBkZWZpbmVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FjaGUuIENoZWNrIHRoZSBmb2xsb3dpbmcgU2VjdXJpdHkgc2VjdGlvbiBhbmQgb3VyIHByb3RvY29sIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMsIGRlZmF1bHRzIHRvIDUgKiAxMDAwIG1zICg1IHNlY29uZHMpLlxuICogQHByb3BlcnR5IHtBbnl9IGtleVBhaXJzIEEgSlNPTiBvYmplY3QgdGhhdCBzZXJ2ZXMgYXMgYSB3aGl0ZWxpc3Qgb2Yga2V5cy4gSXQgaXMgdXNlZCBmb3IgdmFsaWRhdGluZyBjbGllbnRzIHdoZW4gdGhleSB0cnkgdG8gY29ubmVjdCB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci4gQ2hlY2sgdGhlIGZvbGxvd2luZyBTZWN1cml0eSBzZWN0aW9uIGFuZCBvdXIgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBsb2dMZXZlbCBUaGlzIHN0cmluZyBkZWZpbmVzIHRoZSBsb2cgbGV2ZWwgb2YgdGhlIExpdmVRdWVyeSBzZXJ2ZXIuIFdlIHN1cHBvcnQgVkVSQk9TRSwgSU5GTywgRVJST1IsIE5PTkUsIGRlZmF1bHRzIHRvIElORk8uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbWFzdGVyS2V5IFRoaXMgc3RyaW5nIHNob3VsZCBtYXRjaCB0aGUgbWFzdGVyS2V5IGluIHVzZSBieSB5b3VyIFBhcnNlIFNlcnZlci4gSWYgeW91IGRlcGxveSB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBhbG9uZ3NpZGUgUGFyc2UgU2VydmVyLCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciB3aWxsIHRyeSB0byB1c2UgdGhlIHNhbWUgbWFzdGVyS2V5LlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHBvcnQgVGhlIHBvcnQgdG8gcnVuIHRoZSBMaXZlUXVlcnkgc2VydmVyLCBkZWZhdWx0cyB0byAxMzM3LlxuICogQHByb3BlcnR5IHtBZGFwdGVyPFB1YlN1YkFkYXB0ZXI+fSBwdWJTdWJBZGFwdGVyIExpdmVRdWVyeSBwdWJzdWIgYWRhcHRlclxuICogQHByb3BlcnR5IHtBbnl9IHJlZGlzT3B0aW9ucyBwYXJzZS1zZXJ2ZXIncyBMaXZlUXVlcnkgcmVkaXNPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVkaXNVUkwgcGFyc2Utc2VydmVyJ3MgTGl2ZVF1ZXJ5IHJlZGlzVVJMXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyVVJMIFRoaXMgc3RyaW5nIHNob3VsZCBtYXRjaCB0aGUgc2VydmVyVVJMIGluIHVzZSBieSB5b3VyIFBhcnNlIFNlcnZlci4gSWYgeW91IGRlcGxveSB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBhbG9uZ3NpZGUgUGFyc2UgU2VydmVyLCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciB3aWxsIHRyeSB0byB1c2UgdGhlIHNhbWUgc2VydmVyVVJMLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHdlYnNvY2tldFRpbWVvdXQgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBpbmcvcG9uZyBmcmFtZXMuIFRoZSBXZWJTb2NrZXQgc2VydmVyIHNlbmRzIHBpbmcvcG9uZyBmcmFtZXMgdG8gdGhlIGNsaWVudHMgdG8ga2VlcCB0aGUgV2ViU29ja2V0IGFsaXZlLiBUaGlzIHZhbHVlIGRlZmluZXMgdGhlIGludGVydmFsIG9mIHRoZSBwaW5nL3BvbmcgZnJhbWUgZnJvbSB0aGUgc2VydmVyIHRvIGNsaWVudHMsIGRlZmF1bHRzIHRvIDEwICogMTAwMCBtcyAoMTAgcykuXG4gKiBAcHJvcGVydHkge0FkYXB0ZXI8V1NTQWRhcHRlcj59IHdzc0FkYXB0ZXIgQWRhcHRlciBtb2R1bGUgZm9yIHRoZSBXZWJTb2NrZXRTZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgSWRlbXBvdGVuY3lPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBwYXRocyBBbiBhcnJheSBvZiBwYXRocyBmb3Igd2hpY2ggdGhlIGZlYXR1cmUgc2hvdWxkIGJlIGVuYWJsZWQuIFRoZSBtb3VudCBwYXRoIG11c3Qgbm90IGJlIGluY2x1ZGVkLCBmb3IgZXhhbXBsZSBpbnN0ZWFkIG9mIGAvcGFyc2UvZnVuY3Rpb25zL215RnVuY3Rpb25gIHNwZWNpZml5IGBmdW5jdGlvbnMvbXlGdW5jdGlvbmAuIFRoZSBlbnRyaWVzIGFyZSBpbnRlcnByZXRlZCBhcyByZWd1bGFyIGV4cHJlc3Npb24sIGZvciBleGFtcGxlIGBmdW5jdGlvbnMvLipgIG1hdGNoZXMgYWxsIGZ1bmN0aW9ucywgYGpvYnMvLipgIG1hdGNoZXMgYWxsIGpvYnMsIGBjbGFzc2VzLy4qYCBtYXRjaGVzIGFsbCBjbGFzc2VzLCBgLipgIG1hdGNoZXMgYWxsIHBhdGhzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHR0bCBUaGUgZHVyYXRpb24gaW4gc2Vjb25kcyBhZnRlciB3aGljaCBhIHJlcXVlc3QgcmVjb3JkIGlzIGRpc2NhcmRlZCBmcm9tIHRoZSBkYXRhYmFzZSwgZGVmYXVsdHMgdG8gMzAwcy5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgQWNjb3VudExvY2tvdXRPcHRpb25zXG4gKiBAcHJvcGVydHkge051bWJlcn0gZHVyYXRpb24gU2V0IHRoZSBkdXJhdGlvbiBpbiBtaW51dGVzIHRoYXQgYSBsb2NrZWQtb3V0IGFjY291bnQgcmVtYWlucyBsb2NrZWQgb3V0IGJlZm9yZSBhdXRvbWF0aWNhbGx5IGJlY29taW5nIHVubG9ja2VkLjxicj48YnI+VmFsaWQgdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gYDBgIGFuZCBsZXNzIHRoYW4gYDEwMDAwMGAuXG4gKiBAcHJvcGVydHkge051bWJlcn0gdGhyZXNob2xkIFNldCB0aGUgbnVtYmVyIG9mIGZhaWxlZCBzaWduLWluIGF0dGVtcHRzIHRoYXQgd2lsbCBjYXVzZSBhIHVzZXIgYWNjb3VudCB0byBiZSBsb2NrZWQuIElmIHRoZSBhY2NvdW50IGlzIGxvY2tlZC4gVGhlIGFjY291bnQgd2lsbCB1bmxvY2sgYWZ0ZXIgdGhlIGR1cmF0aW9uIHNldCBpbiB0aGUgYGR1cmF0aW9uYCBvcHRpb24gaGFzIHBhc3NlZCBhbmQgbm8gZnVydGhlciBsb2dpbiBhdHRlbXB0cyBoYXZlIGJlZW4gbWFkZS48YnI+PGJyPlZhbGlkIHZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIGAwYCBhbmQgbGVzcyB0aGFuIGAxMDAwYC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdW5sb2NrT25QYXNzd29yZFJlc2V0IFNldCB0byBgdHJ1ZWAgIGlmIHRoZSBhY2NvdW50IHNob3VsZCBiZSB1bmxvY2tlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgcGFzc3dvcmQgcmVzZXQuPGJyPjxicj5EZWZhdWx0IGlzIGBmYWxzZWAuPGJyPlJlcXVpcmVzIG9wdGlvbnMgYGR1cmF0aW9uYCBhbmQgYHRocmVzaG9sZGAgdG8gYmUgc2V0LlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBQYXNzd29yZFBvbGljeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZG9Ob3RBbGxvd1VzZXJuYW1lIFNldCB0byBgdHJ1ZWAgdG8gZGlzYWxsb3cgdGhlIHVzZXJuYW1lIGFzIHBhcnQgb2YgdGhlIHBhc3N3b3JkLjxicj48YnI+RGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heFBhc3N3b3JkQWdlIFNldCB0aGUgbnVtYmVyIG9mIGRheXMgYWZ0ZXIgd2hpY2ggYSBwYXNzd29yZCBleHBpcmVzLiBMb2dpbiBhdHRlbXB0cyBmYWlsIGlmIHRoZSB1c2VyIGRvZXMgbm90IHJlc2V0IHRoZSBwYXNzd29yZCBiZWZvcmUgZXhwaXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhQYXNzd29yZEhpc3RvcnkgU2V0IHRoZSBudW1iZXIgb2YgcHJldmlvdXMgcGFzc3dvcmQgdGhhdCB3aWxsIG5vdCBiZSBhbGxvd2VkIHRvIGJlIHNldCBhcyBuZXcgcGFzc3dvcmQuIElmIHRoZSBvcHRpb24gaXMgbm90IHNldCBvciBzZXQgdG8gYDBgLCBubyBwcmV2aW91cyBwYXNzd29yZHMgd2lsbCBiZSBjb25zaWRlcmVkLjxicj48YnI+VmFsaWQgdmFsdWVzIGFyZSA+PSBgMGAgYW5kIDw9IGAyMGAuPGJyPkRlZmF1bHQgaXMgYDBgLlxuICogQHByb3BlcnR5IHtCb29sZWFufSByZXNldFBhc3N3b3JkU3VjY2Vzc09uSW52YWxpZEVtYWlsIFNldCB0byBgdHJ1ZWAgaWYgYSByZXF1ZXN0IHRvIHJlc2V0IHRoZSBwYXNzd29yZCBzaG91bGQgcmV0dXJuIGEgc3VjY2VzcyByZXNwb25zZSBldmVuIGlmIHRoZSBwcm92aWRlZCBlbWFpbCBhZGRyZXNzIGlzIGludmFsaWQsIG9yIGBmYWxzZWAgaWYgdGhlIHJlcXVlc3Qgc2hvdWxkIHJldHVybiBhbiBlcnJvciByZXNwb25zZSBpZiB0aGUgZW1haWwgYWRkcmVzcyBpcyBpbnZhbGlkLjxicj48YnI+RGVmYXVsdCBpcyBgdHJ1ZWAuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJlc2V0VG9rZW5SZXVzZUlmVmFsaWQgU2V0IHRvIGB0cnVlYCBpZiBhIHBhc3N3b3JkIHJlc2V0IHRva2VuIHNob3VsZCBiZSByZXVzZWQgaW4gY2FzZSBhbm90aGVyIHRva2VuIGlzIHJlcXVlc3RlZCBidXQgdGhlcmUgaXMgYSB0b2tlbiB0aGF0IGlzIHN0aWxsIHZhbGlkLCBpLmUuIGhhcyBub3QgZXhwaXJlZC4gVGhpcyBhdm9pZHMgdGhlIG9mdGVuIG9ic2VydmVkIGlzc3VlIHRoYXQgYSB1c2VyIHJlcXVlc3RzIG11bHRpcGxlIGVtYWlscyBhbmQgZG9lcyBub3Qga25vdyB3aGljaCBsaW5rIGNvbnRhaW5zIGEgdmFsaWQgdG9rZW4gYmVjYXVzZSBlYWNoIG5ld2x5IGdlbmVyYXRlZCB0b2tlbiB3b3VsZCBpbnZhbGlkYXRlIHRoZSBwcmV2aW91cyB0b2tlbi48YnI+PGJyPkRlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSByZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvbiBTZXQgdGhlIHZhbGlkaXR5IGR1cmF0aW9uIG9mIHRoZSBwYXNzd29yZCByZXNldCB0b2tlbiBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSB0b2tlbiBleHBpcmVzLiBUaGUgdG9rZW4gaXMgdXNlZCBpbiB0aGUgbGluayB0aGF0IGlzIHNldCBpbiB0aGUgZW1haWwuIEFmdGVyIHRoZSB0b2tlbiBleHBpcmVzLCB0aGUgbGluayBiZWNvbWVzIGludmFsaWQgYW5kIGEgbmV3IGxpbmsgaGFzIHRvIGJlIHNlbnQuIElmIHRoZSBvcHRpb24gaXMgbm90IHNldCBvciBzZXQgdG8gYHVuZGVmaW5lZGAsIHRoZW4gdGhlIHRva2VuIG5ldmVyIGV4cGlyZXMuPGJyPjxicj5Gb3IgZXhhbXBsZSwgdG8gZXhwaXJlIHRoZSB0b2tlbiBhZnRlciAyIGhvdXJzLCBzZXQgYSB2YWx1ZSBvZiA3MjAwIHNlY29uZHMgKD0gNjAgc2Vjb25kcyAqIDYwIG1pbnV0ZXMgKiAyIGhvdXJzKS48YnI+PGJyPkRlZmF1bHQgaXMgYHVuZGVmaW5lZGAuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdmFsaWRhdGlvbkVycm9yIFNldCB0aGUgZXJyb3IgbWVzc2FnZSB0byBiZSBzZW50Ljxicj48YnI+RGVmYXVsdCBpcyBgUGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgUGFzc3dvcmQgUG9saWN5IHJlcXVpcmVtZW50cy5gXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB2YWxpZGF0b3JDYWxsYmFjayBTZXQgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB2YWxpZGF0ZSBhIHBhc3N3b3JkIHRvIGJlIGFjY2VwdGVkLjxicj48YnI+SWYgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGB2YWxpZGF0b3JQYXR0ZXJuYCwgdGhlIHBhc3N3b3JkIG11c3QgcGFzcyBib3RoIHRvIGJlIGFjY2VwdGVkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHZhbGlkYXRvclBhdHRlcm4gU2V0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGlvbiBwYXR0ZXJuIGEgcGFzc3dvcmQgbXVzdCBtYXRjaCB0byBiZSBhY2NlcHRlZC48YnI+PGJyPklmIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgdmFsaWRhdG9yQ2FsbGJhY2tgLCB0aGUgcGFzc3dvcmQgbXVzdCBwYXNzIGJvdGggdG8gYmUgYWNjZXB0ZWQuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIEZpbGVVcGxvYWRPcHRpb25zXG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBhbGxvd2VkRmlsZVVybERvbWFpbnMgU2V0cyB0aGUgYWxsb3dlZCBob3N0bmFtZXMgZm9yIGZpbGUgVVJMcyByZWZlcmVuY2VkIGluIFBhcnNlIG9iamVjdHMuIFdoZW4gYSBGaWxlIG9iamVjdCBpbmNsdWRlcyBhIFVSTCwgaXRzIGhvc3RuYW1lIG11c3QgbWF0Y2ggb25lIG9mIHRoZXNlIGVudHJpZXMgdG8gYmUgYWNjZXB0ZWQuIFN1cHBvcnRzIGV4YWN0IGhvc3RuYW1lcyAoZS5nLiwgYCdjZG4uZXhhbXBsZS5jb20nYCkgYW5kIHdpbGRjYXJkIHN1YmRvbWFpbnMgKGUuZy4sIGAnKi5leGFtcGxlLmNvbSdgKS4gVXNlIGBbJyonXWAgdG8gYWxsb3cgYW55IGRvbWFpbi4gVXNlIGBbXWAgdG8gYmxvY2sgYWxsIGZpbGUgVVJMcyAob25seSBuYW1lLWJhc2VkIGZpbGVzIGFsbG93ZWQpLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVGb3JBbm9ueW1vdXNVc2VyIElzIHRydWUgaWYgZmlsZSB1cGxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGFub255bW91cyB1c2Vycy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIgSXMgdHJ1ZSBpZiBmaWxlIHVwbG9hZCBzaG91bGQgYmUgYWxsb3dlZCBmb3IgYXV0aGVudGljYXRlZCB1c2Vycy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZW5hYmxlRm9yUHVibGljIElzIHRydWUgaWYgZmlsZSB1cGxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGFueW9uZSwgcmVnYXJkbGVzcyBvZiB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHtTdHJpbmdbXX0gZmlsZUV4dGVuc2lvbnMgU2V0cyB0aGUgYWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIHVwbG9hZGluZyBmaWxlcy4gVGhlIGV4dGVuc2lvbiBpcyBkZWZpbmVkIGFzIGFuIGFycmF5IG9mIGZpbGUgZXh0ZW5zaW9ucywgb3IgYSByZWdleCBwYXR0ZXJuLjxicj48YnI+SXQgaXMgcmVjb21tZW5kZWQgdG8gb25seSBhbGxvdyB0aGUgZmlsZSBleHRlbnNpb25zIHRoYXQgeW91ciBhcHAgYWN0dWFsbHkgbmVlZHMsIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYmxvY2tpbmcgZGFuZ2Vyb3VzIGV4dGVuc2lvbnMuIFRoaXMgYWxsb3dsaXN0IGFwcHJvYWNoIGlzIG1vcmUgc2VjdXJlIGJlY2F1c2UgbmV3IGRhbmdlcm91cyBmaWxlIGV4dGVuc2lvbnMgbWF5IGVtZXJnZSB0aGF0IGFyZSBub3QgY292ZXJlZCBieSB0aGUgZGVmYXVsdCBibG9ja2xpc3QuPGJyPjxicj5UaGUgZGVmYXVsdCBibG9ja3MgdGhlIG1vc3QgY29tbW9uIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSBrbm93biB0byBiZSByZW5kZXJlZCBhcyBhY3RpdmUgY29udGVudCBieSB3ZWIgYnJvd3NlcnMsIHN1Y2ggYXMgSFRNTCwgU1ZHLCBhbmQgWE1MIGZpbGVzLCB3aGljaCBtYXkgYmUgdXNlZCBieSBhbiBhdHRhY2tlciB0byBjb21wcm9taXNlIHRoZSBzZXNzaW9uIHRva2VuIG9mIGFub3RoZXIgdXNlciB2aWEgYWNjZXNzaW5nIHRoZSBicm93c2VyJ3MgbG9jYWwgc3RvcmFnZS4gVGhlIGJsb2NrZWQgZXh0ZW5zaW9ucyBhcmU6IGBodG1sYCwgYGh0bWAsIGBzaHRtbGAsIGB4aHRtbGAsIGB4aHRtbCt4bWxgLCBgeGh0YCwgYHN2Z2AsIGBzdmd6YCwgYHN2Zyt4bWxgLCBgeG1sYCwgYHhzbGAsIGB4c2x0YCwgYHhzbHQreG1sYCwgYHhzZGAsIGBybmdgLCBgcmRmYCwgYHJkZit4bWxgLCBgb3dsYCwgYG1hdGhtbGAsIGBtYXRobWwreG1sYC48YnI+PGJyPkRlZmF1bHRzIHRvIGBbXCJeKD8hKFt4WHNTXT9baEhdW3RUXVttTV1bbExdPyhcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1baEhdW3RUXXxbc1NdW3ZWXVtnR10oW3paXXxcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1bbU1dW2xMXXxbeFhdW3NTXVtsTF1bdFRdPyhcXFxcK1t4WF1bbU1dW2xMXSk/fFt4WF1bc1NdW2REXXxbclJdW25OXVtnR118W3JSXVtkRF1bZkZdKFxcXFwrW3hYXVttTV1bbExdKT98W29PXVt3V11bbExdfFttTV1bYUFdW3RUXVtoSF1bbU1dW2xMXShcXFxcK1t4WF1bbU1dW2xMXSk/KSQpXCJdYC5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRmlsZURvd25sb2FkT3B0aW9uc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVGb3JBbm9ueW1vdXNVc2VyIElzIHRydWUgaWYgZmlsZSBkb3dubG9hZCBzaG91bGQgYmUgYWxsb3dlZCBmb3IgYW5vbnltb3VzIHVzZXJzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciBJcyB0cnVlIGlmIGZpbGUgZG93bmxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGF1dGhlbnRpY2F0ZWQgdXNlcnMuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGVuYWJsZUZvclB1YmxpYyBJcyB0cnVlIGlmIGZpbGUgZG93bmxvYWQgc2hvdWxkIGJlIGFsbG93ZWQgZm9yIGFueW9uZSwgcmVnYXJkbGVzcyBvZiB1c2VyIGF1dGhlbnRpY2F0aW9uLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBMb2dMZXZlbFxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBkZWJ1ZyBEZWJ1ZyBsZXZlbFxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBlcnJvciBFcnJvciBsZXZlbCAtIGhpZ2hlc3QgcHJpb3JpdHlcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0gaW5mbyBJbmZvIGxldmVsIC0gZGVmYXVsdFxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBzaWxseSBTaWxseSBsZXZlbCAtIGxvd2VzdCBwcmlvcml0eVxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSB2ZXJib3NlIFZlcmJvc2UgbGV2ZWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nTGl0ZXJhbH0gd2FybiBXYXJuaW5nIGxldmVsXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIExvZ0NsaWVudEV2ZW50XG4gKiBAcHJvcGVydHkge1N0cmluZ1tdfSBrZXlzIE9wdGlvbmFsIGFycmF5IG9mIGRvdC1ub3RhdGlvbiBwYXRocyB0byBleHRyYWN0IHNwZWNpZmljIGRhdGEgZnJvbSB0aGUgZXZlbnQgb2JqZWN0LiBJZiBub3QgcHJvdmlkZWQgb3IgZW1wdHksIHRoZSBlbnRpcmUgZXZlbnQgb2JqZWN0IHdpbGwgYmUgbG9nZ2VkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGxvZ0xldmVsIFRoZSBsb2cgbGV2ZWwgdG8gdXNlIGZvciB0aGlzIGV2ZW50LiBTZWUgW0xvZ0xldmVsXShMb2dMZXZlbC5odG1sKSBmb3IgYXZhaWxhYmxlIHZhbHVlcy4gRGVmYXVsdHMgdG8gYCdpbmZvJ2AuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgTW9uZ29EQiBkcml2ZXIgZXZlbnQgbmFtZSB0byBsaXN0ZW4gZm9yLiBTZWUgdGhlIFtNb25nb0RCIGRyaXZlciBldmVudHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cubW9uZ29kYi5jb20vZG9jcy9kcml2ZXJzL25vZGUvY3VycmVudC9mdW5kYW1lbnRhbHMvbW9uaXRvcmluZy8pIGZvciBhdmFpbGFibGUgZXZlbnRzLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBEYXRhYmFzZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYWxsb3dQdWJsaWNFeHBsYWluIFNldCB0byBgdHJ1ZWAgdG8gYWxsb3cgYFBhcnNlLlF1ZXJ5LmV4cGxhaW5gIHdpdGhvdXQgbWFzdGVyIGtleS48YnI+PGJyPuKaoO+4jyBFbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgZXhwb3NlIHNlbnNpdGl2ZSBxdWVyeSBwZXJmb3JtYW5jZSBkYXRhIHRvIHVuYXV0aG9yaXplZCB1c2VycyBhbmQgY291bGQgcG90ZW50aWFsbHkgYmUgZXhwbG9pdGVkIGZvciBtYWxpY2lvdXMgcHVycG9zZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gYXBwTmFtZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHRoYXQgY3JlYXRlZCB0aGlzIE1vbmdvQ2xpZW50IGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGF1dGhNZWNoYW5pc20gVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gdGhhdCBNb25nb0RCIHdpbGwgdXNlIHRvIGF1dGhlbnRpY2F0ZSB0aGUgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QW55fSBhdXRoTWVjaGFuaXNtUHJvcGVydGllcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgcHJvcGVydGllcyBmb3IgdGhlIHNwZWNpZmllZCBhdXRoTWVjaGFuaXNtIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sb24tc2VwYXJhdGVkIGtleS12YWx1ZSBwYWlycy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhdXRoU291cmNlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZGF0YWJhc2UgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIncyBjcmVkZW50aWFscy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYXV0b1NlbGVjdEZhbWlseSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCB3aGV0aGVyIHRoZSBzb2NrZXQgYXR0ZW1wdHMgdG8gY29ubmVjdCB0byBJUHY2IGFuZCBJUHY0IGFkZHJlc3NlcyB1bnRpbCBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIElmIGF2YWlsYWJsZSwgdGhlIGRyaXZlciB3aWxsIHNlbGVjdCB0aGUgZmlyc3QgSVB2NiBhZGRyZXNzLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24gYXR0ZW1wdCB0byBmaW5pc2ggYmVmb3JlIHRyeWluZyB0aGUgbmV4dCBhZGRyZXNzIHdoZW4gdXNpbmcgdGhlIGF1dG9TZWxlY3RGYW1pbHkgb3B0aW9uLiBJZiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiAxMCwgdGhlIHZhbHVlIDEwIGlzIHVzZWQgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBiYXRjaFNpemUgVGhlIG51bWJlciBvZiBkb2N1bWVudHMgcGVyIGJhdGNoIGZvciBNb25nb0RCIGN1cnNvciBgZ2V0TW9yZWAgb3BlcmF0aW9ucy4gQSBsb3dlciB2YWx1ZSByZWR1Y2VzIG1lbW9yeSB1c2FnZSBwZXIgYmF0Y2g7IGEgaGlnaGVyIHZhbHVlIHJlZHVjZXMgdGhlIG51bWJlciBvZiBuZXR3b3JrIHJvdW5kLXRyaXBzLlxuICogQHByb3BlcnR5IHtEYXRhYmFzZU9wdGlvbnNDbGllbnRNZXRhZGF0YX0gY2xpZW50TWV0YWRhdGEgQ3VzdG9tIG1ldGFkYXRhIHRvIGFwcGVuZCB0byBkYXRhYmFzZSBjbGllbnQgY29ubmVjdGlvbnMgZm9yIGlkZW50aWZ5aW5nIFBhcnNlIFNlcnZlciBpbnN0YW5jZXMgaW4gZGF0YWJhc2UgbG9ncy4gSWYgc2V0LCB0aGlzIG1ldGFkYXRhIHdpbGwgYmUgdmlzaWJsZSBpbiBkYXRhYmFzZSBsb2dzIGR1cmluZyBjb25uZWN0aW9uIGhhbmRzaGFrZXMuIFRoaXMgY2FuIGhlbHAgd2l0aCBkZWJ1Z2dpbmcgYW5kIG1vbml0b3JpbmcgaW4gZGVwbG95bWVudHMgd2l0aCBtdWx0aXBsZSBkYXRhYmFzZSBjbGllbnRzLiBTZXQgYG5hbWVgIHRvIGlkZW50aWZ5IHlvdXIgYXBwbGljYXRpb24gKGUuZy4sICdNeUFwcCcpIGFuZCBgdmVyc2lvbmAgdG8geW91ciBhcHBsaWNhdGlvbidzIHZlcnNpb24uIExlYXZlIHVuZGVmaW5lZCAoZGVmYXVsdCkgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUgYW5kIGF2b2lkIHRoZSBhZGRpdGlvbmFsIGRhdGEgdHJhbnNmZXIgb3ZlcmhlYWQuXG4gKiBAcHJvcGVydHkge1VuaW9ufSBjb21wcmVzc29ycyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgYW4gYXJyYXkgb3IgY29tbWEtZGVsaW1pdGVkIHN0cmluZyBvZiBjb21wcmVzc29ycyB0byBlbmFibGUgbmV0d29yayBjb21wcmVzc2lvbiBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoaXMgY2xpZW50IGFuZCBhIG1vbmdvZC9tb25nb3MgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge051bWJlcn0gY29ubmVjdFRpbWVvdXRNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgdG8gZXN0YWJsaXNoIGEgc2luZ2xlIFRDUCBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGJlZm9yZSByYWlzaW5nIGFuIGVycm9yLiBTcGVjaWZ5aW5nIDAgZGlzYWJsZXMgdGhlIGNvbm5lY3Rpb24gdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhBdXRoRGF0YVVuaXF1ZW5lc3MgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSB1bmlxdWUgaW5kZXhlcyBvbiB0aGUgYXV0aERhdGEgZmllbGRzIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIGZvciBlYWNoIGNvbmZpZ3VyZWQgYXV0aCBwcm92aWRlciBvbiBzZXJ2ZXIgc3RhcnQsIGluY2x1ZGluZyBgYW5vbnltb3VzYCB3aGVuIGFub255bW91cyB1c2VycyBhcmUgZW5hYmxlZC4gVGhlc2UgaW5kZXhlcyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgY29uY3VycmVudCBzaWdudXBzIHdpdGggdGhlIHNhbWUgYXV0aERhdGEuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXhlcywga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXhlcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gYmUgb3B0aW1pemVkIGZvciB0aGUgaW50ZXJuYWwgdXNhZ2UgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBjcmVhdGVJbmRleFJvbGVOYW1lIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSB1bmlxdWUgaW5kZXggb24gdGhlIG5hbWUgZmllbGQgb2YgdGhlIF9Sb2xlIGNvbGxlY3Rpb24gb24gc2VydmVyIHN0YXJ0LiBTZXQgdG8gYGZhbHNlYCB0byBza2lwIGluZGV4IGNyZWF0aW9uLiBEZWZhdWx0IGlzIGB0cnVlYC48YnI+PGJyPuKaoO+4jyBXaGVuIHNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGZhbHNlYCB0byBtYW51YWxseSBjcmVhdGUgdGhlIGluZGV4LCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgb3RoZXJ3aXNlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpbmRleCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gYmUgb3B0aW1pemVkIGZvciB0aGUgaW50ZXJuYWwgdXNhZ2UgYnkgUGFyc2UgU2VydmVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBjcmVhdGVJbmRleFVzZXJFbWFpbCBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGluZGV4ZXMgb24gdGhlIGVtYWlsIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyRW1haWxDYXNlSW5zZW5zaXRpdmUgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIGNhc2UtaW5zZW5zaXRpdmUgaW5kZXggb24gdGhlIGVtYWlsIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyRW1haWxWZXJpZnlUb2tlbiBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGFuIGluZGV4IG9uIHRoZSBfZW1haWxfdmVyaWZ5X3Rva2VuIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyUGFzc3dvcmRSZXNldFRva2VuIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYW4gaW5kZXggb24gdGhlIF9wZXJpc2hhYmxlX3Rva2VuIGZpZWxkIG9mIHRoZSBfVXNlciBjb2xsZWN0aW9uIG9uIHNlcnZlciBzdGFydC4gU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCBpbmRleCBjcmVhdGlvbi4gRGVmYXVsdCBpcyBgdHJ1ZWAuPGJyPjxicj7imqDvuI8gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgdG8gbWFudWFsbHkgY3JlYXRlIHRoZSBpbmRleCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlIG90aGVyd2lzZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW5kZXggbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGJlIG9wdGltaXplZCBmb3IgdGhlIGludGVybmFsIHVzYWdlIGJ5IFBhcnNlIFNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlSW5kZXhVc2VyVXNlcm5hbWUgU2V0IHRvIGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBpbmRleGVzIG9uIHRoZSB1c2VybmFtZSBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZUluZGV4VXNlclVzZXJuYW1lQ2FzZUluc2Vuc2l0aXZlIFNldCB0byBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSBjYXNlLWluc2Vuc2l0aXZlIGluZGV4IG9uIHRoZSB1c2VybmFtZSBmaWVsZCBvZiB0aGUgX1VzZXIgY29sbGVjdGlvbiBvbiBzZXJ2ZXIgc3RhcnQuIFNldCB0byBgZmFsc2VgIHRvIHNraXAgaW5kZXggY3JlYXRpb24uIERlZmF1bHQgaXMgYHRydWVgLjxicj48YnI+4pqg77iPIFdoZW4gc2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIHRvIG1hbnVhbGx5IGNyZWF0ZSB0aGUgaW5kZXgsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBvdGhlcndpc2UgYXV0b21hdGljYWxseSBjcmVhdGVkIGluZGV4IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoZSBpbnRlcm5hbCB1c2FnZSBieSBQYXJzZSBTZXJ2ZXIuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGRpcmVjdENvbm5lY3Rpb24gVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBmb3JjZSBhIFNpbmdsZSB0b3BvbG9neSB0eXBlIHdpdGggYSBjb25uZWN0aW9uIHN0cmluZyBjb250YWluaW5nIG9uZSBob3N0LlxuICogQHByb3BlcnR5IHtCb29sZWFufSBkaXNhYmxlSW5kZXhGaWVsZFZhbGlkYXRpb24gU2V0IHRvIGB0cnVlYCB0byBkaXNhYmxlIHZhbGlkYXRpb24gb2YgaW5kZXggZmllbGRzLiBXaGVuIGRpc2FibGVkLCBpbmRleGVzIGNhbiBiZSBjcmVhdGVkIGV2ZW4gaWYgdGhlIGZpZWxkcyBkbyBub3QgZXhpc3QgaW4gdGhlIHNjaGVtYS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gY3JlYXRpbmcgaW5kZXhlcyBvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIGFkZGVkIGxhdGVyLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVTY2hlbWFIb29rcyBFbmFibGVzIGRhdGFiYXNlIHJlYWwtdGltZSBob29rcyB0byB1cGRhdGUgc2luZ2xlIHNjaGVtYSBjYWNoZS4gU2V0IHRvIGB0cnVlYCBpZiB1c2luZyBtdWx0aXBsZSBQYXJzZSBTZXJ2ZXJzIGluc3RhbmNlcyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgZGF0YWJhc2UuIEZhaWxpbmcgdG8gZG8gc28gd2lsbCBjYXVzZSBhIHNjaGVtYSBjaGFuZ2UgdG8gbm90IHByb3BhZ2F0ZSB0byBhbGwgaW5zdGFuY2VzIGFuZCByZS1zeW5jaW5nIHdpbGwgb25seSBoYXBwZW4gd2hlbiB0aGUgaW5zdGFuY2VzIHJlc3RhcnQuIFRvIHVzZSB0aGlzIGZlYXR1cmUgd2l0aCBNb25nb0RCLCBhIHJlcGxpY2Egc2V0IGNsdXN0ZXIgd2l0aCBbY2hhbmdlIHN0cmVhbV0oaHR0cHM6Ly9kb2NzLm1vbmdvZGIuY29tL21hbnVhbC9jaGFuZ2VTdHJlYW1zLyNhdmFpbGFiaWxpdHkpIHN1cHBvcnQgaXMgcmVxdWlyZWQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGZvcmNlU2VydmVyT2JqZWN0SWQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBmb3JjZSBzZXJ2ZXIgdG8gYXNzaWduIF9pZCB2YWx1ZXMgaW5zdGVhZCBvZiBkcml2ZXIuXG4gKiBAcHJvcGVydHkge051bWJlcn0gaGVhcnRiZWF0RnJlcXVlbmN5TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBmcmVxdWVuY3kgaW4gbWlsbGlzZWNvbmRzIGF0IHdoaWNoIHRoZSBkcml2ZXIgY2hlY2tzIHRoZSBzdGF0ZSBvZiB0aGUgTW9uZ29EQiBkZXBsb3ltZW50LlxuICogQHByb3BlcnR5IHtCb29sZWFufSBsb2FkQmFsYW5jZWQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBpbnN0cnVjdCB0aGUgZHJpdmVyIGl0IGlzIGNvbm5lY3RpbmcgdG8gYSBsb2FkIGJhbGFuY2VyIGZyb250aW5nIGEgbW9uZ29zIGxpa2Ugc2VydmljZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBsb2NhbFRocmVzaG9sZE1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgc2l6ZSAoaW4gbWlsbGlzZWNvbmRzKSBvZiB0aGUgbGF0ZW5jeSB3aW5kb3cgZm9yIHNlbGVjdGluZyBhbW9uZyBtdWx0aXBsZSBzdWl0YWJsZSBNb25nb0RCIGluc3RhbmNlcy5cbiAqIEBwcm9wZXJ0eSB7TG9nQ2xpZW50RXZlbnRbXX0gbG9nQ2xpZW50RXZlbnRzIEFuIGFycmF5IG9mIE1vbmdvREIgY2xpZW50IGV2ZW50IGNvbmZpZ3VyYXRpb25zIHRvIGVuYWJsZSBsb2dnaW5nIG9mIHNwZWNpZmljIGV2ZW50cy5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhDb25uZWN0aW5nIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBtYXkgYmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZXN0YWJsaXNoZWQgY29uY3VycmVudGx5IGJ5IHRoZSBjb25uZWN0aW9uIHBvb2wuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4SWRsZVRpbWVNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGF0IGEgY29ubmVjdGlvbiBjYW4gcmVtYWluIGlkbGUgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbCBiZWZvcmUgYmVpbmcgcmVtb3ZlZCBhbmQgY2xvc2VkLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1heFBvb2xTaXplIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuZWQsIGNhY2hlZCwgcmVhZHktdG8tdXNlIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG1haW50YWluZWQgYnkgdGhlIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtYXhTdGFsZW5lc3NTZWNvbmRzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtYXhpbXVtIHJlcGxpY2F0aW9uIGxhZyBmb3IgcmVhZHMgZnJvbSBzZWNvbmRhcnkgbm9kZXMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gbWF4VGltZU1TIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IGEgY3VtdWxhdGl2ZSB0aW1lIGxpbWl0IGluIG1pbGxpc2Vjb25kcyBmb3IgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGEgY3Vyc29yLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IG1pblBvb2xTaXplIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc2V0IHRoZSBtaW5pbXVtIG51bWJlciBvZiBvcGVuZWQsIGNhY2hlZCwgcmVhZHktdG8tdXNlIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG1haW50YWluZWQgYnkgdGhlIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm94eUhvc3QgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBjb25maWd1cmUgYSBTb2NrczUgcHJveHkgaG9zdCB1c2VkIGZvciBjcmVhdGluZyBUQ1AgY29ubmVjdGlvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcHJveHlQYXNzd29yZCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGNvbmZpZ3VyZSBhIFNvY2tzNSBwcm94eSBwYXNzd29yZCB3aGVuIHRoZSBwcm94eSByZXF1aXJlcyB1c2VybmFtZS9wYXNzd29yZCBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwcm94eVBvcnQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBjb25maWd1cmUgYSBTb2NrczUgcHJveHkgcG9ydCB1c2VkIGZvciBjcmVhdGluZyBUQ1AgY29ubmVjdGlvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcHJveHlVc2VybmFtZSBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGNvbmZpZ3VyZSBhIFNvY2tzNSBwcm94eSB1c2VybmFtZSB3aGVuIHRoZSBwcm94eSByZXF1aXJlcyB1c2VybmFtZS9wYXNzd29yZCBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSByZWFkQ29uY2VybkxldmVsIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbGV2ZWwgb2YgaXNvbGF0aW9uLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWRQcmVmZXJlbmNlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcmVhZCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtBbnlbXX0gcmVhZFByZWZlcmVuY2VUYWdzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gc3BlY2lmeSB0aGUgdGFncyBkb2N1bWVudCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbG9uLXNlcGFyYXRlZCBrZXktdmFsdWUgcGFpcnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcmVwbGljYVNldCBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHJlcGxpY2Egc2V0LCBpZiB0aGUgbW9uZ29kIGlzIGEgbWVtYmVyIG9mIGEgcmVwbGljYSBzZXQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHJldHJ5UmVhZHMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBlbmFibGUgcmV0cnlhYmxlIHJlYWRzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSByZXRyeVdyaXRlcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNldCB3aGV0aGVyIHRvIHJldHJ5IGZhaWxlZCB3cml0ZXMuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc2NoZW1hQ2FjaGVUdGwgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNjaGVtYSBjYWNoZSBleHBpcmVzIGFuZCB3aWxsIGJlIHJlZmV0Y2hlZCBmcm9tIHRoZSBkYXRhYmFzZS4gVXNlIHRoaXMgb3B0aW9uIGlmIHVzaW5nIG11bHRpcGxlIFBhcnNlIFNlcnZlcnMgaW5zdGFuY2VzIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBkYXRhYmFzZS4gQSBsb3cgZHVyYXRpb24gd2lsbCBjYXVzZSB0aGUgc2NoZW1hIGNhY2hlIHRvIGJlIHVwZGF0ZWQgdG9vIG9mdGVuLCBjYXVzaW5nIHVubmVjZXNzYXJ5IGRhdGFiYXNlIHJlYWRzLiBBIGhpZ2ggZHVyYXRpb24gd2lsbCBjYXVzZSB0aGUgc2NoZW1hIHRvIGJlIHVwZGF0ZWQgdG9vIHJhcmVseSwgaW5jcmVhc2luZyB0aGUgdGltZSByZXF1aXJlZCB1bnRpbCBzY2hlbWEgY2hhbmdlcyBwcm9wYWdhdGUgdG8gYWxsIHNlcnZlciBpbnN0YW5jZXMuIFRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBvciBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpb24gYGVuYWJsZVNjaGVtYUhvb2tzYC4gRGVmYXVsdCBpcyBpbmZpbml0ZSB3aGljaCBtZWFucyB0aGUgc2NoZW1hIGNhY2hlIG5ldmVyIGV4cGlyZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2VydmVyTW9uaXRvcmluZ01vZGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBpbnN0cnVjdCB0aGUgZHJpdmVyIG1vbml0b3JzIHRvIHVzZSBhIHNwZWNpZmljIG1vbml0b3JpbmcgbW9kZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzZXJ2ZXJTZWxlY3Rpb25UaW1lb3V0TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIGEgc2VydmVyIHRvIGJlIGNvbnNpZGVyZWQgc3VpdGFibGUgZm9yIHNlbGVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzb2NrZXRUaW1lb3V0TVMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBzcGVudCBhdHRlbXB0aW5nIHRvIHNlbmQgb3IgcmVjZWl2ZSBvbiBhIHNvY2tldCBiZWZvcmUgdGltaW5nIG91dC4gU3BlY2lmeWluZyAwIG1lYW5zIG5vIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge051bWJlcn0gc3J2TWF4SG9zdHMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBob3N0cyB0byBjb25uZWN0IHRvIHdoZW4gdXNpbmcgYW4gc3J2IGNvbm5lY3Rpb24gc3RyaW5nLCBhIHNldHRpbmcgb2YgMCBtZWFucyB1bmxpbWl0ZWQgaG9zdHMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc3J2U2VydmljZU5hbWUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBtb2RpZnkgdGhlIHNydiBVUkkgc2VydmljZSBuYW1lLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBzc2wgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBlbmFibGUgb3IgZGlzYWJsZSBUTFMvU1NMIGZvciB0aGUgY29ubmVjdGlvbiAoZXF1aXZhbGVudCB0byB0bHMgb3B0aW9uKS5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdGxzIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZW5hYmxlIG9yIGRpc2FibGUgVExTL1NTTCBmb3IgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHRsc0FsbG93SW52YWxpZENlcnRpZmljYXRlcyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIGJ5cGFzcyB2YWxpZGF0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgcHJlc2VudGVkIGJ5IHRoZSBtb25nb2QvbW9uZ29zIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtCb29sZWFufSB0bHNBbGxvd0ludmFsaWRIb3N0bmFtZXMgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBkaXNhYmxlIGhvc3RuYW1lIHZhbGlkYXRpb24gb2YgdGhlIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSB0aGUgbW9uZ29kL21vbmdvcyBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0bHNDQUZpbGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBhIGxvY2FsIC5wZW0gZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSByb290IGNlcnRpZmljYXRlIGNoYWluIGZyb20gdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0bHNDZXJ0aWZpY2F0ZUtleUZpbGUgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBhIGxvY2FsIC5wZW0gZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGllbnQncyBUTFMvU1NMIGNlcnRpZmljYXRlIGFuZCBrZXkuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gdGxzQ2VydGlmaWNhdGVLZXlGaWxlUGFzc3dvcmQgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSB0bHNDZXJ0aWZpY2F0ZUtleUZpbGUuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHRsc0luc2VjdXJlIFRoZSBNb25nb0RCIGRyaXZlciBvcHRpb24gdG8gZGlzYWJsZSB2YXJpb3VzIGNlcnRpZmljYXRlIHZhbGlkYXRpb25zLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHdhaXRRdWV1ZVRpbWVvdXRNUyBUaGUgTW9uZ29EQiBkcml2ZXIgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCBhIHRocmVhZCBjYW4gd2FpdCBmb3IgYSBjb25uZWN0aW9uIHRvIGJlY29tZSBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge051bWJlcn0gemxpYkNvbXByZXNzaW9uTGV2ZWwgVGhlIE1vbmdvREIgZHJpdmVyIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpZiB1c2luZyB6bGliIGZvciBuZXR3b3JrIGNvbXByZXNzaW9uICgwLTkpLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBEYXRhYmFzZU9wdGlvbnNDbGllbnRNZXRhZGF0YVxuICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgdG8gaWRlbnRpZnkgeW91ciBhcHBsaWNhdGlvbiBpbiBkYXRhYmFzZSBsb2dzIChlLmcuLCAnTXlBcHAnKS5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHlvdXIgYXBwbGljYXRpb24gKGUuZy4sICcxLjAuMCcpLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBBdXRoQWRhcHRlclxuICogQHByb3BlcnR5IHtCb29sZWFufSBlbmFibGVkIElzIGB0cnVlYCBpZiB0aGUgYXV0aCBhZGFwdGVyIGlzIGVuYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5cbi8qKlxuICogQGludGVyZmFjZSBMb2dMZXZlbHNcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjbG91ZEZ1bmN0aW9uRXJyb3IgTG9nIGxldmVsIHVzZWQgYnkgdGhlIENsb3VkIENvZGUgRnVuY3Rpb25zIG9uIGVycm9yLiBEZWZhdWx0IGlzIGBlcnJvcmAuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGNsb3VkRnVuY3Rpb25TdWNjZXNzIExvZyBsZXZlbCB1c2VkIGJ5IHRoZSBDbG91ZCBDb2RlIEZ1bmN0aW9ucyBvbiBzdWNjZXNzLiBEZWZhdWx0IGlzIGBpbmZvYC4gU2VlIFtMb2dMZXZlbF0oTG9nTGV2ZWwuaHRtbCkgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gc2lnbnVwVXNlcm5hbWVUYWtlbiBMb2cgbGV2ZWwgdXNlZCB3aGVuIGEgc2lnbi11cCBmYWlscyBiZWNhdXNlIHRoZSB1c2VybmFtZSBhbHJlYWR5IGV4aXN0cy4gRGVmYXVsdCBpcyBgaW5mb2AuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRyaWdnZXJBZnRlciBMb2cgbGV2ZWwgdXNlZCBieSB0aGUgQ2xvdWQgQ29kZSBUcmlnZ2VycyBgYWZ0ZXJTYXZlYCwgYGFmdGVyRGVsZXRlYCwgYGFmdGVyRmluZGAsIGBhZnRlckxvZ291dGAuIERlZmF1bHQgaXMgYGluZm9gLiBTZWUgW0xvZ0xldmVsXShMb2dMZXZlbC5odG1sKSBmb3IgYXZhaWxhYmxlIHZhbHVlcy5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB0cmlnZ2VyQmVmb3JlRXJyb3IgTG9nIGxldmVsIHVzZWQgYnkgdGhlIENsb3VkIENvZGUgVHJpZ2dlcnMgYGJlZm9yZVNhdmVgLCBgYmVmb3JlRGVsZXRlYCwgYGJlZm9yZUZpbmRgLCBgYmVmb3JlTG9naW5gIG9uIGVycm9yLiBEZWZhdWx0IGlzIGBlcnJvcmAuIFNlZSBbTG9nTGV2ZWxdKExvZ0xldmVsLmh0bWwpIGZvciBhdmFpbGFibGUgdmFsdWVzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IHRyaWdnZXJCZWZvcmVTdWNjZXNzIExvZyBsZXZlbCB1c2VkIGJ5IHRoZSBDbG91ZCBDb2RlIFRyaWdnZXJzIGBiZWZvcmVTYXZlYCwgYGJlZm9yZURlbGV0ZWAsIGBiZWZvcmVGaW5kYCwgYGJlZm9yZUxvZ2luYCBvbiBzdWNjZXNzLiBEZWZhdWx0IGlzIGBpbmZvYC4gU2VlIFtMb2dMZXZlbF0oTG9nTGV2ZWwuaHRtbCkgZm9yIGF2YWlsYWJsZSB2YWx1ZXMuXG4gKi9cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQSIsImlnbm9yZUxpc3QiOltdfQ==
|