@mnaoumov/typescript-lib 2.0.0 → 3.0.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.
Files changed (49) hide show
  1. package/README.md +21 -0
  2. package/dist/lib/cjs/async-events.cjs +1 -1
  3. package/dist/lib/cjs/async-events.d.cts +12 -12
  4. package/dist/lib/cjs/async.cjs +4 -5
  5. package/dist/lib/cjs/async.d.cts +2 -2
  6. package/dist/lib/cjs/debug-controller.cjs +1 -1
  7. package/dist/lib/cjs/debug-controller.d.cts +4 -4
  8. package/dist/lib/cjs/debug-switches.cjs +1 -1
  9. package/dist/lib/cjs/debug-switches.d.cts +2 -2
  10. package/dist/lib/cjs/desktop-zip-extractor.cjs +1 -1
  11. package/dist/lib/cjs/desktop-zip-extractor.d.cts +2 -2
  12. package/dist/lib/cjs/disposable.cjs +1 -1
  13. package/dist/lib/cjs/disposable.d.cts +2 -2
  14. package/dist/lib/cjs/error.cjs +23 -5
  15. package/dist/lib/cjs/html-element.cjs +1 -1
  16. package/dist/lib/cjs/html-element.d.cts +3 -3
  17. package/dist/lib/cjs/object-utils.cjs +5 -5
  18. package/dist/lib/cjs/object-utils.d.cts +6 -6
  19. package/dist/lib/cjs/string.cjs +1 -1
  20. package/dist/lib/cjs/string.d.cts +6 -6
  21. package/dist/lib/cjs/transformers/transformer.cjs +1 -1
  22. package/dist/lib/cjs/type.cjs +1 -1
  23. package/dist/lib/cjs/type.d.cts +3 -3
  24. package/dist/lib/cjs/value-provider.cjs +1 -1
  25. package/dist/lib/cjs/value-provider.d.cts +1 -1
  26. package/dist/lib/esm/async-events.d.mts +12 -12
  27. package/dist/lib/esm/async-events.mjs +1 -1
  28. package/dist/lib/esm/async.d.mts +2 -2
  29. package/dist/lib/esm/async.mjs +5 -9
  30. package/dist/lib/esm/debug-controller.d.mts +4 -4
  31. package/dist/lib/esm/debug-switches.d.mts +2 -2
  32. package/dist/lib/esm/debug-switches.mjs +1 -1
  33. package/dist/lib/esm/desktop-zip-extractor.d.mts +2 -2
  34. package/dist/lib/esm/desktop-zip-extractor.mjs +1 -1
  35. package/dist/lib/esm/disposable.d.mts +2 -2
  36. package/dist/lib/esm/disposable.mjs +1 -1
  37. package/dist/lib/esm/error.mjs +23 -5
  38. package/dist/lib/esm/html-element.d.mts +3 -3
  39. package/dist/lib/esm/html-element.mjs +1 -1
  40. package/dist/lib/esm/object-utils.d.mts +6 -6
  41. package/dist/lib/esm/object-utils.mjs +5 -5
  42. package/dist/lib/esm/string.d.mts +6 -6
  43. package/dist/lib/esm/string.mjs +1 -1
  44. package/dist/lib/esm/transformers/transformer.mjs +1 -1
  45. package/dist/lib/esm/type.d.mts +3 -3
  46. package/dist/lib/esm/type.mjs +1 -1
  47. package/dist/lib/esm/value-provider.d.mts +1 -1
  48. package/dist/lib/esm/value-provider.mjs +1 -1
  49. package/package.json +18 -14
package/README.md CHANGED
@@ -58,6 +58,27 @@ Running the schemas belongs to whoever owns the call path. `@mnaoumov/obsidian-l
58
58
 
59
59
  A contract's own test can use `@mnaoumov/typescript-lib/api-contract-verifier`. `verifyApiContract(contract, { cases, vendor })` takes valid and invalid sample payloads for each half of each method and returns every violation it finds: a method the contract and the cases disagree on, a missing schema, a wrong vendor, a valid payload refused or an invalid one accepted. It returns a list rather than asserting, so it works under any test runner: `expect(await verifyApiContract(...)).toEqual([])`. `validateSync(schema, value)` runs a schema that must answer synchronously, and throws when it answers with a promise.
60
60
 
61
+ ## See also
62
+
63
+ | Library | Features | How `@mnaoumov/typescript-lib` differs |
64
+ | --- | --- | --- |
65
+ | [`@antfu/utils`](https://github.com/antfu/utils) | Opinionated, tree-shakable helpers for arrays, objects, strings, math, time, promises, guards and type utilities, meant to be bundled into the consumer. | Overlaps on promise, string and guard helpers; adds abort-aware timing, disposables, debug namespaces and switches, and API contracts; has fewer array and object helpers. |
66
+ | [`es-toolkit`](https://github.com/toss/es-toolkit) | Performance-focused Lodash replacement with array, object, string, function, promise, predicate, math and error helpers, plus a Lodash compatibility layer. | Narrower collection helpers and no Lodash compatibility; adds disposables, debug logging, path helpers, value providers and Standard Schema API contracts. |
67
+ | [`radashi`](https://github.com/radashi-org/radashi) | Maintained successor to Radash: array, async (`retry`, `sleep`, `timeout`), object, string, number, random and typed-guard helpers. | Overlaps on async and type guards; adds abort-signal helpers, disposables, debug switches and API contracts; has fewer array, object and random helpers. |
68
+ | [`remeda`](https://github.com/remeda/remeda) | Data-first and data-last collection utilities with automatic currying, lazy `pipe` evaluation and precise tuple-aware types. | Not a collection or pipeline library: no `pipe` or currying; it targets async, error, disposable, debug and path concerns instead. |
69
+
70
+ Last searched for similar libraries on 2026-11-04.
71
+
72
+ ## Changelog
73
+
74
+ All notable changes to this project will be documented in the [CHANGELOG](./CHANGELOG.md).
75
+
76
+ ## Filing an issue (for AI agents and humans)
77
+
78
+ Open issues through the [issue forms](https://github.com/mnaoumov/typescript-lib/issues/new/choose), not as blank issues.
79
+
80
+ Filing from the CLI or the API (`gh issue create --body`, or an AI agent filing for you) skips the form, and `gh issue create --template` cannot load an issue form. In that case, open the matching form in [`.github/ISSUE_TEMPLATE/`](https://github.com/mnaoumov/typescript-lib/tree/HEAD/.github/ISSUE_TEMPLATE), copy every field as a `### <label>` heading in the form's order, and fill in each one. Always state the version you used and your operating system.
81
+
61
82
  ## License
62
83
 
63
84
  © [Michael Naumov](https://github.com/mnaoumov/)
@@ -405,4 +405,4 @@ function throwDelayed(error) {
405
405
  mixinAsyncEvents,
406
406
  subscribeAsyncDisposableEvent
407
407
  });
408
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLWV2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdENvbnN0cnVjdG9yLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNEaXNwb3NhYmxlRXggfSBmcm9tICcuL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi90eXBlLnRzJztcblxuaW1wb3J0IHtcbiAgZmlsdGVySW5QbGFjZSxcbiAgc25hcHNob3Rcbn0gZnJvbSAnLi9hcnJheS50cyc7XG5pbXBvcnQgeyBBc3luY0Rpc3Bvc2FibGVCYXNlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcblxuZGVjbGFyZSBjb25zdCBBU1lOQ19FVkVOVF9NQVA6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRXZlbnRSZWYge1xuICAvKipcbiAgICogQW4gZXZlbnQgc291cmNlLlxuICAgKi9cbiAgYXN5bmNFdmVudFNvdXJjZTogR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2U7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqL1xuICBjYWxsYmFjazogR2VuZXJpY0NhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICovXG4gIHRoaXNBcmd1bWVudDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBc3luYyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4gZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBQaGFudG9tIG1hcmtlciB0aGF0IG1ha2VzIHtAbGluayBFdmVudE1hcH0gaW5mZXJhYmxlIGZyb20gYW4ge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IChlLmcuIHZpYVxuICAgKiBgU291cmNlIGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxpbmZlciBFdmVudE1hcD5gKS4gTmV2ZXIgcHJlc2VudCBhdCBydW50aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgW0FTWU5DX0VWRU5UX01BUF0/OiBFdmVudE1hcDtcblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vZmYoJ215LWV2ZW50JywgbXlMaXN0ZW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9mZjogPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gICkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCBPYnNpZGlhbidzIGBFdmVudHMub25gIChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub24oJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9uOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3VtZW50cyBleHRlbmRzIENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZ3VtZW50PzogdW5rbm93blxuICApID0+IEFzeW5jRXZlbnRSZWY7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIG9ubHkgb25jZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJndW1lbnQgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGggT2JzaWRpYW4ncyBgRXZlbnRzLm9uYCAob3Igb25jZSwgY29ycmVzcG9uZGluZ2x5KS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9uY2UoJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9uY2U6IDxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICkgPT4gQXN5bmNFdmVudFJlZjtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZXhwb3NpbmcgZXZlbnQtdHJpZ2dlcmluZyBtZXRob2RzIGZvciBzdWJjbGFzc2VzIG9mIG1peGluLWNyZWF0ZWQgY2xhc3Nlcy5cbiAqXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBgcHJvdGVjdGVkYCBhdCBydW50aW1lIGJ1dCBzdXJmYWNlZCBpbiB0aGUgZGVjbGFyYXRpb24gdHlwZVxuICogYmVjYXVzZSBUeXBlU2NyaXB0IGNhbm5vdCByZXByZXNlbnQgYHByb3RlY3RlZGAgaW4gYW5vbnltb3VzLWNsYXNzIHJldHVybiB0eXBlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNFdmVudFRyaWdnZXI8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPiB7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICB0cmlnZ2VyOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgdHJpZ2dlckFzeW5jOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHRyeVRyaWdnZXI6IDxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCAkYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgdHJ5VHJpZ2dlckFzeW5jOiA8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGNhbGxiYWNrIGFyZ3VtZW50IHR5cGVzIGZvciBhbiBldmVudC5cbiAqXG4gKiAtIFdoZW4gYEV2ZW50TWFwYCBoYXMgYW4gaW5kZXggc2lnbmF0dXJlICh1bnR5cGVkIGRlZmF1bHQpOiByZXR1cm5zIGB1bmtub3duW11gLFxuICogICBhbGxvd2luZyBgQXJnc2AgdG8gYmUgaW5mZXJyZWQgZnJlZWx5IGZyb20gdGhlIGNhbGxiYWNrLlxuICogLSBXaGVuIGBFdmVudE1hcGAgaGFzIGV4cGxpY2l0IGtleXMgb25seSAodHlwZWQgbWFwKTogcmV0dXJucyBgRXZlbnRNYXBbRXZlbnROYW1lXWAsXG4gKiAgIGVuZm9yY2luZyB0aGUgZGVjbGFyZWQgYXJndW1lbnQgdHlwZXMgYW5kIGVuYWJsaW5nIGF1dG9jb21wbGV0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZSBleHRlbmRzIHN0cmluZz4gPSBzdHJpbmcgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IHVua25vd25bXVxuICA6IChFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IEV2ZW50TWFwW0V2ZW50TmFtZV0gOiB1bmtub3duW10pO1xuXG4vKipcbiAqIEJhc2UgZXZlbnQgbWFwIHR5cGUgZm9yIHVudHlwZWQgZW1pdHRlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50TWFwQmFzZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT47XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBldmVudCBzb3VyY2UsIHVzZWQgYnkge0BsaW5rIEFzeW5jRXZlbnRSZWZ9XG4gKiBzbyB0aGF0IHJlZnMgY2FuIGJlIHN0b3JlZCByZWdhcmRsZXNzIG9mIHRoZSBlbWl0dGVyJ3MgYEV2ZW50TWFwYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgYnkgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgcmVmZXJlbmNlIHRvIHJlbW92ZS5cbiAgICovXG4gIG9mZnJlZjogKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudH0uXG4gKlxuICogQHR5cGVQYXJhbSBTb3VyY2UgLSBUaGUge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IHR5cGUuXG4gKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lLCBjb25zdHJhaW5lZCB0byB0aGUgc291cmNlJ3Mga25vd24gZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmliZUFzeW5jRGlzcG9zYWJsZUV2ZW50UGFyYW1zPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+IHtcbiAgLyoqXG4gICAqIFRoZSBhc3luYyBldmVudCBzb3VyY2UgdG8gc3Vic2NyaWJlIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYXN5bmNFdmVudFNvdXJjZTogU291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgY2FsbGJhY2suIEl0cyBhcmd1bWVudCB0eXBlcyBhcmUgaW5mZXJyZWQgZnJvbSB7QGxpbmsgU3Vic2NyaWJlQXN5bmNEaXNwb3NhYmxlRXZlbnRQYXJhbXMubmFtZX0uXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogQXN5bmNFdmVudENhbGxiYWNrT2Y8U291cmNlLCBFdmVudE5hbWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgbmFtZSB0byBzdWJzY3JpYmUgdG8uXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBFdmVudE5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgdGhpc0FyZ3VtZW50PzogdW5rbm93bjtcbn1cblxuLy8gVGhlIGNhbGxiYWNrIHR5cGUgZm9yIGEgZ2l2ZW4gZXZlbnQgb24gYW4gYXN5bmMgZXZlbnQgc291cmNlLCB3aXRoIGl0cyBhcmd1bWVudCB0dXBsZSBpbmZlcnJlZCBmcm9tIHRoZSBzb3VyY2UncyBldmVudCBtYXAuXG50eXBlIEFzeW5jRXZlbnRDYWxsYmFja09mPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+ID0gRXZlbnRNYXBPZjxTb3VyY2U+W0V2ZW50TmFtZV0gZXh0ZW5kcyBpbmZlciBBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10gPyAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gIDogbmV2ZXI7XG5cbi8vIFRoZSB1bmlvbiBvZiBrbm93biBldmVudCBuYW1lcyBmb3IgYW4gYXN5bmMgZXZlbnQgc291cmNlLCBkZXJpdmVkIGZyb20gaXRzIGV2ZW50IG1hcC5cbnR5cGUgQXN5bmNFdmVudE5hbWVPZjxTb3VyY2UgZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZT4gPSBrZXlvZiBFdmVudE1hcE9mPFNvdXJjZT4gJiBzdHJpbmc7XG5cbnR5cGUgRXZlbnRNYXBDb25zdHJhaW50PFQ+ID0gUmVjb3JkPGtleW9mIFQsIHVua25vd25bXT47XG5cbi8vIFJlY292ZXJzIHRoZSBldmVudCBtYXAgb2YgYW4gYXN5bmMgZXZlbnQgc291cmNlIHZpYSB0aGUgcGhhbnRvbSBtYXJrZXIgb24gYEFzeW5jRXZlbnRTb3VyY2VgLlxudHlwZSBFdmVudE1hcE9mPFNvdXJjZT4gPSBTb3VyY2UgZXh0ZW5kcyBBc3luY0V2ZW50U291cmNlPGluZmVyIEV2ZW50TWFwPiA/IEV2ZW50TWFwIDogbmV2ZXI7XG5cbnR5cGUgR2VuZXJpY0NhbGxiYWNrID0gR2VuZXJpY1Byb21pc2FibGVWb2lkRnVuY3Rpb248dW5rbm93bltdPjtcblxuLyoqXG4gKiBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnMgYW4ge0BsaW5rIEFzeW5jRXZlbnRSZWZ9IG9uIGRpc3Bvc2UsIHZpYSB0aGUgZXZlbnQgc291cmNlIHN0b3JlZFxuICogb24gdGhlIHJlZiBpdHNlbGYuIEFzeW5jIGNvdW50ZXJwYXJ0IG9mIHRoZSBuYXRpdmUgYEV2ZW50UmVmRGlzcG9zYWJsZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50UmVmRGlzcG9zYWJsZSBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZUJhc2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgd3JhcHBpbmcgYW4gZXhpc3Rpbmcge0BsaW5rIEFzeW5jRXZlbnRSZWZ9LlxuICAgKlxuICAgKiBAcGFyYW0gYXN5bmNFdmVudFJlZiAtIFRoZSBhc3luYyBldmVudCByZWZlcmVuY2UgdG8gdW5yZWdpc3RlciBvbiBkaXNwb3NlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXN5bmNFdmVudFJlZjogQXN5bmNFdmVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIGV2ZW50IHZpYSB0aGUgc291cmNlIHN0b3JlZCBvbiB0aGUgcmVmIChgYXN5bmNFdmVudFNvdXJjZS5vZmZyZWZgKS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwZXJmb3JtRGlzcG9zZUFzeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuYXN5bmNFdmVudFJlZi5hc3luY0V2ZW50U291cmNlLm9mZnJlZih0aGlzLmFzeW5jRXZlbnRSZWYpO1xuICB9XG59XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgc291cmNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzQmFzZTxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGltcGxlbWVudHMgQXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4ge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdHJ5IG1hcHBpbmcgZWFjaCBldmVudCBuYW1lIHRvIGl0cyBsaXN0IG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXIgcmVmZXJlbmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBldmVudFJlZmVyZW5jZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgQXN5bmNFdmVudFJlZltdPigpO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9mZignbXktZXZlbnQnLCBteUxpc3RlbmVyKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKGV2ZW50UmVmcywgKGV2ZW50UmVmKSA9PiBldmVudFJlZi5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuICAgIGlmIChldmVudFJlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmcmVmKG15UmVmKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZ2V0KGV2ZW50UmVmLm5hbWUpO1xuICAgIGlmICghZXZlbnRSZWZzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShldmVudFJlZnMsIChzdG9yZWRFdmVudFJlZikgPT4gc3RvcmVkRXZlbnRSZWYgIT09IGV2ZW50UmVmKTtcbiAgICBpZiAoZXZlbnRSZWZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZGVsZXRlKGV2ZW50UmVmLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbignbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgbGV0IGV2ZW50UmVmcyA9IHRoaXMuZXZlbnRSZWZlcmVuY2VzTWFwLmdldChuYW1lKTtcbiAgICBpZiAoIWV2ZW50UmVmcykge1xuICAgICAgZXZlbnRSZWZzID0gW107XG4gICAgICB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5zZXQobmFtZSwgZXZlbnRSZWZzKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudFJlZjogQXN5bmNFdmVudFJlZiA9IHtcbiAgICAgIGFzeW5jRXZlbnRTb3VyY2U6IHRoaXMsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2sgYXMgR2VuZXJpY0NhbGxiYWNrLFxuICAgICAgbmFtZSxcbiAgICAgIHRoaXNBcmd1bWVudFxuICAgIH07XG4gICAgZXZlbnRSZWZzLnB1c2goZXZlbnRSZWYpO1xuICAgIHJldHVybiBldmVudFJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCBvbmx5IG9uY2UuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbmNlKCdteS1ldmVudCcsIGFzeW5jIChhcmcxLCBhcmcyKSA9PiB7XG4gICAqICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgKiAgICAgY29uc29sZS5sb2coYXJnMSwgYXJnMik7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIGNvbnN0IG9yaWdpbmFsRXZlbnRSZWYgPSB0aGlzLm9uKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJndW1lbnQpO1xuICAgIGNvbnN0IGNsZWFudXBFdmVudFJlZiA9IHRoaXMub24obmFtZSwgKCkgPT4ge1xuICAgICAgdGhpcy5vZmZyZWYob3JpZ2luYWxFdmVudFJlZik7XG4gICAgICB0aGlzLm9mZnJlZihjbGVhbnVwRXZlbnRSZWYpO1xuICAgIH0pO1xuICAgIHJldHVybiBvcmlnaW5hbEV2ZW50UmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLnRyaWdnZXIoJ215LWV2ZW50JywgJ2FyZzEnLCAnYXJnMicpO1xuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCB0cmlnZ2VyPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+PihuYW1lOiBFdmVudE5hbWUsIC4uLiRhcmd1bWVudHM6IENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+KTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZ2V0KG5hbWUpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZXZlbnRSZWYgb2Ygc25hcHNob3QoZXZlbnRSZWZzKSkge1xuICAgICAgdGhpcy50cnlUcmlnZ2VyKGV2ZW50UmVmLCAkYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSkgPz8gW107XG4gICAgZm9yIChjb25zdCBldmVudFJlZiBvZiBzbmFwc2hvdChldmVudFJlZnMpKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyeVRyaWdnZXJBc3luYyhldmVudFJlZiwgJGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMudHJ5VHJpZ2dlcihteVJlZiwgWydhcmcxJywgJ2FyZzInXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHByb3RlY3RlZCB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBldmVudFJlZi5jYWxsYmFjay5jYWxsKGV2ZW50UmVmLnRoaXNBcmd1bWVudCwgLi4uJGFyZ3VtZW50cyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXN1bHQuY2F0Y2godGhyb3dEZWxheWVkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3dEZWxheWVkKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHksIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHByb3RlY3RlZCBhc3luYyB0cnlUcmlnZ2VyQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV2ZW50UmVmLmNhbGxiYWNrLmNhbGwoZXZlbnRSZWYudGhpc0FyZ3VtZW50LCAuLi4kYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3dEZWxheWVkKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgZXh0ZW5kcyB7QGxpbmsgQXN5bmNFdmVudHNCYXNlfSBhbmQgcHJvdmlkZXMgcHVibGljIG1ldGhvZHMgZm9yIHRyaWdnZXJpbmcgZXZlbnRzLlxuICpcbiAqIFRoaXMgY2xhc3MgZXhpc3RzIGFzIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50c2AuIEJ1dCBleHBvc2luZyBwdWJsaWNseSBgdHJpZ2dlcigpYCBtZXRob2RzIHZpb2xhdGVzIGVuY2Fwc3VsYXRpb24uXG4gKlxuICogQXZvaWQgdXNpbmcgaXQgaW4gZmF2b3Igb2Yge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIFRoZSB0eXBlIG9mIHRoZSBldmVudCBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50czxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGV4dGVuZHMgQXN5bmNFdmVudHNCYXNlPEV2ZW50TWFwPiB7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgIHN1cGVyLnRyaWdnZXIobmFtZSwgLi4uJGFyZ3VtZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gc3VwZXIudHJpZ2dlckFzeW5jKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvdmVycmlkZSB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgIHN1cGVyLnRyeVRyaWdnZXIoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgdHJ5VHJpZ2dlckFzeW5jPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzdXBlci50cnlUcmlnZ2VyQXN5bmMoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICB9XG59XG5cbi8qKlxuICogTWl4aW4gdGhhdCBhZGRzIHtAbGluayBBc3luY0V2ZW50U291cmNlfSBkZWxlZ2F0aW9uIHRvIGEgYmFzZSBjbGFzcy5cbiAqXG4gKiBBbGwgZXZlbnQgbWV0aG9kcyBkZWxlZ2F0ZSB0byBhIHByaXZhdGUge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0gaW5zdGFuY2UuXG4gKiBUaGUgYEV2ZW50TWFwYCBnZW5lcmljIGlzIGZpeGVkIGF0IG1peGluLWFwcGxpY2F0aW9uIHRpbWUgXHUyMDE0IGlmIHlvdSBuZWVkIGEgY2xhc3NcbiAqIHRoYXQgaXMgaXRzZWxmIGdlbmVyaWMgb3ZlciBpdHMgZXZlbnQgbWFwLCB1c2UgY29tcG9zaXRpb24gaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBiYXNlIGNsYXNzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzIGV4dGVuZGluZyBpdCB3aXRoIHtAbGluayBBc3luY0V2ZW50U291cmNlfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGludGVyZmFjZSBNeUV2ZW50cyB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogfVxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPE15RXZlbnRzPigpKENvbXBvbmVudCkge1xuICogICAvLyBvbigpLCBvZmYoKSwgb25jZSgpLCBvZmZyZWYoKSBhcmUgYXZhaWxhYmxlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluQXN5bmNFdmVudHM8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyPFRCYXNlIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+PihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlXG4gICk6IEFic3RyYWN0Q29uc3RydWN0b3I8QXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4gJiBBc3luY0V2ZW50VHJpZ2dlcjxFdmVudE1hcD4+ICYgVEJhc2Uge1xuICAgIGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzTWl4aW4gZXh0ZW5kcyBiYXNlQ2xhc3MgaW1wbGVtZW50cyBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiB7XG4gICAgICByZWFkb25seSAjYXN5bmNFdmVudHMgPSBuZXcgQXN5bmNFdmVudHM8RXZlbnRNYXA+KCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gICAgICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD5cbiAgICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy5vZmYobmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jYXN5bmNFdmVudHMub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAgICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICAgICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAgICAgKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgICAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgICAgICk6IEFzeW5jRXZlbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXN5bmNFdmVudHMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmd1bWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgICAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAgICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCBPYnNpZGlhbidzIGBFdmVudHMub25gIChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICAgIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgICAgICk6IEFzeW5jRXZlbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXN5bmNFdmVudHMub25jZShuYW1lLCBjYWxsYmFjaywgdGhpc0FyZ3VtZW50KTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICovXG4gICAgICBwcm90ZWN0ZWQgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy50cmlnZ2VyKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICAgKi9cbiAgICAgIHByb3RlY3RlZCBhc3luYyB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAgICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gUGFyaXR5IHdpdGggT2JzaWRpYW4ncyBFdmVudHMudHJ5VHJpZ2dlci5cbiAgICAgIHByb3RlY3RlZCB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy50cnlUcmlnZ2VyKGV2ZW50UmVmLCAkYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgICAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gUGFyaXR5IHdpdGggT2JzaWRpYW4ncyBFdmVudHMudHJ5VHJpZ2dlci5cbiAgICAgIHByb3RlY3RlZCBhc3luYyB0cnlUcmlnZ2VyQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FzeW5jRXZlbnRzLnRyeVRyaWdnZXJBc3luYyhldmVudFJlZiwgJGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFzeW5jRXZlbnRzTWl4aW4gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiAmIEFzeW5jRXZlbnRUcmlnZ2VyPEV2ZW50TWFwPj4gJiBUQmFzZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIGFuIGV2ZW50IG9uIGFuIHtAbGluayBBc3luY0V2ZW50U291cmNlfSBhbmQgcmV0dXJucyBhbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnNcbiAqIGl0IG9uIGRpc3Bvc2UuIEFzeW5jIGNvdW50ZXJwYXJ0IG9mIHRoZSBuYXRpdmUgYHN1YnNjcmliZURpc3Bvc2FibGVFdmVudGA7IHRoZSBldmVudCBuYW1lIGFuZCBjYWxsYmFjayBhcmd1bWVudFxuICogdHlwZXMgYXJlIGluZmVycmVkIGZyb20gdGhlIHNvdXJjZSdzIGV2ZW50IG1hcC5cbiAqXG4gKiBAdHlwZVBhcmFtIFNvdXJjZSAtIFRoZSB7QGxpbmsgQXN5bmNFdmVudFNvdXJjZX0gdHlwZS5cbiAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN1YnNjcmlwdGlvbiBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgQW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBoYW5kbGVyIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudDxTb3VyY2UgZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSwgRXZlbnROYW1lIGV4dGVuZHMgQXN5bmNFdmVudE5hbWVPZjxTb3VyY2U+PihcbiAgcGFyYW1zOiBTdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudFBhcmFtczxTb3VyY2UsIEV2ZW50TmFtZT5cbik6IEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgLy8gYFNvdXJjZWAgaXMgY29uc3RyYWluZWQgb25seSB0byB0aGUgb24tbGVzcyBgR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2VgIChzbyBhIHR5cGVkIHNvdXJjZSBpcyBhY2NlcHRlZCB3aGF0ZXZlclxuICAvLyBpdHMgZXZlbnQgbWFwJ3MgdmFyaWFuY2UpOyBldmVyeSBzb3VyY2UgaXMgYW4gYEFzeW5jRXZlbnRTb3VyY2VgLCBzbyBpdCBpcyBuYXJyb3dlZCB0byByZWFjaCBgb25gLCB3aG9zZSB0eXBlXG4gIC8vIHBhcmFtZXRlcnMgdGhlbiBpbmZlciBmcm9tIHRoZSAoYWxyZWFkeS10eXBlZCkgbmFtZSBhbmQgY2FsbGJhY2suXG4gIHJldHVybiBuZXcgQXN5bmNFdmVudFJlZkRpc3Bvc2FibGUoYXNBc3luY0V2ZW50U291cmNlKHBhcmFtcy5hc3luY0V2ZW50U291cmNlKS5vbihwYXJhbXMubmFtZSwgcGFyYW1zLmNhbGxiYWNrLCBwYXJhbXMudGhpc0FyZ3VtZW50KSk7XG59XG5cbi8vIE5hcnJvd3MgYSBzb3VyY2UgdG8ge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IHRvIHJlYWNoIGBvbmAuIEEgbG9jYWwgZXF1aXZhbGVudCBvZiBgY2FzdFRvYDogaW1wb3J0aW5nIGBjYXN0VG9gXG4vLyBmcm9tIGBvYmplY3QtdXRpbHNgIGhlcmUgd291bGQgY3JlYXRlIGEgbW9kdWxlIGN5Y2xlIChvYmplY3QtdXRpbHMgXHUyMTkyIGVycm9yIFx1MjE5MiBhc3luYy1ldmVudHMpLlxuZnVuY3Rpb24gYXNBc3luY0V2ZW50U291cmNlKHZhbHVlOiB1bmtub3duKTogQXN5bmNFdmVudFNvdXJjZSB7XG4gIHJldHVybiB2YWx1ZSBhcyBBc3luY0V2ZW50U291cmNlO1xufVxuXG5mdW5jdGlvbiB0aHJvd0RlbGF5ZWQoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRocm93IGVycm9yO1xuICB9LCAwKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsbUJBR087QUFDUCx3QkFBb0M7QUFxUTdCLE1BQU0sZ0NBQWdDLHNDQUFvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU14RCxZQUE2QixlQUE4QjtBQUNoRSxVQUFNO0FBRDRCO0FBQUEsRUFFcEM7QUFBQSxFQUZvQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT2pCLHNCQUE0QjtBQUM3QyxTQUFLLGNBQWMsaUJBQWlCLE9BQU8sS0FBSyxhQUFhO0FBQUEsRUFDL0Q7QUFDRjtBQTBCTyxNQUFlLGdCQUFvSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXJILHFCQUFxQixvQkFBSSxJQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCbEUsSUFDTCxNQUNBLFVBQ007QUFDTixVQUFNLFlBQVksS0FBSyxtQkFBbUIsSUFBSSxJQUFJO0FBQ2xELFFBQUksQ0FBQyxXQUFXO0FBQ2Q7QUFBQSxJQUNGO0FBRUEsb0NBQWMsV0FBVyxDQUFDLGFBQWEsU0FBUyxhQUFhLFFBQVE7QUFDckUsUUFBSSxVQUFVLFdBQVcsR0FBRztBQUMxQixXQUFLLG1CQUFtQixPQUFPLElBQUk7QUFBQSxJQUNyQztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWU8sT0FBTyxVQUErQjtBQUMzQyxVQUFNLFlBQVksS0FBSyxtQkFBbUIsSUFBSSxTQUFTLElBQUk7QUFDM0QsUUFBSSxDQUFDLFdBQVc7QUFDZDtBQUFBLElBQ0Y7QUFFQSxvQ0FBYyxXQUFXLENBQUMsbUJBQW1CLG1CQUFtQixRQUFRO0FBQ3hFLFFBQUksVUFBVSxXQUFXLEdBQUc7QUFDMUIsV0FBSyxtQkFBbUIsT0FBTyxTQUFTLElBQUk7QUFBQSxJQUM5QztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXVCTyxHQUNMLE1BQ0EsVUFDQSxjQUNlO0FBQ2YsUUFBSSxZQUFZLEtBQUssbUJBQW1CLElBQUksSUFBSTtBQUNoRCxRQUFJLENBQUMsV0FBVztBQUNkLGtCQUFZLENBQUM7QUFDYixXQUFLLG1CQUFtQixJQUFJLE1BQU0sU0FBUztBQUFBLElBQzdDO0FBRUEsVUFBTSxXQUEwQjtBQUFBLE1BQzlCLGtCQUFrQjtBQUFBLE1BQ2xCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQ0EsY0FBVSxLQUFLLFFBQVE7QUFDdkIsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXVCTyxLQUNMLE1BQ0EsVUFDQSxjQUNlO0FBQ2YsVUFBTSxtQkFBbUIsS0FBSyxHQUFHLE1BQU0sVUFBVSxZQUFZO0FBQzdELFVBQU0sa0JBQWtCLEtBQUssR0FBRyxNQUFNLE1BQU07QUFDMUMsV0FBSyxPQUFPLGdCQUFnQjtBQUM1QixXQUFLLE9BQU8sZUFBZTtBQUFBLElBQzdCLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY1UsUUFBZ0QsU0FBb0IsWUFBMEQ7QUFDdEksVUFBTSxZQUFZLEtBQUssbUJBQW1CLElBQUksSUFBSSxLQUFLLENBQUM7QUFDeEQsZUFBVyxnQkFBWSx1QkFBUyxTQUFTLEdBQUc7QUFDMUMsV0FBSyxXQUFXLFVBQVUsVUFBVTtBQUFBLElBQ3RDO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWdCLGFBQXFELFNBQW9CLFlBQW1FO0FBQzFKLFVBQU0sWUFBWSxLQUFLLG1CQUFtQixJQUFJLElBQUksS0FBSyxDQUFDO0FBQ3hELGVBQVcsZ0JBQVksdUJBQVMsU0FBUyxHQUFHO0FBQzFDLFlBQU0sS0FBSyxnQkFBZ0IsVUFBVSxVQUFVO0FBQUEsSUFDakQ7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWVVLFdBQXdDLFVBQXlCLFlBQTZCO0FBQ3RHLFFBQUk7QUFDRixZQUFNLFNBQVMsU0FBUyxTQUFTLEtBQUssU0FBUyxjQUFjLEdBQUcsVUFBVTtBQUMxRSxVQUFJLGtCQUFrQixTQUFTO0FBQzdCLGVBQU8sTUFBTSxZQUFZO0FBQUEsTUFDM0I7QUFBQSxJQUNGLFNBQVMsT0FBTztBQUNkLG1CQUFhLEtBQUs7QUFBQSxJQUNwQjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdBLE1BQWdCLGdCQUE2QyxVQUF5QixZQUFzQztBQUMxSCxRQUFJO0FBQ0YsWUFBTSxTQUFTLFNBQVMsS0FBSyxTQUFTLGNBQWMsR0FBRyxVQUFVO0FBQUEsSUFDbkUsU0FBUyxPQUFPO0FBQ2QsbUJBQWEsS0FBSztBQUFBLElBQ3BCO0FBQUEsRUFDRjtBQUNGO0FBV08sTUFBTSxvQkFBa0YsZ0JBQTBCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVF2RyxRQUFnRCxTQUFvQixZQUEwRDtBQUM1SSxVQUFNLFFBQVEsTUFBTSxHQUFHLFVBQVU7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVnQixhQUFxRCxTQUFvQixZQUFtRTtBQUMxSixXQUFPLE1BQU0sYUFBYSxNQUFNLEdBQUcsVUFBVTtBQUFBLEVBQy9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVWdCLFdBQXdDLFVBQXlCLFlBQTZCO0FBQzVHLFVBQU0sV0FBVyxVQUFVLFVBQVU7QUFBQSxFQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV0EsTUFBc0IsZ0JBQTZDLFVBQXlCLFlBQXNDO0FBQ2hJLFdBQU8sTUFBTSxnQkFBZ0IsVUFBVSxVQUFVO0FBQUEsRUFDbkQ7QUFDRjtBQXNCTyxTQUFTLG1CQUFpRjtBQUMvRixTQUFPLFNBQVMsTUFDZCxXQUN1RjtBQUFBLElBQ3ZGLE1BQWUseUJBQXlCLFVBQWdEO0FBQUEsTUFDN0UsZUFBZSxJQUFJLFlBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFXM0MsSUFDTCxNQUNBLFVBQ007QUFDTixhQUFLLGFBQWEsSUFBSSxNQUFNLFFBQVE7QUFBQSxNQUN0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU9PLE9BQU8sVUFBK0I7QUFDM0MsYUFBSyxhQUFhLE9BQU8sUUFBUTtBQUFBLE1BQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWVPLEdBQ0wsTUFDQSxVQUNBLGNBQ2U7QUFDZixlQUFPLEtBQUssYUFBYSxHQUFHLE1BQU0sVUFBVSxZQUFZO0FBQUEsTUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BZU8sS0FDTCxNQUNBLFVBQ0EsY0FDZTtBQUNmLGVBQU8sS0FBSyxhQUFhLEtBQUssTUFBTSxVQUFVLFlBQVk7QUFBQSxNQUM1RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFTVSxRQUFnRCxTQUFvQixZQUEwRDtBQUN0SSxhQUFLLGFBQWEsUUFBUSxNQUFNLEdBQUcsVUFBVTtBQUFBLE1BQy9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BVUEsTUFBZ0IsYUFBcUQsU0FBb0IsWUFBbUU7QUFDMUosY0FBTSxLQUFLLGFBQWEsYUFBYSxNQUFNLEdBQUcsVUFBVTtBQUFBLE1BQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BVVUsV0FBd0MsVUFBeUIsWUFBNkI7QUFDdEcsYUFBSyxhQUFhLFdBQVcsVUFBVSxVQUFVO0FBQUEsTUFDbkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVdBLE1BQWdCLGdCQUE2QyxVQUF5QixZQUFzQztBQUMxSCxjQUFNLEtBQUssYUFBYSxnQkFBZ0IsVUFBVSxVQUFVO0FBQUEsTUFDOUQ7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVlPLFNBQVMsOEJBQ2QsUUFDbUI7QUFJbkIsU0FBTyxJQUFJLHdCQUF3QixtQkFBbUIsT0FBTyxnQkFBZ0IsRUFBRSxHQUFHLE9BQU8sTUFBTSxPQUFPLFVBQVUsT0FBTyxZQUFZLENBQUM7QUFDdEk7QUFJQSxTQUFTLG1CQUFtQixPQUFrQztBQUM1RCxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGFBQWEsT0FBc0I7QUFDMUMsU0FBTyxXQUFXLE1BQU07QUFDdEIsVUFBTTtBQUFBLEVBQ1IsR0FBRyxDQUFDO0FBQ047IiwKICAibmFtZXMiOiBbXQp9Cg==
408
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLWV2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdENvbnN0cnVjdG9yLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNEaXNwb3NhYmxlRXggfSBmcm9tICcuL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi90eXBlLnRzJztcblxuaW1wb3J0IHtcbiAgZmlsdGVySW5QbGFjZSxcbiAgc25hcHNob3Rcbn0gZnJvbSAnLi9hcnJheS50cyc7XG5pbXBvcnQgeyBBc3luY0Rpc3Bvc2FibGVCYXNlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcblxuZGVjbGFyZSBjb25zdCBBU1lOQ19FVkVOVF9NQVA6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRXZlbnRSZWYge1xuICAvKipcbiAgICogQW4gZXZlbnQgc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXN5bmNFdmVudFNvdXJjZTogR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2U7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogR2VuZXJpY0NhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICovXG4gIHJlYWRvbmx5IHRoaXNBcmd1bWVudDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBc3luYyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4gZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBQaGFudG9tIG1hcmtlciB0aGF0IG1ha2VzIHtAbGluayBFdmVudE1hcH0gaW5mZXJhYmxlIGZyb20gYW4ge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IChlLmcuIHZpYVxuICAgKiBgU291cmNlIGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxpbmZlciBFdmVudE1hcD5gKS4gTmV2ZXIgcHJlc2VudCBhdCBydW50aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgW0FTWU5DX0VWRU5UX01BUF0/OiBFdmVudE1hcDtcblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vZmYoJ215LWV2ZW50JywgbXlMaXN0ZW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHJlYWRvbmx5IG9mZjogPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gICkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCBPYnNpZGlhbidzIGBFdmVudHMub25gIChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub24oJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHJlYWRvbmx5IG9uOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3VtZW50cyBleHRlbmRzIENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZ3VtZW50PzogdW5rbm93blxuICApID0+IEFzeW5jRXZlbnRSZWY7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIG9ubHkgb25jZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJndW1lbnQgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGggT2JzaWRpYW4ncyBgRXZlbnRzLm9uYCAob3Igb25jZSwgY29ycmVzcG9uZGluZ2x5KS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9uY2UoJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHJlYWRvbmx5IG9uY2U6IDxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICkgPT4gQXN5bmNFdmVudFJlZjtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZXhwb3NpbmcgZXZlbnQtdHJpZ2dlcmluZyBtZXRob2RzIGZvciBzdWJjbGFzc2VzIG9mIG1peGluLWNyZWF0ZWQgY2xhc3Nlcy5cbiAqXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBgcHJvdGVjdGVkYCBhdCBydW50aW1lIGJ1dCBzdXJmYWNlZCBpbiB0aGUgZGVjbGFyYXRpb24gdHlwZVxuICogYmVjYXVzZSBUeXBlU2NyaXB0IGNhbm5vdCByZXByZXNlbnQgYHByb3RlY3RlZGAgaW4gYW5vbnltb3VzLWNsYXNzIHJldHVybiB0eXBlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNFdmVudFRyaWdnZXI8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPiB7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICByZWFkb25seSB0cmlnZ2VyOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJpZ2dlckFzeW5jOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHJlYWRvbmx5IHRyeVRyaWdnZXI6IDxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCAkYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcmVhZG9ubHkgdHJ5VHJpZ2dlckFzeW5jOiA8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGNhbGxiYWNrIGFyZ3VtZW50IHR5cGVzIGZvciBhbiBldmVudC5cbiAqXG4gKiAtIFdoZW4gYEV2ZW50TWFwYCBoYXMgYW4gaW5kZXggc2lnbmF0dXJlICh1bnR5cGVkIGRlZmF1bHQpOiByZXR1cm5zIGB1bmtub3duW11gLFxuICogICBhbGxvd2luZyBgQXJnc2AgdG8gYmUgaW5mZXJyZWQgZnJlZWx5IGZyb20gdGhlIGNhbGxiYWNrLlxuICogLSBXaGVuIGBFdmVudE1hcGAgaGFzIGV4cGxpY2l0IGtleXMgb25seSAodHlwZWQgbWFwKTogcmV0dXJucyBgRXZlbnRNYXBbRXZlbnROYW1lXWAsXG4gKiAgIGVuZm9yY2luZyB0aGUgZGVjbGFyZWQgYXJndW1lbnQgdHlwZXMgYW5kIGVuYWJsaW5nIGF1dG9jb21wbGV0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZSBleHRlbmRzIHN0cmluZz4gPSBzdHJpbmcgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IHVua25vd25bXVxuICA6IChFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IEV2ZW50TWFwW0V2ZW50TmFtZV0gOiB1bmtub3duW10pO1xuXG4vKipcbiAqIEJhc2UgZXZlbnQgbWFwIHR5cGUgZm9yIHVudHlwZWQgZW1pdHRlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50TWFwQmFzZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT47XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBldmVudCBzb3VyY2UsIHVzZWQgYnkge0BsaW5rIEFzeW5jRXZlbnRSZWZ9XG4gKiBzbyB0aGF0IHJlZnMgY2FuIGJlIHN0b3JlZCByZWdhcmRsZXNzIG9mIHRoZSBlbWl0dGVyJ3MgYEV2ZW50TWFwYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgYnkgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgcmVmZXJlbmNlIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9mZnJlZjogKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudH0uXG4gKlxuICogQHR5cGVQYXJhbSBTb3VyY2UgLSBUaGUge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IHR5cGUuXG4gKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lLCBjb25zdHJhaW5lZCB0byB0aGUgc291cmNlJ3Mga25vd24gZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmliZUFzeW5jRGlzcG9zYWJsZUV2ZW50UGFyYW1zPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+IHtcbiAgLyoqXG4gICAqIFRoZSBhc3luYyBldmVudCBzb3VyY2UgdG8gc3Vic2NyaWJlIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYXN5bmNFdmVudFNvdXJjZTogU291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgY2FsbGJhY2suIEl0cyBhcmd1bWVudCB0eXBlcyBhcmUgaW5mZXJyZWQgZnJvbSB7QGxpbmsgU3Vic2NyaWJlQXN5bmNEaXNwb3NhYmxlRXZlbnRQYXJhbXMubmFtZX0uXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogQXN5bmNFdmVudENhbGxiYWNrT2Y8U291cmNlLCBFdmVudE5hbWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgbmFtZSB0byBzdWJzY3JpYmUgdG8uXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBFdmVudE5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgdGhpc0FyZ3VtZW50PzogdW5rbm93bjtcbn1cblxuLy8gVGhlIGNhbGxiYWNrIHR5cGUgZm9yIGEgZ2l2ZW4gZXZlbnQgb24gYW4gYXN5bmMgZXZlbnQgc291cmNlLCB3aXRoIGl0cyBhcmd1bWVudCB0dXBsZSBpbmZlcnJlZCBmcm9tIHRoZSBzb3VyY2UncyBldmVudCBtYXAuXG50eXBlIEFzeW5jRXZlbnRDYWxsYmFja09mPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+ID0gRXZlbnRNYXBPZjxTb3VyY2U+W0V2ZW50TmFtZV0gZXh0ZW5kcyBpbmZlciBBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10gPyAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gIDogbmV2ZXI7XG5cbi8vIFRoZSB1bmlvbiBvZiBrbm93biBldmVudCBuYW1lcyBmb3IgYW4gYXN5bmMgZXZlbnQgc291cmNlLCBkZXJpdmVkIGZyb20gaXRzIGV2ZW50IG1hcC5cbnR5cGUgQXN5bmNFdmVudE5hbWVPZjxTb3VyY2UgZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZT4gPSBrZXlvZiBFdmVudE1hcE9mPFNvdXJjZT4gJiBzdHJpbmc7XG5cbnR5cGUgRXZlbnRNYXBDb25zdHJhaW50PFQ+ID0gUmVjb3JkPGtleW9mIFQsIHVua25vd25bXT47XG5cbi8vIFJlY292ZXJzIHRoZSBldmVudCBtYXAgb2YgYW4gYXN5bmMgZXZlbnQgc291cmNlIHZpYSB0aGUgcGhhbnRvbSBtYXJrZXIgb24gYEFzeW5jRXZlbnRTb3VyY2VgLlxudHlwZSBFdmVudE1hcE9mPFNvdXJjZT4gPSBTb3VyY2UgZXh0ZW5kcyBBc3luY0V2ZW50U291cmNlPGluZmVyIEV2ZW50TWFwPiA/IEV2ZW50TWFwIDogbmV2ZXI7XG5cbnR5cGUgR2VuZXJpY0NhbGxiYWNrID0gR2VuZXJpY1Byb21pc2FibGVWb2lkRnVuY3Rpb248dW5rbm93bltdPjtcblxuLyoqXG4gKiBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnMgYW4ge0BsaW5rIEFzeW5jRXZlbnRSZWZ9IG9uIGRpc3Bvc2UsIHZpYSB0aGUgZXZlbnQgc291cmNlIHN0b3JlZFxuICogb24gdGhlIHJlZiBpdHNlbGYuIEFzeW5jIGNvdW50ZXJwYXJ0IG9mIHRoZSBuYXRpdmUgYEV2ZW50UmVmRGlzcG9zYWJsZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50UmVmRGlzcG9zYWJsZSBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZUJhc2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgd3JhcHBpbmcgYW4gZXhpc3Rpbmcge0BsaW5rIEFzeW5jRXZlbnRSZWZ9LlxuICAgKlxuICAgKiBAcGFyYW0gYXN5bmNFdmVudFJlZiAtIFRoZSBhc3luYyBldmVudCByZWZlcmVuY2UgdG8gdW5yZWdpc3RlciBvbiBkaXNwb3NlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXN5bmNFdmVudFJlZjogQXN5bmNFdmVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIGV2ZW50IHZpYSB0aGUgc291cmNlIHN0b3JlZCBvbiB0aGUgcmVmIChgYXN5bmNFdmVudFNvdXJjZS5vZmZyZWZgKS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwZXJmb3JtRGlzcG9zZUFzeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuYXN5bmNFdmVudFJlZi5hc3luY0V2ZW50U291cmNlLm9mZnJlZih0aGlzLmFzeW5jRXZlbnRSZWYpO1xuICB9XG59XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgc291cmNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzQmFzZTxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGltcGxlbWVudHMgQXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4ge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdHJ5IG1hcHBpbmcgZWFjaCBldmVudCBuYW1lIHRvIGl0cyBsaXN0IG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXIgcmVmZXJlbmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBldmVudFJlZmVyZW5jZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgQXN5bmNFdmVudFJlZltdPigpO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9mZignbXktZXZlbnQnLCBteUxpc3RlbmVyKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKGV2ZW50UmVmcywgKGV2ZW50UmVmKSA9PiBldmVudFJlZi5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuICAgIGlmIChldmVudFJlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmcmVmKG15UmVmKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZ2V0KGV2ZW50UmVmLm5hbWUpO1xuICAgIGlmICghZXZlbnRSZWZzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShldmVudFJlZnMsIChzdG9yZWRFdmVudFJlZikgPT4gc3RvcmVkRXZlbnRSZWYgIT09IGV2ZW50UmVmKTtcbiAgICBpZiAoZXZlbnRSZWZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZGVsZXRlKGV2ZW50UmVmLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbignbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgbGV0IGV2ZW50UmVmcyA9IHRoaXMuZXZlbnRSZWZlcmVuY2VzTWFwLmdldChuYW1lKTtcbiAgICBpZiAoIWV2ZW50UmVmcykge1xuICAgICAgZXZlbnRSZWZzID0gW107XG4gICAgICB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5zZXQobmFtZSwgZXZlbnRSZWZzKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudFJlZjogQXN5bmNFdmVudFJlZiA9IHtcbiAgICAgIGFzeW5jRXZlbnRTb3VyY2U6IHRoaXMsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2sgYXMgR2VuZXJpY0NhbGxiYWNrLFxuICAgICAgbmFtZSxcbiAgICAgIHRoaXNBcmd1bWVudFxuICAgIH07XG4gICAgZXZlbnRSZWZzLnB1c2goZXZlbnRSZWYpO1xuICAgIHJldHVybiBldmVudFJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCBvbmx5IG9uY2UuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbmNlKCdteS1ldmVudCcsIGFzeW5jIChhcmcxLCBhcmcyKSA9PiB7XG4gICAqICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgKiAgICAgY29uc29sZS5sb2coYXJnMSwgYXJnMik7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIGNvbnN0IG9yaWdpbmFsRXZlbnRSZWYgPSB0aGlzLm9uKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJndW1lbnQpO1xuICAgIGNvbnN0IGNsZWFudXBFdmVudFJlZiA9IHRoaXMub24obmFtZSwgKCkgPT4ge1xuICAgICAgdGhpcy5vZmZyZWYob3JpZ2luYWxFdmVudFJlZik7XG4gICAgICB0aGlzLm9mZnJlZihjbGVhbnVwRXZlbnRSZWYpO1xuICAgIH0pO1xuICAgIHJldHVybiBvcmlnaW5hbEV2ZW50UmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLnRyaWdnZXIoJ215LWV2ZW50JywgJ2FyZzEnLCAnYXJnMicpO1xuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCB0cmlnZ2VyPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+PihuYW1lOiBFdmVudE5hbWUsIC4uLiRhcmd1bWVudHM6IENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+KTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZ2V0KG5hbWUpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZXZlbnRSZWYgb2Ygc25hcHNob3QoZXZlbnRSZWZzKSkge1xuICAgICAgdGhpcy50cnlUcmlnZ2VyKGV2ZW50UmVmLCAkYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSkgPz8gW107XG4gICAgZm9yIChjb25zdCBldmVudFJlZiBvZiBzbmFwc2hvdChldmVudFJlZnMpKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyeVRyaWdnZXJBc3luYyhldmVudFJlZiwgJGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMudHJ5VHJpZ2dlcihteVJlZiwgWydhcmcxJywgJ2FyZzInXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHByb3RlY3RlZCB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBldmVudFJlZi5jYWxsYmFjay5jYWxsKGV2ZW50UmVmLnRoaXNBcmd1bWVudCwgLi4uJGFyZ3VtZW50cyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXN1bHQuY2F0Y2godGhyb3dEZWxheWVkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3dEZWxheWVkKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHksIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHByb3RlY3RlZCBhc3luYyB0cnlUcmlnZ2VyQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV2ZW50UmVmLmNhbGxiYWNrLmNhbGwoZXZlbnRSZWYudGhpc0FyZ3VtZW50LCAuLi4kYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3dEZWxheWVkKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgZXh0ZW5kcyB7QGxpbmsgQXN5bmNFdmVudHNCYXNlfSBhbmQgcHJvdmlkZXMgcHVibGljIG1ldGhvZHMgZm9yIHRyaWdnZXJpbmcgZXZlbnRzLlxuICpcbiAqIFRoaXMgY2xhc3MgZXhpc3RzIGFzIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50c2AuIEJ1dCBleHBvc2luZyBwdWJsaWNseSBgdHJpZ2dlcigpYCBtZXRob2RzIHZpb2xhdGVzIGVuY2Fwc3VsYXRpb24uXG4gKlxuICogQXZvaWQgdXNpbmcgaXQgaW4gZmF2b3Igb2Yge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIFRoZSB0eXBlIG9mIHRoZSBldmVudCBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50czxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGV4dGVuZHMgQXN5bmNFdmVudHNCYXNlPEV2ZW50TWFwPiB7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgIHN1cGVyLnRyaWdnZXIobmFtZSwgLi4uJGFyZ3VtZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gc3VwZXIudHJpZ2dlckFzeW5jKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvdmVycmlkZSB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgIHN1cGVyLnRyeVRyaWdnZXIoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgdHJ5VHJpZ2dlckFzeW5jPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzdXBlci50cnlUcmlnZ2VyQXN5bmMoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICB9XG59XG5cbi8qKlxuICogTWl4aW4gdGhhdCBhZGRzIHtAbGluayBBc3luY0V2ZW50U291cmNlfSBkZWxlZ2F0aW9uIHRvIGEgYmFzZSBjbGFzcy5cbiAqXG4gKiBBbGwgZXZlbnQgbWV0aG9kcyBkZWxlZ2F0ZSB0byBhIHByaXZhdGUge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0gaW5zdGFuY2UuXG4gKiBUaGUgYEV2ZW50TWFwYCBnZW5lcmljIGlzIGZpeGVkIGF0IG1peGluLWFwcGxpY2F0aW9uIHRpbWUgXHUyMDE0IGlmIHlvdSBuZWVkIGEgY2xhc3NcbiAqIHRoYXQgaXMgaXRzZWxmIGdlbmVyaWMgb3ZlciBpdHMgZXZlbnQgbWFwLCB1c2UgY29tcG9zaXRpb24gaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBiYXNlIGNsYXNzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzIGV4dGVuZGluZyBpdCB3aXRoIHtAbGluayBBc3luY0V2ZW50U291cmNlfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGludGVyZmFjZSBNeUV2ZW50cyB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogfVxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPE15RXZlbnRzPigpKENvbXBvbmVudCkge1xuICogICAvLyBvbigpLCBvZmYoKSwgb25jZSgpLCBvZmZyZWYoKSBhcmUgYXZhaWxhYmxlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluQXN5bmNFdmVudHM8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyPFRCYXNlIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+PihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlXG4gICk6IEFic3RyYWN0Q29uc3RydWN0b3I8QXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4gJiBBc3luY0V2ZW50VHJpZ2dlcjxFdmVudE1hcD4+ICYgVEJhc2Uge1xuICAgIGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzTWl4aW4gZXh0ZW5kcyBiYXNlQ2xhc3MgaW1wbGVtZW50cyBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiB7XG4gICAgICByZWFkb25seSAjYXN5bmNFdmVudHMgPSBuZXcgQXN5bmNFdmVudHM8RXZlbnRNYXA+KCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gICAgICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD5cbiAgICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy5vZmYobmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jYXN5bmNFdmVudHMub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAgICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICAgICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAgICAgKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgICAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgICAgICk6IEFzeW5jRXZlbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXN5bmNFdmVudHMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmd1bWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgICAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAgICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCBPYnNpZGlhbidzIGBFdmVudHMub25gIChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICAgIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgICAgICk6IEFzeW5jRXZlbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXN5bmNFdmVudHMub25jZShuYW1lLCBjYWxsYmFjaywgdGhpc0FyZ3VtZW50KTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICovXG4gICAgICBwcm90ZWN0ZWQgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy50cmlnZ2VyKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICAgKi9cbiAgICAgIHByb3RlY3RlZCBhc3luYyB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAgICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gUGFyaXR5IHdpdGggT2JzaWRpYW4ncyBFdmVudHMudHJ5VHJpZ2dlci5cbiAgICAgIHByb3RlY3RlZCB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy50cnlUcmlnZ2VyKGV2ZW50UmVmLCAkYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgICAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gUGFyaXR5IHdpdGggT2JzaWRpYW4ncyBFdmVudHMudHJ5VHJpZ2dlci5cbiAgICAgIHByb3RlY3RlZCBhc3luYyB0cnlUcmlnZ2VyQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FzeW5jRXZlbnRzLnRyeVRyaWdnZXJBc3luYyhldmVudFJlZiwgJGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFzeW5jRXZlbnRzTWl4aW4gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiAmIEFzeW5jRXZlbnRUcmlnZ2VyPEV2ZW50TWFwPj4gJiBUQmFzZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIGFuIGV2ZW50IG9uIGFuIHtAbGluayBBc3luY0V2ZW50U291cmNlfSBhbmQgcmV0dXJucyBhbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnNcbiAqIGl0IG9uIGRpc3Bvc2UuIEFzeW5jIGNvdW50ZXJwYXJ0IG9mIHRoZSBuYXRpdmUgYHN1YnNjcmliZURpc3Bvc2FibGVFdmVudGA7IHRoZSBldmVudCBuYW1lIGFuZCBjYWxsYmFjayBhcmd1bWVudFxuICogdHlwZXMgYXJlIGluZmVycmVkIGZyb20gdGhlIHNvdXJjZSdzIGV2ZW50IG1hcC5cbiAqXG4gKiBAdHlwZVBhcmFtIFNvdXJjZSAtIFRoZSB7QGxpbmsgQXN5bmNFdmVudFNvdXJjZX0gdHlwZS5cbiAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN1YnNjcmlwdGlvbiBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgQW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBoYW5kbGVyIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudDxTb3VyY2UgZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSwgRXZlbnROYW1lIGV4dGVuZHMgQXN5bmNFdmVudE5hbWVPZjxTb3VyY2U+PihcbiAgcGFyYW1zOiBTdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudFBhcmFtczxTb3VyY2UsIEV2ZW50TmFtZT5cbik6IEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgLy8gYFNvdXJjZWAgaXMgY29uc3RyYWluZWQgb25seSB0byB0aGUgb24tbGVzcyBgR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2VgIChzbyBhIHR5cGVkIHNvdXJjZSBpcyBhY2NlcHRlZCB3aGF0ZXZlclxuICAvLyBpdHMgZXZlbnQgbWFwJ3MgdmFyaWFuY2UpOyBldmVyeSBzb3VyY2UgaXMgYW4gYEFzeW5jRXZlbnRTb3VyY2VgLCBzbyBpdCBpcyBuYXJyb3dlZCB0byByZWFjaCBgb25gLCB3aG9zZSB0eXBlXG4gIC8vIHBhcmFtZXRlcnMgdGhlbiBpbmZlciBmcm9tIHRoZSAoYWxyZWFkeS10eXBlZCkgbmFtZSBhbmQgY2FsbGJhY2suXG4gIHJldHVybiBuZXcgQXN5bmNFdmVudFJlZkRpc3Bvc2FibGUoYXNBc3luY0V2ZW50U291cmNlKHBhcmFtcy5hc3luY0V2ZW50U291cmNlKS5vbihwYXJhbXMubmFtZSwgcGFyYW1zLmNhbGxiYWNrLCBwYXJhbXMudGhpc0FyZ3VtZW50KSk7XG59XG5cbi8vIE5hcnJvd3MgYSBzb3VyY2UgdG8ge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IHRvIHJlYWNoIGBvbmAuIEEgbG9jYWwgZXF1aXZhbGVudCBvZiBgY2FzdFRvYDogaW1wb3J0aW5nIGBjYXN0VG9gXG4vLyBmcm9tIGBvYmplY3QtdXRpbHNgIGhlcmUgd291bGQgY3JlYXRlIGEgbW9kdWxlIGN5Y2xlIChvYmplY3QtdXRpbHMgXHUyMTkyIGVycm9yIFx1MjE5MiBhc3luYy1ldmVudHMpLlxuZnVuY3Rpb24gYXNBc3luY0V2ZW50U291cmNlKHZhbHVlOiB1bmtub3duKTogQXN5bmNFdmVudFNvdXJjZSB7XG4gIHJldHVybiB2YWx1ZSBhcyBBc3luY0V2ZW50U291cmNlO1xufVxuXG5mdW5jdGlvbiB0aHJvd0RlbGF5ZWQoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRocm93IGVycm9yO1xuICB9LCAwKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsbUJBR087QUFDUCx3QkFBb0M7QUFxUTdCLE1BQU0sZ0NBQWdDLHNDQUFvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU14RCxZQUE2QixlQUE4QjtBQUNoRSxVQUFNO0FBRDRCO0FBQUEsRUFFcEM7QUFBQSxFQUZvQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT2pCLHNCQUE0QjtBQUM3QyxTQUFLLGNBQWMsaUJBQWlCLE9BQU8sS0FBSyxhQUFhO0FBQUEsRUFDL0Q7QUFDRjtBQTBCTyxNQUFlLGdCQUFvSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXJILHFCQUFxQixvQkFBSSxJQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCbEUsSUFDTCxNQUNBLFVBQ007QUFDTixVQUFN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
@@ -17,19 +17,19 @@ export interface AsyncEventRef {
17
17
  /**
18
18
  * An event source.
19
19
  */
20
- asyncEventSource: GenericAsyncEventSource;
20
+ readonly asyncEventSource: GenericAsyncEventSource;
21
21
  /**
22
22
  * A callback to call when the event is triggered.
23
23
  */
24
- callback: GenericCallback;
24
+ readonly callback: GenericCallback;
25
25
  /**
26
26
  * A name of the event.
27
27
  */
28
- name: string;
28
+ readonly name: string;
29
29
  /**
30
30
  * A context passed as `this` to the `callback`.
31
31
  */
32
- thisArgument: unknown;
32
+ readonly thisArgument: unknown;
33
33
  }
34
34
  /**
35
35
  * Async event emitter implementation.
@@ -74,7 +74,7 @@ export interface AsyncEventSource<EventMap extends EventMapConstraint<EventMap>
74
74
  * events.off('my-event', myListener);
75
75
  * ```
76
76
  */
77
- off: <EventName extends StringKeys<EventMap>, Arguments extends CallbackArguments<EventMap, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>) => void;
77
+ readonly off: <EventName extends StringKeys<EventMap>, Arguments extends CallbackArguments<EventMap, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>) => void;
78
78
  /**
79
79
  * Add an event listener.
80
80
  *
@@ -95,7 +95,7 @@ export interface AsyncEventSource<EventMap extends EventMapConstraint<EventMap>
95
95
  * });
96
96
  * ```
97
97
  */
98
- on: <EventName extends StringKeys<EventMap>, Arguments extends CallbackArguments<EventMap, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>, thisArgument?: unknown) => AsyncEventRef;
98
+ readonly on: <EventName extends StringKeys<EventMap>, Arguments extends CallbackArguments<EventMap, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>, thisArgument?: unknown) => AsyncEventRef;
99
99
  /**
100
100
  * Add an event listener that will be triggered only once.
101
101
  *
@@ -115,7 +115,7 @@ export interface AsyncEventSource<EventMap extends EventMapConstraint<EventMap>
115
115
  * });
116
116
  * ```
117
117
  */
118
- once: <EventName extends StringKeys<EventMap>, Arguments extends CallbackArguments<EventMap, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>, thisArgument?: unknown) => AsyncEventRef;
118
+ readonly once: <EventName extends StringKeys<EventMap>, Arguments extends CallbackArguments<EventMap, EventName>>(name: EventName, callback: (...$arguments: Arguments) => Promisable<void>, thisArgument?: unknown) => AsyncEventRef;
119
119
  }
120
120
  /**
121
121
  * Interface exposing event-triggering methods for subclasses of mixin-created classes.
@@ -133,7 +133,7 @@ export interface AsyncEventTrigger<EventMap extends EventMapConstraint<EventMap>
133
133
  * @param name - The name of the event.
134
134
  * @param $arguments - The data to pass to the event listeners.
135
135
  */
136
- trigger: <EventName extends StringKeys<EventMap>>(name: EventName, ...$arguments: CallbackArguments<EventMap, EventName>) => void;
136
+ readonly trigger: <EventName extends StringKeys<EventMap>>(name: EventName, ...$arguments: CallbackArguments<EventMap, EventName>) => void;
137
137
  /**
138
138
  * Trigger an event asynchronously.
139
139
  *
@@ -142,7 +142,7 @@ export interface AsyncEventTrigger<EventMap extends EventMapConstraint<EventMap>
142
142
  * @param $arguments - The data to pass to the event listeners.
143
143
  * @returns A {@link Promise} that resolves when all listeners have completed.
144
144
  */
145
- triggerAsync: <EventName extends StringKeys<EventMap>>(name: EventName, ...$arguments: CallbackArguments<EventMap, EventName>) => Promise<void>;
145
+ readonly triggerAsync: <EventName extends StringKeys<EventMap>>(name: EventName, ...$arguments: CallbackArguments<EventMap, EventName>) => Promise<void>;
146
146
  /**
147
147
  * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
148
148
  *
@@ -150,7 +150,7 @@ export interface AsyncEventTrigger<EventMap extends EventMapConstraint<EventMap>
150
150
  * @param eventRef - The event reference.
151
151
  * @param $arguments - The data to pass to the event listeners.
152
152
  */
153
- tryTrigger: <Arguments extends unknown[]>(eventRef: AsyncEventRef, $arguments: Arguments) => void;
153
+ readonly tryTrigger: <Arguments extends unknown[]>(eventRef: AsyncEventRef, $arguments: Arguments) => void;
154
154
  /**
155
155
  * Try to trigger an event asynchronously.
156
156
  *
@@ -159,7 +159,7 @@ export interface AsyncEventTrigger<EventMap extends EventMapConstraint<EventMap>
159
159
  * @param $arguments - The data to pass to the event listeners.
160
160
  * @returns A {@link Promise} that resolves when all listeners have completed.
161
161
  */
162
- tryTriggerAsync: <Arguments extends unknown[]>(eventRef: AsyncEventRef, $arguments: Arguments) => Promise<void>;
162
+ readonly tryTriggerAsync: <Arguments extends unknown[]>(eventRef: AsyncEventRef, $arguments: Arguments) => Promise<void>;
163
163
  }
164
164
  /**
165
165
  * Resolves callback argument types for an event.
@@ -187,7 +187,7 @@ export interface GenericAsyncEventSource {
187
187
  *
188
188
  * @param eventRef - The reference to remove.
189
189
  */
190
- offref: (eventRef: AsyncEventRef) => void;
190
+ readonly offref: (eventRef: AsyncEventRef) => void;
191
191
  }
192
192
  /**
193
193
  * Parameters for {@link subscribeAsyncDisposableEvent}.