@mnaoumov/typescript-dev-toolkit 3.13.1 → 4.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 (74) hide show
  1. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +1 -1
  2. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
  3. package/dist/lib/cjs/docs-site/api-doc-link-rendering.cjs +1 -1
  4. package/dist/lib/cjs/docs-site/api-doc-settings.cjs +1 -1
  5. package/dist/lib/cjs/docs-site/api-doc-types.cjs +1 -1
  6. package/dist/lib/cjs/docs-site/api-doc-types.d.cts +57 -57
  7. package/dist/lib/cjs/docs-site/link-check.cjs +1 -1
  8. package/dist/lib/cjs/docs-site/link-check.d.cts +8 -8
  9. package/dist/lib/cjs/docs-site/og-images.cjs +1 -1
  10. package/dist/lib/cjs/docs-site/satteri-github-alerts.cjs +1 -1
  11. package/dist/lib/cjs/docs-site/unrendered-alerts.cjs +1 -1
  12. package/dist/lib/cjs/docs-site/unrendered-alerts.d.cts +2 -2
  13. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +1 -1
  14. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +2 -2
  15. package/dist/lib/cjs/linters/eslint-config.cjs +2 -2
  16. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +1 -1
  17. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +2 -2
  18. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +3 -3
  19. package/dist/lib/cjs/linters/eslint-rules/index.cjs +4 -4
  20. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +1 -1
  21. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +1 -1
  22. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +1 -1
  23. package/dist/lib/cjs/linters/eslint-rules/readonly-interface-members.cjs +68 -0
  24. package/dist/lib/cjs/linters/eslint-rules/readonly-interface-members.d.cts +18 -0
  25. package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +1 -1
  26. package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +1 -1
  27. package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +1 -1
  28. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +279 -279
  29. package/dist/lib/cjs/linters/over-exposure.cjs +1 -1
  30. package/dist/lib/cjs/linters/over-exposure.d.cts +6 -6
  31. package/dist/lib/cjs/npm.cjs +1 -1
  32. package/dist/lib/cjs/npm.d.cts +1 -1
  33. package/dist/lib/cjs/upstream-sync.cjs +1 -1
  34. package/dist/lib/cjs/upstream-sync.d.cts +31 -31
  35. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
  36. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +1 -1
  37. package/dist/lib/esm/docs-site/api-doc-link-rendering.mjs +1 -1
  38. package/dist/lib/esm/docs-site/api-doc-settings.mjs +1 -1
  39. package/dist/lib/esm/docs-site/api-doc-types.d.mts +57 -57
  40. package/dist/lib/esm/docs-site/link-check.d.mts +8 -8
  41. package/dist/lib/esm/docs-site/link-check.mjs +1 -1
  42. package/dist/lib/esm/docs-site/og-images.mjs +1 -1
  43. package/dist/lib/esm/docs-site/satteri-github-alerts.mjs +1 -1
  44. package/dist/lib/esm/docs-site/unrendered-alerts.d.mts +2 -2
  45. package/dist/lib/esm/docs-site/unrendered-alerts.mjs +1 -1
  46. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +2 -2
  47. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +1 -1
  48. package/dist/lib/esm/linters/eslint-config.mjs +2 -2
  49. package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +2 -2
  50. package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +1 -1
  51. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +3 -3
  52. package/dist/lib/esm/linters/eslint-rules/index.d.mts +1 -1
  53. package/dist/lib/esm/linters/eslint-rules/index.mjs +3 -3
  54. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +1 -1
  55. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +1 -1
  56. package/dist/lib/esm/linters/eslint-rules/readonly-interface-members.d.mts +18 -0
  57. package/dist/lib/esm/linters/eslint-rules/readonly-interface-members.mjs +43 -0
  58. package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +1 -1
  59. package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +1 -1
  60. package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +1 -1
  61. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +279 -279
  62. package/dist/lib/esm/linters/over-exposure.d.mts +6 -6
  63. package/dist/lib/esm/linters/over-exposure.mjs +1 -1
  64. package/dist/lib/esm/npm.d.mts +1 -1
  65. package/dist/lib/esm/npm.mjs +1 -1
  66. package/dist/lib/esm/upstream-sync.d.mts +31 -31
  67. package/dist/lib/esm/upstream-sync.mjs +1 -1
  68. package/linters/eslint-rules/readonly-interface-members/package.json +6 -0
  69. package/package.json +1 -1
  70. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +0 -103
  71. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +0 -20
  72. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +0 -20
  73. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +0 -78
  74. package/linters/eslint-rules/readonly-params-options-result-members/package.json +0 -6
@@ -318,4 +318,4 @@ function toLastLineState(line) {
318
318
  syncUpstreams,
319
319
  writePin
320
320
  });
321
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Vwc3RyZWFtLXN5bmMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBXYXRjaGVzIHRoZSB1cHN0cmVhbXMgYSByZXBvc2l0b3J5IG1pcnJvcnMgYW5kIG9wZW5zIG9uZSB1cGRhdGUgUFIgcGVyIHVwc3RyZWFtIHRoYXQgbW92ZWQuXG4gKlxuICogRXZlcnl0aGluZyBoZXJlIGlzIGRyaXZlbiBieSBgdXBzdHJlYW1zLmpzb25gIGFuZCB0aGUgaGFuZGxlciBjb21tYW5kcyBpdCBuYW1lcywgc28gYW55IHJlcG9zaXRvcnkgdGhhdCB2ZW5kb3JzXG4gKiB1cHN0cmVhbSBjb2RlIGNhbiB1c2UgaXQ6IHRocm91Z2ggdGhlIGBzeW5jLXVwc3RyZWFtc2AgYmluLCBvciB0aGUgcmV1c2FibGUgYHN5bmMtdXBzdHJlYW1zLnltbGAgd29ya2Zsb3cuXG4gKi9cblxuaW1wb3J0IHtcbiAgcmVhZEZpbGVTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgbWF0Y2hlc0dsb2IgfSBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFdoYXQgYSBjb21tYW5kIHByaW50ZWQgYW5kIGhvdyBpdCBleGl0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXI7XG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIHVwc3RyZWFtIGZvbGxvd2VkIG9uIGEgR2l0SHViIGJyYW5jaCBvciB0YWcsIHBpbm5lZCB0byBhIGNvbW1pdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRVcHN0cmVhbUVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBwaW5uZWQgY29tbWl0OiB0aGUgbGFzdCB1cHN0cmVhbSBzdGF0ZSB0aGUgaGFuZGxlciB3YXMgcnVuIGFnYWluc3QuXG4gICAqL1xuICBjb21taXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzaGVsbCBjb21tYW5kIHRoYXQgdHVybnMgYSBuZXdlciB1cHN0cmVhbSBzdGF0ZSBpbnRvIGNoYW5nZXMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKi9cbiAgaGFuZGxlcjogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGF0aHMgd2F0Y2hlZCB1cHN0cmVhbSwgYXMgZ2xvYnMgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC4gQSBtb3ZlIHRoYXQgdG91Y2hlcyBub25lIG9mIHRoZW0gb3BlbnMgbm8gUFIuXG4gICAqL1xuICBwYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgYnJhbmNoIG9yIHRhZyBmb2xsb3dlZC5cbiAgICovXG4gIHJlZjogc3RyaW5nO1xuICAvKipcbiAgICogYDxvd25lcj4vPHJlcG8+YCBvbiBHaXRIdWIuXG4gICAqL1xuICByZXBvOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2hlbGwgY29tbWFuZCB0aGF0IGNoZWNrcyB0aGUgaGFuZGxlcidzIHJlc3VsdC4gT3ZlcnJpZGVzIHRoZSBmaWxlJ3MgdG9wLWxldmVsIGB2ZXJpZnlgLlxuICAgKi9cbiAgdmVyaWZ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIHVwc3RyZWFtIGZvbGxvd2VkIGFzIGFuIG5wbSBwYWNrYWdlJ3MgZGlzdC10YWcsIHBpbm5lZCB0byBhIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnBtVXBzdHJlYW1FbnRyeSB7XG4gIGhhbmRsZXI6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhY2thZ2UgbmFtZS5cbiAgICovXG4gIG5wbTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRpc3QtdGFnIGZvbGxvd2VkLiBgbGF0ZXN0YCB3aGVuIGFic2VudC5cbiAgICovXG4gIHRhZz86IHN0cmluZztcbiAgdmVyaWZ5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBpbm5lZCB2ZXJzaW9uLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdGhlIHN5bmMgZG9lcyB0byB0aGUgb3V0c2lkZSB3b3JsZCwgc28gYSB0ZXN0IGNhbiBzdGFuZCBhIGZpeHR1cmUgaW4gZm9yIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNEZXBlbmRlbmNpZXMge1xuICAvKipcbiAgICogUnVucyBhbiBleGVjdXRhYmxlIHdpdGggYXJndW1lbnRzIGFuZCBubyBzaGVsbC5cbiAgICovXG4gIGV4ZWM6IChmaWxlOiBzdHJpbmcsIGFyZ3VtZW50c186IHJlYWRvbmx5IHN0cmluZ1tdLCBlbnY/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PikgPT4gQ29tbWFuZFJlc3VsdDtcbiAgLyoqXG4gICAqIEdFVHMgYSBVUkwgYW5kIHBhcnNlcyB0aGUgSlNPTiBpdCByZXR1cm5zLCB0aHJvd2luZyBvbiBhbiBIVFRQIGVycm9yLlxuICAgKi9cbiAgZmV0Y2hKc29uOiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG4gIGxvZzogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgdGhyb3VnaCB0aGUgc2hlbGw6IGEgaGFuZGxlciBvciBhIHZlcmlmeSBjb21tYW5kLlxuICAgKi9cbiAgc2hlbGw6IChjb21tYW5kOiBzdHJpbmcsIGVudj86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KSA9PiBDb21tYW5kUmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBQUiBhbiB1cHN0cmVhbSBtb3ZlIGFza3MgZm9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNQbGFuIHtcbiAgYnJhbmNoOiBzdHJpbmc7XG4gIHN0YXR1czogVXBzdHJlYW1TdGF0dXM7XG4gIHRpdGxlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBoYXBwZW5lZCB0byBvbmUgZW50cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBTZXQgd2hlbiBjaGVja2luZyBvciBhcHBseWluZyB0aHJldzogdGhlIGpvYiByZXBvcnRzIGl0IGFuZCBtb3ZlcyBvbiB0byB0aGUgbmV4dCBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yPzogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgcGxhbm5lZGAgaW4gYSBkcnkgcnVuLCBgb3BlbmVkYC9gdXBkYXRlZGAgd2hlbiBhIFBSIHdhcyBwdXNoZWQsIGB1bmNoYW5nZWRgIHdoZW4gdGhlIGJyYW5jaCBhbHJlYWR5IGhlbGQgdGhpcyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvdXRjb21lOiAnY3VycmVudCcgfCAnZXJyb3InIHwgJ29wZW5lZCcgfCAncGxhbm5lZCcgfCAndW5jaGFuZ2VkJyB8ICd1bndhdGNoZWQnIHwgJ3VwZGF0ZWQnO1xuICByZWFkb25seSBwck51bWJlcj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBzeW5jVXBzdHJlYW1zfSBzeW5jcywgYW5kIGhvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW5jVXBzdHJlYW1zT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnJhbmNoIGVhY2ggUFIgdGFyZ2V0cyBhbmQgZWFjaCB1cGRhdGUgYnJhbmNoIGlzIGN1dCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUJyYW5jaDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggdG8gYHVwc3RyZWFtcy5qc29uYCwgd2hpY2ggdGhlIHN5bmMgdXBkYXRlcyB0aGUgcGluIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUGxhbiBhbmQgcHJpbnQgZXZlcnkgUFIsIGFuZCBjaGFuZ2Ugbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGRyeVJ1bjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9ubHkgdGhlIGVudHJpZXMgd2l0aCB0aGVzZSBuYW1lcywgb3IgZXZlcnkgZW50cnkgd2hlbiBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IG9ubHk6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9uZSB1cHN0cmVhbSB0aGF0IGB1cHN0cmVhbXMuanNvbmAgbGlzdHM6IGEgZ2l0IG9uZSBvciBhbiBucG0gb25lLlxuICovXG5leHBvcnQgdHlwZSBVcHN0cmVhbUVudHJ5ID0gR2l0VXBzdHJlYW1FbnRyeSB8IE5wbVVwc3RyZWFtRW50cnk7XG5cbi8qKlxuICogVGhlIGNvbnRlbnQgb2YgYHVwc3RyZWFtcy5qc29uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcHN0cmVhbXNDb25maWcge1xuICB1cHN0cmVhbXM6IHJlYWRvbmx5IFVwc3RyZWFtRW50cnlbXTtcbiAgLyoqXG4gICAqIFRoZSBzaGVsbCBjb21tYW5kIHRoYXQgY2hlY2tzIGV2ZXJ5IGhhbmRsZXIncyByZXN1bHQsIHVubGVzcyBhbiBlbnRyeSBuYW1lcyBpdHMgb3duLlxuICAgKi9cbiAgdmVyaWZ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgb25lIGNvbXBhcmlzb24gb2YgYW4gZW50cnkgd2l0aCBpdHMgdXBzdHJlYW0gZm91bmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBzdHJlYW1TdGF0dXMge1xuICAvKipcbiAgICogVGhlIHVwc3RyZWFtIHBhdGhzIHRoYXQgY2hhbmdlZCBhbmQgYXJlIHdhdGNoZWQsIHNvcnRlZC4gQWx3YXlzIGVtcHR5IGZvciBhbiBucG0gdXBzdHJlYW0uXG4gICAqL1xuICBjaGFuZ2VkUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQSBsaW5rIHRoYXQgc2hvd3Mgd2hhdCBjaGFuZ2VkIGJldHdlZW4gdGhlIHBpbiBhbmQgdGhlIGhlYWQuXG4gICAqL1xuICBjb21wYXJlVXJsOiBzdHJpbmc7XG4gIGVudHJ5OiBVcHN0cmVhbUVudHJ5O1xuICAvKipcbiAgICogVGhlIGNvbW1pdCBvciB2ZXJzaW9uIHRoZSB1cHN0cmVhbSBpcyBhdCBub3cuXG4gICAqL1xuICBoZWFkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IG9yIHZlcnNpb24gYHVwc3RyZWFtcy5qc29uYCByZWNvcmRzLlxuICAgKi9cbiAgcGluOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgY3VycmVudGA6IG5vdGhpbmcgdG8gZG8uIGBtb3ZlZGA6IGEgUFIgaXMgZHVlLiBgdW53YXRjaGVkYDogdXBzdHJlYW0gbW92ZWQsIGJ1dCBubyB3YXRjaGVkIHBhdGggY2hhbmdlZC5cbiAgICovXG4gIHN0YXRlOiAnY3VycmVudCcgfCAnbW92ZWQnIHwgJ3Vud2F0Y2hlZCc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIEdpdEh1YiB0cnVuY2F0ZWQgdGhlIGNvbXBhcmUncyBmaWxlIGxpc3QsIHNvIGEgd2F0Y2hlZCBwYXRoIG1heSBiZSBtaXNzaW5nIGZyb20gYGNoYW5nZWRQYXRoc2AuXG4gICAqL1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBHaXRIdWJDb21taXQge1xuICBzaGE6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdpdEh1YkNvbXBhcmUge1xuICBmaWxlcz86IHJlYWRvbmx5IEdpdEh1YkNvbXBhcmVGaWxlW107XG59XG5cbi8qKlxuICogT25lIGZpbGUgb2YgYSBHaXRIdWIgY29tcGFyZSwgYXMgdGhlIEFQSSBzcGVsbHMgaXQuXG4gKi9cbmludGVyZmFjZSBHaXRIdWJDb21wYXJlRmlsZSB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG5cbiAgcHJldmlvdXNfZmlsZW5hbWU/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBOcG1QYWNrdW1lbnQge1xuICAnZGlzdC10YWdzJzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXBSZXN1bHQge1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc3VsdDogQ29tbWFuZFJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgaGFuZGxlciBhbmQgdmVyaWZ5IHJ1bnMgYSBQUiBib2R5IHJlcG9ydHMuXG4gKi9cbmludGVyZmFjZSBTdGVwUmVzdWx0cyB7XG4gIGhhbmRsZXI6IFN0ZXBSZXN1bHQ7XG4gIHZlcmlmeTogbnVsbCB8IFN0ZXBSZXN1bHQ7XG59XG5cbi8qKlxuICogYHVwc3RyZWFtcy5qc29uYCByZWFkIGxvb3NlbHksIHRvIHdyaXRlIG9uZSB2YWx1ZSBiYWNrIHdpdGhvdXQgZGlzdHVyYmluZyB0aGUgcmVzdC5cbiAqL1xuaW50ZXJmYWNlIFVwc3RyZWFtc0ZpbGVTaGFwZSB7XG4gIHVwc3RyZWFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbn1cblxuLyoqXG4gKiBHaXRIdWIncyBjb21wYXJlIEFQSSBsaXN0cyBhdCBtb3N0IHRoaXMgbWFueSBmaWxlcywgYW5kIHNheXMgbm90aGluZyB3aGVuIGl0IHN0b3BzLlxuICovXG5jb25zdCBDT01QQVJFX0ZJTEVfTElNSVQgPSAzMDA7XG5cbmNvbnN0IFNIT1JUX1NIQV9MRU5HVEggPSAxMjtcblxuLyoqXG4gKiBUaGUgdGFpbCBvZiBhIGNvbW1hbmQncyBvdXRwdXQgYSBQUiBib2R5IHF1b3RlczogZW5vdWdoIHRvIHJlYWQgYSBmYWlsdXJlLCBzaG9ydCBlbm91Z2ggdG8gc3RheSB1bmRlciBHaXRIdWIncyBib2R5IGxpbWl0LlxuICovXG5jb25zdCBPVVRQVVRfVEFJTF9MSU5FUyA9IDYwO1xuXG4vKipcbiAqIFRoZSBtb3N0IGxpbmVzIHRoYXQgcmVwb3J0IGEgZmFpbHVyZSBhIGZhaWxlZCBzdGVwJ3Mgc2VjdGlvbiBvcGVucyB3aXRoLCBhaGVhZCBvZiBpdHMgb3V0cHV0IHRhaWwuXG4gKi9cbmNvbnN0IEZBSUxVUkVfTElORV9MSU1JVCA9IDIwO1xuXG5jb25zdCBKU09OX0lOREVOVF9TUEFDRVMgPSAyO1xuXG4vKipcbiAqIFRoZSBFU0MgdGhhdCBvcGVucyBhIHRlcm1pbmFsIGNvbnRyb2wgc2VxdWVuY2UsIGVpdGhlciBhcyB0aGUgYnl0ZSBvciBhcyB0aGUgY2FyZXQgdGV4dCBgXltgIGEgbG9nIHZpZXdlciBvciBhblxuICogZWFybGllciBjb3B5IHR1cm5lZCBpdCBpbnRvLiBCb3RoIHJlYWNoZWQgYSBQUiBib2R5OiBjcmVhdGUtb2JzaWRpYW4tcGx1Z2luIzIgY2FycmllZCB0aGUgY2FyZXQgZm9ybS5cbiAqL1xuY29uc3QgRVNDID0gU3RyaW5nLnJhd2AoPzpcXHUwMDFCfFxcXlxcWylgO1xuXG4vKipcbiAqIENvbnRyb2wgU2VxdWVuY2UgSW50cm9kdWNlciBzZXF1ZW5jZXMgKGNvbG9ycywgY3Vyc29yIG1vdmVzKSwgT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kIHNlcXVlbmNlcyAoaHlwZXJsaW5rcyxcbiAqIHRpdGxlcywgZW5kZWQgYnkgQkVMIG9yIFNULCBhbHNvIGFzIGBeR2ApLCBhbmQgdGhlIHR3by1jaGFyYWN0ZXIgZXNjYXBlcy4gQSB0d28tY2hhcmFjdGVyIGVzY2FwZSBpcyBtYXRjaGVkIG9ubHkgYXNcbiAqIHRoZSBieXRlLCBiZWNhdXNlIGl0cyBjYXJldCB0ZXh0IGFsc28gc3BlbGxzIGFuIG9yZGluYXJ5IHJlZ3VsYXIgZXhwcmVzc2lvbiwgc3VjaCBhcyBgXltBLVpdYC5cbiAqL1xuY29uc3QgVEVSTUlOQUxfQ09OVFJPTF9SRUdfRVhQID0gbmV3IFJlZ0V4cChcbiAgU3RyaW5nLnJhd2Ake0VTQ31cXFtbMC0/XSpbIC0vXSpbQC1+XXwke0VTQ31cXF1bXlxcdTAwMDdcXHUwMDFCXl0qKD86XFx1MDAwN3xcXF5HfCR7RVNDfVxcXFwpfFxcdTAwMUJbQC1aXFxcXC1fXWAsXG4gICdnJ1xuKTtcblxuLyoqXG4gKiBBIGxpbmUgdGhhdCByZXBvcnRzIGEgZmFpbHVyZSwgd2hpY2ggYSBmYWlsZWQgc3RlcCdzIHNlY3Rpb24gcXVvdGVzIGZpcnN0LCBiZWNhdXNlIHRoZSB0YWlsIG1heSBiZSBhIGdyZWVuIHRlc3QgcnVuXG4gKiB0aGF0IGZpbmlzaGVkIGFmdGVyIGl0LlxuICovXG5jb25zdCBGQUlMVVJFX0xJTkVfUkVHX0VYUCA9IC9zdGVwLWZhaWxlZHxcXGJmYWlsKD86c3xlZHx1cmV8aW5nKT9cXGJ8XFxiZXJyb3JcXGJ8XFxibm90IGZvdW5kXFxifFxcYkVSUiF8W1x1MjcxN1x1MDBEN10vaTtcblxuLyoqXG4gKiBXcml0ZXMgdGhlIFBSIGJvZHkuXG4gKlxuICogQHBhcmFtIHBsYW4gLSBUaGUgcGxhbi5cbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBoYW5kbGVyIGFuZCB2ZXJpZnkgcnVucywgb3IgYG51bGxgIGluIGEgZHJ5IHJ1biwgd2hlcmUgbmVpdGhlciBydW5zLlxuICogQHBhcmFtIGRpZmZTdGF0IC0gYGdpdCBkaWZmIC0tc3RhdGAgb2YgdGhlIHVwZGF0ZSBjb21taXQsIG9yIGBudWxsYCBpbiBhIGRyeSBydW4uXG4gKiBAcmV0dXJucyBUaGUgYm9keSwgaW4gTWFya2Rvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByQm9keShwbGFuOiBTeW5jUGxhbiwgc3RlcHM6IG51bGwgfCBTdGVwUmVzdWx0cywgZGlmZlN0YXQ6IG51bGwgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB7IGVudHJ5LCBoZWFkLCBwaW4gfSA9IHBsYW4uc3RhdHVzO1xuICBjb25zdCBzb3VyY2UgPSBpc0dpdFVwc3RyZWFtKGVudHJ5KSA/IGBcXGAke2VudHJ5LnJlcG99QCR7ZW50cnkucmVmfVxcYGAgOiBgbnBtIFxcYCR7ZW50cnkubnBtfUAke2VudHJ5LnRhZyA/PyAnbGF0ZXN0J31cXGBgO1xuICBjb25zdCBsaW5lcyA9IFtcbiAgICBgVXBzdHJlYW0gXFxgJHtlbnRyeS5uYW1lfVxcYCBtb3ZlZDogJHtzb3VyY2V9IGZyb20gXFxgJHtwaW59XFxgIHRvIFxcYCR7aGVhZH1cXGAuYCxcbiAgICAnJyxcbiAgICBgQ29tcGFyZTogJHtwbGFuLnN0YXR1cy5jb21wYXJlVXJsfWAsXG4gICAgJydcbiAgXTtcblxuICBpZiAoaXNHaXRVcHN0cmVhbShlbnRyeSkpIHtcbiAgICBsaW5lcy5wdXNoKCcjIyMgQ2hhbmdlZCB1cHN0cmVhbSBmaWxlcycsICcnLCAuLi5wbGFuLnN0YXR1cy5jaGFuZ2VkUGF0aHMubWFwKChwYXRoKSA9PiBgLSBcXGAke3BhdGh9XFxgYCkpO1xuICAgIGlmIChwbGFuLnN0YXR1cy50cnVuY2F0ZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goYC0gR2l0SHViIGxpc3RzIGF0IG1vc3QgJHtTdHJpbmcoQ09NUEFSRV9GSUxFX0xJTUlUKX0gZmlsZXM6IG9wZW4gdGhlIGNvbXBhcmUgbGluayBmb3IgdGhlIHJlc3QuYCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG5cbiAgaWYgKHN0ZXBzID09PSBudWxsKSB7XG4gICAgbGluZXMucHVzaCgnIyMjIEhhbmRsZXInLCAnJywgYFxcYCR7ZW50cnkuaGFuZGxlcn1cXGA6IG5vdCBydW4gKGRyeSBydW4pLmAsICcnKTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKC4uLmRlc2NyaWJlU3RlcCgnSGFuZGxlcicsIHN0ZXBzLmhhbmRsZXIpKTtcbiAgICBpZiAoc3RlcHMudmVyaWZ5ICE9PSBudWxsKSB7XG4gICAgICBsaW5lcy5wdXNoKC4uLmRlc2NyaWJlU3RlcCgnVmVyaWZ5Jywgc3RlcHMudmVyaWZ5KSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRpZmZTdGF0ICE9PSBudWxsKSB7XG4gICAgbGluZXMucHVzaCgnIyMjIEdlbmVyYXRlZCBjaGFuZ2VzJywgJycsICdgYGB0ZXh0JywgY2xlYW5Db21tYW5kT3V0cHV0KGRpZmZTdGF0KS50cmltRW5kKCksICdgYGAnLCAnJyk7XG4gIH1cblxuICBsaW5lcy5wdXNoKCdUaGlzIFBSIHdhcyBvcGVuZWQgYnkgdGhlIHVwc3RyZWFtLXN5bmMgam9iIGFuZCBpcyBuZXZlciBtZXJnZWQgYXV0b21hdGljYWxseS4nKTtcbiAgcmV0dXJuIGAke2xpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG59XG5cbi8qKlxuICogVHVybnMgYSBjb21tYW5kJ3MgY2FwdHVyZWQgb3V0cHV0IGludG8gcGxhaW4gdGV4dCBhIFBSIGJvZHkgY2FuIHF1b3RlOiB0ZXJtaW5hbCBjb250cm9sIHNlcXVlbmNlcyBhcmUgcmVtb3ZlZCxcbiAqIHdoZXRoZXIgdGhleSBhcnJpdmVkIGFzIEVTQyBieXRlcyBvciBhcyB0aGVpciBjYXJldC1yZW5kZXJlZCBgXltbLi4ubWAgdGV4dCwgYW5kIGEgbGluZSBhIHByb2dyZXNzIGRpc3BsYXkgcmV3cm90ZVxuICogd2l0aCBgXFxyYCBrZWVwcyBvbmx5IGl0cyBsYXN0IHN0YXRlLlxuICpcbiAqIEBwYXJhbSBvdXRwdXQgLSBUaGUgY2FwdHVyZWQgb3V0cHV0LlxuICogQHJldHVybnMgVGhlIHBsYWluIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkNvbW1hbmRPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3V0cHV0XG4gICAgLnJlcGxhY2VBbGwoVEVSTUlOQUxfQ09OVFJPTF9SRUdfRVhQLCAnJylcbiAgICAucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHRvTGFzdExpbmVTdGF0ZShsaW5lKSlcbiAgICAuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQ29tcGFyZXMgb25lIGVudHJ5IHdpdGggaXRzIHVwc3RyZWFtLlxuICpcbiAqIEBwYXJhbSBlbnRyeSAtIFRoZSBlbnRyeS5cbiAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgLSBUaGUgb3V0c2lkZSB3b3JsZC5cbiAqIEByZXR1cm5zIFdoYXQgdGhlIGNvbXBhcmlzb24gZm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wYXJlV2l0aFVwc3RyZWFtKGVudHJ5OiBVcHN0cmVhbUVudHJ5LCBkZXBlbmRlbmNpZXM6IFBpY2s8U3luY0RlcGVuZGVuY2llcywgJ2ZldGNoSnNvbic+KTogUHJvbWlzZTxVcHN0cmVhbVN0YXR1cz4ge1xuICBpZiAoIWlzR2l0VXBzdHJlYW0oZW50cnkpKSB7XG4gICAgY29uc3QgdGFnID0gZW50cnkudGFnID8/ICdsYXRlc3QnO1xuICAgIGNvbnN0IHBhY2t1bWVudCA9IGF3YWl0IGRlcGVuZGVuY2llcy5mZXRjaEpzb24oYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7ZW50cnkubnBtLnJlcGxhY2UoJy8nLCAnJTJmJyl9YCkgYXMgTnBtUGFja3VtZW50O1xuICAgIGNvbnN0IGhlYWQgPSBwYWNrdW1lbnRbJ2Rpc3QtdGFncyddW3RhZ107XG4gICAgaWYgKGhlYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBucG0gcGFja2FnZSAke2VudHJ5Lm5wbX0gaGFzIG5vIGRpc3QtdGFnIFwiJHt0YWd9XCIuYCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VkUGF0aHM6IFtdLFxuICAgICAgY29tcGFyZVVybDogYGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyR7ZW50cnkubnBtfS92LyR7aGVhZH1gLFxuICAgICAgZW50cnksXG4gICAgICBoZWFkLFxuICAgICAgcGluOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgc3RhdGU6IGhlYWQgPT09IGVudHJ5LnZlcnNpb24gPyAnY3VycmVudCcgOiAnbW92ZWQnLFxuICAgICAgdHJ1bmNhdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBjb25zdCBjb21taXQgPSBhd2FpdCBkZXBlbmRlbmNpZXMuZmV0Y2hKc29uKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7ZW50cnkucmVwb30vY29tbWl0cy8ke2VuY29kZVVSSUNvbXBvbmVudChlbnRyeS5yZWYpfWApIGFzIEdpdEh1YkNvbW1pdDtcbiAgY29uc3QgaGVhZCA9IGNvbW1pdC5zaGE7XG4gIGNvbnN0IGNvbXBhcmVVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7ZW50cnkucmVwb30vY29tcGFyZS8ke2VudHJ5LmNvbW1pdH0uLi4ke2hlYWR9YDtcbiAgaWYgKGhlYWQgPT09IGVudHJ5LmNvbW1pdCkge1xuICAgIHJldHVybiB7IGNoYW5nZWRQYXRoczogW10sIGNvbXBhcmVVcmwsIGVudHJ5LCBoZWFkLCBwaW46IGVudHJ5LmNvbW1pdCwgc3RhdGU6ICdjdXJyZW50JywgdHJ1bmNhdGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgY29tcGFyZSA9IGF3YWl0IGRlcGVuZGVuY2llcy5mZXRjaEpzb24oYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtlbnRyeS5yZXBvfS9jb21wYXJlLyR7ZW50cnkuY29tbWl0fS4uLiR7aGVhZH1gKSBhcyBHaXRIdWJDb21wYXJlO1xuICBjb25zdCBmaWxlcyA9IGNvbXBhcmUuZmlsZXMgPz8gW107XG4gIGNvbnN0IHRvdWNoZWQgPSBuZXcgU2V0KGZpbGVzLmZsYXRNYXAoKGZpbGUpID0+IGZpbGUucHJldmlvdXNfZmlsZW5hbWUgPT09IHVuZGVmaW5lZCA/IFtmaWxlLmZpbGVuYW1lXSA6IFtmaWxlLmZpbGVuYW1lLCBmaWxlLnByZXZpb3VzX2ZpbGVuYW1lXSkpO1xuICBjb25zdCBjaGFuZ2VkUGF0aHMgPSBbLi4udG91Y2hlZF0uZmlsdGVyKChwYXRoKSA9PiBlbnRyeS5wYXRocy5zb21lKChnbG9iKSA9PiBtYXRjaGVzR2xvYihwYXRoLCBnbG9iKSkpLnNvcnQoKTtcbiAgY29uc3QgaXNUcnVuY2F0ZWQgPSBmaWxlcy5sZW5ndGggPj0gQ09NUEFSRV9GSUxFX0xJTUlUO1xuICByZXR1cm4ge1xuICAgIGNoYW5nZWRQYXRocyxcbiAgICBjb21wYXJlVXJsLFxuICAgIGVudHJ5LFxuICAgIGhlYWQsXG4gICAgcGluOiBlbnRyeS5jb21taXQsXG4gICAgc3RhdGU6IGNoYW5nZWRQYXRocy5sZW5ndGggPiAwIHx8IGlzVHJ1bmNhdGVkID8gJ21vdmVkJyA6ICd1bndhdGNoZWQnLFxuICAgIHRydW5jYXRlZDogaXNUcnVuY2F0ZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYW5kIHZhbGlkYXRlcyBhbiBgdXBzdHJlYW1zLmpzb25gLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIGZpbGUncyBjb250ZW50LlxuICogQHJldHVybnMgVGhlIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXBzdHJlYW1zQ29uZmlnKHRleHQ6IHN0cmluZyk6IFVwc3RyZWFtc0NvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UodGV4dCkgYXMgUGFydGlhbDxVcHN0cmVhbXNDb25maWc+O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLnVwc3RyZWFtcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cHN0cmVhbXMuanNvbiBoYXMgbm8gXCJ1cHN0cmVhbXNcIiBhcnJheS4nKTtcbiAgfVxuICAvLyBSZWFkIHRocm91Z2ggYFJlZmxlY3QuZ2V0YCwgYmVjYXVzZSBub3RoaW5nIGFib3V0IHRoZSBwYXJzZWQgZW50cmllcyBpcyBrbm93biB5ZXQuXG4gIGNvbnN0IGVudHJpZXM6IHJlYWRvbmx5IG9iamVjdFtdID0gY29uZmlnLnVwc3RyZWFtcztcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHVua25vd24+KCk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IG5hbWU6IHVua25vd24gPSBSZWZsZWN0LmdldChlbnRyeSwgJ25hbWUnKTtcbiAgICBjb25zdCBsYWJlbCA9IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyA/IGBcIiR7bmFtZX1cImAgOiAnd2l0aCBubyBuYW1lJztcbiAgICBjb25zdCBpc0dpdCA9ICdyZXBvJyBpbiBlbnRyeTtcbiAgICBjb25zdCByZXF1aXJlZCA9IGlzR2l0ID8gWyduYW1lJywgJ3JlcG8nLCAncmVmJywgJ2NvbW1pdCcsICdoYW5kbGVyJ10gOiBbJ25hbWUnLCAnbnBtJywgJ3ZlcnNpb24nLCAnaGFuZGxlciddO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlcXVpcmVkKSB7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QuZ2V0KGVudHJ5LCBrZXkpICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGB1cHN0cmVhbXMuanNvbjogZW50cnkgJHtsYWJlbH0gbmVlZHMgYSBzdHJpbmcgXCIke2tleX1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzR2l0ICYmICFBcnJheS5pc0FycmF5KFJlZmxlY3QuZ2V0KGVudHJ5LCAncGF0aHMnKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXBzdHJlYW1zLmpzb246IGVudHJ5ICR7bGFiZWx9IG5lZWRzIGEgXCJwYXRoc1wiIGFycmF5LmApO1xuICAgIH1cbiAgICBpZiAobmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwc3RyZWFtcy5qc29uOiB0aGUgbmFtZSAke2xhYmVsfSBpcyB1c2VkIHR3aWNlLmApO1xuICAgIH1cbiAgICBuYW1lcy5hZGQobmFtZSk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZyBhcyBVcHN0cmVhbXNDb25maWc7XG59XG5cbi8qKlxuICogUGxhbnMgdGhlIFBSIGEgbW92ZWQgdXBzdHJlYW0gYXNrcyBmb3IuXG4gKlxuICogQHBhcmFtIHN0YXR1cyAtIFRoZSBjb21wYXJpc29uIG9mIGEgbW92ZWQgZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgYnJhbmNoIGFuZCB0aXRsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5TeW5jKHN0YXR1czogVXBzdHJlYW1TdGF0dXMpOiBTeW5jUGxhbiB7XG4gIHJldHVybiB7XG4gICAgYnJhbmNoOiBgdXBzdHJlYW0vJHtzdGF0dXMuZW50cnkubmFtZX1gLFxuICAgIHN0YXR1cyxcbiAgICB0aXRsZTogYGNob3JlKHVwc3RyZWFtKTogc3luYyAke3N0YXR1cy5lbnRyeS5uYW1lfSB0byAke3Nob3J0ZW4oc3RhdHVzLmhlYWQpfWBcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVja3MgZXZlcnkgZW50cnksIGFuZCBvcGVucyBvciB1cGRhdGVzIG9uZSBQUiBwZXIgbW92ZWQgdXBzdHJlYW0uXG4gKlxuICogQSBoYW5kbGVyIG9yIHZlcmlmeSBmYWlsdXJlIHN0aWxsIG9wZW5zIHRoZSBQUiwgYXMgYSBkcmFmdCB3aXRoIHRoZSBmYWlsdXJlIGluIGl0cyBib2R5LCBzbyBhIGJyZWFraW5nIHVwc3RyZWFtIGNoYW5nZVxuICogaXMgc2VlbiByYXRoZXIgdGhhbiBza2lwcGVkLiBBbiBlcnJvciBpbiB0aGUgc3luYyBpdHNlbGYsIHN1Y2ggYXMgYSBmYWlsZWQgQVBJIGNhbGwsIGlzIHJlcG9ydGVkIGluIHRoZSBlbnRyeSdzIHJlc3VsdFxuICogYW5kIHRoZSBuZXh0IGVudHJ5IHN0aWxsIHJ1bnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBXaGF0IHRvIHN5bmMsIGFuZCBob3cuXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIG91dHNpZGUgd29ybGQuXG4gKiBAcmV0dXJucyBPbmUgcmVzdWx0IHBlciBlbnRyeSBjaGVja2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luY1Vwc3RyZWFtcyhvcHRpb25zOiBTeW5jVXBzdHJlYW1zT3B0aW9ucywgZGVwZW5kZW5jaWVzOiBTeW5jRGVwZW5kZW5jaWVzKTogUHJvbWlzZTxTeW5jUmVzdWx0W10+IHtcbiAgY29uc3QgY29uZmlnID0gcGFyc2VVcHN0cmVhbXNDb25maWcocmVhZEZpbGVTeW5jKG9wdGlvbnMuY29uZmlnUGF0aCwgJ3V0Zi04JykpO1xuICBjb25zdCB1bmtub3duID0gb3B0aW9ucy5vbmx5LmZpbHRlcigobmFtZSkgPT4gY29uZmlnLnVwc3RyZWFtcy5ldmVyeSgoZW50cnkpID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpKTtcbiAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdXBzdHJlYW1zLmpzb24gaGFzIG5vIGVudHJ5IG5hbWVkICR7dW5rbm93bi5tYXAoKG5hbWUpID0+IGBcIiR7bmFtZX1cImApLmpvaW4oJywgJyl9LmApO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0czogU3luY1Jlc3VsdFtdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgY29uZmlnLnVwc3RyZWFtcykge1xuICAgIGlmIChvcHRpb25zLm9ubHkubGVuZ3RoID4gMCAmJiAhb3B0aW9ucy5vbmx5LmluY2x1ZGVzKGVudHJ5Lm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdHMucHVzaChhd2FpdCBzeW5jRW50cnkoZW50cnksIGNvbmZpZywgb3B0aW9ucywgZGVwZW5kZW5jaWVzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBkZXBlbmRlbmNpZXMubG9nKGAke2VudHJ5Lm5hbWV9OiBFUlJPUiAke21lc3NhZ2V9YCk7XG4gICAgICByZXN1bHRzLnB1c2goeyBlcnJvcjogbWVzc2FnZSwgbmFtZTogZW50cnkubmFtZSwgb3V0Y29tZTogJ2Vycm9yJyB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogUmVjb3JkcyBgaGVhZGAgYXMgdGhlIGVudHJ5J3MgcGluIGluIGB1cHN0cmVhbXMuanNvbmAsIHVubGVzcyB0aGUgaGFuZGxlciBhbHJlYWR5IG1vdmVkIGl0LCBrZWVwaW5nIHRoZSBmaWxlJ3NcbiAqIGtleSBvcmRlciBhbmQgZm9ybWF0dGluZy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnUGF0aCAtIFRoZSBwYXRoIHRvIGB1cHN0cmVhbXMuanNvbmAuXG4gKiBAcGFyYW0gc3RhdHVzIC0gVGhlIGNvbXBhcmlzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpbihjb25maWdQYXRoOiBzdHJpbmcsIHN0YXR1czogVXBzdHJlYW1TdGF0dXMpOiB2b2lkIHtcbiAgY29uc3QgdGV4dCA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyBVcHN0cmVhbXNGaWxlU2hhcGU7XG4gIGNvbnN0IGtleSA9IGlzR2l0VXBzdHJlYW0oc3RhdHVzLmVudHJ5KSA/ICdjb21taXQnIDogJ3ZlcnNpb24nO1xuICBjb25zdCB0YXJnZXQgPSBwYXJzZWQudXBzdHJlYW1zLmZpbmQoKGVudHJ5KSA9PiBlbnRyeVsnbmFtZSddID09PSBzdGF0dXMuZW50cnkubmFtZSk7XG4gIGlmICh0YXJnZXQ/LltrZXldICE9PSBzdGF0dXMucGluKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRhcmdldFtrZXldID0gc3RhdHVzLmhlYWQ7XG4gIHdyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCBKU09OX0lOREVOVF9TUEFDRVMpfVxcbmApO1xufVxuXG5mdW5jdGlvbiBhcHBseVBsYW4ocGxhbjogU3luY1BsYW4sIGNvbmZpZzogVXBzdHJlYW1zQ29uZmlnLCBvcHRpb25zOiBTeW5jVXBzdHJlYW1zT3B0aW9ucywgZGVwZW5kZW5jaWVzOiBTeW5jRGVwZW5kZW5jaWVzKTogU3luY1Jlc3VsdCB7XG4gIGNvbnN0IHsgZW50cnkgfSA9IHBsYW4uc3RhdHVzO1xuICAvLyBObyBjb2xvcjogdGhlIG91dHB1dCBpcyBxdW90ZWQgaW4gYSBQUiBib2R5LCB3aGVyZSBhIGNvbG9yIGNvZGUgaXMgb25seSBub2lzZS4gYENJYCBpcyBsZWZ0IGFsb25lLCBiZWNhdXNlIGl0XG4gIC8vIGNoYW5nZXMgd2hhdCBzb21lIHRvb2xzIGRvLCBub3QganVzdCBob3cgdGhleSBwcmludC5cbiAgY29uc3QgZW52ID0geyBGT1JDRV9DT0xPUjogJzAnLCBOT19DT0xPUjogJzEnLCBVUFNUUkVBTV9OQU1FOiBlbnRyeS5uYW1lLCBVUFNUUkVBTV9UQVJHRVQ6IHBsYW4uc3RhdHVzLmhlYWQgfTtcbiAgY29uc3QgaGFuZGxlcjogU3RlcFJlc3VsdCA9IHsgY29tbWFuZDogZW50cnkuaGFuZGxlciwgcmVzdWx0OiBkZXBlbmRlbmNpZXMuc2hlbGwoZW50cnkuaGFuZGxlciwgZW52KSB9O1xuICB3cml0ZVBpbihvcHRpb25zLmNvbmZpZ1BhdGgsIHBsYW4uc3RhdHVzKTtcbiAgY29uc3QgdmVyaWZ5Q29tbWFuZCA9IGVudHJ5LnZlcmlmeSA/PyBjb25maWcudmVyaWZ5O1xuICBjb25zdCB2ZXJpZnk6IG51bGwgfCBTdGVwUmVzdWx0ID0gdmVyaWZ5Q29tbWFuZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHsgY29tbWFuZDogdmVyaWZ5Q29tbWFuZCwgcmVzdWx0OiBkZXBlbmRlbmNpZXMuc2hlbGwodmVyaWZ5Q29tbWFuZCwgZW52KSB9O1xuICBjb25zdCBpc0ZhaWxlZCA9IGhhbmRsZXIucmVzdWx0LmV4aXRDb2RlICE9PSAwIHx8ICh2ZXJpZnkgIT09IG51bGwgJiYgdmVyaWZ5LnJlc3VsdC5leGl0Q29kZSAhPT0gMCk7XG5cbiAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2l0JywgWydhZGQnLCAnLS1hbGwnXSk7XG4gIGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsnY29tbWl0JywgJy0tbm8tdmVyaWZ5JywgJy0tbWVzc2FnZScsIHBsYW4udGl0bGVdKTtcbiAgY29uc3QgZGlmZlN0YXQgPSBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2RpZmYnLCAnLS1zdGF0JywgJ0hFQUR+MScsICdIRUFEJ10pO1xuXG4gIGNvbnN0IGJvZHkgPSBidWlsZFByQm9keShwbGFuLCB7IGhhbmRsZXIsIHZlcmlmeSB9LCBkaWZmU3RhdCk7XG4gIGNvbnN0IGlzUmVtb3RlQnJhbmNoID0gZGVwZW5kZW5jaWVzLmV4ZWMoJ2dpdCcsIFsnbHMtcmVtb3RlJywgJy0tZXhpdC1jb2RlJywgJy0taGVhZHMnLCAnb3JpZ2luJywgcGxhbi5icmFuY2hdKS5leGl0Q29kZSA9PT0gMDtcbiAgaWYgKGlzUmVtb3RlQnJhbmNoKSB7XG4gICAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2l0JywgWydmZXRjaCcsICdvcmlnaW4nLCBwbGFuLmJyYW5jaF0pO1xuICAgIGlmIChkZXBlbmRlbmNpZXMuZXhlYygnZ2l0JywgWydkaWZmJywgJy0tcXVpZXQnLCAnRkVUQ0hfSEVBRCcsICdIRUFEJ10pLmV4aXRDb2RlID09PSAwKSB7XG4gICAgICAvLyBUaGUgYm9keSBpcyBzdGlsbCByZXdyaXR0ZW4sIHNvIGEgY2hhbmdlIHRvIGhvdyBpdCBpcyB3cml0dGVuIHJlYWNoZXMgYSBQUiB3aG9zZSBicmFuY2ggaGFzIG5vdCBtb3ZlZC5cbiAgICAgIGNvbnN0IG9wZW4gPSBmaW5kT3BlblByKGRlcGVuZGVuY2llcywgcGxhbi5icmFuY2gpO1xuICAgICAgaWYgKG9wZW4gIT09IG51bGwpIHtcbiAgICAgICAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBbJ3ByJywgJ2VkaXQnLCBvcGVuLCAnLS1ib2R5JywgYm9keV0pO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogJHtwbGFuLmJyYW5jaH0gYWxyZWFkeSBob2xkcyB0aGlzIHJlc3VsdDsgbm90aGluZyBwdXNoZWQke29wZW4gPT09IG51bGwgPyAnJyA6IGAsIFBSICMke29wZW59J3MgYm9keSByZXdyaXR0ZW5gfS5gKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICd1bmNoYW5nZWQnIH07XG4gICAgfVxuICB9XG4gIGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsncHVzaCcsICctLWZvcmNlJywgJ29yaWdpbicsIGBIRUFEOnJlZnMvaGVhZHMvJHtwbGFuLmJyYW5jaH1gXSk7XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBmaW5kT3BlblByKGRlcGVuZGVuY2llcywgcGxhbi5icmFuY2gpO1xuICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIHtcbiAgICBjb25zdCBwck51bWJlciA9IE51bWJlcihleGlzdGluZyk7XG4gICAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBbJ3ByJywgJ2VkaXQnLCBleGlzdGluZywgJy0tdGl0bGUnLCBwbGFuLnRpdGxlLCAnLS1ib2R5JywgYm9keV0pO1xuICAgIGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2doJywgaXNGYWlsZWQgPyBbJ3ByJywgJ3JlYWR5JywgZXhpc3RpbmcsICctLXVuZG8nXSA6IFsncHInLCAncmVhZHknLCBleGlzdGluZ10pO1xuICAgIGRlcGVuZGVuY2llcy5sb2coYCR7ZW50cnkubmFtZX06IHVwZGF0ZWQgUFIgIyR7ZXhpc3Rpbmd9JHtpc0ZhaWxlZCA/ICcgKGRyYWZ0OiBhIHN0ZXAgZmFpbGVkKScgOiAnJ30uYCk7XG4gICAgcmV0dXJuIHsgbmFtZTogZW50cnkubmFtZSwgb3V0Y29tZTogJ3VwZGF0ZWQnLCBwck51bWJlciB9O1xuICB9XG5cbiAgY29uc3QgdXJsID0gZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBbXG4gICAgJ3ByJyxcbiAgICAnY3JlYXRlJyxcbiAgICAnLS1iYXNlJyxcbiAgICBvcHRpb25zLmJhc2VCcmFuY2gsXG4gICAgJy0taGVhZCcsXG4gICAgcGxhbi5icmFuY2gsXG4gICAgJy0tdGl0bGUnLFxuICAgIHBsYW4udGl0bGUsXG4gICAgJy0tYm9keScsXG4gICAgYm9keSxcbiAgICAuLi4oaXNGYWlsZWQgPyBbJy0tZHJhZnQnXSA6IFtdKVxuICBdKS50cmltKCk7XG4gIGRlcGVuZGVuY2llcy5sb2coYCR7ZW50cnkubmFtZX06IG9wZW5lZCAke3VybH0ke2lzRmFpbGVkID8gJyAoZHJhZnQ6IGEgc3RlcCBmYWlsZWQpJyA6ICcnfS5gKTtcbiAgY29uc3QgcHJOdW1iZXIgPSBOdW1iZXIoL1xcL3B1bGxcXC8oPzxOdW1iZXI+XFxkKykvLmV4ZWModXJsKT8uZ3JvdXBzPy5bJ051bWJlciddID8/IE5hTik7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4ocHJOdW1iZXIpID8geyBuYW1lOiBlbnRyeS5uYW1lLCBvdXRjb21lOiAnb3BlbmVkJyB9IDogeyBuYW1lOiBlbnRyeS5uYW1lLCBvdXRjb21lOiAnb3BlbmVkJywgcHJOdW1iZXIgfTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVTdGVwKGhlYWRpbmc6IHN0cmluZywgc3RlcDogU3RlcFJlc3VsdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXNQYXNzZWQgPSBzdGVwLnJlc3VsdC5leGl0Q29kZSA9PT0gMDtcbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBjbGVhbkNvbW1hbmRPdXRwdXQoc3RlcC5yZXN1bHQub3V0cHV0KS50cmltRW5kKCkuc3BsaXQoJ1xcbicpO1xuICBjb25zdCB0YWlsID0gb3V0cHV0TGluZXMuc2xpY2UoLU9VVFBVVF9UQUlMX0xJTkVTKS5qb2luKCdcXG4nKTtcbiAgY29uc3QgZmFpbHVyZUxpbmVzID0gaXNQYXNzZWQgPyBbXSA6IG91dHB1dExpbmVzLmZpbHRlcigobGluZSkgPT4gRkFJTFVSRV9MSU5FX1JFR19FWFAudGVzdChsaW5lKSkuc2xpY2UoMCwgRkFJTFVSRV9MSU5FX0xJTUlUKTtcbiAgcmV0dXJuIFtcbiAgICBgIyMjICR7aGVhZGluZ31gLFxuICAgICcnLFxuICAgIGBcXGAke3N0ZXAuY29tbWFuZH1cXGA6ICR7aXNQYXNzZWQgPyAncGFzc2VkJyA6IGAqKkZBSUxFRCoqIChleGl0ICR7U3RyaW5nKHN0ZXAucmVzdWx0LmV4aXRDb2RlKX0pYH0uYCxcbiAgICAnJyxcbiAgICAuLi4oZmFpbHVyZUxpbmVzLmxlbmd0aCA9PT0gMCA/IFtdIDogWydMaW5lcyByZXBvcnRpbmcgdGhlIGZhaWx1cmU6JywgJycsICdgYGB0ZXh0JywgLi4uZmFpbHVyZUxpbmVzLCAnYGBgJywgJyddKSxcbiAgICBpc1Bhc3NlZCA/ICc8ZGV0YWlscz48c3VtbWFyeT5PdXRwdXQ8L3N1bW1hcnk+JyA6ICc8ZGV0YWlscyBvcGVuPjxzdW1tYXJ5Pk91dHB1dDwvc3VtbWFyeT4nLFxuICAgICcnLFxuICAgICdgYGB0ZXh0JyxcbiAgICB0YWlsLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICc8L2RldGFpbHM+JyxcbiAgICAnJ1xuICBdO1xufVxuXG5mdW5jdGlvbiBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXM6IFN5bmNEZXBlbmRlbmNpZXMsIGZpbGU6IHN0cmluZywgYXJndW1lbnRzXzogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHQgPSBkZXBlbmRlbmNpZXMuZXhlYyhmaWxlLCBhcmd1bWVudHNfKTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWxlfSAke2FyZ3VtZW50c18uam9pbignICcpfSBmYWlsZWQgKGV4aXQgJHtTdHJpbmcocmVzdWx0LmV4aXRDb2RlKX0pOiAke3Jlc3VsdC5vdXRwdXQudHJpbSgpfWApO1xuICB9XG4gIHJldHVybiByZXN1bHQub3V0cHV0O1xufVxuXG5mdW5jdGlvbiBmaW5kT3BlblByKGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcywgYnJhbmNoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgbnVtYmVyID0gZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBbJ3ByJywgJ2xpc3QnLCAnLS1oZWFkJywgYnJhbmNoLCAnLS1zdGF0ZScsICdvcGVuJywgJy0tanNvbicsICdudW1iZXInLCAnLS1qcScsICcuWzBdLm51bWJlciddKS50cmltKCk7XG4gIHJldHVybiBudW1iZXIgPT09ICcnIHx8IG51bWJlciA9PT0gJ251bGwnID8gbnVsbCA6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gaXNHaXRVcHN0cmVhbShlbnRyeTogVXBzdHJlYW1FbnRyeSk6IGVudHJ5IGlzIEdpdFVwc3RyZWFtRW50cnkge1xuICByZXR1cm4gJ3JlcG8nIGluIGVudHJ5O1xufVxuXG5mdW5jdGlvbiBzaG9ydGVuKGhlYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXlswLTlhLWZdezQwfSQvLnRlc3QoaGVhZCkgPyBoZWFkLnNsaWNlKDAsIFNIT1JUX1NIQV9MRU5HVEgpIDogaGVhZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY0VudHJ5KGVudHJ5OiBVcHN0cmVhbUVudHJ5LCBjb25maWc6IFVwc3RyZWFtc0NvbmZpZywgb3B0aW9uczogU3luY1Vwc3RyZWFtc09wdGlvbnMsIGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcyk6IFByb21pc2U8U3luY1Jlc3VsdD4ge1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBjb21wYXJlV2l0aFVwc3RyZWFtKGVudHJ5LCBkZXBlbmRlbmNpZXMpO1xuICBpZiAoc3RhdHVzLnN0YXRlID09PSAnY3VycmVudCcpIHtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGAke2VudHJ5Lm5hbWV9OiBjdXJyZW50IGF0ICR7c2hvcnRlbihzdGF0dXMuaGVhZCl9LmApO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICdjdXJyZW50JyB9O1xuICB9XG4gIGlmIChzdGF0dXMuc3RhdGUgPT09ICd1bndhdGNoZWQnKSB7XG4gICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogbW92ZWQgdG8gJHtzaG9ydGVuKHN0YXR1cy5oZWFkKX0sIGJ1dCBubyB3YXRjaGVkIHBhdGggY2hhbmdlZCBzaW5jZSAke3Nob3J0ZW4oc3RhdHVzLnBpbil9LmApO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICd1bndhdGNoZWQnIH07XG4gIH1cblxuICBjb25zdCBwbGFuID0gcGxhblN5bmMoc3RhdHVzKTtcbiAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogbW92ZWQgZnJvbSAke3Nob3J0ZW4oc3RhdHVzLnBpbil9IHRvICR7c2hvcnRlbihzdGF0dXMuaGVhZCl9LiBXb3VsZCBwdXNoICR7cGxhbi5icmFuY2h9IGFuZCBvcGVuOmApO1xuICAgIGRlcGVuZGVuY2llcy5sb2coYCAgdGl0bGU6ICR7cGxhbi50aXRsZX1gKTtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGJ1aWxkUHJCb2R5KHBsYW4sIG51bGwsIG51bGwpLnJlcGxhY2VBbGwoL14vZ20sICcgIHwgJykpO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICdwbGFubmVkJyB9O1xuICB9XG5cbiAgLy8gVGhlIHVwZGF0ZSBjb21taXQgdGFrZXMgZXZlcnkgZmlsZSBpbiB0aGUgdHJlZSwgc28gYSBmaWxlIGxlZnQgbHlpbmcgYXJvdW5kIHdvdWxkIGJlIHB1c2hlZCB3aXRoIGl0LlxuICBjb25zdCBkaXJ0eSA9IGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10pLnRyaW0oKTtcbiAgaWYgKGRpcnR5ICE9PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgdGhlIHdvcmtpbmcgdHJlZSBpcyBub3QgY2xlYW4sIGFuZCB0aGUgdXBkYXRlIGNvbW1pdCB3b3VsZCB0YWtlIHRoZXNlIGZpbGVzIHdpdGggaXQ6XFxuJHtkaXJ0eX1gKTtcbiAgfVxuICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2ZldGNoJywgJ29yaWdpbicsIG9wdGlvbnMuYmFzZUJyYW5jaF0pO1xuICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2NoZWNrb3V0JywgJy1CJywgcGxhbi5icmFuY2gsIGBvcmlnaW4vJHtvcHRpb25zLmJhc2VCcmFuY2h9YF0pO1xuICB0cnkge1xuICAgIHJldHVybiBhcHBseVBsYW4ocGxhbiwgY29uZmlnLCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIGRlcGVuZGVuY2llcy5leGVjKCdnaXQnLCBbJ2NoZWNrb3V0JywgJy0tZm9yY2UnLCBvcHRpb25zLmJhc2VCcmFuY2hdKTtcbiAgICBkZXBlbmRlbmNpZXMuZXhlYygnZ2l0JywgWydicmFuY2gnLCAnLS1kZWxldGUnLCAnLS1mb3JjZScsIHBsYW4uYnJhbmNoXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9MYXN0TGluZVN0YXRlKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0YXRlcyA9IGxpbmUucmVwbGFjZSgvXFxyKyQvLCAnJyk7XG4gIHJldHVybiBzdGF0ZXMuc2xpY2Uoc3RhdGVzLmxhc3RJbmRleE9mKCdcXHInKSArIDEpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0EscUJBR087QUFDUCx1QkFBNEI7QUEyTjVCLE1BQU0scUJBQXFCO0FBRTNCLE1BQU0sbUJBQW1CO0FBS3pCLE1BQU0sb0JBQW9CO0FBSzFCLE1BQU0scUJBQXFCO0FBRTNCLE1BQU0scUJBQXFCO0FBTTNCLE1BQU0sTUFBTSxPQUFPO0FBT25CLE1BQU0sMkJBQTJCLElBQUk7QUFBQSxFQUNuQyxPQUFPLE1BQU0sR0FBRyx1QkFBdUIsR0FBRyxvQ0FBb0MsR0FBRztBQUFBLEVBQ2pGO0FBQ0Y7QUFNQSxNQUFNLHVCQUF1QjtBQVV0QixTQUFTLFlBQVksTUFBZ0IsT0FBMkIsVUFBaUM7QUFDdEcsUUFBTSxFQUFFLE9BQU8sTUFBTSxJQUFJLElBQUksS0FBSztBQUNsQyxRQUFNLFNBQVMsY0FBYyxLQUFLLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEdBQUcsT0FBTyxTQUFTLE1BQU0sR0FBRyxJQUFJLE1BQU0sT0FBTyxRQUFRO0FBQ3BILFFBQU0sUUFBUTtBQUFBLElBQ1osY0FBYyxNQUFNLElBQUksYUFBYSxNQUFNLFdBQVcsR0FBRyxXQUFXLElBQUk7QUFBQSxJQUN4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VUFBVSxPQUFzQixRQUF5QixTQUErQixjQUFxRDtBQUMxSixRQUFNLFNBQVMsTUFBTSxvQkFBb0IsT0FBTyxZQUFZO0FBQzVELE1BQUksT0FBTyxVQUFVLFdBQVc7QUFDOUIsaUJBQWEsSUFBSSxHQUFHLE1BQU0sSUFBSSxnQkFBZ0IsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHO0FBQ3JFLFdBQU8sRUFBRSxNQUFNLE1BQU0sTUFBTSxTQUFTLFVBQVU7QUFBQSxFQUNoRDtBQUNBLE1BQUksT0FBTyxVQUFVLGFBQWE7QUFDaEMsaUJBQWEsSUFBSSxHQUFHLE1BQU0sSUFBSSxjQUFjLFFBQVEsT0FBTyxJQUFJLENBQUMsdUNBQXVDLFFBQVEsT0FBTyxHQUFHLENBQUMsR0FBRztBQUM3SCxXQUFPLEVBQUUsTUFBTSxNQUFNLE1BQU0sU0FBUyxZQUFZO0FBQUEsRUFDbEQ7QUFFQSxRQUFNLE9BQU8sU0FBUyxNQUFNO0FBQzVCLE1BQUksUUFBUSxRQUFRO0FBQ2xCLGlCQUFhLElBQUksR0FBRyxNQUFNLElBQUksZ0JBQWdCLFFBQVEsT0FBTyxHQUFHLENBQUMsT0FBTyxRQUFRLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLE1BQU0sWUFBWTtBQUNuSSxpQkFBYSxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUU7QUFDekMsaUJBQWEsSUFBSSxZQUFZLE1BQU0sTUFBTSxJQUFJLEVBQUUsV0FBVyxPQUFPLE1BQU0sQ0FBQztBQUN4RSxXQUFPLEVBQUUsTUFBTSxNQUFNLE1BQU0sU0FBUyxVQUFVO0FBQUEsRUFDaEQ7QUFHQSxRQUFNLFFBQVEsWUFBWSxjQUFjLE9BQU8sQ0FBQyxVQUFVLGFBQWEsQ0FBQyxFQUFFLEtBQUs7QUFDL0UsTUFBSSxVQUFVLElBQUk7QUFDaEIsVUFBTSxJQUFJLE1BQU07QUFBQSxFQUF5RixLQUFLLEVBQUU7QUFBQSxFQUNsSDtBQUNBLGNBQVksY0FBYyxPQUFPLENBQUMsU0FBUyxVQUFVLFFBQVEsVUFBVSxDQUFDO0FBQ3hFLGNBQVksY0FBYyxPQUFPLENBQUMsWUFBWSxNQUFNLEtBQUssUUFBUSxVQUFVLFFBQVEsVUFBVSxFQUFFLENBQUM7QUFDaEcsTUFBSTtBQUNGLFdBQU8sVUFBVSxNQUFNLFFBQVEsU0FBUyxZQUFZO0FBQUEsRUFDdEQsVUFBRTtBQUNBLGlCQUFhLEtBQUssT0FBTyxDQUFDLFlBQVksV0FBVyxRQUFRLFVBQVUsQ0FBQztBQUNwRSxpQkFBYSxLQUFLLE9BQU8sQ0FBQyxVQUFVLFlBQVksV0FBVyxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ3pFO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixNQUFzQjtBQUM3QyxRQUFNLFNBQVMsS0FBSyxRQUFRLFFBQVEsRUFBRTtBQUN0QyxTQUFPLE9BQU8sTUFBTSxPQUFPLFlBQVksSUFBSSxJQUFJLENBQUM7QUFDbEQ7IiwKICAibmFtZXMiOiBbImhlYWQiLCAicHJOdW1iZXIiXQp9Cg==
321
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Vwc3RyZWFtLXN5bmMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBXYXRjaGVzIHRoZSB1cHN0cmVhbXMgYSByZXBvc2l0b3J5IG1pcnJvcnMgYW5kIG9wZW5zIG9uZSB1cGRhdGUgUFIgcGVyIHVwc3RyZWFtIHRoYXQgbW92ZWQuXG4gKlxuICogRXZlcnl0aGluZyBoZXJlIGlzIGRyaXZlbiBieSBgdXBzdHJlYW1zLmpzb25gIGFuZCB0aGUgaGFuZGxlciBjb21tYW5kcyBpdCBuYW1lcywgc28gYW55IHJlcG9zaXRvcnkgdGhhdCB2ZW5kb3JzXG4gKiB1cHN0cmVhbSBjb2RlIGNhbiB1c2UgaXQ6IHRocm91Z2ggdGhlIGBzeW5jLXVwc3RyZWFtc2AgYmluLCBvciB0aGUgcmV1c2FibGUgYHN5bmMtdXBzdHJlYW1zLnltbGAgd29ya2Zsb3cuXG4gKi9cblxuaW1wb3J0IHtcbiAgcmVhZEZpbGVTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgbWF0Y2hlc0dsb2IgfSBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFdoYXQgYSBjb21tYW5kIHByaW50ZWQgYW5kIGhvdyBpdCBleGl0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXI7XG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIHVwc3RyZWFtIGZvbGxvd2VkIG9uIGEgR2l0SHViIGJyYW5jaCBvciB0YWcsIHBpbm5lZCB0byBhIGNvbW1pdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRVcHN0cmVhbUVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBwaW5uZWQgY29tbWl0OiB0aGUgbGFzdCB1cHN0cmVhbSBzdGF0ZSB0aGUgaGFuZGxlciB3YXMgcnVuIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBjb21taXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzaGVsbCBjb21tYW5kIHRoYXQgdHVybnMgYSBuZXdlciB1cHN0cmVhbSBzdGF0ZSBpbnRvIGNoYW5nZXMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGF0aHMgd2F0Y2hlZCB1cHN0cmVhbSwgYXMgZ2xvYnMgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC4gQSBtb3ZlIHRoYXQgdG91Y2hlcyBub25lIG9mIHRoZW0gb3BlbnMgbm8gUFIuXG4gICAqL1xuICByZWFkb25seSBwYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgYnJhbmNoIG9yIHRhZyBmb2xsb3dlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZjogc3RyaW5nO1xuICAvKipcbiAgICogYDxvd25lcj4vPHJlcG8+YCBvbiBHaXRIdWIuXG4gICAqL1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2hlbGwgY29tbWFuZCB0aGF0IGNoZWNrcyB0aGUgaGFuZGxlcidzIHJlc3VsdC4gT3ZlcnJpZGVzIHRoZSBmaWxlJ3MgdG9wLWxldmVsIGB2ZXJpZnlgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyaWZ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIHVwc3RyZWFtIGZvbGxvd2VkIGFzIGFuIG5wbSBwYWNrYWdlJ3MgZGlzdC10YWcsIHBpbm5lZCB0byBhIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnBtVXBzdHJlYW1FbnRyeSB7XG4gIHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhY2thZ2UgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5wbTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRpc3QtdGFnIGZvbGxvd2VkLiBgbGF0ZXN0YCB3aGVuIGFic2VudC5cbiAgICovXG4gIHJlYWRvbmx5IHRhZz86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyaWZ5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBpbm5lZCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdGhlIHN5bmMgZG9lcyB0byB0aGUgb3V0c2lkZSB3b3JsZCwgc28gYSB0ZXN0IGNhbiBzdGFuZCBhIGZpeHR1cmUgaW4gZm9yIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNEZXBlbmRlbmNpZXMge1xuICAvKipcbiAgICogUnVucyBhbiBleGVjdXRhYmxlIHdpdGggYXJndW1lbnRzIGFuZCBubyBzaGVsbC5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWM6IChmaWxlOiBzdHJpbmcsIGFyZ3VtZW50c186IHJlYWRvbmx5IHN0cmluZ1tdLCBlbnY/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PikgPT4gQ29tbWFuZFJlc3VsdDtcbiAgLyoqXG4gICAqIEdFVHMgYSBVUkwgYW5kIHBhcnNlcyB0aGUgSlNPTiBpdCByZXR1cm5zLCB0aHJvd2luZyBvbiBhbiBIVFRQIGVycm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hKc29uOiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG4gIHJlYWRvbmx5IGxvZzogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgdGhyb3VnaCB0aGUgc2hlbGw6IGEgaGFuZGxlciBvciBhIHZlcmlmeSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hlbGw6IChjb21tYW5kOiBzdHJpbmcsIGVudj86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KSA9PiBDb21tYW5kUmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBQUiBhbiB1cHN0cmVhbSBtb3ZlIGFza3MgZm9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNQbGFuIHtcbiAgcmVhZG9ubHkgYnJhbmNoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXR1czogVXBzdHJlYW1TdGF0dXM7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBoYXBwZW5lZCB0byBvbmUgZW50cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBTZXQgd2hlbiBjaGVja2luZyBvciBhcHBseWluZyB0aHJldzogdGhlIGpvYiByZXBvcnRzIGl0IGFuZCBtb3ZlcyBvbiB0byB0aGUgbmV4dCBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yPzogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgcGxhbm5lZGAgaW4gYSBkcnkgcnVuLCBgb3BlbmVkYC9gdXBkYXRlZGAgd2hlbiBhIFBSIHdhcyBwdXNoZWQsIGB1bmNoYW5nZWRgIHdoZW4gdGhlIGJyYW5jaCBhbHJlYWR5IGhlbGQgdGhpcyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvdXRjb21lOiAnY3VycmVudCcgfCAnZXJyb3InIHwgJ29wZW5lZCcgfCAncGxhbm5lZCcgfCAndW5jaGFuZ2VkJyB8ICd1bndhdGNoZWQnIHwgJ3VwZGF0ZWQnO1xuICByZWFkb25seSBwck51bWJlcj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBzeW5jVXBzdHJlYW1zfSBzeW5jcywgYW5kIGhvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW5jVXBzdHJlYW1zT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnJhbmNoIGVhY2ggUFIgdGFyZ2V0cyBhbmQgZWFjaCB1cGRhdGUgYnJhbmNoIGlzIGN1dCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUJyYW5jaDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggdG8gYHVwc3RyZWFtcy5qc29uYCwgd2hpY2ggdGhlIHN5bmMgdXBkYXRlcyB0aGUgcGluIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUGxhbiBhbmQgcHJpbnQgZXZlcnkgUFIsIGFuZCBjaGFuZ2Ugbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGRyeVJ1bjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9ubHkgdGhlIGVudHJpZXMgd2l0aCB0aGVzZSBuYW1lcywgb3IgZXZlcnkgZW50cnkgd2hlbiBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IG9ubHk6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9uZSB1cHN0cmVhbSB0aGF0IGB1cHN0cmVhbXMuanNvbmAgbGlzdHM6IGEgZ2l0IG9uZSBvciBhbiBucG0gb25lLlxuICovXG5leHBvcnQgdHlwZSBVcHN0cmVhbUVudHJ5ID0gR2l0VXBzdHJlYW1FbnRyeSB8IE5wbVVwc3RyZWFtRW50cnk7XG5cbi8qKlxuICogVGhlIGNvbnRlbnQgb2YgYHVwc3RyZWFtcy5qc29uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcHN0cmVhbXNDb25maWcge1xuICByZWFkb25seSB1cHN0cmVhbXM6IHJlYWRvbmx5IFVwc3RyZWFtRW50cnlbXTtcbiAgLyoqXG4gICAqIFRoZSBzaGVsbCBjb21tYW5kIHRoYXQgY2hlY2tzIGV2ZXJ5IGhhbmRsZXIncyByZXN1bHQsIHVubGVzcyBhbiBlbnRyeSBuYW1lcyBpdHMgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyaWZ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgb25lIGNvbXBhcmlzb24gb2YgYW4gZW50cnkgd2l0aCBpdHMgdXBzdHJlYW0gZm91bmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBzdHJlYW1TdGF0dXMge1xuICAvKipcbiAgICogVGhlIHVwc3RyZWFtIHBhdGhzIHRoYXQgY2hhbmdlZCBhbmQgYXJlIHdhdGNoZWQsIHNvcnRlZC4gQWx3YXlzIGVtcHR5IGZvciBhbiBucG0gdXBzdHJlYW0uXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2VkUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQSBsaW5rIHRoYXQgc2hvd3Mgd2hhdCBjaGFuZ2VkIGJldHdlZW4gdGhlIHBpbiBhbmQgdGhlIGhlYWQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXJlVXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudHJ5OiBVcHN0cmVhbUVudHJ5O1xuICAvKipcbiAgICogVGhlIGNvbW1pdCBvciB2ZXJzaW9uIHRoZSB1cHN0cmVhbSBpcyBhdCBub3cuXG4gICAqL1xuICByZWFkb25seSBoZWFkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IG9yIHZlcnNpb24gYHVwc3RyZWFtcy5qc29uYCByZWNvcmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGluOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgY3VycmVudGA6IG5vdGhpbmcgdG8gZG8uIGBtb3ZlZGA6IGEgUFIgaXMgZHVlLiBgdW53YXRjaGVkYDogdXBzdHJlYW0gbW92ZWQsIGJ1dCBubyB3YXRjaGVkIHBhdGggY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlOiAnY3VycmVudCcgfCAnbW92ZWQnIHwgJ3Vud2F0Y2hlZCc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIEdpdEh1YiB0cnVuY2F0ZWQgdGhlIGNvbXBhcmUncyBmaWxlIGxpc3QsIHNvIGEgd2F0Y2hlZCBwYXRoIG1heSBiZSBtaXNzaW5nIGZyb20gYGNoYW5nZWRQYXRoc2AuXG4gICAqL1xuICByZWFkb25seSB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBHaXRIdWJDb21taXQge1xuICByZWFkb25seSBzaGE6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdpdEh1YkNvbXBhcmUge1xuICByZWFkb25seSBmaWxlcz86IHJlYWRvbmx5IEdpdEh1YkNvbXBhcmVGaWxlW107XG59XG5cbi8qKlxuICogT25lIGZpbGUgb2YgYSBHaXRIdWIgY29tcGFyZSwgYXMgdGhlIEFQSSBzcGVsbHMgaXQuXG4gKi9cbmludGVyZmFjZSBHaXRIdWJDb21wYXJlRmlsZSB7XG4gIHJlYWRvbmx5IGZpbGVuYW1lOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcHJldmlvdXNfZmlsZW5hbWU/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBOcG1QYWNrdW1lbnQge1xuICByZWFkb25seSAnZGlzdC10YWdzJzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXBSZXN1bHQge1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc3VsdDogQ29tbWFuZFJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgaGFuZGxlciBhbmQgdmVyaWZ5IHJ1bnMgYSBQUiBib2R5IHJlcG9ydHMuXG4gKi9cbmludGVyZmFjZSBTdGVwUmVzdWx0cyB7XG4gIHJlYWRvbmx5IGhhbmRsZXI6IFN0ZXBSZXN1bHQ7XG4gIHJlYWRvbmx5IHZlcmlmeTogbnVsbCB8IFN0ZXBSZXN1bHQ7XG59XG5cbi8qKlxuICogYHVwc3RyZWFtcy5qc29uYCByZWFkIGxvb3NlbHksIHRvIHdyaXRlIG9uZSB2YWx1ZSBiYWNrIHdpdGhvdXQgZGlzdHVyYmluZyB0aGUgcmVzdC5cbiAqL1xuaW50ZXJmYWNlIFVwc3RyZWFtc0ZpbGVTaGFwZSB7XG4gIHJlYWRvbmx5IHVwc3RyZWFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbn1cblxuLyoqXG4gKiBHaXRIdWIncyBjb21wYXJlIEFQSSBsaXN0cyBhdCBtb3N0IHRoaXMgbWFueSBmaWxlcywgYW5kIHNheXMgbm90aGluZyB3aGVuIGl0IHN0b3BzLlxuICovXG5jb25zdCBDT01QQVJFX0ZJTEVfTElNSVQgPSAzMDA7XG5cbmNvbnN0IFNIT1JUX1NIQV9MRU5HVEggPSAxMjtcblxuLyoqXG4gKiBUaGUgdGFpbCBvZiBhIGNvbW1hbmQncyBvdXRwdXQgYSBQUiBib2R5IHF1b3RlczogZW5vdWdoIHRvIHJlYWQgYSBmYWlsdXJlLCBzaG9ydCBlbm91Z2ggdG8gc3RheSB1bmRlciBHaXRIdWIncyBib2R5IGxpbWl0LlxuICovXG5jb25zdCBPVVRQVVRfVEFJTF9MSU5FUyA9IDYwO1xuXG4vKipcbiAqIFRoZSBtb3N0IGxpbmVzIHRoYXQgcmVwb3J0IGEgZmFpbHVyZSBhIGZhaWxlZCBzdGVwJ3Mgc2VjdGlvbiBvcGVucyB3aXRoLCBhaGVhZCBvZiBpdHMgb3V0cHV0IHRhaWwuXG4gKi9cbmNvbnN0IEZBSUxVUkVfTElORV9MSU1JVCA9IDIwO1xuXG5jb25zdCBKU09OX0lOREVOVF9TUEFDRVMgPSAyO1xuXG4vKipcbiAqIFRoZSBFU0MgdGhhdCBvcGVucyBhIHRlcm1pbmFsIGNvbnRyb2wgc2VxdWVuY2UsIGVpdGhlciBhcyB0aGUgYnl0ZSBvciBhcyB0aGUgY2FyZXQgdGV4dCBgXltgIGEgbG9nIHZpZXdlciBvciBhblxuICogZWFybGllciBjb3B5IHR1cm5lZCBpdCBpbnRvLiBCb3RoIHJlYWNoZWQgYSBQUiBib2R5OiBjcmVhdGUtb2JzaWRpYW4tcGx1Z2luIzIgY2FycmllZCB0aGUgY2FyZXQgZm9ybS5cbiAqL1xuY29uc3QgRVNDID0gU3RyaW5nLnJhd2AoPzpcXHUwMDFCfFxcXlxcWylgO1xuXG4vKipcbiAqIENvbnRyb2wgU2VxdWVuY2UgSW50cm9kdWNlciBzZXF1ZW5jZXMgKGNvbG9ycywgY3Vyc29yIG1vdmVzKSwgT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kIHNlcXVlbmNlcyAoaHlwZXJsaW5rcyxcbiAqIHRpdGxlcywgZW5kZWQgYnkgQkVMIG9yIFNULCBhbHNvIGFzIGBeR2ApLCBhbmQgdGhlIHR3by1jaGFyYWN0ZXIgZXNjYXBlcy4gQSB0d28tY2hhcmFjdGVyIGVzY2FwZSBpcyBtYXRjaGVkIG9ubHkgYXNcbiAqIHRoZSBieXRlLCBiZWNhdXNlIGl0cyBjYXJldCB0ZXh0IGFsc28gc3BlbGxzIGFuIG9yZGluYXJ5IHJlZ3VsYXIgZXhwcmVzc2lvbiwgc3VjaCBhcyBgXltBLVpdYC5cbiAqL1xuY29uc3QgVEVSTUlOQUxfQ09OVFJPTF9SRUdfRVhQID0gbmV3IFJlZ0V4cChcbiAgU3RyaW5nLnJhd2Ake0VTQ31cXFtbMC0/XSpbIC0vXSpbQC1+XXwke0VTQ31cXF1bXlxcdTAwMDdcXHUwMDFCXl0qKD86XFx1MDAwN3xcXF5HfCR7RVNDfVxcXFwpfFxcdTAwMUJbQC1aXFxcXC1fXWAsXG4gICdnJ1xuKTtcblxuLyoqXG4gKiBBIGxpbmUgdGhhdCByZXBvcnRzIGEgZmFpbHVyZSwgd2hpY2ggYSBmYWlsZWQgc3RlcCdzIHNlY3Rpb24gcXVvdGVzIGZpcnN0LCBiZWNhdXNlIHRoZSB0YWlsIG1heSBiZSBhIGdyZWVuIHRlc3QgcnVuXG4gKiB0aGF0IGZpbmlzaGVkIGFmdGVyIGl0LlxuICovXG5jb25zdCBGQUlMVVJFX0xJTkVfUkVHX0VYUCA9IC9zdGVwLWZhaWxlZHxcXGJmYWlsKD86c3xlZHx1cmV8aW5nKT9cXGJ8XFxiZXJyb3JcXGJ8XFxibm90IGZvdW5kXFxifFxcYkVSUiF8W1x1MjcxN1x1MDBEN10vaTtcblxuLyoqXG4gKiBXcml0ZXMgdGhlIFBSIGJvZHkuXG4gKlxuICogQHBhcmFtIHBsYW4gLSBUaGUgcGxhbi5cbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBoYW5kbGVyIGFuZCB2ZXJpZnkgcnVucywgb3IgYG51bGxgIGluIGEgZHJ5IHJ1biwgd2hlcmUgbmVpdGhlciBydW5zLlxuICogQHBhcmFtIGRpZmZTdGF0IC0gYGdpdCBkaWZmIC0tc3RhdGAgb2YgdGhlIHVwZGF0ZSBjb21taXQsIG9yIGBudWxsYCBpbiBhIGRyeSBydW4uXG4gKiBAcmV0dXJucyBUaGUgYm9keSwgaW4gTWFya2Rvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByQm9keShwbGFuOiBTeW5jUGxhbiwgc3RlcHM6IG51bGwgfCBTdGVwUmVzdWx0cywgZGlmZlN0YXQ6IG51bGwgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB7IGVudHJ5LCBoZWFkLCBwaW4gfSA9IHBsYW4uc3RhdHVzO1xuICBjb25zdCBzb3VyY2UgPSBpc0dpdFVwc3RyZWFtKGVudHJ5KSA/IGBcXGAke2VudHJ5LnJlcG99QCR7ZW50cnkucmVmfVxcYGAgOiBgbnBtIFxcYCR7ZW50cnkubnBtfUAke2VudHJ5LnRhZyA/PyAnbGF0ZXN0J31cXGBgO1xuICBjb25zdCBsaW5lcyA9IFtcbiAgICBgVXBzdHJlYW0gXFxgJHtlbnRyeS5uYW1lfVxcYCBtb3ZlZDogJHtzb3VyY2V9IGZyb20gXFxgJHtwaW59XFxgIHRvIFxcYCR7aGVhZH1cXGAuYCxcbiAgICAnJyxcbiAgICBgQ29tcGFyZTogJHtwbGFuLnN0YXR1cy5jb21wYXJlVXJsfWAsXG4gICAgJydcbiAgXTtcblxuICBpZiAoaXNHaXRVcHN0cmVhbShlbnRyeSkpIHtcbiAgICBsaW5lcy5wdXNoKCcjIyMgQ2hhbmdlZCB1cHN0cmVhbSBmaWxlcycsICcnLCAuLi5wbGFuLnN0YXR1cy5jaGFuZ2VkUGF0aHMubWFwKChwYXRoKSA9PiBgLSBcXGAke3BhdGh9XFxgYCkpO1xuICAgIGlmIChwbGFuLnN0YXR1cy50cnVuY2F0ZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goYC0gR2l0SHViIGxpc3RzIGF0IG1vc3QgJHtTdHJpbmcoQ09NUEFSRV9GSUxFX0xJTUlUKX0gZmlsZXM6IG9wZW4gdGhlIGNvbXBhcmUgbGluayBmb3IgdGhlIHJlc3QuYCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG5cbiAgaWYgKHN0ZXBzID09PSBudWxsKSB7XG4gICAgbGluZXMucHVzaCgnIyMjIEhhbmRsZXInLCAnJywgYFxcYCR7ZW50cnkuaGFuZGxlcn1cXGA6IG5vdCBydW4gKGRyeSBydW4pLmAsICcnKTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKC4uLmRlc2NyaWJlU3RlcCgnSGFuZGxlcicsIHN0ZXBzLmhhbmRsZXIpKTtcbiAgICBpZiAoc3RlcHMudmVyaWZ5ICE9PSBudWxsKSB7XG4gICAgICBsaW5lcy5wdXNoKC4uLmRlc2NyaWJlU3RlcCgnVmVyaWZ5Jywgc3RlcHMudmVyaWZ5KSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRpZmZTdGF0ICE9PSBudWxsKSB7XG4gICAgbGluZXMucHVzaCgnIyMjIEdlbmVyYXRlZCBjaGFuZ2VzJywgJycsICdgYGB0ZXh0JywgY2xlYW5Db21tYW5kT3V0cHV0KGRpZmZTdGF0KS50cmltRW5kKCksICdgYGAnLCAnJyk7XG4gIH1cblxuICBsaW5lcy5wdXNoKCdUaGlzIFBSIHdhcyBvcGVuZWQgYnkgdGhlIHVwc3RyZWFtLXN5bmMgam9iIGFuZCBpcyBuZXZlciBtZXJnZWQgYXV0b21hdGljYWxseS4nKTtcbiAgcmV0dXJuIGAke2xpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG59XG5cbi8qKlxuICogVHVybnMgYSBjb21tYW5kJ3MgY2FwdHVyZWQgb3V0cHV0IGludG8gcGxhaW4gdGV4dCBhIFBSIGJvZHkgY2FuIHF1b3RlOiB0ZXJtaW5hbCBjb250cm9sIHNlcXVlbmNlcyBhcmUgcmVtb3ZlZCxcbiAqIHdoZXRoZXIgdGhleSBhcnJpdmVkIGFzIEVTQyBieXRlcyBvciBhcyB0aGVpciBjYXJldC1yZW5kZXJlZCBgXltbLi4ubWAgdGV4dCwgYW5kIGEgbGluZSBhIHByb2dyZXNzIGRpc3BsYXkgcmV3cm90ZVxuICogd2l0aCBgXFxyYCBrZWVwcyBvbmx5IGl0cyBsYXN0IHN0YXRlLlxuICpcbiAqIEBwYXJhbSBvdXRwdXQgLSBUaGUgY2FwdHVyZWQgb3V0cHV0LlxuICogQHJldHVybnMgVGhlIHBsYWluIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkNvbW1hbmRPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3V0cHV0XG4gICAgLnJlcGxhY2VBbGwoVEVSTUlOQUxfQ09OVFJPTF9SRUdfRVhQLCAnJylcbiAgICAucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHRvTGFzdExpbmVTdGF0ZShsaW5lKSlcbiAgICAuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQ29tcGFyZXMgb25lIGVudHJ5IHdpdGggaXRzIHVwc3RyZWFtLlxuICpcbiAqIEBwYXJhbSBlbnRyeSAtIFRoZSBlbnRyeS5cbiAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgLSBUaGUgb3V0c2lkZSB3b3JsZC5cbiAqIEByZXR1cm5zIFdoYXQgdGhlIGNvbXBhcmlzb24gZm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wYXJlV2l0aFVwc3RyZWFtKGVudHJ5OiBVcHN0cmVhbUVudHJ5LCBkZXBlbmRlbmNpZXM6IFBpY2s8U3luY0RlcGVuZGVuY2llcywgJ2ZldGNoSnNvbic+KTogUHJvbWlzZTxVcHN0cmVhbVN0YXR1cz4ge1xuICBpZiAoIWlzR2l0VXBzdHJlYW0oZW50cnkpKSB7XG4gICAgY29uc3QgdGFnID0gZW50cnkudGFnID8/ICdsYXRlc3QnO1xuICAgIGNvbnN0IHBhY2t1bWVudCA9IGF3YWl0IGRlcGVuZGVuY2llcy5mZXRjaEpzb24oYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7ZW50cnkubnBtLnJlcGxhY2UoJy8nLCAnJTJmJyl9YCkgYXMgTnBtUGFja3VtZW50O1xuICAgIGNvbnN0IGhlYWQgPSBwYWNrdW1lbnRbJ2Rpc3QtdGFncyddW3RhZ107XG4gICAgaWYgKGhlYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBucG0gcGFja2FnZSAke2VudHJ5Lm5wbX0gaGFzIG5vIGRpc3QtdGFnIFwiJHt0YWd9XCIuYCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VkUGF0aHM6IFtdLFxuICAgICAgY29tcGFyZVVybDogYGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyR7ZW50cnkubnBtfS92LyR7aGVhZH1gLFxuICAgICAgZW50cnksXG4gICAgICBoZWFkLFxuICAgICAgcGluOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgc3RhdGU6IGhlYWQgPT09IGVudHJ5LnZlcnNpb24gPyAnY3VycmVudCcgOiAnbW92ZWQnLFxuICAgICAgdHJ1bmNhdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBjb25zdCBjb21taXQgPSBhd2FpdCBkZXBlbmRlbmNpZXMuZmV0Y2hKc29uKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7ZW50cnkucmVwb30vY29tbWl0cy8ke2VuY29kZVVSSUNvbXBvbmVudChlbnRyeS5yZWYpfWApIGFzIEdpdEh1YkNvbW1pdDtcbiAgY29uc3QgaGVhZCA9IGNvbW1pdC5zaGE7XG4gIGNvbnN0IGNvbXBhcmVVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7ZW50cnkucmVwb30vY29tcGFyZS8ke2VudHJ5LmNvbW1pdH0uLi4ke2hlYWR9YDtcbiAgaWYgKGhlYWQgPT09IGVudHJ5LmNvbW1pdCkge1xuICAgIHJldHVybiB7IGNoYW5nZWRQYXRoczogW10sIGNvbXBhcmVVcmwsIGVudHJ5LCBoZWFkLCBwaW46IGVudHJ5LmNvbW1pdCwgc3RhdGU6ICdjdXJyZW50JywgdHJ1bmNhdGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgY29tcGFyZSA9IGF3YWl0IGRlcGVuZGVuY2llcy5mZXRjaEpzb24oYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtlbnRyeS5yZXBvfS9jb21wYXJlLyR7ZW50cnkuY29tbWl0fS4uLiR7aGVhZH1gKSBhcyBHaXRIdWJDb21wYXJlO1xuICBjb25zdCBmaWxlcyA9IGNvbXBhcmUuZmlsZXMgPz8gW107XG4gIGNvbnN0IHRvdWNoZWQgPSBuZXcgU2V0KGZpbGVzLmZsYXRNYXAoKGZpbGUpID0+IGZpbGUucHJldmlvdXNfZmlsZW5hbWUgPT09IHVuZGVmaW5lZCA/IFtmaWxlLmZpbGVuYW1lXSA6IFtmaWxlLmZpbGVuYW1lLCBmaWxlLnByZXZpb3VzX2ZpbGVuYW1lXSkpO1xuICBjb25zdCBjaGFuZ2VkUGF0aHMgPSBbLi4udG91Y2hlZF0uZmlsdGVyKChwYXRoKSA9PiBlbnRyeS5wYXRocy5zb21lKChnbG9iKSA9PiBtYXRjaGVzR2xvYihwYXRoLCBnbG9iKSkpLnNvcnQoKTtcbiAgY29uc3QgaXNUcnVuY2F0ZWQgPSBmaWxlcy5sZW5ndGggPj0gQ09NUEFSRV9GSUxFX0xJTUlUO1xuICByZXR1cm4ge1xuICAgIGNoYW5nZWRQYXRocyxcbiAgICBjb21wYXJlVXJsLFxuICAgIGVudHJ5LFxuICAgIGhlYWQsXG4gICAgcGluOiBlbnRyeS5jb21taXQsXG4gICAgc3RhdGU6IGNoYW5nZWRQYXRocy5sZW5ndGggPiAwIHx8IGlzVHJ1bmNhdGVkID8gJ21vdmVkJyA6ICd1bndhdGNoZWQnLFxuICAgIHRydW5jYXRlZDogaXNUcnVuY2F0ZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYW5kIHZhbGlkYXRlcyBhbiBgdXBzdHJlYW1zLmpzb25gLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIGZpbGUncyBjb250ZW50LlxuICogQHJldHVybnMgVGhlIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXBzdHJlYW1zQ29uZmlnKHRleHQ6IHN0cmluZyk6IFVwc3RyZWFtc0NvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UodGV4dCkgYXMgUGFydGlhbDxVcHN0cmVhbXNDb25maWc+O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLnVwc3RyZWFtcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cHN0cmVhbXMuanNvbiBoYXMgbm8gXCJ1cHN0cmVhbXNcIiBhcnJheS4nKTtcbiAgfVxuICAvLyBSZWFkIHRocm91Z2ggYFJlZmxlY3QuZ2V0YCwgYmVjYXVzZSBub3RoaW5nIGFib3V0IHRoZSBwYXJzZWQgZW50cmllcyBpcyBrbm93biB5ZXQuXG4gIGNvbnN0IGVudHJpZXM6IHJlYWRvbmx5IG9iamVjdFtdID0gY29uZmlnLnVwc3RyZWFtcztcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHVua25vd24+KCk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IG5hbWU6IHVua25vd24gPSBSZWZsZWN0LmdldChlbnRyeSwgJ25hbWUnKTtcbiAgICBjb25zdCBsYWJlbCA9IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyA/IGBcIiR7bmFtZX1cImAgOiAnd2l0aCBubyBuYW1lJztcbiAgICBjb25zdCBpc0dpdCA9ICdyZXBvJyBpbiBlbnRyeTtcbiAgICBjb25zdCByZXF1aXJlZCA9IGlzR2l0ID8gWyduYW1lJywgJ3JlcG8nLCAncmVmJywgJ2NvbW1pdCcsICdoYW5kbGVyJ10gOiBbJ25hbWUnLCAnbnBtJywgJ3ZlcnNpb24nLCAnaGFuZGxlciddO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlcXVpcmVkKSB7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QuZ2V0KGVudHJ5LCBrZXkpICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGB1cHN0cmVhbXMuanNvbjogZW50cnkgJHtsYWJlbH0gbmVlZHMgYSBzdHJpbmcgXCIke2tleX1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzR2l0ICYmICFBcnJheS5pc0FycmF5KFJlZmxlY3QuZ2V0KGVudHJ5LCAncGF0aHMnKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXBzdHJlYW1zLmpzb246IGVudHJ5ICR7bGFiZWx9IG5lZWRzIGEgXCJwYXRoc1wiIGFycmF5LmApO1xuICAgIH1cbiAgICBpZiAobmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwc3RyZWFtcy5qc29uOiB0aGUgbmFtZSAke2xhYmVsfSBpcyB1c2VkIHR3aWNlLmApO1xuICAgIH1cbiAgICBuYW1lcy5hZGQobmFtZSk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZyBhcyBVcHN0cmVhbXNDb25maWc7XG59XG5cbi8qKlxuICogUGxhbnMgdGhlIFBSIGEgbW92ZWQgdXBzdHJlYW0gYXNrcyBmb3IuXG4gKlxuICogQHBhcmFtIHN0YXR1cyAtIFRoZSBjb21wYXJpc29uIG9mIGEgbW92ZWQgZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgYnJhbmNoIGFuZCB0aXRsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5TeW5jKHN0YXR1czogVXBzdHJlYW1TdGF0dXMpOiBTeW5jUGxhbiB7XG4gIHJldHVybiB7XG4gICAgYnJhbmNoOiBgdXBzdHJlYW0vJHtzdGF0dXMuZW50cnkubmFtZX1gLFxuICAgIHN0YXR1cyxcbiAgICB0aXRsZTogYGNob3JlKHVwc3RyZWFtKTogc3luYyAke3N0YXR1cy5lbnRyeS5uYW1lfSB0byAke3Nob3J0ZW4oc3RhdHVzLmhlYWQpfWBcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVja3MgZXZlcnkgZW50cnksIGFuZCBvcGVucyBvciB1cGRhdGVzIG9uZSBQUiBwZXIgbW92ZWQgdXBzdHJlYW0uXG4gKlxuICogQSBoYW5kbGVyIG9yIHZlcmlmeSBmYWlsdXJlIHN0aWxsIG9wZW5zIHRoZSBQUiwgYXMgYSBkcmFmdCB3aXRoIHRoZSBmYWlsdXJlIGluIGl0cyBib2R5LCBzbyBhIGJyZWFraW5nIHVwc3RyZWFtIGNoYW5nZVxuICogaXMgc2VlbiByYXRoZXIgdGhhbiBza2lwcGVkLiBBbiBlcnJvciBpbiB0aGUgc3luYyBpdHNlbGYsIHN1Y2ggYXMgYSBmYWlsZWQgQVBJIGNhbGwsIGlzIHJlcG9ydGVkIGluIHRoZSBlbnRyeSdzIHJlc3VsdFxuICogYW5kIHRoZSBuZXh0IGVudHJ5IHN0aWxsIHJ1bnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBXaGF0IHRvIHN5bmMsIGFuZCBob3cuXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIG91dHNpZGUgd29ybGQuXG4gKiBAcmV0dXJucyBPbmUgcmVzdWx0IHBlciBlbnRyeSBjaGVja2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luY1Vwc3RyZWFtcyhvcHRpb25zOiBTeW5jVXBzdHJlYW1zT3B0aW9ucywgZGVwZW5kZW5jaWVzOiBTeW5jRGVwZW5kZW5jaWVzKTogUHJvbWlzZTxTeW5jUmVzdWx0W10+IHtcbiAgY29uc3QgY29uZmlnID0gcGFyc2VVcHN0cmVhbXNDb25maWcocmVhZEZpbGVTeW5jKG9wdGlvbnMuY29uZmlnUGF0aCwgJ3V0Zi04JykpO1xuICBjb25zdCB1bmtub3duID0gb3B0aW9ucy5vbmx5LmZpbHRlcigobmFtZSkgPT4gY29uZmlnLnVwc3RyZWFtcy5ldmVyeSgoZW50cnkpID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpKTtcbiAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdXBzdHJlYW1zLmpzb24gaGFzIG5vIGVudHJ5IG5hbWVkICR7dW5rbm93bi5tYXAoKG5hbWUpID0+IGBcIiR7bmFtZX1cImApLmpvaW4oJywgJyl9LmApO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0czogU3luY1Jlc3VsdFtdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgY29uZmlnLnVwc3RyZWFtcykge1xuICAgIGlmIChvcHRpb25zLm9ubHkubGVuZ3RoID4gMCAmJiAhb3B0aW9ucy5vbmx5LmluY2x1ZGVzKGVudHJ5Lm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdHMucHVzaChhd2FpdCBzeW5jRW50cnkoZW50cnksIGNvbmZpZywgb3B0aW9ucywgZGVwZW5kZW5jaWVzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBkZXBlbmRlbmNpZXMubG9nKGAke2VudHJ5Lm5hbWV9OiBFUlJPUiAke21lc3NhZ2V9YCk7XG4gICAgICByZXN1bHRzLnB1c2goeyBlcnJvcjogbWVzc2FnZSwgbmFtZTogZW50cnkubmFtZSwgb3V0Y29tZTogJ2Vycm9yJyB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogUmVjb3JkcyBgaGVhZGAgYXMgdGhlIGVudHJ5J3MgcGluIGluIGB1cHN0cmVhbXMuanNvbmAsIHVubGVzcyB0aGUgaGFuZGxlciBhbHJlYWR5IG1vdmVkIGl0LCBrZWVwaW5nIHRoZSBmaWxlJ3NcbiAqIGtleSBvcmRlciBhbmQgZm9ybWF0dGluZy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnUGF0aCAtIFRoZSBwYXRoIHRvIGB1cHN0cmVhbXMuanNvbmAuXG4gKiBAcGFyYW0gc3RhdHVzIC0gVGhlIGNvbXBhcmlzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpbihjb25maWdQYXRoOiBzdHJpbmcsIHN0YXR1czogVXBzdHJlYW1TdGF0dXMpOiB2b2lkIHtcbiAgY29uc3QgdGV4dCA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyBVcHN0cmVhbXNGaWxlU2hhcGU7XG4gIGNvbnN0IGtleSA9IGlzR2l0VXBzdHJlYW0oc3RhdHVzLmVudHJ5KSA/ICdjb21taXQnIDogJ3ZlcnNpb24nO1xuICBjb25zdCB0YXJnZXQgPSBwYXJzZWQudXBzdHJlYW1zLmZpbmQoKGVudHJ5KSA9PiBlbnRyeVsnbmFtZSddID09PSBzdGF0dXMuZW50cnkubmFtZSk7XG4gIGlmICh0YXJnZXQ/LltrZXldICE9PSBzdGF0dXMucGluKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRhcmdldFtrZXldID0gc3RhdHVzLmhlYWQ7XG4gIHdyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCBKU09OX0lOREVOVF9TUEFDRVMpfVxcbmApO1xufVxuXG5mdW5jdGlvbiBhcHBseVBsYW4ocGxhbjogU3luY1BsYW4sIGNvbmZpZzogVXBzdHJlYW1zQ29uZmlnLCBvcHRpb25zOiBTeW5jVXBzdHJlYW1zT3B0aW9ucywgZGVwZW5kZW5jaWVzOiBTeW5jRGVwZW5kZW5jaWVzKTogU3luY1Jlc3VsdCB7XG4gIGNvbnN0IHsgZW50cnkgfSA9IHBsYW4uc3RhdHVzO1xuICAvLyBObyBjb2xvcjogdGhlIG91dHB1dCBpcyBxdW90ZWQgaW4gYSBQUiBib2R5LCB3aGVyZSBhIGNvbG9yIGNvZGUgaXMgb25seSBub2lzZS4gYENJYCBpcyBsZWZ0IGFsb25lLCBiZWNhdXNlIGl0XG4gIC8vIGNoYW5nZXMgd2hhdCBzb21lIHRvb2xzIGRvLCBub3QganVzdCBob3cgdGhleSBwcmludC5cbiAgY29uc3QgZW52ID0geyBGT1JDRV9DT0xPUjogJzAnLCBOT19DT0xPUjogJzEnLCBVUFNUUkVBTV9OQU1FOiBlbnRyeS5uYW1lLCBVUFNUUkVBTV9UQVJHRVQ6IHBsYW4uc3RhdHVzLmhlYWQgfTtcbiAgY29uc3QgaGFuZGxlcjogU3RlcFJlc3VsdCA9IHsgY29tbWFuZDogZW50cnkuaGFuZGxlciwgcmVzdWx0OiBkZXBlbmRlbmNpZXMuc2hlbGwoZW50cnkuaGFuZGxlciwgZW52KSB9O1xuICB3cml0ZVBpbihvcHRpb25zLmNvbmZpZ1BhdGgsIHBsYW4uc3RhdHVzKTtcbiAgY29uc3QgdmVyaWZ5Q29tbWFuZCA9IGVudHJ5LnZlcmlmeSA/PyBjb25maWcudmVyaWZ5O1xuICBjb25zdCB2ZXJpZnk6IG51bGwgfCBTdGVwUmVzdWx0ID0gdmVyaWZ5Q29tbWFuZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHsgY29tbWFuZDogdmVyaWZ5Q29tbWFuZCwgcmVzdWx0OiBkZXBlbmRlbmNpZXMuc2hlbGwodmVyaWZ5Q29tbWFuZCwgZW52KSB9O1xuICBjb25zdCBpc0ZhaWxlZCA9IGhhbmRsZXIucmVzdWx0LmV4aXRDb2RlICE9PSAwIHx8ICh2ZXJpZnkgIT09IG51bGwgJiYgdmVyaWZ5LnJlc3VsdC5leGl0Q29kZSAhPT0gMCk7XG5cbiAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2l0JywgWydhZGQnLCAnLS1hbGwnXSk7XG4gIGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsnY29tbWl0JywgJy0tbm8tdmVyaWZ5JywgJy0tbWVzc2FnZScsIHBsYW4udGl0bGVdKTtcbiAgY29uc3QgZGlmZlN0YXQgPSBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2RpZmYnLCAnLS1zdGF0JywgJ0hFQUR+MScsICdIRUFEJ10pO1xuXG4gIGNvbnN0IGJvZHkgPSBidWlsZFByQm9keShwbGFuLCB7IGhhbmRsZXIsIHZlcmlmeSB9LCBkaWZmU3RhdCk7XG4gIGNvbnN0IGlzUmVtb3RlQnJhbmNoID0gZGVwZW5kZW5jaWVzLmV4ZWMoJ2dpdCcsIFsnbHMtcmVtb3RlJywgJy0tZXhpdC1jb2RlJywgJy0taGVhZHMnLCAnb3JpZ2luJywgcGxhbi5icmFuY2hdKS5leGl0Q29kZSA9PT0gMDtcbiAgaWYgKGlzUmVtb3RlQnJhbmNoKSB7XG4gICAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2l0JywgWydmZXRjaCcsICdvcmlnaW4nLCBwbGFuLmJyYW5jaF0pO1xuICAgIGlmIChkZXBlbmRlbmNpZXMuZXhlYygnZ2l0JywgWydkaWZmJywgJy0tcXVpZXQnLCAnRkVUQ0hfSEVBRCcsICdIRUFEJ10pLmV4aXRDb2RlID09PSAwKSB7XG4gICAgICAvLyBUaGUgYm9keSBpcyBzdGlsbCByZXdyaXR0ZW4sIHNvIGEgY2hhbmdlIHRvIGhvdyBpdCBpcyB3cml0dGVuIHJlYWNoZXMgYSBQUiB3aG9zZSBicmFuY2ggaGFzIG5vdCBtb3ZlZC5cbiAgICAgIGNvbnN0IG9wZW4gPSBmaW5kT3BlblByKGRlcGVuZGVuY2llcywgcGxhbi5icmFuY2gpO1xuICAgICAgaWYgKG9wZW4gIT09IG51bGwpIHtcbiAgICAgICAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBbJ3ByJywgJ2VkaXQnLCBvcGVuLCAnLS1ib2R5JywgYm9keV0pO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogJHtwbGFuLmJyYW5jaH0gYWxyZWFkeSBob2xkcyB0aGlzIHJlc3VsdDsgbm90aGluZyBwdXNoZWQke29wZW4gPT09IG51bGwgPyAnJyA6IGAsIFBSICMke29wZW59J3MgYm9keSByZXdyaXR0ZW5gfS5gKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICd1bmNoYW5nZWQnIH07XG4gICAgfVxuICB9XG4gIGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsncHVzaCcsICctLWZvcmNlJywgJ29yaWdpbicsIGBIRUFEOnJlZnMvaGVhZHMvJHtwbGFuLmJyYW5jaH1gXSk7XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBmaW5kT3BlblByKGRlcGVuZGVuY2llcywgcGxhbi5icmFuY2gpO1xuICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIHtcbiAgICBjb25zdCBwck51bWJlciA9IE51bWJlcihleGlzdGluZyk7XG4gICAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBbJ3ByJywgJ2VkaXQnLCBleGlzdGluZywgJy0tdGl0bGUnLCBwbGFuLnRpdGxlLCAnLS1ib2R5JywgYm9keV0pO1xuICAgIGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2doJywgaXNGYWlsZWQgPyBbJ3ByJywgJ3JlYWR5JywgZXhpc3RpbmcsICctLXVuZG8nXSA6IFsncHInLCAncmVhZHknLCBleGlzdGluZ10pO1xuICAgIGRlcGVuZGVuY2llcy5sb2coYCR7ZW50cnkubmFtZX06IHVwZGF0ZWQgUFIgIyR7ZXhpc3Rpbmd9JHtpc0ZhaWxlZCA/ICcgKGRyYWZ0OiBhIHN0ZXAgZmFpbGVkKScgOiAnJ30uYCk7XG4gICAgcmV0dXJuIHsgbmFtZTogZW50cnkubmFtZSwgb3V0Y29tZTogJ3VwZGF0ZWQnLCBwck51bWJlciB9O1xuICB9XG5cbiAgY29uc3QgdXJsID0gZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBbXG4gICAgJ3ByJyxcbiAgICAnY3JlYXRlJyxcbiAgICAnLS1iYXNlJyxcbiAgICBvcHRpb25zLmJhc2VCcmFuY2gsXG4gICAgJy0taGVhZCcsXG4gICAgcGxhbi5icmFuY2gsXG4gICAgJy0tdGl0bGUnLFxuICAgIHBsYW4udGl0bGUsXG4gICAgJy0tYm9keScsXG4gICAgYm9keSxcbiAgICAuLi4oaXNGYWlsZWQgPyBbJy0tZHJhZnQnXSA6IFtdKVxuICBdKS50cmltKCk7XG4gIGRlcGVuZGVuY2llcy5sb2coYCR7ZW50cnkubmFtZX06IG9wZW5lZCAke3VybH0ke2lzRmFpbGVkID8gJyAoZHJhZnQ6IGEgc3RlcCBmYWlsZWQpJyA6ICcnfS5gKTtcbiAgY29uc3QgcHJOdW1iZXIgPSBOdW1iZXIoL1xcL3B1bGxcXC8oPzxOdW1iZXI+XFxkKykvLmV4ZWModXJsKT8uZ3JvdXBzPy5bJ051bWJlciddID8/IE5hTik7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4ocHJOdW1iZXIpID8geyBuYW1lOiBlbnRyeS5uYW1lLCBvdXRjb21lOiAnb3BlbmVkJyB9IDogeyBuYW1lOiBlbnRyeS5uYW1lLCBvdXRjb21lOiAnb3BlbmVkJywgcHJOdW1iZXIgfTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVTdGVwKGhlYWRpbmc6IHN0cmluZywgc3RlcDogU3RlcFJlc3VsdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXNQYXNzZWQgPSBzdGVwLnJlc3VsdC5leGl0Q29kZSA9PT0gMDtcbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBjbGVhbkNvbW1hbmRPdXRwdXQoc3RlcC5yZXN1bHQub3V0cHV0KS50cmltRW5kKCkuc3BsaXQoJ1xcbicpO1xuICBjb25zdCB0YWlsID0gb3V0cHV0TGluZXMuc2xpY2UoLU9VVFBVVF9UQUlMX0xJTkVTKS5qb2luKCdcXG4nKTtcbiAgY29uc3QgZmFpbHVyZUxpbmVzID0gaXNQYXNzZWQgPyBbXSA6IG91dHB1dExpbmVzLmZpbHRlcigobGluZSkgPT4gRkFJTFVSRV9MSU5FX1JFR19FWFAudGVzdChsaW5lKSkuc2xpY2UoMCwgRkFJTFVSRV9MSU5FX0xJTUlUKTtcbiAgcmV0dXJuIFtcbiAgICBgIyMjICR7aGVhZGluZ31gLFxuICAgICcnLFxuICAgIGBcXGAke3N0ZXAuY29tbWFuZH1cXGA6ICR7aXNQYXNzZWQgPyAncGFzc2VkJyA6IGAqKkZBSUxFRCoqIChleGl0ICR7U3RyaW5nKHN0ZXAucmVzdWx0LmV4aXRDb2RlKX0pYH0uYCxcbiAgICAnJyxcbiAgICAuLi4oZmFpbHVyZUxpbmVzLmxlbmd0aCA9PT0gMCA/IFtdIDogWydMaW5lcyByZXBvcnRpbmcgdGhlIGZhaWx1cmU6JywgJycsICdgYGB0ZXh0JywgLi4uZmFpbHVyZUxpbmVzLCAnYGBgJywgJyddKSxcbiAgICBpc1Bhc3NlZCA/ICc8ZGV0YWlscz48c3VtbWFyeT5PdXRwdXQ8L3N1bW1hcnk+JyA6ICc8ZGV0YWlscyBvcGVuPjxzdW1tYXJ5Pk91dHB1dDwvc3VtbWFyeT4nLFxuICAgICcnLFxuICAgICdgYGB0ZXh0JyxcbiAgICB0YWlsLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICc8L2RldGFpbHM+JyxcbiAgICAnJ1xuICBdO1xufVxuXG5mdW5jdGlvbiBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXM6IFN5bmNEZXBlbmRlbmNpZXMsIGZpbGU6IHN0cmluZywgYXJndW1lbnRzXzogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHQgPSBkZXBlbmRlbmNpZXMuZXhlYyhmaWxlLCBhcmd1bWVudHNfKTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWxlfSAke2FyZ3VtZW50c18uam9pbignICcpfSBmYWlsZWQgKGV4aXQgJHtTdHJpbmcocmVzdWx0LmV4aXRDb2RlKX0pOiAke3Jlc3VsdC5vdXRwdXQudHJpbSgpfWApO1xuICB9XG4gIHJldHVybiByZXN1bHQub3V0cHV0O1xufVxuXG5mdW5jdGlvbiBmaW5kT3BlblByKGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcywgYnJhbmNoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgbnVtYmVyID0gZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBbJ3ByJywgJ2xpc3QnLCAnLS1oZWFkJywgYnJhbmNoLCAnLS1zdGF0ZScsICdvcGVuJywgJy0tanNvbicsICdudW1iZXInLCAnLS1qcScsICcuWzBdLm51bWJlciddKS50cmltKCk7XG4gIHJldHVybiBudW1iZXIgPT09ICcnIHx8IG51bWJlciA9PT0gJ251bGwnID8gbnVsbCA6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gaXNHaXRVcHN0cmVhbShlbnRyeTogVXBzdHJlYW1FbnRyeSk6IGVudHJ5IGlzIEdpdFVwc3RyZWFtRW50cnkge1xuICByZXR1cm4gJ3JlcG8nIGluIGVudHJ5O1xufVxuXG5mdW5jdGlvbiBzaG9ydGVuKGhlYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXlswLTlhLWZdezQwfSQvLnRlc3QoaGVhZCkgPyBoZWFkLnNsaWNlKDAsIFNIT1JUX1NIQV9MRU5HVEgpIDogaGVhZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY0VudHJ5KGVudHJ5OiBVcHN0cmVhbUVudHJ5LCBjb25maWc6IFVwc3RyZWFtc0NvbmZpZywgb3B0aW9uczogU3luY1Vwc3RyZWFtc09wdGlvbnMsIGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcyk6IFByb21pc2U8U3luY1Jlc3VsdD4ge1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBjb21wYXJlV2l0aFVwc3RyZWFtKGVudHJ5LCBkZXBlbmRlbmNpZXMpO1xuICBpZiAoc3RhdHVzLnN0YXRlID09PSAnY3VycmVudCcpIHtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGAke2VudHJ5Lm5hbWV9OiBjdXJyZW50IGF0ICR7c2hvcnRlbihzdGF0dXMuaGVhZCl9LmApO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICdjdXJyZW50JyB9O1xuICB9XG4gIGlmIChzdGF0dXMuc3RhdGUgPT09ICd1bndhdGNoZWQnKSB7XG4gICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogbW92ZWQgdG8gJHtzaG9ydGVuKHN0YXR1cy5oZWFkKX0sIGJ1dCBubyB3YXRjaGVkIHBhdGggY2hhbmdlZCBzaW5jZSAke3Nob3J0ZW4oc3RhdHVzLnBpbil9LmApO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICd1bndhdGNoZWQnIH07XG4gIH1cblxuICBjb25zdCBwbGFuID0gcGxhblN5bmMoc3RhdHVzKTtcbiAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogbW92ZWQgZnJvbSAke3Nob3J0ZW4oc3RhdHVzLnBpbil9IHRvICR7c2hvcnRlbihzdGF0dXMuaGVhZCl9LiBXb3VsZCBwdXNoICR7cGxhbi5icmFuY2h9IGFuZCBvcGVuOmApO1xuICAgIGRlcGVuZGVuY2llcy5sb2coYCAgdGl0bGU6ICR7cGxhbi50aXRsZX1gKTtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGJ1aWxkUHJCb2R5KHBsYW4sIG51bGwsIG51bGwpLnJlcGxhY2VBbGwoL14vZ20sICcgIHwgJykpO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICdwbGFubmVkJyB9O1xuICB9XG5cbiAgLy8gVGhlIHVwZGF0ZSBjb21taXQgdGFrZXMgZXZlcnkgZmlsZSBpbiB0aGUgdHJlZSwgc28gYSBmaWxlIGxlZnQgbHlpbmcgYXJvdW5kIHdvdWxkIGJlIHB1c2hlZCB3aXRoIGl0LlxuICBjb25zdCBkaXJ0eSA9IGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10pLnRyaW0oKTtcbiAgaWYgKGRpcnR5ICE9PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgdGhlIHdvcmtpbmcgdHJlZSBpcyBub3QgY2xlYW4sIGFuZCB0aGUgdXBkYXRlIGNvbW1pdCB3b3VsZCB0YWtlIHRoZXNlIGZpbGVzIHdpdGggaXQ6XFxuJHtkaXJ0eX1gKTtcbiAgfVxuICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2ZldGNoJywgJ29yaWdpbicsIG9wdGlvbnMuYmFzZUJyYW5jaF0pO1xuICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2NoZWNrb3V0JywgJy1CJywgcGxhbi5icmFuY2gsIGBvcmlnaW4vJHtvcHRpb25zLmJhc2VCcmFuY2h9YF0pO1xuICB0cnkge1xuICAgIHJldHVybiBhcHBseVBsYW4ocGxhbiwgY29uZmlnLCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIGRlcGVuZGVuY2llcy5leGVjKCdnaXQnLCBbJ2NoZWNrb3V0JywgJy0tZm9yY2UnLCBvcHRpb25zLmJhc2VCcmFuY2hdKTtcbiAgICBkZXBlbmRlbmNpZXMuZXhlYygnZ2l0JywgWydicmFuY2gnLCAnLS1kZWxldGUnLCAnLS1mb3JjZScsIHBsYW4uYnJhbmNoXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9MYXN0TGluZVN0YXRlKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0YXRlcyA9IGxpbmUucmVwbGFjZSgvXFxyKyQvLCAnJyk7XG4gIHJldHVybiBzdGF0ZXMuc2xpY2Uoc3RhdGVzLmxhc3RJbmRleE9mKCdcXHInKSArIDEpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0EscUJBR087QUFDUCx1QkFBNEI7QUEyTjVCLE1BQU0scUJBQXFCO0FBRTNCLE1BQU0sbUJBQW1CO0FBS3pCLE1BQU0sb0JBQW9CO0FBSzFCLE1BQU0scUJBQXFCO0FBRTNCLE1BQU0scUJBQXFCO0FBTTNCLE1BQU0sTUFBTSxPQUFPO0FBT25CLE1BQU0sMkJBQTJCLElBQUk7QUFBQSxF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
@@ -21,48 +21,48 @@ export interface GitUpstreamEntry {
21
21
  /**
22
22
  * The pinned commit: the last upstream state the handler was run against.
23
23
  */
24
- commit: string;
24
+ readonly commit: string;
25
25
  /**
26
26
  * The shell command that turns a newer upstream state into changes in this repository.
27
27
  */
28
- handler: string;
29
- name: string;
28
+ readonly handler: string;
29
+ readonly name: string;
30
30
  /**
31
31
  * The paths watched upstream, as globs relative to the repository root. A move that touches none of them opens no PR.
32
32
  */
33
- paths: readonly string[];
33
+ readonly paths: readonly string[];
34
34
  /**
35
35
  * The branch or tag followed.
36
36
  */
37
- ref: string;
37
+ readonly ref: string;
38
38
  /**
39
39
  * `<owner>/<repo>` on GitHub.
40
40
  */
41
- repo: string;
41
+ readonly repo: string;
42
42
  /**
43
43
  * The shell command that checks the handler's result. Overrides the file's top-level `verify`.
44
44
  */
45
- verify?: string;
45
+ readonly verify?: string;
46
46
  }
47
47
  /**
48
48
  * An upstream followed as an npm package's dist-tag, pinned to a version.
49
49
  */
50
50
  export interface NpmUpstreamEntry {
51
- handler: string;
52
- name: string;
51
+ readonly handler: string;
52
+ readonly name: string;
53
53
  /**
54
54
  * The package name.
55
55
  */
56
- npm: string;
56
+ readonly npm: string;
57
57
  /**
58
58
  * The dist-tag followed. `latest` when absent.
59
59
  */
60
- tag?: string;
61
- verify?: string;
60
+ readonly tag?: string;
61
+ readonly verify?: string;
62
62
  /**
63
63
  * The pinned version.
64
64
  */
65
- version: string;
65
+ readonly version: string;
66
66
  }
67
67
  /**
68
68
  * Everything the sync does to the outside world, so a test can stand a fixture in for it.
@@ -71,24 +71,24 @@ export interface SyncDependencies {
71
71
  /**
72
72
  * Runs an executable with arguments and no shell.
73
73
  */
74
- exec: (file: string, arguments_: readonly string[], env?: Readonly<Record<string, string>>) => CommandResult;
74
+ readonly exec: (file: string, arguments_: readonly string[], env?: Readonly<Record<string, string>>) => CommandResult;
75
75
  /**
76
76
  * GETs a URL and parses the JSON it returns, throwing on an HTTP error.
77
77
  */
78
- fetchJson: (url: string) => Promise<unknown>;
79
- log: (text: string) => void;
78
+ readonly fetchJson: (url: string) => Promise<unknown>;
79
+ readonly log: (text: string) => void;
80
80
  /**
81
81
  * Runs a command line through the shell: a handler or a verify command.
82
82
  */
83
- shell: (command: string, env?: Readonly<Record<string, string>>) => CommandResult;
83
+ readonly shell: (command: string, env?: Readonly<Record<string, string>>) => CommandResult;
84
84
  }
85
85
  /**
86
86
  * The PR an upstream move asks for.
87
87
  */
88
88
  export interface SyncPlan {
89
- branch: string;
90
- status: UpstreamStatus;
91
- title: string;
89
+ readonly branch: string;
90
+ readonly status: UpstreamStatus;
91
+ readonly title: string;
92
92
  }
93
93
  /**
94
94
  * What happened to one entry.
@@ -134,11 +134,11 @@ export type UpstreamEntry = GitUpstreamEntry | NpmUpstreamEntry;
134
134
  * The content of `upstreams.json`.
135
135
  */
136
136
  export interface UpstreamsConfig {
137
- upstreams: readonly UpstreamEntry[];
137
+ readonly upstreams: readonly UpstreamEntry[];
138
138
  /**
139
139
  * The shell command that checks every handler's result, unless an entry names its own.
140
140
  */
141
- verify?: string;
141
+ readonly verify?: string;
142
142
  }
143
143
  /**
144
144
  * What one comparison of an entry with its upstream found.
@@ -147,28 +147,28 @@ export interface UpstreamStatus {
147
147
  /**
148
148
  * The upstream paths that changed and are watched, sorted. Always empty for an npm upstream.
149
149
  */
150
- changedPaths: readonly string[];
150
+ readonly changedPaths: readonly string[];
151
151
  /**
152
152
  * A link that shows what changed between the pin and the head.
153
153
  */
154
- compareUrl: string;
155
- entry: UpstreamEntry;
154
+ readonly compareUrl: string;
155
+ readonly entry: UpstreamEntry;
156
156
  /**
157
157
  * The commit or version the upstream is at now.
158
158
  */
159
- head: string;
159
+ readonly head: string;
160
160
  /**
161
161
  * The commit or version `upstreams.json` records.
162
162
  */
163
- pin: string;
163
+ readonly pin: string;
164
164
  /**
165
165
  * `current`: nothing to do. `moved`: a PR is due. `unwatched`: upstream moved, but no watched path changed.
166
166
  */
167
- state: 'current' | 'moved' | 'unwatched';
167
+ readonly state: 'current' | 'moved' | 'unwatched';
168
168
  /**
169
169
  * Whether GitHub truncated the compare's file list, so a watched path may be missing from `changedPaths`.
170
170
  */
171
- truncated: boolean;
171
+ readonly truncated: boolean;
172
172
  }
173
173
  interface StepResult {
174
174
  readonly command: string;
@@ -178,8 +178,8 @@ interface StepResult {
178
178
  * The handler and verify runs a PR body reports.
179
179
  */
180
180
  interface StepResults {
181
- handler: StepResult;
182
- verify: null | StepResult;
181
+ readonly handler: StepResult;
182
+ readonly verify: null | StepResult;
183
183
  }
184
184
  /**
185
185
  * Writes the PR body.
@@ -66,7 +66,7 @@ export interface PreprocessPluginOptions {
66
66
  interface DisposeSymbolHost {
67
67
  asyncDispose?: symbol;
68
68
  dispose?: symbol;
69
- for: (key: string) => symbol;
69
+ readonly for: (key: string) => symbol;
70
70
  }
71
71
  /**
72
72
  * Ensures the bundle runs against a `process` global that browser-targeting packages recognize.
@@ -313,4 +313,4 @@ export {
313
313
  makePreprocessBanner,
314
314
  preprocessPlugin
315
315
  };
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSBjdXN0b20gZXNidWlsZCBwbHVnaW4gdGhhdCBwcmVwcm9jZXNzZXMgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBmaWxlcyBmb3IgYW55IGJ1aWxkIHRhcmdldC5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2UgY2Fubm90IHVzZSBgLmAgaW5zdGVhZCBvZiBgKGRvdClgIGluIHRoZSBhYm92ZSBkZXNjcmlwdGlvbiBiZWNhdXNlIHRoZSBmaWxlIGl0c2VsZiBpcyBwcmVwcm9jZXNzZWQgd2l0aCB0aGUgc2FtZSBydWxlLlxuICpcbiAqIGBpbml0Q2pzYCwgYGluaXRFc21gIGFuZCB0aGUgc2hpbXMgdGhleSBjYWxsIGFyZSBzdHJpbmdpZmllZCB3aXRoIGBTdHJpbmcoZm4pYCBhbmQgaW5qZWN0ZWQgaW50byBldmVyeVxuICogYnVpbHQgYnVuZGxlIGFzIGFuIGVzYnVpbGQgYmFubmVyLCBzbyB0aGV5IG11c3QgYmUgcmVhY2hhYmxlIGZyb20gb25lIGFub3RoZXIgYnkgQkFSRSBpZGVudGlmaWVyLiBBbiB1bmJ1bmRsZWRcbiAqIGJ1aWxkIChgYnVuZGxlOiBmYWxzZWAsIG9uZSBvdXRwdXQgcGVyIHNvdXJjZSkgZ2V0cyBubyBiYW5uZXI6IGVhY2ggZW1pdHRlZCBtb2R1bGUgZ2V0cyBhIHByZWFtYmxlIGhvbGRpbmcgb25seSB0aGVcbiAqIHNoaW1zIGl0cyBvd24gY29kZSBuZWVkcywgYW5kIGEgbW9kdWxlIHRoYXQgbmVlZHMgbm9uZSBnZXRzIG5vdGhpbmcuIFRoYXQgaXNcbiAqIHdoeSB0aGV5IGFsbCBsaXZlIGluIHRoaXMgbW9kdWxlOiBlc2J1aWxkIGNvbXBpbGVzIGEgY3Jvc3MtbW9kdWxlIGNhbGwgdG8gYCgwLCBpbXBvcnRfbW9kdWxlLmZuKSjigKYpYCxcbiAqIHdoaWNoIHdvdWxkIG5hbWUgYSBiaW5kaW5nIHRoZSBlbWl0dGVkIGJ1bmRsZSBkb2VzIG5vdCBoYXZlLiBTYW1lLW1vZHVsZSByZWZlcmVuY2VzIHN0YXkgYmFyZSwgYW5kXG4gKiB7QGxpbmsgbWFrZVByZXByb2Nlc3NCYW5uZXJ9IHNlcmlhbGl6ZXMgdGhlIHNoaW1zIGFsb25nc2lkZSB0aGUgYGluaXRgIGZ1bmN0aW9uIHNvIHRoZXkgYXJlIGluIHNjb3BlIHRoZXJlLiBBIHNoaW1cbiAqIHRoYXQgaXMgbm90IHNlcmlhbGl6ZWQgc2lsZW50bHkgZGVncmFkZXMgdG8gd2hhdGV2ZXIgdGhlIGNvbnN1bWVyJ3MgZ2xvYmFsIHNjb3BlIGhvbGRzIHVuZGVyIHRoYXQgbmFtZSDigJQgd2hpY2hcbiAqIGlzIGhvdyBgX19uYW1lYCB1c2VkIHRvIGVuZCB1cCBob2xkaW5nIGB3aW5kb3cubmFtZWAuXG4gKlxuICogQSBjYWxsZXIgdGhhdCBuZWVkcyBtb3JlIGluIHRoZSBiYW5uZXIgKHRoZSBPYnNpZGlhbiBwbHVnaW4gYnVpbGRlciBwYXRjaGVzIGByZXF1aXJlYCkgaGFuZHMgaW5cbiAqIHtAbGluayBQcmVwcm9jZXNzUGx1Z2luT3B0aW9ucy5hZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9uc30uIEVhY2ggb25lIGlzIHNlcmlhbGl6ZWQgYXMgaXRzIE9XTiBpbW1lZGlhdGVseVxuICogaW52b2tlZCBmdW5jdGlvbiBhZnRlciB0aGUgc2hhcmVkIHNjb3BlLCBzbyBpdCBtdXN0IGJlIHNlbGYtY29udGFpbmVkOiBpdCBjYW5ub3Qgc2VlIHRoZSBzaGltcywgYW5kIGNhbGxpbmcgb25lXG4gKiBmcm9tIGFub3RoZXIgbW9kdWxlIHdvdWxkIGhpdCBleGFjdGx5IHRoZSBjcm9zcy1tb2R1bGUgdHJhcCBhYm92ZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHR5cGUge1xuICBPdXRwdXRGaWxlLFxuICBQbHVnaW5cbn0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgdHlwZSB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgdHlwZSB7XG4gIElkZW50aWZpZXIsXG4gIE5vZGVcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7XG4gIEZ1bmN0aW9uSGFuZGxpbmdNb2RlLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBtYWtlVmFsaWRWYXJpYWJsZU5hbWUsXG4gIHJlcGxhY2VBbGxcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcic7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlU291cmNlRmlsZSxcbiAgZm9yRWFjaENoaWxkLFxuICBpc0JpbmRpbmdFbGVtZW50LFxuICBpc0NhbGxFeHByZXNzaW9uLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzRXhwb3J0RGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW1wb3J0Q2xhdXNlLFxuICBpc0ltcG9ydERlY2xhcmF0aW9uLFxuICBpc0ltcG9ydFNwZWNpZmllcixcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNOYW1lc3BhY2VJbXBvcnQsXG4gIGlzUGFyYW1ldGVyLFxuICBpc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbixcbiAgaXNQcm9wZXJ0eUFzc2lnbm1lbnQsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIGlzVmFyaWFibGVEZWNsYXJhdGlvbixcbiAgU2NyaXB0S2luZCxcbiAgU2NyaXB0VGFyZ2V0LFxuICBTeW50YXhLaW5kXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5jb25zdCBESVNQT1NFX1NZTUJPTF9OQU1FUyA9IG5ldyBTZXQoWydhc3luY0Rpc3Bvc2UnLCAnZGlzcG9zZSddKTtcbmNvbnN0IElOTElORV9TT1VSQ0VfTUFQX1BSRUZJWCA9ICcvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCc7XG5jb25zdCBKU19PVVRQVVRfUkVHX0VYUCA9IC9cXC5bY21dP2pzJC87XG4vLyBFc2J1aWxkJ3MgaGVscGVyIGJlaGluZCBhIGxvd2VyZWQgYHVzaW5nYCwgd2hpY2ggbG9va3MgdXAgYFN5bWJvbC5kaXNwb3NlYCBieSBuYW1lLlxuY29uc3QgS05PV05fU1lNQk9MX0hFTFBFUl9OQU1FID0gJ19fa25vd25TeW1ib2wnO1xuLy8gQSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoLCBvciBhIGBub2RlOmAgYnVpbHQtaW46IGFueXRoaW5nIGVsc2UgbmFtZXMgYSBwYWNrYWdlLlxuY29uc3QgTk9OX0JBUkVfU1BFQ0lGSUVSX1JFR19FWFAgPSAvXig/OlxcLnxcXC98bm9kZTopLztcblxuZW51bSBJZGVudGlmaWVyVXNhZ2Uge1xuICBCaW5kaW5nID0gJ2JpbmRpbmcnLFxuICBNZW1iZXIgPSAnbWVtYmVyJyxcbiAgUmVhZCA9ICdyZWFkJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBtYWtlUHJlcHJvY2Vzc0Jhbm5lcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFrZVByZXByb2Nlc3NCYW5uZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNlbGYtY29udGFpbmVkIGZ1bmN0aW9ucyBzZXJpYWxpemVkIGFmdGVyIHRoZSBzaGFyZWQgc2hpbXMsIGVhY2ggaW52b2tlZCBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnM/OiByZWFkb25seSAoKCkgPT4gdm9pZClbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVpbGQgaXMgZm9yIGFuIEVTTSBmb3JtYXQuXG4gICAqL1xuICByZWFkb25seSBpc0VzbT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHByZXByb2Nlc3NQbHVnaW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXByb2Nlc3NQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFNlbGYtY29udGFpbmVkIGZ1bmN0aW9ucyBzZXJpYWxpemVkIGludG8gdGhlIGJhbm5lciBhZnRlciB0aGUgc2hhcmVkIHNoaW1zLCBlYWNoIGludm9rZWQgb25jZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRWFjaCBmdW5jdGlvbiBpcyBlbWl0dGVkIGFzIGAoJHtTdHJpbmcoZm4pfSkoKTtgLCBzbyBpdCBtYXkgcmVmZXJlbmNlIG9ubHkgZ2xvYmFscyBhbmQgd2hhdCBpdCBkZWNsYXJlcyBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9ucz86IHJlYWRvbmx5ICgoKSA9PiB2b2lkKVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZi1jb250YWluZWQgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IHJlcGxhY2VzIGBpbXBvcnQoZG90KW1ldGEoZG90KXVybGAgaW4gYSBDb21tb25KUyBidWlsZC4gU2VyaWFsaXplZCBpbnRvXG4gICAqIGV2ZXJ5IGZpbGUgdGhhdCByZWFkcyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZpbGUgVVJMIG9mIGBfX2ZpbGVuYW1lYCwgb3IgYGxvY2F0aW9uLmhyZWZgIHdoZXJlIHRoZXJlIGlzIG5vIGBfX2ZpbGVuYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IGNqc0ltcG9ydE1ldGFVcmxQcm92aWRlcj86ICgpID0+IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVpbGQgaXMgZm9yIGFuIEVTTSBmb3JtYXQuXG4gICAqL1xuICByZWFkb25seSBpc0VzbT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBZGRNb2R1bGVQcmVhbWJsZXNQYXJhbXMge1xuICByZWFkb25seSBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9uczogcmVhZG9ubHkgKCgpID0+IHZvaWQpW107XG4gIHJlYWRvbmx5IGxlYWRpbmdCYW5uZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0cHV0RmlsZXM6IHJlYWRvbmx5IE91dHB1dEZpbGVbXTtcbn1cblxuLyoqXG4gKiBBIGJyb3dzZXItZmxhdm9yZWQgc3RhbmQtaW4gZm9yIE5vZGUncyBgcHJvY2Vzc2AgZ2xvYmFsLlxuICovXG5pbnRlcmZhY2UgQnJvd3NlclByb2Nlc3MgZXh0ZW5kcyBQYXJ0aWFsPE5vZGVKUy5Qcm9jZXNzPiB7XG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgcHJvY2VzcyBhcyBhIGJyb3dzZXIgb25lLiBUaGUgYnVuZGxlZCBgZGVidWdgIHBhY2thZ2Ugc2VsZWN0cyBpdHMgYnJvd3NlciBlbnRyeSBwb2ludCBvbiBpdC5cbiAgICovXG4gIGJyb3dzZXI6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvciB7QGxpbmsgZW5zdXJlRGlzcG9zZVN5bWJvbHN9IHJlYWRzIGFuZCB3cml0ZXMsIHdpdGggdGhlIHR3byBkaXNwb3NlXG4gKiBzeW1ib2xzIG9wdGlvbmFsIGJlY2F1c2UgYW4gZW5naW5lIHdpdGhvdXQgRXhwbGljaXQgUmVzb3VyY2UgTWFuYWdlbWVudCBkb2VzIG5vdCBoYXZlIHRoZW0uXG4gKi9cbmludGVyZmFjZSBEaXNwb3NlU3ltYm9sSG9zdCB7XG4gIGFzeW5jRGlzcG9zZT86IHN5bWJvbDtcbiAgZGlzcG9zZT86IHN5bWJvbDtcbiAgZm9yOiAoa2V5OiBzdHJpbmcpID0+IHN5bWJvbDtcbn1cblxuaW50ZXJmYWNlIEVzbU1vZHVsZSB7XG4gIF9fZXNNb2R1bGU6IGJvb2xlYW47XG4gIGRlZmF1bHQ6IHVua25vd247XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGEgYnJvd3NlciBnbG9iYWwge0BsaW5rIGdldENqc0ltcG9ydE1ldGFVcmx9IHJlYWRzLCBvcHRpb25hbCBiZWNhdXNlIGEgbm9uLWJyb3dzZXIgaG9zdCBoYXMgbm9uZS5cbiAqL1xuaW50ZXJmYWNlIEluc2VydFByZWFtYmxlUGFyYW1zIHtcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBsZWFkaW5nQmFubmVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByZWFtYmxlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMb2NhdGlvbkhvc3Qge1xuICBsb2NhdGlvbj86IFBhZ2VMb2NhdGlvbjtcbn1cblxuaW50ZXJmYWNlIE1vZHVsZVNoaW1OZWVkcyB7XG4gIHJlYWRvbmx5IGlzQnJvd3NlclByb2Nlc3NOZWVkZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzRGlzcG9zZVN5bWJvbHNOZWVkZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzTmFtZU5lZWRlZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFBhZ2VMb2NhdGlvbiB7XG4gIGhyZWY6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNvdXJjZU1hcFdpdGhNYXBwaW5ncyB7XG4gIG1hcHBpbmdzOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBVcmxNb2R1bGUge1xuICBwYXRoVG9GaWxlVVJMOiB0eXBlb2YgcGF0aFRvRmlsZVVSTDtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBidW5kbGUgcnVucyBhZ2FpbnN0IGEgYHByb2Nlc3NgIGdsb2JhbCB0aGF0IGJyb3dzZXItdGFyZ2V0aW5nIHBhY2thZ2VzIHJlY29nbml6ZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogU2VyaWFsaXplZCBpbnRvIHRoZSBlbWl0dGVkIGJhbm5lciwgc28gaXQgbmV2ZXIgcnVucyBpbiB0aGUgYnVpbGRlciBwcm9jZXNzIOKAlCBidXQgaXQgaXMgYW4gb3JkaW5hcnlcbiAqIGZ1bmN0aW9uIGhlcmUsIHNvIGl0IGlzIHVuaXQtdGVzdGVkIGRpcmVjdGx5IHJhdGhlciB0aGFuIGJ5IGV2YWx1YXRpbmcgdGhlIGJhbm5lciB0ZXh0LlxuICpcbiAqIEZpbGxzIGluIHRoZSBrZXlzIE1JU1NJTkcgZnJvbSBhIGhvc3QtcHJvdmlkZWQgYHByb2Nlc3NgIHJhdGhlciB0aGFuIHJlcGxhY2luZyBvciBza2lwcGluZyBpdC4gT2JzaWRpYW5cbiAqIE1vYmlsZSBleHBvc2VzIGEgcGFydGlhbCBgcHJvY2Vzc2AsIGFuZCB0aGUgd2hvbGUtb2JqZWN0IGd1YXJkcyB0aGlzIHJlcGxhY2VkIChgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcykge1xuICogcmV0dXJuOyB9YCAvIGBnbG9iYWxUaGlzUmVjb3JkWydwcm9jZXNzJ10gPz89IOKApmApIHRvb2sgdGhhdCBhcyBcImFscmVhZHkgc2hpbW1lZFwiLCBzbyBgYnJvd3NlcmAgbmV2ZXJcbiAqIGxhbmRlZC4gVGhlIGJ1bmRsZWQgYGRlYnVnYCBwYWNrYWdlIHRoZW4gc2VsZWN0ZWQgaXRzIE5vZGUgZW50cnkgcG9pbnQsIHdoaWNoIGNhbGxzXG4gKiBgcmVxdWlyZSgndXRpbCcpLmRlcHJlY2F0ZSgpYCBhdCBtb2R1bGUgdG9wIGxldmVsLCBhbmQgb24gbW9iaWxlIHRoZSBwYXRjaGVkIGByZXF1aXJlYCByZXR1cm5zIGB7fWAg4oCUIHNvXG4gKiB0aGUgcGx1Z2luIHRocmV3IGJlZm9yZSBpdHMgYG9ubG9hZGAgcmFuLlxuICpcbiAqIEEgcmVhbCBOb2RlIG9yIEVsZWN0cm9uIGBwcm9jZXNzYCBpcyBsZWZ0IGNvbXBsZXRlbHkgdW50b3VjaGVkLiBgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlYCBpcyB0aGUgc2lnbmFsIGZvclxuICogaXQsIGFuZCBpdCBpcyBzZWxmLWNvbnRhaW5lZCwgc28gaXQgYWxzbyBob2xkcyBpbiB0aGUgTm9kZSBDTEkgYnVuZGxlcyB0aGlzIGJhbm5lciBpcyBlbWl0dGVkIGludG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVCcm93c2VyUHJvY2VzcygpOiB2b2lkIHtcbiAgY29uc3QgYnJvd3NlclByb2Nlc3M6IEdlbmVyaWNPYmplY3Q8QnJvd3NlclByb2Nlc3M+ID0ge1xuICAgIGJyb3dzZXI6IHRydWUsXG4gICAgY3dkKCkge1xuICAgICAgcmV0dXJuICcvJztcbiAgICB9LFxuICAgIGVudjoge30sXG4gICAgcGxhdGZvcm06ICdhbmRyb2lkJ1xuICB9O1xuXG4gIGNvbnN0IGV4aXN0aW5nUHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcyBhcyBQYXJ0aWFsPE5vZGVKUy5Qcm9jZXNzPiB8IHVuZGVmaW5lZDtcblxuICBpZiAoIWV4aXN0aW5nUHJvY2Vzcykge1xuICAgIGdsb2JhbFRoaXMucHJvY2VzcyA9IGJyb3dzZXJQcm9jZXNzIGFzIE5vZGVKUy5Qcm9jZXNzO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChleGlzdGluZ1Byb2Nlc3MudmVyc2lvbnM/Lm5vZGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBleGlzdGluZ1Byb2Nlc3NSZWNvcmQgPSBleGlzdGluZ1Byb2Nlc3MgYXMgR2VuZXJpY09iamVjdDtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhicm93c2VyUHJvY2VzcykpIHtcbiAgICBleGlzdGluZ1Byb2Nlc3NSZWNvcmRba2V5XSA/Pz0gdmFsdWU7XG4gIH1cblxuICBleGlzdGluZ1Byb2Nlc3NSZWNvcmRbJ2Jyb3dzZXInXSA9IHRydWU7XG59XG5cbi8qKlxuICogTWFrZXMgYFN5bWJvbC5kaXNwb3NlYCBhbmQgYFN5bWJvbC5hc3luY0Rpc3Bvc2VgIGV4aXN0LCBmYWxsaW5nIGJhY2sgdG8gdGhlIHJlZ2lzdHJ5IHN5bWJvbHMgZXNidWlsZCdzXG4gKiBgdXNpbmdgIGhlbHBlcnMgbG9vayB1cC5cbiAqXG4gKiBAcGFyYW0gc3ltYm9sQ29uc3RydWN0b3IgLSBUaGUgYFN5bWJvbGAgY29uc3RydWN0b3IgdG8gcGF0Y2guIERlZmF1bHRzIHRvIHRoZSBhbWJpZW50IG9uZTsgdGhlIHBhcmFtZXRlclxuICogZXhpc3RzIHNvIGEgdGVzdCBjYW4gaGFuZCBpbiBhbiBlbmdpbmUgdGhhdCBsYWNrcyB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBTZXJpYWxpemVkIGludG8gdGhlIGVtaXR0ZWQgYmFubmVyLiBBIGRpc3Bvc2FibGUgZGVjbGFyZXMgaXRzIG1ldGhvZCB1bmRlciB0aGUgTElURVJBTCBrZXlcbiAqIGBbU3ltYm9sLmRpc3Bvc2VdYCwgd2hpbGUgZXNidWlsZCBsb3dlcnMgZXZlcnkgYHVzaW5nYCB0byBhIGxvb2t1cCB0aHJvdWdoIGBfX2tub3duU3ltYm9sKCdkaXNwb3NlJylgLFxuICogd2hpY2ggZmFsbHMgYmFjayB0byBgU3ltYm9sLmZvcignU3ltYm9sLmRpc3Bvc2UnKWAgd2hlbiB0aGUgZW5naW5lIGhhcyBubyB3ZWxsLWtub3duIHN5bWJvbC4gT24gc3VjaCBhblxuICogZW5naW5lIHRoZSBsaXRlcmFsIGtleSBldmFsdWF0ZXMgdG8gYHVuZGVmaW5lZGAsIHRoZSBtZXRob2QgbGFuZHMgdW5kZXIgdGhlIHN0cmluZyBgXCJ1bmRlZmluZWRcImAsIGFuZFxuICogZXZlcnkgYHVzaW5nYCBvZiBpdCB0aHJvd3MgYE9iamVjdCBub3QgZGlzcG9zYWJsZWAuIEZpbGxpbmcgdGhlIHdlbGwta25vd24gc2xvdCB3aXRoIHRoYXQgc2FtZSByZWdpc3RyeVxuICogc3ltYm9sIG1ha2VzIGJvdGggc2lkZXMgbmFtZSBvbmUga2V5IG9uIGV2ZXJ5IGVuZ2luZS4gQSBob3N0IHRoYXQgYWxyZWFkeSBoYXMgdGhlIHN5bWJvbCBpcyBsZWZ0XG4gKiB1bnRvdWNoZWQ6IGA/Pz1gIG5ldmVyIHJlYWNoZXMgdGhlIGFzc2lnbm1lbnQsIHdoaWNoIHRoZSBob3N0J3Mgbm9uLXdyaXRhYmxlIHByb3BlcnR5IHdvdWxkIHJlZnVzZS5cbiAqXG4gKiBUaGUgZGVmYXVsdCBuYW1lcyBgU3ltYm9sYCBiYXJlIG9uIHB1cnBvc2U6IGl0IGV4aXN0cyBvbiBldmVyeSBlbmdpbmUgdGhpcyBydW5zIG9uLCBhbmQgYSBiYXJlIHJlZmVyZW5jZVxuICogcmVzb2x2ZXMgYWdhaW5zdCB3aGF0ZXZlciBzY29wZSB0aGUgYmFubmVyIGlzIGV2YWx1YXRlZCBpbiwgZXhhY3RseSBhcyB0aGUgYnVuZGxlJ3Mgb3duXG4gKiBgW1N5bWJvbC5kaXNwb3NlXWAga2V5cyBkby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZURpc3Bvc2VTeW1ib2xzKHN5bWJvbENvbnN0cnVjdG9yOiBEaXNwb3NlU3ltYm9sSG9zdCA9IFN5bWJvbCk6IHZvaWQge1xuICBzeW1ib2xDb25zdHJ1Y3Rvci5hc3luY0Rpc3Bvc2UgPz89IHN5bWJvbENvbnN0cnVjdG9yLmZvcignU3ltYm9sLmFzeW5jRGlzcG9zZScpO1xuICBzeW1ib2xDb25zdHJ1Y3Rvci5kaXNwb3NlID8/PSBzeW1ib2xDb25zdHJ1Y3Rvci5mb3IoJ1N5bWJvbC5kaXNwb3NlJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBpdHMgYXJndW1lbnQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSAkdW5rbm93biAtIFRoZSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgcGFzc2VkIGluLlxuICpcbiAqIEByZW1hcmtzXG4gKiBTZXJpYWxpemVkIGludG8gdGhlIGVtaXR0ZWQgYmFubmVyLCB3aGVyZSBpdCBzdGFuZHMgaW4gZm9yIGVzYnVpbGQncyBgX19uYW1lYCBoZWxwZXIg4oCUIHdoaWNoIG5hbWVzIGFcbiAqIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGl0IOKAlCBmb3IgYnVuZGxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgaGVscGVyIHdpdGhvdXQgZW1pdHRpbmcgdGhlaXIgb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcE5hbWUoJHVua25vd246IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuICR1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgYmFubmVyIGluamVjdGVkIGF0IHRoZSB0b3Agb2YgZXZlcnkgZW1pdHRlZCBidW5kbGUuXG4gKlxuICogYFN0cmluZyhmbilgIGNhcHR1cmVzIG9ubHkgdGhlIGZ1bmN0aW9uJ3Mgb3duIGJvZHksIHNvIGV2ZXJ5IHNoaW0gdGhlIGBpbml0YCBmdW5jdGlvbiBjYWxscyBoYXMgdG8gYmVcbiAqIHNlcmlhbGl6ZWQgbmV4dCB0byBpdCBhbmQgd3JhcHBlZCBpbiBvbmUgc2hhcmVkIHNjb3BlOyBvdGhlcndpc2UgdGhlIGNhbGwgaXQgbWFrZXMgcmVzb2x2ZXMgYWdhaW5zdCB0aGVcbiAqIGNvbnN1bWVyJ3MgZ2xvYmFsIHNjb3BlIGF0IHJ1bnRpbWUuIFNlZSB0aGlzIGZpbGUncyBgQGZpbGVgIHJlbWFya3MuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgYmFubmVyIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgYmFubmVyIHNvdXJjZSB0byBwcmVwZW5kIHRvIHRoZSBlbWl0dGVkIGJ1bmRsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQcmVwcm9jZXNzQmFubmVyKG9wdGlvbnM6IE1ha2VQcmVwcm9jZXNzQmFubmVyT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgY29uc3QgeyBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9ucyA9IFtdLCBpc0VzbSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICBjb25zdCBzaGltcyA9IGlzRXNtID8gW2Vuc3VyZURpc3Bvc2VTeW1ib2xzLCBlbnN1cmVCcm93c2VyUHJvY2Vzc10gOiBbZW5zdXJlRGlzcG9zZVN5bWJvbHMsIGVuc3VyZUJyb3dzZXJQcm9jZXNzLCBrZWVwTmFtZV07XG4gIGNvbnN0IGluaXQgPSBpc0VzbSA/IGluaXRFc20gOiBpbml0Q2pzO1xuICBjb25zdCBhZGRpdGlvbmFsSW5pdHMgPSBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9ucy5tYXAoKGZ1bmN0aW9uXykgPT4gYCgke1N0cmluZyhmdW5jdGlvbl8pfSkoKTtcXG5gKS5qb2luKCcnKTtcbiAgcmV0dXJuIGBcXG4oZnVuY3Rpb24gKCkge1xcbiR7c2hpbXMubWFwKFN0cmluZykuam9pbignXFxuXFxuJyl9XFxuXFxuKCR7U3RyaW5nKGluaXQpfSkoKTtcXG59KSgpO1xcbiR7YWRkaXRpb25hbEluaXRzfWA7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGUgcGx1Z2luJ3Mgc2V0dXAgbmVlZHMgYSBsaXZlIGVzYnVpbGQgY29udGV4dCwgYW5kIHRoZSBmdW5jdGlvbnMgaW4gdGhlIGxhdGVyIGlnbm9yZWQgcmFuZ2VzIGFyZSBzZXJpYWxpemVkIGludG8gdGhlIGVtaXR0ZWQgYmFubmVyIGFuZCBzbyBydW4gaW5zaWRlIHRoZSBidWlsdCBidW5kbGUsIG5ldmVyIGluIHRoaXMgcHJvY2Vzcy4gVGhlIHNoaW1zIGFib3ZlIGFyZSBkZWxpYmVyYXRlbHkgTk9UIGlnbm9yZWQ6IHRoZXkgYXJlIG9yZGluYXJ5IGZ1bmN0aW9ucyBoZXJlIGFuZCBhcmUgdW5pdC10ZXN0ZWQgZGlyZWN0bHksIGFuZCBuZWl0aGVyIGFyZSB0aGUgdW5idW5kbGVkLWJ1aWxkIGhlbHBlcnMsIHdoaWNoIHRoZSB0ZXN0cyBkcml2ZSB0aHJvdWdoIGEgc3R1YiBidWlsZC4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVzYnVpbGQgcGx1Z2luIHRoYXQgcHJlcHJvY2Vzc2VzIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMuXG4gKlxuICogVGhpcyBwbHVnaW4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0YXNrczpcbiAqIC0gUmVwbGFjZXMgaW5zdGFuY2VzIG9mIGBpbXBvcnQoZG90KW1ldGEoZG90KXVybGAgd2l0aCBhIENvbW1vbkpTLWNvbXBhdGlibGUgYF9fZmlsZW5hbWVgIGFsdGVybmF0aXZlLlxuICogLSBNb2RpZmllcyB0aGUgYHNvdXJjZU1hcHBpbmdVUkxgIGNvbW1lbnQgc28gYSB0ZW1wbGF0ZSBsaXRlcmFsIGVuZGluZyBhIGZpbGUgZG9lcyBub3Qgc3dhbGxvdyBpdC5cbiAqIC0gQWRkcyBhIGJhc2ljIGBwcm9jZXNzYCBvYmplY3QgdG8gdGhlIGdsb2JhbCBzY29wZSBpZiBgcHJvY2Vzc2AgaXMgcmVmZXJlbmNlZCBidXQgbm90IGRlZmluZWQuXG4gKiAtIEZpbGxzIGluIGBTeW1ib2wuZGlzcG9zZWAgLyBgU3ltYm9sLmFzeW5jRGlzcG9zZWAgb24gZW5naW5lcyB0aGF0IGxhY2sgdGhlbSwgc28gYHVzaW5nYCB3b3JrcyB0aGVyZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqIEByZXR1cm5zIEFuIGVzYnVpbGQgYFBsdWdpbmAgb2JqZWN0IHRoYXQgaGFuZGxlcyB0aGUgcHJlcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXByb2Nlc3NQbHVnaW4ob3B0aW9uczogUHJlcHJvY2Vzc1BsdWdpbk9wdGlvbnMgPSB7fSk6IFBsdWdpbiB7XG4gIGNvbnN0IHsgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMgPSBbXSwgY2pzSW1wb3J0TWV0YVVybFByb3ZpZGVyID0gZ2V0Q2pzSW1wb3J0TWV0YVVybCwgaXNFc20gPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgcmVwbGFjZW1lbnRzID0gaXNFc21cbiAgICA/IHt9XG4gICAgOiB7XG4gICAgICBbXG4gICAgICAgIHJlcGxhY2VBbGwoe1xuICAgICAgICAgICRzdHJpbmc6ICdpbXBvcnQoZG90KW1ldGEoZG90KXVybCcsXG4gICAgICAgICAgcmVwbGFjZXI6ICcuJyxcbiAgICAgICAgICBzZWFyY2hWYWx1ZTogJyhkb3QpJ1xuICAgICAgICB9KVxuICAgICAgXTogY2pzSW1wb3J0TWV0YVVybFByb3ZpZGVyXG4gICAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdwcmVwcm9jZXNzJyxcbiAgICBzZXR1cChidWlsZCk6IHZvaWQge1xuICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMuZGVmaW5lID8/PSB7fTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVwbGFjZW1lbnRzKSkge1xuICAgICAgICBidWlsZC5pbml0aWFsT3B0aW9ucy5kZWZpbmVba2V5XSA9IGBfXyR7bWFrZVZhbGlkVmFyaWFibGVOYW1lKGtleSl9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1aWxkLmluaXRpYWxPcHRpb25zLmJ1bmRsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgLy8gT25lIG91dHB1dCBwZXIgc291cmNlOiBlYWNoIG1vZHVsZSBnZXRzIG9ubHkgdGhlIHNoaW1zIGl0cyBvd24gY29kZSBuZWVkcywgc28gYSBwYWdlIGltcG9ydGluZyBhIHB1cmVcbiAgICAgICAgLy8gbW9kdWxlIG9mIGEgbGlicmFyeSBpcyBsZWZ0IHdpdGggaXRzIGdsb2JhbHMgdW50b3VjaGVkLlxuICAgICAgICBjb25zdCBsZWFkaW5nQmFubmVyID0gYnVpbGQuaW5pdGlhbE9wdGlvbnMuYmFubmVyPy5bJ2pzJ10gPz8gJyc7XG4gICAgICAgIGJ1aWxkLm9uRW5kKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBhZGRNb2R1bGVQcmVhbWJsZXMoeyBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9ucywgbGVhZGluZ0Jhbm5lciwgb3V0cHV0RmlsZXM6IHJlc3VsdC5vdXRwdXRGaWxlcyA/PyBbXSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWlsZC5pbml0aWFsT3B0aW9ucy5iYW5uZXIgPz89IHt9O1xuICAgICAgICBidWlsZC5pbml0aWFsT3B0aW9ucy5iYW5uZXJbJ2pzJ10gPz89ICcnO1xuICAgICAgICBidWlsZC5pbml0aWFsT3B0aW9ucy5iYW5uZXJbJ2pzJ10gKz0gbWFrZVByZXByb2Nlc3NCYW5uZXIoeyBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9ucywgaXNFc20gfSk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogL1xcLig/OmpzfHRzfGNqc3xtanN8Y3RzfG10cykkLyB9LCBhc3luYyAoJGFyZ3VtZW50cykgPT4ge1xuICAgICAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkRmlsZSgkYXJndW1lbnRzLnBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcGxhY2VtZW50cykpIHtcbiAgICAgICAgICBjb25zdCB2YXJpYWJsZSA9IGBfXyR7bWFrZVZhbGlkVmFyaWFibGVOYW1lKGtleSl9YDtcbiAgICAgICAgICBpZiAoIWNvbnRlbnRzLmluY2x1ZGVzKGtleSkgfHwgY29udGVudHMuaW5jbHVkZXMoYHZhciAke3ZhcmlhYmxlfWApKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdmFsdWVTdHJpbmcgPSB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyBgKCR7U3RyaW5nKHZhbHVlKX0pKClgIDogdG9Kc29uKHZhbHVlLCB7IGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZS5GdWxsIH0pO1xuICAgICAgICAgIGNvbnRlbnRzID0gYHZhciAke3ZhcmlhYmxlfSA9IGdsb2JhbFRoaXNbJyR7a2V5fSddID8/ICR7dmFsdWVTdHJpbmd9O1xcbiR7Y29udGVudHN9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhBQ0s6IFRoZSAkeycnfSBwYXJ0IGlzIHVzZWQgdG8gZW5zdXJlIE9ic2lkaWFuIGxvYWRzIHRoZSBwbHVnaW4gcHJvcGVybHksXG4gICAgICAgIC8vIE90aGVyd2lzZSwgaXQgc3RvcHMgbG9hZGluZyBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc291cmNlTWFwcGluZ1VSTCBjb21tZW50LlxuXG4gICAgICAgIGNvbnRlbnRzID0gcmVwbGFjZUFsbCh7XG4gICAgICAgICAgJHN0cmluZzogY29udGVudHMsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAtLSBJdCBpcyBpbnRlbnRpb25hbCwgdGhlIHN0cmluZyBsb29rcyBsaWtlIGEgdGVtcGxhdGUgbGl0ZXJhbCwgYnV0IGl0IGlzIG5vdC5cbiAgICAgICAgICByZXBsYWNlcjogJ2BcXG4vLyMke1xcJ1xcJ30gc291cmNlTWFwcGluZ1VSTCcsXG4gICAgICAgICAgc2VhcmNoVmFsdWU6IC9gXFxyP1xcblxcL1xcLyMgc291cmNlTWFwcGluZ1VSTC9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudHMsXG4gICAgICAgICAgbG9hZGVyOiAndHMnXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qKlxuICogUHJlcGVuZHMgdG8gZWFjaCBlbWl0dGVkIG1vZHVsZSB0aGUgcHJlYW1ibGUgaXRzIG93biBjb2RlIG5lZWRzLCBhbmQgbm90aGluZyB3aGVuIGl0IG5lZWRzIG5vbmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbWl0dGVkIG1vZHVsZXMsIHRoZSBiYW5uZXIgdGhlIGNhbGxlciBhbHJlYWR5IHB1dCBmaXJzdCwgYW5kIHRoZSBjYWxsZXIncyBleHRyYSBpbml0cy5cbiAqL1xuZnVuY3Rpb24gYWRkTW9kdWxlUHJlYW1ibGVzKHBhcmFtczogQWRkTW9kdWxlUHJlYW1ibGVzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMsIGxlYWRpbmdCYW5uZXIsIG91dHB1dEZpbGVzIH0gPSBwYXJhbXM7XG4gIGZvciAoY29uc3Qgb3V0cHV0RmlsZSBvZiBvdXRwdXRGaWxlcykge1xuICAgIGlmICghSlNfT1VUUFVUX1JFR19FWFAudGVzdChvdXRwdXRGaWxlLnBhdGgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2RlID0gb3V0cHV0RmlsZS50ZXh0O1xuICAgIGNvbnN0IHByZWFtYmxlID0gbWFrZU1vZHVsZVByZWFtYmxlKGdldE1vZHVsZVNoaW1OZWVkcyhjb2RlKSwgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMpO1xuICAgIGlmIChwcmVhbWJsZSA9PT0gJycpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG91dHB1dEZpbGUuY29udGVudHMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoaW5zZXJ0UHJlYW1ibGUoeyBjb2RlLCBsZWFkaW5nQmFubmVyLCBwcmVhbWJsZSB9KSk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFNlcmlhbGl6ZWQgaW50byB0aGUgZW1pdHRlZCBtb2R1bGUsIHNlZSBhYm92ZS4gKi9cbmZ1bmN0aW9uIGdldENqc0ltcG9ydE1ldGFVcmwoKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGxvY2FsUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgY29uc3QgdXJsID0gbG9jYWxSZXF1aXJlKCdub2RlOnVybCcpIGFzIFVybE1vZHVsZTtcbiAgICBpZiAodHlwZW9mIHVybC5wYXRoVG9GaWxlVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdXJsLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZjtcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB0aGUgcGFnZSBVUkwsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgdW5rbm93bi5cbiAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIExvY2F0aW9uSG9zdCkubG9jYXRpb24/LmhyZWYgPz8gJyc7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG5mdW5jdGlvbiBnZXRJZGVudGlmaWVyVXNhZ2Uobm9kZTogSWRlbnRpZmllcik6IElkZW50aWZpZXJVc2FnZSB7XG4gIGNvbnN0IHsgcGFyZW50IH0gPSBub2RlO1xuICBpZiAoXG4gICAgKGlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKHBhcmVudCkgfHwgaXNQcm9wZXJ0eUFzc2lnbm1lbnQocGFyZW50KSB8fCBpc01ldGhvZERlY2xhcmF0aW9uKHBhcmVudCkgfHwgaXNQcm9wZXJ0eURlY2xhcmF0aW9uKHBhcmVudClcbiAgICAgIHx8IGlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihwYXJlbnQpIHx8IGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihwYXJlbnQpKVxuICAgICYmIHBhcmVudC5uYW1lID09PSBub2RlXG4gICkge1xuICAgIHJldHVybiBJZGVudGlmaWVyVXNhZ2UuTWVtYmVyO1xuICB9XG5cbiAgcmV0dXJuIChpc1ZhcmlhYmxlRGVjbGFyYXRpb24ocGFyZW50KSB8fCBpc0Z1bmN0aW9uRGVjbGFyYXRpb24ocGFyZW50KSB8fCBpc0NsYXNzRGVjbGFyYXRpb24ocGFyZW50KSB8fCBpc1BhcmFtZXRlcihwYXJlbnQpIHx8IGlzQmluZGluZ0VsZW1lbnQocGFyZW50KVxuICAgICAgfHwgaXNJbXBvcnRDbGF1c2UocGFyZW50KSB8fCBpc0ltcG9ydFNwZWNpZmllcihwYXJlbnQpIHx8IGlzTmFtZXNwYWNlSW1wb3J0KHBhcmVudCkpXG4gICAgICAmJiBwYXJlbnQubmFtZSA9PT0gbm9kZVxuICAgID8gSWRlbnRpZmllclVzYWdlLkJpbmRpbmdcbiAgICA6IElkZW50aWZpZXJVc2FnZS5SZWFkO1xufVxuXG4vKipcbiAqIFJlYWRzIHdoaWNoIHNoaW1zIGFuIGVtaXR0ZWQgbW9kdWxlIG5lZWRzIGZyb20gaXRzIGNvZGUuXG4gKlxuICogLSBgZW5zdXJlQnJvd3NlclByb2Nlc3NgOiBpdCByZWFkcyBhIGBwcm9jZXNzYCBpdCBkb2VzIG5vdCBiaW5kIGl0c2VsZiwgb3IgaXQgbG9hZHMgYSBiYXJlIHBhY2thZ2UgdGhhdCBpcyBub3QgYVxuICogICBgbm9kZTpgIGJ1aWx0LWluLiBUaGUgc2Vjb25kIGNhc2UgaXMgdGhlcmUgYmVjYXVzZSBzdWNoIGEgcGFja2FnZSAoYHBhdGgtYnJvd3NlcmlmeWAgcmVhZHMgYHByb2Nlc3MuY3dkKClgKSBjYW5ub3RcbiAqICAgY2FycnkgYSBzaGltIG9mIGl0cyBvd24sIGFuZCBpbiBhbiB1bmJ1bmRsZWQgYnVpbGQgaXRzIGltcG9ydGVyIGlzIHRoZSBvbmx5IG1vZHVsZSB0aGF0IGNhbi5cbiAqIC0gYGVuc3VyZURpc3Bvc2VTeW1ib2xzYDogaXQgbmFtZXMgYFN5bWJvbC5kaXNwb3NlYCBvciBgU3ltYm9sLmFzeW5jRGlzcG9zZWAsIG9yIGhvbGRzIGVzYnVpbGQncyBgX19rbm93blN5bWJvbGBcbiAqICAgaGVscGVyLCB3aGljaCBhIGxvd2VyZWQgYHVzaW5nYCBlbWl0cy5cbiAqIC0gYF9fbmFtZWA6IGl0IHJlYWRzIGEgYF9fbmFtZWAgaXQgZG9lcyBub3QgZGVjbGFyZS5cbiAqXG4gKiBAcGFyYW0gY29kZSAtIFRoZSBlbWl0dGVkIG1vZHVsZS5cbiAqIEByZXR1cm5zIFdoYXQgdGhlIG1vZHVsZSBuZWVkcy5cbiAqL1xuZnVuY3Rpb24gZ2V0TW9kdWxlU2hpbU5lZWRzKGNvZGU6IHN0cmluZyk6IE1vZHVsZVNoaW1OZWVkcyB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBjcmVhdGVTb3VyY2VGaWxlKCdtb2R1bGUuanMnLCBjb2RlLCBTY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCBTY3JpcHRLaW5kLkpTKTtcbiAgY29uc3QgYm91bmROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCByZWFkTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGlzQmFyZUltcG9ydEZvdW5kID0gZmFsc2U7XG4gIGxldCBpc0Rpc3Bvc2VTeW1ib2xGb3VuZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBzcGVjaWZpZXIgPSBnZXRNb2R1bGVTcGVjaWZpZXIobm9kZSk7XG4gICAgaWYgKHNwZWNpZmllciAhPT0gdW5kZWZpbmVkICYmICFOT05fQkFSRV9TUEVDSUZJRVJfUkVHX0VYUC50ZXN0KHNwZWNpZmllcikpIHtcbiAgICAgIGlzQmFyZUltcG9ydEZvdW5kID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBpc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlKSAmJiBpc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSAmJiBub2RlLmV4cHJlc3Npb24udGV4dCA9PT0gJ1N5bWJvbCdcbiAgICAgICYmIERJU1BPU0VfU1lNQk9MX05BTUVTLmhhcyhub2RlLm5hbWUudGV4dClcbiAgICApIHtcbiAgICAgIGlzRGlzcG9zZVN5bWJvbEZvdW5kID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICBpZiAobm9kZS50ZXh0ID09PSBLTk9XTl9TWU1CT0xfSEVMUEVSX05BTUUpIHtcbiAgICAgICAgaXNEaXNwb3NlU3ltYm9sRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2FnZSA9IGdldElkZW50aWZpZXJVc2FnZShub2RlKTtcbiAgICAgIGlmICh1c2FnZSA9PT0gSWRlbnRpZmllclVzYWdlLkJpbmRpbmcpIHtcbiAgICAgICAgYm91bmROYW1lcy5hZGQobm9kZS50ZXh0KTtcbiAgICAgIH0gZWxzZSBpZiAodXNhZ2UgPT09IElkZW50aWZpZXJVc2FnZS5SZWFkKSB7XG4gICAgICAgIHJlYWROYW1lcy5hZGQobm9kZS50ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICB9XG4gIHZpc2l0KHNvdXJjZUZpbGUpO1xuXG4gIGZ1bmN0aW9uIGlzRnJlZVJlYWQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlYWROYW1lcy5oYXMobmFtZSkgJiYgIWJvdW5kTmFtZXMuaGFzKG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpc0Jyb3dzZXJQcm9jZXNzTmVlZGVkOiBpc0ZyZWVSZWFkKCdwcm9jZXNzJykgfHwgaXNCYXJlSW1wb3J0Rm91bmQsXG4gICAgaXNEaXNwb3NlU3ltYm9sc05lZWRlZDogaXNEaXNwb3NlU3ltYm9sRm91bmQsXG4gICAgaXNOYW1lTmVlZGVkOiBpc0ZyZWVSZWFkKCdfX25hbWUnKVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRNb2R1bGVTcGVjaWZpZXIobm9kZTogTm9kZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICgoaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSB8fCBpc0V4cG9ydERlY2xhcmF0aW9uKG5vZGUpKSAmJiBub2RlLm1vZHVsZVNwZWNpZmllciAhPT0gdW5kZWZpbmVkICYmIGlzU3RyaW5nTGl0ZXJhbChub2RlLm1vZHVsZVNwZWNpZmllcikpIHtcbiAgICByZXR1cm4gbm9kZS5tb2R1bGVTcGVjaWZpZXIudGV4dDtcbiAgfVxuXG4gIGlmIChpc0NhbGxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgY29uc3QgW2ZpcnN0QXJndW1lbnRdID0gbm9kZS5hcmd1bWVudHM7XG4gICAgY29uc3QgaXNMb2FkZXIgPSBub2RlLmV4cHJlc3Npb24ua2luZCA9PT0gU3ludGF4S2luZC5JbXBvcnRLZXl3b3JkIHx8IChpc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSAmJiBub2RlLmV4cHJlc3Npb24udGV4dCA9PT0gJ3JlcXVpcmUnKTtcbiAgICBpZiAoaXNMb2FkZXIgJiYgZmlyc3RBcmd1bWVudCAhPT0gdW5kZWZpbmVkICYmIGlzU3RyaW5nTGl0ZXJhbChmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgcmV0dXJuIGZpcnN0QXJndW1lbnQudGV4dDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCBpbnRvIHRoZSBlbWl0dGVkIGJhbm5lciwgc2VlIGFib3ZlLiAqL1xuZnVuY3Rpb24gaW5pdENqcygpOiB2b2lkIHtcbiAgY29uc3QgZ2xvYmFsVGhpc1JlY29yZCA9IGdsb2JhbFRoaXMgYXMgR2VuZXJpY09iamVjdDtcbiAgZW5zdXJlRGlzcG9zZVN5bWJvbHMoKTtcbiAgZ2xvYmFsVGhpc1JlY29yZFsnX19uYW1lJ10gPz89IGtlZXBOYW1lO1xuICBnbG9iYWxUaGlzUmVjb3JkWydfX2V4dHJhY3REZWZhdWx0J10gPz89IGV4dHJhY3REZWZhdWx0O1xuXG4gIGVuc3VyZUJyb3dzZXJQcm9jZXNzKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIFNlcmlhbGl6ZWQgd2l0aCBpbml0Q2pzIGludG8gdGhlIGJhbm5lcjsgYXQgbW9kdWxlIHNjb3BlIGl0IHdvdWxkIGJlIGxlZnQgb3V0IG9mIGl0LlxuICBmdW5jdGlvbiBleHRyYWN0RGVmYXVsdChtb2R1bGU6IFBhcnRpYWw8RXNtTW9kdWxlPiB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICAgIHJldHVybiBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgJiYgJ2RlZmF1bHQnIGluIG1vZHVsZSA/IG1vZHVsZS5kZWZhdWx0IDogbW9kdWxlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRFc20oKTogdm9pZCB7XG4gIGVuc3VyZURpc3Bvc2VTeW1ib2xzKCk7XG4gIGVuc3VyZUJyb3dzZXJQcm9jZXNzKCk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIEluc2VydHMgdGhlIHByZWFtYmxlIGFmdGVyIHRoZSBjYWxsZXIncyBsZWFkaW5nIGJhbm5lciwgYW5kIHNoaWZ0cyBhbiBpbmxpbmUgc291cmNlIG1hcCBkb3duIGJ5IHRoZSBsaW5lcyBpdCBhZGRzLFxuICogc28gdGhlIG1vZHVsZSdzIG93biBsaW5lcyBrZWVwIG1hcHBpbmcgb250byB0aGVpciBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgbW9kdWxlLCBpdHMgbGVhZGluZyBiYW5uZXIgYW5kIHRoZSBwcmVhbWJsZS5cbiAqIEByZXR1cm5zIFRoZSBtb2R1bGUgd2l0aCB0aGUgcHJlYW1ibGUgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydFByZWFtYmxlKHBhcmFtczogSW5zZXJ0UHJlYW1ibGVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGNvZGUsIGxlYWRpbmdCYW5uZXIsIHByZWFtYmxlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGluc2VydEF0ID0gbGVhZGluZ0Jhbm5lci5lbmRzV2l0aCgnXFxuJykgJiYgY29kZS5zdGFydHNXaXRoKGxlYWRpbmdCYW5uZXIpID8gbGVhZGluZ0Jhbm5lci5sZW5ndGggOiAwO1xuICBjb25zdCBhZGRlZExpbmVDb3VudCA9IHByZWFtYmxlLnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuICBsZXQgc2hpZnRlZENvZGUgPSBjb2RlO1xuICBjb25zdCBzb3VyY2VNYXBTdGFydCA9IGNvZGUubGFzdEluZGV4T2YoSU5MSU5FX1NPVVJDRV9NQVBfUFJFRklYKTtcbiAgaWYgKHNvdXJjZU1hcFN0YXJ0ICE9PSAtMSkge1xuICAgIGNvbnN0IGRhdGFTdGFydCA9IHNvdXJjZU1hcFN0YXJ0ICsgSU5MSU5FX1NPVVJDRV9NQVBfUFJFRklYLmxlbmd0aDtcbiAgICBjb25zdCBkYXRhID0gY29kZS5zbGljZShkYXRhU3RhcnQpLnRyaW1FbmQoKTtcbiAgICBjb25zdCBzb3VyY2VNYXAgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKSkgYXMgU291cmNlTWFwV2l0aE1hcHBpbmdzO1xuICAgIHNvdXJjZU1hcC5tYXBwaW5ncyA9ICc7Jy5yZXBlYXQoYWRkZWRMaW5lQ291bnQpICsgc291cmNlTWFwLm1hcHBpbmdzO1xuICAgIHNoaWZ0ZWRDb2RlID0gY29kZS5zbGljZSgwLCBkYXRhU3RhcnQpICsgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSwgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NCcpICsgY29kZS5zbGljZShkYXRhU3RhcnQgKyBkYXRhLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIHNoaWZ0ZWRDb2RlLnNsaWNlKDAsIGluc2VydEF0KSArIHByZWFtYmxlICsgc2hpZnRlZENvZGUuc2xpY2UoaW5zZXJ0QXQpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcHJlYW1ibGUgb2Ygb25lIHVuYnVuZGxlZCBtb2R1bGU6IHRoZSBzaGltcyBpdCBuZWVkcyBpbiBvbmUgc2hhcmVkIHNjb3BlLCB0aGVuIHRoZSBjYWxsZXIncyBleHRyYSBpbml0cy5cbiAqXG4gKiBAcGFyYW0gbmVlZHMgLSBXaGF0IHRoZSBtb2R1bGUgbmVlZHMuXG4gKiBAcGFyYW0gYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMgLSBUaGUgY2FsbGVyJ3MgZXh0cmEgaW5pdHMsIHdoaWNoIGV2ZXJ5IG1vZHVsZSBnZXRzLlxuICogQHJldHVybnMgVGhlIHByZWFtYmxlLCBlbXB0eSB3aGVuIHRoZSBtb2R1bGUgbmVlZHMgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gbWFrZU1vZHVsZVByZWFtYmxlKG5lZWRzOiBNb2R1bGVTaGltTmVlZHMsIGFkZGl0aW9uYWxCYW5uZXJJbml0RnVuY3Rpb25zOiByZWFkb25seSAoKCkgPT4gdm9pZClbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHNoaW1zOiAoKC4uLmFyZ3VtZW50c186IG5ldmVyW10pID0+IHVua25vd24pW10gPSBbXTtcbiAgY29uc3QgY2FsbHM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKG5lZWRzLmlzRGlzcG9zZVN5bWJvbHNOZWVkZWQpIHtcbiAgICBzaGltcy5wdXNoKGVuc3VyZURpc3Bvc2VTeW1ib2xzKTtcbiAgICBjYWxscy5wdXNoKCdlbnN1cmVEaXNwb3NlU3ltYm9scygpOycpO1xuICB9XG5cbiAgaWYgKG5lZWRzLmlzQnJvd3NlclByb2Nlc3NOZWVkZWQpIHtcbiAgICBzaGltcy5wdXNoKGVuc3VyZUJyb3dzZXJQcm9jZXNzKTtcbiAgICBjYWxscy5wdXNoKCdlbnN1cmVCcm93c2VyUHJvY2VzcygpOycpO1xuICB9XG5cbiAgaWYgKG5lZWRzLmlzTmFtZU5lZWRlZCkge1xuICAgIHNoaW1zLnB1c2goa2VlcE5hbWUpO1xuICAgIGNhbGxzLnB1c2goJ2dsb2JhbFRoaXNbXFwnX19uYW1lXFwnXSA/Pz0ga2VlcE5hbWU7Jyk7XG4gIH1cblxuICBjb25zdCBzaGFyZWRTY29wZSA9IHNoaW1zLmxlbmd0aCA9PT0gMCA/ICcnIDogYChmdW5jdGlvbiAoKSB7XFxuJHtzaGltcy5tYXAoU3RyaW5nKS5qb2luKCdcXG5cXG4nKX1cXG5cXG4ke2NhbGxzLmpvaW4oJ1xcbicpfVxcbn0pKCk7XFxuYDtcbiAgcmV0dXJuIHNoYXJlZFNjb3BlICsgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMubWFwKChmdW5jdGlvbl8pID0+IGAoJHtTdHJpbmcoZnVuY3Rpb25fKX0pKCk7XFxuYCkuam9pbignJyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUNBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkIsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVB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
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSBjdXN0b20gZXNidWlsZCBwbHVnaW4gdGhhdCBwcmVwcm9jZXNzZXMgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBmaWxlcyBmb3IgYW55IGJ1aWxkIHRhcmdldC5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2UgY2Fubm90IHVzZSBgLmAgaW5zdGVhZCBvZiBgKGRvdClgIGluIHRoZSBhYm92ZSBkZXNjcmlwdGlvbiBiZWNhdXNlIHRoZSBmaWxlIGl0c2VsZiBpcyBwcmVwcm9jZXNzZWQgd2l0aCB0aGUgc2FtZSBydWxlLlxuICpcbiAqIGBpbml0Q2pzYCwgYGluaXRFc21gIGFuZCB0aGUgc2hpbXMgdGhleSBjYWxsIGFyZSBzdHJpbmdpZmllZCB3aXRoIGBTdHJpbmcoZm4pYCBhbmQgaW5qZWN0ZWQgaW50byBldmVyeVxuICogYnVpbHQgYnVuZGxlIGFzIGFuIGVzYnVpbGQgYmFubmVyLCBzbyB0aGV5IG11c3QgYmUgcmVhY2hhYmxlIGZyb20gb25lIGFub3RoZXIgYnkgQkFSRSBpZGVudGlmaWVyLiBBbiB1bmJ1bmRsZWRcbiAqIGJ1aWxkIChgYnVuZGxlOiBmYWxzZWAsIG9uZSBvdXRwdXQgcGVyIHNvdXJjZSkgZ2V0cyBubyBiYW5uZXI6IGVhY2ggZW1pdHRlZCBtb2R1bGUgZ2V0cyBhIHByZWFtYmxlIGhvbGRpbmcgb25seSB0aGVcbiAqIHNoaW1zIGl0cyBvd24gY29kZSBuZWVkcywgYW5kIGEgbW9kdWxlIHRoYXQgbmVlZHMgbm9uZSBnZXRzIG5vdGhpbmcuIFRoYXQgaXNcbiAqIHdoeSB0aGV5IGFsbCBsaXZlIGluIHRoaXMgbW9kdWxlOiBlc2J1aWxkIGNvbXBpbGVzIGEgY3Jvc3MtbW9kdWxlIGNhbGwgdG8gYCgwLCBpbXBvcnRfbW9kdWxlLmZuKSjigKYpYCxcbiAqIHdoaWNoIHdvdWxkIG5hbWUgYSBiaW5kaW5nIHRoZSBlbWl0dGVkIGJ1bmRsZSBkb2VzIG5vdCBoYXZlLiBTYW1lLW1vZHVsZSByZWZlcmVuY2VzIHN0YXkgYmFyZSwgYW5kXG4gKiB7QGxpbmsgbWFrZVByZXByb2Nlc3NCYW5uZXJ9IHNlcmlhbGl6ZXMgdGhlIHNoaW1zIGFsb25nc2lkZSB0aGUgYGluaXRgIGZ1bmN0aW9uIHNvIHRoZXkgYXJlIGluIHNjb3BlIHRoZXJlLiBBIHNoaW1cbiAqIHRoYXQgaXMgbm90IHNlcmlhbGl6ZWQgc2lsZW50bHkgZGVncmFkZXMgdG8gd2hhdGV2ZXIgdGhlIGNvbnN1bWVyJ3MgZ2xvYmFsIHNjb3BlIGhvbGRzIHVuZGVyIHRoYXQgbmFtZSDigJQgd2hpY2hcbiAqIGlzIGhvdyBgX19uYW1lYCB1c2VkIHRvIGVuZCB1cCBob2xkaW5nIGB3aW5kb3cubmFtZWAuXG4gKlxuICogQSBjYWxsZXIgdGhhdCBuZWVkcyBtb3JlIGluIHRoZSBiYW5uZXIgKHRoZSBPYnNpZGlhbiBwbHVnaW4gYnVpbGRlciBwYXRjaGVzIGByZXF1aXJlYCkgaGFuZHMgaW5cbiAqIHtAbGluayBQcmVwcm9jZXNzUGx1Z2luT3B0aW9ucy5hZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9uc30uIEVhY2ggb25lIGlzIHNlcmlhbGl6ZWQgYXMgaXRzIE9XTiBpbW1lZGlhdGVseVxuICogaW52b2tlZCBmdW5jdGlvbiBhZnRlciB0aGUgc2hhcmVkIHNjb3BlLCBzbyBpdCBtdXN0IGJlIHNlbGYtY29udGFpbmVkOiBpdCBjYW5ub3Qgc2VlIHRoZSBzaGltcywgYW5kIGNhbGxpbmcgb25lXG4gKiBmcm9tIGFub3RoZXIgbW9kdWxlIHdvdWxkIGhpdCBleGFjdGx5IHRoZSBjcm9zcy1tb2R1bGUgdHJhcCBhYm92ZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHR5cGUge1xuICBPdXRwdXRGaWxlLFxuICBQbHVnaW5cbn0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgdHlwZSB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgdHlwZSB7XG4gIElkZW50aWZpZXIsXG4gIE5vZGVcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7XG4gIEZ1bmN0aW9uSGFuZGxpbmdNb2RlLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBtYWtlVmFsaWRWYXJpYWJsZU5hbWUsXG4gIHJlcGxhY2VBbGxcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcic7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlU291cmNlRmlsZSxcbiAgZm9yRWFjaENoaWxkLFxuICBpc0JpbmRpbmdFbGVtZW50LFxuICBpc0NhbGxFeHByZXNzaW9uLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzRXhwb3J0RGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW1wb3J0Q2xhdXNlLFxuICBpc0ltcG9ydERlY2xhcmF0aW9uLFxuICBpc0ltcG9ydFNwZWNpZmllcixcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNOYW1lc3BhY2VJbXBvcnQsXG4gIGlzUGFyYW1ldGVyLFxuICBpc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbixcbiAgaXNQcm9wZXJ0eUFzc2lnbm1lbnQsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIGlzVmFyaWFibGVEZWNsYXJhdGlvbixcbiAgU2NyaXB0S2luZCxcbiAgU2NyaXB0VGFyZ2V0LFxuICBTeW50YXhLaW5kXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5jb25zdCBESVNQT1NFX1NZTUJPTF9OQU1FUyA9IG5ldyBTZXQoWydhc3luY0Rpc3Bvc2UnLCAnZGlzcG9zZSddKTtcbmNvbnN0IElOTElORV9TT1VSQ0VfTUFQX1BSRUZJWCA9ICcvLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCc7XG5jb25zdCBKU19PVVRQVVRfUkVHX0VYUCA9IC9cXC5bY21dP2pzJC87XG4vLyBFc2J1aWxkJ3MgaGVscGVyIGJlaGluZCBhIGxvd2VyZWQgYHVzaW5nYCwgd2hpY2ggbG9va3MgdXAgYFN5bWJvbC5kaXNwb3NlYCBieSBuYW1lLlxuY29uc3QgS05PV05fU1lNQk9MX0hFTFBFUl9OQU1FID0gJ19fa25vd25TeW1ib2wnO1xuLy8gQSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoLCBvciBhIGBub2RlOmAgYnVpbHQtaW46IGFueXRoaW5nIGVsc2UgbmFtZXMgYSBwYWNrYWdlLlxuY29uc3QgTk9OX0JBUkVfU1BFQ0lGSUVSX1JFR19FWFAgPSAvXig/OlxcLnxcXC98bm9kZTopLztcblxuZW51bSBJZGVudGlmaWVyVXNhZ2Uge1xuICBCaW5kaW5nID0gJ2JpbmRpbmcnLFxuICBNZW1iZXIgPSAnbWVtYmVyJyxcbiAgUmVhZCA9ICdyZWFkJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBtYWtlUHJlcHJvY2Vzc0Jhbm5lcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFrZVByZXByb2Nlc3NCYW5uZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNlbGYtY29udGFpbmVkIGZ1bmN0aW9ucyBzZXJpYWxpemVkIGFmdGVyIHRoZSBzaGFyZWQgc2hpbXMsIGVhY2ggaW52b2tlZCBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnM/OiByZWFkb25seSAoKCkgPT4gdm9pZClbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVpbGQgaXMgZm9yIGFuIEVTTSBmb3JtYXQuXG4gICAqL1xuICByZWFkb25seSBpc0VzbT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHByZXByb2Nlc3NQbHVnaW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXByb2Nlc3NQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIFNlbGYtY29udGFpbmVkIGZ1bmN0aW9ucyBzZXJpYWxpemVkIGludG8gdGhlIGJhbm5lciBhZnRlciB0aGUgc2hhcmVkIHNoaW1zLCBlYWNoIGludm9rZWQgb25jZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRWFjaCBmdW5jdGlvbiBpcyBlbWl0dGVkIGFzIGAoJHtTdHJpbmcoZm4pfSkoKTtgLCBzbyBpdCBtYXkgcmVmZXJlbmNlIG9ubHkgZ2xvYmFscyBhbmQgd2hhdCBpdCBkZWNsYXJlcyBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9ucz86IHJlYWRvbmx5ICgoKSA9PiB2b2lkKVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZi1jb250YWluZWQgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IHJlcGxhY2VzIGBpbXBvcnQoZG90KW1ldGEoZG90KXVybGAgaW4gYSBDb21tb25KUyBidWlsZC4gU2VyaWFsaXplZCBpbnRvXG4gICAqIGV2ZXJ5IGZpbGUgdGhhdCByZWFkcyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZpbGUgVVJMIG9mIGBfX2ZpbGVuYW1lYCwgb3IgYGxvY2F0aW9uLmhyZWZgIHdoZXJlIHRoZXJlIGlzIG5vIGBfX2ZpbGVuYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IGNqc0ltcG9ydE1ldGFVcmxQcm92aWRlcj86ICgpID0+IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnVpbGQgaXMgZm9yIGFuIEVTTSBmb3JtYXQuXG4gICAqL1xuICByZWFkb25seSBpc0VzbT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBZGRNb2R1bGVQcmVhbWJsZXNQYXJhbXMge1xuICByZWFkb25seSBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9uczogcmVhZG9ubHkgKCgpID0+IHZvaWQpW107XG4gIHJlYWRvbmx5IGxlYWRpbmdCYW5uZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0cHV0RmlsZXM6IHJlYWRvbmx5IE91dHB1dEZpbGVbXTtcbn1cblxuLyoqXG4gKiBBIGJyb3dzZXItZmxhdm9yZWQgc3RhbmQtaW4gZm9yIE5vZGUncyBgcHJvY2Vzc2AgZ2xvYmFsLlxuICovXG5pbnRlcmZhY2UgQnJvd3NlclByb2Nlc3MgZXh0ZW5kcyBQYXJ0aWFsPE5vZGVKUy5Qcm9jZXNzPiB7XG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgcHJvY2VzcyBhcyBhIGJyb3dzZXIgb25lLiBUaGUgYnVuZGxlZCBgZGVidWdgIHBhY2thZ2Ugc2VsZWN0cyBpdHMgYnJvd3NlciBlbnRyeSBwb2ludCBvbiBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGJyb3dzZXI6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvciB7QGxpbmsgZW5zdXJlRGlzcG9zZVN5bWJvbHN9IHJlYWRzIGFuZCB3cml0ZXMsIHdpdGggdGhlIHR3byBkaXNwb3NlXG4gKiBzeW1ib2xzIG9wdGlvbmFsIGJlY2F1c2UgYW4gZW5naW5lIHdpdGhvdXQgRXhwbGljaXQgUmVzb3VyY2UgTWFuYWdlbWVudCBkb2VzIG5vdCBoYXZlIHRoZW0uXG4gKi9cbmludGVyZmFjZSBEaXNwb3NlU3ltYm9sSG9zdCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIE1pc3NpbmcgZGlzcG9zYWwgc3ltYm9scyBhcmUgaW5zdGFsbGVkIG9uIHRoZSBob3N0LlxuICBhc3luY0Rpc3Bvc2U/OiBzeW1ib2w7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIE1pc3NpbmcgZGlzcG9zYWwgc3ltYm9scyBhcmUgaW5zdGFsbGVkIG9uIHRoZSBob3N0LlxuICBkaXNwb3NlPzogc3ltYm9sO1xuICByZWFkb25seSBmb3I6IChrZXk6IHN0cmluZykgPT4gc3ltYm9sO1xufVxuXG5pbnRlcmZhY2UgRXNtTW9kdWxlIHtcbiAgcmVhZG9ubHkgX19lc01vZHVsZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGVmYXVsdDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYSBicm93c2VyIGdsb2JhbCB7QGxpbmsgZ2V0Q2pzSW1wb3J0TWV0YVVybH0gcmVhZHMsIG9wdGlvbmFsIGJlY2F1c2UgYSBub24tYnJvd3NlciBob3N0IGhhcyBub25lLlxuICovXG5pbnRlcmZhY2UgSW5zZXJ0UHJlYW1ibGVQYXJhbXMge1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxlYWRpbmdCYW5uZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJlYW1ibGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvY2F0aW9uSG9zdCB7XG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogUGFnZUxvY2F0aW9uO1xufVxuXG5pbnRlcmZhY2UgTW9kdWxlU2hpbU5lZWRzIHtcbiAgcmVhZG9ubHkgaXNCcm93c2VyUHJvY2Vzc05lZWRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNEaXNwb3NlU3ltYm9sc05lZWRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNOYW1lTmVlZGVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGFnZUxvY2F0aW9uIHtcbiAgcmVhZG9ubHkgaHJlZjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU291cmNlTWFwV2l0aE1hcHBpbmdzIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gQWRkaW5nIGEgcHJlYW1ibGUgc2hpZnRzIHRoZSBzb3VyY2UgbWFwIG1hcHBpbmdzLlxuICBtYXBwaW5nczogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVXJsTW9kdWxlIHtcbiAgcmVhZG9ubHkgcGF0aFRvRmlsZVVSTDogdHlwZW9mIHBhdGhUb0ZpbGVVUkw7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYnVuZGxlIHJ1bnMgYWdhaW5zdCBhIGBwcm9jZXNzYCBnbG9iYWwgdGhhdCBicm93c2VyLXRhcmdldGluZyBwYWNrYWdlcyByZWNvZ25pemUuXG4gKlxuICogQHJlbWFya3NcbiAqIFNlcmlhbGl6ZWQgaW50byB0aGUgZW1pdHRlZCBiYW5uZXIsIHNvIGl0IG5ldmVyIHJ1bnMgaW4gdGhlIGJ1aWxkZXIgcHJvY2VzcyDigJQgYnV0IGl0IGlzIGFuIG9yZGluYXJ5XG4gKiBmdW5jdGlvbiBoZXJlLCBzbyBpdCBpcyB1bml0LXRlc3RlZCBkaXJlY3RseSByYXRoZXIgdGhhbiBieSBldmFsdWF0aW5nIHRoZSBiYW5uZXIgdGV4dC5cbiAqXG4gKiBGaWxscyBpbiB0aGUga2V5cyBNSVNTSU5HIGZyb20gYSBob3N0LXByb3ZpZGVkIGBwcm9jZXNzYCByYXRoZXIgdGhhbiByZXBsYWNpbmcgb3Igc2tpcHBpbmcgaXQuIE9ic2lkaWFuXG4gKiBNb2JpbGUgZXhwb3NlcyBhIHBhcnRpYWwgYHByb2Nlc3NgLCBhbmQgdGhlIHdob2xlLW9iamVjdCBndWFyZHMgdGhpcyByZXBsYWNlZCAoYGlmIChnbG9iYWxUaGlzLnByb2Nlc3MpIHtcbiAqIHJldHVybjsgfWAgLyBgZ2xvYmFsVGhpc1JlY29yZFsncHJvY2VzcyddID8/PSDigKZgKSB0b29rIHRoYXQgYXMgXCJhbHJlYWR5IHNoaW1tZWRcIiwgc28gYGJyb3dzZXJgIG5ldmVyXG4gKiBsYW5kZWQuIFRoZSBidW5kbGVkIGBkZWJ1Z2AgcGFja2FnZSB0aGVuIHNlbGVjdGVkIGl0cyBOb2RlIGVudHJ5IHBvaW50LCB3aGljaCBjYWxsc1xuICogYHJlcXVpcmUoJ3V0aWwnKS5kZXByZWNhdGUoKWAgYXQgbW9kdWxlIHRvcCBsZXZlbCwgYW5kIG9uIG1vYmlsZSB0aGUgcGF0Y2hlZCBgcmVxdWlyZWAgcmV0dXJucyBge31gIOKAlCBzb1xuICogdGhlIHBsdWdpbiB0aHJldyBiZWZvcmUgaXRzIGBvbmxvYWRgIHJhbi5cbiAqXG4gKiBBIHJlYWwgTm9kZSBvciBFbGVjdHJvbiBgcHJvY2Vzc2AgaXMgbGVmdCBjb21wbGV0ZWx5IHVudG91Y2hlZC4gYHByb2Nlc3MudmVyc2lvbnMubm9kZWAgaXMgdGhlIHNpZ25hbCBmb3JcbiAqIGl0LCBhbmQgaXQgaXMgc2VsZi1jb250YWluZWQsIHNvIGl0IGFsc28gaG9sZHMgaW4gdGhlIE5vZGUgQ0xJIGJ1bmRsZXMgdGhpcyBiYW5uZXIgaXMgZW1pdHRlZCBpbnRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlQnJvd3NlclByb2Nlc3MoKTogdm9pZCB7XG4gIGNvbnN0IGJyb3dzZXJQcm9jZXNzOiBHZW5lcmljT2JqZWN0PEJyb3dzZXJQcm9jZXNzPiA9IHtcbiAgICBicm93c2VyOiB0cnVlLFxuICAgIGN3ZCgpIHtcbiAgICAgIHJldHVybiAnLyc7XG4gICAgfSxcbiAgICBlbnY6IHt9LFxuICAgIHBsYXRmb3JtOiAnYW5kcm9pZCdcbiAgfTtcblxuICBjb25zdCBleGlzdGluZ1Byb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3MgYXMgUGFydGlhbDxOb2RlSlMuUHJvY2Vzcz4gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCFleGlzdGluZ1Byb2Nlc3MpIHtcbiAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSBicm93c2VyUHJvY2VzcyBhcyBOb2RlSlMuUHJvY2VzcztcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZXhpc3RpbmdQcm9jZXNzLnZlcnNpb25zPy5ub2RlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdQcm9jZXNzUmVjb3JkID0gZXhpc3RpbmdQcm9jZXNzIGFzIEdlbmVyaWNPYmplY3Q7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYnJvd3NlclByb2Nlc3MpKSB7XG4gICAgZXhpc3RpbmdQcm9jZXNzUmVjb3JkW2tleV0gPz89IHZhbHVlO1xuICB9XG5cbiAgZXhpc3RpbmdQcm9jZXNzUmVjb3JkWydicm93c2VyJ10gPSB0cnVlO1xufVxuXG4vKipcbiAqIE1ha2VzIGBTeW1ib2wuZGlzcG9zZWAgYW5kIGBTeW1ib2wuYXN5bmNEaXNwb3NlYCBleGlzdCwgZmFsbGluZyBiYWNrIHRvIHRoZSByZWdpc3RyeSBzeW1ib2xzIGVzYnVpbGQnc1xuICogYHVzaW5nYCBoZWxwZXJzIGxvb2sgdXAuXG4gKlxuICogQHBhcmFtIHN5bWJvbENvbnN0cnVjdG9yIC0gVGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yIHRvIHBhdGNoLiBEZWZhdWx0cyB0byB0aGUgYW1iaWVudCBvbmU7IHRoZSBwYXJhbWV0ZXJcbiAqIGV4aXN0cyBzbyBhIHRlc3QgY2FuIGhhbmQgaW4gYW4gZW5naW5lIHRoYXQgbGFja3MgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqXG4gKiBAcmVtYXJrc1xuICogU2VyaWFsaXplZCBpbnRvIHRoZSBlbWl0dGVkIGJhbm5lci4gQSBkaXNwb3NhYmxlIGRlY2xhcmVzIGl0cyBtZXRob2QgdW5kZXIgdGhlIExJVEVSQUwga2V5XG4gKiBgW1N5bWJvbC5kaXNwb3NlXWAsIHdoaWxlIGVzYnVpbGQgbG93ZXJzIGV2ZXJ5IGB1c2luZ2AgdG8gYSBsb29rdXAgdGhyb3VnaCBgX19rbm93blN5bWJvbCgnZGlzcG9zZScpYCxcbiAqIHdoaWNoIGZhbGxzIGJhY2sgdG8gYFN5bWJvbC5mb3IoJ1N5bWJvbC5kaXNwb3NlJylgIHdoZW4gdGhlIGVuZ2luZSBoYXMgbm8gd2VsbC1rbm93biBzeW1ib2wuIE9uIHN1Y2ggYW5cbiAqIGVuZ2luZSB0aGUgbGl0ZXJhbCBrZXkgZXZhbHVhdGVzIHRvIGB1bmRlZmluZWRgLCB0aGUgbWV0aG9kIGxhbmRzIHVuZGVyIHRoZSBzdHJpbmcgYFwidW5kZWZpbmVkXCJgLCBhbmRcbiAqIGV2ZXJ5IGB1c2luZ2Agb2YgaXQgdGhyb3dzIGBPYmplY3Qgbm90IGRpc3Bvc2FibGVgLiBGaWxsaW5nIHRoZSB3ZWxsLWtub3duIHNsb3Qgd2l0aCB0aGF0IHNhbWUgcmVnaXN0cnlcbiAqIHN5bWJvbCBtYWtlcyBib3RoIHNpZGVzIG5hbWUgb25lIGtleSBvbiBldmVyeSBlbmdpbmUuIEEgaG9zdCB0aGF0IGFscmVhZHkgaGFzIHRoZSBzeW1ib2wgaXMgbGVmdFxuICogdW50b3VjaGVkOiBgPz89YCBuZXZlciByZWFjaGVzIHRoZSBhc3NpZ25tZW50LCB3aGljaCB0aGUgaG9zdCdzIG5vbi13cml0YWJsZSBwcm9wZXJ0eSB3b3VsZCByZWZ1c2UuXG4gKlxuICogVGhlIGRlZmF1bHQgbmFtZXMgYFN5bWJvbGAgYmFyZSBvbiBwdXJwb3NlOiBpdCBleGlzdHMgb24gZXZlcnkgZW5naW5lIHRoaXMgcnVucyBvbiwgYW5kIGEgYmFyZSByZWZlcmVuY2VcbiAqIHJlc29sdmVzIGFnYWluc3Qgd2hhdGV2ZXIgc2NvcGUgdGhlIGJhbm5lciBpcyBldmFsdWF0ZWQgaW4sIGV4YWN0bHkgYXMgdGhlIGJ1bmRsZSdzIG93blxuICogYFtTeW1ib2wuZGlzcG9zZV1gIGtleXMgZG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVEaXNwb3NlU3ltYm9scyhzeW1ib2xDb25zdHJ1Y3RvcjogRGlzcG9zZVN5bWJvbEhvc3QgPSBTeW1ib2wpOiB2b2lkIHtcbiAgc3ltYm9sQ29uc3RydWN0b3IuYXN5bmNEaXNwb3NlID8/PSBzeW1ib2xDb25zdHJ1Y3Rvci5mb3IoJ1N5bWJvbC5hc3luY0Rpc3Bvc2UnKTtcbiAgc3ltYm9sQ29uc3RydWN0b3IuZGlzcG9zZSA/Pz0gc3ltYm9sQ29uc3RydWN0b3IuZm9yKCdTeW1ib2wuZGlzcG9zZScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgaXRzIGFyZ3VtZW50IHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gJHVua25vd24gLSBUaGUgdmFsdWUgdG8gcmV0dXJuLlxuICogQHJldHVybnMgVGhlIHZhbHVlIHBhc3NlZCBpbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogU2VyaWFsaXplZCBpbnRvIHRoZSBlbWl0dGVkIGJhbm5lciwgd2hlcmUgaXQgc3RhbmRzIGluIGZvciBlc2J1aWxkJ3MgYF9fbmFtZWAgaGVscGVyIOKAlCB3aGljaCBuYW1lcyBhXG4gKiBmdW5jdGlvbiBhbmQgcmV0dXJucyBpdCDigJQgZm9yIGJ1bmRsZXMgdGhhdCByZWZlcmVuY2UgdGhlIGhlbHBlciB3aXRob3V0IGVtaXR0aW5nIHRoZWlyIG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtlZXBOYW1lKCR1bmtub3duOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiAkdW5rbm93bjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGJhbm5lciBpbmplY3RlZCBhdCB0aGUgdG9wIG9mIGV2ZXJ5IGVtaXR0ZWQgYnVuZGxlLlxuICpcbiAqIGBTdHJpbmcoZm4pYCBjYXB0dXJlcyBvbmx5IHRoZSBmdW5jdGlvbidzIG93biBib2R5LCBzbyBldmVyeSBzaGltIHRoZSBgaW5pdGAgZnVuY3Rpb24gY2FsbHMgaGFzIHRvIGJlXG4gKiBzZXJpYWxpemVkIG5leHQgdG8gaXQgYW5kIHdyYXBwZWQgaW4gb25lIHNoYXJlZCBzY29wZTsgb3RoZXJ3aXNlIHRoZSBjYWxsIGl0IG1ha2VzIHJlc29sdmVzIGFnYWluc3QgdGhlXG4gKiBjb25zdW1lcidzIGdsb2JhbCBzY29wZSBhdCBydW50aW1lLiBTZWUgdGhpcyBmaWxlJ3MgYEBmaWxlYCByZW1hcmtzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGJhbm5lciBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGJhbm5lciBzb3VyY2UgdG8gcHJlcGVuZCB0byB0aGUgZW1pdHRlZCBidW5kbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUHJlcHJvY2Vzc0Jhbm5lcihvcHRpb25zOiBNYWtlUHJlcHJvY2Vzc0Jhbm5lck9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMgPSBbXSwgaXNFc20gPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc2hpbXMgPSBpc0VzbSA/IFtlbnN1cmVEaXNwb3NlU3ltYm9scywgZW5zdXJlQnJvd3NlclByb2Nlc3NdIDogW2Vuc3VyZURpc3Bvc2VTeW1ib2xzLCBlbnN1cmVCcm93c2VyUHJvY2Vzcywga2VlcE5hbWVdO1xuICBjb25zdCBpbml0ID0gaXNFc20gPyBpbml0RXNtIDogaW5pdENqcztcbiAgY29uc3QgYWRkaXRpb25hbEluaXRzID0gYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMubWFwKChmdW5jdGlvbl8pID0+IGAoJHtTdHJpbmcoZnVuY3Rpb25fKX0pKCk7XFxuYCkuam9pbignJyk7XG4gIHJldHVybiBgXFxuKGZ1bmN0aW9uICgpIHtcXG4ke3NoaW1zLm1hcChTdHJpbmcpLmpvaW4oJ1xcblxcbicpfVxcblxcbigke1N0cmluZyhpbml0KX0pKCk7XFxufSkoKTtcXG4ke2FkZGl0aW9uYWxJbml0c31gO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gVGhlIHBsdWdpbidzIHNldHVwIG5lZWRzIGEgbGl2ZSBlc2J1aWxkIGNvbnRleHQsIGFuZCB0aGUgZnVuY3Rpb25zIGluIHRoZSBsYXRlciBpZ25vcmVkIHJhbmdlcyBhcmUgc2VyaWFsaXplZCBpbnRvIHRoZSBlbWl0dGVkIGJhbm5lciBhbmQgc28gcnVuIGluc2lkZSB0aGUgYnVpbHQgYnVuZGxlLCBuZXZlciBpbiB0aGlzIHByb2Nlc3MuIFRoZSBzaGltcyBhYm92ZSBhcmUgZGVsaWJlcmF0ZWx5IE5PVCBpZ25vcmVkOiB0aGV5IGFyZSBvcmRpbmFyeSBmdW5jdGlvbnMgaGVyZSBhbmQgYXJlIHVuaXQtdGVzdGVkIGRpcmVjdGx5LCBhbmQgbmVpdGhlciBhcmUgdGhlIHVuYnVuZGxlZC1idWlsZCBoZWxwZXJzLCB3aGljaCB0aGUgdGVzdHMgZHJpdmUgdGhyb3VnaCBhIHN0dWIgYnVpbGQuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlc2J1aWxkIHBsdWdpbiB0aGF0IHByZXByb2Nlc3NlcyBKYXZhU2NyaXB0IGFuZCBUeXBlU2NyaXB0IGZpbGVzLlxuICpcbiAqIFRoaXMgcGx1Z2luIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGFza3M6XG4gKiAtIFJlcGxhY2VzIGluc3RhbmNlcyBvZiBgaW1wb3J0KGRvdCltZXRhKGRvdCl1cmxgIHdpdGggYSBDb21tb25KUy1jb21wYXRpYmxlIGBfX2ZpbGVuYW1lYCBhbHRlcm5hdGl2ZS5cbiAqIC0gTW9kaWZpZXMgdGhlIGBzb3VyY2VNYXBwaW5nVVJMYCBjb21tZW50IHNvIGEgdGVtcGxhdGUgbGl0ZXJhbCBlbmRpbmcgYSBmaWxlIGRvZXMgbm90IHN3YWxsb3cgaXQuXG4gKiAtIEFkZHMgYSBiYXNpYyBgcHJvY2Vzc2Agb2JqZWN0IHRvIHRoZSBnbG9iYWwgc2NvcGUgaWYgYHByb2Nlc3NgIGlzIHJlZmVyZW5jZWQgYnV0IG5vdCBkZWZpbmVkLlxuICogLSBGaWxscyBpbiBgU3ltYm9sLmRpc3Bvc2VgIC8gYFN5bWJvbC5hc3luY0Rpc3Bvc2VgIG9uIGVuZ2luZXMgdGhhdCBsYWNrIHRoZW0sIHNvIGB1c2luZ2Agd29ya3MgdGhlcmUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBbiBlc2J1aWxkIGBQbHVnaW5gIG9iamVjdCB0aGF0IGhhbmRsZXMgdGhlIHByZXByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwcm9jZXNzUGx1Z2luKG9wdGlvbnM6IFByZXByb2Nlc3NQbHVnaW5PcHRpb25zID0ge30pOiBQbHVnaW4ge1xuICBjb25zdCB7IGFkZGl0aW9uYWxCYW5uZXJJbml0RnVuY3Rpb25zID0gW10sIGNqc0ltcG9ydE1ldGFVcmxQcm92aWRlciA9IGdldENqc0ltcG9ydE1ldGFVcmwsIGlzRXNtID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlcGxhY2VtZW50cyA9IGlzRXNtXG4gICAgPyB7fVxuICAgIDoge1xuICAgICAgW1xuICAgICAgICByZXBsYWNlQWxsKHtcbiAgICAgICAgICAkc3RyaW5nOiAnaW1wb3J0KGRvdCltZXRhKGRvdCl1cmwnLFxuICAgICAgICAgIHJlcGxhY2VyOiAnLicsXG4gICAgICAgICAgc2VhcmNoVmFsdWU6ICcoZG90KSdcbiAgICAgICAgfSlcbiAgICAgIF06IGNqc0ltcG9ydE1ldGFVcmxQcm92aWRlclxuICAgIH07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAncHJlcHJvY2VzcycsXG4gICAgc2V0dXAoYnVpbGQpOiB2b2lkIHtcbiAgICAgIGJ1aWxkLmluaXRpYWxPcHRpb25zLmRlZmluZSA/Pz0ge307XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlcGxhY2VtZW50cykpIHtcbiAgICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMuZGVmaW5lW2tleV0gPSBgX18ke21ha2VWYWxpZFZhcmlhYmxlTmFtZShrZXkpfWA7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWlsZC5pbml0aWFsT3B0aW9ucy5idW5kbGUgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIE9uZSBvdXRwdXQgcGVyIHNvdXJjZTogZWFjaCBtb2R1bGUgZ2V0cyBvbmx5IHRoZSBzaGltcyBpdHMgb3duIGNvZGUgbmVlZHMsIHNvIGEgcGFnZSBpbXBvcnRpbmcgYSBwdXJlXG4gICAgICAgIC8vIG1vZHVsZSBvZiBhIGxpYnJhcnkgaXMgbGVmdCB3aXRoIGl0cyBnbG9iYWxzIHVudG91Y2hlZC5cbiAgICAgICAgY29uc3QgbGVhZGluZ0Jhbm5lciA9IGJ1aWxkLmluaXRpYWxPcHRpb25zLmJhbm5lcj8uWydqcyddID8/ICcnO1xuICAgICAgICBidWlsZC5vbkVuZCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgYWRkTW9kdWxlUHJlYW1ibGVzKHsgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMsIGxlYWRpbmdCYW5uZXIsIG91dHB1dEZpbGVzOiByZXN1bHQub3V0cHV0RmlsZXMgPz8gW10gfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMuYmFubmVyID8/PSB7fTtcbiAgICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMuYmFubmVyWydqcyddID8/PSAnJztcbiAgICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMuYmFubmVyWydqcyddICs9IG1ha2VQcmVwcm9jZXNzQmFubmVyKHsgYWRkaXRpb25hbEJhbm5lckluaXRGdW5jdGlvbnMsIGlzRXNtIH0pO1xuICAgICAgfVxuXG4gICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC9cXC4oPzpqc3x0c3xjanN8bWpzfGN0c3xtdHMpJC8gfSwgYXN5bmMgKCRhcmd1bWVudHMpID0+IHtcbiAgICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcmVhZEZpbGUoJGFyZ3VtZW50cy5wYXRoLCAndXRmLTgnKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXBsYWNlbWVudHMpKSB7XG4gICAgICAgICAgY29uc3QgdmFyaWFibGUgPSBgX18ke21ha2VWYWxpZFZhcmlhYmxlTmFtZShrZXkpfWA7XG4gICAgICAgICAgaWYgKCFjb250ZW50cy5pbmNsdWRlcyhrZXkpIHx8IGNvbnRlbnRzLmluY2x1ZGVzKGB2YXIgJHt2YXJpYWJsZX1gKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gYCgke1N0cmluZyh2YWx1ZSl9KSgpYCA6IHRvSnNvbih2YWx1ZSwgeyBmdW5jdGlvbkhhbmRsaW5nTW9kZTogRnVuY3Rpb25IYW5kbGluZ01vZGUuRnVsbCB9KTtcbiAgICAgICAgICBjb250ZW50cyA9IGB2YXIgJHt2YXJpYWJsZX0gPSBnbG9iYWxUaGlzWycke2tleX0nXSA/PyAke3ZhbHVlU3RyaW5nfTtcXG4ke2NvbnRlbnRzfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIQUNLOiBUaGUgJHsnJ30gcGFydCBpcyB1c2VkIHRvIGVuc3VyZSBPYnNpZGlhbiBsb2FkcyB0aGUgcGx1Z2luIHByb3Blcmx5LFxuICAgICAgICAvLyBPdGhlcndpc2UsIGl0IHN0b3BzIGxvYWRpbmcgYWZ0ZXIgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHNvdXJjZU1hcHBpbmdVUkwgY29tbWVudC5cblxuICAgICAgICBjb250ZW50cyA9IHJlcGxhY2VBbGwoe1xuICAgICAgICAgICRzdHJpbmc6IGNvbnRlbnRzLFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgLS0gSXQgaXMgaW50ZW50aW9uYWwsIHRoZSBzdHJpbmcgbG9va3MgbGlrZSBhIHRlbXBsYXRlIGxpdGVyYWwsIGJ1dCBpdCBpcyBub3QuXG4gICAgICAgICAgcmVwbGFjZXI6ICdgXFxuLy8jJHtcXCdcXCd9IHNvdXJjZU1hcHBpbmdVUkwnLFxuICAgICAgICAgIHNlYXJjaFZhbHVlOiAvYFxccj9cXG5cXC9cXC8jIHNvdXJjZU1hcHBpbmdVUkwvZ1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgIGxvYWRlcjogJ3RzJ1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIFByZXBlbmRzIHRvIGVhY2ggZW1pdHRlZCBtb2R1bGUgdGhlIHByZWFtYmxlIGl0cyBvd24gY29kZSBuZWVkcywgYW5kIG5vdGhpbmcgd2hlbiBpdCBuZWVkcyBub25lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZW1pdHRlZCBtb2R1bGVzLCB0aGUgYmFubmVyIHRoZSBjYWxsZXIgYWxyZWFkeSBwdXQgZmlyc3QsIGFuZCB0aGUgY2FsbGVyJ3MgZXh0cmEgaW5pdHMuXG4gKi9cbmZ1bmN0aW9uIGFkZE1vZHVsZVByZWFtYmxlcyhwYXJhbXM6IEFkZE1vZHVsZVByZWFtYmxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGFkZGl0aW9uYWxCYW5uZXJJbml0RnVuY3Rpb25zLCBsZWFkaW5nQmFubmVyLCBvdXRwdXRGaWxlcyB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IG91dHB1dEZpbGUgb2Ygb3V0cHV0RmlsZXMpIHtcbiAgICBpZiAoIUpTX09VVFBVVF9SRUdfRVhQLnRlc3Qob3V0cHV0RmlsZS5wYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZSA9IG91dHB1dEZpbGUudGV4dDtcbiAgICBjb25zdCBwcmVhbWJsZSA9IG1ha2VNb2R1bGVQcmVhbWJsZShnZXRNb2R1bGVTaGltTmVlZHMoY29kZSksIGFkZGl0aW9uYWxCYW5uZXJJbml0RnVuY3Rpb25zKTtcbiAgICBpZiAocHJlYW1ibGUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBvdXRwdXRGaWxlLmNvbnRlbnRzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGluc2VydFByZWFtYmxlKHsgY29kZSwgbGVhZGluZ0Jhbm5lciwgcHJlYW1ibGUgfSkpO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBTZXJpYWxpemVkIGludG8gdGhlIGVtaXR0ZWQgbW9kdWxlLCBzZWUgYWJvdmUuICovXG5mdW5jdGlvbiBnZXRDanNJbXBvcnRNZXRhVXJsKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBsb2NhbFJlcXVpcmUgPSByZXF1aXJlO1xuICAgIGNvbnN0IHVybCA9IGxvY2FsUmVxdWlyZSgnbm9kZTp1cmwnKSBhcyBVcmxNb2R1bGU7XG4gICAgaWYgKHR5cGVvZiB1cmwucGF0aFRvRmlsZVVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHVybC5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpLmhyZWY7XG4gICAgfVxuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gdGhlIHBhZ2UgVVJMLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGVudmlyb25tZW50IGlzIHVua25vd24uXG4gIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBMb2NhdGlvbkhvc3QpLmxvY2F0aW9uPy5ocmVmID8/ICcnO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuZnVuY3Rpb24gZ2V0SWRlbnRpZmllclVzYWdlKG5vZGU6IElkZW50aWZpZXIpOiBJZGVudGlmaWVyVXNhZ2Uge1xuICBjb25zdCB7IHBhcmVudCB9ID0gbm9kZTtcbiAgaWYgKFxuICAgIChpc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihwYXJlbnQpIHx8IGlzUHJvcGVydHlBc3NpZ25tZW50KHBhcmVudCkgfHwgaXNNZXRob2REZWNsYXJhdGlvbihwYXJlbnQpIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihwYXJlbnQpXG4gICAgICB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24ocGFyZW50KSB8fCBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24ocGFyZW50KSlcbiAgICAmJiBwYXJlbnQubmFtZSA9PT0gbm9kZVxuICApIHtcbiAgICByZXR1cm4gSWRlbnRpZmllclVzYWdlLk1lbWJlcjtcbiAgfVxuXG4gIHJldHVybiAoaXNWYXJpYWJsZURlY2xhcmF0aW9uKHBhcmVudCkgfHwgaXNGdW5jdGlvbkRlY2xhcmF0aW9uKHBhcmVudCkgfHwgaXNDbGFzc0RlY2xhcmF0aW9uKHBhcmVudCkgfHwgaXNQYXJhbWV0ZXIocGFyZW50KSB8fCBpc0JpbmRpbmdFbGVtZW50KHBhcmVudClcbiAgICAgIHx8IGlzSW1wb3J0Q2xhdXNlKHBhcmVudCkgfHwgaXNJbXBvcnRTcGVjaWZpZXIocGFyZW50KSB8fCBpc05hbWVzcGFjZUltcG9ydChwYXJlbnQpKVxuICAgICAgJiYgcGFyZW50Lm5hbWUgPT09IG5vZGVcbiAgICA/IElkZW50aWZpZXJVc2FnZS5CaW5kaW5nXG4gICAgOiBJZGVudGlmaWVyVXNhZ2UuUmVhZDtcbn1cblxuLyoqXG4gKiBSZWFkcyB3aGljaCBzaGltcyBhbiBlbWl0dGVkIG1vZHVsZSBuZWVkcyBmcm9tIGl0cyBjb2RlLlxuICpcbiAqIC0gYGVuc3VyZUJyb3dzZXJQcm9jZXNzYDogaXQgcmVhZHMgYSBgcHJvY2Vzc2AgaXQgZG9lcyBub3QgYmluZCBpdHNlbGYsIG9yIGl0IGxvYWRzIGEgYmFyZSBwYWNrYWdlIHRoYXQgaXMgbm90IGFcbiAqICAgYG5vZGU6YCBidWlsdC1pbi4gVGhlIHNlY29uZCBjYXNlIGlzIHRoZXJlIGJlY2F1c2Ugc3VjaCBhIHBhY2thZ2UgKGBwYXRoLWJyb3dzZXJpZnlgIHJlYWRzIGBwcm9jZXNzLmN3ZCgpYCkgY2Fubm90XG4gKiAgIGNhcnJ5IGEgc2hpbSBvZiBpdHMgb3duLCBhbmQgaW4gYW4gdW5idW5kbGVkIGJ1aWxkIGl0cyBpbXBvcnRlciBpcyB0aGUgb25seSBtb2R1bGUgdGhhdCBjYW4uXG4gKiAtIGBlbnN1cmVEaXNwb3NlU3ltYm9sc2A6IGl0IG5hbWVzIGBTeW1ib2wuZGlzcG9zZWAgb3IgYFN5bWJvbC5hc3luY0Rpc3Bvc2VgLCBvciBob2xkcyBlc2J1aWxkJ3MgYF9fa25vd25TeW1ib2xgXG4gKiAgIGhlbHBlciwgd2hpY2ggYSBsb3dlcmVkIGB1c2luZ2AgZW1pdHMuXG4gKiAtIGBfX25hbWVgOiBpdCByZWFkcyBhIGBfX25hbWVgIGl0IGRvZXMgbm90IGRlY2xhcmUuXG4gKlxuICogQHBhcmFtIGNvZGUgLSBUaGUgZW1pdHRlZCBtb2R1bGUuXG4gKiBAcmV0dXJucyBXaGF0IHRoZSBtb2R1bGUgbmVlZHMuXG4gKi9cbmZ1bmN0aW9uIGdldE1vZHVsZVNoaW1OZWVkcyhjb2RlOiBzdHJpbmcpOiBNb2R1bGVTaGltTmVlZHMge1xuICBjb25zdCBzb3VyY2VGaWxlID0gY3JlYXRlU291cmNlRmlsZSgnbW9kdWxlLmpzJywgY29kZSwgU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSwgU2NyaXB0S2luZC5KUyk7XG4gIGNvbnN0IGJvdW5kTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgcmVhZE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGxldCBpc0JhcmVJbXBvcnRGb3VuZCA9IGZhbHNlO1xuICBsZXQgaXNEaXNwb3NlU3ltYm9sRm91bmQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgY29uc3Qgc3BlY2lmaWVyID0gZ2V0TW9kdWxlU3BlY2lmaWVyKG5vZGUpO1xuICAgIGlmIChzcGVjaWZpZXIgIT09IHVuZGVmaW5lZCAmJiAhTk9OX0JBUkVfU1BFQ0lGSUVSX1JFR19FWFAudGVzdChzcGVjaWZpZXIpKSB7XG4gICAgICBpc0JhcmVJbXBvcnRGb3VuZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obm9kZSkgJiYgaXNJZGVudGlmaWVyKG5vZGUuZXhwcmVzc2lvbikgJiYgbm9kZS5leHByZXNzaW9uLnRleHQgPT09ICdTeW1ib2wnXG4gICAgICAmJiBESVNQT1NFX1NZTUJPTF9OQU1FUy5oYXMobm9kZS5uYW1lLnRleHQpXG4gICAgKSB7XG4gICAgICBpc0Rpc3Bvc2VTeW1ib2xGb3VuZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzSWRlbnRpZmllcihub2RlKSkge1xuICAgICAgaWYgKG5vZGUudGV4dCA9PT0gS05PV05fU1lNQk9MX0hFTFBFUl9OQU1FKSB7XG4gICAgICAgIGlzRGlzcG9zZVN5bWJvbEZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXNhZ2UgPSBnZXRJZGVudGlmaWVyVXNhZ2Uobm9kZSk7XG4gICAgICBpZiAodXNhZ2UgPT09IElkZW50aWZpZXJVc2FnZS5CaW5kaW5nKSB7XG4gICAgICAgIGJvdW5kTmFtZXMuYWRkKG5vZGUudGV4dCk7XG4gICAgICB9IGVsc2UgaWYgKHVzYWdlID09PSBJZGVudGlmaWVyVXNhZ2UuUmVhZCkge1xuICAgICAgICByZWFkTmFtZXMuYWRkKG5vZGUudGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfVxuICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICBmdW5jdGlvbiBpc0ZyZWVSZWFkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWFkTmFtZXMuaGFzKG5hbWUpICYmICFib3VuZE5hbWVzLmhhcyhuYW1lKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaXNCcm93c2VyUHJvY2Vzc05lZWRlZDogaXNGcmVlUmVhZCgncHJvY2VzcycpIHx8IGlzQmFyZUltcG9ydEZvdW5kLFxuICAgIGlzRGlzcG9zZVN5bWJvbHNOZWVkZWQ6IGlzRGlzcG9zZVN5bWJvbEZvdW5kLFxuICAgIGlzTmFtZU5lZWRlZDogaXNGcmVlUmVhZCgnX19uYW1lJylcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kdWxlU3BlY2lmaWVyKG5vZGU6IE5vZGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoKGlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkgfHwgaXNFeHBvcnREZWNsYXJhdGlvbihub2RlKSkgJiYgbm9kZS5tb2R1bGVTcGVjaWZpZXIgIT09IHVuZGVmaW5lZCAmJiBpc1N0cmluZ0xpdGVyYWwobm9kZS5tb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgcmV0dXJuIG5vZGUubW9kdWxlU3BlY2lmaWVyLnRleHQ7XG4gIH1cblxuICBpZiAoaXNDYWxsRXhwcmVzc2lvbihub2RlKSkge1xuICAgIGNvbnN0IFtmaXJzdEFyZ3VtZW50XSA9IG5vZGUuYXJndW1lbnRzO1xuICAgIGNvbnN0IGlzTG9hZGVyID0gbm9kZS5leHByZXNzaW9uLmtpbmQgPT09IFN5bnRheEtpbmQuSW1wb3J0S2V5d29yZCB8fCAoaXNJZGVudGlmaWVyKG5vZGUuZXhwcmVzc2lvbikgJiYgbm9kZS5leHByZXNzaW9uLnRleHQgPT09ICdyZXF1aXJlJyk7XG4gICAgaWYgKGlzTG9hZGVyICYmIGZpcnN0QXJndW1lbnQgIT09IHVuZGVmaW5lZCAmJiBpc1N0cmluZ0xpdGVyYWwoZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgIHJldHVybiBmaXJzdEFyZ3VtZW50LnRleHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFNlcmlhbGl6ZWQgaW50byB0aGUgZW1pdHRlZCBiYW5uZXIsIHNlZSBhYm92ZS4gKi9cbmZ1bmN0aW9uIGluaXRDanMoKTogdm9pZCB7XG4gIGNvbnN0IGdsb2JhbFRoaXNSZWNvcmQgPSBnbG9iYWxUaGlzIGFzIEdlbmVyaWNPYmplY3Q7XG4gIGVuc3VyZURpc3Bvc2VTeW1ib2xzKCk7XG4gIGdsb2JhbFRoaXNSZWNvcmRbJ19fbmFtZSddID8/PSBrZWVwTmFtZTtcbiAgZ2xvYmFsVGhpc1JlY29yZFsnX19leHRyYWN0RGVmYXVsdCddID8/PSBleHRyYWN0RGVmYXVsdDtcblxuICBlbnN1cmVCcm93c2VyUHJvY2VzcygpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBTZXJpYWxpemVkIHdpdGggaW5pdENqcyBpbnRvIHRoZSBiYW5uZXI7IGF0IG1vZHVsZSBzY29wZSBpdCB3b3VsZCBiZSBsZWZ0IG91dCBvZiBpdC5cbiAgZnVuY3Rpb24gZXh0cmFjdERlZmF1bHQobW9kdWxlOiBQYXJ0aWFsPEVzbU1vZHVsZT4gfCB1bmRlZmluZWQpOiB1bmtub3duIHtcbiAgICByZXR1cm4gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlICYmICdkZWZhdWx0JyBpbiBtb2R1bGUgPyBtb2R1bGUuZGVmYXVsdCA6IG1vZHVsZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0RXNtKCk6IHZvaWQge1xuICBlbnN1cmVEaXNwb3NlU3ltYm9scygpO1xuICBlbnN1cmVCcm93c2VyUHJvY2VzcygpO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyoqXG4gKiBJbnNlcnRzIHRoZSBwcmVhbWJsZSBhZnRlciB0aGUgY2FsbGVyJ3MgbGVhZGluZyBiYW5uZXIsIGFuZCBzaGlmdHMgYW4gaW5saW5lIHNvdXJjZSBtYXAgZG93biBieSB0aGUgbGluZXMgaXQgYWRkcyxcbiAqIHNvIHRoZSBtb2R1bGUncyBvd24gbGluZXMga2VlcCBtYXBwaW5nIG9udG8gdGhlaXIgc291cmNlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIG1vZHVsZSwgaXRzIGxlYWRpbmcgYmFubmVyIGFuZCB0aGUgcHJlYW1ibGUuXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlIHdpdGggdGhlIHByZWFtYmxlIGluIGl0LlxuICovXG5mdW5jdGlvbiBpbnNlcnRQcmVhbWJsZShwYXJhbXM6IEluc2VydFByZWFtYmxlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb2RlLCBsZWFkaW5nQmFubmVyLCBwcmVhbWJsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBpbnNlcnRBdCA9IGxlYWRpbmdCYW5uZXIuZW5kc1dpdGgoJ1xcbicpICYmIGNvZGUuc3RhcnRzV2l0aChsZWFkaW5nQmFubmVyKSA/IGxlYWRpbmdCYW5uZXIubGVuZ3RoIDogMDtcbiAgY29uc3QgYWRkZWRMaW5lQ291bnQgPSBwcmVhbWJsZS5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMTtcbiAgbGV0IHNoaWZ0ZWRDb2RlID0gY29kZTtcbiAgY29uc3Qgc291cmNlTWFwU3RhcnQgPSBjb2RlLmxhc3RJbmRleE9mKElOTElORV9TT1VSQ0VfTUFQX1BSRUZJWCk7XG4gIGlmIChzb3VyY2VNYXBTdGFydCAhPT0gLTEpIHtcbiAgICBjb25zdCBkYXRhU3RhcnQgPSBzb3VyY2VNYXBTdGFydCArIElOTElORV9TT1VSQ0VfTUFQX1BSRUZJWC5sZW5ndGg7XG4gICAgY29uc3QgZGF0YSA9IGNvZGUuc2xpY2UoZGF0YVN0YXJ0KS50cmltRW5kKCk7XG4gICAgY29uc3Qgc291cmNlTWFwID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04JykpIGFzIFNvdXJjZU1hcFdpdGhNYXBwaW5ncztcbiAgICBzb3VyY2VNYXAubWFwcGluZ3MgPSAnOycucmVwZWF0KGFkZGVkTGluZUNvdW50KSArIHNvdXJjZU1hcC5tYXBwaW5ncztcbiAgICBzaGlmdGVkQ29kZSA9IGNvZGUuc2xpY2UoMCwgZGF0YVN0YXJ0KSArIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCksICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKSArIGNvZGUuc2xpY2UoZGF0YVN0YXJ0ICsgZGF0YS5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBzaGlmdGVkQ29kZS5zbGljZSgwLCBpbnNlcnRBdCkgKyBwcmVhbWJsZSArIHNoaWZ0ZWRDb2RlLnNsaWNlKGluc2VydEF0KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHByZWFtYmxlIG9mIG9uZSB1bmJ1bmRsZWQgbW9kdWxlOiB0aGUgc2hpbXMgaXQgbmVlZHMgaW4gb25lIHNoYXJlZCBzY29wZSwgdGhlbiB0aGUgY2FsbGVyJ3MgZXh0cmEgaW5pdHMuXG4gKlxuICogQHBhcmFtIG5lZWRzIC0gV2hhdCB0aGUgbW9kdWxlIG5lZWRzLlxuICogQHBhcmFtIGFkZGl0aW9uYWxCYW5uZXJJbml0RnVuY3Rpb25zIC0gVGhlIGNhbGxlcidzIGV4dHJhIGluaXRzLCB3aGljaCBldmVyeSBtb2R1bGUgZ2V0cy5cbiAqIEByZXR1cm5zIFRoZSBwcmVhbWJsZSwgZW1wdHkgd2hlbiB0aGUgbW9kdWxlIG5lZWRzIG5vdGhpbmcuXG4gKi9cbmZ1bmN0aW9uIG1ha2VNb2R1bGVQcmVhbWJsZShuZWVkczogTW9kdWxlU2hpbU5lZWRzLCBhZGRpdGlvbmFsQmFubmVySW5pdEZ1bmN0aW9uczogcmVhZG9ubHkgKCgpID0+IHZvaWQpW10pOiBzdHJpbmcge1xuICBjb25zdCBzaGltczogKCguLi5hcmd1bWVudHNfOiBuZXZlcltdKSA9PiB1bmtub3duKVtdID0gW107XG4gIGNvbnN0IGNhbGxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChuZWVkcy5pc0Rpc3Bvc2VTeW1ib2xzTmVlZGVkKSB7XG4gICAgc2hpbXMucHVzaChlbnN1cmVEaXNwb3NlU3ltYm9scyk7XG4gICAgY2FsbHMucHVzaCgnZW5zdXJlRGlzcG9zZVN5bWJvbHMoKTsnKTtcbiAgfVxuXG4gIGlmIChuZWVkcy5pc0Jyb3dzZXJQcm9jZXNzTmVlZGVkKSB7XG4gICAgc2hpbXMucHVzaChlbnN1cmVCcm93c2VyUHJvY2Vzcyk7XG4gICAgY2FsbHMucHVzaCgnZW5zdXJlQnJvd3NlclByb2Nlc3MoKTsnKTtcbiAgfVxuXG4gIGlmIChuZWVkcy5pc05hbWVOZWVkZWQpIHtcbiAgICBzaGltcy5wdXNoKGtlZXBOYW1lKTtcbiAgICBjYWxscy5wdXNoKCdnbG9iYWxUaGlzW1xcJ19fbmFtZVxcJ10gPz89IGtlZXBOYW1lOycpO1xuICB9XG5cbiAgY29uc3Qgc2hhcmVkU2NvcGUgPSBzaGltcy5sZW5ndGggPT09IDAgPyAnJyA6IGAoZnVuY3Rpb24gKCkge1xcbiR7c2hpbXMubWFwKFN0cmluZykuam9pbignXFxuXFxuJyl9XFxuXFxuJHtjYWxscy5qb2luKCdcXG4nKX1cXG59KSgpO1xcbmA7XG4gIHJldHVybiBzaGFyZWRTY29wZSArIGFkZGl0aW9uYWxCYW5uZXJJbml0RnVuY3Rpb25zLm1hcCgoZnVuY3Rpb25fKSA9PiBgKCR7U3RyaW5nKGZ1bmN0aW9uXyl9KSgpO1xcbmApLmpvaW4oJycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1DQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLE1BQU0sdUJBQXVCLG9CQUFJLElBQUksQ0FBQyxnQkFBZ0IsU0FBUyxDQUFDO0FBQ2hFLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0sb0JBQW9CO0FBRTFCLE1BQU0sMkJBQTJCO0FBRWpDLE1BQU0sNkJBQTZCO0FBbUk1QixTQUFTLHVCQUE2QjtBQUMzQyxRQUFNLGlCQUFnRDtBQUFBLElBQ3BELFNBQVM7QUFBQSxJQUNULE1BQU07QUFDSixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxDQUFDO0FBQUEsSUFDTixVQUFVO0FBQUEsRUFDWjtBQUVBLFFBQU0sa0JBQWtCLFdBQVc7QUFFbkMsTUFBSSxDQUFDLGlCQUFpQjtBQUNwQixlQUFXLFVBQVU7QUFDckI7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsVUFBVSxNQUFNO0FBQ2xDO0FBQUEsRUFDRjtBQUVBLFFBQU0sd0JBQXdCO0FBRTlCLGFBQVcsQ0FBQyxLQUFLLEtBQUss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