@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
@@ -989,4 +989,4 @@ export class StakeholderReportStore {
989
989
  }
990
990
  }
991
991
  export const stakeholderReportStore = new StakeholderReportStore();
992
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9zdGFrZWhvbGRlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVk3RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFlOUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQzlDLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDM0MscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDM0Q7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFN0IseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxN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TyxJQUEwQixDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxNQUF5QjtRQUNqRSxNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7YUFDOUUsS0FBSyxDQUFDLEdBQUcsQ0FDUixFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFDeEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQzNDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNOLE9BQU8sSUFBMEIsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQZXJzaXN0ZW5jZSBmb3Igc3Rha2Vob2xkZXIgcmVwb3J0czogZGVmaW5pdGlvbnMsIHJ1bnMsIHNoYXJlIGxpbmtzIGFuZFxuICogcmVjaXBpZW50cy5cbiAqXG4gKiBIYW5kLXJvbGxlZCByYXRoZXIgdGhhbiBmb3VyIGBDcnVkU2VydmljZWAgc3ViY2xhc3NlcyBiZWNhdXNlIG5vbmUgb2YgdGhlc2UgaXNcbiAqIGEgZ2VuZXJpYyBsaXN0YWJsZSBlbnRpdHkgd2l0aCBhbiBgaXNEZWZhdWx0YCBzbG90IGFuZCBwcm9qZWN0LXNjb3BlZCBhY2Nlc3NcbiAqIGNvbnRyb2wuIFdoYXQgdGhleSBuZWVkIGluc3RlYWQgaXMgYSBzbWFsbCBudW1iZXIgb2YgZXhhY3Qgb3BlcmF0aW9ucyB3aXRoXG4gKiBpbnZhcmlhbnRzIHRoZSBnZW5lcmljIGJhc2UgY2Fubm90IGV4cHJlc3M6XG4gKlxuICogIC0gQSBSVU4gSVMgQVBQRU5ELU9OTFkgb25jZSBwdWJsaXNoZWQuIFJlZ2VuZXJhdGluZyBhIHBlcmlvZCBpbnNlcnRzIHZlcnNpb25cbiAqICAgIE4rMSBhbmQgcG9pbnRzIHRoZSBvbGQgcm93IGF0IGl0IChgc3VwZXJzZWRlZEJ5YCk7IG5vdGhpbmcgb3ZlcndyaXRlcyBhXG4gKiAgICBzbmFwc2hvdCBhIG1hbmFnZXIgaGFzIGFscmVhZHkgcmVhZC5cbiAqICAtIEEgU0hBUkUgTElOSyBJUyBSRVNPTFZFRCBXSVRIT1VUIEEgVEVOQU5ULiBUaGUgcmVhZGVyIGhhcyBubyBhY2NvdW50LCBzbyB0aGVcbiAqICAgIGxvb2t1cCBieSB0b2tlbiBoYXNoIGlzIHRoZSBvbmUgcmVhZCBoZXJlIHRoYXQgZGVsaWJlcmF0ZWx5IHJ1bnMgYXMgc3lzYWRtaW5cbiAqICAgIOKAlCBzZWUge0BsaW5rIHJlc29sdmVTaGFyZUxpbmt9IGZvciB3aHkgdGhhdCBpcyB0aGUgbmFycm93ZXN0IHNhZmUgc2hhcGUuXG4gKiAgLSBBIFJFQ0lQSUVOVCBJUyBVUFNFUlRFRCwgTkVWRVIgUkUtQ1JFQVRFRC4gUmUtYWRkaW5nIGFuIGFkZHJlc3MgbXVzdCBrZWVwIGl0c1xuICogICAgdmVyaWZpY2F0aW9uIGFuZCB1bnN1YnNjcmliZSBzdGF0ZSwgb3IgYW4gdW5zdWJzY3JpYmUgY291bGQgYmUgdW5kb25lIGJ5XG4gKiAgICBkZWxldGluZyBhbmQgcmUtYWRkaW5nIHRoZSByb3cuXG4gKlxuICogRXZlcnl0aGluZyBlbHNlIHJ1bnMgaW5zaWRlIHRoZSBjYWxsZXIncyBhbWJpZW50IHRlbmFudCBjb250ZXh0IChlc3RhYmxpc2hlZCBieVxuICogYHdpdGhUZW5hbnRDb250ZXh0KClgIGF0IHRoZSByZXF1ZXN0IGJvdW5kYXJ5KSwgc28gUkxTIGlzIHRoZSB0ZW5hbmN5IGdhdGUgYW5kXG4gKiBhbiBgb3JnSWRgIGFyZ3VtZW50IGlzIGEgcmVkdW5kYW50IHNlY29uZCBjaGVjayByYXRoZXIgdGhhbiB0aGUgb25seSBvbmUuXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCwgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yLCBDb25mbGljdEVycm9yLCBFcnJvckNvZGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBhbmQsIGFzYywgZGVzYywgZXEsIGluQXJyYXksIGlzTnVsbCwgbHRlLCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi8uLi8uLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlcG9ydENhZGVuY2UsXG4gIFJlcG9ydERlZmluaXRpb24sXG4gIFJlcG9ydFBhdXNlUmVhc29uLFxuICBSZXBvcnRSZWNpcGllbnQsXG4gIFJlcG9ydFJ1bixcbiAgUmVwb3J0UnVuU3RhdHVzLFxuICBSZXBvcnRTY29wZSxcbiAgUmVwb3J0U2hhcmVMaW5rLFxuICBSZXBvcnRUZW1wbGF0ZSxcbn0gZnJvbSAnLi4vLi4vLi4vZGF0YWJhc2Uvc2NoZW1hL3JlcG9ydGluZy1zdGFrZWhvbGRlci5qcyc7XG5pbXBvcnQgeyBydW5XaXRoVGVuYW50Q29udGV4dCwgd2l0aFRlbmFudFR4IH0gZnJvbSAnLi4vLi4vLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5pbXBvcnQgeyBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMgfSBmcm9tICcuLi8uLi9jcnVkLXNlcnZpY2UuanMnO1xuXG4vKiogSG93IGxvbmcgYSBmcmVzaGx5IG1pbnRlZCBzaGFyZSBsaW5rIGxpdmVzIHdoZW4gdGhlIGNhbGxlciBuYW1lcyBubyB3aW5kb3cuICovXG5cbi8qKlxuICogV2hhdCBhbiB1bnN1YnNjcmliZSBjbGljayBkaWQuIGByZWNpcGllbnRgIGlzIHJldHVybmVkIHRvIHRoZSBST1VURSAoZm9yIGl0c1xuICogYXVkaXQgcm93KSwgbmV2ZXIgdG8gdGhlIGNsaWNrZXIsIHdobyBpcyB0b2xkIFwidW5zdWJzY3JpYmVkXCIgZWl0aGVyIHdheS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnN1YnNjcmliZVJlc3VsdCB7XG4gIG1hdGNoZWQ6IGJvb2xlYW47XG4gIHJlY2lwaWVudD86IHsgaWQ6IHN0cmluZzsgb3JnSWQ6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9O1xuICAvKiogVHJ1ZSBvbmx5IGZvciB0aGUgY2xpY2sgdGhhdCBhY3R1YWxseSBzZXQgYHVuc3Vic2NyaWJlZF9hdGAuICovXG4gIG5ld2x5VW5zdWJzY3JpYmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0hBUkVfTElOS19UVExfREFZUyA9IDMwO1xuLyoqIFRoZSBsb25nZXN0IGEgc2hhcmUgbGluayBtYXkgbGl2ZS4gQmV5b25kIHRoaXMgaXQgaXMgYSBwZXJtYW5lbnQgVVJMLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TSEFSRV9MSU5LX1RUTF9EQVlTID0gMTgwO1xuLyoqIEEgcmVjaXBpZW50J3MgdmVyaWZpY2F0aW9uIGxpbmsuIFNob3J0OiBpdCBpcyBjbGlja2VkIHdpdGhpbiBtaW51dGVzIG9yIG5ldmVyLiAqL1xuZXhwb3J0IGNvbnN0IFZFUklGSUNBVElPTl9UVExfTVMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbi8qKlxuICogQm91bmNlcyBiZWZvcmUgYW4gYWRkcmVzcyBpcyB0cmVhdGVkIGFzIHVuZGVsaXZlcmFibGUgYW5kIHNraXBwZWQuIFRocmVlLCBub3RcbiAqIG9uZTogYSBzaW5nbGUgYm91bmNlIGlzIG9mdGVuIGFuIG91dC1vZi1vZmZpY2UgYXV0b3Jlc3BvbmRlciBvciBhIGZ1bGwgbWFpbGJveCxcbiAqIGFuZCBkcm9wcGluZyBhIG1hbmFnZXIgb2ZmIHRoZSBsaXN0IGZvciBvbmUgb2YgdGhvc2UgaXMgYSBzaWxlbnQgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CT1VOQ0VTID0gMztcblxuLyoqIFNIQS0yNTYgaGV4IG9mIGEgdG9rZW4uIFRoZSBvbmx5IGZvcm0gYW55IHRva2VuIGlzIGV2ZXIgc3RvcmVkIGluLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hUb2tlbih0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh0b2tlbiwgJ3V0ZjgnKS5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKiogQSBmcmVzaCBVUkwtc2FmZSB0b2tlbiwgYW5kIGl0cyBoYXNoLiBUaGUgcmF3IHZhbHVlIGlzIHJldHVybmVkIGV4YWN0bHkgb25jZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW50VG9rZW4oKTogeyB0b2tlbjogc3RyaW5nOyB0b2tlbkhhc2g6IHN0cmluZyB9IHtcbiAgY29uc3QgdG9rZW4gPSByYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2Jhc2U2NHVybCcpO1xuICByZXR1cm4geyB0b2tlbiwgdG9rZW5IYXNoOiBoYXNoVG9rZW4odG9rZW4pIH07XG59XG5cbi8qKiBXaGF0IGNyZWF0aW5nIGEgZGVmaW5pdGlvbiBuZWVkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRGVmaW5pdGlvbklucHV0IHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB0ZW1wbGF0ZTogUmVwb3J0VGVtcGxhdGU7XG4gIHNlY3Rpb25zOiBzdHJpbmdbXTtcbiAgY2FkZW5jZTogUmVwb3J0Q2FkZW5jZTtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgd2Vla1N0YXJ0OiAnbW9uZGF5JyB8ICdzdW5kYXknO1xuICBzY29wZTogUmVwb3J0U2NvcGU7XG4gIHJlY2lwaWVudHM6IHN0cmluZ1tdO1xuICBhdXRvU2VuZDogYm9vbGVhbjtcbiAgb3duZXJJZDogc3RyaW5nO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgbmV4dFJ1bkF0PzogRGF0ZSB8IG51bGw7XG59XG5cbi8qKiBUaGUgbXV0YWJsZSBoYWxmIG9mIGEgZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRGVmaW5pdGlvbklucHV0IHtcbiAgbmFtZT86IHN0cmluZztcbiAgdGVtcGxhdGU/OiBSZXBvcnRUZW1wbGF0ZTtcbiAgc2VjdGlvbnM/OiBzdHJpbmdbXTtcbiAgY2FkZW5jZT86IFJlcG9ydENhZGVuY2U7XG4gIHRpbWV6b25lPzogc3RyaW5nO1xuICB3ZWVrU3RhcnQ/OiAnbW9uZGF5JyB8ICdzdW5kYXknO1xuICBzY29wZT86IFJlcG9ydFNjb3BlO1xuICByZWNpcGllbnRzPzogc3RyaW5nW107XG4gIGF1dG9TZW5kPzogYm9vbGVhbjtcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuICBwYXVzZWRSZWFzb24/OiBSZXBvcnRQYXVzZVJlYXNvbiB8IG51bGw7XG4gIG5leHRSdW5BdD86IERhdGUgfCBudWxsO1xufVxuXG4vKiogQSBzaGFyZSBsaW5rIHBsdXMgdGhlIG9uZS10aW1lIHRva2VuLCByZXR1cm5lZCBvbmx5IGZyb20gdGhlIG1pbnQgY2FsbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWludGVkU2hhcmVMaW5rIHtcbiAgbGluazogUmVwb3J0U2hhcmVMaW5rO1xuICAvKiogU2hvd24gb25jZS4gTmV2ZXIgc3RvcmVkLCBuZXZlciBsb2dnZWQsIG5ldmVyIGluIGEgcmVzcG9uc2UgYWdhaW4uICovXG4gIHRva2VuOiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IHRoZSBwdWJsaWMgcm91dGUgbmVlZHM6IHRoZSBsaW5rLCBpdHMgcnVuLCBhbmQgdGhlIG93bmluZyBvcmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2hhcmVMaW5rIHtcbiAgbGluazogUmVwb3J0U2hhcmVMaW5rO1xuICBydW46IFJlcG9ydFJ1bjtcbn1cblxuLyoqIFRoZSBgcHVyZ2VfYWZ0ZXJgIHN0YW1wIGEgc29mdC1kZWxldGUgY2Fycmllcywgb3IgYHt9YCB3aGVuIHB1cmdpbmcgaXMgb2ZmLiAqL1xuZnVuY3Rpb24gcHVyZ2VTdGFtcChub3c6IERhdGUpOiB7IHB1cmdlQWZ0ZXI/OiBEYXRlIH0ge1xuICBjb25zdCBtcyA9IHNvZnREZWxldGVSZXRlbnRpb25NcygpO1xuICByZXR1cm4gbXMgPiAwID8geyBwdXJnZUFmdGVyOiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgbXMpIH0gOiB7fTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWtlaG9sZGVyUmVwb3J0U3RvcmUge1xuICAvLyDilIDilIAgRGVmaW5pdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlRGVmaW5pdGlvbihpbnB1dDogQ3JlYXRlRGVmaW5pdGlvbklucHV0KTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgY29uc3QgaWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbikudmFsdWVzKHtcbiAgICAgIGlkLFxuICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgb3duZXJJZDogaW5wdXQub3duZXJJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICB0ZW1wbGF0ZTogaW5wdXQudGVtcGxhdGUsXG4gICAgICBzZWN0aW9uczogaW5wdXQuc2VjdGlvbnMsXG4gICAgICBjYWRlbmNlOiBpbnB1dC5jYWRlbmNlLFxuICAgICAgdGltZXpvbmU6IGlucHV0LnRpbWV6b25lLFxuICAgICAgd2Vla1N0YXJ0OiBpbnB1dC53ZWVrU3RhcnQsXG4gICAgICBzY29wZTogaW5wdXQuc2NvcGUsXG4gICAgICByZWNpcGllbnRzOiBpbnB1dC5yZWNpcGllbnRzLFxuICAgICAgYXV0b1NlbmQ6IGlucHV0LmF1dG9TZW5kLFxuICAgICAgbmV4dFJ1bkF0OiBpbnB1dC5uZXh0UnVuQXQgPz8gbnVsbCxcbiAgICAgIGNyZWF0ZWRCeTogaW5wdXQuY3JlYXRlZEJ5LFxuICAgIH0pLnJldHVybmluZygpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgfVxuXG4gIGFzeW5jIGxpc3REZWZpbml0aW9ucyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSwgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCkpKVxuICAgICAgLm9yZGVyQnkoYXNjKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm5hbWUpKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdO1xuICB9XG5cbiAgYXN5bmMgZ2V0RGVmaW5pdGlvbihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIFRocm93cyB7QGxpbmsgTm90Rm91bmRFcnJvcn0gcmF0aGVyIHRoYW4gcmV0dXJuaW5nIG51bGwsIGZvciByb3V0ZSBib2RpZXMuICovXG4gIGFzeW5jIHJlcXVpcmVEZWZpbml0aW9uKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMuZ2V0RGVmaW5pdGlvbihvcmdJZCwgaWQpO1xuICAgIGlmICghZm91bmQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgZGVmaW5pdGlvbiBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZWZpbml0aW9uKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwYXRjaDogVXBkYXRlRGVmaW5pdGlvbklucHV0LFxuICAgIHVwZGF0ZWRCeTogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQnksIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGNoKSkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pLnNldChzZXQpXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSAocm93cyBhcyBSZXBvcnREZWZpbml0aW9uW10pWzBdO1xuICAgIGlmICghdXBkYXRlZCkgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBkZWZpbml0aW9uIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmQgYSBkZWZpbml0aW9uIHRvIGEgbmV3IG93bmVyLiBUaGUgb3duZXIgaXMgd2hvIGEgc2NoZWR1bGVkIHJ1biBpc1xuICAgKiBhdXRob3JpemVkIEFTLCBzbyB0aGlzIGlzIGEgcHJpdmlsZWdlIG1vdmUsIG5vdCBhIG1ldGFkYXRhIGVkaXQg4oCUIHRoZSByb3V0ZVxuICAgKiBjaGVja3MgdGhlIG5ldyBvd25lciBpcyBhIGxpdmUgbWVtYmVyIG9mIHRoZSBvcmcgYmVmb3JlIGNhbGxpbmcuXG4gICAqL1xuICBhc3luYyB0cmFuc2Zlck93bmVyKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIG5ld093bmVySWQ6IHN0cmluZywgYWN0b3JJZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgIC5zZXQoe1xuICAgICAgICBvd25lcklkOiBuZXdPd25lcklkLFxuICAgICAgICB1cGRhdGVkQnk6IGFjdG9ySWQsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgLy8gQSBkZWZpbml0aW9uIHBhdXNlZCBiZWNhdXNlIGl0cyBwcmV2aW91cyBvd25lciBsb3N0IGFjY2VzcyBpcyBsaXZlIGFnYWluXG4gICAgICAgIC8vIHVuZGVyIGFuIG93bmVyIHdobyBoYXMgaXQuIFRoZSBzY2hlZHVsZXIgcmUtY2hlY2tzIGV2ZXJ5IHJ1biBhbnl3YXksIHNvXG4gICAgICAgIC8vIHRoZSB3b3JzdCBjYXNlIGlzIG9uZSBtb3JlIHBhdXNlZCBydW4sIG5ldmVyIGEgc3RhbmRpbmcgZ3JhbnQuXG4gICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICBwYXVzZWRSZWFzb246IG51bGwsXG4gICAgICB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICBjb25zdCB1cGRhdGVkID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICBpZiAoIXVwZGF0ZWQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgZGVmaW5pdGlvbiBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSBldmVyeSBkZWZpbml0aW9uIGEgdXNlciBvd25zLCB3aXRoIHRoZSByZWFzb24gcmVjb3JkZWQuIENhbGxlZCB3aGVuIHRoZVxuICAgKiBvd25lciBpcyBkZWFjdGl2YXRlZCBvciBsb3NlcyBgcmVwb3J0czp3cml0ZWAg4oCUIGEgcmVwb3J0IG11c3Qgc3RvcCB3aGVuIHRoZVxuICAgKiBwZXJzb24gYWNjb3VudGFibGUgZm9yIGl0IGNhbiBubyBsb25nZXIgc2VlIHRoZSBkYXRhIGJlaGluZCBpdC5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgcGF1c2VkIGRlZmluaXRpb25zIHNvIHRoZSBjYWxsZXIgY2FuIG5vdGlmeSBhbiBvcmcgYWRtaW46IGFcbiAgICogc2lsZW50bHkgc3RvcHBlZCB3ZWVrbHkgcmVwb3J0IGlzIGRpc2NvdmVyZWQgYnkgYSBtYW5hZ2VyIG5vdCByZWNlaXZpbmcgaXQuXG4gICAqL1xuICBhc3luYyBwYXVzZURlZmluaXRpb25zRm9yT3duZXIoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBvd25lcklkOiBzdHJpbmcsXG4gICAgcmVhc29uOiBSZXBvcnRQYXVzZVJlYXNvbixcbiAgKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGlzQWN0aXZlOiBmYWxzZSwgcGF1c2VkUmVhc29uOiByZWFzb24sIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3duZXJJZCwgb3duZXJJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gIH1cblxuICBhc3luYyBkZWxldGVEZWZpbml0aW9uKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRlbGV0ZWRCeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGRlbGV0ZWRBdDogbm93LCBkZWxldGVkQnksIC4uLnB1cmdlU3RhbXAobm93KSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KSk7XG4gICAgaWYgKChyb3dzIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IGRlZmluaXRpb24gbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIC8vIExpbmtzIHRvIHRoaXMgZGVmaW5pdGlvbidzIHJ1bnMgYXJlIHJldm9rZWQgaW4gdGhlIHNhbWUgYnJlYXRoLiBEZWxldGluZyBhXG4gICAgLy8gcmVwb3J0IHdoaWxlIGEgcHVibGljIFVSTCB0byBsYXN0IG1vbnRoJ3MgbnVtYmVycyBrZWVwcyB3b3JraW5nIGlzIHRoZSBraW5kXG4gICAgLy8gb2YgZ2FwIG5vYm9keSBub3RpY2VzIHVudGlsIGl0IG1hdHRlcnMuXG4gICAgYXdhaXQgdGhpcy5yZXZva2VMaW5rc0ZvckRlZmluaXRpb24ob3JnSWQsIGlkLCBkZWxldGVkQnkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1bnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEluc2VydCBhIHJ1biBmb3IgYSBwZXJpb2QsIG9yIHJldHVybiB0aGUgZXhpc3Rpbmcgb25lLlxuICAgKlxuICAgKiBJZGVtcG90ZW50IG9uIChkZWZpbml0aW9uLCBwZXJpb2RTdGFydCwgdmVyc2lvbik6IGEgcmV0cnksIGEgY2F0Y2gtdXAgcGFzc1xuICAgKiBhbmQgYSBtYW51YWwgYmFja2ZpbGwgY2FuIGFsbCBhc2sgZm9yIHRoZSBzYW1lIHBlcmlvZCwgYW5kIHdpdGhvdXQgdGhpcyBlYWNoXG4gICAqIHdvdWxkIGluc2VydCBhIHJvdyBhbmQgdGhlIGxlYWQgd291bGQgcmV2aWV3IHRocmVlIGNvcGllcy4gYG9uQ29uZmxpY3REb05vdGhpbmdgXG4gICAqIHBsdXMgYSByZS1yZWFkIGlzIGRlbGliZXJhdGUg4oCUIHRoZSB1bmlxdWUgaW5kZXggaXMgdGhlIGFyYml0ZXIsIHNvIHR3byBwb2RzXG4gICAqIHJhY2luZyBwcm9kdWNlIG9uZSByb3cgd2hpY2hldmVyIHdpbnMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVSdW4oaW5wdXQ6IHtcbiAgICBvcmdJZDogc3RyaW5nO1xuICAgIGRlZmluaXRpb25JZDogc3RyaW5nO1xuICAgIHBlcmlvZFN0YXJ0OiBEYXRlO1xuICAgIHBlcmlvZEVuZDogRGF0ZTtcbiAgICBwZXJpb2RMYWJlbDogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBudW1iZXI7XG4gICAgc3RhdHVzPzogUmVwb3J0UnVuU3RhdHVzO1xuICAgIHNuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xuICAgIGZhaWx1cmVSZWFzb24/OiBzdHJpbmcgfCBudWxsO1xuICB9KTogUHJvbWlzZTx7IHJ1bjogUmVwb3J0UnVuOyBjcmVhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gaW5wdXQudmVyc2lvbiA/PyAxO1xuICAgIGNvbnN0IGlkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLnJlcG9ydFJ1bikudmFsdWVzKHtcbiAgICAgIGlkLFxuICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgZGVmaW5pdGlvbklkOiBpbnB1dC5kZWZpbml0aW9uSWQsXG4gICAgICBwZXJpb2RTdGFydDogaW5wdXQucGVyaW9kU3RhcnQsXG4gICAgICBwZXJpb2RFbmQ6IGlucHV0LnBlcmlvZEVuZCxcbiAgICAgIHBlcmlvZExhYmVsOiBpbnB1dC5wZXJpb2RMYWJlbCxcbiAgICAgIHZlcnNpb24sXG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyA/PyAnZHJhZnRpbmcnLFxuICAgICAgc25hcHNob3Q6IGlucHV0LnNuYXBzaG90ID8/IG51bGwsXG4gICAgICBmYWlsdXJlUmVhc29uOiBpbnB1dC5mYWlsdXJlUmVhc29uID8/IG51bGwsXG4gICAgfSkub25Db25mbGljdERvTm90aGluZyh7XG4gICAgICB0YXJnZXQ6IFtzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgc2NoZW1hLnJlcG9ydFJ1bi5wZXJpb2RTdGFydCwgc2NoZW1hLnJlcG9ydFJ1bi52ZXJzaW9uXSxcbiAgICB9KS5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgaW5zZXJ0ZWQgPSAocm93cyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKGluc2VydGVkKSByZXR1cm4geyBydW46IGluc2VydGVkLCBjcmVhdGVkOiB0cnVlIH07XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uZGVmaW5pdGlvbklkLCBpbnB1dC5kZWZpbml0aW9uSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLnBlcmlvZFN0YXJ0LCBpbnB1dC5wZXJpb2RTdGFydCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4udmVyc2lvbiwgdmVyc2lvbiksXG4gICAgICApKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICBjb25zdCBmb3VuZCA9IChleGlzdGluZyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgLy8gVGhlIGluc2VydCB3YXMgc2tpcHBlZCBieSB0aGUgY29uZmxpY3QgdGFyZ2V0IGJ1dCBub3RoaW5nIGlzIHRoZXJlIHRvXG4gICAgICAvLyByZWFkOiB0aGUgb25seSB3YXkgaXMgYSBjb25jdXJyZW50IGRlbGV0ZSBiZXR3ZWVuIHRoZSB0d28gc3RhdGVtZW50cy5cbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKCdSZXBvcnQgcnVuIGNvdWxkIG5vdCBiZSBjcmVhdGVkJywgRXJyb3JDb2RlLkNPTkZMSUNULCB7XG4gICAgICAgIGRlZmluaXRpb25JZDogaW5wdXQuZGVmaW5pdGlvbklkLFxuICAgICAgICBwZXJpb2RMYWJlbDogaW5wdXQucGVyaW9kTGFiZWwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcnVuOiBmb3VuZCwgY3JlYXRlZDogZmFsc2UgfTtcbiAgfVxuXG4gIC8qKiBUaGUgbmV4dCB2ZXJzaW9uIG51bWJlciBmb3IgYSBwZXJpb2Q6IGBtYXgodmVyc2lvbikgKyAxYC4gKi9cbiAgYXN5bmMgbmV4dFZlcnNpb24oZGVmaW5pdGlvbklkOiBzdHJpbmcsIHBlcmlvZFN0YXJ0OiBEYXRlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHsgdmVyc2lvbjogc2NoZW1hLnJlcG9ydFJ1bi52ZXJzaW9uIH0pXG4gICAgICAuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGRlZmluaXRpb25JZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ucGVyaW9kU3RhcnQsIHBlcmlvZFN0YXJ0KSxcbiAgICAgICkpXG4gICAgICAub3JkZXJCeShkZXNjKHNjaGVtYS5yZXBvcnRSdW4udmVyc2lvbikpXG4gICAgICAubGltaXQoMSkpO1xuICAgIGNvbnN0IHRvcCA9IChyb3dzIGFzIEFycmF5PHsgdmVyc2lvbjogbnVtYmVyIH0+KVswXTtcbiAgICByZXR1cm4gKHRvcD8udmVyc2lvbiA/PyAwKSArIDE7XG4gIH1cblxuICAvKiogUG9pbnQgYW4gb2xkZXIgcnVuIGF0IHRoZSB2ZXJzaW9uIHRoYXQgcmVwbGFjZWQgaXQuICovXG4gIGFzeW5jIHN1cGVyc2VkZShvcmdJZDogc3RyaW5nLCBvbGRSdW5JZDogc3RyaW5nLCBuZXdSdW5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAuc2V0KHsgc3VwZXJzZWRlZEJ5OiBuZXdSdW5JZCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIG9sZFJ1bklkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpKSkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFJ1bnMob3JnSWQ6IHN0cmluZywgZGVmaW5pdGlvbklkOiBzdHJpbmcsIGxpbWl0ID0gNTApOiBQcm9taXNlPFJlcG9ydFJ1bltdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGRlZmluaXRpb25JZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLm9yZGVyQnkoZGVzYyhzY2hlbWEucmVwb3J0UnVuLnBlcmlvZFN0YXJ0KSwgZGVzYyhzY2hlbWEucmVwb3J0UnVuLnZlcnNpb24pKVxuICAgICAgLmxpbWl0KGxpbWl0KSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0UnVuW107XG4gIH1cblxuICBhc3luYyBnZXRSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0UnVuIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLCBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpKSlcbiAgICAgIC5saW1pdCgxKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXSA/PyBudWxsO1xuICB9XG5cbiAgYXN5bmMgcmVxdWlyZVJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnRSdW4+IHtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMuZ2V0UnVuKG9yZ0lkLCBpZCk7XG4gICAgaWYgKCFmb3VuZCkgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBydW4gbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqIFN0b3JlIGEgY29tcHV0ZWQgc25hcHNob3QgYW5kIG1vdmUgdGhlIHJ1biB0byBgcmVhZHlfZm9yX3Jldmlld2AuICovXG4gIGFzeW5jIGNvbXBsZXRlUnVuKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RhdHVzOiBSZXBvcnRSdW5TdGF0dXMgPSAncmVhZHlfZm9yX3JldmlldycsXG4gICk6IFByb21pc2U8UmVwb3J0UnVuPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLnNldCh7IHNuYXBzaG90LCBzdGF0dXMsIGZhaWx1cmVSZWFzb246IG51bGwsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEucmVwb3J0UnVuLmlkLCBpZCksIGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIG9yZ0lkKSwgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSAocm93cyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKCF1cGRhdGVkKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IHJ1biBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIGFzeW5jIGZhaWxSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgZmFpbHVyZVJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAuc2V0KHsgc3RhdHVzOiAnZmFpbGVkJywgZmFpbHVyZVJlYXNvbiwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGxlYWQncyBvd24gd29yZHMgb24gYSBydW4gdGhhdCBoYXMgTk9UIGJlZW4gcHVibGlzaGVkLlxuICAgKlxuICAgKiBSZWZ1c2VkIGFmdGVyIHB1Ymxpc2g6IHRoZSBub3RlcyBhcmUgcGFydCBvZiB3aGF0IHRoZSBtYW5hZ2VyIHJlYWQsIGFuZCBhXG4gICAqIHJlcG9ydCB3aG9zZSBuYXJyYXRpdmUgY2FuIGJlIGVkaXRlZCBhZnRlciBkZWxpdmVyeSBpcyBhIHJlcG9ydCB3aG9zZVxuICAgKiBkZWxpdmVyZWQgdmVyc2lvbiBjYW5ub3QgYmUgcmVjb25zdHJ1Y3RlZC4gUmVnZW5lcmF0aW5nIHByb2R1Y2VzIHZlcnNpb24gTisxLFxuICAgKiB3aGljaCBpcyB0aGUgc3VwcG9ydGVkIHdheSB0byBjb3JyZWN0IGEgcHVibGlzaGVkIHJlcG9ydC5cbiAgICovXG4gIGFzeW5jIHNldFJ1bk5vdGVzKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwYXRjaDogeyBsZWFkTm90ZXM/OiBzdHJpbmc7IGFpRHJhZnQ/OiBzdHJpbmcgfSxcbiAgKTogUHJvbWlzZTxSZXBvcnRSdW4+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLnJlcXVpcmVSdW4ob3JnSWQsIGlkKTtcbiAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ3B1Ymxpc2hlZCcpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAnVGhpcyByZXBvcnQgaGFzIGFscmVhZHkgYmVlbiBwdWJsaXNoZWQuIFJlZ2VuZXJhdGUgaXQgdG8gcHJvZHVjZSBhIG5ldyB2ZXJzaW9uIHdpdGggeW91ciBjaGFuZ2VzIOKAlCAnXG4gICAgICAgICsgJ3RoZSBwdWJsaXNoZWQgdmVyc2lvbiBzdGF5cyBleGFjdGx5IGFzIHRoZSByZWNpcGllbnRzIHJlYWQgaXQuJyxcbiAgICAgICAgRXJyb3JDb2RlLkNPTkZMSUNULFxuICAgICAgICB7IHJ1bklkOiBpZCwgcHVibGlzaGVkQXQ6IHJ1bi5wdWJsaXNoZWRBdD8udG9JU09TdHJpbmcoKSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH07XG4gICAgaWYgKHBhdGNoLmxlYWROb3RlcyAhPT0gdW5kZWZpbmVkKSBzZXQubGVhZE5vdGVzID0gcGF0Y2gubGVhZE5vdGVzO1xuICAgIGlmIChwYXRjaC5haURyYWZ0ICE9PSB1bmRlZmluZWQpIHNldC5haURyYWZ0ID0gcGF0Y2guYWlEcmFmdDtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSdW4pLnNldChzZXQpXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLCBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgd2hhdCBoYXBwZW5lZCB3aGVuIGEgcnVuIHdhcyBkZWxpdmVyZWQuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBOT1QgcGFydCBvZiB7QGxpbmsgc2V0UnVuTm90ZXN9LCB3aGljaCByZWZ1c2VzIGEgcHVibGlzaGVkIHJ1bjogZGVsaXZlcnlcbiAgICogaGFwcGVucyBBVCBwdWJsaXNoLCBzbyBhIG1ldGhvZCB0aGF0IHJlZnVzZWQgcHVibGlzaGVkIHJ1bnMgY291bGQgbmV2ZXIgcmVjb3JkIGl0LlxuICAgKiBUaGlzIG9uZSB3cml0ZXMgZXhhY3RseSBvbmUgY29sdW1uIGFuZCBub3RoaW5nIGVsc2UsIHdoaWNoIGlzIHdoeSBpdCBpcyBzYWZlIHRvIGFsbG93XG4gICAqIGFmdGVyIHB1Ymxpc2gg4oCUIGl0IGNhbm5vdCBjaGFuZ2UgYSBudW1iZXIgYSByZWNpcGllbnQgaGFzIHJlYWQuXG4gICAqL1xuICBhc3luYyByZWNvcmREZWxpdmVyeShvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBkZWxpdmVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC5zZXQoeyBkZWxpdmVyeSwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSxcbiAgICAgICkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEgcnVuLlxuICAgKlxuICAgKiBDb25kaXRpb25hbCBvbiB0aGUgcm93IHN0aWxsIGJlaW5nIHVucHVibGlzaGVkIChgcHVibGlzaGVkX2F0IElTIE5VTExgKSwgc29cbiAgICogdHdvIGNsaWNrcyDigJQgb3IgdHdvIHRhYnMg4oCUIHByb2R1Y2Ugb25lIHB1Ymxpc2ggYW5kIG9uZSBzZXQgb2YgZGVsaXZlcmllc1xuICAgKiByYXRoZXIgdGhhbiB0d28uIEEgcnVuIHdpdGggbm8gc25hcHNob3QgY2Fubm90IGJlIHB1Ymxpc2hlZDogdGhlcmUgd291bGQgYmVcbiAgICogbm90aGluZyBmb3IgYSByZWNpcGllbnQgdG8gcmVhZC5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcHVibGlzaGVkQnk6IHN0cmluZyk6IFByb21pc2U8eyBydW46IFJlcG9ydFJ1bjsgYWxyZWFkeVB1Ymxpc2hlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgdGhpcy5yZXF1aXJlUnVuKG9yZ0lkLCBpZCk7XG4gICAgaWYgKHJ1bi5zdGF0dXMgPT09ICdmYWlsZWQnIHx8ICFydW4uc25hcHNob3QpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAnVGhpcyByZXBvcnQgaGFzIG5vIGNvbXB1dGVkIHNuYXBzaG90LCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHB1Ymxpc2guIFJlZ2VuZXJhdGUgaXQgZmlyc3QuJyxcbiAgICAgICAgRXJyb3JDb2RlLkNPTkZMSUNULFxuICAgICAgICB7IHJ1bklkOiBpZCwgc3RhdHVzOiBydW4uc3RhdHVzIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC5zZXQoeyBzdGF0dXM6ICdwdWJsaXNoZWQnLCBwdWJsaXNoZWRCeSwgcHVibGlzaGVkQXQ6IG5vdywgdXBkYXRlZEF0OiBub3cgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5wdWJsaXNoZWRBdCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICBjb25zdCBwdWJsaXNoZWQgPSAocm93cyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKHB1Ymxpc2hlZCkgcmV0dXJuIHsgcnVuOiBwdWJsaXNoZWQsIGFscmVhZHlQdWJsaXNoZWQ6IGZhbHNlIH07XG4gICAgLy8gVGhlIGNvbmRpdGlvbmFsIHVwZGF0ZSBtYXRjaGVkIG5vdGhpbmc6IHNvbWVvbmUgZWxzZSBwdWJsaXNoZWQgaXQgZmlyc3QuXG4gICAgcmV0dXJuIHsgcnVuOiBhd2FpdCB0aGlzLnJlcXVpcmVSdW4ob3JnSWQsIGlkKSwgYWxyZWFkeVB1Ymxpc2hlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFNoYXJlIGxpbmtzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBNaW50IGEgcmVhZC1vbmx5IGxpbmsgdG8gYSBwdWJsaXNoZWQgcnVuLiBUaGUgcmF3IHRva2VuIGlzIHJldHVybmVkIGhlcmUgYW5kXG4gICAqIG5vd2hlcmUgZWxzZSDigJQgb25seSBpdHMgaGFzaCBpcyBzdG9yZWQsIHNvIGEgZGF0YWJhc2UgY29weSBjYW5ub3QgYmUgdHVybmVkXG4gICAqIGJhY2sgaW50byB3b3JraW5nIFVSTHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZUxpbmsoaW5wdXQ6IHtcbiAgICBvcmdJZDogc3RyaW5nO1xuICAgIHJ1bklkOiBzdHJpbmc7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgdHRsRGF5cz86IG51bWJlcjtcbiAgICByZWRhY3ROYW1lcz86IGJvb2xlYW47XG4gICAgbm93PzogRGF0ZTtcbiAgfSk6IFByb21pc2U8TWludGVkU2hhcmVMaW5rPiB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgdGhpcy5yZXF1aXJlUnVuKGlucHV0Lm9yZ0lkLCBpbnB1dC5ydW5JZCk7XG4gICAgaWYgKHJ1bi5zdGF0dXMgIT09ICdwdWJsaXNoZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgJ09ubHkgYSBwdWJsaXNoZWQgcmVwb3J0IGNhbiBiZSBzaGFyZWQuIFB1Ymxpc2ggaXQgZmlyc3Qg4oCUIGEgbGluayB0byBhIGRyYWZ0IHdvdWxkIHNob3cgbnVtYmVycyB0aGUgbGVhZCBoYXMgbm90IHJldmlld2VkLicsXG4gICAgICAgIEVycm9yQ29kZS5DT05GTElDVCxcbiAgICAgICAgeyBydW5JZDogaW5wdXQucnVuSWQsIHN0YXR1czogcnVuLnN0YXR1cyB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGF5cyA9IE1hdGgubWluKGlucHV0LnR0bERheXMgPz8gREVGQVVMVF9TSEFSRV9MSU5LX1RUTF9EQVlTLCBNQVhfU0hBUkVfTElOS19UVExfREFZUyk7XG4gICAgY29uc3Qgbm93ID0gaW5wdXQubm93ID8/IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgeyB0b2tlbiwgdG9rZW5IYXNoIH0gPSBtaW50VG9rZW4oKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspLnZhbHVlcyh7XG4gICAgICBpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgcnVuSWQ6IGlucHV0LnJ1bklkLFxuICAgICAgdG9rZW5IYXNoLFxuICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApLFxuICAgICAgcmVkYWN0TmFtZXM6IGlucHV0LnJlZGFjdE5hbWVzID8/IGZhbHNlLFxuICAgICAgY3JlYXRlZEJ5OiBpbnB1dC5jcmVhdGVkQnksXG4gICAgfSkucmV0dXJuaW5nKCkpO1xuICAgIHJldHVybiB7IGxpbms6IChyb3dzIGFzIFJlcG9ydFNoYXJlTGlua1tdKVswXSwgdG9rZW4gfTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RTaGFyZUxpbmtzKG9yZ0lkOiBzdHJpbmcsIHJ1bklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydFNoYXJlTGlua1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFNoYXJlTGluaylcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5vcmdJZCwgb3JnSWQpLCBlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJ1bklkLCBydW5JZCkpKVxuICAgICAgLm9yZGVyQnkoZGVzYyhzY2hlbWEucmVwb3J0U2hhcmVMaW5rLmNyZWF0ZWRBdCkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnRTaGFyZUxpbmtbXTtcbiAgfVxuXG4gIGFzeW5jIHJldm9rZVNoYXJlTGluayhvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCByZXZva2VkQnk6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0U2hhcmVMaW5rPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKVxuICAgICAgLnNldCh7IHJldm9rZWRBdDogbmV3IERhdGUoKSwgcmV2b2tlZEJ5IH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucmV2b2tlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHJldm9rZWQgPSAocm93cyBhcyBSZXBvcnRTaGFyZUxpbmtbXSlbMF07XG4gICAgaWYgKCFyZXZva2VkKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignU2hhcmUgbGluayBub3QgZm91bmQgb3IgYWxyZWFkeSByZXZva2VkJyk7XG4gICAgcmV0dXJuIHJldm9rZWQ7XG4gIH1cblxuICAvKiogUmV2b2tlIGV2ZXJ5IGxpdmUgbGluayB0byBhbnkgcnVuIG9mIGEgZGVmaW5pdGlvbi4gVXNlZCBvbiBkZWxldGUuICovXG4gIGFzeW5jIHJldm9rZUxpbmtzRm9yRGVmaW5pdGlvbihvcmdJZDogc3RyaW5nLCBkZWZpbml0aW9uSWQ6IHN0cmluZywgcmV2b2tlZEJ5OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHJ1bnMgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoeyBpZDogc2NoZW1hLnJlcG9ydFJ1bi5pZCB9KS5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIG9yZ0lkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGRlZmluaXRpb25JZCkpKSk7XG4gICAgY29uc3QgcnVuSWRzID0gKHJ1bnMgYXMgQXJyYXk8eyBpZDogc3RyaW5nIH0+KS5tYXAoKHIpID0+IHIuaWQpO1xuICAgIGlmIChydW5JZHMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspXG4gICAgICAuc2V0KHsgcmV2b2tlZEF0OiBuZXcgRGF0ZSgpLCByZXZva2VkQnkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaW5BcnJheShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJ1bklkLCBydW5JZHMpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5yZXZva2VkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFNoYXJlTGluay5pZCB9KSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIHVua25vd25bXSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBzaGFyZSB0b2tlbiB0byBpdHMgbGluayBhbmQgcnVuLCBmb3IgdGhlIFVOQVVUSEVOVElDQVRFRCBwdWJsaWNcbiAgICogcm91dGUuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIG9uZSByZWFkIGluIHRoaXMgbW9kdWxlIHRoYXQgcnVucyBhcyBzeXNhZG1pbiwgYW5kIHRoZSByZWFzb24gaXNcbiAgICogc3RydWN0dXJhbDogdGhlIHJlYWRlciBob2xkcyBhIHRva2VuIGFuZCBub3RoaW5nIGVsc2Ug4oCUIG5vIGFjY291bnQsIG5vIG9yZyxcbiAgICogbm8gSldUIOKAlCBzbyB0aGVyZSBpcyBubyB0ZW5hbnQgY29udGV4dCBmb3IgUkxTIHRvIHNjb3BlIGJ5LCBhbmQgdGhlIG9yZyBjYW5cbiAgICogb25seSBiZSBsZWFybmVkIEZST00gdGhlIHJvdy4gVGhlIGVzY2FsYXRpb24gaXMga2VwdCBhcyBuYXJyb3cgYXMgdGhlIHByb2JsZW06XG4gICAqXG4gICAqICAtIFRoZSBzeXNhZG1pbiBzY29wZSBjb3ZlcnMgdGhlIHRva2VuLWhhc2ggbG9va3VwIE9OTFkuIFRoZSBydW4gaXMgcmVhZCBiYWNrXG4gICAqICAgIHVuZGVyIHRoZSBsaW5rJ3MgT1dOIG9yZywgc28gYSBidWcgaW4gdGhlIHJ1biBxdWVyeSBjYW5ub3QgcmVhY2ggYW5vdGhlclxuICAgKiAgICB0ZW5hbnQncyByb3dzLlxuICAgKiAgLSBUaGUgbG9va3VwIGlzIGJ5IGEgMjU2LWJpdCBoYXNoIG9uIGEgdW5pcXVlIGluZGV4LiBJdCBpcyBub3QgYSBmaWx0ZXIgYVxuICAgKiAgICBjYWxsZXIgY2FuIHdpZGVuIOKAlCB0aGVyZSBpcyBubyBvdGhlciBwcmVkaWNhdGUgdG8gaW5mbHVlbmNlLlxuICAgKiAgLSBFeHBpcmVkIGFuZCByZXZva2VkIGxpbmtzIHJlc29sdmUgdG8gbnVsbCBoZXJlLCBzbyB0aGUgY2FsbGVyIGNhbm5vdFxuICAgKiAgICBhY2NpZGVudGFsbHkgc2VydmUgb25lIGJ5IGZvcmdldHRpbmcgYSBjaGVjay5cbiAgICpcbiAgICogUmV0dXJucyBudWxsIGZvciBldmVyeSBmYWlsdXJlIOKAlCB1bmtub3duLCByZXZva2VkLCBleHBpcmVkLCBvciBwb2ludGluZyBhdCBhXG4gICAqIHJ1biB0aGF0IGlzIG5vIGxvbmdlciBwdWJsaXNoZWQg4oCUIHNvIHRoZSByb3V0ZSBhbnN3ZXJzIG9uZSBpbmRpc3Rpbmd1aXNoYWJsZVxuICAgKiA0MDQgYW5kIGEgaG9sZGVyIG9mIGEgZGVhZCBsaW5rIGxlYXJucyBub3RoaW5nIGFib3V0IHdoaWNoIG9mIHRob3NlIGl0IHdhcy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVTaGFyZUxpbmsodG9rZW46IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8UmVzb2x2ZWRTaGFyZUxpbmsgfCBudWxsPiB7XG4gICAgY29uc3QgdG9rZW5IYXNoID0gaGFzaFRva2VuKHRva2VuKTtcbiAgICBjb25zdCBsaW5rcyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnRva2VuSGFzaCwgdG9rZW5IYXNoKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgY29uc3QgbGluayA9IChsaW5rcyBhcyBSZXBvcnRTaGFyZUxpbmtbXSlbMF07XG4gICAgLy8gTm8gY29uc3RhbnQtdGltZSBjb21wYXJpc29uIGhlcmUgb24gcHVycG9zZTogdGhlIGxvb2t1cCBpcyBhbiBlcXVhbGl0eSBtYXRjaFxuICAgIC8vIG9uIGEgMjU2LWJpdCBoYXNoIG92ZXIgYSB1bmlxdWUgaW5kZXgsIHNvIHRoZXJlIGlzIG5vIHNlY3JldC1kZXBlbmRlbnQgYnJhbmNoXG4gICAgLy8gaW4gdGhpcyBmdW5jdGlvbiB0byBsZWFrLiBBIGhhbmQtcm9sbGVkIGNvbXBhcmUgYWZ0ZXIgdGhlIGRhdGFiYXNlIGFscmVhZHlcbiAgICAvLyBkZWNpZGVkIGl0IHdvdWxkIGJlIHRoZWF0cmUuXG4gICAgaWYgKCFsaW5rKSByZXR1cm4gbnVsbDtcbiAgICBpZiAobGluay5yZXZva2VkQXQpIHJldHVybiBudWxsO1xuICAgIGlmIChsaW5rLmV4cGlyZXNBdC5nZXRUaW1lKCkgPD0gbm93LmdldFRpbWUoKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBydW5zID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZDogbGluay5vcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGxpbmsucnVuSWQpLFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ub3JnSWQsIGxpbmsub3JnSWQpLFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uc3RhdHVzLCAncHVibGlzaGVkJyksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSxcbiAgICAgICAgKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgY29uc3QgcnVuID0gKHJ1bnMgYXMgUmVwb3J0UnVuW10pWzBdO1xuICAgIGlmICghcnVuKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyBsaW5rLCBydW4gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBvbmUgaHVtYW4gdmlldyBvZiBhIHNoYXJlZCByZXBvcnQuXG4gICAqXG4gICAqIFNlcGFyYXRlIGZyb20ge0BsaW5rIHJlc29sdmVTaGFyZUxpbmt9IHNvIHRoZSByb3V0ZSBjYW4gc2VydmUgYSBsaW5rIHByZXZpZXcsXG4gICAqIGEgSEVBRCBwcm9iZSBvciBhIG1haWwgc2Nhbm5lcidzIGZldGNoIFdJVEhPVVQgY291bnRpbmcgaXQg4oCUIGEgdmlldyBjb3VudCB0aGF0XG4gICAqIGp1bXBzIHRoZSBtb21lbnQgYSBsaW5rIGlzIHBhc3RlZCBpbnRvIFNsYWNrIHRlbGxzIHRoZSBsZWFkIHRoZWlyIG1hbmFnZXIgcmVhZFxuICAgKiB0aGUgcmVwb3J0IHdoZW4gbm9ib2R5IGhhcy5cbiAgICovXG4gIGFzeW5jIHJlY29yZFNoYXJlVmlldyhsaW5rOiBSZXBvcnRTaGFyZUxpbmssIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkOiBsaW5rLm9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFNoYXJlTGluaylcbiAgICAgICAgLnNldCh7IHZpZXdDb3VudDogc3FsYCR7c2NoZW1hLnJlcG9ydFNoYXJlTGluay52aWV3Q291bnR9ICsgMWAsIGxhc3RWaWV3ZWRBdDogbm93IH0pXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLmlkLCBsaW5rLmlkKSkpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWNpcGllbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBZGQgKG9yIHJlLWFkZCkgYSBkZWxpdmVyeSBhZGRyZXNzLlxuICAgKlxuICAgKiBVcHNlcnRzIG9uIChvcmcsIGVtYWlsKSBhbmQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIHJlc2V0IGB1bnN1YnNjcmliZWRfYXRgIG9yXG4gICAqIGB2ZXJpZmllZF9hdGA6IGEgbGVhZCBtdXN0IG5vdCBiZSBhYmxlIHRvIHVuZG8gc29tZW9uZSdzIHVuc3Vic2NyaWJlIGJ5XG4gICAqIHJlbW92aW5nIGFuZCByZS1hZGRpbmcgdGhlbSwgYW5kIGFuIGFkZHJlc3MgYWxyZWFkeSB2ZXJpZmllZCBzaG91bGQgbm90IGhhdmVcbiAgICogdG8gY29uZmlybSB0d2ljZS4gQSB2ZXJpZmljYXRpb24gdG9rZW4gaXMgbWludGVkIG9ubHkgd2hlbiB0aGUgYWRkcmVzcyBpcyBub3RcbiAgICogeWV0IHZlcmlmaWVkLlxuICAgKi9cbiAgYXN5bmMgdXBzZXJ0UmVjaXBpZW50KGlucHV0OiB7XG4gICAgb3JnSWQ6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgIC8qKiBTZXQgd2hlbiBhbiBhZG1pbiBwcmUtYXBwcm92ZWQgYW4gb3V0LW9mLWRvbWFpbiBhZGRyZXNzLiAqL1xuICAgIGFwcHJvdmVkQnk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBPcmcgbWVtYmVycyBza2lwIHZlcmlmaWNhdGlvbiDigJQgdGhleSBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgdG8gdGhpcyBvcmcuICovXG4gICAgcHJlVmVyaWZpZWQ/OiBib29sZWFuO1xuICAgIG5vdz86IERhdGU7XG4gIH0pOiBQcm9taXNlPHsgcmVjaXBpZW50OiBSZXBvcnRSZWNpcGllbnQ7IHZlcmlmaWNhdGlvblRva2VuPzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBlbWFpbCA9IGlucHV0LmVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5vdyA9IGlucHV0Lm5vdyA/PyBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IG1pbnRlZCA9IGlucHV0LnByZVZlcmlmaWVkID8gdW5kZWZpbmVkIDogbWludFRva2VuKCk7XG4gICAgLy8gVGhlIHVuc3Vic2NyaWJlIHRva2VuIGlzIG1pbnRlZCBmb3IgRVZFUlkgcmVjaXBpZW50LCBtZW1iZXIgb3Igbm90LCBiZWNhdXNlIGV2ZXJ5XG4gICAgLy8gcmVwb3J0IGVtYWlsIGNhcnJpZXMgdGhlIGxpbmsuIE1pbnRlZCBvbmNlIGFuZCBrZXB0OiBhIGxpbmsgaW4gYSByZXBvcnQgZnJvbSBNYXJjaFxuICAgIC8vIGhhcyB0byBrZWVwIHdvcmtpbmcuXG4gICAgY29uc3QgdW5zdWIgPSBtaW50VG9rZW4oKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpLnZhbHVlcyh7XG4gICAgICBpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgZW1haWwsXG4gICAgICBkaXNwbGF5TmFtZTogaW5wdXQuZGlzcGxheU5hbWUgPz8gbnVsbCxcbiAgICAgIHZlcmlmaWVkQXQ6IGlucHV0LnByZVZlcmlmaWVkID8gbm93IDogbnVsbCxcbiAgICAgIHZlcmlmaWNhdGlvblRva2VuSGFzaDogbWludGVkPy50b2tlbkhhc2ggPz8gbnVsbCxcbiAgICAgIHVuc3Vic2NyaWJlVG9rZW46IHVuc3ViLnRva2VuLFxuICAgICAgYXBwcm92ZWRCeTogaW5wdXQuYXBwcm92ZWRCeSA/PyBudWxsLFxuICAgICAgY3JlYXRlZEJ5OiBpbnB1dC5jcmVhdGVkQnksXG4gICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgIHRhcmdldDogW3NjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWxdLFxuICAgICAgc2V0OiB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBpbnB1dC5kaXNwbGF5TmFtZSA/PyBzcWxgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRpc3BsYXlOYW1lfWAsXG4gICAgICAgIC8vIFJlLWFkZGluZyBhIHRvbWJzdG9uZWQgcmVjaXBpZW50IHJldml2ZXMgdGhlIHJvdyB3aXRoIGl0cyBoaXN0b3J5LlxuICAgICAgICBkZWxldGVkQXQ6IG51bGwsXG4gICAgICAgIGRlbGV0ZWRCeTogbnVsbCxcbiAgICAgICAgcHVyZ2VBZnRlcjogbnVsbCxcbiAgICAgICAgYXBwcm92ZWRCeTogaW5wdXQuYXBwcm92ZWRCeSA/PyBzcWxgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LmFwcHJvdmVkQnl9YCxcbiAgICAgICAgLy8gT25seSBtaW50IG92ZXIgYW4gVU5WRVJJRklFRCByb3c7IGEgdmVyaWZpZWQgYWRkcmVzcyBrZWVwcyBpdHMgc3RhdGUuXG4gICAgICAgIHZlcmlmaWNhdGlvblRva2VuSGFzaDogc3FsYENBU0UgV0hFTiAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpZWRBdH0gSVMgTlVMTFxuICAgICAgICAgIFRIRU4gJHttaW50ZWQ/LnRva2VuSGFzaCA/PyBudWxsfSBFTFNFICR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC52ZXJpZmljYXRpb25Ub2tlbkhhc2h9IEVORGAsXG4gICAgICAgIHZlcmlmaWVkQXQ6IGlucHV0LnByZVZlcmlmaWVkXG4gICAgICAgICAgPyBzcWxgQ09BTEVTQ0UoJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWVkQXR9LCAke25vd30pYFxuICAgICAgICAgIDogc3FsYCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC52ZXJpZmllZEF0fWAsXG4gICAgICAgIC8vIENPQUxFU0NFLCBuZXZlciBvdmVyd3JpdGU6IHJlLWFkZGluZyBhbiBhZGRyZXNzIG11c3Qgbm90IGJyZWFrIHRoZSB1bnN1YnNjcmliZVxuICAgICAgICAvLyBsaW5rIGluIGV2ZXJ5IHJlcG9ydCBhbHJlYWR5IGRlbGl2ZXJlZCB0byBpdC5cbiAgICAgICAgdW5zdWJzY3JpYmVUb2tlbjogc3FsYENPQUxFU0NFKCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC51bnN1YnNjcmliZVRva2VufSwgJHt1bnN1Yi50b2tlbn0pYCxcbiAgICAgIH0sXG4gICAgfSkucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHJlY2lwaWVudCA9IChyb3dzIGFzIFJlcG9ydFJlY2lwaWVudFtdKVswXTtcbiAgICAvLyBUaGUgdG9rZW4gaXMgb25seSB1c2VmdWwgaWYgdGhpcyByb3cgYWN0dWFsbHkgdG9vayBpdC5cbiAgICBjb25zdCB0b29rVG9rZW4gPSBtaW50ZWQgJiYgcmVjaXBpZW50LnZlcmlmaWNhdGlvblRva2VuSGFzaCA9PT0gbWludGVkLnRva2VuSGFzaDtcbiAgICByZXR1cm4geyByZWNpcGllbnQsIC4uLih0b29rVG9rZW4gPyB7IHZlcmlmaWNhdGlvblRva2VuOiBtaW50ZWQudG9rZW4gfSA6IHt9KSB9O1xuICB9XG5cbiAgYXN5bmMgbGlzdFJlY2lwaWVudHMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0UmVjaXBpZW50W10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRlbGV0ZWRBdCkpKVxuICAgICAgLm9yZGVyQnkoYXNjKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwpKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W107XG4gIH1cblxuICBhc3luYyBnZXRSZWNpcGllbnRzKG9yZ0lkOiBzdHJpbmcsIGlkczogc3RyaW5nW10pOiBQcm9taXNlPFJlcG9ydFJlY2lwaWVudFtdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpbkFycmF5KHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQsIGlkcyksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRlbGV0ZWRBdCksXG4gICAgICApKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W107XG4gIH1cblxuICAvKiogTWludCBhIGZyZXNoIHZlcmlmaWNhdGlvbiB0b2tlbiBmb3IgYSByZWNpcGllbnQgdGhhdCBoYXMgbm90IGNvbmZpcm1lZCB5ZXQuICovXG4gIGFzeW5jIHJlc2VuZFZlcmlmaWNhdGlvbihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTx7IHJlY2lwaWVudDogUmVwb3J0UmVjaXBpZW50OyB0b2tlbjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB7IHRva2VuLCB0b2tlbkhhc2ggfSA9IG1pbnRUb2tlbigpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgIC5zZXQoeyB2ZXJpZmljYXRpb25Ub2tlbkhhc2g6IHRva2VuSGFzaCB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWVkQXQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gKHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W10pWzBdO1xuICAgIGlmICghcmVjaXBpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgJ1RoaXMgcmVjaXBpZW50IGlzIGFscmVhZHkgdmVyaWZpZWQsIG9yIG5vIGxvbmdlciBleGlzdHMuJyxcbiAgICAgICAgRXJyb3JDb2RlLkNPTkZMSUNULFxuICAgICAgICB7IHJlY2lwaWVudElkOiBpZCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVjaXBpZW50LCB0b2tlbiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYW4gYWRkcmVzcyBmcm9tIHRoZSBlbWFpbGVkIHRva2VuLiBDcm9zcy1vcmcgYnkgbmVjZXNzaXR5ICh0aGUgcGVyc29uXG4gICAqIGNsaWNraW5nIGhhcyBubyBzZXNzaW9uKSwgc28gaXQgcnVucyBhcyBzeXNhZG1pbiBvdmVyIGEgdW5pcXVlIDI1Ni1iaXQgaGFzaCDigJRcbiAgICogdGhlIHNhbWUgc2hhcGUsIGFuZCB0aGUgc2FtZSByZWFzb25pbmcsIGFzIHtAbGluayByZXNvbHZlU2hhcmVMaW5rfS5cbiAgICpcbiAgICogVGhlIHRva2VuIGlzIENPTlNVTUVEOiBpdCBpcyBjbGVhcmVkIG9uIHN1Y2Nlc3MsIHNvIGEgZm9yd2FyZGVkIGNvbmZpcm1hdGlvblxuICAgKiBsaW5rIGNhbm5vdCBiZSByZXBsYXllZCBieSB3aG9ldmVyIHRoZSBtYWlsIHdhcyBmb3J3YXJkZWQgdG8uXG4gICAqL1xuICBhc3luYyB2ZXJpZnlSZWNpcGllbnRCeVRva2VuKHRva2VuOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPFJlcG9ydFJlY2lwaWVudCB8IG51bGw+IHtcbiAgICBjb25zdCB0b2tlbkhhc2ggPSBoYXNoVG9rZW4odG9rZW4pO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAgIC5zZXQoeyB2ZXJpZmllZEF0OiBub3csIHZlcmlmaWNhdGlvblRva2VuSGFzaDogbnVsbCB9KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpY2F0aW9uVG9rZW5IYXNoLCB0b2tlbkhhc2gpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWVkQXQpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRlbGV0ZWRBdCksXG4gICAgICAgICAgLy8gQSB0b2tlbiBvbGRlciB0aGFuIHRoZSB3aW5kb3cgaXMgbm90IGFjY2VwdGVkLiBgY3JlYXRlZF9hdGAgaXMgdGhlXG4gICAgICAgICAgLy8gZmxvb3IgZm9yIHRoZSBmaXJzdCB0b2tlbjsgYSByZXNlbmQgcmVmcmVzaGVzIHRoZSBoYXNoLCBzbyB0aGlzIGJvdW5kc1xuICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBtaW50IGFuZCBpcyBkZWxpYmVyYXRlbHkgZ2VuZXJvdXMuXG4gICAgICAgICAgc3FsYCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC5jcmVhdGVkQXR9ID4gJHtuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gVkVSSUZJQ0FUSU9OX1RUTF9NUyl9YCxcbiAgICAgICAgKSlcbiAgICAgICAgLnJldHVybmluZygpKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIFJlcG9ydFJlY2lwaWVudFtdKVswXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEhvbm91ciBhbiB1bnN1YnNjcmliZSBhY3Jvc3MgZXZlcnkgZGVmaW5pdGlvbiBpbiB0aGUgb3JnLiAqL1xuICBhc3luYyB1bnN1YnNjcmliZUJ5RW1haWwob3JnSWQ6IHN0cmluZywgZW1haWw6IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgIC5zZXQoeyB1bnN1YnNjcmliZWRBdDogbm93IH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwsIGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudW5zdWJzY3JpYmVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCB9KSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIHVua25vd25bXSkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb25vdXIgYW4gdW5zdWJzY3JpYmUgZnJvbSB0aGUgbGluayBpbiBhIHJlcG9ydCBlbWFpbC5cbiAgICpcbiAgICogTG9va2VkIHVwIGJ5IFRPS0VOIGFjcm9zcyBvcmdzLCBhcyBzeXNhZG1pbiwgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgc2hhcmUtbGlua1xuICAgKiByZXNvbHZlIGlzOiB0aGUgcGVyc29uIGNsaWNraW5nIGhhcyBubyBhY2NvdW50IGFuZCBubyB0ZW5hbnQsIGFuZCB0aGUgdG9rZW4gaXMgdGhlXG4gICAqIG9ubHkgdGhpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSByb3cuIEl0IGlzIHRoZSBuYXJyb3dlc3QgcG9zc2libGUgc2hhcGUg4oCUIG9uZSBpbmRleGVkXG4gICAqIGxvb2t1cCwgb25lIGNvbHVtbiB3cml0dGVuLCBub3RoaW5nIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgYnV0IHdoZXRoZXIgYSByb3dcbiAgICogbWF0Y2hlZC5cbiAgICpcbiAgICogSWRlbXBvdGVudC4gQSBtYWlsIGNsaWVudCB0aGF0IHNlbmRzIHRoZSBvbmUtY2xpY2sgUE9TVCB0d2ljZSwgb3IgYSBtYW5hZ2VyIHdob1xuICAgKiBjbGlja3MgYWdhaW4gbW9udGhzIGxhdGVyLCBnZXRzIHRoZSBzYW1lIGFuc3dlciByYXRoZXIgdGhhbiBhbiBlcnJvciBwYWdlIOKAlCB0aGVcbiAgICogc2Vjb25kIGNhbGwgZmluZHMgdGhlIHJvdyBhbHJlYWR5IHVuc3Vic2NyaWJlZCBhbmQgcmVwb3J0cyBzdWNjZXNzLCBiZWNhdXNlIGZyb20gdGhlXG4gICAqIGNsaWNrZXIncyBwb2ludCBvZiB2aWV3IGl0IGlzLlxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmVCeVRva2VuKHRva2VuOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPFVuc3Vic2NyaWJlUmVzdWx0PiB7XG4gICAgaWYgKHRva2VuLmxlbmd0aCA8IDE2KSByZXR1cm4geyBtYXRjaGVkOiBmYWxzZSB9O1xuICAgIHJldHVybiBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAgIC5zZXQoeyB1bnN1YnNjcmliZWRBdDogc3FsYENPQUxFU0NFKCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC51bnN1YnNjcmliZWRBdH0sICR7bm93fSlgIH0pXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50LnVuc3Vic2NyaWJlVG9rZW4sIHRva2VuKSlcbiAgICAgICAgLnJldHVybmluZyh7XG4gICAgICAgICAgaWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQsXG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsXG4gICAgICAgICAgZW1haWw6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwsXG4gICAgICAgICAgdW5zdWJzY3JpYmVkQXQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudW5zdWJzY3JpYmVkQXQsXG4gICAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHJvdyA9IChyb3dzIGFzIEFycmF5PHsgaWQ6IHN0cmluZzsgb3JnSWQ6IHN0cmluZzsgZW1haWw6IHN0cmluZzsgdW5zdWJzY3JpYmVkQXQ6IERhdGUgfCBudWxsIH0+KVswXTtcbiAgICAgIGlmICghcm93KSByZXR1cm4geyBtYXRjaGVkOiBmYWxzZSB9O1xuICAgICAgLy8gQ09BTEVTQ0Uga2VwdCBhbiBlYXJsaWVyIGluc3RhbnQg4oeSIHRoaXMgY2xpY2sgY2hhbmdlZCBub3RoaW5nLiBPbmx5IHRoZVxuICAgICAgLy8gRklSU1QgdW5zdWJzY3JpYmUgaXMgYSBzdGF0ZSBjaGFuZ2Ugd29ydGggcmVjb3JkaW5nLCB3aGljaCBpcyBhbHNvIHdoYXRcbiAgICAgIC8vIGtlZXBzIGFuIGV4dGVybmFsbHktdHJpZ2dlcmVkIHJvdXRlIGZyb20gd3JpdGluZyB1bmJvdW5kZWQgYXVkaXQgcm93cy5cbiAgICAgIGNvbnN0IG5ld2x5ID0gcm93LnVuc3Vic2NyaWJlZEF0ICE9PSBudWxsICYmIG5ldyBEYXRlKHJvdy51bnN1YnNjcmliZWRBdCkuZ2V0VGltZSgpID09PSBub3cuZ2V0VGltZSgpO1xuICAgICAgcmV0dXJuIHsgbWF0Y2hlZDogdHJ1ZSwgcmVjaXBpZW50OiB7IGlkOiByb3cuaWQsIG9yZ0lkOiByb3cub3JnSWQsIGVtYWlsOiByb3cuZW1haWwgfSwgbmV3bHlVbnN1YnNjcmliZWQ6IG5ld2x5IH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVjb3JkIGEgZGVsaXZlcnkgYm91bmNlLiBBdCB7QGxpbmsgTUFYX0JPVU5DRVN9IHRoZSBhZGRyZXNzIGlzIHNraXBwZWQuICovXG4gIGFzeW5jIHJlY29yZEJvdW5jZShvcmdJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAuc2V0KHsgYm91bmNlQ291bnQ6IHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuYm91bmNlQ291bnR9ICsgMWAsIGxhc3RCb3VuY2VBdDogbm93IH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZW1haWwsIGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKHsgYm91bmNlQ291bnQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuYm91bmNlQ291bnQgfSkpO1xuICAgIHJldHVybiAocm93cyBhcyBBcnJheTx7IGJvdW5jZUNvdW50OiBudW1iZXIgfT4pWzBdPy5ib3VuY2VDb3VudCA/PyAwO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlUmVjaXBpZW50KG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRlbGV0ZWRCeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAuc2V0KHsgZGVsZXRlZEF0OiBub3csIGRlbGV0ZWRCeSwgLi4ucHVyZ2VTdGFtcChub3cpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQgfSkpO1xuICAgIGlmICgocm93cyBhcyB1bmtub3duW10pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlY2lwaWVudCBub3QgZm91bmQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXMgdGhpcyBhZGRyZXNzIGRlbGl2ZXJhYmxlIHJpZ2h0IG5vdz8gVGhlIHNpbmdsZSBwbGFjZSB0aGUgZGVsaXZlcnkgcnVsZXNcbiAgICogbGl2ZSwgc28gdGhlIHNjaGVkdWxlciBhbmQgdGhlIFVJIGFncmVlIGFib3V0IHdoeSBhIHJlY2lwaWVudCBpcyBiZWluZ1xuICAgKiBza2lwcGVkLlxuICAgKi9cbiAgZGVsaXZlcmFiaWxpdHkocmVjaXBpZW50OiBSZXBvcnRSZWNpcGllbnQpOiB7IGRlbGl2ZXJhYmxlOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgaWYgKHJlY2lwaWVudC5kZWxldGVkQXQpIHJldHVybiB7IGRlbGl2ZXJhYmxlOiBmYWxzZSwgcmVhc29uOiAncmVtb3ZlZCcgfTtcbiAgICBpZiAocmVjaXBpZW50LnVuc3Vic2NyaWJlZEF0KSByZXR1cm4geyBkZWxpdmVyYWJsZTogZmFsc2UsIHJlYXNvbjogJ3Vuc3Vic2NyaWJlZCcgfTtcbiAgICBpZiAoIXJlY2lwaWVudC52ZXJpZmllZEF0KSByZXR1cm4geyBkZWxpdmVyYWJsZTogZmFsc2UsIHJlYXNvbjogJ3BlbmRpbmdfdmVyaWZpY2F0aW9uJyB9O1xuICAgIGlmIChyZWNpcGllbnQuYm91bmNlQ291bnQgPj0gTUFYX0JPVU5DRVMpIHJldHVybiB7IGRlbGl2ZXJhYmxlOiBmYWxzZSwgcmVhc29uOiAnYm91bmNpbmcnIH07XG4gICAgcmV0dXJuIHsgZGVsaXZlcmFibGU6IHRydWUgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWNpcGllbnQgcG9saWN5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUaGUgb3JnJ3MgYWRtaW4tb3duZWQgcmVwb3J0IHBvbGljeS4gUmVhZCB0aHJvdWdoIHRoZSByZXBvcnRpbmcgc2V0dGluZ3Mgcm93LFxuICAgKiB3aGljaCBtYXkgbm90IGV4aXN0IOKAlCBhbiBvcmcgdGhhdCBoYXMgbmV2ZXIgY29uZmlndXJlZCBhbnl0aGluZyBnZXRzIHRoZVxuICAgKiBjbG9zZWQgZGVmYXVsdHMgKG5vIGV4dGVybmFsIHNoYXJpbmcsIG5vIGV4dGVybmFsIGRvbWFpbnMsIGFwcHJvdmFsIHJlcXVpcmVkKS5cbiAgICovXG4gIGFzeW5jIGdldFJlcG9ydFBvbGljeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgZXh0ZXJuYWxTaGFyaW5nOiBib29sZWFuO1xuICAgIHJlY2lwaWVudERvbWFpbnM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZXF1aXJlQXBwcm92YWw6IGJvb2xlYW47XG4gICAgZGVmYXVsdFRpbWV6b25lOiBzdHJpbmcgfCBudWxsO1xuICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHN0cmluZyB8IG51bGw7XG4gIH0+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHtcbiAgICAgIGV4dGVybmFsU2hhcmluZzogc2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnRFeHRlcm5hbFNoYXJpbmcsXG4gICAgICByZWNpcGllbnREb21haW5zOiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydFJlY2lwaWVudERvbWFpbnMsXG4gICAgICByZXF1aXJlQXBwcm92YWw6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0UmVxdWlyZUFwcHJvdmFsLFxuICAgICAgZGVmYXVsdFRpbWV6b25lOiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydERlZmF1bHRUaW1lem9uZSxcbiAgICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0RGVmYXVsdFdlZWtTdGFydCxcbiAgICB9KS5mcm9tKHNjaGVtYS5kb3JhU2V0dGluZ3MpLndoZXJlKGVxKHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsIG9yZ0lkKSkubGltaXQoMSkpO1xuICAgIGNvbnN0IHJvdyA9IChyb3dzIGFzIEFycmF5PHtcbiAgICAgIGV4dGVybmFsU2hhcmluZzogYm9vbGVhbjtcbiAgICAgIHJlY2lwaWVudERvbWFpbnM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgIGRlZmF1bHRUaW1lem9uZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGRlZmF1bHRXZWVrU3RhcnQ6IHN0cmluZyB8IG51bGw7XG4gICAgfT4pWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBleHRlcm5hbFNoYXJpbmc6IHJvdz8uZXh0ZXJuYWxTaGFyaW5nID8/IGZhbHNlLFxuICAgICAgcmVjaXBpZW50RG9tYWluczogcm93Py5yZWNpcGllbnREb21haW5zID8/IG51bGwsXG4gICAgICByZXF1aXJlQXBwcm92YWw6IHJvdz8ucmVxdWlyZUFwcHJvdmFsID8/IHRydWUsXG4gICAgICAvLyBOVUxMIHJhdGhlciB0aGFuIGEgZ3Vlc3NlZCB6b25lOiB0aGUgY3JlYXRlIGZvcm0gZmFsbHMgYmFjayB0byB0aGUgQlJPV1NFUidzIHpvbmUsXG4gICAgICAvLyB3aGljaCBpcyBhIGJldHRlciBkZWZhdWx0IHRoYW4gdGhlIHNlcnZlcidzIGFuZCBpcyB2aXNpYmx5IHRoZSBsZWFkJ3Mgb3duLlxuICAgICAgZGVmYXVsdFRpbWV6b25lOiByb3c/LmRlZmF1bHRUaW1lem9uZSA/PyBudWxsLFxuICAgICAgZGVmYXVsdFdlZWtTdGFydDogcm93Py5kZWZhdWx0V2Vla1N0YXJ0ID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNldFJlcG9ydFBvbGljeShvcmdJZDogc3RyaW5nLCBwYXRjaDoge1xuICAgIGV4dGVybmFsU2hhcmluZz86IGJvb2xlYW47XG4gICAgcmVjaXBpZW50RG9tYWlucz86IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuO1xuICAgIGRlZmF1bHRUaW1lem9uZT86IHN0cmluZyB8IG51bGw7XG4gICAgZGVmYXVsdFdlZWtTdGFydD86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBpZiAocGF0Y2guZXh0ZXJuYWxTaGFyaW5nICE9PSB1bmRlZmluZWQpIHNldC5yZXBvcnRFeHRlcm5hbFNoYXJpbmcgPSBwYXRjaC5leHRlcm5hbFNoYXJpbmc7XG4gICAgaWYgKHBhdGNoLnJlY2lwaWVudERvbWFpbnMgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydFJlY2lwaWVudERvbWFpbnMgPSBwYXRjaC5yZWNpcGllbnREb21haW5zO1xuICAgIGlmIChwYXRjaC5yZXF1aXJlQXBwcm92YWwgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydFJlcXVpcmVBcHByb3ZhbCA9IHBhdGNoLnJlcXVpcmVBcHByb3ZhbDtcbiAgICBpZiAocGF0Y2guZGVmYXVsdFRpbWV6b25lICE9PSB1bmRlZmluZWQpIHNldC5yZXBvcnREZWZhdWx0VGltZXpvbmUgPSBwYXRjaC5kZWZhdWx0VGltZXpvbmU7XG4gICAgaWYgKHBhdGNoLmRlZmF1bHRXZWVrU3RhcnQgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydERlZmF1bHRXZWVrU3RhcnQgPSBwYXRjaC5kZWZhdWx0V2Vla1N0YXJ0O1xuICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKS52YWx1ZXMoe1xuICAgICAgb3JnSWQsXG4gICAgICByZXBvcnRFeHRlcm5hbFNoYXJpbmc6IHBhdGNoLmV4dGVybmFsU2hhcmluZyA/PyBmYWxzZSxcbiAgICAgIHJlcG9ydFJlY2lwaWVudERvbWFpbnM6IHBhdGNoLnJlY2lwaWVudERvbWFpbnMgPz8gbnVsbCxcbiAgICAgIHJlcG9ydFJlcXVpcmVBcHByb3ZhbDogcGF0Y2gucmVxdWlyZUFwcHJvdmFsID8/IHRydWUsXG4gICAgICByZXBvcnREZWZhdWx0VGltZXpvbmU6IHBhdGNoLmRlZmF1bHRUaW1lem9uZSA/PyBudWxsLFxuICAgICAgcmVwb3J0RGVmYXVsdFdlZWtTdGFydDogcGF0Y2guZGVmYXVsdFdlZWtTdGFydCA/PyBudWxsLFxuICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7IHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgc2V0IH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIFN0YWtlaG9sZGVyIFJlcG9ydHMgZW50aXRsZW1lbnQgY2hhbmdlIGZyb20gYmlsbGluZzogcGF1c2UgZXZlcnl0aGluZywgb3JcbiAgICogcmVzdW1lIHdoYXQgdGhlIGxhcHNlIHBhdXNlZC5cbiAgICpcbiAgICogVEhFIFdBVEVSTUFSSyBBTkQgVEhFIFdPUksgQVJFIE9ORSBUUkFOU0FDVElPTiwgYW5kIHRoZSB3YXRlcm1hcmsgdXBkYXRlIGlzIHdoYXRcbiAgICogc2VyaWFsaXplcyBjb25jdXJyZW50IHB1c2hlcy4gQmlsbGluZydzIGxlZ3MgYXJlIGJlc3QtZWZmb3J0IGFuZCByZXRyaWVkLCBzb1xuICAgKiBcImxhcHNlZCBhdCAxMDowMFwiIGFuZCBcInJlbmV3ZWQgYXQgMTA6MDVcIiBjYW4gYXJyaXZlIGluIGVpdGhlciBvcmRlcjsgYXBwbHlpbmcgdGhlXG4gICAqIG9sZGVyIG9uZSBsYXN0IHdvdWxkIGxlYXZlIGEgbGFwc2VkIGFjY291bnQgcHJvZHVjaW5nIHJlcG9ydHMsIG9yIGEgcGF5aW5nIG9uZVxuICAgKiBwYXVzZWQuIFRoZSBjb25kaXRpb25hbCB1cGRhdGUgdGFrZXMgYSByb3cgbG9jayBvbiBgZG9yYV9zZXR0aW5nc2AsIHNvIGEgc2Vjb25kXG4gICAqIHB1c2ggd2FpdHMgYW5kIHRoZW4gc2VlcyB0aGUgbmV3ZXIgd2F0ZXJtYXJrIOKAlCBubyBhZHZpc29yeSBsb2NrIG5lZWRlZC5cbiAgICpcbiAgICogUkVTVU1FIElTIFNDT1BFRCBUTyBgZW50aXRsZW1lbnRgLiBJdCBtdXN0IG5vdCB1bi1wYXVzZSBhIGRlZmluaXRpb24gd2hvc2UgT1dORVIgd2FzXG4gICAqIGRlYWN0aXZhdGVkIG9yIHdobyBsb3N0IHRoZSBwZXJtaXNzaW9uOiB0aG9zZSBhcmUgZGlmZmVyZW50IHByb2JsZW1zIHdpdGggZGlmZmVyZW50XG4gICAqIGZpeGVzLCBhbmQgcmVzdW1pbmcgb25lIGJ5IGZpeGluZyB0aGUgb3RoZXIgaXMgaG93IGEgcmVwb3J0IHN0YXJ0cyBydW5uaW5nIHVuZGVyXG4gICAqIHNvbWVib2R5IHdobyBsZWZ0LlxuICAgKlxuICAgKiBgbmV4dFJ1bkZvcmAgaXMgYSBjYWxsYmFjayBiZWNhdXNlIHRoZSBwZXJpb2QgYXJpdGhtZXRpYyBuZWVkcyBlYWNoIGRlZmluaXRpb24nc1xuICAgKiBjYWRlbmNlLCB0aW1lem9uZSBhbmQgd2VlayBzdGFydCwgYW5kIHRoYXQgYmVsb25ncyB3aXRoIHRoZSBwZXJpb2QgcmVzb2x2ZXIgcmF0aGVyXG4gICAqIHRoYW4gdGhlIHN0b3JlIOKAlCB3aGlsZSB0aGUgd3JpdGUgc3RpbGwgaGFzIHRvIGhhcHBlbiBpbnNpZGUgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhpcyBsZWcgbWFrZXMgdGhlIGNoYW5nZSBJTU1FRElBVEU7IGl0IGlzIG5vdCB3aGF0IG1ha2VzIGl0IHNhZmUuIEV2ZXJ5IHNjaGVkdWxlZFxuICAgKiBydW4gcmUtY2hlY2tzIHRoZSBlbnRpdGxlbWVudCBhZ2FpbnN0IHBsYXRmb3JtIGFueXdheSwgc28gYSBsb3N0IHB1c2ggZGVsYXlzXG4gICAqIGVuZm9yY2VtZW50IHRvIHRoZSBuZXh0IHJ1biByYXRoZXIgdGhhbiBkZWZlYXRpbmcgaXQuXG4gICAqL1xuICBhc3luYyBzeW5jUmVwb3J0RW50aXRsZW1lbnQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBlbnRpdGxlZDogYm9vbGVhbixcbiAgICBvcHRzOiB7IG9jY3VycmVkQXQ/OiBEYXRlOyBuZXh0UnVuRm9yPzogKGQ6IFJlcG9ydERlZmluaXRpb24pID0+IERhdGU7IG5vdz86IERhdGUgfSA9IHt9LFxuICApOiBQcm9taXNlPHsgc2tpcHBlZDogYm9vbGVhbjsgcGF1c2VkOiBSZXBvcnREZWZpbml0aW9uW107IHJlc3VtZWQ6IFJlcG9ydERlZmluaXRpb25bXSB9PiB7XG4gICAgY29uc3Qgbm93ID0gb3B0cy5ub3cgPz8gbmV3IERhdGUoKTtcbiAgICBjb25zdCBvY2N1cnJlZEF0ID0gb3B0cy5vY2N1cnJlZEF0ID8/IG5vdztcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gVGhlIGNsYWltLiBBIHB1c2ggYXQgb3IgYmVmb3JlIHRoZSBsYXN0IGFwcGxpZWQgY2hhbmdlIHVwZGF0ZXMgemVybyByb3dzLlxuICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKVxuICAgICAgICAudmFsdWVzKHsgb3JnSWQsIHJlcG9ydEVudGl0bGVtZW50U3luY2VkQXQ6IG9jY3VycmVkQXQgfSlcbiAgICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgICAgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLFxuICAgICAgICAgIHNldDogeyByZXBvcnRFbnRpdGxlbWVudFN5bmNlZEF0OiBvY2N1cnJlZEF0LCB1cGRhdGVkQXQ6IG5vdyB9LFxuICAgICAgICAgIHNldFdoZXJlOiBzcWxgJHtzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydEVudGl0bGVtZW50U3luY2VkQXR9IElTIE5VTExcbiAgICAgICAgICAgIE9SICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnRFbnRpdGxlbWVudFN5bmNlZEF0fSA8ICR7b2NjdXJyZWRBdH1gLFxuICAgICAgICB9KVxuICAgICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQgfSk7XG4gICAgICBpZiAoKGNsYWltZWQgYXMgdW5rbm93bltdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHsgc2tpcHBlZDogdHJ1ZSwgcGF1c2VkOiBbXSwgcmVzdW1lZDogW10gfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRpdGxlZCkge1xuICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAgIC5zZXQoeyBpc0FjdGl2ZTogZmFsc2UsIHBhdXNlZFJlYXNvbjogJ2VudGl0bGVtZW50JywgbmV4dFJ1bkF0OiBudWxsLCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICAgICAgKSlcbiAgICAgICAgICAucmV0dXJuaW5nKCk7XG4gICAgICAgIHJldHVybiB7IHNraXBwZWQ6IGZhbHNlLCBwYXVzZWQ6IHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdLCByZXN1bWVkOiBbXSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXVzZWQgPSBhd2FpdCB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5wYXVzZWRSZWFzb24sICdlbnRpdGxlbWVudCcpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgICApKSBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gICAgICBjb25zdCByZXN1bWVkOiBSZXBvcnREZWZpbml0aW9uW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiBwYXVzZWQpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgICAgICAuc2V0KHtcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgcGF1c2VkUmVhc29uOiBudWxsLFxuICAgICAgICAgICAgbmV4dFJ1bkF0OiBvcHRzLm5leHRSdW5Gb3IgPyBvcHRzLm5leHRSdW5Gb3IoZGVmaW5pdGlvbikgOiBudWxsLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2hlcmUoZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGRlZmluaXRpb24uaWQpKVxuICAgICAgICAgIC5yZXR1cm5pbmcoKTtcbiAgICAgICAgY29uc3Qgcm93ID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICAgICAgaWYgKHJvdykgcmVzdW1lZC5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBza2lwcGVkOiBmYWxzZSwgcGF1c2VkOiBbXSwgcmVzdW1lZCB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBmcmVlIHByZXZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENsYWltIHRoZSBvcmcncyBPTkUgZnJlZSBwcmV2aWV3LCBvciByZXBvcnQgdGhhdCBpdCBpcyBhbHJlYWR5IHNwZW50LlxuICAgKlxuICAgKiBBIENPTkRJVElPTkFMIGluc2VydC1vci11cGRhdGUsIG5vdCByZWFkLXRoZW4td3JpdGU6IHR3byB0YWJzIGNsaWNraW5nIFwic2VlIGEgc2FtcGxlXCJcbiAgICogYXQgdGhlIHNhbWUgbW9tZW50IG11c3QgcHJvZHVjZSBvbmUgcHJldmlldywgYW5kIGEgY2hlY2sgZm9sbG93ZWQgYnkgYSBzZXBhcmF0ZSB3cml0ZVxuICAgKiBoYXMgYSB3aW5kb3cgYmV0d2VlbiB0aGVtIHdpZGUgZW5vdWdoIGZvciBib3RoIHRvIHBhc3MuIGBXSEVSRSByZXBvcnRfcHJldmlld191c2VkX2F0XG4gICAqIElTIE5VTExgIG9uIHRoZSB1cGRhdGUsIGFuZCBgb25Db25mbGljdERvVXBkYXRlYCBmb3IgdGhlIHJvdyB0aGF0IG1heSBub3QgZXhpc3QgeWV0LFxuICAgKiBtYWtlIHRoZSBjbGFpbSBpdHNlbGYgdGhlIGd1YXJkLlxuICAgKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgVEhJUyBjYWxsZXIgd29uIGl0LiBBIGxvc2VyIGlzIHRvbGQgdGhlIHByZXZpZXcgaXMgc3BlbnQsIHdoaWNoIGlzXG4gICAqIHRoZSB0cnV0aCBhbmQgaXMgYWxzbyB0aGUgdXBzZWxsLlxuICAgKi9cbiAgYXN5bmMgY2xhaW1SZXBvcnRQcmV2aWV3KG9yZ0lkOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAudmFsdWVzKHsgb3JnSWQsIHJlcG9ydFByZXZpZXdVc2VkQXQ6IG5vdyB9KVxuICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCxcbiAgICAgICAgc2V0OiB7IHJlcG9ydFByZXZpZXdVc2VkQXQ6IG5vdywgdXBkYXRlZEF0OiBub3cgfSxcbiAgICAgICAgLy8gVGhlIHByZWRpY2F0ZSBpcyB3aGF0IG1ha2VzIHRoaXMgb25jZS1ldmVyOiBhbiBvcmcgd2hvc2Ugcm93IGFscmVhZHkgY2FycmllcyBhXG4gICAgICAgIC8vIHRpbWVzdGFtcCB1cGRhdGVzIHplcm8gcm93cyBhbmQgcmV0dXJucyBub3RoaW5nLlxuICAgICAgICBzZXRXaGVyZTogaXNOdWxsKHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0UHJldmlld1VzZWRBdCksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZyh7IG9yZ0lkOiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkIH0pKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG9yZyBoYXMgYWxyZWFkeSBzcGVudCBpdHMgZnJlZSBwcmV2aWV3LiAqL1xuICBhc3luYyByZXBvcnRQcmV2aWV3VXNlZChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IGF0OiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydFByZXZpZXdVc2VkQXQgfSlcbiAgICAgIC5mcm9tKHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAud2hlcmUoZXEoc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgb3JnSWQpKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgQXJyYXk8eyBhdDogRGF0ZSB8IG51bGwgfT4pWzBdPy5hdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGBlbWFpbGAgYWRtaXNzaWJsZSBhcyBhIHJlY2lwaWVudCBmb3IgdGhpcyBvcmcsIGFuZCBkb2VzIGl0IG5lZWQgYW5cbiAgICogYWRtaW4ncyBhcHByb3ZhbCBmaXJzdD9cbiAgICpcbiAgICogYG9yZ01lbWJlckVtYWlsc2AgaXMgdGhlIHNldCBvZiBhZGRyZXNzZXMgdGhhdCBhbHJlYWR5IGF1dGhlbnRpY2F0ZSB0byB0aGlzXG4gICAqIG9yZyDigJQgdGhleSBhcmUgYWx3YXlzIGFkbWlzc2libGUgYW5kIG5ldmVyIG5lZWQgdmVyaWZpY2F0aW9uLCBiZWNhdXNlIHRoZSBvcmdcbiAgICogaGFzIGFscmVhZHkgZXN0YWJsaXNoZWQgdGhleSBiZWxvbmcgdG8gaXQuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBtZWFzdXJlZCBhZ2FpbnN0XG4gICAqIHRoZSBhbGxvd2VkLWRvbWFpbiBsaXN0LCBhbmQgYSBOVUxMIGxpc3QgbWVhbnMgXCJubyBleHRlcm5hbCBhZGRyZXNzZXMgYXQgYWxsXCIsXG4gICAqIG5vdCBcImFueSBhZGRyZXNzXCI6IHRoZSBjbG9zZWQgcmVhZGluZyBpcyB0aGUgb25lIHRoYXQgY2Fubm90IGxlYWsgYSByZXBvcnQgYnlcbiAgICogYW4gYWRtaW4gZm9yZ2V0dGluZyB0byBjb25maWd1cmUgc29tZXRoaW5nLlxuICAgKi9cbiAgYWRtaXRSZWNpcGllbnQoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBwb2xpY3k6IHsgcmVjaXBpZW50RG9tYWluczogc3RyaW5nW10gfCBudWxsOyByZXF1aXJlQXBwcm92YWw6IGJvb2xlYW4gfSxcbiAgICBvcmdNZW1iZXJFbWFpbHM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gICk6IHsgYWRtaXR0ZWQ6IHRydWU7IG1lbWJlcjogYm9vbGVhbjsgbmVlZHNBcHByb3ZhbDogYm9vbGVhbiB9IHwgeyBhZG1pdHRlZDogZmFsc2U7IHJlYXNvbjogc3RyaW5nIH0ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JnTWVtYmVyRW1haWxzLmhhcyhub3JtYWxpemVkKSkgcmV0dXJuIHsgYWRtaXR0ZWQ6IHRydWUsIG1lbWJlcjogdHJ1ZSwgbmVlZHNBcHByb3ZhbDogZmFsc2UgfTtcblxuICAgIGNvbnN0IGF0ID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZignQCcpO1xuICAgIGNvbnN0IGRvbWFpbiA9IGF0ID49IDAgPyBub3JtYWxpemVkLnNsaWNlKGF0ICsgMSkgOiAnJztcbiAgICBpZiAoIWRvbWFpbikgcmV0dXJuIHsgYWRtaXR0ZWQ6IGZhbHNlLCByZWFzb246ICdOb3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLicgfTtcblxuICAgIGNvbnN0IGFsbG93ZWQgPSBwb2xpY3kucmVjaXBpZW50RG9tYWlucztcbiAgICBpZiAoIWFsbG93ZWQgfHwgYWxsb3dlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkbWl0dGVkOiBmYWxzZSxcbiAgICAgICAgcmVhc29uOiAnVGhpcyBvcmdhbml6YXRpb24gb25seSBkZWxpdmVycyByZXBvcnRzIHRvIGl0cyBvd24gbWVtYmVycy4gJ1xuICAgICAgICAgICsgJ0FuIGFkbWluaXN0cmF0b3IgY2FuIGFsbG93IHNwZWNpZmljIGV4dGVybmFsIGRvbWFpbnMgaW4gcmVwb3J0aW5nIHNldHRpbmdzLicsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvayA9IGFsbG93ZWQuc29tZSgoZCkgPT4ge1xuICAgICAgY29uc3QgY2xlYW4gPSBkLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15ALywgJycpO1xuICAgICAgcmV0dXJuIGNsZWFuLmxlbmd0aCA+IDAgJiYgKGRvbWFpbiA9PT0gY2xlYW4gfHwgZG9tYWluLmVuZHNXaXRoKGAuJHtjbGVhbn1gKSk7XG4gICAgfSk7XG4gICAgaWYgKCFvaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICByZWFzb246IGBSZXBvcnRzIGNhbiBvbmx5IGJlIHNlbnQgdG8gJHthbGxvd2VkLmpvaW4oJywgJyl9IGFkZHJlc3NlcyBpbiB0aGlzIG9yZ2FuaXphdGlvbi5gLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWRtaXR0ZWQ6IHRydWUsIG1lbWJlcjogZmFsc2UsIG5lZWRzQXBwcm92YWw6IHBvbGljeS5yZXF1aXJlQXBwcm92YWwgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXRlbnRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhhcmQtZGVsZXRlIGV4cGlyZWQgdG9tYnN0b25lcyBhY3Jvc3MgZXZlcnkgb3JnLCBmb3IgdGhlIHNoYXJlZCBzb2Z0LWRlbGV0ZVxuICAgKiBzd2VlcC4gUnVucyBpbnNpZGUgdGhlIHN3ZWVwJ3Mgb3duIHN5c2FkbWluIHNjb3BlLlxuICAgKlxuICAgKiBSdW5zIGdvIGZpcnN0OiBhIHB1cmdlZCBkZWZpbml0aW9uIHdpdGggb3JwaGFuZWQgcnVucyB3b3VsZCBsZWF2ZSBzbmFwc2hvdHNcbiAgICogbm90aGluZyBjYW4gcmVhY2gsIGFuZCBzaGFyZSBsaW5rcyBhcmUgZGVsZXRlZCB3aXRoIHRoZWlyIHJ1bnMgc28gYSBwdXJnZVxuICAgKiBjYW5ub3QgbGVhdmUgYSBsaXZlIHRva2VuIHBvaW50aW5nIGF0IGEgcm93IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICovXG4gIHB1cmdlYWJsZUVudGl0aWVzKCk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbmFtZTogJ3JlcG9ydF9ydW4nLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlUnVucyhub3csIGxpbWl0KSB9LFxuICAgICAgeyBuYW1lOiAncmVwb3J0X2RlZmluaXRpb24nLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlRGVmaW5pdGlvbnMobm93LCBsaW1pdCkgfSxcbiAgICAgIHsgbmFtZTogJ3JlcG9ydF9yZWNpcGllbnQnLCBwdXJnZUV4cGlyZWQ6IChub3csIGxpbWl0KSA9PiB0aGlzLnB1cmdlUmVjaXBpZW50cyhub3csIGxpbWl0KSB9LFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlUnVucyhub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgZHVlID0gYXdhaXQgdHguc2VsZWN0KHsgaWQ6IHNjaGVtYS5yZXBvcnRSdW4uaWQgfSkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgICAud2hlcmUoYW5kKHNxbGAke3NjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsIGx0ZShzY2hlbWEucmVwb3J0UnVuLnB1cmdlQWZ0ZXIsIG5vdykpKVxuICAgICAgICAubGltaXQobGltaXQpO1xuICAgICAgY29uc3QgaWRzID0gKGR1ZSBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFNoYXJlTGluaykud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJ1bklkLCBpZHMpKTtcbiAgICAgIGNvbnN0IGdvbmUgPSBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFJ1bikud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0UnVuLmlkLCBpZHMpKVxuICAgICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnRSdW4uaWQgfSk7XG4gICAgICByZXR1cm4gKGdvbmUgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlRGVmaW5pdGlvbnMobm93OiBEYXRlLCBsaW1pdCA9IDUwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIGNvbnN0IGR1ZSA9IGF3YWl0IHR4LnNlbGVjdCh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIHNxbGAke3NjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdH0gSVMgTk9UIE5VTExgLFxuICAgICAgICAgIGx0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5wdXJnZUFmdGVyLCBub3cpLFxuICAgICAgICApKVxuICAgICAgICAubGltaXQobGltaXQpO1xuICAgICAgY29uc3QgaWRzID0gKGR1ZSBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAvLyBUaGUgZGVmaW5pdGlvbidzIHJ1bnMgKGFuZCB0aGVpciBsaW5rcykgZ28gd2l0aCBpdCwgdG9tYnN0b25lZCBvciBub3Q6XG4gICAgICAvLyBhIHNuYXBzaG90IHdob3NlIGRlZmluaXRpb24gaXMgZ29uZSBjYW4gbmV2ZXIgYmUgbGlzdGVkIGFnYWluLlxuICAgICAgY29uc3QgcnVucyA9IGF3YWl0IHR4LnNlbGVjdCh7IGlkOiBzY2hlbWEucmVwb3J0UnVuLmlkIH0pLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGlkcykpO1xuICAgICAgY29uc3QgcnVuSWRzID0gKHJ1bnMgYXMgQXJyYXk8eyBpZDogc3RyaW5nIH0+KS5tYXAoKHIpID0+IHIuaWQpO1xuICAgICAgaWYgKHJ1bklkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucnVuSWQsIHJ1bklkcykpO1xuICAgICAgICBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydFJ1bikud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0UnVuLmlkLCBydW5JZHMpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdvbmUgPSBhd2FpdCB0eC5kZWxldGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pLndoZXJlKGluQXJyYXkoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkcykpXG4gICAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQgfSk7XG4gICAgICByZXR1cm4gKGdvbmUgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1cmdlUmVjaXBpZW50cyhub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgZHVlID0gYXdhaXQgdHguc2VsZWN0KHsgaWQ6IHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQgfSkuZnJvbShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsXG4gICAgICAgICAgbHRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQucHVyZ2VBZnRlciwgbm93KSxcbiAgICAgICAgKSlcbiAgICAgICAgLmxpbWl0KGxpbWl0KTtcbiAgICAgIGNvbnN0IGlkcyA9IChkdWUgYXMgQXJyYXk8eyBpZDogc3RyaW5nIH0+KS5tYXAoKHIpID0+IHIuaWQpO1xuICAgICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgICAgY29uc3QgZ29uZSA9IGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0UmVjaXBpZW50KS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQsIGlkcykpXG4gICAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCB9KTtcbiAgICAgIHJldHVybiAoZ29uZSBhcyB1bmtub3duW10pLmxlbmd0aDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBkZWZpbml0aW9uIHRoZSBvd25lciBtdXN0IGJlIHJlLWNoZWNrZWQgZm9yLCBmb3IgdGhlIHBhdXNlIHN3ZWVwLiAqL1xuICBhc3luYyBsaXN0T3duZWREZWZpbml0aW9ucyhvcmdJZDogc3RyaW5nLCBvd25lcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3duZXJJZCwgb3duZXJJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgc2NoZWR1bGVyJ3MgcmVhZHMgYW5kIHdyaXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRGVmaW5pdGlvbnMgd2hvc2UgbmV4dCBydW4gaXMgZHVlLCBhY3Jvc3MgZXZlcnkgb3JnLlxuICAgKlxuICAgKiBSdW5zIGFzIFNZU0FETUlOLCBiZWNhdXNlIHRoZSBzY2hlZHVsZXIgaGFzIG5vIHRlbmFudDogaXQgaXMgbG9va2luZyBmb3Igd29ya1xuICAgKiBpbiBvcmdzIGl0IGhhcyBub3QgYmVlbiB0b2xkIGFib3V0LiBUaGlzIGlzIHRoZSBvbmUgcmVhZCBoZXJlIHRoYXQgY3Jvc3NlcyBvcmdcbiAgICogYm91bmRhcmllcywgYW5kIGl0IGlzIGtlcHQgdG8gdGhlIG5hcnJvd2VzdCBwb3NzaWJsZSBzaGFwZSDigJQgdGhlIHJvd3MgbmVlZGVkIHRvXG4gICAqIGNsYWltIGFuZCBleGVjdXRlLCBvcmRlcmVkIG9sZGVzdC1kdWUgZmlyc3Qgc28gYSBiYWNrbG9nIGRyYWlucyBpbiBvcmRlciByYXRoZXJcbiAgICogdGhhbiBzdGFydmluZyB3aGljaGV2ZXIgb3JnIHNvcnRzIGxhc3QgYnkgaWQuXG4gICAqXG4gICAqIGBsaW1pdGAgaXMgdGhlIHBlci1jeWNsZSBjZWlsaW5nOiBhIGN5Y2xlIHRoYXQgdHJpZWQgdG8gZHJhaW4gZXZlcnl0aGluZyB3b3VsZFxuICAgKiBob2xkIHRoZSBsZWFkZXIgbG9jayBmb3IgYXMgbG9uZyBhcyB0aGUgc2xvd2VzdCBvcmcncyBjb21wb3NlIHRha2VzLCB0aW1lcyB0aGVcbiAgICogbnVtYmVyIG9mIGRlZmluaXRpb25zLlxuICAgKi9cbiAgYXN5bmMgZHVlRGVmaW5pdGlvbnMobm93OiBEYXRlLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICByZXR1cm4gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgICAgIGx0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5uZXh0UnVuQXQsIG5vdyksXG4gICAgICAgICkpXG4gICAgICAgIC5vcmRlckJ5KGFzYyhzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5uZXh0UnVuQXQpKVxuICAgICAgICAubGltaXQobGltaXQpKTtcbiAgICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFpbSBhIGR1ZSBkZWZpbml0aW9uIGJ5IGFkdmFuY2luZyBpdHMgYG5leHRSdW5BdGAsIGJ1dCBvbmx5IGlmIGl0IHN0aWxsIGhvbGRzXG4gICAqIHRoZSB2YWx1ZSB0aGUgc2NhbiBzYXcuXG4gICAqXG4gICAqIFRIRSBDT05ESVRJT05BTCBVUERBVEUgSVMgVEhFIENPTkNVUlJFTkNZIEdVQVJELCBub3QgdGhlIGxlYWRlciBsb2NrLiBUaGUgbG9ja1xuICAgKiBzdG9wcyB0d28gcmVwbGljYXMgc3dlZXBpbmcgaW4gdGhlIHNhbWUgd2luZG93OyBpdCBkb2VzIG5vdCBzdG9wIGEgc3dlZXAgdGhhdFxuICAgKiBvdXRsaXZlcyBpdHMgbG9jayBUVEwgZnJvbSBvdmVybGFwcGluZyB0aGUgbmV4dCBsZWFkZXIncyBzd2VlcCwgYW5kIGJvdGggd291bGRcbiAgICogdGhlbiBzZWxlY3QgdGhlIHNhbWUgc3RpbGwtZHVlIGRlZmluaXRpb24uIFdpdGhvdXQgdGhlIGBuZXh0X3J1bl9hdCA9IDxzZWVuPmBcbiAgICogcHJlZGljYXRlIGVhY2ggd291bGQgYWR2YW5jZSB0aGUgc2NoZWR1bGUgYW5kIGVhY2ggd291bGQgY29tcG9zZSBhbmQgREVMSVZFUiBhXG4gICAqIHJlcG9ydCDigJQgdGhlIHNhbWUgbWFuYWdlciBnZXRzIHRoZSBzYW1lIHJlcG9ydCB0d2ljZSwgZnJvbSB0d28gcG9kcywgd2hpY2ggaXNcbiAgICogdGhlIGZhaWx1cmUgZXZlcnlvbmUgbm90aWNlcy5cbiAgICpcbiAgICogUnVucyBhcyBzeXNhZG1pbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBzY2FuLCBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZSBjbGFpbVxuICAgKiB3b24gc28gdGhlIGNhbGxlciBjYW4gc2ltcGx5IHNraXAgYSBsb3N0IHJhY2UuXG4gICAqL1xuICBhc3luYyBjbGFpbURlZmluaXRpb24oaWQ6IHN0cmluZywgc2Vlbk5leHRSdW5BdDogRGF0ZSwgbmV4dFJ1bkF0OiBEYXRlLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC5zZXQoeyBsYXN0UnVuQXQ6IG5vdywgbmV4dFJ1bkF0LCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ubmV4dFJ1bkF0LCBzZWVuTmV4dFJ1bkF0KSxcbiAgICAgICAgKSlcbiAgICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KSk7XG4gICAgICByZXR1cm4gKGNsYWltZWQgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCAob3IgY2xlYXIpIGEgZGVmaW5pdGlvbidzIGBuZXh0UnVuQXRgIHdpdGhvdXQgY2xhaW1pbmcgaXQuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBhIGRlZmluaXRpb24gaXMgY3JlYXRlZCwgcmVzdW1lZCwgb3IgaGFzIGl0cyBjYWRlbmNlL3RpbWV6b25lIGNoYW5nZWRcbiAgICog4oCUIHRoZSBzY2hlZHVsZSBoYXMgdG8gYmUgcmUtZGVyaXZlZCBmcm9tIHRoZSBjYWxlbmRhciByYXRoZXIgdGhhbiBsZWZ0IGF0XG4gICAqIHdoYXRldmVyIHRoZSBvbGQgY2FkZW5jZSBwcm9kdWNlZC5cbiAgICovXG4gIGFzeW5jIHNldE5leHRSdW4ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgbmV4dFJ1bkF0OiBEYXRlIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgIC5zZXQoeyBuZXh0UnVuQXQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgT05FIGRlZmluaXRpb24gd2l0aCB0aGUgcmVhc29uLCBmcm9tIHRoZSBzY2hlZHVsZXIuXG4gICAqXG4gICAqIFNlcGFyYXRlIGZyb20ge0BsaW5rIHBhdXNlRGVmaW5pdGlvbnNGb3JPd25lcn0gYmVjYXVzZSB0aGUgdHJpZ2dlciBpcyBkaWZmZXJlbnQ6XG4gICAqIHRoYXQgb25lIGlzIGEgbWVtYmVyc2hpcCBjaGFuZ2UgYWZmZWN0aW5nIGV2ZXJ5IGRlZmluaXRpb24gYSBwZXJzb24gb3ducywgdGhpc1xuICAgKiBvbmUgaXMgYSBwZXItcnVuIHJlY2hlY2sgdGhhdCBmYWlsZWQuIENsZWFycyBgbmV4dFJ1bkF0YCBzbyBhIHBhdXNlZCBkZWZpbml0aW9uXG4gICAqIHN0b3BzIGFwcGVhcmluZyBpbiB0aGUgZHVlIHNjYW4gYXQgYWxsLCByYXRoZXIgdGhhbiBiZWluZyByZS1jbGFpbWVkIGFuZFxuICAgKiByZS1yZWplY3RlZCBldmVyeSBjeWNsZS5cbiAgICpcbiAgICogUnVucyBhcyBzeXNhZG1pbjogdGhlIGNhbGxlciBpcyB0aGUgc2NoZWR1bGVyLCB3aGljaCBoYXMgbm8gdGVuYW50LCBhbmQgdGhlIGlkXG4gICAqIGNhbWUgZnJvbSBpdHMgb3duIGNyb3NzLW9yZyBzY2FuLlxuICAgKi9cbiAgYXN5bmMgcGF1c2VEZWZpbml0aW9uKGlkOiBzdHJpbmcsIHJlYXNvbjogUmVwb3J0UGF1c2VSZWFzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC5zZXQoeyBpc0FjdGl2ZTogZmFsc2UsIHBhdXNlZFJlYXNvbjogcmVhc29uLCBuZXh0UnVuQXQ6IG51bGwsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgICAud2hlcmUoYW5kKFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICAgICkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZGVmaW5pdGlvbiwgY2xlYXJpbmcgdGhlIHJlYXNvbiBhbmQgcmUtZGVyaXZpbmcgaXRzIHNjaGVkdWxlLlxuICAgKlxuICAgKiBgbmV4dFJ1bkF0YCBpcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHJhdGhlciB0aGFuIGNvbXB1dGVkIGhlcmU6IHRoZSBwZXJpb2RcbiAgICogYXJpdGhtZXRpYyBuZWVkcyB0aGUgZGVmaW5pdGlvbidzIHRpbWV6b25lIGFuZCB3ZWVrIHN0YXJ0LCBhbmQgdGhhdCBiZWxvbmdzIHdpdGhcbiAgICogdGhlIHBlcmlvZCByZXNvbHZlciwgbm90IHRoZSBzdG9yZS5cbiAgICovXG4gIGFzeW5jIHJlc3VtZURlZmluaXRpb24ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgbmV4dFJ1bkF0OiBEYXRlLCBhY3RvcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGlzQWN0aXZlOiB0cnVlLCBwYXVzZWRSZWFzb246IG51bGwsIG5leHRSdW5BdCwgdXBkYXRlZEJ5OiBhY3RvcklkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3Qgcm93ID0gKHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdKVswXTtcbiAgICBpZiAoIXJvdykgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBkZWZpbml0aW9uIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByb3c7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgZXZlcnkgQUNUSVZFIGRlZmluaXRpb24gaW4gYW4gb3JnLCB3aXRoIHRoZSByZWFzb24uXG4gICAqXG4gICAqIFRoZSBlbnRpdGxlbWVudCBsYXBzZSBsZWc6IGJpbGxpbmcgdGVsbHMgcmVwb3J0aW5nIHRoZSBhZGQtb24gaXMgZ29uZSwgYW5kIGV2ZXJ5XG4gICAqIGRlZmluaXRpb24gaW4gdGhlIGFjY291bnQgc3RvcHMuIFJldHVybnMgdGhlIHJvd3Mgc28gdGhlIGNhbGxlciBjYW4gbm90aWZ5LlxuICAgKi9cbiAgYXN5bmMgcGF1c2VEZWZpbml0aW9uc0Zvck9yZyhvcmdJZDogc3RyaW5nLCByZWFzb246IFJlcG9ydFBhdXNlUmVhc29uKTogUHJvbWlzZTxSZXBvcnREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IGlzQWN0aXZlOiBmYWxzZSwgcGF1c2VkUmVhc29uOiByZWFzb24sIG5leHRSdW5BdDogbnVsbCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGRlZmluaXRpb24gaW4gYW4gb3JnIHBhdXNlZCBmb3IgYHJlYXNvbmAsIGZvciB0aGUgcmVzdW1lIGxlZy5cbiAgICpcbiAgICogU2NvcGVkIHRvIHRoZSByZWFzb24gb24gcHVycG9zZTogcmUtc3Vic2NyaWJpbmcgbXVzdCBub3QgdW4tcGF1c2UgYSBkZWZpbml0aW9uXG4gICAqIHdob3NlIG93bmVyIHdhcyBkZWFjdGl2YXRlZC4gVGhvc2UgYXJlIGRpZmZlcmVudCBwcm9ibGVtcyB3aXRoIGRpZmZlcmVudCBmaXhlcyxcbiAgICogYW5kIHJlc3VtaW5nIG9uZSBieSBmaXhpbmcgdGhlIG90aGVyIGlzIGhvdyBhIHJlcG9ydCBzdGFydHMgcnVubmluZyB1bmRlciBhXG4gICAqIHBlcnNvbiB3aG8gbGVmdC5cbiAgICovXG4gIGFzeW5jIGRlZmluaXRpb25zUGF1c2VkRm9yKG9yZ0lkOiBzdHJpbmcsIHJlYXNvbjogUmVwb3J0UGF1c2VSZWFzb24pOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ucGF1c2VkUmVhc29uLCByZWFzb24pLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHN0YWtlaG9sZGVyUmVwb3J0U3RvcmUgPSBuZXcgU3Rha2Vob2xkZXJSZXBvcnRTdG9yZSgpO1xuIl19
992
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL3N0YWtlaG9sZGVyL3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckYsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBWTdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWU5RCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFDOUMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUMzQyxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMzRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQUU3Qix5RUFBeUU7QUFDekUsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVB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cEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBYSxFQUFFLE1BQXlCO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzthQUM5RSxLQUFLLENBQUMsR0FBRyxDQUNSLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUN4QyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFDM0MsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQ2hELE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ04sT0FBTyxJQUEwQixDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFBlcnNpc3RlbmNlIGZvciBzdGFrZWhvbGRlciByZXBvcnRzOiBkZWZpbml0aW9ucywgcnVucywgc2hhcmUgbGlua3MgYW5kXG4gKiByZWNpcGllbnRzLlxuICpcbiAqIEhhbmQtcm9sbGVkIHJhdGhlciB0aGFuIGZvdXIgYENydWRTZXJ2aWNlYCBzdWJjbGFzc2VzIGJlY2F1c2Ugbm9uZSBvZiB0aGVzZSBpc1xuICogYSBnZW5lcmljIGxpc3RhYmxlIGVudGl0eSB3aXRoIGFuIGBpc0RlZmF1bHRgIHNsb3QgYW5kIHByb2plY3Qtc2NvcGVkIGFjY2Vzc1xuICogY29udHJvbC4gV2hhdCB0aGV5IG5lZWQgaW5zdGVhZCBpcyBhIHNtYWxsIG51bWJlciBvZiBleGFjdCBvcGVyYXRpb25zIHdpdGhcbiAqIGludmFyaWFudHMgdGhlIGdlbmVyaWMgYmFzZSBjYW5ub3QgZXhwcmVzczpcbiAqXG4gKiAgLSBBIFJVTiBJUyBBUFBFTkQtT05MWSBvbmNlIHB1Ymxpc2hlZC4gUmVnZW5lcmF0aW5nIGEgcGVyaW9kIGluc2VydHMgdmVyc2lvblxuICogICAgTisxIGFuZCBwb2ludHMgdGhlIG9sZCByb3cgYXQgaXQgKGBzdXBlcnNlZGVkQnlgKTsgbm90aGluZyBvdmVyd3JpdGVzIGFcbiAqICAgIHNuYXBzaG90IGEgbWFuYWdlciBoYXMgYWxyZWFkeSByZWFkLlxuICogIC0gQSBTSEFSRSBMSU5LIElTIFJFU09MVkVEIFdJVEhPVVQgQSBURU5BTlQuIFRoZSByZWFkZXIgaGFzIG5vIGFjY291bnQsIHNvIHRoZVxuICogICAgbG9va3VwIGJ5IHRva2VuIGhhc2ggaXMgdGhlIG9uZSByZWFkIGhlcmUgdGhhdCBkZWxpYmVyYXRlbHkgcnVucyBhcyBzeXNhZG1pblxuICogICAg4oCUIHNlZSB7QGxpbmsgcmVzb2x2ZVNoYXJlTGlua30gZm9yIHdoeSB0aGF0IGlzIHRoZSBuYXJyb3dlc3Qgc2FmZSBzaGFwZS5cbiAqICAtIEEgUkVDSVBJRU5UIElTIFVQU0VSVEVELCBORVZFUiBSRS1DUkVBVEVELiBSZS1hZGRpbmcgYW4gYWRkcmVzcyBtdXN0IGtlZXAgaXRzXG4gKiAgICB2ZXJpZmljYXRpb24gYW5kIHVuc3Vic2NyaWJlIHN0YXRlLCBvciBhbiB1bnN1YnNjcmliZSBjb3VsZCBiZSB1bmRvbmUgYnlcbiAqICAgIGRlbGV0aW5nIGFuZCByZS1hZGRpbmcgdGhlIHJvdy5cbiAqXG4gKiBFdmVyeXRoaW5nIGVsc2UgcnVucyBpbnNpZGUgdGhlIGNhbGxlcidzIGFtYmllbnQgdGVuYW50IGNvbnRleHQgKGVzdGFibGlzaGVkIGJ5XG4gKiBgd2l0aFRlbmFudENvbnRleHQoKWAgYXQgdGhlIHJlcXVlc3QgYm91bmRhcnkpLCBzbyBSTFMgaXMgdGhlIHRlbmFuY3kgZ2F0ZSBhbmRcbiAqIGFuIGBvcmdJZGAgYXJndW1lbnQgaXMgYSByZWR1bmRhbnQgc2Vjb25kIGNoZWNrIHJhdGhlciB0aGFuIHRoZSBvbmx5IG9uZS5cbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlELCBjcmVhdGVIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IsIENvbmZsaWN0RXJyb3IsIEVycm9yQ29kZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgYXNjLCBkZXNjLCBlcSwgaW5BcnJheSwgaXNOdWxsLCBsdGUsIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uLy4uLy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgUmVwb3J0Q2FkZW5jZSxcbiAgUmVwb3J0RGVmaW5pdGlvbixcbiAgUmVwb3J0UGF1c2VSZWFzb24sXG4gIFJlcG9ydFJlY2lwaWVudCxcbiAgUmVwb3J0UnVuLFxuICBSZXBvcnRSdW5TdGF0dXMsXG4gIFJlcG9ydFNjb3BlLFxuICBSZXBvcnRTaGFyZUxpbmssXG4gIFJlcG9ydFRlbXBsYXRlLFxufSBmcm9tICcuLi8uLi8uLi9kYXRhYmFzZS9zY2hlbWEvcmVwb3J0aW5nLXN0YWtlaG9sZGVyLmpzJztcbmltcG9ydCB7IHJ1bldpdGhUZW5hbnRDb250ZXh0LCB3aXRoVGVuYW50VHggfSBmcm9tICcuLi8uLi8uLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcbmltcG9ydCB7IHNvZnREZWxldGVSZXRlbnRpb25NcyB9IGZyb20gJy4uLy4uL2NydWQtc2VydmljZS5qcyc7XG5cbi8qKiBIb3cgbG9uZyBhIGZyZXNobHkgbWludGVkIHNoYXJlIGxpbmsgbGl2ZXMgd2hlbiB0aGUgY2FsbGVyIG5hbWVzIG5vIHdpbmRvdy4gKi9cblxuLyoqXG4gKiBXaGF0IGFuIHVuc3Vic2NyaWJlIGNsaWNrIGRpZC4gYHJlY2lwaWVudGAgaXMgcmV0dXJuZWQgdG8gdGhlIFJPVVRFIChmb3IgaXRzXG4gKiBhdWRpdCByb3cpLCBuZXZlciB0byB0aGUgY2xpY2tlciwgd2hvIGlzIHRvbGQgXCJ1bnN1YnNjcmliZWRcIiBlaXRoZXIgd2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuc3Vic2NyaWJlUmVzdWx0IHtcbiAgbWF0Y2hlZDogYm9vbGVhbjtcbiAgcmVjaXBpZW50PzogeyBpZDogc3RyaW5nOyBvcmdJZDogc3RyaW5nOyBlbWFpbDogc3RyaW5nIH07XG4gIC8qKiBUcnVlIG9ubHkgZm9yIHRoZSBjbGljayB0aGF0IGFjdHVhbGx5IHNldCBgdW5zdWJzY3JpYmVkX2F0YC4gKi9cbiAgbmV3bHlVbnN1YnNjcmliZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TSEFSRV9MSU5LX1RUTF9EQVlTID0gMzA7XG4vKiogVGhlIGxvbmdlc3QgYSBzaGFyZSBsaW5rIG1heSBsaXZlLiBCZXlvbmQgdGhpcyBpdCBpcyBhIHBlcm1hbmVudCBVUkwuICovXG5leHBvcnQgY29uc3QgTUFYX1NIQVJFX0xJTktfVFRMX0RBWVMgPSAxODA7XG4vKiogQSByZWNpcGllbnQncyB2ZXJpZmljYXRpb24gbGluay4gU2hvcnQ6IGl0IGlzIGNsaWNrZWQgd2l0aGluIG1pbnV0ZXMgb3IgbmV2ZXIuICovXG5leHBvcnQgY29uc3QgVkVSSUZJQ0FUSU9OX1RUTF9NUyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuLyoqXG4gKiBCb3VuY2VzIGJlZm9yZSBhbiBhZGRyZXNzIGlzIHRyZWF0ZWQgYXMgdW5kZWxpdmVyYWJsZSBhbmQgc2tpcHBlZC4gVGhyZWUsIG5vdFxuICogb25lOiBhIHNpbmdsZSBib3VuY2UgaXMgb2Z0ZW4gYW4gb3V0LW9mLW9mZmljZSBhdXRvcmVzcG9uZGVyIG9yIGEgZnVsbCBtYWlsYm94LFxuICogYW5kIGRyb3BwaW5nIGEgbWFuYWdlciBvZmYgdGhlIGxpc3QgZm9yIG9uZSBvZiB0aG9zZSBpcyBhIHNpbGVudCBmYWlsdXJlLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0JPVU5DRVMgPSAzO1xuXG4vKiogU0hBLTI1NiBoZXggb2YgYSB0b2tlbi4gVGhlIG9ubHkgZm9ybSBhbnkgdG9rZW4gaXMgZXZlciBzdG9yZWQgaW4uICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHRva2VuLCAndXRmOCcpLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKiBBIGZyZXNoIFVSTC1zYWZlIHRva2VuLCBhbmQgaXRzIGhhc2guIFRoZSByYXcgdmFsdWUgaXMgcmV0dXJuZWQgZXhhY3RseSBvbmNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbnRUb2tlbigpOiB7IHRva2VuOiBzdHJpbmc7IHRva2VuSGFzaDogc3RyaW5nIH0ge1xuICBjb25zdCB0b2tlbiA9IHJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZygnYmFzZTY0dXJsJyk7XG4gIHJldHVybiB7IHRva2VuLCB0b2tlbkhhc2g6IGhhc2hUb2tlbih0b2tlbikgfTtcbn1cblxuLyoqIFdoYXQgY3JlYXRpbmcgYSBkZWZpbml0aW9uIG5lZWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVEZWZpbml0aW9uSW5wdXQge1xuICBvcmdJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHRlbXBsYXRlOiBSZXBvcnRUZW1wbGF0ZTtcbiAgc2VjdGlvbnM6IHN0cmluZ1tdO1xuICBjYWRlbmNlOiBSZXBvcnRDYWRlbmNlO1xuICB0aW1lem9uZTogc3RyaW5nO1xuICB3ZWVrU3RhcnQ6ICdtb25kYXknIHwgJ3N1bmRheSc7XG4gIHNjb3BlOiBSZXBvcnRTY29wZTtcbiAgcmVjaXBpZW50czogc3RyaW5nW107XG4gIGF1dG9TZW5kOiBib29sZWFuO1xuICBvd25lcklkOiBzdHJpbmc7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBuZXh0UnVuQXQ/OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqIFRoZSBtdXRhYmxlIGhhbGYgb2YgYSBkZWZpbml0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVEZWZpbml0aW9uSW5wdXQge1xuICBuYW1lPzogc3RyaW5nO1xuICB0ZW1wbGF0ZT86IFJlcG9ydFRlbXBsYXRlO1xuICBzZWN0aW9ucz86IHN0cmluZ1tdO1xuICBjYWRlbmNlPzogUmVwb3J0Q2FkZW5jZTtcbiAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIHdlZWtTdGFydD86ICdtb25kYXknIHwgJ3N1bmRheSc7XG4gIHNjb3BlPzogUmVwb3J0U2NvcGU7XG4gIHJlY2lwaWVudHM/OiBzdHJpbmdbXTtcbiAgYXV0b1NlbmQ/OiBib29sZWFuO1xuICBpc0FjdGl2ZT86IGJvb2xlYW47XG4gIHBhdXNlZFJlYXNvbj86IFJlcG9ydFBhdXNlUmVhc29uIHwgbnVsbDtcbiAgbmV4dFJ1bkF0PzogRGF0ZSB8IG51bGw7XG59XG5cbi8qKiBBIHNoYXJlIGxpbmsgcGx1cyB0aGUgb25lLXRpbWUgdG9rZW4sIHJldHVybmVkIG9ubHkgZnJvbSB0aGUgbWludCBjYWxsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNaW50ZWRTaGFyZUxpbmsge1xuICBsaW5rOiBSZXBvcnRTaGFyZUxpbms7XG4gIC8qKiBTaG93biBvbmNlLiBOZXZlciBzdG9yZWQsIG5ldmVyIGxvZ2dlZCwgbmV2ZXIgaW4gYSByZXNwb25zZSBhZ2Fpbi4gKi9cbiAgdG9rZW46IHN0cmluZztcbn1cblxuLyoqIFdoYXQgdGhlIHB1YmxpYyByb3V0ZSBuZWVkczogdGhlIGxpbmssIGl0cyBydW4sIGFuZCB0aGUgb3duaW5nIG9yZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTaGFyZUxpbmsge1xuICBsaW5rOiBSZXBvcnRTaGFyZUxpbms7XG4gIHJ1bjogUmVwb3J0UnVuO1xufVxuXG4vKiogVGhlIGBwdXJnZV9hZnRlcmAgc3RhbXAgYSBzb2Z0LWRlbGV0ZSBjYXJyaWVzLCBvciBge31gIHdoZW4gcHVyZ2luZyBpcyBvZmYuICovXG5mdW5jdGlvbiBwdXJnZVN0YW1wKG5vdzogRGF0ZSk6IHsgcHVyZ2VBZnRlcj86IERhdGUgfSB7XG4gIGNvbnN0IG1zID0gc29mdERlbGV0ZVJldGVudGlvbk1zKCk7XG4gIHJldHVybiBtcyA+IDAgPyB7IHB1cmdlQWZ0ZXI6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyBtcykgfSA6IHt9O1xufVxuXG5leHBvcnQgY2xhc3MgU3Rha2Vob2xkZXJSZXBvcnRTdG9yZSB7XG4gIC8vIOKUgOKUgCBEZWZpbml0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBjcmVhdGVEZWZpbml0aW9uKGlucHV0OiBDcmVhdGVEZWZpbml0aW9uSW5wdXQpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCBpZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKS52YWx1ZXMoe1xuICAgICAgaWQsXG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBvd25lcklkOiBpbnB1dC5vd25lcklkLFxuICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgIHRlbXBsYXRlOiBpbnB1dC50ZW1wbGF0ZSxcbiAgICAgIHNlY3Rpb25zOiBpbnB1dC5zZWN0aW9ucyxcbiAgICAgIGNhZGVuY2U6IGlucHV0LmNhZGVuY2UsXG4gICAgICB0aW1lem9uZTogaW5wdXQudGltZXpvbmUsXG4gICAgICB3ZWVrU3RhcnQ6IGlucHV0LndlZWtTdGFydCxcbiAgICAgIHNjb3BlOiBpbnB1dC5zY29wZSxcbiAgICAgIHJlY2lwaWVudHM6IGlucHV0LnJlY2lwaWVudHMsXG4gICAgICBhdXRvU2VuZDogaW5wdXQuYXV0b1NlbmQsXG4gICAgICBuZXh0UnVuQXQ6IGlucHV0Lm5leHRSdW5BdCA/PyBudWxsLFxuICAgICAgY3JlYXRlZEJ5OiBpbnB1dC5jcmVhdGVkQnksXG4gICAgfSkucmV0dXJuaW5nKCkpO1xuICAgIHJldHVybiAocm93cyBhcyBSZXBvcnREZWZpbml0aW9uW10pWzBdO1xuICB9XG5cbiAgYXN5bmMgbGlzdERlZmluaXRpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLCBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSkpXG4gICAgICAub3JkZXJCeShhc2Moc2NoZW1hLnJlcG9ydERlZmluaXRpb24ubmFtZSkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gIH1cblxuICBhc3luYyBnZXREZWZpbml0aW9uKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24gfCBudWxsPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAubGltaXQoMSkpO1xuICAgIHJldHVybiAocm93cyBhcyBSZXBvcnREZWZpbml0aW9uW10pWzBdID8/IG51bGw7XG4gIH1cblxuICAvKiogVGhyb3dzIHtAbGluayBOb3RGb3VuZEVycm9yfSByYXRoZXIgdGhhbiByZXR1cm5pbmcgbnVsbCwgZm9yIHJvdXRlIGJvZGllcy4gKi9cbiAgYXN5bmMgcmVxdWlyZURlZmluaXRpb24ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgdGhpcy5nZXREZWZpbml0aW9uKG9yZ0lkLCBpZCk7XG4gICAgaWYgKCFmb3VuZCkgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBkZWZpbml0aW9uIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURlZmluaXRpb24oXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHBhdGNoOiBVcGRhdGVEZWZpbml0aW9uSW5wdXQsXG4gICAgdXBkYXRlZEJ5OiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHVwZGF0ZWRCeSwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGF0Y2gpKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbikuc2V0KHNldClcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IChyb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXSlbMF07XG4gICAgaWYgKCF1cGRhdGVkKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IGRlZmluaXRpb24gbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGFuZCBhIGRlZmluaXRpb24gdG8gYSBuZXcgb3duZXIuIFRoZSBvd25lciBpcyB3aG8gYSBzY2hlZHVsZWQgcnVuIGlzXG4gICAqIGF1dGhvcml6ZWQgQVMsIHNvIHRoaXMgaXMgYSBwcml2aWxlZ2UgbW92ZSwgbm90IGEgbWV0YWRhdGEgZWRpdCDigJQgdGhlIHJvdXRlXG4gICAqIGNoZWNrcyB0aGUgbmV3IG93bmVyIGlzIGEgbGl2ZSBtZW1iZXIgb2YgdGhlIG9yZyBiZWZvcmUgY2FsbGluZy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyT3duZXIob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgbmV3T3duZXJJZDogc3RyaW5nLCBhY3RvcklkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7XG4gICAgICAgIG93bmVySWQ6IG5ld093bmVySWQsXG4gICAgICAgIHVwZGF0ZWRCeTogYWN0b3JJZCxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAvLyBBIGRlZmluaXRpb24gcGF1c2VkIGJlY2F1c2UgaXRzIHByZXZpb3VzIG93bmVyIGxvc3QgYWNjZXNzIGlzIGxpdmUgYWdhaW5cbiAgICAgICAgLy8gdW5kZXIgYW4gb3duZXIgd2hvIGhhcyBpdC4gVGhlIHNjaGVkdWxlciByZS1jaGVja3MgZXZlcnkgcnVuIGFueXdheSwgc29cbiAgICAgICAgLy8gdGhlIHdvcnN0IGNhc2UgaXMgb25lIG1vcmUgcGF1c2VkIHJ1biwgbmV2ZXIgYSBzdGFuZGluZyBncmFudC5cbiAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgIHBhdXNlZFJlYXNvbjogbnVsbCxcbiAgICAgIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSAocm93cyBhcyBSZXBvcnREZWZpbml0aW9uW10pWzBdO1xuICAgIGlmICghdXBkYXRlZCkgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoJ1JlcG9ydCBkZWZpbml0aW9uIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIGV2ZXJ5IGRlZmluaXRpb24gYSB1c2VyIG93bnMsIHdpdGggdGhlIHJlYXNvbiByZWNvcmRlZC4gQ2FsbGVkIHdoZW4gdGhlXG4gICAqIG93bmVyIGlzIGRlYWN0aXZhdGVkIG9yIGxvc2VzIGByZXBvcnRzOndyaXRlYCDigJQgYSByZXBvcnQgbXVzdCBzdG9wIHdoZW4gdGhlXG4gICAqIHBlcnNvbiBhY2NvdW50YWJsZSBmb3IgaXQgY2FuIG5vIGxvbmdlciBzZWUgdGhlIGRhdGEgYmVoaW5kIGl0LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBwYXVzZWQgZGVmaW5pdGlvbnMgc28gdGhlIGNhbGxlciBjYW4gbm90aWZ5IGFuIG9yZyBhZG1pbjogYVxuICAgKiBzaWxlbnRseSBzdG9wcGVkIHdlZWtseSByZXBvcnQgaXMgZGlzY292ZXJlZCBieSBhIG1hbmFnZXIgbm90IHJlY2VpdmluZyBpdC5cbiAgICovXG4gIGFzeW5jIHBhdXNlRGVmaW5pdGlvbnNGb3JPd25lcihcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIG93bmVySWQ6IHN0cmluZyxcbiAgICByZWFzb246IFJlcG9ydFBhdXNlUmVhc29uLFxuICApOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAuc2V0KHsgaXNBY3RpdmU6IGZhbHNlLCBwYXVzZWRSZWFzb246IHJlYXNvbiwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vd25lcklkLCBvd25lcklkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaXNBY3RpdmUsIHRydWUpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZURlZmluaXRpb24ob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgZGVsZXRlZEJ5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAuc2V0KHsgZGVsZXRlZEF0OiBub3csIGRlbGV0ZWRCeSwgLi4ucHVyZ2VTdGFtcChub3cpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkIH0pKTtcbiAgICBpZiAoKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgZGVmaW5pdGlvbiBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgLy8gTGlua3MgdG8gdGhpcyBkZWZpbml0aW9uJ3MgcnVucyBhcmUgcmV2b2tlZCBpbiB0aGUgc2FtZSBicmVhdGguIERlbGV0aW5nIGFcbiAgICAvLyByZXBvcnQgd2hpbGUgYSBwdWJsaWMgVVJMIHRvIGxhc3QgbW9udGgncyBudW1iZXJzIGtlZXBzIHdvcmtpbmcgaXMgdGhlIGtpbmRcbiAgICAvLyBvZiBnYXAgbm9ib2R5IG5vdGljZXMgdW50aWwgaXQgbWF0dGVycy5cbiAgICBhd2FpdCB0aGlzLnJldm9rZUxpbmtzRm9yRGVmaW5pdGlvbihvcmdJZCwgaWQsIGRlbGV0ZWRCeSk7XG4gIH1cblxuICAvLyDilIDilIAgUnVucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSW5zZXJ0IGEgcnVuIGZvciBhIHBlcmlvZCwgb3IgcmV0dXJuIHRoZSBleGlzdGluZyBvbmUuXG4gICAqXG4gICAqIElkZW1wb3RlbnQgb24gKGRlZmluaXRpb24sIHBlcmlvZFN0YXJ0LCB2ZXJzaW9uKTogYSByZXRyeSwgYSBjYXRjaC11cCBwYXNzXG4gICAqIGFuZCBhIG1hbnVhbCBiYWNrZmlsbCBjYW4gYWxsIGFzayBmb3IgdGhlIHNhbWUgcGVyaW9kLCBhbmQgd2l0aG91dCB0aGlzIGVhY2hcbiAgICogd291bGQgaW5zZXJ0IGEgcm93IGFuZCB0aGUgbGVhZCB3b3VsZCByZXZpZXcgdGhyZWUgY29waWVzLiBgb25Db25mbGljdERvTm90aGluZ2BcbiAgICogcGx1cyBhIHJlLXJlYWQgaXMgZGVsaWJlcmF0ZSDigJQgdGhlIHVuaXF1ZSBpbmRleCBpcyB0aGUgYXJiaXRlciwgc28gdHdvIHBvZHNcbiAgICogcmFjaW5nIHByb2R1Y2Ugb25lIHJvdyB3aGljaGV2ZXIgd2lucy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDoge1xuICAgIG9yZ0lkOiBzdHJpbmc7XG4gICAgZGVmaW5pdGlvbklkOiBzdHJpbmc7XG4gICAgcGVyaW9kU3RhcnQ6IERhdGU7XG4gICAgcGVyaW9kRW5kOiBEYXRlO1xuICAgIHBlcmlvZExhYmVsOiBzdHJpbmc7XG4gICAgdmVyc2lvbj86IG51bWJlcjtcbiAgICBzdGF0dXM/OiBSZXBvcnRSdW5TdGF0dXM7XG4gICAgc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gICAgZmFpbHVyZVJlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPHsgcnVuOiBSZXBvcnRSdW47IGNyZWF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHZlcnNpb24gPSBpbnB1dC52ZXJzaW9uID8/IDE7XG4gICAgY29uc3QgaWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEucmVwb3J0UnVuKS52YWx1ZXMoe1xuICAgICAgaWQsXG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBkZWZpbml0aW9uSWQ6IGlucHV0LmRlZmluaXRpb25JZCxcbiAgICAgIHBlcmlvZFN0YXJ0OiBpbnB1dC5wZXJpb2RTdGFydCxcbiAgICAgIHBlcmlvZEVuZDogaW5wdXQucGVyaW9kRW5kLFxuICAgICAgcGVyaW9kTGFiZWw6IGlucHV0LnBlcmlvZExhYmVsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzID8/ICdkcmFmdGluZycsXG4gICAgICBzbmFwc2hvdDogaW5wdXQuc25hcHNob3QgPz8gbnVsbCxcbiAgICAgIGZhaWx1cmVSZWFzb246IGlucHV0LmZhaWx1cmVSZWFzb24gPz8gbnVsbCxcbiAgICB9KS5vbkNvbmZsaWN0RG9Ob3RoaW5nKHtcbiAgICAgIHRhcmdldDogW3NjaGVtYS5yZXBvcnRSdW4uZGVmaW5pdGlvbklkLCBzY2hlbWEucmVwb3J0UnVuLnBlcmlvZFN0YXJ0LCBzY2hlbWEucmVwb3J0UnVuLnZlcnNpb25dLFxuICAgIH0pLnJldHVybmluZygpKTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgICBpZiAoaW5zZXJ0ZWQpIHJldHVybiB7IHJ1bjogaW5zZXJ0ZWQsIGNyZWF0ZWQ6IHRydWUgfTtcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5kZWZpbml0aW9uSWQsIGlucHV0LmRlZmluaXRpb25JZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4ucGVyaW9kU3RhcnQsIGlucHV0LnBlcmlvZFN0YXJ0KSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi52ZXJzaW9uLCB2ZXJzaW9uKSxcbiAgICAgICkpXG4gICAgICAubGltaXQoMSkpO1xuICAgIGNvbnN0IGZvdW5kID0gKGV4aXN0aW5nIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAvLyBUaGUgaW5zZXJ0IHdhcyBza2lwcGVkIGJ5IHRoZSBjb25mbGljdCB0YXJnZXQgYnV0IG5vdGhpbmcgaXMgdGhlcmUgdG9cbiAgICAgIC8vIHJlYWQ6IHRoZSBvbmx5IHdheSBpcyBhIGNvbmN1cnJlbnQgZGVsZXRlIGJldHdlZW4gdGhlIHR3byBzdGF0ZW1lbnRzLlxuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoJ1JlcG9ydCBydW4gY291bGQgbm90IGJlIGNyZWF0ZWQnLCBFcnJvckNvZGUuQ09ORkxJQ1QsIHtcbiAgICAgICAgZGVmaW5pdGlvbklkOiBpbnB1dC5kZWZpbml0aW9uSWQsXG4gICAgICAgIHBlcmlvZExhYmVsOiBpbnB1dC5wZXJpb2RMYWJlbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBydW46IGZvdW5kLCBjcmVhdGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqIFRoZSBuZXh0IHZlcnNpb24gbnVtYmVyIGZvciBhIHBlcmlvZDogYG1heCh2ZXJzaW9uKSArIDFgLiAqL1xuICBhc3luYyBuZXh0VmVyc2lvbihkZWZpbml0aW9uSWQ6IHN0cmluZywgcGVyaW9kU3RhcnQ6IERhdGUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoeyB2ZXJzaW9uOiBzY2hlbWEucmVwb3J0UnVuLnZlcnNpb24gfSlcbiAgICAgIC5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgZGVmaW5pdGlvbklkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5wZXJpb2RTdGFydCwgcGVyaW9kU3RhcnQpLFxuICAgICAgKSlcbiAgICAgIC5vcmRlckJ5KGRlc2Moc2NoZW1hLnJlcG9ydFJ1bi52ZXJzaW9uKSlcbiAgICAgIC5saW1pdCgxKSk7XG4gICAgY29uc3QgdG9wID0gKHJvd3MgYXMgQXJyYXk8eyB2ZXJzaW9uOiBudW1iZXIgfT4pWzBdO1xuICAgIHJldHVybiAodG9wPy52ZXJzaW9uID8/IDApICsgMTtcbiAgfVxuXG4gIC8qKiBQb2ludCBhbiBvbGRlciBydW4gYXQgdGhlIHZlcnNpb24gdGhhdCByZXBsYWNlZCBpdC4gKi9cbiAgYXN5bmMgc3VwZXJzZWRlKG9yZ0lkOiBzdHJpbmcsIG9sZFJ1bklkOiBzdHJpbmcsIG5ld1J1bklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC5zZXQoeyBzdXBlcnNlZGVkQnk6IG5ld1J1bklkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgb2xkUnVuSWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCkpKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UnVucyhvcmdJZDogc3RyaW5nLCBkZWZpbml0aW9uSWQ6IHN0cmluZywgbGltaXQgPSA1MCk6IFByb21pc2U8UmVwb3J0UnVuW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgZGVmaW5pdGlvbklkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAub3JkZXJCeShkZXNjKHNjaGVtYS5yZXBvcnRSdW4ucGVyaW9kU3RhcnQpLCBkZXNjKHNjaGVtYS5yZXBvcnRSdW4udmVyc2lvbikpXG4gICAgICAubGltaXQobGltaXQpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnRSdW5bXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnRSdW4gfCBudWxsPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgaWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCksIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLmRlbGV0ZWRBdCkpKVxuICAgICAgLmxpbWl0KDEpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0UnVuW10pWzBdID8/IG51bGw7XG4gIH1cblxuICBhc3luYyByZXF1aXJlUnVuKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlcG9ydFJ1bj4ge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgdGhpcy5nZXRSdW4ob3JnSWQsIGlkKTtcbiAgICBpZiAoIWZvdW5kKSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IHJ1biBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICAvKiogU3RvcmUgYSBjb21wdXRlZCBzbmFwc2hvdCBhbmQgbW92ZSB0aGUgcnVuIHRvIGByZWFkeV9mb3JfcmV2aWV3YC4gKi9cbiAgYXN5bmMgY29tcGxldGVSdW4oXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdGF0dXM6IFJlcG9ydFJ1blN0YXR1cyA9ICdyZWFkeV9mb3JfcmV2aWV3JyxcbiAgKTogUHJvbWlzZTxSZXBvcnRSdW4+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAuc2V0KHsgc25hcHNob3QsIHN0YXR1cywgZmFpbHVyZVJlYXNvbjogbnVsbCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSwgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLCBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgICBpZiAoIXVwZGF0ZWQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdSZXBvcnQgcnVuIG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgYXN5bmMgZmFpbFJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBmYWlsdXJlUmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC5zZXQoeyBzdGF0dXM6ICdmYWlsZWQnLCBmYWlsdXJlUmVhc29uLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgaWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCkpKSk7XG4gIH1cblxuICAvKipcbiAgICogRWRpdCB0aGUgbGVhZCdzIG93biB3b3JkcyBvbiBhIHJ1biB0aGF0IGhhcyBOT1QgYmVlbiBwdWJsaXNoZWQuXG4gICAqXG4gICAqIFJlZnVzZWQgYWZ0ZXIgcHVibGlzaDogdGhlIG5vdGVzIGFyZSBwYXJ0IG9mIHdoYXQgdGhlIG1hbmFnZXIgcmVhZCwgYW5kIGFcbiAgICogcmVwb3J0IHdob3NlIG5hcnJhdGl2ZSBjYW4gYmUgZWRpdGVkIGFmdGVyIGRlbGl2ZXJ5IGlzIGEgcmVwb3J0IHdob3NlXG4gICAqIGRlbGl2ZXJlZCB2ZXJzaW9uIGNhbm5vdCBiZSByZWNvbnN0cnVjdGVkLiBSZWdlbmVyYXRpbmcgcHJvZHVjZXMgdmVyc2lvbiBOKzEsXG4gICAqIHdoaWNoIGlzIHRoZSBzdXBwb3J0ZWQgd2F5IHRvIGNvcnJlY3QgYSBwdWJsaXNoZWQgcmVwb3J0LlxuICAgKi9cbiAgYXN5bmMgc2V0UnVuTm90ZXMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHBhdGNoOiB7IGxlYWROb3Rlcz86IHN0cmluZzsgYWlEcmFmdD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPFJlcG9ydFJ1bj4ge1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHRoaXMucmVxdWlyZVJ1bihvcmdJZCwgaWQpO1xuICAgIGlmIChydW4uc3RhdHVzID09PSAncHVibGlzaGVkJykge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgICdUaGlzIHJlcG9ydCBoYXMgYWxyZWFkeSBiZWVuIHB1Ymxpc2hlZC4gUmVnZW5lcmF0ZSBpdCB0byBwcm9kdWNlIGEgbmV3IHZlcnNpb24gd2l0aCB5b3VyIGNoYW5nZXMg4oCUICdcbiAgICAgICAgKyAndGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIHN0YXlzIGV4YWN0bHkgYXMgdGhlIHJlY2lwaWVudHMgcmVhZCBpdC4nLFxuICAgICAgICBFcnJvckNvZGUuQ09ORkxJQ1QsXG4gICAgICAgIHsgcnVuSWQ6IGlkLCBwdWJsaXNoZWRBdDogcnVuLnB1Ymxpc2hlZEF0Py50b0lTT1N0cmluZygpIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBpZiAocGF0Y2gubGVhZE5vdGVzICE9PSB1bmRlZmluZWQpIHNldC5sZWFkTm90ZXMgPSBwYXRjaC5sZWFkTm90ZXM7XG4gICAgaWYgKHBhdGNoLmFpRHJhZnQgIT09IHVuZGVmaW5lZCkgc2V0LmFpRHJhZnQgPSBwYXRjaC5haURyYWZ0O1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJ1bikuc2V0KHNldClcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgaWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCksIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLmRlbGV0ZWRBdCkpKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0UnVuW10pWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB3aGF0IGhhcHBlbmVkIHdoZW4gYSBydW4gd2FzIGRlbGl2ZXJlZC5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IE5PVCBwYXJ0IG9mIHtAbGluayBzZXRSdW5Ob3Rlc30sIHdoaWNoIHJlZnVzZXMgYSBwdWJsaXNoZWQgcnVuOiBkZWxpdmVyeVxuICAgKiBoYXBwZW5zIEFUIHB1Ymxpc2gsIHNvIGEgbWV0aG9kIHRoYXQgcmVmdXNlZCBwdWJsaXNoZWQgcnVucyBjb3VsZCBuZXZlciByZWNvcmQgaXQuXG4gICAqIFRoaXMgb25lIHdyaXRlcyBleGFjdGx5IG9uZSBjb2x1bW4gYW5kIG5vdGhpbmcgZWxzZSwgd2hpY2ggaXMgd2h5IGl0IGlzIHNhZmUgdG8gYWxsb3dcbiAgICogYWZ0ZXIgcHVibGlzaCDigJQgaXQgY2Fubm90IGNoYW5nZSBhIG51bWJlciBhIHJlY2lwaWVudCBoYXMgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlY29yZERlbGl2ZXJ5KG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRlbGl2ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLnNldCh7IGRlbGl2ZXJ5LCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpLFxuICAgICAgKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYSBydW4uXG4gICAqXG4gICAqIENvbmRpdGlvbmFsIG9uIHRoZSByb3cgc3RpbGwgYmVpbmcgdW5wdWJsaXNoZWQgKGBwdWJsaXNoZWRfYXQgSVMgTlVMTGApLCBzb1xuICAgKiB0d28gY2xpY2tzIOKAlCBvciB0d28gdGFicyDigJQgcHJvZHVjZSBvbmUgcHVibGlzaCBhbmQgb25lIHNldCBvZiBkZWxpdmVyaWVzXG4gICAqIHJhdGhlciB0aGFuIHR3by4gQSBydW4gd2l0aCBubyBzbmFwc2hvdCBjYW5ub3QgYmUgcHVibGlzaGVkOiB0aGVyZSB3b3VsZCBiZVxuICAgKiBub3RoaW5nIGZvciBhIHJlY2lwaWVudCB0byByZWFkLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBwdWJsaXNoZWRCeTogc3RyaW5nKTogUHJvbWlzZTx7IHJ1bjogUmVwb3J0UnVuOyBhbHJlYWR5UHVibGlzaGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLnJlcXVpcmVSdW4ob3JnSWQsIGlkKTtcbiAgICBpZiAocnVuLnN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgIXJ1bi5zbmFwc2hvdCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgICdUaGlzIHJlcG9ydCBoYXMgbm8gY29tcHV0ZWQgc25hcHNob3QsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcHVibGlzaC4gUmVnZW5lcmF0ZSBpdCBmaXJzdC4nLFxuICAgICAgICBFcnJvckNvZGUuQ09ORkxJQ1QsXG4gICAgICAgIHsgcnVuSWQ6IGlkLCBzdGF0dXM6IHJ1bi5zdGF0dXMgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgLnNldCh7IHN0YXR1czogJ3B1Ymxpc2hlZCcsIHB1Ymxpc2hlZEJ5LCBwdWJsaXNoZWRBdDogbm93LCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgaWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UnVuLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UnVuLnB1Ymxpc2hlZEF0KSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSdW4uZGVsZXRlZEF0KSxcbiAgICAgICkpXG4gICAgICAucmV0dXJuaW5nKCkpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZCA9IChyb3dzIGFzIFJlcG9ydFJ1bltdKVswXTtcbiAgICBpZiAocHVibGlzaGVkKSByZXR1cm4geyBydW46IHB1Ymxpc2hlZCwgYWxyZWFkeVB1Ymxpc2hlZDogZmFsc2UgfTtcbiAgICAvLyBUaGUgY29uZGl0aW9uYWwgdXBkYXRlIG1hdGNoZWQgbm90aGluZzogc29tZW9uZSBlbHNlIHB1Ymxpc2hlZCBpdCBmaXJzdC5cbiAgICByZXR1cm4geyBydW46IGF3YWl0IHRoaXMucmVxdWlyZVJ1bihvcmdJZCwgaWQpLCBhbHJlYWR5UHVibGlzaGVkOiB0cnVlIH07XG4gIH1cblxuICAvLyDilIDilIAgU2hhcmUgbGlua3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIE1pbnQgYSByZWFkLW9ubHkgbGluayB0byBhIHB1Ymxpc2hlZCBydW4uIFRoZSByYXcgdG9rZW4gaXMgcmV0dXJuZWQgaGVyZSBhbmRcbiAgICogbm93aGVyZSBlbHNlIOKAlCBvbmx5IGl0cyBoYXNoIGlzIHN0b3JlZCwgc28gYSBkYXRhYmFzZSBjb3B5IGNhbm5vdCBiZSB0dXJuZWRcbiAgICogYmFjayBpbnRvIHdvcmtpbmcgVVJMcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlTGluayhpbnB1dDoge1xuICAgIG9yZ0lkOiBzdHJpbmc7XG4gICAgcnVuSWQ6IHN0cmluZztcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICB0dGxEYXlzPzogbnVtYmVyO1xuICAgIHJlZGFjdE5hbWVzPzogYm9vbGVhbjtcbiAgICBub3c/OiBEYXRlO1xuICB9KTogUHJvbWlzZTxNaW50ZWRTaGFyZUxpbms+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLnJlcXVpcmVSdW4oaW5wdXQub3JnSWQsIGlucHV0LnJ1bklkKTtcbiAgICBpZiAocnVuLnN0YXR1cyAhPT0gJ3B1Ymxpc2hlZCcpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAnT25seSBhIHB1Ymxpc2hlZCByZXBvcnQgY2FuIGJlIHNoYXJlZC4gUHVibGlzaCBpdCBmaXJzdCDigJQgYSBsaW5rIHRvIGEgZHJhZnQgd291bGQgc2hvdyBudW1iZXJzIHRoZSBsZWFkIGhhcyBub3QgcmV2aWV3ZWQuJyxcbiAgICAgICAgRXJyb3JDb2RlLkNPTkZMSUNULFxuICAgICAgICB7IHJ1bklkOiBpbnB1dC5ydW5JZCwgc3RhdHVzOiBydW4uc3RhdHVzIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkYXlzID0gTWF0aC5taW4oaW5wdXQudHRsRGF5cyA/PyBERUZBVUxUX1NIQVJFX0xJTktfVFRMX0RBWVMsIE1BWF9TSEFSRV9MSU5LX1RUTF9EQVlTKTtcbiAgICBjb25zdCBub3cgPSBpbnB1dC5ub3cgPz8gbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IHRva2VuLCB0b2tlbkhhc2ggfSA9IG1pbnRUb2tlbigpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLnJlcG9ydFNoYXJlTGluaykudmFsdWVzKHtcbiAgICAgIGlkOiByYW5kb21VVUlEKCksXG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBydW5JZDogaW5wdXQucnVuSWQsXG4gICAgICB0b2tlbkhhc2gsXG4gICAgICBleHBpcmVzQXQ6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyBkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCksXG4gICAgICByZWRhY3ROYW1lczogaW5wdXQucmVkYWN0TmFtZXMgPz8gZmFsc2UsXG4gICAgICBjcmVhdGVkQnk6IGlucHV0LmNyZWF0ZWRCeSxcbiAgICB9KS5yZXR1cm5pbmcoKSk7XG4gICAgcmV0dXJuIHsgbGluazogKHJvd3MgYXMgUmVwb3J0U2hhcmVMaW5rW10pWzBdLCB0b2tlbiB9O1xuICB9XG5cbiAgYXN5bmMgbGlzdFNoYXJlTGlua3Mob3JnSWQ6IHN0cmluZywgcnVuSWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0U2hhcmVMaW5rW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKVxuICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEucmVwb3J0U2hhcmVMaW5rLm9yZ0lkLCBvcmdJZCksIGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucnVuSWQsIHJ1bklkKSkpXG4gICAgICAub3JkZXJCeShkZXNjKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsuY3JlYXRlZEF0KSkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydFNoYXJlTGlua1tdO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlU2hhcmVMaW5rKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHJldm9rZWRCeTogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnRTaGFyZUxpbms+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspXG4gICAgICAuc2V0KHsgcmV2b2tlZEF0OiBuZXcgRGF0ZSgpLCByZXZva2VkQnkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsuaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5yZXZva2VkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgcmV2b2tlZCA9IChyb3dzIGFzIFJlcG9ydFNoYXJlTGlua1tdKVswXTtcbiAgICBpZiAoIXJldm9rZWQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdTaGFyZSBsaW5rIG5vdCBmb3VuZCBvciBhbHJlYWR5IHJldm9rZWQnKTtcbiAgICByZXR1cm4gcmV2b2tlZDtcbiAgfVxuXG4gIC8qKiBSZXZva2UgZXZlcnkgbGl2ZSBsaW5rIHRvIGFueSBydW4gb2YgYSBkZWZpbml0aW9uLiBVc2VkIG9uIGRlbGV0ZS4gKi9cbiAgYXN5bmMgcmV2b2tlTGlua3NGb3JEZWZpbml0aW9uKG9yZ0lkOiBzdHJpbmcsIGRlZmluaXRpb25JZDogc3RyaW5nLCByZXZva2VkQnk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgcnVucyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IGlkOiBzY2hlbWEucmVwb3J0UnVuLmlkIH0pLmZyb20oc2NoZW1hLnJlcG9ydFJ1bilcbiAgICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgb3JnSWQpLCBlcShzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgZGVmaW5pdGlvbklkKSkpKTtcbiAgICBjb25zdCBydW5JZHMgPSAocnVucyBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgaWYgKHJ1bklkcy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFNoYXJlTGluaylcbiAgICAgIC5zZXQoeyByZXZva2VkQXQ6IG5ldyBEYXRlKCksIHJldm9rZWRCeSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpbkFycmF5KHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucnVuSWQsIHJ1bklkcyksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnJldm9rZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0U2hhcmVMaW5rLmlkIH0pKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHNoYXJlIHRva2VuIHRvIGl0cyBsaW5rIGFuZCBydW4sIGZvciB0aGUgVU5BVVRIRU5USUNBVEVEIHB1YmxpY1xuICAgKiByb3V0ZS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgb25lIHJlYWQgaW4gdGhpcyBtb2R1bGUgdGhhdCBydW5zIGFzIHN5c2FkbWluLCBhbmQgdGhlIHJlYXNvbiBpc1xuICAgKiBzdHJ1Y3R1cmFsOiB0aGUgcmVhZGVyIGhvbGRzIGEgdG9rZW4gYW5kIG5vdGhpbmcgZWxzZSDigJQgbm8gYWNjb3VudCwgbm8gb3JnLFxuICAgKiBubyBKV1Qg4oCUIHNvIHRoZXJlIGlzIG5vIHRlbmFudCBjb250ZXh0IGZvciBSTFMgdG8gc2NvcGUgYnksIGFuZCB0aGUgb3JnIGNhblxuICAgKiBvbmx5IGJlIGxlYXJuZWQgRlJPTSB0aGUgcm93LiBUaGUgZXNjYWxhdGlvbiBpcyBrZXB0IGFzIG5hcnJvdyBhcyB0aGUgcHJvYmxlbTpcbiAgICpcbiAgICogIC0gVGhlIHN5c2FkbWluIHNjb3BlIGNvdmVycyB0aGUgdG9rZW4taGFzaCBsb29rdXAgT05MWS4gVGhlIHJ1biBpcyByZWFkIGJhY2tcbiAgICogICAgdW5kZXIgdGhlIGxpbmsncyBPV04gb3JnLCBzbyBhIGJ1ZyBpbiB0aGUgcnVuIHF1ZXJ5IGNhbm5vdCByZWFjaCBhbm90aGVyXG4gICAqICAgIHRlbmFudCdzIHJvd3MuXG4gICAqICAtIFRoZSBsb29rdXAgaXMgYnkgYSAyNTYtYml0IGhhc2ggb24gYSB1bmlxdWUgaW5kZXguIEl0IGlzIG5vdCBhIGZpbHRlciBhXG4gICAqICAgIGNhbGxlciBjYW4gd2lkZW4g4oCUIHRoZXJlIGlzIG5vIG90aGVyIHByZWRpY2F0ZSB0byBpbmZsdWVuY2UuXG4gICAqICAtIEV4cGlyZWQgYW5kIHJldm9rZWQgbGlua3MgcmVzb2x2ZSB0byBudWxsIGhlcmUsIHNvIHRoZSBjYWxsZXIgY2Fubm90XG4gICAqICAgIGFjY2lkZW50YWxseSBzZXJ2ZSBvbmUgYnkgZm9yZ2V0dGluZyBhIGNoZWNrLlxuICAgKlxuICAgKiBSZXR1cm5zIG51bGwgZm9yIGV2ZXJ5IGZhaWx1cmUg4oCUIHVua25vd24sIHJldm9rZWQsIGV4cGlyZWQsIG9yIHBvaW50aW5nIGF0IGFcbiAgICogcnVuIHRoYXQgaXMgbm8gbG9uZ2VyIHB1Ymxpc2hlZCDigJQgc28gdGhlIHJvdXRlIGFuc3dlcnMgb25lIGluZGlzdGluZ3Vpc2hhYmxlXG4gICAqIDQwNCBhbmQgYSBob2xkZXIgb2YgYSBkZWFkIGxpbmsgbGVhcm5zIG5vdGhpbmcgYWJvdXQgd2hpY2ggb2YgdGhvc2UgaXQgd2FzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVNoYXJlTGluayh0b2tlbjogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxSZXNvbHZlZFNoYXJlTGluayB8IG51bGw+IHtcbiAgICBjb25zdCB0b2tlbkhhc2ggPSBoYXNoVG9rZW4odG9rZW4pO1xuICAgIGNvbnN0IGxpbmtzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydFNoYXJlTGluaylcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsudG9rZW5IYXNoLCB0b2tlbkhhc2gpKVxuICAgICAgICAubGltaXQoMSkpKTtcbiAgICBjb25zdCBsaW5rID0gKGxpbmtzIGFzIFJlcG9ydFNoYXJlTGlua1tdKVswXTtcbiAgICAvLyBObyBjb25zdGFudC10aW1lIGNvbXBhcmlzb24gaGVyZSBvbiBwdXJwb3NlOiB0aGUgbG9va3VwIGlzIGFuIGVxdWFsaXR5IG1hdGNoXG4gICAgLy8gb24gYSAyNTYtYml0IGhhc2ggb3ZlciBhIHVuaXF1ZSBpbmRleCwgc28gdGhlcmUgaXMgbm8gc2VjcmV0LWRlcGVuZGVudCBicmFuY2hcbiAgICAvLyBpbiB0aGlzIGZ1bmN0aW9uIHRvIGxlYWsuIEEgaGFuZC1yb2xsZWQgY29tcGFyZSBhZnRlciB0aGUgZGF0YWJhc2UgYWxyZWFkeVxuICAgIC8vIGRlY2lkZWQgaXQgd291bGQgYmUgdGhlYXRyZS5cbiAgICBpZiAoIWxpbmspIHJldHVybiBudWxsO1xuICAgIGlmIChsaW5rLnJldm9rZWRBdCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKGxpbmsuZXhwaXJlc0F0LmdldFRpbWUoKSA8PSBub3cuZ2V0VGltZSgpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJ1bnMgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkOiBsaW5rLm9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5pZCwgbGluay5ydW5JZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5vcmdJZCwgbGluay5vcmdJZCksXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJ1bi5zdGF0dXMsICdwdWJsaXNoZWQnKSxcbiAgICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXQpLFxuICAgICAgICApKVxuICAgICAgICAubGltaXQoMSkpKTtcbiAgICBjb25zdCBydW4gPSAocnVucyBhcyBSZXBvcnRSdW5bXSlbMF07XG4gICAgaWYgKCFydW4pIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IGxpbmssIHJ1biB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50IG9uZSBodW1hbiB2aWV3IG9mIGEgc2hhcmVkIHJlcG9ydC5cbiAgICpcbiAgICogU2VwYXJhdGUgZnJvbSB7QGxpbmsgcmVzb2x2ZVNoYXJlTGlua30gc28gdGhlIHJvdXRlIGNhbiBzZXJ2ZSBhIGxpbmsgcHJldmlldyxcbiAgICogYSBIRUFEIHByb2JlIG9yIGEgbWFpbCBzY2FubmVyJ3MgZmV0Y2ggV0lUSE9VVCBjb3VudGluZyBpdCDigJQgYSB2aWV3IGNvdW50IHRoYXRcbiAgICoganVtcHMgdGhlIG1vbWVudCBhIGxpbmsgaXMgcGFzdGVkIGludG8gU2xhY2sgdGVsbHMgdGhlIGxlYWQgdGhlaXIgbWFuYWdlciByZWFkXG4gICAqIHRoZSByZXBvcnQgd2hlbiBub2JvZHkgaGFzLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkU2hhcmVWaWV3KGxpbms6IFJlcG9ydFNoYXJlTGluaywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQ6IGxpbmsub3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKVxuICAgICAgICAuc2V0KHsgdmlld0NvdW50OiBzcWxgJHtzY2hlbWEucmVwb3J0U2hhcmVMaW5rLnZpZXdDb3VudH0gKyAxYCwgbGFzdFZpZXdlZEF0OiBub3cgfSlcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsuaWQsIGxpbmsuaWQpKSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlY2lwaWVudHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEFkZCAob3IgcmUtYWRkKSBhIGRlbGl2ZXJ5IGFkZHJlc3MuXG4gICAqXG4gICAqIFVwc2VydHMgb24gKG9yZywgZW1haWwpIGFuZCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgcmVzZXQgYHVuc3Vic2NyaWJlZF9hdGAgb3JcbiAgICogYHZlcmlmaWVkX2F0YDogYSBsZWFkIG11c3Qgbm90IGJlIGFibGUgdG8gdW5kbyBzb21lb25lJ3MgdW5zdWJzY3JpYmUgYnlcbiAgICogcmVtb3ZpbmcgYW5kIHJlLWFkZGluZyB0aGVtLCBhbmQgYW4gYWRkcmVzcyBhbHJlYWR5IHZlcmlmaWVkIHNob3VsZCBub3QgaGF2ZVxuICAgKiB0byBjb25maXJtIHR3aWNlLiBBIHZlcmlmaWNhdGlvbiB0b2tlbiBpcyBtaW50ZWQgb25seSB3aGVuIHRoZSBhZGRyZXNzIGlzIG5vdFxuICAgKiB5ZXQgdmVyaWZpZWQuXG4gICAqL1xuICBhc3luYyB1cHNlcnRSZWNpcGllbnQoaW5wdXQ6IHtcbiAgICBvcmdJZDogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgLyoqIFNldCB3aGVuIGFuIGFkbWluIHByZS1hcHByb3ZlZCBhbiBvdXQtb2YtZG9tYWluIGFkZHJlc3MuICovXG4gICAgYXBwcm92ZWRCeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE9yZyBtZW1iZXJzIHNraXAgdmVyaWZpY2F0aW9uIOKAlCB0aGV5IGFscmVhZHkgYXV0aGVudGljYXRlZCB0byB0aGlzIG9yZy4gKi9cbiAgICBwcmVWZXJpZmllZD86IGJvb2xlYW47XG4gICAgbm93PzogRGF0ZTtcbiAgfSk6IFByb21pc2U8eyByZWNpcGllbnQ6IFJlcG9ydFJlY2lwaWVudDsgdmVyaWZpY2F0aW9uVG9rZW4/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGVtYWlsID0gaW5wdXQuZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgbm93ID0gaW5wdXQubm93ID8/IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgbWludGVkID0gaW5wdXQucHJlVmVyaWZpZWQgPyB1bmRlZmluZWQgOiBtaW50VG9rZW4oKTtcbiAgICAvLyBUaGUgdW5zdWJzY3JpYmUgdG9rZW4gaXMgbWludGVkIGZvciBFVkVSWSByZWNpcGllbnQsIG1lbWJlciBvciBub3QsIGJlY2F1c2UgZXZlcnlcbiAgICAvLyByZXBvcnQgZW1haWwgY2FycmllcyB0aGUgbGluay4gTWludGVkIG9uY2UgYW5kIGtlcHQ6IGEgbGluayBpbiBhIHJlcG9ydCBmcm9tIE1hcmNoXG4gICAgLy8gaGFzIHRvIGtlZXAgd29ya2luZy5cbiAgICBjb25zdCB1bnN1YiA9IG1pbnRUb2tlbigpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLnJlcG9ydFJlY2lwaWVudCkudmFsdWVzKHtcbiAgICAgIGlkOiByYW5kb21VVUlEKCksXG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBlbWFpbCxcbiAgICAgIGRpc3BsYXlOYW1lOiBpbnB1dC5kaXNwbGF5TmFtZSA/PyBudWxsLFxuICAgICAgdmVyaWZpZWRBdDogaW5wdXQucHJlVmVyaWZpZWQgPyBub3cgOiBudWxsLFxuICAgICAgdmVyaWZpY2F0aW9uVG9rZW5IYXNoOiBtaW50ZWQ/LnRva2VuSGFzaCA/PyBudWxsLFxuICAgICAgdW5zdWJzY3JpYmVUb2tlbjogdW5zdWIudG9rZW4sXG4gICAgICBhcHByb3ZlZEJ5OiBpbnB1dC5hcHByb3ZlZEJ5ID8/IG51bGwsXG4gICAgICBjcmVhdGVkQnk6IGlucHV0LmNyZWF0ZWRCeSxcbiAgICB9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgdGFyZ2V0OiBbc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5vcmdJZCwgc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5lbWFpbF0sXG4gICAgICBzZXQ6IHtcbiAgICAgICAgZGlzcGxheU5hbWU6IGlucHV0LmRpc3BsYXlOYW1lID8/IHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGlzcGxheU5hbWV9YCxcbiAgICAgICAgLy8gUmUtYWRkaW5nIGEgdG9tYnN0b25lZCByZWNpcGllbnQgcmV2aXZlcyB0aGUgcm93IHdpdGggaXRzIGhpc3RvcnkuXG4gICAgICAgIGRlbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICBwdXJnZUFmdGVyOiBudWxsLFxuICAgICAgICBhcHByb3ZlZEJ5OiBpbnB1dC5hcHByb3ZlZEJ5ID8/IHNxbGAke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQuYXBwcm92ZWRCeX1gLFxuICAgICAgICAvLyBPbmx5IG1pbnQgb3ZlciBhbiBVTlZFUklGSUVEIHJvdzsgYSB2ZXJpZmllZCBhZGRyZXNzIGtlZXBzIGl0cyBzdGF0ZS5cbiAgICAgICAgdmVyaWZpY2F0aW9uVG9rZW5IYXNoOiBzcWxgQ0FTRSBXSEVOICR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC52ZXJpZmllZEF0fSBJUyBOVUxMXG4gICAgICAgICAgVEhFTiAke21pbnRlZD8udG9rZW5IYXNoID8/IG51bGx9IEVMU0UgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWNhdGlvblRva2VuSGFzaH0gRU5EYCxcbiAgICAgICAgdmVyaWZpZWRBdDogaW5wdXQucHJlVmVyaWZpZWRcbiAgICAgICAgICA/IHNxbGBDT0FMRVNDRSgke3NjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpZWRBdH0sICR7bm93fSlgXG4gICAgICAgICAgOiBzcWxgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnZlcmlmaWVkQXR9YCxcbiAgICAgICAgLy8gQ09BTEVTQ0UsIG5ldmVyIG92ZXJ3cml0ZTogcmUtYWRkaW5nIGFuIGFkZHJlc3MgbXVzdCBub3QgYnJlYWsgdGhlIHVuc3Vic2NyaWJlXG4gICAgICAgIC8vIGxpbmsgaW4gZXZlcnkgcmVwb3J0IGFscmVhZHkgZGVsaXZlcmVkIHRvIGl0LlxuICAgICAgICB1bnN1YnNjcmliZVRva2VuOiBzcWxgQ09BTEVTQ0UoJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnVuc3Vic2NyaWJlVG9rZW59LCAke3Vuc3ViLnRva2VufSlgLFxuICAgICAgfSxcbiAgICB9KS5yZXR1cm5pbmcoKSk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gKHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W10pWzBdO1xuICAgIC8vIFRoZSB0b2tlbiBpcyBvbmx5IHVzZWZ1bCBpZiB0aGlzIHJvdyBhY3R1YWxseSB0b29rIGl0LlxuICAgIGNvbnN0IHRvb2tUb2tlbiA9IG1pbnRlZCAmJiByZWNpcGllbnQudmVyaWZpY2F0aW9uVG9rZW5IYXNoID09PSBtaW50ZWQudG9rZW5IYXNoO1xuICAgIHJldHVybiB7IHJlY2lwaWVudCwgLi4uKHRvb2tUb2tlbiA/IHsgdmVyaWZpY2F0aW9uVG9rZW46IG1pbnRlZC50b2tlbiB9IDoge30pIH07XG4gIH1cblxuICBhc3luYyBsaXN0UmVjaXBpZW50cyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSZXBvcnRSZWNpcGllbnRbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSwgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSkpXG4gICAgICAub3JkZXJCeShhc2Moc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5lbWFpbCkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnRSZWNpcGllbnRbXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlY2lwaWVudHMob3JnSWQ6IHN0cmluZywgaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UmVwb3J0UmVjaXBpZW50W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50Lm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGluQXJyYXkoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCwgaWRzKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSxcbiAgICAgICkpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnRSZWNpcGllbnRbXTtcbiAgfVxuXG4gIC8qKiBNaW50IGEgZnJlc2ggdmVyaWZpY2F0aW9uIHRva2VuIGZvciBhIHJlY2lwaWVudCB0aGF0IGhhcyBub3QgY29uZmlybWVkIHlldC4gKi9cbiAgYXN5bmMgcmVzZW5kVmVyaWZpY2F0aW9uKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPHsgcmVjaXBpZW50OiBSZXBvcnRSZWNpcGllbnQ7IHRva2VuOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHsgdG9rZW4sIHRva2VuSGFzaCB9ID0gbWludFRva2VuKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgLnNldCh7IHZlcmlmaWNhdGlvblRva2VuSGFzaDogdG9rZW5IYXNoIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkLCBpZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpZWRBdCksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0UmVjaXBpZW50LmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICBjb25zdCByZWNpcGllbnQgPSAocm93cyBhcyBSZXBvcnRSZWNpcGllbnRbXSlbMF07XG4gICAgaWYgKCFyZWNpcGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAnVGhpcyByZWNpcGllbnQgaXMgYWxyZWFkeSB2ZXJpZmllZCwgb3Igbm8gbG9uZ2VyIGV4aXN0cy4nLFxuICAgICAgICBFcnJvckNvZGUuQ09ORkxJQ1QsXG4gICAgICAgIHsgcmVjaXBpZW50SWQ6IGlkIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4geyByZWNpcGllbnQsIHRva2VuIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybSBhbiBhZGRyZXNzIGZyb20gdGhlIGVtYWlsZWQgdG9rZW4uIENyb3NzLW9yZyBieSBuZWNlc3NpdHkgKHRoZSBwZXJzb25cbiAgICogY2xpY2tpbmcgaGFzIG5vIHNlc3Npb24pLCBzbyBpdCBydW5zIGFzIHN5c2FkbWluIG92ZXIgYSB1bmlxdWUgMjU2LWJpdCBoYXNoIOKAlFxuICAgKiB0aGUgc2FtZSBzaGFwZSwgYW5kIHRoZSBzYW1lIHJlYXNvbmluZywgYXMge0BsaW5rIHJlc29sdmVTaGFyZUxpbmt9LlxuICAgKlxuICAgKiBUaGUgdG9rZW4gaXMgQ09OU1VNRUQ6IGl0IGlzIGNsZWFyZWQgb24gc3VjY2Vzcywgc28gYSBmb3J3YXJkZWQgY29uZmlybWF0aW9uXG4gICAqIGxpbmsgY2Fubm90IGJlIHJlcGxheWVkIGJ5IHdob2V2ZXIgdGhlIG1haWwgd2FzIGZvcndhcmRlZCB0by5cbiAgICovXG4gIGFzeW5jIHZlcmlmeVJlY2lwaWVudEJ5VG9rZW4odG9rZW46IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8UmVwb3J0UmVjaXBpZW50IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRva2VuSGFzaCA9IGhhc2hUb2tlbih0b2tlbik7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgICAgLnNldCh7IHZlcmlmaWVkQXQ6IG5vdywgdmVyaWZpY2F0aW9uVG9rZW5IYXNoOiBudWxsIH0pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC52ZXJpZmljYXRpb25Ub2tlbkhhc2gsIHRva2VuSGFzaCksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudmVyaWZpZWRBdCksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuZGVsZXRlZEF0KSxcbiAgICAgICAgICAvLyBBIHRva2VuIG9sZGVyIHRoYW4gdGhlIHdpbmRvdyBpcyBub3QgYWNjZXB0ZWQuIGBjcmVhdGVkX2F0YCBpcyB0aGVcbiAgICAgICAgICAvLyBmbG9vciBmb3IgdGhlIGZpcnN0IHRva2VuOyBhIHJlc2VuZCByZWZyZXNoZXMgdGhlIGhhc2gsIHNvIHRoaXMgYm91bmRzXG4gICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG1pbnQgYW5kIGlzIGRlbGliZXJhdGVseSBnZW5lcm91cy5cbiAgICAgICAgICBzcWxgJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LmNyZWF0ZWRBdH0gPiAke25ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSBWRVJJRklDQVRJT05fVFRMX01TKX1gLFxuICAgICAgICApKVxuICAgICAgICAucmV0dXJuaW5nKCkpKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgUmVwb3J0UmVjaXBpZW50W10pWzBdID8/IG51bGw7XG4gIH1cblxuICAvKiogSG9ub3VyIGFuIHVuc3Vic2NyaWJlIGFjcm9zcyBldmVyeSBkZWZpbml0aW9uIGluIHRoZSBvcmcuICovXG4gIGFzeW5jIHVuc3Vic2NyaWJlQnlFbWFpbChvcmdJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0UmVjaXBpZW50KVxuICAgICAgLnNldCh7IHVuc3Vic2NyaWJlZEF0OiBub3cgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5lbWFpbCwgZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC51bnN1YnNjcmliZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkIH0pKTtcbiAgICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvbm91ciBhbiB1bnN1YnNjcmliZSBmcm9tIHRoZSBsaW5rIGluIGEgcmVwb3J0IGVtYWlsLlxuICAgKlxuICAgKiBMb29rZWQgdXAgYnkgVE9LRU4gYWNyb3NzIG9yZ3MsIGFzIHN5c2FkbWluLCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBzaGFyZS1saW5rXG4gICAqIHJlc29sdmUgaXM6IHRoZSBwZXJzb24gY2xpY2tpbmcgaGFzIG5vIGFjY291bnQgYW5kIG5vIHRlbmFudCwgYW5kIHRoZSB0b2tlbiBpcyB0aGVcbiAgICogb25seSB0aGluZyB0aGF0IGlkZW50aWZpZXMgdGhlIHJvdy4gSXQgaXMgdGhlIG5hcnJvd2VzdCBwb3NzaWJsZSBzaGFwZSDigJQgb25lIGluZGV4ZWRcbiAgICogbG9va3VwLCBvbmUgY29sdW1uIHdyaXR0ZW4sIG5vdGhpbmcgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBidXQgd2hldGhlciBhIHJvd1xuICAgKiBtYXRjaGVkLlxuICAgKlxuICAgKiBJZGVtcG90ZW50LiBBIG1haWwgY2xpZW50IHRoYXQgc2VuZHMgdGhlIG9uZS1jbGljayBQT1NUIHR3aWNlLCBvciBhIG1hbmFnZXIgd2hvXG4gICAqIGNsaWNrcyBhZ2FpbiBtb250aHMgbGF0ZXIsIGdldHMgdGhlIHNhbWUgYW5zd2VyIHJhdGhlciB0aGFuIGFuIGVycm9yIHBhZ2Ug4oCUIHRoZVxuICAgKiBzZWNvbmQgY2FsbCBmaW5kcyB0aGUgcm93IGFscmVhZHkgdW5zdWJzY3JpYmVkIGFuZCByZXBvcnRzIHN1Y2Nlc3MsIGJlY2F1c2UgZnJvbSB0aGVcbiAgICogY2xpY2tlcidzIHBvaW50IG9mIHZpZXcgaXQgaXMuXG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZUJ5VG9rZW4odG9rZW46IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8VW5zdWJzY3JpYmVSZXN1bHQ+IHtcbiAgICBpZiAodG9rZW4ubGVuZ3RoIDwgMTYpIHJldHVybiB7IG1hdGNoZWQ6IGZhbHNlIH07XG4gICAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgICAgLnNldCh7IHVuc3Vic2NyaWJlZEF0OiBzcWxgQ09BTEVTQ0UoJHtzY2hlbWEucmVwb3J0UmVjaXBpZW50LnVuc3Vic2NyaWJlZEF0fSwgJHtub3d9KWAgfSlcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQudW5zdWJzY3JpYmVUb2tlbiwgdG9rZW4pKVxuICAgICAgICAucmV0dXJuaW5nKHtcbiAgICAgICAgICBpZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCxcbiAgICAgICAgICBvcmdJZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5vcmdJZCxcbiAgICAgICAgICBlbWFpbDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5lbWFpbCxcbiAgICAgICAgICB1bnN1YnNjcmliZWRBdDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC51bnN1YnNjcmliZWRBdCxcbiAgICAgICAgfSkpO1xuICAgICAgY29uc3Qgcm93ID0gKHJvd3MgYXMgQXJyYXk8eyBpZDogc3RyaW5nOyBvcmdJZDogc3RyaW5nOyBlbWFpbDogc3RyaW5nOyB1bnN1YnNjcmliZWRBdDogRGF0ZSB8IG51bGwgfT4pWzBdO1xuICAgICAgaWYgKCFyb3cpIHJldHVybiB7IG1hdGNoZWQ6IGZhbHNlIH07XG4gICAgICAvLyBDT0FMRVNDRSBrZXB0IGFuIGVhcmxpZXIgaW5zdGFudCDih5IgdGhpcyBjbGljayBjaGFuZ2VkIG5vdGhpbmcuIE9ubHkgdGhlXG4gICAgICAvLyBGSVJTVCB1bnN1YnNjcmliZSBpcyBhIHN0YXRlIGNoYW5nZSB3b3J0aCByZWNvcmRpbmcsIHdoaWNoIGlzIGFsc28gd2hhdFxuICAgICAgLy8ga2VlcHMgYW4gZXh0ZXJuYWxseS10cmlnZ2VyZWQgcm91dGUgZnJvbSB3cml0aW5nIHVuYm91bmRlZCBhdWRpdCByb3dzLlxuICAgICAgY29uc3QgbmV3bHkgPSByb3cudW5zdWJzY3JpYmVkQXQgIT09IG51bGwgJiYgbmV3IERhdGUocm93LnVuc3Vic2NyaWJlZEF0KS5nZXRUaW1lKCkgPT09IG5vdy5nZXRUaW1lKCk7XG4gICAgICByZXR1cm4geyBtYXRjaGVkOiB0cnVlLCByZWNpcGllbnQ6IHsgaWQ6IHJvdy5pZCwgb3JnSWQ6IHJvdy5vcmdJZCwgZW1haWw6IHJvdy5lbWFpbCB9LCBuZXdseVVuc3Vic2NyaWJlZDogbmV3bHkgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWNvcmQgYSBkZWxpdmVyeSBib3VuY2UuIEF0IHtAbGluayBNQVhfQk9VTkNFU30gdGhlIGFkZHJlc3MgaXMgc2tpcHBlZC4gKi9cbiAgYXN5bmMgcmVjb3JkQm91bmNlKG9yZ0lkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgIC5zZXQoeyBib3VuY2VDb3VudDogc3FsYCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC5ib3VuY2VDb3VudH0gKyAxYCwgbGFzdEJvdW5jZUF0OiBub3cgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5lbWFpbCwgZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoeyBib3VuY2VDb3VudDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5ib3VuY2VDb3VudCB9KSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIEFycmF5PHsgYm91bmNlQ291bnQ6IG51bWJlciB9PilbMF0/LmJvdW5jZUNvdW50ID8/IDA7XG4gIH1cblxuICBhc3luYyBkZWxldGVSZWNpcGllbnQob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgZGVsZXRlZEJ5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudClcbiAgICAgIC5zZXQoeyBkZWxldGVkQXQ6IG5vdywgZGVsZXRlZEJ5LCAuLi5wdXJnZVN0YW1wKG5vdykgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQuaWQsIGlkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5kZWxldGVkQXQpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCB9KSk7XG4gICAgaWYgKChyb3dzIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVjaXBpZW50IG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB0aGlzIGFkZHJlc3MgZGVsaXZlcmFibGUgcmlnaHQgbm93PyBUaGUgc2luZ2xlIHBsYWNlIHRoZSBkZWxpdmVyeSBydWxlc1xuICAgKiBsaXZlLCBzbyB0aGUgc2NoZWR1bGVyIGFuZCB0aGUgVUkgYWdyZWUgYWJvdXQgd2h5IGEgcmVjaXBpZW50IGlzIGJlaW5nXG4gICAqIHNraXBwZWQuXG4gICAqL1xuICBkZWxpdmVyYWJpbGl0eShyZWNpcGllbnQ6IFJlcG9ydFJlY2lwaWVudCk6IHsgZGVsaXZlcmFibGU6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICBpZiAocmVjaXBpZW50LmRlbGV0ZWRBdCkgcmV0dXJuIHsgZGVsaXZlcmFibGU6IGZhbHNlLCByZWFzb246ICdyZW1vdmVkJyB9O1xuICAgIGlmIChyZWNpcGllbnQudW5zdWJzY3JpYmVkQXQpIHJldHVybiB7IGRlbGl2ZXJhYmxlOiBmYWxzZSwgcmVhc29uOiAndW5zdWJzY3JpYmVkJyB9O1xuICAgIGlmICghcmVjaXBpZW50LnZlcmlmaWVkQXQpIHJldHVybiB7IGRlbGl2ZXJhYmxlOiBmYWxzZSwgcmVhc29uOiAncGVuZGluZ192ZXJpZmljYXRpb24nIH07XG4gICAgaWYgKHJlY2lwaWVudC5ib3VuY2VDb3VudCA+PSBNQVhfQk9VTkNFUykgcmV0dXJuIHsgZGVsaXZlcmFibGU6IGZhbHNlLCByZWFzb246ICdib3VuY2luZycgfTtcbiAgICByZXR1cm4geyBkZWxpdmVyYWJsZTogdHJ1ZSB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlY2lwaWVudCBwb2xpY3kg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRoZSBvcmcncyBhZG1pbi1vd25lZCByZXBvcnQgcG9saWN5LiBSZWFkIHRocm91Z2ggdGhlIHJlcG9ydGluZyBzZXR0aW5ncyByb3csXG4gICAqIHdoaWNoIG1heSBub3QgZXhpc3Qg4oCUIGFuIG9yZyB0aGF0IGhhcyBuZXZlciBjb25maWd1cmVkIGFueXRoaW5nIGdldHMgdGhlXG4gICAqIGNsb3NlZCBkZWZhdWx0cyAobm8gZXh0ZXJuYWwgc2hhcmluZywgbm8gZXh0ZXJuYWwgZG9tYWlucywgYXBwcm92YWwgcmVxdWlyZWQpLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVwb3J0UG9saWN5KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBleHRlcm5hbFNoYXJpbmc6IGJvb2xlYW47XG4gICAgcmVjaXBpZW50RG9tYWluczogc3RyaW5nW10gfCBudWxsO1xuICAgIHJlcXVpcmVBcHByb3ZhbDogYm9vbGVhbjtcbiAgICBkZWZhdWx0VGltZXpvbmU6IHN0cmluZyB8IG51bGw7XG4gICAgZGVmYXVsdFdlZWtTdGFydDogc3RyaW5nIHwgbnVsbDtcbiAgfT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3Qoe1xuICAgICAgZXh0ZXJuYWxTaGFyaW5nOiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydEV4dGVybmFsU2hhcmluZyxcbiAgICAgIHJlY2lwaWVudERvbWFpbnM6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0UmVjaXBpZW50RG9tYWlucyxcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogc2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnRSZXF1aXJlQXBwcm92YWwsXG4gICAgICBkZWZhdWx0VGltZXpvbmU6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0RGVmYXVsdFRpbWV6b25lLFxuICAgICAgZGVmYXVsdFdlZWtTdGFydDogc2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnREZWZhdWx0V2Vla1N0YXJ0LFxuICAgIH0pLmZyb20oc2NoZW1hLmRvcmFTZXR0aW5ncykud2hlcmUoZXEoc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgb3JnSWQpKS5saW1pdCgxKSk7XG4gICAgY29uc3Qgcm93ID0gKHJvd3MgYXMgQXJyYXk8e1xuICAgICAgZXh0ZXJuYWxTaGFyaW5nOiBib29sZWFuO1xuICAgICAgcmVjaXBpZW50RG9tYWluczogc3RyaW5nW10gfCBudWxsO1xuICAgICAgcmVxdWlyZUFwcHJvdmFsOiBib29sZWFuO1xuICAgICAgZGVmYXVsdFRpbWV6b25lOiBzdHJpbmcgfCBudWxsO1xuICAgICAgZGVmYXVsdFdlZWtTdGFydDogc3RyaW5nIHwgbnVsbDtcbiAgICB9PilbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4dGVybmFsU2hhcmluZzogcm93Py5leHRlcm5hbFNoYXJpbmcgPz8gZmFsc2UsXG4gICAgICByZWNpcGllbnREb21haW5zOiByb3c/LnJlY2lwaWVudERvbWFpbnMgPz8gbnVsbCxcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogcm93Py5yZXF1aXJlQXBwcm92YWwgPz8gdHJ1ZSxcbiAgICAgIC8vIE5VTEwgcmF0aGVyIHRoYW4gYSBndWVzc2VkIHpvbmU6IHRoZSBjcmVhdGUgZm9ybSBmYWxscyBiYWNrIHRvIHRoZSBCUk9XU0VSJ3Mgem9uZSxcbiAgICAgIC8vIHdoaWNoIGlzIGEgYmV0dGVyIGRlZmF1bHQgdGhhbiB0aGUgc2VydmVyJ3MgYW5kIGlzIHZpc2libHkgdGhlIGxlYWQncyBvd24uXG4gICAgICBkZWZhdWx0VGltZXpvbmU6IHJvdz8uZGVmYXVsdFRpbWV6b25lID8/IG51bGwsXG4gICAgICBkZWZhdWx0V2Vla1N0YXJ0OiByb3c/LmRlZmF1bHRXZWVrU3RhcnQgPz8gbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2V0UmVwb3J0UG9saWN5KG9yZ0lkOiBzdHJpbmcsIHBhdGNoOiB7XG4gICAgZXh0ZXJuYWxTaGFyaW5nPzogYm9vbGVhbjtcbiAgICByZWNpcGllbnREb21haW5zPzogc3RyaW5nW10gfCBudWxsO1xuICAgIHJlcXVpcmVBcHByb3ZhbD86IGJvb2xlYW47XG4gICAgZGVmYXVsdFRpbWV6b25lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBkZWZhdWx0V2Vla1N0YXJ0Pzogc3RyaW5nIHwgbnVsbDtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9O1xuICAgIGlmIChwYXRjaC5leHRlcm5hbFNoYXJpbmcgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydEV4dGVybmFsU2hhcmluZyA9IHBhdGNoLmV4dGVybmFsU2hhcmluZztcbiAgICBpZiAocGF0Y2gucmVjaXBpZW50RG9tYWlucyAhPT0gdW5kZWZpbmVkKSBzZXQucmVwb3J0UmVjaXBpZW50RG9tYWlucyA9IHBhdGNoLnJlY2lwaWVudERvbWFpbnM7XG4gICAgaWYgKHBhdGNoLnJlcXVpcmVBcHByb3ZhbCAhPT0gdW5kZWZpbmVkKSBzZXQucmVwb3J0UmVxdWlyZUFwcHJvdmFsID0gcGF0Y2gucmVxdWlyZUFwcHJvdmFsO1xuICAgIGlmIChwYXRjaC5kZWZhdWx0VGltZXpvbmUgIT09IHVuZGVmaW5lZCkgc2V0LnJlcG9ydERlZmF1bHRUaW1lem9uZSA9IHBhdGNoLmRlZmF1bHRUaW1lem9uZTtcbiAgICBpZiAocGF0Y2guZGVmYXVsdFdlZWtTdGFydCAhPT0gdW5kZWZpbmVkKSBzZXQucmVwb3J0RGVmYXVsdFdlZWtTdGFydCA9IHBhdGNoLmRlZmF1bHRXZWVrU3RhcnQ7XG4gICAgYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5kb3JhU2V0dGluZ3MpLnZhbHVlcyh7XG4gICAgICBvcmdJZCxcbiAgICAgIHJlcG9ydEV4dGVybmFsU2hhcmluZzogcGF0Y2guZXh0ZXJuYWxTaGFyaW5nID8/IGZhbHNlLFxuICAgICAgcmVwb3J0UmVjaXBpZW50RG9tYWluczogcGF0Y2gucmVjaXBpZW50RG9tYWlucyA/PyBudWxsLFxuICAgICAgcmVwb3J0UmVxdWlyZUFwcHJvdmFsOiBwYXRjaC5yZXF1aXJlQXBwcm92YWwgPz8gdHJ1ZSxcbiAgICAgIHJlcG9ydERlZmF1bHRUaW1lem9uZTogcGF0Y2guZGVmYXVsdFRpbWV6b25lID8/IG51bGwsXG4gICAgICByZXBvcnREZWZhdWx0V2Vla1N0YXJ0OiBwYXRjaC5kZWZhdWx0V2Vla1N0YXJ0ID8/IG51bGwsXG4gICAgfSkub25Db25mbGljdERvVXBkYXRlKHsgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLCBzZXQgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgU3Rha2Vob2xkZXIgUmVwb3J0cyBlbnRpdGxlbWVudCBjaGFuZ2UgZnJvbSBiaWxsaW5nOiBwYXVzZSBldmVyeXRoaW5nLCBvclxuICAgKiByZXN1bWUgd2hhdCB0aGUgbGFwc2UgcGF1c2VkLlxuICAgKlxuICAgKiBUSEUgV0FURVJNQVJLIEFORCBUSEUgV09SSyBBUkUgT05FIFRSQU5TQUNUSU9OLCBhbmQgdGhlIHdhdGVybWFyayB1cGRhdGUgaXMgd2hhdFxuICAgKiBzZXJpYWxpemVzIGNvbmN1cnJlbnQgcHVzaGVzLiBCaWxsaW5nJ3MgbGVncyBhcmUgYmVzdC1lZmZvcnQgYW5kIHJldHJpZWQsIHNvXG4gICAqIFwibGFwc2VkIGF0IDEwOjAwXCIgYW5kIFwicmVuZXdlZCBhdCAxMDowNVwiIGNhbiBhcnJpdmUgaW4gZWl0aGVyIG9yZGVyOyBhcHBseWluZyB0aGVcbiAgICogb2xkZXIgb25lIGxhc3Qgd291bGQgbGVhdmUgYSBsYXBzZWQgYWNjb3VudCBwcm9kdWNpbmcgcmVwb3J0cywgb3IgYSBwYXlpbmcgb25lXG4gICAqIHBhdXNlZC4gVGhlIGNvbmRpdGlvbmFsIHVwZGF0ZSB0YWtlcyBhIHJvdyBsb2NrIG9uIGBkb3JhX3NldHRpbmdzYCwgc28gYSBzZWNvbmRcbiAgICogcHVzaCB3YWl0cyBhbmQgdGhlbiBzZWVzIHRoZSBuZXdlciB3YXRlcm1hcmsg4oCUIG5vIGFkdmlzb3J5IGxvY2sgbmVlZGVkLlxuICAgKlxuICAgKiBSRVNVTUUgSVMgU0NPUEVEIFRPIGBlbnRpdGxlbWVudGAuIEl0IG11c3Qgbm90IHVuLXBhdXNlIGEgZGVmaW5pdGlvbiB3aG9zZSBPV05FUiB3YXNcbiAgICogZGVhY3RpdmF0ZWQgb3Igd2hvIGxvc3QgdGhlIHBlcm1pc3Npb246IHRob3NlIGFyZSBkaWZmZXJlbnQgcHJvYmxlbXMgd2l0aCBkaWZmZXJlbnRcbiAgICogZml4ZXMsIGFuZCByZXN1bWluZyBvbmUgYnkgZml4aW5nIHRoZSBvdGhlciBpcyBob3cgYSByZXBvcnQgc3RhcnRzIHJ1bm5pbmcgdW5kZXJcbiAgICogc29tZWJvZHkgd2hvIGxlZnQuXG4gICAqXG4gICAqIGBuZXh0UnVuRm9yYCBpcyBhIGNhbGxiYWNrIGJlY2F1c2UgdGhlIHBlcmlvZCBhcml0aG1ldGljIG5lZWRzIGVhY2ggZGVmaW5pdGlvbidzXG4gICAqIGNhZGVuY2UsIHRpbWV6b25lIGFuZCB3ZWVrIHN0YXJ0LCBhbmQgdGhhdCBiZWxvbmdzIHdpdGggdGhlIHBlcmlvZCByZXNvbHZlciByYXRoZXJcbiAgICogdGhhbiB0aGUgc3RvcmUg4oCUIHdoaWxlIHRoZSB3cml0ZSBzdGlsbCBoYXMgdG8gaGFwcGVuIGluc2lkZSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGxlZyBtYWtlcyB0aGUgY2hhbmdlIElNTUVESUFURTsgaXQgaXMgbm90IHdoYXQgbWFrZXMgaXQgc2FmZS4gRXZlcnkgc2NoZWR1bGVkXG4gICAqIHJ1biByZS1jaGVja3MgdGhlIGVudGl0bGVtZW50IGFnYWluc3QgcGxhdGZvcm0gYW55d2F5LCBzbyBhIGxvc3QgcHVzaCBkZWxheXNcbiAgICogZW5mb3JjZW1lbnQgdG8gdGhlIG5leHQgcnVuIHJhdGhlciB0aGFuIGRlZmVhdGluZyBpdC5cbiAgICovXG4gIGFzeW5jIHN5bmNSZXBvcnRFbnRpdGxlbWVudChcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGVudGl0bGVkOiBib29sZWFuLFxuICAgIG9wdHM6IHsgb2NjdXJyZWRBdD86IERhdGU7IG5leHRSdW5Gb3I/OiAoZDogUmVwb3J0RGVmaW5pdGlvbikgPT4gRGF0ZTsgbm93PzogRGF0ZSB9ID0ge30sXG4gICk6IFByb21pc2U8eyBza2lwcGVkOiBib29sZWFuOyBwYXVzZWQ6IFJlcG9ydERlZmluaXRpb25bXTsgcmVzdW1lZDogUmVwb3J0RGVmaW5pdGlvbltdIH0+IHtcbiAgICBjb25zdCBub3cgPSBvcHRzLm5vdyA/PyBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IG9jY3VycmVkQXQgPSBvcHRzLm9jY3VycmVkQXQgPz8gbm93O1xuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAvLyBUaGUgY2xhaW0uIEEgcHVzaCBhdCBvciBiZWZvcmUgdGhlIGxhc3QgYXBwbGllZCBjaGFuZ2UgdXBkYXRlcyB6ZXJvIHJvd3MuXG4gICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAgIC52YWx1ZXMoeyBvcmdJZCwgcmVwb3J0RW50aXRsZW1lbnRTeW5jZWRBdDogb2NjdXJyZWRBdCB9KVxuICAgICAgICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgICB0YXJnZXQ6IHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsXG4gICAgICAgICAgc2V0OiB7IHJlcG9ydEVudGl0bGVtZW50U3luY2VkQXQ6IG9jY3VycmVkQXQsIHVwZGF0ZWRBdDogbm93IH0sXG4gICAgICAgICAgc2V0V2hlcmU6IHNxbGAke3NjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0RW50aXRsZW1lbnRTeW5jZWRBdH0gSVMgTlVMTFxuICAgICAgICAgICAgT1IgJHtzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydEVudGl0bGVtZW50U3luY2VkQXR9IDwgJHtvY2N1cnJlZEF0fWAsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXR1cm5pbmcoeyBvcmdJZDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCB9KTtcbiAgICAgIGlmICgoY2xhaW1lZCBhcyB1bmtub3duW10pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4geyBza2lwcGVkOiB0cnVlLCBwYXVzZWQ6IFtdLCByZXN1bWVkOiBbXSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVudGl0bGVkKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgICAgLnNldCh7IGlzQWN0aXZlOiBmYWxzZSwgcGF1c2VkUmVhc29uOiAnZW50aXRsZW1lbnQnLCBuZXh0UnVuQXQ6IG51bGwsIHVwZGF0ZWRBdDogbm93IH0pXG4gICAgICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICAgICApKVxuICAgICAgICAgIC5yZXR1cm5pbmcoKTtcbiAgICAgICAgcmV0dXJuIHsgc2tpcHBlZDogZmFsc2UsIHBhdXNlZDogcm93cyBhcyBSZXBvcnREZWZpbml0aW9uW10sIHJlc3VtZWQ6IFtdIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdXNlZCA9IGF3YWl0IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pc0FjdGl2ZSwgZmFsc2UpLFxuICAgICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLnBhdXNlZFJlYXNvbiwgJ2VudGl0bGVtZW50JyksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICAgICkpIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgICAgIGNvbnN0IHJlc3VtZWQ6IFJlcG9ydERlZmluaXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBkZWZpbml0aW9uIG9mIHBhdXNlZCkge1xuICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgICAgIC5zZXQoe1xuICAgICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBwYXVzZWRSZWFzb246IG51bGwsXG4gICAgICAgICAgICBuZXh0UnVuQXQ6IG9wdHMubmV4dFJ1bkZvciA/IG9wdHMubmV4dFJ1bkZvcihkZWZpbml0aW9uKSA6IG51bGwsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53aGVyZShlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgZGVmaW5pdGlvbi5pZCkpXG4gICAgICAgICAgLnJldHVybmluZygpO1xuICAgICAgICBjb25zdCByb3cgPSAocm93cyBhcyBSZXBvcnREZWZpbml0aW9uW10pWzBdO1xuICAgICAgICBpZiAocm93KSByZXN1bWVkLnB1c2gocm93KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHNraXBwZWQ6IGZhbHNlLCBwYXVzZWQ6IFtdLCByZXN1bWVkIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgVGhlIGZyZWUgcHJldmlldyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ2xhaW0gdGhlIG9yZydzIE9ORSBmcmVlIHByZXZpZXcsIG9yIHJlcG9ydCB0aGF0IGl0IGlzIGFscmVhZHkgc3BlbnQuXG4gICAqXG4gICAqIEEgQ09ORElUSU9OQUwgaW5zZXJ0LW9yLXVwZGF0ZSwgbm90IHJlYWQtdGhlbi13cml0ZTogdHdvIHRhYnMgY2xpY2tpbmcgXCJzZWUgYSBzYW1wbGVcIlxuICAgKiBhdCB0aGUgc2FtZSBtb21lbnQgbXVzdCBwcm9kdWNlIG9uZSBwcmV2aWV3LCBhbmQgYSBjaGVjayBmb2xsb3dlZCBieSBhIHNlcGFyYXRlIHdyaXRlXG4gICAqIGhhcyBhIHdpbmRvdyBiZXR3ZWVuIHRoZW0gd2lkZSBlbm91Z2ggZm9yIGJvdGggdG8gcGFzcy4gYFdIRVJFIHJlcG9ydF9wcmV2aWV3X3VzZWRfYXRcbiAgICogSVMgTlVMTGAgb24gdGhlIHVwZGF0ZSwgYW5kIGBvbkNvbmZsaWN0RG9VcGRhdGVgIGZvciB0aGUgcm93IHRoYXQgbWF5IG5vdCBleGlzdCB5ZXQsXG4gICAqIG1ha2UgdGhlIGNsYWltIGl0c2VsZiB0aGUgZ3VhcmQuXG4gICAqXG4gICAqIFJldHVybnMgd2hldGhlciBUSElTIGNhbGxlciB3b24gaXQuIEEgbG9zZXIgaXMgdG9sZCB0aGUgcHJldmlldyBpcyBzcGVudCwgd2hpY2ggaXNcbiAgICogdGhlIHRydXRoIGFuZCBpcyBhbHNvIHRoZSB1cHNlbGwuXG4gICAqL1xuICBhc3luYyBjbGFpbVJlcG9ydFByZXZpZXcob3JnSWQ6IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmRvcmFTZXR0aW5ncylcbiAgICAgIC52YWx1ZXMoeyBvcmdJZCwgcmVwb3J0UHJldmlld1VzZWRBdDogbm93IH0pXG4gICAgICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLFxuICAgICAgICBzZXQ6IHsgcmVwb3J0UHJldmlld1VzZWRBdDogbm93LCB1cGRhdGVkQXQ6IG5vdyB9LFxuICAgICAgICAvLyBUaGUgcHJlZGljYXRlIGlzIHdoYXQgbWFrZXMgdGhpcyBvbmNlLWV2ZXI6IGFuIG9yZyB3aG9zZSByb3cgYWxyZWFkeSBjYXJyaWVzIGFcbiAgICAgICAgLy8gdGltZXN0YW1wIHVwZGF0ZXMgemVybyByb3dzIGFuZCByZXR1cm5zIG5vdGhpbmcuXG4gICAgICAgIHNldFdoZXJlOiBpc051bGwoc2NoZW1hLmRvcmFTZXR0aW5ncy5yZXBvcnRQcmV2aWV3VXNlZEF0KSxcbiAgICAgIH0pXG4gICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQgfSkpO1xuICAgIHJldHVybiAocm93cyBhcyB1bmtub3duW10pLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgb3JnIGhhcyBhbHJlYWR5IHNwZW50IGl0cyBmcmVlIHByZXZpZXcuICovXG4gIGFzeW5jIHJlcG9ydFByZXZpZXdVc2VkKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHsgYXQ6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0UHJldmlld1VzZWRBdCB9KVxuICAgICAgLmZyb20oc2NoZW1hLmRvcmFTZXR0aW5ncylcbiAgICAgIC53aGVyZShlcShzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLCBvcmdJZCkpXG4gICAgICAubGltaXQoMSkpO1xuICAgIHJldHVybiAocm93cyBhcyBBcnJheTx7IGF0OiBEYXRlIHwgbnVsbCB9PilbMF0/LmF0ICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSXMgYGVtYWlsYCBhZG1pc3NpYmxlIGFzIGEgcmVjaXBpZW50IGZvciB0aGlzIG9yZywgYW5kIGRvZXMgaXQgbmVlZCBhblxuICAgKiBhZG1pbidzIGFwcHJvdmFsIGZpcnN0P1xuICAgKlxuICAgKiBgb3JnTWVtYmVyRW1haWxzYCBpcyB0aGUgc2V0IG9mIGFkZHJlc3NlcyB0aGF0IGFscmVhZHkgYXV0aGVudGljYXRlIHRvIHRoaXNcbiAgICogb3JnIOKAlCB0aGV5IGFyZSBhbHdheXMgYWRtaXNzaWJsZSBhbmQgbmV2ZXIgbmVlZCB2ZXJpZmljYXRpb24sIGJlY2F1c2UgdGhlIG9yZ1xuICAgKiBoYXMgYWxyZWFkeSBlc3RhYmxpc2hlZCB0aGV5IGJlbG9uZyB0byBpdC4gRXZlcnl0aGluZyBlbHNlIGlzIG1lYXN1cmVkIGFnYWluc3RcbiAgICogdGhlIGFsbG93ZWQtZG9tYWluIGxpc3QsIGFuZCBhIE5VTEwgbGlzdCBtZWFucyBcIm5vIGV4dGVybmFsIGFkZHJlc3NlcyBhdCBhbGxcIixcbiAgICogbm90IFwiYW55IGFkZHJlc3NcIjogdGhlIGNsb3NlZCByZWFkaW5nIGlzIHRoZSBvbmUgdGhhdCBjYW5ub3QgbGVhayBhIHJlcG9ydCBieVxuICAgKiBhbiBhZG1pbiBmb3JnZXR0aW5nIHRvIGNvbmZpZ3VyZSBzb21ldGhpbmcuXG4gICAqL1xuICBhZG1pdFJlY2lwaWVudChcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIHBvbGljeTogeyByZWNpcGllbnREb21haW5zOiBzdHJpbmdbXSB8IG51bGw7IHJlcXVpcmVBcHByb3ZhbDogYm9vbGVhbiB9LFxuICAgIG9yZ01lbWJlckVtYWlsczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgKTogeyBhZG1pdHRlZDogdHJ1ZTsgbWVtYmVyOiBib29sZWFuOyBuZWVkc0FwcHJvdmFsOiBib29sZWFuIH0gfCB7IGFkbWl0dGVkOiBmYWxzZTsgcmVhc29uOiBzdHJpbmcgfSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChvcmdNZW1iZXJFbWFpbHMuaGFzKG5vcm1hbGl6ZWQpKSByZXR1cm4geyBhZG1pdHRlZDogdHJ1ZSwgbWVtYmVyOiB0cnVlLCBuZWVkc0FwcHJvdmFsOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgYXQgPSBub3JtYWxpemVkLmxhc3RJbmRleE9mKCdAJyk7XG4gICAgY29uc3QgZG9tYWluID0gYXQgPj0gMCA/IG5vcm1hbGl6ZWQuc2xpY2UoYXQgKyAxKSA6ICcnO1xuICAgIGlmICghZG9tYWluKSByZXR1cm4geyBhZG1pdHRlZDogZmFsc2UsIHJlYXNvbjogJ05vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuJyB9O1xuXG4gICAgY29uc3QgYWxsb3dlZCA9IHBvbGljeS5yZWNpcGllbnREb21haW5zO1xuICAgIGlmICghYWxsb3dlZCB8fCBhbGxvd2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICByZWFzb246ICdUaGlzIG9yZ2FuaXphdGlvbiBvbmx5IGRlbGl2ZXJzIHJlcG9ydHMgdG8gaXRzIG93biBtZW1iZXJzLiAnXG4gICAgICAgICAgKyAnQW4gYWRtaW5pc3RyYXRvciBjYW4gYWxsb3cgc3BlY2lmaWMgZXh0ZXJuYWwgZG9tYWlucyBpbiByZXBvcnRpbmcgc2V0dGluZ3MuJyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG9rID0gYWxsb3dlZC5zb21lKChkKSA9PiB7XG4gICAgICBjb25zdCBjbGVhbiA9IGQudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgICByZXR1cm4gY2xlYW4ubGVuZ3RoID4gMCAmJiAoZG9tYWluID09PSBjbGVhbiB8fCBkb21haW4uZW5kc1dpdGgoYC4ke2NsZWFufWApKTtcbiAgICB9KTtcbiAgICBpZiAoIW9rKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZG1pdHRlZDogZmFsc2UsXG4gICAgICAgIHJlYXNvbjogYFJlcG9ydHMgY2FuIG9ubHkgYmUgc2VudCB0byAke2FsbG93ZWQuam9pbignLCAnKX0gYWRkcmVzc2VzIGluIHRoaXMgb3JnYW5pemF0aW9uLmAsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBhZG1pdHRlZDogdHJ1ZSwgbWVtYmVyOiBmYWxzZSwgbmVlZHNBcHByb3ZhbDogcG9saWN5LnJlcXVpcmVBcHByb3ZhbCB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFJldGVudGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSGFyZC1kZWxldGUgZXhwaXJlZCB0b21ic3RvbmVzIGFjcm9zcyBldmVyeSBvcmcsIGZvciB0aGUgc2hhcmVkIHNvZnQtZGVsZXRlXG4gICAqIHN3ZWVwLiBSdW5zIGluc2lkZSB0aGUgc3dlZXAncyBvd24gc3lzYWRtaW4gc2NvcGUuXG4gICAqXG4gICAqIFJ1bnMgZ28gZmlyc3Q6IGEgcHVyZ2VkIGRlZmluaXRpb24gd2l0aCBvcnBoYW5lZCBydW5zIHdvdWxkIGxlYXZlIHNuYXBzaG90c1xuICAgKiBub3RoaW5nIGNhbiByZWFjaCwgYW5kIHNoYXJlIGxpbmtzIGFyZSBkZWxldGVkIHdpdGggdGhlaXIgcnVucyBzbyBhIHB1cmdlXG4gICAqIGNhbm5vdCBsZWF2ZSBhIGxpdmUgdG9rZW4gcG9pbnRpbmcgYXQgYSByb3cgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgKi9cbiAgcHVyZ2VhYmxlRW50aXRpZXMoKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHB1cmdlRXhwaXJlZChub3c6IERhdGUsIGxpbWl0PzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBuYW1lOiAncmVwb3J0X3J1bicsIHB1cmdlRXhwaXJlZDogKG5vdywgbGltaXQpID0+IHRoaXMucHVyZ2VSdW5zKG5vdywgbGltaXQpIH0sXG4gICAgICB7IG5hbWU6ICdyZXBvcnRfZGVmaW5pdGlvbicsIHB1cmdlRXhwaXJlZDogKG5vdywgbGltaXQpID0+IHRoaXMucHVyZ2VEZWZpbml0aW9ucyhub3csIGxpbWl0KSB9LFxuICAgICAgeyBuYW1lOiAncmVwb3J0X3JlY2lwaWVudCcsIHB1cmdlRXhwaXJlZDogKG5vdywgbGltaXQpID0+IHRoaXMucHVyZ2VSZWNpcGllbnRzKG5vdywgbGltaXQpIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHVyZ2VSdW5zKG5vdzogRGF0ZSwgbGltaXQgPSA1MDApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBkdWUgPSBhd2FpdCB0eC5zZWxlY3QoeyBpZDogc2NoZW1hLnJlcG9ydFJ1bi5pZCB9KS5mcm9tKHNjaGVtYS5yZXBvcnRSdW4pXG4gICAgICAgIC53aGVyZShhbmQoc3FsYCR7c2NoZW1hLnJlcG9ydFJ1bi5kZWxldGVkQXR9IElTIE5PVCBOVUxMYCwgbHRlKHNjaGVtYS5yZXBvcnRSdW4ucHVyZ2VBZnRlciwgbm93KSkpXG4gICAgICAgIC5saW1pdChsaW1pdCk7XG4gICAgICBjb25zdCBpZHMgPSAoZHVlIGFzIEFycmF5PHsgaWQ6IHN0cmluZyB9PikubWFwKChyKSA9PiByLmlkKTtcbiAgICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgIGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0U2hhcmVMaW5rKS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRTaGFyZUxpbmsucnVuSWQsIGlkcykpO1xuICAgICAgY29uc3QgZ29uZSA9IGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0UnVuKS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRSdW4uaWQsIGlkcykpXG4gICAgICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnJlcG9ydFJ1bi5pZCB9KTtcbiAgICAgIHJldHVybiAoZ29uZSBhcyB1bmtub3duW10pLmxlbmd0aDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHVyZ2VEZWZpbml0aW9ucyhub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgZHVlID0gYXdhaXQgdHguc2VsZWN0KHsgaWQ6IHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkIH0pLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgc3FsYCR7c2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsXG4gICAgICAgICAgbHRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLnB1cmdlQWZ0ZXIsIG5vdyksXG4gICAgICAgICkpXG4gICAgICAgIC5saW1pdChsaW1pdCk7XG4gICAgICBjb25zdCBpZHMgPSAoZHVlIGFzIEFycmF5PHsgaWQ6IHN0cmluZyB9PikubWFwKChyKSA9PiByLmlkKTtcbiAgICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgIC8vIFRoZSBkZWZpbml0aW9uJ3MgcnVucyAoYW5kIHRoZWlyIGxpbmtzKSBnbyB3aXRoIGl0LCB0b21ic3RvbmVkIG9yIG5vdDpcbiAgICAgIC8vIGEgc25hcHNob3Qgd2hvc2UgZGVmaW5pdGlvbiBpcyBnb25lIGNhbiBuZXZlciBiZSBsaXN0ZWQgYWdhaW4uXG4gICAgICBjb25zdCBydW5zID0gYXdhaXQgdHguc2VsZWN0KHsgaWQ6IHNjaGVtYS5yZXBvcnRSdW4uaWQgfSkuZnJvbShzY2hlbWEucmVwb3J0UnVuKVxuICAgICAgICAud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0UnVuLmRlZmluaXRpb25JZCwgaWRzKSk7XG4gICAgICBjb25zdCBydW5JZHMgPSAocnVucyBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgICBpZiAocnVuSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdHguZGVsZXRlKHNjaGVtYS5yZXBvcnRTaGFyZUxpbmspLndoZXJlKGluQXJyYXkoc2NoZW1hLnJlcG9ydFNoYXJlTGluay5ydW5JZCwgcnVuSWRzKSk7XG4gICAgICAgIGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0UnVuKS53aGVyZShpbkFycmF5KHNjaGVtYS5yZXBvcnRSdW4uaWQsIHJ1bklkcykpO1xuICAgICAgfVxuICAgICAgY29uc3QgZ29uZSA9IGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbikud2hlcmUoaW5BcnJheShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgaWRzKSlcbiAgICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCB9KTtcbiAgICAgIHJldHVybiAoZ29uZSBhcyB1bmtub3duW10pLmxlbmd0aDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHVyZ2VSZWNpcGllbnRzKG5vdzogRGF0ZSwgbGltaXQgPSA1MDApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBkdWUgPSBhd2FpdCB0eC5zZWxlY3QoeyBpZDogc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCB9KS5mcm9tKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgc3FsYCR7c2NoZW1hLnJlcG9ydFJlY2lwaWVudC5kZWxldGVkQXR9IElTIE5PVCBOVUxMYCxcbiAgICAgICAgICBsdGUoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5wdXJnZUFmdGVyLCBub3cpLFxuICAgICAgICApKVxuICAgICAgICAubGltaXQobGltaXQpO1xuICAgICAgY29uc3QgaWRzID0gKGR1ZSBhcyBBcnJheTx7IGlkOiBzdHJpbmcgfT4pLm1hcCgocikgPT4gci5pZCk7XG4gICAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICBjb25zdCBnb25lID0gYXdhaXQgdHguZGVsZXRlKHNjaGVtYS5yZXBvcnRSZWNpcGllbnQpLndoZXJlKGluQXJyYXkoc2NoZW1hLnJlcG9ydFJlY2lwaWVudC5pZCwgaWRzKSlcbiAgICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucmVwb3J0UmVjaXBpZW50LmlkIH0pO1xuICAgICAgcmV0dXJuIChnb25lIGFzIHVua25vd25bXSkubGVuZ3RoO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGRlZmluaXRpb24gdGhlIG93bmVyIG11c3QgYmUgcmUtY2hlY2tlZCBmb3IsIGZvciB0aGUgcGF1c2Ugc3dlZXAuICovXG4gIGFzeW5jIGxpc3RPd25lZERlZmluaXRpb25zKG9yZ0lkOiBzdHJpbmcsIG93bmVySWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbltdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vd25lcklkLCBvd25lcklkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKSk7XG4gICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBzY2hlZHVsZXIncyByZWFkcyBhbmQgd3JpdGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZWZpbml0aW9ucyB3aG9zZSBuZXh0IHJ1biBpcyBkdWUsIGFjcm9zcyBldmVyeSBvcmcuXG4gICAqXG4gICAqIFJ1bnMgYXMgU1lTQURNSU4sIGJlY2F1c2UgdGhlIHNjaGVkdWxlciBoYXMgbm8gdGVuYW50OiBpdCBpcyBsb29raW5nIGZvciB3b3JrXG4gICAqIGluIG9yZ3MgaXQgaGFzIG5vdCBiZWVuIHRvbGQgYWJvdXQuIFRoaXMgaXMgdGhlIG9uZSByZWFkIGhlcmUgdGhhdCBjcm9zc2VzIG9yZ1xuICAgKiBib3VuZGFyaWVzLCBhbmQgaXQgaXMga2VwdCB0byB0aGUgbmFycm93ZXN0IHBvc3NpYmxlIHNoYXBlIOKAlCB0aGUgcm93cyBuZWVkZWQgdG9cbiAgICogY2xhaW0gYW5kIGV4ZWN1dGUsIG9yZGVyZWQgb2xkZXN0LWR1ZSBmaXJzdCBzbyBhIGJhY2tsb2cgZHJhaW5zIGluIG9yZGVyIHJhdGhlclxuICAgKiB0aGFuIHN0YXJ2aW5nIHdoaWNoZXZlciBvcmcgc29ydHMgbGFzdCBieSBpZC5cbiAgICpcbiAgICogYGxpbWl0YCBpcyB0aGUgcGVyLWN5Y2xlIGNlaWxpbmc6IGEgY3ljbGUgdGhhdCB0cmllZCB0byBkcmFpbiBldmVyeXRoaW5nIHdvdWxkXG4gICAqIGhvbGQgdGhlIGxlYWRlciBsb2NrIGZvciBhcyBsb25nIGFzIHRoZSBzbG93ZXN0IG9yZydzIGNvbXBvc2UgdGFrZXMsIHRpbWVzIHRoZVxuICAgKiBudW1iZXIgb2YgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBhc3luYyBkdWVEZWZpbml0aW9ucyhub3c6IERhdGUsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIHJldHVybiBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KCkuZnJvbShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICAgICAgbHRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm5leHRSdW5BdCwgbm93KSxcbiAgICAgICAgKSlcbiAgICAgICAgLm9yZGVyQnkoYXNjKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm5leHRSdW5BdCkpXG4gICAgICAgIC5saW1pdChsaW1pdCkpO1xuICAgICAgcmV0dXJuIHJvd3MgYXMgUmVwb3J0RGVmaW5pdGlvbltdO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsYWltIGEgZHVlIGRlZmluaXRpb24gYnkgYWR2YW5jaW5nIGl0cyBgbmV4dFJ1bkF0YCwgYnV0IG9ubHkgaWYgaXQgc3RpbGwgaG9sZHNcbiAgICogdGhlIHZhbHVlIHRoZSBzY2FuIHNhdy5cbiAgICpcbiAgICogVEhFIENPTkRJVElPTkFMIFVQREFURSBJUyBUSEUgQ09OQ1VSUkVOQ1kgR1VBUkQsIG5vdCB0aGUgbGVhZGVyIGxvY2suIFRoZSBsb2NrXG4gICAqIHN0b3BzIHR3byByZXBsaWNhcyBzd2VlcGluZyBpbiB0aGUgc2FtZSB3aW5kb3c7IGl0IGRvZXMgbm90IHN0b3AgYSBzd2VlcCB0aGF0XG4gICAqIG91dGxpdmVzIGl0cyBsb2NrIFRUTCBmcm9tIG92ZXJsYXBwaW5nIHRoZSBuZXh0IGxlYWRlcidzIHN3ZWVwLCBhbmQgYm90aCB3b3VsZFxuICAgKiB0aGVuIHNlbGVjdCB0aGUgc2FtZSBzdGlsbC1kdWUgZGVmaW5pdGlvbi4gV2l0aG91dCB0aGUgYG5leHRfcnVuX2F0ID0gPHNlZW4+YFxuICAgKiBwcmVkaWNhdGUgZWFjaCB3b3VsZCBhZHZhbmNlIHRoZSBzY2hlZHVsZSBhbmQgZWFjaCB3b3VsZCBjb21wb3NlIGFuZCBERUxJVkVSIGFcbiAgICogcmVwb3J0IOKAlCB0aGUgc2FtZSBtYW5hZ2VyIGdldHMgdGhlIHNhbWUgcmVwb3J0IHR3aWNlLCBmcm9tIHR3byBwb2RzLCB3aGljaCBpc1xuICAgKiB0aGUgZmFpbHVyZSBldmVyeW9uZSBub3RpY2VzLlxuICAgKlxuICAgKiBSdW5zIGFzIHN5c2FkbWluIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHNjYW4sIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIGNsYWltXG4gICAqIHdvbiBzbyB0aGUgY2FsbGVyIGNhbiBzaW1wbHkgc2tpcCBhIGxvc3QgcmFjZS5cbiAgICovXG4gIGFzeW5jIGNsYWltRGVmaW5pdGlvbihpZDogc3RyaW5nLCBzZWVuTmV4dFJ1bkF0OiBEYXRlLCBuZXh0UnVuQXQ6IERhdGUsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgICAgLnNldCh7IGxhc3RSdW5BdDogbm93LCBuZXh0UnVuQXQsIHVwZGF0ZWRBdDogbm93IH0pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5uZXh0UnVuQXQsIHNlZW5OZXh0UnVuQXQpLFxuICAgICAgICApKVxuICAgICAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlkIH0pKTtcbiAgICAgIHJldHVybiAoY2xhaW1lZCBhcyB1bmtub3duW10pLmxlbmd0aCA+IDA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IChvciBjbGVhcikgYSBkZWZpbml0aW9uJ3MgYG5leHRSdW5BdGAgd2l0aG91dCBjbGFpbWluZyBpdC5cbiAgICpcbiAgICogVXNlZCB3aGVuIGEgZGVmaW5pdGlvbiBpcyBjcmVhdGVkLCByZXN1bWVkLCBvciBoYXMgaXRzIGNhZGVuY2UvdGltZXpvbmUgY2hhbmdlZFxuICAgKiDigJQgdGhlIHNjaGVkdWxlIGhhcyB0byBiZSByZS1kZXJpdmVkIGZyb20gdGhlIGNhbGVuZGFyIHJhdGhlciB0aGFuIGxlZnQgYXRcbiAgICogd2hhdGV2ZXIgdGhlIG9sZCBjYWRlbmNlIHByb2R1Y2VkLlxuICAgKi9cbiAgYXN5bmMgc2V0TmV4dFJ1bihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBuZXh0UnVuQXQ6IERhdGUgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uKVxuICAgICAgLnNldCh7IG5leHRSdW5BdCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pZCwgaWQpLFxuICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSBPTkUgZGVmaW5pdGlvbiB3aXRoIHRoZSByZWFzb24sIGZyb20gdGhlIHNjaGVkdWxlci5cbiAgICpcbiAgICogU2VwYXJhdGUgZnJvbSB7QGxpbmsgcGF1c2VEZWZpbml0aW9uc0Zvck93bmVyfSBiZWNhdXNlIHRoZSB0cmlnZ2VyIGlzIGRpZmZlcmVudDpcbiAgICogdGhhdCBvbmUgaXMgYSBtZW1iZXJzaGlwIGNoYW5nZSBhZmZlY3RpbmcgZXZlcnkgZGVmaW5pdGlvbiBhIHBlcnNvbiBvd25zLCB0aGlzXG4gICAqIG9uZSBpcyBhIHBlci1ydW4gcmVjaGVjayB0aGF0IGZhaWxlZC4gQ2xlYXJzIGBuZXh0UnVuQXRgIHNvIGEgcGF1c2VkIGRlZmluaXRpb25cbiAgICogc3RvcHMgYXBwZWFyaW5nIGluIHRoZSBkdWUgc2NhbiBhdCBhbGwsIHJhdGhlciB0aGFuIGJlaW5nIHJlLWNsYWltZWQgYW5kXG4gICAqIHJlLXJlamVjdGVkIGV2ZXJ5IGN5Y2xlLlxuICAgKlxuICAgKiBSdW5zIGFzIHN5c2FkbWluOiB0aGUgY2FsbGVyIGlzIHRoZSBzY2hlZHVsZXIsIHdoaWNoIGhhcyBubyB0ZW5hbnQsIGFuZCB0aGUgaWRcbiAgICogY2FtZSBmcm9tIGl0cyBvd24gY3Jvc3Mtb3JnIHNjYW4uXG4gICAqL1xuICBhc3luYyBwYXVzZURlZmluaXRpb24oaWQ6IHN0cmluZywgcmVhc29uOiBSZXBvcnRQYXVzZVJlYXNvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbilcbiAgICAgICAgLnNldCh7IGlzQWN0aXZlOiBmYWxzZSwgcGF1c2VkUmVhc29uOiByZWFzb24sIG5leHRSdW5BdDogbnVsbCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgICAgIC53aGVyZShhbmQoXG4gICAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgICBpc051bGwoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uZGVsZXRlZEF0KSxcbiAgICAgICAgKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBhIHBhdXNlZCBkZWZpbml0aW9uLCBjbGVhcmluZyB0aGUgcmVhc29uIGFuZCByZS1kZXJpdmluZyBpdHMgc2NoZWR1bGUuXG4gICAqXG4gICAqIGBuZXh0UnVuQXRgIGlzIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgcmF0aGVyIHRoYW4gY29tcHV0ZWQgaGVyZTogdGhlIHBlcmlvZFxuICAgKiBhcml0aG1ldGljIG5lZWRzIHRoZSBkZWZpbml0aW9uJ3MgdGltZXpvbmUgYW5kIHdlZWsgc3RhcnQsIGFuZCB0aGF0IGJlbG9uZ3Mgd2l0aFxuICAgKiB0aGUgcGVyaW9kIHJlc29sdmVyLCBub3QgdGhlIHN0b3JlLlxuICAgKi9cbiAgYXN5bmMgcmVzdW1lRGVmaW5pdGlvbihvcmdJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBuZXh0UnVuQXQ6IERhdGUsIGFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAuc2V0KHsgaXNBY3RpdmU6IHRydWUsIHBhdXNlZFJlYXNvbjogbnVsbCwgbmV4dFJ1bkF0LCB1cGRhdGVkQnk6IGFjdG9ySWQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24ub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLnJlcG9ydERlZmluaXRpb24uaWQsIGlkKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICBjb25zdCByb3cgPSAocm93cyBhcyBSZXBvcnREZWZpbml0aW9uW10pWzBdO1xuICAgIGlmICghcm93KSB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcignUmVwb3J0IGRlZmluaXRpb24gbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIHJvdztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSBldmVyeSBBQ1RJVkUgZGVmaW5pdGlvbiBpbiBhbiBvcmcsIHdpdGggdGhlIHJlYXNvbi5cbiAgICpcbiAgICogVGhlIGVudGl0bGVtZW50IGxhcHNlIGxlZzogYmlsbGluZyB0ZWxscyByZXBvcnRpbmcgdGhlIGFkZC1vbiBpcyBnb25lLCBhbmQgZXZlcnlcbiAgICogZGVmaW5pdGlvbiBpbiB0aGUgYWNjb3VudCBzdG9wcy4gUmV0dXJucyB0aGUgcm93cyBzbyB0aGUgY2FsbGVyIGNhbiBub3RpZnkuXG4gICAqL1xuICBhc3luYyBwYXVzZURlZmluaXRpb25zRm9yT3JnKG9yZ0lkOiBzdHJpbmcsIHJlYXNvbjogUmVwb3J0UGF1c2VSZWFzb24pOiBQcm9taXNlPFJlcG9ydERlZmluaXRpb25bXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAuc2V0KHsgaXNBY3RpdmU6IGZhbHNlLCBwYXVzZWRSZWFzb246IHJlYXNvbiwgbmV4dFJ1bkF0OiBudWxsLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLm9yZ0lkLCBvcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5yZXBvcnREZWZpbml0aW9uLmRlbGV0ZWRBdCksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZygpKTtcbiAgICByZXR1cm4gcm93cyBhcyBSZXBvcnREZWZpbml0aW9uW107XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgZGVmaW5pdGlvbiBpbiBhbiBvcmcgcGF1c2VkIGZvciBgcmVhc29uYCwgZm9yIHRoZSByZXN1bWUgbGVnLlxuICAgKlxuICAgKiBTY29wZWQgdG8gdGhlIHJlYXNvbiBvbiBwdXJwb3NlOiByZS1zdWJzY3JpYmluZyBtdXN0IG5vdCB1bi1wYXVzZSBhIGRlZmluaXRpb25cbiAgICogd2hvc2Ugb3duZXIgd2FzIGRlYWN0aXZhdGVkLiBUaG9zZSBhcmUgZGlmZmVyZW50IHByb2JsZW1zIHdpdGggZGlmZmVyZW50IGZpeGVzLFxuICAgKiBhbmQgcmVzdW1pbmcgb25lIGJ5IGZpeGluZyB0aGUgb3RoZXIgaXMgaG93IGEgcmVwb3J0IHN0YXJ0cyBydW5uaW5nIHVuZGVyIGFcbiAgICogcGVyc29uIHdobyBsZWZ0LlxuICAgKi9cbiAgYXN5bmMgZGVmaW5pdGlvbnNQYXVzZWRGb3Iob3JnSWQ6IHN0cmluZywgcmVhc29uOiBSZXBvcnRQYXVzZVJlYXNvbik6IFByb21pc2U8UmVwb3J0RGVmaW5pdGlvbltdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oc2NoZW1hLnJlcG9ydERlZmluaXRpb24pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5pc0FjdGl2ZSwgZmFsc2UpLFxuICAgICAgICBlcShzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5wYXVzZWRSZWFzb24sIHJlYXNvbiksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucmVwb3J0RGVmaW5pdGlvbi5kZWxldGVkQXQpLFxuICAgICAgKSkpO1xuICAgIHJldHVybiByb3dzIGFzIFJlcG9ydERlZmluaXRpb25bXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3Rha2Vob2xkZXJSZXBvcnRTdG9yZSA9IG5ldyBTdGFrZWhvbGRlclJlcG9ydFN0b3JlKCk7XG4iXX0=