obsidian-dev-utils 91.0.1 → 92.1.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 (70) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/demo-vault-helper/main.js +65 -2
  3. package/dist/integration-test-plugin/main.js +171 -102
  4. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  5. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +5 -0
  7. package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +49 -1
  8. package/dist/lib/cjs/obsidian/demo-vault-helper.d.cts +7 -2
  9. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +22 -1
  10. package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +14 -0
  11. package/dist/lib/cjs/obsidian/vault.cjs +1 -1
  12. package/dist/lib/cjs/obsidian/vault.d.cts +3 -0
  13. package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +185 -4
  14. package/dist/lib/cjs/script-utils/demo-vault-coverage.d.cts +106 -1
  15. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +1 -1
  16. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +3 -0
  17. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +1 -1
  18. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +3 -0
  19. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.cjs +1 -1
  20. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +3 -0
  21. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +1 -1
  22. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +3 -0
  23. package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.cjs +1 -1
  24. package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +3 -0
  25. package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.cjs +1 -1
  26. package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +3 -0
  27. package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.cjs +1 -1
  28. package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +3 -0
  29. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +1 -1
  30. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +3 -0
  31. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +1 -1
  32. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +3 -0
  33. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +1 -1
  34. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +3 -0
  35. package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +1 -1
  36. package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +12 -0
  37. package/dist/lib/esm/generated-during-build.mjs +1 -1
  38. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +5 -0
  39. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +1 -1
  40. package/dist/lib/esm/obsidian/demo-vault-helper.d.mts +7 -2
  41. package/dist/lib/esm/obsidian/demo-vault-helper.mjs +53 -2
  42. package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +14 -0
  43. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +22 -1
  44. package/dist/lib/esm/obsidian/vault.d.mts +3 -0
  45. package/dist/lib/esm/obsidian/vault.mjs +1 -1
  46. package/dist/lib/esm/script-utils/demo-vault-coverage.d.mts +106 -1
  47. package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +186 -4
  48. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +3 -0
  49. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +1 -1
  50. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +3 -0
  51. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +1 -1
  52. package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +3 -0
  53. package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +1 -1
  54. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.d.mts +3 -0
  55. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +1 -1
  56. package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +3 -0
  57. package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +1 -1
  58. package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +3 -0
  59. package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +1 -1
  60. package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +3 -0
  61. package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +1 -1
  62. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +3 -0
  63. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +1 -1
  64. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +3 -0
  65. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +1 -1
  66. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +3 -0
  67. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +1 -1
  68. package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +12 -0
  69. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +1 -1
  70. package/package.json +2 -2
@@ -41,6 +41,10 @@
41
41
  *
42
42
  * The wrapped modal can still be closed normally; the floating bar is cleaned up automatically when
43
43
  * the modal closes (even if it is closed while minimized).
44
+ *
45
+ * Clicking the dimmed background behind the modal **minimizes** it rather than closing it, so a stray
46
+ * click past the dialog no longer cancels the operation the modal is running — pass
47
+ * `{ shouldMinimizeOnClickOutside: false }` to keep Obsidian's native close-on-background-click.
44
48
  */
45
49
  import { Modal } from 'obsidian';
46
50
  import { MonkeyAroundComponent } from '../components/monkey-around-component.cjs';
@@ -48,6 +52,14 @@ import { MonkeyAroundComponent } from '../components/monkey-around-component.cjs
48
52
  * Options for constructing a {@link MinimizableModal}.
49
53
  */
50
54
  export interface MinimizableModalConstructorOptions {
55
+ /**
56
+ * Whether clicking the dimmed background behind the modal minimizes it instead of closing it.
57
+ * Obsidian's native behavior is to close, which cancels whatever operation the modal is running;
58
+ * minimizing keeps that operation alive so the user can peek at the involved notes and come back.
59
+ *
60
+ * @default `true`
61
+ */
62
+ readonly shouldMinimizeOnClickOutside?: boolean;
51
63
  /**
52
64
  * Whether the minimized bar shows a Cancel button that closes the wrapped modal. Closing lets the
53
65
  * wrapped modal's own `onClose` define what "cancel" means (e.g. releasing a held lock).
@@ -86,6 +98,7 @@ export declare class MinimizableModal<TModal extends Modal> {
86
98
  private minimizedBarEl;
87
99
  private peekLockComponent;
88
100
  private peekLockEntry;
101
+ private readonly shouldMinimizeOnClickOutside;
89
102
  private readonly shouldShowCancelButton;
90
103
  /**
91
104
  * Wraps the given modal, adding a minimize button and wiring up cleanup on close.
@@ -110,6 +123,7 @@ export declare class MinimizableModal<TModal extends Modal> {
110
123
  private enablePeekLock;
111
124
  private flashBar;
112
125
  private handleClose;
126
+ private handleContainerClick;
113
127
  private patchOnClose;
114
128
  private removeMinimizedBar;
115
129
  }
@@ -678,4 +678,4 @@ async function invokeFileActionSafe(params) {
678
678
  saveNote,
679
679
  trashSafe
680
680
  });
681
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgT2JzaWRpYW4gVmF1bHQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIExpc3RlZEZpbGVzXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgcGFyZW50Rm9sZGVyUGF0aCxcbiAgVmlld1R5cGVcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXRoT3JBYnN0cmFjdEZpbGUsXG4gIFBhdGhPckZpbGUsXG4gIFBhdGhPckZvbGRlclxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvdXJjZS1sb2NrLnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxBbnkgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7XG4gIGFzRmlsZSxcbiAgYXNGb2xkZXIsXG4gIEZpbGVTeXN0ZW1UeXBlLFxuICBnZXRBYnN0cmFjdEZpbGUsXG4gIGdldEFic3RyYWN0RmlsZU9yTnVsbCxcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0RmlsZVN5c3RlbVR5cGUsXG4gIGdldEZvbGRlcixcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBnZXRQYXRoLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2Yge0BsaW5rIGNyZWF0ZUZvbGRlclNhZmV9LlxuICovXG5leHBvcnQgZW51bSBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBDcmVhdGVkID0gJ2NyZWF0ZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHdhcyBub3QgY3JlYXRlZCBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgKi9cbiAgTm90Q3JlYXRlZCA9ICdub3QtY3JlYXRlZCdcbn1cblxuLyoqXG4gKiBBIGJlaGF2aW9yIGZvciBoYW5kbGluZyBlbXB0eSBmb2xkZXJzIGR1cmluZyBjbGVhbnVwLlxuICovXG5leHBvcnQgZW51bSBFbXB0eUZvbGRlckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyLlxuICAgKi9cbiAgRGVsZXRlID0gJ0RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyIGFuZCBhbGwgaXRzIGVtcHR5IHBhcmVudHMuXG4gICAqL1xuICBEZWxldGVXaXRoRW1wdHlQYXJlbnRzID0gJ0RlbGV0ZVdpdGhFbXB0eVBhcmVudHMnLFxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBlbXB0eSBmb2xkZXIuXG4gICAqL1xuICBLZWVwID0gJ0tlZXAnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgaW52b2tlRmlsZUFjdGlvblNhZmV9LlxuICovXG5leHBvcnQgZW51bSBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdCB7XG4gIEludm9rZWQgPSAnaW52b2tlZCcsXG4gIE5vdEludm9rZWQgPSAnbm90LWludm9rZWQnXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNsZWFudXBFbXB0eUZvbGRlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsZWFudXBFbXB0eUZvbGRlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWhhdmlvciBkZXRlcm1pbmluZyBob3cgZW1wdHkgZm9sZGVycyBhcmUgY2xlYW5lZCB1cC5cbiAgICovXG4gIHJlYWRvbmx5IGVtcHR5Rm9sZGVyQmVoYXZpb3I6IEVtcHR5Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgZm9sZGVycyB0byBjbGVhbiB1cCB3aGVuIGVtcHR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyUGF0aHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBmb3Ige0BsaW5rIHByb2Nlc3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRBcmd1bWVudHMge1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcHlTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3B5U2FmZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIG5ldyBwYXRoIHRvIGNvcHkgdGhlIGZpbGUgdG8uXG4gICAqL1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvciBmaWxlIHRvIGNvcHkuXG4gICAqL1xuICByZWFkb25seSBvbGRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QWJzdHJhY3RGaWxlUGF0aFNhZmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBmaWxlIG9yIGZvbGRlciB0byBnZXQgYSBzYWZlIHBhdGggZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogRmlsZVN5c3RlbVR5cGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgYWJzdHJhY3QgZmlsZSB0byBnZXQgb3IgY3JlYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgYWJzdHJhY3QgZmlsZSB0byBnZXQgb3IgY3JlYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogRmlsZVN5c3RlbVR5cGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFNhZmVSZW5hbWVQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRTYWZlUmVuYW1lUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIG5ldyBwYXRoIHRvIHJlbmFtZSB0aGUgYWJzdHJhY3QgZmlsZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmVuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGludm9rZVdpdGhGaWxlU3lzdGVtTG9ja30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2tlV2l0aEZpbGVTeXN0ZW1Mb2NrUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgJGZ1bmN0aW9uKHRoaXM6IHZvaWQsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGZpbGUgc3lzdGVtIGxvY2sgb2YuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc0NoaWxkT3JTZWxmfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc0NoaWxkT3JTZWxmUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBjaGlsZCBvciBzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hpbGRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIHBhcmVudCBvciBzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50UGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc0NoaWxkfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc0NoaWxkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBjaGlsZC5cbiAgICovXG4gIHJlYWRvbmx5IGNoaWxkUGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBwYXJlbnQuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHByb2Nlc3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NPcHRpb25zIGV4dGVuZHMgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBub3RpY2UgY29tcG9uZW50IHVzZWQgdG8gc2hvdyB0aGUgdGltZW91dCBub3RpY2UuIFdoZW4gYG51bGxgLCBubyB0aW1lb3V0IG5vdGljZSBpcyBzaG93blxuICAgKiByZWdhcmRsZXNzIG9mIHtAbGluayBQcm9jZXNzT3B0aW9ucy5zaG91bGRTaG93VGltZW91dE5vdGljZX07IHRoZSB0aW1lb3V0IGlzIG9ubHkgbG9nZ2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBbiByZXNvdXJjZS1sb2NrIGNvbXBvbmVudCB1c2VkIHRvIGxvY2sgdGhlIGZpbGUncyBlZGl0b3IgcmVhZC1vbmx5IGZvciB0aGUgZHVyYXRpb24gb2ZcbiAgICogcHJvY2Vzc2luZy4gVGhlIGxvY2sgaXMgcmVmZXJlbmNlLWNvdW50ZWQsIHNvIGl0IGNvbXBvc2VzIHdpdGggYW55IG91dGVyIG9wZXJhdGlvbi1sZXZlbCBsb2NrXG4gICAqIG9uIHRoZSBzYW1lIG5vdGUuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZmFpbCBpZiB0aGUgZmlsZSBpcyBtaXNzaW5nIG9yIGRlbGV0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgYSB0aW1lb3V0IG5vdGljZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTaG93VGltZW91dE5vdGljZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHByb2Nlc3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UsIHR5cGljYWxseSB1c2VkIGZvciBhY2Nlc3NpbmcgdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgdmFsdWUgcHJvdmlkZXIgdGhhdCByZXR1cm5zIHRoZSBuZXcgY29udGVudCBiYXNlZCBvbiB0aGUgb2xkIGNvbnRlbnQgb2YgdGhlIGZpbGUuXG4gICAqIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIG9sZCBjb250ZW50IGFzIGFuIGFyZ3VtZW50IGFuZCByZXR1cm5zIHRoZSBuZXcgY29udGVudC5cbiAgICogSWYgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHNob3VsZCByZXR1cm4gYG51bGxgIGlmIHRoZSBwcm9jZXNzIHNob3VsZCBiZSByZXRyaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3Q29udGVudFByb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPG51bGwgfCBzdHJpbmcsIENvbnRlbnRBcmd1bWVudHM+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGJlIHByb2Nlc3NlZC4gSXQgY2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCBvciBhIGZpbGUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVuYW1lU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lU2FmZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIG5ldyBwYXRoIHRvIHJlbmFtZSB0aGUgZmlsZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmVuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbmludGVyZmFjZSBJbnZva2VGaWxlQWN0aW9uU2FmZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGFjdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBvbi5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhY3Rpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBmaWxlQWN0aW9uKHRoaXM6IHZvaWQsIGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gb24uXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIENsZWFucyB1cCBlbXB0eSBmb2xkZXJzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ge0BsaW5rIEVtcHR5Rm9sZGVyQmVoYXZpb3J9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY2xlYW5pbmcgdXAgZW1wdHkgZm9sZGVycy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2xlYW51cCBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFudXBFbXB0eUZvbGRlcnMocGFyYW1zOiBDbGVhbnVwRW1wdHlGb2xkZXJzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZW1wdHlGb2xkZXJCZWhhdmlvcixcbiAgICBmb2xkZXJQYXRoc1xuICB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IGZvbGRlclBhdGggb2YgZm9sZGVyUGF0aHMpIHtcbiAgICBzd2l0Y2ggKGVtcHR5Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgIGNhc2UgRW1wdHlGb2xkZXJCZWhhdmlvci5EZWxldGU6IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXIoYXBwLCBmb2xkZXJQYXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEVtcHR5Rm9sZGVyQmVoYXZpb3IuRGVsZXRlV2l0aEVtcHR5UGFyZW50czoge1xuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeShhcHAsIGZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwOiB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBhc3NlcnROZXZlcihlbXB0eUZvbGRlckJlaGF2aW9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb3BpZXMgYSBmaWxlIHNhZmVseSBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjb3B5aW5nIHRoZSBmaWxlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHBhdGggb2YgdGhlIGNvcGllZCBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weVNhZmUocGFyYW1zOiBDb3B5U2FmZVBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbmV3UGF0aCxcbiAgICBvbGRQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBvbGRQYXRoT3JGaWxlIH0pO1xuXG4gIGlmIChmaWxlLnBhdGggPT09IG5ld1BhdGgpIHtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxuXG4gIGNvbnN0IG5ld0ZvbGRlclBhdGggPSBwYXJlbnRGb2xkZXJQYXRoKG5ld1BhdGgpO1xuICBhd2FpdCBjcmVhdGVGb2xkZXJTYWZlKGFwcCwgbmV3Rm9sZGVyUGF0aCk7XG5cbiAgY29uc3QgbmV3QXZhaWxhYmxlUGF0aCA9IGdldEF2YWlsYWJsZVBhdGgoYXBwLCBuZXdQYXRoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC52YXVsdC5jb3B5KGZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhuZXdBdmFpbGFibGVQYXRoKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0F2YWlsYWJsZVBhdGg7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZvbGRlciBzYWZlbHkgaW4gdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB7QGxpbmsgQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdC5DcmVhdGVkfSBpZiB0aGUgZm9sZGVyIHdhc1xuICogY3JlYXRlZCwgb3Ige0BsaW5rIENyZWF0ZUZvbGRlclNhZmVSZXN1bHQuTm90Q3JlYXRlZH0gaWYgaXQgYWxyZWFkeSBleGlzdGVkLlxuICogQHRocm93cyBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIGZvbGRlciBhbmQgaXQgc3RpbGwgZG9lc24ndCBleGlzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUZvbGRlclNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8Q3JlYXRlRm9sZGVyU2FmZVJlc3VsdD4ge1xuICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgcmV0dXJuIENyZWF0ZUZvbGRlclNhZmVSZXN1bHQuTm90Q3JlYXRlZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbiAgICByZXR1cm4gQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdC5DcmVhdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0LkNyZWF0ZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHZhdWx0IHdpdGggcGFyZW50IGZvbGRlcnMgaWYgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBhbmQgYWxsIGl0cyBjcmVhdGVkIHBhcmVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUZW1wb3JhcnlGaWxlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IFByb21pc2U8dm9pZD4+IHtcbiAgbGV0IGZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBub29wQXN5bmM7XG4gIH1cblxuICBjb25zdCBmb2xkZXJDbGVhbnVwID0gYXdhaXQgY3JlYXRlVGVtcG9yYXJ5Rm9sZGVyKGFwcCwgcGFyZW50Rm9sZGVyUGF0aChwYXRoKSk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAudmF1bHQuY3JlYXRlKHBhdGgsICcnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGggfSk7XG4gICAgaWYgKCFmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGF3YWl0IHRyYXNoU2FmZShhcHAsIGZpbGUpO1xuICAgIH1cbiAgICBhd2FpdCBmb2xkZXJDbGVhbnVwKCk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBmb2xkZXIgaW4gdGhlIHZhdWx0IHdpdGggcGFyZW50IGZvbGRlcnMgaWYgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBkZWxldGUgdGhlIHRlbXBvcmFyeSBmb2xkZXIgYW5kIGFsbCBpdHMgY3JlYXRlZCBwYXJlbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVGVtcG9yYXJ5Rm9sZGVyKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IFByb21pc2U8dm9pZD4+IHtcbiAgbGV0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcCwgcGF0aE9yRm9sZGVyOiBwYXRoIH0pO1xuICBpZiAoZm9sZGVyKSB7XG4gICAgcmV0dXJuIG5vb3BBc3luYztcbiAgfVxuXG4gIGNvbnN0IGZvbGRlclBhdGggPSBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpO1xuICBhd2FpdCBjcmVhdGVUZW1wb3JhcnlGb2xkZXIoYXBwLCBmb2xkZXJQYXRoKTtcblxuICBjb25zdCBmb2xkZXJDbGVhbnVwID0gYXdhaXQgY3JlYXRlVGVtcG9yYXJ5Rm9sZGVyKGFwcCwgcGFyZW50Rm9sZGVyUGF0aChwYXRoKSk7XG5cbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIHBhdGgpO1xuXG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgZm9sZGVyID0gZ2V0Rm9sZGVyKHsgYXBwLCBwYXRoT3JGb2xkZXI6IHBhdGggfSk7XG4gICAgaWYgKCFmb2xkZXIuZGVsZXRlZCkge1xuICAgICAgYXdhaXQgdHJhc2hTYWZlKGFwcCwgZm9sZGVyKTtcbiAgICB9XG4gICAgYXdhaXQgZm9sZGVyQ2xlYW51cCgpO1xuICB9O1xufVxuXG4vKipcbiAqIERlbGV0ZXMgYW4gZW1wdHkgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIGZvbGRlciB0byBkZWxldGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbGRlciBpcyBkZWxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlRW1wdHlGb2xkZXIoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogbnVsbCB8IFBhdGhPckZvbGRlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHAsIHBhdGhPckZvbGRlciB9KTtcbiAgaWYgKCFmb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFhd2FpdCBpc0VtcHR5Rm9sZGVyKGFwcCwgZm9sZGVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0cmFzaFNhZmUoYXBwLCBmb2xkZXIpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZW1wdHkgZm9sZGVyIGhpZXJhcmNoeSBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgZm9sZGVyIHRvIHN0YXJ0IHJlbW92aW5nIGVtcHR5IGhpZXJhcmNoeSBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbXB0eSBoaWVyYXJjaHkgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IG51bGwgfCBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcCwgcGF0aE9yRm9sZGVyIH0pO1xuXG4gIHdoaWxlIChmb2xkZXIpIHtcbiAgICBpZiAoIWF3YWl0IGlzRW1wdHlGb2xkZXIoYXBwLCBmb2xkZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGZvbGRlci5wYXJlbnQ7XG4gICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXIoYXBwLCBmb2xkZXIpO1xuICAgIGZvbGRlciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSBzYWZlIHBhdGggZm9yIGEgZmlsZSBvciBmb2xkZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZXR0aW5nIGEgc2FmZSBwYXRoLlxuICogQHJldHVybnMgVGhlIHNhZmUgcGF0aCBmb3IgdGhlIGZpbGUgb3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWJzdHJhY3RGaWxlUGF0aFNhZmUocGFyYW1zOiBHZXRBYnN0cmFjdEZpbGVQYXRoU2FmZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGF0aCxcbiAgICB0eXBlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcblxuICBpZiAoYWJzdHJhY3RGaWxlICYmIGdldEZpbGVTeXN0ZW1UeXBlKGFic3RyYWN0RmlsZSkgPT09IHR5cGUpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuXG4gIHJldHVybiBnZXRBdmFpbGFibGVQYXRoKGFwcCwgcGF0aCk7XG59XG5cbi8qKlxuICogR2V0cyBhbiBhdmFpbGFibGUgcGF0aCBmb3IgYSBmaWxlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBnZXQgYW4gYXZhaWxhYmxlIHBhdGggZm9yLlxuICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBwYXRoIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF2YWlsYWJsZVBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUocGF0aCk7XG4gIHJldHVybiBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKGRpcm5hbWUocGF0aCksIGJhc2VuYW1lKHBhdGgsIGV4dGVuc2lvbikpLCBleHRlbnNpb24uc2xpY2UoMSkpO1xufVxuXG4vKipcbiAqIEdldHMgYSBzYWZlIGZpbGUgcGF0aCBmb3IgYSBmaWxlIG9yIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSBvciBmb2xkZXIgdG8gZ2V0IGEgc2FmZSBwYXRoIGZvci5cbiAqIEByZXR1cm5zIFRoZSBzYWZlIHBhdGggZm9yIHRoZSBmaWxlIG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVQYXRoU2FmZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlKHsgYXBwLCBwYXRoLCB0eXBlOiBGaWxlU3lzdGVtVHlwZS5GaWxlIH0pO1xufVxuXG4vKipcbiAqIEdldHMgYSBzYWZlIGZvbGRlciBwYXRoIGZvciBhIGZpbGUgb3IgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIG9yIGZvbGRlciB0byBnZXQgYSBzYWZlIHBhdGggZm9yLlxuICogQHJldHVybnMgVGhlIHNhZmUgcGF0aCBmb3IgdGhlIGZpbGUgb3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9sZGVyUGF0aFNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZSh7IGFwcCwgcGF0aCwgdHlwZTogRmlsZVN5c3RlbVR5cGUuRm9sZGVyIH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBNYXJrZG93biBmaWxlcyBmcm9tIHRoZSBhcHAncyB2YXVsdCBhbmQgc29ydHMgdGhlbSBhbHBoYWJldGljYWxseSBieSB0aGVpciBmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBNYXJrZG93biBmaWxlcyBzb3J0ZWQgYnkgZmlsZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya2Rvd25GaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKS5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgYWxsIG5vdGUgZmlsZXMgZnJvbSB0aGUgYXBwJ3MgdmF1bHQgYW5kIHNvcnRzIHRoZW0gYWxwaGFiZXRpY2FsbHkgYnkgdGhlaXIgZmlsZSBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYWxsIG5vdGUgZmlsZXMgaW4gdGhlIHZhdWx0IHNvcnRlZCBieSBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb3RlRmlsZXNTb3J0ZWQoYXBwOiBBcHApOiBURmlsZVtdIHtcbiAgcmV0dXJuIGFwcC52YXVsdC5nZXRBbGxMb2FkZWRGaWxlcygpLmZpbHRlcigoZmlsZSkgPT4gaXNGaWxlKGZpbGUpICYmIGlzTm90ZShmaWxlKSkuc29ydCgoYSwgYikgPT4gYS5wYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXRoKSkgYXMgVEZpbGVbXTtcbn1cblxuLyoqXG4gKiBHZXRzIG9yIGNyZWF0ZXMgYW4gYWJzdHJhY3QgZmlsZSBzYWZlbHkgaW4gdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIHJldHVybmVkLlxuICogSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZXR0aW5nIG9yIGNyZWF0aW5nIHRoZSBhYnN0cmFjdCBmaWxlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYWJzdHJhY3QgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZShwYXJhbXM6IEdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZVBhcmFtcyk6IFByb21pc2U8VEFic3RyYWN0RmlsZT4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHR5cGVcbiAgfSA9IHBhcmFtcztcbiAgbGV0IHsgcGF0aCB9ID0gcGFyYW1zO1xuICBwYXRoID0gZ2V0QWJzdHJhY3RGaWxlUGF0aFNhZmUoeyBhcHAsIHBhdGgsIHR5cGUgfSk7XG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcbiAgaWYgKGFic3RyYWN0RmlsZSkge1xuICAgIHJldHVybiBhYnN0cmFjdEZpbGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEZpbGVTeXN0ZW1UeXBlLkZpbGU6IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuY3JlYXRlKHBhdGgsICcnKTtcbiAgICB9XG4gICAgY2FzZSBGaWxlU3lzdGVtVHlwZS5Gb2xkZXI6IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuY3JlYXRlRm9sZGVyKHBhdGgpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcih0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIG9yIGNyZWF0ZXMgYSBmaWxlIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBnZXQgb3IgY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlRmlsZVNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8VEZpbGU+IHtcbiAgcmV0dXJuIGFzRmlsZShhd2FpdCBnZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmUoeyBhcHAsIHBhdGgsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlLkZpbGUgfSkpO1xufVxuXG4vKipcbiAqIEdldHMgb3IgY3JlYXRlcyBhIGZvbGRlciBzYWZlbHkgaW4gdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIElmIHRoZSBmb2xkZXIgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBJZiB0aGUgZm9sZGVyIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gZ2V0IG9yIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlRm9sZGVyU2FmZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxURm9sZGVyPiB7XG4gIHJldHVybiBhc0ZvbGRlcihhd2FpdCBnZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmUoeyBhcHAsIHBhdGgsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlLkZvbGRlciB9KSk7XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgcmVuYW1lIHBhdGggZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdldHRpbmcgYSBzYWZlIHJlbmFtZSBwYXRoLlxuICogQHJldHVybnMgVGhlIHNhZmUgcmVuYW1lIHBhdGggZm9yIHRoZSBhYnN0cmFjdCBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmZVJlbmFtZVBhdGgocGFyYW1zOiBHZXRTYWZlUmVuYW1lUGF0aFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGUgfSA9IHBhcmFtcztcbiAgbGV0IHsgbmV3UGF0aCB9ID0gcGFyYW1zO1xuICBjb25zdCBvbGRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFBhdGhPckFic3RyYWN0RmlsZSk7XG5cbiAgaWYgKGdldERhdGFBZGFwdGVyRXgoYXBwKS5pbnNlbnNpdGl2ZSkge1xuICAgIGxldCBmb2xkZXJQYXRoID0gZGlybmFtZShuZXdQYXRoKTtcbiAgICBsZXQgbm9uRXhpc3RpbmdQYXRoID0gYmFzZW5hbWUobmV3UGF0aCk7XG4gICAgbGV0IGZvbGRlcjogbnVsbCB8IFRGb2xkZXI7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gVGhlcmUgaXMgbm8gZWxlZ2FudCB3YXkgdG8gcGVyZm9ybSBpbmZpbml0ZSBsb29wcy5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwLCBpc0Nhc2VJbnNlbnNpdGl2ZTogdHJ1ZSwgcGF0aE9yRm9sZGVyOiBmb2xkZXJQYXRoIH0pO1xuICAgICAgaWYgKGZvbGRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vbkV4aXN0aW5nUGF0aCA9IGpvaW4oYmFzZW5hbWUoZm9sZGVyUGF0aCksIG5vbkV4aXN0aW5nUGF0aCk7XG4gICAgICBmb2xkZXJQYXRoID0gZGlybmFtZShmb2xkZXJQYXRoKTtcbiAgICB9XG4gICAgbmV3UGF0aCA9IGpvaW4oZm9sZGVyLmdldFBhcmVudFByZWZpeCgpLCBub25FeGlzdGluZ1BhdGgpO1xuICB9XG5cbiAgaWYgKG9sZFBhdGgudG9Mb3dlckNhc2UoKSA9PT0gbmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIG5ld1BhdGgpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBmaWxlIHN5c3RlbSBsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgaW52b2tpbmcgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGZpbGUgc3lzdGVtIGxvY2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGludm9rZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZva2VXaXRoRmlsZVN5c3RlbUxvY2socGFyYW1zOiBJbnZva2VXaXRoRmlsZVN5c3RlbUxvY2tQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgICRmdW5jdGlvbixcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgYXdhaXQgYXBwLnZhdWx0LnByb2Nlc3MoZmlsZSwgKGNvbnRlbnQpID0+IHtcbiAgICAkZnVuY3Rpb24oY29udGVudCk7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9mIGFub3RoZXIgcGF0aCBvciBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY2hlY2tpbmcgd2hldGhlciB0aGUgY2hpbGQgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb2YgdGhlIHBhcmVudCBwYXRoIG9yIGZpbGUuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjaGlsZCBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IHBhdGggb3IgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGQocGFyYW1zOiBJc0NoaWxkUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY2hpbGRQYXRoT3JGaWxlLFxuICAgIHBhcmVudFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgY2hpbGRQYXRoID0gZ2V0UGF0aChhcHAsIGNoaWxkUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHBhcmVudFBhdGggPSBnZXRQYXRoKGFwcCwgcGFyZW50UGF0aE9yRmlsZSk7XG5cbiAgaWYgKGNoaWxkUGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChwYXJlbnRQYXRoID09PSAnLycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZFBhdGguc3RhcnRzV2l0aChgJHtwYXJlbnRQYXRofS9gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvciBzZWxmIG9mIGFub3RoZXIgcGF0aCBvciBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY2hlY2tpbmcgd2hldGhlciB0aGUgY2hpbGQgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb3Igc2VsZiBvZiB0aGUgcGFyZW50IHBhdGggb3IgZmlsZS5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNoaWxkIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9yIHNlbGYgb2YgdGhlIHBhcmVudCBwYXRoIG9yIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NoaWxkT3JTZWxmKHBhcmFtczogSXNDaGlsZE9yU2VsZlBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNoaWxkUGF0aE9yRmlsZSxcbiAgICBwYXJlbnRQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNoaWxkUGF0aCA9IGdldFBhdGgoYXBwLCBjaGlsZFBhdGhPckZpbGUpO1xuICBjb25zdCBwYXJlbnRQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmVudFBhdGhPckZpbGUpO1xuICByZXR1cm4gY2hpbGRQYXRoID09PSBwYXJlbnRQYXRoIHx8IGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZSwgcGFyZW50UGF0aE9yRmlsZSB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmb2xkZXIgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgcGF0aCBvciBmb2xkZXIgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZvbGRlciBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzRW1wdHlGb2xkZXIoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGxpc3RlZEZpbGVzID0gYXdhaXQgbGlzdFNhZmUoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRm9sZGVyKSk7XG4gIHJldHVybiBsaXN0ZWRGaWxlcy5maWxlcy5sZW5ndGggPT09IDAgJiYgbGlzdGVkRmlsZXMuZm9sZGVycy5sZW5ndGggPT09IDA7XG59XG5cbi8qKlxuICogU2FmZWx5IGxpc3RzIHRoZSBmaWxlcyBhbmQgZm9sZGVycyBhdCB0aGUgc3BlY2lmaWVkIHBhdGggaW4gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIHBhdGggb3IgZm9sZGVyIHRvIGxpc3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIExpc3RlZEZpbGVzfSBvYmplY3QgY29udGFpbmluZyB0aGUgbGlzdGVkIGZpbGVzIGFuZCBmb2xkZXJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNhZmUoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyKTogUHJvbWlzZTxMaXN0ZWRGaWxlcz4ge1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZvbGRlcik7XG4gIGNvbnN0IEVNUFRZID0geyBmaWxlczogW10sIGZvbGRlcnM6IFtdIH07XG5cbiAgY29uc3QgcGF0aFN0YXRzID0gYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuc3RhdChwYXRoKTtcbiAgaWYgKHBhdGhTdGF0cz8udHlwZSAhPT0gJ2ZvbGRlcicpIHtcbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5saXN0KHBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChhd2FpdCBhcHAudmF1bHQuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGEgZmlsZSB3aXRoIHJldHJ5IGxvZ2ljLCB1cGRhdGluZyBpdHMgY29udGVudCBiYXNlZCBvbiBhIHByb3ZpZGVkIHZhbHVlIG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcHJvY2Vzc2luZyB0aGUgZmlsZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHByb2Nlc3MgaXMgY29tcGxldGUuXG4gKlxuICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBwcm9jZXNzIGZhaWxzIGFmdGVyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHJldHJpZXMgb3IgdGltZW91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3MocGFyYW1zOiBQcm9jZXNzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbmV3Q29udGVudFByb3ZpZGVyLFxuICAgIHBhdGhPckZpbGUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgIHJlc291cmNlTG9ja0NvbXBvbmVudFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMgPSB7XG4gICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IHRydWUsXG4gICAgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U6IHRydWUsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRGVmYXVsdCB2YWx1ZS5cbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDUwMFxuICB9O1xuICBjb25zdCBmdWxsT3B0aW9ucyA9IHsgLi4uREVGQVVMVF9SRVRSWV9PUFRJT05TLCAuLi5wYXJhbXMgfTtcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBmdWxsT3B0aW9ucy5hYm9ydFNpZ25hbCA9IGFib3J0U2lnbmFsQW55KGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsLCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcblxuICAvLyBSZWZlcmVuY2UtY291bnRlZCBsb2NrOyBjb21wb3NlcyB3aXRoIGFueSBvdXRlciBsb2NrLiBSZWxlYXNlZCBhdCBmdW5jdGlvbiBzY29wZSBleGl0LlxuICB1c2luZyBfbG9jayA9IHJlc291cmNlTG9ja0NvbXBvbmVudD8ubG9ja0ZvclBhdGgoeyBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJywgcGF0aE9yRmlsZSB9KTtcblxuICBhd2FpdCByZXRyeVdpdGhUaW1lb3V0Tm90aWNlKHtcbiAgICBhc3luYyBvcGVyYXRpb25GdW5jdGlvbihhYm9ydFNpZ25hbCkge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IHJlYWRTYWZlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBpZiAob2xkQ29udGVudCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc2hvdWxkVHJlYXRNaXNzaW5nRmlsZUFzU3VjY2VzcygpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgcmVzb2x2ZVZhbHVlKG5ld0NvbnRlbnRQcm92aWRlciwgeyBhYm9ydFNpZ25hbCwgY29udGVudDogb2xkQ29udGVudCB9KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGlmIChuZXdDb250ZW50ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU3VjY2VzcyA9IHRydWU7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbnZva2VGaWxlQWN0aW9uU2FmZSh7XG4gICAgICAgIGFwcCxcbiAgICAgICAgYXN5bmMgZmlsZUFjdGlvbihmaWxlKSB7XG4gICAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICBhd2FpdCBhcHAudmF1bHQucHJvY2VzcyhmaWxlLCAoY29udGVudCkgPT4ge1xuICAgICAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdWYXVsdDpwcm9jZXNzJykoJ0NvbnRlbnQgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzIHJlYWQuIFJldHJ5aW5nLi4uJywge1xuICAgICAgICAgICAgICAgIGFjdHVhbENvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBvbGRDb250ZW50LFxuICAgICAgICAgICAgICAgIHBhdGg6IGZpbGUucGF0aFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3Q29udGVudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHBhdGhPckZpbGVcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdC5Ob3RJbnZva2VkKSB7XG4gICAgICAgIHJldHVybiBzaG91bGRUcmVhdE1pc3NpbmdGaWxlQXNTdWNjZXNzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc1N1Y2Nlc3M7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBDbG9zZXMgb3ZlciBgZnVsbE9wdGlvbnNgIGFuZCBgcGF0aGAgZnJvbSB0aGUgZW5jbG9zaW5nIHNjb3BlLCBzbyBpdCBjYW5ub3QgYmUgaG9pc3RlZC5cbiAgICAgIGZ1bmN0aW9uIHNob3VsZFRyZWF0TWlzc2luZ0ZpbGVBc1N1Y2Nlc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChmdWxsT3B0aW9ucy5zaG91bGRGYWlsT25NaXNzaW5nRmlsZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAnJHtwYXRofScgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMudmF1bHQucHJvY2Vzc0ZpbGUsIHsgZmlsZVBhdGg6IHBhdGggfSksXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgIHJldHJ5T3B0aW9uczogZnVsbE9wdGlvbnMsXG4gICAgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U6IGZ1bGxPcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjb250ZW50IG9mIGEgZmlsZSBzYWZlbHkgZnJvbSB0aGUgdmF1bHQuXG4gKlxuICogSXQgY292ZXJzIHRoZSBjYXNlIHdoZW4gdGhlIGZpbGUgd2FzIHJlbW92ZWQgZHVyaW5nIHRoZSByZWFkaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmVhZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgb3IgYG51bGxgIGlmIHRoZSBmaWxlIGlzIG1pc3Npbmcgb3IgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTYWZlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGxldCBjb250ZW50OiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgYXdhaXQgaW52b2tlRmlsZUFjdGlvblNhZmUoe1xuICAgIGFwcCxcbiAgICBhc3luYyBmaWxlQWN0aW9uKGZpbGUpIHtcbiAgICAgIGF3YWl0IHNhdmVOb3RlKGFwcCwgZmlsZSk7XG4gICAgICBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlXG4gIH0pO1xuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGEgZmlsZSBzYWZlbHkgaW4gdGhlIHZhdWx0LlxuICogSWYgdGhlIG5ldyBwYXRoIGFscmVhZHkgZXhpc3RzLCB0aGUgZmlsZSB3aWxsIGJlIHJlbmFtZWQgdG8gYW4gYXZhaWxhYmxlIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZW5hbWluZyB0aGUgZmlsZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYXRoIG9mIHRoZSBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuYW1lU2FmZShwYXJhbXM6IFJlbmFtZVNhZmVQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5ld1BhdGgsXG4gICAgb2xkUGF0aE9yQWJzdHJhY3RGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IG9sZEFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogb2xkUGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuXG4gIGNvbnN0IG5ld0F2YWlsYWJsZVBhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh7IGFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuXG4gIGlmIChvbGRBYnN0cmFjdEZpbGUucGF0aC50b0xvd2VyQ2FzZSgpID09PSBuZXdBdmFpbGFibGVQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBpZiAob2xkQWJzdHJhY3RGaWxlLnBhdGggIT09IG5ld1BhdGgpIHtcbiAgICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKG9sZEFic3RyYWN0RmlsZSwgbmV3QXZhaWxhYmxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdBdmFpbGFibGVQYXRoO1xuICB9XG5cbiAgY29uc3QgbmV3Rm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgobmV3QXZhaWxhYmxlUGF0aCk7XG4gIGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUoYXBwLCBuZXdGb2xkZXJQYXRoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKG9sZEFic3RyYWN0RmlsZSwgbmV3QXZhaWxhYmxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG5ld0F2YWlsYWJsZVBhdGgpIHx8IGF3YWl0IGFwcC52YXVsdC5leGlzdHMob2xkQWJzdHJhY3RGaWxlLnBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbn1cblxuLyoqXG4gKiBTYXZlcyB0aGUgc3BlY2lmaWVkIG5vdGUgaW4gdGhlIE9ic2lkaWFuIGFwcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIG5vdGUgdG8gYmUgc2F2ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5vdGUgaXMgc2F2ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlTm90ZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcblxuICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyAmJiBsZWFmLnZpZXcuZmlsZT8ucGF0aCA9PT0gcGF0aCAmJiBsZWFmLnZpZXcuZGlydHkpIHtcbiAgICAgIGF3YWl0IGxlYWYudmlldy5zYXZlKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHJhc2hlcyBhbiBhYnN0cmFjdCBmaWxlIHNhZmVseSBmcm9tIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlIHRvIHRyYXNoLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGlzIHRyYXNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFzaFNhZmUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICBpZiAoIWZpbGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci50cmFzaEZpbGUoZmlsZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGF3YWl0IGFwcC52YXVsdC5leGlzdHMoZmlsZS5wYXRoKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZhdWx0OnRyYXNoU2FmZScpKGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cmFzaGluZyAke2ZpbGUucGF0aH0sIGJ1dCB0aGUgZmlsZSBubyBsb25nZXIgZXhpc3RzLmAsIHsgZXJyb3IsIHBhdGg6IGZpbGUucGF0aCB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbnZva2VGaWxlQWN0aW9uU2FmZShwYXJhbXM6IEludm9rZUZpbGVBY3Rpb25TYWZlUGFyYW1zKTogUHJvbWlzZTxJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGZpbGVBY3Rpb24sXG4gICAgcGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICBsZXQgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGggfSk7XG4gIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICByZXR1cm4gSW52b2tlRmlsZUFjdGlvblNhZmVSZXN1bHQuTm90SW52b2tlZDtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGZpbGVBY3Rpb24oZmlsZSk7XG4gICAgcmV0dXJuIEludm9rZUZpbGVBY3Rpb25TYWZlUmVzdWx0Lkludm9rZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGggfSk7XG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIEludm9rZUZpbGVBY3Rpb25TYWZlUmVzdWx0Lk5vdEludm9rZWQ7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSw2QkFJTztBQUNQLHNCQUtPO0FBWVAsOEJBQStCO0FBQy9CLG1CQUErQjtBQUMvQixzQkFBMEI7QUFDMUIsa0JBS087QUFDUCx5QkFBNEI7QUFDNUIsNEJBQTZCO0FBQzdCLCtCQUF1QztBQUN2Qyx5QkFlTztBQUNQLGtCQUFrQjtBQUtYLElBQUsseUJBQUwsa0JBQUtBLDRCQUFMO0FBSUwsRUFBQUEsd0JBQUEsYUFBVTtBQUtWLEVB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
681
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgT2JzaWRpYW4gVmF1bHQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIExpc3RlZEZpbGVzXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgcGFyZW50Rm9sZGVyUGF0aCxcbiAgVmlld1R5cGVcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXRoT3JBYnN0cmFjdEZpbGUsXG4gIFBhdGhPckZpbGUsXG4gIFBhdGhPckZvbGRlclxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvdXJjZS1sb2NrLnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxBbnkgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7XG4gIGFzRmlsZSxcbiAgYXNGb2xkZXIsXG4gIEZpbGVTeXN0ZW1UeXBlLFxuICBnZXRBYnN0cmFjdEZpbGUsXG4gIGdldEFic3RyYWN0RmlsZU9yTnVsbCxcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0RmlsZVN5c3RlbVR5cGUsXG4gIGdldEZvbGRlcixcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBnZXRQYXRoLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2Yge0BsaW5rIGNyZWF0ZUZvbGRlclNhZmV9LlxuICovXG5leHBvcnQgZW51bSBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBDcmVhdGVkID0gJ2NyZWF0ZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHdhcyBub3QgY3JlYXRlZCBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgKi9cbiAgTm90Q3JlYXRlZCA9ICdub3QtY3JlYXRlZCdcbn1cblxuLyoqXG4gKiBBIGJlaGF2aW9yIGZvciBoYW5kbGluZyBlbXB0eSBmb2xkZXJzIGR1cmluZyBjbGVhbnVwLlxuICovXG5leHBvcnQgZW51bSBFbXB0eUZvbGRlckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyLlxuICAgKi9cbiAgRGVsZXRlID0gJ0RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyIGFuZCBhbGwgaXRzIGVtcHR5IHBhcmVudHMuXG4gICAqL1xuICBEZWxldGVXaXRoRW1wdHlQYXJlbnRzID0gJ0RlbGV0ZVdpdGhFbXB0eVBhcmVudHMnLFxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBlbXB0eSBmb2xkZXIuXG4gICAqL1xuICBLZWVwID0gJ0tlZXAnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgaW52b2tlRmlsZUFjdGlvblNhZmV9LlxuICovXG5leHBvcnQgZW51bSBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdCB7XG4gIEludm9rZWQgPSAnaW52b2tlZCcsXG4gIE5vdEludm9rZWQgPSAnbm90LWludm9rZWQnXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNsZWFudXBFbXB0eUZvbGRlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsZWFudXBFbXB0eUZvbGRlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWhhdmlvciBkZXRlcm1pbmluZyBob3cgZW1wdHkgZm9sZGVycyBhcmUgY2xlYW5lZCB1cC5cbiAgICovXG4gIHJlYWRvbmx5IGVtcHR5Rm9sZGVyQmVoYXZpb3I6IEVtcHR5Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgZm9sZGVycyB0byBjbGVhbiB1cCB3aGVuIGVtcHR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyUGF0aHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBmb3Ige0BsaW5rIHByb2Nlc3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRBcmd1bWVudHMge1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29weVNhZmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcHlTYWZlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhdGggdG8gY29weSB0aGUgZmlsZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9yIGZpbGUgdG8gY29weS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBYnN0cmFjdEZpbGVQYXRoU2FmZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyIHRvIGdldCBhIHNhZmUgcGF0aCBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0U2FmZVJlbmFtZVBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFNhZmVSZW5hbWVQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhdGggdG8gcmVuYW1lIHRoZSBhYnN0cmFjdCBmaWxlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZW5hbWUuXG4gICAqL1xuICByZWFkb25seSBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW52b2tlV2l0aEZpbGVTeXN0ZW1Mb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZva2VXaXRoRmlsZVN5c3RlbUxvY2tQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuXG4gICAqL1xuICAkZnVuY3Rpb24odGhpczogdm9pZCwgY29udGVudDogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gbG9jayBvZi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzQ2hpbGRPclNlbGZ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ2hpbGRPclNlbGZQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIGNoaWxkIG9yIHNlbGYuXG4gICAqL1xuICByZWFkb25seSBjaGlsZFBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjayB3aGV0aGVyIGl0IGlzIGEgcGFyZW50IG9yIHNlbGYuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzQ2hpbGR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ2hpbGRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIGNoaWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hpbGRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIHBhcmVudC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudFBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcHJvY2Vzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogUGx1Z2luIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byBzaG93IHRoZSB0aW1lb3V0IG5vdGljZS4gV2hlbiBgbnVsbGAsIG5vIHRpbWVvdXQgbm90aWNlIGlzIHNob3duXG4gICAqIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIFByb2Nlc3NPcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlfTsgdGhlIHRpbWVvdXQgaXMgb25seSBsb2dnZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwgfCBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFuIHJlc291cmNlLWxvY2sgY29tcG9uZW50IHVzZWQgdG8gbG9jayB0aGUgZmlsZSdzIGVkaXRvciByZWFkLW9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZlxuICAgKiBwcm9jZXNzaW5nLiBUaGUgbG9jayBpcyByZWZlcmVuY2UtY291bnRlZCwgc28gaXQgY29tcG9zZXMgd2l0aCBhbnkgb3V0ZXIgb3BlcmF0aW9uLWxldmVsIGxvY2tcbiAgICogb24gdGhlIHNhbWUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmYWlsIGlmIHRoZSBmaWxlIGlzIG1pc3Npbmcgb3IgZGVsZXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGYWlsT25NaXNzaW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcHJvY2Vzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc1BhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSwgdHlwaWNhbGx5IHVzZWQgZm9yIGFjY2Vzc2luZyB0aGUgdmF1bHQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSB2YWx1ZSBwcm92aWRlciB0aGF0IHJldHVybnMgdGhlIG5ldyBjb250ZW50IGJhc2VkIG9uIHRoZSBvbGQgY29udGVudCBvZiB0aGUgZmlsZS5cbiAgICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgb2xkIGNvbnRlbnQgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIG5ldyBjb250ZW50LlxuICAgKiBJZiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgaXQgc2hvdWxkIHJldHVybiBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgc2hvdWxkIGJlIHJldHJpZWQuXG4gICAqL1xuICByZWFkb25seSBuZXdDb250ZW50UHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8bnVsbCB8IHN0cmluZywgQ29udGVudEFyZ3VtZW50cz47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gYmUgcHJvY2Vzc2VkLiBJdCBjYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIG9yIGEgZmlsZSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZW5hbWVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVTYWZlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhdGggdG8gcmVuYW1lIHRoZSBmaWxlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZW5hbWUuXG4gICAqL1xuICByZWFkb25seSBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuaW50ZXJmYWNlIEludm9rZUZpbGVBY3Rpb25TYWZlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9uLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFjdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGZpbGVBY3Rpb24odGhpczogdm9pZCwgZmlsZTogVEZpbGUpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIGVtcHR5IGZvbGRlcnMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgRW1wdHlGb2xkZXJCZWhhdmlvcn0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjbGVhbmluZyB1cCBlbXB0eSBmb2xkZXJzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGVhbnVwIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYW51cEVtcHR5Rm9sZGVycyhwYXJhbXM6IENsZWFudXBFbXB0eUZvbGRlcnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBlbXB0eUZvbGRlckJlaGF2aW9yLFxuICAgIGZvbGRlclBhdGhzXG4gIH0gPSBwYXJhbXM7XG4gIGZvciAoY29uc3QgZm9sZGVyUGF0aCBvZiBmb2xkZXJQYXRocykge1xuICAgIHN3aXRjaCAoZW1wdHlGb2xkZXJCZWhhdmlvcikge1xuICAgICAgY2FzZSBFbXB0eUZvbGRlckJlaGF2aW9yLkRlbGV0ZToge1xuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlcihhcHAsIGZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRW1wdHlGb2xkZXJCZWhhdmlvci5EZWxldGVXaXRoRW1wdHlQYXJlbnRzOiB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KGFwcCwgZm9sZGVyUGF0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXA6IHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGFzc2VydE5ldmVyKGVtcHR5Rm9sZGVyQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcGllcyBhIGZpbGUgc2FmZWx5IGluIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNvcHlpbmcgdGhlIGZpbGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgcGF0aCBvZiB0aGUgY29waWVkIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5U2FmZShwYXJhbXM6IENvcHlTYWZlUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBuZXdQYXRoLFxuICAgIG9sZFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IG9sZFBhdGhPckZpbGUgfSk7XG5cbiAgaWYgKGZpbGUucGF0aCA9PT0gbmV3UGF0aCkge1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG5cbiAgY29uc3QgbmV3Rm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgobmV3UGF0aCk7XG4gIGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUoYXBwLCBuZXdGb2xkZXJQYXRoKTtcblxuICBjb25zdCBuZXdBdmFpbGFibGVQYXRoID0gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIG5ld1BhdGgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNvcHkoZmlsZSwgbmV3QXZhaWxhYmxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG5ld0F2YWlsYWJsZVBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZm9sZGVyIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHtAbGluayBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0LkNyZWF0ZWR9IGlmIHRoZSBmb2xkZXIgd2FzXG4gKiBjcmVhdGVkLCBvciB7QGxpbmsgQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdC5Ob3RDcmVhdGVkfSBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQuXG4gKiBAdGhyb3dzIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgZm9sZGVyIGFuZCBpdCBzdGlsbCBkb2Vzbid0IGV4aXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRm9sZGVyU2FmZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxDcmVhdGVGb2xkZXJTYWZlUmVzdWx0PiB7XG4gIGlmIChhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICByZXR1cm4gQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdC5Ob3RDcmVhdGVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAudmF1bHQuY3JlYXRlRm9sZGVyKHBhdGgpO1xuICAgIHJldHVybiBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0LkNyZWF0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIENyZWF0ZUZvbGRlclNhZmVSZXN1bHQuQ3JlYXRlZDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgdmF1bHQgd2l0aCBwYXJlbnQgZm9sZGVycyBpZiBuZWVkZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlIGFuZCBhbGwgaXRzIGNyZWF0ZWQgcGFyZW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRlbXBvcmFyeUZpbGUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICBsZXQgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGggfSk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIG5vb3BBc3luYztcbiAgfVxuXG4gIGNvbnN0IGZvbGRlckNsZWFudXAgPSBhd2FpdCBjcmVhdGVUZW1wb3JhcnlGb2xkZXIoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUocGF0aCwgJycpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcbiAgICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgICAgYXdhaXQgdHJhc2hTYWZlKGFwcCwgZmlsZSk7XG4gICAgfVxuICAgIGF3YWl0IGZvbGRlckNsZWFudXAoKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZvbGRlciBpbiB0aGUgdmF1bHQgd2l0aCBwYXJlbnQgZm9sZGVycyBpZiBuZWVkZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZvbGRlciBhbmQgYWxsIGl0cyBjcmVhdGVkIHBhcmVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUZW1wb3JhcnlGb2xkZXIoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICBsZXQgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwLCBwYXRoT3JGb2xkZXI6IHBhdGggfSk7XG4gIGlmIChmb2xkZXIpIHtcbiAgICByZXR1cm4gbm9vcEFzeW5jO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgocGF0aCk7XG4gIGF3YWl0IGNyZWF0ZVRlbXBvcmFyeUZvbGRlcihhcHAsIGZvbGRlclBhdGgpO1xuXG4gIGNvbnN0IGZvbGRlckNsZWFudXAgPSBhd2FpdCBjcmVhdGVUZW1wb3JhcnlGb2xkZXIoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpKTtcblxuICBhd2FpdCBjcmVhdGVGb2xkZXJTYWZlKGFwcCwgcGF0aCk7XG5cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBmb2xkZXIgPSBnZXRGb2xkZXIoeyBhcHAsIHBhdGhPckZvbGRlcjogcGF0aCB9KTtcbiAgICBpZiAoIWZvbGRlci5kZWxldGVkKSB7XG4gICAgICBhd2FpdCB0cmFzaFNhZmUoYXBwLCBmb2xkZXIpO1xuICAgIH1cbiAgICBhd2FpdCBmb2xkZXJDbGVhbnVwKCk7XG4gIH07XG59XG5cbi8qKlxuICogRGVsZXRlcyBhbiBlbXB0eSBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgZm9sZGVyIHRvIGRlbGV0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZm9sZGVyIGlzIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVFbXB0eUZvbGRlcihhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBudWxsIHwgUGF0aE9yRm9sZGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcCwgcGF0aE9yRm9sZGVyIH0pO1xuICBpZiAoIWZvbGRlcikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWF3YWl0IGlzRW1wdHlGb2xkZXIoYXBwLCBmb2xkZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IHRyYXNoU2FmZShhcHAsIGZvbGRlcik7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBlbXB0eSBmb2xkZXIgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBmb2xkZXIgdG8gc3RhcnQgcmVtb3ZpbmcgZW1wdHkgaGllcmFyY2h5IGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVtcHR5IGhpZXJhcmNoeSBpcyBkZWxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogbnVsbCB8IFBhdGhPckZvbGRlcik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwLCBwYXRoT3JGb2xkZXIgfSk7XG5cbiAgd2hpbGUgKGZvbGRlcikge1xuICAgIGlmICghYXdhaXQgaXNFbXB0eUZvbGRlcihhcHAsIGZvbGRlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZm9sZGVyLnBhcmVudDtcbiAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlcihhcHAsIGZvbGRlcik7XG4gICAgZm9sZGVyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgcGF0aCBmb3IgYSBmaWxlIG9yIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdldHRpbmcgYSBzYWZlIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgc2FmZSBwYXRoIGZvciB0aGUgZmlsZSBvciBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZShwYXJhbXM6IEdldEFic3RyYWN0RmlsZVBhdGhTYWZlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoLFxuICAgIHR5cGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuXG4gIGlmIChhYnN0cmFjdEZpbGUgJiYgZ2V0RmlsZVN5c3RlbVR5cGUoYWJzdHJhY3RGaWxlKSA9PT0gdHlwZSkge1xuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgcmV0dXJuIGdldEF2YWlsYWJsZVBhdGgoYXBwLCBwYXRoKTtcbn1cblxuLyoqXG4gKiBHZXRzIGFuIGF2YWlsYWJsZSBwYXRoIGZvciBhIGZpbGUgaW4gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGdldCBhbiBhdmFpbGFibGUgcGF0aCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgYXZhaWxhYmxlIHBhdGggZm9yIHRoZSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShwYXRoKTtcbiAgcmV0dXJuIGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlybmFtZShwYXRoKSwgYmFzZW5hbWUocGF0aCwgZXh0ZW5zaW9uKSksIGV4dGVuc2lvbi5zbGljZSgxKSk7XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgZmlsZSBwYXRoIGZvciBhIGZpbGUgb3IgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIG9yIGZvbGRlciB0byBnZXQgYSBzYWZlIHBhdGggZm9yLlxuICogQHJldHVybnMgVGhlIHNhZmUgcGF0aCBmb3IgdGhlIGZpbGUgb3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZVBhdGhTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0QWJzdHJhY3RGaWxlUGF0aFNhZmUoeyBhcHAsIHBhdGgsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlLkZpbGUgfSk7XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgZm9sZGVyIHBhdGggZm9yIGEgZmlsZSBvciBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyIHRvIGdldCBhIHNhZmUgcGF0aCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgc2FmZSBwYXRoIGZvciB0aGUgZmlsZSBvciBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoU2FmZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlKHsgYXBwLCBwYXRoLCB0eXBlOiBGaWxlU3lzdGVtVHlwZS5Gb2xkZXIgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFuIGFycmF5IG9mIE1hcmtkb3duIGZpbGVzIGZyb20gdGhlIGFwcCdzIHZhdWx0IGFuZCBzb3J0cyB0aGVtIGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyIGZpbGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIE1hcmtkb3duIGZpbGVzIHNvcnRlZCBieSBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXJrZG93bkZpbGVzU29ydGVkKGFwcDogQXBwKTogVEZpbGVbXSB7XG4gIHJldHVybiBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBmcm9tIHRoZSBhcHAncyB2YXVsdCBhbmQgc29ydHMgdGhlbSBhbHBoYWJldGljYWxseSBieSB0aGVpciBmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBpbiB0aGUgdmF1bHQgc29ydGVkIGJ5IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vdGVGaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKCkuZmlsdGVyKChmaWxlKSA9PiBpc0ZpbGUoZmlsZSkgJiYgaXNOb3RlKGZpbGUpKS5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKSBhcyBURmlsZVtdO1xufVxuXG4vKipcbiAqIEdldHMgb3IgY3JlYXRlcyBhbiBhYnN0cmFjdCBmaWxlIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdldHRpbmcgb3IgY3JlYXRpbmcgdGhlIGFic3RyYWN0IGZpbGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnN0cmFjdCBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlKHBhcmFtczogR2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlUGFyYW1zKTogUHJvbWlzZTxUQWJzdHJhY3RGaWxlPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgdHlwZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBwYXRoIH0gPSBwYXJhbXM7XG4gIHBhdGggPSBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZSh7IGFwcCwgcGF0aCwgdHlwZSB9KTtcbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuICBpZiAoYWJzdHJhY3RGaWxlKSB7XG4gICAgcmV0dXJuIGFic3RyYWN0RmlsZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRmlsZVN5c3RlbVR5cGUuRmlsZToge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUocGF0aCwgJycpO1xuICAgIH1cbiAgICBjYXNlIEZpbGVTeXN0ZW1UeXBlLkZvbGRlcjoge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGVGb2xkZXIocGF0aCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldHMgb3IgY3JlYXRlcyBhIGZpbGUgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGaWxlU2FmZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4ge1xuICByZXR1cm4gYXNGaWxlKGF3YWl0IGdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZSh7IGFwcCwgcGF0aCwgdHlwZTogRmlsZVN5c3RlbVR5cGUuRmlsZSB9KSk7XG59XG5cbi8qKlxuICogR2V0cyBvciBjcmVhdGVzIGEgZm9sZGVyIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZvbGRlciBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBnZXQgb3IgY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGb2xkZXI+IHtcbiAgcmV0dXJuIGFzRm9sZGVyKGF3YWl0IGdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZSh7IGFwcCwgcGF0aCwgdHlwZTogRmlsZVN5c3RlbVR5cGUuRm9sZGVyIH0pKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc2FmZSByZW5hbWUgcGF0aCBmb3IgYSBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2V0dGluZyBhIHNhZmUgcmVuYW1lIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgc2FmZSByZW5hbWUgcGF0aCBmb3IgdGhlIGFic3RyYWN0IGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlUmVuYW1lUGF0aChwYXJhbXM6IEdldFNhZmVSZW5hbWVQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAsIG9sZFBhdGhPckFic3RyYWN0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBuZXdQYXRoIH0gPSBwYXJhbXM7XG4gIGNvbnN0IG9sZFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlKTtcblxuICBpZiAoZ2V0RGF0YUFkYXB0ZXJFeChhcHApLmluc2Vuc2l0aXZlKSB7XG4gICAgbGV0IGZvbGRlclBhdGggPSBkaXJuYW1lKG5ld1BhdGgpO1xuICAgIGxldCBub25FeGlzdGluZ1BhdGggPSBiYXNlbmFtZShuZXdQYXRoKTtcbiAgICBsZXQgZm9sZGVyOiBudWxsIHwgVEZvbGRlcjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBUaGVyZSBpcyBubyBlbGVnYW50IHdheSB0byBwZXJmb3JtIGluZmluaXRlIGxvb3BzLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHAsIGlzQ2FzZUluc2Vuc2l0aXZlOiB0cnVlLCBwYXRoT3JGb2xkZXI6IGZvbGRlclBhdGggfSk7XG4gICAgICBpZiAoZm9sZGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbm9uRXhpc3RpbmdQYXRoID0gam9pbihiYXNlbmFtZShmb2xkZXJQYXRoKSwgbm9uRXhpc3RpbmdQYXRoKTtcbiAgICAgIGZvbGRlclBhdGggPSBkaXJuYW1lKGZvbGRlclBhdGgpO1xuICAgIH1cbiAgICBuZXdQYXRoID0gam9pbihmb2xkZXIuZ2V0UGFyZW50UHJlZml4KCksIG5vbkV4aXN0aW5nUGF0aCk7XG4gIH1cblxuICBpZiAob2xkUGF0aC50b0xvd2VyQ2FzZSgpID09PSBuZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxuXG4gIHJldHVybiBnZXRBdmFpbGFibGVQYXRoKGFwcCwgbmV3UGF0aCk7XG59XG5cbi8qKlxuICogSW52b2tlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIGZpbGUgc3lzdGVtIGxvY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBpbnZva2luZyB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gbG9jay5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayhwYXJhbXM6IEludm9rZVdpdGhGaWxlU3lzdGVtTG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgJGZ1bmN0aW9uLFxuICAgIGFwcCxcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICBhd2FpdCBhcHAudmF1bHQucHJvY2VzcyhmaWxlLCAoY29udGVudCkgPT4ge1xuICAgICRmdW5jdGlvbihjb250ZW50KTtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb2YgYW5vdGhlciBwYXRoIG9yIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBjaGlsZCBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IHBhdGggb3IgZmlsZS5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNoaWxkIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgcGF0aCBvciBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDaGlsZChwYXJhbXM6IElzQ2hpbGRQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjaGlsZFBhdGhPckZpbGUsXG4gICAgcGFyZW50UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBjaGlsZFBhdGggPSBnZXRQYXRoKGFwcCwgY2hpbGRQYXRoT3JGaWxlKTtcbiAgY29uc3QgcGFyZW50UGF0aCA9IGdldFBhdGgoYXBwLCBwYXJlbnRQYXRoT3JGaWxlKTtcblxuICBpZiAoY2hpbGRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBhcmVudFBhdGggPT09ICcvJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkUGF0aC5zdGFydHNXaXRoKGAke3BhcmVudFBhdGh9L2ApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9yIHNlbGYgb2YgYW5vdGhlciBwYXRoIG9yIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBjaGlsZCBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvciBzZWxmIG9mIHRoZSBwYXJlbnQgcGF0aCBvciBmaWxlLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2hpbGQgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb3Igc2VsZiBvZiB0aGUgcGFyZW50IHBhdGggb3IgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRPclNlbGYocGFyYW1zOiBJc0NoaWxkT3JTZWxmUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY2hpbGRQYXRoT3JGaWxlLFxuICAgIHBhcmVudFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgY2hpbGRQYXRoID0gZ2V0UGF0aChhcHAsIGNoaWxkUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHBhcmVudFBhdGggPSBnZXRQYXRoKGFwcCwgcGFyZW50UGF0aE9yRmlsZSk7XG4gIHJldHVybiBjaGlsZFBhdGggPT09IHBhcmVudFBhdGggfHwgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlLCBwYXJlbnRQYXRoT3JGaWxlIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZvbGRlciBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBwYXRoIG9yIGZvbGRlciB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZm9sZGVyIGlzIGVtcHR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNFbXB0eUZvbGRlcihhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgbGlzdGVkRmlsZXMgPSBhd2FpdCBsaXN0U2FmZShhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGb2xkZXIpKTtcbiAgcmV0dXJuIGxpc3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA9PT0gMCAmJiBsaXN0ZWRGaWxlcy5mb2xkZXJzLmxlbmd0aCA9PT0gMDtcbn1cblxuLyoqXG4gKiBTYWZlbHkgbGlzdHMgdGhlIGZpbGVzIGFuZCBmb2xkZXJzIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgcGF0aCBvciBmb2xkZXIgdG8gbGlzdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgTGlzdGVkRmlsZXN9IG9iamVjdCBjb250YWluaW5nIHRoZSBsaXN0ZWQgZmlsZXMgYW5kIGZvbGRlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2FmZShhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPExpc3RlZEZpbGVzPiB7XG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRm9sZGVyKTtcbiAgY29uc3QgRU1QVFkgPSB7IGZpbGVzOiBbXSwgZm9sZGVyczogW10gfTtcblxuICBjb25zdCBwYXRoU3RhdHMgPSBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpO1xuICBpZiAocGF0aFN0YXRzPy50eXBlICE9PSAnZm9sZGVyJykge1xuICAgIHJldHVybiBFTVBUWTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLmxpc3QocGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBmaWxlIHdpdGggcmV0cnkgbG9naWMsIHVwZGF0aW5nIGl0cyBjb250ZW50IGJhc2VkIG9uIGEgcHJvdmlkZWQgdmFsdWUgb3IgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBwcm9jZXNzaW5nIHRoZSBmaWxlLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHByb2Nlc3MgZmFpbHMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcmV0cmllcyBvciB0aW1lb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2VzcyhwYXJhbXM6IFByb2Nlc3NQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBuZXdDb250ZW50UHJvdmlkZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50XG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUyA9IHtcbiAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogdHJ1ZSxcbiAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBEZWZhdWx0IHZhbHVlLlxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogNTAwXG4gIH07XG4gIGNvbnN0IGZ1bGxPcHRpb25zID0geyAuLi5ERUZBVUxUX1JFVFJZX09QVElPTlMsIC4uLnBhcmFtcyB9O1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuXG4gIC8vIFJlZmVyZW5jZS1jb3VudGVkIGxvY2s7IGNvbXBvc2VzIHdpdGggYW55IG91dGVyIGxvY2suIFJlbGVhc2VkIGF0IGZ1bmN0aW9uIHNjb3BlIGV4aXQuXG4gIHVzaW5nIF9sb2NrID0gcmVzb3VyY2VMb2NrQ29tcG9uZW50Py5sb2NrRm9yUGF0aCh7IG9wZXJhdGlvbk5hbWU6ICdQcm9jZXNzIG5vdGUnLCBwYXRoT3JGaWxlIH0pO1xuXG4gIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXROb3RpY2Uoe1xuICAgIGFzeW5jIG9wZXJhdGlvbkZ1bmN0aW9uKGFib3J0U2lnbmFsKSB7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgcmVhZFNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzaG91bGRUcmVhdE1pc3NpbmdGaWxlQXNTdWNjZXNzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCByZXNvbHZlVmFsdWUobmV3Q29udGVudFByb3ZpZGVyLCB7IGFib3J0U2lnbmFsLCBjb250ZW50OiBvbGRDb250ZW50IH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgaWYgKG5ld0NvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNTdWNjZXNzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGludm9rZUZpbGVBY3Rpb25TYWZlKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBhc3luYyBmaWxlQWN0aW9uKGZpbGUpIHtcbiAgICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIGF3YWl0IGFwcC52YXVsdC5wcm9jZXNzKGZpbGUsIChjb250ZW50KSA9PiB7XG4gICAgICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1ZhdWx0OnByb2Nlc3MnKSgnQ29udGVudCBoYXMgY2hhbmdlZCBzaW5jZSBpdCB3YXMgcmVhZC4gUmV0cnlpbmcuLi4nLCB7XG4gICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudDogY29udGVudCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IG9sZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgcGF0aDogZmlsZS5wYXRoXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXdDb250ZW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcGF0aE9yRmlsZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IEludm9rZUZpbGVBY3Rpb25TYWZlUmVzdWx0Lk5vdEludm9rZWQpIHtcbiAgICAgICAgcmV0dXJuIHNob3VsZFRyZWF0TWlzc2luZ0ZpbGVBc1N1Y2Nlc3MoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzU3VjY2VzcztcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIENsb3NlcyBvdmVyIGBmdWxsT3B0aW9uc2AgYW5kIGBwYXRoYCBmcm9tIHRoZSBlbmNsb3Npbmcgc2NvcGUsIHNvIGl0IGNhbm5vdCBiZSBob2lzdGVkLlxuICAgICAgZnVuY3Rpb24gc2hvdWxkVHJlYXRNaXNzaW5nRmlsZUFzU3VjY2VzcygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGZ1bGxPcHRpb25zLnNob3VsZEZhaWxPbk1pc3NpbmdGaWxlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICcke3BhdGh9JyBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy52YXVsdC5wcm9jZXNzRmlsZSwgeyBmaWxlUGF0aDogcGF0aCB9KSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcmV0cnlPcHRpb25zOiBmdWxsT3B0aW9ucyxcbiAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogZnVsbE9wdGlvbnMuc2hvdWxkU2hvd1RpbWVvdXROb3RpY2VcbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIHNhZmVseSBmcm9tIHRoZSB2YXVsdC5cbiAqXG4gKiBJdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlbiB0aGUgZmlsZSB3YXMgcmVtb3ZlZCBkdXJpbmcgdGhlIHJlYWRpbmcuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byByZWFkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBvciBgbnVsbGAgaWYgdGhlIGZpbGUgaXMgbWlzc2luZyBvciBkZWxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFNhZmUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgbGV0IGNvbnRlbnQ6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBhd2FpdCBpbnZva2VGaWxlQWN0aW9uU2FmZSh7XG4gICAgYXBwLFxuICAgIGFzeW5jIGZpbGVBY3Rpb24oZmlsZSkge1xuICAgICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBmaWxlKTtcbiAgICAgIGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGVcbiAgfSk7XG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIFJlbmFtZXMgYSBmaWxlIHNhZmVseSBpbiB0aGUgdmF1bHQuXG4gKiBJZiB0aGUgbmV3IHBhdGggYWxyZWFkeSBleGlzdHMsIHRoZSBmaWxlIHdpbGwgYmUgcmVuYW1lZCB0byBhbiBhdmFpbGFibGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmFtaW5nIHRoZSBmaWxlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHBhdGggb2YgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVTYWZlKHBhcmFtczogUmVuYW1lU2FmZVBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbmV3UGF0aCxcbiAgICBvbGRQYXRoT3JBYnN0cmFjdEZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3Qgb2xkQWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBvbGRQYXRoT3JBYnN0cmFjdEZpbGUgfSk7XG5cbiAgY29uc3QgbmV3QXZhaWxhYmxlUGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKHsgYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGUgfSk7XG5cbiAgaWYgKG9sZEFic3RyYWN0RmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkgPT09IG5ld0F2YWlsYWJsZVBhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgIGlmIChvbGRBYnN0cmFjdEZpbGUucGF0aCAhPT0gbmV3UGF0aCkge1xuICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUob2xkQWJzdHJhY3RGaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0F2YWlsYWJsZVBhdGg7XG4gIH1cblxuICBjb25zdCBuZXdGb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChuZXdBdmFpbGFibGVQYXRoKTtcbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIG5ld0ZvbGRlclBhdGgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUob2xkQWJzdHJhY3RGaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMobmV3QXZhaWxhYmxlUGF0aCkgfHwgYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhvbGRBYnN0cmFjdEZpbGUucGF0aCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdBdmFpbGFibGVQYXRoO1xufVxuXG4vKipcbiAqIFNhdmVzIHRoZSBzcGVjaWZpZWQgbm90ZSBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgbm90ZSB0byBiZSBzYXZlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbm90ZSBpcyBzYXZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVOb3RlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNNYXJrZG93bkZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuXG4gIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5NYXJrZG93bikpIHtcbiAgICBpZiAobGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYudmlldy5maWxlPy5wYXRoID09PSBwYXRoICYmIGxlYWYudmlldy5kaXJ0eSkge1xuICAgICAgYXdhaXQgbGVhZi52aWV3LnNhdmUoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFzaGVzIGFuIGFic3RyYWN0IGZpbGUgc2FmZWx5IGZyb20gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gdHJhc2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGUgaXMgdHJhc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYXNoU2FmZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gIGlmICghZmlsZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShmaWxlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhmaWxlLnBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignVmF1bHQ6dHJhc2hTYWZlJykoYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyYXNoaW5nICR7ZmlsZS5wYXRofSwgYnV0IHRoZSBmaWxlIG5vIGxvbmdlciBleGlzdHMuYCwgeyBlcnJvciwgcGF0aDogZmlsZS5wYXRoIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGludm9rZUZpbGVBY3Rpb25TYWZlKHBhcmFtczogSW52b2tlRmlsZUFjdGlvblNhZmVQYXJhbXMpOiBQcm9taXNlPEludm9rZUZpbGVBY3Rpb25TYWZlUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZmlsZUFjdGlvbixcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcbiAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgIHJldHVybiBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdC5Ob3RJbnZva2VkO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZmlsZUFjdGlvbihmaWxlKTtcbiAgICByZXR1cm4gSW52b2tlRmlsZUFjdGlvblNhZmVSZXN1bHQuSW52b2tlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcbiAgICBpZiAoIWZpbGUgfHwgZmlsZS5kZWxldGVkKSB7XG4gICAgICByZXR1cm4gSW52b2tlRmlsZUFjdGlvblNhZmVSZXN1bHQuTm90SW52b2tlZDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdBLDZCQUlPO0FBQ1Asc0JBS087QUFZUCw4QkFBK0I7QUFDL0IsbUJBQStCO0FBQy9CLHNCQUEwQjtBQUMxQixrQkFLTztBQUNQLHlCQUE0QjtBQUM1Qiw0QkFBNkI7QUFDN0IsK0JBQXVDO0FBQ3ZDLHlCQWVPO0FBQ1Asa0JBQWtCO0FBS1gs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
@@ -70,6 +70,9 @@ export interface CleanupEmptyFoldersParams {
70
70
  * Arguments for {@link process}.
71
71
  */
72
72
  export interface ContentArguments {
73
+ /**
74
+ * The current content of the file.
75
+ */
73
76
  readonly content: string;
74
77
  }
75
78
  /**