obsidian-dev-utils 88.2.0 → 88.4.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 (97) hide show
  1. package/CHANGELOG.md +22 -4
  2. package/dist/lib/cjs/__merged.cjs +27 -1
  3. package/dist/lib/cjs/__merged.d.cts +8 -4
  4. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  5. package/dist/lib/cjs/html-element.cjs +7 -1
  6. package/dist/lib/cjs/html-element.d.cts +12 -0
  7. package/dist/lib/cjs/obsidian/attachment-path.cjs +10 -5
  8. package/dist/lib/cjs/obsidian/attachment-path.d.cts +11 -1
  9. package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
  10. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
  11. package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +159 -0
  12. package/dist/lib/cjs/obsidian/components/pointer-position-component.d.cts +29 -0
  13. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +35 -5
  14. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +7 -0
  15. package/dist/lib/cjs/obsidian/css-class.cjs +2 -1
  16. package/dist/lib/cjs/obsidian/css-class.d.cts +4 -0
  17. package/dist/lib/cjs/obsidian/file-system.cjs +20 -1
  18. package/dist/lib/cjs/obsidian/file-system.d.cts +25 -0
  19. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +4 -1
  20. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +3 -0
  21. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +3 -0
  22. package/dist/lib/cjs/obsidian/index.cjs +7 -1
  23. package/dist/lib/cjs/obsidian/index.d.cts +2 -0
  24. package/dist/lib/cjs/obsidian/link-update-progress.cjs +124 -0
  25. package/dist/lib/cjs/obsidian/link-update-progress.d.cts +32 -0
  26. package/dist/lib/cjs/obsidian/link.cjs +11 -2
  27. package/dist/lib/cjs/obsidian/link.d.cts +6 -0
  28. package/dist/lib/cjs/obsidian/path-settings.cjs +19 -5
  29. package/dist/lib/cjs/obsidian/path-settings.d.cts +13 -1
  30. package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +175 -0
  31. package/dist/lib/cjs/obsidian/popovers/field-popover.d.cts +75 -0
  32. package/dist/lib/cjs/obsidian/popovers/index.cjs +152 -0
  33. package/dist/lib/cjs/obsidian/popovers/index.d.cts +4 -0
  34. package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +178 -0
  35. package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +67 -0
  36. package/dist/lib/cjs/obsidian/popovers/popover.cjs +221 -0
  37. package/dist/lib/cjs/obsidian/popovers/popover.d.cts +78 -0
  38. package/dist/lib/cjs/obsidian/resource-lock.cjs +6 -1
  39. package/dist/lib/cjs/obsidian/resource-lock.d.cts +15 -0
  40. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
  41. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
  42. package/dist/lib/cjs/script-utils/version.cjs +11 -2
  43. package/dist/lib/cjs/script-utils/version.d.cts +14 -0
  44. package/dist/lib/esm/__merged.d.mts +8 -4
  45. package/dist/lib/esm/__merged.mjs +28 -2
  46. package/dist/lib/esm/generated-during-build.mjs +2 -2
  47. package/dist/lib/esm/html-element.d.mts +12 -0
  48. package/dist/lib/esm/html-element.mjs +6 -1
  49. package/dist/lib/esm/obsidian/attachment-path.d.mts +11 -1
  50. package/dist/lib/esm/obsidian/attachment-path.mjs +11 -5
  51. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  52. package/dist/lib/esm/obsidian/components/index.mjs +3 -1
  53. package/dist/lib/esm/obsidian/components/pointer-position-component.d.mts +29 -0
  54. package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +51 -0
  55. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +7 -0
  56. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +35 -5
  57. package/dist/lib/esm/obsidian/css-class.d.mts +4 -0
  58. package/dist/lib/esm/obsidian/css-class.mjs +2 -1
  59. package/dist/lib/esm/obsidian/file-system.d.mts +25 -0
  60. package/dist/lib/esm/obsidian/file-system.mjs +20 -1
  61. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +3 -0
  62. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +4 -1
  63. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +3 -0
  64. package/dist/lib/esm/obsidian/index.d.mts +2 -0
  65. package/dist/lib/esm/obsidian/index.mjs +5 -1
  66. package/dist/lib/esm/obsidian/link-update-progress.d.mts +32 -0
  67. package/dist/lib/esm/obsidian/link-update-progress.mjs +24 -0
  68. package/dist/lib/esm/obsidian/link.d.mts +6 -0
  69. package/dist/lib/esm/obsidian/link.mjs +11 -2
  70. package/dist/lib/esm/obsidian/path-settings.d.mts +13 -1
  71. package/dist/lib/esm/obsidian/path-settings.mjs +18 -4
  72. package/dist/lib/esm/obsidian/popovers/field-popover.d.mts +75 -0
  73. package/dist/lib/esm/obsidian/popovers/field-popover.mjs +70 -0
  74. package/dist/lib/esm/obsidian/popovers/index.d.mts +4 -0
  75. package/dist/lib/esm/obsidian/popovers/index.mjs +32 -0
  76. package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +67 -0
  77. package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +67 -0
  78. package/dist/lib/esm/obsidian/popovers/popover.d.mts +78 -0
  79. package/dist/lib/esm/obsidian/popovers/popover.mjs +113 -0
  80. package/dist/lib/esm/obsidian/resource-lock.d.mts +15 -0
  81. package/dist/lib/esm/obsidian/resource-lock.mjs +5 -1
  82. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
  83. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
  84. package/dist/lib/esm/script-utils/version.d.mts +14 -0
  85. package/dist/lib/esm/script-utils/version.mjs +10 -2
  86. package/dist/styles.css +25 -1
  87. package/obsidian/components/pointer-position-component/package.json +6 -0
  88. package/obsidian/link-update-progress/package.json +6 -0
  89. package/obsidian/popovers/field-popover/package.json +6 -0
  90. package/obsidian/popovers/index/package.json +6 -0
  91. package/obsidian/popovers/package.json +6 -0
  92. package/obsidian/popovers/popover/package.json +6 -0
  93. package/obsidian/popovers/popover-anchor/package.json +6 -0
  94. package/package.json +43 -17
  95. package/patches/brace-expansion-callable/package.json +8 -0
  96. package/dist/dev/main.js +0 -37725
  97. package/dist/dev/manifest.json +0 -9
@@ -880,6 +880,9 @@ class ResourceLockedError extends Error {
880
880
  function isResourceLockedForPath(app, pathOrFile) {
881
881
  return getManager().isLocked(app, pathOrFile);
882
882
  }
883
+ function isResourceLockedForPathByAncestor(app, pathOrFile) {
884
+ return getManager().isLockedByAncestor(app, pathOrFile);
885
+ }
883
886
  function lockResourceForPath(params) {
884
887
  return getManager().lock({
885
888
  app: params.app,
@@ -901,8 +904,9 @@ export {
901
904
  ResourceLockComponent,
902
905
  ResourceLockedError,
903
906
  isResourceLockedForPath,
907
+ isResourceLockedForPathByAncestor,
904
908
  lockResourceForPath,
905
909
  requestResourceUnlockForPath,
906
910
  unlockResourceForPath
907
911
  };
908
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIFRoZSBhY3F1aXJlcnMgcmV0dXJuIGEge0BsaW5rIERpc3Bvc2FibGV9LCBzbyB0aGUgcHJlZmVycmVkIGNhbGwgc3R5bGUgaXMgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIHRoYXRcbiAqIHJlbGVhc2VzIGF1dG9tYXRpY2FsbHkgYXQgc2NvcGUgZXhpdCAoaW5jbHVkaW5nIG9uIHRocm93KTpcbiAqXG4gKiBgYGB0c1xuICogdXNpbmcgX2xvY2sgPSBsb2NrUmVzb3VyY2VGb3JQYXRoKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoLCBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZCwgb3BlcmF0aW9uTmFtZTogJ1Byb2Nlc3Mgbm90ZScgfSk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja1Jlc291cmNlRm9yUGF0aH0gcGFpciByZW1haW5zIGF2YWlsYWJsZSBmb3Igbm9uLWB1c2luZ2AgY2FsbCBzaXRlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEFic3RyYWN0RmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHsgQmVlcGVyIH0gZnJvbSAnLi4vYmVlcGVyLnRzJztcbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Jcbn0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyB0b2dnbGVFZGl0b3JSZWFkT25seSB9IGZyb20gJy4vZWRpdG9yLnRzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQge1xuICBpc0NoaWxkLFxuICBpc0NoaWxkT3JTZWxmXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG5jb25zdCBSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSA9ICdyZXNvdXJjZUxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yLWZsYXNoJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcbmNvbnN0IFVOTE9DS19JQ09OX0lEID0gJ3VubG9jayc7XG5jb25zdCBNSURETEVfTU9VU0VfQlVUVE9OID0gMTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbG9ja1Jlc291cmNlRm9yUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9ja1Jlc291cmNlRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRha2luZyB0aGUgbG9jayAoZS5nLiBgJ01vdmUgc2VsZWN0aW9uJ2ApLiBTaG93biBuZXh0IHRvXG4gICAqIHRoZSBwbHVnaW4gbmFtZSBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgbG9ja2luZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBUaGUgbG9jayBpcyBhdHRyaWJ1dGVkIHRvIGl0IGZvclxuICAgKiByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jay4gV2hlbiBhIGxvY2sgaW5kaWNhdG9yIGlzIGNsaWNrZWQgKHdpdGhcbiAgICogYW55IG1vdXNlIGJ1dHRvbikgYW5kIHRoZSB1c2VyIGNvbmZpcm1zIGFuIHVubG9jaywgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCBydW5zLCBvclxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSAvIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofSBpcyBjYWxsZWRcbiAgICogZm9yIHRoZSBwYXRoLCB0aGlzIGNvbnRyb2xsZXIgaXMgYWJvcnRlZCBzbyB0aGUgb3BlcmF0aW9uIGhvbGRpbmcgdGhlIGxvY2sgY2FuIGNhbmNlbCBpdHNlbGYuIFVubGVzc1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnR9IGlzIHNldCwgdGhlIG9wZXJhdGlvbiBpc1xuICAgKiBleHBlY3RlZCB0byByZWxlYXNlIHRoZSBsb2NrIGluIGl0cyBvd24gY2xlYW51cC4gV2hlbiBvbWl0dGVkLCBhbiB1bmxvY2sgc3RpbGwgcmVsZWFzZXMgdGhlIGxvY2sgYnV0XG4gICAqIGNhbm5vdCBjYW5jZWwgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgaXQuXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NrIHNjb3BlLiBgJ3N1YnRyZWUnYCBhbHNvIGxvY2tzIGV2ZXJ5IGRlc2NlbmRhbnQgb2YgYSBmb2xkZXIgcGF0aDsgYCdmaWxlJ2AgbG9ja3Mgb25seSB0aGVcbiAgICogZXhhY3QgcGF0aC4gQSBgc3VidHJlZWAgbG9jayBtdXN0IGJlIHJlbGVhc2VkIHZpYSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChub3QgdGhlXG4gICAqIGV4cGxpY2l0IHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQudW5sb2NrRm9yUGF0aH0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2ZpbGUnYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGFuIHVubG9jayBvZiB0aGUgbG9jayBpcyByZXF1ZXN0ZWQgXHUyMDE0IGkuZS4gd2hlbiB0aGVcbiAgICogbG9jaydzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQgKGJ5IHRoZVxuICAgKiBpbmRpY2F0b3IncyBcIlVubG9ja1wiIG1lbnUsIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQsIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQucmVxdWVzdFVubG9ja0ZvclBhdGh9LFxuICAgKiBvciB7QGxpbmsgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbn0pLiBVc2UgaXQgdG8gY2xlYXIgY29uc3VtZXItc2lkZSBzdGF0ZSB0aGF0IHNoYWRvd3MgdGhlIGxvY2sgKGUuZy5cbiAgICogYSBwZW5kaW5nLW9wZXJhdGlvbiBidWZmZXIgb3IgYSBub3RpY2UpIHdpdGhvdXQgaGFuZC13aXJpbmcgYW4gYGFib3J0YCBsaXN0ZW5lci4gRmlyZXMgYXQgbW9zdCBvbmNlLlxuICAgKi9cbiAgb25VbmxvY2tSZXF1ZXN0ZWQ/KHRoaXM6IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgLCBgJ01lcmdlXG4gICAqIG5vdGVzJ2ApLiBJdCBpcyBzaG93biBcdTIwMTQgbmV4dCB0byB0aGUgbG9ja2luZyBwbHVnaW4ncyBuYW1lIFx1MjAxNCBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2csIHNvXG4gICAqIHRoZSB1c2VyIHNlZXMgZXhhY3RseSB3aGljaCBvcGVyYXRpb24gYW4gdW5sb2NrIHdvdWxkIGNhbmNlbC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIGFsc28gKipibG9ja3MgdmF1bHQgbXV0YXRpb25zKiogb2YgdGhlIGNvdmVyZWQgcGF0aChzKTogYW55IGF0dGVtcHQgdG8gZWRpdCxcbiAgICogZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBBUEkgdGhyb3dzIGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBJbnN0YWxsZWQgbGF6aWx5IG9uIHRoZSBmaXJzdCBzdWNoIGxvY2sgYW5kIHJlbW92ZWQgd2hlbiB0aGUgbGFzdCBvbmVcbiAgICogaXMgcmVsZWFzZWQuIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBsb2NrIG9ubHkgbWFrZXMgdGhlIGVkaXRvciByZWFkLW9ubHkgXHUyMDE0IGxlZ2FjeSBiZWhhdmlvcixcbiAgICogc28gZXhpc3RpbmcgY29uc3VtZXJzIHRoYXQgd3JpdGUgdG8gYSBub3RlIHRoZXkgaG9sZCBhbiBlZGl0b3IgbG9jayBvbiBhcmUgdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxvY2sgcmVsZWFzZXMgaXRzZWxmIHRoZSBtb21lbnQgaXRzXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQsIGluc3RlYWQgb2YgcmVseWluZyBvblxuICAgKiB0aGUgb3duaW5nIG9wZXJhdGlvbiB0byByZWxlYXNlIGl0IGluIGl0cyBvd24gY2xlYW51cC4gVXNlIGl0IGZvciBhIGxvY2sgaGVsZCAqKmluZGVmaW5pdGVseSoqXG4gICAqIG91dHNpZGUgYSBgdXNpbmdgIHNjb3BlIChzbyB0aGVyZSBpcyBubyBgZmluYWxseWAgdG8gcmVsZWFzZSBpdCkgXHUyMDE0IGUuZy4gYSBsb2NrIHRoYXQgc3RheXMgdW50aWwgdGhlXG4gICAqIHVzZXIgZXhwbGljaXRseSB1bmxvY2tzLiBMZWF2ZSBpdCBgZmFsc2VgIGZvciBhIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHRoYXQgaG9sZHMgdGhlIGxvY2sgdGhyb3VnaFxuICAgKiBpdHMgb3duIGFib3J0LWRyaXZlbiByb2xsYmFjayBhbmQgcmVsZWFzZXMgaXQgdmlhIGB1c2luZ2AgYXQgc2NvcGUgZXhpdC4gSGFzIG5vIGVmZmVjdCB3aXRob3V0IGFuXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNjb3BlIG9mIGEgbG9jay5cbiAqXG4gKiAtIGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlIGV4YWN0IHBhdGguXG4gKiAtIGAnc3VidHJlZSdgIGxvY2tzIHRoZSBwYXRoIGFuZCBldmVyeSBkZXNjZW5kYW50IHVuZGVyIGl0IChpdHMgd2hvbGUgZm9sZGVyIHN1YnRyZWUpLCBzbyBhIGZpbGVcbiAqICAgaW5zaWRlIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIgaXMgdHJlYXRlZCBhcyBsb2NrZWQgdG9vLlxuICovXG5leHBvcnQgdHlwZSBSZXNvdXJjZUxvY2tNb2RlID0gJ2ZpbGUnIHwgJ3N1YnRyZWUnO1xuXG5pbnRlcmZhY2UgTG9ja0Rlc2NyaXB0b3Ige1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvY2tFbnRyeSB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zOiBib29sZWFuO1xuICByZWFkb25seSBtb2RlOiBSZXNvdXJjZUxvY2tNb2RlO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZDogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgZGlzcG9zZVR5cGVMaXN0ZW5lcigpOiB2b2lkO1xuICByZWFkb25seSB0YWJJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIE1hbmFnZXJMb2NrUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uVW5sb2NrUmVxdWVzdGVkPzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNob3VsZFJlbGVhc2VPbkFib3J0PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50fS5cbiAqL1xuaW50ZXJmYWNlIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIG9uQ2hhbmdlKHRoaXM6IHZvaWQpOiB2b2lkO1xuICBvbkV4dGVybmFsTXV0YXRpb24odGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogdm9pZDtcbiAgb25GaWxlTWVudSh0aGlzOiB2b2lkLCBtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgc2hvdWxkQmxvY2tNdXRhdGlvbih0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkV4dGVybmFsTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9uQ2hhbmdlID0gcGFyYW1zLm9uQ2hhbmdlO1xuICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uID0gcGFyYW1zLm9uRXh0ZXJuYWxNdXRhdGlvbjtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gU2FtZS1sZWFmIG5hdmlnYXRpb24gdG8gYW5vdGhlciBub3RlIGZpcmVzIG5vIGxlYWYvbGF5b3V0IGNoYW5nZTsgd2l0aG91dCB0aGlzIGl0IHN0YXlzIHJlYWQtb25seS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gQWRkcyBhbiBcIlVubG9ja1wiIGl0ZW0gdG8gYSBsb2NrZWQgbm90ZSdzIHRhYi9maWxlIGNvbnRleHQgbWVudSAoYWxvbmdzaWRlIHRoZSBpbmRpY2F0b3IgbWVudXMpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtbWVudScsIHRoaXMub25GaWxlTWVudSkpO1xuICAgIC8vIEV4dGVybmFsLWNoYW5nZSBiYWNrc3RvcDogYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCBub3QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIGFuIGludHJ1ZGVyIChhIHN5bmMvRlMvYWRhcHRlciBjaGFuZ2UgdGhhdCBieXBhc3NlZCB0aGUgYmxvY2tlciBwYXRjaCkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdjcmVhdGUnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24ob2xkUGF0aCk7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vbmtleS1wYXRjaGVzIHRoZSB2YXVsdC1tdXRhdGlvbiBjaG9rZSBwb2ludHMgb24gYFZhdWx0YC9gRmlsZU1hbmFnZXJgIHNvIHRoYXQgYW55IGVkaXQsIGRlbGV0ZSxcbiAqIHJlbmFtZSwgbW92ZSwgb3IgKHJlKWNyZWF0ZSBvZiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCB0aHJvd3MgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gKiBJbnN0YWxsZWQgbGF6aWx5IGJ5IHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyfSBvbiB0aGUgZmlyc3QgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrIGFuZCByZW1vdmVkXG4gKiB3aGVuIHRoZSBsYXN0IG9uZSBpcyByZWxlYXNlZDsgYmVpbmcgYSB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgZXZlcnkgcGF0Y2ggaXMgdG9ybiBkb3duIG9uXG4gKiBgdW5sb2FkYC4gUmVuYW1lL2NvcHkgY2hlY2sgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOyB0aGUgb3RoZXIgbWV0aG9kcyBjaGVjayB0aGVpciBzaW5nbGUgcGF0aC5cbiAqL1xuY2xhc3MgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24gPSBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdhcHBlbmQnPih7XG4gICAgICBtZXRob2ROYW1lOiAnYXBwZW5kJyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjb3B5Jz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ2NvcHknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFssIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGUnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVCaW5hcnknPih7XG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlQmluYXJ5JyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlRm9sZGVyJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUZvbGRlcicsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeUJpbmFyeSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnlCaW5hcnknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3Byb2Nlc3MnPih7XG4gICAgICBtZXRob2ROYW1lOiAncHJvY2VzcycsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncmVuYW1lJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3JlbmFtZUZpbGUnPih7XG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgICBvYmo6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAndHJhc2hGaWxlJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoRmlsZScsXG4gICAgICBvYmo6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE5vdEJsb2NrZWQocGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRCbG9ja011dGF0aW9uKHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUxvY2tlZEVycm9yKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW4gc3luYyB3aXRoIHRoZSBsb2NrZWRcbiAqIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS4gRWFjaCBsb2NrIGlzIG9uZVxuICoge0BsaW5rIExvY2tFbnRyeX0gaW4gYSBwZXItcGF0aCBsaXN0LCBzbyBhIHBhdGggY2FuIGJlIGhlbGQgYnkgc2V2ZXJhbCBwbHVnaW5zIChvciBzZXZlcmFsIHRpbWVzIGJ5XG4gKiBvbmUpIGNvbmN1cnJlbnRseSBhbmQgaXMgcmVsZWFzZWQgb25seSB3aGVuIGl0cyBsYXN0IGVudHJ5IGlzIHJlbW92ZWQ7IHRoZSBpbmRpY2F0b3JzIHJlcG9ydCB3aGljaFxuICogcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBieXBhc3NQYXRoU2V0cyA9IG5ldyBTZXQ8UmVhZG9ubHlTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeVZpZXcgPSBuZXcgTWFwPE1hcmtkb3duVmlldywgTG9ja0luZGljYXRvcnM+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0VudHJpZXNCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgTG9ja0VudHJ5W10+KCk7XG4gIHByaXZhdGUgbXV0YXRpb25CbG9ja2VyQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0dXNCYXJJdGVtRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGJ5cGFzcyhhcHA6IEFwcCwgcGF0aHNPckZpbGVzOiByZWFkb25seSBQYXRoT3JGaWxlW10pOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBieXBhc3NlZFBhdGhzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChwYXRoc09yRmlsZXMubWFwKChwYXRoT3JGaWxlKSA9PiBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpKTtcbiAgICB0aGlzLmJ5cGFzc1BhdGhTZXRzLmFkZChieXBhc3NlZFBhdGhzKTtcbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmJ5cGFzc1BhdGhTZXRzLmRlbGV0ZShieXBhc3NlZFBhdGhzKTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdW5sb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aC4gUmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgaXQgXHUyMDE0IHRoZSBwYXRoIGl0c2VsZiB3aGVuXG4gICAqIGRpcmVjdGx5IGxvY2tlZCwgb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIgXHUyMDE0IHRoZW4gYWJvcnRzIGV2ZXJ5XG4gICAqIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHJlZ2lzdGVyZWQgb24gdGhhdCBvd25lciAoY2FuY2VsbGluZyB0aGUgb3BlcmF0aW9ucyB0aGF0IHRvb2sgdGhlIGxvY2tzKVxuICAgKiBBTkQgcmVtb3ZlcyB0aGUgb3duZXIncyBsb2NrIGVudHJpZXMgKHJlbGVhc2luZyB0aGUgbG9jayB1bmNvbmRpdGlvbmFsbHkpLiBVbmxpa2VcbiAgICoge0BsaW5rIHJlcXVlc3RVbmxvY2t9LCB3aGljaCBvbmx5IGFib3J0cyB0aGUgZXhhY3QgcGF0aCdzIGNvbnRyb2xsZXJzIGFuZCByZWxpZXMgb24gZWFjaCBvcGVyYXRpb25cbiAgICogcmVsZWFzaW5nIGl0cyBvd24gbG9jaywgdGhpcyByZXNvbHZlcyBhbmNlc3RvciBjb3ZlcmFnZSBhbmQgYWx3YXlzIHJlbGVhc2VzIFx1MjAxNCBzbyBhIG5vdGUgaGVsZCBieSBhblxuICAgKiBpbmRlZmluaXRlbHktaGVsZCBsb2NrIGlzIGd1YXJhbnRlZWQgdG8gYmVjb21lIGVkaXRhYmxlLiBBIG5vLW9wIHdoZW4gbm90aGluZyBjb3ZlcnMgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIGZvcmNlVW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgY29uc3Qgb3duZXJQYXRoID0gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gICAgaWYgKG93bmVyUGF0aCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0QW5kUmVsZWFzZUVudHJpZXMoYXBwLCBvd25lclBhdGgpO1xuICB9XG5cbiAgcHVibGljIGlzTG9ja2VkKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNQYXRoTG9ja2VkKGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGlzIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yXG4gICAqIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBjb3ZlcmVkIGJ5IGEgbXV0YXRpb24tYmxvY2tpbmcgbG9jayAob25lIHRha2VuIHdpdGhcbiAgICogYGJsb2Nrc011dGF0aW9uc2ApIGRpcmVjdGx5IG9yIG9uIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZXhhY3RFbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKGV4YWN0RW50cmllcz8uc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBpZiAoZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnICYmIGVudHJ5LmJsb2Nrc011dGF0aW9ucykgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgbG9jayhwYXJhbXM6IE1hbmFnZXJMb2NrUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5wYXRoT3JGaWxlKTtcbiAgICBjb25zdCBlbnRyeTogTG9ja0VudHJ5ID0ge1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyID8/IG51bGwsXG4gICAgICBibG9ja3NNdXRhdGlvbnM6IHBhcmFtcy5ibG9ja3NNdXRhdGlvbnMgPz8gZmFsc2UsXG4gICAgICBtb2RlOiBwYXJhbXMubW9kZSA/PyAnZmlsZScsXG4gICAgICBvblVubG9ja1JlcXVlc3RlZDogcGFyYW1zLm9uVW5sb2NrUmVxdWVzdGVkID8/IG51bGwsXG4gICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0ID8/IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgZW50cmllcyk7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgaWYgKGVudHJ5LmJsb2Nrc011dGF0aW9ucykge1xuICAgICAgdGhpcy5lbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcCk7XG4gICAgfVxuICAgIHRoaXMud2lyZVJlbGVhc2VPbkFib3J0KGFwcCwgcGF0aCwgZW50cnkpO1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgcGF0aCwgZW50cnkpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaFxuICAgKiBjYW5jZWxzIHRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2suIEVhY2ggb3BlcmF0aW9uIHJlbGVhc2VzIGl0cyBvd24gbG9jayBpbiBpdHMgYGZpbmFsbHlgXG4gICAqIHdoZW4gaXQgb2JzZXJ2ZXMgdGhlIGFib3J0LCBzbyB0aGlzIGRvZXMgbm90IHVubG9jayB0aGUgcGF0aCBkaXJlY3RseS4gQSBuby1vcCB3aGVuIG5vIGNvbnRyb2xsZXJcbiAgICogaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgPT09IHBsdWdpbklkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkICE9PSBwbHVnaW5JZCk7XG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nLmxlbmd0aCAhPT0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IG9uIHRoZSBnaXZlbiAoYWxyZWFkeS1yZXNvbHZlZCkgb3duZXIgcGF0aCdzIGxvY2sgZW50cmllcyBcdTIwMTRcbiAgICogY2FuY2VsbGluZyB0aGUgb3duaW5nIG9wZXJhdGlvbnMgXHUyMDE0IGFuZCByZW1vdmVzIHRob3NlIGVudHJpZXMsIHJlbGVhc2luZyB0aGUgbG9jay4gVGhlIGVudHJpZXNcbiAgICogc25hcHNob3QgaXMgY29waWVkIGZpcnN0IGJlY2F1c2UgYW4gZW50cnkncyBgc2hvdWxkUmVsZWFzZU9uQWJvcnRgIGFib3J0IGxpc3RlbmVyIG11dGF0ZXMgdGhlXG4gICAqIGFycmF5IGFzIGl0IGZpcmVzLiBBbHdheXMgbGVhdmVzIHRoZSBvd25lciBwYXRoIHdpdGggbm8gZW50cmllcy5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvd25lclBhdGggLSBUaGUgZGlyZWN0bHktbG9ja2VkIG93bmVyIHBhdGggd2hvc2UgZW50cmllcyB0byBhYm9ydCBhbmQgcmVsZWFzZS5cbiAgICovXG4gIHByaXZhdGUgYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHA6IEFwcCwgb3duZXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQob3duZXJQYXRoKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIFsuLi5lbnRyaWVzXSkge1xuICAgICAgZW50cnkuYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIH1cbiAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShvd25lclBhdGgpO1xuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRVbmxvY2tNZW51SXRlbShhcHA6IEFwcCwgbWVudTogTWVudSwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG4gICAgICBpdGVtXG4gICAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVzb3VyY2VMb2NrLnVubG9ja01lbnVJdGVtKSlcbiAgICAgICAgLnNldEljb24oVU5MT0NLX0lDT05fSUQpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICAgIGFwcCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwLCBwYXRoKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVzb3VyY2VMb2NrLnVubG9ja0NvbmZpcm1UaXRsZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgIC8vIGBwYXRoYCBpcyB0aGUgcmVzb2x2ZWQgb3duZXIgcGF0aCwgc28gY2FuY2VsIGl0cyBvcGVyYXRpb25zIGFuZCByZWxlYXNlIHRoZSBsb2NrIG91dHJpZ2h0LlxuICAgICAgICAgICAgdGhpcy5hYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcCwgcGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluZGljYXRvcnMoYXBwOiBBcHAsIHZpZXc6IE1hcmtkb3duVmlldywgcGF0aDogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgKCkgPT4gcGF0aCk7XG5cbiAgICBsZXQgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRhYlN0YXR1c0NvbnRhaW5lckVsID0gdmlldy5sZWFmLnRhYkhlYWRlclN0YXR1c0NvbnRhaW5lckVsO1xuICAgIGlmICh0YWJTdGF0dXNDb250YWluZXJFbCkge1xuICAgICAgdGFiSWNvbkVsID0gdGFiU3RhdHVzQ29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IGNsczogTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTIH0pO1xuICAgICAgc2V0SWNvbih0YWJJY29uRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKHRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRhYkljb25FbCwgKCkgPT4gcGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXBlci5iZWVwKCk7XG4gICAgfTtcbiAgICB2aWV3LmNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdmlldy5jb250ZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcbiAgICAgIH0sXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCh7XG4gICAgICBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aCk6IGJvb2xlYW4gPT4gdGhpcy5zaG91bGRCbG9ja011dGF0aW9uKGFwcCwgcGF0aClcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUV4dGVybmFsTXV0YXRpb24oYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBvbkZpbGVNZW51OiAobWVudSwgZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVNZW51KGFwcCwgbWVudSwgZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWwucmVtb3ZlQ2xhc3MoTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTKTtcbiAgICAvLyBSZWFkIGxheW91dCB0byBmb3JjZSBhIHJlZmxvdyBzbyB0aGUgZmxhc2ggYW5pbWF0aW9uIHJlc3RhcnRzIG9uIGV2ZXJ5IHJlamVjdGVkIGtleXN0cm9rZS5cbiAgICBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlbC5hZGRDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEluZGljYXRvcnModmlldzogTWFya2Rvd25WaWV3KTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgZm9yIChjb25zdCBlbCBvZiBbaW5kaWNhdG9ycz8uYWN0aW9uSWNvbkVsLCBpbmRpY2F0b3JzPy50YWJJY29uRWwsIHRoaXMuc3RhdHVzQmFySXRlbUVsXSkge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIHRoaXMuZmxhc2hFbGVtZW50KGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RzIHRvIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBwYXRoLiBJZiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkIGFuZCBOT1QgY292ZXJlZCBieSBhblxuICAgKiBhY3RpdmUgYnlwYXNzIHNjb3BlLCB0aGUgY2hhbmdlIGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoIChzeW5jIC8gZmlsZXN5c3RlbSAvIGEgcmF3LWFkYXB0ZXJcbiAgICogd3JpdGUpIFx1MjAxNCBhbiBpbnRydWRlci4gQWJvcnQgdGhlIGBhYm9ydENvbnRyb2xsZXJgIG9mIGV2ZXJ5IG11dGF0aW9uLWJsb2NraW5nIGxvY2sgY292ZXJpbmcgdGhlIHBhdGhcbiAgICogc28gdGhlIG93bmluZyBvcGVyYXRpb24gY2FuY2VscyBhbmQgcm9sbHMgYmFjay4gQSBuby1vcCBmb3IgdGhlIG93bmVyJ3Mgb3duIChieXBhc3NlZCkgbXV0YXRpb25zLFxuICAgKiBmb3IgdW5ibG9ja2VkIHBhdGhzLCBhbmQgZm9yIGJsb2NraW5nIGxvY2tzIHdpdGggbm8gYGFib3J0Q29udHJvbGxlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRoZSBldmVudCBmaXJlZCBvbi5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5ibG9ja3NNdXRhdGlvbnMgfHwgIWVudHJ5LmFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyc1BhdGggPSBsb2NrZWRQYXRoID09PSBwYXRoIHx8IChlbnRyeS5tb2RlID09PSAnc3VidHJlZScgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pKTtcbiAgICAgICAgaWYgKGNvdmVyc1BhdGgpIHtcbiAgICAgICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmlsZU1lbnUoYXBwOiBBcHAsIG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICAvLyBPZmZlciBcIlVubG9ja1wiIGZvciBhIGRpcmVjdGx5LWxvY2tlZCBmaWxlL2ZvbGRlciwgb3IgYW55dGhpbmcgY292ZXJlZCBieSBhIGBzdWJ0cmVlYCBsb2NrIG9uIGFuIGFuY2VzdG9yLiBUaGUgbWVudSB0YXJnZXRzIHRoZSBvd25lciBsb2NrJ3MgcGF0aC5cbiAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZmlsZS5wYXRoKTtcbiAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBvd25lclBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCbG9ja2luZ0xvY2soKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBlbnRyaWVzIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgY292ZXJlZCBieSBhbiBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSBcdTIwMTQgdGhlXG4gICAqIG93bmVyIGRlY2xhcmluZyB0aGF0IGl0cyBvd24gbXV0YXRpb25zIG9mIHRoZSBwYXRoIChhbmQsIGZvciBhIGZvbGRlciwgaXRzIHN1YnRyZWUpIGFyZSBzYW5jdGlvbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBiZWluZyBtdXRhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgc29tZSBhY3RpdmUgYnlwYXNzIHNjb3BlIGNvdmVycyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgaXNCeXBhc3NlZChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGhzIG9mIHRoaXMuYnlwYXNzUGF0aFNldHMpIHtcbiAgICAgIGZvciAoY29uc3QgYnlwYXNzZWRQYXRoIG9mIGJ5cGFzc2VkUGF0aHMpIHtcbiAgICAgICAgaWYgKGlzQ2hpbGRPclNlbGYoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogYnlwYXNzZWRQYXRoIH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhMb2NrZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKT8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZHVwbGljYXRlZCBsaXN0IG9mIGAocGx1Z2luIG5hbWUsIG9wZXJhdGlvbiBuYW1lKWAgcGFpcnMgZGVzY3JpYmluZyB0aGUgbG9ja3Mgb24gYVxuICAgKiBwYXRoIFx1MjAxNCBvbmUgcGVyIGRpc3RpbmN0IHBsdWdpbitvcGVyYXRpb24uIERyaXZlcyB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiwgc28gdGhlIHVzZXIgc2VlcyBleGFjdGx5XG4gICAqIHdoaWNoIG9wZXJhdGlvbnMgYW4gdW5sb2NrIHdvdWxkIGNhbmNlbC4gT25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlXG4gICAqIGFsd2F5cyBwcmVzZW50LlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZGlyZWN0bHktbG9ja2VkIHBhdGggd2hvc2UgbG9jayBkZXNjcmlwdG9ycyB0byBidWlsZC5cbiAgICogQHJldHVybnMgVGhlIGRpc3RpbmN0IGxvY2sgZGVzY3JpcHRvcnMgY292ZXJpbmcgdGhlIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGxvY2tEZXNjcmlwdG9ycyhhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogTG9ja0Rlc2NyaXB0b3JbXSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBkZXNjcmlwdG9yczogTG9ja0Rlc2NyaXB0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgcGx1Z2luTmFtZSA9IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1tlbnRyeS5wbHVnaW5JZF0/Lm5hbWUgPz8gZW50cnkucGx1Z2luSWQ7XG4gICAgICBjb25zdCBrZXkgPSBgJHtwbHVnaW5OYW1lfVxcbiR7ZW50cnkub3BlcmF0aW9uTmFtZX1gO1xuICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgZGVzY3JpcHRvcnMucHVzaCh7IG9wZXJhdGlvbk5hbWU6IGVudHJ5Lm9wZXJhdGlvbk5hbWUsIHBsdWdpbk5hbWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9ycztcbiAgfVxuXG4gIHByaXZhdGUgbG9ja2luZ1BsdWdpbk5hbWVzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIC8vIGBsb2NraW5nUGx1Z2luTmFtZXNgIGlzIG9ubHkgZXZlciBjYWxsZWQgZm9yIGEgbG9ja2VkIHBhdGgsIHNvIGl0cyBlbnRyaWVzIGFyZSBhbHdheXMgcHJlc2VudC5cbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBjb25zdCBwbHVnaW5JZHMgPSBbLi4ubmV3IFNldChlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkKSldO1xuICAgIHJldHVybiBwbHVnaW5JZHMubWFwKChwbHVnaW5JZCkgPT4gYXBwLnBsdWdpbnMubWFuaWZlc3RzW3BsdWdpbklkXT8ubmFtZSA/PyBwbHVnaW5JZCk7XG4gIH1cblxuICBwcml2YXRlIGxvY2tUb29sdGlwKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2subG9ja2VkQnlUb29sdGlwKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgcGx1Z2luIG5hbWVzLCBvbmUgcGVyIGxpbmUgdW5kZXIgdGhlIGhlYWRlci5cbiAgICByZXR1cm4gW2hlYWRlciwgLi4udGhpcy5sb2NraW5nUGx1Z2luTmFtZXMoYXBwLCBwYXRoKV0uam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZShhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdzVG9Mb2NrID0gbmV3IFNldDxNYXJrZG93blZpZXc+KCk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgY29uc3QgdmlldyA9IGxlYWYudmlldztcbiAgICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSB0aGUgbG9jayBjb3ZlcmluZyB0aGlzIHZpZXc6IHRoZSBleGFjdCBwYXRoIHdoZW4gZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci4gSW5kaWNhdG9ycy90b29sdGlwL3VubG9jayBtZW51IGtleSBvZmYgdGhhdCBvd25lciBwYXRoLlxuICAgICAgY29uc3Qgb3duZXJQYXRoID0gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpO1xuICAgICAgaWYgKG93bmVyUGF0aCAhPT0gbnVsbCkge1xuICAgICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmxvY2tUb29sdGlwKGFwcCwgb3duZXJQYXRoKTtcbiAgICAgICAgLy8gUmUtYXBwbHkgdGhlIHJlYWQtb25seSB0b2dnbGUgb24gZXZlcnkgcmVjb25jaWxlLCBub3Qgb25seSB0aGUgZmlyc3QgdGltZSBhIHZpZXcgaXMgdHJhY2tlZC5cbiAgICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBpZGVtcG90ZW50LCBzbyByZS1hcHBseWluZyB0byBhbiBhbHJlYWR5LWxvY2tlZCB2aWV3IGlzIGNoZWFwLlxuICAgICAgICAvLyBBIHZpZXcgb3BlbmVkIGFmdGVyIHRoZSBsb2NrIGlzIHJlY29uY2lsZWQgc3luY2hyb25vdXNseSwgYmVmb3JlIGl0cyBDb2RlTWlycm9yIGlzIHJlYWR5LlxuICAgICAgICAvLyBJdHMgZmlyc3QgdG9nZ2xlIGlzIHRoZXJlZm9yZSBhIG5vLW9wOyByZS1hcHBseWluZyBtYWtlcyB0aGUgbG9jayB0YWtlIGhvbGQgb25jZSBpdCBzZXR0bGVzLlxuICAgICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGluZGljYXRvcnMgPSB0aGlzLmluZGljYXRvcnNCeVZpZXcuZ2V0KHZpZXcpO1xuICAgICAgICBpZiAoaW5kaWNhdG9ycykge1xuICAgICAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9ycywgdG9vbHRpcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LnNldCh2aWV3LCB0aGlzLmNyZWF0ZUluZGljYXRvcnMoYXBwLCB2aWV3LCBvd25lclBhdGgsIHRvb2x0aXApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3ZpZXcsIGluZGljYXRvcnNdIG9mIHRoaXMuaW5kaWNhdG9yc0J5Vmlldykge1xuICAgICAgaWYgKCF2aWV3c1RvTG9jay5oYXModmlldykpIHtcbiAgICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIGZhbHNlKTtcbiAgICAgICAgaW5kaWNhdG9ycy5kaXNwb3NlVHlwZUxpc3RlbmVyKCk7XG4gICAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5kZWxldGUodmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNCYXIoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlQW5kQ2xlYW51cChhcHA6IEFwcCk6IHZvaWQge1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgaWYgKHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzQmxvY2tpbmdMb2NrKCkpIHtcbiAgICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyVW5sb2NrTWVudShhcHA6IEFwcCwgZWw6IEhUTUxFbGVtZW50LCBnZXRDb250ZXh0UGF0aDogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gQSBjbGljayBvZiBBTlkgbW91c2UgYnV0dG9uIG9uIGEgbG9jayBpbmRpY2F0b3Igb3BlbnMgdGhlIHNhbWUgdW5sb2NrIGNvbnRleHQgbWVudTpcbiAgICAvLyBgY2xpY2tgIGZpcmVzIG9ubHkgZm9yIHRoZSBwcmltYXJ5IChsZWZ0KSBidXR0b24sIGBjb250ZXh0bWVudWAgZm9yIHRoZSByaWdodCBidXR0b24sIGFuZFxuICAgIC8vIGBhdXhjbGlja2AgZm9yIHRoZSBtaWRkbGUgYnV0dG9uICh0aGUgYnJvd3NlciBmaXJlcyBubyBgY2xpY2tgIGZvciBpdCkuIGBhdXhjbGlja2AgYWxzbyBmaXJlcyBmb3JcbiAgICAvLyBUaGUgcmlnaHQgYnV0dG9uLCBzbyBpdCBpcyBndWFyZGVkIHRvIHRoZSBtaWRkbGUgYnV0dG9uIHRvIGF2b2lkIGRvdWJsZS1vcGVuaW5nIGFsb25nc2lkZSBgY29udGV4dG1lbnVgLlxuICAgIC8vIEEgcGxhaW4gbGlzdGVuZXIgZGllcyB3aXRoIHRoZSBlbGVtZW50IHdoZW4gaXQgaXMgYC5yZW1vdmUoKWBkIG9uIHVubG9jaywgc28gaXQgbmV2ZXIgbGVha3MuXG4gICAgY29uc3Qgb3BlblVubG9ja01lbnUgPSAoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRDb250ZXh0UGF0aCgpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBwYXRoKTtcbiAgICAgIG1lbnUuc2hvd0F0TW91c2VFdmVudChldnQpO1xuICAgIH07XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignYXV4Y2xpY2snLCAoZXZ0KSA9PiB7XG4gICAgICBpZiAoZXZ0LmJ1dHRvbiA9PT0gTUlERExFX01PVVNFX0JVVFRPTikge1xuICAgICAgICBvcGVuVW5sb2NrTWVudShldnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFbnRyeShhcHA6IEFwcCwgcGF0aDogc3RyaW5nLCBlbnRyeTogTG9ja0VudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgd2hpY2ggbG9ja2VkIHBhdGggKGlmIGFueSkgY292ZXJzIHRoZSBnaXZlbiBwYXRoOiB0aGUgcGF0aCBpdHNlbGYgd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciB0aGF0IGNvbnRhaW5zIGl0IChsb25nZXN0IHNvIGEgbmVzdGVkXG4gICAqIHN1YnRyZWUgbG9jayB3aW5zIGRldGVybWluaXN0aWNhbGx5IG92ZXIgYW4gb3V0ZXIgb25lKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIGNvdmVycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIGxldCBiZXN0T3duZXJQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBoYXNTdWJ0cmVlTG9jayA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyk7XG4gICAgICBpZiAoaGFzU3VidHJlZUxvY2sgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pICYmIChiZXN0T3duZXJQYXRoID09PSBudWxsIHx8IGxvY2tlZFBhdGgubGVuZ3RoID4gYmVzdE93bmVyUGF0aC5sZW5ndGgpKSB7XG4gICAgICAgIGJlc3RPd25lclBhdGggPSBsb2NrZWRQYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdE93bmVyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBtdXRhdGlvbiBvZiB0aGUgcGF0aCBtdXN0IGJlIGJsb2NrZWQ6IGB0cnVlYCB3aGVuIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWRcbiAgICogYW5kIG5vdCBjb3ZlcmVkIGJ5IGFueSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggYmVpbmcgbXV0YXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHRvIHJlamVjdCB0aGUgbXV0YXRpb24sIGBmYWxzZWAgdG8gYWxsb3cgaXQuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZEJsb2NrTXV0YXRpb24oYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IoYXBwLCBwYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmxvY2tDb25maXJtTWVzc2FnZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGZyYWdtZW50LmFwcGVuZFRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtTWVzc2FnZSkpO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiB0aGUgbG9ja3MgY3VycmVudGx5IGhlbGQ6IGVhY2ggcGx1Z2luIG5hbWUgYXMgYSBjb2RlIGJsb2NrIGZvbGxvd2VkIGJ5XG4gICAgLy8gVGhlIG9wZXJhdGlvbiBpdCBpcyBydW5uaW5nLCBvbmUgcGVyIGxpbmUuXG4gICAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRoaXMubG9ja0Rlc2NyaXB0b3JzKGFwcCwgcGF0aCkpIHtcbiAgICAgIGZyYWdtZW50LmNyZWF0ZUVsKCdicicpO1xuICAgICAgYXBwZW5kQ29kZUJsb2NrKGZyYWdtZW50LCBkZXNjcmlwdG9yLnBsdWdpbk5hbWUpO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChgOiAke2Rlc2NyaXB0b3Iub3BlcmF0aW9uTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBhY3RpdmVPd25lclBhdGggPSBhY3RpdmVQYXRoID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGFjdGl2ZVBhdGgpO1xuXG4gICAgaWYgKGFjdGl2ZU93bmVyUGF0aCA9PT0gbnVsbCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0dXNCYXJJdGVtRWwpIHtcbiAgICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgICAgaWYgKCFzdGF0dXNCYXJFbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgICBzZXRJY29uKHRoaXMuc3RhdHVzQmFySXRlbUVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgLy8gVGhlIHNpbmdsZSBzdGF0dXMtYmFyIGl0ZW0gaXMgcmV1c2VkIGFjcm9zcyBhY3RpdmUtbm90ZSBzd2l0Y2hlcy5cbiAgICAgIC8vIEl0IG11c3QgcmVzb2x2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RlJ3Mgb3duZXIgbG9jayBhdCBjbGljayB0aW1lIHJhdGhlciB0aGFuIGNhcHR1cmluZyBvbmUgcGF0aC5cbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGhpcy5zdGF0dXNCYXJJdGVtRWwsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5maWxlPy5wYXRoO1xuICAgICAgICByZXR1cm4gcGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpID8/IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRvb2x0aXAodGhpcy5zdGF0dXNCYXJJdGVtRWwsIHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBhY3RpdmVPd25lclBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJlcyBhbiBvcHQtaW4gYGFib3J0YCBsaXN0ZW5lciBmb3IgYSBsb2NrIGVudHJ5OiB3aGVuIHRoZSBlbnRyeSdzIGNvbnRyb2xsZXIgYWJvcnRzLCByZWxlYXNlc1xuICAgKiB0aGUgZW50cnkgKGlmIHtAbGluayBMb2NrRW50cnkuc2hvdWxkUmVsZWFzZU9uQWJvcnR9KSBhbmQvb3IgaW52b2tlc1xuICAgKiB7QGxpbmsgTG9ja0VudHJ5Lm9uVW5sb2NrUmVxdWVzdGVkfS4gQSBuby1vcCB3aGVuIHRoZSBlbnRyeSBoYXMgbm8gY29udHJvbGxlciBvciBuZWl0aGVyIG9wdC1pbiBpc1xuICAgKiBzZXQsIHNvIHRyYW5zYWN0aW9uYWwgbG9ja3Mga2VlcCByZWxlYXNpbmcgdmlhIHRoZWlyIG93biBjbGVhbnVwLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZXhhY3QgcGF0aCB0aGUgZW50cnkgaXMgcmVnaXN0ZXJlZCB1bmRlci5cbiAgICogQHBhcmFtIGVudHJ5IC0gVGhlIGxvY2sgZW50cnkgd2hvc2UgY29udHJvbGxlciB0byBvYnNlcnZlLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlUmVsZWFzZU9uQWJvcnQoYXBwOiBBcHAsIHBhdGg6IHN0cmluZywgZW50cnk6IExvY2tFbnRyeSk6IHZvaWQge1xuICAgIGNvbnN0IHsgb25VbmxvY2tSZXF1ZXN0ZWQsIHNob3VsZFJlbGVhc2VPbkFib3J0IH0gPSBlbnRyeTtcbiAgICBpZiAoIWVudHJ5LmFib3J0Q29udHJvbGxlciB8fCAoIXNob3VsZFJlbGVhc2VPbkFib3J0ICYmICFvblVubG9ja1JlcXVlc3RlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cnkuYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgIGlmIChzaG91bGRSZWxlYXNlT25BYm9ydCkge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgcGF0aCwgZW50cnkpO1xuICAgICAgfVxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ/LigpO1xuICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGVyLXBsdWdpbiBoYW5kbGUgZm9yIHBhdGgtc2NvcGVkIHJlc291cmNlIGxvY2tpbmcgKGVkaXRvciByZWFkLW9ubHksIG9wdGlvbmFsIHZhdWx0LW11dGF0aW9uXG4gKiBibG9ja2luZywgYW5kIGV4dGVybmFsLWNoYW5nZSBkZXRlY3Rpb24gXHUyMDE0IHNlZSB0aGUgZmlsZSBvdmVydmlldykuIEFkZCBpdCBhcyBhIGNoaWxkIG9mIHlvdXIgcGx1Z2luXG4gKiAoYHRoaXMuYWRkQ2hpbGQobmV3IFJlc291cmNlTG9ja0NvbXBvbmVudCh0aGlzLmFwcCkpYCkgc28gdGhhdCBhbnkgbG9ja3MgaXQgc3RpbGwgaG9sZHMgYXJlIHJlbGVhc2VkXG4gKiBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBsdWdpbiB1bmxvYWRzIFx1MjAxNCBhIHJlc291cmNlIGNhbiBuZXZlciBiZSBsZWZ0IHN0dWNrIGxvY2tlZCBiZWNhdXNlIHRoZSBwbHVnaW5cbiAqIHRoYXQgbG9ja2VkIGl0IHdhcyBkaXNhYmxlZCBvciByZWxvYWRlZCBtaWQtb3BlcmF0aW9uLlxuICpcbiAqIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBhbmQgYXR0cmlidXRlZCB0byB0aGlzIHBsdWdpbiwgc28gdGhlIGxvY2sgaW5kaWNhdG9ycycgdG9vbHRpcCBuYW1lcyBpdFxuICogYW1vbmcgdGhlIHBsdWdpbnMgY3VycmVudGx5IGhvbGRpbmcgYSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NrQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBvd25pbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gTG9ja3MgYXJlIGF0dHJpYnV0ZWQgdG8gaXQgZm9yXG4gICAqIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIHJlc291cmNlLWxvY2sgaGFuZGxlIG93bmVkIGJ5IGEgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGlkIG9mIHRoZSBvd25pbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gTG9ja3MgYXJlIGF0dHJpYnV0ZWQgdG9cbiAgICogaXQgZm9yIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuICoqYW1iaWVudCBieXBhc3Mgc2NvcGUqKjogd2hpbGUgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpcyBub3QgZGlzcG9zZWQsIHRoaXNcbiAgICogcGx1Z2luJ3Mgb3duIG11dGF0aW9ucyBvZiB0aGUgZ2l2ZW4gcGF0aHMgKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgd2hvbGUgc3VidHJlZSkgcGFzcyB0aHJvdWdoIHRoZVxuICAgKiBtdXRhdGlvbiBibG9ja2VyIGluc3RlYWQgb2YgdGhyb3dpbmcge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBBbnkgbXV0YXRpb24gb2YgYSBibG9ja2VkIHBhdGhcbiAgICogTk9UIGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBzdGlsbCByZWplY3RlZC4gVXNlIGl0IHdpdGggYSBgdXNpbmdgIGRlY2xhcmF0aW9uIGFyb3VuZFxuICAgKiB0aGUgb3BlcmF0aW9uIHRoYXQgbGVnaXRpbWF0ZWx5IG11dGF0ZXMgcmVzb3VyY2VzIGl0IGhhcyBsb2NrZWQgd2l0aFxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnN9OlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB1c2luZyBfYnlwYXNzID0gY29tcG9uZW50LmJ5cGFzc0Jsb2NrZWRNdXRhdGlvbnMoW3NvdXJjZUZpbGUsIHRhcmdldEZpbGVdKTtcbiAgICogLy8gLi4uIHRoZSBvcGVyYXRpb24ncyBvd24gdmF1bHQgbXV0YXRpb25zIG9mIHRob3NlIHBhdGhzIGFyZSBhbGxvd2VkIC4uLlxuICAgKiAvLyBzY29wZSBlbmQ6IHRoZSBwYXRocyBhcmUgZW5mb3JjZWQgYWdhaW5cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoc09yRmlsZXMgLSBUaGUgcGF0aHMgKG9yIGZpbGVzL2ZvbGRlcnMpIHdob3NlIG11dGF0aW9uIGJ5IHRoaXMgb3BlcmF0aW9uIGlzIHNhbmN0aW9uZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgZW5kcyB0aGUgYnlwYXNzIHNjb3BlIHdoZW4gZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuYnlwYXNzKHRoaXMuYXBwLCBwYXRoc09yRmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgaXMgY292ZXJlZCBieSBhIGBzdWJ0cmVlYCBsb2NrIG9uIGFuIGFuY2VzdG9yLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkQnlBbmNlc3RvckZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWRCeUFuY2VzdG9yKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGJ5IGFueSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSB2YXVsdCBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZCBieSBhIGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9ja1xuICAgKiBvbiB0aGUgcGF0aCBpdHNlbGYgb3Igb24gYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgZWRpdGluZy9kZWxldGluZy9yZW5hbWluZy9tb3ZpbmcvY3JlYXRpbmcgdGhlIHBhdGggd291bGQgdGhyb3cgYVxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gICAqL1xuICBwdWJsaWMgaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIG9uIGJlaGFsZiBvZiB0aGlzIHBsdWdpbiwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50XG4gICAqIGFuZCBmdXR1cmUge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQuIFJlZmVyZW5jZS1jb3VudGVkOiBiYWxhbmNlIGVhY2ggY2FsbFxuICAgKiB3aXRoIGEgZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChpZGVhbGx5IHZpYSBgdXNpbmdgKSBvciB7QGxpbmsgdW5sb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBMb2NraW5nIHBhcmFtZXRlcnMuIEl0cyB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMucGF0aE9yRmlsZX1cbiAgICogYW5kIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5vcGVyYXRpb25OYW1lfSBhcmUgcmVxdWlyZWQgKHRoZSBsYXR0ZXIgaXMgc2hvd25cbiAgICogaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24pLiBQYXNzIGFuIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9XG4gICAqIHRvIG1ha2UgdGhlIGxvY2sgY2FuY2VsYWJsZSB2aWEgYSBsb2NrIGluZGljYXRvcidzIFwidW5sb2NrXCIgbWVudSwgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCxcbiAgICogb3Ige0BsaW5rIHJlcXVlc3RSZXNvdXJjZVVubG9ja0ZvclBhdGh9LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAgICovXG4gIHB1YmxpYyBsb2NrRm9yUGF0aChwYXJhbXM6IFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHtcbiAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBibG9ja3NNdXRhdGlvbnM6IHBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9ucyxcbiAgICAgIG1vZGU6IHBhcmFtcy5tb2RlLFxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ6IHBhcmFtcy5vblVubG9ja1JlcXVlc3RlZCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgICAgcGF0aE9yRmlsZTogcGFyYW1zLnBhdGhPckZpbGUsXG4gICAgICBwbHVnaW5JZDogdGhpcy5wbHVnaW5JZCxcbiAgICAgIHNob3VsZFJlbGVhc2VPbkFib3J0OiBwYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsb2NrIHN0aWxsIGhlbGQgYnkgdGhpcyBwbHVnaW4gd2hlbiB0aGUgY29tcG9uZW50IChhbmQgdGh1cyB0aGUgcGx1Z2luKSB1bmxvYWRzLFxuICAgKiBzbyBubyBub3RlIGlzIGxlZnQgc3R1Y2sgcmVhZC1vbmx5IGJ5IGFuIG9wZXJhdGlvbiB0aGF0IG5ldmVyIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrQWxsRm9yUGx1Z2luKHRoaXMuYXBwLCB0aGlzLnBsdWdpbklkKTtcbiAgICBzdXBlci5vbnVubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHVubG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGg6IHJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIGl0ICh0aGUgcGF0aCBpdHNlbGYgd2hlblxuICAgKiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyKSwgY2FuY2VscyB0aGUgb3BlcmF0aW9uKHMpIHRoYXQgdG9va1xuICAgKiB0aGUgbG9jayBieSBhYm9ydGluZyB0aGVpciB7QGxpbmsgQWJvcnRDb250cm9sbGVyfXMsIGFuZCByZWxlYXNlcyB0aGUgbG9jayBzbyB0aGUgbm90ZSBiZWNvbWVzXG4gICAqIGVkaXRhYmxlIFx1MjAxNCByZWdhcmRsZXNzIG9mIHdoaWNoIHBsdWdpbiBob2xkcyB0aGUgbG9jay4gUG93ZXJzIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQuIEFcbiAgICogbm8tb3Agd2hlbiBub3RoaW5nIGNvdmVycyB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0VW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLmZvcmNlVW5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biBieSB0aGUgdmF1bHQtbXV0YXRpb24gYmxvY2tlciB3aGVuIGEgcGx1Z2luIHRyaWVzIHRvIGVkaXQsIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciBjcmVhdGUgYVxuICogcmVzb3VyY2Ugd2hvc2UgcGF0aCBpcyBjb3ZlcmVkIGJ5IGEgbG9jayB0YWtlbiB3aXRoXG4gKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnN9LlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NrZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgdmF1bHQgcGF0aCB3aG9zZSBtdXRhdGlvbiB3YXMgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgVGhlIHJlc291cmNlIFwiJHtwYXRofVwiIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIG11dGF0ZWQuYCk7XG4gICAgdGhpcy5uYW1lID0gJ1Jlc291cmNlTG9ja2VkRXJyb3InO1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNvdXJjZUxvY2tlZEZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZChhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBcdTIwMTQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIFx1MjAxNCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGxvY2tpbmcgdGhlIG5vdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tSZXNvdXJjZUZvclBhdGgocGFyYW1zOiBMb2NrUmVzb3VyY2VGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYW4gdW5sb2NrIG9mIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGJ5IGFib3J0aW5nIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHRoYXQgd2FzXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBsb2NrIG9uIGl0ICh2aWEge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0nc1xuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0pLiBUaGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrXG4gKiBvYnNlcnZlIHRoZSBhYm9ydCBhbmQgcmVsZWFzZSB0aGVpciBvd24gbG9ja3MuIEEgbm8tb3Agd2hlbiBubyBhYm9ydGFibGUgbG9jayBpcyByZWdpc3RlcmVkIGZvciB0aGVcbiAqIHBhdGguXG4gKlxuICogVGhpcyBsZXRzIGEgY29uc3VtaW5nIHBsdWdpbiB3aXJlIGl0cyBvd24gXCJ1bmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGVcbiAqIGxvY2sgbWFuYWdlciBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnVubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxSZXNvdXJjZUxvY2tNYW5hZ2VyPihSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSwgbmV3IFJlc291cmNlTG9ja01hbmFnZXIoKSkudmFsdWU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFDQSxTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUCxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyw0QkFBNEI7QUFDckMsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsU0FBUztBQUNsQixTQUFTLGVBQWU7QUFDeEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGVBQWU7QUFDckIsTUFBTSwyQkFBMkI7QUFDakMsTUFBTSxpQ0FBaUM7QUFDdkMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxzQkFBc0I7QUFnSzVCLE1BQU0sb0NBQW9DLFlBQVk7QUFBQSxFQUNuQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRVYsWUFBWSxRQUFzRDtBQUN2RSxVQUFNO0FBQ04sU0FBSyxNQUFNLE9BQU87QUFDbEIsU0FBSyxXQUFXLE9BQU87QUFDdkIsU0FBSyxxQkFBcUIsT0FBTztBQUNqQyxTQUFLLGFBQWEsT0FBTztBQUFBLEVBQzNCO0FBQUEsRUFFZ0IsU0FBZTtBQUM3QixVQUFNLE9BQU87QUFDYixTQUFLLGNBQWMsS0FBSyxJQUFJLFVBQVUsR0FBRyxzQkFBc0IsS0FBSyxRQUFRLENBQUM7QUFDN0UsU0FBSyxjQUFjLEtBQUssSUFBSSxVQUFVLEdBQUcsaUJBQWlCLEtBQUssUUFBUSxDQUFDO0FBRXhFLFNBQUssY0FBYyxLQUFLLElBQUksVUFBVSxHQUFHLGFBQWEsS0FBSyxRQUFRLENBQUM7QUFFcEUsU0FBSyxjQUFjLEtBQUssSUFBSSxVQUFVLEdBQUcsYUFBYSxLQUFLLFVBQVUsQ0FBQztBQUV0RSxTQUFLLGNBQWMsS0FBSyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBZTtBQUM3RCxXQUFLLG1CQUFtQixLQUFLLElBQUk7QUFBQSxJQUNuQyxDQUFDLENBQUM7QUFDRixTQUFLLGNBQWMsS0FBSyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBZTtBQUM3RCxXQUFLLG1CQUFtQixLQUFLLElBQUk7QUFBQSxJQUNuQyxDQUFDLENBQUM7QUFDRixTQUFLLGNBQWMsS0FBSyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxZQUFrQjtBQUN0RSxXQUFLLG1CQUFtQixPQUFPO0FBQy9CLFdBQUssbUJBQW1CLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUMsQ0FBQztBQUNGLFNBQUssY0FBYyxLQUFLLElBQUksY0FBYyxHQUFHLFdBQVcsQ0FBQyxTQUFlO0FBQ3RFLFdBQUssbUJBQW1CLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFDRjtBQVNBLE1BQU0sNkNBQTZDLHNCQUFzQjtBQUFBLEVBQ3REO0FBQUEsRUFFVixZQUFZLFFBQStEO0FBQ2hGLFVBQU07QUFDTixTQUFLLHNCQUFzQixPQUFPO0FBQUEsRUFDcEM7QUFBQSxFQUVnQixTQUFlO0FBQzdCLFVBQU0sT0FBTztBQUViLFNBQUssb0JBQXFDO0FBQUEsTUFDeEMsWUFBWTtBQUFBLE1BQ1osS0FBSyxNQUFNO0FBQUEsTUFDWCxjQUFjLENBQUMsRUFBRSxVQUFVLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTTtBQUNwRCxhQUFLLGlCQUFpQixDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ2pDLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxvQkFBbUM7QUFBQSxNQUN0QyxZQUFZO0FBQUEsTUFDWixLQUFLLE1BQU07QUFBQSxNQUNYLGNBQWMsQ0FBQyxFQUFFLFVBQVUsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU07QUFDekQsYUFBSyxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7QUFDL0IsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLG9CQUFxQztBQUFBLE1BQ3hDLFlBQVk7QUFBQSxNQUNaLEtBQUssTUFBTTtBQUFBLE1BQ1gsY0FBYyxDQUFDLEVBQUUsVUFBVSxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDcEQsYUFBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7QUFDNUIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLG9CQUEyQztBQUFBLE1BQzlDLFlBQVk7QUFBQSxNQUNaLEtBQUssTUFBTTtBQUFBLE1BQ1gsY0FBYyxDQUFDLEVBQUUsVUFBVSxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDcEQsYUFBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7QUFDNUIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLG9CQUEyQztBQUFBLE1BQzlDLFlBQVk7QUFBQSxNQUNaLEtBQUssTUFBTTtBQUFBLE1BQ1gsY0FBYyxDQUFDLEVBQUUsVUFBVSxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDcEQsYUFBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7QUFDNUIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLG9CQUFxQztBQUFBLE1BQ3hDLFlBQVk7QUFBQSxNQUNaLEtBQUssTUFBTTtBQUFBLE1BQ1gsY0FBYyxDQUFDLEVBQUUsVUFBVSxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDcEQsYUFBSyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNqQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQXFDO0FBQUEsTUFDeEMsWUFBWTtBQUFBLE1BQ1osS0FBSyxNQUFNO0FBQUEsTUFDWCxjQUFjLENBQUMsRUFBRSxVQUFVLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTTtBQUNwRCxhQUFLLGlCQUFpQixDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ2pDLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxvQkFBMkM7QUFBQSxNQUM5QyxZQUFZO0FBQUEsTUFDWixLQUFLLE1BQU07QUFBQSxNQUNYLGNBQWMsQ0FBQyxFQUFFLFVBQVUsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNO0FBQ3BELGFBQUssaUJBQWlCLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDakMsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLG9CQUFzQztBQUFBLE1BQ3pDLFlBQVk7QUFBQSxNQUNaLEtBQUssTUFBTTtBQUFBLE1BQ1gsY0FBYyxDQUFDLEVBQUUsVUFBVSxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDcEQsYUFBSyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNqQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQXFDO0FBQUEsTUFDeEMsWUFBWTtBQUFBLE1BQ1osS0FBSyxNQUFNO0FBQUEsTUFDWCxjQUFjLENBQUMsRUFBRSxVQUFVLGNBQWMsQ0FBQyxNQUFNLE9BQU8sRUFBRSxNQUFNO0FBQzdELGFBQUssaUJBQWlCLENBQUMsS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQW9DO0FBQUEsTUFDdkMsWUFBWTtBQUFBLE1BQ1osS0FBSyxNQUFNO0FBQUEsTUFDWCxjQUFjLENBQUMsRUFBRSxVQUFVLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTTtBQUNwRCxhQUFLLGlCQUFpQixDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ2pDLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxvQkFBK0M7QUFBQSxNQUNsRCxZQUFZO0FBQUEsTUFDWixLQUFLLFlBQVk7QUFBQSxNQUNqQixjQUFjLENBQUMsRUFBRSxVQUFVLGNBQWMsQ0FBQyxNQUFNLE9BQU8sRUFBRSxNQUFNO0FBQzdELGFBQUssaUJBQWlCLENBQUMsS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQThDO0FBQUEsTUFDakQsWUFBWTtBQUFBLE1BQ1osS0FBSyxZQUFZO0FBQUEsTUFDakIsY0FBYyxDQUFDLEVBQUUsVUFBVSxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDcEQsYUFBSyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNqQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVRLGlCQUFpQixPQUF1QjtBQUM5QyxlQUFXLFFBQVEsT0FBTztBQUN4QixVQUFJLEtBQUssb0JBQW9CLElBQUksR0FBRztBQUNsQyxjQUFNLElBQUksb0JBQW9CLElBQUk7QUFBQSxNQUNwQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFTQSxNQUFNLG9CQUFvQjtBQUFBLEVBQ1AsU0FBUyxJQUFJLE9BQU87QUFBQSxFQUNwQixpQkFBaUIsb0JBQUksSUFBeUI7QUFBQSxFQUN2RCxrQkFBc0Q7QUFBQSxFQUM3QyxtQkFBbUIsb0JBQUksSUFBa0M7QUFBQSxFQUN6RCxvQkFBb0Isb0JBQUksSUFBeUI7QUFBQSxFQUMxRCwyQkFBd0U7QUFBQSxFQUN4RSxrQkFBc0M7QUFBQSxFQUV2QyxPQUFPLEtBQVUsY0FBaUQ7QUFDdkUsVUFBTSxnQkFBcUMsSUFBSSxJQUFJLGFBQWEsSUFBSSxDQUFDLGVBQWUsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQzdHLFNBQUssZUFBZSxJQUFJLGFBQWE7QUFDckMsV0FBTyxJQUFJLG1CQUFtQjtBQUFBLE1BQzVCLFVBQVUsTUFBWTtBQUNwQixhQUFLLGVBQWUsT0FBTyxhQUFhO0FBQUEsTUFDMUM7QUFBQSxNQUNBLHlCQUF5Qix3QkFBd0I7QUFBQSxJQUNuRCxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY08sWUFBWSxLQUFVLFlBQThCO0FBQ3pELFVBQU0sWUFBWSxLQUFLLHFCQUFxQixLQUFLLFFBQVEsS0FBSyxVQUFVLENBQUM7QUFDekUsUUFBSSxjQUFjLE1BQU07QUFDdEI7QUFBQSxJQUNGO0FBQ0EsU0FBSyx1QkFBdUIsS0FBSyxTQUFTO0FBQUEsRUFDNUM7QUFBQSxFQUVPLFNBQVMsS0FBVSxZQUFpQztBQUN6RCxXQUFPLEtBQUssYUFBYSxRQUFRLEtBQUssVUFBVSxDQUFDO0FBQUEsRUFDbkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTyxtQkFBbUIsS0FBVSxZQUFpQztBQUNuRSxXQUFPLEtBQUsscUJBQXFCLEtBQUssUUFBUSxLQUFLLFVBQVUsQ0FBQyxNQUFNO0FBQUEsRUFDdEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTyw0QkFBNEIsS0FBVSxZQUFpQztBQUM1RSxVQUFNLE9BQU8sUUFBUSxLQUFLLFVBQVU7QUFDcEMsVUFBTSxlQUFlLEtBQUssa0JBQWtCLElBQUksSUFBSTtBQUNwRCxRQUFJLGNBQWMsS0FBSyxDQUFDLFVBQVUsTUFBTSxlQUFlLEdBQUc7QUFDeEQsYUFBTztBQUFBLElBQ1Q7QUFDQSxlQUFXLENBQUMsWUFBWSxPQUFPLEtBQUssS0FBSyxtQkFBbUI7QUFDMUQsVUFBSSxRQUFRLEtBQUssQ0FBQyxVQUFVLE1BQU0sU0FBUyxhQUFhLE1BQU0sZUFBZSxLQUFLLFFBQVEsRUFBRSxLQUFLLGlCQUFpQixNQUFNLGtCQUFrQixXQUFXLENBQUMsR0FBRztBQUN2SixlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRU8sS0FBSyxRQUF1QztBQUNqRCxVQUFNLEVBQUUsSUFBSSxJQUFJO0FBQ2hCLFVBQU0sT0FBTyxRQUFRLEtBQUssT0FBTyxVQUFVO0FBQzNDLFVBQU0sUUFBbUI7QUFBQSxNQUN2QixpQkFBaUIsT0FBTyxtQkFBbUI7QUFBQSxNQUMzQyxpQkFBaUIsT0FBTyxtQkFBbUI7QUFBQSxNQUMzQyxNQUFNLE9BQU8sUUFBUTtBQUFBLE1BQ3JCLG1CQUFtQixPQUFPLHFCQUFxQjtBQUFBLE1BQy9DLGVBQWUsT0FBTztBQUFBLE1BQ3RCLFVBQVUsT0FBTztBQUFBLE1BQ2pCLHNCQUFzQixPQUFPLHdCQUF3QjtBQUFBLElBQ3ZEO0FBQ0EsUUFBSSxVQUFVLEtBQUssa0JBQWtCLElBQUksSUFBSTtBQUM3QyxRQUFJLENBQUMsU0FBUztBQUNaLGdCQUFVLENBQUM7QUFDWCxXQUFLLGtCQUFrQixJQUFJLE1BQU0sT0FBTztBQUFBLElBQzFDO0FBQ0EsWUFBUSxLQUFLLEtBQUs7QUFDbEIsU0FBSyxpQkFBaUIsR0FBRztBQUN6QixRQUFJLE1BQU0saUJBQWlCO0FBQ3pCLFdBQUssdUJBQXVCLEdBQUc7QUFBQSxJQUNqQztBQUNBLFNBQUssbUJBQW1CLEtBQUssTUFBTSxLQUFLO0FBQ3hDLFNBQUssVUFBVSxHQUFHO0FBRWxCLFdBQU8sSUFBSSxtQkFBbUI7QUFBQSxNQUM1QixVQUFVLE1BQVk7QUFDcEIsYUFBSyxZQUFZLEtBQUssTUFBTSxLQUFLO0FBQUEsTUFDbkM7QUFBQSxNQUNBLHlCQUF5Qix3QkFBd0I7QUFBQSxJQUNuRCxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV08sY0FBYyxLQUFVLFlBQThCO0FBQzNELFVBQU0sVUFBVSxLQUFLLGtCQUFrQixJQUFJLFFBQVEsS0FBSyxVQUFVLENBQUM7QUFDbkUsUUFBSSxDQUFDLFNBQVM7QUFDWjtBQUFBLElBQ0Y7QUFDQSxlQUFXLFNBQVMsU0FBUztBQUMzQixZQUFNLGlCQUFpQixNQUFNO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBQUEsRUFFTyxPQUFPLEtBQVUsWUFBd0IsVUFBd0I7QUFDdEUsVUFBTSxPQUFPLFFBQVEsS0FBSyxVQUFVO0FBQ3BDLFVBQU0sVUFBVSxLQUFLLGtCQUFrQixJQUFJLElBQUk7QUFDL0MsUUFBSSxDQUFDLFNBQVM7QUFDWjtBQUFBLElBQ0Y7QUFDQSxVQUFNLFFBQVEsUUFBUSxVQUFVLENBQUMsVUFBVSxNQUFNLGFBQWEsUUFBUTtBQUN0RSxRQUFJLFVBQVUsSUFBSTtBQUNoQjtBQUFBLElBQ0Y7QUFDQSxZQUFRLE9BQU8sT0FBTyxDQUFDO0FBQ3ZCLFFBQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsV0FBSyxrQkFBa0IsT0FBTyxJQUFJO0FBQUEsSUFDcEM7QUFDQSxTQUFLLG9CQUFvQixHQUFHO0FBQUEsRUFDOUI7QUFBQSxFQUVPLG1CQUFtQixLQUFVLFVBQXdCO0FBQzFELGVBQVcsQ0FBQyxNQUFNLE9BQU8sS0FBSyxLQUFLLG1CQUFtQjtBQUNwRCxZQUFNLFlBQVksUUFBUSxPQUFPLENBQUMsVUFBVSxNQUFNLGFBQWEsUUFBUTtBQUN2RSxVQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLGFBQUssa0JBQWtCLE9BQU8sSUFBSTtBQUFBLE1BQ3BDLFdBQVcsVUFBVSxXQUFXLFFBQVEsUUFBUTtBQUM5QyxhQUFLLGtCQUFrQixJQUFJLE1BQU0sU0FBUztBQUFBLE1BQzVDO0FBQUEsSUFDRjtBQUNBLFNBQUssb0JBQW9CLEdBQUc7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV1EsdUJBQXVCLEtBQVUsV0FBeUI7QUFDaEUsVUFBTSxVQUFVLEtBQUssa0JBQWtCLElBQUksU0FBUztBQUNwRCxzQkFBa0IsT0FBTztBQUN6QixlQUFXLFNBQVMsQ0FBQyxHQUFHLE9BQU8sR0FBRztBQUNoQyxZQUFNLGlCQUFpQixNQUFNO0FBQUEsSUFDL0I7QUFDQSxTQUFLLGtCQUFrQixPQUFPLFNBQVM7QUFDdkMsU0FBSyxvQkFBb0IsR0FBRztBQUFBLEVBQzlCO0FBQUEsRUFFUSxrQkFBa0IsS0FBVSxNQUFZLE1BQW9CO0FBQ2xFLFNBQUssUUFBUSxDQUFDLFNBQVM7QUFDckIsV0FDRyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLGFBQWEsY0FBYyxDQUFDLEVBQ2pFLFFBQVEsY0FBYyxFQUN0QixRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLGNBQU0sY0FBYyxNQUFNLFFBQVE7QUFBQSxVQUNoQztBQUFBLFVBQ0EsU0FBUyxLQUFLLHFCQUFxQixLQUFLLElBQUk7QUFBQSxVQUM1QyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLGFBQWEsa0JBQWtCO0FBQUEsUUFDcEUsQ0FBQztBQUNELFlBQUksYUFBYTtBQUVmLGVBQUssdUJBQXVCLEtBQUssSUFBSTtBQUFBLFFBQ3ZDO0FBQUEsTUFDRixDQUFDLENBQUM7QUFBQSxJQUNOLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFUSxpQkFBaUIsS0FBVSxNQUFvQixNQUFjLFNBQWlDO0FBQ3BHLFVBQU0sZUFBZSxLQUFLLFVBQVUsY0FBYyxTQUFTLElBQUk7QUFDL0QsU0FBSyxtQkFBbUIsS0FBSyxjQUFjLE1BQU0sSUFBSTtBQUVyRCxRQUFJLFlBQWdDO0FBQ3BDLFVBQU0sdUJBQXVCLEtBQUssS0FBSztBQUN2QyxRQUFJLHNCQUFzQjtBQUN4QixrQkFBWSxxQkFBcUIsV0FBVyxFQUFFLEtBQUsseUJBQXlCLENBQUM7QUFDN0UsY0FBUSxXQUFXLFlBQVk7QUFDL0IsaUJBQVcsV0FBVyxPQUFPO0FBQzdCLFdBQUssbUJBQW1CLEtBQUssV0FBVyxNQUFNLElBQUk7QUFBQSxJQUNwRDtBQUtBLFVBQU0sZ0JBQWdCLE1BQVk7QUFDaEMsV0FBSyxnQkFBZ0IsSUFBSTtBQUN6QixXQUFLLE9BQU8sS0FBSztBQUFBLElBQ25CO0FBQ0EsU0FBSyxVQUFVLGlCQUFpQixlQUFlLGFBQWE7QUFFNUQsV0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBLHFCQUFxQixNQUFZO0FBQy9CLGFBQUssVUFBVSxvQkFBb0IsZUFBZSxhQUFhO0FBQUEsTUFDakU7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLHVCQUF1QixLQUFnQjtBQUM3QyxRQUFJLEtBQUssMEJBQTBCO0FBQ2pDO0FBQUEsSUFDRjtBQUNBLFNBQUssMkJBQTJCLElBQUkscUNBQXFDO0FBQUEsTUFDdkUscUJBQXFCLENBQUMsU0FBa0IsS0FBSyxvQkFBb0IsS0FBSyxJQUFJO0FBQUEsSUFDNUUsQ0FBQztBQUNELFNBQUsseUJBQXlCLEtBQUs7QUFBQSxFQUNyQztBQUFBLEVBRVEsaUJBQWlCLEtBQWdCO0FBQ3ZDLFFBQUksS0FBSyxpQkFBaUI7QUFDeEI7QUFBQSxJQUNGO0FBQ0EsU0FBSyxrQkFBa0IsSUFBSSw0QkFBNEI7QUFBQSxNQUNyRDtBQUFBLE1BQ0EsVUFBVSxNQUFZO0FBQ3BCLGFBQUssVUFBVSxHQUFHO0FBQUEsTUFDcEI7QUFBQSxNQUNBLG9CQUFvQixDQUFDLFNBQWU7QUFDbEMsYUFBSyx1QkFBdUIsS0FBSyxJQUFJO0FBQUEsTUFDdkM7QUFBQSxNQUNBLFlBQVksQ0FBQyxNQUFNLFNBQWU7QUFDaEMsYUFBSyxlQUFlLEtBQUssTUFBTSxJQUFJO0FBQUEsTUFDckM7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLGdCQUFnQixLQUFLO0FBQUEsRUFDNUI7QUFBQSxFQUVRLGFBQWEsSUFBdUI7QUFDMUMsT0FBRyxZQUFZLDhCQUE4QjtBQUU3QyxPQUFHLHNCQUFzQjtBQUN6QixPQUFHLFNBQVMsOEJBQThCO0FBQUEsRUFDNUM7QUFBQSxFQUVRLGdCQUFnQixNQUEwQjtBQUNoRCxVQUFNLGFBQWEsS0FBSyxpQkFBaUIsSUFBSSxJQUFJO0FBQ2pELGVBQVcsTUFBTSxDQUFDLFlBQVksY0FBYyxZQUFZLFdBQVcsS0FBSyxlQUFlLEdBQUc7QUFDeEYsVUFBSSxJQUFJO0FBQ04sYUFBSyxhQUFhLEVBQUU7QUFBQSxNQUN0QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlRLHVCQUF1QixLQUFVLE1BQW9CO0FBQzNELFFBQUksQ0FBQyxLQUFLLDRCQUE0QixLQUFLLElBQUksR0FBRztBQUNoRDtBQUFBLElBQ0Y7QUFDQSxRQUFJLEtBQUssV0FBVyxLQUFLLElBQUksR0FBRztBQUM5QjtBQUFBLElBQ0Y7QUFDQSxlQUFXLENBQUMsWUFBWSxPQUFPLEtBQUssS0FBSyxtQkFBbUI7QUFDMUQsaUJBQVcsU0FBUyxTQUFTO0FBQzNCLFlBQUksQ0FBQyxNQUFNLG1CQUFtQixDQUFDLE1BQU0saUJBQWlCO0FBQ3BEO0FBQUEsUUFDRjtBQUNBLGNBQU0sYUFBYSxlQUFlLFFBQVMsTUFBTSxTQUFTLGFBQWEsUUFBUSxFQUFFLEtBQUssaUJBQWlCLE1BQU0sa0JBQWtCLFdBQVcsQ0FBQztBQUMzSSxZQUFJLFlBQVk7QUFDZCxnQkFBTSxnQkFBZ0IsTUFBTTtBQUFBLFFBQzlCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFUSxlQUFlLEtBQVUsTUFBWSxNQUEyQjtBQUV0RSxVQUFNLFlBQVksS0FBSyxxQkFBcUIsS0FBSyxLQUFLLElBQUk7QUFDMUQsUUFBSSxjQUFjLE1BQU07QUFDdEI7QUFBQSxJQUNGO0FBQ0EsU0FBSyxrQkFBa0IsS0FBSyxNQUFNLFNBQVM7QUFBQSxFQUM3QztBQUFBLEVBRVEsa0JBQTJCO0FBQ2pDLGVBQVcsV0FBVyxLQUFLLGtCQUFrQixPQUFPLEdBQUc7QUFDckQsVUFBSSxRQUFRLEtBQUssQ0FBQyxVQUFVLE1BQU0sZUFBZSxHQUFHO0FBQ2xELGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVVEsV0FBVyxLQUFVLE1BQXVCO0FBQ2xELGVBQVcsaUJBQWlCLEtBQUssZ0JBQWdCO0FBQy9DLGlCQUFXLGdCQUFnQixlQUFlO0FBQ3hDLFlBQUksY0FBYyxFQUFFLEtBQUssaUJBQWlCLE1BQU0sa0JBQWtCLGFBQWEsQ0FBQyxHQUFHO0FBQ2pGLGlCQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVRLGFBQWEsTUFBdUI7QUFDMUMsWUFBUSxLQUFLLGtCQUFrQixJQUFJLElBQUksR0FBRyxVQUFVLEtBQUs7QUFBQSxFQUMzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZUSxnQkFBZ0IsS0FBVSxNQUFnQztBQUNoRSxVQUFNLFVBQVUsS0FBSyxrQkFBa0IsSUFBSSxJQUFJO0FBQy9DLHNCQUFrQixPQUFPO0FBQ3pCLFVBQU0sT0FBTyxvQkFBSSxJQUFZO0FBQzdCLFVBQU0sY0FBZ0MsQ0FBQztBQUN2QyxlQUFXLFNBQVMsU0FBUztBQUMzQixZQUFNLGFBQWEsSUFBSSxRQUFRLFVBQVUsTUFBTSxRQUFRLEdBQUcsUUFBUSxNQUFNO0FBQ3hFLFlBQU0sTUFBTSxHQUFHLFVBQVU7QUFBQSxFQUFLLE1BQU0sYUFBYTtBQUNqRCxVQUFJLEtBQUssSUFBSSxHQUFHLEdBQUc7QUFDakI7QUFBQSxNQUNGO0FBQ0EsV0FBSyxJQUFJLEdBQUc7QUFDWixrQkFBWSxLQUFLLEVBQUUsZUFBZSxNQUFNLGVBQWUsV0FBVyxDQUFDO0FBQUEsSUFDckU7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEsbUJBQW1CLEtBQVUsTUFBd0I7QUFDM0QsVUFBTSxVQUFVLEtBQUssa0JBQWtCLElBQUksSUFBSTtBQUUvQyxzQkFBa0IsT0FBTztBQUN6QixVQUFNLFlBQVksQ0FBQyxHQUFHLElBQUksSUFBSSxRQUFRLElBQUksQ0FBQyxVQUFVLE1BQU0sUUFBUSxDQUFDLENBQUM7QUFDckUsV0FBTyxVQUFVLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxVQUFVLFFBQVEsR0FBRyxRQUFRLFFBQVE7QUFBQSxFQUN0RjtBQUFBLEVBRVEsWUFBWSxLQUFVLE1BQXNCO0FBQ2xELFVBQU0sU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixhQUFhLGVBQWU7QUFFdkUsV0FBTyxDQUFDLFFBQVEsR0FBRyxLQUFLLG1CQUFtQixLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSTtBQUFBLEVBQ2xFO0FBQUEsRUFFUSxVQUFVLEtBQWdCO0FBQ2hDLFVBQU0sY0FBYyxvQkFBSSxJQUFrQjtBQUMxQyxlQUFXLFFBQVEsSUFBSSxVQUFVLGdCQUFnQixTQUFTLFFBQVEsR0FBRztBQUNuRSxZQUFNLE9BQU8sS0FBSztBQUNsQixVQUFJLEVBQUUsZ0JBQWdCLGVBQWU7QUFDbkM7QUFBQSxNQUNGO0FBRUEsWUFBTSxPQUFPLEtBQUssTUFBTTtBQUN4QixVQUFJLFNBQVMsUUFBVztBQUN0QjtBQUFBLE1BQ0Y7QUFHQSxZQUFNLFlBQVksS0FBSyxxQkFBcUIsS0FBSyxJQUFJO0FBQ3JELFVBQUksY0FBYyxNQUFNO0FBQ3RCLG9CQUFZLElBQUksSUFBSTtBQUNwQixjQUFNLFVBQVUsS0FBSyxZQUFZLEtBQUssU0FBUztBQUsvQyw2QkFBcUIsS0FBSyxRQUFRLElBQUk7QUFDdEMsY0FBTSxhQUFhLEtBQUssaUJBQWlCLElBQUksSUFBSTtBQUNqRCxZQUFJLFlBQVk7QUFDZCxlQUFLLHdCQUF3QixZQUFZLE9BQU87QUFBQSxRQUNsRCxPQUFPO0FBQ0wsZUFBSyxpQkFBaUIsSUFBSSxNQUFNLEtBQUssaUJBQWlCLEtBQUssTUFBTSxXQUFXLE9BQU8sQ0FBQztBQUFBLFFBQ3RGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxlQUFXLENBQUMsTUFBTSxVQUFVLEtBQUssS0FBSyxrQkFBa0I7QUFDdEQsVUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEdBQUc7QUFDMUIsNkJBQXFCLEtBQUssUUFBUSxLQUFLO0FBQ3ZDLG1CQUFXLG9CQUFvQjtBQUMvQixtQkFBVyxhQUFhLE9BQU87QUFDL0IsbUJBQVcsV0FBVyxPQUFPO0FBQzdCLGFBQUssaUJBQWlCLE9BQU8sSUFBSTtBQUFBLE1BQ25DO0FBQUEsSUFDRjtBQUVBLFNBQUssZ0JBQWdCLEdBQUc7QUFBQSxFQUMxQjtBQUFBLEVBRVEsb0JBQW9CLEtBQWdCO0FBQzFDLFNBQUssVUFBVSxHQUFHO0FBQ2xCLFFBQUksS0FBSyxrQkFBa0IsU0FBUyxHQUFHO0FBQ3JDLFdBQUssaUJBQWlCLE9BQU87QUFDN0IsV0FBSyxrQkFBa0I7QUFBQSxJQUN6QjtBQUNBLFFBQUksQ0FBQyxLQUFLLGdCQUFnQixHQUFHO0FBQzNCLFdBQUssMEJBQTBCLE9BQU87QUFDdEMsV0FBSywyQkFBMkI7QUFBQSxJQUNsQztBQUFBLEVBQ0Y7QUFBQSxFQUVRLG1CQUFtQixLQUFVLElBQWlCLGdCQUFnRDtBQU1wRyxVQUFNLGlCQUFpQixDQUFDLFFBQTBCO0FBQ2hELFVBQUksZUFBZTtBQUNuQixZQUFNLE9BQU8sZUFBZTtBQUM1QixVQUFJLFNBQVMsUUFBVztBQUN0QjtBQUFBLE1BQ0Y7QUFDQSxZQUFNLE9BQU8sSUFBSSxLQUFLO0FBQ3RCLFdBQUssa0JBQWtCLEtBQUssTUFBTSxJQUFJO0FBQ3RDLFdBQUssaUJBQWlCLEdBQUc7QUFBQSxJQUMzQjtBQUNBLE9BQUcsaUJBQWlCLFNBQVMsY0FBYztBQUMzQyxPQUFHLGlCQUFpQixlQUFlLGNBQWM7QUFDakQsT0FBRyxpQkFBaUIsWUFBWSxDQUFDLFFBQVE7QUFDdkMsVUFBSSxJQUFJLFdBQVcscUJBQXFCO0FBQ3RDLHVCQUFlLEdBQUc7QUFBQSxNQUNwQjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVRLFlBQVksS0FBVSxNQUFjLE9BQXdCO0FBQ2xFLFVBQU0sVUFBVSxLQUFLLGtCQUFrQixJQUFJLElBQUk7QUFDL0MsUUFBSSxDQUFDLFNBQVM7QUFDWjtBQUFBLElBQ0Y7QUFDQSxVQUFNLFFBQVEsUUFBUSxRQUFRLEtBQUs7QUFDbkMsUUFBSSxVQUFVLElBQUk7QUFDaEI7QUFBQSxJQUNGO0FBQ0EsWUFBUSxPQUFPLE9BQU8sQ0FBQztBQUN2QixRQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCLFdBQUssa0JBQWtCLE9BQU8sSUFBSTtBQUFBLElBQ3BDO0FBQ0EsU0FBSyxvQkFBb0IsR0FBRztBQUFBLEVBQzlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXUSxxQkFBcUIsS0FBVSxNQUE2QjtBQUNsRSxRQUFJLEtBQUssYUFBYSxJQUFJLEdBQUc7QUFDM0IsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLGdCQUErQjtBQUNuQyxlQUFXLENBQUMsWUFBWSxPQUFPLEtBQUssS0FBSyxtQkFBbUI7QUFDMUQsWUFBTSxpQkFBaUIsUUFBUSxLQUFLLENBQUMsVUFBVSxNQUFNLFNBQVMsU0FBUztBQUN2RSxVQUFJLGtCQUFrQixRQUFRLEVBQUUsS0FBSyxpQkFBaUIsTUFBTSxrQkFBa0IsV0FBVyxDQUFDLE1BQU0sa0JBQWtCLFFBQVEsV0FBVyxTQUFTLGNBQWMsU0FBUztBQUNuSyx3QkFBZ0I7QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVRLG9CQUFvQixLQUFVLE1BQXVCO0FBQzNELFFBQUksQ0FBQyxLQUFLLDRCQUE0QixLQUFLLElBQUksR0FBRztBQUNoRCxhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU8sQ0FBQyxLQUFLLFdBQVcsS0FBSyxJQUFJO0FBQUEsRUFDbkM7QUFBQSxFQUVRLHFCQUFxQixLQUFVLE1BQWdDO0FBQ3JFLFVBQU0sV0FBVyxlQUFlO0FBQ2hDLGFBQVMsV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixhQUFhLG9CQUFvQixDQUFDO0FBR2xGLGVBQVcsY0FBYyxLQUFLLGdCQUFnQixLQUFLLElBQUksR0FBRztBQUN4RCxlQUFTLFNBQVMsSUFBSTtBQUN0QixzQkFBZ0IsVUFBVSxXQUFXLFVBQVU7QUFDL0MsZUFBUyxXQUFXLEtBQUssV0FBVyxhQUFhLEVBQUU7QUFBQSxJQUNyRDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFUSx3QkFBd0IsWUFBNEIsU0FBdUI7QUFDakYsZUFBVyxXQUFXLGNBQWMsT0FBTztBQUMzQyxRQUFJLFdBQVcsV0FBVztBQUN4QixpQkFBVyxXQUFXLFdBQVcsT0FBTztBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUFBLEVBRVEsZ0JBQWdCLEtBQWdCO0FBQ3RDLFVBQU0sYUFBYSxJQUFJLFVBQVUsb0JBQW9CLFlBQVk7QUFDakUsVUFBTSxhQUFhLFlBQVksTUFBTTtBQUNyQyxVQUFNLGtCQUFrQixlQUFlLFNBQVksT0FBTyxLQUFLLHFCQUFxQixLQUFLLFVBQVU7QUFFbkcsUUFBSSxvQkFBb0IsUUFBUSxDQUFDLFlBQVk7QUFDM0MsV0FBSyxpQkFBaUIsT0FBTztBQUM3QixXQUFLLGtCQUFrQjtBQUN2QjtBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsS0FBSyxpQkFBaUI7QUFDekIsWUFBTSxjQUFjLFdBQVcsWUFBWSxjQUFjLEtBQUssY0FBMkIsdUJBQXVCO0FBQ2hILFVBQUksQ0FBQyxhQUFhO0FBQ2hCO0FBQUEsTUFDRjtBQUNBLFdBQUssa0JBQWtCLFlBQVksVUFBVSxFQUFFLEtBQUssQ0FBQywyQkFBMkIsd0JBQXdCLEVBQUUsQ0FBQztBQUMzRyxjQUFRLEtBQUssaUJBQWlCLFlBQVk7QUFHMUMsV0FBSyxtQkFBbUIsS0FBSyxLQUFLLGlCQUFpQixNQUFNO0FBQ3ZELGNBQU0sT0FBTyxJQUFJLFVBQVUsb0JBQW9CLFlBQVksR0FBRyxNQUFNO0FBQ3BFLGVBQU8sU0FBUyxTQUFZLFNBQVksS0FBSyxxQkFBcUIsS0FBSyxJQUFJLEtBQUs7QUFBQSxNQUNsRixDQUFDO0FBQUEsSUFDSDtBQUVBLGVBQVcsS0FBSyxpQkFBaUIsS0FBSyxZQUFZLEtBQUssZUFBZSxDQUFDO0FBQUEsRUFDekU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWVEsbUJBQW1CLEtBQVUsTUFBYyxPQUF3QjtBQUN6RSxVQUFNLEVBQUUsbUJBQW1CLHFCQUFxQixJQUFJO0FBQ3BELFFBQUksQ0FBQyxNQUFNLG1CQUFvQixDQUFDLHdCQUF3QixDQUFDLG1CQUFvQjtBQUMzRTtBQUFBLElBQ0Y7QUFDQSxVQUFNLGdCQUFnQixPQUFPLGlCQUFpQixTQUFTLE1BQU07QUFDM0QsVUFBSSxzQkFBc0I7QUFDeEIsYUFBSyxZQUFZLEtBQUssTUFBTSxLQUFLO0FBQUEsTUFDbkM7QUFDQSwwQkFBb0I7QUFBQSxJQUN0QixHQUFHLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFBQSxFQUNuQjtBQUNGO0FBWU8sTUFBTSw4QkFBOEIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWxDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNaLFlBQVksS0FBVSxVQUFrQjtBQUM3QyxVQUFNO0FBQ04sU0FBSyxNQUFNO0FBQ1gsU0FBSyxXQUFXO0FBQUEsRUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFtQk8sdUJBQXVCLGNBQWlEO0FBQzdFLFdBQU8sV0FBVyxFQUFFLE9BQU8sS0FBSyxLQUFLLFlBQVk7QUFBQSxFQUNuRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sMEJBQTBCLFlBQWlDO0FBQ2hFLFdBQU8sV0FBVyxFQUFFLG1CQUFtQixLQUFLLEtBQUssVUFBVTtBQUFBLEVBQzdEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxnQkFBZ0IsWUFBaUM7QUFDdEQsV0FBTyxXQUFXLEVBQUUsU0FBUyxLQUFLLEtBQUssVUFBVTtBQUFBLEVBQ25EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVU8sbUNBQW1DLFlBQWlDO0FBQ3pFLFdBQU8sV0FBVyxFQUFFLDRCQUE0QixLQUFLLEtBQUssVUFBVTtBQUFBLEVBQ3RFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFjTyxZQUFZLFFBQTREO0FBQzdFLFdBQU8sV0FBVyxFQUFFLEtBQUs7QUFBQSxNQUN2QixpQkFBaUIsT0FBTztBQUFBLE1BQ3hCLEtBQUssS0FBSztBQUFBLE1BQ1YsaUJBQWlCLE9BQU87QUFBQSxNQUN4QixNQUFNLE9BQU87QUFBQSxNQUNiLG1CQUFtQixPQUFPO0FBQUEsTUFDMUIsZUFBZSxPQUFPO0FBQUEsTUFDdEIsWUFBWSxPQUFPO0FBQUEsTUFDbkIsVUFBVSxLQUFLO0FBQUEsTUFDZixzQkFBc0IsT0FBTztBQUFBLElBQy9CLENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1nQixXQUFpQjtBQUMvQixlQUFXLEVBQUUsbUJBQW1CLEtBQUssS0FBSyxLQUFLLFFBQVE7QUFDdkQsVUFBTSxTQUFTO0FBQUEsRUFDakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdPLHFCQUFxQixZQUE4QjtBQUN4RCxlQUFXLEVBQUUsWUFBWSxLQUFLLEtBQUssVUFBVTtBQUFBLEVBQy9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sY0FBYyxZQUE4QjtBQUNqRCxlQUFXLEVBQUUsT0FBTyxLQUFLLEtBQUssWUFBWSxLQUFLLFFBQVE7QUFBQSxFQUN6RDtBQUNGO0FBT08sTUFBTSw0QkFBNEIsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxNQUFjO0FBQy9CLFVBQU0saUJBQWlCLElBQUksb0NBQW9DO0FBQy9ELFNBQUssT0FBTztBQUNaLFNBQUssT0FBTztBQUFBLEVBQ2Q7QUFDRjtBQVNPLFNBQVMsd0JBQXdCLEtBQVUsWUFBaUM7QUFDakYsU0FBTyxXQUFXLEVBQUUsU0FBUyxLQUFLLFVBQVU7QUFDOUM7QUFlTyxTQUFTLG9CQUFvQixRQUErQztBQUNqRixTQUFPLFdBQVcsRUFBRSxLQUFLO0FBQUEsSUFDdkIsS0FBSyxPQUFPO0FBQUEsSUFDWixlQUFlLE9BQU87QUFBQSxJQUN0QixZQUFZLE9BQU87QUFBQSxJQUNuQixVQUFVLE9BQU87QUFBQSxFQUNuQixDQUFDO0FBQ0g7QUFlTyxTQUFTLDZCQUE2QixLQUFVLFlBQThCO0FBQ25GLGFBQVcsRUFBRSxjQUFjLEtBQUssVUFBVTtBQUM1QztBQWFPLFNBQVMsc0JBQXNCLEtBQVUsWUFBd0IsVUFBd0I7QUFDOUYsYUFBVyxFQUFFLE9BQU8sS0FBSyxZQUFZLFFBQVE7QUFDL0M7QUFFQSxTQUFTLGFBQWtDO0FBQ3pDLFNBQU8seUJBQThDLHlCQUF5QixJQUFJLG9CQUFvQixDQUFDLEVBQUU7QUFDM0c7IiwKICAibmFtZXMiOiBbXQp9Cg==
912
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIFRoZSBhY3F1aXJlcnMgcmV0dXJuIGEge0BsaW5rIERpc3Bvc2FibGV9LCBzbyB0aGUgcHJlZmVycmVkIGNhbGwgc3R5bGUgaXMgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIHRoYXRcbiAqIHJlbGVhc2VzIGF1dG9tYXRpY2FsbHkgYXQgc2NvcGUgZXhpdCAoaW5jbHVkaW5nIG9uIHRocm93KTpcbiAqXG4gKiBgYGB0c1xuICogdXNpbmcgX2xvY2sgPSBsb2NrUmVzb3VyY2VGb3JQYXRoKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoLCBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZCwgb3BlcmF0aW9uTmFtZTogJ1Byb2Nlc3Mgbm90ZScgfSk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja1Jlc291cmNlRm9yUGF0aH0gcGFpciByZW1haW5zIGF2YWlsYWJsZSBmb3Igbm9uLWB1c2luZ2AgY2FsbCBzaXRlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEFic3RyYWN0RmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHsgQmVlcGVyIH0gZnJvbSAnLi4vYmVlcGVyLnRzJztcbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Jcbn0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyB0b2dnbGVFZGl0b3JSZWFkT25seSB9IGZyb20gJy4vZWRpdG9yLnRzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQge1xuICBpc0NoaWxkLFxuICBpc0NoaWxkT3JTZWxmXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG5jb25zdCBSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSA9ICdyZXNvdXJjZUxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yLWZsYXNoJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcbmNvbnN0IFVOTE9DS19JQ09OX0lEID0gJ3VubG9jayc7XG5jb25zdCBNSURETEVfTU9VU0VfQlVUVE9OID0gMTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbG9ja1Jlc291cmNlRm9yUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9ja1Jlc291cmNlRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRha2luZyB0aGUgbG9jayAoZS5nLiBgJ01vdmUgc2VsZWN0aW9uJ2ApLiBTaG93biBuZXh0IHRvXG4gICAqIHRoZSBwbHVnaW4gbmFtZSBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgbG9ja2luZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBUaGUgbG9jayBpcyBhdHRyaWJ1dGVkIHRvIGl0IGZvclxuICAgKiByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jay4gV2hlbiBhIGxvY2sgaW5kaWNhdG9yIGlzIGNsaWNrZWQgKHdpdGhcbiAgICogYW55IG1vdXNlIGJ1dHRvbikgYW5kIHRoZSB1c2VyIGNvbmZpcm1zIGFuIHVubG9jaywgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCBydW5zLCBvclxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSAvIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofSBpcyBjYWxsZWRcbiAgICogZm9yIHRoZSBwYXRoLCB0aGlzIGNvbnRyb2xsZXIgaXMgYWJvcnRlZCBzbyB0aGUgb3BlcmF0aW9uIGhvbGRpbmcgdGhlIGxvY2sgY2FuIGNhbmNlbCBpdHNlbGYuIFVubGVzc1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnR9IGlzIHNldCwgdGhlIG9wZXJhdGlvbiBpc1xuICAgKiBleHBlY3RlZCB0byByZWxlYXNlIHRoZSBsb2NrIGluIGl0cyBvd24gY2xlYW51cC4gV2hlbiBvbWl0dGVkLCBhbiB1bmxvY2sgc3RpbGwgcmVsZWFzZXMgdGhlIGxvY2sgYnV0XG4gICAqIGNhbm5vdCBjYW5jZWwgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgaXQuXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NrIHNjb3BlLiBgJ3N1YnRyZWUnYCBhbHNvIGxvY2tzIGV2ZXJ5IGRlc2NlbmRhbnQgb2YgYSBmb2xkZXIgcGF0aDsgYCdmaWxlJ2AgbG9ja3Mgb25seSB0aGVcbiAgICogZXhhY3QgcGF0aC4gQSBgc3VidHJlZWAgbG9jayBtdXN0IGJlIHJlbGVhc2VkIHZpYSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChub3QgdGhlXG4gICAqIGV4cGxpY2l0IHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQudW5sb2NrRm9yUGF0aH0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2ZpbGUnYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGFuIHVubG9jayBvZiB0aGUgbG9jayBpcyByZXF1ZXN0ZWQgXHUyMDE0IGkuZS4gd2hlbiB0aGVcbiAgICogbG9jaydzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQgKGJ5IHRoZVxuICAgKiBpbmRpY2F0b3IncyBcIlVubG9ja1wiIG1lbnUsIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQsIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQucmVxdWVzdFVubG9ja0ZvclBhdGh9LFxuICAgKiBvciB7QGxpbmsgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbn0pLiBVc2UgaXQgdG8gY2xlYXIgY29uc3VtZXItc2lkZSBzdGF0ZSB0aGF0IHNoYWRvd3MgdGhlIGxvY2sgKGUuZy5cbiAgICogYSBwZW5kaW5nLW9wZXJhdGlvbiBidWZmZXIgb3IgYSBub3RpY2UpIHdpdGhvdXQgaGFuZC13aXJpbmcgYW4gYGFib3J0YCBsaXN0ZW5lci4gRmlyZXMgYXQgbW9zdCBvbmNlLlxuICAgKi9cbiAgb25VbmxvY2tSZXF1ZXN0ZWQ/KHRoaXM6IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgLCBgJ01lcmdlXG4gICAqIG5vdGVzJ2ApLiBJdCBpcyBzaG93biBcdTIwMTQgbmV4dCB0byB0aGUgbG9ja2luZyBwbHVnaW4ncyBuYW1lIFx1MjAxNCBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2csIHNvXG4gICAqIHRoZSB1c2VyIHNlZXMgZXhhY3RseSB3aGljaCBvcGVyYXRpb24gYW4gdW5sb2NrIHdvdWxkIGNhbmNlbC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIGFsc28gKipibG9ja3MgdmF1bHQgbXV0YXRpb25zKiogb2YgdGhlIGNvdmVyZWQgcGF0aChzKTogYW55IGF0dGVtcHQgdG8gZWRpdCxcbiAgICogZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBBUEkgdGhyb3dzIGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBJbnN0YWxsZWQgbGF6aWx5IG9uIHRoZSBmaXJzdCBzdWNoIGxvY2sgYW5kIHJlbW92ZWQgd2hlbiB0aGUgbGFzdCBvbmVcbiAgICogaXMgcmVsZWFzZWQuIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBsb2NrIG9ubHkgbWFrZXMgdGhlIGVkaXRvciByZWFkLW9ubHkgXHUyMDE0IGxlZ2FjeSBiZWhhdmlvcixcbiAgICogc28gZXhpc3RpbmcgY29uc3VtZXJzIHRoYXQgd3JpdGUgdG8gYSBub3RlIHRoZXkgaG9sZCBhbiBlZGl0b3IgbG9jayBvbiBhcmUgdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxvY2sgcmVsZWFzZXMgaXRzZWxmIHRoZSBtb21lbnQgaXRzXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQsIGluc3RlYWQgb2YgcmVseWluZyBvblxuICAgKiB0aGUgb3duaW5nIG9wZXJhdGlvbiB0byByZWxlYXNlIGl0IGluIGl0cyBvd24gY2xlYW51cC4gVXNlIGl0IGZvciBhIGxvY2sgaGVsZCAqKmluZGVmaW5pdGVseSoqXG4gICAqIG91dHNpZGUgYSBgdXNpbmdgIHNjb3BlIChzbyB0aGVyZSBpcyBubyBgZmluYWxseWAgdG8gcmVsZWFzZSBpdCkgXHUyMDE0IGUuZy4gYSBsb2NrIHRoYXQgc3RheXMgdW50aWwgdGhlXG4gICAqIHVzZXIgZXhwbGljaXRseSB1bmxvY2tzLiBMZWF2ZSBpdCBgZmFsc2VgIGZvciBhIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHRoYXQgaG9sZHMgdGhlIGxvY2sgdGhyb3VnaFxuICAgKiBpdHMgb3duIGFib3J0LWRyaXZlbiByb2xsYmFjayBhbmQgcmVsZWFzZXMgaXQgdmlhIGB1c2luZ2AgYXQgc2NvcGUgZXhpdC4gSGFzIG5vIGVmZmVjdCB3aXRob3V0IGFuXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNjb3BlIG9mIGEgbG9jay5cbiAqXG4gKiAtIGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlIGV4YWN0IHBhdGguXG4gKiAtIGAnc3VidHJlZSdgIGxvY2tzIHRoZSBwYXRoIGFuZCBldmVyeSBkZXNjZW5kYW50IHVuZGVyIGl0IChpdHMgd2hvbGUgZm9sZGVyIHN1YnRyZWUpLCBzbyBhIGZpbGVcbiAqICAgaW5zaWRlIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIgaXMgdHJlYXRlZCBhcyBsb2NrZWQgdG9vLlxuICovXG5leHBvcnQgdHlwZSBSZXNvdXJjZUxvY2tNb2RlID0gJ2ZpbGUnIHwgJ3N1YnRyZWUnO1xuXG5pbnRlcmZhY2UgTG9ja0Rlc2NyaXB0b3Ige1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvY2tFbnRyeSB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zOiBib29sZWFuO1xuICByZWFkb25seSBtb2RlOiBSZXNvdXJjZUxvY2tNb2RlO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZDogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgZGlzcG9zZVR5cGVMaXN0ZW5lcigpOiB2b2lkO1xuICByZWFkb25seSB0YWJJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIE1hbmFnZXJMb2NrUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uVW5sb2NrUmVxdWVzdGVkPzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNob3VsZFJlbGVhc2VPbkFib3J0PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50fS5cbiAqL1xuaW50ZXJmYWNlIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIG9uQ2hhbmdlKHRoaXM6IHZvaWQpOiB2b2lkO1xuICBvbkV4dGVybmFsTXV0YXRpb24odGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogdm9pZDtcbiAgb25GaWxlTWVudSh0aGlzOiB2b2lkLCBtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgc2hvdWxkQmxvY2tNdXRhdGlvbih0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkV4dGVybmFsTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9uQ2hhbmdlID0gcGFyYW1zLm9uQ2hhbmdlO1xuICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uID0gcGFyYW1zLm9uRXh0ZXJuYWxNdXRhdGlvbjtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gU2FtZS1sZWFmIG5hdmlnYXRpb24gdG8gYW5vdGhlciBub3RlIGZpcmVzIG5vIGxlYWYvbGF5b3V0IGNoYW5nZTsgd2l0aG91dCB0aGlzIGl0IHN0YXlzIHJlYWQtb25seS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gQWRkcyBhbiBcIlVubG9ja1wiIGl0ZW0gdG8gYSBsb2NrZWQgbm90ZSdzIHRhYi9maWxlIGNvbnRleHQgbWVudSAoYWxvbmdzaWRlIHRoZSBpbmRpY2F0b3IgbWVudXMpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtbWVudScsIHRoaXMub25GaWxlTWVudSkpO1xuICAgIC8vIEV4dGVybmFsLWNoYW5nZSBiYWNrc3RvcDogYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCBub3QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIGFuIGludHJ1ZGVyIChhIHN5bmMvRlMvYWRhcHRlciBjaGFuZ2UgdGhhdCBieXBhc3NlZCB0aGUgYmxvY2tlciBwYXRjaCkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdjcmVhdGUnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24ob2xkUGF0aCk7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vbmtleS1wYXRjaGVzIHRoZSB2YXVsdC1tdXRhdGlvbiBjaG9rZSBwb2ludHMgb24gYFZhdWx0YC9gRmlsZU1hbmFnZXJgIHNvIHRoYXQgYW55IGVkaXQsIGRlbGV0ZSxcbiAqIHJlbmFtZSwgbW92ZSwgb3IgKHJlKWNyZWF0ZSBvZiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCB0aHJvd3MgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gKiBJbnN0YWxsZWQgbGF6aWx5IGJ5IHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyfSBvbiB0aGUgZmlyc3QgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrIGFuZCByZW1vdmVkXG4gKiB3aGVuIHRoZSBsYXN0IG9uZSBpcyByZWxlYXNlZDsgYmVpbmcgYSB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgZXZlcnkgcGF0Y2ggaXMgdG9ybiBkb3duIG9uXG4gKiBgdW5sb2FkYC4gUmVuYW1lL2NvcHkgY2hlY2sgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOyB0aGUgb3RoZXIgbWV0aG9kcyBjaGVjayB0aGVpciBzaW5nbGUgcGF0aC5cbiAqL1xuY2xhc3MgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24gPSBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdhcHBlbmQnPih7XG4gICAgICBtZXRob2ROYW1lOiAnYXBwZW5kJyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjb3B5Jz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ2NvcHknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFssIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGUnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVCaW5hcnknPih7XG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlQmluYXJ5JyxcbiAgICAgIG9iajogVmF1bHQucHJvdG90eXBlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmdzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlRm9sZGVyJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUZvbGRlcicsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeUJpbmFyeSc+KHtcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnlCaW5hcnknLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3Byb2Nlc3MnPih7XG4gICAgICBtZXRob2ROYW1lOiAncHJvY2VzcycsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncmVuYW1lJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgICBvYmo6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgb2JqOiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3M6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3JlbmFtZUZpbGUnPih7XG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgICBvYmo6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAndHJhc2hGaWxlJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoRmlsZScsXG4gICAgICBvYmo6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJnczogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE5vdEJsb2NrZWQocGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRCbG9ja011dGF0aW9uKHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUxvY2tlZEVycm9yKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW4gc3luYyB3aXRoIHRoZSBsb2NrZWRcbiAqIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS4gRWFjaCBsb2NrIGlzIG9uZVxuICoge0BsaW5rIExvY2tFbnRyeX0gaW4gYSBwZXItcGF0aCBsaXN0LCBzbyBhIHBhdGggY2FuIGJlIGhlbGQgYnkgc2V2ZXJhbCBwbHVnaW5zIChvciBzZXZlcmFsIHRpbWVzIGJ5XG4gKiBvbmUpIGNvbmN1cnJlbnRseSBhbmQgaXMgcmVsZWFzZWQgb25seSB3aGVuIGl0cyBsYXN0IGVudHJ5IGlzIHJlbW92ZWQ7IHRoZSBpbmRpY2F0b3JzIHJlcG9ydCB3aGljaFxuICogcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBieXBhc3NQYXRoU2V0cyA9IG5ldyBTZXQ8UmVhZG9ubHlTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeVZpZXcgPSBuZXcgTWFwPE1hcmtkb3duVmlldywgTG9ja0luZGljYXRvcnM+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0VudHJpZXNCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgTG9ja0VudHJ5W10+KCk7XG4gIHByaXZhdGUgbXV0YXRpb25CbG9ja2VyQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0dXNCYXJJdGVtRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGJ5cGFzcyhhcHA6IEFwcCwgcGF0aHNPckZpbGVzOiByZWFkb25seSBQYXRoT3JGaWxlW10pOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBieXBhc3NlZFBhdGhzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChwYXRoc09yRmlsZXMubWFwKChwYXRoT3JGaWxlKSA9PiBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpKTtcbiAgICB0aGlzLmJ5cGFzc1BhdGhTZXRzLmFkZChieXBhc3NlZFBhdGhzKTtcbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmJ5cGFzc1BhdGhTZXRzLmRlbGV0ZShieXBhc3NlZFBhdGhzKTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdW5sb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aC4gUmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgaXQgXHUyMDE0IHRoZSBwYXRoIGl0c2VsZiB3aGVuXG4gICAqIGRpcmVjdGx5IGxvY2tlZCwgb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIgXHUyMDE0IHRoZW4gYWJvcnRzIGV2ZXJ5XG4gICAqIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHJlZ2lzdGVyZWQgb24gdGhhdCBvd25lciAoY2FuY2VsbGluZyB0aGUgb3BlcmF0aW9ucyB0aGF0IHRvb2sgdGhlIGxvY2tzKVxuICAgKiBBTkQgcmVtb3ZlcyB0aGUgb3duZXIncyBsb2NrIGVudHJpZXMgKHJlbGVhc2luZyB0aGUgbG9jayB1bmNvbmRpdGlvbmFsbHkpLiBVbmxpa2VcbiAgICoge0BsaW5rIHJlcXVlc3RVbmxvY2t9LCB3aGljaCBvbmx5IGFib3J0cyB0aGUgZXhhY3QgcGF0aCdzIGNvbnRyb2xsZXJzIGFuZCByZWxpZXMgb24gZWFjaCBvcGVyYXRpb25cbiAgICogcmVsZWFzaW5nIGl0cyBvd24gbG9jaywgdGhpcyByZXNvbHZlcyBhbmNlc3RvciBjb3ZlcmFnZSBhbmQgYWx3YXlzIHJlbGVhc2VzIFx1MjAxNCBzbyBhIG5vdGUgaGVsZCBieSBhblxuICAgKiBpbmRlZmluaXRlbHktaGVsZCBsb2NrIGlzIGd1YXJhbnRlZWQgdG8gYmVjb21lIGVkaXRhYmxlLiBBIG5vLW9wIHdoZW4gbm90aGluZyBjb3ZlcnMgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIGZvcmNlVW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgY29uc3Qgb3duZXJQYXRoID0gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gICAgaWYgKG93bmVyUGF0aCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0QW5kUmVsZWFzZUVudHJpZXMoYXBwLCBvd25lclBhdGgpO1xuICB9XG5cbiAgcHVibGljIGlzTG9ja2VkKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNQYXRoTG9ja2VkKGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGlzIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yXG4gICAqIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBjb3ZlcmVkIGJ5IGEgbXV0YXRpb24tYmxvY2tpbmcgbG9jayAob25lIHRha2VuIHdpdGhcbiAgICogYGJsb2Nrc011dGF0aW9uc2ApIGRpcmVjdGx5IG9yIG9uIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZXhhY3RFbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKGV4YWN0RW50cmllcz8uc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBpZiAoZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnICYmIGVudHJ5LmJsb2Nrc011dGF0aW9ucykgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgbG9jayhwYXJhbXM6IE1hbmFnZXJMb2NrUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5wYXRoT3JGaWxlKTtcbiAgICBjb25zdCBlbnRyeTogTG9ja0VudHJ5ID0ge1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyID8/IG51bGwsXG4gICAgICBibG9ja3NNdXRhdGlvbnM6IHBhcmFtcy5ibG9ja3NNdXRhdGlvbnMgPz8gZmFsc2UsXG4gICAgICBtb2RlOiBwYXJhbXMubW9kZSA/PyAnZmlsZScsXG4gICAgICBvblVubG9ja1JlcXVlc3RlZDogcGFyYW1zLm9uVW5sb2NrUmVxdWVzdGVkID8/IG51bGwsXG4gICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0ID8/IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgZW50cmllcyk7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgaWYgKGVudHJ5LmJsb2Nrc011dGF0aW9ucykge1xuICAgICAgdGhpcy5lbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcCk7XG4gICAgfVxuICAgIHRoaXMud2lyZVJlbGVhc2VPbkFib3J0KGFwcCwgcGF0aCwgZW50cnkpO1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgcGF0aCwgZW50cnkpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaFxuICAgKiBjYW5jZWxzIHRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2suIEVhY2ggb3BlcmF0aW9uIHJlbGVhc2VzIGl0cyBvd24gbG9jayBpbiBpdHMgYGZpbmFsbHlgXG4gICAqIHdoZW4gaXQgb2JzZXJ2ZXMgdGhlIGFib3J0LCBzbyB0aGlzIGRvZXMgbm90IHVubG9jayB0aGUgcGF0aCBkaXJlY3RseS4gQSBuby1vcCB3aGVuIG5vIGNvbnRyb2xsZXJcbiAgICogaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgPT09IHBsdWdpbklkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkICE9PSBwbHVnaW5JZCk7XG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nLmxlbmd0aCAhPT0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IG9uIHRoZSBnaXZlbiAoYWxyZWFkeS1yZXNvbHZlZCkgb3duZXIgcGF0aCdzIGxvY2sgZW50cmllcyBcdTIwMTRcbiAgICogY2FuY2VsbGluZyB0aGUgb3duaW5nIG9wZXJhdGlvbnMgXHUyMDE0IGFuZCByZW1vdmVzIHRob3NlIGVudHJpZXMsIHJlbGVhc2luZyB0aGUgbG9jay4gVGhlIGVudHJpZXNcbiAgICogc25hcHNob3QgaXMgY29waWVkIGZpcnN0IGJlY2F1c2UgYW4gZW50cnkncyBgc2hvdWxkUmVsZWFzZU9uQWJvcnRgIGFib3J0IGxpc3RlbmVyIG11dGF0ZXMgdGhlXG4gICAqIGFycmF5IGFzIGl0IGZpcmVzLiBBbHdheXMgbGVhdmVzIHRoZSBvd25lciBwYXRoIHdpdGggbm8gZW50cmllcy5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvd25lclBhdGggLSBUaGUgZGlyZWN0bHktbG9ja2VkIG93bmVyIHBhdGggd2hvc2UgZW50cmllcyB0byBhYm9ydCBhbmQgcmVsZWFzZS5cbiAgICovXG4gIHByaXZhdGUgYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHA6IEFwcCwgb3duZXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQob3duZXJQYXRoKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIFsuLi5lbnRyaWVzXSkge1xuICAgICAgZW50cnkuYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIH1cbiAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShvd25lclBhdGgpO1xuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRVbmxvY2tNZW51SXRlbShhcHA6IEFwcCwgbWVudTogTWVudSwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG4gICAgICBpdGVtXG4gICAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVzb3VyY2VMb2NrLnVubG9ja01lbnVJdGVtKSlcbiAgICAgICAgLnNldEljb24oVU5MT0NLX0lDT05fSUQpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICAgIGFwcCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwLCBwYXRoKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVzb3VyY2VMb2NrLnVubG9ja0NvbmZpcm1UaXRsZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgIC8vIGBwYXRoYCBpcyB0aGUgcmVzb2x2ZWQgb3duZXIgcGF0aCwgc28gY2FuY2VsIGl0cyBvcGVyYXRpb25zIGFuZCByZWxlYXNlIHRoZSBsb2NrIG91dHJpZ2h0LlxuICAgICAgICAgICAgdGhpcy5hYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcCwgcGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluZGljYXRvcnMoYXBwOiBBcHAsIHZpZXc6IE1hcmtkb3duVmlldywgcGF0aDogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgKCkgPT4gcGF0aCk7XG5cbiAgICBsZXQgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRhYlN0YXR1c0NvbnRhaW5lckVsID0gdmlldy5sZWFmLnRhYkhlYWRlclN0YXR1c0NvbnRhaW5lckVsO1xuICAgIGlmICh0YWJTdGF0dXNDb250YWluZXJFbCkge1xuICAgICAgdGFiSWNvbkVsID0gdGFiU3RhdHVzQ29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IGNsczogTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTIH0pO1xuICAgICAgc2V0SWNvbih0YWJJY29uRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKHRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRhYkljb25FbCwgKCkgPT4gcGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXBlci5iZWVwKCk7XG4gICAgfTtcbiAgICB2aWV3LmNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdmlldy5jb250ZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcbiAgICAgIH0sXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCh7XG4gICAgICBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aCk6IGJvb2xlYW4gPT4gdGhpcy5zaG91bGRCbG9ja011dGF0aW9uKGFwcCwgcGF0aClcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUV4dGVybmFsTXV0YXRpb24oYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBvbkZpbGVNZW51OiAobWVudSwgZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVNZW51KGFwcCwgbWVudSwgZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWwucmVtb3ZlQ2xhc3MoTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTKTtcbiAgICAvLyBSZWFkIGxheW91dCB0byBmb3JjZSBhIHJlZmxvdyBzbyB0aGUgZmxhc2ggYW5pbWF0aW9uIHJlc3RhcnRzIG9uIGV2ZXJ5IHJlamVjdGVkIGtleXN0cm9rZS5cbiAgICBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlbC5hZGRDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEluZGljYXRvcnModmlldzogTWFya2Rvd25WaWV3KTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgZm9yIChjb25zdCBlbCBvZiBbaW5kaWNhdG9ycz8uYWN0aW9uSWNvbkVsLCBpbmRpY2F0b3JzPy50YWJJY29uRWwsIHRoaXMuc3RhdHVzQmFySXRlbUVsXSkge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIHRoaXMuZmxhc2hFbGVtZW50KGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RzIHRvIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBwYXRoLiBJZiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkIGFuZCBOT1QgY292ZXJlZCBieSBhblxuICAgKiBhY3RpdmUgYnlwYXNzIHNjb3BlLCB0aGUgY2hhbmdlIGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoIChzeW5jIC8gZmlsZXN5c3RlbSAvIGEgcmF3LWFkYXB0ZXJcbiAgICogd3JpdGUpIFx1MjAxNCBhbiBpbnRydWRlci4gQWJvcnQgdGhlIGBhYm9ydENvbnRyb2xsZXJgIG9mIGV2ZXJ5IG11dGF0aW9uLWJsb2NraW5nIGxvY2sgY292ZXJpbmcgdGhlIHBhdGhcbiAgICogc28gdGhlIG93bmluZyBvcGVyYXRpb24gY2FuY2VscyBhbmQgcm9sbHMgYmFjay4gQSBuby1vcCBmb3IgdGhlIG93bmVyJ3Mgb3duIChieXBhc3NlZCkgbXV0YXRpb25zLFxuICAgKiBmb3IgdW5ibG9ja2VkIHBhdGhzLCBhbmQgZm9yIGJsb2NraW5nIGxvY2tzIHdpdGggbm8gYGFib3J0Q29udHJvbGxlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRoZSBldmVudCBmaXJlZCBvbi5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5ibG9ja3NNdXRhdGlvbnMgfHwgIWVudHJ5LmFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyc1BhdGggPSBsb2NrZWRQYXRoID09PSBwYXRoIHx8IChlbnRyeS5tb2RlID09PSAnc3VidHJlZScgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pKTtcbiAgICAgICAgaWYgKGNvdmVyc1BhdGgpIHtcbiAgICAgICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmlsZU1lbnUoYXBwOiBBcHAsIG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICAvLyBPZmZlciBcIlVubG9ja1wiIGZvciBhIGRpcmVjdGx5LWxvY2tlZCBmaWxlL2ZvbGRlciwgb3IgYW55dGhpbmcgY292ZXJlZCBieSBhIGBzdWJ0cmVlYCBsb2NrIG9uIGFuIGFuY2VzdG9yLiBUaGUgbWVudSB0YXJnZXRzIHRoZSBvd25lciBsb2NrJ3MgcGF0aC5cbiAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZmlsZS5wYXRoKTtcbiAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBvd25lclBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCbG9ja2luZ0xvY2soKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBlbnRyaWVzIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgY292ZXJlZCBieSBhbiBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSBcdTIwMTQgdGhlXG4gICAqIG93bmVyIGRlY2xhcmluZyB0aGF0IGl0cyBvd24gbXV0YXRpb25zIG9mIHRoZSBwYXRoIChhbmQsIGZvciBhIGZvbGRlciwgaXRzIHN1YnRyZWUpIGFyZSBzYW5jdGlvbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBiZWluZyBtdXRhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgc29tZSBhY3RpdmUgYnlwYXNzIHNjb3BlIGNvdmVycyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgaXNCeXBhc3NlZChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGhzIG9mIHRoaXMuYnlwYXNzUGF0aFNldHMpIHtcbiAgICAgIGZvciAoY29uc3QgYnlwYXNzZWRQYXRoIG9mIGJ5cGFzc2VkUGF0aHMpIHtcbiAgICAgICAgaWYgKGlzQ2hpbGRPclNlbGYoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogYnlwYXNzZWRQYXRoIH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhMb2NrZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKT8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRlZHVwbGljYXRlZCBsaXN0IG9mIGAocGx1Z2luIG5hbWUsIG9wZXJhdGlvbiBuYW1lKWAgcGFpcnMgZGVzY3JpYmluZyB0aGUgbG9ja3Mgb24gYVxuICAgKiBwYXRoIFx1MjAxNCBvbmUgcGVyIGRpc3RpbmN0IHBsdWdpbitvcGVyYXRpb24uIERyaXZlcyB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiwgc28gdGhlIHVzZXIgc2VlcyBleGFjdGx5XG4gICAqIHdoaWNoIG9wZXJhdGlvbnMgYW4gdW5sb2NrIHdvdWxkIGNhbmNlbC4gT25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlXG4gICAqIGFsd2F5cyBwcmVzZW50LlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZGlyZWN0bHktbG9ja2VkIHBhdGggd2hvc2UgbG9jayBkZXNjcmlwdG9ycyB0byBidWlsZC5cbiAgICogQHJldHVybnMgVGhlIGRpc3RpbmN0IGxvY2sgZGVzY3JpcHRvcnMgY292ZXJpbmcgdGhlIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGxvY2tEZXNjcmlwdG9ycyhhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogTG9ja0Rlc2NyaXB0b3JbXSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBkZXNjcmlwdG9yczogTG9ja0Rlc2NyaXB0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgcGx1Z2luTmFtZSA9IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1tlbnRyeS5wbHVnaW5JZF0/Lm5hbWUgPz8gZW50cnkucGx1Z2luSWQ7XG4gICAgICBjb25zdCBrZXkgPSBgJHtwbHVnaW5OYW1lfVxcbiR7ZW50cnkub3BlcmF0aW9uTmFtZX1gO1xuICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgZGVzY3JpcHRvcnMucHVzaCh7IG9wZXJhdGlvbk5hbWU6IGVudHJ5Lm9wZXJhdGlvbk5hbWUsIHBsdWdpbk5hbWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9ycztcbiAgfVxuXG4gIHByaXZhdGUgbG9ja2luZ1BsdWdpbk5hbWVzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIC8vIGBsb2NraW5nUGx1Z2luTmFtZXNgIGlzIG9ubHkgZXZlciBjYWxsZWQgZm9yIGEgbG9ja2VkIHBhdGgsIHNvIGl0cyBlbnRyaWVzIGFyZSBhbHdheXMgcHJlc2VudC5cbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBjb25zdCBwbHVnaW5JZHMgPSBbLi4ubmV3IFNldChlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkKSldO1xuICAgIHJldHVybiBwbHVnaW5JZHMubWFwKChwbHVnaW5JZCkgPT4gYXBwLnBsdWdpbnMubWFuaWZlc3RzW3BsdWdpbklkXT8ubmFtZSA/PyBwbHVnaW5JZCk7XG4gIH1cblxuICBwcml2YXRlIGxvY2tUb29sdGlwKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2subG9ja2VkQnlUb29sdGlwKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgcGx1Z2luIG5hbWVzLCBvbmUgcGVyIGxpbmUgdW5kZXIgdGhlIGhlYWRlci5cbiAgICByZXR1cm4gW2hlYWRlciwgLi4udGhpcy5sb2NraW5nUGx1Z2luTmFtZXMoYXBwLCBwYXRoKV0uam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZShhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdzVG9Mb2NrID0gbmV3IFNldDxNYXJrZG93blZpZXc+KCk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgY29uc3QgdmlldyA9IGxlYWYudmlldztcbiAgICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSB0aGUgbG9jayBjb3ZlcmluZyB0aGlzIHZpZXc6IHRoZSBleGFjdCBwYXRoIHdoZW4gZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci4gSW5kaWNhdG9ycy90b29sdGlwL3VubG9jayBtZW51IGtleSBvZmYgdGhhdCBvd25lciBwYXRoLlxuICAgICAgY29uc3Qgb3duZXJQYXRoID0gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpO1xuICAgICAgaWYgKG93bmVyUGF0aCAhPT0gbnVsbCkge1xuICAgICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmxvY2tUb29sdGlwKGFwcCwgb3duZXJQYXRoKTtcbiAgICAgICAgLy8gUmUtYXBwbHkgdGhlIHJlYWQtb25seSB0b2dnbGUgb24gZXZlcnkgcmVjb25jaWxlLCBub3Qgb25seSB0aGUgZmlyc3QgdGltZSBhIHZpZXcgaXMgdHJhY2tlZC5cbiAgICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBpZGVtcG90ZW50LCBzbyByZS1hcHBseWluZyB0byBhbiBhbHJlYWR5LWxvY2tlZCB2aWV3IGlzIGNoZWFwLlxuICAgICAgICAvLyBBIHZpZXcgb3BlbmVkIGFmdGVyIHRoZSBsb2NrIGlzIHJlY29uY2lsZWQgc3luY2hyb25vdXNseSwgYmVmb3JlIGl0cyBDb2RlTWlycm9yIGlzIHJlYWR5LlxuICAgICAgICAvLyBJdHMgZmlyc3QgdG9nZ2xlIGlzIHRoZXJlZm9yZSBhIG5vLW9wOyByZS1hcHBseWluZyBtYWtlcyB0aGUgbG9jayB0YWtlIGhvbGQgb25jZSBpdCBzZXR0bGVzLlxuICAgICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGluZGljYXRvcnMgPSB0aGlzLmluZGljYXRvcnNCeVZpZXcuZ2V0KHZpZXcpO1xuICAgICAgICBpZiAoaW5kaWNhdG9ycykge1xuICAgICAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9ycywgdG9vbHRpcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LnNldCh2aWV3LCB0aGlzLmNyZWF0ZUluZGljYXRvcnMoYXBwLCB2aWV3LCBvd25lclBhdGgsIHRvb2x0aXApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3ZpZXcsIGluZGljYXRvcnNdIG9mIHRoaXMuaW5kaWNhdG9yc0J5Vmlldykge1xuICAgICAgaWYgKCF2aWV3c1RvTG9jay5oYXModmlldykpIHtcbiAgICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIGZhbHNlKTtcbiAgICAgICAgaW5kaWNhdG9ycy5kaXNwb3NlVHlwZUxpc3RlbmVyKCk7XG4gICAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5kZWxldGUodmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNCYXIoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlQW5kQ2xlYW51cChhcHA6IEFwcCk6IHZvaWQge1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgaWYgKHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzQmxvY2tpbmdMb2NrKCkpIHtcbiAgICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyVW5sb2NrTWVudShhcHA6IEFwcCwgZWw6IEhUTUxFbGVtZW50LCBnZXRDb250ZXh0UGF0aDogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gQSBjbGljayBvZiBBTlkgbW91c2UgYnV0dG9uIG9uIGEgbG9jayBpbmRpY2F0b3Igb3BlbnMgdGhlIHNhbWUgdW5sb2NrIGNvbnRleHQgbWVudTpcbiAgICAvLyBgY2xpY2tgIGZpcmVzIG9ubHkgZm9yIHRoZSBwcmltYXJ5IChsZWZ0KSBidXR0b24sIGBjb250ZXh0bWVudWAgZm9yIHRoZSByaWdodCBidXR0b24sIGFuZFxuICAgIC8vIGBhdXhjbGlja2AgZm9yIHRoZSBtaWRkbGUgYnV0dG9uICh0aGUgYnJvd3NlciBmaXJlcyBubyBgY2xpY2tgIGZvciBpdCkuIGBhdXhjbGlja2AgYWxzbyBmaXJlcyBmb3JcbiAgICAvLyBUaGUgcmlnaHQgYnV0dG9uLCBzbyBpdCBpcyBndWFyZGVkIHRvIHRoZSBtaWRkbGUgYnV0dG9uIHRvIGF2b2lkIGRvdWJsZS1vcGVuaW5nIGFsb25nc2lkZSBgY29udGV4dG1lbnVgLlxuICAgIC8vIEEgcGxhaW4gbGlzdGVuZXIgZGllcyB3aXRoIHRoZSBlbGVtZW50IHdoZW4gaXQgaXMgYC5yZW1vdmUoKWBkIG9uIHVubG9jaywgc28gaXQgbmV2ZXIgbGVha3MuXG4gICAgY29uc3Qgb3BlblVubG9ja01lbnUgPSAoZXZ0OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRDb250ZXh0UGF0aCgpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBwYXRoKTtcbiAgICAgIG1lbnUuc2hvd0F0TW91c2VFdmVudChldnQpO1xuICAgIH07XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignYXV4Y2xpY2snLCAoZXZ0KSA9PiB7XG4gICAgICBpZiAoZXZ0LmJ1dHRvbiA9PT0gTUlERExFX01PVVNFX0JVVFRPTikge1xuICAgICAgICBvcGVuVW5sb2NrTWVudShldnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFbnRyeShhcHA6IEFwcCwgcGF0aDogc3RyaW5nLCBlbnRyeTogTG9ja0VudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgd2hpY2ggbG9ja2VkIHBhdGggKGlmIGFueSkgY292ZXJzIHRoZSBnaXZlbiBwYXRoOiB0aGUgcGF0aCBpdHNlbGYgd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciB0aGF0IGNvbnRhaW5zIGl0IChsb25nZXN0IHNvIGEgbmVzdGVkXG4gICAqIHN1YnRyZWUgbG9jayB3aW5zIGRldGVybWluaXN0aWNhbGx5IG92ZXIgYW4gb3V0ZXIgb25lKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIGNvdmVycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIGxldCBiZXN0T3duZXJQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBoYXNTdWJ0cmVlTG9jayA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyk7XG4gICAgICBpZiAoaGFzU3VidHJlZUxvY2sgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pICYmIChiZXN0T3duZXJQYXRoID09PSBudWxsIHx8IGxvY2tlZFBhdGgubGVuZ3RoID4gYmVzdE93bmVyUGF0aC5sZW5ndGgpKSB7XG4gICAgICAgIGJlc3RPd25lclBhdGggPSBsb2NrZWRQYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdE93bmVyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBtdXRhdGlvbiBvZiB0aGUgcGF0aCBtdXN0IGJlIGJsb2NrZWQ6IGB0cnVlYCB3aGVuIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWRcbiAgICogYW5kIG5vdCBjb3ZlcmVkIGJ5IGFueSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggYmVpbmcgbXV0YXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHRvIHJlamVjdCB0aGUgbXV0YXRpb24sIGBmYWxzZWAgdG8gYWxsb3cgaXQuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZEJsb2NrTXV0YXRpb24oYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IoYXBwLCBwYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmxvY2tDb25maXJtTWVzc2FnZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGZyYWdtZW50LmFwcGVuZFRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtTWVzc2FnZSkpO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiB0aGUgbG9ja3MgY3VycmVudGx5IGhlbGQ6IGVhY2ggcGx1Z2luIG5hbWUgYXMgYSBjb2RlIGJsb2NrIGZvbGxvd2VkIGJ5XG4gICAgLy8gVGhlIG9wZXJhdGlvbiBpdCBpcyBydW5uaW5nLCBvbmUgcGVyIGxpbmUuXG4gICAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRoaXMubG9ja0Rlc2NyaXB0b3JzKGFwcCwgcGF0aCkpIHtcbiAgICAgIGZyYWdtZW50LmNyZWF0ZUVsKCdicicpO1xuICAgICAgYXBwZW5kQ29kZUJsb2NrKGZyYWdtZW50LCBkZXNjcmlwdG9yLnBsdWdpbk5hbWUpO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChgOiAke2Rlc2NyaXB0b3Iub3BlcmF0aW9uTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBhY3RpdmVPd25lclBhdGggPSBhY3RpdmVQYXRoID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGFjdGl2ZVBhdGgpO1xuXG4gICAgaWYgKGFjdGl2ZU93bmVyUGF0aCA9PT0gbnVsbCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0dXNCYXJJdGVtRWwpIHtcbiAgICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgICAgaWYgKCFzdGF0dXNCYXJFbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgICBzZXRJY29uKHRoaXMuc3RhdHVzQmFySXRlbUVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgLy8gVGhlIHNpbmdsZSBzdGF0dXMtYmFyIGl0ZW0gaXMgcmV1c2VkIGFjcm9zcyBhY3RpdmUtbm90ZSBzd2l0Y2hlcy5cbiAgICAgIC8vIEl0IG11c3QgcmVzb2x2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RlJ3Mgb3duZXIgbG9jayBhdCBjbGljayB0aW1lIHJhdGhlciB0aGFuIGNhcHR1cmluZyBvbmUgcGF0aC5cbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGhpcy5zdGF0dXNCYXJJdGVtRWwsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5maWxlPy5wYXRoO1xuICAgICAgICByZXR1cm4gcGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpID8/IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRvb2x0aXAodGhpcy5zdGF0dXNCYXJJdGVtRWwsIHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBhY3RpdmVPd25lclBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJlcyBhbiBvcHQtaW4gYGFib3J0YCBsaXN0ZW5lciBmb3IgYSBsb2NrIGVudHJ5OiB3aGVuIHRoZSBlbnRyeSdzIGNvbnRyb2xsZXIgYWJvcnRzLCByZWxlYXNlc1xuICAgKiB0aGUgZW50cnkgKGlmIHtAbGluayBMb2NrRW50cnkuc2hvdWxkUmVsZWFzZU9uQWJvcnR9KSBhbmQvb3IgaW52b2tlc1xuICAgKiB7QGxpbmsgTG9ja0VudHJ5Lm9uVW5sb2NrUmVxdWVzdGVkfS4gQSBuby1vcCB3aGVuIHRoZSBlbnRyeSBoYXMgbm8gY29udHJvbGxlciBvciBuZWl0aGVyIG9wdC1pbiBpc1xuICAgKiBzZXQsIHNvIHRyYW5zYWN0aW9uYWwgbG9ja3Mga2VlcCByZWxlYXNpbmcgdmlhIHRoZWlyIG93biBjbGVhbnVwLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZXhhY3QgcGF0aCB0aGUgZW50cnkgaXMgcmVnaXN0ZXJlZCB1bmRlci5cbiAgICogQHBhcmFtIGVudHJ5IC0gVGhlIGxvY2sgZW50cnkgd2hvc2UgY29udHJvbGxlciB0byBvYnNlcnZlLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlUmVsZWFzZU9uQWJvcnQoYXBwOiBBcHAsIHBhdGg6IHN0cmluZywgZW50cnk6IExvY2tFbnRyeSk6IHZvaWQge1xuICAgIGNvbnN0IHsgb25VbmxvY2tSZXF1ZXN0ZWQsIHNob3VsZFJlbGVhc2VPbkFib3J0IH0gPSBlbnRyeTtcbiAgICBpZiAoIWVudHJ5LmFib3J0Q29udHJvbGxlciB8fCAoIXNob3VsZFJlbGVhc2VPbkFib3J0ICYmICFvblVubG9ja1JlcXVlc3RlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cnkuYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgIGlmIChzaG91bGRSZWxlYXNlT25BYm9ydCkge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgcGF0aCwgZW50cnkpO1xuICAgICAgfVxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ/LigpO1xuICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGVyLXBsdWdpbiBoYW5kbGUgZm9yIHBhdGgtc2NvcGVkIHJlc291cmNlIGxvY2tpbmcgKGVkaXRvciByZWFkLW9ubHksIG9wdGlvbmFsIHZhdWx0LW11dGF0aW9uXG4gKiBibG9ja2luZywgYW5kIGV4dGVybmFsLWNoYW5nZSBkZXRlY3Rpb24gXHUyMDE0IHNlZSB0aGUgZmlsZSBvdmVydmlldykuIEFkZCBpdCBhcyBhIGNoaWxkIG9mIHlvdXIgcGx1Z2luXG4gKiAoYHRoaXMuYWRkQ2hpbGQobmV3IFJlc291cmNlTG9ja0NvbXBvbmVudCh0aGlzLmFwcCkpYCkgc28gdGhhdCBhbnkgbG9ja3MgaXQgc3RpbGwgaG9sZHMgYXJlIHJlbGVhc2VkXG4gKiBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBsdWdpbiB1bmxvYWRzIFx1MjAxNCBhIHJlc291cmNlIGNhbiBuZXZlciBiZSBsZWZ0IHN0dWNrIGxvY2tlZCBiZWNhdXNlIHRoZSBwbHVnaW5cbiAqIHRoYXQgbG9ja2VkIGl0IHdhcyBkaXNhYmxlZCBvciByZWxvYWRlZCBtaWQtb3BlcmF0aW9uLlxuICpcbiAqIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBhbmQgYXR0cmlidXRlZCB0byB0aGlzIHBsdWdpbiwgc28gdGhlIGxvY2sgaW5kaWNhdG9ycycgdG9vbHRpcCBuYW1lcyBpdFxuICogYW1vbmcgdGhlIHBsdWdpbnMgY3VycmVudGx5IGhvbGRpbmcgYSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NrQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBvd25pbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gTG9ja3MgYXJlIGF0dHJpYnV0ZWQgdG8gaXQgZm9yXG4gICAqIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIHJlc291cmNlLWxvY2sgaGFuZGxlIG93bmVkIGJ5IGEgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGlkIG9mIHRoZSBvd25pbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gTG9ja3MgYXJlIGF0dHJpYnV0ZWQgdG9cbiAgICogaXQgZm9yIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuICoqYW1iaWVudCBieXBhc3Mgc2NvcGUqKjogd2hpbGUgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpcyBub3QgZGlzcG9zZWQsIHRoaXNcbiAgICogcGx1Z2luJ3Mgb3duIG11dGF0aW9ucyBvZiB0aGUgZ2l2ZW4gcGF0aHMgKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgd2hvbGUgc3VidHJlZSkgcGFzcyB0aHJvdWdoIHRoZVxuICAgKiBtdXRhdGlvbiBibG9ja2VyIGluc3RlYWQgb2YgdGhyb3dpbmcge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBBbnkgbXV0YXRpb24gb2YgYSBibG9ja2VkIHBhdGhcbiAgICogTk9UIGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBzdGlsbCByZWplY3RlZC4gVXNlIGl0IHdpdGggYSBgdXNpbmdgIGRlY2xhcmF0aW9uIGFyb3VuZFxuICAgKiB0aGUgb3BlcmF0aW9uIHRoYXQgbGVnaXRpbWF0ZWx5IG11dGF0ZXMgcmVzb3VyY2VzIGl0IGhhcyBsb2NrZWQgd2l0aFxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnN9OlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB1c2luZyBfYnlwYXNzID0gY29tcG9uZW50LmJ5cGFzc0Jsb2NrZWRNdXRhdGlvbnMoW3NvdXJjZUZpbGUsIHRhcmdldEZpbGVdKTtcbiAgICogLy8gLi4uIHRoZSBvcGVyYXRpb24ncyBvd24gdmF1bHQgbXV0YXRpb25zIG9mIHRob3NlIHBhdGhzIGFyZSBhbGxvd2VkIC4uLlxuICAgKiAvLyBzY29wZSBlbmQ6IHRoZSBwYXRocyBhcmUgZW5mb3JjZWQgYWdhaW5cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoc09yRmlsZXMgLSBUaGUgcGF0aHMgKG9yIGZpbGVzL2ZvbGRlcnMpIHdob3NlIG11dGF0aW9uIGJ5IHRoaXMgb3BlcmF0aW9uIGlzIHNhbmN0aW9uZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgZW5kcyB0aGUgYnlwYXNzIHNjb3BlIHdoZW4gZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuYnlwYXNzKHRoaXMuYXBwLCBwYXRoc09yRmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgaXMgY292ZXJlZCBieSBhIGBzdWJ0cmVlYCBsb2NrIG9uIGFuIGFuY2VzdG9yLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkQnlBbmNlc3RvckZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWRCeUFuY2VzdG9yKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGJ5IGFueSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSB2YXVsdCBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZCBieSBhIGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9ja1xuICAgKiBvbiB0aGUgcGF0aCBpdHNlbGYgb3Igb24gYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgZWRpdGluZy9kZWxldGluZy9yZW5hbWluZy9tb3ZpbmcvY3JlYXRpbmcgdGhlIHBhdGggd291bGQgdGhyb3cgYVxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gICAqL1xuICBwdWJsaWMgaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIG9uIGJlaGFsZiBvZiB0aGlzIHBsdWdpbiwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50XG4gICAqIGFuZCBmdXR1cmUge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQuIFJlZmVyZW5jZS1jb3VudGVkOiBiYWxhbmNlIGVhY2ggY2FsbFxuICAgKiB3aXRoIGEgZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChpZGVhbGx5IHZpYSBgdXNpbmdgKSBvciB7QGxpbmsgdW5sb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBMb2NraW5nIHBhcmFtZXRlcnMuIEl0cyB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMucGF0aE9yRmlsZX1cbiAgICogYW5kIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5vcGVyYXRpb25OYW1lfSBhcmUgcmVxdWlyZWQgKHRoZSBsYXR0ZXIgaXMgc2hvd25cbiAgICogaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24pLiBQYXNzIGFuIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9XG4gICAqIHRvIG1ha2UgdGhlIGxvY2sgY2FuY2VsYWJsZSB2aWEgYSBsb2NrIGluZGljYXRvcidzIFwidW5sb2NrXCIgbWVudSwgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCxcbiAgICogb3Ige0BsaW5rIHJlcXVlc3RSZXNvdXJjZVVubG9ja0ZvclBhdGh9LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAgICovXG4gIHB1YmxpYyBsb2NrRm9yUGF0aChwYXJhbXM6IFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHtcbiAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBibG9ja3NNdXRhdGlvbnM6IHBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9ucyxcbiAgICAgIG1vZGU6IHBhcmFtcy5tb2RlLFxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ6IHBhcmFtcy5vblVubG9ja1JlcXVlc3RlZCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgICAgcGF0aE9yRmlsZTogcGFyYW1zLnBhdGhPckZpbGUsXG4gICAgICBwbHVnaW5JZDogdGhpcy5wbHVnaW5JZCxcbiAgICAgIHNob3VsZFJlbGVhc2VPbkFib3J0OiBwYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsb2NrIHN0aWxsIGhlbGQgYnkgdGhpcyBwbHVnaW4gd2hlbiB0aGUgY29tcG9uZW50IChhbmQgdGh1cyB0aGUgcGx1Z2luKSB1bmxvYWRzLFxuICAgKiBzbyBubyBub3RlIGlzIGxlZnQgc3R1Y2sgcmVhZC1vbmx5IGJ5IGFuIG9wZXJhdGlvbiB0aGF0IG5ldmVyIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrQWxsRm9yUGx1Z2luKHRoaXMuYXBwLCB0aGlzLnBsdWdpbklkKTtcbiAgICBzdXBlci5vbnVubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHVubG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGg6IHJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIGl0ICh0aGUgcGF0aCBpdHNlbGYgd2hlblxuICAgKiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyKSwgY2FuY2VscyB0aGUgb3BlcmF0aW9uKHMpIHRoYXQgdG9va1xuICAgKiB0aGUgbG9jayBieSBhYm9ydGluZyB0aGVpciB7QGxpbmsgQWJvcnRDb250cm9sbGVyfXMsIGFuZCByZWxlYXNlcyB0aGUgbG9jayBzbyB0aGUgbm90ZSBiZWNvbWVzXG4gICAqIGVkaXRhYmxlIFx1MjAxNCByZWdhcmRsZXNzIG9mIHdoaWNoIHBsdWdpbiBob2xkcyB0aGUgbG9jay4gUG93ZXJzIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQuIEFcbiAgICogbm8tb3Agd2hlbiBub3RoaW5nIGNvdmVycyB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0VW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLmZvcmNlVW5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biBieSB0aGUgdmF1bHQtbXV0YXRpb24gYmxvY2tlciB3aGVuIGEgcGx1Z2luIHRyaWVzIHRvIGVkaXQsIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciBjcmVhdGUgYVxuICogcmVzb3VyY2Ugd2hvc2UgcGF0aCBpcyBjb3ZlcmVkIGJ5IGEgbG9jayB0YWtlbiB3aXRoXG4gKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnN9LlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NrZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgdmF1bHQgcGF0aCB3aG9zZSBtdXRhdGlvbiB3YXMgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgVGhlIHJlc291cmNlIFwiJHtwYXRofVwiIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIG11dGF0ZWQuYCk7XG4gICAgdGhpcy5uYW1lID0gJ1Jlc291cmNlTG9ja2VkRXJyb3InO1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNvdXJjZUxvY2tlZEZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZChhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQgZGlyZWN0bHkgT1IgaXMgY292ZXJlZCBieSBhXG4gKiBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAqXG4gKiBVbmxpa2Uge0BsaW5rIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRofSwgd2hpY2ggb25seSByZXBvcnRzIGFuIGV4YWN0LXBhdGggbG9jaywgdGhpcyBhbHNvIHJlcG9ydHMgYVxuICogcGF0aCB0aGF0IGxpZXMgdW5kZXIgYSBmb2xkZXIgbG9ja2VkIGluIGBzdWJ0cmVlYCBtb2RlLiBVc2UgaXQgdG8gZGV0ZWN0IHRoYXQgYSByZW5hbWUvbW92ZSBpc1xuICogaGFwcGVuaW5nIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlIGFmZmVjdGVkIGZvbGRlclxuICogc3VidHJlZSksIHNvIHRoYXQgYSBieXN0YW5kZXIgKGUuZy4gdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlcikgY2FuIHN0YXkgb3V0IG9mIHRoZSB3YXkgYW5kIGxldCB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgb3duZXIga2VlcCBpdHMgb3duIGxpbmtzIGNvbnNpc3RlbnQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZEJ5QW5jZXN0b3IoYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50IGFuZCBmdXR1cmVcbiAqIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCBhbmQgc2hvd2luZyBhIGxvY2sgaW5kaWNhdG9yIGluIHRoZSB0YWIgaGVhZGVyLFxuICogdmlldyBhY3Rpb24gYmFyLCBhbmQgKHdoaWxlIGFjdGl2ZSkgdGhlIHN0YXR1cyBiYXIuIFRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHRoZSBwbHVnaW5zXG4gKiB0aGF0IGN1cnJlbnRseSBob2xkIGEgbG9jayBvbiB0aGUgbm90ZS5cbiAqXG4gKiBUaGUgbG9jayBpcyByZWZlcmVuY2UtY291bnRlZCBwZXIgY2FsbGluZyBwbHVnaW46IGVhY2ggY2FsbCBtdXN0IGJlIGJhbGFuY2VkIGJ5IGV4YWN0bHkgb25lXG4gKiByZWxlYXNlIChlaXRoZXIgZGlzcG9zaW5nIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gXHUyMDE0IGlkZWFsbHkgdmlhIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiBcdTIwMTQgb3JcbiAqIGEgbWF0Y2hpbmcge0BsaW5rIHVubG9ja1Jlc291cmNlRm9yUGF0aH0gY2FsbCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBsb2NraW5nIHRoZSBub3RlLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NrUmVzb3VyY2VGb3JQYXRoKHBhcmFtczogTG9ja1Jlc291cmNlRm9yUGF0aFBhcmFtcyk6IERpc3Bvc2FibGUge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSxcbiAgICBwYXRoT3JGaWxlOiBwYXJhbXMucGF0aE9yRmlsZSxcbiAgICBwbHVnaW5JZDogcGFyYW1zLnBsdWdpbklkXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIGFuIHVubG9jayBvZiB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBieSBhYm9ydGluZyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSB0aGF0IHdhc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgbG9jayBvbiBpdCAodmlhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9J3NcbiAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9KS4gVGhlIG9wZXJhdGlvbnMgaG9sZGluZyB0aGUgbG9ja1xuICogb2JzZXJ2ZSB0aGUgYWJvcnQgYW5kIHJlbGVhc2UgdGhlaXIgb3duIGxvY2tzLiBBIG5vLW9wIHdoZW4gbm8gYWJvcnRhYmxlIGxvY2sgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlXG4gKiBwYXRoLlxuICpcbiAqIFRoaXMgbGV0cyBhIGNvbnN1bWluZyBwbHVnaW4gd2lyZSBpdHMgb3duIFwidW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCB3aXRob3V0IHJlYWNoaW5nIGludG8gdGhlXG4gKiBsb2NrIG1hbmFnZXIgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICBnZXRNYW5hZ2VyKCkucmVxdWVzdFVubG9jayhhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja1Jlc291cmNlRm9yUGF0aH0uXG4gKlxuICogV2hlbiB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkIHRoZSBub3RlIGJlY29tZXMgZnVsbHkgZWRpdGFibGUgYWdhaW4gYW5kIGl0cyBsb2NrIGluZGljYXRvcnMgYXJlXG4gKiByZW1vdmVkLiBDYWxsaW5nIHRoaXMgd2hlbiB0aGUgbm90ZSBpcyBub3QgbG9ja2VkIGlzIGEgbm8tb3AuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGlkIG9mIHRoZSBwbHVnaW4gdGhhdCBob2xkcyB0aGUgbG9jayAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCk7IG9uZSBvZiBpdHNcbiAqIGxvY2tzIG9uIHRoZSBub3RlIGlzIHJlbGVhc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5sb2NrUmVzb3VyY2VGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS51bmxvY2soYXBwLCBwYXRoT3JGaWxlLCBwbHVnaW5JZCk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZXIoKTogUmVzb3VyY2VMb2NrTWFuYWdlciB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8UmVzb3VyY2VMb2NrTWFuYWdlcj4oUkVTT1VSQ0VfTE9DS19TVEFURV9LRVksIG5ldyBSZXNvdXJjZUxvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0EsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNF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
@@ -90,6 +90,8 @@ export declare enum ObsidianDevUtilsRepoPaths {
90
90
  NodeModules = "node_modules",
91
91
  /** Package JSON file. */
92
92
  PackageJson = "package.json",
93
+ /** Folder holding hand-written patched copies of third-party packages. */
94
+ Patches = "patches",
93
95
  /** Root folder. */
94
96
  RootFolder = "/",
95
97
  /** Scripts folder. */
@@ -62,6 +62,7 @@ var ObsidianDevUtilsRepoPaths = /* @__PURE__ */ ((ObsidianDevUtilsRepoPaths2) =>
62
62
  ObsidianDevUtilsRepoPaths2["MjsExtension"] = ".mjs";
63
63
  ObsidianDevUtilsRepoPaths2["NodeModules"] = "node_modules";
64
64
  ObsidianDevUtilsRepoPaths2["PackageJson"] = "package.json";
65
+ ObsidianDevUtilsRepoPaths2["Patches"] = "patches";
65
66
  ObsidianDevUtilsRepoPaths2["RootFolder"] = "/";
66
67
  ObsidianDevUtilsRepoPaths2["Scripts"] = "scripts";
67
68
  ObsidianDevUtilsRepoPaths2["ScriptUtils"] = "script-utils";
@@ -80,4 +81,4 @@ var ObsidianDevUtilsRepoPaths = /* @__PURE__ */ ((ObsidianDevUtilsRepoPaths2) =>
80
81
  export {
81
82
  ObsidianDevUtilsRepoPaths
82
83
  };
83
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZW51bWVyYXRpb24gb2YgY29tbW9uIGZpbGUgcGF0aHMgYW5kIHBhdHRlcm5zIHVzZWQgaW4gdGhlIE9ic2lkaWFuIGRldmVsb3BtZW50IHV0aWxpdGllcyByZXBvc2l0b3J5LlxuICogVGhlc2UgcGF0aHMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgb3RoZXIgdXRpbGl0aWVzLCBlbnN1cmluZyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNpbmcgdGhlIGxpa2VsaWhvb2RcbiAqIG9mIGVycm9ycyBkdWUgdG8gaGFyZGNvZGVkIHN0cmluZ3MuXG4gKi9cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBjb21tb24gZmlsZSBwYXRocyBhbmQgcGF0dGVybnMgdXNlZCBpbiB0aGUgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBlbnVtIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMge1xuICAvKiogQW55IGZpbGUgb3IgZm9sZGVyLiAqL1xuICBBbnkgPSAnKicsXG5cbiAgLyoqIENvbW1vbkpTIGZpbGUuICovXG4gIEFueUNqcyA9ICcqLmNqcycsXG5cbiAgLyoqIENvbW1vbkpTIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RGN0cyA9ICcqLmQuY3RzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RG10cyA9ICcqLmQubXRzJyxcblxuICAvKiogVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlLiAqL1xuICBBbnlEdHMgPSAnKi5kLnRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgZmlsZS4gKi9cbiAgQW55TWpzID0gJyoubWpzJyxcblxuICAvKiogQW55IHBhdGggcmVjdXJzaXZlbHkuICovXG4gIEFueVBhdGggPSAnKionLFxuXG4gIC8qKiBBbnkgVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBBbnlUcyA9ICcqLnRzJyxcblxuICAvKiogQXN0cm8gY29uZmlndXJhdGlvbiBmaWxlIChkb2N1bWVudGF0aW9uIHNpdGUpIGF0IHRoZSByZXBvIHJvb3QuICovXG4gIEFzdHJvQ29uZmlnVHMgPSAnYXN0cm8uY29uZmlnLnRzJyxcblxuICAvKiogQ29tbW9uSlMgZm9sZGVyLiAqL1xuICBDanMgPSAnY2pzJyxcblxuICAvKiogQ29tbW9uSlMgZmlsZSBleHRlbnNpb24uICovXG4gIENqc0V4dGVuc2lvbiA9ICcuY2pzJyxcblxuICAvKiogQ3VycmVudCBmb2xkZXIuICovXG4gIEN1cnJlbnRGb2xkZXIgPSAnLicsXG5cbiAgLyoqIERhdGF2aWV3IHR5cGVzLiAqL1xuICBEYXRhdmlld1R5cGVzID0gJ3NyYy9vYnNpZGlhbi9AdHlwZXMvZGF0YXZpZXcvKionLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBEY3RzRXh0ZW5zaW9uID0gJy5kLmN0cycsXG5cbiAgLyoqIERpc3RyaWJ1dGlvbiBmb2xkZXIuICovXG4gIERpc3QgPSAnZGlzdCcsXG5cbiAgLyoqIEEgcGF0aCB0byB0aGUgYnVpbHQgYGRlbW8tdmF1bHQtaGVscGVyYCBwbHVnaW4gd2l0aGluIHRoZSB7QGxpbmsgRGlzdH0gZm9sZGVyLCBpbmplY3RlZCBpbnRvIGRlbW8gdmF1bHRzIGF0IHJlbGVhc2UgdGltZS4gKi9cbiAgRGlzdERlbW9WYXVsdEhlbHBlciA9ICdkaXN0L2RlbW8tdmF1bHQtaGVscGVyJyxcblxuICAvKiogQSBwYXRoIHRvIHRoZSBgbGliYCBmb2xkZXIgd2l0aGluIHRoZSB7QGxpbmsgRGlzdH0gZm9sZGVyLiAqL1xuICBEaXN0TGliID0gJ2Rpc3QvbGliJyxcblxuICAvKiogQSBwYXRoIHRvIHRoZSBgdGVtcGxhdGVzYCBmb2xkZXIgd2l0aGluIHRoZSB7QGxpbmsgRGlzdH0gZm9sZGVyLCBob2xkaW5nIHRoZSBjb25zdW1lci1mYWNpbmcgdGVtcGxhdGVzLiAqL1xuICBEaXN0VGVtcGxhdGVzID0gJ2Rpc3QvdGVtcGxhdGVzJyxcblxuICAvKiogVHJhbnNwaWxlZCBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBEanNFeHRlbnNpb24gPSAnLmQuanMnLFxuXG4gIC8qKiBFU00gVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgRG10c0V4dGVuc2lvbiA9ICcuZC5tdHMnLFxuXG4gIC8qKiBEb2N1bWVudGF0aW9uIHNpdGUgZm9sZGVyIChBc3RybyArIFN0YXJsaWdodCBBUEktZG9jcyBzdWItcHJvamVjdCkuICovXG4gIERvY3MgPSAnZG9jcycsXG5cbiAgLyoqIEJ1aWxkIG91dHB1dCBmb2xkZXIgb2YgdGhlIGRvY3VtZW50YXRpb24gc2l0ZS4gKi9cbiAgRG9jc0Rpc3QgPSAnZG9jcy9kaXN0JyxcblxuICAvKiogRHByaW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgRHByaW50SnNvbiA9ICdkcHJpbnQuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBleHRlbnNpb24uICovXG4gIER0c0V4dGVuc2lvbiA9ICcuZC50cycsXG5cbiAgLyoqIEVTTSBUeXBlU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ010cyA9ICdlc2xpbnQuY29uZmlnLm10cycsXG5cbiAgLyoqIEVTTSBKYXZhU2NyaXB0IGZvbGRlci4gKi9cbiAgRXNtID0gJ2VzbScsXG5cbiAgLyoqIEdlbmVyYXRlZC1kdXJpbmctYnVpbGQgQ29tbW9uSlMgZmlsZS4gKi9cbiAgR2VuZXJhdGVkRHVyaW5nQnVpbGRDanMgPSAnZ2VuZXJhdGVkLWR1cmluZy1idWlsZC5janMnLFxuXG4gIC8qKiBHZW5lcmF0ZWQtZHVyaW5nLWJ1aWxkIEVTTSBKYXZhU2NyaXB0IGZpbGUuICovXG4gIEdlbmVyYXRlZER1cmluZ0J1aWxkTWpzID0gJ2dlbmVyYXRlZC1kdXJpbmctYnVpbGQubWpzJyxcblxuICAvKiogQ29tbW9uSlMgSmF2YVNjcmlwdCBpbmRleCBmaWxlLiAqL1xuICBJbmRleENqcyA9ICdpbmRleC5janMnLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhEY3RzID0gJ2luZGV4LmQuY3RzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBpbmRleCBmaWxlLiAqL1xuICBJbmRleERtdHMgPSAnaW5kZXguZC5tdHMnLFxuXG4gIC8qKiBFU00gSmF2YVNjcmlwdCBpbmRleCBmaWxlLiAqL1xuICBJbmRleE1qcyA9ICdpbmRleC5tanMnLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGluZGV4IGZpbGUuICovXG4gIEluZGV4VHMgPSAnaW5kZXgudHMnLFxuXG4gIC8qKiBKYXZhU2NyaXB0IGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBKc0V4dGVuc2lvbiA9ICcuanMnLFxuXG4gIC8qKiBFU00gTWFya2Rvd25saW50IENMSTIgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDbGkyQ29uZmlnTWpzID0gJy5tYXJrZG93bmxpbnQtY2xpMi5tanMnLFxuXG4gIC8qKiBNYXJrZG93bmxpbnQgQ0xJMiBjb25maWd1cmF0aW9uIHNjaGVtYSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludFR5cGVzTWFya2Rvd25saW50Q2xpMkNvbmZpZ1NjaGVtYUR0cyA9ICdzcmMvc2NyaXB0LXV0aWxzL2xpbnRlcnMvbWFya2Rvd25saW50LXR5cGVzL0B0eXBlcy9tYXJrZG93bmxpbnQtY2xpMi1jb25maWctc2NoZW1hLmQudHMnLFxuXG4gIC8qKiBHZW5lcmF0ZWQgZmxhdCByZS1leHBvcnQgYmFycmVsIGZpbGUuICovXG4gIE1lcmdlZFRzID0gJ19fbWVyZ2VkLnRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgZmlsZSBleHRlbnNpb24uICovXG4gIE1qc0V4dGVuc2lvbiA9ICcubWpzJyxcblxuICAvKiogTm9kZSBtb2R1bGVzIGZvbGRlci4gKi9cbiAgTm9kZU1vZHVsZXMgPSAnbm9kZV9tb2R1bGVzJyxcblxuICAvKiogUGFja2FnZSBKU09OIGZpbGUuICovXG4gIFBhY2thZ2VKc29uID0gJ3BhY2thZ2UuanNvbicsXG5cbiAgLyoqIFJvb3QgZm9sZGVyLiAqL1xuICBSb290Rm9sZGVyID0gJy8nLFxuXG4gIC8qKiBTY3JpcHRzIGZvbGRlci4gKi9cbiAgU2NyaXB0cyA9ICdzY3JpcHRzJyxcblxuICAvKiogU2NyaXB0VXRpbHMgZm9sZGVyLiAqL1xuICBTY3JpcHRVdGlscyA9ICdzY3JpcHQtdXRpbHMnLFxuXG4gIC8qKiBTb3VyY2UgZm9sZGVyLiAqL1xuICBTcmMgPSAnc3JjJyxcblxuICAvKiogU3R5bGVzIGZvbGRlci4gKi9cbiAgU3R5bGVzID0gJ3N0eWxlcycsXG5cbiAgLyoqIFN0eWxlcyBDU1MgZmlsZS4gKi9cbiAgU3R5bGVzQ3NzID0gJ3N0eWxlcy5jc3MnLFxuXG4gIC8qKiBUZW1wbGF0ZXMgZm9sZGVyLiAqL1xuICBUZW1wbGF0ZXMgPSAndGVtcGxhdGVzJyxcblxuICAvKiogVGVzdCBoZWxwZXJzIGZvbGRlci4gKi9cbiAgVGVzdEhlbHBlcnMgPSAndGVzdC1oZWxwZXJzJyxcblxuICAvKiogVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIFRzQ29uZmlnSnNvbiA9ICd0c2NvbmZpZy5qc29uJyxcblxuICAvKiogVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCB2YWxpZGF0ZXMgdGhlIGdlbmVyYXRlZCBDb21tb25KUyBkZWNsYXJhdGlvbnMuICovXG4gIFRzQ29uZmlnVmFsaWRhdGVEZWNsYXJhdGlvbnNDanNKc29uID0gJ3RzY29uZmlnLnZhbGlkYXRlLWRlY2xhcmF0aW9ucy1janMuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgdmFsaWRhdGVzIHRoZSBnZW5lcmF0ZWQgRVNNIGRlY2xhcmF0aW9ucy4gKi9cbiAgVHNDb25maWdWYWxpZGF0ZURlY2xhcmF0aW9uc0pzb24gPSAndHNjb25maWcudmFsaWRhdGUtZGVjbGFyYXRpb25zLmpzb24nLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBUc0V4dGVuc2lvbiA9ICcudHMnLFxuXG4gIC8qKiBUeXBlcyBmb2xkZXIuICovXG4gIFR5cGVzID0gJ0B0eXBlcydcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV08sSUFBSyw0QkFBTCxrQkFBS0EsK0JBQUw7QUFFTCxFQUFBQSwyQkFBQSxTQUFNO0FBR04sRUFBQUEsMkJBQUEsWUFBUztBQUdULEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxhQUFVO0FBR1YsRUFBQUEsMkJBQUEsWUFBUztBQUdULEVBQUFBLDJCQUFBLFlBQVM7QUFHVCxFQUFBQSwyQkFBQSxhQUFVO0FBR1YsRUFBQUEsMkJBQUEsV0FBUTtBQUdSLEVBQUFBLDJCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSwyQkFBQSxTQUFNO0FBR04sRUFBQUEsMkJBQUEsa0JBQWU7QUFHZixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsbUJBQWdCO0FBR2hCLEVBQUFBLDJCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSwyQkFBQSxVQUFPO0FBR1AsRUFBQUEsMkJBQUEseUJBQXNCO0FBR3RCLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsa0JBQWU7QUFHZixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsVUFBTztBQUdQLEVBQUFBLDJCQUFBLGNBQVc7QUFHWCxFQUFBQSwyQkFBQSxnQkFBYTtBQUdiLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEscUJBQWtCO0FBR2xCLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSw2QkFBMEI7QUFHMUIsRUFBQUEsMkJBQUEsNkJBQTBCO0FBRzFCLEVBQUFBLDJCQUFBLGNBQVc7QUFHWCxFQUFBQSwyQkFBQSxlQUFZO0FBR1osRUFBQUEsMkJBQUEsZUFBWTtBQUdaLEVBQUFBLDJCQUFBLGNBQVc7QUFHWCxFQUFBQSwyQkFBQSxhQUFVO0FBR1YsRUFBQUEsMkJBQUEsaUJBQWM7QUFHZCxFQUFBQSwyQkFBQSwrQkFBNEI7QUFHNUIsRUFBQUEsMkJBQUEsc0RBQW1EO0FBR25ELEVBQUFBLDJCQUFBLGNBQVc7QUFHWCxFQUFBQSwyQkFBQSxrQkFBZTtBQUdmLEVBQUFBLDJCQUFBLGlCQUFjO0FBR2QsRUFBQUEsMkJBQUEsaUJBQWM7QUFHZCxFQUFBQSwyQkFBQSxnQkFBYTtBQUdiLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsZUFBWTtBQUdaLEVBQUFBLDJCQUFBLGVBQVk7QUFHWixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEseUNBQXNDO0FBR3RDLEVBQUFBLDJCQUFBLHNDQUFtQztBQUduQyxFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLFdBQVE7QUE5SkUsU0FBQUE7QUFBQSxHQUFBOyIsCiAgIm5hbWVzIjogWyJPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIl0KfQo=
84
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZW51bWVyYXRpb24gb2YgY29tbW9uIGZpbGUgcGF0aHMgYW5kIHBhdHRlcm5zIHVzZWQgaW4gdGhlIE9ic2lkaWFuIGRldmVsb3BtZW50IHV0aWxpdGllcyByZXBvc2l0b3J5LlxuICogVGhlc2UgcGF0aHMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgb3RoZXIgdXRpbGl0aWVzLCBlbnN1cmluZyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNpbmcgdGhlIGxpa2VsaWhvb2RcbiAqIG9mIGVycm9ycyBkdWUgdG8gaGFyZGNvZGVkIHN0cmluZ3MuXG4gKi9cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBjb21tb24gZmlsZSBwYXRocyBhbmQgcGF0dGVybnMgdXNlZCBpbiB0aGUgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBlbnVtIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMge1xuICAvKiogQW55IGZpbGUgb3IgZm9sZGVyLiAqL1xuICBBbnkgPSAnKicsXG5cbiAgLyoqIENvbW1vbkpTIGZpbGUuICovXG4gIEFueUNqcyA9ICcqLmNqcycsXG5cbiAgLyoqIENvbW1vbkpTIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RGN0cyA9ICcqLmQuY3RzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RG10cyA9ICcqLmQubXRzJyxcblxuICAvKiogVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlLiAqL1xuICBBbnlEdHMgPSAnKi5kLnRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgZmlsZS4gKi9cbiAgQW55TWpzID0gJyoubWpzJyxcblxuICAvKiogQW55IHBhdGggcmVjdXJzaXZlbHkuICovXG4gIEFueVBhdGggPSAnKionLFxuXG4gIC8qKiBBbnkgVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBBbnlUcyA9ICcqLnRzJyxcblxuICAvKiogQXN0cm8gY29uZmlndXJhdGlvbiBmaWxlIChkb2N1bWVudGF0aW9uIHNpdGUpIGF0IHRoZSByZXBvIHJvb3QuICovXG4gIEFzdHJvQ29uZmlnVHMgPSAnYXN0cm8uY29uZmlnLnRzJyxcblxuICAvKiogQ29tbW9uSlMgZm9sZGVyLiAqL1xuICBDanMgPSAnY2pzJyxcblxuICAvKiogQ29tbW9uSlMgZmlsZSBleHRlbnNpb24uICovXG4gIENqc0V4dGVuc2lvbiA9ICcuY2pzJyxcblxuICAvKiogQ3VycmVudCBmb2xkZXIuICovXG4gIEN1cnJlbnRGb2xkZXIgPSAnLicsXG5cbiAgLyoqIERhdGF2aWV3IHR5cGVzLiAqL1xuICBEYXRhdmlld1R5cGVzID0gJ3NyYy9vYnNpZGlhbi9AdHlwZXMvZGF0YXZpZXcvKionLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBEY3RzRXh0ZW5zaW9uID0gJy5kLmN0cycsXG5cbiAgLyoqIERpc3RyaWJ1dGlvbiBmb2xkZXIuICovXG4gIERpc3QgPSAnZGlzdCcsXG5cbiAgLyoqIEEgcGF0aCB0byB0aGUgYnVpbHQgYGRlbW8tdmF1bHQtaGVscGVyYCBwbHVnaW4gd2l0aGluIHRoZSB7QGxpbmsgRGlzdH0gZm9sZGVyLCBpbmplY3RlZCBpbnRvIGRlbW8gdmF1bHRzIGF0IHJlbGVhc2UgdGltZS4gKi9cbiAgRGlzdERlbW9WYXVsdEhlbHBlciA9ICdkaXN0L2RlbW8tdmF1bHQtaGVscGVyJyxcblxuICAvKiogQSBwYXRoIHRvIHRoZSBgbGliYCBmb2xkZXIgd2l0aGluIHRoZSB7QGxpbmsgRGlzdH0gZm9sZGVyLiAqL1xuICBEaXN0TGliID0gJ2Rpc3QvbGliJyxcblxuICAvKiogQSBwYXRoIHRvIHRoZSBgdGVtcGxhdGVzYCBmb2xkZXIgd2l0aGluIHRoZSB7QGxpbmsgRGlzdH0gZm9sZGVyLCBob2xkaW5nIHRoZSBjb25zdW1lci1mYWNpbmcgdGVtcGxhdGVzLiAqL1xuICBEaXN0VGVtcGxhdGVzID0gJ2Rpc3QvdGVtcGxhdGVzJyxcblxuICAvKiogVHJhbnNwaWxlZCBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBEanNFeHRlbnNpb24gPSAnLmQuanMnLFxuXG4gIC8qKiBFU00gVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgRG10c0V4dGVuc2lvbiA9ICcuZC5tdHMnLFxuXG4gIC8qKiBEb2N1bWVudGF0aW9uIHNpdGUgZm9sZGVyIChBc3RybyArIFN0YXJsaWdodCBBUEktZG9jcyBzdWItcHJvamVjdCkuICovXG4gIERvY3MgPSAnZG9jcycsXG5cbiAgLyoqIEJ1aWxkIG91dHB1dCBmb2xkZXIgb2YgdGhlIGRvY3VtZW50YXRpb24gc2l0ZS4gKi9cbiAgRG9jc0Rpc3QgPSAnZG9jcy9kaXN0JyxcblxuICAvKiogRHByaW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgRHByaW50SnNvbiA9ICdkcHJpbnQuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBleHRlbnNpb24uICovXG4gIER0c0V4dGVuc2lvbiA9ICcuZC50cycsXG5cbiAgLyoqIEVTTSBUeXBlU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ010cyA9ICdlc2xpbnQuY29uZmlnLm10cycsXG5cbiAgLyoqIEVTTSBKYXZhU2NyaXB0IGZvbGRlci4gKi9cbiAgRXNtID0gJ2VzbScsXG5cbiAgLyoqIEdlbmVyYXRlZC1kdXJpbmctYnVpbGQgQ29tbW9uSlMgZmlsZS4gKi9cbiAgR2VuZXJhdGVkRHVyaW5nQnVpbGRDanMgPSAnZ2VuZXJhdGVkLWR1cmluZy1idWlsZC5janMnLFxuXG4gIC8qKiBHZW5lcmF0ZWQtZHVyaW5nLWJ1aWxkIEVTTSBKYXZhU2NyaXB0IGZpbGUuICovXG4gIEdlbmVyYXRlZER1cmluZ0J1aWxkTWpzID0gJ2dlbmVyYXRlZC1kdXJpbmctYnVpbGQubWpzJyxcblxuICAvKiogQ29tbW9uSlMgSmF2YVNjcmlwdCBpbmRleCBmaWxlLiAqL1xuICBJbmRleENqcyA9ICdpbmRleC5janMnLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhEY3RzID0gJ2luZGV4LmQuY3RzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBpbmRleCBmaWxlLiAqL1xuICBJbmRleERtdHMgPSAnaW5kZXguZC5tdHMnLFxuXG4gIC8qKiBFU00gSmF2YVNjcmlwdCBpbmRleCBmaWxlLiAqL1xuICBJbmRleE1qcyA9ICdpbmRleC5tanMnLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGluZGV4IGZpbGUuICovXG4gIEluZGV4VHMgPSAnaW5kZXgudHMnLFxuXG4gIC8qKiBKYXZhU2NyaXB0IGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBKc0V4dGVuc2lvbiA9ICcuanMnLFxuXG4gIC8qKiBFU00gTWFya2Rvd25saW50IENMSTIgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDbGkyQ29uZmlnTWpzID0gJy5tYXJrZG93bmxpbnQtY2xpMi5tanMnLFxuXG4gIC8qKiBNYXJrZG93bmxpbnQgQ0xJMiBjb25maWd1cmF0aW9uIHNjaGVtYSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludFR5cGVzTWFya2Rvd25saW50Q2xpMkNvbmZpZ1NjaGVtYUR0cyA9ICdzcmMvc2NyaXB0LXV0aWxzL2xpbnRlcnMvbWFya2Rvd25saW50LXR5cGVzL0B0eXBlcy9tYXJrZG93bmxpbnQtY2xpMi1jb25maWctc2NoZW1hLmQudHMnLFxuXG4gIC8qKiBHZW5lcmF0ZWQgZmxhdCByZS1leHBvcnQgYmFycmVsIGZpbGUuICovXG4gIE1lcmdlZFRzID0gJ19fbWVyZ2VkLnRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgZmlsZSBleHRlbnNpb24uICovXG4gIE1qc0V4dGVuc2lvbiA9ICcubWpzJyxcblxuICAvKiogTm9kZSBtb2R1bGVzIGZvbGRlci4gKi9cbiAgTm9kZU1vZHVsZXMgPSAnbm9kZV9tb2R1bGVzJyxcblxuICAvKiogUGFja2FnZSBKU09OIGZpbGUuICovXG4gIFBhY2thZ2VKc29uID0gJ3BhY2thZ2UuanNvbicsXG5cbiAgLyoqIEZvbGRlciBob2xkaW5nIGhhbmQtd3JpdHRlbiBwYXRjaGVkIGNvcGllcyBvZiB0aGlyZC1wYXJ0eSBwYWNrYWdlcy4gKi9cbiAgUGF0Y2hlcyA9ICdwYXRjaGVzJyxcblxuICAvKiogUm9vdCBmb2xkZXIuICovXG4gIFJvb3RGb2xkZXIgPSAnLycsXG5cbiAgLyoqIFNjcmlwdHMgZm9sZGVyLiAqL1xuICBTY3JpcHRzID0gJ3NjcmlwdHMnLFxuXG4gIC8qKiBTY3JpcHRVdGlscyBmb2xkZXIuICovXG4gIFNjcmlwdFV0aWxzID0gJ3NjcmlwdC11dGlscycsXG5cbiAgLyoqIFNvdXJjZSBmb2xkZXIuICovXG4gIFNyYyA9ICdzcmMnLFxuXG4gIC8qKiBTdHlsZXMgZm9sZGVyLiAqL1xuICBTdHlsZXMgPSAnc3R5bGVzJyxcblxuICAvKiogU3R5bGVzIENTUyBmaWxlLiAqL1xuICBTdHlsZXNDc3MgPSAnc3R5bGVzLmNzcycsXG5cbiAgLyoqIFRlbXBsYXRlcyBmb2xkZXIuICovXG4gIFRlbXBsYXRlcyA9ICd0ZW1wbGF0ZXMnLFxuXG4gIC8qKiBUZXN0IGhlbHBlcnMgZm9sZGVyLiAqL1xuICBUZXN0SGVscGVycyA9ICd0ZXN0LWhlbHBlcnMnLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgVHNDb25maWdKc29uID0gJ3RzY29uZmlnLmpzb24nLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IHZhbGlkYXRlcyB0aGUgZ2VuZXJhdGVkIENvbW1vbkpTIGRlY2xhcmF0aW9ucy4gKi9cbiAgVHNDb25maWdWYWxpZGF0ZURlY2xhcmF0aW9uc0Nqc0pzb24gPSAndHNjb25maWcudmFsaWRhdGUtZGVjbGFyYXRpb25zLWNqcy5qc29uJyxcblxuICAvKiogVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCB2YWxpZGF0ZXMgdGhlIGdlbmVyYXRlZCBFU00gZGVjbGFyYXRpb25zLiAqL1xuICBUc0NvbmZpZ1ZhbGlkYXRlRGVjbGFyYXRpb25zSnNvbiA9ICd0c2NvbmZpZy52YWxpZGF0ZS1kZWNsYXJhdGlvbnMuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgZmlsZSBleHRlbnNpb24uICovXG4gIFRzRXh0ZW5zaW9uID0gJy50cycsXG5cbiAgLyoqIFR5cGVzIGZvbGRlci4gKi9cbiAgVHlwZXMgPSAnQHR5cGVzJ1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXTyxJQUFLLDRCQUFMLGtCQUFLQSwrQkFBTDtBQUVMLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsYUFBVTtBQUdWLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsWUFBUztBQUdULEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxXQUFRO0FBR1IsRUFBQUEsMkJBQUEsbUJBQWdCO0FBR2hCLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSxrQkFBZTtBQUdmLEVBQUFBLDJCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsbUJBQWdCO0FBR2hCLEVBQUFBLDJCQUFBLFVBQU87QUFHUCxFQUFBQSwyQkFBQSx5QkFBc0I7QUFHdEIsRUFBQUEsMkJBQUEsYUFBVTtBQUdWLEVBQUFBLDJCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSwyQkFBQSxrQkFBZTtBQUdmLEVBQUFBLDJCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSwyQkFBQSxVQUFPO0FBR1AsRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGdCQUFhO0FBR2IsRUFBQUEsMkJBQUEsa0JBQWU7QUFHZixFQUFBQSwyQkFBQSxxQkFBa0I7QUFHbEIsRUFBQUEsMkJBQUEsU0FBTTtBQUdOLEVBQUFBLDJCQUFBLDZCQUEwQjtBQUcxQixFQUFBQSwyQkFBQSw2QkFBMEI7QUFHMUIsRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGVBQVk7QUFHWixFQUFBQSwyQkFBQSxlQUFZO0FBR1osRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLCtCQUE0QjtBQUc1QixFQUFBQSwyQkFBQSxzREFBbUQ7QUFHbkQsRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEsaUJBQWM7QUFHZCxFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxnQkFBYTtBQUdiLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsZUFBWTtBQUdaLEVBQUFBLDJCQUFBLGVBQVk7QUFHWixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEseUNBQXNDO0FBR3RDLEVBQUFBLDJCQUFBLHNDQUFtQztBQUduQyxFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLFdBQVE7QUFqS0UsU0FBQUE7QUFBQSxHQUFBOyIsCiAgIm5hbWVzIjogWyJPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIl0KfQo=
@@ -162,6 +162,20 @@ export declare function addGitTag(newVersion: string): Promise<void>;
162
162
  * @returns A {@link Promise} that resolves when the files have been added and committed.
163
163
  */
164
164
  export declare function addUpdatedFilesToGit(newVersion: string, options?: AddUpdatedFilesToGitOptions): Promise<void>;
165
+ /**
166
+ * Wraps any bare `http(s)://` URL in the given text in angle brackets (`<url>`) so that text emitted
167
+ * into a Markdown document (such as a generated changelog bullet) passes markdownlint's
168
+ * `MD034/no-bare-urls` rule while still rendering as a clickable autolink on GitHub.
169
+ *
170
+ * URLs that are already wrapped in angle brackets (`<url>`) or that form the target of a Markdown
171
+ * link (`[text](url)`) are left untouched, so the function is safe to run repeatedly. Trailing
172
+ * sentence punctuation (`.`, `,`, `;`, `:`, `!`, `?`) is kept outside the angle brackets so it does
173
+ * not become part of the link.
174
+ *
175
+ * @param text - The text possibly containing bare URLs.
176
+ * @returns The text with every bare URL wrapped in angle brackets.
177
+ */
178
+ export declare function autolinkBareUrls(text: string): string;
165
179
  /**
166
180
  * Checks if the GitHub CLI is installed on the system.
167
181
  *