@pipeline-builder/pipeline-data 4.3.5 → 4.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/lib/api/access-control-builder.js +1 -1
  2. package/lib/api/alert-destinations.js +1 -1
  3. package/lib/api/crud-service.js +1 -1
  4. package/lib/api/ecosystem-privacy.js +1 -1
  5. package/lib/api/keyset-cursor.js +1 -1
  6. package/lib/api/pipeline-step-resolution.js +1 -1
  7. package/lib/api/plugin-advisories.js +1 -1
  8. package/lib/api/plugin-consumption-policy.js +1 -1
  9. package/lib/api/plugin-resolution.js +6 -1
  10. package/lib/api/public-directory.d.ts +71 -3
  11. package/lib/api/public-directory.js +68 -22
  12. package/lib/api/query-builders.js +47 -2
  13. package/lib/api/reporting/analytics-queries.js +1 -1
  14. package/lib/api/reporting/caches.js +1 -1
  15. package/lib/api/reporting/daily-rollup.js +1 -1
  16. package/lib/api/reporting/deploy-rollup.js +1 -1
  17. package/lib/api/reporting/dora-scoring.js +1 -1
  18. package/lib/api/reporting/dora.js +1 -1
  19. package/lib/api/reporting/failure-classifier.js +1 -1
  20. package/lib/api/reporting/ingest.js +1 -1
  21. package/lib/api/reporting/last-deploy.js +1 -1
  22. package/lib/api/reporting/needs-attention.js +1 -1
  23. package/lib/api/reporting/plugin-exposure.js +1 -1
  24. package/lib/api/reporting/plugin-runtime.js +1 -1
  25. package/lib/api/reporting/query-scope.js +1 -1
  26. package/lib/api/reporting/retention-sweep.js +1 -1
  27. package/lib/api/reporting/retention.js +1 -1
  28. package/lib/api/reporting/sql-helpers.js +1 -1
  29. package/lib/api/reporting/stakeholder/compose.js +1 -1
  30. package/lib/api/reporting/stakeholder/index.js +1 -1
  31. package/lib/api/reporting/stakeholder/period.js +1 -1
  32. package/lib/api/reporting/stakeholder/report-html.js +1 -1
  33. package/lib/api/reporting/stakeholder/sections.js +1 -1
  34. package/lib/api/reporting/stakeholder/store.js +1 -1
  35. package/lib/api/reporting/stakeholder/templates.js +1 -1
  36. package/lib/api/reporting/types.js +1 -1
  37. package/lib/api/reporting-service.js +1 -1
  38. package/lib/api/semver-range.js +1 -1
  39. package/lib/api/soft-delete-sweep.js +1 -1
  40. package/lib/api/support-cases.js +1 -1
  41. package/lib/api/version-references.js +1 -1
  42. package/lib/api/viewer-context.js +1 -1
  43. package/lib/core/query-filters.d.ts +25 -0
  44. package/lib/core/query-filters.js +1 -1
  45. package/lib/database/drizzle-schema.d.ts +19 -0
  46. package/lib/database/drizzle-schema.js +1 -1
  47. package/lib/database/index.js +1 -1
  48. package/lib/database/pg-result.js +1 -1
  49. package/lib/database/postgres-connection.js +1 -1
  50. package/lib/database/public-reader.js +1 -1
  51. package/lib/database/read-connection.js +1 -1
  52. package/lib/database/read-lag.js +1 -1
  53. package/lib/database/retry-strategy.js +1 -1
  54. package/lib/database/schema/alert.js +1 -1
  55. package/lib/database/schema/compliance.js +1 -1
  56. package/lib/database/schema/dashboard.js +1 -1
  57. package/lib/database/schema/ecosystem.d.ts +17 -0
  58. package/lib/database/schema/ecosystem.js +3 -1
  59. package/lib/database/schema/message-attachment.js +1 -1
  60. package/lib/database/schema/message.d.ts +19 -0
  61. package/lib/database/schema/message.js +18 -1
  62. package/lib/database/schema/pipeline-template.js +1 -1
  63. package/lib/database/schema/pipeline.js +1 -1
  64. package/lib/database/schema/plugin.js +1 -1
  65. package/lib/database/schema/reporting-analytics.js +1 -1
  66. package/lib/database/schema/reporting-stakeholder.js +1 -1
  67. package/lib/database/schema/support.js +1 -1
  68. package/lib/database/tenancy.js +1 -1
  69. package/lib/index.js +1 -1
  70. package/package.json +8 -8
@@ -887,4 +887,4 @@ async function soften(p, fallback, onFail) {
887
887
  }
888
888
  }
889
889
  export const reportingService = new ReportingService();
890
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEgsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVFLGdGQUFnRjtBQUNoRiw0RUFBNEU7QUFDNUUsT0FBTyxFQUNMLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsc0JBQXNCLEdBRXZCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JHLE9BQU8sRUFDTCxjQUFjLElBQUksV0FBVyxFQUM3QixZQUFZLElBQUksU0FBUyxFQUN6QixjQUFjLElBQUksV0FBVyxHQUM5QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLDhFQUE4RTtBQUM5RSxPQUFPLEVBQUUsWUFBWSxJQUFJLE1BQU0sRUFB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Qyx3REFBd0QsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDWCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgaXNvT3JOdWxsLCBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vLyBFeHRyYWN0ZWQgZm9yIHNpemUg4oCUIHNlZSAuL3JlcG9ydGluZy8uIEV2ZXJ5dGhpbmcgcHVibGljIGlzIHJlLWV4cG9ydGVkIGJlbG93XG4vLyBzbyBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAncyBzdXJmYWNlIGlzIHVuY2hhbmdlZCBieSB0aGUgc3BsaXQuXG5pbXBvcnQge1xuICBnZXRBZG9wdGlvbixcbiAgZ2V0RmFpbHVyZUFuYWx5c2lzLFxuICBnZXRPdXRkYXRlZFBsdWdpbnMsXG4gIGdldFBpcGVsaW5lQnJlYWtkb3duLFxuICBnZXRQaXBlbGluZUNvbmZpZ0NoYW5nZXMsXG4gIGdldFBpcGVsaW5lU3RyZWFrcyxcbiAgZ2V0UGx1Z2luVnVsbmVyYWJpbGl0aWVzLFxuICBnZXRQcm9tb3Rpb25WaWV3LFxuICBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uLFxuICBnZXRTdGFnZVBlcmZvcm1hbmNlLFxuICBnZXRVbnRyYWNrZWRQaXBlbGluZXMsXG4gIGdldFZ1bG5lcmFibGVQaXBlbGluZXMsXG4gIHR5cGUgQW5hbHl0aWNzU2NvcGUsXG59IGZyb20gJy4vcmVwb3J0aW5nL2FuYWx5dGljcy1xdWVyaWVzLmpzJztcbmltcG9ydCB7IGludmVudG9yeUNhY2hlLCBpbnZhbGlkYXRlT3JnUmVwb3J0cyB9IGZyb20gJy4vcmVwb3J0aW5nL2NhY2hlcy5qcyc7XG5pbXBvcnQgeyBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUywgcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMgfSBmcm9tICcuL3JlcG9ydGluZy9kb3JhLXNjb3JpbmcuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RG9yYU1ldHJpY3MgYXMgZG9yYU1ldHJpY3MsXG4gIGdldERvcmFUcmVuZCBhcyBkb3JhVHJlbmQsXG4gIGdldEJ1aWxkSGVhbHRoIGFzIGJ1aWxkSGVhbHRoLFxufSBmcm9tICcuL3JlcG9ydGluZy9kb3JhLmpzJztcbi8vIEFsaWFzZWQ6IHRoZSBtb2R1bGUgZnVuY3Rpb25zIGFuZCB0aGUgZGVsZWdhdGluZyBtZXRob2RzIGJlbG93IHNoYXJlIG5hbWVzLlxuaW1wb3J0IHsgaW5nZXN0RXZlbnRzIGFzIGluZ2VzdCB9IGZyb20gJy4vcmVwb3J0aW5nL2luZ2VzdC5qcyc7XG5pbXBvcnQgeyBnZXRMYXN0RGVwbG95ZWRDb21taXQgYXMgbGFzdERlcGxveWVkQ29tbWl0IH0gZnJvbSAnLi9yZXBvcnRpbmcvbGFzdC1kZXBsb3kuanMnO1xuaW1wb3J0IHR5cGUgeyBMYXN0RGVwbG95ZWRDb21taXQgfSBmcm9tICcuL3JlcG9ydGluZy9sYXN0LWRlcGxveS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZU5lZWRzQXR0ZW50aW9uLCB0aHJlc2hvbGRzRnJvbSwgdHlwZSBBdHRlbnRpb25SdWxlSWQgfSBmcm9tICcuL3JlcG9ydGluZy9uZWVkcy1hdHRlbnRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0UGx1Z2luUnVudGltZSBhcyBwbHVnaW5SdW50aW1lLFxuICBnZXRQbHVnaW5SdW50aW1lQWdncmVnYXRlIGFzIHBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUsXG4gIGhhc1ZlcmlmaWVkUGx1Z2luVXNlIGFzIHZlcmlmaWVkUGx1Z2luVXNlLFxufSBmcm9tICcuL3JlcG9ydGluZy9wbHVnaW4tcnVudGltZS5qcyc7XG5pbXBvcnQgeyByZXBvcnQgfSBmcm9tICcuL3JlcG9ydGluZy9xdWVyeS1zY29wZS5qcyc7XG5pbXBvcnQgeyBwdXJnZUV4cGlyZWRSZXBvcnRpbmdEYXRhIGFzIHB1cmdlUmVwb3J0aW5nUmV0ZW50aW9uIH0gZnJvbSAnLi9yZXBvcnRpbmcvcmV0ZW50aW9uLXN3ZWVwLmpzJztcbmltcG9ydCB7IFJFUE9SVElOR19FVkVOVF9SRVRFTlRJT05fREFZUywgUkVQT1JUSU5HX0RPUkFfUkVURU5USU9OX0RBWVMgfSBmcm9tICcuL3JlcG9ydGluZy9yZXRlbnRpb24uanMnO1xuaW1wb3J0IHsgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwsIGJ1Y2tldEtleSwgcGVyaW9kQnVja2V0LCBzY3J1Yk9wdGlvbmFsLCBvcHRpb25hbFN0YXJ0ZWRBdFJhbmdlLCBzdGFydGVkQXRXaW5kb3cgfSBmcm9tICcuL3JlcG9ydGluZy9zcWwtaGVscGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4ZWN1dGlvbkNvdW50LCBUaW1lU2VyaWVzRW50cnksIER1cmF0aW9uU3RhdHMsIFBpcGVsaW5lRXhlY3V0aW9uLCBTdGFnZUZhaWx1cmUsIFN0YWdlQm90dGxlbmVjayxcbiAgQWN0aW9uRmFpbHVyZSwgRXJyb3JFbnRyeSwgUGx1Z2luU3VtbWFyeSwgVHlwZUNvbXB1dGVEaXN0cmlidXRpb24sIFZlcnNpb25Db3VudCxcbiAgQnVpbGRUaW1lU2VyaWVzRW50cnksIEJ1aWxkRHVyYXRpb24sIEJ1aWxkRmFpbHVyZSxcbiAgUGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSwgUGx1Z2luUnVudGltZUZpbHRlciwgUGx1Z2luUnVudGltZVN0YXRzLFxuICBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zLCBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsXG4gIERvcmFPcHRpb25zLCBSZXBvcnRpbmdTZXR0aW5ncywgUmVwb3J0aW5nU2V0dGluZ3NQYXRjaCwgSW5jaWRlbnRMaXN0SXRlbSwgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICBEb3JhTWV0cmljcywgRG9yYVRyZW5kUG9pbnQsIEJ1aWxkSGVhbHRoLCBJbmNpZGVudElucHV0LCBJbmNpZGVudFdyaXRlLCBEZXBsb3ltZW50T3V0Y29tZVdyaXRlLFxuICBJbmdlc3RDYWxsZXIsIEluZ2VzdEV2ZW50LCBJbmdlc3RNZXRyaWMsIEluZ2VzdFJlc3VsdCwgSW5nZXN0SGVhbHRoU3RhdHVzLFxuICBCdWNrZXRPcHRpb25zLFxufSBmcm9tICcuL3JlcG9ydGluZy90eXBlcy5qcyc7XG5cbi8vIFRoZSByZXBvcnRpbmcgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgcGFja2FnZSBBUEkuIEVudW1lcmF0ZWQgcmF0aGVyIHRoYW5cbi8vIGBleHBvcnQgKmAgYmVjYXVzZSB0aGUgcmVwb3J0aW5nIG1vZHVsZXMgYWxzbyBleHBvcnQgaW50ZXJuYWxzIChvcmdTY29wZSxcbi8vIHJ1blJlcG9ydCwgdGhlIGNhY2hlcywgdGhlIERPUkEgcm93IHNoYXBlcykgdGhhdCBtdXN0IHN0YXkgcHJpdmF0ZS5cbmV4cG9ydCB0eXBlIHsgTGFzdERlcGxveWVkQ29tbWl0IH0gZnJvbSAnLi9yZXBvcnRpbmcvbGFzdC1kZXBsb3kuanMnO1xuZXhwb3J0IHR5cGUge1xuICBCdWNrZXRPcHRpb25zLFxuICBCdWlsZEhlYWx0aCwgQnVpbGRIZWFsdGhTdGFnZSwgRG9yYUVudk1ldHJpY3MsIERvcmFMZXZlbCwgRG9yYU1ldHJpY3MsIERvcmFPcHRpb25zLCBEb3JhVHJlbmRQb2ludCxcbiAgRGVwbG95bWVudE91dGNvbWVXcml0ZSwgSW5jaWRlbnRJbnB1dCwgSW5jaWRlbnRMaXN0SXRlbSwgSW5jaWRlbnRTdGF0ZSwgSW5jaWRlbnRXcml0ZSwgUmVwb3J0aW5nU2V0dGluZ3MsIEluY2lkZW50VGVzdFJlc3VsdCxcbiAgSW5nZXN0Q2FsbGVyLCBJbmdlc3RFdmVudCwgSW5nZXN0SGVhbHRoU3RhdHVzLCBJbmdlc3RNZXRyaWMsIEluZ2VzdFJlc3VsdCxcbiAgUGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSwgUGx1Z2luUnVudGltZUZpbHRlciwgUGx1Z2luUnVudGltZVN0YXRzLFxuICBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMsIFJlcG9ydGluZ1JldGVudGlvblNldHRpbmdzLFxuICBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLFxufSBmcm9tICcuL3JlcG9ydGluZy90eXBlcy5qcyc7XG5cblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgaW52YWxpZGF0ZU9yZ1JlcG9ydHMob3JnSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogU2VlIC4vcmVwb3J0aW5nL2luZ2VzdC50cyDigJQgdGhlIGNhbGxlciBtdXN0IGFscmVhZHkgaG9sZCBhIHN5c2FkbWluXG4gICAqIHRlbmFudCBzY29wZSwgYmVjYXVzZSBhIGJhdGNoIHNwYW5zIHdoYXRldmVyIG9yZ3MgdGhlIHJlZ2lzdHJ5IHJlc29sdmVzIHRvLlxuICAgKi9cbiAgYXN5bmMgaW5nZXN0RXZlbnRzKGV2ZW50czogSW5nZXN0RXZlbnRbXSwgb25NZXRyaWM/OiAobTogSW5nZXN0TWV0cmljKSA9PiB2b2lkLCBjYWxsZXI/OiBJbmdlc3RDYWxsZXIpOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIHJldHVybiBpbmdlc3QoZXZlbnRzLCBvbk1ldHJpYywgY2FsbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IHNoYSBvZiB0aGlzIHBpcGVsaW5lJ3MgbGFzdCBzdWNjZXNzZnVsIGRlcGxveSDigJQgdG8gYGVudmlyb25tZW50YFxuICAgKiB3aGVuIGdpdmVuLCB0byBhbnl3aGVyZSBvdGhlcndpc2UuIFRoZSBleGNsdXNpdmUgbG93ZXIgYm91bmQgZm9yIFwiY29tbWl0c1xuICAgKiBzaW5jZSB0aGUgbGFzdCBkZXBsb3lcIi4gVGVuYW5jeSBpcyBlbmZvcmNlZCBmcm9tIGBjYWxsZXJgIGV4YWN0bHkgYXNcbiAgICoge0BsaW5rIGluZ2VzdEV2ZW50c30gZG9lcyBpdC5cbiAgICovXG4gIGFzeW5jIGdldExhc3REZXBsb3llZENvbW1pdChwaXBlbGluZUlkOiBzdHJpbmcsIGVudmlyb25tZW50Pzogc3RyaW5nLCBjYWxsZXI/OiBJbmdlc3RDYWxsZXIpOiBQcm9taXNlPExhc3REZXBsb3llZENvbW1pdD4ge1xuICAgIHJldHVybiBsYXN0RGVwbG95ZWRDb21taXQocGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGNhbGxlcik7XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgMTogUGlwZWxpbmUgRXhlY3V0aW9uICYgUGVyZm9ybWFuY2Ug4pSA4pSAXG5cblxuICAvKiogRXhlY3V0aW9uIGNvdW50IHBlciBwaXBlbGluZSB3aXRoIHN0YXR1cyBicmVha2Rvd24uICovXG4gIGFzeW5jIGdldEV4ZWN1dGlvbkNvdW50KG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSk6IFByb21pc2U8RXhlY3V0aW9uQ291bnRbXT4ge1xuICAgIC8vIE9wdGlvbmFsIFtmcm9tLHRvXSB3aW5kb3cgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQsIG1pcnJvcmluZyB0aGVcbiAgICAvLyBzaWJsaW5nIHRpbWVzZXJpZXMgcmVwb3J0cyBzbyB0aGUgZGFzaGJvYXJkIGRhdGUtcmFuZ2UgcGlja2VyIG5hcnJvd3MgdGhlXG4gICAgLy8gY291bnQgdG9vIChhbiBlbXB0eSByYW5nZSA9IGFsbC10aW1lLCBwcmVzZXJ2aW5nIHRoZSBwcmlvciBiZWhhdmlvcikuIFRoZVxuICAgIC8vIHJhbmdlIHJpZGVzIHRoZSBKT0lOIHNvIHBpcGVsaW5lcyB3aXRoIG5vIGluLXdpbmRvdyBldmVudHMgc3RpbGwgbGlzdFxuICAgIC8vIChMRUZUIHNlbWFudGljcyBwcmVzZXJ2ZWQgdmlhIHRoZSBpbm5lci1qb2luIGZpbHRlciDigJQgYSBwaXBlbGluZSB3aXRoIHplcm9cbiAgICAvLyBtYXRjaGluZyBldmVudHMgZHJvcHMgZnJvbSB0aGUgY291bnQsIHNhbWUgYXMgYmVmb3JlIGZvciBpdHMgd2luZG93KS5cbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UocmFuZ2UpO1xuICAgIHJldHVybiByZXBvcnQ8RXhlY3V0aW9uQ291bnQ+KGBleGVjLWNvdW50OiR7cmFuZ2U/LmZyb20gPz8gJyd9OiR7cmFuZ2U/LnRvID8/ICcnfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5vcmdhbml6YXRpb24sIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBmaXJzdF9leGVjdXRpb24sXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9leGVjdXRpb25cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZX0gcFxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGUgT04gZS5waXBlbGluZV9pZCA9IHAuaWRcbiAgICAgICAgICBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgIT0gJ1NUQVJURUQnXG4gICAgICAgICAgJHtyYW5nZUNsYXVzZX1cbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgcC5pc19hY3RpdmUgPSB0cnVlXG4gICAgICAgIEdST1VQIEJZIHAuaWRcbiAgICAgICAgT1JERVIgQlkgdG90YWwgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLXBpcGVsaW5lIGV4ZWN1dGlvbiBoaXN0b3J5IOKAlCBESVNUSU5DVCBleGVjdXRpb25zIGZvciBvbmUgcGlwZWxpbmUsXG4gICAqIG5ld2VzdCBmaXJzdC4gR3JvdXBzIGFsbCBldmVudHMgYnkgYGV4ZWN1dGlvbl9pZGAgaW4gYSBzaW5nbGUgc2NhbiBhbmRcbiAgICogcm9sbHMgZWFjaCBleGVjdXRpb24gdXAgdG8gb25lIHJvdzpcbiAgICogICAtIHN0YXR1czogZGVyaXZlZCBmcm9tIHRoZSBQSVBFTElORS10eXBlIGV2ZW50cy4gRkFJTEVEIHdpbnMsIHRoZW5cbiAgICogICAgIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRDsgYW4gZXhlY3V0aW9uIHdpdGggbm8gdGVybWluYWwgUElQRUxJTkUgZXZlbnRcbiAgICogICAgIGlzIHN0aWxsIGBpbi1wcm9ncmVzc2AuXG4gICAqICAgLSBzdGFydGVkQXQvZW5kZWRBdC9kdXJhdGlvbk1zOiBmcm9tIHRoZSBQSVBFTElORSBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKiAgIC0gZmFpbGluZ1N0YWdlL2ZhaWxpbmdBY3Rpb246IHRoZSBmaXJzdCBGQUlMRUQgU1RBR0UvQUNUSU9OIGV2ZW50IChjaGVhcCDigJRcbiAgICogICAgIHNhbWUgc2Nhbiwgbm8gZXh0cmEgcXVlcnkpLlxuICAgKlxuICAgKiBPUkctU0NPUElORzogaWRlbnRpY2FsIHRvIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzIOKAlCBqb2lucyB0aGUgcGlwZWxpbmVcbiAgICogcmVnaXN0cnkgdGFibGUgKGBwaXBlbGluZWApIGFuZCBnYXRlcyBvbiBgcC5vcmdfaWQgJHtwcmVkfWAsIHdoZXJlIGBwcmVkYCBpc1xuICAgKiB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYCBvciAod2l0aCBhIHJvbGx1cCkgYW4gYElOICguLi4pYCBvdmVyIHRoZSBvcmfihpJ0ZWFtXG4gICAqIHN1YnRyZWUuIEEgcGlwZWxpbmVJZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBvcmcgeWllbGRzIHplcm8gcm93cy5cbiAgICovXG4gIGFzeW5jIGxpc3RQaXBlbGluZUV4ZWN1dGlvbnMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0sXG4gICAgbGltaXQ6IG51bWJlciA9IDUwLFxuICApOiBQcm9taXNlPFBpcGVsaW5lRXhlY3V0aW9uW10+IHtcbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UocmFuZ2UpO1xuICAgIHJldHVybiByZXBvcnQ8UGlwZWxpbmVFeGVjdXRpb24+KGBwaXBlbGluZS1leGVjdXRpb25zOiR7cGlwZWxpbmVJZH06JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9OiR7bGltaXR9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5leGVjdXRpb25faWQsXG4gICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ2ZhaWxlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKSBUSEVOICdzdWNjZWVkZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKSBUSEVOICdjYW5jZWxlZCdcbiAgICAgICAgICAgIEVMU0UgJ2luLXByb2dyZXNzJ1xuICAgICAgICAgIEVORCBBUyBzdGF0dXMsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBzdGFydGVkX2F0LFxuICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBlbmRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6aW50IEFTIGR1cmF0aW9uX21zLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5zdGFnZV9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX3N0YWdlLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5hY3Rpb25fbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfYWN0aW9uLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5kZXRhaWwtPidmYWlsdXJlJykgRklMVEVSIChXSEVSRSBlLmRldGFpbCA/ICdmYWlsdXJlJykpWzFdIEFTIGZhaWx1cmVcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH0gQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtyYW5nZUNsYXVzZX1cbiAgICAgICAgR1JPVVAgQlkgZS5leGVjdXRpb25faWRcbiAgICAgICAgT1JERVIgQlkgTUFYKGUuY3JlYXRlZF9hdCkgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvKiogU3VjY2VzcyByYXRlIG92ZXIgdGltZSBmb3IgYW4gb3JnLiAqL1xuICBhc3luYyBnZXRTdWNjZXNzUmF0ZShcbiAgICBvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIGJ1Y2tldDogQnVja2V0T3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgdHogPSAnVVRDJywgd2Vla1N0YXJ0ID0gJ21vbmRheScgfSA9IGJ1Y2tldDtcbiAgICAvLyBUaGUgYnVja2V0aW5nIHNldHRpbmdzIGFyZSBwYXJ0IG9mIHRoZSBjYWNoZSBLRVk6IHdpdGhvdXQgdGhlbSBhIENoaWNhZ29cbiAgICAvLyByZXF1ZXN0IGFuZCBhIFVUQyByZXF1ZXN0IHNoYXJlIGFuIGVudHJ5IGFuZCBvbmUgb2YgdGhlbSBnZXRzIHRoZSBvdGhlcidzIHdlZWtzLlxuICAgIHJldHVybiByZXBvcnQ8VGltZVNlcmllc0VudHJ5Pihgc3VjY2Vzcy1yYXRlOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtidWNrZXRLZXkodHosIHdlZWtTdGFydCl9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtwZXJpb2RCdWNrZXQoaW50ZXJ2YWwsIHNxbGBlLnN0YXJ0ZWRfYXRgLCB0eiwgd2Vla1N0YXJ0KX06OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcpXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCk7XG4gIH1cblxuICAvKiogQXZlcmFnZSBkdXJhdGlvbiBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldEF2ZXJhZ2VEdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxEdXJhdGlvblN0YXRzW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PER1cmF0aW9uU3RhdHM+KGBhdmctZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNSU4oZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtaW5fbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk1KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGUuZHVyYXRpb25fbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZXhlY3V0aW9uc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogU3RhZ2UgZmFpbHVyZSBoZWF0bWFwIOKAlCB3aGljaCBzdGFnZXMgZmFpbCBtb3N0LiAqL1xuICBhc3luYyBnZXRTdGFnZUZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFN0YWdlRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxTdGFnZUZhaWx1cmU+KGBzdGFnZS1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5jdCBkZXBsb3kgYGVudmlyb25tZW50YCB2YWx1ZXMgb2JzZXJ2ZWQgaW4gdGhlIHdpbmRvdyDigJQgcG93ZXJzIHRoZVxuICAgKiBET1JBIGVudmlyb25tZW50LXNjb3BlIGRhdGFsaXN0LiBPcmctc2NvcGVkICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmdcbiAgICogcmVwb3J0czsgb25seSBub24tbnVsbCBlbnZpcm9ubWVudHMgKGkuZS4gZGVwbG95LWF0dHJpYnV0ZWQgZXhlY3V0aW9ucykuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRFbnZpcm9ubWVudHMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcmVwb3J0PHsgZW52aXJvbm1lbnQ6IHN0cmluZyB9PihgcmVwb3J0LWVudnM6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVCBESVNUSU5DVCBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBPUkRFUiBCWSBlbnZpcm9ubWVudFxuICAgICAgYCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5lbnZpcm9ubWVudCk7XG4gIH1cblxuICAvKiogU3RhZ2UgYm90dGxlbmVja3Mg4oCUIHNsb3dlc3Qgc3RhZ2VzIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VCb3R0bGVuZWNrcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxTdGFnZUJvdHRsZW5lY2tbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8U3RhZ2VCb3R0bGVuZWNrPihgc3RhZ2UtYm90dGxlbmVja3M6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucGlwZWxpbmVfbmFtZSwgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHAuaWQsIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogQWN0aW9uIGZhaWx1cmUgcmF0ZSDigJQgd2hpY2ggcGx1Z2luIHN0ZXBzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0QWN0aW9uRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxBY3Rpb25GYWlsdXJlPihgYWN0aW9uLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgZS5hY3Rpb25fbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFcnJvciBjYXRlZ29yaXphdGlvbiDigJQgZ3JvdXAgZmFpbHVyZSBtZXNzYWdlcy4gRXhlY3V0aW9uIHJlcG9ydCwgc29cbiAgICogcm9sbHVwLWF3YXJlIGV4YWN0bHkgbGlrZSB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0czogd2l0aCBgb3JnSWRzYFxuICAgKiAodGhlIG9yZ+KGknRlYW0gc3VidHJlZSkgdGhlIG9yZyBnYXRlIGJlY29tZXMgYW4gYElOICguLi4pYCBhbmQgdGhlIHJlYWQgcnVuc1xuICAgKiBmcmVzaCB1bmRlciBzeXNhZG1pbiB2aWEgYHJ1blJlcG9ydGA7IHNpbmdsZS1vcmcgcmVhZHMga2VlcCB0aGUgcGVyLW9yZyBjYWNoZS5cbiAgICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEVycm9yRW50cnlbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8RXJyb3JFbnRyeT4oYGVycm9yczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgU1VCU1RSSU5HKGUuZXJyb3JfbWVzc2FnZSBGUk9NIDEgRk9SIDIwMCkgQVMgZXJyb3JfcGF0dGVybixcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgQVMgYWZmZWN0ZWRfcGlwZWxpbmVzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnIEFORCBlLmVycm9yX21lc3NhZ2UgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3VyIERPUkEgbWVhc3VyZXMgcGx1cyB0aGVpciBwZXItZW52aXJvbm1lbnQgYnJlYWtkb3duLlxuICAgKiBJbXBsZW1lbnRhdGlvbiBpbiAuL3JlcG9ydGluZy9kb3JhLnRzIOKAlCBzZWUgdGhhdCBmaWxlJ3MgaGVhZGVyIGZvciB3aHkuXG4gICAqL1xuICBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gICAgcmV0dXJuIGRvcmFNZXRyaWNzKG9yZ0lkLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBET1JBIG1lYXN1cmVzIGJ1Y2tldGVkIG92ZXIgdGltZS4gKi9cbiAgZ2V0RG9yYVRyZW5kKFxuICAgIG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIHJldHVybiBkb3JhVHJlbmQob3JnSWQsIGludGVydmFsLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBQZXItcGlwZWxpbmUgYnVpbGQgaGVhbHRoIChzdGFnZSBwYXNzIHJhdGVzIG92ZXIgYSB3aW5kb3cpLiAqL1xuICBnZXRCdWlsZEhlYWx0aChcbiAgICBvcmdJZDogc3RyaW5nLCBwaXBlbGluZUlkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sXG4gICk6IFByb21pc2U8QnVpbGRIZWFsdGg+IHtcbiAgICByZXR1cm4gYnVpbGRIZWFsdGgob3JnSWQsIHBpcGVsaW5lSWQsIGZyb20sIHRvLCBvcmdJZHMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UGx1Z2luU3VtbWFyeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5TdW1tYXJ5PiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tc3VtbWFyeWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgTk9UICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgaW5hY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHVibGljJyk6OmludCBBUyBwdWJsaWMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAnb3JnJyk6OmludCBBUyBvcmcsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIG9yZzogMCwgcHJpdmF0ZTogMCwgdW5pcXVlTmFtZXM6IDAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVHlwZSAmIGNvbXB1dGUgZGlzdHJpYnV0aW9uLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIHBlci1vcmcgKHNlZVxuICAgKiAgZ2V0UGx1Z2luU3VtbWFyeSkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luRGlzdHJpYnV0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uW10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1kaXN0cmlidXRpb25gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSBBUyBwbHVnaW5fdHlwZSxcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9IEFTIGNvbXB1dGVfdHlwZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGNvdW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSwgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfVxuICAgICAgICBPUkRFUiBCWSBjb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VHlwZUNvbXB1dGVEaXN0cmlidXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgLS0gSGlnaGVzdCB2ZXJzaW9uIGJ5IE5VTUVSSUMgc2VtdmVyIGNvcmUgKG5vdCBsZXhpY2FsOiAnMTAuMC4wJyA+ICc5LjAuMCcpLlxuICAgICAgICAgIC0tIFN0cmlwIGFueSAtcHJlcmVsZWFzZS8rYnVpbGQgc3VmZml4IGJlZm9yZSB0aGUgaW50W10gY2FzdCBzbyBpdCBjYW4ndFxuICAgICAgICAgIC0tIGVycm9yIG9uIHZhbGlkIHNlbXZlcjsga2VlcCB0aGUgb3JpZ2luYWwgc3RyaW5nIGZvciBkaXNwbGF5LlxuICAgICAgICAgIC0tIEdVQVJEOiBhIG5vbi1udW1lcmljLWRvdHRlZCB2ZXJzaW9uICgnbGF0ZXN0JywgJycsICd2MScpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAgICAgLS0gOjppbnRbXSBjYXN0IHRocm93IGFuZCBibG93IHVwIHRoZSBXSE9MRSBvcmcgc3VtbWFyeS4gT25seSBjYXN0IHJvd3NcbiAgICAgICAgICAtLSB3aG9zZSBzdHJpcHBlZCBjb3JlIG1hdGNoZXMgYSBudW1lcmljLWRvdHRlZCBzaGFwZTsgc29ydCBldmVyeXRoaW5nXG4gICAgICAgICAgLS0gZWxzZSB0byB0aGUgYm90dG9tIHZpYSBhIHNlbnRpbmVsIEFSUkFZWy0xXSBzbyB0aGUgcm93IHN0aWxsIGNvdW50cy5cbiAgICAgICAgICAoYXJyYXlfYWdnKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufVxuICAgICAgICAgICAgIE9SREVSIEJZIENBU0VcbiAgICAgICAgICAgICAgIFdIRU4gcmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSB+ICdeWzAtOV0rKFsuXVswLTldKykqJCdcbiAgICAgICAgICAgICAgICAgVEhFTiBzdHJpbmdfdG9fYXJyYXkocmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSwgJy4nKTo6aW50W11cbiAgICAgICAgICAgICAgIEVMU0UgQVJSQVlbLTFdXG4gICAgICAgICAgICAgRU5EIERFU0NcbiAgICAgICAgICApKVsxXSBBUyBsYXRlc3RfdmVyc2lvbixcbiAgICAgICAgICBib29sX29yKCR7c2NoZW1hLnBsdWdpbi5pc0RlZmF1bHR9KSBBUyBoYXNfZGVmYXVsdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ubmFtZX1cbiAgICAgICAgT1JERVIgQlkgdmVyc2lvbl9jb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VmVyc2lvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUoXG4gICAgb3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICBidWNrZXQ6IEJ1Y2tldE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxCdWlsZFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgdHogPSAnVVRDJywgd2Vla1N0YXJ0ID0gJ21vbmRheScgfSA9IGJ1Y2tldDtcbiAgICAvLyBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBleGVjdXRpb24gcmVwb3J0cy4gVGhlc2VcbiAgICAvLyByb3dzIGFyZSBnYXRlZCBvbiB0aGUgcGlwZWxpbmVfZXZlbnQgYG9yZ19pZGAgZGlyZWN0bHkgKG5vIHBpcGVsaW5lIGpvaW4pLFxuICAgIC8vIHNvIGBwcmVkYCBhcHBsaWVzIHRvIGBlLm9yZ19pZGAuXG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oYGJ1aWxkLXN1Y2Nlc3M6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke2J1Y2tldEtleSh0eiwgd2Vla1N0YXJ0KX1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3BlcmlvZEJ1Y2tldChpbnRlcnZhbCwgc3FsYGUuc3RhcnRlZF9hdGAsIHR6LCB3ZWVrU3RhcnQpfTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2ZhaWxlZCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnY29tcGxldGVkJywgJ2ZhaWxlZCcpXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCk7XG4gIH1cblxuICAvKiogQnVpbGQgZHVyYXRpb24gcGVyIHBsdWdpbi4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGREdXJhdGlvbltdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZER1cmF0aW9uPihgYnVpbGQtZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBidWlsZHNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogQnVpbGQgZmFpbHVyZXMg4oCUIHRvcCBlcnJvciBtZXNzYWdlcy4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8QnVpbGRGYWlsdXJlPihgYnVpbGQtZmFpbHVyZXM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIGUuZXJyb3JfbWVzc2FnZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lLCBlLmVycm9yX21lc3NhZ2VcbiAgICAgICAgT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvLyDilIDilIAgUGx1Z2luIHJ1bnRpbWUgdGVsZW1ldHJ5IOKAlCBzZWUgLi9yZXBvcnRpbmcvcGx1Z2luLXJ1bnRpbWUudHMg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFBsdWdpbiBydW50aW1lOiBwZXIgcGx1Z2luIHZlcnNpb24gcnVucywgc3VjY2VzcyByYXRlIGFuZCBwNTAvcDk1XG4gICAqIGR1cmF0aW9uIG92ZXIgYFtmcm9tLCB0b11gLCBmcm9tIHRoZSBtYW5pZmVzdC1hdHRyaWJ1dGVkIEFDVElPTiBldmVudHMuXG4gICAqIFJvbGx1cC1hd2FyZS5cbiAgICovXG4gIGFzeW5jIGdldFBsdWdpblJ1bnRpbWUob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBmaWx0ZXI/OiBQbHVnaW5SdW50aW1lRmlsdGVyLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luUnVudGltZVN0YXRzW10+IHtcbiAgICByZXR1cm4gcGx1Z2luUnVudGltZShvcmdJZCwgZnJvbSwgdG8sIGZpbHRlciwgb3JnSWRzKTtcbiAgfVxuXG4gIC8qKiBDcm9zcy1vcmcgMzAtZGF5IHJ1bnRpbWUgYWdncmVnYXRlIGZvciBhIGAocHVibGlzaGVyLCBuYW1lKWAgbGlzdGluZyAocGx1Z2luX3N0YXRzIGlucHV0KS4gU2VydmljZSBjYWxsZXJzIG9ubHkuICovXG4gIGFzeW5jIGdldFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUocHVibGlzaGVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luUnVudGltZUFnZ3JlZ2F0ZT4ge1xuICAgIHJldHVybiBwbHVnaW5SdW50aW1lQWdncmVnYXRlKHB1Ymxpc2hlciwgbmFtZSk7XG4gIH1cblxuICAvKiogUmV2aWV3IFwidmVyaWZpZWQgdXNlXCI6IGBvcmdJZGAgcmFuIGAocHVibGlzaGVyLCBuYW1lKWAgc3VjY2Vzc2Z1bGx5IHdpdGhpbiA5MCBkYXlzLiBTZXJ2aWNlIGNhbGxlcnMgb25seS4gKi9cbiAgYXN5bmMgaGFzVmVyaWZpZWRQbHVnaW5Vc2Uob3JnSWQ6IHN0cmluZywgcHVibGlzaGVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZmllZFBsdWdpblVzZShvcmdJZCwgcHVibGlzaGVyLCBuYW1lKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAzOiBET1JBIHdyaXRlIHBhdGhzIChwb3N0LWRlcGxveSBvdXRjb21lcyArIGluZ2VzdCBoZWFsdGgpIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBtYW51YWwgcG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXI6IGEgdXNlciBtYXJrcyBhXG4gICAqIGRlcGxveW1lbnQgYGZhaWxlZGAgKGEgcHJvZHVjdGlvbiBpbmNpZGVudCBsaW5rZWQgdG8gdGhlIGRlcGxveSkgb3JcbiAgICogYHJlc3RvcmVkYCAocmVjb3ZlcmVkKS4gSWRlbXBvdGVudCDigJQga2V5ZWQgb24gKGV4ZWN1dGlvbl9pZCwgb3V0Y29tZSkgc28gYVxuICAgKiBkdXBsaWNhdGUgUE9TVCByZWZyZXNoZXMgYGF0YCByYXRoZXIgdGhhbiBkb3VibGUtY291bnRpbmcsIHdoaWxlIGFcbiAgICogZmFpbGVk4oaScmVzdG9yZWQgcGFpciBzdGF5cyB0d28gcm93cy4gRmVlZHMgdGhlIHBvc3QtZGVwbG95IENGUiBjb21wb25lbnQgYW5kXG4gICAqIHRoZSByZWFsIE1UVFIuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSykuXG4gICAqL1xuICBhc3luYyByZWNvcmREZXBsb3ltZW50T3V0Y29tZShcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHsgb3V0Y29tZTogJ2ZhaWxlZCcgfCAncmVzdG9yZWQnOyBhdDogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPERlcGxveW1lbnRPdXRjb21lV3JpdGU+IHtcbiAgICAvLyBUaGUgcHJpb3IgbWFya2VyIChpZiBhbnkpIGlzIHJlYWQgaW4gdGhlIFNBTUUgdHggYXMgdGhlIHVwc2VydCBzbyB0aGVcbiAgICAvLyBjYWxsZXIncyBhdWRpdCByb3cgY2FuIGNhcnJ5IGJlZm9yZS9hZnRlcjogYSByZS1QT1NUIHRoYXQgbW92ZXMgYGF0YFxuICAgIC8vIHJld3JpdGVzIHdoZW4gdGhlIG9yZydzIENGUi9NVFRSIGNsb2NrIHN0YXJ0ZWQsIGFuZCBcImZyb20gd2hhdFwiIGlzIHRoZVxuICAgIC8vIGhhbGYgYSByZXZpZXdlciBjYW5ub3QgcmVjb25zdHJ1Y3QgYWZ0ZXJ3YXJkcy5cbiAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgICAgY29uc3QgW3ByaW9yXSA9IGF3YWl0IHR4XG4gICAgICAgICAgLnNlbGVjdCh7IGF0OiBzY2hlbWEuZGVwbG95bWVudE91dGNvbWUuYXQsIGVudmlyb25tZW50OiBzY2hlbWEuZGVwbG95bWVudE91dGNvbWUuZW52aXJvbm1lbnQgfSlcbiAgICAgICAgICAuZnJvbShzY2hlbWEuZGVwbG95bWVudE91dGNvbWUpXG4gICAgICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEuZGVwbG95bWVudE91dGNvbWUuZXhlY3V0aW9uSWQsIGV4ZWN1dGlvbklkKSwgZXEoc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLm91dGNvbWUsIGlucHV0Lm91dGNvbWUpKSlcbiAgICAgICAgICAubGltaXQoMSk7XG4gICAgICAgIGF3YWl0IHR4Lmluc2VydChzY2hlbWEuZGVwbG95bWVudE91dGNvbWUpLnZhbHVlcyh7XG4gICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgb3JnSWQsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHNjcnViT3B0aW9uYWwoaW5wdXQuZW52aXJvbm1lbnQpLFxuICAgICAgICAgIG91dGNvbWU6IGlucHV0Lm91dGNvbWUsXG4gICAgICAgICAgYXQ6IG5ldyBEYXRlKGlucHV0LmF0KSxcbiAgICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgICB0YXJnZXQ6IFtzY2hlbWEuZGVwbG95bWVudE91dGNvbWUuZXhlY3V0aW9uSWQsIHNjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5vdXRjb21lXSxcbiAgICAgICAgICBzZXQ6IHtcbiAgICAgICAgICAgIGF0OiBuZXcgRGF0ZShpbnB1dC5hdCksXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogc2NydWJPcHRpb25hbChpbnB1dC5lbnZpcm9ubWVudCkgPz8gbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHByaW9yID8geyBhdDogaXNvT3JOdWxsKHByaW9yLmF0KSwgZW52aXJvbm1lbnQ6IHByaW9yLmVudmlyb25tZW50ID8/IG51bGwgfSA6IG51bGw7XG4gICAgICB9KSxcbiAgICApO1xuICAgIC8vIE91dGNvbWUgY2hhbmdlcyB0aGUgRE9SQSBhZ2dyZWdhdGUg4oCUIGRyb3AgdGhlIG9yZydzIGNhY2hlZCByZXBvcnRzLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZU9yZyhvcmdJZCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHByZXZpb3VzIH07XG4gIH1cblxuICAvKipcbiAgICogSW5nZXN0IGEgcHJvZHVjdGlvbiBpbmNpZGVudCBmcm9tIHRoZSBvcmcncyBpbmNpZGVudCB0b29saW5nXG4gICAqIChQYWdlckR1dHkgLyBEYXRhZG9nIC8gQWxlcnRtYW5hZ2VyIHdlYmhvb2spLiBJZGVtcG90ZW50IOKAlCBrZXllZCBvblxuICAgKiAob3JnX2lkLCBpbmNpZGVudF9pZCkgc28gYSBsYXRlciByZXNvbHZlIHJlLXBvc3QgdXBzZXJ0cyBgcmVzb2x2ZWRfYXRgXG4gICAqIChhbmQgcmVmcmVzaGVzIHRoZSBvdGhlciBtdXRhYmxlIGZpZWxkcykgaW5zdGVhZCBvZiBpbnNlcnRpbmcgYSBkdXBsaWNhdGUuXG4gICAqIERPUkEgY29ycmVsYXRlcyBlYWNoIGluY2lkZW50IHRvIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBpdHNcbiAgICogYGVudmlyb25tZW50YCwgcHJvZHVjaW5nIGFuIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlICsgYSByZWFsIE1UVFIuXG4gICAqIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSyk7IGZyZWUtZm9ybSBmaWVsZHMgYXJlXG4gICAqIEFXUy1pZCBzY3J1YmJlZCBhdCB0aGlzIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGxpa2UgdGhlIG90aGVyIGluZ2VzdCBwYXRocy5cbiAgICovXG4gIGFzeW5jIHJlY29yZEluY2lkZW50KG9yZ0lkOiBzdHJpbmcsIGlucHV0OiBJbmNpZGVudElucHV0KTogUHJvbWlzZTxJbmNpZGVudFdyaXRlPiB7XG4gICAgY29uc3QgaW5jaWRlbnRJZCA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGlucHV0LmluY2lkZW50SWQpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IHNldmVyaXR5ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuc2V2ZXJpdHkpO1xuICAgIGNvbnN0IG9wZW5lZEF0ID0gbmV3IERhdGUoaW5wdXQub3BlbmVkQXQpO1xuICAgIGNvbnN0IHJlc29sdmVkQXQgPSBpbnB1dC5yZXNvbHZlZEF0ID8gbmV3IERhdGUoaW5wdXQucmVzb2x2ZWRBdCkgOiBudWxsO1xuICAgIGNvbnN0IHsgcHJldmlvdXMsIHN0b3JlZCB9ID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgICAvLyBSZWFkIHRoZSBwcmlvciByb3cgaW4gdGhlIHNhbWUgdHggc28gdGhlIGNhbGxlciBjYW4gdGVsbCBhIE5FVyBvclxuICAgICAgICAvLyBDSEFOR0VEIGluY2lkZW50IGZyb20gYSBzZW5kZXIncyByZXBlYXQtaW50ZXJ2YWwgcmUtcG9zdCBvZiB0aGUgc2FtZVxuICAgICAgICAvLyBmaXJpbmcgYWxlcnQgKHdoaWNoIGNoYW5nZXMgbm90aGluZyBhbmQgaXMgbm90IHdvcnRoIGFuIGF1ZGl0IHJvdykuXG4gICAgICAgIGNvbnN0IFtwcmlvcl0gPSBhd2FpdCB0eFxuICAgICAgICAgIC5zZWxlY3Qoe1xuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHNjaGVtYS5pbmNpZGVudC5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgIG9wZW5lZEF0OiBzY2hlbWEuaW5jaWRlbnQub3BlbmVkQXQsXG4gICAgICAgICAgICByZXNvbHZlZEF0OiBzY2hlbWEuaW5jaWRlbnQucmVzb2x2ZWRBdCxcbiAgICAgICAgICAgIHNldmVyaXR5OiBzY2hlbWEuaW5jaWRlbnQuc2V2ZXJpdHksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZnJvbShzY2hlbWEuaW5jaWRlbnQpXG4gICAgICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEuaW5jaWRlbnQub3JnSWQsIG9yZ0lkKSwgZXEoc2NoZW1hLmluY2lkZW50LmluY2lkZW50SWQsIGluY2lkZW50SWQpKSlcbiAgICAgICAgICAubGltaXQoMSk7XG4gICAgICAgIGNvbnN0IFtyb3ddID0gYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5pbmNpZGVudCkudmFsdWVzKHtcbiAgICAgICAgICBpbmNpZGVudElkLFxuICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgIG9wZW5lZEF0LFxuICAgICAgICAgIHJlc29sdmVkQXQsXG4gICAgICAgICAgc2V2ZXJpdHksXG4gICAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgICAgdGFyZ2V0OiBbc2NoZW1hLmluY2lkZW50Lm9yZ0lkLCBzY2hlbWEuaW5jaWRlbnQuaW5jaWRlbnRJZF0sXG4gICAgICAgICAgLy8gQSByZWRlbGl2ZXJlZCBGSVJJTkcgcG9zdCAobm8gcmVzb2x2ZWRBdCkgbXVzdCBub3Qgd2lwZSBhIHJlY29yZGVkXG4gICAgICAgICAgLy8gcmVzb2x2ZSDigJQgc2VuZGVycyByZS1wb3N0IGZpcmluZyBhbGVydHMgb24gZXZlcnkgcmVwZWF0IGludGVydmFsLCBhbmRcbiAgICAgICAgICAvLyBkZWxpdmVyeSBvcmRlciBpc24ndCBndWFyYW50ZWVkLiBLZWVwIHRoZSBzdG9yZWQgcmVzb2x2ZSB1bmxlc3MgdGhlXG4gICAgICAgICAgLy8gcG9zdCBjYXJyaWVzIGl0cyBvd24sIG9yIHRoZSBpbmNpZGVudCB3YXMgUkUtT1BFTkVEIChhIGRpZmZlcmVudFxuICAgICAgICAgIC8vIG9wZW5lZEF0IG1lYW5zIGEgbmV3IG9jY3VycmVuY2UsIHdob3NlIHJlc29sdmUgc3RhdGUgaXMgdGhlIHBvc3QncykuXG4gICAgICAgICAgc2V0OiB7XG4gICAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICAgIG9wZW5lZEF0LFxuICAgICAgICAgICAgcmVzb2x2ZWRBdDogc3FsYENBU0UgV0hFTiAke3NjaGVtYS5pbmNpZGVudC5vcGVuZWRBdH0gPSBleGNsdWRlZC5vcGVuZWRfYXRcbiAgICAgICAgICAgICAgVEhFTiBDT0FMRVNDRShleGNsdWRlZC5yZXNvbHZlZF9hdCwgJHtzY2hlbWEuaW5jaWRlbnQucmVzb2x2ZWRBdH0pXG4gICAgICAgICAgICAgIEVMU0UgZXhjbHVkZWQucmVzb2x2ZWRfYXQgRU5EYCxcbiAgICAgICAgICAgIHNldmVyaXR5LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLnJldHVybmluZyh7IHJlc29sdmVkQXQ6IHNjaGVtYS5pbmNpZGVudC5yZXNvbHZlZEF0IH0pO1xuICAgICAgICByZXR1cm4geyBwcmV2aW91czogcHJpb3IgPz8gbnVsbCwgc3RvcmVkOiByb3cgfTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gQSBuZXcvdXBkYXRlZCBpbmNpZGVudCBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCBjYWNoZWQgcmVwb3J0cy5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBhZnRlciA9IHtcbiAgICAgIGVudmlyb25tZW50LFxuICAgICAgb3BlbmVkQXQ6IG9wZW5lZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICByZXNvbHZlZEF0OiBpc29Pck51bGwoc3RvcmVkPy5yZXNvbHZlZEF0ID8/IG51bGwpLFxuICAgICAgc2V2ZXJpdHksXG4gICAgfTtcbiAgICBjb25zdCBiZWZvcmUgPSBwcmV2aW91c1xuICAgICAgPyB7XG4gICAgICAgIGVudmlyb25tZW50OiBwcmV2aW91cy5lbnZpcm9ubWVudCxcbiAgICAgICAgb3BlbmVkQXQ6IGlzb09yTnVsbChwcmV2aW91cy5vcGVuZWRBdCksXG4gICAgICAgIHJlc29sdmVkQXQ6IGlzb09yTnVsbChwcmV2aW91cy5yZXNvbHZlZEF0KSxcbiAgICAgICAgc2V2ZXJpdHk6IHByZXZpb3VzLnNldmVyaXR5LFxuICAgICAgfVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBiZWZvcmUgPT09IG51bGxcbiAgICAgIHx8IGJlZm9yZS5lbnZpcm9ubWVudCAhPT0gYWZ0ZXIuZW52aXJvbm1lbnRcbiAgICAgIHx8IGJlZm9yZS5vcGVuZWRBdCAhPT0gYWZ0ZXIub3BlbmVkQXRcbiAgICAgIHx8IGJlZm9yZS5yZXNvbHZlZEF0ICE9PSBhZnRlci5yZXNvbHZlZEF0XG4gICAgICB8fCBiZWZvcmUuc2V2ZXJpdHkgIT09IGFmdGVyLnNldmVyaXR5O1xuICAgIHJldHVybiB7IGluY2lkZW50SWQsIGNyZWF0ZWQ6IGJlZm9yZSA9PT0gbnVsbCwgY2hhbmdlZCwgYmVmb3JlLCBhZnRlciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIHBlci1vcmcgRE9SQSBzZXR0aW5ncy4gUmV0dXJucyB0aGUgc3RvcmVkXG4gICAqIGBpbmNpZGVudFdpbmRvd0hvdXJzYCBvdmVycmlkZSAob3IgYG51bGxgIHdoZW4gdW5zZXQpIHBsdXMgdGhlIGdsb2JhbCBlbnZcbiAgICogZGVmYXVsdCwgc28gdGhlIHNldHRpbmdzIFVJIGNhbiBzaG93IGJvdGguIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIHRlbmFudFxuICAgKiBjb250ZXh0IChSTFMtc2NvcGVkKTsgYSBzaW5nbGUtb3JnIHJlYWQuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZDogc3RyaW5nLCByZXRlbnRpb25PcmdJZDogc3RyaW5nID0gb3JnSWQpOiBQcm9taXNlPFJlcG9ydGluZ1NldHRpbmdzPiB7XG4gICAgY29uc3Qgcm93cyA9IGRyaXp6bGVSb3dzPHtcbiAgICAgIGluY2lkZW50X3dpbmRvd19ob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgICAgZG9yYV9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICB9PigoYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCAke3NjaGVtYS5kb3JhU2V0dGluZ3MuaW5jaWRlbnRXaW5kb3dIb3Vyc30gQVMgaW5jaWRlbnRfd2luZG93X2hvdXJzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmV2ZW50UmV0ZW50aW9uRGF5c30gQVMgZXZlbnRfcmV0ZW50aW9uX2RheXMsXG4gICAgICAgICAgICAgICAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZG9yYVJldGVudGlvbkRheXN9IEFTIGRvcmFfcmV0ZW50aW9uX2RheXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5kb3JhU2V0dGluZ3N9XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZH0gPSAke29yZ0lkfVxuICAgICAgICBMSU1JVCAxXG4gICAgICBgKSkpLnJvd3MpO1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gICAgLy8gUmV0ZW50aW9uIGlzIGEgYmlsbGluZyBlbnRpdGxlbWVudCBzeW5jZWQgb250byB0aGUgYWNjb3VudCBST09UIG9ubHk7IGFcbiAgICAvLyB0ZWFtIHJlYWRzIGl0cyByb290J3Mgd2luZG93ICh0aGUgaW5jaWRlbnQgd2luZG93IHN0YXlzIHRoZSB0ZWFtJ3Mgb3duKS5cbiAgICBjb25zdCByZXRlbnRpb24gPSByZXRlbnRpb25PcmdJZCA9PT0gb3JnSWRcbiAgICAgID8gcm93XG4gICAgICA6IGF3YWl0IHRoaXMuI3JlYWRSZXRlbnRpb25PdmVycmlkZShyZXRlbnRpb25PcmdJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluY2lkZW50V2luZG93SG91cnM6IHJvdz8uaW5jaWRlbnRfd2luZG93X2hvdXJzICE9IG51bGwgPyBOdW1iZXIocm93LmluY2lkZW50X3dpbmRvd19ob3VycykgOiBudWxsLFxuICAgICAgZGVmYXVsdFdpbmRvd0hvdXJzOiBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUyxcbiAgICAgIGV2ZW50UmV0ZW50aW9uRGF5czogcmV0ZW50aW9uPy5ldmVudF9yZXRlbnRpb25fZGF5cyAhPSBudWxsID8gTnVtYmVyKHJldGVudGlvbi5ldmVudF9yZXRlbnRpb25fZGF5cykgOiBudWxsLFxuICAgICAgZG9yYVJldGVudGlvbkRheXM6IHJldGVudGlvbj8uZG9yYV9yZXRlbnRpb25fZGF5cyAhPSBudWxsID8gTnVtYmVyKHJldGVudGlvbi5kb3JhX3JldGVudGlvbl9kYXlzKSA6IG51bGwsXG4gICAgICBkZWZhdWx0RXZlbnRSZXRlbnRpb25EYXlzOiBSRVBPUlRJTkdfRVZFTlRfUkVURU5USU9OX0RBWVMsXG4gICAgICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IFJFUE9SVElOR19ET1JBX1JFVEVOVElPTl9EQVlTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIFJPT1Qgb3JnJ3Mgc3RvcmVkIHJldGVudGlvbiBvdmVycmlkZS4gVGhlIGNhbGxlciAoYSB0ZWFtKSBjYW4ndCBzZWUgdGhlXG4gICAqIHJvb3QncyBgZG9yYV9zZXR0aW5nc2Agcm93IHVuZGVyIGl0cyBvd24gUkxTIHNjb3BlLCBzbyB0aGlzIG5hcnJvdyByZWFkIG9mXG4gICAqIHR3byBpbnRlZ2VyIGNvbHVtbnMg4oCUIGtleWVkIGJ5IHRoZSBleHBsaWNpdCwgSldULWRlcml2ZWQgcm9vdCBpZCDigJQgcnVucyBpbiBhXG4gICAqIHN5c2FkbWluIHNjb3BlLlxuICAgKi9cbiAgYXN5bmMgI3JlYWRSZXRlbnRpb25PdmVycmlkZShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7IGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsOyBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsIH0gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgYXN5bmMgKCkgPT4gZHJpenpsZVJvd3M8e1xuICAgICAgZXZlbnRfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgICBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5ldmVudFJldGVudGlvbkRheXN9IEFTIGV2ZW50X3JldGVudGlvbl9kYXlzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmRvcmFSZXRlbnRpb25EYXlzfSBBUyBkb3JhX3JldGVudGlvbl9kYXlzXG4gICAgICAgIEZST00gJHtzY2hlbWEuZG9yYVNldHRpbmdzfVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgYCkpKS5yb3dzKSk7XG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICAvKipcbiAgICogVXBzZXJ0IHBlci1vcmcgcmVwb3J0aW5nIHNldHRpbmdzIChpbmNpZGVudCB3aW5kb3cgK1xuICAgKiByZXRlbnRpb24gb3ZlcnJpZGVzKSwgaWRlbXBvdGVudCBvbiBgb3JnX2lkYC4gQSBwYXJ0aWFsIHdyaXRlIOKAlCBvbmx5IHRoZVxuICAgKiBmaWVsZHMgcHJlc2VudCBpbiBgcGF0Y2hgIGFyZSBzZXQgKHNvIHVwZGF0aW5nIHJldGVudGlvbiBuZXZlciBjbGVhcnMgdGhlXG4gICAqIGluY2lkZW50IHdpbmRvdywgYW5kIHZpY2UtdmVyc2EpLiBTZXQgc2VsZi1zZXJ2ZSBieSBhbiBvcmcgYWRtaW4gdmlhXG4gICAqIGBQVVQgL2FwaS9yZXBvcnRzL3NldHRpbmdzL2luY2lkZW50c2AuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0XG4gICAqIChSTFMgV0lUSCBDSEVDSyk7IGEgY2hhbmdlZCB2YWx1ZSBhZmZlY3RzIERPUkEgYWdncmVnYXRlcyBzbyB0aGUgb3JnJ3NcbiAgICogY2FjaGVkIHJlcG9ydHMgYXJlIGRyb3BwZWQuXG4gICAqL1xuICBhc3luYyBzZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZDogc3RyaW5nLCBwYXRjaDogUmVwb3J0aW5nU2V0dGluZ3NQYXRjaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9O1xuICAgIGlmIChwYXRjaC5pbmNpZGVudFdpbmRvd0hvdXJzICE9PSB1bmRlZmluZWQpIHNldC5pbmNpZGVudFdpbmRvd0hvdXJzID0gcGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycztcbiAgICBpZiAocGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQpIHNldC5ldmVudFJldGVudGlvbkRheXMgPSBwYXRjaC5ldmVudFJldGVudGlvbkRheXM7XG4gICAgaWYgKHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQpIHNldC5kb3JhUmV0ZW50aW9uRGF5cyA9IHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKS52YWx1ZXMoe1xuICAgICAgICBvcmdJZCxcbiAgICAgICAgaW5jaWRlbnRXaW5kb3dIb3VyczogcGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycyxcbiAgICAgICAgZXZlbnRSZXRlbnRpb25EYXlzOiBwYXRjaC5ldmVudFJldGVudGlvbkRheXMsXG4gICAgICAgIGRvcmFSZXRlbnRpb25EYXlzOiBwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cyxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLFxuICAgICAgICBzZXQsXG4gICAgICB9KSksXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHJlY2VudCBpbmNpZGVudHMgZm9yIGFuIG9yZyAob3JnLWFkbWluIHN1cmZhY2UpLCBuZXdlc3QgZmlyc3QsXG4gICAqIHBhZ2luYXRlZC4gRWFjaCByb3cgY2FycmllcyBpdHMgcmVzb2x2ZWQgc3RhdGUgYW5kIGl0cyBkZXBsb3kgY29ycmVsYXRpb24g4oCUXG4gICAqIHRoZSBtb3N0IHJlY2VudCBTVUNDRVNTRlVMIGRlcGxveSB0byB0aGUgaW5jaWRlbnQncyBgZW52aXJvbm1lbnRgIHdob3NlXG4gICAqIGBjb21wbGV0ZWRfYXRgIGZhbGxzIHdpdGhpbiB0aGUgZWZmZWN0aXZlIHBlci1vcmcgY29ycmVsYXRpb24gd2luZG93IGJlZm9yZVxuICAgKiBgb3BlbmVkX2F0YCAodGhlIHNhbWUgcnVsZSBET1JBJ3MgQ0ZSL01UVFIgY29ycmVsYXRpb24gYXBwbGllcykuIFNpbmdsZS1vcmdcbiAgICogKG5vIHJvbGx1cCkg4oCUIGFuIG9yZyBhZG1pbiB2aWV3cyB0aGVpciBvd24gb3JnJ3MgaW5jaWRlbnRzLiBSTFMtc2NvcGVkIHZpYVxuICAgKiB0aGUgYHAub3JnX2lkYC9gaS5vcmdfaWRgIHByZWRpY2F0ZXMgKyB0aGUgdGVuYW50IGNvbnRleHQuXG4gICAqL1xuICBhc3luYyBsaXN0SW5jaWRlbnRzKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IHsgbGltaXQ6IG51bWJlcjsgb2Zmc2V0OiBudW1iZXIgfSk6IFByb21pc2U8SW5jaWRlbnRMaXN0SXRlbVtdPiB7XG4gICAgY29uc3QgeyBpbmNpZGVudFdpbmRvd0hvdXJzIH0gPSBhd2FpdCB0aGlzLmdldFJlcG9ydGluZ1NldHRpbmdzKG9yZ0lkKTtcbiAgICBjb25zdCB3aW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKGluY2lkZW50V2luZG93SG91cnMpO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4ob3B0cy5saW1pdCwgMjAwKSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb3B0cy5vZmZzZXQpO1xuICAgIC8vIFRoZSBjb3JyZWxhdGlvbiB3aW5kb3cgaXMgZXhwcmVzc2VkIGluIFNFQ09ORFMgYXMgYSBkb3VibGUsIG5vdCBhc1xuICAgIC8vIGBtYWtlX2ludGVydmFsKGhvdXJzID0+IE46OmludClgLiBUaGUgd2luZG93IGlzIHZhbGlkYXRlZCBhcyBhbnkgcG9zaXRpdmVcbiAgICAvLyBudW1iZXIgKDAuNWggaXMgbGVnYWwpIGFuZCB0aGUgaW4tbWVtb3J5IERPUkEgY29ycmVsYXRpb24gdXNlcyBpdCBleGFjdGx5O1xuICAgIC8vIHRoZSBpbnQgY2FzdCBtYWRlIFBvc3RncmVzIHJlamVjdCBhIGZyYWN0aW9uYWwgdmFsdWUsIHNvIGEgMC41aCB3aW5kb3dcbiAgICAvLyByZXR1cm5lZCA1MDAgZnJvbSB0aGlzIGVuZHBvaW50IGFuZCBmcm9tIHRoZSBjb3JyZWxhdGlvbiBsb29rdXAgYmVsb3cuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBpLmluY2lkZW50X2lkIEFTIFwiaW5jaWRlbnRJZFwiLFxuICAgICAgICAgIGkuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgICAgaS5zZXZlcml0eSBBUyBzZXZlcml0eSxcbiAgICAgICAgICBpLm9wZW5lZF9hdDo6dGV4dCBBUyBcIm9wZW5lZEF0XCIsXG4gICAgICAgICAgaS5yZXNvbHZlZF9hdDo6dGV4dCBBUyBcInJlc29sdmVkQXRcIixcbiAgICAgICAgICBpLmNyZWF0ZWRfYXQ6OnRleHQgQVMgXCJjcmVhdGVkQXRcIixcbiAgICAgICAgICAoaS5yZXNvbHZlZF9hdCBJUyBOT1QgTlVMTCkgQVMgcmVzb2x2ZWQsXG4gICAgICAgICAgY29yci5leGVjdXRpb25faWQgQVMgXCJjb3JyZWxhdGVkRXhlY3V0aW9uSWRcIixcbiAgICAgICAgICBjb3JyLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBcImRlcGxveUNvbXBsZXRlZEF0XCJcbiAgICAgICAgRlJPTSAke3NjaGVtYS5pbmNpZGVudH0gaVxuICAgICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgU0VMRUNUIGUuZXhlY3V0aW9uX2lkLCBlLmNvbXBsZXRlZF9hdFxuICAgICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnXG4gICAgICAgICAgICBBTkQgZS5lbnZpcm9ubWVudCA9IGkuZW52aXJvbm1lbnQgQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA8PSBpLm9wZW5lZF9hdFxuICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49IGkub3BlbmVkX2F0IC0gbWFrZV9pbnRlcnZhbChzZWNzID0+ICR7d2luZG93SG91cnMgKiAzNjAwfTo6ZG91YmxlIHByZWNpc2lvbilcbiAgICAgICAgICBPUkRFUiBCWSBlLmNvbXBsZXRlZF9hdCBERVNDXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICApIGNvcnIgT04gdHJ1ZVxuICAgICAgICBXSEVSRSBpLm9yZ19pZCA9ICR7b3JnSWR9XG4gICAgICAgIE9SREVSIEJZIGkub3BlbmVkX2F0IERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH0gT0ZGU0VUICR7b2Zmc2V0fVxuICAgICAgYCkudGhlbigocikgPT4gZHJpenpsZVJvd3M8SW5jaWRlbnRMaXN0SXRlbT4oci5yb3dzKS5tYXAoKHJvdykgPT4gKHtcbiAgICAgIC4uLnJvdyxcbiAgICAgIHJlc29sdmVkOiByb3cucmVzb2x2ZWQgPT09IHRydWUgfHwgKHJvdy5yZXNvbHZlZCBhcyB1bmtub3duKSA9PT0gJ3QnLFxuICAgICAgY29ycmVsYXRlZEV4ZWN1dGlvbklkOiByb3cuY29ycmVsYXRlZEV4ZWN1dGlvbklkID8/IG51bGwsXG4gICAgICBkZXBsb3lDb21wbGV0ZWRBdDogcm93LmRlcGxveUNvbXBsZXRlZEF0ID8/IG51bGwsXG4gICAgfSkpKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyaW5nLXRlc3QgZHJ5LXJ1bjogd291bGQgYSBzeW50aGV0aWMgaW5jaWRlbnQgb3BlbmluZyBOT1cgZm9yXG4gICAqIGBlbnZpcm9ubWVudGAgY29ycmVsYXRlIHRvIGEgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHVuZGVyIHRoZSBvcmcnc1xuICAgKiBlZmZlY3RpdmUgd2luZG93PyBUaGlzIGlzIGEgTk9OLXBlcnNpc3RpbmcgY29ycmVsYXRpb24gY2hlY2sg4oCUIGl0IHZlcmlmaWVzXG4gICAqIHRoZSBhZG1pbidzIGVudmlyb25tZW50IG5hbWluZyArIHdpbmRvdyBsaW5lIHVwIHdpdGggcmVhbCBkZXBsb3kgZXZlbnRzXG4gICAqIFdJVEhPVVQgd3JpdGluZyBhbiBpbmNpZGVudCAoc28gYSBcInRlc3RcIiBuZXZlciBwb2xsdXRlcyBDRlIvTVRUUikuIFJMUy1zY29wZWQuXG4gICAqL1xuICBhc3luYyB0ZXN0SW5jaWRlbnRDb3JyZWxhdGlvbihvcmdJZDogc3RyaW5nLCBlbnZpcm9ubWVudDogc3RyaW5nKTogUHJvbWlzZTxJbmNpZGVudFRlc3RSZXN1bHQ+IHtcbiAgICBjb25zdCBlbnYgPSBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhlbnZpcm9ubWVudCk7XG4gICAgY29uc3Qgb3BlbmVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgeyBpbmNpZGVudFdpbmRvd0hvdXJzIH0gPSBhd2FpdCB0aGlzLmdldFJlcG9ydGluZ1NldHRpbmdzKG9yZ0lkKTtcbiAgICBjb25zdCB3aW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKGluY2lkZW50V2luZG93SG91cnMpO1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czx7IGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDsgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUIGUuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCwgZS5jb21wbGV0ZWRfYXQ6OnRleHQgQVMgY29tcGxldGVkX2F0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRSdcbiAgICAgICAgICBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52fSBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke29wZW5lZEF0fTo6dGltZXN0YW1wdHpcbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtvcGVuZWRBdH06OnRpbWVzdGFtcHR6IC0gbWFrZV9pbnRlcnZhbChzZWNzID0+ICR7d2luZG93SG91cnMgKiAzNjAwfTo6ZG91YmxlIHByZWNpc2lvbilcbiAgICAgICAgT1JERVIgQlkgZS5jb21wbGV0ZWRfYXQgREVTQ1xuICAgICAgICBMSU1JVCAxXG4gICAgICBgKSkpLnJvd3MpO1xuICAgIGNvbnN0IGhpdCA9IHJvd3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudmlyb25tZW50OiBlbnYsXG4gICAgICBvcGVuZWRBdCxcbiAgICAgIHdpbmRvd0hvdXJzLFxuICAgICAgY29ycmVsYXRlZDogaGl0Py5leGVjdXRpb25faWQgIT0gbnVsbCxcbiAgICAgIGV4ZWN1dGlvbklkOiBoaXQ/LmV4ZWN1dGlvbl9pZCA/PyBudWxsLFxuICAgICAgZGVwbG95Q29tcGxldGVkQXQ6IGhpdD8uY29tcGxldGVkX2F0ID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnQgcGVyLW9yZyBpbmdlc3Rpb24gaGVhbHRoOiB0aGUgQVdTIGV2ZW50cyBMYW1iZGEgcGVyaW9kaWNhbGx5XG4gICAqIHJlcG9ydHMgZm9yd2FyZGVkL2Ryb3BwZWQgY291bnRlcnMgKyB0aGUgbGFzdCBldmVudCB0aW1lc3RhbXAgc28gdGhlIFJlcG9ydHNcbiAgICogVUkgY2FuIHNob3cgZmxvd2luZyAvIHN0YWxlIC8gZHJvcHBpbmcuIE9uZSByb3cgcGVyIG9yZyAodXBzZXJ0IG9uIG9yZ19pZCkuXG4gICAqL1xuICBhc3luYyByZWNvcmRJbmdlc3RIZWFsdGgoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpbnB1dDogeyBmb3J3YXJkZWQ/OiBudW1iZXI7IGRyb3BwZWQ/OiBudW1iZXI7IGxhc3RFdmVudEF0Pzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhc3RFdmVudEF0ID0gaW5wdXQubGFzdEV2ZW50QXQgPyBuZXcgRGF0ZShpbnB1dC5sYXN0RXZlbnRBdCkgOiB1bmRlZmluZWQ7XG4gICAgYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5pbmdlc3RIZWFsdGgpLnZhbHVlcyh7XG4gICAgICAgIG9yZ0lkLFxuICAgICAgICBmb3J3YXJkZWQ6IGlucHV0LmZvcndhcmRlZCxcbiAgICAgICAgZHJvcHBlZDogaW5wdXQuZHJvcHBlZCxcbiAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmluZ2VzdEhlYWx0aC5vcmdJZCxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgZm9yd2FyZGVkOiBpbnB1dC5mb3J3YXJkZWQsXG4gICAgICAgICAgZHJvcHBlZDogaW5wdXQuZHJvcHBlZCxcbiAgICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIH0sXG4gICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGJhY2sgb25lIG9yZydzIGluZ2VzdGlvbiBoZWFsdGggZm9yIHRoZSBSZXBvcnRzIFVJIGZyZXNobmVzc1xuICAgKiBpbmRpY2F0b3IuIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIG9yZyBoYXMgTk8gcm93IOKAlCBpLmUuIHRoZSBkZXBsb3ltZW50IGhhc1xuICAgKiBuZXZlciBpbmdlc3RlZCBhbnl0aGluZyDigJQgd2hpY2ggdGhlIFVJIG11c3QgcmVuZGVyIGFzIFwibm8gaW5nZXN0IHJlcG9ydGVkXG4gICAqIHlldFwiLCBuZXZlciBhcyBcInN0YWxlXCIuIFJMUy1zY29wZWQgdG8gdGhlIG9yZyBsaWtlIGV2ZXJ5IG90aGVyIHJlYWQuXG4gICAqL1xuICBhc3luYyBnZXRJbmdlc3RIZWFsdGgob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8SW5nZXN0SGVhbHRoU3RhdHVzIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgICAgICAuc2VsZWN0KClcbiAgICAgICAgLmZyb20oc2NoZW1hLmluZ2VzdEhlYWx0aClcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5pbmdlc3RIZWFsdGgub3JnSWQsIG9yZ0lkKSlcbiAgICAgICAgLmxpbWl0KDEpKSxcbiAgICApO1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gICAgaWYgKCFyb3cpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVkQXQ6IHJvdy51cGRhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RFdmVudEF0OiBpc29Pck51bGwocm93Lmxhc3RFdmVudEF0KSxcbiAgICAgIGZvcndhcmRlZDogcm93LmZvcndhcmRlZCA/PyBudWxsLFxuICAgICAgZHJvcHBlZDogcm93LmRyb3BwZWQgPz8gbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gc3dlZXA6IGhhcmQtZGVsZXRlcyByb3dzIHBhc3QgdGhlaXIgcGVyLW9yZyByZXRlbnRpb25cbiAgICogd2luZG93IChzcGxpdCBzdGFuZGFyZC1ldmVudCB2cyBET1JBLXNvdXJjZSkuIENyb3NzLXRlbmFudCBob3VzZWtlZXBpbmcg4oCUXG4gICAqIGl0IGVzdGFibGlzaGVzIGl0cyBvd24gc3lzYWRtaW4gc2NvcGUuIFNlZSAuL3JlcG9ydGluZy9yZXRlbnRpb24tc3dlZXAudHMuXG4gICAqL1xuICBhc3luYyBwdXJnZUV4cGlyZWRSZXBvcnRpbmdEYXRhKG9wdHM6IFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVwb3J0aW5nUmV0ZW50aW9uQ291bnRzPiB7XG4gICAgcmV0dXJuIHB1cmdlUmVwb3J0aW5nUmV0ZW50aW9uKG9wdHMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDU6IHRoZSBBTkFMWVRJQ1MgcmVhZHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIFRoaW4gZGVsZWdhdGlvbnMgdG8gLi9yZXBvcnRpbmcvYW5hbHl0aWNzLXF1ZXJpZXMudHMsIHNvIGByZXBvcnRpbmdTZXJ2aWNlYFxuICAvLyBzYXRpc2ZpZXMgdGhlIHJlcG9ydCBlbmdpbmUncyBgU2VjdGlvbkRhdGFTb3VyY2VgIGluIGZ1bGwgYW5kIGEgc2VjdGlvbiBuZXZlclxuICAvLyByZWFjaGVzIHBhc3QgdGhlIHNlcnZpY2UgZm9yIGl0cyBkYXRhLiBFdmVyeSBvbmUgb2YgdGhlc2UgcmVhZHMgYVxuICAvLyBwcmUtYWdncmVnYXRlZCB0YWJsZSAoYGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzYCwgYGRvcmFfZGVwbG95bWVudHNgLFxuICAvLyBgcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb25gLCBgcGx1Z2luX3Z1bG5fZXhwb3N1cmVgKSByYXRoZXIgdGhhbiByYXcgZXZlbnRzIOKAlFxuICAvLyB3aGljaCBpcyB3aGF0IG1ha2VzIGEgcXVhcnRlcmx5IHJlcG9ydCBhZmZvcmRhYmxlIEFORCB3aGF0IG1ha2VzIGl0IHN0aWxsXG4gIC8vIGFuc3dlcmFibGUgYWZ0ZXIgcmV0ZW50aW9uIGhhcyBzd2VwdCB0aGUgZXZlbnRzIGl0IGNhbWUgZnJvbS5cblxuICAvKiogUGVyLXBpcGVsaW5lIGRlbGl2ZXJ5LCB3b3JzdCBmaXJzdC4gKi9cbiAgYXN5bmMgZ2V0UGlwZWxpbmVCcmVha2Rvd24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDEwKSB7XG4gICAgcmV0dXJuIGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlLCBsaW1pdCk7XG4gIH1cblxuICAvKiogRmFpbHVyZXMgYnkgY2F0ZWdvcnksIHdpdGggdGhlIHByZXZpb3VzIHBlcmlvZCdzIGNvdW50cyBmb3IgdGhlIHRyZW5kLiAqL1xuICBhc3luYyBnZXRGYWlsdXJlQW5hbHlzaXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gZ2V0RmFpbHVyZUFuYWx5c2lzKHNjb3BlLCBwcmV2aW91cyk7XG4gIH1cblxuICAvKiogUGVyLXN0YWdlIHRpbWluZ3MgZm9yIG9uZSBwaXBlbGluZSwgc2xvd2VzdCBmaXJzdC4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VQZXJmb3JtYW5jZShzY29wZTogQW5hbHl0aWNzU2NvcGUsIHBpcGVsaW5lSWQ6IHN0cmluZywgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGdldFN0YWdlUGVyZm9ybWFuY2Uoc2NvcGUsIHBpcGVsaW5lSWQsIHByZXZpb3VzKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCB0aW1lIGJ5IHByb2plY3QgYW5kIHBpcGVsaW5lLiBTZWNvbmRzLCBuZXZlciBtb25leS4gKi9cbiAgYXN5bmMgZ2V0UmVzb3VyY2VDb25zdW1wdGlvbihzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gMjApIHtcbiAgICByZXR1cm4gZ2V0UmVzb3VyY2VDb25zdW1wdGlvbihzY29wZSwgbGltaXQpO1xuICB9XG5cbiAgLyoqIEVhY2ggY29tbWl0J3MgcGF0aCBhY3Jvc3MgZW52aXJvbm1lbnRzLCBhbmQgd2hpY2ggb25lcyBzdG9wcGVkIHNob3J0LiAqL1xuICBhc3luYyBnZXRQcm9tb3Rpb25WaWV3KHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJvZHVjdGlvbkVudiA9ICdwcm9kdWN0aW9uJywgbGltaXQgPSAyNSkge1xuICAgIHJldHVybiBnZXRQcm9tb3Rpb25WaWV3KHNjb3BlLCBwcm9kdWN0aW9uRW52LCBsaW1pdCk7XG4gIH1cblxuICAvKiogUGlwZWxpbmVzIGJlaGluZCBvbiBhIHBsdWdpbiwgd29yc3QgZ2FwIGZpcnN0ICh0aGUgREVDTEFSRUQgc2lkZSkuICovXG4gIGFzeW5jIGdldE91dGRhdGVkUGx1Z2lucyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gNTApIHtcbiAgICByZXR1cm4gZ2V0T3V0ZGF0ZWRQbHVnaW5zKHNjb3BlLCBsaW1pdCk7XG4gIH1cblxuICAvKiogT3BlbiBwbHVnaW4gdnVsbmVyYWJpbGl0aWVzIHBlciBwaXBlbGluZSAoc2F5cyBkZWNsYXJlZCB2cyBkZXBsb3llZCkuICovXG4gIGFzeW5jIGdldFBsdWdpblZ1bG5lcmFiaWxpdGllcyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gNTApIHtcbiAgICByZXR1cm4gZ2V0UGx1Z2luVnVsbmVyYWJpbGl0aWVzKHNjb3BlLCBsaW1pdCk7XG4gIH1cblxuICAvKiogQWRvcHRpb24sIGNyZWF0aW9uIHNvdXJjZSwgYW5kIHRoZSBkZXBsb3ktdHJhY2tpbmcgY292ZXJhZ2UgZGVub21pbmF0b3IuICovXG4gIGFzeW5jIGdldEFkb3B0aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgdGltZVNhdmVkTWludXRlcz86IG51bWJlciB8IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0QWRvcHRpb24oc2NvcGUsIHRpbWVTYXZlZE1pbnV0ZXMgPz8gKGF3YWl0IHRoaXMudGltZVNhdmVkQXNzdW1wdGlvbihzY29wZS5vcmdJZCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmVlZHMtYXR0ZW50aW9uIGZpbmRpbmdzIGZvciB0aGUgcGVyaW9kLlxuICAgKlxuICAgKiBBc3NlbWJsZWQgSEVSRSByYXRoZXIgdGhhbiBpbiB0aGUgc2VjdGlvbiwgYmVjYXVzZSB0aGUgcnVsZXMgbmVlZCBzaXggcmVhZHMgdGhhdFxuICAgKiBtdXN0IGFsbCBkZXNjcmliZSB0aGUgc2FtZSB3aW5kb3c6IHRoaXMgcGVyaW9kJ3MgYnJlYWtkb3duLCB0aGUgcHJldmlvdXMgb25lJ3MsXG4gICAqIGZhaWx1cmUgc3RyZWFrcywgY29uZmlnLWNoYW5nZSB0aW1lcywgcGlwZWxpbmVzIHdpdGggYW4gb3BlbiBDcml0aWNhbCwgYW5kXG4gICAqIHBpcGVsaW5lcyBET1JBIGNhbm5vdCBzZWUuIEEgc2VjdGlvbiB0aGF0IGZldGNoZWQgdGhlbSBpdHNlbGYgd291bGQgYmUgdGhlIG9ubHlcbiAgICogcGxhY2UgaW4gdGhlIHJlcG9ydCB3aGVyZSB0aGUgd2luZG93IGNvdWxkIGRyaWZ0IGJldHdlZW4gcGFuZWxzLlxuICAgKlxuICAgKiBFdmVyeSBpbnB1dCBleGNlcHQgdGhlIGN1cnJlbnQgYnJlYWtkb3duIGlzIE9QVElPTkFMIHRvIHRoZSBldmFsdWF0b3IsIGFuZCBlYWNoXG4gICAqIG9uZSdzIGZhaWx1cmUgaXMgYWJzb3JiZWQ6IGEgcnVsZSB3aXRoIG5vIGRhdGEgdG8gcnVuIG9uIGlzIHNraXBwZWQsIHdoaWNoIGlzXG4gICAqIHdoeSBvbmUgdW5hdmFpbGFibGUgcmVhZCBjb3N0cyBvbmUgZmluZGluZyByYXRoZXIgdGhhbiB0aGUgd2hvbGUgc2VjdGlvbi4gVGhlXG4gICAqIGFsdGVybmF0aXZlIOKAlCBhIHNlY3Rpb24gdGhhdCBmYWlscyBiZWNhdXNlIHRoZSBzdHJlYWsgcXVlcnkgdGltZWQgb3V0IOKAlCByZXBsYWNlc1xuICAgKiBzaXggZmluZGluZ3Mgd2l0aCBub25lLlxuICAgKlxuICAgKiBBIHNraXBwZWQgcnVsZSBpcyBTQUlELCBpbiBgdW5hdmFpbGFibGVSdWxlc2AuIEFic29yYmVkIHNpbGVudGx5LCBhIGZhaWxlZFxuICAgKiB2dWxuZXJhYmxlLXBpcGVsaW5lcyByZWFkIGJlY2FtZSBhbiBlbXB0eSBzZXQg4oCUIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gXCJub1xuICAgKiBwaXBlbGluZSBydW5zIGEgdnVsbmVyYWJsZSBwbHVnaW5cIiwgd2hpY2ggaXMgdGhlIG9uZSBmYWxzZSBuZWdhdGl2ZSBhIHNlY3VyaXR5XG4gICAqIHJlYWRlciBtdXN0IG5ldmVyIGJlIGhhbmRlZC4gVGhlIGNvbXBvc2VyIHR1cm5zIGl0IGludG8gYSBkYXRhLXF1YWxpdHkgbm90ZS5cbiAgICovXG4gIGFzeW5jIGdldE5lZWRzQXR0ZW50aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlLCBBVFRFTlRJT05fUElQRUxJTkVfTElNSVQpO1xuICAgIGNvbnN0IHVuYXZhaWxhYmxlID0gbmV3IFNldDxBdHRlbnRpb25SdWxlSWQ+KCk7XG4gICAgY29uc3QgdHJhY2sgPSA8VD4ocnVsZXM6IEF0dGVudGlvblJ1bGVJZFtdLCBwOiBQcm9taXNlPFQ+LCBmYWxsYmFjazogVCkgPT5cbiAgICAgIHNvZnRlbihwLCBmYWxsYmFjaywgKCkgPT4geyBmb3IgKGNvbnN0IHIgb2YgcnVsZXMpIHVuYXZhaWxhYmxlLmFkZChyKTsgfSk7XG4gICAgY29uc3QgcHJpb3IgPSBwcmV2aW91c1xuICAgICAgPyBhd2FpdCB0cmFjayhbJ3Nsb3dlcl9wOTUnXSwgZ2V0UGlwZWxpbmVCcmVha2Rvd24oeyAuLi5zY29wZSwgLi4ucHJldmlvdXMgfSwgQVRURU5USU9OX1BJUEVMSU5FX0xJTUlUKSwgW10pXG4gICAgICA6IFtdO1xuICAgIGNvbnN0IFtzdHJlYWtSb3dzLCBjb25maWdDaGFuZ2VzLCB2dWxuZXJhYmxlLCB1bnRyYWNrZWQsIHRocmVzaG9sZHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdHJhY2soWydjb25zZWN1dGl2ZV9mYWlsdXJlcycsICdub19yZWNlbnRfc3VjY2VzcyddLCBnZXRQaXBlbGluZVN0cmVha3Moc2NvcGUpLCBbXSksXG4gICAgICB0cmFjayhbJ2ZhaWxlZF9hZnRlcl9jb25maWdfY2hhbmdlJ10sIGdldFBpcGVsaW5lQ29uZmlnQ2hhbmdlcyhzY29wZSksIG5ldyBNYXA8c3RyaW5nLCBEYXRlPigpKSxcbiAgICAgIHRyYWNrKFsndnVsbmVyYWJsZV9wbHVnaW4nXSwgZ2V0VnVsbmVyYWJsZVBpcGVsaW5lcyhzY29wZSksIFtdKSxcbiAgICAgIHRyYWNrKFsnbm9fZGVwbG95X3RyYWNraW5nJ10sIGdldFVudHJhY2tlZFBpcGVsaW5lcyhzY29wZSksIFtdKSxcbiAgICAgIHNvZnRlbih0aGlzLmF0dGVudGlvblRocmVzaG9sZHMoc2NvcGUub3JnSWQpLCB7fSksXG4gICAgXSk7XG4gICAgY29uc3QgaXRlbXMgPSBldmFsdWF0ZU5lZWRzQXR0ZW50aW9uKHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwcmV2aW91czogcHJpb3IsXG4gICAgICBzdHJlYWtzOiBuZXcgTWFwKHN0cmVha1Jvd3MubWFwKChyKSA9PiBbci5waXBlbGluZUlkLCB7XG4gICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXM6IHIuY29uc2VjdXRpdmVGYWlsdXJlcyxcbiAgICAgICAgbGFzdFN1Y2Nlc3NBdDogci5sYXN0U3VjY2Vzc0F0LFxuICAgICAgfV0pKSxcbiAgICAgIGNvbmZpZ0NoYW5nZXMsXG4gICAgICAvLyBBbiB1bmF2YWlsYWJsZSBpbnB1dCBpcyBwYXNzZWQgYXMgQUJTRU5ULCBzbyB0aGUgZXZhbHVhdG9yIHNraXBzIGl0cyBydWxlXG4gICAgICAvLyByYXRoZXIgdGhhbiBldmFsdWF0aW5nIGl0IGFnYWluc3QgYW4gZW1wdHkgc2V0LlxuICAgICAgLi4uKHVuYXZhaWxhYmxlLmhhcygndnVsbmVyYWJsZV9wbHVnaW4nKSA/IHt9IDogeyB2dWxuZXJhYmxlUGlwZWxpbmVzOiBuZXcgU2V0KHZ1bG5lcmFibGUpIH0pLFxuICAgICAgLi4uKHVuYXZhaWxhYmxlLmhhcygnbm9fZGVwbG95X3RyYWNraW5nJykgPyB7fSA6IHsgdW50cmFja2VkUGlwZWxpbmVzOiBuZXcgU2V0KHVudHJhY2tlZCkgfSksXG4gICAgICB0aHJlc2hvbGRzOiB0aHJlc2hvbGRzRnJvbSh0aHJlc2hvbGRzKSxcbiAgICAgIG5vdzogbmV3IERhdGUoc2NvcGUudG8pLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtcyxcbiAgICAgIHRocmVzaG9sZHM6IHRocmVzaG9sZHNGcm9tKHRocmVzaG9sZHMpLFxuICAgICAgLy8gV2hhdCB0aGUgcnVsZXMgd2VyZSBldmFsdWF0ZWQgb3Zlciwgc28gYSByZWFkZXIgY2FuIHRlbGwgYW4gZW1wdHkgbGlzdFxuICAgICAgLy8gKFwibm90aGluZyB0cmlwcGVkXCIpIGZyb20gYW4gZW1wdHkgaW5wdXQgKFwibm90aGluZyByYW5cIikuXG4gICAgICBwaXBlbGluZXNFdmFsdWF0ZWQ6IGN1cnJlbnQubGVuZ3RoLFxuICAgICAgLy8gUnVsZXMgdGhhdCBjb3VsZCBOT1QgcnVuIHRoaXMgcGVyaW9kIGJlY2F1c2UgdGhlaXIgaW5wdXQgZmFpbGVkIHRvIGxvYWQuXG4gICAgICB1bmF2YWlsYWJsZVJ1bGVzOiBbLi4udW5hdmFpbGFibGVdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9yZydzIHN0b3JlZCBuZWVkcy1hdHRlbnRpb24gdGhyZXNob2xkcywgb3IgYHt9YC5cbiAgICpcbiAgICogUmV0dXJuZWQgYXMgYSBwYXJ0aWFsIG9uIHB1cnBvc2U6IGB0aHJlc2hvbGRzRnJvbWAgZmlsbHMgdGhlIHJlc3QgcGVyIGZpZWxkLCBzb1xuICAgKiBhbiBvcmcgdGhhdCBjb25maWd1cmVkIG9uZSBudW1iZXIga2VlcHMgdGhlIGRlZmF1bHRzIGZvciB0aGUgb3RoZXJzIGluc3RlYWQgb2ZcbiAgICogc2lsZW50bHkgZGlzYWJsaW5nIGZvdXIgcnVsZXMgYnkgc2V0dGluZyBvbmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGF0dGVudGlvblRocmVzaG9sZHMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoeyB0OiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydEF0dGVudGlvblRocmVzaG9sZHMgfSlcbiAgICAgICAgLmZyb20oc2NoZW1hLmRvcmFTZXR0aW5ncylcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsIG9yZ0lkKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgY29uc3Qgc3RvcmVkID0gKHJvd3MgYXMgQXJyYXk8eyB0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbCB9PilbMF0/LnQ7XG4gICAgcmV0dXJuIHN0b3JlZCAmJiB0eXBlb2Ygc3RvcmVkID09PSAnb2JqZWN0JyA/IHN0b3JlZCA6IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcmcncyBvd24gbWludXRlcy1zYXZlZC1wZXItcGlwZWxpbmUgYXNzdW1wdGlvbiwgb3IgbnVsbC5cbiAgICpcbiAgICogUmVhZCBoZXJlIHNvIHRoZSBhZG9wdGlvbiBzZWN0aW9uIGNhbm5vdCBhY2NpZGVudGFsbHkgYmUgaGFuZGVkIGFcbiAgICogcGxhdGZvcm0tY2hvc2VuIGRlZmF1bHQ6IHRoZSBudW1iZXIgb25seSBtZWFucyBzb21ldGhpbmcgd2hlbiB0aGUgY3VzdG9tZXJcbiAgICogcGlja2VkIGl0LCBhbmQgYG51bGxgIHJlbmRlcnMgYXMgXCJub3QgZXN0aW1hdGVkXCIgcmF0aGVyIHRoYW4gYXMgemVyby5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdGltZVNhdmVkQXNzdW1wdGlvbihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IG1pbnV0ZXM6IHNjaGVtYS5kb3JhU2V0dGluZ3MudGltZVNhdmVkTWludXRlc1BlclBpcGVsaW5lIH0pXG4gICAgICAgIC5mcm9tKHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLCBvcmdJZCkpXG4gICAgICAgIC5saW1pdCgxKSkpO1xuICAgIHJldHVybiAocm93cyBhcyBBcnJheTx7IG1pbnV0ZXM6IG51bWJlciB8IG51bGwgfT4pWzBdPy5taW51dGVzID8/IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBIb3cgbWFueSBwaXBlbGluZXMgdGhlIG5lZWRzLWF0dGVudGlvbiBydWxlcyBjb25zaWRlci5cbiAqXG4gKiBUaGUgc2VjdGlvbiBpcyBhIHNob3J0IGxpc3Qgb2YgdGhpbmdzIHRvIGRvLCBub3QgYSB0YWJsZSBvZiBldmVyeXRoaW5nLCBzbyB0aGVcbiAqIGV2YWx1YXRvciBzZWVzIHRoZSBzYW1lIHdvcnN0LWZpcnN0IHNsaWNlIHRoZSBicmVha2Rvd24gc2VjdGlvbiBzaG93cy4gQSBwaXBlbGluZVxuICogb3V0c2lkZSB0aGUgd29yc3QgMjUgYnkgdGhlIGJyZWFrZG93bidzIG93biBvcmRlcmluZyBpcyBub3QgdGhlIG9uZSBhIGxlYWQgc2hvdWxkXG4gKiBiZSB0b2xkIGFib3V0IGZpcnN0LlxuICovXG5jb25zdCBBVFRFTlRJT05fUElQRUxJTkVfTElNSVQgPSAyNTtcblxuLyoqXG4gKiBSdW4gYSByZWFkLCBvciBmYWxsIGJhY2suXG4gKlxuICogT25seSBmb3IgdGhlIG5lZWRzLWF0dGVudGlvbiBpbnB1dHMsIHdoZXJlIGFuIGFic2VudCBpbnB1dCBTS0lQUyBhIHJ1bGUgYW5kIHRoZVxuICogZXZhbHVhdG9yIHNheXMgc28uIE5ldmVyIHVzZWQgZm9yIGEgbnVtYmVyIHRoZSByZXBvcnQgcHJlc2VudHM6IGEgcXVlcnkgdGhhdCBmYWlsc1xuICogYW5kIHNpbGVudGx5IHJlYWRzIGFzIHplcm8gaXMgaG93IGEgcmVwb3J0IHN0YXRlcyBzb21ldGhpbmcgZmFsc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNvZnRlbjxUPihwOiBQcm9taXNlPFQ+LCBmYWxsYmFjazogVCwgb25GYWlsPzogKCkgPT4gdm9pZCk6IFByb21pc2U8VD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybignTmVlZHMtYXR0ZW50aW9uIGlucHV0IHVuYXZhaWxhYmxlOyBpdHMgcnVsZSBpcyBza2lwcGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgb25GYWlsPy4oKTtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydGluZ1NlcnZpY2UgPSBuZXcgUmVwb3J0aW5nU2VydmljZSgpO1xuIl19
890
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUUsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixzQkFBc0IsR0FFdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckcsT0FBTyxFQUNMLGNBQWMsSUFBSSxXQUFXLEVBQzdCLFlBQVksSUFBSSxTQUFTLEVBQ3pCLGNBQWMsSUFBSSxXQUFXLEdBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxZQUFZLElBQUksTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENB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QUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEcsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNYLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBpc29Pck51bGwsIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgYW5kLCBlcSwgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgZHJpenpsZVJvd3MgfSBmcm9tICcuL2NydWQtc2VydmljZS5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHgsIHJ1bldpdGhUZW5hbnRDb250ZXh0IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cbi8vIEV4dHJhY3RlZCBmb3Igc2l6ZSDigJQgc2VlIC4vcmVwb3J0aW5nLy4gRXZlcnl0aGluZyBwdWJsaWMgaXMgcmUtZXhwb3J0ZWQgYmVsb3dcbi8vIHNvIGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhYCdzIHN1cmZhY2UgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBzcGxpdC5cbmltcG9ydCB7XG4gIGdldEFkb3B0aW9uLFxuICBnZXRGYWlsdXJlQW5hbHlzaXMsXG4gIGdldE91dGRhdGVkUGx1Z2lucyxcbiAgZ2V0UGlwZWxpbmVCcmVha2Rvd24sXG4gIGdldFBpcGVsaW5lQ29uZmlnQ2hhbmdlcyxcbiAgZ2V0UGlwZWxpbmVTdHJlYWtzLFxuICBnZXRQbHVnaW5WdWxuZXJhYmlsaXRpZXMsXG4gIGdldFByb21vdGlvblZpZXcsXG4gIGdldFJlc291cmNlQ29uc3VtcHRpb24sXG4gIGdldFN0YWdlUGVyZm9ybWFuY2UsXG4gIGdldFVudHJhY2tlZFBpcGVsaW5lcyxcbiAgZ2V0VnVsbmVyYWJsZVBpcGVsaW5lcyxcbiAgdHlwZSBBbmFseXRpY3NTY29wZSxcbn0gZnJvbSAnLi9yZXBvcnRpbmcvYW5hbHl0aWNzLXF1ZXJpZXMuanMnO1xuaW1wb3J0IHsgaW52ZW50b3J5Q2FjaGUsIGludmFsaWRhdGVPcmdSZXBvcnRzIH0gZnJvbSAnLi9yZXBvcnRpbmcvY2FjaGVzLmpzJztcbmltcG9ydCB7IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLCByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyB9IGZyb20gJy4vcmVwb3J0aW5nL2RvcmEtc2NvcmluZy5qcyc7XG5pbXBvcnQge1xuICBnZXREb3JhTWV0cmljcyBhcyBkb3JhTWV0cmljcyxcbiAgZ2V0RG9yYVRyZW5kIGFzIGRvcmFUcmVuZCxcbiAgZ2V0QnVpbGRIZWFsdGggYXMgYnVpbGRIZWFsdGgsXG59IGZyb20gJy4vcmVwb3J0aW5nL2RvcmEuanMnO1xuLy8gQWxpYXNlZDogdGhlIG1vZHVsZSBmdW5jdGlvbnMgYW5kIHRoZSBkZWxlZ2F0aW5nIG1ldGhvZHMgYmVsb3cgc2hhcmUgbmFtZXMuXG5pbXBvcnQgeyBpbmdlc3RFdmVudHMgYXMgaW5nZXN0IH0gZnJvbSAnLi9yZXBvcnRpbmcvaW5nZXN0LmpzJztcbmltcG9ydCB7IGdldExhc3REZXBsb3llZENvbW1pdCBhcyBsYXN0RGVwbG95ZWRDb21taXQgfSBmcm9tICcuL3JlcG9ydGluZy9sYXN0LWRlcGxveS5qcyc7XG5pbXBvcnQgdHlwZSB7IExhc3REZXBsb3llZENvbW1pdCB9IGZyb20gJy4vcmVwb3J0aW5nL2xhc3QtZGVwbG95LmpzJztcbmltcG9ydCB7IGV2YWx1YXRlTmVlZHNBdHRlbnRpb24sIHRocmVzaG9sZHNGcm9tLCB0eXBlIEF0dGVudGlvblJ1bGVJZCB9IGZyb20gJy4vcmVwb3J0aW5nL25lZWRzLWF0dGVudGlvbi5qcyc7XG5pbXBvcnQge1xuICBnZXRQbHVnaW5SdW50aW1lIGFzIHBsdWdpblJ1bnRpbWUsXG4gIGdldFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUgYXMgcGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSxcbiAgaGFzVmVyaWZpZWRQbHVnaW5Vc2UgYXMgdmVyaWZpZWRQbHVnaW5Vc2UsXG59IGZyb20gJy4vcmVwb3J0aW5nL3BsdWdpbi1ydW50aW1lLmpzJztcbmltcG9ydCB7IHJlcG9ydCB9IGZyb20gJy4vcmVwb3J0aW5nL3F1ZXJ5LXNjb3BlLmpzJztcbmltcG9ydCB7IHB1cmdlRXhwaXJlZFJlcG9ydGluZ0RhdGEgYXMgcHVyZ2VSZXBvcnRpbmdSZXRlbnRpb24gfSBmcm9tICcuL3JlcG9ydGluZy9yZXRlbnRpb24tc3dlZXAuanMnO1xuaW1wb3J0IHsgUkVQT1JUSU5HX0VWRU5UX1JFVEVOVElPTl9EQVlTLCBSRVBPUlRJTkdfRE9SQV9SRVRFTlRJT05fREFZUyB9IGZyb20gJy4vcmVwb3J0aW5nL3JldGVudGlvbi5qcyc7XG5pbXBvcnQgeyBhc3NlcnRSZXBvcnRJbnRlcnZhbCwgYnVja2V0S2V5LCBwZXJpb2RCdWNrZXQsIHNjcnViT3B0aW9uYWwsIG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UsIHN0YXJ0ZWRBdFdpbmRvdyB9IGZyb20gJy4vcmVwb3J0aW5nL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRXhlY3V0aW9uQ291bnQsIFRpbWVTZXJpZXNFbnRyeSwgRHVyYXRpb25TdGF0cywgUGlwZWxpbmVFeGVjdXRpb24sIFN0YWdlRmFpbHVyZSwgU3RhZ2VCb3R0bGVuZWNrLFxuICBBY3Rpb25GYWlsdXJlLCBFcnJvckVudHJ5LCBQbHVnaW5TdW1tYXJ5LCBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiwgVmVyc2lvbkNvdW50LFxuICBCdWlsZFRpbWVTZXJpZXNFbnRyeSwgQnVpbGREdXJhdGlvbiwgQnVpbGRGYWlsdXJlLFxuICBQbHVnaW5SdW50aW1lQWdncmVnYXRlLCBQbHVnaW5SdW50aW1lRmlsdGVyLCBQbHVnaW5SdW50aW1lU3RhdHMsXG4gIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMsIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cyxcbiAgRG9yYU9wdGlvbnMsIFJlcG9ydGluZ1NldHRpbmdzLCBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLCBJbmNpZGVudExpc3RJdGVtLCBJbmNpZGVudFRlc3RSZXN1bHQsXG4gIERvcmFNZXRyaWNzLCBEb3JhVHJlbmRQb2ludCwgQnVpbGRIZWFsdGgsIEluY2lkZW50SW5wdXQsIEluY2lkZW50V3JpdGUsIERlcGxveW1lbnRPdXRjb21lV3JpdGUsXG4gIEluZ2VzdENhbGxlciwgSW5nZXN0RXZlbnQsIEluZ2VzdE1ldHJpYywgSW5nZXN0UmVzdWx0LCBJbmdlc3RIZWFsdGhTdGF0dXMsXG4gIEJ1Y2tldE9wdGlvbnMsXG59IGZyb20gJy4vcmVwb3J0aW5nL3R5cGVzLmpzJztcblxuLy8gVGhlIHJlcG9ydGluZyB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBwYWNrYWdlIEFQSS4gRW51bWVyYXRlZCByYXRoZXIgdGhhblxuLy8gYGV4cG9ydCAqYCBiZWNhdXNlIHRoZSByZXBvcnRpbmcgbW9kdWxlcyBhbHNvIGV4cG9ydCBpbnRlcm5hbHMgKG9yZ1Njb3BlLFxuLy8gcnVuUmVwb3J0LCB0aGUgY2FjaGVzLCB0aGUgRE9SQSByb3cgc2hhcGVzKSB0aGF0IG11c3Qgc3RheSBwcml2YXRlLlxuZXhwb3J0IHR5cGUgeyBMYXN0RGVwbG95ZWRDb21taXQgfSBmcm9tICcuL3JlcG9ydGluZy9sYXN0LWRlcGxveS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEJ1Y2tldE9wdGlvbnMsXG4gIEJ1aWxkSGVhbHRoLCBCdWlsZEhlYWx0aFN0YWdlLCBEb3JhRW52TWV0cmljcywgRG9yYUxldmVsLCBEb3JhTWV0cmljcywgRG9yYU9wdGlvbnMsIERvcmFUcmVuZFBvaW50LFxuICBEZXBsb3ltZW50T3V0Y29tZVdyaXRlLCBJbmNpZGVudElucHV0LCBJbmNpZGVudExpc3RJdGVtLCBJbmNpZGVudFN0YXRlLCBJbmNpZGVudFdyaXRlLCBSZXBvcnRpbmdTZXR0aW5ncywgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICBJbmdlc3RDYWxsZXIsIEluZ2VzdEV2ZW50LCBJbmdlc3RIZWFsdGhTdGF0dXMsIEluZ2VzdE1ldHJpYywgSW5nZXN0UmVzdWx0LFxuICBQbHVnaW5SdW50aW1lQWdncmVnYXRlLCBQbHVnaW5SdW50aW1lRmlsdGVyLCBQbHVnaW5SdW50aW1lU3RhdHMsXG4gIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cywgUmVwb3J0aW5nUmV0ZW50aW9uT3B0aW9ucywgUmVwb3J0aW5nUmV0ZW50aW9uU2V0dGluZ3MsXG4gIFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gsXG59IGZyb20gJy4vcmVwb3J0aW5nL3R5cGVzLmpzJztcblxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcG9ydGluZy1zZXJ2aWNlJyk7XG5cbmV4cG9ydCBjbGFzcyBSZXBvcnRpbmdTZXJ2aWNlIHtcblxuICAvKiogSW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlcG9ydHMgZm9yIGFuIG9yZyAoY2FsbCBhZnRlciBldmVudCBpbmdlc3QpLiAqL1xuICBhc3luYyBpbnZhbGlkYXRlT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBpbnZhbGlkYXRlT3JnUmVwb3J0cyhvcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBpbmNvbWluZyBldmVudHMgYWdhaW5zdCB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIGJhdGNoLWluc2VydCB0aGVcbiAgICogbWF0Y2hlZCBvbmVzLCBhbmQgaW52YWxpZGF0ZSByZXBvcnRpbmcgY2FjaGVzIGZvciBhZmZlY3RlZCBvcmdzLlxuICAgKiBTZWUgLi9yZXBvcnRpbmcvaW5nZXN0LnRzIOKAlCB0aGUgY2FsbGVyIG11c3QgYWxyZWFkeSBob2xkIGEgc3lzYWRtaW5cbiAgICogdGVuYW50IHNjb3BlLCBiZWNhdXNlIGEgYmF0Y2ggc3BhbnMgd2hhdGV2ZXIgb3JncyB0aGUgcmVnaXN0cnkgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICBhc3luYyBpbmdlc3RFdmVudHMoZXZlbnRzOiBJbmdlc3RFdmVudFtdLCBvbk1ldHJpYz86IChtOiBJbmdlc3RNZXRyaWMpID0+IHZvaWQsIGNhbGxlcj86IEluZ2VzdENhbGxlcik6IFByb21pc2U8SW5nZXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIGluZ2VzdChldmVudHMsIG9uTWV0cmljLCBjYWxsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgc2hhIG9mIHRoaXMgcGlwZWxpbmUncyBsYXN0IHN1Y2Nlc3NmdWwgZGVwbG95IOKAlCB0byBgZW52aXJvbm1lbnRgXG4gICAqIHdoZW4gZ2l2ZW4sIHRvIGFueXdoZXJlIG90aGVyd2lzZS4gVGhlIGV4Y2x1c2l2ZSBsb3dlciBib3VuZCBmb3IgXCJjb21taXRzXG4gICAqIHNpbmNlIHRoZSBsYXN0IGRlcGxveVwiLiBUZW5hbmN5IGlzIGVuZm9yY2VkIGZyb20gYGNhbGxlcmAgZXhhY3RseSBhc1xuICAgKiB7QGxpbmsgaW5nZXN0RXZlbnRzfSBkb2VzIGl0LlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdERlcGxveWVkQ29tbWl0KHBpcGVsaW5lSWQ6IHN0cmluZywgZW52aXJvbm1lbnQ/OiBzdHJpbmcsIGNhbGxlcj86IEluZ2VzdENhbGxlcik6IFByb21pc2U8TGFzdERlcGxveWVkQ29tbWl0PiB7XG4gICAgcmV0dXJuIGxhc3REZXBsb3llZENvbW1pdChwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgY2FsbGVyKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuXG4gIC8qKiBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9KTogUHJvbWlzZTxFeGVjdXRpb25Db3VudFtdPiB7XG4gICAgLy8gT3B0aW9uYWwgW2Zyb20sdG9dIHdpbmRvdyBvbiB0aGUgZXhlY3V0aW9uJ3Mgc3RhcnRlZF9hdCwgbWlycm9yaW5nIHRoZVxuICAgIC8vIHNpYmxpbmcgdGltZXNlcmllcyByZXBvcnRzIHNvIHRoZSBkYXNoYm9hcmQgZGF0ZS1yYW5nZSBwaWNrZXIgbmFycm93cyB0aGVcbiAgICAvLyBjb3VudCB0b28gKGFuIGVtcHR5IHJhbmdlID0gYWxsLXRpbWUsIHByZXNlcnZpbmcgdGhlIHByaW9yIGJlaGF2aW9yKS4gVGhlXG4gICAgLy8gcmFuZ2UgcmlkZXMgdGhlIEpPSU4gc28gcGlwZWxpbmVzIHdpdGggbm8gaW4td2luZG93IGV2ZW50cyBzdGlsbCBsaXN0XG4gICAgLy8gKExFRlQgc2VtYW50aWNzIHByZXNlcnZlZCB2aWEgdGhlIGlubmVyLWpvaW4gZmlsdGVyIOKAlCBhIHBpcGVsaW5lIHdpdGggemVyb1xuICAgIC8vIG1hdGNoaW5nIGV2ZW50cyBkcm9wcyBmcm9tIHRoZSBjb3VudCwgc2FtZSBhcyBiZWZvcmUgZm9yIGl0cyB3aW5kb3cpLlxuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gb3B0aW9uYWxTdGFydGVkQXRSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIHJlcG9ydDxFeGVjdXRpb25Db3VudD4oYGV4ZWMtY291bnQ6JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBwLmlzX2FjdGl2ZSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgcC5pZFxuICAgICAgICBPUkRFUiBCWSB0b3RhbCBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItcGlwZWxpbmUgZXhlY3V0aW9uIGhpc3Rvcnkg4oCUIERJU1RJTkNUIGV4ZWN1dGlvbnMgZm9yIG9uZSBwaXBlbGluZSxcbiAgICogbmV3ZXN0IGZpcnN0LiBHcm91cHMgYWxsIGV2ZW50cyBieSBgZXhlY3V0aW9uX2lkYCBpbiBhIHNpbmdsZSBzY2FuIGFuZFxuICAgKiByb2xscyBlYWNoIGV4ZWN1dGlvbiB1cCB0byBvbmUgcm93OlxuICAgKiAgIC0gc3RhdHVzOiBkZXJpdmVkIGZyb20gdGhlIFBJUEVMSU5FLXR5cGUgZXZlbnRzLiBGQUlMRUQgd2lucywgdGhlblxuICAgKiAgICAgU1VDQ0VFREVELCB0aGVuIENBTkNFTEVEOyBhbiBleGVjdXRpb24gd2l0aCBubyB0ZXJtaW5hbCBQSVBFTElORSBldmVudFxuICAgKiAgICAgaXMgc3RpbGwgYGluLXByb2dyZXNzYC5cbiAgICogICAtIHN0YXJ0ZWRBdC9lbmRlZEF0L2R1cmF0aW9uTXM6IGZyb20gdGhlIFBJUEVMSU5FIGxpZmVjeWNsZSBldmVudHMuXG4gICAqICAgLSBmYWlsaW5nU3RhZ2UvZmFpbGluZ0FjdGlvbjogdGhlIGZpcnN0IEZBSUxFRCBTVEFHRS9BQ1RJT04gZXZlbnQgKGNoZWFwIOKAlFxuICAgKiAgICAgc2FtZSBzY2FuLCBubyBleHRyYSBxdWVyeSkuXG4gICAqXG4gICAqIE9SRy1TQ09QSU5HOiBpZGVudGljYWwgdG8gdGhlIHNpYmxpbmcgZXhlY3V0aW9uIHJlcG9ydHMg4oCUIGpvaW5zIHRoZSBwaXBlbGluZVxuICAgKiByZWdpc3RyeSB0YWJsZSAoYHBpcGVsaW5lYCkgYW5kIGdhdGVzIG9uIGBwLm9yZ19pZCAke3ByZWR9YCwgd2hlcmUgYHByZWRgIGlzXG4gICAqIHRoZSBzaW5nbGUtb3JnIGA9ICRvcmdgIG9yICh3aXRoIGEgcm9sbHVwKSBhbiBgSU4gKC4uLilgIG92ZXIgdGhlIG9yZ+KGknRlYW1cbiAgICogc3VidHJlZS4gQSBwaXBlbGluZUlkIGJlbG9uZ2luZyB0byBhbm90aGVyIG9yZyB5aWVsZHMgemVybyByb3dzLlxuICAgKi9cbiAgYXN5bmMgbGlzdFBpcGVsaW5lRXhlY3V0aW9ucyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSxcbiAgICBsaW1pdDogbnVtYmVyID0gNTAsXG4gICk6IFByb21pc2U8UGlwZWxpbmVFeGVjdXRpb25bXT4ge1xuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gb3B0aW9uYWxTdGFydGVkQXRSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIHJlcG9ydDxQaXBlbGluZUV4ZWN1dGlvbj4oYHBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICBDQVNFXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykgVEhFTiAnZmFpbGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpIFRIRU4gJ3N1Y2NlZWRlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpIFRIRU4gJ2NhbmNlbGVkJ1xuICAgICAgICAgICAgRUxTRSAnaW4tcHJvZ3Jlc3MnXG4gICAgICAgICAgRU5EIEFTIHN0YXR1cyxcbiAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjp0ZXh0IEFTIHN0YXJ0ZWRfYXQsXG4gICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjp0ZXh0IEFTIGVuZGVkX2F0LFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjppbnQgQVMgZHVyYXRpb25fbXMsXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLnN0YWdlX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfc3RhZ2UsXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLmFjdGlvbl9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19hY3Rpb24sXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLmRldGFpbC0+J2ZhaWx1cmUnKSBGSUxURVIgKFdIRVJFIGUuZGV0YWlsID8gJ2ZhaWx1cmUnKSlbMV0gQVMgZmFpbHVyZVxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfSBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZFxuICAgICAgICBPUkRFUiBCWSBNQVgoZS5jcmVhdGVkX2F0KSBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBTdWNjZXNzIHJhdGUgb3ZlciB0aW1lIGZvciBhbiBvcmcuICovXG4gIGFzeW5jIGdldFN1Y2Nlc3NSYXRlKFxuICAgIG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgYnVja2V0OiBCdWNrZXRPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8VGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgY29uc3QgeyB0eiA9ICdVVEMnLCB3ZWVrU3RhcnQgPSAnbW9uZGF5JyB9ID0gYnVja2V0O1xuICAgIC8vIFRoZSBidWNrZXRpbmcgc2V0dGluZ3MgYXJlIHBhcnQgb2YgdGhlIGNhY2hlIEtFWTogd2l0aG91dCB0aGVtIGEgQ2hpY2Fnb1xuICAgIC8vIHJlcXVlc3QgYW5kIGEgVVRDIHJlcXVlc3Qgc2hhcmUgYW4gZW50cnkgYW5kIG9uZSBvZiB0aGVtIGdldHMgdGhlIG90aGVyJ3Mgd2Vla3MuXG4gICAgcmV0dXJuIHJlcG9ydDxUaW1lU2VyaWVzRW50cnk+KGBzdWNjZXNzLXJhdGU6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke2J1Y2tldEtleSh0eiwgd2Vla1N0YXJ0KX1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3BlcmlvZEJ1Y2tldChpbnRlcnZhbCwgc3FsYGUuc3RhcnRlZF9hdGAsIHR6LCB3ZWVrU3RhcnQpfTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8RHVyYXRpb25TdGF0cz4oYGF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1JTihlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1pbl9tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuOTUpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZS5kdXJhdGlvbl9tcyk6OmludCBBUyBwOTVfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBleGVjdXRpb25zXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwLmlkIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VGYWlsdXJlW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PFN0YWdlRmFpbHVyZT4oYHN0YWdlLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgZmFpbHVyZV9wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5zdGFnZV9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3RpbmN0IGRlcGxveSBgZW52aXJvbm1lbnRgIHZhbHVlcyBvYnNlcnZlZCBpbiB0aGUgd2luZG93IOKAlCBwb3dlcnMgdGhlXG4gICAqIERPUkEgZW52aXJvbm1lbnQtc2NvcGUgZGF0YWxpc3QuIE9yZy1zY29wZWQgKyByb2xsdXAtYXdhcmUgbGlrZSB0aGUgc2libGluZ1xuICAgKiByZXBvcnRzOyBvbmx5IG5vbi1udWxsIGVudmlyb25tZW50cyAoaS5lLiBkZXBsb3ktYXR0cmlidXRlZCBleGVjdXRpb25zKS5cbiAgICovXG4gIGFzeW5jIGdldFJlcG9ydEVudmlyb25tZW50cyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCByZXBvcnQ8eyBlbnZpcm9ubWVudDogc3RyaW5nIH0+KGByZXBvcnQtZW52czoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUIERJU1RJTkNUIGUuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIE9SREVSIEJZIGVudmlyb25tZW50XG4gICAgICBgKTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LmVudmlyb25tZW50KTtcbiAgfVxuXG4gIC8qKiBTdGFnZSBib3R0bGVuZWNrcyDigJQgc2xvd2VzdCBzdGFnZXMgcGVyIHBpcGVsaW5lLiAqL1xuICBhc3luYyBnZXRTdGFnZUJvdHRsZW5lY2tzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFN0YWdlQm90dGxlbmVja1tdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxTdGFnZUJvdHRsZW5lY2s+KGBzdGFnZS1ib3R0bGVuZWNrczoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5waXBlbGluZV9uYW1lLCBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcC5pZCwgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBBY3Rpb24gZmFpbHVyZSByYXRlIOKAlCB3aGljaCBwbHVnaW4gc3RlcHMgZmFpbCBtb3N0LiAqL1xuICBhc3luYyBnZXRBY3Rpb25GYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxBY3Rpb25GYWlsdXJlW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PEFjdGlvbkZhaWx1cmU+KGBhY3Rpb24tZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuYWN0aW9uX25hbWUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgZmFpbHVyZV9wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuYWN0aW9uX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVycm9yIGNhdGVnb3JpemF0aW9uIOKAlCBncm91cCBmYWlsdXJlIG1lc3NhZ2VzLiBFeGVjdXRpb24gcmVwb3J0LCBzb1xuICAgKiByb2xsdXAtYXdhcmUgZXhhY3RseSBsaWtlIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzOiB3aXRoIGBvcmdJZHNgXG4gICAqICh0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlKSB0aGUgb3JnIGdhdGUgYmVjb21lcyBhbiBgSU4gKC4uLilgIGFuZCB0aGUgcmVhZCBydW5zXG4gICAqIGZyZXNoIHVuZGVyIHN5c2FkbWluIHZpYSBgcnVuUmVwb3J0YDsgc2luZ2xlLW9yZyByZWFkcyBrZWVwIHRoZSBwZXItb3JnIGNhY2hlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RXJyb3JzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8RXJyb3JFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxFcnJvckVudHJ5PihgZXJyb3JzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBTVUJTVFJJTkcoZS5lcnJvcl9tZXNzYWdlIEZST00gMSBGT1IgMjAwKSBBUyBlcnJvcl9wYXR0ZXJuLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgQ09VTlQoRElTVElOQ1QgZS5waXBlbGluZV9pZCk6OmludCBBUyBhZmZlY3RlZF9waXBlbGluZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcgQU5EIGUuZXJyb3JfbWVzc2FnZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIGVycm9yX3BhdHRlcm4gT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvdXIgRE9SQSBtZWFzdXJlcyBwbHVzIHRoZWlyIHBlci1lbnZpcm9ubWVudCBicmVha2Rvd24uXG4gICAqIEltcGxlbWVudGF0aW9uIGluIC4vcmVwb3J0aW5nL2RvcmEudHMg4oCUIHNlZSB0aGF0IGZpbGUncyBoZWFkZXIgZm9yIHdoeS5cbiAgICovXG4gIGdldERvcmFNZXRyaWNzKFxuICAgIG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYU1ldHJpY3M+IHtcbiAgICByZXR1cm4gZG9yYU1ldHJpY3Mob3JnSWQsIGZyb20sIHRvLCBvcmdJZHMsIG9wdHMpO1xuICB9XG5cbiAgLyoqIERPUkEgbWVhc3VyZXMgYnVja2V0ZWQgb3ZlciB0aW1lLiAqL1xuICBnZXREb3JhVHJlbmQoXG4gICAgb3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSwgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxEb3JhVHJlbmRQb2ludFtdPiB7XG4gICAgcmV0dXJuIGRvcmFUcmVuZChvcmdJZCwgaW50ZXJ2YWwsIGZyb20sIHRvLCBvcmdJZHMsIG9wdHMpO1xuICB9XG5cbiAgLyoqIFBlci1waXBlbGluZSBidWlsZCBoZWFsdGggKHN0YWdlIHBhc3MgcmF0ZXMgb3ZlciBhIHdpbmRvdykuICovXG4gIGdldEJ1aWxkSGVhbHRoKFxuICAgIG9yZ0lkOiBzdHJpbmcsIHBpcGVsaW5lSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxCdWlsZEhlYWx0aD4ge1xuICAgIHJldHVybiBidWlsZEhlYWx0aChvcmdJZCwgcGlwZWxpbmVJZCwgZnJvbSwgdG8sIG9yZ0lkcyk7XG4gIH1cblxuICBhc3luYyBnZXRQbHVnaW5TdW1tYXJ5KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFBsdWdpblN1bW1hcnk+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1zdW1tYXJ5YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSk6OmludCBBUyBhY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBOT1QgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSk6OmludCBBUyBpbmFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi52aXNpYmlsaXR5fSA9ICdwdWJsaWMnKTo6aW50IEFTIHB1YmxpYyxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi52aXNpYmlsaXR5fSA9ICdvcmcnKTo6aW50IEFTIG9yZyxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi52aXNpYmlsaXR5fSA9ICdwcml2YXRlJyk6OmludCBBUyBwcml2YXRlLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUICR7c2NoZW1hLnBsdWdpbi5uYW1lfSk6OmludCBBUyB1bmlxdWVfbmFtZXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfVxuICAgICAgYCkpO1xuICAgICAgcmV0dXJuIChkcml6emxlUm93czxQbHVnaW5TdW1tYXJ5Pihyb3dzLnJvd3MpWzBdIHx8IHsgdG90YWw6IDAsIGFjdGl2ZTogMCwgaW5hY3RpdmU6IDAsIHB1YmxpYzogMCwgb3JnOiAwLCBwcml2YXRlOiAwLCB1bmlxdWVOYW1lczogMCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUeXBlICYgY29tcHV0ZSBkaXN0cmlidXRpb24uXG4gICAqICBJTlRFTlRJT05BTExZIFNJTkdMRS1PUkcgKG5vIHJvbGx1cCk6IHBsdWdpbiBpbnZlbnRvcnkgaXMgcGVyLW9yZyAoc2VlXG4gICAqICBnZXRQbHVnaW5TdW1tYXJ5KS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuICBhc3luYyBnZXRQbHVnaW5EaXN0cmlidXRpb24ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VHlwZUNvbXB1dGVEaXN0cmlidXRpb25bXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLWRpc3RyaWJ1dGlvbmAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9IEFTIHBsdWdpbl90eXBlLFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX0gQVMgY29tcHV0ZV90eXBlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgY291bnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9LCAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9XG4gICAgICAgIE9SREVSIEJZIGNvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbj4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogVmVyc2lvbiBjb3VudHMgcGVyIHBsdWdpbiBuYW1lLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIHBlci1vcmcgKHNlZVxuICAgKiAgZ2V0UGx1Z2luU3VtbWFyeSkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luVmVyc2lvbnMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VmVyc2lvbkNvdW50W10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi12ZXJzaW9uc2AsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLm5hbWV9LFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdmVyc2lvbl9jb3VudCxcbiAgICAgICAgICAtLSBIaWdoZXN0IHZlcnNpb24gYnkgTlVNRVJJQyBzZW12ZXIgY29yZSAobm90IGxleGljYWw6ICcxMC4wLjAnID4gJzkuMC4wJykuXG4gICAgICAgICAgLS0gU3RyaXAgYW55IC1wcmVyZWxlYXNlLytidWlsZCBzdWZmaXggYmVmb3JlIHRoZSBpbnRbXSBjYXN0IHNvIGl0IGNhbid0XG4gICAgICAgICAgLS0gZXJyb3Igb24gdmFsaWQgc2VtdmVyOyBrZWVwIHRoZSBvcmlnaW5hbCBzdHJpbmcgZm9yIGRpc3BsYXkuXG4gICAgICAgICAgLS0gR1VBUkQ6IGEgbm9uLW51bWVyaWMtZG90dGVkIHZlcnNpb24gKCdsYXRlc3QnLCAnJywgJ3YxJykgd291bGQgbWFrZSB0aGVcbiAgICAgICAgICAtLSA6OmludFtdIGNhc3QgdGhyb3cgYW5kIGJsb3cgdXAgdGhlIFdIT0xFIG9yZyBzdW1tYXJ5LiBPbmx5IGNhc3Qgcm93c1xuICAgICAgICAgIC0tIHdob3NlIHN0cmlwcGVkIGNvcmUgbWF0Y2hlcyBhIG51bWVyaWMtZG90dGVkIHNoYXBlOyBzb3J0IGV2ZXJ5dGhpbmdcbiAgICAgICAgICAtLSBlbHNlIHRvIHRoZSBib3R0b20gdmlhIGEgc2VudGluZWwgQVJSQVlbLTFdIHNvIHRoZSByb3cgc3RpbGwgY291bnRzLlxuICAgICAgICAgIChhcnJheV9hZ2coJHtzY2hlbWEucGx1Z2luLnZlcnNpb259XG4gICAgICAgICAgICAgT1JERVIgQlkgQ0FTRVxuICAgICAgICAgICAgICAgV0hFTiByZWdleHBfcmVwbGFjZSgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0sICdbLStdLiokJywgJycpIH4gJ15bMC05XSsoWy5dWzAtOV0rKSokJ1xuICAgICAgICAgICAgICAgICBUSEVOIHN0cmluZ190b19hcnJheShyZWdleHBfcmVwbGFjZSgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0sICdbLStdLiokJywgJycpLCAnLicpOjppbnRbXVxuICAgICAgICAgICAgICAgRUxTRSBBUlJBWVstMV1cbiAgICAgICAgICAgICBFTkQgREVTQ1xuICAgICAgICAgICkpWzFdIEFTIGxhdGVzdF92ZXJzaW9uLFxuICAgICAgICAgIGJvb2xfb3IoJHtzY2hlbWEucGx1Z2luLmlzRGVmYXVsdH0pIEFTIGhhc19kZWZhdWx0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5uYW1lfVxuICAgICAgICBPUkRFUiBCWSB2ZXJzaW9uX2NvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxWZXJzaW9uQ291bnQ+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUuXG4gICAqXG4gICAqIFNUQVRVUyBDQVNJTkcgTk9URTogVGhpcyBxdWVyeSBmaWx0ZXJzIGJ5IGBldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJ2BcbiAgICogYW5kIHVzZXMgbG93ZXJjYXNlIHN0YXR1cyB2YWx1ZXMgKGAnY29tcGxldGVkJ2AsIGAnZmFpbGVkJ2ApLCB3aGlsZVxuICAgKiBgZ2V0U3VjY2Vzc1JhdGVgICgxLjIpIGZpbHRlcnMgYnkgYGV2ZW50X3R5cGUgPSAnUElQRUxJTkUnYCB3aXRoXG4gICAqIHVwcGVyY2FzZSBBV1Mtc3R5bGUgc3RhdHVzZXMgKGAnU1VDQ0VFREVEJ2AsIGAnRkFJTEVEJ2AsIGAnQ0FOQ0VMRUQnYCkuXG4gICAqIFRoZSBjYXNpbmcgZHJpZnQgaXMgaW50ZW50aW9uYWwgYW5kIHRyYWNrcyB0aGUgcHJvZHVjZXI6XG4gICAqICAgLSBgcGx1Z2luLWJ1aWxkYCBldmVudHMgY29tZSBmcm9tIG91ciBvd24gYnVpbGQgcGlwZWxpbmUgKGxvd2VyY2FzZSlcbiAgICogICAtIGBQSVBFTElORWAgZXZlbnRzIGNvbWUgZnJvbSBBV1MgQ29kZVBpcGVsaW5lICh1cHBlcmNhc2UpXG4gICAqIFRoZSBpbmdlc3QgWm9kIHNjaGVtYSBhdCBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzXG4gICAqIFNIT1VMRCBlbnVtIHRoZXNlIHBlci1ldmVudFNvdXJjZSBzbyB3ZSBjYXRjaCBkcmlmdCBhdCBpbmdlc3QgcmF0aGVyXG4gICAqIHRoYW4gc2lsZW50bHkgcHJvZHVjaW5nIHplcm8gcm93cyBoZXJlLiBTZWUgZmluZGluZ3MgTjcxLlxuICAgKi9cbiAgYXN5bmMgZ2V0QnVpbGRTdWNjZXNzUmF0ZShcbiAgICBvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIGJ1Y2tldDogQnVja2V0T3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPEJ1aWxkVGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgY29uc3QgeyB0eiA9ICdVVEMnLCB3ZWVrU3RhcnQgPSAnbW9uZGF5JyB9ID0gYnVja2V0O1xuICAgIC8vIEJ1aWxkIGFjdGl2aXR5IHJlcG9ydCDigJQgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIGV4ZWN1dGlvbiByZXBvcnRzLiBUaGVzZVxuICAgIC8vIHJvd3MgYXJlIGdhdGVkIG9uIHRoZSBwaXBlbGluZV9ldmVudCBgb3JnX2lkYCBkaXJlY3RseSAobm8gcGlwZWxpbmUgam9pbiksXG4gICAgLy8gc28gYHByZWRgIGFwcGxpZXMgdG8gYGUub3JnX2lkYC5cbiAgICByZXR1cm4gcmVwb3J0PEJ1aWxkVGltZVNlcmllc0VudHJ5PihgYnVpbGQtc3VjY2Vzczoke2ludGVydmFsfToke2Zyb219OiR7dG99OiR7YnVja2V0S2V5KHR6LCB3ZWVrU3RhcnQpfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7cGVyaW9kQnVja2V0KGludGVydmFsLCBzcWxgZS5zdGFydGVkX2F0YCwgdHosIHdlZWtTdGFydCl9Ojp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnZmFpbGVkJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdjb21wbGV0ZWQnLCAnZmFpbGVkJylcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBkdXJhdGlvbiBwZXIgcGx1Z2luLiBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZS4gKi9cbiAgYXN5bmMgZ2V0QnVpbGREdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZER1cmF0aW9uW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PEJ1aWxkRHVyYXRpb24+KGBidWlsZC1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGJ1aWxkc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBmYWlsdXJlcyDigJQgdG9wIGVycm9yIG1lc3NhZ2VzLiBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZS4gKi9cbiAgYXN5bmMgZ2V0QnVpbGRGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZEZhaWx1cmU+KGBidWlsZC1mYWlsdXJlczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgZS5lcnJvcl9tZXNzYWdlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUsIGUuZXJyb3JfbWVzc2FnZVxuICAgICAgICBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQbHVnaW4gcnVudGltZSB0ZWxlbWV0cnkg4oCUIHNlZSAuL3JlcG9ydGluZy9wbHVnaW4tcnVudGltZS50cyDilIDilIBcblxuICAvKipcbiAgICogUGx1Z2luIHJ1bnRpbWU6IHBlciBwbHVnaW4gdmVyc2lvbiBydW5zLCBzdWNjZXNzIHJhdGUgYW5kIHA1MC9wOTVcbiAgICogZHVyYXRpb24gb3ZlciBgW2Zyb20sIHRvXWAsIGZyb20gdGhlIG1hbmlmZXN0LWF0dHJpYnV0ZWQgQUNUSU9OIGV2ZW50cy5cbiAgICogUm9sbHVwLWF3YXJlLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGx1Z2luUnVudGltZShvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGZpbHRlcj86IFBsdWdpblJ1bnRpbWVGaWx0ZXIsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5SdW50aW1lU3RhdHNbXT4ge1xuICAgIHJldHVybiBwbHVnaW5SdW50aW1lKG9yZ0lkLCBmcm9tLCB0bywgZmlsdGVyLCBvcmdJZHMpO1xuICB9XG5cbiAgLyoqIENyb3NzLW9yZyAzMC1kYXkgcnVudGltZSBhZ2dyZWdhdGUgZm9yIGEgYChwdWJsaXNoZXIsIG5hbWUpYCBsaXN0aW5nIChwbHVnaW5fc3RhdHMgaW5wdXQpLiBTZXJ2aWNlIGNhbGxlcnMgb25seS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luUnVudGltZUFnZ3JlZ2F0ZShwdWJsaXNoZXI6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5SdW50aW1lQWdncmVnYXRlPiB7XG4gICAgcmV0dXJuIHBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUocHVibGlzaGVyLCBuYW1lKTtcbiAgfVxuXG4gIC8qKiBSZXZpZXcgXCJ2ZXJpZmllZCB1c2VcIjogYG9yZ0lkYCByYW4gYChwdWJsaXNoZXIsIG5hbWUpYCBzdWNjZXNzZnVsbHkgd2l0aGluIDkwIGRheXMuIFNlcnZpY2UgY2FsbGVycyBvbmx5LiAqL1xuICBhc3luYyBoYXNWZXJpZmllZFBsdWdpblVzZShvcmdJZDogc3RyaW5nLCBwdWJsaXNoZXI6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHZlcmlmaWVkUGx1Z2luVXNlKG9yZ0lkLCBwdWJsaXNoZXIsIG5hbWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDM6IERPUkEgd3JpdGUgcGF0aHMgKHBvc3QtZGVwbG95IG91dGNvbWVzICsgaW5nZXN0IGhlYWx0aCkg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIG1hbnVhbCBwb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlcjogYSB1c2VyIG1hcmtzIGFcbiAgICogZGVwbG95bWVudCBgZmFpbGVkYCAoYSBwcm9kdWN0aW9uIGluY2lkZW50IGxpbmtlZCB0byB0aGUgZGVwbG95KSBvclxuICAgKiBgcmVzdG9yZWRgIChyZWNvdmVyZWQpLiBJZGVtcG90ZW50IOKAlCBrZXllZCBvbiAoZXhlY3V0aW9uX2lkLCBvdXRjb21lKSBzbyBhXG4gICAqIGR1cGxpY2F0ZSBQT1NUIHJlZnJlc2hlcyBgYXRgIHJhdGhlciB0aGFuIGRvdWJsZS1jb3VudGluZywgd2hpbGUgYVxuICAgKiBmYWlsZWTihpJyZXN0b3JlZCBwYWlyIHN0YXlzIHR3byByb3dzLiBGZWVkcyB0aGUgcG9zdC1kZXBsb3kgQ0ZSIGNvbXBvbmVudCBhbmRcbiAgICogdGhlIHJlYWwgTVRUUi4gUnVucyB1bmRlciB0aGUgY2FsbGVyJ3Mgb3JnIGNvbnRleHQgKFJMUyBXSVRIIENIRUNLKS5cbiAgICovXG4gIGFzeW5jIHJlY29yZERlcGxveW1lbnRPdXRjb21lKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgZXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICBpbnB1dDogeyBvdXRjb21lOiAnZmFpbGVkJyB8ICdyZXN0b3JlZCc7IGF0OiBzdHJpbmc7IGVudmlyb25tZW50Pzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8RGVwbG95bWVudE91dGNvbWVXcml0ZT4ge1xuICAgIC8vIFRoZSBwcmlvciBtYXJrZXIgKGlmIGFueSkgaXMgcmVhZCBpbiB0aGUgU0FNRSB0eCBhcyB0aGUgdXBzZXJ0IHNvIHRoZVxuICAgIC8vIGNhbGxlcidzIGF1ZGl0IHJvdyBjYW4gY2FycnkgYmVmb3JlL2FmdGVyOiBhIHJlLVBPU1QgdGhhdCBtb3ZlcyBgYXRgXG4gICAgLy8gcmV3cml0ZXMgd2hlbiB0aGUgb3JnJ3MgQ0ZSL01UVFIgY2xvY2sgc3RhcnRlZCwgYW5kIFwiZnJvbSB3aGF0XCIgaXMgdGhlXG4gICAgLy8gaGFsZiBhIHJldmlld2VyIGNhbm5vdCByZWNvbnN0cnVjdCBhZnRlcndhcmRzLlxuICAgIGNvbnN0IHByZXZpb3VzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgICBjb25zdCBbcHJpb3JdID0gYXdhaXQgdHhcbiAgICAgICAgICAuc2VsZWN0KHsgYXQ6IHNjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5hdCwgZW52aXJvbm1lbnQ6IHNjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5lbnZpcm9ubWVudCB9KVxuICAgICAgICAgIC5mcm9tKHNjaGVtYS5kZXBsb3ltZW50T3V0Y29tZSlcbiAgICAgICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5leGVjdXRpb25JZCwgZXhlY3V0aW9uSWQpLCBlcShzY2hlbWEuZGVwbG95bWVudE91dGNvbWUub3V0Y29tZSwgaW5wdXQub3V0Y29tZSkpKVxuICAgICAgICAgIC5saW1pdCgxKTtcbiAgICAgICAgYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5kZXBsb3ltZW50T3V0Y29tZSkudmFsdWVzKHtcbiAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICBvcmdJZCxcbiAgICAgICAgICBlbnZpcm9ubWVudDogc2NydWJPcHRpb25hbChpbnB1dC5lbnZpcm9ubWVudCksXG4gICAgICAgICAgb3V0Y29tZTogaW5wdXQub3V0Y29tZSxcbiAgICAgICAgICBhdDogbmV3IERhdGUoaW5wdXQuYXQpLFxuICAgICAgICB9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICAgIHRhcmdldDogW3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5leGVjdXRpb25JZCwgc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLm91dGNvbWVdLFxuICAgICAgICAgIHNldDoge1xuICAgICAgICAgICAgYXQ6IG5ldyBEYXRlKGlucHV0LmF0KSxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGlucHV0LmVudmlyb25tZW50KSA/PyBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJpb3IgPyB7IGF0OiBpc29Pck51bGwocHJpb3IuYXQpLCBlbnZpcm9ubWVudDogcHJpb3IuZW52aXJvbm1lbnQgPz8gbnVsbCB9IDogbnVsbDtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gT3V0Y29tZSBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCB0aGUgb3JnJ3MgY2FjaGVkIHJlcG9ydHMuXG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZ0lkKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcHJldmlvdXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmdlc3QgYSBwcm9kdWN0aW9uIGluY2lkZW50IGZyb20gdGhlIG9yZydzIGluY2lkZW50IHRvb2xpbmdcbiAgICogKFBhZ2VyRHV0eSAvIERhdGFkb2cgLyBBbGVydG1hbmFnZXIgd2ViaG9vaykuIElkZW1wb3RlbnQg4oCUIGtleWVkIG9uXG4gICAqIChvcmdfaWQsIGluY2lkZW50X2lkKSBzbyBhIGxhdGVyIHJlc29sdmUgcmUtcG9zdCB1cHNlcnRzIGByZXNvbHZlZF9hdGBcbiAgICogKGFuZCByZWZyZXNoZXMgdGhlIG90aGVyIG11dGFibGUgZmllbGRzKSBpbnN0ZWFkIG9mIGluc2VydGluZyBhIGR1cGxpY2F0ZS5cbiAgICogRE9SQSBjb3JyZWxhdGVzIGVhY2ggaW5jaWRlbnQgdG8gdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGl0c1xuICAgKiBgZW52aXJvbm1lbnRgLCBwcm9kdWNpbmcgYW4gYXV0b21hdGVkIHBvc3QtZGVwbG95IGZhaWx1cmUgKyBhIHJlYWwgTVRUUi5cbiAgICogUnVucyB1bmRlciB0aGUgY2FsbGVyJ3Mgb3JnIGNvbnRleHQgKFJMUyBXSVRIIENIRUNLKTsgZnJlZS1mb3JtIGZpZWxkcyBhcmVcbiAgICogQVdTLWlkIHNjcnViYmVkIGF0IHRoaXMgcGVyc2lzdGVuY2UgYm91bmRhcnkgbGlrZSB0aGUgb3RoZXIgaW5nZXN0IHBhdGhzLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkSW5jaWRlbnQob3JnSWQ6IHN0cmluZywgaW5wdXQ6IEluY2lkZW50SW5wdXQpOiBQcm9taXNlPEluY2lkZW50V3JpdGU+IHtcbiAgICBjb25zdCBpbmNpZGVudElkID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuaW5jaWRlbnRJZCk7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhpbnB1dC5lbnZpcm9ubWVudCk7XG4gICAgY29uc3Qgc2V2ZXJpdHkgPSBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhpbnB1dC5zZXZlcml0eSk7XG4gICAgY29uc3Qgb3BlbmVkQXQgPSBuZXcgRGF0ZShpbnB1dC5vcGVuZWRBdCk7XG4gICAgY29uc3QgcmVzb2x2ZWRBdCA9IGlucHV0LnJlc29sdmVkQXQgPyBuZXcgRGF0ZShpbnB1dC5yZXNvbHZlZEF0KSA6IG51bGw7XG4gICAgY29uc3QgeyBwcmV2aW91cywgc3RvcmVkIH0gPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAgIC8vIFJlYWQgdGhlIHByaW9yIHJvdyBpbiB0aGUgc2FtZSB0eCBzbyB0aGUgY2FsbGVyIGNhbiB0ZWxsIGEgTkVXIG9yXG4gICAgICAgIC8vIENIQU5HRUQgaW5jaWRlbnQgZnJvbSBhIHNlbmRlcidzIHJlcGVhdC1pbnRlcnZhbCByZS1wb3N0IG9mIHRoZSBzYW1lXG4gICAgICAgIC8vIGZpcmluZyBhbGVydCAod2hpY2ggY2hhbmdlcyBub3RoaW5nIGFuZCBpcyBub3Qgd29ydGggYW4gYXVkaXQgcm93KS5cbiAgICAgICAgY29uc3QgW3ByaW9yXSA9IGF3YWl0IHR4XG4gICAgICAgICAgLnNlbGVjdCh7XG4gICAgICAgICAgICBlbnZpcm9ubWVudDogc2NoZW1hLmluY2lkZW50LmVudmlyb25tZW50LFxuICAgICAgICAgICAgb3BlbmVkQXQ6IHNjaGVtYS5pbmNpZGVudC5vcGVuZWRBdCxcbiAgICAgICAgICAgIHJlc29sdmVkQXQ6IHNjaGVtYS5pbmNpZGVudC5yZXNvbHZlZEF0LFxuICAgICAgICAgICAgc2V2ZXJpdHk6IHNjaGVtYS5pbmNpZGVudC5zZXZlcml0eSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mcm9tKHNjaGVtYS5pbmNpZGVudClcbiAgICAgICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5pbmNpZGVudC5vcmdJZCwgb3JnSWQpLCBlcShzY2hlbWEuaW5jaWRlbnQuaW5jaWRlbnRJZCwgaW5jaWRlbnRJZCkpKVxuICAgICAgICAgIC5saW1pdCgxKTtcbiAgICAgICAgY29uc3QgW3Jvd10gPSBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLmluY2lkZW50KS52YWx1ZXMoe1xuICAgICAgICAgIGluY2lkZW50SWQsXG4gICAgICAgICAgb3JnSWQsXG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgb3BlbmVkQXQsXG4gICAgICAgICAgcmVzb2x2ZWRBdCxcbiAgICAgICAgICBzZXZlcml0eSxcbiAgICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgICB0YXJnZXQ6IFtzY2hlbWEuaW5jaWRlbnQub3JnSWQsIHNjaGVtYS5pbmNpZGVudC5pbmNpZGVudElkXSxcbiAgICAgICAgICAvLyBBIHJlZGVsaXZlcmVkIEZJUklORyBwb3N0IChubyByZXNvbHZlZEF0KSBtdXN0IG5vdCB3aXBlIGEgcmVjb3JkZWRcbiAgICAgICAgICAvLyByZXNvbHZlIOKAlCBzZW5kZXJzIHJlLXBvc3QgZmlyaW5nIGFsZXJ0cyBvbiBldmVyeSByZXBlYXQgaW50ZXJ2YWwsIGFuZFxuICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9yZGVyIGlzbid0IGd1YXJhbnRlZWQuIEtlZXAgdGhlIHN0b3JlZCByZXNvbHZlIHVubGVzcyB0aGVcbiAgICAgICAgICAvLyBwb3N0IGNhcnJpZXMgaXRzIG93biwgb3IgdGhlIGluY2lkZW50IHdhcyBSRS1PUEVORUQgKGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gb3BlbmVkQXQgbWVhbnMgYSBuZXcgb2NjdXJyZW5jZSwgd2hvc2UgcmVzb2x2ZSBzdGF0ZSBpcyB0aGUgcG9zdCdzKS5cbiAgICAgICAgICBzZXQ6IHtcbiAgICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgICAgb3BlbmVkQXQsXG4gICAgICAgICAgICByZXNvbHZlZEF0OiBzcWxgQ0FTRSBXSEVOICR7c2NoZW1hLmluY2lkZW50Lm9wZW5lZEF0fSA9IGV4Y2x1ZGVkLm9wZW5lZF9hdFxuICAgICAgICAgICAgICBUSEVOIENPQUxFU0NFKGV4Y2x1ZGVkLnJlc29sdmVkX2F0LCAke3NjaGVtYS5pbmNpZGVudC5yZXNvbHZlZEF0fSlcbiAgICAgICAgICAgICAgRUxTRSBleGNsdWRlZC5yZXNvbHZlZF9hdCBFTkRgLFxuICAgICAgICAgICAgc2V2ZXJpdHksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkucmV0dXJuaW5nKHsgcmVzb2x2ZWRBdDogc2NoZW1hLmluY2lkZW50LnJlc29sdmVkQXQgfSk7XG4gICAgICAgIHJldHVybiB7IHByZXZpb3VzOiBwcmlvciA/PyBudWxsLCBzdG9yZWQ6IHJvdyB9O1xuICAgICAgfSksXG4gICAgKTtcbiAgICAvLyBBIG5ldy91cGRhdGVkIGluY2lkZW50IGNoYW5nZXMgdGhlIERPUkEgYWdncmVnYXRlIOKAlCBkcm9wIGNhY2hlZCByZXBvcnRzLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZU9yZyhvcmdJZCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IGFmdGVyID0ge1xuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBvcGVuZWRBdDogb3BlbmVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIHJlc29sdmVkQXQ6IGlzb09yTnVsbChzdG9yZWQ/LnJlc29sdmVkQXQgPz8gbnVsbCksXG4gICAgICBzZXZlcml0eSxcbiAgICB9O1xuICAgIGNvbnN0IGJlZm9yZSA9IHByZXZpb3VzXG4gICAgICA/IHtcbiAgICAgICAgZW52aXJvbm1lbnQ6IHByZXZpb3VzLmVudmlyb25tZW50LFxuICAgICAgICBvcGVuZWRBdDogaXNvT3JOdWxsKHByZXZpb3VzLm9wZW5lZEF0KSxcbiAgICAgICAgcmVzb2x2ZWRBdDogaXNvT3JOdWxsKHByZXZpb3VzLnJlc29sdmVkQXQpLFxuICAgICAgICBzZXZlcml0eTogcHJldmlvdXMuc2V2ZXJpdHksXG4gICAgICB9XG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgY2hhbmdlZCA9IGJlZm9yZSA9PT0gbnVsbFxuICAgICAgfHwgYmVmb3JlLmVudmlyb25tZW50ICE9PSBhZnRlci5lbnZpcm9ubWVudFxuICAgICAgfHwgYmVmb3JlLm9wZW5lZEF0ICE9PSBhZnRlci5vcGVuZWRBdFxuICAgICAgfHwgYmVmb3JlLnJlc29sdmVkQXQgIT09IGFmdGVyLnJlc29sdmVkQXRcbiAgICAgIHx8IGJlZm9yZS5zZXZlcml0eSAhPT0gYWZ0ZXIuc2V2ZXJpdHk7XG4gICAgcmV0dXJuIHsgaW5jaWRlbnRJZCwgY3JlYXRlZDogYmVmb3JlID09PSBudWxsLCBjaGFuZ2VkLCBiZWZvcmUsIGFmdGVyIH07XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgcGVyLW9yZyBET1JBIHNldHRpbmdzLiBSZXR1cm5zIHRoZSBzdG9yZWRcbiAgICogYGluY2lkZW50V2luZG93SG91cnNgIG92ZXJyaWRlIChvciBgbnVsbGAgd2hlbiB1bnNldCkgcGx1cyB0aGUgZ2xvYmFsIGVudlxuICAgKiBkZWZhdWx0LCBzbyB0aGUgc2V0dGluZ3MgVUkgY2FuIHNob3cgYm90aC4gUnVucyB1bmRlciB0aGUgY2FsbGVyJ3MgdGVuYW50XG4gICAqIGNvbnRleHQgKFJMUy1zY29wZWQpOyBhIHNpbmdsZS1vcmcgcmVhZC5cbiAgICovXG4gIGFzeW5jIGdldFJlcG9ydGluZ1NldHRpbmdzKG9yZ0lkOiBzdHJpbmcsIHJldGVudGlvbk9yZ0lkOiBzdHJpbmcgPSBvcmdJZCk6IFByb21pc2U8UmVwb3J0aW5nU2V0dGluZ3M+IHtcbiAgICBjb25zdCByb3dzID0gZHJpenpsZVJvd3M8e1xuICAgICAgaW5jaWRlbnRfd2luZG93X2hvdXJzOiBudW1iZXIgfCBudWxsO1xuICAgICAgZXZlbnRfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgICBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5pbmNpZGVudFdpbmRvd0hvdXJzfSBBUyBpbmNpZGVudF93aW5kb3dfaG91cnMsXG4gICAgICAgICAgICAgICAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZXZlbnRSZXRlbnRpb25EYXlzfSBBUyBldmVudF9yZXRlbnRpb25fZGF5cyxcbiAgICAgICAgICAgICAgICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5kb3JhUmV0ZW50aW9uRGF5c30gQVMgZG9yYV9yZXRlbnRpb25fZGF5c1xuICAgICAgICBGUk9NICR7c2NoZW1hLmRvcmFTZXR0aW5nc31cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICAgIExJTUlUIDFcbiAgICAgIGApKSkucm93cyk7XG4gICAgY29uc3Qgcm93ID0gcm93c1swXTtcbiAgICAvLyBSZXRlbnRpb24gaXMgYSBiaWxsaW5nIGVudGl0bGVtZW50IHN5bmNlZCBvbnRvIHRoZSBhY2NvdW50IFJPT1Qgb25seTsgYVxuICAgIC8vIHRlYW0gcmVhZHMgaXRzIHJvb3QncyB3aW5kb3cgKHRoZSBpbmNpZGVudCB3aW5kb3cgc3RheXMgdGhlIHRlYW0ncyBvd24pLlxuICAgIGNvbnN0IHJldGVudGlvbiA9IHJldGVudGlvbk9yZ0lkID09PSBvcmdJZFxuICAgICAgPyByb3dcbiAgICAgIDogYXdhaXQgdGhpcy4jcmVhZFJldGVudGlvbk92ZXJyaWRlKHJldGVudGlvbk9yZ0lkKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5jaWRlbnRXaW5kb3dIb3Vyczogcm93Py5pbmNpZGVudF93aW5kb3dfaG91cnMgIT0gbnVsbCA/IE51bWJlcihyb3cuaW5jaWRlbnRfd2luZG93X2hvdXJzKSA6IG51bGwsXG4gICAgICBkZWZhdWx0V2luZG93SG91cnM6IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLFxuICAgICAgZXZlbnRSZXRlbnRpb25EYXlzOiByZXRlbnRpb24/LmV2ZW50X3JldGVudGlvbl9kYXlzICE9IG51bGwgPyBOdW1iZXIocmV0ZW50aW9uLmV2ZW50X3JldGVudGlvbl9kYXlzKSA6IG51bGwsXG4gICAgICBkb3JhUmV0ZW50aW9uRGF5czogcmV0ZW50aW9uPy5kb3JhX3JldGVudGlvbl9kYXlzICE9IG51bGwgPyBOdW1iZXIocmV0ZW50aW9uLmRvcmFfcmV0ZW50aW9uX2RheXMpIDogbnVsbCxcbiAgICAgIGRlZmF1bHRFdmVudFJldGVudGlvbkRheXM6IFJFUE9SVElOR19FVkVOVF9SRVRFTlRJT05fREFZUyxcbiAgICAgIGRlZmF1bHREb3JhUmV0ZW50aW9uRGF5czogUkVQT1JUSU5HX0RPUkFfUkVURU5USU9OX0RBWVMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUk9PVCBvcmcncyBzdG9yZWQgcmV0ZW50aW9uIG92ZXJyaWRlLiBUaGUgY2FsbGVyIChhIHRlYW0pIGNhbid0IHNlZSB0aGVcbiAgICogcm9vdCdzIGBkb3JhX3NldHRpbmdzYCByb3cgdW5kZXIgaXRzIG93biBSTFMgc2NvcGUsIHNvIHRoaXMgbmFycm93IHJlYWQgb2ZcbiAgICogdHdvIGludGVnZXIgY29sdW1ucyDigJQga2V5ZWQgYnkgdGhlIGV4cGxpY2l0LCBKV1QtZGVyaXZlZCByb290IGlkIOKAlCBydW5zIGluIGFcbiAgICogc3lzYWRtaW4gc2NvcGUuXG4gICAqL1xuICBhc3luYyAjcmVhZFJldGVudGlvbk92ZXJyaWRlKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHsgZXZlbnRfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7IGRvcmFfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGwgfSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiBkcml6emxlUm93czx7XG4gICAgICBldmVudF9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGRvcmFfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgfT4oKGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1QgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmV2ZW50UmV0ZW50aW9uRGF5c30gQVMgZXZlbnRfcmV0ZW50aW9uX2RheXMsXG4gICAgICAgICAgICAgICAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZG9yYVJldGVudGlvbkRheXN9IEFTIGRvcmFfcmV0ZW50aW9uX2RheXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5kb3JhU2V0dGluZ3N9XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZH0gPSAke29yZ0lkfVxuICAgICAgICBMSU1JVCAxXG4gICAgICBgKSkpLnJvd3MpKTtcbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnQgcGVyLW9yZyByZXBvcnRpbmcgc2V0dGluZ3MgKGluY2lkZW50IHdpbmRvdyArXG4gICAqIHJldGVudGlvbiBvdmVycmlkZXMpLCBpZGVtcG90ZW50IG9uIGBvcmdfaWRgLiBBIHBhcnRpYWwgd3JpdGUg4oCUIG9ubHkgdGhlXG4gICAqIGZpZWxkcyBwcmVzZW50IGluIGBwYXRjaGAgYXJlIHNldCAoc28gdXBkYXRpbmcgcmV0ZW50aW9uIG5ldmVyIGNsZWFycyB0aGVcbiAgICogaW5jaWRlbnQgd2luZG93LCBhbmQgdmljZS12ZXJzYSkuIFNldCBzZWxmLXNlcnZlIGJ5IGFuIG9yZyBhZG1pbiB2aWFcbiAgICogYFBVVCAvYXBpL3JlcG9ydHMvc2V0dGluZ3MvaW5jaWRlbnRzYC4gUnVucyB1bmRlciB0aGUgY2FsbGVyJ3Mgb3JnIGNvbnRleHRcbiAgICogKFJMUyBXSVRIIENIRUNLKTsgYSBjaGFuZ2VkIHZhbHVlIGFmZmVjdHMgRE9SQSBhZ2dyZWdhdGVzIHNvIHRoZSBvcmcnc1xuICAgKiBjYWNoZWQgcmVwb3J0cyBhcmUgZHJvcHBlZC5cbiAgICovXG4gIGFzeW5jIHNldFJlcG9ydGluZ1NldHRpbmdzKG9yZ0lkOiBzdHJpbmcsIHBhdGNoOiBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH07XG4gICAgaWYgKHBhdGNoLmluY2lkZW50V2luZG93SG91cnMgIT09IHVuZGVmaW5lZCkgc2V0LmluY2lkZW50V2luZG93SG91cnMgPSBwYXRjaC5pbmNpZGVudFdpbmRvd0hvdXJzO1xuICAgIGlmIChwYXRjaC5ldmVudFJldGVudGlvbkRheXMgIT09IHVuZGVmaW5lZCkgc2V0LmV2ZW50UmV0ZW50aW9uRGF5cyA9IHBhdGNoLmV2ZW50UmV0ZW50aW9uRGF5cztcbiAgICBpZiAocGF0Y2guZG9yYVJldGVudGlvbkRheXMgIT09IHVuZGVmaW5lZCkgc2V0LmRvcmFSZXRlbnRpb25EYXlzID0gcGF0Y2guZG9yYVJldGVudGlvbkRheXM7XG4gICAgYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5kb3JhU2V0dGluZ3MpLnZhbHVlcyh7XG4gICAgICAgIG9yZ0lkLFxuICAgICAgICBpbmNpZGVudFdpbmRvd0hvdXJzOiBwYXRjaC5pbmNpZGVudFdpbmRvd0hvdXJzLFxuICAgICAgICBldmVudFJldGVudGlvbkRheXM6IHBhdGNoLmV2ZW50UmV0ZW50aW9uRGF5cyxcbiAgICAgICAgZG9yYVJldGVudGlvbkRheXM6IHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICB0YXJnZXQ6IHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsXG4gICAgICAgIHNldCxcbiAgICAgIH0pKSxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZU9yZyhvcmdJZCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgcmVjZW50IGluY2lkZW50cyBmb3IgYW4gb3JnIChvcmctYWRtaW4gc3VyZmFjZSksIG5ld2VzdCBmaXJzdCxcbiAgICogcGFnaW5hdGVkLiBFYWNoIHJvdyBjYXJyaWVzIGl0cyByZXNvbHZlZCBzdGF0ZSBhbmQgaXRzIGRlcGxveSBjb3JyZWxhdGlvbiDigJRcbiAgICogdGhlIG1vc3QgcmVjZW50IFNVQ0NFU1NGVUwgZGVwbG95IHRvIHRoZSBpbmNpZGVudCdzIGBlbnZpcm9ubWVudGAgd2hvc2VcbiAgICogYGNvbXBsZXRlZF9hdGAgZmFsbHMgd2l0aGluIHRoZSBlZmZlY3RpdmUgcGVyLW9yZyBjb3JyZWxhdGlvbiB3aW5kb3cgYmVmb3JlXG4gICAqIGBvcGVuZWRfYXRgICh0aGUgc2FtZSBydWxlIERPUkEncyBDRlIvTVRUUiBjb3JyZWxhdGlvbiBhcHBsaWVzKS4gU2luZ2xlLW9yZ1xuICAgKiAobm8gcm9sbHVwKSDigJQgYW4gb3JnIGFkbWluIHZpZXdzIHRoZWlyIG93biBvcmcncyBpbmNpZGVudHMuIFJMUy1zY29wZWQgdmlhXG4gICAqIHRoZSBgcC5vcmdfaWRgL2BpLm9yZ19pZGAgcHJlZGljYXRlcyArIHRoZSB0ZW5hbnQgY29udGV4dC5cbiAgICovXG4gIGFzeW5jIGxpc3RJbmNpZGVudHMob3JnSWQ6IHN0cmluZywgb3B0czogeyBsaW1pdDogbnVtYmVyOyBvZmZzZXQ6IG51bWJlciB9KTogUHJvbWlzZTxJbmNpZGVudExpc3RJdGVtW10+IHtcbiAgICBjb25zdCB7IGluY2lkZW50V2luZG93SG91cnMgfSA9IGF3YWl0IHRoaXMuZ2V0UmVwb3J0aW5nU2V0dGluZ3Mob3JnSWQpO1xuICAgIGNvbnN0IHdpbmRvd0hvdXJzID0gcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMoaW5jaWRlbnRXaW5kb3dIb3Vycyk7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihvcHRzLmxpbWl0LCAyMDApKTtcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgwLCBvcHRzLm9mZnNldCk7XG4gICAgLy8gVGhlIGNvcnJlbGF0aW9uIHdpbmRvdyBpcyBleHByZXNzZWQgaW4gU0VDT05EUyBhcyBhIGRvdWJsZSwgbm90IGFzXG4gICAgLy8gYG1ha2VfaW50ZXJ2YWwoaG91cnMgPT4gTjo6aW50KWAuIFRoZSB3aW5kb3cgaXMgdmFsaWRhdGVkIGFzIGFueSBwb3NpdGl2ZVxuICAgIC8vIG51bWJlciAoMC41aCBpcyBsZWdhbCkgYW5kIHRoZSBpbi1tZW1vcnkgRE9SQSBjb3JyZWxhdGlvbiB1c2VzIGl0IGV4YWN0bHk7XG4gICAgLy8gdGhlIGludCBjYXN0IG1hZGUgUG9zdGdyZXMgcmVqZWN0IGEgZnJhY3Rpb25hbCB2YWx1ZSwgc28gYSAwLjVoIHdpbmRvd1xuICAgIC8vIHJldHVybmVkIDUwMCBmcm9tIHRoaXMgZW5kcG9pbnQgYW5kIGZyb20gdGhlIGNvcnJlbGF0aW9uIGxvb2t1cCBiZWxvdy5cbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGkuaW5jaWRlbnRfaWQgQVMgXCJpbmNpZGVudElkXCIsXG4gICAgICAgICAgaS5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudCxcbiAgICAgICAgICBpLnNldmVyaXR5IEFTIHNldmVyaXR5LFxuICAgICAgICAgIGkub3BlbmVkX2F0Ojp0ZXh0IEFTIFwib3BlbmVkQXRcIixcbiAgICAgICAgICBpLnJlc29sdmVkX2F0Ojp0ZXh0IEFTIFwicmVzb2x2ZWRBdFwiLFxuICAgICAgICAgIGkuY3JlYXRlZF9hdDo6dGV4dCBBUyBcImNyZWF0ZWRBdFwiLFxuICAgICAgICAgIChpLnJlc29sdmVkX2F0IElTIE5PVCBOVUxMKSBBUyByZXNvbHZlZCxcbiAgICAgICAgICBjb3JyLmV4ZWN1dGlvbl9pZCBBUyBcImNvcnJlbGF0ZWRFeGVjdXRpb25JZFwiLFxuICAgICAgICAgIGNvcnIuY29tcGxldGVkX2F0Ojp0ZXh0IEFTIFwiZGVwbG95Q29tcGxldGVkQXRcIlxuICAgICAgICBGUk9NICR7c2NoZW1hLmluY2lkZW50fSBpXG4gICAgICAgIExFRlQgSk9JTiBMQVRFUkFMIChcbiAgICAgICAgICBTRUxFQ1QgZS5leGVjdXRpb25faWQsIGUuY29tcGxldGVkX2F0XG4gICAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRSdcbiAgICAgICAgICAgIEFORCBlLmVudmlyb25tZW50ID0gaS5lbnZpcm9ubWVudCBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0IDw9IGkub3BlbmVkX2F0XG4gICAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gaS5vcGVuZWRfYXQgLSBtYWtlX2ludGVydmFsKHNlY3MgPT4gJHt3aW5kb3dIb3VycyAqIDM2MDB9Ojpkb3VibGUgcHJlY2lzaW9uKVxuICAgICAgICAgIE9SREVSIEJZIGUuY29tcGxldGVkX2F0IERFU0NcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICkgY29yciBPTiB0cnVlXG4gICAgICAgIFdIRVJFIGkub3JnX2lkID0gJHtvcmdJZH1cbiAgICAgICAgT1JERVIgQlkgaS5vcGVuZWRfYXQgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fSBPRkZTRVQgJHtvZmZzZXR9XG4gICAgICBgKS50aGVuKChyKSA9PiBkcml6emxlUm93czxJbmNpZGVudExpc3RJdGVtPihyLnJvd3MpLm1hcCgocm93KSA9PiAoe1xuICAgICAgLi4ucm93LFxuICAgICAgcmVzb2x2ZWQ6IHJvdy5yZXNvbHZlZCA9PT0gdHJ1ZSB8fCAocm93LnJlc29sdmVkIGFzIHVua25vd24pID09PSAndCcsXG4gICAgICBjb3JyZWxhdGVkRXhlY3V0aW9uSWQ6IHJvdy5jb3JyZWxhdGVkRXhlY3V0aW9uSWQgPz8gbnVsbCxcbiAgICAgIGRlcGxveUNvbXBsZXRlZEF0OiByb3cuZGVwbG95Q29tcGxldGVkQXQgPz8gbnVsbCxcbiAgICB9KSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJpbmctdGVzdCBkcnktcnVuOiB3b3VsZCBhIHN5bnRoZXRpYyBpbmNpZGVudCBvcGVuaW5nIE5PVyBmb3JcbiAgICogYGVudmlyb25tZW50YCBjb3JyZWxhdGUgdG8gYSByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kgdW5kZXIgdGhlIG9yZydzXG4gICAqIGVmZmVjdGl2ZSB3aW5kb3c/IFRoaXMgaXMgYSBOT04tcGVyc2lzdGluZyBjb3JyZWxhdGlvbiBjaGVjayDigJQgaXQgdmVyaWZpZXNcbiAgICogdGhlIGFkbWluJ3MgZW52aXJvbm1lbnQgbmFtaW5nICsgd2luZG93IGxpbmUgdXAgd2l0aCByZWFsIGRlcGxveSBldmVudHNcbiAgICogV0lUSE9VVCB3cml0aW5nIGFuIGluY2lkZW50IChzbyBhIFwidGVzdFwiIG5ldmVyIHBvbGx1dGVzIENGUi9NVFRSKS4gUkxTLXNjb3BlZC5cbiAgICovXG4gIGFzeW5jIHRlc3RJbmNpZGVudENvcnJlbGF0aW9uKG9yZ0lkOiBzdHJpbmcsIGVudmlyb25tZW50OiBzdHJpbmcpOiBQcm9taXNlPEluY2lkZW50VGVzdFJlc3VsdD4ge1xuICAgIGNvbnN0IGVudiA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGVudmlyb25tZW50KTtcbiAgICBjb25zdCBvcGVuZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCB7IGluY2lkZW50V2luZG93SG91cnMgfSA9IGF3YWl0IHRoaXMuZ2V0UmVwb3J0aW5nU2V0dGluZ3Mob3JnSWQpO1xuICAgIGNvbnN0IHdpbmRvd0hvdXJzID0gcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMoaW5jaWRlbnRXaW5kb3dIb3Vycyk7XG4gICAgY29uc3Qgcm93cyA9IGRyaXp6bGVSb3dzPHsgZXhlY3V0aW9uX2lkOiBzdHJpbmcgfCBudWxsOyBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGwgfT4oKGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1QgZS5leGVjdXRpb25faWQgQVMgZXhlY3V0aW9uX2lkLCBlLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBjb21wbGV0ZWRfYXRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJ1xuICAgICAgICAgIEFORCBlLmVudmlyb25tZW50ID0gJHtlbnZ9IEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnXG4gICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0IDw9ICR7b3BlbmVkQXR9Ojp0aW1lc3RhbXB0elxuICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA+PSAke29wZW5lZEF0fTo6dGltZXN0YW1wdHogLSBtYWtlX2ludGVydmFsKHNlY3MgPT4gJHt3aW5kb3dIb3VycyAqIDM2MDB9Ojpkb3VibGUgcHJlY2lzaW9uKVxuICAgICAgICBPUkRFUiBCWSBlLmNvbXBsZXRlZF9hdCBERVNDXG4gICAgICAgIExJTUlUIDFcbiAgICAgIGApKSkucm93cyk7XG4gICAgY29uc3QgaGl0ID0gcm93c1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgZW52aXJvbm1lbnQ6IGVudixcbiAgICAgIG9wZW5lZEF0LFxuICAgICAgd2luZG93SG91cnMsXG4gICAgICBjb3JyZWxhdGVkOiBoaXQ/LmV4ZWN1dGlvbl9pZCAhPSBudWxsLFxuICAgICAgZXhlY3V0aW9uSWQ6IGhpdD8uZXhlY3V0aW9uX2lkID8/IG51bGwsXG4gICAgICBkZXBsb3lDb21wbGV0ZWRBdDogaGl0Py5jb21wbGV0ZWRfYXQgPz8gbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwc2VydCBwZXItb3JnIGluZ2VzdGlvbiBoZWFsdGg6IHRoZSBBV1MgZXZlbnRzIExhbWJkYSBwZXJpb2RpY2FsbHlcbiAgICogcmVwb3J0cyBmb3J3YXJkZWQvZHJvcHBlZCBjb3VudGVycyArIHRoZSBsYXN0IGV2ZW50IHRpbWVzdGFtcCBzbyB0aGUgUmVwb3J0c1xuICAgKiBVSSBjYW4gc2hvdyBmbG93aW5nIC8gc3RhbGUgLyBkcm9wcGluZy4gT25lIHJvdyBwZXIgb3JnICh1cHNlcnQgb24gb3JnX2lkKS5cbiAgICovXG4gIGFzeW5jIHJlY29yZEluZ2VzdEhlYWx0aChcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGlucHV0OiB7IGZvcndhcmRlZD86IG51bWJlcjsgZHJvcHBlZD86IG51bWJlcjsgbGFzdEV2ZW50QXQ/OiBzdHJpbmcgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbGFzdEV2ZW50QXQgPSBpbnB1dC5sYXN0RXZlbnRBdCA/IG5ldyBEYXRlKGlucHV0Lmxhc3RFdmVudEF0KSA6IHVuZGVmaW5lZDtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmluZ2VzdEhlYWx0aCkudmFsdWVzKHtcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIGZvcndhcmRlZDogaW5wdXQuZm9yd2FyZGVkLFxuICAgICAgICBkcm9wcGVkOiBpbnB1dC5kcm9wcGVkLFxuICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBzY2hlbWEuaW5nZXN0SGVhbHRoLm9yZ0lkLFxuICAgICAgICBzZXQ6IHtcbiAgICAgICAgICBmb3J3YXJkZWQ6IGlucHV0LmZvcndhcmRlZCxcbiAgICAgICAgICBkcm9wcGVkOiBpbnB1dC5kcm9wcGVkLFxuICAgICAgICAgIGxhc3RFdmVudEF0LFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYmFjayBvbmUgb3JnJ3MgaW5nZXN0aW9uIGhlYWx0aCBmb3IgdGhlIFJlcG9ydHMgVUkgZnJlc2huZXNzXG4gICAqIGluZGljYXRvci4gUmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgb3JnIGhhcyBOTyByb3cg4oCUIGkuZS4gdGhlIGRlcGxveW1lbnQgaGFzXG4gICAqIG5ldmVyIGluZ2VzdGVkIGFueXRoaW5nIOKAlCB3aGljaCB0aGUgVUkgbXVzdCByZW5kZXIgYXMgXCJubyBpbmdlc3QgcmVwb3J0ZWRcbiAgICogeWV0XCIsIG5ldmVyIGFzIFwic3RhbGVcIi4gUkxTLXNjb3BlZCB0byB0aGUgb3JnIGxpa2UgZXZlcnkgb3RoZXIgcmVhZC5cbiAgICovXG4gIGFzeW5jIGdldEluZ2VzdEhlYWx0aChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxJbmdlc3RIZWFsdGhTdGF0dXMgfCBudWxsPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgICAgIC5zZWxlY3QoKVxuICAgICAgICAuZnJvbShzY2hlbWEuaW5nZXN0SGVhbHRoKVxuICAgICAgICAud2hlcmUoZXEoc2NoZW1hLmluZ2VzdEhlYWx0aC5vcmdJZCwgb3JnSWQpKVxuICAgICAgICAubGltaXQoMSkpLFxuICAgICk7XG4gICAgY29uc3Qgcm93ID0gcm93c1swXTtcbiAgICBpZiAoIXJvdykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZWRBdDogcm93LnVwZGF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgbGFzdEV2ZW50QXQ6IGlzb09yTnVsbChyb3cubGFzdEV2ZW50QXQpLFxuICAgICAgZm9yd2FyZGVkOiByb3cuZm9yd2FyZGVkID8/IG51bGwsXG4gICAgICBkcm9wcGVkOiByb3cuZHJvcHBlZCA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0aW5nIHJldGVudGlvbiBzd2VlcDogaGFyZC1kZWxldGVzIHJvd3MgcGFzdCB0aGVpciBwZXItb3JnIHJldGVudGlvblxuICAgKiB3aW5kb3cgKHNwbGl0IHN0YW5kYXJkLWV2ZW50IHZzIERPUkEtc291cmNlKS4gQ3Jvc3MtdGVuYW50IGhvdXNla2VlcGluZyDigJRcbiAgICogaXQgZXN0YWJsaXNoZXMgaXRzIG93biBzeXNhZG1pbiBzY29wZS4gU2VlIC4vcmVwb3J0aW5nL3JldGVudGlvbi1zd2VlcC50cy5cbiAgICovXG4gIGFzeW5jIHB1cmdlRXhwaXJlZFJlcG9ydGluZ0RhdGEob3B0czogUmVwb3J0aW5nUmV0ZW50aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSZXBvcnRpbmdSZXRlbnRpb25Db3VudHM+IHtcbiAgICByZXR1cm4gcHVyZ2VSZXBvcnRpbmdSZXRlbnRpb24ob3B0cyk7XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgNTogdGhlIEFOQUxZVElDUyByZWFkcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gVGhpbiBkZWxlZ2F0aW9ucyB0byAuL3JlcG9ydGluZy9hbmFseXRpY3MtcXVlcmllcy50cywgc28gYHJlcG9ydGluZ1NlcnZpY2VgXG4gIC8vIHNhdGlzZmllcyB0aGUgcmVwb3J0IGVuZ2luZSdzIGBTZWN0aW9uRGF0YVNvdXJjZWAgaW4gZnVsbCBhbmQgYSBzZWN0aW9uIG5ldmVyXG4gIC8vIHJlYWNoZXMgcGFzdCB0aGUgc2VydmljZSBmb3IgaXRzIGRhdGEuIEV2ZXJ5IG9uZSBvZiB0aGVzZSByZWFkcyBhXG4gIC8vIHByZS1hZ2dyZWdhdGVkIHRhYmxlIChgZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHNgLCBgZG9yYV9kZXBsb3ltZW50c2AsXG4gIC8vIGBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbmAsIGBwbHVnaW5fdnVsbl9leHBvc3VyZWApIHJhdGhlciB0aGFuIHJhdyBldmVudHMg4oCUXG4gIC8vIHdoaWNoIGlzIHdoYXQgbWFrZXMgYSBxdWFydGVybHkgcmVwb3J0IGFmZm9yZGFibGUgQU5EIHdoYXQgbWFrZXMgaXQgc3RpbGxcbiAgLy8gYW5zd2VyYWJsZSBhZnRlciByZXRlbnRpb24gaGFzIHN3ZXB0IHRoZSBldmVudHMgaXQgY2FtZSBmcm9tLlxuXG4gIC8qKiBQZXItcGlwZWxpbmUgZGVsaXZlcnksIHdvcnN0IGZpcnN0LiAqL1xuICBhc3luYyBnZXRQaXBlbGluZUJyZWFrZG93bihzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gMTApIHtcbiAgICByZXR1cm4gZ2V0UGlwZWxpbmVCcmVha2Rvd24oc2NvcGUsIGxpbWl0KTtcbiAgfVxuXG4gIC8qKiBGYWlsdXJlcyBieSBjYXRlZ29yeSwgd2l0aCB0aGUgcHJldmlvdXMgcGVyaW9kJ3MgY291bnRzIGZvciB0aGUgdHJlbmQuICovXG4gIGFzeW5jIGdldEZhaWx1cmVBbmFseXNpcyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIHByZXZpb3VzPzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSkge1xuICAgIHJldHVybiBnZXRGYWlsdXJlQW5hbHlzaXMoc2NvcGUsIHByZXZpb3VzKTtcbiAgfVxuXG4gIC8qKiBQZXItc3RhZ2UgdGltaW5ncyBmb3Igb25lIHBpcGVsaW5lLCBzbG93ZXN0IGZpcnN0LiAqL1xuICBhc3luYyBnZXRTdGFnZVBlcmZvcm1hbmNlKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcGlwZWxpbmVJZDogc3RyaW5nLCBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gZ2V0U3RhZ2VQZXJmb3JtYW5jZShzY29wZSwgcGlwZWxpbmVJZCwgcHJldmlvdXMpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRpbWUgYnkgcHJvamVjdCBhbmQgcGlwZWxpbmUuIFNlY29uZHMsIG5ldmVyIG1vbmV5LiAqL1xuICBhc3luYyBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgbGltaXQgPSAyMCkge1xuICAgIHJldHVybiBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uKHNjb3BlLCBsaW1pdCk7XG4gIH1cblxuICAvKiogRWFjaCBjb21taXQncyBwYXRoIGFjcm9zcyBlbnZpcm9ubWVudHMsIGFuZCB3aGljaCBvbmVzIHN0b3BwZWQgc2hvcnQuICovXG4gIGFzeW5jIGdldFByb21vdGlvblZpZXcoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBwcm9kdWN0aW9uRW52ID0gJ3Byb2R1Y3Rpb24nLCBsaW1pdCA9IDI1KSB7XG4gICAgcmV0dXJuIGdldFByb21vdGlvblZpZXcoc2NvcGUsIHByb2R1Y3Rpb25FbnYsIGxpbWl0KTtcbiAgfVxuXG4gIC8qKiBQaXBlbGluZXMgYmVoaW5kIG9uIGEgcGx1Z2luLCB3b3JzdCBnYXAgZmlyc3QgKHRoZSBERUNMQVJFRCBzaWRlKS4gKi9cbiAgYXN5bmMgZ2V0T3V0ZGF0ZWRQbHVnaW5zKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgbGltaXQgPSA1MCkge1xuICAgIHJldHVybiBnZXRPdXRkYXRlZFBsdWdpbnMoc2NvcGUsIGxpbWl0KTtcbiAgfVxuXG4gIC8qKiBPcGVuIHBsdWdpbiB2dWxuZXJhYmlsaXRpZXMgcGVyIHBpcGVsaW5lIChzYXlzIGRlY2xhcmVkIHZzIGRlcGxveWVkKS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luVnVsbmVyYWJpbGl0aWVzKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgbGltaXQgPSA1MCkge1xuICAgIHJldHVybiBnZXRQbHVnaW5WdWxuZXJhYmlsaXRpZXMoc2NvcGUsIGxpbWl0KTtcbiAgfVxuXG4gIC8qKiBBZG9wdGlvbiwgY3JlYXRpb24gc291cmNlLCBhbmQgdGhlIGRlcGxveS10cmFja2luZyBjb3ZlcmFnZSBkZW5vbWluYXRvci4gKi9cbiAgYXN5bmMgZ2V0QWRvcHRpb24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCB0aW1lU2F2ZWRNaW51dGVzPzogbnVtYmVyIHwgbnVsbCkge1xuICAgIHJldHVybiBnZXRBZG9wdGlvbihzY29wZSwgdGltZVNhdmVkTWludXRlcyA/PyAoYXdhaXQgdGhpcy50aW1lU2F2ZWRBc3N1bXB0aW9uKHNjb3BlLm9yZ0lkKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuZWVkcy1hdHRlbnRpb24gZmluZGluZ3MgZm9yIHRoZSBwZXJpb2QuXG4gICAqXG4gICAqIEFzc2VtYmxlZCBIRVJFIHJhdGhlciB0aGFuIGluIHRoZSBzZWN0aW9uLCBiZWNhdXNlIHRoZSBydWxlcyBuZWVkIHNpeCByZWFkcyB0aGF0XG4gICAqIG11c3QgYWxsIGRlc2NyaWJlIHRoZSBzYW1lIHdpbmRvdzogdGhpcyBwZXJpb2QncyBicmVha2Rvd24sIHRoZSBwcmV2aW91cyBvbmUncyxcbiAgICogZmFpbHVyZSBzdHJlYWtzLCBjb25maWctY2hhbmdlIHRpbWVzLCBwaXBlbGluZXMgd2l0aCBhbiBvcGVuIENyaXRpY2FsLCBhbmRcbiAgICogcGlwZWxpbmVzIERPUkEgY2Fubm90IHNlZS4gQSBzZWN0aW9uIHRoYXQgZmV0Y2hlZCB0aGVtIGl0c2VsZiB3b3VsZCBiZSB0aGUgb25seVxuICAgKiBwbGFjZSBpbiB0aGUgcmVwb3J0IHdoZXJlIHRoZSB3aW5kb3cgY291bGQgZHJpZnQgYmV0d2VlbiBwYW5lbHMuXG4gICAqXG4gICAqIEV2ZXJ5IGlucHV0IGV4Y2VwdCB0aGUgY3VycmVudCBicmVha2Rvd24gaXMgT1BUSU9OQUwgdG8gdGhlIGV2YWx1YXRvciwgYW5kIGVhY2hcbiAgICogb25lJ3MgZmFpbHVyZSBpcyBhYnNvcmJlZDogYSBydWxlIHdpdGggbm8gZGF0YSB0byBydW4gb24gaXMgc2tpcHBlZCwgd2hpY2ggaXNcbiAgICogd2h5IG9uZSB1bmF2YWlsYWJsZSByZWFkIGNvc3RzIG9uZSBmaW5kaW5nIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBzZWN0aW9uLiBUaGVcbiAgICogYWx0ZXJuYXRpdmUg4oCUIGEgc2VjdGlvbiB0aGF0IGZhaWxzIGJlY2F1c2UgdGhlIHN0cmVhayBxdWVyeSB0aW1lZCBvdXQg4oCUIHJlcGxhY2VzXG4gICAqIHNpeCBmaW5kaW5ncyB3aXRoIG5vbmUuXG4gICAqXG4gICAqIEEgc2tpcHBlZCBydWxlIGlzIFNBSUQsIGluIGB1bmF2YWlsYWJsZVJ1bGVzYC4gQWJzb3JiZWQgc2lsZW50bHksIGEgZmFpbGVkXG4gICAqIHZ1bG5lcmFibGUtcGlwZWxpbmVzIHJlYWQgYmVjYW1lIGFuIGVtcHR5IHNldCDigJQgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBcIm5vXG4gICAqIHBpcGVsaW5lIHJ1bnMgYSB2dWxuZXJhYmxlIHBsdWdpblwiLCB3aGljaCBpcyB0aGUgb25lIGZhbHNlIG5lZ2F0aXZlIGEgc2VjdXJpdHlcbiAgICogcmVhZGVyIG11c3QgbmV2ZXIgYmUgaGFuZGVkLiBUaGUgY29tcG9zZXIgdHVybnMgaXQgaW50byBhIGRhdGEtcXVhbGl0eSBub3RlLlxuICAgKi9cbiAgYXN5bmMgZ2V0TmVlZHNBdHRlbnRpb24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgZ2V0UGlwZWxpbmVCcmVha2Rvd24oc2NvcGUsIEFUVEVOVElPTl9QSVBFTElORV9MSU1JVCk7XG4gICAgY29uc3QgdW5hdmFpbGFibGUgPSBuZXcgU2V0PEF0dGVudGlvblJ1bGVJZD4oKTtcbiAgICBjb25zdCB0cmFjayA9IDxUPihydWxlczogQXR0ZW50aW9uUnVsZUlkW10sIHA6IFByb21pc2U8VD4sIGZhbGxiYWNrOiBUKSA9PlxuICAgICAgc29mdGVuKHAsIGZhbGxiYWNrLCAoKSA9PiB7IGZvciAoY29uc3QgciBvZiBydWxlcykgdW5hdmFpbGFibGUuYWRkKHIpOyB9KTtcbiAgICBjb25zdCBwcmlvciA9IHByZXZpb3VzXG4gICAgICA/IGF3YWl0IHRyYWNrKFsnc2xvd2VyX3A5NSddLCBnZXRQaXBlbGluZUJyZWFrZG93bih7IC4uLnNjb3BlLCAuLi5wcmV2aW91cyB9LCBBVFRFTlRJT05fUElQRUxJTkVfTElNSVQpLCBbXSlcbiAgICAgIDogW107XG4gICAgY29uc3QgW3N0cmVha1Jvd3MsIGNvbmZpZ0NoYW5nZXMsIHZ1bG5lcmFibGUsIHVudHJhY2tlZCwgdGhyZXNob2xkc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0cmFjayhbJ2NvbnNlY3V0aXZlX2ZhaWx1cmVzJywgJ25vX3JlY2VudF9zdWNjZXNzJ10sIGdldFBpcGVsaW5lU3RyZWFrcyhzY29wZSksIFtdKSxcbiAgICAgIHRyYWNrKFsnZmFpbGVkX2FmdGVyX2NvbmZpZ19jaGFuZ2UnXSwgZ2V0UGlwZWxpbmVDb25maWdDaGFuZ2VzKHNjb3BlKSwgbmV3IE1hcDxzdHJpbmcsIERhdGU+KCkpLFxuICAgICAgdHJhY2soWyd2dWxuZXJhYmxlX3BsdWdpbiddLCBnZXRWdWxuZXJhYmxlUGlwZWxpbmVzKHNjb3BlKSwgW10pLFxuICAgICAgdHJhY2soWydub19kZXBsb3lfdHJhY2tpbmcnXSwgZ2V0VW50cmFja2VkUGlwZWxpbmVzKHNjb3BlKSwgW10pLFxuICAgICAgc29mdGVuKHRoaXMuYXR0ZW50aW9uVGhyZXNob2xkcyhzY29wZS5vcmdJZCksIHt9KSxcbiAgICBdKTtcbiAgICBjb25zdCBpdGVtcyA9IGV2YWx1YXRlTmVlZHNBdHRlbnRpb24oe1xuICAgICAgY3VycmVudCxcbiAgICAgIHByZXZpb3VzOiBwcmlvcixcbiAgICAgIHN0cmVha3M6IG5ldyBNYXAoc3RyZWFrUm93cy5tYXAoKHIpID0+IFtyLnBpcGVsaW5lSWQsIHtcbiAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlczogci5jb25zZWN1dGl2ZUZhaWx1cmVzLFxuICAgICAgICBsYXN0U3VjY2Vzc0F0OiByLmxhc3RTdWNjZXNzQXQsXG4gICAgICB9XSkpLFxuICAgICAgY29uZmlnQ2hhbmdlcyxcbiAgICAgIC8vIEFuIHVuYXZhaWxhYmxlIGlucHV0IGlzIHBhc3NlZCBhcyBBQlNFTlQsIHNvIHRoZSBldmFsdWF0b3Igc2tpcHMgaXRzIHJ1bGVcbiAgICAgIC8vIHJhdGhlciB0aGFuIGV2YWx1YXRpbmcgaXQgYWdhaW5zdCBhbiBlbXB0eSBzZXQuXG4gICAgICAuLi4odW5hdmFpbGFibGUuaGFzKCd2dWxuZXJhYmxlX3BsdWdpbicpID8ge30gOiB7IHZ1bG5lcmFibGVQaXBlbGluZXM6IG5ldyBTZXQodnVsbmVyYWJsZSkgfSksXG4gICAgICAuLi4odW5hdmFpbGFibGUuaGFzKCdub19kZXBsb3lfdHJhY2tpbmcnKSA/IHt9IDogeyB1bnRyYWNrZWRQaXBlbGluZXM6IG5ldyBTZXQodW50cmFja2VkKSB9KSxcbiAgICAgIHRocmVzaG9sZHM6IHRocmVzaG9sZHNGcm9tKHRocmVzaG9sZHMpLFxuICAgICAgbm93OiBuZXcgRGF0ZShzY29wZS50byksXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zLFxuICAgICAgdGhyZXNob2xkczogdGhyZXNob2xkc0Zyb20odGhyZXNob2xkcyksXG4gICAgICAvLyBXaGF0IHRoZSBydWxlcyB3ZXJlIGV2YWx1YXRlZCBvdmVyLCBzbyBhIHJlYWRlciBjYW4gdGVsbCBhbiBlbXB0eSBsaXN0XG4gICAgICAvLyAoXCJub3RoaW5nIHRyaXBwZWRcIikgZnJvbSBhbiBlbXB0eSBpbnB1dCAoXCJub3RoaW5nIHJhblwiKS5cbiAgICAgIHBpcGVsaW5lc0V2YWx1YXRlZDogY3VycmVudC5sZW5ndGgsXG4gICAgICAvLyBSdWxlcyB0aGF0IGNvdWxkIE5PVCBydW4gdGhpcyBwZXJpb2QgYmVjYXVzZSB0aGVpciBpbnB1dCBmYWlsZWQgdG8gbG9hZC5cbiAgICAgIHVuYXZhaWxhYmxlUnVsZXM6IFsuLi51bmF2YWlsYWJsZV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3JnJ3Mgc3RvcmVkIG5lZWRzLWF0dGVudGlvbiB0aHJlc2hvbGRzLCBvciBge31gLlxuICAgKlxuICAgKiBSZXR1cm5lZCBhcyBhIHBhcnRpYWwgb24gcHVycG9zZTogYHRocmVzaG9sZHNGcm9tYCBmaWxscyB0aGUgcmVzdCBwZXIgZmllbGQsIHNvXG4gICAqIGFuIG9yZyB0aGF0IGNvbmZpZ3VyZWQgb25lIG51bWJlciBrZWVwcyB0aGUgZGVmYXVsdHMgZm9yIHRoZSBvdGhlcnMgaW5zdGVhZCBvZlxuICAgKiBzaWxlbnRseSBkaXNhYmxpbmcgZm91ciBydWxlcyBieSBzZXR0aW5nIG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXR0ZW50aW9uVGhyZXNob2xkcyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IHQ6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0QXR0ZW50aW9uVGhyZXNob2xkcyB9KVxuICAgICAgICAuZnJvbShzY2hlbWEuZG9yYVNldHRpbmdzKVxuICAgICAgICAud2hlcmUoZXEoc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgb3JnSWQpKVxuICAgICAgICAubGltaXQoMSkpKTtcbiAgICBjb25zdCBzdG9yZWQgPSAocm93cyBhcyBBcnJheTx7IHQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsIH0+KVswXT8udDtcbiAgICByZXR1cm4gc3RvcmVkICYmIHR5cGVvZiBzdG9yZWQgPT09ICdvYmplY3QnID8gc3RvcmVkIDoge307XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9yZydzIG93biBtaW51dGVzLXNhdmVkLXBlci1waXBlbGluZSBhc3N1bXB0aW9uLCBvciBudWxsLlxuICAgKlxuICAgKiBSZWFkIGhlcmUgc28gdGhlIGFkb3B0aW9uIHNlY3Rpb24gY2Fubm90IGFjY2lkZW50YWxseSBiZSBoYW5kZWQgYVxuICAgKiBwbGF0Zm9ybS1jaG9zZW4gZGVmYXVsdDogdGhlIG51bWJlciBvbmx5IG1lYW5zIHNvbWV0aGluZyB3aGVuIHRoZSBjdXN0b21lclxuICAgKiBwaWNrZWQgaXQsIGFuZCBgbnVsbGAgcmVuZGVycyBhcyBcIm5vdCBlc3RpbWF0ZWRcIiByYXRoZXIgdGhhbiBhcyB6ZXJvLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0aW1lU2F2ZWRBc3N1bXB0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHsgbWludXRlczogc2NoZW1hLmRvcmFTZXR0aW5ncy50aW1lU2F2ZWRNaW51dGVzUGVyUGlwZWxpbmUgfSlcbiAgICAgICAgLmZyb20oc2NoZW1hLmRvcmFTZXR0aW5ncylcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsIG9yZ0lkKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIEFycmF5PHsgbWludXRlczogbnVtYmVyIHwgbnVsbCB9PilbMF0/Lm1pbnV0ZXMgPz8gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEhvdyBtYW55IHBpcGVsaW5lcyB0aGUgbmVlZHMtYXR0ZW50aW9uIHJ1bGVzIGNvbnNpZGVyLlxuICpcbiAqIFRoZSBzZWN0aW9uIGlzIGEgc2hvcnQgbGlzdCBvZiB0aGluZ3MgdG8gZG8sIG5vdCBhIHRhYmxlIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoZVxuICogZXZhbHVhdG9yIHNlZXMgdGhlIHNhbWUgd29yc3QtZmlyc3Qgc2xpY2UgdGhlIGJyZWFrZG93biBzZWN0aW9uIHNob3dzLiBBIHBpcGVsaW5lXG4gKiBvdXRzaWRlIHRoZSB3b3JzdCAyNSBieSB0aGUgYnJlYWtkb3duJ3Mgb3duIG9yZGVyaW5nIGlzIG5vdCB0aGUgb25lIGEgbGVhZCBzaG91bGRcbiAqIGJlIHRvbGQgYWJvdXQgZmlyc3QuXG4gKi9cbmNvbnN0IEFUVEVOVElPTl9QSVBFTElORV9MSU1JVCA9IDI1O1xuXG4vKipcbiAqIFJ1biBhIHJlYWQsIG9yIGZhbGwgYmFjay5cbiAqXG4gKiBPbmx5IGZvciB0aGUgbmVlZHMtYXR0ZW50aW9uIGlucHV0cywgd2hlcmUgYW4gYWJzZW50IGlucHV0IFNLSVBTIGEgcnVsZSBhbmQgdGhlXG4gKiBldmFsdWF0b3Igc2F5cyBzby4gTmV2ZXIgdXNlZCBmb3IgYSBudW1iZXIgdGhlIHJlcG9ydCBwcmVzZW50czogYSBxdWVyeSB0aGF0IGZhaWxzXG4gKiBhbmQgc2lsZW50bHkgcmVhZHMgYXMgemVybyBpcyBob3cgYSByZXBvcnQgc3RhdGVzIHNvbWV0aGluZyBmYWxzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc29mdGVuPFQ+KHA6IFByb21pc2U8VD4sIGZhbGxiYWNrOiBULCBvbkZhaWw/OiAoKSA9PiB2b2lkKTogUHJvbWlzZTxUPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHA7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKCdOZWVkcy1hdHRlbnRpb24gaW5wdXQgdW5hdmFpbGFibGU7IGl0cyBydWxlIGlzIHNraXBwZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICBvbkZhaWw/LigpO1xuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVwb3J0aW5nU2VydmljZSA9IG5ldyBSZXBvcnRpbmdTZXJ2aWNlKCk7XG4iXX0=
@@ -224,4 +224,4 @@ export function semverOrderBy(col) {
224
224
  asc(col),
225
225
  ];
226
226
  }
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtdmVyLXJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZW12ZXItcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWtCL0QsTUFBTSxNQUFNLEdBQUcsNkhBQTZILENBQUM7QUFDN0ksTUFBTSxPQUFPLEdBQUcscURBQXFELENBQUM7QUFFdEUsMEVBQTBFO0FBQzFFLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQztBQUUvQiwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFdBQVcsQ0FBQyxPQUFlO0lBQ3pDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQixNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsSUFBSSxLQUFLLEdBQUcsUUFBUSxJQUFJLEtBQUssR0FBRyxRQUFRLElBQUksS0FBSyxHQUFHLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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QyxHQUFHLENBQUMsQ0FBQztRQUN2QixHQUFHLENBQUMsR0FBRyxDQUFDO0tBQ1QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBWZXJzaW9uIHNwZWNzIGZvciBwbHVnaW4gbG9va3VwcyAoZG9jcy9wbHVnaW4taW5zdGFsbGluZy5tZCkuXG4gKlxuICogQSBzbWFsbCwgZGVwZW5kZW5jeS1mcmVlIG1hdGNoZXIgZm9yIGV4YWN0bHkgdGhlIGZvcm1zIHBsdWdpbiByZWZlcmVuY2VzIHVzZTpcbiAqXG4gKiAgIGV4YWN0ICAgIGAxLjIuM2AsIGAxLjIuMy1yYy4xYCAgIHRoYXQgb25lIHZlcnNpb25cbiAqICAgY2FyZXQgICAgYF4xLjIuM2AgICAgICAgICAgICAgICAgPj0xLjIuMyA8Mi4wLjAgIChgXjAuMi4zYCA8MC4zLjAsIGBeMC4wLjNgIDwwLjAuNClcbiAqICAgICAgICAgICAgYF4xYCwgYF4xLjJgICAgICAgICAgICAgPj0xLjAuMCA8Mi4wLjAsID49MS4yLjAgPDIuMC4wICAoYF4wLjJgIDwwLjMuMCwgYF4wYCA8MS4wLjApXG4gKiAgIHRpbGRlICAgIGB+MS4yLjNgICAgICAgICAgICAgICAgID49MS4yLjMgPDEuMy4wXG4gKiAgICAgICAgICAgIGB+MWAsIGB+MS4yYCAgICAgICAgICAgID49MS4wLjAgPDIuMC4wLCA+PTEuMi4wIDwxLjMuMFxuICogICBwYXJ0aWFsICBgMWAsIGAxLnhgLCBgMS4yYCwgYDEuMi54YCAgPj0xLjAuMCA8Mi4wLjAgLyA+PTEuMi4wIDwxLjMuMFxuICogICBsYXRlc3QgICBgbGF0ZXN0YCAgICAgICAgICAgICAgICB0aGUgaGlnaGVzdCBzdGFibGUgdmVyc2lvblxuICpcbiAqIG5wbSBzZW1hbnRpY3MgdGhyb3VnaG91dCwgaW5jbHVkaW5nIHByZXJlbGVhc2VzOiBhIHJhbmdlIG5ldmVyIG1hdGNoZXMgYVxuICogcHJlcmVsZWFzZSB1bmxlc3MgaXRzIG93biBsb3dlciBib3VuZCBpcyBhIHByZXJlbGVhc2Ugb2YgdGhlIFNBTUVcbiAqIG1ham9yLm1pbm9yLnBhdGNoIChzbyBgXjEuMi4zLWJldGEuMWAgYWRtaXRzIGAxLjIuMy1iZXRhLjJgIGJ1dCBub3RcbiAqIGAxLjMuMC1iZXRhLjFgKS4gQW4gZXhhY3Qgc3BlYyBtYXkgbmFtZSBhIHByZXJlbGVhc2UgZGlyZWN0bHkuXG4gKlxuICogVGhlIG1hdGNoZXIgcnVucyBpbiBKUyAoe0BsaW5rIHNhdGlzZmllc1ZlcnNpb25TcGVjfSkgYW5kIOKAlCBmb3IgdGhlIHF1ZXJ5XG4gKiBidWlsZGVycyDigJQgYXMgU1FMIG92ZXIgdGhlIGB2ZXJzaW9uYCBjb2x1bW4gKHtAbGluayB2ZXJzaW9uU3BlY0NvbmRpdGlvbn0sXG4gKiB7QGxpbmsgc2VtdmVyT3JkZXJCeX0pOyB0aGUgdHdvIGFyZSBrZXB0IGVxdWl2YWxlbnQgYnkgdGhlIHNoYXJlZCB0ZXN0cy5cbiAqL1xuXG5pbXBvcnQgeyBhbmQsIGFzYywgZGVzYywgZXEsIG9yLCBzcWwsIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQW55Q29sdW1uIH0gZnJvbSAnZHJpenpsZS1vcm0vY29sdW1uJztcblxuLyoqIEEgcGFyc2VkIGBtYWpvci5taW5vci5wYXRjaFstcHJlcmVsZWFzZV1bK2J1aWxkXWAgdmVyc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VtdmVyUGFydHMge1xuICBtYWpvcjogbnVtYmVyO1xuICBtaW5vcjogbnVtYmVyO1xuICBwYXRjaDogbnVtYmVyO1xuICAvKiogRG90LXNlcGFyYXRlZCBwcmVyZWxlYXNlIGlkZW50aWZpZXJzOyBlbXB0eSBmb3IgYSBzdGFibGUgdmVyc2lvbi4gKi9cbiAgcHJlcmVsZWFzZTogc3RyaW5nW107XG59XG5cbi8qKiBBIHBhcnNlZCB2ZXJzaW9uIHNwZWMuIGByYW5nZWAgYm91bmRzIGFyZSBgW21pbiwgbWF4KWAuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uU3BlYyA9XG4gIHwgeyBraW5kOiAnZXhhY3QnOyB2ZXJzaW9uOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xhdGVzdCcgfVxuICB8IHsga2luZDogJ3JhbmdlJzsgbWluOiBTZW12ZXJQYXJ0czsgbWF4OiBTZW12ZXJQYXJ0cyB9O1xuXG5jb25zdCBTRU1WRVIgPSAvXigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKSg/Oi0oWzAtOUEtWmEtei1dKyg/OlxcLlswLTlBLVphLXotXSspKikpPyg/OlxcK1swLTlBLVphLXotXSsoPzpcXC5bMC05QS1aYS16LV0rKSopPyQvO1xuY29uc3QgUEFSVElBTCA9IC9eKDB8WzEtOV1cXGQqKSg/OlxcLigwfFsxLTldXFxkKnx4fFxcKikpPyg/OlxcLih4fFxcKikpPyQvO1xuXG4vKiogVXBwZXIgYm91bmQgb24gYW55IG51bWVyaWMgcGFydCAoa2VlcHMgU1FMIGA6OmludGAgY2FzdHMgaW4gcmFuZ2UpLiAqL1xuY29uc3QgTUFYX1BBUlQgPSAyXzE0N180ODNfNjQ3O1xuXG4vKiogUGFyc2UgYSBmdWxsIHNlbXZlciBzdHJpbmcsIG9yIGBudWxsYCB3aGVuIGl0IGlzbid0IG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbXZlcih2ZXJzaW9uOiBzdHJpbmcpOiBTZW12ZXJQYXJ0cyB8IG51bGwge1xuICBjb25zdCBtID0gU0VNVkVSLmV4ZWModmVyc2lvbi50cmltKCkpO1xuICBpZiAoIW0pIHJldHVybiBudWxsO1xuICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSBbTnVtYmVyKG1bMV0pLCBOdW1iZXIobVsyXSksIE51bWJlcihtWzNdKV07XG4gIGlmIChtYWpvciA+IE1BWF9QQVJUIHx8IG1pbm9yID4gTUFYX1BBUlQgfHwgcGF0Y2ggPiBNQVhfUEFSVCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7IG1ham9yLCBtaW5vciwgcGF0Y2gsIHByZXJlbGVhc2U6IG1bNF0gPyBtWzRdLnNwbGl0KCcuJykgOiBbXSB9O1xufVxuXG5mdW5jdGlvbiBjb21wYXJlSWRlbnRpZmllcnMoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBhbiA9IC9eXFxkKyQvLnRlc3QoYSk7XG4gIGNvbnN0IGJuID0gL15cXGQrJC8udGVzdChiKTtcbiAgaWYgKGFuICYmIGJuKSByZXR1cm4gTnVtYmVyKGEpIC0gTnVtYmVyKGIpO1xuICBpZiAoYW4pIHJldHVybiAtMTsgLy8gbnVtZXJpYyBpZGVudGlmaWVycyBzb3J0IGJlbG93IGFscGhhbnVtZXJpYyBvbmVzXG4gIGlmIChibikgcmV0dXJuIDE7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cblxuLyoqIFNlbXZlciAyLjAgcHJlY2VkZW5jZTogbmVnYXRpdmUgd2hlbiBgYSA8IGJgLCAwIHdoZW4gZXF1YWwsIHBvc2l0aXZlIHdoZW4gYGEgPiBiYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlU2VtdmVyUGFydHMoYTogU2VtdmVyUGFydHMsIGI6IFNlbXZlclBhcnRzKTogbnVtYmVyIHtcbiAgaWYgKGEubWFqb3IgIT09IGIubWFqb3IpIHJldHVybiBhLm1ham9yIC0gYi5tYWpvcjtcbiAgaWYgKGEubWlub3IgIT09IGIubWlub3IpIHJldHVybiBhLm1pbm9yIC0gYi5taW5vcjtcbiAgaWYgKGEucGF0Y2ggIT09IGIucGF0Y2gpIHJldHVybiBhLnBhdGNoIC0gYi5wYXRjaDtcbiAgLy8gQSBzdGFibGUgdmVyc2lvbiBvdXRyYW5rcyBhbnkgcHJlcmVsZWFzZSBvZiB0aGUgc2FtZSB0dXBsZS5cbiAgaWYgKCFhLnByZXJlbGVhc2UubGVuZ3RoIHx8ICFiLnByZXJlbGVhc2UubGVuZ3RoKSByZXR1cm4gYi5wcmVyZWxlYXNlLmxlbmd0aCAtIGEucHJlcmVsZWFzZS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5tYXgoYS5wcmVyZWxlYXNlLmxlbmd0aCwgYi5wcmVyZWxlYXNlLmxlbmd0aCk7IGkrKykge1xuICAgIGlmIChhLnByZXJlbGVhc2VbaV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgIGlmIChiLnByZXJlbGVhc2VbaV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuIDE7XG4gICAgY29uc3QgYyA9IGNvbXBhcmVJZGVudGlmaWVycyhhLnByZXJlbGVhc2VbaV0hLCBiLnByZXJlbGVhc2VbaV0hKTtcbiAgICBpZiAoYyAhPT0gMCkgcmV0dXJuIGM7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKiB7QGxpbmsgY29tcGFyZVNlbXZlclBhcnRzfSBvdmVyIHN0cmluZ3M7IHVucGFyc2VhYmxlIHZlcnNpb25zIHNvcnQgbG93ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVTZW12ZXIoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBwYSA9IHBhcnNlU2VtdmVyKGEpO1xuICBjb25zdCBwYiA9IHBhcnNlU2VtdmVyKGIpO1xuICBpZiAoIXBhIHx8ICFwYikgcmV0dXJuIChwYSA/IDEgOiAwKSAtIChwYiA/IDEgOiAwKTtcbiAgcmV0dXJuIGNvbXBhcmVTZW12ZXJQYXJ0cyhwYSwgcGIpO1xufVxuXG5jb25zdCBwYXJ0cyA9IChtYWpvcjogbnVtYmVyLCBtaW5vcjogbnVtYmVyLCBwYXRjaDogbnVtYmVyLCBwcmVyZWxlYXNlOiBzdHJpbmdbXSA9IFtdKTogU2VtdmVyUGFydHMgPT5cbiAgKHsgbWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlcmVsZWFzZSB9KTtcblxuLyoqXG4gKiBQYXJzZSBhIHZlcnNpb24gc3BlYywgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm9uZSBvZiB0aGUgc3VwcG9ydGVkIGZvcm1zICh0aGVcbiAqIGNhbGxlciB0aGVuIHRyZWF0cyB0aGUgaW5wdXQgYXMgYSBsaXRlcmFsIHZlcnNpb24sIHdoaWNoIG1hdGNoZXMgbm90aGluZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZlcnNpb25TcGVjKHNwZWM6IHN0cmluZyk6IFZlcnNpb25TcGVjIHwgbnVsbCB7XG4gIGNvbnN0IHMgPSBzcGVjLnRyaW0oKTtcbiAgaWYgKHMgPT09ICdsYXRlc3QnKSByZXR1cm4geyBraW5kOiAnbGF0ZXN0JyB9O1xuXG4gIGlmIChzLnN0YXJ0c1dpdGgoJ14nKSB8fCBzLnN0YXJ0c1dpdGgoJ34nKSkge1xuICAgIGNvbnN0IHBhcnRpYWwgPSBQQVJUSUFMLmV4ZWMocy5zbGljZSgxKSk7XG4gICAgaWYgKHBhcnRpYWwgJiYgIXBhcnNlU2VtdmVyKHMuc2xpY2UoMSkpKSByZXR1cm4gcGFydGlhbE9wZXJhdG9yUmFuZ2Uoc1swXSBhcyAnXicgfCAnficsIHBhcnRpYWwpO1xuICAgIGNvbnN0IGJhc2UgPSBwYXJzZVNlbXZlcihzLnNsaWNlKDEpKTtcbiAgICBpZiAoIWJhc2UpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHsgbWFqb3IsIG1pbm9yLCBwYXRjaCB9ID0gYmFzZTtcbiAgICBsZXQgbWF4OiBTZW12ZXJQYXJ0cztcbiAgICBpZiAoc1swXSA9PT0gJ34nKSBtYXggPSBwYXJ0cyhtYWpvciwgbWlub3IgKyAxLCAwKTtcbiAgICBlbHNlIGlmIChtYWpvciA+IDApIG1heCA9IHBhcnRzKG1ham9yICsgMSwgMCwgMCk7XG4gICAgZWxzZSBpZiAobWlub3IgPiAwKSBtYXggPSBwYXJ0cygwLCBtaW5vciArIDEsIDApO1xuICAgIGVsc2UgbWF4ID0gcGFydHMoMCwgMCwgcGF0Y2ggKyAxKTtcbiAgICByZXR1cm4geyBraW5kOiAncmFuZ2UnLCBtaW46IGJhc2UsIG1heCB9O1xuICB9XG5cbiAgaWYgKHBhcnNlU2VtdmVyKHMpKSByZXR1cm4geyBraW5kOiAnZXhhY3QnLCB2ZXJzaW9uOiBzIH07XG5cbiAgY29uc3QgbSA9IFBBUlRJQUwuZXhlYyhzKTtcbiAgaWYgKCFtKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbWFqb3IgPSBOdW1iZXIobVsxXSk7XG4gIGNvbnN0IG1pbm9yV2lsZCA9IG1bMl0gPT09IHVuZGVmaW5lZCB8fCBtWzJdID09PSAneCcgfHwgbVsyXSA9PT0gJyonO1xuICBpZiAobWFqb3IgPiBNQVhfUEFSVCkgcmV0dXJuIG51bGw7XG4gIGlmIChtaW5vcldpbGQpIHJldHVybiB7IGtpbmQ6ICdyYW5nZScsIG1pbjogcGFydHMobWFqb3IsIDAsIDApLCBtYXg6IHBhcnRzKG1ham9yICsgMSwgMCwgMCkgfTtcbiAgY29uc3QgbWlub3IgPSBOdW1iZXIobVsyXSk7XG4gIGlmIChtaW5vciA+IE1BWF9QQVJUKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsga2luZDogJ3JhbmdlJywgbWluOiBwYXJ0cyhtYWpvciwgbWlub3IsIDApLCBtYXg6IHBhcnRzKG1ham9yLCBtaW5vciArIDEsIDApIH07XG59XG5cbi8qKlxuICogYF5gIC8gYH5gIG92ZXIgYSBQQVJUSUFMIHZlcnNpb24gKG5wbSk6IHRoZSBtaXNzaW5nIHBhcnRzIGFyZSB6ZXJvLCBhbmQgdGhlXG4gKiB1cHBlciBib3VuZCBmb2xsb3dzIHRoZSBvcGVyYXRvciDigJQgYF4xYCAvIGB+MWAgPDIuMC4wLCBgXjEuMmAgPDIuMC4wIGJ1dFxuICogYH4xLjJgIDwxLjMuMCwgYW5kIGEgemVybyBtYWpvciBuYXJyb3dzIGEgY2FyZXQgdG8gdGhlIG5leHQgbWlub3JcbiAqIChgXjAuMmAgPDAuMy4wKSBvciBtYWpvciAoYF4wYCA8MS4wLjApLlxuICovXG5mdW5jdGlvbiBwYXJ0aWFsT3BlcmF0b3JSYW5nZShvcDogJ14nIHwgJ34nLCBtOiBSZWdFeHBFeGVjQXJyYXkpOiBWZXJzaW9uU3BlYyB8IG51bGwge1xuICBjb25zdCBtYWpvciA9IE51bWJlcihtWzFdKTtcbiAgY29uc3QgbWlub3JHaXZlbiA9IG1bMl0gIT09IHVuZGVmaW5lZCAmJiBtWzJdICE9PSAneCcgJiYgbVsyXSAhPT0gJyonO1xuICBjb25zdCBtaW5vciA9IG1pbm9yR2l2ZW4gPyBOdW1iZXIobVsyXSkgOiAwO1xuICBpZiAobWFqb3IgPiBNQVhfUEFSVCB8fCBtaW5vciA+IE1BWF9QQVJUKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbWluID0gcGFydHMobWFqb3IsIG1pbm9yLCAwKTtcbiAgaWYgKCFtaW5vckdpdmVuKSByZXR1cm4geyBraW5kOiAncmFuZ2UnLCBtaW4sIG1heDogcGFydHMobWFqb3IgKyAxLCAwLCAwKSB9O1xuICBpZiAob3AgPT09ICd+JyB8fCBtYWpvciA9PT0gMCkgcmV0dXJuIHsga2luZDogJ3JhbmdlJywgbWluLCBtYXg6IHBhcnRzKG1ham9yLCBtaW5vciArIDEsIDApIH07XG4gIHJldHVybiB7IGtpbmQ6ICdyYW5nZScsIG1pbiwgbWF4OiBwYXJ0cyhtYWpvciArIDEsIDAsIDApIH07XG59XG5cbi8qKiBUcnVlIHdoZW4gYHNwZWNgIHJlc29sdmVzIHRvIGEgU0VUIG9mIHZlcnNpb25zIChyYW5nZSBvciBgbGF0ZXN0YCksIG5vdCBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uUmFuZ2Uoc3BlYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlVmVyc2lvblNwZWMoc3BlYyk7XG4gIHJldHVybiBwYXJzZWQgIT09IG51bGwgJiYgcGFyc2VkLmtpbmQgIT09ICdleGFjdCc7XG59XG5cbi8qKiBXaGV0aGVyIGB2ZXJzaW9uYCBzYXRpc2ZpZXMgYHNwZWNgIChhIHN0cmluZyBvciBhbiBhbHJlYWR5LXBhcnNlZCBzcGVjKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYXRpc2ZpZXNWZXJzaW9uU3BlYyh2ZXJzaW9uOiBzdHJpbmcsIHNwZWM6IHN0cmluZyB8IFZlcnNpb25TcGVjKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiBzcGVjID09PSAnc3RyaW5nJyA/IHBhcnNlVmVyc2lvblNwZWMoc3BlYykgOiBzcGVjO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIHR5cGVvZiBzcGVjID09PSAnc3RyaW5nJyAmJiB2ZXJzaW9uID09PSBzcGVjO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdleGFjdCcpIHJldHVybiB2ZXJzaW9uID09PSBwYXJzZWQudmVyc2lvbjtcbiAgY29uc3QgdiA9IHBhcnNlU2VtdmVyKHZlcnNpb24pO1xuICBpZiAoIXYpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnbGF0ZXN0JykgcmV0dXJuIHYucHJlcmVsZWFzZS5sZW5ndGggPT09IDA7XG4gIGlmIChjb21wYXJlU2VtdmVyUGFydHModiwgcGFyc2VkLm1pbikgPCAwIHx8IGNvbXBhcmVTZW12ZXJQYXJ0cyh2LCBwYXJzZWQubWF4KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmICh2LnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgeyBtaW4gfSA9IHBhcnNlZDtcbiAgcmV0dXJuIG1pbi5wcmVyZWxlYXNlLmxlbmd0aCA+IDAgJiYgdi5tYWpvciA9PT0gbWluLm1ham9yICYmIHYubWlub3IgPT09IG1pbi5taW5vciAmJiB2LnBhdGNoID09PSBtaW4ucGF0Y2g7XG59XG5cbi8qKiBUaGUgaGlnaGVzdCBvZiBgdmVyc2lvbnNgIHNhdGlzZnlpbmcgYHNwZWNgLCBvciBgbnVsbGAuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4U2F0aXNmeWluZyh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10sIHNwZWM6IHN0cmluZyB8IFZlcnNpb25TcGVjKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBiZXN0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZm9yIChjb25zdCB2IG9mIHZlcnNpb25zKSB7XG4gICAgaWYgKHNhdGlzZmllc1ZlcnNpb25TcGVjKHYsIHNwZWMpICYmIChiZXN0ID09PSBudWxsIHx8IGNvbXBhcmVTZW12ZXIodiwgYmVzdCkgPiAwKSkgYmVzdCA9IHY7XG4gIH1cbiAgcmV0dXJuIGJlc3Q7XG59XG5cbi8vIC0tIFNRTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBUaGUgYHZlcnNpb25gIGNvbHVtbiBpcyBDSEVDSy1jb25zdHJhaW5lZCB0byBgXlxcZCtcXC5cXGQrXFwuXFxkKygtcHJlKT8oXFwrYnVpbGQpPyRgLFxuLy8gc28gdGhlIG51bWVyaWMgcGFydHMgYXJlIHNwbGl0IG91dCByZWxpYWJseTogbWFqb3IvbWlub3IgYXJlIHRoZSBmaXJzdCB0d29cbi8vIGRvdCBmaWVsZHMsIHBhdGNoIGlzIHRoZSB0aGlyZCB3aXRoIGFueSBgLXByZWAgLyBgK2J1aWxkYCBzdWZmaXggcmVtb3ZlZCwgYW5kXG4vLyB0aGUgcHJlcmVsZWFzZSBpcyB3aGF0ZXZlciBzaXRzIGJldHdlZW4gdGhlIGZpcnN0IGAtYCBhbmQgYW55IGArYC5cblxuY29uc3QgbWFqb3JPZiA9IChjb2w6IEFueUNvbHVtbik6IFNRTCA9PiBzcWxgc3BsaXRfcGFydCgke2NvbH0sICcuJywgMSk6OmludGA7XG5jb25zdCBtaW5vck9mID0gKGNvbDogQW55Q29sdW1uKTogU1FMID0+IHNxbGBzcGxpdF9wYXJ0KCR7Y29sfSwgJy4nLCAyKTo6aW50YDtcbmNvbnN0IHBhdGNoT2YgPSAoY29sOiBBbnlDb2x1bW4pOiBTUUwgPT4gc3FsYHN1YnN0cmluZygke2NvbH0gZnJvbSAnXlswLTldK1xcXFwuWzAtOV0rXFxcXC4oWzAtOV0rKScpOjppbnRgO1xuLyoqIFRoZSBwcmVyZWxlYXNlIHN1ZmZpeCwgb3IgTlVMTCBmb3IgYSBzdGFibGUgdmVyc2lvbi4gKi9cbmNvbnN0IHByZXJlbGVhc2VPZiA9IChjb2w6IEFueUNvbHVtbik6IFNRTCA9PiBzcWxgc3Vic3RyaW5nKHNwbGl0X3BhcnQoJHtjb2x9LCAnKycsIDEpIGZyb20gJ15bMC05XStcXFxcLlswLTldK1xcXFwuWzAtOV0rLSguKykkJylgO1xuXG5jb25zdCB0dXBsZU9mID0gKGNvbDogQW55Q29sdW1uKTogU1FMID0+IHNxbGAoJHttYWpvck9mKGNvbCl9LCAke21pbm9yT2YoY29sKX0sICR7cGF0Y2hPZihjb2wpfSlgO1xuY29uc3QgdHVwbGVMaXQgPSAocDogU2VtdmVyUGFydHMpOiBTUUwgPT4gc3FsYCgke3AubWFqb3J9OjppbnQsICR7cC5taW5vcn06OmludCwgJHtwLnBhdGNofTo6aW50KWA7XG5cbi8qKlxuICogU1FMIHByZWRpY2F0ZSBmb3IgYGNvbGAgc2F0aXNmeWluZyBgc3BlY2AuIFByZWNpc2lvbiBub3RlOiBwcmVyZWxlYXNlLXZzLVxuICogcHJlcmVsZWFzZSBvcmRlcmluZyBXSVRISU4gdGhlIGxvd2VyIGJvdW5kJ3Mgb3duIHR1cGxlIGlzIG5vdCBjb21wYXJlZCBpbiBTUUxcbiAqIChldmVyeSBwcmVyZWxlYXNlIG9mIHRoYXQgdHVwbGUgaXMgYWRtaXR0ZWQpIOKAlCB7QGxpbmsgc2VtdmVyT3JkZXJCeX0gc3RpbGxcbiAqIHJhbmtzIHRoZW0sIGFuZCB0aGUgSlMgbWF0Y2hlciBpcyBleGFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25TcGVjQ29uZGl0aW9uKGNvbDogQW55Q29sdW1uLCBzcGVjOiBzdHJpbmcpOiBTUUwge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVZlcnNpb25TcGVjKHNwZWMpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIGVxKGNvbCwgc3BlYyk7XG4gIGlmIChwYXJzZWQua2luZCA9PT0gJ2V4YWN0JykgcmV0dXJuIGVxKGNvbCwgcGFyc2VkLnZlcnNpb24pO1xuICBjb25zdCBzdGFibGUgPSBzcWxgJHtwcmVyZWxlYXNlT2YoY29sKX0gSVMgTlVMTGA7XG4gIGlmIChwYXJzZWQua2luZCA9PT0gJ2xhdGVzdCcpIHJldHVybiBzdGFibGU7XG5cbiAgY29uc3QgeyBtaW4sIG1heCB9ID0gcGFyc2VkO1xuICBjb25zdCBpblJhbmdlID0gYW5kKHNxbGAke3R1cGxlT2YoY29sKX0gPj0gJHt0dXBsZUxpdChtaW4pfWAsIHNxbGAke3R1cGxlT2YoY29sKX0gPCAke3R1cGxlTGl0KG1heCl9YCkhO1xuICBpZiAobWluLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSByZXR1cm4gYW5kKGluUmFuZ2UsIHN0YWJsZSkhO1xuICAvLyBBIHByZXJlbGVhc2UgbG93ZXIgYm91bmQ6IHN0YWJsZSB2ZXJzaW9ucyBhYm92ZSBpdCwgcGx1cyBwcmVyZWxlYXNlcyBvZiBpdHMgb3duIHR1cGxlLlxuICByZXR1cm4gYW5kKGluUmFuZ2UsIG9yKHN0YWJsZSwgc3FsYCR7dHVwbGVPZihjb2wpfSA9ICR7dHVwbGVMaXQobWluKX1gKSkhO1xufVxuXG4vKipcbiAqIE9SREVSIEJZIHRlcm1zIHJhbmtpbmcgYGNvbGAgaGlnaGVzdC1zZW12ZXIgZmlyc3Q6IG51bWVyaWMgbWFqb3IvbWlub3IvcGF0Y2gsXG4gKiBhIHN0YWJsZSB2ZXJzaW9uIGFib3ZlIGl0cyBwcmVyZWxlYXNlcywgdGhlbiB0aGUgcHJlcmVsZWFzZSB0ZXh0IChhXG4gKiBsZXhpY29ncmFwaGljIHRpZWJyZWFrIOKAlCBjbG9zZSB0bywgbm90IGV4YWN0bHksIHNlbXZlciBpZGVudGlmaWVyIG9yZGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbXZlck9yZGVyQnkoY29sOiBBbnlDb2x1bW4pOiBTUUxbXSB7XG4gIHJldHVybiBbXG4gICAgZGVzYyhtYWpvck9mKGNvbCkpLFxuICAgIGRlc2MobWlub3JPZihjb2wpKSxcbiAgICBkZXNjKHBhdGNoT2YoY29sKSksXG4gICAgc3FsYCR7cHJlcmVsZWFzZU9mKGNvbCl9IElTIE5VTEwgREVTQ2AsXG4gICAgZGVzYyhwcmVyZWxlYXNlT2YoY29sKSksXG4gICAgYXNjKGNvbCksXG4gIF07XG59XG4iXX0=
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtdmVyLXJhbmdlLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3NlbXZlci1yYW5nZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBa0IvRCxNQUFNLE1BQU0sR0FBRyw2SEFBNkgsQ0FBQztBQUM3SSxNQUFNLE9BQU8sR0FBRyxxREFBcUQsQ0FBQztBQUV0RSwwRUFBMEU7QUFDMUUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDO0FBRS9CLCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQWU7SUFDekMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxJQUFJLEtBQUssR0FBRyxRQUFRLElBQUksS0FBSyxHQUFHLFFBQVEsSUFBSSxLQUFLLEdBQUcsUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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O1FBQ3ZCLEdBQUcsQ0FBQyxHQUFHLENBQUM7S0FDVCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFZlcnNpb24gc3BlY3MgZm9yIHBsdWdpbiBsb29rdXBzIChkb2NzL3BsdWdpbi1pbnN0YWxsaW5nLm1kKS5cbiAqXG4gKiBBIHNtYWxsLCBkZXBlbmRlbmN5LWZyZWUgbWF0Y2hlciBmb3IgZXhhY3RseSB0aGUgZm9ybXMgcGx1Z2luIHJlZmVyZW5jZXMgdXNlOlxuICpcbiAqICAgZXhhY3QgICAgYDEuMi4zYCwgYDEuMi4zLXJjLjFgICAgdGhhdCBvbmUgdmVyc2lvblxuICogICBjYXJldCAgICBgXjEuMi4zYCAgICAgICAgICAgICAgICA+PTEuMi4zIDwyLjAuMCAgKGBeMC4yLjNgIDwwLjMuMCwgYF4wLjAuM2AgPDAuMC40KVxuICogICAgICAgICAgICBgXjFgLCBgXjEuMmAgICAgICAgICAgICA+PTEuMC4wIDwyLjAuMCwgPj0xLjIuMCA8Mi4wLjAgIChgXjAuMmAgPDAuMy4wLCBgXjBgIDwxLjAuMClcbiAqICAgdGlsZGUgICAgYH4xLjIuM2AgICAgICAgICAgICAgICAgPj0xLjIuMyA8MS4zLjBcbiAqICAgICAgICAgICAgYH4xYCwgYH4xLjJgICAgICAgICAgICAgPj0xLjAuMCA8Mi4wLjAsID49MS4yLjAgPDEuMy4wXG4gKiAgIHBhcnRpYWwgIGAxYCwgYDEueGAsIGAxLjJgLCBgMS4yLnhgICA+PTEuMC4wIDwyLjAuMCAvID49MS4yLjAgPDEuMy4wXG4gKiAgIGxhdGVzdCAgIGBsYXRlc3RgICAgICAgICAgICAgICAgIHRoZSBoaWdoZXN0IHN0YWJsZSB2ZXJzaW9uXG4gKlxuICogbnBtIHNlbWFudGljcyB0aHJvdWdob3V0LCBpbmNsdWRpbmcgcHJlcmVsZWFzZXM6IGEgcmFuZ2UgbmV2ZXIgbWF0Y2hlcyBhXG4gKiBwcmVyZWxlYXNlIHVubGVzcyBpdHMgb3duIGxvd2VyIGJvdW5kIGlzIGEgcHJlcmVsZWFzZSBvZiB0aGUgU0FNRVxuICogbWFqb3IubWlub3IucGF0Y2ggKHNvIGBeMS4yLjMtYmV0YS4xYCBhZG1pdHMgYDEuMi4zLWJldGEuMmAgYnV0IG5vdFxuICogYDEuMy4wLWJldGEuMWApLiBBbiBleGFjdCBzcGVjIG1heSBuYW1lIGEgcHJlcmVsZWFzZSBkaXJlY3RseS5cbiAqXG4gKiBUaGUgbWF0Y2hlciBydW5zIGluIEpTICh7QGxpbmsgc2F0aXNmaWVzVmVyc2lvblNwZWN9KSBhbmQg4oCUIGZvciB0aGUgcXVlcnlcbiAqIGJ1aWxkZXJzIOKAlCBhcyBTUUwgb3ZlciB0aGUgYHZlcnNpb25gIGNvbHVtbiAoe0BsaW5rIHZlcnNpb25TcGVjQ29uZGl0aW9ufSxcbiAqIHtAbGluayBzZW12ZXJPcmRlckJ5fSk7IHRoZSB0d28gYXJlIGtlcHQgZXF1aXZhbGVudCBieSB0aGUgc2hhcmVkIHRlc3RzLlxuICovXG5cbmltcG9ydCB7IGFuZCwgYXNjLCBkZXNjLCBlcSwgb3IsIHNxbCwgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHR5cGUgeyBBbnlDb2x1bW4gfSBmcm9tICdkcml6emxlLW9ybS9jb2x1bW4nO1xuXG4vKiogQSBwYXJzZWQgYG1ham9yLm1pbm9yLnBhdGNoWy1wcmVyZWxlYXNlXVsrYnVpbGRdYCB2ZXJzaW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW12ZXJQYXJ0cyB7XG4gIG1ham9yOiBudW1iZXI7XG4gIG1pbm9yOiBudW1iZXI7XG4gIHBhdGNoOiBudW1iZXI7XG4gIC8qKiBEb3Qtc2VwYXJhdGVkIHByZXJlbGVhc2UgaWRlbnRpZmllcnM7IGVtcHR5IGZvciBhIHN0YWJsZSB2ZXJzaW9uLiAqL1xuICBwcmVyZWxlYXNlOiBzdHJpbmdbXTtcbn1cblxuLyoqIEEgcGFyc2VkIHZlcnNpb24gc3BlYy4gYHJhbmdlYCBib3VuZHMgYXJlIGBbbWluLCBtYXgpYC4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25TcGVjID1cbiAgfCB7IGtpbmQ6ICdleGFjdCc7IHZlcnNpb246IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnbGF0ZXN0JyB9XG4gIHwgeyBraW5kOiAncmFuZ2UnOyBtaW46IFNlbXZlclBhcnRzOyBtYXg6IFNlbXZlclBhcnRzIH07XG5cbmNvbnN0IFNFTVZFUiA9IC9eKDB8WzEtOV1cXGQqKVxcLigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopKD86LShbMC05QS1aYS16LV0rKD86XFwuWzAtOUEtWmEtei1dKykqKSk/KD86XFwrWzAtOUEtWmEtei1dKyg/OlxcLlswLTlBLVphLXotXSspKik/JC87XG5jb25zdCBQQVJUSUFMID0gL14oMHxbMS05XVxcZCopKD86XFwuKDB8WzEtOV1cXGQqfHh8XFwqKSk/KD86XFwuKHh8XFwqKSk/JC87XG5cbi8qKiBVcHBlciBib3VuZCBvbiBhbnkgbnVtZXJpYyBwYXJ0IChrZWVwcyBTUUwgYDo6aW50YCBjYXN0cyBpbiByYW5nZSkuICovXG5jb25zdCBNQVhfUEFSVCA9IDJfMTQ3XzQ4M182NDc7XG5cbi8qKiBQYXJzZSBhIGZ1bGwgc2VtdmVyIHN0cmluZywgb3IgYG51bGxgIHdoZW4gaXQgaXNuJ3Qgb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VtdmVyKHZlcnNpb246IHN0cmluZyk6IFNlbXZlclBhcnRzIHwgbnVsbCB7XG4gIGNvbnN0IG0gPSBTRU1WRVIuZXhlYyh2ZXJzaW9uLnRyaW0oKSk7XG4gIGlmICghbSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IFttYWpvciwgbWlub3IsIHBhdGNoXSA9IFtOdW1iZXIobVsxXSksIE51bWJlcihtWzJdKSwgTnVtYmVyKG1bM10pXTtcbiAgaWYgKG1ham9yID4gTUFYX1BBUlQgfHwgbWlub3IgPiBNQVhfUEFSVCB8fCBwYXRjaCA+IE1BWF9QQVJUKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgbWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlcmVsZWFzZTogbVs0XSA/IG1bNF0uc3BsaXQoJy4nKSA6IFtdIH07XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVJZGVudGlmaWVycyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGFuID0gL15cXGQrJC8udGVzdChhKTtcbiAgY29uc3QgYm4gPSAvXlxcZCskLy50ZXN0KGIpO1xuICBpZiAoYW4gJiYgYm4pIHJldHVybiBOdW1iZXIoYSkgLSBOdW1iZXIoYik7XG4gIGlmIChhbikgcmV0dXJuIC0xOyAvLyBudW1lcmljIGlkZW50aWZpZXJzIHNvcnQgYmVsb3cgYWxwaGFudW1lcmljIG9uZXNcbiAgaWYgKGJuKSByZXR1cm4gMTtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuXG4vKiogU2VtdmVyIDIuMCBwcmVjZWRlbmNlOiBuZWdhdGl2ZSB3aGVuIGBhIDwgYmAsIDAgd2hlbiBlcXVhbCwgcG9zaXRpdmUgd2hlbiBgYSA+IGJgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVTZW12ZXJQYXJ0cyhhOiBTZW12ZXJQYXJ0cywgYjogU2VtdmVyUGFydHMpOiBudW1iZXIge1xuICBpZiAoYS5tYWpvciAhPT0gYi5tYWpvcikgcmV0dXJuIGEubWFqb3IgLSBiLm1ham9yO1xuICBpZiAoYS5taW5vciAhPT0gYi5taW5vcikgcmV0dXJuIGEubWlub3IgLSBiLm1pbm9yO1xuICBpZiAoYS5wYXRjaCAhPT0gYi5wYXRjaCkgcmV0dXJuIGEucGF0Y2ggLSBiLnBhdGNoO1xuICAvLyBBIHN0YWJsZSB2ZXJzaW9uIG91dHJhbmtzIGFueSBwcmVyZWxlYXNlIG9mIHRoZSBzYW1lIHR1cGxlLlxuICBpZiAoIWEucHJlcmVsZWFzZS5sZW5ndGggfHwgIWIucHJlcmVsZWFzZS5sZW5ndGgpIHJldHVybiBiLnByZXJlbGVhc2UubGVuZ3RoIC0gYS5wcmVyZWxlYXNlLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heChhLnByZXJlbGVhc2UubGVuZ3RoLCBiLnByZXJlbGVhc2UubGVuZ3RoKTsgaSsrKSB7XG4gICAgaWYgKGEucHJlcmVsZWFzZVtpXSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gLTE7XG4gICAgaWYgKGIucHJlcmVsZWFzZVtpXSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcbiAgICBjb25zdCBjID0gY29tcGFyZUlkZW50aWZpZXJzKGEucHJlcmVsZWFzZVtpXSEsIGIucHJlcmVsZWFzZVtpXSEpO1xuICAgIGlmIChjICE9PSAwKSByZXR1cm4gYztcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqIHtAbGluayBjb21wYXJlU2VtdmVyUGFydHN9IG92ZXIgc3RyaW5nczsgdW5wYXJzZWFibGUgdmVyc2lvbnMgc29ydCBsb3dlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVNlbXZlcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHBhID0gcGFyc2VTZW12ZXIoYSk7XG4gIGNvbnN0IHBiID0gcGFyc2VTZW12ZXIoYik7XG4gIGlmICghcGEgfHwgIXBiKSByZXR1cm4gKHBhID8gMSA6IDApIC0gKHBiID8gMSA6IDApO1xuICByZXR1cm4gY29tcGFyZVNlbXZlclBhcnRzKHBhLCBwYik7XG59XG5cbmNvbnN0IHBhcnRzID0gKG1ham9yOiBudW1iZXIsIG1pbm9yOiBudW1iZXIsIHBhdGNoOiBudW1iZXIsIHByZXJlbGVhc2U6IHN0cmluZ1tdID0gW10pOiBTZW12ZXJQYXJ0cyA9PlxuICAoeyBtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVyZWxlYXNlIH0pO1xuXG4vKipcbiAqIFBhcnNlIGEgdmVyc2lvbiBzcGVjLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub25lIG9mIHRoZSBzdXBwb3J0ZWQgZm9ybXMgKHRoZVxuICogY2FsbGVyIHRoZW4gdHJlYXRzIHRoZSBpbnB1dCBhcyBhIGxpdGVyYWwgdmVyc2lvbiwgd2hpY2ggbWF0Y2hlcyBub3RoaW5nKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvblNwZWMoc3BlYzogc3RyaW5nKTogVmVyc2lvblNwZWMgfCBudWxsIHtcbiAgY29uc3QgcyA9IHNwZWMudHJpbSgpO1xuICBpZiAocyA9PT0gJ2xhdGVzdCcpIHJldHVybiB7IGtpbmQ6ICdsYXRlc3QnIH07XG5cbiAgaWYgKHMuc3RhcnRzV2l0aCgnXicpIHx8IHMuc3RhcnRzV2l0aCgnficpKSB7XG4gICAgY29uc3QgcGFydGlhbCA9IFBBUlRJQUwuZXhlYyhzLnNsaWNlKDEpKTtcbiAgICBpZiAocGFydGlhbCAmJiAhcGFyc2VTZW12ZXIocy5zbGljZSgxKSkpIHJldHVybiBwYXJ0aWFsT3BlcmF0b3JSYW5nZShzWzBdIGFzICdeJyB8ICd+JywgcGFydGlhbCk7XG4gICAgY29uc3QgYmFzZSA9IHBhcnNlU2VtdmVyKHMuc2xpY2UoMSkpO1xuICAgIGlmICghYmFzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyBtYWpvciwgbWlub3IsIHBhdGNoIH0gPSBiYXNlO1xuICAgIGxldCBtYXg6IFNlbXZlclBhcnRzO1xuICAgIGlmIChzWzBdID09PSAnficpIG1heCA9IHBhcnRzKG1ham9yLCBtaW5vciArIDEsIDApO1xuICAgIGVsc2UgaWYgKG1ham9yID4gMCkgbWF4ID0gcGFydHMobWFqb3IgKyAxLCAwLCAwKTtcbiAgICBlbHNlIGlmIChtaW5vciA+IDApIG1heCA9IHBhcnRzKDAsIG1pbm9yICsgMSwgMCk7XG4gICAgZWxzZSBtYXggPSBwYXJ0cygwLCAwLCBwYXRjaCArIDEpO1xuICAgIHJldHVybiB7IGtpbmQ6ICdyYW5nZScsIG1pbjogYmFzZSwgbWF4IH07XG4gIH1cblxuICBpZiAocGFyc2VTZW12ZXIocykpIHJldHVybiB7IGtpbmQ6ICdleGFjdCcsIHZlcnNpb246IHMgfTtcblxuICBjb25zdCBtID0gUEFSVElBTC5leGVjKHMpO1xuICBpZiAoIW0pIHJldHVybiBudWxsO1xuICBjb25zdCBtYWpvciA9IE51bWJlcihtWzFdKTtcbiAgY29uc3QgbWlub3JXaWxkID0gbVsyXSA9PT0gdW5kZWZpbmVkIHx8IG1bMl0gPT09ICd4JyB8fCBtWzJdID09PSAnKic7XG4gIGlmIChtYWpvciA+IE1BWF9QQVJUKSByZXR1cm4gbnVsbDtcbiAgaWYgKG1pbm9yV2lsZCkgcmV0dXJuIHsga2luZDogJ3JhbmdlJywgbWluOiBwYXJ0cyhtYWpvciwgMCwgMCksIG1heDogcGFydHMobWFqb3IgKyAxLCAwLCAwKSB9O1xuICBjb25zdCBtaW5vciA9IE51bWJlcihtWzJdKTtcbiAgaWYgKG1pbm9yID4gTUFYX1BBUlQpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBraW5kOiAncmFuZ2UnLCBtaW46IHBhcnRzKG1ham9yLCBtaW5vciwgMCksIG1heDogcGFydHMobWFqb3IsIG1pbm9yICsgMSwgMCkgfTtcbn1cblxuLyoqXG4gKiBgXmAgLyBgfmAgb3ZlciBhIFBBUlRJQUwgdmVyc2lvbiAobnBtKTogdGhlIG1pc3NpbmcgcGFydHMgYXJlIHplcm8sIGFuZCB0aGVcbiAqIHVwcGVyIGJvdW5kIGZvbGxvd3MgdGhlIG9wZXJhdG9yIOKAlCBgXjFgIC8gYH4xYCA8Mi4wLjAsIGBeMS4yYCA8Mi4wLjAgYnV0XG4gKiBgfjEuMmAgPDEuMy4wLCBhbmQgYSB6ZXJvIG1ham9yIG5hcnJvd3MgYSBjYXJldCB0byB0aGUgbmV4dCBtaW5vclxuICogKGBeMC4yYCA8MC4zLjApIG9yIG1ham9yIChgXjBgIDwxLjAuMCkuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpYWxPcGVyYXRvclJhbmdlKG9wOiAnXicgfCAnficsIG06IFJlZ0V4cEV4ZWNBcnJheSk6IFZlcnNpb25TcGVjIHwgbnVsbCB7XG4gIGNvbnN0IG1ham9yID0gTnVtYmVyKG1bMV0pO1xuICBjb25zdCBtaW5vckdpdmVuID0gbVsyXSAhPT0gdW5kZWZpbmVkICYmIG1bMl0gIT09ICd4JyAmJiBtWzJdICE9PSAnKic7XG4gIGNvbnN0IG1pbm9yID0gbWlub3JHaXZlbiA/IE51bWJlcihtWzJdKSA6IDA7XG4gIGlmIChtYWpvciA+IE1BWF9QQVJUIHx8IG1pbm9yID4gTUFYX1BBUlQpIHJldHVybiBudWxsO1xuICBjb25zdCBtaW4gPSBwYXJ0cyhtYWpvciwgbWlub3IsIDApO1xuICBpZiAoIW1pbm9yR2l2ZW4pIHJldHVybiB7IGtpbmQ6ICdyYW5nZScsIG1pbiwgbWF4OiBwYXJ0cyhtYWpvciArIDEsIDAsIDApIH07XG4gIGlmIChvcCA9PT0gJ34nIHx8IG1ham9yID09PSAwKSByZXR1cm4geyBraW5kOiAncmFuZ2UnLCBtaW4sIG1heDogcGFydHMobWFqb3IsIG1pbm9yICsgMSwgMCkgfTtcbiAgcmV0dXJuIHsga2luZDogJ3JhbmdlJywgbWluLCBtYXg6IHBhcnRzKG1ham9yICsgMSwgMCwgMCkgfTtcbn1cblxuLyoqIFRydWUgd2hlbiBgc3BlY2AgcmVzb2x2ZXMgdG8gYSBTRVQgb2YgdmVyc2lvbnMgKHJhbmdlIG9yIGBsYXRlc3RgKSwgbm90IG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnNpb25SYW5nZShzcGVjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VWZXJzaW9uU3BlYyhzcGVjKTtcbiAgcmV0dXJuIHBhcnNlZCAhPT0gbnVsbCAmJiBwYXJzZWQua2luZCAhPT0gJ2V4YWN0Jztcbn1cblxuLyoqIFdoZXRoZXIgYHZlcnNpb25gIHNhdGlzZmllcyBgc3BlY2AgKGEgc3RyaW5nIG9yIGFuIGFscmVhZHktcGFyc2VkIHNwZWMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb246IHN0cmluZywgc3BlYzogc3RyaW5nIHwgVmVyc2lvblNwZWMpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VkID0gdHlwZW9mIHNwZWMgPT09ICdzdHJpbmcnID8gcGFyc2VWZXJzaW9uU3BlYyhzcGVjKSA6IHNwZWM7XG4gIGlmICghcGFyc2VkKSByZXR1cm4gdHlwZW9mIHNwZWMgPT09ICdzdHJpbmcnICYmIHZlcnNpb24gPT09IHNwZWM7XG4gIGlmIChwYXJzZWQua2luZCA9PT0gJ2V4YWN0JykgcmV0dXJuIHZlcnNpb24gPT09IHBhcnNlZC52ZXJzaW9uO1xuICBjb25zdCB2ID0gcGFyc2VTZW12ZXIodmVyc2lvbik7XG4gIGlmICghdikgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdsYXRlc3QnKSByZXR1cm4gdi5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMDtcbiAgaWYgKGNvbXBhcmVTZW12ZXJQYXJ0cyh2LCBwYXJzZWQubWluKSA8IDAgfHwgY29tcGFyZVNlbXZlclBhcnRzKHYsIHBhcnNlZC5tYXgpID49IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKHYucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBjb25zdCB7IG1pbiB9ID0gcGFyc2VkO1xuICByZXR1cm4gbWluLnByZXJlbGVhc2UubGVuZ3RoID4gMCAmJiB2Lm1ham9yID09PSBtaW4ubWFqb3IgJiYgdi5taW5vciA9PT0gbWluLm1pbm9yICYmIHYucGF0Y2ggPT09IG1pbi5wYXRjaDtcbn1cblxuLyoqIFRoZSBoaWdoZXN0IG9mIGB2ZXJzaW9uc2Agc2F0aXNmeWluZyBgc3BlY2AsIG9yIGBudWxsYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhTYXRpc2Z5aW5nKHZlcnNpb25zOiByZWFkb25seSBzdHJpbmdbXSwgc3BlYzogc3RyaW5nIHwgVmVyc2lvblNwZWMpOiBzdHJpbmcgfCBudWxsIHtcbiAgbGV0IGJlc3Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBmb3IgKGNvbnN0IHYgb2YgdmVyc2lvbnMpIHtcbiAgICBpZiAoc2F0aXNmaWVzVmVyc2lvblNwZWModiwgc3BlYykgJiYgKGJlc3QgPT09IG51bGwgfHwgY29tcGFyZVNlbXZlcih2LCBiZXN0KSA+IDApKSBiZXN0ID0gdjtcbiAgfVxuICByZXR1cm4gYmVzdDtcbn1cblxuLy8gLS0gU1FMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIFRoZSBgdmVyc2lvbmAgY29sdW1uIGlzIENIRUNLLWNvbnN0cmFpbmVkIHRvIGBeXFxkK1xcLlxcZCtcXC5cXGQrKC1wcmUpPyhcXCtidWlsZCk/JGAsXG4vLyBzbyB0aGUgbnVtZXJpYyBwYXJ0cyBhcmUgc3BsaXQgb3V0IHJlbGlhYmx5OiBtYWpvci9taW5vciBhcmUgdGhlIGZpcnN0IHR3b1xuLy8gZG90IGZpZWxkcywgcGF0Y2ggaXMgdGhlIHRoaXJkIHdpdGggYW55IGAtcHJlYCAvIGArYnVpbGRgIHN1ZmZpeCByZW1vdmVkLCBhbmRcbi8vIHRoZSBwcmVyZWxlYXNlIGlzIHdoYXRldmVyIHNpdHMgYmV0d2VlbiB0aGUgZmlyc3QgYC1gIGFuZCBhbnkgYCtgLlxuXG5jb25zdCBtYWpvck9mID0gKGNvbDogQW55Q29sdW1uKTogU1FMID0+IHNxbGBzcGxpdF9wYXJ0KCR7Y29sfSwgJy4nLCAxKTo6aW50YDtcbmNvbnN0IG1pbm9yT2YgPSAoY29sOiBBbnlDb2x1bW4pOiBTUUwgPT4gc3FsYHNwbGl0X3BhcnQoJHtjb2x9LCAnLicsIDIpOjppbnRgO1xuY29uc3QgcGF0Y2hPZiA9IChjb2w6IEFueUNvbHVtbik6IFNRTCA9PiBzcWxgc3Vic3RyaW5nKCR7Y29sfSBmcm9tICdeWzAtOV0rXFxcXC5bMC05XStcXFxcLihbMC05XSspJyk6OmludGA7XG4vKiogVGhlIHByZXJlbGVhc2Ugc3VmZml4LCBvciBOVUxMIGZvciBhIHN0YWJsZSB2ZXJzaW9uLiAqL1xuY29uc3QgcHJlcmVsZWFzZU9mID0gKGNvbDogQW55Q29sdW1uKTogU1FMID0+IHNxbGBzdWJzdHJpbmcoc3BsaXRfcGFydCgke2NvbH0sICcrJywgMSkgZnJvbSAnXlswLTldK1xcXFwuWzAtOV0rXFxcXC5bMC05XSstKC4rKSQnKWA7XG5cbmNvbnN0IHR1cGxlT2YgPSAoY29sOiBBbnlDb2x1bW4pOiBTUUwgPT4gc3FsYCgke21ham9yT2YoY29sKX0sICR7bWlub3JPZihjb2wpfSwgJHtwYXRjaE9mKGNvbCl9KWA7XG5jb25zdCB0dXBsZUxpdCA9IChwOiBTZW12ZXJQYXJ0cyk6IFNRTCA9PiBzcWxgKCR7cC5tYWpvcn06OmludCwgJHtwLm1pbm9yfTo6aW50LCAke3AucGF0Y2h9OjppbnQpYDtcblxuLyoqXG4gKiBTUUwgcHJlZGljYXRlIGZvciBgY29sYCBzYXRpc2Z5aW5nIGBzcGVjYC4gUHJlY2lzaW9uIG5vdGU6IHByZXJlbGVhc2UtdnMtXG4gKiBwcmVyZWxlYXNlIG9yZGVyaW5nIFdJVEhJTiB0aGUgbG93ZXIgYm91bmQncyBvd24gdHVwbGUgaXMgbm90IGNvbXBhcmVkIGluIFNRTFxuICogKGV2ZXJ5IHByZXJlbGVhc2Ugb2YgdGhhdCB0dXBsZSBpcyBhZG1pdHRlZCkg4oCUIHtAbGluayBzZW12ZXJPcmRlckJ5fSBzdGlsbFxuICogcmFua3MgdGhlbSwgYW5kIHRoZSBKUyBtYXRjaGVyIGlzIGV4YWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvblNwZWNDb25kaXRpb24oY29sOiBBbnlDb2x1bW4sIHNwZWM6IHN0cmluZyk6IFNRTCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlVmVyc2lvblNwZWMoc3BlYyk7XG4gIGlmICghcGFyc2VkKSByZXR1cm4gZXEoY29sLCBzcGVjKTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnZXhhY3QnKSByZXR1cm4gZXEoY29sLCBwYXJzZWQudmVyc2lvbik7XG4gIGNvbnN0IHN0YWJsZSA9IHNxbGAke3ByZXJlbGVhc2VPZihjb2wpfSBJUyBOVUxMYDtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnbGF0ZXN0JykgcmV0dXJuIHN0YWJsZTtcblxuICBjb25zdCB7IG1pbiwgbWF4IH0gPSBwYXJzZWQ7XG4gIGNvbnN0IGluUmFuZ2UgPSBhbmQoc3FsYCR7dHVwbGVPZihjb2wpfSA+PSAke3R1cGxlTGl0KG1pbil9YCwgc3FsYCR7dHVwbGVPZihjb2wpfSA8ICR7dHVwbGVMaXQobWF4KX1gKSE7XG4gIGlmIChtaW4ucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHJldHVybiBhbmQoaW5SYW5nZSwgc3RhYmxlKSE7XG4gIC8vIEEgcHJlcmVsZWFzZSBsb3dlciBib3VuZDogc3RhYmxlIHZlcnNpb25zIGFib3ZlIGl0LCBwbHVzIHByZXJlbGVhc2VzIG9mIGl0cyBvd24gdHVwbGUuXG4gIHJldHVybiBhbmQoaW5SYW5nZSwgb3Ioc3RhYmxlLCBzcWxgJHt0dXBsZU9mKGNvbCl9ID0gJHt0dXBsZUxpdChtaW4pfWApKSE7XG59XG5cbi8qKlxuICogT1JERVIgQlkgdGVybXMgcmFua2luZyBgY29sYCBoaWdoZXN0LXNlbXZlciBmaXJzdDogbnVtZXJpYyBtYWpvci9taW5vci9wYXRjaCxcbiAqIGEgc3RhYmxlIHZlcnNpb24gYWJvdmUgaXRzIHByZXJlbGVhc2VzLCB0aGVuIHRoZSBwcmVyZWxlYXNlIHRleHQgKGFcbiAqIGxleGljb2dyYXBoaWMgdGllYnJlYWsg4oCUIGNsb3NlIHRvLCBub3QgZXhhY3RseSwgc2VtdmVyIGlkZW50aWZpZXIgb3JkZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VtdmVyT3JkZXJCeShjb2w6IEFueUNvbHVtbik6IFNRTFtdIHtcbiAgcmV0dXJuIFtcbiAgICBkZXNjKG1ham9yT2YoY29sKSksXG4gICAgZGVzYyhtaW5vck9mKGNvbCkpLFxuICAgIGRlc2MocGF0Y2hPZihjb2wpKSxcbiAgICBzcWxgJHtwcmVyZWxlYXNlT2YoY29sKX0gSVMgTlVMTCBERVNDYCxcbiAgICBkZXNjKHByZXJlbGVhc2VPZihjb2wpKSxcbiAgICBhc2MoY29sKSxcbiAgXTtcbn1cbiJdfQ==